From b588e519c4a1ad57e13792bc262a51118923ac75 Mon Sep 17 00:00:00 2001 From: LRFLEW Date: Sun, 14 Jun 2015 02:08:28 -0500 Subject: [PATCH 0001/1173] Some Cleanup of Past PRs --- data/language/english_uk.txt | 2 +- src/peep/staff.c | 18 ++---------------- src/scenario.c | 12 ++++++++++++ src/scenario.h | 1 + src/util/util.c | 2 +- src/windows/cheats.c | 3 +-- 6 files changed, 18 insertions(+), 20 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 379cf6b46c..8ba1fcb4cb 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3619,7 +3619,7 @@ STR_5282 :RCT1 Ride Open/Close Lights STR_5283 :RCT1 Park Open/Close Lights STR_5284 :RCT1 Scenario Selection Font STR_5285 :EXPLODE!!! -STR_5286 :{MEDIUMFONT}{BLACK}Makes guests explode +STR_5286 :{MEDIUMFONT}{BLACK}Makes some guests explode STR_5287 :Ride is already broken down STR_5288 :Ride is closed STR_5289 :No breakdowns available for this ride diff --git a/src/peep/staff.c b/src/peep/staff.c index f6fa857107..c1f5979f58 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -187,14 +187,7 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, } if (count > 0) { - uint32 max = ((uint32)0xFFFFFFFF) - (((uint32)0xFFFFFFFF) % count) - 1; - if (max + count == 0) max = ((uint32)0xFFFFFFFF); - uint32 rand; - do { - rand = scenario_rand(); - } while (rand > max); - rand %= count; - + uint32 rand = scenario_rand_max(count); for (i = 0; i < 4; ++i) { if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i] != SPRITE_LOCATION_NULL) { if (rand == 0) break; @@ -215,14 +208,7 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, z = newPeep->z; } } else { - uint32 max = ((uint32)0xFFFFFFFF) - (((uint32)0xFFFFFFFF) % count) - 1; - if (max + count == 0) max = ((uint32)0xFFFFFFFF); - uint32 rand; - do { - rand = scenario_rand(); - } while (rand > max); - rand %= count; - + uint32 rand = scenario_rand_max(count); FOR_ALL_GUESTS(sprite_index, guest) if (guest->state == PEEP_STATE_WALKING) { if (rand == 0) break; diff --git a/src/scenario.c b/src/scenario.c index af22c23b1e..4cd598a604 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -648,6 +648,18 @@ unsigned int scenario_rand() return RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_1, uint32) = ror32(eax, 3); } +unsigned int scenario_rand_max(unsigned int max) +{ + if (max < 2) return 0; + if ((max & (max - 1)) == 0) + return scenario_rand() & (max - 1); + unsigned int rand, cap = ~((unsigned int)0) - (~((unsigned int)0) % max) - 1; + do { + rand = scenario_rand(); + } while (rand > cap); + return rand % max; +} + /** * Prepare rides, for the finish five rollercoasters objective. * rct2: 0x006788F7 diff --git a/src/scenario.h b/src/scenario.h index 56771d16c1..9e015fddf1 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -411,6 +411,7 @@ int scenario_load_and_play(const rct_scenario_basic *scenario); int scenario_load_and_play_from_path(const char *path); void scenario_update(); unsigned int scenario_rand(); +unsigned int scenario_rand_max(unsigned int max); int scenario_prepare_for_save(); int scenario_save(char *path, int flags); void scenario_set_filename(const char *value); diff --git a/src/util/util.c b/src/util/util.c index 8194f87cba..4ed997066c 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -158,4 +158,4 @@ int strcicmp(char const *a, char const *b) bool utf8_is_bom(const char *str) { return str[0] == 0xEF && str[1] == 0xBB && str[2] == 0xBF; -} \ No newline at end of file +} diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 3048369028..81b81c514d 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -538,8 +538,7 @@ static void cheat_explode_guests() rct_peep *peep; FOR_ALL_GUESTS(sprite_index, peep) { - unsigned int rand = scenario_rand(); - if ((rand & 0x07) == 0) { + if (scenario_rand_max(6) == 0) { peep->flags |= PEEP_FLAGS_EXPLODE; } } From ce300c8cb8057ea6d94ca48bec3e5dba8631a54f Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 15 Jun 2015 16:29:15 +0100 Subject: [PATCH 0002/1173] set version to develop --- src/rct2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rct2.h b/src/rct2.h index 1efc40b2c8..9b5e36a906 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -74,7 +74,7 @@ typedef utf16* utf16string; #endif #define OPENRCT2_NAME "OpenRCT2" -#define OPENRCT2_VERSION "0.0.2" +#define OPENRCT2_VERSION "develop" #define OPENRCT2_ARCHITECTURE "x86" #define OPENRCT2_PLATFORM "Windows" #define OPENRCT2_TIMESTAMP __DATE__ " " __TIME__ From 6956a2cf947aa9a3f881219cb3fb3dc69c785573 Mon Sep 17 00:00:00 2001 From: JarnoVgr Date: Mon, 15 Jun 2015 21:02:30 +0200 Subject: [PATCH 0003/1173] Installer copies curl ca file, version update --- distribution/windows/install.nsi | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/distribution/windows/install.nsi b/distribution/windows/install.nsi index 3ca2dbd40e..75cf12d7fa 100644 --- a/distribution/windows/install.nsi +++ b/distribution/windows/install.nsi @@ -1,7 +1,7 @@ # Version numbers to update !define /ifndef APPV_MAJOR 0 !define /ifndef APPV_MINOR 0 -!define /ifndef APPV_MAINT 2 +!define /ifndef APPV_MAINT 3 !define /ifndef APPV_BUILD 0 !define /ifndef APPV_EXTRA "-beta" @@ -121,6 +121,9 @@ Section "!OpenRCT2" Section1 ; Copy the rest of the stuff SetOutPath "$INSTDIR\" + + ; Copy curl ca file + File ..\..\curl-ca-bundle.crt ; Copy text files File ..\changelog.txt From 705efbeee9f00a68fa1b00b77ce515e54aff4c1a Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 16 Jun 2015 00:16:59 +0100 Subject: [PATCH 0004/1173] add last_crash_type to ride struct --- src/management/award.c | 2 +- src/ride/ride.h | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/management/award.c b/src/management/award.c index befba64a15..c76faa25a2 100644 --- a/src/management/award.c +++ b/src/management/award.c @@ -238,7 +238,7 @@ static int award_is_deserved_safest(int awardType, int activeAwardTypes) // Check for rides that have crashed maybe? FOR_ALL_RIDES(i, ride) - if (ride->var_1AE != 0) + if (ride->last_crash_type != RIDE_CRASH_TYPE_NONE) return 0; return 1; diff --git a/src/ride/ride.h b/src/ride/ride.h index 1916962a35..3ef50da6a6 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -293,7 +293,7 @@ typedef struct { uint32 no_secondary_items_sold; // 0x1A8 uint8 var_1AC; uint8 var_1AD; - uint8 var_1AE; + uint8 last_crash_type; uint8 connected_message_throttle; // 0x1AF money32 income_per_hour; // 0x1B0 money32 profit; // 0x1B4 @@ -736,6 +736,12 @@ enum { RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR = 1 << 31, }; +enum { + RIDE_CRASH_TYPE_NONE = 0, + RIDE_CRASH_TYPE_NO_FATALITIES = 2, + RIDE_CRASH_TYPE_FATALITIES = 8 +}; + #define MAX_RIDES 255 #define MAX_RIDE_MEASUREMENTS 8 From 8a2a59dea0b3a06a711314388b556a4e806e4a4f Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 16 Jun 2015 04:00:14 +0100 Subject: [PATCH 0005/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/german.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/data/language/german.txt b/data/language/german.txt index c22c41c6a5..e4a4927716 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3619,7 +3619,7 @@ STR_5282 :RCT1-Ampel Bahn öffnen/schließen STR_5283 :RCT1-Ampel Park öffnen/schließen STR_5284 :RCT1-Schriftart Szenarioauswahl STR_5285 :SPRENGEN!!! -STR_5286 :{MEDIUMFONT}{BLACK}Lässt Besucher explodieren +STR_5286 :{MEDIUMFONT}{BLACK}Lässt einige Besucher explodieren STR_5287 :Bahn ist schon defekt STR_5288 :Bahn ist geschlossen STR_5289 :Für diese Bahn sind keine Defekte verfügbar @@ -3677,3 +3677,9 @@ STR_5340 :Lichte Höhe STR_5341 :Kennzeichen STR_5342 :Eine Kachel auf der Karte auswählen STR_5343 :Personal automatisch platzieren +STR_5344 :Changelog +STR_5345 :Cheats für Finanzen +STR_5346 :Cheats für Parkbesucher +STR_5347 :Cheats für Attraktionen +STR_5348 :Cheats für Park +STR_5349 :{SMALLFONT}{BLACK}Alle Attraktionen From 79a6a989f06d45b181d8704ec37eeac42134b3b2 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 16 Jun 2015 18:25:37 +0200 Subject: [PATCH 0006/1173] Introduce a truckload of guest cheats. --- data/language/english_uk.txt | 21 ++- src/localisation/string_ids.h | 24 +++- src/peep/peep.c | 2 +- src/peep/peep.h | 1 + src/ride/ride.c | 6 +- src/ride/ride.h | 2 +- src/windows/cheats.c | 247 ++++++++++++++++++++++++++++++---- 7 files changed, 266 insertions(+), 37 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 8ba1fcb4cb..59b30e526e 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2686,7 +2686,7 @@ STR_2680 :All research complete STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max -STR_2684 :{MEDIUMFONT}{BLACK}Large group of peeps arrive +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive STR_2685 :Simplex Noise Parameters STR_2686 :{WINDOW_COLOUR_2}Low: STR_2687 :{WINDOW_COLOUR_2}High: @@ -3619,7 +3619,7 @@ STR_5282 :RCT1 Ride Open/Close Lights STR_5283 :RCT1 Park Open/Close Lights STR_5284 :RCT1 Scenario Selection Font STR_5285 :EXPLODE!!! -STR_5286 :{MEDIUMFONT}{BLACK}Makes some guests explode +STR_5286 :{SMALLFONT}{BLACK}Makes some guests explode STR_5287 :Ride is already broken down STR_5288 :Ride is closed STR_5289 :No breakdowns available for this ride @@ -3682,4 +3682,19 @@ STR_5345 :Financial cheats STR_5346 :Guest cheats STR_5347 :Ride cheats STR_5348 :Park cheats -STR_5349 :{SMALLFONT}{BLACK}All Rides \ No newline at end of file +STR_5349 :{SMALLFONT}{BLACK}All Rides +STR_5350 :Max +STR_5351 :Min +STR_5352 :{BLACK}Happiness: +STR_5353 :{BLACK}Energy: +STR_5354 :{BLACK}Hunger: +STR_5355 :{BLACK}Thirst: +STR_5356 :{BLACK}Nausea: +STR_5357 :{BLACK}Nausea tolerance: +STR_5358 :{BLACK}Bathroom: +STR_5359 :Remove guests +STR_5360 :{SMALLFONT}{BLACK}Removes all guests from the map +STR_5361 :{BLACK}Give all guests: +STR_5362 :{BLACK}Preferred intensity: +STR_5363 :> 1 +STR_5364 :< 15 diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index b1170543fe..fdec4392a6 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1004,10 +1004,22 @@ enum { STR_CHEAT_PAY_RIDES = 2762, // Guests - STR_CHEAT_HAPPY_GUESTS = 2764, + //STR_CHEAT_HAPPY_GUESTS = 2764, STR_CHEAT_LARGE_TRAM_GUESTS = 2765, - STR_CHEAT_NAUSEA = 5254, + //STR_CHEAT_NAUSEA = 5254, STR_CHEAT_EXPLODE = 5285, + STR_CHEAT_REMOVE_ALL_GUESTS = 5359, + STR_CHEAT_GUEST_HAPPINESS = 5352, + STR_CHEAT_GUEST_ENERGY = 5353, + STR_CHEAT_GUEST_HUNGER = 5354, + STR_CHEAT_GUEST_THIRST = 5355, + STR_CHEAT_GUEST_NAUSEA = 5356, + STR_CHEAT_GUEST_NAUSEA_TOLERANCE = 5357, + STR_CHEAT_GUEST_BATHROOM = 5358, + STR_CHEAT_GIVE_ALL_GUESTS = 5361, + STR_CHEAT_GUEST_PREFERRED_INTENSITY = 5362, + STR_CHEAT_MORE_THAN_1 = 5363, + STR_CHEAT_LESS_THAN_15 = 5364, // Misc. STR_CHEAT_FREEZE_CLIMATE = 2767, @@ -1039,10 +1051,11 @@ enum { STR_CHEAT_TIP_5K_MONEY = 2681, STR_CHEAT_TIP_PAY_ENTRY = 2682, STR_CHEAT_TIP_CLEAR_LOAN = 5301, - STR_CHEAT_TIP_HAPPY_GUESTS = 2683, + //STR_CHEAT_TIP_HAPPY_GUESTS = 2683, STR_CHEAT_TIP_LARGE_TRAM_GUESTS = 2684, - STR_CHEAT_TIP_NAUSEA = 5255, + //STR_CHEAT_TIP_NAUSEA = 5255, STR_CHEAT_TIP_EXPLODE = 5286, + STR_CHEAT_TIP_REMOVE_ALL_GUESTS = 5360, // Cheat tab tips STR_FINANCIAL_CHEATS_TIP = 5178, @@ -1520,6 +1533,9 @@ enum { STR_TITLE_SEQUENCE_OPENRCT2 = 5309, STR_TITLE_SEQUENCE_RANDOM = 5310, + STR_MAX = 5350, + STR_MIN = 5351, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/peep/peep.c b/src/peep/peep.c index 0f6a976b9a..c2b1a396ee 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -1592,7 +1592,7 @@ static void peep_update_ride_sub_state_5(rct_peep* peep){ } /* rct2: 0x00693028*/ -static void peep_update_ride_sub_state_7(rct_peep* peep){ +void peep_update_ride_sub_state_7(rct_peep* peep){ rct_ride* ride = GET_RIDE(peep->current_ride); rct_vehicle* vehicle = GET_VEHICLE(ride->vehicles[peep->current_train]); diff --git a/src/peep/peep.h b/src/peep/peep.h index 837590b826..704914342e 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -574,6 +574,7 @@ int peep_is_mechanic(rct_peep *peep); int peep_has_food(rct_peep* peep); void peep_sprite_remove(rct_peep* peep); void peep_remove(rct_peep* peep); +void peep_update_sprite_type(rct_peep* peep); void peep_window_state_update(rct_peep* peep); void peep_decrement_num_riders(rct_peep* peep); diff --git a/src/ride/ride.c b/src/ride/ride.c index 519fd72bd4..336770ad74 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -669,7 +669,7 @@ static void ride_remove_vehicles(rct_ride *ride) * * rct2: 0x006DD4AC */ -static void ride_clear_for_construction(int rideIndex) +void ride_clear_for_construction(int rideIndex) { rct_ride *ride; rct_window *w; @@ -693,7 +693,7 @@ static void ride_clear_for_construction(int rideIndex) * * rct2: 0x006664DF */ -static void ride_remove_peeps(int rideIndex) +void ride_remove_peeps(int rideIndex) { int i, stationIndex, x, y, z, exitX, exitY, exitZ, exitDirection; uint16 xy, spriteIndex; @@ -4507,4 +4507,4 @@ void ride_all_has_any_track_elements(bool *rideIndexArray) rideIndexArray[it.element->properties.track.ride_index] = true; } -} \ No newline at end of file +} diff --git a/src/ride/ride.h b/src/ride/ride.h index 1916962a35..d93d439f1a 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -814,7 +814,7 @@ int ride_get_refund_price(int ride_id); void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); - +void ride_clear_for_construction(int rideIndex); int get_var_10E_unk_1(rct_ride* ride); int get_var_10E_unk_2(rct_ride* ride); diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 81b81c514d..1b5af25faa 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -33,11 +33,10 @@ #include "../world/footpath.h" #include "../world/park.h" #include "../world/sprite.h" +#include "../world/scenery.h" #include "../interface/themes.h" #include "../cheats.h" -//#define WW 200 -//#define WH 128 #define CHEATS_MONEY_INCREMENT MONEY(5000,00) #define CHEATS_TRAM_INCREMENT 250 enum { @@ -59,10 +58,28 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_HIGH_MONEY, WIDX_PARK_ENTRANCE_FEE, WIDX_CLEAR_LOAN, - WIDX_HAPPY_GUESTS = 8, //Same as HIGH_MONEY as it is also the 8th widget but on a different page + WIDX_GUEST_HAPPINESS_MAX = 8, //Same as HIGH_MONEY as it is also the 8th widget but on a different page + WIDX_GUEST_HAPPINESS_MIN, + WIDX_GUEST_ENERGY_MAX, + WIDX_GUEST_ENERGY_MIN, + WIDX_GUEST_HUNGER_MAX, + WIDX_GUEST_HUNGER_MIN, + WIDX_GUEST_THIRST_MAX, + WIDX_GUEST_THIRST_MIN, + WIDX_GUEST_NAUSEA_MAX, + WIDX_GUEST_NAUSEA_MIN, + WIDX_GUEST_NAUSEA_TOLERANCE_MAX, + WIDX_GUEST_NAUSEA_TOLERANCE_MIN, + WIDX_GUEST_BATHROOM_MAX, + WIDX_GUEST_BATHROOM_MIN, + WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1, + WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15, WIDX_TRAM_GUESTS, - WIDX_NAUSEA_GUESTS, + WIDX_REMOVE_ALL_GUESTS, WIDX_EXPLODE_GUESTS, + WIDX_GIVE_GUESTS_PARK_MAPS, + WIDX_GIVE_GUESTS_BALLOONS, + WIDX_GIVE_GUESTS_UMBRELLAS, WIDX_FREEZE_CLIMATE = 8, WIDX_OPEN_CLOSE_PARK, WIDX_ZERO_CLEARANCE, @@ -86,9 +103,26 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_BUILD_IN_PAUSE_MODE }; +enum { + GUEST_PARAMETER_HAPPINESS, + GUEST_PARAMETER_ENERGY, + GUEST_PARAMETER_HUNGER, + GUEST_PARAMETER_THIRST, + GUEST_PARAMETER_NAUSEA, + GUEST_PARAMETER_NAUSEA_TOLERANCE, + GUEST_PARAMETER_BATHROOM, + GUEST_PARAMETER_PREFERRED_RIDE_INTENSITY +}; + +enum { + OBJECT_PARK_MAP, + OBJECT_BALLOON, + OBJECT_UMBRELLA +}; + #pragma region MEASUREMENTS #define WW 240 -#define WH 240 +#define WH 300 #define TAB_HEIGHT 43 #define XSPA 5 //X spacing #define YSPA 5 //Y spacing @@ -132,10 +166,28 @@ static rct_widget window_cheats_guests_widgets[] = { { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_GUEST_CHEATS_TIP }, // tab 2 { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_PARK_CHEATS_TIP }, // tab 3 { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_RIDE_CHEATS_TIP }, // tab 4 - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_HAPPY_GUESTS, STR_NONE}, // happy guests - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(3), HPL(3), STR_CHEAT_LARGE_TRAM_GUESTS, STR_NONE}, // large tram - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_CHEAT_NAUSEA, STR_NONE}, // nausea - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(7), HPL(7), STR_CHEAT_EXPLODE, STR_NONE}, // explode guests + { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(0), HPL(0), STR_MAX, STR_NONE}, // happiness max + { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(0), HPL(0), STR_MIN, STR_NONE}, // happiness min + { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(1), HPL(1), STR_MAX, STR_NONE}, // energy max + { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(1), HPL(1), STR_MIN, STR_NONE}, // energy min + { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(2), HPL(2), STR_MAX, STR_NONE}, // hunger max + { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(2), HPL(2), STR_MIN, STR_NONE}, // hunger min + { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(3), HPL(3), STR_MAX, STR_NONE}, // thirst max + { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(3), HPL(3), STR_MIN, STR_NONE}, // thirst min + { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(4), HPL(4), STR_MAX, STR_NONE}, // nausea max + { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(4), HPL(4), STR_MIN, STR_NONE}, // nausea min + { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(5), HPL(5), STR_MAX, STR_NONE}, // nausea tolerance max + { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(5), HPL(5), STR_MIN, STR_NONE}, // nausea tolerance min + { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(6), HPL(6), STR_MAX, STR_NONE}, // bathroom max + { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(6), HPL(6), STR_MIN, STR_NONE}, // bathroom min + { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(7), HPL(7), STR_CHEAT_MORE_THAN_1, STR_NONE}, // ride intensity > 1 + { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(7), HPL(7), STR_CHEAT_LESS_THAN_15, STR_NONE}, // ride intensity < 15 + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(10), HPL(10), STR_CHEAT_LARGE_TRAM_GUESTS, STR_CHEAT_TIP_LARGE_TRAM_GUESTS},// large tram + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(11), HPL(11), STR_CHEAT_REMOVE_ALL_GUESTS, STR_CHEAT_TIP_REMOVE_ALL_GUESTS},// explode guests + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(11), HPL(11), STR_CHEAT_EXPLODE, STR_CHEAT_TIP_EXPLODE}, // explode guests + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(9), HPL(9), 2018, STR_NONE}, // give guests park maps + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(9), HPL(9), 2016, STR_NONE}, // give guests balloons + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(8), HPL(8), 2020, STR_NONE}, // give guests umbrellas { WIDGETS_END }, }; @@ -337,7 +389,7 @@ static void* window_cheats_page_events[] = { static uint32 window_cheats_page_enabled_widgets[] = { (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_HIGH_MONEY) | (1 << WIDX_PARK_ENTRANCE_FEE) | (1 << WIDX_CLEAR_LOAN), - (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_HAPPY_GUESTS) | (1 << WIDX_TRAM_GUESTS) | (1 << WIDX_NAUSEA_GUESTS) | (1 << WIDX_EXPLODE_GUESTS), + (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_GUEST_HAPPINESS_MAX) | (1 << WIDX_GUEST_HAPPINESS_MIN) | (1 << WIDX_GUEST_ENERGY_MAX) | (1 << WIDX_GUEST_ENERGY_MIN) | (1 << WIDX_GUEST_HUNGER_MAX) | (1 << WIDX_GUEST_HUNGER_MIN) | (1 << WIDX_GUEST_THIRST_MAX) | (1 << WIDX_GUEST_THIRST_MIN) | (1 << WIDX_GUEST_NAUSEA_MAX) | (1 << WIDX_GUEST_NAUSEA_MIN) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1 << WIDX_GUEST_BATHROOM_MAX) | (1 << WIDX_GUEST_BATHROOM_MIN) | (1 << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1 << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1 << WIDX_TRAM_GUESTS) | (1 << WIDX_REMOVE_ALL_GUESTS) | (1 << WIDX_EXPLODE_GUESTS) | (1 << WIDX_GIVE_GUESTS_PARK_MAPS) | (1 << WIDX_GIVE_GUESTS_BALLOONS) | (1 << WIDX_GIVE_GUESTS_UMBRELLAS), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) | (1 << WIDX_UNLOCK_ALL_PRICES) | (1 << WIDX_SANDBOX_MODE), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_RENEW_RIDES) | (1 << WIDX_REMOVE_SIX_FLAGS) | (1 << WIDX_MAKE_DESTRUCTIBLE) | (1 << WIDX_FIX_ALL) | (1 << WIDX_FAST_LIFT_HILL) | (1 << WIDX_DISABLE_BRAKES_FAILURE) | (1 << WIDX_DISABLE_ALL_BREAKDOWNS) | (1 << WIDX_BUILD_IN_PAUSE_MODE) }; @@ -413,6 +465,23 @@ static void cheat_remove_litter() sprite_remove((rct_sprite*)litter); } + map_element_iterator it; + rct_scenery_entry *sceneryEntry; + + map_element_iterator_begin(&it); + do { + if (map_element_get_type(it.element) != MAP_ELEMENT_TYPE_PATH) + continue; + + if ((it.element->properties.path.additions & 0x0F) == 0) + continue; + + sceneryEntry = g_pathBitSceneryEntries[(it.element->properties.path.additions & 0xF) - 1]; + if(sceneryEntry->path_bit.var_06 & (1 << 0)) + it.element->properties.path.addition_status = 0xFF; + + } while (map_element_iterator_next(&it)); + gfx_invalidate_screen(); } @@ -513,23 +582,92 @@ static void cheat_generate_guests(int count) window_invalidate_by_class(WC_BOTTOM_TOOLBAR); } -static void cheat_make_guests_happy() +static void cheat_set_guest_parameter(int parameter, int value) { int spriteIndex; rct_peep *peep; - FOR_ALL_GUESTS(spriteIndex, peep) - if (peep->var_2A == 0) - peep->happiness = 255; + FOR_ALL_GUESTS(spriteIndex, peep) { + switch(parameter) { + case GUEST_PARAMETER_HAPPINESS: + peep->happiness = value; + break; + case GUEST_PARAMETER_ENERGY: + peep->energy = value; + break; + case GUEST_PARAMETER_HUNGER: + peep->hunger = value; + break; + case GUEST_PARAMETER_THIRST: + peep->thirst = value; + break; + case GUEST_PARAMETER_NAUSEA: + peep->nausea = value; + break; + case GUEST_PARAMETER_NAUSEA_TOLERANCE: + peep->nausea_tolerance = value; + break; + case GUEST_PARAMETER_BATHROOM: + peep->bathroom = value; + break; + case GUEST_PARAMETER_PREFERRED_RIDE_INTENSITY: + peep->intensity = (15 << 4) | value; + break; + } + peep_update_sprite_type(peep); + } + } -static void cheat_make_guests_nauseous() +static void cheat_give_all_guests(int object) { int spriteIndex; rct_peep *peep; - FOR_ALL_GUESTS(spriteIndex, peep) - peep->flags |= PEEP_FLAGS_NAUSEA; + FOR_ALL_GUESTS(spriteIndex, peep) { + switch(object) + { + case OBJECT_PARK_MAP: + peep->item_standard_flags |= PEEP_ITEM_MAP; + break; + case OBJECT_BALLOON: + peep->item_standard_flags |= PEEP_ITEM_BALLOON; + peep->balloon_colour=scenario_rand_max(31); + break; + case OBJECT_UMBRELLA: + peep->item_standard_flags |= PEEP_ITEM_UMBRELLA; + peep->umbrella_colour=scenario_rand_max(31); + break; + } + peep_update_sprite_type(peep); + } + window_invalidate_by_class(WC_PEEP); +} + +static void cheat_remove_all_guests() +{ + int i; + rct_ride *ride; + + FOR_ALL_RIDES(i, ride) + { + ride_clear_for_construction(i); + ride_set_status(i, RIDE_STATUS_CLOSED); + } + window_invalidate_by_class(WC_RIDE); + + rct_peep *peep; + uint16 spriteIndex, nextSpriteIndex; + + for (spriteIndex = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_PEEP, uint16); spriteIndex != SPRITE_INDEX_NULL; spriteIndex = nextSpriteIndex) { + peep = &(g_sprite_list[spriteIndex].peep); + nextSpriteIndex = peep->next; + if (peep->type == PEEP_TYPE_GUEST) { + peep_remove(peep); + } + } + + gfx_invalidate_screen(); } static void cheat_explode_guests() @@ -611,18 +749,72 @@ static void window_cheats_guests_mouseup() case WIDX_TAB_4: window_cheats_set_page(w, widgetIndex - WIDX_TAB_1); break; - case WIDX_HAPPY_GUESTS: - cheat_make_guests_happy(); + case WIDX_GUEST_HAPPINESS_MAX: + cheat_set_guest_parameter(GUEST_PARAMETER_HAPPINESS,255); + break; + case WIDX_GUEST_HAPPINESS_MIN: + cheat_set_guest_parameter(GUEST_PARAMETER_HAPPINESS,0); + break; + case WIDX_GUEST_ENERGY_MAX: + cheat_set_guest_parameter(GUEST_PARAMETER_ENERGY,127); + break; + case WIDX_GUEST_ENERGY_MIN: + cheat_set_guest_parameter(GUEST_PARAMETER_ENERGY,0); + break; + case WIDX_GUEST_HUNGER_MAX: + cheat_set_guest_parameter(GUEST_PARAMETER_HUNGER,0); + break; + case WIDX_GUEST_HUNGER_MIN: + cheat_set_guest_parameter(GUEST_PARAMETER_HUNGER,255); + break; + case WIDX_GUEST_THIRST_MAX: + cheat_set_guest_parameter(GUEST_PARAMETER_THIRST,0); + break; + case WIDX_GUEST_THIRST_MIN: + cheat_set_guest_parameter(GUEST_PARAMETER_THIRST,255); + break; + case WIDX_GUEST_NAUSEA_MAX: + cheat_set_guest_parameter(GUEST_PARAMETER_NAUSEA,255); + break; + case WIDX_GUEST_NAUSEA_MIN: + cheat_set_guest_parameter(GUEST_PARAMETER_NAUSEA,0); + break; + case WIDX_GUEST_NAUSEA_TOLERANCE_MAX: + cheat_set_guest_parameter(GUEST_PARAMETER_NAUSEA_TOLERANCE,PEEP_NAUSEA_TOLERANCE_HIGH); + break; + case WIDX_GUEST_NAUSEA_TOLERANCE_MIN: + cheat_set_guest_parameter(GUEST_PARAMETER_NAUSEA_TOLERANCE,PEEP_NAUSEA_TOLERANCE_NONE); + break; + case WIDX_GUEST_BATHROOM_MAX: + cheat_set_guest_parameter(GUEST_PARAMETER_BATHROOM,255); + break; + case WIDX_GUEST_BATHROOM_MIN: + cheat_set_guest_parameter(GUEST_PARAMETER_BATHROOM,0); + break; + case WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1: + cheat_set_guest_parameter(GUEST_PARAMETER_PREFERRED_RIDE_INTENSITY,1); + break; + case WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15: + cheat_set_guest_parameter(GUEST_PARAMETER_PREFERRED_RIDE_INTENSITY,0); break; case WIDX_TRAM_GUESTS: cheat_generate_guests(CHEATS_TRAM_INCREMENT); break; - case WIDX_NAUSEA_GUESTS: - cheat_make_guests_nauseous(); + case WIDX_REMOVE_ALL_GUESTS: + cheat_remove_all_guests(); break; case WIDX_EXPLODE_GUESTS: cheat_explode_guests(); break; + case WIDX_GIVE_GUESTS_PARK_MAPS: + cheat_give_all_guests(OBJECT_PARK_MAP); + break; + case WIDX_GIVE_GUESTS_BALLOONS: + cheat_give_all_guests(OBJECT_BALLOON); + break; + case WIDX_GIVE_GUESTS_UMBRELLAS: + cheat_give_all_guests(OBJECT_UMBRELLA); + break; } } @@ -811,10 +1003,15 @@ static void window_cheats_paint() gfx_draw_string_left(dpi, STR_CHEAT_TIP_CLEAR_LOAN, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(4) + TXTO); } else if (w->page == WINDOW_CHEATS_PAGE_GUESTS){ - gfx_draw_string_left(dpi, STR_CHEAT_TIP_HAPPY_GUESTS, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(0) + TXTO); - gfx_draw_string_left(dpi, STR_CHEAT_TIP_LARGE_TRAM_GUESTS, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(2) + TXTO); - gfx_draw_string_left(dpi, STR_CHEAT_TIP_NAUSEA, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(4) + TXTO); - gfx_draw_string_left(dpi, STR_CHEAT_TIP_EXPLODE, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(6) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_HAPPINESS, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(0) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_ENERGY, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(1) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_HUNGER, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(2) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_THIRST, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(3) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_NAUSEA, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(4) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_NAUSEA_TOLERANCE, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(5) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_BATHROOM, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(6) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_PREFERRED_INTENSITY,NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(7) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GIVE_ALL_GUESTS, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(8) + TXTO); } } From e9eeb36cdf8b292db7e26d3e8c76920e67e124fa Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Tue, 16 Jun 2015 14:57:55 -0400 Subject: [PATCH 0007/1173] Added location variable for console. --- src/interface/console.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/interface/console.c b/src/interface/console.c index 92a0708383..c307f91643 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -17,6 +17,7 @@ #include "../management/research.h" #include "console.h" #include "window.h" +#include "viewport.h" #define CONSOLE_BUFFER_SIZE 8192 #define CONSOLE_BUFFER_2_SIZE 256 @@ -507,6 +508,23 @@ static int cc_get(const char **argv, int argc) else if (strcmp(argv[0], "no_test_crashes") == 0) { console_printf("no_test_crashes %d", gConfigGeneral.no_test_crashes); } + else if (strcmp(argv[0], "location") == 0) { + rct_window *w = window_get_main(); + if (w != NULL) { + int interactionType; + rct_map_element *mapElement; + rct_xy16 mapCoord = { 0 }; + + get_map_coordinates_from_pos(w->viewport->view_width / 2, w->viewport->view_height / 2, VIEWPORT_INTERACTION_MASK_TERRAIN, &mapCoord.x, &mapCoord.y, &interactionType, &mapElement, NULL); + mapCoord.x -= 16; + mapCoord.x /= 32; + mapCoord.y -= 16; + mapCoord.y /= 32; + mapCoord.x++; + mapCoord.y++; + console_printf("location %d %d", mapCoord.x, mapCoord.y); + } + } else { console_writeline_warning("Invalid variable."); } @@ -517,9 +535,12 @@ static int cc_set(const char **argv, int argc) { if (argc > 1) { bool int_valid = true, double_valid = true; + bool int_valid2 = true, double_valid2 = true; int int_val = console_parse_int(argv[1], &int_valid); double double_val = console_parse_double(argv[1], &double_valid); + int int_val2 = console_parse_int(argv[2], &int_valid2); + double double_val2 = console_parse_double(argv[2], &double_valid2); if (strcmp(argv[0], "money") == 0 && double_valid) { RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32) = ENCRYPT_MONEY(MONEY((int)double_val, ((int)(double_val * 100)) % 100)); @@ -635,6 +656,18 @@ static int cc_set(const char **argv, int argc) config_save_default(); console_execute_silent("get no_test_crashes"); } + else if (strcmp(argv[0], "location") == 0 && int_valid && int_valid2) { + rct_window *w = window_get_main(); + if (w != NULL) { + int x = (sint16)(int_val * 32 + 16); + int y = (sint16)(int_val2 * 32 + 16); + int z = map_element_height(x, y); + window_scroll_to_location(w, x, y, z); + w->flags &= ~WF_SCROLLING_TO_LOCATION; + viewport_update_position(w); + console_execute_silent("get location"); + } + } else { console_writeline_error("Invalid variable or value."); } @@ -831,7 +864,8 @@ char* console_variable_table[] = { "game_speed", "console_small_font", "test_unfinished_tracks", - "no_test_crashes" + "no_test_crashes", + "location" }; char* console_window_table[] = { "object_selection", From a2dc83b6eb3bb83246f15c8254fb0407ac91bb5a Mon Sep 17 00:00:00 2001 From: Aleksandr Kalko Date: Wed, 17 Jun 2015 00:08:08 +0300 Subject: [PATCH 0008/1173] README stuff - Removed redundant RCT2 prerequisite - Added Powershell 4.0 as prerequiste - Added MacPorts as Homebrew alternative - Changed build instructions up-to-date --- readme.md | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/readme.md b/readme.md index 3b5b0c0d05..7e494aafb0 100644 --- a/readme.md +++ b/readme.md @@ -16,7 +16,7 @@ An open source clone of RollerCoaster Tycoon 2 built by decompiling the original - 1.3 - [Progress](#13-progress) - 1.4 - [Aim](#14-aim) - 2 - [Downloading the game / Building the source code](#2-building-the-source-code) - - 2.1 - [Prerequisites](#21-prerequisites) + - 2.1 - [Building Prerequisites](#21-building-prerequisites) - 2.2 - [Compiling and running](#22-compiling-and-running) - 3 - [Contributing](#3-contributing) - 3.1 - [Decompiling](#31-decompiling) @@ -51,10 +51,10 @@ The aim is to completely decompile RollerCoaster Tycoon 2 into C so that cross-p - Improved title sequence - Translation into more languages - Re-introduction of RollerCoaster Tycoon 1 mechanics: - - Shuttle Loop compatibility - - Have Fun! objective - - Finish building five coasters objective - - Using the mountain tool during the game + - Shuttle Loop compatibility + - Have Fun! objective + - Finish building five coasters objective + - Using the mountain tool during the game # 2 Downloading the game / Building the source code @@ -65,35 +65,36 @@ A couple of third parties offer downloadable precompiled builds. However, buildi There is also a Launcher available from [OpenRCT.net](https://openrct.net/download) that will automatically update your build so that you always have the current version as they are released. -## 2.1 Prerequisites +## 2.1 Building prerequisites + +OpenRCT2 requires original files of Rollercoaster Tycoon 2 to play. It can be bought at either [Steam](http://store.steampowered.com/app/285330/) or [GOG.com](http://www.gog.com/game/rollercoaster_tycoon_2). + ### Windows: - Windows XP / Vista / 7 / 8 / 10 -- RollerCoaster Tycoon 2 - Visual Studio 2013 (Professional / [Community](http://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx) / [Express for Windows Desktop](http://www.visualstudio.com/downloads/download-visual-studio-vs#d-express-windows-desktop)) -- [SDL2 development library for Visual C++](http://www.libsdl.org/release/SDL2-devel-2.0.3-VC.zip). +- [Powershell 4.0](http://social.technet.microsoft.com/wiki/contents/articles/21016.how-to-install-windows-powershell-4-0.aspx). -### Max OS X: -- [Homebrew](http://brew.sh) -- RollerCoaster Tycoon 2 +### Mac OS X: +- [Homebrew](http://brew.sh) or [MacPorts](https://www.macports.org/) ### Mac OS X / Linux: - [MinGW-w64](http://mingw-w64.sourceforge.net/) - [Wine](http://www.winehq.org) -- RollerCoaster Tycoon 2 - libsdl2 compiled with MinGW-w64 ## 2.2 Compiling and running ### Windows: 1. Check out the repository. This can be done using [GitHub Windows](https://windows.github.com/) or [other tools](https://help.github.com/articles/which-remote-url-should-i-use). -2. Download the [SDL2 development library for Visual C++]((http://www.libsdl.org/release/SDL2-devel-2.0.3-VC.zip)) and copy it to a new directory called "sdl" in the repository. This directory should contain "include". The path should resemble ```\OpenRCT2\lib\sdl\include\```. -3. Open the solution in the projects directory (**openrct2.sln**) with Visual Studio. -4. [Select the 'Release' configuration](http://msdn.microsoft.com/en-us/library/wx0123s5.aspx) and click Build -> Rebuild Solution. The dropdown menu to enable the 'release' configuration is towards the top of the VS Express window, near the "TEST" menu. -5. Start debugging. Press the "Local Windows Debugger" button with a green "play" icon next to it. If Visual Studio shows a warning about *openrct2.exe* not having debug information, press Continue. -6. When OpenRCT2 is run for the first time, it creates a settings file in `My Documents/OpenRCT2`. If it can't find the original installation of RCT2, you will need to edit `config.ini` in that folder and change the value of `game_path` to where RCT2 is installed. -7. If the game crashes, you may need to press the red, square Stop button along the top of VS Express to stop the program. +2. Open the solution in the projects directory (**openrct2.sln**) with Visual Studio. +3. [Select the 'Release' configuration](http://msdn.microsoft.com/en-us/library/wx0123s5.aspx) and click Build -> Rebuild Solution. The dropdown menu to enable the 'release' configuration is towards the top of the VS Express window, near the "TEST" menu. +4. Start debugging. Press the "Local Windows Debugger" button with a green "play" icon next to it. If Visual Studio shows a warning about *openrct2.exe* not having debug information, press Continue. +5. When OpenRCT2 is run for the first time, it creates a settings file in `My Documents/OpenRCT2`. If it can't find the original installation of RCT2, you will need to edit `config.ini` in that folder and change the value of `game_path` to where RCT2 is installed. +6. If the game crashes, you may need to press the red, square Stop button along the top of VS Express to stop the program. + +Alternatively, to simply build the project you can just execute ``build.bat`` within VS2013 Native Tools Command prompt or Github Windows prompt. ### Mac OS X: -Providing Homebrew is installed, OpenRCT2's dependencies and Wine can be installed automatically through `install.sh`. +Providing Homebrew or MacPorts are installed (but not both!), OpenRCT2's dependencies and Wine can be installed automatically through `install.sh`. ``` bash install.sh bash build.sh From 133c0de23ddb844f146877f7839270f02a573de3 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 16 Jun 2015 22:56:08 +0100 Subject: [PATCH 0009/1173] refactor cheats and improve checkbox drawing --- src/drawing/drawing.h | 1 + src/drawing/string.c | 63 ++++++++++++++++ src/interface/widget.c | 14 +++- src/windows/cheats.c | 162 ++++++++++++++++++++++------------------- 4 files changed, 160 insertions(+), 80 deletions(-) diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 80f3713e1a..77691ec193 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -117,6 +117,7 @@ int gfx_draw_string_centred_wrapped(rct_drawpixelinfo *dpi, void *args, int x, i void draw_string_centred_raw(rct_drawpixelinfo *dpi, int x, int y, int numLines, char *text); void gfx_draw_string_right(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y); void draw_string_right_underline(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y); +int string_get_height_raw(char *buffer); // rain void update_rain_animation(); diff --git a/src/drawing/string.c b/src/drawing/string.c index 3acb688e86..e11aac06a6 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -1141,4 +1141,67 @@ void draw_string_centred_raw(rct_drawpixelinfo *dpi, int x, int y, int numLines, y += 12; } +} + +int string_get_height_raw(char *buffer) +{ + uint16 fontBase = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + + int height = 0; + if (fontBase <= 224) + height += 10; + else if (fontBase == 448) + height += 6; + + char *ch = buffer; + while (*ch != 0) { + char c = *ch++; + switch (c) { + case FORMAT_NEWLINE: + if (fontBase <= 224) { + height += 10; + break; + } else if (fontBase == 448) { + height += 6; + break; + } + height += 18; + break; + case FORMAT_NEWLINE_SMALLER: + if (fontBase <= 224) { + height += 5; + break; + } else if (fontBase == 448) { + height += 3; + break; + } + height += 9; + break; + case FORMAT_TINYFONT: + fontBase = 448; + break; + case FORMAT_BIGFONT: + fontBase = 672; + break; + case FORMAT_MEDIUMFONT: + fontBase = 224; + break; + case FORMAT_SMALLFONT: + fontBase = 0; + break; + default: + if (c >= 32) continue; + if (c <= 4) { + ch++; + continue; + } + if (c <= 16) continue; + ch += 2; + if (c <= 22) continue; + ch += 2; + break; + } + } + + return height; } \ No newline at end of file diff --git a/src/interface/widget.c b/src/interface/widget.c index 87472e630f..04bc1d3ed2 100644 --- a/src/interface/widget.c +++ b/src/interface/widget.c @@ -732,7 +732,7 @@ static void widget_closebox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg static void widget_checkbox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) { rct_widget* widget; - int l, t, b; + int l, t, b, yMid; uint8 colour; // Get the widget @@ -742,18 +742,19 @@ static void widget_checkbox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg l = w->x + widget->left; t = w->y + widget->top; b = w->y + widget->bottom; + yMid = (b + t) / 2; // Get the colour colour = w->colours[widget->colour]; if (widget->type != WWT_24) { // checkbox - gfx_fill_rect_inset(dpi, l, t, l + 9, b - 1, colour, 0x60); + gfx_fill_rect_inset(dpi, l, yMid - 5, l + 9, yMid + 4, colour, 0x60); // fill it when checkbox is pressed if (widget_is_pressed(w, widgetIndex)) { RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; - gfx_draw_string(dpi, (char*)0x009DED72, colour & 0x7F, l, t); + gfx_draw_string(dpi, (char*)0x009DED72, colour & 0x7F, l, yMid - 5); } } @@ -764,7 +765,12 @@ static void widget_checkbox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg if (widget_is_disabled(w, widgetIndex)) { colour |= 0x40; } - gfx_draw_string_left(dpi, widget->image, (char*)0x013CE952, colour, l + 14, t); + + // TODO extract this to a string method and maybe a draw vertically centred + char *buffer = (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER; + format_string(buffer, (rct_string_id)widget->image, (void*)0x013CE952); + int height = string_get_height_raw(buffer); + gfx_draw_string(dpi, buffer, colour, l + 14, yMid - (height / 2)); } /** diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 1b5af25faa..8d6aa780b4 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -39,6 +39,7 @@ #define CHEATS_MONEY_INCREMENT MONEY(5000,00) #define CHEATS_TRAM_INCREMENT 250 + enum { WINDOW_CHEATS_PAGE_MONEY, WINDOW_CHEATS_PAGE_GUESTS, @@ -139,18 +140,26 @@ enum { #define WPL(COL) XPL(COL) + BTNW #define OWPL XPL(0) + OPTW +#define MIN_BTN_LEFT ((sint16)(XPL(1))) +#define MIN_BTN_RIGHT ((sint16)(WPL(1) / 2)) +#define MAX_BTN_LEFT ((sint16)(XPL(1.5))) +#define MAX_BTN_RIGHT ((sint16)(WPL(1.5) / 2)) + #define TXTO 3 //text horizontal offset from button left (for button text) #pragma endregion +#define MAIN_CHEATS_WIDGETS \ + { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, 0x0FFFFFFFF, STR_NONE }, /* panel / background */ \ + { WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_CHEAT_TITLE, STR_WINDOW_TITLE_TIP }, /* title bar */ \ + { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, /* close x button */ \ + { WWT_IMGBTN, 1, 0, WW - 1, 43, WH - 1, 0x0FFFFFFFF, STR_NONE }, /* tab content panel */ \ + { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_FINANCIAL_CHEATS_TIP }, /* tab 1 */ \ + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_GUEST_CHEATS_TIP }, /* tab 2 */ \ + { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_PARK_CHEATS_TIP }, /* tab 3 */ \ + { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_RIDE_CHEATS_TIP } /* tab 4 */ + static rct_widget window_cheats_money_widgets[] = { - { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, 0x0FFFFFFFF, 65535}, // panel / background - { WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_CHEAT_TITLE_FINANCIAL, STR_WINDOW_TITLE_TIP}, // title bar - { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, 0x338, STR_CLOSE_WINDOW_TIP}, // close x button - { WWT_IMGBTN, 1, 0, WW - 1, 43, WH - 1, 0x0FFFFFFFF, 65535}, // tab content panel - { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_FINANCIAL_CHEATS_TIP }, // tab 1 - { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_GUEST_CHEATS_TIP }, // tab 2 - { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_PARK_CHEATS_TIP }, // tab 3 - { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_RIDE_CHEATS_TIP }, // tab 4 + MAIN_CHEATS_WIDGETS, { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_5K_MONEY, STR_NONE}, // high money { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(3), HPL(3), STR_CHEAT_PAY_ENTRANCE, STR_NONE}, // Park Entrance Fee Toggle { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_CHEAT_CLEAR_LOAN, STR_NONE }, // Clear loan @@ -158,81 +167,60 @@ static rct_widget window_cheats_money_widgets[] = { }; static rct_widget window_cheats_guests_widgets[] = { - { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, 0x0FFFFFFFF, 65535 }, // panel / background - { WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_CHEAT_TITLE_GUEST, STR_WINDOW_TITLE_TIP }, // title bar - { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, 0x338, STR_CLOSE_WINDOW_TIP }, // close x button - { WWT_IMGBTN, 1, 0, WW - 1, 43, WH - 1, 0x0FFFFFFFF, 65535 }, // tab content panel - { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_FINANCIAL_CHEATS_TIP }, // tab 1 - { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_GUEST_CHEATS_TIP }, // tab 2 - { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_PARK_CHEATS_TIP }, // tab 3 - { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_RIDE_CHEATS_TIP }, // tab 4 - { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(0), HPL(0), STR_MAX, STR_NONE}, // happiness max - { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(0), HPL(0), STR_MIN, STR_NONE}, // happiness min - { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(1), HPL(1), STR_MAX, STR_NONE}, // energy max - { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(1), HPL(1), STR_MIN, STR_NONE}, // energy min - { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(2), HPL(2), STR_MAX, STR_NONE}, // hunger max - { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(2), HPL(2), STR_MIN, STR_NONE}, // hunger min - { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(3), HPL(3), STR_MAX, STR_NONE}, // thirst max - { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(3), HPL(3), STR_MIN, STR_NONE}, // thirst min - { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(4), HPL(4), STR_MAX, STR_NONE}, // nausea max - { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(4), HPL(4), STR_MIN, STR_NONE}, // nausea min - { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(5), HPL(5), STR_MAX, STR_NONE}, // nausea tolerance max - { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(5), HPL(5), STR_MIN, STR_NONE}, // nausea tolerance min - { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(6), HPL(6), STR_MAX, STR_NONE}, // bathroom max - { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(6), HPL(6), STR_MIN, STR_NONE}, // bathroom min - { WWT_CLOSEBOX, 1, XPL(1.5),WPL(1.5)/2,YPL(7), HPL(7), STR_CHEAT_MORE_THAN_1, STR_NONE}, // ride intensity > 1 - { WWT_CLOSEBOX, 1, XPL(1), WPL(1)/2, YPL(7), HPL(7), STR_CHEAT_LESS_THAN_15, STR_NONE}, // ride intensity < 15 - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(10), HPL(10), STR_CHEAT_LARGE_TRAM_GUESTS, STR_CHEAT_TIP_LARGE_TRAM_GUESTS},// large tram - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(11), HPL(11), STR_CHEAT_REMOVE_ALL_GUESTS, STR_CHEAT_TIP_REMOVE_ALL_GUESTS},// explode guests - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(11), HPL(11), STR_CHEAT_EXPLODE, STR_CHEAT_TIP_EXPLODE}, // explode guests - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(9), HPL(9), 2018, STR_NONE}, // give guests park maps - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(9), HPL(9), 2016, STR_NONE}, // give guests balloons - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(8), HPL(8), 2020, STR_NONE}, // give guests umbrellas + MAIN_CHEATS_WIDGETS, + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(0), HPL(0), STR_MAX, STR_NONE }, // happiness max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(0), HPL(0), STR_MIN, STR_NONE }, // happiness min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(1), HPL(1), STR_MAX, STR_NONE }, // energy max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(1), HPL(1), STR_MIN, STR_NONE }, // energy min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(2), HPL(2), STR_MAX, STR_NONE }, // hunger max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(2), HPL(2), STR_MIN, STR_NONE }, // hunger min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(3), HPL(3), STR_MAX, STR_NONE }, // thirst max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(3), HPL(3), STR_MIN, STR_NONE }, // thirst min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(4), HPL(4), STR_MAX, STR_NONE }, // nausea max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(4), HPL(4), STR_MIN, STR_NONE }, // nausea min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(5), HPL(5), STR_MAX, STR_NONE }, // nausea tolerance max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(5), HPL(5), STR_MIN, STR_NONE }, // nausea tolerance min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(6), HPL(6), STR_MAX, STR_NONE }, // bathroom max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(6), HPL(6), STR_MIN, STR_NONE }, // bathroom min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(7), HPL(7), STR_CHEAT_MORE_THAN_1, STR_NONE }, // ride intensity > 1 + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(7), HPL(7), STR_CHEAT_LESS_THAN_15, STR_NONE }, // ride intensity < 15 + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(10), HPL(10), STR_CHEAT_LARGE_TRAM_GUESTS, STR_CHEAT_TIP_LARGE_TRAM_GUESTS }, // large tram + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(11), HPL(11), STR_CHEAT_REMOVE_ALL_GUESTS, STR_CHEAT_TIP_REMOVE_ALL_GUESTS }, // explode guests + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(11), HPL(11), STR_CHEAT_EXPLODE, STR_CHEAT_TIP_EXPLODE }, // explode guests + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(9), HPL(9), 2018, STR_NONE }, // give guests park maps + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(9), HPL(9), 2016, STR_NONE }, // give guests balloons + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(8), HPL(8), 2020, STR_NONE }, // give guests umbrellas { WIDGETS_END }, }; //Strings for following moved to window_cheats_paint() static rct_widget window_cheats_misc_widgets[] = { - { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, 0x0FFFFFFFF, 65535 }, // panel / background - { WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_CHEAT_TITLE_PARK, STR_WINDOW_TITLE_TIP }, // title bar - { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, 0x338, STR_CLOSE_WINDOW_TIP }, // close x button - { WWT_IMGBTN, 1, 0, WW - 1, 43, WH - 1, 0x0FFFFFFFF, 65535 }, // tab content panel - { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_FINANCIAL_CHEATS_TIP }, // tab 1 - { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_GUEST_CHEATS_TIP }, // tab 2 - { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_PARK_CHEATS_TIP }, // tab 3 - { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_RIDE_CHEATS_TIP }, // tab 4 - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_FREEZE_CLIMATE, STR_NONE}, // Freeze climate - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(0), HPL(0), STR_CHEAT_OPEN_PARK, STR_NONE}, // open / close park - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_ZERO_CLEARANCE, STR_NONE}, // Zero Clearance - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_FORCE_SUN, STR_NONE}, // Sun - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(2), HPL(2), STR_CHEAT_FORCE_THUNDER, STR_NONE}, // Thunder - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(3), HPL(3), STR_CHEAT_CLEAR_GRASS, STR_NONE}, // Clear grass - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(3), HPL(3), STR_CHEAT_MOWED_GRASS, STR_NONE}, // Mowed grass - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(4), HPL(4), STR_CHEAT_WATER_PLANTS, STR_NONE}, // Water plants - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(4), HPL(4), STR_CHEAT_FIX_VANDALISM, STR_NONE}, // Fix vandalism - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_CHEAT_REMOVE_LITTER, STR_NONE}, // Remove litter - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(0), HPL(0), STR_CHEAT_WIN_SCENARIO, STR_NONE}, // Win scenario - { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(8),OHPL(8), STR_CHEAT_UNLOCK_PRICES, STR_NONE}, // Unlock all prices - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(5), HPL(5), STR_CHEAT_SANDBOX_MODE, STR_CHEAT_SANDBOX_MODE_TIP},// Sandbox mode (edit land ownership in-game) + MAIN_CHEATS_WIDGETS, + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_FREEZE_CLIMATE, STR_NONE}, // Freeze climate + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(0), HPL(0), STR_CHEAT_OPEN_PARK, STR_NONE}, // open / close park + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_ZERO_CLEARANCE, STR_NONE}, // Zero Clearance + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_FORCE_SUN, STR_NONE}, // Sun + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(2), HPL(2), STR_CHEAT_FORCE_THUNDER, STR_NONE}, // Thunder + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(3), HPL(3), STR_CHEAT_CLEAR_GRASS, STR_NONE}, // Clear grass + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(3), HPL(3), STR_CHEAT_MOWED_GRASS, STR_NONE}, // Mowed grass + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(4), HPL(4), STR_CHEAT_WATER_PLANTS, STR_NONE}, // Water plants + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(4), HPL(4), STR_CHEAT_FIX_VANDALISM, STR_NONE}, // Fix vandalism + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_CHEAT_REMOVE_LITTER, STR_NONE}, // Remove litter + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(0), HPL(0), STR_CHEAT_WIN_SCENARIO, STR_NONE}, // Win scenario + { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(8),OHPL(8), STR_CHEAT_UNLOCK_PRICES, STR_NONE}, // Unlock all prices + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(5), HPL(5), STR_CHEAT_SANDBOX_MODE, STR_CHEAT_SANDBOX_MODE_TIP}, // Sandbox mode (edit land ownership in-game) { WIDGETS_END }, }; static rct_widget window_cheats_rides_widgets[] = { - { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, 0x0FFFFFFFF, 65535 }, // panel / background - { WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_CHEAT_TITLE_RIDE, STR_WINDOW_TITLE_TIP }, // title bar - { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, 0x338, STR_CLOSE_WINDOW_TIP }, // close x button - { WWT_IMGBTN, 1, 0, WW - 1, 43, WH - 1, 0x0FFFFFFFF, 65535 }, // tab content panel - { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_FINANCIAL_CHEATS_TIP }, // tab 1 - { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_GUEST_CHEATS_TIP }, // tab 2 - { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_PARK_CHEATS_TIP }, // tab 3 - { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_RIDE_CHEATS_TIP }, // tab 4 - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(0), HPL(0), STR_CHEAT_RENEW_RIDES, STR_NONE}, // Renew rides - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(0), HPL(0), STR_CHEAT_REMOVE_FLAGS, STR_NONE}, // Remove flags - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_MAKE_DESTRUCTABLE, STR_NONE}, // Make destructable - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_FIX_ALL_RIDES, STR_NONE }, // Fix all rides - { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(8),OHPL(8), STR_CHEAT_410_HILL_LIFT, STR_NONE }, // 410 km/h lift hill - { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(6),OHPL(6), STR_CHEAT_DISABLE_BRAKES_FAILURE,STR_NONE }, // Disable brakes failure - { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(7),OHPL(7), STR_CHEAT_DISABLE_BREAKDOWNS, STR_NONE }, // Disable all breakdowns - { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(5),OHPL(5), STR_CHEAT_BUILD_IN_PAUSE_MODE, STR_NONE }, // Build in pause mode + MAIN_CHEATS_WIDGETS, + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(0), HPL(0), STR_CHEAT_RENEW_RIDES, STR_NONE}, // Renew rides + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(0), HPL(0), STR_CHEAT_REMOVE_FLAGS, STR_NONE}, // Remove flags + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_MAKE_DESTRUCTABLE, STR_NONE}, // Make destructable + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_FIX_ALL_RIDES, STR_NONE }, // Fix all rides + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(8),OHPL(8) + 8, STR_CHEAT_410_HILL_LIFT, STR_NONE }, // 410 km/h lift hill + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(6),OHPL(6), STR_CHEAT_DISABLE_BRAKES_FAILURE,STR_NONE }, // Disable brakes failure + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(7),OHPL(7), STR_CHEAT_DISABLE_BREAKDOWNS, STR_NONE }, // Disable all breakdowns + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(5),OHPL(5), STR_CHEAT_BUILD_IN_PAUSE_MODE, STR_NONE }, // Build in pause mode { WIDGETS_END }, }; @@ -394,6 +382,13 @@ static uint32 window_cheats_page_enabled_widgets[] = { (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_RENEW_RIDES) | (1 << WIDX_REMOVE_SIX_FLAGS) | (1 << WIDX_MAKE_DESTRUCTIBLE) | (1 << WIDX_FIX_ALL) | (1 << WIDX_FAST_LIFT_HILL) | (1 << WIDX_DISABLE_BRAKES_FAILURE) | (1 << WIDX_DISABLE_ALL_BREAKDOWNS) | (1 << WIDX_BUILD_IN_PAUSE_MODE) }; +static rct_string_id window_cheats_page_titles[] = { + STR_CHEAT_TITLE_FINANCIAL, + STR_CHEAT_TITLE_GUEST, + STR_CHEAT_TITLE_RIDE, + STR_CHEAT_TITLE_PARK, +}; + static void window_cheats_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w); #pragma region Cheat functions @@ -698,7 +693,7 @@ void window_cheats_open() window->widgets = window_cheats_money_widgets; window->enabled_widgets = window_cheats_page_enabled_widgets[0]; window_init_scroll_widgets(window); - window->page = WINDOW_CHEATS_PAGE_MONEY; + window_cheats_set_page(window, WINDOW_CHEATS_PAGE_MONEY); } static void window_cheats_money_mouseup() @@ -985,6 +980,9 @@ static void window_cheats_invalidate() for (i = 0; i < 7; i++) w->pressed_widgets &= ~(1 << (WIDX_TAB_1 + i)); w->pressed_widgets |= 1LL << (WIDX_TAB_1 + w->page); + + // Set title + w->widgets[WIDX_TITLE].image = window_cheats_page_titles[w->page]; } static void window_cheats_paint() @@ -1062,6 +1060,18 @@ static void window_cheats_set_page(rct_window *w, int page) w->event_handlers = window_cheats_page_events[page]; w->widgets = window_cheats_page_widgets[page]; + int maxY = 0; + rct_widget *widget = &w->widgets[8]; + while (widget->type != WWT_LAST) { + maxY = max(maxY, widget->bottom); + widget++; + } + maxY += 6; + + window_invalidate(w); + w->height = maxY; + w->widgets[WIDX_BACKGROUND].bottom = maxY; + w->widgets[WIDX_PAGE_BACKGROUND].bottom = maxY; window_invalidate(w); } From 92acfab16035312edab410a246144f9d4693cb50 Mon Sep 17 00:00:00 2001 From: JarnoVgr Date: Wed, 17 Jun 2015 00:55:32 +0200 Subject: [PATCH 0010/1173] Added build number support --- src/rct2.h | 1 + src/title.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/rct2.h b/src/rct2.h index 5f10548f66..9421c31888 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -80,6 +80,7 @@ typedef utf16* utf16string; #define OPENRCT2_TIMESTAMP __DATE__ " " __TIME__ // The following constants are for automated build servers +#define OPENRCT2_BUILD_NUMBER "" #define OPENRCT2_BUILD_SERVER "" #define OPENRCT2_BRANCH "develop" #define OPENRCT2_COMMIT_SHA1 "" diff --git a/src/title.c b/src/title.c index c1b2334f82..ec557ab74b 100644 --- a/src/title.c +++ b/src/title.c @@ -376,6 +376,8 @@ static void DrawOpenRCT2(int x, int y) sprintf(buffer, "%c%c%c%s, v%s", FORMAT_MEDIUMFONT, FORMAT_OUTLINE, FORMAT_WHITE, OPENRCT2_NAME, OPENRCT2_VERSION); if (!str_is_null_or_empty(OPENRCT2_BRANCH)) sprintf(strchr(buffer, 0), "-%s", OPENRCT2_BRANCH); + if (!str_is_null_or_empty(OPENRCT2_BUILD_NUMBER)) + sprintf(strchr(buffer, 0), " build %s", OPENRCT2_BUILD_NUMBER); if (!str_is_null_or_empty(OPENRCT2_COMMIT_SHA1_SHORT)) sprintf(strchr(buffer, 0), " (%s)", OPENRCT2_COMMIT_SHA1_SHORT); if (!str_is_null_or_empty(OPENRCT2_BUILD_SERVER)) From 542eb057d927ed365cf7d9100fa1e93fb9cf86b8 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 17 Jun 2015 16:21:50 +0100 Subject: [PATCH 0011/1173] set font when drawing checkboxes, extracted draw string left centred to new method --- src/drawing/drawing.h | 1 + src/drawing/string.c | 16 +++++++++++++++- src/interface/widget.c | 6 +----- src/windows/options.c | 2 ++ 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 77691ec193..dc231df1e7 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -110,6 +110,7 @@ void gfx_draw_string_left(rct_drawpixelinfo *dpi, int format, void *args, int co void gfx_draw_string_left_clipped(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y, int width); int gfx_draw_string_left_wrapped(rct_drawpixelinfo *dpi, void *args, int x, int y, int width, int format, int colour); void draw_string_left_underline(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y); +void gfx_draw_string_left_centred(rct_drawpixelinfo *dpi, rct_string_id format, void *args, int colour, int x, int y); void gfx_draw_string_centred(rct_drawpixelinfo *dpi, int format, int x, int y, int colour, void *args); void gfx_draw_string_centred_clipped(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y, int width); void draw_string_centred_underline(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y); diff --git a/src/drawing/string.c b/src/drawing/string.c index e11aac06a6..2de4468b78 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -707,10 +707,24 @@ void gfx_draw_string_left(rct_drawpixelinfo *dpi, int format, void *args, int co buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); format_string(buffer, format, args); - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0xE0; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; gfx_draw_string(dpi, buffer, colour, x, y); } +/** + * Draws text that is left aligned and vertically centred. + */ +void gfx_draw_string_left_centred(rct_drawpixelinfo *dpi, rct_string_id format, void *args, int colour, int x, int y) +{ + char* buffer; + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; + buffer = (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER; + format_string(buffer, format, args); + int height = string_get_height_raw(buffer); + gfx_draw_string(dpi, buffer, colour, x, y - (height / 2)); +} + /** * Changes the palette so that the next character changes colour */ diff --git a/src/interface/widget.c b/src/interface/widget.c index 04bc1d3ed2..02ddf9ad14 100644 --- a/src/interface/widget.c +++ b/src/interface/widget.c @@ -766,11 +766,7 @@ static void widget_checkbox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg colour |= 0x40; } - // TODO extract this to a string method and maybe a draw vertically centred - char *buffer = (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER; - format_string(buffer, (rct_string_id)widget->image, (void*)0x013CE952); - int height = string_get_height_raw(buffer); - gfx_draw_string(dpi, buffer, colour, l + 14, yMid - (height / 2)); + gfx_draw_string_left_centred(dpi, (rct_string_id)widget->image, (void*)0x013CE952, colour, l + 14, yMid); } /** diff --git a/src/windows/options.c b/src/windows/options.c index fb46b70615..a618b7442b 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -1222,6 +1222,8 @@ static void window_options_paint() break; case WINDOW_OPTIONS_PAGE_CULTURE: gfx_draw_string_left(dpi, 2776, w, w->colours[1], w->x + 10, w->y + window_options_culture_widgets[WIDX_LANGUAGE].top + 1); + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; gfx_draw_string( dpi, (char*)language_names[gCurrentLanguage], From 6285a69e3c42a9dbb0ac9dff04977542dc9de542 Mon Sep 17 00:00:00 2001 From: Krutonium Date: Wed, 17 Jun 2015 18:33:53 -0400 Subject: [PATCH 0012/1173] Added Subverse to readme http://www.voat.co/v/openrct2 --- readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.md b/readme.md index 7e494aafb0..a00641b470 100644 --- a/readme.md +++ b/readme.md @@ -143,3 +143,4 @@ Translations are in progress for German, Dutch, French, Hungarian, Polish, Spani - [Launcher that keeps your copy up-to-date](https://openrct.net/download) - [rct2 subreddit](http://www.reddit.com/r/rct/) - [openrct2 subreddit](http://www.reddit.com/r/openrct2) +- [openrct2 subverse](http://www.voat.co/v/openrct2) From 032a5c03cae22bd62425990a618b392be8059620 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 18 Jun 2015 04:00:15 +0100 Subject: [PATCH 0013/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 15 ++++++++++----- data/language/english_us.txt | 7 ++++++- data/language/german.txt | 19 +++++++++++++++++-- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index db170d4a2b..ed35caf694 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3449,7 +3449,7 @@ STR_3446 :Werkgebied wissen #Start van OpenRCT2-indices STR_5120 :'Financiën'-knop in de werkbalk tonen STR_5121 :'Onderzoek'-knop in de werkbalk tonen -STR_5122 :Alle voertuigen met hetzelfde baan- of attractietype tonen +STR_5122 :Alle voertuigen met hetzelfde baan-/attractietype tonen STR_5123 :Attr. vernieuwen STR_5124 :Six Flags weg STR_5125 :Afbreekbaar maken @@ -3496,11 +3496,11 @@ STR_5163 :Maand/dag/jaar STR_5164 :Twitch-kanaalnaam STR_5165 :Bezoekers namen van volgers geven STR_5166 :Geeft bezoekers namen van gebruikers die het Twitch-kanaal volgen. -STR_5167 :Bezoekers met Twitch-volgersnamen volgen in berichtengebied +STR_5167 :Bez. met Twitch-volgersnamen volgen in berichtengebied STR_5168 :Zet het bezoekersvolgsysteem aan voor bezoekers die naar Twitch-volgers zijn genoemd. -STR_5169 :Bezoekers namen van gebruikers in de Twitch-chat geven +STR_5169 :Bez. namen van gebruikers in de Twitch-chat geven STR_5170 :Geeft bezoekers namen van gebruikers in de Twitch-chat. -STR_5171 :Bezoekers met Twitch-chatnamen volgen in berichtengebied +STR_5171 :Bez. met Twitch-chatnamen volgen in berichtengebied STR_5172 :Zet het bezoekersvolgsysteem aan voor bezoekers die naar Twitch-chatters zijn genoemd. STR_5173 :Twitch-chat als nieuws weergeven STR_5174 :Zal chatberichten op Twitch die beginnen met !news in het berichtengebied tonen. @@ -3615,7 +3615,7 @@ STR_5282 :Attracties openen/sluiten via RCT1-stoplichten STR_5283 :Park openen/sluiten via RCT1-stoplichten STR_5284 :Scenarioselectie-lettertype in RCT1-stijl STR_5285 :KABOEM! -STR_5286 :{MEDIUMFONT}{BLACK}Laat alle gasten exploderen +STR_5286 :{MEDIUMFONT}{BLACK}Laat sommige gasten exploderen STR_5287 :Attractie is al defect STR_5288 :Attractie is gesloten STR_5289 :Deze attractie kan niet defect raken @@ -3674,3 +3674,8 @@ STR_5341 :Eigenschappen STR_5342 :Kies een vakje op de kaart STR_5343 :Werknemers automatisch plaatsen STR_5344 :Wijzigingsoverzicht +STR_5345 :Cheats voor geld +STR_5346 :Cheats voor bezoekers +STR_5347 :Cheats voor attracties +STR_5348 :Cheats voor het park +STR_5349 :{SMALLFONT}{BLACK}Alle attracties diff --git a/data/language/english_us.txt b/data/language/english_us.txt index f5ecc67ee3..8585336194 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3624,7 +3624,7 @@ STR_5282 :RCT1 Ride Open/Close Lights STR_5283 :RCT1 Park Open/Close Lights STR_5284 :RCT1 Scenario Selection Font STR_5285 :EXPLODE!!! -STR_5286 :{MEDIUMFONT}{BLACK}Makes guests explode +STR_5286 :{MEDIUMFONT}{BLACK}Makes some guests explode STR_5287 :Ride is already broken down STR_5288 :Ride is closed STR_5289 :No breakdowns available for this ride @@ -3683,3 +3683,8 @@ STR_5341 :Flags STR_5342 :Choose a map tile STR_5343 :Automatically place staff STR_5344 :Changelog +STR_5345 :Financial cheats +STR_5346 :Guest cheats +STR_5347 :Ride cheats +STR_5348 :Park cheats +STR_5349 :{SMALLFONT}{BLACK}All Rides diff --git a/data/language/german.txt b/data/language/german.txt index e4a4927716..28e928c0b1 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -2687,7 +2687,7 @@ STR_2680 :Alle Forschungen beendet STR_2681 :{MEDIUMFONT}{BLACK}Erhöht Ihr Geld um 5.000 STR_2682 :{MEDIUMFONT}{BLACK}Zw. freiem und kostenpfl. Eintritt umsch. STR_2683 :{MEDIUMFONT}{BLACK}Erhöht das Vergnügen der Besucher maximal -STR_2684 :{MEDIUMFONT}{BLACK}Eine große Gruppe von Besuchern tritt ein +STR_2684 :{SMALLFONT}{BLACK}Eine große Gruppe von Besuchern tritt ein STR_2685 :`Simplex Noise' Param. STR_2686 :{WINDOW_COLOUR_2}Niedrig: STR_2687 :{WINDOW_COLOUR_2}Hoch: @@ -3619,7 +3619,7 @@ STR_5282 :RCT1-Ampel Bahn öffnen/schließen STR_5283 :RCT1-Ampel Park öffnen/schließen STR_5284 :RCT1-Schriftart Szenarioauswahl STR_5285 :SPRENGEN!!! -STR_5286 :{MEDIUMFONT}{BLACK}Lässt einige Besucher explodieren +STR_5286 :{SMALLFONT}{BLACK}Lässt einige Besucher explodieren STR_5287 :Bahn ist schon defekt STR_5288 :Bahn ist geschlossen STR_5289 :Für diese Bahn sind keine Defekte verfügbar @@ -3683,3 +3683,18 @@ STR_5346 :Cheats für Parkbesucher STR_5347 :Cheats für Attraktionen STR_5348 :Cheats für Park STR_5349 :{SMALLFONT}{BLACK}Alle Attraktionen +STR_5350 :Max +STR_5351 :Min +STR_5352 :{BLACK}Vergnügen: +STR_5353 :{BLACK}Energie: +STR_5354 :{BLACK}Hunger: +STR_5355 :{BLACK}Durst: +STR_5356 :{BLACK}Übelkeit: +STR_5357 :{BLACK}Übelkeitstoleranz: +STR_5358 :{BLACK}Toilette: +STR_5359 :Besucher entfernen +STR_5360 :{SMALLFONT}{BLACK}Alle Besucher von der Karte entfernen +STR_5361 :{BLACK}Für alle Besucher: +STR_5362 :{BLACK}Bevorz. Intensität: +STR_5363 :> 1 +STR_5364 :< 15 From c3417e12f5682d65e6fb5632d7a52b41f8b6c0ad Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 18 Jun 2015 15:10:53 +0200 Subject: [PATCH 0014/1173] Add cheat for staff speed --- data/language/english_uk.txt | 3 +++ src/localisation/string_ids.h | 3 +++ src/peep/staff.c | 3 ++- src/windows/cheats.c | 35 +++++++++++++++++++++++++++++------ 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 59b30e526e..12cff5e254 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3698,3 +3698,6 @@ STR_5361 :{BLACK}Give all guests: STR_5362 :{BLACK}Preferred intensity: STR_5363 :> 1 STR_5364 :< 15 +STR_5365 :{BLACK}Staff speed: +STR_5366 :Normal +STR_5367 :Fast diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index fdec4392a6..61b076f793 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1509,6 +1509,7 @@ enum { STR_CHEAT_SANDBOX_MODE = 5278, STR_CHEAT_SANDBOX_MODE_DISABLE = 5279, STR_CHEAT_SANDBOX_MODE_TIP = 5280, + STR_CHEAT_STAFF_SPEED = 5365, STR_DEBUG_TIP = 5311, STR_DEBUG_DROPDOWN_CONSOLE = 5312, @@ -1535,6 +1536,8 @@ enum { STR_MAX = 5350, STR_MIN = 5351, + STR_NORMAL = 5366, + STR_FAST = 5367, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/peep/staff.c b/src/peep/staff.c index c1f5979f58..b6cc3233f8 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -236,6 +236,7 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, newPeep->tshirt_colour = colour; newPeep->trousers_colour = colour; + // Staff energy determines their walking speed newPeep->energy = 0x60; newPeep->energy_growth_rate = 0x60; newPeep->var_E2 = 0; @@ -450,4 +451,4 @@ void staff_reset_stats() peep->staff_litter_swept = 0; peep->staff_bins_emptied = 0; } -} \ No newline at end of file +} diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 8d6aa780b4..d13a56aa90 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -94,6 +94,8 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_WIN_SCENARIO, WIDX_UNLOCK_ALL_PRICES, WIDX_SANDBOX_MODE, + WIDX_FAST_STAFF, + WIDX_NORMAL_STAFF, WIDX_RENEW_RIDES = 8, WIDX_REMOVE_SIX_FLAGS, WIDX_MAKE_DESTRUCTIBLE, @@ -207,8 +209,10 @@ static rct_widget window_cheats_misc_widgets[] = { { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(4), HPL(4), STR_CHEAT_FIX_VANDALISM, STR_NONE}, // Fix vandalism { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_CHEAT_REMOVE_LITTER, STR_NONE}, // Remove litter { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(0), HPL(0), STR_CHEAT_WIN_SCENARIO, STR_NONE}, // Win scenario - { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(8),OHPL(8), STR_CHEAT_UNLOCK_PRICES, STR_NONE}, // Unlock all prices + { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(11),OHPL(11), STR_CHEAT_UNLOCK_PRICES, STR_NONE}, // Unlock all prices { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(5), HPL(5), STR_CHEAT_SANDBOX_MODE, STR_CHEAT_SANDBOX_MODE_TIP}, // Sandbox mode (edit land ownership in-game) + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(6), HPL(6), STR_FAST, STR_NONE }, // fast staff + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(6), HPL(6), STR_NORMAL, STR_NONE }, // normal staff { WIDGETS_END }, }; static rct_widget window_cheats_rides_widgets[] = { @@ -217,10 +221,10 @@ static rct_widget window_cheats_rides_widgets[] = { { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(0), HPL(0), STR_CHEAT_REMOVE_FLAGS, STR_NONE}, // Remove flags { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_MAKE_DESTRUCTABLE, STR_NONE}, // Make destructable { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_FIX_ALL_RIDES, STR_NONE }, // Fix all rides - { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(8),OHPL(8) + 8, STR_CHEAT_410_HILL_LIFT, STR_NONE }, // 410 km/h lift hill - { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(6),OHPL(6), STR_CHEAT_DISABLE_BRAKES_FAILURE,STR_NONE }, // Disable brakes failure - { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(7),OHPL(7), STR_CHEAT_DISABLE_BREAKDOWNS, STR_NONE }, // Disable all breakdowns - { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(5),OHPL(5), STR_CHEAT_BUILD_IN_PAUSE_MODE, STR_NONE }, // Build in pause mode + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(11),OHPL(11) + 8,STR_CHEAT_410_HILL_LIFT, STR_NONE }, // 410 km/h lift hill + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(9),OHPL(9), STR_CHEAT_DISABLE_BRAKES_FAILURE,STR_NONE }, // Disable brakes failure + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(10),OHPL(10), STR_CHEAT_DISABLE_BREAKDOWNS, STR_NONE }, // Disable all breakdowns + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(8),OHPL(8), STR_CHEAT_BUILD_IN_PAUSE_MODE, STR_NONE }, // Build in pause mode { WIDGETS_END }, }; @@ -378,7 +382,7 @@ static void* window_cheats_page_events[] = { static uint32 window_cheats_page_enabled_widgets[] = { (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_HIGH_MONEY) | (1 << WIDX_PARK_ENTRANCE_FEE) | (1 << WIDX_CLEAR_LOAN), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_GUEST_HAPPINESS_MAX) | (1 << WIDX_GUEST_HAPPINESS_MIN) | (1 << WIDX_GUEST_ENERGY_MAX) | (1 << WIDX_GUEST_ENERGY_MIN) | (1 << WIDX_GUEST_HUNGER_MAX) | (1 << WIDX_GUEST_HUNGER_MIN) | (1 << WIDX_GUEST_THIRST_MAX) | (1 << WIDX_GUEST_THIRST_MIN) | (1 << WIDX_GUEST_NAUSEA_MAX) | (1 << WIDX_GUEST_NAUSEA_MIN) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1 << WIDX_GUEST_BATHROOM_MAX) | (1 << WIDX_GUEST_BATHROOM_MIN) | (1 << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1 << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1 << WIDX_TRAM_GUESTS) | (1 << WIDX_REMOVE_ALL_GUESTS) | (1 << WIDX_EXPLODE_GUESTS) | (1 << WIDX_GIVE_GUESTS_PARK_MAPS) | (1 << WIDX_GIVE_GUESTS_BALLOONS) | (1 << WIDX_GIVE_GUESTS_UMBRELLAS), - (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) | (1 << WIDX_UNLOCK_ALL_PRICES) | (1 << WIDX_SANDBOX_MODE), + (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) | (1 << WIDX_UNLOCK_ALL_PRICES) | (1 << WIDX_SANDBOX_MODE) | (1 << WIDX_FAST_STAFF) | (1 << WIDX_NORMAL_STAFF), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_RENEW_RIDES) | (1 << WIDX_REMOVE_SIX_FLAGS) | (1 << WIDX_MAKE_DESTRUCTIBLE) | (1 << WIDX_FIX_ALL) | (1 << WIDX_FAST_LIFT_HILL) | (1 << WIDX_DISABLE_BRAKES_FAILURE) | (1 << WIDX_DISABLE_ALL_BREAKDOWNS) | (1 << WIDX_BUILD_IN_PAUSE_MODE) }; @@ -675,7 +679,17 @@ static void cheat_explode_guests() peep->flags |= PEEP_FLAGS_EXPLODE; } } +} +static void cheat_set_staff_speed(uint8 value) +{ + uint16 spriteIndex; + rct_peep *peep; + + FOR_ALL_STAFF(spriteIndex, peep) { + peep->energy = value; + peep->energy_growth_rate = value; + } } #pragma endregion @@ -881,6 +895,12 @@ static void window_cheats_misc_mouseup() window_invalidate_by_class(WC_MAP); window_invalidate_by_class(WC_FOOTPATH); break; + case WIDX_FAST_STAFF: + cheat_set_staff_speed(0xFF); + break; + case WIDX_NORMAL_STAFF: + cheat_set_staff_speed(0x60); + break; } } @@ -1000,6 +1020,9 @@ static void window_cheats_paint() gfx_draw_string_left(dpi, STR_CHEAT_TIP_PAY_ENTRY, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(2) + TXTO); gfx_draw_string_left(dpi, STR_CHEAT_TIP_CLEAR_LOAN, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(4) + TXTO); } + else if(w->page == WINDOW_CHEATS_PAGE_MISC){ + gfx_draw_string_left(dpi, STR_CHEAT_STAFF_SPEED, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(6) + TXTO); + } else if (w->page == WINDOW_CHEATS_PAGE_GUESTS){ gfx_draw_string_left(dpi, STR_CHEAT_GUEST_HAPPINESS, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(0) + TXTO); gfx_draw_string_left(dpi, STR_CHEAT_GUEST_ENERGY, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(1) + TXTO); From 37e80b68f0eaac5e9d4bfb0490fa49b678d52228 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 18 Jun 2015 15:42:09 +0200 Subject: [PATCH 0015/1173] Add cheat to reset crash status --- data/language/english_uk.txt | 1 + src/localisation/string_ids.h | 1 + src/windows/cheats.c | 27 +++++++++++++++++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 12cff5e254..08ffabf12c 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3701,3 +3701,4 @@ STR_5364 :< 15 STR_5365 :{BLACK}Staff speed: STR_5366 :Normal STR_5367 :Fast +STR_5368 :Reset crash status diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 61b076f793..9ae4d8864a 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1510,6 +1510,7 @@ enum { STR_CHEAT_SANDBOX_MODE_DISABLE = 5279, STR_CHEAT_SANDBOX_MODE_TIP = 5280, STR_CHEAT_STAFF_SPEED = 5365, + STR_CHEAT_RESET_CRASH_STATUS = 5368, STR_DEBUG_TIP = 5311, STR_DEBUG_DROPDOWN_CONSOLE = 5312, diff --git a/src/windows/cheats.c b/src/windows/cheats.c index d13a56aa90..c9ebd07c28 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -103,7 +103,8 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_FAST_LIFT_HILL, WIDX_DISABLE_BRAKES_FAILURE, WIDX_DISABLE_ALL_BREAKDOWNS, - WIDX_BUILD_IN_PAUSE_MODE + WIDX_BUILD_IN_PAUSE_MODE, + WIDX_RESET_CRASH_STATUS }; enum { @@ -225,6 +226,7 @@ static rct_widget window_cheats_rides_widgets[] = { { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(9),OHPL(9), STR_CHEAT_DISABLE_BRAKES_FAILURE,STR_NONE }, // Disable brakes failure { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(10),OHPL(10), STR_CHEAT_DISABLE_BREAKDOWNS, STR_NONE }, // Disable all breakdowns { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(8),OHPL(8), STR_CHEAT_BUILD_IN_PAUSE_MODE, STR_NONE }, // Build in pause mode + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_RESET_CRASH_STATUS, STR_NONE }, // Reset crash status { WIDGETS_END }, }; @@ -383,7 +385,7 @@ static uint32 window_cheats_page_enabled_widgets[] = { (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_HIGH_MONEY) | (1 << WIDX_PARK_ENTRANCE_FEE) | (1 << WIDX_CLEAR_LOAN), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_GUEST_HAPPINESS_MAX) | (1 << WIDX_GUEST_HAPPINESS_MIN) | (1 << WIDX_GUEST_ENERGY_MAX) | (1 << WIDX_GUEST_ENERGY_MIN) | (1 << WIDX_GUEST_HUNGER_MAX) | (1 << WIDX_GUEST_HUNGER_MIN) | (1 << WIDX_GUEST_THIRST_MAX) | (1 << WIDX_GUEST_THIRST_MIN) | (1 << WIDX_GUEST_NAUSEA_MAX) | (1 << WIDX_GUEST_NAUSEA_MIN) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1 << WIDX_GUEST_BATHROOM_MAX) | (1 << WIDX_GUEST_BATHROOM_MIN) | (1 << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1 << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1 << WIDX_TRAM_GUESTS) | (1 << WIDX_REMOVE_ALL_GUESTS) | (1 << WIDX_EXPLODE_GUESTS) | (1 << WIDX_GIVE_GUESTS_PARK_MAPS) | (1 << WIDX_GIVE_GUESTS_BALLOONS) | (1 << WIDX_GIVE_GUESTS_UMBRELLAS), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) | (1 << WIDX_UNLOCK_ALL_PRICES) | (1 << WIDX_SANDBOX_MODE) | (1 << WIDX_FAST_STAFF) | (1 << WIDX_NORMAL_STAFF), - (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_RENEW_RIDES) | (1 << WIDX_REMOVE_SIX_FLAGS) | (1 << WIDX_MAKE_DESTRUCTIBLE) | (1 << WIDX_FIX_ALL) | (1 << WIDX_FAST_LIFT_HILL) | (1 << WIDX_DISABLE_BRAKES_FAILURE) | (1 << WIDX_DISABLE_ALL_BREAKDOWNS) | (1 << WIDX_BUILD_IN_PAUSE_MODE) + (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_RENEW_RIDES) | (1 << WIDX_REMOVE_SIX_FLAGS) | (1 << WIDX_MAKE_DESTRUCTIBLE) | (1 << WIDX_FIX_ALL) | (1 << WIDX_FAST_LIFT_HILL) | (1 << WIDX_DISABLE_BRAKES_FAILURE) | (1 << WIDX_DISABLE_ALL_BREAKDOWNS) | (1 << WIDX_BUILD_IN_PAUSE_MODE) | (1 << WIDX_RESET_CRASH_STATUS) }; static rct_string_id window_cheats_page_titles[] = { @@ -541,6 +543,23 @@ static void cheat_make_destructible() { if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE) ride->lifecycle_flags&=~RIDE_LIFECYCLE_INDESTRUCTIBLE; + if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) + ride->lifecycle_flags&=~RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK; + } + window_invalidate_by_class(WC_RIDE); +} + +static void cheat_reset_crash_status() +{ + int i; + rct_ride *ride; + + FOR_ALL_RIDES(i, ride){ + //reset crash status + if (ride->lifecycle_flags & RIDE_LIFECYCLE_CRASHED) + ride->lifecycle_flags&=~RIDE_LIFECYCLE_CRASHED; + //reset crash history + ride->last_crash_type=RIDE_CRASH_TYPE_NONE; } window_invalidate_by_class(WC_RIDE); } @@ -952,6 +971,10 @@ static void window_cheats_rides_mouseup() gConfigCheat.build_in_pause_mode ^= 1; config_save_default(); window_invalidate(w); + break; + case WIDX_RESET_CRASH_STATUS: + cheat_reset_crash_status(); + break; } } From 2dc03cd45a2290b1c590bc00212613e80ee00504 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 18 Jun 2015 22:20:49 +0100 Subject: [PATCH 0016/1173] refactor research window / extract common code --- src/interface/window.h | 4 ++ src/windows/finances.c | 4 +- src/windows/new_ride.c | 85 +++--------------------------------------- src/windows/research.c | 50 +++++++++++++++---------- 4 files changed, 41 insertions(+), 102 deletions(-) diff --git a/src/interface/window.h b/src/interface/window.h index 6196f8fb67..30527bda51 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -569,7 +569,11 @@ void window_banner_open(rct_windownumber number); void window_sign_open(rct_windownumber number); void window_sign_small_open(rct_windownumber number); void window_cheats_open(); + void window_research_open(); +void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dpi, int baseWidgetIndex); +void window_research_funding_page_paint(rct_window *w, rct_drawpixelinfo *dpi, int baseWidgetIndex); + void window_scenery_open(); void window_music_credits_open(); void window_publisher_credits_open(); diff --git a/src/windows/finances.c b/src/windows/finances.c index 17fc47d1e9..92eaee00ab 100644 --- a/src/windows/finances.c +++ b/src/windows/finances.c @@ -1484,9 +1484,7 @@ static void window_finances_research_paint() window_draw_widgets(w, dpi); window_finances_draw_tab_images(dpi, w); - int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8); - money32 currentResearchCostPerWeek = research_cost_table[currentResearchLevel]; - gfx_draw_string_left(dpi, STR_RESEARCH_COST_PER_MONTH, ¤tResearchCostPerWeek, 0, w->x + 10, w->y + 77); + window_research_funding_page_paint(w, dpi, WIDX_RESEARCH_FUNDING); } #pragma endregion diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index 99518a8d95..d824194c14 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -164,6 +164,7 @@ enum { WIDX_TAB_6, WIDX_TAB_7, WIDX_RIDE_LIST, + WIDX_CURRENTLY_IN_DEVELOPMENT_GROUP, WIDX_LAST_DEVELOPMENT_GROUP, WIDX_LAST_DEVELOPMENT_BUTTON, @@ -748,86 +749,10 @@ static void window_new_ride_paint() if (_window_new_ride_current_tab != WINDOW_NEW_RIDE_PAGE_RESEARCH) { ride_list_item item = *((ride_list_item*)&w->new_ride.highlighted_ride_id); - if (item.type == 255 && item.entry_index == 255) - return; - - window_new_ride_paint_ride_information(w, dpi, item, w->x + 3, w->y + w->height - 52, w->width - 6); - return; - } - - int x = w->x + 10; - int y = w->y + window_new_ride_widgets[WIDX_CURRENTLY_IN_DEVELOPMENT_GROUP].top + 12; - rct_string_id stringId; - - if (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) == RESEARCH_STAGE_FINISHED_ALL){ - stringId = STR_RESEARCH_UNKNOWN; - gfx_draw_string_left_wrapped(dpi, &stringId, x, y, 296, STR_RESEARCH_TYPE_LABEL, 0); - y += 25; - // Progress - stringId = 2680; - gfx_draw_string_left_wrapped(dpi, &stringId, x, y, 296, STR_RESEARCH_PROGRESS_LABEL, 0); - y += 15; - - RCT2_GLOBAL(0x013CE952, uint16) = STR_UNKNOWN; - gfx_draw_string_left(dpi, STR_RESEARCH_EXPECTED_LABEL, (void*)0x013CE952, 0, x, y); - } - else{ - // Research type - stringId = STR_RESEARCH_UNKNOWN; - if (RCT2_GLOBAL(0x01357CF3, uint8) != 0) { - stringId = STR_TRANSPORT_RIDE + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_CATEGORY, uint8); - if (RCT2_GLOBAL(0x01357CF3, uint8) != 1) { - uint32 typeId = RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_ITEM, uint32); - if (typeId >= 0x10000) { - rct_ride_type *rideEntry = RCT2_GLOBAL(0x009ACFA4 + (typeId & 0xFF) * 4, rct_ride_type*); - stringId = rideEntry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME ? - rideEntry->name : - (typeId & 0xFF00) + 2; - } - else { - stringId = g_scenerySetEntries[typeId]->name; - } - } - } - gfx_draw_string_left_wrapped(dpi, &stringId, x, y, 296, STR_RESEARCH_TYPE_LABEL, 0); - y += 25; - - // Progress - stringId = 2285 + RCT2_GLOBAL(0x01357CF3, uint8); - gfx_draw_string_left_wrapped(dpi, &stringId, x, y, 296, STR_RESEARCH_PROGRESS_LABEL, 0); - y += 15; - - // Expected - RCT2_GLOBAL(0x013CE952, uint16) = STR_UNKNOWN; - if (RCT2_GLOBAL(0x01357CF3, uint8) != 0) { - uint16 expectedDay = RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_DAY, uint8); - if (expectedDay != 255) { - RCT2_GLOBAL(0x013CE952 + 2, uint16) = STR_DATE_DAY_1 + expectedDay; - RCT2_GLOBAL(0x013CE952 + 4, uint16) = STR_MONTH_MARCH + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_MONTH, uint8); - RCT2_GLOBAL(0x013CE952, uint16) = 2289; - } - } - gfx_draw_string_left(dpi, STR_RESEARCH_EXPECTED_LABEL, (void*)0x013CE952, 0, x, y); - } - // Last development - x = w->x + 10; - y = w->y + window_new_ride_widgets[WIDX_LAST_DEVELOPMENT_GROUP].top + 12; - - uint32 typeId = RCT2_GLOBAL(RCT2_ADDRESS_LAST_RESEARCHED_ITEM_SUBJECT, uint32); - int lastDevelopmentFormat; - if (typeId != 0xFFFFFFFF) { - if (typeId >= 0x10000) { - rct_ride_type *rideEntry = RCT2_GLOBAL(0x009ACFA4 + (typeId & 0xFF) * 4, rct_ride_type*); - stringId = rideEntry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME ? - rideEntry->name : - ((typeId >> 8) & 0xFF) + 2; - - lastDevelopmentFormat = STR_RESEARCH_RIDE_LABEL; - } else { - stringId = g_scenerySetEntries[typeId]->name; - lastDevelopmentFormat = STR_RESEARCH_SCENERY_LABEL; - } - gfx_draw_string_left_wrapped(dpi, &stringId, x, y, 266, lastDevelopmentFormat, 0); + if (item.type != 255 || item.entry_index != 255) + window_new_ride_paint_ride_information(w, dpi, item, w->x + 3, w->y + w->height - 52, w->width - 6); + } else { + window_research_development_page_paint(w, dpi, WIDX_CURRENTLY_IN_DEVELOPMENT_GROUP); } } diff --git a/src/windows/research.c b/src/windows/research.c index 32c5792a6f..2d6cdfdb81 100644 --- a/src/windows/research.c +++ b/src/windows/research.c @@ -327,21 +327,28 @@ static void window_research_development_paint() { rct_window *w; rct_drawpixelinfo *dpi; - int x, y; - rct_string_id stringId; window_paint_get_registers(w, dpi); window_draw_widgets(w, dpi); window_research_draw_tab_images(dpi, w); - x = w->x + 10; - y = w->y + window_research_development_widgets[WIDX_CURRENTLY_IN_DEVELOPMENT_GROUP].top + 12; + window_research_development_page_paint(w, dpi, WIDX_CURRENTLY_IN_DEVELOPMENT_GROUP); +} - if (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) == RESEARCH_STAGE_FINISHED_ALL){ +void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dpi, int baseWidgetIndex) +{ + baseWidgetIndex = baseWidgetIndex - WIDX_CURRENTLY_IN_DEVELOPMENT_GROUP; + + int x = w->x + 10; + int y = w->y + w->widgets[WIDX_CURRENTLY_IN_DEVELOPMENT_GROUP + baseWidgetIndex].top + 12; + rct_string_id stringId; + + if (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) == RESEARCH_STAGE_FINISHED_ALL) { stringId = STR_RESEARCH_UNKNOWN; gfx_draw_string_left_wrapped(dpi, &stringId, x, y, 296, STR_RESEARCH_TYPE_LABEL, 0); y += 25; + // Progress stringId = 2680; gfx_draw_string_left_wrapped(dpi, &stringId, x, y, 296, STR_RESEARCH_PROGRESS_LABEL, 0); @@ -349,21 +356,19 @@ static void window_research_development_paint() RCT2_GLOBAL(0x013CE952, uint16) = STR_UNKNOWN; gfx_draw_string_left(dpi, STR_RESEARCH_EXPECTED_LABEL, (void*)0x013CE952, 0, x, y); - } - else{ + } else { // Research type stringId = STR_RESEARCH_UNKNOWN; - if (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) != 0) { + if (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) != RESEARCH_STAGE_INITIAL_RESEARCH) { stringId = STR_TRANSPORT_RIDE + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_CATEGORY, uint8); - if (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) != 1) { + if (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) != RESEARCH_STAGE_DESIGNING) { uint32 typeId = RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_ITEM, uint32); if (typeId >= 0x10000) { rct_ride_type *rideEntry = RCT2_GLOBAL(0x009ACFA4 + (typeId & 0xFF) * 4, rct_ride_type*); stringId = rideEntry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME ? rideEntry->name : - ((typeId >> 8) & 0xFF) + 2; - } - else { + (typeId & 0xFF00) + 2; + } else { stringId = g_scenerySetEntries[typeId]->name; } } @@ -381,16 +386,17 @@ static void window_research_development_paint() if (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) != 0) { uint16 expectedDay = RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_DAY, uint8); if (expectedDay != 255) { + RCT2_GLOBAL(0x013CE952, uint16) = 2289; RCT2_GLOBAL(0x013CE952 + 2, uint16) = STR_DATE_DAY_1 + expectedDay; RCT2_GLOBAL(0x013CE952 + 4, uint16) = STR_MONTH_MARCH + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_MONTH, uint8); - RCT2_GLOBAL(0x013CE952, uint16) = 2289; } } gfx_draw_string_left(dpi, STR_RESEARCH_EXPECTED_LABEL, (void*)0x013CE952, 0, x, y); } + // Last development x = w->x + 10; - y = w->y + window_research_development_widgets[WIDX_LAST_DEVELOPMENT_GROUP].top + 12; + y = w->y + w->widgets[WIDX_LAST_DEVELOPMENT_GROUP + baseWidgetIndex].top + 12; uint32 typeId = RCT2_GLOBAL(RCT2_ADDRESS_LAST_RESEARCHED_ITEM_SUBJECT, uint32); int lastDevelopmentFormat; @@ -581,11 +587,17 @@ static void window_research_funding_paint() window_draw_widgets(w, dpi); window_research_draw_tab_images(dpi, w); - if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { - int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8); - money32 currentResearchCostPerWeek = research_cost_table[currentResearchLevel]; - gfx_draw_string_left(dpi, STR_RESEARCH_COST_PER_MONTH, ¤tResearchCostPerWeek, 0, w->x + 10, w->y + 77); - } + window_research_funding_page_paint(w, dpi, WIDX_RESEARCH_FUNDING); +} + +void window_research_funding_page_paint(rct_window *w, rct_drawpixelinfo *dpi, int baseWidgetIndex) +{ + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) + return; + + int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8); + money32 currentResearchCostPerWeek = research_cost_table[currentResearchLevel]; + gfx_draw_string_left(dpi, STR_RESEARCH_COST_PER_MONTH, ¤tResearchCostPerWeek, 0, w->x + 10, w->y + 77); } #pragma endregion From ef3d7c2080fced15b601c545a5090cdba1d6d9ce Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 19 Jun 2015 04:00:15 +0100 Subject: [PATCH 0017/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 25 ++++++++++++++++++++++--- data/language/english_us.txt | 23 +++++++++++++++++++++-- data/language/german.txt | 4 ++++ 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index ed35caf694..12496041f2 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -2682,7 +2682,7 @@ STR_2680 :Alle onderzoeken zijn voltooid STR_2681 :{MEDIUMFONT}{BLACK}Krijg 5.000 extra geld STR_2682 :{MEDIUMFONT}{BLACK}Wissel tussen betaalde en gratis entree STR_2683 :{MEDIUMFONT}{BLACK}Alle bezoekers hebben een maximale tevredenheid -STR_2684 :{MEDIUMFONT}{BLACK}Er arriveert een grote groep bezoekers +STR_2684 :{SMALLFONT}{BLACK}Er arriveert een grote groep bezoekers STR_2685 :Parameters voor Simplex noise STR_2686 :Minimum: STR_2687 :Maximum: @@ -2754,7 +2754,7 @@ STR_2752 :Onkruid weg STR_2753 :Gras maaien STR_2754 :Bloemen water geven STR_2755 :Vandalisme repareren -STR_2756 :Afval op paden weghalen +STR_2756 :Afval verwijderen STR_2757 :Mooi weer STR_2758 :Regen STR_2759 :Hoogtes op nul @@ -3615,7 +3615,7 @@ STR_5282 :Attracties openen/sluiten via RCT1-stoplichten STR_5283 :Park openen/sluiten via RCT1-stoplichten STR_5284 :Scenarioselectie-lettertype in RCT1-stijl STR_5285 :KABOEM! -STR_5286 :{MEDIUMFONT}{BLACK}Laat sommige gasten exploderen +STR_5286 :{SMALLFONT}{BLACK}Laat sommige gasten exploderen STR_5287 :Attractie is al defect STR_5288 :Attractie is gesloten STR_5289 :Deze attractie kan niet defect raken @@ -3679,3 +3679,22 @@ STR_5346 :Cheats voor bezoekers STR_5347 :Cheats voor attracties STR_5348 :Cheats voor het park STR_5349 :{SMALLFONT}{BLACK}Alle attracties +STR_5350 :Max +STR_5351 :Min +STR_5352 :{BLACK}Stemming: +STR_5353 :{BLACK}Energie: +STR_5354 :{BLACK}Honger: +STR_5355 :{BLACK}Dorst: +STR_5356 :{BLACK}Misselijkh.: +STR_5357 :{BLACK}Misselijkheidstol.: +STR_5358 :{BLACK}WC: +STR_5359 :Bez. verwijderen +STR_5360 :{SMALLFONT}{BLACK}Verwijdert alle bezoekers van de kaart +STR_5361 :{BLACK}Geef alle bez.: +STR_5362 :{BLACK}Voorkeursintensiteit: +STR_5363 :> 1 +STR_5364 :< 15 +STR_5365 :{BLACK}Snelheid werknemers: +STR_5366 :Normaal +STR_5367 :Snel +STR_5368 :Crashstatus weg diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 8585336194..3569127842 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -2686,7 +2686,7 @@ STR_2680 :All research complete STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max -STR_2684 :{MEDIUMFONT}{BLACK}Large group of peeps arrive +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive STR_2685 :Simplex Noise Parameters STR_2686 :{WINDOW_COLOUR_2}Low: STR_2687 :{WINDOW_COLOUR_2}High: @@ -3624,7 +3624,7 @@ STR_5282 :RCT1 Ride Open/Close Lights STR_5283 :RCT1 Park Open/Close Lights STR_5284 :RCT1 Scenario Selection Font STR_5285 :EXPLODE!!! -STR_5286 :{MEDIUMFONT}{BLACK}Makes some guests explode +STR_5286 :{SMALLFONT}{BLACK}Makes some guests explode STR_5287 :Ride is already broken down STR_5288 :Ride is closed STR_5289 :No breakdowns available for this ride @@ -3688,3 +3688,22 @@ STR_5346 :Guest cheats STR_5347 :Ride cheats STR_5348 :Park cheats STR_5349 :{SMALLFONT}{BLACK}All Rides +STR_5350 :Max +STR_5351 :Min +STR_5352 :{BLACK}Happiness: +STR_5353 :{BLACK}Energy: +STR_5354 :{BLACK}Hunger: +STR_5355 :{BLACK}Thirst: +STR_5356 :{BLACK}Nausea: +STR_5357 :{BLACK}Nausea tolerance: +STR_5358 :{BLACK}Bathroom: +STR_5359 :Remove guests +STR_5360 :{SMALLFONT}{BLACK}Removes all guests from the map +STR_5361 :{BLACK}Give all guests: +STR_5362 :{BLACK}Preferred intensity: +STR_5363 :> 1 +STR_5364 :< 15 +STR_5365 :{BLACK}Staff speed: +STR_5366 :Normal +STR_5367 :Fast +STR_5368 :Reset crash status diff --git a/data/language/german.txt b/data/language/german.txt index 28e928c0b1..f6561277c7 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3698,3 +3698,7 @@ STR_5361 :{BLACK}Für alle Besucher: STR_5362 :{BLACK}Bevorz. Intensität: STR_5363 :> 1 STR_5364 :< 15 +STR_5365 :{BLACK}Personalgeschw.: +STR_5366 :Normal +STR_5367 :Schnell +STR_5368 :Unfallstatus entf. From 0491d971f3ad79e6327b3fc14d8180241ca5a107 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 19 Jun 2015 14:59:48 +0200 Subject: [PATCH 0018/1173] Add cheat to edit park parameters/scenario options in-game --- data/language/english_uk.txt | 16 +++++++++------- src/interface/console.c | 4 +++- src/localisation/string_ids.h | 9 ++------- src/windows/cheats.c | 21 +++++++-------------- src/windows/editor_scenario_options.c | 24 ++++++++++++++++++++---- 5 files changed, 41 insertions(+), 33 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 08ffabf12c..0faa5a9dad 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2684,8 +2684,8 @@ STR_2678 :??? STR_2679 :??? STR_2680 :All research complete STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 -STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry -STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max +STR_2682 : +STR_2683 : STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive STR_2685 :Simplex Noise Parameters STR_2686 :{WINDOW_COLOUR_2}Low: @@ -2764,10 +2764,10 @@ STR_2757 :Force Sun STR_2758 :Force Thunder STR_2759 :Zero Clearance STR_2760 :+5K Money -STR_2761 :Pay For Entrance -STR_2762 :Pay For Rides +STR_2761 : +STR_2762 : STR_2763 :??? -STR_2764 :Happy Guests +STR_2764 : STR_2765 :Large Tram STR_2766 :Win scenario STR_2767 :Freeze Climate @@ -3587,8 +3587,8 @@ STR_5250 :Title Exit Button STR_5251 :Title Options Button STR_5252 :Title Scenario Selection STR_5253 :Park Information -STR_5254 :Add nausea -STR_5255 :{MEDIUMFONT}{BLACK}All peeps become nauseous +STR_5254 : +STR_5255 : STR_5256 :Create a new theme to make changes to STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one STR_5258 :{SMALLFONT}{BLACK}Delete the current theme @@ -3702,3 +3702,5 @@ STR_5365 :{BLACK}Staff speed: STR_5366 :Normal STR_5367 :Fast STR_5368 :Reset crash status +STR_5369 :Park parameters... +STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. diff --git a/src/interface/console.c b/src/interface/console.c index c307f91643..24483e26fa 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -817,6 +817,8 @@ static int cc_open(const char **argv, int argc) { window_editor_object_selection_open(); } else if (strcmp(argv[0], "inventions_list") == 0) { window_editor_inventions_list_open(); + } else if (strcmp(argv[0], "scenario_options") == 0) { + window_editor_scenario_options_open(); } else if (strcmp(argv[0], "options") == 0) { window_options_open(); } else if (strcmp(argv[0], "themes") == 0) { @@ -999,4 +1001,4 @@ void console_execute_silent(const char *src) char output[] = { FORMAT_RED, "Unknown command. Type help to list available commands." }; console_writeline(output); } -} \ No newline at end of file +} diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 9ae4d8864a..199cea90fd 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -999,14 +999,10 @@ enum { // Money STR_CHEAT_5K_MONEY = 2760, - STR_CHEAT_PAY_ENTRANCE = 2761, STR_CHEAT_CLEAR_LOAN = 5302, - STR_CHEAT_PAY_RIDES = 2762, // Guests - //STR_CHEAT_HAPPY_GUESTS = 2764, STR_CHEAT_LARGE_TRAM_GUESTS = 2765, - //STR_CHEAT_NAUSEA = 5254, STR_CHEAT_EXPLODE = 5285, STR_CHEAT_REMOVE_ALL_GUESTS = 5359, STR_CHEAT_GUEST_HAPPINESS = 5352, @@ -1037,6 +1033,7 @@ enum { STR_CHEAT_WIN_SCENARIO = 2766, STR_CHEAT_UNLOCK_PRICES = 5157, STR_CHEAT_BUILD_IN_PAUSE_MODE = 5303, + STR_CHEAT_PARK_PARAMETERS = 5369, // Rides STR_CHEAT_RENEW_RIDES = 5123, @@ -1049,13 +1046,11 @@ enum { // Cheat tips STR_CHEAT_TIP_5K_MONEY = 2681, - STR_CHEAT_TIP_PAY_ENTRY = 2682, STR_CHEAT_TIP_CLEAR_LOAN = 5301, - //STR_CHEAT_TIP_HAPPY_GUESTS = 2683, STR_CHEAT_TIP_LARGE_TRAM_GUESTS = 2684, - //STR_CHEAT_TIP_NAUSEA = 5255, STR_CHEAT_TIP_EXPLODE = 5286, STR_CHEAT_TIP_REMOVE_ALL_GUESTS = 5360, + STR_CHEAT_TIP_PARK_PARAMETERS = 5370, // Cheat tab tips STR_FINANCIAL_CHEATS_TIP = 5178, diff --git a/src/windows/cheats.c b/src/windows/cheats.c index c9ebd07c28..205d4a6a7c 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -57,7 +57,6 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_TAB_3, WIDX_TAB_4, WIDX_HIGH_MONEY, - WIDX_PARK_ENTRANCE_FEE, WIDX_CLEAR_LOAN, WIDX_GUEST_HAPPINESS_MAX = 8, //Same as HIGH_MONEY as it is also the 8th widget but on a different page WIDX_GUEST_HAPPINESS_MIN, @@ -96,6 +95,7 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_SANDBOX_MODE, WIDX_FAST_STAFF, WIDX_NORMAL_STAFF, + WIDX_PARK_PARAMETERS, WIDX_RENEW_RIDES = 8, WIDX_REMOVE_SIX_FLAGS, WIDX_MAKE_DESTRUCTIBLE, @@ -164,7 +164,6 @@ enum { static rct_widget window_cheats_money_widgets[] = { MAIN_CHEATS_WIDGETS, { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_5K_MONEY, STR_NONE}, // high money - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(3), HPL(3), STR_CHEAT_PAY_ENTRANCE, STR_NONE}, // Park Entrance Fee Toggle { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_CHEAT_CLEAR_LOAN, STR_NONE }, // Clear loan { WIDGETS_END }, }; @@ -214,6 +213,7 @@ static rct_widget window_cheats_misc_widgets[] = { { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(5), HPL(5), STR_CHEAT_SANDBOX_MODE, STR_CHEAT_SANDBOX_MODE_TIP}, // Sandbox mode (edit land ownership in-game) { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(6), HPL(6), STR_FAST, STR_NONE }, // fast staff { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(6), HPL(6), STR_NORMAL, STR_NONE }, // normal staff + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(7), HPL(7), STR_CHEAT_PARK_PARAMETERS, STR_CHEAT_TIP_PARK_PARAMETERS}, // Park parameters { WIDGETS_END }, }; static rct_widget window_cheats_rides_widgets[] = { @@ -382,9 +382,9 @@ static void* window_cheats_page_events[] = { }; static uint32 window_cheats_page_enabled_widgets[] = { - (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_HIGH_MONEY) | (1 << WIDX_PARK_ENTRANCE_FEE) | (1 << WIDX_CLEAR_LOAN), + (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_HIGH_MONEY) | (1 << WIDX_CLEAR_LOAN), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_GUEST_HAPPINESS_MAX) | (1 << WIDX_GUEST_HAPPINESS_MIN) | (1 << WIDX_GUEST_ENERGY_MAX) | (1 << WIDX_GUEST_ENERGY_MIN) | (1 << WIDX_GUEST_HUNGER_MAX) | (1 << WIDX_GUEST_HUNGER_MIN) | (1 << WIDX_GUEST_THIRST_MAX) | (1 << WIDX_GUEST_THIRST_MIN) | (1 << WIDX_GUEST_NAUSEA_MAX) | (1 << WIDX_GUEST_NAUSEA_MIN) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1 << WIDX_GUEST_BATHROOM_MAX) | (1 << WIDX_GUEST_BATHROOM_MIN) | (1 << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1 << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1 << WIDX_TRAM_GUESTS) | (1 << WIDX_REMOVE_ALL_GUESTS) | (1 << WIDX_EXPLODE_GUESTS) | (1 << WIDX_GIVE_GUESTS_PARK_MAPS) | (1 << WIDX_GIVE_GUESTS_BALLOONS) | (1 << WIDX_GIVE_GUESTS_UMBRELLAS), - (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) | (1 << WIDX_UNLOCK_ALL_PRICES) | (1 << WIDX_SANDBOX_MODE) | (1 << WIDX_FAST_STAFF) | (1 << WIDX_NORMAL_STAFF), + (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) | (1 << WIDX_UNLOCK_ALL_PRICES) | (1 << WIDX_SANDBOX_MODE) | (1 << WIDX_FAST_STAFF) | (1 << WIDX_NORMAL_STAFF) | (1 << WIDX_PARK_PARAMETERS), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_RENEW_RIDES) | (1 << WIDX_REMOVE_SIX_FLAGS) | (1 << WIDX_MAKE_DESTRUCTIBLE) | (1 << WIDX_FIX_ALL) | (1 << WIDX_FAST_LIFT_HILL) | (1 << WIDX_DISABLE_BRAKES_FAILURE) | (1 << WIDX_DISABLE_ALL_BREAKDOWNS) | (1 << WIDX_BUILD_IN_PAUSE_MODE) | (1 << WIDX_RESET_CRASH_STATUS) }; @@ -752,11 +752,6 @@ static void window_cheats_money_mouseup() case WIDX_CLEAR_LOAN: cheat_clear_loan(); break; - case WIDX_PARK_ENTRANCE_FEE: - RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) ^= PARK_FLAGS_PARK_FREE_ENTRY; - window_invalidate_by_class(WC_PARK_INFORMATION); - window_invalidate_by_class(WC_RIDE); - break; } } @@ -920,6 +915,9 @@ static void window_cheats_misc_mouseup() case WIDX_NORMAL_STAFF: cheat_set_staff_speed(0x60); break; + case WIDX_PARK_PARAMETERS: + window_editor_scenario_options_open(); + break; } } @@ -1001,10 +999,6 @@ static void window_cheats_invalidate() w->pressed_widgets = 0; switch (w->page) { - case WINDOW_CHEATS_PAGE_MONEY: - w->widgets[WIDX_PARK_ENTRANCE_FEE].image = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY ? - STR_CHEAT_PAY_ENTRANCE : STR_CHEAT_PAY_RIDES; - break; case WINDOW_CHEATS_PAGE_MISC: w->widgets[WIDX_OPEN_CLOSE_PARK].image = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_OPEN ? STR_CHEAT_CLOSE_PARK : STR_CHEAT_OPEN_PARK; @@ -1040,7 +1034,6 @@ static void window_cheats_paint() if (w->page == WINDOW_CHEATS_PAGE_MONEY){ gfx_draw_string_left(dpi, STR_CHEAT_TIP_5K_MONEY, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(0) + TXTO); - gfx_draw_string_left(dpi, STR_CHEAT_TIP_PAY_ENTRY, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(2) + TXTO); gfx_draw_string_left(dpi, STR_CHEAT_TIP_CLEAR_LOAN, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(4) + TXTO); } else if(w->page == WINDOW_CHEATS_PAGE_MISC){ diff --git a/src/windows/editor_scenario_options.c b/src/windows/editor_scenario_options.c index 1dea670bd6..89bcb1d704 100644 --- a/src/windows/editor_scenario_options.c +++ b/src/windows/editor_scenario_options.c @@ -451,7 +451,18 @@ static void window_editor_scenario_options_financial_mouseup() window_editor_scenario_options_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_NO_MONEY: - RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) ^= PARK_FLAGS_NO_MONEY_SCENARIO; + if(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) { + RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) ^= PARK_FLAGS_NO_MONEY_SCENARIO; + } + else { + RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) ^= PARK_FLAGS_NO_MONEY; + // Invalidate all windows that have anything to do with finance + window_invalidate_by_class(WC_RIDE); + window_invalidate_by_class(WC_PEEP); + window_invalidate_by_class(WC_PARK_INFORMATION); + window_invalidate_by_class(WC_FINANCES); + window_invalidate_by_class(WC_BOTTOM_TOOLBAR); + } window_invalidate(w); break; case WIDX_FORBID_MARKETING: @@ -482,7 +493,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, { switch (widgetIndex) { case WIDX_INITIAL_CASH_INCREASE: - if (RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) < MONEY(10000,00)) { + if (RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) < MONEY(1000000,00)) { RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) += MONEY(500,00); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32) = ENCRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32)); sub_69E869(); @@ -546,7 +557,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, window_invalidate(w); break; case WIDX_INTEREST_RATE_DECREASE: - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_INTEREST_RATE, money32) > 5) { + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_INTEREST_RATE, money32) >= 0) { RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_INTEREST_RATE, money32)--; } else { window_error_open(3255, STR_NONE); @@ -554,6 +565,11 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, window_invalidate(w); break; } + + if(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_PLAYING) { + window_invalidate_by_class(WC_FINANCES); + window_invalidate_by_class(WC_BOTTOM_TOOLBAR); + } } /** @@ -732,7 +748,7 @@ static void window_editor_scenario_options_guests_mousedown(int widgetIndex, rct { switch (widgetIndex) { case WIDX_CASH_PER_GUEST_INCREASE: - if (RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_CASH, money16) < MONEY(100, 00)) { + if (RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_CASH, money16) < MONEY(1000, 00)) { RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_CASH, money16) += MONEY(1, 00); } else { window_error_open(3264, STR_NONE); From e546e5038e6eff94efbedb34c62491e2e2abb35e Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 19 Jun 2015 16:02:54 +0200 Subject: [PATCH 0019/1173] Make the park parameters dialog behave and invalidate better in-game. --- src/windows/editor_scenario_options.c | 36 +++++++++++++++++++-------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/windows/editor_scenario_options.c b/src/windows/editor_scenario_options.c index 89bcb1d704..f505aca17a 100644 --- a/src/windows/editor_scenario_options.c +++ b/src/windows/editor_scenario_options.c @@ -1087,19 +1087,33 @@ static void window_editor_scenario_options_park_dropdown() window_dropdown_get_registers(w, widgetIndex, dropdownIndex); if (widgetIndex == WIDX_PAY_FOR_PARK_OR_RIDES_DROPDOWN && dropdownIndex != -1) { - if (dropdownIndex == 0) { - if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY)) { - RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) |= PARK_FLAGS_PARK_FREE_ENTRY; - RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, money16) = MONEY(0, 00); - window_invalidate(w); - } - } else { - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) { - RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_PARK_FREE_ENTRY; - RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, money16) = MONEY(10, 00); - window_invalidate(w); + if(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) { + if (dropdownIndex == 0) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY)) { + RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) |= PARK_FLAGS_PARK_FREE_ENTRY; + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, money16) = MONEY(0, 00); + } + } else { + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) { + RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_PARK_FREE_ENTRY; + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, money16) = MONEY(10, 00); + } } } + else { + if (dropdownIndex == 0) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY)) { + RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) |= PARK_FLAGS_PARK_FREE_ENTRY; + } + } else { + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) { + RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_PARK_FREE_ENTRY; + } + } + window_invalidate_by_class(WC_PARK_INFORMATION); + window_invalidate_by_class(WC_RIDE); + } + window_invalidate(w); } } From 5127e6509552340fb9d476a6af8e7c311134d602 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Fri, 19 Jun 2015 10:51:54 -0400 Subject: [PATCH 0020/1173] Console can be used on title screen --- src/input.c | 34 ++++++--- src/interface/console.c | 165 ++++++++++++++++++++++++---------------- 2 files changed, 122 insertions(+), 77 deletions(-) diff --git a/src/input.c b/src/input.c index dce56db016..a1cb6e67c2 100644 --- a/src/input.c +++ b/src/input.c @@ -1243,21 +1243,35 @@ void title_handle_keyboard_input() { rct_window *w; int key; - - // Handle modifier keys and key scrolling - RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) = 0; - if (RCT2_GLOBAL(0x009E2B64, uint32) != 1) { - if (gKeysState[SDL_SCANCODE_LSHIFT] || gKeysState[SDL_SCANCODE_RSHIFT]) - RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) |= 1; - if (gKeysState[SDL_SCANCODE_LCTRL] || gKeysState[SDL_SCANCODE_RCTRL]) - RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) |= 2; - if (gKeysState[SDL_SCANCODE_LALT] || gKeysState[SDL_SCANCODE_RALT]) - RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) |= 4; + + if (!gConsoleOpen) { + // Handle modifier keys and key scrolling + RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) = 0; + if (RCT2_GLOBAL(0x009E2B64, uint32) != 1) { + if (gKeysState[SDL_SCANCODE_LSHIFT] || gKeysState[SDL_SCANCODE_RSHIFT]) + RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) |= 1; + if (gKeysState[SDL_SCANCODE_LCTRL] || gKeysState[SDL_SCANCODE_RCTRL]) + RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) |= 2; + if (gKeysState[SDL_SCANCODE_LALT] || gKeysState[SDL_SCANCODE_RALT]) + RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) |= 4; + } } while ((key = get_next_key()) != 0) { if (key == 255) continue; + + // Reserve backtick for console + if (key == SDL_SCANCODE_GRAVE) { + if (gConfigGeneral.debugging_tools || gConsoleOpen) { + window_cancel_textbox(); + console_toggle(); + } + continue; + } else if (gConsoleOpen) { + console_input(key); + continue; + } key |= RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) << 8; diff --git a/src/interface/console.c b/src/interface/console.c index c307f91643..36cd492bc0 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -56,6 +56,8 @@ static int cc_variables(const char **argv, int argc); static int cc_windows(const char **argv, int argc); static int cc_help(const char **argv, int argc); +static bool invalidArguments(bool *invalid, bool arguments); + #define SET_FLAG(variable, flag, value) {if (value) variable |= flag; else variable &= ~flag;} void console_open() @@ -533,134 +535,147 @@ static int cc_get(const char **argv, int argc) } static int cc_set(const char **argv, int argc) { + int i; if (argc > 1) { - bool int_valid = true, double_valid = true; - bool int_valid2 = true, double_valid2 = true; + int int_val[4]; + bool int_valid[4]; + double double_val[4]; + bool double_valid[4]; + bool invalidArgs = false; - int int_val = console_parse_int(argv[1], &int_valid); - double double_val = console_parse_double(argv[1], &double_valid); - int int_val2 = console_parse_int(argv[2], &int_valid2); - double double_val2 = console_parse_double(argv[2], &double_valid2); + for (i = 0; i < 4; i++) { + if (i + 1 < argc) { + int_val[i] = console_parse_int(argv[i + 1], &int_valid[i]); + double_val[i] = console_parse_double(argv[i + 1], &double_valid[i]); + } + else { + int_val[i] = 0; int_valid[i] = false; + double_val[i] = 0; double_valid[i] = false; + } + } - if (strcmp(argv[0], "money") == 0 && double_valid) { - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32) = ENCRYPT_MONEY(MONEY((int)double_val, ((int)(double_val * 100)) % 100)); + if (strcmp(argv[0], "money") == 0 && invalidArguments(&invalidArgs, double_valid[0])) { + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32) = ENCRYPT_MONEY(MONEY((int)double_val[0], ((int)(double_val[0] * 100)) % 100)); console_execute_silent("get money"); } - else if (strcmp(argv[0], "current_loan") == 0 && int_valid) { - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = clamp(MONEY(int_val - (int_val % 1000), 0), MONEY(0, 0), RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32)); + else if (strcmp(argv[0], "current_loan") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = clamp(MONEY(int_val[0] - (int_val[0] % 1000), 0), MONEY(0, 0), RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32)); console_execute_silent("get current_loan"); } - else if (strcmp(argv[0], "max_loan") == 0 && int_valid) { - RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) = clamp(MONEY(int_val - (int_val % 1000), 0), MONEY(0, 0), MONEY(5000000, 0)); + else if (strcmp(argv[0], "max_loan") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) = clamp(MONEY(int_val[0] - (int_val[0] % 1000), 0), MONEY(0, 0), MONEY(5000000, 0)); console_execute_silent("get max_loan"); } - else if (strcmp(argv[0], "guest_initial_cash") == 0 && double_valid) { - RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_CASH, money16) = clamp(MONEY((int)double_val, ((int)(double_val * 100)) % 100), MONEY(0, 0), MONEY(15000, 0)); + else if (strcmp(argv[0], "guest_initial_cash") == 0 && invalidArguments(&invalidArgs, double_valid[0])) { + RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_CASH, money16) = clamp(MONEY((int)double_val[0], ((int)(double_val[0] * 100)) % 100), MONEY(0, 0), MONEY(15000, 0)); console_execute_silent("get guest_initial_cash"); } - else if (strcmp(argv[0], "guest_initial_happiness") == 0 && int_valid) { - RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_HAPPINESS, uint8) = calculate_guest_initial_happiness((uint8)int_val); + else if (strcmp(argv[0], "guest_initial_happiness") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_HAPPINESS, uint8) = calculate_guest_initial_happiness((uint8)int_val[0]); console_execute_silent("get guest_initial_happiness"); } - else if (strcmp(argv[0], "guest_initial_hunger") == 0 && int_valid) { - RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_HUNGER, uint8) = (clamp(int_val, 1, 84) * 255 / 100 - 255) * -1; + else if (strcmp(argv[0], "guest_initial_hunger") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_HUNGER, uint8) = (clamp(int_val[0], 1, 84) * 255 / 100 - 255) * -1; console_execute_silent("get guest_initial_hunger"); } - else if (strcmp(argv[0], "guest_initial_thirst") == 0 && int_valid) { - RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_THIRST, uint8) = (clamp(int_val, 1, 84) * 255 / 100 - 255) * -1; + else if (strcmp(argv[0], "guest_initial_thirst") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_THIRST, uint8) = (clamp(int_val[0], 1, 84) * 255 / 100 - 255) * -1; console_execute_silent("get guest_initial_thirst"); } - else if (strcmp(argv[0], "guest_prefer_less_intense_rides") == 0 && int_valid) { - SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_PREF_LESS_INTENSE_RIDES, int_val); + else if (strcmp(argv[0], "guest_prefer_less_intense_rides") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_PREF_LESS_INTENSE_RIDES, int_val[0]); console_execute_silent("get guest_prefer_less_intense_rides"); } - else if (strcmp(argv[0], "guest_prefer_more_intense_rides") == 0 && int_valid) { - SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_PREF_MORE_INTENSE_RIDES, int_val); + else if (strcmp(argv[0], "guest_prefer_more_intense_rides") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_PREF_MORE_INTENSE_RIDES, int_val[0]); console_execute_silent("get guest_prefer_more_intense_rides"); } - else if (strcmp(argv[0], "forbid_marketing_campagns") == 0 && int_valid) { - SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_FORBID_MARKETING_CAMPAIGN, int_val); + else if (strcmp(argv[0], "forbid_marketing_campagns") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_FORBID_MARKETING_CAMPAIGN, int_val[0]); console_execute_silent("get forbid_marketing_campagns"); } - else if (strcmp(argv[0], "forbid_landscape_changes") == 0 && int_valid) { - SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_FORBID_LANDSCAPE_CHANGES, int_val); + else if (strcmp(argv[0], "forbid_landscape_changes") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_FORBID_LANDSCAPE_CHANGES, int_val[0]); console_execute_silent("get forbid_landscape_changes"); } - else if (strcmp(argv[0], "forbid_tree_removal") == 0 && int_valid) { - SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_FORBID_TREE_REMOVAL, int_val); + else if (strcmp(argv[0], "forbid_tree_removal") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_FORBID_TREE_REMOVAL, int_val[0]); console_execute_silent("get forbid_tree_removal"); } - else if (strcmp(argv[0], "forbid_high_construction") == 0 && int_valid) { - SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_FORBID_HIGH_CONSTRUCTION, int_val); + else if (strcmp(argv[0], "forbid_high_construction") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_FORBID_HIGH_CONSTRUCTION, int_val[0]); console_execute_silent("get forbid_high_construction"); } - else if (strcmp(argv[0], "pay_for_rides") == 0 && int_valid) { - SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_PARK_FREE_ENTRY, int_val); + else if (strcmp(argv[0], "pay_for_rides") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_PARK_FREE_ENTRY, int_val[0]); console_execute_silent("get pay_for_rides"); } - else if (strcmp(argv[0], "no_money") == 0 && int_valid) { - SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_NO_MONEY, int_val); + else if (strcmp(argv[0], "no_money") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_NO_MONEY, int_val[0]); console_execute_silent("get no_money"); } - else if (strcmp(argv[0], "difficult_park_rating") == 0 && int_valid) { - SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_DIFFICULT_PARK_RATING, int_val); + else if (strcmp(argv[0], "difficult_park_rating") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_DIFFICULT_PARK_RATING, int_val[0]); console_execute_silent("get difficult_park_rating"); } - else if (strcmp(argv[0], "difficult_guest_generation") == 0 && int_valid) { - SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_DIFFICULT_GUEST_GENERATION, int_val); + else if (strcmp(argv[0], "difficult_guest_generation") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_DIFFICULT_GUEST_GENERATION, int_val[0]); console_execute_silent("get difficult_guest_generation"); } - else if (strcmp(argv[0], "park_open") == 0 && int_valid) { - SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_PARK_OPEN, int_val); + else if (strcmp(argv[0], "park_open") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + SET_FLAG(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), PARK_FLAGS_PARK_OPEN, int_val[0]); console_execute_silent("get park_open"); } - else if (strcmp(argv[0], "land_rights_cost") == 0 && double_valid) { - RCT2_GLOBAL(RCT2_ADDRESS_LAND_COST, money16) = clamp(MONEY((int)double_val, ((int)(double_val * 100)) % 100), MONEY(0, 0), MONEY(15000, 0)); + else if (strcmp(argv[0], "land_rights_cost") == 0 && invalidArguments(&invalidArgs, double_valid[0])) { + RCT2_GLOBAL(RCT2_ADDRESS_LAND_COST, money16) = clamp(MONEY((int)double_val[0], ((int)(double_val[0] * 100)) % 100), MONEY(0, 0), MONEY(15000, 0)); console_execute_silent("get land_rights_cost"); } - else if (strcmp(argv[0], "construction_rights_cost") == 0 && double_valid) { - RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCTION_RIGHTS_COST, money16) = clamp(MONEY((int)double_val, ((int)(double_val * 100)) % 100), MONEY(0, 0), MONEY(15000, 0)); + else if (strcmp(argv[0], "construction_rights_cost") == 0 && invalidArguments(&invalidArgs, double_valid[0])) { + RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCTION_RIGHTS_COST, money16) = clamp(MONEY((int)double_val[0], ((int)(double_val[0] * 100)) % 100), MONEY(0, 0), MONEY(15000, 0)); console_execute_silent("get construction_rights_cost"); } else if (strcmp(argv[0], "climate") == 0) { - if (int_valid) { - RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, sint8) = clamp(int_val, 0, 3); + if (int_valid[0]) { + RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, sint8) = clamp(int_val[0], 0, 3); } else { char* climate_names[] = { "cool_and_wet", "warm", "hot_and_dry", "cold" }; - for (int i = 0; i < 4; i++) { + for (i = 0; i < 4; i++) { if (strcmp(argv[1], climate_names[i]) == 0) { RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, sint8) = i; break; } } } - console_execute_silent("get climate"); + if (i == 4) + invalidArgs = true; + else + console_execute_silent("get climate"); } - else if (strcmp(argv[0], "game_speed") == 0 && int_valid) { - gGameSpeed = clamp(int_val, 1, 8); + else if (strcmp(argv[0], "game_speed") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + gGameSpeed = clamp(int_val[0], 1, 8); console_execute_silent("get game_speed"); } - else if (strcmp(argv[0], "console_small_font") == 0 && int_valid) { - gConfigInterface.console_small_font = (int_val != 0); + else if (strcmp(argv[0], "console_small_font") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + gConfigInterface.console_small_font = (int_val[0] != 0); 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); + else if (strcmp(argv[0], "test_unfinished_tracks") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + gConfigGeneral.test_unfinished_tracks = (int_val[0] != 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); + else if (strcmp(argv[0], "no_test_crashes") == 0 && invalidArguments(&invalidArgs, int_valid[0])) { + gConfigGeneral.no_test_crashes = (int_val[0] != 0); config_save_default(); console_execute_silent("get no_test_crashes"); } - else if (strcmp(argv[0], "location") == 0 && int_valid && int_valid2) { + else if (strcmp(argv[0], "location") == 0 && invalidArguments(&invalidArgs, int_valid[0] && int_valid[1])) { rct_window *w = window_get_main(); if (w != NULL) { - int x = (sint16)(int_val * 32 + 16); - int y = (sint16)(int_val2 * 32 + 16); + int x = (sint16)(int_val[0] * 32 + 16); + int y = (sint16)(int_val[1] * 32 + 16); int z = map_element_height(x, y); window_scroll_to_location(w, x, y, z); w->flags &= ~WF_SCROLLING_TO_LOCATION; @@ -668,12 +683,18 @@ static int cc_set(const char **argv, int argc) console_execute_silent("get location"); } } + else if (invalidArgs) { + console_writeline_error("Invalid arguments."); + } else { - console_writeline_error("Invalid variable or value."); + console_writeline_error("Invalid variable."); } gfx_invalidate_screen(); } + else { + console_writeline_error("Value required."); + } return 0; } static int cc_twitch(const char **argv, int argc) @@ -811,18 +832,21 @@ static int cc_object_count(const char **argv, int argc) { } static int cc_open(const char **argv, int argc) { if (argc > 0) { - if (strcmp(argv[0], "object_selection") == 0) { + bool title = (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) != 0; + bool invalidTitle = false; + if (strcmp(argv[0], "object_selection") == 0 && invalidArguments(&invalidTitle, !title)) { // Only this window should be open for safety reasons window_close_all(); window_editor_object_selection_open(); - } else if (strcmp(argv[0], "inventions_list") == 0) { + } else if (strcmp(argv[0], "inventions_list") == 0 && invalidArguments(&invalidTitle, !title)) { window_editor_inventions_list_open(); } else if (strcmp(argv[0], "options") == 0) { window_options_open(); } else if (strcmp(argv[0], "themes") == 0) { window_themes_open(); - } - else { + } else if (invalidTitle) { + console_writeline_error("Cannot open this window in the title screen."); + } else { console_writeline_error("Invalid window."); } } @@ -999,4 +1023,11 @@ void console_execute_silent(const char *src) char output[] = { FORMAT_RED, "Unknown command. Type help to list available commands." }; console_writeline(output); } -} \ No newline at end of file +} + +static bool invalidArguments(bool *invalid, bool arguments) +{ + if (!arguments) + *invalid = true; + return !invalid; +} From febe925f52d8b19de995d6936385438782250240 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Fri, 19 Jun 2015 10:58:56 -0400 Subject: [PATCH 0021/1173] Added title restriction to new window --- src/interface/console.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/interface/console.c b/src/interface/console.c index 017dd5c703..2842c63504 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -840,7 +840,7 @@ static int cc_open(const char **argv, int argc) { window_editor_object_selection_open(); } else if (strcmp(argv[0], "inventions_list") == 0 && invalidArguments(&invalidTitle, !title)) { window_editor_inventions_list_open(); - } else if (strcmp(argv[0], "scenario_options") == 0) { + } else if (strcmp(argv[0], "scenario_options") == 0 && invalidArguments(&invalidTitle, !title)) { window_editor_scenario_options_open(); } else if (strcmp(argv[0], "options") == 0) { window_options_open(); @@ -896,6 +896,7 @@ char* console_variable_table[] = { char* console_window_table[] = { "object_selection", "inventions_list", + "scenario_options", "options", "themes" }; From 8935503b862c5242b340a18dcfec5e669b9b98a2 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 14 Jun 2015 12:24:01 +0100 Subject: [PATCH 0022/1173] Implemented select object in object selection window. --- src/windows/editor_object_selection.c | 259 +++++++++++++++++++++++--- 1 file changed, 238 insertions(+), 21 deletions(-) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 6697ec28cc..96ff407e62 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -202,7 +202,7 @@ static void* window_editor_object_selection_events[] = { static void window_editor_object_set_page(rct_window *w, int page); static void window_editor_object_selection_set_pressed_tab(rct_window *w); static void window_editor_object_selection_select_default_objects(); -static int window_editor_object_selection_select_object(int flags, rct_object_entry *entry); +static int window_editor_object_selection_select_object(uint8 bh, int flags, rct_object_entry *entry); static int get_object_from_object_selection(uint8 object_type, int y, uint8 *object_selection_flags, rct_object_entry **installed_entry); static void window_editor_object_selection_manage_tracks(); static void editor_load_selected_objects(); @@ -530,7 +530,7 @@ static void window_editor_object_selection_scroll_mousedown() if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { - if (!window_editor_object_selection_select_object(1, installed_entry)) + if (!window_editor_object_selection_select_object(0, 1, installed_entry)) return; // Close any other open windows such as options/colour schemes to prevent a crash. @@ -548,7 +548,7 @@ static void window_editor_object_selection_scroll_mousedown() ebx = 7; RCT2_GLOBAL(0xF43411, uint8) = 0; - if (!window_editor_object_selection_select_object(ebx, installed_entry)) { + if (!window_editor_object_selection_select_object(0, ebx, installed_entry)) { rct_string_id error_title = ebx & 1 ? STR_UNABLE_TO_SELECT_THIS_OBJECT : STR_UNABLE_TO_DE_SELECT_THIS_OBJECT; @@ -983,24 +983,25 @@ static void window_editor_object_selection_scrollpaint() // Draw text char *buffer = (char*)0x0141ED68; - *buffer = colour; - strcpy(buffer + 1, object_get_name(entry)); - if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { - while (*buffer != 0 && *buffer != 9) - buffer++; +*buffer = colour; +strcpy(buffer + 1, object_get_name(entry)); +if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { + while (*buffer != 0 && *buffer != 9) + buffer++; - *buffer = 0; - } + *buffer = 0; +} - if (*itemFlags & 0x20) { - colour = w->colours[1] & 0x7F; - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = -1; - } else { - colour = 0; - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = 224; - } - x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 15; - gfx_draw_string(dpi, (char*)0x0141ED68, colour, x, y); +if (*itemFlags & 0x20) { + colour = w->colours[1] & 0x7F; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = -1; +} +else { + colour = 0; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = 224; +} +x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 15; +gfx_draw_string(dpi, (char*)0x0141ED68, colour, x, y); } y += 12; } @@ -1043,15 +1044,231 @@ static void window_editor_object_selection_select_default_objects() return; for (i = 0; i < countof(DefaultSelectedObjects); i++) - window_editor_object_selection_select_object(7, &DefaultSelectedObjects[i]); + window_editor_object_selection_select_object(0, 7, &DefaultSelectedObjects[i]); } /** * * rct2: 0x006AB54F */ -static int window_editor_object_selection_select_object(int flags, rct_object_entry *entry) +static int window_editor_object_selection_select_object(uint8 bh, int flags, rct_object_entry *entry) { + uint8* selection_flags; + if (bh == 0){ + // Unsure what this does?? + uint16 total_objects = 0; + for (uint8 i = 0; i < 11; ++i){ + total_objects += RCT2_ADDRESS(0x00F433E1, uint16)[i]; + } + + selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); + for (; total_objects != 0; total_objects--, selection_flags++){ + uint8 select_flag = *selection_flags & 0xFD; + if (select_flag & 1){ + select_flag |= (1 << 1); + } + } + } + + selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); + // There was previously a check to make sure the object list had an item + rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); + rct_object_entry* test = object_list_find(entry); + uint8 not_found = 1; + for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ + if (object_entry_compare(entry, installedObject)){ + not_found = 0; + break; + } + + installedObject = object_get_next(installedObject); + selection_flags++; + } + if (not_found){ + RCT2_GLOBAL(0x141E9AC, uint16) = 3169; + if (bh != 0){ + // Bunch of code that looks like it does nothing removed. + RCT2_CALLPROC_EBPSAFE(0x006AA770); + } + return 0; + } + + if (!(flags & 1)){ + if (!(*selection_flags & (1 << 0))) + { + if (bh == 0){ + RCT2_CALLPROC_EBPSAFE(0x006AB923); + } + return 1; + } else if (*selection_flags & (1 << 2)){ + RCT2_GLOBAL(0x141E9AC, uint16) = 3173; + if (bh != 0){ + // Bunch of code that looks like it does nothing removed. + RCT2_CALLPROC_EBPSAFE(0x006AA770); + } + return 0; + } + else if (*selection_flags & (1 << 3)){ + RCT2_GLOBAL(0x141E9AC, uint16) = 3174; + if (bh != 0){ + RCT2_CALLPROC_EBPSAFE(0x006AA770); + } + return 0; + } + else if (*selection_flags & (1 << 4)){ + RCT2_GLOBAL(0x141E9AC, uint16) = 3175; + if (bh != 0){ + RCT2_CALLPROC_EBPSAFE(0x006AA770); + } + return 0; + } + + uint8* pos = (uint8*)installedObject; + // Skip sizeof(rct_object_entry) + pos += 16; + + // Skip filename + while (*pos++); + + // Skip no of images + pos += 4; + + // Skip name + while (*pos++); + + uint32 size_of_chunk = *((uint32*)pos); + // Skip size of chunk + pos += 4; + + // Skip + pos += *pos * 16 + 1; + + uint8 no_theme_objects = *pos++; + + if (no_theme_objects != 0 && flags&(1 << 2)){ + rct_object_entry* theme_object = (rct_object_entry*)pos; + for (; no_theme_objects > 0; no_theme_objects--){ + window_editor_object_selection_select_object(++bh, flags, theme_object); + theme_object++; + } + } + + RCT2_GLOBAL(0x00F4340D, uint32) -= size_of_chunk; + uint8 object_type = installedObject->flags & 0xF; + RCT2_ADDRESS(0x00F433F7, uint16)[object_type]--; + *selection_flags &= ~(1 << 0); + if (bh == 0){ + RCT2_CALLPROC_EBPSAFE(0x006AB923); + } + return 1; + } + else{ + if (bh == 0){ + if (flags & (1 << 3)){ + *selection_flags |= (1 << 4); + } + } + if (*selection_flags&(1 << 0)){ + if (bh == 0){ + RCT2_CALLPROC_EBPSAFE(0x006AB923); + } + return 1; + } + + uint8 object_type = installedObject->flags & 0xF; + uint16 no_objects = object_entry_group_counts[object_type]; + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER){ + no_objects = 4; + } + + if (no_objects <= RCT2_ADDRESS(0x00F433F7, uint16)[object_type]){ + RCT2_GLOBAL(0x141E9AC, uint16) = 3171; + if (bh != 0){ + // Bunch of code that looks like it does nothing removed. + RCT2_CALLPROC_EBPSAFE(0x006AA770); + } + return 0; + } + + uint8* pos = (uint8*)installedObject; + // Skip sizeof(rct_object_entry) + pos += 16; + + // Skip filename + while (*pos++); + + // Skip no of images + pos += 4; + + // Skip name + while (*pos++); + + uint32 size_of_chunk = *((uint32*)pos); + // Skip size of chunk + pos += 4; + + uint8 num_unks = *pos++; + rct_object_entry* unks = (rct_object_entry*)pos; + for (; num_unks != 0; num_unks--){ + if (!window_editor_object_selection_select_object(++bh, flags, unks)){ + if (bh != 0){ + // Bunch of code that looks like it does nothing removed. + RCT2_CALLPROC_EBPSAFE(0x006AA770); + } + return 0; + } + unks++; + } + pos = (uint8*)unks; + + uint8 num_theme_objects = *pos++; + rct_object_entry* theme_object = (rct_object_entry*)pos; + for (; num_theme_objects != 0; num_theme_objects--){ + if (flags & (1 << 2)){ + if (!window_editor_object_selection_select_object(++bh, flags, theme_object)){ + RCT2_GLOBAL(0x00F43411, uint8) |= 1; + } + } + theme_object++; + } + + if (bh != 0 && !(flags&(1 << 1))){ + RCT2_CALLPROC_X(0x6AB344, 0, 0, 0, 0, 0, (int)0x009BC95A, (int)installedObject); + RCT2_GLOBAL(0x141E9AC, uint16) = 3172; + if (bh != 0){ + // Bunch of code that looks like it does nothing removed. + RCT2_CALLPROC_EBPSAFE(0x006AA770); + } + return 0; + } + + if (RCT2_GLOBAL(0x00F4340D, uint32) + size_of_chunk > 0x40000){ + RCT2_GLOBAL(0x141E9AC, uint16) = 3170; + if (bh != 0){ + // Bunch of code that looks like it does nothing removed. + RCT2_CALLPROC_EBPSAFE(0x006AA770); + } + return 0; + } + + if (no_objects <= RCT2_ADDRESS(0x00F433F7, uint16)[object_type]){ + RCT2_GLOBAL(0x141E9AC, uint16) = 3171; + if (bh != 0){ + // Bunch of code that looks like it does nothing removed. + RCT2_CALLPROC_EBPSAFE(0x006AA770); + } + return 0; + } + + RCT2_GLOBAL(0x00F4340D, uint32) = size_of_chunk; + RCT2_ADDRESS(0x00F433F7, uint16)[object_type]++; + + *selection_flags |= (1 << 0); + if (bh == 0){ + RCT2_CALLPROC_EBPSAFE(0x006AB923); + } + return 1; + } return (RCT2_CALLPROC_X(0x006AB54F, 0, flags, 0, 0, 0, 0, (int)entry) & 0x100) == 0; } From 7a5887f67a0c31071e29288a31132328d0729a53 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 15 Jun 2015 20:17:40 +0100 Subject: [PATCH 0023/1173] Fix size bug. Implemented reset_required_object_flags and reset_selected_object_count_and_size. --- src/windows/editor_object_selection.c | 157 +++++++++++++++++++++++--- 1 file changed, 142 insertions(+), 15 deletions(-) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 96ff407e62..ebd90546d3 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -166,6 +166,8 @@ static void window_editor_object_selection_paint(); static void window_editor_object_selection_scrollpaint(); static void window_editor_object_selection_textinput(); +void reset_selected_object_count_and_size(); + static void* window_editor_object_selection_events[] = { window_editor_object_selection_close, (void*)window_editor_object_selection_mouseup, @@ -265,7 +267,7 @@ void window_editor_object_selection_open() return; RCT2_CALLPROC_EBPSAFE(0x006AB211); - RCT2_CALLPROC_EBPSAFE(0x006AA770); + reset_selected_object_count_and_size(); // Not really where its called, but easy way to change default objects for now if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) @@ -1047,6 +1049,131 @@ static void window_editor_object_selection_select_default_objects() window_editor_object_selection_select_object(0, 7, &DefaultSelectedObjects[i]); } +/* rct2: 0x006AA770 */ +void reset_selected_object_count_and_size(){ + for (uint8 object_type = 0; object_type < 11; object_type++){ + RCT2_ADDRESS(0x00F443F7, uint16)[object_type] = 0; + } + + uint32 total_object_size = 0; + + uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); + rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); + + for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ + uint8 object_type = installedObject->flags & 0xF; + + if (*selection_flags & (1 << 0)){ + uint8* pos = (uint8*)installedObject; + // Skip sizeof(rct_object_entry) + pos += 16; + + // Skip filename + while (*pos++); + + // Skip no of images + pos += 4; + + // Skip name + while (*pos++); + + uint32 size_of_chunk = *((uint32*)pos); + RCT2_ADDRESS(0x00F443F7, uint16)[object_type]++; + total_object_size += size_of_chunk; + } + selection_flags++; + installedObject = object_get_next(installedObject); + } + + RCT2_GLOBAL(0x00F4340D, uint32) = total_object_size; +} + +/* rct2: 0x006AB863 */ +void set_required_object_flags(rct_object_entry* required_object){ + uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); + rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); + + for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ + if (object_entry_compare(required_object, installedObject)){ + *selection_flags |= (1 << 3); + + uint8* pos = (uint8*)installedObject; + // Skip sizeof(rct_object_entry) + pos += 16; + + // Skip filename + while (*pos++); + + // Skip no of images + pos += 4; + + // Skip name + while (*pos++); + + // Skip size of chunk + pos += 4; + + // Skip + uint8 no_unk_objects = *pos++; + + rct_object_entry* unk_object = (rct_object_entry*)pos; + for (; no_unk_objects > 0; no_unk_objects--){ + set_required_object_flags(unk_object); + unk_object++; + } + return; + } + + selection_flags++; + installedObject = object_get_next(installedObject); + } +} + +/* rct2: 0x006AB923 */ +void reset_required_object_flags(){ + uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); + for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ + *selection_flags &= ~(1 << 3); + selection_flags++; + } + + selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); + rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); + + for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ + if (*selection_flags&(1 << 0)){ + uint8* pos = (uint8*)installedObject; + // Skip sizeof(rct_object_entry) + pos += 16; + + // Skip filename + while (*pos++); + + // Skip no of images + pos += 4; + + // Skip name + while (*pos++); + + // Skip size of chunk + pos += 4; + + // Skip + uint8 no_unk_objects = *pos++; + + rct_object_entry* unk_object = (rct_object_entry*)pos; + for (; no_unk_objects > 0; no_unk_objects--){ + set_required_object_flags(unk_object); + unk_object++; + } + + } + + selection_flags++; + installedObject = object_get_next(installedObject); + } +} + /** * * rct2: 0x006AB54F @@ -1088,7 +1215,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct RCT2_GLOBAL(0x141E9AC, uint16) = 3169; if (bh != 0){ // Bunch of code that looks like it does nothing removed. - RCT2_CALLPROC_EBPSAFE(0x006AA770); + reset_selected_object_count_and_size(); } return 0; } @@ -1097,28 +1224,28 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct if (!(*selection_flags & (1 << 0))) { if (bh == 0){ - RCT2_CALLPROC_EBPSAFE(0x006AB923); + reset_required_object_flags(); } return 1; } else if (*selection_flags & (1 << 2)){ RCT2_GLOBAL(0x141E9AC, uint16) = 3173; if (bh != 0){ // Bunch of code that looks like it does nothing removed. - RCT2_CALLPROC_EBPSAFE(0x006AA770); + reset_selected_object_count_and_size(); } return 0; } else if (*selection_flags & (1 << 3)){ RCT2_GLOBAL(0x141E9AC, uint16) = 3174; if (bh != 0){ - RCT2_CALLPROC_EBPSAFE(0x006AA770); + reset_selected_object_count_and_size(); } return 0; } else if (*selection_flags & (1 << 4)){ RCT2_GLOBAL(0x141E9AC, uint16) = 3175; if (bh != 0){ - RCT2_CALLPROC_EBPSAFE(0x006AA770); + reset_selected_object_count_and_size(); } return 0; } @@ -1158,7 +1285,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct RCT2_ADDRESS(0x00F433F7, uint16)[object_type]--; *selection_flags &= ~(1 << 0); if (bh == 0){ - RCT2_CALLPROC_EBPSAFE(0x006AB923); + reset_required_object_flags(); } return 1; } @@ -1170,7 +1297,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct } if (*selection_flags&(1 << 0)){ if (bh == 0){ - RCT2_CALLPROC_EBPSAFE(0x006AB923); + reset_required_object_flags(); } return 1; } @@ -1185,7 +1312,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct RCT2_GLOBAL(0x141E9AC, uint16) = 3171; if (bh != 0){ // Bunch of code that looks like it does nothing removed. - RCT2_CALLPROC_EBPSAFE(0x006AA770); + reset_selected_object_count_and_size(); } return 0; } @@ -1213,7 +1340,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct if (!window_editor_object_selection_select_object(++bh, flags, unks)){ if (bh != 0){ // Bunch of code that looks like it does nothing removed. - RCT2_CALLPROC_EBPSAFE(0x006AA770); + reset_selected_object_count_and_size(); } return 0; } @@ -1237,7 +1364,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct RCT2_GLOBAL(0x141E9AC, uint16) = 3172; if (bh != 0){ // Bunch of code that looks like it does nothing removed. - RCT2_CALLPROC_EBPSAFE(0x006AA770); + reset_selected_object_count_and_size(); } return 0; } @@ -1246,7 +1373,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct RCT2_GLOBAL(0x141E9AC, uint16) = 3170; if (bh != 0){ // Bunch of code that looks like it does nothing removed. - RCT2_CALLPROC_EBPSAFE(0x006AA770); + reset_selected_object_count_and_size(); } return 0; } @@ -1255,17 +1382,17 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct RCT2_GLOBAL(0x141E9AC, uint16) = 3171; if (bh != 0){ // Bunch of code that looks like it does nothing removed. - RCT2_CALLPROC_EBPSAFE(0x006AA770); + reset_selected_object_count_and_size(); } return 0; } - RCT2_GLOBAL(0x00F4340D, uint32) = size_of_chunk; + RCT2_GLOBAL(0x00F4340D, uint32) += size_of_chunk; RCT2_ADDRESS(0x00F433F7, uint16)[object_type]++; *selection_flags |= (1 << 0); if (bh == 0){ - RCT2_CALLPROC_EBPSAFE(0x006AB923); + reset_required_object_flags(); } return 1; } From f7bbfa80a8c70829fa8c95a647087ab4564f7309 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 15 Jun 2015 20:52:04 +0100 Subject: [PATCH 0024/1173] Start refactoring --- src/object.c | 2 +- src/object.h | 11 +++ src/windows/editor_object_selection.c | 124 +++++++++++++------------- 3 files changed, 73 insertions(+), 64 deletions(-) diff --git a/src/object.c b/src/object.c index 0f83bab287..7e6609ec78 100644 --- a/src/object.c +++ b/src/object.c @@ -1619,7 +1619,7 @@ rct_object_entry *object_get_next(rct_object_entry *entry) // Skip size of chunk pos += 4; - // Skip + // Skip required objects pos += *pos * 16 + 1; // Skip theme objects diff --git a/src/object.h b/src/object.h index cfe41692d6..9cc6e71969 100644 --- a/src/object.h +++ b/src/object.h @@ -38,6 +38,17 @@ typedef enum{ OBJECT_TYPE_SCENARIO_TEXT }OBJECT_TYPE; +typedef enum{ + OBJECT_SELECTION_FLAG_SELECTED = (1 << 0), + OBJECT_SELECTION_FLAG_2 = (1 << 1), + OBJECT_SELECTION_FLAG_IN_USE = (1 << 2), + OBJECT_SELECTION_FLAG_REQUIRED = (1 << 3), + OBJECT_SELECTION_FLAG_ALWAYS_REQUIRED = (1 << 4), + OBJECT_SELECTION_FLAG_6 = (1 << 5), + OBJECT_SELECTION_FLAG_7 = (1 << 6), + OBJECT_SELECTION_FLAG_8 = (1 << 7), +}OBJECT_SELECTION_FLAGS; + /** * Object entry structure. * size: 0x10 diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index ebd90546d3..99071a02da 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -523,7 +523,7 @@ static void window_editor_object_selection_scroll_mousedown() uint8 object_selection_flags; rct_object_entry* installed_entry; int selected_object = get_object_from_object_selection((w->selected_tab & 0xFF), y, &object_selection_flags, &installed_entry); - if (selected_object == -1 || (object_selection_flags & 0x20)) + if (selected_object == -1 || (object_selection_flags & OBJECT_SELECTION_FLAG_6)) return; window_invalidate(w); @@ -546,7 +546,7 @@ static void window_editor_object_selection_scroll_mousedown() int ebx = 6; // If already selected - if (!(object_selection_flags & 1)) + if (!(object_selection_flags & OBJECT_SELECTION_FLAG_SELECTED)) ebx = 7; RCT2_GLOBAL(0xF43411, uint8) = 0; @@ -582,7 +582,7 @@ static void window_editor_object_selection_scroll_mouseover() selectedObject = get_object_from_object_selection( w->selected_tab & 0xFF, y, &objectSelectionFlags, &installedEntry ); - if (objectSelectionFlags & 0x20) + if (objectSelectionFlags & OBJECT_SELECTION_FLAG_6) selectedObject = -1; if (selectedObject == w->selected_list_item) @@ -953,13 +953,13 @@ static void window_editor_object_selection_scrollpaint() numObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, sint32); entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); - itemFlags = RCT2_GLOBAL(0x009ADAEC, uint8*); + itemFlags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); y = 0; for (i = 0; i < numObjects; i++) { filter = get_object_filter(i); type = entry->flags & 0x0F; source = (entry->flags & 0xF0) >> 4; - if (type == w->selected_tab && !(*itemFlags & 0x20) && filter_source(entry) && filter_string(entry) && filter_chunks(entry, filter)) { + if (type == w->selected_tab && !(*itemFlags & OBJECT_SELECTION_FLAG_6) && filter_source(entry) && filter_string(entry) && filter_chunks(entry, filter)) { if (y + 12 >= dpi->y && y <= dpi->y + dpi->height) { // Draw checkbox if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && !(*itemFlags & 0x20)) @@ -967,17 +967,17 @@ static void window_editor_object_selection_scrollpaint() // Highlight background colour = 142; - if (entry == (rct_object_entry*)w->var_494 && !(*itemFlags & 0x20)) { + if (entry == (rct_object_entry*)w->var_494 && !(*itemFlags & OBJECT_SELECTION_FLAG_6)) { gfx_fill_rect(dpi, 0, y, w->width, y + 11, 0x2000031); colour = 14; } // Draw checkmark - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && (*itemFlags & 1)) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && (*itemFlags & OBJECT_SELECTION_FLAG_SELECTED)) { x = 2; RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = colour == 14 ? -2 : -1; colour2 = w->colours[1] & 0x7F; - if (*itemFlags & 0x1C) + if (*itemFlags & (OBJECT_SELECTION_FLAG_IN_USE | OBJECT_SELECTION_FLAG_REQUIRED | OBJECT_SELECTION_FLAG_ALWAYS_REQUIRED)) colour2 |= 0x40; gfx_draw_string(dpi, (char*)0x009DED72, colour2, x, y); @@ -985,25 +985,25 @@ static void window_editor_object_selection_scrollpaint() // Draw text char *buffer = (char*)0x0141ED68; -*buffer = colour; -strcpy(buffer + 1, object_get_name(entry)); -if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { - while (*buffer != 0 && *buffer != 9) - buffer++; + *buffer = colour; + strcpy(buffer + 1, object_get_name(entry)); + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { + while (*buffer != 0 && *buffer != 9) + buffer++; - *buffer = 0; -} + *buffer = 0; + } -if (*itemFlags & 0x20) { - colour = w->colours[1] & 0x7F; - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = -1; -} -else { - colour = 0; - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = 224; -} -x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 15; -gfx_draw_string(dpi, (char*)0x0141ED68, colour, x, y); + if (*itemFlags & OBJECT_SELECTION_FLAG_6) { + colour = w->colours[1] & 0x7F; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = -1; + } + else { + colour = 0; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = 224; + } + x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 15; + gfx_draw_string(dpi, (char*)0x0141ED68, colour, x, y); } y += 12; } @@ -1063,7 +1063,7 @@ void reset_selected_object_count_and_size(){ for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ uint8 object_type = installedObject->flags & 0xF; - if (*selection_flags & (1 << 0)){ + if (*selection_flags & OBJECT_SELECTION_FLAG_SELECTED){ uint8* pos = (uint8*)installedObject; // Skip sizeof(rct_object_entry) pos += 16; @@ -1095,7 +1095,7 @@ void set_required_object_flags(rct_object_entry* required_object){ for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ if (object_entry_compare(required_object, installedObject)){ - *selection_flags |= (1 << 3); + *selection_flags |= OBJECT_SELECTION_FLAG_REQUIRED; uint8* pos = (uint8*)installedObject; // Skip sizeof(rct_object_entry) @@ -1113,13 +1113,12 @@ void set_required_object_flags(rct_object_entry* required_object){ // Skip size of chunk pos += 4; - // Skip - uint8 no_unk_objects = *pos++; + uint8 no_required_objects = *pos++; - rct_object_entry* unk_object = (rct_object_entry*)pos; - for (; no_unk_objects > 0; no_unk_objects--){ - set_required_object_flags(unk_object); - unk_object++; + required_object = (rct_object_entry*)pos; + for (; no_required_objects > 0; no_required_objects--){ + set_required_object_flags(required_object); + required_object++; } return; } @@ -1133,7 +1132,7 @@ void set_required_object_flags(rct_object_entry* required_object){ void reset_required_object_flags(){ uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ - *selection_flags &= ~(1 << 3); + *selection_flags &= ~OBJECT_SELECTION_FLAG_REQUIRED; selection_flags++; } @@ -1141,7 +1140,7 @@ void reset_required_object_flags(){ rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ - if (*selection_flags&(1 << 0)){ + if (*selection_flags & OBJECT_SELECTION_FLAG_SELECTED){ uint8* pos = (uint8*)installedObject; // Skip sizeof(rct_object_entry) pos += 16; @@ -1158,13 +1157,12 @@ void reset_required_object_flags(){ // Skip size of chunk pos += 4; - // Skip - uint8 no_unk_objects = *pos++; + uint8 no_required_objects = *pos++; - rct_object_entry* unk_object = (rct_object_entry*)pos; - for (; no_unk_objects > 0; no_unk_objects--){ - set_required_object_flags(unk_object); - unk_object++; + rct_object_entry* required_object = (rct_object_entry*)pos; + for (; no_required_objects > 0; no_required_objects--){ + set_required_object_flags(required_object); + required_object++; } } @@ -1190,9 +1188,9 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); for (; total_objects != 0; total_objects--, selection_flags++){ - uint8 select_flag = *selection_flags & 0xFD; - if (select_flag & 1){ - select_flag |= (1 << 1); + uint8 select_flag = *selection_flags & ~OBJECT_SELECTION_FLAG_2; + if (select_flag & OBJECT_SELECTION_FLAG_SELECTED){ + select_flag |= OBJECT_SELECTION_FLAG_2; } } } @@ -1200,7 +1198,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); // There was previously a check to make sure the object list had an item rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); - rct_object_entry* test = object_list_find(entry); + uint8 not_found = 1; for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ if (object_entry_compare(entry, installedObject)){ @@ -1221,13 +1219,14 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct } if (!(flags & 1)){ - if (!(*selection_flags & (1 << 0))) + if (!(*selection_flags & OBJECT_SELECTION_FLAG_SELECTED)) { if (bh == 0){ reset_required_object_flags(); } return 1; - } else if (*selection_flags & (1 << 2)){ + } + else if (*selection_flags & OBJECT_SELECTION_FLAG_IN_USE){ RCT2_GLOBAL(0x141E9AC, uint16) = 3173; if (bh != 0){ // Bunch of code that looks like it does nothing removed. @@ -1235,14 +1234,14 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct } return 0; } - else if (*selection_flags & (1 << 3)){ + else if (*selection_flags & OBJECT_SELECTION_FLAG_REQUIRED){ RCT2_GLOBAL(0x141E9AC, uint16) = 3174; if (bh != 0){ reset_selected_object_count_and_size(); } return 0; } - else if (*selection_flags & (1 << 4)){ + else if (*selection_flags & OBJECT_SELECTION_FLAG_ALWAYS_REQUIRED){ RCT2_GLOBAL(0x141E9AC, uint16) = 3175; if (bh != 0){ reset_selected_object_count_and_size(); @@ -1267,7 +1266,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct // Skip size of chunk pos += 4; - // Skip + // Skip required objects pos += *pos * 16 + 1; uint8 no_theme_objects = *pos++; @@ -1283,7 +1282,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct RCT2_GLOBAL(0x00F4340D, uint32) -= size_of_chunk; uint8 object_type = installedObject->flags & 0xF; RCT2_ADDRESS(0x00F433F7, uint16)[object_type]--; - *selection_flags &= ~(1 << 0); + *selection_flags &= ~OBJECT_SELECTION_FLAG_SELECTED; if (bh == 0){ reset_required_object_flags(); } @@ -1292,10 +1291,10 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct else{ if (bh == 0){ if (flags & (1 << 3)){ - *selection_flags |= (1 << 4); + *selection_flags |= OBJECT_SELECTION_FLAG_ALWAYS_REQUIRED; } } - if (*selection_flags&(1 << 0)){ + if (*selection_flags & OBJECT_SELECTION_FLAG_SELECTED){ if (bh == 0){ reset_required_object_flags(); } @@ -1334,19 +1333,19 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct // Skip size of chunk pos += 4; - uint8 num_unks = *pos++; - rct_object_entry* unks = (rct_object_entry*)pos; - for (; num_unks != 0; num_unks--){ - if (!window_editor_object_selection_select_object(++bh, flags, unks)){ + uint8 num_required_objects = *pos++; + rct_object_entry* required_objects = (rct_object_entry*)pos; + for (; num_required_objects != 0; num_required_objects--){ + if (!window_editor_object_selection_select_object(++bh, flags, required_objects)){ if (bh != 0){ // Bunch of code that looks like it does nothing removed. reset_selected_object_count_and_size(); } return 0; } - unks++; + required_objects++; } - pos = (uint8*)unks; + pos = (uint8*)required_objects; uint8 num_theme_objects = *pos++; rct_object_entry* theme_object = (rct_object_entry*)pos; @@ -1390,13 +1389,12 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct RCT2_GLOBAL(0x00F4340D, uint32) += size_of_chunk; RCT2_ADDRESS(0x00F433F7, uint16)[object_type]++; - *selection_flags |= (1 << 0); + *selection_flags |= OBJECT_SELECTION_FLAG_SELECTED; if (bh == 0){ reset_required_object_flags(); } return 1; } - return (RCT2_CALLPROC_X(0x006AB54F, 0, flags, 0, 0, 0, 0, (int)entry) & 0x100) == 0; } /** @@ -1418,7 +1416,7 @@ static int get_object_from_object_selection(uint8 object_type, int y, uint8 *obj filter = get_object_filter(RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32) - i); source = ((*installed_entry)->flags & 0xF0) >> 4; if (((*installed_entry)->flags & 0xF) == object_type && filter_source(*installed_entry) && filter_string(*installed_entry) && filter_chunks(*installed_entry, filter)){ - if (!(*selection_flags & 0x20)){ + if (!(*selection_flags & OBJECT_SELECTION_FLAG_6)){ y -= 12; *object_selection_flags = *selection_flags; if (y < 0)return object_count; @@ -1484,7 +1482,7 @@ static void editor_load_selected_objects() return; for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i != 0; i--, selection_flags++) { - if (*selection_flags & 1) { + if (*selection_flags & OBJECT_SELECTION_FLAG_SELECTED) { uint8 entry_index, entry_type; if (!find_object_in_entry_group(installed_entry, &entry_type, &entry_index)){ int chunk_size; From bed75bb2cf824e038c675d2c81981920cad2f157 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Tue, 16 Jun 2015 18:00:47 +0100 Subject: [PATCH 0025/1173] Refactor and start implementing setup functions for object selection --- src/addresses.h | 2 + src/windows/editor_object_selection.c | 126 ++++++++++++++------------ 2 files changed, 70 insertions(+), 58 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index e74cede5f2..34a652bdd9 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -298,6 +298,8 @@ // 1 if custom objects installed, 0 otherwise #define RCT2_ADDRESS_CUSTOM_OBJECTS_INSTALLED 0x00F42BDA +#define RCT2_ADDRESS_SELECTED_OBJECTS_FILE_SIZE 0x00F4340D + #define RCT2_ADDRESS_VOLUME_ADJUST_ZOOM 0x00F438AC #define RCT2_ADDRESS_STAFF_HIGHLIGHTED_INDEX 0x00F43908 diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 99071a02da..55184d3799 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -303,6 +303,35 @@ void window_editor_object_selection_open() window->var_494 = 0xFFFFFFFF; } +/* rct2: 0x006AB211 */ +static int sub_6AB211(){ + uint32 total_objects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); + + RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*) = rct2_malloc(total_objects); + + if (RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*) == NULL){ + log_error("Failed to allocate memory for object flag list."); + return 0; + } + + memset(RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*), 0, total_objects); + for (uint8 object_type = 0; object_type < 11; object_type++){ + RCT2_ADDRESS(0x00F433F7, uint16)[object_type] = 0; + RCT2_ADDRESS(0x00F433E1, uint16)[object_type] = 0; + } + + rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); + + for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ + uint8 object_type = installedObject->flags & 0xF; + RCT2_ADDRESS(0x00F433E1, uint16)[object_type]++; + + installedObject = object_get_next(installedObject); + } + + //0x6ab2c4 +} + /** * * rct2: 0x006AB199 @@ -1052,7 +1081,7 @@ static void window_editor_object_selection_select_default_objects() /* rct2: 0x006AA770 */ void reset_selected_object_count_and_size(){ for (uint8 object_type = 0; object_type < 11; object_type++){ - RCT2_ADDRESS(0x00F443F7, uint16)[object_type] = 0; + RCT2_ADDRESS(0x00F433F7, uint16)[object_type] = 0; } uint32 total_object_size = 0; @@ -1085,7 +1114,7 @@ void reset_selected_object_count_and_size(){ installedObject = object_get_next(installedObject); } - RCT2_GLOBAL(0x00F4340D, uint32) = total_object_size; + RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_OBJECTS_FILE_SIZE, uint32) = total_object_size; } /* rct2: 0x006AB863 */ @@ -1172,6 +1201,18 @@ void reset_required_object_flags(){ } } +/* + * Master objects are objects that are not + * optional / required dependants of an + * object. + */ +void set_object_selection_error(uint8 is_master_object, rct_string_id error_msg){ + RCT2_GLOBAL(0x141E9AC, rct_string_id) = error_msg; + if (!is_master_object){ + reset_selected_object_count_and_size(); + } +} + /** * * rct2: 0x006AB54F @@ -1179,21 +1220,21 @@ void reset_required_object_flags(){ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct_object_entry *entry) { uint8* selection_flags; - if (bh == 0){ - // Unsure what this does?? - uint16 total_objects = 0; - for (uint8 i = 0; i < 11; ++i){ - total_objects += RCT2_ADDRESS(0x00F433E1, uint16)[i]; - } + //if (bh == 0){ + // // Unsure what this does?? + // uint16 total_objects = 0; + // for (uint8 i = 0; i < 11; ++i){ + // total_objects += RCT2_ADDRESS(0x00F433E1, uint16)[i]; + // } - selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); - for (; total_objects != 0; total_objects--, selection_flags++){ - uint8 select_flag = *selection_flags & ~OBJECT_SELECTION_FLAG_2; - if (select_flag & OBJECT_SELECTION_FLAG_SELECTED){ - select_flag |= OBJECT_SELECTION_FLAG_2; - } - } - } + // selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); + // for (; total_objects != 0; total_objects--, selection_flags++){ + // uint8 select_flag = *selection_flags & ~OBJECT_SELECTION_FLAG_2; + // if (select_flag & OBJECT_SELECTION_FLAG_SELECTED){ + // select_flag |= OBJECT_SELECTION_FLAG_2; + // } + // } + //} selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); // There was previously a check to make sure the object list had an item @@ -1210,11 +1251,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct selection_flags++; } if (not_found){ - RCT2_GLOBAL(0x141E9AC, uint16) = 3169; - if (bh != 0){ - // Bunch of code that looks like it does nothing removed. - reset_selected_object_count_and_size(); - } + set_object_selection_error(bh, 3169); return 0; } @@ -1227,25 +1264,15 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct return 1; } else if (*selection_flags & OBJECT_SELECTION_FLAG_IN_USE){ - RCT2_GLOBAL(0x141E9AC, uint16) = 3173; - if (bh != 0){ - // Bunch of code that looks like it does nothing removed. - reset_selected_object_count_and_size(); - } + set_object_selection_error(bh, 3173); return 0; } else if (*selection_flags & OBJECT_SELECTION_FLAG_REQUIRED){ - RCT2_GLOBAL(0x141E9AC, uint16) = 3174; - if (bh != 0){ - reset_selected_object_count_and_size(); - } + set_object_selection_error(bh, 3174); return 0; } else if (*selection_flags & OBJECT_SELECTION_FLAG_ALWAYS_REQUIRED){ - RCT2_GLOBAL(0x141E9AC, uint16) = 3175; - if (bh != 0){ - reset_selected_object_count_and_size(); - } + set_object_selection_error(bh, 3175); return 0; } @@ -1279,7 +1306,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct } } - RCT2_GLOBAL(0x00F4340D, uint32) -= size_of_chunk; + RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_OBJECTS_FILE_SIZE, uint32) -= size_of_chunk; uint8 object_type = installedObject->flags & 0xF; RCT2_ADDRESS(0x00F433F7, uint16)[object_type]--; *selection_flags &= ~OBJECT_SELECTION_FLAG_SELECTED; @@ -1308,11 +1335,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct } if (no_objects <= RCT2_ADDRESS(0x00F433F7, uint16)[object_type]){ - RCT2_GLOBAL(0x141E9AC, uint16) = 3171; - if (bh != 0){ - // Bunch of code that looks like it does nothing removed. - reset_selected_object_count_and_size(); - } + set_object_selection_error(bh, 3171); return 0; } @@ -1338,7 +1361,6 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct for (; num_required_objects != 0; num_required_objects--){ if (!window_editor_object_selection_select_object(++bh, flags, required_objects)){ if (bh != 0){ - // Bunch of code that looks like it does nothing removed. reset_selected_object_count_and_size(); } return 0; @@ -1360,33 +1382,21 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct if (bh != 0 && !(flags&(1 << 1))){ RCT2_CALLPROC_X(0x6AB344, 0, 0, 0, 0, 0, (int)0x009BC95A, (int)installedObject); - RCT2_GLOBAL(0x141E9AC, uint16) = 3172; - if (bh != 0){ - // Bunch of code that looks like it does nothing removed. - reset_selected_object_count_and_size(); - } + set_object_selection_error(bh, 3172); return 0; } - if (RCT2_GLOBAL(0x00F4340D, uint32) + size_of_chunk > 0x40000){ - RCT2_GLOBAL(0x141E9AC, uint16) = 3170; - if (bh != 0){ - // Bunch of code that looks like it does nothing removed. - reset_selected_object_count_and_size(); - } + if (RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_OBJECTS_FILE_SIZE, uint32) + size_of_chunk > 0x40000){ + set_object_selection_error(bh, 3170); return 0; } if (no_objects <= RCT2_ADDRESS(0x00F433F7, uint16)[object_type]){ - RCT2_GLOBAL(0x141E9AC, uint16) = 3171; - if (bh != 0){ - // Bunch of code that looks like it does nothing removed. - reset_selected_object_count_and_size(); - } + set_object_selection_error(bh, 3171); return 0; } - RCT2_GLOBAL(0x00F4340D, uint32) += size_of_chunk; + RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_OBJECTS_FILE_SIZE, uint32) += size_of_chunk; RCT2_ADDRESS(0x00F433F7, uint16)[object_type]++; *selection_flags |= OBJECT_SELECTION_FLAG_SELECTED; From 468806337cefca65d3ebaea6cc9df2bb55aa6ce4 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Wed, 17 Jun 2015 19:51:41 +0100 Subject: [PATCH 0026/1173] Implement more of the setup functions. Fix bug in object counting. Split up required and optional objects. Corrected optional objects. --- src/windows/editor_object_selection.c | 245 +++++++++++++++++++++----- 1 file changed, 200 insertions(+), 45 deletions(-) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 55184d3799..09f754b951 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -166,8 +166,6 @@ static void window_editor_object_selection_paint(); static void window_editor_object_selection_scrollpaint(); static void window_editor_object_selection_textinput(); -void reset_selected_object_count_and_size(); - static void* window_editor_object_selection_events[] = { window_editor_object_selection_close, (void*)window_editor_object_selection_mouseup, @@ -204,6 +202,7 @@ static void* window_editor_object_selection_events[] = { static void window_editor_object_set_page(rct_window *w, int page); static void window_editor_object_selection_set_pressed_tab(rct_window *w); static void window_editor_object_selection_select_default_objects(); +static void window_editor_object_selection_select_required_objects(); static int window_editor_object_selection_select_object(uint8 bh, int flags, rct_object_entry *entry); static int get_object_from_object_selection(uint8 object_type, int y, uint8 *object_selection_flags, rct_object_entry **installed_entry); static void window_editor_object_selection_manage_tracks(); @@ -213,40 +212,46 @@ static bool filter_source(rct_object_entry *entry); static bool filter_chunks(rct_object_entry *entry, rct_object_filters *filter); static void filter_update_counts(); -static rct_object_entry DefaultSelectedObjects[] = { - // Objects that are always required - { 0x00000087, { "SCGTREES" }, 0 }, // Scenery: Trees - { 0x00000087, { "SCGSHRUB" }, 0 }, // Scenery: Shrubs and Ornaments - { 0x00000087, { "SCGGARDN" }, 0 }, // Scenery: Gardens - { 0x00000087, { "SCGFENCE" }, 0 }, // Scenery: Fences and Walls - { 0x00000087, { "SCGWALLS" }, 0 }, // Scenery: Walls and Roofs - { 0x00000087, { "SCGPATHX" }, 0 }, // Scenery: Signs and Items for Footpaths - { 0x00000085, { "TARMAC " }, 0 }, // Footpath: Tarmac +void reset_selected_object_count_and_size(); +void reset_required_object_flags(); +static int sub_6AB211(); +static rct_object_entry RequiredSelectedObjects[] = { + // Objects that are always required + { 0x00000087, { "SCGTREES" }, 0 }, // Scenery: Trees + { 0x00000087, { "SCGSHRUB" }, 0 }, // Scenery: Shrubs and Ornaments + { 0x00000087, { "SCGGARDN" }, 0 }, // Scenery: Gardens + { 0x00000087, { "SCGFENCE" }, 0 }, // Scenery: Fences and Walls + { 0x00000087, { "SCGWALLS" }, 0 }, // Scenery: Walls and Roofs + { 0x00000087, { "SCGPATHX" }, 0 }, // Scenery: Signs and Items for Footpaths + { 0x00000085, { "TARMAC " }, 0 }, // Footpath: Tarmac +}; + +static rct_object_entry DefaultSelectedObjects[] = { // An initial default selection - { 0x000080FF, { "TWIST1 " }, 0 }, // Ride: Twist - { 0x00008000, { "PTCT1 " }, 0 }, // Ride: Wooden Roller Coaster (Wooden Roller Coaster Trains) - { 0x00008000, { "ZLDB " }, 0 }, // Ride: Junior Roller Coaster (Ladybird Trains) - { 0x00008000, { "LFB1 " }, 0 }, // Ride: Log Flume - { 0x00008000, { "VCR " }, 0 }, // Ride: Vintage Cars - { 0x00008000, { "MGR1 " }, 0 }, // Ride: Merry-Go-Round - { 0x00008000, { "TLT1 " }, 0 }, // Ride: Restroom - { 0x00008000, { "ATM1 " }, 0 }, // Ride: Cash Machine - { 0x00008000, { "FAID1 " }, 0 }, // Ride: First Aid Room - { 0x00008000, { "INFOK " }, 0 }, // Ride: Information Kiosk - { 0x00008000, { "DRNKS " }, 0 }, // Ride: Drinks Stall - { 0x00008000, { "CNDYF " }, 0 }, // Ride: Cotten Candy Stall - { 0x00008000, { "BURGB " }, 0 }, // Ride: Burger Bar - { 0x00008000, { "BALLN " }, 0 }, // Ride: Balloon Stall - { 0x00008000, { "ARRT1 " }, 0 }, // Ride: Corkscrew Roller Coaster - { 0x00008000, { "RBOAT " }, 0 }, // Ride: Rowing Boats - { 0x00008800, { "PKENT1 " }, 0 }, // Park Entrace: Traditional Park Entrance - { 0x00008900, { "WTRCYAN " }, 0 }, // Water: Natural Water - { 0x00008500, { "TARMACB " }, 0 }, // Footpath: Brown Tarmac Footpath - { 0x00008500, { "PATHSPC " }, 0 }, // Footpath: Space Style Footpath - { 0x00008500, { "PATHDIR " }, 0 }, // Footpath: Dirt Footpath - { 0x00008500, { "PATHCRZ " }, 0 }, // Footpath: Crazy Paving Footpath - { 0x00008500, { "PATHASH " }, 0 }, // Footpath: Ash Footpath + { 0x00000080, { "TWIST1 " }, 0 }, // Ride: Twist + { 0x00000080, { "PTCT1 " }, 0 }, // Ride: Wooden Roller Coaster (Wooden Roller Coaster Trains) + { 0x00000080, { "ZLDB " }, 0 }, // Ride: Junior Roller Coaster (Ladybird Trains) + { 0x00000080, { "LFB1 " }, 0 }, // Ride: Log Flume + { 0x00000080, { "VCR " }, 0 }, // Ride: Vintage Cars + { 0x00000080, { "MGR1 " }, 0 }, // Ride: Merry-Go-Round + { 0x00000080, { "TLT1 " }, 0 }, // Ride: Restroom + { 0x00000080, { "ATM1 " }, 0 }, // Ride: Cash Machine + { 0x00000080, { "FAID1 " }, 0 }, // Ride: First Aid Room + { 0x00000080, { "INFOK " }, 0 }, // Ride: Information Kiosk + { 0x00000080, { "DRNKS " }, 0 }, // Ride: Drinks Stall + { 0x00000080, { "CNDYF " }, 0 }, // Ride: Cotten Candy Stall + { 0x00000080, { "BURGB " }, 0 }, // Ride: Burger Bar + { 0x00000080, { "BALLN " }, 0 }, // Ride: Balloon Stall + { 0x00000080, { "ARRT1 " }, 0 }, // Ride: Corkscrew Roller Coaster + { 0x00000080, { "RBOAT " }, 0 }, // Ride: Rowing Boats + { 0x00000088, { "PKENT1 " }, 0 }, // Park Entrace: Traditional Park Entrance + { 0x00000089, { "WTRCYAN " }, 0 }, // Water: Natural Water + { 0x00000085, { "TARMACB " }, 0 }, // Footpath: Brown Tarmac Footpath + { 0x00000085, { "PATHSPCE" }, 0 }, // Footpath: Space Style Footpath + { 0x00000085, { "PATHDIRT" }, 0 }, // Footpath: Dirt Footpath + { 0x00000085, { "PATHCRZY" }, 0 }, // Footpath: Crazy Paving Footpath + { 0x00000085, { "PATHASH " }, 0 }, // Footpath: Ash Footpath // The following are for all random map generation features to work out the box { 0x00000087, { "SCGJUNGL" }, 0 }, // Jungle Themeing @@ -266,13 +271,10 @@ void window_editor_object_selection_open() if (window != NULL) return; - RCT2_CALLPROC_EBPSAFE(0x006AB211); + if (!sub_6AB211()) + return; reset_selected_object_count_and_size(); - // Not really where its called, but easy way to change default objects for now - if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) - window_editor_object_selection_select_default_objects(); - window = window_create_centred( 600, 400, @@ -303,6 +305,126 @@ void window_editor_object_selection_open() window->var_494 = 0xFFFFFFFF; } +/* rct2: 0x006ABCD1 */ +static void setup_track_manager_objects(){ + uint8 ride_list[128] = { 0 }; + uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); + rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); + uint16 num_objects = 0; + + for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ + uint8 object_type = installedObject->flags & 0xF; + if (object_type == OBJECT_TYPE_RIDE){ + *selection_flags |= OBJECT_SELECTION_FLAG_6; + + uint8* pos = (uint8*)installedObject; + // Skip sizeof(rct_object_entry) + pos += 16; + + // Skip filename + while (*pos++); + + // Skip no of images + pos += 4; + + // Skip name + while (*pos++); + + // Skip size of chunk + pos += 4; + + // Skip required objects + pos += *pos * 16 + 1; + + // Skip theme objects + pos += *pos * 16 + 1; + + for (uint8 j = 0; j < 3; j++){ + uint8 ride_type = pos[j]; + if (ride_type == 0xFF) + continue; + + if (!(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride_type * 2] & + RIDE_TYPE_FLAG_HAS_TRACK)) + continue; + + if (pos[3] & (1 << 0)){ + *selection_flags &= ~OBJECT_SELECTION_FLAG_6; + } + else if (ride_list[ride_type] & (1 << 0)){ + continue; + } + else{ + ride_list[ride_type] |= (1 << 0); + *selection_flags &= ~OBJECT_SELECTION_FLAG_6; + } + num_objects++; + break; + } + } + + installedObject = object_get_next(installedObject); + selection_flags++; + } + + RCT2_GLOBAL(0x00F43412, uint16) = num_objects; +} + +/* rct2: 0x006ABC1E */ +static void setup_track_designer_objects(){ + uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); + rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); + uint16 num_objects = 0; + + for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ + uint8 object_type = installedObject->flags & 0xF; + if (object_type == OBJECT_TYPE_RIDE){ + *selection_flags |= OBJECT_SELECTION_FLAG_6; + + uint8* pos = (uint8*)installedObject; + // Skip sizeof(rct_object_entry) + pos += 16; + + // Skip filename + while (*pos++); + + // Skip no of images + pos += 4; + + // Skip name + while (*pos++); + + // Skip size of chunk + pos += 4; + + // Skip required objects + pos += *pos * 16 + 1; + + // Skip theme objects + pos += *pos * 16 + 1; + + for (uint8 j = 0; j < 3; j++){ + uint8 ride_type = pos[j]; + if (ride_type == 0xFF) + continue; + + if (!(RCT2_ADDRESS(0x0097D4F2, uint16)[ride_type * 4] & + (1 << 11))) + continue; + + *selection_flags &= ~OBJECT_SELECTION_FLAG_6; + num_objects++; + break; + } + } + + installedObject = object_get_next(installedObject); + selection_flags++; + } + + RCT2_GLOBAL(0x00F43412, uint16) = num_objects; +} + /* rct2: 0x006AB211 */ static int sub_6AB211(){ uint32 total_objects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); @@ -329,7 +451,28 @@ static int sub_6AB211(){ installedObject = object_get_next(installedObject); } - //0x6ab2c4 + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER){ + setup_track_designer_objects(); + } + + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER){ + setup_track_manager_objects(); + } + + RCT2_CALLPROC_EBPSAFE(0x006AA82B); + reset_selected_object_count_and_size(); + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER))){ + window_editor_object_selection_select_required_objects(); + + // To prevent it breaking in scenario mode. + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) + window_editor_object_selection_select_default_objects(); + } + + reset_required_object_flags(); + reset_selected_object_count_and_size(); + return 1; } /** @@ -1064,20 +1207,32 @@ static void window_editor_object_selection_set_pressed_tab(rct_window *w) } /** - * - * rct2: 0x006AA7E9 - */ +* +* rct2: 0x006AA805 +*/ static void window_editor_object_selection_select_default_objects() { int i; - if (RCT2_GLOBAL(0x00F433F7, uint16) == 0) + if (RCT2_GLOBAL(0x00F433F7, uint16) != 0) return; for (i = 0; i < countof(DefaultSelectedObjects); i++) window_editor_object_selection_select_object(0, 7, &DefaultSelectedObjects[i]); } +/** + * + * rct2: 0x006AA7E9 + */ +static void window_editor_object_selection_select_required_objects() +{ + int i; + + for (i = 0; i < countof(RequiredSelectedObjects); i++) + window_editor_object_selection_select_object(0, 0xF, &RequiredSelectedObjects[i]); +} + /* rct2: 0x006AA770 */ void reset_selected_object_count_and_size(){ for (uint8 object_type = 0; object_type < 11; object_type++){ @@ -1107,7 +1262,7 @@ void reset_selected_object_count_and_size(){ while (*pos++); uint32 size_of_chunk = *((uint32*)pos); - RCT2_ADDRESS(0x00F443F7, uint16)[object_type]++; + RCT2_ADDRESS(0x00F433F7, uint16)[object_type]++; total_object_size += size_of_chunk; } selection_flags++; From 07752aa1b416c704e383478e2684ecf9d6772565 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Wed, 17 Jun 2015 20:06:42 +0100 Subject: [PATCH 0027/1173] Implemented free object selection flags --- src/windows/editor_object_selection.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 09f754b951..b53495aa62 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -475,6 +475,15 @@ static int sub_6AB211(){ return 1; } +/* rct2: 0x006AB316 */ +static void editor_object_flags_free(){ + if (RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*) == NULL){ + return; + } + free(RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*)); + RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*) = NULL; +} + /** * * rct2: 0x006AB199 @@ -491,7 +500,8 @@ static void window_editor_object_selection_close() editor_load_selected_objects(); reset_loaded_objects(); object_free_scenario_text(); - RCT2_CALLPROC_EBPSAFE(0x6AB316); + editor_object_flags_free(); + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_EDITOR) { research_populate_list_random(); research_remove_non_separate_vehicle_types(); From d67d9349b9fa94c455652e4bd1836fa45b28935b Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Thu, 18 Jun 2015 18:15:31 +0100 Subject: [PATCH 0028/1173] Implement setup in use selection flags. --- src/windows/editor_object_selection.c | 101 +++++++++++++++++++++++++- 1 file changed, 100 insertions(+), 1 deletion(-) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index b53495aa62..8073955c87 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -425,6 +425,105 @@ static void setup_track_designer_objects(){ RCT2_GLOBAL(0x00F43412, uint16) = num_objects; } +/* rct2: 0x006AA82B */ +static void setup_in_use_selection_flags(){ + + for (uint8 object_type = 0; object_type < 11; object_type++){ + for (uint16 i = 0; i < object_entry_group_counts[object_type]; i++){ + RCT2_ADDRESS(0x0098DA38, uint8*)[object_type][i] = 0; + } + } + + for (uint8 object_type = 0; object_type < 11; object_type++){ + for (uint16 i = 0; i < object_entry_group_counts[object_type]; i++){ + if (object_entry_groups[object_type].chunks[i] != (uint8*)0xFFFFFFFF){ + RCT2_ADDRESS(0x0098DA38, uint8*)[object_type][i] |= (1 << 1); + } + } + } + + map_element_iterator iter; + map_element_iterator_begin(&iter); + do { + uint16 type; + uint8 path_additions; + rct_banner* banner; + + switch (map_element_get_type(iter.element)) { + default: + case MAP_ELEMENT_TYPE_SURFACE: + case MAP_ELEMENT_TYPE_TRACK: + break; + case MAP_ELEMENT_TYPE_PATH: + type = iter.element->properties.path.type; + RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_PATHS][type] |= (1 << 0); + + path_additions = iter.element->properties.path.additions & 0xF; + if (path_additions){ + path_additions--; + RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_PATH_BITS][path_additions] |= (1 << 0); + } + break; + case MAP_ELEMENT_TYPE_SCENERY: + type = iter.element->properties.scenery.type; + RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_SMALL_SCENERY][type] |= (1 << 0); + break; + case MAP_ELEMENT_TYPE_ENTRANCE: + if (iter.element->properties.entrance.type != ENTRANCE_TYPE_PARK_ENTRANCE) + break; + + RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_PARK_ENTRANCE][0] |= (1 << 0); + + type = iter.element->properties.entrance.path_type; + RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_PATHS][type] |= (1 << 0); + break; + case MAP_ELEMENT_TYPE_FENCE: + type = iter.element->properties.fence.type; + RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_WALLS][type] |= (1 << 0); + break; + case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: + type = iter.element->properties.scenerymultiple.type & 0x3FF; + RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_LARGE_SCENERY][type] |= (1 << 0); + break; + case MAP_ELEMENT_TYPE_BANNER: + banner = &gBanners[iter.element->properties.banner.index]; + type = banner->type; + RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_BANNERS][type] |= (1 << 0); + break; + } + } while (map_element_iterator_next(&iter)); + + for (uint8 ride_index = 0; ride_index < 0xFF; ride_index++){ + rct_ride* ride = GET_RIDE(ride_index); + if (ride->type == RIDE_TYPE_NULL) + continue; + + uint8 type = ride->subtype; + RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_RIDE][type] |= (1 << 0); + } + + uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); + rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); + + for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ + *selection_flags &= ~OBJECT_SELECTION_FLAG_IN_USE; + + uint8 entry_type, entry_index; + if (find_object_in_entry_group(installedObject, &entry_type, &entry_index)){ + if (RCT2_ADDRESS(0x0098DA38, uint8*)[entry_type][entry_index] & (1 << 0)){ + *selection_flags |= + OBJECT_SELECTION_FLAG_IN_USE | + OBJECT_SELECTION_FLAG_SELECTED; + } + if (RCT2_ADDRESS(0x0098DA38, uint8*)[entry_type][entry_index] & (1 << 1)){ + *selection_flags |= OBJECT_SELECTION_FLAG_SELECTED; + } + } + installedObject = object_get_next(installedObject); + selection_flags++; + } +} + /* rct2: 0x006AB211 */ static int sub_6AB211(){ uint32 total_objects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); @@ -459,7 +558,7 @@ static int sub_6AB211(){ setup_track_manager_objects(); } - RCT2_CALLPROC_EBPSAFE(0x006AA82B); + setup_in_use_selection_flags(); reset_selected_object_count_and_size(); if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER))){ From 15b2360e130465d4179b418dae0b5472204319cb Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Fri, 19 Jun 2015 19:11:23 +0100 Subject: [PATCH 0029/1173] Implemented object_create_identifier_name and start of last func. Note requires modification of the strings. --- data/language/english_uk.txt | 2 +- src/object.h | 1 + src/object_list.c | 26 ++++++++++++++++++++- src/windows/editor_object_selection.c | 33 ++++++++++++++++++++++++++- 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 0faa5a9dad..e6683e72b9 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3176,7 +3176,7 @@ STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} STR_3169 :Data for the following object not found: STR_3170 :Not enough space for graphics STR_3171 :Too many objects of this type selected -STR_3172 :The following object must be selected first: +STR_3172 :The following object must be selected first: {STRING} STR_3173 :This object is currently in use STR_3174 :This object is required by another object STR_3175 :This object is always required diff --git a/src/object.h b/src/object.h index 9cc6e71969..cf5b735d61 100644 --- a/src/object.h +++ b/src/object.h @@ -112,6 +112,7 @@ rct_object_entry *object_get_next(rct_object_entry *entry); int write_object_file(FILE *file, rct_object_entry* entry); void reset_loaded_objects(); int find_object_in_entry_group(rct_object_entry* entry, uint8* entry_type, uint8* entry_index); +void object_create_identifier_name(uint8* string_buffer, rct_object_entry* object); rct_object_entry *object_list_find(rct_object_entry *entry); diff --git a/src/object_list.c b/src/object_list.c index 7c11b55a7b..e1493345ac 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -451,6 +451,30 @@ int check_object_entry(rct_object_entry *entry) return (0xFFFFFFFF & dwords[0] & dwords[1] & dwords[2] & dwords[3]) + 1 != 0; } +/* rct2: 0x006AB344 */ +void object_create_identifier_name(uint8* string_buffer, rct_object_entry* object){ + for (uint8 i = 0; i < 8; ++i){ + if (object->name[i] != ' '){ + *string_buffer++ = object->name[i]; + } + } + + *string_buffer++ = '/'; + + for (uint8 i = 0; i < 4; ++i){ + uint8 flag_part = (object->flags >> (i * 8)) & 0xFF; + *string_buffer++ = RCT2_ADDRESS(0x0098DA64, uint8)[flag_part >> 4]; + *string_buffer++ = RCT2_ADDRESS(0x0098DA64, uint8)[flag_part & 0xF]; + } + + for (uint8 i = 0; i < 4; ++i){ + uint8 checksum_part = (object->checksum >> (i * 8)) & 0xFF; + *string_buffer++ = RCT2_ADDRESS(0x0098DA64, uint8)[checksum_part >> 4]; + *string_buffer++ = RCT2_ADDRESS(0x0098DA64, uint8)[checksum_part & 0xF]; + } + *string_buffer++ = '\0'; +} + /* rct2: 0x675827 */ void set_load_objects_fail_reason(){ rct_object_entry* object = RCT2_ADDRESS(0x13CE952, rct_object_entry); @@ -463,7 +487,7 @@ void set_load_objects_fail_reason(){ format_string(string_buffer, 3323, 0); //Missing object data, ID: - RCT2_CALLPROC_X(0x6AB344, 0, 0, 0, 0, 0, (int)string_buffer, 0x13CE952); + object_create_identifier_name(string_buffer, object); RCT2_GLOBAL(RCT2_ADDRESS_ERROR_TYPE, uint8) = 0xFF; RCT2_GLOBAL(RCT2_ADDRESS_ERROR_STRING_ID, uint16) = 3165; return; diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 8073955c87..7a3783ac4b 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -583,6 +583,35 @@ static void editor_object_flags_free(){ RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*) = NULL; } +/* rct2: 0x00685791 */ +void sub_685791(rct_object_entry* installedObject){ + uint8 entry_type, entry_index; + if (!find_object_in_entry_group(installedObject, entry_type, entry_index)) + return; + + if (entry_type == OBJECT_TYPE_RIDE){ + //6857af + } + else if (entry_type == OBJECT_TYPE_SCENERY_SETS){ + //6857a5 + } +} + +/* rct2: 0x006ABB66 */ +void sub_6ABB66(){ + uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); + rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); + + for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ + if (*selection_flags & OBJECT_SELECTION_FLAG_SELECTED){ + sub_685791(installedObject); + object_unload(0, installedObject); + } + selection_flags++; + installedObject = object_get_next(installedObject); + } +} + /** * * rct2: 0x006AB199 @@ -1645,7 +1674,9 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct } if (bh != 0 && !(flags&(1 << 1))){ - RCT2_CALLPROC_X(0x6AB344, 0, 0, 0, 0, 0, (int)0x009BC95A, (int)installedObject); + uint32* arguments = RCT2_ADDRESS(0x0013CE952, uint32); + object_create_identifier_name((char*)0x009BC95A, installedObject); + *arguments = (uint32)0x009BC95A; set_object_selection_error(bh, 3172); return 0; } From 895d4a81e431e223a63b7ed5c1c261b4a08d58c9 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Fri, 19 Jun 2015 21:33:37 +0100 Subject: [PATCH 0030/1173] finish implementing remove_selected_objects_from_research Fixed bug due to freeing rct2 memory. --- src/management/research.c | 12 ++++++++++++ src/management/research.h | 1 + src/windows/editor_object_selection.c | 21 ++++++++++++--------- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/management/research.c b/src/management/research.c index f44ed4c5b2..383c21750a 100644 --- a/src/management/research.c +++ b/src/management/research.c @@ -434,6 +434,18 @@ static void research_insert_researched(int entryIndex, int category) } while (entryIndex != (researchItem++)->entryIndex); } +/* rct2: 0x006857CF */ +void research_remove(sint32 entryIndex){ + for (rct_research_item *researchItem = gResearchItems; researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++){ + if (researchItem->entryIndex == entryIndex){ + do{ + *researchItem = *(researchItem + 1); + } while (researchItem++->entryIndex != RESEARCHED_ITEMS_END_2); + return; + } + } +} + void research_insert(int researched, int entryIndex, int category) { if (researched) diff --git a/src/management/research.h b/src/management/research.h index e26725b6db..f2a0d4b3f6 100644 --- a/src/management/research.h +++ b/src/management/research.h @@ -83,5 +83,6 @@ void research_set_priority(int activeCategories); void game_command_set_research_funding(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void research_finish_item(sint32 entryIndex); void research_insert(int researched, int entryIndex, int category); +void research_remove(sint32 entryIndex); #endif \ No newline at end of file diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 7a3783ac4b..68a6c4cbc9 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -579,33 +579,36 @@ static void editor_object_flags_free(){ if (RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*) == NULL){ return; } - free(RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*)); + rct2_free(RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*)); RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*) = NULL; } /* rct2: 0x00685791 */ -void sub_685791(rct_object_entry* installedObject){ +void remove_selected_objects_from_research(rct_object_entry* installedObject){ uint8 entry_type, entry_index; - if (!find_object_in_entry_group(installedObject, entry_type, entry_index)) + if (!find_object_in_entry_group(installedObject, &entry_type, &entry_index)) return; if (entry_type == OBJECT_TYPE_RIDE){ - //6857af + rct_ride_type* rideEntry = (rct_ride_type*)object_entry_groups[entry_type].chunks[entry_index]; + research_remove(entry_index | rideEntry->ride_type[0] << 8 | 0x10000); + research_remove(entry_index | rideEntry->ride_type[1] << 8 | 0x10000); + research_remove(entry_index | rideEntry->ride_type[2] << 8 | 0x10000); } else if (entry_type == OBJECT_TYPE_SCENERY_SETS){ - //6857a5 + research_remove(entry_index); } } /* rct2: 0x006ABB66 */ -void sub_6ABB66(){ +void unload_selected_objects(){ uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ if (*selection_flags & OBJECT_SELECTION_FLAG_SELECTED){ - sub_685791(installedObject); - object_unload(0, installedObject); + remove_selected_objects_from_research(installedObject); + object_unload(0, (rct_object_entry_extended*)installedObject); } selection_flags++; installedObject = object_get_next(installedObject); @@ -624,7 +627,7 @@ static void window_editor_object_selection_close() //if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_EDITOR)) // return; - RCT2_CALLPROC_EBPSAFE(0x6ABB66); + unload_selected_objects(); editor_load_selected_objects(); reset_loaded_objects(); object_free_scenario_text(); From 218b6545377c6880efd46c6c9b2b1f3602960760 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 20 Jun 2015 04:00:16 +0100 Subject: [PATCH 0031/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/german.txt | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/data/language/german.txt b/data/language/german.txt index f6561277c7..5dc14bdf30 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -1817,7 +1817,7 @@ STR_1812 :{SMALLFONT}{BLACK}{STRINGID} STR_1813 :Verschiedene Objekte STR_1814 :Aktionen STR_1815 :Gedanken -STR_1816 :{SMALLFONT}{BLACK}Informationsart auswählen, die in Besucherliste angezeigt werden soll +STR_1816 :{SMALLFONT}{BLACK}Informationsart auswählen,{NEWLINE}die in Besucherliste angezeigt{NEWLINE}werden soll STR_1817 :({COMMA16}) STR_1818 :{WINDOW_COLOUR_2}Alle Besucher STR_1819 :{WINDOW_COLOUR_2}Alle Besucher (zusammengefasst) @@ -1845,7 +1845,7 @@ STR_1840 :Ausfallzeit: {COMMA16}% STR_1841 :Gewinn: {CURRENCY2DP} pro Stunde STR_1842 :Favorit von: {COMMA16} Besucher STR_1843 :Favorit von: {COMMA16} Besuchern -STR_1844 :{SMALLFONT}{BLACK}Informationsart auswählen, die in Attraktionsliste angezeigt werden soll +STR_1844 :{SMALLFONT}{BLACK}Informationsart auswählen,{NEWLINE}die in Attraktionsliste angezeigt{NEWLINE}werden soll STR_1845 :{MONTHYEAR} STR_1846 :{COMMA16} Besucher STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} Besucher @@ -1948,7 +1948,7 @@ STR_1943 :{SMALLFONT}{BLACK}Aktuelle Gedanken dieses Besuchers anzeigen STR_1944 :{SMALLFONT}{BLACK}Objekte anzeigen, die der Besucher bei sich trägt STR_1945 :{SMALLFONT}{BLACK}Anweisungen und Optionen für diesen Mitarbeiter anzeigen STR_1946 :{SMALLFONT}{BLACK}Kostüm für diesen Animateur auswählen -STR_1947 :{SMALLFONT}{BLACK}Vom Mitarbeitertyp abgelaufene Bereiche anzeigen und den nächsten Mitarbeiter suchen +STR_1947 :{SMALLFONT}{BLACK}Vom Mitarbeitertyp abgelaufene{NEWLINE}Bereiche anzeigen und den nächsten{NEWLINE}Mitarbeiter suchen STR_1948 :{SMALLFONT}{BLACK}Neuen Mitarbeiter für den ausgewählten Typ einstellen STR_1949 :Finanzübersicht STR_1950 :Finanzdiagramm @@ -2988,12 +2988,12 @@ STR_2979 :Dieser Mitarbeiter kann nicht benannt werden... STR_2980 :Zu viele Banner im Spiel STR_2981 :{RED}Kein Zutritt - - STR_2982 :Bannertext -STR_2983 :Neuen Text für diesen Banner eingeben: -STR_2984 :Neuer Text für den Banner kann nicht erstellt werden... +STR_2983 :Neuen Text für dieses Banner eingeben: +STR_2984 :Neuer Text für das Banner kann nicht erstellt werden... STR_2985 :Banner STR_2986 :{SMALLFONT}{BLACK}Text auf Banner ändern -STR_2987 :{SMALLFONT}{BLACK}Legen Sie diesen Banner als `Kein Zutritt'-Schild für Besucher fest -STR_2988 :{SMALLFONT}{BLACK}Diesen Banner abreißen +STR_2987 :{SMALLFONT}{BLACK}Legen Sie dieses Banner als{NEWLINE}`Kein Zutritt'-Schild für{NEWLINE}Besucher fest +STR_2988 :{SMALLFONT}{BLACK}Dieses Banner abreißen STR_2989 :{SMALLFONT}{BLACK}Hauptfarbe auswählen STR_2990 :{SMALLFONT}{BLACK}Textfarbe auswählen STR_2991 :Schild @@ -3077,7 +3077,7 @@ STR_3068 :Andere Parks STR_3069 :Oberster Abschnitt STR_3070 :Neigung auf Ebene STR_3071 :{WINDOW_COLOUR_2}Gleicher Preis im ganzen Park -STR_3072 :{SMALLFONT}{BLACK}Bestimmen Sie, ob dieser Preis im gesamten Park gilt +STR_3072 :{SMALLFONT}{BLACK}Bestimmen Sie, ob dieser Preis{NEWLINE}im gesamten Park gilt STR_3073 :{RED}WARNUNG: Ihre Parkbewertung ist unter den Wert 700 gefallen!{NEWLINE}Wenn Sie die Parkbewertung innerhalb 4 Wochen nicht erhöhen, wird der Park geschlossen STR_3074 :{RED}WARNUNG: Ihre Parkbewertung liegt immer noch unter dem Wert 700!{NEWLINE}Sie haben noch 3 Wochen Zeit, um die Parkbewertung zu erhöhen STR_3075 :{RED}WARNUNG: Ihre Parkbewertung liegt immer noch unter dem Wert 700!{NEWLINE}Sie haben noch 2 Wochen Zeit, um die Parkbewertung zu erhöhen, oder Ihr Park wird geschlossen @@ -3111,7 +3111,7 @@ STR_3102 :{SMALLFONT}{BLACK}Farbige Szenerie auf Gelände neu streichen STR_3103 :Dies kann nicht neu gestrichen werden... STR_3104 :{SMALLFONT}{BLACK}Bahnen auflisten STR_3105 :{SMALLFONT}{BLACK}Läden und Stände auflisten -STR_3106 :{SMALLFONT}{BLACK}Informationskiosks und andere Besuchereinrichtungen auflisten +STR_3106 :{SMALLFONT}{BLACK}Informationsstände und andere Besuchereinrichtungen auflisten STR_3107 :Schließen STR_3108 :Testen STR_3109 :Öffnen @@ -3125,7 +3125,7 @@ STR_3116 :{SMALLFONT}{BLACK}Streckenentwurf speichern (erst möglich, wenn di STR_3117 :{BLACK}Mechaniker rufen... STR_3118 :{BLACK}{STRINGID} geht zur Bahn STR_3119 :{BLACK}{STRINGID} repariert die Bahn -STR_3120 :{SMALLFONT}{BLACK}Nächsten verfügbaren Mechaniker oder Mechaniker bei einer Bahnreparatur suchen +STR_3120 :{SMALLFONT}{BLACK}Nächsten verfügbaren Mechaniker{NEWLINE}oder Mechaniker bei einer{NEWLINE}Bahnreparatur suchen STR_3121 :Örtlicher Mechaniker kann nicht gefunden werden, oder alle Mechaniker sind gerade beschäftigt STR_3122 :{WINDOW_COLOUR_2}Lieblingsbahn von: {BLACK}{COMMA16} Besucher STR_3123 :{WINDOW_COLOUR_2}Lieblingsbahn von: {BLACK}{COMMA16} Besuchern @@ -3230,7 +3230,7 @@ STR_3221 :{SMALLFONT}{BLACK}Legen Sie das Gelände fest, das dem Park gehöre STR_3222 :{SMALLFONT}{BLACK}Wählen Sie die Baurechte aus, die exklusiv dem Park gehören sollen STR_3223 :{SMALLFONT}{BLACK}Legen Sie das Gelände fest, das vom Park gekauft werden kann STR_3224 :{SMALLFONT}{BLACK}Legen Sie die Baurechte fest, die vom Park erworben werden können -STR_3225 :{SMALLFONT}{BLACK}Bau einer zufälligen Objektgruppe um ausgewählte Position herum ein-/ausschalten +STR_3225 :{SMALLFONT}{BLACK}Bau einer zufälligen Objektgruppe{NEWLINE}um ausgewählte Position herum ein-/ausschalten STR_3226 :{SMALLFONT}{BLACK}Parkeingang bauen STR_3227 :Zu viele Parkeingänge! STR_3228 :{SMALLFONT}{BLACK}Legen Sie die Startpositionen für Personen fest @@ -3491,8 +3491,8 @@ STR_5154 :Anzeige über Hardware durchführen STR_5155 :Testen unfertiger Bahnen erlauben STR_5156 :{SMALLFONT}{BLACK}Erlaubt das Testen der meisten Bahnarten, selbst wenn die Strecke nicht fertiggestellt ist, das gilt nicht für den Streckenmodus mit Blockbereichen STR_5157 :Alle Preise freischalten -STR_5158 :Spiel Beenden -STR_5159 :OpenRCT2 Beenden +STR_5158 :Spiel beenden +STR_5159 :OpenRCT2 beenden STR_5160 :{MONTH} {STRINGID}, Jahr {COMMA16} STR_5161 :Datumsformat: STR_5162 :Tag/Monat/Jahr @@ -3702,3 +3702,5 @@ STR_5365 :{BLACK}Personalgeschw.: STR_5366 :Normal STR_5367 :Schnell STR_5368 :Unfallstatus entf. +STR_5369 :Parkparameter... +STR_5370 :{SMALLFONT}{BLACK}Klicken Sie diese Schaltfläche um Parkparameter, wie Einschränkungen, Besuchergenerierung und Geld,{NEWLINE}zu bearbeiten From 4d4a000117105ef17bc816ca7540564a59bde85e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 20 Jun 2015 15:07:36 +0100 Subject: [PATCH 0032/1173] add object selection to debug dropdown --- data/language/english_uk.txt | 1 + src/localisation/string_ids.h | 2 ++ src/windows/top_toolbar.c | 10 ++++++++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index e6683e72b9..d36b4912e4 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3704,3 +3704,4 @@ STR_5367 :Fast STR_5368 :Reset crash status STR_5369 :Park parameters... STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. +STR_5371 :Object Selection \ No newline at end of file diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 199cea90fd..139104e3a2 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1510,6 +1510,8 @@ enum { STR_DEBUG_TIP = 5311, STR_DEBUG_DROPDOWN_CONSOLE = 5312, STR_DEBUG_DROPDOWN_TILE_INSPECTOR = 5313, + STR_DEBUG_DROPDOWN_OBJECT_SELECTION = 5371, + STR_TILE_INSPECTOR_TITLE = 5314, STR_TILE_INSPECTOR_TERRAIN_START = 5315, STR_TILE_INSPECTOR_TERRAIN_EDGE_START = 5331, diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 7079828796..23e9e336f3 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -97,7 +97,8 @@ typedef enum { typedef enum { DDIDX_CONSOLE = 0, - DDIDX_TILE_INSPECTOR = 1 + DDIDX_TILE_INSPECTOR = 1, + DDIDX_OBJECT_SELECTION = 2 } TOP_TOOLBAR_DEBUG_DDIDX; #pragma region Toolbar_widget_ordering @@ -2779,6 +2780,7 @@ void top_toolbar_fastforward_menu_dropdown(short dropdownIndex) { void top_toolbar_init_debug_menu(rct_window* w, rct_widget* widget) { gDropdownItemsFormat[0] = STR_DEBUG_DROPDOWN_CONSOLE; gDropdownItemsFormat[1] = STR_DEBUG_DROPDOWN_TILE_INSPECTOR; + gDropdownItemsFormat[2] = STR_DEBUG_DROPDOWN_OBJECT_SELECTION; window_dropdown_show_text( w->x + widget->left, @@ -2786,7 +2788,7 @@ void top_toolbar_init_debug_menu(rct_window* w, rct_widget* widget) { widget->bottom - widget->top + 1, w->colours[1] | 0x80, 0, - 2 + 3 ); RCT2_GLOBAL(0x9DEBA2, uint16) = 0; @@ -2803,6 +2805,10 @@ void top_toolbar_debug_menu_dropdown(short dropdownIndex) { case DDIDX_TILE_INSPECTOR: window_tile_inspector_open(); break; + case DDIDX_OBJECT_SELECTION: + window_close_all(); + window_editor_object_selection_open(); + break; } } } From b8eab9ec9388fc5df01037290db51e2dade21abe Mon Sep 17 00:00:00 2001 From: Thomas Date: Sat, 20 Jun 2015 16:31:06 +0200 Subject: [PATCH 0033/1173] Add path abbreviation for load/save window --- src/windows/loadsave.c | 52 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 63228e7153..a95720fc4d 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -78,7 +78,7 @@ static void* window_loadsave_events[] = { window_loadsave_emptysub, window_loadsave_emptysub, window_loadsave_emptysub, - window_loadsave_update, + window_loadsave_emptysub, window_loadsave_emptysub, window_loadsave_emptysub, window_loadsave_emptysub, @@ -112,6 +112,7 @@ typedef struct { int _listItemsCount = 0; loadsave_list_item *_listItems = NULL; char _directory[MAX_PATH]; +char _shortenedDirectory[MAX_PATH]; char _extension[32]; char *_defaultName = NULL; int _loadsaveType; @@ -122,6 +123,8 @@ static void window_loadsave_select(rct_window *w, const char *path); static int has_extension(char *path, char *extension); +static void shorten_path(char* path, char* buffer, int available_width); + static rct_window *window_overwrite_prompt_open(const char *name, const char *path); rct_window *window_loadsave_open(int type, char *defaultName) @@ -307,11 +310,6 @@ static int has_extension(char *path, char *extension) return 1; } -static void window_loadsave_update(rct_window *w) -{ - -} - static void window_loadsave_scrollgetsize() { rct_window *w; @@ -442,14 +440,53 @@ static void window_loadsave_paint() window_draw_widgets(w, dpi); + if (_shortenedDirectory[0] == '\0') + shorten_path(_directory, _shortenedDirectory, w->width - 8); + char buffer[256]; // Format text - sprintf(buffer, "%c%c%s", FORMAT_MEDIUMFONT, FORMAT_BLACK, _directory); + sprintf(buffer, "%c%c%s", FORMAT_MEDIUMFONT, FORMAT_BLACK, _shortenedDirectory); // Draw shadow gfx_draw_string(dpi, buffer, 0, w->x + 4, w->y + 20); } +static void shorten_path(char* path, char* buffer, int available_width){ + puts("Shortening"); + int length = strlen(path); + + // Return full string if it fits + if (gfx_get_string_width(path) <= available_width){ + strcpy(buffer, path); + return; + } + + // Count path seperators + int path_seperators = 0; + for (int x = 0; x < length; x++) + if (path[x] == platform_get_path_separator()) + path_seperators++; + + // TODO: Replace with unicode ellipsis when supported + strcpy(buffer, "..."); + + // Abreviate beginning with xth seperator + + int begin = -1; + for (int x = 0; x < path_seperators; x++){ + do { + begin++; + } while (path[begin] != platform_get_path_separator()); + + strcpy(buffer + 3, path + begin); + if (gfx_get_string_width(buffer) <= available_width) + return; + } + + strcpy(buffer, path); + return; +} + static void window_loadsave_scrollpaint() { int i, y; @@ -509,6 +546,7 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co strncpy(_directory, directory, sizeof(_directory)); strncpy(_extension, extension, sizeof(_extension)); + _shortenedDirectory[0] = '\0'; strncpy(filter, directory, sizeof(filter)); strncat(filter, "*", sizeof(filter)); From cb89f040b4f30401dffe3e8181564bff4fc50ca7 Mon Sep 17 00:00:00 2001 From: Thomas Date: Sat, 20 Jun 2015 16:42:34 +0200 Subject: [PATCH 0034/1173] Remove debugging --- src/windows/loadsave.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index a95720fc4d..88e4662520 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -452,7 +452,6 @@ static void window_loadsave_paint() } static void shorten_path(char* path, char* buffer, int available_width){ - puts("Shortening"); int length = strlen(path); // Return full string if it fits From 18f33f806c9bc3cb82c403c6f8d12b0379673757 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 20 Jun 2015 16:24:38 +0100 Subject: [PATCH 0035/1173] implement sub_68ADBC --- src/interface/viewport.h | 2 + src/interface/viewport_interaction.c | 3 +- src/world/map.c | 92 +++++++++++++++++++++++++++- src/world/park.h | 2 + 4 files changed, 95 insertions(+), 4 deletions(-) diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 7dcf3243fc..eae091355d 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -123,4 +123,6 @@ int viewport_interaction_right_over(int x, int y); int viewport_interaction_right_click(int x, int y); void sub_68A15E(int screenX, int screenY, short *x, short *y, int *direction, rct_map_element **mapElement); +void viewport_interaction_remove_park_entrance(rct_map_element *mapElement, int x, int y); + #endif diff --git a/src/interface/viewport_interaction.c b/src/interface/viewport_interaction.c index 3e0e049945..e9e5592fed 100644 --- a/src/interface/viewport_interaction.c +++ b/src/interface/viewport_interaction.c @@ -36,7 +36,6 @@ static void viewport_interaction_remove_scenery(rct_map_element *mapElement, int x, int y); static void viewport_interaction_remove_footpath(rct_map_element *mapElement, int x, int y); static void viewport_interaction_remove_footpath_item(rct_map_element *mapElement, int x, int y); -static void viewport_interaction_remove_park_entrance(rct_map_element *mapElement, int x, int y); static void viewport_interaction_remove_park_wall(rct_map_element *mapElement, int x, int y); static void viewport_interaction_remove_large_scenery(rct_map_element *mapElement, int x, int y); static rct_peep *viewport_interaction_get_closest_peep(int x, int y, int maxDistance); @@ -456,7 +455,7 @@ static void viewport_interaction_remove_footpath_item(rct_map_element *mapElemen * * rct2: 0x00666C0E */ -static void viewport_interaction_remove_park_entrance(rct_map_element *mapElement, int x, int y) +void viewport_interaction_remove_park_entrance(rct_map_element *mapElement, int x, int y) { int rotation = (mapElement->type + 1) & 3; switch (mapElement->properties.entrance.index & 0x0F) { diff --git a/src/world/map.c b/src/world/map.c index d3ee3724ed..404ec3d2d3 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -62,6 +62,8 @@ static void tiles_init(); static void sub_6A87BB(int x, int y); static void map_update_grass_length(int x, int y, rct_map_element *mapElement); static void map_set_grass_length(int x, int y, rct_map_element *mapElement, int length); +static void sub_68ADBC(); +static void sub_68AE2A(int x, int y); void rotate_map_coordinates(sint16* x, sint16* y, uint8 rotation){ int temp; @@ -261,8 +263,7 @@ void map_init(int size) RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, sint16) = size * 32 - 33; RCT2_GLOBAL(0x01359208, sint16) = 7; map_update_tile_pointers(); - RCT2_CALLPROC_EBPSAFE(0x0068ADBC); - + sub_68ADBC(); climate_reset(CLIMATE_WARM); } @@ -2701,4 +2702,91 @@ void map_element_remove_banner_entry(rct_map_element *mapElement) banner->type = BANNER_NULL; user_string_free(banner->string_idx); } +} + +static void sub_68ADBC() +{ + int mapMaxXY = RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16); + + for (int y = 0; y < (256 * 32); y += 32) { + for (int x = 0; x < (256 * 32); x += 32) { + if (x == 0 || y == 0 || x >= mapMaxXY || y >= mapMaxXY) { + sub_68AE2A(x, y); + } else if (x >= mapMaxXY - 32 || y >= mapMaxXY - 32) { + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) += 32; + map_buy_land_rights(x, y, x, y, 6, GAME_COMMAND_FLAG_APPLY); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) -= 32; + } + } + } +} + +static void sub_68AE2A(int x, int y) +{ + for (;;) { + rct2_peep_spawn *peepSpawns = RCT2_ADDRESS(RCT2_ADDRESS_PEEP_SPAWNS, rct2_peep_spawn); + for (int i = 0; i < 2; i++) { + if ((peepSpawns[i].x & 0xFFE0) == x && (peepSpawns[i].y & 0xFFE0) == y) { + peepSpawns[i].x = 0xFFFF; + } + } + + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + next_element: + switch (map_element_get_type(mapElement)) { + case MAP_ELEMENT_TYPE_SURFACE: + mapElement->base_height = 2; + mapElement->clearance_height = 2; + mapElement->properties.surface.slope = 0; + mapElement->properties.surface.terrain = 0; + mapElement->properties.surface.grass_length = 1; + mapElement->properties.surface.ownership = 0; + if (!map_element_is_last_for_tile(mapElement++)) + goto next_element; + + return; + case MAP_ELEMENT_TYPE_ENTRANCE: + viewport_interaction_remove_park_entrance(mapElement, x, y); + break; + case MAP_ELEMENT_TYPE_FENCE: + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_REMOVE_THIS; + game_do_command( + x, + GAME_COMMAND_FLAG_APPLY, + y, + (mapElement->type & MAP_ELEMENT_DIRECTION_MASK) | (mapElement->base_height << 8), + GAME_COMMAND_REMOVE_FENCE, + 0, + 0 + ); + break; + case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_REMOVE_THIS; + game_do_command( + x, + (GAME_COMMAND_FLAG_APPLY) | (mapElement->type & MAP_ELEMENT_DIRECTION_MASK), + y, + (mapElement->base_height) | (((mapElement->properties.scenerymultiple.type >> 8) >> 2) << 8), + GAME_COMMAND_REMOVE_LARGE_SCENERY, + 0, + 0 + ); + break; + case MAP_ELEMENT_TYPE_BANNER: + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_REMOVE_THIS; + game_do_command( + x, + GAME_COMMAND_FLAG_APPLY, + y, + (mapElement->base_height) | ((mapElement->properties.banner.position & 3) << 8), + GAME_COMMAND_REMOVE_BANNER, + 0, + 0 + ); + break; + default: + map_element_remove(mapElement); + break; + } + } } \ No newline at end of file diff --git a/src/world/park.h b/src/world/park.h index 3bdab3fc5e..ac00a55048 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -66,6 +66,8 @@ int park_get_entrance_index(int x, int y, int z); void park_set_name(const char *name); void park_set_entrance_fee(money32 value); +int map_buy_land_rights(int x0, int y0, int x1, int y1, int setting, int flags); + void game_command_set_park_entrance_fee(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_park_open(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_remove_park_entrance(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); From fd914094a771a01197cfb153283236d3651a0dbf Mon Sep 17 00:00:00 2001 From: Thomas Date: Sat, 20 Jun 2015 17:52:38 +0200 Subject: [PATCH 0036/1173] Add option to invert viewport dragging (#1332) --- data/language/english_uk.txt | 3 ++- src/config.c | 1 + src/config.h | 1 + src/input.c | 9 +++++++-- src/localisation/string_ids.h | 2 ++ src/windows/options.c | 17 +++++++++++++---- 6 files changed, 26 insertions(+), 7 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index d36b4912e4..8401ebc0ac 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3704,4 +3704,5 @@ STR_5367 :Fast STR_5368 :Reset crash status STR_5369 :Park parameters... STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. -STR_5371 :Object Selection \ No newline at end of file +STR_5371 :Object Selection +STR_5372 :Invert right mouse dragging \ No newline at end of file diff --git a/src/config.c b/src/config.c index cf7651288e..2acfd44095 100644 --- a/src/config.c +++ b/src/config.c @@ -179,6 +179,7 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, auto_staff_placement), "auto_staff", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, last_run_version), "last_run_version", CONFIG_VALUE_TYPE_STRING, { .value_string = NULL }, NULL }, { offsetof(general_configuration, title_sequence), "title_sequence", CONFIG_VALUE_TYPE_UINT8, TITLE_SEQUENCE_OPENRCT2, NULL }, + { offsetof(general_configuration, invert_viewport_drag), "invert_viewport_drag", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, }; config_property_definition _interfaceDefinitions[] = { diff --git a/src/config.h b/src/config.h index d9fcd3ae62..9c161c965d 100644 --- a/src/config.h +++ b/src/config.h @@ -144,6 +144,7 @@ typedef struct { uint8 auto_staff_placement; utf8string last_run_version; uint8 title_sequence; + uint8 invert_viewport_drag; } general_configuration; typedef struct { diff --git a/src/input.c b/src/input.c index a1cb6e67c2..3bffaed02c 100644 --- a/src/input.c +++ b/src/input.c @@ -436,8 +436,13 @@ static void input_viewport_drag_continue() RCT2_GLOBAL(0x009DE540, sint16) = 1000; dx <<= viewport->zoom + 1; dy <<= viewport->zoom + 1; - w->saved_view_x += dx; - w->saved_view_y += dy; + if (gConfigGeneral.invert_viewport_drag){ + w->saved_view_x -= dx; + w->saved_view_y -= dy; + } else { + w->saved_view_x += dx; + w->saved_view_y += dy; + } } } diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 139104e3a2..91ed513dc1 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1537,6 +1537,8 @@ enum { STR_NORMAL = 5366, STR_FAST = 5367, + STR_INVERT_RIGHT_MOUSE_DRAG = 5372, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/options.c b/src/windows/options.c index a618b7442b..dc9da836c0 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -108,6 +108,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { // Controls WIDX_SCREEN_EDGE_SCROLLING = WIDX_PAGE_START, + WIDX_INVERT_DRAG, WIDX_HOTKEY_DROPDOWN, WIDX_TOOLBAR_SHOW_FINANCES, WIDX_TOOLBAR_SHOW_RESEARCH, @@ -199,10 +200,11 @@ static rct_widget window_options_audio_widgets[] = { static rct_widget window_options_controls_widgets[] = { MAIN_OPTIONS_WIDGETS, { WWT_CHECKBOX, 2, 10, 299, 54, 65, STR_SCREEN_EDGE_SCROLLING, STR_SCREEN_EDGE_SCROLLING_TIP }, - { WWT_DROPDOWN_BUTTON, 1, 26, 185, 69, 80, STR_HOTKEY, STR_HOTKEY_TIP }, - { WWT_CHECKBOX, 2, 10, 299, 84, 95, 5120, STR_NONE }, - { WWT_CHECKBOX, 2, 10, 299, 99, 110, 5121, STR_NONE }, - { WWT_CHECKBOX, 2, 10, 299, 114, 125, 5147, STR_NONE }, + { WWT_CHECKBOX, 2, 10, 299, 69, 80, STR_INVERT_RIGHT_MOUSE_DRAG,STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 26, 185, 84, 95, STR_HOTKEY, STR_HOTKEY_TIP }, + { WWT_CHECKBOX, 2, 10, 299, 99, 110, 5120, STR_NONE }, + { WWT_CHECKBOX, 2, 10, 299, 114, 125, 5121, STR_NONE }, + { WWT_CHECKBOX, 2, 10, 299, 129, 140, 5147, STR_NONE }, { WIDGETS_END }, }; @@ -349,6 +351,7 @@ static uint32 window_options_page_enabled_widgets[] = { MAIN_OPTIONS_ENABLED_WIDGETS | (1 << WIDX_SCREEN_EDGE_SCROLLING) | + (1 << WIDX_INVERT_DRAG) | (1 << WIDX_HOTKEY_DROPDOWN) | (1 << WIDX_TOOLBAR_SHOW_FINANCES) | (1 << WIDX_TOOLBAR_SHOW_RESEARCH) | @@ -509,6 +512,11 @@ static void window_options_mouseup() window_invalidate(w); window_invalidate_by_class(WC_TOP_TOOLBAR); break; + case WIDX_INVERT_DRAG: + gConfigGeneral.invert_viewport_drag ^= 1; + config_save_default(); + window_invalidate(w); + break; } break; @@ -1105,6 +1113,7 @@ static void window_options_invalidate() case WINDOW_OPTIONS_PAGE_CONTROLS: widget_set_checkbox_value(w, WIDX_SCREEN_EDGE_SCROLLING, gConfigGeneral.edge_scrolling); + widget_set_checkbox_value(w, WIDX_INVERT_DRAG, gConfigGeneral.invert_viewport_drag); widget_set_checkbox_value(w, WIDX_TOOLBAR_SHOW_FINANCES, gConfigInterface.toolbar_show_finances); widget_set_checkbox_value(w, WIDX_TOOLBAR_SHOW_RESEARCH, gConfigInterface.toolbar_show_research); widget_set_checkbox_value(w, WIDX_TOOLBAR_SHOW_CHEATS, gConfigInterface.toolbar_show_cheats); From 8416596bf8e534ee25bd1e8e1723c503cc193611 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 20 Jun 2015 17:28:17 +0100 Subject: [PATCH 0037/1173] implement park_update_histories --- src/addresses.h | 2 + src/editor.c | 6 +-- src/management/finance.c | 13 ++++--- src/management/finance.h | 4 ++ src/rct1.c | 4 +- src/scenario.c | 2 +- src/windows/finances.c | 15 +++----- src/windows/game_bottom_toolbar.c | 2 +- src/windows/park.c | 8 +--- src/world/park.c | 64 +++++++++++++++++++++++++++---- src/world/park.h | 3 ++ 11 files changed, 89 insertions(+), 34 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 34a652bdd9..5b0b4d5cf3 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -388,9 +388,11 @@ #define RCT2_ADDRESS_PEEP_SPAWNS 0x013573F2 +#define RCT2_ADDRESS_GUEST_CHANGE_MODIFIER 0x013573FE #define RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL 0x013573FF #define RCT2_ADDRESS_EXPENDITURE_TABLE 0x01357848 +#define RCT2_ADDRESS_LAST_GUESTS_IN_PARK 0x01357BC8 #define RCT2_ADDRESS_HANDYMAN_COLOUR 0x01357BCD #define RCT2_ADDRESS_MECHANIC_COLOUR 0x01357BCE #define RCT2_ADDRESS_SECURITY_COLOUR 0x01357BCF diff --git a/src/editor.c b/src/editor.c index 58e25e0cbf..4e0f050764 100644 --- a/src/editor.c +++ b/src/editor.c @@ -398,7 +398,7 @@ static int editor_read_s6(const char *path) sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_GUESTS_IN_PARK); // Read ? - sawyercoding_read_chunk(file, (uint8*)0x01357BC8); + sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_LAST_GUESTS_IN_PARK); // Read park rating sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_CURRENT_PARK_RATING); @@ -449,8 +449,8 @@ static int editor_read_s6(const char *path) sub_6BD3A4(); RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16) = 0; - RCT2_GLOBAL(0x01357BC8, uint16) = 0; - RCT2_GLOBAL(0x013573FE, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_GUEST_CHANGE_MODIFIER, uint16) = 0; if (s6Header->type != S6_TYPE_SCENARIO) { research_populate_list_random(); research_remove_non_separate_vehicle_types(); diff --git a/src/management/finance.c b/src/management/finance.c index 00db151578..1de6204ec8 100644 --- a/src/management/finance.c +++ b/src/management/finance.c @@ -46,6 +46,10 @@ const money32 research_cost_table[4] = { int dword_988E60[] = { 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0 }; +money32 *gCashHistory = RCT2_ADDRESS(RCT2_ADDRESS_BALANCE_HISTORY, money32); +money32 *gWeeklyProfitHistory = RCT2_ADDRESS(RCT2_ADDRESS_WEEKLY_PROFIT_HISTORY, money32); +money32 *gParkValueHistory = RCT2_ADDRESS(RCT2_ADDRESS_PARK_VALUE_HISTORY, money32); + /** * Pay an amount of money. * rct2: 0x069C674 @@ -143,11 +147,10 @@ void finance_pay_ride_upkeep() void finance_reset_history() { - int i; - for (i = 0; i < 128; i++) { - RCT2_ADDRESS(RCT2_ADDRESS_BALANCE_HISTORY, money32)[i] = MONEY32_UNDEFINED; - RCT2_ADDRESS(RCT2_ADDRESS_WEEKLY_PROFIT_HISTORY, money32)[i] = MONEY32_UNDEFINED; - RCT2_ADDRESS(RCT2_ADDRESS_PARK_VALUE_HISTORY, money32)[i] = MONEY32_UNDEFINED; + for (int i = 0; i < 128; i++) { + gCashHistory[i] = MONEY32_UNDEFINED; + gWeeklyProfitHistory[i] = MONEY32_UNDEFINED; + gParkValueHistory[i] = MONEY32_UNDEFINED; } } diff --git a/src/management/finance.h b/src/management/finance.h index e16d04d787..16291ab7b5 100644 --- a/src/management/finance.h +++ b/src/management/finance.h @@ -48,6 +48,10 @@ enum { extern const money32 research_cost_table[4]; +extern money32 *gCashHistory; +extern money32 *gWeeklyProfitHistory; +extern money32 *gParkValueHistory; + void finance_payment(money32 amount, rct_expenditure_type type); void finance_pay_wages(); void finance_pay_research(); diff --git a/src/rct1.c b/src/rct1.c index 794507fec8..3dfd27ca60 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -198,8 +198,8 @@ void rct1_fix_landscape() ride_init_all(); RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16) = 0; - RCT2_GLOBAL(0x01357BC8, uint16) = 0; - RCT2_GLOBAL(0x013573FE, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_GUEST_CHANGE_MODIFIER, uint8) = 0; RCT2_CALLPROC_EBPSAFE(0x0069F44B); sub_69F06A(); RCT2_CALLPROC_EBPSAFE(0x0069F143); diff --git a/src/scenario.c b/src/scenario.c index 0680d71ee0..d89609418a 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -151,7 +151,7 @@ int scenario_load(const char *path) sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_GUESTS_IN_PARK); // Read ? - sawyercoding_read_chunk(file, (uint8*)0x01357BC8); + sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_LAST_GUESTS_IN_PARK); // Read park rating sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_CURRENT_PARK_RATING); diff --git a/src/windows/finances.c b/src/windows/finances.c index 92eaee00ab..686cc84f04 100644 --- a/src/windows/finances.c +++ b/src/windows/finances.c @@ -866,9 +866,8 @@ static void window_finances_financial_graph_paint() // Calculate the Y axis scale (log2 of highest [+/-]balance) int yAxisScale = 0; - money32 *balanceHistory = RCT2_ADDRESS(RCT2_ADDRESS_BALANCE_HISTORY, money32); for (i = 0; i < 64; i++) { - money32 balance = balanceHistory[i]; + money32 balance = gCashHistory[i]; if (balance == MONEY32_UNDEFINED) continue; @@ -893,7 +892,7 @@ static void window_finances_financial_graph_paint() // X axis labels and values x = graphLeft + 98; y = graphTop + 17; - graph_draw_money32(dpi, balanceHistory, 64, x, y, yAxisScale, 128); + graph_draw_money32(dpi, gCashHistory, 64, x, y, yAxisScale, 128); } #pragma endregion @@ -985,9 +984,8 @@ static void window_finances_park_value_graph_paint() // Calculate the Y axis scale (log2 of highest [+/-]balance) int yAxisScale = 0; - money32 *parkValueHistory = RCT2_ADDRESS(RCT2_ADDRESS_PARK_VALUE_HISTORY, money32); for (i = 0; i < 64; i++) { - money32 balance = parkValueHistory[i]; + money32 balance = gParkValueHistory[i]; if (balance == MONEY32_UNDEFINED) continue; @@ -1012,7 +1010,7 @@ static void window_finances_park_value_graph_paint() // X axis labels and values x = graphLeft + 98; y = graphTop + 17; - graph_draw_money32(dpi, parkValueHistory, 64, x, y, yAxisScale, 0); + graph_draw_money32(dpi, gParkValueHistory, 64, x, y, yAxisScale, 0); } #pragma endregion @@ -1104,9 +1102,8 @@ static void window_finances_profit_graph_paint() // Calculate the Y axis scale (log2 of highest [+/-]balance) int yAxisScale = 0; - money32 *weeklyProfitHistory = RCT2_ADDRESS(RCT2_ADDRESS_WEEKLY_PROFIT_HISTORY, money32); for (i = 0; i < 64; i++) { - money32 balance = weeklyProfitHistory[i]; + money32 balance = gWeeklyProfitHistory[i]; if (balance == MONEY32_UNDEFINED) continue; @@ -1131,7 +1128,7 @@ static void window_finances_profit_graph_paint() // X axis labels and values x = graphLeft + 98; y = graphTop + 17; - graph_draw_money32(dpi, weeklyProfitHistory, 64, x, y, yAxisScale, 128); + graph_draw_money32(dpi, gWeeklyProfitHistory, 64, x, y, yAxisScale, 128); } #pragma endregion diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index 9789ec2a0c..b82b44e553 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -411,7 +411,7 @@ static void window_game_bottom_toolbar_draw_left_panel(rct_drawpixelinfo *dpi, r // Draw guests gfx_draw_string_centred( dpi, - STR_NUM_GUESTS + RCT2_GLOBAL(0x013573FE, uint8), + STR_NUM_GUESTS + RCT2_GLOBAL(RCT2_ADDRESS_GUEST_CHANGE_MODIFIER, uint8), x, y, (RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WINDOWCLASS, rct_windowclass) == 2 && RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WIDGETINDEX, sint32) == WIDX_GUESTS ? 2 : w->colours[0] & 0x7F), (void*)RCT2_ADDRESS_GUESTS_IN_PARK diff --git a/src/windows/park.c b/src/windows/park.c index 1fe32e1dcb..27318ce991 100644 --- a/src/windows/park.c +++ b/src/windows/park.c @@ -1296,7 +1296,6 @@ static void window_park_rating_paint() rct_window *w; rct_drawpixelinfo *dpi; rct_widget *widget; - uint8 *history; window_paint_get_registers(w, dpi); @@ -1317,8 +1316,7 @@ static void window_park_rating_paint() x += widget->left + 22; y += widget->top + 26; - history = RCT2_ADDRESS(RCT2_ADDRESS_PARK_RATING_HISTORY, uint8); - graph_draw_uint8(dpi, history, 32, x, y); + graph_draw_uint8(dpi, gParkRatingHistory, 32, x, y); } #pragma endregion @@ -1430,7 +1428,6 @@ static void window_park_guests_paint() rct_window *w; rct_drawpixelinfo *dpi; rct_widget *widget; - uint8 *history; window_paint_get_registers(w, dpi); @@ -1451,8 +1448,7 @@ static void window_park_guests_paint() x += widget->left + 22; y += widget->top + 26; - history = RCT2_ADDRESS(RCT2_ADDRESS_GUESTS_IN_PARK_HISTORY, uint8); - graph_draw_uint8(dpi, history, 32, x, y); + graph_draw_uint8(dpi, gGuestsInParkHistory, 32, x, y); } #pragma endregion diff --git a/src/world/park.c b/src/world/park.c index abb2dd8c19..73230f230d 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -35,6 +35,9 @@ #include "sprite.h" #include "../config.h" +uint8 *gParkRatingHistory = RCT2_ADDRESS(RCT2_ADDRESS_PARK_RATING_HISTORY, uint8); +uint8 *gGuestsInParkHistory = RCT2_ADDRESS(RCT2_ADDRESS_GUESTS_IN_PARK_HISTORY, uint8); + /** * In a difficult guest generation scenario, no guests will be generated if over this value. */ @@ -67,9 +70,9 @@ void park_init() RCT2_GLOBAL(RCT2_ADDRESS_MECHANIC_COLOUR, uint8) = 28; RCT2_GLOBAL(RCT2_ADDRESS_SECURITY_COLOUR, uint8) = 28; RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) = 0; - RCT2_GLOBAL(0x01357BC8, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16) = 0; - RCT2_GLOBAL(0x013573FE, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_GUEST_CHANGE_MODIFIER, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, uint16) = 0; _guestGenerationProbability = 0; RCT2_GLOBAL(RCT2_TOTAL_RIDE_VALUE, uint16) = 0; @@ -119,10 +122,9 @@ void park_init() */ void park_reset_history() { - int i; - for (i = 0; i < 32; i++) { - RCT2_ADDRESS(RCT2_ADDRESS_PARK_RATING_HISTORY, uint8)[i] = 255; - RCT2_ADDRESS(RCT2_ADDRESS_GUESTS_IN_PARK_HISTORY, uint8)[i] = 255; + for (int i = 0; i < 32; i++) { + gParkRatingHistory[i] = 255; + gGuestsInParkHistory[i] = 255; } } @@ -575,7 +577,55 @@ uint8 calculate_guest_initial_happiness(uint8 percentage) { */ void park_update_histories() { - RCT2_CALLPROC_EBPSAFE(0x0066A231); + int guestsInPark = RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16); + int lastGuestsInPark = RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16); + RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16) = guestsInPark; + RCT2_GLOBAL(0x009A9804, uint16) |= 4; + + int changeInGuestsInPark = guestsInPark - lastGuestsInPark; + int guestChangeModifier = 1; + if (changeInGuestsInPark > -20) { + guestChangeModifier++; + if (changeInGuestsInPark < 20) + guestChangeModifier = 0; + } + RCT2_GLOBAL(RCT2_ADDRESS_GUEST_CHANGE_MODIFIER, uint8) = guestChangeModifier; + + // Update park rating history + for (int i = 31; i > 0; i--) + gParkRatingHistory[i] = gParkRatingHistory[i - 1]; + gParkRatingHistory[0] = calculate_park_rating() / 4; + window_invalidate_by_class(WC_PARK_INFORMATION); + + // Update guests in park history + for (int i = 31; i > 0; i--) + gGuestsInParkHistory[i] = gGuestsInParkHistory[i - 1]; + gGuestsInParkHistory[0] = min(guestsInPark, 5000) / 20; + window_invalidate_by_class(WC_PARK_INFORMATION); + + // Update current cash history + for (int i = 127; i > 0; i--) + gCashHistory[i] = gCashHistory[i - 1]; + gCashHistory[0] = DECRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32)) - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32); + window_invalidate_by_class(WC_FINANCES); + + // Update weekly profit history + money32 currentWeeklyProfit = RCT2_GLOBAL(0x01358334, money32); + if (RCT2_GLOBAL(0x01358338, uint16) != 0) + currentWeeklyProfit /= RCT2_GLOBAL(0x01358338, uint16); + + for (int i = 127; i > 0; i--) + gWeeklyProfitHistory[i] = gWeeklyProfitHistory[i - 1]; + gWeeklyProfitHistory[0] = currentWeeklyProfit; + + RCT2_GLOBAL(0x01358334, money32) = 0; + RCT2_GLOBAL(0x01358338, uint16) = 0; + window_invalidate_by_class(WC_FINANCES); + + // Update park value history + for (int i = 127; i > 0; i--) + gParkValueHistory[i] = gParkValueHistory[i - 1]; + gParkValueHistory[0] = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_VALUE, money32); } void park_set_entrance_fee(money32 value) diff --git a/src/world/park.h b/src/world/park.h index ac00a55048..aa19444e04 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -45,6 +45,9 @@ enum { PARK_FLAGS_SIX_FLAGS = (1 << 19) }; +extern uint8 *gParkRatingHistory; +extern uint8 *gGuestsInParkHistory; + int park_is_open(); void park_init(); void park_reset_history(); From eea2a9f7c490308bf497d1a8ecc7e233a55ea8b5 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Sat, 20 Jun 2015 17:39:40 -0400 Subject: [PATCH 0038/1173] Fixed console open command --- src/interface/console.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/interface/console.c b/src/interface/console.c index 2842c63504..51265e9eeb 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -318,14 +318,14 @@ void console_printf(const char *format, ...) int console_parse_int(const char *src, bool *valid) { char *end; int value; - value = strtol(src, &end, 10); *valid &= (*end == '\0'); + value = strtol(src, &end, 10); *valid = (*end == '\0'); return value; } double console_parse_double(const char *src, bool *valid) { char *end; double value; - value = strtod(src, &end); *valid &= (*end == '\0'); + value = strtod(src, &end); *valid = (*end == '\0'); return value; } @@ -1030,7 +1030,9 @@ void console_execute_silent(const char *src) static bool invalidArguments(bool *invalid, bool arguments) { - if (!arguments) + if (!arguments) { *invalid = true; - return !invalid; + return false; + } + return true; } \ No newline at end of file From 2ab1e316a97e294bb48f7530bfd8c73c3559ed0f Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 21 Jun 2015 11:38:58 +0100 Subject: [PATCH 0039/1173] Fix using object selection during scenario Made a small mistake where it would unload the selected objects instead of unloading the unselected objects. --- src/windows/editor_object_selection.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 68a6c4cbc9..f69aa0ba1c 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -601,12 +601,12 @@ void remove_selected_objects_from_research(rct_object_entry* installedObject){ } /* rct2: 0x006ABB66 */ -void unload_selected_objects(){ +void unload_unselected_objects(){ uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); rct_object_entry* installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ - if (*selection_flags & OBJECT_SELECTION_FLAG_SELECTED){ + if (!(*selection_flags & OBJECT_SELECTION_FLAG_SELECTED)){ remove_selected_objects_from_research(installedObject); object_unload(0, (rct_object_entry_extended*)installedObject); } @@ -627,7 +627,7 @@ static void window_editor_object_selection_close() //if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_EDITOR)) // return; - unload_selected_objects(); + unload_unselected_objects(); editor_load_selected_objects(); reset_loaded_objects(); object_free_scenario_text(); From f36d17651d78ee29a4e19b7366de4de575dd1dc6 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 20 Jun 2015 00:05:30 +0100 Subject: [PATCH 0040/1173] Implemented game_command_place_fence. There are a couple of bugs involveing signs. --- src/game.c | 4 +- src/game.h | 2 +- src/ride/track.c | 2 +- src/windows/top_toolbar.c | 4 +- src/world/map.c | 258 ++++++++++++++++++++++++++++++++++++-- src/world/map.h | 2 +- 6 files changed, 254 insertions(+), 18 deletions(-) diff --git a/src/game.c b/src/game.c index 1245676d68..07cbf76933 100644 --- a/src/game.c +++ b/src/game.c @@ -945,7 +945,7 @@ static uint32 game_do_command_table[58] = { 0x006CD8CE, 0, 0, // 40 - 0x006E519A, + 0, 0, 0, 0, @@ -1008,7 +1008,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_emptysub, game_command_set_park_entrance_fee, game_command_update_staff_colour, // 40 - game_command_emptysub, + game_command_place_fence, game_command_remove_fence, game_command_place_large_scenery, game_command_remove_large_scenery, diff --git a/src/game.h b/src/game.h index 219689e810..0695d91595 100644 --- a/src/game.h +++ b/src/game.h @@ -65,7 +65,7 @@ enum GAME_COMMAND { GAME_COMMAND_38, GAME_COMMAND_SET_PARK_ENTRANCE_FEE, // 39 GAME_COMMAND_SET_STAFF_COLOUR, // 40 - GAME_COMMAND_41, + GAME_COMMAND_PLACE_FENCE, GAME_COMMAND_REMOVE_FENCE, GAME_COMMAND_PLACE_LARGE_SCENERY, GAME_COMMAND_REMOVE_LARGE_SCENERY, diff --git a/src/ride/track.c b/src/ride/track.c index 0b90178d55..c8f8a9b7fa 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1235,7 +1235,7 @@ int track_place_scenery(rct_track_scenery* scenery_start, uint8 rideIndex, int o bl | (entry_index << 8), mapCoord.y, rotation | (scenery->primary_colour << 8), - GAME_COMMAND_41, + GAME_COMMAND_PLACE_FENCE, z, scenery->secondary_colour | ((scenery->flags & 0xFC) << 6) ); diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 23e9e336f3..a0f542daef 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -1471,7 +1471,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w int ebx = (parameter_1 & 0xFF00) | 1; - int cost = game_do_command(grid_x, ebx, grid_y, parameter_2, GAME_COMMAND_41, RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16), RCT2_GLOBAL(0x00F64F15, uint16)); + int cost = game_do_command(grid_x, ebx, grid_y, parameter_2, GAME_COMMAND_PLACE_FENCE, RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16), RCT2_GLOBAL(0x00F64F15, uint16)); RCT2_GLOBAL(0x009A8C29, uint8) &= ~1; @@ -2087,7 +2087,7 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa parameter_1 | 0x69, map_tile.y, parameter_2, - GAME_COMMAND_41, + GAME_COMMAND_PLACE_FENCE, RCT2_GLOBAL(0x00F64ED4, uint16), RCT2_GLOBAL(0x00F64F15, uint16)); diff --git a/src/world/map.c b/src/world/map.c index 86f6464464..b5bd110984 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2107,6 +2107,253 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi *ebx = MONEY32_UNDEFINED; } +/** +* +* rct2: 0x006E519A +*/ +void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp){ + rct_xyz16 position = { + .x = *eax & 0xFFFF, + .y = *ecx & 0xFFFF, + .z = *edi & 0xFFFF + }; + + uint8 flags = *ebx & 0xFF; + uint8 fence_type = (*ebx >> 8) & 0xFF; + uint8 primary_colour = (*edx >> 8) & 0xFF; + uint8 secondary_colour = *ebp & 0xFF; + uint8 tertiary_colour = (*ebp >> 8) & 0xFF; + uint8 edge = *edx & 0xFF; + //*parameter_1 = (selected_scenery & 0xFF) << 8; + //*parameter_2 = cl | (window_scenery_primary_colour << 8); + //*parameter_3 = 0; + RCT2_GLOBAL(0x00141F726, uint8) = secondary_colour; + RCT2_GLOBAL(0x00141F727, uint8) = tertiary_colour; + RCT2_GLOBAL(0x00141F56C, uint8) = 0xC; + RCT2_GLOBAL(0x00141F728, uint8) = 0xFF; + RCT2_GLOBAL(0x009DEA5E, sint16) = position.x; + RCT2_GLOBAL(0x009DEA60, sint16) = position.y; + RCT2_GLOBAL(0x009DEA5E, uint16) += 16; + RCT2_GLOBAL(0x009DEA60, uint16) += 16; + RCT2_GLOBAL(0x009DEA62, sint16) = position.z; + + if (position.z == 0){ + RCT2_GLOBAL(0x009DEA62, sint16) = map_element_height(position.x, position.y) & 0xFFFF; + } + + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 2214; + *ebx = MONEY32_UNDEFINED; + return; + } + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && + !(flags & (1 << 7))){ + + if (position.z == 0){ + if (!map_is_location_in_park(position.x, position.y)){ + *ebx = MONEY32_UNDEFINED; + return; + } + } + else if (!map_is_location_owned(position.x, position.y, position.z)){ + *ebx = MONEY32_UNDEFINED; + return; + } + } + + uint8 bp = 0; + if (position.z == 0){ + rct_map_element* map_element = map_get_surface_element_at(position.x / 32, position.y / 32); + if (map_element == NULL){ + *ebx = MONEY32_UNDEFINED; + return; + } + position.z = map_element->base_height * 8; + + uint8 slope = map_element->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; + bp = RCT2_ADDRESS(0x009A3FEC, uint8)[slope + (edge & 3) * 32]; + if (bp & (1 << 0)){ + position.z += 16; + bp &= ~(1 << 0); + } + } + + RCT2_GLOBAL(0x00141F721, uint16) = position.z / 8; + RCT2_GLOBAL(0x00141F720, uint8) = primary_colour; + RCT2_GLOBAL(0x00141F723, uint8) = bp; + + rct_map_element* map_element = map_get_surface_element_at(position.x / 32, position.y / 32); + if (map_element == NULL){ + *ebx = MONEY32_UNDEFINED; + return; + } + + if (map_element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK){ + uint16 water_height = map_element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK; + water_height *= 16; + + if (position.z < water_height){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1180; + *ebx = MONEY32_UNDEFINED; + return; + } + } + + if (position.z / 8 < map_element->base_height){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1033; + *ebx = MONEY32_UNDEFINED; + return; + } + + if (!(bp & 0xC0)){ + uint8 new_edge = (edge + 2) & 3; + bp += 2; + if (map_element->properties.surface.slope & (1 << new_edge)){ + if (position.z / 8 < bp){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1033; + *ebx = MONEY32_UNDEFINED; + return; + } + + if (map_element->properties.surface.slope & (1 << 4)){ + new_edge = (new_edge - 1) & 3; + + if (map_element->properties.surface.slope & (1 << new_edge)){ + new_edge = (new_edge + 2) & 3; + if (map_element->properties.surface.slope & (1 << new_edge)){ + bp += 2; + if (position.z / 8 < bp){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1033; + *ebx = MONEY32_UNDEFINED; + return; + } + bp -= 2; + } + } + } + } + + new_edge = (edge + 3) & 3; + if (map_element->properties.surface.slope & (1 << new_edge)){ + if (position.z / 8 < bp){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1033; + *ebx = MONEY32_UNDEFINED; + return; + } + + if (map_element->properties.surface.slope & (1 << 4)){ + new_edge = (new_edge - 1) & 3; + + if (map_element->properties.surface.slope & (1 << new_edge)){ + new_edge = (new_edge + 2) & 3; + if (map_element->properties.surface.slope & (1 << new_edge)){ + bp += 2; + if (position.z / 8 < bp){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1033; + *ebx = MONEY32_UNDEFINED; + return; + } + } + } + } + } + } + + rct_scenery_entry* fence = g_wallSceneryEntries[fence_type]; + if (fence->wall.var_0D != 0xFF){ + int banner_index = create_new_banner(fence->wall.var_0D); + + if (banner_index == 0xFF){ + *ebx = MONEY32_UNDEFINED; + return; + } + + rct_banner* banner = &gBanners[banner_index]; + if (flags & GAME_COMMAND_FLAG_APPLY){ + banner->flags |= (1 << 3); + banner->type = 0; + banner->x = position.x / 32; + banner->y = position.y / 32; + + *eax = position.x; + *ecx = position.y; + *edx = position.z; + RCT2_CALLFUNC_X(0x6B7D86, eax, ebx, ecx, edx, esi, edi, ebp); + if ((*eax & 0xFF) != 0xFF){ + banner->colour = *eax & 0xFF; + banner->flags |= BANNER_FLAG_2; + } + } + } + + bp = RCT2_GLOBAL(0x00141F723, uint8); + + RCT2_GLOBAL(0x00141F722, uint8) = position.z / 8; + if (bp & 0xC0){ + if (fence->wall.flags & WALL_SCENERY_FLAG3){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 3133; + *ebx = MONEY32_UNDEFINED; + return; + } + RCT2_GLOBAL(0x00141F722, uint8) += 2; + } + RCT2_GLOBAL(0x00141F722, uint8) += fence->wall.height; + + if (!(flags & (1 << 7))){ + if (0x100 & RCT2_CALLPROC_X(0x006E5C1A, position.x, flags | (fence_type << 8), position.y, 0, 0, 0, 0)){ + *ebx = MONEY32_UNDEFINED; + return; + } + } + + if (!sub_68B044()){ + *ebx = MONEY32_UNDEFINED; + return; + } + + if (flags & GAME_COMMAND_FLAG_APPLY){ + map_element = map_element_insert(position.x / 32, position.y / 32, position.z / 8, 0); + + map_animation_create(MAP_ANIMATION_TYPE_WALL, position.x, position.y, position.z / 8); + + map_element->clearance_height = RCT2_GLOBAL(0x00141F722, uint8); + + map_element->type = bp | edge | MAP_ELEMENT_TYPE_FENCE; + + map_element->properties.fence.item[1] = primary_colour; + map_element->properties.fence.item[1] |= (secondary_colour & 7) << 5; + map_element->flags |= (secondary_colour & 0x18) << 2; + + if (RCT2_GLOBAL(0x00141F725, uint8) & 1){ + map_element->properties.fence.item[2] |= (1 << 2); + } + + map_element->properties.fence.type = fence_type; + if (RCT2_GLOBAL(0x00141F728, uint8) != 0xFF){ + map_element->properties.fence.item[0] = RCT2_GLOBAL(0x00141F728, uint8); + } + + if (fence->wall.flags & WALL_SCENERY_HAS_TERNARY_COLOUR){ + map_element->properties.fence.item[0] = tertiary_colour; + } + + if (flags & (1 << 6)){ + map_element->flags |= MAP_ELEMENT_FLAG_GHOST; + } + + RCT2_GLOBAL(0x00F64EBC, rct_map_element*) = map_element; + map_invalidate_tile(position.x, position.y, map_element->base_height * 8, map_element->base_height * 8 + 72); + } + + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY){ + *ebx = 0; + } + else{ + *ebx = fence->wall.price; + } +} + /** * * rct2: 0x006B893C @@ -2517,17 +2764,6 @@ int map_can_construct_at(int x, int y, int zLow, int zHigh, uint8 bl) return map_can_construct_with_clear_at(x, y, zLow, zHigh, (void*)0xFFFFFFFF, bl); } -/** - * - * rct2: 0x006BA278 - */ -int sub_6BA278(int ebx) -{ - int eax, ecx, edx, esi, edi, ebp; - RCT2_CALLFUNC_X(0x006BA278, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - return eax; -} - /** * * rct2: 0x006E5935 diff --git a/src/world/map.h b/src/world/map.h index db3cda5299..0271d4d185 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -282,7 +282,6 @@ int sub_68B044(); rct_map_element *map_element_insert(int x, int y, int z, int flags); int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *clearFunc, uint8 bl); int map_can_construct_at(int x, int y, int zLow, int zHigh, uint8 bl); -int sub_6BA278(int ebx); void rotate_map_coordinates(sint16* x, sint16* y, uint8 rotation); money32 map_clear_scenery(int x0, int y0, int x1, int y1, int flags); money32 lower_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags); @@ -304,6 +303,7 @@ void game_command_lower_water(int* eax, int* ebx, int* ecx, int* edx, int* esi, void game_command_remove_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_place_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); +void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); #define GET_MAP_ELEMENT(x) (&(RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS, rct_map_element)[x])) From b1183757ec1fcbe542e98606afa9b9dc3e83c891 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 21 Jun 2015 12:07:44 +0100 Subject: [PATCH 0041/1173] Fix banner bug. Small refactor --- src/world/footpath.c | 5 +++-- src/world/map.c | 50 ++++++++++++++++++++++---------------------- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/world/footpath.c b/src/world/footpath.c index 7caa8dbadf..a03c941a6e 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -23,6 +23,7 @@ #include "../localisation/localisation.h" #include "../util/util.h" #include "footpath.h" +#include "../management/finance.h" #include "map.h" #include "scenery.h" #include "../cheats.h" @@ -292,7 +293,7 @@ static money32 footpath_place_real(int type, int x, int y, int z, int slope, int { rct_map_element *mapElement; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; RCT2_GLOBAL(0x009DEA62, uint16) = z * 8; @@ -353,7 +354,7 @@ money32 footpath_remove_real(int x, int y, int z, int flags) { rct_map_element *mapElement; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; RCT2_GLOBAL(0x009DEA62, uint16) = z * 8; diff --git a/src/world/map.c b/src/world/map.c index b5bd110984..e8f18596ed 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -711,7 +711,7 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; RCT2_GLOBAL(0x009DEA62, uint16) = z; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; if (!(*ebx & 0x40) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; @@ -833,7 +833,7 @@ void game_command_remove_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi uint8 base_height = *edx; uint8 banner_position = *edx >> 8; int z = base_height * 8; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; RCT2_GLOBAL(0x009DEA62, uint16) = z; @@ -875,7 +875,7 @@ void game_command_remove_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi */ void game_command_set_scenery_colour(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; int x = *eax; int y = *ecx; uint8 base_height = *edx; @@ -925,7 +925,7 @@ void game_command_set_scenery_colour(int* eax, int* ebx, int* ecx, int* edx, int */ void game_command_set_fence_colour(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; int x = *eax; int y = *ecx; uint8 map_element_direction = *edx; @@ -980,7 +980,7 @@ void game_command_set_fence_colour(int* eax, int* ebx, int* ecx, int* edx, int* */ void game_command_set_large_scenery_colour(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; int x = *eax; int y = *ecx; uint8 map_element_direction = *ebx >> 8; @@ -1097,7 +1097,7 @@ void game_command_set_large_scenery_colour(int* eax, int* ebx, int* ecx, int* ed */ void game_command_set_banner_colour(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; int x = *eax; int y = *ecx; uint8 base_height = *edx; @@ -1290,7 +1290,7 @@ void game_command_clear_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi /* rct2: 0x00663CCD */ money32 map_change_surface_style(int x0, int y0, int x1, int y1, uint8 surfaceStyle, uint8 edgeStyle, uint8 flags) { - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; x0 = max(x0, 32); y0 = max(y0, 32); @@ -1521,7 +1521,7 @@ money32 raise_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b } } - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; RCT2_GLOBAL(0x009DEA5E, uint32) = x; RCT2_GLOBAL(0x009DEA60, uint32) = y; RCT2_GLOBAL(0x009DEA62, uint32) = z; @@ -1585,7 +1585,7 @@ money32 lower_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b } } - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; RCT2_GLOBAL(0x009DEA5E, uint32) = x; RCT2_GLOBAL(0x009DEA60, uint32) = y; RCT2_GLOBAL(0x009DEA62, uint32) = z; @@ -1800,7 +1800,7 @@ void game_command_remove_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, uint8 base_height = (*edx >> 8); uint8 direction = *edx; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; if(!(*ebx & 0x40) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; *ebx = MONEY32_UNDEFINED; @@ -1848,7 +1848,7 @@ void game_command_place_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi, RCT2_GLOBAL(0x009DEA5E, uint32) = x + 16; RCT2_GLOBAL(0x009DEA60, uint32) = y + 16; RCT2_GLOBAL(0x009DEA62, uint32) = base_height * 16; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; if(RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0 || gConfigCheat.build_in_pause_mode){ if(sub_68B044() && x < 8192 && y < 8192){ rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); @@ -1923,7 +1923,7 @@ void game_command_place_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi, */ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; int x = (uint16)*eax; int y = (uint16)*ecx; uint8 color2 = *edi >> 16; @@ -2124,17 +2124,16 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, uint8 secondary_colour = *ebp & 0xFF; uint8 tertiary_colour = (*ebp >> 8) & 0xFF; uint8 edge = *edx & 0xFF; - //*parameter_1 = (selected_scenery & 0xFF) << 8; - //*parameter_2 = cl | (window_scenery_primary_colour << 8); - //*parameter_3 = 0; + + // *not used* RCT2_GLOBAL(0x00141F726, uint8) = secondary_colour; + // *not used* RCT2_GLOBAL(0x00141F727, uint8) = tertiary_colour; - RCT2_GLOBAL(0x00141F56C, uint8) = 0xC; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; + // Banner index *not used* RCT2_GLOBAL(0x00141F728, uint8) = 0xFF; - RCT2_GLOBAL(0x009DEA5E, sint16) = position.x; - RCT2_GLOBAL(0x009DEA60, sint16) = position.y; - RCT2_GLOBAL(0x009DEA5E, uint16) += 16; - RCT2_GLOBAL(0x009DEA60, uint16) += 16; + RCT2_GLOBAL(0x009DEA5E, sint16) = position.x + 16; + RCT2_GLOBAL(0x009DEA60, sint16) = position.y + 16; RCT2_GLOBAL(0x009DEA62, sint16) = position.z; if (position.z == 0){ @@ -2259,11 +2258,12 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, } } } - + int banner_index = 0xFF; rct_scenery_entry* fence = g_wallSceneryEntries[fence_type]; if (fence->wall.var_0D != 0xFF){ - int banner_index = create_new_banner(fence->wall.var_0D); + banner_index = create_new_banner(fence->wall.var_0D); + RCT2_GLOBAL(0x00141F728, uint8) = banner_index; if (banner_index == 0xFF){ *ebx = MONEY32_UNDEFINED; return; @@ -2330,8 +2330,8 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, } map_element->properties.fence.type = fence_type; - if (RCT2_GLOBAL(0x00141F728, uint8) != 0xFF){ - map_element->properties.fence.item[0] = RCT2_GLOBAL(0x00141F728, uint8); + if (banner_index != 0xFF){ + map_element->properties.fence.item[0] = banner_index; } if (fence->wall.flags & WALL_SCENERY_HAS_TERNARY_COLOUR){ @@ -2360,7 +2360,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, */ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 12; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; int x = (sint16)*eax; int y = (sint16)*ecx; int z = (sint16)*ebp; From 858faa3303aaf683bcca20a9d3f527d7beaddbd5 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 21 Jun 2015 13:40:44 +0200 Subject: [PATCH 0042/1173] Adjust game_command_place_fence for sandbox mode and build in pause mode. --- src/world/map.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index e8f18596ed..cde83d700e 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2140,14 +2140,14 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, RCT2_GLOBAL(0x009DEA62, sint16) = map_element_height(position.x, position.y) & 0xFFFF; } - if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0){ + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 2214; *ebx = MONEY32_UNDEFINED; return; } if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && - !(flags & (1 << 7))){ + !(flags & (1 << 7)) && !gSandboxMode){ if (position.z == 0){ if (!map_is_location_in_park(position.x, position.y)){ @@ -3027,4 +3027,4 @@ static void sub_68AE2A(int x, int y) break; } } -} \ No newline at end of file +} From d10d38a12808d78c92b9ee30379776e95d27eb9d Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 21 Jun 2015 14:53:04 +0200 Subject: [PATCH 0043/1173] First version (crashy) --- src/localisation/language.c | 8 +++++--- src/localisation/language.h | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/localisation/language.c b/src/localisation/language.c index 5d4e1b17d1..03f3c2abfc 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -43,7 +43,8 @@ const char *language_names[LANGUAGE_COUNT] = { "Polski", // LANGUAGE_POLISH "Espa\u00F1ol", // LANGUAGE_SPANISH "Svenska", // LANGUAGE_SWEDISH - "Italiano" // LANGUAGE_ITALIAN + "Italiano", // LANGUAGE_ITALIAN + "Portug\u00CAs (BR)"// LANGUAGE_PORTUGUESE_BR }; const char *language_filenames[LANGUAGE_COUNT] = { @@ -57,7 +58,8 @@ const char *language_filenames[LANGUAGE_COUNT] = { "polish", // LANGUAGE_POLISH "spanish_sp", // LANGUAGE_SPANISH "swedish", // LANGUAGE_SWEDISH - "italian" // LANGUAGE_ITALIAN + "italian", // LANGUAGE_ITALIAN + "portuguese_br" // LANGUAGE_PORTUGUESE_BR }; int gCurrentLanguage = LANGUAGE_UNDEFINED; @@ -268,7 +270,7 @@ static void language_close(language_data *language) } const int OpenRCT2LangIdToObjectLangId[] = { - 0, 0, 1, 3, 6, 2, 0, 0, 4, 7, 5 + 0, 0, 1, 3, 6, 2, 0, 0, 4, 7, 5, 11 }; /* rct2: 0x0098DA16 */ diff --git a/src/localisation/language.h b/src/localisation/language.h index c86906f773..a8eeb81f5d 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -35,6 +35,7 @@ enum { LANGUAGE_SPANISH, LANGUAGE_SWEDISH, LANGUAGE_ITALIAN, + LANGUAGE_PORTUGUESE_BR, LANGUAGE_COUNT }; From 0dfdb3302833d3cf69020d4e0b4915e6c5e2b26b Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 21 Jun 2015 15:13:40 +0200 Subject: [PATCH 0044/1173] Complete support, read .DAT entries from correct table --- src/config.c | 1 + src/localisation/language.c | 2 +- src/platform/windows.c | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 2acfd44095..a5521c2cf1 100644 --- a/src/config.c +++ b/src/config.c @@ -136,6 +136,7 @@ config_enum_definition _languageEnum[] = { { "es-ES", LANGUAGE_SPANISH }, { "sv-SE", LANGUAGE_SWEDISH }, { "it-IT", LANGUAGE_ITALIAN }, + { "pt-BR", LANGUAGE_PORTUGUESE_BR }, END_OF_ENUM }; diff --git a/src/localisation/language.c b/src/localisation/language.c index 03f3c2abfc..05c7eae239 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -270,7 +270,7 @@ static void language_close(language_data *language) } const int OpenRCT2LangIdToObjectLangId[] = { - 0, 0, 1, 3, 6, 2, 0, 0, 4, 7, 5, 11 + 0, 0, 1, 3, 6, 2, 0, 0, 4, 7, 5, 13 }; /* rct2: 0x0098DA16 */ diff --git a/src/platform/windows.c b/src/platform/windows.c index b090bae968..52fb1000df 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -635,6 +635,9 @@ uint16 platform_get_locale_language(){ else if (strcmp(langCode, "ITA") == 0){ return LANGUAGE_ITALIAN; } + else if (strcmp(langCode, "POR") == 0){ + return LANGUAGE_PORTUGUESE_BR; + } return LANGUAGE_UNDEFINED; } From d5bf01e22cfa56c29cb2f07136dcb1765fc7ee41 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 21 Jun 2015 02:27:38 +0100 Subject: [PATCH 0045/1173] refactor ride type flags --- src/management/award.c | 4 ++-- src/peep/peep.c | 2 +- src/ride/ride.c | 4 ++-- src/ride/ride.h | 14 +++++++------- src/windows/new_campaign.c | 2 +- src/windows/new_ride.c | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/management/award.c b/src/management/award.c index c76faa25a2..7b7762f3b6 100644 --- a/src/management/award.c +++ b/src/management/award.c @@ -290,7 +290,7 @@ static int award_is_deserved_best_food(int awardType, int activeAwardTypes) FOR_ALL_RIDES(i, ride) { if (ride->status != RIDE_STATUS_OPEN) continue; - if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_23)) + if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_SELLS_FOOD)) continue; shops++; @@ -336,7 +336,7 @@ static int award_is_deserved_worst_food(int awardType, int activeAwardTypes) FOR_ALL_RIDES(i, ride) { if (ride->status != RIDE_STATUS_OPEN) continue; - if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_23)) + if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_SELLS_FOOD)) continue; shops++; diff --git a/src/peep/peep.c b/src/peep/peep.c index 44085082e6..adb41accf4 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -4386,7 +4386,7 @@ void peep_problem_warnings_update() break; } ride = &g_ride_list[peep->guest_heading_to_ride_id]; - if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_SELLS_FOOD)) + if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) hunger_counter++; break; diff --git a/src/ride/ride.c b/src/ride/ride.c index 336770ad74..ace0989439 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -821,7 +821,7 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par rct_ride* ride = GET_RIDE(map_element->properties.track.ride_index); rct_preview_track *trackBlock; - if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & RIDE_TYPE_FLAG_SELLS_FOOD){ + if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & RIDE_TYPE_FLAG_FLAT_RIDE){ trackBlock = RCT2_ADDRESS(0x00994A38, rct_preview_track*)[type]; } else{ @@ -2467,7 +2467,7 @@ static void ride_shop_connected(rct_ride* ride, int ride_idx) uint16 entrance_directions = 0; uint8 track_type = mapElement->properties.track.type; ride = &g_ride_list[mapElement->properties.track.ride_index]; - if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_SELLS_FOOD)) { + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { entrance_directions = RCT2_ADDRESS(0x0099CA64, uint8)[track_type * 16]; } else { entrance_directions = RCT2_ADDRESS(0x0099BA64, uint8)[track_type * 16]; diff --git a/src/ride/ride.h b/src/ride/ride.h index 0dcf0dccfb..37f8b138a5 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -708,30 +708,30 @@ enum { RIDE_TYPE_FLAG_3 = 1 << 3, RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION = 1 << 4, RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS = 1 << 5, - RIDE_TYPE_FLAG_6 = 1 << 6, + RIDE_TYPE_FLAG_6 = 1 << 6, // used only by boat ride and submarine ride RIDE_TYPE_FLAG_HAS_G_FORCES = 1 << 7, RIDE_TYPE_FLAG_8 = 1 << 8, // something to do with track, maybe whether it can have gaps RIDE_TYPE_FLAG_HAS_DATA_LOGGING = 1 << 9, RIDE_TYPE_FLAG_HAS_DROPS = 1 << 10, RIDE_TYPE_FLAG_NO_TEST_MODE = 1 << 11, - RIDE_TYPE_FLAG_12 = 1 << 12, - RIDE_TYPE_FLAG_13 = 1 << 13, // something to do with stations or vehicles + RIDE_TYPE_FLAG_12 = 1 << 12, // used only by dinghy slide and water coaster + RIDE_TYPE_FLAG_13 = 1 << 13, // used only by maze, spiral slide and shops RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS = 1 << 14, RIDE_TYPE_FLAG_15 = 1 << 15, // something to do with station, price and viewport zoom RIDE_TYPE_FLAG_16 = 1 << 16, // something to do with vehicle colour scheme RIDE_TYPE_FLAG_IS_SHOP = 1 << 17, RIDE_TYPE_FLAG_18 = 1 << 18, - RIDE_TYPE_FLAG_SELLS_FOOD = 1 << 19, + RIDE_TYPE_FLAG_FLAT_RIDE = 1 << 19, RIDE_TYPE_FLAG_20 = 1 << 20, - RIDE_TYPE_FLAG_21 = 1 << 21, + RIDE_TYPE_FLAG_21 = 1 << 21, // used only by toilets and first aid RIDE_TYPE_FLAG_IN_RIDE = 1 << 22, // peeps are "IN" (ride) rather than "ON" (ride) - RIDE_TYPE_FLAG_23 = 1 << 23, // sells food?, seems to be used for food awards... + RIDE_TYPE_FLAG_SELLS_FOOD = 1 << 23, RIDE_TYPE_FLAG_SELLS_DRINKS = 1 << 24, RIDE_TYPE_FLAG_IS_BATHROOM = 1 << 25, RIDE_TYPE_FLAG_26 = 1 << 26, // something to do with vehicle colours RIDE_TYPE_FLAG_27 = 1 << 27, RIDE_TYPE_FLAG_HAS_TRACK = 1 << 28, - RIDE_TYPE_FLAG_29 = 1 << 29, + RIDE_TYPE_FLAG_29 = 1 << 29, // used only by lift RIDE_TYPE_FLAG_30 = 1 << 30, RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR = 1 << 31, }; diff --git a/src/windows/new_campaign.c b/src/windows/new_campaign.c index f64a894d51..c618b103e3 100644 --- a/src/windows/new_campaign.c +++ b/src/windows/new_campaign.c @@ -172,7 +172,7 @@ void window_new_campaign_open(sint16 campaignType) numApplicableRides = 0; window_new_campaign_rides[0] = 255; FOR_ALL_RIDES(i, ride) { - if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP | RIDE_TYPE_FLAG_23 | RIDE_TYPE_FLAG_SELLS_DRINKS | RIDE_TYPE_FLAG_IS_BATHROOM)) + if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP | RIDE_TYPE_FLAG_SELLS_FOOD | RIDE_TYPE_FLAG_SELLS_DRINKS | RIDE_TYPE_FLAG_IS_BATHROOM)) window_new_campaign_rides[numApplicableRides++] = i; } diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index d824194c14..759486796d 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -898,7 +898,7 @@ static void window_new_ride_paint_ride_information(rct_window *w, rct_drawpixeli // Get price of ride int unk2 = RCT2_GLOBAL(0x0097CC68 + (item.type * 2), uint8); money32 price = RCT2_GLOBAL(0x0097DD78 + (item.type * 4), uint16); - if (ride_type_has_flag(item.type, RIDE_TYPE_FLAG_SELLS_FOOD)) { + if (ride_type_has_flag(item.type, RIDE_TYPE_FLAG_FLAT_RIDE)) { price *= RCT2_ADDRESS(0x0099DE34, uint32)[unk2]; } else { price *= RCT2_ADDRESS(0x0099DA34, uint32)[unk2]; From 9958ffc0f714e070ad8f6adb39ad01e23c7c0cd4 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 30 May 2015 12:24:27 +0100 Subject: [PATCH 0046/1173] Started refactor of viewport drawing Renabled banner paint setup --- src/addresses.h | 5 + src/drawing/string.c | 2 +- src/interface/viewport.c | 170 +++++++++++++++++++--------------- src/localisation/string_ids.h | 3 + src/world/map.c | 1 + 5 files changed, 106 insertions(+), 75 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 5b0b4d5cf3..b9dfaebbca 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -304,6 +304,11 @@ #define RCT2_ADDRESS_STAFF_HIGHLIGHTED_INDEX 0x00F43908 +// Each character is painted onto a drawing surface +// any coloured pixels are marked in this bitmap +// 8 x 8 in size. +#define RCT2_ADDRESS_CHARACTER_BITMAP 0x00F4393C + #define RCT2_ADDRESS_TRACK_PREVIEW_ROTATION 0x00F440AE #define RCT2_ADDRESS_TRACK_PREVIEW_X_MIN 0x00F440F9 diff --git a/src/drawing/string.c b/src/drawing/string.c index 2de4468b78..d0c575f963 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -69,7 +69,7 @@ void gfx_load_character_widths(){ val |= 0x80; } } - RCT2_ADDRESS(0xF4393C, uint8)[i * 8 + x] = val; + RCT2_ADDRESS(RCT2_ADDRESS_CHARACTER_BITMAP, uint8)[i * 8 + x] = val; } } diff --git a/src/interface/viewport.c b/src/interface/viewport.c index eaa10bc927..f80b548f75 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -872,32 +872,34 @@ void sub_0x69E8B0(uint16 eax, uint16 ecx){ } /*rct2: 0x006C42D9*/ -int sub_6C42D9(rct_string_id string_id, int scroll, int ebp) +int sub_6C42D9(rct_string_id string_id, uint16 scroll, uint16 ebp) { rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + if (dpi->zoom_level != 0) return 0x626; - RCT2_GLOBAL(0x9D7A80, uint32_t)++; - uint32_t edx = 0xFFFFFFFF; + + RCT2_GLOBAL(0x9D7A80, uint32)++; + uint32 edx = 0xFFFFFFFF; for (int i = 0; i < 0x20; i++) { - uint8_t* unknown_pointer = RCT2_ADDRESS(0x9C3840, uint8_t) + 0xA12 * i; - if (edx >= *((uint32_t*)(unknown_pointer + 0x0E))) + uint8_t* unknown_pointer = RCT2_ADDRESS(0x9C3840, uint8) + 0xA12 * i; + if (edx >= *((uint32*)(unknown_pointer + 0x0E))) { - edx = *((uint32_t*)(unknown_pointer + 0x0E)); - RCT2_GLOBAL(0x9D7A84, uint32_t) = i; - RCT2_GLOBAL(0x9D7A88, uint32_t) = (uint32_t)unknown_pointer; + edx = *((uint32*)(unknown_pointer + 0x0E)); + RCT2_GLOBAL(0x9D7A84, uint32) = i; + RCT2_GLOBAL(0x9D7A88, uint32) = (uint32)unknown_pointer; } if (*((rct_string_id*)unknown_pointer) == string_id && - *((uint32_t*)(unknown_pointer + 0x02)) == RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32_t) && - *((uint32_t*)(unknown_pointer + 0x06)) == RCT2_GLOBAL(0x13CE956, uint32_t) && - *((uint16_t*)(unknown_pointer + 0x0A)) == scroll && - *((uint16_t*)(unknown_pointer + 0x0C)) == ebp) + *((uint32*)(unknown_pointer + 0x02)) == RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) && + *((uint32*)(unknown_pointer + 0x06)) == RCT2_GLOBAL(0x13CE956, uint32) && + *((uint16*)(unknown_pointer + 0x0A)) == scroll && + *((uint16*)(unknown_pointer + 0x0C)) == ebp) { - *((uint32_t*)(unknown_pointer + 0x0E)) = RCT2_GLOBAL(0x9D7A80, uint32_t); + *((uint32*)(unknown_pointer + 0x0E)) = RCT2_GLOBAL(0x9D7A80, uint32); return i + 0x606; } } - uint8_t* unknown_pointer = RCT2_GLOBAL(0x9D7A88, uint8_t*); + uint8* unknown_pointer = RCT2_GLOBAL(0x9D7A88, uint8*); *((rct_string_id*)unknown_pointer) = string_id; *((uint32_t*)(unknown_pointer + 0x02)) = RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32_t); *((uint32_t*)(unknown_pointer + 0x06)) = RCT2_GLOBAL(0x13CE956, uint32_t); @@ -907,112 +909,132 @@ int sub_6C42D9(rct_string_id string_id, int scroll, int ebp) unknown_pointer += 0x12; memset(unknown_pointer, 0, 0x280 * 4); format_string(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char), string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); - int al = RCT2_GLOBAL(0x13CE959, uint8_t); - int edi = al & 0x7F; + uint8 character = RCT2_GLOBAL(0x13CE959, uint8); + int edi = character & 0x7F; int offs = 0; - if (al >= 0x80) offs = 2; - RCT2_GLOBAL(0x9D7A8C, uint8_t) = RCT2_ADDRESS(0x0141FC47, uint8_t)[offs + edi * 8]; + if (character >= 0x80) offs = 2; + + uint8 character_colour = RCT2_ADDRESS(0x0141FC47, uint8)[offs + edi * 8]; int16_t* unk = RCT2_ADDRESS(0x992FB8, uint16_t*)[ebp]; uint8_t* format_result = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, uint8_t); while (true) { - al = *format_result; + character = *format_result; format_result++; - if (al == 0) + if (character == 0) { format_result = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); continue; } - if (al <= FORMAT_COLOUR_CODE_END && al >= FORMAT_COLOUR_CODE_START) + if (character <= FORMAT_COLOUR_CODE_END && character >= FORMAT_COLOUR_CODE_START) { - al -= FORMAT_COLOUR_CODE_START; - RCT2_GLOBAL(0x9D7A8C, uint8_t) = RCT2_ADDRESS(RCT2_GLOBAL(0x9FF048, uint32_t), uint8_t)[al * 4]; + character -= FORMAT_COLOUR_CODE_START; + character_colour = RCT2_GLOBAL(0x9FF048, uint8*)[character * 4]; continue; } - if (al < 0x20) continue; - al -= 0x20; - int edx = RCT2_ADDRESS(0x141EBA8, uint8_t)[al]; - uint8_t* unk2 = &(RCT2_ADDRESS(0xF4393C, uint8)[al * 8]); - while (true) + if (character < 0x20) continue; + character -= 0x20; + + uint8 character_width = RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH + 0x1C0, uint8)[character]; + uint8* character_bitmap = &(RCT2_ADDRESS(RCT2_ADDRESS_CHARACTER_BITMAP, uint8)[character * 8]); + for (; character_width != 0;character_width--,character_bitmap++) { + // Skip any none displayed columns if (scroll != 0) { scroll--; - unk2++; - edx--; - if (edx == 0) break; + continue; } - else + + int16_t eax = *unk; + if (eax == -1) return RCT2_GLOBAL(0x9D7A84, uint32_t) + 0x606; + if (eax > -1) { - int16_t eax = *unk; - if (eax == -1) return RCT2_GLOBAL(0x9D7A84, uint32_t) + 0x606; - if (eax > -1) + uint8_t* dst = &unknown_pointer[eax]; + int ah = *character_bitmap; + while (true) { - uint8_t* dst = &unknown_pointer[eax]; - int ah = *unk2; - int al = RCT2_GLOBAL(0x9D7A8C, uint8_t); - while (true) - { - if (ah & 1) *dst = al; - ah >>= 1; - dst += 0x40; - if (ah == 0) break; - } + if (ah & 1) *dst = character_colour; + ah >>= 1; + dst += 0x40; + if (ah == 0) break; } - unk2++; - unk++; - edx--; - if (edx == 0) break; } + unk++; + } } } /* rct2: 0x006B9CC4 */ -void viewport_banner_paint_setup(uint32_t direction, int edx, rct_map_element* map_element) +void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* map_element) { rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + RCT2_GLOBAL(0x9DE570, uint8_t) = 0xC; + if (dpi->zoom_level > 1 || RCT2_GLOBAL(0x9DEA6F, uint8_t) & 1) return; - edx -= 16; + + height -= 16; + rct_scenery_entry* banner_scenery = g_bannerSceneryEntries[gBanners[map_element->properties.banner.index].type]; + direction += map_element->properties.banner.position; direction &= 3; - RCT2_GLOBAL(0x9DEA56, uint16_t) = edx + 2; + + RCT2_GLOBAL(0x9DEA56, uint16_t) = height + 2; + RCT2_GLOBAL(0x9DEA52, uint32_t) = RCT2_ADDRESS(0x98D884, uint32_t)[direction * 2]; - int ebx = (direction << 1) + banner_scenery->image; - ebx += (gBanners[map_element->properties.banner.index].colour << 19) | 0x20000000; - if (map_element->flags & 0x10)//if being placed (ghost appearance) + + uint32 base_id = (direction << 1) + banner_scenery->image; + uint32 image_id = base_id; + + if (map_element->flags & MAP_ELEMENT_FLAG_GHOST)//if being placed { RCT2_GLOBAL(0x9DE570, uint8_t) = 0; - ebx &= 0x7FFFF; - ebx |= RCT2_ADDRESS(0x993CC4, uint32_t)[RCT2_GLOBAL(0x9AACBF, uint8_t)]; + image_id |= RCT2_ADDRESS(0x993CC4, uint32_t)[RCT2_GLOBAL(0x9AACBF, uint8_t)]; } - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x1500, ebx, 0, edx, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); - RCT2_GLOBAL(0x9DEA52, uint32_t) = RCT2_ADDRESS(0x98D888, uint32_t)[direction * 2]; - ebx++; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x1500, ebx, 0, edx, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + else{ + image_id |= + (gBanners[map_element->properties.banner.index].colour << 19) | + 0x20000000; + } + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0x1500, image_id, 0, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + RCT2_GLOBAL(0x9DEA52, uint32) = RCT2_ADDRESS(0x98D888, uint32)[direction * 2]; + + image_id++; + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0x1500, image_id, 0, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + + // Opposite direction direction ^= 2; direction--; - if (direction >= 2 || (map_element->flags & 0x10)) return; + // If text not showing / ghost + if (direction >= 2 || (map_element->flags & MAP_ELEMENT_FLAG_GHOST)) return; + int ebp = banner_scenery->banner.var_06; ebp += direction; - RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32_t) = 0; + + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = 0; RCT2_GLOBAL(0x13CE956, uint32_t) = 0; - rct_string_id string_id = 0xBA5;//no entry + + rct_string_id string_id = STR_NO_ENTRY; if (!(gBanners[map_element->properties.banner.index].flags & BANNER_FLAG_NO_ENTRY)) { - RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16_t) = gBanners[map_element->properties.banner.index].string_idx; - string_id = 0x6C3; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = gBanners[map_element->properties.banner.index].string_idx; + string_id = STR_BANNER_TEXT; } format_string(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char), string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16_t) = 0x1C0; - uint16_t string_width = gfx_get_string_width(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char)); - uint16_t scroll = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32_t) >> 1) % string_width; + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0x1C0; + + uint16 string_width = gfx_get_string_width(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char)); + uint16 scroll = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) / 2) % string_width; + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x1500, sub_6C42D9(string_id, scroll, ebp), 0, edx + 22, 1, 1, 0); + 0x1500, sub_6C42D9(string_id, scroll, ebp), 0, height + 22, 1, 1, 0); } /*rct2: 0x0068B35F*/ @@ -1157,9 +1179,9 @@ void sub_68B35F(int ax, int cx) case MAP_ELEMENT_TYPE_BANNER: //there are still some small localisation glitches, //because the old function still gets called sometimes - //viewport_banner_paint_setup(direction, dx, map_element); + viewport_banner_paint_setup(direction, dx, map_element); //Until that is solved, use the original function instead - RCT2_CALLPROC_X(0x6B9CC4, 0, 0, direction, dx, (int)map_element, 0, 0); + //RCT2_CALLPROC_X(0x6B9CC4, 0, 0, direction, dx, (int)map_element, 0, 0); break; default: // This is a little hack for taking care of undefined map_elements diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 91ed513dc1..6b01892cd7 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -518,6 +518,8 @@ enum { STR_CANT_OPEN_PARK = 1723, STR_CANT_CLOSE_PARK = 1724, + STR_BANNER_TEXT = 1731, + STR_NUMBER_OF_LAPS = 1734, STR_NUMBER_OF_LAPS_TIP = 1735, @@ -1146,6 +1148,7 @@ enum { STR_MUSIC_ACKNOWLEDGEMENTS = 2863, STR_TOO_MANY_BANNERS_IN_GAME = 2980, + STR_NO_ENTRY = 2981, STR_CHANGE_BANNER_TEXT_TIP = 2986, STR_SET_AS_NO_ENTRY_BANNER_TIP = 2987, diff --git a/src/world/map.c b/src/world/map.c index 6bf07b1f08..09e4170305 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -904,6 +904,7 @@ void game_command_set_scenery_colour(int* eax, int* ebx, int* ecx, int* edx, int return; } } + if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)){ *ebx = 0; return; From 55d3b67cfe3e8a2f9b508ee4c991c4a2476a3e6b Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 30 May 2015 21:21:35 +0100 Subject: [PATCH 0047/1173] Refactor of scrolling_text_setup --- src/addresses.h | 8 +++ src/interface/viewport.c | 136 +++++++++++++++++++++++---------------- src/world/scenery.h | 2 +- 3 files changed, 90 insertions(+), 56 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index b9dfaebbca..48520d6404 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -55,6 +55,10 @@ #define RCT2_ADDRESS_EASTEREGG_NAMES 0x00988C20 +// An array of pointers to the start of a way to +// translate between scroll positions for drawing +#define RCT2_ADDRESS_SCROLLING_MODE_POSITIONS 0x00992FB8 + #define RCT2_ADDRESS_RIDE_PROPERTIES 0x00997C9D #define RCT2_ADDRESS_LAND_TOOL_SIZE 0x009A9800 #define RCT2_ADDRESS_SAVE_PROMPT_MODE 0x009A9802 @@ -158,6 +162,10 @@ #define RCT2_ADDRESS_VEHICLE_SOUND_LIST 0x009AF288 +#define RCT2_ADDRESS_DRAW_SCROLL_LIST 0x009C3840 + +#define RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID 0x009D7A80 + #define RCT2_ADDRESS_INPUT_FLAGS 0x009DE518 #define RCT2_ADDRESS_CURENT_CURSOR 0x009DE51C #define RCT2_ADDRESS_INPUT_STATE 0x009DE51D diff --git a/src/interface/viewport.c b/src/interface/viewport.c index f80b548f75..0e715a5cfb 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -871,68 +871,99 @@ void sub_0x69E8B0(uint16 eax, uint16 ecx){ } } +/* size: 0xA12 */ +typedef struct{ + rct_string_id string_id; // 0x00 + uint32 string_args_0; // 0x02 + uint32 string_args_1; // 0x06 + uint16 position; // 0x0A + uint16 mode; // 0x0C + uint32 id; // 0x0E + uint8 bitmap[64 * 8 * 5];// 0x12 +}rct_draw_scroll_text; + /*rct2: 0x006C42D9*/ -int sub_6C42D9(rct_string_id string_id, uint16 scroll, uint16 ebp) +int scrolling_text_setup(rct_string_id string_id, uint16 scroll, uint16 scrolling_mode) { rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); if (dpi->zoom_level != 0) return 0x626; - RCT2_GLOBAL(0x9D7A80, uint32)++; - uint32 edx = 0xFFFFFFFF; - for (int i = 0; i < 0x20; i++) + RCT2_GLOBAL(RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID, uint32)++; + + uint32 oldest_id = 0xFFFFFFFF; + uint8 scroll_index = 0xFF; + rct_draw_scroll_text* oldest_scroll = NULL; + + // Find the oldest scroll for use as the newest + for (int i = 0; i < 32; i++) { - uint8_t* unknown_pointer = RCT2_ADDRESS(0x9C3840, uint8) + 0xA12 * i; - if (edx >= *((uint32*)(unknown_pointer + 0x0E))) - { - edx = *((uint32*)(unknown_pointer + 0x0E)); - RCT2_GLOBAL(0x9D7A84, uint32) = i; - RCT2_GLOBAL(0x9D7A88, uint32) = (uint32)unknown_pointer; + rct_draw_scroll_text* scroll_text = &RCT2_ADDRESS(RCT2_ADDRESS_DRAW_SCROLL_LIST, rct_draw_scroll_text)[i]; + if (oldest_id >= scroll_text->id){ + oldest_id = scroll_text->id; + scroll_index = i; + oldest_scroll = scroll_text; } - if (*((rct_string_id*)unknown_pointer) == string_id && - *((uint32*)(unknown_pointer + 0x02)) == RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) && - *((uint32*)(unknown_pointer + 0x06)) == RCT2_GLOBAL(0x13CE956, uint32) && - *((uint16*)(unknown_pointer + 0x0A)) == scroll && - *((uint16*)(unknown_pointer + 0x0C)) == ebp) - { - *((uint32*)(unknown_pointer + 0x0E)) = RCT2_GLOBAL(0x9D7A80, uint32); + + // If exact match return the matching index + if (scroll_text->string_id == string_id && + scroll_text->string_args_0 == RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) && + scroll_text->string_args_1 == RCT2_GLOBAL(0x13CE956, uint32) && + scroll_text->position == scroll && + scroll_text->mode == scrolling_mode){ + + scroll_text->id = RCT2_GLOBAL(RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID, uint32); return i + 0x606; } } - uint8* unknown_pointer = RCT2_GLOBAL(0x9D7A88, uint8*); - *((rct_string_id*)unknown_pointer) = string_id; - *((uint32_t*)(unknown_pointer + 0x02)) = RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32_t); - *((uint32_t*)(unknown_pointer + 0x06)) = RCT2_GLOBAL(0x13CE956, uint32_t); - *((uint16_t*)(unknown_pointer + 0x0A)) = scroll; - *((uint16_t*)(unknown_pointer + 0x0C)) = ebp; - *((uint32_t*)(unknown_pointer + 0x0E)) = RCT2_GLOBAL(0x9D7A80, uint32_t); - unknown_pointer += 0x12; - memset(unknown_pointer, 0, 0x280 * 4); - format_string(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char), string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + + // Setup scrolling text + + rct_draw_scroll_text* scroll_text = oldest_scroll; + scroll_text->string_id = string_id; + scroll_text->string_args_0 = RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32); + scroll_text->string_args_1 = RCT2_GLOBAL(0x13CE956, uint32); + scroll_text->position = scroll; + scroll_text->mode = scrolling_mode; + scroll_text->id = RCT2_GLOBAL(RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID, uint32_t); + + uint8* scroll_pixel_pointer = scroll_text->bitmap; + memset(scroll_pixel_pointer, 0, 320 * 8); + + // Convert string id back into a string for processing + uint8 scroll_string[MAX_PATH]; + format_string(scroll_string, string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + + // Setup character colour from ??? uint8 character = RCT2_GLOBAL(0x13CE959, uint8); int edi = character & 0x7F; int offs = 0; if (character >= 0x80) offs = 2; - uint8 character_colour = RCT2_ADDRESS(0x0141FC47, uint8)[offs + edi * 8]; - int16_t* unk = RCT2_ADDRESS(0x992FB8, uint16_t*)[ebp]; - uint8_t* format_result = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, uint8_t); + + sint16* scrolling_mode_positions = RCT2_ADDRESS(RCT2_ADDRESS_SCROLLING_MODE_POSITIONS, uint16_t*)[scrolling_mode]; + uint8* format_result = scroll_string; while (true) { - character = *format_result; - format_result++; - if (character == 0) - { - format_result = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); + character = *format_result++; + + // If at the end of the string loop back to the start + if (character == 0){ + format_result = scroll_string; continue; } - if (character <= FORMAT_COLOUR_CODE_END && character >= FORMAT_COLOUR_CODE_START) - { + + // Set any change in colour + if (character <= FORMAT_COLOUR_CODE_END && character >= FORMAT_COLOUR_CODE_START){ character -= FORMAT_COLOUR_CODE_START; character_colour = RCT2_GLOBAL(0x9FF048, uint8*)[character * 4]; continue; } + + // If another type of control character ignore if (character < 0x20) continue; + + // Convert to an indexable character character -= 0x20; uint8 character_width = RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH + 0x1C0, uint8)[character]; @@ -940,28 +971,23 @@ int sub_6C42D9(rct_string_id string_id, uint16 scroll, uint16 ebp) for (; character_width != 0;character_width--,character_bitmap++) { // Skip any none displayed columns - if (scroll != 0) - { + if (scroll != 0){ scroll--; continue; } - int16_t eax = *unk; - if (eax == -1) return RCT2_GLOBAL(0x9D7A84, uint32_t) + 0x606; - if (eax > -1) + sint16 scroll_position = *scrolling_mode_positions; + if (scroll_position == -1) return scroll_index + 0x606; + if (scroll_position > -1) { - uint8_t* dst = &unknown_pointer[eax]; - int ah = *character_bitmap; - while (true) - { - if (ah & 1) *dst = character_colour; - ah >>= 1; - dst += 0x40; - if (ah == 0) break; + uint8* dst = &scroll_pixel_pointer[scroll_position]; + for (uint8 char_bitmap = *character_bitmap; char_bitmap != 0; char_bitmap >>= 1){ + if (char_bitmap & 1) *dst = character_colour; + // Jump to next row + dst += 64; } } - unk++; - + scrolling_mode_positions++; } } } @@ -1014,8 +1040,8 @@ void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* m // If text not showing / ghost if (direction >= 2 || (map_element->flags & MAP_ELEMENT_FLAG_GHOST)) return; - int ebp = banner_scenery->banner.var_06; - ebp += direction; + uint16 scrollingMode = banner_scenery->banner.scrolling_mode; + scrollingMode += direction; RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = 0; RCT2_GLOBAL(0x13CE956, uint32_t) = 0; @@ -1034,7 +1060,7 @@ void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* m uint16 scroll = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) / 2) % string_width; RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x1500, sub_6C42D9(string_id, scroll, ebp), 0, height + 22, 1, 1, 0); + 0x1500, scrolling_text_setup(string_id, scroll, scrollingMode), 0, height + 22, 1, 1, 0); } /*rct2: 0x0068B35F*/ diff --git a/src/world/scenery.h b/src/world/scenery.h index c35704f13d..df208530a5 100644 --- a/src/world/scenery.h +++ b/src/world/scenery.h @@ -115,7 +115,7 @@ typedef struct { } rct_path_bit_scenery_entry; typedef struct { - uint8 var_06; + uint8 scrolling_mode; // 0x06 uint8 flags; // 0x07 sint16 price; // 0x08 uint8 scenery_tab_id; // 0x0A From c004d0e73f847f0cbf720c3ed308c6e66ed0b02d Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 30 May 2015 21:52:33 +0100 Subject: [PATCH 0048/1173] Refactor viewport_paint_setup --- src/interface/viewport.c | 197 +++++++++++++++++++-------------------- 1 file changed, 95 insertions(+), 102 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 0e715a5cfb..44735dff83 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1267,25 +1267,26 @@ void sub_68B35F(int ax, int cx) * * rct2: 0x0068B6C2 */ -void sub_0x68B6C2(){ - rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); - sint16 ax, bx, cx, dx; - uint16 num_vertical_quadrants = 0; - rct_xy16 mapTile; +void viewport_paint_setup(){ + rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + + rct_xy16 mapTile = { + .x = dpi->x & 0xFFE0, + .y = (dpi->y - 16) & 0xFFE0 + }; + + sint16 half_x = mapTile.x / 2; + + uint16 num_vertical_quadrants = (dpi->height + 2128) / 32; + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)){ case 0: - mapTile.x = dpi->x & 0xFFE0; - mapTile.y = (dpi->y - 16) & 0xFFE0; - - bx = mapTile.x / 2; - mapTile.x = mapTile.y - bx; - mapTile.y = mapTile.y + bx; + mapTile.x = mapTile.y - half_x; + mapTile.y = mapTile.y + half_x; mapTile.x &= 0xFFE0; mapTile.y &= 0xFFE0; - - num_vertical_quadrants = (dpi->height + 2128) / 32; - + for (; num_vertical_quadrants > 0; --num_vertical_quadrants){ sub_68B35F(mapTile.x, mapTile.y); sub_0x69E8B0(mapTile.x, mapTile.y); @@ -1309,98 +1310,90 @@ void sub_0x68B6C2(){ } break; case 1: - ax = dpi->y; - bx = dpi->x; - ax -= 0x10; - bx &= 0xFFE0; - ax &= 0xFFE0; - bx >>= 1; - cx = ax; - ax = -ax; - ax -= bx; - cx -= bx; - cx -= 0x10; - ax &= 0xFFE0; - cx &= 0xFFE0; - dx = dpi->height; - dx += 0x860; - dx >>= 5; - for (int i = dx; i > 0; i--){ - sub_68B35F(ax, cx); - sub_0x69E8B0(ax, cx); - ax -= 0x20; - cx -= 0x20; - sub_0x69E8B0(ax, cx); - cx += 0x20; - sub_68B35F(ax, cx); - sub_0x69E8B0(ax, cx); - ax += 0x20; - cx += 0x20; - sub_0x69E8B0(ax, cx); - ax -= 0x20; + mapTile.x = -mapTile.y - half_x; + mapTile.y = mapTile.y - half_x - 16; + + mapTile.x &= 0xFFE0; + mapTile.y &= 0xFFE0; + + for (; num_vertical_quadrants > 0; --num_vertical_quadrants){ + sub_68B35F(mapTile.x, mapTile.y); + sub_0x69E8B0(mapTile.x, mapTile.y); + + mapTile.x -= 32; + mapTile.y -= 32; + + sub_0x69E8B0(mapTile.x, mapTile.y); + + mapTile.y += 32; + + sub_68B35F(mapTile.x, mapTile.y); + sub_0x69E8B0(mapTile.x, mapTile.y); + + mapTile.x += 32; + mapTile.y += 32; + + sub_0x69E8B0(mapTile.x, mapTile.y); + + mapTile.x -= 32; } break; case 2: - ax = dpi->y; - bx = dpi->x; - ax -= 0x10; - bx &= 0xFFE0; - ax &= 0xFFE0; - bx >>= 1; - ax = -ax; - cx = ax; - ax += bx; - cx -= bx; - ax &= 0xFFE0; - cx &= 0xFFE0; - dx = dpi->height; - dx += 0x860; - dx >>= 5; - for (int i = dx; i > 0; i--){ - sub_68B35F(ax, cx); - sub_0x69E8B0(ax, cx); - ax += 0x20; - cx -= 0x20; - sub_0x69E8B0(ax, cx); - ax -= 0x20; - sub_68B35F(ax, cx); - sub_0x69E8B0(ax, cx); - ax -= 0x20; - cx += 0x20; - sub_0x69E8B0(ax, cx); - cx -= 0x20; + mapTile.x = -mapTile.y + half_x; + mapTile.y = -mapTile.y - half_x; + + mapTile.x &= 0xFFE0; + mapTile.y &= 0xFFE0; + + for (; num_vertical_quadrants > 0; --num_vertical_quadrants){ + sub_68B35F(mapTile.x, mapTile.y); + sub_0x69E8B0(mapTile.x, mapTile.y); + + mapTile.x += 32; + mapTile.y -= 32; + + sub_0x69E8B0(mapTile.x, mapTile.y); + + mapTile.x -= 32; + + sub_68B35F(mapTile.x, mapTile.y); + sub_0x69E8B0(mapTile.x, mapTile.y); + + mapTile.x -= 32; + mapTile.y += 32; + + sub_0x69E8B0(mapTile.x, mapTile.y); + + mapTile.y -= 32; } break; case 3: - ax = dpi->y; - bx = dpi->x; - ax -= 0x10; - bx &= 0xFFE0; - ax &= 0xFFE0; - bx >>= 1; - cx = ax; - ax += bx; - cx = -cx; - cx += bx; - cx -= 0x10; - ax &= 0xFFE0; - cx &= 0xFFE0; - dx = dpi->height; - dx += 0x860; - dx >>= 5; - for (int i = dx; i > 0; i--){ - sub_68B35F(ax, cx); - sub_0x69E8B0(ax, cx); - ax += 0x20; - cx += 0x20; - sub_0x69E8B0(ax, cx); - cx -= 0x20; - sub_68B35F(ax, cx); - sub_0x69E8B0(ax, cx); - ax -= 0x20; - cx -= 0x20; - sub_0x69E8B0(ax, cx); - ax += 0x20; + mapTile.x = mapTile.y + half_x; + mapTile.y = -mapTile.y + half_x - 16; + + mapTile.x &= 0xFFE0; + mapTile.y &= 0xFFE0; + + for (; num_vertical_quadrants > 0; --num_vertical_quadrants){ + sub_68B35F(mapTile.x, mapTile.y); + sub_0x69E8B0(mapTile.x, mapTile.y); + + mapTile.x += 32; + mapTile.y += 32; + + sub_0x69E8B0(mapTile.x, mapTile.y); + + mapTile.y -= 32; + + sub_68B35F(mapTile.x, mapTile.y); + sub_0x69E8B0(mapTile.x, mapTile.y); + + mapTile.x -= 32; + mapTile.y -= 32; + + sub_0x69E8B0(mapTile.x, mapTile.y); + + mapTile.x += 32; } break; } @@ -1622,7 +1615,7 @@ void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, in RCT2_GLOBAL(0x140E9A8, uint32) = (int)dpi2; int ebp = 0, ebx = 0, esi = 0, ecx = 0; sub_0x68615B(0xEE788C); //Memory copy - sub_0x68B6C2(); + viewport_paint_setup(); sub_688217(); sub_688485(); @@ -2026,7 +2019,7 @@ void get_map_coordinates_from_pos(int screenX, int screenY, int flags, sint16 *x RCT2_GLOBAL(0xEE7880, uint32_t) = 0xF1A4CC; RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*) = dpi; sub_0x68615B(0xEE788C); - sub_0x68B6C2(); + viewport_paint_setup(); sub_688217(); sub_68862C(); } From 5ba52e3688a59bb4a8e7967a1bd8c2092ba3e82c Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 31 May 2015 10:27:48 +0100 Subject: [PATCH 0049/1173] Refactor of map_element_paint_setup --- src/interface/viewport.c | 286 +++++++++++++++++++-------------------- 1 file changed, 139 insertions(+), 147 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 44735dff83..d4009c8049 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1064,12 +1064,14 @@ void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* m } /*rct2: 0x0068B35F*/ -void sub_68B35F(int ax, int cx) +void map_element_paint_setup(int x, int y) { - if (ax < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16_t) && - cx < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16_t) && - ax >= 32 && cx >= 32) - { + rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + + if (x < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16_t) && + y < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16_t) && + x >= 32 && y >= 32){ + RCT2_GLOBAL(0x141E9B4, uint32_t) = 0xFFFF; RCT2_GLOBAL(0x141E9B8, uint32_t) = 0xFFFF; RCT2_GLOBAL(0x141E9BC, uint32_t) = 0xFFFF; @@ -1086,166 +1088,156 @@ void sub_68B35F(int ax, int cx) RCT2_GLOBAL(0x9E3138, uint8_t) = 0xFF; RCT2_GLOBAL(0x9E30B6, uint8_t) = 0xFF; RCT2_GLOBAL(0x9E323C, uint8_t) = 0xFF; - RCT2_GLOBAL(0x9DE56A, uint16_t) = ax; - RCT2_GLOBAL(0x9DE56E, uint16_t) = cx; - RCT2_GLOBAL(0x9DE574, uint16_t) = ax; - RCT2_GLOBAL(0x9DE576, uint16_t) = cx; - int dx = cx; - int esi = dx; - esi <<= 8; - esi |= ax; - esi >>= 3; - int ax_tmp = ax; - int cx_tmp = cx; - rct_map_element* map_element = TILE_MAP_ELEMENT_POINTER(esi / 4); - rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + RCT2_GLOBAL(0x9DE56A, uint16_t) = x; + RCT2_GLOBAL(0x9DE56E, uint16_t) = y; + RCT2_GLOBAL(0x9DE574, uint16_t) = x; + RCT2_GLOBAL(0x9DE576, uint16_t) = y; + + rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); + + int dx = 0; switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) { case 0: - dx = ax + cx; + dx = x + y; break; case 1: - ax += 32; - dx = cx - ax; + x += 32; + dx = y - x; break; case 2: - ax += 32; - cx += 32; - dx = -(ax + cx); + x += 32; + y += 32; + dx = -(x + y); break; case 3: - cx += 32; - dx = ax - cx; + y += 32; + dx = x - y; break; } dx /= 2; // Display little yellow arrow when building footpaths? - if ((RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16_t) & 4) && - RCT2_GLOBAL(0x9DE56A, uint16_t) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16_t) && - RCT2_GLOBAL(0x9DE56E, uint16_t) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16_t)) - { + if ((RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & 4) && + RCT2_GLOBAL(0x9DE56A, uint16) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) && + RCT2_GLOBAL(0x9DE56E, uint16) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16)){ + uint8 arrowRotation = + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + + (RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) & 3) & 3; + + uint32 imageId = + arrowRotation + + (RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) & 0xFC) + + 0x20900C27; + + int arrowZ = RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16); + + RCT2_GLOBAL(0x9DE568, uint16) = x; + RCT2_GLOBAL(0x9DE56C, uint16) = y; + RCT2_GLOBAL(0x9DE570, uint8) = 0; + RCT2_GLOBAL(0x9DEA52, uint16) = 0; + RCT2_GLOBAL(0x9DEA54, uint16) = 0; + RCT2_GLOBAL(0x9DEA56, uint16) = arrowZ + 18; - int ebx = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t); - RCT2_GLOBAL(0x9DE568, uint16_t) = ax; - RCT2_GLOBAL(0x9DE56C, uint16_t) = cx; - int dl = RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8_t) & 3; - ebx += dl; - ebx &= 3; - dl = RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8_t) & 0xFC; - ebx += dl; - ebx += 0x20900C27; - int d = RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16_t); - RCT2_GLOBAL(0x9DE570, uint8_t) = 0; - RCT2_GLOBAL(0x9DEA52, uint16_t) = 0; - RCT2_GLOBAL(0x9DEA54, uint16_t) = 0; - RCT2_GLOBAL(0x9DEA56, uint16_t) = d + 18; RCT2_CALLPROC_X( - (int)RCT2_ADDRESS(0x0098197C, uint32_t*)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0xFF00, ebx, cx & 0xFF00, d, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + (int)RCT2_ADDRESS(0x0098197C, uint32*)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)], + 0xFF00, imageId, y & 0xFF00, arrowZ, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); } int bx = dx + 52; - if (bx > dpi->y) - { - rct_map_element* element = map_element;//push map_element - bx = element->clearance_height; - if (!map_element_is_last_for_tile(element)) - { - while (true) - { - element++; - bx = max(bx, element->clearance_height); - if (map_element_is_last_for_tile(element)) break; - } - } - if (map_element_get_type(element) == MAP_ELEMENT_TYPE_SURFACE && - (element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) != 0) - { - bx = (element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) << 1; - } - bx <<= 3; - dx -= bx; - dx -= 32; - element = map_element;//pop map_element - dx -= dpi->height; - if (dx < dpi->y) - { - RCT2_GLOBAL(0x9DE568, uint16_t) = ax; - RCT2_GLOBAL(0x9DE56C, uint16_t) = cx; - RCT2_GLOBAL(0x9DE57C, uint16_t) = 0; - while (true) - { - int direction = (map_element->type + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) & MAP_ELEMENT_DIRECTION_MASK; - dx = map_element->base_height * 8; - uint32_t dword_9DE574 = RCT2_GLOBAL(0x9DE574, uint32_t); - RCT2_GLOBAL(0x9DE578, rct_map_element*) = map_element; - //setup the painting of for example: the underground, signs, rides, scenery, etc. - switch (map_element_get_type(map_element)) - { - case MAP_ELEMENT_TYPE_SURFACE: - RCT2_CALLPROC_X(0x66062C, 0, 0, direction, dx, (int)map_element, 0, 0); - break; - case MAP_ELEMENT_TYPE_PATH: - RCT2_CALLPROC_X(0x6A3590, 0, 0, direction, dx, (int)map_element, 0, 0); - break; - case MAP_ELEMENT_TYPE_TRACK: - RCT2_CALLPROC_X(0x6C4794, 0, 0, direction, dx, (int)map_element, 0, 0); - break; - case MAP_ELEMENT_TYPE_SCENERY: - RCT2_CALLPROC_X(0x6DFF47, 0, 0, direction, dx, (int)map_element, 0, 0); - break; - case MAP_ELEMENT_TYPE_ENTRANCE: - RCT2_CALLPROC_X(0x664FD4, 0, 0, direction, dx, (int)map_element, 0, 0); - break; - case MAP_ELEMENT_TYPE_FENCE: - RCT2_CALLPROC_X(0x6E44B0, 0, 0, direction, dx, (int)map_element, 0, 0); - break; - case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: - RCT2_CALLPROC_X(0x6B7F0C, 0, 0, direction, dx, (int)map_element, 0, 0); - break; - case MAP_ELEMENT_TYPE_BANNER: - //there are still some small localisation glitches, - //because the old function still gets called sometimes - viewport_banner_paint_setup(direction, dx, map_element); - //Until that is solved, use the original function instead - //RCT2_CALLPROC_X(0x6B9CC4, 0, 0, direction, dx, (int)map_element, 0, 0); - break; - default: - // This is a little hack for taking care of undefined map_elements - // 8cars MOM used a dirty version of this to skip drawing certain elements - if (map_element_is_last_for_tile(map_element)) - return; - map_element++; - break; - } - RCT2_GLOBAL(0x9DE574, uint32_t) = dword_9DE574; - int stop = map_element_is_last_for_tile(map_element); - map_element++; - if (stop) break; - } - } + + if (bx <= dpi->y) + return; + + rct_map_element* element = map_element;//push map_element + + sint16 max_height = 0; + do{ + max_height = max(max_height, element->clearance_height); + } while (!map_element_is_last_for_tile(element++)); + + element--; + + if (map_element_get_type(element) == MAP_ELEMENT_TYPE_SURFACE && + (element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) != 0){ + max_height = (element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) << 1; } + + max_height *= 8; + + dx -= max_height + 32; + + element = map_element;//pop map_element + dx -= dpi->height; + if (dx >= dpi->y) + return; + + RCT2_GLOBAL(0x9DE568, uint16_t) = x; + RCT2_GLOBAL(0x9DE56C, uint16_t) = y; + RCT2_GLOBAL(0x9DE57C, uint16_t) = 0; + do{ + int direction = (map_element->type + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) & MAP_ELEMENT_DIRECTION_MASK; + int height = map_element->base_height * 8; + + uint32_t dword_9DE574 = RCT2_GLOBAL(0x9DE574, uint32_t); + RCT2_GLOBAL(0x9DE578, rct_map_element*) = map_element; + //setup the painting of for example: the underground, signs, rides, scenery, etc. + switch (map_element_get_type(map_element)) + { + case MAP_ELEMENT_TYPE_SURFACE: + RCT2_CALLPROC_X(0x66062C, 0, 0, direction, height, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_PATH: + RCT2_CALLPROC_X(0x6A3590, 0, 0, direction, height, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_TRACK: + RCT2_CALLPROC_X(0x6C4794, 0, 0, direction, height, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_SCENERY: + RCT2_CALLPROC_X(0x6DFF47, 0, 0, direction, height, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_ENTRANCE: + RCT2_CALLPROC_X(0x664FD4, 0, 0, direction, height, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_FENCE: + RCT2_CALLPROC_X(0x6E44B0, 0, 0, direction, height, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: + RCT2_CALLPROC_X(0x6B7F0C, 0, 0, direction, height, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_BANNER: + viewport_banner_paint_setup(direction, height, map_element); + break; + default: + // This is a little hack for taking care of undefined map_elements + // 8cars MOM used a dirty version of this to skip drawing certain elements + if (map_element_is_last_for_tile(map_element)) + return; + map_element++; + break; + } + RCT2_GLOBAL(0x9DE574, uint32_t) = dword_9DE574; + } while (!map_element_is_last_for_tile(map_element++)); + } - else - { - rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + else{ + int dx; switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) { case 0: - dx = ax + cx; + dx = x + y; break; case 1: - ax += 32; - dx = cx - ax; + x += 32; + dx = y - x; break; case 2: - ax += 32; - cx += 32; - dx = -(ax + cx); + x += 32; + y += 32; + dx = -(x + y); break; case 3: - cx += 32; - dx = ax - cx; + y += 32; + dx = x - y; break; } dx /= 2; @@ -1255,11 +1247,11 @@ void sub_68B35F(int ax, int cx) dx -= 20; dx -= dpi->height; if (dx >= dpi->y) return; - RCT2_GLOBAL(0x9DE568, uint16_t) = ax; - RCT2_GLOBAL(0x9DE56C, uint16_t) = cx; + RCT2_GLOBAL(0x9DE568, uint16_t) = x; + RCT2_GLOBAL(0x9DE56C, uint16_t) = y; RCT2_GLOBAL(0x9DE570, uint8_t) = 0; RCT2_CALLPROC_X((int)RCT2_ADDRESS(0x98196C, uint32_t*)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0xFF00, 3123, cx & 0xFF00, 16, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + 0xFF00, 3123, y & 0xFF00, 16, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); } } @@ -1288,7 +1280,7 @@ void viewport_paint_setup(){ mapTile.y &= 0xFFE0; for (; num_vertical_quadrants > 0; --num_vertical_quadrants){ - sub_68B35F(mapTile.x, mapTile.y); + map_element_paint_setup(mapTile.x, mapTile.y); sub_0x69E8B0(mapTile.x, mapTile.y); mapTile.x -= 32; @@ -1298,7 +1290,7 @@ void viewport_paint_setup(){ mapTile.x += 32; - sub_68B35F(mapTile.x, mapTile.y); + map_element_paint_setup(mapTile.x, mapTile.y); sub_0x69E8B0(mapTile.x, mapTile.y); mapTile.x += 32; @@ -1317,7 +1309,7 @@ void viewport_paint_setup(){ mapTile.y &= 0xFFE0; for (; num_vertical_quadrants > 0; --num_vertical_quadrants){ - sub_68B35F(mapTile.x, mapTile.y); + map_element_paint_setup(mapTile.x, mapTile.y); sub_0x69E8B0(mapTile.x, mapTile.y); mapTile.x -= 32; @@ -1327,7 +1319,7 @@ void viewport_paint_setup(){ mapTile.y += 32; - sub_68B35F(mapTile.x, mapTile.y); + map_element_paint_setup(mapTile.x, mapTile.y); sub_0x69E8B0(mapTile.x, mapTile.y); mapTile.x += 32; @@ -1346,7 +1338,7 @@ void viewport_paint_setup(){ mapTile.y &= 0xFFE0; for (; num_vertical_quadrants > 0; --num_vertical_quadrants){ - sub_68B35F(mapTile.x, mapTile.y); + map_element_paint_setup(mapTile.x, mapTile.y); sub_0x69E8B0(mapTile.x, mapTile.y); mapTile.x += 32; @@ -1356,7 +1348,7 @@ void viewport_paint_setup(){ mapTile.x -= 32; - sub_68B35F(mapTile.x, mapTile.y); + map_element_paint_setup(mapTile.x, mapTile.y); sub_0x69E8B0(mapTile.x, mapTile.y); mapTile.x -= 32; @@ -1375,7 +1367,7 @@ void viewport_paint_setup(){ mapTile.y &= 0xFFE0; for (; num_vertical_quadrants > 0; --num_vertical_quadrants){ - sub_68B35F(mapTile.x, mapTile.y); + map_element_paint_setup(mapTile.x, mapTile.y); sub_0x69E8B0(mapTile.x, mapTile.y); mapTile.x += 32; @@ -1385,7 +1377,7 @@ void viewport_paint_setup(){ mapTile.y -= 32; - sub_68B35F(mapTile.x, mapTile.y); + map_element_paint_setup(mapTile.x, mapTile.y); sub_0x69E8B0(mapTile.x, mapTile.y); mapTile.x -= 32; From b20513187c915a7fb1aa3a54ddcf5754708dcc2a Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 31 May 2015 10:54:01 +0100 Subject: [PATCH 0050/1173] Start viewport_entrance_paint_setup --- src/interface/viewport.c | 46 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index d4009c8049..446fa9fa25 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -992,6 +992,51 @@ int scrolling_text_setup(rct_string_id string_id, uint16 scroll, uint16 scrollin } } +/* rct2: 0x00664FD4 */ +void viewport_entrance_paint_setup(uint8 direction, int height, rct_map_element* map_element){ + RCT2_GLOBAL(0x9DE570, uint8_t) = 0xB; + + rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_PATH_HEIGHTS && + dpi->zoom_level == 0){ + uint32 ebx = + (map_element->properties.entrance.type << 4) | + (map_element->properties.entrance.index & 0xF); + + if (RCT2_ADDRESS(0x0097B974, uint8)[ebx] & 0xF){ + + int z = map_element->base_height * 8 + 3; + uint32 image_id = + z / 16 + + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS,sint16) + + 0x20101689; + + image_id -= RCT2_GLOBAL(0x01359208, sint16); + + RCT2_GLOBAL(0x009DEA52, uint16) = 31; + RCT2_GLOBAL(0x009DEA54, uint16) = 31; + RCT2_GLOBAL(0x009DEA56, sint16) = z; + RCT2_GLOBAL(0x009DEA56, uint16) += 64; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 16, image_id, 16, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + } + } + + switch (map_element->properties.entrance.type){ + case ENTRANCE_TYPE_RIDE_ENTRANCE: + //66508C + break; + case ENTRANCE_TYPE_RIDE_EXIT: + //665540 + break; + case ENTRANCE_TYPE_PARK_ENTRANCE: + //6658ED + break; + } +} + /* rct2: 0x006B9CC4 */ void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* map_element) { @@ -1195,6 +1240,7 @@ void map_element_paint_setup(int x, int y) RCT2_CALLPROC_X(0x6DFF47, 0, 0, direction, height, (int)map_element, 0, 0); break; case MAP_ELEMENT_TYPE_ENTRANCE: + //viewport_entrance_paint_setup(direction, height, map_element); RCT2_CALLPROC_X(0x664FD4, 0, 0, direction, height, (int)map_element, 0, 0); break; case MAP_ELEMENT_TYPE_FENCE: From 3781918957bf0025adb933fd5953d2f7a68d87cd Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 31 May 2015 13:49:39 +0100 Subject: [PATCH 0051/1173] Added viewport_ride_entrance_paint_setup --- src/interface/viewport.c | 179 +++++++++++++++++++++++++++++++++- src/localisation/string_ids.h | 3 + 2 files changed, 177 insertions(+), 5 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 446fa9fa25..c196c24673 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -992,6 +992,175 @@ int scrolling_text_setup(rct_string_id string_id, uint16 scroll, uint16 scrollin } } +/* rct2: 0x006629BC + * returns al + * ebp : image_id + * ax : unknown + * dx : height + * edi : unknown + */ +int sub_6629BC(int height, uint16 ax, uint32 image_id, uint32 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); + + return eax & 0xFF; +} + +typedef struct{ + uint32 image_id; + sint16 height; + sint16 scrolling_mode; +}rct_entrance_style; + +/* rct2: 0x0066508C */ +void viewport_ride_entrance_paint_setup(uint8 direction, int height, rct_map_element* map_element){ + rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + + if (RCT2_GLOBAL(0x9DEA6F, uint8_t) & 1){ + if (map_element->properties.entrance.ride_index != RCT2_GLOBAL(0x00F64DE8, uint8)) + return; + } + + rct_ride* ride = GET_RIDE(map_element->properties.entrance.ride_index); + + rct_entrance_style* style = &RCT2_ADDRESS(0x00993E7C,rct_entrance_style)[ride->entrance_style]; + + uint8 colour_1, colour_2; + uint32 image_id_1 = 0, image_id_2 = 0; + if (RCT2_ADDRESS(0x00993E1C, uint32)[ride->entrance_style * 2] & (1 << 30)){ + colour_1 = ride->track_colour_main[0] + 0x70; + image_id_1 = (colour_1 << 19) | 0x40000000; + } + + colour_1 = ride->track_colour_main[0]; + colour_2 = ride->track_colour_additional[0]; + image_id_2 = (colour_1 << 19) | (colour_2 << 24) | 0xA0000000; + + RCT2_GLOBAL(0x009DE570, uint8) = 3; + RCT2_GLOBAL(0x009E32BC, uint32) = 0; + + if (map_element->flags & MAP_ELEMENT_FLAG_GHOST){ + RCT2_GLOBAL(0x009DE570, uint8) = 0; + image_id_2 = RCT2_ADDRESS(0x993CC4, uint32_t)[RCT2_GLOBAL(0x9AACBF, uint8)]; + RCT2_GLOBAL(0x009E32BC, uint32) = image_id_2; + if (image_id_1) + image_id_1 = image_id_2; + } + + image_id_2 |= style->image_id + direction; + + // Format modifed to stop repeated code + + // Each entrance is split into 2 images for drawing + // Certain entrance styles have another 2 images to draw for coloured windows + + RCT2_GLOBAL(0x009DEA52, uint16) = 2; + RCT2_GLOBAL(0x009DEA54, uint16) = 2; + RCT2_GLOBAL(0x009DEA56, uint16) = height; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0x3300, image_id_2, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + + if (image_id_1){ + image_id_1 |= style->image_id + direction + 16; + RCT2_GLOBAL(0x009DEA52, uint16) = 2; + RCT2_GLOBAL(0x009DEA54, uint16) = 2; + RCT2_GLOBAL(0x009DEA56, uint16) = height; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0x3300, image_id_1, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + } + + image_id_2 += 4; + + RCT2_GLOBAL(0x009DEA52, uint16) = 2; + RCT2_GLOBAL(0x009DEA54, uint16) = 28; + RCT2_GLOBAL(0x009DEA56, uint16) = height; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0x3300, image_id_2, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + + if (image_id_1){ + image_id_1 += 4; + RCT2_GLOBAL(0x009DEA52, uint16) = 2; + RCT2_GLOBAL(0x009DEA54, uint16) = 28; + RCT2_GLOBAL(0x009DEA56, uint16) = height; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0x3300, image_id_1, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + } + + uint32 eax = 0xFFFF0600 | ((height / 16) & 0xFF); + if (direction & 1){ + RCT2_ADDRESS(0x009E30B6, uint32)[RCT2_GLOBAL(0x141F56B, uint8) / 2] = eax; + RCT2_GLOBAL(0x141F56B, uint8)++; + } + else{ + RCT2_ADDRESS(0x009E3138, uint32)[RCT2_GLOBAL(0x141F56A, uint8) / 2] = eax; + RCT2_GLOBAL(0x141F56A, uint8)++; + } + + if (!(map_element->flags & MAP_ELEMENT_FLAG_GHOST) && + map_element->properties.entrance.ride_index != 0xFF){ + + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = 0; + RCT2_GLOBAL(0x13CE956, uint32) = 0; + + rct_string_id string_id = STR_RIDE_ENTRANCE_CLOSED; + + if (ride->status == RIDE_STATUS_OPEN && + !(ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN)){ + + RCT2_GLOBAL(0x0013CE954, uint32) = ride->name_arguments; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, rct_string_id) = ride->name; + + string_id = STR_RIDE_ENTRANCE_NAME; + } + + uint8 entrance_string[MAX_PATH]; + format_string(entrance_string, string_id, RCT2_ADDRESS(RCT2_ADDRESS_COMMON_FORMAT_ARGS, void)); + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0x1C0; + + uint16 string_width = gfx_get_string_width(entrance_string); + uint16 scroll = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) / 2) % string_width; + + RCT2_GLOBAL(0x009DEA52, uint16) = 2; + RCT2_GLOBAL(0x009DEA54, uint16) = 2; + RCT2_GLOBAL(0x009DEA56, uint16) = height + style->height; + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0x3300, scrolling_text_setup(string_id, scroll, style->scrolling_mode), 0, height + style->height, 0x1C, 0x1C, 0); + } + + uint32 image_id = RCT2_GLOBAL(0x009E32BC, uint32); + if (!image_id){ + image_id = 0x20B80000; + } + + if (direction & 1){ + sub_6629BC(height, 0, image_id, 1); + } + else{ + sub_6629BC(height, 0, image_id, 0); + } + + RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9B8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9BC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9CC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D4, uint16) = 0xFFFF; + + if (RCT2_GLOBAL(0x141E9D8, sint16) < height + 56){ + RCT2_GLOBAL(0x141E9D8, sint16) = height + 56; + RCT2_GLOBAL(0x141E9DA, uint8) = 32; + } +} + /* rct2: 0x00664FD4 */ void viewport_entrance_paint_setup(uint8 direction, int height, rct_map_element* map_element){ RCT2_GLOBAL(0x9DE570, uint8_t) = 0xB; @@ -1026,7 +1195,7 @@ void viewport_entrance_paint_setup(uint8 direction, int height, rct_map_element* switch (map_element->properties.entrance.type){ case ENTRANCE_TYPE_RIDE_ENTRANCE: - //66508C + viewport_ride_entrance_paint_setup(direction, height, map_element); break; case ENTRANCE_TYPE_RIDE_EXIT: //665540 @@ -1055,7 +1224,7 @@ void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* m RCT2_GLOBAL(0x9DEA56, uint16_t) = height + 2; - RCT2_GLOBAL(0x9DEA52, uint32_t) = RCT2_ADDRESS(0x98D884, uint32_t)[direction * 2]; + RCT2_GLOBAL(0x9DEA52, uint32_t) = RCT2_ADDRESS(0x98D884, uint32)[direction * 2]; uint32 base_id = (direction << 1) + banner_scenery->image; uint32 image_id = base_id; @@ -1063,7 +1232,7 @@ void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* m if (map_element->flags & MAP_ELEMENT_FLAG_GHOST)//if being placed { RCT2_GLOBAL(0x9DE570, uint8_t) = 0; - image_id |= RCT2_ADDRESS(0x993CC4, uint32_t)[RCT2_GLOBAL(0x9AACBF, uint8_t)]; + image_id |= RCT2_ADDRESS(0x993CC4, uint32_t)[RCT2_GLOBAL(0x9AACBF, uint8)]; } else{ image_id |= @@ -1240,8 +1409,8 @@ void map_element_paint_setup(int x, int y) RCT2_CALLPROC_X(0x6DFF47, 0, 0, direction, height, (int)map_element, 0, 0); break; case MAP_ELEMENT_TYPE_ENTRANCE: - //viewport_entrance_paint_setup(direction, height, map_element); - RCT2_CALLPROC_X(0x664FD4, 0, 0, direction, height, (int)map_element, 0, 0); + viewport_entrance_paint_setup(direction, height, map_element); + //RCT2_CALLPROC_X(0x664FD4, 0, 0, direction, height, (int)map_element, 0, 0); break; case MAP_ELEMENT_TYPE_FENCE: RCT2_CALLPROC_X(0x6E44B0, 0, 0, direction, height, (int)map_element, 0, 0); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 6b01892cd7..2e040cf311 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -324,6 +324,9 @@ enum { STR_OPTIONS_TITLE = 1168, STR_SOUND_NONE = 1169, + STR_RIDE_ENTRANCE_CLOSED = 1171, + STR_RIDE_ENTRANCE_NAME = 1172, + STR_BUILD_FOOTPATH_TIP = 1173, STR_BANNER_SIGN_IN_THE_WAY = 1174, From cb7d579c9a6d9231106b717d414f9eaa50ff4cad Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 1 Jun 2015 18:11:54 +0100 Subject: [PATCH 0052/1173] Refactor of sprite_paint_setup and litter_setup. Also generalized entrance_setup so that it can be used for exits as well --- src/interface/viewport.c | 166 ++++++++++++++++++++------------------- src/world/sprite.h | 2 +- 2 files changed, 86 insertions(+), 82 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index c196c24673..7423c0a001 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -769,42 +769,29 @@ int sub_0x686806(rct_sprite* sprite, int eax, int image_id, int ecx, int edx){ /** -* Litter Paint Setup?? +* Litter Paint Setup * rct2: 0x006736FC */ -void sub_0x6736FC(rct_litter* litter, int ebx, int edx){ +void viewport_litter_paint_setup(rct_litter* litter, int image_direction, int height){ rct_drawpixelinfo* dpi; dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); if (dpi->zoom_level != 0)return; //If zoomed at all no litter drawn - int ebp = litter->var_01; - //push litter - ebx >>= 3; - ebx &= RCT2_ADDRESS(0x97EF6C, uint32)[ebp * 2 + 1]; - ebx += RCT2_ADDRESS(0x97EF6C, uint32)[ebp * 2]; - int ecx = 0; - int edi = 4; - int esi = 4; - int eax = 0xFF00; + // litter has no sprite direction so remove that + image_direction >>= 3; + // Some litter types have only 1 direction so remove + // anything that isn't required. + image_direction &= RCT2_ADDRESS(0x97EF6C, uint32)[litter->type * 2 + 1]; + + uint32 image_id = image_direction + RCT2_ADDRESS(0x97EF6C, uint32)[litter->type * 2]; + RCT2_GLOBAL(0x9DEA52, uint16) = 0xFFFC; RCT2_GLOBAL(0x9DEA54, uint16) = 0xFFFC; - RCT2_GLOBAL(0x9DEA56, uint16) = edx + 2; + RCT2_GLOBAL(0x9DEA56, uint16) = height + 2; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)){ - case 0: - //0x686806 - break; - case 1: - //0x6869b2 - break; - case 2: - //0x686b6f - break; - case 3: - //0x686d31 - break; - } + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0xFF00, image_id, 0, height, 4, 4, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); } @@ -812,7 +799,7 @@ void sub_0x6736FC(rct_litter* litter, int ebx, int edx){ * Paint Quadrant * rct2: 0x0069E8B0 */ -void sub_0x69E8B0(uint16 eax, uint16 ecx){ +void sprite_paint_setup(uint16 eax, uint16 ecx){ uint32 _eax = eax, _ecx = ecx; rct_drawpixelinfo* dpi; @@ -842,30 +829,33 @@ void sub_0x69E8B0(uint16 eax, uint16 ecx){ if (dpi->x + dpi->width <= spr->unknown.sprite_left)continue; if (spr->unknown.sprite_right <= dpi->x)continue; - int ebx = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); + int image_direction = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); + image_direction <<= 3; + image_direction += spr->unknown.sprite_direction; + image_direction &= 0x1F; + RCT2_GLOBAL(0x9DE578, uint32) = (uint32)spr; int ebp = spr->unknown.sprite_identifier; - ebx <<= 3; - eax = spr->unknown.x; - ebx += spr->unknown.sprite_direction; - ecx = spr->unknown.y; - ebx &= 0x1F; + RCT2_GLOBAL(0x9DE568, uint16) = spr->unknown.x; RCT2_GLOBAL(0x9DE570, uint8) = 2; RCT2_GLOBAL(0x9DE56C, uint16) = spr->unknown.y; - int edx = spr->unknown.z; + switch (spr->unknown.sprite_identifier){ case SPRITE_IDENTIFIER_VEHICLE: - RCT2_CALLPROC_X(0x6D4244, eax, ebx, ecx, edx, (int)spr, (int)dpi, ebp); + RCT2_CALLPROC_X(0x6D4244, spr->unknown.x, image_direction, spr->unknown.y, spr->unknown.z, (int)spr, (int)dpi, ebp); break; case SPRITE_IDENTIFIER_PEEP: - RCT2_CALLPROC_X(0x68F0FB, eax, ebx, ecx, edx, (int)spr, (int)dpi, ebp); + RCT2_CALLPROC_X(0x68F0FB, spr->unknown.x, image_direction, spr->unknown.y, spr->unknown.z, (int)spr, (int)dpi, ebp); break; case SPRITE_IDENTIFIER_MISC: - RCT2_CALLPROC_X(0x672AC9, eax, ebx, ecx, edx, (int)spr, (int)dpi, ebp); + RCT2_CALLPROC_X(0x672AC9, spr->unknown.x, image_direction, spr->unknown.y, spr->unknown.z, (int)spr, (int)dpi, ebp); break; case SPRITE_IDENTIFIER_LITTER: - RCT2_CALLPROC_X(0x6736FC, eax, ebx, ecx, edx, (int)spr, (int)dpi, ebp); + viewport_litter_paint_setup((rct_litter*)spr, image_direction, spr->unknown.z); + break; + default: + assert(false); break; } } @@ -1013,9 +1003,10 @@ typedef struct{ sint16 scrolling_mode; }rct_entrance_style; -/* rct2: 0x0066508C */ -void viewport_ride_entrance_paint_setup(uint8 direction, int height, rct_map_element* map_element){ +/* rct2: 0x0066508C & 0x00665540 */ +void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_map_element* map_element){ rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + uint8 is_exit = map_element->properties.entrance.type == ENTRANCE_TYPE_RIDE_EXIT; if (RCT2_GLOBAL(0x9DEA6F, uint8_t) & 1){ if (map_element->properties.entrance.ride_index != RCT2_GLOBAL(0x00F64DE8, uint8)) @@ -1027,29 +1018,33 @@ void viewport_ride_entrance_paint_setup(uint8 direction, int height, rct_map_ele rct_entrance_style* style = &RCT2_ADDRESS(0x00993E7C,rct_entrance_style)[ride->entrance_style]; uint8 colour_1, colour_2; - uint32 image_id_1 = 0, image_id_2 = 0; + uint32 transparant_image_id = 0, image_id = 0; if (RCT2_ADDRESS(0x00993E1C, uint32)[ride->entrance_style * 2] & (1 << 30)){ colour_1 = ride->track_colour_main[0] + 0x70; - image_id_1 = (colour_1 << 19) | 0x40000000; + transparant_image_id = (colour_1 << 19) | 0x40000000; } colour_1 = ride->track_colour_main[0]; colour_2 = ride->track_colour_additional[0]; - image_id_2 = (colour_1 << 19) | (colour_2 << 24) | 0xA0000000; + image_id = (colour_1 << 19) | (colour_2 << 24) | 0xA0000000; RCT2_GLOBAL(0x009DE570, uint8) = 3; RCT2_GLOBAL(0x009E32BC, uint32) = 0; if (map_element->flags & MAP_ELEMENT_FLAG_GHOST){ RCT2_GLOBAL(0x009DE570, uint8) = 0; - image_id_2 = RCT2_ADDRESS(0x993CC4, uint32_t)[RCT2_GLOBAL(0x9AACBF, uint8)]; - RCT2_GLOBAL(0x009E32BC, uint32) = image_id_2; - if (image_id_1) - image_id_1 = image_id_2; + image_id = RCT2_ADDRESS(0x993CC4, uint32_t)[RCT2_GLOBAL(0x9AACBF, uint8)]; + RCT2_GLOBAL(0x009E32BC, uint32) = image_id; + if (transparant_image_id) + transparant_image_id = image_id; } - image_id_2 |= style->image_id + direction; - + if (is_exit){ + image_id |= style->image_id + direction + 8; + } + else{ + image_id |= style->image_id + direction; + } // Format modifed to stop repeated code // Each entrance is split into 2 images for drawing @@ -1059,36 +1054,43 @@ void viewport_ride_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, uint16) = height; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x3300, image_id_2, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + uint16 ax = is_exit ? 0x2300 : 0x3300; - if (image_id_1){ - image_id_1 |= style->image_id + direction + 16; + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + ax, image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + + if (transparant_image_id){ + if (is_exit){ + transparant_image_id |= style->image_id + direction + 16; + } + else{ + transparant_image_id |= style->image_id + direction + 24; + } RCT2_GLOBAL(0x009DEA52, uint16) = 2; RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, uint16) = height; RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x3300, image_id_1, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + ax, transparant_image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); } - image_id_2 += 4; + image_id += 4; RCT2_GLOBAL(0x009DEA52, uint16) = 2; RCT2_GLOBAL(0x009DEA54, uint16) = 28; RCT2_GLOBAL(0x009DEA56, uint16) = height; RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x3300, image_id_2, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + ax, image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); - if (image_id_1){ - image_id_1 += 4; + if (transparant_image_id){ + transparant_image_id += 4; RCT2_GLOBAL(0x009DEA52, uint16) = 2; RCT2_GLOBAL(0x009DEA54, uint16) = 28; RCT2_GLOBAL(0x009DEA56, uint16) = height; RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x3300, image_id_1, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + ax, transparant_image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); } uint32 eax = 0xFFFF0600 | ((height / 16) & 0xFF); @@ -1101,7 +1103,8 @@ void viewport_ride_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_GLOBAL(0x141F56A, uint8)++; } - if (!(map_element->flags & MAP_ELEMENT_FLAG_GHOST) && + if (!is_exit && + !(map_element->flags & MAP_ELEMENT_FLAG_GHOST) && map_element->properties.entrance.ride_index != 0xFF){ RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = 0; @@ -1133,7 +1136,7 @@ void viewport_ride_entrance_paint_setup(uint8 direction, int height, rct_map_ele 0x3300, scrolling_text_setup(string_id, scroll, style->scrolling_mode), 0, height + style->height, 0x1C, 0x1C, 0); } - uint32 image_id = RCT2_GLOBAL(0x009E32BC, uint32); + image_id = RCT2_GLOBAL(0x009E32BC, uint32); if (!image_id){ image_id = 0x20B80000; } @@ -1155,8 +1158,9 @@ void viewport_ride_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_GLOBAL(0x141E9D0, uint16) = 0xFFFF; RCT2_GLOBAL(0x141E9D4, uint16) = 0xFFFF; - if (RCT2_GLOBAL(0x141E9D8, sint16) < height + 56){ - RCT2_GLOBAL(0x141E9D8, sint16) = height + 56; + height += is_exit ? 40 : 56; + if (RCT2_GLOBAL(0x141E9D8, sint16) < height){ + RCT2_GLOBAL(0x141E9D8, sint16) = height; RCT2_GLOBAL(0x141E9DA, uint8) = 32; } } @@ -1195,10 +1199,10 @@ void viewport_entrance_paint_setup(uint8 direction, int height, rct_map_element* switch (map_element->properties.entrance.type){ case ENTRANCE_TYPE_RIDE_ENTRANCE: - viewport_ride_entrance_paint_setup(direction, height, map_element); + viewport_ride_entrance_exit_paint_setup(direction, height, map_element); break; case ENTRANCE_TYPE_RIDE_EXIT: - //665540 + viewport_ride_entrance_exit_paint_setup(direction, height, map_element); break; case ENTRANCE_TYPE_PARK_ENTRANCE: //6658ED @@ -1496,22 +1500,22 @@ void viewport_paint_setup(){ for (; num_vertical_quadrants > 0; --num_vertical_quadrants){ map_element_paint_setup(mapTile.x, mapTile.y); - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.x -= 32; mapTile.y += 32; - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.x += 32; map_element_paint_setup(mapTile.x, mapTile.y); - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.x += 32; mapTile.y -= 32; - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.y += 32; } @@ -1525,22 +1529,22 @@ void viewport_paint_setup(){ for (; num_vertical_quadrants > 0; --num_vertical_quadrants){ map_element_paint_setup(mapTile.x, mapTile.y); - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.x -= 32; mapTile.y -= 32; - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.y += 32; map_element_paint_setup(mapTile.x, mapTile.y); - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.x += 32; mapTile.y += 32; - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.x -= 32; } @@ -1554,22 +1558,22 @@ void viewport_paint_setup(){ for (; num_vertical_quadrants > 0; --num_vertical_quadrants){ map_element_paint_setup(mapTile.x, mapTile.y); - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.x += 32; mapTile.y -= 32; - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.x -= 32; map_element_paint_setup(mapTile.x, mapTile.y); - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.x -= 32; mapTile.y += 32; - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.y -= 32; } @@ -1583,22 +1587,22 @@ void viewport_paint_setup(){ for (; num_vertical_quadrants > 0; --num_vertical_quadrants){ map_element_paint_setup(mapTile.x, mapTile.y); - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.x += 32; mapTile.y += 32; - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.y -= 32; map_element_paint_setup(mapTile.x, mapTile.y); - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.x -= 32; mapTile.y -= 32; - sub_0x69E8B0(mapTile.x, mapTile.y); + sprite_paint_setup(mapTile.x, mapTile.y); mapTile.x += 32; } diff --git a/src/world/sprite.h b/src/world/sprite.h index ed2cfe109a..7a93a7c1c8 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -79,7 +79,7 @@ typedef struct { typedef struct { uint8 sprite_identifier; // 0x00 - uint8 var_01; // 0x01 + uint8 type; // 0x01 uint16 next_in_quadrant; // 0x02 uint16 next; // 0x04 uint16 previous; // 0x06 From 4911ad5a9dc4f9916530a9b04bd461046e7dabe9 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Tue, 2 Jun 2015 18:34:09 +0100 Subject: [PATCH 0053/1173] Started implementing entrance_paint_setup --- src/interface/viewport.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 7423c0a001..0fc6a6a9c3 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -26,6 +26,8 @@ #include "../world/map.h" #include "../world/sprite.h" #include "../world/banner.h" +#include "../world/entrance.h" +#include "../world/footpath.h" #include "../world/scenery.h" #include "viewport.h" #include "window.h" @@ -1165,6 +1167,31 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma } } +/* rct2: 0x006658ED */ +void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_element* map_element){ + if (RCT2_GLOBAL(0x9DEA6F, uint8_t) & 1) + return; + + RCT2_GLOBAL(0x009DE570, uint8) = 8; + RCT2_GLOBAL(0x009E32BC, uint32) = 0; + uint32 image_id, ghost_id; + if (map_element->flags & MAP_ELEMENT_FLAG_GHOST){ + RCT2_GLOBAL(0x009DE570, uint8) = 0; + ghost_id = RCT2_ADDRESS(0x993CC4, uint32)[RCT2_GLOBAL(0x9AACBF, uint8)]; + RCT2_GLOBAL(0x009E32BC, uint32) = ghost_id; + } + + rct_path_type* path_entry = g_pathTypeEntries[map_element->properties.entrance.path_type]; + + switch ((map_element->properties.entrance.index & 0xF << 2) | direction){ + case 0: + image_id = (path_entry->image + 5) | ghost_id; + //665988 + break; + //665939 + } +} + /* rct2: 0x00664FD4 */ void viewport_entrance_paint_setup(uint8 direction, int height, rct_map_element* map_element){ RCT2_GLOBAL(0x9DE570, uint8_t) = 0xB; @@ -1205,7 +1232,7 @@ void viewport_entrance_paint_setup(uint8 direction, int height, rct_map_element* viewport_ride_entrance_exit_paint_setup(direction, height, map_element); break; case ENTRANCE_TYPE_PARK_ENTRANCE: - //6658ED + viewport_park_entrance_paint_setup(direction, height, map_element); break; } } From dc7f83d667b0197cd5e812166b9d8de5ba93e7ec Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 7 Jun 2015 20:31:44 +0100 Subject: [PATCH 0054/1173] Implement more of park entrance paint setup I've changed the order of some of this code so its possible this wont display quite the same. Will need extensive testing. --- src/interface/viewport.c | 87 ++++++++++++++++++++++++++++++++++++++-- src/world/entrance.h | 4 +- 2 files changed, 85 insertions(+), 6 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 0fc6a6a9c3..cbe65752c7 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1174,7 +1174,7 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_GLOBAL(0x009DE570, uint8) = 8; RCT2_GLOBAL(0x009E32BC, uint32) = 0; - uint32 image_id, ghost_id; + uint32 image_id, ghost_id = 0; if (map_element->flags & MAP_ELEMENT_FLAG_GHOST){ RCT2_GLOBAL(0x009DE570, uint8) = 0; ghost_id = RCT2_ADDRESS(0x993CC4, uint32)[RCT2_GLOBAL(0x9AACBF, uint8)]; @@ -1183,13 +1183,92 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele rct_path_type* path_entry = g_pathTypeEntries[map_element->properties.entrance.path_type]; - switch ((map_element->properties.entrance.index & 0xF << 2) | direction){ + switch (((map_element->properties.entrance.index & 0xF) << 2) | direction){ + case 1: + case 2: + case 3: case 0: - image_id = (path_entry->image + 5) | ghost_id; - //665988 + image_id = (path_entry->image + 5 * (1 + (direction & 1))) | ghost_id; + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 2; + RCT2_GLOBAL(0x009DEA56, sint16) = height; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0, image_id, 0, height, 0x1C, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + + rct_entrance_type* entrance = (rct_entrance_type*)object_entry_groups[OBJECT_TYPE_PARK_ENTRANCE].chunks[0]; + image_id = (entrance->image_id + direction * 3) | ghost_id; + + RCT2_GLOBAL(0x009DEA52, uint16) = 2; + RCT2_GLOBAL(0x009DEA54, uint16) = 2; + RCT2_GLOBAL(0x009DEA56, sint16) = height + 32; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0x2F00, image_id, 0, height, 0x1C, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + + if ((direction + 1) & (1 << 1)) + break; + if (ghost_id != 0) + break; + + rct_string_id park_text_id = 1730; + RCT2_GLOBAL(0x0013CE952, uint32) = 0; + RCT2_GLOBAL(0x0013CE956, uint32) = 0; + + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_OPEN){ + RCT2_GLOBAL(0x0013CE952, rct_string_id) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id); + RCT2_GLOBAL(0x0013CE954, rct_string_id) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, rct_string_id); + + park_text_id = 1731; + } + + uint8 park_name[MAX_PATH]; + format_string(park_name, park_text_id, RCT2_ADDRESS(0x0013CE952, void)); + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0x1C0; + uint16 string_width = gfx_get_string_width(park_name); + uint16 scroll = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) / 2) % string_width; + + if (entrance->scrolling_mode == 0xFF) + break; + + RCT2_GLOBAL(0x009DEA52, uint16) = 2; + RCT2_GLOBAL(0x009DEA54, uint16) = 2; + RCT2_GLOBAL(0x009DEA56, sint16) = height + entrance->text_height; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0x2F00, scrolling_text_setup(park_text_id, scroll, entrance->scrolling_mode + direction / 2), 0, height + entrance->text_height, 0x1C, 0x1C, 0); break; //665939 } + + image_id = ghost_id; + if (!image_id){ + image_id = 0x20B80000; + } + + if (direction & 1){ + sub_6629BC(height, 0, image_id, 1); + } + else{ + sub_6629BC(height, 0, image_id, 0); + } + + RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9B8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9BC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9CC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D4, uint16) = 0xFFFF; + + height += 80; + if (RCT2_GLOBAL(0x141E9D8, sint16) < height){ + RCT2_GLOBAL(0x141E9D8, sint16) = height; + RCT2_GLOBAL(0x141E9DA, uint8) = 32; + } } /* rct2: 0x00664FD4 */ diff --git a/src/world/entrance.h b/src/world/entrance.h index 6705c623f0..291a14f905 100644 --- a/src/world/entrance.h +++ b/src/world/entrance.h @@ -26,8 +26,8 @@ typedef struct { rct_string_id string_idx; // 0x00 uint32 image_id; // 0x02 - uint8 var_06; - uint8 var_07; + uint8 scrolling_mode; // 0x06 + uint8 text_height; // 0x07 } rct_entrance_type; #endif \ No newline at end of file From eac5cea701ffe1fb7015ab647b5000e1924f48b4 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 8 Jun 2015 17:47:51 +0100 Subject: [PATCH 0055/1173] Implement left and right parts of the entrance. --- src/interface/viewport.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index cbe65752c7..5f19bc6a90 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1183,10 +1183,13 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele rct_path_type* path_entry = g_pathTypeEntries[map_element->properties.entrance.path_type]; - switch (((map_element->properties.entrance.index & 0xF) << 2) | direction){ - case 1: - case 2: - case 3: + // Index to which part of the entrance + // Middle, left, right + uint8 part_index = map_element->properties.entrance.index & 0xF; + rct_entrance_type* entrance; + uint8 di = (direction / 2 + part_index / 2) & 1 ? 0x1A : 0x20; + + switch (part_index){ case 0: image_id = (path_entry->image + 5 * (1 + (direction & 1))) | ghost_id; RCT2_GLOBAL(0x009DEA52, uint16) = 0; @@ -1196,7 +1199,7 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], 0, image_id, 0, height, 0x1C, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); - rct_entrance_type* entrance = (rct_entrance_type*)object_entry_groups[OBJECT_TYPE_PARK_ENTRANCE].chunks[0]; + entrance = (rct_entrance_type*)object_entry_groups[OBJECT_TYPE_PARK_ENTRANCE].chunks[0]; image_id = (entrance->image_id + direction * 3) | ghost_id; RCT2_GLOBAL(0x009DEA52, uint16) = 2; @@ -1239,7 +1242,18 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], 0x2F00, scrolling_text_setup(park_text_id, scroll, entrance->scrolling_mode + direction / 2), 0, height + entrance->text_height, 0x1C, 0x1C, 0); break; - //665939 + case 1: + case 2: + entrance = (rct_entrance_type*)object_entry_groups[OBJECT_TYPE_PARK_ENTRANCE].chunks[0]; + image_id = (entrance->image_id + part_index + direction * 3) | ghost_id; + + RCT2_GLOBAL(0x009DEA52, uint16) = 3; + RCT2_GLOBAL(0x009DEA54, uint16) = 3; + RCT2_GLOBAL(0x009DEA56, sint16) = height; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0x4F00, image_id, 0, height, di, 0x1A, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + break; } image_id = ghost_id; From 8554d2183c4c82b97bd8e4eb3229f280c99ec026 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 8 Jun 2015 18:52:47 +0100 Subject: [PATCH 0056/1173] Implemented more of the paint_struct setup code --- src/addresses.h | 3 ++ src/drawing/drawing.h | 12 +++++ src/drawing/sprite.c | 11 ---- src/interface/viewport.c | 105 +++++++++++++++++++++++++++------------ src/interface/viewport.h | 3 +- 5 files changed, 91 insertions(+), 43 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 48520d6404..224a5966f4 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -201,6 +201,9 @@ #define RCT2_ADDRESS_CURSOR_OVER_WINDOWNUMBER 0x009DE55E #define RCT2_ADDRESS_CURSOR_OVER_WIDGETINDEX 0x009DE560 +// Of type viewport interaction +#define RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE 0x009DE570 + #define RCT2_ADDRESS_PALETTE_EFFECT_FRAME_NO 0x009DE584 // Flags: diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index dc231df1e7..55217eff9c 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -57,6 +57,17 @@ enum{ IMAGE_TYPE_UNKNOWN = (1<<3) }; +typedef struct { + uint32 num_entries; + uint32 total_size; +} rct_g1_header; + +typedef struct { + rct_g1_header header; + rct_g1_element *elements; + void *data; +} rct_gx; + extern const uint16 palette_to_g1_offset[]; extern const uint8 peep_palette[]; extern uint8 text_palette[]; @@ -65,6 +76,7 @@ extern int gLastDrawStringX; extern int gLastDrawStringY; extern rct_g1_element *g1Elements; +extern rct_gx g2; // rct_drawpixelinfo* clip_drawpixelinfo(rct_drawpixelinfo* dpi, int left, int width, int top, int height); diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index 024675facd..c5ddced9ed 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -25,19 +25,8 @@ #include "../platform/platform.h" #include "../openrct2.h" -typedef struct { - uint32 num_entries; - uint32 total_size; -} rct_g1_header; - void *_g1Buffer = NULL; -typedef struct { - rct_g1_header header; - rct_g1_element *elements; - void *data; -} rct_gx; - rct_gx g2; rct_g1_element *g1Elements = (rct_g1_element*)RCT2_ADDRESS_G1_ELEMENTS; diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 5f19bc6a90..252c8b9367 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -68,13 +68,13 @@ struct paint_struct{ uint8 var_1B; paint_struct* attached_ps; //0x1C paint_struct* var_20; - paint_struct* var_24; + paint_struct* next_quadrant_ps; // 0x24 uint8 sprite_type; //0x28 uint8 var_29; uint16 pad_2A; uint16 map_x; // 0x2C uint16 map_y; // 0x2E - rct_map_element *mapElement; // 0x30 + rct_map_element *mapElement; // 0x30 (or sprite pointer) }; /** @@ -663,9 +663,9 @@ void paint_attached_ps(paint_struct* ps, paint_struct* attached_ps, rct_drawpixe void sub_688485(){ rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); paint_struct* ps = RCT2_GLOBAL(0xEE7884, paint_struct*); - paint_struct* previous_ps = ps->var_24; + paint_struct* previous_ps = ps->next_quadrant_ps; - for (ps = ps->var_24; ps;){ + for (ps = ps->next_quadrant_ps; ps;){ sint16 x = ps->x; sint16 y = ps->y; if (ps->sprite_type == 2){ @@ -715,17 +715,17 @@ void sub_688485(){ } paint_attached_ps(ps, ps->attached_ps, dpi); - ps = previous_ps->var_24; + ps = previous_ps->next_quadrant_ps; previous_ps = ps; } } -int sub_0x686806(rct_sprite* sprite, int eax, int image_id, int ecx, int edx){ +int sub_0x686806(int eax, int image_id, int ecx, int edx, sint16 di, sint16 si){ int ebp = (eax >> 8) & 0xFF; edx <<= 16; ebp += RCT2_GLOBAL(0x9DEA56, uint16); - RCT2_GLOBAL(0xF1AD28, uint32) = 0; + RCT2_GLOBAL(0xF1AD28, paint_struct*) = 0; RCT2_GLOBAL(0xF1AD2C, uint32) = 0; edx = (edx >> 16) | (ebp << 16); @@ -736,7 +736,15 @@ int sub_0x686806(rct_sprite* sprite, int eax, int image_id, int ecx, int edx){ ps->image_id = image_id; - rct_g1_element *g1Element = &g1Elements[image_id & 0x7FFFF]; + rct_g1_element *g1Element; + uint32 image_element = image_id & 0x7FFFF; + + if (image_element < SPR_G2_BEGIN) { + g1Element = &g1Elements[image_element]; + } + else { + g1Element = &g2.elements[image_element - SPR_G2_BEGIN]; + } eax = (eax & 0xFF) + RCT2_GLOBAL(0x9DE568, uint16); ecx = (ecx & 0xFF) + RCT2_GLOBAL(0x9DE56C, uint16); @@ -763,9 +771,44 @@ int sub_0x686806(rct_sprite* sprite, int eax, int image_id, int ecx, int edx){ if (left > dpi->x + dpi->width) return 1; if (bottom > dpi->y + dpi->height) return 1; - RCT2_GLOBAL(0x9DE568, uint16); //686918 not finished + ps->other_x = di - 1 + RCT2_GLOBAL(0x9DEA52, sint16) + RCT2_GLOBAL(0x9DE568, sint16); + ps->some_x = RCT2_GLOBAL(0x009DEA56, sint16); + ps->other_y = si - 1 + RCT2_GLOBAL(0x9DEA54, sint16) + RCT2_GLOBAL(0x009DE56C, sint16); + ps->var_1A = 0; + ps->attached_x = RCT2_GLOBAL(0x9DEA52, sint16) + RCT2_GLOBAL(0x9DE568, sint16); + ps->attached_y = RCT2_GLOBAL(0x9DEA54, sint16) + RCT2_GLOBAL(0x009DE56C, sint16); + ps->attached_ps = NULL; + ps->var_20 = NULL; + ps->sprite_type = RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint16); + ps->map_x = RCT2_GLOBAL(0x9DE574, uint16); + ps->map_y = RCT2_GLOBAL(0x9DE576, uint16); + ps->mapElement = RCT2_GLOBAL(0x9DE578, rct_map_element*); + RCT2_GLOBAL(0xF1AD28, uint32) = ps; + + di = ps->attached_y + ps->attached_x; + if (di < 0) + di = 0; + + di /= 32; + if (di > 511) + di = 511; + + ps->var_18 = di; + paint_struct* old_ps = RCT2_ADDRESS(0x00F1A50C, paint_struct*)[di]; + RCT2_ADDRESS(0x00F1A50C, paint_struct*)[di] = ps; + ps->next_quadrant_ps = old_ps; + + if (di < RCT2_GLOBAL(0x00F1AD0C, sint32)){ + RCT2_GLOBAL(0x00F1AD0C, sint32) = di; + } + + if (di > RCT2_GLOBAL(0x00F1AD10, sint32)){ + RCT2_GLOBAL(0x00F1AD10, sint32) = di; + } + + RCT2_GLOBAL(0xEE7888, paint_struct*) += sizeof(paint_struct); return 0; } @@ -840,7 +883,7 @@ void sprite_paint_setup(uint16 eax, uint16 ecx){ int ebp = spr->unknown.sprite_identifier; RCT2_GLOBAL(0x9DE568, uint16) = spr->unknown.x; - RCT2_GLOBAL(0x9DE570, uint8) = 2; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_SPRITE; RCT2_GLOBAL(0x9DE56C, uint16) = spr->unknown.y; switch (spr->unknown.sprite_identifier){ @@ -1030,11 +1073,11 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma colour_2 = ride->track_colour_additional[0]; image_id = (colour_1 << 19) | (colour_2 << 24) | 0xA0000000; - RCT2_GLOBAL(0x009DE570, uint8) = 3; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_RIDE; RCT2_GLOBAL(0x009E32BC, uint32) = 0; if (map_element->flags & MAP_ELEMENT_FLAG_GHOST){ - RCT2_GLOBAL(0x009DE570, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_NONE; image_id = RCT2_ADDRESS(0x993CC4, uint32_t)[RCT2_GLOBAL(0x9AACBF, uint8)]; RCT2_GLOBAL(0x009E32BC, uint32) = image_id; if (transparant_image_id) @@ -1172,11 +1215,11 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele if (RCT2_GLOBAL(0x9DEA6F, uint8_t) & 1) return; - RCT2_GLOBAL(0x009DE570, uint8) = 8; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_PARK; RCT2_GLOBAL(0x009E32BC, uint32) = 0; uint32 image_id, ghost_id = 0; if (map_element->flags & MAP_ELEMENT_FLAG_GHOST){ - RCT2_GLOBAL(0x009DE570, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_NONE; ghost_id = RCT2_ADDRESS(0x993CC4, uint32)[RCT2_GLOBAL(0x9AACBF, uint8)]; RCT2_GLOBAL(0x009E32BC, uint32) = ghost_id; } @@ -1287,7 +1330,7 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele /* rct2: 0x00664FD4 */ void viewport_entrance_paint_setup(uint8 direction, int height, rct_map_element* map_element){ - RCT2_GLOBAL(0x9DE570, uint8_t) = 0xB; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8_t) = VIEWPORT_INTERACTION_ITEM_LABEL; rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); @@ -1335,7 +1378,7 @@ void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* m { rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); - RCT2_GLOBAL(0x9DE570, uint8_t) = 0xC; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8_t) = VIEWPORT_INTERACTION_ITEM_BANNER; if (dpi->zoom_level > 1 || RCT2_GLOBAL(0x9DEA6F, uint8_t) & 1) return; @@ -1355,7 +1398,7 @@ void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* m if (map_element->flags & MAP_ELEMENT_FLAG_GHOST)//if being placed { - RCT2_GLOBAL(0x9DE570, uint8_t) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8_t) = VIEWPORT_INTERACTION_ITEM_NONE; image_id |= RCT2_ADDRESS(0x993CC4, uint32_t)[RCT2_GLOBAL(0x9AACBF, uint8)]; } else{ @@ -1471,7 +1514,7 @@ void map_element_paint_setup(int x, int y) RCT2_GLOBAL(0x9DE568, uint16) = x; RCT2_GLOBAL(0x9DE56C, uint16) = y; - RCT2_GLOBAL(0x9DE570, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_NONE; RCT2_GLOBAL(0x9DEA52, uint16) = 0; RCT2_GLOBAL(0x9DEA54, uint16) = 0; RCT2_GLOBAL(0x9DEA56, uint16) = arrowZ + 18; @@ -1588,7 +1631,7 @@ void map_element_paint_setup(int x, int y) if (dx >= dpi->y) return; RCT2_GLOBAL(0x9DE568, uint16_t) = x; RCT2_GLOBAL(0x9DE56C, uint16_t) = y; - RCT2_GLOBAL(0x9DE570, uint8_t) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8_t) = VIEWPORT_INTERACTION_ITEM_NONE; RCT2_CALLPROC_X((int)RCT2_ADDRESS(0x98196C, uint32_t*)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], 0xFF00, 3123, y & 0xFF00, 16, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); } @@ -1737,14 +1780,14 @@ void sub_688217_helper(uint16 ax, uint8 flag) do { ps = ps_next; - ps_next = ps_next->var_24; + ps_next = ps_next->next_quadrant_ps; if (ps_next == NULL) return; } while (ax > ps_next->var_18); RCT2_GLOBAL(0x00F1AD14, paint_struct*) = ps; do { - ps = ps->var_24; + ps = ps->next_quadrant_ps; if (ps == NULL) break; if (ps->var_18 > ax + 1) { @@ -1760,7 +1803,7 @@ void sub_688217_helper(uint16 ax, uint8 flag) while (true) { while (true) { - ps_next = ps->var_24; + ps_next = ps->next_quadrant_ps; if (ps_next == NULL) return; if (ps_next->var_1B & (1 << 7)) return; if (ps_next->var_1B & (1 << 0)) break; @@ -1779,7 +1822,7 @@ void sub_688217_helper(uint16 ax, uint8 flag) while (true) { ps = ps_next; - ps_next = ps_next->var_24; + ps_next = ps_next->next_quadrant_ps; if (ps_next == NULL) break; if (ps_next->var_1B & (1 << 7)) break; if (!(ps_next->var_1B & (1 << 1))) continue; @@ -1809,10 +1852,10 @@ void sub_688217_helper(uint16 ax, uint8 flag) } if (yes) { - ps->var_24 = ps_next->var_24; - paint_struct *ps_temp = RCT2_GLOBAL(0x00F1AD18, paint_struct*)->var_24; - RCT2_GLOBAL(0x00F1AD18, paint_struct*)->var_24 = ps_next; - ps_next->var_24 = ps_temp; + ps->next_quadrant_ps = ps_next->next_quadrant_ps; + paint_struct *ps_temp = RCT2_GLOBAL(0x00F1AD18, paint_struct*)->next_quadrant_ps; + RCT2_GLOBAL(0x00F1AD18, paint_struct*)->next_quadrant_ps = ps_next; + ps_next->next_quadrant_ps = ps_temp; ps_next = ps; } } @@ -1831,7 +1874,7 @@ void sub_688217() paint_struct *ps_next; RCT2_GLOBAL(0x00EE7888, uint32) += 0x34; // 0x34 is size of paint_struct? RCT2_GLOBAL(0x00EE7884, paint_struct*) = ps; - ps->var_24 = NULL; + ps->next_quadrant_ps = NULL; uint32 edi = RCT2_GLOBAL(0x00F1AD0C, uint32); if (edi == -1) return; @@ -1839,10 +1882,10 @@ void sub_688217() do { ps_next = RCT2_GLOBAL(0x00F1A50C + 4 * edi, paint_struct*); if (ps_next != NULL) { - ps->var_24 = ps_next; + ps->next_quadrant_ps = ps_next; do { ps = ps_next; - ps_next = ps_next->var_24; + ps_next = ps_next->next_quadrant_ps; } while (ps_next != NULL); } } while (++edi <= RCT2_GLOBAL(0x00F1AD10, uint32)); @@ -2270,7 +2313,7 @@ void sub_68862C() paint_struct *ps = RCT2_GLOBAL(0x00EE7884, paint_struct*), *old_ps, *next_ps, *attached_ps; uint32 eax = 0xBBBBBBBB, ebx = 0xBBBBBBBB, ecx = 0xBBBBBBBB, edx = 0xBBBBBBBB, esi = 0xBBBBBBBB, edi = 0xBBBBBBBB, ebp = 0xBBBBBBBB; - while ((ps = ps->var_24) != NULL) { + while ((ps = ps->next_quadrant_ps) != NULL) { old_ps = ps; next_ps = ps; diff --git a/src/interface/viewport.h b/src/interface/viewport.h index eae091355d..429b91602e 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -56,7 +56,8 @@ enum { VIEWPORT_INTERACTION_ITEM_PARK, VIEWPORT_INTERACTION_ITEM_WALL, VIEWPORT_INTERACTION_ITEM_LARGE_SCENERY, - VIEWPORT_INTERACTION_ITEM_BANNER = 12, + VIEWPORT_INTERACTION_ITEM_LABEL, + VIEWPORT_INTERACTION_ITEM_BANNER, }; From 48d3f6e7e38698101df32f471805406961e7c3ff Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Tue, 9 Jun 2015 20:11:54 +0100 Subject: [PATCH 0057/1173] Switch on setup_image_on_viewport rotation 0. --- src/interface/viewport.c | 60 +++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 252c8b9367..607b8322aa 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -721,8 +721,21 @@ void sub_688485(){ } -int sub_0x686806(int eax, int image_id, int ecx, int edx, sint16 di, sint16 si){ - int ebp = (eax >> 8) & 0xFF; +int sub_0x686806(int eax, int image_id, int ecx, int edx, sint16 si, sint16 di); + +int sub_98197C(int eax, int image_id, int ecx, int edx, sint16 si, sint16 di, uint32 rotation){ + switch (rotation){ + case 0: + return sub_0x686806(eax, image_id, ecx, edx, si, di); + default: + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + eax, image_id, ecx, edx, si, di, 0); + return 1; + } +} + +int sub_0x686806(int eax, int image_id, int ecx, int edx, sint16 si, sint16 di){ + int ebp = (sint8)((eax >> 8) & 0xFF); edx <<= 16; ebp += RCT2_GLOBAL(0x9DEA56, uint16); RCT2_GLOBAL(0xF1AD28, paint_struct*) = 0; @@ -774,18 +787,20 @@ int sub_0x686806(int eax, int image_id, int ecx, int edx, sint16 di, sint16 si){ //686918 not finished ps->other_x = di - 1 + RCT2_GLOBAL(0x9DEA52, sint16) + RCT2_GLOBAL(0x9DE568, sint16); ps->some_x = RCT2_GLOBAL(0x009DEA56, sint16); + ps->some_y = edx >> 16; ps->other_y = si - 1 + RCT2_GLOBAL(0x9DEA54, sint16) + RCT2_GLOBAL(0x009DE56C, sint16); ps->var_1A = 0; ps->attached_x = RCT2_GLOBAL(0x9DEA52, sint16) + RCT2_GLOBAL(0x9DE568, sint16); ps->attached_y = RCT2_GLOBAL(0x9DEA54, sint16) + RCT2_GLOBAL(0x009DE56C, sint16); ps->attached_ps = NULL; ps->var_20 = NULL; - ps->sprite_type = RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint16); + ps->sprite_type = RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8); + ps->var_29 = RCT2_GLOBAL(0x9DE571, uint8); ps->map_x = RCT2_GLOBAL(0x9DE574, uint16); ps->map_y = RCT2_GLOBAL(0x9DE576, uint16); ps->mapElement = RCT2_GLOBAL(0x9DE578, rct_map_element*); - RCT2_GLOBAL(0xF1AD28, uint32) = ps; + RCT2_GLOBAL(0xF1AD28, paint_struct*) = ps; di = ps->attached_y + ps->attached_x; if (di < 0) @@ -835,8 +850,7 @@ void viewport_litter_paint_setup(rct_litter* litter, int image_direction, int he RCT2_GLOBAL(0x9DEA54, uint16) = 0xFFFC; RCT2_GLOBAL(0x9DEA56, uint16) = height + 2; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0xFF00, image_id, 0, height, 4, 4, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0xFF00, image_id, 0, height, 4, 4, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); } @@ -1101,8 +1115,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma uint16 ax = is_exit ? 0x2300 : 0x3300; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - ax, image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(ax, image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); if (transparant_image_id){ if (is_exit){ @@ -1115,8 +1128,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, uint16) = height; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - ax, transparant_image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(ax, transparant_image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); } image_id += 4; @@ -1125,8 +1137,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma RCT2_GLOBAL(0x009DEA54, uint16) = 28; RCT2_GLOBAL(0x009DEA56, uint16) = height; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - ax, image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(ax, image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); if (transparant_image_id){ transparant_image_id += 4; @@ -1134,8 +1145,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma RCT2_GLOBAL(0x009DEA54, uint16) = 28; RCT2_GLOBAL(0x009DEA56, uint16) = height; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - ax, transparant_image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(ax, transparant_image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); } uint32 eax = 0xFFFF0600 | ((height / 16) & 0xFF); @@ -1239,8 +1249,7 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, sint16) = height; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0, image_id, 0, height, 0x1C, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, image_id, 0, height, 0x1C, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); entrance = (rct_entrance_type*)object_entry_groups[OBJECT_TYPE_PARK_ENTRANCE].chunks[0]; image_id = (entrance->image_id + direction * 3) | ghost_id; @@ -1249,8 +1258,7 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, sint16) = height + 32; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x2F00, image_id, 0, height, 0x1C, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0x2F00, image_id, 0, height, 0x1C, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); if ((direction + 1) & (1 << 1)) break; @@ -1294,8 +1302,7 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_GLOBAL(0x009DEA54, uint16) = 3; RCT2_GLOBAL(0x009DEA56, sint16) = height; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x4F00, image_id, 0, height, di, 0x1A, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0x4F00, image_id, 0, height, di, 0x1A, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); break; } @@ -1355,8 +1362,7 @@ void viewport_entrance_paint_setup(uint8 direction, int height, rct_map_element* RCT2_GLOBAL(0x009DEA56, sint16) = z; RCT2_GLOBAL(0x009DEA56, uint16) += 64; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 16, image_id, 16, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(16, image_id, 16, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); } } @@ -1407,13 +1413,11 @@ void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* m 0x20000000; } - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x1500, image_id, 0, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0x1500, image_id, 0, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); RCT2_GLOBAL(0x9DEA52, uint32) = RCT2_ADDRESS(0x98D888, uint32)[direction * 2]; image_id++; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x1500, image_id, 0, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0x1500, image_id, 0, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); // Opposite direction direction ^= 2; @@ -1519,9 +1523,7 @@ void map_element_paint_setup(int x, int y) RCT2_GLOBAL(0x9DEA54, uint16) = 0; RCT2_GLOBAL(0x9DEA56, uint16) = arrowZ + 18; - RCT2_CALLPROC_X( - (int)RCT2_ADDRESS(0x0098197C, uint32*)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)], - 0xFF00, imageId, y & 0xFF00, arrowZ, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0xFF00, imageId, y & 0xFF00, arrowZ, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); } int bx = dx + 52; From 2c6312a86d8ce7f947ba0aad1ef276927680627c Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 21 Jun 2015 14:07:57 +0100 Subject: [PATCH 0058/1173] Implemented 2nd rotation. Small refactor of parameter list --- src/interface/viewport.c | 161 ++++++++++++++++++++++++++++++--------- 1 file changed, 125 insertions(+), 36 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 607b8322aa..3290d06643 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -721,26 +721,27 @@ void sub_688485(){ } -int sub_0x686806(int eax, int image_id, int ecx, int edx, sint16 si, sint16 di); +int sub_0x686806(sint8 al, sint8 ah, int image_id, sint8 cl, sint16 edx, sint16 si, sint16 di); +int sub_0x6869B2(sint8 al, sint8 ah, int image_id, sint8 cl, sint16 edx, sint16 si, sint16 di); -int sub_98197C(int eax, int image_id, int ecx, int edx, sint16 si, sint16 di, uint32 rotation){ +int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int edx, sint16 si, sint16 di, uint32 rotation){ switch (rotation){ case 0: - return sub_0x686806(eax, image_id, ecx, edx, si, di); + return sub_0x686806(al, ah, image_id, cl, edx, si, di); + case 1: + return sub_0x6869B2(al, ah, image_id, cl, edx, si, di); default: RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - eax, image_id, ecx, edx, si, di, 0); + al | (ah << 8), image_id, cl, edx, si, di, 0); return 1; } } -int sub_0x686806(int eax, int image_id, int ecx, int edx, sint16 si, sint16 di){ - int ebp = (sint8)((eax >> 8) & 0xFF); - edx <<= 16; - ebp += RCT2_GLOBAL(0x9DEA56, uint16); +int sub_0x686806(sint8 al, sint8 ah, int image_id, sint8 cl, sint16 edx, sint16 si, sint16 di){ + int ebp = ah + RCT2_GLOBAL(0x9DEA56, uint16); + RCT2_GLOBAL(0xF1AD28, paint_struct*) = 0; RCT2_GLOBAL(0xF1AD2C, uint32) = 0; - edx = (edx >> 16) | (ebp << 16); //Not a paint struct but something similar paint_struct* ps = RCT2_GLOBAL(0xEE7888, paint_struct*); @@ -759,11 +760,11 @@ int sub_0x686806(int eax, int image_id, int ecx, int edx, sint16 si, sint16 di){ g1Element = &g2.elements[image_element - SPR_G2_BEGIN]; } - eax = (eax & 0xFF) + RCT2_GLOBAL(0x9DE568, uint16); - ecx = (ecx & 0xFF) + RCT2_GLOBAL(0x9DE56C, uint16); + int eax = al + RCT2_GLOBAL(0x9DE568, sint16); + int ecx = cl + RCT2_GLOBAL(0x9DE56C, sint16); int x = ecx - eax; - int y = (ecx + eax) / 2 - (edx & 0xFFFF); + int y = (ecx + eax) / 2 - edx; ps->x = x; ps->y = y; @@ -784,10 +785,9 @@ int sub_0x686806(int eax, int image_id, int ecx, int edx, sint16 si, sint16 di){ if (left > dpi->x + dpi->width) return 1; if (bottom > dpi->y + dpi->height) return 1; - //686918 not finished ps->other_x = di - 1 + RCT2_GLOBAL(0x9DEA52, sint16) + RCT2_GLOBAL(0x9DE568, sint16); ps->some_x = RCT2_GLOBAL(0x009DEA56, sint16); - ps->some_y = edx >> 16; + ps->some_y = ebp; ps->other_y = si - 1 + RCT2_GLOBAL(0x9DEA54, sint16) + RCT2_GLOBAL(0x009DE56C, sint16); ps->var_1A = 0; ps->attached_x = RCT2_GLOBAL(0x9DEA52, sint16) + RCT2_GLOBAL(0x9DE568, sint16); @@ -827,6 +827,95 @@ int sub_0x686806(int eax, int image_id, int ecx, int edx, sint16 si, sint16 di){ return 0; } +int sub_0x6869B2(sint8 al, sint8 ah, int image_id, sint8 cl, sint16 edx, sint16 si, sint16 di){ + int ebp = ah + RCT2_GLOBAL(0x9DEA56, uint16); + + RCT2_GLOBAL(0xF1AD28, paint_struct*) = 0; + RCT2_GLOBAL(0xF1AD2C, uint32) = 0; + + //Not a paint struct but something similar + paint_struct* ps = RCT2_GLOBAL(0xEE7888, paint_struct*); + + if ((uint32)ps >= RCT2_GLOBAL(0xEE7880, uint32)) return 1; + + ps->image_id = image_id; + + rct_g1_element *g1Element; + uint32 image_element = image_id & 0x7FFFF; + + if (image_element < SPR_G2_BEGIN) { + g1Element = &g1Elements[image_element]; + } + else { + g1Element = &g2.elements[image_element - SPR_G2_BEGIN]; + } + + int eax = cl + RCT2_GLOBAL(0x9DE568, sint16); + int ecx = -al + RCT2_GLOBAL(0x9DE56C, sint16); + + int x = -eax - ecx; + int y = (ecx - eax) / 2 - edx; + + ps->x = x; + ps->y = y; + + int left = x + g1Element->x_offset; + int bottom = y + g1Element->y_offset; + + int right = left + g1Element->width; + int top = bottom + g1Element->height; + + RCT2_GLOBAL(0xF1AD1C, uint16) = left; + RCT2_GLOBAL(0xF1AD1E, uint16) = bottom; + + rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + + if (right <= dpi->x)return 1; + if (top <= dpi->y)return 1; + if (left > dpi->x + dpi->width) return 1; + if (bottom > dpi->y + dpi->height) return 1; + + ps->other_x = -si - RCT2_GLOBAL(0x9DEA54, sint16) + RCT2_GLOBAL(0x9DE568, sint16); + ps->some_x = RCT2_GLOBAL(0x009DEA56, sint16); + ps->some_y = ebp; + ps->other_y = di - 1 + RCT2_GLOBAL(0x9DEA52, sint16) + RCT2_GLOBAL(0x009DE56C, sint16); + ps->var_1A = 0; + ps->attached_x = -RCT2_GLOBAL(0x9DEA54, sint16) + RCT2_GLOBAL(0x9DE568, sint16); + ps->attached_y = RCT2_GLOBAL(0x9DEA52, sint16) + RCT2_GLOBAL(0x009DE56C, sint16); + ps->attached_ps = NULL; + ps->var_20 = NULL; + ps->sprite_type = RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8); + ps->var_29 = RCT2_GLOBAL(0x9DE571, uint8); + ps->map_x = RCT2_GLOBAL(0x9DE574, uint16); + ps->map_y = RCT2_GLOBAL(0x9DE576, uint16); + ps->mapElement = RCT2_GLOBAL(0x9DE578, rct_map_element*); + + RCT2_GLOBAL(0xF1AD28, paint_struct*) = ps; + + di = ps->attached_y - ps->attached_x + 0x2000; + if (di < 0) + di = 0; + + di /= 32; + if (di > 511) + di = 511; + + ps->var_18 = di; + paint_struct* old_ps = RCT2_ADDRESS(0x00F1A50C, paint_struct*)[di]; + RCT2_ADDRESS(0x00F1A50C, paint_struct*)[di] = ps; + ps->next_quadrant_ps = old_ps; + + if (di < RCT2_GLOBAL(0x00F1AD0C, sint32)){ + RCT2_GLOBAL(0x00F1AD0C, sint32) = di; + } + + if (di > RCT2_GLOBAL(0x00F1AD10, sint32)){ + RCT2_GLOBAL(0x00F1AD10, sint32) = di; + } + + RCT2_GLOBAL(0xEE7888, paint_struct*) += sizeof(paint_struct); + return 0; +} /** * Litter Paint Setup @@ -850,7 +939,7 @@ void viewport_litter_paint_setup(rct_litter* litter, int image_direction, int he RCT2_GLOBAL(0x9DEA54, uint16) = 0xFFFC; RCT2_GLOBAL(0x9DEA56, uint16) = height + 2; - sub_98197C(0xFF00, image_id, 0, height, 4, 4, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, 0xFF, image_id, 0, height, 4, 4, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); } @@ -896,9 +985,9 @@ void sprite_paint_setup(uint16 eax, uint16 ecx){ RCT2_GLOBAL(0x9DE578, uint32) = (uint32)spr; int ebp = spr->unknown.sprite_identifier; - RCT2_GLOBAL(0x9DE568, uint16) = spr->unknown.x; + RCT2_GLOBAL(0x9DE568, sint16) = spr->unknown.x; RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_SPRITE; - RCT2_GLOBAL(0x9DE56C, uint16) = spr->unknown.y; + RCT2_GLOBAL(0x9DE56C, sint16) = spr->unknown.y; switch (spr->unknown.sprite_identifier){ case SPRITE_IDENTIFIER_VEHICLE: @@ -1113,9 +1202,9 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, uint16) = height; - uint16 ax = is_exit ? 0x2300 : 0x3300; + sint8 ah = is_exit ? 0x23 : 0x33; - sub_98197C(ax, image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, ah, image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); if (transparant_image_id){ if (is_exit){ @@ -1128,7 +1217,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(ax, transparant_image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, ah, transparant_image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); } image_id += 4; @@ -1137,7 +1226,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma RCT2_GLOBAL(0x009DEA54, uint16) = 28; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(ax, image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, ah, image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); if (transparant_image_id){ transparant_image_id += 4; @@ -1145,7 +1234,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma RCT2_GLOBAL(0x009DEA54, uint16) = 28; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(ax, transparant_image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, ah, transparant_image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); } uint32 eax = 0xFFFF0600 | ((height / 16) & 0xFF); @@ -1249,7 +1338,7 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, sint16) = height; - sub_98197C(0, image_id, 0, height, 0x1C, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, 0, image_id, 0, height, 0x1C, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); entrance = (rct_entrance_type*)object_entry_groups[OBJECT_TYPE_PARK_ENTRANCE].chunks[0]; image_id = (entrance->image_id + direction * 3) | ghost_id; @@ -1258,7 +1347,7 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, sint16) = height + 32; - sub_98197C(0x2F00, image_id, 0, height, 0x1C, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, 0x2F, image_id, 0, height, 0x1C, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); if ((direction + 1) & (1 << 1)) break; @@ -1302,7 +1391,7 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_GLOBAL(0x009DEA54, uint16) = 3; RCT2_GLOBAL(0x009DEA56, sint16) = height; - sub_98197C(0x4F00, image_id, 0, height, di, 0x1A, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, 0x4F, image_id, 0, height, di, 0x1A, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); break; } @@ -1362,7 +1451,7 @@ void viewport_entrance_paint_setup(uint8 direction, int height, rct_map_element* RCT2_GLOBAL(0x009DEA56, sint16) = z; RCT2_GLOBAL(0x009DEA56, uint16) += 64; - sub_98197C(16, image_id, 16, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(16, 0, image_id, 16, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); } } @@ -1413,11 +1502,11 @@ void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* m 0x20000000; } - sub_98197C(0x1500, image_id, 0, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, 0x15, image_id, 0, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); RCT2_GLOBAL(0x9DEA52, uint32) = RCT2_ADDRESS(0x98D888, uint32)[direction * 2]; image_id++; - sub_98197C(0x1500, image_id, 0, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, 0x15, image_id, 0, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); // Opposite direction direction ^= 2; @@ -1516,14 +1605,14 @@ void map_element_paint_setup(int x, int y) int arrowZ = RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16); - RCT2_GLOBAL(0x9DE568, uint16) = x; - RCT2_GLOBAL(0x9DE56C, uint16) = y; + RCT2_GLOBAL(0x9DE568, sint16) = x; + RCT2_GLOBAL(0x9DE56C, sint16) = y; RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_NONE; RCT2_GLOBAL(0x9DEA52, uint16) = 0; RCT2_GLOBAL(0x9DEA54, uint16) = 0; RCT2_GLOBAL(0x9DEA56, uint16) = arrowZ + 18; - sub_98197C(0xFF00, imageId, y & 0xFF00, arrowZ, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 0xFF, imageId, y & 0xFF00, arrowZ, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); } int bx = dx + 52; @@ -1553,9 +1642,9 @@ void map_element_paint_setup(int x, int y) if (dx >= dpi->y) return; - RCT2_GLOBAL(0x9DE568, uint16_t) = x; - RCT2_GLOBAL(0x9DE56C, uint16_t) = y; - RCT2_GLOBAL(0x9DE57C, uint16_t) = 0; + RCT2_GLOBAL(0x9DE568, sint16) = x; + RCT2_GLOBAL(0x9DE56C, sint16) = y; + RCT2_GLOBAL(0x9DE57C, uint16) = 0; do{ int direction = (map_element->type + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) & MAP_ELEMENT_DIRECTION_MASK; int height = map_element->base_height * 8; @@ -1631,8 +1720,8 @@ void map_element_paint_setup(int x, int y) dx -= 20; dx -= dpi->height; if (dx >= dpi->y) return; - RCT2_GLOBAL(0x9DE568, uint16_t) = x; - RCT2_GLOBAL(0x9DE56C, uint16_t) = y; + RCT2_GLOBAL(0x9DE568, sint16) = x; + RCT2_GLOBAL(0x9DE56C, sint16) = y; RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8_t) = VIEWPORT_INTERACTION_ITEM_NONE; RCT2_CALLPROC_X((int)RCT2_ADDRESS(0x98196C, uint32_t*)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], 0xFF00, 3123, y & 0xFF00, 16, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); From d5c19437ac3dd725bb6b236cd2a9c0388671cae3 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 21 Jun 2015 16:22:09 +0100 Subject: [PATCH 0059/1173] Make generic version of 98197C rotations. Refactor. I've added a new function coordinate 3d to 2d. There are still quite a few different versions of this same code throughout the project that should be changed to use this function. --- src/interface/viewport.c | 283 ++++++++++++++++----------------------- src/interface/window.c | 33 ++--- src/world/map.c | 24 ++++ src/world/map.h | 1 + 4 files changed, 150 insertions(+), 191 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 3290d06643..d105331b7b 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -118,6 +118,7 @@ void viewport_init_all() format_string((char*)0x0141FA44, STR_CANCEL, NULL); format_string((char*)0x0141F944, STR_OK, NULL); } + /** * rct:0x006EB0C1 * x : ax @@ -130,24 +131,13 @@ void viewport_init_all() void center_2d_coordinates(int x, int y, int z, int* out_x, int* out_y, rct_viewport* viewport){ int start_x = x; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)){ - case 0: - x = y - x; - y = (y + start_x) / 2 - z; - break; - case 1: - x = -y - x; - y = (y - start_x) / 2 - z; - break; - case 2: - x = -y + x; - y = (-y - start_x) / 2 - z; - break; - case 3: - x = y + x; - y = (-y + start_x) / 2 - z; - break; - } + rct_xyz16 coord_3d = { + .x = x, + .y = y, + .z = z + }; + + rct_xy16 coord_2d = coordinate_3d_to_2d(&coord_3d, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); // If the start location was invalid // propagate the invalid location to the output. @@ -158,8 +148,8 @@ void center_2d_coordinates(int x, int y, int z, int* out_x, int* out_y, rct_view return; } - *out_x = x - viewport->view_width / 2; - *out_y = y - viewport->view_height / 2; + *out_x = coord_2d.x - viewport->view_width / 2; + *out_y = coord_2d.y - viewport->view_height / 2; } /** @@ -721,77 +711,103 @@ void sub_688485(){ } -int sub_0x686806(sint8 al, sint8 ah, int image_id, sint8 cl, sint16 edx, sint16 si, sint16 di); -int sub_0x6869B2(sint8 al, sint8 ah, int image_id, sint8 cl, sint16 edx, sint16 si, sint16 di); - +/* rct2: 0x00686806, 0x006869B2, 0x00686B6F, 0x00686D31, 0x0098197C */ int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int edx, sint16 si, sint16 di, uint32 rotation){ + int ebp = ah + RCT2_GLOBAL(0x9DEA56, uint16); + + RCT2_GLOBAL(0xF1AD28, paint_struct*) = 0; + RCT2_GLOBAL(0xF1AD2C, uint32) = 0; + + //Not a paint struct but something similar + paint_struct* ps = RCT2_GLOBAL(0xEE7888, paint_struct*); + + if ((uint32)ps >= RCT2_GLOBAL(0xEE7880, uint32)) return 1; + + ps->image_id = image_id; + + rct_g1_element *g1Element; + uint32 image_element = image_id & 0x7FFFF; + + if (image_element < SPR_G2_BEGIN) { + g1Element = &g1Elements[image_element]; + } + else { + g1Element = &g2.elements[image_element - SPR_G2_BEGIN]; + } + + rct_xyz16 coord_3d = { + .x = al, + .y = cl, + .z = edx + }; + + rotate_map_coordinates(&coord_3d.x, &coord_3d.y, rotation); + + coord_3d.x += RCT2_GLOBAL(0x9DE568, sint16); + coord_3d.y += RCT2_GLOBAL(0x9DE56C, sint16); + + rct_xy16 map = coordinate_3d_to_2d(&coord_3d, rotation); + + ps->x = map.x; + ps->y = map.y; + + int left = map.x + g1Element->x_offset; + int bottom = map.y + g1Element->y_offset; + + int right = left + g1Element->width; + int top = bottom + g1Element->height; + + RCT2_GLOBAL(0xF1AD1C, uint16) = left; + RCT2_GLOBAL(0xF1AD1E, uint16) = bottom; + + rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + + if (right <= dpi->x)return 1; + if (top <= dpi->y)return 1; + if (left > dpi->x + dpi->width) return 1; + if (bottom > dpi->y + dpi->height) return 1; + + rct_xy16 unk = { + .x = di, + .y = si + }; + + rct_xy16 s_unk = { + .x = RCT2_GLOBAL(0x9DEA52, sint16), + .y = RCT2_GLOBAL(0x9DEA54, sint16) + }; + + // Unsure why rots 1 and 3 need to swap switch (rotation){ case 0: - return sub_0x686806(al, ah, image_id, cl, edx, si, di); + rotate_map_coordinates(&unk.x, &unk.y, 0); + rotate_map_coordinates(&s_unk.x, &s_unk.y, 0); + unk.x--; + unk.y--; + break; case 1: - return sub_0x6869B2(al, ah, image_id, cl, edx, si, di); - default: - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - al | (ah << 8), image_id, cl, edx, si, di, 0); - return 1; - } -} - -int sub_0x686806(sint8 al, sint8 ah, int image_id, sint8 cl, sint16 edx, sint16 si, sint16 di){ - int ebp = ah + RCT2_GLOBAL(0x9DEA56, uint16); - - RCT2_GLOBAL(0xF1AD28, paint_struct*) = 0; - RCT2_GLOBAL(0xF1AD2C, uint32) = 0; - - //Not a paint struct but something similar - paint_struct* ps = RCT2_GLOBAL(0xEE7888, paint_struct*); - - if ((uint32)ps >= RCT2_GLOBAL(0xEE7880, uint32)) return 1; - - ps->image_id = image_id; - - rct_g1_element *g1Element; - uint32 image_element = image_id & 0x7FFFF; - - if (image_element < SPR_G2_BEGIN) { - g1Element = &g1Elements[image_element]; - } - else { - g1Element = &g2.elements[image_element - SPR_G2_BEGIN]; + rotate_map_coordinates(&unk.x, &unk.y, 3); + rotate_map_coordinates(&s_unk.x, &s_unk.y, 3); + unk.y--; + break; + case 2: + rotate_map_coordinates(&unk.x, &unk.y, 2); + rotate_map_coordinates(&s_unk.x, &s_unk.y, 2); + break; + case 3: + rotate_map_coordinates(&unk.x, &unk.y, 1); + rotate_map_coordinates(&s_unk.x, &s_unk.y, 1); + unk.x--; + break; } - int eax = al + RCT2_GLOBAL(0x9DE568, sint16); - int ecx = cl + RCT2_GLOBAL(0x9DE56C, sint16); - - int x = ecx - eax; - int y = (ecx + eax) / 2 - edx; - - ps->x = x; - ps->y = y; - - int left = x + g1Element->x_offset; - int bottom = y + g1Element->y_offset; - - int right = left + g1Element->width; - int top = bottom + g1Element->height; - - RCT2_GLOBAL(0xF1AD1C, uint16) = left; - RCT2_GLOBAL(0xF1AD1E, uint16) = bottom; - - rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); - - if (right <= dpi->x)return 1; - if (top <= dpi->y)return 1; - if (left > dpi->x + dpi->width) return 1; - if (bottom > dpi->y + dpi->height) return 1; - - ps->other_x = di - 1 + RCT2_GLOBAL(0x9DEA52, sint16) + RCT2_GLOBAL(0x9DE568, sint16); + ps->other_x = unk.x + s_unk.x + RCT2_GLOBAL(0x9DE568, sint16); ps->some_x = RCT2_GLOBAL(0x009DEA56, sint16); ps->some_y = ebp; - ps->other_y = si - 1 + RCT2_GLOBAL(0x9DEA54, sint16) + RCT2_GLOBAL(0x009DE56C, sint16); + ps->other_y = unk.y + s_unk.y + RCT2_GLOBAL(0x009DE56C, sint16); ps->var_1A = 0; - ps->attached_x = RCT2_GLOBAL(0x9DEA52, sint16) + RCT2_GLOBAL(0x9DE568, sint16); - ps->attached_y = RCT2_GLOBAL(0x9DEA54, sint16) + RCT2_GLOBAL(0x009DE56C, sint16); + ps->attached_x = s_unk.x + RCT2_GLOBAL(0x9DE568, sint16); + ps->attached_y = s_unk.y + RCT2_GLOBAL(0x009DE56C, sint16); ps->attached_ps = NULL; ps->var_20 = NULL; ps->sprite_type = RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8); @@ -802,97 +818,26 @@ int sub_0x686806(sint8 al, sint8 ah, int image_id, sint8 cl, sint16 edx, sint16 RCT2_GLOBAL(0xF1AD28, paint_struct*) = ps; - di = ps->attached_y + ps->attached_x; - if (di < 0) - di = 0; + rct_xy16 attach = { + .x = ps->attached_x, + .y = ps->attached_y + }; - di /= 32; - if (di > 511) - di = 511; - - ps->var_18 = di; - paint_struct* old_ps = RCT2_ADDRESS(0x00F1A50C, paint_struct*)[di]; - RCT2_ADDRESS(0x00F1A50C, paint_struct*)[di] = ps; - ps->next_quadrant_ps = old_ps; - - if (di < RCT2_GLOBAL(0x00F1AD0C, sint32)){ - RCT2_GLOBAL(0x00F1AD0C, sint32) = di; + rotate_map_coordinates(&attach.x, &attach.y, rotation); + switch (rotation){ + case 0: + break; + case 1: + case 3: + attach.x += 0x2000; + break; + case 2: + attach.x += 0x4000; + break; } - if (di > RCT2_GLOBAL(0x00F1AD10, sint32)){ - RCT2_GLOBAL(0x00F1AD10, sint32) = di; - } + di = attach.x + attach.y; - RCT2_GLOBAL(0xEE7888, paint_struct*) += sizeof(paint_struct); - return 0; -} - -int sub_0x6869B2(sint8 al, sint8 ah, int image_id, sint8 cl, sint16 edx, sint16 si, sint16 di){ - int ebp = ah + RCT2_GLOBAL(0x9DEA56, uint16); - - RCT2_GLOBAL(0xF1AD28, paint_struct*) = 0; - RCT2_GLOBAL(0xF1AD2C, uint32) = 0; - - //Not a paint struct but something similar - paint_struct* ps = RCT2_GLOBAL(0xEE7888, paint_struct*); - - if ((uint32)ps >= RCT2_GLOBAL(0xEE7880, uint32)) return 1; - - ps->image_id = image_id; - - rct_g1_element *g1Element; - uint32 image_element = image_id & 0x7FFFF; - - if (image_element < SPR_G2_BEGIN) { - g1Element = &g1Elements[image_element]; - } - else { - g1Element = &g2.elements[image_element - SPR_G2_BEGIN]; - } - - int eax = cl + RCT2_GLOBAL(0x9DE568, sint16); - int ecx = -al + RCT2_GLOBAL(0x9DE56C, sint16); - - int x = -eax - ecx; - int y = (ecx - eax) / 2 - edx; - - ps->x = x; - ps->y = y; - - int left = x + g1Element->x_offset; - int bottom = y + g1Element->y_offset; - - int right = left + g1Element->width; - int top = bottom + g1Element->height; - - RCT2_GLOBAL(0xF1AD1C, uint16) = left; - RCT2_GLOBAL(0xF1AD1E, uint16) = bottom; - - rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); - - if (right <= dpi->x)return 1; - if (top <= dpi->y)return 1; - if (left > dpi->x + dpi->width) return 1; - if (bottom > dpi->y + dpi->height) return 1; - - ps->other_x = -si - RCT2_GLOBAL(0x9DEA54, sint16) + RCT2_GLOBAL(0x9DE568, sint16); - ps->some_x = RCT2_GLOBAL(0x009DEA56, sint16); - ps->some_y = ebp; - ps->other_y = di - 1 + RCT2_GLOBAL(0x9DEA52, sint16) + RCT2_GLOBAL(0x009DE56C, sint16); - ps->var_1A = 0; - ps->attached_x = -RCT2_GLOBAL(0x9DEA54, sint16) + RCT2_GLOBAL(0x9DE568, sint16); - ps->attached_y = RCT2_GLOBAL(0x9DEA52, sint16) + RCT2_GLOBAL(0x009DE56C, sint16); - ps->attached_ps = NULL; - ps->var_20 = NULL; - ps->sprite_type = RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8); - ps->var_29 = RCT2_GLOBAL(0x9DE571, uint8); - ps->map_x = RCT2_GLOBAL(0x9DE574, uint16); - ps->map_y = RCT2_GLOBAL(0x9DE576, uint16); - ps->mapElement = RCT2_GLOBAL(0x9DE578, rct_map_element*); - - RCT2_GLOBAL(0xF1AD28, paint_struct*) = ps; - - di = ps->attached_y - ps->attached_x + 0x2000; if (di < 0) di = 0; diff --git a/src/interface/window.c b/src/interface/window.c index 2c210a78ac..5a88d463f1 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -1270,6 +1270,12 @@ void window_scroll_to_viewport(rct_window *w) */ void window_scroll_to_location(rct_window *w, int x, int y, int z) { + rct_xyz16 location_3d = { + .x = x, + .y = y, + .z = z + }; + if (w->viewport) { sint16 height = map_element_height(x, y); if (z < height - 16) { @@ -1283,26 +1289,9 @@ void window_scroll_to_location(rct_window *w, int x, int y, int z) window_invalidate(w); } } - sint16 sx; - sint16 sy; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) { - case 0: - sx = y - x; - sy = ((x + y) / 2) - z; - break; - case 1: - sx = -y - x; - sy = ((-x + y) / 2) - z; - break; - case 2: - sx = -y + x; - sy = ((-x - y) / 2) - z; - break; - case 3: - sx = y + x; - sy = ((x - y) / 2) - z; - break; - } + + rct_xy16 map_coordinate = coordinate_3d_to_2d(&location_3d, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)); + int i = 0; if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO)) { int found = 0; @@ -1336,8 +1325,8 @@ void window_scroll_to_location(rct_window *w, int x, int y, int z) // rct2: 0x006E7C76 if (w->viewport_target_sprite == -1) { if (!(w->flags & WF_2)) { - w->saved_view_x = sx - (sint16)(w->viewport->view_width * window_scroll_locations[i][0]); - w->saved_view_y = sy - (sint16)(w->viewport->view_height * window_scroll_locations[i][1]); + w->saved_view_x = map_coordinate.x - (sint16)(w->viewport->view_width * window_scroll_locations[i][0]); + w->saved_view_y = map_coordinate.y - (sint16)(w->viewport->view_height * window_scroll_locations[i][1]); w->flags |= WF_SCROLLING_TO_LOCATION; } } diff --git a/src/world/map.c b/src/world/map.c index 09e4170305..c4dfe17bbc 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -87,6 +87,30 @@ void rotate_map_coordinates(sint16* x, sint16* y, uint8 rotation){ } } +rct_xy16 coordinate_3d_to_2d(const rct_xyz16* coordinate_3d, uint8 rotation){ + rct_xy16 coordinate_2d; + + switch (rotation){ + case 0: + coordinate_2d.x = coordinate_3d->y - coordinate_3d->x; + coordinate_2d.y = (coordinate_3d->y + coordinate_3d->x) / 2 - coordinate_3d->z; + break; + case 1: + coordinate_2d.x = -coordinate_3d->y - coordinate_3d->x; + coordinate_2d.y = (coordinate_3d->y - coordinate_3d->x) / 2 - coordinate_3d->z; + break; + case 2: + coordinate_2d.x = -coordinate_3d->y + coordinate_3d->x; + coordinate_2d.y = (-coordinate_3d->y - coordinate_3d->x) / 2 - coordinate_3d->z; + break; + case 3: + coordinate_2d.x = coordinate_3d->y + coordinate_3d->x; + coordinate_2d.y = (-coordinate_3d->y + coordinate_3d->x) / 2 - coordinate_3d->z; + break; + } + return coordinate_2d; +} + void map_element_iterator_begin(map_element_iterator *it) { it->x = 0; diff --git a/src/world/map.h b/src/world/map.h index 0271d4d185..c1f1c9de23 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -283,6 +283,7 @@ rct_map_element *map_element_insert(int x, int y, int z, int flags); int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *clearFunc, uint8 bl); int map_can_construct_at(int x, int y, int zLow, int zHigh, uint8 bl); void rotate_map_coordinates(sint16* x, sint16* y, uint8 rotation); +rct_xy16 coordinate_3d_to_2d(const rct_xyz16* coordinate_3d, uint8 rotation); money32 map_clear_scenery(int x0, int y0, int x1, int y1, int flags); money32 lower_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags); money32 raise_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags); From 8c16d60f0d26acc6305ba32e110d2b75ce847210 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 22 Jun 2015 04:00:18 +0100 Subject: [PATCH 0060/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/portuguese_br.txt | 3452 +++++++++++++++++++++++++++++++ 1 file changed, 3452 insertions(+) create mode 100644 data/language/portuguese_br.txt diff --git a/data/language/portuguese_br.txt b/data/language/portuguese_br.txt new file mode 100644 index 0000000000..9faf34b983 --- /dev/null +++ b/data/language/portuguese_br.txt @@ -0,0 +1,3452 @@ +# STR_XXXX part is read and XXXX becomes the string id number. +# Everything after the colon and before the new line will be saved as the string. +# Use # at the beginning of a line to leave a comment. +STR_0000 : +STR_0001 :{STRINGID} {COMMA16} +STR_0002 :Atração +STR_0003 :Atração +STR_0004 :Suspended Swinging Coaster +STR_0005 :Atração +STR_0006 :Montanha-Russa Junior +STR_0007 :Miniature Railway +STR_0008 :Monotrilho +STR_0009 :Mini Suspended Coaster +STR_0010 :Atração +STR_0011 :Atração +STR_0012 :Atração +STR_0013 :Passeio de carro* +STR_0014 :Atração +STR_0015 :Atração +STR_0016 :Atração +STR_0017 :Looping Roller Coaster +STR_0018 :Atração +STR_0019 :Atração +STR_0020 :Teleférico +STR_0021 :Atração +STR_0022 :Atração +STR_0023 :Atração +STR_0024 :Atração +STR_0025 :Atração +STR_0026 :Atração +STR_0027 :Atração +STR_0028 :Atração +STR_0029 :Atração +STR_0030 :Barraca +STR_0031 :Barraca +STR_0032 :Barraca +STR_0033 :Barraca +STR_0034 :Barraca +STR_0035 :Atração +STR_0036 :Barraca +STR_0037 :Quiosque +STR_0038 :Banheiro +STR_0039 :Atração +STR_0040 :Atração +STR_0041 :Atração +STR_0042 :Atração +STR_0043 :Atração +STR_0044 :Reverse Freefall Coaster +STR_0045 :Elevador +STR_0046 :Atração +STR_0047 :Atração +STR_0048 :Atração +STR_0049 :Atração +STR_0050 :Atração +STR_0051 :Atração +STR_0052 :Atração +STR_0053 :Hyper-Twister Roller Coaster +STR_0054 :Wooden Roller Coaster +STR_0055 :Side-Friction Roller Coaster +STR_0056 :Wild Mouse +STR_0057 :Multi-Dimension Roller Coaster +STR_0058 :Atração +STR_0059 :Aerial Inverted Roller Coaster +STR_0060 :Atração +STR_0061 :Atração +STR_0062 :Atração +STR_0063 :Atração +STR_0064 :Atração +STR_0065 :Monotrilho Suspenso +STR_0066 :Atração +STR_0067 :Atração +STR_0068 :Heartline Twister Coaster +STR_0069 :Atração +STR_0070 :Atração +STR_0071 :Atração +STR_0072 :Atração +STR_0073 :Atração +STR_0074 :Atração +STR_0075 :Atração +STR_0076 :Montanha-Russa D'água +STR_0077 :Atração +STR_0078 :Atração +STR_0079 :Atração +STR_0080 :Atração +STR_0081 :Atração +STR_0082 :Atração +STR_0083 :Atração +STR_0084 :Atração +STR_0085 :Atração +STR_0086 :Atração +STR_0087 :Atração +STR_0088 :Atração +STR_0089 :Mini Montanha-Russa +STR_0090 :Atração +STR_0091 :Atração +STR_0092 :Atração +STR_0093 : +STR_0094 : +STR_0095 : +STR_0096 : +STR_0097 : +STR_0098 : +STR_0099 : +STR_0100 : +STR_0101 : +STR_0102 : +STR_0103 : +STR_0104 : +STR_0105 : +STR_0106 : +STR_0107 : +STR_0108 : +STR_0109 : +STR_0110 : +STR_0111 : +STR_0112 : +STR_0113 : +STR_0114 : +STR_0115 : +STR_0116 : +STR_0117 : +STR_0118 : +STR_0119 : +STR_0120 : +STR_0121 : +STR_0122 : +STR_0123 : +STR_0124 : +STR_0125 : +STR_0126 : +STR_0127 : +STR_0128 : +STR_0129 : +STR_0130 : +STR_0131 : +STR_0132 : +STR_0133 : +STR_0134 : +STR_0135 : +STR_0136 : +STR_0137 : +STR_0138 : +STR_0139 : +STR_0140 : +STR_0141 : +STR_0142 : +STR_0143 : +STR_0144 : +STR_0145 : +STR_0146 : +STR_0147 : +STR_0148 : +STR_0149 : +STR_0150 : +STR_0151 : +STR_0152 : +STR_0153 : +STR_0154 : +STR_0155 : +STR_0156 : +STR_0157 : +STR_0158 : +STR_0159 : +STR_0160 : +STR_0161 : +STR_0162 : +STR_0163 : +STR_0164 : +STR_0165 : +STR_0166 : +STR_0167 : +STR_0168 : +STR_0169 : +STR_0170 : +STR_0171 : +STR_0172 : +STR_0173 : +STR_0174 : +STR_0175 : +STR_0176 : +STR_0177 : +STR_0178 : +STR_0179 : +STR_0180 : +STR_0181 : +STR_0182 : +STR_0183 : +STR_0184 : +STR_0185 : +STR_0186 : +STR_0187 : +STR_0188 : +STR_0189 : +STR_0190 : +STR_0191 : +STR_0192 : +STR_0193 : +STR_0194 : +STR_0195 : +STR_0196 : +STR_0197 : +STR_0198 : +STR_0199 : +STR_0200 : +STR_0201 : +STR_0202 : +STR_0203 : +STR_0204 : +STR_0205 : +STR_0206 : +STR_0207 : +STR_0208 : +STR_0209 : +STR_0210 : +STR_0211 : +STR_0212 : +STR_0213 : +STR_0214 : +STR_0215 : +STR_0216 : +STR_0217 : +STR_0218 : +STR_0219 : +STR_0220 : +STR_0221 : +STR_0222 : +STR_0223 : +STR_0224 : +STR_0225 : +STR_0226 : +STR_0227 : +STR_0228 : +STR_0229 : +STR_0230 : +STR_0231 : +STR_0232 : +STR_0233 : +STR_0234 : +STR_0235 : +STR_0236 : +STR_0237 : +STR_0238 : +STR_0239 : +STR_0240 : +STR_0241 : +STR_0242 : +STR_0243 : +STR_0244 : +STR_0245 : +STR_0246 : +STR_0247 : +STR_0248 : +STR_0249 : +STR_0250 : +STR_0251 : +STR_0252 : +STR_0253 : +STR_0254 : +STR_0255 : +STR_0256 : +STR_0257 : +STR_0258 : +STR_0259 : +STR_0260 : +STR_0261 : +STR_0262 : +STR_0263 : +STR_0264 : +STR_0265 : +STR_0266 : +STR_0267 : +STR_0268 : +STR_0269 : +STR_0270 : +STR_0271 : +STR_0272 : +STR_0273 : +STR_0274 : +STR_0275 : +STR_0276 : +STR_0277 : +STR_0278 : +STR_0279 : +STR_0280 : +STR_0281 : +STR_0282 : +STR_0283 : +STR_0284 : +STR_0285 : +STR_0286 : +STR_0287 : +STR_0288 : +STR_0289 : +STR_0290 : +STR_0291 : +STR_0292 : +STR_0293 : +STR_0294 : +STR_0295 : +STR_0296 : +STR_0297 : +STR_0298 : +STR_0299 : +STR_0300 : +STR_0301 : +STR_0302 : +STR_0303 : +STR_0304 : +STR_0305 : +STR_0306 : +STR_0307 : +STR_0308 : +STR_0309 : +STR_0310 : +STR_0311 : +STR_0312 : +STR_0313 : +STR_0314 : +STR_0315 : +STR_0316 : +STR_0317 : +STR_0318 : +STR_0319 : +STR_0320 : +STR_0321 : +STR_0322 : +STR_0323 : +STR_0324 : +STR_0325 : +STR_0326 : +STR_0327 : +STR_0328 : +STR_0329 : +STR_0330 : +STR_0331 : +STR_0332 : +STR_0333 : +STR_0334 : +STR_0335 : +STR_0336 : +STR_0337 : +STR_0338 : +STR_0339 : +STR_0340 : +STR_0341 : +STR_0342 : +STR_0343 : +STR_0344 : +STR_0345 : +STR_0346 : +STR_0347 : +STR_0348 : +STR_0349 : +STR_0350 : +STR_0351 : +STR_0352 : +STR_0353 : +STR_0354 : +STR_0355 : +STR_0356 : +STR_0357 : +STR_0358 : +STR_0359 : +STR_0360 : +STR_0361 : +STR_0362 : +STR_0363 : +STR_0364 : +STR_0365 : +STR_0366 : +STR_0367 : +STR_0368 : +STR_0369 : +STR_0370 : +STR_0371 : +STR_0372 : +STR_0373 : +STR_0374 : +STR_0375 : +STR_0376 : +STR_0377 : +STR_0378 : +STR_0379 : +STR_0380 : +STR_0381 : +STR_0382 : +STR_0383 : +STR_0384 : +STR_0385 : +STR_0386 : +STR_0387 : +STR_0388 : +STR_0389 : +STR_0390 : +STR_0391 : +STR_0392 : +STR_0393 : +STR_0394 : +STR_0395 : +STR_0396 : +STR_0397 : +STR_0398 : +STR_0399 : +STR_0400 : +STR_0401 : +STR_0402 : +STR_0403 : +STR_0404 : +STR_0405 : +STR_0406 : +STR_0407 : +STR_0408 : +STR_0409 : +STR_0410 : +STR_0411 : +STR_0412 : +STR_0413 : +STR_0414 : +STR_0415 : +STR_0416 : +STR_0417 : +STR_0418 : +STR_0419 : +STR_0420 : +STR_0421 : +STR_0422 : +STR_0423 : +STR_0424 : +STR_0425 : +STR_0426 : +STR_0427 : +STR_0428 : +STR_0429 : +STR_0430 : +STR_0431 : +STR_0432 : +STR_0433 : +STR_0434 : +STR_0435 : +STR_0436 : +STR_0437 : +STR_0438 : +STR_0439 : +STR_0440 : +STR_0441 : +STR_0442 : +STR_0443 : +STR_0444 : +STR_0445 : +STR_0446 : +STR_0447 : +STR_0448 : +STR_0449 : +STR_0450 : +STR_0451 : +STR_0452 : +STR_0453 : +STR_0454 : +STR_0455 : +STR_0456 : +STR_0457 : +STR_0458 : +STR_0459 : +STR_0460 : +STR_0461 : +STR_0462 : +STR_0463 : +STR_0464 : +STR_0465 : +STR_0466 : +STR_0467 : +STR_0468 : +STR_0469 : +STR_0470 : +STR_0471 : +STR_0472 : +STR_0473 : +STR_0474 : +STR_0475 : +STR_0476 : +STR_0477 : +STR_0478 : +STR_0479 : +STR_0480 : +STR_0481 : +STR_0482 : +STR_0483 : +STR_0484 : +STR_0485 : +STR_0486 : +STR_0487 : +STR_0488 : +STR_0489 : +STR_0490 : +STR_0491 : +STR_0492 : +STR_0493 : +STR_0494 : +STR_0495 : +STR_0496 : +STR_0497 : +STR_0498 : +STR_0499 : +STR_0500 : +STR_0501 : +STR_0502 : +STR_0503 : +STR_0504 : +STR_0505 : +STR_0506 : +STR_0507 : +STR_0508 : +STR_0509 : +STR_0510 : +STR_0511 : +STR_0512 : +STR_0513 : +STR_0514 :Montanha-Russa com trens suspensos que balançam para os lados nas curvas +STR_0515 : +STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides +STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track +STR_0518 :Passengers travel in electric trains along a monorail track +STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners +STR_0520 : +STR_0521 : +STR_0522 : +STR_0523 :Riders travel slowly in powered vehicles along a track-based route +STR_0524 : +STR_0525 : +STR_0526 : +STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops +STR_0528 : +STR_0529 : +STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again +STR_0531 : +STR_0532 : +STR_0533 : +STR_0534 : +STR_0535 : +STR_0536 : +STR_0537 : +STR_0538 : +STR_0539 : +STR_0540 : +STR_0541 : +STR_0542 : +STR_0543 : +STR_0544 : +STR_0545 : +STR_0546 : +STR_0547 : +STR_0548 : +STR_0549 : +STR_0550 : +STR_0551 : +STR_0552 : +STR_0553 : +STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station +STR_0555 : +STR_0556 : +STR_0557 : +STR_0558 : +STR_0559 : +STR_0560 : +STR_0561 : +STR_0562 : +STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills +STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' +STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity +STR_0566 :Individual roller coaster cars zip around a tight zig-zag layout of track with sharp corners and short sharp drops +STR_0567 :Sitting in seats suspended either side of the track, riders are pitched head-over-heels while they plunge down steep drops and travel through various inversions +STR_0568 : +STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air +STR_0570 : +STR_0571 : +STR_0572 : +STR_0573 : +STR_0574 : +STR_0575 :Powered trains hanging from a single rail transport people around the park +STR_0576 : +STR_0577 : +STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists +STR_0579 : +STR_0580 : +STR_0581 : +STR_0582 : +STR_0583 : +STR_0584 : +STR_0585 : +STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections +STR_0587 : +STR_0588 : +STR_0589 : +STR_0590 : +STR_0591 : +STR_0592 : +STR_0593 : +STR_0594 : +STR_0595 : +STR_0596 : +STR_0597 : +STR_0598 : +STR_0599 :Montanha-russa compacta com os carros individuais e suaves quedas inclinadas* +STR_0600 : +STR_0601 : +STR_0602 : +STR_0603 :Visitante {INT32} +STR_0604 :Visitante {INT32} +STR_0605 :Visitante {INT32} +STR_0606 :Visitante {INT32} +STR_0607 :Visitante {INT32} +STR_0608 :Visitante {INT32} +STR_0609 :Visitante {INT32} +STR_0610 :Visitante {INT32} +STR_0611 :Visitante {INT32} +STR_0612 :Visitante {INT32} +STR_0613 :Visitante {INT32} +STR_0614 :Visitante {INT32} +STR_0615 :Visitante {INT32} +STR_0616 :Visitante {INT32} +STR_0617 :Visitante {INT32} +STR_0618 :Visitante {INT32} +STR_0619 :Visitante {INT32} +STR_0620 :Visitante {INT32} +STR_0621 :Visitante {INT32} +STR_0622 :Visitante {INT32} +STR_0623 :Visitante {INT32} +STR_0624 :Visitante {INT32} +STR_0625 :Visitante {INT32} +STR_0626 :Visitante {INT32} +STR_0627 :Visitante {INT32} +STR_0628 :Visitante {INT32} +STR_0629 :Visitante {INT32} +STR_0630 :Visitante {INT32} +STR_0631 :Visitante {INT32} +STR_0632 :Visitante {INT32} +STR_0633 :Visitante {INT32} +STR_0634 :Visitante {INT32} +STR_0635 :Visitante {INT32} +STR_0636 :Visitante {INT32} +STR_0637 :Visitante {INT32} +STR_0638 :Visitante {INT32} +STR_0639 :Visitante {INT32} +STR_0640 :Visitante {INT32} +STR_0641 :Visitante {INT32} +STR_0642 :Visitante {INT32} +STR_0643 :Visitante {INT32} +STR_0644 :Visitante {INT32} +STR_0645 :Visitante {INT32} +STR_0646 :Visitante {INT32} +STR_0647 :Visitante {INT32} +STR_0648 :Visitante {INT32} +STR_0649 :Visitante {INT32} +STR_0650 :Visitante {INT32} +STR_0651 :Visitante {INT32} +STR_0652 :Visitante {INT32} +STR_0653 :Visitante {INT32} +STR_0654 :Visitante {INT32} +STR_0655 :Visitante {INT32} +STR_0656 :Visitante {INT32} +STR_0657 :Visitante {INT32} +STR_0658 :Visitante {INT32} +STR_0659 :Visitante {INT32} +STR_0660 :Visitante {INT32} +STR_0661 :Visitante {INT32} +STR_0662 :Visitante {INT32} +STR_0663 :Visitante {INT32} +STR_0664 :Visitante {INT32} +STR_0665 :Visitante {INT32} +STR_0666 :Visitante {INT32} +STR_0667 :Visitante {INT32} +STR_0668 :Visitante {INT32} +STR_0669 :Visitante {INT32} +STR_0670 :Visitante {INT32} +STR_0671 :Visitante {INT32} +STR_0672 :Visitante {INT32} +STR_0673 :Visitante {INT32} +STR_0674 :Visitante {INT32} +STR_0675 :Visitante {INT32} +STR_0676 :Visitante {INT32} +STR_0677 :Visitante {INT32} +STR_0678 :Visitante {INT32} +STR_0679 :Visitante {INT32} +STR_0680 :Visitante {INT32} +STR_0681 :Visitante {INT32} +STR_0682 :Visitante {INT32} +STR_0683 :Visitante {INT32} +STR_0684 :Visitante {INT32} +STR_0685 :Visitante {INT32} +STR_0686 :Visitante {INT32} +STR_0687 :Visitante {INT32} +STR_0688 :Visitante {INT32} +STR_0689 :Visitante {INT32} +STR_0690 :Visitante {INT32} +STR_0691 :Visitante {INT32} +STR_0692 :Visitante {INT32} +STR_0693 :Visitante {INT32} +STR_0694 :Visitante {INT32} +STR_0695 :Visitante {INT32} +STR_0696 :Visitante {INT32} +STR_0697 :Visitante {INT32} +STR_0698 :Visitante {INT32} +STR_0699 :Visitante {INT32} +STR_0700 :Visitante {INT32} +STR_0701 :Visitante {INT32} +STR_0702 :Visitante {INT32} +STR_0703 :Visitante {INT32} +STR_0704 :Visitante {INT32} +STR_0705 :Visitante {INT32} +STR_0706 :Visitante {INT32} +STR_0707 :Visitante {INT32} +STR_0708 :Visitante {INT32} +STR_0709 :Visitante {INT32} +STR_0710 :Visitante {INT32} +STR_0711 :Visitante {INT32} +STR_0712 :Visitante {INT32} +STR_0713 :Visitante {INT32} +STR_0714 :Visitante {INT32} +STR_0715 :Visitante {INT32} +STR_0716 :Visitante {INT32} +STR_0717 :Visitante {INT32} +STR_0718 :Visitante {INT32} +STR_0719 :Visitante {INT32} +STR_0720 :Visitante {INT32} +STR_0721 :Visitante {INT32} +STR_0722 :Visitante {INT32} +STR_0723 :Visitante {INT32} +STR_0724 :Visitante {INT32} +STR_0725 :Visitante {INT32} +STR_0726 :Visitante {INT32} +STR_0727 :Visitante {INT32} +STR_0728 :Visitante {INT32} +STR_0729 :Visitante {INT32} +STR_0730 :Visitante {INT32} +STR_0731 :Visitante {INT32} +STR_0732 :Visitante {INT32} +STR_0733 :Visitante {INT32} +STR_0734 :Visitante {INT32} +STR_0735 :Visitante {INT32} +STR_0736 :Visitante {INT32} +STR_0737 :Visitante {INT32} +STR_0738 :Visitante {INT32} +STR_0739 :Visitante {INT32} +STR_0740 :Visitante {INT32} +STR_0741 :Visitante {INT32} +STR_0742 :Visitante {INT32} +STR_0743 :Visitante {INT32} +STR_0744 :Visitante {INT32} +STR_0745 :Visitante {INT32} +STR_0746 :Visitante {INT32} +STR_0747 :Visitante {INT32} +STR_0748 :Visitante {INT32} +STR_0749 :Visitante {INT32} +STR_0750 :Visitante {INT32} +STR_0751 :Visitante {INT32} +STR_0752 :Visitante {INT32} +STR_0753 :Visitante {INT32} +STR_0754 :Visitante {INT32} +STR_0755 :Visitante {INT32} +STR_0756 :Visitante {INT32} +STR_0757 :Visitante {INT32} +STR_0758 :Visitante {INT32} +STR_0759 :Visitante {INT32} +STR_0760 :Visitante {INT32} +STR_0761 :Visitante {INT32} +STR_0762 :Visitante {INT32} +STR_0763 :Visitante {INT32} +STR_0764 :Visitante {INT32} +STR_0765 :Visitante {INT32} +STR_0766 :Visitante {INT32} +STR_0767 :Visitante {INT32} +STR_0768 :Faz-Tudo {INT32} +STR_0769 :Mecânico {INT32} +STR_0770 :Segurança {INT32} +STR_0771 :Animador {INT32} +STR_0772 :Park Sem Nome{POP16}{POP16} +STR_0773 :Park Sem Nome{POP16}{POP16} +STR_0774 :Park Sem Nome{POP16}{POP16} +STR_0775 :Park Sem Nome{POP16}{POP16} +STR_0776 :Park Sem Nome{POP16}{POP16} +STR_0777 :Park Sem Nome{POP16}{POP16} +STR_0778 :Entrar* +STR_0779 :1º de +STR_0780 :2 de +STR_0781 :3 de +STR_0782 :4 de +STR_0783 :5 de +STR_0784 :6 de +STR_0785 :7 de +STR_0786 :8 de +STR_0787 :9 de +STR_0788 :10 de +STR_0789 :11 de +STR_0790 :12 de +STR_0791 :13 de +STR_0792 :14 de +STR_0793 :15 de +STR_0794 :16 de +STR_0795 :17 de +STR_0796 :18 de +STR_0797 :19 de +STR_0798 :20 de +STR_0799 :21 de +STR_0800 :22 de +STR_0801 :23 de +STR_0802 :24 de +STR_0803 :25 de +STR_0804 :26 de +STR_0805 :27 de +STR_0806 :28 de +STR_0807 :29 de +STR_0808 :30 de +STR_0809 :31 de +STR_0810 :Jan +STR_0811 :Fev +STR_0812 :Mar +STR_0813 :Abr +STR_0814 :Mai +STR_0815 :Jun +STR_0816 :Jul +STR_0817 :Ago +STR_0818 :Set +STR_0819 :Out +STR_0820 :Nov +STR_0821 :Dez +STR_0822 :Impossível acessar o arquivo de gráficos +STR_0823 :Arquivo de dados ausente ou inacessível +STR_0824 :{BLACK}{CROSS} +STR_0825 :Nome escolhido já está em uso +STR_0826 :Muitos nomes definidos +STR_0827 :Dinheiro insuficiente - requer {CURRENCY2DP} +STR_0828 :{SMALLFONT}{BLACK}Fechar Janela +STR_0829 :{SMALLFONT}{BLACK}Título da janela - Arraste para mover a janela +STR_0830 :{SMALLFONT}{BLACK}Aumentar Zoom +STR_0831 :{SMALLFONT}{BLACK}Reduzir Zoom +STR_0832 :{SMALLFONT}{BLACK}Rotacionar visão em 90{DEGREE} no sentido horário +STR_0833 :{SMALLFONT}{BLACK}Pausar Jogo +STR_0834 :{SMALLFONT}{BLACK}Opções de disco e jogo +STR_0835 :Inicialização do jogo falhou +STR_0836 :Impossível iniciar o jogo minimizado +STR_0837 :Impossível inicializar o sistema de gráficos +STR_0838 :Código da chave {INT32} não é válido para o seu CD do RollerCoaster Tycoon 2!{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Por favor, desinstalar o RollerCoaster Tycoon 2% e reinstalar com o código da chave correta. +STR_0839 :{UINT16} x {UINT16} +STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} +STR_0841 :Janela da área de trabalho +STR_0842 :640x480 tela cheia +STR_0843 :800x600 tela cheia +STR_0844 :1024x768 tela cheia +STR_0845 :1152x864 tela cheia +STR_0846 :1280x1024 tela cheia +STR_0847 :Sobre 'RollerCoaster Tycoon 2' +STR_0848 :RollerCoaster Tycoon 2 +STR_0849 :{WINDOW_COLOUR_2}Versão 2.01.028 +STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, Todos os Direitos Reservados +STR_0851 :{WINDOW_COLOUR_2}Projetado e programado por Chris Sawyer +STR_0852 :{WINDOW_COLOUR_2}Gráficos por Simon Foster +STR_0853 :{WINDOW_COLOUR_2}Som e musícas por Allister Brimble +STR_0854 :{WINDOW_COLOUR_2}Sons adicionais gravador por David Ellis +STR_0855 :{WINDOW_COLOUR_2}Representação por Jacqui Lyons na Marjacq Ltd. +STR_0856 :{WINDOW_COLOUR_2}Obrigado a: +STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth e John Wardley +STR_0858 :{WINDOW_COLOUR_2} +STR_0859 :{WINDOW_COLOUR_2} +STR_0860 :{WINDOW_COLOUR_2} +STR_0861 : +STR_0862 : +STR_0863 : +STR_0864 : +STR_0865 :{STRINGID} +STR_0866 :{POP16}{STRINGID} +STR_0867 :{POP16}{POP16}{STRINGID} +STR_0868 :{POP16}{POP16}{POP16}{STRINGID} +STR_0869 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0870 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0872 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0873 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0874 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0875 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0876 :{BLACK}{DOWN} +STR_0877 :Muito baixo ! +STR_0878 :Muito alto ! +STR_0879 :Não é possível baixar terra aqui... +STR_0880 :Não é possível aumentar a terra aqui... +STR_0881 :Objeto no caminho +STR_0882 :Carregar Jogo +STR_0883 :Salvar Jogo +STR_0884 :Carregar Landscape* +STR_0885 :Salvar Landscape* +STR_0886 :Sair do Jogo +STR_0887 :Sair do Editor de Cenário +STR_0888 :Sair do Designer de Montanha-Russa +STR_0889 :Sair do Gerenciamento de Designs de Pista +STR_0890 :SCR{COMMA16}.BMP +STR_0891 :Captura de tela +STR_0892 :Captura de tela salvo no disco como '{STRINGID}' +STR_0893 :Capturas de tela falhou ! +STR_0894 :Landscape data area full ! +STR_0895 :Impossível construir parcialmente em cima e em baixo do chão +STR_0896 :{POP16}{POP16}{STRINGID} Construção +STR_0897 :Sentido* +STR_0898 :{SMALLFONT}{BLACK}Curva para esquerda +STR_0899 :{SMALLFONT}{BLACK}Curva para direita +STR_0900 :{SMALLFONT}{BLACK}Curva para esquerda (raio pequeno) +STR_0901 :{SMALLFONT}{BLACK}Curva para direita (raio pequeno) +STR_0902 :{SMALLFONT}{BLACK}Curva para esquerda (raio muito pequeno) +STR_0903 :{SMALLFONT}{BLACK}Curva para esquerda (raio muito pequeno) +STR_0904 :{SMALLFONT}{BLACK}Curva para esquerda (raio grande) +STR_0905 :{SMALLFONT}{BLACK}Curva para esquerda (raio grande) +STR_0906 :{SMALLFONT}{BLACK}Em Linha Reta* +STR_0907 :Inclinação* +STR_0908 :Rolar/Banking* +STR_0909 :Seat Rot. +STR_0910 :{SMALLFONT}{BLACK}Roll for left-hand curve +STR_0911 :{SMALLFONT}{BLACK}Roll for right-hand curve +STR_0912 :{SMALLFONT}{BLACK}No roll +STR_0913 :{SMALLFONT}{BLACK}Move to previous section +STR_0914 :{SMALLFONT}{BLACK}Move to next section +STR_0915 :{SMALLFONT}{BLACK}Construct the selected section +STR_0916 :{SMALLFONT}{BLACK}Remove the highlighted section +STR_0917 :{SMALLFONT}{BLACK}Vertical drop +STR_0918 :{SMALLFONT}{BLACK}Steep slope down +STR_0919 :{SMALLFONT}{BLACK}Slope down +STR_0920 :{SMALLFONT}{BLACK}Level +STR_0921 :{SMALLFONT}{BLACK}Slope up +STR_0922 :{SMALLFONT}{BLACK}Steep slope up +STR_0923 :{SMALLFONT}{BLACK}Vertical rise +STR_0924 :{SMALLFONT}{BLACK}Helix down +STR_0925 :{SMALLFONT}{BLACK}Helix up +STR_0926 :Impossível remover isto... +STR_0927 :Impossível construir isto aqui... +STR_0928 :{SMALLFONT}{BLACK}Corrente elevador, para puxar os carros para cima** +STR_0929 :Curva 'S' (esquerda) +STR_0930 :Curva 'S' (direita) +STR_0931 :Loop Vertical (esquerda) +STR_0932 :Loop Vertical (direita) +STR_0933 :Aumentar ou diminuir o terreno primeiro +STR_0934 :Entrada da atração no caminho +STR_0935 :Saída da atração no caminho +STR_0936 :Entrada do parque no caminho +STR_0937 :{SMALLFONT}{BLACK}Opções de visão +STR_0938 :{SMALLFONT}{BLACK}Ajuste de altura do solo e inclinação +STR_0939 :Subterrâneo/Visão interna +STR_0940 :Remover base da terra +STR_0941 :Remover faces verticais +STR_0942 :Ver Através das Atrações +STR_0943 :Ver Através dos Cenários* +STR_0944 :Salvar +STR_0945 :Não Salvar +STR_0946 :Cancelar +STR_0947 :Salvar antes de carregar ? +STR_0948 :Salvar antes de sair ? +STR_0949 :Salvar antes de sair ? +STR_0950 :Carregar Jogo +STR_0951 :Sair do Jogo +STR_0952 :Sair do Jogo +STR_0953 :Load Landscape +STR_0954 : +STR_0955 :{SMALLFONT}{BLACK}Escolha um ângulo de rotação do assento para esta seção da pista* +STR_0956 :-180{DEGREE} +STR_0957 :-135{DEGREE} +STR_0958 :-90{DEGREE} +STR_0959 :-45{DEGREE} +STR_0960 :0{DEGREE} +STR_0961 :+45{DEGREE} +STR_0962 :+90{DEGREE} +STR_0963 :+135{DEGREE} +STR_0964 :+180{DEGREE} +STR_0965 :+225{DEGREE} +STR_0966 :+270{DEGREE} +STR_0967 :+315{DEGREE} +STR_0968 :+360{DEGREE} +STR_0969 :+405{DEGREE} +STR_0970 :+450{DEGREE} +STR_0971 :+495{DEGREE} +STR_0972 :Cancelar +STR_0973 :OK +STR_0974 :Atrações +STR_0975 :Lojas, Barracas & Stands +STR_0976 :Banheiros e Quiosques de Informações +STR_0977 :Novas Atrações de Transporte +STR_0978 :Novas Atrações Suaves/Calmas* +STR_0979 :Novas Montanhas-Russas +STR_0980 :Novas Atrações Emocionantes +STR_0981 :Novas Atrações Aquáticas +STR_0982 :Novas Lojas, Barracas & Stands* +STR_0983 :Pesquisa e Desenvolvimento +STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} +STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP} +STR_0986 :{BLACK}{CURRENCY2DP} +STR_0987 :Muitas atrações +STR_0988 :Impossível criar uma nova atração... +STR_0989 :{STRINGID} +STR_0990 :{SMALLFONT}{BLACK}Construção +STR_0991 :Plataforma da estação +STR_0992 :{SMALLFONT}{BLACK}Demolir toda a atração +STR_0993 :Demolir atração +STR_0994 :Demolir +STR_0995 :{WINDOW_COLOUR_1}Você tem certeza que deseja demolir completamente {STRINGID}? +STR_0996 :Visão Geral +STR_0997 :{SMALLFONT}{BLACK}Ver seleção +STR_0998 :Não há mais estações permitidas nesta atração +STR_0999 :Requer uma plataforma da estação +STR_1000 :A pista não é um circuito completo +STR_1001 :Track unsuitable for type of train +STR_1002 :Impossível Abrir {POP16}{POP16}{POP16}{STRINGID}... +STR_1003 :Impossível Testar {POP16}{POP16}{POP16}{STRINGID}... +STR_1004 :Impossível Fechar {POP16}{POP16}{POP16}{STRINGID}... +STR_1005 :Impossível começar a construção no {POP16}{POP16}{POP16}{STRINGID}... +STR_1006 :Deve ser fechado primeiro +STR_1007 :Impossível criar veículos suficientes +STR_1008 :{SMALLFONT}{BLACK}Abrir, fechar ou testar atração* +STR_1009 :{SMALLFONT}{BLACK}Abrir ou fechar todas as atrações +STR_1010 :{SMALLFONT}{BLACK}Abrir ou fechar o parque +STR_1011 :Fechar todos +STR_1012 :Abrir todos +STR_1013 :Fechar parque +STR_1014 :Abrir parque +STR_1015 :Impossível operar com mais de uma plataforma de estação neste modo +STR_1016 :Impossível operar com menos de duas estações neste modo +STR_1017 :Impossível alterar o modo de operação... +STR_1018 :Impossível fazer alterações... +STR_1019 :Impossível fazer alterações... +STR_1020 :Impossível fazer alterações... +STR_1021 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_1022 :{POP16}{POP16}{POP16}{COMMA16} carro por trem +STR_1023 :{POP16}{POP16}{POP16}{COMMA16} carros por trens +STR_1024 :{COMMA16} carro por trem +STR_1025 :{COMMA16} carros por trens +STR_1026 :Plataforma da estação é muito longa! +STR_1027 :{SMALLFONT}{BLACK}Localizar isto na Visão Principal +STR_1028 :Fora da borada do mapa! +STR_1029 :Cannot build partly above and partly below water! +STR_1030 :Can only build this underwater! +STR_1031 :Can't build this underwater! +STR_1032 :Can only build this on water! +STR_1033 :Can only build this above ground! +STR_1034 :Can only build this on land! +STR_1035 :Local authority won't allow construction above tree-height! +STR_1036 :Carregar Jogo +STR_1037 :Load Landscape +STR_1038 :Converter jogo salvo em cenário +STR_1039 :Install new track design +STR_1040 :Salvar Jogo +STR_1041 :Salvar Cenário +STR_1042 :Save Landscape +STR_1043 :RollerCoaster Tycoon 2 Jogo Salvo +STR_1044 :RollerCoaster Tycoon 2 Arquivo de Cenário +STR_1045 :RollerCoaster Tycoon 2 Landscape File +STR_1046 :RollerCoaster Tycoon 2 Arquivo de Projeto da Pista +STR_1047 :Salvar o jogo falhou! +STR_1048 :Salvar o cenário falhou! +STR_1049 :Landscape save failed! +STR_1050 :Carregar o jogo falhou...{NEWLINE}Arquivo contém dados inválidos! +STR_1051 :Suportes Invisíveis +STR_1052 :Pessoas Invisíveis +STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park +STR_1054 :{SMALLFONT}{BLACK}Name ride/attraction +STR_1055 :{SMALLFONT}{BLACK}Name person +STR_1056 :{SMALLFONT}{BLACK}Name staff member +STR_1057 :Ride/attraction name +STR_1058 :Digite o novo nome para esta atração: +STR_1059 :Impossível renomear a atração... +STR_1060 :Inválido nome para a atração +STR_1061 :Modo normal +STR_1062 :Modo de circuito contínuo +STR_1063 :Reverse-Incline launched shuttle mode +STR_1064 :Lançamento alimentado* +STR_1065 :Shuttle mode +STR_1066 :Boat hire mode +STR_1067 :Upward launch +STR_1068 :Rotating lift mode +STR_1069 :Station to station mode +STR_1070 :Single ride per admission +STR_1071 :Unlimited rides per admission +STR_1072 :Modo de labirinto +STR_1073 :Modo de corrida +STR_1074 :Modo de Bumper-car +STR_1075 :Modo de Balanço +STR_1076 :Modo de lojas e barraca +STR_1077 :Modo de Rotação +STR_1078 :Rotação para frente +STR_1079 :Rotação para trás +STR_1080 :Film: {ENDQUOTES}Avenging aviators{ENDQUOTES} +STR_1081 :3D film: {ENDQUOTES}Mouse tails{ENDQUOTES} +STR_1082 :Space rings mode +STR_1083 :Beginners mode +STR_1084 :LIM-powered launch +STR_1085 :Film: {ENDQUOTES}Thrill riders{ENDQUOTES} +STR_1086 :Filme em 3D: {ENDQUOTES}Caçadores de tempestades{ENDQUOTES} +STR_1087 :Filme em 3D: {ENDQUOTES}Space raiders*{ENDQUOTES} +STR_1088 :Intense mode +STR_1089 :Berserk mode +STR_1090 :Haunted house mode +STR_1091 :Circus show mode +STR_1092 :Downward launch +STR_1093 :Crooked house mode +STR_1094 :Freefall drop mode +STR_1095 :Continuous circuit block sectioned mode +STR_1096 :Powered launch +STR_1097 :Powered launch block sectioned mode +STR_1098 :Moving to end of {POP16}{STRINGID} +STR_1099 :Waiting for passengers at {POP16}{STRINGID} +STR_1100 :Waiting to depart {POP16}{STRINGID} +STR_1101 :Departing {POP16}{STRINGID} +STR_1102 :Traveling at {VELOCITY} +STR_1103 :Arriving at {POP16}{STRINGID} +STR_1104 :Unloading passengers at {POP16}{STRINGID} +STR_1105 :Traveling at {VELOCITY} +STR_1106 :Falhando! +STR_1107 :Quebrado! +STR_1108 :Traveling at {VELOCITY} +STR_1109 :Balançando +STR_1110 :Rotacionando +STR_1111 :Rotacionando +STR_1112 :Operando +STR_1113 :Mostrando filme +STR_1114 :Rotacionando +STR_1115 :Operando +STR_1116 :Operando +STR_1117 :Doing circus show +STR_1118 :Operando +STR_1119 :Waiting for cable lift +STR_1120 :Traveling at {VELOCITY} +STR_1121 :Terminando +STR_1122 :Aguardando passageiros +STR_1123 :Aguardando para iniciar +STR_1124 :Começando +STR_1125 :Operando +STR_1126 :Terminando +STR_1127 :Desembarcando passageiros +STR_1128 :Parado pelo bloco dos freios +STR_1129 :Todos os veículos com as mesmas cores +STR_1130 :Diferentes cores por {STRINGID} +STR_1131 :Diferentes cores por veículos +STR_1132 :Veículo {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1133 :Veículo {POP16}{COMMA16} +STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} +STR_1135 :{STRINGID} {COMMA16} +STR_1136 :{SMALLFONT}{BLACK}Selecione a cor principal +STR_1137 :{SMALLFONT}{BLACK}Selecione a cor adicional 1 +STR_1138 :{SMALLFONT}{BLACK}Selecione a cor adicional 2 +STR_1139 :{SMALLFONT}{BLACK}Selecione a cor do suporte das estruturas +STR_1140 :{SMALLFONT}{BLACK}Selecione a opção do esquema de cor do veículo +STR_1141 :{SMALLFONT}{BLACK}Selecione o veiculo/Trem para modificar +STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} +STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} +STR_1144 :Can't build/move entrance for this ride/attraction... +STR_1145 :Can't build/move exit for this ride/attraction... +STR_1146 :Entrance not yet built +STR_1147 :Exit not yet built +STR_1148 :Um quarto de carga +STR_1149 :Metade de carga* +STR_1150 :três quartos de carga* +STR_1151 :Carga total* +STR_1152 :Qualquer carga* +STR_1153 :Height Marks on Ride Tracks +STR_1154 :Height Marks on Land +STR_1155 :Height Marks on Paths +STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} +STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} +STR_1158 :Impossível remover isto... +STR_1159 :{SMALLFONT}{BLACK}Coloque cenários, jardins, e outros acessórios +STR_1160 :{SMALLFONT}{BLACK}Criar/ajustar lagos e água +STR_1161 :Can't position this here... +STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} +STR_1163 :{STRINGID}{NEWLINE}(Right-Click to Modify) +STR_1164 :{STRINGID}{NEWLINE}(Right-Click to Remove) +STR_1165 :{STRINGID} - {STRINGID} {COMMA16} +STR_1166 :Impossível diminuir o nível da água aqui... +STR_1167 :Impossível aumentar o nível da água aqui... +STR_1168 :Opções +STR_1169 :(None) +STR_1170 :{STRING} +STR_1171 :{RED}Fechado - - +STR_1172 :{YELLOW}{STRINGID} - - +STR_1173 :{SMALLFONT}{BLACK}Build footpaths and queue lines +STR_1174 :Banner sign in the way +STR_1175 :Can't build this on sloped footpath +STR_1176 :Can't build footpath here... +STR_1177 :Can't remove footpath from here... +STR_1178 :Land slope unsuitable +STR_1179 :Footpath in the way +STR_1180 :Can't build this underwater! +STR_1181 :Footpaths +STR_1182 :Type +STR_1183 :Direction +STR_1184 :Slope +STR_1185 :{SMALLFONT}{BLACK}Direction +STR_1186 :{SMALLFONT}{BLACK}Slope down +STR_1187 :{SMALLFONT}{BLACK}Level +STR_1188 :{SMALLFONT}{BLACK}Slope up +STR_1189 :{SMALLFONT}{BLACK}Construct the selected footpath section +STR_1190 :{SMALLFONT}{BLACK}Remove previous footpath section +STR_1191 :{BLACK}{STRINGID} +STR_1192 :{OUTLINE}{RED}{STRINGID} +STR_1193 :{WINDOW_COLOUR_2}{STRINGID} +STR_1194 :Fechado +STR_1195 :Executar teste* +STR_1196 :Aberto +STR_1197 :Enguiçou +STR_1198 :Quebrado! +STR_1199 :{COMMA16} person on ride +STR_1200 :{COMMA16} people on ride +STR_1201 :Nobody in queue line +STR_1202 :1 person in queue line +STR_1203 :{COMMA16} people in queue line +STR_1204 :{COMMA16} minute queue time +STR_1205 :{COMMA16} minutes queue time +STR_1206 :{WINDOW_COLOUR_2}Wait for: +STR_1207 :{WINDOW_COLOUR_2}Leave if another train arrives at station +STR_1208 :{WINDOW_COLOUR_2}Leave if another boat arrives at station +STR_1209 :{SMALLFONT}{BLACK}Select whether should wait for passengers before departing +STR_1210 :{SMALLFONT}{BLACK}Select whether should leave if another vehicle arrives at the same station +STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time: +STR_1212 :{WINDOW_COLOUR_2}Maximum waiting time: +STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing +STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing +STR_1215 :{WINDOW_COLOUR_2}Synchronize with adjacent stations +STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronize departure with all adjacent stations (for 'racing') +STR_1217 :{COMMA16} seconds +STR_1218 :{BLACK}{SMALLUP} +STR_1219 :{BLACK}{SMALLDOWN} +STR_1220 :Somente Saida +STR_1221 :No entrance* +STR_1222 :No exit* +STR_1223 :{SMALLFONT}{BLACK}Atrações de Transporte +STR_1224 :{SMALLFONT}{BLACK}Atrações Suaves/Calmas +STR_1225 :{SMALLFONT}{BLACK}Montanhas-Russas +STR_1226 :{SMALLFONT}{BLACK}Atrações Emocionantes +STR_1227 :{SMALLFONT}{BLACK}Atrações Aquáticas +STR_1228 :{SMALLFONT}{BLACK}Lojas, Barracas & Stands* +STR_1229 :trem +STR_1230 :trens +STR_1231 :Trem +STR_1232 :Trens +STR_1233 :{COMMA16} trem +STR_1234 :{COMMA16} trens +STR_1235 :Trem {COMMA16} +STR_1236 :barco +STR_1237 :barcos +STR_1238 :Barco +STR_1239 :Barcos +STR_1240 :{COMMA16} barco +STR_1241 :{COMMA16} barcos +STR_1242 :Barco {COMMA16} +STR_1243 :pista +STR_1244 :pistas +STR_1245 :Pista +STR_1246 :Pistas +STR_1247 :{COMMA16} pista +STR_1248 :{COMMA16} pistas +STR_1249 :Pista {COMMA16} +STR_1250 :plataforma de atracação +STR_1251 :plataformas de atracação +STR_1252 :Plataforma de atracação +STR_1253 :Plataformas de atracação +STR_1254 :{COMMA16} plataforma de atracação +STR_1255 :{COMMA16} plataformas de atracação +STR_1256 :Plataforma de atracação {COMMA16} +STR_1257 :estação +STR_1258 :estações +STR_1259 :Estação +STR_1260 :Estações +STR_1261 :{COMMA16} estação +STR_1262 :{COMMA16} estações +STR_1263 :Estação {COMMA16} +STR_1264 :carro +STR_1265 :carros +STR_1266 :Carro +STR_1267 :Carros +STR_1268 :{COMMA16} carro +STR_1269 :{COMMA16} carros +STR_1270 :Carro {COMMA16} +STR_1271 :construção +STR_1272 :construções +STR_1273 :Construção +STR_1274 :Construções +STR_1275 :{COMMA16} construção +STR_1276 :{COMMA16} construções +STR_1277 :Construção {COMMA16} +STR_1278 :estrutura +STR_1279 :estruturas +STR_1280 :Estrutura +STR_1281 :Estruturas +STR_1282 :{COMMA16} estrutura +STR_1283 :{COMMA16} estruturas +STR_1284 :Estrutura {COMMA16} +STR_1285 :navio +STR_1286 :navios +STR_1287 :Navio +STR_1288 :Navios +STR_1289 :{COMMA16} navio +STR_1290 :{COMMA16} navios +STR_1291 :Navio {COMMA16} +STR_1292 :cabine +STR_1293 :cabines +STR_1294 :Cabine +STR_1295 :Cabines +STR_1296 :{COMMA16} cabine +STR_1297 :{COMMA16} cabines +STR_1298 :Cabine {COMMA16} +STR_1299 :roda +STR_1300 :rodas +STR_1301 :Roda +STR_1302 :Rodas +STR_1303 :{COMMA16} roda +STR_1304 :{COMMA16} rodas +STR_1305 :Roda {COMMA16} +STR_1306 :anel +STR_1307 :anéis +STR_1308 :Anel +STR_1309 :Anéis +STR_1310 :{COMMA16} anel +STR_1311 :{COMMA16} anéis +STR_1312 :Anel {COMMA16} +STR_1313 :jogador +STR_1314 :jogadores +STR_1315 :Jogador +STR_1316 :Jogadores +STR_1317 :{COMMA16} jogador +STR_1318 :{COMMA16} jogadores +STR_1319 :Jogador {COMMA16} +STR_1320 :curso +STR_1321 :cursos +STR_1322 :Curso +STR_1323 :Cursos +STR_1324 :{COMMA16} curso +STR_1325 :{COMMA16} cursos +STR_1326 :Curso {COMMA16} +STR_1327 :{SMALLFONT}{BLACK}Rotacionar objetos em 90{DEGREE} +STR_1328 :Nível da terra necessário +STR_1329 :{WINDOW_COLOUR_2}Velocidade de lançamento: +STR_1330 :{SMALLFONT}{BLACK}Velocidade máxima quando sair da estação +STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_1332 :{VELOCITY} +STR_1333 :{STRINGID} - {STRINGID}{POP16} +STR_1334 :{STRINGID} - {STRINGID} {COMMA16} +STR_1335 :{STRINGID} - Entrada{POP16}{POP16} +STR_1336 :{STRINGID} - Estação* {POP16}{COMMA16} Entrada* +STR_1337 :{STRINGID} - Saida{POP16}{POP16} +STR_1338 :{STRINGID} - Estação* {POP16}{COMMA16} Saida* +STR_1339 :{BLACK}Nenhum resultado de teste ainda... +STR_1340 :{WINDOW_COLOUR_2}Max. speed: {BLACK}{VELOCITY} +STR_1341 :{WINDOW_COLOUR_2}Ride time: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1342 :{DURATION} +STR_1343 :{DURATION} / +STR_1344 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1345 :{LENGTH} +STR_1346 :{LENGTH} / +STR_1347 :{WINDOW_COLOUR_2}Average speed: {BLACK}{VELOCITY} +STR_1348 :{WINDOW_COLOUR_2}Max. positive vertical G's: {BLACK}{COMMA2DP32}g +STR_1349 :{WINDOW_COLOUR_2}Max. positive vertical G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1350 :{WINDOW_COLOUR_2}Max. negative vertical G's: {BLACK}{COMMA2DP32}g +STR_1351 :{WINDOW_COLOUR_2}Max. negative vertical G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1352 :{WINDOW_COLOUR_2}Max. lateral G's: {BLACK}{COMMA2DP32}g +STR_1353 :{WINDOW_COLOUR_2}Max. lateral G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1354 :{WINDOW_COLOUR_2}Highest drop height: {BLACK}{LENGTH} +STR_1355 :{WINDOW_COLOUR_2}Drops: {BLACK}{COMMA16} +STR_1356 :{WINDOW_COLOUR_2}Inversions: {BLACK}{COMMA16} +STR_1357 :{WINDOW_COLOUR_2}Holes: {BLACK}{COMMA16} +STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs +STR_1359 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minute +STR_1360 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minutes +STR_1361 :Can't change speed... +STR_1362 :Can't change launch speed... +STR_1363 :Too high for supports! +STR_1364 :Supports for track above can't be extended any further! +STR_1365 :In-line Twist (left) +STR_1366 :In-line Twist (right) +STR_1367 :Half Loop +STR_1368 :Half Corkscrew (left) +STR_1369 :Half Corkscrew (right) +STR_1370 :Barrel Roll (left) +STR_1371 :Barrel Roll (right) +STR_1372 :Launched Lift Hill +STR_1373 :Large Half Loop (left) +STR_1374 :Large Half Loop (right) +STR_1375 :Upper Transfer +STR_1376 :Lower Transfer +STR_1377 :Heartline Roll (left) +STR_1378 :Heartline Roll (right) +STR_1379 :Reverser (left) +STR_1380 :Reverser (right) +STR_1381 :Curved Lift Hill (left) +STR_1382 :Curved Lift Hill (right) +STR_1383 :Quarter Loop +STR_1384 :{YELLOW}{STRINGID} +STR_1385 :{SMALLFONT}{BLACK}Other track configurations +STR_1386 :Special... +STR_1387 :Can't change land type... +STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} +STR_1389 :{OUTLINE}{RED}- {CURRENCY} +STR_1390 :{CURRENCY2DP} +STR_1391 :{RED}{CURRENCY2DP} +STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction +STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options +STR_1394 :{SMALLFONT}{BLACK}Operating options +STR_1395 :{SMALLFONT}{BLACK}Maintenance options +STR_1396 :{SMALLFONT}{BLACK}Color scheme options +STR_1397 :{SMALLFONT}{BLACK}Sound & music options +STR_1398 :{SMALLFONT}{BLACK}Measurements and test data +STR_1399 :{SMALLFONT}{BLACK}Graphs +STR_1400 :Entrada +STR_1401 :Saida +STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction +STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction +STR_1404 :{SMALLFONT}{BLACK}Rotate 90{DEGREE} +STR_1405 :{SMALLFONT}{BLACK}Mirror image +STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) +STR_1407 :{WINDOW_COLOUR_2}Build this... +STR_1408 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} +STR_1409 :Entry/Exit Platform +STR_1410 :Vertical Tower +STR_1411 :{STRINGID} in the way +STR_1412 :{WINDOW_COLOUR_3}Data logging not available for this type of ride +STR_1413 :{WINDOW_COLOUR_3}Data logging will start when next {STRINGID} leaves {STRINGID} +STR_1414 :{SMALLFONT}{BLACK}{DURATION} +STR_1415 :{WINDOW_COLOUR_2}Velocity +STR_1416 :{WINDOW_COLOUR_2}Altitude +STR_1417 :{WINDOW_COLOUR_2}Vert.G's +STR_1418 :{WINDOW_COLOUR_2}Lat.G's +STR_1419 :{SMALLFONT}{BLACK}{VELOCITY} +STR_1420 :{SMALLFONT}{BLACK}{LENGTH} +STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g +STR_1422 :{SMALLFONT}{BLACK}Logging data from {POP16}{STRINGID} +STR_1423 :{SMALLFONT}{BLACK}Queue line path +STR_1424 :{SMALLFONT}{BLACK}Footpath +STR_1425 :Footpath +STR_1426 :Queue Line +STR_1427 :{WINDOW_COLOUR_2}Customers: {BLACK}{COMMA32} per hour +STR_1428 :{WINDOW_COLOUR_2}Admission price: +STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1430 :Free +STR_1431 :Andando +STR_1432 :Rumo a {STRINGID} +STR_1433 :Filas para {STRINGID} +STR_1434 :Afogando +STR_1435 :Em {STRINGID} +STR_1436 :No {STRINGID} +STR_1437 :Na {STRINGID} +STR_1438 :Sentado +STR_1439 :(selecione o local) +STR_1440 :Cortando grama +STR_1441 :Varrer calçada +STR_1442 :Esvaziando lixeira +STR_1443 :Regando jardins +STR_1444 :Assistindo {STRINGID} +STR_1445 :Assistindo construção de {STRINGID} +STR_1446 :Olhando para paisagem +STR_1447 :Saindo do parque +STR_1448 :Watching new ride being constructed +STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) +STR_1452 :Nome do Visitante +STR_1453 :Digite o nome para este visitante: +STR_1454 :Não é possivel nomear o visitante... +STR_1455 :Nome invalido para o visitante +STR_1456 :{WINDOW_COLOUR_2}Dinheiro gasto: {BLACK}{CURRENCY2DP} +STR_1457 :{WINDOW_COLOUR_2}Dinheiro no bolso: {BLACK}{CURRENCY2DP} +STR_1458 :{WINDOW_COLOUR_2}Tempo no park: {BLACK}{REALTIME} +STR_1459 :Track style +STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track +STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track +STR_1462 :Too steep for lift hill +STR_1463 :Visitantes +STR_1464 :Helix up (small) +STR_1465 :Helix up (large) +STR_1466 :Helix down (small) +STR_1467 :Helix down (large) +STR_1468 :Staff +STR_1469 :Ride must start and end with stations +STR_1470 :Station not long enough +STR_1471 :{WINDOW_COLOUR_2}Speed: +STR_1472 :{SMALLFONT}{BLACK}Velocidade desta atração +STR_1473 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1474 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}Not yet available +STR_1475 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1476 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}Not yet available +STR_1477 :{WINDOW_COLOUR_2}Intensity rating: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) +STR_1478 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1479 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}Not yet available +STR_1480 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} +STR_1481 :{SMALLFONT}{OPENQUOTES}I've spent all my money{ENDQUOTES} +STR_1482 :{SMALLFONT}{OPENQUOTES}I feel sick{ENDQUOTES} +STR_1483 :{SMALLFONT}{OPENQUOTES}I feel very sick{ENDQUOTES} +STR_1484 :{SMALLFONT}{OPENQUOTES}I want to go on something more thrilling than {STRINGID}{ENDQUOTES} +STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} looks too intense for me{ENDQUOTES} +STR_1486 :{SMALLFONT}{OPENQUOTES}I haven't finished my {STRINGID} yet{ENDQUOTES} +STR_1487 :{SMALLFONT}{OPENQUOTES}Just looking at {STRINGID} makes me feel sick{ENDQUOTES} +STR_1488 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to go on {STRINGID}{ENDQUOTES} +STR_1489 :{SMALLFONT}{OPENQUOTES}I want to go home{ENDQUOTES} +STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} is really good value{ENDQUOTES} +STR_1491 :{SMALLFONT}{OPENQUOTES}I've already got {STRINGID}{ENDQUOTES} +STR_1492 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} +STR_1493 :{SMALLFONT}{OPENQUOTES}I'm not hungry{ENDQUOTES} +STR_1494 :{SMALLFONT}{OPENQUOTES}I'm not thirsty{ENDQUOTES} +STR_1495 :{SMALLFONT}{OPENQUOTES}Help! I'm drowning!{ENDQUOTES} +STR_1496 :{SMALLFONT}{OPENQUOTES}I'm lost!{ENDQUOTES} +STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} was great{ENDQUOTES} +STR_1498 :{SMALLFONT}{OPENQUOTES}I've been queuing for {STRINGID} for ages{ENDQUOTES} +STR_1499 :{SMALLFONT}{OPENQUOTES}I'm tired{ENDQUOTES} +STR_1500 :{SMALLFONT}{OPENQUOTES}I'm hungry{ENDQUOTES} +STR_1501 :{SMALLFONT}{OPENQUOTES}I'm thirsty{ENDQUOTES} +STR_1502 :{SMALLFONT}{OPENQUOTES}I need to go to the bathroom{ENDQUOTES} +STR_1503 :{SMALLFONT}{OPENQUOTES}I can't find {STRINGID}{ENDQUOTES} +STR_1504 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to use {STRINGID}{ENDQUOTES} +STR_1505 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} while it's raining{ENDQUOTES} +STR_1506 :{SMALLFONT}{OPENQUOTES}The litter here is really bad{ENDQUOTES} +STR_1507 :{SMALLFONT}{OPENQUOTES}I can't find the park exit{ENDQUOTES} +STR_1508 :{SMALLFONT}{OPENQUOTES}I want to get off {STRINGID}{ENDQUOTES} +STR_1509 :{SMALLFONT}{OPENQUOTES}I want to get out of {STRINGID}{ENDQUOTES} +STR_1510 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} - It isn't safe{ENDQUOTES} +STR_1511 :{SMALLFONT}{OPENQUOTES}This path is disgusting{ENDQUOTES} +STR_1512 :{SMALLFONT}{OPENQUOTES}It's too crowded here{ENDQUOTES} +STR_1513 :{SMALLFONT}{OPENQUOTES}The vandalism here is really bad{ENDQUOTES} +STR_1514 :{SMALLFONT}{OPENQUOTES}Great scenery!{ENDQUOTES} +STR_1515 :{SMALLFONT}{OPENQUOTES}This park is really clean and tidy{ENDQUOTES} +STR_1516 :{SMALLFONT}{OPENQUOTES}The jumping fountains are great{ENDQUOTES} +STR_1517 :{SMALLFONT}{OPENQUOTES}The music is nice here{ENDQUOTES} +STR_1518 :{SMALLFONT}{OPENQUOTES}This balloon from {STRINGID} is really good value{ENDQUOTES} +STR_1519 :{SMALLFONT}{OPENQUOTES}This cuddly toy from {STRINGID} is really good value{ENDQUOTES} +STR_1520 :{SMALLFONT}{OPENQUOTES}This park map from {STRINGID} is really good value{ENDQUOTES} +STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} +STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} +STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}These fries from {STRINGID} are really good value{ENDQUOTES} +STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}This cotton candy from {STRINGID} is really good value{ENDQUOTES} +STR_1528 : +STR_1529 : +STR_1530 : +STR_1531 :{SMALLFONT}{OPENQUOTES}This pizza from {STRINGID} is really good value{ENDQUOTES} +STR_1532 : +STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good value{ENDQUOTES} +STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} +STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} +STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}This candy apple from {STRINGID} is really good value{ENDQUOTES} +STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}This donut from {STRINGID} is really good value{ENDQUOTES} +STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} +STR_1541 : +STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} +STR_1543 :{SMALLFONT}{OPENQUOTES}This lemonade from {STRINGID} is really good value{ENDQUOTES} +STR_1544 : +STR_1545 : +STR_1546 : +STR_1547 : +STR_1548 : +STR_1549 : +STR_1550 :{SMALLFONT}{OPENQUOTES}Wow!{ENDQUOTES} +STR_1551 :{SMALLFONT}{OPENQUOTES}I have the strangest feeling someone is watching me{ENDQUOTES} +STR_1552 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a balloon from {STRINGID}{ENDQUOTES} +STR_1553 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cuddly toy from {STRINGID}{ENDQUOTES} +STR_1554 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a park map from {STRINGID}{ENDQUOTES} +STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} +STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} +STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fries from {STRINGID}{ENDQUOTES} +STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for cotton candy from {STRINGID}{ENDQUOTES} +STR_1562 : +STR_1563 : +STR_1564 : +STR_1565 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for pizza from {STRINGID}{ENDQUOTES} +STR_1566 : +STR_1567 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for popcorn from {STRINGID}{ENDQUOTES} +STR_1568 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hot dog from {STRINGID}{ENDQUOTES} +STR_1569 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for tentacle from {STRINGID}{ENDQUOTES} +STR_1570 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hat from {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a candy apple from {STRINGID}{ENDQUOTES} +STR_1572 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a T-shirt from {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a donut from {STRINGID}{ENDQUOTES} +STR_1574 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for coffee from {STRINGID}{ENDQUOTES} +STR_1575 : +STR_1576 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried chicken from {STRINGID}{ENDQUOTES} +STR_1577 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for lemonade from {STRINGID}{ENDQUOTES} +STR_1578 : +STR_1579 : +STR_1580 : +STR_1581 : +STR_1582 : +STR_1583 : +STR_1584 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1585 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1586 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1587 :{SMALLFONT}{OPENQUOTES}This pretzel from {STRINGID} is really good value{ENDQUOTES} +STR_1588 :{SMALLFONT}{OPENQUOTES}This hot chocolate from {STRINGID} is really good value{ENDQUOTES} +STR_1589 :{SMALLFONT}{OPENQUOTES}This iced tea from {STRINGID} is really good value{ENDQUOTES} +STR_1590 :{SMALLFONT}{OPENQUOTES}This funnel cake from {STRINGID} is really good value{ENDQUOTES} +STR_1591 :{SMALLFONT}{OPENQUOTES}These sunglasses from {STRINGID} are really good value{ENDQUOTES} +STR_1592 :{SMALLFONT}{OPENQUOTES}These beef noodles from {STRINGID} are really good value{ENDQUOTES} +STR_1593 :{SMALLFONT}{OPENQUOTES}These fried rice noodles from {STRINGID} are really good value{ENDQUOTES} +STR_1594 :{SMALLFONT}{OPENQUOTES}This wonton soup from {STRINGID} is really good value{ENDQUOTES} +STR_1595 :{SMALLFONT}{OPENQUOTES}This meatball soup from {STRINGID} is really good value{ENDQUOTES} +STR_1596 :{SMALLFONT}{OPENQUOTES}This fruit juice from {STRINGID} is really good value{ENDQUOTES} +STR_1597 :{SMALLFONT}{OPENQUOTES}This soybean milk from {STRINGID} is really good value{ENDQUOTES} +STR_1598 :{SMALLFONT}{OPENQUOTES}This sujongkwa from {STRINGID} is really good value{ENDQUOTES} +STR_1599 :{SMALLFONT}{OPENQUOTES}This sub sandwich from {STRINGID} is really good value{ENDQUOTES} +STR_1600 :{SMALLFONT}{OPENQUOTES}This cookie from {STRINGID} is really good value{ENDQUOTES} +STR_1601 : +STR_1602 : +STR_1603 : +STR_1604 :{SMALLFONT}{OPENQUOTES}This roast sausage from {STRINGID} are really good value{ENDQUOTES} +STR_1605 : +STR_1606 : +STR_1607 : +STR_1608 : +STR_1609 : +STR_1610 : +STR_1611 : +STR_1612 : +STR_1613 : +STR_1614 : +STR_1615 : +STR_1616 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1617 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1618 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1619 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a pretzel from {STRINGID}{ENDQUOTES} +STR_1620 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for hot chocolate from {STRINGID}{ENDQUOTES} +STR_1621 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for iced tea from {STRINGID}{ENDQUOTES} +STR_1622 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a funnel cake from {STRINGID}{ENDQUOTES} +STR_1623 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sunglasses from {STRINGID}{ENDQUOTES} +STR_1624 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for beef noodles from {STRINGID}{ENDQUOTES} +STR_1625 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried rice noodles from {STRINGID}{ENDQUOTES} +STR_1626 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for wonton soup from {STRINGID}{ENDQUOTES} +STR_1627 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for meatball soup from {STRINGID}{ENDQUOTES} +STR_1628 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fruit juice from {STRINGID}{ENDQUOTES} +STR_1629 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for soybean milk from {STRINGID}{ENDQUOTES} +STR_1630 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sujongkwa from {STRINGID}{ENDQUOTES} +STR_1631 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a sub sandwich from {STRINGID}{ENDQUOTES} +STR_1632 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cookie from {STRINGID}{ENDQUOTES} +STR_1633 : +STR_1634 : +STR_1635 : +STR_1636 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a roast sausage from {STRINGID}{ENDQUOTES} +STR_1637 : +STR_1638 : +STR_1639 : +STR_1640 : +STR_1641 : +STR_1642 : +STR_1643 : +STR_1644 : +STR_1645 : +STR_1646 : +STR_1647 : +STR_1648 :{SMALLFONT}{OPENQUOTES}Help! Put me down!{ENDQUOTES} +STR_1649 :{SMALLFONT}{OPENQUOTES}I'm running out of cash!{ENDQUOTES} +STR_1650 :{SMALLFONT}{OPENQUOTES}Wow! A new ride being built!{ENDQUOTES} +STR_1651 :{SMALLFONT}{OPENQUOTES}Nice ride! But not as good as the Phoenix...{ENDQUOTES} +STR_1652 :{SMALLFONT}{OPENQUOTES}I'm so excited - It's an Intamin ride!{ENDQUOTES} +STR_1653 :{SMALLFONT}{OPENQUOTES}...and here we are on {STRINGID}!{ENDQUOTES} +STR_1654 :{WINDOW_COLOUR_2}Recent thoughts: +STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land +STR_1656 :{SMALLFONT}{BLACK}Construct bridge or tunnel footpath +STR_1657 :{WINDOW_COLOUR_2}Atração preferida +STR_1658 :{WINDOW_COLOUR_2}intensidade: {BLACK}menor que {COMMA16} +STR_1659 :{WINDOW_COLOUR_2}intensidade: {BLACK}entre {COMMA16} e {COMMA16} +STR_1660 :{WINDOW_COLOUR_2}intensidade: {BLACK}maior que {COMMA16} +STR_1661 :{WINDOW_COLOUR_2}Tolerância à náuseas: {BLACK}{STRINGID} +STR_1662 :{WINDOW_COLOUR_2}Felicidade: +STR_1663 :{WINDOW_COLOUR_2}Náusea: +STR_1664 :{WINDOW_COLOUR_2}Energia: +STR_1665 :{WINDOW_COLOUR_2}Fome: +STR_1666 :{WINDOW_COLOUR_2}Sede: +STR_1667 :{WINDOW_COLOUR_2}Banheiro: +STR_1668 :{WINDOW_COLOUR_2}Satisfação: {BLACK}Desconhecido +STR_1669 :{WINDOW_COLOUR_2}Satisfação: {BLACK}{COMMA16}% +STR_1670 :{WINDOW_COLOUR_2}Total de clientes: {BLACK}{COMMA32} +STR_1671 :{WINDOW_COLOUR_2}Lucro total: {BLACK}{CURRENCY2DP} +STR_1672 :Freios +STR_1673 :Spinning Control Toggle Track +STR_1674 :Brake speed +STR_1675 :{POP16}{VELOCITY} +STR_1676 :{SMALLFONT}{BLACK}Set speed limit for brakes +STR_1677 :{WINDOW_COLOUR_2}Popularidade: {BLACK}Desconhecido +STR_1678 :{WINDOW_COLOUR_2}Popularidade: {BLACK}{COMMA16}% +STR_1679 :Hélice Cima (esquerda)* +STR_1680 :Hélice Cima (direita)* +STR_1681 :Hélice Baixo (esqueda)* +STR_1682 :Hélice Baixo (direita)* +STR_1683 :Base size 2 x 2 +STR_1684 :Base size 4 x 4 +STR_1685 :Base size 2 x 4 +STR_1686 :Base size 5 x 1 +STR_1687 :Water splash +STR_1688 :Base size 4 x 1 +STR_1689 :Block brakes +STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} +STR_1691 :{WINDOW_COLOUR_2} Cost: {BLACK}{CURRENCY} +STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY} +STR_1693 :{SMALLFONT}{BLACK}Visitantes +STR_1694 :{SMALLFONT}{BLACK}Funcionários +STR_1695 :{SMALLFONT}{BLACK}Rendimentos e gastos* +STR_1696 :{SMALLFONT}{BLACK}Informação para os clientes* +STR_1697 :Cannot place these on queue line area +STR_1698 :Can only place these on queue area +STR_1699 :Muitas pessoas no jogo +STR_1700 :Contratar novo Faz-Tudo* +STR_1701 :Contratar novo Mecânico* +STR_1702 :Contratar novo Segurança* +STR_1703 :Contratar novo Animador* +STR_1704 :Impossível contratar novos funcionários... +STR_1705 :{SMALLFONT}{BLACK}Demitir este funcionário +STR_1706 :{SMALLFONT}{BLACK}Move this person to a new location +STR_1707 :Muitos funcionários no jogo +STR_1708 :{SMALLFONT}{BLACK}Set patrol area for this staff member +STR_1709 :Demitir funcionário +STR_1710 :Sim +STR_1711 :{WINDOW_COLOUR_1}Are you sure you want to sack {STRINGID}? +STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Varrer calçadas +STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Regar jardins +STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Esvaziar lixeiras +STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Cortar Gramas +STR_1716 :Nome invalido para o park +STR_1717 :Impossível renomear o park... +STR_1718 :Nome do Parque +STR_1719 :Digite o nome para o parque: +STR_1720 :{SMALLFONT}{BLACK}Nome do parque +STR_1721 :Park fechado +STR_1722 :Park aberto +STR_1723 :Impossível abrir o park... +STR_1724 :Impossível fechar o park... +STR_1725 :Impossível comprar Can't buy região... +STR_1726 :Região não está a venda! +STR_1727 :Construction rights not for sale! +STR_1728 :Can't buy construction rights here... +STR_1729 :Land not owned by park! +STR_1730 :{RED}Fechado - - +STR_1731 :{WHITE}{STRINGID} - - +STR_1732 :Construir +STR_1733 :Modo +STR_1734 :{WINDOW_COLOUR_2}Number of laps: +STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit +STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1737 :{COMMA16} +STR_1738 :Can't change number of laps... +STR_1739 :Corrida ganha pelo visitante {INT32} +STR_1740 :Corrida ganha por {STRINGID} +STR_1741 :Ainda não construido! +STR_1742 :{WINDOW_COLOUR_2}Max. people on ride: +STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this ride at one time +STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1745 :{COMMA16} +STR_1746 :Can't change this... +STR_1747 :{WINDOW_COLOUR_2}Time limit: +STR_1748 :{SMALLFONT}{BLACK}Time limit for ride +STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} +STR_1750 :{DURATION} +STR_1751 :Can't change time limit for ride... +STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park +STR_1753 :{SMALLFONT}{BLACK}Show summarized list of guests in park +STR_1754 :{BLACK}{COMMA16} visitantes +STR_1755 :{BLACK}{COMMA16} visitante +STR_1756 :{WINDOW_COLOUR_2}Preço de entrada: +STR_1757 :{WINDOW_COLOUR_2}confiabilidade: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1758 :{SMALLFONT}{BLACK}Modo de construção +STR_1759 :{SMALLFONT}{BLACK}Modo de movimentação +STR_1760 :{SMALLFONT}{BLACK}Modo de Preenchimento +STR_1761 :{SMALLFONT}{BLACK}Construir labirinto nessa direção +STR_1762 :Cachoeiras +STR_1763 :Rapids +STR_1764 :Log Bumps +STR_1765 :On-ride photo section +STR_1766 :Reverser turntable +STR_1767 :Spinning tunnel +STR_1768 :Can't change number of swings... +STR_1769 :{WINDOW_COLOUR_2}Number of swings: +STR_1770 :{SMALLFONT}{BLACK}Number of complete swings +STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1772 :{COMMA16} +STR_1773 :Only one on-ride photo section allowed per ride +STR_1774 :Only one cable lift hill allowed per ride +STR_1775 :Desligado +STR_1776 :Ligado +STR_1777 :{WINDOW_COLOUR_2}Música: +STR_1778 :{STRINGID} - - +STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Fantasia de panda +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Fantasia de tigre +STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Fantasia de elefante +STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Fantasia de romano +STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Fantasia de gorila +STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Fantasia de boneco de neve +STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Fantasia de cavaleiro +STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Fantasia de astronauta +STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Fantasia de bandido +STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Fantasia de xerife +STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Fantasia de pirata +STR_1790 :{SMALLFONT}{BLACK}Selecione a cor do uniforme para este tipo de equipe +STR_1791 :{WINDOW_COLOUR_2}Cor do uniforme: +STR_1792 :Respondendo a chamada de quebra da {STRINGID}* +STR_1793 :Rumo ao {STRINGID} para uma inspecção* +STR_1794 :Reparando a {STRINGID}* +STR_1795 :Respondendo a chamada do rádio +STR_1796 :Esta quebrado e requer conserto +STR_1797 :Esta opção não pode ser alterada para esta atração +STR_1798 :Turbilhão +STR_1799 :{POP16}{POP16}{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1800 :Segurança cortada* +STR_1801 :Restrições presas fechadas* +STR_1802 :Restrições presas abertas* +STR_1803 :Portas emperradas fechadas +STR_1804 :Portas emperradas abertas +STR_1805 :Veículo em mal funcionamento +STR_1806 :Falha nos freios* +STR_1807 :Falha nos controles* +STR_1808 :{WINDOW_COLOUR_2}Última quebra: {BLACK}{STRINGID} +STR_1809 :{WINDOW_COLOUR_2}Atualmente quebrado: {OUTLINE}{RED}{STRINGID} +STR_1810 :{WINDOW_COLOUR_2}Transportando: +STR_1811 :Impossível construir isto aqui... +STR_1812 :{SMALLFONT}{BLACK}{STRINGID} +STR_1813 :Objetos váriados* +STR_1814 :Ações +STR_1815 :Pensamentos +STR_1816 :{SMALLFONT}{BLACK}Selecione o tipo de informação para mostrar na lista de visitantes +STR_1817 :({COMMA16}) +STR_1818 :{WINDOW_COLOUR_2}Todos os visitantes +STR_1819 :{WINDOW_COLOUR_2}Todos os visitantes (resumido) +STR_1820 :{WINDOW_COLOUR_2}Visitantes {STRINGID} +STR_1821 :{WINDOW_COLOUR_2}Pensamentos dos visitantes* {STRINGID} +STR_1822 :{WINDOW_COLOUR_2}Visistantes pensam sobre* {POP16}{STRINGID} +STR_1823 :{SMALLFONT}{BLACK}Mostrar os pensamentos dos visitantes sobre essa atração +STR_1824 :{SMALLFONT}{BLACK}Mostrar os visitantes nesta atração* +STR_1825 :{SMALLFONT}{BLACK}Mostrar os visitantes na fila para essa atração* +STR_1826 :Estado +STR_1827 :Popularidade +STR_1828 :Satisfação +STR_1829 :Lucro +STR_1830 :Tamanho da fila +STR_1831 :Tempo na fila +STR_1832 :Confiança +STR_1833 :Tempo ocioso +STR_1834 :Visistante favorito +STR_1835 :Popularidade: Desconhecido +STR_1836 :Popularidade: {COMMA16}% +STR_1837 :Satisfação: Desconhecido +STR_1838 :Satisfação: {COMMA16}% +STR_1839 :Confiança: {COMMA16}% +STR_1840 :Tempo ocioso: {COMMA16}% +STR_1841 :Lucro: {CURRENCY} por hora +STR_1842 :Favorito de: {COMMA16} visitante* +STR_1843 :Favorito de: {COMMA16} visitantes +STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list +STR_1845 :{MONTHYEAR} +STR_1846 :{COMMA16} Visitantes +STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} Visitantes +STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} Visitantes +STR_1849 :{WINDOW_COLOUR_2}Tocar musica +STR_1850 :{SMALLFONT}{BLACK}Selecione a música que deve ser tocada nesta atração +STR_1851 :{WINDOW_COLOUR_2}Custos de funcionamento: {BLACK}{CURRENCY2DP} por hora +STR_1852 :{WINDOW_COLOUR_2}Custos de funcionamento: {BLACK}desconhecido +STR_1853 :{WINDOW_COLOUR_2}Construído: {BLACK}Este Ano +STR_1854 :{WINDOW_COLOUR_2}Construído: {BLACK}Ano Passado +STR_1855 :{WINDOW_COLOUR_2}Construído: {BLACK}{COMMA16} Anos atrás +STR_1856 :{WINDOW_COLOUR_2}Lucro por item vendido: {BLACK}{CURRENCY2DP} +STR_1857 :{WINDOW_COLOUR_2}Prejuízo por item vendido: {BLACK}{CURRENCY2DP} +STR_1858 :{WINDOW_COLOUR_2}Custo: {BLACK}{CURRENCY} por mês +STR_1859 :Faz-Tudo +STR_1860 :Mecânicos +STR_1861 :Seguranças +STR_1862 :Animadores +STR_1863 :Faz-Tudo +STR_1864 :Mecânico +STR_1865 :Segurança +STR_1866 :Animador +STR_1867 :{BLACK}{COMMA16} {STRINGID} +STR_1868 :Impossível alterar o numero de rotações... +STR_1869 :{WINDOW_COLOUR_2}Número de rotações: +STR_1870 :{SMALLFONT}{BLACK}Número de rotações completas +STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1872 :{COMMA16} +STR_1873 :{WINDOW_COLOUR_2}Rendimento: {BLACK}{CURRENCY} por hora +STR_1874 :{WINDOW_COLOUR_2}Lucro: {BLACK}{CURRENCY} por hora +STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} +STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspecionar Atrações +STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Consertar Atrações +STR_1878 :{WINDOW_COLOUR_2}Inspeção: +STR_1879 :A cada 10 minutos +STR_1880 :A cada 20 minutos +STR_1881 :A cada 30 minutos +STR_1882 :A cada 45 minutos +STR_1883 :A cada hora +STR_1884 :A cada 2 horas +STR_1885 :Numca +STR_1886 :Inspecionando {STRINGID} +STR_1887 :{WINDOW_COLOUR_2}Tempo desde a última inspeção: {BLACK}{COMMA16} minutos +STR_1888 :{WINDOW_COLOUR_2}Tempo desde a última inspeção: {BLACK}mais de 4 horas +STR_1889 :{WINDOW_COLOUR_2}Tempo ocioso: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1890 :{SMALLFONT}{BLACK}Selecione a frequência com um mecânico deve verificar esta atração +STR_1891 :No {STRINGID} no parque ainda!* +STR_1892 :RollerCoaster Tycoon 2 +STR_1893 :Por favor, insira o CD RollerCoaster Tycoon 2 na seguinte unidade: +STR_1894 :{WINDOW_COLOUR_2}{STRINGID} vendido: {BLACK}{COMMA32} +STR_1895 :{SMALLFONT}{BLACK}Construir uma nova atração +STR_1896 :{WINDOW_COLOUR_2}Receitas/Despesas +STR_1897 :{WINDOW_COLOUR_2}Construção das atrações +STR_1898 :{WINDOW_COLOUR_2}Custos de funcionamento das atrações +STR_1899 :{WINDOW_COLOUR_2}A aquisição de terrenos +STR_1900 :{WINDOW_COLOUR_2}Paisagismo* +STR_1901 :{WINDOW_COLOUR_2}Bilhetes da entrada no parque +STR_1902 :{WINDOW_COLOUR_2}Bilhetes das atrações +STR_1903 :{WINDOW_COLOUR_2}Vendas das lojas +STR_1904 :{WINDOW_COLOUR_2}Estoque das lojas +STR_1905 :{WINDOW_COLOUR_2}Vendas de Comidas/Bebidas +STR_1906 :{WINDOW_COLOUR_2}Estoque de Comidas/Bebidas +STR_1907 :{WINDOW_COLOUR_2}Salários dos funcionários +STR_1908 :{WINDOW_COLOUR_2}Marketing +STR_1909 :{WINDOW_COLOUR_2}Pesquisa +STR_1910 :{WINDOW_COLOUR_2}Juros de empréstimos +STR_1911 :{BLACK} de {COMMA16}% ao ano +STR_1912 :{MONTH} +STR_1913 :{BLACK}+{CURRENCY2DP} +STR_1914 :{BLACK}{CURRENCY2DP} +STR_1915 :{RED}{CURRENCY2DP} +STR_1916 :{WINDOW_COLOUR_2}Empréstimo: +STR_1917 :{POP16}{POP16}{POP16}{CURRENCY} +STR_1918 :Não é possivel emprestar mais dinheiro! +STR_1919 :Não possui dinheiro suficiente!* +STR_1920 :Impossível pagar o empréstimo! +STR_1921 :{SMALLFONT}{BLACK}Começar um novo jogo +STR_1922 :{SMALLFONT}{BLACK}Continuar jogando um jogo salvo +STR_1923 :{SMALLFONT}{BLACK}Mostrar Tutoriais +STR_1924 :{SMALLFONT}{BLACK}Sair +STR_1925 :Impossível colocar uma pessoa aqui... +STR_1926 :{SMALLFONT} +STR_1927 :{YELLOW}{STRINGID} Quebrou* +STR_1928 :{RED}{STRINGID} Bateu!* +STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better +STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this guest - (If tracking is on, guest's movements will be reported in the message area) +STR_1931 :{STRINGID} Juntou-se a fila de espera para {STRINGID} +STR_1932 :{STRINGID} está no {STRINGID} +STR_1933 :{STRINGID} está em {STRINGID} +STR_1934 :{STRINGID} saiu {STRINGID} +STR_1935 :{STRINGID} saiu do parque +STR_1936 :{STRINGID} comprou {STRINGID} +STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message +STR_1938 :{SMALLFONT}{BLACK}Show view of guest +STR_1939 :{SMALLFONT}{BLACK}Show view of staff member +STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this guest +STR_1941 :{SMALLFONT}{BLACK}Show which rides this guest has been on +STR_1942 :{SMALLFONT}{BLACK}Show financial information about this guest +STR_1943 :{SMALLFONT}{BLACK}Show guest's recent thoughts +STR_1944 :{SMALLFONT}{BLACK}Show items guest is carrying +STR_1945 :{SMALLFONT}{BLACK}Show orders and options for this staff member +STR_1946 :{SMALLFONT}{BLACK}Select costume for this entertainer +STR_1947 :{SMALLFONT}{BLACK}Show areas patrolled by selected staff type, and locate the nearest staff member +STR_1948 :{SMALLFONT}{BLACK}Hire a new staff member of the selected type +STR_1949 :Resumo Financeiro +STR_1950 :Gráfico Financeiro +STR_1951 :Gráfico do Valor do Parque +STR_1952 :Gráfico dos Lucros +STR_1953 :Marketing +STR_1954 :Financiamento de Pesquisa +STR_1955 :{WINDOW_COLOUR_2}Number of circuits: +STR_1956 :{SMALLFONT}{BLACK}Number of circuits of track per ride +STR_1957 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1958 :{COMMA16} +STR_1959 :Can't change number of circuits... +STR_1960 :{WINDOW_COLOUR_2}Balloon price: +STR_1961 :{WINDOW_COLOUR_2}Cuddly Toy price: +STR_1962 :{WINDOW_COLOUR_2}Park Map price: +STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_1964 :{WINDOW_COLOUR_2}Umbrella price: +STR_1965 :{WINDOW_COLOUR_2}Drink price: +STR_1966 :{WINDOW_COLOUR_2}Burger price: +STR_1967 :{WINDOW_COLOUR_2}Fries price: +STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: +STR_1969 :{WINDOW_COLOUR_2}Cotton Candy price: +STR_1970 :{WINDOW_COLOUR_2} +STR_1971 :{WINDOW_COLOUR_2} +STR_1972 :{WINDOW_COLOUR_2} +STR_1973 :{WINDOW_COLOUR_2}Pizza price: +STR_1974 :{WINDOW_COLOUR_2} +STR_1975 :{WINDOW_COLOUR_2}Popcorn price: +STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: +STR_1977 :{WINDOW_COLOUR_2}Tentacle price: +STR_1978 :{WINDOW_COLOUR_2}Hat price: +STR_1979 :{WINDOW_COLOUR_2}Candy Apple price: +STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: +STR_1981 :{WINDOW_COLOUR_2}Donut price: +STR_1982 :{WINDOW_COLOUR_2}Coffee price: +STR_1983 :{WINDOW_COLOUR_2} +STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: +STR_1985 :{WINDOW_COLOUR_2}Lemonade price: +STR_1986 :{WINDOW_COLOUR_2} +STR_1987 :{WINDOW_COLOUR_2} +STR_1988 :Balão +STR_1989 :Brinquedo de Pelúcia +STR_1990 :Mapa do parque +STR_1991 :On-Ride Photo +STR_1992 :Guarda-Chuva +STR_1993 :Bebida +STR_1994 :hambúrguer +STR_1995 :Batatas Fritas +STR_1996 :Sorvete +STR_1997 :Algodão-Doce +STR_1998 :Lata Vazia +STR_1999 :Lixo +STR_2000 :Caixa de hambúrguer Vazia +STR_2001 :Pizza +STR_2002 :Voucher +STR_2003 :Pipoca +STR_2004 :Cachorro-quente +STR_2005 :Tentáculo +STR_2006 :Chapéu +STR_2007 :Maça do Amor +STR_2008 :Camiseta +STR_2009 :Donut +STR_2010 :Café +STR_2011 :Copo Vazio +STR_2012 :Frango Frito +STR_2013 :Limonada +STR_2014 :Caixa Vazia +STR_2015 :Garrafa Vazia +STR_2016 :Balões +STR_2017 :Brinquedos de Pelúcia +STR_2018 :Mapas do Parque +STR_2019 :Fotos na Atração +STR_2020 :Guarda-Chuvas +STR_2021 :Bebidas +STR_2022 :hambúrguers +STR_2023 :Batatas Fritas +STR_2024 :Sorvetes +STR_2025 :Algodões-Doces +STR_2026 :Latas Vazias +STR_2027 :Lixos +STR_2028 :Caixas de hambúrguer Vazias +STR_2029 :Pizzas +STR_2030 :Vouchers +STR_2031 :Pipocas +STR_2032 :Cachorros-quentes +STR_2033 :Tentáculos +STR_2034 :Chapéus +STR_2035 :Maças do Amor +STR_2036 :Camisetas +STR_2037 :Donuts +STR_2038 :Cafés +STR_2039 :Copos Vazios +STR_2040 :Frangos Fritos +STR_2041 :Limonadas +STR_2042 :Caixas Vazias +STR_2043 :Garrafas Vazias +STR_2044 :um balão +STR_2045 :um brinquedo de pelúcia +STR_2046 :um mapa do parque +STR_2047 :uma foto na atração +STR_2048 :um guarda-chuva +STR_2049 :uma bebida +STR_2050 :um hambúrguer +STR_2051 :alguma batata frita +STR_2052 :um sorvete +STR_2053 :algum algodão-Doce +STR_2054 :uma lata vazia +STR_2055 :algum lixo +STR_2056 :uma caixa de hambúrguer vazia +STR_2057 :uma pizza +STR_2058 :um voucher +STR_2059 :alguma pipoca +STR_2060 :um cachorro-quente +STR_2061 :um tentáculo +STR_2062 :um chapéu +STR_2063 :uma maça do amor +STR_2064 :uma camiseta +STR_2065 :um Donut +STR_2066 :um café +STR_2067 :um copo vazio +STR_2068 :algum frango frito +STR_2069 :alguma limonada +STR_2070 :uma caixa vazia +STR_2071 :uma garafa vazia +STR_2072 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Balão +STR_2073 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Brinquedo de Pelúcia +STR_2074 :Mapa de {STRINGID} +STR_2075 :foto na atração {STRINGID} +STR_2076 :Guarda-Chuva {OPENQUOTES}{STRINGID}{ENDQUOTES} +STR_2077 :Bebida +STR_2078 :Hambúrguer +STR_2079 :Batata Frita +STR_2080 :Sorvete +STR_2081 :Algodão-Doce +STR_2082 :Lata Vazia +STR_2083 :lixo +STR_2084 :Caixa de Hambúrguer Vazia +STR_2085 :Pizza +STR_2086 :Voucher para {STRINGID} +STR_2087 :Pipoca +STR_2088 :Cachorro-Quente +STR_2089 :Tentáculo +STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Chapéu +STR_2091 :Maça do Amor +STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Camiseta +STR_2093 :Donut +STR_2094 :Café +STR_2095 :Copo Vazio +STR_2096 :Frango Frito +STR_2097 :Limonada +STR_2098 :Caixa Vazia +STR_2099 :Garafa Vazia +STR_2100 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2101 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2102 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2103 :{WINDOW_COLOUR_2}Pretzel price: +STR_2104 :{WINDOW_COLOUR_2}Hot Chocolate price: +STR_2105 :{WINDOW_COLOUR_2}Iced Tea price: +STR_2106 :{WINDOW_COLOUR_2}Funnel Cake price: +STR_2107 :{WINDOW_COLOUR_2}Sunglasses price: +STR_2108 :{WINDOW_COLOUR_2}Beef Noodles price: +STR_2109 :{WINDOW_COLOUR_2}Fried Rice Noodles price: +STR_2110 :{WINDOW_COLOUR_2}Wonton Soup price: +STR_2111 :{WINDOW_COLOUR_2}Meatball Soup price: +STR_2112 :{WINDOW_COLOUR_2}Fruit Juice price: +STR_2113 :{WINDOW_COLOUR_2}Soybean Milk price: +STR_2114 :{WINDOW_COLOUR_2}Sujongkwa price: +STR_2115 :{WINDOW_COLOUR_2}Sub Sandwich price: +STR_2116 :{WINDOW_COLOUR_2}Cookie price: +STR_2117 :{WINDOW_COLOUR_2} +STR_2118 :{WINDOW_COLOUR_2} +STR_2119 :{WINDOW_COLOUR_2} +STR_2120 :{WINDOW_COLOUR_2}Roast Sausage price: +STR_2121 :{WINDOW_COLOUR_2} +STR_2122 :On-Ride Photo +STR_2123 :On-Ride Photo +STR_2124 :On-Ride Photo +STR_2125 :Pretzel +STR_2126 :Chocolate Quente +STR_2127 :Chá Gelado +STR_2128 :Funnel Cake +STR_2129 :Óculos de sol +STR_2130 :Beef Noodles +STR_2131 :Fried Rice Noodles +STR_2132 :Wonton Soup +STR_2133 :Meatball Soup +STR_2134 :Suco de fruta +STR_2135 :Soybean Milk +STR_2136 :Sujongkwa +STR_2137 :Sub Sandwich +STR_2138 :Cookie +STR_2139 :Empty Bowl +STR_2140 :Empty Drink Carton +STR_2141 :Empty Juice Cup +STR_2142 :Roast Sausage +STR_2143 :Empty Bowl +STR_2144 :On-Ride Photos +STR_2145 :On-Ride Photos +STR_2146 :On-Ride Photos +STR_2147 :Pretzels +STR_2148 :Hot Chocolates +STR_2149 :Chás Gelados +STR_2150 :Funnel Cakes +STR_2151 :Sunglasses +STR_2152 :Beef Noodles +STR_2153 :Fried Rice Noodles +STR_2154 :Wonton Soups +STR_2155 :Meatball Soups +STR_2156 :Fruit Juices +STR_2157 :Soybean Milks +STR_2158 :Sujongkwa +STR_2159 :Sub Sandwiches +STR_2160 :Cookies +STR_2161 :Empty Bowls +STR_2162 :Empty Drink Cartons +STR_2163 :Empty Juice cups +STR_2164 :Roast Sausages +STR_2165 :Empty Bowls +STR_2166 :an On-Ride Photo +STR_2167 :an On-Ride Photo +STR_2168 :an On-Ride Photo +STR_2169 :a Pretzel +STR_2170 :a Hot Chocolate +STR_2171 :an Iced Tea +STR_2172 :a Funnel Cake +STR_2173 :a pair of Sunglasses +STR_2174 :some Beef Noodles +STR_2175 :some Fried Rice Noodles +STR_2176 :some Wonton Soup +STR_2177 :some Meatball Soup +STR_2178 :a Fruit Juice +STR_2179 :some Soybean Milk +STR_2180 :some Sujongkwa +STR_2181 :a Sub Sandwich +STR_2182 :a Cookie +STR_2183 :an Empty Bowl +STR_2184 :an Empty Drink Carton +STR_2185 :an Empty Juice Cup +STR_2186 :a Roast Sausage +STR_2187 :an Empty Bowl +STR_2188 :On-Ride Photo of {STRINGID} +STR_2189 :On-Ride Photo of {STRINGID} +STR_2190 :On-Ride Photo of {STRINGID} +STR_2191 :Pretzel +STR_2192 :Hot Chocolate +STR_2193 :Iced Tea +STR_2194 :Funnel Cake +STR_2195 :Sunglasses +STR_2196 :Beef Noodles +STR_2197 :Fried Rice Noodles +STR_2198 :Wonton Soup +STR_2199 :Meatball Soup +STR_2200 :Fruit Juice +STR_2201 :Soybean Milk +STR_2202 :Sujongkwa +STR_2203 :Sub Sandwich +STR_2204 :Cookie +STR_2205 :Empty Bowl +STR_2206 :Empty Drink Carton +STR_2207 :Empty Juice Cup +STR_2208 :Roast Sausage +STR_2209 :Empty Bowl +STR_2210 :{SMALLFONT}{BLACK}Show list of Faz-Tudo in park +STR_2211 :{SMALLFONT}{BLACK}Show list of mechanics in park +STR_2212 :{SMALLFONT}{BLACK}Show list of security guards in park +STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park +STR_2214 :Construction not possible while game is paused! +STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) +STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled +STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} +STR_2220 :{WINDOW_COLOUR_2}Classificação do Parque: {BLACK}{COMMA16} +STR_2221 :{SMALLFONT}{BLACK}Classificação do Parque: {COMMA16} +STR_2222 :{SMALLFONT}{BLACK}{STRINGID} +STR_2223 :{WINDOW_COLOUR_2}Visitantes no parque: {BLACK}{COMMA16} +STR_2224 :{WINDOW_COLOUR_2}Dinheiro: {BLACK}{CURRENCY2DP} +STR_2225 :{WINDOW_COLOUR_2}Dinheiro: {RED}{CURRENCY2DP} +STR_2226 :{WINDOW_COLOUR_2}Valor do parque: {BLACK}{CURRENCY} +STR_2227 :{WINDOW_COLOUR_2}Valor da empresa: {BLACK}{CURRENCY} +STR_2228 :{WINDOW_COLOUR_2}Last month's profit from food/drink and{NEWLINE}merchandise sales: {BLACK}{CURRENCY} +STR_2229 :Slope up to vertical +STR_2230 :Vertical track +STR_2231 :Holding brake for drop +STR_2232 :Cable lift hill +STR_2233 :{SMALLFONT}{BLACK}Park information +STR_2234 :Mensagens Recentes +STR_2235 :{SMALLFONT}{STRINGID} {STRINGID} +STR_2236 :Janeiro +STR_2237 :Fevereiro +STR_2238 :Março +STR_2239 :Abril +STR_2240 :Maio +STR_2241 :Junho +STR_2242 :Julho +STR_2243 :Agosto +STR_2244 :Setembro +STR_2245 :Outubro +STR_2246 :Novembro +STR_2247 :Dezembro +STR_2248 :Impossível demolir a atração... +STR_2249 :{BABYBLUE}Nova atração disponível agora:{NEWLINE}{STRINGID} +STR_2250 :{BABYBLUE}Novo Cenário/Tematização disponível agora:{NEWLINE}{STRINGID} +STR_2251 :Somente pode ser construído sobre os caminhos! +STR_2252 :Somente pode ser construído através de caminhos!* +STR_2253 :Atrações de Transporte +STR_2254 :Atrações Suaves/Calmas +STR_2255 :Montanhas-Russas +STR_2256 :Atrações Emocionantes +STR_2257 :Atrações Aquáticas +STR_2258 :Lojas & Barracas +STR_2259 :Cenário & Tematização +STR_2260 :Nenhum financiamento +STR_2261 :Financiamento mínimo +STR_2262 :Financiamento normal +STR_2263 :Financiamento máximo +STR_2264 :Financiamento da pesquisa +STR_2265 :{WINDOW_COLOUR_2}Custo: {BLACK}{CURRENCY} por mês +STR_2266 :Prioridades de pesquisa +STR_2267 :Atualmente em desenvolvimento +STR_2268 :Último desenvolvimento +STR_2269 :{WINDOW_COLOUR_2}Tipo: {BLACK}{STRINGID} +STR_2270 :{WINDOW_COLOUR_2}Progresso: {BLACK}{STRINGID} +STR_2271 :{WINDOW_COLOUR_2}Esperado: {BLACK}{STRINGID} +STR_2272 :{WINDOW_COLOUR_2}Atrações:{NEWLINE}{BLACK}{STRINGID} +STR_2273 :{WINDOW_COLOUR_2}Cenário/tematização:{NEWLINE}{BLACK}{STRINGID} +STR_2274 :{SMALLFONT}{BLACK}Mostrar detalhes desta invenção ou desenvolvimento +STR_2275 :{SMALLFONT}{BLACK}Mostrar financiamento e opções para pesquisa e desenvolvimento +STR_2276 :{SMALLFONT}{BLACK}Mostrar estado das pesquisa e desenvolvimentos +STR_2277 :Desconhecido +STR_2278 :Atrações de Transporte +STR_2279 :Atrações Suaves/Calmas +STR_2280 :Montanhas-Russas +STR_2281 :Atrações Emocionantes +STR_2282 :Atrações Aquáticas +STR_2283 :Lojas/Barracas +STR_2284 :Cenário/Tematização +STR_2285 :Pesquisa Inicial +STR_2286 :Projetando +STR_2287 :Completando Projeto +STR_2288 :Desconhecido +STR_2289 :{STRINGID} {STRINGID} +STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} +STR_2291 :Selecione o cenário para novo jogo +STR_2292 :{WINDOW_COLOUR_2}Rides been on: +STR_2293 :{BLACK} Nada* +STR_2294 :{SMALLFONT}{BLACK}Change base land style +STR_2295 :{SMALLFONT}{BLACK}Change vertical edges of land +STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} paid to enter park +STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} ride +STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} rides +STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} item of food +STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} items of food +STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drink +STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drinks +STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenir +STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenirs +STR_2305 :Track design files +STR_2306 :Save track design +STR_2307 :Select {STRINGID} design +STR_2308 :{STRINGID} Track Designs +STR_2309 :Install New Track Design +STR_2310 :Build custom design +STR_2311 :{WINDOW_COLOUR_2}Classificação de emoção: {BLACK}{COMMA2DP32} (approx.) +STR_2312 :{WINDOW_COLOUR_2}Classificação de intensidade rating: {BLACK}{COMMA2DP32} (approx.) +STR_2313 :{WINDOW_COLOUR_2}Classificação de náuseas: {BLACK}{COMMA2DP32} (approx.) +STR_2314 :{WINDOW_COLOUR_2}Comprimento da atração: {BLACK}{STRINGID} +STR_2315 :{WINDOW_COLOUR_2}Custo: {BLACK}em torno de {CURRENCY} +STR_2316 :{WINDOW_COLOUR_2}Espaço necessário: {BLACK}{COMMA16} x {COMMA16} blocos +STR_2317 :{WINDOW_COLOUR_2}Qualidade do Som: +STR_2318 :Baixo +STR_2319 :Médio +STR_2320 :Alto +STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} +STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} +STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} +STR_2324 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}sq.ft. +STR_2325 :{SMALLFONT}{BLACK}Comprar terreno para extender o parque +STR_2326 :{SMALLFONT}{BLACK}Comprar os direitos de construção para permitir a construção acima ou abaixo da terra fora do parque* +STR_2327 :Opções +STR_2328 :{WINDOW_COLOUR_2}Moeda: +STR_2329 :{WINDOW_COLOUR_2}Distância e Velocidade: +STR_2330 :{WINDOW_COLOUR_2}Temperatura: +STR_2331 :{WINDOW_COLOUR_2}Marcadores Altura: +STR_2332 :Unidades +STR_2333 :Som +STR_2334 :Libras ({POUND}) +STR_2335 :Dolar ($) +STR_2336 :Franco (F) +STR_2337 :Deutschmark (DM) +STR_2338 :Yen ({YEN}) +STR_2339 :Peseta (Pts) +STR_2340 :Lira (L) +STR_2341 :Guilders (Dfl.) +STR_2342 :Krona (kr) +STR_2343 :Euros ({EURO}) +STR_2344 :Imperial +STR_2345 :Métrica +STR_2346 :Exibição +STR_2347 :{RED}{STRINGID} has drowned! +STR_2348 :{SMALLFONT}{BLACK}Mostrar as estatísticas para esse funcionário +STR_2349 :{WINDOW_COLOUR_2}Salário: {BLACK}{CURRENCY} por mês +STR_2350 :{WINDOW_COLOUR_2}Empregado em: {BLACK}{MONTHYEAR} +STR_2351 :{WINDOW_COLOUR_2}Gramados cortados: {BLACK}{COMMA16} +STR_2352 :{WINDOW_COLOUR_2}Jardins regados: {BLACK}{COMMA16} +STR_2353 :{WINDOW_COLOUR_2}Calçadas varridas: {BLACK}{COMMA16} +STR_2354 :{WINDOW_COLOUR_2}Lixeiras esvaziadas: {BLACK}{COMMA16} +STR_2355 :{WINDOW_COLOUR_2}Atrações consertadas: {BLACK}{COMMA16} +STR_2356 :{WINDOW_COLOUR_2}Atrações Inspecionadas: {BLACK}{COMMA16} +STR_2357 :Casa +STR_2358 :Unidades +STR_2359 :Valores Reais +STR_2360 :{WINDOW_COLOUR_2}Resolução de Tela: +STR_2361 :Landscape Smoothing +STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off +STR_2363 :Gridlines on Landscape +STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off +STR_2365 :The bank refuses to increase your loan! +STR_2366 :Celsius ({DEGREE}C) +STR_2367 :Fahrenheit (F) +STR_2368 :Nenhum +STR_2369 :Baixo +STR_2370 :Médio +STR_2371 :Alto +STR_2372 :Baixo +STR_2373 :Médio +STR_2374 :Alto +STR_2375 :Muito alto +STR_2376 :Extremo +STR_2377 :Ultra Extremo +STR_2378 :{SMALLFONT}{BLACK}Adjust smaller area of land +STR_2379 :{SMALLFONT}{BLACK}Adjust larger area of land +STR_2380 :{SMALLFONT}{BLACK}Adjust smaller area of water +STR_2381 :{SMALLFONT}{BLACK}Adjust larger area of water +STR_2382 :Terra +STR_2383 :Água +STR_2384 :{WINDOW_COLOUR_2}Seu objetivo: +STR_2385 :{BLACK}Nenhum +STR_2386 :{BLACK}To have at least {COMMA16} guests in your park at the end of {MONTHYEAR}, with a park rating of at least 600 +STR_2387 :{BLACK}To achieve a park value of at least {POP16}{POP16}{CURRENCY} at the end of {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} +STR_2388 :{BLACK}Have Fun! +STR_2389 :{BLACK}Build the best {STRINGID} you can! +STR_2390 :{BLACK}To have 10 different types of roller coasters operating in your park, each with an excitement value of at least 6.00 +STR_2391 :{BLACK}To have at least {COMMA16} guests in your park. You must not let the park rating drop below 700 at any time! +STR_2392 :{BLACK}To achieve a monthly income from ride tickets of at least {POP16}{POP16}{CURRENCY} +STR_2393 :{BLACK}To have 10 different types of roller coasters operating in your park, each with a minimum length of {LENGTH}, and an excitement rating of at least 7.00 +STR_2394 :{BLACK}To finish building all 5 of the partially built roller coasters in this park, designing them to achieve excitement ratings of at least {POP16}{POP16}{COMMA2DP32} each +STR_2395 :{BLACK}To repay your loan and achieve a park value of at least {POP16}{POP16}{CURRENCY} +STR_2396 :{BLACK}To achieve a monthly profit from food, drink and merchandise sales of at least {POP16}{POP16}{CURRENCY} +STR_2397 :Nenhum +STR_2398 :Number of guests at a given date +STR_2399 :Park value at a given date +STR_2400 :Have fun +STR_2401 :Build the best ride you can +STR_2402 :Build 10 roller coasters +STR_2403 :Number of guests in park +STR_2404 :Monthly income from ride tickets +STR_2405 :Build 10 roller coasters of a given length +STR_2406 :Finish building 5 roller coasters +STR_2407 :Repay loan and achieve a given park value +STR_2408 :Monthly profit from food/merchandise +STR_2409 :{WINDOW_COLOUR_2}Campanhas de marketing em operação +STR_2410 :{BLACK}Nenhum +STR_2411 :{WINDOW_COLOUR_2}Campanhas de marketing disponíveis +STR_2412 :{SMALLFONT}{BLACK}Comece esta campanha de marketing +STR_2413 :{BLACK}({CURRENCY2DP} por semana) +STR_2414 :(Não Selecionado) +STR_2415 :{WINDOW_COLOUR_2}Atração: +STR_2416 :{WINDOW_COLOUR_2}Item: +STR_2417 :{WINDOW_COLOUR_2}Período de tempo: +STR_2418 :Entrada gratuita para {STRINGID} +STR_2419 :Atração gratuita no {STRINGID}* +STR_2420 :Meia-entrada para {STRINGID} +STR_2421 :Gratuito {STRINGID} +STR_2422 :Campanha publicitária para {STRINGID} +STR_2423 :Campanha publicitária para {STRINGID} +STR_2424 :{WINDOW_COLOUR_2}Cupões para entrada gratuita no parque +STR_2425 :{WINDOW_COLOUR_2}Cupões para entrada gratuitas em atrações em especial +STR_2426 :{WINDOW_COLOUR_2}Cupões para meia-entrada para o parque +STR_2427 :{WINDOW_COLOUR_2}Cupões para comida ou bebida de graça +STR_2428 :{WINDOW_COLOUR_2}Campanha publicitária para o parque +STR_2429 :{WINDOW_COLOUR_2}Campanha publicitária para uma atração em especial +STR_2430 :{BLACK}Cupões de entrada gratuita para {STRINGID} +STR_2431 :{BLACK}Cupões para entrada gratuita na atração {STRINGID} +STR_2432 :{BLACK}Cupões de meia-entrada para {STRINGID} +STR_2433 :{BLACK}Cupões de graça{STRINGID} +STR_2434 :{BLACK}Campanha publicitária para {STRINGID} +STR_2435 :{BLACK}Campanha publicitária para {STRINGID} +STR_2436 :1 semana +STR_2437 :2 semanas +STR_2438 :3 semanas +STR_2439 :4 semanas +STR_2440 :5 semanas +STR_2441 :6 semanas +STR_2442 :{BLACK}({STRINGID} restante*) +STR_2443 :{WINDOW_COLOUR_2}Custo por semana: {BLACK}{CURRENCY2DP} +STR_2444 :{WINDOW_COLOUR_2}Custo total: {BLACK}{CURRENCY2DP} +STR_2445 :Comece esta campanha de marketing +STR_2446 :{YELLOW}Your marketing campaign for free entry to the park has finished +STR_2447 :{YELLOW}Your marketing campaign for free rides on {STRINGID} has finished +STR_2448 :{YELLOW}Your marketing campaign for half-price entry to the park has finished +STR_2449 :{YELLOW}Your marketing campaign for free {STRINGID} has finished +STR_2450 :{YELLOW}Your advertising campaign for the park has finished +STR_2451 :{YELLOW}Your advertising campaign for {STRINGID} has finished +STR_2452 :{WINDOW_COLOUR_2}Dinheiro (menos empréstimo): {BLACK}{CURRENCY2DP} +STR_2453 :{WINDOW_COLOUR_2}Dinheiro (menos empréstimo): {RED}{CURRENCY2DP} +STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} - +STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} - +STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} - +STR_2457 :{SMALLFONT}{BLACK}Mostrar contas financeiras +STR_2458 :{SMALLFONT}{BLACK}Mostrar gráfico de dinheiro (menos de empréstimo) ao longo do tempo +STR_2459 :{SMALLFONT}{BLACK}Mostrar gráfico de valor parque ao longo do tempo +STR_2460 :{SMALLFONT}{BLACK}Mostrar gráfico de lucro semanal +STR_2461 :{SMALLFONT}{BLACK}Mostrar campanhas de marketing +STR_2462 :{SMALLFONT}{BLACK}Mostrar vista da entrada do parque +STR_2463 :{SMALLFONT}{BLACK}Mostrar gráfico de classificações do parque ao longo do tempo +STR_2464 :{SMALLFONT}{BLACK}Mostrar gráfico do número de visitantes ao longo do tempo +STR_2465 :{SMALLFONT}{BLACK}Mostrar preço de entradas no parque e informações +STR_2466 :{SMALLFONT}{BLACK}Mostrar estatísticas do parque +STR_2467 :{SMALLFONT}{BLACK}Mostrar objetivos para este jogo +STR_2468 :{SMALLFONT}{BLACK}Mostrar prêmios recentes que este parque recebeu +STR_2469 :{SMALLFONT}{BLACK}Escolha um nível de pesquisa e desenvolvimento +STR_2470 :{SMALLFONT}{BLACK}Pesquisar novas atrações de transporte +STR_2471 :{SMALLFONT}{BLACK}Pesquisar novas atrações Suaves/Calmas +STR_2472 :{SMALLFONT}{BLACK}Pesquisar novas montanhas-russas +STR_2473 :{SMALLFONT}{BLACK}Pesquisar novas atrações emocionantes +STR_2474 :{SMALLFONT}{BLACK}Pesquisar novas atrações aquáticas +STR_2475 :{SMALLFONT}{BLACK}Pesquisar novas lojas e barracas +STR_2476 :{SMALLFONT}{BLACK}Pesquisar novos cenários e tematizações +STR_2477 :{SMALLFONT}{BLACK}Selecione o modo de operação para esta atração +STR_2478 :{SMALLFONT}{BLACK}Show graph of velocity against time +STR_2479 :{SMALLFONT}{BLACK}Show graph of altitude against time +STR_2480 :{SMALLFONT}{BLACK}Show graph of vertical acceleration against time +STR_2481 :{SMALLFONT}{BLACK}Show graph of lateral acceleration against time +STR_2482 :{SMALLFONT}{BLACK}Profit: {CURRENCY} per week, Park Value: {CURRENCY} +STR_2483 :{WINDOW_COLOUR_2}Lucro semanal: {BLACK}+{CURRENCY2DP} +STR_2484 :{WINDOW_COLOUR_2}Lucro semanal: {RED}{CURRENCY2DP} +STR_2485 :Controls +STR_2486 :General +STR_2487 :Show 'real' names of guests +STR_2488 :{SMALLFONT}{BLACK}Toggle between showing 'real' names of guests and guest numbers +STR_2489 :Shortcut keys... +STR_2490 :Keyboard shortcuts +STR_2491 :Reset keys +STR_2492 :{SMALLFONT}{BLACK}Set all keyboard shortcuts back to default settings +STR_2493 :Close top-most window +STR_2494 :Close all floating windows +STR_2495 :Cancel construction mode +STR_2496 :Pause game +STR_2497 :Zoom view out +STR_2498 :Zoom view in +STR_2499 :Rotate view +STR_2500 :Rotate construction object +STR_2501 :Underground view toggle +STR_2502 :Remove base land toggle +STR_2503 :Remove vertical land toggle +STR_2504 :See-through rides toggle +STR_2505 :See-through scenery toggle +STR_2506 :Invisible supports toggle +STR_2507 :Invisible people toggle +STR_2508 :Height marks on land toggle +STR_2509 :Height marks on ride tracks toggle +STR_2510 :Height marks on paths toggle +STR_2511 :Adjust land +STR_2512 :Adjust water +STR_2513 :Build scenery +STR_2514 :Build paths +STR_2515 :Build new ride +STR_2516 :Show financial information +STR_2517 :Show research information +STR_2518 :Show rides list +STR_2519 :Show park information +STR_2520 :Show guest list +STR_2521 :Show staff list +STR_2522 :Show recent messages +STR_2523 :Show map +STR_2524 :Screenshot +STR_2525 :??? +STR_2526 :??? +STR_2527 :??? +STR_2528 :??? +STR_2529 :??? +STR_2530 :??? +STR_2531 :??? +STR_2532 :??? +STR_2533 :Backspace +STR_2534 :Tab +STR_2535 :??? +STR_2536 :??? +STR_2537 :Clear +STR_2538 :Return +STR_2539 :??? +STR_2540 :??? +STR_2541 :??? +STR_2542 :??? +STR_2543 :Alt/Menu +STR_2544 :Pause +STR_2545 :Caps +STR_2546 :??? +STR_2547 :??? +STR_2548 :??? +STR_2549 :??? +STR_2550 :??? +STR_2551 :??? +STR_2552 :Escape +STR_2553 :??? +STR_2554 :??? +STR_2555 :??? +STR_2556 :??? +STR_2557 :Spacebar +STR_2558 :PgUp +STR_2559 :PgDn +STR_2560 :End +STR_2561 :Home +STR_2562 :Left +STR_2563 :Up +STR_2564 :Right +STR_2565 :Down +STR_2566 :Select +STR_2567 :Print +STR_2568 :Execute +STR_2569 :Snapshot +STR_2570 :Insert +STR_2571 :Delete +STR_2572 :Help +STR_2573 :0 +STR_2574 :1 +STR_2575 :2 +STR_2576 :3 +STR_2577 :4 +STR_2578 :5 +STR_2579 :6 +STR_2580 :7 +STR_2581 :8 +STR_2582 :9 +STR_2583 :??? +STR_2584 :??? +STR_2585 :??? +STR_2586 :??? +STR_2587 :??? +STR_2588 :??? +STR_2589 :??? +STR_2590 :A +STR_2591 :B +STR_2592 :C +STR_2593 :D +STR_2594 :E +STR_2595 :F +STR_2596 :G +STR_2597 :H +STR_2598 :I +STR_2599 :J +STR_2600 :K +STR_2601 :L +STR_2602 :M +STR_2603 :N +STR_2604 :O +STR_2605 :P +STR_2606 :Q +STR_2607 :R +STR_2608 :S +STR_2609 :T +STR_2610 :U +STR_2611 :V +STR_2612 :W +STR_2613 :X +STR_2614 :Y +STR_2615 :Z +STR_2616 :??? +STR_2617 :??? +STR_2618 :Menu +STR_2619 :??? +STR_2620 :??? +STR_2621 :NumPad 0 +STR_2622 :NumPad 1 +STR_2623 :NumPad 2 +STR_2624 :NumPad 3 +STR_2625 :NumPad 4 +STR_2626 :NumPad 5 +STR_2627 :NumPad 6 +STR_2628 :NumPad 7 +STR_2629 :NumPad 8 +STR_2630 :NumPad 9 +STR_2631 :NumPad * +STR_2632 :NumPad + +STR_2633 :??? +STR_2634 :NumPad - +STR_2635 :NumPad . +STR_2636 :NumPad / +STR_2637 :F1 +STR_2638 :F2 +STR_2639 :F3 +STR_2640 :F4 +STR_2641 :F5 +STR_2642 :F6 +STR_2643 :F7 +STR_2644 :F8 +STR_2645 :F9 +STR_2646 :F10 +STR_2647 :F11 +STR_2648 :F12 +STR_2649 :F13 +STR_2650 :F14 +STR_2651 :F15 +STR_2652 :F16 +STR_2653 :F17 +STR_2654 :F18 +STR_2655 :F19 +STR_2656 :F20 +STR_2657 :F21 +STR_2658 :F22 +STR_2659 :F23 +STR_2660 :F24 +STR_2661 :??? +STR_2662 :??? +STR_2663 :??? +STR_2664 :??? +STR_2665 :??? +STR_2666 :??? +STR_2667 :??? +STR_2668 :??? +STR_2669 :NumLock +STR_2670 :Scroll +STR_2671 :??? +STR_2672 :??? +STR_2673 :??? +STR_2674 :??? +STR_2675 :??? +STR_2676 :??? +STR_2677 :??? +STR_2678 :??? +STR_2679 :??? +STR_2680 :??? +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 +STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry +STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max +STR_2684 :{MEDIUMFONT}{BLACK}Large group of peeps arrive +STR_2685 :Parâmetros de ruído simples +STR_2686 :{WINDOW_COLOUR_2}Baixo: +STR_2687 :{WINDOW_COLOUR_2}Alto: +STR_2688 :{WINDOW_COLOUR_2}Frequência base: +STR_2689 :{WINDOW_COLOUR_2}Oitavas: +STR_2690 :Gerador de Mapa +STR_2691 :{WINDOW_COLOUR_2}Altura da base: +STR_2692 :{WINDOW_COLOUR_2}Nível de água: +STR_2693 :{WINDOW_COLOUR_2}Terreno: +STR_2694 :Gerar +STR_2695 :Terreno aleatório +STR_2696 :Colocar árvores +STR_2697 :??? +STR_2698 :??? +STR_2699 :??? +STR_2700 :Frequencia do Salvamento automático +STR_2701 :Toda semana +STR_2702 :A cada 2 semanas +STR_2703 :Todo mês +STR_2704 :A cada 4 meses +STR_2705 :Todo ano +STR_2706 :Nunca +STR_2707 :Abrir nova janela +STR_2708 :{WINDOW_COLOUR_1}Você tem certeza que quer sobrescrever {STRINGID}? +STR_2709 :Sobrescrever +STR_2710 :Tipo de nome para o arquivo. +STR_2711 :; +STR_2712 := +STR_2713 :, +STR_2714 :- +STR_2715 :. +STR_2716 :/ +STR_2717 :' +STR_2718 :(cima) +STR_2719 :(novo arquivo) +STR_2720 :{UINT16}sec +STR_2721 :{UINT16}secs +STR_2722 :{UINT16}min:{UINT16}sec +STR_2723 :{UINT16}min:{UINT16}secs +STR_2724 :{UINT16}mins:{UINT16}sec +STR_2725 :{UINT16}mins:{UINT16}secs +STR_2726 :{UINT16}min +STR_2727 :{UINT16}mins +STR_2728 :{UINT16}hour:{UINT16}min +STR_2729 :{UINT16}hour:{UINT16}mins +STR_2730 :{UINT16}hours:{UINT16}min +STR_2731 :{UINT16}hours:{UINT16}mins +STR_2732 :{COMMA16}ft +STR_2733 :{COMMA16}m +STR_2734 :{COMMA16}mph +STR_2735 :{COMMA16}km/h +STR_2736 :{MONTH}, Ano {COMMA16} +STR_2737 :{STRINGID} {MONTH}, Ano {COMMA16} +STR_2738 :Musíca da tela de início +STR_2739 :Nenhum +STR_2740 :RollerCoaster Tycoon 1 +STR_2741 :RollerCoaster Tycoon 2 +STR_2742 :css50.dat não encontrado +STR_2743 :Copie data\css17.dat da instalação do seu RCT1 para data\css50.dat na sua pasta de instalação do RCT2. +STR_2744 :[ +STR_2745 :\ +STR_2746 :] +STR_2747 :{ENDQUOTES} +STR_2748 :Bar +STR_2749 :Meu novo cenário* +# New strings used in the cheats window previously these were ??? +STR_2750 :Mover todos os itens para o topo +STR_2751 :Mover todos os itens para baixo +STR_2752 :Limpar grama +STR_2753 :Cortar grama +STR_2754 :Regar plantas +STR_2755 :Consertar vandalismo +STR_2756 :Remover vomitos +STR_2757 :Forçar Sol +STR_2758 :Forçar Chuva +STR_2759 :Zero Clearance +STR_2760 :+5K de Dinheiro +STR_2761 :Pagar por Entrada +STR_2762 :Pagar por Atração +STR_2763 :??? +STR_2764 :Visitantes Felizes +STR_2765 :Leva de Visitantes* +STR_2766 :??? +STR_2767 :Congelar Clima +STR_2768 :Descongelar Clima +STR_2769 :Abrir o Parque +STR_2770 :Fechar o Parque +STR_2771 :Velocidade de Jogo mais lento +STR_2772 :Velocidade de Jogo mais rápido +STR_2773 :Janela +STR_2774 :Tela Inteira +STR_2775 :Tela Inteira (área de trabalho) +STR_2776 :Linguagem +STR_2777 :{MOVE_X}{SMALLFONT}{STRING} +STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} +STR_2779 :Viewport #{COMMA16} +STR_2780 :Extra viewport +# End of new strings +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2782 :SHIFT + +STR_2783 :CTRL + +STR_2784 :Change keyboard shortcut +STR_2785 :{WINDOW_COLOUR_2}Press new shortcut key for:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} +STR_2786 :{SMALLFONT}{BLACK}Click on shortcut description to select new key +STR_2787 :{WINDOW_COLOUR_2}Valor do parque: {BLACK}{CURRENCY} +STR_2788 :{WINDOW_COLOUR_2}Parabéns !{NEWLINE}{BLACK}Você alcançou seu objetivo com o valor da empresa de {CURRENCY} ! +STR_2789 :{WINDOW_COLOUR_2}Você falhou no seu objetivo ! +STR_2790 :Digite o nome do gráfico do cenário* +STR_2791 :Digite o nome +STR_2792 :Por favor, insira o seu nome para o gráfico do cenário: +STR_2793 :{SMALLFONT}(Completado por {STRINGID}) +STR_2794 :{WINDOW_COLOUR_2}Completed by: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} with a company value of: {BLACK}{CURRENCY} +STR_2795 :Sort +STR_2796 :{SMALLFONT}{BLACK}Sort the ride list into order using the information type displayed +STR_2797 :Scroll view when pointer at screen edge +STR_2798 :{SMALLFONT}{BLACK}Select whether to scroll the view when the mouse pointer is at the screen edge +STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments +STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32} +STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP} +STR_2802 :Map +STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map +STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map +STR_2805 :{SMALLFONT}{BLACK}Show map of park +STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your Faz-Tudo are and consider organizing them better +STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your Faz-Tudo are and consider organizing them better +STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better +STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food +STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks +STR_2811 :{RED}Guests are complaining because they can't find the restrooms in your park +STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around +STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests +STR_2814 :{WINDOW_COLOUR_2}O maior prêmio de parque desarrumado +STR_2815 :{WINDOW_COLOUR_2}O maior prêmio de parque arrumado +STR_2816 :{WINDOW_COLOUR_2}Prêmio para o parque com as melhores montanhas-russas +STR_2817 :{WINDOW_COLOUR_2}Prêmio do parque com melhor valor +STR_2818 :{WINDOW_COLOUR_2}Prêmio do mais belo parque +STR_2819 :{WINDOW_COLOUR_2}Worst value park award +STR_2820 :{WINDOW_COLOUR_2}Prêmio do parque mais seguro +STR_2821 :{WINDOW_COLOUR_2}Prêmio da melhor equipe +STR_2822 :{WINDOW_COLOUR_2}Prêmio da melhor comida de parque +STR_2823 :{WINDOW_COLOUR_2}Prêmio da pior comida de parque +STR_2824 :{WINDOW_COLOUR_2}Prêmio dos melhores banheiro de parque +STR_2825 :{WINDOW_COLOUR_2}Prêmio do parque mais decepcionante +STR_2826 :{WINDOW_COLOUR_2}Prêmio das melhores atrações aquáticas +STR_2827 :{WINDOW_COLOUR_2}Prêmio das melhores atrações customizadas +STR_2828 :{WINDOW_COLOUR_2}Prêmio do mais deslumbrante esquema de cor da atração +STR_2829 :{WINDOW_COLOUR_2}Prêmio do formato do parque mais confuso +STR_2830 :{WINDOW_COLOUR_2}Prêmio das melhores atrações suaves/calmas +STR_2831 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque mais desarrumado do país'! +STR_2832 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque mais arrumado do país'! +STR_2833 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque com as melhores montanhas-russas'! +STR_2834 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque com o melhor valor do país "! +STR_2835 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O mais belo parque do país'! +STR_2836 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque com o pior valor do país'! +STR_2837 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque mais seguro do país'! +STR_2838 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque com a melhor equipe'! +STR_2839 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque com a melhor comida do país'! +STR_2840 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque com a pior comida do país'! +STR_2841 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque com as melhores instalações sanitárias do país'! +STR_2842 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque mais decepcionante do país'! +STR_2843 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque com as melhores atrações aquáticas do país'! +STR_2844 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque com as melhores atrações customizadas'! +STR_2845 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque com a escolha de esquemas de cores mais deslumbrante'! +STR_2846 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque com o formato mais confuso'! +STR_2847 :{TOPAZ}Seu parque recebeu um prêmio por ser 'O parque com as melhores atrações suaves/calmas'! +STR_2848 :{WINDOW_COLOUR_2}Não há prêmios recentes +STR_2849 :New scenario installed successfully +STR_2850 :New track design installed successfully +STR_2851 :Scenario already installed +STR_2852 :Track design already installed +STR_2853 :Forbidden by the local authority! +STR_2854 :{RED}Guests can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance +STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the ride exit +STR_2856 :{WINDOW_COLOUR_2}Tutorial +STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) +STR_2858 :Can't start marketing campaign... +STR_2859 :Another instance of RollerCoaster Tycoon 2 is already running +STR_2860 :Infogrames Interactive credits... +STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. +STR_2862 :Music acknowledgements... +STR_2863 :Music acknowledgements +STR_2864 :{WINDOW_COLOUR_2}March - Children of the Regiment: (Fucik) non copyright +STR_2865 :{WINDOW_COLOUR_2}Heyken's Serenade: (J.Heyken) British Standard Music Coy; GEMA, BRITICO +STR_2866 :{WINDOW_COLOUR_2}In Continental Mood: (Composer unknown) Copyright Control +STR_2867 :{WINDOW_COLOUR_2}Wedding Journey: (Traditional) +STR_2868 :{WINDOW_COLOUR_2}Tales from the Vienna Woods: (Johann Strauss) non copyright +STR_2869 :{WINDOW_COLOUR_2}Slavonic Dance: (Traditional) +STR_2870 :{WINDOW_COLOUR_2}Das Alpenhorn: (Traditional) +STR_2871 :{WINDOW_COLOUR_2}The Blond Sailor: (Traditional) +STR_2872 :{WINDOW_COLOUR_2}Overture - Poet and Peasant: (Suppe) non copyright +STR_2873 :{WINDOW_COLOUR_2}Waltz Medley: (Johann Strauss) non copyright +STR_2874 :{WINDOW_COLOUR_2}Bella Bella Bimba: (Traditional) +STR_2875 :{WINDOW_COLOUR_2}Original recordings (P) 1976 C.J.Mears Organization, used with consent +STR_2876 :{WINDOW_COLOUR_2}RollerCoaster Tycoon 2 Title Music: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2877 :{WINDOW_COLOUR_2}Dodgems Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2878 :{WINDOW_COLOUR_2}Mid Summer's Heat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2879 :{WINDOW_COLOUR_2}Pharaoh's Tomb: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2880 :{WINDOW_COLOUR_2}Caesar's March: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2881 :{WINDOW_COLOUR_2}Drifting To Heaven: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2882 :{WINDOW_COLOUR_2}Invaders: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2883 :{WINDOW_COLOUR_2}Eternal Toybox: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2884 :{WINDOW_COLOUR_2}Jungle Juice: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2885 :{WINDOW_COLOUR_2}Ninja's Noodles: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2886 :{WINDOW_COLOUR_2}Voyage to Andromeda: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2887 :{WINDOW_COLOUR_2}Brimble's Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2888 :{WINDOW_COLOUR_2}Atlantis: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2889 :{WINDOW_COLOUR_2}Wild West Kid: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2890 :{WINDOW_COLOUR_2}Vampire's Lair: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2891 :{WINDOW_COLOUR_2}Blockbuster: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2892 :{WINDOW_COLOUR_2}Airtime Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2893 :{WINDOW_COLOUR_2}Searchlight Rag: (Scott Joplin/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2894 :{WINDOW_COLOUR_2}Flight of Fantasy: (Steve Blenkinsopp) copyright {COPYRIGHT} Chris Sawyer +STR_2895 :{WINDOW_COLOUR_2}Big Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2896 :{WINDOW_COLOUR_2}Hypothermia: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2897 :{WINDOW_COLOUR_2}Last Sleigh Ride: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2898 :{WINDOW_COLOUR_2}Pipes of Glencairn: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2899 :{WINDOW_COLOUR_2}Traffic Jam: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2900 :{WINDOW_COLOUR_2} +STR_2901 :{WINDOW_COLOUR_2}(Samples courtesy of Spectrasonics {ENDQUOTES}Liquid Grooves{ENDQUOTES}) +STR_2902 :{WINDOW_COLOUR_2}Toccata: (C.M.Widor, played by Peter James Adcock) recording {COPYRIGHT} Chris Sawyer +STR_2903 :{WINDOW_COLOUR_2}Space Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2904 :{WINDOW_COLOUR_2}Manic Mechanic: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2905 :{WINDOW_COLOUR_2}Techno Torture: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2906 :{WINDOW_COLOUR_2}Sweat Dreams: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2907 :{WINDOW_COLOUR_2}What shall we do with the Drunken Sailor: (Anon/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2908 :{WINDOW_COLOUR_2}Infogrames Interactive +STR_2909 :{WINDOW_COLOUR_2}Senior Producer: Thomas J. Zahorik +STR_2910 :{WINDOW_COLOUR_2}Executive Producer: Bill Levay +STR_2911 :{WINDOW_COLOUR_2}Senior Marketing Product Manager: Scott Triola +STR_2912 :{WINDOW_COLOUR_2}V.P. of Product Development: Scott Walker +STR_2913 :{WINDOW_COLOUR_2}General Manager: John Hurlbut +STR_2914 :{WINDOW_COLOUR_2}Director of Quality Assurance: Michael Craighead +STR_2915 :{WINDOW_COLOUR_2}Q.A. Certification Manager: Kurt Boutin +STR_2916 :{WINDOW_COLOUR_2}Q.A. Certification Lead: Mark Huggins +STR_2917 :{WINDOW_COLOUR_2}Testers: Dena Irene Fitzgerald, Scott Rollins, Christopher McPhail +STR_2918 :{WINDOW_COLOUR_2}Clif McClure, Erik Maramaldi, Erik Jeffery +STR_2919 :{WINDOW_COLOUR_2}Director of Marketing: Ann Marie Bland +STR_2920 :{WINDOW_COLOUR_2}Manager of Creative Services: Steve Martin +STR_2921 :{WINDOW_COLOUR_2}Manager of Editorial & Documentation Services: Elizabeth Mackney +STR_2922 :{WINDOW_COLOUR_2}Graphic Designer: Paul Anselmi +STR_2923 :{WINDOW_COLOUR_2}Copywriter: Kurt Carlson +STR_2924 :{WINDOW_COLOUR_2}Special Thanks to: Peter Matiss +STR_2925 :{WINDOW_COLOUR_2}Engineering Specialist: Ken Edwards +STR_2926 :{WINDOW_COLOUR_2}Engineering Services Manager: Luis Rivas +STR_2927 :{WINDOW_COLOUR_2}Lead Compatibility Analyst: Geoffrey Smith +STR_2928 :{WINDOW_COLOUR_2}Compatibility Analysts: Jason Cordero, Burke McQuinn, Kim Jardin +STR_2929 :{WINDOW_COLOUR_2}Lead Tester: Daniel Frisoli +STR_2930 :{WINDOW_COLOUR_2}Senior Tester: Matt Pantaleoni +STR_2931 :{WINDOW_COLOUR_2} +STR_2932 :{WINDOW_COLOUR_2} +STR_2933 :{WINDOW_COLOUR_2} +STR_2934 :{WINDOW_COLOUR_2} +STR_2935 :{WINDOW_COLOUR_2} +STR_2936 :{WINDOW_COLOUR_2} +STR_2937 :{WINDOW_COLOUR_2} +STR_2938 :{WINDOW_COLOUR_2} +STR_2939 :{WINDOW_COLOUR_2} +STR_2940 :{WINDOW_COLOUR_2} +STR_2941 :{WINDOW_COLOUR_2} +STR_2942 :{WINDOW_COLOUR_2} +STR_2943 :{WINDOW_COLOUR_2} +STR_2944 :{WINDOW_COLOUR_2} +STR_2945 :{WINDOW_COLOUR_2} +STR_2946 :{WINDOW_COLOUR_2} +STR_2947 :{WINDOW_COLOUR_2} +STR_2948 :{WINDOW_COLOUR_2} +STR_2949 :{WINDOW_COLOUR_2} +STR_2950 :{WINDOW_COLOUR_2} +STR_2951 :{WINDOW_COLOUR_2} +STR_2952 :{WINDOW_COLOUR_2} +STR_2953 :{WINDOW_COLOUR_2} +STR_2954 :{WINDOW_COLOUR_2} +STR_2955 :{WINDOW_COLOUR_2} +STR_2956 :{WINDOW_COLOUR_2} +STR_2957 :{WINDOW_COLOUR_2} +STR_2958 :{WINDOW_COLOUR_2} +STR_2959 :{WINDOW_COLOUR_2} +STR_2960 :{WINDOW_COLOUR_2} +STR_2961 :{WINDOW_COLOUR_2} +STR_2962 :{WINDOW_COLOUR_2} +STR_2963 :{WINDOW_COLOUR_2} +STR_2964 :{WINDOW_COLOUR_2} +STR_2965 :{WINDOW_COLOUR_2} +STR_2966 : +STR_2967 : +STR_2968 : +STR_2969 :Use of this product is subject to the terms of a license agreement +STR_2970 :found in the product's {OPENQUOTES}ReadMe{ENDQUOTES} file and in the manual +STR_2971 :Main color scheme +STR_2972 :Alternative color scheme 1 +STR_2973 :Alternative color scheme 2 +STR_2974 :Alternative color scheme 3 +STR_2975 :{SMALLFONT}{BLACK}Select which color scheme to change, or paint ride with +STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected color scheme +STR_2977 :Staff member name +STR_2978 :Enter new name for this member of staff: +STR_2979 :Can't name staff member... +STR_2980 :Too many banners in game +STR_2981 :{RED}No entry - - +STR_2982 :Banner text +STR_2983 :Enter new text for this banner: +STR_2984 :Can't set new text for banner... +STR_2985 :Banner +STR_2986 :{SMALLFONT}{BLACK}Change text on banner +STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for guests +STR_2988 :{SMALLFONT}{BLACK}Demolish this banner +STR_2989 :{SMALLFONT}{BLACK}Select main color +STR_2990 :{SMALLFONT}{BLACK}Select text color +STR_2991 :Sign +STR_2992 :Sign text +STR_2993 :Enter new text for this sign: +STR_2994 :{SMALLFONT}{BLACK}Change text on sign +STR_2995 :{SMALLFONT}{BLACK}Demolish this sign +STR_2996 :{BLACK}ABC +STR_2997 :{GREY}ABC +STR_2998 :{WHITE}ABC +STR_2999 :{RED}ABC +STR_3000 :{GREEN}ABC +STR_3001 :{YELLOW}ABC +STR_3002 :{TOPAZ}ABC +STR_3003 :{CELADON}ABC +STR_3004 :{BABYBLUE}ABC +STR_3005 :{PALELAVENDER}ABC +STR_3006 :{PALEGOLD}ABC +STR_3007 :{LIGHTPINK}ABC +STR_3008 :{PEARLAQUA}ABC +STR_3009 :{PALESILVER}ABC +STR_3010 :Unable to load file... +STR_3011 :File contains invalid data +STR_3012 :Dodgems beat style +STR_3013 :Fairground organ style +STR_3014 :Roman fanfare style +STR_3015 :Oriental style +STR_3016 :Martian style +STR_3017 :Jungle drums style +STR_3018 :Egyptian style +STR_3019 :Toyland style +STR_3020 : +STR_3021 :Space style +STR_3022 :Horror style +STR_3023 :Techno style +STR_3024 :Gentle style +STR_3025 :Summer style +STR_3026 :Water style +STR_3027 :Wild west style +STR_3028 :Jurassic style +STR_3029 :Rock style +STR_3030 :Ragtime style +STR_3031 :Fantasy style +STR_3032 :Rock style 2 +STR_3033 :Ice style +STR_3034 :Snow style +STR_3035 :Custom music 1 +STR_3036 :Custom music 2 +STR_3037 :Medieval style +STR_3038 :Urban style +STR_3039 :Organ style +STR_3040 :Mechanical style +STR_3041 :Modern style +STR_3042 :Pirates style +STR_3043 :Rock style 3 +STR_3044 :Candy style +STR_3045 :{SMALLFONT}{BLACK}Select style of music to play +STR_3046 :This ride cannot be modified +STR_3047 :Local authority forbids demolition or modifications to this ride +STR_3048 :Marketing campaigns forbidden by local authority +STR_3049 :Golf hole A +STR_3050 :Golf hole B +STR_3051 :Golf hole C +STR_3052 :Golf hole D +STR_3053 :Golf hole E +STR_3054 :Carregando... +STR_3055 :Branco +STR_3056 :Translúcido +STR_3057 :{WINDOW_COLOUR_2}Construction Marker: +STR_3058 :Brick walls +STR_3059 :Hedges +STR_3060 :Ice blocks +STR_3061 :Wooden fences +STR_3062 :{SMALLFONT}{BLACK}Standard roller coaster track +STR_3063 :{SMALLFONT}{BLACK}Water channel (track submerged) +STR_3064 :Beginner Parks +STR_3065 :Challenging Parks +STR_3066 :Expert Parks +STR_3067 :{OPENQUOTES}Real{ENDQUOTES} Parks +STR_3068 :Other Parks +STR_3069 :Top Section +STR_3070 :Slope to Level +STR_3071 :{WINDOW_COLOUR_2}Same price throughout park +STR_3072 :{SMALLFONT}{BLACK}Select whether this price is used throughout the entire park +STR_3073 :{RED}WARNING: Your park rating has dropped below 700 !{NEWLINE}If you haven't raised the park rating in 4 weeks, your park will be closed down +STR_3074 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have 3 weeks to raise the park rating +STR_3075 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have only 2 weeks to raise the park rating, or your park will be closed down +STR_3076 :{RED}FINAL WARNING: Your park rating is still below 700 !{NEWLINE}In just 7 days your park will be closed down unless you can raise the rating +STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! +STR_3078 :Plain entrance +STR_3079 :Wooden entrance +STR_3080 :Canvas tent entrance +STR_3081 :Castle entrance (gray) +STR_3082 :Castle entrance (brown) +STR_3083 :Jungle entrance +STR_3084 :Log cabin entrance +STR_3085 :Classical/Roman entrance +STR_3086 :Abstract entrance +STR_3087 :Snow/Ice entrance +STR_3088 :Pagoda entrance +STR_3089 :Space entrance +STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station +STR_3091 :You are not allowed to remove this section! +STR_3092 :You are not allowed to move or modify the station for this ride! +STR_3093 :{WINDOW_COLOUR_2}Favorite: {BLACK}{STRINGID} +STR_3094 :N/A +STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: +STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed +STR_3098 :Can't change lift hill speed... +STR_3099 :{SMALLFONT}{BLACK}Select color +STR_3100 :{SMALLFONT}{BLACK}Select second color +STR_3101 :{SMALLFONT}{BLACK}Select third color +STR_3102 :{SMALLFONT}{BLACK}Re-paint colored scenery on landscape +STR_3103 :Can't re-paint this... +STR_3104 :{SMALLFONT}{BLACK}List rides +STR_3105 :{SMALLFONT}{BLACK}List shops and stalls +STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other guest facilities +STR_3107 :Fechar +STR_3108 :Testar +STR_3109 :Abrir +STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16} +STR_3111 :{SMALLFONT}{BLACK}Click on design to build it +STR_3112 :{SMALLFONT}{BLACK}Click on design to rename or delete it +STR_3113 :Select a different design +STR_3114 :{SMALLFONT}{BLACK}Go back to design selection window +STR_3115 :{SMALLFONT}{BLACK}Save track design +STR_3116 :{SMALLFONT}{BLACK}Save track design (Not possible until ride has been tested and statistics have been generated) +STR_3117 :{BLACK}Calling mechanic... +STR_3118 :{BLACK}{STRINGID} is heading for the ride +STR_3119 :{BLACK}{STRINGID} is fixing the ride +STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride +STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy +STR_3122 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guest +STR_3123 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guests +STR_3124 :Broken {STRINGID} +STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% +STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% +STR_3127 :{WINDOW_COLOUR_2}Nausea Factor: {BLACK}+{COMMA16}% +STR_3128 :Save Track Design +STR_3129 :Save Track Design with Scenery +STR_3130 :Save +STR_3131 :Cancel +STR_3132 :{BLACK}Click items of scenery to select them to be saved with track design... +STR_3133 :Unable to build this on a slope +STR_3134 :{RED}(Design includes scenery which is unavailable) +STR_3135 :{RED}(Vehicle design unavailable - Ride performance may be affected) +STR_3136 :Warning: This design will be built with an alternative vehicle type and may not perform as expected +STR_3137 :Select Nearby Scenery +STR_3138 :Reset Selection +STR_3139 :Cable lift unable to work in this operating mode +STR_3140 :Cable lift hill must start immediately after station +STR_3141 :Multi-circuit per ride not possible with cable lift hill +STR_3142 :{WINDOW_COLOUR_2}Capacidade: {BLACK}{STRINGID} +STR_3143 :{SMALLFONT}{BLACK}Mostrar pessoa no mapa +STR_3144 :{SMALLFONT}{BLACK}Mostrar atrações e barracas no mapa +STR_3145 :{SMALLFONT}{BLACK}Scroll {STRINGID} esqueda +STR_3146 :{SMALLFONT}{BLACK}Scroll {STRINGID} direita +STR_3147 :{SMALLFONT}{BLACK}Scroll {STRINGID} esquerda rápido +STR_3148 :{SMALLFONT}{BLACK}Scroll {STRINGID} direita rápido +STR_3149 :{SMALLFONT}{BLACK}Scroll {STRINGID} esqueda/direita +STR_3150 :{SMALLFONT}{BLACK}Scroll {STRINGID} cima +STR_3151 :{SMALLFONT}{BLACK}Scroll {STRINGID} baixo +STR_3152 :{SMALLFONT}{BLACK}Scroll {STRINGID} cima rápido +STR_3153 :{SMALLFONT}{BLACK}Scroll {STRINGID} baixo rápido +STR_3154 :{SMALLFONT}{BLACK}Scroll {STRINGID} cima/baixo +STR_3155 : +STR_3156 : +STR_3157 :mapa +STR_3158 :gráfico +STR_3159 :lista +STR_3160 :RollerCoaster Tycoon 2: Starting for the first time... +STR_3161 :RollerCoaster Tycoon 2: Checking object files... +STR_3162 :Unable to allocate enough memory +STR_3163 :Installing new data: +STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) +STR_3165 : +STR_3166 :{BLACK}(ID: +STR_3167 :{WINDOW_COLOUR_2}Includes: {BLACK}{COMMA16} objects +STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} +STR_3169 :Data for the following object not found: +STR_3170 :Not enough space for graphics +STR_3171 :Too many objects of this type selected +STR_3172 :The following object must be selected first: +STR_3173 :This object is currently in use +STR_3174 :This object is required by another object +STR_3175 :This object is always required +STR_3176 :Unable to select this object +STR_3177 :Unable to de-select this object +STR_3178 :At least one path object must be selected +STR_3179 :At least one ride vehicle/attraction object must be selected +STR_3180 :Invalid selection of objects +STR_3181 :Object Selection - {STRINGID} +STR_3182 :Park entrance type must be selected +STR_3183 :Water type must be selected +STR_3184 :Ride Vehicles/Attractions +STR_3185 :Small Scenery +STR_3186 :Large Scenery +STR_3187 :Walls/Fences +STR_3188 :Path Signs +STR_3189 :Footpaths +STR_3190 :Path Extras +STR_3191 :Scenery Groups +STR_3192 :Park Entrance +STR_3193 :Water +STR_3194 :Scenario Description +STR_3195 :Invention List +STR_3196 :{WINDOW_COLOUR_2}Research Group: {BLACK}{STRINGID} +STR_3197 :{WINDOW_COLOUR_2}Items pre-invented at start of game: +STR_3198 :{WINDOW_COLOUR_2}Items to invent during game: +STR_3199 :Random Shuffle +STR_3200 :{SMALLFONT}{BLACK}Randomly shuffle the list of items to invent during the game +STR_3201 :Object Selection +STR_3202 :Landscape Editor +STR_3203 :Invention List Set Up +STR_3204 :Options Selection +STR_3205 :Objective Selection +STR_3206 :Save Scenario +STR_3207 :Roller Coaster Designer +STR_3208 :Track Designs Manager +STR_3209 :Back to Previous Step: +STR_3210 :Forward to Next Step: +STR_3211 :{WINDOW_COLOUR_2}Map size: +STR_3212 :{POP16}{COMMA16} x {PUSH16}{COMMA16} +STR_3213 :Can't decrease map size any further +STR_3214 :Can't increase map size any further +STR_3215 :Too close to edge of map +STR_3216 :{SMALLFONT}{BLACK}Select park-owned land etc. +STR_3217 :Land Owned +STR_3218 :Construction Rights Owned +STR_3219 :Land For Sale +STR_3220 :Construction Rights For Sale +STR_3221 :{SMALLFONT}{BLACK}Set land to be owned by the park +STR_3222 :{SMALLFONT}{BLACK}Set construction rights only to be owned by the park +STR_3223 :{SMALLFONT}{BLACK}Set land to be available to purchase by the park +STR_3224 :{SMALLFONT}{BLACK}Set construction rights to be available to purchase by the park +STR_3225 :{SMALLFONT}{BLACK}Toggle on/off building a random cluster of objects around the selected position +STR_3226 :{SMALLFONT}{BLACK}Build park entrance +STR_3227 :Too many park entrances! +STR_3228 :{SMALLFONT}{BLACK}Set starting positions for people +STR_3229 :Block Brakes cannot be used directly after station +STR_3230 :Block Brakes cannot be used directly after each other +STR_3231 :Block Brakes cannot be used directly after the top of this lift hill +STR_3232 :Options - Financial +STR_3233 :Options - Guests +STR_3234 :Options - Park +STR_3235 :{SMALLFONT}{BLACK}Show financial options +STR_3236 :{SMALLFONT}{BLACK}Show guest options +STR_3237 :{SMALLFONT}{BLACK}Show park options +STR_3238 :No Money +STR_3239 :{SMALLFONT}{BLACK}Make this park a 'no money' park with no financial restrictions +STR_3240 :{WINDOW_COLOUR_2}Dinheiro inicial: +STR_3241 :{WINDOW_COLOUR_2}Empréstimo inicial: +STR_3242 :{WINDOW_COLOUR_2}Maximum loan size: +STR_3243 :{WINDOW_COLOUR_2}Annual interest rate: +STR_3244 :Forbid marketing campaigns +STR_3245 :{SMALLFONT}{BLACK}Forbid advertising, promotional schemes, and other marketing campaigns +STR_3246 :{WINDOW_COLOUR_2}{CURRENCY} +STR_3247 :{WINDOW_COLOUR_2}{COMMA16}% +STR_3248 :Can't increase initial cash any further! +STR_3249 :Can't reduce initial cash any further! +STR_3250 :Can't increase initial loan any further! +STR_3251 :Can't reduce initial loan any further! +STR_3252 :Can't increase maximum loan size any further! +STR_3253 :Can't reduce maximum loan size any further! +STR_3254 :Can't increase interest rate any further! +STR_3255 :Can't reduce interest rate any further! +STR_3256 :Guests prefer less intense rides +STR_3257 :{SMALLFONT}{BLACK}Select whether guests should generally prefer less intense rides only +STR_3258 :Guests prefer more intense rides +STR_3259 :{SMALLFONT}{BLACK}Select whether guests should generally prefer more intense rides only +STR_3260 :{WINDOW_COLOUR_2}Cash per guest (average): +STR_3261 :{WINDOW_COLOUR_2}Guests initial happiness: +STR_3262 :{WINDOW_COLOUR_2}Guests initial hunger: +STR_3263 :{WINDOW_COLOUR_2}Guests initial thirst: +STR_3264 :Can't increase this any further! +STR_3265 :Can't reduce this any further! +STR_3266 :{SMALLFONT}{BLACK}Select how this park charges for entrance and rides +STR_3267 :Forbid tree removal +STR_3268 :{SMALLFONT}{BLACK}Forbid tall trees being removed +STR_3269 :Forbid landscape changes +STR_3270 :{SMALLFONT}{BLACK}Forbid any changes to the landscape +STR_3271 :Proibir construção alta +STR_3272 :{SMALLFONT}{BLACK}Proibir qualquer construção alta +STR_3273 :Classificação do parque com alto nível de dificuldade +STR_3274 :{SMALLFONT}{BLACK}Fazer p valor da classificação do parque mais desafiador +STR_3275 :Geração de visitantes com maior nível de dificuldade +STR_3276 :{SMALLFONT}{BLACK}Tornar mais difícil atrair clientes para o parque +STR_3277 :{WINDOW_COLOUR_2}Custo para comprar terreno: +STR_3278 :{WINDOW_COLOUR_2}Custo para comprar os direitos de construção: +STR_3279 :Entrada gratuita no parque / Pagamento por atrações +STR_3280 :Pague para entrar no Parque / Atrações gratuitas +STR_3281 :{WINDOW_COLOUR_2}Preço de entrada: +STR_3282 :{SMALLFONT}{BLACK}Selecione o objetivo e nome do parque +STR_3283 :{SMALLFONT}{BLACK}Selecione as atrações a serem preservadas +STR_3284 :Seleção de Objetivo +STR_3285 :Atrações Conservadas +STR_3286 :{SMALLFONT}{BLACK}Selecione o objetivo para este cenário +STR_3287 :{WINDOW_COLOUR_2}Objetivo: +STR_3288 :{SMALLFONT}{BLACK}Selecione o clima +STR_3289 :{WINDOW_COLOUR_2}Clima: +STR_3290 :Frio e úmido +STR_3291 :Morno* +STR_3292 :Quente e seco +STR_3293 :Frio +STR_3294 :Mudar... +STR_3295 :{SMALLFONT}{BLACK}Change name of park +STR_3296 :{SMALLFONT}{BLACK}Change name of scenario +STR_3297 :{SMALLFONT}{BLACK}Change detail notes about park / scenario +STR_3298 :{WINDOW_COLOUR_2}Park Name: {BLACK}{STRINGID} +STR_3299 :{WINDOW_COLOUR_2}Park/Scenario Details: +STR_3300 :{WINDOW_COLOUR_2}Scenario Name: {BLACK}{STRINGID} +STR_3301 :{WINDOW_COLOUR_2}Objective Date: +STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR} +STR_3303 :{WINDOW_COLOUR_2}Numero de visitantes: +STR_3304 :{WINDOW_COLOUR_2}Valor do parque: +STR_3305 :{WINDOW_COLOUR_2}Monthly income: +STR_3306 :{WINDOW_COLOUR_2}Monthly profit: +STR_3307 :{WINDOW_COLOUR_2}Minimum length: +STR_3308 :{WINDOW_COLOUR_2}Excitement rating: +STR_3309 :{WINDOW_COLOUR_2}{COMMA16} +STR_3310 :{WINDOW_COLOUR_2}{LENGTH} +STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32} +STR_3312 :{WINDOW_COLOUR_2}Rides/attractions under a preservation order: +STR_3313 :Nome do Cenário +STR_3314 :Digite o nome para o cenário: +STR_3315 :Detalhes do Parque/Cenário +STR_3316 :Digite a descrição para o cenário: +STR_3317 :No details yet +STR_3318 :{SMALLFONT}{BLACK}Select which group this scenario appears in +STR_3319 :{WINDOW_COLOUR_2}Scenario Group: +STR_3320 :Unable to save scenario file... +STR_3321 :New objects installed successfully +STR_3322 :{WINDOW_COLOUR_2}Objective: {BLACK}{STRINGID} +STR_3323 :Missing object data, ID: +STR_3324 :Requires Add-On Pack: +STR_3325 :Requires an Add-On Pack +STR_3326 :{WINDOW_COLOUR_2}(no image) +STR_3327 :Starting positions for people not set +STR_3328 :Can't advance to next editor stage... +STR_3329 :Park entrance not yet built +STR_3330 :Park must own some land +STR_3331 :Path from park entrance to map edge either not complete or too complex - Path must be single-width with as few junctions and corners as possible +STR_3332 :Park entrance is the wrong way round or has no path leading to the map edge +STR_3333 :Export plug-in objects with saved games +STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data +STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles +STR_3336 :Track Designs Manager - Select Ride Type +STR_3337 :Parque Six Flags +STR_3338 :{BLACK}Custom-designed layout +STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout +STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout +STR_3341 :{SMALLFONT}{BLACK}Ferramentas de Jogo +STR_3342 :Editor de Cenário +STR_3343 :Converter Jogo Salvo em Cenário +STR_3344 :Designer de Montanha-Russa +STR_3345 :Gerenciamento de Designs de Pista +STR_3346 :Can't save track design... +STR_3347 :Ride is too large, contains too many elements, or scenery is too spread out +STR_3348 :Renomear +STR_3349 :Deletar +STR_3350 :Track design name +STR_3351 :Enter new name for this track design: +STR_3352 :Can't rename track design... +STR_3353 :New name contains invalid characters +STR_3354 :Another file exists with this name, or file is write-protected +STR_3355 :File is write-protected or locked +STR_3356 :Delete File +STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ? +STR_3358 :Can't delete track design... +STR_3359 :{BLACK}No track designs of this type +STR_3360 :Warning! +STR_3361 :Too many track designs of this type - Some will not be listed. +STR_3362 :Forced Software Buffer Mixing +STR_3363 :{SMALLFONT}{BLACK}Select this option to improve performance if the game pauses slightly when sounds start or interference is heard +STR_3364 :Advanced +STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups +STR_3366 :{BLACK}= Ride +STR_3367 :{BLACK}= Barraca de Comida +STR_3368 :{BLACK}= Barraca de Bebida +STR_3369 :{BLACK}= Barraca de Lembrança +STR_3370 :{BLACK}= Quiosque de Informação +STR_3371 :{BLACK}= Primeiros Socorros +STR_3372 :{BLACK}= Caixa Eletrônico +STR_3373 :{BLACK}= Banheiro +STR_3374 :Aviso: Muitos objetos selecionados! +STR_3375 :Nem todos os objetos neste grupo de cenário podem ser selecionado +STR_3376 :Instalar um novo projeto de pista... +STR_3377 :{SMALLFONT}{BLACK}Instalar um novo arquivo de projeto de pista +STR_3378 :Instalar +STR_3379 :Cancelar +STR_3380 :Impossível instalar este projeto de pista... +STR_3381 :O arquivo não é compatível ou contém dados inválidos +STR_3382 :Cópia de arquivo falhou +STR_3383 :Selecione um novo nome para o projeto da pista +STR_3384 :An existing track design already has this name - Please select a new name for this design: +STR_3385 :Tutorial Iniciante +STR_3386 :Tutorial de Atrações Customizadas +STR_3387 :Tutorial de construção de Montanha-Russas +STR_3388 :Impossível alterar para o modo selecionado +STR_3389 :Impossível selecionar o item adicional de cenário... +STR_3390 :Muitos itens selecionados +STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... +STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... +STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... +STR_3394 :{SMALLFONT}{BLACK}You can also rotate the view in 90 degree steps... +STR_3395 :{SMALLFONT}{BLACK}Building anything at this scale is a bit difficult, so let's zoom the view back in again... +STR_3396 :{SMALLFONT}{BLACK}Let's build a simple ride to get the park started... +STR_3397 :{SMALLFONT}{BLACK}The white 'ghost' image shows where the ride will be built. We'll move the pointer to select the position then click to build it... +STR_3398 :{SMALLFONT}{BLACK}Rides need an entrance and an exit. We'll move the pointer to a square on the edge of the ride and then click to build first the entrance and then the exit... +STR_3399 :{SMALLFONT}{BLACK}We need to build footpaths to allow guests to reach our new ride... +STR_3400 :{SMALLFONT}{BLACK}For the path to the ride entrance we'll use a special 'queue line' path... +STR_3401 :{SMALLFONT}{BLACK}For the exit path, just an 'ordinary' path will do... +STR_3402 :{SMALLFONT}{BLACK}Right, lets open the ride! To open the ride we click the flag icon on the ride window and select 'open'... +STR_3403 :{SMALLFONT}{BLACK}But where are the guests? +STR_3404 :{SMALLFONT}{BLACK}Oh - The park is still closed! Right - Let's open it... +STR_3405 :{SMALLFONT}{BLACK}While we're waiting for our first guests, let's build some scenery... +STR_3406 :{SMALLFONT}{BLACK}Here's our empty park. We're going to build a simple custom-designed ride... +STR_3407 :{SMALLFONT}{BLACK}First we need to choose a starting position... +STR_3408 :{SMALLFONT}{BLACK}The section of track we've just built is a 'station platform', to allow guests to get on and off the ride... +STR_3409 :{SMALLFONT}{BLACK}We'll extend the platform a bit by adding a couple more station platform sections... +STR_3410 :{SMALLFONT}{BLACK}The icons at the top of the construction window let you choose different track pieces to add... +STR_3411 :{SMALLFONT}{BLACK}We'll select a left-hand curve... +STR_3412 :{SMALLFONT}{BLACK}The curve hasn't been built yet, but the white ghost image shows where it will be built. Clicking the large 'build this' icon actually builds the track... +STR_3413 :{SMALLFONT}{BLACK}Now we want to build straight track, so we click the straight track icon... +STR_3414 :{SMALLFONT}{BLACK}Now that the circuit is complete, we need to build the ride entrance and exit... +STR_3415 :{SMALLFONT}{BLACK}Let's test our ride to check it works... +STR_3416 :{SMALLFONT}{BLACK}White it's being tested, we'll build the queue line and exit path... +STR_3417 :{SMALLFONT}{BLACK}OK - Let's open the park and the ride... +STR_3418 :{SMALLFONT}{BLACK}Our new ride isn't very exciting - Perhaps we should add some scenery? +STR_3419 :{SMALLFONT}{BLACK}To build scenery above other scenery or in mid-air, hold down the SHIFT key and move the mouse to select the height... +STR_3420 :{SMALLFONT}{BLACK}Some types of scenery can be re-painted after it's built... +STR_3421 :{SMALLFONT}{BLACK}Let's add some music to the ride... +STR_3422 :{SMALLFONT}{BLACK}Let's build a roller coaster ! +STR_3423 :{SMALLFONT}{BLACK}There are loads of pre-designed coasters, but we're going to build our own custom design... +STR_3424 :{SMALLFONT}{BLACK}That's the station platform built. Now we need a lift hill... +STR_3425 :{SMALLFONT}{BLACK}Roller coaster trains aren't powered, so a 'chain lift' is needed to pull the train up the first hill... +STR_3426 :{SMALLFONT}{BLACK}That's the lift hill complete - Now for the first drop... +STR_3427 :{SMALLFONT}{BLACK}Those curves are a bad idea - The riders will be flung to the sides by the lateral G forces as the train hurtles around... +STR_3428 :{SMALLFONT}{BLACK}Banking the curves will improve the ride - Riders will be pushed down into their seats instead of flung to the sides... +STR_3429 :{SMALLFONT}{BLACK}No - That won't work! Look at the height marks - The second hill is taller than the lift hill... +STR_3430 :{SMALLFONT}{BLACK}To ensure the train makes it around, each hill should be slightly smaller than the previous one... +STR_3431 :{SMALLFONT}{BLACK}That's better - Our train should make it up that hill now! Let's try some more twisted track... +STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve and station, so let's add some brakes... +STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow two trains to operate more safely on the circuit... +STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! +STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... +STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customize the ride a bit... +STR_3437 :{SMALLFONT}{BLACK}Limpar grandes áreas de cenário no terreno* +STR_3438 :Impossível remover todos os cenários a partir daqui... +STR_3439 :Limpar Cenário +STR_3440 :Página 1 +STR_3441 :Página 2 +STR_3442 :Página 3 +STR_3443 :Página 4 +STR_3444 :Página 5 +STR_3445 :Definir a Área de Patrulha +STR_3446 :Cancelar a Área de Patrulha From 98253c8d2167cfcd5166071b9ce58af796042200 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 22 Jun 2015 08:41:47 +0200 Subject: [PATCH 0061/1173] Keep RCT1 launch modes on TD4 import --- src/ride/track.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index c8f8a9b7fa..7d4716707f 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -615,14 +615,16 @@ rct_track_td6* load_track_design(const char *path) track_design->type = RIDE_TYPE_WOODEN_ROLLER_COASTER; if (track_design->type == RIDE_TYPE_CORKSCREW_ROLLER_COASTER) { - if (track_design->ride_mode == RCT1_RIDE_MODE_POWERED_LAUNCH) - track_design->ride_mode = RIDE_MODE_POWERED_LAUNCH; if (track_design->vehicle_type == 79) { if (track_design->ride_mode == 2) track_design->ride_mode = 1; } } + // All TD4s that use powered launch use the type that doesn't pass the station. + if (track_design->ride_mode == RCT1_RIDE_MODE_POWERED_LAUNCH) + track_design->ride_mode = RIDE_MODE_POWERED_LAUNCH; + rct_object_entry* vehicle_object; if (track_design->type == RIDE_TYPE_MAZE) { vehicle_object = RCT2_ADDRESS(0x0097F66C, rct_object_entry); From ce26812caa9f7dd5bb53ecb6d548e0ffc70c3f43 Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 22 Jun 2015 13:49:35 +0200 Subject: [PATCH 0062/1173] Add sorting based on date --- data/language/english_uk.txt | 6 ++- src/config.c | 1 + src/config.h | 8 ++++ src/localisation/string_ids.h | 5 ++ src/platform/platform.h | 1 + src/platform/windows.c | 7 +++ src/windows/loadsave.c | 88 ++++++++++++++++++++++++++++++----- 7 files changed, 104 insertions(+), 12 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 8401ebc0ac..09ac4112be 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3705,4 +3705,8 @@ STR_5368 :Reset crash status STR_5369 :Park parameters... STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. STR_5371 :Object Selection -STR_5372 :Invert right mouse dragging \ No newline at end of file +STR_5372 :Invert right mouse dragging +STR_5373 :Name {STRINGID} +STR_5374 :Date {STRINGID} +STR_5375 :{UP} +STR_5376 :{DOWN} \ No newline at end of file diff --git a/src/config.c b/src/config.c index a5521c2cf1..37f32c9b60 100644 --- a/src/config.c +++ b/src/config.c @@ -181,6 +181,7 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, last_run_version), "last_run_version", CONFIG_VALUE_TYPE_STRING, { .value_string = NULL }, NULL }, { offsetof(general_configuration, title_sequence), "title_sequence", CONFIG_VALUE_TYPE_UINT8, TITLE_SEQUENCE_OPENRCT2, NULL }, { offsetof(general_configuration, invert_viewport_drag), "invert_viewport_drag", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(general_configuration, load_save_sort), "load_save_sort", CONFIG_VALUE_TYPE_UINT8, SORT_NAME_ASCENDING, NULL }, }; config_property_definition _interfaceDefinitions[] = { diff --git a/src/config.h b/src/config.h index 9c161c965d..0ad455ff07 100644 --- a/src/config.h +++ b/src/config.h @@ -112,6 +112,13 @@ enum { TITLE_SEQUENCE_RANDOM }; +enum { + SORT_NAME_ASCENDING, + SORT_NAME_DESCENDING, + SORT_DATE_ASCENDING, + SORT_DATE_DESCENDING, +}; + typedef struct { uint8 play_intro; uint8 confirmation_prompt; @@ -145,6 +152,7 @@ typedef struct { utf8string last_run_version; uint8 title_sequence; uint8 invert_viewport_drag; + uint8 load_save_sort; } general_configuration; typedef struct { diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 2e040cf311..a1029e0da5 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1545,6 +1545,11 @@ enum { STR_INVERT_RIGHT_MOUSE_DRAG = 5372, + STR_NAME = 5373, + STR_DATE = 5374, + STR_UP = 5375, + STR_DOWN = 5376, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/platform/platform.h b/src/platform/platform.h index ee3a146cd1..c0264e66dd 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -87,6 +87,7 @@ void platform_stop_text_input(); char platform_get_path_separator(); int platform_file_exists(const char *path); int platform_directory_exists(const char *path); +time_t platform_file_get_modified_time(char* path); int platform_ensure_directory_exists(const char *path); int platform_lock_single_instance(); int platform_enumerate_files_begin(const char *pattern); diff --git a/src/platform/windows.c b/src/platform/windows.c index 52fb1000df..2c5f9402e9 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "../addresses.h" #include "../cmdline.h" #include "../openrct2.h" @@ -641,6 +642,12 @@ uint16 platform_get_locale_language(){ return LANGUAGE_UNDEFINED; } +time_t platform_file_get_modified_time(char* path){ + struct _stat stat; + _stat(path, &stat); + return stat.st_mtime; +} + uint8 platform_get_locale_currency(){ CHAR currCode[4]; diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 88e4662520..9cde2098bd 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -18,6 +18,7 @@ * along with this program. If not, see . *****************************************************************************/ +#include #include "../addresses.h" #include "../config.h" #include "../game.h" @@ -40,17 +41,21 @@ enum { WIDX_BACKGROUND, WIDX_TITLE, WIDX_CLOSE, + WIDX_SORT_NAME, + WIDX_SORT_DATE, WIDX_SCROLL, WIDX_BROWSE, }; // 0x9DE48C static rct_widget window_loadsave_widgets[] = { - { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, STR_NONE, STR_NONE }, - { WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_NONE, STR_WINDOW_TITLE_TIP }, - { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, - { WWT_SCROLL, 0, 4, WW - 5, 36, WH - 40, 2, STR_NONE }, - { WWT_CLOSEBOX, 0, 4, 200, WH - 36, WH - 18, 2707, STR_NONE }, // Use native browser + { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, STR_NONE, STR_NONE }, + { WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_NONE, STR_WINDOW_TITLE_TIP }, + { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, + { WWT_CLOSEBOX, 0, 4, (WW - 5) / 2, 36, 47, STR_NONE, STR_NONE }, + { WWT_CLOSEBOX, 0, (WW - 5) / 2 + 1, WW - 5 - 1, 36, 47, STR_NONE, STR_NONE }, + { WWT_SCROLL, 0, 4, WW - 5, 47, WH - 40, 2, STR_NONE }, + { WWT_CLOSEBOX, 0, 4, 200, WH - 36, WH - 18, 2707, STR_NONE }, // Use native browser { WIDGETS_END } }; @@ -104,9 +109,18 @@ static void* window_loadsave_events[] = { #pragma endregion +enum { + TYPE_UP, + TYPE_NEW_FILE, + TYPE_DIRECTORY, + TYPE_FILE, +}; + typedef struct { char name[256]; char path[MAX_PATH]; + time_t date_modified; + uint8 type; } loadsave_list_item; int _listItemsCount = 0; @@ -120,6 +134,7 @@ int _type; static void window_loadsave_populate_list(int includeNewItem, bool browsable, const char *directory, const char *extension); static void window_loadsave_select(rct_window *w, const char *path); +static void window_loadsave_sort_list(int index, int endIndex); static int has_extension(char *path, char *extension); @@ -139,7 +154,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) if (w == NULL) { w = window_create_centred(WW, WH, (uint32*)window_loadsave_events, WC_LOADSAVE, WF_STICK_TO_FRONT); w->widgets = window_loadsave_widgets; - w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_BROWSE); + w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_SORT_NAME) | (1 << WIDX_SORT_DATE) | (1 << WIDX_BROWSE); w->colours[0] = 7; w->colours[1] = 7; w->colours[2] = 7; @@ -296,6 +311,26 @@ static void window_loadsave_mouseup() window_loadsave_select(w, filename); } break; + case WIDX_SORT_NAME: + if (gConfigGeneral.load_save_sort == SORT_NAME_ASCENDING){ + gConfigGeneral.load_save_sort = SORT_NAME_DESCENDING; + } else { + gConfigGeneral.load_save_sort = SORT_NAME_ASCENDING; + } + config_save_default(); + window_loadsave_sort_list(0, _listItemsCount - 1); + window_invalidate(w); + break; + case WIDX_SORT_DATE: + if (gConfigGeneral.load_save_sort == SORT_DATE_DESCENDING){ + gConfigGeneral.load_save_sort = SORT_DATE_ASCENDING; + } else { + gConfigGeneral.load_save_sort = SORT_DATE_DESCENDING; + } + config_save_default(); + window_loadsave_sort_list(0, _listItemsCount - 1); + window_invalidate(w); + break; } } @@ -448,7 +483,19 @@ static void window_loadsave_paint() sprintf(buffer, "%c%c%s", FORMAT_MEDIUMFONT, FORMAT_BLACK, _shortenedDirectory); // Draw shadow gfx_draw_string(dpi, buffer, 0, w->x + 4, w->y + 20); - + rct_string_id id = STR_NONE; + if (gConfigGeneral.load_save_sort == SORT_NAME_ASCENDING) + id = STR_UP; + else if (gConfigGeneral.load_save_sort == SORT_NAME_DESCENDING) + id = STR_DOWN; + gfx_draw_string_centred_clipped(dpi, STR_NAME, &id, 1, w->x + 4 + (w->width - 8) / 4, w->y + 36, (w->width - 8) / 2); + if (gConfigGeneral.load_save_sort == SORT_DATE_ASCENDING) + id = STR_UP; + else if (gConfigGeneral.load_save_sort == SORT_DATE_DESCENDING) + id = STR_DOWN; + else + id = STR_NONE; + gfx_draw_string_centred_clipped(dpi, STR_DATE, &id, 1, w->x + 4 + (w->width - 8) * 3 / 4, w->y + 36, (w->width - 8) / 2); } static void shorten_path(char* path, char* buffer, int available_width){ @@ -523,7 +570,21 @@ static int list_item_sort(const void *a, const void *b) const loadsave_list_item *itemA = (loadsave_list_item*)a; const loadsave_list_item *itemB = (loadsave_list_item*)b; - return strcmp(itemA->name, itemB->name); + if (itemA->type != itemB->type) + return itemA->type - itemB->type; + + switch (gConfigGeneral.load_save_sort){ + case SORT_NAME_ASCENDING: + return strcmp(itemA->name, itemB->name); + case SORT_NAME_DESCENDING: + return -strcmp(itemA->name, itemB->name); + case SORT_DATE_DESCENDING: + return (int) -difftime(itemA->date_modified, itemB->date_modified); + case SORT_DATE_ASCENDING: + return (int) difftime(itemA->date_modified, itemB->date_modified); + default: + return strcmp(itemA->name, itemB->name); + } } static void window_loadsave_sort_list(int index, int endIndex) @@ -580,6 +641,7 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co strncpy(listItem->name, language_get_string(2718), sizeof(listItem->name)); memset(listItem->path, '\0', MAX_PATH); strncpy(listItem->path, directory, lastSlash + 1); + listItem->type = TYPE_UP; _listItemsCount++; } } @@ -587,7 +649,8 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co if (includeNewItem) { listItem = &_listItems[_listItemsCount]; strncpy(listItem->name, language_get_string(2719), sizeof(listItem->name)); - listItem->path[0] = 0; + listItem->path[0] = '\0'; + listItem->type = TYPE_NEW_FILE; _listItemsCount++; } @@ -604,7 +667,7 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co strncpy(listItem->path, directory, MAX_PATH); strncat(listItem->path, subDir, MAX_PATH); strncpy(listItem->name, subDir, sizeof(listItem->name)); - + listItem->type = TYPE_DIRECTORY; _listItemsCount++; } platform_enumerate_files_end(fileEnumHandle); @@ -621,7 +684,9 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co listItem = &_listItems[_listItemsCount]; strncpy(listItem->path, directory, sizeof(listItem->path)); strncat(listItem->path, fileInfo.path, sizeof(listItem->path)); - + listItem->type = TYPE_FILE; + listItem->date_modified = platform_file_get_modified_time(listItem->path); + src = fileInfo.path; dst = listItem->name; i = 0; @@ -634,6 +699,7 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co _listItemsCount++; } platform_enumerate_files_end(fileEnumHandle); + window_loadsave_sort_list(sortStartIndex, _listItemsCount - 1); } From c7781e272c951e087a41f4c50e40ceb8565e27d1 Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 22 Jun 2015 13:54:09 +0200 Subject: [PATCH 0063/1173] Make sorting case insensitive --- src/windows/loadsave.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 9cde2098bd..6764d27145 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -565,6 +565,15 @@ static void window_loadsave_scrollpaint() } } +static int strcicmp(char const *a, char const *b) +{ + for (;; a++, b++) { + int d = tolower(*a) - tolower(*b); + if (d != 0 || !*a) + return d; + } +} + static int list_item_sort(const void *a, const void *b) { const loadsave_list_item *itemA = (loadsave_list_item*)a; @@ -575,9 +584,9 @@ static int list_item_sort(const void *a, const void *b) switch (gConfigGeneral.load_save_sort){ case SORT_NAME_ASCENDING: - return strcmp(itemA->name, itemB->name); + return strcicmp(itemA->name, itemB->name); case SORT_NAME_DESCENDING: - return -strcmp(itemA->name, itemB->name); + return -strcicmp(itemA->name, itemB->name); case SORT_DATE_DESCENDING: return (int) -difftime(itemA->date_modified, itemB->date_modified); case SORT_DATE_ASCENDING: From 21ecd52af1dd42a78dc3bd1bdba0dded25432785 Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 22 Jun 2015 14:17:45 +0200 Subject: [PATCH 0064/1173] Fix for travis --- src/windows/loadsave.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 6764d27145..2bcd719b15 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -565,7 +565,7 @@ static void window_loadsave_scrollpaint() } } -static int strcicmp(char const *a, char const *b) +static int compare_string_case_insensitive(char const *a, char const *b) { for (;; a++, b++) { int d = tolower(*a) - tolower(*b); @@ -584,15 +584,15 @@ static int list_item_sort(const void *a, const void *b) switch (gConfigGeneral.load_save_sort){ case SORT_NAME_ASCENDING: - return strcicmp(itemA->name, itemB->name); + return compare_string_case_insensitive(itemA->name, itemB->name); case SORT_NAME_DESCENDING: - return -strcicmp(itemA->name, itemB->name); + return -compare_string_case_insensitive(itemA->name, itemB->name); case SORT_DATE_DESCENDING: return (int) -difftime(itemA->date_modified, itemB->date_modified); case SORT_DATE_ASCENDING: return (int) difftime(itemA->date_modified, itemB->date_modified); default: - return strcmp(itemA->name, itemB->name); + return compare_string_case_insensitive(itemA->name, itemB->name); } } From 7ed390b8c44927f870914d7d5546118fc85ed285 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 22 Jun 2015 15:12:19 +0200 Subject: [PATCH 0065/1173] Fix wrong colours in TD4 import, fixes #1420 --- src/ride/track.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ride/track.c b/src/ride/track.c index 7d4716707f..40b5864a87 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3290,7 +3290,7 @@ void game_command_place_track(int* eax, int* ebx, int* ecx, int* edx, int* esi, ride->entrance_style = track_design->entrance_style; } - if (version > 1){ + if (version >= 1){ for (int i = 0; i < 4; ++i){ ride->track_colour_main[i] = track_design->track_spine_colour[i]; ride->track_colour_additional[i] = track_design->track_rail_colour[i]; From 2fc23b008480ccca777c59c622950cc61548fac4 Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 22 Jun 2015 15:55:57 +0200 Subject: [PATCH 0066/1173] Add browsing drives on windows --- src/platform/platform.h | 4 ++ src/platform/windows.c | 4 ++ src/windows/loadsave.c | 121 +++++++++++++++++++++++++--------------- 3 files changed, 84 insertions(+), 45 deletions(-) diff --git a/src/platform/platform.h b/src/platform/platform.h index c0264e66dd..ca7ad50dfd 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -96,6 +96,10 @@ void platform_enumerate_files_end(int handle); int platform_enumerate_directories_begin(const char *directory); int platform_enumerate_directories_next(int handle, char *path); void platform_enumerate_directories_end(int handle); + +// Returns the bitmask of the GetLogicalDrives function for windows, 0 for other systems +int platform_get_drives(); + int platform_file_copy(const char *srcPath, const char *dstPath); int platform_file_move(const char *srcPath, const char *dstPath); int platform_file_delete(const char *path); diff --git a/src/platform/windows.c b/src/platform/windows.c index 2c5f9402e9..db17d1ffbc 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -266,6 +266,10 @@ void platform_enumerate_directories_end(int handle) enumFileInfo->active = 0; } +int platform_get_drives(){ + return GetLogicalDrives(); +} + int platform_file_copy(const char *srcPath, const char *dstPath) { return CopyFileA(srcPath, dstPath, TRUE); diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 2bcd719b15..976bcf1e88 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -370,8 +370,7 @@ static void window_loadsave_scrollmousedown() if (selectedItem >= w->no_list_items) return; - // Load or overwrite - if (_listItems[selectedItem].path[0] == 0) { + if (_listItems[selectedItem].type == TYPE_NEW_FILE) { rct_string_id templateStringId = 3165; char *templateString; @@ -380,7 +379,7 @@ static void window_loadsave_scrollmousedown() window_text_input_open(w, WIDX_SCROLL, STR_NONE, 2710, templateStringId, 0, 64); } else { - if (_listItems[selectedItem].path[strlen(_listItems[selectedItem].path) - 1] == platform_get_path_separator()){ + if (_listItems[selectedItem].type == TYPE_DIRECTORY || _listItems[selectedItem].type == TYPE_UP){ // The selected item is a folder int includeNewItem; @@ -397,6 +396,8 @@ static void window_loadsave_scrollmousedown() w->no_list_items = _listItemsCount; } else { + // TYPE_FILE + // Load or overwrite if ((_loadsaveType & 1) == LOADSAVETYPE_SAVE) window_overwrite_prompt_open(_listItems[selectedItem].name, _listItems[selectedItem].path); else @@ -628,6 +629,8 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co _listItems = (loadsave_list_item*)malloc(listItemCapacity * sizeof(loadsave_list_item)); _listItemsCount = 0; + bool drivesList = false; + if (browsable) { int directoryLength = strlen(directory); int topLevel = 1; @@ -652,6 +655,13 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co strncpy(listItem->path, directory, lastSlash + 1); listItem->type = TYPE_UP; _listItemsCount++; + } else if (platform_get_drives() != 0 && directory[0] != '\0'){ + includeNewItem = false; + listItem = &_listItems[_listItemsCount]; + strncpy(listItem->name, language_get_string(2718), sizeof(listItem->name)); + memset(listItem->path, '\0', MAX_PATH); + listItem->type = TYPE_UP; + _listItemsCount++; } } @@ -664,50 +674,71 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co } int sortStartIndex = _listItemsCount; - fileEnumHandle = platform_enumerate_directories_begin(directory); - while (platform_enumerate_directories_next(fileEnumHandle, subDir)){ - if (listItemCapacity <= _listItemsCount) { - listItemCapacity *= 2; - _listItems = realloc(_listItems, listItemCapacity * sizeof(loadsave_list_item)); - } - listItem = &_listItems[_listItemsCount]; - memset(listItem->path, '\0', MAX_PATH); - strncpy(listItem->path, directory, MAX_PATH); - strncat(listItem->path, subDir, MAX_PATH); - strncpy(listItem->name, subDir, sizeof(listItem->name)); - listItem->type = TYPE_DIRECTORY; - _listItemsCount++; + if (directory[0] != '\0'){ + fileEnumHandle = platform_enumerate_directories_begin(directory); + while (platform_enumerate_directories_next(fileEnumHandle, subDir)){ + if (listItemCapacity <= _listItemsCount) { + listItemCapacity *= 2; + _listItems = realloc(_listItems, listItemCapacity * sizeof(loadsave_list_item)); + } + + listItem = &_listItems[_listItemsCount]; + memset(listItem->path, '\0', MAX_PATH); + strncpy(listItem->path, directory, MAX_PATH); + strncat(listItem->path, subDir, MAX_PATH); + strncpy(listItem->name, subDir, sizeof(listItem->name)); + listItem->type = TYPE_DIRECTORY; + _listItemsCount++; + } + platform_enumerate_files_end(fileEnumHandle); + window_loadsave_sort_list(sortStartIndex, _listItemsCount - 1); + + sortStartIndex = _listItemsCount; + fileEnumHandle = platform_enumerate_files_begin(filter); + while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) { + if (listItemCapacity <= _listItemsCount) { + listItemCapacity *= 2; + _listItems = realloc(_listItems, listItemCapacity * sizeof(loadsave_list_item)); + } + + listItem = &_listItems[_listItemsCount]; + strncpy(listItem->path, directory, sizeof(listItem->path)); + strncat(listItem->path, fileInfo.path, sizeof(listItem->path)); + listItem->type = TYPE_FILE; + listItem->date_modified = platform_file_get_modified_time(listItem->path); + + src = fileInfo.path; + dst = listItem->name; + i = 0; + while (*src != 0 && *src != '.' && i < sizeof(listItem->name) - 1) { + *dst++ = *src++; + i++; + } + *dst = 0; + + _listItemsCount++; + } + platform_enumerate_files_end(fileEnumHandle); + } else { + for (int x = 0; x < 32; x++){ + if (listItemCapacity <= _listItemsCount) { + listItemCapacity *= 2; + _listItems = realloc(_listItems, listItemCapacity * sizeof(loadsave_list_item)); + } + + if (platform_get_drives() & (1 << (x))){ + listItem = &_listItems[_listItemsCount]; + memset(listItem->path, '\0', MAX_PATH); + listItem->path[0] = 'A' + x; + listItem->path[1] = ':'; + listItem->path[2] = platform_get_path_separator(); + strcpy(listItem->name, listItem->path); + listItem->type = TYPE_DIRECTORY; + _listItemsCount++; + } + } } - platform_enumerate_files_end(fileEnumHandle); - window_loadsave_sort_list(sortStartIndex, _listItemsCount - 1); - - sortStartIndex = _listItemsCount; - fileEnumHandle = platform_enumerate_files_begin(filter); - while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) { - if (listItemCapacity <= _listItemsCount) { - listItemCapacity *= 2; - _listItems = realloc(_listItems, listItemCapacity * sizeof(loadsave_list_item)); - } - - listItem = &_listItems[_listItemsCount]; - strncpy(listItem->path, directory, sizeof(listItem->path)); - strncat(listItem->path, fileInfo.path, sizeof(listItem->path)); - listItem->type = TYPE_FILE; - listItem->date_modified = platform_file_get_modified_time(listItem->path); - - src = fileInfo.path; - dst = listItem->name; - i = 0; - while (*src != 0 && *src != '.' && i < sizeof(listItem->name) - 1) { - *dst++ = *src++; - i++; - } - *dst = 0; - - _listItemsCount++; - } - platform_enumerate_files_end(fileEnumHandle); window_loadsave_sort_list(sortStartIndex, _listItemsCount - 1); } From 825b165db5234147a561b645f8da552a8c50f4a6 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Mon, 22 Jun 2015 15:49:19 -0400 Subject: [PATCH 0067/1173] Reserve Strings 5377-5426 --- data/language/english_uk.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 09ac4112be..48dec2c6b4 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3709,4 +3709,5 @@ STR_5372 :Invert right mouse dragging STR_5373 :Name {STRINGID} STR_5374 :Date {STRINGID} STR_5375 :{UP} -STR_5376 :{DOWN} \ No newline at end of file +STR_5376 :{DOWN} +#Strings 5377-5426 Reserved \ No newline at end of file From 592e266411438aadea46f461fdee2b04224ac34f Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Mon, 22 Jun 2015 16:23:54 -0400 Subject: [PATCH 0068/1173] Reserved more strings (up to 5440) --- data/language/english_uk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 48dec2c6b4..186ed63a0e 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3710,4 +3710,4 @@ STR_5373 :Name {STRINGID} STR_5374 :Date {STRINGID} STR_5375 :{UP} STR_5376 :{DOWN} -#Strings 5377-5426 Reserved \ No newline at end of file +#Strings 5377-5440 Reserved \ No newline at end of file From 9701b1e0f6662d0f400aa53d5dda7e16b9e57df7 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 23 Jun 2015 02:37:06 +0100 Subject: [PATCH 0069/1173] fix warnings --- src/world/map.c | 4 ++-- src/world/map.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index c4dfe17bbc..31262ad01c 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -65,7 +65,7 @@ static void map_set_grass_length(int x, int y, rct_map_element *mapElement, int static void sub_68ADBC(); static void sub_68AE2A(int x, int y); -void rotate_map_coordinates(sint16* x, sint16* y, uint8 rotation){ +void rotate_map_coordinates(sint16* x, sint16* y, int rotation){ int temp; switch (rotation){ case MAP_ELEMENT_DIRECTION_WEST: @@ -87,7 +87,7 @@ void rotate_map_coordinates(sint16* x, sint16* y, uint8 rotation){ } } -rct_xy16 coordinate_3d_to_2d(const rct_xyz16* coordinate_3d, uint8 rotation){ +rct_xy16 coordinate_3d_to_2d(const rct_xyz16* coordinate_3d, int rotation){ rct_xy16 coordinate_2d; switch (rotation){ diff --git a/src/world/map.h b/src/world/map.h index c1f1c9de23..6fcf3df8b2 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -282,8 +282,8 @@ int sub_68B044(); rct_map_element *map_element_insert(int x, int y, int z, int flags); int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *clearFunc, uint8 bl); int map_can_construct_at(int x, int y, int zLow, int zHigh, uint8 bl); -void rotate_map_coordinates(sint16* x, sint16* y, uint8 rotation); -rct_xy16 coordinate_3d_to_2d(const rct_xyz16* coordinate_3d, uint8 rotation); +void rotate_map_coordinates(sint16* x, sint16* y, int rotation); +rct_xy16 coordinate_3d_to_2d(const rct_xyz16* coordinate_3d, int rotation); money32 map_clear_scenery(int x0, int y0, int x1, int y1, int flags); money32 lower_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags); money32 raise_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags); From 086370a7fc56f0f85e90f02e688887e24bf1ae25 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 23 Jun 2015 02:58:03 +0100 Subject: [PATCH 0070/1173] fix #1429 --- src/world/map.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/world/map.c b/src/world/map.c index 31262ad01c..fd40301cd3 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2324,7 +2324,17 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, RCT2_GLOBAL(0x00141F722, uint8) += fence->wall.height; if (!(flags & (1 << 7))){ - if (0x100 & RCT2_CALLPROC_X(0x006E5C1A, position.x, flags | (fence_type << 8), position.y, 0, 0, 0, 0)){ + if ( + RCT2_CALLPROC_X(0x006E5C1A, + position.x, + edge, + position.y, + RCT2_GLOBAL(0x00141F721, uint8) | (RCT2_GLOBAL(0x00141F722, uint8) << 8), + 0, + (int)fence, + 0 + ) & 0x100 + ) { *ebx = MONEY32_UNDEFINED; return; } From e39505e23d0a89a9415e3b5c66f158d64c42d6f2 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 23 Jun 2015 04:00:15 +0100 Subject: [PATCH 0071/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 8 ++++++++ data/language/english_us.txt | 4 ++++ data/language/german.txt | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 12496041f2..4dee99e118 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3698,3 +3698,11 @@ STR_5365 :{BLACK}Snelheid werknemers: STR_5366 :Normaal STR_5367 :Snel STR_5368 :Crashstatus weg +STR_5369 :Parkparameters... +STR_5370 :{SMALLFONT}{BLACK}Klik op deze knop om park-{NEWLINE}parameters zoals verboden,{NEWLINE}bezoekersgenerering en geld aan te passen. +STR_5371 :Objectselectie +STR_5372 :Sleeprichting van rechtermuisknop omkeren +STR_5373 :Naam {STRINGID} +STR_5374 :Datum {STRINGID} +STR_5375 :{UP} +STR_5376 :{DOWN} diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 3569127842..d82fe466aa 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3707,3 +3707,7 @@ STR_5365 :{BLACK}Staff speed: STR_5366 :Normal STR_5367 :Fast STR_5368 :Reset crash status +STR_5369 :Park parameters... +STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. +STR_5371 :Object Selection +STR_5372 :Invert right mouse dragging diff --git a/data/language/german.txt b/data/language/german.txt index 5dc14bdf30..01864bc2dd 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3704,3 +3704,9 @@ STR_5367 :Schnell STR_5368 :Unfallstatus entf. STR_5369 :Parkparameter... STR_5370 :{SMALLFONT}{BLACK}Klicken Sie diese Schaltfläche um Parkparameter, wie Einschränkungen, Besuchergenerierung und Geld,{NEWLINE}zu bearbeiten +STR_5371 :Objektauswahl +STR_5372 :Ziehen mit rechter Maustaste umkehren +STR_5373 :Name {STRINGID} +STR_5374 :Datum {STRINGID} +STR_5375 :{UP} +STR_5376 :{DOWN} From 6d05adb43fe12006a0c0eecf11d9e2e5d8098409 Mon Sep 17 00:00:00 2001 From: Simone Ferrini Date: Tue, 23 Jun 2015 22:23:30 +0200 Subject: [PATCH 0072/1173] Added missing va_end --- src/interface/console.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/console.c b/src/interface/console.c index 51265e9eeb..5baddb4d65 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -310,8 +310,8 @@ void console_printf(const char *format, ...) { va_list list; va_start(list, format); - vsprintf(_consolePrintfBuffer, format, list); + va_end(list); console_writeline(_consolePrintfBuffer); } From b40be2aba13430560ce9c303c94d86cd7409a532 Mon Sep 17 00:00:00 2001 From: Maikel Stuivenberg Date: Wed, 24 Jun 2015 01:54:59 +0200 Subject: [PATCH 0073/1173] Fix border issue #1428 --- src/windows/cheats.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 205d4a6a7c..b2f557e81b 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -1109,8 +1109,8 @@ static void window_cheats_set_page(rct_window *w, int page) window_invalidate(w); w->height = maxY; - w->widgets[WIDX_BACKGROUND].bottom = maxY; - w->widgets[WIDX_PAGE_BACKGROUND].bottom = maxY; + w->widgets[WIDX_BACKGROUND].bottom = maxY - 1; + w->widgets[WIDX_PAGE_BACKGROUND].bottom = maxY - 1; window_invalidate(w); } From a6225ebf06c3fc44dc74d8d88e8b6ea4d90f7d19 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 24 Jun 2015 12:41:19 +0200 Subject: [PATCH 0074/1173] Add option to select by track type (RCT1 style); correct misspellings of 'separate' --- data/language/english_uk.txt | 70 +++---- src/config.c | 2 +- src/config.h | 2 +- src/drawing/sprite.c | 4 +- src/localisation/localisation.c | 6 +- src/management/research.c | 34 ++-- src/management/research.h | 6 +- src/object.c | 26 ++- src/object_list.c | 2 +- src/platform/windows.c | 8 +- src/rct1.c | 279 ++++++++++++++++++++++++++- src/rct1.h | 5 +- src/ride/ride.h | 4 +- src/ride/track.c | 6 +- src/windows/editor_inventions_list.c | 44 ++--- src/windows/loadsave.c | 10 +- src/windows/new_ride.c | 39 +++- src/windows/options.c | 14 +- src/windows/research.c | 6 +- src/windows/ride.c | 6 +- src/windows/top_toolbar.c | 6 +- src/windows/track_list.c | 2 +- 22 files changed, 455 insertions(+), 126 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 186ed63a0e..fa2d6ccb63 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 : -STR_0513 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :A looping roller coaster where the riders ride in a standing position STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners -STR_0515 : +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track STR_0518 :Passengers travel in electric trains along a monorail track STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners -STR_0520 : -STR_0521 : -STR_0522 : +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them STR_0523 :Riders travel slowly in powered vehicles along a track-based route STR_0524 : -STR_0525 : -STR_0526 : +STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops -STR_0528 : -STR_0529 : +STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themes roller coaster trains career along steel roller coaster track made to look like old railway track STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again -STR_0531 : +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_0532 : STR_0533 : -STR_0534 : -STR_0535 : -STR_0536 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids STR_0537 : STR_0538 : STR_0539 : @@ -556,14 +556,14 @@ STR_0551 : STR_0552 : STR_0553 : STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station -STR_0555 : -STR_0556 : +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity @@ -572,38 +572,38 @@ STR_0567 :Sitting in seats suspended either side of the track, riders are pit STR_0568 : STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air STR_0570 : -STR_0571 : -STR_0572 : -STR_0573 : -STR_0574 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground STR_0575 :Powered trains hanging from a single rail transport people around the park STR_0576 : -STR_0577 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists STR_0579 : -STR_0580 : -STR_0581 : +STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes STR_0582 : STR_0583 : -STR_0584 : -STR_0585 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections -STR_0587 : -STR_0588 : +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops STR_0589 : -STR_0590 : -STR_0591 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track STR_0599 :A compact roller coaster with individual cars and smooth twisting drops -STR_0600 : +STR_0600 :Powered mine trains career along a smooth and twisted track layout STR_0601 : -STR_0602 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions STR_0603 :Guest {INT32} STR_0604 :Guest {INT32} STR_0605 :Guest {INT32} @@ -3455,7 +3455,7 @@ STR_3446 :Cancel Patrol Area # New strings, cleaner STR_5120 :Show finances button on toolbar STR_5121 :Show research button on toolbar -STR_5122 :Show all vehicles sharing a track/ride type +STR_5122 :Select rides by track type (like in RCT1) STR_5123 :Renew rides STR_5124 :No Six Flags STR_5125 :All destructable @@ -3710,4 +3710,4 @@ STR_5373 :Name {STRINGID} STR_5374 :Date {STRINGID} STR_5375 :{UP} STR_5376 :{DOWN} -#Strings 5377-5440 Reserved \ No newline at end of file +#Strings 5377-5440 Reserved diff --git a/src/config.c b/src/config.c index 37f32c9b60..36a16999e3 100644 --- a/src/config.c +++ b/src/config.c @@ -188,7 +188,7 @@ config_property_definition _interfaceDefinitions[] = { { offsetof(interface_configuration, toolbar_show_finances), "toolbar_show_finances", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(interface_configuration, toolbar_show_research), "toolbar_show_research", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, { offsetof(interface_configuration, toolbar_show_cheats), "toolbar_show_cheats", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, - { offsetof(interface_configuration, allow_subtype_switching), "allow_subtype_switching", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(interface_configuration, select_by_track_type), "select_by_track_type", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(interface_configuration, console_small_font), "console_small_font", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(interface_configuration, current_theme_preset), "current_theme", CONFIG_VALUE_TYPE_STRING, { .value_string = "*RCT2" }, NULL }, }; diff --git a/src/config.h b/src/config.h index 0ad455ff07..b7469a7ab9 100644 --- a/src/config.h +++ b/src/config.h @@ -159,7 +159,7 @@ typedef struct { uint8 toolbar_show_finances; uint8 toolbar_show_research; uint8 toolbar_show_cheats; - uint8 allow_subtype_switching; + uint8 select_by_track_type; uint8 console_small_font; utf8string current_theme_preset; } interface_configuration; diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index c5ddced9ed..8fee10a0c7 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -495,7 +495,7 @@ void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, in return; } - //Its used super often so we will define it to a seperate variable. + //Its used super often so we will define it to a separate variable. int zoom_level = dpi->zoom_level; int zoom_amount = 1 << zoom_level; int zoom_mask = 0xFFFFFFFF << zoom_level; @@ -649,4 +649,4 @@ void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, in gfx_bmp_sprite_to_buffer(palette_pointer, unknown_pointer, source_pointer, dest_pointer, g1_source, dpi, height, width, image_type); free(new_source_pointer_start); return; -} \ No newline at end of file +} diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 01cb13e66c..2a950495bf 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -193,7 +193,7 @@ void format_comma_separated_integer(char **dest, long long value) // Groups of three digits, right to left groupIndex = 0; while (value > 0) { - // Append group seperator + // Append group separator if (groupIndex == 3) { groupIndex = 0; @@ -261,7 +261,7 @@ void format_comma_separated_fixed_2dp(char **dest, long long value) // Groups of three digits, right to left groupIndex = 0; while (value > 0) { - // Append group seperator + // Append group separator if (groupIndex == 3) { groupIndex = 0; @@ -781,4 +781,4 @@ int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength) // TODO this supports only a maximum of 512 characters MultiByteToWideChar(CP_ACP, 0, src, -1, intermediateBuffer, 512); return WideCharToMultiByte(CP_UTF8, 0, intermediateBuffer, -1, dst, maxBufferLength, NULL, NULL); -} \ No newline at end of file +} diff --git a/src/management/research.c b/src/management/research.c index 383c21750a..97539e8727 100644 --- a/src/management/research.c +++ b/src/management/research.c @@ -44,7 +44,7 @@ bool gSilentResearch = false; */ void research_reset_items() { - gResearchItems[0].entryIndex = RESEARCHED_ITEMS_SEPERATOR; + gResearchItems[0].entryIndex = RESEARCHED_ITEMS_SEPARATOR; gResearchItems[1].entryIndex = RESEARCHED_ITEMS_END; gResearchItems[2].entryIndex = RESEARCHED_ITEMS_END_2; } @@ -57,7 +57,7 @@ void research_update_uncompleted_types() { int uncompletedResearchTypes = 0; rct_research_item *researchItem = gResearchItems; - while (researchItem++->entryIndex != RESEARCHED_ITEMS_SEPERATOR); + while (researchItem++->entryIndex != RESEARCHED_ITEMS_SEPARATOR); for (; researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++) uncompletedResearchTypes |= (1 << researchItem->category); @@ -115,7 +115,7 @@ static void research_next_design() // Skip already researched items firstUnresearchedItem = gResearchItems; - while (firstUnresearchedItem->entryIndex != RESEARCHED_ITEMS_SEPERATOR) + while (firstUnresearchedItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR) firstUnresearchedItem++; ignoreActiveResearchTypes = 0; @@ -145,13 +145,13 @@ static void research_next_design() RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) = RESEARCH_STAGE_DESIGNING; - // Bubble research item up until it is above the researched items seperator + // Bubble research item up until it is above the researched items separator do { tmp = *researchItem; *researchItem = *(researchItem - 1); *(researchItem - 1) = tmp; researchItem--; - } while ((researchItem + 1)->entryIndex != RESEARCHED_ITEMS_SEPERATOR); + } while ((researchItem + 1)->entryIndex != RESEARCHED_ITEMS_SEPARATOR); research_invalidate_related_windows(); } @@ -182,12 +182,12 @@ void research_finish_item(sint32 entryIndex) RCT2_ADDRESS(0x01357644, uint32)[ebx] = RCT2_ADDRESS(0x0097C5D4, uint32)[ebx]; } RCT2_ADDRESS(0x001357424, uint32)[rideEntryIndex >> 5] |= 1 << (rideEntryIndex & 0x1F); - if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE)) { + if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)) { for (i = 0; i < 128; i++) { rideEntry2 = GET_RIDE_ENTRY(i); if (rideEntry2 == (rct_ride_type*)-1) continue; - if (rideEntry2->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE) + if (rideEntry2->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) continue; if (rideEntry2->ride_type[0] == base_ride_type || rideEntry2->ride_type[1] == base_ride_type || rideEntry2->ride_type[2] == base_ride_type) @@ -197,7 +197,7 @@ void research_finish_item(sint32 entryIndex) // I don't think 0x009AC06C is ever not 0, so probably redundant if (RCT2_GLOBAL(0x009AC06C, uint8) == 0) { - RCT2_GLOBAL(0x013CE952, rct_string_id) = rideEntry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME ? + RCT2_GLOBAL(0x013CE952, rct_string_id) = rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME ? rideEntry->name : base_ride_type + 2; if (!gSilentResearch) news_item_add_to_queue(NEWS_ITEM_RESEARCH, 2249, entryIndex); @@ -320,7 +320,7 @@ void sub_684AC3(){ } - for (research = gResearchItems; research->entryIndex != RESEARCHED_ITEMS_SEPERATOR; research++){ + for (research = gResearchItems; research->entryIndex != RESEARCHED_ITEMS_SEPARATOR; research++){ research_finish_item(research->entryIndex); } @@ -346,25 +346,25 @@ void research_remove_non_separate_vehicle_types() loopBeginning: if ( researchItem != gResearchItems && - researchItem->entryIndex != RESEARCHED_ITEMS_SEPERATOR && + researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR && researchItem->entryIndex != RESEARCHED_ITEMS_END && researchItem->entryIndex >= 0x10000 ) { rct_ride_type *rideEntry = GET_RIDE_ENTRY(researchItem->entryIndex & 0xFF); if (!(rideEntry->flags & - (RIDE_ENTRY_FLAG_SEPERATE_RIDE | - RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME))) { + (RIDE_ENTRY_FLAG_SEPARATE_RIDE | + RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME))) { // Check if ride type already exists further up for a vehicle type that isn't displayed as a ride researchItem2 = researchItem - 1; do { if ( - researchItem2->entryIndex != RESEARCHED_ITEMS_SEPERATOR && + researchItem2->entryIndex != RESEARCHED_ITEMS_SEPARATOR && researchItem2->entryIndex >= 0x10000 ) { rideEntry = GET_RIDE_ENTRY(researchItem2->entryIndex & 0xFF); if (!(rideEntry->flags & - (RIDE_ENTRY_FLAG_SEPERATE_RIDE | - RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME))) { + (RIDE_ENTRY_FLAG_SEPARATE_RIDE | + RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME))) { if (((researchItem->entryIndex >> 8) & 0xFF) == ((researchItem2->entryIndex >> 8) & 0xFF)) { // Remove item @@ -418,7 +418,7 @@ static void research_insert_researched(int entryIndex, int category) researchItem = gResearchItems; do { - if (researchItem->entryIndex == RESEARCHED_ITEMS_SEPERATOR) { + if (researchItem->entryIndex == RESEARCHED_ITEMS_SEPARATOR) { // Insert slot researchItem2 = researchItem; while (researchItem2->entryIndex != RESEARCHED_ITEMS_END_2) { @@ -551,4 +551,4 @@ void game_command_set_research_funding(int* eax, int* ebx, int* ecx, int* edx, i } *ebx = 0; -} \ No newline at end of file +} diff --git a/src/management/research.h b/src/management/research.h index f2a0d4b3f6..6d6de71a0e 100644 --- a/src/management/research.h +++ b/src/management/research.h @@ -35,8 +35,8 @@ enum{ }; // Everything before this point has been researched -#define RESEARCHED_ITEMS_SEPERATOR -1 -// Everything before this point and after seperator still requires research +#define RESEARCHED_ITEMS_SEPARATOR -1 +// Everything before this point and after separator still requires research #define RESEARCHED_ITEMS_END -2 // Extra end of list entry. Unsure why? #define RESEARCHED_ITEMS_END_2 -3 @@ -85,4 +85,4 @@ void research_finish_item(sint32 entryIndex); void research_insert(int researched, int entryIndex, int category); void research_remove(sint32 entryIndex); -#endif \ No newline at end of file +#endif diff --git a/src/object.c b/src/object.c index 7e6609ec78..74f41deaf3 100644 --- a/src/object.c +++ b/src/object.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "addresses.h" +#include "config.h" #include "localisation/localisation.h" #include "object.h" #include "platform/platform.h" @@ -425,6 +426,25 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp uint8_t* chunk = (uint8*)(ride_type + 1); ride_type->name = object_get_localised_text(&chunk, ecx, ebx, 0); ride_type->description = object_get_localised_text(&chunk, ecx, ebx, 1); + + if(gConfigInterface.select_by_track_type) { + ride_type->enabledTrackPieces=0xFFFFFFFF; + ride_type->enabledTrackPiecesAdditional=0xFFFFFFFF; + + bool remove_flag=true; + for(int j=0;j<3;j++) + { + if(ride_type_has_flag(ride_type->ride_type[j], RIDE_TYPE_FLAG_FLAT_RIDE)) + remove_flag=false; + if(ride_type->ride_type[j]==RIDE_TYPE_MAZE || ride_type->ride_type[j]==RIDE_TYPE_MINI_GOLF) + remove_flag=false; + } + if (remove_flag) { + ride_type->flags &=~RIDE_ENTRY_FLAG_SEPARATE_RIDE; + ride_type->flags &=~RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME; + } + } + object_get_localised_text(&chunk, ecx, ebx, 2); // Offset to Unknown struct ride_type->var_1AE = (uint32_t)chunk; @@ -677,7 +697,7 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp int di = ride_type->ride_type[0] | (ride_type->ride_type[1] << 8) | (ride_type->ride_type[2] << 16); - if (ride_type->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME) di |= 0x1000000; + if (ride_type->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) di |= 0x1000000; RCT2_GLOBAL(0xF433DD, uint32) = di; return 0;// flags; @@ -755,7 +775,7 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp int width = w->x + w->width - x - 4; int format_args = ride_type->description; - if (!(ride_type->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME)) + if (!(ride_type->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) { format_args = ride_type->ride_type[0]; if ((format_args & 0xFF) == 0xFF) @@ -1645,4 +1665,4 @@ char *object_get_name(rct_object_entry *entry) pos += 4; return pos; -} \ No newline at end of file +} diff --git a/src/object_list.c b/src/object_list.c index e1493345ac..ad62ae9ba7 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -735,7 +735,7 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in // When made of two parts i.e Wooden Roller Coaster (Dream Woodie Cars) - if ((objectType == OBJECT_TYPE_RIDE) && !((((rct_ride_type*)chunk)->flags) & RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME)) { + if ((objectType == OBJECT_TYPE_RIDE) && !((((rct_ride_type*)chunk)->flags) & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) { rct_ride_type* ride_type = (rct_ride_type*)chunk; rct_string_id obj_string = ride_type->ride_type[0]; if (obj_string == 0xFF){ diff --git a/src/platform/windows.c b/src/platform/windows.c index db17d1ffbc..558fa62918 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -320,15 +320,15 @@ unsigned int platform_get_ticks() void platform_get_user_directory(char *outPath, const char *subDirectory) { - char seperator[2] = { platform_get_path_separator(), 0 }; + char separator[2] = { platform_get_path_separator(), 0 }; if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, NULL, 0, outPath))) { - strcat(outPath, seperator); + strcat(outPath, separator); strcat(outPath, "OpenRCT2"); - strcat(outPath, seperator); + strcat(outPath, separator); if (subDirectory != NULL && subDirectory[0] != 0) { strcat(outPath, subDirectory); - strcat(outPath, seperator); + strcat(outPath, separator); } } else { outPath[0] = 0; diff --git a/src/rct1.c b/src/rct1.c index 3dfd27ca60..14dde13b05 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -25,6 +25,7 @@ #include "management/finance.h" #include "object.h" #include "rct1.h" +#include "ride/ride.h" #include "scenario.h" #include "util/sawyercoding.h" #include "util/util.h" @@ -438,7 +439,7 @@ static void rct1_reset_research() rct_research_item *researchItem; researchItem = gResearchItems; - researchItem->entryIndex = RESEARCHED_ITEMS_SEPERATOR; + researchItem->entryIndex = RESEARCHED_ITEMS_SEPARATOR; researchItem++; researchItem->entryIndex = RESEARCHED_ITEMS_END; researchItem++; @@ -1102,4 +1103,278 @@ static const RCT1DefaultObjectsGroup RCT1DefaultObjects[10] = { { RCT1DefaultObjectsWater, countof(RCT1DefaultObjectsWater) } }; -#pragma endregion \ No newline at end of file +// Keep these in the same order as gVehicleHierarchies +char *SpiralRCObjectOrder[] = { "SPDRCR "}; +char *StandupRCObjectOrder[] = { "TOGST "}; +char *SuspendedSWRCObjectOrder[] = { "ARRSW1 ", "VEKVAMP ", "ARRSW2 "}; +char *InvertedRCObjectOrder[] = { "NEMT "}; +char *JuniorCoasterObjectOrder[] = { "ZLDB ", "ZLOG "}; +char *MiniatureRailwayObjectOrder[] = { "NRL ", "NRL2 ", "AML1 ", "TRAM1 "}; +char *MonorailObjectOrder[] = { "MONO1 ", "MONO2 ", "MONO3 "}; +char *MiniSuspendedRCObjectOrder[] = { "BATFL ", "SKYTR "}; +char *BoatRideObjectOrder[] = { "RBOAT ", "BBOAT ", "CBOAT ", "SWANS ", "TRIKE ","JSKI "}; +char *WoodenWMObjectOrder[] = { "WMOUSE ", "WMMINE "}; +char *SteeplechaseObjectOrder[] = { "STEEP1 ", "STEEP2 ", "SBOX "}; +char *CarRideObjectOrder[] = { "RCR ", "SPCAR ", "TRUCK1 ", "VCR ", "CTCAR "}; +char *LaunchedFFObjectOrder[] = { "SSC1 "}; +char *BobsleighRCObjectOrder[] = { "BOB1 ", "INTBOB "}; +char *ObservationTowerObjectOrder[] = { "OBS1 ", "OBS2 "}; +char *LoopingRCObjectOrder[] = { "SCHT1 "}; +char *DinghySlideObjectOrder[] = { "DING1 "}; +char *MineTrainRCObjectOrder[] = { "AMT1 "}; +char *ChairliftObjectOrder[] = { "CLIFT1 ", "CLIFT2 "}; +char *CorkscrewRCObjectOrder[] = { "ARRT1 ", "ARRT2 "}; +char *GoKartsObjectOrder[] = { "KART1 "}; +char *LogFlumeObjectOrder[] = { "LFB1 "}; +char *RiverRapidsObjectOrder[] = { "RAPBOAT "}; +char *ReverseFreefallRCObjectOrder[]= { "REVF1 "}; +char *LiftObjectOrder[] = { "LIFT1 "}; +char *VerticalDropRCObjectOrder[] = { "BMVD "}; +char *GhostTrainObjectOrder[] = { "GTC ", "HMCAR "}; +char *TwisterRCObjectOrder[] = { "BMSD ", "BMSU ", "BMFL ", "BMRB ", "GOLTR "}; +char *WoodenRCObjectOrder[] = { "PTCT1 ", "MFT ", "PTCT2 "}; +char *SideFrictionRCObjectOrder[] = { "SFRIC1 "}; +char *SteelWildMouseObjectOrder[] = { "SMC1 ", "SMC2 ", "WMSPIN "}; +char *MultiDimensionRCObjectOrder[] = { "ARRX "}; +char *FlyingRCObjectOrder[] = { "BMAIR "}; +char *VirginiaReelRCObjectOrder[] = { "VREEL "}; +char *SplashBoatsObjectOrder[] = { "SPBOAT "}; +char *MiniHelicoptersObjectOrder[] = { "HELICAR "}; +char *LayDownRCObjectOrder[] = { "VEKST "}; +char *SuspendedMonorailObjectOrder[]= { "SMONO "}; +char *ReverserRCObjectOrder[] = { "REVCAR "}; +char *HeartlineTwisterObjectOrder[] = { "UTCAR ", "UTCARR "}; +char *GigaRCObjectOrder[] = { "INTST "}; +char *RotoDropObjectOrder[] = { "GDROP1 "}; +char *MonorailCyclesObjectOrder[] = { "MONBK "}; +char *CompactInvertedRCObjectOrder[]= { "SLCT ", "SLCFO ", "VEKDV "}; +char *WaterRCObjectOrder[] = { "CSTBOAT "}; +char *AirPoweredRCObjectOrder[] = { "THCAR "}; +char *InvertedHairpinRCObjectOrder[]= { "IVMC1 "}; +char *SubmarineRideObjectOrder[] = { "SUBMAR "}; +char *RiverRaftsObjectOrder[] = { "RFTBOAT "}; +char *InvertedImpulseRCObjectOrder[]= { "INTINV "}; +char *MiniRCObjectOrder[] = { "WCATC ", "RCKC ", "JSTAR1 "}; +char *MineRideRCObjectOrder[] = { "PMT1 "}; +char *LIMLaunchedRCObjectOrder[] = { "PREMT1 "}; + +char **gVehicleHierarchies[0x60] = { + SpiralRCObjectOrder, // 0 Spiral Roller coaster + StandupRCObjectOrder, // 1 Stand Up Coaster + SuspendedSWRCObjectOrder, // 2 Suspended Swinging + InvertedRCObjectOrder, // 3 Inverted + JuniorCoasterObjectOrder, // 4 Junior RC / Steel Mini Coaster + MiniatureRailwayObjectOrder, // 5 Mini Railroad + MonorailObjectOrder, // 6 Monorail + MiniSuspendedRCObjectOrder, // 7 Mini Suspended Coaster + BoatRideObjectOrder, // 8 Boat ride + WoodenWMObjectOrder, // 9 Wooden Wild Mine/Mouse + SteeplechaseObjectOrder, // a Steeplechase/Motorbike/Soap Box Derby + CarRideObjectOrder, // b Car Ride + LaunchedFFObjectOrder, // c Launched Freefall + BobsleighRCObjectOrder, // d Bobsleigh Coaster + ObservationTowerObjectOrder, // e Observation Tower + LoopingRCObjectOrder, // f Looping Roller Coaster + DinghySlideObjectOrder, // 10 Dinghy Slide + MineTrainRCObjectOrder, // 11 Mine Train Coaster + ChairliftObjectOrder, // 12 Chairlift + CorkscrewRCObjectOrder, // 13 Corkscrew Roller Coaster + NULL, // 14 Maze, N/A + NULL, // 15 Spiral Slide, N/A + GoKartsObjectOrder, // 16 Go Karts + LogFlumeObjectOrder, // 17 Log Flume + RiverRapidsObjectOrder, // 18 River Rapids + NULL, // 19 Dodgems, N/A + NULL, // 1a Pirate Ship, N/A + NULL, // 1b Swinging Inverter Ship, N/A + NULL, // 1c Food Stall, N/A + NULL, // 1d (none), N/A + NULL, // 1e Drink Stall, N/A + NULL, // 1f (none), N/A + NULL, // 20 Shop (all types), N/A + NULL, // 21 Merry Go Round, N/A + NULL, // 22 Balloon Stall (maybe), N/A + NULL, // 23 Information Kiosk, N/A + NULL, // 24 Bathroom, N/A + NULL, // 25 Ferris Wheel, N/A + NULL, // 26 Motion Simulator, N/A + NULL, // 27 3D Cinema, N/A + NULL, // 28 Top Spin, N/A + NULL, // 29 Space Rings, N/A + ReverseFreefallRCObjectOrder, // 2a Reverse Freefall Coaster + LiftObjectOrder, // 2b Lift + VerticalDropRCObjectOrder, // 2c Vertical Drop Roller Coaster + NULL, // 2d ATM, N/A + NULL, // 2e Twist, N/A + NULL, // 2f Haunted House, N/A + NULL, // 30 First Aid, N/A + NULL, // 31 Circus Show, N/A + GhostTrainObjectOrder, // 32 Ghost Train + TwisterRCObjectOrder, // 33 Twister Roller Coaster + WoodenRCObjectOrder, // 34 Wooden Roller Coaster + SideFrictionRCObjectOrder, // 35 Side-Friction Roller Coaster + SteelWildMouseObjectOrder, // 36 Steel Wild Mouse + MultiDimensionRCObjectOrder, // 37 Multi Dimension Coaster + NULL, // 38 (none), N/A + FlyingRCObjectOrder, // 39 Flying Roller Coaster + NULL, // 3a (none), N/A + VirginiaReelRCObjectOrder, // 3b Virginia Reel + SplashBoatsObjectOrder, // 3c Splash Boats + MiniHelicoptersObjectOrder, // 3d Mini Helicopters + LayDownRCObjectOrder, // 3e Lay-down Roller Coaster + SuspendedMonorailObjectOrder, // 3f Suspended Monorail + NULL, // 40 (none), N/A + ReverserRCObjectOrder, // 41 Reverser Roller Coaster + HeartlineTwisterObjectOrder, // 42 Heartline Twister Roller Coaster + NULL, // 43 Mini Golf, N/A + GigaRCObjectOrder, // 44 Giga Coaster + RotoDropObjectOrder, // 45 Roto-Drop + NULL, // 46 Flying Saucers, N/A + NULL, // 47 Crooked House, N/A + MonorailCyclesObjectOrder, // 48 Monorail Cycles + CompactInvertedRCObjectOrder, // 49 Compact Inverted Coaster + WaterRCObjectOrder, // 4a Water Coaster + AirPoweredRCObjectOrder, // 4b Air Powered Vertical Coaster + InvertedHairpinRCObjectOrder, // 4c Inverted Hairpin Coaster + NULL, // 4d Magic Carpet, N/A + SubmarineRideObjectOrder, // 4e Submarine Ride + RiverRaftsObjectOrder, // 4f River Rafts + NULL, // 50 (none), N/A + NULL, // 51 Enterprise, N/A + NULL, // 52 (none), N/A + NULL, // 53 (none), N/A + NULL, // 54 (none), N/A + NULL, // 55 (none), N/A + InvertedImpulseRCObjectOrder, // 56 Inverted Impulse Coaster + MiniRCObjectOrder, // 57 Mini Roller Coaster + MineRideRCObjectOrder, // 58 Mine Ride + NULL, // 59 Unknown Ride + LIMLaunchedRCObjectOrder, // 60 LIM Launched Roller Coaster +}; + +const uint8 gRideCategories[0x60] = { + 2, // Spiral Roller coaster + 2, // Stand Up Coaster + 2, // Suspended Swinging + 2, // Inverted + 2, // Steel Mini Coaster + 0, // Mini Railroad + 0, // Monorail + 2, // Mini Suspended Coaster + 4, // Boat ride + 2, // Wooden Wild Mine/Mouse + 2, // Steeplechase/Motorbike/Soap Box Derby + 1, // Car Ride + 3, // Launched Freefall + 2, // Bobsleigh Coaster + 1, // Observation Tower + 2, // Looping Roller Coaster + 4, // Dinghy Slide + 2, // Mine Train Coaster + 0, // Chairlift + 2, // Corkscrew Roller Coaster + 1, // Maze + 1, // Spiral Slide + 3, // Go Karts + 4, // Log Flume + 4, // River Rapids + 1, // Dodgems + 3, // Pirate Ship + 3, // Swinging Inverter Ship + 5, // Food Stall + 255, // (none) + 5, // Drink Stall + 255, // (none) + 5, // Shop (all types) + 1, // Merry Go Round + 5, // Balloon Stall (maybe) + 5, // Information Kiosk + 5, // Bathroom + 1, // Ferris Wheel + 3, // Motion Simulator + 3, // 3D Cinema + 3, // Top Spin + 1, // Space Rings + 2, // Reverse Freefall Coaster + 0, // Elevator + 2, // Vertical Drop Roller Coaster + 5, // ATM + 3, // Twist + 1, // Haunted House + 5, // First Aid + 1, // Circus Show + 1, // Ghost Train + 2, // Twister Roller Coaster + 2, // Wooden Roller Coaster + 2, // Side-Friction Roller Coaster + 2, // Wild Mouse + 2, // Multi Dimension Coaster + 255, // (none) + 2, // Flying Roller Coaster + 255, // (none) + 2, // Virginia Reel + 4, // Splash Boats + 1, // Mini Helicopters + 2, // Lay-down Roller Coaster + 0, // Suspended Monorail + 255, // (none) + 2, // Reverser Roller Coaster + 2, // Heartline Twister Roller Coaster + 1, // Mini Golf + 2, // Giga Coaster + 3, // Roto-Drop + 1, // Flying Saucers + 1, // Crooked House + 1, // Monorail Cycles + 2, // Compact Inverted Coaster + 2, // Water Coaster + 2, // Air Powered Vertical Coaster + 2, // Inverted Hairpin Coaster + 3, // Magic Carpet + 4, // Submarine Ride + 4, // River Rafts + 255, // (none) + 3, // Enterprise + 255, // (none) + 255, // (none) + 255, // (none) + 255, // (none) + 2, // Inverted Impulse Coaster + 2, // Mini Roller Coaster + 2, // Mine Ride + 255, //59 Unknown Ride + 2 // LIM Launched Roller Coaster +}; + +/* This function keeps a list of the preferred vehicle for every generic track type, out of the available vehicle types in the current game. + It determines which picture is shown on the new ride tab and which train type is selected by default.*/ +bool vehicleIsHigherInHierarchy(int track_type, char *currentVehicleName, char *comparedVehicleName) +{ + if(currentVehicleName==NULL || comparedVehicleName==NULL || gVehicleHierarchies[track_type]==NULL) { + return false; + } + + int currentVehicleHierarchy; + int comparedVehicleHierarchy; + + currentVehicleHierarchy=255; + comparedVehicleHierarchy=255; + + for(int i=0;iflags & - (RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME | - RIDE_ENTRY_FLAG_SEPERATE_RIDE)) + (RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME | + RIDE_ENTRY_FLAG_SEPARATE_RIDE)) continue; } else{ @@ -397,7 +397,7 @@ void track_load_list(ride_list_item item) if (item.type < 0x80){ rct_ride_type* ride_type = gRideTypeList[item.entry_index]; - if (!(ride_type->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE)){ + if (!(ride_type->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)){ item.entry_index = 0xFF; } } diff --git a/src/windows/editor_inventions_list.c b/src/windows/editor_inventions_list.c index de90fbf90b..cc5dd47865 100644 --- a/src/windows/editor_inventions_list.c +++ b/src/windows/editor_inventions_list.c @@ -198,14 +198,14 @@ static void research_rides_setup(){ rct_ride_type* ride_entry = GET_RIDE_ENTRY(object_index); uint8 master_found = 0; - if (!(ride_entry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE)){ + if (!(ride_entry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)){ for (uint8 rideType = 0; rideType < object_entry_group_counts[OBJECT_TYPE_RIDE]; rideType++){ rct_ride_type* master_ride = GET_RIDE_ENTRY(rideType); if (master_ride == NULL || (uint32)master_ride == 0xFFFFFFFF) continue; - if (master_ride->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE) + if (master_ride->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) continue; // If master ride not in use @@ -291,7 +291,7 @@ static void sub_685A79() research++){ // Clear the always researched flags. - if (research->entryIndex > RESEARCHED_ITEMS_SEPERATOR){ + if (research->entryIndex > RESEARCHED_ITEMS_SEPARATOR){ research->entryIndex &= 0x00FFFFFF; } } @@ -318,7 +318,7 @@ static rct_string_id research_item_get_name(uint32 researchItem) if (rideEntry == NULL || rideEntry == (rct_ride_type*)0xFFFFFFFF) return 0; - if (rideEntry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME) + if (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) return rideEntry->name; return ((researchItem >> 8) & 0xFF) + 2; @@ -334,7 +334,7 @@ static void research_items_shuffle() int i, ri, numNonResearchedItems; // Skip pre-researched items - for (researchItem = gResearchItems; researchItem->entryIndex != RESEARCHED_ITEMS_SEPERATOR; researchItem++) {} + for (researchItem = gResearchItems; researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR; researchItem++) {} researchItem++; researchOrderBase = researchItem; @@ -362,19 +362,19 @@ static void research_items_make_all_unresearched() int sorted; do { sorted = 1; - for (researchItem = gResearchItems; researchItem->entryIndex != RESEARCHED_ITEMS_SEPERATOR; researchItem++) { + for (researchItem = gResearchItems; researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR; researchItem++) { if (research_item_is_always_researched(researchItem)) continue; nextResearchItem = researchItem + 1; - if (nextResearchItem->entryIndex == RESEARCHED_ITEMS_SEPERATOR || research_item_is_always_researched(nextResearchItem)) { - // Bubble up always researched item or seperator + if (nextResearchItem->entryIndex == RESEARCHED_ITEMS_SEPARATOR || research_item_is_always_researched(nextResearchItem)) { + // Bubble up always researched item or separator researchItemTemp = *researchItem; *researchItem = *nextResearchItem; *nextResearchItem = researchItemTemp; sorted = 0; - if (researchItem->entryIndex == RESEARCHED_ITEMS_SEPERATOR) + if (researchItem->entryIndex == RESEARCHED_ITEMS_SEPARATOR) break; } } @@ -385,12 +385,12 @@ static void research_items_make_all_researched() { rct_research_item *researchItem, researchItemTemp; - // Find seperator - for (researchItem = gResearchItems; researchItem->entryIndex != RESEARCHED_ITEMS_SEPERATOR; researchItem++) { } + // Find separator + for (researchItem = gResearchItems; researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR; researchItem++) { } - // Move seperator below all items + // Move separator below all items for (; (researchItem + 1)->entryIndex != RESEARCHED_ITEMS_END; researchItem++) { - // Swap seperator with research item + // Swap separator with research item researchItemTemp = *researchItem; *researchItem = *(researchItem + 1); *(researchItem + 1) = researchItemTemp; @@ -450,11 +450,11 @@ static rct_research_item *window_editor_inventions_list_get_item_from_scroll_y(i if (scrollIndex != 0) { // Skip pre-researched items - for (; researchItem->entryIndex != RESEARCHED_ITEMS_SEPERATOR; researchItem++) { } + for (; researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR; researchItem++) { } researchItem++; } - for (; researchItem->entryIndex != RESEARCHED_ITEMS_SEPERATOR && researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++) { + for (; researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR && researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++) { y -= 10; if (y < 0) return researchItem; @@ -475,11 +475,11 @@ static rct_research_item *window_editor_inventions_list_get_item_from_scroll_y_i if (scrollIndex != 0) { // Skip pre-researched items - for (; researchItem->entryIndex != RESEARCHED_ITEMS_SEPERATOR; researchItem++) { } + for (; researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR; researchItem++) { } researchItem++; } - for (; researchItem->entryIndex != RESEARCHED_ITEMS_SEPERATOR && researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++) { + for (; researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR && researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++) { y -= 10; if (y < 0) return researchItem; @@ -627,7 +627,7 @@ static void window_editor_inventions_list_scrollgetheight() height = 0; // Count / skip pre-researched items - for (researchItem = gResearchItems; researchItem->entryIndex != RESEARCHED_ITEMS_SEPERATOR; researchItem++) + for (researchItem = gResearchItems; researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR; researchItem++) height += 10; if (scrollIndex == 1) { @@ -794,7 +794,7 @@ static void window_editor_inventions_list_paint() researchItem = _editorInventionsListDraggedItem; if (researchItem == NULL) researchItem = WindowHighlightedItem(w); - // If the research item is null or a list seperator. + // If the research item is null or a list separator. if (researchItem == NULL || researchItem->entryIndex < 0) return; @@ -855,11 +855,11 @@ static void window_editor_inventions_list_scrollpaint() if (scrollIndex == 1) { // Skip pre-researched items - for (; researchItem->entryIndex != RESEARCHED_ITEMS_SEPERATOR; researchItem++) { } + for (; researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR; researchItem++) { } researchItem++; researchItemEndMarker = RESEARCHED_ITEMS_END; } else { - researchItemEndMarker = RESEARCHED_ITEMS_SEPERATOR; + researchItemEndMarker = RESEARCHED_ITEMS_SEPARATOR; } // Since this is now a do while need to conteract the +10 @@ -886,7 +886,7 @@ static void window_editor_inventions_list_scrollpaint() colour = 14; } - if (researchItem->entryIndex == RESEARCHED_ITEMS_SEPERATOR || researchItem->entryIndex == RESEARCHED_ITEMS_END) + if (researchItem->entryIndex == RESEARCHED_ITEMS_SEPARATOR || researchItem->entryIndex == RESEARCHED_ITEMS_END) continue; if (researchItem == _editorInventionsListDraggedItem) diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 976bcf1e88..0d3e733e5c 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -508,19 +508,19 @@ static void shorten_path(char* path, char* buffer, int available_width){ return; } - // Count path seperators - int path_seperators = 0; + // Count path separators + int path_separators = 0; for (int x = 0; x < length; x++) if (path[x] == platform_get_path_separator()) - path_seperators++; + path_separators++; // TODO: Replace with unicode ellipsis when supported strcpy(buffer, "..."); - // Abreviate beginning with xth seperator + // Abreviate beginning with xth separator int begin = -1; - for (int x = 0; x < path_seperators; x++){ + for (int x = 0; x < path_separators; x++){ do { begin++; } while (path[begin] != platform_get_path_separator()); diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index 759486796d..df55ab7ef2 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -24,6 +24,8 @@ #include "../game.h" #include "../management/news_item.h" #include "../management/research.h" +#include "../object.h" +#include "../rct1.h" #include "../ride/ride.h" #include "../localisation/localisation.h" #include "../world/scenery.h" @@ -279,8 +281,9 @@ void window_new_ride_init_vars() { } /** + * rct2: 0x006B6F3E * - * rct2: 0x006B6F3E + * Note: When the user has selection by track type enabled, the categories are determined by the track type, not those in the rct_ride_type. */ static void window_new_ride_populate_list() { @@ -296,6 +299,14 @@ static void window_new_ride_populate_list() if (rideType == RIDE_TYPE_NULL) continue; + if(gConfigInterface.select_by_track_type) { + if(gRideCategories[rideType]!=currentCategory) + continue; + } + + char preferredVehicleName[9]; + strcpy(preferredVehicleName," "); + quadIndex = rideType >> 5; bitIndex = rideType & 0x1F; if (RCT2_ADDRESS(0x01357404, uint32)[quadIndex] & (1 << bitIndex)) { @@ -305,6 +316,9 @@ static void window_new_ride_populate_list() // For each ride entry for this ride type while (*rideEntryIndexPtr != 255) { uint8 rideEntryIndex = *rideEntryIndexPtr++; + char rideEntryName[9]; + memcpy(rideEntryName,object_entry_groups[OBJECT_TYPE_RIDE].entries[rideEntryIndex].name,8); + rideEntryName[8]=0; quadIndex = rideEntryIndex >> 5; bitIndex = rideEntryIndex & 0x1F; @@ -315,10 +329,27 @@ static void window_new_ride_populate_list() rct_ride_type *rideEntry = rideEntries[rideEntryIndex]; // Check if ride is in this category - if (currentCategory != rideEntry->category[0] && currentCategory != rideEntry->category[1]) + if (!gConfigInterface.select_by_track_type && (currentCategory != rideEntry->category[0] && currentCategory != rideEntry->category[1])) continue; - if (rideEntry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE) { + // Skip if the vehicle isn't the preferred vehicle for this generic track type + if(gConfigInterface.select_by_track_type && !(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)) { + if(strcmp(preferredVehicleName," \0")==0) { + strcpy(preferredVehicleName,rideEntryName); + preferredVehicleName[8]=0; + } + else { + if(vehicleIsHigherInHierarchy(rideType,preferredVehicleName,rideEntryName)) { + strcpy(preferredVehicleName,rideEntryName); + preferredVehicleName[8]=0; + } + else { + continue; + } + } + } + + if (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) { dh &= ~4; nextListItem->type = rideType; nextListItem->entry_index = rideEntryIndex; @@ -862,7 +893,7 @@ static void window_new_ride_paint_ride_information(rct_window *w, rct_drawpixeli // Ride name and description rct_string_id rideName = rideEntry->name; rct_string_id rideDescription = rideEntry->description; - if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME)) { + if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) { rideName = item.type + 2; rideDescription = item.type + 512; } diff --git a/src/windows/options.c b/src/windows/options.c index dc9da836c0..70da76fabd 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -119,7 +119,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_SAVE_PLUGIN_DATA_CHECKBOX, WIDX_AUTOSAVE, WIDX_AUTOSAVE_DROPDOWN, - WIDX_ALLOW_SUBTYPE_SWITCHING, + WIDX_SELECT_BY_TRACK_TYPE, WIDX_TEST_UNFINISHED_TRACKS, WIDX_AUTO_STAFF_PLACEMENT, WIDX_DEBUGGING_TOOLS, @@ -214,7 +214,7 @@ static rct_widget window_options_misc_widgets[] = { { WWT_CHECKBOX, 2, 10, 299, 69, 80, STR_SAVE_PLUGIN_DATA, STR_SAVE_PLUGIN_DATA_TIP }, { WWT_DROPDOWN, 1, 155, 299, 83, 94, STR_NONE, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 288, 298, 84, 93, 876, STR_NONE }, - { WWT_CHECKBOX, 2, 10, 299, 99, 110, 5122, STR_NONE }, // allow subtype + { WWT_CHECKBOX, 2, 10, 299, 99, 110, 5122, STR_NONE }, // select by track type { WWT_CHECKBOX, 2, 10, 299, 114, 125, 5155, 5156 }, // test unfinished tracks { WWT_CHECKBOX, 2, 10, 299, 129, 140, 5343, STR_NONE }, // auto staff placement { WWT_CHECKBOX, 2, 10, 299, 144, 155, 5150, STR_NONE }, // enabled debugging tools @@ -362,7 +362,7 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_SAVE_PLUGIN_DATA_CHECKBOX) | (1 << WIDX_AUTOSAVE) | (1 << WIDX_AUTOSAVE_DROPDOWN) | - (1 << WIDX_ALLOW_SUBTYPE_SWITCHING) | + (1 << WIDX_SELECT_BY_TRACK_TYPE) | (1 << WIDX_TEST_UNFINISHED_TRACKS) | (1 << WIDX_AUTO_STAFF_PLACEMENT) | (1 << WIDX_DEBUGGING_TOOLS) | @@ -522,8 +522,8 @@ static void window_options_mouseup() case WINDOW_OPTIONS_PAGE_MISC: switch (widgetIndex) { - case WIDX_ALLOW_SUBTYPE_SWITCHING: - gConfigInterface.allow_subtype_switching ^= 1; + case WIDX_SELECT_BY_TRACK_TYPE: + gConfigInterface.select_by_track_type ^= 1; config_save_default(); window_invalidate(w); window_invalidate_by_class(WC_RIDE); @@ -1136,7 +1136,7 @@ static void window_options_invalidate() else window_options_misc_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_CHECKBOX; - widget_set_checkbox_value(w, WIDX_ALLOW_SUBTYPE_SWITCHING, gConfigInterface.allow_subtype_switching); + widget_set_checkbox_value(w, WIDX_SELECT_BY_TRACK_TYPE, gConfigInterface.select_by_track_type); widget_set_checkbox_value(w, WIDX_REAL_NAME_CHECKBOX, RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SHOW_REAL_GUEST_NAMES); widget_set_checkbox_value(w, WIDX_SAVE_PLUGIN_DATA_CHECKBOX, gConfigGeneral.save_plugin_data); widget_set_checkbox_value(w, WIDX_TEST_UNFINISHED_TRACKS, gConfigGeneral.test_unfinished_tracks); @@ -1147,7 +1147,7 @@ static void window_options_invalidate() window_options_misc_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_CHECKBOX; window_options_misc_widgets[WIDX_AUTOSAVE].type = WWT_DROPDOWN; window_options_misc_widgets[WIDX_AUTOSAVE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; - window_options_misc_widgets[WIDX_ALLOW_SUBTYPE_SWITCHING].type = WWT_CHECKBOX; + window_options_misc_widgets[WIDX_SELECT_BY_TRACK_TYPE].type = WWT_CHECKBOX; window_options_misc_widgets[WIDX_TEST_UNFINISHED_TRACKS].type = WWT_CHECKBOX; window_options_misc_widgets[WIDX_AUTO_STAFF_PLACEMENT].type = WWT_CHECKBOX; window_options_misc_widgets[WIDX_DEBUGGING_TOOLS].type = WWT_CHECKBOX; diff --git a/src/windows/research.c b/src/windows/research.c index 2d6cdfdb81..4114e9b832 100644 --- a/src/windows/research.c +++ b/src/windows/research.c @@ -365,7 +365,7 @@ void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dp uint32 typeId = RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_ITEM, uint32); if (typeId >= 0x10000) { rct_ride_type *rideEntry = RCT2_GLOBAL(0x009ACFA4 + (typeId & 0xFF) * 4, rct_ride_type*); - stringId = rideEntry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME ? + stringId = rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME ? rideEntry->name : (typeId & 0xFF00) + 2; } else { @@ -403,7 +403,7 @@ void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dp if (typeId != 0xFFFFFFFF) { if (typeId >= 0x10000) { rct_ride_type *rideEntry = RCT2_GLOBAL(0x009ACFA4 + (typeId & 0xFF) * 4, rct_ride_type*); - stringId = rideEntry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME ? + stringId = rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME ? rideEntry->name : ((typeId >> 8) & 0xFF) + 2; @@ -669,4 +669,4 @@ static void window_research_draw_tab_images(rct_drawpixelinfo *dpi, rct_window * window_research_draw_tab_image(dpi, w, WINDOW_RESEARCH_PAGE_FUNDING, SPR_TAB_FINANCES_SUMMARY_0); } -#pragma endregion \ No newline at end of file +#pragma endregion diff --git a/src/windows/ride.c b/src/windows/ride.c index c84958848f..042966f4f4 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -2362,7 +2362,7 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi rideEntryIndex = *currentRideEntryIndex; currentRideEntry = GET_RIDE_ENTRY(rideEntryIndex); // Skip if vehicle has the same track type, but not same subtype, unless subtype switching is enabled - if ((currentRideEntry->flags & (RIDE_ENTRY_FLAG_SEPERATE_RIDE | RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME)) && !gConfigInterface.allow_subtype_switching) + if ((currentRideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE | RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) && !gConfigInterface.select_by_track_type) continue; quadIndex = rideEntryIndex >> 5; @@ -2523,7 +2523,7 @@ static void window_ride_vehicle_invalidate() // Vehicle type window_ride_vehicle_widgets[WIDX_VEHICLE_TYPE].image = rideEntry->name; // Always show a dropdown button when changing subtypes is allowed - if ((var_496(w) <= 1 || (rideEntry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE)) && !gConfigInterface.allow_subtype_switching) { + if ((var_496(w) <= 1 || (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)) && !gConfigInterface.select_by_track_type) { window_ride_vehicle_widgets[WIDX_VEHICLE_TYPE].type = WWT_14; window_ride_vehicle_widgets[WIDX_VEHICLE_TYPE_DROPDOWN].type = WWT_EMPTY; w->enabled_widgets &= ~(1 << WIDX_VEHICLE_TYPE); @@ -2597,7 +2597,7 @@ static void window_ride_vehicle_paint() gfx_draw_string_left(dpi, 3142, &stringId, 0, x, y); y += 15; - if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE) && var_496(w) > 1) { + if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) && var_496(w) > 1) { // Excitement Factor factor = rideEntry->excitement_multipler; if (factor > 0) { diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index a0f542daef..bf256a54a2 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -70,15 +70,15 @@ enum { typedef enum { DDIDX_LOAD_GAME = 0, DDIDX_SAVE_GAME = 1, - // seperator + // separator DDIDX_ABOUT = 3, DDIDX_OPTIONS = 4, DDIDX_SCREENSHOT = 5, DDIDX_GIANT_SCREENSHOT = 6, - // seperator + // separator DDIDX_QUIT_TO_MENU = 8, DDIDX_EXIT_OPENRCT2 = 9, - // seperator + // separator DDIDX_ENABLE_TWITCH = 11 } FILE_MENU_DDIDX; diff --git a/src/windows/track_list.c b/src/windows/track_list.c index 416d6db0e1..33a9f7759e 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -358,7 +358,7 @@ static void window_track_list_invalidate() entry = GET_RIDE_ENTRY(_window_track_list_item.entry_index); stringId = entry->name; - if (!(entry->flags & RIDE_ENTRY_FLAG_SEPERATE_RIDE_NAME)) + if (!(entry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) stringId = _window_track_list_item.type + 2; RCT2_GLOBAL(0x013CE952, uint16) = stringId; From 13106dba0862d70a330362be10dadd4317c5c734 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 24 Jun 2015 13:22:10 +0200 Subject: [PATCH 0075/1173] Only allow changing the option for select-by-ride-type in the title screen, to prevent strange behaviour --- data/language/english_uk.txt | 1 + src/windows/options.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index fa2d6ccb63..4c6e9b01a0 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3711,3 +3711,4 @@ STR_5374 :Date {STRINGID} STR_5375 :{UP} STR_5376 :{DOWN} #Strings 5377-5440 Reserved +STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. Only{NEWLINE}toggleable in the title screen. diff --git a/src/windows/options.c b/src/windows/options.c index 70da76fabd..1222cfb96b 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -214,7 +214,7 @@ static rct_widget window_options_misc_widgets[] = { { WWT_CHECKBOX, 2, 10, 299, 69, 80, STR_SAVE_PLUGIN_DATA, STR_SAVE_PLUGIN_DATA_TIP }, { WWT_DROPDOWN, 1, 155, 299, 83, 94, STR_NONE, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 288, 298, 84, 93, 876, STR_NONE }, - { WWT_CHECKBOX, 2, 10, 299, 99, 110, 5122, STR_NONE }, // select by track type + { WWT_CHECKBOX, 2, 10, 299, 99, 110, 5122, 5441 }, // select by track type { WWT_CHECKBOX, 2, 10, 299, 114, 125, 5155, 5156 }, // test unfinished tracks { WWT_CHECKBOX, 2, 10, 299, 129, 140, 5343, STR_NONE }, // auto staff placement { WWT_CHECKBOX, 2, 10, 299, 144, 155, 5150, STR_NONE }, // enabled debugging tools @@ -1136,6 +1136,10 @@ static void window_options_invalidate() else window_options_misc_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_CHECKBOX; + // This option sets several flags on object load, only make it changeable in the titles to prevent strange New Ride list behaviour + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO)) + w->disabled_widgets |= (1ULL << WIDX_SELECT_BY_TRACK_TYPE); + widget_set_checkbox_value(w, WIDX_SELECT_BY_TRACK_TYPE, gConfigInterface.select_by_track_type); widget_set_checkbox_value(w, WIDX_REAL_NAME_CHECKBOX, RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SHOW_REAL_GUEST_NAMES); widget_set_checkbox_value(w, WIDX_SAVE_PLUGIN_DATA_CHECKBOX, gConfigGeneral.save_plugin_data); From 293624dc36282db25686f45cdb23188c78c8cd7b Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 24 Jun 2015 14:30:03 +0200 Subject: [PATCH 0076/1173] Prefer sportscars over racing cars in RCT1 mode --- src/rct1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rct1.c b/src/rct1.c index 14dde13b05..2bba73c0c2 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -1115,7 +1115,7 @@ char *MiniSuspendedRCObjectOrder[] = { "BATFL ", "SKYTR "}; char *BoatRideObjectOrder[] = { "RBOAT ", "BBOAT ", "CBOAT ", "SWANS ", "TRIKE ","JSKI "}; char *WoodenWMObjectOrder[] = { "WMOUSE ", "WMMINE "}; char *SteeplechaseObjectOrder[] = { "STEEP1 ", "STEEP2 ", "SBOX "}; -char *CarRideObjectOrder[] = { "RCR ", "SPCAR ", "TRUCK1 ", "VCR ", "CTCAR "}; +char *CarRideObjectOrder[] = { "SPCAR ", "RCR ", "TRUCK1 ", "VCR ", "CTCAR "}; char *LaunchedFFObjectOrder[] = { "SSC1 "}; char *BobsleighRCObjectOrder[] = { "BOB1 ", "INTBOB "}; char *ObservationTowerObjectOrder[] = { "OBS1 ", "OBS2 "}; From f9d85b6959d1d94a11aa193af5a54173252463fd Mon Sep 17 00:00:00 2001 From: "Miso Zmiric (Mike Squinter)" Date: Wed, 24 Jun 2015 15:28:06 +0100 Subject: [PATCH 0077/1173] fixes #1445, now checks for existance of g1.dat files in the game path rather than just for the folder --- src/config.c | 2 +- src/platform/platform.h | 1 + src/platform/windows.c | 8 ++++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 36a16999e3..6f3c74ab3a 100644 --- a/src/config.c +++ b/src/config.c @@ -713,7 +713,7 @@ static bool config_find_rct2_path(char *resultPath) }; for (i = 0; i < countof(searchLocations); i++) { - if (platform_directory_exists(searchLocations[i]) ) { + if (platform_original_game_data_exists(searchLocations[i])) { strcpy(resultPath, searchLocations[i]); return true; } diff --git a/src/platform/platform.h b/src/platform/platform.h index ca7ad50dfd..2b103f9955 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -87,6 +87,7 @@ void platform_stop_text_input(); char platform_get_path_separator(); int platform_file_exists(const char *path); int platform_directory_exists(const char *path); +int platform_original_game_data_exists(const char *path); time_t platform_file_get_modified_time(char* path); int platform_ensure_directory_exists(const char *path); int platform_lock_single_instance(); diff --git a/src/platform/windows.c b/src/platform/windows.c index 558fa62918..5cc61d780d 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -101,6 +101,14 @@ int platform_directory_exists(const char *path) return dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY); } +int platform_original_game_data_exists(const char *path) +{ + char checkPath[MAX_PATH]; + sprintf(checkPath, "%s%c%s%c%s", path, platform_get_path_separator(), "data", platform_get_path_separator(), "g1.dat"); + DWORD dwAttrib = GetFileAttributes(checkPath); + return dwAttrib != INVALID_FILE_ATTRIBUTES; +} + int platform_ensure_directory_exists(const char *path) { if (platform_directory_exists(path)) From 8c83cc24b186b0f2c573af1f44af83e71989aa24 Mon Sep 17 00:00:00 2001 From: "Miso Zmiric (Mike Squinter)" Date: Wed, 24 Jun 2015 15:36:42 +0100 Subject: [PATCH 0078/1173] use the game data check for existing config files as well, guard for data being moved --- src/rct2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rct2.c b/src/rct2.c index b174cfa7e8..75d2a20421 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -138,8 +138,8 @@ int rct2_init_directories() // windows_get_registry_install_info((rct2_install_info*)0x009AA10C, "RollerCoaster Tycoon 2 Setup", "MS Sans Serif", 0); // check install directory - if (!platform_directory_exists(gConfigGeneral.game_path)) { - log_verbose("install directory does not exist, %s", gConfigGeneral.game_path); + if (!platform_original_game_data_exists(gConfigGeneral.game_path)) { + log_verbose("install directory does not exist or invalid directory selected, %s", gConfigGeneral.game_path); if (!config_find_or_browse_install_directory()) { log_fatal("Invalid RCT2 installation path. Please correct in config.ini."); return 0; From 474d300578e20ba72e5cfb8f9cd7c3485a39827c Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 24 Jun 2015 16:43:09 +0100 Subject: [PATCH 0079/1173] change enabledTrackPieces to 64 bit integer in ride type struct --- src/object.c | 3 +-- src/ride/ride.h | 9 +++++++-- src/windows/ride.c | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/object.c b/src/object.c index 74f41deaf3..040ce1b51a 100644 --- a/src/object.c +++ b/src/object.c @@ -428,8 +428,7 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp ride_type->description = object_get_localised_text(&chunk, ecx, ebx, 1); if(gConfigInterface.select_by_track_type) { - ride_type->enabledTrackPieces=0xFFFFFFFF; - ride_type->enabledTrackPiecesAdditional=0xFFFFFFFF; + ride_type->enabledTrackPieces = 0xFFFFFFFFFFFFFFFF; bool remove_flag=true; for(int j=0;j<3;j++) diff --git a/src/ride/ride.h b/src/ride/ride.h index ebf54167e7..923a4e540c 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -120,8 +120,13 @@ typedef struct { sint8 intensity_multipler; // 0x1B3 sint8 nausea_multipler; // 0x1B4 uint8 max_height; // 0x1B5 - uint32 enabledTrackPieces; // 0x1B6 - uint32 enabledTrackPiecesAdditional; // 0x1BA + union { + uint64 enabledTrackPieces; // 0x1B6 + struct { + uint32 enabledTrackPiecesA; // 0x1B6 + uint32 enabledTrackPiecesB; // 0x1BA + }; + }; uint8 category[2]; // 0x1BE uint8 shop_item; // 0x1C0 uint8 shop_item_secondary; // 0x1C1 diff --git a/src/windows/ride.c b/src/windows/ride.c index 042966f4f4..a5dfed63fe 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -3085,7 +3085,7 @@ static void window_ride_operating_invalidate() w->pressed_widgets &= ~0x44700000; // Lift hill speed - if ((rideEntry->enabledTrackPieces & RCT2_ADDRESS(0x01357444, uint32)[ride->type]) & 8) { + if ((rideEntry->enabledTrackPiecesA & RCT2_ADDRESS(0x01357444, uint32)[ride->type]) & 8) { window_ride_operating_widgets[WIDX_LIFT_HILL_SPEED_LABEL].type = WWT_24; window_ride_operating_widgets[WIDX_LIFT_HILL_SPEED].type = WWT_SPINNER; window_ride_operating_widgets[WIDX_LIFT_HILL_SPEED_INCREASE].type = WWT_DROPDOWN_BUTTON; From 9429d25eb86057a9be4f88be34b33bb8886b944f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Ho=C5=99ava?= Date: Wed, 24 Jun 2015 09:14:07 -0700 Subject: [PATCH 0080/1173] fix broken links --- readme.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/readme.md b/readme.md index a00641b470..94c14977a0 100644 --- a/readme.md +++ b/readme.md @@ -5,9 +5,9 @@ An open source clone of RollerCoaster Tycoon 2 built by decompiling the original - [Screenshot 3, high resolution](http://i.imgur.com/yFzNyVu.jpg) - [Screenshot 4, resizable window](http://imgur.com/a/3GDuT) -[![Build Status](https://travis-ci.org/IntelOrca/OpenRCT2.svg)](https://travis-ci.org/IntelOrca/OpenRCT2) +[![Build Status](https://travis-ci.org/OpenRCT2/OpenRCT2.svg)](https://travis-ci.org/OpenRCT2/OpenRCT2) -[![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/IntelOrca/OpenRCT2?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/OpenRCT2/OpenRCT2?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) # Contents - 1 - [Introduction](#1-introduction) @@ -39,7 +39,7 @@ The project therefore acts as a patch to RollerCoaster Tycoon 2, allowing each p ## 1.3 Progress Currently, the windowing system, graphics rendering and basic game loop are being decompiled. Decompiling all of the game's procedures is a convenient way of identifying the game's memory structure. SDL2 has been used as a replacement for the operating system calls, allowing for cross-platform support after the dependency on the original game's executable has been removed. -As of 16th August 2014, various UI improvements have already been made, settings are now stored in a local INI file. More drawing functions have now been decompiled but still remain cryptic C, much of the game management have been decompiled (e.g. peep generation, awards, cash out) and almost half of the windows. A rough estimate based on number of functions in the original game and number of functions now in C tells us that the project is approximately 25% complete of its target goal of having the game run on 100% C code. More information can be found in [changes to original game](https://github.com/IntelOrca/OpenRCT2/wiki/Changes-to-original-game) and [window progress](https://github.com/IntelOrca/OpenRCT2/wiki/Window-progress). +As of 16th August 2014, various UI improvements have already been made, settings are now stored in a local INI file. More drawing functions have now been decompiled but still remain cryptic C, much of the game management have been decompiled (e.g. peep generation, awards, cash out) and almost half of the windows. A rough estimate based on number of functions in the original game and number of functions now in C tells us that the project is approximately 25% complete of its target goal of having the game run on 100% C code. More information can be found in [changes to original game](https://github.com/OpenRCT2/OpenRCT2/wiki/Changes-to-original-game) and [window progress](https://github.com/OpenRCT2/OpenRCT2/wiki/Window-progress). ## 1.4 Aim The aim is to completely decompile RollerCoaster Tycoon 2 into C so that cross-platform support, new features, and new gameplay can be added in a similar fashion to OpenTTD. With the addition of SDL2, the game can already be run in a resizeable window (which was not possible originally). Once the game has been fully decompiled, additional gameplay features, gameplay tweaks, and improvements can be introduced. The following is only a brief, non-exhaustive list of the possibilities - there are many more: @@ -102,7 +102,7 @@ wine openrct2.exe ``` ### Linux: -As the easiest approach depends on your distribution, please take a look at the [wiki](https://github.com/IntelOrca/OpenRCT2/wiki). +As the easiest approach depends on your distribution, please take a look at the [wiki](https://github.com/OpenRCT2/OpenRCT2/wiki). # 3 Contributing @@ -136,7 +136,7 @@ Translations are in progress for German, Dutch, French, Hungarian, Polish, Spani **OpenRCT2** is licensed under the GNU General Public License version 3. # 5 More information -- [GitHub](https://github.com/IntelOrca/OpenRCT2) +- [GitHub](https://github.com/OpenRCT2/OpenRCT2) - [Facebook](https://www.facebook.com/OpenRCT2) - [Automated builds](https://openrct2.com/download) - [Secondary site for automated builds](https://openrct.net/builds.php) From 21a15d02476b5cce6c5d797b832c3aa92939a039 Mon Sep 17 00:00:00 2001 From: "Miso Zmiric (Mike Squinter)" Date: Wed, 24 Jun 2015 17:16:22 +0100 Subject: [PATCH 0081/1173] use platform_file_exists --- src/platform/windows.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/platform/windows.c b/src/platform/windows.c index 5cc61d780d..97b0005157 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -105,8 +105,7 @@ int platform_original_game_data_exists(const char *path) { char checkPath[MAX_PATH]; sprintf(checkPath, "%s%c%s%c%s", path, platform_get_path_separator(), "data", platform_get_path_separator(), "g1.dat"); - DWORD dwAttrib = GetFileAttributes(checkPath); - return dwAttrib != INVALID_FILE_ATTRIBUTES; + return platform_file_exists(checkPath); } int platform_ensure_directory_exists(const char *path) From a3a993dabde4e7aaeaa45bddad80a2b9a8531be5 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Wed, 24 Jun 2015 12:22:12 -0400 Subject: [PATCH 0082/1173] Title Sequence editor --- data/language/english_uk.txt | 65 +- data/title/{ => openrct2}/achilleshiel.sv6 | Bin data/title/{ => openrct2}/faas.sv6 | Bin data/title/{ => openrct2}/mci.sv6 | Bin data/title/{ => openrct2}/pfckrutonium1.sv6 | Bin data/title/{ => openrct2}/pfckrutonium2.sv6 | Bin data/title/{ => openrct2}/poke.sv6 | Bin data/title/{ => openrct2}/rid6.sv6 | Bin data/title/{ => openrct2}/script.txt | 4 +- data/title/{ => openrct2}/shotguns.sv6 | Bin data/title/{ => openrct2}/triggerdeath.sv6 | Bin data/title/rct2/script.txt | 34 + projects/openrct2.vcxproj | 7 + projects/openrct2.vcxproj.filters | 12 + projects/~AutoRecover.openrct2.vcxproj | 423 ++++++++ resources/g2/29.png | Bin 0 -> 202 bytes resources/g2/30.png | Bin 0 -> 203 bytes resources/g2/31.png | Bin 0 -> 191 bytes resources/g2/32.png | Bin 0 -> 208 bytes src/config.c | 246 ++++- src/config.h | 37 +- src/input.c | 6 +- src/interface/console.c | 5 +- src/interface/themes.c | 5 +- src/interface/title_sequences.c | 367 +++++++ src/interface/title_sequences.h | 68 ++ src/interface/window.c | 2 + src/interface/window.h | 8 +- src/openrct2.c | 3 + src/platform/platform.h | 1 + src/platform/windows.c | 22 + src/rct2.c | 2 +- src/sprites.h | 5 + src/title.c | 240 ++++- src/title.h | 21 + src/util/util.c | 10 + src/util/util.h | 2 + src/windows/loadsave.c | 36 +- src/windows/options.c | 52 +- src/windows/themes.c | 13 +- src/windows/title_command_editor.c | 522 ++++++++++ src/windows/title_editor.c | 1023 +++++++++++++++++++ 42 files changed, 3171 insertions(+), 70 deletions(-) rename data/title/{ => openrct2}/achilleshiel.sv6 (100%) rename data/title/{ => openrct2}/faas.sv6 (100%) rename data/title/{ => openrct2}/mci.sv6 (100%) rename data/title/{ => openrct2}/pfckrutonium1.sv6 (100%) rename data/title/{ => openrct2}/pfckrutonium2.sv6 (100%) rename data/title/{ => openrct2}/poke.sv6 (100%) rename data/title/{ => openrct2}/rid6.sv6 (100%) rename data/title/{ => openrct2}/script.txt (98%) rename data/title/{ => openrct2}/shotguns.sv6 (100%) rename data/title/{ => openrct2}/triggerdeath.sv6 (100%) create mode 100644 data/title/rct2/script.txt create mode 100644 projects/~AutoRecover.openrct2.vcxproj create mode 100644 resources/g2/29.png create mode 100644 resources/g2/30.png create mode 100644 resources/g2/31.png create mode 100644 resources/g2/32.png create mode 100644 src/interface/title_sequences.c create mode 100644 src/interface/title_sequences.h create mode 100644 src/windows/title_command_editor.c create mode 100644 src/windows/title_editor.c diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 4c6e9b01a0..67c7fd53df 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3710,5 +3710,68 @@ STR_5373 :Name {STRINGID} STR_5374 :Date {STRINGID} STR_5375 :{UP} STR_5376 :{DOWN} -#Strings 5377-5440 Reserved +STR_5377 :{SMALLFONT}{BLACK}Saves +STR_5378 :{SMALLFONT}{BLACK}Script +STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command +STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence +STR_5381 :{SMALLFONT}{BLACK}Stop playing title sequence +STR_5382 :{SMALLFONT}{BLACK}Restart title sequence +STR_5383 :{SMALLFONT}{BLACK}Create a new title sequence based on the current one +STR_5384 :{SMALLFONT}{BLACK}Delete the current title sequence +STR_5385 :{SMALLFONT}{BLACK}Rename the current title sequence +STR_5386 :{SMALLFONT}{BLACK}Insert a new command +STR_5387 :{SMALLFONT}{BLACK}Edit the selected command +STR_5388 :{SMALLFONT}{BLACK}Delete the selected command +STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence +STR_5390 :{SMALLFONT}{BLACK}Move the selected command down +STR_5391 :{SMALLFONT}{BLACK}Move the selected command up +STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence +STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence +STR_5394 :{SMALLFONT}{BLACK}Rename the selected save +STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game +STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game +STR_5397 :Can only be used on the title screen +STR_5398 :Cannot edit title sequence while it's playing +STR_5399 :Press the stop button to coninue editing +STR_5400 :Can't change this title sequence +STR_5401 :Create a new title sequence to make changes to +STR_5402 :Failed to load title sequence +STR_5403 :There may be no Load or Wait command or a save may be invalid +STR_5404 :Name already exists +STR_5405 :Enter a name for the save +STR_5406 :Enter a name for the title sequence +STR_5407 :Add +STR_5408 :Remove +STR_5409 :Insert +STR_5410 :Edit +STR_5411 :Reload +STR_5412 :Skip to +STR_5413 :Load +STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :Load{MOVE_X}{87}{STRING} +STR_5416 :Load{MOVE_X}{87}No save selected +STR_5417 :Location +STR_5418 :Location{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :Rotate +STR_5420 :Rotate{MOVE_X}{87}{COMMA16} +STR_5421 :Zoom +STR_5422 :Zoom{MOVE_X}{87}{COMMA16} +STR_5423 :Wait +STR_5424 :Wait{MOVE_X}{87}{COMMA16} +STR_5425 :Restart +STR_5426 :End +STR_5427 :Coordinates: +STR_5428 :Counter-clockwise rotations: +STR_5429 :Zoom level: +STR_5430 :Seconds to wait: +STR_5431 :Save to load: +STR_5432 :Command: +STR_5433 :Title Sequences +STR_5434 :Command Editor +STR_5435 :Rename save +STR_5436 :Edit Title Sequences... +STR_5437 :No save selected +STR_5438 :Can't make changes while command editor is open +STR_5439 :A restart is used without a wait command +STR_5440 : STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. Only{NEWLINE}toggleable in the title screen. diff --git a/data/title/achilleshiel.sv6 b/data/title/openrct2/achilleshiel.sv6 similarity index 100% rename from data/title/achilleshiel.sv6 rename to data/title/openrct2/achilleshiel.sv6 diff --git a/data/title/faas.sv6 b/data/title/openrct2/faas.sv6 similarity index 100% rename from data/title/faas.sv6 rename to data/title/openrct2/faas.sv6 diff --git a/data/title/mci.sv6 b/data/title/openrct2/mci.sv6 similarity index 100% rename from data/title/mci.sv6 rename to data/title/openrct2/mci.sv6 diff --git a/data/title/pfckrutonium1.sv6 b/data/title/openrct2/pfckrutonium1.sv6 similarity index 100% rename from data/title/pfckrutonium1.sv6 rename to data/title/openrct2/pfckrutonium1.sv6 diff --git a/data/title/pfckrutonium2.sv6 b/data/title/openrct2/pfckrutonium2.sv6 similarity index 100% rename from data/title/pfckrutonium2.sv6 rename to data/title/openrct2/pfckrutonium2.sv6 diff --git a/data/title/poke.sv6 b/data/title/openrct2/poke.sv6 similarity index 100% rename from data/title/poke.sv6 rename to data/title/openrct2/poke.sv6 diff --git a/data/title/rid6.sv6 b/data/title/openrct2/rid6.sv6 similarity index 100% rename from data/title/rid6.sv6 rename to data/title/openrct2/rid6.sv6 diff --git a/data/title/script.txt b/data/title/openrct2/script.txt similarity index 98% rename from data/title/script.txt rename to data/title/openrct2/script.txt index 861dbd25e8..aa50e18dd7 100644 --- a/data/title/script.txt +++ b/data/title/openrct2/script.txt @@ -103,4 +103,6 @@ WAIT 12 LOCATION 12 47 ROTATE 3 -WAIT 20 \ No newline at end of file +WAIT 20 + +RESTART \ No newline at end of file diff --git a/data/title/shotguns.sv6 b/data/title/openrct2/shotguns.sv6 similarity index 100% rename from data/title/shotguns.sv6 rename to data/title/openrct2/shotguns.sv6 diff --git a/data/title/triggerdeath.sv6 b/data/title/openrct2/triggerdeath.sv6 similarity index 100% rename from data/title/triggerdeath.sv6 rename to data/title/openrct2/triggerdeath.sv6 diff --git a/data/title/rct2/script.txt b/data/title/rct2/script.txt new file mode 100644 index 0000000000..3f4e303f7b --- /dev/null +++ b/data/title/rct2/script.txt @@ -0,0 +1,34 @@ +# RollerCoaster Tycoon 2 Title Sequence + +LOADMM + +LOCATION 210 112 +WAIT 13 + +ROTATE 1 +LOCATION 210 112 +WAIT 14 + +ROTATE 3 +LOCATION 167 180 +WAIT 12 + +ROTATE 1 +LOCATION 155 189 +WAIT 12 + +LOCATION 106 39 +WAIT 12 + +LOCATION 182 50 +WAIT 12 + +ROTATE 3 +LOCATION 209 47 +WAIT 12 + +ROTATE 1 +LOCATION 159 93 +WAIT 12 + +RESTART diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 3e8b0c411a..c9f50a1a2a 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -51,6 +51,7 @@ + @@ -90,6 +91,11 @@ + + + + + @@ -198,6 +204,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index fad60aeef3..24bc550445 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -480,6 +480,15 @@ Source\Windows + + Source\Windows + + + Source\Interface + + + Source\Windows + @@ -704,5 +713,8 @@ Test\Ride + + Source\Interface + \ No newline at end of file diff --git a/projects/~AutoRecover.openrct2.vcxproj b/projects/~AutoRecover.openrct2.vcxproj new file mode 100644 index 0000000000..de18e4d204 --- /dev/null +++ b/projects/~AutoRecover.openrct2.vcxproj @@ -0,0 +1,423 @@ + + + + + + + + + + Debug + Win32 + + + Release with Tests + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {074dc930-05c6-4b7f-b5dd-dd237e6e44db} + + + + {D24D94F6-2A74-480C-B512-629C306CE92F} + openrct2 + openrct2 + + + + DynamicLibrary + true + v120 + MultiByte + + + DynamicLibrary + false + v120 + true + MultiByte + + + DynamicLibrary + false + v120 + true + MultiByte + + + + + + + + + + + + + + + + $(SolutionDir)..\lodepng;$(SolutionDir)..\sdl\include;$(SolutionDir)..\libspeex;$(IncludePath) + $(SolutionDir)..\sdl\lib\x86;$(LibraryPath) + $(SolutionDir)..\build\$(Configuration)\ + $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ + + + $(SolutionDir)..\lib;$(SolutionDir)..\lib\libspeex;$(SolutionDir)..\lib\sdl\include;$(SolutionDir)..\lib\libcurl\include;$(SolutionDir)..\lib\jansson;$(SolutionDir)..\lib\cutest;$(IncludePath) + $(SolutionDir)..\lib\sdl\lib\x86;$(SolutionDir)..\lib\libcurl\lib;$(LibraryPath) + $(SolutionDir)..\build\$(Configuration)\ + $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ + + + + + $(SolutionDir)..\lib;$(SolutionDir)..\lib\libspeex;$(SolutionDir)..\lib\sdl\include;$(SolutionDir)..\lib\libcurl\include;$(SolutionDir)..\lib\jansson;$(SolutionDir)..\lib\cutest;$(IncludePath) + $(SolutionDir)..\lib\sdl\lib\x86;$(SolutionDir)..\lib\libcurl\lib;$(LibraryPath) + $(SolutionDir)..\build\Release\ + $(SolutionDir)..\obj\$(ProjectName)\Release\ + + + + + Level3 + Disabled + true + 1Byte + _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;%(PreprocessorDefinitions) + MultiThreaded + + + true + winmm.lib;sdl2.lib;Dsound.lib;%(AdditionalDependencies) + + + "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\..\Data\g2.dat" "$(SolutionDir)\..\Resources\g2\" +xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" + + + + + Level3 + Disabled + true + true + + + MultiThreaded + 1Byte + 4013 + + + false + _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;%(PreprocessorDefinitions) + $(IntDir)fake\%(RelativeDir) + true + + + true + true + true + winmm.lib;sdl2.lib;Dsound.lib;%(AdditionalDependencies) + /ignore:4099 %(AdditionalOptions) + + + "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\..\Data\g2.dat" "$(SolutionDir)\..\Resources\g2\" +xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" + Build g2.dat and copy the Data directory. + + + + + + + + + + + + + Level3 + Disabled + true + true + + + MultiThreaded + 1Byte + 4013 + + + false + _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;ENABLE_TESTS;%(PreprocessorDefinitions) + $(IntDir)fake\%(RelativeDir) + true + + + true + true + true + winmm.lib;sdl2.lib;Dsound.lib;%(AdditionalDependencies) + /ignore:4099 %(AdditionalOptions) + + + "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\..\Data\g2.dat" "$(SolutionDir)\..\Resources\g2\" +xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" + Build g2.dat and copy the Data directory. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/g2/29.png b/resources/g2/29.png new file mode 100644 index 0000000000000000000000000000000000000000..a95bea067328184131659914b85c768755439e2f GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9Y!3HERME&^*q*&4&eH|GXHuiJ>Nn{1`ISV`@ ziy0XB4uUY_j)~cCfr1hxt`Q}{`DrEPiAAXl1&Nt?C3<mdKI;Vst0L?u+lK=n! literal 0 HcmV?d00001 diff --git a/resources/g2/30.png b/resources/g2/30.png new file mode 100644 index 0000000000000000000000000000000000000000..4038923eafc98753bafb70abfccdbcf34a9d526b GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9Y!3HERME&^*q*&4&eH|GXHuiJ>Nn{1`ISV`@ ziy0XB4uUY_j)~cCfr1hxt`Q}{`DrEPiAAXl1&Nt?C3< zjv*HQZ@V}0GAQsI{>94v<-c^|#|er`O*^OUxoP@m8a;S24e_O?((X Sjn^M&D1)b~pUXO@geCxUpGR&0 literal 0 HcmV?d00001 diff --git a/resources/g2/31.png b/resources/g2/31.png new file mode 100644 index 0000000000000000000000000000000000000000..06b5f195c936f44a3cb9cdd5a4ac99d03aadfacb GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9Y!3HERME&^*q*&4&eH|GXHuiJ>Nn{1`ISV`@ ziy0XB4uUY_j)~cCfr1hxt`Q}{`DrEPiAAXl1&Nt?C3<A+stP&I+XPgt|#2T;@3xkok!5DBA&s hqij7)QA})X3>xRP8~aNvOn?S4c)I$ztaD0e0sw&=Hsk;R literal 0 HcmV?d00001 diff --git a/resources/g2/32.png b/resources/g2/32.png new file mode 100644 index 0000000000000000000000000000000000000000..84d69e23372932df5ab7cc7f5922b774cbfcf8f3 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9Y!3HERME&^*q*&4&eH|GXHuiJ>Nn{1`ISV`@ ziy0XB4uUY_j)~cCfr1hxt`Q}{`DrEPiAAXl1&Nt?C3<FVdQ&MBb@03>xr Ab^rhX literal 0 HcmV?d00001 diff --git a/src/config.c b/src/config.c index 6f3c74ab3a..551dcb0e1d 100644 --- a/src/config.c +++ b/src/config.c @@ -25,6 +25,7 @@ #include "util/util.h" #include "interface/themes.h" #include "openrct2.h" +#include "interface/title_sequences.h" // Magic number for original game cfg file static const int MagicNumber = 0x0003113A; @@ -179,7 +180,6 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, date_format), "date_format", CONFIG_VALUE_TYPE_UINT8, DATE_FORMAT_DMY, _dateFormatEnum }, { offsetof(general_configuration, auto_staff_placement), "auto_staff", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, last_run_version), "last_run_version", CONFIG_VALUE_TYPE_STRING, { .value_string = NULL }, NULL }, - { offsetof(general_configuration, title_sequence), "title_sequence", CONFIG_VALUE_TYPE_UINT8, TITLE_SEQUENCE_OPENRCT2, NULL }, { offsetof(general_configuration, invert_viewport_drag), "invert_viewport_drag", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, load_save_sort), "load_save_sort", CONFIG_VALUE_TYPE_UINT8, SORT_NAME_ASCENDING, NULL }, }; @@ -190,7 +190,8 @@ config_property_definition _interfaceDefinitions[] = { { offsetof(interface_configuration, toolbar_show_cheats), "toolbar_show_cheats", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(interface_configuration, select_by_track_type), "select_by_track_type", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(interface_configuration, console_small_font), "console_small_font", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, - { offsetof(interface_configuration, current_theme_preset), "current_theme", CONFIG_VALUE_TYPE_STRING, { .value_string = "*RCT2" }, NULL }, + { offsetof(interface_configuration, current_theme_preset), "current_theme", CONFIG_VALUE_TYPE_STRING, { .value_string = "*RCT2" }, NULL }, + { offsetof(interface_configuration, current_title_sequence_preset), "current_title_sequence", CONFIG_VALUE_TYPE_STRING, { .value_string = "*OPENRCT2" },NULL }, }; config_property_definition _soundDefinitions[] = { @@ -234,6 +235,7 @@ sound_configuration gConfigSound; cheat_configuration gConfigCheat; twitch_configuration gConfigTwitch; themes_configuration gConfigThemes; +title_sequences_configuration gConfigTitleSequences; bool config_open(const utf8string path); bool config_save(const utf8string path); @@ -1398,4 +1400,244 @@ static theme_property_definition *themes_get_property_def(theme_section_definiti return NULL; } +#pragma endregion + +#pragma region Title Sequences + +static void title_sequence_open(const char *path, const char *customName); + +void title_sequences_set_default() +{ + char path[MAX_PATH]; + char sep = platform_get_path_separator(); + + platform_get_user_directory(path, "title sequences"); + platform_ensure_directory_exists(path); + + gConfigTitleSequences.presets = malloc(0); + gConfigTitleSequences.num_presets = 0; + + // Load OpenRCT2 title sequence + sprintf(path, "%s%c%s%c%s%c%s%c", gExePath, sep, "data", sep, "title", sep, "rct2", sep); + title_sequence_open(path, language_get_string(5308)); + + // Load OpenRCT2 title sequence + sprintf(path, "%s%c%s%c%s%c%s%c", gExePath, sep, "data", sep, "title", sep, "openrct2", sep); + title_sequence_open(path, language_get_string(5309)); +} + +void title_sequences_load_presets() +{ + utf8 path[MAX_PATH], titleDir[MAX_PATH]; + int dirEnumHandle, i; + + // Find all directories in the title sequences folder + platform_get_user_directory(path, "title sequences"); + dirEnumHandle = platform_enumerate_directories_begin(path); + while (platform_enumerate_directories_next(dirEnumHandle, titleDir)) { + platform_get_user_directory(path, "title sequences"); + strcat(path, titleDir); + title_sequence_open(path, NULL); + } + platform_enumerate_directories_end(dirEnumHandle); + + // Check which title sequence is the current one + if (_stricmp(gConfigInterface.current_title_sequence_preset, "*RCT2") == 0) { + gCurrentTitleSequence = 0; + } + else if (_stricmp(gConfigInterface.current_title_sequence_preset, "*OPENRCT2") == 0) { + gCurrentTitleSequence = 1; + } + else { + for (i = TITLE_SEQUENCE_DEFAULT_PRESETS; i < gConfigTitleSequences.num_presets; i++) { + if (_stricmp(gConfigInterface.current_title_sequence_preset, gConfigTitleSequences.presets[i].name) == 0) { + gCurrentTitleSequence = i; + break; + } + } + if (i == gConfigTitleSequences.num_presets) { + gCurrentTitleSequence = 0; + } + } + gCurrentPreviewTitleSequence = gCurrentTitleSequence; +} + +static void title_sequence_open(const char *path, const char *customName) +{ + utf8 titlePath[MAX_PATH], scriptPath[MAX_PATH]; + file_info fileInfo; + FILE *file; + int fileEnumHandle, i, preset; + char parts[3 * 128], *token, *part1, *part2; + char separator = platform_get_path_separator(); + + // Check for the script file + strcpy(scriptPath, path); + strcat(scriptPath, "script.txt"); + if (!platform_file_exists(scriptPath)) { + // No script file, title sequence is invalid + return; + } + + // Check if the preset is already loaded + // No nead to read the first two presets as they're hardcoded in + for (preset = 0; preset < gConfigTitleSequences.num_presets; preset++) { + if (_stricmp(path, gConfigTitleSequences.presets[preset].name) == 0) { + return; + } + } + // Otherwise allocate one + if (preset == gConfigTitleSequences.num_presets) { + gConfigTitleSequences.num_presets++; + gConfigTitleSequences.presets = realloc(gConfigTitleSequences.presets, sizeof(title_sequence) * (size_t)gConfigTitleSequences.num_presets); + + if (customName == NULL) { + char nameBuffer[MAX_PATH], *name; + strcpy(nameBuffer, path); + name = nameBuffer + strlen(nameBuffer) - 1; + while (*name == '\\' || *name == '/') { + *name = 0; + name--; + } + while (*(name - 1) != '\\' && *(name - 1) != '/') { + name--; + } + strcpy(gConfigTitleSequences.presets[preset].name, name); + gConfigTitleSequences.presets[preset].path[0] = 0; + } + else { + strcpy(gConfigTitleSequences.presets[preset].name, customName); + strcpy(gConfigTitleSequences.presets[preset].path, path); + } + + gConfigTitleSequences.presets[preset].saves = malloc(0); + gConfigTitleSequences.presets[preset].commands = malloc(0); + gConfigTitleSequences.presets[preset].num_saves = 0; + gConfigTitleSequences.presets[preset].num_commands = 0; + } + + // Get the save file list + strcpy(titlePath, path); + strcat(titlePath, "*.sv6"); + fileEnumHandle = platform_enumerate_files_begin(titlePath); + while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) { + gConfigTitleSequences.presets[preset].num_saves++; + gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); + strcpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], fileInfo.path); + } + platform_enumerate_files_end(fileEnumHandle); + strcpy(titlePath, path); + strcat(titlePath, "*.sc6"); + fileEnumHandle = platform_enumerate_files_begin(titlePath); + while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) { + gConfigTitleSequences.presets[preset].num_saves++; + gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); + strcpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], fileInfo.path); + } + platform_enumerate_files_end(fileEnumHandle); + + // Load the script file + file = fopen(scriptPath, "r"); + + do { + title_script_get_line(file, parts); + + token = &parts[0 * 128]; + part1 = &parts[1 * 128]; + part2 = &parts[2 * 128]; + title_command command; + command.command = 0xFF; + + if (token[0] != 0) { + if (_stricmp(token, "LOAD") == 0) { + command.command = TITLE_SCRIPT_LOAD; + command.saveIndex = 0xFF; + for (i = 0; i < gConfigTitleSequences.presets[preset].num_saves && command.saveIndex == 0xFF; i++) { + if (_stricmp(part1, gConfigTitleSequences.presets[preset].saves[i]) == 0) + command.saveIndex = i; + } + } else if (_stricmp(token, "LOCATION") == 0) { + command.command = TITLE_SCRIPT_LOCATION; + command.x = atoi(part1) & 0xFF; + command.y = atoi(part2) & 0xFF; + } else if (_stricmp(token, "ROTATE") == 0) { + command.command = TITLE_SCRIPT_ROTATE; + command.rotations = atoi(part1) & 0xFF; + } else if (_stricmp(token, "ZOOM") == 0) { + command.command = TITLE_SCRIPT_ZOOM; + command.zoom = atoi(part1) & 0xFF; + } else if (_stricmp(token, "WAIT") == 0) { + command.command = TITLE_SCRIPT_WAIT; + command.seconds = atoi(part1) & 0xFF; + } else if (_stricmp(token, "RESTART") == 0) { + command.command = TITLE_SCRIPT_RESTART; + } else if (_stricmp(token, "END") == 0) { + command.command = TITLE_SCRIPT_END; + } else if (_stricmp(token, "LOADMM") == 0) { + command.command = TITLE_SCRIPT_LOADMM; + } + } + if (command.command != 0xFF) { + gConfigTitleSequences.presets[preset].num_commands++; + gConfigTitleSequences.presets[preset].commands = realloc(gConfigTitleSequences.presets[preset].commands, sizeof(title_command) * (size_t)gConfigTitleSequences.presets[preset].num_commands); + gConfigTitleSequences.presets[preset].commands[gConfigTitleSequences.presets[preset].num_commands - 1] = command; + } + } while (!feof(file)); + fclose(file); +} + +void title_sequence_save_preset_script(int preset) +{ + utf8 path[MAX_PATH]; + FILE *file; + int i; + char separator = platform_get_path_separator(); + + + platform_get_user_directory(path, "title sequences"); + strcat(path, path_get_filename(gConfigTitleSequences.presets[preset].name)); + strncat(path, &separator, 1); + strcat(path, "script.txt"); + + file = fopen(path, "wb"); + if (file == NULL) { + log_error("Unable to write to script file."); + return; + } + + for (i = 0; i < gConfigTitleSequences.presets[preset].num_commands; i++) { + title_command *command = &gConfigTitleSequences.presets[preset].commands[i]; + switch (command->command) { + case TITLE_SCRIPT_LOAD: + if (command->saveIndex == 0xFF) + fprintf(file, "LOAD \r\n"); + else + fprintf(file, "LOAD %s\r\n", gConfigTitleSequences.presets[preset].saves[command->saveIndex]); + break; + case TITLE_SCRIPT_LOCATION: + fprintf(file, "LOCATION %i %i\r\n", command->x, command->y); + break; + case TITLE_SCRIPT_ROTATE: + fprintf(file, "ROTATE %i\r\n", command->rotations); + break; + case TITLE_SCRIPT_ZOOM: + fprintf(file, "ZOOM %i\r\n", command->zoom); + break; + case TITLE_SCRIPT_WAIT: + fprintf(file, "WAIT %i\r\n\r\n", command->seconds); + break; + case TITLE_SCRIPT_RESTART: + fprintf(file, "RESTART\r\n"); + break; + case TITLE_SCRIPT_END: + fprintf(file, "END\r\n"); + break; + + } + } + + fclose(file); +} + + #pragma endregion diff --git a/src/config.h b/src/config.h index b7469a7ab9..60a95d9022 100644 --- a/src/config.h +++ b/src/config.h @@ -150,7 +150,6 @@ typedef struct { uint8 date_format; uint8 auto_staff_placement; utf8string last_run_version; - uint8 title_sequence; uint8 invert_viewport_drag; uint8 load_save_sort; } general_configuration; @@ -162,6 +161,7 @@ typedef struct { uint8 select_by_track_type; uint8 console_small_font; utf8string current_theme_preset; + utf8string current_title_sequence_preset; } interface_configuration; typedef struct { @@ -218,6 +218,36 @@ typedef struct { uint16 num_presets; } themes_configuration; +#define TITLE_SEQUENCE_MAX_SAVE_LENGTH 51 + +typedef struct { + uint8 command; + union { + uint8 saveIndex; // LOAD (this index is internal only) + uint8 x; // LOCATION + uint8 rotations; // ROTATE (counter-clockwise) + uint8 zoom; // ZOOM + uint8 seconds; // WAIT + }; + uint8 y; // LOCATION +} title_command; + +typedef struct { + char name[256]; + char path[MAX_PATH]; // Needed for non-modifiable presets + char (*saves)[TITLE_SEQUENCE_MAX_SAVE_LENGTH]; + title_command *commands; + uint8 num_saves; + uint16 num_commands; + +} title_sequence; + +typedef struct { + title_sequence *presets; + uint16 num_presets; + +} title_sequences_configuration; + typedef struct { uint8 key; uint8 modifier; @@ -229,6 +259,7 @@ extern sound_configuration gConfigSound; extern cheat_configuration gConfigCheat; extern twitch_configuration gConfigTwitch; extern themes_configuration gConfigThemes; +extern title_sequences_configuration gConfigTitleSequences; extern uint16 gShortcutKeys[SHORTCUT_COUNT]; @@ -248,4 +279,8 @@ void themes_set_default(); void themes_load_presets(); bool themes_save_preset(int preset); +void title_sequences_set_default(); +void title_sequences_load_presets(); +void title_sequence_save_preset_script(int preset); + #endif diff --git a/src/input.c b/src/input.c index 3bffaed02c..2d4ea19218 100644 --- a/src/input.c +++ b/src/input.c @@ -533,6 +533,7 @@ static void input_scroll_continue(rct_window *w, int widgetIndex, int state, int { rct_widget *widget; int scroll_part, scroll_id; + int x2, y2; widget = &w->widgets[widgetIndex]; if (widgetIndex != RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WIDGETINDEX, uint32)){ @@ -548,7 +549,7 @@ static void input_scroll_continue(rct_window *w, int widgetIndex, int state, int return; } - widget_scroll_get_part(w, widget, x, y, &x, &y, &scroll_part, &scroll_id); + widget_scroll_get_part(w, widget, x, y, &x2, &y2, &scroll_part, &scroll_id); if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SCROLL_AREA, uint16) == SCROLL_PART_HSCROLLBAR_THUMB){ int temp_x = x; @@ -566,6 +567,9 @@ static void input_scroll_continue(rct_window *w, int widgetIndex, int state, int return; } + x = x2; + y = y2; + if (scroll_part != RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SCROLL_AREA, uint16)){ invalidate_scroll(); return; diff --git a/src/interface/console.c b/src/interface/console.c index 5baddb4d65..71f32c03c9 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -846,6 +846,8 @@ static int cc_open(const char **argv, int argc) { window_options_open(); } else if (strcmp(argv[0], "themes") == 0) { window_themes_open(); + } else if (strcmp(argv[0], "title_sequences") == 0) { + window_title_editor_open(0); } else if (invalidTitle) { console_writeline_error("Cannot open this window in the title screen."); } else { @@ -898,7 +900,8 @@ char* console_window_table[] = { "inventions_list", "scenario_options", "options", - "themes" + "themes", + "title_sequences" }; console_command console_command_table[] = { diff --git a/src/interface/themes.c b/src/interface/themes.c index dc22390267..2fe2d20e6e 100644 --- a/src/interface/themes.c +++ b/src/interface/themes.c @@ -83,6 +83,7 @@ theme_window_definition gThemeWindowDefinitions[] = { { WC_STAFF, "staff", 5207, COLOURS_3(1, 4, 4) }, { WC_EDITOR_TRACK_BOTTOM_TOOLBAR, "editor_track_bottom_toolbar", 5247, COLOURS_3(135, 135, 135) }, { WC_EDITOR_SCENARIO_BOTTOM_TOOLBAR, "editor_scenario_bottom_toolbar", 5248, COLOURS_3(150, 150, 141) }, + { WC_TITLE_EDITOR, "title_sequences", 5433, COLOURS_3(1, 15, 15) }, }; #define COLOURS_RCT1(c0, c1, c2, c3, c4, c5) { { (c0), (c1), (c2), (c3), (c4), (c5) } } @@ -232,10 +233,10 @@ void theme_rename_preset(int preset, const char *newName) strcat(dest, ".ini"); platform_file_move(src, dest); - strcpy(gConfigThemes.presets[gCurrentTheme].name, newName); + strcpy(gConfigThemes.presets[preset].name, newName); if (preset == gCurrentTheme) { - gConfigInterface.current_theme_preset = gConfigThemes.presets[gCurrentTheme].name; + gConfigInterface.current_theme_preset = gConfigThemes.presets[preset].name; } } } diff --git a/src/interface/title_sequences.c b/src/interface/title_sequences.c new file mode 100644 index 0000000000..dce6d9bb01 --- /dev/null +++ b/src/interface/title_sequences.c @@ -0,0 +1,367 @@ +/***************************************************************************** +* Copyright (c) 2014 Ted John, Peter Hill +* OpenRCT2, an open source clone of Roller Coaster Tycoon 2. +* +* This file is part of OpenRCT2. +* +* OpenRCT2 is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. + +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. + +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*****************************************************************************/ + +#include "../localisation/string_ids.h" +#include "window.h" +#include "title_sequences.h" +#include "../title.h" +#include "../util/util.h" + + +uint16 gCurrentTitleSequence; +uint16 gCurrentPreviewTitleSequence; + +title_command TitleScriptMakeCommand(int command, int parameter1, int parameter2) +{ + title_command titleCommand = { (uint8)command, (uint8)parameter1, (uint8)parameter2 }; + return titleCommand; +} + +bool title_sequence_name_exists(const char *name) +{ + for (int i = 0; i < gConfigTitleSequences.num_presets; i++) { + if (_stricmp(gConfigTitleSequences.presets[i].name, name) == 0) + return true; + } + return false; +} + +bool title_sequence_save_exists(int preset, const char *name) +{ + utf8 newName[MAX_PATH]; + char *extension = (char*)path_get_extension(name); + strcpy(newName, name); + if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) + strcat(newName, ".sv6"); + for (int i = 0; i < gConfigTitleSequences.presets[preset].num_saves; i++) { + if (_stricmp(gConfigTitleSequences.presets[preset].saves[i], newName) == 0) + return true; + } + return false; +} + + +void title_sequence_change_preset(int preset) +{ + if (preset >= 0 && preset < gConfigTitleSequences.num_presets) { + switch (preset) { + case 0: + gConfigInterface.current_title_sequence_preset = "*RCT2"; + break; + case 1: + gConfigInterface.current_title_sequence_preset = "*OPENRCT2"; + break; + default: + gConfigInterface.current_title_sequence_preset = gConfigTitleSequences.presets[preset].name; + break; + } + gCurrentPreviewTitleSequence = preset; + } + window_invalidate_all(); + + // Switch to (and restart) this title sequence if it's valid + title_refresh_sequence(); +} + +void title_sequence_create_preset(const char *name) +{ + if (filename_valid_characters(name) && !title_sequence_name_exists(name)) { + int preset = gConfigTitleSequences.num_presets; + gConfigTitleSequences.num_presets++; + gConfigTitleSequences.presets = realloc(gConfigTitleSequences.presets, sizeof(title_sequence) * (size_t)gConfigTitleSequences.num_presets); + strcpy(gConfigTitleSequences.presets[preset].name, name); + gConfigTitleSequences.presets[preset].path[0] = 0; + + gConfigTitleSequences.presets[preset].saves = malloc(0); + gConfigTitleSequences.presets[preset].commands = malloc(0); + gConfigTitleSequences.presets[preset].num_saves = 0; + gConfigTitleSequences.presets[preset].num_commands = 0; + + // Create the folder + utf8 path[MAX_PATH]; + platform_get_user_directory(path, "title sequences"); + strcat(path, gConfigTitleSequences.presets[preset].name); + platform_file_delete(path); + platform_ensure_directory_exists(path); + + title_sequence_save_preset_script(preset); + title_sequence_change_preset(preset); + } +} + +void title_sequence_duplicate_preset(int duplicate, const char *name) +{ + if (duplicate >= 0 && duplicate < gConfigTitleSequences.num_presets && filename_valid_characters(name) && !title_sequence_name_exists(name)) { + int preset = gConfigTitleSequences.num_presets; + gConfigTitleSequences.num_presets++; + gConfigTitleSequences.presets = realloc(gConfigTitleSequences.presets, sizeof(title_sequence) * (size_t)gConfigTitleSequences.num_presets); + strcpy(gConfigTitleSequences.presets[preset].name, name); + gConfigTitleSequences.presets[preset].path[0] = 0; + + size_t savesSize = sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * gConfigTitleSequences.presets[duplicate].num_saves; + size_t commandsSize = sizeof(title_command) * gConfigTitleSequences.presets[duplicate].num_commands; + gConfigTitleSequences.presets[preset].saves = malloc(savesSize); + gConfigTitleSequences.presets[preset].commands = malloc(commandsSize); + memcpy(gConfigTitleSequences.presets[preset].saves, gConfigTitleSequences.presets[duplicate].saves, savesSize); + memcpy(gConfigTitleSequences.presets[preset].commands, gConfigTitleSequences.presets[duplicate].commands, commandsSize); + gConfigTitleSequences.presets[preset].num_saves = gConfigTitleSequences.presets[duplicate].num_saves; + gConfigTitleSequences.presets[preset].num_commands = gConfigTitleSequences.presets[duplicate].num_commands; + + bool loadmm = false; + for (int i = 0; i < gConfigTitleSequences.presets[preset].num_commands; i++) { + if (gConfigTitleSequences.presets[preset].commands[i].command == TITLE_SCRIPT_LOADMM) { + loadmm = true; + gConfigTitleSequences.presets[preset].commands[i].command = TITLE_SCRIPT_LOAD; + gConfigTitleSequences.presets[preset].commands[i].saveIndex = gConfigTitleSequences.presets[duplicate].num_saves; + } + } + + // Create the folder + utf8 path[MAX_PATH], srcPath[MAX_PATH]; + platform_get_user_directory(path, "title sequences"); + strcat(path, gConfigTitleSequences.presets[preset].name); + platform_file_delete(path); + platform_ensure_directory_exists(path); + + // Copy the saves + char separator = platform_get_path_separator(); + for (int i = 0; i < gConfigTitleSequences.presets[preset].num_saves; i++) { + if (gConfigTitleSequences.presets[duplicate].path[0]) { + strcpy(srcPath, gConfigTitleSequences.presets[duplicate].path); + strcat(srcPath, gConfigTitleSequences.presets[duplicate].saves[i]); + } + else { + platform_get_user_directory(srcPath, "title sequences"); + strcat(srcPath, gConfigTitleSequences.presets[duplicate].name); + strncat(srcPath, &separator, 1); + strcat(srcPath, gConfigTitleSequences.presets[duplicate].saves[i]); + } + platform_get_user_directory(path, "title sequences"); + strcat(path, gConfigTitleSequences.presets[preset].name); + strncat(path, &separator, 1); + strcat(path, gConfigTitleSequences.presets[preset].saves[i]); + + platform_file_copy(srcPath, path); + } + + if (loadmm) { + title_sequence_add_save(preset, get_file_path(PATH_ID_SIXFLAGS_MAGICMOUNTAIN), "Six Flags Magic Mountain.SC6"); + } + + title_sequence_save_preset_script(preset); + //title_sequence_change_preset(preset); + gCurrentTitleSequence = preset; + } +} + +void title_sequence_delete_preset(int preset) +{ + if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets) { + // Delete the folder + utf8 path[MAX_PATH]; + char separator = platform_get_path_separator(); + platform_get_user_directory(path, "title sequences"); + strcat(path, gConfigTitleSequences.presets[preset].name); + if (!platform_directory_delete(path)) { + log_error("Failed to delete directory: \"%s\"", path); + } + + free(gConfigTitleSequences.presets[preset].saves); + free(gConfigTitleSequences.presets[preset].commands); + + for (int i = preset; i < gConfigTitleSequences.num_presets - 1; i++) { + gConfigTitleSequences.presets[i] = gConfigTitleSequences.presets[i + 1]; + } + gConfigTitleSequences.num_presets--; + gConfigTitleSequences.presets = realloc(gConfigTitleSequences.presets, sizeof(title_sequence) * (size_t)gConfigTitleSequences.num_presets); + + gCurrentTitleSequence--; + if (gCurrentPreviewTitleSequence > preset) + title_sequence_change_preset(gCurrentPreviewTitleSequence - 1); + else if (gCurrentPreviewTitleSequence == preset) + title_sequence_change_preset(0); + } +} + +void title_sequence_rename_preset(int preset, const char *newName) +{ + if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && filename_valid_characters(newName) && !title_sequence_name_exists(newName)) { + // Rename the folder + utf8 src[MAX_PATH], dest[MAX_PATH]; + platform_get_user_directory(src, "title sequences"); + platform_get_user_directory(dest, "title sequences"); + strcat(src, gConfigTitleSequences.presets[preset].name); + strcat(dest, newName); + platform_file_move(src, dest); + + strcpy(gConfigTitleSequences.presets[preset].name, newName); + + // Rename the config preset name if needed + if (preset == gCurrentPreviewTitleSequence) { + gConfigInterface.current_title_sequence_preset = gConfigTitleSequences.presets[preset].name; + } + } +} + + +void title_sequence_add_save(int preset, const char *path, const char *newName) +{ + utf8 newPath[MAX_PATH]; + char *extension = (char*)path_get_extension(newName); + strcpy(newPath, newName); + if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) + strcat(newPath, ".sv6"); + if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && filename_valid_characters(newPath) && !title_sequence_save_exists(preset, newPath) && platform_file_exists(path)) { + // Copy the save file + char separator = platform_get_path_separator(); + platform_get_user_directory(newPath, "title sequences"); + strcat(newPath, gConfigTitleSequences.presets[preset].name); + strncat(newPath, &separator, 1); + strcat(newPath, newName); + // Add the appropriate extension if needed + if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) + strcat(newPath, ".sv6"); + platform_file_copy(path, newPath); + + gConfigTitleSequences.presets[preset].num_saves++; + gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); + + strcpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], newName); + // Add the appropriate extension if needed + if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) + strcat(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], ".sv6"); + } +} + +void title_sequence_remove_save(int preset, int index) +{ + if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && index >= 0 && index < gConfigTitleSequences.presets[preset].num_saves) { + // Delete the save file + char separator = platform_get_path_separator(); + utf8 path[MAX_PATH]; + platform_get_user_directory(path, "title sequences"); + strcat(path, gConfigTitleSequences.presets[preset].name); + strncat(path, &separator, 1); + strcat(path, gConfigTitleSequences.presets[preset].saves[index]); + platform_file_delete(path); + + // Remove all references to this save in the commands and decrement save indecies + for (int i = 0; i < gConfigTitleSequences.presets[preset].num_commands; i++) { + if (gConfigTitleSequences.presets[preset].commands[i].command == TITLE_SCRIPT_LOAD) { + if (gConfigTitleSequences.presets[preset].commands[i].saveIndex == index) + gConfigTitleSequences.presets[preset].commands[i].saveIndex = 0xFF; + else if (gConfigTitleSequences.presets[preset].commands[i].saveIndex > index && gConfigTitleSequences.presets[preset].commands[i].saveIndex != 0xFF) + gConfigTitleSequences.presets[preset].commands[i].saveIndex--; + } + } + + for (int i = index; i < gConfigTitleSequences.presets[preset].num_saves - 1; i++) { + strcpy(gConfigTitleSequences.presets[preset].saves[i], gConfigTitleSequences.presets[preset].saves[i + 1]); + } + gConfigTitleSequences.presets[preset].num_saves--; + gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); + title_sequence_save_preset_script(preset); + } +} + +void title_sequence_rename_save(int preset, int index, const char *newName) +{ + if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && index >= 0 && index < gConfigTitleSequences.presets[preset].num_saves && + filename_valid_characters(newName) && !title_sequence_save_exists(preset, newName)) { + + // Rename the save file + char separator = platform_get_path_separator(); + utf8 src[MAX_PATH], dest[MAX_PATH]; + platform_get_user_directory(src, "title sequences"); + platform_get_user_directory(dest, "title sequences"); + strcat(src, gConfigTitleSequences.presets[preset].name); + strcat(dest, gConfigTitleSequences.presets[preset].name); + strncat(src, &separator, 1); + strncat(dest, &separator, 1); + strcat(src, gConfigTitleSequences.presets[preset].saves[index]); + strcat(dest, newName); + // Add the appropriate extension if needed + char *extension = (char*)path_get_extension(newName); + if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) + strcat(dest, ".sv6"); + platform_file_move(src, dest); + + strcpy(gConfigTitleSequences.presets[preset].saves[index], newName); + // Add the appropriate extension if needed + if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) + strcat(gConfigTitleSequences.presets[preset].saves[index], ".sv6"); + title_sequence_save_preset_script(preset); + } +} + + +void title_sequence_add_command(int preset, title_command command) +{ + if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets) { + gConfigTitleSequences.presets[preset].commands = realloc(gConfigTitleSequences.presets[preset].commands, sizeof(title_command) * (size_t)(gConfigTitleSequences.presets[preset].num_commands + 1)); + gConfigTitleSequences.presets[preset].commands[gConfigTitleSequences.presets[preset].num_commands] = command; + gConfigTitleSequences.presets[preset].num_commands++; + title_sequence_save_preset_script(preset); + } +} +void title_sequence_insert_command(int preset, int index, title_command command) +{ + if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && index >= 0 && index <= gConfigTitleSequences.presets[preset].num_commands) { + gConfigTitleSequences.presets[preset].commands = realloc(gConfigTitleSequences.presets[preset].commands, sizeof(title_command) * (size_t)(gConfigTitleSequences.presets[preset].num_commands + 1)); + for (int i = gConfigTitleSequences.presets[preset].num_commands; i > index; i--) { + gConfigTitleSequences.presets[preset].commands[i] = gConfigTitleSequences.presets[preset].commands[i - 1]; + } + gConfigTitleSequences.presets[preset].commands[index] = command; + gConfigTitleSequences.presets[preset].num_commands++; + title_sequence_save_preset_script(preset); + } +} + +void title_sequence_delete_command(int preset, int index) +{ + if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && index >= 0 && index < gConfigTitleSequences.presets[preset].num_commands) { + for (int i = index; i < gConfigTitleSequences.presets[preset].num_commands - 1; i++) { + gConfigTitleSequences.presets[preset].commands[i] = gConfigTitleSequences.presets[preset].commands[i + 1]; + } + gConfigTitleSequences.presets[preset].num_commands--; + gConfigTitleSequences.presets[preset].commands = realloc(gConfigTitleSequences.presets[preset].commands, sizeof(title_command) * (size_t)gConfigTitleSequences.presets[preset].num_commands); + title_sequence_save_preset_script(preset); + } +} + +void title_sequence_move_down_command(int preset, int index) +{ + if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && index >= 0 && index + 1 < gConfigTitleSequences.presets[preset].num_commands) { + title_command command = gConfigTitleSequences.presets[preset].commands[index]; + gConfigTitleSequences.presets[preset].commands[index] = gConfigTitleSequences.presets[preset].commands[index + 1]; + gConfigTitleSequences.presets[preset].commands[index + 1] = command; + title_sequence_save_preset_script(preset); + } +} + +void title_sequence_move_up_command(int preset, int index) +{ + if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && index > 0 && index < gConfigTitleSequences.presets[preset].num_commands) { + title_command command = gConfigTitleSequences.presets[preset].commands[index]; + gConfigTitleSequences.presets[preset].commands[index] = gConfigTitleSequences.presets[preset].commands[index - 1]; + gConfigTitleSequences.presets[preset].commands[index - 1] = command; + title_sequence_save_preset_script(preset); + } +} diff --git a/src/interface/title_sequences.h b/src/interface/title_sequences.h new file mode 100644 index 0000000000..3c46ebbda2 --- /dev/null +++ b/src/interface/title_sequences.h @@ -0,0 +1,68 @@ +/***************************************************************************** +* Copyright (c) 2014 Ted John, Peter Hill, Duncan Frost +* OpenRCT2, an open source clone of Roller Coaster Tycoon 2. +* +* This file is part of OpenRCT2. +* +* OpenRCT2 is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. + +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. + +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*****************************************************************************/ + +#ifndef _TITLE_SEQUENCES_H_ +#define _TITLE_SEQUENCES_H_ + +#include "../common.h" +#include "window.h" +#include "../config.h" +#include "../title.h" + +#define TITLE_SEQUENCE_DEFAULT_PRESETS 2 + +title_command TitleScriptMakeCommand(int command, int parameter1, int parameter2); + +#define TITLE_WAIT(t) TitleScriptMakeCommand(TITLE_SCRIPT_WAIT, t, 0) +#define TITLE_LOADMM() TitleScriptMakeCommand(TITLE_SCRIPT_LOADMM, 0, 0) +#define TITLE_LOCATION(x, y) TitleScriptMakeCommand(TITLE_SCRIPT_LOCATION, x, y) +#define TITLE_ROTATE(n) TitleScriptMakeCommand(TITLE_SCRIPT_ROTATE, n, 0) +#define TITLE_ZOOM(d) TitleScriptMakeCommand(TITLE_SCRIPT_ZOOM, d, 0) +#define TITLE_RESTART() TitleScriptMakeCommand(TITLE_SCRIPT_RESTART, 0, 0) +#define TITLE_LOAD(i) TitleScriptMakeCommand(TITLE_SCRIPT_LOAD, i, 0) + +// The index of the current title sequence being edited +extern uint16 gCurrentTitleSequence; +// The index of the current title sequence being shown +extern uint16 gCurrentPreviewTitleSequence; + +bool title_sequence_name_exists(const char *name); +bool title_sequence_save_exists(int preset, const char *name); + +// Presets +void title_sequence_change_preset(int preset); +void title_sequence_create_preset(const char *name); +void title_sequence_duplicate_preset(int duplicate, const char *name); +void title_sequence_delete_preset(int preset); +void title_sequence_rename_preset(int preset, const char *newName); + +// Saves +void title_sequence_add_save(int preset, const char *path, const char *newName); +void title_sequence_remove_save(int preset, int index); +void title_sequence_rename_save(int preset, int index, const char *newName); + +// Commands +void title_sequence_add_command(int preset, title_command command); +void title_sequence_insert_command(int preset, int index, title_command command); +void title_sequence_delete_command(int preset, int index); +void title_sequence_move_down_command(int preset, int index); +void title_sequence_move_up_command(int preset, int index); + +#endif \ No newline at end of file diff --git a/src/interface/window.c b/src/interface/window.c index 5a88d463f1..bdd5084f98 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -46,6 +46,7 @@ char gTextBoxInput[512] = { 0 }; int gMaxTextBoxInputLength = 0; int gTextBoxFrameNo = 0; bool gUsingWidgetTextBox = 0; +bool gLoadSaveTitleSequenceSave = 0; // converted from uint16 values at 0x009A41EC - 0x009A4230 // these are percentage coordinates of the viewport to center to, if a window is obscuring a location, the next is tried @@ -2486,6 +2487,7 @@ void window_cancel_textbox() gCurrentTextBox.window.classification, gCurrentTextBox.window.number ); + window_event_textinput_call(w, gCurrentTextBox.widget_index, NULL); gCurrentTextBox.window.classification = 255; gCurrentTextBox.window.number = 0; platform_stop_text_input(); diff --git a/src/interface/window.h b/src/interface/window.h index 30527bda51..9aee92e59a 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -414,6 +414,8 @@ enum { WC_THEMES = 119, WC_TILE_INSPECTOR = 120, WC_CHANGELOG = 121, + WC_TITLE_EDITOR = 122, + WC_TITLE_COMMAND_EDITOR = 123, // Only used for colour schemes WC_STAFF = 220, @@ -444,9 +446,11 @@ enum { LOADSAVETYPE_GAME = 0 << 1, LOADSAVETYPE_LANDSCAPE = 1 << 1, LOADSAVETYPE_SCENARIO = 2 << 1, - LOADSAVETYPE_TRACK = 3 << 1, + LOADSAVETYPE_TRACK = 3 << 1 }; +extern bool gLoadSaveTitleSequenceSave; + // rct2: 0x01420078 extern rct_window* g_window_list; @@ -580,6 +584,8 @@ void window_publisher_credits_open(); void window_track_manage_open(); void window_viewport_open(); void window_themes_open(); +void window_title_editor_open(int tab); +void window_title_command_editor_open(int command, bool insert); void window_tile_inspector_open(); void window_text_input_open(rct_window* call_w, int call_widget, rct_string_id title, rct_string_id description, rct_string_id existing_text, uint32 existing_args, int maxLength); void window_text_input_raw_open(rct_window* call_w, int call_widget, rct_string_id title, rct_string_id description, utf8string existing_text, int maxLength); diff --git a/src/openrct2.c b/src/openrct2.c index 83875fa3d6..d5589b8d0e 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -30,6 +30,7 @@ #include "platform/platform.h" #include "util/sawyercoding.h" #include "world/mapgen.h" +#include "title.h" int gOpenRCT2StartupAction = STARTUP_ACTION_TITLE; char gOpenRCT2StartupActionPath[512] = { 0 }; @@ -174,6 +175,8 @@ bool openrct2_initialise() themes_set_default(); themes_load_presets(); + title_sequences_set_default(); + title_sequences_load_presets(); if (!rct2_init()) return false; diff --git a/src/platform/platform.h b/src/platform/platform.h index 2b103f9955..3a6c7c6ba9 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -90,6 +90,7 @@ int platform_directory_exists(const char *path); int platform_original_game_data_exists(const char *path); time_t platform_file_get_modified_time(char* path); int platform_ensure_directory_exists(const char *path); +int platform_directory_delete(const char *path); int platform_lock_single_instance(); int platform_enumerate_files_begin(const char *pattern); int platform_enumerate_files_next(int handle, file_info *outFileInfo); diff --git a/src/platform/windows.c b/src/platform/windows.c index 97b0005157..df02a1fb3c 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -116,6 +116,28 @@ int platform_ensure_directory_exists(const char *path) return CreateDirectory(path, NULL); } +int platform_directory_delete(const char *path) +{ + char pszFrom[MAX_PATH]; + strcpy(pszFrom, path); + // Needs to be double-null terminated for some weird reason + pszFrom[strlen(path) + 1] = 0; + + SHFILEOPSTRUCTA fileop; + fileop.hwnd = NULL; // no status display + fileop.wFunc = FO_DELETE; // delete operation + fileop.pFrom = pszFrom; // source file name as double null terminated string + fileop.pTo = NULL; // no destination needed + fileop.fFlags = FOF_NOCONFIRMATION|FOF_SILENT; // do not prompt the user + + fileop.fAnyOperationsAborted = FALSE; + fileop.lpszProgressTitle = NULL; + fileop.hNameMappings = NULL; + + int ret = SHFileOperationA(&fileop); + return (ret == 0); +} + int platform_lock_single_instance() { HANDLE mutex, status; diff --git a/src/rct2.c b/src/rct2.c index 75d2a20421..0b3068ebe5 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -345,7 +345,7 @@ void rct2_update_2() // Screens if (RCT2_GLOBAL(RCT2_ADDRESS_RUN_INTRO_TICK_PART, uint8) != 0) intro_update(); - else if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 1) + else if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) title_update(); else game_update(); diff --git a/src/sprites.h b/src/sprites.h index b30b07c0a6..1118cd3f7f 100644 --- a/src/sprites.h +++ b/src/sprites.h @@ -380,6 +380,11 @@ enum { SPR_G2_RCT1_OPEN_BUTTON_1 = SPR_G2_BEGIN + 26, SPR_G2_RCT1_OPEN_BUTTON_2 = SPR_G2_BEGIN + 27, SPR_G2_RCT1_OPEN_BUTTON_3 = SPR_G2_BEGIN + 28, + + SPR_G2_TITLE_RESTART = SPR_G2_BEGIN + 29, + SPR_G2_TITLE_STOP = SPR_G2_BEGIN + 30, + SPR_G2_TITLE_PLAY = SPR_G2_BEGIN + 31, + SPR_G2_TITLE_SKIP = SPR_G2_BEGIN + 32, }; #endif diff --git a/src/title.c b/src/title.c index 0950d16453..8104d7f90c 100644 --- a/src/title.c +++ b/src/title.c @@ -42,21 +42,18 @@ #include "world/park.h" #include "world/scenery.h" #include "world/sprite.h" +#include "title.h" +#include "interface/title_sequences.h" +#include "windows/error.h" static const int gRandomShowcase = 0; +sint32 gTitleScriptCommand = -1; +uint8 gTitleScriptSave = 0xFF; +sint32 gTitleScriptSkipTo = -1; +sint32 gTitleScriptSkipLoad = -1; #pragma region Showcase script -enum { - TITLE_SCRIPT_WAIT, - TITLE_SCRIPT_LOADMM, - TITLE_SCRIPT_LOCATION, - TITLE_SCRIPT_ROTATE, - TITLE_SCRIPT_ZOOM, - TITLE_SCRIPT_RESTART, - TITLE_SCRIPT_LOAD -}; - #define WAIT(t) TITLE_SCRIPT_WAIT, t #define LOADMM() TITLE_SCRIPT_LOADMM #define LOCATION(x, y) TITLE_SCRIPT_LOCATION, x, y @@ -82,6 +79,7 @@ static uint8* _loadedScript; static const uint8* _currentScript; static int _scriptNoLoadsSinceRestart; static int _scriptWaitCounter; +static int _scriptCurrentPreset; static void title_init_showcase(); static void title_update_showcase(); @@ -162,7 +160,7 @@ static void title_create_windows() */ static void title_init_showcase() { - _scriptNoLoadsSinceRestart = 1; + /*_scriptNoLoadsSinceRestart = 1; SafeFree(_loadedScript); @@ -179,7 +177,8 @@ static void title_init_showcase() break; } - _scriptWaitCounter = 0; + _scriptWaitCounter = 0;*/ + title_refresh_sequence(); title_update_showcase(); } @@ -236,6 +235,7 @@ static void title_skip_opcode() uint8 script_opcode; script_opcode = *_currentScript++; + gTitleScriptCommand++; switch (script_opcode) { case TITLE_SCRIPT_WAIT: _currentScript++; @@ -266,9 +266,30 @@ static void title_do_next_script_opcode() short x, y, z; uint8 script_opcode, script_operand; rct_window* w; - - script_opcode = *_currentScript++; + gTitleScriptCommand++; + if (*(_currentScript - 1) != TITLE_SCRIPT_END) + script_opcode = *_currentScript++; + else + script_opcode = *_currentScript; + if (gTitleScriptSkipTo != -1) { + if (gTitleScriptSkipTo == gTitleScriptCommand) { + gTitleScriptSkipTo = -1; + gTitleScriptSkipLoad = -1; + } + else if (gTitleScriptSkipLoad == gTitleScriptCommand) { + gTitleScriptSkipLoad = -1; + } + else if (gTitleScriptSkipLoad != -1) { + gTitleScriptCommand--; + _currentScript--; + title_skip_opcode(); + return; + } + } switch (script_opcode) { + case TITLE_SCRIPT_END: + _scriptWaitCounter = 1; + break; case TITLE_SCRIPT_WAIT: _scriptWaitCounter = (*_currentScript++) * 32; break; @@ -277,6 +298,7 @@ static void title_do_next_script_opcode() log_fatal("OpenRCT2 can not currently cope when unable to load title screen scenario."); exit(-1); } + gTitleScriptSave = 0xFF; break; case TITLE_SCRIPT_LOCATION: x = (*_currentScript++) * 32 + 16; @@ -306,6 +328,8 @@ static void title_do_next_script_opcode() break; case TITLE_SCRIPT_RESTART: _scriptNoLoadsSinceRestart = 1; + gTitleScriptCommand = -1; + gTitleScriptSave = 0xFF; _currentScript = _loadedScript; if (gRandomShowcase) { if (_currentScript != NULL) @@ -317,6 +341,7 @@ static void title_do_next_script_opcode() { const uint8 *loadPtr; char *ch, filename[32], path[MAX_PATH]; + char separator = platform_get_path_separator(); loadPtr = _currentScript - 1; @@ -327,19 +352,38 @@ static void title_do_next_script_opcode() } while (*(_currentScript - 1) != 0); // Construct full relative path - sprintf(path, "%s%cData%ctitle%c%s", gExePath, platform_get_path_separator(), platform_get_path_separator(), platform_get_path_separator(), filename); + if (gConfigTitleSequences.presets[_scriptCurrentPreset].path[0]) { + strcpy(path, gConfigTitleSequences.presets[_scriptCurrentPreset].path); + } + else { + platform_get_user_directory(path, "title sequences"); + strcat(path, gConfigTitleSequences.presets[_scriptCurrentPreset].name); + strncat(path, &separator, 1); + } + + strcat(path, filename); if (title_load_park(path)) { _scriptNoLoadsSinceRestart = 0; + gTitleScriptSave = gConfigTitleSequences.presets[gCurrentPreviewTitleSequence].commands[gTitleScriptCommand].saveIndex; } else { + log_error("Failed to load: \"%s\" for the title sequence.", path); script_opcode = *_currentScript; - while (script_opcode != TITLE_SCRIPT_LOADMM && script_opcode != TITLE_SCRIPT_LOAD && script_opcode != TITLE_SCRIPT_RESTART) { + while (script_opcode != TITLE_SCRIPT_LOADMM && script_opcode != TITLE_SCRIPT_LOAD && script_opcode != TITLE_SCRIPT_RESTART && script_opcode != TITLE_SCRIPT_END) { title_skip_opcode(); script_opcode = *_currentScript; } - if (script_opcode == TITLE_SCRIPT_RESTART && _scriptNoLoadsSinceRestart) { + if ((script_opcode == TITLE_SCRIPT_RESTART || script_opcode == TITLE_SCRIPT_END) && _scriptNoLoadsSinceRestart) { if (_currentScript != _magicMountainScript) { + _scriptNoLoadsSinceRestart = 1; + gTitleScriptCommand = -1; + gTitleScriptSave = 0xFF; _currentScript = _magicMountainScript; + gCurrentPreviewTitleSequence = 0; + gTitleScriptSkipTo = -1; + gTitleScriptSkipLoad = -1; + _scriptCurrentPreset = 0; + //window_invalidate_by_class(WC_TITLE_EDITOR); } else { log_fatal("OpenRCT2 can not currently cope when unable to load title screen scenario."); exit(-1); @@ -349,6 +393,7 @@ static void title_do_next_script_opcode() } break; } + window_invalidate_by_class(WC_TITLE_EDITOR); } /** @@ -357,13 +402,28 @@ static void title_do_next_script_opcode() */ static void title_update_showcase() { - if (_scriptWaitCounter <= 0) { + // Loop used for scene skip functionality + // Only loop here when the appropriate save hasn't been loaded yet since no game updates are required + do { do { - title_do_next_script_opcode(); - } while (_scriptWaitCounter == 0); - } + if (_scriptWaitCounter <= 0) { + do { + title_do_next_script_opcode(); + } while (_scriptWaitCounter == 0); + } - _scriptWaitCounter--; + if (gTitleScriptSkipTo != -1 && gTitleScriptSkipLoad != -1) + _scriptWaitCounter = 0; + else if (*(_currentScript - 1) != TITLE_SCRIPT_END) + _scriptWaitCounter--; + } while (gTitleScriptSkipTo != -1 && gTitleScriptSkipLoad != -1); + + if (gTitleScriptSkipTo != -1 && gTitleScriptSkipLoad == -1) { + game_logic_update(); + update_palette_effects(); + update_rain_animation(); + } + } while (gTitleScriptSkipTo != -1 && gTitleScriptSkipLoad == -1); } static void DrawOpenRCT2(int x, int y) @@ -455,37 +515,45 @@ static uint8 *generate_random_script() #pragma region Load script.txt -static void title_script_get_line(FILE *file, char *parts) +void title_script_get_line(FILE *file, char *parts) { - int i, c, part, cindex, whitespace, comment; + int i, c, part, cindex, whitespace, comment, load; for (i = 0; i < 3; i++) - parts[i * 32] = 0; + parts[i * 128] = 0; part = 0; cindex = 0; whitespace = 1; comment = 0; - for (;;) { + load = 0; + for (; part < 3;) { c = fgetc(file); if (c == '\n' || c == '\r' || c == EOF) { - parts[part * 32 + cindex] = 0; + parts[part * 128 + cindex] = 0; return; } else if (c == '#') { - parts[part * 32 + cindex] = 0; + parts[part * 128 + cindex] = 0; comment = 1; - } else if (c == ' ' && !comment) { + } else if (c == ' ' && !comment && !load) { if (!whitespace) { - parts[part * 32 + cindex] = 0; + if (part == 0 && cindex == 4 && _strnicmp(parts, "LOAD", 4) == 0) + load = true; + parts[part * 128 + cindex] = 0; part++; cindex = 0; } } else if (!comment) { whitespace = 0; - if (cindex < 31) { - parts[part * 32 + cindex] = c; + if (cindex < 127) { + parts[part * 128 + cindex] = c; cindex++; } + else { + parts[part * 128 + cindex] = 0; + part++; + cindex = 0; + } } } } @@ -493,7 +561,7 @@ static void title_script_get_line(FILE *file, char *parts) static uint8 *title_script_load() { FILE *file; - char parts[3 * 32], *token, *part1, *part2, *src; + char parts[3 * 128], *token, *part1, *part2, *src; char path[MAX_PATH]; char filePath[] = "data/title/script.txt"; @@ -519,9 +587,9 @@ static uint8 *title_script_load() do { title_script_get_line(file, parts); - token = &parts[0 * 32]; - part1 = &parts[1 * 32]; - part2 = &parts[2 * 32]; + token = &parts[0 * 128]; + part1 = &parts[1 * 128]; + part2 = &parts[2 * 128]; if (token[0] != 0) { if (_stricmp(token, "LOAD") == 0) { @@ -564,3 +632,103 @@ static uint8 *title_script_load() } #pragma endregion + +bool title_refresh_sequence() +{ + _scriptCurrentPreset = gCurrentPreviewTitleSequence; + title_sequence *title = &gConfigTitleSequences.presets[_scriptCurrentPreset]; + + bool hasLoad = false, hasInvalidSave = false, hasWait = false, hasRestart = false; + for (int i = 0; i < title->num_commands && !hasInvalidSave; i++) { + if (title->commands[i].command == TITLE_SCRIPT_LOAD) { + if (title->commands[i].saveIndex == 0xFF) + hasInvalidSave = true; + hasLoad = true; + } + else if (title->commands[i].command == TITLE_SCRIPT_LOADMM) { + hasLoad = true; + } + else if (title->commands[i].command == TITLE_SCRIPT_WAIT) { + hasWait = true; + } + else if (title->commands[i].command == TITLE_SCRIPT_RESTART) { + hasRestart = true; + break; + } + else if (title->commands[i].command == TITLE_SCRIPT_END) { + break; + } + } + if (hasLoad && (hasWait || !hasRestart) && !hasInvalidSave) { + uint8 *src, *scriptPtr, *binaryScript; + binaryScript = malloc(1024 * 8); + scriptPtr = binaryScript; + + for (int i = 0; i < title->num_commands; i++) { + *scriptPtr++ = title->commands[i].command; + switch (title->commands[i].command) { + case TITLE_SCRIPT_LOAD: + src = title->saves[title->commands[i].saveIndex]; + do { + *scriptPtr++ = *src++; + } while (*(src - 1) != 0); + break; + case TITLE_SCRIPT_LOCATION: + *scriptPtr++ = title->commands[i].x; + *scriptPtr++ = title->commands[i].y; + break; + case TITLE_SCRIPT_ROTATE: + *scriptPtr++ = title->commands[i].rotations; + break; + case TITLE_SCRIPT_ZOOM: + *scriptPtr++ = title->commands[i].zoom; + break; + case TITLE_SCRIPT_WAIT: + *scriptPtr++ = title->commands[i].seconds; + break; + } + } + + *scriptPtr++ = TITLE_SCRIPT_END; + + int scriptLength = (int)(scriptPtr - binaryScript); + binaryScript = realloc(binaryScript, scriptLength); + + _scriptNoLoadsSinceRestart = 1; + if (_loadedScript != _magicMountainScript) + SafeFree(_loadedScript); + _loadedScript = binaryScript; + _currentScript = binaryScript; + _scriptWaitCounter = 0; + gTitleScriptCommand = -1; + gTitleScriptSave = 0xFF; + title_update_showcase(); + gfx_invalidate_screen(); + + return true; + } + log_error("Failed to load title sequence, hasLoad: %i, hasWait: %i, hasRestart: %i, hasInvalidSave: %i", hasLoad, hasWait, hasRestart, hasInvalidSave); + window_error_open(5402, (!hasWait && hasRestart) ? 5439 : STR_NONE); + _scriptNoLoadsSinceRestart = 1; + if (_loadedScript != _magicMountainScript) + SafeFree(_loadedScript); + _scriptCurrentPreset = 0; + _currentScript = _magicMountainScript; + _scriptWaitCounter = 0; + gTitleScriptCommand = -1; + gTitleScriptSave = 0xFF; + gCurrentPreviewTitleSequence = 0; + window_invalidate_by_class(WC_OPTIONS); + window_invalidate_by_class(WC_TITLE_EDITOR); + title_update_showcase(); + gfx_invalidate_screen(); + return false; +} + +void title_skip_from_beginning() +{ + _scriptNoLoadsSinceRestart = 1; + gTitleScriptCommand = -1; + gTitleScriptSave = 0xFF; + _currentScript = _loadedScript; +} diff --git a/src/title.h b/src/title.h index 33897b12e7..a174d222f0 100644 --- a/src/title.h +++ b/src/title.h @@ -21,7 +21,28 @@ #ifndef _TITLE_H_ #define _TITLE_H_ +enum { + TITLE_SCRIPT_WAIT, + TITLE_SCRIPT_LOADMM, + TITLE_SCRIPT_LOCATION, + TITLE_SCRIPT_ROTATE, + TITLE_SCRIPT_ZOOM, + TITLE_SCRIPT_RESTART, + TITLE_SCRIPT_LOAD, + TITLE_SCRIPT_END, + TITLE_SCRIPT_LOOP, + TITLE_SCRIPT_ENDLOOP +} TITLE_SCRIPT_COMMANDS; + +extern sint32 gTitleScriptCommand; +extern uint8 gTitleScriptSave; +extern sint32 gTitleScriptSkipTo; +extern sint32 gTitleScriptSkipLoad; + void title_load(); void title_update(); +void title_skip_from_beginning(); +void title_script_get_line(FILE *file, char *parts); +bool title_refresh_sequence(); #endif diff --git a/src/util/util.c b/src/util/util.c index bf856238fa..b015c1c98f 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -41,6 +41,16 @@ int mph_to_kmph(int mph) return (mph * 1648) / 1024; } +bool filename_valid_characters(const char *filename) +{ + for (int i = 0; filename[i] != '\0'; i++) { + if (filename[i] == '\\' || filename[i] == '/' || filename[i] == ':' || filename[i] == '?' || + filename[i] == '*' || filename[i] == '<' || filename[i] == '>' || filename[i] == '|') + return false; + } + return true; +} + const char *path_get_filename(const char *path) { const char *result, *ch; diff --git a/src/util/util.h b/src/util/util.h index e8d8cca36d..18e594d741 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -27,6 +27,8 @@ int squaredmetres_to_squaredfeet(int squaredMetres); int metres_to_feet(int metres); int mph_to_kmph(int mph); +bool filename_valid_characters(const char *filename); + const char *path_get_filename(const char *path); const char *path_get_extension(const char *path); void path_set_extension(char *path, const char *newExtension); diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 0d3e733e5c..5b83b99b58 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -30,6 +30,7 @@ #include "../title.h" #include "../windows/error.h" #include "../interface/themes.h" +#include "../interface/title_sequences.h" #include "../util/util.h" #pragma region Widgets @@ -144,6 +145,7 @@ static rct_window *window_overwrite_prompt_open(const char *name, const char *pa rct_window *window_loadsave_open(int type, char *defaultName) { + gLoadSaveTitleSequenceSave = false; char path[MAX_PATH], *ch; int includeNewItem; rct_window* w; @@ -432,10 +434,25 @@ static void window_loadsave_textinput() int i, overwrite; window_textinput_get_registers(w, widgetIndex, result, text); - + if (!result || text[0] == 0) return; + if (gLoadSaveTitleSequenceSave) { + if (filename_valid_characters(text)) { + if (!title_sequence_save_exists(gCurrentTitleSequence, text)) { + title_sequence_add_save(gCurrentTitleSequence, path, text); + } + else { + window_error_open(5404, STR_NONE); + } + } + else { + window_error_open(5243, STR_NONE); + } + return; + } + strncpy(path, _directory, sizeof(path)); strncat(path, text, sizeof(path)); strncat(path, _extension, sizeof(path)); @@ -747,7 +764,22 @@ static void window_loadsave_select(rct_window *w, const char *path) { switch (_loadsaveType) { case (LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME) : - if (game_load_save(path)) { + if (gLoadSaveTitleSequenceSave) { + utf8 newName[MAX_PATH]; + char *extension = (char*)path_get_extension(path_get_filename(path)); + strcpy(newName, path_get_filename(path)); + if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) + strcat(newName, ".sv6"); + if (title_sequence_save_exists(gCurrentTitleSequence, newName)) { + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&_listItems[w->selected_list_item].name; + window_text_input_open(w, WIDX_SCROLL, 5435, 5404, 1170, (uint32)_listItems[w->selected_list_item].name, TITLE_SEQUENCE_MAX_SAVE_LENGTH - 1); + } + else { + title_sequence_add_save(gCurrentTitleSequence, path, newName); + window_close(w); + } + } + else if (game_load_save(path)) { window_close(w); gfx_invalidate_screen(); rct2_endupdate(); diff --git a/src/windows/options.c b/src/windows/options.c index 1222cfb96b..341d98ec95 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -41,6 +41,8 @@ #include "dropdown.h" #include "error.h" #include "../interface/themes.h" +#include "../interface/title_sequences.h" +#include "../title.h" enum WINDOW_OPTIONS_PAGE { WINDOW_OPTIONS_PAGE_DISPLAY, @@ -125,6 +127,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_DEBUGGING_TOOLS, WIDX_TITLE_SEQUENCE, WIDX_TITLE_SEQUENCE_DROPDOWN, + WIDX_TITLE_SEQUENCE_BUTTON, // Twitch WIDX_CHANNEL_BUTTON = WIDX_PAGE_START, @@ -136,7 +139,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { }; #define WW 310 -#define WH 183 +#define WH 194 #define MAIN_OPTIONS_WIDGETS \ { WWT_FRAME, 0, 0, WW-1, 0, WH-1, STR_NONE, STR_NONE }, \ @@ -220,6 +223,7 @@ static rct_widget window_options_misc_widgets[] = { { WWT_CHECKBOX, 2, 10, 299, 144, 155, 5150, STR_NONE }, // enabled debugging tools { WWT_DROPDOWN, 1, 155, 299, 158, 169, STR_NONE, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 288, 298, 159, 168, 876, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 26, 185, 174, 185, 5436, STR_NONE }, // Title sequences button { WIDGETS_END }, }; @@ -367,7 +371,8 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_AUTO_STAFF_PLACEMENT) | (1 << WIDX_DEBUGGING_TOOLS) | (1 << WIDX_TITLE_SEQUENCE) | - (1 << WIDX_TITLE_SEQUENCE_DROPDOWN), + (1 << WIDX_TITLE_SEQUENCE_DROPDOWN) | + (1 << WIDX_TITLE_SEQUENCE_BUTTON), MAIN_OPTIONS_ENABLED_WIDGETS | (1 << WIDX_CHANNEL_BUTTON) | @@ -553,6 +558,8 @@ static void window_options_mouseup() config_save_default(); window_invalidate(w); break; + case WIDX_TITLE_SEQUENCE_BUTTON: + window_title_editor_open(0); } break; @@ -793,7 +800,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* gDropdownItemsChecked = 1 << gConfigGeneral.autosave_frequency; break; case WIDX_TITLE_SEQUENCE_DROPDOWN: - gDropdownItemsFormat[0] = 1142; + /* gDropdownItemsFormat[0] = 1142; gDropdownItemsArgs[0] = STR_TITLE_SEQUENCE_RCT2; gDropdownItemsFormat[1] = 1142; gDropdownItemsArgs[1] = STR_TITLE_SEQUENCE_OPENRCT2; @@ -803,6 +810,26 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* else if (gConfigGeneral.title_sequence == TITLE_SEQUENCE_OPENRCT2) gDropdownItemsChecked = 1 << 1; break; + case WIDX_THEMES_DROPDOWN:*/ + num_items = gConfigTitleSequences.num_presets; + + for (i = 0; i < num_items; i++) { + gDropdownItemsFormat[i] = 2777; + gDropdownItemsArgs[i] = (uint64)&gConfigTitleSequences.presets[i].name; + } + + window_dropdown_show_text_custom_width( + w->x + widget->left, + w->y + widget->top, + widget->bottom - widget->top + 1, + w->colours[1], + DROPDOWN_FLAG_STAY_OPEN, + num_items, + widget->right - widget->left - 3 + ); + + gDropdownItemsChecked = 1 << (gCurrentPreviewTitleSequence); + break; } break; @@ -974,9 +1001,9 @@ static void window_options_dropdown() } break; case WIDX_TITLE_SEQUENCE_DROPDOWN: - if (dropdownIndex != gConfigGeneral.title_sequence) { - if (dropdownIndex == 0) gConfigGeneral.title_sequence = TITLE_SEQUENCE_RCT2; - else if (dropdownIndex == 1) gConfigGeneral.title_sequence = TITLE_SEQUENCE_OPENRCT2; + if (dropdownIndex != gCurrentPreviewTitleSequence) { + title_sequence_change_preset(dropdownIndex); + title_refresh_sequence(); config_save_default(); window_invalidate(w); } @@ -1157,6 +1184,7 @@ static void window_options_invalidate() window_options_misc_widgets[WIDX_DEBUGGING_TOOLS].type = WWT_CHECKBOX; window_options_misc_widgets[WIDX_TITLE_SEQUENCE].type = WWT_DROPDOWN; window_options_misc_widgets[WIDX_TITLE_SEQUENCE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_options_misc_widgets[WIDX_TITLE_SEQUENCE_BUTTON].type = WWT_DROPDOWN_BUTTON; break; case WINDOW_OPTIONS_PAGE_TWITCH: @@ -1280,15 +1308,17 @@ static void window_options_paint() w->x + window_options_misc_widgets[WIDX_AUTOSAVE].left + 1, w->y + window_options_misc_widgets[WIDX_AUTOSAVE].top ); - + + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&gConfigTitleSequences.presets[gCurrentPreviewTitleSequence].name; gfx_draw_string_left(dpi, STR_TITLE_SEQUENCE, w, w->colours[1], w->x + 10, w->y + window_options_misc_widgets[WIDX_TITLE_SEQUENCE].top + 1); - gfx_draw_string_left( + gfx_draw_string_left_clipped( dpi, - STR_TITLE_SEQUENCE_RCT1 + gConfigGeneral.title_sequence, - NULL, + 1170, + (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, w->colours[1], w->x + window_options_misc_widgets[WIDX_TITLE_SEQUENCE].left + 1, - w->y + window_options_misc_widgets[WIDX_TITLE_SEQUENCE].top + w->y + window_options_misc_widgets[WIDX_TITLE_SEQUENCE].top, + window_options_misc_widgets[WIDX_TITLE_SEQUENCE_DROPDOWN].left - window_options_misc_widgets[WIDX_TITLE_SEQUENCE].left - 4 ); break; } diff --git a/src/windows/themes.c b/src/windows/themes.c index 265da25fb9..c6fa4ab4ba 100644 --- a/src/windows/themes.c +++ b/src/windows/themes.c @@ -34,6 +34,7 @@ #include "dropdown.h" #include "../interface/themes.h" #include "error.h" +#include "../util/util.h" enum { WINDOW_THEMES_TAB_SETTINGS, @@ -240,6 +241,7 @@ static rct_windowclass window_themes_tab_5_classes[] = { static rct_windowclass window_themes_tab_6_classes[] = { WC_CHEATS, WC_THEMES, + WC_TITLE_EDITOR, WC_OPTIONS, WC_KEYBOARD_SHORTCUT_LIST, WC_CHANGE_KEYBOARD_SHORTCUT, @@ -728,15 +730,6 @@ void window_themes_scrollmouseover() { // return; } -static bool valid_characters(const char *name) -{ - for (int i = 0; name[i] != '\0'; i++) { - if (name[i] == '\\' || name[i] == '/' || name[i] == ':' || name[i] == '?' || name[i] == '*' || name[i] == '<' || name[i] == '>' || name[i] == '|') - return false; - } - return true; -} - static void window_themes_textinput() { rct_window *w; @@ -752,7 +745,7 @@ static void window_themes_textinput() switch (widgetIndex) { case WIDX_THEMES_DUPLICATE_BUTTON: case WIDX_THEMES_RENAME_BUTTON: - if (valid_characters(text)) { + if (filename_valid_characters(text)) { bool nameTaken = false; for (int i = 0; i < gConfigThemes.num_presets; i++) { if (strcmp(gConfigThemes.presets[i].name, text) == 0) { diff --git a/src/windows/title_command_editor.c b/src/windows/title_command_editor.c new file mode 100644 index 0000000000..0977790c96 --- /dev/null +++ b/src/windows/title_command_editor.c @@ -0,0 +1,522 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#include "../addresses.h" +#include "../input.h" +#include "../interface/widget.h" +#include "../interface/window.h" +#include "../interface/viewport.h" +#include "../localisation/localisation.h" +#include "../sprites.h" +#include "../world/map.h" +#include "../game.h" +#include "../interface/themes.h" +#include "../interface/title_sequences.h" +#include "../title.h" +#include "dropdown.h" + +typedef struct { + uint8 command; + rct_string_id nameStringId; + rct_string_id descStringId; +} TITLE_COMMAND_ORDER; + +TITLE_COMMAND_ORDER window_title_command_editor_orders[] = { + { TITLE_SCRIPT_LOAD, 5413, 5431 }, + { TITLE_SCRIPT_LOCATION, 5417, 5427 }, + { TITLE_SCRIPT_ROTATE, 5419, 5428 }, + { TITLE_SCRIPT_ZOOM, 5421, 5429 }, + { TITLE_SCRIPT_WAIT, 5423, 5430 }, + { TITLE_SCRIPT_RESTART, 5425, STR_NONE }, + { TITLE_SCRIPT_END, 5426, STR_NONE }, +}; + +#define NUM_COMMANDS 7 + +enum WINDOW_WATER_WIDGET_IDX { + WIDX_BACKGROUND, + WIDX_TITLE, + WIDX_CLOSE, + WIDX_COMMAND, + WIDX_COMMAND_DROPDOWN, + WIDX_TEXTBOX_FULL, + WIDX_TEXTBOX_X, + WIDX_TEXTBOX_Y, + WIDX_SAVE, + WIDX_SAVE_DROPDOWN, + WIDX_OKAY, + WIDX_CANCEL +}; + +#define WW 200 +#define WH 120 +#define BY 32 +#define BY2 70 +#define WS 16 +#define WHA ((WW-WS*2)/2) + +static bool _window_title_command_editor_insert; +static int _window_title_command_editor_index; +static char textbox1Buffer[50]; +static char textbox2Buffer[50]; +static title_command command = { 6, 0, 0 }; + +static rct_widget window_title_command_editor_widgets[] = { + { WWT_FRAME, 1, 0, WW-1, 0, WH-1, -1, STR_NONE }, // panel / background + { WWT_CAPTION, 1, 1, WW-2, 1, 14, 5434, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 1, WW-13, WW-3, 2, 13, 824, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_DROPDOWN, 1, WS, WW-WS-1, BY, BY+11, STR_NONE, STR_NONE }, // Command dropdown + { WWT_DROPDOWN_BUTTON, 1, WW-WS-12, WW-WS-2, BY+1, BY+10, 876, STR_NONE }, + { WWT_TEXT_BOX, 1, WS, WW-WS-1, BY2, BY2+11, (uint32)textbox1Buffer, STR_NONE }, // full textbox + + { WWT_TEXT_BOX, 1, WS, WS+WHA-4, BY2, BY2+11, (uint32)textbox1Buffer, STR_NONE }, // x textbox + { WWT_TEXT_BOX, 1, WS+WHA+3, WW-WS-1, BY2, BY2+11, (uint32)textbox2Buffer, STR_NONE }, // y textbox + + { WWT_DROPDOWN, 1, 16, WW-17, BY2, BY2+11, STR_NONE, STR_NONE }, // Save dropdown + { WWT_DROPDOWN_BUTTON, 1, WW-28, WW-18, BY2+1, BY2+10, 876, STR_NONE }, + + { WWT_DROPDOWN_BUTTON, 1, 10, 80, WH-21, WH-10, STR_OK, STR_NONE }, // OKAY + { WWT_DROPDOWN_BUTTON, 1, WW-80, WW-10, WH-21, WH-10, STR_CANCEL, STR_NONE }, // Cancel + + { WIDGETS_END }, +}; + +static void window_title_command_editor_emptysub() { } +static void window_title_command_editor_close(); +static void window_title_command_editor_mouseup(); +static void window_title_command_editor_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); +static void window_title_command_editor_dropdown(); +static void window_title_command_editor_update(); +static void window_title_command_editor_invalidate(); +static void window_title_command_editor_paint(); +static void window_title_command_editor_textinput(); +static void window_title_command_editor_inputsize(rct_window *w); +static int get_command_info_index(int index); +static TITLE_COMMAND_ORDER get_command_info(int index); +static rct_xy16 get_location(); + +static void* window_title_command_editor_events[] = { + window_title_command_editor_close, + window_title_command_editor_mouseup, + window_title_command_editor_emptysub, + window_title_command_editor_mousedown, + window_title_command_editor_dropdown, + window_title_command_editor_emptysub, + window_title_command_editor_update, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_textinput, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_emptysub, + window_title_command_editor_invalidate, + window_title_command_editor_paint, + window_title_command_editor_emptysub +}; + +static int get_command_info_index(int index) +{ + for (int i = 0; i < NUM_COMMANDS; i++) { + if (window_title_command_editor_orders[i].command == index) + return i; + } + return 0; +} + +static TITLE_COMMAND_ORDER get_command_info(int index) +{ + for (int i = 0; i < NUM_COMMANDS; i++) { + if (window_title_command_editor_orders[i].command == index) + return window_title_command_editor_orders[i]; + } + return window_title_command_editor_orders[0]; +} + +static rct_xy16 get_location() +{ + rct_xy16 mapCoord = { 0 }; + rct_window *w = window_get_main(); + if (w != NULL) { + int interactionType; + rct_map_element *mapElement; + + get_map_coordinates_from_pos(w->viewport->view_width / 2, w->viewport->view_height / 2, VIEWPORT_INTERACTION_MASK_TERRAIN, &mapCoord.x, &mapCoord.y, &interactionType, &mapElement, NULL); + mapCoord.x -= 16; + mapCoord.x /= 32; + mapCoord.y -= 16; + mapCoord.y /= 32; + mapCoord.x++; + mapCoord.y++; + } + return mapCoord; +} + +void window_title_command_editor_open(int index, bool insert) +{ + rct_window* window; + + // Check if window is already open + if (window_find_by_class(WC_TITLE_COMMAND_EDITOR) != NULL) + return; + + window = window_create_centred( + WW, + WH, + (uint32*)window_title_command_editor_events, + WC_TITLE_COMMAND_EDITOR, + WF_STICK_TO_FRONT + ); + window->widgets = window_title_command_editor_widgets; + window->enabled_widgets = + (1 << WIDX_CLOSE) | + (1 << WIDX_COMMAND) | + (1 << WIDX_COMMAND_DROPDOWN) | + (1 << WIDX_TEXTBOX_FULL) | + (1 << WIDX_TEXTBOX_X) | + (1 << WIDX_TEXTBOX_Y) | + (1 << WIDX_SAVE) | + (1 << WIDX_SAVE_DROPDOWN) | + (1 << WIDX_OKAY) | + (1 << WIDX_CANCEL); + window_init_scroll_widgets(window); + + _window_title_command_editor_index = index; + _window_title_command_editor_insert = insert; + if (!insert) { + command = gConfigTitleSequences.presets[gCurrentTitleSequence].commands[index]; + } + + switch (command.command) { + case TITLE_SCRIPT_LOAD: + if (command.saveIndex >= gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands) + command.saveIndex = 0xFF; + break; + case TITLE_SCRIPT_LOCATION: + _itoa(command.x, textbox1Buffer, 10); + _itoa(command.y, textbox2Buffer, 10); + break; + case TITLE_SCRIPT_ROTATE: + case TITLE_SCRIPT_ZOOM: + case TITLE_SCRIPT_WAIT: + _itoa(command.rotations, textbox1Buffer, 10); + break; + } +} + +static void window_title_command_editor_close() +{ + rct_window *w; + + window_get_register(w); +} + +static void window_title_command_editor_mouseup() +{ + rct_window *w, *title_editor_w; + short widgetIndex; + + window_widget_get_registers(w, widgetIndex); + + switch (widgetIndex) { + case WIDX_CLOSE: + case WIDX_CANCEL: + window_close(w); + break; + case WIDX_TEXTBOX_FULL: + window_start_textbox(w, widgetIndex, 1170, (uint32)textbox1Buffer, 4); + break; + case WIDX_TEXTBOX_X: + window_start_textbox(w, widgetIndex, 1170, (uint32)textbox1Buffer, 4); + break; + case WIDX_TEXTBOX_Y: + window_start_textbox(w, widgetIndex, 1170, (uint32)textbox2Buffer, 4); + break; + case WIDX_OKAY: + if (_window_title_command_editor_insert) { + title_sequence_insert_command(gCurrentTitleSequence, _window_title_command_editor_index, command); + } + else { + gConfigTitleSequences.presets[gCurrentTitleSequence].commands[_window_title_command_editor_index] = command; + title_sequence_save_preset_script(gCurrentTitleSequence); + } + title_editor_w = window_find_by_class(WC_TITLE_EDITOR); + if (title_editor_w != NULL) + title_editor_w->selected_list_item = _window_title_command_editor_index; + window_close(w); + break; + } +} + + +static void window_title_command_editor_mousedown(int widgetIndex, rct_window* w, rct_widget* widget) +{ + int num_items, i; + + widget--; + switch (widgetIndex) { + case WIDX_COMMAND_DROPDOWN: + num_items = NUM_COMMANDS; + for (i = 0; i < num_items; i++) { + gDropdownItemsFormat[i] = 1142; + gDropdownItemsArgs[i] = window_title_command_editor_orders[i].nameStringId; + } + + window_dropdown_show_text_custom_width( + w->x + widget->left, + w->y + widget->top, + widget->bottom - widget->top + 1, + w->colours[1], + DROPDOWN_FLAG_STAY_OPEN, + num_items, + widget->right - widget->left - 3 + ); + + gDropdownItemsChecked = 1 << get_command_info_index(command.command); + break; + case WIDX_SAVE_DROPDOWN: + num_items = gConfigTitleSequences.presets[gCurrentTitleSequence].num_saves; + for (i = 0; i < num_items; i++) { + gDropdownItemsFormat[i] = 2777; + gDropdownItemsArgs[i] = (uint64)&gConfigTitleSequences.presets[gCurrentTitleSequence].saves[i]; + } + + window_dropdown_show_text_custom_width( + w->x + widget->left, + w->y + widget->top, + widget->bottom - widget->top + 1, + w->colours[1], + DROPDOWN_FLAG_STAY_OPEN, + num_items, + widget->right - widget->left - 3 + ); + + gDropdownItemsChecked = 1 << (command.saveIndex); + break; + } +} + +static void window_title_command_editor_dropdown() +{ + rct_window* w; + short widgetIndex, dropdownIndex; + rct_xy16 mapCoord; + + window_dropdown_get_registers(w, widgetIndex, dropdownIndex); + + if (dropdownIndex == -1) + return; + + switch (widgetIndex) { + case WIDX_COMMAND_DROPDOWN: + if (dropdownIndex == get_command_info_index(command.command)) + break; + command.command = window_title_command_editor_orders[dropdownIndex].command; + switch (command.command) { + case TITLE_SCRIPT_LOCATION: + mapCoord = get_location(); + command.x = (uint8)mapCoord.x; + command.y = (uint8)mapCoord.y; + _itoa(command.x, textbox1Buffer, 10); + _itoa(command.y, textbox2Buffer, 10); + break; + case TITLE_SCRIPT_ROTATE: + command.rotations = 1; + _itoa(command.rotations, textbox1Buffer, 10); + break; + case TITLE_SCRIPT_ZOOM: + command.zoom = 0; + _itoa(command.zoom, textbox1Buffer, 10); + break; + case TITLE_SCRIPT_WAIT: + command.seconds = 10; + _itoa(command.seconds, textbox1Buffer, 10); + break; + case TITLE_SCRIPT_LOAD: + command.saveIndex = 0; + if (command.saveIndex >= gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands) + command.saveIndex = 0xFF; + break; + } + window_invalidate(w); + break; + case WIDX_SAVE_DROPDOWN: + if (dropdownIndex == command.saveIndex) + break; + command.saveIndex = (uint8)dropdownIndex; + window_invalidate(w); + break; + } +} + +static void window_title_command_editor_textinput() +{ + uint8 result; + short widgetIndex; + rct_window *w; + char *text, * end; + int value; + + window_textinput_get_registers(w, widgetIndex, result, text); + + value = strtol(widgetIndex != WIDX_TEXTBOX_Y ? textbox1Buffer : textbox2Buffer, &end, 10); + if (value < 0) value = 0; + if (value > 255) value = 255; + switch (widgetIndex) { + case WIDX_TEXTBOX_FULL: + if (!result) { + if (*end == '\0') { + if (command.command == TITLE_SCRIPT_ROTATE) { + if (value > 3) value = 3; + } + else if (command.command == TITLE_SCRIPT_ZOOM) { + if (value > 3) value = 3; + } + command.rotations = (uint8)value; + } + _itoa(command.rotations, textbox1Buffer, 10); + window_invalidate(w); + } + else { + strcpy(textbox1Buffer, text); + } + break; + case WIDX_TEXTBOX_X: + if (!result) { + if (*end == '\0') + command.x = (uint8)value; + _itoa(command.x, textbox1Buffer, 10); + window_invalidate(w); + } + else { + strcpy(textbox1Buffer, text); + } + break; + case WIDX_TEXTBOX_Y: + if (!result) { + if (*end == '\0') + command.y = (uint8)value; + _itoa(command.y, textbox2Buffer, 10); + window_invalidate(w); + } + else { + strcpy(textbox2Buffer, text); + } + break; + } +} + +static void window_title_command_editor_update(rct_window *w) +{ + if (gCurrentTextBox.window.classification == w->classification && + gCurrentTextBox.window.number == w->number) { + window_update_textbox_caret(); + widget_invalidate(w, gCurrentTextBox.widget_index); + } +} + +static void window_title_command_editor_invalidate() +{ + rct_window *w; + + window_get_register(w); + colour_scheme_update_by_class(w, WC_TITLE_EDITOR); + + window_title_command_editor_widgets[WIDX_TEXTBOX_FULL].type = WWT_EMPTY; + window_title_command_editor_widgets[WIDX_TEXTBOX_X].type = WWT_EMPTY; + window_title_command_editor_widgets[WIDX_TEXTBOX_Y].type = WWT_EMPTY; + window_title_command_editor_widgets[WIDX_SAVE].type = WWT_EMPTY; + window_title_command_editor_widgets[WIDX_SAVE_DROPDOWN].type = WWT_EMPTY; + switch (command.command) { + case TITLE_SCRIPT_LOAD: + window_title_command_editor_widgets[WIDX_SAVE].type = WWT_DROPDOWN; + window_title_command_editor_widgets[WIDX_SAVE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + break; + case TITLE_SCRIPT_LOCATION: + window_title_command_editor_widgets[WIDX_TEXTBOX_X].type = WWT_TEXT_BOX; + window_title_command_editor_widgets[WIDX_TEXTBOX_Y].type = WWT_TEXT_BOX; + break; + case TITLE_SCRIPT_ROTATE: + case TITLE_SCRIPT_ZOOM: + case TITLE_SCRIPT_WAIT: + window_title_command_editor_widgets[WIDX_TEXTBOX_FULL].type = WWT_TEXT_BOX; + break; + } +} + +static void window_title_command_editor_paint() +{ + rct_window *w; + rct_drawpixelinfo *dpi; + + window_paint_get_registers(w, dpi); + + window_draw_widgets(w, dpi); + + gfx_draw_string_left(dpi, 5432, NULL, w->colours[1], w->x + WS, w->y + BY - 14); + gfx_draw_string_left(dpi, get_command_info(command.command).descStringId, NULL, w->colours[1], w->x + WS, w->y + BY2 - 14); + + gfx_draw_string_left_clipped( + dpi, + get_command_info(command.command).nameStringId, + NULL, + w->colours[1], + w->x + w->widgets[WIDX_COMMAND].left + 1, + w->y + w->widgets[WIDX_COMMAND].top, + w->widgets[WIDX_COMMAND_DROPDOWN].left - w->widgets[WIDX_COMMAND].left - 4 + ); + + if (command.command == TITLE_SCRIPT_LOAD) { + if (command.saveIndex == 0xFF) { + gfx_draw_string_left_clipped( + dpi, + 5437, + NULL, + w->colours[1], + w->x + w->widgets[WIDX_SAVE].left + 1, + w->y + w->widgets[WIDX_SAVE].top, + w->widgets[WIDX_SAVE_DROPDOWN].left - w->widgets[WIDX_SAVE].left - 4 + ); + } + else { + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&gConfigTitleSequences.presets[gCurrentTitleSequence].saves[command.saveIndex]; + gfx_draw_string_left_clipped( + dpi, + 1170, + (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, + w->colours[1], + w->x + w->widgets[WIDX_SAVE].left + 1, + w->y + w->widgets[WIDX_SAVE].top, + w->widgets[WIDX_SAVE_DROPDOWN].left - w->widgets[WIDX_SAVE].left - 4 + ); + } + } +} diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c new file mode 100644 index 0000000000..49a2089fb0 --- /dev/null +++ b/src/windows/title_editor.c @@ -0,0 +1,1023 @@ +/***************************************************************************** +* Copyright (c) 2014 Maciek Baron, Dniel Tar +* OpenRCT2, an open source clone of Roller Coaster Tycoon 2. +* +* This file is part of OpenRCT2. +* +* OpenRCT2 is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. + +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. + +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*****************************************************************************/ + +#include "../addresses.h" +#include "../config.h" +#include "../game.h" +#include "../drawing/drawing.h" +#include "../input.h" +#include "../interface/viewport.h" +#include "../interface/widget.h" +#include "../interface/window.h" +#include "../localisation/localisation.h" +#include "../peep/peep.h" +#include "../peep/staff.h" +#include "../world/sprite.h" +#include "dropdown.h" +#include "../interface/themes.h" +#include "../sprites.h" +#include "../title.h" +#include "../interface/title_sequences.h" +#include "error.h" +#include "../scenario.h" +#include "../util/util.h" + +enum { + WINDOW_TITLE_EDITOR_TAB_PRESETS, + WINDOW_TITLE_EDITOR_TAB_SAVES, + WINDOW_TITLE_EDITOR_TAB_SCRIPT, + WINDOW_TITLE_EDITOR_TAB_COUNT +} WINDOW_TITLE_EDITOR_TAB; + +static void window_title_editor_emptysub() { } +static void window_title_editor_close(); +static void window_title_editor_mouseup(); +static void window_title_editor_resize(); +static void window_title_editor_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); +static void window_title_editor_dropdown(); +static void window_title_editor_update(rct_window *w); +static void window_title_editor_scrollgetsize(); +static void window_title_editor_scrollmousedown(); +static void window_title_editor_scrollmouseover(); +static void window_title_editor_textinput(); +static void window_title_editor_tooltip(); +static void window_title_editor_invalidate(); +static void window_title_editor_paint(); +static void window_title_editor_scrollpaint(); +static void window_title_editor_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w); + +static void* window_title_editor_events[] = { + window_title_editor_close, + window_title_editor_mouseup, + window_title_editor_resize, + window_title_editor_mousedown, + window_title_editor_dropdown, + window_title_editor_emptysub, + window_title_editor_update, + window_title_editor_emptysub, + window_title_editor_emptysub, + window_title_editor_emptysub, + window_title_editor_emptysub, + window_title_editor_emptysub, + window_title_editor_emptysub, + window_title_editor_emptysub, + window_title_editor_emptysub, + window_title_editor_scrollgetsize, + window_title_editor_scrollmousedown, + window_title_editor_emptysub, + window_title_editor_scrollmouseover, + window_title_editor_textinput, + window_title_editor_emptysub, + window_title_editor_emptysub, + window_title_editor_tooltip, + window_title_editor_emptysub, + window_title_editor_emptysub, + window_title_editor_invalidate, + window_title_editor_paint, + window_title_editor_scrollpaint, +}; + +enum WINDOW_TITLE_EDITOR_WIDGET_IDX { + WIDX_TITLE_EDITOR_BACKGROUND, + WIDX_TITLE_EDITOR_TITLE, + WIDX_TITLE_EDITOR_CLOSE, + WIDX_TITLE_EDITOR_TAB_CONTENT_PANEL, + WIDX_TITLE_EDITOR_PRESETS_TAB, + WIDX_TITLE_EDITOR_SAVES_TAB, + WIDX_TITLE_EDITOR_SCRIPT_TAB, + WIDX_TITLE_EDITOR_LIST, + + // Presets Tab + WIDX_TITLE_EDITOR_PRESETS, + WIDX_TITLE_EDITOR_PRESETS_DROPDOWN, + WIDX_TITLE_EDITOR_DUPLICATE_BUTTON, + WIDX_TITLE_EDITOR_DELETE_BUTTON, + WIDX_TITLE_EDITOR_RENAME_BUTTON, + + // Saves Tab + WIDX_TITLE_EDITOR_ADD, + WIDX_TITLE_EDITOR_REMOVE, + WIDX_TITLE_EDITOR_RENAME, + WIDX_TITLE_EDITOR_LOAD, + + // Script Tab + WIDX_TITLE_EDITOR_INSERT, + WIDX_TITLE_EDITOR_EDIT, + WIDX_TITLE_EDITOR_DELETE, + //WIDX_TITLE_EDITOR_RELOAD, + WIDX_TITLE_EDITOR_SKIP_TO, + + WIDX_TITLE_EDITOR_MOVE_UP, + WIDX_TITLE_EDITOR_MOVE_DOWN, + + WIDX_TITLE_EDITOR_REPLAY, + WIDX_TITLE_EDITOR_STOP, + WIDX_TITLE_EDITOR_PLAY, + WIDX_TITLE_EDITOR_SKIP, +}; + +// Increase BW if certain launguages do not fit +// BW should be a multiple of 4 +#define WW 320 +#define WH 270 +#define BX 8 +#define BW 72 +#define BY 52 +#define BH 63 +#define BS 18 +#define ROW_HEIGHT 11 +#define SCROLL_WIDTH 350 + +static rct_widget window_title_editor_widgets[] = { + { WWT_FRAME, 0, 0, WW-1, 0, 106, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, WW-2, 1, 14, 5433, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, WW-13, WW-3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close button + { WWT_RESIZE, 1, 0, WW-1, 43, 106, 0x0FFFFFFFF, STR_NONE }, // tab content panel + { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, 5235 }, // presets tab + { WWT_TAB, 1, 34, 64, 17, 43, 0x02000144E, 5377 }, // saves tab + { WWT_TAB, 1, 65, 95, 17, 43, 0x02000144E, 5378 }, // script tab + { WWT_SCROLL, 1, BX+BW+9,WW-4, 48, WH-4, 3, STR_NONE }, // command/save list + + // Presets Tab + { WWT_DROPDOWN, 1, 125, 299, 60, 71, STR_NONE, STR_NONE }, // Preset title sequences + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 61, 70, 876, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 10, 100, 82, 93, 5239, 5383 }, // Duplicate button + { WWT_DROPDOWN_BUTTON, 1, 110, 200, 82, 93, 3349, 5384 }, // Delete button + { WWT_DROPDOWN_BUTTON, 1, 210, 300, 82, 93, 3348, 5385 }, // Rename button + + // Saves Tab + { WWT_DROPDOWN_BUTTON, 1, BX, BX+BW-1,BY, BH, 5407, 5392 }, // Add + { WWT_DROPDOWN_BUTTON, 1, BX, BX+BW-1,BY+(BS*1), BH+(BS*1), 5408, 5393 }, // Remove + { WWT_DROPDOWN_BUTTON, 1, BX, BX+BW-1,BY+(BS*2), BH+(BS*2), 3348, 5394 }, // Rename + { WWT_DROPDOWN_BUTTON, 1, BX, BX+BW-1,BY+(BS*3), BH+(BS*3), 5413, 5395 }, // Load + + // Script Tab + { WWT_DROPDOWN_BUTTON, 1, BX, BX+BW-1,BY, BH, 5409, 5386 }, // Insert + { WWT_DROPDOWN_BUTTON, 1, BX, BX+BW-1,BY+(BS*1), BH+(BS*1), 5410, 5387 }, // Edit + { WWT_DROPDOWN_BUTTON, 1, BX, BX+BW-1,BY+(BS*2), BH+(BS*2), 3349, 5388 }, // Delete + //{ WWT_DROPDOWN_BUTTON, 1, BX, BX+BW-1,BY+(BS*3), BH+(BS*3), 5411, 5396 }, // Reload + { WWT_DROPDOWN_BUTTON, 1, BX, BX+BW-1,BY+(BS*3), BH+(BS*3), 5412, 5389 }, // Skip to + + { WWT_DROPDOWN_BUTTON, 1, BX, BX+BW/2-1,BY+(BS*5),BH+(BS*5), 5375, 5390 }, // Move down + { WWT_DROPDOWN_BUTTON, 1, BX+BW/2,BX+BW-1,BY+(BS*5), BH+(BS*5), 5376, 5391 }, // Move up + + { WWT_IMGBTN, 1, BX, BX+BW/4-1, WH-32, WH-16, SPR_G2_TITLE_RESTART, 5382 }, // Replay + { WWT_IMGBTN, 1, BX+BW/4,BX+BW/2-1, WH-32, WH-16, SPR_G2_TITLE_STOP, 5381 }, // Stop + { WWT_IMGBTN, 1, BX+BW/2,BX+BW*3/4-1,WH-32, WH-16, SPR_G2_TITLE_PLAY, 5380 }, // Play + { WWT_IMGBTN, 1, BX+BW*3/4,BX+BW, WH-32, WH-16, SPR_G2_TITLE_SKIP, 5379 }, // Skip + + { WIDGETS_END }, +}; + +static sint16 _window_title_editor_highlighted_index; + + +static int window_title_editor_tab_animation_loops[] = { + 64, + 1, + 28 +}; +static int window_title_editor_tab_animation_divisor[] = { + 4, + 1, + 4 +}; +static int window_title_editor_tab_sprites[] = { + SPR_TAB_RIDE_0, + 5183, + SPR_TAB_STATS_0 +}; + +static void window_title_editor_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w) +{ + int sprite_idx; + int x, y; + + for (int i = 0; i < WINDOW_TITLE_EDITOR_TAB_COUNT; i++) { + x = 0; + y = 0; + sprite_idx = window_title_editor_tab_sprites[i]; + if (w->selected_tab == i) + sprite_idx += w->frame_no / window_title_editor_tab_animation_divisor[w->selected_tab]; + if (i == 1) { + x = 4; + y = 1; + } + gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TITLE_EDITOR_PRESETS_TAB + i].left + x, w->y + w->widgets[WIDX_TITLE_EDITOR_PRESETS_TAB + i].top + y, 0); + } +} + +void window_title_editor_open(int tab) +{ + rct_window* window; + + // Check if window is already open + window = window_bring_to_front_by_class(WC_TITLE_EDITOR); + if (window != NULL) + return; + + window = window_create_auto_pos(WW, 107, (uint32*)window_title_editor_events, WC_TITLE_EDITOR, WF_10 | WF_RESIZABLE); + window->widgets = window_title_editor_widgets; + window->enabled_widgets = + (1 << WIDX_TITLE_EDITOR_CLOSE) | + (1 << WIDX_TITLE_EDITOR_PRESETS_TAB) | + (1 << WIDX_TITLE_EDITOR_SAVES_TAB) | + (1 << WIDX_TITLE_EDITOR_SCRIPT_TAB) | + + (1 << WIDX_TITLE_EDITOR_PRESETS) | + (1 << WIDX_TITLE_EDITOR_PRESETS_DROPDOWN) | + (1 << WIDX_TITLE_EDITOR_DUPLICATE_BUTTON) | + (1 << WIDX_TITLE_EDITOR_DELETE_BUTTON) | + (1 << WIDX_TITLE_EDITOR_RENAME_BUTTON) | + + (1 << WIDX_TITLE_EDITOR_ADD) | + (1 << WIDX_TITLE_EDITOR_REMOVE) | + (1 << WIDX_TITLE_EDITOR_RENAME) | + (1 << WIDX_TITLE_EDITOR_LOAD) | + + (1 << WIDX_TITLE_EDITOR_INSERT) | + (1 << WIDX_TITLE_EDITOR_EDIT) | + (1 << WIDX_TITLE_EDITOR_DELETE) | + //(1 << WIDX_TITLE_EDITOR_RELOAD) | + (1 << WIDX_TITLE_EDITOR_SKIP_TO) | + (1 << WIDX_TITLE_EDITOR_MOVE_DOWN) | + (1 << WIDX_TITLE_EDITOR_MOVE_UP) | + + (1 << WIDX_TITLE_EDITOR_PLAY) | + (1 << WIDX_TITLE_EDITOR_STOP) | + (1 << WIDX_TITLE_EDITOR_REPLAY) | + (1 << WIDX_TITLE_EDITOR_SKIP); + + window_init_scroll_widgets(window); + window->list_information_type = 0; + + window->selected_tab = tab; + window->selected_list_item = -1; + _window_title_editor_highlighted_index = -1; + window->scrolls[0].v_top = 0; + window->scrolls[0].h_left = 0; + + window->min_width = WW; + window->min_height = WH; + window->max_width = 500; + window->max_height = 450; + +} + +void window_title_editor_close() { + rct_window *w, *command_editor_w, *load_save_w; + + window_get_register(w); + + // Close the related windows + command_editor_w = window_find_by_class(WC_TITLE_COMMAND_EDITOR); + load_save_w = window_find_by_class(WC_LOADSAVE); + if (command_editor_w) + window_close(command_editor_w); + if (load_save_w && gLoadSaveTitleSequenceSave) + window_close(load_save_w); +} + +static void window_title_editor_mouseup() +{ + short widgetIndex; + rct_window *w; + char path[MAX_PATH]; + char separator = platform_get_path_separator(); + int defaultPreset, playing, inTitle, i, commandEditorOpen; + window_widget_get_registers(w, widgetIndex); + + defaultPreset = (gCurrentTitleSequence < TITLE_SEQUENCE_DEFAULT_PRESETS); + playing = (gCurrentTitleSequence == gCurrentPreviewTitleSequence) && ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO); + inTitle = ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO); + commandEditorOpen = (window_find_by_class(WC_TITLE_COMMAND_EDITOR) != NULL); + switch (widgetIndex) { + case WIDX_TITLE_EDITOR_CLOSE: + window_close(w); + break; + case WIDX_TITLE_EDITOR_DUPLICATE_BUTTON: + commandEditorOpen *= 2; + if (!commandEditorOpen) + window_text_input_open(w, widgetIndex, 5239, 5406, 1170, (uint32)&gConfigTitleSequences.presets[gCurrentTitleSequence].name, 64); + break; + case WIDX_TITLE_EDITOR_DELETE_BUTTON: + defaultPreset *= 2; commandEditorOpen *= 2; + if (!defaultPreset && !commandEditorOpen) + title_sequence_delete_preset(gCurrentTitleSequence); + break; + case WIDX_TITLE_EDITOR_RENAME_BUTTON: + defaultPreset *= 2; commandEditorOpen *= 2; + if (!defaultPreset && !commandEditorOpen) + window_text_input_open(w, widgetIndex, 3348, 5406, 1170, (uint32)&gConfigTitleSequences.presets[gCurrentTitleSequence].name, 64); + break; + case WIDX_TITLE_EDITOR_ADD: + defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2; + if (!defaultPreset && !playing && !commandEditorOpen) { + window_loadsave_open(LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME, NULL); + gLoadSaveTitleSequenceSave = true; + } + break; + case WIDX_TITLE_EDITOR_REMOVE: + defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2; + if (!defaultPreset && !playing && !commandEditorOpen) { + if (w->selected_list_item != -1) { + title_sequence_remove_save(gCurrentTitleSequence, w->selected_list_item); + if (w->selected_list_item > 0) + w->selected_list_item--; + else if (w->selected_list_item > gConfigTitleSequences.presets[gCurrentTitleSequence].num_saves) + w->selected_list_item = gConfigTitleSequences.presets[gCurrentTitleSequence].num_saves - 1; + } + } + break; + case WIDX_TITLE_EDITOR_RENAME: + defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2; + if (!defaultPreset && !playing && !commandEditorOpen) { + if (w->selected_list_item != -1) + window_text_input_open(w, widgetIndex, 5435, 5405, 1170, (uint32)gConfigTitleSequences.presets[gCurrentTitleSequence].saves[w->selected_list_item], TITLE_SEQUENCE_MAX_SAVE_LENGTH - 1); + } + break; + case WIDX_TITLE_EDITOR_LOAD: + if (w->selected_list_item != -1) { + if (gConfigTitleSequences.presets[gCurrentTitleSequence].path[0]) { + strcpy(path, gConfigTitleSequences.presets[gCurrentTitleSequence].path); + } + else { + platform_get_user_directory(path, "title sequences"); + strcat(path, gConfigTitleSequences.presets[gCurrentTitleSequence].name); + strncat(path, &separator, 1); + } + + strcat(path, gConfigTitleSequences.presets[gCurrentTitleSequence].saves[w->selected_list_item]); + game_load_save(path); + window_title_editor_open(1); + } + break; + case WIDX_TITLE_EDITOR_INSERT: + defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2; + if (!defaultPreset && !playing && !commandEditorOpen) { + if (w->selected_list_item != -1) + window_title_command_editor_open(w->selected_list_item + 1, true); + else + window_title_command_editor_open(gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands, true); + } + break; + case WIDX_TITLE_EDITOR_EDIT: + defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2; + if (!defaultPreset && !playing && !commandEditorOpen) { + if (w->selected_list_item != -1) + window_title_command_editor_open(w->selected_list_item, false); + } + break; + case WIDX_TITLE_EDITOR_DELETE: + defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2; + if (!defaultPreset && !playing && !commandEditorOpen) { + if (w->selected_list_item != -1) { + title_sequence_delete_command(gCurrentTitleSequence, w->selected_list_item); + if (w->selected_list_item > 0) + w->selected_list_item--; + else if (w->selected_list_item > gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands) + w->selected_list_item = gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands - 1; + } + } + break; + /*case WIDX_TITLE_EDITOR_RELOAD: + playing *= 2; commandEditorOpen *= 2; + if (!playing && !commandEditorOpen) { + //title_sequence_open + } + break;*/ + case WIDX_TITLE_EDITOR_SKIP_TO: + if (playing && w->selected_list_item != -1) { + if (gTitleScriptCommand > w->selected_list_item) { + title_skip_from_beginning(); + } + if (gTitleScriptCommand != w->selected_list_item) { + for (i = gTitleScriptCommand + 1; i < gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands; i++) { + if (gConfigTitleSequences.presets[gCurrentTitleSequence].commands[i].command == TITLE_SCRIPT_LOAD || + gConfigTitleSequences.presets[gCurrentTitleSequence].commands[i].command == TITLE_SCRIPT_LOADMM) { + gTitleScriptSkipLoad = i; + } + if (i == w->selected_list_item) { + gTitleScriptSkipTo = i; + break; + } + } + } + } + break; + case WIDX_TITLE_EDITOR_MOVE_DOWN: + defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2; + if (!defaultPreset && !playing && !commandEditorOpen) { + if (w->selected_list_item != -1 && w->selected_list_item < gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands - 1) { + title_sequence_move_down_command(gCurrentTitleSequence, w->selected_list_item); + w->selected_list_item++; + } + } + break; + case WIDX_TITLE_EDITOR_MOVE_UP: + defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2; + if (!defaultPreset && !playing && !commandEditorOpen) { + if (w->selected_list_item != -1 && w->selected_list_item > 0) { + title_sequence_move_up_command(gCurrentTitleSequence, w->selected_list_item); + w->selected_list_item--; + } + } + break; + case WIDX_TITLE_EDITOR_REPLAY: + if (playing) { + title_refresh_sequence(); + } + break; + case WIDX_TITLE_EDITOR_STOP: + if (playing) { + gCurrentPreviewTitleSequence = 0; + title_refresh_sequence(); + } + break; + case WIDX_TITLE_EDITOR_PLAY: + if (gCurrentTitleSequence != gCurrentPreviewTitleSequence && inTitle) { + gCurrentPreviewTitleSequence = gCurrentTitleSequence; + title_refresh_sequence(); + } + break; + case WIDX_TITLE_EDITOR_SKIP: + if (playing) { + for (i = gTitleScriptCommand + 1; i < gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands; i++) { + if (gConfigTitleSequences.presets[gCurrentTitleSequence].commands[i].command == TITLE_SCRIPT_LOAD || + gConfigTitleSequences.presets[gCurrentTitleSequence].commands[i].command == TITLE_SCRIPT_LOADMM) { + gTitleScriptSkipLoad = i; + } + else if (gConfigTitleSequences.presets[gCurrentTitleSequence].commands[i].command == TITLE_SCRIPT_WAIT || + gConfigTitleSequences.presets[gCurrentTitleSequence].commands[i].command == TITLE_SCRIPT_END) { + gTitleScriptSkipTo = i; + break; + } + else if (gConfigTitleSequences.presets[gCurrentTitleSequence].commands[i].command == TITLE_SCRIPT_RESTART) { + gTitleScriptSkipLoad = -1; + gTitleScriptSkipTo = -1; + title_refresh_sequence(); + } + } + if (i == gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands && i - 1 > gTitleScriptCommand) { + gTitleScriptSkipTo = i - 1; + gTitleScriptSkipLoad = -1; + } + } + break; + } + if (defaultPreset == 2) + window_error_open(5400, STR_NONE); + else if (commandEditorOpen == 2) + window_error_open(5438, STR_NONE); + else if (playing == 2) + window_error_open(5398, 5399); +} + +static void window_title_editor_resize() +{ + rct_window *w; + + window_get_register(w); + + if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_PRESETS) { + w->min_width = WW; + w->min_height = 107; + w->max_width = WW; + w->max_height = 107; + + if (w->width < w->min_width) { + w->width = w->min_width; + gfx_invalidate_screen(); + } + if (w->height < w->min_height) { + w->height = w->min_height; + gfx_invalidate_screen(); + } + if (w->width > w->max_width) { + w->width = w->max_width; + gfx_invalidate_screen(); + } + if (w->height > w->max_height) { + w->height = w->max_height; + gfx_invalidate_screen(); + } + } + else { + w->min_width = WW; + w->min_height = WH; + w->max_width = 500; + w->max_height = 580; + + if (w->width < w->min_width) { + w->width = w->min_width; + window_invalidate(w); + } + if (w->height < w->min_height) { + w->height = w->min_height; + window_invalidate(w); + } + if (w->width > w->max_width) { + w->width = w->max_width; + window_invalidate(w); + } + if (w->height > w->max_height) { + w->height = w->max_height; + window_invalidate(w); + } + } +} + +static void window_title_editor_mousedown(int widgetIndex, rct_window* w, rct_widget* widget) +{ + short newSelectedTab; + int num_items, i; + + switch (widgetIndex) { + case WIDX_TITLE_EDITOR_PRESETS_TAB: + case WIDX_TITLE_EDITOR_SAVES_TAB: + case WIDX_TITLE_EDITOR_SCRIPT_TAB: + newSelectedTab = widgetIndex - WIDX_TITLE_EDITOR_PRESETS_TAB; + if (w->selected_tab == newSelectedTab) + break; + w->selected_tab = newSelectedTab; + w->selected_list_item = -1; + _window_title_editor_highlighted_index = -1; + w->scrolls[0].v_top = 0; + w->frame_no = 0; + window_event_resize_call(w); + window_invalidate(w); + break; + case WIDX_TITLE_EDITOR_PRESETS_DROPDOWN: + if (window_find_by_class(WC_TITLE_COMMAND_EDITOR) != NULL) { + window_error_open(5438, STR_NONE); + } + else { + num_items = gConfigTitleSequences.num_presets; + + widget--; + for (i = 0; i < num_items; i++) { + gDropdownItemsFormat[i] = 2777; + gDropdownItemsArgs[i] = (uint64)&gConfigTitleSequences.presets[i].name; + } + + window_dropdown_show_text_custom_width( + w->x + widget->left, + w->y + widget->top, + widget->bottom - widget->top + 1, + w->colours[1], + DROPDOWN_FLAG_STAY_OPEN, + num_items, + widget->right - widget->left - 3 + ); + + gDropdownItemsChecked = 1 << (gCurrentTitleSequence); + } + break; + } +} + +static void window_title_editor_dropdown() +{ + rct_window* w; + short widgetIndex, dropdownIndex; + + window_dropdown_get_registers(w, widgetIndex, dropdownIndex); + + if (dropdownIndex == -1) + return; + + switch (widgetIndex) { + case WIDX_TITLE_EDITOR_PRESETS_DROPDOWN: + gCurrentTitleSequence = dropdownIndex; + window_invalidate(w); + break; + } +} + +void window_title_editor_update(rct_window *w) +{ + w->frame_no++; + if (w->frame_no >= window_title_editor_tab_animation_loops[w->selected_tab]) + w->frame_no = 0; + + if (!widget_is_highlighted(w, WIDX_TITLE_EDITOR_LIST)) { + _window_title_editor_highlighted_index = -1; + widget_invalidate(w, WIDX_TITLE_EDITOR_LIST); + } + + widget_invalidate(w, WIDX_TITLE_EDITOR_PRESETS_TAB + w->selected_tab); +} + +void window_title_editor_scrollgetsize() +{ + int i, width, height; + uint16 lineCount; + rct_window *w; + + window_get_register(w); + + lineCount = 1; + if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_SAVES) + lineCount = gConfigTitleSequences.presets[gCurrentTitleSequence].num_saves; + else if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_SCRIPT) + lineCount = gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands; + + height = lineCount * ROW_HEIGHT; + i = height - window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].bottom + window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].top + 21; + if (i < 0) + i = 0; + if (i < w->scrolls[0].v_top) { + w->scrolls[0].v_top = i; + window_invalidate(w); + } + + width = SCROLL_WIDTH; + window_scrollsize_set_registers(width, height); +} + +void window_title_editor_scrollmousedown() { + int index; + short x, y, scrollIndex; + rct_window *w; + + window_scrollmouse_get_registers(w, scrollIndex, x, y); + + index = y / ROW_HEIGHT; + w->selected_list_item = -1; + switch (w->selected_tab) { + case WINDOW_TITLE_EDITOR_TAB_SAVES: + if (index < gConfigTitleSequences.presets[gCurrentTitleSequence].num_saves) { + w->selected_list_item = index; + widget_invalidate(w, WIDX_TITLE_EDITOR_LIST); + } + break; + case WINDOW_TITLE_EDITOR_TAB_SCRIPT: + if (index < gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands) { + w->selected_list_item = index; + widget_invalidate(w, WIDX_TITLE_EDITOR_LIST); + } + break; + } +} + +void window_title_editor_scrollmouseover() { + int index; + short x, y, scrollIndex; + rct_window *w; + sint16 oldHighlightedIndex; + + window_scrollmouse_get_registers(w, scrollIndex, x, y); + + index = y / ROW_HEIGHT; + switch (w->selected_tab) { + oldHighlightedIndex = _window_title_editor_highlighted_index; + _window_title_editor_highlighted_index = -1; + case WINDOW_TITLE_EDITOR_TAB_SAVES: + if (index < gConfigTitleSequences.presets[gCurrentTitleSequence].num_saves) + _window_title_editor_highlighted_index = (sint16)index; + break; + case WINDOW_TITLE_EDITOR_TAB_SCRIPT: + if (index < gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands) + _window_title_editor_highlighted_index = (sint16)index; + break; + } + // This check is disabled since for some reason it creates a problem with highlighting index 1 + //if (oldHighlightedIndex != _window_title_editor_highlighted_index) { + widget_invalidate(w, WIDX_TITLE_EDITOR_LIST); + //} +} + +static void window_title_editor_textinput() +{ + rct_window *w; + short widgetIndex; + uint8 result; + char *text; + + window_textinput_get_registers(w, widgetIndex, result, text); + + if (!result || text[0] == 0) + return; + + switch (widgetIndex) { + case WIDX_TITLE_EDITOR_DUPLICATE_BUTTON: + case WIDX_TITLE_EDITOR_RENAME_BUTTON: + if (filename_valid_characters(text)) { + if (!title_sequence_name_exists(text)) { + if (widgetIndex == WIDX_TITLE_EDITOR_DUPLICATE_BUTTON) { + title_sequence_duplicate_preset(gCurrentTitleSequence, text); + } + else { + title_sequence_rename_preset(gCurrentTitleSequence, text); + } + config_save_default(); + window_invalidate(w); + } + else { + window_error_open(5404, STR_NONE); + } + } + else { + window_error_open(5243, STR_NONE); + } + break; + case WIDX_TITLE_EDITOR_RENAME: + if (filename_valid_characters(text)) { + if (!title_sequence_save_exists(gCurrentTitleSequence, text)) { + title_sequence_rename_save(gCurrentTitleSequence, w->selected_list_item, text); + title_sequence_save_preset_script(gCurrentTitleSequence); + window_invalidate(w); + } + else { + window_error_open(5404, STR_NONE); + } + } + else { + window_error_open(5243, STR_NONE); + } + break; + } +} + +void window_title_editor_tooltip() +{ + RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; +} + +void window_title_editor_invalidate() +{ + rct_window *w; + + window_get_register(w); + colour_scheme_update(w); + + int pressed_widgets = w->pressed_widgets & 0xFFFFFF8F; + uint8 widgetIndex = w->selected_tab + 4; + + w->pressed_widgets = pressed_widgets | (1 << widgetIndex); + + window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].type = WWT_EMPTY; + + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS_DROPDOWN].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_DUPLICATE_BUTTON].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_DELETE_BUTTON].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME_BUTTON].type = WWT_EMPTY; + + window_title_editor_widgets[WIDX_TITLE_EDITOR_ADD].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_REMOVE].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_LOAD].type = WWT_EMPTY; + + window_title_editor_widgets[WIDX_TITLE_EDITOR_INSERT].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_EDIT].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_DELETE].type = WWT_EMPTY; + //window_title_editor_widgets[WIDX_TITLE_EDITOR_RELOAD].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_SKIP_TO].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_MOVE_UP].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_MOVE_DOWN].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_PLAY].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_STOP].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_REPLAY].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_SKIP].type = WWT_EMPTY; + + switch (w->selected_tab) { + case WINDOW_TITLE_EDITOR_TAB_PRESETS: + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].type = WWT_DROPDOWN; + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_DUPLICATE_BUTTON].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_DELETE_BUTTON].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME_BUTTON].type = WWT_DROPDOWN_BUTTON; + break; + case WINDOW_TITLE_EDITOR_TAB_SAVES: + window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].type = WWT_SCROLL; + window_title_editor_widgets[WIDX_TITLE_EDITOR_ADD].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_REMOVE].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_LOAD].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_PLAY].type = WWT_IMGBTN; + window_title_editor_widgets[WIDX_TITLE_EDITOR_STOP].type = WWT_IMGBTN; + window_title_editor_widgets[WIDX_TITLE_EDITOR_REPLAY].type = WWT_IMGBTN; + window_title_editor_widgets[WIDX_TITLE_EDITOR_SKIP].type = WWT_IMGBTN; + break; + case WINDOW_TITLE_EDITOR_TAB_SCRIPT: + window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].type = WWT_SCROLL; + window_title_editor_widgets[WIDX_TITLE_EDITOR_INSERT].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_EDIT].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_DELETE].type = WWT_DROPDOWN_BUTTON; + //window_title_editor_widgets[WIDX_TITLE_EDITOR_RELOAD].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_SKIP_TO].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_MOVE_UP].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_MOVE_DOWN].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_PLAY].type = WWT_IMGBTN; + window_title_editor_widgets[WIDX_TITLE_EDITOR_STOP].type = WWT_IMGBTN; + window_title_editor_widgets[WIDX_TITLE_EDITOR_REPLAY].type = WWT_IMGBTN; + window_title_editor_widgets[WIDX_TITLE_EDITOR_SKIP].type = WWT_IMGBTN; + break; + } + + window_title_editor_widgets[WIDX_TITLE_EDITOR_BACKGROUND].right = w->width - 1; + window_title_editor_widgets[WIDX_TITLE_EDITOR_BACKGROUND].bottom = w->height - 1; + window_title_editor_widgets[WIDX_TITLE_EDITOR_TAB_CONTENT_PANEL].right = w->width - 1; + window_title_editor_widgets[WIDX_TITLE_EDITOR_TAB_CONTENT_PANEL].bottom = w->height - 1; + window_title_editor_widgets[WIDX_TITLE_EDITOR_TITLE].right = w->width - 2; + window_title_editor_widgets[WIDX_TITLE_EDITOR_CLOSE].left = w->width - 2 - 0x0B; + window_title_editor_widgets[WIDX_TITLE_EDITOR_CLOSE].right = w->width - 2 - 0x0B + 0x0A; + window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].right = w->width - 4; + window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].bottom = w->height - 16; + + window_title_editor_widgets[WIDX_TITLE_EDITOR_REPLAY].top = w->height - 32; + window_title_editor_widgets[WIDX_TITLE_EDITOR_REPLAY].bottom = w->height - 16; + window_title_editor_widgets[WIDX_TITLE_EDITOR_STOP].top = w->height - 32; + window_title_editor_widgets[WIDX_TITLE_EDITOR_STOP].bottom = w->height - 16; + window_title_editor_widgets[WIDX_TITLE_EDITOR_PLAY].top = w->height - 32; + window_title_editor_widgets[WIDX_TITLE_EDITOR_PLAY].bottom = w->height - 16; + window_title_editor_widgets[WIDX_TITLE_EDITOR_SKIP].top = w->height - 32; + window_title_editor_widgets[WIDX_TITLE_EDITOR_SKIP].bottom = w->height - 16; + + int defaultPreset, playing, inTitle; + + defaultPreset = (gCurrentTitleSequence < TITLE_SEQUENCE_DEFAULT_PRESETS); + playing = (gCurrentTitleSequence == gCurrentPreviewTitleSequence) && ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO); + inTitle = ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO); + + if (!inTitle) + w->disabled_widgets |= (1 << WIDX_TITLE_EDITOR_PLAY); + else + w->disabled_widgets &= ~(1 << WIDX_TITLE_EDITOR_PLAY); + if (!playing) + w->disabled_widgets |= (1 << WIDX_TITLE_EDITOR_REPLAY) | (1 << WIDX_TITLE_EDITOR_STOP) | (1 << WIDX_TITLE_EDITOR_SKIP) | (1 << WIDX_TITLE_EDITOR_SKIP_TO); + else + w->disabled_widgets &= ~((1 << WIDX_TITLE_EDITOR_REPLAY) | (1 << WIDX_TITLE_EDITOR_STOP) | (1 << WIDX_TITLE_EDITOR_SKIP) | (1 << WIDX_TITLE_EDITOR_SKIP_TO)); +} + +void window_title_editor_paint() { + rct_window *w; + rct_drawpixelinfo *dpi; + + window_paint_get_registers(w, dpi); + + // Widgets + window_draw_widgets(w, dpi); + window_title_editor_draw_tab_images(dpi, w); + + // Draw strings + switch (w->selected_tab) { + case WINDOW_TITLE_EDITOR_TAB_PRESETS: + + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&gConfigTitleSequences.presets[gCurrentTitleSequence].name; + gfx_draw_string_left(dpi, 5304, NULL, w->colours[1], w->x + 10, w->y + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].top + 1); + gfx_draw_string_left_clipped( + dpi, + 1170, + (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, + w->colours[1], + w->x + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].left + 1, + w->y + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].top, + w->x + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS_DROPDOWN].left - window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].left - 4 + ); + + break; + case WINDOW_TITLE_EDITOR_TAB_SAVES: + + break; + case WINDOW_TITLE_EDITOR_TAB_SCRIPT: + + break; + } +} + +void window_title_editor_scrollpaint() +{ + rct_window *w; + rct_drawpixelinfo *dpi; + char buffer[256]; + bool selected, hover, error, inTitle; + int y, x, x2, width; + + window_paint_get_registers(w, dpi); + + gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ((char*)0x0141FC48)[w->colours[1] * 8]); + + title_sequence *title = &gConfigTitleSequences.presets[gCurrentTitleSequence]; + + inTitle = ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO); + y = 0; x = 0; x2 = 0; width = 0; + width = w->widgets[WIDX_TITLE_EDITOR_LIST].right - w->widgets[WIDX_TITLE_EDITOR_LIST].left; + if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_SAVES) { + + for (int i = 0; i < title->num_saves; i++, y += ROW_HEIGHT) { + selected = false; + hover = false; + if (i == w->selected_list_item) { + selected = true; + gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, RCT2_GLOBAL(0x0141FC46 + (w->colours[1] * 8), uint8)); + } + else if (i == _window_title_editor_highlighted_index || (i == gTitleScriptSave && inTitle && gCurrentTitleSequence == gCurrentPreviewTitleSequence)) { + hover = true; + gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, RCT2_GLOBAL(0x0141FC47 + (w->colours[1] * 8), uint8)); + } + else if (i & 1) { + gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, RCT2_GLOBAL(0x0141FC4A + (w->colours[1] * 8), uint8) | 0x1000000); + } + + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&title->saves[i]; + if (selected || hover) { + format_string(buffer, 1170, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + } + else { + format_string(buffer + 1, 1170, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + buffer[0] = FORMAT_BLACK; + } + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&buffer; + gfx_draw_string_left(dpi, 1170, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, w->colours[1], x + 5, y); + } + } + else if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_SCRIPT) { + + x2 = 92; + for (int i = 0; i < title->num_commands; i++, y += ROW_HEIGHT) { + title_command *command = &title->commands[i]; + selected = false; + hover = false; + error = false; + if (i == w->selected_list_item) { + selected = true; + gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, RCT2_GLOBAL(0x0141FC46 + (w->colours[1] * 8), uint8)); + } + else if (i == (int)_window_title_editor_highlighted_index || (i == gTitleScriptCommand && inTitle && gCurrentTitleSequence == gCurrentPreviewTitleSequence)) { + hover = true; + gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, RCT2_GLOBAL(0x0141FC47 + (w->colours[1] * 8), uint8)); + } + else if (i & 1) { + gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, RCT2_GLOBAL(0x0141FC4A + (w->colours[1] * 8), uint8) | 0x1000000); + } + + rct_string_id commandName; + switch (command->command) { + case TITLE_SCRIPT_LOAD: + commandName = 5415; + if (command->saveIndex == 0xFF) { + commandName = 5416; + error = true; + } + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&title->saves[command->saveIndex]; + break; + case TITLE_SCRIPT_LOADMM: + commandName = 5414; + break; + case TITLE_SCRIPT_LOCATION: + commandName = 5418; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = command->x; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 2, uint16) = command->y; + break; + case TITLE_SCRIPT_ROTATE: + commandName = 5420; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = command->rotations; + break; + case TITLE_SCRIPT_ZOOM: + commandName = 5422; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = command->zoom; + break; + case TITLE_SCRIPT_WAIT: + commandName = 5424; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = command->seconds; + break; + case TITLE_SCRIPT_RESTART: + commandName = 5425; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = command->zoom; + break; + case TITLE_SCRIPT_END: + commandName = 5426; + break; + } + + if ((selected || hover) && !error) { + format_string(buffer, commandName, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + } + else { + format_string(buffer + 1, commandName, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + buffer[0] = (error ? ((selected || hover) ? FORMAT_LIGHTPINK : FORMAT_RED) : FORMAT_BLACK); + } + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&buffer; + gfx_draw_string_left(dpi, 1170, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, w->colours[1], x + 5, y); + } + } +} \ No newline at end of file From 859d8547585b0037eab7f08ff01ce7d3a1499d26 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Wed, 24 Jun 2015 13:52:29 -0400 Subject: [PATCH 0083/1173] Fixed title editor crashes/bugs --- src/windows/title_editor.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index 49a2089fb0..725129af67 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -381,18 +381,18 @@ static void window_title_editor_mouseup() case WIDX_TITLE_EDITOR_EDIT: defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2; if (!defaultPreset && !playing && !commandEditorOpen) { - if (w->selected_list_item != -1) + if (w->selected_list_item != -1 && w->selected_list_item < gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands) window_title_command_editor_open(w->selected_list_item, false); } break; case WIDX_TITLE_EDITOR_DELETE: defaultPreset *= 2; playing *= 2; commandEditorOpen *= 2; if (!defaultPreset && !playing && !commandEditorOpen) { - if (w->selected_list_item != -1) { + if (w->selected_list_item != -1 && w->selected_list_item < gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands) { title_sequence_delete_command(gCurrentTitleSequence, w->selected_list_item); if (w->selected_list_item > 0) w->selected_list_item--; - else if (w->selected_list_item > gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands) + else if (w->selected_list_item >= gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands) w->selected_list_item = gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands - 1; } } From 6918706680116012546dddc3733396da0a8e2894 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Wed, 24 Jun 2015 13:53:13 -0400 Subject: [PATCH 0084/1173] One more error check --- src/windows/title_editor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index 725129af67..dee2134f38 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -404,7 +404,7 @@ static void window_title_editor_mouseup() } break;*/ case WIDX_TITLE_EDITOR_SKIP_TO: - if (playing && w->selected_list_item != -1) { + if (playing && w->selected_list_item != -1 && w->selected_list_item < gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands) { if (gTitleScriptCommand > w->selected_list_item) { title_skip_from_beginning(); } From c165811017615ac95531a0d9502c54c85ba5aba7 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Wed, 24 Jun 2015 20:20:54 +0100 Subject: [PATCH 0085/1173] Fix incorrect drawing of entrance elements 2 mistakes found. 1. Did not call the correct paint setup function. This caused the order of painting to be incorrect. 2. Used the wrong offset to the transparent image. This would cause little bits of transparency to appear on the top of the entrance image. Fixes #1442. --- src/interface/viewport.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index d105331b7b..da47e8b24d 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1153,16 +1153,17 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma if (transparant_image_id){ if (is_exit){ - transparant_image_id |= style->image_id + direction + 16; + transparant_image_id |= style->image_id + direction + 24; } else{ - transparant_image_id |= style->image_id + direction + 24; + transparant_image_id |= style->image_id + direction + 16; } RCT2_GLOBAL(0x009DEA52, uint16) = 2; RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(0, ah, transparant_image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + ah << 8, transparant_image_id, 0, height, 2, 0x1C, 0); } image_id += 4; @@ -1179,7 +1180,8 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma RCT2_GLOBAL(0x009DEA54, uint16) = 28; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(0, ah, transparant_image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + ah << 8, transparant_image_id, 0, height, 2, 0x1C, 0); } uint32 eax = 0xFFFF0600 | ((height / 16) & 0xFF); From 80d524f78e1110aaec16721a1117999ac0247d1d Mon Sep 17 00:00:00 2001 From: "Miso Zmiric (Mike Squinter)" Date: Wed, 24 Jun 2015 21:30:40 +0100 Subject: [PATCH 0086/1173] platform_file_exists now also checks for path not found errors use GetLastError after the GetFileAttributes --- src/platform/windows.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/windows.c b/src/platform/windows.c index df02a1fb3c..e478b0ea34 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -92,7 +92,7 @@ char platform_get_path_separator() int platform_file_exists(const char *path) { - return !(GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND); + return !(GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES && (GetLastError() == ERROR_FILE_NOT_FOUND || GetLastError() == ERROR_PATH_NOT_FOUND)); } int platform_directory_exists(const char *path) From 0a4ac08caad7d1d0920fdf3976677ce357af38f9 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Wed, 24 Jun 2015 18:12:53 -0400 Subject: [PATCH 0087/1173] Minimize fullscreen on focus loss --- data/language/english_uk.txt | 2 +- src/config.c | 1 + src/config.h | 1 + src/platform/shared.c | 3 +++ src/windows/options.c | 19 +++++++++++++++---- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 67c7fd53df..d2296afa03 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3773,5 +3773,5 @@ STR_5436 :Edit Title Sequences... STR_5437 :No save selected STR_5438 :Can't make changes while command editor is open STR_5439 :A restart is used without a wait command -STR_5440 : +STR_5440 :Minimize fullscreen on focus loss STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. Only{NEWLINE}toggleable in the title screen. diff --git a/src/config.c b/src/config.c index 551dcb0e1d..a98127b24e 100644 --- a/src/config.c +++ b/src/config.c @@ -182,6 +182,7 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, last_run_version), "last_run_version", CONFIG_VALUE_TYPE_STRING, { .value_string = NULL }, NULL }, { offsetof(general_configuration, invert_viewport_drag), "invert_viewport_drag", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, load_save_sort), "load_save_sort", CONFIG_VALUE_TYPE_UINT8, SORT_NAME_ASCENDING, NULL }, + { offsetof(general_configuration, minimize_fullscreen_focus_loss), "minimize_fullscreen_focus_loss",CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, }; config_property_definition _interfaceDefinitions[] = { diff --git a/src/config.h b/src/config.h index 60a95d9022..922d0edbf7 100644 --- a/src/config.h +++ b/src/config.h @@ -152,6 +152,7 @@ typedef struct { utf8string last_run_version; uint8 invert_viewport_drag; uint8 load_save_sort; + uint8 minimize_fullscreen_focus_loss; } general_configuration; typedef struct { diff --git a/src/platform/shared.c b/src/platform/shared.c index 6e2ea0cf26..a0a929c8b4 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -534,6 +534,7 @@ static void platform_create_window() } SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, 0); + SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, gConfigGeneral.minimize_fullscreen_focus_loss ? "1" : "0"); platform_load_cursors(); @@ -730,6 +731,8 @@ void platform_refresh_video() { int width = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16); int height = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16); + + SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, gConfigGeneral.minimize_fullscreen_focus_loss ? "1" : "0"); if (gConfigGeneral.hardware_display) { if (gRenderer == NULL) diff --git a/src/windows/options.c b/src/windows/options.c index 341d98ec95..f9e592a518 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -78,6 +78,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_TILE_SMOOTHING_CHECKBOX, WIDX_GRIDLINES_CHECKBOX, WIDX_HARDWARE_DISPLAY_CHECKBOX, + WIDX_MINIMIZE_FOCUS_LOSS, WIDX_CONSTRUCTION_MARKER, WIDX_CONSTRUCTION_MARKER_DROPDOWN, WIDX_THEMES, @@ -162,11 +163,12 @@ static rct_widget window_options_display_widgets[] = { { WWT_CHECKBOX, 1, 10, 290, 84, 95, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, // landscape smoothing { WWT_CHECKBOX, 1, 10, 290, 99, 110, STR_GRIDLINES, STR_GRIDLINES_TIP }, // gridlines { WWT_CHECKBOX, 1, 10, 290, 114, 125, 5154, STR_NONE }, // hardware display - { WWT_DROPDOWN, 1, 155, 299, 128, 139, STR_NONE, STR_NONE }, // construction marker - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 129, 138, 876, STR_NONE }, - { WWT_DROPDOWN, 1, 155, 299, 143, 154, STR_NONE, STR_NONE }, // colour schemes + { WWT_CHECKBOX, 1, 10, 290, 129, 140, 5440, STR_NONE }, // minimize fullscreen focus loss + { WWT_DROPDOWN, 1, 155, 299, 143, 154, STR_NONE, STR_NONE }, // construction marker { WWT_DROPDOWN_BUTTON, 1, 288, 298, 144, 153, 876, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 26, 185, 159, 170, 5153, STR_NONE }, // colour schemes button + { WWT_DROPDOWN, 1, 155, 299, 158, 169, STR_NONE, STR_NONE }, // colour schemes + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 159, 168, 876, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 26, 185, 174, 185, 5153, STR_NONE }, // colour schemes button { WIDGETS_END }, }; @@ -325,6 +327,7 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_TILE_SMOOTHING_CHECKBOX) | (1 << WIDX_GRIDLINES_CHECKBOX) | (1 << WIDX_HARDWARE_DISPLAY_CHECKBOX) | + (1 << WIDX_MINIMIZE_FOCUS_LOSS) | (1 << WIDX_CONSTRUCTION_MARKER) | (1 << WIDX_CONSTRUCTION_MARKER_DROPDOWN) | (1 << WIDX_THEMES) | @@ -460,6 +463,12 @@ static void window_options_mouseup() config_save_default(); window_invalidate(w); break; + case WIDX_MINIMIZE_FOCUS_LOSS: + gConfigGeneral.minimize_fullscreen_focus_loss ^= 1; + platform_refresh_video(); + config_save_default(); + window_invalidate(w); + break; case WIDX_THEMES_BUTTON: window_themes_open(); window_invalidate(w); @@ -1055,6 +1064,7 @@ static void window_options_invalidate() widget_set_checkbox_value(w, WIDX_TILE_SMOOTHING_CHECKBOX, (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_DISABLE_SMOOTH_LANDSCAPE) == 0); widget_set_checkbox_value(w, WIDX_GRIDLINES_CHECKBOX, RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_ALWAYS_SHOW_GRIDLINES); widget_set_checkbox_value(w, WIDX_HARDWARE_DISPLAY_CHECKBOX, gConfigGeneral.hardware_display); + widget_set_checkbox_value(w, WIDX_MINIMIZE_FOCUS_LOSS, gConfigGeneral.minimize_fullscreen_focus_loss); // construction marker: celsius/fahrenheit window_options_display_widgets[WIDX_CONSTRUCTION_MARKER].image = STR_WHITE + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CONSTRUCTION_MARKER, uint8); @@ -1068,6 +1078,7 @@ static void window_options_invalidate() window_options_display_widgets[WIDX_CONSTRUCTION_MARKER].type = WWT_DROPDOWN; window_options_display_widgets[WIDX_CONSTRUCTION_MARKER_DROPDOWN].type = WWT_DROPDOWN_BUTTON; window_options_display_widgets[WIDX_HARDWARE_DISPLAY_CHECKBOX].type = WWT_CHECKBOX; + window_options_display_widgets[WIDX_MINIMIZE_FOCUS_LOSS].type = WWT_CHECKBOX; window_options_display_widgets[WIDX_THEMES].type = WWT_DROPDOWN; window_options_display_widgets[WIDX_THEMES_DROPDOWN].type = WWT_DROPDOWN_BUTTON; window_options_display_widgets[WIDX_THEMES_BUTTON].type = WWT_DROPDOWN_BUTTON; From 5895dcd9b17fff0ad99b00120d9f936c575b87d0 Mon Sep 17 00:00:00 2001 From: Krutonium Date: Wed, 24 Jun 2015 20:26:50 -0400 Subject: [PATCH 0088/1173] Corrected issue with saving tracks not having file extensions when user removes it from the save dialog. Fixes #1467 --- src/ride/track.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ride/track.c b/src/ride/track.c index b1c03c105a..cfeee024c7 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3036,6 +3036,8 @@ int save_track_design(uint8 rideIndex){ return 1; } + path_set_extension(path, "TD6"); + save_track_to_file(RCT2_ADDRESS(0x009D8178, rct_track_td6), path); ride_list_item item = { .type = 0xFC, .entry_index = 0 }; From e32a7ab01ade4b1059153c69a6d49609eb6154c0 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 25 Jun 2015 04:00:16 +0100 Subject: [PATCH 0089/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 4dee99e118..a9b0fef910 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3668,8 +3668,8 @@ STR_5335 :Attractie-ingang STR_5336 :Attractie-uitgang STR_5337 :Parkingang STR_5338 :Elementtype -STR_5339 :Hoogte onderkant -STR_5340 :Hoogte bovenkant +STR_5339 :Hoogte onderk. +STR_5340 :Hoogte bovenk. STR_5341 :Eigenschappen STR_5342 :Kies een vakje op de kaart STR_5343 :Werknemers automatisch plaatsen From 6fade38d36cd427bd453ea7a499bfc53094d4a92 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 24 Jun 2015 21:54:08 +0200 Subject: [PATCH 0090/1173] Fix remove all guests cheat --- src/windows/cheats.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/windows/cheats.c b/src/windows/cheats.c index b2f557e81b..2d00ef2203 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -664,16 +664,6 @@ static void cheat_give_all_guests(int object) static void cheat_remove_all_guests() { - int i; - rct_ride *ride; - - FOR_ALL_RIDES(i, ride) - { - ride_clear_for_construction(i); - ride_set_status(i, RIDE_STATUS_CLOSED); - } - window_invalidate_by_class(WC_RIDE); - rct_peep *peep; uint16 spriteIndex, nextSpriteIndex; @@ -685,6 +675,19 @@ static void cheat_remove_all_guests() } } + int i; + rct_ride *ride; + + FOR_ALL_RIDES(i, ride) + { + ride_clear_for_construction(i); + ride_set_status(i, RIDE_STATUS_CLOSED); + + for(int i=0;i<4;i++) { + ride->first_peep_in_queue[i]=0xFFFF; + } + } + window_invalidate_by_class(WC_RIDE); gfx_invalidate_screen(); } From ca1b88fc53a8e3485a2be73d285b5f1e6d3e1019 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 25 Jun 2015 11:46:17 +0200 Subject: [PATCH 0091/1173] Don't modify flags when in select_by_track_type mode; make it switchable in-game again. --- src/management/research.c | 15 ++++++--------- src/object.c | 19 ++++--------------- src/object_list.c | 4 +++- src/rct1.c | 17 +++++++++++++++++ src/rct1.h | 1 + src/ride/track.c | 8 ++++---- src/windows/editor_inventions_list.c | 7 ++++--- src/windows/new_ride.c | 6 +++--- src/windows/options.c | 5 +---- src/windows/research.c | 7 ++++--- src/windows/ride.c | 3 ++- src/windows/track_list.c | 3 ++- 12 files changed, 51 insertions(+), 44 deletions(-) diff --git a/src/management/research.c b/src/management/research.c index 97539e8727..2c348274d0 100644 --- a/src/management/research.c +++ b/src/management/research.c @@ -27,6 +27,7 @@ #include "../world/scenery.h" #include "news_item.h" #include "research.h" +#include "../rct1.h" const int _researchRate[] = { 0, 160, 250, 400 }; @@ -182,12 +183,12 @@ void research_finish_item(sint32 entryIndex) RCT2_ADDRESS(0x01357644, uint32)[ebx] = RCT2_ADDRESS(0x0097C5D4, uint32)[ebx]; } RCT2_ADDRESS(0x001357424, uint32)[rideEntryIndex >> 5] |= 1 << (rideEntryIndex & 0x1F); - if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)) { + if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) || rideTypeShouldLoseSeparateFlag(rideEntry)) { for (i = 0; i < 128; i++) { rideEntry2 = GET_RIDE_ENTRY(i); if (rideEntry2 == (rct_ride_type*)-1) continue; - if (rideEntry2->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) + if ((rideEntry2->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) && !rideTypeShouldLoseSeparateFlag(rideEntry2)) continue; if (rideEntry2->ride_type[0] == base_ride_type || rideEntry2->ride_type[1] == base_ride_type || rideEntry2->ride_type[2] == base_ride_type) @@ -197,7 +198,7 @@ void research_finish_item(sint32 entryIndex) // I don't think 0x009AC06C is ever not 0, so probably redundant if (RCT2_GLOBAL(0x009AC06C, uint8) == 0) { - RCT2_GLOBAL(0x013CE952, rct_string_id) = rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME ? + RCT2_GLOBAL(0x013CE952, rct_string_id) = ((rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) && !rideTypeShouldLoseSeparateFlag(rideEntry)) ? rideEntry->name : base_ride_type + 2; if (!gSilentResearch) news_item_add_to_queue(NEWS_ITEM_RESEARCH, 2249, entryIndex); @@ -351,9 +352,7 @@ void research_remove_non_separate_vehicle_types() researchItem->entryIndex >= 0x10000 ) { rct_ride_type *rideEntry = GET_RIDE_ENTRY(researchItem->entryIndex & 0xFF); - if (!(rideEntry->flags & - (RIDE_ENTRY_FLAG_SEPARATE_RIDE | - RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME))) { + if (!(rideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE | RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) || rideTypeShouldLoseSeparateFlag(rideEntry)) { // Check if ride type already exists further up for a vehicle type that isn't displayed as a ride researchItem2 = researchItem - 1; do { @@ -362,9 +361,7 @@ void research_remove_non_separate_vehicle_types() researchItem2->entryIndex >= 0x10000 ) { rideEntry = GET_RIDE_ENTRY(researchItem2->entryIndex & 0xFF); - if (!(rideEntry->flags & - (RIDE_ENTRY_FLAG_SEPARATE_RIDE | - RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME))) { + if (!(rideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE | RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) || rideTypeShouldLoseSeparateFlag(rideEntry)) { if (((researchItem->entryIndex >> 8) & 0xFF) == ((researchItem2->entryIndex >> 8) & 0xFF)) { // Remove item diff --git a/src/object.c b/src/object.c index 040ce1b51a..add50ce5fe 100644 --- a/src/object.c +++ b/src/object.c @@ -31,6 +31,7 @@ #include "world/entrance.h" #include "world/scenery.h" #include "scenario.h" +#include "rct1.h" int object_load_entry(const char *path, rct_object_entry *outEntry) { @@ -427,21 +428,9 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp ride_type->name = object_get_localised_text(&chunk, ecx, ebx, 0); ride_type->description = object_get_localised_text(&chunk, ecx, ebx, 1); + //TODO: Move to its own function when ride construction window is merged. if(gConfigInterface.select_by_track_type) { ride_type->enabledTrackPieces = 0xFFFFFFFFFFFFFFFF; - - bool remove_flag=true; - for(int j=0;j<3;j++) - { - if(ride_type_has_flag(ride_type->ride_type[j], RIDE_TYPE_FLAG_FLAT_RIDE)) - remove_flag=false; - if(ride_type->ride_type[j]==RIDE_TYPE_MAZE || ride_type->ride_type[j]==RIDE_TYPE_MINI_GOLF) - remove_flag=false; - } - if (remove_flag) { - ride_type->flags &=~RIDE_ENTRY_FLAG_SEPARATE_RIDE; - ride_type->flags &=~RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME; - } } object_get_localised_text(&chunk, ecx, ebx, 2); @@ -696,7 +685,7 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp int di = ride_type->ride_type[0] | (ride_type->ride_type[1] << 8) | (ride_type->ride_type[2] << 16); - if (ride_type->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) di |= 0x1000000; + if ((ride_type->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) && !rideTypeShouldLoseSeparateFlag(ride_type)) di |= 0x1000000; RCT2_GLOBAL(0xF433DD, uint32) = di; return 0;// flags; @@ -774,7 +763,7 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp int width = w->x + w->width - x - 4; int format_args = ride_type->description; - if (!(ride_type->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) + if (!(ride_type->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) || rideTypeShouldLoseSeparateFlag(ride_type)) { format_args = ride_type->ride_type[0]; if ((format_args & 0xFF) == 0xFF) diff --git a/src/object_list.c b/src/object_list.c index ad62ae9ba7..2531b1c7ae 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -25,6 +25,7 @@ #include "ride/track.h" #include "util/sawyercoding.h" #include "game.h" +#include "rct1.h" #define OBJECT_ENTRY_GROUP_COUNT 11 #define OBJECT_ENTRY_COUNT 721 @@ -735,7 +736,8 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in // When made of two parts i.e Wooden Roller Coaster (Dream Woodie Cars) - if ((objectType == OBJECT_TYPE_RIDE) && !((((rct_ride_type*)chunk)->flags) & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) { + if (((objectType == OBJECT_TYPE_RIDE) && !((((rct_ride_type*)chunk)->flags) & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) && + !rideTypeShouldLoseSeparateFlag((rct_ride_type*)chunk)) { rct_ride_type* ride_type = (rct_ride_type*)chunk; rct_string_id obj_string = ride_type->ride_type[0]; if (obj_string == 0xFF){ diff --git a/src/rct1.c b/src/rct1.c index 2bba73c0c2..da29a29f83 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "addresses.h" +#include "config.h" #include "interface/viewport.h" #include "interface/window.h" #include "localisation/localisation.h" @@ -1377,4 +1378,20 @@ bool vehicleIsHigherInHierarchy(int track_type, char *currentVehicleName, char * return false; } +bool rideTypeShouldLoseSeparateFlag(rct_ride_type *ride) +{ + if(!gConfigInterface.select_by_track_type) + return false; + + bool remove_flag=true; + for(int j=0;j<3;j++) + { + if(ride_type_has_flag(ride->ride_type[j], RIDE_TYPE_FLAG_FLAT_RIDE)) + remove_flag=false; + if(ride->ride_type[j]==RIDE_TYPE_MAZE || ride->ride_type[j]==RIDE_TYPE_MINI_GOLF) + remove_flag=false; + } + return remove_flag; +} + #pragma endregion diff --git a/src/rct1.h b/src/rct1.h index e6f948873a..c28f087653 100644 --- a/src/rct1.h +++ b/src/rct1.h @@ -360,5 +360,6 @@ bool rct1_read_sv4(const char *path, rct1_s4 *s4); void rct1_import_s4(rct1_s4 *s4); void rct1_fix_landscape(); bool vehicleIsHigherInHierarchy(int track_type, char *currentVehicleName, char *comparedVehicleName); +bool rideTypeShouldLoseSeparateFlag(rct_ride_type *ride); #endif diff --git a/src/ride/track.c b/src/ride/track.c index b1c03c105a..0b83008901 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -36,6 +36,7 @@ #include "ride.h" #include "track.h" #include "track_data.h" +#include "../rct1.h" /** * @@ -345,9 +346,8 @@ void track_list_populate(ride_list_item item, uint8* track_list_cache){ } else{ if (find_object_in_entry_group(track_object, &entry_type, &entry_index)){ - if (GET_RIDE_ENTRY(entry_index)->flags & - (RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME | - RIDE_ENTRY_FLAG_SEPARATE_RIDE)) + if ((GET_RIDE_ENTRY(entry_index)->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME | RIDE_ENTRY_FLAG_SEPARATE_RIDE)) && + !rideTypeShouldLoseSeparateFlag(GET_RIDE_ENTRY(entry_index))) continue; } else{ @@ -397,7 +397,7 @@ void track_load_list(ride_list_item item) if (item.type < 0x80){ rct_ride_type* ride_type = gRideTypeList[item.entry_index]; - if (!(ride_type->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)){ + if (!(ride_type->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) || rideTypeShouldLoseSeparateFlag(ride_type)){ item.entry_index = 0xFF; } } diff --git a/src/windows/editor_inventions_list.c b/src/windows/editor_inventions_list.c index cc5dd47865..898e42f2b6 100644 --- a/src/windows/editor_inventions_list.c +++ b/src/windows/editor_inventions_list.c @@ -28,6 +28,7 @@ #include "../object.h" #include "../world/scenery.h" #include "../interface/themes.h" +#include "../rct1.h" #pragma region Widgets @@ -198,14 +199,14 @@ static void research_rides_setup(){ rct_ride_type* ride_entry = GET_RIDE_ENTRY(object_index); uint8 master_found = 0; - if (!(ride_entry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)){ + if (!(ride_entry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) || rideTypeShouldLoseSeparateFlag(ride_entry)){ for (uint8 rideType = 0; rideType < object_entry_group_counts[OBJECT_TYPE_RIDE]; rideType++){ rct_ride_type* master_ride = GET_RIDE_ENTRY(rideType); if (master_ride == NULL || (uint32)master_ride == 0xFFFFFFFF) continue; - if (master_ride->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) + if (master_ride->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE && !rideTypeShouldLoseSeparateFlag(master_ride)) continue; // If master ride not in use @@ -318,7 +319,7 @@ static rct_string_id research_item_get_name(uint32 researchItem) if (rideEntry == NULL || rideEntry == (rct_ride_type*)0xFFFFFFFF) return 0; - if (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) + if (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME && !rideTypeShouldLoseSeparateFlag(rideEntry)) return rideEntry->name; return ((researchItem >> 8) & 0xFF) + 2; diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index df55ab7ef2..667897c1ba 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -333,7 +333,7 @@ static void window_new_ride_populate_list() continue; // Skip if the vehicle isn't the preferred vehicle for this generic track type - if(gConfigInterface.select_by_track_type && !(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)) { + if(gConfigInterface.select_by_track_type && (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) || rideTypeShouldLoseSeparateFlag(rideEntry))) { if(strcmp(preferredVehicleName," \0")==0) { strcpy(preferredVehicleName,rideEntryName); preferredVehicleName[8]=0; @@ -349,7 +349,7 @@ static void window_new_ride_populate_list() } } - if (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) { + if ((rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) && !rideTypeShouldLoseSeparateFlag(rideEntry)) { dh &= ~4; nextListItem->type = rideType; nextListItem->entry_index = rideEntryIndex; @@ -893,7 +893,7 @@ static void window_new_ride_paint_ride_information(rct_window *w, rct_drawpixeli // Ride name and description rct_string_id rideName = rideEntry->name; rct_string_id rideDescription = rideEntry->description; - if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) { + if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) || rideTypeShouldLoseSeparateFlag(rideEntry)) { rideName = item.type + 2; rideDescription = item.type + 512; } diff --git a/src/windows/options.c b/src/windows/options.c index f9e592a518..52cda609b7 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -541,6 +541,7 @@ static void window_options_mouseup() config_save_default(); window_invalidate(w); window_invalidate_by_class(WC_RIDE); + window_invalidate_by_class(WC_CONSTRUCT_RIDE); break; case WIDX_DEBUGGING_TOOLS: gConfigGeneral.debugging_tools ^= 1; @@ -1174,10 +1175,6 @@ static void window_options_invalidate() else window_options_misc_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_CHECKBOX; - // This option sets several flags on object load, only make it changeable in the titles to prevent strange New Ride list behaviour - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO)) - w->disabled_widgets |= (1ULL << WIDX_SELECT_BY_TRACK_TYPE); - widget_set_checkbox_value(w, WIDX_SELECT_BY_TRACK_TYPE, gConfigInterface.select_by_track_type); widget_set_checkbox_value(w, WIDX_REAL_NAME_CHECKBOX, RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SHOW_REAL_GUEST_NAMES); widget_set_checkbox_value(w, WIDX_SAVE_PLUGIN_DATA_CHECKBOX, gConfigGeneral.save_plugin_data); diff --git a/src/windows/research.c b/src/windows/research.c index 4114e9b832..f33641ae5e 100644 --- a/src/windows/research.c +++ b/src/windows/research.c @@ -31,6 +31,7 @@ #include "../world/scenery.h" #include "dropdown.h" #include "../interface/themes.h" +#include "../rct1.h" enum { WINDOW_RESEARCH_PAGE_DEVELOPMENT, @@ -365,9 +366,9 @@ void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dp uint32 typeId = RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_ITEM, uint32); if (typeId >= 0x10000) { rct_ride_type *rideEntry = RCT2_GLOBAL(0x009ACFA4 + (typeId & 0xFF) * 4, rct_ride_type*); - stringId = rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME ? + stringId = (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) ? rideEntry->name : - (typeId & 0xFF00) + 2; + ((typeId >> 8) & 0xFF) + 2; } else { stringId = g_scenerySetEntries[typeId]->name; } @@ -403,7 +404,7 @@ void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dp if (typeId != 0xFFFFFFFF) { if (typeId >= 0x10000) { rct_ride_type *rideEntry = RCT2_GLOBAL(0x009ACFA4 + (typeId & 0xFF) * 4, rct_ride_type*); - stringId = rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME ? + stringId = (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) ? rideEntry->name : ((typeId >> 8) & 0xFF) + 2; diff --git a/src/windows/ride.c b/src/windows/ride.c index a5dfed63fe..b537a0d167 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -37,6 +37,7 @@ #include "../world/map.h" #include "../world/sprite.h" #include "dropdown.h" +#include "../rct1.h" #define var_496(w) RCT2_GLOBAL((int)w + 0x496, uint16) @@ -2597,7 +2598,7 @@ static void window_ride_vehicle_paint() gfx_draw_string_left(dpi, 3142, &stringId, 0, x, y); y += 15; - if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) && var_496(w) > 1) { + if ((!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) || rideTypeShouldLoseSeparateFlag(rideEntry)) && var_496(w) > 1) { // Excitement Factor factor = rideEntry->excitement_multipler; if (factor > 0) { diff --git a/src/windows/track_list.c b/src/windows/track_list.c index 33a9f7759e..d60afdfae5 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -29,6 +29,7 @@ #include "../sprites.h" #include "error.h" #include "../interface/themes.h" +#include "../rct1.h" enum { WIDX_BACKGROUND, @@ -358,7 +359,7 @@ static void window_track_list_invalidate() entry = GET_RIDE_ENTRY(_window_track_list_item.entry_index); stringId = entry->name; - if (!(entry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) + if (!(entry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) || rideTypeShouldLoseSeparateFlag(entry)) stringId = _window_track_list_item.type + 2; RCT2_GLOBAL(0x013CE952, uint16) = stringId; From e66ba829e17711ce95317ab4d4caffb60116a338 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Thu, 25 Jun 2015 12:19:38 +0200 Subject: [PATCH 0092/1173] Update tooltip --- data/language/english_uk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index d2296afa03..ef53595f44 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3774,4 +3774,4 @@ STR_5437 :No save selected STR_5438 :Can't make changes while command editor is open STR_5439 :A restart is used without a wait command STR_5440 :Minimize fullscreen on focus loss -STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. Only{NEWLINE}toggleable in the title screen. +STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. From 8ec3f60f2e7dfb9e8e72c462a98c6912289a0d3c Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 25 Jun 2015 14:40:46 +0200 Subject: [PATCH 0093/1173] Typo --- src/object_list.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/object_list.c b/src/object_list.c index 2531b1c7ae..2d1a36a00e 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -736,8 +736,8 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in // When made of two parts i.e Wooden Roller Coaster (Dream Woodie Cars) - if (((objectType == OBJECT_TYPE_RIDE) && !((((rct_ride_type*)chunk)->flags) & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) && - !rideTypeShouldLoseSeparateFlag((rct_ride_type*)chunk)) { + if ((objectType == OBJECT_TYPE_RIDE) && (!((((rct_ride_type*)chunk)->flags) & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) || + !rideTypeShouldLoseSeparateFlag((rct_ride_type*)chunk))) { rct_ride_type* ride_type = (rct_ride_type*)chunk; rct_string_id obj_string = ride_type->ride_type[0]; if (obj_string == 0xFF){ From 770bfa2721c4b73cf9e259123d0446219ffbea80 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 25 Jun 2015 14:45:33 +0200 Subject: [PATCH 0094/1173] Another typo --- src/object_list.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object_list.c b/src/object_list.c index 2d1a36a00e..0b79db46ba 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -737,7 +737,7 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in // When made of two parts i.e Wooden Roller Coaster (Dream Woodie Cars) if ((objectType == OBJECT_TYPE_RIDE) && (!((((rct_ride_type*)chunk)->flags) & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) || - !rideTypeShouldLoseSeparateFlag((rct_ride_type*)chunk))) { + rideTypeShouldLoseSeparateFlag((rct_ride_type*)chunk))) { rct_ride_type* ride_type = (rct_ride_type*)chunk; rct_string_id obj_string = ride_type->ride_type[0]; if (obj_string == 0xFF){ From 937b887a9124405153abf72c9be82d492e3c2259 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Thu, 25 Jun 2015 10:41:40 -0400 Subject: [PATCH 0095/1173] Title Sequence Editor Improvements --- data/language/english_uk.txt | 6 +++--- src/interface/title_sequences.c | 3 +-- src/title.c | 27 +++++---------------------- src/windows/title_command_editor.c | 6 +++--- src/windows/title_editor.c | 29 ++++++++++++++++++++++------- 5 files changed, 34 insertions(+), 37 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index d2296afa03..7bcdf63ab5 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3587,8 +3587,8 @@ STR_5250 :Title Exit Button STR_5251 :Title Options Button STR_5252 :Title Scenario Selection STR_5253 :Park Information -STR_5254 : -STR_5255 : +STR_5254 :Create +STR_5255 :{SMALLFONT}{BLACK}Create a new title sequence from scratch STR_5256 :Create a new theme to make changes to STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one STR_5258 :{SMALLFONT}{BLACK}Delete the current theme @@ -3772,6 +3772,6 @@ STR_5435 :Rename save STR_5436 :Edit Title Sequences... STR_5437 :No save selected STR_5438 :Can't make changes while command editor is open -STR_5439 :A restart is used without a wait command +STR_5439 :A wait with at least 4 seconds is required with a restart STR_5440 :Minimize fullscreen on focus loss STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. Only{NEWLINE}toggleable in the title screen. diff --git a/src/interface/title_sequences.c b/src/interface/title_sequences.c index dce6d9bb01..9cc2d57a01 100644 --- a/src/interface/title_sequences.c +++ b/src/interface/title_sequences.c @@ -102,7 +102,7 @@ void title_sequence_create_preset(const char *name) platform_ensure_directory_exists(path); title_sequence_save_preset_script(preset); - title_sequence_change_preset(preset); + gCurrentTitleSequence = preset; } } @@ -166,7 +166,6 @@ void title_sequence_duplicate_preset(int duplicate, const char *name) } title_sequence_save_preset_script(preset); - //title_sequence_change_preset(preset); gCurrentTitleSequence = preset; } } diff --git a/src/title.c b/src/title.c index 8104d7f90c..d7b2a2e321 100644 --- a/src/title.c +++ b/src/title.c @@ -160,26 +160,7 @@ static void title_create_windows() */ static void title_init_showcase() { - /*_scriptNoLoadsSinceRestart = 1; - - SafeFree(_loadedScript); - - _currentScript = _magicMountainScript; - switch (gConfigGeneral.title_sequence) { - case TITLE_SEQUENCE_OPENRCT2: - _loadedScript = title_script_load(); - if (_loadedScript != NULL) - _currentScript = _loadedScript; - break; - case TITLE_SEQUENCE_RANDOM: - _loadedScript = generate_random_script(); - _currentScript = _loadedScript; - break; - } - - _scriptWaitCounter = 0;*/ title_refresh_sequence(); - title_update_showcase(); } static int title_load_park(const char *path) @@ -227,6 +208,7 @@ static int title_load_park(const char *path) gfx_invalidate_screen(); RCT2_GLOBAL(0x009DEA66, sint16) = 0; RCT2_GLOBAL(0x009DEA5C, sint16) = 0x0D6D8; + gGameSpeed = 1; return 1; } @@ -267,7 +249,7 @@ static void title_do_next_script_opcode() uint8 script_opcode, script_operand; rct_window* w; gTitleScriptCommand++; - if (*(_currentScript - 1) != TITLE_SCRIPT_END) + if (gTitleScriptCommand <= 1 || *(_currentScript - 1) != TITLE_SCRIPT_END) script_opcode = *_currentScript++; else script_opcode = *_currentScript; @@ -648,7 +630,7 @@ bool title_refresh_sequence() else if (title->commands[i].command == TITLE_SCRIPT_LOADMM) { hasLoad = true; } - else if (title->commands[i].command == TITLE_SCRIPT_WAIT) { + else if (title->commands[i].command == TITLE_SCRIPT_WAIT && title->commands[i].seconds >= 4) { hasWait = true; } else if (title->commands[i].command == TITLE_SCRIPT_RESTART) { @@ -707,12 +689,13 @@ bool title_refresh_sequence() return true; } - log_error("Failed to load title sequence, hasLoad: %i, hasWait: %i, hasRestart: %i, hasInvalidSave: %i", hasLoad, hasWait, hasRestart, hasInvalidSave); + log_error("Failed to load title sequence, hasLoad: %i, hasWait4seconds: %i, hasRestart: %i, hasInvalidSave: %i", hasLoad, hasWait, hasRestart, hasInvalidSave); window_error_open(5402, (!hasWait && hasRestart) ? 5439 : STR_NONE); _scriptNoLoadsSinceRestart = 1; if (_loadedScript != _magicMountainScript) SafeFree(_loadedScript); _scriptCurrentPreset = 0; + _loadedScript = _magicMountainScript; _currentScript = _magicMountainScript; _scriptWaitCounter = 0; gTitleScriptCommand = -1; diff --git a/src/windows/title_command_editor.c b/src/windows/title_command_editor.c index 0977790c96..1acbd81f41 100644 --- a/src/windows/title_command_editor.c +++ b/src/windows/title_command_editor.c @@ -394,11 +394,11 @@ static void window_title_command_editor_textinput() case WIDX_TEXTBOX_FULL: if (!result) { if (*end == '\0') { - if (command.command == TITLE_SCRIPT_ROTATE) { + if (command.command == TITLE_SCRIPT_ROTATE || command.command == TITLE_SCRIPT_ZOOM) { if (value > 3) value = 3; } - else if (command.command == TITLE_SCRIPT_ZOOM) { - if (value > 3) value = 3; + else if (command.command == TITLE_SCRIPT_WAIT) { + if (value < 1) value = 1; } command.rotations = (uint8)value; } diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index dee2134f38..23274d5924 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -107,6 +107,7 @@ enum WINDOW_TITLE_EDITOR_WIDGET_IDX { // Presets Tab WIDX_TITLE_EDITOR_PRESETS, WIDX_TITLE_EDITOR_PRESETS_DROPDOWN, + WIDX_TITLE_EDITOR_NEW_BUTTON, WIDX_TITLE_EDITOR_DUPLICATE_BUTTON, WIDX_TITLE_EDITOR_DELETE_BUTTON, WIDX_TITLE_EDITOR_RENAME_BUTTON, @@ -144,12 +145,13 @@ enum WINDOW_TITLE_EDITOR_WIDGET_IDX { #define BS 18 #define ROW_HEIGHT 11 #define SCROLL_WIDTH 350 +#define WH2 127 static rct_widget window_title_editor_widgets[] = { - { WWT_FRAME, 0, 0, WW-1, 0, 106, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_FRAME, 0, 0, WW-1, 0, WH2-1, 0x0FFFFFFFF, STR_NONE }, // panel / background { WWT_CAPTION, 0, 1, WW-2, 1, 14, 5433, STR_WINDOW_TITLE_TIP }, // title bar { WWT_CLOSEBOX, 0, WW-13, WW-3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close button - { WWT_RESIZE, 1, 0, WW-1, 43, 106, 0x0FFFFFFFF, STR_NONE }, // tab content panel + { WWT_RESIZE, 1, 0, WW-1, 43, WH2-1, 0x0FFFFFFFF, STR_NONE }, // tab content panel { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, 5235 }, // presets tab { WWT_TAB, 1, 34, 64, 17, 43, 0x02000144E, 5377 }, // saves tab { WWT_TAB, 1, 65, 95, 17, 43, 0x02000144E, 5378 }, // script tab @@ -158,7 +160,8 @@ static rct_widget window_title_editor_widgets[] = { // Presets Tab { WWT_DROPDOWN, 1, 125, 299, 60, 71, STR_NONE, STR_NONE }, // Preset title sequences { WWT_DROPDOWN_BUTTON, 1, 288, 298, 61, 70, 876, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 10, 100, 82, 93, 5239, 5383 }, // Duplicate button + { WWT_DROPDOWN_BUTTON, 1, 10, 100, 82, 93, 5254, 5255 }, // New button + { WWT_DROPDOWN_BUTTON, 1, 10, 100, 82+20, 93+20, 5239, 5383 }, // Duplicate button { WWT_DROPDOWN_BUTTON, 1, 110, 200, 82, 93, 3349, 5384 }, // Delete button { WWT_DROPDOWN_BUTTON, 1, 210, 300, 82, 93, 3348, 5385 }, // Rename button @@ -233,7 +236,7 @@ void window_title_editor_open(int tab) if (window != NULL) return; - window = window_create_auto_pos(WW, 107, (uint32*)window_title_editor_events, WC_TITLE_EDITOR, WF_10 | WF_RESIZABLE); + window = window_create_auto_pos(WW, WH2, (uint32*)window_title_editor_events, WC_TITLE_EDITOR, WF_10 | WF_RESIZABLE); window->widgets = window_title_editor_widgets; window->enabled_widgets = (1 << WIDX_TITLE_EDITOR_CLOSE) | @@ -243,6 +246,7 @@ void window_title_editor_open(int tab) (1 << WIDX_TITLE_EDITOR_PRESETS) | (1 << WIDX_TITLE_EDITOR_PRESETS_DROPDOWN) | + (1 << WIDX_TITLE_EDITOR_NEW_BUTTON) | (1 << WIDX_TITLE_EDITOR_DUPLICATE_BUTTON) | (1 << WIDX_TITLE_EDITOR_DELETE_BUTTON) | (1 << WIDX_TITLE_EDITOR_RENAME_BUTTON) | @@ -312,6 +316,11 @@ static void window_title_editor_mouseup() case WIDX_TITLE_EDITOR_CLOSE: window_close(w); break; + case WIDX_TITLE_EDITOR_NEW_BUTTON: + commandEditorOpen *= 2; + if (!commandEditorOpen) + window_text_input_open(w, widgetIndex, 5239, 5406, STR_NONE, NULL, 64); + break; case WIDX_TITLE_EDITOR_DUPLICATE_BUTTON: commandEditorOpen *= 2; if (!commandEditorOpen) @@ -498,9 +507,9 @@ static void window_title_editor_resize() if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_PRESETS) { w->min_width = WW; - w->min_height = 107; + w->min_height = WH2; w->max_width = WW; - w->max_height = 107; + w->max_height = WH2; if (w->width < w->min_width) { w->width = w->min_width; @@ -717,11 +726,15 @@ static void window_title_editor_textinput() return; switch (widgetIndex) { + case WIDX_TITLE_EDITOR_NEW_BUTTON: case WIDX_TITLE_EDITOR_DUPLICATE_BUTTON: case WIDX_TITLE_EDITOR_RENAME_BUTTON: if (filename_valid_characters(text)) { if (!title_sequence_name_exists(text)) { - if (widgetIndex == WIDX_TITLE_EDITOR_DUPLICATE_BUTTON) { + if (widgetIndex == WIDX_TITLE_EDITOR_NEW_BUTTON) { + title_sequence_create_preset(text); + } + else if (widgetIndex == WIDX_TITLE_EDITOR_DUPLICATE_BUTTON) { title_sequence_duplicate_preset(gCurrentTitleSequence, text); } else { @@ -777,6 +790,7 @@ void window_title_editor_invalidate() window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].type = WWT_EMPTY; window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS_DROPDOWN].type = WWT_EMPTY; + window_title_editor_widgets[WIDX_TITLE_EDITOR_NEW_BUTTON].type = WWT_EMPTY; window_title_editor_widgets[WIDX_TITLE_EDITOR_DUPLICATE_BUTTON].type = WWT_EMPTY; window_title_editor_widgets[WIDX_TITLE_EDITOR_DELETE_BUTTON].type = WWT_EMPTY; window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME_BUTTON].type = WWT_EMPTY; @@ -802,6 +816,7 @@ void window_title_editor_invalidate() case WINDOW_TITLE_EDITOR_TAB_PRESETS: window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].type = WWT_DROPDOWN; window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_title_editor_widgets[WIDX_TITLE_EDITOR_NEW_BUTTON].type = WWT_DROPDOWN_BUTTON; window_title_editor_widgets[WIDX_TITLE_EDITOR_DUPLICATE_BUTTON].type = WWT_DROPDOWN_BUTTON; window_title_editor_widgets[WIDX_TITLE_EDITOR_DELETE_BUTTON].type = WWT_DROPDOWN_BUTTON; window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME_BUTTON].type = WWT_DROPDOWN_BUTTON; From 5645d8bd8aa62eca4031acd7184a4080eaa83253 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Thu, 25 Jun 2015 11:19:23 -0400 Subject: [PATCH 0096/1173] Added Game Speed command --- data/language/english_uk.txt | 5 +- src/config.c | 6 ++ src/config.h | 1 + src/game.c | 2 + src/scenario.c | 2 + src/title.c | 29 ++++++- src/title.h | 1 + src/windows/title_command_editor.c | 118 ++++++++++++++++++++--------- src/windows/title_editor.c | 6 +- 9 files changed, 129 insertions(+), 41 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 7bcdf63ab5..98ad674378 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3772,6 +3772,9 @@ STR_5435 :Rename save STR_5436 :Edit Title Sequences... STR_5437 :No save selected STR_5438 :Can't make changes while command editor is open -STR_5439 :A wait with at least 4 seconds is required with a restart +STR_5439 :A wait command with at least 4 seconds is required with a restart command STR_5440 :Minimize fullscreen on focus loss STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. Only{NEWLINE}toggleable in the title screen. +STR_5442 :Speed +STR_5443 :Speed{MOVE_X}{87}{STRINGID} +STR_5444 :Speed: diff --git a/src/config.c b/src/config.c index a98127b24e..3fdde76f90 100644 --- a/src/config.c +++ b/src/config.c @@ -1567,6 +1567,9 @@ static void title_sequence_open(const char *path, const char *customName) } else if (_stricmp(token, "ZOOM") == 0) { command.command = TITLE_SCRIPT_ZOOM; command.zoom = atoi(part1) & 0xFF; + } else if (_stricmp(token, "SPEED") == 0) { + command.command = TITLE_SCRIPT_SPEED; + command.speed = max(1, min(4, atoi(part1) & 0xFF)); } else if (_stricmp(token, "WAIT") == 0) { command.command = TITLE_SCRIPT_WAIT; command.seconds = atoi(part1) & 0xFF; @@ -1624,6 +1627,9 @@ void title_sequence_save_preset_script(int preset) case TITLE_SCRIPT_ZOOM: fprintf(file, "ZOOM %i\r\n", command->zoom); break; + case TITLE_SCRIPT_SPEED: + fprintf(file, "SPEED %i\r\n", command->speed); + break; case TITLE_SCRIPT_WAIT: fprintf(file, "WAIT %i\r\n\r\n", command->seconds); break; diff --git a/src/config.h b/src/config.h index 922d0edbf7..6f5a85b991 100644 --- a/src/config.h +++ b/src/config.h @@ -228,6 +228,7 @@ typedef struct { uint8 x; // LOCATION uint8 rotations; // ROTATE (counter-clockwise) uint8 zoom; // ZOOM + uint8 speed; // SPEED uint8 seconds; // WAIT }; uint8 y; // LOCATION diff --git a/src/game.c b/src/game.c index 07cbf76933..2a032562e7 100644 --- a/src/game.c +++ b/src/game.c @@ -731,6 +731,8 @@ int game_load_save(const char *path) load_palette(); gfx_invalidate_screen(); + gGameSpeed = 1; + scenario_set_filename((char*)0x0135936C); return 1; } diff --git a/src/scenario.c b/src/scenario.c index d89609418a..1e486f902a 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -337,6 +337,8 @@ int scenario_load_and_play_from_path(const char *path) gfx_invalidate_screen(); RCT2_GLOBAL(0x009DEA66, uint16) = 0; RCT2_GLOBAL(0x009DEA5C, uint16) = 62000; // (doesn't appear to ever be read) + gGameSpeed = 1; + return 1; } diff --git a/src/title.c b/src/title.c index d7b2a2e321..160de8c665 100644 --- a/src/title.c +++ b/src/title.c @@ -308,6 +308,10 @@ static void title_do_next_script_opcode() if (w != NULL && w->viewport != NULL) window_zoom_set(w, script_operand); break; + case TITLE_SCRIPT_SPEED: + script_operand = (*_currentScript++); + gGameSpeed = max(1, min(4, script_operand)); + break; case TITLE_SCRIPT_RESTART: _scriptNoLoadsSinceRestart = 1; gTitleScriptCommand = -1; @@ -384,6 +388,7 @@ static void title_do_next_script_opcode() */ static void title_update_showcase() { + int i, numUpdates; // Loop used for scene skip functionality // Only loop here when the appropriate save hasn't been loaded yet since no game updates are required do { @@ -401,7 +406,14 @@ static void title_update_showcase() } while (gTitleScriptSkipTo != -1 && gTitleScriptSkipLoad != -1); if (gTitleScriptSkipTo != -1 && gTitleScriptSkipLoad == -1) { - game_logic_update(); + if (gGameSpeed > 1) { + numUpdates = 1 << (gGameSpeed - 1); + } else { + numUpdates = 1; + } + for (i = 0; i < numUpdates; i++) { + game_logic_update(); + } update_palette_effects(); update_rain_animation(); } @@ -435,12 +447,22 @@ static void DrawOpenRCT2(int x, int y) void game_handle_input(); void title_update() { + int i, numUpdates; screenshot_check(); title_handle_keyboard_input(); if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0) { title_update_showcase(); - game_logic_update(); + + if (gGameSpeed > 1) { + numUpdates = 1 << (gGameSpeed - 1); + } else { + numUpdates = 1; + } + + for (i = 0; i < numUpdates; i++) { + game_logic_update(); + } start_title_music(); } @@ -665,6 +687,9 @@ bool title_refresh_sequence() case TITLE_SCRIPT_ZOOM: *scriptPtr++ = title->commands[i].zoom; break; + case TITLE_SCRIPT_SPEED: + *scriptPtr++ = title->commands[i].speed; + break; case TITLE_SCRIPT_WAIT: *scriptPtr++ = title->commands[i].seconds; break; diff --git a/src/title.h b/src/title.h index a174d222f0..b788e9e4aa 100644 --- a/src/title.h +++ b/src/title.h @@ -30,6 +30,7 @@ enum { TITLE_SCRIPT_RESTART, TITLE_SCRIPT_LOAD, TITLE_SCRIPT_END, + TITLE_SCRIPT_SPEED, TITLE_SCRIPT_LOOP, TITLE_SCRIPT_ENDLOOP } TITLE_SCRIPT_COMMANDS; diff --git a/src/windows/title_command_editor.c b/src/windows/title_command_editor.c index 1acbd81f41..61746a6ea9 100644 --- a/src/windows/title_command_editor.c +++ b/src/windows/title_command_editor.c @@ -43,12 +43,13 @@ TITLE_COMMAND_ORDER window_title_command_editor_orders[] = { { TITLE_SCRIPT_LOCATION, 5417, 5427 }, { TITLE_SCRIPT_ROTATE, 5419, 5428 }, { TITLE_SCRIPT_ZOOM, 5421, 5429 }, + { TITLE_SCRIPT_SPEED, 5442, 5444 }, { TITLE_SCRIPT_WAIT, 5423, 5430 }, { TITLE_SCRIPT_RESTART, 5425, STR_NONE }, { TITLE_SCRIPT_END, 5426, STR_NONE }, }; -#define NUM_COMMANDS 7 +#define NUM_COMMANDS 8 enum WINDOW_WATER_WIDGET_IDX { WIDX_BACKGROUND, @@ -59,8 +60,8 @@ enum WINDOW_WATER_WIDGET_IDX { WIDX_TEXTBOX_FULL, WIDX_TEXTBOX_X, WIDX_TEXTBOX_Y, - WIDX_SAVE, - WIDX_SAVE_DROPDOWN, + WIDX_INPUT, + WIDX_INPUT_DROPDOWN, WIDX_OKAY, WIDX_CANCEL }; @@ -203,8 +204,8 @@ void window_title_command_editor_open(int index, bool insert) (1 << WIDX_TEXTBOX_FULL) | (1 << WIDX_TEXTBOX_X) | (1 << WIDX_TEXTBOX_Y) | - (1 << WIDX_SAVE) | - (1 << WIDX_SAVE_DROPDOWN) | + (1 << WIDX_INPUT) | + (1 << WIDX_INPUT_DROPDOWN) | (1 << WIDX_OKAY) | (1 << WIDX_CANCEL); window_init_scroll_widgets(window); @@ -302,24 +303,45 @@ static void window_title_command_editor_mousedown(int widgetIndex, rct_window* w gDropdownItemsChecked = 1 << get_command_info_index(command.command); break; - case WIDX_SAVE_DROPDOWN: - num_items = gConfigTitleSequences.presets[gCurrentTitleSequence].num_saves; - for (i = 0; i < num_items; i++) { - gDropdownItemsFormat[i] = 2777; - gDropdownItemsArgs[i] = (uint64)&gConfigTitleSequences.presets[gCurrentTitleSequence].saves[i]; - } - - window_dropdown_show_text_custom_width( - w->x + widget->left, - w->y + widget->top, - widget->bottom - widget->top + 1, - w->colours[1], - DROPDOWN_FLAG_STAY_OPEN, - num_items, - widget->right - widget->left - 3 - ); + case WIDX_INPUT_DROPDOWN: + if (command.command == TITLE_SCRIPT_SPEED) { + num_items = 4; + for (i = 0; i < num_items; i++) { + gDropdownItemsFormat[i] = 1142; + gDropdownItemsArgs[i] = 5142 + i; + } - gDropdownItemsChecked = 1 << (command.saveIndex); + window_dropdown_show_text_custom_width( + w->x + widget->left, + w->y + widget->top, + widget->bottom - widget->top + 1, + w->colours[1], + DROPDOWN_FLAG_STAY_OPEN, + num_items, + widget->right - widget->left - 3 + ); + + gDropdownItemsChecked = 1 << (command.speed - 1); + } + else if (command.command == TITLE_SCRIPT_LOAD) { + num_items = gConfigTitleSequences.presets[gCurrentTitleSequence].num_saves; + for (i = 0; i < num_items; i++) { + gDropdownItemsFormat[i] = 2777; + gDropdownItemsArgs[i] = (uint64)&gConfigTitleSequences.presets[gCurrentTitleSequence].saves[i]; + } + + window_dropdown_show_text_custom_width( + w->x + widget->left, + w->y + widget->top, + widget->bottom - widget->top + 1, + w->colours[1], + DROPDOWN_FLAG_STAY_OPEN, + num_items, + widget->right - widget->left - 3 + ); + + gDropdownItemsChecked = 1 << (command.saveIndex); + } break; } } @@ -356,6 +378,9 @@ static void window_title_command_editor_dropdown() command.zoom = 0; _itoa(command.zoom, textbox1Buffer, 10); break; + case TITLE_SCRIPT_SPEED: + command.speed = 1; + break; case TITLE_SCRIPT_WAIT: command.seconds = 10; _itoa(command.seconds, textbox1Buffer, 10); @@ -368,10 +393,17 @@ static void window_title_command_editor_dropdown() } window_invalidate(w); break; - case WIDX_SAVE_DROPDOWN: - if (dropdownIndex == command.saveIndex) - break; - command.saveIndex = (uint8)dropdownIndex; + case WIDX_INPUT_DROPDOWN: + if (command.command == TITLE_SCRIPT_SPEED) { + if (dropdownIndex == command.speed - 1) + break; + command.speed = (uint8)(dropdownIndex + 1); + } + else if (command.command == TITLE_SCRIPT_LOAD) { + if (dropdownIndex == command.saveIndex) + break; + command.saveIndex = (uint8)dropdownIndex; + } window_invalidate(w); break; } @@ -453,12 +485,13 @@ static void window_title_command_editor_invalidate() window_title_command_editor_widgets[WIDX_TEXTBOX_FULL].type = WWT_EMPTY; window_title_command_editor_widgets[WIDX_TEXTBOX_X].type = WWT_EMPTY; window_title_command_editor_widgets[WIDX_TEXTBOX_Y].type = WWT_EMPTY; - window_title_command_editor_widgets[WIDX_SAVE].type = WWT_EMPTY; - window_title_command_editor_widgets[WIDX_SAVE_DROPDOWN].type = WWT_EMPTY; + window_title_command_editor_widgets[WIDX_INPUT].type = WWT_EMPTY; + window_title_command_editor_widgets[WIDX_INPUT_DROPDOWN].type = WWT_EMPTY; switch (command.command) { case TITLE_SCRIPT_LOAD: - window_title_command_editor_widgets[WIDX_SAVE].type = WWT_DROPDOWN; - window_title_command_editor_widgets[WIDX_SAVE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + case TITLE_SCRIPT_SPEED: + window_title_command_editor_widgets[WIDX_INPUT].type = WWT_DROPDOWN; + window_title_command_editor_widgets[WIDX_INPUT_DROPDOWN].type = WWT_DROPDOWN_BUTTON; break; case TITLE_SCRIPT_LOCATION: window_title_command_editor_widgets[WIDX_TEXTBOX_X].type = WWT_TEXT_BOX; @@ -494,16 +527,27 @@ static void window_title_command_editor_paint() w->widgets[WIDX_COMMAND_DROPDOWN].left - w->widgets[WIDX_COMMAND].left - 4 ); - if (command.command == TITLE_SCRIPT_LOAD) { + if (command.command == TITLE_SCRIPT_SPEED) { + gfx_draw_string_left_clipped( + dpi, + 5142 + command.speed - 1, + NULL, + w->colours[1], + w->x + w->widgets[WIDX_INPUT].left + 1, + w->y + w->widgets[WIDX_INPUT].top, + w->widgets[WIDX_INPUT_DROPDOWN].left - w->widgets[WIDX_INPUT].left - 4 + ); + } + else if (command.command == TITLE_SCRIPT_LOAD) { if (command.saveIndex == 0xFF) { gfx_draw_string_left_clipped( dpi, 5437, NULL, w->colours[1], - w->x + w->widgets[WIDX_SAVE].left + 1, - w->y + w->widgets[WIDX_SAVE].top, - w->widgets[WIDX_SAVE_DROPDOWN].left - w->widgets[WIDX_SAVE].left - 4 + w->x + w->widgets[WIDX_INPUT].left + 1, + w->y + w->widgets[WIDX_INPUT].top, + w->widgets[WIDX_INPUT_DROPDOWN].left - w->widgets[WIDX_INPUT].left - 4 ); } else { @@ -513,9 +557,9 @@ static void window_title_command_editor_paint() 1170, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, w->colours[1], - w->x + w->widgets[WIDX_SAVE].left + 1, - w->y + w->widgets[WIDX_SAVE].top, - w->widgets[WIDX_SAVE_DROPDOWN].left - w->widgets[WIDX_SAVE].left - 4 + w->x + w->widgets[WIDX_INPUT].left + 1, + w->y + w->widgets[WIDX_INPUT].top, + w->widgets[WIDX_INPUT_DROPDOWN].left - w->widgets[WIDX_INPUT].left - 4 ); } } diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index 23274d5924..a62e17a86d 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -160,7 +160,7 @@ static rct_widget window_title_editor_widgets[] = { // Presets Tab { WWT_DROPDOWN, 1, 125, 299, 60, 71, STR_NONE, STR_NONE }, // Preset title sequences { WWT_DROPDOWN_BUTTON, 1, 288, 298, 61, 70, 876, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 10, 100, 82, 93, 5254, 5255 }, // New button + { WWT_DROPDOWN_BUTTON, 1, 10, 100, 82, 93, 5254, 5255 }, // Create button { WWT_DROPDOWN_BUTTON, 1, 10, 100, 82+20, 93+20, 5239, 5383 }, // Duplicate button { WWT_DROPDOWN_BUTTON, 1, 110, 200, 82, 93, 3349, 5384 }, // Delete button { WWT_DROPDOWN_BUTTON, 1, 210, 300, 82, 93, 3348, 5385 }, // Rename button @@ -1011,6 +1011,10 @@ void window_title_editor_scrollpaint() commandName = 5422; RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = command->zoom; break; + case TITLE_SCRIPT_SPEED: + commandName = 5443; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = (uint16)(5142 + command->speed - 1); + break; case TITLE_SCRIPT_WAIT: commandName = 5424; RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = command->seconds; From 92a31a0fd76ef6e25c7e7f66dc5f1cae28d1d2dd Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Thu, 25 Jun 2015 12:27:57 -0400 Subject: [PATCH 0097/1173] Changed strings --- data/language/english_uk.txt | 3 ++- src/windows/title_command_editor.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 1747a3b5c2..de37c6b724 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3775,6 +3775,7 @@ STR_5438 :Can't make changes while command editor is open STR_5439 :A wait command with at least 4 seconds is required with a restart command STR_5440 :Minimize fullscreen on focus loss STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. -STR_5442 :Speed +STR_5442 :reserved STR_5443 :Speed{MOVE_X}{87}{STRINGID} STR_5444 :Speed: +STR_5445 :Speed diff --git a/src/windows/title_command_editor.c b/src/windows/title_command_editor.c index 61746a6ea9..f7174892ea 100644 --- a/src/windows/title_command_editor.c +++ b/src/windows/title_command_editor.c @@ -43,7 +43,7 @@ TITLE_COMMAND_ORDER window_title_command_editor_orders[] = { { TITLE_SCRIPT_LOCATION, 5417, 5427 }, { TITLE_SCRIPT_ROTATE, 5419, 5428 }, { TITLE_SCRIPT_ZOOM, 5421, 5429 }, - { TITLE_SCRIPT_SPEED, 5442, 5444 }, + { TITLE_SCRIPT_SPEED, 5445, 5444 }, { TITLE_SCRIPT_WAIT, 5423, 5430 }, { TITLE_SCRIPT_RESTART, 5425, STR_NONE }, { TITLE_SCRIPT_END, 5426, STR_NONE }, From 18879e48eb50a14c071349009ee29df175d74fd2 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Thu, 25 Jun 2015 18:12:21 +0100 Subject: [PATCH 0098/1173] Start implmenting sub_6847BA. Possibly finds drawing center for vehicle? --- src/ride/ride.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/ride/ride.c b/src/ride/ride.c index ace0989439..f639bdb3c2 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4508,3 +4508,76 @@ void ride_all_has_any_track_elements(bool *rideIndexArray) rideIndexArray[it.element->properties.track.ride_index] = true; } } + + +/* rct2: 0x006847BA */ +void sub_6847BA(int base_image_id, int ecx){ + char bitmap[200][200] = { 0 }; + + rct_drawpixelinfo dpi = { + .bits = (char*)bitmap, + .x = -100, + .y = -100, + .width = 200, + .height = 200, + .pitch = 0, + .zoom_level = 0 + }; + + for (int i = 0; i < ecx; ++i){ + gfx_draw_sprite(&dpi, base_image_id + i, 0, 0, 0); + } + int al = -1; + for (int i = 99; i != 0; --i){ + for (int j = 0; j < 200; j++){ + if (bitmap[j][100 - i] != 0){ + al = i; + break; + } + } + + if (al != -1) + break; + + for (int j = 0; j < 200; j++){ + if (bitmap[j][100 + i] != 0){ + al = i; + break; + } + } + + if (al != -1) + break; + } + + al++; + int bl = -1; + + for (int i = 99; i != 0; --i){ + for (int j = 0; j < 200; j++){ + if (bitmap[100 - i][j] != 0){ + bl = i; + break; + } + } + + if (bl != -1) + break; + } + bl++; + + int bh = -1; + + for (int i = 99; i != 0; --i){ + for (int j = 0; j < 200; j++){ + if (bitmap[100 + i][j] != 0){ + bh = i; + break; + } + } + + if (bh != -1) + break; + } + bh++; +} \ No newline at end of file From 4b0c84ed20f396efcd8fcfd078dc04acaf4096ac Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 25 Jun 2015 19:46:48 +0200 Subject: [PATCH 0099/1173] Change stat usage to GetFileAttributesEx --- src/platform/windows.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/platform/windows.c b/src/platform/windows.c index e478b0ea34..f04b8745cb 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -676,9 +676,13 @@ uint16 platform_get_locale_language(){ } time_t platform_file_get_modified_time(char* path){ - struct _stat stat; - _stat(path, &stat); - return stat.st_mtime; + WIN32_FILE_ATTRIBUTE_DATA data; + if (!GetFileAttributesEx(path, GetFileExInfoStandard, &data)) + return 0; + ULARGE_INTEGER ull; + ull.LowPart = data.ftLastWriteTime.dwLowDateTime; + ull.HighPart = data.ftLastWriteTime.dwHighDateTime; + return ull.QuadPart / 10000000ULL - 11644473600ULL; } uint8 platform_get_locale_currency(){ From 31e8e604fe01bc86d68745c4b258eeb07a8c72be Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Thu, 25 Jun 2015 14:27:09 -0400 Subject: [PATCH 0100/1173] Added Get button to command editor --- data/language/english_uk.txt | 1 + src/interface/console.c | 1 - src/windows/title_command_editor.c | 44 +++++++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index de37c6b724..85da216410 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3779,3 +3779,4 @@ STR_5442 :reserved STR_5443 :Speed{MOVE_X}{87}{STRINGID} STR_5444 :Speed: STR_5445 :Speed +STR_5446 :Get diff --git a/src/interface/console.c b/src/interface/console.c index 71f32c03c9..27bccea426 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -516,7 +516,6 @@ static int cc_get(const char **argv, int argc) int interactionType; rct_map_element *mapElement; rct_xy16 mapCoord = { 0 }; - get_map_coordinates_from_pos(w->viewport->view_width / 2, w->viewport->view_height / 2, VIEWPORT_INTERACTION_MASK_TERRAIN, &mapCoord.x, &mapCoord.y, &interactionType, &mapElement, NULL); mapCoord.x -= 16; mapCoord.x /= 32; diff --git a/src/windows/title_command_editor.c b/src/windows/title_command_editor.c index f7174892ea..3fe009bbe8 100644 --- a/src/windows/title_command_editor.c +++ b/src/windows/title_command_editor.c @@ -62,6 +62,7 @@ enum WINDOW_WATER_WIDGET_IDX { WIDX_TEXTBOX_Y, WIDX_INPUT, WIDX_INPUT_DROPDOWN, + WIDX_GET, WIDX_OKAY, WIDX_CANCEL }; @@ -92,6 +93,8 @@ static rct_widget window_title_command_editor_widgets[] = { { WWT_DROPDOWN, 1, 16, WW-17, BY2, BY2+11, STR_NONE, STR_NONE }, // Save dropdown { WWT_DROPDOWN_BUTTON, 1, WW-28, WW-18, BY2+1, BY2+10, 876, STR_NONE }, + + { WWT_DROPDOWN_BUTTON, 1, WS+WHA+3, WW-WS-1, BY2-14, BY2-3, 5446, STR_NONE }, // Get location/zoom/etc { WWT_DROPDOWN_BUTTON, 1, 10, 80, WH-21, WH-10, STR_OK, STR_NONE }, // OKAY { WWT_DROPDOWN_BUTTON, 1, WW-80, WW-10, WH-21, WH-10, STR_CANCEL, STR_NONE }, // Cancel @@ -112,6 +115,7 @@ static void window_title_command_editor_inputsize(rct_window *w); static int get_command_info_index(int index); static TITLE_COMMAND_ORDER get_command_info(int index); static rct_xy16 get_location(); +static uint8 get_zoom(); static void* window_title_command_editor_events[] = { window_title_command_editor_close, @@ -181,6 +185,16 @@ static rct_xy16 get_location() return mapCoord; } +static uint8 get_zoom() +{ + uint8 zoom = 0; + rct_window *w = window_get_main(); + if (w != NULL) { + zoom = w->viewport->zoom; + } + return zoom; +} + void window_title_command_editor_open(int index, bool insert) { rct_window* window; @@ -206,6 +220,7 @@ void window_title_command_editor_open(int index, bool insert) (1 << WIDX_TEXTBOX_Y) | (1 << WIDX_INPUT) | (1 << WIDX_INPUT_DROPDOWN) | + (1 << WIDX_GET) | (1 << WIDX_OKAY) | (1 << WIDX_CANCEL); window_init_scroll_widgets(window); @@ -244,6 +259,8 @@ static void window_title_command_editor_mouseup() { rct_window *w, *title_editor_w; short widgetIndex; + rct_xy16 mapCoord; + uint8 zoom; window_widget_get_registers(w, widgetIndex); @@ -261,6 +278,21 @@ static void window_title_command_editor_mouseup() case WIDX_TEXTBOX_Y: window_start_textbox(w, widgetIndex, 1170, (uint32)textbox2Buffer, 4); break; + case WIDX_GET: + if (command.command == TITLE_SCRIPT_LOCATION) { + mapCoord = get_location(); + command.x = (uint8)mapCoord.x; + command.y = (uint8)mapCoord.y; + _itoa(command.x, textbox1Buffer, 10); + _itoa(command.y, textbox2Buffer, 10); + } + else if (command.command == TITLE_SCRIPT_ZOOM) { + zoom = get_zoom(); + command.zoom = zoom; + _itoa(command.zoom, textbox1Buffer, 10); + } + window_invalidate(w); + break; case WIDX_OKAY: if (_window_title_command_editor_insert) { title_sequence_insert_command(gCurrentTitleSequence, _window_title_command_editor_index, command); @@ -487,6 +519,7 @@ static void window_title_command_editor_invalidate() window_title_command_editor_widgets[WIDX_TEXTBOX_Y].type = WWT_EMPTY; window_title_command_editor_widgets[WIDX_INPUT].type = WWT_EMPTY; window_title_command_editor_widgets[WIDX_INPUT_DROPDOWN].type = WWT_EMPTY; + window_title_command_editor_widgets[WIDX_GET].type = WWT_EMPTY; switch (command.command) { case TITLE_SCRIPT_LOAD: case TITLE_SCRIPT_SPEED: @@ -496,13 +529,22 @@ static void window_title_command_editor_invalidate() case TITLE_SCRIPT_LOCATION: window_title_command_editor_widgets[WIDX_TEXTBOX_X].type = WWT_TEXT_BOX; window_title_command_editor_widgets[WIDX_TEXTBOX_Y].type = WWT_TEXT_BOX; + window_title_command_editor_widgets[WIDX_GET].type = WWT_DROPDOWN_BUTTON; break; case TITLE_SCRIPT_ROTATE: - case TITLE_SCRIPT_ZOOM: case TITLE_SCRIPT_WAIT: window_title_command_editor_widgets[WIDX_TEXTBOX_FULL].type = WWT_TEXT_BOX; break; + case TITLE_SCRIPT_ZOOM: + window_title_command_editor_widgets[WIDX_GET].type = WWT_DROPDOWN_BUTTON; + window_title_command_editor_widgets[WIDX_TEXTBOX_FULL].type = WWT_TEXT_BOX; + break; } + + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO) + w->disabled_widgets |= (1 << WIDX_GET); + else + w->disabled_widgets &= ~(1 << WIDX_GET); } static void window_title_command_editor_paint() From a1c3de02b3fc6b1bab6bdf03e66ad8f88f1108e3 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Thu, 25 Jun 2015 21:56:56 +0200 Subject: [PATCH 0101/1173] Correct typos and American English --- data/language/english_uk.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index de37c6b724..b7a9a66806 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -530,7 +530,7 @@ STR_0525 :Riders career down a twisting track guided only by the curvature an STR_0526 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track -STR_0529 :Mine train themes roller coaster trains career along steel roller coaster track made to look like old railway track +STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_0532 : @@ -3732,7 +3732,7 @@ STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game STR_5397 :Can only be used on the title screen STR_5398 :Cannot edit title sequence while it's playing -STR_5399 :Press the stop button to coninue editing +STR_5399 :Press the stop button to continue editing STR_5400 :Can't change this title sequence STR_5401 :Create a new title sequence to make changes to STR_5402 :Failed to load title sequence @@ -3761,7 +3761,7 @@ STR_5424 :Wait{MOVE_X}{87}{COMMA16} STR_5425 :Restart STR_5426 :End STR_5427 :Coordinates: -STR_5428 :Counter-clockwise rotations: +STR_5428 :Anticlockwise rotations: STR_5429 :Zoom level: STR_5430 :Seconds to wait: STR_5431 :Save to load: @@ -3773,7 +3773,7 @@ STR_5436 :Edit Title Sequences... STR_5437 :No save selected STR_5438 :Can't make changes while command editor is open STR_5439 :A wait command with at least 4 seconds is required with a restart command -STR_5440 :Minimize fullscreen on focus loss +STR_5440 :Minimise fullscreen on focus loss STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. STR_5442 :reserved STR_5443 :Speed{MOVE_X}{87}{STRINGID} From 132236f9c89d1ed57b4ca530014dfb943cf77531 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Thu, 25 Jun 2015 21:06:50 +0100 Subject: [PATCH 0102/1173] Tidied up function and labelled. Unsure when this information is used so not completely convinced this has been done correct. --- src/object.c | 21 +++------------------ src/ride/ride.c | 16 +++++++++++++--- src/ride/ride.h | 1 + 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/object.c b/src/object.c index add50ce5fe..84004d2ac2 100644 --- a/src/object.c +++ b/src/object.c @@ -623,27 +623,12 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp // 0x6DEB0D if (!(rideVehicleEntry->var_12 & 0x400)){ - int ecx = cur_vehicle_images_offset - rideVehicleEntry->base_image_id; + int num_images = cur_vehicle_images_offset - rideVehicleEntry->base_image_id; if (rideVehicleEntry->var_12 & 0x2000){ - ecx *= 2; + num_images *= 2; } - int bl, bh, eax = 0; - { - int ebx = rideVehicleEntry->base_image_id; - int edx = 0, esi = 0, ebp = 0, edi = 0; - RCT2_CALLFUNC_X(0x6847BA, &eax, &ebx, &ecx, &edx, &esi, &ebp, &edi); - bl = ebx & 0xFF; - bh = (ebx >> 8) & 0xFF; - } - - if (rideVehicleEntry->var_12 & 0x2000){ - bl += 16; - } - - rideVehicleEntry->var_0E = eax & 0xFF; - rideVehicleEntry->var_0F = bl; - rideVehicleEntry->var_10 = bh; + set_vehicle_type_image_max_sizes(rideVehicleEntry, num_images); } uint8 no_positions = *peep_loading_positions++; diff --git a/src/ride/ride.c b/src/ride/ride.c index f639bdb3c2..47f5fb312f 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4511,7 +4511,7 @@ void ride_all_has_any_track_elements(bool *rideIndexArray) /* rct2: 0x006847BA */ -void sub_6847BA(int base_image_id, int ecx){ +void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int num_images){ char bitmap[200][200] = { 0 }; rct_drawpixelinfo dpi = { @@ -4524,8 +4524,8 @@ void sub_6847BA(int base_image_id, int ecx){ .zoom_level = 0 }; - for (int i = 0; i < ecx; ++i){ - gfx_draw_sprite(&dpi, base_image_id + i, 0, 0, 0); + for (int i = 0; i < num_images; ++i){ + gfx_draw_sprite(&dpi, vehicle_type->base_image_id + i, 0, 0, 0); } int al = -1; for (int i = 99; i != 0; --i){ @@ -4580,4 +4580,14 @@ void sub_6847BA(int base_image_id, int ecx){ break; } bh++; + + // Moved from object paint + + if (vehicle_type->var_12 & 0x2000){ + bl += 16; + } + + vehicle_type->var_0E = al; + vehicle_type->var_0F = bl; + vehicle_type->var_10 = bh; } \ No newline at end of file diff --git a/src/ride/ride.h b/src/ride/ride.h index 923a4e540c..89e4217418 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -826,6 +826,7 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void ride_clear_for_construction(int rideIndex); +void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int num_images); int get_var_10E_unk_1(rct_ride* ride); int get_var_10E_unk_2(rct_ride* ride); From a05ad7319e25c8e9edb92fe52be57aed02824fb1 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Thu, 25 Jun 2015 16:42:12 -0400 Subject: [PATCH 0103/1173] Fixed themes features duplicate bug --- src/interface/themes.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/interface/themes.c b/src/interface/themes.c index 2fe2d20e6e..f10aa752f7 100644 --- a/src/interface/themes.c +++ b/src/interface/themes.c @@ -198,6 +198,7 @@ void theme_create_preset(int duplicate, const char *name) for (int i = 0; i < (int)gNumThemeWindows; i++) { gConfigThemes.presets[preset].windows[i] = gConfigThemes.presets[duplicate].windows[i]; } + gConfigThemes.presets[preset].features = gConfigThemes.presets[duplicate].features; themes_save_preset(preset); theme_change_preset(preset); } From 760f0853ea7098688ce3f8e1bc404f152b65ac40 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Thu, 25 Jun 2015 18:15:25 -0400 Subject: [PATCH 0104/1173] Fixed incorrect filter data --- src/object_list.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/object_list.c b/src/object_list.c index 0b79db46ba..d2a8dc5304 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -277,6 +277,7 @@ void object_list_load() uint32 fileCount = 0; uint32 objectCount = 0; uint32 current_item_offset = 0; + uint32 next_offset = 0; RCT2_GLOBAL(RCT2_ADDRESS_ORIGINAL_RCT2_OBJECT_COUNT, uint32) = 0; log_verbose("building cache of available objects..."); @@ -318,10 +319,13 @@ void object_list_load() rct_object_entry* installed_entry = (rct_object_entry*)(RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, uint8*) + current_item_offset); rct_object_filters filter; - current_item_offset += install_object_entry(&entry, installed_entry, enumFileInfo.path, &filter); - _installedObjectFilters[objectCount] = filter; + next_offset = install_object_entry(&entry, installed_entry, enumFileInfo.path, &filter); + if (next_offset) { + current_item_offset += next_offset; - objectCount++; + _installedObjectFilters[objectCount] = filter; + objectCount++; + } } platform_enumerate_files_end(enumFileHandle); } From 210ba2a04d6923e83a49574d7fb51f7080c9145d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 25 Jun 2015 16:48:32 +0100 Subject: [PATCH 0105/1173] object-selection-columns: add ride type with sort --- src/object.h | 2 +- src/object_list.c | 15 +- src/windows/editor_object_selection.c | 268 +++++++++++++++++--------- 3 files changed, 189 insertions(+), 96 deletions(-) diff --git a/src/object.h b/src/object.h index cf5b735d61..de586c0b93 100644 --- a/src/object.h +++ b/src/object.h @@ -80,7 +80,7 @@ typedef struct { typedef struct { uint8 category[2]; - + uint8 ride_type; } rct_ride_filters; typedef struct { diff --git a/src/object_list.c b/src/object_list.c index d2a8dc5304..379036d1c3 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -795,10 +795,21 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in static void load_object_filter(rct_object_entry* entry, uint8* chunk, rct_object_filters* filter) { + rct_ride_type *rideType; + rct_ride_filters *rideFilter; + switch (entry->flags & 0xF) { case OBJECT_TYPE_RIDE: - filter->ride.category[0] = ((rct_ride_type*)chunk)->category[0]; - filter->ride.category[1] = ((rct_ride_type*)chunk)->category[1]; + rideType = ((rct_ride_type*)chunk); + rideFilter = &(filter->ride); + + rideFilter->category[0] = rideType->category[0]; + rideFilter->category[1] = rideType->category[1]; + for (int i = 0; i < 3; i++) { + rideFilter->ride_type = rideType->ride_type[i]; + if (rideFilter->ride_type != 255) + break; + } break; case OBJECT_TYPE_SMALL_SCENERY: case OBJECT_TYPE_LARGE_SCENERY: diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index f69aa0ba1c..5841106e57 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -135,7 +135,7 @@ static rct_widget window_editor_object_selection_widgets[] = { { WWT_DROPDOWN_BUTTON, 0, 350, 463, 23, 34, 5261, 5265 }, { WWT_TEXT_BOX, 1, 4, 214, 46, 57, (uint32)_filter_string, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 218, 287, 46, 57, 5277, STR_NONE }, - { WWT_RESIZE, 1, 3, 287, 73, 76, 0xFFFFFFFF, STR_NONE }, + { WWT_IMGBTN, 1, 3, 287, 73, 76, 0xFFFFFFFF, STR_NONE }, { WWT_TAB, 1, 3, 33, 47, 73, 0x2000144E, 5349 }, { WWT_TAB, 1, 34, 64, 47, 73, 0x2000144E, 1223 }, { WWT_TAB, 1, 65, 95, 47, 73, 0x2000144E, 1224 }, @@ -154,6 +154,7 @@ static void window_editor_object_selection_emptysub() { } static void window_editor_object_selection_close(); static void window_editor_object_selection_mouseup(); +static void window_editor_object_selection_resize(); static void window_editor_object_selection_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); static void window_editor_object_selection_dropdown(); static void window_editor_object_selection_update(rct_window *w); @@ -169,7 +170,7 @@ static void window_editor_object_selection_textinput(); static void* window_editor_object_selection_events[] = { window_editor_object_selection_close, (void*)window_editor_object_selection_mouseup, - (void*)window_editor_object_selection_emptysub, + (void*)window_editor_object_selection_resize, (void*)window_editor_object_selection_mousedown, (void*)window_editor_object_selection_dropdown, (void*)window_editor_object_selection_emptysub, @@ -259,6 +260,72 @@ static rct_object_entry DefaultSelectedObjects[] = { { 0x00000087, { "SCGWATER" }, 0 } // Water Feature Themeing }; + +typedef struct { + rct_object_entry *entry; + rct_object_filters *filter; + uint8 *flags; +} list_item; + +static int _numListItems = 0; +static list_item *_listItems = NULL; + +static void visible_list_dispose() +{ + SafeFree(_listItems); + _numListItems = 0; +} + +static int visible_list_sort_ride_type(const void *rawA, const void *rawB) +{ + list_item *a = (list_item*)rawA; + list_item *b = (list_item*)rawB; + + const char *rideTypeA = language_get_string(2 + a->filter->ride.ride_type); + const char *rideTypeB = language_get_string(2 + b->filter->ride.ride_type); + int result = strcmp(rideTypeA, rideTypeB); + if (result != 0) + return result; + + const char *nameA = object_get_name(a->entry); + const char *nameB = object_get_name(b->entry); + return strcmp(nameA, nameB); +} + +static void visible_list_refresh(rct_window *w) +{ + int numObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, sint32); + + visible_list_dispose(); + _listItems = malloc(numObjects * sizeof(list_item)); + _numListItems = 0; + + list_item *currentListItem = &_listItems[0]; + rct_object_entry *entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); + uint8 *itemFlags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); + for (int i = 0; i < numObjects; i++) { + rct_object_filters *filter = get_object_filter(i); + int type = entry->flags & 0x0F; + int source = (entry->flags & 0xF0) >> 4; + if (type == w->selected_tab && !(*itemFlags & OBJECT_SELECTION_FLAG_6) && filter_source(entry) && filter_string(entry) && filter_chunks(entry, filter)) { + currentListItem->entry = entry; + currentListItem->filter = filter; + currentListItem->flags = itemFlags; + currentListItem++; + _numListItems++; + } + + entry = object_get_next(entry); + itemFlags++; + } + + _listItems = realloc(_listItems, _numListItems * sizeof(list_item)); + + qsort(_listItems, _numListItems, sizeof(list_item), visible_list_sort_ride_type); +} + + + /** * * rct2: 0x006AA64E @@ -280,7 +347,7 @@ void window_editor_object_selection_open() 400, (uint32*)window_editor_object_selection_events, WC_EDITOR_OBJECT_SELECTION, - WF_10 + WF_10 | WF_RESIZABLE ); window->widgets = window_editor_object_selection_widgets; @@ -303,6 +370,12 @@ void window_editor_object_selection_open() window->selected_tab = 0; window->selected_list_item = -1; window->var_494 = 0xFFFFFFFF; + window->min_width = 600; + window->min_height = 400; + window->max_width = 1200; + window->max_height = 1000; + + visible_list_refresh(window); } /* rct2: 0x006ABCD1 */ @@ -646,6 +719,8 @@ static void window_editor_object_selection_close() gSilentResearch = false; } window_new_ride_init_vars(); + + visible_list_dispose(); } /** @@ -703,6 +778,7 @@ static void window_editor_object_selection_mouseup() _filter_flags |= (1 << (widgetIndex - WIDX_FILTER_RIDE_TAB_TRANSPORT + 5)); filter_update_counts(); + visible_list_refresh(w); w->selected_list_item = -1; w->var_494 = 0xFFFFFFFF; @@ -739,6 +815,15 @@ static void window_editor_object_selection_mouseup() } } +static void window_editor_object_selection_resize() +{ + rct_window *w; + + window_get_register(w); + + window_set_resize(w, 600, 400, 1200, 1000); +} + void window_editor_object_selection_mousedown(int widgetIndex, rct_window*w, rct_widget* widget) { int num_items; @@ -803,18 +888,13 @@ static void window_editor_object_selection_scrollgetsize() { rct_window *w; short scrollIndex; - int numItems, width, height; + int width, height; window_scroll_get_registers(w, scrollIndex); - numItems = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER) ? - RCT2_GLOBAL(0x00F43412, uint16) : - ((_FILTER_ALL && _filter_string[0] == 0) ? - RCT2_ADDRESS(0x00F433E1, uint16)[w->selected_tab] : - _filter_object_counts[w->selected_tab]); - width = 0; - height = numItems * 12; + height = _numListItems * 12; + window_scrollsize_set_registers(width, height); } @@ -953,8 +1033,28 @@ static void window_editor_object_selection_invalidate() rct_widget *widget; window_get_register(w); + colour_scheme_update(w); + // Resize widgets + w->widgets[WIDX_BACKGROUND].right = w->width - 1; + w->widgets[WIDX_BACKGROUND].bottom = w->height - 1; + w->widgets[WIDX_TITLE].right = w->width - 2; + w->widgets[WIDX_CLOSE].left = w->width - 13; + w->widgets[WIDX_CLOSE].right = w->width - 3; + w->widgets[WIDX_TAB_CONTENT_PANEL].right = w->width - 1; + w->widgets[WIDX_TAB_CONTENT_PANEL].bottom = w->height - 1; + w->widgets[WIDX_DROPDOWN1].left = w->width - 130; + w->widgets[WIDX_DROPDOWN1].right = w->width - 9; + w->widgets[WIDX_LIST].right = w->width - 309; + w->widgets[WIDX_LIST].bottom = w->height - 14; + w->widgets[WIDX_PREVIEW].left = w->width - 209; + w->widgets[WIDX_PREVIEW].right = w->width - 96; + w->widgets[WIDX_DROPDOWN2].left = w->width - 216; + w->widgets[WIDX_DROPDOWN2].right = w->width - 130; + w->widgets[WIDX_FILTER_DROPDOWN].left = w->width - 250; + w->widgets[WIDX_FILTER_DROPDOWN].right = w->width - 137; + // Set pressed widgets w->pressed_widgets |= 1 << WIDX_PREVIEW; window_editor_object_selection_set_pressed_tab(w); @@ -1006,8 +1106,8 @@ static void window_editor_object_selection_invalidate() x = 300; } - w->widgets[WIDX_LIST].right = 587 - x; - w->widgets[WIDX_PREVIEW].left = 537 - (x >> 1); + w->widgets[WIDX_LIST].right = w->width - (600 - 587) - x; + w->widgets[WIDX_PREVIEW].left = w->width - (600 - 537) - (x / 2); w->widgets[WIDX_PREVIEW].right = w->widgets[WIDX_PREVIEW].left + 113; bool ridePage = (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS); @@ -1031,7 +1131,7 @@ static void window_editor_object_selection_invalidate() w->pressed_widgets |= (uint64)(1 << (WIDX_FILTER_RIDE_TAB_TRANSPORT + i)); } } - w->widgets[WIDX_FILTER_RIDE_TAB_FRAME].type = WWT_RESIZE; + w->widgets[WIDX_FILTER_RIDE_TAB_FRAME].type = WWT_IMGBTN; for (int i = WIDX_FILTER_RIDE_TAB_ALL; i <= WIDX_FILTER_RIDE_TAB_STALL; i++) w->widgets[i].type = WWT_TAB; } @@ -1249,14 +1349,10 @@ static void window_editor_object_selection_paint() */ static void window_editor_object_selection_scrollpaint() { - int x, y, i, colour, colour2, numObjects, type; + int x, y, i, colour, colour2; short scrollIndex; - rct_object_entry *entry; - rct_object_filters *filter; rct_window *w; rct_drawpixelinfo *dpi; - uint8 *itemFlags; - uint8 source; window_scrollpaint_get_registers(w, dpi, scrollIndex); @@ -1264,65 +1360,64 @@ static void window_editor_object_selection_scrollpaint() colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; gfx_clear(dpi, colour); - numObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, sint32); - entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); - itemFlags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); y = 0; - for (i = 0; i < numObjects; i++) { - filter = get_object_filter(i); - type = entry->flags & 0x0F; - source = (entry->flags & 0xF0) >> 4; - if (type == w->selected_tab && !(*itemFlags & OBJECT_SELECTION_FLAG_6) && filter_source(entry) && filter_string(entry) && filter_chunks(entry, filter)) { - if (y + 12 >= dpi->y && y <= dpi->y + dpi->height) { - // Draw checkbox - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && !(*itemFlags & 0x20)) - gfx_fill_rect_inset(dpi, 2, y, 11, y + 10, w->colours[1], 0xE0); + for (i = 0; i < _numListItems; i++) { + list_item *listItem = &_listItems[i]; - // Highlight background - colour = 142; - if (entry == (rct_object_entry*)w->var_494 && !(*itemFlags & OBJECT_SELECTION_FLAG_6)) { - gfx_fill_rect(dpi, 0, y, w->width, y + 11, 0x2000031); - colour = 14; - } + if (y + 12 >= dpi->y && y <= dpi->y + dpi->height) { + // Draw checkbox + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && !(*listItem->flags & 0x20)) + gfx_fill_rect_inset(dpi, 2, y, 11, y + 10, w->colours[1], 0xE0); - // Draw checkmark - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && (*itemFlags & OBJECT_SELECTION_FLAG_SELECTED)) { - x = 2; - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = colour == 14 ? -2 : -1; - colour2 = w->colours[1] & 0x7F; - if (*itemFlags & (OBJECT_SELECTION_FLAG_IN_USE | OBJECT_SELECTION_FLAG_REQUIRED | OBJECT_SELECTION_FLAG_ALWAYS_REQUIRED)) - colour2 |= 0x40; - - gfx_draw_string(dpi, (char*)0x009DED72, colour2, x, y); - } - - // Draw text - char *buffer = (char*)0x0141ED68; - *buffer = colour; - strcpy(buffer + 1, object_get_name(entry)); - if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { - while (*buffer != 0 && *buffer != 9) - buffer++; - - *buffer = 0; - } - - if (*itemFlags & OBJECT_SELECTION_FLAG_6) { - colour = w->colours[1] & 0x7F; - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = -1; - } - else { - colour = 0; - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = 224; - } - x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 15; - gfx_draw_string(dpi, (char*)0x0141ED68, colour, x, y); + // Highlight background + colour = 142; + if (listItem->entry == (rct_object_entry*)w->var_494 && !(*listItem->flags & OBJECT_SELECTION_FLAG_6)) { + gfx_fill_rect(dpi, 0, y, w->width, y + 11, 0x2000031); + colour = 14; } - y += 12; - } - entry = object_get_next(entry); - itemFlags++; + // Draw checkmark + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && (*listItem->flags & OBJECT_SELECTION_FLAG_SELECTED)) { + x = 2; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = colour == 14 ? -2 : -1; + colour2 = w->colours[1] & 0x7F; + if (*listItem->flags & (OBJECT_SELECTION_FLAG_IN_USE | OBJECT_SELECTION_FLAG_REQUIRED | OBJECT_SELECTION_FLAG_ALWAYS_REQUIRED)) + colour2 |= 0x40; + + gfx_draw_string(dpi, (char*)0x009DED72, colour2, x, y); + } + + x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 15; + + char *bufferWithColour = (char*)0x0141ED68; + char *buffer = bufferWithColour + 1; + bufferWithColour[0] = colour; + if (*listItem->flags & OBJECT_SELECTION_FLAG_6) { + colour = w->colours[1] & 0x7F; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = -1; + } + else { + colour = 0; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = 224; + } + + // Draw ride type + strcpy(buffer, language_get_string(2 + listItem->filter->ride.ride_type)); + gfx_draw_string(dpi, bufferWithColour, colour, x, y); + + x += 200; + + // Draw text + strcpy(buffer, object_get_name(listItem->entry)); + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { + while (*buffer != 0 && *buffer != 9) + buffer++; + + *buffer = 0; + } + gfx_draw_string(dpi, bufferWithColour, colour, x, y); + } + y += 12; } } @@ -1715,27 +1810,14 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct */ static int get_object_from_object_selection(uint8 object_type, int y, uint8 *object_selection_flags, rct_object_entry **installed_entry) { - rct_object_filters *filter; - *installed_entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); - uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); - uint8 source; - int object_count = 0; - for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ - filter = get_object_filter(RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32) - i); - source = ((*installed_entry)->flags & 0xF0) >> 4; - if (((*installed_entry)->flags & 0xF) == object_type && filter_source(*installed_entry) && filter_string(*installed_entry) && filter_chunks(*installed_entry, filter)){ - if (!(*selection_flags & OBJECT_SELECTION_FLAG_6)){ - y -= 12; - *object_selection_flags = *selection_flags; - if (y < 0)return object_count; - object_count++; - } - } + int listItemIndex = y / 12; + if (listItemIndex < 0 || listItemIndex >= _numListItems) + return -1; - *installed_entry = object_get_next(*installed_entry); - selection_flags++; - } - return -1; + list_item *listItem = &_listItems[listItemIndex]; + *object_selection_flags = *listItem->flags; + *installed_entry = listItem->entry; + return listItemIndex; } /** From 831bc6b3bd835c95e2c1953807cba3d7d1c740c6 Mon Sep 17 00:00:00 2001 From: Maikel Stuivenberg Date: Fri, 26 Jun 2015 01:21:35 +0200 Subject: [PATCH 0106/1173] Added a back button on "Select Design" list #1346 --- data/language/english_uk.txt | 1 + src/localisation/string_ids.h | 1 + src/windows/track_list.c | 12 ++++++++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 0a2e5fd020..3faec4c51d 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3780,3 +3780,4 @@ STR_5443 :Speed{MOVE_X}{87}{STRINGID} STR_5444 :Speed: STR_5445 :Speed STR_5446 :Get +STR_5447 :{SMALLFONT}{BLACK}Select an other ride/attraction diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index a1029e0da5..73088a384e 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -805,6 +805,7 @@ enum { STR_SELECT_DESIGN = 2307, STR_TRACK_DESIGNS = 2308, STR_BUILD_CUSTOM_DESIGN = 2310, + STR_SELECT_OTHER_RIDE = 5447, STR_TRACK_LIST_EXCITEMENT_RATING = 2311, STR_TRACK_LIST_INTENSITY_RATING = 2312, diff --git a/src/windows/track_list.c b/src/windows/track_list.c index d60afdfae5..71bd536325 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -38,7 +38,8 @@ enum { WIDX_TRACK_LIST, WIDX_TRACK_PREVIEW, WIDX_ROTATE, - WIDX_TOGGLE_SCENERY + WIDX_TOGGLE_SCENERY, + WIDX_BACK, }; static rct_widget window_track_list_widgets[] = { @@ -49,6 +50,7 @@ static rct_widget window_track_list_widgets[] = { { WWT_FLATBTN, 0, 224, 595, 18, 236, 0xFFFFFFFF, STR_NONE }, { WWT_FLATBTN, 0, 574, 597, 374, 397, 5169, STR_ROTATE_90_TIP }, { WWT_FLATBTN, 0, 574, 597, 350, 373, 5171, STR_TOGGLE_SCENERY_TIP }, + { WWT_FLATBTN, 0, 574, 597, 326, 349, SPR_PREVIOUS, STR_SELECT_OTHER_RIDE }, { WIDGETS_END }, }; @@ -136,7 +138,7 @@ void window_track_list_open(ride_list_item item) 0 ); w->widgets = window_track_list_widgets; - w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_ROTATE) | (1 << WIDX_TOGGLE_SCENERY); + w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_ROTATE) | (1 << WIDX_TOGGLE_SCENERY) | (1 << WIDX_BACK); window_init_scroll_widgets(w); w->track_list.var_480 = 0xFFFF; w->track_list.var_482 = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 1; @@ -266,6 +268,10 @@ static void window_track_list_mouseup() reset_track_list_cache(); window_invalidate(w); break; + case WIDX_BACK: + window_close(w); + window_new_ride_open(); + break; } } @@ -376,6 +382,7 @@ static void window_track_list_invalidate() w->disabled_widgets &= ~(1 << WIDX_TRACK_PREVIEW); window_track_list_widgets[WIDX_ROTATE].type = WWT_FLATBTN; window_track_list_widgets[WIDX_TOGGLE_SCENERY].type = WWT_FLATBTN; + window_track_list_widgets[WIDX_BACK].type = WWT_FLATBTN; if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) == 0) w->pressed_widgets |= (1 << WIDX_TOGGLE_SCENERY); else @@ -385,6 +392,7 @@ static void window_track_list_invalidate() w->disabled_widgets |= (1 << WIDX_TRACK_PREVIEW); window_track_list_widgets[WIDX_ROTATE].type = WWT_EMPTY; window_track_list_widgets[WIDX_TOGGLE_SCENERY].type = WWT_EMPTY; + window_track_list_widgets[WIDX_BACK].type = WWT_EMPTY; } } From 2e47f2a26a814ce29fbdf5cb57b76aa3781edf70 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 26 Jun 2015 01:11:24 +0100 Subject: [PATCH 0107/1173] object-selection-columns: finish sorting and add ride tab animations --- data/language/english_uk.txt | 2 + src/localisation/string_ids.h | 3 + src/windows/editor_object_selection.c | 215 ++++++++++++++++++++------ 3 files changed, 175 insertions(+), 45 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 0a2e5fd020..24f2a80331 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3780,3 +3780,5 @@ STR_5443 :Speed{MOVE_X}{87}{STRINGID} STR_5444 :Speed: STR_5445 :Speed STR_5446 :Get +STR_5447 :Type {STRINGID} +STR_5448 :Ride / Vehicle {STRINGID} diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index a1029e0da5..cc465584ef 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1550,6 +1550,9 @@ enum { STR_UP = 5375, STR_DOWN = 5376, + STR_OBJECTS_SORT_TYPE = 5447, + STR_OBJECTS_SORT_RIDE = 5448, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 5841106e57..3fd65d5b13 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -32,7 +32,6 @@ #include "../interface/themes.h" #include "dropdown.h" - enum { FILTER_RCT2 = (1 << 0), FILTER_WW = (1 << 1), @@ -95,10 +94,10 @@ enum WINDOW_STAFF_LIST_WIDGET_IDX { WIDX_TAB_9, // 12, 1000 WIDX_TAB_10, // 13, 2000 WIDX_TAB_11, // 14, 4000 - WIDX_DROPDOWN1, // 15, 8000 + WIDX_ADVANCED, // 15, 8000 WIDX_LIST, // 16, 10000 WIDX_PREVIEW, // 17, 20000 - WIDX_DROPDOWN2, // 18, 40000 + WIDX_INSTALL_TRACK, // 18, 40000 WIDX_FILTER_DROPDOWN, // 19, 80000 WIDX_FILTER_STRING_BUTTON, // 20, 100000 WIDX_FILTER_CLEAR_BUTTON, // 21, 200000 @@ -109,7 +108,9 @@ enum WINDOW_STAFF_LIST_WIDGET_IDX { WIDX_FILTER_RIDE_TAB_COASTER, WIDX_FILTER_RIDE_TAB_THRILL, WIDX_FILTER_RIDE_TAB_WATER, - WIDX_FILTER_RIDE_TAB_STALL + WIDX_FILTER_RIDE_TAB_STALL, + WIDX_LIST_SORT_TYPE, + WIDX_LIST_SORT_RIDE, }; static rct_widget window_editor_object_selection_widgets[] = { @@ -143,6 +144,8 @@ static rct_widget window_editor_object_selection_widgets[] = { { WWT_TAB, 1, 127, 157, 47, 73, 0x2000144E, 1226 }, { WWT_TAB, 1, 158, 188, 47, 73, 0x2000144E, 1227 }, { WWT_TAB, 1, 189, 219, 47, 73, 0x2000144E, 1228 }, + { WWT_13, 1, 4, 204, 80, 93, STR_NONE, STR_NONE }, + { WWT_13, 1, 205, 291, 80, 93, STR_NONE, STR_NONE }, { WIDGETS_END } }; @@ -200,6 +203,9 @@ static void* window_editor_object_selection_events[] = { #pragma endregion +const int window_editor_object_selection_animation_loops[] = { 20, 32, 10, 72, 24, 28, 16 }; +const int window_editor_object_selection_animation_divisor[] = { 4, 8, 2, 4, 4, 4, 2 }; + static void window_editor_object_set_page(rct_window *w, int page); static void window_editor_object_selection_set_pressed_tab(rct_window *w); static void window_editor_object_selection_select_default_objects(); @@ -219,13 +225,13 @@ static int sub_6AB211(); static rct_object_entry RequiredSelectedObjects[] = { // Objects that are always required - { 0x00000087, { "SCGTREES" }, 0 }, // Scenery: Trees - { 0x00000087, { "SCGSHRUB" }, 0 }, // Scenery: Shrubs and Ornaments - { 0x00000087, { "SCGGARDN" }, 0 }, // Scenery: Gardens - { 0x00000087, { "SCGFENCE" }, 0 }, // Scenery: Fences and Walls - { 0x00000087, { "SCGWALLS" }, 0 }, // Scenery: Walls and Roofs - { 0x00000087, { "SCGPATHX" }, 0 }, // Scenery: Signs and Items for Footpaths - { 0x00000085, { "TARMAC " }, 0 }, // Footpath: Tarmac + { 0x00000087, { "SCGTREES" }, 0 }, // Scenery: Trees + { 0x00000087, { "SCGSHRUB" }, 0 }, // Scenery: Shrubs and Ornaments + { 0x00000087, { "SCGGARDN" }, 0 }, // Scenery: Gardens + { 0x00000087, { "SCGFENCE" }, 0 }, // Scenery: Fences and Walls + { 0x00000087, { "SCGWALLS" }, 0 }, // Scenery: Walls and Roofs + { 0x00000087, { "SCGPATHX" }, 0 }, // Scenery: Signs and Items for Footpaths + { 0x00000085, { "TARMAC " }, 0 }, // Footpath: Tarmac }; static rct_object_entry DefaultSelectedObjects[] = { @@ -260,6 +266,10 @@ static rct_object_entry DefaultSelectedObjects[] = { { 0x00000087, { "SCGWATER" }, 0 } // Water Feature Themeing }; +enum { + RIDE_SORT_TYPE, + RIDE_SORT_RIDE +}; typedef struct { rct_object_entry *entry; @@ -267,8 +277,12 @@ typedef struct { uint8 *flags; } list_item; +typedef int (*sortFunc)(const void *, const void *); + static int _numListItems = 0; static list_item *_listItems = NULL; +static int _listSortType = RIDE_SORT_TYPE; +static bool _listSortDescending = false; static void visible_list_dispose() { @@ -276,7 +290,17 @@ static void visible_list_dispose() _numListItems = 0; } -static int visible_list_sort_ride_type(const void *rawA, const void *rawB) +static int visible_list_sort_ride_name(const void *rawA, const void *rawB) +{ + list_item *a = (list_item*)rawA; + list_item *b = (list_item*)rawB; + + const char *nameA = object_get_name(a->entry); + const char *nameB = object_get_name(b->entry); + return strcmp(nameA, nameB); +} + +static int visible_list_sort_ride_type(const void *rawA, const void *rawB) { list_item *a = (list_item*)rawA; list_item *b = (list_item*)rawB; @@ -287,9 +311,7 @@ static int visible_list_sort_ride_type(const void *rawA, const void *rawB) if (result != 0) return result; - const char *nameA = object_get_name(a->entry); - const char *nameB = object_get_name(b->entry); - return strcmp(nameA, nameB); + return visible_list_sort_ride_name(rawA, rawB); } static void visible_list_refresh(rct_window *w) @@ -321,11 +343,29 @@ static void visible_list_refresh(rct_window *w) _listItems = realloc(_listItems, _numListItems * sizeof(list_item)); - qsort(_listItems, _numListItems, sizeof(list_item), visible_list_sort_ride_type); + sortFunc sortFunc; + switch (_listSortType) { + case RIDE_SORT_TYPE: + sortFunc = visible_list_sort_ride_type; + break; + case RIDE_SORT_RIDE: + sortFunc = visible_list_sort_ride_name; + break; + } + qsort(_listItems, _numListItems, sizeof(list_item), sortFunc); + + if (_listSortDescending) { + for (int i = 0; i < _numListItems / 2; i++) { + int ri = _numListItems - i - 1; + list_item temp = _listItems[i]; + _listItems[i] = _listItems[ri]; + _listItems[ri] = temp; + } + } + + window_invalidate(w); } - - /** * * rct2: 0x006AA64E @@ -352,12 +392,14 @@ void window_editor_object_selection_open() window->widgets = window_editor_object_selection_widgets; window->enabled_widgets = - (1 << WIDX_DROPDOWN1) | - (1 << WIDX_DROPDOWN2) | + (1 << WIDX_ADVANCED) | + (1 << WIDX_INSTALL_TRACK) | (1 << WIDX_FILTER_DROPDOWN) | (1 << WIDX_FILTER_STRING_BUTTON) | (1 << WIDX_FILTER_CLEAR_BUTTON) | - (1 << WIDX_CLOSE); + (1 << WIDX_CLOSE) | + (1 << WIDX_LIST_SORT_TYPE) | + (1 << WIDX_LIST_SORT_RIDE); _filter_flags = FILTER_ALL; memset(_filter_string, 0, sizeof(_filter_string)); @@ -761,6 +803,7 @@ static void window_editor_object_selection_mouseup() case WIDX_FILTER_RIDE_TAB_ALL: _filter_flags |= 0x7E0; filter_update_counts(); + visible_list_refresh(w); w->selected_list_item = -1; w->var_494 = 0xFFFFFFFF; @@ -787,12 +830,12 @@ static void window_editor_object_selection_mouseup() window_invalidate(w); break; - case WIDX_DROPDOWN1: + case WIDX_ADVANCED: w->list_information_type ^= 1; window_invalidate(w); break; - case WIDX_DROPDOWN2: + case WIDX_INSTALL_TRACK: if (w->selected_list_item != -1) { w->selected_list_item = -1; object_free_scenario_text(); @@ -812,6 +855,24 @@ static void window_editor_object_selection_mouseup() window_invalidate(w); break; + case WIDX_LIST_SORT_TYPE: + if (_listSortType == RIDE_SORT_TYPE) { + _listSortDescending = !_listSortDescending; + } else { + _listSortType = RIDE_SORT_TYPE; + _listSortDescending = false; + } + visible_list_refresh(w); + break; + case WIDX_LIST_SORT_RIDE: + if (_listSortType == RIDE_SORT_RIDE) { + _listSortDescending = !_listSortDescending; + } else { + _listSortType = RIDE_SORT_RIDE; + _listSortDescending = false; + } + visible_list_refresh(w); + break; } } @@ -875,6 +936,7 @@ static void window_editor_object_selection_dropdown() filter_update_counts(); w->scrolls->v_top = 0; + visible_list_refresh(w); window_invalidate(w); break; } @@ -1044,14 +1106,14 @@ static void window_editor_object_selection_invalidate() w->widgets[WIDX_CLOSE].right = w->width - 3; w->widgets[WIDX_TAB_CONTENT_PANEL].right = w->width - 1; w->widgets[WIDX_TAB_CONTENT_PANEL].bottom = w->height - 1; - w->widgets[WIDX_DROPDOWN1].left = w->width - 130; - w->widgets[WIDX_DROPDOWN1].right = w->width - 9; + w->widgets[WIDX_ADVANCED].left = w->width - 130; + w->widgets[WIDX_ADVANCED].right = w->width - 9; w->widgets[WIDX_LIST].right = w->width - 309; w->widgets[WIDX_LIST].bottom = w->height - 14; w->widgets[WIDX_PREVIEW].left = w->width - 209; w->widgets[WIDX_PREVIEW].right = w->width - 96; - w->widgets[WIDX_DROPDOWN2].left = w->width - 216; - w->widgets[WIDX_DROPDOWN2].right = w->width - 130; + w->widgets[WIDX_INSTALL_TRACK].left = w->width - 216; + w->widgets[WIDX_INSTALL_TRACK].right = w->width - 130; w->widgets[WIDX_FILTER_DROPDOWN].left = w->width - 250; w->widgets[WIDX_FILTER_DROPDOWN].right = w->width - 137; @@ -1059,24 +1121,24 @@ static void window_editor_object_selection_invalidate() w->pressed_widgets |= 1 << WIDX_PREVIEW; window_editor_object_selection_set_pressed_tab(w); if (w->list_information_type & 1) - w->pressed_widgets |= (1 << WIDX_DROPDOWN1); + w->pressed_widgets |= (1 << WIDX_ADVANCED); else - w->pressed_widgets &= ~(1 << WIDX_DROPDOWN1); + w->pressed_widgets &= ~(1 << WIDX_ADVANCED); // Set window title and buttons RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, rct_string_id) = STR_OBJECT_SELECTION_RIDE_VEHICLES_ATTRACTIONS + w->selected_tab; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { w->widgets[WIDX_TITLE].image = STR_TRACK_DESIGNS_MANAGER_SELECT_RIDE_TYPE; w->widgets[WIDX_CLOSE].type = WWT_EMPTY; - w->widgets[WIDX_DROPDOWN2].type = WWT_DROPDOWN_BUTTON; + w->widgets[WIDX_INSTALL_TRACK].type = WWT_DROPDOWN_BUTTON; } else if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) { w->widgets[WIDX_TITLE].image = STR_ROLLER_COASTER_DESIGNER_SELECT_RIDE_TYPES_VEHICLES; w->widgets[WIDX_CLOSE].type = WWT_CLOSEBOX; - w->widgets[WIDX_DROPDOWN2].type = WWT_EMPTY; + w->widgets[WIDX_INSTALL_TRACK].type = WWT_EMPTY; } else { w->widgets[WIDX_TITLE].image = STR_OBJECT_SELECTION; w->widgets[WIDX_CLOSE].type = WWT_CLOSEBOX; - w->widgets[WIDX_DROPDOWN2].type = WWT_EMPTY; + w->widgets[WIDX_INSTALL_TRACK].type = WWT_EMPTY; } // Align tabs, hide advanced ones @@ -1095,13 +1157,13 @@ static void window_editor_object_selection_invalidate() } if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_MANAGER | SCREEN_FLAGS_TRACK_DESIGNER)) { - w->widgets[WIDX_DROPDOWN1].type = WWT_EMPTY; + w->widgets[WIDX_ADVANCED].type = WWT_EMPTY; w->widgets[WIDX_FILTER_DROPDOWN].type = WWT_EMPTY; for (i = 1; i < WINDOW_OBJECT_SELECTION_PAGE_COUNT; i++) w->widgets[WIDX_TAB_1 + i].type = WWT_EMPTY; x = 150; } else { - w->widgets[WIDX_DROPDOWN1].type = WWT_DROPDOWN_BUTTON; + w->widgets[WIDX_ADVANCED].type = WWT_DROPDOWN_BUTTON; w->widgets[WIDX_FILTER_DROPDOWN].type = WWT_DROPDOWN_BUTTON; x = 300; } @@ -1109,11 +1171,15 @@ static void window_editor_object_selection_invalidate() w->widgets[WIDX_LIST].right = w->width - (600 - 587) - x; w->widgets[WIDX_PREVIEW].left = w->width - (600 - 537) - (x / 2); w->widgets[WIDX_PREVIEW].right = w->widgets[WIDX_PREVIEW].left + 113; + w->widgets[WIDX_FILTER_RIDE_TAB_FRAME].right = w->widgets[WIDX_LIST].right; bool ridePage = (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS); - w->widgets[WIDX_LIST].top = (ridePage ? 94 : 60); + w->widgets[WIDX_LIST].top = (ridePage ? 118 : 60); + w->widgets[WIDX_FILTER_STRING_BUTTON].right = w->widgets[WIDX_LIST].right - 77; w->widgets[WIDX_FILTER_STRING_BUTTON].top = (ridePage ? 80 : 46); w->widgets[WIDX_FILTER_STRING_BUTTON].bottom = (ridePage ? 91 : 57); + w->widgets[WIDX_FILTER_CLEAR_BUTTON].left = w->widgets[WIDX_LIST].right - 73; + w->widgets[WIDX_FILTER_CLEAR_BUTTON].right = w->widgets[WIDX_LIST].right; w->widgets[WIDX_FILTER_CLEAR_BUTTON].top = (ridePage ? 80 : 46); w->widgets[WIDX_FILTER_CLEAR_BUTTON].bottom = (ridePage ? 91 : 57); @@ -1134,13 +1200,24 @@ static void window_editor_object_selection_invalidate() w->widgets[WIDX_FILTER_RIDE_TAB_FRAME].type = WWT_IMGBTN; for (int i = WIDX_FILTER_RIDE_TAB_ALL; i <= WIDX_FILTER_RIDE_TAB_STALL; i++) w->widgets[i].type = WWT_TAB; - } - else { + + w->widgets[WIDX_LIST_SORT_TYPE].type = WWT_13; + w->widgets[WIDX_LIST_SORT_TYPE].top = w->widgets[WIDX_FILTER_STRING_BUTTON].bottom + 3; + w->widgets[WIDX_LIST_SORT_TYPE].bottom = w->widgets[WIDX_LIST_SORT_TYPE].top + 13; + w->widgets[WIDX_LIST_SORT_RIDE].type = WWT_13; + w->widgets[WIDX_LIST_SORT_RIDE].top = w->widgets[WIDX_LIST_SORT_TYPE].top; + w->widgets[WIDX_LIST_SORT_RIDE].bottom = w->widgets[WIDX_LIST_SORT_TYPE].bottom; + w->widgets[WIDX_LIST_SORT_RIDE].right = w->widgets[WIDX_LIST].right; + w->widgets[WIDX_LIST].top = w->widgets[WIDX_LIST_SORT_TYPE].bottom + 2; + } else { w->enabled_widgets &= ~((1 << WIDX_FILTER_RIDE_TAB_ALL) | (1 << WIDX_FILTER_RIDE_TAB_TRANSPORT) | (1 << WIDX_FILTER_RIDE_TAB_GENTLE) | (1 << WIDX_FILTER_RIDE_TAB_COASTER) | (1 << WIDX_FILTER_RIDE_TAB_THRILL) | (1 << WIDX_FILTER_RIDE_TAB_WATER) | (1 << WIDX_FILTER_RIDE_TAB_STALL)); for (int i = WIDX_FILTER_RIDE_TAB_FRAME; i <= WIDX_FILTER_RIDE_TAB_STALL; i++) w->widgets[i].type = WWT_EMPTY; + + w->widgets[WIDX_LIST_SORT_TYPE].type = WWT_EMPTY; + w->widgets[WIDX_LIST_SORT_RIDE].type = WWT_EMPTY; } } @@ -1185,18 +1262,28 @@ static void window_editor_object_selection_paint() gfx_draw_sprite(dpi, 5458 + i, x, y, 0); } - const int ride_tabs[] = { 5458, 0x200015A1, 5542, 0x200015AA, 5557 + 5, 5551, 5530, 5327 }; + const int ride_tabs[] = { 5458, 0x200015A1, 5542, 0x200015AA, 5557, 5551, 5530, 5327 }; + const int ThrillRidesTabAnimationSequence[] = { + 5, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0 + }; // Draw ride tabs if (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS) { for (i = 0; i < 7; i++) { - widget = &w->widgets[WIDX_FILTER_RIDE_TAB_ALL + i]; + widget = &w->widgets[WIDX_FILTER_RIDE_TAB_ALL + i]; if (widget->type == WWT_EMPTY) continue; + int spriteIndex = ride_tabs[i]; + int frame = 0; + if (w->pressed_widgets & (1ULL << (WIDX_FILTER_RIDE_TAB_ALL + i))) { + frame = w->frame_no / window_editor_object_selection_animation_divisor[i - 1]; + } + spriteIndex += (i == 4 ? ThrillRidesTabAnimationSequence[frame] : frame); + x = w->x + widget->left; y = w->y + widget->top; - gfx_draw_sprite(dpi, ride_tabs[i] | (w->colours[1] << 19), x, y, 0); + gfx_draw_sprite(dpi, spriteIndex | (w->colours[1] << 19), x, y, 0); } } @@ -1249,6 +1336,18 @@ static void window_editor_object_selection_paint() w->x + window_editor_object_selection_widgets[WIDX_FILTER_STRING_BUTTON].right );*/ + // Draw sort button text + widget = &w->widgets[WIDX_LIST_SORT_TYPE]; + if (widget->type != WWT_EMPTY) { + stringId = _listSortType == RIDE_SORT_TYPE ? (_listSortDescending ? STR_DOWN : STR_UP) : STR_NONE; + gfx_draw_string_left_clipped(dpi, STR_OBJECTS_SORT_TYPE, &stringId, w->colours[1], w->x + widget->left + 1, w->y + widget->top + 1, widget->right - widget->left); + } + widget = &w->widgets[WIDX_LIST_SORT_RIDE]; + if (widget->type != WWT_EMPTY) { + stringId = _listSortType == RIDE_SORT_RIDE ? (_listSortDescending ? STR_DOWN : STR_UP) : STR_NONE; + gfx_draw_string_left_clipped(dpi, STR_OBJECTS_SORT_RIDE, &stringId, w->colours[1], w->x + widget->left + 1, w->y + widget->top + 1, widget->right - widget->left); + } + if (w->selected_list_item == -1 || stex_entry == NULL) return; @@ -1356,6 +1455,8 @@ static void window_editor_object_selection_scrollpaint() window_scrollpaint_get_registers(w, dpi, scrollIndex); + bool ridePage = (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS); + colour = RCT2_ADDRESS(0x0141FC48, uint8)[w->colours[1] * 8]; colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; gfx_clear(dpi, colour); @@ -1401,11 +1502,12 @@ static void window_editor_object_selection_scrollpaint() RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = 224; } - // Draw ride type - strcpy(buffer, language_get_string(2 + listItem->filter->ride.ride_type)); - gfx_draw_string(dpi, bufferWithColour, colour, x, y); - - x += 200; + if (ridePage) { + // Draw ride type + strcpy(buffer, language_get_string(2 + listItem->filter->ride.ride_type)); + gfx_draw_string(dpi, bufferWithColour, colour, x, y); + x = w->widgets[WIDX_LIST_SORT_RIDE].left - w->widgets[WIDX_LIST].left; + } // Draw text strcpy(buffer, object_get_name(listItem->entry)); @@ -1431,6 +1533,16 @@ static void window_editor_object_set_page(rct_window *w, int page) w->var_494 = 0xFFFFFFFF; w->scrolls[0].v_top = 0; object_free_scenario_text(); + + if (page == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS) { + _listSortType = RIDE_SORT_TYPE; + _listSortDescending = false; + } else { + _listSortType = RIDE_SORT_RIDE; + _listSortDescending = false; + } + + visible_list_refresh(w); window_invalidate(w); } @@ -1893,6 +2005,18 @@ static void window_editor_object_selection_update(rct_window *w) window_update_textbox_caret(); widget_invalidate(w, WIDX_FILTER_STRING_BUTTON); } + + for (int i = WIDX_FILTER_RIDE_TAB_TRANSPORT; i <= WIDX_FILTER_RIDE_TAB_STALL; i++) { + if (!(w->pressed_widgets & (1ULL << i))) + continue; + + w->frame_no++; + if (w->frame_no >= window_editor_object_selection_animation_loops[i - WIDX_FILTER_RIDE_TAB_TRANSPORT]) + w->frame_no = 0; + + widget_invalidate(w, i); + break; + } } static void window_editor_object_selection_textinput() @@ -1922,6 +2046,7 @@ static void window_editor_object_selection_textinput() w->scrolls->v_top = 0; + visible_list_refresh(w); window_invalidate(w); } From 7527a74d7db2358467f73c244934ce9df11d3e58 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 26 Jun 2015 04:00:19 +0100 Subject: [PATCH 0108/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 185 +++++++++++++++++++++++------------ data/language/english_us.txt | 137 +++++++++++++++++++------- data/language/german.txt | 139 +++++++++++++++++++------- 3 files changed, 330 insertions(+), 131 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index a9b0fef910..bc5d1937eb 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -510,31 +510,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 : -STR_0513 : -STR_0514 :Treinen hangen onder de baan en zwaaien naar buiten in de bochten -STR_0515 : -STR_0516 :Een rustige achtbaan voor bezoekers die nog niet in engere attracties durven -STR_0517 :Passagiers rijden in miniatuurtreinen over een smalspoorweg -STR_0518 :Passagiers rijden in elektrische treinen over een monorailbaan -STR_0519 :Passagiers zitten in kleine karretjes die onder een enkele rail hangen en naar buiten zwaaien in de bochten -STR_0520 : -STR_0521 : -STR_0522 : -STR_0523 :Bezoekers rijden langzaam over een baan in aangedreven karretjes +STR_0512 :Een compacte achtbaan met een spiraalvormige kettingheuvel en soepele, kronkelende afdalingen. +STR_0513 :Een achtbaan met loopings waar de passagiers in de karretjes staan. +STR_0514 :Treinen hangen onder de baan en zwaaien naar buiten in de bochten. +STR_0515 :Een stalen achtbaan met treinen die onder de baan hangen, met veel complexe en kronkelende baanelementen. +STR_0516 :Een rustige achtbaan voor bezoekers die nog niet in engere attracties durven. +STR_0517 :Passagiers rijden in miniatuurtreinen over een smalspoorweg. +STR_0518 :Passagiers rijden in elektrische treinen over een monorailbaan. +STR_0519 :Passagiers zitten in kleine karretjes die onder een enkele rail hangen en naar buiten zwaaien in de bochten. +STR_0520 :Een aanlegsteiger waar bezoekers in een bootje kunnen gaan om over het water te varen. +STR_0521 :Een intense, snelle en kronkelende achtbaan met scherpe bochten en afdalingen. +STR_0522 :Een kleinere achtbaan waar de passagiers boven de baan en op het karretje zitten. +STR_0523 :Bezoekers rijden langzaam over een baan in aangedreven karretjes. STR_0524 : -STR_0525 : -STR_0526 : -STR_0527 :Een soepele stalen achtbaan die verticale loopings kan maken -STR_0528 : -STR_0529 : -STR_0530 :Stoeltjes hangen aan een continu draaiende stalen kabel die van het ene uiteinde van de baan naar het andere loopt, en daarna weer terug -STR_0531 : +STR_0525 :Passagiers rijden over een kronkelende baan, waarbij ze enkel worden geleid door de ronding en banking van de halfronde baan. +STR_0526 :Een vrijvalwagen wordt pneumatisch langs een hoge stalen toren gelanceerd en gaat daarna in een vrije val weer naar beneden. +STR_0527 :Een soepele stalen achtbaan die verticale loopings kan maken. +STR_0528 :Passagiers varen in opblaasboten door een kronkelende halfopen of compleet gesloten glijbaan. +STR_0529 :Achtbaantreinen in de vorm van een mijntrein razen over stalen achtbaanrails die er uitziet als een oude spoorbaan. +STR_0530 :Stoeltjes hangen aan een continu draaiende stalen kabel die van het ene uiteinde van de baan naar het andere loopt, en daarna weer terug. +STR_0531 :Een compacte stalen achtbaan waar de trein door schroeven en loopings gaat. STR_0532 : STR_0533 : -STR_0534 : -STR_0535 : -STR_0536 : +STR_0534 :Go-karts met benzinemotor die de passagiers zelf besturen +STR_0535 :Boten in de vorm van een boomstam varen door een waterbak, waarbij ze van steile hellingen afdalen om de passagiers te doorweken. +STR_0536 :Ronde boten varen door een brede waterbak, waarbij ze de passagiers opwinden door watervallen en schuimende stroomversnellingen. STR_0537 : STR_0538 : STR_0539 : @@ -552,55 +552,55 @@ STR_0550 : STR_0551 : STR_0552 : STR_0553 : -STR_0554 :Het karretje wordt het station uitgelanceerd over een lange rechte baan door middel van lineaire inductiemotoren, om daarna recht omhoog te gaan en weer terug te vallen richting het station -STR_0555 : -STR_0556 : +STR_0554 :Het karretje wordt het station uitgelanceerd over een lange rechte baan door middel van lineaire inductiemotoren, om daarna recht omhoog te gaan en weer terug te vallen richting het station. +STR_0555 :Bezoekers gaan in een lift in een toren omhoog of omlaag om naar een ander hoogteniveau te komen. +STR_0556 :Extra brede karretjes gaan door over compleet verticale baan voor een ultimate vrijevalbeleving. STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 : -STR_0563 :Bezoekers zitten in comfortabele treinen met enkel een schootbeugel en gaan soepel door grote afdalingen en kronkelende stukken baan, met veel 'airtime' in de heuvels -STR_0564 :Deze over een houten baan lopende achtbaan is snel, ruw, luidruchting en geeft het gevoel van controleverlies met veel 'airtime' -STR_0565 :Een simpele houten achtbaan die enkel in staat is rustige hellingen en bochten te bedwingen, de karretjes worden enkel op de baan gehouden door middel van zijfrictiewielen en zwaartekracht -STR_0566 :Losse karretjes rijden over een kronkelende baan met scherpe bochten en korte felle afdalingen -STR_0567 :Bezoekers zitten in stoelen aan beide kanten van de baan, en draaien alle kanten op terwijl ze door diepe afdalingen en diverse omkeringen gaan +STR_0562 :Aangedreven karretjes rijden langs eng decor en special effects over een baan met hoogteverschillen. +STR_0563 :Bezoekers zitten in comfortabele treinen met enkel een schootbeugel en gaan soepel door grote afdalingen en kronkelende stukken baan, met veel 'airtime' in de heuvels. +STR_0564 :Deze over een houten baan lopende achtbaan is snel, ruw, luidruchting en geeft het gevoel van controleverlies met veel 'airtime'. +STR_0565 :Een simpele houten achtbaan die enkel in staat is rustige hellingen en bochten te bedwingen, de karretjes worden enkel op de baan gehouden door middel van zijfrictiewielen en zwaartekracht. +STR_0566 :Losse karretjes rijden over een kronkelende baan met scherpe bochten en korte felle afdalingen. +STR_0567 :Bezoekers zitten in stoelen aan beide kanten van de baan, en draaien alle kanten op terwijl ze door diepe afdalingen en diverse omkeringen gaan. STR_0568 : -STR_0569 :Bezoekers hangen in treinen onder de baan met enkel schouderbeugels en krijgen zo de ervaring dat ze vliegen +STR_0569 :Bezoekers hangen in treinen onder de baan met enkel schouderbeugels en krijgen zo de ervaring dat ze vliegen. STR_0570 : -STR_0571 : -STR_0572 : -STR_0573 : -STR_0574 : -STR_0575 :Aangedreven treinen hangen aan een enkele rail en vervoeren mensen door het park heen +STR_0571 :Ronde karretjes gaan over een zigzaggende houten baan en draaien daarbij rond. +STR_0572 :Boten met een hoge capaciteit varen door een brede waterbak, worden naar boven vervoerd door een lopende band, en gaan met hoge snelheid steile heuvels af om met een grote plons de passagiers te doorweken. +STR_0573 :Aangedreven karretjes in de vorm van een helicopter rijden over een stalen baan, bestuurd door het trappen van de passagiers. +STR_0574 :Passagiers worden door middel van een speciale beugel in een liggende positie vastgehouden, waarna ze op hun rug of met hun gezicht naar de grond door kronkelende stukken baan en omkeringen heen gaan. +STR_0575 :Aangedreven treinen hangen aan een enkele rail en vervoeren mensen door het park heen. STR_0576 : -STR_0577 : -STR_0578 :Karretjes rijden in een baan omgeven door hoepels en gaan door steile afdalingen en heartline-twists +STR_0577 :Karrtjes met draaistellen rijden op een houten baan en kunnen omkeren op speciale stukken baan. +STR_0578 :Karretjes rijden in een baan omgeven door hoepels en gaan door steile afdalingen en heartline-twists. STR_0579 : -STR_0580 : -STR_0581 : +STR_0580 :Een gigantische stalen achtbaan die in staat is tot soepele afdalingen en heuvels die hoger zijn dan 90 meter. +STR_0581 :Een ring van stoelen wordt naar de bovenkant van een hoge toren getrokken terwijl hij rustig ronddraait, waarna hij losgelaten wordt in een vrije val, waarna hij beneden rustig wordt afgeremd door middel van magnetische remmen. STR_0582 : STR_0583 : -STR_0584 : -STR_0585 : -STR_0586 :Bootvormige karretjes rijden over achtbaanrails, waardoor ze hellende bochten en diepe afdalingen kunnen maken, waarna ze in bakken water neerplonzen en rustig een stukje kunnen varen -STR_0587 : -STR_0588 : +STR_0584 :Speciale fietsen rijden over een stalen monorail, voortbewogen door het trappen van de passagiers. +STR_0585 :Passagiers zitten in stoelparen die onder de baan hangen terwijl ze door kronkelende en scherpe omkeringen gaan. +STR_0586 :Bootvormige karretjes rijden over achtbaanrails, waardoor ze hellende bochten en diepe afdalingen kunnen maken, waarna ze in bakken water neerplonzen en rustig een stukje kunnen varen. +STR_0587 :Na een enerverende pneumatische lancering rijdt de trein met hogere snelheid over een verticale baan, over de top, en vervolgens over de andere kant weer naar beneden om terug te keren naar het station. +STR_0588 :Losse karretjes hangen onder een zigzaggende baan met haarspeldbochten en scherpe afdalingen. STR_0589 : -STR_0590 : -STR_0591 : +STR_0590 :Passagiers rijden over een onderwaterparcours in onderzeeërs. +STR_0591 :Boten in de vorm van een vlot varen rustig door een waterbak. STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 : -STR_0599 :Een compacte achtbaan met individuele karretjes en steile, kronkelende afdalingen -STR_0600 : +STR_0598 :Omgekeerde achtbaantrein worden het station uit gelanceerd en gaan een verticale kronkelende baan op, waarna ze terugzakken, door het station heengaan en achteruit een ander stuk verticale baan opgaan. +STR_0599 :Een compacte achtbaan met individuele karretjes en steile, kronkelende afdalingen. +STR_0600 :Aangedreven mijntreinen rijden over een soepele en kronkelende baan. STR_0601 : -STR_0602 : +STR_0602 :Achtbaantreinen worden door lineaire inductiemotoren het station uit gelanceerd en razen door een kronkelende baan die vaak over de kop gaat. STR_0603 :Bezoeker {INT32} STR_0604 :Bezoeker {INT32} STR_0605 :Bezoeker {INT32} @@ -3449,7 +3449,7 @@ STR_3446 :Werkgebied wissen #Start van OpenRCT2-indices STR_5120 :'Financiën'-knop in de werkbalk tonen STR_5121 :'Onderzoek'-knop in de werkbalk tonen -STR_5122 :Alle voertuigen met hetzelfde baan-/attractietype tonen +STR_5122 :Attracties op baantype sorteren STR_5123 :Attr. vernieuwen STR_5124 :Six Flags weg STR_5125 :Afbreekbaar maken @@ -3496,7 +3496,7 @@ STR_5163 :Maand/dag/jaar STR_5164 :Twitch-kanaalnaam STR_5165 :Bezoekers namen van volgers geven STR_5166 :Geeft bezoekers namen van gebruikers die het Twitch-kanaal volgen. -STR_5167 :Bez. met Twitch-volgersnamen volgen in berichtengebied +STR_5167 :Bez. met Twitch-volgersnamen volgen in berichtengeb. STR_5168 :Zet het bezoekersvolgsysteem aan voor bezoekers die naar Twitch-volgers zijn genoemd. STR_5169 :Bez. namen van gebruikers in de Twitch-chat geven STR_5170 :Geeft bezoekers namen van gebruikers in de Twitch-chat. @@ -3507,15 +3507,15 @@ STR_5174 :Zal chatberichten op Twitch die beginnen met !news in het berichten STR_5175 :Voer de naam van je Twitch-kanaal in STR_5176 :Twitch-integratie inschakelen STR_5177 :Schermmodus: -STR_5178 :{SMALLFONT}{BLACK}Show financial cheats -STR_5179 :{SMALLFONT}{BLACK}Show guest cheats -STR_5180 :{SMALLFONT}{BLACK}Show park cheats -STR_5181 :{SMALLFONT}{BLACK}Show ride cheats +STR_5178 :{SMALLFONT}{BLACK}Cheats voor financiën +STR_5179 :{SMALLFONT}{BLACK}Cheats voor gasten +STR_5180 :{SMALLFONT}{BLACK}Cheats voor park +STR_5181 :{SMALLFONT}{BLACK}Cheats voor attracties STR_5182 :{INT32} STR_5183 :Basishoogte -STR_5184 :Enter base height between {COMMA16} and {COMMA16} +STR_5184 :Voer een basishoogte tussen {COMMA16} en {COMMA16} in STR_5185 :Waterniveau -STR_5186 :Enter water level between {COMMA16} and {COMMA16} +STR_5186 :Voer een waterniveau tussen {COMMA16} en {COMMA16} in STR_5187 :Financiën STR_5188 :Nieuwe advertentiecampagne STR_5189 :Onderzoek @@ -3706,3 +3706,68 @@ STR_5373 :Naam {STRINGID} STR_5374 :Datum {STRINGID} STR_5375 :{UP} STR_5376 :{DOWN} +STR_5377 :{SMALLFONT}{BLACK}Opgeslagen spellen +STR_5378 :{SMALLFONT}{BLACK}Script +STR_5379 :{SMALLFONT}{BLACK}Ga naar volgend Wacht-commando +STR_5380 :{SMALLFONT}{BLACK}Start het afspelen van de titelpresentatie +STR_5381 :{SMALLFONT}{BLACK}Stopt het afspelen van de titelpresentatie +STR_5382 :{SMALLFONT}{BLACK}Titelpresentatie herstarten +STR_5383 :{SMALLFONT}{BLACK}Een nieuwe titelpresentatie aanmaken die is gebaseerd op de huidige +STR_5384 :{SMALLFONT}{BLACK}Huidige titelpresentatie verwijderen +STR_5385 :{SMALLFONT}{BLACK}Huidige titelpresentatie hernoemen +STR_5386 :{SMALLFONT}{BLACK}Nieuw commando invoegen +STR_5387 :{SMALLFONT}{BLACK}Geselecteerd commando bewerken +STR_5388 :{SMALLFONT}{BLACK}Geselecteerd commando verwijderen +STR_5389 :{SMALLFONT}{BLACK}Naar geselecteerd commando titelpresentatie springen +STR_5390 :{SMALLFONT}{BLACK}Geselecteerd commando naar beneden verplaatsen +STR_5391 :{SMALLFONT}{BLACK}Geselecteerd commando naar boven verplaatsen +STR_5392 :{SMALLFONT}{BLACK}Opgeslagen spel aan titelpresentatie toevoegen +STR_5393 :{SMALLFONT}{BLACK}Geselecteerd opgeslagen spel uit titelpresentatie verwijderen +STR_5394 :{SMALLFONT}{BLACK}Opgeslagen spel hernoemen +STR_5395 :{SMALLFONT}{BLACK}Opgeslagen spel laden +STR_5396 :{SMALLFONT}{BLACK}Titelpresentatie herladen als ze buiten het spel om is aangepast +STR_5397 :Kan enkel in het titelscherm worden gebruikt +STR_5398 :Kan de titelpresentatie niet aanpassen wanneer deze wordt afgespeeld +STR_5399 :Klik op Stop om verder te gaan met aanpassen +STR_5400 :Kan deze titelpresentatie niet aanpassen +STR_5401 :Een nieuwe titelpresentatie aanmaken om wijzigingen aan te brengen +STR_5402 :Kan titelpresentatie niet laden +STR_5403 :Er is mogelijk geen Laad- or Wacht-commando of één van de opgeslagen spellen is mogelijk beschadigd +STR_5404 :Naam bestaat al +STR_5405 :Voer een naam in voor het opgeslagen spel +STR_5406 :Voer een naam in voor de titelpresentatie +STR_5407 :Toevoegen +STR_5408 :Verwijderen +STR_5409 :Invoegen +STR_5410 :Bewerken +STR_5411 :Herladen +STR_5412 :Spring naar +STR_5413 :Laad +STR_5414 :Laad{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :Laad{MOVE_X}{87}{STRING} +STR_5416 :Laad{MOVE_X}{87}Geen opgeslagen spel geselecteerd +STR_5417 :Locatie +STR_5418 :Locatie{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :Draai +STR_5420 :Draai{MOVE_X}{87}{COMMA16} +STR_5421 :Zoom +STR_5422 :Zoom{MOVE_X}{87}{COMMA16} +STR_5423 :Wacht +STR_5424 :Wacht{MOVE_X}{87}{COMMA16} +STR_5425 :Herstarten +STR_5426 :Einde +STR_5427 :Coördinaten: +STR_5428 :Aant. draaiingen tegen de klok: +STR_5429 :Zoomniveau: +STR_5430 :Te wachten seconden: +STR_5431 :Te laden opgeslagen spel: +STR_5432 :Commando: +STR_5433 :Titlepresentaties +STR_5434 :Commandobewerker +STR_5435 :Opgeslagen spel hernoemen +STR_5436 :Titelpresentaties bewerekn... +STR_5437 :Geen opgeslagen spel geselecteerd +STR_5438 :Kan geen wijzigingen aanbrengen wanneer de commandobewerker open is +STR_5439 :Er is een herstart gebruikt zonder Wacht-commando +STR_5440 :Volledig scherm minimaliseren bij focusverlies +STR_5441 :{SMALLFONT}{BLACK}Sorteert attracties per baantype,{NEWLINE}zodat achteraf wisselen van treintypes mogelijk{NEWLINE}wordt, zoals in RCT1. diff --git a/data/language/english_us.txt b/data/language/english_us.txt index d82fe466aa..8e5b3551cc 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 : -STR_0513 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :A looping roller coaster where the riders ride in a standing position STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners -STR_0515 : +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track STR_0518 :Passengers travel in electric trains along a monorail track STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners -STR_0520 : -STR_0521 : -STR_0522 : +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them STR_0523 :Riders travel slowly in powered vehicles along a track-based route STR_0524 : -STR_0525 : -STR_0526 : +STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops -STR_0528 : -STR_0529 : +STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again -STR_0531 : +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_0532 : STR_0533 : -STR_0534 : -STR_0535 : -STR_0536 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids STR_0537 : STR_0538 : STR_0539 : @@ -556,14 +556,14 @@ STR_0551 : STR_0552 : STR_0553 : STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station -STR_0555 : -STR_0556 : +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity @@ -572,38 +572,38 @@ STR_0567 :Sitting in seats suspended either side of the track, riders are pit STR_0568 : STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air STR_0570 : -STR_0571 : -STR_0572 : -STR_0573 : -STR_0574 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground STR_0575 :Powered trains hanging from a single rail transport people around the park STR_0576 : -STR_0577 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists STR_0579 : -STR_0580 : -STR_0581 : +STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes STR_0582 : STR_0583 : -STR_0584 : -STR_0585 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections -STR_0587 : -STR_0588 : +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops STR_0589 : -STR_0590 : -STR_0591 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track STR_0599 :A compact roller coaster with individual cars and smooth twisting drops -STR_0600 : +STR_0600 :Powered mine trains career along a smooth and twisted track layout STR_0601 : -STR_0602 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions STR_0603 :Guest {INT32} STR_0604 :Guest {INT32} STR_0605 :Guest {INT32} @@ -3458,7 +3458,7 @@ STR_3446 :Cancel Patrol Area # New strings, cleaner STR_5120 :Show finances button on toolbar STR_5121 :Show research button on toolbar -STR_5122 :Show all vehicles sharing a track/ride type +STR_5122 :Select rides by track type (like in RCT1) STR_5123 :Renew rides STR_5124 :No Six Flags STR_5125 :All destructable @@ -3711,3 +3711,72 @@ STR_5369 :Park parameters... STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. STR_5371 :Object Selection STR_5372 :Invert right mouse dragging +STR_5373 :Name {STRINGID} +STR_5374 :Date {STRINGID} +STR_5375 :{UP} +STR_5376 :{DOWN} +STR_5377 :{SMALLFONT}{BLACK}Saves +STR_5378 :{SMALLFONT}{BLACK}Script +STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command +STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence +STR_5381 :{SMALLFONT}{BLACK}Stop playing title sequence +STR_5382 :{SMALLFONT}{BLACK}Restart title sequence +STR_5383 :{SMALLFONT}{BLACK}Create a new title sequence based on the current one +STR_5384 :{SMALLFONT}{BLACK}Delete the current title sequence +STR_5385 :{SMALLFONT}{BLACK}Rename the current title sequence +STR_5386 :{SMALLFONT}{BLACK}Insert a new command +STR_5387 :{SMALLFONT}{BLACK}Edit the selected command +STR_5388 :{SMALLFONT}{BLACK}Delete the selected command +STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence +STR_5390 :{SMALLFONT}{BLACK}Move the selected command down +STR_5391 :{SMALLFONT}{BLACK}Move the selected command up +STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence +STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence +STR_5394 :{SMALLFONT}{BLACK}Rename the selected save +STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game +STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game +STR_5397 :Can only be used on the title screen +STR_5398 :Cannot edit title sequence while it's playing +STR_5399 :Press the stop button to continue editing +STR_5400 :Can't change this title sequence +STR_5401 :Create a new title sequence to make changes to +STR_5402 :Failed to load title sequence +STR_5403 :There may be no Load or Wait command or a save may be invalid +STR_5404 :Name already exists +STR_5405 :Enter a name for the save +STR_5406 :Enter a name for the title sequence +STR_5407 :Add +STR_5408 :Remove +STR_5409 :Insert +STR_5410 :Edit +STR_5411 :Reload +STR_5412 :Skip to +STR_5413 :Load +STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :Load{MOVE_X}{87}{STRING} +STR_5416 :Load{MOVE_X}{87}No save selected +STR_5417 :Location +STR_5418 :Location{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :Rotate +STR_5420 :Rotate{MOVE_X}{87}{COMMA16} +STR_5421 :Zoom +STR_5422 :Zoom{MOVE_X}{87}{COMMA16} +STR_5423 :Wait +STR_5424 :Wait{MOVE_X}{87}{COMMA16} +STR_5425 :Restart +STR_5426 :End +STR_5427 :Coordinates: +STR_5428 :Counter-clockwise rotations: +STR_5429 :Zoom level: +STR_5430 :Seconds to wait: +STR_5431 :Save to load: +STR_5432 :Command: +STR_5433 :Title Sequences +STR_5434 :Command Editor +STR_5435 :Rename save +STR_5436 :Edit Title Sequences... +STR_5437 :No save selected +STR_5438 :Can't make changes while command editor is open +STR_5439 :A restart is used without a wait command +STR_5440 :Minimize fullscreen on focus loss +STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. diff --git a/data/language/german.txt b/data/language/german.txt index 01864bc2dd..1da26e6c23 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 : -STR_0513 : +STR_0512 :Eine kompakte Stahlachterbahn mit einem Spirallifthügel und Wagen mit Sitzen in einer Reihe +STR_0513 :Eine Looping-Achterbahn, bei der sich die Fahrgäste in einer stehenden Position befinden STR_0514 :Die unterhalb der Schiene aufgehängten Züge schwingen in Kurven seitlich aus. -STR_0515 : +STR_0515 :Die Fahrgäste sind in Sitzen, die unter den Schienen hängen und durch riesige Schleifen, Kurven und große Gefälle rasen STR_0516 :Eine gemäßigte Achterbahn für Leute, die noch nicht den Mut für längere Bahnen haben STR_0517 :Die Fahrgäste sitzen in Miniaturzügen, die auf einer schmalen Schienenstrecke fahren STR_0518 :Die Passagiere fahren in elektrischen Zügen auf einer Einschienenstrecke STR_0519 :Die Fahrgäste sitzen in kleinen, an einer Einschienenstrecke aufgehängten Wagen, die in Kurven seitlich frei schwingen -STR_0520 : -STR_0521 : -STR_0522 : +STR_0520 :Die Fahrgäste können ihr persönliches Wasserfahrzeug über das Wasser steuern +STR_0521 :Kleine mausförmige Wagen fahren auf einer Holzstrecke, wobei sich die Wagen in Haarnadelkurven und steilen Senken neigen +STR_0522 :Eine kleinere Achterbahn, auf der die Passagiere über der Strecke sitzen, ohne von einem Wagen umgeben zu sein STR_0523 :Die Passagiere sitzen in langsam angetriebenen Wagen auf einer Schienenstrecke -STR_0524 : -STR_0525 : -STR_0526 : +STR_0524 :Der Freefall-Wagen wird mit Druckluft einen hohen Stahlturm hochgeschossen, von wo er dann im freien Fall nach unten saust +STR_0525 :Die Passagiere fahren, nur von der Krümmung und der seitlichen Neigung der halbkreisförmigen Strecke geführt, auf einer verdrehten Strecke +STR_0526 :Rotierende Aussichtskabine, die sich an einem hohen Turm hinauf bewegt STR_0527 :Eine gemäßigte Stahlachterbahn, bei der vertikale Schleifen möglich sind -STR_0528 : -STR_0529 : +STR_0528 :Die Passagiere fahren in Schlauchbooten eine sich windende, halbkreisförmige oder komplett in sich geschlossene Rohrstrecke herunter +STR_0529 :Minenachterbahnzüge fahren auf Stahlschienen, die so aussehen wie alte Zugschienen STR_0530 :Die Wagen hängen an einem Stahlseil, das durchgängig von einem Streckenende zum anderen und wieder zurück führt -STR_0531 : +STR_0531 :Eine kompakte Stahlachterbahn, bei der der Zug durch Schrauben und Schleifen fährt STR_0532 : STR_0533 : -STR_0534 : -STR_0535 : -STR_0536 : +STR_0534 :Selbstbetriebene Benzin-Go-Karts +STR_0535 :Baumstammförmige Boote fahren in einem Wasserkanal und rutschen steile Gefälle herunter, damit die Fahrgäste unten nass werden +STR_0536 :Runde Boote gleiten durch einen breiten Wasserkanal, zischen durch Wasserfälle und schäumende Stromschnellen STR_0537 : STR_0538 : STR_0539 : @@ -556,14 +556,14 @@ STR_0551 : STR_0552 : STR_0553 : STR_0554 :Der Wagen wird mit Hilfe von linearen Induktionsmotoren aus der Station entlang einer langen, ebenen Bahn beschleunigt und dann vertikal nach oben geschossen, von wo er wieder im freien Fall zur Station zurückzukehrt -STR_0555 : -STR_0556 : +STR_0555 :Die Besucher fahren in einem Aufzug einen Turm hinauf oder hinab, um in ein anderes Stockwerk zu gelangen +STR_0556 :Besonders breite Wagen fallen eine vollständige Vertikale herunter - das ultimative Erlebnis des freien Falls STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 : +STR_0562 :Angetriebene Wagen fahren auf einer mehrstöckigen Strecke mit gruseliger Landschaft und Spezialeffekten STR_0563 :Die Fahrgäste sitzen in komfortablen Wagen mit einfachen Beckenhalterungen, in denen sie gigantische, gemäßigte Gefälle erleben, aber auch viel Zeit oben `in der Luft' verbringen STR_0564 :Diese Holzachterbahn ist schnell, rauh, laut und gibt einem das Gefühl, außer Kontrolle zu sein, wobei man häufig `in der Luft' ist STR_0565 :Eine einfache Holzachterbahn mit nur leichten Gefällen und Kurven, bei der die Wagen nur mit Hilfe von seitlichen Führungsrollen und der Schwerkraft auf der Strecke gehalten werden @@ -572,38 +572,38 @@ STR_0567 :Die Passagiere befinden sich in Sitzen, die an beiden Seiten der Ba STR_0568 : STR_0569 :Die Passagiere, die in speziellen Vorrichtungen unter der Schiene fahren, haben das Gefühl zu fliegen, während sie durch die Lüfte sausen STR_0570 : -STR_0571 : -STR_0572 : -STR_0573 : -STR_0574 : +STR_0571 :Runde Wagen drehen sich auf der Zickzack-Holzstrecke +STR_0572 :Große Boote bewegen sich in einem breiten Wasserkanal, fahren von einem Fließband befördert Anstiege hoch und sausen steile Gefälle hinunter, damit die Fahrgäste mit einem gigantischen Platscher durchnässt werden +STR_0573 :Helikopterförmige Wagen fahren auf einer Stahlstrecke und werden von den Pedaltritten der Fahrer angetrieben +STR_0574 :Die Passagiere befinden sich in speziellen Haltevorrichtungen in liegender Position (entweder auf dem Rücken oder dem Bauch) und fahren auf einer gewundenen Strecke mit Überkopfteilen STR_0575 :Angetriebene Züge, die von einem einzelnen Gleis hängen, befördern die Fahrgäste durch den Park STR_0576 : -STR_0577 : +STR_0577 :Wagen mit Drehgestell fahren auf einer Holzstrecke und rotieren dabei auf speziellen Umkehrabschnitten STR_0578 :Die Wagen fahren auf einer Strecke mit kreisförmigen Reifen, steilen Gefällen und Heartline-Twists STR_0579 : -STR_0580 : -STR_0581 : +STR_0580 :Eine gigantische Stahlachterbahn mit gemäßigten Gefällen und Anstiegen von über 90 Meter +STR_0581 :Ein Ring mit Sitzen, der zur Spitze eines hohen Turms gezogen wird, während er sich leicht dreht, und dann im freien Fall heruntersaust, wobei er unten sanft von Magnetbremsen angehalten wird STR_0582 : STR_0583 : -STR_0584 : -STR_0585 : +STR_0584 :Spezielle Fahrräder fahren auf einer einschienigen Stahlstrecke und werden von den Passagieren angetrieben, indem sie in die Pedale treten +STR_0585 :Die Fahrgäste hängen in Sitzpaaren unter der Strecke und fahren Schleifen und Wendungen durch enge Kurven STR_0586 :Wagen in Bootsform laufen auf einer gewundenen Achterbahn mit steilen Gefällen, wobei sie in Wasserabschnitte klatschen, die in gemäßigtere Flussbereiche führen -STR_0587 : -STR_0588 : +STR_0587 :Nach einem atemberaubenden luftbetriebenen Start schnellt der Zug eine vertikale Strecke hoch, über die Spitze und auf der anderen Seite vertikal nach unten zurück zur Station +STR_0588 :Einzelne Wagen fahren unter einer Zickzack-Strecke mit Haarnadelkurven und steilen Gefällen STR_0589 : -STR_0590 : -STR_0591 : +STR_0590 :Die Fahrgäste fahren in einem U-Boot auf einer Unterwasserstrecke +STR_0591 :Floßförmige Boote winden sich sanft durch eine Flussstrecke STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 : +STR_0598 :Umgekehrte Achterbahnzüge werden aus der Station beschleunigt und rasen ein vertikales Streckenstück hinauf, sausen wieder hinab durch die Station und fahren einen anderen vertikalen Streckenabschnitt hinauf STR_0599 :Eine kompakte Achterbahn mit unabhängigen Wagen und gemäßigten, sich windenden Gefällen -STR_0600 : +STR_0600 :Angetriebene Minenzüge fahren auf einer gemäßigten und verwundenen Strecke STR_0601 : -STR_0602 : +STR_0602 :Achterbahnzüge werden aus der Station mit Hilfe von linearen Induktionsmotoren beschleunigt und rasen durch gewundene Überkopfteile STR_0603 :Besucher {INT32} STR_0604 :Besucher {INT32} STR_0605 :Besucher {INT32} @@ -3455,7 +3455,7 @@ STR_3446 :Patrouillenbereich verwerfen # New strings, cleaner STR_5120 :Finanzen in der Symbolleiste anzeigen STR_5121 :Forschung in der Symbolleiste anzeigen -STR_5122 :Fahrzeuge gleicher Strecke/Bahnart anzeigen +STR_5122 :Bahnen nach Streckentyp auswählen (wie in RCT1) STR_5123 :Bahnen erneuern STR_5124 :Keine Six Flags STR_5125 :Alles zerstörbar @@ -3508,7 +3508,7 @@ STR_5171 :Überwache Chat-Parkbesucher STR_5172 :{SMALLFONT}{BLACK}Überwachungsinformationen zu Parkbesuchern, die nach Twitch-Chatbenutzern benannt sind, einschalten - (Bei eingeschalteter Überwachung werden Besucheraktivitäten im Nachrichtenbereich angezeigt) STR_5173 :Erhalte Twitch-Chat als Spielnachrichten STR_5174 :{SMALLFONT}{BLACK}Benutzt Twitch-Chatnachrichten, welchen !news vorangestellt ist, für Spielbenachrichtigungen -STR_5175 :Name Ihres Twitch-Kanals eingeben: +STR_5175 :Namen Ihres Twitch-Kanals eingeben: STR_5176 :Twitch-Integration aktivieren STR_5177 :Vollbildmodus: STR_5178 :{SMALLFONT}{BLACK}Cheats für Finanzen anzeigen @@ -3573,7 +3573,7 @@ STR_5236 :Fenster: STR_5237 :Farbpalette: STR_5238 :Aktuelles Thema: STR_5239 :Duplizieren -STR_5240 :Name für Thema eingeben: +STR_5240 :Namen für Thema eingeben: STR_5241 :Dieses Thema kann nicht geändert werden STR_5242 :Dieser Themenname existiert bereits STR_5243 :Unzulässige Zeichen benutzt @@ -3710,3 +3710,68 @@ STR_5373 :Name {STRINGID} STR_5374 :Datum {STRINGID} STR_5375 :{UP} STR_5376 :{DOWN} +STR_5377 :{SMALLFONT}{BLACK}Gespeicherte Spiele +STR_5378 :{SMALLFONT}{BLACK}Skript +STR_5379 :{SMALLFONT}{BLACK}Zum nächsten `Warten'-Befehl springen +STR_5380 :{SMALLFONT}{BLACK}Titelsequenz abspielen +STR_5381 :{SMALLFONT}{BLACK}Titelsequenz stoppen +STR_5382 :{SMALLFONT}{BLACK}Titelsequenz neu starten +STR_5383 :{SMALLFONT}{BLACK}Neue Titelsequenz durch duplizieren der aktuellen Titelsequenz erstellen +STR_5384 :{SMALLFONT}{BLACK}Aktuelle Titelsequenz löschen +STR_5385 :{SMALLFONT}{BLACK}Aktuelle Titelsequenz umbenennen +STR_5386 :{SMALLFONT}{BLACK}Neuen Befehl einfügen +STR_5387 :{SMALLFONT}{BLACK}Ausgewählten Befehl bearbeiten +STR_5388 :{SMALLFONT}{BLACK}Ausgewählten Befehl löschen +STR_5389 :{SMALLFONT}{BLACK}Zum ausgewählten Befehl in{NEWLINE}der Titelsequenz springen +STR_5390 :{SMALLFONT}{BLACK}Ausgewählten Befehl nach oben verschieben +STR_5391 :{SMALLFONT}{BLACK}Ausgewählten Befehl nach unten verschieben +STR_5392 :{SMALLFONT}{BLACK}Einen Spielstand zur Titelsequenz hinzufügen +STR_5393 :{SMALLFONT}{BLACK}Ausgewählten Spielstand von{NEWLINE}Titelsequenz entfernen +STR_5394 :{SMALLFONT}{BLACK}Ausgewählten Spielstand umbenennen +STR_5395 :{SMALLFONT}{BLACK}Ausgewählten Spielstand laden +STR_5396 :{SMALLFONT}{BLACK}Titelsequenz neu laden, falls sie außerhalb des Spiels geändert wurde +STR_5397 :Kann nur im Titelbildschirm verwendet werden +STR_5398 :Titelsequenz kann, während sie läuft, nicht geändert werden +STR_5399 :Titelsequenz stoppen, um das Bearbeiten fortzusetzen +STR_5400 :Diese Titelsequenz kann nicht geändert werden +STR_5401 :Erstellen Sie eine neue Titelsequenz, um sie zu bearbeiten +STR_5402 :Titelsequenz konnte nicht geladen werden +STR_5403 :Möglicherweise kein `Laden'-Befehl, `Warten'-Befehl oder ein ungültiger Spielstand vorhanden +STR_5404 :Dieser Name existiert bereits +STR_5405 :Namen für Spielstand eingeben: +STR_5406 :Namen für Titelsequenz eingeben: +STR_5407 :Hinzufügen +STR_5408 :Entfernen +STR_5409 :Einfügen +STR_5410 :Bearbeiten +STR_5411 :Neu laden +STR_5412 :Springen zu +STR_5413 :Laden +STR_5414 :Laden{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :Laden{MOVE_X}{87}{STRING} +STR_5416 :Laden{MOVE_X}{87}Kein Spielstand ausgewählt +STR_5417 :Position +STR_5418 :Position{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :Drehen +STR_5420 :Drehen{MOVE_X}{87}{COMMA16} +STR_5421 :Zoom +STR_5422 :Zoom{MOVE_X}{87}{COMMA16} +STR_5423 :Warten +STR_5424 :Warten{MOVE_X}{87}{COMMA16} +STR_5425 :Neu starten +STR_5426 :Ende +STR_5427 :Koordinaten: +STR_5428 :Drehungen gegen Uhrzeigersinn: +STR_5429 :Zoomstufe: +STR_5430 :Zu wartende Sekunden: +STR_5431 :Zu ladender Spielstand: +STR_5432 :Befehl: +STR_5433 :Titelsequenzen +STR_5434 :Befehlseditor +STR_5435 :Spielstand umbenennen +STR_5436 :Titelsequenzen bearbeiten... +STR_5437 :Kein Spielstand ausgewählt +STR_5438 :Es können keine Änderungen vorgenommen werden, solange der Befehlseditor geöffnet ist +STR_5439 :Ein Neustart wird ohne `Warten'-Befehl verwendet +STR_5440 :Vollbild minimieren, wenn Spiel nicht im Vordergrund +STR_5441 :{SMALLFONT}{BLACK}Identifiziert Bahnen durch Streckentyp, sodass wie in RCT1 Fahrzeuge anschließend geändert werden können. Nur im Titelbildschirm auswählbar From d74885cc1813442aecd0a7a74d41a579b55fba82 Mon Sep 17 00:00:00 2001 From: Maikel Stuivenberg Date: Fri, 26 Jun 2015 17:01:50 +0200 Subject: [PATCH 0109/1173] show/hide UI #1402 --- data/language/english_uk.txt | 1 + src/config.c | 1 + src/config.h | 1 + src/interface/keyboard_shortcut.c | 15 +++++++++++++++ src/interface/viewport.h | 2 +- src/localisation/string_ids.h | 1 + 6 files changed, 20 insertions(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 0a2e5fd020..9ffd140a65 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3780,3 +3780,4 @@ STR_5443 :Speed{MOVE_X}{87}{STRINGID} STR_5444 :Speed: STR_5445 :Speed STR_5446 :Get +STR_5448 :Remove toolbar diff --git a/src/config.c b/src/config.c index 3fdde76f90..06523cf7ff 100644 --- a/src/config.c +++ b/src/config.c @@ -929,6 +929,7 @@ static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = { SDL_SCANCODE_1, // SHORTCUT_UNDERGROUND_VIEW_TOGGLE SDL_SCANCODE_H, // SHORTCUT_REMOVE_BASE_LAND_TOGGLE SDL_SCANCODE_V, // SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE + SDL_SCANCODE_T, // SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE SDL_SCANCODE_3, // SHORTCUT_SEE_THROUGH_RIDES_TOGGLE SDL_SCANCODE_4, // SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE SDL_SCANCODE_5, // SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE diff --git a/src/config.h b/src/config.h index 6f5a85b991..8f000f488c 100644 --- a/src/config.h +++ b/src/config.h @@ -44,6 +44,7 @@ enum { SHORTCUT_UNDERGROUND_VIEW_TOGGLE, SHORTCUT_REMOVE_BASE_LAND_TOGGLE, SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE, + SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, SHORTCUT_SEE_THROUGH_RIDES_TOGGLE, SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE, SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE, diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index c2e65483c2..cbb7936d55 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -228,6 +228,20 @@ static void shortcut_remove_vertical_land_toggle() toggle_view_flag(VIEWPORT_FLAG_HIDE_VERTICAL); } +static void shortcut_remove_top_bottom_toolbar_toggle() +{ + toggle_view_flag(VIEWPORT_FLAG_HIDE_TOP_BOTTOM_TOOLBAR); + + if (window_get_main()->viewport->flags & VIEWPORT_FLAG_HIDE_TOP_BOTTOM_TOOLBAR){ + window_close(window_find_by_class(WC_TOP_TOOLBAR)); + window_close(window_find_by_class(WC_BOTTOM_TOOLBAR)); + } + else { + window_top_toolbar_open(); + window_game_bottom_toolbar_open(); + } +} + static void shortcut_see_through_rides_toggle() { toggle_view_flag(VIEWPORT_FLAG_SEETHROUGH_RIDES); @@ -463,6 +477,7 @@ static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { shortcut_underground_view_toggle, shortcut_remove_base_land_toggle, shortcut_remove_vertical_land_toggle, + shortcut_remove_top_bottom_toolbar_toggle, shortcut_see_through_rides_toggle, shortcut_see_through_scenery_toggle, shortcut_invisible_supports_toggle, diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 429b91602e..f38f7adc33 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -41,7 +41,7 @@ enum { VIEWPORT_FLAG_HIDE_BASE = (1 << 12), VIEWPORT_FLAG_HIDE_VERTICAL = (1 << 13), VIEWPORT_FLAG_INVISIBLE_SPRITES = (1 << 14), - VIEWPORT_FLAG_15 = (1 << 15) + VIEWPORT_FLAG_HIDE_TOP_BOTTOM_TOOLBAR = (1 << 15), }; enum { diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index a1029e0da5..7190889aff 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -129,6 +129,7 @@ enum { STR_UNDERGROUND_VIEW = 939, STR_REMOVE_BASE_LAND = 940, STR_REMOVE_VERTICAL_FACES = 941, + STR_REMOVE_TOP_BOTTOM_BAR = 5448, STR_SEE_THROUGH_RIDES = 942, STR_SEE_THROUGH_SCENERY = 943, From 1f5fd4fe67a1f1c92c55af27a23c9d1c6ee4e672 Mon Sep 17 00:00:00 2001 From: Maikel Stuivenberg Date: Fri, 26 Jun 2015 17:26:29 +0200 Subject: [PATCH 0110/1173] Reorder shortcut --- src/config.c | 4 ++-- src/config.h | 2 +- src/interface/keyboard_shortcut.c | 6 ++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/config.c b/src/config.c index 06523cf7ff..75e9c1dde0 100644 --- a/src/config.c +++ b/src/config.c @@ -929,7 +929,6 @@ static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = { SDL_SCANCODE_1, // SHORTCUT_UNDERGROUND_VIEW_TOGGLE SDL_SCANCODE_H, // SHORTCUT_REMOVE_BASE_LAND_TOGGLE SDL_SCANCODE_V, // SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE - SDL_SCANCODE_T, // SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE SDL_SCANCODE_3, // SHORTCUT_SEE_THROUGH_RIDES_TOGGLE SDL_SCANCODE_4, // SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE SDL_SCANCODE_5, // SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE @@ -955,7 +954,8 @@ static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = { // New SDL_SCANCODE_MINUS, // SHORTCUT_REDUCE_GAME_SPEED, SDL_SCANCODE_EQUALS, // SHORTCUT_INCREASE_GAME_SPEED, - 0x0200 | 0x0400 | SDL_SCANCODE_C // SHORTCUT_OPEN_CHEAT_WINDOW, + 0x0200 | 0x0400 | SDL_SCANCODE_C, // SHORTCUT_OPEN_CHEAT_WINDOW, + SDL_SCANCODE_T, // SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, }; /** diff --git a/src/config.h b/src/config.h index 8f000f488c..8c70b4b64b 100644 --- a/src/config.h +++ b/src/config.h @@ -44,7 +44,6 @@ enum { SHORTCUT_UNDERGROUND_VIEW_TOGGLE, SHORTCUT_REMOVE_BASE_LAND_TOGGLE, SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE, - SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, SHORTCUT_SEE_THROUGH_RIDES_TOGGLE, SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE, SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE, @@ -71,6 +70,7 @@ enum { SHORTCUT_REDUCE_GAME_SPEED, SHORTCUT_INCREASE_GAME_SPEED, SHORTCUT_OPEN_CHEAT_WINDOW, + SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, SHORTCUT_COUNT }; diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index cbb7936d55..6aa94b916a 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -477,7 +477,6 @@ static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { shortcut_underground_view_toggle, shortcut_remove_base_land_toggle, shortcut_remove_vertical_land_toggle, - shortcut_remove_top_bottom_toolbar_toggle, shortcut_see_through_rides_toggle, shortcut_see_through_scenery_toggle, shortcut_invisible_supports_toggle, @@ -499,9 +498,12 @@ static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { shortcut_show_recent_messages, shortcut_show_map, shortcut_screenshot, + + //new shortcut_reduce_game_speed, shortcut_increase_game_speed, - shortcut_open_cheat_window + shortcut_open_cheat_window, + shortcut_remove_top_bottom_toolbar_toggle, }; #pragma endregion From 9ad21599a3dd54e5af4d40d84e9c822330d6ff70 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Fri, 26 Jun 2015 11:40:37 -0400 Subject: [PATCH 0111/1173] Decompiled top_toolbar tool events Also fixed bug with land rights tool gridlines --- src/interface/viewport.c | 2 ++ src/windows/park.c | 3 ++- src/windows/top_toolbar.c | 55 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index da47e8b24d..a8ea40fbbf 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -2170,6 +2170,7 @@ void show_gridlines() } } RCT2_GLOBAL(0x009E32B0, uint8)++; + printf("gridline_state: %i\n", RCT2_GLOBAL(0x009E32B0, uint8)); } /** @@ -2181,6 +2182,7 @@ void hide_gridlines() rct_window *mainWindow; RCT2_GLOBAL(0x009E32B0, uint8)--; + printf("gridline_state: %i\n", RCT2_GLOBAL(0x009E32B0, uint8)); if (RCT2_GLOBAL(0x009E32B0, uint8) == 0) { if ((mainWindow = window_get_main()) != NULL) { if (!gConfigGeneral.always_show_gridlines) { diff --git a/src/windows/park.c b/src/windows/park.c index 27318ce991..c22e6c127c 100644 --- a/src/windows/park.c +++ b/src/windows/park.c @@ -1176,7 +1176,8 @@ static void window_park_init_viewport(rct_window *w) void toggle_land_rights_window(rct_window *parkWindow, int widgetIndex) { - if ((RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == 1 && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) == 14) { + if ((RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == WC_PARK_INFORMATION && + RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) == WIDX_BUY_LAND_RIGHTS) { tool_cancel(); } else { diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index bf256a54a2..3ef453ca1c 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -178,6 +178,8 @@ static void window_top_toolbar_dropdown(); static void window_top_toolbar_tool_update(); static void window_top_toolbar_tool_down(); static void window_top_toolbar_tool_drag(); +static void window_top_toolbar_tool_up(); +static void window_top_toolbar_tool_abort(); static void window_top_toolbar_invalidate(); static void window_top_toolbar_paint(); @@ -194,8 +196,8 @@ static void* window_top_toolbar_events[] = { window_top_toolbar_tool_update, // editor: 0x0066fB0E window_top_toolbar_tool_down, // editor: 0x0066fB5C window_top_toolbar_tool_drag, // editor: 0x0066fB37 - (void*)0x0066CC5B, // editor: 0x0066fC44 - (void*)0x0066CA58, // editor: 0x0066fA74 + window_top_toolbar_tool_up, // editor: 0x0066fC44 (Exactly the same) + window_top_toolbar_tool_abort, // editor: 0x0066fA74 (Exactly the same) window_top_toolbar_emptysub, window_top_toolbar_emptysub, window_top_toolbar_emptysub, @@ -2723,6 +2725,55 @@ static void window_top_toolbar_tool_drag() } } +/** + * + * rct2: 0x0066CC5B + */ +static void window_top_toolbar_tool_up() +{ + short widgetIndex, x, y; + rct_window *w; + + window_tool_get_registers(w, widgetIndex, x, y); + + switch (widgetIndex) { + case WIDX_LAND: + map_invalidate_selection_rect(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= 0xFFFE; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8) = 0x12; + break; + case WIDX_WATER: + map_invalidate_selection_rect(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= 0xFFFE; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8) = 0x13; + break; + case WIDX_CLEAR_SCENERY: + map_invalidate_selection_rect(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= 0xFFFE; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8) = 0x0C; + break; + } +} + +/** + * + * rct2: 0x0066CA58 + */ +static void window_top_toolbar_tool_abort() +{ + short widgetIndex, x, y; + rct_window* w; + + window_tool_get_registers(w, widgetIndex, x, y); + + switch (widgetIndex) { + case WIDX_LAND: + case WIDX_WATER: + case WIDX_CLEAR_SCENERY: + hide_gridlines(); + break; + } +} void top_toolbar_init_fastforward_menu(rct_window* w, rct_widget* widget) { int num_items = 4; From 18008c2cc690ac4d66184216229ddb31dc530069 Mon Sep 17 00:00:00 2001 From: Maikel Stuivenberg Date: Fri, 26 Jun 2015 17:44:17 +0200 Subject: [PATCH 0112/1173] remove unneeded string --- data/language/english_uk.txt | 1 - src/localisation/string_ids.h | 1 - 2 files changed, 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 9ffd140a65..0a2e5fd020 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3780,4 +3780,3 @@ STR_5443 :Speed{MOVE_X}{87}{STRINGID} STR_5444 :Speed: STR_5445 :Speed STR_5446 :Get -STR_5448 :Remove toolbar diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 7190889aff..a1029e0da5 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -129,7 +129,6 @@ enum { STR_UNDERGROUND_VIEW = 939, STR_REMOVE_BASE_LAND = 940, STR_REMOVE_VERTICAL_FACES = 941, - STR_REMOVE_TOP_BOTTOM_BAR = 5448, STR_SEE_THROUGH_RIDES = 942, STR_SEE_THROUGH_SCENERY = 943, From c20b60652c3cc5fbbf43c46d9bbb50d9166e3ec0 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Fri, 26 Jun 2015 11:47:03 -0400 Subject: [PATCH 0113/1173] Removed printfs --- src/interface/viewport.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index a8ea40fbbf..da47e8b24d 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -2170,7 +2170,6 @@ void show_gridlines() } } RCT2_GLOBAL(0x009E32B0, uint8)++; - printf("gridline_state: %i\n", RCT2_GLOBAL(0x009E32B0, uint8)); } /** @@ -2182,7 +2181,6 @@ void hide_gridlines() rct_window *mainWindow; RCT2_GLOBAL(0x009E32B0, uint8)--; - printf("gridline_state: %i\n", RCT2_GLOBAL(0x009E32B0, uint8)); if (RCT2_GLOBAL(0x009E32B0, uint8) == 0) { if ((mainWindow = window_get_main()) != NULL) { if (!gConfigGeneral.always_show_gridlines) { From ab7e1da84e77c63584ca94b8a41e1882db3d469f Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Fri, 26 Jun 2015 17:45:38 +0100 Subject: [PATCH 0114/1173] Implemented object unload. Refactored calls to the function. No need to pass the object type. --- src/editor.c | 4 ++-- src/object.c | 14 ++++++++++++-- src/object.h | 2 +- src/object_list.c | 6 +++--- src/windows/editor_object_selection.c | 2 +- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/editor.c b/src/editor.c index 4e0f050764..25761f88cb 100644 --- a/src/editor.c +++ b/src/editor.c @@ -151,7 +151,7 @@ void editor_convert_save_to_scenario() rct_stex_entry* stex = g_stexEntries[0]; if ((int)stex != 0xFFFFFFFF) { - object_unload(0, &object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); + object_unload((rct_object_entry*)&object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); reset_loaded_objects(); format_string(s6Info->details, STR_NO_DETAILS_YET, NULL); @@ -501,7 +501,7 @@ static int editor_read_s6(const char *path) rct_stex_entry* stex = g_stexEntries[0]; if ((int)stex != 0xFFFFFFFF) { - object_unload(0, &object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); + object_unload((rct_object_entry*)&object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); reset_loaded_objects(); format_string(s6Info->details, STR_NO_DETAILS_YET, NULL); diff --git a/src/object.c b/src/object.c index 84004d2ac2..98e8fed918 100644 --- a/src/object.c +++ b/src/object.c @@ -333,9 +333,19 @@ int object_load_packed(FILE *file) * * rct2: 0x006A9CAF */ -void object_unload(int groupIndex, rct_object_entry_extended *entry) +void object_unload(rct_object_entry *entry) { - RCT2_CALLPROC_X(0x006A9CAF, 0, groupIndex, 0, 0, 0, 0, (int)entry); + uint8 object_type, object_index; + if (!find_object_in_entry_group(entry, &object_type, &object_index)){ + return; + } + + uint8* chunk = object_entry_groups[object_type].chunks[object_index]; + + object_paint(object_type, 1, 0, 0, 0, (int)chunk, 0, 0); + + rct2_free(chunk); + object_entry_groups[object_type].chunks[object_index] = (char*)-1; } int object_entry_compare(const rct_object_entry *a, const rct_object_entry *b) diff --git a/src/object.h b/src/object.h index cf5b735d61..83c07855b7 100644 --- a/src/object.h +++ b/src/object.h @@ -101,7 +101,7 @@ void object_unload_all(); int check_object_entry(rct_object_entry *entry); int object_load(int groupIndex, rct_object_entry *entry, int* chunk_size); int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSize, const rct_object_entry *installedObject); -void object_unload(int groupIndex, rct_object_entry_extended *entry); +void object_unload(rct_object_entry *entry); int object_get_scenario_text(rct_object_entry *entry); void object_free_scenario_text(); int object_get_length(rct_object_entry *entry); diff --git a/src/object_list.c b/src/object_list.c index d2a8dc5304..cb2e2834c6 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -576,7 +576,7 @@ void object_unload_all() for (i = 0; i < OBJECT_ENTRY_GROUP_COUNT; i++) for (j = 0; j < object_entry_group_counts[i]; j++) if (object_entry_groups[i].chunks[j] != (uint8*)0xFFFFFFFF) - object_unload(j, &object_entry_groups[i].entries[j]); + object_unload((rct_object_entry*)&object_entry_groups[i].entries[j]); reset_loaded_objects(); } @@ -727,7 +727,7 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in log_error("Incorrect number of vanilla RCT2 objects."); RCT2_GLOBAL(RCT2_ADDRESS_ORIGINAL_RCT2_OBJECT_COUNT, uint32)--; RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32)--; - object_unload(objectType, (rct_object_entry_extended*)entry); + object_unload(entry); return 0; } } @@ -788,7 +788,7 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in uint32 size_of_object = installed_entry_pointer - (uint8*)installed_entry; - object_unload(objectType, (rct_object_entry_extended*)entry); + object_unload(entry); return size_of_object; } diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index f69aa0ba1c..a3b1e05aa4 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -608,7 +608,7 @@ void unload_unselected_objects(){ for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ if (!(*selection_flags & OBJECT_SELECTION_FLAG_SELECTED)){ remove_selected_objects_from_research(installedObject); - object_unload(0, (rct_object_entry_extended*)installedObject); + object_unload(installedObject); } selection_flags++; installedObject = object_get_next(installedObject); From c00df00801dfbe0843fd69507362160cdf0fc9b9 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 27 Jun 2015 04:00:15 +0100 Subject: [PATCH 0115/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/german.txt | 85 ++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/data/language/german.txt b/data/language/german.txt index 1da26e6c23..0ad49e4e4f 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -1160,7 +1160,7 @@ STR_1155 :Höhenmarkierungen an Fußwegen STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} STR_1158 :Kann nicht entfernt werden... -STR_1159 :{SMALLFONT}{BLACK}Platzieren Sie Szenerien, Beete und andere Objekte +STR_1159 :{SMALLFONT}{BLACK}Platzieren Sie Szenerien, Beete und{NEWLINE}andere Objekte STR_1160 :{SMALLFONT}{BLACK}Seen & Wasseranlagen erstellen/anpassen STR_1161 :Kann hier nicht positioniert werden... STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} @@ -1709,7 +1709,7 @@ STR_1704 :Es kann kein neuer Mitarbeiter eingestellt werden... STR_1705 :{SMALLFONT}{BLACK}Diesen Mitarbeiter entlassen STR_1706 :{SMALLFONT}{BLACK}Diese Person an einen anderen Ort befördern STR_1707 :Zu viele Mitarbeiter im Spiel -STR_1708 :{SMALLFONT}{BLACK}Patrouillenbereich für diesen Mitarbeiter festlegen +STR_1708 :{SMALLFONT}{BLACK}Patrouillenbereich für diesen{NEWLINE}Mitarbeiter festlegen STR_1709 :Mitarbeiter entlassen STR_1710 :Ja STR_1711 :{WINDOW_COLOUR_1}Möchten Sie {STRINGID} wirklich entlassen? @@ -1791,7 +1791,7 @@ STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronautenkostüm STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Banditenkostüm STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriffkostüm STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Piratenkostüm -STR_1790 :{SMALLFONT}{BLACK}Uniformfarbe für diesen Mitarbeiter auswählen +STR_1790 :{SMALLFONT}{BLACK}Uniformfarbe für diesen{NEWLINE}Mitarbeiter auswählen STR_1791 :{WINDOW_COLOUR_2}Uniformfarbe: STR_1792 :Antwortet auf {STRINGID} -Störungsruf STR_1793 :Unterwegs zu {STRINGID} für eine Inspektion @@ -1817,16 +1817,16 @@ STR_1812 :{SMALLFONT}{BLACK}{STRINGID} STR_1813 :Verschiedene Objekte STR_1814 :Aktionen STR_1815 :Gedanken -STR_1816 :{SMALLFONT}{BLACK}Informationsart auswählen,{NEWLINE}die in Besucherliste angezeigt{NEWLINE}werden soll +STR_1816 :{SMALLFONT}{BLACK}Informationsart auswählen, die{NEWLINE}in Besucherliste angezeigt{NEWLINE}werden soll STR_1817 :({COMMA16}) STR_1818 :{WINDOW_COLOUR_2}Alle Besucher STR_1819 :{WINDOW_COLOUR_2}Alle Besucher (zusammengefasst) STR_1820 :{WINDOW_COLOUR_2}Besucher {STRINGID} STR_1821 :{WINDOW_COLOUR_2}Besucher denken {STRINGID} STR_1822 :{WINDOW_COLOUR_2}Besucher denken an {POP16}{STRINGID} -STR_1823 :{SMALLFONT}{BLACK}Gedanken der Besucher zu dieser Attraktion anzeigen +STR_1823 :{SMALLFONT}{BLACK}Gedanken der Besucher zu dieser{NEWLINE}Attraktion anzeigen STR_1824 :{SMALLFONT}{BLACK}Besucher dieser Attraktion anzeigen -STR_1825 :{SMALLFONT}{BLACK}Anstehende Besucher für diese Attraktion anzeigen +STR_1825 :{SMALLFONT}{BLACK}Anstehende Besucher für diese{NEWLINE}Attraktion anzeigen STR_1826 :Status STR_1827 :Popularität STR_1828 :Zufriedenheit @@ -1845,13 +1845,13 @@ STR_1840 :Ausfallzeit: {COMMA16}% STR_1841 :Gewinn: {CURRENCY2DP} pro Stunde STR_1842 :Favorit von: {COMMA16} Besucher STR_1843 :Favorit von: {COMMA16} Besuchern -STR_1844 :{SMALLFONT}{BLACK}Informationsart auswählen,{NEWLINE}die in Attraktionsliste angezeigt{NEWLINE}werden soll +STR_1844 :{SMALLFONT}{BLACK}Informationsart auswählen, die{NEWLINE}in Attraktionsliste angezeigt{NEWLINE}werden soll STR_1845 :{MONTHYEAR} STR_1846 :{COMMA16} Besucher STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} Besucher STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} Besucher STR_1849 :{WINDOW_COLOUR_2}Musikwiedergabe -STR_1850 :{SMALLFONT}{BLACK}Auswählen, ob Musik für diese Bahn abgespielt werden soll +STR_1850 :{SMALLFONT}{BLACK}Auswählen, ob Musik für diese{NEWLINE}Bahn abgespielt werden soll STR_1851 :{WINDOW_COLOUR_2}Betriebskosten: {BLACK}{CURRENCY2DP} pro Stunde STR_1852 :{WINDOW_COLOUR_2}Betriebskosten: {BLACK}Unbekannt STR_1853 :{WINDOW_COLOUR_2}Erbaut: {BLACK}Dieses Jahr @@ -1891,7 +1891,7 @@ STR_1886 :Inspektion bei {STRINGID} STR_1887 :{WINDOW_COLOUR_2}Letzte Inspektion vor: {BLACK}{COMMA16} Minuten STR_1888 :{WINDOW_COLOUR_2}Letzte Inspektion vor: {BLACK}mehr als 4 Stunden STR_1889 :{WINDOW_COLOUR_2}Ausfallzeit: {MOVE_X}{255}{BLACK}{COMMA16}% -STR_1890 :{SMALLFONT}{BLACK}Auswählen, wie oft ein Mechaniker diese Bahn überprüfen soll +STR_1890 :{SMALLFONT}{BLACK}Auswählen, wie oft ein Mechaniker{NEWLINE}diese Bahn überprüfen soll STR_1891 :Noch kein {STRINGID} im Park STR_1892 :RollerCoaster Tycoon 2 STR_1893 :Legen Sie die RollerCoaster Tycoon 2-CD in folgendes Laufwerk ein: @@ -1941,15 +1941,15 @@ STR_1936 :{STRINGID} hat {STRINGID} gekauft STR_1937 :{SMALLFONT}{BLACK}Informationen zum Thema dieser Nachricht anzeigen STR_1938 :{SMALLFONT}{BLACK}Ansicht des Besuchers anzeigen STR_1939 :{SMALLFONT}{BLACK}Ansicht des Mitarbeiters anzeigen -STR_1940 :{SMALLFONT}{BLACK}Vergnügen, Energie, Hunger, usw. dieses Besuchers anzeigen +STR_1940 :{SMALLFONT}{BLACK}Vergnügen, Energie, Hunger, usw.{NEWLINE}dieses Besuchers anzeigen STR_1941 :{SMALLFONT}{BLACK}Gefahrene Bahnen dieses Besuchers anzeigen -STR_1942 :{SMALLFONT}{BLACK}Finanzinformationen zu diesem Besucher anzeigen +STR_1942 :{SMALLFONT}{BLACK}Finanzinformationen zu diesem{NEWLINE}Besucher anzeigen STR_1943 :{SMALLFONT}{BLACK}Aktuelle Gedanken dieses Besuchers anzeigen -STR_1944 :{SMALLFONT}{BLACK}Objekte anzeigen, die der Besucher bei sich trägt +STR_1944 :{SMALLFONT}{BLACK}Objekte anzeigen, die der{NEWLINE}Besucher bei sich trägt STR_1945 :{SMALLFONT}{BLACK}Anweisungen und Optionen für diesen Mitarbeiter anzeigen STR_1946 :{SMALLFONT}{BLACK}Kostüm für diesen Animateur auswählen STR_1947 :{SMALLFONT}{BLACK}Vom Mitarbeitertyp abgelaufene{NEWLINE}Bereiche anzeigen und den nächsten{NEWLINE}Mitarbeiter suchen -STR_1948 :{SMALLFONT}{BLACK}Neuen Mitarbeiter für den ausgewählten Typ einstellen +STR_1948 :{SMALLFONT}{BLACK}Neuen Mitarbeiter für den ausgewählten{NEWLINE}Typ einstellen STR_1949 :Finanzübersicht STR_1950 :Finanzdiagramm STR_1951 :Verkehrswertdiagramm @@ -2459,17 +2459,17 @@ STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} - STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} - STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} - STR_2457 :{SMALLFONT}{BLACK}Finanzkonten anzeigen -STR_2458 :{SMALLFONT}{BLACK}Gelddiagramm (abzüglich Darlehen) im Zeitverlauf anzeigen -STR_2459 :{SMALLFONT}{BLACK}Verkehrswertdiagramm im Zeitverlauf anzeigen +STR_2458 :{SMALLFONT}{BLACK}Gelddiagramm (abzüglich Darlehen){NEWLINE}im Zeitverlauf anzeigen +STR_2459 :{SMALLFONT}{BLACK}Verkehrswertdiagramm im{NEWLINE}Zeitverlauf anzeigen STR_2460 :{SMALLFONT}{BLACK}Diagramm zu Wochengewinn anzeigen STR_2461 :{SMALLFONT}{BLACK}Marketingkampagnen anzeigen STR_2462 :{SMALLFONT}{BLACK}Ansicht von Parkeingang anzeigen -STR_2463 :{SMALLFONT}{BLACK}Parkbewertungsdiagramm im Zeitverlauf anzeigen -STR_2464 :{SMALLFONT}{BLACK}Besucherzahlendiagramm im Zeitverlauf anzeigen +STR_2463 :{SMALLFONT}{BLACK}Parkbewertungsdiagramm{NEWLINE}im Zeitverlauf anzeigen +STR_2464 :{SMALLFONT}{BLACK}Besucherzahlendiagramm{NEWLINE}im Zeitverlauf anzeigen STR_2465 :{SMALLFONT}{BLACK}Parkeintrittspreis und -informationen anzeigen STR_2466 :{SMALLFONT}{BLACK}Parkstatistiken anzeigen STR_2467 :{SMALLFONT}{BLACK}Ziele für dieses Spiel anzeigen -STR_2468 :{SMALLFONT}{BLACK}Aktuelle Auszeichnungen anzeigen, die dieser Park erhalten hat +STR_2468 :{SMALLFONT}{BLACK}Aktuelle Auszeichnungen anzeigen,{NEWLINE}die dieser Park erhalten hat STR_2469 :{SMALLFONT}{BLACK}Forschungs- & Entwicklungsgrad auswählen STR_2470 :{SMALLFONT}{BLACK}Nach neuen Transportbahnen forschen STR_2471 :{SMALLFONT}{BLACK}Nach neuen gemäßigten Bahnen forschen @@ -2478,7 +2478,7 @@ STR_2473 :{SMALLFONT}{BLACK}Nach neuen aufregenden Fahrten forschen STR_2474 :{SMALLFONT}{BLACK}Nach neuen Wasserbahnen forschen STR_2475 :{SMALLFONT}{BLACK}Nach neuen Läden und Ständen forschen STR_2476 :{SMALLFONT}{BLACK}Nach neuen Szenerien und Themen forschen -STR_2477 :{SMALLFONT}{BLACK}Betriebsmodus für diese Attraktion auswählen +STR_2477 :{SMALLFONT}{BLACK}Betriebsmodus für diese{NEWLINE}Attraktion auswählen STR_2478 :{SMALLFONT}{BLACK}Geschwindigkeitsdiagramm im Zeitverlauf anzeigen STR_2479 :{SMALLFONT}{BLACK}Höhendiagramm im Zeitverlauf anzeigen STR_2480 :{SMALLFONT}{BLACK}Diagramm der vertikalen Beschleunigung im Zeitverlauf anzeigen @@ -2795,9 +2795,9 @@ STR_2786 :{SMALLFONT}{BLACK}Klicken Sie auf die Kürzelbeschreibung, um eine STR_2787 :{WINDOW_COLOUR_2}Verkehrswert: {BLACK}{CURRENCY} STR_2788 :{WINDOW_COLOUR_2}Glückwunsch!{NEWLINE}{BLACK}Sie haben Ihr Ziel mit einem Firmenwert von {CURRENCY} erreicht! STR_2789 :{WINDOW_COLOUR_2}Sie haben Ihr Ziel nicht erreicht! -STR_2790 :Geben Sie einen Namen in das Szenariodiagramm ein +STR_2790 :Namen für die Szenarioübers. eingeben STR_2791 :Namen eingeben -STR_2792 :Geben Sie Ihren Namen für das Szenariodiagramm ein: +STR_2792 :Namen für die Szenarioübersicht eingeben: STR_2793 :{SMALLFONT}(Durchgeführt von {STRINGID}) STR_2794 :{WINDOW_COLOUR_2}Durchgeführt von: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} mit einem Firmenwert von: {BLACK}{CURRENCY} STR_2795 :Sortieren @@ -3095,7 +3095,7 @@ STR_3086 :Abstrakter Eingang STR_3087 :Schnee-/Eis-Eingang STR_3088 :Pagodeneingang STR_3089 :Weltraumeingang -STR_3090 :{SMALLFONT}{BLACK}Wählen Sie Stil für den Eingang, Ausgang und die Station aus +STR_3090 :{SMALLFONT}{BLACK}Wählen Sie Stil für den Eingang,{NEWLINE}Ausgang und die Station aus STR_3091 :Sie dürfen diesen Abschnitt nicht entfernen! STR_3092 :Sie dürfen die Station für diese Bahn nicht verschieben oder verändern! STR_3093 :{WINDOW_COLOUR_2}Favorit: {BLACK}{STRINGID} @@ -3111,7 +3111,7 @@ STR_3102 :{SMALLFONT}{BLACK}Farbige Szenerie auf Gelände neu streichen STR_3103 :Dies kann nicht neu gestrichen werden... STR_3104 :{SMALLFONT}{BLACK}Bahnen auflisten STR_3105 :{SMALLFONT}{BLACK}Läden und Stände auflisten -STR_3106 :{SMALLFONT}{BLACK}Informationsstände und andere Besuchereinrichtungen auflisten +STR_3106 :{SMALLFONT}{BLACK}Informationsstände und andere Besuchereinrichtungen{NEWLINE}auflisten STR_3107 :Schließen STR_3108 :Testen STR_3109 :Öffnen @@ -3226,14 +3226,14 @@ STR_3217 :Gelände im Besitz STR_3218 :Baurechte STR_3219 :Gelände zum Verkauf STR_3220 :Baurechte zum Verkauf -STR_3221 :{SMALLFONT}{BLACK}Legen Sie das Gelände fest, das dem Park gehören soll +STR_3221 :{SMALLFONT}{BLACK}Legen Sie das Gelände fest,{NEWLINE}das dem Park gehören soll STR_3222 :{SMALLFONT}{BLACK}Wählen Sie die Baurechte aus, die exklusiv dem Park gehören sollen -STR_3223 :{SMALLFONT}{BLACK}Legen Sie das Gelände fest, das vom Park gekauft werden kann -STR_3224 :{SMALLFONT}{BLACK}Legen Sie die Baurechte fest, die vom Park erworben werden können +STR_3223 :{SMALLFONT}{BLACK}Legen Sie das Gelände fest, das vom{NEWLINE}Park gekauft werden kann +STR_3224 :{SMALLFONT}{BLACK}Legen Sie die Baurechte fest, die vom{NEWLINE}Park erworben werden können STR_3225 :{SMALLFONT}{BLACK}Bau einer zufälligen Objektgruppe{NEWLINE}um ausgewählte Position herum ein-/ausschalten STR_3226 :{SMALLFONT}{BLACK}Parkeingang bauen STR_3227 :Zu viele Parkeingänge! -STR_3228 :{SMALLFONT}{BLACK}Legen Sie die Startpositionen für Personen fest +STR_3228 :{SMALLFONT}{BLACK}Legen Sie die Startpositionen{NEWLINE}für Personen fest STR_3229 :Blockbremsen können nicht unmittelbar nach der Station eingesetzt werden STR_3230 :Blockbremsen können nicht unmittelbar hintereinander eingesetzt werden STR_3231 :Blockbremsen können nicht unmittelbar nach der Anstiegsspitze eingesetzt werden @@ -3262,26 +3262,26 @@ STR_3253 :Max. Darlehensgröße kann nicht weiter reduziert werden! STR_3254 :Zinsrate kann nicht weiter erhöht werden! STR_3255 :Zinsrate kann nicht weiter reduziert werden! STR_3256 :Weniger aufregendere Bahnen bevorzugt -STR_3257 :{SMALLFONT}{BLACK}Wählen Sie aus, ob die Besucher im Allgemeinen weniger aufregende Bahnen vorziehen +STR_3257 :{SMALLFONT}{BLACK}Wählen Sie aus, ob die Besucher im Allgemeinen weniger aufregende{NEWLINE}Bahnen vorziehen STR_3258 :Aufregendere Bahnen bevorzugt -STR_3259 :{SMALLFONT}{BLACK}Wählen Sie aus, ob die Besucher im Allgemeinen aufregendere Bahnen vorziehen +STR_3259 :{SMALLFONT}{BLACK}Wählen Sie aus, ob die Besucher im Allgemeinen aufregendere{NEWLINE}Bahnen vorziehen STR_3260 :{WINDOW_COLOUR_2}Durchschnittliches Geld pro Besucher: STR_3261 :{WINDOW_COLOUR_2}Anfangsvergnügen der Besucher: STR_3262 :{WINDOW_COLOUR_2}Anfangshunger der Besucher: STR_3263 :{WINDOW_COLOUR_2}Anfangsdurst der Besucher: STR_3264 :Dies kann nicht weiter erhöht werden! STR_3265 :Dies kann nicht weiter reduziert werden! -STR_3266 :{SMALLFONT}{BLACK}Wählen Sie aus, was der Park für Eintritt und Fahrten verlangt +STR_3266 :{SMALLFONT}{BLACK}Wählen Sie aus, was der Park für{NEWLINE}Eintritt und Fahrten verlangt STR_3267 :Entfernen von Bäumen verbieten STR_3268 :{SMALLFONT}{BLACK}Entfernen von hohen Bäumen verbieten STR_3269 :Landschaftsänderungen verbieten -STR_3270 :{SMALLFONT}{BLACK}Jegliche Änderungen an der Landschaft verbieten +STR_3270 :{SMALLFONT}{BLACK}Jegliche Änderungen an der{NEWLINE}Landschaft verbieten STR_3271 :Hohe Bauten verbieten STR_3272 :{SMALLFONT}{BLACK}Jegliche hohe Bauten verbieten STR_3273 :Höhere Schwierigkeitsstufe für Parkbewertung STR_3274 :{SMALLFONT}{BLACK}Machen Sie die Parkbewertung schwieriger STR_3275 :Höhere Schwierigkeitsstufe für Besuchergewinnung -STR_3276 :{SMALLFONT}{BLACK}Machen Sie das Anlocken von Besuchern schwieriger +STR_3276 :{SMALLFONT}{BLACK}Machen Sie das Anlocken von{NEWLINE}Besuchern schwieriger STR_3277 :{WINDOW_COLOUR_2}Kosten für Landkauf: STR_3278 :{WINDOW_COLOUR_2}Kosten für Erwerb v. Baurechten: STR_3279 :Freier Eintritt/Bezahlen pro Fahrt @@ -3323,7 +3323,7 @@ STR_3314 :Namen für Szenario eingeben: STR_3315 :Park-/Szenariodetails STR_3316 :Beschreibung für dieses Szenario eingeben: STR_3317 :Noch keine Details -STR_3318 :{SMALLFONT}{BLACK}Wählen Sie aus, in welcher Gruppe dieses Szenario vorkommt +STR_3318 :{SMALLFONT}{BLACK}Wählen Sie aus, in welcher Gruppe{NEWLINE}dieses Szenario vorkommt STR_3319 :{WINDOW_COLOUR_2}Szenariogruppe: STR_3320 :Szenariodatei kann nicht gespeichert werden... STR_3321 :Neue Objekte erfolgreich installiert @@ -3587,10 +3587,10 @@ STR_5250 :Hauptmenü Beenden-Schaltfläche STR_5251 :Hauptmenü Optionen-Schaltfläche STR_5252 :Hauptmenü Szenarioauswahl STR_5253 :Parkinformationen -STR_5254 :Übelkeit hinzufügen -STR_5255 :{MEDIUMFONT}{BLACK}Allen Besuchern wird übel +STR_5254 :Erstellen +STR_5255 :{SMALLFONT}{BLACK}Eine neue Titelsequenz von{NEWLINE}Grund auf neu erstellen STR_5256 :Neues Thema zum bearbeiten erstellen -STR_5257 :{SMALLFONT}{BLACK}Neues Thema durch duplizieren des aktuellen Themas erstellen +STR_5257 :{SMALLFONT}{BLACK}Neues Thema durch duplizieren des{NEWLINE}aktuellen Themas erstellen STR_5258 :{SMALLFONT}{BLACK}Aktuelles Thema löschen STR_5259 :{SMALLFONT}{BLACK}Aktuelles Thema umbenennen STR_5260 :Riesiger Screenshot @@ -3758,7 +3758,7 @@ STR_5421 :Zoom STR_5422 :Zoom{MOVE_X}{87}{COMMA16} STR_5423 :Warten STR_5424 :Warten{MOVE_X}{87}{COMMA16} -STR_5425 :Neu starten +STR_5425 :Neustart STR_5426 :Ende STR_5427 :Koordinaten: STR_5428 :Drehungen gegen Uhrzeigersinn: @@ -3772,6 +3772,13 @@ STR_5435 :Spielstand umbenennen STR_5436 :Titelsequenzen bearbeiten... STR_5437 :Kein Spielstand ausgewählt STR_5438 :Es können keine Änderungen vorgenommen werden, solange der Befehlseditor geöffnet ist -STR_5439 :Ein Neustart wird ohne `Warten'-Befehl verwendet +STR_5439 :Zusammen mit einem `Neustart'-Befehl muss ein mindestens 4 Sekunden langer `Warten'-Befehl verwendet werden STR_5440 :Vollbild minimieren, wenn Spiel nicht im Vordergrund -STR_5441 :{SMALLFONT}{BLACK}Identifiziert Bahnen durch Streckentyp, sodass wie in RCT1 Fahrzeuge anschließend geändert werden können. Nur im Titelbildschirm auswählbar +STR_5441 :{SMALLFONT}{BLACK}Identifiziert Bahnen durch Streckentyp, sodass wie in RCT1 Fahrzeuge anschließend geändert werden können +STR_5442 :reserviert +STR_5443 :Geschwind.{MOVE_X}{87}{STRINGID} +STR_5444 :Geschwindigkeit: +STR_5445 :Geschwindigkeit +STR_5446 :Erhalten +STR_5447 :Typ {STRINGID} +STR_5448 :Bahn / Fahrzeug {STRINGID} From a8a838589947a803f67b96a1258f3774ecb80ac0 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 27 Jun 2015 10:30:33 +0100 Subject: [PATCH 0116/1173] Fix memory not being freed. This was breaking the installed object list creation as it would quickly run out of rct2 memory. Scenario text was incorrectly using rct2_free this has also been fixed. --- src/object.c | 2 +- src/rct2.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/object.c b/src/object.c index 98e8fed918..2056562cff 100644 --- a/src/object.c +++ b/src/object.c @@ -1593,7 +1593,7 @@ int object_get_scenario_text(rct_object_entry *entry) void object_free_scenario_text() { if (RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TEXT_TEMP_CHUNK, void*) != NULL) { - rct2_free(RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TEXT_TEMP_CHUNK, void*)); + free(RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TEXT_TEMP_CHUNK, void*)); RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TEXT_TEMP_CHUNK, void*) = NULL; } } diff --git a/src/rct2.c b/src/rct2.c index 0b3068ebe5..c2efdc4e92 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -512,9 +512,9 @@ void *rct2_realloc(void *block, size_t numBytes) /** * RCT2 and this DLL can not free each other's allocated memory blocks. Use this to free memory that was allocated by RCT2. - * rct2: 0x004068DE + * rct2: 0x004068CD */ void rct2_free(void *block) { - RCT2_CALLPROC_1(0x004068DE, void*, block); + RCT2_CALLPROC_1(0x004068CD, void*, block); } From 2ac872dd56063c12834d0b832c4b2533be253400 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 27 Jun 2015 13:08:29 +0200 Subject: [PATCH 0117/1173] Drop duplicate track names in list; use track categories when in select-by-track-type-mode --- src/object_list.c | 28 +++++---------------------- src/windows/editor_object_selection.c | 16 ++++++++++----- 2 files changed, 16 insertions(+), 28 deletions(-) diff --git a/src/object_list.c b/src/object_list.c index 615d991419..de0ac3f4c7 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "addresses.h" +#include "config.h" #include "localisation/localisation.h" #include "object.h" #include "platform/platform.h" @@ -738,29 +739,9 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in load_object_filter(entry, chunk, filter); - - // When made of two parts i.e Wooden Roller Coaster (Dream Woodie Cars) - if ((objectType == OBJECT_TYPE_RIDE) && (!((((rct_ride_type*)chunk)->flags) & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) || - rideTypeShouldLoseSeparateFlag((rct_ride_type*)chunk))) { - rct_ride_type* ride_type = (rct_ride_type*)chunk; - rct_string_id obj_string = ride_type->ride_type[0]; - if (obj_string == 0xFF){ - obj_string = ride_type->ride_type[1]; - if (obj_string == 0xFF) { - obj_string = ride_type->ride_type[2]; - } - } - - format_string(installed_entry_pointer, obj_string + 2, 0); - strcat(installed_entry_pointer, "\t ("); - strcat(installed_entry_pointer, language_get_string((rct_string_id)RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_BASE_STRING_ID, uint32))); - strcat(installed_entry_pointer, ")"); - while (*installed_entry_pointer++); - } - else{ - strcpy(installed_entry_pointer, language_get_string((rct_string_id)RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_BASE_STRING_ID, uint32))); - while (*installed_entry_pointer++); - } + // Always extract only the vehicle type, since the track type is always displayed in the left column, to prevent duplicate track names. + strcpy(installed_entry_pointer, language_get_string((rct_string_id)RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_BASE_STRING_ID, uint32))); + while (*installed_entry_pointer++); // This is deceptive. Due to setting the total no images earlier to 0xF26E // this is actually the no_images in this entry. @@ -805,6 +786,7 @@ static void load_object_filter(rct_object_entry* entry, uint8* chunk, rct_object rideFilter->category[0] = rideType->category[0]; rideFilter->category[1] = rideType->category[1]; + for (int i = 0; i < 3; i++) { rideFilter->ride_type = rideType->ride_type[i]; if (rideFilter->ride_type != 255) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 11b3ec7e34..bfbbc7d543 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -31,6 +31,7 @@ #include "error.h" #include "../interface/themes.h" #include "dropdown.h" +#include "../rct1.h" enum { FILTER_RCT2 = (1 << 0), @@ -2085,11 +2086,16 @@ static bool filter_chunks(rct_object_entry *entry, rct_object_filters *filter) { switch (entry->flags & 0x0F) { case OBJECT_TYPE_RIDE: - if (_filter_flags & (1 << (filter->ride.category[0] + 5))) - return true; - if (_filter_flags & (1 << (filter->ride.category[1] + 5))) - return true; - + if(!gConfigInterface.select_by_track_type) { + if (_filter_flags & (1 << (filter->ride.category[0] + 5))) + return true; + if (_filter_flags & (1 << (filter->ride.category[1] + 5))) + return true; + } + else { + if (_filter_flags & (1 << (gRideCategories[filter->ride.ride_type] + 5))) + return true; + } return false; } return true; From 57fd914a52085aed89553724d5bc0ed69ba1ad23 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 27 Jun 2015 15:17:54 +0100 Subject: [PATCH 0118/1173] implement ride construction --- projects/openrct2.vcxproj | 1 + projects/openrct2.vcxproj.filters | 3 + src/game.h | 10 +- src/interface/viewport.h | 4 + src/interface/window.h | 3 +- src/localisation/string_ids.h | 166 +- src/ride/ride.c | 656 +++-- src/ride/ride.h | 86 +- src/ride/ride_ratings.c | 19 +- src/ride/ride_ratings.h | 1 - src/ride/track.c | 413 ++-- src/ride/track.h | 107 +- src/windows/maze_construction.c | 211 ++ src/windows/ride_construction.c | 3691 ++++++++++++++++++++++++++--- src/windows/track_place.c | 2 +- src/world/map.c | 40 +- src/world/map.h | 7 + 17 files changed, 4685 insertions(+), 735 deletions(-) create mode 100644 src/windows/maze_construction.c diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index c9f50a1a2a..84309b2bcf 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -96,6 +96,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 24bc550445..d2f78bd6b4 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -489,6 +489,9 @@ Source\Windows + + Source\Windows + diff --git a/src/game.h b/src/game.h index 0695d91595..91c3212236 100644 --- a/src/game.h +++ b/src/game.h @@ -27,8 +27,8 @@ enum GAME_COMMAND { GAME_COMMAND_SET_RIDE_APPEARANCE, GAME_COMMAND_1, GAME_COMMAND_TOGGLE_PAUSE, // 2 - GAME_COMMAND_3, //Has something to do with ride construction - GAME_COMMAND_4, + GAME_COMMAND_PLACE_TRACK, + GAME_COMMAND_REMOVE_TRACK, GAME_COMMAND_LOAD_OR_QUIT, // 5 GAME_COMMAND_6, GAME_COMMAND_7, @@ -36,8 +36,8 @@ enum GAME_COMMAND { GAME_COMMAND_9, GAME_COMMAND_SET_RIDE_NAME, GAME_COMMAND_SET_RIDE_SETTING, - GAME_COMMAND_12, - GAME_COMMAND_13, + GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, + GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT, GAME_COMMAND_REMOVE_SCENERY, GAME_COMMAND_PLACE_SCENERY, GAME_COMMAND_16, @@ -71,7 +71,7 @@ enum GAME_COMMAND { GAME_COMMAND_REMOVE_LARGE_SCENERY, GAME_COMMAND_SET_CURRENT_LOAN, // 45 GAME_COMMAND_SET_RESEARCH_FUNDING, // 46 - GAME_COMMAND_PLACE_TRACK, + GAME_COMMAND_PLACE_TRACK_DESIGN, GAME_COMMAND_START_MARKETING_CAMPAIGN, // 48 GAME_COMMAND_49, GAME_COMMAND_PLACE_BANNER, // New banner? (possibly scenery) diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 429b91602e..62cfa47c7f 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -126,4 +126,8 @@ void sub_68A15E(int screenX, int screenY, short *x, short *y, int *direction, rc void viewport_interaction_remove_park_entrance(rct_map_element *mapElement, int x, int y); +void sub_0x68615B(int ebp); +void sub_688485(); +void sub_688217(); + #endif diff --git a/src/interface/window.h b/src/interface/window.h index 9aee92e59a..e571e2f312 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -564,7 +564,8 @@ rct_window *window_ride_open_vehicle(rct_vehicle *vehicle); void window_ride_demolish_prompt_open(int rideIndex); void window_ride_construct(rct_window *w); void window_ride_list_open(); -rct_window * window_construction_open(); +rct_window *window_ride_construction_open(); +rct_window *window_maze_construction_open(); void window_track_place_open(); rct_window *window_new_ride_open(); rct_window *window_new_ride_open_research(); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index cc465584ef..b93bab5ec7 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -73,7 +73,7 @@ enum { STR_CLOSE_X = 824, STR_CHOSEN_NAME_IN_USE_ALREADY = 825, STR_TOO_MANY_NAMES_DEFINED = 826, - + STR_NOT_ENOUGH_CASH_REQUIRES = 827, STR_CLOSE_WINDOW_TIP = 828, STR_WINDOW_TITLE_TIP = 829, @@ -124,6 +124,45 @@ enum { STR_SCREENSHOT_FAILED = 893, STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND = 895, + STR_RIDE_CONSTRUCTION_DIRECTION = 897, + STR_RIDE_CONSTRUCTION_LEFT_CURVE_TIP = 898, + STR_RIDE_CONSTRUCTION_RIGHT_CURVE_TIP = 899, + STR_RIDE_CONSTRUCTION_LEFT_CURVE_SMALL_TIP = 900, + STR_RIDE_CONSTRUCTION_RIGHT_CURVE_SMALL_TIP = 901, + STR_RIDE_CONSTRUCTION_LEFT_CURVE_VERY_SMALL_TIP = 902, + STR_RIDE_CONSTRUCTION_RIGHT_CURVE_VERY_SMALL_TIP = 903, + STR_RIDE_CONSTRUCTION_LEFT_CURVE_LARGE_TIP = 904, + STR_RIDE_CONSTRUCTION_RIGHT_CURVE_LARGE_TIP = 905, + STR_RIDE_CONSTRUCTION_STRAIGHT_TIP = 906, + STR_RIDE_CONSTRUCTION_SLOPE = 907, + STR_RIDE_CONSTRUCTION_ROLL_BANKING = 908, + STR_RIDE_CONSTRUCTION_SEAT_ROT = 909, + + STR_RIDE_CONSTRUCTION_ROLL_FOR_LEFT_CURVE_TIP = 910, + STR_RIDE_CONSTRUCTION_ROLL_FOR_RIGHT_CURVE_TIP = 911, + STR_RIDE_CONSTRUCTION_NO_ROLL_TIP = 912, + STR_RIDE_CONSTRUCTION_MOVE_TO_PREVIOUS_SECTION_TIP = 913, + STR_RIDE_CONSTRUCTION_MOVE_TO_NEXT_SECTION_TIP = 914, + STR_RIDE_CONSTRUCTION_CONSTRUCT_SELECTED_SECTION_TIP = 915, + STR_RIDE_CONSTRUCTION_REMOVE_HIGHLIGHTED_SECTION_TIP = 916, + STR_RIDE_CONSTRUCTION_VERTICAL_DROP_TIP = 917, + STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP = 918, + STR_RIDE_CONSTRUCTION_SLOPE_DOWN_TIP = 919, + STR_RIDE_CONSTRUCTION_LEVEL_TIP = 920, + STR_RIDE_CONSTRUCTION_SLOPE_UP_TIP = 921, + STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP = 922, + STR_RIDE_CONSTRUCTION_VERTICAL_RISE_TIP = 923, + STR_RIDE_CONSTRUCTION_HELIX_DOWN_TIP = 924, + STR_RIDE_CONSTRUCTION_HELIX_UP_TIP = 925, + STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS = 926, + STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE = 927, + STR_RIDE_CONSTRUCTION_CHAIN_LIFT_TIP = 928, + + STR_S_BEND_LEFT = 929, + STR_S_BEND_RIGHT = 930, + STR_VERTICAL_LOOP_LEFT = 931, + STR_VERTICAL_LOOP_RIGHT = 932, + STR_VIEW_OPTIONS_TIP = 937, STR_ADJUST_LAND_TIP = 938, STR_UNDERGROUND_VIEW = 939, @@ -145,6 +184,24 @@ enum { STR_QUIT_GAME_2_PROMPT_TITLE = 952, STR_LOAD_LANDSCAPE_PROMPT_TITLE = 953, + STR_RIDE_CONSTRUCTION_SELECT_SEAT_ROTATION_ANGLE_TIP = 955, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_180 = 956, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_135 = 957, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_90 = 958, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_45 = 959, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_0 = 960, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_45 = 961, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_90 = 962, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_135 = 963, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_180 = 964, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_225 = 965, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_270 = 966, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_315 = 967, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_360 = 968, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_405 = 969, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_450 = 970, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_495 = 971, + STR_CANCEL = 972, STR_OK = 973, @@ -166,6 +223,8 @@ enum { STR_CONSTRUCTION = 990, + STR_STATION_PLATFORM = 991, + STR_DEMOLISH_RIDE_TIP = 992, STR_DEMOLISH_RIDE = 993, STR_DEMOLISH = 994, @@ -197,6 +256,11 @@ enum { STR_LOCATE_SUBJECT_TIP = 1027, STR_OFF_EDGE_OF_MAP = 1028, + STR_CANNOT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_WATER = 1029, + STR_CAN_ONLY_BUILD_THIS_UNDERWATER = 1030, + STR_RIDE_CANT_BUILD_THIS_UNDERWATER = 1031, + STR_CAN_ONLY_BUILD_THIS_ON_WATER = 1032, + STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND = 1033, STR_CAN_ONLY_BUILD_THIS_ON_LAND = 1034, STR_LOAD_GAME_DIALOG_TITLE = 1036, @@ -304,6 +368,11 @@ enum { STR_SELECT_VEHICLE_COLOUR_SCHEME_TIP = 1140, STR_SELECT_VEHICLE_TO_MODIFY_TIP = 1141, + STR_CANT_BUILD_MOVE_ENTRANCE_FOR_THIS_RIDE_ATTRACTION = 1144, + STR_CANT_BUILD_MOVE_EXIT_FOR_THIS_RIDE_ATTRACTION = 1145, + STR_ENTRANCE_NOT_YET_BUILT = 1146, + STR_EXIT_NOT_YET_BUILT = 1147, + STR_QUARTER_LOAD = 1148, STR_HALF_LOAD = 1149, STR_THREE_QUARTER_LOAD = 1150, @@ -411,6 +480,31 @@ enum { STR_QUEUE_TIME_MINUTE = 1359, STR_QUEUE_TIME_MINUTES = 1360, + STR_TOO_HIGH_FOR_SUPPORTS = 1363, + + STR_IN_LINE_TWIST_LEFT = 1365, + STR_IN_LINE_TWIST_RIGHT = 1366, + STR_HALF_LOOP = 1367, + STR_HALF_CORKSCREW_LEFT = 1368, + STR_HALF_CORKSCREW_RIGHT = 1369, + STR_BARREL_ROLL_LEFT = 1370, + STR_BARREL_ROLL_RIGHT = 1371, + STR_LAUNCHED_LIFT_HILL = 1372, + STR_LARGE_HALF_LOOP_LEFT = 1373, + STR_LARGE_HALF_LOOP_RIGHT = 1374, + STR_UPPER_TRANSFER = 1375, + STR_LOWER_TRANSFER = 1376, + STR_HEARTLINE_ROLL_LEFT = 1377, + STR_HEARTLINE_ROLL_RIGHT = 1378, + STR_REVERSER_LEFT = 1379, + STR_REVERSER_RIGHT = 1380, + STR_CURVED_LIFT_HILL_LEFT = 1381, + STR_CURVED_LIFT_HILL_RIGHT = 1382, + STR_QUARTER_LOOP = 1383, + + STR_RIDE_CONSTRUCTION_OTHER_TRACK_CONFIGURATIONS_TIP = 1385, + STR_RIDE_CONSTRUCTION_SPECIAL = 1386, + STR_VIEW_OF_RIDE_ATTRACTION_TIP = 1392, STR_VEHICLE_DETAILS_AND_OPTIONS_TIP = 1393, STR_OPERATING_OPTIONS_TIP = 1394, @@ -420,6 +514,10 @@ enum { STR_MEASUREMENTS_AND_TEST_DATA_TIP = 1398, STR_GRAPHS_TIP = 1399, + STR_RIDE_CONSTRUCTION_ENTRANCE = 1400, + STR_RIDE_CONSTRUCTION_EXIT = 1401, + STR_RIDE_CONSTRUCTION_ENTRANCE_TIP = 1402, + STR_RIDE_CONSTRUCTION_EXIT_TIP = 1403, STR_ROTATE_90_TIP = 1404, STR_MIRROR_IMAGE_TIP = 1405, STR_TOGGLE_SCENERY_TIP = 1406, @@ -427,6 +525,9 @@ enum { STR_BUILD_THIS = 1407, STR_COST_LABEL = 1408, + STR_ENTRY_EXIT_PLATFORM = 1409, + STR_VERTICAL_TOWER = 1410, + STR_DATA_LOGGING_NOT_AVAILABLE_FOR_THIS_TYPE_OF_RIDE = 1412, STR_DATA_LOGGING_WILL_START_WHEN_NEXT_LEAVES = 1413, STR_LOGGING_DATA_FROM_TIP = 1422, @@ -455,9 +556,18 @@ enum { STR_LOOKING_AT_SCENERY = 1446, STR_LEAVING_PARK = 1447, STR_WATCHING_NEW_RIDE_BEING_CONSTRUCTED = 1448, - + + STR_RIDE_CONSTRUCTION_TRACK_STYLE = 1459, + STR_RIDE_CONSTRUCTION_U_SHAPED_OPEN_TRACK_TIP = 1460, + STR_RIDE_CONSTRUCTION_O_SHAPED_ENCLOSED_TRACK_TIP = 1461, + STR_GUESTS = 1463, + STR_HELIX_UP_SMALL = 1464, + STR_HELIX_UP_LARGE = 1465, + STR_HELIX_DOWN_SMALL = 1466, + STR_HELIX_DOWN_LARGE = 1467, + STR_STAFF = 1468, STR_RIDE_MUST_START_AND_END_WITH_STATIONS = 1469, @@ -484,9 +594,27 @@ enum { STR_TOTAL_CUSTOMERS = 1670, STR_TOTAL_PROFIT = 1671, + STR_BRAKES = 1672, + STR_SPINNING_CONTROL_TOGGLE_TRACK = 1673, + + STR_RIDE_CONSTRUCTION_BRAKE_SPEED = 1674, + STR_RIDE_CONSTRUCTION_BRAKE_SPEED_LIMIT_TIP = 1676, + STR_POPULARITY_UNKNOWN = 1677, STR_POPULARITY_PERCENT = 1678, + STR_HELIX_UP_LEFT = 1679, + STR_HELIX_UP_RIGHT = 1680, + STR_HELIX_DOWN_LEFT = 1681, + STR_HELIX_DOWN_RIGHT = 1682, + STR_BASE_SIZE_2_X_2 = 1683, + STR_BASE_SIZE_4_X_4 = 1684, + STR_BASE_SIZE_2_X_4 = 1685, + STR_BASE_SIZE_5_X_1 = 1686, + STR_WATER_SPLASH = 1687, + STR_BASE_SIZE_4_X_1 = 1688, + STR_BLOCK_BRAKES = 1689, + STR_GUESTS_TIP = 1693, STR_STAFF_TIP = 1694, @@ -523,6 +651,9 @@ enum { STR_BANNER_TEXT = 1731, + STR_RIDE_CONSTRUCTION_BUILD = 1732, + STR_RIDE_CONSTRUCTION_MODE = 1733, + STR_NUMBER_OF_LAPS = 1734, STR_NUMBER_OF_LAPS_TIP = 1735, @@ -542,6 +673,18 @@ enum { STR_ADMISSION_PRICE = 1756, STR_RELIABILITY_LABEL_1757 = 1757, + STR_RIDE_CONSTRUCTION_BUILD_MODE = 1758, + STR_RIDE_CONSTRUCTION_MOVE_MODE = 1759, + STR_RIDE_CONSTRUCTION_FILL_IN_MODE = 1760, + STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP = 1761, + + STR_WATERFALLS = 1762, + STR_RAPIDS = 1763, + STR_LOG_BUMPS = 1764, + STR_ON_RIDE_PHOTO_SECTION = 1765, + STR_REVERSER_TURNTABLE = 1766, + STR_SPINNING_TUNNEL = 1767, + STR_NUMBER_OF_SWINGS = 1769, STR_NUMBER_OF_SWINGS_TIP = 1770, @@ -557,6 +700,8 @@ enum { STR_ANSWERING_RADIO_CALL = 1795, STR_HAS_BROKEN_DOWN_AND_REQUIRES_FIXING = 1796, + STR_WHIRLPOOL = 1798, + STR_SAFETY_CUT_OUT = 1800, STR_RESTRAINTS_STUCK_CLOSED = 1801, STR_RESTRAINTS_STUCK_OPEN = 1802, @@ -735,6 +880,11 @@ enum { STR_COMPANY_VALUE_LABEL = 2227, STR_LAST_MONTH_PROFIT_FROM_FOOD_DRINK_MERCHANDISE_SALES_LABEL = 2228, + STR_SLOPE_UP_TO_VERTICAL = 2229, + STR_VERTICAL_TRACK = 2230, + STR_HOLDING_BRAKE_FOR_DROP = 2231, + STR_CABLE_LIFT_HILL = 2232, + STR_PARK_INFORMATION_TIP = 2233, STR_RECENT_MESSAGES = 2234, @@ -995,6 +1145,15 @@ enum { STR_SHORTCUT_DESCRIPTION_31 = 2524, STR_INDIVIDUAL_KEYS_BASE = 2525, + STR_GOLF_HOLE_A = 3049, + STR_GOLF_HOLE_B = 3050, + STR_GOLF_HOLE_C = 3051, + STR_GOLF_HOLE_D = 3052, + STR_GOLF_HOLE_E = 3053, + + STR_TOP_SECTION = 3069, + STR_SLOPE_TO_LEVEL = 3070, + // Cheats STR_CHEAT_TITLE = 5217, STR_CHEAT_TITLE_FINANCIAL = 5345, @@ -1220,6 +1379,9 @@ enum { STR_HEDGES = 3059, STR_ICE_BLOCKS = 3060, STR_WOODEN_FENCES = 3061, + + STR_RIDE_CONSTRUCTION_STANDARD_RC_TRACK_TIP = 3062, + STR_RIDE_CONSTRUCTION_WATER_CHANNEL_TIP = 3063, STR_BEGINNER_PARKS = 3064, STR_CHALLENGING_PARKS = STR_BEGINNER_PARKS + 1, diff --git a/src/ride/ride.c b/src/ride/ride.c index 47f5fb312f..c71dfd4e9f 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -328,7 +328,7 @@ int sub_6CAF80(int rideIndex, rct_xy_element *output) * * rct2: 0x006C60C2 */ -int track_get_next(rct_xy_element *input, rct_xy_element *output) +bool track_get_next(rct_xy_element *input, rct_xy_element *output, int *z, int *direction) { int eax, ebx, ecx, edx, esi, edi, ebp, result; @@ -339,10 +339,37 @@ int track_get_next(rct_xy_element *input, rct_xy_element *output) output->x = *((uint16*)&eax); output->y = *((uint16*)&ecx); output->element = (rct_map_element*)esi; + if (z != NULL) *z = (edx & 0xFFFF); + if (direction != NULL) *direction = (ebx & 0xFF); return (result & 0x100) == 0; } +/** + * + * rct2: 0x006C6402 + */ +bool track_get_previous(int x, int y, rct_map_element *mapElement, track_begin_end *outTrackBeginEnd) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + + eax = x; + ecx = y; + esi = (int)mapElement; + int result = RCT2_CALLFUNC_X(0x006C6402, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + if (outTrackBeginEnd != NULL) { + outTrackBeginEnd->begin_x = ((eax >> 16) & 0xFFFF); + outTrackBeginEnd->begin_y = ((ecx >> 16) & 0xFFFF); + outTrackBeginEnd->begin_z = (edx & 0xFFFF); + outTrackBeginEnd->begin_direction = ((ebx >> 8) & 0xFF); + outTrackBeginEnd->begin_element = (rct_map_element*)esi; + outTrackBeginEnd->end_x = (eax & 0xFFFF); + outTrackBeginEnd->end_y = (ecx & 0xFFFF); + outTrackBeginEnd->end_direction = (ebx & 0xFF); + } + return (result & 0x100) == 0; +} + /** * * Make sure to pass in the x and y of the start track element too. @@ -367,12 +394,12 @@ int ride_find_track_gap(rct_xy_element *input, rct_xy_element *output) return 0; w = window_find_by_class(WC_RIDE_CONSTRUCTION); - if (w != NULL && RCT2_GLOBAL(0x00F440A6, uint8) != 0 && RCT2_GLOBAL(0x00F440A7, uint8) == rideIndex) + if (w != NULL && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && _currentRideIndex == rideIndex) sub_6C9627(); loopTrackElement = NULL; while (1) { - if (!track_get_next(&trackElement, &nextTrackElement)) { + if (!track_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { *output = trackElement; return 1; } @@ -544,11 +571,11 @@ static rct_window *ride_create_or_find_construction_window(int rideIndex) w = window_find_by_class(WC_RIDE_CONSTRUCTION); if (w == NULL || w->number != rideIndex) { window_close_construction_windows(); - RCT2_GLOBAL(0x00F440A7, uint8) = rideIndex; - w = window_construction_open(rideIndex); + _currentRideIndex = rideIndex; + w = window_ride_construction_open(rideIndex); } else { sub_6C9627(); - RCT2_GLOBAL(0x00F440A7, uint8) = rideIndex; + _currentRideIndex = rideIndex; } return w; @@ -604,15 +631,6 @@ void ride_construct(int rideIndex) } } -/** - * - * rct2: 0x006C84CE - */ -static void sub_6C84CE() -{ - RCT2_CALLPROC_X(0x006C84CE, 0, 0, 0, 0, 0, 0, 0); -} - /** * * rct2: 0x006DD4D5 @@ -779,7 +797,9 @@ void ride_remove_peeps(int rideIndex) ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN; } -/* rct2: 0x006C683D +/** + * Gets the origin track element (sequence 0). Seems to do more than that though and even invalidates track. + * rct2: 0x006C683D * ax : x * bx : direction << 8, type * cx : y @@ -790,49 +810,38 @@ void ride_remove_peeps(int rideIndex) */ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_params, rct_map_element** output_element, uint16 flags) { - rct_map_element* map_element = map_get_first_element_at(*x / 32, *y / 32); - rct_map_element* success_map = NULL; + rct_map_element *mapElement = map_get_first_element_at(*x / 32, *y / 32); + rct_map_element *successMapElement = NULL; - do{ - if (map_element->base_height != *z / 8) + do { + if (mapElement->base_height != *z / 8) continue; - if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_TRACK) + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; - if ((map_element->type & MAP_ELEMENT_DIRECTION_MASK) != direction) + if ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) != direction) continue; - if (type != map_element->properties.track.type) + if (type != mapElement->properties.track.type) continue; - success_map = map_element; - if (!(map_element->properties.track.sequence & 0xF)) + successMapElement = mapElement; + if ((mapElement->properties.track.sequence & 0x0F) == 0) break; - }while(!map_element_is_last_for_tile(map_element++)); + } while (!map_element_is_last_for_tile(mapElement++)); - map_element = success_map; - - if (map_element == NULL){ + mapElement = successMapElement; + if (mapElement == NULL) return 1; - } - // Possibly z should be &0xF8 - rct_ride* ride = GET_RIDE(map_element->properties.track.ride_index); - rct_preview_track *trackBlock; + // Possibly z should be & 0xF8 + rct_preview_track *trackBlock = get_track_def_from_ride_index(mapElement->properties.track.ride_index, type); - if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & RIDE_TYPE_FLAG_FLAT_RIDE){ - trackBlock = RCT2_ADDRESS(0x00994A38, rct_preview_track*)[type]; - } - else{ - trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[type]; - } + int sequence = mapElement->properties.track.sequence & 0x0F; + uint8 mapDirection = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; - int sequence = map_element->properties.track.sequence & 0xF; - - uint8 map_direction = map_element->type & MAP_ELEMENT_DIRECTION_MASK; - - switch (map_direction){ + switch (mapDirection){ case MAP_ELEMENT_DIRECTION_WEST: *x -= trackBlock[sequence].x; *y -= trackBlock[sequence].y; @@ -850,17 +859,13 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par *y -= trackBlock[sequence].x; break; } - *z -= trackBlock[sequence].z; int start_x = *x, start_y = *y, start_z = *z; - *z += trackBlock[0].z; - for (int i = 0; trackBlock[i].var_00 != 0xFF; ++i){ int cur_x = start_x, cur_y = start_y, cur_z = start_z; - - switch (map_direction){ + switch (mapDirection){ case MAP_ELEMENT_DIRECTION_WEST: cur_x += trackBlock[i].x; cur_y += trackBlock[i].y; @@ -878,134 +883,334 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par cur_y += trackBlock[i].x; break; } - cur_z += trackBlock[i].z; map_invalidate_tile_full(cur_x, cur_y); - map_element = map_get_first_element_at(cur_x / 32, cur_y / 32); - success_map = NULL; - - do{ - if (map_element->base_height != cur_z / 8) + mapElement = map_get_first_element_at(cur_x / 32, cur_y / 32); + successMapElement = NULL; + do { + if (mapElement->base_height != cur_z / 8) continue; - if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_TRACK) + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; - if ((map_element->type & MAP_ELEMENT_DIRECTION_MASK) != direction) + if ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) != direction) continue; - if ((map_element->properties.track.sequence & 0xF) != trackBlock[i].var_00) + if ((mapElement->properties.track.sequence & 0xF) != trackBlock[i].var_00) continue; - if (type == map_element->properties.track.type) - { - success_map = map_element; + if (type == mapElement->properties.track.type) { + successMapElement = mapElement; break; } - } while (!map_element_is_last_for_tile(map_element++)); + } while (!map_element_is_last_for_tile(mapElement++)); - if (success_map == NULL){ + if (successMapElement == NULL) { return 1; } - - if (i == 0 && output_element != NULL) - *output_element = map_element; - - if (flags & (1 << 0)){ - // Quadrant related ?? - map_element->type &= ~(1 << 6); + if (i == 0 && output_element != NULL) { + *output_element = mapElement; } - - if (flags & (1 << 1)){ - // Quadrant related ?? - map_element->type |= (1 << 6); + if (flags & (1 << 0)) { + // Switch highlight off + mapElement->type &= ~MAP_ELEMENT_TYPE_FLAG_HIGHLIGHT; } - - if (flags & (1 << 2)){ - map_element->properties.track.colour &= 0xFC; - map_element->properties.track.colour |= extra_params & 0xFF; + if (flags & (1 << 1)) { + // Switch highlight on + mapElement->type |= MAP_ELEMENT_TYPE_FLAG_HIGHLIGHT; } - - if (flags & (1 << 5)){ - map_element->properties.track.colour &= 0x0F; - map_element->properties.track.colour |= (extra_params & 0xFF) << 4; + if (flags & (1 << 2)) { + mapElement->properties.track.colour &= 0xFC; + mapElement->properties.track.colour |= extra_params & 0xFF; } - - if (flags & (1 << 3)){ - map_element->properties.track.colour |= (1 << 3); + if (flags & (1 << 5)) { + // Seat rotation + mapElement->properties.track.colour &= 0x0F; + mapElement->properties.track.colour |= (extra_params & 0xFF) << 4; } - - if (flags & (1 << 4)){ - map_element->properties.track.colour &= 0xF7; + if (flags & (1 << 3)) { + mapElement->properties.track.colour |= (1 << 3); + } + if (flags & (1 << 4)) { + mapElement->properties.track.colour &= 0xF7; } } return 0; } +/** + * + * rct2: 0x006C6096 + */ +rct_map_element *sub_6C6096(int *x, int *y, int *z, int *direction, int *direction2) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + eax = *x; + ecx = *y; + edx = *z; + ebx = *direction; + if (RCT2_CALLFUNC_X(0x006C6096, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) + return NULL; + + *x = (eax & 0xFFFF); + *y = (ecx & 0xFFFF); + *z = (edx & 0xFFFF); + *direction = (ebx & 0xFF); + if (direction2 != NULL) *direction2 = ((ebx >> 8) & 0xFF); + + return (rct_map_element*)esi; +} + +/** + * Returns the begin position / direction and end position / direction of the track piece that procedes the given location. + * rct2: 0x006C63D6 + */ +bool sub_6C63D6(int inX, int inY, int inZ, int inDirection, track_begin_end *outTrackBeginEnd) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + eax = inX; + ecx = inY; + edx = inZ; + ebx = inDirection; + if (RCT2_CALLFUNC_X(0x006C63D6, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) + return false; + + if (outTrackBeginEnd != NULL) { + outTrackBeginEnd->begin_x = ((eax >> 16) & 0xFFFF); + outTrackBeginEnd->begin_y = ((ecx >> 16) & 0xFFFF); + outTrackBeginEnd->begin_z = (edx & 0xFFFF); + outTrackBeginEnd->begin_direction = ((ebx >> 8) & 0xFF); + outTrackBeginEnd->begin_element = (rct_map_element*)esi; + outTrackBeginEnd->end_x = (eax & 0xFFFF); + outTrackBeginEnd->end_y = (ecx & 0xFFFF); + outTrackBeginEnd->end_direction = (ebx & 0xFF); + } + return true; +} + +/** + * + * rct2: 0x006C96C0 + */ void sub_6C96C0() { - RCT2_CALLPROC_X(0x006C96C0, 0, 0, 0, 0, 0, 0, 0); + // RCT2_CALLPROC_X(0x006C96C0, 0, 0, 0, 0, 0, 0, 0); return; + + rct_ride *ride; + rct_map_element *trackElement; + int rideIndex, x, y, z, direction; + + if (_currentTrackSelectionFlags & 4) { + _currentTrackSelectionFlags &= ~4; + game_do_command( + RCT2_GLOBAL(0x00F440BF, uint16), + 41, + RCT2_GLOBAL(0x00F440C1, uint16), + _currentRideIndex, + GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT, + RCT2_GLOBAL(0x00F440C4, uint8), + 0 + ); + } + if (_currentTrackSelectionFlags & 2) { + _currentTrackSelectionFlags &= ~2; + + rideIndex = _currentRideIndex; + RCT2_GLOBAL(0x00F441D2, uint8) = rideIndex; + + x = RCT2_GLOBAL(0x00F440C5, uint16); + y = RCT2_GLOBAL(0x00F440C7, uint16); + z = RCT2_GLOBAL(0x00F440C9, uint16); + + ride = GET_RIDE(rideIndex); + if (ride->type == RIDE_TYPE_MAZE) { + game_do_command(x , 41 | (0 << 8), y , rideIndex | (2 << 8), GAME_COMMAND_38, z, 0); + game_do_command(x , 41 | (1 << 8), y + 16, rideIndex | (2 << 8), GAME_COMMAND_38, z, 0); + game_do_command(x + 16, 41 | (2 << 8), y + 16, rideIndex | (2 << 8), GAME_COMMAND_38, z, 0); + game_do_command(x + 16, 41 | (3 << 8), y , rideIndex | (2 << 8), GAME_COMMAND_38, z, 0); + } else { + direction = RCT2_GLOBAL(0x00F440CB, uint8); + if (!(direction & 4)) { + x -= TileDirectionDelta[direction].x; + y -= TileDirectionDelta[direction].y; + } + trackElement = sub_6C6096(&x, &y, &z, &direction, NULL); + if (trackElement != NULL) { + game_do_command( + x, + 105 | ((direction & 3) << 8), + y, + trackElement->properties.track.type | ((trackElement->properties.track.sequence & 0x0F) << 8), + GAME_COMMAND_REMOVE_TRACK, + z, + 0 + ); + } + } + } } void sub_6C9627() { - switch (RCT2_GLOBAL(0x00F440A6, uint8)) { - case 3: - { - int x = RCT2_GLOBAL(0x00F440A8, uint16), y = RCT2_GLOBAL(0x00F440AA, uint16), z = RCT2_GLOBAL(0x00F440AC, uint16); + int x, y, z; + + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_SELECTED: + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; sub_6C683D( &x, &y, &z, - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) & 3, - RCT2_GLOBAL(0x00F440AF, uint8), - 0, + _currentTrackPieceDirection & 3, + _currentTrackPieceType, 0, + NULL, 1 - ); - } + ); break; - case 6: - case 7: - case 8: - if (RCT2_GLOBAL(0x00F440B0, uint8) & 1) { + case RIDE_CONSTRUCTION_STATE_6: + case RIDE_CONSTRUCTION_STATE_7: + case RIDE_CONSTRUCTION_STATE_8: + if (_currentTrackSelectionFlags & 1) { map_invalidate_tile_full( - RCT2_GLOBAL(0x00F440A8, uint16) & 0xFFE0, - RCT2_GLOBAL(0x00F440AA, uint16) & 0xFFE0 + _currentTrackBeginX & 0xFFE0, + _currentTrackBeginY & 0xFFE0 ); RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~4; } break; default: - if (RCT2_GLOBAL(0x00F440B0, uint8) & 1) { - RCT2_GLOBAL(0x00F440B0, uint8) &= ~1; + if (_currentTrackSelectionFlags & 1) { + _currentTrackSelectionFlags &= ~1; RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint8) &= ~4; - map_invalidate_tile_full(RCT2_GLOBAL(0x00F440A8, uint16), RCT2_GLOBAL(0x00F440AA, uint16)); + map_invalidate_tile_full(_currentTrackBeginX, _currentTrackBeginY); } sub_6C96C0(); break; } } +/** + * + * rct2: 0x006C9800 + */ +void sub_6C9800() +{ + RCT2_CALLPROC_EBPSAFE(0x006C9800); +} + /** * * rct2: 0x006C9296 */ -static void sub_6C9296() +void ride_select_next_section() { - RCT2_CALLPROC_X(0x006C9296, 0, 0, 0, 0, 0, 0, 0); + int x, y, z, direction, type; + rct_map_element *mapElement; + rct_xy_element inputElement, outputElement; + + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + sub_6C9627(); + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection; + type = _currentTrackPieceType; + if (sub_6C683D(&x, &y, &z, direction & 3, type, 0, &mapElement, 0)) { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_0; + sub_6C84CE(); + return; + } + inputElement.x = x; + inputElement.y = y; + inputElement.element = mapElement; + if (track_get_next(&inputElement, &outputElement, &z, &direction)) { + x = outputElement.x; + y = outputElement.y; + mapElement = outputElement.element; + } else { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_FRONT; + _currentTrackBeginX = outputElement.x; + _currentTrackBeginY = outputElement.y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = direction; + _currentTrackPieceType = mapElement->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + sub_6C9800(); + sub_6C84CE(); + return; + } + + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = (mapElement->type & MAP_ELEMENT_DIRECTION_MASK); + _currentTrackPieceType = mapElement->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + sub_6C84CE(); + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + if (ride_select_forwards_from_back()) { + sub_6C84CE(); + } + } } /** * * rct2: 0x006C93B8 */ -static void sub_6C93B8() +void ride_select_previous_section() { - RCT2_CALLPROC_X(0x006C93B8, 0, 0, 0, 0, 0, 0, 0); + int x, y, z, direction, type; + rct_map_element *mapElement; + track_begin_end trackBeginEnd; + + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + sub_6C9627(); + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection; + type = _currentTrackPieceType; + if (sub_6C683D(&x, &y, &z, direction & 3, type, 0, &mapElement, 0)) { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_0; + sub_6C84CE(); + return; + } + if (track_get_previous(x, y, mapElement, &trackBeginEnd)) { + _currentTrackBeginX = trackBeginEnd.begin_x; + _currentTrackBeginY = trackBeginEnd.begin_y; + _currentTrackBeginZ = trackBeginEnd.begin_z; + _currentTrackPieceDirection = trackBeginEnd.begin_direction; + _currentTrackPieceType = trackBeginEnd.begin_element->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + sub_6C84CE(); + } else { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_BACK; + _currentTrackBeginX = trackBeginEnd.end_x; + _currentTrackBeginY = trackBeginEnd.end_y; + _currentTrackBeginZ = trackBeginEnd.begin_z; + _currentTrackPieceDirection = trackBeginEnd.end_direction; + _currentTrackPieceType = mapElement->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + sub_6C9800(); + sub_6C84CE(); + } + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) { + if (ride_select_backwards_from_front()) { + sub_6C84CE(); + } + } } /** @@ -1038,7 +1243,7 @@ static int ride_modify_entrance_or_exit(rct_map_element *mapElement, int x, int sub_6C9627(); if ( - RCT2_GLOBAL(0x00F440A6, uint8) != 5 || + _rideConstructionState != RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT || !(RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint8) & INPUT_FLAG_TOOL_ACTIVE) || RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) != WC_RIDE_CONSTRUCTION ) { @@ -1048,17 +1253,16 @@ static int ride_modify_entrance_or_exit(rct_map_element *mapElement, int x, int RCT2_GLOBAL(0x00F44192, uint8) = rideIndex; RCT2_GLOBAL(0x00F44193, uint8) = bl; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint8) |= INPUT_FLAG_6; - int al = RCT2_GLOBAL(0x00F440A6, uint8); - if (al != 5) { - RCT2_GLOBAL(0x00F440A6, uint8) = 5; - RCT2_GLOBAL(0x00F440CC, uint8) = al; + if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT) { + RCT2_GLOBAL(0x00F440CC, uint8) = _rideConstructionState; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT; } sub_6C84CE(); RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~2; } else { // Remove entrance / exit - game_do_command(x, 9, y, rideIndex, GAME_COMMAND_13, bl, 0); + game_do_command(x, 9, y, rideIndex, GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT, bl, 0); RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) = entranceType == ENTRANCE_TYPE_RIDE_ENTRANCE ? 29 : 30; RCT2_GLOBAL(0x00F44191, uint8) = entranceType; } @@ -1073,13 +1277,13 @@ static int ride_modify_entrance_or_exit(rct_map_element *mapElement, int x, int */ int ride_modify_maze(rct_map_element *mapElement, int x, int y) { - RCT2_GLOBAL(0x00F440A7, uint8) = mapElement->properties.track.ride_index; - RCT2_GLOBAL(0x00F440A6, uint8) = 6; - RCT2_GLOBAL(0x00F440A8, uint16) = x; - RCT2_GLOBAL(0x00F440AA, uint16) = y; - RCT2_GLOBAL(0x00F440AC, uint16) = mapElement->base_height * 8; - RCT2_GLOBAL(0x00F440B0, uint8) = 0; - RCT2_GLOBAL(0x00F440B1, uint8) = 0; + _currentRideIndex = mapElement->properties.track.ride_index; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_6; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = mapElement->base_height * 8; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; RCT2_CALLPROC_X(0x006CD887, 0, 0, 0, 0, 0, 0, 0); return 1; } @@ -1139,50 +1343,50 @@ int ride_modify(rct_xy_element *input) direction = mapElement.element->type & 3; type = mapElement.element->properties.track.type; - if (sub_6C683D(&x, &y, &z, direction, type, 0, 0, 0)) + if (sub_6C683D(&x, &y, &z, direction, type, 0, NULL, 0)) return 0; - RCT2_GLOBAL(0x00F440A7, uint8) = rideIndex; - RCT2_GLOBAL(0x00F440A6, uint8) = 3; - RCT2_GLOBAL(0x00F440A8, uint16) = x; - RCT2_GLOBAL(0x00F440AA, uint16) = y; - RCT2_GLOBAL(0x00F440AC, uint16) = z; - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = direction; - RCT2_GLOBAL(0x00F440AF, uint8) = type; - RCT2_GLOBAL(0x00F440B0, uint8) = 0; - RCT2_GLOBAL(0x00F440B1, uint8) = 0; + _currentRideIndex = rideIndex; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = direction; + _currentTrackPieceType = type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_15)) { sub_6C84CE(); return 1; } - sub_6C9296(); - if (RCT2_GLOBAL(0x00F440A6, uint8) == 1) { + ride_select_next_section(); + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) { sub_6C84CE(); return 1; } - RCT2_GLOBAL(0x00F440A6, uint8) = 3; - RCT2_GLOBAL(0x00F440A8, uint16) = x; - RCT2_GLOBAL(0x00F440AA, uint16) = y; - RCT2_GLOBAL(0x00F440AC, uint16) = z; - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = direction; - RCT2_GLOBAL(0x00F440AF, uint8) = type; - RCT2_GLOBAL(0x00F440B0, uint8) = 0; - RCT2_GLOBAL(0x00F440B1, uint8) = 0; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = direction; + _currentTrackPieceType = type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; - sub_6C93B8(); + ride_select_previous_section(); - if (RCT2_GLOBAL(0x00F440A6, uint8) != 2) { - RCT2_GLOBAL(0x00F440A6, uint8) = 3; - RCT2_GLOBAL(0x00F440A8, uint16) = x; - RCT2_GLOBAL(0x00F440AA, uint16) = y; - RCT2_GLOBAL(0x00F440AC, uint16) = z; - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = direction; - RCT2_GLOBAL(0x00F440AF, uint8) = type; - RCT2_GLOBAL(0x00F440B0, uint8) = 0; - RCT2_GLOBAL(0x00F440B1, uint8) = 0; + if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_BACK) { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = direction; + _currentTrackPieceType = type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; } sub_6C84CE(); @@ -1212,24 +1416,24 @@ int sub_6CC3FB(int rideIndex) tool_set(w, 23, 12); RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) |= INPUT_FLAG_6; - ride = GET_RIDE(RCT2_GLOBAL(0x00F440A7, uint8)); + ride = GET_RIDE(_currentRideIndex); - RCT2_GLOBAL(0x00F440A0, uint16) = RCT2_ADDRESS(0x0097CC68, uint8)[ride->type * 2] | 0x100; - RCT2_GLOBAL(0x00F440B2, uint8) = 0; + _currentTrackCurve = RCT2_ADDRESS(0x0097CC68, uint8)[ride->type * 2] | 0x100; + _currentTrackSlopeEnd = 0; RCT2_GLOBAL(0x00F440B3, uint8) = 0; - RCT2_GLOBAL(0x00F440B4, uint8) = 0; - RCT2_GLOBAL(0x00F440B5, uint8) = 0; + _currentTrackLiftHill = 0; + _currentTrackCovered = 0; if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x8000) - RCT2_GLOBAL(0x00F440B5, uint8) |= 2; + _currentTrackCovered |= 2; - RCT2_GLOBAL(0x00F440B6, uint8) = 0; - RCT2_GLOBAL(0x00F440B7, uint8) = 0; + _previousTrackBankEnd = 0; + _previousTrackSlopeEnd = 0; - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = 0; - RCT2_GLOBAL(0x00F440A6, uint8) = 4; - RCT2_GLOBAL(0x00F440B0, uint8) = 0; - RCT2_GLOBAL(0x00F440B1, uint8) = 0; + _currentTrackPieceDirection = 0; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_PLACE; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; RCT2_GLOBAL(0x00F44159, uint8) = 0; RCT2_GLOBAL(0x00F4415C, uint8) = 0; @@ -3339,12 +3543,12 @@ int ride_check_block_brakes(rct_xy_element *input, rct_xy_element *output) trackElement = *input; rideIndex = trackElement.element->properties.track.ride_index; w = window_find_by_class(WC_RIDE_CONSTRUCTION); - if (w != NULL && RCT2_GLOBAL(0x00F440A6, uint8) != 0 && RCT2_GLOBAL(0x00F440A7, uint8) == rideIndex) + if (w != NULL && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && _currentRideIndex == rideIndex) sub_6C9627(); loopTrackElement = NULL; while (1) { - if (!track_get_next(&trackElement, &nextTrackElement)) { + if (!track_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { // Not sure why this is the case... RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_BLOCK_BRAKES_CANNOT_BE_USED_DIRECTLY_AFTER_STATION; *output = trackElement; @@ -3502,7 +3706,7 @@ void sub_6B4D26(int rideIndex, rct_xy_element *startElement) currentElement.element->flags &= ~(1 << 5); break; } - } while (track_get_next(¤tElement, ¤tElement) && currentElement.element != startElement->element); + } while (track_get_next(¤tElement, ¤tElement, NULL, NULL) && currentElement.element != startElement->element); } } @@ -4091,7 +4295,7 @@ int ride_get_refund_price(int ride_id) }else{ edx |= 0xFF << 8; edx &= ((map_element->properties.track.sequence & 0xF) << 8) | 0xFF; - RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_4, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_REMOVE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); } y -= 32; break; @@ -4509,7 +4713,6 @@ void ride_all_has_any_track_elements(bool *rideIndexArray) } } - /* rct2: 0x006847BA */ void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int num_images){ char bitmap[200][200] = { 0 }; @@ -4590,4 +4793,115 @@ void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int n vehicle_type->var_0E = al; vehicle_type->var_0F = bl; vehicle_type->var_10 = bh; +} + +/** + * + * rct2: 0x006CA28C + */ +money32 ride_get_entrance_or_exit_price(int rideIndex, int x, int y, int direction, int dh, int di) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + eax = x; + ebx = direction << 8; + ecx = y; + edx = rideIndex | (dh << 8); + edi = di; + RCT2_CALLFUNC_X(0x006CA28C, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + return ebx; + +} + +/** + * + * rct2: 0x006CCF70 + */ +void ride_get_entrance_or_exit_position_from_screen_position(int x, int y, int *outX, int *outY, int *outDirection) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + eax = x; + ebx = y; + RCT2_CALLFUNC_X(0x006CCF70, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + + if (outX != NULL) *outX = eax & 0xFFFF; + if (outY != NULL) *outY = ecx & 0xFFFF; + if (outDirection != NULL) *outDirection = ebx & 0xFF; +} + +bool ride_select_backwards_from_front() +{ + track_begin_end trackBeginEnd; + + sub_6C9627(); + RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex; + if (sub_6C63D6(_currentTrackBeginX, _currentTrackBeginY, _currentTrackBeginZ, _currentTrackPieceDirection, &trackBeginEnd)) { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + _currentTrackBeginX = trackBeginEnd.begin_x; + _currentTrackBeginY = trackBeginEnd.begin_y; + _currentTrackBeginZ = trackBeginEnd.begin_z; + _currentTrackPieceDirection = trackBeginEnd.begin_direction; + _currentTrackPieceType = trackBeginEnd.begin_element->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + return true; + } else { + return false; + } +} + +bool ride_select_forwards_from_back() +{ + rct_map_element *mapElement; + int x, y, z, direction; + + sub_6C9627(); + RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex; + + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection ^ 2; + mapElement = sub_6C6096(&x, &y, &z, &direction, NULL); + if (mapElement != NULL) { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = (mapElement->type & MAP_ELEMENT_DIRECTION_MASK); + _currentTrackPieceType = mapElement->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + return true; + } else { + return false; + } +} + +money32 ride_remove_track_piece(int x, int y, int z, int direction, int type) +{ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS; + return game_do_command(x, (GAME_COMMAND_FLAG_APPLY) | ((direction & 3) << 8), y, type, GAME_COMMAND_REMOVE_TRACK, z, 0); +} + +/** + * + * rct2: 0x006B58EF + */ +bool ride_are_all_possible_entrances_and_exits_built(rct_ride *ride) +{ + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) + return true; + + for (int i = 0; i < 4; i++) { + if (ride->station_starts[i] == 0xFFFF) continue; + if (ride->entrances[i] == 0xFFFF) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_ENTRANCE_NOT_YET_BUILT; + return false; + } + if (ride->exits[i] == 0xFFFF) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_EXIT_NOT_YET_BUILT; + return false; + } + } + return true; } \ No newline at end of file diff --git a/src/ride/ride.h b/src/ride/ride.h index 89e4217418..c367858517 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -21,6 +21,7 @@ #ifndef _RIDE_H_ #define _RIDE_H_ +#include "../addresses.h" #include "../common.h" #include "../peep/peep.h" #include "../world/map.h" @@ -343,6 +344,18 @@ typedef struct { uint8 altitude[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x384C } rct_ride_measurement; +typedef struct { + int begin_x; + int begin_y; + int begin_z; + int begin_direction; + rct_map_element *begin_element; + int end_x; + int end_y; + int end_direction; + rct_map_element *end_element; +} track_begin_end; + enum { RIDE_CLASS_RIDE, RIDE_CLASS_SHOP_OR_STALL, @@ -747,6 +760,18 @@ enum { RIDE_CRASH_TYPE_FATALITIES = 8 }; +enum { + RIDE_CONSTRUCTION_STATE_0, + RIDE_CONSTRUCTION_STATE_FRONT, + RIDE_CONSTRUCTION_STATE_BACK, + RIDE_CONSTRUCTION_STATE_SELECTED, + RIDE_CONSTRUCTION_STATE_PLACE, + RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT, + RIDE_CONSTRUCTION_STATE_6, + RIDE_CONSTRUCTION_STATE_7, + RIDE_CONSTRUCTION_STATE_8 +}; + #define MAX_RIDES 255 #define MAX_RIDE_MEASUREMENTS 8 @@ -776,6 +801,43 @@ extern rct_ride* g_ride_list; extern const uint8 gRideClassifications[255]; + +// Macros for very commonly used varaibles, eventually will be changed to locals or globals +#define _enabledRidePieces RCT2_GLOBAL(0x00F44048, uint64) +#define _enabledRidePiecesA RCT2_GLOBAL(0x00F44048, uint32) +#define _enabledRidePiecesB RCT2_GLOBAL(0x00F4404C, uint32) + +#define _currentTrackPrice RCT2_GLOBAL(0x00F44070, money32) + +#define _numCurrentPossibleRideConfigurations RCT2_GLOBAL(0x00F44078, uint16) +#define _numCurrentPossibleSpecialTrackPieces RCT2_GLOBAL(0x00F4407A, uint16) + +#define _currentTrackCurve RCT2_GLOBAL(0x00F440A0, uint16) +#define _currentTrackEndX RCT2_GLOBAL(0x00F440A2, uint16) +#define _currentTrackEndY RCT2_GLOBAL(0x00F440A4, uint16) +#define _rideConstructionState RCT2_GLOBAL(0x00F440A6, uint8) +#define _currentRideIndex RCT2_GLOBAL(0x00F440A7, uint8) +#define _currentTrackBeginX RCT2_GLOBAL(0x00F440A8, uint16) +#define _currentTrackBeginY RCT2_GLOBAL(0x00F440AA, uint16) +#define _currentTrackBeginZ RCT2_GLOBAL(0x00F440AC, uint16) +#define _currentTrackPieceDirection RCT2_GLOBAL(0x00F440AE, uint8) +#define _currentTrackPieceType RCT2_GLOBAL(0x00F440AF, uint8) +#define _currentTrackSelectionFlags RCT2_GLOBAL(0x00F440B0, uint8) +#define _rideConstructionArrowPulseTime RCT2_GLOBAL(0x00F440B1, sint8) +#define _currentTrackSlopeEnd RCT2_GLOBAL(0x00F440B2, uint8) +#define _currentTrackBankEnd RCT2_GLOBAL(0x00F440B3, uint8) +#define _currentTrackLiftHill RCT2_GLOBAL(0x00F440B4, uint8) +#define _currentTrackCovered RCT2_GLOBAL(0x00F440B5, uint8) + +#define _previousTrackBankEnd RCT2_GLOBAL(0x00F440B6, uint8) +#define _previousTrackSlopeEnd RCT2_GLOBAL(0x00F440B7, uint8) + +#define _previousTrackPieceX RCT2_GLOBAL(0x00F440B9, uint16) +#define _previousTrackPieceY RCT2_GLOBAL(0x00F440BB, uint16) +#define _previousTrackPieceZ RCT2_GLOBAL(0x00F440BD, uint16) + +#define _currentSeatRotationAngle RCT2_GLOBAL(0x00F440CF, uint8) + int ride_get_count(); int ride_get_total_queue_length(rct_ride *ride); int ride_get_max_queue_time(rct_ride *ride); @@ -787,7 +849,6 @@ void ride_check_all_reachable(); void ride_update_satisfaction(rct_ride* ride, uint8 happiness); void ride_update_popularity(rct_ride* ride, uint8 pop_amount); int sub_6CAF80(int rideIndex, rct_xy_element *output); -int track_get_next(rct_xy_element *input, rct_xy_element *output); int ride_find_track_gap(rct_xy_element *input, rct_xy_element *output); void ride_construct_new(ride_list_item listItem); void ride_construct(int rideIndex); @@ -828,6 +889,9 @@ void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *es void ride_clear_for_construction(int rideIndex); void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int num_images); +void ride_select_next_section(); +void ride_select_previous_section(); + int get_var_10E_unk_1(rct_ride* ride); int get_var_10E_unk_2(rct_ride* ride); int get_var_10E_unk_3(rct_ride* ride); @@ -852,4 +916,24 @@ bool ride_is_powered_launched(rct_ride *ride); bool ride_has_any_track_elements(int rideIndex); void ride_all_has_any_track_elements(bool *rideIndexArray); +void sub_6C9800(); + +bool track_get_next(rct_xy_element *input, rct_xy_element *output, int *z, int *direction); +bool track_get_previous(int x, int y, rct_map_element *mapElement, track_begin_end *outTrackBeginEnd); + +rct_map_element *sub_6C6096(int *x, int *y, int *z, int *direction, int *direction2); +bool sub_6C63D6(int inX, int inY, int inZ, int inDirection, track_begin_end *outTrackBeginEnd); + +void sub_6C84CE(); +void sub_6C96C0(); +money32 ride_get_entrance_or_exit_price(int rideIndex, int x, int y, int direction, int dh, int di); +void ride_get_entrance_or_exit_position_from_screen_position(int x, int y, int *outX, int *outY, int *outDirection); + +bool ride_select_backwards_from_front(); +bool ride_select_forwards_from_back(); + +money32 ride_remove_track_piece(int x, int y, int z, int direction, int type); + +bool ride_are_all_possible_entrances_and_exits_built(rct_ride *ride); + #endif diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index ed26aac9d2..a74aa81263 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -51,21 +51,6 @@ static void loc_6B5BB2(); static void ride_ratings_calculate(rct_ride *ride); static void ride_ratings_calculate_value(rct_ride *ride); -int sub_6C6402(rct_map_element **mapElement, int *x, int *y, int *z) -{ - int eax, ebx, ecx, edx, esi, edi, ebp; - - eax = *x; - ecx = *y; - esi = (int)*mapElement; - int result = RCT2_CALLFUNC_X(0x006C6402, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - *x = *((uint16*)&eax); - *y = *((uint16*)&ecx); - *z = *((uint8*)&edx); - *mapElement = (rct_map_element*)esi; - return result & (0x100); -} - /** * * rct2: 0x006B5A2A @@ -245,7 +230,7 @@ static void ride_ratings_update_state_2() trackElement.x = RCT2_GLOBAL(0x0138B584, uint16); trackElement.y = RCT2_GLOBAL(0x0138B586, uint16); trackElement.element = mapElement; - if (!track_get_next(&trackElement, &nextTrackElement)) { + if (!track_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { _rideRatingsState = RIDE_RATINGS_STATE_4; return; } @@ -339,7 +324,7 @@ static void ride_ratings_update_state_5() x = RCT2_GLOBAL(0x0138B584, uint16); y = RCT2_GLOBAL(0x0138B586, uint16); - if (!sub_6C6402(&mapElement, &x, &y, &z)) { + if (!track_get_previous(x, y, mapElement, NULL)) { _rideRatingsState = RIDE_RATINGS_STATE_CALCULATE; return; } diff --git a/src/ride/ride_ratings.h b/src/ride/ride_ratings.h index 467b2c23a8..5baa99e2e9 100644 --- a/src/ride/ride_ratings.h +++ b/src/ride/ride_ratings.h @@ -25,6 +25,5 @@ #include "ride.h" void ride_ratings_update_all(); -int sub_6C6402(rct_map_element **mapElement, int *x, int *y, int *z); #endif \ No newline at end of file diff --git a/src/ride/track.c b/src/ride/track.c index 38cc18f3b9..0f73007b47 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -47,193 +47,193 @@ const rct_trackdefinition *gTrackDefinitions = (rct_trackdefinition*)0x00997C9D; // TODO This table is incorrect or at least missing 69 elements. There should be 256 in total! const rct_trackdefinition gTrackDefinitions_INCORRECT[] = { // TYPE VANGLE END VANGLE START BANK END BANK START SPECIAL - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_END_STATION - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BEGIN_STATION - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_MIDDLE_STATION - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_UP - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_60_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_25_DEG_UP - { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_FLAT - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_FLAT - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_RIGHT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_FLAT - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_FLAT - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_25_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_25_DEG_UP - { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_RIGHT_BANK - { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_RIGHT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN - { TRACK_S_BEND, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_LEFT - { TRACK_S_BEND, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_RIGHT - { TRACK_VERTICAL_LOOP, TRACK_DOWN_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_UNKNOWN_VERTICAL_LOOP }, // ELEM_LEFT_VERTICAL_LOOP - { TRACK_VERTICAL_LOOP, TRACK_DOWN_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_UNKNOWN_VERTICAL_LOOP }, // ELEM_RIGHT_VERTICAL_LOOP - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE - { TRACK_TWIST, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_TWIST_DOWN_TO_UP - { TRACK_TWIST, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_TWIST_DOWN_TO_UP - { TRACK_TWIST, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_LEFT_TWIST_UP_TO_DOWN - { TRACK_TWIST, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_RIGHT_TWIST_UP_TO_DOWN - { TRACK_HALF_LOOP, TRACK_NONE, TRACK_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_HALF_LOOP_UP - { TRACK_HALF_LOOP, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_HALF_LOOP_DOWN - { TRACK_CORKSCREW, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_CORKSCREW_UP - { TRACK_CORKSCREW, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_CORKSCREW_UP - { TRACK_CORKSCREW, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_CORKSCREW_DOWN }, // ELEM_LEFT_CORKSCREW_DOWN - { TRACK_CORKSCREW, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_CORKSCREW_DOWN }, // ELEM_RIGHT_CORKSCREW_DOWN - { TRACK_FLAT, TRACK_UP_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_UP - { TRACK_FLAT, TRACK_NONE, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT - { TRACK_FLAT, TRACK_DOWN_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_DOWN - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_END_STATION + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BEGIN_STATION + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_MIDDLE_STATION + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_RIGHT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_RIGHT_BANK + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_RIGHT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN + { TRACK_S_BEND, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_LEFT + { TRACK_S_BEND, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_RIGHT + { TRACK_VERTICAL_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_UNKNOWN_VERTICAL_LOOP }, // ELEM_LEFT_VERTICAL_LOOP + { TRACK_VERTICAL_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_UNKNOWN_VERTICAL_LOOP }, // ELEM_RIGHT_VERTICAL_LOOP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE + { TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_TWIST_DOWN_TO_UP + { TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_TWIST_DOWN_TO_UP + { TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_LEFT_TWIST_UP_TO_DOWN + { TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_RIGHT_TWIST_UP_TO_DOWN + { TRACK_HALF_LOOP, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_HALF_LOOP_UP + { TRACK_HALF_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_HALF_LOOP_DOWN + { TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_CORKSCREW_UP + { TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_CORKSCREW_UP + { TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_CORKSCREW_DOWN }, // ELEM_LEFT_CORKSCREW_DOWN + { TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_CORKSCREW_DOWN }, // ELEM_RIGHT_CORKSCREW_DOWN + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_FLAT { TRACK_TOWER_BASE, TRACK_VANGLE_TOWER, TRACK_VANGLE_TOWER, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_TOWER_BASE { TRACK_TOWER_BASE, TRACK_VANGLE_TOWER, TRACK_VANGLE_TOWER, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_TOWER_SECTION - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_COVERED - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_COVERED - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_COVERED - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_UP_COVERED - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_FLAT_COVERED - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_COVERED - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_COVERED - { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_DOWN_COVERED - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_FLAT_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_LEFT_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_RIGHT_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN - { TRACK_BRAKES, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BRAKES - { TRACK_ROTATION_CONTROL_TOGGLE,TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_ROTATION_CONTROL_TOGGLE - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP - { TRACK_HELIX_LARGE, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP - { TRACK_HELIX_LARGE, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_UP - { TRACK_HELIX_LARGE, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_DOWN - { TRACK_HELIX_LARGE, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_DOWN - { TRACK_HELIX_LARGE_UNBANKED, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_HELIX_LARGE_UP - { TRACK_HELIX_LARGE_UNBANKED, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_UP - { TRACK_HELIX_LARGE_UNBANKED, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_HELIX_LARGE_DOWN - { TRACK_HELIX_LARGE_UNBANKED, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_DOWN - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_25_DEG_UP_LEFT_BANKED - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_25_DEG_UP_RIGHT_BANKED - { TRACK_WATERFALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WATERFALL - { TRACK_RAPIDS, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RAPIDS - { TRACK_ON_RIDE_PHOTO, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_ON_RIDE_PHOTO - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_25_DEG_DOWN_LEFT_BANKED - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_25_DEG_DOWN_RIGHT_BANKED - { TRACK_WATER_SPLASH, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WATER_SPLASH - { TRACK_FLAT, TRACK_UP_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_UP_LONG_BASE - { TRACK_FLAT, TRACK_NONE, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE - { TRACK_WHIRLPOOL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WHIRLPOOL - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE - { TRACK_FLAT, TRACK_DOWN_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE - { TRACK_LIFT_HILL, TRACK_DOWN_60, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_CABLE_LIFT_HILL - { TRACK_WHOA_BELLY, TRACK_VANGLE_WHOA_BELLY, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_REVERSE_WHOA_BELLY_SLOPE + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_COVERED + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_COVERED + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_COVERED + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_UP_COVERED + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_FLAT_COVERED + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_COVERED + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_COVERED + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_DOWN_COVERED + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_FLAT_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_LEFT_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_RIGHT_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN + { TRACK_BRAKES, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BRAKES + { TRACK_ROTATION_CONTROL_TOGGLE,TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_ROTATION_CONTROL_TOGGLE + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP + { TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP + { TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_UP + { TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_DOWN + { TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_DOWN + { TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_HELIX_LARGE_UP + { TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_UP + { TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_HELIX_LARGE_DOWN + { TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_DOWN + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_25_DEG_UP_LEFT_BANKED + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_25_DEG_UP_RIGHT_BANKED + { TRACK_WATERFALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WATERFALL + { TRACK_RAPIDS, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RAPIDS + { TRACK_ON_RIDE_PHOTO, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_ON_RIDE_PHOTO + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_25_DEG_DOWN_LEFT_BANKED + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_25_DEG_DOWN_RIGHT_BANKED + { TRACK_WATER_SPLASH, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WATER_SPLASH + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_UP_LONG_BASE + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE + { TRACK_WHIRLPOOL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WHIRLPOOL + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE + { TRACK_LIFT_HILL, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_CABLE_LIFT_HILL + { TRACK_WHOA_BELLY, TRACK_VANGLE_WHOA_BELLY, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_REVERSE_WHOA_BELLY_SLOPE { TRACK_WHOA_BELLY, TRACK_VANGLE_WHOA_BELLY, TRACK_VANGLE_WHOA_BELLY, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_REVERSE_WHOA_BELLY_VERTICAL - { TRACK_FLAT, TRACK_UP_90, TRACK_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_UP - { TRACK_FLAT, TRACK_DOWN_90, TRACK_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_DOWN - { TRACK_FLAT, TRACK_UP_90, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_90_DEG_UP - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_DOWN_TO_60_DEG_DOWN - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_UP_TO_60_DEG_UP - { TRACK_FLAT, TRACK_DOWN_90, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_90_DEG_DOWN - { TRACK_BRAKE_FOR_DROP, TRACK_DOWN_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BRAKE_FOR_DROP - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_EIGHTH_TO_DIAG - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_TO_DIAG - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_EIGHTH_TO_ORTHOGONAL - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_EIGHTH_BANK_TO_DIAG - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_BANK_TO_DIAG - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_25_DEG_UP - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP - { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_FLAT - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_FLAT - { TRACK_FLAT, TRACK_UP_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_60_DEG_UP - { TRACK_FLAT, TRACK_NONE, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP_TO_FLAT - { TRACK_FLAT, TRACK_DOWN_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_60_DEG_DOWN - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN_TO_FLAT - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_RIGHT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_FLAT - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_FLAT - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP - { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK - { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK - { TRACK_LOG_FLUME_REVERSER, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LOG_FLUME_REVERSER - { TRACK_SPINNING_TUNNEL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_SPINNING_TUNNEL - { TRACK_BARREL_ROLL, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_BARREL_ROLL_UP_TO_DOWN - { TRACK_BARREL_ROLL, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_BARREL_ROLL_UP_TO_DOWN - { TRACK_BARREL_ROLL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_LEFT_BARREL_ROLL_DOWN_TO_UP - { TRACK_BARREL_ROLL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_RIGHT_BARREL_ROLL_DOWN_TO_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK - { TRACK_POWERED_LIFT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_POWERED_LIFT - { TRACK_HALF_LOOP_2, TRACK_NONE, TRACK_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_LEFT_LARGE_HALF_LOOP_UP - { TRACK_HALF_LOOP_2, TRACK_NONE, TRACK_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_RIGHT_LARGE_HALF_LOOP_UP - { TRACK_HALF_LOOP_2, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_RIGHT_LARGE_HALF_LOOP_DOWN - { TRACK_HALF_LOOP_2, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_LEFT_LARGE_HALF_LOOP_DOWN + { TRACK_FLAT, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_90_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_DOWN_TO_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_UP_TO_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_90_DEG_DOWN + { TRACK_BRAKE_FOR_DROP, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BRAKE_FOR_DROP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_EIGHTH_TO_DIAG + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_TO_DIAG + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_EIGHTH_TO_ORTHOGONAL + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_EIGHTH_BANK_TO_DIAG + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_BANK_TO_DIAG + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_RIGHT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK + { TRACK_LOG_FLUME_REVERSER, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LOG_FLUME_REVERSER + { TRACK_SPINNING_TUNNEL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_SPINNING_TUNNEL + { TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_BARREL_ROLL_UP_TO_DOWN + { TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_BARREL_ROLL_UP_TO_DOWN + { TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_LEFT_BARREL_ROLL_DOWN_TO_UP + { TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_RIGHT_BARREL_ROLL_DOWN_TO_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK + { TRACK_POWERED_LIFT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_POWERED_LIFT + { TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_LEFT_LARGE_HALF_LOOP_UP + { TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_RIGHT_LARGE_HALF_LOOP_UP + { TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_RIGHT_LARGE_HALF_LOOP_DOWN + { TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_LEFT_LARGE_HALF_LOOP_DOWN }; static bool track_save_should_select_scenery_around(int rideIndex, rct_map_element *mapElement); @@ -1404,10 +1404,10 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac bl = 1; if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 0x69; if (RCT2_GLOBAL(0x00F440D4, uint8) == 1){ - cost = game_do_command(mapCoord.x, 0 | rotation << 8, mapCoord.y, (z / 16) & 0xFF, GAME_COMMAND_12, -1, 0); + cost = game_do_command(mapCoord.x, 0 | rotation << 8, mapCoord.y, (z / 16) & 0xFF, GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, -1, 0); } else{ - cost = game_do_command(mapCoord.x, bl | rotation << 8, mapCoord.y, rideIndex, GAME_COMMAND_12, 0, 0); + cost = game_do_command(mapCoord.x, bl | rotation << 8, mapCoord.y, rideIndex, GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, 0, 0); } if (cost != MONEY32_UNDEFINED){ RCT2_GLOBAL(0x00F4414E, uint8) |= (1 << 0); @@ -1423,10 +1423,10 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac bl = 1; if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 0x69; if (RCT2_GLOBAL(0x00F440D4, uint8) == 1){ - cost = game_do_command(mapCoord.x, 0 | rotation << 8, mapCoord.y, ((z / 16) & 0xFF) | (1 << 8), GAME_COMMAND_12, -1, 0); + cost = game_do_command(mapCoord.x, 0 | rotation << 8, mapCoord.y, ((z / 16) & 0xFF) | (1 << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, -1, 0); } else{ - cost = game_do_command(mapCoord.x, bl | rotation << 8, mapCoord.y, rideIndex | (1 << 8), GAME_COMMAND_12, 0, 0); + cost = game_do_command(mapCoord.x, bl | rotation << 8, mapCoord.y, rideIndex | (1 << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, 0, 0); } if (cost != MONEY32_UNDEFINED){ RCT2_GLOBAL(0x00F4414E, uint8) |= (1 << 0); @@ -1588,7 +1588,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac temp_z += trackBlock->z; // rotation in bh // track_type in dl - game_do_command(x, 0x69 | ((rotation & 3) << 8), y, track_type, GAME_COMMAND_4, temp_z, 0); + game_do_command(x, 0x69 | ((rotation & 3) << 8), y, track_type, GAME_COMMAND_REMOVE_TRACK, temp_z, 0); } if (RCT2_GLOBAL(0x00F440D4, uint8) == 1 || @@ -1616,7 +1616,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0; RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; - money32 cost = game_do_command(x, bl | (rotation << 8), y, edx, GAME_COMMAND_3, edi, 0); + money32 cost = game_do_command(x, bl | (rotation << 8), y, edx, GAME_COMMAND_PLACE_TRACK, edi, 0); RCT2_GLOBAL(0x00F440D5, money32) += cost; if (cost == MONEY32_UNDEFINED){ @@ -1822,7 +1822,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0; RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; - money32 cost = game_do_command(x, bl | (rotation << 8), y, rideIndex | (is_exit << 8), GAME_COMMAND_12, di, 0); + money32 cost = game_do_command(x, bl | (rotation << 8), y, rideIndex | (is_exit << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, di, 0); RCT2_GLOBAL(0x00F440D5, money32) += cost; if (cost == MONEY32_UNDEFINED){ @@ -1841,7 +1841,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac z /= 16; RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; - money32 cost = game_do_command(x, 0 | (rotation << 8), y, z | (is_exit << 8), GAME_COMMAND_12, -1, 0); + money32 cost = game_do_command(x, 0 | (rotation << 8), y, z | (is_exit << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, -1, 0); RCT2_GLOBAL(0x00F440D5, money32) += cost; if (cost == MONEY32_UNDEFINED){ @@ -2617,10 +2617,11 @@ int maze_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_ } /* rct2: 0x006CE68D */ -int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_elements){ +int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_elements) +{ rct_ride* ride = GET_RIDE(rideIndex); - rct_xy_element trackElement; + track_begin_end trackBeginEnd; if (sub_6CAF80(rideIndex, &trackElement) == 0){ RCT2_GLOBAL(0x00141E9AC, uint16) = 3347; @@ -2629,18 +2630,12 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra int z = 0; //6ce69e - if (!(sub_6C6402(&trackElement.element, &trackElement.x, &trackElement.y, &z))){ + if (track_get_previous(trackElement.x, trackElement.y, trackElement.element, &trackBeginEnd)) { rct_map_element* initial_map = trackElement.element; do { - int x = trackElement.x; - int y = trackElement.y; - rct_map_element* map_element = trackElement.element; - if (sub_6C6402(&map_element, &x, &y, &z)){ + if (!track_get_previous(trackBeginEnd.begin_x, trackBeginEnd.begin_y, trackBeginEnd.begin_element, &trackBeginEnd)) { break; } - trackElement.x = x; - trackElement.y = y; - trackElement.element = map_element; } while (initial_map != trackElement.element); } @@ -2733,7 +2728,7 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra track->flags = flags; track++; - if (!track_get_next(&trackElement, &trackElement)) + if (!track_get_next(&trackElement, &trackElement, NULL, NULL)) break; z = trackElement.element->base_height * 8; @@ -3432,3 +3427,15 @@ static void track_save_add_map_element(int mapElementSelectType, int x, int y, r { RCT2_CALLPROC_X(0x006D2B3C, x, mapElementSelectType, y, (int)mapElement, 0, 0, 0); } + +rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType) +{ + return ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? + RCT2_ADDRESS(0x00994A38, rct_preview_track*)[trackType] : + RCT2_ADDRESS(0x00994638, rct_preview_track*)[trackType]; +} + +rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType) +{ + return get_track_def_from_ride(GET_RIDE(rideIndex), trackType); +} diff --git a/src/ride/track.h b/src/ride/track.h index dc5e8acb64..5497bdbc45 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -43,7 +43,7 @@ typedef struct { sint16 x; // 0x01 sint16 y; // 0x03 sint16 z; - uint8 pad_07; + uint8 var_07; uint8 var_08; uint8 var_09; } rct_preview_track; @@ -181,40 +181,86 @@ enum { TRACK_NONE = 0, TRACK_FLAT = 0, - TRACK_STATION_END = 2, - TRACK_VERTICAL_LOOP = 7, - TRACK_S_BEND = 13, - TRACK_TWIST = 17, - TRACK_HALF_LOOP = 18, - TRACK_CORKSCREW = 19, - TRACK_TOWER_BASE = 20, - TRACK_HELIX_SMALL= 21, - TRACK_HELIX_LARGE= 22, - TRACK_HELIX_LARGE_UNBANKED = 23, - TRACK_BRAKES = 24, - TRACK_ON_RIDE_PHOTO = 26, - TRACK_WATER_SPLASH = 27, - TRACK_BARREL_ROLL = 29, - TRACK_POWERED_LIFT = 30, - TRACK_HALF_LOOP_2 = 31, // ? - TRACK_LOG_FLUME_REVERSER = 33, - TRACK_WHOA_BELLY = 36, - TRACK_LIFT_HILL = 43, - TRACK_SPINNING_TUNNEL = 46, - TRACK_ROTATION_CONTROL_TOGGLE = 47, - TRACK_RAPIDS = 52, + TRACK_STRAIGHT, + TRACK_STATION_END, + TRACK_LIFT_HILL, + TRACK_LIFT_HILL_STEEP, + TRACK_LIFT_HILL_CURVE, + TRACK_FLAT_ROLL_BANKING, + TRACK_VERTICAL_LOOP, + TRACK_SLOPE, + TRACK_SLOPE_STEEP, + TRACK_SLOPE_LONG, + TRACK_SLOPE_CURVE, + TRACK_SLOPE_CURVE_STEEP, + TRACK_S_BEND, + TRACK_CURVE_VERY_SMALL, + TRACK_CURVE_SMALL, + TRACK_CURVE, + TRACK_TWIST, + TRACK_HALF_LOOP, + TRACK_CORKSCREW, + TRACK_TOWER_BASE, + TRACK_HELIX_SMALL, + TRACK_HELIX_LARGE, + TRACK_HELIX_LARGE_UNBANKED, + TRACK_BRAKES, + TRACK_25, + TRACK_ON_RIDE_PHOTO, + TRACK_WATER_SPLASH, + TRACK_SLOPE_VERTICAL, + TRACK_BARREL_ROLL, + TRACK_POWERED_LIFT, + TRACK_HALF_LOOP_LARGE, + TRACK_SLOPE_CURVE_BANKED, + TRACK_LOG_FLUME_REVERSER, + TRACK_HEARTLINE_ROLL, + TRACK_REVERSER, + TRACK_WHOA_BELLY, + TRACK_SLOPE_TO_FLAT, + TRACK_BLOCK_BRAKES, + TRACK_SLOPE_ROLL_BANKING, + TRACK_SLOPE_STEEP_LONG, + TRACK_CURVE_VERTICAL, + TRACK_42, + TRACK_LIFT_HILL_CABLE, + TRACK_LIFT_HILL_CURVED, + TRACK_QUARTER_LOOP, + TRACK_SPINNING_TUNNEL, + TRACK_ROTATION_CONTROL_TOGGLE, + TRACK_INLINE_TWIST_UNINVERTED, + TRACK_INLINE_TWIST_INVERTED, + TRACK_QUARTER_LOOP_UNINVERTED, + TRACK_QUARTER_LOOP_INVERTED, + TRACK_RAPIDS, + TRACK_HALF_LOOP_UNINVERTED, + TRACK_HALF_LOOP_INVERTED, + TRACK_WATERFALL = 152, TRACK_WHIRLPOOL = 152, TRACK_BRAKE_FOR_DROP = 172 }; enum { - TRACK_UP_25 = 2, - TRACK_UP_60 = 4, - TRACK_DOWN_25 = 6, - TRACK_DOWN_60 = 8, - TRACK_UP_90 = 10, - TRACK_DOWN_90 = 18, + TRACK_CURVE_LEFT_VERY_SMALL = 5, + TRACK_CURVE_LEFT_SMALL = 3, + TRACK_CURVE_LEFT = 1, + TRACK_CURVE_LEFT_LARGE = 7, + TRACK_CURVE_NONE = 0, + TRACK_CURVE_RIGHT_LARGE = 8, + TRACK_CURVE_RIGHT = 2, + TRACK_CURVE_RIGHT_SMALL = 4, + TRACK_CURVE_RIGHT_VERY_SMALL = 6 +}; + +enum { + TRACK_SLOPE_NONE = 0, + TRACK_SLOPE_UP_25 = 2, + TRACK_SLOPE_UP_60 = 4, + TRACK_SLOPE_DOWN_25 = 6, + TRACK_SLOPE_DOWN_60 = 8, + TRACK_SLOPE_UP_90 = 10, + TRACK_SLOPE_DOWN_90 = 18, TRACK_VANGLE_TOWER = 10, TRACK_VANGLE_WHOA_BELLY = 10 @@ -445,4 +491,7 @@ void game_command_place_track(int* eax, int* ebx, int* ecx, int* edx, int* esi, void track_save_reset_scenery(); void track_save_select_nearby_scenery(int rideIndex); +rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType); +rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType); + #endif diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c new file mode 100644 index 0000000000..ee801a53bc --- /dev/null +++ b/src/windows/maze_construction.c @@ -0,0 +1,211 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#include "../addresses.h" +#include "../audio/audio.h" +#include "../drawing/drawing.h" +#include "../game.h" +#include "../input.h" +#include "../interface/themes.h" +#include "../interface/viewport.h" +#include "../interface/widget.h" +#include "../interface/window.h" +#include "../localisation/localisation.h" +#include "../ride/track.h" +#include "dropdown.h" + +#pragma region Widgets + +enum { + WIDX_BACKGROUND, + WIDX_TITLE, + WIDX_CLOSE, + WIDX_MAZE_MODE_GROUPBOX, + WIDX_MAZE_BUILD_MODE = 6, + WIDX_MAZE_MOVE_MODE, + WIDX_MAZE_FILL_MODE, + WIDX_MAZE_DIRECTION_GROUPBOX = 23, + WIDX_MAZE_DIRECTION_NW, + WIDX_MAZE_DIRECTION_NE, + WIDX_MAZE_DIRECTION_SW, + WIDX_MAZE_DIRECTION_SE, +}; + +static rct_widget window_maze_construction_widgets[] = { + { WWT_FRAME, 0, 0, 165, 0, 199, 0xFFFFFFFF, STR_NONE }, + { WWT_CAPTION, 0, 1, 164, 1, 14, 896, STR_WINDOW_TITLE_TIP }, + { WWT_CLOSEBOX, 0, 153, 163, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, + { WWT_GROUPBOX, 0, 3, 162, 17, 71, STR_RIDE_CONSTRUCTION_MODE, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_FLATBTN, 1, 35, 66, 29, 60, 0x15C8, STR_RIDE_CONSTRUCTION_BUILD_MODE }, + { WWT_FLATBTN, 1, 67, 98, 29, 60, 0x15C9, STR_RIDE_CONSTRUCTION_MOVE_MODE }, + { WWT_FLATBTN, 1, 99, 130, 29, 60, 0x15CA, STR_RIDE_CONSTRUCTION_FILL_IN_MODE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_GROUPBOX, 0, 3, 162, 80, 166, STR_RIDE_CONSTRUCTION_BUILD, STR_NONE }, + { WWT_FLATBTN, 1, 83, 127, 96, 124, 0x1603, STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP }, + { WWT_FLATBTN, 1, 83, 127, 125, 153, 0x1604, STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP }, + { WWT_FLATBTN, 1, 38, 82, 125, 153, 0x1605, STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP }, + { WWT_FLATBTN, 1, 38, 82, 96, 124, 0x1606, STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP }, + { WWT_GROUPBOX, 0, 3, 162, 168, 195, 0xFFFFFFFF, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 9, 78, 178, 189, STR_RIDE_CONSTRUCTION_ENTRANCE, STR_RIDE_CONSTRUCTION_ENTRANCE_TIP }, + { WWT_DROPDOWN_BUTTON, 1, 87, 156, 178, 189, STR_RIDE_CONSTRUCTION_EXIT, STR_RIDE_CONSTRUCTION_EXIT_TIP }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WIDGETS_END } +}; + +#pragma endregion + +#pragma region Events + +static void window_maze_construction_emptysub() {} + +static void window_maze_construction_close(); +static void window_maze_construction_invalidate(); +static void window_maze_construction_paint(); + +// 0x993F6C +static void* window_maze_construction_events[] = { + window_maze_construction_close, + (void*)0x006CD461, + (void*)0x006CD623, + (void*)0x006CD48C, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + (void*)0x006CD767, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + (void*)0x006CD63E, + (void*)0x006CD65D, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_invalidate, + window_maze_construction_paint, + window_maze_construction_emptysub +}; + +#pragma endregion + +/** + * + * rct2: 0x006CB481 + */ +rct_window *window_maze_construction_open() +{ + rct_window *w = window_create(0, 29, 166, 200, (uint32*)window_maze_construction_events, WC_RIDE_CONSTRUCTION, WF_9); + w->widgets = window_maze_construction_widgets; + w->enabled_widgets = 0x6F0001C4; + + window_init_scroll_widgets(w); + colour_scheme_update(w); + + w->number = _currentRideIndex; + + window_push_others_right(w); + show_gridlines(); + return w; +} + +/** + * + * rct2: 0x006CD811 + */ +static void window_maze_construction_close() +{ + rct_window *w; + + window_get_register(w); + + sub_6C9627(); + viewport_set_visibility(0); + + map_invalidate_map_selection_tiles(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 1); + + // In order to cancel the yellow arrow correctly the + // selection tool should be cancelled. + tool_cancel(); + + hide_gridlines(); + + uint8 rideIndex = _currentRideIndex; + rct_ride* ride = GET_RIDE(rideIndex); + if (ride->overall_view == 0xFFFF) { + int savedPausedState = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8); + RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = 0; + game_do_command(0, 9, 0, rideIndex, GAME_COMMAND_7, 0, 0); + RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = savedPausedState; + } else { + window_ride_main_open(rideIndex); + } +} + +/** + * + * rct2: 0x006CD435 + */ +static void window_maze_construction_invalidate() +{ + rct_ride *ride = GET_RIDE(_currentRideIndex); + + // Set window title arguments + RCT2_GLOBAL(0x013CE956, rct_string_id) = ride->name; + RCT2_GLOBAL(0x013CE958, uint32) = ride->name_arguments; +} + +/** + * + * rct2: 0x006CD45B + */ +static void window_maze_construction_paint() +{ + rct_window *w; + rct_drawpixelinfo *dpi; + + window_paint_get_registers(w, dpi); + + window_draw_widgets(w, dpi); +} diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 7cb6c54658..ae22b6fff6 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -19,138 +19,497 @@ *****************************************************************************/ #include "../addresses.h" -#include "../interface/window.h" -#include "../interface/viewport.h" -#include "../game.h" -#include "../ride/track.h" +#include "../audio/audio.h" #include "../drawing/drawing.h" +#include "../game.h" +#include "../input.h" #include "../interface/themes.h" +#include "../interface/viewport.h" +#include "../interface/widget.h" +#include "../interface/window.h" +#include "../localisation/localisation.h" +#include "../ride/track.h" +#include "dropdown.h" /* move to ride.c */ -void sub_6b2fa9(rct_windownumber number){ +void sub_6B2FA9(rct_windownumber number) +{ rct_window* w; w = window_find_by_number(WC_RIDE, number); - if (w){ - if (w->page == 1){ - window_close(w); - } - } + if (w != NULL && w->page == 1) + window_close(w); } +#pragma region Widgets + enum { WIDX_BACKGROUND, WIDX_TITLE, WIDX_CLOSE, - WIDX_PAGE_BACKGROUND, - - WIDX_DEMOLISH = 24 + WIDX_DIRECTION_GROUPBOX, + WIDX_SLOPE_GROUPBOX, + WIDX_BANKING_GROUPBOX, + WIDX_LEFT_CURVE_VERY_SMALL, + WIDX_LEFT_CURVE_SMALL, + WIDX_LEFT_CURVE, + WIDX_STRAIGHT, + WIDX_RIGHT_CURVE, + WIDX_RIGHT_CURVE_SMALL, + WIDX_RIGHT_CURVE_VERY_SMALL, + WIDX_SPECIAL_TRACK_DROPDOWN, + WIDX_SLOPE_DOWN_STEEP, + WIDX_SLOPE_DOWN, + WIDX_LEVEL, + WIDX_SLOPE_UP, + WIDX_SLOPE_UP_STEEP, + WIDX_CHAIN_LIFT, + WIDX_BANK_LEFT, + WIDX_BANK_STRAIGHT, + WIDX_BANK_RIGHT, + WIDX_CONSTRUCT, + WIDX_DEMOLISH, + WIDX_LEFT_CURVE_LARGE, + WIDX_PREVIOUS_SECTION, + WIDX_NEXT_SECTION, + WIDX_ENTRANCE_EXIT_GROUPBOX, + WIDX_ENTRANCE, + WIDX_EXIT, + WIDX_RIGHT_CURVE_LARGE, + WIDX_ROTATE, + WIDX_U_TRACK, + WIDX_O_TRACK, + WIDX_SEAT_ROTATION_GROUPBOX, + WIDX_SEAT_ROTATION_ANGLE_SPINNER, + WIDX_SEAT_ROTATION_ANGLE_SPINNER_UP, + WIDX_SEAT_ROTATION_ANGLE_SPINNER_DOWN, }; -void window_construction_emptysub(){} -void window_construction_close(); -void window_construction_mouseup(); -void window_construction_paint(); - -void window_construction_maze_close(); -void window_construction_maze_invalidate(); -void window_construction_maze_paint(); - -// 0x993F6C -static void* window_construction_maze_events[] = { - window_construction_maze_close, - (void*)0x6CD461, - (void*)0x6CD623, - (void*)0x6CD48C, - window_construction_emptysub, - window_construction_emptysub, - (void*)0x6CD767, - window_construction_emptysub, - window_construction_emptysub, - (void*)0x6CD63E, - (void*)0x6CD65D, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_maze_invalidate, - window_construction_maze_paint, - window_construction_emptysub +static rct_widget window_ride_construction_widgets[] = { + { WWT_FRAME, 0, 0, 165, 0, 393, 0xFFFFFFFF, STR_NONE }, + { WWT_CAPTION, 0, 1, 164, 1, 14, 896, STR_WINDOW_TITLE_TIP }, + { WWT_CLOSEBOX, 0, 153, 163, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, + { WWT_GROUPBOX, 0, 3, 162, 17, 73, STR_RIDE_CONSTRUCTION_DIRECTION, STR_NONE }, + { WWT_GROUPBOX, 0, 3, 162, 76, 116, STR_RIDE_CONSTRUCTION_SLOPE, STR_NONE }, + { WWT_GROUPBOX, 0, 3, 162, 120, 160, STR_RIDE_CONSTRUCTION_ROLL_BANKING, STR_NONE }, + { WWT_FLATBTN, 1, 6, 27, 29, 52, 0x1414, STR_RIDE_CONSTRUCTION_LEFT_CURVE_VERY_SMALL_TIP }, + { WWT_FLATBTN, 1, 6, 27, 29, 52, 0x1414, STR_RIDE_CONSTRUCTION_LEFT_CURVE_SMALL_TIP }, + { WWT_FLATBTN, 1, 28, 49, 29, 52, 0x1412, STR_RIDE_CONSTRUCTION_LEFT_CURVE_TIP }, + { WWT_FLATBTN, 1, 72, 93, 29, 52, 0x1411, STR_RIDE_CONSTRUCTION_STRAIGHT_TIP }, + { WWT_FLATBTN, 1, 116, 137, 29, 52, 0x1413, STR_RIDE_CONSTRUCTION_RIGHT_CURVE_TIP }, + { WWT_FLATBTN, 1, 138, 159, 29, 52, 0x1415, STR_RIDE_CONSTRUCTION_RIGHT_CURVE_SMALL_TIP }, + { WWT_FLATBTN, 1, 138, 159, 29, 52, 0x1415, STR_RIDE_CONSTRUCTION_RIGHT_CURVE_VERY_SMALL_TIP }, + { WWT_DROPDOWN_BUTTON, 1, 17, 148, 55, 68, 1384, STR_RIDE_CONSTRUCTION_OTHER_TRACK_CONFIGURATIONS_TIP }, + { WWT_FLATBTN, 1, 23, 46, 88, 111, 0x1418, STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP }, + { WWT_FLATBTN, 1, 47, 70, 88, 111, 0x1419, STR_RIDE_CONSTRUCTION_SLOPE_DOWN_TIP }, + { WWT_FLATBTN, 1, 71, 94, 88, 111, 0x141A, STR_RIDE_CONSTRUCTION_LEVEL_TIP }, + { WWT_FLATBTN, 1, 95, 118, 88, 111, 0x141B, STR_RIDE_CONSTRUCTION_SLOPE_UP_TIP }, + { WWT_FLATBTN, 1, 119, 142, 88, 111, 0x141C, STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP }, + { WWT_FLATBTN, 1, 134, 157, 88, 111, 0x142B, STR_RIDE_CONSTRUCTION_CHAIN_LIFT_TIP }, + { WWT_FLATBTN, 1, 47, 70, 132, 155, 0x1421, STR_RIDE_CONSTRUCTION_ROLL_FOR_LEFT_CURVE_TIP }, + { WWT_FLATBTN, 1, 71, 94, 132, 155, 0x1422, STR_RIDE_CONSTRUCTION_NO_ROLL_TIP }, + { WWT_FLATBTN, 1, 95, 118, 132, 155, 0x1423, STR_RIDE_CONSTRUCTION_ROLL_FOR_RIGHT_CURVE_TIP }, + { WWT_IMGBTN, 1, 3, 162, 164, 333, 0xFFFFFFFF, STR_RIDE_CONSTRUCTION_CONSTRUCT_SELECTED_SECTION_TIP }, + { WWT_FLATBTN, 1, 60, 105, 338, 361, 0x142A, STR_RIDE_CONSTRUCTION_REMOVE_HIGHLIGHTED_SECTION_TIP }, + { WWT_FLATBTN, 1, 50, 71, 29, 52, 0x1416, STR_RIDE_CONSTRUCTION_LEFT_CURVE_LARGE_TIP }, + { WWT_FLATBTN, 1, 20, 43, 338, 361, 0x1428, STR_RIDE_CONSTRUCTION_MOVE_TO_PREVIOUS_SECTION_TIP }, + { WWT_FLATBTN, 1, 122, 145, 338, 361, 0x1429, STR_RIDE_CONSTRUCTION_MOVE_TO_NEXT_SECTION_TIP }, + { WWT_GROUPBOX, 0, 3, 162, 362, 389, 0xFFFFFFFF, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 9, 78, 372, 383, STR_RIDE_CONSTRUCTION_ENTRANCE, STR_RIDE_CONSTRUCTION_ENTRANCE_TIP }, + { WWT_DROPDOWN_BUTTON, 1, 87, 156, 372, 383, STR_RIDE_CONSTRUCTION_EXIT, STR_RIDE_CONSTRUCTION_EXIT_TIP }, + { WWT_FLATBTN, 1, 94, 115, 29, 52, 0x1417, STR_RIDE_CONSTRUCTION_RIGHT_CURVE_LARGE_TIP }, + { WWT_FLATBTN, 1, 72, 95, 338, 361, 0x1431, STR_ROTATE_90_TIP }, + { WWT_FLATBTN, 1, 19, 42, 132, 155, 0x1424, STR_RIDE_CONSTRUCTION_U_SHAPED_OPEN_TRACK_TIP }, + { WWT_FLATBTN, 1, 123, 146, 132, 155, 0x1425, STR_RIDE_CONSTRUCTION_O_SHAPED_ENCLOSED_TRACK_TIP }, + { WWT_GROUPBOX, 0, 96, 162, 120, 160, STR_RIDE_CONSTRUCTION_SEAT_ROT, STR_NONE }, + { WWT_SPINNER, 1, 101, 158, 138, 149, 0, STR_RIDE_CONSTRUCTION_SELECT_SEAT_ROTATION_ANGLE_TIP }, + { WWT_DROPDOWN_BUTTON, 1, 147, 157, 139, 143, STR_NUMERIC_UP, STR_RIDE_CONSTRUCTION_SELECT_SEAT_ROTATION_ANGLE_TIP }, + { WWT_DROPDOWN_BUTTON, 1, 147, 157, 144, 148, STR_NUMERIC_DOWN, STR_RIDE_CONSTRUCTION_SELECT_SEAT_ROTATION_ANGLE_TIP }, + { WIDGETS_END } }; +#pragma endregion + +#pragma region Events + +static void window_ride_construction_emptysub() {} + +static void window_ride_construction_close(); +static void window_ride_construction_mouseup(); +static void window_ride_construction_resize(); +static void window_ride_construction_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); +static void window_ride_construction_dropdown(); +static void window_ride_construction_update(rct_window *w); +static void window_ride_construction_toolupdate(); +static void window_ride_construction_tooldown(); +static void window_ride_construction_invalidate(); +static void window_ride_construction_paint(); + //0x993EEC -static void* window_construction_events[] = { - window_construction_close, - window_construction_mouseup, - (void*)0x6C7934, - (void*)0x6C6E6A, - (void*)0x6C78CD, - window_construction_emptysub, - (void*)0x6C8374, - window_construction_emptysub, - window_construction_emptysub, - (void*)0x6C8229, - (void*)0x6C8248, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - (void*)0x6C6AD5, - window_construction_paint,//(void*)0x6C6B86, - window_construction_emptysub +static void* window_ride_construction_events[] = { + window_ride_construction_close, + window_ride_construction_mouseup, + window_ride_construction_resize, + window_ride_construction_mousedown, + window_ride_construction_dropdown, + window_ride_construction_emptysub, + window_ride_construction_update, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_toolupdate, + window_ride_construction_tooldown, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_invalidate, + window_ride_construction_paint, + window_ride_construction_emptysub }; +#pragma endregion + +#pragma region RideConfigurationStringIds + +// rct2: 0x00999492 +rct_string_id RideConfigurationStringIds[] = { + 0, // 0 + STR_STATION_PLATFORM, // 1 + 0, // 2 + 0, // 3 + 0, // 4 + 0, // 5 + 0, // 6 + 0, // 7 + 0, // 8 + 0, // 9 + 0, // 10 + 0, // 11 + 0, // 12 + 0, // 13 + 0, // 14 + 0, // 15 + 0, // 16 + 0, // 17 + 0, // 18 + 0, // 19 + 0, // 20 + 0, // 21 + 0, // 22 + 0, // 23 + 0, // 24 + 0, // 25 + 0, // 26 + 0, // 27 + 0, // 28 + 0, // 29 + 0, // 30 + 0, // 31 + 0, // 32 + 0, // 33 + 0, // 34 + 0, // 35 + 0, // 36 + 0, // 37 + STR_S_BEND_LEFT, // 38 + STR_S_BEND_RIGHT, // 39 + STR_VERTICAL_LOOP_LEFT, // 40 + STR_VERTICAL_LOOP_RIGHT, // 41 + 0, // 42 + 0, // 43 + 0, // 44 + 0, // 45 + 0, // 46 + 0, // 47 + 0, // 48 + 0, // 49 + 0, // 50 + 0, // 51 + STR_IN_LINE_TWIST_LEFT, // 52 + STR_IN_LINE_TWIST_RIGHT, // 53 + STR_IN_LINE_TWIST_LEFT, // 54 + STR_IN_LINE_TWIST_RIGHT, // 55 + STR_HALF_LOOP, // 56 + STR_HALF_LOOP, // 57 + STR_HALF_CORKSCREW_LEFT, // 58 + STR_HALF_CORKSCREW_RIGHT, // 59 + STR_HALF_CORKSCREW_LEFT, // 60 + STR_HALF_CORKSCREW_RIGHT, // 61 + 0, // 62 + 0, // 63 + 0, // 64 + 0, // 65 + STR_ENTRY_EXIT_PLATFORM, // 66 + STR_VERTICAL_TOWER, // 67 + 0, // 68 + 0, // 69 + 0, // 70 + 0, // 71 + 0, // 72 + 0, // 73 + 0, // 74 + 0, // 75 + 0, // 76 + 0, // 77 + 0, // 78 + 0, // 79 + 0, // 80 + 0, // 81 + 0, // 82 + STR_S_BEND_LEFT, // 83 + STR_S_BEND_RIGHT, // 84 + 0, // 85 + 0, // 86 + STR_HELIX_UP_SMALL, // 87 + STR_HELIX_UP_SMALL, // 88 + STR_HELIX_DOWN_SMALL, // 89 + STR_HELIX_DOWN_SMALL, // 90 + STR_HELIX_UP_LARGE, // 91 + STR_HELIX_UP_LARGE, // 92 + STR_HELIX_DOWN_LARGE, // 93 + STR_HELIX_DOWN_LARGE, // 94 + 0, // 95 + 0, // 96 + 0, // 97 + 0, // 98 + STR_BRAKES, // 99 + STR_SPINNING_CONTROL_TOGGLE_TRACK, // 100 + 0, // 101 + STR_HELIX_UP_LARGE, // 102 + STR_HELIX_UP_LARGE, // 103 + STR_HELIX_DOWN_LARGE, // 104 + STR_HELIX_DOWN_LARGE, // 105 + STR_HELIX_UP_LEFT, // 106 + STR_HELIX_UP_RIGHT, // 107 + STR_HELIX_DOWN_LEFT, // 108 + STR_HELIX_DOWN_RIGHT, // 109 + STR_BASE_SIZE_2_X_2, // 110 + STR_BASE_SIZE_4_X_4, // 111 + STR_WATERFALLS, // 112 + STR_RAPIDS, // 113 + STR_ON_RIDE_PHOTO_SECTION, // 114 + STR_BASE_SIZE_2_X_4, // 115 + STR_BASE_SIZE_5_X_1, // 116 + STR_WATER_SPLASH, // 117 + 0, // 118 + 0, // 119 + STR_WHIRLPOOL, // 120 + 0, // 121 + 0, // 122 + STR_CABLE_LIFT_HILL, // 123 + STR_SLOPE_UP_TO_VERTICAL, // 124 + STR_VERTICAL_TRACK, // 125 + 0, // 126 + 0, // 127 + 0, // 128 + 0, // 129 + 0, // 130 + 0, // 131 + STR_HOLDING_BRAKE_FOR_DROP, // 132 + 0, // 133 + 0, // 134 + 0, // 135 + 0, // 136 + 0, // 137 + 0, // 138 + 0, // 139 + 0, // 140 + 0, // 141 + 0, // 142 + 0, // 143 + 0, // 144 + 0, // 145 + 0, // 146 + 0, // 147 + 0, // 148 + 0, // 149 + 0, // 150 + 0, // 151 + 0, // 152 + 0, // 153 + 0, // 154 + 0, // 155 + 0, // 156 + 0, // 157 + 0, // 158 + 0, // 159 + 0, // 160 + 0, // 161 + 0, // 162 + 0, // 163 + 0, // 164 + 0, // 165 + 0, // 166 + 0, // 167 + 0, // 168 + 0, // 169 + 0, // 170 + 0, // 171 + STR_REVERSER_TURNTABLE, // 172 + STR_SPINNING_TUNNEL, // 173 + STR_BARREL_ROLL_LEFT, // 174 + STR_BARREL_ROLL_RIGHT, // 175 + STR_BARREL_ROLL_LEFT, // 176 + STR_BARREL_ROLL_RIGHT, // 177 + 0, // 178 + 0, // 179 + 0, // 180 + 0, // 181 + STR_LAUNCHED_LIFT_HILL, // 182 + STR_LARGE_HALF_LOOP_LEFT, // 183 + STR_LARGE_HALF_LOOP_RIGHT, // 184 + STR_LARGE_HALF_LOOP_LEFT, // 185 + STR_LARGE_HALF_LOOP_RIGHT, // 186 + STR_IN_LINE_TWIST_LEFT, // 187 + STR_IN_LINE_TWIST_RIGHT, // 188 + STR_IN_LINE_TWIST_LEFT, // 189 + STR_IN_LINE_TWIST_RIGHT, // 190 + STR_HALF_LOOP, // 191 + STR_HALF_LOOP, // 192 + STR_HALF_CORKSCREW_LEFT, // 193 + STR_HALF_CORKSCREW_RIGHT, // 194 + STR_HALF_CORKSCREW_LEFT, // 195 + STR_HALF_CORKSCREW_RIGHT, // 196 + STR_UPPER_TRANSFER, // 197 + STR_LOWER_TRANSFER, // 198 + STR_HEARTLINE_ROLL_LEFT, // 199 + STR_HEARTLINE_ROLL_RIGHT, // 200 + STR_GOLF_HOLE_A, // 201 + STR_GOLF_HOLE_B, // 202 + STR_GOLF_HOLE_C, // 203 + STR_GOLF_HOLE_D, // 204 + STR_GOLF_HOLE_E, // 205 + STR_QUARTER_LOOP, // 206 + STR_QUARTER_LOOP, // 207 + STR_QUARTER_LOOP, // 208 + STR_CURVED_LIFT_HILL_LEFT, // 209 + STR_CURVED_LIFT_HILL_RIGHT, // 210 + STR_REVERSER_LEFT, // 211 + STR_REVERSER_RIGHT, // 212 + STR_TOP_SECTION, // 213 + STR_VERTICAL_TRACK, // 214 + STR_SLOPE_TO_LEVEL, // 215 + STR_BLOCK_BRAKES, // 216 + 0, // 217 + 0, // 218 + 0, // 219 + 0, // 220 + 0, // 221 + 0, // 222 + 0, // 223 + 0, // 224 + 0, // 225 + 0, // 226 + 0, // 227 + 0, // 228 + 0, // 229 + 0, // 230 + 0, // 231 + 0, // 232 + 0, // 233 + 0, // 234 + 0, // 235 + 0, // 236 + 0, // 237 + 0, // 238 + 0, // 239 + 0, // 240 + 0, // 241 + 0, // 242 + 0, // 243 + 0, // 244 + 0, // 245 + 0, // 246 + 0, // 247 + 0, // 248 + 0, // 249 + 0, // 250 + 0, // 251 + 0, // 252 + STR_QUARTER_LOOP, // 253 + STR_QUARTER_LOOP, // 254 + STR_QUARTER_LOOP // 255 +}; + +#pragma endregion + +static void window_ride_construction_next_section(rct_window *w); +static void window_ride_construction_previous_section(rct_window *w); +static void window_ride_construction_construct(rct_window *w); +static void window_ride_construction_mouseup_demolish(rct_window* w); +static void window_ride_construction_rotate(rct_window *w); +static void window_ride_construction_entrance_click(rct_window *w); +static void window_ride_construction_exit_click(rct_window *w); + +static void window_ride_construction_draw_track_piece( + rct_window *w, rct_drawpixelinfo *dpi, + int rideIndex, int trackType, int trackRotation, int unknown, + int width, int height +); +static void window_ride_construction_update_enabled_track_pieces(); +void sub_6C94D8(); +static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *seatRotation); +static void sub_6CBCE2( + int rideIndex, int trackType, int trackDirection, int edx, + int originX, int originY, int originZ +); +static void window_ride_construction_update_map_selection(); +static void window_ride_construction_update_possible_ride_configurations(); +static void window_ride_construction_update_widgets(rct_window *w); +static void window_ride_construction_select_map_tiles(rct_ride *ride, int trackType, int trackDirection, int x, int y); +money32 sub_6CA162(int rideIndex, int trackType, int trackDirection, int edxRS16, int x, int y, int z); +static void window_ride_construction_show_special_track_dropdown(rct_window *w, rct_widget *widget); +static void ride_selected_track_set_seat_rotation(int seatRotation); +static void loc_6C7502(int al); +static void loc_6C76E9(); + +static void ride_construction_toolupdate_construct(int screenX, int screenY); +static void ride_construction_toolupdate_entrance_exit(int screenX, int screenY); +static void ride_construction_tooldown_construct(int screenX, int screenY); +static void ride_construction_tooldown_entrance_exit(int screenX, int screenY); + +uint8 *_currentPossibleRideConfigurations = (uint8*)0x00F4407C; + +static bool is_track_enabled(int trackFlagIndex) +{ + return _enabledRidePieces & (1ULL << trackFlagIndex); +} + +static int ride_get_alternative_type(rct_ride *ride) +{ + return _currentTrackCovered & 2 ? + RCT2_ADDRESS(0x0097D4F5, uint8)[ride->type * 8] : + ride->type;; +} + /** * * rct2: 0x006CB481 */ -rct_window *window_construction_open() +rct_window *window_ride_construction_open() { - int ride_id = RCT2_GLOBAL(0xF440A7, uint8); - sub_6b2fa9(ride_id); + int rideIndex = _currentRideIndex; + sub_6B2FA9(rideIndex); rct_window *w; - rct_ride* ride = GET_RIDE(ride_id); - if (ride->type == RIDE_TYPE_MAZE){ - w = window_create(0, 29, 166, 200, (uint32*)window_construction_maze_events, WC_RIDE_CONSTRUCTION, WF_9); + rct_ride* ride = GET_RIDE(rideIndex); - w->widgets = (rct_widget*)0x9D7D04; - w->enabled_widgets = 0x6F0001C4; + if (ride->type == RIDE_TYPE_MAZE) + return window_maze_construction_open(); - window_init_scroll_widgets(w); + w = window_create(0, 29, 166, 394, (uint32*)window_ride_construction_events, WC_RIDE_CONSTRUCTION, WF_9); - colour_scheme_update(w); - - w->number = ride_id; - - window_push_others_right(w); - show_gridlines(); - return w; - } - - w = window_create(0, 29, 166, 394, (uint32*)window_construction_events, WC_RIDE_CONSTRUCTION, WF_9); - - w->widgets = (rct_widget*)0x9D7A90; + w->widgets = window_ride_construction_widgets; w->enabled_widgets = 0x67EFFFFFC4; window_init_scroll_widgets(w); @@ -159,48 +518,49 @@ rct_window *window_construction_open() w->colours[1] = 24; w->colours[2] = 24; - w->number = ride_id; + w->number = rideIndex; window_push_others_right(w); show_gridlines(); - RCT2_GLOBAL(0xF44070, uint32) = MONEY32_UNDEFINED; - RCT2_GLOBAL(0xF440CD, uint8) = 8; - RCT2_GLOBAL(0xF440CE, uint8) = 18; - RCT2_GLOBAL(0xF440CF, uint8) = 4; + _currentTrackPrice = MONEY32_UNDEFINED; + RCT2_GLOBAL(0x00F440CD, uint8) = 8; + RCT2_GLOBAL(0x00F440CE, uint8) = 18; + RCT2_GLOBAL(0x00F440CF, uint8) = 4; - if (ride->type == RIDE_TYPE_REVERSE_FREEFALL_COASTER){ - RCT2_GLOBAL(0xF440CE, uint8) = 30; - } + if (ride->type == RIDE_TYPE_REVERSE_FREEFALL_COASTER) + RCT2_GLOBAL(0x00F440CE, uint8) = 30; - if (ride->type == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER){ - RCT2_GLOBAL(0xF440CE, uint8) = 30; - } + if (ride->type == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) + RCT2_GLOBAL(0x00F440CE, uint8) = 30; - RCT2_GLOBAL(0xF440A0, uint16) = RCT2_ADDRESS(0x0097CC68, uint8)[ride->type * 2] | 0x100; - RCT2_GLOBAL(0x00F440B2, uint8) = 0; + _currentTrackCurve = RCT2_ADDRESS(0x0097CC68, uint8)[ride->type * 2] | 0x100; + _currentTrackSlopeEnd = 0; RCT2_GLOBAL(0x00F440B3, uint8) = 0; - RCT2_GLOBAL(0x00F440B4, uint8) = 0; - RCT2_GLOBAL(0x00F440B5, uint8) = 0; + _currentTrackLiftHill = 0; + _currentTrackCovered = 0; if (RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 4] & 0x8000) - RCT2_GLOBAL(0x00F440B5, uint8) |= 2; + _currentTrackCovered |= 2; RCT2_GLOBAL(0x00F440B6, uint8) = 0; RCT2_GLOBAL(0x00F440B7, uint8) = 0; RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = 0; - RCT2_GLOBAL(0x00F440A6, uint8) = 4; - RCT2_GLOBAL(0x00F440B0, uint8) = 0; - RCT2_GLOBAL(0x00F440B1, uint8) = 0; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_PLACE; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; RCT2_GLOBAL(0x00F44159, uint8) = 0; RCT2_GLOBAL(0x00F4415C, uint8) = 0; colour_scheme_update(w); return w; } -/* rct2: 0x006C845D */ -void window_construction_close() +/** + * + * rct2: 0x006C845D + */ +static void window_ride_construction_close() { rct_window *w; rct_xy_element mapElement; @@ -219,241 +579,2970 @@ void window_construction_close() hide_gridlines(); - uint8 rideIndex = RCT2_GLOBAL(0x00F440A7, uint8); - if (!sub_6CAF80(rideIndex, &mapElement)) { + uint8 rideIndex = _currentRideIndex; + if (sub_6CAF80(rideIndex, &mapElement)) { + window_ride_main_open(rideIndex); + } else { int eax = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8); RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = 0; game_do_command(0, 9, 0, rideIndex, GAME_COMMAND_7, 0, 0); RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = eax; - return; } - - window_ride_main_open(rideIndex); } - -void window_construction_maze_close(){ - rct_window *w; - - window_get_register(w); - - sub_6C9627(); - viewport_set_visibility(0); - - map_invalidate_map_selection_tiles(); - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 1); - - // In order to cancel the yellow arrow correctly the - // selection tool should be cancelled. - tool_cancel(); - - hide_gridlines(); - - uint8 ride_id = RCT2_GLOBAL(0xF440A7, uint8); - - rct_ride* ride = GET_RIDE(ride_id); - - if (ride->overall_view == 0xFFFF){ - int eax = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8); - - RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = 0; - game_do_command(0, 9, 0, ride_id, GAME_COMMAND_7, 0, 0); - - RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = eax; - return; - } - - window_ride_main_open(ride_id); -} - -void window_construction_mouseup_demolish(rct_window* w); - -/* rct2: 0x006C6E14 */ -void window_construction_mouseup(){ +/** + * + * rct2: 0x006C6E14 + */ +static void window_ride_construction_mouseup() +{ short widgetIndex; rct_window *w; window_widget_get_registers(w, widgetIndex); - RCT2_CALLPROC_X(0x6C6A77, 0, 0, 0, 0, 0, 0, 0); - + window_ride_construction_update_enabled_track_pieces(); switch (widgetIndex){ case WIDX_CLOSE: window_close(w); break; - case 27: - RCT2_CALLPROC_X(0x6C9296, 0, 0, 0, widgetIndex, (int)w, 0, 0); + case WIDX_NEXT_SECTION: + ride_select_next_section(); break; - case 26: - RCT2_CALLPROC_X(0x6C93B8, 0, 0, 0, widgetIndex, (int)w, 0, 0); + case WIDX_PREVIOUS_SECTION: + ride_select_previous_section(); break; - case 23: - RCT2_CALLPROC_X(0x6C9F72, 0, 0, 0, widgetIndex, (int)w, 0, 0); + case WIDX_CONSTRUCT: + window_ride_construction_construct(w); break; case WIDX_DEMOLISH: - window_construction_mouseup_demolish(w); + window_ride_construction_mouseup_demolish(w); break; - case 32: - RCT2_CALLPROC_X(0x6C78AA, 0, 0, 0, widgetIndex, (int)w, 0, 0); + case WIDX_ROTATE: + window_ride_construction_rotate(w); break; - case 29: - RCT2_CALLPROC_X(0x6C7802, 0, 0, 0, widgetIndex, (int)w, 0, 0); + case WIDX_ENTRANCE: + window_ride_construction_entrance_click(w); break; - case 30: - RCT2_CALLPROC_X(0x6C7866, 0, 0, 0, widgetIndex, (int)w, 0, 0); + case WIDX_EXIT: + window_ride_construction_exit_click(w); break; } } -/* rct2: 0x006C9BA5 */ -void window_construction_mouseup_demolish(rct_window* w){ - RCT2_CALLPROC_X(0x6C9BA5, 0, 0, 0, 0, (int)w, 0, 0); - return; +/** + * + * rct2: 0x006C7934 + */ +static void window_ride_construction_resize() +{ + rct_window *w; - RCT2_GLOBAL(0xF44070, uint32) = MONEY32_UNDEFINED; + window_get_register(w); + + window_ride_construction_update_enabled_track_pieces(); + w->enabled_widgets &= ~(1 << WIDX_CONSTRUCT); + if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_PLACE) { + w->enabled_widgets |= (1 << WIDX_CONSTRUCT); + } + + rct_ride *ride = GET_RIDE(_currentRideIndex); + int rideType = ride_get_alternative_type(ride); + + uint64 disabledWidgets = 0; + + if (_currentTrackCurve >= 256) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_GROUPBOX) | + (1ULL << WIDX_BANKING_GROUPBOX) | + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_LEVEL) | + (1ULL << WIDX_SLOPE_UP) | + (1ULL << WIDX_SLOPE_UP_STEEP) | + (1ULL << WIDX_CHAIN_LIFT) | + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_STRAIGHT) | + (1ULL << WIDX_BANK_RIGHT); + } + + // Disable large curves if the start or end of the track is sloped. + if (_previousTrackSlopeEnd != TRACK_SLOPE_NONE || _currentTrackSlopeEnd != TRACK_SLOPE_NONE) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_LARGE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE); + } + if (is_track_enabled(TRACK_SLOPE_CURVE) && is_track_enabled(TRACK_CURVE_VERY_SMALL)) { + // Disable small curves if the start or end of the track is sloped. + if (_previousTrackSlopeEnd != TRACK_SLOPE_NONE || _currentTrackSlopeEnd != TRACK_SLOPE_NONE) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL); + } + } + if (!is_track_enabled(TRACK_SLOPE_CURVE)) { + if (is_track_enabled(TRACK_CURVE_VERTICAL)) { + // Disable all curves only on vertical track + if (_previousTrackSlopeEnd != TRACK_SLOPE_UP_90 || _currentTrackSlopeEnd != TRACK_SLOPE_UP_90) { + if (_previousTrackSlopeEnd == TRACK_SLOPE_DOWN_90 && _currentTrackSlopeEnd != TRACK_SLOPE_DOWN_90) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL); + } + } + } else { + // Disable all curves on sloped track + if (_previousTrackSlopeEnd != TRACK_SLOPE_NONE || _currentTrackSlopeEnd != TRACK_SLOPE_NONE) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL); + } + } + } + if (!is_track_enabled(TRACK_FLAT_ROLL_BANKING)) { + // Disable banking + disabledWidgets |= + (1ULL << WIDX_BANKING_GROUPBOX) | + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_STRAIGHT) | + (1ULL << WIDX_BANK_RIGHT); + } + if (!is_track_enabled(TRACK_SLOPE) && !is_track_enabled(TRACK_SLOPE_STEEP)) { + if (rideType != RIDE_TYPE_REVERSE_FREEFALL_COASTER && rideType != RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) { + // Disable all slopes + disabledWidgets |= + (1ULL << WIDX_SLOPE_GROUPBOX) | + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_LEVEL) | + (1ULL << WIDX_SLOPE_UP) | + (1ULL << WIDX_SLOPE_UP_STEEP); + } + } + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_0) { + disabledWidgets |= + (1ULL << WIDX_CONSTRUCT) | + (1ULL << WIDX_DEMOLISH) | + (1ULL << WIDX_PREVIOUS_SECTION) | + (1ULL << WIDX_NEXT_SECTION); + } + switch (_currentTrackCurve) { + case TRACK_CURVE_LEFT_VERY_SMALL: + case TRACK_CURVE_LEFT_SMALL: + case TRACK_CURVE_LEFT: + case TRACK_CURVE_LEFT_LARGE: + disabledWidgets |= (1ULL << WIDX_BANK_RIGHT); + if (_previousTrackBankEnd == TRACK_BANK_NONE) { + disabledWidgets |= (1ULL << WIDX_BANK_LEFT); + } else { + disabledWidgets |= (1ULL << WIDX_BANK_STRAIGHT); + } + break; + case TRACK_CURVE_RIGHT_LARGE: + case TRACK_CURVE_RIGHT: + case TRACK_CURVE_RIGHT_SMALL: + case TRACK_CURVE_RIGHT_VERY_SMALL: + disabledWidgets |= (1ULL << WIDX_BANK_LEFT); + if (_previousTrackBankEnd == TRACK_BANK_NONE) { + disabledWidgets |= (1ULL << WIDX_BANK_RIGHT); + } else { + disabledWidgets |= (1ULL << WIDX_BANK_STRAIGHT); + } + break; + } + if (!is_track_enabled(TRACK_SLOPE_ROLL_BANKING)) { + if (_currentTrackBankEnd != TRACK_BANK_NONE) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_SLOPE_UP); + } + } + if (_previousTrackSlopeEnd == _currentTrackSlopeEnd) { + switch (_currentTrackSlopeEnd) { + case TRACK_SLOPE_UP_60: + case TRACK_SLOPE_DOWN_60: + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL); + if (!is_track_enabled(TRACK_SLOPE_CURVE_STEEP)) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE_SMALL); + } + break; + case TRACK_SLOPE_UP_90: + case TRACK_SLOPE_DOWN_90: + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL); + if (!is_track_enabled(TRACK_CURVE_VERTICAL)) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE_SMALL); + } + break; + } + } else { + // Disable all curves + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL); + } + + switch (_previousTrackSlopeEnd) { + case TRACK_SLOPE_NONE: + if (_currentTrackCurve != TRACK_CURVE_NONE) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_UP_STEEP); + } + break; + case TRACK_SLOPE_DOWN_25: + disabledWidgets |= + (1ULL << WIDX_SLOPE_UP) | + (1ULL << WIDX_SLOPE_UP_STEEP); + break; + case TRACK_SLOPE_DOWN_60: + disabledWidgets |= + (1ULL << WIDX_SLOPE_UP) | + (1ULL << WIDX_SLOPE_UP_STEEP); + if (!is_track_enabled(TRACK_SLOPE_LONG) && !is_track_enabled(TRACK_SLOPE_STEEP_LONG)) { + disabledWidgets |= (1ULL << WIDX_LEVEL); + } + break; + case TRACK_SLOPE_UP_25: + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_DOWN); + break; + case TRACK_SLOPE_UP_60: + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_DOWN); + if (!is_track_enabled(TRACK_SLOPE_LONG) && !is_track_enabled(TRACK_SLOPE_STEEP_LONG)) { + disabledWidgets |= (1ULL << WIDX_LEVEL); + } + break; + case TRACK_SLOPE_DOWN_90: + case TRACK_SLOPE_UP_90: + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_LEVEL) | + (1ULL << WIDX_SLOPE_UP); + break; + } + if (_previousTrackSlopeEnd == TRACK_SLOPE_NONE) { + if (!is_track_enabled(TRACK_SLOPE_LONG) && !is_track_enabled(TRACK_SLOPE_STEEP_LONG)) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_UP_STEEP); + } + } + if (is_track_enabled(TRACK_SLOPE_VERTICAL)) { + if (_previousTrackSlopeEnd == TRACK_SLOPE_UP_60 && _currentTrackPieceDirection < 4) { + disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN_STEEP); + } + if (_previousTrackSlopeEnd == TRACK_SLOPE_UP_90) { + disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN_STEEP); + } + if (_previousTrackSlopeEnd == TRACK_SLOPE_DOWN_60 && _currentTrackPieceDirection < 4) { + disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP_STEEP); + } + } + if (_previousTrackBankEnd == TRACK_BANK_LEFT) { + disabledWidgets |= + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE) | + (1ULL << WIDX_BANK_RIGHT); + } + if (_previousTrackBankEnd == TRACK_BANK_RIGHT) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_LEFT_CURVE_LARGE) | + (1ULL << WIDX_BANK_LEFT); + } + if (_currentTrackBankEnd != _previousTrackBankEnd) { + disabledWidgets |= + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_LEFT_CURVE_LARGE); + } + if (_currentTrackSlopeEnd != TRACK_SLOPE_NONE) { + if (is_track_enabled(TRACK_SLOPE_ROLL_BANKING)) { + if (_previousTrackSlopeEnd == TRACK_SLOPE_NONE) { + if (_currentTrackSlopeEnd != TRACK_SLOPE_UP_25 && _currentTrackSlopeEnd != TRACK_SLOPE_DOWN_25) { + disabledWidgets |= + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_RIGHT); + } + } else { + if (_currentTrackSlopeEnd != _previousTrackSlopeEnd) { + disabledWidgets |= + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_RIGHT); + } else { + if (_currentTrackSlopeEnd != TRACK_SLOPE_UP_25 && _currentTrackSlopeEnd != TRACK_SLOPE_DOWN_25) { + disabledWidgets |= + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_RIGHT); + } + } + } + } else { + disabledWidgets |= + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_RIGHT); + } + } + if (_currentTrackBankEnd != TRACK_BANK_NONE || _previousTrackBankEnd != TRACK_BANK_NONE) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_UP_STEEP) | + (1ULL << WIDX_CHAIN_LIFT); + } + if (_currentTrackCurve != TRACK_CURVE_NONE) { + if (!is_track_enabled(TRACK_LIFT_HILL_CURVE)) { + disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT); + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE) { + disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT); + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_60) { + disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT); + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_DOWN_60) { + disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT); + } + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_90 || _previousTrackSlopeEnd == TRACK_SLOPE_UP_90) { + disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT); + } + if (_previousTrackBankEnd == TRACK_BANK_UPSIDE_DOWN) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_LEFT_CURVE_LARGE) | + (1ULL << WIDX_STRAIGHT) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE); + } + if (_currentTrackCurve != TRACK_CURVE_NONE) { + if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_SLOPE_UP); + } + if (_currentTrackSlopeEnd == _previousTrackSlopeEnd) { + if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_25) { + disabledWidgets |= (1ULL << WIDX_SLOPE_UP_STEEP); + if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL || _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL || _rideConstructionState != RIDE_CONSTRUCTION_STATE_BACK || !is_track_enabled(TRACK_SLOPE_CURVE_BANKED)) { + disabledWidgets |= (1ULL << WIDX_LEVEL); + } + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_DOWN_25) { + disabledWidgets |= (1ULL << WIDX_SLOPE_DOWN_STEEP); + if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL || _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL || _rideConstructionState != RIDE_CONSTRUCTION_STATE_FRONT || !is_track_enabled(TRACK_SLOPE_CURVE_BANKED)) { + disabledWidgets |= (1ULL << WIDX_LEVEL); + } + } + } else if (is_track_enabled(TRACK_SLOPE_CURVE_BANKED)) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_UP_STEEP); + if (_currentTrackBankEnd == TRACK_BANK_LEFT) { + disabledWidgets |= + (1ULL << WIDX_BANK_STRAIGHT) | + (1ULL << WIDX_BANK_RIGHT); + disabledWidgets &= ~(1ULL << WIDX_BANK_LEFT); + } + if (_currentTrackBankEnd == TRACK_BANK_RIGHT) { + disabledWidgets |= + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_STRAIGHT); + disabledWidgets &= ~(1ULL << WIDX_BANK_RIGHT); + } + if (_currentTrackBankEnd == TRACK_BANK_NONE) { + disabledWidgets |= + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_RIGHT); + disabledWidgets &= ~(1ULL << WIDX_BANK_STRAIGHT); + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_SLOPE_UP); + disabledWidgets &= ~(1ULL << WIDX_LEVEL); + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_25) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_LEVEL); + disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP); + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_DOWN_25) { + disabledWidgets |= + (1ULL << WIDX_LEVEL) | + (1ULL << WIDX_SLOPE_UP); + disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN); + } + if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL) { + disabledWidgets &= ~(1ULL << WIDX_LEFT_CURVE_SMALL); + } + if (_currentTrackCurve == TRACK_CURVE_RIGHT_SMALL) { + disabledWidgets &= ~(1ULL << WIDX_RIGHT_CURVE_SMALL); + } + } + } + if (_currentTrackCurve != TRACK_CURVE_NONE && _currentTrackSlopeEnd == TRACK_SLOPE_UP_60) { + disabledWidgets |= (1ULL << WIDX_SLOPE_UP); + } + if (_currentTrackCurve != TRACK_CURVE_NONE && _currentTrackSlopeEnd == TRACK_SLOPE_DOWN_60) { + disabledWidgets |= (1ULL << WIDX_SLOPE_DOWN); + } + if (_currentTrackLiftHill & 1) { + if (_currentTrackSlopeEnd != TRACK_SLOPE_NONE && !is_track_enabled(TRACK_LIFT_HILL_CURVE)) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_LEFT_CURVE_LARGE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE); + } + if (!is_track_enabled(TRACK_LIFT_HILL_STEEP)) { + if (w->widgets[WIDX_SLOPE_UP_STEEP].tooltip == STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP) { + disabledWidgets |= (1ULL << WIDX_SLOPE_UP_STEEP); + } + } + } + if (_previousTrackSlopeEnd == TRACK_SLOPE_UP_60 && _currentTrackCurve != TRACK_CURVE_NONE) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_LEVEL); + } + if (_previousTrackSlopeEnd == TRACK_SLOPE_DOWN_60 && _currentTrackCurve != TRACK_CURVE_NONE) { + disabledWidgets |= + (1ULL << WIDX_LEVEL) | + (1ULL << WIDX_SLOPE_UP_STEEP); + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_90 || _previousTrackSlopeEnd == TRACK_SLOPE_UP_90) { + if (_currentTrackCurve != TRACK_CURVE_NONE) { + disabledWidgets |= (1ULL << WIDX_SLOPE_UP_STEEP); + } + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_LARGE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE); + if (rideType == RIDE_TYPE_REVERSE_FREEFALL_COASTER || rideType == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) { + disabledWidgets |= + (1ULL << WIDX_STRAIGHT) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE); + } + } else if (_currentTrackSlopeEnd == TRACK_SLOPE_DOWN_90 || _previousTrackSlopeEnd == TRACK_SLOPE_DOWN_90) { + if (_currentTrackCurve != TRACK_CURVE_NONE) { + disabledWidgets |= (1ULL << WIDX_SLOPE_DOWN_STEEP); + } + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_LARGE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE); + if (rideType == RIDE_TYPE_REVERSE_FREEFALL_COASTER || rideType == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) { + disabledWidgets |= + (1ULL << WIDX_STRAIGHT) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE); + } + } + if (is_track_enabled(TRACK_HELIX_LARGE_UNBANKED)) { + if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE && _currentTrackBankEnd == TRACK_SLOPE_NONE) { + if (_currentTrackCurve == TRACK_CURVE_LEFT || _currentTrackCurve == TRACK_CURVE_RIGHT) { + if (_currentTrackSlopeEnd == _previousTrackSlopeEnd) { + disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN_STEEP); + disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP_STEEP); + } + } + } + } else if ( + ( + is_track_enabled(TRACK_HELIX_SMALL) || + (_currentTrackCurve != TRACK_CURVE_LEFT_SMALL && _currentTrackCurve != TRACK_CURVE_RIGHT_SMALL && !is_track_enabled(TRACK_HELIX_LARGE)) + ) && + ( + _currentTrackCurve == TRACK_CURVE_LEFT || + _currentTrackCurve == TRACK_CURVE_RIGHT || + _currentTrackCurve == TRACK_CURVE_LEFT_SMALL || + _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL + ) && + (_currentTrackSlopeEnd == TRACK_SLOPE_NONE && _currentTrackBankEnd != TRACK_BANK_NONE) + ) { + if (_previousTrackSlopeEnd == _currentTrackSlopeEnd) { + // Enable helix + disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN_STEEP); + disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP_STEEP); + } + } + if (is_track_enabled(TRACK_SLOPE_CURVE_BANKED)) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) { + if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL || _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL) { + if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE && _previousTrackBankEnd != TRACK_BANK_NONE) { + disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP); + } + } + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL || _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL) { + if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE && _previousTrackBankEnd != TRACK_BANK_NONE) { + disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN); + } + } + } + } + if (_currentTrackPieceDirection >= 4) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL); + } + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) { + disabledWidgets |= (1ULL << WIDX_NEXT_SECTION); + if (sub_6CA2DF(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) { + disabledWidgets |= (1ULL << WIDX_CONSTRUCT); + } + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + disabledWidgets |= (1ULL << WIDX_PREVIOUS_SECTION); + if (sub_6CA2DF(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) { + disabledWidgets |= (1ULL << WIDX_CONSTRUCT); + } + } + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_12)) { + disabledWidgets &= ~(1ULL << WIDX_BANKING_GROUPBOX); + } + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT || _rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + disabledWidgets |= + (1ULL << WIDX_DIRECTION_GROUPBOX) | + (1ULL << WIDX_SLOPE_GROUPBOX) | + (1ULL << WIDX_BANKING_GROUPBOX) | + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_STRAIGHT) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL) | + (1ULL << WIDX_SPECIAL_TRACK_DROPDOWN) | + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_LEVEL) | + (1ULL << WIDX_SLOPE_UP) | + (1ULL << WIDX_SLOPE_UP_STEEP) | + (1ULL << WIDX_CHAIN_LIFT) | + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_STRAIGHT) | + (1ULL << WIDX_BANK_RIGHT) | + (1ULL << WIDX_LEFT_CURVE_LARGE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE); + } + if (RCT2_GLOBAL(0x00F440D3, uint8) != 0) { + disabledWidgets &= ~(1ULL << WIDX_BANKING_GROUPBOX); + disabledWidgets &= ~(1ULL << WIDX_BANK_LEFT); + disabledWidgets &= ~(1ULL << WIDX_BANK_STRAIGHT); + disabledWidgets &= ~(1ULL << WIDX_BANK_RIGHT); + } + + // Set and invalidate the changed widgets + uint64 currentDisabledWidgets = w->disabled_widgets; + if (currentDisabledWidgets == disabledWidgets) + return; + + for (int i = 0; i < 64; i++) { + if ((disabledWidgets & (1ULL << i)) != (currentDisabledWidgets & (1ULL << i))) { + widget_invalidate(w, i); + } + } + w->disabled_widgets = disabledWidgets; +} + +/** + * + * rct2: 0x006C6E6A + */ +static void window_ride_construction_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) +{ + rct_ride *ride = GET_RIDE(_currentRideIndex); + int rideType; + + window_ride_construction_update_enabled_track_pieces(); + switch (widgetIndex) { + case WIDX_LEFT_CURVE: + sub_6C9627(); + _currentTrackCurve = 1; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_RIGHT_CURVE: + sub_6C9627(); + _currentTrackCurve = 2; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_LEFT_CURVE_SMALL: + sub_6C9627(); + _currentTrackCurve = 3; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_RIGHT_CURVE_SMALL: + sub_6C9627(); + _currentTrackCurve = 4; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_LEFT_CURVE_VERY_SMALL: + sub_6C9627(); + _currentTrackCurve = 5; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_RIGHT_CURVE_VERY_SMALL: + sub_6C9627(); + _currentTrackCurve = 6; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_LEFT_CURVE_LARGE: + sub_6C9627(); + _currentTrackCurve = 7; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_RIGHT_CURVE_LARGE: + sub_6C9627(); + _currentTrackCurve = 8; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_STRAIGHT: + sub_6C9627(); + if (_currentTrackCurve != 0) + _currentTrackBankEnd = TRACK_BANK_NONE; + _currentTrackCurve = 0; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_SLOPE_DOWN_STEEP: + sub_6C9627(); + rideType = _currentTrackCovered & 2 ? RCT2_ADDRESS(0x0097D4F5, uint8)[ride->type * 8] : ride->type; + if (is_track_enabled(TRACK_HELIX_SMALL)) { + if (_currentTrackCurve == 1 && _currentTrackBankEnd == TRACK_BANK_LEFT) { + _currentTrackCurve = 349; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 2 && _currentTrackBankEnd == TRACK_BANK_RIGHT) { + _currentTrackCurve = 350; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 3 && _currentTrackBankEnd == TRACK_BANK_LEFT) { + _currentTrackCurve = 345; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 4 && _currentTrackBankEnd == TRACK_BANK_RIGHT) { + _currentTrackCurve = 346; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } + } + if (is_track_enabled(TRACK_HELIX_LARGE)) { + if (_currentTrackCurve == 1 && _currentTrackBankEnd == TRACK_BANK_LEFT) { + _currentTrackCurve = 360; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 2 && _currentTrackBankEnd == TRACK_BANK_RIGHT) { + _currentTrackCurve = 361; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } + } + if (is_track_enabled(TRACK_HELIX_LARGE_UNBANKED)) { + if (_currentTrackBankEnd == TRACK_BANK_NONE) { + if (_currentTrackCurve == 1) { + _currentTrackCurve = 364; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 2) { + _currentTrackCurve = 365; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } + } + } + if (w->widgets[WIDX_SLOPE_DOWN_STEEP].tooltip == STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP) { + loc_6C7502(8); + } else { + loc_6C7502(10); + } + break; + case WIDX_SLOPE_DOWN: + sub_6C9627(); + if (_rideConstructionState == 2 && _currentTrackBankEnd != TRACK_BANK_NONE) { + _currentTrackBankEnd = TRACK_BANK_NONE; + } + loc_6C7502(6); + break; + case WIDX_LEVEL: + sub_6C9627(); + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT && _previousTrackSlopeEnd == 6) { + if (_currentTrackCurve == 3) { + _currentTrackBankEnd = TRACK_BANK_LEFT; + } else if (_currentTrackCurve == 4) { + _currentTrackBankEnd = TRACK_BANK_RIGHT; + } + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK && _previousTrackSlopeEnd == 2) { + if (_currentTrackCurve == 3) { + _currentTrackBankEnd = TRACK_BANK_LEFT; + } else if (_currentTrackCurve == 4) { + _currentTrackBankEnd = TRACK_BANK_RIGHT; + } + } + loc_6C7502(0); + break; + case WIDX_SLOPE_UP: + sub_6C9627(); + if (_rideConstructionState == 1 && _currentTrackBankEnd != TRACK_BANK_NONE) { + _currentTrackBankEnd = TRACK_BANK_NONE; + } + if (ride->type == RIDE_TYPE_REVERSE_FREEFALL_COASTER || ride->type == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT && _currentTrackCurve == 0) { + _currentTrackCurve = 124 | 0x100; + sub_6C84CE(); + } + } else { + loc_6C7502(2); + } + break; + case WIDX_SLOPE_UP_STEEP: + sub_6C9627(); + rideType = _currentTrackCovered & 2 ? RCT2_ADDRESS(0x0097D4F5, uint8)[ride->type * 8] : ride->type; + if (is_track_enabled(TRACK_HELIX_SMALL)) { + if (_currentTrackCurve == 1 && _currentTrackBankEnd == TRACK_BANK_LEFT) { + _currentTrackCurve = 347; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 2 && _currentTrackBankEnd == TRACK_BANK_RIGHT) { + _currentTrackCurve = 348; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 3 && _currentTrackBankEnd == TRACK_BANK_LEFT) { + _currentTrackCurve = 343; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 4 && _currentTrackBankEnd == TRACK_BANK_RIGHT) { + _currentTrackCurve = 344; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } + } + if (is_track_enabled(TRACK_HELIX_LARGE)) { + if (_currentTrackCurve == 1 && _currentTrackBankEnd == TRACK_BANK_LEFT) { + _currentTrackCurve = 358; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 2 && _currentTrackBankEnd == TRACK_BANK_RIGHT) { + _currentTrackCurve = 359; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } + } + if (is_track_enabled(TRACK_HELIX_LARGE_UNBANKED)) { + if (_currentTrackBankEnd == TRACK_BANK_NONE) { + if (_currentTrackCurve == 1) { + _currentTrackCurve = 362; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 2) { + _currentTrackCurve = 363; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } + } + } + if (w->widgets[WIDX_SLOPE_UP_STEEP].tooltip == STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP) { + loc_6C7502(4); + } else { + loc_6C7502(18); + } + break; + case WIDX_CHAIN_LIFT: + sub_6C9627(); + _currentTrackLiftHill ^= 1; + if (_currentTrackLiftHill & 1) { + _currentTrackCovered &= ~1; + } + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_BANK_LEFT: + sub_6C9627(); + if (RCT2_GLOBAL(0x00F440D3, uint8) == 0) { + _currentTrackBankEnd = TRACK_BANK_LEFT; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + } + break; + case WIDX_BANK_STRAIGHT: + sub_6C9627(); + if (RCT2_GLOBAL(0x00F440D3, uint8) == 0) { + _currentTrackBankEnd = TRACK_BANK_NONE; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + } else { + uint8 *ebp = (uint8*)0x00F440CD; + uint8 bl = 30; + if (RCT2_GLOBAL(0x00F440D3, uint8) != 1) { + ebp = (uint8*)0x00F440CE; + bl = RCT2_GLOBAL(0x0097CF40 + 6 + (ride->type * 8), uint8); + } + uint8 bh = *ebp + 2; + if (bh <= bl) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + loc_6C76E9(); + } else { + *ebp = bh; + sub_6C84CE(); + } + } + } + break; + case WIDX_BANK_RIGHT: + sub_6C9627(); + if (RCT2_GLOBAL(0x00F440D3, uint8) == 0) { + _currentTrackBankEnd = TRACK_BANK_RIGHT; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + } else { + uint8 *ebp = (uint8*)0x00F440CD; + if (RCT2_GLOBAL(0x00F440D3, uint8) != 1) { + ebp = (uint8*)0x00F440CE; + } + uint8 bh = *ebp - 2; + if (bh >= 2) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + loc_6C76E9(); + } else { + *ebp = bh; + sub_6C84CE(); + } + } + } + break; + case WIDX_SPECIAL_TRACK_DROPDOWN: + window_ride_construction_show_special_track_dropdown(w, widget); + break; + case WIDX_U_TRACK: + sub_6C9627(); + _currentTrackCovered &= ~1; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_O_TRACK: + sub_6C9627(); + _currentTrackCovered |= 1; + _currentTrackLiftHill &= ~1; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_SEAT_ROTATION_ANGLE_SPINNER_UP: + if (_currentSeatRotationAngle < 15) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + ride_selected_track_set_seat_rotation(_currentSeatRotationAngle + 1); + } else { + _currentSeatRotationAngle++; + sub_6C84CE(); + } + } + break; + case WIDX_SEAT_ROTATION_ANGLE_SPINNER_DOWN: + if (_currentSeatRotationAngle > 0) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + ride_selected_track_set_seat_rotation(_currentSeatRotationAngle - 1); + } else { + _currentSeatRotationAngle--; + sub_6C84CE(); + } + } + break; + } +} + +/** + * + * rct2: 0x006C78CD + */ +static void window_ride_construction_dropdown() +{ + short dropdownIndex, widgetIndex; + rct_window *w; + + window_dropdown_get_registers(w, widgetIndex, dropdownIndex); + + if (widgetIndex != WIDX_SPECIAL_TRACK_DROPDOWN) + return; + if (dropdownIndex == -1) + return; + + sub_6C9627(); + _currentTrackPrice = MONEY32_UNDEFINED; + int trackPiece = _currentPossibleRideConfigurations[dropdownIndex]; + switch (trackPiece) { + case TRACK_ELEM_END_STATION: + case TRACK_ELEM_S_BEND_LEFT: + case TRACK_ELEM_S_BEND_RIGHT: + _currentTrackSlopeEnd = 0; + break; + case TRACK_ELEM_LEFT_VERTICAL_LOOP: + case TRACK_ELEM_RIGHT_VERTICAL_LOOP: + _currentTrackBankEnd = TRACK_BANK_NONE; + _currentTrackLiftHill &= ~1; + break; + } + _currentTrackCurve = trackPiece | 0x100; + sub_6C84CE(); +} + +/** + * + * rct2: 0x006C9F72 + */ +static void window_ride_construction_construct(rct_window *w) +{ + int trackType, trackDirection, rideIndex, edxRS16, x, y, z, seatRotation; + track_begin_end trackBeginEnd; + + _currentTrackPrice = MONEY32_UNDEFINED; + RCT2_GLOBAL(0x00F44074, money32) = MONEY32_UNDEFINED; + sub_6C9627(); + if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, &seatRotation)) { + sub_6C84CE(); + return; + } + + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + RCT2_GLOBAL(0x00F44074, money32) = game_do_command( + x, + (GAME_COMMAND_FLAG_APPLY) | (trackDirection << 8), + y, + rideIndex | (trackType << 8) | (edxRS16 << 16), + GAME_COMMAND_PLACE_TRACK, + z | (seatRotation << 28), + 0 + ); + if (RCT2_GLOBAL(0x00F44074, money32) == MONEY32_UNDEFINED) { + sub_6C84CE(); + return; + } + + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + + if (RCT2_GLOBAL(0x00F441D4, uint8) & 2) { + viewport_set_visibility(1); + } + + if ( + (_currentTrackCurve >= 343 && _currentTrackCurve <= 350) || + (_currentTrackCurve >= 358 && _currentTrackCurve <= 365) || + (_currentTrackSlopeEnd != TRACK_SLOPE_NONE) + ) { + viewport_set_visibility(2); + } + + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex; + trackDirection = _currentTrackPieceDirection ^ 2; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + if (!(trackDirection & 4)) { + x += TileDirectionDelta[trackDirection].x; + y += TileDirectionDelta[trackDirection].y; + } + + if (sub_6C63D6(x, y, z, trackDirection, &trackBeginEnd)) { + _currentTrackBeginX = trackBeginEnd.begin_x; + _currentTrackBeginY = trackBeginEnd.begin_y; + _currentTrackBeginZ = trackBeginEnd.begin_z; + _currentTrackPieceDirection = trackBeginEnd.begin_direction; + _currentTrackPieceType = trackBeginEnd.begin_element->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + ride_select_previous_section(); + } else { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_0; + } + } else { + RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex; + trackDirection = _currentTrackPieceDirection; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + if (!(trackDirection & 4)) { + x -= TileDirectionDelta[trackDirection].x; + y -= TileDirectionDelta[trackDirection].y; + } + + int dir2; + rct_map_element *mapElement = sub_6C6096(&x, &y, &z, &trackDirection, &dir2); + if (mapElement != NULL) { + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; + _currentTrackPieceType = mapElement->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + ride_select_next_section(); + } else { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_0; + } + } + + sub_6C84CE(); +} + +/** + * + * rct2: 0x006C9BA5 + */ +static void window_ride_construction_mouseup_demolish(rct_window* w) +{ + int x, y, z, direction, type, slope, slopeEnd, b2, bankEnd, bankStart, b5, b4; + rct_map_element *mapElement; + rct_xy_element inputElement, outputElement; + track_begin_end trackBeginEnd; + bool gotoStartPlacementMode; + + _currentTrackPrice = MONEY32_UNDEFINED; sub_6C9627(); - RCT2_GLOBAL(0xF440B8, uint8) = 3; - if (RCT2_GLOBAL(0xF440A6, uint8) == 1){ - //6C9C4F + // Select the track element that is to be deleted + RCT2_GLOBAL(0x00F440B8, uint8) = 3; + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) { + if (!ride_select_backwards_from_front()) { + sub_6C84CE(); + return; + } + RCT2_GLOBAL(0x00F440B8, uint8) = 1; + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + if (!ride_select_forwards_from_back()) { + sub_6C84CE(); + return; + } + RCT2_GLOBAL(0x00F440B8, uint8) = 2; } - if (RCT2_GLOBAL(0xF440A6, uint8) != 2){ - //6c9cc4 - int eax = RCT2_GLOBAL(0xF440A8, uint16), - ebx = RCT2_GLOBAL(0xF440AF, uint8) || (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) << 8), - ecx = RCT2_GLOBAL(0xF440AA, uint16), - edx = RCT2_GLOBAL(0xF440AC, uint16); - - sub_6C683D(&eax, &ecx, &edx, RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8), RCT2_GLOBAL(0xF440AF, uint8) & 0x3FF, 0, 0, 0); + // Invalidate the selected track element or make sure its at origin??? + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection; + type = _currentTrackPieceType; + if (sub_6C683D(&x, &y, &z, direction & 3, type, 0, &mapElement, 0)) { + sub_6C84CE(); + return; } - int ride_id = RCT2_GLOBAL(0xF440A7, uint8); - RCT2_GLOBAL(0xF441D2, uint8) = ride_id; - //6c9BFE + // Get the previous track element to go to after the selected track element is deleted + inputElement.x = x; + inputElement.y = y; + inputElement.element = mapElement; + if (track_get_previous(x, y, mapElement, &trackBeginEnd)) { + x = trackBeginEnd.begin_x; + y = trackBeginEnd.begin_y; + z = trackBeginEnd.begin_z; + direction = trackBeginEnd.begin_direction; + type = trackBeginEnd.begin_element->properties.track.type; + gotoStartPlacementMode = false; + } else if (track_get_next(&inputElement, &outputElement, &z, &direction)) { + x = outputElement.x; + y = outputElement.y; + direction = outputElement.element->type & MAP_ELEMENT_DIRECTION_MASK; + type = outputElement.element->properties.track.type; + gotoStartPlacementMode = false; + } else { + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection; + type = _currentTrackPieceType; + + if (sub_6C683D(&x, &y, &z, direction, type, 0, &mapElement, 0)) { + sub_6C84CE(); + return; + } + + rct_preview_track *trackBlock = get_track_def_from_ride_index(_currentRideIndex, mapElement->properties.track.type); + z = (mapElement->base_height * 8) - trackBlock->z; + gotoStartPlacementMode = true; + } + + money32 cost = ride_remove_track_piece( + _currentTrackBeginX, + _currentTrackBeginY, + _currentTrackBeginZ, + _currentTrackPieceDirection, + _currentTrackPieceType + ); + if (cost == MONEY32_UNDEFINED) { + sub_6C84CE(); + return; + } + + if (gotoStartPlacementMode) { + z &= 0xFFF0; + _currentTrackBeginZ = z; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_FRONT; + _currentTrackSlopeEnd = 0; + _rideConstructionArrowPulseTime = 0; + direction = _currentTrackPieceDirection; + slope = _currentTrackCurve; + slopeEnd = _previousTrackSlopeEnd; + b2 = _currentTrackSlopeEnd; + bankEnd = _previousTrackBankEnd; + bankStart = _currentTrackBankEnd; + b5 = _currentTrackCovered; + b4 = _currentTrackLiftHill; + sub_6C9800(); + sub_6C84CE(); + if (!sub_6CAF80(_currentRideIndex, &outputElement)) { + sub_6CC3FB(_currentRideIndex); + _currentTrackPieceDirection = _currentTrackPieceDirection; + if (slope & 0x100) { + _currentTrackCurve = slope; + _previousTrackSlopeEnd = slopeEnd; + _currentTrackSlopeEnd = b2; + _previousTrackBankEnd = bankEnd; + _currentTrackBankEnd = bankStart; + _currentTrackCovered = b5; + _currentTrackLiftHill = b4; + sub_6C84CE(); + } + } + } else { + if (RCT2_GLOBAL(0x00F440B8, uint8) == 3 || RCT2_GLOBAL(0x00F440B8, uint8) == 1) { + if (type == TRACK_ELEM_MIDDLE_STATION || type == TRACK_ELEM_BEGIN_STATION) { + type = TRACK_ELEM_END_STATION; + } + } + if (RCT2_GLOBAL(0x00F440B8, uint8) == 2) { + if (type == TRACK_ELEM_MIDDLE_STATION) { + type = TRACK_ELEM_BEGIN_STATION; + } + } + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = direction; + _currentTrackPieceType = type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + if (RCT2_GLOBAL(0x00F440B8, uint8) == 1) { + ride_select_next_section(); + } else if (RCT2_GLOBAL(0x00F440B8, uint8) == 2) { + ride_select_previous_section(); + } + sub_6C84CE(); + } } -void window_construction_maze_invalidate() +/** + * + * rct2: 0x006C78AA + */ +static void window_ride_construction_rotate(rct_window *w) { - int ride_idx = RCT2_GLOBAL(0x00F440A7, uint8); - RCT2_GLOBAL(0x13CE958, uint32_t) = RCT2_GLOBAL(0x1362944 + ride_idx * 0x260, uint32_t); - RCT2_GLOBAL(0x13CE956, uint16_t) = RCT2_GLOBAL(0x1362942 + ride_idx * 0x260, uint16_t); + _currentTrackPieceDirection = (_currentTrackPieceDirection + 1) & 3; + sub_6C9627(); + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); } -//0x6C6B86 -void window_construction_paint() +/** + * + * rct2: 0x006C7802 + */ +static void window_ride_construction_entrance_click(rct_window *w) +{ + if (tool_set(w, WIDX_ENTRANCE, 12)) { + if (!sub_6CAF80(_currentRideIndex, NULL)) { + sub_6CC3FB(_currentRideIndex); + } + } else { + RCT2_GLOBAL(0x00F44191, uint8) = 0; + RCT2_GLOBAL(0x00F44192, uint8) = w->number & 0xFF; + RCT2_GLOBAL(0x00F44193, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint8) |= INPUT_FLAG_6; + sub_6C9627(); + if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT) { + RCT2_GLOBAL(0x00F440CC, uint8) = _rideConstructionState; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT; + } + sub_6C84CE(); + } +} + +/** + * + * rct2: 0x006C7866 + */ +static void window_ride_construction_exit_click(rct_window *w) +{ + if (tool_set(w, WIDX_EXIT, 12)) { + if (!sub_6CAF80(_currentRideIndex, NULL)) { + sub_6CC3FB(_currentRideIndex); + } + } else { + RCT2_GLOBAL(0x00F44191, uint8) = 1; + RCT2_GLOBAL(0x00F44192, uint8) = w->number & 0xFF; + RCT2_GLOBAL(0x00F44193, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint8) |= INPUT_FLAG_6; + sub_6C9627(); + if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT) { + RCT2_GLOBAL(0x00F440CC, uint8) = _rideConstructionState; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT; + } + sub_6C84CE(); + } +} + +/** + * + * rct2: 0x006C8374 + */ +static void window_ride_construction_update(rct_window *w) +{ + switch (_currentTrackCurve) { + case 429: + case 376: + case 369: + case 368: + widget_invalidate(w, WIDX_CONSTRUCT); + break; + } + + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_PLACE) { + if (!widget_is_active_tool(w, WIDX_CONSTRUCT)) { + window_close(w); + return; + } + } + + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT) { + if (!widget_is_active_tool(w, WIDX_ENTRANCE) && !widget_is_active_tool(w, WIDX_EXIT)) { + _rideConstructionState = RCT2_GLOBAL(0x00F440CC, uint8); + sub_6C84CE(); + } + } + + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_FRONT: + case RIDE_CONSTRUCTION_STATE_BACK: + case RIDE_CONSTRUCTION_STATE_SELECTED: + if ( + (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && + RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) == WC_RIDE_CONSTRUCTION + ) { + tool_cancel(); + } + break; + } + + sub_6C94D8(); +} + +/** + * + * rct2: 0x006CC538 + */ +static bool ride_get_place_position_from_screen_position(int screenX, int screenY, int *outX, int *outY) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + eax = screenX; + ebx = screenY; + RCT2_CALLFUNC_X(0x006CC538, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + + if (outX != NULL) *outX = eax & 0xFFFF; + if (outY != NULL) *outY = ebx & 0xFFFF; + + return (eax & 0xFFFF) != 0x8000; +} + +/** + * + * rct2: 0x006C8229 + */ +static void window_ride_construction_toolupdate() { rct_window *w; - rct_drawpixelinfo *dpi; + short screenX, screenY, widgetIndex; + + window_tool_get_registers(w, widgetIndex, screenX, screenY); + + switch (widgetIndex) { + case WIDX_CONSTRUCT: + ride_construction_toolupdate_construct(screenX, screenY); + break; + case WIDX_ENTRANCE: + case WIDX_EXIT: + ride_construction_toolupdate_entrance_exit(screenX, screenY); + break; + } +} + +/** + * + * rct2: 0x006C8248 + */ +static void window_ride_construction_tooldown() +{ + rct_window *w; + short screenX, screenY, widgetIndex; + + window_tool_get_registers(w, widgetIndex, screenX, screenY); + + switch (widgetIndex) { + case WIDX_CONSTRUCT: + ride_construction_tooldown_construct(screenX, screenY); + break; + case WIDX_ENTRANCE: + case WIDX_EXIT: + ride_construction_tooldown_entrance_exit(screenX, screenY); + break; + } +} + +/** + * + * rct2: 0x006C6AD5 + */ +static void window_ride_construction_invalidate() +{ + rct_window *w; + rct_ride *ride; + rct_string_id stringId; + + window_get_register(w); + + ride = GET_RIDE(_currentRideIndex); + + stringId = STR_RIDE_CONSTRUCTION_SPECIAL; + if (_currentTrackCurve >= 256) { + stringId = RCT2_ADDRESS(0x00999492, rct_string_id)[_currentTrackCurve - 256]; + if (stringId == STR_RAPIDS && ride->type == RIDE_TYPE_CAR_RIDE) + stringId = STR_LOG_BUMPS; + } + RCT2_GLOBAL(0x013CE952, uint16) = stringId; + + if (RCT2_GLOBAL(0x00F440D3, uint8) == 1) + RCT2_GLOBAL(0x013CE952 + 2, uint16) = ((RCT2_GLOBAL(0x00F440CD, uint8) * 9) >> 2) & 0xFFFF; + + window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER].image = + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_180 + RCT2_GLOBAL(0x00F440CF, uint8); + + if (RCT2_GLOBAL(0x00F440D3, uint8) == 2) + RCT2_GLOBAL(0x013CE952 + 2, uint16) = ((RCT2_GLOBAL(0x00F440CE, uint8) * 9) >> 2) & 0xFFFF; + + // Set window title arguments + RCT2_GLOBAL(0x013CE952 + 4, uint16) = ride->name; + RCT2_GLOBAL(0x013CE952 + 6, uint32) = ride->name_arguments; +} + +/** + * + * rct2: 0x006C6B86 + */ +static void window_ride_construction_paint() +{ + rct_window *w; + rct_drawpixelinfo *dpi, *clipdpi; + rct_widget *widget; + int x, y, width, height; + window_paint_get_registers(w, dpi); + window_draw_widgets(w, dpi); - if (RCT2_GLOBAL(0x9D7C00, uint8_t) == 0) return; - uint32_t eax = 0, esi = (uint32_t)w, ebp = 0;//nothing - uint32_t ebx = 0, ecx = 0, edx = 0, edi = (uint32_t)dpi;//returns - if (RCT2_CALLFUNC_X(0x6CA2DF, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) return; - RCT2_GLOBAL(0xF44133, uint8_t) = edx & 0xFF; - RCT2_GLOBAL(0xF44134, uint8_t) = (ebx >> 8) & 0xFF; - RCT2_GLOBAL(0xF44135, uint8_t) = (edx >> 8) & 0xFF; - edx >>= 16; - RCT2_GLOBAL(0xF44136, int16_t) = edx; - rct_ride* ride = GET_RIDE(RCT2_GLOBAL(0xF44133, uint8)); - RCT2_GLOBAL(0xF44064, uint32_t) = RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + ride->type * 8, uint32_t); - // 0x009D7C04 is a widget address remember to change when widget implemented - short width = RCT2_GLOBAL(0x9D7C04, int16_t) - RCT2_GLOBAL(0x9D7C02, int16_t) - 1; - short height = RCT2_GLOBAL(0x9D7C08, int16_t) - RCT2_GLOBAL(0x9D7C06, int16_t) - 1; - rct_drawpixelinfo* clip_dpi = clip_drawpixelinfo( - dpi, - // 0x009D7C02 is a widget address remember to change when widget implemented - w->x + RCT2_GLOBAL(0x9D7C02, int16_t) + 1, - width, - w->y + RCT2_GLOBAL(0x9D7C06, int16_t) + 1, - height); - if (clip_dpi != NULL) - { - rct_preview_track *trackBlock; - ecx = RCT2_GLOBAL(0xF44135, uint8_t); - if (RCT2_GLOBAL(0xF44064, uint32_t) & 0x80000) trackBlock = RCT2_ADDRESS(0x994A38, rct_preview_track*)[ecx];//RCT2_GLOBAL(0x994A38 + ecx * 4, rct_preview_track*); - else trackBlock = RCT2_ADDRESS(0x994638, rct_preview_track*)[ecx];//RCT2_GLOBAL(0x994638 + ecx * 4, rct_preview_track*); - while ((trackBlock + 1)->var_00 != 0xFF) trackBlock++; - short x = trackBlock->x; - short z = trackBlock->z; - short y = trackBlock->y; - if (trackBlock->var_09 & 2) x = y = 0; - short tmp; - switch (RCT2_GLOBAL(0xF44134, uint8_t) & 3) - { + + widget = &window_ride_construction_widgets[WIDX_CONSTRUCT]; + if (widget->type == WWT_EMPTY) + return; + + int trackType, trackDirection, rideIndex, edxRS16; + if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, NULL, NULL, NULL, NULL)) + return; + + // Draw track piece + x = w->x + widget->left + 1; + y = w->y + widget->top + 1; + width = widget->right - widget->left - 1; + height = widget->bottom - widget->top - 1; + clipdpi = clip_drawpixelinfo(dpi, x, width, y, height); + if (clipdpi != NULL) { + window_ride_construction_draw_track_piece(w, clipdpi, rideIndex, trackType, trackDirection, edxRS16, width, height); + rct2_free(clipdpi); + } + + // Draw cost + x = w->x + (widget->left + widget->right) / 2; + y = w->y + widget->bottom - 23; + if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_PLACE) + gfx_draw_string_centred(dpi, 1407, x, y, 0, w); + + y += 11; + if ( + _currentTrackPrice != MONEY32_UNDEFINED && + !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) + ) { + gfx_draw_string_centred(dpi, 1408, x, y, 0, (void*)&_currentTrackPrice); + } +} + +/** + * + * rct2: 0x0068B2B7 + */ +static void sub_68B2B7(int x, int y) +{ + RCT2_CALLPROC_X(0x0068B2B7, x, 0, y, 0, 0, 0, 0); +} + +static void window_ride_construction_draw_track_piece( + rct_window *w, rct_drawpixelinfo *dpi, + int rideIndex, int trackType, int trackDirection, int unknown, + int width, int height +) { + rct_preview_track *trackBlock; + rct_ride *ride; + + ride = GET_RIDE(rideIndex); + + trackBlock = get_track_def_from_ride(ride, trackType); + while ((trackBlock + 1)->var_00 != 0xFF) + trackBlock++; + + short x = trackBlock->x; + short z = trackBlock->z; + short y = trackBlock->y; + if (trackBlock->var_09 & 2) { + x = 0; + y = 0; + } + + short tmp; + switch (trackDirection & 3) { + case 1: + tmp = x; + x = y; + y = -tmp; + break; + case 2: + x = -x; + y = -y; + break; + case 3: + tmp = x; + x = -y; + y = tmp; + break; + case 0: + break; + } + //this is actually case 0, but the other cases all jump to it + x = 4112 + (x / 2); + y = 4112 + (y / 2); + z = 1024 + z; + + short bx = ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? + RCT2_GLOBAL(0x009984A2 + trackType * 8, sint8) : + RCT2_GLOBAL(0x00997CA2 + trackType * 8, sint8); + + z -= bx; + int start_x = x; + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) { + case 0: + x = y - x; + y = (y + start_x) / 2 - z; + break; + case 1: + x = -x - y; + y = (y - start_x) / 2 - z; + break; + case 2: + x -= y; + y = (-y - start_x) / 2 - z; + break; + case 3: + x += y; + y = (-y + start_x) / 2 - z; + break; + } + dpi->x += x - width / 2; + dpi->y += y - height / 2 - 16; + RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*) = dpi; + uint32_t d = unknown << 16; + d |= rideIndex; + d |= trackType << 8; + + sub_6CBCE2(rideIndex, trackType, trackDirection, d, 4096, 4096, 1024); +} + +static rct_map_element _tempTrackMapElement; +static rct_map_element _tempSideTrackMapElement = { 0x80, 0x8F, 128, 128, 0, 0, 0, 0 }; +static rct_map_element *_backupMapElementArrays[5]; + +/** + * + * rct2: 0x006CBCE2 + * bh: trackDirection + * dl: rideIndex + * dh: trackType + */ +static void sub_6CBCE2( + int rideIndex, int trackType, int trackDirection, int edx, + int originX, int originY, int originZ +) { + rct_ride *ride; + rct_preview_track *trackBlock; + int preserve_word_141E9E4; + int x, y, baseZ, clearanceZ, offsetX, offsetY; + uint64 preserve_map_size_vars; + + preserve_word_141E9E4 = RCT2_GLOBAL(0x0141E9E4, uint16); + RCT2_GLOBAL(0x0141E9E4, uint16) = 0; + trackDirection &= 3; + + RCT2_GLOBAL(0x00EE7880, uint32) = 0x00F1A4CC; + sub_0x68615B(0x00EE788C); + + ride = GET_RIDE(rideIndex); + + preserve_map_size_vars = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint64); + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) = 255 * 32; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_MINUS_2, uint16) = (255 * 32) + 286; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) = 256; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16) = (256 * 32) - 1; + + trackBlock = get_track_def_from_ride(ride, trackType); + while (trackBlock->var_00 != 255) { + int bl = trackBlock->var_08; + int bh; + switch (trackDirection) { + case 0: + offsetX = trackBlock->x; + offsetY = trackBlock->y; + break; case 1: - tmp = x; - x = y; - y = -tmp; + offsetX = trackBlock->y; + offsetY = -trackBlock->x; + bl = rol8(bl, 1); + bh = bl; + bh = ror8(bh, 4); + bl &= 0xEE; + bh &= 0x11; + bl |= bh; break; case 2: - x = -x; - y = -y; + offsetX = -trackBlock->x; + offsetY = -trackBlock->y; + bl = rol8(bl, 2); + bh = bl; + bh = ror8(bh, 4); + bl &= 0xCC; + bh &= 0x33; + bl |= bh; break; case 3: - tmp = x; - x = -y; - y = tmp; - break; - case 0: + offsetX = -trackBlock->y; + offsetY = trackBlock->x; + bl = rol8(bl, 3); + bh |= bl; + bh = ror8(bh, 4); + bl &= 0x88; + bh &= 0x77; + bl |= bh; break; } - //this is actually case 0, but the other cases all jump to it - x /= 2; - y /= 2; - x += 4112; - y += 4112; - z += 1024; - ebx = RCT2_GLOBAL(0xF44135, uint8_t); - short bx; - if (RCT2_GLOBAL(0xF44064, uint32_t) & 0x80000) bx = RCT2_GLOBAL(0x9984A2 + ebx * 8, sint8); - else bx = RCT2_GLOBAL(0x997CA2 + ebx * 8, sint8); + x = originX + offsetX; + y = originY + offsetY; + baseZ = (originZ + trackBlock->z) >> 3; + clearanceZ = ((trackBlock->var_07 + RCT2_GLOBAL(0x0097D219 + (ride->type * 8), uint8)) >> 3) + baseZ + 4; + + int tileX = x >> 5; + int tileY = y >> 5; + + // Replace map elements with temporary ones containing track + _backupMapElementArrays[0] = map_get_first_element_at(tileX + 0, tileY + 0); + _backupMapElementArrays[1] = map_get_first_element_at(tileX + 1, tileY + 0); + _backupMapElementArrays[2] = map_get_first_element_at(tileX - 1, tileY + 0); + _backupMapElementArrays[3] = map_get_first_element_at(tileX + 0, tileY + 1); + _backupMapElementArrays[4] = map_get_first_element_at(tileX + 0, tileY - 1); + map_set_tile_elements(tileX + 0, tileY + 0, &_tempTrackMapElement); + map_set_tile_elements(tileX + 1, tileY + 0, &_tempSideTrackMapElement); + map_set_tile_elements(tileX - 1, tileY + 0, &_tempSideTrackMapElement); + map_set_tile_elements(tileX + 0, tileY + 1, &_tempSideTrackMapElement); + map_set_tile_elements(tileX + 0, tileY - 1, &_tempSideTrackMapElement); + + // Set the temporary track element + _tempTrackMapElement.type = trackDirection | MAP_ELEMENT_TYPE_TRACK | (edx & 0x10000 ? 0x80 : 0); + _tempTrackMapElement.flags = (bl & 0x0F) | MAP_ELEMENT_FLAG_LAST_TILE; + _tempTrackMapElement.base_height = baseZ; + _tempTrackMapElement.clearance_height = clearanceZ; + _tempTrackMapElement.properties.track.type = trackType; + _tempTrackMapElement.properties.track.sequence = trackBlock->var_00; + _tempTrackMapElement.properties.track.colour = (edx & 0x20000 ? 4 : 0); + _tempTrackMapElement.properties.track.ride_index = rideIndex; + + // Draw this map tile + sub_68B2B7(x, y); + + // Restore map elements + map_set_tile_elements(tileX + 0, tileY + 0, _backupMapElementArrays[0]); + map_set_tile_elements(tileX + 1, tileY + 0, _backupMapElementArrays[1]); + map_set_tile_elements(tileX - 1, tileY + 0, _backupMapElementArrays[2]); + map_set_tile_elements(tileX + 0, tileY + 1, _backupMapElementArrays[3]); + map_set_tile_elements(tileX + 0, tileY - 1, _backupMapElementArrays[4]); + + trackBlock++; + } + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint64) = preserve_map_size_vars; + + sub_688217(); + sub_688485(); + + RCT2_GLOBAL(0x0141E9E4, uint16) = preserve_word_141E9E4; +} + +/** + * + * rct2: 0x006C84CE + */ +void sub_6C84CE() +{ + rct_window *w; + rct_map_element *mapElement; + + window_ride_construction_update_enabled_track_pieces(); + w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w == NULL) + return; + + window_ride_construction_update_map_selection(); + + RCT2_GLOBAL(0x00F440D0, uint8) = 255; + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + int x = _currentTrackBeginX; + int y = _currentTrackBeginY; + int z = _currentTrackBeginZ; + if (!sub_6C683D(&x, &y, &z, _currentTrackPieceDirection & 3, _currentTrackPieceType, 0, &mapElement, 0)) { + RCT2_GLOBAL(0x00F440D0, uint8) = mapElement->properties.track.type; + if (mapElement->properties.track.type == 99) + RCT2_GLOBAL(0x00F440CD, uint8) = (mapElement->properties.track.sequence >> 4) << 1; + _currentSeatRotationAngle = mapElement->properties.track.colour >> 4; + } + } + + window_ride_construction_update_possible_ride_configurations(); + window_ride_construction_update_widgets(w); +} + +/** + * + * rct2: 0x006CA2DF + * bh: trackRotation (out) + * dl: ??? (out) + * dh: trackType (out) + * edx >> 16: ??? (out) + */ +static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *seatRotation) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + if (RCT2_CALLFUNC_X(0x006CA2DF, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) + return true; + + if (trackType != NULL) *trackType = (edx >> 8) & 0xFF; + if (trackDirection != NULL) *trackDirection = (ebx >> 8) & 0xFF; + if (rideIndex != NULL) *rideIndex = edx & 0xFF; + if (edxRS16 != NULL) *edxRS16 = (edx >> 16) & 0xFFFF; + if (x != NULL) *x = eax & 0xFFFF; + if (y != NULL) *y = ecx & 0xFFFF; + if (z != NULL) *z = edi & 0xFFFF; + if (seatRotation != NULL) *seatRotation = (edi >> 28) & 0xF; + return false; +} + +/** + * + * rct2: 0x006C6A77 + */ +static void window_ride_construction_update_enabled_track_pieces() +{ + rct_ride *ride = GET_RIDE(_currentRideIndex); + rct_ride_type *rideEntry = ride_get_entry(ride); + + int rideType = _currentTrackCovered & 2 ? RCT2_ADDRESS(0x0097D4F5, uint8)[ride->type * 8] : ride->type; + _enabledRidePiecesA = rideEntry->enabledTrackPiecesA & RCT2_ADDRESS(0x01357444, uint32)[rideType]; + _enabledRidePiecesB = rideEntry->enabledTrackPiecesB & RCT2_ADDRESS(0x01357644, uint32)[rideType]; +} + +/** + * + * rct2: 0x006CA162 + */ +money32 sub_6CA162(int rideIndex, int trackType, int trackDirection, int edxRS16, int x, int y, int z) +{ + rct_ride *ride; + money32 result; + + sub_6C96C0(); + ride = GET_RIDE(rideIndex); + if (ride->type == RIDE_TYPE_MAZE) { + result = game_do_command(x, 105 | (4 << 8), y, rideIndex | (trackType << 8) | (edxRS16 << 16), GAME_COMMAND_38, z, 0); + if (result == MONEY32_UNDEFINED) + return result; + + RCT2_GLOBAL(0x00F440C5, uint16) = x; + RCT2_GLOBAL(0x00F440C7, uint16) = y; + RCT2_GLOBAL(0x00F440C9, uint16) = z; + RCT2_GLOBAL(0x00F440CB, uint8) = trackDirection; + _currentTrackSelectionFlags |= 2; + viewport_set_visibility(RCT2_GLOBAL(0x00F441D4, uint8) & 2 ? 1 : 3); + if (_currentTrackSlopeEnd != 0) + viewport_set_visibility(2); + + return result; + } else { + result = game_do_command(x, 105 | (trackDirection << 8), y, rideIndex | (trackType << 8) | (edxRS16 << 16), GAME_COMMAND_PLACE_TRACK, z, 0); + if (result == MONEY32_UNDEFINED) + return result; + + RCT2_GLOBAL(0x00F440C5, uint16) = x; + RCT2_GLOBAL(0x00F440C7, uint16) = y; + z += ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? + RCT2_GLOBAL(0x009972BD + (trackType * 10), uint16) : + RCT2_GLOBAL(0x009968BD + (trackType * 10), uint16); + + RCT2_GLOBAL(0x00F440C9, uint16) = z; + RCT2_GLOBAL(0x00F440CB, uint8) = trackDirection; + _currentTrackSelectionFlags |= 2; + viewport_set_visibility(RCT2_GLOBAL(0x00F441D4, uint8) & 2 ? 1 : 3); + if (_currentTrackSlopeEnd != 0) + viewport_set_visibility(2); + + return result; + } +} + +/** + * + * rct2: 0x006C94D8 + */ +void sub_6C94D8() +{ + int x, y, z, direction, type, rideIndex, edxRS16; + + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_FRONT: + case RIDE_CONSTRUCTION_STATE_BACK: + if (!(_currentTrackSelectionFlags & 2)) { + if (sub_6CA2DF(&type, &direction, &rideIndex, &edxRS16, &x, &y, &z, NULL)) { + sub_6C96C0(); + } else { + _currentTrackPrice = sub_6CA162(rideIndex, type, direction, edxRS16, x, y, z); + sub_6C84CE(); + } + } + _rideConstructionArrowPulseTime--; + if (_rideConstructionArrowPulseTime >= 0) + break; + + _rideConstructionArrowPulseTime = 5; + _currentTrackSelectionFlags ^= 1; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection; + type = _currentTrackPieceType; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z; + if (direction >= 4) + direction += 4; + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) + direction ^= 2; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = direction; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~4; + if (_currentTrackSelectionFlags & 1) + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 4; + map_invalidate_tile_full(x, y); + break; + case RIDE_CONSTRUCTION_STATE_SELECTED: + _rideConstructionArrowPulseTime--; + if (_rideConstructionArrowPulseTime >= 0) + break; + + _rideConstructionArrowPulseTime = 5; + _currentTrackSelectionFlags ^= 1; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection & 3; + type = _currentTrackPieceType; + if (sub_6C683D(&x, &y, &z, direction, type, 0, NULL, _currentTrackSelectionFlags & 1 ? 2 : 1)) { + sub_6C96C0(); + _rideConstructionState = RIDE_CONSTRUCTION_STATE_0; + } + break; + case 6: + case 7: + case 8: + _rideConstructionArrowPulseTime--; + if (_rideConstructionArrowPulseTime >= 0) + break; + + _rideConstructionArrowPulseTime = 5; + _currentTrackSelectionFlags ^= 1; + x = _currentTrackBeginX & 0xFFE0; + y = _currentTrackBeginY & 0xFFE0; + z = _currentTrackBeginZ + 15; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = 4; + if (((_currentTrackBeginX & 0x1F) | (_currentTrackBeginY & 0x1F)) != 0) { + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = 6; + if (((_currentTrackBeginX & 0x1F) & (_currentTrackBeginY & 0x1F)) == 0) { + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = 5; + if ((_currentTrackBeginY & 0x1F) == 0) + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = 7; + } + } + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~4; + if (_currentTrackSelectionFlags & 1) + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 4; + map_invalidate_tile_full(x, y); + break; + } +} + +/** + * + * rct2: 0x006C84E2 + */ +static void window_ride_construction_update_map_selection() +{ + rct_ride *ride; + int trackType, trackDirection, x, y; + + map_invalidate_map_selection_tiles(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 10; + + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_0: + trackDirection = _currentTrackPieceDirection; + trackType = 0; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + break; + case RIDE_CONSTRUCTION_STATE_SELECTED: + trackDirection = _currentTrackPieceDirection; + trackType = _currentTrackPieceType; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + break; + default: + if (sub_6CA2DF(&trackType, &trackDirection, NULL, NULL, &x, &y, NULL, NULL)) { + trackDirection = _currentTrackPieceDirection; + trackType = 0; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + } + break; + } + + ride = GET_RIDE(_currentRideIndex); + window_ride_construction_select_map_tiles(ride, trackType, trackDirection, x, y); + map_invalidate_map_selection_tiles(); +} + +/** + * + * rct2: 0x006C8648 + */ +static void window_ride_construction_update_possible_ride_configurations() +{ + rct_ride *ride; + int trackType; + int edx, edi; + + ride = GET_RIDE(_currentRideIndex); + + RCT2_GLOBAL(0x00F440D3, uint8) = 0; + if (_currentTrackCovered & 2) + edi = RCT2_GLOBAL(0x0097D4F5 + (ride->type * 8), uint8); + else + edi = ride->type; + + int currentPossibleRideConfigurationIndex = 0; + _numCurrentPossibleSpecialTrackPieces = 0; + for (trackType = 0; trackType < 256; trackType++) { + edx = ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? + RCT2_GLOBAL(0x0099849D + (trackType * 8), uint8) : + RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8); + + if (edx == 0) + continue; + + if (edx & 0x80) { + edx &= 0x7F; + if (edx != edi) + continue; + } else if (!is_track_enabled(edx)) { + continue; + } + + int slope, bank; + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT || _rideConstructionState == RIDE_CONSTRUCTION_STATE_PLACE) { + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + slope = RCT2_GLOBAL(0x0099849F + (trackType * 8), uint8); + bank = RCT2_GLOBAL(0x009984A1 + (trackType * 8), uint8); + } else { + slope = RCT2_GLOBAL(0x00997C9F + (trackType * 8), uint8); + bank = RCT2_GLOBAL(0x00997CA1 + (trackType * 8), uint8); + } + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + slope = RCT2_GLOBAL(0x0099849E + (trackType * 8), uint8); + bank = RCT2_GLOBAL(0x009984A0 + (trackType * 8), uint8); + } else { + slope = RCT2_GLOBAL(0x00997C9E + (trackType * 8), uint8); + bank = RCT2_GLOBAL(0x00997CA0 + (trackType * 8), uint8); + } + } else { + continue; + } + + if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + if ( + RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) == 21 || + RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) != 22 + ) { + if (bank != _previousTrackBankEnd) { + if (_previousTrackBankEnd != 0) + continue; + + if (bank != TRACK_BANK_LEFT) + continue; + } + } + } + + if (bank == TRACK_BANK_UPSIDE_DOWN && bank != _previousTrackBankEnd) + continue; + + _currentPossibleRideConfigurations[currentPossibleRideConfigurationIndex] = trackType; + RCT2_GLOBAL(0x00F4409C, uint32) |= (1 << currentPossibleRideConfigurationIndex); + if ( + _currentTrackPieceDirection < 4 && + slope == _previousTrackSlopeEnd && + bank == _previousTrackBankEnd && + (trackType != 66 || ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_29)) + ) { + RCT2_GLOBAL(0x00F4409C, uint32) &= ~(1 << currentPossibleRideConfigurationIndex); + _numCurrentPossibleSpecialTrackPieces++; + } + currentPossibleRideConfigurationIndex++; + } + _numCurrentPossibleRideConfigurations = currentPossibleRideConfigurationIndex; +} + +/** + * + * rct2: 0x006C87F5 + */ +static void window_ride_construction_update_widgets(rct_window *w) +{ + uint8 rideIndex = _currentRideIndex; + rct_ride *ride = GET_RIDE(rideIndex); + int rideType = ride_get_alternative_type(ride); + + w->hold_down_widgets = 0; + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_IS_SHOP)) { + window_ride_construction_widgets[WIDX_ENTRANCE_EXIT_GROUPBOX].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_ENTRANCE].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_EXIT].type = WWT_EMPTY; + } else { + window_ride_construction_widgets[WIDX_ENTRANCE_EXIT_GROUPBOX].type = WWT_GROUPBOX; + window_ride_construction_widgets[WIDX_ENTRANCE].type = WWT_DROPDOWN_BUTTON; + window_ride_construction_widgets[WIDX_EXIT].type = WWT_DROPDOWN_BUTTON; + } + + if (_numCurrentPossibleSpecialTrackPieces == 0) { + window_ride_construction_widgets[WIDX_SPECIAL_TRACK_DROPDOWN].type = WWT_EMPTY; + } else { + window_ride_construction_widgets[WIDX_SPECIAL_TRACK_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + } + + if (is_track_enabled(TRACK_STRAIGHT)) { + window_ride_construction_widgets[WIDX_STRAIGHT].type = WWT_FLATBTN; + } else { + window_ride_construction_widgets[WIDX_STRAIGHT].type = WWT_EMPTY; + } + + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_30)) { + window_ride_construction_widgets[WIDX_LEFT_CURVE_LARGE].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_LARGE].type = WWT_FLATBTN; + } else { + window_ride_construction_widgets[WIDX_LEFT_CURVE_LARGE].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_LARGE].type = WWT_EMPTY; + } + + window_ride_construction_widgets[WIDX_LEFT_CURVE].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_RIGHT_CURVE].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_LEFT_CURVE_VERY_SMALL].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_VERY_SMALL].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].left = 28; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].right = 49; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].left = 116; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].right = 137; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].image = 5138; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].image = 5139; + if (is_track_enabled(TRACK_SLOPE_STEEP_LONG)) { + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].left = 6; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].right = 27; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].image = 5140; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].left = 138; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].right = 159; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].image = 5141; + } + if (is_track_enabled(TRACK_CURVE)) { + window_ride_construction_widgets[WIDX_LEFT_CURVE].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_RIGHT_CURVE].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].left = 6; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].right = 27; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].image = 5140; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].left = 138; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].right = 159; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].image = 5141; + } + if (is_track_enabled(TRACK_CURVE_SMALL)) { + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].type = WWT_FLATBTN; + } + if (is_track_enabled(TRACK_CURVE_VERY_SMALL)) { + window_ride_construction_widgets[WIDX_LEFT_CURVE_VERY_SMALL].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_VERY_SMALL].type = WWT_FLATBTN; + } + + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_SLOPE_DOWN].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_LEVEL].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_SLOPE_UP].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5144; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5148; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP; + if (rideType == RIDE_TYPE_REVERSE_FREEFALL_COASTER || rideType == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) { + window_ride_construction_widgets[WIDX_LEVEL].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_SLOPE_UP].type = WWT_FLATBTN; + } + if (is_track_enabled(TRACK_SLOPE) || is_track_enabled(TRACK_SLOPE_STEEP)) { + window_ride_construction_widgets[WIDX_LEVEL].type = WWT_FLATBTN; + } + if (is_track_enabled(TRACK_SLOPE)) { + window_ride_construction_widgets[WIDX_SLOPE_DOWN].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_SLOPE_UP].type = WWT_FLATBTN; + } + if ( + is_track_enabled(TRACK_HELIX_SMALL) && + _currentTrackBankEnd != TRACK_BANK_NONE && + _currentTrackSlopeEnd == TRACK_SLOPE_NONE + ) { + if (_currentTrackCurve >= TRACK_CURVE_LEFT && _currentTrackCurve <= TRACK_CURVE_RIGHT_SMALL) { + // Enable helix + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].type = WWT_FLATBTN; + if (rideType != RIDE_TYPE_SPLASH_BOATS) + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].type = WWT_FLATBTN; + } + } + + if (is_track_enabled(TRACK_SLOPE_STEEP)) { + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].type = WWT_FLATBTN; + if (rideType != RIDE_TYPE_SPLASH_BOATS) + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].type = WWT_FLATBTN; + } + + int x; + if (is_track_enabled(TRACK_LIFT_HILL) && _currentTrackCurve < 256) { + window_ride_construction_widgets[WIDX_CHAIN_LIFT].type = WWT_FLATBTN; + x = 9; + } else { + window_ride_construction_widgets[WIDX_CHAIN_LIFT].type = WWT_EMPTY; + x = 23; + } + + for (int i = WIDX_SLOPE_DOWN_STEEP; i <= WIDX_SLOPE_UP_STEEP; i++) { + window_ride_construction_widgets[i].left = x; + window_ride_construction_widgets[i].right = x + 23; + x += 24; + } + + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5148; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5144; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP; + if (is_track_enabled(TRACK_SLOPE_VERTICAL)) { + if (_previousTrackSlopeEnd == TRACK_SLOPE_UP_60 || _previousTrackSlopeEnd == TRACK_SLOPE_UP_90) { + int originalSlopeUpSteepLeft = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].left; + int originalSlopeUpSteepRight = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right; + for (int i = WIDX_SLOPE_UP_STEEP; i > WIDX_SLOPE_DOWN_STEEP; i--) { + window_ride_construction_widgets[i].left = window_ride_construction_widgets[i - 1].left; + window_ride_construction_widgets[i].right = window_ride_construction_widgets[i - 1].right; + } + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left = originalSlopeUpSteepLeft; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right = originalSlopeUpSteepRight; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5149; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_VERTICAL_RISE_TIP; + } else if (_previousTrackSlopeEnd == TRACK_SLOPE_DOWN_60 || _previousTrackSlopeEnd == TRACK_SLOPE_DOWN_90) { + int originalSlopeDownSteepLeft = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left; + int originalSlopeDownSteepRight = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right; + for (int i = WIDX_SLOPE_DOWN_STEEP; i < WIDX_SLOPE_UP_STEEP; i++) { + window_ride_construction_widgets[i].left = window_ride_construction_widgets[i + 1].left; + window_ride_construction_widgets[i].right = window_ride_construction_widgets[i + 1].right; + } + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].left = originalSlopeDownSteepLeft; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right = originalSlopeDownSteepRight; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5150; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_VERTICAL_DROP_TIP; + } + } + + if ( + is_track_enabled(TRACK_HELIX_LARGE_UNBANKED) && + _currentTrackSlopeEnd == TRACK_SLOPE_NONE && + _currentTrackBankEnd == TRACK_BANK_NONE && + (_currentTrackCurve == TRACK_CURVE_LEFT || _currentTrackCurve == TRACK_CURVE_RIGHT) + ) { + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5151; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_HELIX_DOWN_TIP; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5152; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_HELIX_UP_TIP; + + int tmp = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left = window_ride_construction_widgets[WIDX_SLOPE_DOWN].left; + window_ride_construction_widgets[WIDX_SLOPE_DOWN].left = tmp; + + tmp = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right = window_ride_construction_widgets[WIDX_SLOPE_DOWN].right; + window_ride_construction_widgets[WIDX_SLOPE_DOWN].right = tmp; + + tmp = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right = window_ride_construction_widgets[WIDX_SLOPE_UP].right; + window_ride_construction_widgets[WIDX_SLOPE_UP].right = tmp; + } + + if ( + (is_track_enabled(TRACK_HELIX_LARGE) || is_track_enabled(TRACK_HELIX_SMALL)) && + (_currentTrackCurve >= TRACK_CURVE_LEFT && _currentTrackCurve <= TRACK_CURVE_RIGHT_SMALL) && + _currentTrackSlopeEnd == TRACK_SLOPE_NONE && + _currentTrackBankEnd != TRACK_BANK_NONE + ) { + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5151; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_HELIX_DOWN_TIP; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5152; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_HELIX_UP_TIP; + + int tmp = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left = window_ride_construction_widgets[WIDX_SLOPE_DOWN].left; + window_ride_construction_widgets[WIDX_SLOPE_DOWN].left = tmp; + + tmp = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right = window_ride_construction_widgets[WIDX_SLOPE_DOWN].right; + window_ride_construction_widgets[WIDX_SLOPE_DOWN].right = tmp; + + tmp = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].left; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].left = window_ride_construction_widgets[WIDX_SLOPE_UP].left; + window_ride_construction_widgets[WIDX_SLOPE_UP].left = tmp; + + tmp = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right = window_ride_construction_widgets[WIDX_SLOPE_UP].right; + window_ride_construction_widgets[WIDX_SLOPE_UP].right = tmp; + } + + window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].image = STR_RIDE_CONSTRUCTION_ROLL_BANKING; + window_ride_construction_widgets[WIDX_BANK_LEFT].image = 5153; + window_ride_construction_widgets[WIDX_BANK_LEFT].tooltip = STR_RIDE_CONSTRUCTION_ROLL_FOR_LEFT_CURVE_TIP; + window_ride_construction_widgets[WIDX_BANK_LEFT].left = 47; + window_ride_construction_widgets[WIDX_BANK_LEFT].right = 70; + window_ride_construction_widgets[WIDX_BANK_LEFT].top = 132; + window_ride_construction_widgets[WIDX_BANK_LEFT].bottom = 155; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].image = 5154; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].tooltip = STR_RIDE_CONSTRUCTION_NO_ROLL_TIP; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].left = 71; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].right = 94; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].top = 132; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].bottom = 155; + window_ride_construction_widgets[WIDX_BANK_RIGHT].image = 5155; + window_ride_construction_widgets[WIDX_BANK_RIGHT].tooltip = STR_RIDE_CONSTRUCTION_ROLL_FOR_RIGHT_CURVE_TIP; + window_ride_construction_widgets[WIDX_BANK_RIGHT].left = 95; + window_ride_construction_widgets[WIDX_BANK_RIGHT].right = 118; + window_ride_construction_widgets[WIDX_BANK_RIGHT].top = 132; + window_ride_construction_widgets[WIDX_BANK_RIGHT].bottom = 155; + window_ride_construction_widgets[WIDX_BANK_LEFT].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_BANK_RIGHT].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_U_TRACK].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_O_TRACK].type = WWT_EMPTY; + if (RCT2_GLOBAL(0x00F440D0, uint8) != 99 && _currentTrackCurve != 355) { + if (is_track_enabled(TRACK_FLAT_ROLL_BANKING)) { + window_ride_construction_widgets[WIDX_BANK_LEFT].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_BANK_RIGHT].type = WWT_FLATBTN; + } + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_12)) { + if (rideType == RIDE_TYPE_WATER_COASTER) { + window_ride_construction_widgets[WIDX_U_TRACK].image = 5158; + window_ride_construction_widgets[WIDX_O_TRACK].image = 5159; + window_ride_construction_widgets[WIDX_U_TRACK].tooltip = STR_RIDE_CONSTRUCTION_STANDARD_RC_TRACK_TIP; + window_ride_construction_widgets[WIDX_O_TRACK].tooltip = STR_RIDE_CONSTRUCTION_WATER_CHANNEL_TIP; + if (_currentTrackCurve < TRACK_CURVE_LEFT_SMALL && _currentTrackSlopeEnd == TRACK_SLOPE_NONE && _currentTrackBankEnd == TRACK_BANK_NONE) { + window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].image = STR_RIDE_CONSTRUCTION_TRACK_STYLE; + window_ride_construction_widgets[WIDX_U_TRACK].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_O_TRACK].type = WWT_FLATBTN; + } + } else { + window_ride_construction_widgets[WIDX_U_TRACK].image = 5156; + window_ride_construction_widgets[WIDX_O_TRACK].image = 5157; + window_ride_construction_widgets[WIDX_U_TRACK].tooltip = STR_RIDE_CONSTRUCTION_U_SHAPED_OPEN_TRACK_TIP; + window_ride_construction_widgets[WIDX_O_TRACK].tooltip = STR_RIDE_CONSTRUCTION_O_SHAPED_ENCLOSED_TRACK_TIP; + window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].image = STR_RIDE_CONSTRUCTION_TRACK_STYLE; + window_ride_construction_widgets[WIDX_U_TRACK].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_O_TRACK].type = WWT_FLATBTN; + } + } + } else { + window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].image = STR_RIDE_CONSTRUCTION_BRAKE_SPEED; + RCT2_GLOBAL(0x00F440D3, uint8) = 1; + window_ride_construction_widgets[WIDX_BANK_LEFT].image = 1675; + window_ride_construction_widgets[WIDX_BANK_LEFT].tooltip = STR_RIDE_CONSTRUCTION_BRAKE_SPEED_LIMIT_TIP; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].tooltip = STR_RIDE_CONSTRUCTION_BRAKE_SPEED_LIMIT_TIP; + window_ride_construction_widgets[WIDX_BANK_RIGHT].tooltip = STR_RIDE_CONSTRUCTION_BRAKE_SPEED_LIMIT_TIP; + window_ride_construction_widgets[WIDX_BANK_LEFT].type = WWT_SPINNER; + window_ride_construction_widgets[WIDX_BANK_LEFT].left = 12; + window_ride_construction_widgets[WIDX_BANK_LEFT].right = 83; + window_ride_construction_widgets[WIDX_BANK_LEFT].top = 138; + window_ride_construction_widgets[WIDX_BANK_LEFT].bottom = 149; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].type = WWT_DROPDOWN_BUTTON; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].image = STR_NUMERIC_UP; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].left = 72; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].right = 82; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].top = 139; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].bottom = 143; + window_ride_construction_widgets[WIDX_BANK_RIGHT].type = WWT_DROPDOWN_BUTTON; + window_ride_construction_widgets[WIDX_BANK_RIGHT].image = STR_NUMERIC_DOWN; + window_ride_construction_widgets[WIDX_BANK_RIGHT].left = 72; + window_ride_construction_widgets[WIDX_BANK_RIGHT].right = 82; + window_ride_construction_widgets[WIDX_BANK_RIGHT].top = 144; + window_ride_construction_widgets[WIDX_BANK_RIGHT].bottom = 148; + w->hold_down_widgets |= (1 << WIDX_BANK_STRAIGHT) | (1 << WIDX_BANK_RIGHT); + } + + window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].right = 162; + window_ride_construction_widgets[WIDX_SEAT_ROTATION_GROUPBOX].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER].type = 0; + window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER_UP].type = 0; + window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER_DOWN].type = 0; + if ( + (rideType == RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER || rideType == RIDE_TYPE_38) && + RCT2_GLOBAL(0x00F440D0, uint8) != 99 && + _currentTrackCurve != 355 + ) { + window_ride_construction_widgets[WIDX_SEAT_ROTATION_GROUPBOX].type = WWT_GROUPBOX; + window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER].type = WWT_SPINNER; + window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER_UP].type = WWT_DROPDOWN_BUTTON; + window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER_DOWN].type = WWT_DROPDOWN_BUTTON; + window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].right = 92; + if (window_ride_construction_widgets[WIDX_BANK_LEFT].type != WWT_SPINNER) { + for (int i = WIDX_BANK_LEFT; i <= WIDX_BANK_RIGHT; i++) { + window_ride_construction_widgets[i].left -= 36; + window_ride_construction_widgets[i].right -= 36; + } + } + } + + uint64 pressedWidgets = w->pressed_widgets & ( + (1 << WIDX_BACKGROUND) | + (1 << WIDX_TITLE) | + (1 << WIDX_CLOSE) | + (1 << WIDX_DIRECTION_GROUPBOX) | + (1 << WIDX_SLOPE_GROUPBOX) | + (1 << WIDX_BANKING_GROUPBOX) | + (1 << WIDX_CONSTRUCT) | + (1 << WIDX_DEMOLISH) | + (1 << WIDX_PREVIOUS_SECTION) | + (1 << WIDX_NEXT_SECTION) | + (1 << WIDX_ENTRANCE_EXIT_GROUPBOX) | + (1 << WIDX_ENTRANCE) | + (1 << WIDX_EXIT) + ); + + window_ride_construction_widgets[WIDX_CONSTRUCT].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_DEMOLISH].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_ROTATE].type = WWT_EMPTY; + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_8)) { + window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_EMPTY; + } else { + window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_FLATBTN; + } + + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_FRONT: + window_ride_construction_widgets[WIDX_CONSTRUCT].type = WWT_IMGBTN; + window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_EMPTY; + break; + case RIDE_CONSTRUCTION_STATE_BACK: + window_ride_construction_widgets[WIDX_CONSTRUCT].type = WWT_IMGBTN; + window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_EMPTY; + break; + case RIDE_CONSTRUCTION_STATE_PLACE: + window_ride_construction_widgets[WIDX_CONSTRUCT].type = WWT_IMGBTN; + window_ride_construction_widgets[WIDX_DEMOLISH].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_ROTATE].type = WWT_FLATBTN; + break; + case RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT: + window_ride_construction_widgets[WIDX_DEMOLISH].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_EMPTY; + break; + default: + w->pressed_widgets = pressedWidgets; + window_invalidate(w); + return; + } + + int widgetIndex; + switch (_currentTrackCurve) { + case TRACK_CURVE_NONE: + widgetIndex = WIDX_STRAIGHT; + break; + case TRACK_CURVE_LEFT: + widgetIndex = WIDX_LEFT_CURVE; + break; + case TRACK_CURVE_RIGHT: + widgetIndex = WIDX_RIGHT_CURVE; + break; + case TRACK_CURVE_LEFT_SMALL: + widgetIndex = WIDX_LEFT_CURVE_SMALL; + break; + case TRACK_CURVE_RIGHT_SMALL: + widgetIndex = WIDX_RIGHT_CURVE_SMALL; + break; + case TRACK_CURVE_LEFT_VERY_SMALL: + widgetIndex = WIDX_LEFT_CURVE_VERY_SMALL; + break; + case TRACK_CURVE_RIGHT_VERY_SMALL: + widgetIndex = WIDX_RIGHT_CURVE_VERY_SMALL; + break; + case TRACK_CURVE_LEFT_LARGE: + widgetIndex = WIDX_LEFT_CURVE_LARGE; + break; + case TRACK_CURVE_RIGHT_LARGE: + widgetIndex = WIDX_RIGHT_CURVE_LARGE; + break; + default: + widgetIndex = WIDX_SPECIAL_TRACK_DROPDOWN; + break; + } + pressedWidgets |= (1ULL << widgetIndex); + + switch (_currentTrackSlopeEnd) { + case TRACK_SLOPE_DOWN_60: + case TRACK_SLOPE_UP_90: + widgetIndex = WIDX_SLOPE_DOWN_STEEP; + break; + case TRACK_SLOPE_DOWN_25: + widgetIndex = WIDX_SLOPE_DOWN; + break; + case TRACK_SLOPE_UP_25: + widgetIndex = WIDX_SLOPE_UP; + break; + case TRACK_SLOPE_UP_60: + case TRACK_SLOPE_DOWN_90: + widgetIndex = WIDX_SLOPE_UP_STEEP; + break; + default: + widgetIndex = WIDX_LEVEL; + break; + } + pressedWidgets |= (1ULL << widgetIndex); + + if (RCT2_GLOBAL(0x00F440D3, uint8) == 0) { + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_12)) { + if (_currentTrackCovered & 1) { + w->pressed_widgets |= (1ULL << WIDX_O_TRACK); + } else { + w->pressed_widgets |= (1ULL << WIDX_U_TRACK); + } + } + switch (_currentTrackBankEnd) { + case TRACK_BANK_LEFT: + widgetIndex = WIDX_BANK_LEFT; + break; + case TRACK_BANK_NONE: + widgetIndex = WIDX_BANK_STRAIGHT; + break; + default: + widgetIndex = WIDX_BANK_RIGHT; + break; + } + pressedWidgets |= (1ULL << widgetIndex); + } + + if (_currentTrackLiftHill & 1) + pressedWidgets |= (1 << WIDX_CHAIN_LIFT); + + w->pressed_widgets = pressedWidgets; + window_invalidate(w); +} + +static void window_ride_construction_select_map_tiles(rct_ride *ride, int trackType, int trackDirection, int x, int y) +{ + rct_preview_track *trackBlock; + int offsetX, offsetY; + + trackBlock = get_track_def_from_ride(ride, trackType); + trackDirection &= 3; + int selectionTileIndex = 0; + while (trackBlock->var_00 != 255) { + switch (trackDirection) { + case 0: + offsetX = trackBlock->x; + offsetY = trackBlock->y; + break; + case 1: + offsetX = trackBlock->y; + offsetY = -trackBlock->x; + break; + case 2: + offsetX = -trackBlock->x; + offsetY = -trackBlock->y; + break; + case 3: + offsetX = -trackBlock->y; + offsetY = trackBlock->x; + break; + } + gMapSelectionTiles[selectionTileIndex].x = x + offsetX; + gMapSelectionTiles[selectionTileIndex].y = y + offsetY; + selectionTileIndex++; + trackBlock++; + } + gMapSelectionTiles[selectionTileIndex].x = -1; + gMapSelectionTiles[selectionTileIndex].y = -1; +} + +/** + * + * rct2: 0x006C776D + */ +static void window_ride_construction_show_special_track_dropdown(rct_window *w, rct_widget *widget) +{ + window_dropdown_show_text_custom_width( + w->x + widget->left, + w->y + widget->top, + widget->bottom - widget->top + 1, + w->colours[1], + 0, + _numCurrentPossibleRideConfigurations, + widget->right - widget->left + ); + + for (int i = 0; i < _numCurrentPossibleRideConfigurations; i++) { + uint8 trackPiece = _currentPossibleRideConfigurations[i]; + rct_string_id trackPieceStringId = RideConfigurationStringIds[trackPiece]; + if (trackPieceStringId == STR_RAPIDS) { + rct_ride *ride = GET_RIDE(_currentRideIndex); + if (ride->type == RIDE_TYPE_CAR_RIDE) + trackPieceStringId = STR_LOG_BUMPS; + } + gDropdownItemsFormat[i] = trackPieceStringId; + if ((trackPiece | 0x100) == _currentTrackCurve) { + RCT2_GLOBAL(0x009DEBA2, sint16) = i; + } + } + *gDropdownItemsDisabled = RCT2_GLOBAL(0x00F4409C, uint32); +} + +/** + * + * rct2: 0x006C7630 + */ +static void ride_selected_track_set_seat_rotation(int seatRotation) +{ + int x, y, z; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + sub_6C683D(&x, &y, &z, _currentTrackPieceDirection & 3, _currentTrackPieceType, seatRotation, NULL, (1 << 5)); + sub_6C84CE(); +} + +/** + * + * rct2: 0x006C7502 + */ +static void loc_6C7502(int al) +{ + _currentTrackSlopeEnd = al; + _currentTrackPrice = MONEY32_UNDEFINED; + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) { + if (al != 2 && al != 4 && al != 0) { + _currentTrackLiftHill &= ~1; + } + } + sub_6C84CE(); +} + +/** + * + * rct2: 0x006C76E9 + */ +static void loc_6C76E9() +{ + rct_map_element *mapElement; + int x, y, z; + + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + if (sub_6C683D(&x, &y, &z, _currentTrackPieceDirection & 3, _currentTrackPieceType, 0, &mapElement, 0)) { + game_do_command( + _currentTrackBeginX, + GAME_COMMAND_FLAG_APPLY | ((_currentTrackPieceDirection & 3) << 8), + _currentTrackBeginY, + mapElement->properties.track.type, + GAME_COMMAND_28, + _currentTrackBeginZ, + 0 + ); + } + sub_6C84CE(); +} + +/** + * + * rct2: 0x006CC6A8 + */ +static void ride_construction_toolupdate_construct(int screenX, int screenY) +{ + int x, y, z, highestZ; + rct_ride *ride; + rct_preview_track *trackBlock; + + map_invalidate_map_selection_tiles(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 2 | 4); + if (!ride_get_place_position_from_screen_position(screenX, screenY, &x, &y)) { + sub_6C9627(); + map_invalidate_map_selection_tiles(); + return; + } + + z = RCT2_GLOBAL(0x00F44163, uint16); + if (z == 0) + z = map_get_highest_z(x >> 5, y >> 5); + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 2; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~8; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 4; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = _currentTrackPieceDirection; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z; + gMapSelectionTiles[0].x = x; + gMapSelectionTiles[0].y = y; + gMapSelectionTiles[1].x = -1; + gMapSelectionTiles[1].y = -1; + + int trackType, trackDirection, rideIndex, edxRS16; + if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, NULL, NULL, NULL, NULL)) { + sub_6C9627(); + map_invalidate_map_selection_tiles(); + return; + } + _currentTrackPieceType = trackType; + ride = GET_RIDE(_currentRideIndex); + + // Re-using this other code, very slight difference from original + // - Original code checks for MSB mask instead of 255 on trackPart->var_00 + // - Original code checks this first as its already set origin tile, probably just a micro optimisation + window_ride_construction_select_map_tiles(ride, trackType, trackDirection, x, y); + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z; + if (RCT2_GLOBAL(0x00F44163, uint16) == 0) { + // Raise z above all slopes and water + highestZ = 0; + if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & 2) { + rct_xy16 *selectedTile = gMapSelectionTiles; + while (selectedTile->x != -1) { + if (selectedTile->x >= (256 * 32) || selectedTile->y >= (256 * 32)) + continue; + + z = map_get_highest_z(selectedTile->x >> 5, selectedTile->y >> 5); + if (z > highestZ) + highestZ = z; + + selectedTile++; + } + } + // loc_6CC8BF: + // z = map_get_highest_z(x >> 5, y >> 5); + } + // loc_6CC91B: + trackBlock = get_track_def_from_ride(ride, trackType); + int bx = 0; + do { + bx = min(bx, trackBlock->z); + trackBlock++; + } while (trackBlock->var_00 != 255); + z -= bx; + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z; + bx = 41; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + if ( + (_currentTrackSelectionFlags & 2) && + x == _previousTrackPieceX && + y == _previousTrackPieceY && + z == _previousTrackPieceZ + ) { + map_invalidate_map_selection_tiles(); + return; + } + + _previousTrackPieceX = x; + _previousTrackPieceY = y; + _previousTrackPieceZ = z; + if (ride->type == RIDE_TYPE_MAZE) { + // goto loc_6CCA31 + return; + } + + for (;;) { + sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, NULL); + _currentTrackPrice = sub_6CA162(rideIndex, trackType, trackDirection, edxRS16, x, y, z); + if (_currentTrackPrice != MONEY32_UNDEFINED) + break; + + bx--; + if (bx == 0) + break; + + _currentTrackBeginZ -= 8; + if (_currentTrackBeginZ & 0x8000) + break; + + if (bx >= 0) + _currentTrackBeginZ += 16; + } + + sub_6C84CE(); + map_invalidate_map_selection_tiles(); +} + +/** + * + * rct2: 0x006CD354 + */ +static void ride_construction_toolupdate_entrance_exit(int screenX, int screenY) +{ + int x, y, direction; + uint8 unk; + + map_invalidate_selection_rect(); + map_invalidate_map_selection_tiles(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 2 | 4); + ride_get_entrance_or_exit_position_from_screen_position(screenX, screenY, &x, &y, &direction); + if (RCT2_GLOBAL(0x00F44194, uint8) == 255) { + sub_6C9627(); + return; + } + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 1 | 4; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16) = 4; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = direction ^ 2; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = RCT2_GLOBAL(0x00F44190, uint8) * 8; + map_invalidate_selection_rect(); + + direction = RCT2_GLOBAL(0x00F44194, uint8) ^ 2; + unk = RCT2_GLOBAL(0x00F44193, uint8); + if ( + !(_currentTrackSelectionFlags & 4) || + x != RCT2_GLOBAL(0x00F440BF, uint16) || + y != RCT2_GLOBAL(0x00F440C1, uint16) || + direction != RCT2_GLOBAL(0x00F440C3, uint8) || + unk != RCT2_GLOBAL(0x00F440C4, uint8) + ) { + _currentTrackPrice = ride_get_entrance_or_exit_price( + _currentRideIndex, x, y, direction, RCT2_GLOBAL(0x00F44191, uint8), unk + ); + sub_6C84CE(); + } +} + +/** + * + * rct2: 0x006CCA73 + */ +static void ride_construction_tooldown_construct(int screenX, int screenY) +{ + int trackType, trackDirection, rideIndex, edxRS16, x, y, z, seatRotation, highestZ; + rct_window *w; + + map_invalidate_map_selection_tiles(); + sub_6C9627(); + + if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, &seatRotation)) + return; + + _currentTrackPieceType = trackType; + + // Raise z above all slopes and water + highestZ = 0; + if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & 2) { + rct_xy16 *selectedTile = gMapSelectionTiles; + while (selectedTile->x != -1) { + if (selectedTile->x >= (256 * 32) || selectedTile->y >= (256 * 32)) + continue; + + z = map_get_highest_z(selectedTile->x >> 5, selectedTile->y >> 5); + if (z > highestZ) + highestZ = z; + + selectedTile++; + } + } + RCT2_GLOBAL(0x00F440E2, uint16) = z; + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 2 | 4); + if (!ride_get_place_position_from_screen_position(screenX, screenY, &x, &y)) + return; + + z = RCT2_GLOBAL(0x00F44163, uint16); + if (z == 0) + z = map_get_highest_z(x >> 5, y >> 5); + + tool_cancel(); + + rct_ride *ride = GET_RIDE(_currentRideIndex); + if (RCT2_GLOBAL(0x00F44163, uint16) == 0) { + rct_preview_track *trackBlock = get_track_def_from_ride(ride, _currentTrackPieceType); + int bx = 0; + do { + bx = min(bx, trackBlock->z); + trackBlock++; + } while (trackBlock->var_00 != 255); z -= bx; - int start_x = x; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) - { - case 0: - x = y - x; - y = (y + start_x) / 2 - z; + z -= 16; + } else { + z = RCT2_GLOBAL(0x00F44163, uint16); + } + + if (ride->type == RIDE_TYPE_MAZE) { + // goto loc_6CCDE4 + return; + } + + for (int zAttempts = 41; zAttempts >= 0; zAttempts--) { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_FRONT; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + sub_6C84CE(); + w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w == NULL) break; - case 1: - x = -x - y; - y = (y - start_x) / 2 - z; - break; - case 2: - x -= y; - y = (-y - start_x) / 2 - z; - break; - case 3: - x += y; - y = (-y + start_x) / 2 - z; + + RCT2_GLOBAL(0x009A8C29, uint8) |= 1; + window_event_mouse_up_call(w, WIDX_CONSTRUCT); + RCT2_GLOBAL(0x009A8C29, uint8) &= ~1; + + if (RCT2_GLOBAL(0x00F44074, money32) == MONEY32_UNDEFINED) { + rct_string_id errorText = RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id); + if ( + errorText == STR_NOT_ENOUGH_CASH_REQUIRES || + errorText == STR_CAN_ONLY_BUILD_THIS_UNDERWATER || + errorText == STR_CAN_ONLY_BUILD_THIS_ON_WATER || + errorText == STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND || + errorText == STR_TOO_HIGH_FOR_SUPPORTS || + zAttempts == 0 || + z - 8 < 0 + ) { + int saveTrackDirection = _currentTrackPieceDirection; + int saveCurrentTrackCurve = _currentTrackCurve; + int savePreviousTrackSlopeEnd = _previousTrackSlopeEnd; + int saveCurrentTrackSlopeEnd = _currentTrackSlopeEnd; + int savePreviousTrackBankEnd = _previousTrackBankEnd; + int saveCurrentTrackBankEnd = _currentTrackBankEnd; + int saveCurrentTrackCovered = _currentTrackCovered; + int saveCurrentTrackLiftHill = _currentTrackLiftHill; + + sub_6CC3FB(_currentRideIndex); + + _currentTrackPieceDirection = saveTrackDirection; + _currentTrackCurve = saveCurrentTrackCurve; + _previousTrackSlopeEnd = savePreviousTrackSlopeEnd; + _currentTrackSlopeEnd = saveCurrentTrackSlopeEnd; + _previousTrackBankEnd = savePreviousTrackBankEnd; + _currentTrackBankEnd = saveCurrentTrackBankEnd; + _currentTrackCovered = saveCurrentTrackCovered; + _currentTrackLiftHill = saveCurrentTrackLiftHill; + + sound_play_panned(SOUND_ERROR, RCT2_GLOBAL(0x0142406C, sint32), x, y, z); + break; + } else if (zAttempts >= 0) { + z += 16; + } + } else { + window_close_by_class(WC_ERROR); + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_0) { + w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w != NULL) { + if (ride_are_all_possible_entrances_and_exits_built(ride)) { + window_close(w); + } else { + window_event_mouse_up_call(w, WIDX_ENTRANCE); + } + } + } break; } - clip_dpi->x += x - width / 2; - clip_dpi->y += y - height / 2 - 16; - RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*) = clip_dpi; - uint32_t d = RCT2_GLOBAL(0xF44136, int16_t) << 16; - d |= RCT2_GLOBAL(0xF44133, uint8_t);// Ride id - d |= RCT2_GLOBAL(0xF44135, uint8_t) << 8; - RCT2_CALLPROC_X(0x6CBCE2, 0x1000, (((uint16_t)bx) & 0xFF) | (RCT2_GLOBAL(0xF44134, uint8_t) << 8), 0x1000, d, width / 2, 0x400, height / 2); - rct2_free(clip_dpi); } - short string_x = (RCT2_GLOBAL(0x9D7C02, int16_t) + RCT2_GLOBAL(0x9D7C04, int16_t)) / 2 + w->x; - short string_y = RCT2_GLOBAL(0x9D7C08, int16_t) + w->y - 23; - if (RCT2_GLOBAL(0xF440A6, uint8_t) != 4) gfx_draw_string_centred(dpi, 1407, string_x, string_y, 0, w); - string_y += 11; - if (RCT2_GLOBAL(0xF44070, uint32_t) != MONEY32_UNDEFINED && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32_t) & 0x800)) - gfx_draw_string_centred(dpi, 1408, string_x, string_y, 0, (void*)0xF44070); } -//0x006CD45B -void window_construction_maze_paint() +/** + * + * rct2: 0x006CCA73 + */ +static void ride_construction_tooldown_entrance_exit(int screenX, int screenY) { - rct_window *w; - rct_drawpixelinfo *dpi; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); -} \ No newline at end of file + sub_6C9627(); + map_invalidate_selection_rect(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 4); + + int mapX, mapY, direction; + ride_get_entrance_or_exit_position_from_screen_position(screenX, screenY, &mapX, &mapY, &direction); + if (RCT2_GLOBAL(0x00F44194, uint8) == 255) + return; + + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = (RCT2_GLOBAL(0x00F44191, uint8) == 0) ? + STR_CANT_BUILD_MOVE_ENTRANCE_FOR_THIS_RIDE_ATTRACTION : + STR_CANT_BUILD_MOVE_EXIT_FOR_THIS_RIDE_ATTRACTION; + + money32 cost = game_do_command( + RCT2_GLOBAL(0x00F44188, uint16), + (GAME_COMMAND_FLAG_APPLY) | ((RCT2_GLOBAL(0x00F44194, uint8) ^ 2) << 8), + RCT2_GLOBAL(0x00F4418A, uint16), + RCT2_GLOBAL(0x00F44192, uint8) | (RCT2_GLOBAL(0x00F44191, uint8) << 8), + GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, + RCT2_GLOBAL(0x00F44193, uint8), + 0 + ); + if (cost == MONEY32_UNDEFINED) { + return; + } + + sound_play_panned( + SOUND_PLACE_ITEM, + 0x8001, + RCT2_GLOBAL(0x009DEA5E, uint16), + RCT2_GLOBAL(0x009DEA60, uint16), + RCT2_GLOBAL(0x009DEA62, uint16) + ); + + rct_ride *ride = GET_RIDE(RCT2_GLOBAL(0x00F44192, uint8)); + if (ride_are_all_possible_entrances_and_exits_built(ride)) { + tool_cancel(); + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_15)) { + window_close_by_class(WC_RIDE_CONSTRUCTION); + } + } else { + RCT2_GLOBAL(0x00F44191, uint8) ^= 1; + window_invalidate_by_class(77); + RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) = (RCT2_GLOBAL(0x00F44191, uint8) == 0) ? + WIDX_ENTRANCE : WIDX_EXIT; + } +} diff --git a/src/windows/track_place.c b/src/windows/track_place.c index 7e8bcbf35f..7e19dba052 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -357,7 +357,7 @@ static void window_track_place_attempt_placement(int x, int y, int z, int bl, mo ebx = bl; ecx = y; edi = z; - result = game_do_command_p(GAME_COMMAND_PLACE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + result = game_do_command_p(GAME_COMMAND_PLACE_TRACK_DESIGN, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); if (cost != NULL) *cost = result; if (rideIndex != NULL) *rideIndex = edi & 0xFF; diff --git a/src/world/map.c b/src/world/map.c index fd40301cd3..602be3f4ee 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -153,14 +153,22 @@ void map_element_iterator_restart_for_tile(map_element_iterator *it) rct_map_element *map_get_first_element_at(int x, int y) { - if (x < 0 || y < 0 || x > 255 || y > 255) - { - log_error("Trying to access element outside of range"); + if (x < 0 || y < 0 || x > 255 || y > 255) { + log_error("Trying to access element outside of range"); return NULL; } return TILE_MAP_ELEMENT_POINTER(x + y * 256); } +void map_set_tile_elements(int x, int y, rct_map_element *elements) +{ + if (x < 0 || y < 0 || x > 255 || y > 255) { + log_error("Trying to access element outside of range"); + return; + } + TILE_MAP_ELEMENT_POINTER(x + y * 256) = elements; +} + int map_element_is_last_for_tile(rct_map_element *element) { return element->flags & MAP_ELEMENT_FLAG_LAST_TILE; @@ -171,6 +179,11 @@ int map_element_get_type(rct_map_element *element) return element->type & MAP_ELEMENT_TYPE_MASK; } +int map_element_get_direction(rct_map_element *element) +{ + return element->type & MAP_ELEMENT_DIRECTION_MASK; +} + int map_element_get_terrain(rct_map_element *element) { int terrain = (element->properties.surface.terrain >> 5) & 7; @@ -3061,3 +3074,24 @@ static void sub_68AE2A(int x, int y) } } } + +int map_get_highest_z(int tileX, int tileY) +{ + rct_map_element *mapElement; + int z; + + mapElement = map_get_surface_element_at(tileX, tileY); + if (mapElement == NULL) + return -1; + + z = mapElement->base_height * 8; + + // Raise z so that is above highest point of land and water on tile + if ((mapElement->properties.surface.slope & 0x0F) != 0) + z += 16; + if ((mapElement->properties.surface.slope & 0x10) != 0) + z += 16; + + z = max(z, (mapElement->properties.surface.terrain & 0x1F) * 16); + return z; +} diff --git a/src/world/map.h b/src/world/map.h index 6fcf3df8b2..0c2882bb0c 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -121,6 +121,10 @@ enum { MAP_ELEMENT_TYPE_BANNER = (7 << 2) }; +enum { + MAP_ELEMENT_TYPE_FLAG_HIGHLIGHT = (1 << 6) +}; + enum { MAP_ELEMENT_DIRECTION_WEST, MAP_ELEMENT_DIRECTION_NORTH, @@ -254,8 +258,10 @@ extern bool gClearFootpath; void map_init(int size); void map_update_tile_pointers(); rct_map_element *map_get_first_element_at(int x, int y); +void map_set_tile_elements(int x, int y, rct_map_element *elements); int map_element_is_last_for_tile(rct_map_element *element); int map_element_get_type(rct_map_element *element); +int map_element_get_direction(rct_map_element *element); int map_element_get_terrain(rct_map_element *element); int map_element_get_terrain_edge(rct_map_element *element); void map_element_set_terrain(rct_map_element *element, int terrain); @@ -322,6 +328,7 @@ void map_element_iterator_restart_for_tile(map_element_iterator *it); void map_remove_intersecting_walls(int x, int y, int z0, int z1, int direction); void map_update_tiles(); +int map_get_highest_z(int tileX, int tileY); void sub_6A7594(); int map_element_get_banner_index(rct_map_element *mapElement); From d45cf519e355a1126e2e2c72351d0467dabdb7be Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 27 Jun 2015 15:21:32 +0100 Subject: [PATCH 0119/1173] fix warnings --- src/title.c | 2 +- src/windows/title_editor.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/title.c b/src/title.c index 160de8c665..b8c9e715ab 100644 --- a/src/title.c +++ b/src/title.c @@ -720,7 +720,7 @@ bool title_refresh_sequence() if (_loadedScript != _magicMountainScript) SafeFree(_loadedScript); _scriptCurrentPreset = 0; - _loadedScript = _magicMountainScript; + _loadedScript = (uint8*)_magicMountainScript; _currentScript = _magicMountainScript; _scriptWaitCounter = 0; gTitleScriptCommand = -1; diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index a62e17a86d..2b13bcc63a 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -319,7 +319,7 @@ static void window_title_editor_mouseup() case WIDX_TITLE_EDITOR_NEW_BUTTON: commandEditorOpen *= 2; if (!commandEditorOpen) - window_text_input_open(w, widgetIndex, 5239, 5406, STR_NONE, NULL, 64); + window_text_input_open(w, widgetIndex, 5239, 5406, STR_NONE, 0, 64); break; case WIDX_TITLE_EDITOR_DUPLICATE_BUTTON: commandEditorOpen *= 2; From a4322cb8559848036dd641aa7dd97b957b8df5bd Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sat, 27 Jun 2015 16:25:42 +0200 Subject: [PATCH 0120/1173] Fix observation tower and launched freefall descriptions --- data/language/english_uk.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 24f2a80331..1bc1d8a163 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -525,9 +525,9 @@ STR_0520 :A dock platform where guests can drive/row personal watercraft on a STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them STR_0523 :Riders travel slowly in powered vehicles along a track-based route -STR_0524 : +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track -STR_0526 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0526 :Passengers travel in an rotating observation cabin which travels up a tall tower STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track From 457e7862b388c9e6dd8650a4831365292b217c1b Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 27 Jun 2015 17:53:28 +0100 Subject: [PATCH 0121/1173] prepare track place and remove game commands --- src/game.c | 10 +++++----- src/localisation/string_ids.h | 7 +++++++ src/ride/track.c | 26 +++++++++++++++++++++++--- src/ride/track.h | 5 ++++- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/game.c b/src/game.c index 2a032562e7..cfd8ba82b1 100644 --- a/src/game.c +++ b/src/game.c @@ -909,8 +909,8 @@ static uint32 game_do_command_table[58] = { 0, 0x0066397F, 0, - 0x006C511D, - 0x006C5B69, + 0, + 0, 0, 0x006B3F0F, 0, @@ -972,8 +972,8 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_set_ride_appearance, game_command_emptysub, game_pause_toggle, - game_command_emptysub, - game_command_emptysub, + game_command_place_track, + game_command_remove_track, game_load_or_quit, game_command_emptysub, game_command_demolish_ride, @@ -1016,7 +1016,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_remove_large_scenery, game_command_set_current_loan, game_command_set_research_funding, - game_command_place_track, + game_command_place_track_design, game_command_start_campaign, game_command_emptysub, game_command_place_banner, // 50 diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index b93bab5ec7..464d3f454d 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -561,6 +561,8 @@ enum { STR_RIDE_CONSTRUCTION_U_SHAPED_OPEN_TRACK_TIP = 1460, STR_RIDE_CONSTRUCTION_O_SHAPED_ENCLOSED_TRACK_TIP = 1461, + STR_TOO_STEEP_FOR_LIFT_HILL = 1462, + STR_GUESTS = 1463, STR_HELIX_UP_SMALL = 1464, @@ -688,6 +690,9 @@ enum { STR_NUMBER_OF_SWINGS = 1769, STR_NUMBER_OF_SWINGS_TIP = 1770, + STR_ONLY_ONE_ON_RIDE_PHOTO_PER_RIDE = 1773, + STR_ONLY_ONE_CABLE_LIFT_HILL_PER_RIDE = 1774, + STR_OFF = 1775, STR_ON = 1776, STR_MUSIC = 1777, @@ -1154,6 +1159,8 @@ enum { STR_TOP_SECTION = 3069, STR_SLOPE_TO_LEVEL = 3070, + STR_NOT_ALLOWED_TO_MODIFY_STATION = 3092, + // Cheats STR_CHEAT_TITLE = 5217, STR_CHEAT_TITLE_FINANCIAL = 5345, diff --git a/src/ride/track.c b/src/ride/track.c index 0f73007b47..c51e298618 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -20,23 +20,25 @@ #include "../addresses.h" #include "../audio/audio.h" +#include "../cheats.h" #include "../config.h" #include "../game.h" #include "../interface/viewport.h" #include "../localisation/localisation.h" +#include "../management/finance.h" #include "../platform/platform.h" #include "../rct1.h" #include "../util/sawyercoding.h" #include "../util/util.h" +#include "../world/map_animation.h" #include "../world/park.h" #include "../world/scenery.h" #include "../world/footpath.h" #include "../windows/error.h" -#include "ride_ratings.h" #include "ride.h" +#include "ride_ratings.h" #include "track.h" #include "track_data.h" -#include "../rct1.h" /** * @@ -3170,7 +3172,7 @@ int install_track(char* source_path, char* dest_name){ } /* rct2: 0x006D13FE */ -void game_command_place_track(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp){ +void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp){ int x = *eax; int y = *ecx; int z = *edi; @@ -3439,3 +3441,21 @@ rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType) { return get_track_def_from_ride(GET_RIDE(rideIndex), trackType); } + +/** + * + * rct2: 0x006C511D + */ +void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) +{ + RCT2_CALLFUNC_X(0x006C511D, eax, ebx, ecx, edx, esi, edi, ebp); +} + +/** + * + * rct2: 0x006C5B69 + */ +void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) +{ + RCT2_CALLFUNC_X(0x006C5B69, eax, ebx, ecx, edx, esi, edi, ebp); +} \ No newline at end of file diff --git a/src/ride/track.h b/src/ride/track.h index 5497bdbc45..ce70239a47 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -486,7 +486,7 @@ int sub_6D01B3(uint8 bl, uint8 rideIndex, int x, int y, int z); int save_track_design(uint8 rideIndex); int install_track(char* source_path, char* dest_name); void window_track_list_format_name(char *dst, const char *src, char colour, char quotes); -void game_command_place_track(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); +void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void track_save_reset_scenery(); void track_save_select_nearby_scenery(int rideIndex); @@ -494,4 +494,7 @@ void track_save_select_nearby_scenery(int rideIndex); rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType); rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType); +void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); + #endif From 97e4a4d66301be46414b6280d75e824f762ad51f Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 27 Jun 2015 22:53:52 +0100 Subject: [PATCH 0122/1173] add track block and possible ride configuration tables --- src/ride/ride.c | 6 +- src/ride/track.c | 18 +- src/ride/track.h | 8 +- src/ride/track_data.c | 4409 ++++++++++++++++++++++++++++++- src/ride/track_data.h | 7 +- src/windows/ride_construction.c | 24 +- src/windows/track_place.c | 6 +- 7 files changed, 4445 insertions(+), 33 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index c71dfd4e9f..6d557a5082 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -836,7 +836,7 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par return 1; // Possibly z should be & 0xF8 - rct_preview_track *trackBlock = get_track_def_from_ride_index(mapElement->properties.track.ride_index, type); + const rct_preview_track *trackBlock = get_track_def_from_ride_index(mapElement->properties.track.ride_index, type); int sequence = mapElement->properties.track.sequence & 0x0F; uint8 mapDirection = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; @@ -863,7 +863,7 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par int start_x = *x, start_y = *y, start_z = *z; *z += trackBlock[0].z; - for (int i = 0; trackBlock[i].var_00 != 0xFF; ++i){ + for (int i = 0; trackBlock[i].index != 0xFF; ++i){ int cur_x = start_x, cur_y = start_y, cur_z = start_z; switch (mapDirection){ case MAP_ELEMENT_DIRECTION_WEST: @@ -899,7 +899,7 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par if ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) != direction) continue; - if ((mapElement->properties.track.sequence & 0xF) != trackBlock[i].var_00) + if ((mapElement->properties.track.sequence & 0xF) != trackBlock[i].index) continue; if (type == mapElement->properties.track.type) { diff --git a/src/ride/track.c b/src/ride/track.c index c51e298618..ae0de4c416 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1530,8 +1530,8 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac track_update_max_min_coordinates(x, y, z); if (RCT2_GLOBAL(0x00F440D4, uint8) == 0){ - for (rct_preview_track* trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[track_type]; - trackBlock->var_00 != 0xFF; + for (const rct_preview_track* trackBlock = TrackBlocks[track_type]; + trackBlock->index != 0xFF; trackBlock++){ rct_xy16 tile; tile.x = x; @@ -1585,7 +1585,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac //di int temp_z = z; temp_z -= track_coordinates->z_negative; - rct_preview_track* trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[track_type]; + const rct_preview_track* trackBlock = TrackBlocks[track_type]; temp_z += trackBlock->z; // rotation in bh @@ -1628,8 +1628,8 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac } if (RCT2_GLOBAL(0x00F440D4, uint8) == 3){ - for (rct_preview_track* trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[track_type]; - trackBlock->var_00 != 0xFF; + for (const rct_preview_track* trackBlock = TrackBlocks[track_type]; + trackBlock->index != 0xFF; trackBlock++){ rct_xy16 tile; tile.x = x; @@ -3430,14 +3430,14 @@ static void track_save_add_map_element(int mapElementSelectType, int x, int y, r RCT2_CALLPROC_X(0x006D2B3C, x, mapElementSelectType, y, (int)mapElement, 0, 0, 0); } -rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType) +const rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType) { return ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? - RCT2_ADDRESS(0x00994A38, rct_preview_track*)[trackType] : - RCT2_ADDRESS(0x00994638, rct_preview_track*)[trackType]; + FlatRideTrackBlocks[trackType] : + TrackBlocks[trackType]; } -rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType) +const rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType) { return get_track_def_from_ride(GET_RIDE(rideIndex), trackType); } diff --git a/src/ride/track.h b/src/ride/track.h index ce70239a47..197a516d59 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -39,10 +39,10 @@ typedef struct { * Size: 0x0A */ typedef struct { - uint8 var_00; + uint8 index; // 0x00 sint16 x; // 0x01 sint16 y; // 0x03 - sint16 z; + sint16 z; // 0x05 uint8 var_07; uint8 var_08; uint8 var_09; @@ -491,8 +491,8 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int void track_save_reset_scenery(); void track_save_select_nearby_scenery(int rideIndex); -rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType); -rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType); +const rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType); +const rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType); void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); diff --git a/src/ride/track_data.c b/src/ride/track_data.c index 636cb95522..f6fda77678 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -18,6 +18,7 @@ * along with this program. If not, see . *****************************************************************************/ +#include "track.h" #include "track_data.h" const rct_track_coordinates TrackCoordinates[256] = { @@ -277,4 +278,4410 @@ const rct_track_coordinates TrackCoordinates[256] = { { 0, 2, 0, 96, 64, 0 }, { 0, 2, 0, -128, -96, 0 }, { 0, 2, 0, 128, 64, 0 } -}; \ No newline at end of file +}; + +// rct2: 0x0097C468 (0 - 31) and 0x0097C5D4 (32 - 63) +const uint64 RideTypePossibleTrackConfigurations[91] = { + /* RIDE_TYPE_SPIRAL_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_STAND_UP_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_SUSPENDED_SWINGING_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_LARGE_UNBANKED | TRACK_BRAKES, + /* RIDE_TYPE_INVERTED_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_LARGE | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_HALF_LOOP_LARGE, + /* RIDE_TYPE_JUNIOR_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_CURVE | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_MINIATURE_RAILWAY */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE, + /* RIDE_TYPE_MONORAIL */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE, + /* RIDE_TYPE_MINI_SUSPENDED_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE, + /* RIDE_TYPE_BOAT_RIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_CURVE_VERY_SMALL, + /* RIDE_TYPE_WOODEN_WILD_MOUSE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_LONG | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL, + /* RIDE_TYPE_STEEPLECHASE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_BRAKES, + /* RIDE_TYPE_CAR_RIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_TOWER_BASE, + /* RIDE_TYPE_LAUNCHED_FREEFALL */ TRACK_TOWER_BASE, + /* RIDE_TYPE_BOBSLEIGH_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_OBSERVATION_TOWER */ TRACK_TOWER_BASE, + /* RIDE_TYPE_LOOPING_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_DINGHY_SLIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE, + /* RIDE_TYPE_MINE_TRAIN_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_CHAIRLIFT */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL, + /* RIDE_TYPE_CORKSCREW_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_MAZE */ 0, + /* RIDE_TYPE_SPIRAL_SLIDE */ 0, + /* RIDE_TYPE_GO_KARTS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL, + /* RIDE_TYPE_LOG_FLUME */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_RIVER_RAPIDS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_TOWER_BASE | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_DODGEMS */ 0, + /* RIDE_TYPE_PIRATE_SHIP */ 0, + /* RIDE_TYPE_SWINGING_INVERTER_SHIP */ 0, + /* RIDE_TYPE_FOOD_STALL */ 0, + /* RIDE_TYPE_1D */ 0, + /* RIDE_TYPE_DRINK_STALL */ 0, + /* RIDE_TYPE_1F */ 0, + /* RIDE_TYPE_SHOP */ 0, + /* RIDE_TYPE_MERRY_GO_ROUND */ 0, + /* RIDE_TYPE_22 */ 0, + /* RIDE_TYPE_INFORMATION_KIOSK */ 0, + /* RIDE_TYPE_TOILETS */ 0, + /* RIDE_TYPE_FERRIS_WHEEL */ 0, + /* RIDE_TYPE_MOTION_SIMULATOR */ 0, + /* RIDE_TYPE_3D_CINEMA */ 0, + /* RIDE_TYPE_TOP_SPIN */ 0, + /* RIDE_TYPE_SPACE_RINGS */ 0, + /* RIDE_TYPE_REVERSE_FREEFALL_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL_STEEP, + /* RIDE_TYPE_LIFT */ TRACK_TOWER_BASE, + /* RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER */ TRACK_FLAT | TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_LONG | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL, + /* RIDE_TYPE_CASH_MACHINE */ 0, + /* RIDE_TYPE_TWIST */ 0, + /* RIDE_TYPE_HAUNTED_HOUSE */ 0, + /* RIDE_TYPE_FIRST_AID */ 0, + /* RIDE_TYPE_CIRCUS_SHOW */ 0, + /* RIDE_TYPE_GHOST_TRAIN */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_TWISTER_ROLLER_COASTER */ TRACK_FLAT | TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL | TRACK_BARREL_ROLL | TRACK_POWERED_LIFT | TRACK_HALF_LOOP_LARGE, + /* RIDE_TYPE_WOODEN_ROLLER_COASTER */ TRACK_FLAT | TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_WATER_SPLASH, + /* RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_BRAKES, + /* RIDE_TYPE_WILD_MOUSE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_LONG | TRACK_SLOPE_CURVE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HALF_LOOP | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL, + /* RIDE_TYPE_38 */ TRACK_STRAIGHT | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_CORKSCREW | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL, + /* RIDE_TYPE_FLYING_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_3A */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_HELIX_LARGE | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_VIRGINIA_REEL */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL, + /* RIDE_TYPE_SPLASH_BOATS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_S_BEND | TRACK_CURVE, + /* RIDE_TYPE_MINI_HELICOPTERS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL, + /* RIDE_TYPE_LAY_DOWN_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_SUSPENDED_MONORAIL */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE, + /* RIDE_TYPE_40 */ TRACK_STRAIGHT | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_HELIX_LARGE | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_REVERSER_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_BRAKES, + /* RIDE_TYPE_HEARTLINE_TWISTER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_SLOPE | TRACK_SLOPE_STEEP, + /* RIDE_TYPE_MINI_GOLF */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL, + /* RIDE_TYPE_GIGA_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_ROTO_DROP */ TRACK_TOWER_BASE, + /* RIDE_TYPE_FLYING_SAUCERS */ 0, + /* RIDE_TYPE_CROOKED_HOUSE */ 0, + /* RIDE_TYPE_MONORAIL_CYCLES */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE, + /* RIDE_TYPE_COMPACT_INVERTED_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_LARGE | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL, + /* RIDE_TYPE_WATER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL_STEEP | TRACK_LIFT_HILL_CURVE | TRACK_FLAT_ROLL_BANKING | TRACK_CURVE | TRACK_BRAKES, + /* RIDE_TYPE_INVERTED_HAIRPIN_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_LONG | TRACK_SLOPE_CURVE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_MAGIC_CARPET */ 0, + /* RIDE_TYPE_SUBMARINE_RIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL, + /* RIDE_TYPE_RIVER_RAFTS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_S_BEND | TRACK_CURVE, + /* RIDE_TYPE_50 */ 0, + /* RIDE_TYPE_ENTERPRISE */ 0, + /* RIDE_TYPE_52 */ 0, + /* RIDE_TYPE_53 */ 0, + /* RIDE_TYPE_54 */ 0, + /* RIDE_TYPE_55 */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_INVERTED_IMPULSE_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_VERTICAL, + /* RIDE_TYPE_MINI_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_MINE_RIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_59 */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_CORKSCREW | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL +}; + +static const rct_preview_track TrackBlocks000[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks001[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks002[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks003[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks004[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks005[] = { + { 0, 0, 0, 0, 64, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 63 } +}; + +static const rct_preview_track TrackBlocks006[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks007[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track TrackBlocks008[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track TrackBlocks009[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks010[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks011[] = { + { 0, 0, 0, 0, 64, 63, 0 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track TrackBlocks012[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks013[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks014[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks015[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks016[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks017[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks018[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks019[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks020[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks021[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks022[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks023[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks024[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks025[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks026[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks027[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks028[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks029[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks030[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks031[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks032[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks033[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks034[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 16, 71, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 48, 0, 8, 1 }, + { 5, -64, -32, 32, 16, 71, 0 }, + { 6, -64, -64, 48, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks035[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 16, 139, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 48, 0, 4, 1 }, + { 5, -64, 32, 32, 16, 139, 0 }, + { 6, -64, 64, 48, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track TrackBlocks036[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, -32, 48, 0, 8, 1 }, + { 2, -32, 0, 32, 16, 23, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 16, 0, 8, 1 }, + { 5, -64, -32, 16, 16, 23, 0 }, + { 6, -64, -64, 0, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track TrackBlocks037[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, 32, 48, 0, 4, 1 }, + { 2, -32, 0, 32, 16, 43, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 16, 0, 4, 1 }, + { 5, -64, 32, 16, 16, 43, 0 }, + { 6, -64, 64, 0, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks038[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 7, 0 }, + { 2, -32, -32, 0, 0, 13, 0 }, + { 3, -64, -32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks039[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 11, 0 }, + { 2, -32, 32, 0, 0, 14, 0 }, + { 3, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks040[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 2, 0 }, + { 3, -32, 0, 120, 16, 6, 0 }, + { 4, -32, -32, 120, 0, 0, 0 }, + { 5, 0, 0, 120, 0, 0, 0 }, + { 6, 0, -32, 120, 16, 9, 0 }, + { 7, 32, -32, 32, 96, 8, 0 }, + { 8, 0, -32, 16, 16, 63, 0 }, + { 9, -32, -32, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks041[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 1, 0 }, + { 3, -32, 0, 120, 16, 9, 0 }, + { 4, -32, 32, 120, 0, 0, 0 }, + { 5, 0, 0, 120, 0, 0, 0 }, + { 6, 0, 32, 120, 16, 6, 0 }, + { 7, 32, 32, 32, 96, 4, 0 }, + { 8, 0, 32, 16, 16, 63, 0 }, + { 9, -32, 32, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track TrackBlocks042[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 2, 0 }, + { 3, -32, -32, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track TrackBlocks043[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 0 }, + { 3, -32, 32, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 16, 71 } +}; + +static const rct_preview_track TrackBlocks044[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 2, 0 }, + { 3, -32, -32, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track TrackBlocks045[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 0 }, + { 3, -32, 32, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 16, 71 } +}; + +static const rct_preview_track TrackBlocks046[] = { + { 0, 0, 0, 0, 16, 71, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 16, 16, 103, 0 }, + { 255, 0, 0, 0, 0, 16, 139 } +}; + +static const rct_preview_track TrackBlocks047[] = { + { 0, 0, 0, 0, 16, 139, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 16, 16, 155, 0 }, + { 255, 0, 0, 4096, 0, 16, 55 } +}; + +static const rct_preview_track TrackBlocks048[] = { + { 0, 0, 0, 16, 16, 55, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 0, 16, 23, 0 }, + { 255, 0, 0, 4096, 0, 16, 59 } +}; + +static const rct_preview_track TrackBlocks049[] = { + { 0, 0, 0, 16, 16, 59, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 0, 16, 43, 0 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track TrackBlocks050[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track TrackBlocks051[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks052[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks053[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks054[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks055[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks056[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 3, 0 }, + { 3, -32, 0, 120, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 32, 15 } +}; + +static const rct_preview_track TrackBlocks057[] = { + { 0, 0, 0, -32, 32, 15, 0 }, + { 1, -32, 0, -120, 96, 3, 0 }, + { 2, 0, 0, -136, 16, 207, 0 }, + { 3, 32, 0, -152, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks058[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 7, 0 }, + { 2, -32, -32, 48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks059[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 11, 0 }, + { 2, -32, 32, 48, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track TrackBlocks060[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -56, 32, 7, 0 }, + { 2, -32, -32, -80, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track TrackBlocks061[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -56, 32, 11, 0 }, + { 2, -32, 32, -80, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 24, 15 } +}; + +static const rct_preview_track TrackBlocks062[] = { + { 0, 0, 0, 0, 24, 15, 0 }, + { 255, 0, 0, 0, 0, 24, 207 } +}; + +static const rct_preview_track TrackBlocks063[] = { + { 0, 0, 0, 0, 24, 207, 0 }, + { 255, 0, 0, 0, 0, 24, 63 } +}; + +static const rct_preview_track TrackBlocks064[] = { + { 0, 0, 0, 0, 24, 63, 0 }, + { 255, 0, 0, 0, 0, 24, 15 } +}; + +static const rct_preview_track TrackBlocks065[] = { + { 0, 0, 0, 0, 24, 15, 0 }, + { 255, 0, 0, 0, 0, 64, 15 } +}; + +static const rct_preview_track TrackBlocks066[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 1, -32, -32, 0, 0, 15, 0 }, + { 2, -32, 0, 0, 0, 15, 0 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, 0, -32, 0, 0, 15, 0 }, + { 5, 0, 32, 0, 0, 15, 0 }, + { 6, 32, -32, 0, 0, 15, 0 }, + { 7, 32, 32, 0, 0, 15, 0 }, + { 8, 32, 0, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks067[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 32, 0, 0, 0, 0, 3 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track TrackBlocks068[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks069[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks070[] = { + { 0, 0, 0, 0, 64, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 63 } +}; + +static const rct_preview_track TrackBlocks071[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks072[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track TrackBlocks073[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track TrackBlocks074[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks075[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks076[] = { + { 0, 0, 0, 0, 64, 63, 0 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track TrackBlocks077[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks078[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks079[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks080[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks081[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks082[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks083[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 7, 0 }, + { 2, -32, -32, 0, 0, 13, 0 }, + { 3, -64, -32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks084[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 11, 0 }, + { 2, -32, 32, 0, 0, 14, 0 }, + { 3, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks085[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 2, 0 }, + { 3, -32, -32, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track TrackBlocks086[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 0 }, + { 3, -32, 32, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 16, 71 } +}; + +static const rct_preview_track TrackBlocks087[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 4, 2, 0 }, + { 3, -32, -32, 0, 4, 7, 0 }, + { 4, -32, -64, 8, 0, 11, 0 }, + { 5, 0, -64, 8, 0, 4, 1 }, + { 6, -32, -96, 8, 4, 1, 0 }, + { 7, 0, -96, 8, 4, 11, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track TrackBlocks088[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 4, 1, 0 }, + { 3, -32, 32, 0, 4, 11, 0 }, + { 4, -32, 64, 8, 0, 7, 0 }, + { 5, 0, 64, 8, 0, 8, 1 }, + { 6, -32, 96, 8, 4, 2, 0 }, + { 7, 0, 96, 8, 4, 7, 0 }, + { 255, 0, 0, 2048, 0, 4, 7 } +}; + +static const rct_preview_track TrackBlocks089[] = { + { 0, 0, 0, 8, 4, 7, 0 }, + { 1, 0, -32, 8, 4, 8, 1 }, + { 2, -32, 0, 8, 0, 2, 0 }, + { 3, -32, -32, 8, 0, 7, 0 }, + { 4, -32, -64, 0, 4, 11, 0 }, + { 5, 0, -64, 0, 4, 4, 1 }, + { 6, -32, -96, 0, 0, 1, 0 }, + { 7, 0, -96, 0, 0, 11, 0 }, + { 255, 0, 0, 2048, 0, 4, 11 } +}; + +static const rct_preview_track TrackBlocks090[] = { + { 0, 0, 0, 8, 4, 11, 0 }, + { 1, 0, 32, 8, 4, 4, 1 }, + { 2, -32, 0, 8, 0, 1, 0 }, + { 3, -32, 32, 8, 0, 11, 0 }, + { 4, -32, 64, 0, 4, 7, 0 }, + { 5, 0, 64, 0, 4, 8, 1 }, + { 6, -32, 96, 0, 0, 2, 0 }, + { 7, 0, 96, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks091[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 4, 8, 1 }, + { 5, -64, -32, 0, 4, 7, 0 }, + { 6, -64, -64, 0, 4, 15, 0 }, + { 7, -64, -96, 8, 0, 15, 0 }, + { 8, -32, -96, 8, 0, 4, 1 }, + { 9, -64, -128, 8, 0, 11, 0 }, + { 10, -32, -128, 8, 0, 14, 0 }, + { 11, 0, -128, 8, 4, 4, 1 }, + { 12, -32, -160, 8, 4, 11, 0 }, + { 13, 0, -160, 8, 4, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks092[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 4, 4, 1 }, + { 5, -64, 32, 0, 4, 11, 0 }, + { 6, -64, 64, 0, 4, 15, 0 }, + { 7, -64, 96, 8, 0, 15, 0 }, + { 8, -32, 96, 8, 0, 8, 1 }, + { 9, -64, 128, 8, 0, 7, 0 }, + { 10, -32, 128, 8, 0, 13, 0 }, + { 11, 0, 128, 8, 4, 8, 1 }, + { 12, -32, 160, 8, 4, 7, 0 }, + { 13, 0, 160, 8, 4, 15, 0 }, + { 255, 0, 0, 2048, 0, 4, 15 } +}; + +static const rct_preview_track TrackBlocks093[] = { + { 0, 0, 0, 8, 4, 15, 0 }, + { 1, 0, -32, 8, 4, 8, 1 }, + { 2, -32, 0, 8, 4, 7, 0 }, + { 3, -32, -32, 8, 0, 13, 0 }, + { 4, -32, -64, 8, 0, 8, 1 }, + { 5, -64, -32, 8, 0, 7, 0 }, + { 6, -64, -64, 8, 0, 15, 0 }, + { 7, -64, -96, 0, 4, 15, 0 }, + { 8, -32, -96, 0, 4, 4, 1 }, + { 9, -64, -128, 0, 4, 11, 0 }, + { 10, -32, -128, 0, 0, 14, 0 }, + { 11, 0, -128, 0, 0, 4, 1 }, + { 12, -32, -160, 0, 0, 11, 0 }, + { 13, 0, -160, 0, 0, 15, 0 }, + { 255, 0, 0, 2048, 0, 4, 15 } +}; + +static const rct_preview_track TrackBlocks094[] = { + { 0, 0, 0, 8, 4, 15, 0 }, + { 1, 0, 32, 8, 4, 4, 1 }, + { 2, -32, 0, 8, 4, 11, 0 }, + { 3, -32, 32, 8, 0, 14, 0 }, + { 4, -32, 64, 8, 0, 4, 1 }, + { 5, -64, 32, 8, 0, 11, 0 }, + { 6, -64, 64, 8, 0, 15, 0 }, + { 7, -64, 96, 0, 4, 15, 0 }, + { 8, -32, 96, 0, 4, 8, 1 }, + { 9, -64, 128, 0, 4, 7, 0 }, + { 10, -32, 128, 0, 0, 13, 0 }, + { 11, 0, 128, 0, 0, 8, 1 }, + { 12, -32, 160, 0, 0, 7, 0 }, + { 13, 0, 160, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 64, 15 } +}; + +static const rct_preview_track TrackBlocks095[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks096[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks097[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks098[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks099[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks100[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks101[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks102[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 12, 8, 1 }, + { 5, -64, -32, 0, 12, 7, 0 }, + { 6, -64, -64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks103[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 12, 4, 1 }, + { 5, -64, 32, 0, 12, 11, 0 }, + { 6, -64, 64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track TrackBlocks104[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, -32, 0, 12, 8, 1 }, + { 2, -32, 0, 0, 12, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track TrackBlocks105[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, 32, 0, 12, 4, 1 }, + { 2, -32, 0, 0, 12, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks106[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 12, 8, 1 }, + { 5, -64, -32, 0, 12, 7, 0 }, + { 6, -64, -64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks107[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 12, 4, 1 }, + { 5, -64, 32, 0, 12, 11, 0 }, + { 6, -64, 64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track TrackBlocks108[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, -32, 0, 12, 8, 1 }, + { 2, -32, 0, 0, 12, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track TrackBlocks109[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, 32, 0, 12, 4, 1 }, + { 2, -32, 0, 0, 12, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks110[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks111[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks112[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks113[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks114[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks115[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks116[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks117[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 0, 16, 15, 0 }, + { 3, -96, 0, 0, 16, 15, 0 }, + { 4, -128, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks118[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 24, 15, 0 }, + { 3, -96, 0, 40, 48, 15, 0 }, + { 255, 0, 0, 0, 0, 48, 15 } +}; + +static const rct_preview_track TrackBlocks119[] = { + { 0, 0, 0, 0, 48, 15, 0 }, + { 1, -32, 0, 40, 48, 15, 0 }, + { 2, -64, 0, 64, 24, 15, 0 }, + { 3, -96, 0, 80, 8, 15, 0 }, + { 255, 0, 0, 10240, 0, 48, 15 } +}; + +static const rct_preview_track TrackBlocks120[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks121[] = { + { 0, 0, 0, 40, 48, 15, 0 }, + { 1, -32, 0, 16, 24, 15, 0 }, + { 2, -64, 0, 0, 16, 15, 0 }, + { 3, -96, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 20480, 0, 8, 15 } +}; + +static const rct_preview_track TrackBlocks122[] = { + { 0, 0, 0, 80, 8, 15, 0 }, + { 1, -32, 0, 64, 24, 15, 0 }, + { 2, -64, 0, 40, 48, 15, 0 }, + { 3, -96, 0, 0, 48, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks123[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 1, -32, 0, 0, 8, 63, 0 }, + { 2, -64, 0, -32, 32, 63, 0 }, + { 3, -96, 0, -96, 64, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track TrackBlocks124[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 32, 15, 0 }, + { 2, -64, 0, 0, 48, 15, 0 }, + { 3, -96, 0, 0, 80, 15, 0 }, + { 4, -128, 0, 0, 160, 15, 0 }, + { 5, -192, 0, 0, 208, 15, 0 }, + { 6, -160, 0, 0, 208, 15, 0 }, + { 255, 0, 0, 0, 0, 48, 15 } +}; + +static const rct_preview_track TrackBlocks125[] = { + { 0, 0, 0, 0, 48, 15, 0 }, + { 1, 32, 0, 0, 48, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track TrackBlocks126[] = { + { 0, 0, 0, 0, 8, 15, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track TrackBlocks127[] = { + { 0, 0, 0, 0, 8, 15, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks128[] = { + { 0, 0, 0, 0, 32, 207, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track TrackBlocks129[] = { + { 0, 0, 0, 0, 32, 63, 4 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track TrackBlocks130[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track TrackBlocks131[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks132[] = { + { 0, 0, 0, 0, 24, 63, 0 }, + { 255, 0, 0, 0, 0, 24, 15 } +}; + +static const rct_preview_track TrackBlocks133[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 8, 0 }, + { 3, -64, 0, 0, 0, 2, 1 }, + { 4, -64, -32, 0, 0, 1, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks134[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 4, 0 }, + { 3, -64, 0, 0, 0, 1, 1 }, + { 4, -64, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks135[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, -32, 0, 0, 0, 1, 0 }, + { 2, 0, 32, 0, 0, 4, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks136[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 0 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -32, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks137[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 8, 0 }, + { 3, -64, 0, 0, 0, 2, 1 }, + { 4, -64, -32, 0, 0, 1, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks138[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 4, 0 }, + { 3, -64, 0, 0, 0, 1, 1 }, + { 4, -64, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks139[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, -32, 0, 0, 0, 1, 0 }, + { 2, 0, 32, 0, 0, 4, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks140[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 0 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -32, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks141[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track TrackBlocks142[] = { + { 0, 0, 0, 0, 16, 13, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 1 }, + { 3, -32, 32, 0, 16, 2, 0 }, + { 255, 0, 0, 0, 0, 64, 13 } +}; + +static const rct_preview_track TrackBlocks143[] = { + { 0, 0, 0, 0, 64, 13, 0 }, + { 1, 0, 32, 0, 64, 4, 1 }, + { 2, -32, 0, 0, 64, 1, 1 }, + { 3, -32, 32, 0, 64, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track TrackBlocks144[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks145[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks146[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track TrackBlocks147[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track TrackBlocks148[] = { + { 0, 0, 0, 0, 16, 13, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 1 }, + { 3, -32, 32, 0, 16, 2, 0 }, + { 255, 0, 0, 0, 0, 64, 13 } +}; + +static const rct_preview_track TrackBlocks149[] = { + { 0, 0, 0, 0, 64, 13, 0 }, + { 1, 0, 32, 0, 64, 4, 1 }, + { 2, -32, 0, 0, 64, 1, 1 }, + { 3, -32, 32, 0, 64, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track TrackBlocks150[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks151[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks152[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track TrackBlocks153[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track TrackBlocks154[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track TrackBlocks155[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track TrackBlocks156[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track TrackBlocks157[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks158[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track TrackBlocks159[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track TrackBlocks160[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks161[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks162[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks163[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks164[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track TrackBlocks165[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track TrackBlocks166[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks167[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks168[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track TrackBlocks169[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track TrackBlocks170[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks171[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks172[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks173[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks174[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 0, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track TrackBlocks175[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 0, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track TrackBlocks176[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -32, 16, 15, 0 }, + { 2, -64, 0, -32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 71 } +}; + +static const rct_preview_track TrackBlocks177[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -32, 16, 15, 0 }, + { 2, -64, 0, -32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 71 } +}; + +static const rct_preview_track TrackBlocks178[] = { + { 0, 0, 0, 0, 0, 71, 0 }, + { 1, 0, -32, 0, 16, 8, 1 }, + { 2, -32, 0, 0, 16, 2, 0 }, + { 3, -32, -32, 16, 16, 103, 0 }, + { 255, 0, 0, 0, 0, 16, 139 } +}; + +static const rct_preview_track TrackBlocks179[] = { + { 0, 0, 0, 0, 16, 139, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 0 }, + { 3, -32, 32, 16, 16, 155, 0 }, + { 255, 0, 0, 4096, 0, 16, 55 } +}; + +static const rct_preview_track TrackBlocks180[] = { + { 0, 0, 0, 16, 16, 55, 0 }, + { 1, 0, -32, 0, 16, 8, 1 }, + { 2, -32, 0, 0, 16, 2, 0 }, + { 3, -32, -32, 0, 0, 23, 0 }, + { 255, 0, 0, 4096, 0, 16, 59 } +}; + +static const rct_preview_track TrackBlocks181[] = { + { 0, 0, 0, 16, 16, 59, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 0 }, + { 3, -32, 32, 0, 0, 43, 0 }, + { 255, 0, 0, 0, 0, 24, 207 } +}; + +static const rct_preview_track TrackBlocks182[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks183[] = { + { 0, 0, 0, 0, 24, 207, 0 }, + { 1, -32, 0, 16, 40, 207, 0 }, + { 2, -64, 0, 32, 56, 15, 0 }, + { 3, -96, 0, 64, 192, 15, 0 }, + { 4, -128, -32, 120, 96, 15, 0 }, + { 5, -96, -32, 64, 192, 15, 0 }, + { 6, -64, -32, 248, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 24, 207 } +}; + +static const rct_preview_track TrackBlocks184[] = { + { 0, 0, 0, 0, 24, 207, 0 }, + { 1, -32, 0, 16, 40, 207, 0 }, + { 2, -64, 0, 32, 56, 15, 0 }, + { 3, -96, 0, 64, 192, 15, 0 }, + { 4, -128, 32, 120, 96, 15, 0 }, + { 5, -96, 32, 64, 192, 15, 0 }, + { 6, -64, 32, 248, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 24, 15 } +}; + +static const rct_preview_track TrackBlocks185[] = { + { 0, 0, 0, -32, 24, 15, 0 }, + { 1, -32, 0, -216, 192, 15, 0 }, + { 2, -64, 0, -160, 96, 15, 0 }, + { 3, -32, -32, -216, 192, 15, 0 }, + { 4, 0, -32, -248, 56, 15, 0 }, + { 5, 32, -32, -264, 40, 207, 0 }, + { 6, 64, -32, -280, 24, 207, 0 }, + { 255, 0, 0, -8192, 255, 24, 15 } +}; + +static const rct_preview_track TrackBlocks186[] = { + { 0, 0, 0, -32, 24, 15, 0 }, + { 1, -32, 0, -216, 192, 15, 0 }, + { 2, -64, 0, -160, 96, 15, 0 }, + { 3, -32, 32, -216, 192, 15, 0 }, + { 4, 0, 32, -248, 56, 15, 0 }, + { 5, 32, 32, -264, 40, 207, 0 }, + { 6, 64, 32, -280, 24, 207, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks187[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks188[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks189[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks190[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks191[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 3, 0 }, + { 3, -32, 0, 120, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 15 } +}; + +static const rct_preview_track TrackBlocks192[] = { + { 0, 0, 0, 0, 32, 15, 0 }, + { 1, -32, 0, -88, 96, 3, 0 }, + { 2, 0, 0, -104, 16, 207, 0 }, + { 3, 32, 0, -120, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks193[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 7, 0 }, + { 2, -32, -32, 48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks194[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 11, 0 }, + { 2, -32, 32, 48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks195[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, -24, 32, 7, 0 }, + { 2, -32, -32, -48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks196[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, -24, 32, 11, 0 }, + { 2, -32, 32, -48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks197[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 32, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 3, 0, 0, 32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks198[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -32, 32, 15, 0 }, + { 2, -64, 0, -16, 0, 15, 0 }, + { 3, 0, 0, -32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks199[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -64, 0, 0, 0, 15, 0 }, + { 3, -96, 0, 0, 0, 15, 0 }, + { 4, -128, 0, 0, 0, 15, 0 }, + { 5, -160, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks200[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -64, 0, 0, 0, 15, 0 }, + { 3, -96, 0, 0, 0, 15, 0 }, + { 4, -128, 0, 0, 0, 15, 0 }, + { 5, -160, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks201[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks202[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks203[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks204[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks205[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks206[] = { + { 0, 0, 0, 0, 16, 15, 4 }, + { 1, -32, 0, -40, 32, 15, 4 }, + { 2, -64, 0, -96, 56, 15, 4 }, + { 3, -96, 0, -96, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 0, 0 } +}; + +static const rct_preview_track TrackBlocks207[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 1, 32, 0, 56, 32, 15, 4 }, + { 2, 64, 0, 96, 16, 15, 4 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track TrackBlocks208[] = { + { 0, 0, 0, -32, 16, 15, 4 }, + { 1, -32, 0, -72, 32, 15, 4 }, + { 2, -64, 0, -128, 56, 15, 4 }, + { 3, -96, 0, -128, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track TrackBlocks209[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 8, 2, 0 }, + { 3, -32, -32, 0, 8, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track TrackBlocks210[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 0 }, + { 3, -32, 32, 0, 8, 11, 0 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track TrackBlocks211[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 15, 0 }, + { 3, -64, -32, 0, 0, 15, 0 }, + { 4, -32, 0, 0, 0, 15, 0 }, + { 5, -64, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks212[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 15, 0 }, + { 3, -64, 32, 0, 0, 15, 0 }, + { 4, -32, 0, 0, 0, 15, 0 }, + { 5, -64, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 15 } +}; + +static const rct_preview_track TrackBlocks213[] = { + { 0, 0, 0, 0, 32, 15, 0 }, + { 1, 32, 0, 0, 32, 15, 0 }, + { 2, -64, 0, 0, 32, 15, 0 }, + { 3, -32, 0, 0, 32, 15, 0 }, + { 255, 0, 0, 0, 0, 48, 15 } +}; + +static const rct_preview_track TrackBlocks214[] = { + { 0, 0, 0, 0, 48, 15, 0 }, + { 1, 32, 0, 0, 48, 15, 0 }, + { 255, 0, 0, 0, 0, 208, 15 } +}; + +static const rct_preview_track TrackBlocks215[] = { + { 0, 0, 0, 0, 208, 15, 0 }, + { 1, 32, 0, 0, 208, 15, 0 }, + { 2, -32, 0, 0, 160, 15, 0 }, + { 3, -64, 0, 0, 80, 15, 0 }, + { 4, -96, 0, 0, 48, 15, 0 }, + { 5, -128, 0, 0, 32, 15, 0 }, + { 6, -160, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track TrackBlocks216[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks217[] = { + { 0, 0, 0, 0, 16, 71, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 16, 16, 103, 0 }, + { 255, 0, 0, 0, 0, 16, 139 } +}; + +static const rct_preview_track TrackBlocks218[] = { + { 0, 0, 0, 0, 16, 139, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 16, 16, 155, 0 }, + { 255, 0, 0, 4096, 0, 16, 55 } +}; + +static const rct_preview_track TrackBlocks219[] = { + { 0, 0, 0, 16, 16, 55, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 0, 16, 23, 0 }, + { 255, 0, 0, 4096, 0, 16, 59 } +}; + +static const rct_preview_track TrackBlocks220[] = { + { 0, 0, 0, 16, 16, 59, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 0, 16, 43, 0 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track TrackBlocks221[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 16, 71, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 48, 0, 8, 1 }, + { 5, -64, -32, 32, 16, 71, 0 }, + { 6, -64, -64, 48, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks222[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 16, 139, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 48, 0, 4, 1 }, + { 5, -64, 32, 32, 16, 139, 0 }, + { 6, -64, 64, 48, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track TrackBlocks223[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, -32, 48, 0, 8, 1 }, + { 2, -32, 0, 32, 16, 23, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 16, 0, 8, 1 }, + { 5, -64, -32, 16, 16, 23, 0 }, + { 6, -64, -64, 0, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track TrackBlocks224[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, 32, 48, 0, 4, 1 }, + { 2, -32, 0, 32, 16, 43, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 16, 0, 4, 1 }, + { 5, -64, 32, 16, 16, 43, 0 }, + { 6, -64, 64, 0, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks225[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks226[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks227[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks228[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks229[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks230[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks231[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks232[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks233[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks234[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks235[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks236[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks237[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks238[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks239[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks240[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks241[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks242[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks243[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks244[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks245[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks246[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks247[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks248[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks249[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, 32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track TrackBlocks250[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, -32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track TrackBlocks251[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, 32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track TrackBlocks252[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, -32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track TrackBlocks253[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 1, 32, 0, 56, 32, 15, 4 }, + { 2, 64, 0, 96, 16, 15, 4 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track TrackBlocks254[] = { + { 0, 0, 0, -32, 16, 15, 4 }, + { 1, -32, 0, -72, 32, 15, 4 }, + { 2, -64, 0, -128, 56, 15, 4 }, + { 3, -96, 0, -128, 0, 0, 5 }, + { 255, 0, 0, 8192, 0, 56, 15 } +}; + +static const rct_preview_track TrackBlocks255[] = { + { 0, 0, 0, 32, 56, 15, 4 }, + { 1, 32, 0, 88, 32, 15, 4 }, + { 2, 64, 0, 128, 16, 15, 4 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +// rct2: 0x00994638 +const rct_preview_track *TrackBlocks[256] = { + TrackBlocks000, + TrackBlocks001, + TrackBlocks002, + TrackBlocks003, + TrackBlocks004, + TrackBlocks005, + TrackBlocks006, + TrackBlocks007, + TrackBlocks008, + TrackBlocks009, + TrackBlocks010, + TrackBlocks011, + TrackBlocks012, + TrackBlocks013, + TrackBlocks014, + TrackBlocks015, + TrackBlocks016, + TrackBlocks017, + TrackBlocks018, + TrackBlocks019, + TrackBlocks020, + TrackBlocks021, + TrackBlocks022, + TrackBlocks023, + TrackBlocks024, + TrackBlocks025, + TrackBlocks026, + TrackBlocks027, + TrackBlocks028, + TrackBlocks029, + TrackBlocks030, + TrackBlocks031, + TrackBlocks032, + TrackBlocks033, + TrackBlocks034, + TrackBlocks035, + TrackBlocks036, + TrackBlocks037, + TrackBlocks038, + TrackBlocks039, + TrackBlocks040, + TrackBlocks041, + TrackBlocks042, + TrackBlocks043, + TrackBlocks044, + TrackBlocks045, + TrackBlocks046, + TrackBlocks047, + TrackBlocks048, + TrackBlocks049, + TrackBlocks050, + TrackBlocks051, + TrackBlocks052, + TrackBlocks053, + TrackBlocks054, + TrackBlocks055, + TrackBlocks056, + TrackBlocks057, + TrackBlocks058, + TrackBlocks059, + TrackBlocks060, + TrackBlocks061, + TrackBlocks062, + TrackBlocks063, + TrackBlocks064, + TrackBlocks065, + TrackBlocks066, + TrackBlocks067, + TrackBlocks068, + TrackBlocks069, + TrackBlocks070, + TrackBlocks071, + TrackBlocks072, + TrackBlocks073, + TrackBlocks074, + TrackBlocks075, + TrackBlocks076, + TrackBlocks077, + TrackBlocks078, + TrackBlocks079, + TrackBlocks080, + TrackBlocks081, + TrackBlocks082, + TrackBlocks083, + TrackBlocks084, + TrackBlocks085, + TrackBlocks086, + TrackBlocks087, + TrackBlocks088, + TrackBlocks089, + TrackBlocks090, + TrackBlocks091, + TrackBlocks092, + TrackBlocks093, + TrackBlocks094, + TrackBlocks095, + TrackBlocks096, + TrackBlocks097, + TrackBlocks098, + TrackBlocks099, + TrackBlocks100, + TrackBlocks101, + TrackBlocks102, + TrackBlocks103, + TrackBlocks104, + TrackBlocks105, + TrackBlocks106, + TrackBlocks107, + TrackBlocks108, + TrackBlocks109, + TrackBlocks110, + TrackBlocks111, + TrackBlocks112, + TrackBlocks113, + TrackBlocks114, + TrackBlocks115, + TrackBlocks116, + TrackBlocks117, + TrackBlocks118, + TrackBlocks119, + TrackBlocks120, + TrackBlocks121, + TrackBlocks122, + TrackBlocks123, + TrackBlocks124, + TrackBlocks125, + TrackBlocks126, + TrackBlocks127, + TrackBlocks128, + TrackBlocks129, + TrackBlocks130, + TrackBlocks131, + TrackBlocks132, + TrackBlocks133, + TrackBlocks134, + TrackBlocks135, + TrackBlocks136, + TrackBlocks137, + TrackBlocks138, + TrackBlocks139, + TrackBlocks140, + TrackBlocks141, + TrackBlocks142, + TrackBlocks143, + TrackBlocks144, + TrackBlocks145, + TrackBlocks146, + TrackBlocks147, + TrackBlocks148, + TrackBlocks149, + TrackBlocks150, + TrackBlocks151, + TrackBlocks152, + TrackBlocks153, + TrackBlocks154, + TrackBlocks155, + TrackBlocks156, + TrackBlocks157, + TrackBlocks158, + TrackBlocks159, + TrackBlocks160, + TrackBlocks161, + TrackBlocks162, + TrackBlocks163, + TrackBlocks164, + TrackBlocks165, + TrackBlocks166, + TrackBlocks167, + TrackBlocks168, + TrackBlocks169, + TrackBlocks170, + TrackBlocks171, + TrackBlocks172, + TrackBlocks173, + TrackBlocks174, + TrackBlocks175, + TrackBlocks176, + TrackBlocks177, + TrackBlocks178, + TrackBlocks179, + TrackBlocks180, + TrackBlocks181, + TrackBlocks182, + TrackBlocks183, + TrackBlocks184, + TrackBlocks185, + TrackBlocks186, + TrackBlocks187, + TrackBlocks188, + TrackBlocks189, + TrackBlocks190, + TrackBlocks191, + TrackBlocks192, + TrackBlocks193, + TrackBlocks194, + TrackBlocks195, + TrackBlocks196, + TrackBlocks197, + TrackBlocks198, + TrackBlocks199, + TrackBlocks200, + TrackBlocks201, + TrackBlocks202, + TrackBlocks203, + TrackBlocks204, + TrackBlocks205, + TrackBlocks206, + TrackBlocks207, + TrackBlocks208, + TrackBlocks209, + TrackBlocks210, + TrackBlocks211, + TrackBlocks212, + TrackBlocks213, + TrackBlocks214, + TrackBlocks215, + TrackBlocks216, + TrackBlocks217, + TrackBlocks218, + TrackBlocks219, + TrackBlocks220, + TrackBlocks221, + TrackBlocks222, + TrackBlocks223, + TrackBlocks224, + TrackBlocks225, + TrackBlocks226, + TrackBlocks227, + TrackBlocks228, + TrackBlocks229, + TrackBlocks230, + TrackBlocks231, + TrackBlocks232, + TrackBlocks233, + TrackBlocks234, + TrackBlocks235, + TrackBlocks236, + TrackBlocks237, + TrackBlocks238, + TrackBlocks239, + TrackBlocks240, + TrackBlocks241, + TrackBlocks242, + TrackBlocks243, + TrackBlocks244, + TrackBlocks245, + TrackBlocks246, + TrackBlocks247, + TrackBlocks248, + TrackBlocks249, + TrackBlocks250, + TrackBlocks251, + TrackBlocks252, + TrackBlocks253, + TrackBlocks254, + TrackBlocks255 +}; + +static const rct_preview_track FlatRideTrackBlocks000[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks001[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks002[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks003[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks004[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks005[] = { + { 0, 0, 0, 0, 64, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks006[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks007[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks008[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks009[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks010[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks011[] = { + { 0, 0, 0, 0, 64, 63, 0 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks012[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks013[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks014[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks015[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks016[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks017[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks018[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks019[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks020[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks021[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks022[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks023[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks024[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks025[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks026[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks027[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks028[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks029[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks030[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks031[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks032[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks033[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks034[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 16, 71, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 48, 0, 8, 1 }, + { 5, -64, -32, 32, 16, 71, 0 }, + { 6, -64, -64, 48, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks035[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 16, 139, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 48, 0, 4, 1 }, + { 5, -64, 32, 32, 16, 139, 0 }, + { 6, -64, 64, 48, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks036[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, -32, 48, 0, 8, 1 }, + { 2, -32, 0, 32, 16, 23, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 16, 0, 8, 1 }, + { 5, -64, -32, 16, 16, 23, 0 }, + { 6, -64, -64, 0, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks037[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, 32, 48, 0, 4, 1 }, + { 2, -32, 0, 32, 16, 43, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 16, 0, 4, 1 }, + { 5, -64, 32, 16, 16, 43, 0 }, + { 6, -64, 64, 0, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks038[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 7, 0 }, + { 2, -32, -32, 0, 0, 13, 0 }, + { 3, -64, -32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks039[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 11, 0 }, + { 2, -32, 32, 0, 0, 14, 0 }, + { 3, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks040[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 2, 0 }, + { 3, -32, 0, 120, 16, 6, 0 }, + { 4, -32, -32, 120, 0, 0, 0 }, + { 5, 0, 0, 120, 0, 0, 0 }, + { 6, 0, -32, 120, 16, 9, 0 }, + { 7, 32, -32, 32, 96, 8, 0 }, + { 8, 0, -32, 16, 16, 63, 0 }, + { 9, -32, -32, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks041[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 1, 0 }, + { 3, -32, 0, 120, 16, 9, 0 }, + { 4, -32, 32, 120, 0, 0, 0 }, + { 5, 0, 0, 120, 0, 0, 0 }, + { 6, 0, 32, 120, 16, 6, 0 }, + { 7, 32, 32, 32, 96, 4, 0 }, + { 8, 0, 32, 16, 16, 63, 0 }, + { 9, -32, 32, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track FlatRideTrackBlocks042[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 2, 0 }, + { 3, -32, -32, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track FlatRideTrackBlocks043[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 0 }, + { 3, -32, 32, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 16, 71 } +}; + +static const rct_preview_track FlatRideTrackBlocks044[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 2, 0 }, + { 3, -32, -32, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track FlatRideTrackBlocks045[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 0 }, + { 3, -32, 32, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 16, 71 } +}; + +static const rct_preview_track FlatRideTrackBlocks046[] = { + { 0, 0, 0, 0, 16, 71, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 16, 16, 103, 0 }, + { 255, 0, 0, 0, 0, 16, 139 } +}; + +static const rct_preview_track FlatRideTrackBlocks047[] = { + { 0, 0, 0, 0, 16, 139, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 16, 16, 155, 0 }, + { 255, 0, 0, 4096, 0, 16, 55 } +}; + +static const rct_preview_track FlatRideTrackBlocks048[] = { + { 0, 0, 0, 16, 16, 55, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 0, 16, 23, 0 }, + { 255, 0, 0, 4096, 0, 16, 59 } +}; + +static const rct_preview_track FlatRideTrackBlocks049[] = { + { 0, 0, 0, 16, 16, 59, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 0, 16, 43, 0 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track FlatRideTrackBlocks050[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track FlatRideTrackBlocks051[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks052[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks053[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks054[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks055[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks056[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 3, 0 }, + { 3, -32, 0, 120, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 32, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks057[] = { + { 0, 0, 0, -32, 32, 15, 0 }, + { 1, -32, 0, -120, 96, 3, 0 }, + { 2, 0, 0, -136, 16, 207, 0 }, + { 3, 32, 0, -152, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks058[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 7, 0 }, + { 2, -32, -32, 48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks059[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 11, 0 }, + { 2, -32, 32, 48, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks060[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -56, 32, 7, 0 }, + { 2, -32, -32, -80, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks061[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -56, 32, 11, 0 }, + { 2, -32, 32, -80, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 24, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks062[] = { + { 0, 0, 0, 0, 24, 15, 0 }, + { 255, 0, 0, 0, 0, 24, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks063[] = { + { 0, 0, 0, 0, 24, 207, 0 }, + { 255, 0, 0, 0, 0, 24, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks064[] = { + { 0, 0, 0, 0, 24, 63, 0 }, + { 255, 0, 0, 0, 0, 24, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks065[] = { + { 0, 0, 0, 0, 24, 15, 0 }, + { 255, 0, 0, 0, 0, 64, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks066[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 1, -32, -32, 0, 0, 15, 0 }, + { 2, -32, 0, 0, 0, 15, 0 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, 0, -32, 0, 0, 15, 0 }, + { 5, 0, 32, 0, 0, 15, 0 }, + { 6, 32, -32, 0, 0, 15, 0 }, + { 7, 32, 32, 0, 0, 15, 0 }, + { 8, 32, 0, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks067[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 32, 0, 0, 0, 0, 3 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track FlatRideTrackBlocks068[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks069[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks070[] = { + { 0, 0, 0, 0, 64, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks071[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks072[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks073[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks074[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks075[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks076[] = { + { 0, 0, 0, 0, 64, 63, 0 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks077[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks078[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks079[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks080[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks081[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks082[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks083[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 7, 0 }, + { 2, -32, -32, 0, 0, 13, 0 }, + { 3, -64, -32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks084[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 11, 0 }, + { 2, -32, 32, 0, 0, 14, 0 }, + { 3, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks085[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 2, 0 }, + { 3, -32, -32, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track FlatRideTrackBlocks086[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 0 }, + { 3, -32, 32, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 16, 71 } +}; + +static const rct_preview_track FlatRideTrackBlocks087[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 4, 2, 0 }, + { 3, -32, -32, 0, 4, 7, 0 }, + { 4, -32, -64, 8, 0, 11, 0 }, + { 5, 0, -64, 8, 0, 4, 1 }, + { 6, -32, -96, 8, 4, 1, 0 }, + { 7, 0, -96, 8, 4, 11, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track FlatRideTrackBlocks088[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 4, 1, 0 }, + { 3, -32, 32, 0, 4, 11, 0 }, + { 4, -32, 64, 8, 0, 7, 0 }, + { 5, 0, 64, 8, 0, 8, 1 }, + { 6, -32, 96, 8, 4, 2, 0 }, + { 7, 0, 96, 8, 4, 7, 0 }, + { 255, 0, 0, 2048, 0, 4, 7 } +}; + +static const rct_preview_track FlatRideTrackBlocks089[] = { + { 0, 0, 0, 8, 4, 7, 0 }, + { 1, 0, -32, 8, 4, 8, 1 }, + { 2, -32, 0, 8, 0, 2, 0 }, + { 3, -32, -32, 8, 0, 7, 0 }, + { 4, -32, -64, 0, 4, 11, 0 }, + { 5, 0, -64, 0, 4, 4, 1 }, + { 6, -32, -96, 0, 0, 1, 0 }, + { 7, 0, -96, 0, 0, 11, 0 }, + { 255, 0, 0, 2048, 0, 4, 11 } +}; + +static const rct_preview_track FlatRideTrackBlocks090[] = { + { 0, 0, 0, 8, 4, 11, 0 }, + { 1, 0, 32, 8, 4, 4, 1 }, + { 2, -32, 0, 8, 0, 1, 0 }, + { 3, -32, 32, 8, 0, 11, 0 }, + { 4, -32, 64, 0, 4, 7, 0 }, + { 5, 0, 64, 0, 4, 8, 1 }, + { 6, -32, 96, 0, 0, 2, 0 }, + { 7, 0, 96, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks091[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 4, 8, 1 }, + { 5, -64, -32, 0, 4, 7, 0 }, + { 6, -64, -64, 0, 4, 15, 0 }, + { 7, -64, -96, 8, 0, 15, 0 }, + { 8, -32, -96, 8, 0, 4, 1 }, + { 9, -64, -128, 8, 0, 11, 0 }, + { 10, -32, -128, 8, 0, 14, 0 }, + { 11, 0, -128, 8, 4, 4, 1 }, + { 12, -32, -160, 8, 4, 11, 0 }, + { 13, 0, -160, 8, 4, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks092[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 4, 4, 1 }, + { 5, -64, 32, 0, 4, 11, 0 }, + { 6, -64, 64, 0, 4, 15, 0 }, + { 7, -64, 96, 8, 0, 15, 0 }, + { 8, -32, 96, 8, 0, 8, 1 }, + { 9, -64, 128, 8, 0, 7, 0 }, + { 10, -32, 128, 8, 0, 13, 0 }, + { 11, 0, 128, 8, 4, 8, 1 }, + { 12, -32, 160, 8, 4, 7, 0 }, + { 13, 0, 160, 8, 4, 15, 0 }, + { 255, 0, 0, 2048, 0, 4, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks093[] = { + { 0, 0, 0, 8, 4, 15, 0 }, + { 1, 0, -32, 8, 4, 8, 1 }, + { 2, -32, 0, 8, 4, 7, 0 }, + { 3, -32, -32, 8, 0, 13, 0 }, + { 4, -32, -64, 8, 0, 8, 1 }, + { 5, -64, -32, 8, 0, 7, 0 }, + { 6, -64, -64, 8, 0, 15, 0 }, + { 7, -64, -96, 0, 4, 15, 0 }, + { 8, -32, -96, 0, 4, 4, 1 }, + { 9, -64, -128, 0, 4, 11, 0 }, + { 10, -32, -128, 0, 0, 14, 0 }, + { 11, 0, -128, 0, 0, 4, 1 }, + { 12, -32, -160, 0, 0, 11, 0 }, + { 13, 0, -160, 0, 0, 15, 0 }, + { 255, 0, 0, 2048, 0, 4, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks094[] = { + { 0, 0, 0, 8, 4, 15, 0 }, + { 1, 0, 32, 8, 4, 4, 1 }, + { 2, -32, 0, 8, 4, 11, 0 }, + { 3, -32, 32, 8, 0, 14, 0 }, + { 4, -32, 64, 8, 0, 4, 1 }, + { 5, -64, 32, 8, 0, 11, 0 }, + { 6, -64, 64, 8, 0, 15, 0 }, + { 7, -64, 96, 0, 4, 15, 0 }, + { 8, -32, 96, 0, 4, 8, 1 }, + { 9, -64, 128, 0, 4, 7, 0 }, + { 10, -32, 128, 0, 0, 13, 0 }, + { 11, 0, 128, 0, 0, 8, 1 }, + { 12, -32, 160, 0, 0, 7, 0 }, + { 13, 0, 160, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 64, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks095[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -64, 0, 0, 0, 15, 0 }, + { 2, -32, 0, 0, 0, 15, 0 }, + { 3, 32, 0, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks096[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks097[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks098[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks099[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks100[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks101[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks102[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 12, 8, 1 }, + { 5, -64, -32, 0, 12, 7, 0 }, + { 6, -64, -64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks103[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 12, 4, 1 }, + { 5, -64, 32, 0, 12, 11, 0 }, + { 6, -64, 64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks104[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, -32, 0, 12, 8, 1 }, + { 2, -32, 0, 0, 12, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks105[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, 32, 0, 12, 4, 1 }, + { 2, -32, 0, 0, 12, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks106[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 12, 8, 1 }, + { 5, -64, -32, 0, 12, 7, 0 }, + { 6, -64, -64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks107[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 12, 4, 1 }, + { 5, -64, 32, 0, 12, 11, 0 }, + { 6, -64, 64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks108[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, -32, 0, 12, 8, 1 }, + { 2, -32, 0, 0, 12, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks109[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, 32, 0, 12, 4, 1 }, + { 2, -32, 0, 0, 12, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks110[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 15, 0 }, + { 2, 32, 0, 0, 0, 15, 0 }, + { 3, 32, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks111[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 15, 0 }, + { 2, 0, 64, 0, 0, 15, 0 }, + { 3, 0, 96, 0, 0, 15, 0 }, + { 4, 32, 0, 0, 0, 15, 0 }, + { 5, 32, 32, 0, 0, 15, 0 }, + { 6, 32, 64, 0, 0, 15, 0 }, + { 7, 32, 96, 0, 0, 15, 0 }, + { 8, 64, 0, 0, 0, 15, 0 }, + { 9, 64, 32, 0, 0, 15, 0 }, + { 10, 64, 64, 0, 0, 15, 0 }, + { 11, 64, 96, 0, 0, 15, 0 }, + { 12, 96, 0, 0, 0, 15, 0 }, + { 13, 96, 32, 0, 0, 15, 0 }, + { 14, 96, 64, 0, 0, 15, 0 }, + { 15, 96, 96, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks112[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks113[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks114[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks115[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 15, 0 }, + { 2, 0, 64, 0, 0, 15, 0 }, + { 3, 0, 96, 0, 0, 15, 0 }, + { 4, 32, 0, 0, 0, 15, 0 }, + { 5, 32, 32, 0, 0, 15, 0 }, + { 6, 32, 64, 0, 0, 15, 0 }, + { 7, 32, 96, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks116[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -64, 0, 0, 0, 15, 0 }, + { 2, -32, 0, 0, 0, 15, 0 }, + { 3, 32, 0, 0, 0, 15, 0 }, + { 4, 64, 0, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks117[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 0, 16, 15, 0 }, + { 3, -96, 0, 0, 16, 15, 0 }, + { 4, -128, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks118[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks119[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -64, 0, 0, 0, 15, 0 }, + { 2, -32, 0, 0, 0, 15, 0 }, + { 3, 32, 0, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks120[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks121[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks122[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -64, 0, 0, 0, 15, 0 }, + { 2, -32, 0, 0, 0, 15, 0 }, + { 3, 32, 0, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks123[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, -32, 0, 0, 15, 0 }, + { 2, -32, 0, 0, 0, 15, 0 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, 0, -32, 0, 0, 15, 0 }, + { 5, 0, 32, 0, 0, 15, 0 }, + { 6, 32, -32, 0, 0, 15, 0 }, + { 7, 32, 32, 0, 0, 15, 0 }, + { 8, 32, 0, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks124[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 32, 15, 0 }, + { 2, -64, 0, 0, 48, 15, 0 }, + { 3, -96, 0, 0, 80, 15, 0 }, + { 4, -128, 0, 0, 160, 15, 0 }, + { 5, -192, 0, 0, 208, 15, 0 }, + { 6, -160, 0, 0, 208, 15, 0 }, + { 255, 0, 0, 0, 0, 48, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks125[] = { + { 0, 0, 0, 0, 48, 15, 0 }, + { 1, 32, 0, 0, 48, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks126[] = { + { 0, 0, 0, 0, 8, 15, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks127[] = { + { 0, 0, 0, 0, 8, 15, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks128[] = { + { 0, 0, 0, 0, 32, 207, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks129[] = { + { 0, 0, 0, 0, 32, 63, 4 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks130[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks131[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks132[] = { + { 0, 0, 0, 0, 24, 63, 0 }, + { 255, 0, 0, 0, 0, 24, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks133[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 8, 0 }, + { 3, -64, 0, 0, 0, 2, 1 }, + { 4, -64, -32, 0, 0, 1, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks134[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 4, 0 }, + { 3, -64, 0, 0, 0, 1, 1 }, + { 4, -64, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks135[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, -32, 0, 0, 0, 1, 0 }, + { 2, 0, 32, 0, 0, 4, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks136[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 0 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -32, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks137[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 8, 0 }, + { 3, -64, 0, 0, 0, 2, 1 }, + { 4, -64, -32, 0, 0, 1, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks138[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 4, 0 }, + { 3, -64, 0, 0, 0, 1, 1 }, + { 4, -64, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks139[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, -32, 0, 0, 0, 1, 0 }, + { 2, 0, 32, 0, 0, 4, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks140[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 0 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -32, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks141[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks142[] = { + { 0, 0, 0, 0, 16, 13, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 1 }, + { 3, -32, 32, 0, 16, 2, 0 }, + { 255, 0, 0, 0, 0, 64, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks143[] = { + { 0, 0, 0, 0, 64, 13, 0 }, + { 1, 0, 32, 0, 64, 4, 1 }, + { 2, -32, 0, 0, 64, 1, 1 }, + { 3, -32, 32, 0, 64, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks144[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks145[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks146[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks147[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks148[] = { + { 0, 0, 0, 0, 16, 13, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 1 }, + { 3, -32, 32, 0, 16, 2, 0 }, + { 255, 0, 0, 0, 0, 64, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks149[] = { + { 0, 0, 0, 0, 64, 13, 0 }, + { 1, 0, 32, 0, 64, 4, 1 }, + { 2, -32, 0, 0, 64, 1, 1 }, + { 3, -32, 32, 0, 64, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks150[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks151[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks152[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks153[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks154[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks155[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks156[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks157[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks158[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks159[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks160[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks161[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks162[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks163[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks164[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks165[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks166[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks167[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks168[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks169[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks170[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks171[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks172[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks173[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks174[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 0, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks175[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 0, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks176[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -32, 16, 15, 0 }, + { 2, -64, 0, -32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 71 } +}; + +static const rct_preview_track FlatRideTrackBlocks177[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -32, 16, 15, 0 }, + { 2, -64, 0, -32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 71 } +}; + +static const rct_preview_track FlatRideTrackBlocks178[] = { + { 0, 0, 0, 0, 0, 71, 0 }, + { 1, 0, -32, 0, 16, 8, 1 }, + { 2, -32, 0, 0, 16, 2, 0 }, + { 3, -32, -32, 16, 16, 103, 0 }, + { 255, 0, 0, 0, 0, 16, 139 } +}; + +static const rct_preview_track FlatRideTrackBlocks179[] = { + { 0, 0, 0, 0, 16, 139, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 0 }, + { 3, -32, 32, 16, 16, 155, 0 }, + { 255, 0, 0, 4096, 0, 16, 55 } +}; + +static const rct_preview_track FlatRideTrackBlocks180[] = { + { 0, 0, 0, 16, 16, 55, 0 }, + { 1, 0, -32, 0, 16, 8, 1 }, + { 2, -32, 0, 0, 16, 2, 0 }, + { 3, -32, -32, 0, 0, 23, 0 }, + { 255, 0, 0, 4096, 0, 16, 59 } +}; + +static const rct_preview_track FlatRideTrackBlocks181[] = { + { 0, 0, 0, 16, 16, 59, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 0 }, + { 3, -32, 32, 0, 0, 43, 0 }, + { 255, 0, 0, 0, 0, 24, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks182[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks183[] = { + { 0, 0, 0, 0, 24, 207, 0 }, + { 1, -32, 0, 16, 40, 207, 0 }, + { 2, -64, 0, 32, 56, 15, 0 }, + { 3, -96, 0, 64, 192, 15, 0 }, + { 4, -128, -32, 120, 96, 15, 0 }, + { 5, -96, -32, 64, 192, 15, 0 }, + { 6, -64, -32, 248, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 24, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks184[] = { + { 0, 0, 0, 0, 24, 207, 0 }, + { 1, -32, 0, 16, 40, 207, 0 }, + { 2, -64, 0, 32, 56, 15, 0 }, + { 3, -96, 0, 64, 192, 15, 0 }, + { 4, -128, 32, 120, 96, 15, 0 }, + { 5, -96, 32, 64, 192, 15, 0 }, + { 6, -64, 32, 248, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 24, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks185[] = { + { 0, 0, 0, -32, 24, 15, 0 }, + { 1, -32, 0, -216, 192, 15, 0 }, + { 2, -64, 0, -160, 96, 15, 0 }, + { 3, -32, -32, -216, 192, 15, 0 }, + { 4, 0, -32, -248, 56, 15, 0 }, + { 5, 32, -32, -264, 40, 207, 0 }, + { 6, 64, -32, -280, 24, 207, 0 }, + { 255, 0, 0, -8192, 255, 24, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks186[] = { + { 0, 0, 0, -32, 24, 15, 0 }, + { 1, -32, 0, -216, 192, 15, 0 }, + { 2, -64, 0, -160, 96, 15, 0 }, + { 3, -32, 32, -216, 192, 15, 0 }, + { 4, 0, 32, -248, 56, 15, 0 }, + { 5, 32, 32, -264, 40, 207, 0 }, + { 6, 64, 32, -280, 24, 207, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks187[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks188[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks189[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks190[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks191[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 3, 0 }, + { 3, -32, 0, 120, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks192[] = { + { 0, 0, 0, 0, 32, 15, 0 }, + { 1, -32, 0, -88, 96, 3, 0 }, + { 2, 0, 0, -104, 16, 207, 0 }, + { 3, 32, 0, -120, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks193[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 7, 0 }, + { 2, -32, -32, 48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks194[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 11, 0 }, + { 2, -32, 32, 48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks195[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, -24, 32, 7, 0 }, + { 2, -32, -32, -48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks196[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, -24, 32, 11, 0 }, + { 2, -32, 32, -48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks197[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 32, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 3, 0, 0, 32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks198[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -32, 32, 15, 0 }, + { 2, -64, 0, -16, 0, 15, 0 }, + { 3, 0, 0, -32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks199[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -64, 0, 0, 0, 15, 0 }, + { 3, -96, 0, 0, 0, 15, 0 }, + { 4, -128, 0, 0, 0, 15, 0 }, + { 5, -160, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks200[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -64, 0, 0, 0, 15, 0 }, + { 3, -96, 0, 0, 0, 15, 0 }, + { 4, -128, 0, 0, 0, 15, 0 }, + { 5, -160, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks201[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks202[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks203[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks204[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks205[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks206[] = { + { 0, 0, 0, 0, 16, 15, 4 }, + { 1, -32, 0, -40, 32, 15, 4 }, + { 2, -64, 0, -96, 56, 15, 4 }, + { 3, -96, 0, -96, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 0, 0 } +}; + +static const rct_preview_track FlatRideTrackBlocks207[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 1, 32, 0, 56, 32, 15, 4 }, + { 2, 64, 0, 96, 16, 15, 4 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks208[] = { + { 0, 0, 0, -32, 16, 15, 4 }, + { 1, -32, 0, -72, 32, 15, 4 }, + { 2, -64, 0, -128, 56, 15, 4 }, + { 3, -96, 0, -128, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks209[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 8, 2, 0 }, + { 3, -32, -32, 0, 8, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track FlatRideTrackBlocks210[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 0 }, + { 3, -32, 32, 0, 8, 11, 0 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks211[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 15, 0 }, + { 3, -64, -32, 0, 0, 15, 0 }, + { 4, -32, 0, 0, 0, 15, 0 }, + { 5, -64, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks212[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 15, 0 }, + { 3, -64, 32, 0, 0, 15, 0 }, + { 4, -32, 0, 0, 0, 15, 0 }, + { 5, -64, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks213[] = { + { 0, 0, 0, 0, 32, 15, 0 }, + { 1, 32, 0, 0, 32, 15, 0 }, + { 2, -64, 0, 0, 32, 15, 0 }, + { 3, -32, 0, 0, 32, 15, 0 }, + { 255, 0, 0, 0, 0, 48, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks214[] = { + { 0, 0, 0, 0, 48, 15, 0 }, + { 1, 32, 0, 0, 48, 15, 0 }, + { 255, 0, 0, 0, 0, 208, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks215[] = { + { 0, 0, 0, 0, 208, 15, 0 }, + { 1, 32, 0, 0, 208, 15, 0 }, + { 2, -32, 0, 0, 160, 15, 0 }, + { 3, -64, 0, 0, 80, 15, 0 }, + { 4, -96, 0, 0, 48, 15, 0 }, + { 5, -128, 0, 0, 32, 15, 0 }, + { 6, -160, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks216[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks217[] = { + { 0, 0, 0, 0, 16, 71, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 16, 16, 103, 0 }, + { 255, 0, 0, 0, 0, 16, 139 } +}; + +static const rct_preview_track FlatRideTrackBlocks218[] = { + { 0, 0, 0, 0, 16, 139, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 16, 16, 155, 0 }, + { 255, 0, 0, 4096, 0, 16, 55 } +}; + +static const rct_preview_track FlatRideTrackBlocks219[] = { + { 0, 0, 0, 16, 16, 55, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 0, 16, 23, 0 }, + { 255, 0, 0, 4096, 0, 16, 59 } +}; + +static const rct_preview_track FlatRideTrackBlocks220[] = { + { 0, 0, 0, 16, 16, 59, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 0, 16, 43, 0 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track FlatRideTrackBlocks221[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 16, 71, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 48, 0, 8, 1 }, + { 5, -64, -32, 32, 16, 71, 0 }, + { 6, -64, -64, 48, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks222[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 16, 139, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 48, 0, 4, 1 }, + { 5, -64, 32, 32, 16, 139, 0 }, + { 6, -64, 64, 48, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks223[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, -32, 48, 0, 8, 1 }, + { 2, -32, 0, 32, 16, 23, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 16, 0, 8, 1 }, + { 5, -64, -32, 16, 16, 23, 0 }, + { 6, -64, -64, 0, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks224[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, 32, 48, 0, 4, 1 }, + { 2, -32, 0, 32, 16, 43, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 16, 0, 4, 1 }, + { 5, -64, 32, 16, 16, 43, 0 }, + { 6, -64, 64, 0, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks225[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks226[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks227[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks228[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks229[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks230[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks231[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks232[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks233[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks234[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks235[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks236[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks237[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks238[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks239[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks240[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks241[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks242[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks243[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks244[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks245[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks246[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks247[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks248[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks249[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, 32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks250[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, -32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks251[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, 32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks252[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, -32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks253[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 1, 32, 0, 56, 32, 15, 4 }, + { 2, 64, 0, 96, 16, 15, 4 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks254[] = { + { 0, 0, 0, -32, 16, 15, 4 }, + { 1, -32, 0, -72, 32, 15, 4 }, + { 2, -64, 0, -128, 56, 15, 4 }, + { 3, -96, 0, -128, 0, 0, 5 }, + { 255, 0, 0, 8192, 0, 56, 15 } +}; + +// rct2: 0x00994A38 +const rct_preview_track *FlatRideTrackBlocks[255] = { + FlatRideTrackBlocks000, + FlatRideTrackBlocks001, + FlatRideTrackBlocks002, + FlatRideTrackBlocks003, + FlatRideTrackBlocks004, + FlatRideTrackBlocks005, + FlatRideTrackBlocks006, + FlatRideTrackBlocks007, + FlatRideTrackBlocks008, + FlatRideTrackBlocks009, + FlatRideTrackBlocks010, + FlatRideTrackBlocks011, + FlatRideTrackBlocks012, + FlatRideTrackBlocks013, + FlatRideTrackBlocks014, + FlatRideTrackBlocks015, + FlatRideTrackBlocks016, + FlatRideTrackBlocks017, + FlatRideTrackBlocks018, + FlatRideTrackBlocks019, + FlatRideTrackBlocks020, + FlatRideTrackBlocks021, + FlatRideTrackBlocks022, + FlatRideTrackBlocks023, + FlatRideTrackBlocks024, + FlatRideTrackBlocks025, + FlatRideTrackBlocks026, + FlatRideTrackBlocks027, + FlatRideTrackBlocks028, + FlatRideTrackBlocks029, + FlatRideTrackBlocks030, + FlatRideTrackBlocks031, + FlatRideTrackBlocks032, + FlatRideTrackBlocks033, + FlatRideTrackBlocks034, + FlatRideTrackBlocks035, + FlatRideTrackBlocks036, + FlatRideTrackBlocks037, + FlatRideTrackBlocks038, + FlatRideTrackBlocks039, + FlatRideTrackBlocks040, + FlatRideTrackBlocks041, + FlatRideTrackBlocks042, + FlatRideTrackBlocks043, + FlatRideTrackBlocks044, + FlatRideTrackBlocks045, + FlatRideTrackBlocks046, + FlatRideTrackBlocks047, + FlatRideTrackBlocks048, + FlatRideTrackBlocks049, + FlatRideTrackBlocks050, + FlatRideTrackBlocks051, + FlatRideTrackBlocks052, + FlatRideTrackBlocks053, + FlatRideTrackBlocks054, + FlatRideTrackBlocks055, + FlatRideTrackBlocks056, + FlatRideTrackBlocks057, + FlatRideTrackBlocks058, + FlatRideTrackBlocks059, + FlatRideTrackBlocks060, + FlatRideTrackBlocks061, + FlatRideTrackBlocks062, + FlatRideTrackBlocks063, + FlatRideTrackBlocks064, + FlatRideTrackBlocks065, + FlatRideTrackBlocks066, + FlatRideTrackBlocks067, + FlatRideTrackBlocks068, + FlatRideTrackBlocks069, + FlatRideTrackBlocks070, + FlatRideTrackBlocks071, + FlatRideTrackBlocks072, + FlatRideTrackBlocks073, + FlatRideTrackBlocks074, + FlatRideTrackBlocks075, + FlatRideTrackBlocks076, + FlatRideTrackBlocks077, + FlatRideTrackBlocks078, + FlatRideTrackBlocks079, + FlatRideTrackBlocks080, + FlatRideTrackBlocks081, + FlatRideTrackBlocks082, + FlatRideTrackBlocks083, + FlatRideTrackBlocks084, + FlatRideTrackBlocks085, + FlatRideTrackBlocks086, + FlatRideTrackBlocks087, + FlatRideTrackBlocks088, + FlatRideTrackBlocks089, + FlatRideTrackBlocks090, + FlatRideTrackBlocks091, + FlatRideTrackBlocks092, + FlatRideTrackBlocks093, + FlatRideTrackBlocks094, + FlatRideTrackBlocks095, + FlatRideTrackBlocks096, + FlatRideTrackBlocks097, + FlatRideTrackBlocks098, + FlatRideTrackBlocks099, + FlatRideTrackBlocks100, + FlatRideTrackBlocks101, + FlatRideTrackBlocks102, + FlatRideTrackBlocks103, + FlatRideTrackBlocks104, + FlatRideTrackBlocks105, + FlatRideTrackBlocks106, + FlatRideTrackBlocks107, + FlatRideTrackBlocks108, + FlatRideTrackBlocks109, + FlatRideTrackBlocks110, + FlatRideTrackBlocks111, + FlatRideTrackBlocks112, + FlatRideTrackBlocks113, + FlatRideTrackBlocks114, + FlatRideTrackBlocks115, + FlatRideTrackBlocks116, + FlatRideTrackBlocks117, + FlatRideTrackBlocks118, + FlatRideTrackBlocks119, + FlatRideTrackBlocks120, + FlatRideTrackBlocks121, + FlatRideTrackBlocks122, + FlatRideTrackBlocks123, + FlatRideTrackBlocks124, + FlatRideTrackBlocks125, + FlatRideTrackBlocks126, + FlatRideTrackBlocks127, + FlatRideTrackBlocks128, + FlatRideTrackBlocks129, + FlatRideTrackBlocks130, + FlatRideTrackBlocks131, + FlatRideTrackBlocks132, + FlatRideTrackBlocks133, + FlatRideTrackBlocks134, + FlatRideTrackBlocks135, + FlatRideTrackBlocks136, + FlatRideTrackBlocks137, + FlatRideTrackBlocks138, + FlatRideTrackBlocks139, + FlatRideTrackBlocks140, + FlatRideTrackBlocks141, + FlatRideTrackBlocks142, + FlatRideTrackBlocks143, + FlatRideTrackBlocks144, + FlatRideTrackBlocks145, + FlatRideTrackBlocks146, + FlatRideTrackBlocks147, + FlatRideTrackBlocks148, + FlatRideTrackBlocks149, + FlatRideTrackBlocks150, + FlatRideTrackBlocks151, + FlatRideTrackBlocks152, + FlatRideTrackBlocks153, + FlatRideTrackBlocks154, + FlatRideTrackBlocks155, + FlatRideTrackBlocks156, + FlatRideTrackBlocks157, + FlatRideTrackBlocks158, + FlatRideTrackBlocks159, + FlatRideTrackBlocks160, + FlatRideTrackBlocks161, + FlatRideTrackBlocks162, + FlatRideTrackBlocks163, + FlatRideTrackBlocks164, + FlatRideTrackBlocks165, + FlatRideTrackBlocks166, + FlatRideTrackBlocks167, + FlatRideTrackBlocks168, + FlatRideTrackBlocks169, + FlatRideTrackBlocks170, + FlatRideTrackBlocks171, + FlatRideTrackBlocks172, + FlatRideTrackBlocks173, + FlatRideTrackBlocks174, + FlatRideTrackBlocks175, + FlatRideTrackBlocks176, + FlatRideTrackBlocks177, + FlatRideTrackBlocks178, + FlatRideTrackBlocks179, + FlatRideTrackBlocks180, + FlatRideTrackBlocks181, + FlatRideTrackBlocks182, + FlatRideTrackBlocks183, + FlatRideTrackBlocks184, + FlatRideTrackBlocks185, + FlatRideTrackBlocks186, + FlatRideTrackBlocks187, + FlatRideTrackBlocks188, + FlatRideTrackBlocks189, + FlatRideTrackBlocks190, + FlatRideTrackBlocks191, + FlatRideTrackBlocks192, + FlatRideTrackBlocks193, + FlatRideTrackBlocks194, + FlatRideTrackBlocks195, + FlatRideTrackBlocks196, + FlatRideTrackBlocks197, + FlatRideTrackBlocks198, + FlatRideTrackBlocks199, + FlatRideTrackBlocks200, + FlatRideTrackBlocks201, + FlatRideTrackBlocks202, + FlatRideTrackBlocks203, + FlatRideTrackBlocks204, + FlatRideTrackBlocks205, + FlatRideTrackBlocks206, + FlatRideTrackBlocks207, + FlatRideTrackBlocks208, + FlatRideTrackBlocks209, + FlatRideTrackBlocks210, + FlatRideTrackBlocks211, + FlatRideTrackBlocks212, + FlatRideTrackBlocks213, + FlatRideTrackBlocks214, + FlatRideTrackBlocks215, + FlatRideTrackBlocks216, + FlatRideTrackBlocks217, + FlatRideTrackBlocks218, + FlatRideTrackBlocks219, + FlatRideTrackBlocks220, + FlatRideTrackBlocks221, + FlatRideTrackBlocks222, + FlatRideTrackBlocks223, + FlatRideTrackBlocks224, + FlatRideTrackBlocks225, + FlatRideTrackBlocks226, + FlatRideTrackBlocks227, + FlatRideTrackBlocks228, + FlatRideTrackBlocks229, + FlatRideTrackBlocks230, + FlatRideTrackBlocks231, + FlatRideTrackBlocks232, + FlatRideTrackBlocks233, + FlatRideTrackBlocks234, + FlatRideTrackBlocks235, + FlatRideTrackBlocks236, + FlatRideTrackBlocks237, + FlatRideTrackBlocks238, + FlatRideTrackBlocks239, + FlatRideTrackBlocks240, + FlatRideTrackBlocks241, + FlatRideTrackBlocks242, + FlatRideTrackBlocks243, + FlatRideTrackBlocks244, + FlatRideTrackBlocks245, + FlatRideTrackBlocks246, + FlatRideTrackBlocks247, + FlatRideTrackBlocks248, + FlatRideTrackBlocks249, + FlatRideTrackBlocks250, + FlatRideTrackBlocks251, + FlatRideTrackBlocks252, + FlatRideTrackBlocks253, + FlatRideTrackBlocks254 +}; diff --git a/src/ride/track_data.h b/src/ride/track_data.h index c10ad9bd3d..e4da7a149f 100644 --- a/src/ride/track_data.h +++ b/src/ride/track_data.h @@ -17,6 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ + #include "../common.h" /* size 0x0A */ @@ -30,4 +31,8 @@ typedef struct{ }rct_track_coordinates; // 0x009968BB, 0x009968BC, 0x009968BD, 0x009968BF, 0x009968C1, 0x009968C3 -extern const rct_track_coordinates TrackCoordinates[256]; \ No newline at end of file +extern const rct_track_coordinates TrackCoordinates[256]; + +extern const uint64 RideTypePossibleTrackConfigurations[91]; +extern const rct_preview_track *TrackBlocks[256]; +extern const rct_preview_track *FlatRideTrackBlocks[255]; diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index ae22b6fff6..1149e47c0a 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1727,7 +1727,7 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) return; } - rct_preview_track *trackBlock = get_track_def_from_ride_index(_currentRideIndex, mapElement->properties.track.type); + const rct_preview_track *trackBlock = get_track_def_from_ride_index(_currentRideIndex, mapElement->properties.track.type); z = (mapElement->base_height * 8) - trackBlock->z; gotoStartPlacementMode = true; } @@ -2066,13 +2066,13 @@ static void window_ride_construction_draw_track_piece( int rideIndex, int trackType, int trackDirection, int unknown, int width, int height ) { - rct_preview_track *trackBlock; + const rct_preview_track *trackBlock; rct_ride *ride; ride = GET_RIDE(rideIndex); trackBlock = get_track_def_from_ride(ride, trackType); - while ((trackBlock + 1)->var_00 != 0xFF) + while ((trackBlock + 1)->index != 0xFF) trackBlock++; short x = trackBlock->x; @@ -2157,7 +2157,7 @@ static void sub_6CBCE2( int originX, int originY, int originZ ) { rct_ride *ride; - rct_preview_track *trackBlock; + const rct_preview_track *trackBlock; int preserve_word_141E9E4; int x, y, baseZ, clearanceZ, offsetX, offsetY; uint64 preserve_map_size_vars; @@ -2179,7 +2179,7 @@ static void sub_6CBCE2( RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16) = (256 * 32) - 1; trackBlock = get_track_def_from_ride(ride, trackType); - while (trackBlock->var_00 != 255) { + while (trackBlock->index != 255) { int bl = trackBlock->var_08; int bh; switch (trackDirection) { @@ -2244,7 +2244,7 @@ static void sub_6CBCE2( _tempTrackMapElement.base_height = baseZ; _tempTrackMapElement.clearance_height = clearanceZ; _tempTrackMapElement.properties.track.type = trackType; - _tempTrackMapElement.properties.track.sequence = trackBlock->var_00; + _tempTrackMapElement.properties.track.sequence = trackBlock->index; _tempTrackMapElement.properties.track.colour = (edx & 0x20000 ? 4 : 0); _tempTrackMapElement.properties.track.ride_index = rideIndex; @@ -3072,13 +3072,13 @@ static void window_ride_construction_update_widgets(rct_window *w) static void window_ride_construction_select_map_tiles(rct_ride *ride, int trackType, int trackDirection, int x, int y) { - rct_preview_track *trackBlock; + const rct_preview_track *trackBlock; int offsetX, offsetY; trackBlock = get_track_def_from_ride(ride, trackType); trackDirection &= 3; int selectionTileIndex = 0; - while (trackBlock->var_00 != 255) { + while (trackBlock->index != 255) { switch (trackDirection) { case 0: offsetX = trackBlock->x; @@ -3202,7 +3202,7 @@ static void ride_construction_toolupdate_construct(int screenX, int screenY) { int x, y, z, highestZ; rct_ride *ride; - rct_preview_track *trackBlock; + const rct_preview_track *trackBlock; map_invalidate_map_selection_tiles(); RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 2 | 4); @@ -3268,7 +3268,7 @@ static void ride_construction_toolupdate_construct(int screenX, int screenY) do { bx = min(bx, trackBlock->z); trackBlock++; - } while (trackBlock->var_00 != 255); + } while (trackBlock->index != 255); z -= bx; RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z; @@ -3407,12 +3407,12 @@ static void ride_construction_tooldown_construct(int screenX, int screenY) rct_ride *ride = GET_RIDE(_currentRideIndex); if (RCT2_GLOBAL(0x00F44163, uint16) == 0) { - rct_preview_track *trackBlock = get_track_def_from_ride(ride, _currentTrackPieceType); + const rct_preview_track *trackBlock = get_track_def_from_ride(ride, _currentTrackPieceType); int bx = 0; do { bx = min(bx, trackBlock->z); trackBlock++; - } while (trackBlock->var_00 != 255); + } while (trackBlock->index != 255); z -= bx; z -= 16; } else { diff --git a/src/windows/track_place.c b/src/windows/track_place.c index 7e19dba052..c204bff517 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -130,7 +130,7 @@ static void window_track_place_draw_mini_preview() int i, rotation, pass, x, y, pixelX, pixelY, originX, originY, minX, minY, maxX, maxY; rct_maze_element *mazeElement; rct_track_element *trackElement; - rct_preview_track *trackBlock; + const rct_preview_track *trackBlock; window_track_place_clear_mini_preview(); @@ -163,8 +163,8 @@ static void window_track_place_draw_mini_preview() colour = RCT2_ADDRESS(0x0099BA64, uint8)[trackType * 16] & 0x10 ? 222 : 218; // Follow a single track piece shape - trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[trackType]; - while (trackBlock->var_00 != 255) { + trackBlock = TrackBlocks[trackType]; + while (trackBlock->index != 255) { x = originX; y = originY; From 2e1c449e915b9dad3c352e575a758cb86c2c82fd Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 27 Jun 2015 22:58:03 +0100 Subject: [PATCH 0123/1173] use TRACK_BLOCK_END instead of random 255 arrays --- src/ride/track_data.c | 1024 +++++++++++++++++++++-------------------- 1 file changed, 513 insertions(+), 511 deletions(-) diff --git a/src/ride/track_data.c b/src/ride/track_data.c index f6fda77678..5a3759230b 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -375,84 +375,86 @@ const uint64 RideTypePossibleTrackConfigurations[91] = { /* RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_CORKSCREW | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL }; +#define TRACK_BLOCK_END { 255, 255, 255, 255, 255, 255, 255 } + static const rct_preview_track TrackBlocks000[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks001[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks002[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks003[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks004[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks005[] = { { 0, 0, 0, 0, 64, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks006[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks007[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks008[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks009[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks010[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks011[] = { { 0, 0, 0, 0, 64, 63, 0 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks012[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks013[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks014[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks015[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks016[] = { @@ -463,7 +465,7 @@ static const rct_preview_track TrackBlocks016[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks017[] = { @@ -474,27 +476,27 @@ static const rct_preview_track TrackBlocks017[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks018[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks019[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks020[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks021[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks022[] = { @@ -505,7 +507,7 @@ static const rct_preview_track TrackBlocks022[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks023[] = { @@ -516,57 +518,57 @@ static const rct_preview_track TrackBlocks023[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks024[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks025[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks026[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks027[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks028[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks029[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks030[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks031[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks032[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks033[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks034[] = { @@ -577,7 +579,7 @@ static const rct_preview_track TrackBlocks034[] = { { 4, -32, -64, 48, 0, 8, 1 }, { 5, -64, -32, 32, 16, 71, 0 }, { 6, -64, -64, 48, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks035[] = { @@ -588,7 +590,7 @@ static const rct_preview_track TrackBlocks035[] = { { 4, -32, 64, 48, 0, 4, 1 }, { 5, -64, 32, 32, 16, 139, 0 }, { 6, -64, 64, 48, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks036[] = { @@ -599,7 +601,7 @@ static const rct_preview_track TrackBlocks036[] = { { 4, -32, -64, 16, 0, 8, 1 }, { 5, -64, -32, 16, 16, 23, 0 }, { 6, -64, -64, 0, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks037[] = { @@ -610,7 +612,7 @@ static const rct_preview_track TrackBlocks037[] = { { 4, -32, 64, 16, 0, 4, 1 }, { 5, -64, 32, 16, 16, 43, 0 }, { 6, -64, 64, 0, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks038[] = { @@ -618,7 +620,7 @@ static const rct_preview_track TrackBlocks038[] = { { 1, -32, 0, 0, 0, 7, 0 }, { 2, -32, -32, 0, 0, 13, 0 }, { 3, -64, -32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks039[] = { @@ -626,7 +628,7 @@ static const rct_preview_track TrackBlocks039[] = { { 1, -32, 0, 0, 0, 11, 0 }, { 2, -32, 32, 0, 0, 14, 0 }, { 3, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks040[] = { @@ -640,7 +642,7 @@ static const rct_preview_track TrackBlocks040[] = { { 7, 32, -32, 32, 96, 8, 0 }, { 8, 0, -32, 16, 16, 63, 0 }, { 9, -32, -32, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks041[] = { @@ -654,7 +656,7 @@ static const rct_preview_track TrackBlocks041[] = { { 7, 32, 32, 32, 96, 4, 0 }, { 8, 0, 32, 16, 16, 63, 0 }, { 9, -32, 32, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks042[] = { @@ -662,7 +664,7 @@ static const rct_preview_track TrackBlocks042[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 0, 2, 0 }, { 3, -32, -32, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks043[] = { @@ -670,7 +672,7 @@ static const rct_preview_track TrackBlocks043[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 0 }, { 3, -32, 32, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 16, 71 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks044[] = { @@ -678,7 +680,7 @@ static const rct_preview_track TrackBlocks044[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 0, 2, 0 }, { 3, -32, -32, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks045[] = { @@ -686,7 +688,7 @@ static const rct_preview_track TrackBlocks045[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 0 }, { 3, -32, 32, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 16, 71 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks046[] = { @@ -694,7 +696,7 @@ static const rct_preview_track TrackBlocks046[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 16, 16, 103, 0 }, - { 255, 0, 0, 0, 0, 16, 139 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks047[] = { @@ -702,7 +704,7 @@ static const rct_preview_track TrackBlocks047[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 16, 16, 155, 0 }, - { 255, 0, 0, 4096, 0, 16, 55 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks048[] = { @@ -710,7 +712,7 @@ static const rct_preview_track TrackBlocks048[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 0, 16, 23, 0 }, - { 255, 0, 0, 4096, 0, 16, 59 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks049[] = { @@ -718,45 +720,45 @@ static const rct_preview_track TrackBlocks049[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 0, 16, 43, 0 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks050[] = { { 0, 0, 0, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks051[] = { { 0, 0, 0, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks052[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks053[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks054[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks055[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks056[] = { @@ -764,7 +766,7 @@ static const rct_preview_track TrackBlocks056[] = { { 1, -32, 0, 16, 16, 207, 0 }, { 2, -64, 0, 32, 96, 3, 0 }, { 3, -32, 0, 120, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 32, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks057[] = { @@ -772,55 +774,55 @@ static const rct_preview_track TrackBlocks057[] = { { 1, -32, 0, -120, 96, 3, 0 }, { 2, 0, 0, -136, 16, 207, 0 }, { 3, 32, 0, -152, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks058[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 7, 0 }, { 2, -32, -32, 48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks059[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 11, 0 }, { 2, -32, 32, 48, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks060[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -56, 32, 7, 0 }, { 2, -32, -32, -80, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks061[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -56, 32, 11, 0 }, { 2, -32, 32, -80, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks062[] = { { 0, 0, 0, 0, 24, 15, 0 }, - { 255, 0, 0, 0, 0, 24, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks063[] = { { 0, 0, 0, 0, 24, 207, 0 }, - { 255, 0, 0, 0, 0, 24, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks064[] = { { 0, 0, 0, 0, 24, 63, 0 }, - { 255, 0, 0, 0, 0, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks065[] = { { 0, 0, 0, 0, 24, 15, 0 }, - { 255, 0, 0, 0, 0, 64, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks066[] = { @@ -833,78 +835,78 @@ static const rct_preview_track TrackBlocks066[] = { { 6, 32, -32, 0, 0, 15, 0 }, { 7, 32, 32, 0, 0, 15, 0 }, { 8, 32, 0, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks067[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, 32, 0, 0, 0, 0, 3 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks068[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks069[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks070[] = { { 0, 0, 0, 0, 64, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks071[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks072[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks073[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks074[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks075[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks076[] = { { 0, 0, 0, 0, 64, 63, 0 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks077[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks078[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks079[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks080[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks081[] = { @@ -915,7 +917,7 @@ static const rct_preview_track TrackBlocks081[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks082[] = { @@ -926,7 +928,7 @@ static const rct_preview_track TrackBlocks082[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks083[] = { @@ -934,7 +936,7 @@ static const rct_preview_track TrackBlocks083[] = { { 1, -32, 0, 0, 0, 7, 0 }, { 2, -32, -32, 0, 0, 13, 0 }, { 3, -64, -32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks084[] = { @@ -942,7 +944,7 @@ static const rct_preview_track TrackBlocks084[] = { { 1, -32, 0, 0, 0, 11, 0 }, { 2, -32, 32, 0, 0, 14, 0 }, { 3, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks085[] = { @@ -950,7 +952,7 @@ static const rct_preview_track TrackBlocks085[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 0, 2, 0 }, { 3, -32, -32, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks086[] = { @@ -958,7 +960,7 @@ static const rct_preview_track TrackBlocks086[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 0 }, { 3, -32, 32, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 16, 71 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks087[] = { @@ -970,7 +972,7 @@ static const rct_preview_track TrackBlocks087[] = { { 5, 0, -64, 8, 0, 4, 1 }, { 6, -32, -96, 8, 4, 1, 0 }, { 7, 0, -96, 8, 4, 11, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks088[] = { @@ -982,7 +984,7 @@ static const rct_preview_track TrackBlocks088[] = { { 5, 0, 64, 8, 0, 8, 1 }, { 6, -32, 96, 8, 4, 2, 0 }, { 7, 0, 96, 8, 4, 7, 0 }, - { 255, 0, 0, 2048, 0, 4, 7 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks089[] = { @@ -994,7 +996,7 @@ static const rct_preview_track TrackBlocks089[] = { { 5, 0, -64, 0, 4, 4, 1 }, { 6, -32, -96, 0, 0, 1, 0 }, { 7, 0, -96, 0, 0, 11, 0 }, - { 255, 0, 0, 2048, 0, 4, 11 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks090[] = { @@ -1006,7 +1008,7 @@ static const rct_preview_track TrackBlocks090[] = { { 5, 0, 64, 0, 4, 8, 1 }, { 6, -32, 96, 0, 0, 2, 0 }, { 7, 0, 96, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks091[] = { @@ -1024,7 +1026,7 @@ static const rct_preview_track TrackBlocks091[] = { { 11, 0, -128, 8, 4, 4, 1 }, { 12, -32, -160, 8, 4, 11, 0 }, { 13, 0, -160, 8, 4, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks092[] = { @@ -1042,7 +1044,7 @@ static const rct_preview_track TrackBlocks092[] = { { 11, 0, 128, 8, 4, 8, 1 }, { 12, -32, 160, 8, 4, 7, 0 }, { 13, 0, 160, 8, 4, 15, 0 }, - { 255, 0, 0, 2048, 0, 4, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks093[] = { @@ -1060,7 +1062,7 @@ static const rct_preview_track TrackBlocks093[] = { { 11, 0, -128, 0, 0, 4, 1 }, { 12, -32, -160, 0, 0, 11, 0 }, { 13, 0, -160, 0, 0, 15, 0 }, - { 255, 0, 0, 2048, 0, 4, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks094[] = { @@ -1078,42 +1080,42 @@ static const rct_preview_track TrackBlocks094[] = { { 11, 0, 128, 0, 0, 8, 1 }, { 12, -32, 160, 0, 0, 7, 0 }, { 13, 0, 160, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 64, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks095[] = { { 0, 0, 0, 0, 64, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks096[] = { { 0, 0, 0, 0, 64, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks097[] = { { 0, 0, 0, 0, 64, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks098[] = { { 0, 0, 0, 0, 64, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks099[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks100[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks101[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks102[] = { @@ -1124,7 +1126,7 @@ static const rct_preview_track TrackBlocks102[] = { { 4, -32, -64, 0, 12, 8, 1 }, { 5, -64, -32, 0, 12, 7, 0 }, { 6, -64, -64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks103[] = { @@ -1135,7 +1137,7 @@ static const rct_preview_track TrackBlocks103[] = { { 4, -32, 64, 0, 12, 4, 1 }, { 5, -64, 32, 0, 12, 11, 0 }, { 6, -64, 64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks104[] = { @@ -1146,7 +1148,7 @@ static const rct_preview_track TrackBlocks104[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks105[] = { @@ -1157,7 +1159,7 @@ static const rct_preview_track TrackBlocks105[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks106[] = { @@ -1168,7 +1170,7 @@ static const rct_preview_track TrackBlocks106[] = { { 4, -32, -64, 0, 12, 8, 1 }, { 5, -64, -32, 0, 12, 7, 0 }, { 6, -64, -64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks107[] = { @@ -1179,7 +1181,7 @@ static const rct_preview_track TrackBlocks107[] = { { 4, -32, 64, 0, 12, 4, 1 }, { 5, -64, 32, 0, 12, 11, 0 }, { 6, -64, 64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks108[] = { @@ -1190,7 +1192,7 @@ static const rct_preview_track TrackBlocks108[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks109[] = { @@ -1201,42 +1203,42 @@ static const rct_preview_track TrackBlocks109[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks110[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks111[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks112[] = { { 0, 0, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks113[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks114[] = { { 0, 0, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks115[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks116[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks117[] = { @@ -1245,7 +1247,7 @@ static const rct_preview_track TrackBlocks117[] = { { 2, -64, 0, 0, 16, 15, 0 }, { 3, -96, 0, 0, 16, 15, 0 }, { 4, -128, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks118[] = { @@ -1253,7 +1255,7 @@ static const rct_preview_track TrackBlocks118[] = { { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 24, 15, 0 }, { 3, -96, 0, 40, 48, 15, 0 }, - { 255, 0, 0, 0, 0, 48, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks119[] = { @@ -1261,12 +1263,12 @@ static const rct_preview_track TrackBlocks119[] = { { 1, -32, 0, 40, 48, 15, 0 }, { 2, -64, 0, 64, 24, 15, 0 }, { 3, -96, 0, 80, 8, 15, 0 }, - { 255, 0, 0, 10240, 0, 48, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks120[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks121[] = { @@ -1274,7 +1276,7 @@ static const rct_preview_track TrackBlocks121[] = { { 1, -32, 0, 16, 24, 15, 0 }, { 2, -64, 0, 0, 16, 15, 0 }, { 3, -96, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 20480, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks122[] = { @@ -1282,7 +1284,7 @@ static const rct_preview_track TrackBlocks122[] = { { 1, -32, 0, 64, 24, 15, 0 }, { 2, -64, 0, 40, 48, 15, 0 }, { 3, -96, 0, 0, 48, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks123[] = { @@ -1290,7 +1292,7 @@ static const rct_preview_track TrackBlocks123[] = { { 1, -32, 0, 0, 8, 63, 0 }, { 2, -64, 0, -32, 32, 63, 0 }, { 3, -96, 0, -96, 64, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks124[] = { @@ -1301,52 +1303,52 @@ static const rct_preview_track TrackBlocks124[] = { { 4, -128, 0, 0, 160, 15, 0 }, { 5, -192, 0, 0, 208, 15, 0 }, { 6, -160, 0, 0, 208, 15, 0 }, - { 255, 0, 0, 0, 0, 48, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks125[] = { { 0, 0, 0, 0, 48, 15, 0 }, { 1, 32, 0, 0, 48, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks126[] = { { 0, 0, 0, 0, 8, 15, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks127[] = { { 0, 0, 0, 0, 8, 15, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks128[] = { { 0, 0, 0, 0, 32, 207, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks129[] = { { 0, 0, 0, 0, 32, 63, 4 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks130[] = { { 0, 0, 0, 0, 56, 15, 4 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks131[] = { { 0, 0, 0, 0, 56, 15, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks132[] = { { 0, 0, 0, 0, 24, 63, 0 }, - { 255, 0, 0, 0, 0, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks133[] = { @@ -1355,7 +1357,7 @@ static const rct_preview_track TrackBlocks133[] = { { 2, -32, -32, 0, 0, 8, 0 }, { 3, -64, 0, 0, 0, 2, 1 }, { 4, -64, -32, 0, 0, 1, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks134[] = { @@ -1364,7 +1366,7 @@ static const rct_preview_track TrackBlocks134[] = { { 2, -32, 32, 0, 0, 4, 0 }, { 3, -64, 0, 0, 0, 1, 1 }, { 4, -64, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks135[] = { @@ -1373,7 +1375,7 @@ static const rct_preview_track TrackBlocks135[] = { { 2, 0, 32, 0, 0, 4, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks136[] = { @@ -1382,7 +1384,7 @@ static const rct_preview_track TrackBlocks136[] = { { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -32, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks137[] = { @@ -1391,7 +1393,7 @@ static const rct_preview_track TrackBlocks137[] = { { 2, -32, -32, 0, 0, 8, 0 }, { 3, -64, 0, 0, 0, 2, 1 }, { 4, -64, -32, 0, 0, 1, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks138[] = { @@ -1400,7 +1402,7 @@ static const rct_preview_track TrackBlocks138[] = { { 2, -32, 32, 0, 0, 4, 0 }, { 3, -64, 0, 0, 0, 1, 1 }, { 4, -64, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks139[] = { @@ -1409,7 +1411,7 @@ static const rct_preview_track TrackBlocks139[] = { { 2, 0, 32, 0, 0, 4, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks140[] = { @@ -1418,7 +1420,7 @@ static const rct_preview_track TrackBlocks140[] = { { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -32, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks141[] = { @@ -1426,7 +1428,7 @@ static const rct_preview_track TrackBlocks141[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks142[] = { @@ -1434,7 +1436,7 @@ static const rct_preview_track TrackBlocks142[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 1 }, { 3, -32, 32, 0, 16, 2, 0 }, - { 255, 0, 0, 0, 0, 64, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks143[] = { @@ -1442,7 +1444,7 @@ static const rct_preview_track TrackBlocks143[] = { { 1, 0, 32, 0, 64, 4, 1 }, { 2, -32, 0, 0, 64, 1, 1 }, { 3, -32, 32, 0, 64, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks144[] = { @@ -1450,7 +1452,7 @@ static const rct_preview_track TrackBlocks144[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks145[] = { @@ -1458,7 +1460,7 @@ static const rct_preview_track TrackBlocks145[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks146[] = { @@ -1466,7 +1468,7 @@ static const rct_preview_track TrackBlocks146[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks147[] = { @@ -1474,7 +1476,7 @@ static const rct_preview_track TrackBlocks147[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks148[] = { @@ -1482,7 +1484,7 @@ static const rct_preview_track TrackBlocks148[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 1 }, { 3, -32, 32, 0, 16, 2, 0 }, - { 255, 0, 0, 0, 0, 64, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks149[] = { @@ -1490,7 +1492,7 @@ static const rct_preview_track TrackBlocks149[] = { { 1, 0, 32, 0, 64, 4, 1 }, { 2, -32, 0, 0, 64, 1, 1 }, { 3, -32, 32, 0, 64, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks150[] = { @@ -1498,7 +1500,7 @@ static const rct_preview_track TrackBlocks150[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks151[] = { @@ -1506,7 +1508,7 @@ static const rct_preview_track TrackBlocks151[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks152[] = { @@ -1514,7 +1516,7 @@ static const rct_preview_track TrackBlocks152[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks153[] = { @@ -1522,7 +1524,7 @@ static const rct_preview_track TrackBlocks153[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks154[] = { @@ -1530,7 +1532,7 @@ static const rct_preview_track TrackBlocks154[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks155[] = { @@ -1538,7 +1540,7 @@ static const rct_preview_track TrackBlocks155[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks156[] = { @@ -1546,7 +1548,7 @@ static const rct_preview_track TrackBlocks156[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks157[] = { @@ -1554,7 +1556,7 @@ static const rct_preview_track TrackBlocks157[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks158[] = { @@ -1562,7 +1564,7 @@ static const rct_preview_track TrackBlocks158[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks159[] = { @@ -1570,7 +1572,7 @@ static const rct_preview_track TrackBlocks159[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks160[] = { @@ -1578,7 +1580,7 @@ static const rct_preview_track TrackBlocks160[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks161[] = { @@ -1586,7 +1588,7 @@ static const rct_preview_track TrackBlocks161[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks162[] = { @@ -1594,7 +1596,7 @@ static const rct_preview_track TrackBlocks162[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks163[] = { @@ -1602,7 +1604,7 @@ static const rct_preview_track TrackBlocks163[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks164[] = { @@ -1610,7 +1612,7 @@ static const rct_preview_track TrackBlocks164[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks165[] = { @@ -1618,7 +1620,7 @@ static const rct_preview_track TrackBlocks165[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks166[] = { @@ -1626,7 +1628,7 @@ static const rct_preview_track TrackBlocks166[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks167[] = { @@ -1634,7 +1636,7 @@ static const rct_preview_track TrackBlocks167[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks168[] = { @@ -1642,7 +1644,7 @@ static const rct_preview_track TrackBlocks168[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks169[] = { @@ -1650,7 +1652,7 @@ static const rct_preview_track TrackBlocks169[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks170[] = { @@ -1658,7 +1660,7 @@ static const rct_preview_track TrackBlocks170[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks171[] = { @@ -1666,45 +1668,45 @@ static const rct_preview_track TrackBlocks171[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks172[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks173[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks174[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 0, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks175[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 0, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks176[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -32, 16, 15, 0 }, { 2, -64, 0, -32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 71 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks177[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -32, 16, 15, 0 }, { 2, -64, 0, -32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 71 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks178[] = { @@ -1712,7 +1714,7 @@ static const rct_preview_track TrackBlocks178[] = { { 1, 0, -32, 0, 16, 8, 1 }, { 2, -32, 0, 0, 16, 2, 0 }, { 3, -32, -32, 16, 16, 103, 0 }, - { 255, 0, 0, 0, 0, 16, 139 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks179[] = { @@ -1720,7 +1722,7 @@ static const rct_preview_track TrackBlocks179[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 0 }, { 3, -32, 32, 16, 16, 155, 0 }, - { 255, 0, 0, 4096, 0, 16, 55 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks180[] = { @@ -1728,7 +1730,7 @@ static const rct_preview_track TrackBlocks180[] = { { 1, 0, -32, 0, 16, 8, 1 }, { 2, -32, 0, 0, 16, 2, 0 }, { 3, -32, -32, 0, 0, 23, 0 }, - { 255, 0, 0, 4096, 0, 16, 59 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks181[] = { @@ -1736,12 +1738,12 @@ static const rct_preview_track TrackBlocks181[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 0 }, { 3, -32, 32, 0, 0, 43, 0 }, - { 255, 0, 0, 0, 0, 24, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks182[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks183[] = { @@ -1752,7 +1754,7 @@ static const rct_preview_track TrackBlocks183[] = { { 4, -128, -32, 120, 96, 15, 0 }, { 5, -96, -32, 64, 192, 15, 0 }, { 6, -64, -32, 248, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 24, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks184[] = { @@ -1763,7 +1765,7 @@ static const rct_preview_track TrackBlocks184[] = { { 4, -128, 32, 120, 96, 15, 0 }, { 5, -96, 32, 64, 192, 15, 0 }, { 6, -64, 32, 248, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks185[] = { @@ -1774,7 +1776,7 @@ static const rct_preview_track TrackBlocks185[] = { { 4, 0, -32, -248, 56, 15, 0 }, { 5, 32, -32, -264, 40, 207, 0 }, { 6, 64, -32, -280, 24, 207, 0 }, - { 255, 0, 0, -8192, 255, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks186[] = { @@ -1785,35 +1787,35 @@ static const rct_preview_track TrackBlocks186[] = { { 4, 0, 32, -248, 56, 15, 0 }, { 5, 32, 32, -264, 40, 207, 0 }, { 6, 64, 32, -280, 24, 207, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks187[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks188[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks189[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks190[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks191[] = { @@ -1821,7 +1823,7 @@ static const rct_preview_track TrackBlocks191[] = { { 1, -32, 0, 16, 16, 207, 0 }, { 2, -64, 0, 32, 96, 3, 0 }, { 3, -32, 0, 120, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks192[] = { @@ -1829,35 +1831,35 @@ static const rct_preview_track TrackBlocks192[] = { { 1, -32, 0, -88, 96, 3, 0 }, { 2, 0, 0, -104, 16, 207, 0 }, { 3, 32, 0, -120, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks193[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 7, 0 }, { 2, -32, -32, 48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks194[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 11, 0 }, { 2, -32, 32, 48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks195[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, -24, 32, 7, 0 }, { 2, -32, -32, -48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks196[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, -24, 32, 11, 0 }, { 2, -32, 32, -48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks197[] = { @@ -1865,7 +1867,7 @@ static const rct_preview_track TrackBlocks197[] = { { 1, -32, 0, 0, 32, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, { 3, 0, 0, 32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks198[] = { @@ -1873,7 +1875,7 @@ static const rct_preview_track TrackBlocks198[] = { { 1, -32, 0, -32, 32, 15, 0 }, { 2, -64, 0, -16, 0, 15, 0 }, { 3, 0, 0, -32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks199[] = { @@ -1883,7 +1885,7 @@ static const rct_preview_track TrackBlocks199[] = { { 3, -96, 0, 0, 0, 15, 0 }, { 4, -128, 0, 0, 0, 15, 0 }, { 5, -160, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks200[] = { @@ -1893,39 +1895,39 @@ static const rct_preview_track TrackBlocks200[] = { { 3, -96, 0, 0, 0, 15, 0 }, { 4, -128, 0, 0, 0, 15, 0 }, { 5, -160, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks201[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks202[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks203[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks204[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, { 2, -32, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks205[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, { 2, -32, -32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks206[] = { @@ -1933,14 +1935,14 @@ static const rct_preview_track TrackBlocks206[] = { { 1, -32, 0, -40, 32, 15, 4 }, { 2, -64, 0, -96, 56, 15, 4 }, { 3, -96, 0, -96, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 0, 0 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks207[] = { { 0, 0, 0, 0, 56, 15, 4 }, { 1, 32, 0, 56, 32, 15, 4 }, { 2, 64, 0, 96, 16, 15, 4 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks208[] = { @@ -1948,7 +1950,7 @@ static const rct_preview_track TrackBlocks208[] = { { 1, -32, 0, -72, 32, 15, 4 }, { 2, -64, 0, -128, 56, 15, 4 }, { 3, -96, 0, -128, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks209[] = { @@ -1956,7 +1958,7 @@ static const rct_preview_track TrackBlocks209[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 8, 2, 0 }, { 3, -32, -32, 0, 8, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks210[] = { @@ -1964,7 +1966,7 @@ static const rct_preview_track TrackBlocks210[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 8, 1, 0 }, { 3, -32, 32, 0, 8, 11, 0 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks211[] = { @@ -1974,7 +1976,7 @@ static const rct_preview_track TrackBlocks211[] = { { 3, -64, -32, 0, 0, 15, 0 }, { 4, -32, 0, 0, 0, 15, 0 }, { 5, -64, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks212[] = { @@ -1984,7 +1986,7 @@ static const rct_preview_track TrackBlocks212[] = { { 3, -64, 32, 0, 0, 15, 0 }, { 4, -32, 0, 0, 0, 15, 0 }, { 5, -64, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks213[] = { @@ -1992,13 +1994,13 @@ static const rct_preview_track TrackBlocks213[] = { { 1, 32, 0, 0, 32, 15, 0 }, { 2, -64, 0, 0, 32, 15, 0 }, { 3, -32, 0, 0, 32, 15, 0 }, - { 255, 0, 0, 0, 0, 48, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks214[] = { { 0, 0, 0, 0, 48, 15, 0 }, { 1, 32, 0, 0, 48, 15, 0 }, - { 255, 0, 0, 0, 0, 208, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks215[] = { @@ -2009,12 +2011,12 @@ static const rct_preview_track TrackBlocks215[] = { { 4, -96, 0, 0, 48, 15, 0 }, { 5, -128, 0, 0, 32, 15, 0 }, { 6, -160, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks216[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks217[] = { @@ -2022,7 +2024,7 @@ static const rct_preview_track TrackBlocks217[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 16, 16, 103, 0 }, - { 255, 0, 0, 0, 0, 16, 139 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks218[] = { @@ -2030,7 +2032,7 @@ static const rct_preview_track TrackBlocks218[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 16, 16, 155, 0 }, - { 255, 0, 0, 4096, 0, 16, 55 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks219[] = { @@ -2038,7 +2040,7 @@ static const rct_preview_track TrackBlocks219[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 0, 16, 23, 0 }, - { 255, 0, 0, 4096, 0, 16, 59 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks220[] = { @@ -2046,7 +2048,7 @@ static const rct_preview_track TrackBlocks220[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 0, 16, 43, 0 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks221[] = { @@ -2057,7 +2059,7 @@ static const rct_preview_track TrackBlocks221[] = { { 4, -32, -64, 48, 0, 8, 1 }, { 5, -64, -32, 32, 16, 71, 0 }, { 6, -64, -64, 48, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks222[] = { @@ -2068,7 +2070,7 @@ static const rct_preview_track TrackBlocks222[] = { { 4, -32, 64, 48, 0, 4, 1 }, { 5, -64, 32, 32, 16, 139, 0 }, { 6, -64, 64, 48, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks223[] = { @@ -2079,7 +2081,7 @@ static const rct_preview_track TrackBlocks223[] = { { 4, -32, -64, 16, 0, 8, 1 }, { 5, -64, -32, 16, 16, 23, 0 }, { 6, -64, -64, 0, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks224[] = { @@ -2090,158 +2092,158 @@ static const rct_preview_track TrackBlocks224[] = { { 4, -32, 64, 16, 0, 4, 1 }, { 5, -64, 32, 16, 16, 43, 0 }, { 6, -64, 64, 0, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks225[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks226[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks227[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks228[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks229[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks230[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks231[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks232[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks233[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks234[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks235[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks236[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks237[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks238[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks239[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks240[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks241[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks242[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks243[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks244[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks245[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks246[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks247[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks248[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks249[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, 32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks250[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, -32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks251[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, 32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks252[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, -32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks253[] = { { 0, 0, 0, 0, 56, 15, 4 }, { 1, 32, 0, 56, 32, 15, 4 }, { 2, 64, 0, 96, 16, 15, 4 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks254[] = { @@ -2249,14 +2251,14 @@ static const rct_preview_track TrackBlocks254[] = { { 1, -32, 0, -72, 32, 15, 4 }, { 2, -64, 0, -128, 56, 15, 4 }, { 3, -96, 0, -128, 0, 0, 5 }, - { 255, 0, 0, 8192, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks255[] = { { 0, 0, 0, 32, 56, 15, 4 }, { 1, 32, 0, 88, 32, 15, 4 }, { 2, 64, 0, 128, 16, 15, 4 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; // rct2: 0x00994638 @@ -2521,82 +2523,82 @@ const rct_preview_track *TrackBlocks[256] = { static const rct_preview_track FlatRideTrackBlocks000[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks001[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks002[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks003[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks004[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks005[] = { { 0, 0, 0, 0, 64, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks006[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks007[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks008[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks009[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks010[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks011[] = { { 0, 0, 0, 0, 64, 63, 0 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks012[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks013[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks014[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks015[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks016[] = { @@ -2607,7 +2609,7 @@ static const rct_preview_track FlatRideTrackBlocks016[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks017[] = { @@ -2618,27 +2620,27 @@ static const rct_preview_track FlatRideTrackBlocks017[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks018[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks019[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks020[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks021[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks022[] = { @@ -2649,7 +2651,7 @@ static const rct_preview_track FlatRideTrackBlocks022[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks023[] = { @@ -2660,57 +2662,57 @@ static const rct_preview_track FlatRideTrackBlocks023[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks024[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks025[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks026[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks027[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks028[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks029[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks030[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks031[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks032[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks033[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks034[] = { @@ -2721,7 +2723,7 @@ static const rct_preview_track FlatRideTrackBlocks034[] = { { 4, -32, -64, 48, 0, 8, 1 }, { 5, -64, -32, 32, 16, 71, 0 }, { 6, -64, -64, 48, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks035[] = { @@ -2732,7 +2734,7 @@ static const rct_preview_track FlatRideTrackBlocks035[] = { { 4, -32, 64, 48, 0, 4, 1 }, { 5, -64, 32, 32, 16, 139, 0 }, { 6, -64, 64, 48, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks036[] = { @@ -2743,7 +2745,7 @@ static const rct_preview_track FlatRideTrackBlocks036[] = { { 4, -32, -64, 16, 0, 8, 1 }, { 5, -64, -32, 16, 16, 23, 0 }, { 6, -64, -64, 0, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks037[] = { @@ -2754,7 +2756,7 @@ static const rct_preview_track FlatRideTrackBlocks037[] = { { 4, -32, 64, 16, 0, 4, 1 }, { 5, -64, 32, 16, 16, 43, 0 }, { 6, -64, 64, 0, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks038[] = { @@ -2762,7 +2764,7 @@ static const rct_preview_track FlatRideTrackBlocks038[] = { { 1, -32, 0, 0, 0, 7, 0 }, { 2, -32, -32, 0, 0, 13, 0 }, { 3, -64, -32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks039[] = { @@ -2770,7 +2772,7 @@ static const rct_preview_track FlatRideTrackBlocks039[] = { { 1, -32, 0, 0, 0, 11, 0 }, { 2, -32, 32, 0, 0, 14, 0 }, { 3, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks040[] = { @@ -2784,7 +2786,7 @@ static const rct_preview_track FlatRideTrackBlocks040[] = { { 7, 32, -32, 32, 96, 8, 0 }, { 8, 0, -32, 16, 16, 63, 0 }, { 9, -32, -32, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks041[] = { @@ -2798,7 +2800,7 @@ static const rct_preview_track FlatRideTrackBlocks041[] = { { 7, 32, 32, 32, 96, 4, 0 }, { 8, 0, 32, 16, 16, 63, 0 }, { 9, -32, 32, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks042[] = { @@ -2806,7 +2808,7 @@ static const rct_preview_track FlatRideTrackBlocks042[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 0, 2, 0 }, { 3, -32, -32, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks043[] = { @@ -2814,7 +2816,7 @@ static const rct_preview_track FlatRideTrackBlocks043[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 0 }, { 3, -32, 32, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 16, 71 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks044[] = { @@ -2822,7 +2824,7 @@ static const rct_preview_track FlatRideTrackBlocks044[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 0, 2, 0 }, { 3, -32, -32, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks045[] = { @@ -2830,7 +2832,7 @@ static const rct_preview_track FlatRideTrackBlocks045[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 0 }, { 3, -32, 32, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 16, 71 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks046[] = { @@ -2838,7 +2840,7 @@ static const rct_preview_track FlatRideTrackBlocks046[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 16, 16, 103, 0 }, - { 255, 0, 0, 0, 0, 16, 139 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks047[] = { @@ -2846,7 +2848,7 @@ static const rct_preview_track FlatRideTrackBlocks047[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 16, 16, 155, 0 }, - { 255, 0, 0, 4096, 0, 16, 55 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks048[] = { @@ -2854,7 +2856,7 @@ static const rct_preview_track FlatRideTrackBlocks048[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 0, 16, 23, 0 }, - { 255, 0, 0, 4096, 0, 16, 59 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks049[] = { @@ -2862,45 +2864,45 @@ static const rct_preview_track FlatRideTrackBlocks049[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 0, 16, 43, 0 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks050[] = { { 0, 0, 0, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks051[] = { { 0, 0, 0, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks052[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks053[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks054[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks055[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks056[] = { @@ -2908,7 +2910,7 @@ static const rct_preview_track FlatRideTrackBlocks056[] = { { 1, -32, 0, 16, 16, 207, 0 }, { 2, -64, 0, 32, 96, 3, 0 }, { 3, -32, 0, 120, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 32, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks057[] = { @@ -2916,55 +2918,55 @@ static const rct_preview_track FlatRideTrackBlocks057[] = { { 1, -32, 0, -120, 96, 3, 0 }, { 2, 0, 0, -136, 16, 207, 0 }, { 3, 32, 0, -152, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks058[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 7, 0 }, { 2, -32, -32, 48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks059[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 11, 0 }, { 2, -32, 32, 48, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks060[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -56, 32, 7, 0 }, { 2, -32, -32, -80, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks061[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -56, 32, 11, 0 }, { 2, -32, 32, -80, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks062[] = { { 0, 0, 0, 0, 24, 15, 0 }, - { 255, 0, 0, 0, 0, 24, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks063[] = { { 0, 0, 0, 0, 24, 207, 0 }, - { 255, 0, 0, 0, 0, 24, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks064[] = { { 0, 0, 0, 0, 24, 63, 0 }, - { 255, 0, 0, 0, 0, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks065[] = { { 0, 0, 0, 0, 24, 15, 0 }, - { 255, 0, 0, 0, 0, 64, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks066[] = { @@ -2977,78 +2979,78 @@ static const rct_preview_track FlatRideTrackBlocks066[] = { { 6, 32, -32, 0, 0, 15, 0 }, { 7, 32, 32, 0, 0, 15, 0 }, { 8, 32, 0, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks067[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, 32, 0, 0, 0, 0, 3 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks068[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks069[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks070[] = { { 0, 0, 0, 0, 64, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks071[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks072[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks073[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks074[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks075[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks076[] = { { 0, 0, 0, 0, 64, 63, 0 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks077[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks078[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks079[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks080[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks081[] = { @@ -3059,7 +3061,7 @@ static const rct_preview_track FlatRideTrackBlocks081[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks082[] = { @@ -3070,7 +3072,7 @@ static const rct_preview_track FlatRideTrackBlocks082[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks083[] = { @@ -3078,7 +3080,7 @@ static const rct_preview_track FlatRideTrackBlocks083[] = { { 1, -32, 0, 0, 0, 7, 0 }, { 2, -32, -32, 0, 0, 13, 0 }, { 3, -64, -32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks084[] = { @@ -3086,7 +3088,7 @@ static const rct_preview_track FlatRideTrackBlocks084[] = { { 1, -32, 0, 0, 0, 11, 0 }, { 2, -32, 32, 0, 0, 14, 0 }, { 3, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks085[] = { @@ -3094,7 +3096,7 @@ static const rct_preview_track FlatRideTrackBlocks085[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 0, 2, 0 }, { 3, -32, -32, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks086[] = { @@ -3102,7 +3104,7 @@ static const rct_preview_track FlatRideTrackBlocks086[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 0 }, { 3, -32, 32, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 16, 71 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks087[] = { @@ -3114,7 +3116,7 @@ static const rct_preview_track FlatRideTrackBlocks087[] = { { 5, 0, -64, 8, 0, 4, 1 }, { 6, -32, -96, 8, 4, 1, 0 }, { 7, 0, -96, 8, 4, 11, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks088[] = { @@ -3126,7 +3128,7 @@ static const rct_preview_track FlatRideTrackBlocks088[] = { { 5, 0, 64, 8, 0, 8, 1 }, { 6, -32, 96, 8, 4, 2, 0 }, { 7, 0, 96, 8, 4, 7, 0 }, - { 255, 0, 0, 2048, 0, 4, 7 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks089[] = { @@ -3138,7 +3140,7 @@ static const rct_preview_track FlatRideTrackBlocks089[] = { { 5, 0, -64, 0, 4, 4, 1 }, { 6, -32, -96, 0, 0, 1, 0 }, { 7, 0, -96, 0, 0, 11, 0 }, - { 255, 0, 0, 2048, 0, 4, 11 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks090[] = { @@ -3150,7 +3152,7 @@ static const rct_preview_track FlatRideTrackBlocks090[] = { { 5, 0, 64, 0, 4, 8, 1 }, { 6, -32, 96, 0, 0, 2, 0 }, { 7, 0, 96, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks091[] = { @@ -3168,7 +3170,7 @@ static const rct_preview_track FlatRideTrackBlocks091[] = { { 11, 0, -128, 8, 4, 4, 1 }, { 12, -32, -160, 8, 4, 11, 0 }, { 13, 0, -160, 8, 4, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks092[] = { @@ -3186,7 +3188,7 @@ static const rct_preview_track FlatRideTrackBlocks092[] = { { 11, 0, 128, 8, 4, 8, 1 }, { 12, -32, 160, 8, 4, 7, 0 }, { 13, 0, 160, 8, 4, 15, 0 }, - { 255, 0, 0, 2048, 0, 4, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks093[] = { @@ -3204,7 +3206,7 @@ static const rct_preview_track FlatRideTrackBlocks093[] = { { 11, 0, -128, 0, 0, 4, 1 }, { 12, -32, -160, 0, 0, 11, 0 }, { 13, 0, -160, 0, 0, 15, 0 }, - { 255, 0, 0, 2048, 0, 4, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks094[] = { @@ -3222,7 +3224,7 @@ static const rct_preview_track FlatRideTrackBlocks094[] = { { 11, 0, 128, 0, 0, 8, 1 }, { 12, -32, 160, 0, 0, 7, 0 }, { 13, 0, 160, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 64, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks095[] = { @@ -3230,37 +3232,37 @@ static const rct_preview_track FlatRideTrackBlocks095[] = { { 1, -64, 0, 0, 0, 15, 0 }, { 2, -32, 0, 0, 0, 15, 0 }, { 3, 32, 0, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks096[] = { { 0, 0, 0, 0, 64, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks097[] = { { 0, 0, 0, 0, 64, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks098[] = { { 0, 0, 0, 0, 64, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks099[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks100[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks101[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks102[] = { @@ -3271,7 +3273,7 @@ static const rct_preview_track FlatRideTrackBlocks102[] = { { 4, -32, -64, 0, 12, 8, 1 }, { 5, -64, -32, 0, 12, 7, 0 }, { 6, -64, -64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks103[] = { @@ -3282,7 +3284,7 @@ static const rct_preview_track FlatRideTrackBlocks103[] = { { 4, -32, 64, 0, 12, 4, 1 }, { 5, -64, 32, 0, 12, 11, 0 }, { 6, -64, 64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks104[] = { @@ -3293,7 +3295,7 @@ static const rct_preview_track FlatRideTrackBlocks104[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks105[] = { @@ -3304,7 +3306,7 @@ static const rct_preview_track FlatRideTrackBlocks105[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks106[] = { @@ -3315,7 +3317,7 @@ static const rct_preview_track FlatRideTrackBlocks106[] = { { 4, -32, -64, 0, 12, 8, 1 }, { 5, -64, -32, 0, 12, 7, 0 }, { 6, -64, -64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks107[] = { @@ -3326,7 +3328,7 @@ static const rct_preview_track FlatRideTrackBlocks107[] = { { 4, -32, 64, 0, 12, 4, 1 }, { 5, -64, 32, 0, 12, 11, 0 }, { 6, -64, 64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks108[] = { @@ -3337,7 +3339,7 @@ static const rct_preview_track FlatRideTrackBlocks108[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks109[] = { @@ -3348,7 +3350,7 @@ static const rct_preview_track FlatRideTrackBlocks109[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks110[] = { @@ -3356,7 +3358,7 @@ static const rct_preview_track FlatRideTrackBlocks110[] = { { 1, 0, 32, 0, 0, 15, 0 }, { 2, 32, 0, 0, 0, 15, 0 }, { 3, 32, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks111[] = { @@ -3376,22 +3378,22 @@ static const rct_preview_track FlatRideTrackBlocks111[] = { { 13, 96, 32, 0, 0, 15, 0 }, { 14, 96, 64, 0, 0, 15, 0 }, { 15, 96, 96, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks112[] = { { 0, 0, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks113[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks114[] = { { 0, 0, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks115[] = { @@ -3403,7 +3405,7 @@ static const rct_preview_track FlatRideTrackBlocks115[] = { { 5, 32, 32, 0, 0, 15, 0 }, { 6, 32, 64, 0, 0, 15, 0 }, { 7, 32, 96, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks116[] = { @@ -3412,7 +3414,7 @@ static const rct_preview_track FlatRideTrackBlocks116[] = { { 2, -32, 0, 0, 0, 15, 0 }, { 3, 32, 0, 0, 0, 15, 0 }, { 4, 64, 0, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks117[] = { @@ -3421,12 +3423,12 @@ static const rct_preview_track FlatRideTrackBlocks117[] = { { 2, -64, 0, 0, 16, 15, 0 }, { 3, -96, 0, 0, 16, 15, 0 }, { 4, -128, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks118[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks119[] = { @@ -3434,17 +3436,17 @@ static const rct_preview_track FlatRideTrackBlocks119[] = { { 1, -64, 0, 0, 0, 15, 0 }, { 2, -32, 0, 0, 0, 15, 0 }, { 3, 32, 0, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks120[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks121[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks122[] = { @@ -3452,7 +3454,7 @@ static const rct_preview_track FlatRideTrackBlocks122[] = { { 1, -64, 0, 0, 0, 15, 0 }, { 2, -32, 0, 0, 0, 15, 0 }, { 3, 32, 0, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks123[] = { @@ -3465,7 +3467,7 @@ static const rct_preview_track FlatRideTrackBlocks123[] = { { 6, 32, -32, 0, 0, 15, 0 }, { 7, 32, 32, 0, 0, 15, 0 }, { 8, 32, 0, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks124[] = { @@ -3476,52 +3478,52 @@ static const rct_preview_track FlatRideTrackBlocks124[] = { { 4, -128, 0, 0, 160, 15, 0 }, { 5, -192, 0, 0, 208, 15, 0 }, { 6, -160, 0, 0, 208, 15, 0 }, - { 255, 0, 0, 0, 0, 48, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks125[] = { { 0, 0, 0, 0, 48, 15, 0 }, { 1, 32, 0, 0, 48, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks126[] = { { 0, 0, 0, 0, 8, 15, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks127[] = { { 0, 0, 0, 0, 8, 15, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks128[] = { { 0, 0, 0, 0, 32, 207, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks129[] = { { 0, 0, 0, 0, 32, 63, 4 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks130[] = { { 0, 0, 0, 0, 56, 15, 4 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks131[] = { { 0, 0, 0, 0, 56, 15, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks132[] = { { 0, 0, 0, 0, 24, 63, 0 }, - { 255, 0, 0, 0, 0, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks133[] = { @@ -3530,7 +3532,7 @@ static const rct_preview_track FlatRideTrackBlocks133[] = { { 2, -32, -32, 0, 0, 8, 0 }, { 3, -64, 0, 0, 0, 2, 1 }, { 4, -64, -32, 0, 0, 1, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks134[] = { @@ -3539,7 +3541,7 @@ static const rct_preview_track FlatRideTrackBlocks134[] = { { 2, -32, 32, 0, 0, 4, 0 }, { 3, -64, 0, 0, 0, 1, 1 }, { 4, -64, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks135[] = { @@ -3548,7 +3550,7 @@ static const rct_preview_track FlatRideTrackBlocks135[] = { { 2, 0, 32, 0, 0, 4, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks136[] = { @@ -3557,7 +3559,7 @@ static const rct_preview_track FlatRideTrackBlocks136[] = { { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -32, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks137[] = { @@ -3566,7 +3568,7 @@ static const rct_preview_track FlatRideTrackBlocks137[] = { { 2, -32, -32, 0, 0, 8, 0 }, { 3, -64, 0, 0, 0, 2, 1 }, { 4, -64, -32, 0, 0, 1, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks138[] = { @@ -3575,7 +3577,7 @@ static const rct_preview_track FlatRideTrackBlocks138[] = { { 2, -32, 32, 0, 0, 4, 0 }, { 3, -64, 0, 0, 0, 1, 1 }, { 4, -64, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks139[] = { @@ -3584,7 +3586,7 @@ static const rct_preview_track FlatRideTrackBlocks139[] = { { 2, 0, 32, 0, 0, 4, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks140[] = { @@ -3593,7 +3595,7 @@ static const rct_preview_track FlatRideTrackBlocks140[] = { { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -32, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks141[] = { @@ -3601,7 +3603,7 @@ static const rct_preview_track FlatRideTrackBlocks141[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks142[] = { @@ -3609,7 +3611,7 @@ static const rct_preview_track FlatRideTrackBlocks142[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 1 }, { 3, -32, 32, 0, 16, 2, 0 }, - { 255, 0, 0, 0, 0, 64, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks143[] = { @@ -3617,7 +3619,7 @@ static const rct_preview_track FlatRideTrackBlocks143[] = { { 1, 0, 32, 0, 64, 4, 1 }, { 2, -32, 0, 0, 64, 1, 1 }, { 3, -32, 32, 0, 64, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks144[] = { @@ -3625,7 +3627,7 @@ static const rct_preview_track FlatRideTrackBlocks144[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks145[] = { @@ -3633,7 +3635,7 @@ static const rct_preview_track FlatRideTrackBlocks145[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks146[] = { @@ -3641,7 +3643,7 @@ static const rct_preview_track FlatRideTrackBlocks146[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks147[] = { @@ -3649,7 +3651,7 @@ static const rct_preview_track FlatRideTrackBlocks147[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks148[] = { @@ -3657,7 +3659,7 @@ static const rct_preview_track FlatRideTrackBlocks148[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 1 }, { 3, -32, 32, 0, 16, 2, 0 }, - { 255, 0, 0, 0, 0, 64, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks149[] = { @@ -3665,7 +3667,7 @@ static const rct_preview_track FlatRideTrackBlocks149[] = { { 1, 0, 32, 0, 64, 4, 1 }, { 2, -32, 0, 0, 64, 1, 1 }, { 3, -32, 32, 0, 64, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks150[] = { @@ -3673,7 +3675,7 @@ static const rct_preview_track FlatRideTrackBlocks150[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks151[] = { @@ -3681,7 +3683,7 @@ static const rct_preview_track FlatRideTrackBlocks151[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks152[] = { @@ -3689,7 +3691,7 @@ static const rct_preview_track FlatRideTrackBlocks152[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks153[] = { @@ -3697,7 +3699,7 @@ static const rct_preview_track FlatRideTrackBlocks153[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks154[] = { @@ -3705,7 +3707,7 @@ static const rct_preview_track FlatRideTrackBlocks154[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks155[] = { @@ -3713,7 +3715,7 @@ static const rct_preview_track FlatRideTrackBlocks155[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks156[] = { @@ -3721,7 +3723,7 @@ static const rct_preview_track FlatRideTrackBlocks156[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks157[] = { @@ -3729,7 +3731,7 @@ static const rct_preview_track FlatRideTrackBlocks157[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks158[] = { @@ -3737,7 +3739,7 @@ static const rct_preview_track FlatRideTrackBlocks158[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks159[] = { @@ -3745,7 +3747,7 @@ static const rct_preview_track FlatRideTrackBlocks159[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks160[] = { @@ -3753,7 +3755,7 @@ static const rct_preview_track FlatRideTrackBlocks160[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks161[] = { @@ -3761,7 +3763,7 @@ static const rct_preview_track FlatRideTrackBlocks161[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks162[] = { @@ -3769,7 +3771,7 @@ static const rct_preview_track FlatRideTrackBlocks162[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks163[] = { @@ -3777,7 +3779,7 @@ static const rct_preview_track FlatRideTrackBlocks163[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks164[] = { @@ -3785,7 +3787,7 @@ static const rct_preview_track FlatRideTrackBlocks164[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks165[] = { @@ -3793,7 +3795,7 @@ static const rct_preview_track FlatRideTrackBlocks165[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks166[] = { @@ -3801,7 +3803,7 @@ static const rct_preview_track FlatRideTrackBlocks166[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks167[] = { @@ -3809,7 +3811,7 @@ static const rct_preview_track FlatRideTrackBlocks167[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks168[] = { @@ -3817,7 +3819,7 @@ static const rct_preview_track FlatRideTrackBlocks168[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks169[] = { @@ -3825,7 +3827,7 @@ static const rct_preview_track FlatRideTrackBlocks169[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks170[] = { @@ -3833,7 +3835,7 @@ static const rct_preview_track FlatRideTrackBlocks170[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks171[] = { @@ -3841,45 +3843,45 @@ static const rct_preview_track FlatRideTrackBlocks171[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks172[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks173[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks174[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 0, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks175[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 0, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks176[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -32, 16, 15, 0 }, { 2, -64, 0, -32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 71 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks177[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -32, 16, 15, 0 }, { 2, -64, 0, -32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 71 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks178[] = { @@ -3887,7 +3889,7 @@ static const rct_preview_track FlatRideTrackBlocks178[] = { { 1, 0, -32, 0, 16, 8, 1 }, { 2, -32, 0, 0, 16, 2, 0 }, { 3, -32, -32, 16, 16, 103, 0 }, - { 255, 0, 0, 0, 0, 16, 139 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks179[] = { @@ -3895,7 +3897,7 @@ static const rct_preview_track FlatRideTrackBlocks179[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 0 }, { 3, -32, 32, 16, 16, 155, 0 }, - { 255, 0, 0, 4096, 0, 16, 55 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks180[] = { @@ -3903,7 +3905,7 @@ static const rct_preview_track FlatRideTrackBlocks180[] = { { 1, 0, -32, 0, 16, 8, 1 }, { 2, -32, 0, 0, 16, 2, 0 }, { 3, -32, -32, 0, 0, 23, 0 }, - { 255, 0, 0, 4096, 0, 16, 59 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks181[] = { @@ -3911,12 +3913,12 @@ static const rct_preview_track FlatRideTrackBlocks181[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 0 }, { 3, -32, 32, 0, 0, 43, 0 }, - { 255, 0, 0, 0, 0, 24, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks182[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks183[] = { @@ -3927,7 +3929,7 @@ static const rct_preview_track FlatRideTrackBlocks183[] = { { 4, -128, -32, 120, 96, 15, 0 }, { 5, -96, -32, 64, 192, 15, 0 }, { 6, -64, -32, 248, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 24, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks184[] = { @@ -3938,7 +3940,7 @@ static const rct_preview_track FlatRideTrackBlocks184[] = { { 4, -128, 32, 120, 96, 15, 0 }, { 5, -96, 32, 64, 192, 15, 0 }, { 6, -64, 32, 248, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks185[] = { @@ -3949,7 +3951,7 @@ static const rct_preview_track FlatRideTrackBlocks185[] = { { 4, 0, -32, -248, 56, 15, 0 }, { 5, 32, -32, -264, 40, 207, 0 }, { 6, 64, -32, -280, 24, 207, 0 }, - { 255, 0, 0, -8192, 255, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks186[] = { @@ -3960,35 +3962,35 @@ static const rct_preview_track FlatRideTrackBlocks186[] = { { 4, 0, 32, -248, 56, 15, 0 }, { 5, 32, 32, -264, 40, 207, 0 }, { 6, 64, 32, -280, 24, 207, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks187[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks188[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks189[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks190[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks191[] = { @@ -3996,7 +3998,7 @@ static const rct_preview_track FlatRideTrackBlocks191[] = { { 1, -32, 0, 16, 16, 207, 0 }, { 2, -64, 0, 32, 96, 3, 0 }, { 3, -32, 0, 120, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks192[] = { @@ -4004,35 +4006,35 @@ static const rct_preview_track FlatRideTrackBlocks192[] = { { 1, -32, 0, -88, 96, 3, 0 }, { 2, 0, 0, -104, 16, 207, 0 }, { 3, 32, 0, -120, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks193[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 7, 0 }, { 2, -32, -32, 48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks194[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 11, 0 }, { 2, -32, 32, 48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks195[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, -24, 32, 7, 0 }, { 2, -32, -32, -48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks196[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, -24, 32, 11, 0 }, { 2, -32, 32, -48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks197[] = { @@ -4040,7 +4042,7 @@ static const rct_preview_track FlatRideTrackBlocks197[] = { { 1, -32, 0, 0, 32, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, { 3, 0, 0, 32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks198[] = { @@ -4048,7 +4050,7 @@ static const rct_preview_track FlatRideTrackBlocks198[] = { { 1, -32, 0, -32, 32, 15, 0 }, { 2, -64, 0, -16, 0, 15, 0 }, { 3, 0, 0, -32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks199[] = { @@ -4058,7 +4060,7 @@ static const rct_preview_track FlatRideTrackBlocks199[] = { { 3, -96, 0, 0, 0, 15, 0 }, { 4, -128, 0, 0, 0, 15, 0 }, { 5, -160, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks200[] = { @@ -4068,39 +4070,39 @@ static const rct_preview_track FlatRideTrackBlocks200[] = { { 3, -96, 0, 0, 0, 15, 0 }, { 4, -128, 0, 0, 0, 15, 0 }, { 5, -160, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks201[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks202[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks203[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks204[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, { 2, -32, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks205[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, { 2, -32, -32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks206[] = { @@ -4108,14 +4110,14 @@ static const rct_preview_track FlatRideTrackBlocks206[] = { { 1, -32, 0, -40, 32, 15, 4 }, { 2, -64, 0, -96, 56, 15, 4 }, { 3, -96, 0, -96, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 0, 0 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks207[] = { { 0, 0, 0, 0, 56, 15, 4 }, { 1, 32, 0, 56, 32, 15, 4 }, { 2, 64, 0, 96, 16, 15, 4 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks208[] = { @@ -4123,7 +4125,7 @@ static const rct_preview_track FlatRideTrackBlocks208[] = { { 1, -32, 0, -72, 32, 15, 4 }, { 2, -64, 0, -128, 56, 15, 4 }, { 3, -96, 0, -128, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks209[] = { @@ -4131,7 +4133,7 @@ static const rct_preview_track FlatRideTrackBlocks209[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 8, 2, 0 }, { 3, -32, -32, 0, 8, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks210[] = { @@ -4139,7 +4141,7 @@ static const rct_preview_track FlatRideTrackBlocks210[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 8, 1, 0 }, { 3, -32, 32, 0, 8, 11, 0 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks211[] = { @@ -4149,7 +4151,7 @@ static const rct_preview_track FlatRideTrackBlocks211[] = { { 3, -64, -32, 0, 0, 15, 0 }, { 4, -32, 0, 0, 0, 15, 0 }, { 5, -64, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks212[] = { @@ -4159,7 +4161,7 @@ static const rct_preview_track FlatRideTrackBlocks212[] = { { 3, -64, 32, 0, 0, 15, 0 }, { 4, -32, 0, 0, 0, 15, 0 }, { 5, -64, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks213[] = { @@ -4167,13 +4169,13 @@ static const rct_preview_track FlatRideTrackBlocks213[] = { { 1, 32, 0, 0, 32, 15, 0 }, { 2, -64, 0, 0, 32, 15, 0 }, { 3, -32, 0, 0, 32, 15, 0 }, - { 255, 0, 0, 0, 0, 48, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks214[] = { { 0, 0, 0, 0, 48, 15, 0 }, { 1, 32, 0, 0, 48, 15, 0 }, - { 255, 0, 0, 0, 0, 208, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks215[] = { @@ -4184,12 +4186,12 @@ static const rct_preview_track FlatRideTrackBlocks215[] = { { 4, -96, 0, 0, 48, 15, 0 }, { 5, -128, 0, 0, 32, 15, 0 }, { 6, -160, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks216[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks217[] = { @@ -4197,7 +4199,7 @@ static const rct_preview_track FlatRideTrackBlocks217[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 16, 16, 103, 0 }, - { 255, 0, 0, 0, 0, 16, 139 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks218[] = { @@ -4205,7 +4207,7 @@ static const rct_preview_track FlatRideTrackBlocks218[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 16, 16, 155, 0 }, - { 255, 0, 0, 4096, 0, 16, 55 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks219[] = { @@ -4213,7 +4215,7 @@ static const rct_preview_track FlatRideTrackBlocks219[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 0, 16, 23, 0 }, - { 255, 0, 0, 4096, 0, 16, 59 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks220[] = { @@ -4221,7 +4223,7 @@ static const rct_preview_track FlatRideTrackBlocks220[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 0, 16, 43, 0 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks221[] = { @@ -4232,7 +4234,7 @@ static const rct_preview_track FlatRideTrackBlocks221[] = { { 4, -32, -64, 48, 0, 8, 1 }, { 5, -64, -32, 32, 16, 71, 0 }, { 6, -64, -64, 48, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks222[] = { @@ -4243,7 +4245,7 @@ static const rct_preview_track FlatRideTrackBlocks222[] = { { 4, -32, 64, 48, 0, 4, 1 }, { 5, -64, 32, 32, 16, 139, 0 }, { 6, -64, 64, 48, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks223[] = { @@ -4254,7 +4256,7 @@ static const rct_preview_track FlatRideTrackBlocks223[] = { { 4, -32, -64, 16, 0, 8, 1 }, { 5, -64, -32, 16, 16, 23, 0 }, { 6, -64, -64, 0, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks224[] = { @@ -4265,158 +4267,158 @@ static const rct_preview_track FlatRideTrackBlocks224[] = { { 4, -32, 64, 16, 0, 4, 1 }, { 5, -64, 32, 16, 16, 43, 0 }, { 6, -64, 64, 0, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks225[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks226[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks227[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks228[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks229[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks230[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks231[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks232[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks233[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks234[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks235[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks236[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks237[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks238[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks239[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks240[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks241[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks242[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks243[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks244[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks245[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks246[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks247[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks248[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks249[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, 32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks250[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, -32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks251[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, 32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks252[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, -32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks253[] = { { 0, 0, 0, 0, 56, 15, 4 }, { 1, 32, 0, 56, 32, 15, 4 }, { 2, 64, 0, 96, 16, 15, 4 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks254[] = { @@ -4424,7 +4426,7 @@ static const rct_preview_track FlatRideTrackBlocks254[] = { { 1, -32, 0, -72, 32, 15, 4 }, { 2, -64, 0, -128, 56, 15, 4 }, { 3, -96, 0, -128, 0, 0, 5 }, - { 255, 0, 0, 8192, 0, 56, 15 } + TRACK_BLOCK_END }; // rct2: 0x00994A38 From 63698761fd829e1f10c135fa20b3cc90dd5584fc Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 01:57:50 +0100 Subject: [PATCH 0124/1173] remove some small callprocs --- src/drawing/drawing.h | 1 + src/drawing/string.c | 27 +++++++++++++++++ src/windows/editor_objective_options.c | 30 ++++++++++++++++-- src/windows/game_bottom_toolbar.c | 42 +++++++++++++++----------- 4 files changed, 80 insertions(+), 20 deletions(-) diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 55217eff9c..65ccb9267e 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -131,6 +131,7 @@ void draw_string_centred_raw(rct_drawpixelinfo *dpi, int x, int y, int numLines, void gfx_draw_string_right(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y); void draw_string_right_underline(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y); int string_get_height_raw(char *buffer); +void sub_6C1F57(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct_string_id format, void *args, int ticks); // rain void update_rain_animation(); diff --git a/src/drawing/string.c b/src/drawing/string.c index d0c575f963..ebf4c47f23 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -1218,4 +1218,31 @@ int string_get_height_raw(char *buffer) } return height; +} + +/** + * + * rct2: 0x006C1F57 + * + * colour : al + * format : bx + * x : cx + * y : dx + * text : esi + * dpi : edi + * width : bp + * ticks : ebp >> 16 + */ +void sub_6C1F57(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct_string_id format, void *args, int ticks) +{ + RCT2_CALLPROC_X( + 0x006C1F57, + colour, + format, + x, + y, + (int)args, + (int)dpi, + (width & 0xFFFF) | (ticks << 16) + ); } \ No newline at end of file diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index 52071d8287..32bf8d52ab 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -243,6 +243,8 @@ static uint64 window_editor_objective_options_page_hold_down_widgets[] = { #pragma endregion +static void window_editor_objective_options_update_disabled_widgets(rct_window *w); + /** * * rct2: 0x0067137D @@ -271,7 +273,7 @@ void window_editor_objective_options_open() w->selected_tab = WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_MAIN; w->no_list_items = 0; w->selected_list_item = -1; - RCT2_CALLPROC_X(0x00672609, 0, 0, 0, 0, (int)w, 0, 0); + window_editor_objective_options_update_disabled_widgets(w); } static void window_editor_objective_options_set_pressed_tab(rct_window *w) @@ -337,7 +339,7 @@ static void window_editor_objective_options_set_page(rct_window *w, int page) w->event_handlers = window_editor_objective_options_page_events[page]; w->widgets = window_editor_objective_options_widgets[page]; window_invalidate(w); - RCT2_CALLPROC_X(0x00672609, 0, 0, 0, 0, (int)w, 0, 0); + window_editor_objective_options_update_disabled_widgets(w); window_event_resize_call(w); window_event_invalidate_call(w); window_init_scroll_widgets(w); @@ -1284,4 +1286,28 @@ static void window_editor_objective_options_rides_scrollpaint() // Ride name gfx_draw_string_left(dpi, stringId, &ride->name, 0, 15, y); } +} + +/** + * + * rct2: 0x00672609 + */ +static void window_editor_objective_options_update_disabled_widgets(rct_window *w) +{ + rct_ride *ride; + int i, numRides; + + // Check if there are any rides (not shops or facilities) + numRides = 0; + FOR_ALL_RIDES(i, ride) { + if (gRideClassifications[ride->type] == RIDE_CLASS_RIDE) { + numRides++; + } + } + + if (numRides == 0) { + w->disabled_widgets &= ~(1 << WIDX_TAB_2); + } else { + w->disabled_widgets |= (1 << WIDX_TAB_2); + } } \ No newline at end of file diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index b82b44e553..16c01ce4b9 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -120,6 +120,8 @@ static void* window_game_bottom_toolbar_events[] = { window_game_bottom_toolbar_emptysub }; +static void window_game_bottom_toolbar_invalidate_dirty_widgets(rct_window *w); + /** * Creates the main game bottom toolbar window. * rct2: 0x0066B52F (part of 0x0066B3E8) @@ -521,34 +523,32 @@ static void window_game_bottom_toolbar_draw_right_panel(rct_drawpixelinfo *dpi, */ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rct_window *w) { - int x, y; + int x, y, width; + rct_string_id stringId; rct_news_item *newsItem; + rct_widget *middleOutsetWidget; + middleOutsetWidget = &window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET]; newsItem = &(RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item)[0]); // Current news item gfx_fill_rect_inset( dpi, - w->x + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].left + 1, - w->y + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].top + 1, - w->x + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].right - 1, - w->y + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].bottom - 1, + w->x + middleOutsetWidget->left + 1, + w->y + middleOutsetWidget->top + 1, + w->x + middleOutsetWidget->right - 1, + w->y + middleOutsetWidget->bottom - 1, w->colours[2], 48 ); // Text + stringId = 1926; + // memcpy((char*)language_get_string(1926), &newsItem->colour, 256); memcpy((void*)0x009B5F2C, &newsItem->colour, 256); - RCT2_CALLPROC_X( - 0x006C1F57, - 14, - 1926, - (window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].left + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].right) / 2 + w->x, - w->y + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].top + 11, - 0, - (int)dpi, - (newsItem->ticks << 16) | (window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].right - window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].left - 62) - ); + x = w->x + (middleOutsetWidget->left + middleOutsetWidget->right) / 2; + y = w->y + middleOutsetWidget->top + 11; + sub_6C1F57(dpi, x, y, width, 14, stringId, NULL, newsItem->ticks); x = w->x + window_game_bottom_toolbar_widgets[WIDX_NEWS_SUBJECT].left; y = w->y + window_game_bottom_toolbar_widgets[WIDX_NEWS_SUBJECT].top; @@ -635,10 +635,10 @@ static void window_game_bottom_toolbar_draw_tutorial_text(rct_drawpixelinfo *dpi static void window_game_bottom_toolbar_update(rct_window* w){ w->frame_no++; - if (w->frame_no >= 24)w->frame_no = 0; + if (w->frame_no >= 24) + w->frame_no = 0; - // Due to windows not fully finished use callproc to save on duplicate code. - RCT2_CALLPROC_X((int)window_game_bottom_toolbar_unknown05, 0, 0, 0, 0, (int)w, 0, 0); + window_game_bottom_toolbar_invalidate_dirty_widgets(w); } /* rct2: 0x006C644 */ @@ -664,6 +664,12 @@ static void window_game_bottom_toolbar_unknown05(){ window_get_register(w); + window_game_bottom_toolbar_invalidate_dirty_widgets(w); +} + +/* rct2: 0x0066C6F2 */ +static void window_game_bottom_toolbar_invalidate_dirty_widgets(rct_window *w) +{ if (RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint16) & BTM_TB_DIRTY_FLAG_MONEY){ RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint16) &= ~BTM_TB_DIRTY_FLAG_MONEY; widget_invalidate(w, WIDX_LEFT_INSET); From 0a1cd305976062c7d18637b3915efc2376f45119 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 28 Jun 2015 04:00:16 +0100 Subject: [PATCH 0125/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 12 ++++++------ data/language/english_us.txt | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index bc5d1937eb..f8df060fd2 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -42,7 +42,7 @@ STR_0040 :Bewegingssimulator STR_0041 :3D-bioscoop STR_0042 :Topspin STR_0043 :Ruimteringen -STR_0044 :Omgekeerde vrijevalachtbaan +STR_0044 :Achterwaartsevrijevalachtbaan STR_0045 :Lift STR_0046 :Verticale achtbaan STR_0047 :Geldautomaat @@ -51,7 +51,7 @@ STR_0049 :Spookhuis STR_0050 :Eerste hulp STR_0051 :Circus STR_0052 :Spooktrein -STR_0053 :Hyper-twisterachtbaan +STR_0053 :Twisterachtbaan STR_0054 :Houten achtbaan STR_0055 :Zijfrictie-achtbaan STR_0056 :Wilde muis @@ -522,9 +522,9 @@ STR_0520 :Een aanlegsteiger waar bezoekers in een bootje kunnen gaan om over STR_0521 :Een intense, snelle en kronkelende achtbaan met scherpe bochten en afdalingen. STR_0522 :Een kleinere achtbaan waar de passagiers boven de baan en op het karretje zitten. STR_0523 :Bezoekers rijden langzaam over een baan in aangedreven karretjes. -STR_0524 : +STR_0524 :Een vrijevalwagen wordt pneumatisch langs een hoge stalen toren gelanceerd en gaat daarna in een vrije val weer naar beneden. STR_0525 :Passagiers rijden over een kronkelende baan, waarbij ze enkel worden geleid door de ronding en banking van de halfronde baan. -STR_0526 :Een vrijvalwagen wordt pneumatisch langs een hoge stalen toren gelanceerd en gaat daarna in een vrije val weer naar beneden. +STR_0526 :Bezoekers gaan in een roterende observatiecabine langs een toren omhoog STR_0527 :Een soepele stalen achtbaan die verticale loopings kan maken. STR_0528 :Passagiers varen in opblaasboten door een kronkelende halfopen of compleet gesloten glijbaan. STR_0529 :Achtbaantreinen in de vorm van een mijntrein razen over stalen achtbaanrails die er uitziet als een oude spoorbaan. @@ -894,7 +894,7 @@ STR_0892 :Screenshot opgeslagen als '{STRINGID}' STR_0893 :Screenshot maken mislukt! STR_0894 :"Landscape data area" zit vol! STR_0895 :Kan niet gedeeltelijk onder en boven de grond bouwen -STR_0896 :{POP16}{POP16}{STRINGID} Constructie +STR_0896 :{POP16}{POP16}Constructie {STRINGID} STR_0897 :Richting STR_0898 :{SMALLFONT}{BLACK}Bocht naar links STR_0899 :{SMALLFONT}{BLACK}Bocht naar rechts @@ -903,7 +903,7 @@ STR_0901 :{SMALLFONT}{BLACK}Bocht naar rechts (kleine straal) STR_0902 :{SMALLFONT}{BLACK}Bocht naar links (zeer kleine straal) STR_0903 :{SMALLFONT}{BLACK}Bocht naar rechts (zeer kleine straal) STR_0904 :{SMALLFONT}{BLACK}Bocht naar links (grote straal) -STR_0905 :{SMALLFONT}{BLACK}Bocht naar rechts (straal) +STR_0905 :{SMALLFONT}{BLACK}Bocht naar rechts (grote straal) STR_0906 :{SMALLFONT}{BLACK}Recht stuk STR_0907 :Helling STR_0908 :Roll/Banking diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 8e5b3551cc..c2883e1794 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -525,9 +525,9 @@ STR_0520 :A dock platform where guests can drive/row personal watercraft on a STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them STR_0523 :Riders travel slowly in powered vehicles along a track-based route -STR_0524 : +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track -STR_0526 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0526 :Passengers travel in an rotating observation cabin which travels up a tall tower STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track From ae4340520ccf5acbd6ee962d9fdd3ea5150cff7b Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sun, 28 Jun 2015 08:20:05 +0200 Subject: [PATCH 0126/1173] Add more translators to contributors.md --- contributors.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contributors.md b/contributors.md index 7ef94f24ca..d26dadee44 100644 --- a/contributors.md +++ b/contributors.md @@ -65,9 +65,11 @@ Includes all git commit authors. Aliases are GitHub user names. ## Translation * English (UK) - Ted John (IntelOrca), (Tinytimrob) -* French - (fbourigault) -* German - (atmaxinger), (Yepoleb) +* English (US) - Ted John (IntelOrca), Michael Steenbeek (Gymnasiast) +* French - (fbourigault), Michael Steenbeek (Gymnasiast) +* German - (danidoedel), (atmaxinger), (Yepoleb) * Dutch - Michael Steenbeek (Gymnasiast), (hostbrute), (mrtnptrs), (xzbobzx) +* Portuguese (BR) - (kaudy) * Spanish - (mdtrooper) * Swedish - (Jinxit), (mharrys) From fb9fe6615b2bb3664d6707f471ae2db1d57f72dc Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sun, 28 Jun 2015 11:11:07 +0200 Subject: [PATCH 0127/1173] Fix typo --- data/language/english_uk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 1bc1d8a163..a9c503b1c6 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -527,7 +527,7 @@ STR_0522 :A smaller roller coaster where the riders sit above the track with STR_0523 :Riders travel slowly in powered vehicles along a track-based route STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track -STR_0526 :Passengers travel in an rotating observation cabin which travels up a tall tower +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track From b8fa25bcb6c7ce65894f45d311fadc78e67591ed Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 11:12:43 +0100 Subject: [PATCH 0128/1173] fix brakes speed not being set when building track --- src/windows/ride_construction.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 1149e47c0a..713891cd89 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -458,7 +458,7 @@ static void window_ride_construction_draw_track_piece( ); static void window_ride_construction_update_enabled_track_pieces(); void sub_6C94D8(); -static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *seatRotation); +static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *properties); static void sub_6CBCE2( int rideIndex, int trackType, int trackDirection, int edx, int originX, int originY, int originZ @@ -1561,13 +1561,13 @@ static void window_ride_construction_dropdown() */ static void window_ride_construction_construct(rct_window *w) { - int trackType, trackDirection, rideIndex, edxRS16, x, y, z, seatRotation; + int trackType, trackDirection, rideIndex, edxRS16, x, y, z, properties; track_begin_end trackBeginEnd; _currentTrackPrice = MONEY32_UNDEFINED; RCT2_GLOBAL(0x00F44074, money32) = MONEY32_UNDEFINED; sub_6C9627(); - if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, &seatRotation)) { + if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, &properties)) { sub_6C84CE(); return; } @@ -1579,7 +1579,7 @@ static void window_ride_construction_construct(rct_window *w) y, rideIndex | (trackType << 8) | (edxRS16 << 16), GAME_COMMAND_PLACE_TRACK, - z | (seatRotation << 28), + z | (properties << 16), 0 ); if (RCT2_GLOBAL(0x00F44074, money32) == MONEY32_UNDEFINED) { @@ -2310,7 +2310,7 @@ void sub_6C84CE() * dh: trackType (out) * edx >> 16: ??? (out) */ -static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *seatRotation) +static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *properties) { int eax, ebx, ecx, edx, esi, edi, ebp; if (RCT2_CALLFUNC_X(0x006CA2DF, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) @@ -2323,7 +2323,7 @@ static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int if (x != NULL) *x = eax & 0xFFFF; if (y != NULL) *y = ecx & 0xFFFF; if (z != NULL) *z = edi & 0xFFFF; - if (seatRotation != NULL) *seatRotation = (edi >> 28) & 0xF; + if (properties != NULL) *properties = (edi >> 16) & 0xFFFF; return false; } @@ -3367,13 +3367,13 @@ static void ride_construction_toolupdate_entrance_exit(int screenX, int screenY) */ static void ride_construction_tooldown_construct(int screenX, int screenY) { - int trackType, trackDirection, rideIndex, edxRS16, x, y, z, seatRotation, highestZ; + int trackType, trackDirection, rideIndex, edxRS16, x, y, z, properties, highestZ; rct_window *w; map_invalidate_map_selection_tiles(); sub_6C9627(); - if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, &seatRotation)) + if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, &properties)) return; _currentTrackPieceType = trackType; From 36d6ea7a6e6cd18de62ecae7ff9182bb58fd3f09 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 11:44:34 +0100 Subject: [PATCH 0129/1173] fix setting brakes speed on current track and implement game command --- src/game.c | 4 +-- src/game.h | 2 +- src/ride/track.c | 44 +++++++++++++++++++++++++++++++ src/ride/track.h | 1 + src/windows/game_bottom_toolbar.c | 1 + src/windows/ride_construction.c | 38 +++++++++++++------------- 6 files changed, 68 insertions(+), 22 deletions(-) diff --git a/src/game.c b/src/game.c index cfd8ba82b1..9e6139775e 100644 --- a/src/game.c +++ b/src/game.c @@ -934,7 +934,7 @@ static uint32 game_do_command_table[58] = { 0x0068BC01, 0, 0, - 0x006C5AE9, + 0, 0, // use new_game_command_table, original: 0x006BEFA1, 29 0, // 30 0, @@ -997,7 +997,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_emptysub, game_command_raise_water, game_command_lower_water, - game_command_emptysub, + game_command_set_brakes_speed, game_command_hire_new_staff_member, //game_command_emptysub, game_command_set_staff_patrol, // 30 game_command_fire_staff_member, diff --git a/src/game.h b/src/game.h index 91c3212236..3b00c7ea43 100644 --- a/src/game.h +++ b/src/game.h @@ -52,7 +52,7 @@ enum GAME_COMMAND { GAME_COMMAND_EDIT_LAND_SMOOTH, GAME_COMMAND_RAISE_WATER, GAME_COMMAND_LOWER_WATER, - GAME_COMMAND_28, + GAME_COMMAND_SET_BRAKES_SPEED, GAME_COMMAND_HIRE_NEW_STAFF_MEMBER, // 29 GAME_COMMAND_SET_STAFF_PATROL, //30 GAME_COMMAND_FIRE_STAFF_MEMBER, // 31 diff --git a/src/ride/track.c b/src/ride/track.c index ae0de4c416..8ff1fd2e03 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3458,4 +3458,48 @@ void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) { RCT2_CALLFUNC_X(0x006C5B69, eax, ebx, ecx, edx, esi, edi, ebp); +} + +/** + * + * rct2: 0x006C5AE9 + */ +void game_command_set_brakes_speed(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) +{ + rct_map_element *mapElement; + int x, y, z, trackType, brakesSpeed; + + x = (*eax & 0xFFFF); + y = (*ecx & 0xFFFF); + z = (*edi & 0xFFFF); + trackType = (*edx & 0xFF); + brakesSpeed = ((*ebx >> 8) & 0xFF); + + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 0; + RCT2_GLOBAL(0x009DEA5E, uint8) = x + 16; + RCT2_GLOBAL(0x009DEA60, uint8) = y + 16; + RCT2_GLOBAL(0x009DEA62, uint8) = z; + + if (*ebx & GAME_COMMAND_FLAG_APPLY) { + *ebx = 0; + return; + } + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (mapElement->base_height * 8 != z) + continue; + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) + continue; + if (mapElement->properties.track.type != trackType) + continue; + + mapElement->properties.track.sequence = + (mapElement->properties.track.sequence & 0x0F) | + ((brakesSpeed >> 1) << 4); + + break; + } while (!map_element_is_last_for_tile(mapElement++)); + + *ebx = 0; } \ No newline at end of file diff --git a/src/ride/track.h b/src/ride/track.h index 197a516d59..39c05890c7 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -496,5 +496,6 @@ const rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackT void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +void game_command_set_brakes_speed(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); #endif diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index 16c01ce4b9..d86e41ff3c 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -548,6 +548,7 @@ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rc memcpy((void*)0x009B5F2C, &newsItem->colour, 256); x = w->x + (middleOutsetWidget->left + middleOutsetWidget->right) / 2; y = w->y + middleOutsetWidget->top + 11; + width = middleOutsetWidget->right - middleOutsetWidget->left - 62; sub_6C1F57(dpi, x, y, width, 14, stringId, NULL, newsItem->ticks); x = w->x + window_game_bottom_toolbar_widgets[WIDX_NEWS_SUBJECT].left; diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 713891cd89..ac1c424f12 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -471,7 +471,7 @@ money32 sub_6CA162(int rideIndex, int trackType, int trackDirection, int edxRS16 static void window_ride_construction_show_special_track_dropdown(rct_window *w, rct_widget *widget); static void ride_selected_track_set_seat_rotation(int seatRotation); static void loc_6C7502(int al); -static void loc_6C76E9(); +static void ride_construction_set_brakes_speed(int brakesSpeed); static void ride_construction_toolupdate_construct(int screenX, int screenY); static void ride_construction_toolupdate_entrance_exit(int screenX, int screenY); @@ -1442,18 +1442,18 @@ static void window_ride_construction_mousedown(int widgetIndex, rct_window *w, r _currentTrackPrice = MONEY32_UNDEFINED; sub_6C84CE(); } else { - uint8 *ebp = (uint8*)0x00F440CD; - uint8 bl = 30; + uint8 *brakesSpeedPtr = (uint8*)0x00F440CD; + uint8 maxBrakesSpeed = 30; if (RCT2_GLOBAL(0x00F440D3, uint8) != 1) { - ebp = (uint8*)0x00F440CE; - bl = RCT2_GLOBAL(0x0097CF40 + 6 + (ride->type * 8), uint8); + brakesSpeedPtr = (uint8*)0x00F440CE; + maxBrakesSpeed = RCT2_GLOBAL(0x0097CF40 + 6 + (ride->type * 8), uint8); } - uint8 bh = *ebp + 2; - if (bh <= bl) { + uint8 brakesSpeed = *brakesSpeedPtr + 2; + if (brakesSpeed <= maxBrakesSpeed) { if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { - loc_6C76E9(); + ride_construction_set_brakes_speed(brakesSpeed); } else { - *ebp = bh; + *brakesSpeedPtr = brakesSpeed; sub_6C84CE(); } } @@ -1466,16 +1466,16 @@ static void window_ride_construction_mousedown(int widgetIndex, rct_window *w, r _currentTrackPrice = MONEY32_UNDEFINED; sub_6C84CE(); } else { - uint8 *ebp = (uint8*)0x00F440CD; + uint8 *brakesSpeedPtr = (uint8*)0x00F440CD; if (RCT2_GLOBAL(0x00F440D3, uint8) != 1) { - ebp = (uint8*)0x00F440CE; + brakesSpeedPtr = (uint8*)0x00F440CE; } - uint8 bh = *ebp - 2; - if (bh >= 2) { + uint8 brakesSpeed = *brakesSpeedPtr - 2; + if (brakesSpeed >= 2) { if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { - loc_6C76E9(); + ride_construction_set_brakes_speed(brakesSpeed); } else { - *ebp = bh; + *brakesSpeedPtr = brakesSpeed; sub_6C84CE(); } } @@ -3172,7 +3172,7 @@ static void loc_6C7502(int al) * * rct2: 0x006C76E9 */ -static void loc_6C76E9() +static void ride_construction_set_brakes_speed(int brakesSpeed) { rct_map_element *mapElement; int x, y, z; @@ -3180,13 +3180,13 @@ static void loc_6C76E9() x = _currentTrackBeginX; y = _currentTrackBeginY; z = _currentTrackBeginZ; - if (sub_6C683D(&x, &y, &z, _currentTrackPieceDirection & 3, _currentTrackPieceType, 0, &mapElement, 0)) { + if (!sub_6C683D(&x, &y, &z, _currentTrackPieceDirection & 3, _currentTrackPieceType, 0, &mapElement, 0)) { game_do_command( _currentTrackBeginX, - GAME_COMMAND_FLAG_APPLY | ((_currentTrackPieceDirection & 3) << 8), + GAME_COMMAND_FLAG_APPLY | ((brakesSpeed) << 8), _currentTrackBeginY, mapElement->properties.track.type, - GAME_COMMAND_28, + GAME_COMMAND_SET_BRAKES_SPEED, _currentTrackBeginZ, 0 ); From 9feff63c6d6086e6b3653bb42ab80a3a021b83b3 Mon Sep 17 00:00:00 2001 From: Maikel Stuivenberg Date: Sun, 28 Jun 2015 13:36:46 +0200 Subject: [PATCH 0130/1173] Remove viewport flag --- src/interface/keyboard_shortcut.c | 8 ++++---- src/interface/viewport.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index 6aa94b916a..be2e210dcc 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -230,13 +230,13 @@ static void shortcut_remove_vertical_land_toggle() static void shortcut_remove_top_bottom_toolbar_toggle() { - toggle_view_flag(VIEWPORT_FLAG_HIDE_TOP_BOTTOM_TOOLBAR); - - if (window_get_main()->viewport->flags & VIEWPORT_FLAG_HIDE_TOP_BOTTOM_TOOLBAR){ + if (window_find_by_class(WC_TOP_TOOLBAR) != NULL) + { window_close(window_find_by_class(WC_TOP_TOOLBAR)); window_close(window_find_by_class(WC_BOTTOM_TOOLBAR)); } - else { + else + { window_top_toolbar_open(); window_game_bottom_toolbar_open(); } diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 5836314b0a..62cfa47c7f 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -41,7 +41,7 @@ enum { VIEWPORT_FLAG_HIDE_BASE = (1 << 12), VIEWPORT_FLAG_HIDE_VERTICAL = (1 << 13), VIEWPORT_FLAG_INVISIBLE_SPRITES = (1 << 14), - VIEWPORT_FLAG_HIDE_TOP_BOTTOM_TOOLBAR = (1 << 15), + VIEWPORT_FLAG_15 = (1 << 15) }; enum { From e72739dbd69f28598380105870a1d9993d92d40a Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 25 Jun 2015 15:14:36 +0200 Subject: [PATCH 0131/1173] Add cheat to force park rating --- data/language/english_uk.txt | 4 +-- src/localisation/string_ids.h | 2 ++ src/windows/cheats.c | 56 ++++++++++++++++++++++++++++++++++- src/world/park.c | 18 +++++++++++ src/world/park.h | 3 ++ 5 files changed, 80 insertions(+), 3 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 24f2a80331..9dfebb576a 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3775,10 +3775,10 @@ STR_5438 :Can't make changes while command editor is open STR_5439 :A wait command with at least 4 seconds is required with a restart command STR_5440 :Minimise fullscreen on focus loss STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. -STR_5442 :reserved +STR_5442 :Force park rating: STR_5443 :Speed{MOVE_X}{87}{STRINGID} STR_5444 :Speed: STR_5445 :Speed STR_5446 :Get STR_5447 :Type {STRINGID} -STR_5448 :Ride / Vehicle {STRINGID} +STR_5448 :Ride / Vehicle {STRINGID} \ No newline at end of file diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 464d3f454d..910ee249d1 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1719,6 +1719,8 @@ enum { STR_UP = 5375, STR_DOWN = 5376, + STR_FORCE_PARK_RATING = 5442, + STR_OBJECTS_SORT_TYPE = 5447, STR_OBJECTS_SORT_RIDE = 5448, diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 2d00ef2203..577e3fb52e 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -40,6 +40,8 @@ #define CHEATS_MONEY_INCREMENT MONEY(5000,00) #define CHEATS_TRAM_INCREMENT 250 +#define CHEATS_PARK_RATING_SPINNER_PAUSE 20 + enum { WINDOW_CHEATS_PAGE_MONEY, WINDOW_CHEATS_PAGE_GUESTS, @@ -96,6 +98,10 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_FAST_STAFF, WIDX_NORMAL_STAFF, WIDX_PARK_PARAMETERS, + WIDX_FORCE_PARK_RATING, + WIDX_PARK_RATING_SPINNER, + WIDX_INCREASE_PARK_RATING, + WIDX_DECREASE_PARK_RATING, WIDX_RENEW_RIDES = 8, WIDX_REMOVE_SIX_FLAGS, WIDX_MAKE_DESTRUCTIBLE, @@ -214,6 +220,10 @@ static rct_widget window_cheats_misc_widgets[] = { { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(6), HPL(6), STR_FAST, STR_NONE }, // fast staff { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(6), HPL(6), STR_NORMAL, STR_NONE }, // normal staff { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(7), HPL(7), STR_CHEAT_PARK_PARAMETERS, STR_CHEAT_TIP_PARK_PARAMETERS}, // Park parameters + { WWT_CHECKBOX, 1, XPL(0), WPL(0), YPL(8), HPL(8), STR_FORCE_PARK_RATING, STR_NONE}, // Force park rating + { WWT_SPINNER, 1, XPL(1), WPL(1) - 10, YPL(8) + 2, HPL(8) - 3, STR_NONE, STR_NONE }, // park rating + { WWT_DROPDOWN_BUTTON, 1, WPL(1) - 10, WPL(1), YPL(8) + 3, YPL(8) + 7, STR_NUMERIC_UP, STR_NONE }, // increase rating + { WWT_DROPDOWN_BUTTON, 1, WPL(1) - 10, WPL(1), YPL(8) + 8, YPL(8) + 12, STR_NUMERIC_DOWN, STR_NONE }, // decrease rating { WIDGETS_END }, }; static rct_widget window_cheats_rides_widgets[] = { @@ -384,7 +394,7 @@ static void* window_cheats_page_events[] = { static uint32 window_cheats_page_enabled_widgets[] = { (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_HIGH_MONEY) | (1 << WIDX_CLEAR_LOAN), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_GUEST_HAPPINESS_MAX) | (1 << WIDX_GUEST_HAPPINESS_MIN) | (1 << WIDX_GUEST_ENERGY_MAX) | (1 << WIDX_GUEST_ENERGY_MIN) | (1 << WIDX_GUEST_HUNGER_MAX) | (1 << WIDX_GUEST_HUNGER_MIN) | (1 << WIDX_GUEST_THIRST_MAX) | (1 << WIDX_GUEST_THIRST_MIN) | (1 << WIDX_GUEST_NAUSEA_MAX) | (1 << WIDX_GUEST_NAUSEA_MIN) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1 << WIDX_GUEST_BATHROOM_MAX) | (1 << WIDX_GUEST_BATHROOM_MIN) | (1 << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1 << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1 << WIDX_TRAM_GUESTS) | (1 << WIDX_REMOVE_ALL_GUESTS) | (1 << WIDX_EXPLODE_GUESTS) | (1 << WIDX_GIVE_GUESTS_PARK_MAPS) | (1 << WIDX_GIVE_GUESTS_BALLOONS) | (1 << WIDX_GIVE_GUESTS_UMBRELLAS), - (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) | (1 << WIDX_UNLOCK_ALL_PRICES) | (1 << WIDX_SANDBOX_MODE) | (1 << WIDX_FAST_STAFF) | (1 << WIDX_NORMAL_STAFF) | (1 << WIDX_PARK_PARAMETERS), + (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) | (1 << WIDX_UNLOCK_ALL_PRICES) | (1 << WIDX_SANDBOX_MODE) | (1 << WIDX_FAST_STAFF) | (1 << WIDX_NORMAL_STAFF) | (1 << WIDX_PARK_PARAMETERS) | (1 << WIDX_FORCE_PARK_RATING) | (1 << WIDX_INCREASE_PARK_RATING) | (1 << WIDX_DECREASE_PARK_RATING), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_RENEW_RIDES) | (1 << WIDX_REMOVE_SIX_FLAGS) | (1 << WIDX_MAKE_DESTRUCTIBLE) | (1 << WIDX_FIX_ALL) | (1 << WIDX_FAST_LIFT_HILL) | (1 << WIDX_DISABLE_BRAKES_FAILURE) | (1 << WIDX_DISABLE_ALL_BREAKDOWNS) | (1 << WIDX_BUILD_IN_PAUSE_MODE) | (1 << WIDX_RESET_CRASH_STATUS) }; @@ -397,6 +407,9 @@ static rct_string_id window_cheats_page_titles[] = { static void window_cheats_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w); +int park_rating_spinner_value; +int park_rating_spinner_pressed_for = 0; + #pragma region Cheat functions static void cheat_set_grass_length(int length) @@ -730,6 +743,7 @@ void window_cheats_open() window->enabled_widgets = window_cheats_page_enabled_widgets[0]; window_init_scroll_widgets(window); window_cheats_set_page(window, WINDOW_CHEATS_PAGE_MONEY); + park_rating_spinner_value = get_forced_park_rating() >= 0 ? get_forced_park_rating() : 999; } static void window_cheats_money_mouseup() @@ -921,6 +935,25 @@ static void window_cheats_misc_mouseup() case WIDX_PARK_PARAMETERS: window_editor_scenario_options_open(); break; + case WIDX_FORCE_PARK_RATING: + if (get_forced_park_rating() >= 0){ + set_forced_park_rating(-1); + } else { + set_forced_park_rating(park_rating_spinner_value); + } + break; + case WIDX_INCREASE_PARK_RATING: + park_rating_spinner_value = min(999, 10 * (park_rating_spinner_value / 10 + 1)); + widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER); + if (get_forced_park_rating() >= 0) + set_forced_park_rating(park_rating_spinner_value); + break; + case WIDX_DECREASE_PARK_RATING: + park_rating_spinner_value = max(0, 10 * (park_rating_spinner_value / 10 - 1)); + widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER); + if (get_forced_park_rating() >= 0) + set_forced_park_rating(park_rating_spinner_value); + break; } } @@ -983,6 +1016,25 @@ static void window_cheats_update(rct_window *w) { w->frame_no++; widget_invalidate(w, WIDX_TAB_1 + w->page); + + if (widget_is_pressed(w, WIDX_INCREASE_PARK_RATING) || widget_is_pressed(w, WIDX_DECREASE_PARK_RATING)) + park_rating_spinner_pressed_for++; + else + park_rating_spinner_pressed_for = 0; + if (park_rating_spinner_pressed_for >= CHEATS_PARK_RATING_SPINNER_PAUSE) + if (!(w->frame_no % 3)){ + if (widget_is_pressed(w, WIDX_INCREASE_PARK_RATING)){ + park_rating_spinner_value = min(999, 10 * (park_rating_spinner_value / 10 + 1)); + widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER); + if (get_forced_park_rating() >= 0) + set_forced_park_rating(park_rating_spinner_value); + } else if (widget_is_pressed(w, WIDX_DECREASE_PARK_RATING)){ + park_rating_spinner_value = max(0, 10 * (park_rating_spinner_value / 10 - 1)); + widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER); + if (get_forced_park_rating() >= 0) + set_forced_park_rating(park_rating_spinner_value); + } + } } static void window_cheats_invalidate() @@ -1006,6 +1058,7 @@ static void window_cheats_invalidate() w->widgets[WIDX_OPEN_CLOSE_PARK].image = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_OPEN ? STR_CHEAT_CLOSE_PARK : STR_CHEAT_OPEN_PARK; widget_set_checkbox_value(w, WIDX_UNLOCK_ALL_PRICES, gConfigCheat.unlock_all_prices); + widget_set_checkbox_value(w, WIDX_FORCE_PARK_RATING, get_forced_park_rating() >= 0); break; case WINDOW_CHEATS_PAGE_RIDES: RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = 255; @@ -1041,6 +1094,7 @@ static void window_cheats_paint() } else if(w->page == WINDOW_CHEATS_PAGE_MISC){ gfx_draw_string_left(dpi, STR_CHEAT_STAFF_SPEED, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(6) + TXTO); + gfx_draw_string_right(dpi, 5182, &park_rating_spinner_value, w->colours[2], w->x + WPL(1) - 10 - TXTO, w->y + YPL(8) + TXTO); } else if (w->page == WINDOW_CHEATS_PAGE_GUESTS){ gfx_draw_string_left(dpi, STR_CHEAT_GUEST_HAPPINESS, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(0) + TXTO); diff --git a/src/world/park.c b/src/world/park.c index 73230f230d..b732b8f895 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -38,6 +38,9 @@ uint8 *gParkRatingHistory = RCT2_ADDRESS(RCT2_ADDRESS_PARK_RATING_HISTORY, uint8); uint8 *gGuestsInParkHistory = RCT2_ADDRESS(RCT2_ADDRESS_GUESTS_IN_PARK_HISTORY, uint8); +// If this value is more than or equal to 0, the park rating is forced to this value. Used for cheat +int gForcedParkRating = -1; + /** * In a difficult guest generation scenario, no guests will be generated if over this value. */ @@ -161,6 +164,9 @@ int park_calculate_size() */ int calculate_park_rating() { + if (gForcedParkRating >= 0) + return gForcedParkRating; + int result; result = 1150; @@ -1402,3 +1408,15 @@ void game_command_buy_land_rights(int *eax, int *ebx, int *ecx, int *edx, int *e *ebx = RCT2_GLOBAL(RCT2_ADDRESS_LAND_COST, uint16); }*/ } + + +void set_forced_park_rating(int rating){ + gForcedParkRating = rating; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, uint16) = calculate_park_rating(); + RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint16) |= BTM_TB_DIRTY_FLAG_PARK_RATING; + window_invalidate_by_class(WC_PARK_INFORMATION); +} + +int get_forced_park_rating(){ + return gForcedParkRating; +} \ No newline at end of file diff --git a/src/world/park.h b/src/world/park.h index aa19444e04..556757cdc8 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -48,6 +48,9 @@ enum { extern uint8 *gParkRatingHistory; extern uint8 *gGuestsInParkHistory; +void set_forced_park_rating(); +int get_forced_park_rating(); + int park_is_open(); void park_init(); void park_reset_history(); From 5e3df2241423109ac637dc6c13f5be4e84bc6e87 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 28 Jun 2015 13:31:46 +0100 Subject: [PATCH 0132/1173] Implemented map element remove. Small tidy of functions in game.c. --- src/game.c | 4 ++-- src/world/map.c | 12 +++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/game.c b/src/game.c index cfd8ba82b1..d5b3ddfe3d 100644 --- a/src/game.c +++ b/src/game.c @@ -870,7 +870,7 @@ void rct2_exit_reason(rct_string_id title, rct_string_id body){ */ void rct2_exit() { - RCT2_CALLPROC_EBPSAFE(0x006E3879); + audio_close(); //Post quit message does not work in 0x6e3879 as its windows only. openrct2_finish(); } @@ -892,7 +892,7 @@ void game_load_or_quit_no_save_prompt() game_do_command(0, 1, 0, 1, GAME_COMMAND_LOAD_OR_QUIT, 0, 0); tool_cancel(); if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_5) { - RCT2_CALLPROC_EBPSAFE(0x0040705E); + // RCT2_CALLPROC_EBPSAFE(0x0040705E); Function not required resets cursor position. RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) &= ~INPUT_FLAG_5; } gGameSpeed = 1; diff --git a/src/world/map.c b/src/world/map.c index 602be3f4ee..4fa4596e64 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2637,7 +2637,17 @@ int map_get_station(rct_map_element *mapElement) */ void map_element_remove(rct_map_element *mapElement) { - RCT2_CALLPROC_X(0x0068B280, 0, 0, 0, 0, (int)mapElement, 0, 0); + if (!map_element_is_last_for_tile(mapElement)){ + do{ + *mapElement = *(mapElement + 1); + } while (!map_element_is_last_for_tile(++mapElement)); + } + (mapElement - 1)->flags |= MAP_ELEMENT_FLAG_LAST_TILE; + mapElement->base_height = 0xFF; + + if ((mapElement + 1) == RCT2_GLOBAL(0x00140E9A4, rct_map_element*)){ + RCT2_GLOBAL(0x00140E9A4, rct_map_element*)--; + } } /** From 48268d50ccdbdaf00ce6db422423014d07f8c03b Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 13:13:42 +0100 Subject: [PATCH 0133/1173] implement a couple of ride subroutines and refactor --- src/game.h | 2 +- src/peep/peep.c | 2 +- src/peep/peep.h | 2 + src/ride/ride.c | 89 ++++++++++++++++++++++++++---- src/ride/track.c | 4 +- src/windows/demolish_ride_prompt.c | 2 +- src/windows/maze_construction.c | 2 +- src/windows/ride_construction.c | 2 +- src/world/footpath.h | 1 + 9 files changed, 89 insertions(+), 17 deletions(-) diff --git a/src/game.h b/src/game.h index 3b00c7ea43..b5df70cc6b 100644 --- a/src/game.h +++ b/src/game.h @@ -31,7 +31,7 @@ enum GAME_COMMAND { GAME_COMMAND_REMOVE_TRACK, GAME_COMMAND_LOAD_OR_QUIT, // 5 GAME_COMMAND_6, - GAME_COMMAND_7, + GAME_COMMAND_DEMOLISH_RIDE, GAME_COMMAND_SET_RIDE_STATUS, // 8 GAME_COMMAND_9, GAME_COMMAND_SET_RIDE_NAME, diff --git a/src/peep/peep.c b/src/peep/peep.c index adb41accf4..64eb9fc49e 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -163,7 +163,7 @@ void sub_693B58(rct_peep* peep){ } /* 0x00693BE5 */ -static void sub_693BE5(rct_peep* peep, uint8 al){ +void sub_693BE5(rct_peep* peep, uint8 al){ if (al == peep->var_6D)return; peep->var_6D = al; diff --git a/src/peep/peep.h b/src/peep/peep.h index 704914342e..28875d2bfd 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -591,4 +591,6 @@ void sub_693B58(rct_peep* peep); void remove_peep_from_ride(rct_peep* peep); void remove_peep_from_queue(rct_peep* peep); +void sub_693BE5(rct_peep* peep, uint8 al); + #endif diff --git a/src/ride/ride.c b/src/ride/ride.c index 6d557a5082..e2f68f63e7 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -37,6 +37,7 @@ #include "../util/util.h" #include "../windows/error.h" #include "../world/banner.h" +#include "../world/footpath.h" #include "../world/map.h" #include "../world/sprite.h" #include "ride.h" @@ -138,6 +139,7 @@ void ride_prepare_breakdown(int rideIndex, int breakdownReason); 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 sub_6B59C6(int rideIndex); rct_ride_type *ride_get_entry(rct_ride *ride) { @@ -784,7 +786,7 @@ void ride_remove_peeps(int rideIndex) invalidate_sprite((rct_sprite*)peep); peep->state = PEEP_STATE_FALLING; - RCT2_CALLPROC_X(0x00693BE5, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693BE5(peep, 0); peep->happiness = min(peep->happiness, peep->happiness_growth_rate) / 2; peep->happiness_growth_rate = peep->happiness; @@ -998,8 +1000,6 @@ bool sub_6C63D6(int inX, int inY, int inZ, int inDirection, track_begin_end *out */ void sub_6C96C0() { - // RCT2_CALLPROC_X(0x006C96C0, 0, 0, 0, 0, 0, 0, 0); return; - rct_ride *ride; rct_map_element *trackElement; int rideIndex, x, y, z, direction; @@ -3334,7 +3334,7 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * switch (setting){ case 0: - RCT2_CALLPROC_X(0x006B59C6, 0, 0, 0, ride_id, 0, 0, 0); + sub_6B59C6(ride_id); ride_clear_for_construction(ride_id); ride_remove_peeps(ride_id); @@ -3376,7 +3376,7 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * ride->min_waiting_time = min(new_value, ride->min_waiting_time); break; case 4: - RCT2_CALLPROC_X(0x006B59C6, 0, 0, 0, ride_id, 0, 0, 0); + sub_6B59C6(ride_id); ride->time_limit = new_value; break; case 5: @@ -3397,13 +3397,13 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * case 8: if (new_value != ride->lift_hill_speed){ ride->lift_hill_speed = new_value; - RCT2_CALLPROC_X(0x006B59C6, 0, 0, 0, ride_id, 0, 0, 0); + sub_6B59C6(ride_id); } break; case 9: if (new_value != ride->num_circuits){ ride->num_circuits = new_value; - RCT2_CALLPROC_X(0x006B59C6, 0, 0, 0, ride_id, 0, 0, 0); + sub_6B59C6(ride_id); } break; } @@ -3526,7 +3526,28 @@ int ride_check_for_entrance_exit(int rideIndex) */ void sub_6B5952(int rideIndex) { - RCT2_CALLPROC_X(0x006B5952, 0, 0, 0, rideIndex, 0, 0, 0); + rct_ride *ride = GET_RIDE(rideIndex); + + for (int i = 0; i < 4; i++) { + uint16 xy = ride->entrances[i]; + if (xy == 0xFFFF) + continue; + + int x = xy & 0xFF; + int y = xy >> 8; + int z = ride->station_heights[i]; + + rct_map_element *mapElement = map_get_first_element_at(x, y); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE) + continue; + if (mapElement->base_height != z) + continue; + + int direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; + sub_6A742F(rideIndex, i, x, y, mapElement, direction ^ 2); + } while (map_element_is_last_for_tile(mapElement++)); + } } /** @@ -4308,6 +4329,30 @@ int ride_get_refund_price(int ride_id) return RCT2_GLOBAL(0x00F4413A, int); } +/** + * + * rct2: 0x00696707 + */ +static void ride_stop_peeps_queuing(int rideIndex) +{ + uint16 spriteIndex; + rct_peep *peep; + + FOR_ALL_PEEPS(spriteIndex, peep) { + if (peep->state != PEEP_STATE_QUEUING) + continue; + if (peep->current_ride != rideIndex) + continue; + + remove_peep_from_queue(peep); + peep_decrement_num_riders(peep); + + peep->state = PEEP_STATE_FALLING; + + peep_window_state_update(peep); + } +} + /** * * rct2: 0x006B49D9 @@ -4349,7 +4394,7 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi } ride_clear_for_construction(ride_id); ride_remove_peeps(ride_id); - RCT2_CALLPROC_X(0x00696707, 0, 0, 0, ride_id, 0, 0, 0); + ride_stop_peeps_queuing(ride_id); *ebx = ride_get_refund_price(ride_id); RCT2_CALLPROC_X(0x006CB945, 0, 0, 0, ride_id, 0, 0, 0); @@ -4904,4 +4949,28 @@ bool ride_are_all_possible_entrances_and_exits_built(rct_ride *ride) } } return true; -} \ No newline at end of file +} + +/** + * + * rct2: 0x006B59C6 + */ +static void sub_6B59C6(int rideIndex) +{ + rct_ride *ride = GET_RIDE(rideIndex); + + ride_measurement_clear(ride); + ride->excitement = 0xFFFF; + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_TESTED; + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_TEST_IN_PROGRESS; + if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) { + for (int i = 0; i < ride->num_vehicles; i++) { + uint16 spriteIndex = ride->vehicles[i]; + if (spriteIndex != SPRITE_INDEX_NULL) { + rct_vehicle *vehicle = &(g_sprite_list[spriteIndex].vehicle); + vehicle->var_48 &= ~(1 << 5); + } + } + } + window_invalidate_by_number(WC_RIDE, rideIndex); +} diff --git a/src/ride/track.c b/src/ride/track.c index 8ff1fd2e03..2129d4b0dc 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1491,7 +1491,7 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac } if (RCT2_GLOBAL(0x00F440D4, uint8) == 6){ - game_do_command(0, 0x69, 0, rideIndex, GAME_COMMAND_7, 0, 0); + game_do_command(0, 0x69, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); } RCT2_GLOBAL(0x00F44142, sint16) = x; @@ -3242,7 +3242,7 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int if (cost == MONEY32_UNDEFINED || !(flags & GAME_COMMAND_FLAG_APPLY)){ rct_string_id error_reason = RCT2_GLOBAL(0x00141E9AC, rct_string_id); - game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, rideIndex, GAME_COMMAND_7, 0, 0); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); *ebx = cost; RCT2_GLOBAL(0x00141E9AC, rct_string_id) = error_reason; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 0; diff --git a/src/windows/demolish_ride_prompt.c b/src/windows/demolish_ride_prompt.c index ba62515caf..3ad481bc28 100644 --- a/src/windows/demolish_ride_prompt.c +++ b/src/windows/demolish_ride_prompt.c @@ -116,7 +116,7 @@ static void window_ride_demolish_mouseup(){ switch (widgetIndex){ case WIDX_DEMOLISH: RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_DEMOLISH_RIDE; - game_do_command(0, 1, 0, w->number, GAME_COMMAND_7, 0, 0); + game_do_command(0, 1, 0, w->number, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); break; case WIDX_CANCEL: case WIDX_CLOSE: diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index ee801a53bc..0a659f63b2 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -176,7 +176,7 @@ static void window_maze_construction_close() if (ride->overall_view == 0xFFFF) { int savedPausedState = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8); RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = 0; - game_do_command(0, 9, 0, rideIndex, GAME_COMMAND_7, 0, 0); + game_do_command(0, 9, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = savedPausedState; } else { window_ride_main_open(rideIndex); diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index ac1c424f12..c06a25e1df 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -586,7 +586,7 @@ static void window_ride_construction_close() int eax = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8); RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = 0; - game_do_command(0, 9, 0, rideIndex, GAME_COMMAND_7, 0, 0); + game_do_command(0, 9, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = eax; } diff --git a/src/world/footpath.h b/src/world/footpath.h index 047773a653..2f943e8084 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -51,5 +51,6 @@ void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, void footpath_remove_litter(int x, int y, int z); void sub_6A6C66(int x, int y, rct_map_element *mapElement, int flags); void sub_6A759F(); +void sub_6A742F(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction); #endif From f452b4d39aecd6bd24d28d41c5fd8e10392465a3 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 13:36:34 +0100 Subject: [PATCH 0134/1173] fix #1506 --- src/windows/ride_construction.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index c06a25e1df..f5adfefdb2 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1094,7 +1094,11 @@ static void window_ride_construction_resize() } else if ( ( is_track_enabled(TRACK_HELIX_SMALL) || - (_currentTrackCurve != TRACK_CURVE_LEFT_SMALL && _currentTrackCurve != TRACK_CURVE_RIGHT_SMALL && !is_track_enabled(TRACK_HELIX_LARGE)) + ( + is_track_enabled(TRACK_HELIX_LARGE) && + _currentTrackCurve != TRACK_CURVE_LEFT_SMALL && + _currentTrackCurve != TRACK_CURVE_RIGHT_SMALL + ) ) && ( _currentTrackCurve == TRACK_CURVE_LEFT || @@ -2580,11 +2584,11 @@ static void window_ride_construction_update_possible_ride_configurations() if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { if ( - RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) == 21 || - RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) != 22 + RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) == TRACK_HELIX_SMALL || + RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) == TRACK_HELIX_LARGE ) { if (bank != _previousTrackBankEnd) { - if (_previousTrackBankEnd != 0) + if (_previousTrackBankEnd != TRACK_BANK_NONE) continue; if (bank != TRACK_BANK_LEFT) @@ -2602,7 +2606,7 @@ static void window_ride_construction_update_possible_ride_configurations() _currentTrackPieceDirection < 4 && slope == _previousTrackSlopeEnd && bank == _previousTrackBankEnd && - (trackType != 66 || ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_29)) + (trackType != TRACK_ELEM_TOWER_BASE || ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_29)) ) { RCT2_GLOBAL(0x00F4409C, uint32) &= ~(1 << currentPossibleRideConfigurationIndex); _numCurrentPossibleSpecialTrackPieces++; From 06ee0342b75ba29e559fc73df54d1b7d587bd8ba Mon Sep 17 00:00:00 2001 From: danidoedel Date: Sun, 28 Jun 2015 14:52:05 +0200 Subject: [PATCH 0135/1173] Fix window titles (cheats) --- data/language/english_uk.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 9dfebb576a..197a1d02d5 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3680,8 +3680,8 @@ STR_5343 :Automatically place staff STR_5344 :Changelog STR_5345 :Financial cheats STR_5346 :Guest cheats -STR_5347 :Ride cheats -STR_5348 :Park cheats +STR_5347 :Park cheats +STR_5348 :Ride cheats STR_5349 :{SMALLFONT}{BLACK}All Rides STR_5350 :Max STR_5351 :Min @@ -3781,4 +3781,4 @@ STR_5444 :Speed: STR_5445 :Speed STR_5446 :Get STR_5447 :Type {STRINGID} -STR_5448 :Ride / Vehicle {STRINGID} \ No newline at end of file +STR_5448 :Ride / Vehicle {STRINGID} From 8167c24526b1d357fb621c5dce66b49a5ec9101d Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 28 Jun 2015 13:53:24 +0100 Subject: [PATCH 0136/1173] Implemented sub_68B044 some sort of check to make sure there is space for new element. If there isn't then it will try reorganise the elements to make room. --- src/addresses.h | 1 + src/world/map.c | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/addresses.h b/src/addresses.h index 224a5966f4..c9311354d7 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -354,6 +354,7 @@ #define RCT2_ADDRESS_SCENARIO_SRAND_0 0x00F663B0 #define RCT2_ADDRESS_SCENARIO_SRAND_1 0x00F663B4 #define RCT2_ADDRESS_MAP_ELEMENTS 0x00F663B8 +#define RCT2_ADDRESS_MAP_ELEMENTS_END 0x010E53B8 #define RCT2_ADDRESS_SPRITE_LIST 0x010E63BC #define RCT2_ADDRESS_SPRITES_NEXT_INDEX 0x013573BC diff --git a/src/world/map.c b/src/world/map.c index 4fa4596e64..1f6fe730d6 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2744,7 +2744,23 @@ void map_reorganise_elements() */ int sub_68B044() { - return (RCT2_CALLPROC_X(0x0068B044, 0, 0, 0, 0, 0, 0, 0) & 0x100) == 0; + if (RCT2_GLOBAL(0x00140E9A4, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element)) + return 1; + + for (int i = 1000; i != 0; --i) + sub_68B089(); + + if (RCT2_GLOBAL(0x00140E9A4, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element)) + return 1; + + map_reorganise_elements(); + + if (RCT2_GLOBAL(0x00140E9A4, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element)) + return 1; + else{ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 894; + return 0; + } } /** From b4f8d3b7530710b65304c2d0fa7b0a00f635e0cd Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 13:57:50 +0100 Subject: [PATCH 0137/1173] add new shortcuts to shortcut window and fix bottom toolbar hiding in editor --- data/language/english_uk.txt | 4 +++ src/interface/keyboard_shortcut.c | 19 ++++++++----- src/localisation/string_ids.h | 39 +++++++++++++++++++++++++-- src/windows/shortcut_keys.c | 45 ++++++++++++++++++++++++++++--- 4 files changed, 95 insertions(+), 12 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 1c737b38e7..d15853dbb3 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3782,3 +3782,7 @@ STR_5445 :Speed STR_5446 :Get STR_5447 :Type {STRINGID} STR_5448 :Ride / Vehicle {STRINGID} +STR_5449 :Reduce game speed +STR_5450 :Increase game speed +STR_5451 :Open cheats window +STR_5452 :Toggle visibility of toolbars diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index be2e210dcc..d0382709c7 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -230,15 +230,20 @@ static void shortcut_remove_vertical_land_toggle() static void shortcut_remove_top_bottom_toolbar_toggle() { - if (window_find_by_class(WC_TOP_TOOLBAR) != NULL) - { + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) + return; + + if (window_find_by_class(WC_TOP_TOOLBAR) != NULL) { window_close(window_find_by_class(WC_TOP_TOOLBAR)); window_close(window_find_by_class(WC_BOTTOM_TOOLBAR)); - } - else - { - window_top_toolbar_open(); - window_game_bottom_toolbar_open(); + } else { + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) == 0) { + window_top_toolbar_open(); + window_game_bottom_toolbar_open(); + } else { + window_top_toolbar_open(); + window_editor_bottom_toolbar_open(); + } } } diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 910ee249d1..0621ba8706 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1145,9 +1145,39 @@ enum { STR_REAL_NAME_TIP = 2488, STR_HOTKEY = 2489, - STR_SHORTCUT_DESCRIPTION_0 = 2493, + STR_SHORTCUT_CLOSE_TOP_MOST_WINDOW = 2493, + STR_SHORTCUT_CLOSE_ALL_FLOATING_WINDOWS = 2494, + STR_SHORTCUT_CANCEL_CONSTRUCTION_MODE = 2495, + STR_SHORTCUT_PAUSE_GAME = 2496, + STR_SHORTCUT_ZOOM_VIEW_OUT = 2497, + STR_SHORTCUT_ZOOM_VIEW_IN = 2498, + STR_SHORTCUT_ROTATE_VIEW = 2499, + STR_SHORTCUT_ROTATE_CONSTRUCTION_OBJECT = 2500, + STR_SHORTCUT_UNDERGROUND_VIEW_TOGGLE = 2501, + STR_SHORTCUT_REMOVE_BASE_LAND_TOGGLE = 2502, + STR_SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE = 2503, + STR_SHORTCUT_SEE_THROUGH_RIDES_TOGGLE = 2504, + STR_SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE = 2505, + STR_SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE = 2506, + STR_SHORTCUT_INVISIBLE_PEOPLE_TOGGLE = 2507, + STR_SHORTCUT_HEIGHT_MARKS_ON_LAND_TOGGLE = 2508, + STR_SHORTCUT_HEIGHT_MARKS_ON_RIDE_TRACKS_TOGGLE = 2509, + STR_SHORTCUT_HEIGHT_MARKS_ON_PATHS_TOGGLE = 2510, + STR_SHORTCUT_ADJUST_LAND = 2511, + STR_SHORTCUT_ADJUST_WATER = 2512, + STR_SHORTCUT_BUILD_SCENERY = 2513, + STR_SHORTCUT_BUILD_PATHS = 2514, + STR_SHORTCUT_BUILD_NEW_RIDE = 2515, + STR_SHORTCUT_SHOW_FINANCIAL_INFORMATION = 2516, + STR_SHORTCUT_SHOW_RESEARCH_INFORMATION = 2517, + STR_SHORTCUT_SHOW_RIDES_LIST = 2518, + STR_SHORTCUT_SHOW_PARK_INFORMATION = 2519, + STR_SHORTCUT_SHOW_GUEST_LIST = 2520, + STR_SHORTCUT_SHOW_STAFF_LIST = 2521, + STR_SHORTCUT_SHOW_RECENT_MESSAGES = 2522, + STR_SHORTCUT_SHOW_MAP = 2523, + STR_SHORTCUT_SCREENSHOT = 2524, - STR_SHORTCUT_DESCRIPTION_31 = 2524, STR_INDIVIDUAL_KEYS_BASE = 2525, STR_GOLF_HOLE_A = 3049, @@ -1724,6 +1754,11 @@ enum { STR_OBJECTS_SORT_TYPE = 5447, STR_OBJECTS_SORT_RIDE = 5448, + STR_SHORTCUT_REDUCE_GAME_SPEED = 5449, + STR_SHORTCUT_INCREASE_GAME_SPEED = 5450, + STR_SHORTCUT_OPEN_CHEATS_WINDOW = 5451, + STR_SHORTCUT_TOGGLE_VISIBILITY_OF_TOOLBARS = 5452, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/shortcut_keys.c b/src/windows/shortcut_keys.c index 24e6db0dd9..1accbd0c51 100644 --- a/src/windows/shortcut_keys.c +++ b/src/windows/shortcut_keys.c @@ -88,6 +88,45 @@ static void* window_shortcut_events[] = { window_shortcut_scrollpaint }; +const rct_string_id ShortcutStringIds[] = { + STR_SHORTCUT_CLOSE_TOP_MOST_WINDOW, + STR_SHORTCUT_CLOSE_ALL_FLOATING_WINDOWS, + STR_SHORTCUT_CANCEL_CONSTRUCTION_MODE, + STR_SHORTCUT_PAUSE_GAME, + STR_SHORTCUT_ZOOM_VIEW_OUT, + STR_SHORTCUT_ZOOM_VIEW_IN, + STR_SHORTCUT_ROTATE_VIEW, + STR_SHORTCUT_ROTATE_CONSTRUCTION_OBJECT, + STR_SHORTCUT_UNDERGROUND_VIEW_TOGGLE, + STR_SHORTCUT_REMOVE_BASE_LAND_TOGGLE, + STR_SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE, + STR_SHORTCUT_SEE_THROUGH_RIDES_TOGGLE, + STR_SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE, + STR_SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE, + STR_SHORTCUT_INVISIBLE_PEOPLE_TOGGLE, + STR_SHORTCUT_HEIGHT_MARKS_ON_LAND_TOGGLE, + STR_SHORTCUT_HEIGHT_MARKS_ON_RIDE_TRACKS_TOGGLE, + STR_SHORTCUT_HEIGHT_MARKS_ON_PATHS_TOGGLE, + STR_SHORTCUT_ADJUST_LAND, + STR_SHORTCUT_ADJUST_WATER, + STR_SHORTCUT_BUILD_SCENERY, + STR_SHORTCUT_BUILD_PATHS, + STR_SHORTCUT_BUILD_NEW_RIDE, + STR_SHORTCUT_SHOW_FINANCIAL_INFORMATION, + STR_SHORTCUT_SHOW_RESEARCH_INFORMATION, + STR_SHORTCUT_SHOW_RIDES_LIST, + STR_SHORTCUT_SHOW_PARK_INFORMATION, + STR_SHORTCUT_SHOW_GUEST_LIST, + STR_SHORTCUT_SHOW_STAFF_LIST, + STR_SHORTCUT_SHOW_RECENT_MESSAGES, + STR_SHORTCUT_SHOW_MAP, + STR_SHORTCUT_SCREENSHOT, + STR_SHORTCUT_REDUCE_GAME_SPEED, + STR_SHORTCUT_INCREASE_GAME_SPEED, + STR_SHORTCUT_OPEN_CHEATS_WINDOW, + STR_SHORTCUT_TOGGLE_VISIBILITY_OF_TOOLBARS, +}; + /** * * rct2: 0x006E3884 @@ -106,7 +145,7 @@ void window_shortcut_keys_open() w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_RESET); window_init_scroll_widgets(w); - w->no_list_items = 32; + w->no_list_items = SHORTCUT_COUNT; w->selected_list_item = -1; } @@ -176,7 +215,7 @@ static void window_shortcut_scrollgetsize() window_get_register(w); width = 0; - height = 32 * 10; + height = w->no_list_items * 10; window_scrollsize_set_registers(width, height); } @@ -244,7 +283,7 @@ static void window_shortcut_scrollpaint() gfx_fill_rect(dpi, 0, y, 800, y + 9, 0x2000031); } - RCT2_GLOBAL(0x13CE954, uint16) = i + STR_SHORTCUT_DESCRIPTION_0; + RCT2_GLOBAL(0x13CE954, uint16) = ShortcutStringIds[i]; RCT2_GLOBAL(0x13CE956, uint16) = 0; RCT2_GLOBAL(0x13CE958, uint16) = 0; From 33c4698e0642d9ec7f3961356a86c58f452e9c12 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 28 Jun 2015 16:50:21 +0100 Subject: [PATCH 0138/1173] Implemented map_reorganise_elements. Fixed a potential issue that would cause cursors to become stuck. --- src/platform/shared.c | 1 + src/world/map.c | 32 +++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/platform/shared.c b/src/platform/shared.c index a0a929c8b4..77418e2137 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -646,6 +646,7 @@ void platform_set_fullscreen_mode(int mode) */ void platform_set_cursor(char cursor) { + RCT2_GLOBAL(RCT2_ADDRESS_CURENT_CURSOR, uint8) = cursor; SDL_SetCursor(_cursors[cursor]); } /** diff --git a/src/world/map.c b/src/world/map.c index 1f6fe730d6..46e4a2f95f 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -35,6 +35,7 @@ #include "scenery.h" #include "../cheats.h" #include "../config.h" +#include "../cursors.h" const rct_xy16 TileDirectionDelta[] = { { -32, 0 }, @@ -2735,7 +2736,36 @@ void map_invalidate_selection_rect() */ void map_reorganise_elements() { - RCT2_CALLPROC_EBPSAFE(0x0068B111); + platform_set_cursor(CURSOR_ZZZ); + + rct_map_element* new_map_elements = rct2_malloc(0x30000 * sizeof(rct_map_element)); + rct_map_element* new_elements_pointer = new_map_elements; + + if (new_map_elements == NULL || new_map_elements == (rct_map_element*)-1){ + error_string_quit(4370, 0xFFFF); + return; + } + + rct_map_element **tile = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*); + for (int i = 0; i < 0x10000;){ + for (int j = 0; j < 256; ++j, ++i){ + rct_map_element* startElement = tile[i]; + rct_map_element* endElement = startElement; + while (!map_element_is_last_for_tile(endElement++)); + + uint8 num_bytes = endElement - startElement; + memcpy(new_elements_pointer, startElement, num_bytes); + new_elements_pointer += num_bytes / sizeof(rct_map_element); + } + } + + uint32 num_elements = (new_elements_pointer - new_map_elements) / sizeof(rct_map_element); + memcpy(RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS, rct_map_element), new_map_elements, num_elements * sizeof(rct_map_element)); + memset(new_map_elements + num_elements, 0, (0x30000 - num_elements) * sizeof(rct_map_element)); + + rct2_free(new_map_elements); + + map_update_tile_pointers(); } /** From e2a694b96ec41aec485c8b04cfbc90afbc9b676a Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 17:45:19 +0100 Subject: [PATCH 0139/1173] implement format_string_toupper and litter_create --- src/addresses.h | 5 +++ src/localisation/localisation.c | 18 ++++++++ src/localisation/localisation.h | 1 + src/peep/peep.c | 13 +++--- src/scenario.h | 7 ++-- src/windows/ride_list.c | 11 ++--- src/world/map.c | 10 +++++ src/world/map.h | 2 + src/world/park.c | 4 +- src/world/sprite.c | 74 +++++++++++++++++++++++++++++++++ src/world/sprite.h | 11 +++-- 11 files changed, 136 insertions(+), 20 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 224a5966f4..f18fc89455 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -362,6 +362,11 @@ #define RCT2_ADDRESS_SPRITES_START_MISC 0x013573C2 #define RCT2_ADDRESS_SPRITES_START_LITTER 0x013573C4 +#define RCT2_ADDRESS_SPRITES_COUNT_VEHICLE 0x013573CA +#define RCT2_ADDRESS_SPRITES_COUNT_PEEP 0x013573CC +#define RCT2_ADDRESS_SPRITES_COUNT_MISC 0x013573CE +#define RCT2_ADDRESS_SPRITES_COUNT_LITTER 0x013573D0 + #define RCT2_ADDRESS_PARK_NAME 0x013573D4 #define RCT2_ADDRESS_PARK_NAME_ARGS 0x013573D8 #define RCT2_ADDRESS_INITIAL_CASH 0x013573DC diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 2a950495bf..db22c239fd 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -664,6 +664,24 @@ void format_string_raw(char *dest, char *src, void *args) format_string_part_from_raw(&dest, src, (char**)&args); } +/** + * Writes a formatted string to a buffer and converts it to upper case. + * rct2: 0x006C2538 + * dest (edi) + * format (ax) + * args (ecx) + */ +void format_string_to_upper(char *dest, rct_string_id format, void *args) +{ + format_string(dest, format, args); + + char *ch = dest; + while (*ch != 0) { + *ch = toupper(*ch); + ch++; + } +} + /** * rct2: 0x006E37F7 * error (eax) diff --git a/src/localisation/localisation.h b/src/localisation/localisation.h index c7bee7a75c..9d7a8e7f42 100644 --- a/src/localisation/localisation.h +++ b/src/localisation/localisation.h @@ -28,6 +28,7 @@ void format_string(char *dest, rct_string_id format, void *args); void format_string_raw(char *dest, char *src, void *args); +void format_string_to_upper(char *dest, rct_string_id format, void *args); void generate_string_file(); void error_string_quit(int error, rct_string_id format); int get_string_length(char* buffer); diff --git a/src/peep/peep.c b/src/peep/peep.c index 64eb9fc49e..745f851825 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -344,10 +344,9 @@ int peep_update_action(sint16* x, sint16* y, sint16* xy_distance, rct_peep* peep peep->var_45 |= (1 << 2); // Create sick at location - RCT2_CALLPROC_X(0x67375D, peep->x, peep->sprite_direction, peep->y, peep->z, 0, 0, peep->sprite_index & 1); - - int sound_id = (scenario_rand() & 3) + 24; + litter_create(peep->x, peep->y, peep->z, peep->sprite_direction, peep->sprite_index & 1); + int sound_id = SOUND_COUGH_1 + (scenario_rand() & 3); sound_play_panned(sound_id, 0x8001, peep->x, peep->y, peep->z); invalidate_sprite((rct_sprite*)peep); @@ -3485,7 +3484,7 @@ static void peep_update_using_bin(rct_peep* peep){ x = peep->x + (scenario_rand() & 7) - 3; y = peep->y + (scenario_rand() & 7) - 3; - RCT2_CALLPROC_X(0x67375D, x, scenario_rand() & 3, y, peep->z, 0, 0, bp); + litter_create(x, y, peep->z, scenario_rand() & 3, bp); peep->item_standard_flags &= ~(1 << cur_container); peep->var_45 |= 8; @@ -3516,7 +3515,7 @@ static void peep_update_using_bin(rct_peep* peep){ x = peep->x + (scenario_rand() & 7) - 3; y = peep->y + (scenario_rand() & 7) - 3; - RCT2_CALLPROC_X(0x67375D, x, scenario_rand() & 3, y, peep->z, 0, 0, bp); + litter_create(x, y, peep->z, scenario_rand() & 3, bp); peep->item_extra_flags &= ~(1 << cur_container); peep->var_45 |= 8; @@ -4021,7 +4020,7 @@ static void peep_update_walking(rct_peep* peep){ int y = peep->y + (scenario_rand() & 0x7) - 3; int direction = (scenario_rand() & 0x3); - RCT2_CALLPROC_X(0x67375D, x, direction, y, peep->z, 0, 0, ebp); + litter_create(x, y, peep->z, direction, ebp); } } } @@ -4053,7 +4052,7 @@ static void peep_update_walking(rct_peep* peep){ int y = peep->y + (scenario_rand() & 0x7) - 3; int direction = (scenario_rand() & 0x3); - RCT2_CALLPROC_X(0x67375D, x, direction, y, peep->z, 0, 0, bp); + litter_create(x, y, peep->z, direction, bp); } } diff --git a/src/scenario.h b/src/scenario.h index 9f5aa3f5a8..7fc1878d1a 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -134,9 +134,10 @@ typedef struct { uint16 sprites_start_litter; uint8 pad_013573C6[2]; uint16 word_013573C8; - uint8 pad_013573CA[4]; - uint16 word_013573CE; - uint16 word_013573D0; + uint16 sprites_count_vehicle; + uint16 sprites_count_peep; + uint16 sprites_count_misc; + uint16 sprites_count_litter; uint8 pad_013573D2[2]; rct_string_id park_name; uint8 pad_013573D6[2]; diff --git a/src/windows/ride_list.c b/src/windows/ride_list.c index c70fb45ac0..704946e326 100644 --- a/src/windows/ride_list.c +++ b/src/windows/ride_list.c @@ -615,6 +615,7 @@ static void window_ride_list_refresh_list(rct_window *w) { int i, countA, countB; rct_ride *ride, *otherRide; + char *bufferA, *bufferB; countA = countB = 0; FOR_ALL_RIDES(i, ride) { @@ -644,13 +645,13 @@ static void window_ride_list_refresh_list(rct_window *w) int current_list_position = list_index; switch (w->list_information_type) { case INFORMATION_TYPE_STATUS: - RCT2_GLOBAL(0x013CE952, uint32) = ride->name_arguments; - RCT2_CALLPROC_X(0x006C2538, ride->name, 0, 0x013CE952, 0, 0, RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, 0); + bufferA = (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER; + bufferB = (char*)0x0141EF68; + format_string_to_upper(bufferA, ride->name, &ride->name_arguments); while (--current_list_position >= 0) { otherRide = &g_ride_list[w->list_item_positions[current_list_position]]; - RCT2_GLOBAL(0x013CE952, uint32) = otherRide->name_arguments; - RCT2_CALLPROC_X(0x006C2538, otherRide->name, 0, 0x013CE952, 0, 0, 0x0141EF68, 0); - if (strcmp((char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, (char*)0x0141EF68) >= 0) + format_string_to_upper(bufferB, otherRide->name, &otherRide->name_arguments); + if (strcmp(bufferA, bufferB) >= 0) break; window_bubble_list_item(w, current_list_position); diff --git a/src/world/map.c b/src/world/map.c index 602be3f4ee..bcbd88c07a 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3095,3 +3095,13 @@ int map_get_highest_z(int tileX, int tileY) z = max(z, (mapElement->properties.surface.terrain & 0x1F) * 16); return z; } + +bool map_element_is_underground(rct_map_element *mapElement) +{ + do { + mapElement++; + if (map_element_is_last_for_tile(mapElement - 1)) + return false; + } while (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SURFACE); + return true; +} diff --git a/src/world/map.h b/src/world/map.h index 0c2882bb0c..46dcc6fa71 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -334,4 +334,6 @@ void sub_6A7594(); int map_element_get_banner_index(rct_map_element *mapElement); void map_element_remove_banner_entry(rct_map_element *mapElement); +bool map_element_is_underground(rct_map_element *mapElement); + #endif diff --git a/src/world/park.c b/src/world/park.c index b732b8f895..7b52393d88 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -267,8 +267,8 @@ int calculate_park_rating() for (sprite_idx = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_LITTER, uint16); sprite_idx != SPRITE_INDEX_NULL; sprite_idx = litter->next) { litter = &(g_sprite_list[sprite_idx].litter); - // Guessing this eliminates recently dropped litter - if (litter->var_24 - RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) >= 7680) + // Ignore recently dropped litter + if (litter->creationTick - RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) >= 7680) num_litter++; } result -= 600 - (4 * (150 - min(150, num_litter))); diff --git a/src/world/sprite.c b/src/world/sprite.c index ede41f10d8..1127ec59da 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -901,4 +901,78 @@ void sprite_move(sint16 x, sint16 y, sint16 z, rct_sprite* sprite){ void sprite_remove(rct_sprite *sprite) { RCT2_CALLPROC_X(0x0069EDB6, 0, 0, 0, 0, (int)sprite, 0, 0); +} + +static bool litter_can_be_at(int x, int y, int z) +{ + rct_map_element *mapElement; + + if (!map_is_location_owned(x & 0xFFE0, y & 0xFFE0, z)) + return false; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + + int pathZ = mapElement->base_height * 8; + if (pathZ < z || pathZ >= z + 32) + continue; + + if (map_element_is_underground(mapElement)) + return false; + + return true; + } while (!map_element_is_last_for_tile(mapElement++)); + return false; +} + +/** + * + * rct2: 0x0067375D + */ +void litter_create(int x, int y, int z, int direction, int type) +{ + rct_litter *litter, *newestLitter; + uint16 spriteIndex, nextSpriteIndex; + uint32 newestLitterCreationTick; + + x += TileDirectionDelta[direction].x / 8; + y += TileDirectionDelta[direction].y / 8; + + if (!litter_can_be_at(x, y, z)) + return; + + if (RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_COUNT_LITTER, uint16) >= 500) { + newestLitter = NULL; + newestLitterCreationTick = 0; + for (spriteIndex = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_LITTER, uint16); spriteIndex != SPRITE_INDEX_NULL; spriteIndex = nextSpriteIndex) { + litter = &(g_sprite_list[spriteIndex].litter); + nextSpriteIndex = litter->next; + if (newestLitterCreationTick <= litter->creationTick) { + newestLitterCreationTick = litter->creationTick; + newestLitter = litter; + } + } + + if (newestLitter != NULL) { + sub_6EC60B((rct_sprite*)newestLitter); + sprite_remove((rct_sprite*)newestLitter); + } + } + + litter = (rct_litter*)create_sprite(1); + if (litter == NULL) + return; + + move_sprite_to_list((rct_sprite*)litter, SPRITE_LINKEDLIST_OFFSET_LITTER); + litter->sprite_direction = direction; + litter->sprite_width = 6; + litter->sprite_height_negative = 6; + litter->sprite_height_positive = 3; + litter->sprite_identifier = SPRITE_IDENTIFIER_LITTER; + litter->type = type; + sprite_move(x, y, z, (rct_sprite*)litter); + sub_6EC60B((rct_sprite*)litter); + litter->creationTick = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32); } \ No newline at end of file diff --git a/src/world/sprite.h b/src/world/sprite.h index 7a93a7c1c8..4dbdebae6a 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -84,14 +84,18 @@ typedef struct { uint16 next; // 0x04 uint16 previous; // 0x06 uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_... - uint8 pad_09; + uint8 sprite_height_negative; // 0x09 uint16 sprite_index; // 0x0A uint16 pad_0C; sint16 x; // 0x0E sint16 y; // 0x10 sint16 z; // 0x12 - uint8 pad_14[0x10]; - uint32 var_24; + uint8 sprite_width; // 0x14 + uint8 sprite_height_positive; // 0x15 + uint8 pad_16[8]; + uint8 sprite_direction; // 0x1E + uint8 pad_1F[5]; + uint32 creationTick; // 0x24 } rct_litter; typedef struct { @@ -252,5 +256,6 @@ void sprite_move(sint16 x, sint16 y, sint16 z, rct_sprite* sprite); void invalidate_sprite(rct_sprite *sprite); void sub_6EC60B(rct_sprite* sprite); void sprite_remove(rct_sprite *sprite); +void litter_create(int x, int y, int z, int direction, int type); #endif From 3e200d0bd2813a59e79f127d3245c090096fc259 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 18:36:46 +0100 Subject: [PATCH 0140/1173] implement ride_fix_breakdown --- src/peep/peep.c | 26 ++++++++++++++++++++++++-- src/ride/ride.c | 33 +++++++++++++++++++++++++++++++++ src/ride/ride.h | 1 + src/ride/track.c | 1 - src/windows/cheats.c | 2 +- 5 files changed, 59 insertions(+), 4 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 745f851825..67551e3d4d 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -23,6 +23,7 @@ #include "../audio/mixer.h" #include "../interface/window.h" #include "../localisation/localisation.h" +#include "../management/finance.h" #include "../management/news_item.h" #include "../ride/ride.h" #include "../scenario.h" @@ -42,6 +43,7 @@ static int peep_empty_container_extra_flag(rct_peep* peep); static int peep_should_find_bench(rct_peep* peep); static void peep_stop_purchase_thought(rct_peep* peep, uint8 ride_type); static void sub_693BAB(rct_peep* peep); +static void peep_spend_money(rct_peep *peep, money32 amount); const char *gPeepEasterEggNames[] = { "MICHAEL SCHUMACHER", @@ -1368,8 +1370,7 @@ static void peep_update_ride_sub_state_2_enter_ride(rct_peep* peep, rct_ride* ri ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 20; RCT2_GLOBAL(0xF1AEC0, uint32) = 230; - - RCT2_CALLPROC_X(0x0069926C, 0, ride->price, 0, 0, (int)peep, 0, 0); + peep_spend_money(peep, ride->price); } } @@ -5310,3 +5311,24 @@ void sub_693BAB(rct_peep* peep) { } } +/** + * + * rct2: 0x0069926C + */ +static void peep_spend_money(rct_peep *peep, money32 amount) +{ + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) + return; + + peep->cash_in_pocket = max(0, peep->cash_in_pocket - amount); + peep->cash_spent += amount; + if (RCT2_GLOBAL(0x00F1AEC0, uint32) == 0xFFFFFFFF) { + RCT2_GLOBAL(peep + RCT2_GLOBAL(0x00F1AEC0, uint32), money16) += (money16)amount; + } + window_invalidate_by_number(WC_PEEP, peep->sprite_index); + + RCT2_GLOBAL(0x00141F568, uint8) = RCT2_GLOBAL(0x0013CA740, uint8); + finance_payment(-amount, RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint32)); + + sound_play_panned(SOUND_PURCHASE, 0x8001, peep->x, peep->y, peep->z); +} \ No newline at end of file diff --git a/src/ride/ride.c b/src/ride/ride.c index e2f68f63e7..f5a3338891 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4974,3 +4974,36 @@ static void sub_6B59C6(int rideIndex) } window_invalidate_by_number(WC_RIDE, rideIndex); } + +/** + * + * rct2: 0x006B7481 + */ +void ride_fix_breakdown(int rideIndex, int reliabilityIncreaseFactor) +{ + rct_ride *ride = GET_RIDE(rideIndex); + + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_BREAKDOWN_PENDING; + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_BROKEN_DOWN; + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_DUE_INSPECTION; + ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_CUSTOMER; + + if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) { + rct_vehicle *vehicle; + uint16 spriteIndex; + + for (int i = 0; i < ride->num_vehicles; i++) { + spriteIndex = ride->vehicles[i]; + while (spriteIndex != SPRITE_INDEX_NULL) { + vehicle = &(g_sprite_list[spriteIndex].vehicle); + vehicle->var_48 &= ~(1 << 7); + vehicle->var_48 &= ~(1 << 8); + vehicle->var_48 &= ~(1 << 9); + spriteIndex = vehicle->next_vehicle_on_train; + } + } + } + + uint8 unreliability = 100 - ((ride->reliability >> 8) & 0xFF); + ride->reliability += reliabilityIncreaseFactor * (unreliability / 2); +} diff --git a/src/ride/ride.h b/src/ride/ride.h index c367858517..143e654899 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -935,5 +935,6 @@ bool ride_select_forwards_from_back(); money32 ride_remove_track_piece(int x, int y, int z, int direction, int type); bool ride_are_all_possible_entrances_and_exits_built(rct_ride *ride); +void ride_fix_breakdown(int rideIndex, int reliabilityIncreaseFactor); #endif diff --git a/src/ride/track.c b/src/ride/track.c index 2129d4b0dc..06ca30f6ee 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -2225,7 +2225,6 @@ rct_track_design *track_get_info(int index, uint8** preview) memcpy(&trackDesign->track_td6, loaded_track, sizeof(rct_track_td6)); // Load in a new preview image, calculate cost variable, calculate var_06 draw_track_preview((uint8**)trackDesign->preview); - //RCT2_CALLPROC_X(0x006D1EF0, 0, 0, 0, 0, 0, (int)&trackDesign->preview, 0); trackDesign->track_td6.cost = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_COST, money32); trackDesign->track_td6.track_flags = RCT2_GLOBAL(0x00F44151, uint8) & 7; diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 577e3fb52e..52f1a38702 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -515,7 +515,7 @@ static void cheat_fix_rides() remove_peep_from_ride(mechanic); } - RCT2_CALLPROC_X(0x006B7481, 0, 0, 0, rideIndex, 0, 0, 0); + ride_fix_breakdown(rideIndex, 0); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; } } From ed41c2b9956e0342a8f9705fe80e0116809ce66d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 18:59:55 +0100 Subject: [PATCH 0141/1173] fix map_reorganise_elements --- src/world/map.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 035eff919f..d581cbbe59 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2747,13 +2747,13 @@ void map_reorganise_elements() } rct_map_element **tile = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*); - for (int i = 0; i < 0x10000;){ - for (int j = 0; j < 256; ++j, ++i){ - rct_map_element* startElement = tile[i]; - rct_map_element* endElement = startElement; + for (int y = 0; y < 256; y++) { + for (int x = 0; x < 256; x++) { + rct_map_element *startElement = map_get_first_element_at(x, y); + rct_map_element *endElement = startElement; while (!map_element_is_last_for_tile(endElement++)); - uint8 num_bytes = endElement - startElement; + uint8 num_bytes = (endElement - startElement) * sizeof(rct_map_element); memcpy(new_elements_pointer, startElement, num_bytes); new_elements_pointer += num_bytes / sizeof(rct_map_element); } From 2c3c8dc1880a6aa4eeb0241bff529802968de396 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 28 Jun 2015 19:46:08 +0100 Subject: [PATCH 0142/1173] Fix incorrect pointer maths. Fixes #1511. --- src/world/map.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/map.c b/src/world/map.c index d581cbbe59..17412bae0c 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2759,7 +2759,7 @@ void map_reorganise_elements() } } - uint32 num_elements = (new_elements_pointer - new_map_elements) / sizeof(rct_map_element); + uint32 num_elements = (new_elements_pointer - new_map_elements); memcpy(RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS, rct_map_element), new_map_elements, num_elements * sizeof(rct_map_element)); memset(new_map_elements + num_elements, 0, (0x30000 - num_elements) * sizeof(rct_map_element)); From d968a65701fe266b44cc4e877ba2bcf1e58509ac Mon Sep 17 00:00:00 2001 From: Maikel Stuivenberg Date: Sun, 28 Jun 2015 21:30:20 +0200 Subject: [PATCH 0143/1173] Changed back-button location --- data/language/english_uk.txt | 2 +- src/windows/track_list.c | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 3faec4c51d..a3df426a99 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3780,4 +3780,4 @@ STR_5443 :Speed{MOVE_X}{87}{STRINGID} STR_5444 :Speed: STR_5445 :Speed STR_5446 :Get -STR_5447 :{SMALLFONT}{BLACK}Select an other ride/attraction +STR_5447 :Select another ride diff --git a/src/windows/track_list.c b/src/windows/track_list.c index 71bd536325..e15d4e6192 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -46,11 +46,11 @@ static rct_widget window_track_list_widgets[] = { { WWT_FRAME, 0, 0, 599, 0, 399, 0xFFFFFFFF, STR_NONE }, { WWT_CAPTION, 0, 1, 598, 1, 14, STR_SELECT_DESIGN, STR_WINDOW_TITLE_TIP }, { WWT_CLOSEBOX, 0, 587, 597, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, - { WWT_SCROLL, 0, 4, 221, 18, 395, 2, STR_CLICK_ON_DESIGN_TO_BUILD_IT_TIP }, + { WWT_SCROLL, 0, 4, 221, 33, 395, 2, STR_CLICK_ON_DESIGN_TO_BUILD_IT_TIP }, { WWT_FLATBTN, 0, 224, 595, 18, 236, 0xFFFFFFFF, STR_NONE }, { WWT_FLATBTN, 0, 574, 597, 374, 397, 5169, STR_ROTATE_90_TIP }, { WWT_FLATBTN, 0, 574, 597, 350, 373, 5171, STR_TOGGLE_SCENERY_TIP }, - { WWT_FLATBTN, 0, 574, 597, 326, 349, SPR_PREVIOUS, STR_SELECT_OTHER_RIDE }, + { WWT_13, 0, 4, 221, 18, 29, STR_SELECT_OTHER_RIDE, STR_NONE }, { WIDGETS_END }, }; @@ -382,7 +382,6 @@ static void window_track_list_invalidate() w->disabled_widgets &= ~(1 << WIDX_TRACK_PREVIEW); window_track_list_widgets[WIDX_ROTATE].type = WWT_FLATBTN; window_track_list_widgets[WIDX_TOGGLE_SCENERY].type = WWT_FLATBTN; - window_track_list_widgets[WIDX_BACK].type = WWT_FLATBTN; if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) == 0) w->pressed_widgets |= (1 << WIDX_TOGGLE_SCENERY); else @@ -392,7 +391,6 @@ static void window_track_list_invalidate() w->disabled_widgets |= (1 << WIDX_TRACK_PREVIEW); window_track_list_widgets[WIDX_ROTATE].type = WWT_EMPTY; window_track_list_widgets[WIDX_TOGGLE_SCENERY].type = WWT_EMPTY; - window_track_list_widgets[WIDX_BACK].type = WWT_EMPTY; } } From 952cbdebafd80e25e4dad973ca46705169d3e3ac Mon Sep 17 00:00:00 2001 From: Maikel Stuivenberg Date: Sun, 28 Jun 2015 21:33:54 +0200 Subject: [PATCH 0144/1173] move string to id 5453 --- data/language/english_uk.txt | 2 +- src/localisation/string_ids.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index a3df426a99..d4041307b5 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3780,4 +3780,4 @@ STR_5443 :Speed{MOVE_X}{87}{STRINGID} STR_5444 :Speed: STR_5445 :Speed STR_5446 :Get -STR_5447 :Select another ride +STR_5453 :Select another ride diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 73088a384e..46999df8df 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -805,7 +805,7 @@ enum { STR_SELECT_DESIGN = 2307, STR_TRACK_DESIGNS = 2308, STR_BUILD_CUSTOM_DESIGN = 2310, - STR_SELECT_OTHER_RIDE = 5447, + STR_SELECT_OTHER_RIDE = 5453, STR_TRACK_LIST_EXCITEMENT_RATING = 2311, STR_TRACK_LIST_INTENSITY_RATING = 2312, From 0da767fcead9dd9af14f1d7568a4d372a9969b1b Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 29 Jun 2015 00:51:03 +0100 Subject: [PATCH 0145/1173] implement peep update real names and update ride vehicle colours --- src/peep/peep.c | 67 +++++++++++++++++++++++++++++++++++++++++-- src/peep/peep.h | 2 ++ src/peep/staff.c | 3 +- src/ride/ride.c | 55 ++++++++++++++++++++++++++++++++--- src/ride/vehicle.h | 3 +- src/windows/options.c | 5 ++-- 6 files changed, 123 insertions(+), 12 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 67551e3d4d..09cf941597 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -44,6 +44,7 @@ static int peep_should_find_bench(rct_peep* peep); static void peep_stop_purchase_thought(rct_peep* peep, uint8 ride_type); static void sub_693BAB(rct_peep* peep); static void peep_spend_money(rct_peep *peep, money32 amount); +static void peep_give_real_name(rct_peep *peep); const char *gPeepEasterEggNames[] = { "MICHAEL SCHUMACHER", @@ -4783,9 +4784,9 @@ rct_peep *peep_generate(int x, int y, int z) peep->energy_growth_rate = energy; if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SHOW_REAL_GUEST_NAMES){ - RCT2_CALLPROC_X(0x0069C483, 0, 0, 0, 0, (int)peep, 0, 0); + peep_give_real_name(peep); } - RCT2_CALLPROC_X(0x00699115, 0, 0, 0, 0, (int)peep, 0, 0); + peep_update_name_sort(peep); RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16)++; @@ -5331,4 +5332,64 @@ static void peep_spend_money(rct_peep *peep, money32 amount) finance_payment(-amount, RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint32)); sound_play_panned(SOUND_PURCHASE, 0x8001, peep->x, peep->y, peep->z); -} \ No newline at end of file +} + +/** + * + * rct2: 0x0069C483 + */ +static void peep_give_real_name(rct_peep *peep) +{ + RCT2_CALLPROC_X(0x0069C483, 0, 0, 0, 0, (int)peep, 0, 0); +} + +/** + * + * rct2: 0x00699115 + */ +void peep_update_name_sort(rct_peep *peep) +{ + RCT2_CALLPROC_X(0x00699115, 0, 0, 0, 0, (int)peep, 0, 0); +} + +/** + * + * rct2: 0x0069926C + */ +void peep_update_names(bool realNames) +{ + rct_peep *peep; + uint16 spriteIndex; + bool restart; + + if (realNames) { + RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) |= PARK_FLAGS_SHOW_REAL_GUEST_NAMES; + do { + restart = false; + FOR_ALL_GUESTS(spriteIndex, peep) { + if (peep->name_string_idx == 767) { + peep_give_real_name(peep); + peep_update_name_sort(peep); + restart = true; + } + } + } while (restart); + gfx_invalidate_screen(); + } else { + RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_SHOW_REAL_GUEST_NAMES; + do { + restart = false; + FOR_ALL_GUESTS(spriteIndex, peep) { + if (peep->name_string_idx < 0xA000) + continue; + if (peep->name_string_idx >= 0xE000) + continue; + + peep->name_string_idx = 767; + peep_update_name_sort(peep); + restart = true; + } + } while (restart); + gfx_invalidate_screen(); + } +} diff --git a/src/peep/peep.h b/src/peep/peep.h index 28875d2bfd..e623d518b6 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -592,5 +592,7 @@ void remove_peep_from_ride(rct_peep* peep); void remove_peep_from_queue(rct_peep* peep); void sub_693BE5(rct_peep* peep, uint8 al); +void peep_update_name_sort(rct_peep *peep); +void peep_update_names(bool realNames); #endif diff --git a/src/peep/staff.c b/src/peep/staff.c index b6cc3233f8..73d6c9708a 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -241,8 +241,7 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, newPeep->energy_growth_rate = 0x60; newPeep->var_E2 = 0; - RCT2_CALLPROC_X(0x00699115, (uint32)ebp & 0xFFFFFF3F, 0, 0, 0, (int)newPeep, 0, - (*ebp << 25) | (*ebp >> 6)); + peep_update_name_sort(newPeep); newPeep->staff_id = newStaffId; diff --git a/src/ride/ride.c b/src/ride/ride.c index f5a3338891..cd610bccfe 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -140,6 +140,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 sub_6B59C6(int rideIndex); +static void ride_update_vehicle_colours(int rideIndex); rct_ride_type *ride_get_entry(rct_ride *ride) { @@ -4504,11 +4505,11 @@ void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, in break; case 2: *((uint8*)(&ride->vehicle_colours[index])) = value; - RCT2_CALLPROC_X(0x006DE102, 0, 0, 0, ride_id, 0, 0, 0); + ride_update_vehicle_colours(ride_id); break; case 3: *((uint8*)(&ride->vehicle_colours[index]) + 1) = value; - RCT2_CALLPROC_X(0x006DE102, 0, 0, 0, ride_id, 0, 0, 0); + ride_update_vehicle_colours(ride_id); break; case 4: ride->track_colour_supports[index] = value; @@ -4521,7 +4522,7 @@ void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, in ride->vehicle_colours[i] = ride->vehicle_colours[0]; ride->vehicle_colours_extended[i] = ride->vehicle_colours_extended[0]; } - RCT2_CALLPROC_X(0x006DE102, 0, 0, 0, ride_id, 0, 0, 0); + ride_update_vehicle_colours(ride_id); break; case 6: ride->entrance_style = value; @@ -4530,7 +4531,7 @@ void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, in break; case 7: ride->vehicle_colours_extended[index] = value; - RCT2_CALLPROC_X(0x006DE102, 0, 0, 0, ride_id, 0, 0, 0); + ride_update_vehicle_colours(ride_id); break; } window_invalidate_by_number(WC_RIDE, ride_id); @@ -5007,3 +5008,49 @@ void ride_fix_breakdown(int rideIndex, int reliabilityIncreaseFactor) uint8 unreliability = 100 - ((ride->reliability >> 8) & 0xFF); ride->reliability += reliabilityIncreaseFactor * (unreliability / 2); } + +/** + * + * rct2: 0x006DE102 + */ +static void ride_update_vehicle_colours(int rideIndex) +{ + rct_ride *ride; + rct_vehicle *vehicle; + rct_vehicle_colour colours; + uint16 spriteIndex; + uint8 coloursExtended; + + ride = GET_RIDE(rideIndex); + if (ride->type == RIDE_TYPE_SPACE_RINGS || ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_16)) { + gfx_invalidate_screen(); + } + + for (int i = 0; i < 32; i++) { + int carIndex = 0; + spriteIndex = ride->vehicles[i]; + while (spriteIndex != SPRITE_INDEX_NULL) { + vehicle = &(g_sprite_list[spriteIndex].vehicle); + switch (ride->colour_scheme_type & 3) { + case RIDE_COLOUR_SCHEME_ALL_SAME: + colours = ride->vehicle_colours[0]; + coloursExtended = ride->vehicle_colours_extended[0]; + break; + case RIDE_COLOUR_SCHEME_DIFFERENT_PER_TRAIN: + colours = ride->vehicle_colours[i]; + coloursExtended = ride->vehicle_colours_extended[i]; + break; + case RIDE_COLOUR_SCHEME_DIFFERENT_PER_CAR: + colours = ride->vehicle_colours[carIndex]; + coloursExtended = ride->vehicle_colours_extended[carIndex]; + break; + } + + vehicle->colours = colours; + vehicle->colours_extended = coloursExtended; + invalidate_sprite((rct_sprite*)vehicle); + spriteIndex = vehicle->next_vehicle_on_train; + carIndex++; + } + } +} diff --git a/src/ride/vehicle.h b/src/ride/vehicle.h index 866f52cc08..8c5b270101 100644 --- a/src/ride/vehicle.h +++ b/src/ride/vehicle.h @@ -58,7 +58,7 @@ typedef struct { uint8 pad_2C[0x04]; uint8 ride; // 0x30 uint8 vehicle_type; // 0x31 - uint8 pad_32[0x02]; + rct_vehicle_colour colours; // 0x32 uint16 var_34; sint16 var_36; //x related @@ -101,6 +101,7 @@ typedef struct { uint8 pad_CF[0x06]; uint8 var_D5; uint8 ride_subtype; // 0xD6 + uint8 colours_extended; // 0xD7 } rct_vehicle; enum { diff --git a/src/windows/options.c b/src/windows/options.c index 52cda609b7..86621a0836 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -555,8 +555,9 @@ static void window_options_mouseup() 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); + peep_update_names( + !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SHOW_REAL_GUEST_NAMES) + ); break; case WIDX_SAVE_PLUGIN_DATA_CHECKBOX: gConfigGeneral.save_plugin_data ^= 1; From c6e84181cbeea12758e73ca12ecb4e41f34f4e88 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 29 Jun 2015 01:24:07 +0100 Subject: [PATCH 0146/1173] implement ride_entry_get_train_layout --- src/ride/ride.c | 28 ++++++++++++++++++++++++++++ src/ride/ride.h | 2 ++ src/windows/ride.c | 45 ++++++++++++++++++++++++++------------------- 3 files changed, 56 insertions(+), 19 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index cd610bccfe..c57e040cba 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5054,3 +5054,31 @@ static void ride_update_vehicle_colours(int rideIndex) } } } + +/** + * + * rct2: 0x006DE4CD + * trainLayout: Originally fixed to 0x00F64E38. This no longer postfixes with 255. + */ +void ride_entry_get_train_layout(int rideEntryIndex, int numCarsPerTrain, uint8 *trainLayout) +{ + rct_ride_type *rideEntry = GET_RIDE_ENTRY(rideEntryIndex); + + for (int i = 0; i < numCarsPerTrain; i++) { + uint8 vehicleType = rideEntry->default_vehicle; + if (i == 0) { + if (rideEntry->front_vehicle != 255) + vehicleType = rideEntry->front_vehicle; + } else if (i == 1) { + if (rideEntry->second_vehicle != 255) + vehicleType = rideEntry->second_vehicle; + } else if (i == 2) { + if (rideEntry->third_vehicle != 255) + vehicleType = rideEntry->third_vehicle; + } else if (i == numCarsPerTrain - 1) { + if (rideEntry->rear_vehicle != 255) + vehicleType = rideEntry->rear_vehicle; + } + trainLayout[i] = vehicleType; + } +} diff --git a/src/ride/ride.h b/src/ride/ride.h index 143e654899..26c69916c1 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -937,4 +937,6 @@ money32 ride_remove_track_piece(int x, int y, int z, int direction, int type); bool ride_are_all_possible_entrances_and_exits_built(rct_ride *ride); void ride_fix_breakdown(int rideIndex, int reliabilityIncreaseFactor); +void ride_entry_get_train_layout(int rideEntryIndex, int numCarsPerTrain, uint8 *trainLayout); + #endif diff --git a/src/windows/ride.c b/src/windows/ride.c index b537a0d167..7c7d6b9f28 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -1036,7 +1036,9 @@ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo *dpi, rct_window *w) y = (widget->bottom - widget->top) - 12; ride = GET_RIDE(w->number); - RCT2_CALLPROC_X(0x006DE4CD, (ride->num_cars_per_train << 8) | ride->subtype, 0, 0, 0, 0, 0, 0); + + uint8 trainLayout[16]; + ride_entry_get_train_layout(ride->subtype, ride->num_cars_per_train, trainLayout); rideEntry = ride_get_entry(ride); if (rideEntry->flags & RIDE_ENTRY_FLAG_0) { @@ -1049,7 +1051,7 @@ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo *dpi, rct_window *w) dpi->y *= 2; } - rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[RCT2_ADDRESS(0x00F64E38, uint8)[rideEntry->tab_vehicle]]; + rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[trainLayout[rideEntry->tab_vehicle]]; height += rideVehicleEntry->var_0A; vehicleColour = ride_get_vehicle_colour(ride, 0); @@ -2654,13 +2656,14 @@ static void window_ride_vehicle_scrollpaint() // Background gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width, dpi->y + dpi->height, 12); - RCT2_CALLPROC_X(0x006DE4CD, (ride->num_cars_per_train << 8) | ride->subtype, 0, 0, 0, 0, 0, 0); + uint8 trainLayout[16]; + ride_entry_get_train_layout(ride->subtype, ride->num_cars_per_train, trainLayout); widget = &window_ride_vehicle_widgets[WIDX_VEHICLE_TRAINS_PREVIEW]; startX = max(2, ((widget->right - widget->left) - ((ride->num_vehicles - 1) * 36)) / 2 - 25); startY = widget->bottom - widget->top - 4; - rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[RCT2_ADDRESS(0x00F64E38, uint8)[0]]; + rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[trainLayout[0]]; startY += rideVehicleEntry->var_0A; // For each train @@ -2671,7 +2674,7 @@ static void window_ride_vehicle_scrollpaint() // For each car in train for (j = 0; j < ride->num_cars_per_train; j++) { - rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[RCT2_ADDRESS(0x00F64E38, uint8)[j]]; + rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[trainLayout[j]]; x += rideVehicleEntry->var_04 / 17432; y -= (rideVehicleEntry->var_04 / 2) / 17432; @@ -4220,22 +4223,24 @@ static void window_ride_colour_invalidate() window_ride_colour_widgets[WIDX_VEHICLE_MAIN_COLOUR].type = WWT_COLORBTN; window_ride_colour_widgets[WIDX_VEHICLE_MAIN_COLOUR].image = window_ride_get_colour_button_image(vehicleColour.main); - RCT2_CALLPROC_X(0x006DE4CD, (ride->num_cars_per_train << 8) | ride->subtype, 0, 0, 0, 0, 0, 0); + uint8 trainLayout[16]; + ride_entry_get_train_layout(ride->subtype, ride->num_cars_per_train, trainLayout); - uint8 *unk; - uint32 unk_eax = 0; - for (unk = (uint8*)0x00F64E38; *unk != 0xFF; unk++) { - unk_eax |= rideEntry->vehicles[*unk].var_14; - unk_eax = ror32(unk_eax, 16); - unk_eax |= rideEntry->vehicles[*unk].var_12; - unk_eax = ror32(unk_eax, 16); + uint32 colourFlags = 0; + for (int i = 0; i < ride->num_cars_per_train; i++) { + uint8 vehicleTypeIndex = trainLayout[i]; + + colourFlags |= rideEntry->vehicles[vehicleTypeIndex].var_14; + colourFlags = ror32(colourFlags, 16); + colourFlags |= rideEntry->vehicles[vehicleTypeIndex].var_12; + colourFlags = ror32(colourFlags, 16); } // Additional colours - if (unk_eax & 1) { + if (colourFlags & 1) { window_ride_colour_widgets[WIDX_VEHICLE_ADDITIONAL_COLOUR_1].type = WWT_COLORBTN; window_ride_colour_widgets[WIDX_VEHICLE_ADDITIONAL_COLOUR_1].image = window_ride_get_colour_button_image(vehicleColour.additional_1); - if (unk_eax & 0x2000000) { + if (colourFlags & 0x2000000) { window_ride_colour_widgets[WIDX_VEHICLE_ADDITIONAL_COLOUR_2].type = WWT_COLORBTN; window_ride_colour_widgets[WIDX_VEHICLE_ADDITIONAL_COLOUR_2].image = window_ride_get_colour_button_image(vehicleColour.additional_2); } else { @@ -4390,7 +4395,7 @@ static void window_ride_colour_scrollpaint() rct_ride *ride; rct_ride_type *rideEntry; rct_widget *vehiclePreviewWidget; - int colour, x, y, spriteIndex; + int trainCarIndex, x, y, spriteIndex; vehicle_colour vehicleColour; window_paint_get_registers(w, dpi); @@ -4406,13 +4411,15 @@ static void window_ride_colour_scrollpaint() // ? x = (vehiclePreviewWidget->right - vehiclePreviewWidget->left) / 2; y = vehiclePreviewWidget->bottom - vehiclePreviewWidget->top - 15; - RCT2_CALLPROC_X(0x006DE4CD, (ride->num_cars_per_train << 8) | ride->subtype, (int)ride, x, y, (int)w, (int)dpi, 0); + + uint8 trainLayout[16]; + ride_entry_get_train_layout(ride->subtype, ride->num_cars_per_train, trainLayout); // ? - colour = (ride->colour_scheme_type & 3) == RIDE_COLOUR_SCHEME_DIFFERENT_PER_CAR ? + trainCarIndex = (ride->colour_scheme_type & 3) == RIDE_COLOUR_SCHEME_DIFFERENT_PER_CAR ? w->var_48C : rideEntry->tab_vehicle; - rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[RCT2_ADDRESS(0x00F64E38, uint8)[colour]]; + rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[trainLayout[trainCarIndex]]; y += rideVehicleEntry->var_0A; From 380d459dfb07e77008852b2a21260dc955502ee6 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 29 Jun 2015 04:00:15 +0100 Subject: [PATCH 0147/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 6 +++--- data/language/english_us.txt | 4 ++-- data/language/german.txt | 40 ++++++++++++++++++++---------------- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index f8df060fd2..aeb7aadc19 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3676,8 +3676,8 @@ STR_5343 :Werknemers automatisch plaatsen STR_5344 :Wijzigingsoverzicht STR_5345 :Cheats voor geld STR_5346 :Cheats voor bezoekers -STR_5347 :Cheats voor attracties -STR_5348 :Cheats voor het park +STR_5347 :Cheats voor het park +STR_5348 :Cheats voor attracties STR_5349 :{SMALLFONT}{BLACK}Alle attracties STR_5350 :Max STR_5351 :Min @@ -3699,7 +3699,7 @@ STR_5366 :Normaal STR_5367 :Snel STR_5368 :Crashstatus weg STR_5369 :Parkparameters... -STR_5370 :{SMALLFONT}{BLACK}Klik op deze knop om park-{NEWLINE}parameters zoals verboden,{NEWLINE}bezoekersgenerering en geld aan te passen. +STR_5370 :{SMALLFONT}{BLACK}Klik op deze knop om park-{NEWLINE}parameters zoals verboden,{NEWLINE}bezoekersgenerering en geld{NEWLINE}aan te passen. STR_5371 :Objectselectie STR_5372 :Sleeprichting van rechtermuisknop omkeren STR_5373 :Naam {STRINGID} diff --git a/data/language/english_us.txt b/data/language/english_us.txt index c2883e1794..344538fd19 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3685,8 +3685,8 @@ STR_5343 :Automatically place staff STR_5344 :Changelog STR_5345 :Financial cheats STR_5346 :Guest cheats -STR_5347 :Ride cheats -STR_5348 :Park cheats +STR_5347 :Park cheats +STR_5348 :Ride cheats STR_5349 :{SMALLFONT}{BLACK}All Rides STR_5350 :Max STR_5351 :Min diff --git a/data/language/german.txt b/data/language/german.txt index 0ad49e4e4f..21d3dd934f 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -929,11 +929,11 @@ STR_0924 :{SMALLFONT}{BLACK}Spirale nach unten STR_0925 :{SMALLFONT}{BLACK}Spirale nach oben STR_0926 :Dies kann nicht entfernt werden... STR_0927 :Dies kann hier nicht gebaut werden... -STR_0928 :{SMALLFONT}{BLACK}Kettenlift, um Wagen einen Anstieg hinaufzuziehen +STR_0928 :{SMALLFONT}{BLACK}Kettenlift, um Wagen einen{NEWLINE}Anstieg hinaufzuziehen STR_0929 :S-Kurve (links) STR_0930 :S-Kurve (rechts) -STR_0931 :Vert. Schleife (l.) -STR_0932 :Vert. Schleife (r.) +STR_0931 :Vertikale Schleife (l.) +STR_0932 :Vertikale Schleife (r.) STR_0933 :Gelände zuerst höher bzw. niedriger machen STR_0934 :Attraktionseingang im Weg STR_0935 :Attraktionsausgang im Weg @@ -1382,8 +1382,8 @@ STR_1377 :Heartline-Roll (links) STR_1378 :Heartline-Roll (rechts) STR_1379 :Umdreher (links) STR_1380 :Umdreher (rechts) -STR_1381 :Gebog. Lifthügel (l.) -STR_1382 :Gebog. Lifthügel (r.) +STR_1381 :Gebogener Lifthügel (l.) +STR_1382 :Gebogener Lifthügel (r.) STR_1383 :Viertelschleife STR_1384 :{YELLOW}{STRINGID} STR_1385 :{SMALLFONT}{BLACK}Andere Streckenkonfigurationen @@ -1407,7 +1407,7 @@ STR_1402 :{SMALLFONT}{BLACK}Eingang zur Attraktion bauen oder verlegen STR_1403 :{SMALLFONT}{BLACK}Ausgang von Attraktion bauen oder verlegen STR_1404 :{SMALLFONT}{BLACK}Um 90{DEGREE} drehen STR_1405 :{SMALLFONT}{BLACK}Spiegelbild -STR_1406 :{SMALLFONT}{BLACK}Szenerie ein-/ausschalten (falls für diesen Entwurf verfügbar) +STR_1406 :{SMALLFONT}{BLACK}Szenerie ein-/ausschalten (falls{NEWLINE}für diesen Entwurf verfügbar) STR_1407 :{WINDOW_COLOUR_2}Dies bauen... STR_1408 :{WINDOW_COLOUR_2}Kosten: {BLACK}{CURRENCY} STR_1409 :Ein-/Ausgangsplattform @@ -1467,8 +1467,8 @@ STR_1462 :Zu steil für Lifthügel STR_1463 :Besucher STR_1464 :Spirale n. oben (klein) STR_1465 :Spirale n. oben (groß) -STR_1466 :Spirale n. unt. (klein) -STR_1467 :Spirale n. unt. (groß) +STR_1466 :Spirale n. unten (klein) +STR_1467 :Spirale n. unten (groß) STR_1468 :Personal STR_1469 :Fahrt muss mit Stationen anfangen und enden STR_1470 :Station nicht lang genug @@ -1674,16 +1674,16 @@ STR_1669 :{WINDOW_COLOUR_2}Zufriedenheit: {BLACK}{COMMA16}% STR_1670 :{WINDOW_COLOUR_2}Besucher gesamt: {BLACK}{COMMA32} STR_1671 :{WINDOW_COLOUR_2}Gesamtgewinn: {BLACK}{CURRENCY2DP} STR_1672 :Bremsen -STR_1673 :Drehkontrolle umschalten +STR_1673 :Drehkontrolle umschalt. STR_1674 :Bremsgeschwindigkeit STR_1675 :{POP16}{VELOCITY} -STR_1676 :{SMALLFONT}{BLACK}Geschwindigkeitsgrenze für Bremsen einstellen +STR_1676 :{SMALLFONT}{BLACK}Geschwindigkeitsgrenze{NEWLINE}für Bremsen einstellen STR_1677 :{WINDOW_COLOUR_2}Popularität: {BLACK}Unbekannt STR_1678 :{WINDOW_COLOUR_2}Popularität: {BLACK}{COMMA16}% STR_1679 :Spirale n. oben (links) -STR_1680 :Spirale n. oben (r.) -STR_1681 :Spirale n. unt. (links) -STR_1682 :Spirale n. unt. (r.) +STR_1680 :Spirale n. oben (rechts) +STR_1681 :Spirale n. unten (links) +STR_1682 :Spirale n. unten (rechts) STR_1683 :Grundflächengröße 2 x 2 STR_1684 :Grundflächengröße 4 x 4 STR_1685 :Grundflächengröße 2 x 4 @@ -2275,7 +2275,7 @@ STR_2270 :{WINDOW_COLOUR_2}Fortschritt: {BLACK}{STRINGID} STR_2271 :{WINDOW_COLOUR_2}Erwartet: {BLACK}{STRINGID} STR_2272 :{WINDOW_COLOUR_2}Attraktion:{NEWLINE}{BLACK}{STRINGID} STR_2273 :{WINDOW_COLOUR_2}Szenerie/Thema:{NEWLINE}{BLACK}{STRINGID} -STR_2274 :{SMALLFONT}{BLACK}Details zu dieser Erfindung bzw. Entwicklung anzeigen +STR_2274 :{SMALLFONT}{BLACK}Details zu dieser Erfindung bzw.{NEWLINE}Entwicklung anzeigen STR_2275 :{SMALLFONT}{BLACK}Finanzierung und Optionen für Forschung & Entwicklung anzeigen STR_2276 :{SMALLFONT}{BLACK}Forschungs- & Entwicklungsstatus anzeigen STR_2277 :Unbekannt @@ -3598,7 +3598,7 @@ STR_5261 :Filter STR_5262 :Wacky Worlds STR_5263 :Time Twister STR_5264 :Eigene -STR_5265 :{SMALLFONT}{BLACK}Auswählen, welche Inhaltsquellen angezeigt werden sollen +STR_5265 :{SMALLFONT}{BLACK}Auswählen, welche Inhaltsquellen{NEWLINE}angezeigt werden sollen STR_5266 :{SMALLFONT}{BLACK}Anzeige STR_5267 :{SMALLFONT}{BLACK}Sprache und Einheiten STR_5268 :{SMALLFONT}{BLACK}Audio @@ -3680,8 +3680,8 @@ STR_5343 :Personal automatisch platzieren STR_5344 :Changelog STR_5345 :Cheats für Finanzen STR_5346 :Cheats für Parkbesucher -STR_5347 :Cheats für Attraktionen -STR_5348 :Cheats für Park +STR_5347 :Cheats für Park +STR_5348 :Cheats für Attraktionen STR_5349 :{SMALLFONT}{BLACK}Alle Attraktionen STR_5350 :Max STR_5351 :Min @@ -3775,10 +3775,14 @@ STR_5438 :Es können keine Änderungen vorgenommen werden, solange der Befehl STR_5439 :Zusammen mit einem `Neustart'-Befehl muss ein mindestens 4 Sekunden langer `Warten'-Befehl verwendet werden STR_5440 :Vollbild minimieren, wenn Spiel nicht im Vordergrund STR_5441 :{SMALLFONT}{BLACK}Identifiziert Bahnen durch Streckentyp, sodass wie in RCT1 Fahrzeuge anschließend geändert werden können -STR_5442 :reserviert +STR_5442 :Parkbewertung: STR_5443 :Geschwind.{MOVE_X}{87}{STRINGID} STR_5444 :Geschwindigkeit: STR_5445 :Geschwindigkeit STR_5446 :Erhalten STR_5447 :Typ {STRINGID} STR_5448 :Bahn / Fahrzeug {STRINGID} +STR_5449 :Spielgeschwindigkeit verringern +STR_5450 :Spielgeschwindigkeit erhöhen +STR_5451 :Cheatfenster anzeigen +STR_5452 :Symbolleiste ein-/ausblenden From 4ada15c9724b06b0e5cabaad0ebecd97be67c4da Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 29 Jun 2015 15:13:42 +0100 Subject: [PATCH 0148/1173] implement ride_update_max_vehicles --- src/game.h | 2 +- src/ride/ride.c | 176 +++++++++++++++++++++++++++++++++++++++++---- src/ride/ride.h | 10 +-- src/ride/track.c | 6 +- src/windows/ride.c | 17 +++-- 5 files changed, 181 insertions(+), 30 deletions(-) diff --git a/src/game.h b/src/game.h index b5df70cc6b..cdc1fb865a 100644 --- a/src/game.h +++ b/src/game.h @@ -33,7 +33,7 @@ enum GAME_COMMAND { GAME_COMMAND_6, GAME_COMMAND_DEMOLISH_RIDE, GAME_COMMAND_SET_RIDE_STATUS, // 8 - GAME_COMMAND_9, + GAME_COMMAND_SET_RIDE_VEHICLES, GAME_COMMAND_SET_RIDE_NAME, GAME_COMMAND_SET_RIDE_SETTING, GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, diff --git a/src/ride/ride.c b/src/ride/ride.c index c57e040cba..9961362712 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3363,7 +3363,7 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * } ride->mode = new_value; - RCT2_CALLPROC_X(0x6DD57D, 0, 0, 0, ride_id, 0, 0, 0); + ride_update_max_vehicles(ride_id); break; case 1: ride->depart_flags = new_value; @@ -5066,19 +5066,169 @@ void ride_entry_get_train_layout(int rideEntryIndex, int numCarsPerTrain, uint8 for (int i = 0; i < numCarsPerTrain; i++) { uint8 vehicleType = rideEntry->default_vehicle; - if (i == 0) { - if (rideEntry->front_vehicle != 255) - vehicleType = rideEntry->front_vehicle; - } else if (i == 1) { - if (rideEntry->second_vehicle != 255) - vehicleType = rideEntry->second_vehicle; - } else if (i == 2) { - if (rideEntry->third_vehicle != 255) - vehicleType = rideEntry->third_vehicle; - } else if (i == numCarsPerTrain - 1) { - if (rideEntry->rear_vehicle != 255) - vehicleType = rideEntry->rear_vehicle; + if (i == 0 && rideEntry->front_vehicle != 255) { + vehicleType = rideEntry->front_vehicle; + } else if (i == 1 && rideEntry->second_vehicle != 255) { + vehicleType = rideEntry->second_vehicle; + } else if (i == 2 && rideEntry->third_vehicle != 255) { + vehicleType = rideEntry->third_vehicle; + } else if (i == numCarsPerTrain - 1 && rideEntry->rear_vehicle != 255) { + vehicleType = rideEntry->rear_vehicle; } trainLayout[i] = vehicleType; } } + +int ride_get_smallest_station_length(rct_ride *ride) +{ + uint32 result = -1; + for (int i = 0; i < 4; i++) { + if (ride->station_starts[i] != 0xFFFF) { + result = min(result, (uint32)(ride->station_length[i] & 0x0F)); + } + } + return (int)result; +} + +static int sub_6CB3AA(rct_ride *ride) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + + edi = (int)ride; + RCT2_CALLFUNC_X(0x006CB3AA, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + return eax; +} + +/** + * + * rct2: 0x006DD57D + */ +void ride_update_max_vehicles(int rideIndex) +{ + rct_ride *ride; + rct_ride_type *rideEntry; + rct_ride_type_vehicle *vehicleEntry; + uint8 trainLayout[16], numCarsPerTrain, numVehicles; + int trainLength, maxNumTrains; + + ride = GET_RIDE(rideIndex); + if (ride->subtype == 0xFF) + return; + + rideEntry = GET_RIDE_ENTRY(ride->subtype); + if (rideEntry->cars_per_flat_ride == 0xFF) { + ride->num_cars_per_train = max(rideEntry->min_cars_in_train, ride->num_cars_per_train); + ride->min_max_cars_per_train = rideEntry->max_cars_in_train | (rideEntry->min_cars_in_train << 4); + + // Calculate maximum train length based on smallest station length + int stationLength = ride_get_smallest_station_length(ride); + if (stationLength == -1) + return; + + stationLength = (stationLength * 0x44180) - 0x16B2A; + int maxFriction = RCT2_GLOBAL(0x0097D21B + (ride->type * 8), uint8) << 8; + int maxCarsPerTrain = 1; + for (int numCars = rideEntry->max_cars_in_train; numCars > 0; numCars--) { + ride_entry_get_train_layout(ride->subtype, numCars, trainLayout); + trainLength = 0; + int totalFriction = 0; + for (int i = 0; i < numCars; i++) { + vehicleEntry = &rideEntry->vehicles[trainLayout[i]]; + trainLength += vehicleEntry->var_04; + totalFriction += vehicleEntry->var_08; + } + + if (trainLength <= stationLength && totalFriction <= maxFriction) { + maxCarsPerTrain = numCars; + break; + } + } + maxCarsPerTrain = max(maxCarsPerTrain, rideEntry->min_cars_in_train); + ride->min_max_cars_per_train = maxCarsPerTrain | (rideEntry->min_cars_in_train << 4); + + switch (ride->mode) { + case RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED: + case RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED: + maxNumTrains = clamp(1, ride->num_stations + ride->num_block_brakes - 1, 31); + break; + case RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE: + case RIDE_MODE_POWERED_LAUNCH_PASSTROUGH: + case RIDE_MODE_SHUTTLE: + case RIDE_MODE_LIM_POWERED_LAUNCH: + case RIDE_MODE_POWERED_LAUNCH: + maxNumTrains = 1; + break; + default: + // Calculate maximum number of trains + ride_entry_get_train_layout(ride->subtype, maxCarsPerTrain, trainLayout); + trainLength = 0; + for (int i = 0; i < maxCarsPerTrain; i++) { + vehicleEntry = &rideEntry->vehicles[trainLayout[i]]; + trainLength += vehicleEntry->var_04; + } + + int totalLength = trainLength / 2; + if (maxCarsPerTrain != 1) + totalLength /= 2; + + maxNumTrains = 0; + do { + maxNumTrains++; + totalLength += trainLength; + } while (totalLength <= stationLength); + + if ( + (ride->mode != RIDE_MODE_STATION_TO_STATION && ride->mode != RIDE_MODE_CONTINUOUS_CIRCUIT) || + !(RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x40) + ) { + maxNumTrains = min(maxNumTrains, 31); + } else { + ride_entry_get_train_layout(ride->subtype, maxCarsPerTrain, trainLayout); + vehicleEntry = &rideEntry->vehicles[trainLayout[0]]; + int unk = vehicleEntry->var_5C; + + int totalSpacing = 0; + for (int i = 0; i < maxCarsPerTrain; i++) { + vehicleEntry = &rideEntry->vehicles[trainLayout[i]]; + totalSpacing += vehicleEntry->var_04; + } + + totalSpacing >>= 13; + int unk2 = sub_6CB3AA(ride) / 4; + if (unk > 10) { + unk2 = (unk2 * 3) / 4; + } + if (unk > 25) { + unk2 = (unk2 * 3) / 4; + } + if (unk > 40) { + unk2 = (unk2 * 3) / 4; + } + + maxNumTrains = 0; + int unk3 = 0; + do { + maxNumTrains++; + unk3 += totalSpacing; + } while (maxNumTrains < 31 && unk3 < unk2); + } + break; + } + ride->max_trains = maxNumTrains; + + numCarsPerTrain = min(ride->var_0CB, maxCarsPerTrain); + numVehicles = min(ride->var_0CA, maxNumTrains); + } else { + ride->max_trains = rideEntry->cars_per_flat_ride; + ride->min_max_cars_per_train = rideEntry->max_cars_in_train | (rideEntry->min_cars_in_train << 4); + numCarsPerTrain = rideEntry->max_cars_in_train; + numVehicles = min(ride->var_0CA, rideEntry->cars_per_flat_ride); + } + + // Refresh new current num vehicles / num cars per vehicle + if (numVehicles != ride->num_vehicles || numCarsPerTrain != ride->num_cars_per_train) { + ride->num_cars_per_train = numCarsPerTrain; + ride->num_vehicles = numVehicles; + window_invalidate_by_number(WC_RIDE, rideIndex); + } +} \ No newline at end of file diff --git a/src/ride/ride.h b/src/ride/ride.h index 26c69916c1..05bce45c8d 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -154,7 +154,7 @@ typedef struct { uint16 overall_view; // 0x050 00XX = X, XX00 = Y (* 32 + 16) uint16 station_starts[4]; // 0x052 uint8 station_heights[4]; // 0x05A - uint8 pad_05E[0x4]; + uint8 station_length[4]; // 0x05E uint8 station_depart[4]; // 0x062 uint8 var_066[4]; uint16 entrances[4]; // 0x06A @@ -168,9 +168,10 @@ typedef struct { uint8 num_stations; // 0x0C7 uint8 num_vehicles; // 0x0C8 uint8 num_cars_per_train; // 0x0C9 - uint8 pad_0CA[0x2]; - uint8 var_0CC; - uint8 var_0CD; + uint8 var_0CA; + uint8 var_0CB; + uint8 max_trains; // 0x0CC + uint8 min_max_cars_per_train; // 0x0CD uint8 min_waiting_time; // 0x0CE uint8 max_waiting_time; // 0x0CF union { @@ -938,5 +939,6 @@ bool ride_are_all_possible_entrances_and_exits_built(rct_ride *ride); void ride_fix_breakdown(int rideIndex, int reliabilityIncreaseFactor); void ride_entry_get_train_layout(int rideEntryIndex, int numCarsPerTrain, uint8 *trainLayout); +void ride_update_max_vehicles(int rideIndex); #endif diff --git a/src/ride/track.c b/src/ride/track.c index 06ca30f6ee..46e91b162a 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3250,14 +3250,14 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int } if (entry_index != 0xFF){ - game_do_command(0, GAME_COMMAND_FLAG_APPLY | (2 << 8), 0, rideIndex | (entry_index << 8), GAME_COMMAND_9, 0, 0); + game_do_command(0, GAME_COMMAND_FLAG_APPLY | (2 << 8), 0, rideIndex | (entry_index << 8), GAME_COMMAND_SET_RIDE_VEHICLES, 0, 0); } game_do_command(0, GAME_COMMAND_FLAG_APPLY | (track_design->ride_mode << 8), 0, rideIndex | (0 << 8), GAME_COMMAND_SET_RIDE_SETTING, 0, 0); - game_do_command(0, GAME_COMMAND_FLAG_APPLY | (0 << 8), 0, rideIndex | (track_design->number_of_trains << 8), GAME_COMMAND_9, 0, 0); + game_do_command(0, GAME_COMMAND_FLAG_APPLY | (0 << 8), 0, rideIndex | (track_design->number_of_trains << 8), GAME_COMMAND_SET_RIDE_VEHICLES, 0, 0); - game_do_command(0, GAME_COMMAND_FLAG_APPLY | (1 << 8), 0, rideIndex | (track_design->number_of_cars_per_train << 8), GAME_COMMAND_9, 0, 0); + game_do_command(0, GAME_COMMAND_FLAG_APPLY | (1 << 8), 0, rideIndex | (track_design->number_of_cars_per_train << 8), GAME_COMMAND_SET_RIDE_VEHICLES, 0, 0); game_do_command(0, GAME_COMMAND_FLAG_APPLY | (track_design->depart_flags << 8), 0, rideIndex | (1 << 8), GAME_COMMAND_SET_RIDE_SETTING, 0, 0); diff --git a/src/windows/ride.c b/src/windows/ride.c index 7c7d6b9f28..c7e2f8b137 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -1419,9 +1419,8 @@ static void window_ride_set_page(rct_window *w, int page) w->frame_no = 0; w->var_492 = 0; - if (page == WINDOW_RIDE_PAGE_VEHICLE){ - // Reload the vehicle settings - RCT2_CALLPROC_X(0x006DD57D, 0, 0, 0, w->number, 0, 0, 0); + if (page == WINDOW_RIDE_PAGE_VEHICLE) { + ride_update_max_vehicles(w->number); } if (w->viewport != NULL) { @@ -2401,7 +2400,7 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi dropdownWidget->bottom - dropdownWidget->top + 1, w->colours[1], DROPDOWN_FLAG_STAY_OPEN, - ride->var_0CC, + ride->max_trains, widget->right - dropdownWidget->left ); @@ -2414,8 +2413,8 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi gDropdownItemsChecked = (1 << (ride->num_vehicles - 1)); break; case WIDX_VEHICLE_CARS_PER_TRAIN_DROPDOWN: - minCars = (ride->var_0CD >> 4); - maxCars = (ride->var_0CD & 0x0F); + minCars = (ride->min_max_cars_per_train >> 4); + maxCars = (ride->min_max_cars_per_train & 0x0F); window_dropdown_show_text_custom_width( w->x + dropdownWidget->left, @@ -2466,15 +2465,15 @@ static void window_ride_vehicle_dropdown() dropdownIndex = (gDropdownItemsArgs[dropdownIndex] >> 16) & 0xFFFF; RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1018; - game_do_command(0, (2 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_9, 0, 0); + game_do_command(0, (2 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_SET_RIDE_VEHICLES, 0, 0); break; case WIDX_VEHICLE_TRAINS_DROPDOWN: RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1020; - game_do_command(0, (0 << 8) | 1, 0, ((dropdownIndex + 1) << 8) | w->number, GAME_COMMAND_9, 0, 0); + game_do_command(0, (0 << 8) | 1, 0, ((dropdownIndex + 1) << 8) | w->number, GAME_COMMAND_SET_RIDE_VEHICLES, 0, 0); break; case WIDX_VEHICLE_CARS_PER_TRAIN_DROPDOWN: RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1019; - game_do_command(0, (1 << 8) | 1, 0, ((rideEntry->min_cars_in_train + dropdownIndex) << 8) | w->number, GAME_COMMAND_9, 0, 0); + game_do_command(0, (1 << 8) | 1, 0, ((rideEntry->min_cars_in_train + dropdownIndex) << 8) | w->number, GAME_COMMAND_SET_RIDE_VEHICLES, 0, 0); break; } } From c3d5d5f6c25c8a60ea3ee676c840404dcc37afa4 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 29 Jun 2015 16:14:56 +0100 Subject: [PATCH 0149/1173] implement game_command_set_ride_vehicles --- src/game.c | 4 +- src/localisation/string_ids.h | 3 + src/ride/ride.c | 132 ++++++++++++++++++++++++++++++++-- src/ride/ride.h | 11 +++ src/windows/ride.c | 10 +-- 5 files changed, 146 insertions(+), 14 deletions(-) diff --git a/src/game.c b/src/game.c index 1a765677b1..799c6481d6 100644 --- a/src/game.c +++ b/src/game.c @@ -915,7 +915,7 @@ static uint32 game_do_command_table[58] = { 0x006B3F0F, 0, 0, - 0x006B52D4, + 0, 0, // 10 0, 0x006660A8, @@ -978,7 +978,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_emptysub, game_command_demolish_ride, game_command_set_ride_status, - game_command_emptysub, + game_command_set_ride_vehicles, game_command_set_ride_name, // 10 game_command_set_ride_setting, game_command_emptysub, diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 0621ba8706..922a4b069f 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -252,6 +252,9 @@ enum { STR_OPEN_PARK = 1014, STR_CANT_CHANGE_OPERATING_MODE = 1017, + STR_RIDE_SET_VEHICLE_TYPE_FAIL = 1018, + STR_RIDE_SET_VEHICLE_SET_NUM_CARS_PER_TRAIN_FAIL = 1019, + STR_RIDE_SET_VEHICLE_SET_NUM_TRAINS_FAIL = 1020, STR_LOCATE_SUBJECT_TIP = 1027, STR_OFF_EDGE_OF_MAP = 1028, diff --git a/src/ride/ride.c b/src/ride/ride.c index 9961362712..64b8e3d5a7 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5219,10 +5219,10 @@ void ride_update_max_vehicles(int rideIndex) numCarsPerTrain = min(ride->var_0CB, maxCarsPerTrain); numVehicles = min(ride->var_0CA, maxNumTrains); } else { - ride->max_trains = rideEntry->cars_per_flat_ride; - ride->min_max_cars_per_train = rideEntry->max_cars_in_train | (rideEntry->min_cars_in_train << 4); - numCarsPerTrain = rideEntry->max_cars_in_train; - numVehicles = min(ride->var_0CA, rideEntry->cars_per_flat_ride); + ride->max_trains = rideEntry->cars_per_flat_ride; + ride->min_max_cars_per_train = rideEntry->max_cars_in_train | (rideEntry->min_cars_in_train << 4); + numCarsPerTrain = rideEntry->max_cars_in_train; + numVehicles = min(ride->var_0CA, rideEntry->cars_per_flat_ride); } // Refresh new current num vehicles / num cars per vehicle @@ -5231,4 +5231,126 @@ void ride_update_max_vehicles(int rideIndex) ride->num_vehicles = numVehicles; window_invalidate_by_number(WC_RIDE, rideIndex); } -} \ No newline at end of file +} + +static void sub_6DE52C(rct_ride *ride) +{ + RCT2_CALLPROC_X(0x006DE52C, 0, 0, 0, 0, (int)ride, 0, 0); +} + +void ride_set_ride_entry(int rideIndex, int rideEntry) +{ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_SET_VEHICLE_TYPE_FAIL; + game_do_command( + 0, + GAME_COMMAND_FLAG_APPLY | (RIDE_SET_VEHICLES_COMMAND_TYPE_RIDE_ENTRY << 8), + 0, + (rideEntry << 8) | rideIndex, + GAME_COMMAND_SET_RIDE_VEHICLES, + 0, + 0 + ); +} + +void ride_set_num_vehicles(int rideIndex, int numVehicles) +{ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_SET_VEHICLE_SET_NUM_TRAINS_FAIL; + game_do_command( + 0, + GAME_COMMAND_FLAG_APPLY | (RIDE_SET_VEHICLES_COMMAND_TYPE_NUM_TRAINS << 8), + 0, + (numVehicles << 8) | rideIndex, + GAME_COMMAND_SET_RIDE_VEHICLES, + 0, + 0 + ); +} + +void ride_set_num_cars_per_vehicle(int rideIndex, int numCarsPerVehicle) +{ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_SET_VEHICLE_SET_NUM_CARS_PER_TRAIN_FAIL; + game_do_command( + 0, + GAME_COMMAND_FLAG_APPLY | (RIDE_SET_VEHICLES_COMMAND_TYPE_NUM_CARS_PER_TRAIN << 8), + 0, + (numCarsPerVehicle << 8) | rideIndex, + GAME_COMMAND_SET_RIDE_VEHICLES, + 0, + 0 + ); +} + +/** + * + * rct2: 0x006B52D4 + */ +void game_command_set_ride_vehicles(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) +{ + rct_ride *ride; + rct_ride_type *rideEntry; + rct_window *w; + int rideIndex, commandType, value; + + commandType = (*ebx >> 8) & 0xFF; + rideIndex = *edx & 0xFF; + value = (*edx >> 8) & 0xFF; + + ride = GET_RIDE(rideIndex); + + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_PARK_ENTRANCE_TICKETS; + + if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_HAS_BROKEN_DOWN_AND_REQUIRES_FIXING; + *ebx = MONEY32_UNDEFINED; + return; + } + + if (ride->status != RIDE_STATUS_CLOSED) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_MUST_BE_CLOSED_FIRST; + *ebx = MONEY32_UNDEFINED; + return; + } + + if (!(*ebx & GAME_COMMAND_FLAG_APPLY)) { + *ebx = 0; + return; + } + + sub_6B59C6(rideIndex); + ride_clear_for_construction(rideIndex); + ride_remove_peeps(rideIndex); + ride->var_1CA = 100; + if (ride->type != RIDE_TYPE_ENTERPRISE) { + gfx_invalidate_screen(); + } + + switch (commandType) { + case RIDE_SET_VEHICLES_COMMAND_TYPE_NUM_TRAINS: + ride->var_0CA = value; + if (ride->type != RIDE_TYPE_SPACE_RINGS) { + gfx_invalidate_screen(); + } + break; + case RIDE_SET_VEHICLES_COMMAND_TYPE_NUM_CARS_PER_TRAIN: + rideEntry = GET_RIDE_ENTRY(ride->subtype); + value = clamp(rideEntry->min_cars_in_train, value, rideEntry->max_cars_in_train); + ride->var_0CB = value; + break; + case RIDE_SET_VEHICLES_COMMAND_TYPE_RIDE_ENTRY: + ride->subtype = value; + sub_6DE52C(ride); + break; + } + + ride->num_circuits = 1; + ride_update_max_vehicles(rideIndex); + + w = window_find_by_number(WC_RIDE, rideIndex); + if (w != NULL) { + if (w->page == 4) { + w->var_48C = 0; + } + window_invalidate(w); + } + *ebx = 0; +} diff --git a/src/ride/ride.h b/src/ride/ride.h index 05bce45c8d..441290907c 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -773,6 +773,12 @@ enum { RIDE_CONSTRUCTION_STATE_8 }; +enum { + RIDE_SET_VEHICLES_COMMAND_TYPE_NUM_TRAINS, + RIDE_SET_VEHICLES_COMMAND_TYPE_NUM_CARS_PER_TRAIN, + RIDE_SET_VEHICLES_COMMAND_TYPE_RIDE_ENTRY +}; + #define MAX_RIDES 255 #define MAX_RIDE_MEASUREMENTS 8 @@ -941,4 +947,9 @@ void ride_fix_breakdown(int rideIndex, int reliabilityIncreaseFactor); void ride_entry_get_train_layout(int rideEntryIndex, int numCarsPerTrain, uint8 *trainLayout); void ride_update_max_vehicles(int rideIndex); +void ride_set_ride_entry(int rideIndex, int rideEntry); +void ride_set_num_vehicles(int rideIndex, int numVehicles); +void ride_set_num_cars_per_vehicle(int rideIndex, int numCarsPerVehicle); +void game_command_set_ride_vehicles(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); + #endif diff --git a/src/windows/ride.c b/src/windows/ride.c index c7e2f8b137..fbe5ddf64d 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -2463,17 +2463,13 @@ static void window_ride_vehicle_dropdown() switch (widgetIndex) { case WIDX_VEHICLE_TYPE_DROPDOWN: dropdownIndex = (gDropdownItemsArgs[dropdownIndex] >> 16) & 0xFFFF; - - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1018; - game_do_command(0, (2 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_SET_RIDE_VEHICLES, 0, 0); + ride_set_ride_entry(w->number, dropdownIndex); break; case WIDX_VEHICLE_TRAINS_DROPDOWN: - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1020; - game_do_command(0, (0 << 8) | 1, 0, ((dropdownIndex + 1) << 8) | w->number, GAME_COMMAND_SET_RIDE_VEHICLES, 0, 0); + ride_set_num_vehicles(w->number, dropdownIndex + 1); break; case WIDX_VEHICLE_CARS_PER_TRAIN_DROPDOWN: - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1019; - game_do_command(0, (1 << 8) | 1, 0, ((rideEntry->min_cars_in_train + dropdownIndex) << 8) | w->number, GAME_COMMAND_SET_RIDE_VEHICLES, 0, 0); + ride_set_num_cars_per_vehicle(w->number, rideEntry->min_cars_in_train + dropdownIndex); break; } } From 40ba6a3efa495284e9e9a9fa3ea3a62de170bfd2 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 29 Jun 2015 17:22:01 +0100 Subject: [PATCH 0150/1173] remove various callprocs --- src/interface/window.h | 1 + src/ride/ride.c | 13 ++++++- src/ride/ride.h | 2 + src/ride/track.c | 2 +- src/windows/guest.c | 6 +-- src/windows/maze_construction.c | 33 +++++++++++++++++ src/windows/staff.c | 6 +-- src/world/map.c | 2 +- src/world/map_animation.c | 2 +- src/world/sprite.c | 66 ++++++++++++++++++++++++++++++--- src/world/sprite.h | 1 + 11 files changed, 113 insertions(+), 21 deletions(-) diff --git a/src/interface/window.h b/src/interface/window.h index e571e2f312..5e02e69147 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -566,6 +566,7 @@ void window_ride_construct(rct_window *w); void window_ride_list_open(); rct_window *window_ride_construction_open(); rct_window *window_maze_construction_open(); +void window_maze_construction_update_pressed_widgets(); void window_track_place_open(); rct_window *window_new_ride_open(); rct_window *window_new_ride_open_research(); diff --git a/src/ride/ride.c b/src/ride/ride.c index 64b8e3d5a7..f6648495da 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1285,7 +1285,7 @@ int ride_modify_maze(rct_map_element *mapElement, int x, int y) _currentTrackBeginZ = mapElement->base_height * 8; _currentTrackSelectionFlags = 0; _rideConstructionArrowPulseTime = 0; - RCT2_CALLPROC_X(0x006CD887, 0, 0, 0, 0, 0, 0, 0); + window_maze_construction_update_pressed_widgets(); return 1; } @@ -4398,7 +4398,7 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi ride_stop_peeps_queuing(ride_id); *ebx = ride_get_refund_price(ride_id); - RCT2_CALLPROC_X(0x006CB945, 0, 0, 0, ride_id, 0, 0, 0); + sub_6CB945(ride_id); news_item_disable_news(NEWS_ITEM_RIDE, ride_id); for(int i = 0; i < MAX_BANNERS; i++){ @@ -5354,3 +5354,12 @@ void game_command_set_ride_vehicles(int *eax, int *ebx, int *ecx, int *edx, int } *ebx = 0; } + +/** + * + * rct2: 0x006CB945 + */ +void sub_6CB945(int rideIndex) +{ + RCT2_CALLPROC_X(0x006CB945, 0, 0, 0, rideIndex, 0, 0, 0); +} diff --git a/src/ride/ride.h b/src/ride/ride.h index 441290907c..6733468af2 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -952,4 +952,6 @@ void ride_set_num_vehicles(int rideIndex, int numVehicles); void ride_set_num_cars_per_vehicle(int rideIndex, int numCarsPerVehicle); void game_command_set_ride_vehicles(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +void sub_6CB945(int rideIndex); + #endif diff --git a/src/ride/track.c b/src/ride/track.c index 46e91b162a..4c71ba126a 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1856,7 +1856,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac } if (RCT2_GLOBAL(0x00F440D4, uint8) == 6){ - RCT2_CALLPROC_X(0x006CB945, 0, 0, 0, RCT2_GLOBAL(0x00F440A7, uint8), 0, 0, 0); + sub_6CB945(RCT2_GLOBAL(0x00F440A7, uint8)); rct_ride* ride = GET_RIDE(RCT2_GLOBAL(0x00F440A7, uint8)); user_string_free(ride->name); ride->type = RIDE_TYPE_NULL; diff --git a/src/windows/guest.c b/src/windows/guest.c index d5b9467b55..ffbfaae46c 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -1213,11 +1213,7 @@ void window_guest_overview_tool_down(){ return; } - int _edx; - _edx = (dest_z / 8) | (((dest_z / 8) + 1) << 8); - int flags = RCT2_CALLPROC_X(0x68B93A, tile_x, 0xF, tile_y, _edx, (int)w, 0, 0); - - if (flags & 0x100){ + if (!map_can_construct_at(tile_x, tile_y, dest_z / 8, (dest_z / 8) + 1, 15)){ if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) != 0x3A5 ){ if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) != 0x49B){ window_error_open(0x785, -1); diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index 0a659f63b2..0c0ec22bc7 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -209,3 +209,36 @@ static void window_maze_construction_paint() window_draw_widgets(w, dpi); } + +/** + * + * rct2: 0x006CD887 + */ +void window_maze_construction_update_pressed_widgets() +{ + rct_window *w; + + w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w == NULL) + return; + + uint64 pressedWidgets = w->pressed_widgets; + pressedWidgets &= ~(1ULL << WIDX_MAZE_BUILD_MODE); + pressedWidgets &= ~(1ULL << WIDX_MAZE_MOVE_MODE); + pressedWidgets &= ~(1ULL << WIDX_MAZE_FILL_MODE); + + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_6: + pressedWidgets |= (1ULL << WIDX_MAZE_BUILD_MODE); + break; + case RIDE_CONSTRUCTION_STATE_7: + pressedWidgets |= (1ULL << WIDX_MAZE_MOVE_MODE); + break; + case RIDE_CONSTRUCTION_STATE_8: + pressedWidgets |= (1ULL << WIDX_MAZE_FILL_MODE); + break; + } + + w->pressed_widgets = pressedWidgets; + window_invalidate(w); +} diff --git a/src/windows/staff.c b/src/windows/staff.c index 117d41d9ee..7e0fec7fb5 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -1139,11 +1139,7 @@ void window_staff_overview_tool_down(){ return; } - int _edx; - _edx = (dest_z / 8) | (((dest_z / 8) + 1) << 8); - int flags = RCT2_CALLPROC_X(0x68B93A, tile_x, 0xF, tile_y, _edx, (int)w, 0, 0); - - if (flags & 0x100){ + if (!map_can_construct_at(tile_x, tile_y, dest_z / 8, (dest_z / 8) + 1, 15)){ if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) != 0x3A5){ if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) != 0x49B){ window_error_open(0x785, -1); diff --git a/src/world/map.c b/src/world/map.c index 17412bae0c..b4faaf0096 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1387,7 +1387,7 @@ money32 map_change_surface_style(int x0, int y0, int x1, int y1, uint8 surfaceSt mapElement->type |= (surfaceStyle >> 3) & MAP_ELEMENT_DIRECTION_MASK; map_invalidate_tile_full(x, y); - RCT2_CALLPROC_X(0x00673883, x, 0, y, map_element_height(x, y), 0, 0, 0); + footpath_remove_litter(x, y, map_element_height(x, y)); } } } diff --git a/src/world/map_animation.c b/src/world/map_animation.c index 3a31fe5d82..62f879448d 100644 --- a/src/world/map_animation.c +++ b/src/world/map_animation.c @@ -212,7 +212,7 @@ static bool map_animation_invalidate_small_scenery(int x, int y, int baseZ) peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - RCT2_CALLPROC_X(0x006EC53F, 0, 0, 0, 0, (int)peep, 0, 0); + sub_6EC53F((rct_sprite*)peep); break; } } diff --git a/src/world/sprite.c b/src/world/sprite.c index 1127ec59da..9334aec0ee 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -764,6 +764,51 @@ void move_sprite_to_list(rct_sprite *sprite, uint8 cl) ++(RCT2_GLOBAL(0x13573C8 + cl, uint16)); } +/** + * + * rct: 0x00673200 + */ +static void sub_673200(rct_sprite *sprite) +{ + RCT2_CALLPROC_X(0x00673200, 0, 0, 0, 0, (int)sprite, 0, 0); +} + +/** + * + * rct: 0x00673298 + */ +static void sub_673298(rct_sprite *sprite) +{ + RCT2_CALLPROC_X(0x00673298, 0, 0, 0, 0, (int)sprite, 0, 0); +} + +/** + * + * rct: 0x00673385 + */ +static void sub_673385(rct_sprite *sprite) +{ + RCT2_CALLPROC_X(0x00673385, 0, 0, 0, 0, (int)sprite, 0, 0); +} + +/** + * + * rct: 0x0067339D + */ +static void sub_67339D(rct_sprite *sprite) +{ + RCT2_CALLPROC_X(0x0067339D, 0, 0, 0, 0, (int)sprite, 0, 0); +} + +/** + * + * rct: 0x006733B4 + */ +static void sub_6733B4(rct_sprite *sprite) +{ + RCT2_CALLPROC_X(0x006733B4, 0, 0, 0, 0, (int)sprite, 0, 0); +} + /** * * rct: 0x006731CD @@ -772,22 +817,22 @@ void sprite_misc_update(rct_sprite *sprite) { switch (sprite->unknown.misc_identifier) { case SPRITE_MISC_0: - RCT2_CALLPROC_X(0x00673200, 0, 0, 0, 0, (int)sprite, 0, 0); + sub_673200(sprite); break; case SPRITE_MISC_MONEY_EFFECT: money_effect_update(&sprite->money_effect); break; case SPRITE_MISC_2: - RCT2_CALLPROC_X(0x00673298, 0, 0, 0, 0, (int)sprite, 0, 0); + sub_673298(sprite); break; case SPRITE_MISC_3: - RCT2_CALLPROC_X(0x00673385, 0, 0, 0, 0, (int)sprite, 0, 0); + sub_673385(sprite); break; case SPRITE_MISC_4: - RCT2_CALLPROC_X(0x0067339D, 0, 0, 0, 0, (int)sprite, 0, 0); + sub_67339D(sprite); break; case SPRITE_MISC_5: - RCT2_CALLPROC_X(0x006733B4, 0, 0, 0, 0, (int)sprite, 0, 0); + sub_6733B4(sprite); break; case SPRITE_MISC_JUMPING_FOUNTAIN_WATER: case SPRITE_MISC_JUMPING_FOUNTAIN_SNOW: @@ -975,4 +1020,13 @@ void litter_create(int x, int y, int z, int direction, int type) sprite_move(x, y, z, (rct_sprite*)litter); sub_6EC60B((rct_sprite*)litter); litter->creationTick = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32); -} \ No newline at end of file +} + +/** + * + * rct2: 0x006EC53F + */ +void sub_6EC53F(rct_sprite *sprite) +{ + RCT2_CALLPROC_X(0x006EC53F, 0, 0, 0, 0, (int)sprite, 0, 0); +} diff --git a/src/world/sprite.h b/src/world/sprite.h index 4dbdebae6a..1d8be65694 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -257,5 +257,6 @@ void invalidate_sprite(rct_sprite *sprite); void sub_6EC60B(rct_sprite* sprite); void sprite_remove(rct_sprite *sprite); void litter_create(int x, int y, int z, int direction, int type); +void sub_6EC53F(rct_sprite *sprite); #endif From 19edd8a3bb390b088acf22149545f2a7de26db99 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 29 Jun 2015 17:36:07 +0100 Subject: [PATCH 0151/1173] refactor game command enum --- src/editor.c | 2 +- src/game.h | 58 ++++++++++++++++----------------- src/ride/ride.c | 18 +++++----- src/ride/track.c | 10 +++--- src/windows/ride_construction.c | 2 +- src/windows/staff.c | 6 ++-- src/windows/top_toolbar.c | 8 ++--- src/world/map.c | 4 +-- 8 files changed, 54 insertions(+), 54 deletions(-) diff --git a/src/editor.c b/src/editor.c index 25761f88cb..46707139c2 100644 --- a/src/editor.c +++ b/src/editor.c @@ -250,7 +250,7 @@ static void set_all_land_owned() { int mapSize = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, sint16); - game_do_command(64, 1, 64, 2, GAME_COMMAND_56, (mapSize - 2) * 32, (mapSize - 2) * 32); + game_do_command(64, 1, 64, 2, GAME_COMMAND_SET_LAND_OWNERSHIP, (mapSize - 2) * 32, (mapSize - 2) * 32); } /** diff --git a/src/game.h b/src/game.h index cdc1fb865a..e46e48c8f5 100644 --- a/src/game.h +++ b/src/game.h @@ -26,13 +26,13 @@ enum GAME_COMMAND { GAME_COMMAND_SET_RIDE_APPEARANCE, GAME_COMMAND_1, - GAME_COMMAND_TOGGLE_PAUSE, // 2 + GAME_COMMAND_TOGGLE_PAUSE, GAME_COMMAND_PLACE_TRACK, GAME_COMMAND_REMOVE_TRACK, - GAME_COMMAND_LOAD_OR_QUIT, // 5 - GAME_COMMAND_6, + GAME_COMMAND_LOAD_OR_QUIT, + GAME_COMMAND_CREATE_RIDE, GAME_COMMAND_DEMOLISH_RIDE, - GAME_COMMAND_SET_RIDE_STATUS, // 8 + GAME_COMMAND_SET_RIDE_STATUS, GAME_COMMAND_SET_RIDE_VEHICLES, GAME_COMMAND_SET_RIDE_NAME, GAME_COMMAND_SET_RIDE_SETTING, @@ -40,47 +40,47 @@ enum GAME_COMMAND { GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT, GAME_COMMAND_REMOVE_SCENERY, GAME_COMMAND_PLACE_SCENERY, - GAME_COMMAND_16, - GAME_COMMAND_PLACE_PATH, // 17 + GAME_COMMAND_SET_WATER_HEIGHT, + GAME_COMMAND_PLACE_PATH, GAME_COMMAND_18, - GAME_COMMAND_REMOVE_PATH, // 19 - GAME_COMMAND_CHANGE_SURFACE_STYLE, //20 + GAME_COMMAND_REMOVE_PATH, + GAME_COMMAND_CHANGE_SURFACE_STYLE, GAME_COMMAND_SET_RIDE_PRICE, - GAME_COMMAND_22, //To do with text input + GAME_COMMAND_SET_PEEP_NAME, GAME_COMMAND_RAISE_LAND, GAME_COMMAND_LOWER_LAND, GAME_COMMAND_EDIT_LAND_SMOOTH, GAME_COMMAND_RAISE_WATER, GAME_COMMAND_LOWER_WATER, GAME_COMMAND_SET_BRAKES_SPEED, - GAME_COMMAND_HIRE_NEW_STAFF_MEMBER, // 29 - GAME_COMMAND_SET_STAFF_PATROL, //30 - GAME_COMMAND_FIRE_STAFF_MEMBER, // 31 - GAME_COMMAND_SET_STAFF_ORDER, // 32 + GAME_COMMAND_HIRE_NEW_STAFF_MEMBER, + GAME_COMMAND_SET_STAFF_PATROL, + GAME_COMMAND_FIRE_STAFF_MEMBER, + GAME_COMMAND_SET_STAFF_ORDER, GAME_COMMAND_SET_PARK_NAME, - GAME_COMMAND_SET_PARK_OPEN, // 34 - GAME_COMMAND_BUY_LAND_RIGHTS, // 35 + GAME_COMMAND_SET_PARK_OPEN, + GAME_COMMAND_BUY_LAND_RIGHTS, GAME_COMMAND_PLACE_PARK_ENTRANCE, GAME_COMMAND_REMOVE_PARK_ENTRANCE, - GAME_COMMAND_38, - GAME_COMMAND_SET_PARK_ENTRANCE_FEE, // 39 - GAME_COMMAND_SET_STAFF_COLOUR, // 40 + GAME_COMMAND_SET_MAZE_TRACK, + GAME_COMMAND_SET_PARK_ENTRANCE_FEE, + GAME_COMMAND_SET_STAFF_COLOUR, GAME_COMMAND_PLACE_FENCE, GAME_COMMAND_REMOVE_FENCE, GAME_COMMAND_PLACE_LARGE_SCENERY, GAME_COMMAND_REMOVE_LARGE_SCENERY, - GAME_COMMAND_SET_CURRENT_LOAN, // 45 - GAME_COMMAND_SET_RESEARCH_FUNDING, // 46 + GAME_COMMAND_SET_CURRENT_LOAN, + GAME_COMMAND_SET_RESEARCH_FUNDING, GAME_COMMAND_PLACE_TRACK_DESIGN, - GAME_COMMAND_START_MARKETING_CAMPAIGN, // 48 - GAME_COMMAND_49, - GAME_COMMAND_PLACE_BANNER, // New banner? (possibly scenery) - GAME_COMMAND_REMOVE_BANNER, // Remove banner - GAME_COMMAND_52, - GAME_COMMAND_53, - GAME_COMMAND_54, - GAME_COMMAND_55, - GAME_COMMAND_56, // Set land owned (possibly does other things) + GAME_COMMAND_START_MARKETING_CAMPAIGN, + GAME_COMMAND_PLACE_MAZE_DESIGN, + GAME_COMMAND_PLACE_BANNER, + GAME_COMMAND_REMOVE_BANNER, + GAME_COMMAND_SET_SCENERY_COLOUR, + GAME_COMMAND_SET_FENCE_COLOUR, + GAME_COMMAND_SET_LARGE_SCENERY_COLOUR, + GAME_COMMAND_SET_BANNER_COLOUR, + GAME_COMMAND_SET_LAND_OWNERSHIP, GAME_COMMAND_CLEAR_SCENERY }; diff --git a/src/ride/ride.c b/src/ride/ride.c index f6648495da..f2296e2d90 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -596,7 +596,7 @@ int ride_create_ride(ride_list_item listItem) RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = 0x3DC; - esi = GAME_COMMAND_6; + esi = GAME_COMMAND_CREATE_RIDE; game_do_command_p(esi, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); return ebx == MONEY32_UNDEFINED ? -1 : edi; } @@ -1029,10 +1029,10 @@ void sub_6C96C0() ride = GET_RIDE(rideIndex); if (ride->type == RIDE_TYPE_MAZE) { - game_do_command(x , 41 | (0 << 8), y , rideIndex | (2 << 8), GAME_COMMAND_38, z, 0); - game_do_command(x , 41 | (1 << 8), y + 16, rideIndex | (2 << 8), GAME_COMMAND_38, z, 0); - game_do_command(x + 16, 41 | (2 << 8), y + 16, rideIndex | (2 << 8), GAME_COMMAND_38, z, 0); - game_do_command(x + 16, 41 | (3 << 8), y , rideIndex | (2 << 8), GAME_COMMAND_38, z, 0); + game_do_command(x , 41 | (0 << 8), y , rideIndex | (2 << 8), GAME_COMMAND_SET_MAZE_TRACK, z, 0); + game_do_command(x , 41 | (1 << 8), y + 16, rideIndex | (2 << 8), GAME_COMMAND_SET_MAZE_TRACK, z, 0); + game_do_command(x + 16, 41 | (2 << 8), y + 16, rideIndex | (2 << 8), GAME_COMMAND_SET_MAZE_TRACK, z, 0); + game_do_command(x + 16, 41 | (3 << 8), y , rideIndex | (2 << 8), GAME_COMMAND_SET_MAZE_TRACK, z, 0); } else { direction = RCT2_GLOBAL(0x00F440CB, uint8); if (!(direction & 4)) { @@ -4289,14 +4289,14 @@ int ride_get_refund_price(int ride_id) ebx = oldebx; ebx |= 0 << 0; - RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_38, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_SET_MAZE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); ebx = oldebx; ebx |= 1 << 8; ecx = oldecx; ecx += 16; edx = oldedx; - RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_38, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_SET_MAZE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); ebx = oldebx; ebx |= 2 << 8; @@ -4305,7 +4305,7 @@ int ride_get_refund_price(int ride_id) ecx = oldecx; ecx += 16; edx = oldedx; - RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_38, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_SET_MAZE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); ebx = oldebx; ebx |= 3 << 8; @@ -4313,7 +4313,7 @@ int ride_get_refund_price(int ride_id) eax += 16; ecx = oldecx; edx = oldedx; - RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_38, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_SET_MAZE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); }else{ edx |= 0xFF << 8; edx &= ((map_element->properties.track.sequence & 0xF) << 8) | 0xFF; diff --git a/src/ride/track.c b/src/ride/track.c index 4c71ba126a..46a13ede5a 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1444,7 +1444,7 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; - cost = game_do_command(mapCoord.x, bl | (maze_entry & 0xFF) << 8, mapCoord.y, rideIndex | (maze_entry & 0xFF00), GAME_COMMAND_49, z, 0); + cost = game_do_command(mapCoord.x, bl | (maze_entry & 0xFF) << 8, mapCoord.y, rideIndex | (maze_entry & 0xFF00), GAME_COMMAND_PLACE_MAZE_DESIGN, z, 0); break; } @@ -1962,9 +1962,9 @@ int sub_6D2189(int* cost, uint8* ride_id){ int eax = 0, ebx, ecx = 0, edx, esi, edi = 0, ebp = 0; ebx = 41; edx = track_design->type | (entry_index << 8); - esi = GAME_COMMAND_6; + esi = GAME_COMMAND_CREATE_RIDE; - if (MONEY32_UNDEFINED == game_do_command_p(GAME_COMMAND_6, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp)) return 1; + if (MONEY32_UNDEFINED == game_do_command_p(GAME_COMMAND_CREATE_RIDE, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp)) return 1; // bh *ride_id = edi & 0xFF; @@ -3204,10 +3204,10 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int _ebx = GAME_COMMAND_FLAG_APPLY, _ecx = 0, _edx = track_design->type | (entry_index << 8), - _esi = GAME_COMMAND_6, + _esi = GAME_COMMAND_CREATE_RIDE, _edi = 0, _ebp = 0; - game_do_command_p(GAME_COMMAND_6, &_eax, &_ebx, &_ecx, &_edx, &_esi, &_edi, &_ebp); + game_do_command_p(GAME_COMMAND_CREATE_RIDE, &_eax, &_ebx, &_ecx, &_edx, &_esi, &_edi, &_ebp); if (_ebx == MONEY32_UNDEFINED){ *ebx = MONEY32_UNDEFINED; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 0; diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index f5adfefdb2..ec0d61aa02 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -2357,7 +2357,7 @@ money32 sub_6CA162(int rideIndex, int trackType, int trackDirection, int edxRS16 sub_6C96C0(); ride = GET_RIDE(rideIndex); if (ride->type == RIDE_TYPE_MAZE) { - result = game_do_command(x, 105 | (4 << 8), y, rideIndex | (trackType << 8) | (edxRS16 << 16), GAME_COMMAND_38, z, 0); + result = game_do_command(x, 105 | (4 << 8), y, rideIndex | (trackType << 8) | (edxRS16 << 16), GAME_COMMAND_SET_MAZE_TRACK, z, 0); if (result == MONEY32_UNDEFINED) return result; diff --git a/src/windows/staff.c b/src/windows/staff.c index 7e0fec7fb5..9a877cdda8 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -1223,9 +1223,9 @@ void window_staff_overview_text_input(){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = 2979; - game_do_command(1, 1, w->number, *text, GAME_COMMAND_22, *(text + 2), *(text + 1)); - game_do_command(2, 1, 0, *(text + 3), GAME_COMMAND_22, *(text + 5), *(text + 4)); - game_do_command(0, 1, 0, *(text + 6), GAME_COMMAND_22, *(text + 8), *(text + 7)); + game_do_command(1, 1, w->number, *text, GAME_COMMAND_SET_PEEP_NAME, *(text + 2), *(text + 1)); + game_do_command(2, 1, 0, *(text + 3), GAME_COMMAND_SET_PEEP_NAME, *(text + 5), *(text + 4)); + game_do_command(0, 1, 0, *(text + 6), GAME_COMMAND_SET_PEEP_NAME, *(text + 8), *(text + 7)); } /* rct2: 0x006BE5FC */ diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 3ef453ca1c..d86e831383 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -785,7 +785,7 @@ static void repaint_scenery_tool_down(sint16 x, sint16 y, sint16 widgetIndex){ 1 | (map_element->type << 8), grid_y, map_element->base_height | (map_element->properties.scenery.type << 8), - GAME_COMMAND_52, + GAME_COMMAND_SET_SCENERY_COLOUR, 0, window_scenery_primary_colour | (window_scenery_secondary_colour << 8)); break; @@ -806,7 +806,7 @@ static void repaint_scenery_tool_down(sint16 x, sint16 y, sint16 widgetIndex){ 1 | (window_scenery_primary_colour << 8), grid_y, (map_element->type & MAP_ELEMENT_DIRECTION_MASK) | (map_element->base_height << 8), - GAME_COMMAND_53, + GAME_COMMAND_SET_FENCE_COLOUR, 0, window_scenery_secondary_colour | (window_scenery_tertiary_colour << 8)); break; @@ -826,7 +826,7 @@ static void repaint_scenery_tool_down(sint16 x, sint16 y, sint16 widgetIndex){ 1 | ((map_element->type & MAP_ELEMENT_DIRECTION_MASK) << 8), grid_y, map_element->base_height | ((map_element->properties.scenerymultiple.type >> 10) << 8), - GAME_COMMAND_54, + GAME_COMMAND_SET_LARGE_SCENERY_COLOUR, 0, window_scenery_primary_colour | (window_scenery_secondary_colour << 8)); break; @@ -847,7 +847,7 @@ static void repaint_scenery_tool_down(sint16 x, sint16 y, sint16 widgetIndex){ 1, grid_y, map_element->base_height | ((map_element->properties.banner.position & 0x3) << 8), - GAME_COMMAND_55, + GAME_COMMAND_SET_BANNER_COLOUR, 0, window_scenery_primary_colour | (window_scenery_secondary_colour << 8)); break; diff --git a/src/world/map.c b/src/world/map.c index b4faaf0096..279b71ded9 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1668,7 +1668,7 @@ money32 raise_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags) height = map_element->base_height + 2; } - money32 tileCost = game_do_command(xi, flags, yi, (max_height << 8) + height, GAME_COMMAND_16, 0, 0); + money32 tileCost = game_do_command(xi, flags, yi, (max_height << 8) + height, GAME_COMMAND_SET_WATER_HEIGHT, 0, 0); if (tileCost == MONEY32_UNDEFINED) return MONEY32_UNDEFINED; @@ -1731,7 +1731,7 @@ money32 lower_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags) if (height < min_height) continue; height -= 2; - int tileCost = game_do_command(xi, flags, yi, (min_height << 8) + height, GAME_COMMAND_16, 0, 0); + int tileCost = game_do_command(xi, flags, yi, (min_height << 8) + height, GAME_COMMAND_SET_WATER_HEIGHT, 0, 0); if (tileCost == MONEY32_UNDEFINED) return MONEY32_UNDEFINED; cost += tileCost; From 95786062515a7986d80fa557fbb5afa255c3e4dd Mon Sep 17 00:00:00 2001 From: zsilencer Date: Mon, 29 Jun 2015 11:39:10 -0600 Subject: [PATCH 0152/1173] implement game_command_set_water_height --- src/game.c | 4 +-- src/world/map.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++- src/world/map.h | 1 + 3 files changed, 92 insertions(+), 3 deletions(-) diff --git a/src/game.c b/src/game.c index 799c6481d6..3febe86643 100644 --- a/src/game.c +++ b/src/game.c @@ -922,7 +922,7 @@ static uint32 game_do_command_table[58] = { 0x0066640B, 0, 0, - 0x006E650F, + 0, 0, 0x006A68AE, 0, @@ -985,7 +985,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_emptysub, game_command_remove_scenery, game_command_place_scenery, - game_command_emptysub, + game_command_set_water_height, game_command_place_footpath, game_command_emptysub, game_command_remove_footpath, diff --git a/src/world/map.c b/src/world/map.c index 279b71ded9..27334f62e9 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1826,6 +1826,94 @@ void game_command_lower_water(int* eax, int* ebx, int* ecx, int* edx, int* esi, ); } +/** + * + * rct2: 0x006E650F + */ +void game_command_set_water_height(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) +{ + int x = *eax; + int y = *ecx; + uint8 base_height = *edx; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; + RCT2_GLOBAL(0x009DEA5E, sint16) = x + 16; + RCT2_GLOBAL(0x009DEA60, sint16) = y + 16; + RCT2_GLOBAL(0x009DEA62, uint32) = base_height * 8; + if(RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; + *ebx = MONEY32_UNDEFINED; + return; + } + if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode && RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_FORBID_LANDSCAPE_CHANGES){ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_FORBIDDEN_BY_THE_LOCAL_AUTHORITY; + *ebx = MONEY32_UNDEFINED; + return; + } + + if(base_height < 2){ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TOO_LOW; + *ebx = MONEY32_UNDEFINED; + return; + } + + if(base_height >= 58){ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TOO_HIGH; + *ebx = MONEY32_UNDEFINED; + return; + } + + if(x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16) || y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16)){ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_OFF_EDGE_OF_MAP; + *ebx = MONEY32_UNDEFINED; + return; + } + + if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode && !map_is_location_in_park(x, y)){ + *ebx = MONEY32_UNDEFINED; + return; + } + + if(*ebx & GAME_COMMAND_FLAG_APPLY){ + int element_height = map_element_height(x, y); + footpath_remove_litter(x, y, element_height); + RCT2_CALLPROC_X(0x006E57E6, x, 0, y, element_height, 0, 0, 0); + } + + rct_map_element* map_element = map_get_surface_element_at(x / 32, y / 32); + int z1 = map_element->base_height; + int z2 = base_height; + if(map_element->properties.surface.terrain & 0x1F){ + z1 = (map_element->properties.surface.terrain & 0x1F) * 2; + } + if(z2 > z1){ + int temp = z1; + z1 = z2; + z2 = temp; + } + + if(map_can_construct_at(x, y, z1, z2, 0xFF)){ + if(map_element->type & 0x40){ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 0; + *ebx = MONEY32_UNDEFINED; + return; + } + if(*ebx & GAME_COMMAND_FLAG_APPLY){ + int new_terrain = map_element->properties.surface.terrain & 0xE0; + if(base_height > map_element->base_height){ + new_terrain |= (base_height / 2); + } + map_element->properties.surface.terrain = new_terrain; + map_invalidate_tile_full(x, y); + } + *ebx = 250; + if(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY){ + *ebx = 0; + } + }else{ + *ebx = MONEY32_UNDEFINED; + } +} + /** * * rct2: 0x006E5597 @@ -2589,7 +2677,7 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in if(tile_num == 0){ RCT2_GLOBAL(0x00F64EBC, rct_map_element*) = new_map_element; } - map_invalidate_tile_full(x2 / 32, y2 / 32); + map_invalidate_tile_full(x2, y2); } }else{ *ebx = MONEY32_UNDEFINED; diff --git a/src/world/map.h b/src/world/map.h index 46dcc6fa71..ecebd83b06 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -307,6 +307,7 @@ void game_command_raise_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, i void game_command_lower_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_raise_water(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_lower_water(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); +void game_command_set_water_height(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_remove_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_place_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); From 05e9cdd339fbe155a0c5ff941267d45ae13e0cd5 Mon Sep 17 00:00:00 2001 From: Maikel Stuivenberg Date: Mon, 29 Jun 2015 22:44:15 +0200 Subject: [PATCH 0153/1173] Tab to spaces (txt) and move item to end of list (strings_id) --- data/language/english_uk.txt | 2 +- src/localisation/string_ids.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 52a834f1a4..dc258f115e 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3786,4 +3786,4 @@ STR_5449 :Reduce game speed STR_5450 :Increase game speed STR_5451 :Open cheats window STR_5452 :Toggle visibility of toolbars -STR_5453 :Select another ride +STR_5453 :Select another ride diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index aa6125e82a..a85733b337 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -960,7 +960,6 @@ enum { STR_SELECT_DESIGN = 2307, STR_TRACK_DESIGNS = 2308, STR_BUILD_CUSTOM_DESIGN = 2310, - STR_SELECT_OTHER_RIDE = 5453, STR_TRACK_LIST_EXCITEMENT_RATING = 2311, STR_TRACK_LIST_INTENSITY_RATING = 2312, @@ -1760,6 +1759,8 @@ enum { STR_SHORTCUT_OPEN_CHEATS_WINDOW = 5451, STR_SHORTCUT_TOGGLE_VISIBILITY_OF_TOOLBARS = 5452, + STR_SELECT_OTHER_RIDE = 5453, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; From ea88ae41a6ff9218daf24b529f57d1bbd67e7709 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 30 Jun 2015 04:00:16 +0100 Subject: [PATCH 0154/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/german.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/data/language/german.txt b/data/language/german.txt index 21d3dd934f..e559b15816 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3786,3 +3786,4 @@ STR_5449 :Spielgeschwindigkeit verringern STR_5450 :Spielgeschwindigkeit erhöhen STR_5451 :Cheatfenster anzeigen STR_5452 :Symbolleiste ein-/ausblenden +STR_5453 :Andere Attraktion auswählen From cc54171443393e742c27fa59bbf0000a39f2eff2 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 30 Jun 2015 13:42:06 +0100 Subject: [PATCH 0155/1173] remove / isolate several CALLPROCs --- src/drawing/drawing.c | 7 +++- src/drawing/drawing.h | 3 ++ src/interface/viewport.c | 76 ++++++++++++++++++++++++++++------------ src/peep/peep.c | 48 +++++++++++++++++-------- src/windows/new_ride.c | 2 +- 5 files changed, 97 insertions(+), 39 deletions(-) diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index b26c79ad60..1b912d26aa 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -546,4 +546,9 @@ void redraw_peep_and_rain() } } RCT2_GLOBAL(RCT2_ADDRESS_NO_RAIN_PIXELS, uint32) = 0; -} \ No newline at end of file +} + +void sub_681DE2(rct_drawpixelinfo *dpi, int x, int y, int image1, int image2) +{ + RCT2_CALLPROC_X(0x00681DE2, 0, image1, x, y, 0, (int)dpi, image2); +} diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 65ccb9267e..6ca1340859 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -137,4 +137,7 @@ void sub_6C1F57(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct void update_rain_animation(); void redraw_peep_and_rain(); +// unknown +void sub_681DE2(rct_drawpixelinfo *dpi, int x, int y, int image1, int image2); + #endif diff --git a/src/interface/viewport.c b/src/interface/viewport.c index da47e8b24d..ae8fc30c5b 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -267,7 +267,10 @@ void sub_689174(sint16* x, sint16* y, sint16 *z) *z = height; } -//void sub_6E7FF3(rct_window* w, rct_viewport* viewport, int x, int y){ +void sub_6E7FF3(rct_window *w, rct_viewport *viewport, int x, int y) +{ + RCT2_CALLPROC_X(0x006E7FF3, 0, 0, 0, x, (int)viewport, (int)w, y); + // int zoom = 1 << viewport->zoom; // if (w >= RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*)){ // if (viewport != w->viewport){ @@ -298,7 +301,7 @@ void sub_689174(sint16* x, sint16* y, sint16 *z) // } // 0x6e824a // }//x6e8255 // -//} +} void sub_6E7F34(rct_window* w, rct_viewport* viewport, sint16 x_diff, sint16 y_diff){ rct_window* orignal_w = w; @@ -332,7 +335,7 @@ void sub_6E7F34(rct_window* w, rct_viewport* viewport, sint16 x_diff, sint16 y_d } w = orignal_w; - RCT2_CALLPROC_X(0x6E7FF3, 0, 0, 0, x_diff, (int)viewport, (int)w, y_diff); + sub_6E7FF3(w, viewport, x_diff, y_diff); } void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ @@ -641,12 +644,11 @@ void paint_attached_ps(paint_struct* ps, paint_struct* attached_ps, rct_drawpixe } } - if (!(attached_ps->var_0C & 1)){ + if (attached_ps->var_0C & 1) { + sub_681DE2(dpi, x, y, image_id, attached_ps->var_04); + } else { gfx_draw_sprite(dpi, image_id, x, y, ps->var_04); } - else{ - RCT2_CALLPROC_X(0x00681DE2, 0, image_id, x, y, 0, (int)dpi, attached_ps->var_04); - } } } @@ -694,11 +696,11 @@ void sub_688485(){ } } - if (!(ps->var_1A & 1)) - gfx_draw_sprite(dpi, image_id, x, y, ps->var_04); + if (ps->var_1A & 1) + sub_681DE2(dpi, x, y, image_id, ps->var_04); else - RCT2_CALLPROC_X(0x00681DE2, 0, image_id, x, y, 0, (int)dpi, ps->var_04); - + gfx_draw_sprite(dpi, image_id, x, y, ps->var_04); + if (ps->var_20 != 0){ ps = ps->var_20; continue; @@ -862,29 +864,57 @@ int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int edx, sint16 si, s return 0; } +/** + * + * rct2: 0x006D4244 + */ +void viewport_vehicle_paint_setup(rct_vehicle *vehicle, int imageDirection) +{ + RCT2_CALLPROC_X(0x006D4244, vehicle->x, imageDirection, vehicle->y, vehicle->z, (int)vehicle, 0, 0); +} + +/** + * + * rct2: 0x0068F0FB + */ +void viewport_peep_paint_setup(rct_peep *peep, int imageDirection) +{ + RCT2_CALLPROC_X(0x0068F0FB, peep->x, imageDirection, peep->y, peep->z, (int)peep, 0, 0); +} + +/** + * + * rct2: 0x00672AC9 + */ +void viewport_misc_paint_setup(rct_sprite *misc, int imageDirection) +{ + RCT2_CALLPROC_X(0x00672AC9, misc->unknown.x, imageDirection, misc->unknown.y, misc->unknown.z, (int)misc, 0, 0); +} + /** * Litter Paint Setup * rct2: 0x006736FC */ -void viewport_litter_paint_setup(rct_litter* litter, int image_direction, int height){ - rct_drawpixelinfo* dpi; +void viewport_litter_paint_setup(rct_litter *litter, int imageDirection) +{ + rct_drawpixelinfo *dpi; dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); - if (dpi->zoom_level != 0)return; //If zoomed at all no litter drawn + if (dpi->zoom_level != 0) return; // If zoomed at all no litter drawn // litter has no sprite direction so remove that - image_direction >>= 3; + imageDirection >>= 3; // Some litter types have only 1 direction so remove // anything that isn't required. - image_direction &= RCT2_ADDRESS(0x97EF6C, uint32)[litter->type * 2 + 1]; + imageDirection &= RCT2_ADDRESS(0x97EF6C, uint32)[litter->type * 2 + 1]; - uint32 image_id = image_direction + RCT2_ADDRESS(0x97EF6C, uint32)[litter->type * 2]; + uint32 image_id = imageDirection + RCT2_ADDRESS(0x97EF6C, uint32)[litter->type * 2]; RCT2_GLOBAL(0x9DEA52, uint16) = 0xFFFC; RCT2_GLOBAL(0x9DEA54, uint16) = 0xFFFC; - RCT2_GLOBAL(0x9DEA56, uint16) = height + 2; + RCT2_GLOBAL(0x9DEA56, uint16) = litter->z + 2; - sub_98197C(0, 0xFF, image_id, 0, height, 4, 4, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, 0xFF, image_id, 0, litter->z, 4, 4, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); } @@ -936,16 +966,16 @@ void sprite_paint_setup(uint16 eax, uint16 ecx){ switch (spr->unknown.sprite_identifier){ case SPRITE_IDENTIFIER_VEHICLE: - RCT2_CALLPROC_X(0x6D4244, spr->unknown.x, image_direction, spr->unknown.y, spr->unknown.z, (int)spr, (int)dpi, ebp); + viewport_vehicle_paint_setup((rct_vehicle*)spr, image_direction); break; case SPRITE_IDENTIFIER_PEEP: - RCT2_CALLPROC_X(0x68F0FB, spr->unknown.x, image_direction, spr->unknown.y, spr->unknown.z, (int)spr, (int)dpi, ebp); + viewport_peep_paint_setup((rct_peep*)spr, image_direction); break; case SPRITE_IDENTIFIER_MISC: - RCT2_CALLPROC_X(0x672AC9, spr->unknown.x, image_direction, spr->unknown.y, spr->unknown.z, (int)spr, (int)dpi, ebp); + viewport_misc_paint_setup(spr, image_direction); break; case SPRITE_IDENTIFIER_LITTER: - viewport_litter_paint_setup((rct_litter*)spr, image_direction, spr->unknown.z); + viewport_litter_paint_setup((rct_litter*)spr, image_direction); break; default: assert(false); diff --git a/src/peep/peep.c b/src/peep/peep.c index 09cf941597..970418f741 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -34,6 +34,7 @@ #include "peep.h" #include "staff.h" +static void sub_68F41A(rct_peep *peep, int index); static void peep_update(rct_peep *peep); static int peep_has_empty_container(rct_peep* peep); static int peep_has_food_standard_flag(rct_peep* peep); @@ -43,6 +44,7 @@ static int peep_empty_container_extra_flag(rct_peep* peep); static int peep_should_find_bench(rct_peep* peep); static void peep_stop_purchase_thought(rct_peep* peep, uint8 ride_type); static void sub_693BAB(rct_peep* peep); +static void sub_693C9E(rct_peep *peep); static void peep_spend_money(rct_peep *peep, money32 amount); static void peep_give_real_name(rct_peep *peep); @@ -109,7 +111,7 @@ void peep_update_all() if ((i & 0x7F) != (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x7F)) { peep_update(peep); } else { - RCT2_CALLPROC_X(0x0068F41A, 0, 0, 0, i, (int)peep, 0, 0); + sub_68F41A(peep, i); if (peep->linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_PEEP) peep_update(peep); } @@ -118,6 +120,15 @@ void peep_update_all() } } +/** + * + * rct2: 0x0068F41A + */ +static void sub_68F41A(rct_peep *peep, int index) +{ + RCT2_CALLPROC_X(0x0068F41A, 0, 0, 0, index, (int)peep, 0, 0); +} + /* some sort of check to see if peep is connected to the ground?? */ int sub_68F3AE(rct_peep* peep){ peep->var_C4++; @@ -752,7 +763,7 @@ void peep_update_sitting(rct_peep* peep){ if (!sub_68F3AE(peep))return; //691541 - RCT2_CALLPROC_X(0x693C9E, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693C9E(peep); if (!(RCT2_GLOBAL(0xF1EE18, uint16) & 1))return; int ebx = peep->var_37 & 0x7; @@ -2655,7 +2666,7 @@ static void peep_update_queuing(rct_peep* peep){ return; } - RCT2_CALLPROC_X(0x693C9E, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693C9E(peep); if (peep->action < 0xFE)return; if (peep->sprite_type == 0){ if (peep->time_in_queue >= 2000 && (0xFFFF & scenario_rand()) <= 119){ @@ -2774,7 +2785,7 @@ static void peep_update_watering(rct_peep* peep){ if (peep->sub_state == 0){ if (!sub_68F3AE(peep))return; - RCT2_CALLPROC_X(0x693C9E, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693C9E(peep); if (!(RCT2_GLOBAL(0xF1EE18, uint16) & 1))return; peep->sprite_direction = (peep->var_37 & 3) << 3; @@ -2827,7 +2838,7 @@ static void peep_update_emptying_bin(rct_peep* peep){ if (peep->sub_state == 0){ if (!sub_68F3AE(peep))return; - RCT2_CALLPROC_X(0x693C9E, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693C9E(peep); if (!(RCT2_GLOBAL(0xF1EE18, uint16) & 1))return; peep->sprite_direction = (peep->var_37 & 3) << 3; @@ -2959,7 +2970,7 @@ static void peep_update_picked(rct_peep* peep){ /* rct2: 0x6914CD */ static void peep_update_leaving_park(rct_peep* peep){ if (peep->var_37 != 0){ - RCT2_CALLPROC_X(0x693C9E, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693C9E(peep); if (!(RCT2_GLOBAL(0xF1EE18, uint16) & 2))return; peep_sprite_remove(peep); return; @@ -2981,7 +2992,7 @@ static void peep_update_leaving_park(rct_peep* peep){ window_invalidate_by_class(WC_GUEST_LIST); - RCT2_CALLPROC_X(0x693C9E, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693C9E(peep); if (!(RCT2_GLOBAL(0xF1EE18, uint16) & 2))return; peep_sprite_remove(peep); } @@ -2991,7 +3002,7 @@ static void peep_update_watching(rct_peep* peep){ if (peep->sub_state == 0){ if (!sub_68F3AE(peep))return; - RCT2_CALLPROC_X(0x693C9E, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693C9E(peep); if (!(RCT2_GLOBAL(0xF1EE18, uint16) & 1))return; peep->destination_x = peep->x; @@ -3075,7 +3086,7 @@ static void peep_update_watching(rct_peep* peep){ */ static void peep_update_entering_park(rct_peep* peep){ if (peep->var_37 != 1){ - RCT2_CALLPROC_X(0x693C9E, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693C9E(peep); if ((RCT2_GLOBAL(0xF1EE18, uint16) & 2)){ RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16)--; peep_sprite_remove(peep); @@ -3410,7 +3421,7 @@ static void peep_update_using_bin(rct_peep* peep){ if (peep->sub_state == 0){ if (!sub_68F3AE(peep))return; - RCT2_CALLPROC_X(0x693C9E, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693C9E(peep); if (!(RCT2_GLOBAL(0xF1EE18, uint16) & 1))return; peep->sub_state = 1; @@ -3582,7 +3593,7 @@ static void peep_update_heading_to_inspect(rct_peep* peep){ if (!sub_68F3AE(peep))return; - RCT2_CALLPROC_X(0x693C9E, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693C9E(peep); if (!(RCT2_GLOBAL(0xF1EE18, uint16) & 0xC))return; @@ -3692,7 +3703,7 @@ static void peep_update_answering(rct_peep* peep){ if (!sub_68F3AE(peep))return; - RCT2_CALLPROC_X(0x693C9E, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693C9E(peep); if (!(RCT2_GLOBAL(0xF1EE18, uint16) & 0xC))return; @@ -3932,7 +3943,7 @@ static void peep_update_patrolling(rct_peep* peep){ if (!sub_68F3AE(peep))return; - RCT2_CALLPROC_X(0x693C9E, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693C9E(peep); if (!(RCT2_GLOBAL(0xF1EE18, uint16) & 1))return; if ((peep->next_var_29 & 0x18) == 8){ @@ -4058,7 +4069,7 @@ static void peep_update_walking(rct_peep* peep){ } } - RCT2_CALLPROC_X(0x693C9E, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693C9E(peep); if (!(RCT2_GLOBAL(0xF1EE18, uint16) & 1))return; if ((peep->next_var_29 & 0x18) == 8){ @@ -5312,6 +5323,15 @@ void sub_693BAB(rct_peep* peep) { } } +/** + * + * rct2: 0x00693C9E + */ +static void sub_693C9E(rct_peep *peep) +{ + RCT2_CALLPROC_X(0x00693C9E, 0, 0, 0, 0, (int)peep, 0, 0); +} + /** * * rct2: 0x0069926C diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index 667897c1ba..125b686823 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -824,7 +824,7 @@ static void window_new_ride_scrollpaint() if (listItem->type != rideEntry->ride_type[1]) image_id++; } - RCT2_CALLPROC_X(0x00681DE2, 0, 29013, x + 2, y + 2, 0xA0, (int)dpi, image_id); + sub_681DE2(dpi, x + 2, y + 2, 29013, image_id); // Next position x += 116; From 0b60465b654681e4a44282324ee3b29bf022983c Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Tue, 30 Jun 2015 18:08:49 +0100 Subject: [PATCH 0156/1173] Fix map element reorganise crash. Fixes #1518. I've also refactored the code slightly. Issue was caused by memsetting the wrong buffer. --- src/world/map.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 27334f62e9..737749d324 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2834,22 +2834,23 @@ void map_reorganise_elements() return; } - rct_map_element **tile = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*); + uint32 num_elements; + for (int y = 0; y < 256; y++) { for (int x = 0; x < 256; x++) { rct_map_element *startElement = map_get_first_element_at(x, y); rct_map_element *endElement = startElement; while (!map_element_is_last_for_tile(endElement++)); - uint8 num_bytes = (endElement - startElement) * sizeof(rct_map_element); - memcpy(new_elements_pointer, startElement, num_bytes); - new_elements_pointer += num_bytes / sizeof(rct_map_element); + num_elements = endElement - startElement; + memcpy(new_elements_pointer, startElement, num_elements * sizeof(rct_map_element)); + new_elements_pointer += num_elements; } } - uint32 num_elements = (new_elements_pointer - new_map_elements); + num_elements = (new_elements_pointer - new_map_elements); memcpy(RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS, rct_map_element), new_map_elements, num_elements * sizeof(rct_map_element)); - memset(new_map_elements + num_elements, 0, (0x30000 - num_elements) * sizeof(rct_map_element)); + memset(RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS, rct_map_element) + num_elements, 0, (0x30000 - num_elements) * sizeof(rct_map_element)); rct2_free(new_map_elements); From 7be91a5fac86b4db289fa949e6121c5774f0633d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 1 Jul 2015 00:58:13 +0100 Subject: [PATCH 0157/1173] implement finish-map-window part 1 --- src/addresses.h | 6 + src/windows/map.c | 1048 ++++++++++++++++++++++++++---------------- src/world/footpath.h | 2 + src/world/park.c | 22 +- src/world/park.h | 2 + 5 files changed, 695 insertions(+), 385 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 83959c7cb1..14958a4dc0 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -267,6 +267,12 @@ #define RCT2_ADDRESS_SELECTED_TERRAIN_EDGE 0x009E2E24 #define RCT2_ADDRESS_SELECTED_TERRAIN_SURFACE 0x009E2E25 +#define RCT2_ADDRESS_PARK_ENTRANCE_GHOST_X 0x009E32CC +#define RCT2_ADDRESS_PARK_ENTRANCE_GHOST_Y 0x009E32CE +#define RCT2_ADDRESS_PARK_ENTRANCE_GHOST_DIRECTION 0x009E32D1 +#define RCT2_ADDRESS_PARK_ENTRANCE_GHOST_EXISTS 0x009E32D2 +#define RCT2_ADDRESS_PARK_ENTRANCE_GHOST_PRICE 0x009E32D3 + #define RCT2_ADDRESS_G1_ELEMENTS 0x009EBD28 //Every pixel changed by rain is stored. diff --git a/src/windows/map.c b/src/windows/map.c index 4e8e2f9149..c30307f8d5 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -19,16 +19,22 @@ *****************************************************************************/ #include "../addresses.h" +#include "../cheats.h" +#include "../game.h" #include "../localisation/localisation.h" #include "../input.h" +#include "../interface/themes.h" #include "../interface/widget.h" #include "../interface/viewport.h" #include "../interface/window.h" #include "../sprites.h" +#include "../world/footpath.h" #include "../world/scenery.h" -#include "../interface/themes.h" -#include "../cheats.h" +enum { + PAGE_PEEPS, + PAGE_RIDES +}; enum WINDOW_MAP_WIDGET_IDX { WIDX_BACKGROUND, @@ -55,35 +61,38 @@ enum WINDOW_MAP_WIDGET_IDX { }; static rct_widget window_map_widgets[] = { - { WWT_FRAME, 0, 0, 244, 0, 258, STR_NONE, STR_NONE }, - { WWT_CAPTION, 0, 1, 243, 1, 14, STR_MAP, STR_WINDOW_TITLE_TIP }, - { WWT_CLOSEBOX, 0, 232, 242, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, - { WWT_RESIZE, 1, 0, 244, 43, 257, STR_NONE, STR_NONE }, - { WWT_COLORBTN, 1, 3, 33, 17, 43, 0x02000144E, STR_SHOW_PEOPLE_ON_MAP_TIP }, - { WWT_COLORBTN, 1, 34, 64, 17, 43, 0x02000144E, STR_SHOW_RIDES_STALLS_ON_MAP_TIP }, - { WWT_SCROLL, 1, 3, 241, 46, 225, 0x3, STR_NONE }, - { WWT_SPINNER, 1, 104, 198, 229, 240, 0xC8C, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 187, 197, 230, 234, STR_NUMERIC_UP, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 187, 197, 235, 239, STR_NUMERIC_DOWN, STR_NONE }, - { WWT_FLATBTN, 1, 4, 27, 1, 24, SPR_BUY_LAND_RIGHTS, STR_SELECT_PARK_OWNED_LAND_TIP }, - { WWT_FLATBTN, 1, 4, 27, 1, 24, SPR_PARK_ENTRANCE, STR_BUILD_PARK_ENTRANCE_TIP }, - { WWT_FLATBTN, 1, 28, 51, 1, 24, STR_NONE, STR_SET_STARTING_POSITIONS_TIP }, - { WWT_IMGBTN, 1, 4, 47, 17, 48, SPR_LAND_TOOL_SIZE_0, STR_NONE }, - { WWT_TRNBTN, 1, 5, 20, 18, 33, 0x02000157B, STR_ADJUST_SMALLER_LAND_TIP }, - { WWT_TRNBTN, 1, 31, 46, 32, 47, 0x02000157D, STR_ADJUST_LARGER_LAND_TIP }, - { WWT_CHECKBOX, 1, 58, 241, 197, 208, STR_LAND_OWNED, STR_SET_LAND_TO_BE_OWNED_TIP }, - { WWT_CHECKBOX, 1, 58, 241, 197, 208, STR_CONSTRUCTION_RIGHTS_OWNED, STR_SET_CONSTRUCTION_RIGHTS_TO_BE_OWNED_TIP }, - { WWT_CHECKBOX, 1, 58, 241, 197, 208, STR_LAND_SALE, STR_SET_LAND_TO_BE_AVAILABLE_TIP }, - { WWT_CHECKBOX, 1, 58, 231, 197, 208, STR_CONSTRUCTION_RIGHTS_SALE, STR_SET_CONSTRUCTION_RIGHTS_TO_BE_AVAILABLE_TIP }, - { WWT_FLATBTN, 1, 218, 241, 45, 68, SPR_ROTATE_ARROW, STR_ROTATE_OBJECTS_90 }, + { WWT_FRAME, 0, 0, 244, 0, 258, STR_NONE, STR_NONE }, + { WWT_CAPTION, 0, 1, 243, 1, 14, STR_MAP, STR_WINDOW_TITLE_TIP }, + { WWT_CLOSEBOX, 0, 232, 242, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, + { WWT_RESIZE, 1, 0, 244, 43, 257, STR_NONE, STR_NONE }, + { WWT_COLORBTN, 1, 3, 33, 17, 43, 0x02000144E, STR_SHOW_PEOPLE_ON_MAP_TIP }, + { WWT_COLORBTN, 1, 34, 64, 17, 43, 0x02000144E, STR_SHOW_RIDES_STALLS_ON_MAP_TIP }, + { WWT_SCROLL, 1, 3, 241, 46, 225, 0x3, STR_NONE }, + { WWT_SPINNER, 1, 104, 198, 229, 240, 0xC8C, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 187, 197, 230, 234, STR_NUMERIC_UP, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 187, 197, 235, 239, STR_NUMERIC_DOWN, STR_NONE }, + { WWT_FLATBTN, 1, 4, 27, 1, 24, SPR_BUY_LAND_RIGHTS, STR_SELECT_PARK_OWNED_LAND_TIP }, + { WWT_FLATBTN, 1, 4, 27, 1, 24, SPR_PARK_ENTRANCE, STR_BUILD_PARK_ENTRANCE_TIP }, + { WWT_FLATBTN, 1, 28, 51, 1, 24, STR_NONE, STR_SET_STARTING_POSITIONS_TIP }, + { WWT_IMGBTN, 1, 4, 47, 17, 48, SPR_LAND_TOOL_SIZE_0, STR_NONE }, + { WWT_TRNBTN, 1, 5, 20, 18, 33, 0x02000157B, STR_ADJUST_SMALLER_LAND_TIP }, + { WWT_TRNBTN, 1, 31, 46, 32, 47, 0x02000157D, STR_ADJUST_LARGER_LAND_TIP }, + { WWT_CHECKBOX, 1, 58, 241, 197, 208, STR_LAND_OWNED, STR_SET_LAND_TO_BE_OWNED_TIP }, + { WWT_CHECKBOX, 1, 58, 241, 197, 208, STR_CONSTRUCTION_RIGHTS_OWNED, STR_SET_CONSTRUCTION_RIGHTS_TO_BE_OWNED_TIP }, + { WWT_CHECKBOX, 1, 58, 241, 197, 208, STR_LAND_SALE, STR_SET_LAND_TO_BE_AVAILABLE_TIP }, + { WWT_CHECKBOX, 1, 58, 231, 197, 208, STR_CONSTRUCTION_RIGHTS_SALE, STR_SET_CONSTRUCTION_RIGHTS_TO_BE_AVAILABLE_TIP }, + { WWT_FLATBTN, 1, 218, 241, 45, 68, SPR_ROTATE_ARROW, STR_ROTATE_OBJECTS_90 }, { WIDGETS_END }, }; // used in transforming viewport view coordinates to minimap coordinates -// rct2: 0x00981BBC (these two tables are interspersed) -static const sint16 _minimap_offsets_x[4] = { 0xF8, 0x1F8, 0xF8, 0xFFF8 }; -// rct2: 0x00981BBE -static const sint16 _minimap_offsets_y[4] = { 0, 0x100, 0x200, 0x100 }; +// rct2: 0x00981BBC +const rct_xy16 MiniMapOffsets[] = { + { 256 - 8, 0 }, + { 512 - 8, 256 }, + { 256 - 8, 512 }, + { 0 - 8, 256 } +}; static void window_map_emptysub() { } static void window_map_close(); @@ -91,20 +100,17 @@ static void window_map_resize(); static void window_map_mouseup(); static void window_map_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); static void window_map_update(rct_window *w); +static void window_map_toolupdate(); +static void window_map_tooldown(); +static void window_map_tooldrag(); +static void window_map_toolabort(); static void window_map_scrollgetsize(); static void window_map_scrollmousedown(); +static void window_map_textinput(); +static void window_map_tooltip(); static void window_map_invalidate(); static void window_map_paint(); static void window_map_scrollpaint(); -static void window_map_tooltip(); -static void window_map_textinput(); -static void window_map_inputsize_land(rct_window *w); -static void window_map_inputsize_map(rct_window *w); - -static void window_map_set_bounds(rct_window* w); - -static void window_map_init_map(); -static void window_map_center_on_view_point(); static void* window_map_events[] = { window_map_close, @@ -116,11 +122,11 @@ static void* window_map_events[] = { window_map_update, window_map_emptysub, window_map_emptysub, - (void*)0x0068D093, - (void*)0x0068D074, - (void*)0x0068D088, + window_map_toolupdate, + window_map_tooldown, + window_map_tooldrag, window_map_emptysub, - (void*)0x0068D055, + window_map_toolabort, window_map_emptysub, window_map_scrollgetsize, window_map_scrollmousedown, @@ -137,14 +143,30 @@ static void* window_map_events[] = { window_map_scrollpaint }; + +static void window_map_init_map(); +static void window_map_center_on_view_point(); +static void window_map_show_default_scenario_editor_buttons(rct_window *w); +static void window_map_draw_tab_images(rct_window *w, rct_drawpixelinfo *dpi); +static void window_map_paint_peep_overlay(rct_drawpixelinfo *dpi); +static void window_map_paint_train_overlay(rct_drawpixelinfo *dpi); +static void window_map_paint_hud_rectangle(rct_drawpixelinfo *dpi); +static void window_map_inputsize_land(rct_window *w); +static void window_map_inputsize_map(rct_window *w); +static void window_map_set_bounds(rct_window* w); + +static void window_map_set_land_rights_tool_update(int x, int y); +static void window_map_place_park_entrance_tool_update(int x, int y); +static void window_map_set_peep_spawn_tool_update(int x, int y); + /** * * rct2: 0x0068C88A */ void window_map_open() { - rct_window* w; - uint32* map_image_data; + rct_window *w; + uint32 *map_image_data; // Check if window is already open w = window_bring_to_front_by_class(WC_MAP); @@ -154,7 +176,7 @@ void window_map_open() return; } - map_image_data = rct2_malloc(256 * 256 * sizeof(uint32)); + map_image_data = malloc(256 * 256 * sizeof(uint32)); if (map_image_data == NULL) return; @@ -179,9 +201,11 @@ void window_map_open() (1 << WIDX_BUILD_PARK_ENTRANCE) | (1 << WIDX_ROTATE_90) | (1 << WIDX_PEOPLE_STARTING_POSITION); + w->hold_down_widgets = (1 << WIDX_MAP_SIZE_SPINNER_UP) | (1 << WIDX_MAP_SIZE_SPINNER_DOWN); + window_init_scroll_widgets(w); w->map.rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint16); @@ -201,55 +225,38 @@ static void window_map_close() window_get_register(w); - rct2_free(RCT2_GLOBAL(RCT2_ADDRESS_MAP_IMAGE_DATA, uint32*)); + free(RCT2_GLOBAL(RCT2_ADDRESS_MAP_IMAGE_DATA, uint32*)); if ((RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == w->classification && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, uint16) == w->number) { tool_cancel(); } - //Reset land tool size + + // Reset land tool size RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = 0; } /** -* -* rct2: 0x0068D7DC -*/ -void window_map_resize() -{ - rct_window *w; - - window_get_register(w); - - w->flags |= WF_RESIZABLE; // (1 << 8) - w->min_width = 245; - w->max_width = 800; - w->min_height = 259; - w->max_height = 560; -} - -/** -* -* rct2: 0x0068CFC1 -*/ + * + * rct2: 0x0068CFC1 + */ static void window_map_mouseup() { - sint16 var_idx; - rct_window* var_w; - //Maximum land ownership tool size - int land_tool_limit; + rct_window *w; + short widgetIndex; - window_widget_get_registers(var_w, var_idx); + // Maximum land ownership tool size + int landToolSizeLimit; - switch (var_idx) - { + window_widget_get_registers(w, widgetIndex); + + switch (widgetIndex) { case WIDX_CLOSE: - window_close(var_w); + window_close(w); break; - case WIDX_SET_LAND_RIGHTS: - window_invalidate(var_w); - if (tool_set(var_w, var_idx, 2)) // jb nullsub_52 + window_invalidate(w); + if (tool_set(w, widgetIndex, 2)) break; RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = 1; @@ -258,89 +265,76 @@ static void window_map_mouseup() show_land_rights(); show_construction_rights(); break; - case WIDX_LAND_OWNED_CHECKBOX: RCT2_GLOBAL(0xF1AD61, sint8) ^= 2; if (RCT2_GLOBAL(0xF1AD61, sint8) & 2) RCT2_GLOBAL(0xF1AD61, sint8) &= 0xF2; - window_invalidate(var_w); + window_invalidate(w); break; - case WIDX_LAND_SALE_CHECKBOX: RCT2_GLOBAL(0xF1AD61, sint8) ^= 8; if (RCT2_GLOBAL(0xF1AD61, sint8) & 8) RCT2_GLOBAL(0xF1AD61, sint8) &= 0xF8; - window_invalidate(var_w); + window_invalidate(w); break; - case WIDX_CONSTRUCTION_RIGHTS_OWNED_CHECKBOX: RCT2_GLOBAL(0xF1AD61, sint8) ^= 1; if (RCT2_GLOBAL(0xF1AD61, sint8) & 1) RCT2_GLOBAL(0xF1AD61, sint8) &= 0xF1; - window_invalidate(var_w); + window_invalidate(w); break; - case WIDX_CONSTRUCTION_RIGHTS_SALE_CHECKBOX: RCT2_GLOBAL(0xF1AD61, sint8) ^= 4; if (RCT2_GLOBAL(0xF1AD61, sint8) & 4) RCT2_GLOBAL(0xF1AD61, sint8) &= 0xF4; - window_invalidate(var_w); + window_invalidate(w); break; - case WIDX_LAND_TOOL_SMALLER: - --RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16); - land_tool_limit=1; + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)--; + landToolSizeLimit = 1; - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) < land_tool_limit) - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = land_tool_limit; + if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) < landToolSizeLimit) + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = landToolSizeLimit; - window_invalidate(var_w); + window_invalidate(w); break; - case WIDX_LAND_TOOL_LARGER: - ++RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16); - land_tool_limit=64; + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)++; + landToolSizeLimit = 64; - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > land_tool_limit) - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = land_tool_limit; + if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > landToolSizeLimit) + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = landToolSizeLimit; - window_invalidate(var_w); + window_invalidate(w); break; - case WIDX_BUILD_PARK_ENTRANCE: - window_invalidate(var_w); - if (tool_set(var_w, var_idx, 2)) // jb nullsub_52 + window_invalidate(w); + if (tool_set(w, widgetIndex, 2)) break; RCT2_GLOBAL(0x9E32D2, sint8) = 0; - - if (!(RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, sint32) & INPUT_FLAG_6)) // Remove? - RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, sint32) |= INPUT_FLAG_6; + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) |= INPUT_FLAG_6; show_gridlines(); show_land_rights(); show_construction_rights(); break; - case WIDX_ROTATE_90: - ++window_scenery_rotation; - window_scenery_rotation &= 3; + window_scenery_rotation = (window_scenery_rotation + 1) & 3; break; - case WIDX_PEOPLE_STARTING_POSITION: - if (tool_set(var_w, var_idx, 2)) // jb nullsub_52 + if (tool_set(w, widgetIndex, 2)) break; RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = 0; - if (RCT2_GLOBAL(RCT2_ADDRESS_PEEP_SPAWNS, sint16) != -1 && RCT2_GLOBAL(0x13573F8, sint16) != -1) RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = 1; @@ -349,50 +343,214 @@ static void window_map_mouseup() show_construction_rights(); break; case WIDX_LAND_TOOL: - window_map_inputsize_land(var_w); + window_map_inputsize_land(w); break; case WIDX_MAP_SIZE_SPINNER: - window_map_inputsize_map(var_w); + window_map_inputsize_map(w); break; - default: - if (var_idx >= WIDX_PEOPLE_TAB && var_idx <= WIDX_RIDES_TAB) - { - var_idx -= WIDX_PEOPLE_TAB; - if (var_idx == var_w->selected_tab) + if (widgetIndex >= WIDX_PEOPLE_TAB && widgetIndex <= WIDX_RIDES_TAB) { + widgetIndex -= WIDX_PEOPLE_TAB; + if (widgetIndex == w->selected_tab) break; - var_w->selected_tab = var_idx; - var_w->list_information_type = 0; + w->selected_tab = widgetIndex; + w->list_information_type = 0; } break; - } - - return; } /** * -* rct2: 0x0068D040 +* rct2: 0x0068D7DC */ -static void window_map_mousedown(int widgetIndex, rct_window*w, rct_widget* widget) +static void window_map_resize() { - // These widgets all refer to the Scenario Editor's map window. - if (widgetIndex == WIDX_MAP_SIZE_SPINNER_UP) { + rct_window *w; + + window_get_register(w); + + w->flags |= WF_RESIZABLE; + w->min_width = 245; + w->max_width = 800; + w->min_height = 259; + w->max_height = 560; +} + +/** + * + * rct2: 0x0068D040 + */ +static void window_map_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) +{ + switch (widgetIndex) { + case WIDX_MAP_SIZE_SPINNER_UP: RCT2_CALLPROC_X(0x0068D641, 0, 0, 0, widgetIndex, (int)w, 0, 0); - } - else if (widgetIndex == WIDX_MAP_SIZE_SPINNER_DOWN) { + break; + case WIDX_MAP_SIZE_SPINNER_DOWN: RCT2_CALLPROC_X(0x0068D6B4, 0, 0, 0, widgetIndex, (int)w, 0, 0); - } - else if (widgetIndex == WIDX_SET_LAND_RIGHTS) - { + break; + case WIDX_SET_LAND_RIGHTS: // When unselecting the land rights tool, reset the size so the number doesn't // stay in the map window. RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = 1; + break; } } +/** + * + * rct2: 0x0068D7FB + */ +static void window_map_update(rct_window *w) +{ + RCT2_CALLPROC_X(0x0068D7FB, 0, 0, 0, 0, (int)w, 0, 0); +} + + +/** + * + * rct2: 0x0068D093 + */ +static void window_map_toolupdate() +{ + rct_window *w; + short widgetIndex; + short x, y; + + window_tool_get_registers(w, widgetIndex, x, y); + + switch (widgetIndex) { + case WIDX_SET_LAND_RIGHTS: + window_map_set_land_rights_tool_update(x, y); + break; + case WIDX_BUILD_PARK_ENTRANCE: + window_map_place_park_entrance_tool_update(x, y); + break; + case WIDX_PEOPLE_STARTING_POSITION: + window_map_set_peep_spawn_tool_update(x, y); + break; + } +} + + +/** + * + * rct2: 0x0068D074 + */ +static void window_map_tooldown() +{ + rct_window *w; + short widgetIndex; + short x, y; + + window_tool_get_registers(w, widgetIndex, x, y); + + switch (widgetIndex) { + case WIDX_BUILD_PARK_ENTRANCE: + // sub_6670A4(); + break; + case WIDX_PEOPLE_STARTING_POSITION: + // sub_68D573(); + break; + } +} + +/** + * + * rct2: 0x0068D088 + */ +static void window_map_tooldrag() +{ + rct_window *w; + short widgetIndex; + short x, y; + + window_tool_get_registers(w, widgetIndex, x, y); + + switch (widgetIndex) { + case WIDX_SET_LAND_RIGHTS: + if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & (1 << 0)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 0; + game_do_command( + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, uint16), + GAME_COMMAND_FLAG_APPLY, + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, uint16), + RCT2_GLOBAL(0x00F1AD61, uint8), + GAME_COMMAND_SET_LAND_OWNERSHIP, + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16), + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16) + ); + } + break; + } +} + +/** + * + * rct2: 0x0068D055 + */ +static void window_map_toolabort() +{ + rct_window *w; + short widgetIndex; + short x, y; + + window_tool_get_registers(w, widgetIndex, x, y); + + switch (widgetIndex) { + case WIDX_SET_LAND_RIGHTS: + window_invalidate(w); + hide_gridlines(); + hide_land_rights(); + hide_construction_rights(); + break; + case WIDX_BUILD_PARK_ENTRANCE: + sub_666F9E(); + window_invalidate(w); + hide_gridlines(); + hide_land_rights(); + hide_construction_rights(); + break; + case WIDX_PEOPLE_STARTING_POSITION: + window_invalidate(w); + hide_gridlines(); + hide_land_rights(); + hide_construction_rights(); + break; + } +} + +/** + * + * rct2: 0x0068D7CC + */ +static void window_map_scrollgetsize() +{ + int width, height; + + window_map_invalidate(); + + width = 512; + height = 512; + window_scrollsize_set_registers(width, height); +} + +/** + * + * rct2: 0x0068D726 + */ +static void window_map_scrollmousedown() +{ + short x, y, scrollIndex; + rct_window *w; + + window_scrollmouse_get_registers(w, scrollIndex, x, y); + + RCT2_CALLPROC_X(0x0068D726, scrollIndex, 0, x, y, (int)w, 0, 0); +} + static void window_map_textinput() { uint8 result; @@ -405,7 +563,8 @@ static void window_map_textinput() window_textinput_get_registers(w, widgetIndex, result, text); if (result) { - if (widgetIndex == WIDX_LAND_TOOL) { + switch (widgetIndex) { + case WIDX_LAND_TOOL: size = strtol(text, &end, 10); if (*end == '\0') { if (size < 1) size = 1; @@ -413,8 +572,8 @@ static void window_map_textinput() RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = size; window_invalidate(w); } - } - else if (widgetIndex == WIDX_MAP_SIZE_SPINNER) { + break; + case WIDX_MAP_SIZE_SPINNER: size = strtol(text, &end, 10); if (*end == '\0') { if (size < 50) size = 50; @@ -430,109 +589,61 @@ static void window_map_textinput() } window_invalidate(w); } + break; } } } -static void window_map_inputsize_land(rct_window *w) +/* + * + * rct2: 0x0068D140 + */ +static void window_map_tooltip() { - ((uint16*)TextInputDescriptionArgs)[0] = 1; - ((uint16*)TextInputDescriptionArgs)[1] = 64; - window_text_input_open(w, WIDX_LAND_TOOL, 5128, 5129, STR_NONE, STR_NONE, 3); -} - -static void window_map_inputsize_map(rct_window *w) -{ - ((uint16*)TextInputDescriptionArgs)[0] = 50; - ((uint16*)TextInputDescriptionArgs)[1] = 256; - window_text_input_open(w, WIDX_MAP_SIZE_SPINNER, 5130, 5131, STR_NONE, STR_NONE, 4); + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = 3157; } /** -* -* rct2: 0x0068D7FB -*/ -static void window_map_update(rct_window *w) -{ - RCT2_CALLPROC_X(0x0068D7FB, 0, 0, 0, 0, (int)w, 0, 0); -} - -/** -* -* rct2: 0x0068D7CC -*/ -static void window_map_scrollgetsize() -{ - int width, height; - - window_map_invalidate(); - - width = 512; - height = 512; - window_scrollsize_set_registers(width, height); -} - -/** -* -* rct2: 0x0068D726 -*/ -static void window_map_scrollmousedown() -{ - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); - RCT2_CALLPROC_X(0x0068D726, scrollIndex, 0, x, y, (int)w, 0, 0); -} - -/** -* -* rct2: 0x0068CD35 (part of 0x0068CA8F) -*/ -static void window_map_show_default_scenario_editor_buttons(rct_window *mapWindow) { - mapWindow->widgets[WIDX_BUILD_PARK_ENTRANCE].type = WWT_FLATBTN; - mapWindow->widgets[WIDX_PEOPLE_STARTING_POSITION].type = WWT_FLATBTN; - mapWindow->widgets[WIDX_MAP_SIZE_SPINNER].type = WWT_SPINNER; - mapWindow->widgets[WIDX_MAP_SIZE_SPINNER_UP].type = WWT_DROPDOWN_BUTTON; - mapWindow->widgets[WIDX_MAP_SIZE_SPINNER_DOWN].type = WWT_DROPDOWN_BUTTON; - RCT2_GLOBAL(0x013CE952 + 2, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16); -} - -/** -* -* rct2: 0x0068CA8F -*/ + * + * rct2: 0x0068CA8F + */ static void window_map_invalidate() { rct_window *w; - uint32 pressed_widgets; + uint64 pressedWidgets; int i, height; window_get_register(w); colour_scheme_update(w); - // set the pressed widgets - pressed_widgets = (uint32)w->pressed_widgets; - pressed_widgets &= 0xFFFFFF8F; // both tabs and the map - pressed_widgets |= (1 << (w->selected_tab + 4)); // people tab or rides tab - pressed_widgets |= (1 << WIDX_LAND_TOOL); // land tool - pressed_widgets &= 0xFFF0FFFF; // the land option checkboxes + // Set the pressed widgets + pressedWidgets = w->pressed_widgets; + pressedWidgets &= (1ULL << WIDX_PEOPLE_TAB); + pressedWidgets &= (1ULL << WIDX_RIDES_TAB); + pressedWidgets &= (1ULL << WIDX_MAP); + pressedWidgets &= (1ULL << WIDX_LAND_OWNED_CHECKBOX); + pressedWidgets &= (1ULL << WIDX_CONSTRUCTION_RIGHTS_OWNED_CHECKBOX); + pressedWidgets &= (1ULL << WIDX_LAND_SALE_CHECKBOX); + pressedWidgets &= (1ULL << WIDX_CONSTRUCTION_RIGHTS_SALE_CHECKBOX); - if (RCT2_GLOBAL(0x0F1AD61, uint8) & 8) - pressed_widgets |= (1 << WIDX_LAND_SALE_CHECKBOX); + pressedWidgets |= (1ULL << (WIDX_PEOPLE_TAB + w->selected_tab)); + pressedWidgets |= (1ULL << WIDX_LAND_TOOL); - if (RCT2_GLOBAL(0x0F1AD61, uint8) & 4) - pressed_widgets |= (1 << WIDX_CONSTRUCTION_RIGHTS_SALE_CHECKBOX); + if (RCT2_GLOBAL(0x00F1AD61, uint8) & (1 << 3)) + pressedWidgets |= (1 << WIDX_LAND_SALE_CHECKBOX); - if (RCT2_GLOBAL(0x0F1AD61, uint8) & 2) - pressed_widgets |= (1 << WIDX_LAND_OWNED_CHECKBOX); + if (RCT2_GLOBAL(0x00F1AD61, uint8) & (1 << 2)) + pressedWidgets |= (1 << WIDX_CONSTRUCTION_RIGHTS_SALE_CHECKBOX); - if (RCT2_GLOBAL(0x0F1AD61, uint8) & 1) - pressed_widgets |= (1 << WIDX_CONSTRUCTION_RIGHTS_OWNED_CHECKBOX); + if (RCT2_GLOBAL(0x00F1AD61, uint8) & (1 << 1)) + pressedWidgets |= (1 << WIDX_LAND_OWNED_CHECKBOX); - w->pressed_widgets = pressed_widgets; + if (RCT2_GLOBAL(0x00F1AD61, uint8) & (1 << 0)) + pressedWidgets |= (1 << WIDX_CONSTRUCTION_RIGHTS_OWNED_CHECKBOX); - // resizing changes some widget coordinates + w->pressed_widgets = pressedWidgets; + + // Resize widgets to window size w->widgets[WIDX_BACKGROUND].right = w->width - 1; w->widgets[WIDX_BACKGROUND].bottom = w->height - 1; w->widgets[WIDX_RESIZE].right = w->width - 1; @@ -542,10 +653,9 @@ static void window_map_invalidate() w->widgets[WIDX_CLOSE].right = w->width - 2 - 11 + 10; w->widgets[WIDX_MAP].right = w->width - 4; - if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || - gSandboxMode) + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gSandboxMode) w->widgets[WIDX_MAP].bottom = w->height - 1 - 72; - else if (w->selected_tab == 1) + else if (w->selected_tab == PAGE_RIDES) w->widgets[WIDX_MAP].bottom = w->height - 1 - 44; else w->widgets[WIDX_MAP].bottom = w->height - 1 - 14; @@ -573,7 +683,7 @@ static void window_map_invalidate() w->widgets[WIDX_LAND_TOOL_LARGER].top = w->height - 27; w->widgets[WIDX_LAND_TOOL_LARGER].bottom = w->height - 27 + 15; - // land tool mode (4 checkboxes) + // Land tool mode (4 checkboxes) height = w->height - 55; for (i = 0; i < 4; i++) { w->widgets[WIDX_LAND_OWNED_CHECKBOX + i].top = height; @@ -582,29 +692,29 @@ static void window_map_invalidate() height += 2; } - // disable all scenario editor related widgets + // Disable all scenario editor related widgets for (i = WIDX_MAP_SIZE_SPINNER; i <= WIDX_ROTATE_90; i++) { w->widgets[i].type = WWT_EMPTY; } - - - if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || - gSandboxMode) { + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gSandboxMode) { // scenario editor: build park entrance selected, show rotate button - if ((RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && + if ( + (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == WC_MAP && - RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint8) == WIDX_BUILD_PARK_ENTRANCE) { + RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint8) == WIDX_BUILD_PARK_ENTRANCE + ) { w->widgets[WIDX_ROTATE_90].type = WWT_FLATBTN; } - // always show set land rights button + // Always show set land rights button w->widgets[WIDX_SET_LAND_RIGHTS].type = WWT_FLATBTN; - // if any tool is active - if ((RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && - RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == WC_MAP) { - + // If any tool is active + if ( + (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && + RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == WC_MAP + ) { // if not in set land rights mode: show the default scenario editor buttons if (RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint8) != WIDX_SET_LAND_RIGHTS) { window_map_show_default_scenario_editor_buttons(w); @@ -612,41 +722,41 @@ static void window_map_invalidate() w->widgets[WIDX_LAND_TOOL].type = WWT_IMGBTN; w->widgets[WIDX_LAND_TOOL_SMALLER].type = WWT_TRNBTN; w->widgets[WIDX_LAND_TOOL_LARGER].type = WWT_TRNBTN; + for (i = 0; i < 4; i++) w->widgets[WIDX_LAND_OWNED_CHECKBOX + i].type = WWT_CHECKBOX; - w->widgets[WIDX_LAND_TOOL].image = RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, uint16) <= 7 ? SPR_LAND_TOOL_SIZE_0 + - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, uint16) : 0xFFFFFFFF; + + w->widgets[WIDX_LAND_TOOL].image = RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, uint16) <= 7 ? + SPR_LAND_TOOL_SIZE_0 + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, uint16) : + 0xFFFFFFFF; } - // if no tool is active: show the default scenario editor buttons } else { + // if no tool is active: show the default scenario editor buttons window_map_show_default_scenario_editor_buttons(w); } } } /** -* -* rct2: 0x0068CDA9 -*/ + * + * rct2: 0x0068CDA9 + */ static void window_map_paint() { rct_window *w; rct_drawpixelinfo *dpi; - int image_id; int i, x, y; window_paint_get_registers(w, dpi); window_draw_widgets(w, dpi); + window_map_draw_tab_images(w, dpi); x = w->x + (window_map_widgets[WIDX_LAND_TOOL].left + window_map_widgets[WIDX_LAND_TOOL].right) / 2; y = w->y + (window_map_widgets[WIDX_LAND_TOOL].top + window_map_widgets[WIDX_LAND_TOOL].bottom) / 2; - // FEATURE larger land tool size support - if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE && - RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint8) == WIDX_SET_LAND_RIGHTS && - (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > 7) && - (RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == WC_MAP)) { + // Draw land tool size + if (widget_is_active_tool(w, WIDX_SET_LAND_RIGHTS) && RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > 7) { RCT2_GLOBAL(0x009BC677, char) = FORMAT_BLACK; RCT2_GLOBAL(0x009BC678, char) = FORMAT_COMMA16; RCT2_GLOBAL(0x009BC679, char) = 0; @@ -655,40 +765,21 @@ static void window_map_paint() } y = w->y + window_map_widgets[WIDX_LAND_TOOL].bottom + 5; - // guest tab image (animated) - image_id = SPR_TAB_GUESTS_0; - if (w->selected_tab == 0) - image_id += w->list_information_type / 4; - - gfx_draw_sprite(dpi, image_id, - w->x + w->widgets[WIDX_PEOPLE_TAB].left, - w->y + w->widgets[WIDX_PEOPLE_TAB].top, 0); - - // ride/stall tab image (animated) - image_id = SPR_TAB_RIDE_0; - if (w->selected_tab == 1) - image_id += w->list_information_type / 4; - - gfx_draw_sprite(dpi, image_id, - w->x + w->widgets[WIDX_RIDES_TAB].left, - w->y + w->widgets[WIDX_RIDES_TAB].top, 0); - - // people starting position (scenario editor only) + // People starting position (scenario editor only) if (w->widgets[WIDX_PEOPLE_STARTING_POSITION].type != 0) { - gfx_draw_sprite(dpi, 0x0B6E0190A, - w->x + w->widgets[WIDX_PEOPLE_STARTING_POSITION].left + 12, - w->y + w->widgets[WIDX_PEOPLE_STARTING_POSITION].top + 18, 0); + x = w->x + w->widgets[WIDX_PEOPLE_STARTING_POSITION].left + 12; + y = w->y + w->widgets[WIDX_PEOPLE_STARTING_POSITION].top + 18; + gfx_draw_sprite(dpi, 0x0B6E0190A, x, y, 0); } - if (!((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) - || gSandboxMode)) { - // render the map legend - if (w->selected_tab != 0) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode) { + // Render the map legend + if (w->selected_tab == PAGE_RIDES) { x = w->x + 4; y = w->y + w->widgets[WIDX_MAP].bottom + 2; for (i = 0; i < 8; i++) { - gfx_fill_rect(dpi, x, y + 2, x + 6, y + 8, RCT2_GLOBAL(0x00981BCC+ 2 * i, uint8)); + gfx_fill_rect(dpi, x, y + 2, x + 6, y + 8, RCT2_GLOBAL(0x00981BCC + (i * 2), uint8)); gfx_draw_string_left(dpi, STR_MAP_RIDE + i, w, 0, x + 10, y); y += 10; if (i == 3) { @@ -697,29 +788,160 @@ static void window_map_paint() } } } - } else { - if ((RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && - (RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == WC_MAP) && - (RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint8) == WIDX_SET_LAND_RIGHTS)) - return; - + } else if (!widget_is_active_tool(w, WIDX_SET_LAND_RIGHTS)) { gfx_draw_string_left(dpi, STR_MAP_SIZE, 0, 0, w->x + 4, w->y + w->widgets[WIDX_MAP_SIZE_SPINNER].top + 1); } } -/* -* -* rct2: 0x0068D140 -*/ -static void window_map_tooltip() +/** + * + * rct2: 0x0068CF23 + */ +static void window_map_scrollpaint() { - RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = 0xC55; + rct_window *w; + rct_drawpixelinfo *dpi; + rct_g1_element *g1_element, pushed_g1_element; + + window_paint_get_registers(w, dpi); + + gfx_clear(dpi, 0x0A0A0A0A); + + g1_element = &g1Elements[0]; + pushed_g1_element = *g1_element; + + g1_element->offset = RCT2_GLOBAL(RCT2_ADDRESS_MAP_IMAGE_DATA, uint8*); + g1_element->width = 0x200; + g1_element->height = 0x200; + g1_element->x_offset = 0xFFF8; + g1_element->y_offset = 0xFFF8; + g1_element->flags = 0; + + gfx_draw_sprite(dpi, 0, 0, 0, 0); + + *g1_element = pushed_g1_element; + + if (w->selected_tab == PAGE_PEEPS) + window_map_paint_peep_overlay(dpi); + else + window_map_paint_train_overlay(dpi); + + window_map_paint_hud_rectangle(dpi); } /** -* -* part of window_map_paint_peep_overlay and window_map_paint_train_overlay -*/ + * + * rct2: 0x0068CA6C + */ +static void window_map_init_map() +{ + memset(RCT2_GLOBAL(RCT2_ADDRESS_MAP_IMAGE_DATA, void*), 0x0A0A0A0A, 256 * 256 * sizeof(uint32)); + RCT2_GLOBAL(0x00F1AD6C, uint32) = 0; +} + +/** + * + * rct2: 0x0068C990 + */ +static void window_map_center_on_view_point() +{ + rct_window *w = window_get_main(); + rct_window *w_map; + sint16 ax, bx, cx, dx; + sint16 bp, di; + + if (w == NULL || w->viewport == NULL) + return; + + w_map = window_find_by_class(WC_MAP); + if (w_map == NULL) + return; + + rct_xy16 offset = MiniMapOffsets[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8) & 3]; + + // calculate center view point of viewport and transform it to minimap coordinates + + cx = ((w->viewport->view_width >> 1) + w->viewport->view_x) >> 5; + dx = ((w->viewport->view_height >> 1) + w->viewport->view_y) >> 4; + cx += offset.x; + dx += offset.y; + + // calculate width and height of minimap + + ax = w_map->widgets[WIDX_MAP].right - w_map->widgets[WIDX_MAP].left - 11; + bx = w_map->widgets[WIDX_MAP].bottom - w_map->widgets[WIDX_MAP].top - 11; + bp = ax; + di = bx; + + ax >>= 1; + bx >>= 1; + cx = max(cx - ax, 0); + dx = max(dx - bx, 0); + + bp = w_map->scrolls[0].h_right - bp; + di = w_map->scrolls[0].v_bottom - di; + + if (bp < 0 && (bp - cx) < 0) + cx = 0; + + if (di < 0 && (di - dx) < 0) + dx = 0; + + w_map->scrolls[0].h_left = cx; + w_map->scrolls[0].v_top = dx; + widget_scroll_update_thumbs(w_map, WIDX_MAP); +} + +/** + * + * rct2: 0x0068CD35 (part of 0x0068CA8F) + */ +static void window_map_show_default_scenario_editor_buttons(rct_window *w) { + w->widgets[WIDX_BUILD_PARK_ENTRANCE].type = WWT_FLATBTN; + w->widgets[WIDX_PEOPLE_STARTING_POSITION].type = WWT_FLATBTN; + w->widgets[WIDX_MAP_SIZE_SPINNER].type = WWT_SPINNER; + w->widgets[WIDX_MAP_SIZE_SPINNER_UP].type = WWT_DROPDOWN_BUTTON; + w->widgets[WIDX_MAP_SIZE_SPINNER_DOWN].type = WWT_DROPDOWN_BUTTON; + RCT2_GLOBAL(0x013CE952 + 2, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16); +} + +static void window_map_inputsize_land(rct_window *w) +{ + ((uint16*)TextInputDescriptionArgs)[0] = 1; + ((uint16*)TextInputDescriptionArgs)[1] = 64; + window_text_input_open(w, WIDX_LAND_TOOL, 5128, 5129, STR_NONE, STR_NONE, 3); +} + +static void window_map_inputsize_map(rct_window *w) +{ + ((uint16*)TextInputDescriptionArgs)[0] = 50; + ((uint16*)TextInputDescriptionArgs)[1] = 256; + window_text_input_open(w, WIDX_MAP_SIZE_SPINNER, 5130, 5131, STR_NONE, STR_NONE, 4); +} + +static void window_map_draw_tab_images(rct_window *w, rct_drawpixelinfo *dpi) +{ + uint32 image; + + // Guest tab image (animated) + image = SPR_TAB_GUESTS_0; + if (w->selected_tab == PAGE_PEEPS) + image += w->list_information_type / 4; + + gfx_draw_sprite(dpi, image, w->x + w->widgets[WIDX_PEOPLE_TAB].left, w->y + w->widgets[WIDX_PEOPLE_TAB].top, 0); + + // Ride/stall tab image (animated) + image = SPR_TAB_RIDE_0; + if (w->selected_tab == PAGE_RIDES) + image += w->list_information_type / 4; + + gfx_draw_sprite(dpi, image, w->x + w->widgets[WIDX_RIDES_TAB].left, w->y + w->widgets[WIDX_RIDES_TAB].top, 0); +} + +/** + * + * part of window_map_paint_peep_overlay and window_map_paint_train_overlay + */ static void window_map_transform_to_map_coords(sint16 *left, sint16 *top) { sint16 x = *left, y = *top; @@ -753,9 +975,9 @@ static void window_map_transform_to_map_coords(sint16 *left, sint16 *top) } /** -* -* rct2: 0x0068DADA -*/ + * + * rct2: 0x0068DADA + */ static void window_map_paint_peep_overlay(rct_drawpixelinfo *dpi) { rct_peep *peep; @@ -800,9 +1022,9 @@ static void window_map_paint_peep_overlay(rct_drawpixelinfo *dpi) } /** -* -* rct2: 0x0068DBC1 -*/ + * + * rct2: 0x0068DBC1 + */ static void window_map_paint_train_overlay(rct_drawpixelinfo *dpi) { rct_vehicle *train, *vehicle; @@ -832,28 +1054,26 @@ static void window_map_paint_train_overlay(rct_drawpixelinfo *dpi) } /** -* The call to gfx_fill_rect was originally wrapped in sub_68DABD which made sure that arguments were ordered correctly, -* but it doesn't look like it's ever necessary here so the call was removed. -* -* rct2: 0x0068D8CE -*/ + * The call to gfx_fill_rect was originally wrapped in sub_68DABD which made sure that arguments were ordered correctly, + * but it doesn't look like it's ever necessary here so the call was removed. + * + * rct2: 0x0068D8CE + */ static void window_map_paint_hud_rectangle(rct_drawpixelinfo *dpi) { rct_window *main_window = window_get_main(); if (main_window == NULL) return; + rct_viewport *viewport = main_window->viewport; if (viewport == NULL) return; - int rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); - sint16 offset_x = _minimap_offsets_x[rotation]; - sint16 offset_y = _minimap_offsets_y[rotation]; - - sint16 left = (viewport->view_x >> 5) + offset_x; - sint16 right = ((viewport->view_x + viewport->view_width) >> 5) + offset_x; - sint16 top = (viewport->view_y >> 4) + offset_y; - sint16 bottom = ((viewport->view_y + viewport->view_height) >> 4) + offset_y; + rct_xy16 offset = MiniMapOffsets[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) & 3]; + sint16 left = (viewport->view_x >> 5) + offset.x; + sint16 right = ((viewport->view_x + viewport->view_width) >> 5) + offset.x; + sint16 top = (viewport->view_y >> 4) + offset.y; + sint16 bottom = ((viewport->view_y + viewport->view_height) >> 4) + offset.y; // top horizontal lines gfx_fill_rect(dpi, left, top, left + 3, top, 0x38); @@ -873,100 +1093,160 @@ static void window_map_paint_hud_rectangle(rct_drawpixelinfo *dpi) } /** -* -* rct2: 0x0068CF23 -*/ -static void window_map_scrollpaint() + * + * rct2: 0x0068D24E + */ +static void window_map_set_land_rights_tool_update(int x, int y) { - rct_window *w; - rct_drawpixelinfo *dpi; - rct_g1_element *g1_element, pushed_g1_element; + sint16 mapX, mapY; + rct_viewport *viewport; - window_paint_get_registers(w, dpi); + map_invalidate_selection_rect(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 0); + sub_688972(x, y, &mapX, &mapY, &viewport); + if (mapX == (sint16)0x8000) + return; - gfx_clear(dpi, 0x0A0A0A0A); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= (1 << 0); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16) = 4; - g1_element = &g1Elements[0]; - pushed_g1_element = *g1_element; + int landToolSize = RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, uint16); + if (landToolSize == 0) + landToolSize = 1; - g1_element->offset = RCT2_GLOBAL(RCT2_ADDRESS_MAP_IMAGE_DATA, uint8*); - g1_element->width = 0x200; - g1_element->height = 0x200; - g1_element->x_offset = 0xFFF8; - g1_element->y_offset = 0xFFF8; - g1_element->flags = 0; - - gfx_draw_sprite(dpi, 0, 0, 0, 0); - - *g1_element = pushed_g1_element; - - if (w->selected_tab == 0) - window_map_paint_peep_overlay(dpi); - else - window_map_paint_train_overlay(dpi); - - window_map_paint_hud_rectangle(dpi); + int size = (landToolSize * 32) - 32; + int radius = (landToolSize * 16) - 16; + mapX = (mapX - radius) & 0xFFE0; + mapY = (mapY - radius) & 0xFFE0; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, uint16) = mapX; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, uint16) = mapY; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16) = mapX + size; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16) = mapY + size; + map_invalidate_selection_rect(); } /** -* -* rct2: 0x0068CA6C -*/ -static void window_map_init_map() + * + * rct2: 0x00666EEF + */ +void sub_666EEF(int x, int y, sint16 *mapX, sint16 *mapY, sint16 *mapZ, int *direction) { - memset(RCT2_GLOBAL(RCT2_ADDRESS_MAP_IMAGE_DATA, void*), 0x0A0A0A0A, 256 * 256 * sizeof(uint32)); - RCT2_GLOBAL(0x00F1AD6C, uint32) = 0; + int eax, ebx, ecx, edx, esi, edi, ebp; + eax = x; + ebx = y; + RCT2_CALLFUNC_X(0x00666EEF, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + *mapX = (eax & 0xFFFF); + *mapY = (ecx & 0xFFFF); + *mapZ = (edx & 0xFF); + *direction = ((ebx >> 8) & 0xFF); } /** -* -* rct2: 0x0068C990 -*/ -static void window_map_center_on_view_point() + * + * rct2: 0x00666F4E + */ +money32 sub_666F4E(int x, int y, int z, int direction) { - rct_window *w = window_get_main(); - rct_window *w_map; - sint16 ax, bx, cx, dx; - sint16 bp, di; + money32 result; - if (w == NULL || w->viewport == NULL) - return; - - w_map = window_find_by_class(WC_MAP); - if (w_map == NULL) - return; - - uint8 rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); - - // calculate center view point of viewport and transform it to minimap coordinates - - cx = ((w->viewport->view_width >> 1) + w->viewport->view_x) >> 5; - dx = ((w->viewport->view_height >> 1) + w->viewport->view_y) >> 4; - cx += _minimap_offsets_x[rotation]; - dx += _minimap_offsets_y[rotation]; - - // calculate width and height of minimap - - ax = w_map->widgets[WIDX_MAP].right - w_map->widgets[WIDX_MAP].left - 11; - bx = w_map->widgets[WIDX_MAP].bottom - w_map->widgets[WIDX_MAP].top - 11; - bp = ax; - di = bx; - - ax >>= 1; - bx >>= 1; - cx = max(cx - ax, 0); - dx = max(dx - bx, 0); - - bp = w_map->scrolls[0].h_right - bp; - di = w_map->scrolls[0].v_bottom - di; - - if (bp < 0 && (bp - cx) < 0) - cx = 0; - - if (di < 0 && (di - dx) < 0) - dx = 0; - - w_map->scrolls[0].h_left = cx; - w_map->scrolls[0].v_top = dx; - widget_scroll_update_thumbs(w_map, WIDX_MAP); + sub_666F9E(); + result = game_do_command( + x, + 104 | GAME_COMMAND_FLAG_APPLY | (direction << 8), + y, + z, + GAME_COMMAND_PLACE_PARK_ENTRANCE, + 0, + 0 + ); + if (result != MONEY32_UNDEFINED) { + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_Y, uint16) = y; + RCT2_GLOBAL(0x009E32D0, uint8) = z; + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_DIRECTION, uint8) = direction; + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_EXISTS, uint8) |= (1 << 0); + } + return result; } + +/** + * + * rct2: 0x00666FD0 + */ +static void window_map_place_park_entrance_tool_update(int x, int y) +{ + sint16 mapX, mapY, mapZ; + int direction, sideDirection; + + map_invalidate_selection_rect(); + map_invalidate_map_selection_tiles(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 0); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 1); + sub_666EEF(x, y, &mapX, &mapY, &mapZ, &direction); + if (mapX == (sint16)-1) { + sub_666F9E(); + return; + } + + sideDirection = (direction + 1) & 3; + gMapSelectionTiles[0].x = mapX; + gMapSelectionTiles[0].y = mapY; + gMapSelectionTiles[1].x = mapX + TileDirectionDelta[sideDirection].x; + gMapSelectionTiles[1].y = mapY + TileDirectionDelta[sideDirection].y; + gMapSelectionTiles[2].x = mapX - TileDirectionDelta[sideDirection].x; + gMapSelectionTiles[2].y = mapY - TileDirectionDelta[sideDirection].y; + gMapSelectionTiles[3].x = -1; + gMapSelectionTiles[3].y = -1; + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= (1 << 1); + map_invalidate_map_selection_tiles(); + if ( + (RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_EXISTS, uint8) & (1 << 0)) && + mapX == RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_X, uint16) && + mapY == RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_Y, uint16) && + direction == RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_DIRECTION, uint8) + ) { + return; + } + + sub_666F9E(); + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_PRICE, uint32) = sub_666F4E(mapX, mapY, mapZ, direction); +} + +/** + * + * rct2: 0x0068D4E9 + */ +static void window_map_set_peep_spawn_tool_update(int x, int y) +{ + int mapX, mapY, mapZ, direction; + rct_map_element *mapElement; + + map_invalidate_selection_rect(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 0); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 2); + footpath_bridge_get_info_from_pos(x, y, &mapX, &mapY, &direction, &mapElement); + if (mapX == -1) + return; + + mapZ = mapElement->base_height * 8; + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_SURFACE) { + if ((mapElement->properties.surface.slope & 0x0F) != 0) + mapZ += 16; + if (mapElement->properties.surface.slope & 0x10) + mapZ += 16; + } + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= (1 << 0); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= (1 << 2); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16) = 4; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, uint16) = mapX; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, uint16) = mapY; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16) = mapX; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16) = mapY; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = direction ^ 2; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) = mapX; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16) = mapY; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = mapZ; + map_invalidate_selection_rect(); +} \ No newline at end of file diff --git a/src/world/footpath.h b/src/world/footpath.h index 2f943e8084..4575fe57d9 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -53,4 +53,6 @@ void sub_6A6C66(int x, int y, rct_map_element *mapElement, int flags); void sub_6A759F(); void sub_6A742F(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction); +void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, int *direction, rct_map_element **mapElement); + #endif diff --git a/src/world/park.c b/src/world/park.c index 7b52393d88..d70d95568a 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -1419,4 +1419,24 @@ void set_forced_park_rating(int rating){ int get_forced_park_rating(){ return gForcedParkRating; -} \ No newline at end of file +} + +/** + * + * rct2: 0x00666F9E + */ +void sub_666F9E() +{ + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_EXISTS, uint8) & (1 << 0)) { + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_EXISTS, uint8) &= ~(1 << 0); + game_do_command( + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_X, uint16), + 40 | GAME_COMMAND_FLAG_APPLY, + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_Y, uint16), + RCT2_GLOBAL(0x009E32D0, uint8), + GAME_COMMAND_REMOVE_PARK_ENTRANCE, + 0, + 0 + ); + } +} diff --git a/src/world/park.h b/src/world/park.h index 556757cdc8..2ad7515ea7 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -82,4 +82,6 @@ void game_command_buy_land_rights(int *eax, int *ebx, int *ecx, int *edx, int *e void gfx_invalidate_viewport_tile(int x, int y, int z0, int z1); +void sub_666F9E(); + #endif From c0b45d8651c5e012f640d28a3ca515e19d40eca2 Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 1 Jul 2015 04:00:15 +0100 Subject: [PATCH 0158/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 3777 +++++++++++++++++++++++++ data/language/english_us.txt | 17 +- 2 files changed, 3791 insertions(+), 3 deletions(-) create mode 100644 data/language/chinese_traditional.txt diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt new file mode 100644 index 0000000000..5e43a7e846 --- /dev/null +++ b/data/language/chinese_traditional.txt @@ -0,0 +1,3777 @@ +# STR_XXXX part is read and XXXX becomes the string id number. +# Everything after the colon and before the new line will be saved as the string. +# Use # at the beginning of a line to leave a comment. +STR_0000 : +STR_0001 :{STRINGID} {COMMA16} +STR_0002 :Spiral Roller Coaster +STR_0003 :Stand-up Roller Coaster +STR_0004 :Suspended Swinging Coaster +STR_0005 :Inverted Roller Coaster +STR_0006 :Junior Roller Coaster +STR_0007 :Miniature Railway +STR_0008 :Monorail +STR_0009 :Mini Suspended Coaster +STR_0010 :Boat Ride +STR_0011 :Wooden Wild Mouse +STR_0012 :Steeplechase +STR_0013 :Car Ride +STR_0014 :Launched Freefall +STR_0015 :Bobsleigh Coaster +STR_0016 :Observation Tower +STR_0017 :Looping Roller Coaster +STR_0018 :Dinghy Slide +STR_0019 :Mine Train Coaster +STR_0020 :Chairlift +STR_0021 :Corkscrew Roller Coaster +STR_0022 :Maze +STR_0023 :Spiral Slide +STR_0024 :Go Karts +STR_0025 :Log Flume +STR_0026 :River Rapids +STR_0027 :Dodgems +STR_0028 :Pirate Ship +STR_0029 :Swinging Inverter Ship +STR_0030 :Food Stall +STR_0031 :Unknown Stall (1D) +STR_0032 :Drink Stall +STR_0033 :Unknown Stall (1F) +STR_0034 :Shop +STR_0035 :Merry-Go-Round +STR_0036 :Unknown Stall (22) +STR_0037 :Information Kiosk +STR_0038 :Toilets +STR_0039 :Ferris Wheel +STR_0040 :Motion Simulator +STR_0041 :3D Cinema +STR_0042 :Top Spin +STR_0043 :Space Rings +STR_0044 :Reverse Freefall Coaster +STR_0045 :Lift +STR_0046 :Vertical Drop Roller Coaster +STR_0047 :Cash Machine +STR_0048 :Twist +STR_0049 :Haunted House +STR_0050 :First Aid Room +STR_0051 :Circus Show +STR_0052 :Ghost Train +STR_0053 :Twister Roller Coaster +STR_0054 :Wooden Roller Coaster +STR_0055 :Side-Friction Roller Coaster +STR_0056 :Wild Mouse +STR_0057 :Multi-Dimension Roller Coaster +STR_0058 :Unknown Ride (38) +STR_0059 :Flying Roller Coaster +STR_0060 :Unknown Ride (3A) +STR_0061 :Virginia Reel +STR_0062 :Splash Boats +STR_0063 :Mini Helicopters +STR_0064 :Lay-down Roller Coaster +STR_0065 :Suspended Monorail +STR_0066 :Unknown Ride (40) +STR_0067 :Reverser Roller Coaster +STR_0068 :Heartline Twister Coaster +STR_0069 :Mini Golf +STR_0070 :Giga Coaster +STR_0071 :Roto-Drop +STR_0072 :Flying Saucers +STR_0073 :Crooked House +STR_0074 :Monorail Cycles +STR_0075 :Compact Inverted Coaster +STR_0076 :Water Coaster +STR_0077 :Air Powered Vertical Coaster +STR_0078 :Inverted Hairpin Coaster +STR_0079 :Magic Carpet +STR_0080 :Submarine Ride +STR_0081 :River Rafts +STR_0082 :Unknown Ride (50) +STR_0083 :Enterprise +STR_0084 :Unknown Ride (52) +STR_0085 :Unknown Ride (53) +STR_0086 :Unknown Ride (54) +STR_0087 :Unknown Ride (55) +STR_0088 :Inverted Impulse Coaster +STR_0089 :Mini Roller Coaster +STR_0090 :Mine Ride +STR_0091 :Unknown Ride (59) +STR_0092 :LIM Launched Roller Coaster +STR_0093 : +STR_0094 : +STR_0095 : +STR_0096 : +STR_0097 : +STR_0098 : +STR_0099 : +STR_0100 : +STR_0101 : +STR_0102 : +STR_0103 : +STR_0104 : +STR_0105 : +STR_0106 : +STR_0107 : +STR_0108 : +STR_0109 : +STR_0110 : +STR_0111 : +STR_0112 : +STR_0113 : +STR_0114 : +STR_0115 : +STR_0116 : +STR_0117 : +STR_0118 : +STR_0119 : +STR_0120 : +STR_0121 : +STR_0122 : +STR_0123 : +STR_0124 : +STR_0125 : +STR_0126 : +STR_0127 : +STR_0128 : +STR_0129 : +STR_0130 : +STR_0131 : +STR_0132 : +STR_0133 : +STR_0134 : +STR_0135 : +STR_0136 : +STR_0137 : +STR_0138 : +STR_0139 : +STR_0140 : +STR_0141 : +STR_0142 : +STR_0143 : +STR_0144 : +STR_0145 : +STR_0146 : +STR_0147 : +STR_0148 : +STR_0149 : +STR_0150 : +STR_0151 : +STR_0152 : +STR_0153 : +STR_0154 : +STR_0155 : +STR_0156 : +STR_0157 : +STR_0158 : +STR_0159 : +STR_0160 : +STR_0161 : +STR_0162 : +STR_0163 : +STR_0164 : +STR_0165 : +STR_0166 : +STR_0167 : +STR_0168 : +STR_0169 : +STR_0170 : +STR_0171 : +STR_0172 : +STR_0173 : +STR_0174 : +STR_0175 : +STR_0176 : +STR_0177 : +STR_0178 : +STR_0179 : +STR_0180 : +STR_0181 : +STR_0182 : +STR_0183 : +STR_0184 : +STR_0185 : +STR_0186 : +STR_0187 : +STR_0188 : +STR_0189 : +STR_0190 : +STR_0191 : +STR_0192 : +STR_0193 : +STR_0194 : +STR_0195 : +STR_0196 : +STR_0197 : +STR_0198 : +STR_0199 : +STR_0200 : +STR_0201 : +STR_0202 : +STR_0203 : +STR_0204 : +STR_0205 : +STR_0206 : +STR_0207 : +STR_0208 : +STR_0209 : +STR_0210 : +STR_0211 : +STR_0212 : +STR_0213 : +STR_0214 : +STR_0215 : +STR_0216 : +STR_0217 : +STR_0218 : +STR_0219 : +STR_0220 : +STR_0221 : +STR_0222 : +STR_0223 : +STR_0224 : +STR_0225 : +STR_0226 : +STR_0227 : +STR_0228 : +STR_0229 : +STR_0230 : +STR_0231 : +STR_0232 : +STR_0233 : +STR_0234 : +STR_0235 : +STR_0236 : +STR_0237 : +STR_0238 : +STR_0239 : +STR_0240 : +STR_0241 : +STR_0242 : +STR_0243 : +STR_0244 : +STR_0245 : +STR_0246 : +STR_0247 : +STR_0248 : +STR_0249 : +STR_0250 : +STR_0251 : +STR_0252 : +STR_0253 : +STR_0254 : +STR_0255 : +STR_0256 : +STR_0257 : +STR_0258 : +STR_0259 : +STR_0260 : +STR_0261 : +STR_0262 : +STR_0263 : +STR_0264 : +STR_0265 : +STR_0266 : +STR_0267 : +STR_0268 : +STR_0269 : +STR_0270 : +STR_0271 : +STR_0272 : +STR_0273 : +STR_0274 : +STR_0275 : +STR_0276 : +STR_0277 : +STR_0278 : +STR_0279 : +STR_0280 : +STR_0281 : +STR_0282 : +STR_0283 : +STR_0284 : +STR_0285 : +STR_0286 : +STR_0287 : +STR_0288 : +STR_0289 : +STR_0290 : +STR_0291 : +STR_0292 : +STR_0293 : +STR_0294 : +STR_0295 : +STR_0296 : +STR_0297 : +STR_0298 : +STR_0299 : +STR_0300 : +STR_0301 : +STR_0302 : +STR_0303 : +STR_0304 : +STR_0305 : +STR_0306 : +STR_0307 : +STR_0308 : +STR_0309 : +STR_0310 : +STR_0311 : +STR_0312 : +STR_0313 : +STR_0314 : +STR_0315 : +STR_0316 : +STR_0317 : +STR_0318 : +STR_0319 : +STR_0320 : +STR_0321 : +STR_0322 : +STR_0323 : +STR_0324 : +STR_0325 : +STR_0326 : +STR_0327 : +STR_0328 : +STR_0329 : +STR_0330 : +STR_0331 : +STR_0332 : +STR_0333 : +STR_0334 : +STR_0335 : +STR_0336 : +STR_0337 : +STR_0338 : +STR_0339 : +STR_0340 : +STR_0341 : +STR_0342 : +STR_0343 : +STR_0344 : +STR_0345 : +STR_0346 : +STR_0347 : +STR_0348 : +STR_0349 : +STR_0350 : +STR_0351 : +STR_0352 : +STR_0353 : +STR_0354 : +STR_0355 : +STR_0356 : +STR_0357 : +STR_0358 : +STR_0359 : +STR_0360 : +STR_0361 : +STR_0362 : +STR_0363 : +STR_0364 : +STR_0365 : +STR_0366 : +STR_0367 : +STR_0368 : +STR_0369 : +STR_0370 : +STR_0371 : +STR_0372 : +STR_0373 : +STR_0374 : +STR_0375 : +STR_0376 : +STR_0377 : +STR_0378 : +STR_0379 : +STR_0380 : +STR_0381 : +STR_0382 : +STR_0383 : +STR_0384 : +STR_0385 : +STR_0386 : +STR_0387 : +STR_0388 : +STR_0389 : +STR_0390 : +STR_0391 : +STR_0392 : +STR_0393 : +STR_0394 : +STR_0395 : +STR_0396 : +STR_0397 : +STR_0398 : +STR_0399 : +STR_0400 : +STR_0401 : +STR_0402 : +STR_0403 : +STR_0404 : +STR_0405 : +STR_0406 : +STR_0407 : +STR_0408 : +STR_0409 : +STR_0410 : +STR_0411 : +STR_0412 : +STR_0413 : +STR_0414 : +STR_0415 : +STR_0416 : +STR_0417 : +STR_0418 : +STR_0419 : +STR_0420 : +STR_0421 : +STR_0422 : +STR_0423 : +STR_0424 : +STR_0425 : +STR_0426 : +STR_0427 : +STR_0428 : +STR_0429 : +STR_0430 : +STR_0431 : +STR_0432 : +STR_0433 : +STR_0434 : +STR_0435 : +STR_0436 : +STR_0437 : +STR_0438 : +STR_0439 : +STR_0440 : +STR_0441 : +STR_0442 : +STR_0443 : +STR_0444 : +STR_0445 : +STR_0446 : +STR_0447 : +STR_0448 : +STR_0449 : +STR_0450 : +STR_0451 : +STR_0452 : +STR_0453 : +STR_0454 : +STR_0455 : +STR_0456 : +STR_0457 : +STR_0458 : +STR_0459 : +STR_0460 : +STR_0461 : +STR_0462 : +STR_0463 : +STR_0464 : +STR_0465 : +STR_0466 : +STR_0467 : +STR_0468 : +STR_0469 : +STR_0470 : +STR_0471 : +STR_0472 : +STR_0473 : +STR_0474 : +STR_0475 : +STR_0476 : +STR_0477 : +STR_0478 : +STR_0479 : +STR_0480 : +STR_0481 : +STR_0482 : +STR_0483 : +STR_0484 : +STR_0485 : +STR_0486 : +STR_0487 : +STR_0488 : +STR_0489 : +STR_0490 : +STR_0491 : +STR_0492 : +STR_0493 : +STR_0494 : +STR_0495 : +STR_0496 : +STR_0497 : +STR_0498 : +STR_0499 : +STR_0500 : +STR_0501 : +STR_0502 : +STR_0503 : +STR_0504 : +STR_0505 : +STR_0506 : +STR_0507 : +STR_0508 : +STR_0509 : +STR_0510 : +STR_0511 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :平順鋼脯軌道有垂直站轉能力的雲霄飛車 +STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements +STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides +STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track +STR_0518 :Passengers travel in electric trains along a monorail track +STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners +STR_0520 :A dock platform where 遊客s can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them +STR_0523 :Riders travel slowly in powered vehicles along a track-based route +STR_0524 : +STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops +STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themes roller coaster trains career along steel roller coaster track made to look like old railway track +STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops +STR_0532 : +STR_0533 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids +STR_0537 : +STR_0538 : +STR_0539 : +STR_0540 : +STR_0541 : +STR_0542 : +STR_0543 : +STR_0544 : +STR_0545 : +STR_0546 : +STR_0547 : +STR_0548 : +STR_0549 : +STR_0550 : +STR_0551 : +STR_0552 : +STR_0553 : +STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station +STR_0555 :遊客s ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience +STR_0557 : +STR_0558 : +STR_0559 : +STR_0560 : +STR_0561 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects +STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills +STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' +STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity +STR_0566 :Individual roller coaster cars zip around a tight zig-zag layout of track with sharp corners and short sharp drops +STR_0567 :Sitting in seats suspended either side of the track, riders are pitched head-over-heels while they plunge down steep drops and travel through various inversions +STR_0568 : +STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air +STR_0570 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground +STR_0575 :Powered trains hanging from a single rail transport people around the park +STR_0576 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections +STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists +STR_0579 : +STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes +STR_0582 : +STR_0583 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions +STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops +STR_0589 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track +STR_0592 : +STR_0593 : +STR_0594 : +STR_0595 : +STR_0596 : +STR_0597 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track +STR_0599 :A compact roller coaster with individual cars and smooth twisting drops +STR_0600 :Powered mine trains career along a smooth and twisted track layout +STR_0601 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions +STR_0603 :遊客 {INT32} +STR_0604 :遊客 {INT32} +STR_0605 :遊客 {INT32} +STR_0606 :遊客 {INT32} +STR_0607 :遊客 {INT32} +STR_0608 :遊客 {INT32} +STR_0609 :遊客 {INT32} +STR_0610 :遊客 {INT32} +STR_0611 :遊客 {INT32} +STR_0612 :遊客 {INT32} +STR_0613 :遊客 {INT32} +STR_0614 :遊客 {INT32} +STR_0615 :遊客 {INT32} +STR_0616 :遊客 {INT32} +STR_0617 :遊客 {INT32} +STR_0618 :遊客 {INT32} +STR_0619 :遊客 {INT32} +STR_0620 :遊客 {INT32} +STR_0621 :遊客 {INT32} +STR_0622 :遊客 {INT32} +STR_0623 :遊客 {INT32} +STR_0624 :遊客 {INT32} +STR_0625 :遊客 {INT32} +STR_0626 :遊客 {INT32} +STR_0627 :遊客 {INT32} +STR_0628 :遊客 {INT32} +STR_0629 :遊客 {INT32} +STR_0630 :遊客 {INT32} +STR_0631 :遊客 {INT32} +STR_0632 :遊客 {INT32} +STR_0633 :遊客 {INT32} +STR_0634 :遊客 {INT32} +STR_0635 :遊客 {INT32} +STR_0636 :遊客 {INT32} +STR_0637 :遊客 {INT32} +STR_0638 :遊客 {INT32} +STR_0639 :遊客 {INT32} +STR_0640 :遊客 {INT32} +STR_0641 :遊客 {INT32} +STR_0642 :遊客 {INT32} +STR_0643 :遊客 {INT32} +STR_0644 :遊客 {INT32} +STR_0645 :遊客 {INT32} +STR_0646 :遊客 {INT32} +STR_0647 :遊客 {INT32} +STR_0648 :遊客 {INT32} +STR_0649 :遊客 {INT32} +STR_0650 :遊客 {INT32} +STR_0651 :遊客 {INT32} +STR_0652 :遊客 {INT32} +STR_0653 :遊客 {INT32} +STR_0654 :遊客 {INT32} +STR_0655 :遊客 {INT32} +STR_0656 :遊客 {INT32} +STR_0657 :遊客 {INT32} +STR_0658 :遊客 {INT32} +STR_0659 :遊客 {INT32} +STR_0660 :遊客 {INT32} +STR_0661 :遊客 {INT32} +STR_0662 :遊客 {INT32} +STR_0663 :遊客 {INT32} +STR_0664 :遊客 {INT32} +STR_0665 :遊客 {INT32} +STR_0666 :遊客 {INT32} +STR_0667 :遊客 {INT32} +STR_0668 :遊客 {INT32} +STR_0669 :遊客 {INT32} +STR_0670 :遊客 {INT32} +STR_0671 :遊客 {INT32} +STR_0672 :遊客 {INT32} +STR_0673 :遊客 {INT32} +STR_0674 :遊客 {INT32} +STR_0675 :遊客 {INT32} +STR_0676 :遊客 {INT32} +STR_0677 :遊客 {INT32} +STR_0678 :遊客 {INT32} +STR_0679 :遊客 {INT32} +STR_0680 :遊客 {INT32} +STR_0681 :遊客 {INT32} +STR_0682 :遊客 {INT32} +STR_0683 :遊客 {INT32} +STR_0684 :遊客 {INT32} +STR_0685 :遊客 {INT32} +STR_0686 :遊客 {INT32} +STR_0687 :遊客 {INT32} +STR_0688 :遊客 {INT32} +STR_0689 :遊客 {INT32} +STR_0690 :遊客 {INT32} +STR_0691 :遊客 {INT32} +STR_0692 :遊客 {INT32} +STR_0693 :遊客 {INT32} +STR_0694 :遊客 {INT32} +STR_0695 :遊客 {INT32} +STR_0696 :遊客 {INT32} +STR_0697 :遊客 {INT32} +STR_0698 :遊客 {INT32} +STR_0699 :遊客 {INT32} +STR_0700 :遊客 {INT32} +STR_0701 :遊客 {INT32} +STR_0702 :遊客 {INT32} +STR_0703 :遊客 {INT32} +STR_0704 :遊客 {INT32} +STR_0705 :遊客 {INT32} +STR_0706 :遊客 {INT32} +STR_0707 :遊客 {INT32} +STR_0708 :遊客 {INT32} +STR_0709 :遊客 {INT32} +STR_0710 :遊客 {INT32} +STR_0711 :遊客 {INT32} +STR_0712 :遊客 {INT32} +STR_0713 :遊客 {INT32} +STR_0714 :遊客 {INT32} +STR_0715 :遊客 {INT32} +STR_0716 :遊客 {INT32} +STR_0717 :遊客 {INT32} +STR_0718 :遊客 {INT32} +STR_0719 :遊客 {INT32} +STR_0720 :遊客 {INT32} +STR_0721 :遊客 {INT32} +STR_0722 :遊客 {INT32} +STR_0723 :遊客 {INT32} +STR_0724 :遊客 {INT32} +STR_0725 :遊客 {INT32} +STR_0726 :遊客 {INT32} +STR_0727 :遊客 {INT32} +STR_0728 :遊客 {INT32} +STR_0729 :遊客 {INT32} +STR_0730 :遊客 {INT32} +STR_0731 :遊客 {INT32} +STR_0732 :遊客 {INT32} +STR_0733 :遊客 {INT32} +STR_0734 :遊客 {INT32} +STR_0735 :遊客 {INT32} +STR_0736 :遊客 {INT32} +STR_0737 :遊客 {INT32} +STR_0738 :遊客 {INT32} +STR_0739 :遊客 {INT32} +STR_0740 :遊客 {INT32} +STR_0741 :遊客 {INT32} +STR_0742 :遊客 {INT32} +STR_0743 :遊客 {INT32} +STR_0744 :遊客 {INT32} +STR_0745 :遊客 {INT32} +STR_0746 :遊客 {INT32} +STR_0747 :遊客 {INT32} +STR_0748 :遊客 {INT32} +STR_0749 :遊客 {INT32} +STR_0750 :遊客 {INT32} +STR_0751 :遊客 {INT32} +STR_0752 :遊客 {INT32} +STR_0753 :遊客 {INT32} +STR_0754 :遊客 {INT32} +STR_0755 :遊客 {INT32} +STR_0756 :遊客 {INT32} +STR_0757 :遊客 {INT32} +STR_0758 :遊客 {INT32} +STR_0759 :遊客 {INT32} +STR_0760 :遊客 {INT32} +STR_0761 :遊客 {INT32} +STR_0762 :遊客 {INT32} +STR_0763 :遊客 {INT32} +STR_0764 :遊客 {INT32} +STR_0765 :遊客 {INT32} +STR_0766 :遊客 {INT32} +STR_0767 :遊客 {INT32} +STR_0768 :清潔人員 {INT32} +STR_0769 :技術人員 {INT32} +STR_0770 :安全人員 {INT32} +STR_0771 :表演人員 {INT32} +STR_0772 :Unnamed park{POP16}{POP16} +STR_0773 :Unnamed park{POP16}{POP16} +STR_0774 :Unnamed park{POP16}{POP16} +STR_0775 :Unnamed park{POP16}{POP16} +STR_0776 :Unnamed park{POP16}{POP16} +STR_0777 :Unnamed park{POP16}{POP16} +STR_0778 :Sign +STR_0779 :1st +STR_0780 :2nd +STR_0781 :3rd +STR_0782 :4th +STR_0783 :5th +STR_0784 :6th +STR_0785 :7th +STR_0786 :8th +STR_0787 :9th +STR_0788 :10th +STR_0789 :11th +STR_0790 :12th +STR_0791 :13th +STR_0792 :14th +STR_0793 :15th +STR_0794 :16th +STR_0795 :17th +STR_0796 :18th +STR_0797 :19th +STR_0798 :20th +STR_0799 :21st +STR_0800 :22nd +STR_0801 :23rd +STR_0802 :24th +STR_0803 :25th +STR_0804 :26th +STR_0805 :27th +STR_0806 :28th +STR_0807 :29th +STR_0808 :30th +STR_0809 :31st +STR_0810 :Jan +STR_0811 :Feb +STR_0812 :Mar +STR_0813 :Apr +STR_0814 :May +STR_0815 :Jun +STR_0816 :Jul +STR_0817 :Aug +STR_0818 :Sep +STR_0819 :Oct +STR_0820 :Nov +STR_0821 :Dec +STR_0822 :Unable to access graphic data file +STR_0823 :Missing or inaccessible data file +STR_0824 :{BLACK}{CROSS} +STR_0825 :Chosen name in use already +STR_0826 :Too many names defined +STR_0827 :Not enough cash - requires {CURRENCY2DP} +STR_0828 :{SMALLFONT}{BLACK}Close window +STR_0829 :{SMALLFONT}{BLACK}Window title - Drag this to move window +STR_0830 :{SMALLFONT}{BLACK}Zoom view in +STR_0831 :{SMALLFONT}{BLACK}Zoom view out +STR_0832 :{SMALLFONT}{BLACK}Rotate view 90{DEGREE} clockwise +STR_0833 :{SMALLFONT}{BLACK}Pause game +STR_0834 :{SMALLFONT}{BLACK}Disk and game options +STR_0835 :Game initialization failed +STR_0836 :Unable to start game in a minimised state +STR_0837 :Unable to initialise graphics system +STR_0838 :CD key code {INT32} is not valid for your RollerCoaster Tycoon 2 CD !{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Please un-install RollerCoaster Tycoon 2% and re-install with the correct CD Key Code +STR_0839 :{UINT16} x {UINT16} +STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} +STR_0841 :Desktop window +STR_0842 :640x480 full screen +STR_0843 :800x600 full screen +STR_0844 :1024x768 full screen +STR_0845 :1152x864 full screen +STR_0846 :1280x1024 full screen +STR_0847 :About 'RollerCoaster Tycoon 2' +STR_0848 :RollerCoaster Tycoon 2 +STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028 +STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, all rights reserved +STR_0851 :{WINDOW_COLOUR_2}Designed and programmed by Chris Sawyer +STR_0852 :{WINDOW_COLOUR_2}Graphics by Simon Foster +STR_0853 :{WINDOW_COLOUR_2}Sound and music by Allister Brimble +STR_0854 :{WINDOW_COLOUR_2}Additional sounds recorded by David Ellis +STR_0855 :{WINDOW_COLOUR_2}Representation by Jacqui Lyons at Marjacq Ltd. +STR_0856 :{WINDOW_COLOUR_2}Thanks to: +STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth, and John Wardley +STR_0858 :{WINDOW_COLOUR_2} +STR_0859 :{WINDOW_COLOUR_2} +STR_0860 :{WINDOW_COLOUR_2} +STR_0861 : +STR_0862 : +STR_0863 : +STR_0864 : +STR_0865 :{STRINGID} +STR_0866 :{POP16}{STRINGID} +STR_0867 :{POP16}{POP16}{STRINGID} +STR_0868 :{POP16}{POP16}{POP16}{STRINGID} +STR_0869 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0870 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0872 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0873 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0874 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0875 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0876 :{BLACK}{DOWN} +STR_0877 :Too low ! +STR_0878 :Too high ! +STR_0879 :Can't lower land here... +STR_0880 :Can't raise land here... +STR_0881 :Object in the way +STR_0882 :Load Game +STR_0883 :Save Game +STR_0884 :Load Landscape +STR_0885 :Save Landscape +STR_0886 :Quit Game +STR_0887 :Quit Scenario Editor +STR_0888 :Quit Roller Coaster Designer +STR_0889 :Quit Track Designs Manager +STR_0890 :SCR{COMMA16}.BMP +STR_0891 :Screenshot +STR_0892 :Screenshot saved to disk as '{STRINGID}' +STR_0893 :Screenshot failed ! +STR_0894 :Landscape data area full ! +STR_0895 :Can't build partly above and partly below ground +STR_0896 :{POP16}{POP16}{STRINGID} Construction +STR_0897 :Direction +STR_0898 :{SMALLFONT}{BLACK}Left-hand curve +STR_0899 :{SMALLFONT}{BLACK}Right-hand curve +STR_0900 :{SMALLFONT}{BLACK}Left-hand curve (small radius) +STR_0901 :{SMALLFONT}{BLACK}Right-hand curve (small radius) +STR_0902 :{SMALLFONT}{BLACK}Left-hand curve (very small radius) +STR_0903 :{SMALLFONT}{BLACK}Right-hand curve (very small radius) +STR_0904 :{SMALLFONT}{BLACK}Left-hand curve (large radius) +STR_0905 :{SMALLFONT}{BLACK}Right-hand curve (large radius) +STR_0906 :{SMALLFONT}{BLACK}Straight +STR_0907 :Slope +STR_0908 :Roll/Banking +STR_0909 :Seat Rot. +STR_0910 :{SMALLFONT}{BLACK}Roll for left-hand curve +STR_0911 :{SMALLFONT}{BLACK}Roll for right-hand curve +STR_0912 :{SMALLFONT}{BLACK}No roll +STR_0913 :{SMALLFONT}{BLACK}Move to previous section +STR_0914 :{SMALLFONT}{BLACK}Move to next section +STR_0915 :{SMALLFONT}{BLACK}Construct the selected section +STR_0916 :{SMALLFONT}{BLACK}Remove the highlighted section +STR_0917 :{SMALLFONT}{BLACK}Vertical drop +STR_0918 :{SMALLFONT}{BLACK}Steep slope down +STR_0919 :{SMALLFONT}{BLACK}Slope down +STR_0920 :{SMALLFONT}{BLACK}Level +STR_0921 :{SMALLFONT}{BLACK}Slope up +STR_0922 :{SMALLFONT}{BLACK}Steep slope up +STR_0923 :{SMALLFONT}{BLACK}Vertical rise +STR_0924 :{SMALLFONT}{BLACK}Helix down +STR_0925 :{SMALLFONT}{BLACK}Helix up +STR_0926 :Can't remove this... +STR_0927 :Can't construct this here... +STR_0928 :{SMALLFONT}{BLACK}Chain lift, to pull cars up slopes +STR_0929 :'S' Bend (left) +STR_0930 :'S' Bend (right) +STR_0931 :Vertical Loop (left) +STR_0932 :Vertical Loop (right) +STR_0933 :Raise or lower land first +STR_0934 :Ride entrance in the way +STR_0935 :Ride exit in the way +STR_0936 :Park entrance in the way +STR_0937 :{SMALLFONT}{BLACK}View options +STR_0938 :{SMALLFONT}{BLACK}Adjust land height and slope +STR_0939 :Underground/Inside View +STR_0940 :Remove Base Land +STR_0941 :Remove Vertical Faces +STR_0942 :See-Through Rides +STR_0943 :See-Through Scenery +STR_0944 :Save +STR_0945 :Don't Save +STR_0946 :Cancel +STR_0947 :Save this before loading ? +STR_0948 :Save this before quitting ? +STR_0949 :Save this before quitting ? +STR_0950 :Load Game +STR_0951 :Quit Game +STR_0952 :Quit Game +STR_0953 :Load Landscape +STR_0954 : +STR_0955 :{SMALLFONT}{BLACK}Select seat rotation angle for this track section +STR_0956 :-180{DEGREE} +STR_0957 :-135{DEGREE} +STR_0958 :-90{DEGREE} +STR_0959 :-45{DEGREE} +STR_0960 :0{DEGREE} +STR_0961 :+45{DEGREE} +STR_0962 :+90{DEGREE} +STR_0963 :+135{DEGREE} +STR_0964 :+180{DEGREE} +STR_0965 :+225{DEGREE} +STR_0966 :+270{DEGREE} +STR_0967 :+315{DEGREE} +STR_0968 :+360{DEGREE} +STR_0969 :+405{DEGREE} +STR_0970 :+450{DEGREE} +STR_0971 :+495{DEGREE} +STR_0972 :Cancel +STR_0973 :OK +STR_0974 :Rides +STR_0975 :Shops and Stalls +STR_0976 :Toilets and Information Kiosks +STR_0977 :New Transport Rides +STR_0978 :New Gentle Rides +STR_0979 :New Roller Coasters +STR_0980 :New Thrill Rides +STR_0981 :New Water Rides +STR_0982 :New Shops & Stalls +STR_0983 :Research & Development +STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} +STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP} +STR_0986 :{BLACK}{CURRENCY2DP} +STR_0987 :Too many rides/attractions +STR_0988 :Can't create new ride/attraction... +STR_0989 :{STRINGID} +STR_0990 :{SMALLFONT}{BLACK}Construction +STR_0991 :Station platform +STR_0992 :{SMALLFONT}{BLACK}Demolish entire ride/attraction +STR_0993 :Demolish ride/attraction +STR_0994 :Demolish +STR_0995 :{WINDOW_COLOUR_1}Are you sure you want to completely demolish {STRINGID}? +STR_0996 :Overall view +STR_0997 :{SMALLFONT}{BLACK}View selection +STR_0998 :No more stations allowed on this ride +STR_0999 :Requires a station platform +STR_1000 :Track is not a complete circuit +STR_1001 :Track unsuitable for type of train +STR_1002 :Can't open {POP16}{POP16}{POP16}{STRINGID}... +STR_1003 :Can't test {POP16}{POP16}{POP16}{STRINGID}... +STR_1004 :Can't close {POP16}{POP16}{POP16}{STRINGID}... +STR_1005 :Can't start construction on {POP16}{POP16}{POP16}{STRINGID}... +STR_1006 :Must be closed first +STR_1007 :Unable to create enough vehicles +STR_1008 :{SMALLFONT}{BLACK}Open, close, or test ride/attraction +STR_1009 :{SMALLFONT}{BLACK}Open or close all rides/attractions +STR_1010 :{SMALLFONT}{BLACK}Open or close park +STR_1011 :Close all +STR_1012 :Open all +STR_1013 :Close park +STR_1014 :Open park +STR_1015 :Unable to operate with more than one station platform in this mode +STR_1016 :Unable to operate with less than two stations in this mode +STR_1017 :Can't change operating mode... +STR_1018 :Can't make changes... +STR_1019 :Can't make changes... +STR_1020 :Can't make changes... +STR_1021 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_1022 :{POP16}{POP16}{POP16}{COMMA16} car per train +STR_1023 :{POP16}{POP16}{POP16}{COMMA16} cars per train +STR_1024 :{COMMA16} car per train +STR_1025 :{COMMA16} cars per train +STR_1026 :Station platform too long! +STR_1027 :{SMALLFONT}{BLACK}Locate this on Main View +STR_1028 :Off edge of map! +STR_1029 :Cannot build partly above and partly below water! +STR_1030 :Can only build this underwater! +STR_1031 :Can't build this underwater! +STR_1032 :Can only build this on water! +STR_1033 :Can only build this above ground! +STR_1034 :Can only build this on land! +STR_1035 :Local authority won't allow construction above tree-height! +STR_1036 :Load Game +STR_1037 :Load Landscape +STR_1038 :Convert saved game to scenario +STR_1039 :Install new track design +STR_1040 :Save Game +STR_1041 :Save Scenario +STR_1042 :Save Landscape +STR_1043 :RollerCoaster Tycoon 2 Saved Game +STR_1044 :RollerCoaster Tycoon 2 Scenario File +STR_1045 :RollerCoaster Tycoon 2 Landscape File +STR_1046 :RollerCoaster Tycoon 2 Track Design File +STR_1047 :Game save failed! +STR_1048 :Scenario save failed! +STR_1049 :Landscape save failed! +STR_1050 :Failed to load...{NEWLINE}File contains invalid data! +STR_1051 :Invisible Supports +STR_1052 :Invisible People +STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park +STR_1054 :{SMALLFONT}{BLACK}Name ride/attraction +STR_1055 :{SMALLFONT}{BLACK}Name person +STR_1056 :{SMALLFONT}{BLACK}Name staff member +STR_1057 :Ride/attraction name +STR_1058 :Enter new name for this ride/attraction: +STR_1059 :Can't rename ride/attraction... +STR_1060 :Invalid ride/attraction name +STR_1061 :Normal mode +STR_1062 :Continuous circuit mode +STR_1063 :Reverse-Incline launched shuttle mode +STR_1064 :Powered launch (passing station) +STR_1065 :Shuttle mode +STR_1066 :Boat hire mode +STR_1067 :Upward launch +STR_1068 :Rotating lift mode +STR_1069 :Station to station mode +STR_1070 :Single ride per admission +STR_1071 :Unlimited rides per admission +STR_1072 :Maze mode +STR_1073 :Race mode +STR_1074 :Bumper-car mode +STR_1075 :Swing mode +STR_1076 :Shop stall mode +STR_1077 :Rotation mode +STR_1078 :Forward rotation +STR_1079 :Backward rotation +STR_1080 :Film: {ENDQUOTES}Avenging aviators{ENDQUOTES} +STR_1081 :3D film: {ENDQUOTES}Mouse tails{ENDQUOTES} +STR_1082 :Space rings mode +STR_1083 :Beginners mode +STR_1084 :LIM-powered launch +STR_1085 :Film: {ENDQUOTES}Thrill riders{ENDQUOTES} +STR_1086 :3D film: {ENDQUOTES}Storm chasers{ENDQUOTES} +STR_1087 :3D film: {ENDQUOTES}Space raiders{ENDQUOTES} +STR_1088 :Intense mode +STR_1089 :Berserk mode +STR_1090 :Haunted house mode +STR_1091 :Circus show mode +STR_1092 :Downward launch +STR_1093 :Crooked house mode +STR_1094 :Freefall drop mode +STR_1095 :Continuous circuit block sectioned mode +STR_1096 :Powered launch (without passing station) +STR_1097 :Powered launch block sectioned mode +STR_1098 :Moving to end of {POP16}{STRINGID} +STR_1099 :Waiting for passengers at {POP16}{STRINGID} +STR_1100 :Waiting to depart {POP16}{STRINGID} +STR_1101 :Departing {POP16}{STRINGID} +STR_1102 :Travelling at {VELOCITY} +STR_1103 :Arriving at {POP16}{STRINGID} +STR_1104 :Unloading passengers at {POP16}{STRINGID} +STR_1105 :Travelling at {VELOCITY} +STR_1106 :Crashing! +STR_1107 :Crashed! +STR_1108 :Travelling at {VELOCITY} +STR_1109 :Swinging +STR_1110 :Rotating +STR_1111 :Rotating +STR_1112 :Operating +STR_1113 :Showing film +STR_1114 :Rotating +STR_1115 :Operating +STR_1116 :Operating +STR_1117 :Doing circus show +STR_1118 :Operating +STR_1119 :Waiting for cable lift +STR_1120 :Travelling at {VELOCITY} +STR_1121 :Stopping +STR_1122 :Waiting for passengers +STR_1123 :Waiting to start +STR_1124 :Starting +STR_1125 :Operating +STR_1126 :Stopping +STR_1127 :Unloading passengers +STR_1128 :Stopped by block brakes +STR_1129 :All vehicles in same colours +STR_1130 :Different colours per {STRINGID} +STR_1131 :Different colours per vehicle +STR_1132 :Vehicle {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1133 :Vehicle {POP16}{COMMA16} +STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} +STR_1135 :{STRINGID} {COMMA16} +STR_1136 :{SMALLFONT}{BLACK}Select main colour +STR_1137 :{SMALLFONT}{BLACK}Select additional colour 1 +STR_1138 :{SMALLFONT}{BLACK}Select additional colour 2 +STR_1139 :{SMALLFONT}{BLACK}Select support structure colour +STR_1140 :{SMALLFONT}{BLACK}Select vehicle colour scheme option +STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify +STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} +STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} +STR_1144 :Can't build/move entrance for this ride/attraction... +STR_1145 :Can't build/move exit for this ride/attraction... +STR_1146 :Entrance not yet built +STR_1147 :Exit not yet built +STR_1148 :Quarter load +STR_1149 :Half load +STR_1150 :Three-quarter load +STR_1151 :Full load +STR_1152 :Any load +STR_1153 :Height Marks on Ride Tracks +STR_1154 :Height Marks on Land +STR_1155 :Height Marks on Paths +STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} +STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} +STR_1158 :Can't remove this... +STR_1159 :{SMALLFONT}{BLACK}Place scenery, gardens, and other accessories +STR_1160 :{SMALLFONT}{BLACK}Create/adjust lakes & water +STR_1161 :Can't position this here... +STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} +STR_1163 :{STRINGID}{NEWLINE}(Right-Click to Modify) +STR_1164 :{STRINGID}{NEWLINE}(Right-Click to Remove) +STR_1165 :{STRINGID} - {STRINGID} {COMMA16} +STR_1166 :Can't lower water level here... +STR_1167 :Can't raise water level here... +STR_1168 :Options +STR_1169 :(None) +STR_1170 :{STRING} +STR_1171 :{RED}Closed - - +STR_1172 :{YELLOW}{STRINGID} - - +STR_1173 :{SMALLFONT}{BLACK}Build footpaths and queue lines +STR_1174 :Banner sign in the way +STR_1175 :Can't build this on sloped footpath +STR_1176 :Can't build footpath here... +STR_1177 :Can't remove footpath from here... +STR_1178 :Land slope unsuitable +STR_1179 :Footpath in the way +STR_1180 :Can't build this underwater! +STR_1181 :Footpaths +STR_1182 :Type +STR_1183 :Direction +STR_1184 :Slope +STR_1185 :{SMALLFONT}{BLACK}Direction +STR_1186 :{SMALLFONT}{BLACK}Slope down +STR_1187 :{SMALLFONT}{BLACK}Level +STR_1188 :{SMALLFONT}{BLACK}Slope up +STR_1189 :{SMALLFONT}{BLACK}Construct the selected footpath section +STR_1190 :{SMALLFONT}{BLACK}Remove previous footpath section +STR_1191 :{BLACK}{STRINGID} +STR_1192 :{OUTLINE}{RED}{STRINGID} +STR_1193 :{WINDOW_COLOUR_2}{STRINGID} +STR_1194 :Closed +STR_1195 :Test Run +STR_1196 :Open +STR_1197 :Broken Down +STR_1198 :Crashed! +STR_1199 :{COMMA16} person on ride +STR_1200 :{COMMA16} people on ride +STR_1201 :Nobody in queue line +STR_1202 :1 person in queue line +STR_1203 :{COMMA16} people in queue line +STR_1204 :{COMMA16} minute queue time +STR_1205 :{COMMA16} minutes queue time +STR_1206 :{WINDOW_COLOUR_2}Wait for: +STR_1207 :{WINDOW_COLOUR_2}Leave if another train arrives at station +STR_1208 :{WINDOW_COLOUR_2}Leave if another boat arrives at station +STR_1209 :{SMALLFONT}{BLACK}Select whether should wait for passengers before departing +STR_1210 :{SMALLFONT}{BLACK}Select whether should leave if another vehicle arrives at the same station +STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time: +STR_1212 :{WINDOW_COLOUR_2}Maximum waiting time: +STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing +STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing +STR_1215 :{WINDOW_COLOUR_2}Synchronise with adjacent stations +STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronise departure with all adjacent stations (for 'racing') +STR_1217 :{COMMA16} seconds +STR_1218 :{BLACK}{SMALLUP} +STR_1219 :{BLACK}{SMALLDOWN} +STR_1220 :Exit only +STR_1221 :No entrance +STR_1222 :No exit +STR_1223 :{SMALLFONT}{BLACK}Transport rides +STR_1224 :{SMALLFONT}{BLACK}Gentle rides +STR_1225 :{SMALLFONT}{BLACK}Roller coasters +STR_1226 :{SMALLFONT}{BLACK}Thrill rides +STR_1227 :{SMALLFONT}{BLACK}Water rides +STR_1228 :{SMALLFONT}{BLACK}Shops & stalls +STR_1229 :train +STR_1230 :trains +STR_1231 :Train +STR_1232 :Trains +STR_1233 :{COMMA16} train +STR_1234 :{COMMA16} trains +STR_1235 :Train {COMMA16} +STR_1236 :boat +STR_1237 :boats +STR_1238 :Boat +STR_1239 :Boats +STR_1240 :{COMMA16} boat +STR_1241 :{COMMA16} boats +STR_1242 :Boat {COMMA16} +STR_1243 :track +STR_1244 :tracks +STR_1245 :Track +STR_1246 :Tracks +STR_1247 :{COMMA16} track +STR_1248 :{COMMA16} tracks +STR_1249 :Track {COMMA16} +STR_1250 :docking platform +STR_1251 :docking platforms +STR_1252 :Docking platform +STR_1253 :Docking platforms +STR_1254 :{COMMA16} docking platform +STR_1255 :{COMMA16} docking platforms +STR_1256 :Docking platform {COMMA16} +STR_1257 :station +STR_1258 :stations +STR_1259 :Station +STR_1260 :Stations +STR_1261 :{COMMA16} station +STR_1262 :{COMMA16} stations +STR_1263 :Station {COMMA16} +STR_1264 :car +STR_1265 :cars +STR_1266 :Car +STR_1267 :Cars +STR_1268 :{COMMA16} car +STR_1269 :{COMMA16} cars +STR_1270 :Car {COMMA16} +STR_1271 :building +STR_1272 :buildings +STR_1273 :Building +STR_1274 :Buildings +STR_1275 :{COMMA16} building +STR_1276 :{COMMA16} buildings +STR_1277 :Building {COMMA16} +STR_1278 :structure +STR_1279 :structures +STR_1280 :Structure +STR_1281 :Structures +STR_1282 :{COMMA16} structure +STR_1283 :{COMMA16} structures +STR_1284 :Structure {COMMA16} +STR_1285 :ship +STR_1286 :ships +STR_1287 :Ship +STR_1288 :Ships +STR_1289 :{COMMA16} ship +STR_1290 :{COMMA16} ships +STR_1291 :Ship {COMMA16} +STR_1292 :cabin +STR_1293 :cabins +STR_1294 :Cabin +STR_1295 :Cabins +STR_1296 :{COMMA16} cabin +STR_1297 :{COMMA16} cabins +STR_1298 :Cabin {COMMA16} +STR_1299 :wheel +STR_1300 :wheels +STR_1301 :Wheel +STR_1302 :Wheels +STR_1303 :{COMMA16} wheel +STR_1304 :{COMMA16} wheels +STR_1305 :Wheel {COMMA16} +STR_1306 :ring +STR_1307 :rings +STR_1308 :Ring +STR_1309 :Rings +STR_1310 :{COMMA16} ring +STR_1311 :{COMMA16} rings +STR_1312 :Ring {COMMA16} +STR_1313 :player +STR_1314 :players +STR_1315 :Player +STR_1316 :Players +STR_1317 :{COMMA16} player +STR_1318 :{COMMA16} players +STR_1319 :Player {COMMA16} +STR_1320 :course +STR_1321 :courses +STR_1322 :Course +STR_1323 :Courses +STR_1324 :{COMMA16} course +STR_1325 :{COMMA16} courses +STR_1326 :Course {COMMA16} +STR_1327 :{SMALLFONT}{BLACK}Rotate objects by 90{DEGREE} +STR_1328 :Level land required +STR_1329 :{WINDOW_COLOUR_2}Launch speed: +STR_1330 :{SMALLFONT}{BLACK}Maximum speed when leaving station +STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_1332 :{VELOCITY} +STR_1333 :{STRINGID} - {STRINGID}{POP16} +STR_1334 :{STRINGID} - {STRINGID} {COMMA16} +STR_1335 :{STRINGID} - Entrance{POP16}{POP16} +STR_1336 :{STRINGID} - Station {POP16}{COMMA16} Entrance +STR_1337 :{STRINGID} - Exit{POP16}{POP16} +STR_1338 :{STRINGID} - Station {POP16}{COMMA16} Exit +STR_1339 :{BLACK}No test results yet... +STR_1340 :{WINDOW_COLOUR_2}Max. speed: {BLACK}{VELOCITY} +STR_1341 :{WINDOW_COLOUR_2}Ride time: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1342 :{DURATION} +STR_1343 :{DURATION} / +STR_1344 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1345 :{LENGTH} +STR_1346 :{LENGTH} / +STR_1347 :{WINDOW_COLOUR_2}Average speed: {BLACK}{VELOCITY} +STR_1348 :{WINDOW_COLOUR_2}Max. positive vertical G's: {BLACK}{COMMA2DP32}g +STR_1349 :{WINDOW_COLOUR_2}Max. positive vertical G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1350 :{WINDOW_COLOUR_2}Max. negative vertical G's: {BLACK}{COMMA2DP32}g +STR_1351 :{WINDOW_COLOUR_2}Max. negative vertical G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1352 :{WINDOW_COLOUR_2}Max. lateral G's: {BLACK}{COMMA2DP32}g +STR_1353 :{WINDOW_COLOUR_2}Max. lateral G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1354 :{WINDOW_COLOUR_2}Highest drop height: {BLACK}{LENGTH} +STR_1355 :{WINDOW_COLOUR_2}Drops: {BLACK}{COMMA16} +STR_1356 :{WINDOW_COLOUR_2}Inversions: {BLACK}{COMMA16} +STR_1357 :{WINDOW_COLOUR_2}Holes: {BLACK}{COMMA16} +STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs +STR_1359 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minute +STR_1360 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minutes +STR_1361 :Can't change speed... +STR_1362 :Can't change launch speed... +STR_1363 :Too high for supports! +STR_1364 :Supports for track above can't be extended any further! +STR_1365 :In-line Twist (left) +STR_1366 :In-line Twist (right) +STR_1367 :Half Loop +STR_1368 :Half Corkscrew (left) +STR_1369 :Half Corkscrew (right) +STR_1370 :Barrel Roll (left) +STR_1371 :Barrel Roll (right) +STR_1372 :Launched Lift Hill +STR_1373 :Large Half Loop (left) +STR_1374 :Large Half Loop (right) +STR_1375 :Upper Transfer +STR_1376 :Lower Transfer +STR_1377 :Heartline Roll (left) +STR_1378 :Heartline Roll (right) +STR_1379 :Reverser (left) +STR_1380 :Reverser (right) +STR_1381 :Curved Lift Hill (left) +STR_1382 :Curved Lift Hill (right) +STR_1383 :Quarter Loop +STR_1384 :{YELLOW}{STRINGID} +STR_1385 :{SMALLFONT}{BLACK}Other track configurations +STR_1386 :Special... +STR_1387 :Can't change land type... +STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} +STR_1389 :{OUTLINE}{RED}- {CURRENCY} +STR_1390 :{CURRENCY2DP} +STR_1391 :{RED}{CURRENCY2DP} +STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction +STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options +STR_1394 :{SMALLFONT}{BLACK}Operating options +STR_1395 :{SMALLFONT}{BLACK}Maintenance options +STR_1396 :{SMALLFONT}{BLACK}Colour scheme options +STR_1397 :{SMALLFONT}{BLACK}Sound & music options +STR_1398 :{SMALLFONT}{BLACK}Measurements and test data +STR_1399 :{SMALLFONT}{BLACK}Graphs +STR_1400 :Entrance +STR_1401 :Exit +STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction +STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction +STR_1404 :{SMALLFONT}{BLACK}Rotate 90{DEGREE} +STR_1405 :{SMALLFONT}{BLACK}Mirror image +STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) +STR_1407 :{WINDOW_COLOUR_2}Build this... +STR_1408 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} +STR_1409 :Entry/Exit Platform +STR_1410 :Vertical Tower +STR_1411 :{STRINGID} in the way +STR_1412 :{WINDOW_COLOUR_3}Data logging not available for this type of ride +STR_1413 :{WINDOW_COLOUR_3}Data logging will start when next {STRINGID} leaves {STRINGID} +STR_1414 :{SMALLFONT}{BLACK}{DURATION} +STR_1415 :{WINDOW_COLOUR_2}Velocity +STR_1416 :{WINDOW_COLOUR_2}Altitude +STR_1417 :{WINDOW_COLOUR_2}Vert.G's +STR_1418 :{WINDOW_COLOUR_2}Lat.G's +STR_1419 :{SMALLFONT}{BLACK}{VELOCITY} +STR_1420 :{SMALLFONT}{BLACK}{LENGTH} +STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g +STR_1422 :{SMALLFONT}{BLACK}Logging data from {POP16}{STRINGID} +STR_1423 :{SMALLFONT}{BLACK}Queue line path +STR_1424 :{SMALLFONT}{BLACK}Footpath +STR_1425 :Footpath +STR_1426 :Queue Line +STR_1427 :{WINDOW_COLOUR_2}Customers: {BLACK}{COMMA32} per hour +STR_1428 :{WINDOW_COLOUR_2}Admission price: +STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1430 :Free +STR_1431 :Walking +STR_1432 :Heading for {STRINGID} +STR_1433 :Queuing for {STRINGID} +STR_1434 :Drowning +STR_1435 :On {STRINGID} +STR_1436 :In {STRINGID} +STR_1437 :At {STRINGID} +STR_1438 :Sitting +STR_1439 :(select location) +STR_1440 :Mowing grass +STR_1441 :Sweeping footpath +STR_1442 :Emptying litter bin +STR_1443 :Watering gardens +STR_1444 :Watching {STRINGID} +STR_1445 :Watching construction of {STRINGID} +STR_1446 :Looking at scenery +STR_1447 :Leaving the park +STR_1448 :Watching new ride being constructed +STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) +STR_1452 :遊客's name +STR_1453 :Enter name for this 遊客: +STR_1454 :Can't name 遊客... +STR_1455 :Invalid name for 遊客 +STR_1456 :{WINDOW_COLOUR_2}Cash spent: {BLACK}{CURRENCY2DP} +STR_1457 :{WINDOW_COLOUR_2}Cash in pocket: {BLACK}{CURRENCY2DP} +STR_1458 :{WINDOW_COLOUR_2}Time in park: {BLACK}{REALTIME} +STR_1459 :Track style +STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track +STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track +STR_1462 :Too steep for lift hill +STR_1463 :遊客s +STR_1464 :Helix up (small) +STR_1465 :Helix up (large) +STR_1466 :Helix down (small) +STR_1467 :Helix down (large) +STR_1468 :Staff +STR_1469 :Ride must start and end with stations +STR_1470 :Station not long enough +STR_1471 :{WINDOW_COLOUR_2}Speed: +STR_1472 :{SMALLFONT}{BLACK}Speed of this ride +STR_1473 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1474 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}Not yet available +STR_1475 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1476 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}Not yet available +STR_1477 :{WINDOW_COLOUR_2}Intensity rating: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) +STR_1478 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1479 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}Not yet available +STR_1480 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} +STR_1481 :{SMALLFONT}{OPENQUOTES}I've spent all my money{ENDQUOTES} +STR_1482 :{SMALLFONT}{OPENQUOTES}I feel sick{ENDQUOTES} +STR_1483 :{SMALLFONT}{OPENQUOTES}I feel very sick{ENDQUOTES} +STR_1484 :{SMALLFONT}{OPENQUOTES}I want to go on something more thrilling than {STRINGID}{ENDQUOTES} +STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} looks too intense for me{ENDQUOTES} +STR_1486 :{SMALLFONT}{OPENQUOTES}I haven't finished my {STRINGID} yet{ENDQUOTES} +STR_1487 :{SMALLFONT}{OPENQUOTES}Just looking at {STRINGID} makes me feel sick{ENDQUOTES} +STR_1488 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to go on {STRINGID}{ENDQUOTES} +STR_1489 :{SMALLFONT}{OPENQUOTES}I want to go home{ENDQUOTES} +STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} is really good value{ENDQUOTES} +STR_1491 :{SMALLFONT}{OPENQUOTES}I've already got {STRINGID}{ENDQUOTES} +STR_1492 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} +STR_1493 :{SMALLFONT}{OPENQUOTES}I'm not hungry{ENDQUOTES} +STR_1494 :{SMALLFONT}{OPENQUOTES}I'm not thirsty{ENDQUOTES} +STR_1495 :{SMALLFONT}{OPENQUOTES}Help! I'm drowning!{ENDQUOTES} +STR_1496 :{SMALLFONT}{OPENQUOTES}I'm lost!{ENDQUOTES} +STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} was great{ENDQUOTES} +STR_1498 :{SMALLFONT}{OPENQUOTES}I've been queuing for {STRINGID} for ages{ENDQUOTES} +STR_1499 :{SMALLFONT}{OPENQUOTES}I'm tired{ENDQUOTES} +STR_1500 :{SMALLFONT}{OPENQUOTES}I'm hungry{ENDQUOTES} +STR_1501 :{SMALLFONT}{OPENQUOTES}I'm thirsty{ENDQUOTES} +STR_1502 :{SMALLFONT}{OPENQUOTES}I need to go to the bathroom{ENDQUOTES} +STR_1503 :{SMALLFONT}{OPENQUOTES}I can't find {STRINGID}{ENDQUOTES} +STR_1504 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to use {STRINGID}{ENDQUOTES} +STR_1505 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} while it's raining{ENDQUOTES} +STR_1506 :{SMALLFONT}{OPENQUOTES}The litter here is really bad{ENDQUOTES} +STR_1507 :{SMALLFONT}{OPENQUOTES}I can't find the park exit{ENDQUOTES} +STR_1508 :{SMALLFONT}{OPENQUOTES}I want to get off {STRINGID}{ENDQUOTES} +STR_1509 :{SMALLFONT}{OPENQUOTES}I want to get out of {STRINGID}{ENDQUOTES} +STR_1510 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} - It isn't safe{ENDQUOTES} +STR_1511 :{SMALLFONT}{OPENQUOTES}This path is disgusting{ENDQUOTES} +STR_1512 :{SMALLFONT}{OPENQUOTES}It's too crowded here{ENDQUOTES} +STR_1513 :{SMALLFONT}{OPENQUOTES}The vandalism here is really bad{ENDQUOTES} +STR_1514 :{SMALLFONT}{OPENQUOTES}Great scenery!{ENDQUOTES} +STR_1515 :{SMALLFONT}{OPENQUOTES}This park is really clean and tidy{ENDQUOTES} +STR_1516 :{SMALLFONT}{OPENQUOTES}The jumping fountains are great{ENDQUOTES} +STR_1517 :{SMALLFONT}{OPENQUOTES}The music is nice here{ENDQUOTES} +STR_1518 :{SMALLFONT}{OPENQUOTES}This balloon from {STRINGID} is really good value{ENDQUOTES} +STR_1519 :{SMALLFONT}{OPENQUOTES}This cuddly toy from {STRINGID} is really good value{ENDQUOTES} +STR_1520 :{SMALLFONT}{OPENQUOTES}This park map from {STRINGID} is really good value{ENDQUOTES} +STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} +STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} +STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} +STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} +STR_1528 : +STR_1529 : +STR_1530 : +STR_1531 :{SMALLFONT}{OPENQUOTES}This pizza from {STRINGID} is really good value{ENDQUOTES} +STR_1532 : +STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good value{ENDQUOTES} +STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} +STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} +STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}This toffee apple from {STRINGID} is really good value{ENDQUOTES} +STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}This doughnut from {STRINGID} is really good value{ENDQUOTES} +STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} +STR_1541 : +STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} +STR_1543 :{SMALLFONT}{OPENQUOTES}This lemonade from {STRINGID} is really good value{ENDQUOTES} +STR_1544 : +STR_1545 : +STR_1546 : +STR_1547 : +STR_1548 : +STR_1549 : +STR_1550 :{SMALLFONT}{OPENQUOTES}Wow!{ENDQUOTES} +STR_1551 :{SMALLFONT}{OPENQUOTES}I have the strangest feeling someone is watching me{ENDQUOTES} +STR_1552 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a balloon from {STRINGID}{ENDQUOTES} +STR_1553 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cuddly toy from {STRINGID}{ENDQUOTES} +STR_1554 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a park map from {STRINGID}{ENDQUOTES} +STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} +STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} +STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} +STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} +STR_1562 : +STR_1563 : +STR_1564 : +STR_1565 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for pizza from {STRINGID}{ENDQUOTES} +STR_1566 : +STR_1567 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for popcorn from {STRINGID}{ENDQUOTES} +STR_1568 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hot dog from {STRINGID}{ENDQUOTES} +STR_1569 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for tentacle from {STRINGID}{ENDQUOTES} +STR_1570 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hat from {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a toffee apple from {STRINGID}{ENDQUOTES} +STR_1572 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a T-shirt from {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a doughnut from {STRINGID}{ENDQUOTES} +STR_1574 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for coffee from {STRINGID}{ENDQUOTES} +STR_1575 : +STR_1576 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried chicken from {STRINGID}{ENDQUOTES} +STR_1577 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for lemonade from {STRINGID}{ENDQUOTES} +STR_1578 : +STR_1579 : +STR_1580 : +STR_1581 : +STR_1582 : +STR_1583 : +STR_1584 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1585 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1586 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1587 :{SMALLFONT}{OPENQUOTES}This pretzel from {STRINGID} is really good value{ENDQUOTES} +STR_1588 :{SMALLFONT}{OPENQUOTES}This hot chocolate from {STRINGID} is really good value{ENDQUOTES} +STR_1589 :{SMALLFONT}{OPENQUOTES}This iced tea from {STRINGID} is really good value{ENDQUOTES} +STR_1590 :{SMALLFONT}{OPENQUOTES}This funnel cake from {STRINGID} is really good value{ENDQUOTES} +STR_1591 :{SMALLFONT}{OPENQUOTES}These sunglasses from {STRINGID} are really good value{ENDQUOTES} +STR_1592 :{SMALLFONT}{OPENQUOTES}These beef noodles from {STRINGID} are really good value{ENDQUOTES} +STR_1593 :{SMALLFONT}{OPENQUOTES}These fried rice noodles from {STRINGID} are really good value{ENDQUOTES} +STR_1594 :{SMALLFONT}{OPENQUOTES}This wonton soup from {STRINGID} is really good value{ENDQUOTES} +STR_1595 :{SMALLFONT}{OPENQUOTES}This meatball soup from {STRINGID} is really good value{ENDQUOTES} +STR_1596 :{SMALLFONT}{OPENQUOTES}This fruit juice from {STRINGID} is really good value{ENDQUOTES} +STR_1597 :{SMALLFONT}{OPENQUOTES}This soybean milk from {STRINGID} is really good value{ENDQUOTES} +STR_1598 :{SMALLFONT}{OPENQUOTES}This sujongkwa from {STRINGID} is really good value{ENDQUOTES} +STR_1599 :{SMALLFONT}{OPENQUOTES}This sub sandwich from {STRINGID} is really good value{ENDQUOTES} +STR_1600 :{SMALLFONT}{OPENQUOTES}This cookie from {STRINGID} is really good value{ENDQUOTES} +STR_1601 : +STR_1602 : +STR_1603 : +STR_1604 :{SMALLFONT}{OPENQUOTES}This roast sausage from {STRINGID} are really good value{ENDQUOTES} +STR_1605 : +STR_1606 : +STR_1607 : +STR_1608 : +STR_1609 : +STR_1610 : +STR_1611 : +STR_1612 : +STR_1613 : +STR_1614 : +STR_1615 : +STR_1616 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1617 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1618 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1619 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a pretzel from {STRINGID}{ENDQUOTES} +STR_1620 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for hot chocolate from {STRINGID}{ENDQUOTES} +STR_1621 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for iced tea from {STRINGID}{ENDQUOTES} +STR_1622 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a funnel cake from {STRINGID}{ENDQUOTES} +STR_1623 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sunglasses from {STRINGID}{ENDQUOTES} +STR_1624 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for beef noodles from {STRINGID}{ENDQUOTES} +STR_1625 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried rice noodles from {STRINGID}{ENDQUOTES} +STR_1626 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for wonton soup from {STRINGID}{ENDQUOTES} +STR_1627 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for meatball soup from {STRINGID}{ENDQUOTES} +STR_1628 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fruit juice from {STRINGID}{ENDQUOTES} +STR_1629 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for soybean milk from {STRINGID}{ENDQUOTES} +STR_1630 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sujongkwa from {STRINGID}{ENDQUOTES} +STR_1631 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a sub sandwich from {STRINGID}{ENDQUOTES} +STR_1632 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cookie from {STRINGID}{ENDQUOTES} +STR_1633 : +STR_1634 : +STR_1635 : +STR_1636 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a roast sausage from {STRINGID}{ENDQUOTES} +STR_1637 : +STR_1638 : +STR_1639 : +STR_1640 : +STR_1641 : +STR_1642 : +STR_1643 : +STR_1644 : +STR_1645 : +STR_1646 : +STR_1647 : +STR_1648 :{SMALLFONT}{OPENQUOTES}Help! Put me down!{ENDQUOTES} +STR_1649 :{SMALLFONT}{OPENQUOTES}I'm running out of cash!{ENDQUOTES} +STR_1650 :{SMALLFONT}{OPENQUOTES}Wow! A new ride being built!{ENDQUOTES} +STR_1651 :{SMALLFONT}{OPENQUOTES}Nice ride! But not as good as the Phoenix...{ENDQUOTES} +STR_1652 :{SMALLFONT}{OPENQUOTES}I'm so excited - It's an Intamin ride!{ENDQUOTES} +STR_1653 :{SMALLFONT}{OPENQUOTES}...and here we are on {STRINGID}!{ENDQUOTES} +STR_1654 :{WINDOW_COLOUR_2}Recent thoughts: +STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land +STR_1656 :{SMALLFONT}{BLACK}Construct bridge or tunnel footpath +STR_1657 :{WINDOW_COLOUR_2}Preferred ride +STR_1658 :{WINDOW_COLOUR_2}intensity: {BLACK}less than {COMMA16} +STR_1659 :{WINDOW_COLOUR_2}intensity: {BLACK}between {COMMA16} and {COMMA16} +STR_1660 :{WINDOW_COLOUR_2}intensity: {BLACK}more than {COMMA16} +STR_1661 :{WINDOW_COLOUR_2}Nausea tolerance: {BLACK}{STRINGID} +STR_1662 :{WINDOW_COLOUR_2}Happiness: +STR_1663 :{WINDOW_COLOUR_2}Nausea: +STR_1664 :{WINDOW_COLOUR_2}Energy: +STR_1665 :{WINDOW_COLOUR_2}Hunger: +STR_1666 :{WINDOW_COLOUR_2}Thirst: +STR_1667 :{WINDOW_COLOUR_2}Bathroom: +STR_1668 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}Unknown +STR_1669 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}{COMMA16}% +STR_1670 :{WINDOW_COLOUR_2}Total customers: {BLACK}{COMMA32} +STR_1671 :{WINDOW_COLOUR_2}Total profit: {BLACK}{CURRENCY2DP} +STR_1672 :Brakes +STR_1673 :Spinning Control Toggle Track +STR_1674 :Brake speed +STR_1675 :{POP16}{VELOCITY} +STR_1676 :{SMALLFONT}{BLACK}Set speed limit for brakes +STR_1677 :{WINDOW_COLOUR_2}Popularity: {BLACK}Unknown +STR_1678 :{WINDOW_COLOUR_2}Popularity: {BLACK}{COMMA16}% +STR_1679 :Helix up (left) +STR_1680 :Helix up (right) +STR_1681 :Helix down (left) +STR_1682 :Helix down (right) +STR_1683 :Base size 2 x 2 +STR_1684 :Base size 4 x 4 +STR_1685 :Base size 2 x 4 +STR_1686 :Base size 5 x 1 +STR_1687 :Water splash +STR_1688 :Base size 4 x 1 +STR_1689 :Block brakes +STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} +STR_1691 :{WINDOW_COLOUR_2} Cost: {BLACK}{CURRENCY} +STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY} +STR_1693 :{SMALLFONT}{BLACK}遊客s +STR_1694 :{SMALLFONT}{BLACK}Staff +STR_1695 :{SMALLFONT}{BLACK}Income and costs +STR_1696 :{SMALLFONT}{BLACK}Customer information +STR_1697 :Cannot place these on queue line area +STR_1698 :Can only place these on queue area +STR_1699 :Too many people in game +STR_1700 :僱用新的清潔人員 +STR_1701 :Hire new Mechanic +STR_1702 :Hire new Security Guard +STR_1703 :Hire new Entertainer +STR_1704 :Can't hire new staff... +STR_1705 :{SMALLFONT}{BLACK}Sack this staff member +STR_1706 :{SMALLFONT}{BLACK}Move this person to a new location +STR_1707 :Too many staff in game +STR_1708 :{SMALLFONT}{BLACK}Set patrol area for this staff member +STR_1709 :Sack staff +STR_1710 :Yes +STR_1711 :{WINDOW_COLOUR_1}Are you sure you want to sack {STRINGID}? +STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Sweep footpaths +STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Water gardens +STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Empty litter bins +STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Mow grass +STR_1716 :Invalid name for park +STR_1717 :Can't rename park... +STR_1718 :Park Name +STR_1719 :Enter name for park: +STR_1720 :{SMALLFONT}{BLACK}Name park +STR_1721 :Park closed +STR_1722 :Park open +STR_1723 :Can't open park... +STR_1724 :Can't close park... +STR_1725 :Can't buy land... +STR_1726 :Land not for sale! +STR_1727 :Construction rights not for sale! +STR_1728 :Can't buy construction rights here... +STR_1729 :Land not owned by park! +STR_1730 :{RED}Closed - - +STR_1731 :{WHITE}{STRINGID} - - +STR_1732 :Build +STR_1733 :Mode +STR_1734 :{WINDOW_COLOUR_2}Number of laps: +STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit +STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1737 :{COMMA16} +STR_1738 :Can't change number of laps... +STR_1739 :Race won by 遊客 {INT32} +STR_1740 :Race won by {STRINGID} +STR_1741 :Not yet constructed ! +STR_1742 :{WINDOW_COLOUR_2}Max. people on ride: +STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this ride at one time +STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1745 :{COMMA16} +STR_1746 :Can't change this... +STR_1747 :{WINDOW_COLOUR_2}Time limit: +STR_1748 :{SMALLFONT}{BLACK}Time limit for ride +STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} +STR_1750 :{DURATION} +STR_1751 :Can't change time limit for ride... +STR_1752 :{SMALLFONT}{BLACK}Show list of individual 遊客s in park +STR_1753 :{SMALLFONT}{BLACK}Show summarised list of 遊客s in park +STR_1754 :{BLACK}{COMMA16} 遊客s +STR_1755 :{BLACK}{COMMA16} 遊客 +STR_1756 :{WINDOW_COLOUR_2}Admission price: +STR_1757 :{WINDOW_COLOUR_2}Reliability: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1758 :{SMALLFONT}{BLACK}Build mode +STR_1759 :{SMALLFONT}{BLACK}Move mode +STR_1760 :{SMALLFONT}{BLACK}Fill-in mode +STR_1761 :{SMALLFONT}{BLACK}Build maze in this direction +STR_1762 :Waterfalls +STR_1763 :Rapids +STR_1764 :Log Bumps +STR_1765 :On-ride photo section +STR_1766 :Reverser turntable +STR_1767 :Spinning tunnel +STR_1768 :Can't change number of swings... +STR_1769 :{WINDOW_COLOUR_2}Number of swings: +STR_1770 :{SMALLFONT}{BLACK}Number of complete swings +STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1772 :{COMMA16} +STR_1773 :Only one on-ride photo section allowed per ride +STR_1774 :Only one cable lift hill allowed per ride +STR_1775 :Off +STR_1776 :On +STR_1777 :{WINDOW_COLOUR_2}Music +STR_1778 :{STRINGID} - - +STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tigre costume +STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume +STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume +STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume +STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snowman costume +STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Knight costume +STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume +STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume +STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume +STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume +STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff +STR_1791 :{WINDOW_COLOUR_2}Uniform colour: +STR_1792 :Responding to {STRINGID} breakdown call +STR_1793 :Heading to {STRINGID} for an inspection +STR_1794 :Fixing {STRINGID} +STR_1795 :Answering radio call +STR_1796 :Has broken down and requires fixing +STR_1797 :This option cannot be changed for this ride +STR_1798 :Whirlpool +STR_1799 :{POP16}{POP16}{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1800 :Safety cut-out +STR_1801 :Restraints stuck closed +STR_1802 :Restraints stuck open +STR_1803 :Doors stuck closed +STR_1804 :Doors stuck open +STR_1805 :Vehicle malfunction +STR_1806 :Brakes failure +STR_1807 :Control failure +STR_1808 :{WINDOW_COLOUR_2}Last breakdown: {BLACK}{STRINGID} +STR_1809 :{WINDOW_COLOUR_2}Current breakdown: {OUTLINE}{RED}{STRINGID} +STR_1810 :{WINDOW_COLOUR_2}Carrying: +STR_1811 :Can't build this here... +STR_1812 :{SMALLFONT}{BLACK}{STRINGID} +STR_1813 :Miscellaneous Objects +STR_1814 :Actions +STR_1815 :Thoughts +STR_1816 :{SMALLFONT}{BLACK}Select information type to show in 遊客 list +STR_1817 :({COMMA16}) +STR_1818 :{WINDOW_COLOUR_2}All 遊客s +STR_1819 :{WINDOW_COLOUR_2}All 遊客s (summarised) +STR_1820 :{WINDOW_COLOUR_2}遊客s {STRINGID} +STR_1821 :{WINDOW_COLOUR_2}遊客s thinking {STRINGID} +STR_1822 :{WINDOW_COLOUR_2}遊客s thinking about {POP16}{STRINGID} +STR_1823 :{SMALLFONT}{BLACK}Show 遊客s' thoughts about this ride/attraction +STR_1824 :{SMALLFONT}{BLACK}Show 遊客s on this ride/attraction +STR_1825 :{SMALLFONT}{BLACK}Show 遊客s queuing for this ride/attraction +STR_1826 :Status +STR_1827 :Popularity +STR_1828 :Satisfaction +STR_1829 :Profit +STR_1830 :Queue length +STR_1831 :Queue time +STR_1832 :Reliability +STR_1833 :Down-time +STR_1834 :遊客s favourite +STR_1835 :Popularity: Unknown +STR_1836 :Popularity: {COMMA16}% +STR_1837 :Satisfaction: Unknown +STR_1838 :Satisfaction: {COMMA16}% +STR_1839 :Reliability: {COMMA16}% +STR_1840 :Down-time: {COMMA16}% +STR_1841 :Profit: {CURRENCY2DP} per hour +STR_1842 :Favourite of: {COMMA16} 遊客 +STR_1843 :Favourite of: {COMMA16} 遊客s +STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list +STR_1845 :{MONTHYEAR} +STR_1846 :{COMMA16} 遊客s +STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} 遊客s +STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} 遊客s +STR_1849 :{WINDOW_COLOUR_2}Play music +STR_1850 :{SMALLFONT}{BLACK}Select whether music should be played for this ride +STR_1851 :{WINDOW_COLOUR_2}Running cost: {BLACK}{CURRENCY2DP} per hour +STR_1852 :{WINDOW_COLOUR_2}Running cost: {BLACK}Unknown +STR_1853 :{WINDOW_COLOUR_2}Built: {BLACK}This Year +STR_1854 :{WINDOW_COLOUR_2}Built: {BLACK}Last Year +STR_1855 :{WINDOW_COLOUR_2}Built: {BLACK}{COMMA16} Years Ago +STR_1856 :{WINDOW_COLOUR_2}Profit per item sold: {BLACK}{CURRENCY2DP} +STR_1857 :{WINDOW_COLOUR_2}Loss per item sold: {BLACK}{CURRENCY2DP} +STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY2DP} per month +STR_1859 :Handymen +STR_1860 :Mechanics +STR_1861 :Security Guards +STR_1862 :Entertainers +STR_1863 :Handyman +STR_1864 :Mechanic +STR_1865 :Security Guard +STR_1866 :Entertainer +STR_1867 :{BLACK}{COMMA16} {STRINGID} +STR_1868 :Can't change number of rotations... +STR_1869 :{WINDOW_COLOUR_2}Number of rotations: +STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations +STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1872 :{COMMA16} +STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY2DP} per hour +STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour +STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} +STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides +STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides +STR_1878 :{WINDOW_COLOUR_2}Inspection: +STR_1879 :Every 10 minutes +STR_1880 :Every 20 minutes +STR_1881 :Every 30 minutes +STR_1882 :Every 45 minutes +STR_1883 :Every hour +STR_1884 :Every 2 hours +STR_1885 :Never +STR_1886 :Inspecting {STRINGID} +STR_1887 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}{COMMA16} minutes +STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hours +STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride +STR_1891 :No {STRINGID} in park yet! +STR_1892 :RollerCoaster Tycoon 2 +STR_1893 :Please insert your RollerCoaster Tycoon 2 CD in the following drive: +STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} +STR_1895 :{SMALLFONT}{BLACK}Build new ride/attraction +STR_1896 :{WINDOW_COLOUR_2}Expenditure/Income +STR_1897 :{WINDOW_COLOUR_2}Ride construction +STR_1898 :{WINDOW_COLOUR_2}Ride running costs +STR_1899 :{WINDOW_COLOUR_2}Land purchase +STR_1900 :{WINDOW_COLOUR_2}Landscaping +STR_1901 :{WINDOW_COLOUR_2}Park entrance tickets +STR_1902 :{WINDOW_COLOUR_2}Ride tickets +STR_1903 :{WINDOW_COLOUR_2}Shop sales +STR_1904 :{WINDOW_COLOUR_2}Shop stock +STR_1905 :{WINDOW_COLOUR_2}Food/drink sales +STR_1906 :{WINDOW_COLOUR_2}Food/drink stock +STR_1907 :{WINDOW_COLOUR_2}Staff wages +STR_1908 :{WINDOW_COLOUR_2}Marketing +STR_1909 :{WINDOW_COLOUR_2}Research +STR_1910 :{WINDOW_COLOUR_2}Loan interest +STR_1911 :{BLACK} at {COMMA16}% per year +STR_1912 :{MONTH} +STR_1913 :{BLACK}+{CURRENCY2DP} +STR_1914 :{BLACK}{CURRENCY2DP} +STR_1915 :{RED}{CURRENCY2DP} +STR_1916 :{WINDOW_COLOUR_2}Loan: +STR_1917 :{POP16}{POP16}{POP16}{CURRENCY} +STR_1918 :Can't borrow any more money! +STR_1919 :Not enough cash available! +STR_1920 :Can't pay back loan! +STR_1921 :{SMALLFONT}{BLACK}Start a new game +STR_1922 :{SMALLFONT}{BLACK}Continue playing a saved game +STR_1923 :{SMALLFONT}{BLACK}Show tutorial +STR_1924 :{SMALLFONT}{BLACK}Exit +STR_1925 :Can't place person here... +STR_1926 :{SMALLFONT} +STR_1927 :{YELLOW}{STRINGID} has broken down +STR_1928 :{RED}{STRINGID} has crashed! +STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better +STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this 遊客 - (If tracking is on, 遊客's movements will be reported in the message area) +STR_1931 :{STRINGID} has joined the queue line for {STRINGID} +STR_1932 :{STRINGID} is on {STRINGID} +STR_1933 :{STRINGID} is in {STRINGID} +STR_1934 :{STRINGID} has left {STRINGID} +STR_1935 :{STRINGID} has left the park +STR_1936 :{STRINGID} has bought {STRINGID} +STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message +STR_1938 :{SMALLFONT}{BLACK}Show view of 遊客 +STR_1939 :{SMALLFONT}{BLACK}Show view of staff member +STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this 遊客 +STR_1941 :{SMALLFONT}{BLACK}Show which rides this 遊客 has been on +STR_1942 :{SMALLFONT}{BLACK}Show financial information about this 遊客 +STR_1943 :{SMALLFONT}{BLACK}Show 遊客's recent thoughts +STR_1944 :{SMALLFONT}{BLACK}Show items 遊客 is carrying +STR_1945 :{SMALLFONT}{BLACK}Show orders and options for this staff member +STR_1946 :{SMALLFONT}{BLACK}Select costume for this entertainer +STR_1947 :{SMALLFONT}{BLACK}Show areas patrolled by selected staff type, and locate the nearest staff member +STR_1948 :{SMALLFONT}{BLACK}Hire a new staff member of the selected type +STR_1949 :Financial Summary +STR_1950 :Financial Graph +STR_1951 :Park Value Graph +STR_1952 :Profit Graph +STR_1953 :Marketing +STR_1954 :Research Funding +STR_1955 :{WINDOW_COLOUR_2}Number of circuits: +STR_1956 :{SMALLFONT}{BLACK}Number of circuits of track per ride +STR_1957 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1958 :{COMMA16} +STR_1959 :Can't change number of circuits... +STR_1960 :{WINDOW_COLOUR_2}Balloon price: +STR_1961 :{WINDOW_COLOUR_2}Cuddly Toy price: +STR_1962 :{WINDOW_COLOUR_2}Park Map price: +STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_1964 :{WINDOW_COLOUR_2}Umbrella price: +STR_1965 :{WINDOW_COLOUR_2}Drink price: +STR_1966 :{WINDOW_COLOUR_2}Burger price: +STR_1967 :{WINDOW_COLOUR_2}Chips price: +STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: +STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: +STR_1970 :{WINDOW_COLOUR_2} +STR_1971 :{WINDOW_COLOUR_2} +STR_1972 :{WINDOW_COLOUR_2} +STR_1973 :{WINDOW_COLOUR_2}Pizza price: +STR_1974 :{WINDOW_COLOUR_2} +STR_1975 :{WINDOW_COLOUR_2}Popcorn price: +STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: +STR_1977 :{WINDOW_COLOUR_2}Tentacle price: +STR_1978 :{WINDOW_COLOUR_2}Hat price: +STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: +STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: +STR_1981 :{WINDOW_COLOUR_2}Doughnut price: +STR_1982 :{WINDOW_COLOUR_2}Coffee price: +STR_1983 :{WINDOW_COLOUR_2} +STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: +STR_1985 :{WINDOW_COLOUR_2}Lemonade price: +STR_1986 :{WINDOW_COLOUR_2} +STR_1987 :{WINDOW_COLOUR_2} +STR_1988 :Balloon +STR_1989 :Cuddly Toy +STR_1990 :Park Map +STR_1991 :On-Ride Photo +STR_1992 :Umbrella +STR_1993 :Drink +STR_1994 :Burger +STR_1995 :Chips +STR_1996 :Ice Cream +STR_1997 :Candyfloss +STR_1998 :Empty Can +STR_1999 :Rubbish +STR_2000 :Empty Burger Box +STR_2001 :Pizza +STR_2002 :Voucher +STR_2003 :Popcorn +STR_2004 :Hot Dog +STR_2005 :Tentacle +STR_2006 :Hat +STR_2007 :Toffee Apple +STR_2008 :T-Shirt +STR_2009 :Doughnut +STR_2010 :Coffee +STR_2011 :Empty Cup +STR_2012 :Fried Chicken +STR_2013 :Lemonade +STR_2014 :Empty Box +STR_2015 :Empty Bottle +STR_2016 :Balloons +STR_2017 :Cuddly Toys +STR_2018 :Park Maps +STR_2019 :On-Ride Photos +STR_2020 :Umbrellas +STR_2021 :Drinks +STR_2022 :Burgers +STR_2023 :Chips +STR_2024 :Ice Creams +STR_2025 :Candyfloss +STR_2026 :Empty Cans +STR_2027 :Rubbish +STR_2028 :Empty Burger Boxes +STR_2029 :Pizzas +STR_2030 :Vouchers +STR_2031 :Popcorn +STR_2032 :Hot Dogs +STR_2033 :Tentacles +STR_2034 :Hats +STR_2035 :Toffee Apples +STR_2036 :T-Shirts +STR_2037 :Doughnuts +STR_2038 :Coffees +STR_2039 :Empty Cups +STR_2040 :Fried Chicken +STR_2041 :Lemonade +STR_2042 :Empty Boxes +STR_2043 :Empty Bottles +STR_2044 :a Balloon +STR_2045 :a Cuddly Toy +STR_2046 :a Park Map +STR_2047 :an On-Ride Photo +STR_2048 :an Umbrella +STR_2049 :a Drink +STR_2050 :a Burger +STR_2051 :some Chips +STR_2052 :an Ice Cream +STR_2053 :some Candyfloss +STR_2054 :an Empty Can +STR_2055 :some Rubbish +STR_2056 :an Empty Burger Box +STR_2057 :a Pizza +STR_2058 :a Voucher +STR_2059 :some Popcorn +STR_2060 :a Hot Dog +STR_2061 :a Tentacle +STR_2062 :a Hat +STR_2063 :a Toffee Apple +STR_2064 :a T-Shirt +STR_2065 :a Doughnut +STR_2066 :a Coffee +STR_2067 :an Empty Cup +STR_2068 :some Fried Chicken +STR_2069 :some Lemonade +STR_2070 :an Empty Box +STR_2071 :an Empty Bottle +STR_2072 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Balloon +STR_2073 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Cuddly Toy +STR_2074 :Map of {STRINGID} +STR_2075 :On-Ride Photo of {STRINGID} +STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Umbrella +STR_2077 :Drink +STR_2078 :Burger +STR_2079 :Chips +STR_2080 :Ice Cream +STR_2081 :Candyfloss +STR_2082 :Empty Can +STR_2083 :Rubbish +STR_2084 :Empty Burger Box +STR_2085 :Pizza +STR_2086 :Voucher for {STRINGID} +STR_2087 :Popcorn +STR_2088 :Hot Dog +STR_2089 :Tentacle +STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hat +STR_2091 :Toffee Apple +STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-Shirt +STR_2093 :Doughnut +STR_2094 :Coffee +STR_2095 :Empty Cup +STR_2096 :Fried Chicken +STR_2097 :Lemonade +STR_2098 :Empty Box +STR_2099 :Empty Bottle +STR_2100 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2101 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2102 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2103 :{WINDOW_COLOUR_2}Pretzel price: +STR_2104 :{WINDOW_COLOUR_2}Hot Chocolate price: +STR_2105 :{WINDOW_COLOUR_2}Iced Tea price: +STR_2106 :{WINDOW_COLOUR_2}Funnel Cake price: +STR_2107 :{WINDOW_COLOUR_2}Sunglasses price: +STR_2108 :{WINDOW_COLOUR_2}Beef Noodles price: +STR_2109 :{WINDOW_COLOUR_2}Fried Rice Noodles price: +STR_2110 :{WINDOW_COLOUR_2}Wonton Soup price: +STR_2111 :{WINDOW_COLOUR_2}Meatball Soup price: +STR_2112 :{WINDOW_COLOUR_2}Fruit Juice price: +STR_2113 :{WINDOW_COLOUR_2}Soybean Milk price: +STR_2114 :{WINDOW_COLOUR_2}Sujongkwa price: +STR_2115 :{WINDOW_COLOUR_2}Sub Sandwich price: +STR_2116 :{WINDOW_COLOUR_2}Cookie price: +STR_2117 :{WINDOW_COLOUR_2} +STR_2118 :{WINDOW_COLOUR_2} +STR_2119 :{WINDOW_COLOUR_2} +STR_2120 :{WINDOW_COLOUR_2}Roast Sausage price: +STR_2121 :{WINDOW_COLOUR_2} +STR_2122 :On-Ride Photo +STR_2123 :On-Ride Photo +STR_2124 :On-Ride Photo +STR_2125 :Pretzel +STR_2126 :Hot Chocolate +STR_2127 :Iced Tea +STR_2128 :Funnel Cake +STR_2129 :Sunglasses +STR_2130 :Beef Noodles +STR_2131 :Fried Rice Noodles +STR_2132 :Wonton Soup +STR_2133 :Meatball Soup +STR_2134 :Fruit Juice +STR_2135 :Soybean Milk +STR_2136 :Sujongkwa +STR_2137 :Sub Sandwich +STR_2138 :Cookie +STR_2139 :Empty Bowl +STR_2140 :Empty Drink Carton +STR_2141 :Empty Juice Cup +STR_2142 :Roast Sausage +STR_2143 :Empty Bowl +STR_2144 :On-Ride Photos +STR_2145 :On-Ride Photos +STR_2146 :On-Ride Photos +STR_2147 :Pretzels +STR_2148 :Hot Chocolates +STR_2149 :Iced Teas +STR_2150 :Funnel Cakes +STR_2151 :Sunglasses +STR_2152 :Beef Noodles +STR_2153 :Fried Rice Noodles +STR_2154 :Wonton Soups +STR_2155 :Meatball Soups +STR_2156 :Fruit Juices +STR_2157 :Soybean Milks +STR_2158 :Sujongkwa +STR_2159 :Sub Sandwiches +STR_2160 :Cookies +STR_2161 :Empty Bowls +STR_2162 :Empty Drink Cartons +STR_2163 :Empty Juice cups +STR_2164 :Roast Sausages +STR_2165 :Empty Bowls +STR_2166 :an On-Ride Photo +STR_2167 :an On-Ride Photo +STR_2168 :an On-Ride Photo +STR_2169 :a Pretzel +STR_2170 :a Hot Chocolate +STR_2171 :an Iced Tea +STR_2172 :a Funnel Cake +STR_2173 :a pair of Sunglasses +STR_2174 :some Beef Noodles +STR_2175 :some Fried Rice Noodles +STR_2176 :some Wonton Soup +STR_2177 :some Meatball Soup +STR_2178 :a Fruit Juice +STR_2179 :some Soybean Milk +STR_2180 :some Sujongkwa +STR_2181 :a Sub Sandwich +STR_2182 :a Cookie +STR_2183 :an Empty Bowl +STR_2184 :an Empty Drink Carton +STR_2185 :an Empty Juice Cup +STR_2186 :a Roast Sausage +STR_2187 :an Empty Bowl +STR_2188 :On-Ride Photo of {STRINGID} +STR_2189 :On-Ride Photo of {STRINGID} +STR_2190 :On-Ride Photo of {STRINGID} +STR_2191 :Pretzel +STR_2192 :Hot Chocolate +STR_2193 :Iced Tea +STR_2194 :Funnel Cake +STR_2195 :Sunglasses +STR_2196 :Beef Noodles +STR_2197 :Fried Rice Noodles +STR_2198 :Wonton Soup +STR_2199 :Meatball Soup +STR_2200 :Fruit Juice +STR_2201 :Soybean Milk +STR_2202 :Sujongkwa +STR_2203 :Sub Sandwich +STR_2204 :Cookie +STR_2205 :Empty Bowl +STR_2206 :Empty Drink Carton +STR_2207 :Empty Juice Cup +STR_2208 :Roast Sausage +STR_2209 :Empty Bowl +STR_2210 :{SMALLFONT}{BLACK}Show list of handymen in park +STR_2211 :{SMALLFONT}{BLACK}Show list of mechanics in park +STR_2212 :{SMALLFONT}{BLACK}Show list of security guards in park +STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park +STR_2214 :Construction not possible while game is paused! +STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) +STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled +STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} +STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} +STR_2221 :{SMALLFONT}{BLACK}Park Rating: {COMMA16} +STR_2222 :{SMALLFONT}{BLACK}{STRINGID} +STR_2223 :{WINDOW_COLOUR_2}遊客s in park: {BLACK}{COMMA16} +STR_2224 :{WINDOW_COLOUR_2}Cash: {BLACK}{CURRENCY2DP} +STR_2225 :{WINDOW_COLOUR_2}Cash: {RED}{CURRENCY2DP} +STR_2226 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} +STR_2227 :{WINDOW_COLOUR_2}Company value: {BLACK}{CURRENCY} +STR_2228 :{WINDOW_COLOUR_2}Last month's profit from food/drink and{NEWLINE}merchandise sales: {BLACK}{CURRENCY} +STR_2229 :Slope up to vertical +STR_2230 :Vertical track +STR_2231 :Holding brake for drop +STR_2232 :Cable lift hill +STR_2233 :{SMALLFONT}{BLACK}Park information +STR_2234 :Recent Messages +STR_2235 :{SMALLFONT}{STRINGID} {STRINGID} +STR_2236 :January +STR_2237 :February +STR_2238 :March +STR_2239 :April +STR_2240 :May +STR_2241 :June +STR_2242 :July +STR_2243 :August +STR_2244 :September +STR_2245 :October +STR_2246 :November +STR_2247 :December +STR_2248 :Can't demolish ride/attraction... +STR_2249 :{BABYBLUE}New ride/attraction now available:{NEWLINE}{STRINGID} +STR_2250 :{BABYBLUE}New scenery/themeing now available:{NEWLINE}{STRINGID} +STR_2251 :Can only be built on paths! +STR_2252 :Can only be built across paths! +STR_2253 :Transport Rides +STR_2254 :Gentle Rides +STR_2255 :Roller Coasters +STR_2256 :Thrill Rides +STR_2257 :Water Rides +STR_2258 :Shops & Stalls +STR_2259 :Scenery & Themeing +STR_2260 :No funding +STR_2261 :Minimum funding +STR_2262 :Normal funding +STR_2263 :Maximum funding +STR_2264 :Research funding +STR_2265 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} per month +STR_2266 :Research priorities +STR_2267 :Currently in development +STR_2268 :Last development +STR_2269 :{WINDOW_COLOUR_2}Type: {BLACK}{STRINGID} +STR_2270 :{WINDOW_COLOUR_2}Progress: {BLACK}{STRINGID} +STR_2271 :{WINDOW_COLOUR_2}Expected: {BLACK}{STRINGID} +STR_2272 :{WINDOW_COLOUR_2}Ride/attraction:{NEWLINE}{BLACK}{STRINGID} +STR_2273 :{WINDOW_COLOUR_2}Scenery/themeing:{NEWLINE}{BLACK}{STRINGID} +STR_2274 :{SMALLFONT}{BLACK}Show details of this invention or development +STR_2275 :{SMALLFONT}{BLACK}Show funding and options for research & development +STR_2276 :{SMALLFONT}{BLACK}Show research & development status +STR_2277 :Unknown +STR_2278 :Transport Ride +STR_2279 :Gentle Ride +STR_2280 :Roller Coaster +STR_2281 :Thrill Ride +STR_2282 :Water Ride +STR_2283 :Shop/Stall +STR_2284 :Scenery/Themeing +STR_2285 :Initial research +STR_2286 :Designing +STR_2287 :Completing design +STR_2288 :Unknown +STR_2289 :{STRINGID} {STRINGID} +STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} +STR_2291 :Select scenario for new game +STR_2292 :{WINDOW_COLOUR_2}Rides been on: +STR_2293 :{BLACK} Nothing +STR_2294 :{SMALLFONT}{BLACK}Change base land style +STR_2295 :{SMALLFONT}{BLACK}Change vertical edges of land +STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} paid to enter park +STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} ride +STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} rides +STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} item of food +STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} items of food +STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drink +STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drinks +STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenir +STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenirs +STR_2305 :Track design files +STR_2306 :Save track design +STR_2307 :Select {STRINGID} design +STR_2308 :{STRINGID} Track Designs +STR_2309 :Install New Track Design +STR_2310 :Build custom design +STR_2311 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} (approx.) +STR_2312 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} (approx.) +STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) +STR_2314 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID} +STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} +STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks +STR_2317 :{WINDOW_COLOUR_2}Sound Quality: +STR_2318 :Low +STR_2319 :Medium +STR_2320 :High +STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} +STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} +STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} +STR_2324 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}sq.ft. +STR_2325 :{SMALLFONT}{BLACK}Buy land to extend park +STR_2326 :{SMALLFONT}{BLACK}Buy construction rights to allow construction above or below land outside the park +STR_2327 :Options +STR_2328 :{WINDOW_COLOUR_2}Currency: +STR_2329 :{WINDOW_COLOUR_2}Distance and Speed: +STR_2330 :{WINDOW_COLOUR_2}Temperature: +STR_2331 :{WINDOW_COLOUR_2}Height Labels: +STR_2332 :Units +STR_2333 :Sound +STR_2334 :Pounds ({POUND}) +STR_2335 :Dollars ($) +STR_2336 :Franc (F) +STR_2337 :Deutschmark (DM) +STR_2338 :Yen ({YEN}) +STR_2339 :Peseta (Pts) +STR_2340 :Lira (L) +STR_2341 :Guilders (fl.) +STR_2342 :Krona (kr) +STR_2343 :Euros ({EURO}) +STR_2344 :Imperial +STR_2345 :Metric +STR_2346 :Display +STR_2347 :{RED}{STRINGID} has drowned! +STR_2348 :{SMALLFONT}{BLACK}Show statistics for this staff member +STR_2349 :{WINDOW_COLOUR_2}Wages: {BLACK}{CURRENCY} per month +STR_2350 :{WINDOW_COLOUR_2}Employed: {BLACK}{MONTHYEAR} +STR_2351 :{WINDOW_COLOUR_2}Lawns mown: {BLACK}{COMMA16} +STR_2352 :{WINDOW_COLOUR_2}Gardens watered: {BLACK}{COMMA16} +STR_2353 :{WINDOW_COLOUR_2}Litter swept: {BLACK}{COMMA16} +STR_2354 :{WINDOW_COLOUR_2}Bins emptied: {BLACK}{COMMA16} +STR_2355 :{WINDOW_COLOUR_2}Rides fixed: {BLACK}{COMMA16} +STR_2356 :{WINDOW_COLOUR_2}Rides inspected: {BLACK}{COMMA16} +STR_2357 :House +STR_2358 :Units +STR_2359 :Real Values +STR_2360 :{WINDOW_COLOUR_2}Display Resolution: +STR_2361 :Landscape Smoothing +STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off +STR_2363 :Gridlines on Landscape +STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off +STR_2365 :The bank refuses to increase your loan! +STR_2366 :Celsius ({DEGREE}C) +STR_2367 :Fahrenheit (F) +STR_2368 :None +STR_2369 :Low +STR_2370 :Average +STR_2371 :High +STR_2372 :Low +STR_2373 :Medium +STR_2374 :High +STR_2375 :Very high +STR_2376 :Extreme +STR_2377 :Ultra-Extreme +STR_2378 :{SMALLFONT}{BLACK}Adjust smaller area of land +STR_2379 :{SMALLFONT}{BLACK}Adjust larger area of land +STR_2380 :{SMALLFONT}{BLACK}Adjust smaller area of water +STR_2381 :{SMALLFONT}{BLACK}Adjust larger area of water +STR_2382 :Land +STR_2383 :Water +STR_2384 :{WINDOW_COLOUR_2}Your objective: +STR_2385 :{BLACK}None +STR_2386 :{BLACK}To have at least {COMMA16} 遊客s in your park at the end of {MONTHYEAR}, with a park rating of at least 600 +STR_2387 :{BLACK}To achieve a park value of at least {POP16}{POP16}{CURRENCY} at the end of {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} +STR_2388 :{BLACK}Have Fun! +STR_2389 :{BLACK}Build the best {STRINGID} you can! +STR_2390 :{BLACK}To have 10 different types of roller coasters operating in your park, each with an excitement value of at least 6.00 +STR_2391 :{BLACK}To have at least {COMMA16} 遊客s in your park. You must not let the park rating drop below 700 at any time! +STR_2392 :{BLACK}To achieve a monthly income from ride tickets of at least {POP16}{POP16}{CURRENCY} +STR_2393 :{BLACK}To have 10 different types of roller coasters operating in your park, each with a minimum length of {LENGTH}, and an excitement rating of at least 7.00 +STR_2394 :{BLACK}To finish building all 5 of the partially built roller coasters in this park, designing them to achieve excitement ratings of at least {POP16}{POP16}{COMMA2DP32} each +STR_2395 :{BLACK}To repay your loan and achieve a park value of at least {POP16}{POP16}{CURRENCY} +STR_2396 :{BLACK}To achieve a monthly profit from food, drink and merchandise sales of at least {POP16}{POP16}{CURRENCY} +STR_2397 :None +STR_2398 :Number of 遊客s at a given date +STR_2399 :Park value at a given date +STR_2400 :Have fun +STR_2401 :Build the best ride you can +STR_2402 :Build 10 roller coasters +STR_2403 :Number of 遊客s in park +STR_2404 :Monthly income from ride tickets +STR_2405 :Build 10 roller coasters of a given length +STR_2406 :Finish building 5 roller coasters +STR_2407 :Repay loan and achieve a given park value +STR_2408 :Monthly profit from food/merchandise +STR_2409 :{WINDOW_COLOUR_2}Marketing campaigns in operation +STR_2410 :{BLACK}None +STR_2411 :{WINDOW_COLOUR_2}Marketing campaigns available +STR_2412 :{SMALLFONT}{BLACK}Start this marketing campaign +STR_2413 :{BLACK}({CURRENCY2DP} per week) +STR_2414 :(Not Selected) +STR_2415 :{WINDOW_COLOUR_2}Ride: +STR_2416 :{WINDOW_COLOUR_2}Item: +STR_2417 :{WINDOW_COLOUR_2}Length of time: +STR_2418 :Free entry to {STRINGID} +STR_2419 :Free ride on {STRINGID} +STR_2420 :Half-price entry to {STRINGID} +STR_2421 :Free {STRINGID} +STR_2422 :Advertising campaign for {STRINGID} +STR_2423 :Advertising campaign for {STRINGID} +STR_2424 :{WINDOW_COLOUR_2}Vouchers for free entry to the park +STR_2425 :{WINDOW_COLOUR_2}Vouchers for free rides on a particular ride +STR_2426 :{WINDOW_COLOUR_2}Vouchers for half-price entry to the park +STR_2427 :{WINDOW_COLOUR_2}Vouchers for free food or drink +STR_2428 :{WINDOW_COLOUR_2}Advertising campaign for the park +STR_2429 :{WINDOW_COLOUR_2}Advertising campaign for a particular ride +STR_2430 :{BLACK}Vouchers for free entry to {STRINGID} +STR_2431 :{BLACK}Vouchers for free ride on {STRINGID} +STR_2432 :{BLACK}Vouchers for half-price entry to {STRINGID} +STR_2433 :{BLACK}Vouchers for free {STRINGID} +STR_2434 :{BLACK}Advertising campaign for {STRINGID} +STR_2435 :{BLACK}Advertising campaign for {STRINGID} +STR_2436 :1 week +STR_2437 :2 weeks +STR_2438 :3 weeks +STR_2439 :4 weeks +STR_2440 :5 weeks +STR_2441 :6 weeks +STR_2442 :{BLACK}({STRINGID} remaining) +STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} +STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} +STR_2445 :Start this marketing campaign +STR_2446 :{YELLOW}Your marketing campaign for free entry to the park has finished +STR_2447 :{YELLOW}Your marketing campaign for free rides on {STRINGID} has finished +STR_2448 :{YELLOW}Your marketing campaign for half-price entry to the park has finished +STR_2449 :{YELLOW}Your marketing campaign for free {STRINGID} has finished +STR_2450 :{YELLOW}Your advertising campaign for the park has finished +STR_2451 :{YELLOW}Your advertising campaign for {STRINGID} has finished +STR_2452 :{WINDOW_COLOUR_2}Cash (less loan): {BLACK}{CURRENCY2DP} +STR_2453 :{WINDOW_COLOUR_2}Cash (less loan): {RED}{CURRENCY2DP} +STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} - +STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} - +STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} - +STR_2457 :{SMALLFONT}{BLACK}Show financial accounts +STR_2458 :{SMALLFONT}{BLACK}Show graph of cash (less loan) over time +STR_2459 :{SMALLFONT}{BLACK}Show graph of park value over time +STR_2460 :{SMALLFONT}{BLACK}Show graph of weekly profit +STR_2461 :{SMALLFONT}{BLACK}Show marketing campaigns +STR_2462 :{SMALLFONT}{BLACK}Show view of park entrance +STR_2463 :{SMALLFONT}{BLACK}Show graph of park ratings over time +STR_2464 :{SMALLFONT}{BLACK}Show graph of 遊客 numbers over time +STR_2465 :{SMALLFONT}{BLACK}Show park entrance price and information +STR_2466 :{SMALLFONT}{BLACK}Show park statistics +STR_2467 :{SMALLFONT}{BLACK}Show objectives for this game +STR_2468 :{SMALLFONT}{BLACK}Show recent awards this park has received +STR_2469 :{SMALLFONT}{BLACK}Select level of research & development +STR_2470 :{SMALLFONT}{BLACK}Research new transport rides +STR_2471 :{SMALLFONT}{BLACK}Research new gentle rides +STR_2472 :{SMALLFONT}{BLACK}Research new roller coasters +STR_2473 :{SMALLFONT}{BLACK}Research new thrill rides +STR_2474 :{SMALLFONT}{BLACK}Research new water rides +STR_2475 :{SMALLFONT}{BLACK}Research new shops and stalls +STR_2476 :{SMALLFONT}{BLACK}Research new scenery and themeing +STR_2477 :{SMALLFONT}{BLACK}Select operating mode for this ride/attraction +STR_2478 :{SMALLFONT}{BLACK}Show graph of velocity against time +STR_2479 :{SMALLFONT}{BLACK}Show graph of altitude against time +STR_2480 :{SMALLFONT}{BLACK}Show graph of vertical acceleration against time +STR_2481 :{SMALLFONT}{BLACK}Show graph of lateral acceleration against time +STR_2482 :{SMALLFONT}{BLACK}Profit: {CURRENCY} per week, Park Value: {CURRENCY} +STR_2483 :{WINDOW_COLOUR_2}Weekly profit: {BLACK}+{CURRENCY2DP} +STR_2484 :{WINDOW_COLOUR_2}Weekly profit: {RED}{CURRENCY2DP} +STR_2485 :Controls +STR_2486 :General +STR_2487 :Show 'real' names of 遊客s +STR_2488 :{SMALLFONT}{BLACK}Toggle between showing 'real' names of 遊客s and 遊客 numbers +STR_2489 :Shortcut keys... +STR_2490 :Keyboard shortcuts +STR_2491 :Reset keys +STR_2492 :{SMALLFONT}{BLACK}Set all keyboard shortcuts back to default settings +STR_2493 :Close top-most window +STR_2494 :Close all floating windows +STR_2495 :Cancel construction mode +STR_2496 :Pause game +STR_2497 :Zoom view out +STR_2498 :Zoom view in +STR_2499 :Rotate view +STR_2500 :Rotate construction object +STR_2501 :Underground view toggle +STR_2502 :Remove base land toggle +STR_2503 :Remove vertical land toggle +STR_2504 :See-through rides toggle +STR_2505 :See-through scenery toggle +STR_2506 :Invisible supports toggle +STR_2507 :Invisible people toggle +STR_2508 :Height marks on land toggle +STR_2509 :Height marks on ride tracks toggle +STR_2510 :Height marks on paths toggle +STR_2511 :Adjust land +STR_2512 :Adjust water +STR_2513 :Build scenery +STR_2514 :Build paths +STR_2515 :Build new ride +STR_2516 :Show financial information +STR_2517 :Show research information +STR_2518 :Show rides list +STR_2519 :Show park information +STR_2520 :Show 遊客 list +STR_2521 :Show staff list +STR_2522 :Show recent messages +STR_2523 :Show map +STR_2524 :Screenshot +### The following need to be reordered to match SDL_keycode layout. +STR_2525 :??? +STR_2526 :??? +STR_2527 :??? +STR_2528 :??? +STR_2529 :??? +STR_2530 :??? +STR_2531 :??? +STR_2532 :??? +STR_2533 :Backspace +STR_2534 :Tab +STR_2535 :??? +STR_2536 :??? +STR_2537 :Clear +STR_2538 :Return +STR_2539 :??? +STR_2540 :??? +STR_2541 :??? +STR_2542 :??? +STR_2543 :Alt/Menu +STR_2544 :Pause +STR_2545 :Caps +STR_2546 :??? +STR_2547 :??? +STR_2548 :??? +STR_2549 :??? +STR_2550 :??? +STR_2551 :??? +STR_2552 :Escape +STR_2553 :??? +STR_2554 :??? +STR_2555 :??? +STR_2556 :??? +STR_2557 :Spacebar +STR_2558 :PgUp +STR_2559 :PgDn +STR_2560 :End +STR_2561 :Home +STR_2562 :Left +STR_2563 :Up +STR_2564 :Right +STR_2565 :Down +STR_2566 :Select +STR_2567 :Print +STR_2568 :Execute +STR_2569 :Snapshot +STR_2570 :Insert +STR_2571 :Delete +STR_2572 :Help +STR_2573 :0 +STR_2574 :1 +STR_2575 :2 +STR_2576 :3 +STR_2577 :4 +STR_2578 :5 +STR_2579 :6 +STR_2580 :7 +STR_2581 :8 +STR_2582 :9 +STR_2583 :??? +STR_2584 :??? +STR_2585 :??? +STR_2586 :??? +STR_2587 :??? +STR_2588 :??? +STR_2589 :??? +STR_2590 :A +STR_2591 :B +STR_2592 :C +STR_2593 :D +STR_2594 :E +STR_2595 :F +STR_2596 :G +STR_2597 :H +STR_2598 :I +STR_2599 :J +STR_2600 :K +STR_2601 :L +STR_2602 :M +STR_2603 :N +STR_2604 :O +STR_2605 :P +STR_2606 :Q +STR_2607 :R +STR_2608 :S +STR_2609 :T +STR_2610 :U +STR_2611 :V +STR_2612 :W +STR_2613 :X +STR_2614 :Y +STR_2615 :Z +STR_2616 :??? +STR_2617 :??? +STR_2618 :Menu +STR_2619 :??? +STR_2620 :??? +STR_2621 :NumPad 0 +STR_2622 :NumPad 1 +STR_2623 :NumPad 2 +STR_2624 :NumPad 3 +STR_2625 :NumPad 4 +STR_2626 :NumPad 5 +STR_2627 :NumPad 6 +STR_2628 :NumPad 7 +STR_2629 :NumPad 8 +STR_2630 :NumPad 9 +STR_2631 :NumPad * +STR_2632 :NumPad + +STR_2633 :??? +STR_2634 :NumPad - +STR_2635 :NumPad . +STR_2636 :NumPad / +STR_2637 :F1 +STR_2638 :F2 +STR_2639 :F3 +STR_2640 :F4 +STR_2641 :F5 +STR_2642 :F6 +STR_2643 :F7 +STR_2644 :F8 +STR_2645 :F9 +STR_2646 :F10 +STR_2647 :F11 +STR_2648 :F12 +STR_2649 :F13 +STR_2650 :F14 +STR_2651 :F15 +STR_2652 :F16 +STR_2653 :F17 +STR_2654 :F18 +STR_2655 :F19 +STR_2656 :F20 +STR_2657 :F21 +STR_2658 :F22 +STR_2659 :F23 +STR_2660 :F24 +STR_2661 :??? +STR_2662 :??? +STR_2663 :??? +STR_2664 :??? +STR_2665 :??? +STR_2666 :??? +STR_2667 :??? +STR_2668 :??? +STR_2669 :NumLock +STR_2670 :Scroll +STR_2671 :??? +STR_2672 :??? +STR_2673 :??? +STR_2674 :??? +STR_2675 :??? +STR_2676 :??? +STR_2677 :??? +STR_2678 :??? +STR_2679 :??? +STR_2680 :All research complete +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 +STR_2682 : +STR_2683 : +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive +STR_2685 :Simplex Noise Parameters +STR_2686 :{WINDOW_COLOUR_2}Low: +STR_2687 :{WINDOW_COLOUR_2}High: +STR_2688 :{WINDOW_COLOUR_2}Base Frequency: +STR_2689 :{WINDOW_COLOUR_2}Octaves: +STR_2690 :Map Generation +STR_2691 :{WINDOW_COLOUR_2}Base height: +STR_2692 :{WINDOW_COLOUR_2}Water level: +STR_2693 :{WINDOW_COLOUR_2}Terrain: +STR_2694 :Generate +STR_2695 :Random terrain +STR_2696 :Place trees +STR_2697 :??? +STR_2698 :??? +STR_2699 :??? +STR_2700 :Autosave frequency: +STR_2701 :Every week +STR_2702 :Every 2 weeks +STR_2703 :Every month +STR_2704 :Every 4 months +STR_2705 :Every year +STR_2706 :Never +STR_2707 :Open new window +STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? +STR_2709 :Overwrite +STR_2710 :Type the name of the file. +STR_2711 :; +STR_2712 := +STR_2713 :, +STR_2714 :- +STR_2715 :. +STR_2716 :/ +STR_2717 :' +STR_2718 :(up) +STR_2719 :(new file) +STR_2720 :{UINT16}sec +STR_2721 :{UINT16}secs +STR_2722 :{UINT16}min:{UINT16}sec +STR_2723 :{UINT16}min:{UINT16}secs +STR_2724 :{UINT16}mins:{UINT16}sec +STR_2725 :{UINT16}mins:{UINT16}secs +STR_2726 :{UINT16}min +STR_2727 :{UINT16}mins +STR_2728 :{UINT16}hour:{UINT16}min +STR_2729 :{UINT16}hour:{UINT16}mins +STR_2730 :{UINT16}hours:{UINT16}min +STR_2731 :{UINT16}hours:{UINT16}mins +STR_2732 :{COMMA16}ft +STR_2733 :{COMMA16}m +STR_2734 :{COMMA16}mph +STR_2735 :{COMMA16}km/h +STR_2736 :{MONTH}, Year {COMMA16} +STR_2737 :{STRINGID} {MONTH}, Year {COMMA16} +STR_2738 :Title screen music: +STR_2739 :None +STR_2740 :RollerCoaster Tycoon 1 +STR_2741 :RollerCoaster Tycoon 2 +STR_2742 :css50.dat not found +STR_2743 :Copy data\css17.dat from your RCT1 installation to data\css50.dat in your RCT2 installation. +STR_2744 :[ +STR_2745 :\ +STR_2746 :] +STR_2747 :{ENDQUOTES} +STR_2748 :Bar +STR_2749 :My new scenario +# New strings used in the cheats window previously these were ??? +STR_2750 :Move all items to top +STR_2751 :Move all items to bottom +STR_2752 :Clear grass +STR_2753 :Mowed grass +STR_2754 :Water plants +STR_2755 :Fix vandalism +STR_2756 :Remove litter +STR_2757 :Force Sun +STR_2758 :Force Thunder +STR_2759 :Zero Clearance +STR_2760 :+5K Money +STR_2761 : +STR_2762 : +STR_2763 :??? +STR_2764 : +STR_2765 :Large Tram +STR_2766 :Win scenario +STR_2767 :Freeze Climate +STR_2768 :Unfreeze Climate +STR_2769 :Open Park +STR_2770 :Close Park +STR_2771 :Slower Gamespeed +STR_2772 :Faster Gamespeed +STR_2773 :Windowed +STR_2774 :Fullscreen +STR_2775 :Fullscreen (desktop) +STR_2776 :Language: +STR_2777 :{MOVE_X}{SMALLFONT}{STRING} +STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} +STR_2779 :Viewport #{COMMA16} +STR_2780 :Extra viewport +# End of new strings +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2782 :SHIFT + +STR_2783 :CTRL + +STR_2784 :Change keyboard shortcut +STR_2785 :{WINDOW_COLOUR_2}Press new shortcut key for:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} +STR_2786 :{SMALLFONT}{BLACK}Click on shortcut description to select new key +STR_2787 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} +STR_2788 :{WINDOW_COLOUR_2}Congratulations !{NEWLINE}{BLACK}You achieved your objective with a company value of {CURRENCY} ! +STR_2789 :{WINDOW_COLOUR_2}You have failed your objective ! +STR_2790 :Enter name into scenario chart +STR_2791 :Enter name +STR_2792 :Please enter your name for the scenario chart: +STR_2793 :{SMALLFONT}(Completed by {STRINGID}) +STR_2794 :{WINDOW_COLOUR_2}Completed by: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} with a company value of: {BLACK}{CURRENCY} +STR_2795 :Sort +STR_2796 :{SMALLFONT}{BLACK}Sort the ride list into order using the information type displayed +STR_2797 :Scroll view when pointer at screen edge +STR_2798 :{SMALLFONT}{BLACK}Select whether to scroll the view when the mouse pointer is at the screen edge +STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments +STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32} +STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP} +STR_2802 :Map +STR_2803 :{SMALLFONT}{BLACK}Show these 遊客s highlighted on map +STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map +STR_2805 :{SMALLFONT}{BLACK}Show map of park +STR_2806 :{RED}遊客s are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organizing them better +STR_2807 :{RED}遊客s are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organizing them better +STR_2808 :{RED}遊客s are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better +STR_2809 :{RED}遊客s are hungry and can't find anywhere to buy food +STR_2810 :{RED}遊客s are thirsty and can't find anywhere to buy drinks +STR_2811 :{RED}遊客s are complaining because they can't find the toilets in your park +STR_2812 :{RED}遊客s are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the 遊客s find their way around +STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more 遊客s +STR_2814 :{WINDOW_COLOUR_2}Most untidy park award +STR_2815 :{WINDOW_COLOUR_2}Tidiest park award +STR_2816 :{WINDOW_COLOUR_2}Award for the park with the best roller coasters +STR_2817 :{WINDOW_COLOUR_2}Best value park award +STR_2818 :{WINDOW_COLOUR_2}Most beautiful park award +STR_2819 :{WINDOW_COLOUR_2}Worst value park award +STR_2820 :{WINDOW_COLOUR_2}Safest park award +STR_2821 :{WINDOW_COLOUR_2}Best staff award +STR_2822 :{WINDOW_COLOUR_2}Best park food award +STR_2823 :{WINDOW_COLOUR_2}Worst park food award +STR_2824 :{WINDOW_COLOUR_2}Best park toilets award +STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award +STR_2826 :{WINDOW_COLOUR_2}Best water rides award +STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award +STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride colour schemes award +STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award +STR_2830 :{WINDOW_COLOUR_2}Best gentle ride award +STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'! +STR_2832 :{TOPAZ}Your park has received an award for being 'The tidiest park in the country'! +STR_2833 :{TOPAZ}Your park has received an award for being 'The park with the best roller coasters'! +STR_2834 :{TOPAZ}Your park has received an award for being 'The best value park in the country'! +STR_2835 :{TOPAZ}Your park has received an award for being 'The most beautiful park in the country'! +STR_2836 :{TOPAZ}Your park has received an award for being 'The worst value park in the country'! +STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park in the country'! +STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! +STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! +STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! +STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best toilet facilities in the country'! +STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! +STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water rides in the country'! +STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed rides'! +STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of colour schemes'! +STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! +STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle rides'! +STR_2848 :{WINDOW_COLOUR_2}No recent awards +STR_2849 :New scenario installed successfully +STR_2850 :New track design installed successfully +STR_2851 :Scenario already installed +STR_2852 :Track design already installed +STR_2853 :Forbidden by the local authority! +STR_2854 :{RED}遊客s can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance +STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the ride exit +STR_2856 :{WINDOW_COLOUR_2}Tutorial +STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) +STR_2858 :Can't start marketing campaign... +STR_2859 :Another instance of RollerCoaster Tycoon 2 is already running +STR_2860 :Infogrames Interactive credits... +STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. +STR_2862 :Music acknowledgements... +STR_2863 :Music acknowledgements +STR_2864 :{WINDOW_COLOUR_2}March - Children of the Regiment: (Fucik) non copyright +STR_2865 :{WINDOW_COLOUR_2}Heyken's Serenade: (J.Heyken) British Standard Music Coy; GEMA, BRITICO +STR_2866 :{WINDOW_COLOUR_2}In Continental Mood: (Composer unknown) Copyright Control +STR_2867 :{WINDOW_COLOUR_2}Wedding Journey: (Traditional) +STR_2868 :{WINDOW_COLOUR_2}Tales from the Vienna Woods: (Johann Strauss) non copyright +STR_2869 :{WINDOW_COLOUR_2}Slavonic Dance: (Traditional) +STR_2870 :{WINDOW_COLOUR_2}Das Alpenhorn: (Traditional) +STR_2871 :{WINDOW_COLOUR_2}The Blond Sailor: (Traditional) +STR_2872 :{WINDOW_COLOUR_2}Overture - Poet and Peasant: (Suppe) non copyright +STR_2873 :{WINDOW_COLOUR_2}Waltz Medley: (Johann Strauss) non copyright +STR_2874 :{WINDOW_COLOUR_2}Bella Bella Bimba: (Traditional) +STR_2875 :{WINDOW_COLOUR_2}Original recordings (P) 1976 C.J.Mears Organization, used with consent +STR_2876 :{WINDOW_COLOUR_2}RollerCoaster Tycoon 2 Title Music: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2877 :{WINDOW_COLOUR_2}Dodgems Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2878 :{WINDOW_COLOUR_2}Mid Summer's Heat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2879 :{WINDOW_COLOUR_2}Pharaoh's Tomb: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2880 :{WINDOW_COLOUR_2}Caesar's March: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2881 :{WINDOW_COLOUR_2}Drifting To Heaven: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2882 :{WINDOW_COLOUR_2}Invaders: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2883 :{WINDOW_COLOUR_2}Eternal Toybox: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2884 :{WINDOW_COLOUR_2}Jungle Juice: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2885 :{WINDOW_COLOUR_2}Ninja's Noodles: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2886 :{WINDOW_COLOUR_2}Voyage to Andromeda: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2887 :{WINDOW_COLOUR_2}Brimble's Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2888 :{WINDOW_COLOUR_2}Atlantis: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2889 :{WINDOW_COLOUR_2}Wild West Kid: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2890 :{WINDOW_COLOUR_2}Vampire's Lair: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2891 :{WINDOW_COLOUR_2}Blockbuster: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2892 :{WINDOW_COLOUR_2}Airtime Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2893 :{WINDOW_COLOUR_2}Searchlight Rag: (Scott Joplin/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2894 :{WINDOW_COLOUR_2}Flight of Fantasy: (Steve Blenkinsopp) copyright {COPYRIGHT} Chris Sawyer +STR_2895 :{WINDOW_COLOUR_2}Big Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2896 :{WINDOW_COLOUR_2}Hypothermia: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2897 :{WINDOW_COLOUR_2}Last Sleigh Ride: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2898 :{WINDOW_COLOUR_2}Pipes of Glencairn: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2899 :{WINDOW_COLOUR_2}Traffic Jam: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2900 :{WINDOW_COLOUR_2} +STR_2901 :{WINDOW_COLOUR_2}(Samples courtesy of Spectrasonics {ENDQUOTES}Liquid Grooves{ENDQUOTES}) +STR_2902 :{WINDOW_COLOUR_2}Toccata: (C.M.Widor, played by Peter James Adcock) recording {COPYRIGHT} Chris Sawyer +STR_2903 :{WINDOW_COLOUR_2}Space Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2904 :{WINDOW_COLOUR_2}Manic Mechanic: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2905 :{WINDOW_COLOUR_2}Techno Torture: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2906 :{WINDOW_COLOUR_2}Sweat Dreams: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2907 :{WINDOW_COLOUR_2}What shall we do with the Drunken Sailor: (Anon/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2908 :{WINDOW_COLOUR_2}Infogrames Interactive +STR_2909 :{WINDOW_COLOUR_2}Senior Producer: Thomas J. Zahorik +STR_2910 :{WINDOW_COLOUR_2}Executive Producer: Bill Levay +STR_2911 :{WINDOW_COLOUR_2}Senior Marketing Product Manager: Scott Triola +STR_2912 :{WINDOW_COLOUR_2}V.P. of Product Development: Scott Walker +STR_2913 :{WINDOW_COLOUR_2}General Manager: John Hurlbut +STR_2914 :{WINDOW_COLOUR_2}Director of Quality Assurance: Michael Craighead +STR_2915 :{WINDOW_COLOUR_2}Q.A. Certification Manager: Kurt Boutin +STR_2916 :{WINDOW_COLOUR_2}Q.A. Certification Lead: Mark Huggins +STR_2917 :{WINDOW_COLOUR_2}Testers: Dena Irene Fitzgerald, Scott Rollins, Christopher McPhail +STR_2918 :{WINDOW_COLOUR_2}Clif McClure, Erik Maramaldi, Erik Jeffery +STR_2919 :{WINDOW_COLOUR_2}Director of Marketing: Ann Marie Bland +STR_2920 :{WINDOW_COLOUR_2}Manager of Creative Services: Steve Martin +STR_2921 :{WINDOW_COLOUR_2}Manager of Editorial & Documentation Services: Elizabeth Mackney +STR_2922 :{WINDOW_COLOUR_2}Graphic Designer: Paul Anselmi +STR_2923 :{WINDOW_COLOUR_2}Copywriter: Kurt Carlson +STR_2924 :{WINDOW_COLOUR_2}Special Thanks to: Peter Matiss +STR_2925 :{WINDOW_COLOUR_2}Engineering Specialist: Ken Edwards +STR_2926 :{WINDOW_COLOUR_2}Engineering Services Manager: Luis Rivas +STR_2927 :{WINDOW_COLOUR_2}Lead Compatibility Analyst: Geoffrey Smith +STR_2928 :{WINDOW_COLOUR_2}Compatibility Analysts: Jason Cordero, Burke McQuinn, Kim Jardin +STR_2929 :{WINDOW_COLOUR_2}Lead Tester: Daniel Frisoli +STR_2930 :{WINDOW_COLOUR_2}Senior Tester: Matt Pantaleoni +STR_2931 :{WINDOW_COLOUR_2} +STR_2932 :{WINDOW_COLOUR_2} +STR_2933 :{WINDOW_COLOUR_2} +STR_2934 :{WINDOW_COLOUR_2} +STR_2935 :{WINDOW_COLOUR_2} +STR_2936 :{WINDOW_COLOUR_2} +STR_2937 :{WINDOW_COLOUR_2} +STR_2938 :{WINDOW_COLOUR_2} +STR_2939 :{WINDOW_COLOUR_2} +STR_2940 :{WINDOW_COLOUR_2} +STR_2941 :{WINDOW_COLOUR_2} +STR_2942 :{WINDOW_COLOUR_2} +STR_2943 :{WINDOW_COLOUR_2} +STR_2944 :{WINDOW_COLOUR_2} +STR_2945 :{WINDOW_COLOUR_2} +STR_2946 :{WINDOW_COLOUR_2} +STR_2947 :{WINDOW_COLOUR_2} +STR_2948 :{WINDOW_COLOUR_2} +STR_2949 :{WINDOW_COLOUR_2} +STR_2950 :{WINDOW_COLOUR_2} +STR_2951 :{WINDOW_COLOUR_2} +STR_2952 :{WINDOW_COLOUR_2} +STR_2953 :{WINDOW_COLOUR_2} +STR_2954 :{WINDOW_COLOUR_2} +STR_2955 :{WINDOW_COLOUR_2} +STR_2956 :{WINDOW_COLOUR_2} +STR_2957 :{WINDOW_COLOUR_2} +STR_2958 :{WINDOW_COLOUR_2} +STR_2959 :{WINDOW_COLOUR_2} +STR_2960 :{WINDOW_COLOUR_2} +STR_2961 :{WINDOW_COLOUR_2} +STR_2962 :{WINDOW_COLOUR_2} +STR_2963 :{WINDOW_COLOUR_2} +STR_2964 :{WINDOW_COLOUR_2} +STR_2965 :{WINDOW_COLOUR_2} +STR_2966 : +STR_2967 : +STR_2968 : +STR_2969 :Use of this product is subject to the terms of a licence agreement +STR_2970 :found in the product's {OPENQUOTES}ReadMe{ENDQUOTES} file and in the manual +STR_2971 :Main colour scheme +STR_2972 :Alternative colour scheme 1 +STR_2973 :Alternative colour scheme 2 +STR_2974 :Alternative colour scheme 3 +STR_2975 :{SMALLFONT}{BLACK}Select which colour scheme to change, or paint ride with +STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected colour scheme +STR_2977 :Staff member name +STR_2978 :Enter new name for this member of staff: +STR_2979 :Can't name staff member... +STR_2980 :Too many banners in game +STR_2981 :{RED}No entry - - +STR_2982 :Banner text +STR_2983 :Enter new text for this banner: +STR_2984 :Can't set new text for banner... +STR_2985 :Banner +STR_2986 :{SMALLFONT}{BLACK}Change text on banner +STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for 遊客s +STR_2988 :{SMALLFONT}{BLACK}Demolish this banner +STR_2989 :{SMALLFONT}{BLACK}Select main colour +STR_2990 :{SMALLFONT}{BLACK}Select text colour +STR_2991 :Sign +STR_2992 :Sign text +STR_2993 :Enter new text for this sign: +STR_2994 :{SMALLFONT}{BLACK}Change text on sign +STR_2995 :{SMALLFONT}{BLACK}Demolish this sign +STR_2996 :{BLACK}ABC +STR_2997 :{GREY}ABC +STR_2998 :{WHITE}ABC +STR_2999 :{RED}ABC +STR_3000 :{GREEN}ABC +STR_3001 :{YELLOW}ABC +STR_3002 :{TOPAZ}ABC +STR_3003 :{CELADON}ABC +STR_3004 :{BABYBLUE}ABC +STR_3005 :{PALELAVENDER}ABC +STR_3006 :{PALEGOLD}ABC +STR_3007 :{LIGHTPINK}ABC +STR_3008 :{PEARLAQUA}ABC +STR_3009 :{PALESILVER}ABC +STR_3010 :Unable to load file... +STR_3011 :File contains invalid data +STR_3012 :Dodgems beat style +STR_3013 :Fairground organ style +STR_3014 :Roman fanfare style +STR_3015 :Oriental style +STR_3016 :Martian style +STR_3017 :Jungle drums style +STR_3018 :Egyptian style +STR_3019 :Toyland style +STR_3020 : +STR_3021 :Space style +STR_3022 :Horror style +STR_3023 :Techno style +STR_3024 :Gentle style +STR_3025 :Summer style +STR_3026 :Water style +STR_3027 :Wild west style +STR_3028 :Jurassic style +STR_3029 :Rock style +STR_3030 :Ragtime style +STR_3031 :Fantasy style +STR_3032 :Rock style 2 +STR_3033 :Ice style +STR_3034 :Snow style +STR_3035 :Custom music 1 +STR_3036 :Custom music 2 +STR_3037 :Medieval style +STR_3038 :Urban style +STR_3039 :Organ style +STR_3040 :Mechanical style +STR_3041 :Modern style +STR_3042 :Pirates style +STR_3043 :Rock style 3 +STR_3044 :Candy style +STR_3045 :{SMALLFONT}{BLACK}Select style of music to play +STR_3046 :This ride cannot be modified +STR_3047 :Local authority forbids demolition or modifications to this ride +STR_3048 :Marketing campaigns forbidden by local authority +STR_3049 :Golf hole A +STR_3050 :Golf hole B +STR_3051 :Golf hole C +STR_3052 :Golf hole D +STR_3053 :Golf hole E +STR_3054 :Loading... +STR_3055 :White +STR_3056 :Translucent +STR_3057 :{WINDOW_COLOUR_2}Construction Marker: +STR_3058 :Brick walls +STR_3059 :Hedges +STR_3060 :Ice blocks +STR_3061 :Wooden fences +STR_3062 :{SMALLFONT}{BLACK}Standard roller coaster track +STR_3063 :{SMALLFONT}{BLACK}Water channel (track submerged) +STR_3064 :Beginner Parks +STR_3065 :Challenging Parks +STR_3066 :Expert Parks +STR_3067 :{OPENQUOTES}Real{ENDQUOTES} Parks +STR_3068 :Other Parks +STR_3069 :Top Section +STR_3070 :Slope to Level +STR_3071 :{WINDOW_COLOUR_2}Same price throughout park +STR_3072 :{SMALLFONT}{BLACK}Select whether this price is used throughout the entire park +STR_3073 :{RED}WARNING: Your park rating has dropped below 700 !{NEWLINE}If you haven't raised the park rating in 4 weeks, your park will be closed down +STR_3074 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have 3 weeks to raise the park rating +STR_3075 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have only 2 weeks to raise the park rating, or your park will be closed down +STR_3076 :{RED}FINAL WARNING: Your park rating is still below 700 !{NEWLINE}In just 7 days your park will be closed down unless you can raise the rating +STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! +STR_3078 :Plain entrance +STR_3079 :Wooden entrance +STR_3080 :Canvas tent entrance +STR_3081 :Castle entrance (grey) +STR_3082 :Castle entrance (brown) +STR_3083 :Jungle entrance +STR_3084 :Log cabin entrance +STR_3085 :Classical/Roman entrance +STR_3086 :Abstract entrance +STR_3087 :Snow/Ice entrance +STR_3088 :Pagoda entrance +STR_3089 :Space entrance +STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station +STR_3091 :You are not allowed to remove this section! +STR_3092 :You are not allowed to move or modify the station for this ride! +STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} +STR_3094 :N/A +STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: +STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed +STR_3098 :Can't change lift hill speed... +STR_3099 :{SMALLFONT}{BLACK}Select colour +STR_3100 :{SMALLFONT}{BLACK}Select second colour +STR_3101 :{SMALLFONT}{BLACK}Select third colour +STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape +STR_3103 :Can't re-paint this... +STR_3104 :{SMALLFONT}{BLACK}List rides +STR_3105 :{SMALLFONT}{BLACK}List shops and stalls +STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other 遊客 facilities +STR_3107 :Close +STR_3108 :Test +STR_3109 :Open +STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16} +STR_3111 :{SMALLFONT}{BLACK}Click on design to build it +STR_3112 :{SMALLFONT}{BLACK}Click on design to rename or delete it +STR_3113 :Select a different design +STR_3114 :{SMALLFONT}{BLACK}Go back to design selection window +STR_3115 :{SMALLFONT}{BLACK}Save track design +STR_3116 :{SMALLFONT}{BLACK}Save track design (Not possible until ride has been tested and statistics have been generated) +STR_3117 :{BLACK}Calling mechanic... +STR_3118 :{BLACK}{STRINGID} is heading for the ride +STR_3119 :{BLACK}{STRINGID} is fixing the ride +STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride +STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy +STR_3122 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} 遊客 +STR_3123 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} 遊客s +STR_3124 :Broken {STRINGID} +STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% +STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% +STR_3127 :{WINDOW_COLOUR_2}Nausea Factor: {BLACK}+{COMMA16}% +STR_3128 :Save Track Design +STR_3129 :Save Track Design with Scenery +STR_3130 :Save +STR_3131 :Cancel +STR_3132 :{BLACK}Click items of scenery to select them to be saved with track design... +STR_3133 :Unable to build this on a slope +STR_3134 :{RED}(Design includes scenery which is unavailable) +STR_3135 :{RED}(Vehicle design unavailable - Ride performance may be affected) +STR_3136 :Warning: This design will be built with an alternative vehicle type and may not perform as expected +STR_3137 :Select Nearby Scenery +STR_3138 :Reset Selection +STR_3139 :Cable lift unable to work in this operating mode +STR_3140 :Cable lift hill must start immediately after station +STR_3141 :Multi-circuit per ride not possible with cable lift hill +STR_3142 :{WINDOW_COLOUR_2}Capacity: {BLACK}{STRINGID} +STR_3143 :{SMALLFONT}{BLACK}Show people on map +STR_3144 :{SMALLFONT}{BLACK}Show rides and stalls on map +STR_3145 :{SMALLFONT}{BLACK}Scroll {STRINGID} left +STR_3146 :{SMALLFONT}{BLACK}Scroll {STRINGID} right +STR_3147 :{SMALLFONT}{BLACK}Scroll {STRINGID} left fast +STR_3148 :{SMALLFONT}{BLACK}Scroll {STRINGID} right fast +STR_3149 :{SMALLFONT}{BLACK}Scroll {STRINGID} left/right +STR_3150 :{SMALLFONT}{BLACK}Scroll {STRINGID} up +STR_3151 :{SMALLFONT}{BLACK}Scroll {STRINGID} down +STR_3152 :{SMALLFONT}{BLACK}Scroll {STRINGID} up fast +STR_3153 :{SMALLFONT}{BLACK}Scroll {STRINGID} down fast +STR_3154 :{SMALLFONT}{BLACK}Scroll {STRINGID} up/down +STR_3155 : +STR_3156 : +STR_3157 :map +STR_3158 :graph +STR_3159 :list +STR_3160 :RollerCoaster Tycoon 2: Starting for the first time... +STR_3161 :RollerCoaster Tycoon 2: Checking object files... +STR_3162 :Unable to allocate enough memory +STR_3163 :Installing new data: +STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) +STR_3165 : +STR_3166 :{BLACK}(ID: +STR_3167 :{WINDOW_COLOUR_2}Includes: {BLACK}{COMMA16} objects +STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} +STR_3169 :Data for the following object not found: +STR_3170 :Not enough space for graphics +STR_3171 :Too many objects of this type selected +STR_3172 :The following object must be selected first: {STRING} +STR_3173 :This object is currently in use +STR_3174 :This object is required by another object +STR_3175 :This object is always required +STR_3176 :Unable to select this object +STR_3177 :Unable to de-select this object +STR_3178 :At least one path object must be selected +STR_3179 :At least one ride vehicle/attraction object must be selected +STR_3180 :Invalid selection of objects +STR_3181 :Object Selection - {STRINGID} +STR_3182 :Park entrance type must be selected +STR_3183 :Water type must be selected +STR_3184 :Ride Vehicles/Attractions +STR_3185 :Small Scenery +STR_3186 :Large Scenery +STR_3187 :Walls/Fences +STR_3188 :Path Signs +STR_3189 :Footpaths +STR_3190 :Path Extras +STR_3191 :Scenery Groups +STR_3192 :Park Entrance +STR_3193 :Water +STR_3194 :Scenario Description +STR_3195 :Invention List +STR_3196 :{WINDOW_COLOUR_2}Research Group: {BLACK}{STRINGID} +STR_3197 :{WINDOW_COLOUR_2}Items pre-invented at start of game: +STR_3198 :{WINDOW_COLOUR_2}Items to invent during game: +STR_3199 :Random Shuffle +STR_3200 :{SMALLFONT}{BLACK}Randomly shuffle the list of items to invent during the game +STR_3201 :Object Selection +STR_3202 :Landscape Editor +STR_3203 :Invention List Set Up +STR_3204 :Options Selection +STR_3205 :Objective Selection +STR_3206 :Save Scenario +STR_3207 :Roller Coaster Designer +STR_3208 :Track Designs Manager +STR_3209 :Back to Previous Step: +STR_3210 :Forward to Next Step: +STR_3211 :{WINDOW_COLOUR_2}Map size: +STR_3212 :{POP16}{COMMA16} x {PUSH16}{COMMA16} +STR_3213 :Can't decrease map size any further +STR_3214 :Can't increase map size any further +STR_3215 :Too close to edge of map +STR_3216 :{SMALLFONT}{BLACK}Select park-owned land etc. +STR_3217 :Land Owned +STR_3218 :Construction Rights Owned +STR_3219 :Land For Sale +STR_3220 :Construction Rights For Sale +STR_3221 :{SMALLFONT}{BLACK}Set land to be owned by the park +STR_3222 :{SMALLFONT}{BLACK}Set construction rights only to be owned by the park +STR_3223 :{SMALLFONT}{BLACK}Set land to be available to purchase by the park +STR_3224 :{SMALLFONT}{BLACK}Set construction rights to be available to purchase by the park +STR_3225 :{SMALLFONT}{BLACK}Toggle on/off building a random cluster of objects around the selected position +STR_3226 :{SMALLFONT}{BLACK}Build park entrance +STR_3227 :Too many park entrances! +STR_3228 :{SMALLFONT}{BLACK}Set starting positions for people +STR_3229 :Block Brakes cannot be used directly after station +STR_3230 :Block Brakes cannot be used directly after each other +STR_3231 :Block Brakes cannot be used directly after the top of this lift hill +STR_3232 :Options - Financial +STR_3233 :Options - 遊客s +STR_3234 :Options - Park +STR_3235 :{SMALLFONT}{BLACK}Show financial options +STR_3236 :{SMALLFONT}{BLACK}Show 遊客 options +STR_3237 :{SMALLFONT}{BLACK}Show park options +STR_3238 :No Money +STR_3239 :{SMALLFONT}{BLACK}Make this park a 'no money' park with no financial restrictions +STR_3240 :{WINDOW_COLOUR_2}Initial cash: +STR_3241 :{WINDOW_COLOUR_2}Initial loan: +STR_3242 :{WINDOW_COLOUR_2}Maximum loan size: +STR_3243 :{WINDOW_COLOUR_2}Annual interest rate: +STR_3244 :Forbid marketing campaigns +STR_3245 :{SMALLFONT}{BLACK}Forbid advertising, promotional schemes, and other marketing campaigns +STR_3246 :{WINDOW_COLOUR_2}{CURRENCY} +STR_3247 :{WINDOW_COLOUR_2}{COMMA16}% +STR_3248 :Can't increase initial cash any further! +STR_3249 :Can't reduce initial cash any further! +STR_3250 :Can't increase initial loan any further! +STR_3251 :Can't reduce initial loan any further! +STR_3252 :Can't increase maximum loan size any further! +STR_3253 :Can't reduce maximum loan size any further! +STR_3254 :Can't increase interest rate any further! +STR_3255 :Can't reduce interest rate any further! +STR_3256 :遊客s prefer less intense rides +STR_3257 :{SMALLFONT}{BLACK}Select whether 遊客s should generally prefer less intense rides only +STR_3258 :遊客s prefer more intense rides +STR_3259 :{SMALLFONT}{BLACK}Select whether 遊客s should generally prefer more intense rides only +STR_3260 :{WINDOW_COLOUR_2}Cash per 遊客 (average): +STR_3261 :{WINDOW_COLOUR_2}遊客s initial happiness: +STR_3262 :{WINDOW_COLOUR_2}遊客s initial hunger: +STR_3263 :{WINDOW_COLOUR_2}遊客s initial thirst: +STR_3264 :Can't increase this any further! +STR_3265 :Can't reduce this any further! +STR_3266 :{SMALLFONT}{BLACK}Select how this park charges for entrance and rides +STR_3267 :Forbid tree removal +STR_3268 :{SMALLFONT}{BLACK}Forbid tall trees being removed +STR_3269 :Forbid landscape changes +STR_3270 :{SMALLFONT}{BLACK}Forbid any changes to the landscape +STR_3271 :Forbid high construction +STR_3272 :{SMALLFONT}{BLACK}Forbid any tall construction +STR_3273 :Park rating higher difficult level +STR_3274 :{SMALLFONT}{BLACK}Make the park rating value more challenging +STR_3275 :遊客 generation higher difficult level +STR_3276 :{SMALLFONT}{BLACK}Make it more difficult to attract 遊客s to the park +STR_3277 :{WINDOW_COLOUR_2}Cost to buy land: +STR_3278 :{WINDOW_COLOUR_2}Cost to buy construction rights: +STR_3279 :Free park entry / Pay per ride +STR_3280 :Pay to enter park / Free rides +STR_3281 :{WINDOW_COLOUR_2}Entry price: +STR_3282 :{SMALLFONT}{BLACK}Select objective and park name +STR_3283 :{SMALLFONT}{BLACK}Select rides to be preserved +STR_3284 :Objective Selection +STR_3285 :Preserved Rides +STR_3286 :{SMALLFONT}{BLACK}Select objective for this scenario +STR_3287 :{WINDOW_COLOUR_2}Objective: +STR_3288 :{SMALLFONT}{BLACK}Select climate +STR_3289 :{WINDOW_COLOUR_2}Climate: +STR_3290 :Cool and wet +STR_3291 :Warm +STR_3292 :Hot and dry +STR_3293 :Cold +STR_3294 :Change... +STR_3295 :{SMALLFONT}{BLACK}Change name of park +STR_3296 :{SMALLFONT}{BLACK}Change name of scenario +STR_3297 :{SMALLFONT}{BLACK}Change detail notes about park / scenario +STR_3298 :{WINDOW_COLOUR_2}Park Name: {BLACK}{STRINGID} +STR_3299 :{WINDOW_COLOUR_2}Park/Scenario Details: +STR_3300 :{WINDOW_COLOUR_2}Scenario Name: {BLACK}{STRINGID} +STR_3301 :{WINDOW_COLOUR_2}Objective Date: +STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR} +STR_3303 :{WINDOW_COLOUR_2}Number of 遊客s: +STR_3304 :{WINDOW_COLOUR_2}Park value: +STR_3305 :{WINDOW_COLOUR_2}Monthly income: +STR_3306 :{WINDOW_COLOUR_2}Monthly profit: +STR_3307 :{WINDOW_COLOUR_2}Minimum length: +STR_3308 :{WINDOW_COLOUR_2}Excitement rating: +STR_3309 :{WINDOW_COLOUR_2}{COMMA16} +STR_3310 :{WINDOW_COLOUR_2}{LENGTH} +STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32} +STR_3312 :{WINDOW_COLOUR_2}Rides/attractions under a preservation order: +STR_3313 :Scenario Name +STR_3314 :Enter name for scenario: +STR_3315 :Park/Scenario Details +STR_3316 :Enter description of this scenario: +STR_3317 :No details yet +STR_3318 :{SMALLFONT}{BLACK}Select which group this scenario appears in +STR_3319 :{WINDOW_COLOUR_2}Scenario Group: +STR_3320 :Unable to save scenario file... +STR_3321 :New objects installed successfully +STR_3322 :{WINDOW_COLOUR_2}Objective: {BLACK}{STRINGID} +STR_3323 :Missing object data, ID: +STR_3324 :Requires Add-On Pack: +STR_3325 :Requires an Add-On Pack +STR_3326 :{WINDOW_COLOUR_2}(no image) +STR_3327 :Starting positions for people not set +STR_3328 :Can't advance to next editor stage... +STR_3329 :Park entrance not yet built +STR_3330 :Park must own some land +STR_3331 :Path from park entrance to map edge either not complete or too complex - Path must be single-width with as few junctions and corners as possible +STR_3332 :Park entrance is the wrong way round or has no path leading to the map edge +STR_3333 :Export plug-in objects with saved games +STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data +STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles +STR_3336 :Track Designs Manager - Select Ride Type +STR_3337 :Six Flags Park +STR_3338 :{BLACK}Custom-designed layout +STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout +STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout +STR_3341 :{SMALLFONT}{BLACK}Game tools +STR_3342 :Scenario Editor +STR_3343 :Convert Saved Game to Scenario +STR_3344 :Roller Coaster Designer +STR_3345 :Track Designs Manager +STR_3346 :Can't save track design... +STR_3347 :Ride is too large, contains too many elements, or scenery is too spread out +STR_3348 :Rename +STR_3349 :Delete +STR_3350 :Track design name +STR_3351 :Enter new name for this track design: +STR_3352 :Can't rename track design... +STR_3353 :New name contains invalid characters +STR_3354 :Another file exists with this name, or file is write-protected +STR_3355 :File is write-protected or locked +STR_3356 :Delete File +STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ? +STR_3358 :Can't delete track design... +STR_3359 :{BLACK}No track designs of this type +STR_3360 :Warning! +STR_3361 :Too many track designs of this type - Some will not be listed. +STR_3362 :Forced Software Buffer Mixing +STR_3363 :{SMALLFONT}{BLACK}Select this option to improve performance if the game pauses slightly when sounds start or interference is heard +STR_3364 :Advanced +STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups +STR_3366 :{BLACK}= Ride +STR_3367 :{BLACK}= Food Stall +STR_3368 :{BLACK}= Drink Stall +STR_3369 :{BLACK}= Souvenir Stall +STR_3370 :{BLACK}= Info. Kiosk +STR_3371 :{BLACK}= First Aid +STR_3372 :{BLACK}= Cash Machine +STR_3373 :{BLACK}= Toilet +STR_3374 :Warning: Too many objects selected! +STR_3375 :Not all objects in this scenery group could be selected +STR_3376 :Install new track design... +STR_3377 :{SMALLFONT}{BLACK}Install a new track design file +STR_3378 :Install +STR_3379 :Cancel +STR_3380 :Unable to install this track design... +STR_3381 :File is not compatible or contains invalid data +STR_3382 :File copy failed +STR_3383 :Select new name for track design +STR_3384 :An existing track design already has this name - Please select a new name for this design: +STR_3385 :Beginners Tutorial +STR_3386 :Custom Rides Tutorial +STR_3387 :Roller Coaster Building Tutorial +STR_3388 :Unable to switch to selected mode +STR_3389 :Unable to select additional item of scenery... +STR_3390 :Too many items selected +STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... +STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... +STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... +STR_3394 :{SMALLFONT}{BLACK}You can also rotate the view in 90 degree steps... +STR_3395 :{SMALLFONT}{BLACK}Building anything at this scale is a bit difficult, so let's zoom the view back in again... +STR_3396 :{SMALLFONT}{BLACK}Let's build a simple ride to get the park started... +STR_3397 :{SMALLFONT}{BLACK}The white 'ghost' image shows where the ride will be built. We'll move the pointer to select the position then click to build it... +STR_3398 :{SMALLFONT}{BLACK}Rides need an entrance and an exit. We'll move the pointer to a square on the edge of the ride and then click to build first the entrance and then the exit... +STR_3399 :{SMALLFONT}{BLACK}We need to build footpaths to allow 遊客s to reach our new ride... +STR_3400 :{SMALLFONT}{BLACK}For the path to the ride entrance we'll use a special 'queue line' path... +STR_3401 :{SMALLFONT}{BLACK}For the exit path, just an 'ordinary' path will do... +STR_3402 :{SMALLFONT}{BLACK}Right, lets open the ride! To open the ride we click the flag icon on the ride window and select 'open'... +STR_3403 :{SMALLFONT}{BLACK}But where are the 遊客s? +STR_3404 :{SMALLFONT}{BLACK}Oh - The park is still closed! Right - Let's open it... +STR_3405 :{SMALLFONT}{BLACK}While we're waiting for our first 遊客s, let's build some scenery... +STR_3406 :{SMALLFONT}{BLACK}Here's our empty park. We're going to build a simple custom-designed ride... +STR_3407 :{SMALLFONT}{BLACK}First we need to choose a starting position... +STR_3408 :{SMALLFONT}{BLACK}The section of track we've just built is a 'station platform', to allow 遊客s to get on and off the ride... +STR_3409 :{SMALLFONT}{BLACK}We'll extend the platform a bit by adding a couple more station platform sections... +STR_3410 :{SMALLFONT}{BLACK}The icons at the top of the construction window let you choose different track pieces to add... +STR_3411 :{SMALLFONT}{BLACK}We'll select a left-hand curve... +STR_3412 :{SMALLFONT}{BLACK}The curve hasn't been built yet, but the white ghost image shows where it will be built. Clicking the large 'build this' icon actually builds the track... +STR_3413 :{SMALLFONT}{BLACK}Now we want to build straight track, so we click the straight track icon... +STR_3414 :{SMALLFONT}{BLACK}Now that the circuit is complete, we need to build the ride entrance and exit... +STR_3415 :{SMALLFONT}{BLACK}Let's test our ride to check it works... +STR_3416 :{SMALLFONT}{BLACK}White it's being tested, we'll build the queue line and exit path... +STR_3417 :{SMALLFONT}{BLACK}OK - Let's open the park and the ride... +STR_3418 :{SMALLFONT}{BLACK}Our new ride isn't very exciting - Perhaps we should add some scenery? +STR_3419 :{SMALLFONT}{BLACK}To build scenery above other scenery or in mid-air, hold down the SHIFT key and move the mouse to select the height... +STR_3420 :{SMALLFONT}{BLACK}Some types of scenery can be re-painted after it's built... +STR_3421 :{SMALLFONT}{BLACK}Let's add some music to the ride... +STR_3422 :{SMALLFONT}{BLACK}Let's build a roller coaster ! +STR_3423 :{SMALLFONT}{BLACK}There are loads of pre-designed coasters, but we're going to build our own custom design... +STR_3424 :{SMALLFONT}{BLACK}That's the station platform built. Now we need a lift hill... +STR_3425 :{SMALLFONT}{BLACK}Roller coaster trains aren't powered, so a 'chain lift' is needed to pull the train up the first hill... +STR_3426 :{SMALLFONT}{BLACK}That's the lift hill complete - Now for the first drop... +STR_3427 :{SMALLFONT}{BLACK}Those curves are a bad idea - The riders will be flung to the sides by the lateral G forces as the train hurtles around... +STR_3428 :{SMALLFONT}{BLACK}Banking the curves will improve the ride - Riders will be pushed down into their seats instead of flung to the sides... +STR_3429 :{SMALLFONT}{BLACK}No - That won't work! Look at the height marks - The second hill is taller than the lift hill... +STR_3430 :{SMALLFONT}{BLACK}To ensure the train makes it around, each hill should be slightly smaller than the previous one... +STR_3431 :{SMALLFONT}{BLACK}That's better - Our train should make it up that hill now! Let's try some more twisted track... +STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve and station, so let's add some brakes... +STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow two trains to operate more safely on the circuit... +STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! +STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let 遊客s onto our new roller coaster... +STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... +STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape +STR_3438 :Unable to remove all scenery from here... +STR_3439 :Clear Scenery +STR_3440 :Page 1 +STR_3441 :Page 2 +STR_3442 :Page 3 +STR_3443 :Page 4 +STR_3444 :Page 5 +STR_3445 :Set Patrol Area +STR_3446 :Cancel Patrol Area + +# New strings, cleaner +STR_5120 :Show finances button on toolbar +STR_5121 :Show research button on toolbar +STR_5122 :Select rides by track type (like in RCT1) +STR_5123 :Renew rides +STR_5124 :No Six Flags +STR_5125 :All destructable +STR_5126 :Random title music +STR_5127 :{SMALLFONT}{BLACK}Disable land elevation +STR_5128 :Selection size +STR_5129 :Enter selection size between {COMMA16} and {COMMA16} +STR_5130 :Map size +STR_5131 :Enter map size between {COMMA16} and {COMMA16} +STR_5132 :Fix all rides +STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights +STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights +STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights +STR_5136 :Land rights +STR_5137 :Allow lift hill and launch speeds{NEWLINE}up to {VELOCITY} +STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} +STR_5139 :{WHITE}{STRINGID} +STR_5140 :Disable brakes failure +STR_5141 :Disable all breakdowns +STR_5142 :Normal Speed +STR_5143 :Quick Speed +STR_5144 :Fast Speed +STR_5145 :Turbo Speed +STR_5146 :Hyper Speed +STR_5147 :Show cheats button on toolbar +STR_5148 :{SMALLFONT}{BLACK}Change the game speed +STR_5149 :{SMALLFONT}{BLACK}Open the cheats window +STR_5150 :Enable debugging tools +STR_5151 :, +STR_5152 :. +STR_5153 :Edit Themes... +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 +STR_5157 :Unlock all prices +STR_5158 :Quit to menu +STR_5159 :Exit OpenRCT2 +STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} +STR_5161 :Date Format: +STR_5162 :Day/Month/Year +STR_5163 :Month/Day/Year +STR_5164 :Twitch Channel name +STR_5165 :Name peeps after followers +STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers +STR_5167 :Track follower peeps +STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for 遊客s named after channel's Twitch followers +STR_5169 :Name peeps after people in Twitch chat +STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat +STR_5171 :Track chat peeps +STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for 遊客s named after Twitch chat participants +STR_5173 :Pull Twitch chat as news +STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications +STR_5175 :Input the name of your Twitch channel +STR_5176 :Enable Twitch integration +STR_5177 :Fullscreen mode: +STR_5178 :{SMALLFONT}{BLACK}Show financial cheats +STR_5179 :{SMALLFONT}{BLACK}Show 遊客 cheats +STR_5180 :{SMALLFONT}{BLACK}Show park cheats +STR_5181 :{SMALLFONT}{BLACK}Show ride cheats +STR_5182 :{INT32} +STR_5183 :Base height +STR_5184 :Enter base height between {COMMA16} and {COMMA16} +STR_5185 :Water level +STR_5186 :Enter water level between {COMMA16} and {COMMA16} +STR_5187 :Finances +STR_5188 :New Campaign +STR_5189 :Research +STR_5190 :Map +STR_5191 :Viewport +STR_5192 :Recent News +STR_5193 :Land +STR_5194 :Water +STR_5195 :Clear Scenery +STR_5196 :Land Rights +STR_5197 :Scenery +STR_5198 :Footpath +STR_5199 :Ride Construction +STR_5200 :Track Design Place +STR_5201 :New Ride +STR_5202 :Track Design Selection +STR_5203 :Ride +STR_5204 :Ride List +STR_5205 :遊客 +STR_5206 :遊客 List +STR_5207 :Staff +STR_5208 :Staff List +STR_5209 :Banner +STR_5210 :Object Selection +STR_5211 :Invention List +STR_5212 :Scenario Options +STR_5213 :Objective Options +STR_5214 :Map Generation +STR_5215 :Track Design Manager +STR_5216 :Track Design Manager List +STR_5217 :Cheats +STR_5218 :Themes +STR_5219 :Options +STR_5220 :Keyboard Shortcuts +STR_5221 :Change Keyboard Shortcut +STR_5222 :Load/Save +STR_5223 :Save Prompt +STR_5224 :Demolish Ride Prompt +STR_5225 :Fire Staff Prompt +STR_5226 :Track Delete Prompt +STR_5227 :Save Overwrite Prompt +STR_5228 :{SMALLFONT}{BLACK}Main UI +STR_5229 :{SMALLFONT}{BLACK}Park +STR_5230 :{SMALLFONT}{BLACK}Tools +STR_5231 :{SMALLFONT}{BLACK}Rides and Peeps +STR_5232 :{SMALLFONT}{BLACK}Editors +STR_5233 :{SMALLFONT}{BLACK}Miscellaneous +STR_5234 :{SMALLFONT}{BLACK}Prompts +STR_5235 :{SMALLFONT}{BLACK}Settings +STR_5236 :Window: +STR_5237 :Palette: +STR_5238 :Current Theme: +STR_5239 :Duplicate +STR_5240 :Enter a name for the theme +STR_5241 :Can't change this theme +STR_5242 :Theme name already exists +STR_5243 :Invalid characters used +STR_5244 :Themes +STR_5245 :Top Toolbar +STR_5246 :Bottom Toolbar +STR_5247 :Track Editor Bottom Toolbar +STR_5248 :Scenario Editor Bottom Toolbar +STR_5249 :Title Menu Buttons +STR_5250 :Title Exit Button +STR_5251 :Title Options Button +STR_5252 :Title Scenario Selection +STR_5253 :Park Information +STR_5254 : +STR_5255 : +STR_5256 :Create a new theme to make changes to +STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one +STR_5258 :{SMALLFONT}{BLACK}Delete the current theme +STR_5259 :{SMALLFONT}{BLACK}Rename the current theme +STR_5260 :Giant Screenshot +STR_5261 :Filter +STR_5262 :Wacky Worlds +STR_5263 :Time Twister +STR_5264 :Custom +STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible +STR_5266 :{SMALLFONT}{BLACK}Display +STR_5267 :{SMALLFONT}{BLACK}Culture and Units +STR_5268 :{SMALLFONT}{BLACK}Audio +STR_5269 :{SMALLFONT}{BLACK}Controls +STR_5270 :{SMALLFONT}{BLACK}Miscellaneous +STR_5271 :{SMALLFONT}{BLACK}Twitch +STR_5272 :{SMALLFONT}{BLACK}Small Scenery +STR_5273 :{SMALLFONT}{BLACK}Large Scenery +STR_5274 :{SMALLFONT}{BLACK}Footpath +STR_5275 :Search for Objects +STR_5276 :Enter the name of an object to search for +STR_5277 :Clear +STR_5278 :Sandbox mode +STR_5279 :Sandbox mode off +STR_5280 :{SMALLFONT}{BLACK}Allow editing land ownership settings through the Map window and other options that are normally restricted to the Scenario Editor +STR_5281 :{SMALLFONT}{BLACK}Features +STR_5282 :RCT1 Ride Open/Close Lights +STR_5283 :RCT1 Park Open/Close Lights +STR_5284 :RCT1 Scenario Selection Font +STR_5285 :EXPLODE!!! +STR_5286 :{SMALLFONT}{BLACK}Makes some 遊客s explode +STR_5287 :Ride is already broken down +STR_5288 :Ride is closed +STR_5289 :No breakdowns available for this ride +STR_5290 :Fix ride +STR_5291 :Can't force breakdown +STR_5292 :{SMALLFONT}{BLACK}Force a breakdown +STR_5293 :{SMALLFONT}{BLACK}Close ride/attraction +STR_5294 :{SMALLFONT}{BLACK}Test ride/attraction +STR_5295 :{SMALLFONT}{BLACK}Open ride/attraction +STR_5296 :{SMALLFONT}{BLACK}Close park +STR_5297 :{SMALLFONT}{BLACK}Open park +STR_5298 :{RED}{STRINGID} +STR_5299 :{LIGHTPINK}{STRINGID} +STR_5300 :{SMALLFONT}{BLACK}Quick fire staff +STR_5301 :{MEDIUMFONT}{BLACK}Clear your loan +STR_5302 :Clear loan +STR_5303 :Allow building in pause mode +STR_5304 :Title Sequence: +STR_5305 :RollerCoaster Tycoon 1 +STR_5306 :RollerCoaster Tycoon 1 (AA) +STR_5307 :RollerCoaster Tycoon 1 (AA + LL) +STR_5308 :RollerCoaster Tycoon 2 +STR_5309 :OpenRCT2 +STR_5310 :Random +STR_5311 :{SMALLFONT}{BLACK}Debug tools +STR_5312 :Show console +STR_5313 :Show tile inspector +STR_5314 :Tile inspector +STR_5315 :Grass +STR_5316 :Sand +STR_5317 :Dirt +STR_5318 :Rock +STR_5319 :Martian +STR_5320 :Checkerboard +STR_5321 :Grass clumps +STR_5322 :Ice +STR_5323 :Grid (red) +STR_5324 :Grid (yellow) +STR_5325 :Grid (blue) +STR_5326 :Grid (green) +STR_5327 :Sand (dark) +STR_5328 :Sand (light) +STR_5329 :Checkerboard (inverted) +STR_5330 :Underground view +STR_5331 :Rock +STR_5332 :Wood (red) +STR_5333 :Wood (black) +STR_5334 :Ice +STR_5335 :Ride entrance +STR_5336 :Ride exit +STR_5337 :Park entrance +STR_5338 :Element type +STR_5339 :Base height +STR_5340 :Clearance height +STR_5341 :Flags +STR_5342 :Choose a map tile +STR_5343 :Automatically place staff +STR_5344 :Changelog +STR_5345 :Financial cheats +STR_5346 :遊客 cheats +STR_5347 :Ride cheats +STR_5348 :Park cheats +STR_5349 :{SMALLFONT}{BLACK}All Rides +STR_5350 :Max +STR_5351 :Min +STR_5352 :{BLACK}Happiness: +STR_5353 :{BLACK}Energy: +STR_5354 :{BLACK}Hunger: +STR_5355 :{BLACK}Thirst: +STR_5356 :{BLACK}Nausea: +STR_5357 :{BLACK}Nausea tolerance: +STR_5358 :{BLACK}Bathroom: +STR_5359 :Remove 遊客s +STR_5360 :{SMALLFONT}{BLACK}Removes all 遊客s from the map +STR_5361 :{BLACK}Give all 遊客s: +STR_5362 :{BLACK}Preferred intensity: +STR_5363 :> 1 +STR_5364 :< 15 +STR_5365 :{BLACK}Staff speed: +STR_5366 :Normal +STR_5367 :Fast +STR_5368 :Reset crash status +STR_5369 :Park parameters... +STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}遊客 generation and money. +STR_5371 :Object Selection +STR_5372 :Invert right mouse dragging +STR_5373 :Name {STRINGID} +STR_5374 :Date {STRINGID} +STR_5375 :{UP} +STR_5376 :{DOWN} +STR_5377 :{SMALLFONT}{BLACK}Saves +STR_5378 :{SMALLFONT}{BLACK}Script +STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command +STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence +STR_5381 :{SMALLFONT}{BLACK}Stop playing title sequence +STR_5382 :{SMALLFONT}{BLACK}Restart title sequence +STR_5383 :{SMALLFONT}{BLACK}Create a new title sequence based on the current one +STR_5384 :{SMALLFONT}{BLACK}Delete the current title sequence +STR_5385 :{SMALLFONT}{BLACK}Rename the current title sequence +STR_5386 :{SMALLFONT}{BLACK}Insert a new command +STR_5387 :{SMALLFONT}{BLACK}Edit the selected command +STR_5388 :{SMALLFONT}{BLACK}Delete the selected command +STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence +STR_5390 :{SMALLFONT}{BLACK}Move the selected command down +STR_5391 :{SMALLFONT}{BLACK}Move the selected command up +STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence +STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence +STR_5394 :{SMALLFONT}{BLACK}Rename the selected save +STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game +STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game +STR_5397 :Can only be used on the title screen +STR_5398 :Cannot edit title sequence while it's playing +STR_5399 :Press the stop button to coninue editing +STR_5400 :Can't change this title sequence +STR_5401 :Create a new title sequence to make changes to +STR_5402 :Failed to load title sequence +STR_5403 :There may be no Load or Wait command or a save may be invalid +STR_5404 :Name already exists +STR_5405 :Enter a name for the save +STR_5406 :Enter a name for the title sequence +STR_5407 :Add +STR_5408 :Remove +STR_5409 :Insert +STR_5410 :Edit +STR_5411 :Reload +STR_5412 :Skip to +STR_5413 :Load +STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :Load{MOVE_X}{87}{STRING} +STR_5416 :Load{MOVE_X}{87}No save selected +STR_5417 :Location +STR_5418 :Location{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :Rotate +STR_5420 :Rotate{MOVE_X}{87}{COMMA16} +STR_5421 :Zoom +STR_5422 :Zoom{MOVE_X}{87}{COMMA16} +STR_5423 :Wait +STR_5424 :Wait{MOVE_X}{87}{COMMA16} +STR_5425 :Restart +STR_5426 :End +STR_5427 :Coordinates: +STR_5428 :Counter-clockwise rotations: +STR_5429 :Zoom level: +STR_5430 :Seconds to wait: +STR_5431 :Save to load: +STR_5432 :Command: +STR_5433 :Title Sequences +STR_5434 :Command Editor +STR_5435 :Rename save +STR_5436 :Edit Title Sequences... +STR_5437 :No save selected +STR_5438 :Can't make changes while command editor is open +STR_5439 :A restart is used without a wait command +STR_5440 :Minimize fullscreen on focus loss +STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. Only{NEWLINE}toggleable in the title screen. diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 344538fd19..62e7f9dea6 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3592,8 +3592,8 @@ STR_5250 :Title Exit Button STR_5251 :Title Options Button STR_5252 :Title Scenario Selection STR_5253 :Park Information -STR_5254 :Add nausea -STR_5255 :{MEDIUMFONT}{BLACK}All peeps become nauseous +STR_5254 :Create +STR_5255 :{SMALLFONT}{BLACK}Create a new title sequence from scratch STR_5256 :Create a new theme to make changes to STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one STR_5258 :{SMALLFONT}{BLACK}Delete the current theme @@ -3777,6 +3777,17 @@ STR_5435 :Rename save STR_5436 :Edit Title Sequences... STR_5437 :No save selected STR_5438 :Can't make changes while command editor is open -STR_5439 :A restart is used without a wait command +STR_5439 :A wait command with at least 4 seconds is required with a restart command STR_5440 :Minimize fullscreen on focus loss STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. +STR_5442 :Force park rating: +STR_5443 :Speed{MOVE_X}{87}{STRINGID} +STR_5444 :Speed: +STR_5445 :Speed +STR_5446 :Get +STR_5447 :Type {STRINGID} +STR_5448 :Ride / Vehicle {STRINGID} +STR_5449 :Reduce game speed +STR_5450 :Increase game speed +STR_5451 :Open cheats window +STR_5452 :Toggle visibility of toolbars From c441ee2d1bf91f67e3b59eb0361226269e63f6c3 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 1 Jul 2015 15:17:25 +0100 Subject: [PATCH 0159/1173] implement finish-map-window part 2 --- src/localisation/string_ids.h | 2 + src/windows/map.c | 82 +++++++++++++++++++++++++++++++++-- src/world/footpath.c | 2 +- src/world/footpath.h | 2 + src/world/map.c | 1 + src/world/map.h | 1 + 6 files changed, 85 insertions(+), 5 deletions(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 922a4b069f..a8800fa2be 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -722,6 +722,8 @@ enum { STR_LAST_BREAKDOWN = 1808, STR_CURRENT_BREAKDOWN = 1809, + STR_CANT_BUILD_PARK_ENTRANCE_HERE = 1811, + STR_ACTIONS = 1814, STR_THOUGHTS = STR_ACTIONS + 1, STR_INFORMATION_TYPE_TIP = 1816, diff --git a/src/windows/map.c b/src/windows/map.c index c30307f8d5..241ee495c1 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "../addresses.h" +#include "../audio/audio.h" #include "../cheats.h" #include "../game.h" #include "../localisation/localisation.h" @@ -158,6 +159,8 @@ static void window_map_set_bounds(rct_window* w); static void window_map_set_land_rights_tool_update(int x, int y); static void window_map_place_park_entrance_tool_update(int x, int y); static void window_map_set_peep_spawn_tool_update(int x, int y); +static void window_map_place_park_entrance_tool_down(int x, int y); +static void window_map_set_peep_spawn_tool_down(int x, int y); /** * @@ -449,10 +452,10 @@ static void window_map_tooldown() switch (widgetIndex) { case WIDX_BUILD_PARK_ENTRANCE: - // sub_6670A4(); + window_map_place_park_entrance_tool_down(x, y); break; case WIDX_PEOPLE_STARTING_POSITION: - // sub_68D573(); + window_map_set_peep_spawn_tool_down(x, y); break; } } @@ -1226,7 +1229,7 @@ static void window_map_set_peep_spawn_tool_update(int x, int y) RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 0); RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 2); footpath_bridge_get_info_from_pos(x, y, &mapX, &mapY, &direction, &mapElement); - if (mapX == -1) + if ((mapX & 0xFFFF) == 0x8000) return; mapZ = mapElement->base_height * 8; @@ -1249,4 +1252,75 @@ static void window_map_set_peep_spawn_tool_update(int x, int y) RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16) = mapY; RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = mapZ; map_invalidate_selection_rect(); -} \ No newline at end of file +} + +/** + * + * rct2: 0x006670A4 + */ +static void window_map_place_park_entrance_tool_down(int x, int y) +{ + sint16 mapX, mapY, mapZ; + int direction; + money32 price; + + sub_666F9E(); + sub_666EEF(x, y, &mapX, &mapY, &mapZ, &direction); + if (mapX == (sint16)0x8000) + return; + + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_BUILD_PARK_ENTRANCE_HERE; + price = game_do_command( + mapX, + GAME_COMMAND_FLAG_APPLY | (direction << 8), + mapY, + mapZ, + GAME_COMMAND_PLACE_PARK_ENTRANCE, + 0, + 0 + ); + if (price == MONEY32_UNDEFINED) + return; + + sound_play_panned( + SOUND_PLACE_ITEM, + 0x8001, + RCT2_GLOBAL(0x009DEA62, uint16), + RCT2_GLOBAL(0x009DEA64, uint16), + RCT2_GLOBAL(0x009DEA66, uint16) + ); +} + +/** + * + * rct2: 0x0068D573 + */ +static void window_map_set_peep_spawn_tool_down(int x, int y) +{ + rct_map_element *mapElement, *surfaceMapElement; + int mapX, mapY, mapZ, direction; + + footpath_get_coordinates_from_pos(x, y, &mapX, &mapY, &direction, &mapElement); + if (mapX == 0x8000) + return; + + surfaceMapElement = map_get_surface_element_at(mapX >> 5, mapY >> 5); + if (surfaceMapElement->properties.surface.ownership & 0xF0) { + return; + } + + mapX = mapX + 16 + (word_981D6C[direction].x * 15); + mapY = mapY + 16 + (word_981D6C[direction].y * 15); + mapZ = mapElement->base_height / 2; + + int peepSpawnIndex = 0; + if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, uint16) != 1 && gPeepSpawns[0].x != 0xFFFF) + peepSpawnIndex = 1; + + gPeepSpawns[peepSpawnIndex].x = mapX; + gPeepSpawns[peepSpawnIndex].y = mapY; + gPeepSpawns[peepSpawnIndex].z = mapZ; + gPeepSpawns[peepSpawnIndex].direction = direction; + gfx_invalidate_screen(); + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, uint16) = peepSpawnIndex; +} diff --git a/src/world/footpath.c b/src/world/footpath.c index a03c941a6e..3e5f38a2ef 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -35,7 +35,7 @@ enum { FOOTPATH_CONSTRUCTION_FLAG_ALLOW_DURING_PAUSED = 1 << 3 }; -const rct_xy16 word_981D6C[] = { +const rct_xy16 word_981D6C[4] = { { -1, 0 }, { 0, 1 }, { 1, 0 }, diff --git a/src/world/footpath.h b/src/world/footpath.h index 4575fe57d9..5d4ce3d22f 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -39,6 +39,8 @@ typedef struct { #define g_pathTypeEntries ((rct_path_type**)object_entry_groups[OBJECT_TYPE_PATHS].chunks) +extern const rct_xy16 word_981D6C[4]; + void game_command_place_footpath(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_remove_footpath(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); money32 footpath_place(int type, int x, int y, int z, int slope, int flags); diff --git a/src/world/map.c b/src/world/map.c index 737749d324..00127a07fc 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -49,6 +49,7 @@ const rct_xy16 TileDirectionDelta[] = { }; rct_xy16 *gMapSelectionTiles = (rct_xy16*)0x009DE596; +rct2_peep_spawn *gPeepSpawns = (rct2_peep_spawn*)RCT2_ADDRESS_PEEP_SPAWNS; bool LandPaintMode; bool LandRightsMode; diff --git a/src/world/map.h b/src/world/map.h index ecebd83b06..0c58cd9e3f 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -246,6 +246,7 @@ typedef struct { extern const rct_xy16 TileDirectionDelta[]; extern rct_xy16 *gMapSelectionTiles; +extern rct2_peep_spawn *gPeepSpawns; // Used in the land tool window to allow dragging and changing land styles extern bool LandPaintMode; // Used in the land rights tool window to either buy land rights or construction rights From 693e6127daa7520a4e8cbc5f87029deb61ee51ed Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 1 Jul 2015 19:06:42 +0100 Subject: [PATCH 0160/1173] implement finish-map-window part 3 --- src/windows/map.c | 58 ++++++++++++++++------------------------------- src/world/park.c | 30 +++++++++++++++++++++++- src/world/park.h | 3 ++- 3 files changed, 51 insertions(+), 40 deletions(-) diff --git a/src/windows/map.c b/src/windows/map.c index 241ee495c1..2fb826867e 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -510,7 +510,7 @@ static void window_map_toolabort() hide_construction_rights(); break; case WIDX_BUILD_PARK_ENTRANCE: - sub_666F9E(); + park_remove_ghost_entrance(); window_invalidate(w); hide_gridlines(); hide_land_rights(); @@ -1134,42 +1134,24 @@ static void window_map_set_land_rights_tool_update(int x, int y) */ void sub_666EEF(int x, int y, sint16 *mapX, sint16 *mapY, sint16 *mapZ, int *direction) { - int eax, ebx, ecx, edx, esi, edi, ebp; - eax = x; - ebx = y; - RCT2_CALLFUNC_X(0x00666EEF, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - *mapX = (eax & 0xFFFF); - *mapY = (ecx & 0xFFFF); - *mapZ = (edx & 0xFF); - *direction = ((ebx >> 8) & 0xFF); -} + rct_map_element *mapElement; -/** - * - * rct2: 0x00666F4E - */ -money32 sub_666F4E(int x, int y, int z, int direction) -{ - money32 result; + sub_68A15E(x, y, mapX, mapY, direction, &mapElement); + if (*mapX == (sint16)0x8000) + return; - sub_666F9E(); - result = game_do_command( - x, - 104 | GAME_COMMAND_FLAG_APPLY | (direction << 8), - y, - z, - GAME_COMMAND_PLACE_PARK_ENTRANCE, - 0, - 0 - ); - if (result != MONEY32_UNDEFINED) { - RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_X, uint16) = x; - RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_Y, uint16) = y; - RCT2_GLOBAL(0x009E32D0, uint8) = z; - RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_DIRECTION, uint8) = direction; - RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_EXISTS, uint8) |= (1 << 0); + mapElement = map_get_surface_element_at(*mapX >> 5, *mapY >> 5); + *mapZ = mapElement->properties.surface.slope & 0x1F; + if (*mapZ == 0) { + *mapZ = mapElement->base_height / 2; + if ((mapElement->properties.surface.slope & 0x0F) != 0) { + (*mapZ)++; + if (mapElement->properties.surface.slope & 0x10) { + (*mapZ)++; + } + } } - return result; + *direction = (window_scenery_rotation - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) & 3; } /** @@ -1187,7 +1169,7 @@ static void window_map_place_park_entrance_tool_update(int x, int y) RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 1); sub_666EEF(x, y, &mapX, &mapY, &mapZ, &direction); if (mapX == (sint16)-1) { - sub_666F9E(); + park_remove_ghost_entrance(); return; } @@ -1212,8 +1194,8 @@ static void window_map_place_park_entrance_tool_update(int x, int y) return; } - sub_666F9E(); - RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_PRICE, uint32) = sub_666F4E(mapX, mapY, mapZ, direction); + park_remove_ghost_entrance(); + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_PRICE, uint32) = park_place_ghost_entrance(mapX, mapY, mapZ, direction); } /** @@ -1264,7 +1246,7 @@ static void window_map_place_park_entrance_tool_down(int x, int y) int direction; money32 price; - sub_666F9E(); + park_remove_ghost_entrance(); sub_666EEF(x, y, &mapX, &mapY, &mapZ, &direction); if (mapX == (sint16)0x8000) return; diff --git a/src/world/park.c b/src/world/park.c index d70d95568a..2a83928258 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -1425,7 +1425,7 @@ int get_forced_park_rating(){ * * rct2: 0x00666F9E */ -void sub_666F9E() +void park_remove_ghost_entrance() { if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_EXISTS, uint8) & (1 << 0)) { RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_EXISTS, uint8) &= ~(1 << 0); @@ -1440,3 +1440,31 @@ void sub_666F9E() ); } } + +/** + * + * rct2: 0x00666F4E + */ +money32 park_place_ghost_entrance(int x, int y, int z, int direction) +{ + money32 result; + + park_remove_ghost_entrance(); + result = game_do_command( + x, + 104 | GAME_COMMAND_FLAG_APPLY | (direction << 8), + y, + z, + GAME_COMMAND_PLACE_PARK_ENTRANCE, + 0, + 0 + ); + if (result != MONEY32_UNDEFINED) { + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_Y, uint16) = y; + RCT2_GLOBAL(0x009E32D0, uint8) = z; + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_DIRECTION, uint8) = direction; + RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_GHOST_EXISTS, uint8) |= (1 << 0); + } + return result; +} diff --git a/src/world/park.h b/src/world/park.h index 2ad7515ea7..855454434c 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -82,6 +82,7 @@ void game_command_buy_land_rights(int *eax, int *ebx, int *ecx, int *edx, int *e void gfx_invalidate_viewport_tile(int x, int y, int z0, int z1); -void sub_666F9E(); +void park_remove_ghost_entrance(); +money32 park_place_ghost_entrance(int x, int y, int z, int direction); #endif From 6de7a38f53623da573cefda7b2ab0955c22f30aa Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 2 Jul 2015 00:37:55 +0100 Subject: [PATCH 0161/1173] implement finish-map-window part 4 --- src/localisation/string_ids.h | 3 ++ src/windows/map.c | 85 +++++++++++++++++++++++++++++++-- src/world/map.c | 88 +++++++++++++++++++++++++++++++++-- src/world/map.h | 3 ++ 4 files changed, 171 insertions(+), 8 deletions(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index a8800fa2be..6d3e064515 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1551,6 +1551,9 @@ enum { STR_MAP_SIZE = 3211, + STR_CANT_DECREASE_MAP_SIZE_ANY_FURTHER = 3213, + STR_CANT_INCREASE_MAP_SIZE_ANY_FURTHER = 3214, + STR_SELECT_PARK_OWNED_LAND_TIP = 3216, STR_LAND_OWNED = 3217, diff --git a/src/windows/map.c b/src/windows/map.c index 2fb826867e..4edd547bec 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -31,6 +31,7 @@ #include "../sprites.h" #include "../world/footpath.h" #include "../world/scenery.h" +#include "error.h" enum { PAGE_PEEPS, @@ -161,6 +162,9 @@ static void window_map_place_park_entrance_tool_update(int x, int y); static void window_map_set_peep_spawn_tool_update(int x, int y); static void window_map_place_park_entrance_tool_down(int x, int y); static void window_map_set_peep_spawn_tool_down(int x, int y); +static void map_window_increase_map_size(); +static void map_window_decrease_map_size(); +static void map_window_set_pixels(rct_window *w); /** * @@ -389,10 +393,10 @@ static void window_map_mousedown(int widgetIndex, rct_window *w, rct_widget *wid { switch (widgetIndex) { case WIDX_MAP_SIZE_SPINNER_UP: - RCT2_CALLPROC_X(0x0068D641, 0, 0, 0, widgetIndex, (int)w, 0, 0); + map_window_increase_map_size(); break; case WIDX_MAP_SIZE_SPINNER_DOWN: - RCT2_CALLPROC_X(0x0068D6B4, 0, 0, 0, widgetIndex, (int)w, 0, 0); + map_window_decrease_map_size(); break; case WIDX_SET_LAND_RIGHTS: // When unselecting the land rights tool, reset the size so the number doesn't @@ -408,7 +412,31 @@ static void window_map_mousedown(int widgetIndex, rct_window *w, rct_widget *wid */ static void window_map_update(rct_window *w) { - RCT2_CALLPROC_X(0x0068D7FB, 0, 0, 0, 0, (int)w, 0, 0); + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8) != w->map.rotation) { + w->map.rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + window_map_init_map(); + window_map_center_on_view_point(); + } + + for (int i = 0; i < 16; i++) + map_window_set_pixels(w); + + window_invalidate(w); + + // Update tab animations + w->list_information_type++; + switch (w->selected_tab) { + case PAGE_PEEPS: + if (w->list_information_type >= 32) { + w->list_information_type = 0; + } + break; + case PAGE_RIDES: + if (w->list_information_type >= 64) { + w->list_information_type = 0; + } + break; + } } @@ -583,11 +611,11 @@ static void window_map_textinput() if (size > 256) size = 256; int currentSize = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16); while (size < currentSize) { - RCT2_CALLPROC_X(0x0068D6B4, 0, 0, 0, widgetIndex, (int)w, 0, 0); + map_window_decrease_map_size(); currentSize--; } while (size > currentSize) { - RCT2_CALLPROC_X(0x0068D641, 0, 0, 0, widgetIndex, (int)w, 0, 0); + map_window_increase_map_size(); currentSize++; } window_invalidate(w); @@ -1306,3 +1334,50 @@ static void window_map_set_peep_spawn_tool_down(int x, int y) gfx_invalidate_screen(); RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, uint16) = peepSpawnIndex; } + +/** + * + * rct2: 0x0068D641 + */ +static void map_window_increase_map_size() +{ + if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) >= 256) { + window_error_open(STR_CANT_INCREASE_MAP_SIZE_ANY_FURTHER, STR_NONE); + return; + } + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16)++; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) = (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) - 1) * 32; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_MINUS_2, uint16) = (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) * 32) + 254; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16) = ((RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) - 1) * 32) - 1; + map_extend_boundary_surface(); + window_map_init_map(); + window_map_center_on_view_point(); + gfx_invalidate_screen(); +} + +/** + * + * rct2: 0x0068D6B4 + */ +static void map_window_decrease_map_size() +{ + if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) < 16) { + window_error_open(STR_CANT_DECREASE_MAP_SIZE_ANY_FURTHER, STR_NONE); + return; + } + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16)--; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) = (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) - 1) * 32; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_MINUS_2, uint16) = (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) * 32) + 254; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16) = ((RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) - 1) * 32) - 1; + map_remove_out_of_range_elements(); + window_map_init_map(); + window_map_center_on_view_point(); + gfx_invalidate_screen(); +} + +static void map_window_set_pixels(rct_window *w) +{ + RCT2_CALLPROC_X(0x0068DC71, 0, 0, 0, 0, (int)w, 0, 0); +} diff --git a/src/world/map.c b/src/world/map.c index 00127a07fc..0ebe546dfd 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -64,7 +64,6 @@ static void tiles_init(); static void sub_6A87BB(int x, int y); static void map_update_grass_length(int x, int y, rct_map_element *mapElement); static void map_set_grass_length(int x, int y, rct_map_element *mapElement, int length); -static void sub_68ADBC(); static void sub_68AE2A(int x, int y); void rotate_map_coordinates(sint16* x, sint16* y, int rotation){ @@ -302,7 +301,7 @@ void map_init(int size) RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, sint16) = size * 32 - 33; RCT2_GLOBAL(0x01359208, sint16) = 7; map_update_tile_pointers(); - sub_68ADBC(); + map_remove_out_of_range_elements(); climate_reset(CLIMATE_WARM); } @@ -3134,7 +3133,11 @@ void map_element_remove_banner_entry(rct_map_element *mapElement) } } -static void sub_68ADBC() +/** + * Removes elements that are out of the map size range and crops the park perimeter. + * rct2: 0x0068ADBC + */ +void map_remove_out_of_range_elements() { int mapMaxXY = RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16); @@ -3151,6 +3154,85 @@ static void sub_68ADBC() } } +/** + * Copies the terrain and slope from the edge of the map to the new tiles. Used when increasing the size of the map. + * rct2: 0x0068AC15 + */ +void map_extend_boundary_surface() +{ + rct_map_element *existingMapElement, *newMapElement; + int x, y, z, slope; + + y = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) - 2; + for (x = 0; x < 256; x++) { + existingMapElement = map_get_surface_element_at(x, y - 1); + newMapElement = map_get_surface_element_at(x, y); + + newMapElement->type = (newMapElement->type & 0x7C) | (existingMapElement->type & 0x83); + newMapElement->properties.surface.slope = existingMapElement->properties.surface.slope & 0xE0; + newMapElement->properties.surface.terrain = existingMapElement->properties.surface.terrain; + newMapElement->properties.surface.grass_length = existingMapElement->properties.surface.grass_length; + newMapElement->properties.surface.ownership = 0; + + z = existingMapElement->base_height; + slope = existingMapElement->properties.surface.slope & 9; + if (slope == 9) { + z += 2; + slope = 0; + if (existingMapElement->properties.surface.slope & 0x10) { + slope = 1; + if (existingMapElement->properties.surface.slope & 0x04) { + slope = 8; + if (existingMapElement->properties.surface.slope & 0x02) { + slope = 0; + } + } + } + } + if (slope & 1) slope |= 2; + if (slope & 8) slope |= 4; + + newMapElement->properties.surface.slope |= slope; + newMapElement->base_height = z; + newMapElement->clearance_height = z; + } + + x = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) - 2; + for (y = 0; y < 256; y++) { + existingMapElement = map_get_surface_element_at(x - 1, y); + newMapElement = map_get_surface_element_at(x, y); + + newMapElement->type = (newMapElement->type & 0x7C) | (existingMapElement->type & 0x83); + newMapElement->properties.surface.slope = existingMapElement->properties.surface.slope & 0xE0; + newMapElement->properties.surface.terrain = existingMapElement->properties.surface.terrain; + newMapElement->properties.surface.grass_length = existingMapElement->properties.surface.grass_length; + newMapElement->properties.surface.ownership = 0; + + z = existingMapElement->base_height; + slope = existingMapElement->properties.surface.slope & 3; + if (slope == 3) { + z += 2; + slope = 0; + if (existingMapElement->properties.surface.slope & 0x10) { + slope = 1; + if (existingMapElement->properties.surface.slope & 0x04) { + slope = 2; + if (existingMapElement->properties.surface.slope & 0x08) { + slope = 0; + } + } + } + } + if (slope & 1) slope |= 8; + if (slope & 2) slope |= 4; + + newMapElement->properties.surface.slope |= slope; + newMapElement->base_height = z; + newMapElement->clearance_height = z; + } + +} + static void sub_68AE2A(int x, int y) { for (;;) { diff --git a/src/world/map.h b/src/world/map.h index 0c58cd9e3f..7fbd9991e2 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -338,4 +338,7 @@ void map_element_remove_banner_entry(rct_map_element *mapElement); bool map_element_is_underground(rct_map_element *mapElement); +void map_remove_out_of_range_elements(); +void map_extend_boundary_surface(); + #endif From 55c509590fdcaed9ba6eb454844580f45e6540db Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 2 Jul 2015 01:50:13 +0100 Subject: [PATCH 0162/1173] implement finish-map-window part 5 --- src/windows/map.c | 280 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 279 insertions(+), 1 deletion(-) diff --git a/src/windows/map.c b/src/windows/map.c index 4edd547bec..45a4a7c491 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -1377,7 +1377,285 @@ static void map_window_decrease_map_size() gfx_invalidate_screen(); } +static const uint16 WaterColour = 0xC3C3; +static const uint16 TerrainColour[] = { + 0x4949, // TERRAIN_GRASS + 0x2828, // TERRAIN_SAND + 0x6C6C, // TERRAIN_DIRT + 0x0C0C, // TERRAIN_ROCK + 0x3E3E, // TERRAIN_MARTIAN + 0x0A10, // TERRAIN_CHECKERBOARD + 0x496C, // TERRAIN_GRASS_CLUMPS + 0x8D8D, // TERRAIN_ICE + 0xAC0A, // TERRAIN_GRID_RED + 0x360A, // TERRAIN_GRID_YELLOW + 0xA20A, // TERRAIN_GRID_BLUE + 0x660A, // TERRAIN_GRID_GREEN + 0x6F6F, // TERRAIN_SAND_DARK + 0xDEDE, // TERRAIN_SAND_LIGHT +}; + +static const uint16 ElementTypeMaskColour[] = { + 0xFFFF, // MAP_ELEMENT_TYPE_SURFACE + 0x0000, // MAP_ELEMENT_TYPE_PATH + 0x00FF, // MAP_ELEMENT_TYPE_TRACK + 0xFF00, // MAP_ELEMENT_TYPE_SCENERY + 0x0000, // MAP_ELEMENT_TYPE_ENTRANCE + 0xFFFF, // MAP_ELEMENT_TYPE_FENCE + 0x0000, // MAP_ELEMENT_TYPE_SCENERY_MULTIPLE + 0xFFFF // MAP_ELEMENT_TYPE_BANNER +}; + +static const uint16 ElementTypeAddColour[] = { + 0x0000, // MAP_ELEMENT_TYPE_SURFACE + 0x1111, // MAP_ELEMENT_TYPE_PATH + 0xB700, // MAP_ELEMENT_TYPE_TRACK + 0x0063, // MAP_ELEMENT_TYPE_SCENERY + 0xBABA, // MAP_ELEMENT_TYPE_ENTRANCE + 0x0000, // MAP_ELEMENT_TYPE_FENCE + 0x6363, // MAP_ELEMENT_TYPE_SCENERY_MULTIPLE + 0x0000 // MAP_ELEMENT_TYPE_BANNER +}; + +enum { + COLOUR_KEY_RIDE, + COLOUR_KEY_FOOD, + COLOUR_KEY_DRINK, + COLOUR_KEY_SOUVENIR, + COLOUR_KEY_KIOSK, + COLOUR_KEY_FIRST_AID, + COLOUR_KEY_CASH_MACHINE, + COLOUR_KEY_TOILETS +}; + +static const uint8 RideColourKey[] = { + COLOUR_KEY_RIDE, // RIDE_TYPE_SPIRAL_ROLLER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_STAND_UP_ROLLER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_SUSPENDED_SWINGING_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_INVERTED_ROLLER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_JUNIOR_ROLLER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_MINIATURE_RAILWAY + COLOUR_KEY_RIDE, // RIDE_TYPE_MONORAIL + COLOUR_KEY_RIDE, // RIDE_TYPE_MINI_SUSPENDED_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_BOAT_RIDE + COLOUR_KEY_RIDE, // RIDE_TYPE_WOODEN_WILD_MOUSE + COLOUR_KEY_RIDE, // RIDE_TYPE_STEEPLECHASE + COLOUR_KEY_RIDE, // RIDE_TYPE_CAR_RIDE + COLOUR_KEY_RIDE, // RIDE_TYPE_LAUNCHED_FREEFALL + COLOUR_KEY_RIDE, // RIDE_TYPE_BOBSLEIGH_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_OBSERVATION_TOWER + COLOUR_KEY_RIDE, // RIDE_TYPE_LOOPING_ROLLER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_DINGHY_SLIDE + COLOUR_KEY_RIDE, // RIDE_TYPE_MINE_TRAIN_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_CHAIRLIFT + COLOUR_KEY_RIDE, // RIDE_TYPE_CORKSCREW_ROLLER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_MAZE = 20 + COLOUR_KEY_RIDE, // RIDE_TYPE_SPIRAL_SLIDE + COLOUR_KEY_RIDE, // RIDE_TYPE_GO_KARTS + COLOUR_KEY_RIDE, // RIDE_TYPE_LOG_FLUME + COLOUR_KEY_RIDE, // RIDE_TYPE_RIVER_RAPIDS + COLOUR_KEY_RIDE, // RIDE_TYPE_DODGEMS + COLOUR_KEY_RIDE, // RIDE_TYPE_PIRATE_SHIP + COLOUR_KEY_RIDE, // RIDE_TYPE_SWINGING_INVERTER_SHIP + COLOUR_KEY_FOOD, // RIDE_TYPE_FOOD_STALL + COLOUR_KEY_FOOD, // RIDE_TYPE_1D + COLOUR_KEY_DRINK, // RIDE_TYPE_DRINK_STALL + COLOUR_KEY_DRINK, // RIDE_TYPE_1F + COLOUR_KEY_SOUVENIR, // RIDE_TYPE_SHOP + COLOUR_KEY_RIDE, // RIDE_TYPE_MERRY_GO_ROUND + COLOUR_KEY_SOUVENIR, // RIDE_TYPE_22 + COLOUR_KEY_KIOSK, // RIDE_TYPE_INFORMATION_KIOSK + COLOUR_KEY_TOILETS, // RIDE_TYPE_TOILETS + COLOUR_KEY_RIDE, // RIDE_TYPE_FERRIS_WHEEL + COLOUR_KEY_RIDE, // RIDE_TYPE_MOTION_SIMULATOR + COLOUR_KEY_RIDE, // RIDE_TYPE_3D_CINEMA + COLOUR_KEY_RIDE, // RIDE_TYPE_TOP_SPIN + COLOUR_KEY_RIDE, // RIDE_TYPE_SPACE_RINGS + COLOUR_KEY_RIDE, // RIDE_TYPE_REVERSE_FREEFALL_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_LIFT + COLOUR_KEY_RIDE, // RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER + COLOUR_KEY_CASH_MACHINE, // RIDE_TYPE_CASH_MACHINE + COLOUR_KEY_RIDE, // RIDE_TYPE_TWIST + COLOUR_KEY_RIDE, // RIDE_TYPE_HAUNTED_HOUSE + COLOUR_KEY_FIRST_AID, // RIDE_TYPE_FIRST_AID + COLOUR_KEY_RIDE, // RIDE_TYPE_CIRCUS_SHOW + COLOUR_KEY_RIDE, // RIDE_TYPE_GHOST_TRAIN + COLOUR_KEY_RIDE, // RIDE_TYPE_TWISTER_ROLLER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_WOODEN_ROLLER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_WILD_MOUSE + COLOUR_KEY_RIDE, // RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_38 + COLOUR_KEY_RIDE, // RIDE_TYPE_FLYING_ROLLER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_3A + COLOUR_KEY_RIDE, // RIDE_TYPE_VIRGINIA_REEL + COLOUR_KEY_RIDE, // RIDE_TYPE_SPLASH_BOATS + COLOUR_KEY_RIDE, // RIDE_TYPE_MINI_HELICOPTERS + COLOUR_KEY_RIDE, // RIDE_TYPE_LAY_DOWN_ROLLER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_SUSPENDED_MONORAIL + COLOUR_KEY_RIDE, // RIDE_TYPE_40 + COLOUR_KEY_RIDE, // RIDE_TYPE_REVERSER_ROLLER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_HEARTLINE_TWISTER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_MINI_GOLF + COLOUR_KEY_RIDE, // RIDE_TYPE_GIGA_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_ROTO_DROP + COLOUR_KEY_RIDE, // RIDE_TYPE_FLYING_SAUCERS + COLOUR_KEY_RIDE, // RIDE_TYPE_CROOKED_HOUSE + COLOUR_KEY_RIDE, // RIDE_TYPE_MONORAIL_CYCLES + COLOUR_KEY_RIDE, // RIDE_TYPE_COMPACT_INVERTED_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_WATER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_INVERTED_HAIRPIN_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_MAGIC_CARPET + COLOUR_KEY_RIDE, // RIDE_TYPE_SUBMARINE_RIDE + COLOUR_KEY_RIDE, // RIDE_TYPE_RIVER_RAFTS + COLOUR_KEY_RIDE, // RIDE_TYPE_50 + COLOUR_KEY_RIDE, // RIDE_TYPE_ENTERPRISE + COLOUR_KEY_RIDE, // RIDE_TYPE_52 + COLOUR_KEY_RIDE, // RIDE_TYPE_53 + COLOUR_KEY_RIDE, // RIDE_TYPE_54 + COLOUR_KEY_RIDE, // RIDE_TYPE_55 + COLOUR_KEY_RIDE, // RIDE_TYPE_INVERTED_IMPULSE_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_MINI_ROLLER_COASTER + COLOUR_KEY_RIDE, // RIDE_TYPE_MINE_RIDE + COLOUR_KEY_RIDE, // RIDE_TYPE_59 + COLOUR_KEY_RIDE, // RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER + COLOUR_KEY_RIDE, // + COLOUR_KEY_RIDE, // + COLOUR_KEY_RIDE, // +}; + +static const uint16 RideKeyColours[] = { + 0x3D3D, // COLOUR_KEY_RIDE + 0x2A2A, // COLOUR_KEY_FOOD + 0x1414, // COLOUR_KEY_DRINK + 0x0D1D, // COLOUR_KEY_SOUVENIR + 0x8888, // COLOUR_KEY_KIOSK + 0x6666, // COLOUR_KEY_FIRST_AID + 0x3737, // COLOUR_KEY_CASH_MACHINE + 0xA1A1, // COLOUR_KEY_TOILETS +}; + +static uint16 map_window_get_pixel_colour_peep(int x, int y) +{ + rct_map_element *mapElement; + uint16 colour; + + mapElement = map_get_surface_element_at(x >> 5, y >> 5); + colour = TerrainColour[map_element_get_terrain(mapElement)]; + if (mapElement->properties.surface.terrain & 0x1F) + colour = WaterColour; + + if (!(mapElement->properties.surface.ownership & OWNERSHIP_OWNED)) + colour = 10 | (colour & 0xFF00); + + if (!(mapElement->flags & (1 << 5))) + colour = 10 | (colour & 0xFF00); + + while (!map_element_is_last_for_tile(mapElement++)) { + int mapElementType = map_element_get_type(mapElement); + colour &= ElementTypeMaskColour[mapElementType >> 2]; + colour |= ElementTypeAddColour[mapElementType >> 2]; + } + + return colour; +} + +static uint16 map_window_get_pixel_colour_ride(int x, int y) +{ + rct_map_element *mapElement; + rct_ride *ride; + uint32 colour; + + colour = 0x0D0D0000; + mapElement = map_get_surface_element_at(x >> 5, y >> 5); + do { + switch (map_element_get_type(mapElement)) { + case MAP_ELEMENT_TYPE_SURFACE: + if (mapElement->properties.surface.terrain & 0x1F) { + colour &= 0xFFFF; + colour |= 0xC2C20000; + } + if (!(mapElement->properties.surface.ownership & OWNERSHIP_OWNED)) { + colour &= 0xFF00FFFF; + colour |= 0x000A0000; + } + break; + case MAP_ELEMENT_TYPE_PATH: + colour = 0x0E0E; + break; + case MAP_ELEMENT_TYPE_ENTRANCE: + if (mapElement->properties.entrance.type == ENTRANCE_TYPE_PARK_ENTRANCE) + break; + // fall-through + case MAP_ELEMENT_TYPE_TRACK: + ride = GET_RIDE(mapElement->properties.track.ride_index); + colour = RideKeyColours[RideColourKey[ride->type]]; + break; + } + } while (!map_element_is_last_for_tile(mapElement++)); + + if ((colour & 0xFFFF) == 0) + colour >>= 16; + + return colour & 0xFFFF; +} + static void map_window_set_pixels(rct_window *w) { - RCT2_CALLPROC_X(0x0068DC71, 0, 0, 0, 0, (int)w, 0, 0); + uint16 colour, *destination; + int x, y, dx, dy; + + destination = (uint16*)((RCT2_GLOBAL(0x00F1AD6C, uint32) * 511) + RCT2_GLOBAL(0x00F1AD68, uint32) + 255); + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) { + case 0: + x = RCT2_GLOBAL(0x00F1AD6C, uint32) * 32; + y = 0; + dx = 0; + dy = 32; + break; + case 1: + x = 8192 - 32; + y = RCT2_GLOBAL(0x00F1AD6C, uint32) * 32; + dx = -32; + dy = 0; + break; + case 2: + x = (255 - RCT2_GLOBAL(0x00F1AD6C, uint32)) * 32; + y = 8192 - 32; + dx = 0; + dy = -32; + break; + case 3: + x = 0; + y = (255 - RCT2_GLOBAL(0x00F1AD6C, uint32)) * 32; + dx = 32; + dy = 0; + break; + } + + for (int i = 0; i < 256; i++) { + if ( + x > 0 && + y > 0 && + x < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) && + y < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) + ) { + switch (w->selected_tab) { + case PAGE_PEEPS: + colour = map_window_get_pixel_colour_peep(x, y); + break; + case PAGE_RIDES: + colour = map_window_get_pixel_colour_ride(x, y); + break; + } + *destination = colour; + } + x += dx; + y += dy; + destination = (uint16*)((int)destination + 513); + } + RCT2_GLOBAL(0x00F1AD6C, uint32)++; + if (RCT2_GLOBAL(0x00F1AD6C, uint32) >= 256) + RCT2_GLOBAL(0x00F1AD6C, uint32) = 0; } From cbbf127185552629955e96b660236e471a5bde04 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 2 Jul 2015 04:00:20 +0100 Subject: [PATCH 0163/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 23 +++++++++++++++++------ data/language/swedish.txt | 4 ++-- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index aeb7aadc19..14c052c141 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3346,7 +3346,7 @@ STR_3344 :Achtbaanontwerper STR_3345 :Baanontwerpbeheer STR_3346 :Kan baanontwerp niet opslaan STR_3347 :Attractie is te groot, bevat teveel elementen of het decor is te ver verspreid -STR_3348 :Naam wijzigen +STR_3348 :Hernoemen STR_3349 :Verwijderen STR_3350 :Naam baanontwerp STR_3351 :Voer een nieuwe naam in voor dit baanontwerp: @@ -3583,8 +3583,8 @@ STR_5250 :Afsluitknop titelscherm STR_5251 :Optiesknop titelscherm STR_5252 :Scenarioselectie titelscherm STR_5253 :Parkinformatie -STR_5254 :Misselijk maken -STR_5255 :{MEDIUMFONT}{BLACK}Zal alle bezoekers misselijk maken +STR_5254 :Aanmaken +STR_5255 :{SMALLFONT}{BLACK}Begint een nieuwe, lege titelpresentatie STR_5256 :Een nieuw thema aanmaken om wijzigingen aan te brengen STR_5257 :{SMALLFONT}{BLACK}Een nieuw thema aanmaken dat is gebaseerd op het huidige STR_5258 :{SMALLFONT}{BLACK}Het huidige thema verwijderen @@ -3762,12 +3762,23 @@ STR_5429 :Zoomniveau: STR_5430 :Te wachten seconden: STR_5431 :Te laden opgeslagen spel: STR_5432 :Commando: -STR_5433 :Titlepresentaties +STR_5433 :Titelpresentaties STR_5434 :Commandobewerker STR_5435 :Opgeslagen spel hernoemen -STR_5436 :Titelpresentaties bewerekn... +STR_5436 :Titelpresentaties bewerken... STR_5437 :Geen opgeslagen spel geselecteerd STR_5438 :Kan geen wijzigingen aanbrengen wanneer de commandobewerker open is -STR_5439 :Er is een herstart gebruikt zonder Wacht-commando +STR_5439 :Een Herstart-commando moet worden voorafgegaan door een Wacht-commando van minstens vier seconden. STR_5440 :Volledig scherm minimaliseren bij focusverlies STR_5441 :{SMALLFONT}{BLACK}Sorteert attracties per baantype,{NEWLINE}zodat achteraf wisselen van treintypes mogelijk{NEWLINE}wordt, zoals in RCT1. +STR_5442 :Parkwaardering forc.: +STR_5443 :Snelheid{MOVE_X}{87}{STRINGID} +STR_5444 :Snelheid: +STR_5445 :Snelheid +STR_5446 :Ophalen +STR_5447 :Type {STRINGID} +STR_5448 :Attractie/voertuig {STRINGID} +STR_5449 :Spelsnelheid verlagen +STR_5450 :Spelsnelheid verhogen +STR_5451 :Cheatsvenster openen +STR_5452 :Zichtbaarheid werkbalken schakelen diff --git a/data/language/swedish.txt b/data/language/swedish.txt index 0d50bc975d..8d581fbd6c 100644 --- a/data/language/swedish.txt +++ b/data/language/swedish.txt @@ -883,8 +883,8 @@ STR_0878 :För högt ! STR_0879 :Kan inte sänka landnivån här... STR_0880 :Kan inte höja landnivån här... STR_0881 :Ett objekt är i vägen -STR_0882 :Spara Spel -STR_0883 :Ladda Spel +STR_0882 :Ladda Spel +STR_0883 :Spara Spel STR_0884 :Ladda Landskap STR_0885 :Spara Landskap STR_0886 :Avsluta Spel From 46178bb44f810a482a5b0627da8f577b884e1640 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 2 Jul 2015 17:00:39 +0100 Subject: [PATCH 0164/1173] implement finish-map-window part 6 --- src/input.c | 2 +- src/interface/window.c | 4 +- src/interface/window.h | 6 ++- src/windows/land.c | 22 +-------- src/windows/map.c | 101 ++++++++++++++++++++++++++++++++++++-- src/windows/top_toolbar.c | 15 ++++++ 6 files changed, 121 insertions(+), 29 deletions(-) diff --git a/src/input.c b/src/input.c index 2d4ea19218..56c1218d94 100644 --- a/src/input.c +++ b/src/input.c @@ -577,7 +577,7 @@ static void input_scroll_continue(rct_window *w, int widgetIndex, int state, int switch (scroll_part){ case SCROLL_PART_VIEW: - window_event_tool_drag_call(w, widgetIndex, w->number / 18, y); + window_event_scroll_mousedrag_call(w, scroll_id, x, y); break; case SCROLL_PART_HSCROLLBAR_LEFT: input_scroll_part_update_hleft(w, widgetIndex, scroll_id); diff --git a/src/interface/window.c b/src/interface/window.c index bdd5084f98..264d89beac 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -1952,9 +1952,9 @@ void window_event_scroll_mousedown_call(rct_window* w, int scrollIndex, int x, i RCT2_CALLPROC_X(w->event_handlers[WE_SCROLL_MOUSEDOWN], scrollIndex, 0, x, y, (int)w, (int)window_get_scroll_widget(w, scrollIndex), 0); } -void window_event_unknown_11_call(rct_window* w) +void window_event_scroll_mousedrag_call(rct_window* w, int scrollIndex, int x, int y) { - window_event_call_address(w->event_handlers[WE_UNKNOWN_11], w); + RCT2_CALLPROC_X(w->event_handlers[WE_SCROLL_MOUSEDRAG], scrollIndex, 0, x, y, (int)w, (int)window_get_scroll_widget(w, scrollIndex), 0); } void window_event_scroll_mouseover_call(rct_window* w, int scrollIndex, int x, int y) diff --git a/src/interface/window.h b/src/interface/window.h index 5e02e69147..9423d7c31c 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -273,7 +273,7 @@ typedef enum { WE_UNKNOWN_0E = 14, WE_SCROLL_GETSIZE = 15, WE_SCROLL_MOUSEDOWN = 16, - WE_UNKNOWN_11 = 17, + WE_SCROLL_MOUSEDRAG = 17, WE_SCROLL_MOUSEOVER = 18, WE_TEXT_INPUT = 19, WE_UNKNOWN_14 = 20, @@ -632,7 +632,7 @@ void window_event_tool_abort_call(rct_window* w, int widgetIndex); void window_event_unknown_0E_call(rct_window* w); int window_get_scroll_size(rct_window *w, int scrollIndex, int *width, int *height); void window_event_scroll_mousedown_call(rct_window* w, int scrollIndex, int x, int y); -void window_event_unknown_11_call(rct_window* w); +void window_event_scroll_mousedrag_call(rct_window* w, int scrollIndex, int x, int y); void window_event_scroll_mouseover_call(rct_window* w, int scrollIndex, int x, int y); void window_event_textinput_call(rct_window *w, int widgetIndex, char *text); void window_event_unknown_14_call(rct_window* w); @@ -655,6 +655,8 @@ void window_cancel_textbox(); void window_update_textbox_caret(); void window_update_textbox(); +bool land_tool_is_active(); + //Cheat: in-game land ownership editor void toggle_ingame_land_ownership_editor(); diff --git a/src/windows/land.c b/src/windows/land.c index 5c5c308f81..8d456e9ba9 100644 --- a/src/windows/land.c +++ b/src/windows/land.c @@ -96,8 +96,6 @@ static void* window_land_events[] = { window_land_emptysub }; -static int window_land_should_close(); - static char window_land_floor_texture_order[] = { TERRAIN_SAND_DARK, TERRAIN_SAND_LIGHT, TERRAIN_DIRT, TERRAIN_GRASS_CLUMPS, TERRAIN_GRASS, TERRAIN_ROCK, TERRAIN_SAND, TERRAIN_MARTIAN, TERRAIN_CHECKERBOARD, TERRAIN_ICE, @@ -158,7 +156,7 @@ void window_land_open() static void window_land_close() { // If the tool wasn't changed, turn tool off - if (!window_land_should_close()) + if (land_tool_is_active()) tool_cancel(); } @@ -349,8 +347,7 @@ static void window_land_inputsize(rct_window *w) */ static void window_land_update(rct_window *w) { - // Close window if another tool is open - if (window_land_should_close()) + if (!land_tool_is_active()) window_close(w); } @@ -433,18 +430,3 @@ static void window_land_paint() gfx_draw_string_centred(dpi, 986, x, y, 0, (void*)0x013CE952); } } - -/** - * - * rct2: 0x0066D104 - */ -static int window_land_should_close() -{ - if (!(RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE)) - return 1; - if (RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) != WC_TOP_TOOLBAR) - return 1; - if (RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, sint16) != 7) - return 1; - return 0; -} diff --git a/src/windows/map.c b/src/windows/map.c index 45a4a7c491..22ed38688c 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -166,6 +166,8 @@ static void map_window_increase_map_size(); static void map_window_decrease_map_size(); static void map_window_set_pixels(rct_window *w); +static void map_window_screen_to_map(int screenX, int screenY, int *mapX, int *mapY); + /** * * rct2: 0x0068C88A @@ -439,7 +441,6 @@ static void window_map_update(rct_window *w) } } - /** * * rct2: 0x0068D093 @@ -465,7 +466,6 @@ static void window_map_toolupdate() } } - /** * * rct2: 0x0068D074 @@ -574,12 +574,77 @@ static void window_map_scrollgetsize() */ static void window_map_scrollmousedown() { + int mapX, mapY, mapZ; short x, y, scrollIndex; - rct_window *w; + rct_window *w, *mainWindow; window_scrollmouse_get_registers(w, scrollIndex, x, y); - RCT2_CALLPROC_X(0x0068D726, scrollIndex, 0, x, y, (int)w, 0, 0); + map_window_screen_to_map(x, y, &mapX, &mapY); + mapX = clamp(0, mapX, 8191); + mapY = clamp(0, mapY, 8191); + mapZ = map_element_height(x, y); + + mainWindow = window_get_main(); + if (mainWindow != NULL) { + window_scroll_to_location(mainWindow, mapX, mapY, mapZ); + } + + if (land_tool_is_active()) { + // Set land terrain + int landToolSize = max(1, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, uint16)); + int size = (landToolSize * 32) - 32; + int radius = (landToolSize * 16) - 16; + mapX = (mapX - radius) & 0xFFE0; + mapY = (mapY - radius) & 0xFFE0; + + map_invalidate_selection_rect(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= (1 << 0); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16) = 4; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, uint16) = mapX; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, uint16) = mapY; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16) = mapX + size; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16) = mapY + size; + map_invalidate_selection_rect(); + + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1387; + game_do_command( + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16), + GAME_COMMAND_FLAG_APPLY, + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16), + RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_SURFACE, uint8) | (RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_EDGE, uint8) << 8), + GAME_COMMAND_CHANGE_SURFACE_STYLE, + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, sint16), + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16) + ); + } else if (widget_is_active_tool(w, WIDX_SET_LAND_RIGHTS)) { + // Set land rights + int landToolSize = max(1, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, uint16)); + int size = (landToolSize * 32) - 32; + int radius = (landToolSize * 16) - 16; + mapX = (mapX - radius) & 0xFFE0; + mapY = (mapY - radius) & 0xFFE0; + + map_invalidate_selection_rect(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= (1 << 0); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16) = 4; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, uint16) = mapX; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, uint16) = mapY; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16) = mapX + size; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16) = mapY + size; + map_invalidate_selection_rect(); + + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 0; + game_do_command( + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, uint16), + GAME_COMMAND_FLAG_APPLY, + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, uint16), + RCT2_GLOBAL(0x00F1AD61, uint8), + GAME_COMMAND_SET_LAND_OWNERSHIP, + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16), + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16) + ); + } } static void window_map_textinput() @@ -1659,3 +1724,31 @@ static void map_window_set_pixels(rct_window *w) if (RCT2_GLOBAL(0x00F1AD6C, uint32) >= 256) RCT2_GLOBAL(0x00F1AD6C, uint32) = 0; } + +static void map_window_screen_to_map(int screenX, int screenY, int *mapX, int *mapY) +{ + int x, y; + + screenX = ((screenX + 8) - 256) / 2; + screenY = ((screenY + 8) ) / 2; + x = (screenY - screenX) * 32; + y = (screenX + screenY) * 32; + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8) & 3) { + case 0: + *mapX = x; + *mapY = y; + break; + case 1: + *mapX = 8191 - y; + *mapY = x; + break; + case 2: + *mapX = 8191 - x; + *mapY = 8191 - y; + break; + case 3: + *mapX = y; + *mapY = 8191 - x; + break; + } +} diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index d86e831383..25e21e990f 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -3038,3 +3038,18 @@ void toggle_water_window(rct_window *topToolbar, int widgetIndex) window_water_open(); } } + +/** + * + * rct2: 0x0066D104 + */ +bool land_tool_is_active() +{ + if (!(RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE)) + return false; + if (RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) != WC_TOP_TOOLBAR) + return false; + if (RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, sint16) != WIDX_LAND) + return false; + return true; +} From a757f39a8cbf776c34d6546d00086fea4640fbd1 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Thu, 2 Jul 2015 17:41:17 +0100 Subject: [PATCH 0165/1173] Prevent tab 0 from trying to be animated. Fixes #1529 --- src/windows/editor_object_selection.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index bfbbc7d543..a8471aca15 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -1277,7 +1277,7 @@ static void window_editor_object_selection_paint() int spriteIndex = ride_tabs[i]; int frame = 0; - if (w->pressed_widgets & (1ULL << (WIDX_FILTER_RIDE_TAB_ALL + i))) { + if (i != 0 && w->pressed_widgets & (1ULL << (WIDX_FILTER_RIDE_TAB_ALL + i))) { frame = w->frame_no / window_editor_object_selection_animation_divisor[i - 1]; } spriteIndex += (i == 4 ? ThrillRidesTabAnimationSequence[frame] : frame); From b66b503be86dc447e44dbaedcf3cbe0ceb7d4711 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 2 Jul 2015 18:22:38 +0100 Subject: [PATCH 0166/1173] isolate remaining callprocs in peep.c --- src/peep/peep.c | 70 +++++++++++++++++++++++++++++++--------------- src/world/sprite.c | 9 ++++++ src/world/sprite.h | 1 + 3 files changed, 58 insertions(+), 22 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 970418f741..36167e023a 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -46,6 +46,11 @@ static void peep_stop_purchase_thought(rct_peep* peep, uint8 ride_type); static void sub_693BAB(rct_peep* peep); static void sub_693C9E(rct_peep *peep); static void peep_spend_money(rct_peep *peep, money32 amount); +static void sub_695444(rct_peep *peep, int rideIndex, int flags); +static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price); +static bool sub_69AEB7(rct_peep *peep, int rideIndex); +static void sub_69A98C(rct_peep *peep); +static void sub_68FD3A(rct_peep *peep); static void peep_give_real_name(rct_peep *peep); const char *gPeepEasterEggNames[] = { @@ -1200,7 +1205,7 @@ void peep_update_ride_sub_state_1(rct_peep* peep){ peep->destination_tolerence = 3; ride->var_120++; - RCT2_CALLPROC_X(0x00695444, 0, 0, 0, peep->current_ride, (int)peep, 0, 0); + sub_695444(peep, peep->current_ride, 0); peep->sub_state = 17; return; } @@ -1227,7 +1232,7 @@ void peep_update_ride_sub_state_1(rct_peep* peep){ peep->current_car = 0; ride->var_120++; - RCT2_CALLPROC_X(0x00695444, 0, 0, 0, peep->current_ride, (int)peep, 0, 0); + sub_695444(peep, peep->current_ride, 0); peep->sub_state = 14; return; } @@ -1581,7 +1586,7 @@ static void peep_update_ride_sub_state_5(rct_peep* peep){ peep_window_state_update(seated_peep); seated_peep->var_E2 = 0; seated_peep->sub_state = 6; - RCT2_CALLPROC_X(0x00695444, 0, 0, 0, seated_peep->current_ride, (int)seated_peep, 0, 0); + sub_695444(seated_peep, peep->current_ride, 0); } vehicle->num_peeps++; @@ -1600,7 +1605,7 @@ static void peep_update_ride_sub_state_5(rct_peep* peep){ peep->var_E2 = 0; peep->sub_state = 6; - RCT2_CALLPROC_X(0x00695444, 0, 0, 0, peep->current_ride, (int)peep, 0, 0); + sub_695444(peep, peep->current_ride, 0); } /* rct2: 0x00693028*/ @@ -1866,7 +1871,7 @@ static void peep_update_ride_sub_state_9(rct_peep* peep){ if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO){ uint8 secondaryItem = RCT2_ADDRESS(0x0097D7CB, uint8)[ride->type * 4]; - if (!(RCT2_CALLPROC_X(0x0069AF1E, secondaryItem | (peep->current_ride << 8), 0, ride->price_secondary, 0, (int)peep, 0, 0) & 0x100)){ + if (sub_69AF1E(peep, peep->current_ride, secondaryItem, ride->price_secondary)) { ride->no_secondary_items_sold++; } } @@ -2403,7 +2408,7 @@ static void peep_update_ride_sub_state_18(rct_peep* peep){ return; } - RCT2_CALLPROC_X(0x00695444, 0, 0, 0, peep->current_ride | (1 << 8), (int)peep, 0, 0); + sub_695444(peep, peep->current_ride, 1); if (peep->flags & PEEP_FLAGS_TRACKING){ RCT2_GLOBAL(0x13CE952, uint16) = peep->name_string_idx; @@ -2907,8 +2912,8 @@ static void peep_update_sweeping(rct_peep* peep){ invalidate_sprite((rct_sprite*)peep); if (peep->action == PEEP_ACTION_STAFF_SWEEP && peep->action_frame == 8){ - //Remove sick at this location - RCT2_CALLPROC_X(0x6738E1, peep->x, 0, peep->y, peep->z, 0, 0, 0); + // Remove sick at this location + sub_6738E1(peep->x, peep->y, peep->z); peep->staff_litter_swept++; peep->var_45 |= (1 << 4); } @@ -3363,13 +3368,11 @@ static void peep_update_buying(rct_peep* peep) if (peep->current_ride != peep->previous_ride){ if (ride->type == RIDE_TYPE_CASH_MACHINE){ - item_bought = !(RCT2_CALLPROC_X(0x0069AEB7, peep->current_ride << 8, 0, 0, 0, (int)peep, 0, 0) & 0x100); - - if (!item_bought){ + item_bought = sub_69AEB7(peep, peep->current_ride); + if (!item_bought) { peep->previous_ride = peep->current_ride; peep->previous_ride_time_out = 0; - } - else{ + } else { peep->action = PEEP_ACTION_WITHDRAW_MONEY; peep->action_frame = 0; peep->action_sprite_image_offset = 0; @@ -3385,9 +3388,8 @@ static void peep_update_buying(rct_peep* peep) if (ride_type->shop_item_secondary != 0xFF){ money16 price = ride->price_secondary; - item_bought = !(RCT2_CALLPROC_X(0x0069AF1E, ride_type->shop_item_secondary | (peep->current_ride << 8), 0, price, 0, (int)peep, 0, 0) & 0x100); - - if (item_bought){ + item_bought = sub_69AF1E(peep, peep->current_ride, ride_type->shop_item_secondary, price); + if (item_bought) { ride->no_secondary_items_sold++; } } @@ -3395,9 +3397,8 @@ static void peep_update_buying(rct_peep* peep) if (!item_bought && ride_type->shop_item != 0xFF){ money16 price = ride->price; - item_bought = !(RCT2_CALLPROC_X(0x0069AF1E, ride_type->shop_item | (peep->current_ride << 8), 0, price, 0, (int)peep, 0, 0) & 0x100); - - if (item_bought){ + item_bought = sub_69AF1E(peep, peep->current_ride, ride_type->shop_item, price); + if (item_bought) { ride->no_primary_items_sold++; } } @@ -3574,7 +3575,7 @@ static void peep_update_heading_to_inspect(rct_peep* peep){ if (peep->sub_state == 0){ peep->var_74 = 0; - RCT2_CALLPROC_X(0x0069A98C, 0, 0, 0, 0, (int)peep, 0, 0); + sub_69A98C(peep); peep->sub_state = 2; } @@ -3681,7 +3682,7 @@ static void peep_update_answering(rct_peep* peep){ peep->sub_state = 2; peep_window_state_update(peep); peep->var_74 = 0; - RCT2_CALLPROC_X(0x0069A98C, 0, 0, 0, 0, (int)peep, 0, 0); + sub_69A98C(peep); return; } sint16 x, y, xy_distance; @@ -4282,7 +4283,7 @@ static void peep_update(rct_peep *peep) peep->var_73 = carryCheck; if (carryCheck <= 255) { // loc_68FD3A - RCT2_CALLPROC_X(0x0068FD3A, 0, 0, 0, 0, (int)peep, 0, 0); + sub_68FD3A(peep); } else { // loc_68FD2F switch (peep->state) { @@ -5354,6 +5355,31 @@ static void peep_spend_money(rct_peep *peep, money32 amount) sound_play_panned(SOUND_PURCHASE, 0x8001, peep->x, peep->y, peep->z); } +static void sub_695444(rct_peep *peep, int rideIndex, int flags) +{ + RCT2_CALLPROC_X(0x00695444, 0, 0, 0, (rideIndex & 0xFF) | (flags << 8), (int)peep, 0, 0); +} + +static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price) +{ + return !(RCT2_CALLPROC_X(0x0069AF1E, shopItem | (rideIndex << 8), 0, price, 0, (int)peep, 0, 0) & 0x100); +} + +static bool sub_69AEB7(rct_peep *peep, int rideIndex) +{ + return !(RCT2_CALLPROC_X(0x0069AEB7, rideIndex << 8, 0, 0, 0, (int)peep, 0, 0) & 0x100); +} + +static void sub_69A98C(rct_peep *peep) +{ + RCT2_CALLPROC_X(0x0069A98C, 0, 0, 0, 0, (int)peep, 0, 0); +} + +static void sub_68FD3A(rct_peep *peep) +{ + RCT2_CALLPROC_X(0x0068FD3A, 0, 0, 0, 0, (int)peep, 0, 0); +} + /** * * rct2: 0x0069C483 diff --git a/src/world/sprite.c b/src/world/sprite.c index 9334aec0ee..1aec4516a4 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -1030,3 +1030,12 @@ void sub_6EC53F(rct_sprite *sprite) { RCT2_CALLPROC_X(0x006EC53F, 0, 0, 0, 0, (int)sprite, 0, 0); } + +/** + * + * rct2: 0x006738E1 + */ +void sub_6738E1(int x, int y, int z) +{ + RCT2_CALLPROC_X(0x006738E1, x, 0, y, z, 0, 0, 0); +} diff --git a/src/world/sprite.h b/src/world/sprite.h index 1d8be65694..4ca4681fef 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -258,5 +258,6 @@ void sub_6EC60B(rct_sprite* sprite); void sprite_remove(rct_sprite *sprite); void litter_create(int x, int y, int z, int direction, int type); void sub_6EC53F(rct_sprite *sprite); +void sub_6738E1(int x, int y, int z); #endif From 3d6988b0f79966bb701c865b3b645ccc3d680fb2 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 2 Jul 2015 18:39:32 +0100 Subject: [PATCH 0167/1173] isolate callprocs in rct1.c and add reset cash function --- src/editor.c | 2 +- src/management/finance.c | 11 ++++- src/management/finance.h | 1 + src/rct1.c | 88 ++++++++++++++++++++++++++++++++++++---- 4 files changed, 91 insertions(+), 11 deletions(-) diff --git a/src/editor.c b/src/editor.c index 46707139c2..8209478e56 100644 --- a/src/editor.c +++ b/src/editor.c @@ -475,7 +475,7 @@ static int editor_read_s6(const char *path) ); RCT2_GLOBAL(0x013573DC, uint32) = min(RCT2_GLOBAL(0x013573DC, uint32), 100000); - RCT2_CALLPROC_EBPSAFE(0x0069E89B); + finance_reset_cash_to_initial(); sub_69E869(); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = clamp( diff --git a/src/management/finance.c b/src/management/finance.c index 1de6204ec8..8762949036 100644 --- a/src/management/finance.c +++ b/src/management/finance.c @@ -350,4 +350,13 @@ void finance_shift_expenditure_table() { } // Invalidate the expenditure table window window_invalidate_by_number(0x1C, 0); -} \ No newline at end of file +} + +/** + * + * rct2: 0x0069E89B + */ +void finance_reset_cash_to_initial() +{ + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32) = ENCRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32)); +} diff --git a/src/management/finance.h b/src/management/finance.h index 16291ab7b5..fb4755a0cc 100644 --- a/src/management/finance.h +++ b/src/management/finance.h @@ -62,6 +62,7 @@ void finance_init(); void finance_update_daily_profit(); void finance_shift_expenditure_table(); void sub_69E869(); +void finance_reset_cash_to_initial(); void finance_set_loan(money32 loan); money32 finance_get_initial_cash(); diff --git a/src/rct1.c b/src/rct1.c index da29a29f83..349b2d0768 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -52,6 +52,13 @@ static void rct1_reset_research(); static void sub_69F06A(); static void sub_666DFD(); +static void sub_69F007(); +static void sub_69F44B(); +static void sub_69F143(); +static void sub_69F2D0(); +static void sub_69F3AB(); +static void sub_6A2730(); +static void sub_69E891(); static void read(void *dst, void *src, int length) { @@ -182,7 +189,7 @@ void rct1_fix_landscape() rct_sprite *sprite; rct_ride *ride; - RCT2_CALLPROC_EBPSAFE(0x0069F007); + sub_69F007(); // Free sprite user strings for (i = 0; i < MAX_SPRITES; i++) { @@ -202,16 +209,16 @@ void rct1_fix_landscape() RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_GUEST_CHANGE_MODIFIER, uint8) = 0; - RCT2_CALLPROC_EBPSAFE(0x0069F44B); + sub_69F44B(); sub_69F06A(); - RCT2_CALLPROC_EBPSAFE(0x0069F143); - RCT2_CALLPROC_EBPSAFE(0x0069F2D0); - RCT2_CALLPROC_EBPSAFE(0x0069F3AB); + sub_69F143(); + sub_69F2D0(); + sub_69F3AB(); rct1_remove_rides(); object_unload_all(); rct1_load_default_objects(); reset_loaded_objects(); - RCT2_CALLPROC_EBPSAFE(0x006A2730); + sub_6A2730(); rct1_fix_scenery(); rct1_fix_terrain(); rct1_fix_entrance_positions(); @@ -252,7 +259,7 @@ void rct1_fix_landscape() MONEY(10000,00), RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) ); - RCT2_CALLPROC_EBPSAFE(0x0069E89B); + finance_reset_cash_to_initial(); sub_69E869(); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = clamp( @@ -466,7 +473,7 @@ static void sub_69F06A() } if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 6))) { RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 6); - RCT2_CALLPROC_EBPSAFE(0x0069E891); + sub_69E891(); } RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 7); if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 8))) { @@ -475,7 +482,7 @@ static void sub_69F06A() } if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 9))) { RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 9); - RCT2_CALLPROC_EBPSAFE(0x0069E89B); + finance_reset_cash_to_initial(); } if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 13))) { RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 13); @@ -518,6 +525,69 @@ static void sub_666DFD() } while (!map_element_is_last_for_tile(mapElement++)); } +/** + * + * rct2: 0x0069F007 + */ +static void sub_69F007() +{ + RCT2_CALLPROC_EBPSAFE(0x0069F007); +} + +/** + * + * rct2: 0x0069F44B + */ +static void sub_69F44B() +{ + RCT2_CALLPROC_EBPSAFE(0x0069F44B); +} + +/** + * + * rct2: 0x0069F143 + */ +static void sub_69F143() +{ + RCT2_CALLPROC_EBPSAFE(0x0069F143); +} + +/** + * + * rct2: 0x0069F2D0 + */ +static void sub_69F2D0() +{ + RCT2_CALLPROC_EBPSAFE(0x0069F2D0); +} + +/** + * + * rct2: 0x0069F3AB + */ +static void sub_69F3AB() +{ + RCT2_CALLPROC_EBPSAFE(0x0069F3AB); +} + +/** + * + * rct2: 0x006A2730 + */ +static void sub_6A2730() +{ + RCT2_CALLPROC_EBPSAFE(0x006A2730); +} + +/** + * + * rct2: 0x0069E891 + */ +static void sub_69E891() +{ + RCT2_CALLPROC_EBPSAFE(0x0069E891); +} + #pragma region Tables const uint8 RCT1TerrainConvertTable[16] = { From f729ed028face676510f89226957c15512847c90 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 2 Jul 2015 18:55:14 +0100 Subject: [PATCH 0168/1173] change callproc to actual implementation --- src/title.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/title.c b/src/title.c index b8c9e715ab..310dba3c7e 100644 --- a/src/title.c +++ b/src/title.c @@ -203,7 +203,7 @@ static int title_load_park(const char *path) window_new_ride_init_vars(); if (_strcmpi(path_get_extension(path), ".sv6") != 0) sub_684AC3(); - RCT2_CALLPROC_EBPSAFE(0x006DFEE4); + scenery_set_default_placement_configuration(); news_item_init_queue(); gfx_invalidate_screen(); RCT2_GLOBAL(0x009DEA66, sint16) = 0; From ca4f2d0fa37ac644bd0d1846472add8282a45826 Mon Sep 17 00:00:00 2001 From: "Miso Zmiric (Mike Squinter)" Date: Fri, 3 Jul 2015 06:53:27 +0100 Subject: [PATCH 0169/1173] remove libs from orct repo, add dependencies pull to prebuilds, update unix scripts --- .gitignore | 6 +- CMakeLists.txt | 14 +- clean.sh | 1 + install.sh | 18 +- lib/argparse/argparse.c | 323 -- lib/argparse/argparse.h | 132 - lib/cutest/CuTest.c | 339 -- lib/cutest/CuTest.h | 116 - lib/cutest/license.txt | 38 - lib/libspeex/arch.h | 239 - lib/libspeex/config.h | 20 - lib/libspeex/os_support.h | 169 - lib/libspeex/resample.c | 1131 ----- lib/libspeex/speex/speex_resampler.h | 340 -- lib/libspeex/speex/speex_types.h | 126 - lib/libspeex/stack_alloc.h | 115 - lib/lodepng/lodepng.c | 6260 -------------------------- lib/lodepng/lodepng.h | 1716 ------- pre-build.ps1 | 16 +- 19 files changed, 27 insertions(+), 11092 deletions(-) delete mode 100644 lib/argparse/argparse.c delete mode 100644 lib/argparse/argparse.h delete mode 100644 lib/cutest/CuTest.c delete mode 100644 lib/cutest/CuTest.h delete mode 100644 lib/cutest/license.txt delete mode 100644 lib/libspeex/arch.h delete mode 100644 lib/libspeex/config.h delete mode 100644 lib/libspeex/os_support.h delete mode 100644 lib/libspeex/resample.c delete mode 100644 lib/libspeex/speex/speex_resampler.h delete mode 100644 lib/libspeex/speex/speex_types.h delete mode 100644 lib/libspeex/stack_alloc.h delete mode 100644 lib/lodepng/lodepng.c delete mode 100644 lib/lodepng/lodepng.h diff --git a/.gitignore b/.gitignore index 05e8466434..a23212bf70 100644 --- a/.gitignore +++ b/.gitignore @@ -11,10 +11,8 @@ distribution/windows/*.exe # Build artifacts .cache -#libcurl -lib/libcurl/ -#libjansson -lib/jansson/ +#lib +lib ################# ## Eclipse diff --git a/CMakeLists.txt b/CMakeLists.txt index 2f830b4805..d3d7289ca5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,10 +29,10 @@ add_definitions(-DCURL_STATICLIB) #uncomment the line bellow if you don't want to build openrct2 with twitch integration #add_definitions(-DDISABLE_HTTP -DDISABLE_TWITCH) -set(ORCALIBS_INCLUDE /usr/local/cross-tools/orcalibs/include) -set(JANSSON_INCLUDE /usr/local/cross-tools/orcalibs/include/jansson) -set(ORCALIBS_LIB_DIR /usr/local/cross-tools/orcalibs/lib) -set(ORCALIBS_LIB jansson curl ssl crypto ws2_32) +set(ORCTLIBS_INCLUDE /usr/local/cross-tools/orctlibs/include) +set(JANSSON_INCLUDE /usr/local/cross-tools/orctlibs/include/jansson) +set(ORCTLIBS_LIB_DIR /usr/local/cross-tools/orctlibs/lib) +set(ORCTLIBS_LIB jansson curl ssl crypto ws2_32) # include lib include_directories("lib/") @@ -52,8 +52,8 @@ if (UNIX) INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS}) endif (UNIX) -INCLUDE_DIRECTORIES(${ORCALIBS_INCLUDE} ${JANSSON_INCLUDE}) -LINK_DIRECTORIES(${SDL2_LIBRARY_DIRS} ${ORCALIBS_LIB_DIR}) +INCLUDE_DIRECTORIES(${ORCTLIBS_INCLUDE} ${JANSSON_INCLUDE}) +LINK_DIRECTORIES(${SDL2_LIBRARY_DIRS} ${ORCTLIBS_LIB_DIR}) # build as library for now, replace with add_executable add_library(${PROJECT} SHARED ${ORCT2_SOURCES}) @@ -64,7 +64,7 @@ add_library(${PROJECT} SHARED ${ORCT2_SOURCES}) # libopenrct2.dll -> openrct2.dll set_target_properties(${PROJECT} PROPERTIES PREFIX "") -TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCALIBS_LIB}) +TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB}) if (WIN32) target_link_libraries(${PROJECT} winmm.lib -limm32 -lversion -ldsound) diff --git a/clean.sh b/clean.sh index 85a5dac6d8..24517377fa 100755 --- a/clean.sh +++ b/clean.sh @@ -4,5 +4,6 @@ set -ev sudo rm -rf /usr/local/cross-tools/i686-w64-mingw32 sudo rm -rf /usr/local/cross-tools/orcalibs +sudo rm -rf /usr/local/cross-tools/orctlibs rm -rf .cache rm -rf build diff --git a/install.sh b/install.sh index 72cef29197..fdc3a6778a 100755 --- a/install.sh +++ b/install.sh @@ -84,12 +84,13 @@ if [[ ! -d $cachedir/SDL2-${SDL2_PV} ]]; then tar -xzf SDL2-devel-${SDL2_PV}-mingw.tar.gz popd fi -if [[ ! -f $cachedir/orcalibs.zip ]]; then - wget http://misozmiric.com/ted/openrct2/orcalibs-unix.zip --output-document $cachedir/orcalibs.zip; +if [[ ! -f $cachedir/orctlibs.zip ]]; then + wget https://download.openrct2.website/dev/lib/mingw --secure-protocol=tlsv1_2 --output-document $cachedir/orctlibs.zip; fi -if [[ ! -d $cachedir/orcalibs ]]; then - pushd $cachedir - unzip -uaq orcalibs.zip +if [[ ! -d $cachedir/orctlibs ]]; then + mkdir -p $cachedir/orctlibs + pushd $cachedir/orctlibs + unzip -uaq ../orctlibs.zip popd fi @@ -111,8 +112,11 @@ fi if [[ ! -d /usr/local/cross-tools/i686-w64-mingw32 ]]; then sudo cp -r $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32 /usr/local/cross-tools/ fi -if [[ ! -d /usr/local/cross-tools/orcalibs ]]; then - sudo cp -r $cachedir/orcalibs /usr/local/cross-tools/ +if [[ ! -d /usr/local/cross-tools/orctlibs ]]; then + sudo mkdir -p /usr/local/cross-tools/orctlibs + mkdir -p lib + sudo cp -rf $cachedir/orctlibs/glob/* /usr/local/cross-tools/orctlibs/. + cp -rf $cachedir/orctlibs/local/* ./lib/. fi if [[ ! -f $cachedir/i686-w64-mingw32-pkg-config ]]; then diff --git a/lib/argparse/argparse.c b/lib/argparse/argparse.c deleted file mode 100644 index 3ecd4d1f2e..0000000000 --- a/lib/argparse/argparse.c +++ /dev/null @@ -1,323 +0,0 @@ -#include "argparse.h" - -#define OPT_UNSET 1 - -static const char * -prefix_skip(const char *str, const char *prefix) -{ - size_t len = strlen(prefix); - return strncmp(str, prefix, len) ? NULL : str + len; -} - -int -prefix_cmp(const char *str, const char *prefix) -{ - for (;; str++, prefix++) - if (!*prefix) - return 0; - else if (*str != *prefix) - return (unsigned char)*prefix - (unsigned char)*str; -} - -static void -argparse_error(struct argparse *this, const struct argparse_option *opt, - const char *reason) -{ - if (!strncmp(this->argv[0], "--", 2)) { - fprintf(stderr, "error: option `%s` %s\n", opt->long_name, reason); - exit(1); - } else { - fprintf(stderr, "error: option `%c` %s\n", opt->short_name, reason); - exit(1); - } -} - -static int -argparse_getvalue(struct argparse *this, const struct argparse_option *opt, - int flags) -{ - const char *s = NULL; - if (!opt->value) - goto skipped; - switch (opt->type) { - case ARGPARSE_OPT_BOOLEAN: - if (flags & OPT_UNSET) { - *(int *)opt->value = *(int *)opt->value - 1; - } else { - *(int *)opt->value = *(int *)opt->value + 1; - } - if (*(int *)opt->value < 0) { - *(int *)opt->value = 0; - } - break; - case ARGPARSE_OPT_BIT: - if (flags & OPT_UNSET) { - *(int *)opt->value &= ~opt->data; - } else { - *(int *)opt->value |= opt->data; - } - break; - case ARGPARSE_OPT_STRING: - if (this->optvalue) { - *(const char **)opt->value = this->optvalue; - this->optvalue = NULL; - } else if (this->argc > 1) { - this->argc--; - *(const char **)opt->value = *++this->argv; - } else { - argparse_error(this, opt, "requires a value"); - } - break; - case ARGPARSE_OPT_INTEGER: - if (this->optvalue) { - *(int *)opt->value = strtol(this->optvalue, (char **)&s, 0); - this->optvalue = NULL; - } else if (this->argc > 1) { - this->argc--; - *(int *)opt->value = strtol(*++this->argv, (char **)&s, 0); - } else { - argparse_error(this, opt, "requires a value"); - } - if (s[0] != '\0') - argparse_error(this, opt, "expects a numerical value"); - break; - default: - assert(0); - } - -skipped: - if (opt->callback) { - return opt->callback(this, opt); - } - - return 0; -} - -static void -argparse_options_check(const struct argparse_option *options) -{ - for (; options->type != ARGPARSE_OPT_END; options++) { - switch (options->type) { - case ARGPARSE_OPT_END: - case ARGPARSE_OPT_BOOLEAN: - case ARGPARSE_OPT_BIT: - case ARGPARSE_OPT_INTEGER: - case ARGPARSE_OPT_STRING: - case ARGPARSE_OPT_GROUP: - continue; - default: - fprintf(stderr, "wrong option type: %d", options->type); - break; - } - } -} - -static int -argparse_short_opt(struct argparse *this, const struct argparse_option *options) -{ - for (; options->type != ARGPARSE_OPT_END; options++) { - if (options->short_name == *this->optvalue) { - this->optvalue = this->optvalue[1] ? this->optvalue + 1 : NULL; - return argparse_getvalue(this, options, 0); - } - } - return -2; -} - -static int -argparse_long_opt(struct argparse *this, const struct argparse_option *options) -{ - for (; options->type != ARGPARSE_OPT_END; options++) { - const char *rest; - int opt_flags = 0; - if (!options->long_name) - continue; - - rest = prefix_skip(this->argv[0] + 2, options->long_name); - if (!rest) { - // Negation allowed? - if (options->flags & OPT_NONEG) { - continue; - } - // Only boolean/bit allow negation. - if (options->type != ARGPARSE_OPT_BOOLEAN && options->type != ARGPARSE_OPT_BIT) { - continue; - } - - if (!prefix_cmp(this->argv[0] + 2, "no-")) { - rest = prefix_skip(this->argv[0] + 2 + 3, options->long_name); - if (!rest) - continue; - opt_flags |= OPT_UNSET; - } else { - continue; - } - } - if (*rest) { - if (*rest != '=') - continue; - this->optvalue = rest + 1; - } - return argparse_getvalue(this, options, opt_flags); - } - return -2; -} - -int -argparse_init(struct argparse *this, struct argparse_option *options, - const char *const *usage, int flags) -{ - memset(this, 0, sizeof(*this)); - this->options = options; - this->usage = usage; - this->flags = flags; - return 0; -} - -int -argparse_parse(struct argparse *this, int argc, const char **argv) -{ - this->argc = argc - 1; - this->argv = argv + 1; - this->out = argv; - - argparse_options_check(this->options); - - for (; this->argc; this->argc--, this->argv++) { - const char *arg = this->argv[0]; - if (arg[0] != '-' || !arg[1]) { - if (this->flags & ARGPARSE_STOP_AT_NON_OPTION) { - goto end; - } - // if it's not option or is a single char '-', copy verbatimly - this->out[this->cpidx++] = this->argv[0]; - continue; - } - // short option - if (arg[1] != '-') { - this->optvalue = arg + 1; - switch (argparse_short_opt(this, this->options)) { - case -1: - break; - case -2: - goto unknown; - } - while (this->optvalue) { - switch (argparse_short_opt(this, this->options)) { - case -1: - break; - case -2: - goto unknown; - } - } - continue; - } - // if '--' presents - if (!arg[2]) { - this->argc--; - this->argv++; - break; - } - // long option - switch (argparse_long_opt(this, this->options)) { - case -1: - break; - case -2: - goto unknown; - } - continue; - -unknown: - fprintf(stderr, "error: unknown option `%s`\n", this->argv[0]); - argparse_usage(this); - exit(1); - } - -end: - memmove(this->out + this->cpidx, this->argv, - this->argc * sizeof(*this->out)); - this->out[this->cpidx + this->argc] = NULL; - - return this->cpidx + this->argc; -} - -void -argparse_usage(struct argparse *this) -{ - fprintf(stdout, "Usage: %s\n", *this->usage++); - while (*this->usage && **this->usage) - fprintf(stdout, " or: %s\n", *this->usage++); - fputc('\n', stdout); - - const struct argparse_option *options; - - // figure out best width - size_t usage_opts_width = 0; - size_t len; - options = this->options; - for (; options->type != ARGPARSE_OPT_END; options++) { - len = 0; - if ((options)->short_name) { - len += 2; - } - if ((options)->short_name && (options)->long_name) { - len += 2; // separator ", " - } - if ((options)->long_name) { - len += strlen((options)->long_name) + 2; - } - if (options->type == ARGPARSE_OPT_INTEGER) { - len += strlen("="); - } else if (options->type == ARGPARSE_OPT_STRING) { - len += strlen("="); - } - len = ceil((float)len / 4) * 4; - if (usage_opts_width < len) { - usage_opts_width = len; - } - } - usage_opts_width += 4; // 4 spaces prefix - - options = this->options; - for (; options->type != ARGPARSE_OPT_END; options++) { - size_t pos = 0; - int pad = 0; - if (options->type == ARGPARSE_OPT_GROUP) { - fputc('\n', stdout); - pos += fprintf(stdout, "%s", options->help); - fputc('\n', stdout); - continue; - } - pos = fprintf(stdout, " "); - if (options->short_name) { - pos += fprintf(stdout, "-%c", options->short_name); - } - if (options->long_name && options->short_name) { - pos += fprintf(stdout, ", "); - } - if (options->long_name) { - pos += fprintf(stdout, "--%s", options->long_name); - } - if (options->type == ARGPARSE_OPT_INTEGER) { - pos += fprintf(stdout, "="); - } else if (options->type == ARGPARSE_OPT_STRING) { - pos += fprintf(stdout, "="); - } - if (pos <= usage_opts_width) { - pad = usage_opts_width - pos; - } else { - fputc('\n', stdout); - pad = usage_opts_width; - } - fprintf(stdout, "%*s%s\n", pad + 2, "", options->help); - } -} - -int -argparse_help_cb(struct argparse *this, const struct argparse_option *option) -{ - (void)option; - argparse_usage(this); - exit(0); - return 0; -} diff --git a/lib/argparse/argparse.h b/lib/argparse/argparse.h deleted file mode 100644 index 350ee58df4..0000000000 --- a/lib/argparse/argparse.h +++ /dev/null @@ -1,132 +0,0 @@ -#ifndef ARGPARSE_H -#define ARGPARSE_H -/** - * Command-line arguments parsing library. - * - * This module is inspired by parse-options.c (git) and python's argparse - * module. - * - * Arguments parsing is common task in cli program, but traditional `getopt` - * libraries are not easy to use. This library provides high-level arguments - * parsing solutions. - * - * The program defines what arguments it requires, and `argparse` will figure - * out how to parse those out of `argc` and `argv`, it also automatically - * generates help and usage messages and issues errors when users give the - * program invalid arguments. - * - * Reserved namespaces: - * argparse - * OPT - * Author: Yecheng Fu - */ - -#include -#include -#include -#include -#include -#include - -struct argparse; -struct argparse_option; - -typedef int argparse_callback(struct argparse *this, - const struct argparse_option *option); - -enum argparse_flag { - ARGPARSE_STOP_AT_NON_OPTION = 1, -}; - -enum argparse_option_type { - /* special */ - ARGPARSE_OPT_END, - ARGPARSE_OPT_GROUP, - /* options with no arguments */ - ARGPARSE_OPT_BOOLEAN, - ARGPARSE_OPT_BIT, - /* options with arguments (optional or required) */ - ARGPARSE_OPT_INTEGER, - ARGPARSE_OPT_STRING, -}; - -enum argparse_option_flags { - OPT_NONEG = 1, /* Negation disabled. */ -}; - -/* - * Argparse option struct. - * - * `type`: - * holds the type of the option, you must have an ARGPARSE_OPT_END last in your - * array. - * - * `short_name`: - * the character to use as a short option name, '\0' if none. - * - * `long_name`: - * the long option name, without the leading dash, NULL if none. - * - * `value`: - * stores pointer to the value to be filled. - * - * `help`: - * the short help message associated to what the option does. - * Must never be NULL (except for ARGPARSE_OPT_END). - * - * `callback`: - * function is called when corresponding argument is parsed. - * - * `data`: - * associated data. Callbacks can use it like they want. - * - * `flags`: - * option flags. - * - */ -struct argparse_option { - enum argparse_option_type type; - const char short_name; - const char *long_name; - void *value; - const char *help; - argparse_callback *callback; - intptr_t data; - int flags; -}; - -/* - * argpparse - */ -struct argparse { - // user supplied - const struct argparse_option *options; - const char *const *usage; - int flags; - // internal context - int argc; - const char **argv; - const char **out; - int cpidx; - const char *optvalue; // current option value -}; - -// builtin callbacks -int argparse_help_cb(struct argparse *this, - const struct argparse_option *option); - -// builtin option macros -#define OPT_END() { ARGPARSE_OPT_END } -#define OPT_BOOLEAN(...) { ARGPARSE_OPT_BOOLEAN, __VA_ARGS__ } -#define OPT_BIT(...) { ARGPARSE_OPT_BIT, __VA_ARGS__ } -#define OPT_INTEGER(...) { ARGPARSE_OPT_INTEGER, __VA_ARGS__ } -#define OPT_STRING(...) { ARGPARSE_OPT_STRING, __VA_ARGS__ } -#define OPT_GROUP(h) { ARGPARSE_OPT_GROUP, 0, NULL, NULL, h, NULL } -#define OPT_HELP() OPT_BOOLEAN('h', "help", NULL, "show this help message and exit", argparse_help_cb) - -int argparse_init(struct argparse *this, struct argparse_option *options, - const char *const *usage, int flags); -int argparse_parse(struct argparse *this, int argc, const char **argv); -void argparse_usage(struct argparse *this); - -#endif diff --git a/lib/cutest/CuTest.c b/lib/cutest/CuTest.c deleted file mode 100644 index 8f611991a8..0000000000 --- a/lib/cutest/CuTest.c +++ /dev/null @@ -1,339 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "CuTest.h" - -/*-------------------------------------------------------------------------* - * CuStr - *-------------------------------------------------------------------------*/ - -char* CuStrAlloc(int size) -{ - char* newStr = (char*) malloc( sizeof(char) * (size) ); - return newStr; -} - -char* CuStrCopy(const char* old) -{ - int len = strlen(old); - char* newStr = CuStrAlloc(len + 1); - strcpy(newStr, old); - return newStr; -} - -/*-------------------------------------------------------------------------* - * CuString - *-------------------------------------------------------------------------*/ - -void CuStringInit(CuString* str) -{ - str->length = 0; - str->size = STRING_MAX; - str->buffer = (char*) malloc(sizeof(char) * str->size); - str->buffer[0] = '\0'; -} - -CuString* CuStringNew(void) -{ - CuString* str = (CuString*) malloc(sizeof(CuString)); - str->length = 0; - str->size = STRING_MAX; - str->buffer = (char*) malloc(sizeof(char) * str->size); - str->buffer[0] = '\0'; - return str; -} - -void CuStringDelete(CuString *str) -{ - if (!str) return; - free(str->buffer); - free(str); -} - -void CuStringResize(CuString* str, int newSize) -{ - str->buffer = (char*) realloc(str->buffer, sizeof(char) * newSize); - str->size = newSize; -} - -void CuStringAppend(CuString* str, const char* text) -{ - int length; - - if (text == NULL) { - text = "NULL"; - } - - length = strlen(text); - if (str->length + length + 1 >= str->size) - CuStringResize(str, str->length + length + 1 + STRING_INC); - str->length += length; - strcat(str->buffer, text); -} - -void CuStringAppendChar(CuString* str, char ch) -{ - char text[2]; - text[0] = ch; - text[1] = '\0'; - CuStringAppend(str, text); -} - -void CuStringAppendFormat(CuString* str, const char* format, ...) -{ - va_list argp; - char buf[HUGE_STRING_LEN]; - va_start(argp, format); - vsprintf(buf, format, argp); - va_end(argp); - CuStringAppend(str, buf); -} - -void CuStringInsert(CuString* str, const char* text, int pos) -{ - int length = strlen(text); - if (pos > str->length) - pos = str->length; - if (str->length + length + 1 >= str->size) - CuStringResize(str, str->length + length + 1 + STRING_INC); - memmove(str->buffer + pos + length, str->buffer + pos, (str->length - pos) + 1); - str->length += length; - memcpy(str->buffer + pos, text, length); -} - -/*-------------------------------------------------------------------------* - * CuTest - *-------------------------------------------------------------------------*/ - -void CuTestInit(CuTest* t, const char* name, TestFunction function) -{ - t->name = CuStrCopy(name); - t->failed = 0; - t->ran = 0; - t->message = NULL; - t->function = function; - t->jumpBuf = NULL; -} - -CuTest* CuTestNew(const char* name, TestFunction function) -{ - CuTest* tc = CU_ALLOC(CuTest); - CuTestInit(tc, name, function); - return tc; -} - -void CuTestDelete(CuTest *t) -{ - if (!t) return; - free(t->name); - free(t); -} - -void CuTestRun(CuTest* tc) -{ - jmp_buf buf; - tc->jumpBuf = &buf; - if (setjmp(buf) == 0) - { - tc->ran = 1; - (tc->function)(tc); - } - tc->jumpBuf = 0; -} - -static void CuFailInternal(CuTest* tc, const char* file, int line, CuString* string) -{ - char buf[HUGE_STRING_LEN]; - - sprintf(buf, "%s:%d: ", file, line); - CuStringInsert(string, buf, 0); - - tc->failed = 1; - tc->message = string->buffer; - if (tc->jumpBuf != 0) longjmp(*(tc->jumpBuf), 0); -} - -void CuFail_Line(CuTest* tc, const char* file, int line, const char* message2, const char* message) -{ - CuString string; - - CuStringInit(&string); - if (message2 != NULL) - { - CuStringAppend(&string, message2); - CuStringAppend(&string, ": "); - } - CuStringAppend(&string, message); - CuFailInternal(tc, file, line, &string); -} - -void CuAssert_Line(CuTest* tc, const char* file, int line, const char* message, int condition) -{ - if (condition) return; - CuFail_Line(tc, file, line, NULL, message); -} - -void CuAssertStrEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message, - const char* expected, const char* actual) -{ - CuString string; - if ((expected == NULL && actual == NULL) || - (expected != NULL && actual != NULL && - strcmp(expected, actual) == 0)) - { - return; - } - - CuStringInit(&string); - if (message != NULL) - { - CuStringAppend(&string, message); - CuStringAppend(&string, ": "); - } - CuStringAppend(&string, "expected <"); - CuStringAppend(&string, expected); - CuStringAppend(&string, "> but was <"); - CuStringAppend(&string, actual); - CuStringAppend(&string, ">"); - CuFailInternal(tc, file, line, &string); -} - -void CuAssertIntEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message, - int expected, int actual) -{ - char buf[STRING_MAX]; - if (expected == actual) return; - sprintf(buf, "expected <%d> but was <%d>", expected, actual); - CuFail_Line(tc, file, line, message, buf); -} - -void CuAssertDblEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message, - double expected, double actual, double delta) -{ - char buf[STRING_MAX]; - if (fabs(expected - actual) <= delta) return; - sprintf(buf, "expected <%f> but was <%f>", expected, actual); - - CuFail_Line(tc, file, line, message, buf); -} - -void CuAssertPtrEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message, - void* expected, void* actual) -{ - char buf[STRING_MAX]; - if (expected == actual) return; - sprintf(buf, "expected pointer <0x%p> but was <0x%p>", expected, actual); - CuFail_Line(tc, file, line, message, buf); -} - - -/*-------------------------------------------------------------------------* - * CuSuite - *-------------------------------------------------------------------------*/ - -void CuSuiteInit(CuSuite* testSuite) -{ - testSuite->count = 0; - testSuite->failCount = 0; - memset(testSuite->list, 0, sizeof(testSuite->list)); -} - -CuSuite* CuSuiteNew(void) -{ - CuSuite* testSuite = CU_ALLOC(CuSuite); - CuSuiteInit(testSuite); - return testSuite; -} - -void CuSuiteDelete(CuSuite *testSuite) -{ - unsigned int n; - for (n=0; n < MAX_TEST_CASES; n++) - { - if (testSuite->list[n]) - { - CuTestDelete(testSuite->list[n]); - } - } - free(testSuite); - -} - -void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase) -{ - assert(testSuite->count < MAX_TEST_CASES); - testSuite->list[testSuite->count] = testCase; - testSuite->count++; -} - -void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2) -{ - int i; - for (i = 0 ; i < testSuite2->count ; ++i) - { - CuTest* testCase = testSuite2->list[i]; - CuSuiteAdd(testSuite, testCase); - } -} - -void CuSuiteRun(CuSuite* testSuite) -{ - int i; - for (i = 0 ; i < testSuite->count ; ++i) - { - CuTest* testCase = testSuite->list[i]; - CuTestRun(testCase); - if (testCase->failed) { testSuite->failCount += 1; } - } -} - -void CuSuiteSummary(CuSuite* testSuite, CuString* summary) -{ - int i; - for (i = 0 ; i < testSuite->count ; ++i) - { - CuTest* testCase = testSuite->list[i]; - CuStringAppend(summary, testCase->failed ? "F" : "."); - } - CuStringAppend(summary, "\n\n"); -} - -void CuSuiteDetails(CuSuite* testSuite, CuString* details) -{ - int i; - int failCount = 0; - - if (testSuite->failCount == 0) - { - int passCount = testSuite->count - testSuite->failCount; - const char* testWord = passCount == 1 ? "test" : "tests"; - CuStringAppendFormat(details, "OK (%d %s)\n", passCount, testWord); - } - else - { - if (testSuite->failCount == 1) - CuStringAppend(details, "There was 1 failure:\n"); - else - CuStringAppendFormat(details, "There were %d failures:\n", testSuite->failCount); - - for (i = 0 ; i < testSuite->count ; ++i) - { - CuTest* testCase = testSuite->list[i]; - if (testCase->failed) - { - failCount++; - CuStringAppendFormat(details, "%d) %s: %s\n", - failCount, testCase->name, testCase->message); - } - } - CuStringAppend(details, "\n!!!FAILURES!!!\n"); - - CuStringAppendFormat(details, "Runs: %d ", testSuite->count); - CuStringAppendFormat(details, "Passes: %d ", testSuite->count - testSuite->failCount); - CuStringAppendFormat(details, "Fails: %d\n", testSuite->failCount); - } -} diff --git a/lib/cutest/CuTest.h b/lib/cutest/CuTest.h deleted file mode 100644 index 8b32773d2b..0000000000 --- a/lib/cutest/CuTest.h +++ /dev/null @@ -1,116 +0,0 @@ -#ifndef CU_TEST_H -#define CU_TEST_H - -#include -#include - -#define CUTEST_VERSION "CuTest 1.5" - -/* CuString */ - -char* CuStrAlloc(int size); -char* CuStrCopy(const char* old); - -#define CU_ALLOC(TYPE) ((TYPE*) malloc(sizeof(TYPE))) - -#define HUGE_STRING_LEN 8192 -#define STRING_MAX 256 -#define STRING_INC 256 - -typedef struct -{ - int length; - int size; - char* buffer; -} CuString; - -void CuStringInit(CuString* str); -CuString* CuStringNew(void); -void CuStringRead(CuString* str, const char* path); -void CuStringAppend(CuString* str, const char* text); -void CuStringAppendChar(CuString* str, char ch); -void CuStringAppendFormat(CuString* str, const char* format, ...); -void CuStringInsert(CuString* str, const char* text, int pos); -void CuStringResize(CuString* str, int newSize); -void CuStringDelete(CuString* str); - -/* CuTest */ - -typedef struct CuTest CuTest; - -typedef void (*TestFunction)(CuTest *); - -struct CuTest -{ - char* name; - TestFunction function; - int failed; - int ran; - const char* message; - jmp_buf *jumpBuf; -}; - -void CuTestInit(CuTest* t, const char* name, TestFunction function); -CuTest* CuTestNew(const char* name, TestFunction function); -void CuTestRun(CuTest* tc); -void CuTestDelete(CuTest *t); - -/* Internal versions of assert functions -- use the public versions */ -void CuFail_Line(CuTest* tc, const char* file, int line, const char* message2, const char* message); -void CuAssert_Line(CuTest* tc, const char* file, int line, const char* message, int condition); -void CuAssertStrEquals_LineMsg(CuTest* tc, - const char* file, int line, const char* message, - const char* expected, const char* actual); -void CuAssertIntEquals_LineMsg(CuTest* tc, - const char* file, int line, const char* message, - int expected, int actual); -void CuAssertDblEquals_LineMsg(CuTest* tc, - const char* file, int line, const char* message, - double expected, double actual, double delta); -void CuAssertPtrEquals_LineMsg(CuTest* tc, - const char* file, int line, const char* message, - void* expected, void* actual); - -/* public assert functions */ - -#define CuFail(tc, ms) CuFail_Line( (tc), __FILE__, __LINE__, NULL, (ms)) -#define CuAssert(tc, ms, cond) CuAssert_Line((tc), __FILE__, __LINE__, (ms), (cond)) -#define CuAssertTrue(tc, cond) CuAssert_Line((tc), __FILE__, __LINE__, "assert failed", (cond)) - -#define CuAssertStrEquals(tc,ex,ac) CuAssertStrEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac)) -#define CuAssertStrEquals_Msg(tc,ms,ex,ac) CuAssertStrEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac)) -#define CuAssertIntEquals(tc,ex,ac) CuAssertIntEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac)) -#define CuAssertIntEquals_Msg(tc,ms,ex,ac) CuAssertIntEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac)) -#define CuAssertDblEquals(tc,ex,ac,dl) CuAssertDblEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac),(dl)) -#define CuAssertDblEquals_Msg(tc,ms,ex,ac,dl) CuAssertDblEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac),(dl)) -#define CuAssertPtrEquals(tc,ex,ac) CuAssertPtrEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac)) -#define CuAssertPtrEquals_Msg(tc,ms,ex,ac) CuAssertPtrEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac)) - -#define CuAssertPtrNotNull(tc,p) CuAssert_Line((tc),__FILE__,__LINE__,"null pointer unexpected",(p != NULL)) -#define CuAssertPtrNotNullMsg(tc,msg,p) CuAssert_Line((tc),__FILE__,__LINE__,(msg),(p != NULL)) - -/* CuSuite */ - -#define MAX_TEST_CASES 1024 - -#define SUITE_ADD_TEST(SUITE,TEST) CuSuiteAdd(SUITE, CuTestNew(#TEST, TEST)) - -typedef struct -{ - int count; - CuTest* list[MAX_TEST_CASES]; - int failCount; - -} CuSuite; - - -void CuSuiteInit(CuSuite* testSuite); -CuSuite* CuSuiteNew(void); -void CuSuiteDelete(CuSuite *testSuite); -void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase); -void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2); -void CuSuiteRun(CuSuite* testSuite); -void CuSuiteSummary(CuSuite* testSuite, CuString* summary); -void CuSuiteDetails(CuSuite* testSuite, CuString* details); - -#endif /* CU_TEST_H */ diff --git a/lib/cutest/license.txt b/lib/cutest/license.txt deleted file mode 100644 index fd81689df4..0000000000 --- a/lib/cutest/license.txt +++ /dev/null @@ -1,38 +0,0 @@ -NOTE - -The license is based on the zlib/libpng license. For more details see -http://www.opensource.org/licenses/zlib-license.html. The intent of the -license is to: - -- keep the license as simple as possible -- encourage the use of CuTest in both free and commercial applications - and libraries -- keep the source code together -- give credit to the CuTest contributors for their work - -If you ship CuTest in source form with your source distribution, the -following license document must be included with it in unaltered form. -If you find CuTest useful we would like to hear about it. - -LICENSE - -Copyright (c) 2003 Asim Jalis - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not -claim that you wrote the original software. If you use this software in -a product, an acknowledgment in the product documentation would be -appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and must not -be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. diff --git a/lib/libspeex/arch.h b/lib/libspeex/arch.h deleted file mode 100644 index d38c36ce7c..0000000000 --- a/lib/libspeex/arch.h +++ /dev/null @@ -1,239 +0,0 @@ -/* Copyright (C) 2003 Jean-Marc Valin */ -/** - @file arch.h - @brief Various architecture definitions Speex -*/ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - - Neither the name of the Xiph.org Foundation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef ARCH_H -#define ARCH_H - -#ifndef SPEEX_VERSION -#define SPEEX_MAJOR_VERSION 1 /**< Major Speex version. */ -#define SPEEX_MINOR_VERSION 1 /**< Minor Speex version. */ -#define SPEEX_MICRO_VERSION 15 /**< Micro Speex version. */ -#define SPEEX_EXTRA_VERSION "" /**< Extra Speex version. */ -#define SPEEX_VERSION "speex-1.2beta3" /**< Speex version string. */ -#endif - -/* A couple test to catch stupid option combinations */ -#ifdef FIXED_POINT - -#ifdef FLOATING_POINT -#error You cannot compile as floating point and fixed point at the same time -#endif -#ifdef _USE_SSE -#error SSE is only for floating-point -#endif -#if ((defined (ARM4_ASM)||defined (ARM4_ASM)) && defined(BFIN_ASM)) || (defined (ARM4_ASM)&&defined(ARM5E_ASM)) -#error Make up your mind. What CPU do you have? -#endif -#ifdef VORBIS_PSYCHO -#error Vorbis-psy model currently not implemented in fixed-point -#endif - -#else - -#ifndef FLOATING_POINT -#error You now need to define either FIXED_POINT or FLOATING_POINT -#endif -#if defined (ARM4_ASM) || defined(ARM5E_ASM) || defined(BFIN_ASM) -#error I suppose you can have a [ARM4/ARM5E/Blackfin] that has float instructions? -#endif -#ifdef FIXED_POINT_DEBUG -#error "Don't you think enabling fixed-point is a good thing to do if you want to debug that?" -#endif - - -#endif - -#ifndef OUTSIDE_SPEEX -#include "speex/speex_types.h" -#endif - -#define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */ -#define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */ -#define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 16-bit value. */ -#define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ -#define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */ -#define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 32-bit value. */ -#define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ - -#ifdef FIXED_POINT - -typedef spx_int16_t spx_word16_t; -typedef spx_int32_t spx_word32_t; -typedef spx_word32_t spx_mem_t; -typedef spx_word16_t spx_coef_t; -typedef spx_word16_t spx_lsp_t; -typedef spx_word32_t spx_sig_t; - -#define Q15ONE 32767 - -#define LPC_SCALING 8192 -#define SIG_SCALING 16384 -#define LSP_SCALING 8192. -#define GAMMA_SCALING 32768. -#define GAIN_SCALING 64 -#define GAIN_SCALING_1 0.015625 - -#define LPC_SHIFT 13 -#define LSP_SHIFT 13 -#define SIG_SHIFT 14 -#define GAIN_SHIFT 6 - -#define VERY_SMALL 0 -#define VERY_LARGE32 ((spx_word32_t)2147483647) -#define VERY_LARGE16 ((spx_word16_t)32767) -#define Q15_ONE ((spx_word16_t)32767) - - -#ifdef FIXED_DEBUG -#include "fixed_debug.h" -#else - -#include "fixed_generic.h" - -#ifdef ARM5E_ASM -#include "fixed_arm5e.h" -#elif defined (ARM4_ASM) -#include "fixed_arm4.h" -#elif defined (BFIN_ASM) -#include "fixed_bfin.h" -#endif - -#endif - - -#else - -typedef float spx_mem_t; -typedef float spx_coef_t; -typedef float spx_lsp_t; -typedef float spx_sig_t; -typedef float spx_word16_t; -typedef float spx_word32_t; - -#define Q15ONE 1.0f -#define LPC_SCALING 1.f -#define SIG_SCALING 1.f -#define LSP_SCALING 1.f -#define GAMMA_SCALING 1.f -#define GAIN_SCALING 1.f -#define GAIN_SCALING_1 1.f - - -#define VERY_SMALL 1e-15f -#define VERY_LARGE32 1e15f -#define VERY_LARGE16 1e15f -#define Q15_ONE ((spx_word16_t)1.f) - -#define QCONST16(x,bits) (x) -#define QCONST32(x,bits) (x) - -#define NEG16(x) (-(x)) -#define NEG32(x) (-(x)) -#define EXTRACT16(x) (x) -#define EXTEND32(x) (x) -#define SHR16(a,shift) (a) -#define SHL16(a,shift) (a) -#define SHR32(a,shift) (a) -#define SHL32(a,shift) (a) -#define PSHR16(a,shift) (a) -#define PSHR32(a,shift) (a) -#define VSHR32(a,shift) (a) -#define SATURATE16(x,a) (x) -#define SATURATE32(x,a) (x) - -#define PSHR(a,shift) (a) -#define SHR(a,shift) (a) -#define SHL(a,shift) (a) -#define SATURATE(x,a) (x) - -#define ADD16(a,b) ((a)+(b)) -#define SUB16(a,b) ((a)-(b)) -#define ADD32(a,b) ((a)+(b)) -#define SUB32(a,b) ((a)-(b)) -#define MULT16_16_16(a,b) ((a)*(b)) -#define MULT16_16(a,b) ((spx_word32_t)(a)*(spx_word32_t)(b)) -#define MAC16_16(c,a,b) ((c)+(spx_word32_t)(a)*(spx_word32_t)(b)) - -#define MULT16_32_Q11(a,b) ((a)*(b)) -#define MULT16_32_Q13(a,b) ((a)*(b)) -#define MULT16_32_Q14(a,b) ((a)*(b)) -#define MULT16_32_Q15(a,b) ((a)*(b)) -#define MULT16_32_P15(a,b) ((a)*(b)) - -#define MAC16_32_Q11(c,a,b) ((c)+(a)*(b)) -#define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) - -#define MAC16_16_Q11(c,a,b) ((c)+(a)*(b)) -#define MAC16_16_Q13(c,a,b) ((c)+(a)*(b)) -#define MAC16_16_P13(c,a,b) ((c)+(a)*(b)) -#define MULT16_16_Q11_32(a,b) ((a)*(b)) -#define MULT16_16_Q13(a,b) ((a)*(b)) -#define MULT16_16_Q14(a,b) ((a)*(b)) -#define MULT16_16_Q15(a,b) ((a)*(b)) -#define MULT16_16_P15(a,b) ((a)*(b)) -#define MULT16_16_P13(a,b) ((a)*(b)) -#define MULT16_16_P14(a,b) ((a)*(b)) - -#define DIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b)) -#define PDIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b)) -#define DIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b)) -#define PDIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b)) - - -#endif - - -#if defined (CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) - -/* 2 on TI C5x DSP */ -#define BYTES_PER_CHAR 2 -#define BITS_PER_CHAR 16 -#define LOG2_BITS_PER_CHAR 4 - -#else - -#define BYTES_PER_CHAR 1 -#define BITS_PER_CHAR 8 -#define LOG2_BITS_PER_CHAR 3 - -#endif - - - -#ifdef FIXED_DEBUG -extern long long spx_mips; -#endif - - -#endif diff --git a/lib/libspeex/config.h b/lib/libspeex/config.h deleted file mode 100644 index abd35f0914..0000000000 --- a/lib/libspeex/config.h +++ /dev/null @@ -1,20 +0,0 @@ -// Microsoft version of 'inline' -#define inline __inline - -// Visual Studio support alloca(), but it always align variables to 16-bit -// boundary, while SSE need 128-bit alignment. So we disable alloca() when -// SSE is enabled. -#ifndef _USE_SSE -# define USE_ALLOCA -#endif - -/* Default to floating point */ -#ifndef FIXED_POINT -# define FLOATING_POINT -# define USE_SMALLFT -#else -# define USE_KISS_FFT -#endif - -/* We don't support visibility on Win32 */ -#define EXPORT diff --git a/lib/libspeex/os_support.h b/lib/libspeex/os_support.h deleted file mode 100644 index 6b74b0c22f..0000000000 --- a/lib/libspeex/os_support.h +++ /dev/null @@ -1,169 +0,0 @@ -/* Copyright (C) 2007 Jean-Marc Valin - - File: os_support.h - This is the (tiny) OS abstraction layer. Aside from math.h, this is the - only place where system headers are allowed. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef OS_SUPPORT_H -#define OS_SUPPORT_H - -#include -#include -#include - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif -#ifdef OS_SUPPORT_CUSTOM -#include "os_support_custom.h" -#endif - -/** Speex wrapper for calloc. To do your own dynamic allocation, all you need to do is replace this function, speex_realloc and speex_free - NOTE: speex_alloc needs to CLEAR THE MEMORY */ -#ifndef OVERRIDE_SPEEX_ALLOC -static inline void *speex_alloc (int size) -{ - /* WARNING: this is not equivalent to malloc(). If you want to use malloc() - or your own allocator, YOU NEED TO CLEAR THE MEMORY ALLOCATED. Otherwise - you will experience strange bugs */ - return calloc(size,1); -} -#endif - -/** Same as speex_alloc, except that the area is only needed inside a Speex call (might cause problem with wideband though) */ -#ifndef OVERRIDE_SPEEX_ALLOC_SCRATCH -static inline void *speex_alloc_scratch (int size) -{ - /* Scratch space doesn't need to be cleared */ - return calloc(size,1); -} -#endif - -/** Speex wrapper for realloc. To do your own dynamic allocation, all you need to do is replace this function, speex_alloc and speex_free */ -#ifndef OVERRIDE_SPEEX_REALLOC -static inline void *speex_realloc (void *ptr, int size) -{ - return realloc(ptr, size); -} -#endif - -/** Speex wrapper for calloc. To do your own dynamic allocation, all you need to do is replace this function, speex_realloc and speex_alloc */ -#ifndef OVERRIDE_SPEEX_FREE -static inline void speex_free (void *ptr) -{ - free(ptr); -} -#endif - -/** Same as speex_free, except that the area is only needed inside a Speex call (might cause problem with wideband though) */ -#ifndef OVERRIDE_SPEEX_FREE_SCRATCH -static inline void speex_free_scratch (void *ptr) -{ - free(ptr); -} -#endif - -/** Copy n bytes of memory from src to dst. The 0* term provides compile-time type checking */ -#ifndef OVERRIDE_SPEEX_COPY -#define SPEEX_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) -#endif - -/** Copy n bytes of memory from src to dst, allowing overlapping regions. The 0* term - provides compile-time type checking */ -#ifndef OVERRIDE_SPEEX_MOVE -#define SPEEX_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) -#endif - -/** Set n bytes of memory to value of c, starting at address s */ -#ifndef OVERRIDE_SPEEX_MEMSET -#define SPEEX_MEMSET(dst, c, n) (memset((dst), (c), (n)*sizeof(*(dst)))) -#endif - - -#ifndef OVERRIDE_SPEEX_FATAL -static inline void _speex_fatal(const char *str, const char *file, int line) -{ - fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); - exit(1); -} -#endif - -#ifndef OVERRIDE_SPEEX_WARNING -static inline void speex_warning(const char *str) -{ -#ifndef DISABLE_WARNINGS - fprintf (stderr, "warning: %s\n", str); -#endif -} -#endif - -#ifndef OVERRIDE_SPEEX_WARNING_INT -static inline void speex_warning_int(const char *str, int val) -{ -#ifndef DISABLE_WARNINGS - fprintf (stderr, "warning: %s %d\n", str, val); -#endif -} -#endif - -#ifndef OVERRIDE_SPEEX_NOTIFY -static inline void speex_notify(const char *str) -{ -#ifndef DISABLE_NOTIFICATIONS - fprintf (stderr, "notification: %s\n", str); -#endif -} -#endif - -#ifndef OVERRIDE_SPEEX_PUTC -/** Speex wrapper for putc */ -static inline void _speex_putc(int ch, void *file) -{ - FILE *f = (FILE *)file; - fprintf(f, "%c", ch); -} -#endif - -#define speex_fatal(str) _speex_fatal(str, __FILE__, __LINE__); -#define speex_assert(cond) {if (!(cond)) {speex_fatal("assertion failed: " #cond);}} - -#ifndef RELEASE -static inline void print_vec(float *vec, int len, char *name) -{ - int i; - printf ("%s ", name); - for (i=0;i -static void *speex_alloc (int size) {return calloc(size,1);} -static void *speex_realloc (void *ptr, int size) {return realloc(ptr, size);} -static void speex_free (void *ptr) {free(ptr);} -#include "speex_resampler.h" -#include "arch.h" -#else /* OUTSIDE_SPEEX */ - -#include "speex/speex_resampler.h" -#include "arch.h" -#include "os_support.h" -#endif /* OUTSIDE_SPEEX */ - -#include "stack_alloc.h" -#include - -#ifndef M_PI -#define M_PI 3.14159263 -#endif - -#ifdef FIXED_POINT -#define WORD2INT(x) ((x) < -32767 ? -32768 : ((x) > 32766 ? 32767 : (x))) -#else -#define WORD2INT(x) ((x) < -32767.5f ? -32768 : ((x) > 32766.5f ? 32767 : floor(.5+(x)))) -#endif - -#define IMAX(a,b) ((a) > (b) ? (a) : (b)) -#define IMIN(a,b) ((a) < (b) ? (a) : (b)) - -#ifndef NULL -#define NULL 0 -#endif - -#ifdef _USE_SSE -#include "resample_sse.h" -#endif - -/* Numer of elements to allocate on the stack */ -#ifdef VAR_ARRAYS -#define FIXED_STACK_ALLOC 8192 -#else -#define FIXED_STACK_ALLOC 1024 -#endif - -typedef int (*resampler_basic_func)(SpeexResamplerState *, spx_uint32_t , const spx_word16_t *, spx_uint32_t *, spx_word16_t *, spx_uint32_t *); - -struct SpeexResamplerState_ { - spx_uint32_t in_rate; - spx_uint32_t out_rate; - spx_uint32_t num_rate; - spx_uint32_t den_rate; - - int quality; - spx_uint32_t nb_channels; - spx_uint32_t filt_len; - spx_uint32_t mem_alloc_size; - spx_uint32_t buffer_size; - int int_advance; - int frac_advance; - float cutoff; - spx_uint32_t oversample; - int initialised; - int started; - - /* These are per-channel */ - spx_int32_t *last_sample; - spx_uint32_t *samp_frac_num; - spx_uint32_t *magic_samples; - - spx_word16_t *mem; - spx_word16_t *sinc_table; - spx_uint32_t sinc_table_length; - resampler_basic_func resampler_ptr; - - int in_stride; - int out_stride; -} ; - -static double kaiser12_table[68] = { - 0.99859849, 1.00000000, 0.99859849, 0.99440475, 0.98745105, 0.97779076, - 0.96549770, 0.95066529, 0.93340547, 0.91384741, 0.89213598, 0.86843014, - 0.84290116, 0.81573067, 0.78710866, 0.75723148, 0.72629970, 0.69451601, - 0.66208321, 0.62920216, 0.59606986, 0.56287762, 0.52980938, 0.49704014, - 0.46473455, 0.43304576, 0.40211431, 0.37206735, 0.34301800, 0.31506490, - 0.28829195, 0.26276832, 0.23854851, 0.21567274, 0.19416736, 0.17404546, - 0.15530766, 0.13794294, 0.12192957, 0.10723616, 0.09382272, 0.08164178, - 0.07063950, 0.06075685, 0.05193064, 0.04409466, 0.03718069, 0.03111947, - 0.02584161, 0.02127838, 0.01736250, 0.01402878, 0.01121463, 0.00886058, - 0.00691064, 0.00531256, 0.00401805, 0.00298291, 0.00216702, 0.00153438, - 0.00105297, 0.00069463, 0.00043489, 0.00025272, 0.00013031, 0.0000527734, - 0.00001000, 0.00000000}; -/* -static double kaiser12_table[36] = { - 0.99440475, 1.00000000, 0.99440475, 0.97779076, 0.95066529, 0.91384741, - 0.86843014, 0.81573067, 0.75723148, 0.69451601, 0.62920216, 0.56287762, - 0.49704014, 0.43304576, 0.37206735, 0.31506490, 0.26276832, 0.21567274, - 0.17404546, 0.13794294, 0.10723616, 0.08164178, 0.06075685, 0.04409466, - 0.03111947, 0.02127838, 0.01402878, 0.00886058, 0.00531256, 0.00298291, - 0.00153438, 0.00069463, 0.00025272, 0.0000527734, 0.00000500, 0.00000000}; -*/ -static double kaiser10_table[36] = { - 0.99537781, 1.00000000, 0.99537781, 0.98162644, 0.95908712, 0.92831446, - 0.89005583, 0.84522401, 0.79486424, 0.74011713, 0.68217934, 0.62226347, - 0.56155915, 0.50119680, 0.44221549, 0.38553619, 0.33194107, 0.28205962, - 0.23636152, 0.19515633, 0.15859932, 0.12670280, 0.09935205, 0.07632451, - 0.05731132, 0.04193980, 0.02979584, 0.02044510, 0.01345224, 0.00839739, - 0.00488951, 0.00257636, 0.00115101, 0.00035515, 0.00000000, 0.00000000}; - -static double kaiser8_table[36] = { - 0.99635258, 1.00000000, 0.99635258, 0.98548012, 0.96759014, 0.94302200, - 0.91223751, 0.87580811, 0.83439927, 0.78875245, 0.73966538, 0.68797126, - 0.63451750, 0.58014482, 0.52566725, 0.47185369, 0.41941150, 0.36897272, - 0.32108304, 0.27619388, 0.23465776, 0.19672670, 0.16255380, 0.13219758, - 0.10562887, 0.08273982, 0.06335451, 0.04724088, 0.03412321, 0.02369490, - 0.01563093, 0.00959968, 0.00527363, 0.00233883, 0.00050000, 0.00000000}; - -static double kaiser6_table[36] = { - 0.99733006, 1.00000000, 0.99733006, 0.98935595, 0.97618418, 0.95799003, - 0.93501423, 0.90755855, 0.87598009, 0.84068475, 0.80211977, 0.76076565, - 0.71712752, 0.67172623, 0.62508937, 0.57774224, 0.53019925, 0.48295561, - 0.43647969, 0.39120616, 0.34752997, 0.30580127, 0.26632152, 0.22934058, - 0.19505503, 0.16360756, 0.13508755, 0.10953262, 0.08693120, 0.06722600, - 0.05031820, 0.03607231, 0.02432151, 0.01487334, 0.00752000, 0.00000000}; - -struct FuncDef { - double *table; - int oversample; -}; - -static struct FuncDef _KAISER12 = {kaiser12_table, 64}; -#define KAISER12 (&_KAISER12) -/*static struct FuncDef _KAISER12 = {kaiser12_table, 32}; -#define KAISER12 (&_KAISER12)*/ -static struct FuncDef _KAISER10 = {kaiser10_table, 32}; -#define KAISER10 (&_KAISER10) -static struct FuncDef _KAISER8 = {kaiser8_table, 32}; -#define KAISER8 (&_KAISER8) -static struct FuncDef _KAISER6 = {kaiser6_table, 32}; -#define KAISER6 (&_KAISER6) - -struct QualityMapping { - int base_length; - int oversample; - float downsample_bandwidth; - float upsample_bandwidth; - struct FuncDef *window_func; -}; - - -/* This table maps conversion quality to internal parameters. There are two - reasons that explain why the up-sampling bandwidth is larger than the - down-sampling bandwidth: - 1) When up-sampling, we can assume that the spectrum is already attenuated - close to the Nyquist rate (from an A/D or a previous resampling filter) - 2) Any aliasing that occurs very close to the Nyquist rate will be masked - by the sinusoids/noise just below the Nyquist rate (guaranteed only for - up-sampling). -*/ -static const struct QualityMapping quality_map[11] = { - { 8, 4, 0.830f, 0.860f, KAISER6 }, /* Q0 */ - { 16, 4, 0.850f, 0.880f, KAISER6 }, /* Q1 */ - { 32, 4, 0.882f, 0.910f, KAISER6 }, /* Q2 */ /* 82.3% cutoff ( ~60 dB stop) 6 */ - { 48, 8, 0.895f, 0.917f, KAISER8 }, /* Q3 */ /* 84.9% cutoff ( ~80 dB stop) 8 */ - { 64, 8, 0.921f, 0.940f, KAISER8 }, /* Q4 */ /* 88.7% cutoff ( ~80 dB stop) 8 */ - { 80, 16, 0.922f, 0.940f, KAISER10}, /* Q5 */ /* 89.1% cutoff (~100 dB stop) 10 */ - { 96, 16, 0.940f, 0.945f, KAISER10}, /* Q6 */ /* 91.5% cutoff (~100 dB stop) 10 */ - {128, 16, 0.950f, 0.950f, KAISER10}, /* Q7 */ /* 93.1% cutoff (~100 dB stop) 10 */ - {160, 16, 0.960f, 0.960f, KAISER10}, /* Q8 */ /* 94.5% cutoff (~100 dB stop) 10 */ - {192, 32, 0.968f, 0.968f, KAISER12}, /* Q9 */ /* 95.5% cutoff (~100 dB stop) 10 */ - {256, 32, 0.975f, 0.975f, KAISER12}, /* Q10 */ /* 96.6% cutoff (~100 dB stop) 10 */ -}; -/*8,24,40,56,80,104,128,160,200,256,320*/ -static double compute_func(float x, struct FuncDef *func) -{ - float y, frac; - double interp[4]; - int ind; - y = x*func->oversample; - ind = (int)floor(y); - frac = (y-ind); - /* CSE with handle the repeated powers */ - interp[3] = -0.1666666667*frac + 0.1666666667*(frac*frac*frac); - interp[2] = frac + 0.5*(frac*frac) - 0.5*(frac*frac*frac); - /*interp[2] = 1.f - 0.5f*frac - frac*frac + 0.5f*frac*frac*frac;*/ - interp[0] = -0.3333333333*frac + 0.5*(frac*frac) - 0.1666666667*(frac*frac*frac); - /* Just to make sure we don't have rounding problems */ - interp[1] = 1.f-interp[3]-interp[2]-interp[0]; - - /*sum = frac*accum[1] + (1-frac)*accum[2];*/ - return interp[0]*func->table[ind] + interp[1]*func->table[ind+1] + interp[2]*func->table[ind+2] + interp[3]*func->table[ind+3]; -} - -#if 0 -#include -int main(int argc, char **argv) -{ - int i; - for (i=0;i<256;i++) - { - printf ("%f\n", compute_func(i/256., KAISER12)); - } - return 0; -} -#endif - -#ifdef FIXED_POINT -/* The slow way of computing a sinc for the table. Should improve that some day */ -static spx_word16_t sinc(float cutoff, float x, int N, struct FuncDef *window_func) -{ - /*fprintf (stderr, "%f ", x);*/ - float xx = x * cutoff; - if (fabs(x)<1e-6f) - return WORD2INT(32768.*cutoff); - else if (fabs(x) > .5f*N) - return 0; - /*FIXME: Can it really be any slower than this? */ - return WORD2INT(32768.*cutoff*sin(M_PI*xx)/(M_PI*xx) * compute_func(fabs(2.*x/N), window_func)); -} -#else -/* The slow way of computing a sinc for the table. Should improve that some day */ -static spx_word16_t sinc(float cutoff, float x, int N, struct FuncDef *window_func) -{ - /*fprintf (stderr, "%f ", x);*/ - float xx = x * cutoff; - if (fabs(x)<1e-6) - return cutoff; - else if (fabs(x) > .5*N) - return 0; - /*FIXME: Can it really be any slower than this? */ - return cutoff*sin(M_PI*xx)/(M_PI*xx) * compute_func(fabs(2.*x/N), window_func); -} -#endif - -#ifdef FIXED_POINT -static void cubic_coef(spx_word16_t x, spx_word16_t interp[4]) -{ - /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation - but I know it's MMSE-optimal on a sinc */ - spx_word16_t x2, x3; - x2 = MULT16_16_P15(x, x); - x3 = MULT16_16_P15(x, x2); - interp[0] = PSHR32(MULT16_16(QCONST16(-0.16667f, 15),x) + MULT16_16(QCONST16(0.16667f, 15),x3),15); - interp[1] = EXTRACT16(EXTEND32(x) + SHR32(SUB32(EXTEND32(x2),EXTEND32(x3)),1)); - interp[3] = PSHR32(MULT16_16(QCONST16(-0.33333f, 15),x) + MULT16_16(QCONST16(.5f,15),x2) - MULT16_16(QCONST16(0.16667f, 15),x3),15); - /* Just to make sure we don't have rounding problems */ - interp[2] = Q15_ONE-interp[0]-interp[1]-interp[3]; - if (interp[2]<32767) - interp[2]+=1; -} -#else -static void cubic_coef(spx_word16_t frac, spx_word16_t interp[4]) -{ - /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation - but I know it's MMSE-optimal on a sinc */ - interp[0] = -0.16667f*frac + 0.16667f*frac*frac*frac; - interp[1] = frac + 0.5f*frac*frac - 0.5f*frac*frac*frac; - /*interp[2] = 1.f - 0.5f*frac - frac*frac + 0.5f*frac*frac*frac;*/ - interp[3] = -0.33333f*frac + 0.5f*frac*frac - 0.16667f*frac*frac*frac; - /* Just to make sure we don't have rounding problems */ - interp[2] = 1.-interp[0]-interp[1]-interp[3]; -} -#endif - -static int resampler_basic_direct_single(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) -{ - const int N = st->filt_len; - int out_sample = 0; - int last_sample = st->last_sample[channel_index]; - spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; - const spx_word16_t *sinc_table = st->sinc_table; - const int out_stride = st->out_stride; - const int int_advance = st->int_advance; - const int frac_advance = st->frac_advance; - const spx_uint32_t den_rate = st->den_rate; - spx_word32_t sum; - int j; - - while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) - { - const spx_word16_t *sinc = & sinc_table[samp_frac_num*N]; - const spx_word16_t *iptr = & in[last_sample]; - -#ifndef OVERRIDE_INNER_PRODUCT_SINGLE - float accum[4] = {0,0,0,0}; - - for(j=0;j= den_rate) - { - samp_frac_num -= den_rate; - last_sample++; - } - } - - st->last_sample[channel_index] = last_sample; - st->samp_frac_num[channel_index] = samp_frac_num; - return out_sample; -} - -#ifdef FIXED_POINT -#else -/* This is the same as the previous function, except with a double-precision accumulator */ -static int resampler_basic_direct_double(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) -{ - const int N = st->filt_len; - int out_sample = 0; - int last_sample = st->last_sample[channel_index]; - spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; - const spx_word16_t *sinc_table = st->sinc_table; - const int out_stride = st->out_stride; - const int int_advance = st->int_advance; - const int frac_advance = st->frac_advance; - const spx_uint32_t den_rate = st->den_rate; - double sum; - int j; - - while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) - { - const spx_word16_t *sinc = & sinc_table[samp_frac_num*N]; - const spx_word16_t *iptr = & in[last_sample]; - -#ifndef OVERRIDE_INNER_PRODUCT_DOUBLE - double accum[4] = {0,0,0,0}; - - for(j=0;j= den_rate) - { - samp_frac_num -= den_rate; - last_sample++; - } - } - - st->last_sample[channel_index] = last_sample; - st->samp_frac_num[channel_index] = samp_frac_num; - return out_sample; -} -#endif - -static int resampler_basic_interpolate_single(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) -{ - const int N = st->filt_len; - int out_sample = 0; - int last_sample = st->last_sample[channel_index]; - spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; - const int out_stride = st->out_stride; - const int int_advance = st->int_advance; - const int frac_advance = st->frac_advance; - const spx_uint32_t den_rate = st->den_rate; - int j; - spx_word32_t sum; - - while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) - { - const spx_word16_t *iptr = & in[last_sample]; - - const int offset = samp_frac_num*st->oversample/st->den_rate; -#ifdef FIXED_POINT - const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate); -#else - const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate; -#endif - spx_word16_t interp[4]; - - -#ifndef OVERRIDE_INTERPOLATE_PRODUCT_SINGLE - spx_word32_t accum[4] = {0,0,0,0}; - - for(j=0;jsinc_table[4+(j+1)*st->oversample-offset-2]); - accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]); - accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]); - accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]); - } - - cubic_coef(frac, interp); - sum = MULT16_32_Q15(interp[0],accum[0]) + MULT16_32_Q15(interp[1],accum[1]) + MULT16_32_Q15(interp[2],accum[2]) + MULT16_32_Q15(interp[3],accum[3]); -#else - cubic_coef(frac, interp); - sum = interpolate_product_single(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp); -#endif - - out[out_stride * out_sample++] = PSHR32(sum,15); - last_sample += int_advance; - samp_frac_num += frac_advance; - if (samp_frac_num >= den_rate) - { - samp_frac_num -= den_rate; - last_sample++; - } - } - - st->last_sample[channel_index] = last_sample; - st->samp_frac_num[channel_index] = samp_frac_num; - return out_sample; -} - -#ifdef FIXED_POINT -#else -/* This is the same as the previous function, except with a double-precision accumulator */ -static int resampler_basic_interpolate_double(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) -{ - const int N = st->filt_len; - int out_sample = 0; - int last_sample = st->last_sample[channel_index]; - spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; - const int out_stride = st->out_stride; - const int int_advance = st->int_advance; - const int frac_advance = st->frac_advance; - const spx_uint32_t den_rate = st->den_rate; - int j; - spx_word32_t sum; - - while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) - { - const spx_word16_t *iptr = & in[last_sample]; - - const int offset = samp_frac_num*st->oversample/st->den_rate; -#ifdef FIXED_POINT - const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate); -#else - const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate; -#endif - spx_word16_t interp[4]; - - -#ifndef OVERRIDE_INTERPOLATE_PRODUCT_DOUBLE - double accum[4] = {0,0,0,0}; - - for(j=0;jsinc_table[4+(j+1)*st->oversample-offset-2]); - accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]); - accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]); - accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]); - } - - cubic_coef(frac, interp); - sum = MULT16_32_Q15(interp[0],accum[0]) + MULT16_32_Q15(interp[1],accum[1]) + MULT16_32_Q15(interp[2],accum[2]) + MULT16_32_Q15(interp[3],accum[3]); -#else - cubic_coef(frac, interp); - sum = interpolate_product_double(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp); -#endif - - out[out_stride * out_sample++] = PSHR32(sum,15); - last_sample += int_advance; - samp_frac_num += frac_advance; - if (samp_frac_num >= den_rate) - { - samp_frac_num -= den_rate; - last_sample++; - } - } - - st->last_sample[channel_index] = last_sample; - st->samp_frac_num[channel_index] = samp_frac_num; - return out_sample; -} -#endif - -static void update_filter(SpeexResamplerState *st) -{ - spx_uint32_t old_length; - - old_length = st->filt_len; - st->oversample = quality_map[st->quality].oversample; - st->filt_len = quality_map[st->quality].base_length; - - if (st->num_rate > st->den_rate) - { - /* down-sampling */ - st->cutoff = quality_map[st->quality].downsample_bandwidth * st->den_rate / st->num_rate; - /* FIXME: divide the numerator and denominator by a certain amount if they're too large */ - st->filt_len = st->filt_len*st->num_rate / st->den_rate; - /* Round down to make sure we have a multiple of 4 */ - st->filt_len &= (~0x3); - if (2*st->den_rate < st->num_rate) - st->oversample >>= 1; - if (4*st->den_rate < st->num_rate) - st->oversample >>= 1; - if (8*st->den_rate < st->num_rate) - st->oversample >>= 1; - if (16*st->den_rate < st->num_rate) - st->oversample >>= 1; - if (st->oversample < 1) - st->oversample = 1; - } else { - /* up-sampling */ - st->cutoff = quality_map[st->quality].upsample_bandwidth; - } - - /* Choose the resampling type that requires the least amount of memory */ - if (st->den_rate <= st->oversample) - { - spx_uint32_t i; - if (!st->sinc_table) - st->sinc_table = (spx_word16_t *)speex_alloc(st->filt_len*st->den_rate*sizeof(spx_word16_t)); - else if (st->sinc_table_length < st->filt_len*st->den_rate) - { - st->sinc_table = (spx_word16_t *)speex_realloc(st->sinc_table,st->filt_len*st->den_rate*sizeof(spx_word16_t)); - st->sinc_table_length = st->filt_len*st->den_rate; - } - for (i=0;iden_rate;i++) - { - spx_int32_t j; - for (j=0;jfilt_len;j++) - { - st->sinc_table[i*st->filt_len+j] = sinc(st->cutoff,((j-(spx_int32_t)st->filt_len/2+1)-((float)i)/st->den_rate), st->filt_len, quality_map[st->quality].window_func); - } - } -#ifdef FIXED_POINT - st->resampler_ptr = resampler_basic_direct_single; -#else - if (st->quality>8) - st->resampler_ptr = resampler_basic_direct_double; - else - st->resampler_ptr = resampler_basic_direct_single; -#endif - /*fprintf (stderr, "resampler uses direct sinc table and normalised cutoff %f\n", cutoff);*/ - } else { - spx_int32_t i; - if (!st->sinc_table) - st->sinc_table = (spx_word16_t *)speex_alloc((st->filt_len*st->oversample+8)*sizeof(spx_word16_t)); - else if (st->sinc_table_length < st->filt_len*st->oversample+8) - { - st->sinc_table = (spx_word16_t *)speex_realloc(st->sinc_table,(st->filt_len*st->oversample+8)*sizeof(spx_word16_t)); - st->sinc_table_length = st->filt_len*st->oversample+8; - } - for (i=-4;i<(spx_int32_t)(st->oversample*st->filt_len+4);i++) - st->sinc_table[i+4] = sinc(st->cutoff,(i/(float)st->oversample - st->filt_len/2), st->filt_len, quality_map[st->quality].window_func); -#ifdef FIXED_POINT - st->resampler_ptr = resampler_basic_interpolate_single; -#else - if (st->quality>8) - st->resampler_ptr = resampler_basic_interpolate_double; - else - st->resampler_ptr = resampler_basic_interpolate_single; -#endif - /*fprintf (stderr, "resampler uses interpolated sinc table and normalised cutoff %f\n", cutoff);*/ - } - st->int_advance = st->num_rate/st->den_rate; - st->frac_advance = st->num_rate%st->den_rate; - - - /* Here's the place where we update the filter memory to take into account - the change in filter length. It's probably the messiest part of the code - due to handling of lots of corner cases. */ - if (!st->mem) - { - spx_uint32_t i; - st->mem_alloc_size = st->filt_len-1 + st->buffer_size; - st->mem = (spx_word16_t*)speex_alloc(st->nb_channels*st->mem_alloc_size * sizeof(spx_word16_t)); - for (i=0;inb_channels*st->mem_alloc_size;i++) - st->mem[i] = 0; - /*speex_warning("init filter");*/ - } else if (!st->started) - { - spx_uint32_t i; - st->mem_alloc_size = st->filt_len-1 + st->buffer_size; - st->mem = (spx_word16_t*)speex_realloc(st->mem, st->nb_channels*st->mem_alloc_size * sizeof(spx_word16_t)); - for (i=0;inb_channels*st->mem_alloc_size;i++) - st->mem[i] = 0; - /*speex_warning("reinit filter");*/ - } else if (st->filt_len > old_length) - { - spx_int32_t i; - /* Increase the filter length */ - /*speex_warning("increase filter size");*/ - int old_alloc_size = st->mem_alloc_size; - if ((st->filt_len-1 + st->buffer_size) > st->mem_alloc_size) - { - st->mem_alloc_size = st->filt_len-1 + st->buffer_size; - st->mem = (spx_word16_t*)speex_realloc(st->mem, st->nb_channels*st->mem_alloc_size * sizeof(spx_word16_t)); - } - for (i=st->nb_channels-1;i>=0;i--) - { - spx_int32_t j; - spx_uint32_t olen = old_length; - /*if (st->magic_samples[i])*/ - { - /* Try and remove the magic samples as if nothing had happened */ - - /* FIXME: This is wrong but for now we need it to avoid going over the array bounds */ - olen = old_length + 2*st->magic_samples[i]; - for (j=old_length-2+st->magic_samples[i];j>=0;j--) - st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]] = st->mem[i*old_alloc_size+j]; - for (j=0;jmagic_samples[i];j++) - st->mem[i*st->mem_alloc_size+j] = 0; - st->magic_samples[i] = 0; - } - if (st->filt_len > olen) - { - /* If the new filter length is still bigger than the "augmented" length */ - /* Copy data going backward */ - for (j=0;jmem[i*st->mem_alloc_size+(st->filt_len-2-j)] = st->mem[i*st->mem_alloc_size+(olen-2-j)]; - /* Then put zeros for lack of anything better */ - for (;jfilt_len-1;j++) - st->mem[i*st->mem_alloc_size+(st->filt_len-2-j)] = 0; - /* Adjust last_sample */ - st->last_sample[i] += (st->filt_len - olen)/2; - } else { - /* Put back some of the magic! */ - st->magic_samples[i] = (olen - st->filt_len)/2; - for (j=0;jfilt_len-1+st->magic_samples[i];j++) - st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]]; - } - } - } else if (st->filt_len < old_length) - { - spx_uint32_t i; - /* Reduce filter length, this a bit tricky. We need to store some of the memory as "magic" - samples so they can be used directly as input the next time(s) */ - for (i=0;inb_channels;i++) - { - spx_uint32_t j; - spx_uint32_t old_magic = st->magic_samples[i]; - st->magic_samples[i] = (old_length - st->filt_len)/2; - /* We must copy some of the memory that's no longer used */ - /* Copy data going backward */ - for (j=0;jfilt_len-1+st->magic_samples[i]+old_magic;j++) - st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]]; - st->magic_samples[i] += old_magic; - } - } - -} - -EXPORT SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err) -{ - return speex_resampler_init_frac(nb_channels, in_rate, out_rate, in_rate, out_rate, quality, err); -} - -EXPORT SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err) -{ - spx_uint32_t i; - SpeexResamplerState *st; - if (quality > 10 || quality < 0) - { - if (err) - *err = RESAMPLER_ERR_INVALID_ARG; - return NULL; - } - st = (SpeexResamplerState *)speex_alloc(sizeof(SpeexResamplerState)); - st->initialised = 0; - st->started = 0; - st->in_rate = 0; - st->out_rate = 0; - st->num_rate = 0; - st->den_rate = 0; - st->quality = -1; - st->sinc_table_length = 0; - st->mem_alloc_size = 0; - st->filt_len = 0; - st->mem = 0; - st->resampler_ptr = 0; - - st->cutoff = 1.f; - st->nb_channels = nb_channels; - st->in_stride = 1; - st->out_stride = 1; - -#ifdef FIXED_POINT - st->buffer_size = 160; -#else - st->buffer_size = 160; -#endif - - /* Per channel data */ - st->last_sample = (spx_int32_t*)speex_alloc(nb_channels*sizeof(int)); - st->magic_samples = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(int)); - st->samp_frac_num = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(int)); - for (i=0;ilast_sample[i] = 0; - st->magic_samples[i] = 0; - st->samp_frac_num[i] = 0; - } - - speex_resampler_set_quality(st, quality); - speex_resampler_set_rate_frac(st, ratio_num, ratio_den, in_rate, out_rate); - - - update_filter(st); - - st->initialised = 1; - if (err) - *err = RESAMPLER_ERR_SUCCESS; - - return st; -} - -EXPORT void speex_resampler_destroy(SpeexResamplerState *st) -{ - speex_free(st->mem); - speex_free(st->sinc_table); - speex_free(st->last_sample); - speex_free(st->magic_samples); - speex_free(st->samp_frac_num); - speex_free(st); -} - -static int speex_resampler_process_native(SpeexResamplerState *st, spx_uint32_t channel_index, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) -{ - int j=0; - const int N = st->filt_len; - int out_sample = 0; - spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size; - spx_uint32_t ilen; - - st->started = 1; - - /* Call the right resampler through the function ptr */ - out_sample = st->resampler_ptr(st, channel_index, mem, in_len, out, out_len); - - if (st->last_sample[channel_index] < (spx_int32_t)*in_len) - *in_len = st->last_sample[channel_index]; - *out_len = out_sample; - st->last_sample[channel_index] -= *in_len; - - ilen = *in_len; - - for(j=0;jmagic_samples[channel_index]; - spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size; - const int N = st->filt_len; - - speex_resampler_process_native(st, channel_index, &tmp_in_len, *out, &out_len); - - st->magic_samples[channel_index] -= tmp_in_len; - - /* If we couldn't process all "magic" input samples, save the rest for next time */ - if (st->magic_samples[channel_index]) - { - spx_uint32_t i; - for (i=0;imagic_samples[channel_index];i++) - mem[N-1+i]=mem[N-1+i+tmp_in_len]; - } - *out += out_len*st->out_stride; - return out_len; -} - -#ifdef FIXED_POINT -EXPORT int speex_resampler_process_int(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) -#else -EXPORT int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) -#endif -{ - int j; - spx_uint32_t ilen = *in_len; - spx_uint32_t olen = *out_len; - spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size; - const int filt_offs = st->filt_len - 1; - const spx_uint32_t xlen = st->mem_alloc_size - filt_offs; - const int istride = st->in_stride; - - if (st->magic_samples[channel_index]) - olen -= speex_resampler_magic(st, channel_index, &out, olen); - if (! st->magic_samples[channel_index]) { - while (ilen && olen) { - spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen; - spx_uint32_t ochunk = olen; - - if (in) { - for(j=0;jout_stride; - if (in) - in += ichunk * istride; - } - } - *in_len -= ilen; - *out_len -= olen; - return RESAMPLER_ERR_SUCCESS; -} - -#ifdef FIXED_POINT -EXPORT int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) -#else -EXPORT int speex_resampler_process_int(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) -#endif -{ - int j; - const int istride_save = st->in_stride; - const int ostride_save = st->out_stride; - spx_uint32_t ilen = *in_len; - spx_uint32_t olen = *out_len; - spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size; - const spx_uint32_t xlen = st->mem_alloc_size - (st->filt_len - 1); -#ifdef VAR_ARRAYS - const unsigned int ylen = (olen < FIXED_STACK_ALLOC) ? olen : FIXED_STACK_ALLOC; - VARDECL(spx_word16_t *ystack); - ALLOC(ystack, ylen, spx_word16_t); -#else - const unsigned int ylen = FIXED_STACK_ALLOC; - spx_word16_t ystack[FIXED_STACK_ALLOC]; -#endif - - st->out_stride = 1; - - while (ilen && olen) { - spx_word16_t *y = ystack; - spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen; - spx_uint32_t ochunk = (olen > ylen) ? ylen : olen; - spx_uint32_t omagic = 0; - - if (st->magic_samples[channel_index]) { - omagic = speex_resampler_magic(st, channel_index, &y, ochunk); - ochunk -= omagic; - olen -= omagic; - } - if (! st->magic_samples[channel_index]) { - if (in) { - for(j=0;jfilt_len-1]=WORD2INT(in[j*istride_save]); -#else - x[j+st->filt_len-1]=in[j*istride_save]; -#endif - } else { - for(j=0;jfilt_len-1]=0; - } - - speex_resampler_process_native(st, channel_index, &ichunk, y, &ochunk); - } else { - ichunk = 0; - ochunk = 0; - } - - for (j=0;jout_stride = ostride_save; - *in_len -= ilen; - *out_len -= olen; - - return RESAMPLER_ERR_SUCCESS; -} - -EXPORT int speex_resampler_process_interleaved_float(SpeexResamplerState *st, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) -{ - spx_uint32_t i; - int istride_save, ostride_save; - spx_uint32_t bak_len = *out_len; - istride_save = st->in_stride; - ostride_save = st->out_stride; - st->in_stride = st->out_stride = st->nb_channels; - for (i=0;inb_channels;i++) - { - *out_len = bak_len; - if (in != NULL) - speex_resampler_process_float(st, i, in+i, in_len, out+i, out_len); - else - speex_resampler_process_float(st, i, NULL, in_len, out+i, out_len); - } - st->in_stride = istride_save; - st->out_stride = ostride_save; - return RESAMPLER_ERR_SUCCESS; -} - -EXPORT int speex_resampler_process_interleaved_int(SpeexResamplerState *st, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) -{ - spx_uint32_t i; - int istride_save, ostride_save; - spx_uint32_t bak_len = *out_len; - istride_save = st->in_stride; - ostride_save = st->out_stride; - st->in_stride = st->out_stride = st->nb_channels; - for (i=0;inb_channels;i++) - { - *out_len = bak_len; - if (in != NULL) - speex_resampler_process_int(st, i, in+i, in_len, out+i, out_len); - else - speex_resampler_process_int(st, i, NULL, in_len, out+i, out_len); - } - st->in_stride = istride_save; - st->out_stride = ostride_save; - return RESAMPLER_ERR_SUCCESS; -} - -EXPORT int speex_resampler_set_rate(SpeexResamplerState *st, spx_uint32_t in_rate, spx_uint32_t out_rate) -{ - return speex_resampler_set_rate_frac(st, in_rate, out_rate, in_rate, out_rate); -} - -EXPORT void speex_resampler_get_rate(SpeexResamplerState *st, spx_uint32_t *in_rate, spx_uint32_t *out_rate) -{ - *in_rate = st->in_rate; - *out_rate = st->out_rate; -} - -EXPORT int speex_resampler_set_rate_frac(SpeexResamplerState *st, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate) -{ - spx_uint32_t fact; - spx_uint32_t old_den; - spx_uint32_t i; - if (st->in_rate == in_rate && st->out_rate == out_rate && st->num_rate == ratio_num && st->den_rate == ratio_den) - return RESAMPLER_ERR_SUCCESS; - - old_den = st->den_rate; - st->in_rate = in_rate; - st->out_rate = out_rate; - st->num_rate = ratio_num; - st->den_rate = ratio_den; - /* FIXME: This is terribly inefficient, but who cares (at least for now)? */ - for (fact=2;fact<=IMIN(st->num_rate, st->den_rate);fact++) - { - while ((st->num_rate % fact == 0) && (st->den_rate % fact == 0)) - { - st->num_rate /= fact; - st->den_rate /= fact; - } - } - - if (old_den > 0) - { - for (i=0;inb_channels;i++) - { - st->samp_frac_num[i]=st->samp_frac_num[i]*st->den_rate/old_den; - /* Safety net */ - if (st->samp_frac_num[i] >= st->den_rate) - st->samp_frac_num[i] = st->den_rate-1; - } - } - - if (st->initialised) - update_filter(st); - return RESAMPLER_ERR_SUCCESS; -} - -EXPORT void speex_resampler_get_ratio(SpeexResamplerState *st, spx_uint32_t *ratio_num, spx_uint32_t *ratio_den) -{ - *ratio_num = st->num_rate; - *ratio_den = st->den_rate; -} - -EXPORT int speex_resampler_set_quality(SpeexResamplerState *st, int quality) -{ - if (quality > 10 || quality < 0) - return RESAMPLER_ERR_INVALID_ARG; - if (st->quality == quality) - return RESAMPLER_ERR_SUCCESS; - st->quality = quality; - if (st->initialised) - update_filter(st); - return RESAMPLER_ERR_SUCCESS; -} - -EXPORT void speex_resampler_get_quality(SpeexResamplerState *st, int *quality) -{ - *quality = st->quality; -} - -EXPORT void speex_resampler_set_input_stride(SpeexResamplerState *st, spx_uint32_t stride) -{ - st->in_stride = stride; -} - -EXPORT void speex_resampler_get_input_stride(SpeexResamplerState *st, spx_uint32_t *stride) -{ - *stride = st->in_stride; -} - -EXPORT void speex_resampler_set_output_stride(SpeexResamplerState *st, spx_uint32_t stride) -{ - st->out_stride = stride; -} - -EXPORT void speex_resampler_get_output_stride(SpeexResamplerState *st, spx_uint32_t *stride) -{ - *stride = st->out_stride; -} - -EXPORT int speex_resampler_get_input_latency(SpeexResamplerState *st) -{ - return st->filt_len / 2; -} - -EXPORT int speex_resampler_get_output_latency(SpeexResamplerState *st) -{ - return ((st->filt_len / 2) * st->den_rate + (st->num_rate >> 1)) / st->num_rate; -} - -EXPORT int speex_resampler_skip_zeros(SpeexResamplerState *st) -{ - spx_uint32_t i; - for (i=0;inb_channels;i++) - st->last_sample[i] = st->filt_len/2; - return RESAMPLER_ERR_SUCCESS; -} - -EXPORT int speex_resampler_reset_mem(SpeexResamplerState *st) -{ - spx_uint32_t i; - for (i=0;inb_channels*(st->filt_len-1);i++) - st->mem[i] = 0; - return RESAMPLER_ERR_SUCCESS; -} - -EXPORT const char *speex_resampler_strerror(int err) -{ - switch (err) - { - case RESAMPLER_ERR_SUCCESS: - return "Success."; - case RESAMPLER_ERR_ALLOC_FAILED: - return "Memory allocation failed."; - case RESAMPLER_ERR_BAD_STATE: - return "Bad resampler state."; - case RESAMPLER_ERR_INVALID_ARG: - return "Invalid argument."; - case RESAMPLER_ERR_PTR_OVERLAP: - return "Input and output buffers overlap."; - default: - return "Unknown error. Bad error code or strange version mismatch."; - } -} diff --git a/lib/libspeex/speex/speex_resampler.h b/lib/libspeex/speex/speex_resampler.h deleted file mode 100644 index 54eef8d7b8..0000000000 --- a/lib/libspeex/speex/speex_resampler.h +++ /dev/null @@ -1,340 +0,0 @@ -/* Copyright (C) 2007 Jean-Marc Valin - - File: speex_resampler.h - Resampling code - - The design goals of this code are: - - Very fast algorithm - - Low memory requirement - - Good *perceptual* quality (and not best SNR) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. -*/ - - -#ifndef SPEEX_RESAMPLER_H -#define SPEEX_RESAMPLER_H - -#ifdef OUTSIDE_SPEEX - -/********* WARNING: MENTAL SANITY ENDS HERE *************/ - -/* If the resampler is defined outside of Speex, we change the symbol names so that - there won't be any clash if linking with Speex later on. */ - -/* #define RANDOM_PREFIX your software name here */ -#ifndef RANDOM_PREFIX -#error "Please define RANDOM_PREFIX (above) to something specific to your project to prevent symbol name clashes" -#endif - -#define CAT_PREFIX2(a,b) a ## b -#define CAT_PREFIX(a,b) CAT_PREFIX2(a, b) - -#define speex_resampler_init CAT_PREFIX(RANDOM_PREFIX,_resampler_init) -#define speex_resampler_init_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_init_frac) -#define speex_resampler_destroy CAT_PREFIX(RANDOM_PREFIX,_resampler_destroy) -#define speex_resampler_process_float CAT_PREFIX(RANDOM_PREFIX,_resampler_process_float) -#define speex_resampler_process_int CAT_PREFIX(RANDOM_PREFIX,_resampler_process_int) -#define speex_resampler_process_interleaved_float CAT_PREFIX(RANDOM_PREFIX,_resampler_process_interleaved_float) -#define speex_resampler_process_interleaved_int CAT_PREFIX(RANDOM_PREFIX,_resampler_process_interleaved_int) -#define speex_resampler_set_rate CAT_PREFIX(RANDOM_PREFIX,_resampler_set_rate) -#define speex_resampler_get_rate CAT_PREFIX(RANDOM_PREFIX,_resampler_get_rate) -#define speex_resampler_set_rate_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_set_rate_frac) -#define speex_resampler_get_ratio CAT_PREFIX(RANDOM_PREFIX,_resampler_get_ratio) -#define speex_resampler_set_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_set_quality) -#define speex_resampler_get_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_get_quality) -#define speex_resampler_set_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_input_stride) -#define speex_resampler_get_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_stride) -#define speex_resampler_set_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_output_stride) -#define speex_resampler_get_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_stride) -#define speex_resampler_get_input_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_latency) -#define speex_resampler_get_output_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_latency) -#define speex_resampler_skip_zeros CAT_PREFIX(RANDOM_PREFIX,_resampler_skip_zeros) -#define speex_resampler_reset_mem CAT_PREFIX(RANDOM_PREFIX,_resampler_reset_mem) -#define speex_resampler_strerror CAT_PREFIX(RANDOM_PREFIX,_resampler_strerror) - -#define spx_int16_t short -#define spx_int32_t int -#define spx_uint16_t unsigned short -#define spx_uint32_t unsigned int - -#else /* OUTSIDE_SPEEX */ - -#include "speex/speex_types.h" - -#endif /* OUTSIDE_SPEEX */ - -#ifdef __cplusplus -extern "C" { -#endif - -#define SPEEX_RESAMPLER_QUALITY_MAX 10 -#define SPEEX_RESAMPLER_QUALITY_MIN 0 -#define SPEEX_RESAMPLER_QUALITY_DEFAULT 4 -#define SPEEX_RESAMPLER_QUALITY_VOIP 3 -#define SPEEX_RESAMPLER_QUALITY_DESKTOP 5 - -enum { - RESAMPLER_ERR_SUCCESS = 0, - RESAMPLER_ERR_ALLOC_FAILED = 1, - RESAMPLER_ERR_BAD_STATE = 2, - RESAMPLER_ERR_INVALID_ARG = 3, - RESAMPLER_ERR_PTR_OVERLAP = 4, - - RESAMPLER_ERR_MAX_ERROR -}; - -struct SpeexResamplerState_; -typedef struct SpeexResamplerState_ SpeexResamplerState; - -/** Create a new resampler with integer input and output rates. - * @param nb_channels Number of channels to be processed - * @param in_rate Input sampling rate (integer number of Hz). - * @param out_rate Output sampling rate (integer number of Hz). - * @param quality Resampling quality between 0 and 10, where 0 has poor quality - * and 10 has very high quality. - * @return Newly created resampler state - * @retval NULL Error: not enough memory - */ -SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels, - spx_uint32_t in_rate, - spx_uint32_t out_rate, - int quality, - int *err); - -/** Create a new resampler with fractional input/output rates. The sampling - * rate ratio is an arbitrary rational number with both the numerator and - * denominator being 32-bit integers. - * @param nb_channels Number of channels to be processed - * @param ratio_num Numerator of the sampling rate ratio - * @param ratio_den Denominator of the sampling rate ratio - * @param in_rate Input sampling rate rounded to the nearest integer (in Hz). - * @param out_rate Output sampling rate rounded to the nearest integer (in Hz). - * @param quality Resampling quality between 0 and 10, where 0 has poor quality - * and 10 has very high quality. - * @return Newly created resampler state - * @retval NULL Error: not enough memory - */ -SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels, - spx_uint32_t ratio_num, - spx_uint32_t ratio_den, - spx_uint32_t in_rate, - spx_uint32_t out_rate, - int quality, - int *err); - -/** Destroy a resampler state. - * @param st Resampler state - */ -void speex_resampler_destroy(SpeexResamplerState *st); - -/** Resample a float array. The input and output buffers must *not* overlap. - * @param st Resampler state - * @param channel_index Index of the channel to process for the multi-channel - * base (0 otherwise) - * @param in Input buffer - * @param in_len Number of input samples in the input buffer. Returns the - * number of samples processed - * @param out Output buffer - * @param out_len Size of the output buffer. Returns the number of samples written - */ -int speex_resampler_process_float(SpeexResamplerState *st, - spx_uint32_t channel_index, - const float *in, - spx_uint32_t *in_len, - float *out, - spx_uint32_t *out_len); - -/** Resample an int array. The input and output buffers must *not* overlap. - * @param st Resampler state - * @param channel_index Index of the channel to process for the multi-channel - * base (0 otherwise) - * @param in Input buffer - * @param in_len Number of input samples in the input buffer. Returns the number - * of samples processed - * @param out Output buffer - * @param out_len Size of the output buffer. Returns the number of samples written - */ -int speex_resampler_process_int(SpeexResamplerState *st, - spx_uint32_t channel_index, - const spx_int16_t *in, - spx_uint32_t *in_len, - spx_int16_t *out, - spx_uint32_t *out_len); - -/** Resample an interleaved float array. The input and output buffers must *not* overlap. - * @param st Resampler state - * @param in Input buffer - * @param in_len Number of input samples in the input buffer. Returns the number - * of samples processed. This is all per-channel. - * @param out Output buffer - * @param out_len Size of the output buffer. Returns the number of samples written. - * This is all per-channel. - */ -int speex_resampler_process_interleaved_float(SpeexResamplerState *st, - const float *in, - spx_uint32_t *in_len, - float *out, - spx_uint32_t *out_len); - -/** Resample an interleaved int array. The input and output buffers must *not* overlap. - * @param st Resampler state - * @param in Input buffer - * @param in_len Number of input samples in the input buffer. Returns the number - * of samples processed. This is all per-channel. - * @param out Output buffer - * @param out_len Size of the output buffer. Returns the number of samples written. - * This is all per-channel. - */ -int speex_resampler_process_interleaved_int(SpeexResamplerState *st, - const spx_int16_t *in, - spx_uint32_t *in_len, - spx_int16_t *out, - spx_uint32_t *out_len); - -/** Set (change) the input/output sampling rates (integer value). - * @param st Resampler state - * @param in_rate Input sampling rate (integer number of Hz). - * @param out_rate Output sampling rate (integer number of Hz). - */ -int speex_resampler_set_rate(SpeexResamplerState *st, - spx_uint32_t in_rate, - spx_uint32_t out_rate); - -/** Get the current input/output sampling rates (integer value). - * @param st Resampler state - * @param in_rate Input sampling rate (integer number of Hz) copied. - * @param out_rate Output sampling rate (integer number of Hz) copied. - */ -void speex_resampler_get_rate(SpeexResamplerState *st, - spx_uint32_t *in_rate, - spx_uint32_t *out_rate); - -/** Set (change) the input/output sampling rates and resampling ratio - * (fractional values in Hz supported). - * @param st Resampler state - * @param ratio_num Numerator of the sampling rate ratio - * @param ratio_den Denominator of the sampling rate ratio - * @param in_rate Input sampling rate rounded to the nearest integer (in Hz). - * @param out_rate Output sampling rate rounded to the nearest integer (in Hz). - */ -int speex_resampler_set_rate_frac(SpeexResamplerState *st, - spx_uint32_t ratio_num, - spx_uint32_t ratio_den, - spx_uint32_t in_rate, - spx_uint32_t out_rate); - -/** Get the current resampling ratio. This will be reduced to the least - * common denominator. - * @param st Resampler state - * @param ratio_num Numerator of the sampling rate ratio copied - * @param ratio_den Denominator of the sampling rate ratio copied - */ -void speex_resampler_get_ratio(SpeexResamplerState *st, - spx_uint32_t *ratio_num, - spx_uint32_t *ratio_den); - -/** Set (change) the conversion quality. - * @param st Resampler state - * @param quality Resampling quality between 0 and 10, where 0 has poor - * quality and 10 has very high quality. - */ -int speex_resampler_set_quality(SpeexResamplerState *st, - int quality); - -/** Get the conversion quality. - * @param st Resampler state - * @param quality Resampling quality between 0 and 10, where 0 has poor - * quality and 10 has very high quality. - */ -void speex_resampler_get_quality(SpeexResamplerState *st, - int *quality); - -/** Set (change) the input stride. - * @param st Resampler state - * @param stride Input stride - */ -void speex_resampler_set_input_stride(SpeexResamplerState *st, - spx_uint32_t stride); - -/** Get the input stride. - * @param st Resampler state - * @param stride Input stride copied - */ -void speex_resampler_get_input_stride(SpeexResamplerState *st, - spx_uint32_t *stride); - -/** Set (change) the output stride. - * @param st Resampler state - * @param stride Output stride - */ -void speex_resampler_set_output_stride(SpeexResamplerState *st, - spx_uint32_t stride); - -/** Get the output stride. - * @param st Resampler state copied - * @param stride Output stride - */ -void speex_resampler_get_output_stride(SpeexResamplerState *st, - spx_uint32_t *stride); - -/** Get the latency in input samples introduced by the resampler. - * @param st Resampler state - */ -int speex_resampler_get_input_latency(SpeexResamplerState *st); - -/** Get the latency in output samples introduced by the resampler. - * @param st Resampler state - */ -int speex_resampler_get_output_latency(SpeexResamplerState *st); - -/** Make sure that the first samples to go out of the resamplers don't have - * leading zeros. This is only useful before starting to use a newly created - * resampler. It is recommended to use that when resampling an audio file, as - * it will generate a file with the same length. For real-time processing, - * it is probably easier not to use this call (so that the output duration - * is the same for the first frame). - * @param st Resampler state - */ -int speex_resampler_skip_zeros(SpeexResamplerState *st); - -/** Reset a resampler so a new (unrelated) stream can be processed. - * @param st Resampler state - */ -int speex_resampler_reset_mem(SpeexResamplerState *st); - -/** Returns the English meaning for an error code - * @param err Error code - * @return English string - */ -const char *speex_resampler_strerror(int err); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/libspeex/speex/speex_types.h b/lib/libspeex/speex/speex_types.h deleted file mode 100644 index 852fed801d..0000000000 --- a/lib/libspeex/speex/speex_types.h +++ /dev/null @@ -1,126 +0,0 @@ -/* speex_types.h taken from libogg */ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: #ifdef jail to whip a few platforms into the UNIX ideal. - last mod: $Id: os_types.h 7524 2004-08-11 04:20:36Z conrad $ - - ********************************************************************/ -/** - @file speex_types.h - @brief Speex types -*/ -#ifndef _SPEEX_TYPES_H -#define _SPEEX_TYPES_H - -#if defined(_WIN32) - -# if defined(__CYGWIN__) -# include <_G_config.h> - typedef _G_int32_t spx_int32_t; - typedef _G_uint32_t spx_uint32_t; - typedef _G_int16_t spx_int16_t; - typedef _G_uint16_t spx_uint16_t; -# elif defined(__MINGW32__) - typedef short spx_int16_t; - typedef unsigned short spx_uint16_t; - typedef int spx_int32_t; - typedef unsigned int spx_uint32_t; -# elif defined(__MWERKS__) - typedef int spx_int32_t; - typedef unsigned int spx_uint32_t; - typedef short spx_int16_t; - typedef unsigned short spx_uint16_t; -# else - /* MSVC/Borland */ - typedef __int32 spx_int32_t; - typedef unsigned __int32 spx_uint32_t; - typedef __int16 spx_int16_t; - typedef unsigned __int16 spx_uint16_t; -# endif - -#elif defined(__MACOS__) - -# include - typedef SInt16 spx_int16_t; - typedef UInt16 spx_uint16_t; - typedef SInt32 spx_int32_t; - typedef UInt32 spx_uint32_t; - -#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ - -# include - typedef int16_t spx_int16_t; - typedef u_int16_t spx_uint16_t; - typedef int32_t spx_int32_t; - typedef u_int32_t spx_uint32_t; - -#elif defined(__BEOS__) - - /* Be */ -# include - typedef int16_t spx_int16_t; - typedef u_int16_t spx_uint16_t; - typedef int32_t spx_int32_t; - typedef u_int32_t spx_uint32_t; - -#elif defined (__EMX__) - - /* OS/2 GCC */ - typedef short spx_int16_t; - typedef unsigned short spx_uint16_t; - typedef int spx_int32_t; - typedef unsigned int spx_uint32_t; - -#elif defined (DJGPP) - - /* DJGPP */ - typedef short spx_int16_t; - typedef int spx_int32_t; - typedef unsigned int spx_uint32_t; - -#elif defined(R5900) - - /* PS2 EE */ - typedef int spx_int32_t; - typedef unsigned spx_uint32_t; - typedef short spx_int16_t; - -#elif defined(__SYMBIAN32__) - - /* Symbian GCC */ - typedef signed short spx_int16_t; - typedef unsigned short spx_uint16_t; - typedef signed int spx_int32_t; - typedef unsigned int spx_uint32_t; - -#elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) - - typedef short spx_int16_t; - typedef unsigned short spx_uint16_t; - typedef long spx_int32_t; - typedef unsigned long spx_uint32_t; - -#elif defined(CONFIG_TI_C6X) - - typedef short spx_int16_t; - typedef unsigned short spx_uint16_t; - typedef int spx_int32_t; - typedef unsigned int spx_uint32_t; - -#else - -# include - -#endif - -#endif /* _SPEEX_TYPES_H */ diff --git a/lib/libspeex/stack_alloc.h b/lib/libspeex/stack_alloc.h deleted file mode 100644 index f2a10921c5..0000000000 --- a/lib/libspeex/stack_alloc.h +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (C) 2002 Jean-Marc Valin */ -/** - @file stack_alloc.h - @brief Temporary memory allocation on stack -*/ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - - Neither the name of the Xiph.org Foundation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef STACK_ALLOC_H -#define STACK_ALLOC_H - -#ifdef USE_ALLOCA -# ifdef WIN32 -# include -# else -# ifdef HAVE_ALLOCA_H -# include -# else -# include -# endif -# endif -#endif - -/** - * @def ALIGN(stack, size) - * - * Aligns the stack to a 'size' boundary - * - * @param stack Stack - * @param size New size boundary - */ - -/** - * @def PUSH(stack, size, type) - * - * Allocates 'size' elements of type 'type' on the stack - * - * @param stack Stack - * @param size Number of elements - * @param type Type of element - */ - -/** - * @def VARDECL(var) - * - * Declare variable on stack - * - * @param var Variable to declare - */ - -/** - * @def ALLOC(var, size, type) - * - * Allocate 'size' elements of 'type' on stack - * - * @param var Name of variable to allocate - * @param size Number of elements - * @param type Type of element - */ - -#ifdef ENABLE_VALGRIND - -#include - -#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) - -#define PUSH(stack, size, type) (VALGRIND_MAKE_NOACCESS(stack, 1000),ALIGN((stack),sizeof(type)),VALGRIND_MAKE_WRITABLE(stack, ((size)*sizeof(type))),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type)))) - -#else - -#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) - -#define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type)))) - -#endif - -#if defined(VAR_ARRAYS) -#define VARDECL(var) -#define ALLOC(var, size, type) type var[size] -#elif defined(USE_ALLOCA) -#define VARDECL(var) var -#define ALLOC(var, size, type) var = _alloca(sizeof(type)*(size)) -#else -#define VARDECL(var) var -#define ALLOC(var, size, type) var = PUSH(stack, size, type) -#endif - - -#endif diff --git a/lib/lodepng/lodepng.c b/lib/lodepng/lodepng.c deleted file mode 100644 index e4f35d7dd5..0000000000 --- a/lib/lodepng/lodepng.c +++ /dev/null @@ -1,6260 +0,0 @@ -/* -LodePNG version 20131222 - -Copyright (c) 2005-2013 Lode Vandevenne - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. -*/ - -/* -The manual and changelog are in the header file "lodepng.h" -Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C. -*/ - -#include "lodepng.h" - -#include -#include - -#ifdef LODEPNG_COMPILE_CPP -#include -#endif /*LODEPNG_COMPILE_CPP*/ - -#define VERSION_STRING "20131222" - -/* -This source file is built up in the following large parts. The code sections -with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. --Tools for C and common code for PNG and Zlib --C Code for Zlib (huffman, deflate, ...) --C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...) --The C++ wrapper around all of the above -*/ - -/*The malloc, realloc and free functions defined here with "lodepng_" in front -of the name, so that you can easily change them to others related to your -platform if needed. Everything else in the code calls these. Pass --DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out -#define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and -define them in your own project's source files without needing to change -lodepng source code. Don't forget to remove "static" if you copypaste them -from here.*/ - -#ifdef LODEPNG_COMPILE_ALLOCATORS -static void* lodepng_malloc(size_t size) -{ - return malloc(size); -} - -static void* lodepng_realloc(void* ptr, size_t new_size) -{ - return realloc(ptr, new_size); -} - -static void lodepng_free(void* ptr) -{ - free(ptr); -} -#else /*LODEPNG_COMPILE_ALLOCATORS*/ -void* lodepng_malloc(size_t size); -void* lodepng_realloc(void* ptr, size_t new_size); -void lodepng_free(void* ptr); -#endif /*LODEPNG_COMPILE_ALLOCATORS*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // Tools for C, and common code for PNG and Zlib. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/* -Often in case of an error a value is assigned to a variable and then it breaks -out of a loop (to go to the cleanup phase of a function). This macro does that. -It makes the error handling code shorter and more readable. - -Example: if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83); -*/ -#define CERROR_BREAK(errorvar, code)\ -{\ - errorvar = code;\ - break;\ -} - -/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/ -#define ERROR_BREAK(code) CERROR_BREAK(error, code) - -/*Set error var to the error code, and return it.*/ -#define CERROR_RETURN_ERROR(errorvar, code)\ -{\ - errorvar = code;\ - return code;\ -} - -/*Try the code, if it returns error, also return the error.*/ -#define CERROR_TRY_RETURN(call)\ -{\ - unsigned error = call;\ - if(error) return error;\ -} - -/* -About uivector, ucvector and string: --All of them wrap dynamic arrays or text strings in a similar way. --LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version. --The string tools are made to avoid problems with compilers that declare things like strncat as deprecated. --They're not used in the interface, only internally in this file as static functions. --As with many other structs in this file, the init and cleanup functions serve as ctor and dtor. -*/ - -#ifdef LODEPNG_COMPILE_ZLIB -/*dynamic vector of unsigned ints*/ -typedef struct uivector -{ - unsigned* data; - size_t size; /*size in number of unsigned longs*/ - size_t allocsize; /*allocated size in bytes*/ -} uivector; - -static void uivector_cleanup(void* p) -{ - ((uivector*)p)->size = ((uivector*)p)->allocsize = 0; - lodepng_free(((uivector*)p)->data); - ((uivector*)p)->data = NULL; -} - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned uivector_resize(uivector* p, size_t size) -{ - if(size * sizeof(unsigned) > p->allocsize) - { - size_t newsize = size * sizeof(unsigned) * 2; - void* data = lodepng_realloc(p->data, newsize); - if(data) - { - p->allocsize = newsize; - p->data = (unsigned*)data; - p->size = size; - } - else return 0; - } - else p->size = size; - return 1; -} - -/*resize and give all new elements the value*/ -static unsigned uivector_resizev(uivector* p, size_t size, unsigned value) -{ - size_t oldsize = p->size, i; - if(!uivector_resize(p, size)) return 0; - for(i = oldsize; i < size; i++) p->data[i] = value; - return 1; -} - -static void uivector_init(uivector* p) -{ - p->data = NULL; - p->size = p->allocsize = 0; -} - -#ifdef LODEPNG_COMPILE_ENCODER -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned uivector_push_back(uivector* p, unsigned c) -{ - if(!uivector_resize(p, p->size + 1)) return 0; - p->data[p->size - 1] = c; - return 1; -} - -/*copy q to p, returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned uivector_copy(uivector* p, const uivector* q) -{ - size_t i; - if(!uivector_resize(p, q->size)) return 0; - for(i = 0; i < q->size; i++) p->data[i] = q->data[i]; - return 1; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_ZLIB*/ - -/* /////////////////////////////////////////////////////////////////////////// */ - -/*dynamic vector of unsigned chars*/ -typedef struct ucvector -{ - unsigned char* data; - size_t size; /*used size*/ - size_t allocsize; /*allocated size*/ -} ucvector; - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned ucvector_resize(ucvector* p, size_t size) -{ - if(size * sizeof(unsigned char) > p->allocsize) - { - size_t newsize = size * sizeof(unsigned char) * 2; - void* data = lodepng_realloc(p->data, newsize); - if(data) - { - p->allocsize = newsize; - p->data = (unsigned char*)data; - p->size = size; - } - else return 0; /*error: not enough memory*/ - } - else p->size = size; - return 1; -} - -#ifdef LODEPNG_COMPILE_PNG - -static void ucvector_cleanup(void* p) -{ - ((ucvector*)p)->size = ((ucvector*)p)->allocsize = 0; - lodepng_free(((ucvector*)p)->data); - ((ucvector*)p)->data = NULL; -} - -static void ucvector_init(ucvector* p) -{ - p->data = NULL; - p->size = p->allocsize = 0; -} - -#ifdef LODEPNG_COMPILE_DECODER -/*resize and give all new elements the value*/ -static unsigned ucvector_resizev(ucvector* p, size_t size, unsigned char value) -{ - size_t oldsize = p->size, i; - if(!ucvector_resize(p, size)) return 0; - for(i = oldsize; i < size; i++) p->data[i] = value; - return 1; -} -#endif /*LODEPNG_COMPILE_DECODER*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ZLIB -/*you can both convert from vector to buffer&size and vica versa. If you use -init_buffer to take over a buffer and size, it is not needed to use cleanup*/ -static void ucvector_init_buffer(ucvector* p, unsigned char* buffer, size_t size) -{ - p->data = buffer; - p->allocsize = p->size = size; -} -#endif /*LODEPNG_COMPILE_ZLIB*/ - -#if (defined(LODEPNG_COMPILE_PNG) && defined(LODEPNG_COMPILE_ANCILLARY_CHUNKS)) || defined(LODEPNG_COMPILE_ENCODER) -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned ucvector_push_back(ucvector* p, unsigned char c) -{ - if(!ucvector_resize(p, p->size + 1)) return 0; - p->data[p->size - 1] = c; - return 1; -} -#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ - - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_PNG -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned string_resize(char** out, size_t size) -{ - char* data = (char*)lodepng_realloc(*out, size + 1); - if(data) - { - data[size] = 0; /*null termination char*/ - *out = data; - } - return data != 0; -} - -/*init a {char*, size_t} pair for use as string*/ -static void string_init(char** out) -{ - *out = NULL; - string_resize(out, 0); -} - -/*free the above pair again*/ -static void string_cleanup(char** out) -{ - lodepng_free(*out); - *out = NULL; -} - -static void string_set(char** out, const char* in) -{ - size_t insize = strlen(in), i = 0; - if(string_resize(out, insize)) - { - for(i = 0; i < insize; i++) - { - (*out)[i] = in[i]; - } - } -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -/* ////////////////////////////////////////////////////////////////////////// */ - -unsigned lodepng_read32bitInt(const unsigned char* buffer) -{ - return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; -} - -#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER) -/*buffer must have at least 4 allocated bytes available*/ -static void lodepng_set32bitInt(unsigned char* buffer, unsigned value) -{ - buffer[0] = (unsigned char)((value >> 24) & 0xff); - buffer[1] = (unsigned char)((value >> 16) & 0xff); - buffer[2] = (unsigned char)((value >> 8) & 0xff); - buffer[3] = (unsigned char)((value ) & 0xff); -} -#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ - -#ifdef LODEPNG_COMPILE_ENCODER -static void lodepng_add32bitInt(ucvector* buffer, unsigned value) -{ - ucvector_resize(buffer, buffer->size + 4); /*todo: give error if resize failed*/ - lodepng_set32bitInt(&buffer->data[buffer->size - 4], value); -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / File IO / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_DISK - -unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename) -{ - FILE* file; - long size; - - /*provide some proper output values if error will happen*/ - *out = 0; - *outsize = 0; - - file = fopen(filename, "rb"); - if(!file) return 78; - - /*get filesize:*/ - fseek(file , 0 , SEEK_END); - size = ftell(file); - rewind(file); - - /*read contents of the file into the vector*/ - *outsize = 0; - *out = (unsigned char*)lodepng_malloc((size_t)size); - if(size && (*out)) (*outsize) = fread(*out, 1, (size_t)size, file); - - fclose(file); - if(!(*out) && size) return 83; /*the above malloc failed*/ - return 0; -} - -/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ -unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename) -{ - FILE* file; - file = fopen(filename, "wb" ); - if(!file) return 79; - fwrite((char*)buffer , 1 , buffersize, file); - fclose(file); - return 0; -} - -#endif /*LODEPNG_COMPILE_DISK*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // End of common code and tools. Begin of Zlib related code. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_ENCODER -/*TODO: this ignores potential out of memory errors*/ -#define addBitToStream(/*size_t**/ bitpointer, /*ucvector**/ bitstream, /*unsigned char*/ bit)\ -{\ - /*add a new byte at the end*/\ - if(((*bitpointer) & 7) == 0) ucvector_push_back(bitstream, (unsigned char)0);\ - /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/\ - (bitstream->data[bitstream->size - 1]) |= (bit << ((*bitpointer) & 0x7));\ - (*bitpointer)++;\ -} - -static void addBitsToStream(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) -{ - size_t i; - for(i = 0; i < nbits; i++) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> i) & 1)); -} - -static void addBitsToStreamReversed(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) -{ - size_t i; - for(i = 0; i < nbits; i++) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> (nbits - 1 - i)) & 1)); -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -#define READBIT(bitpointer, bitstream) ((bitstream[bitpointer >> 3] >> (bitpointer & 0x7)) & (unsigned char)1) - -static unsigned char readBitFromStream(size_t* bitpointer, const unsigned char* bitstream) -{ - unsigned char result = (unsigned char)(READBIT(*bitpointer, bitstream)); - (*bitpointer)++; - return result; -} - -static unsigned readBitsFromStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) -{ - unsigned result = 0, i; - for(i = 0; i < nbits; i++) - { - result += ((unsigned)READBIT(*bitpointer, bitstream)) << i; - (*bitpointer)++; - } - return result; -} -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Deflate - Huffman / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#define FIRST_LENGTH_CODE_INDEX 257 -#define LAST_LENGTH_CODE_INDEX 285 -/*256 literals, the end code, some length codes, and 2 unused codes*/ -#define NUM_DEFLATE_CODE_SYMBOLS 288 -/*the distance codes have their own symbols, 30 used, 2 unused*/ -#define NUM_DISTANCE_SYMBOLS 32 -/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/ -#define NUM_CODE_LENGTH_CODES 19 - -/*the base lengths represented by codes 257-285*/ -static const unsigned LENGTHBASE[29] - = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, - 67, 83, 99, 115, 131, 163, 195, 227, 258}; - -/*the extra bits used by codes 257-285 (added to base length)*/ -static const unsigned LENGTHEXTRA[29] - = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, - 4, 4, 4, 4, 5, 5, 5, 5, 0}; - -/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/ -static const unsigned DISTANCEBASE[30] - = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, - 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; - -/*the extra bits of backwards distances (added to base)*/ -static const unsigned DISTANCEEXTRA[30] - = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, - 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; - -/*the order in which "code length alphabet code lengths" are stored, out of this -the huffman tree of the dynamic huffman tree lengths is generated*/ -static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES] - = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - -/* ////////////////////////////////////////////////////////////////////////// */ - -/* -Huffman tree struct, containing multiple representations of the tree -*/ -typedef struct HuffmanTree -{ - unsigned* tree2d; - unsigned* tree1d; - unsigned* lengths; /*the lengths of the codes of the 1d-tree*/ - unsigned maxbitlen; /*maximum number of bits a single code can get*/ - unsigned numcodes; /*number of symbols in the alphabet = number of codes*/ -} HuffmanTree; - -/*function used for debug purposes to draw the tree in ascii art with C++*/ -/* -static void HuffmanTree_draw(HuffmanTree* tree) -{ - std::cout << "tree. length: " << tree->numcodes << " maxbitlen: " << tree->maxbitlen << std::endl; - for(size_t i = 0; i < tree->tree1d.size; i++) - { - if(tree->lengths.data[i]) - std::cout << i << " " << tree->tree1d.data[i] << " " << tree->lengths.data[i] << std::endl; - } - std::cout << std::endl; -}*/ - -static void HuffmanTree_init(HuffmanTree* tree) -{ - tree->tree2d = 0; - tree->tree1d = 0; - tree->lengths = 0; -} - -static void HuffmanTree_cleanup(HuffmanTree* tree) -{ - lodepng_free(tree->tree2d); - lodepng_free(tree->tree1d); - lodepng_free(tree->lengths); -} - -/*the tree representation used by the decoder. return value is error*/ -static unsigned HuffmanTree_make2DTree(HuffmanTree* tree) -{ - unsigned nodefilled = 0; /*up to which node it is filled*/ - unsigned treepos = 0; /*position in the tree (1 of the numcodes columns)*/ - unsigned n, i; - - tree->tree2d = (unsigned*)lodepng_malloc(tree->numcodes * 2 * sizeof(unsigned)); - if(!tree->tree2d) return 83; /*alloc fail*/ - - /* - convert tree1d[] to tree2d[][]. In the 2D array, a value of 32767 means - uninited, a value >= numcodes is an address to another bit, a value < numcodes - is a code. The 2 rows are the 2 possible bit values (0 or 1), there are as - many columns as codes - 1. - A good huffmann tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. - Here, the internal nodes are stored (what their 0 and 1 option point to). - There is only memory for such good tree currently, if there are more nodes - (due to too long length codes), error 55 will happen - */ - for(n = 0; n < tree->numcodes * 2; n++) - { - tree->tree2d[n] = 32767; /*32767 here means the tree2d isn't filled there yet*/ - } - - for(n = 0; n < tree->numcodes; n++) /*the codes*/ - { - for(i = 0; i < tree->lengths[n]; i++) /*the bits for this code*/ - { - unsigned char bit = (unsigned char)((tree->tree1d[n] >> (tree->lengths[n] - i - 1)) & 1); - if(treepos > tree->numcodes - 2) return 55; /*oversubscribed, see comment in lodepng_error_text*/ - if(tree->tree2d[2 * treepos + bit] == 32767) /*not yet filled in*/ - { - if(i + 1 == tree->lengths[n]) /*last bit*/ - { - tree->tree2d[2 * treepos + bit] = n; /*put the current code in it*/ - treepos = 0; - } - else - { - /*put address of the next step in here, first that address has to be found of course - (it's just nodefilled + 1)...*/ - nodefilled++; - /*addresses encoded with numcodes added to it*/ - tree->tree2d[2 * treepos + bit] = nodefilled + tree->numcodes; - treepos = nodefilled; - } - } - else treepos = tree->tree2d[2 * treepos + bit] - tree->numcodes; - } - } - - for(n = 0; n < tree->numcodes * 2; n++) - { - if(tree->tree2d[n] == 32767) tree->tree2d[n] = 0; /*remove possible remaining 32767's*/ - } - - return 0; -} - -/* -Second step for the ...makeFromLengths and ...makeFromFrequencies functions. -numcodes, lengths and maxbitlen must already be filled in correctly. return -value is error. -*/ -static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) -{ - uivector blcount; - uivector nextcode; - unsigned bits, n, error = 0; - - uivector_init(&blcount); - uivector_init(&nextcode); - - tree->tree1d = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned)); - if(!tree->tree1d) error = 83; /*alloc fail*/ - - if(!uivector_resizev(&blcount, tree->maxbitlen + 1, 0) - || !uivector_resizev(&nextcode, tree->maxbitlen + 1, 0)) - error = 83; /*alloc fail*/ - - if(!error) - { - /*step 1: count number of instances of each code length*/ - for(bits = 0; bits < tree->numcodes; bits++) blcount.data[tree->lengths[bits]]++; - /*step 2: generate the nextcode values*/ - for(bits = 1; bits <= tree->maxbitlen; bits++) - { - nextcode.data[bits] = (nextcode.data[bits - 1] + blcount.data[bits - 1]) << 1; - } - /*step 3: generate all the codes*/ - for(n = 0; n < tree->numcodes; n++) - { - if(tree->lengths[n] != 0) tree->tree1d[n] = nextcode.data[tree->lengths[n]]++; - } - } - - uivector_cleanup(&blcount); - uivector_cleanup(&nextcode); - - if(!error) return HuffmanTree_make2DTree(tree); - else return error; -} - -/* -given the code lengths (as stored in the PNG file), generate the tree as defined -by Deflate. maxbitlen is the maximum bits that a code in the tree can have. -return value is error. -*/ -static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen, - size_t numcodes, unsigned maxbitlen) -{ - unsigned i; - tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned)); - if(!tree->lengths) return 83; /*alloc fail*/ - for(i = 0; i < numcodes; i++) tree->lengths[i] = bitlen[i]; - tree->numcodes = (unsigned)numcodes; /*number of symbols*/ - tree->maxbitlen = maxbitlen; - return HuffmanTree_makeFromLengths2(tree); -} - -#ifdef LODEPNG_COMPILE_ENCODER - -/* -A coin, this is the terminology used for the package-merge algorithm and the -coin collector's problem. This is used to generate the huffman tree. -A coin can be multiple coins (when they're merged) -*/ -typedef struct Coin -{ - uivector symbols; - float weight; /*the sum of all weights in this coin*/ -} Coin; - -static void coin_init(Coin* c) -{ - uivector_init(&c->symbols); -} - -/*argument c is void* so that this dtor can be given as function pointer to the vector resize function*/ -static void coin_cleanup(void* c) -{ - uivector_cleanup(&((Coin*)c)->symbols); -} - -static void coin_copy(Coin* c1, const Coin* c2) -{ - c1->weight = c2->weight; - uivector_copy(&c1->symbols, &c2->symbols); -} - -static void add_coins(Coin* c1, const Coin* c2) -{ - size_t i; - for(i = 0; i < c2->symbols.size; i++) uivector_push_back(&c1->symbols, c2->symbols.data[i]); - c1->weight += c2->weight; -} - -static void init_coins(Coin* coins, size_t num) -{ - size_t i; - for(i = 0; i < num; i++) coin_init(&coins[i]); -} - -static void cleanup_coins(Coin* coins, size_t num) -{ - size_t i; - for(i = 0; i < num; i++) coin_cleanup(&coins[i]); -} - -static int coin_compare(const void* a, const void* b) { - float wa = ((const Coin*)a)->weight; - float wb = ((const Coin*)b)->weight; - return wa > wb ? 1 : wa < wb ? -1 : 0; -} - -static unsigned append_symbol_coins(Coin* coins, const unsigned* frequencies, unsigned numcodes, size_t sum) -{ - unsigned i; - unsigned j = 0; /*index of present symbols*/ - for(i = 0; i < numcodes; i++) - { - if(frequencies[i] != 0) /*only include symbols that are present*/ - { - coins[j].weight = frequencies[i] / (float)sum; - uivector_push_back(&coins[j].symbols, i); - j++; - } - } - return 0; -} - -unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, - size_t numcodes, unsigned maxbitlen) -{ - unsigned i, j; - size_t sum = 0, numpresent = 0; - unsigned error = 0; - Coin* coins; /*the coins of the currently calculated row*/ - Coin* prev_row; /*the previous row of coins*/ - unsigned numcoins; - unsigned coinmem; - - if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ - - for(i = 0; i < numcodes; i++) - { - if(frequencies[i] > 0) - { - numpresent++; - sum += frequencies[i]; - } - } - - for(i = 0; i < numcodes; i++) lengths[i] = 0; - - /*ensure at least two present symbols. There should be at least one symbol - according to RFC 1951 section 3.2.7. To decoders incorrectly require two. To - make these work as well ensure there are at least two symbols. The - Package-Merge code below also doesn't work correctly if there's only one - symbol, it'd give it the theoritical 0 bits but in practice zlib wants 1 bit*/ - if(numpresent == 0) - { - lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/ - } - else if(numpresent == 1) - { - for(i = 0; i < numcodes; i++) - { - if(frequencies[i]) - { - lengths[i] = 1; - lengths[i == 0 ? 1 : 0] = 1; - break; - } - } - } - else - { - /*Package-Merge algorithm represented by coin collector's problem - For every symbol, maxbitlen coins will be created*/ - - coinmem = numpresent * 2; /*max amount of coins needed with the current algo*/ - coins = (Coin*)lodepng_malloc(sizeof(Coin) * coinmem); - prev_row = (Coin*)lodepng_malloc(sizeof(Coin) * coinmem); - if(!coins || !prev_row) - { - lodepng_free(coins); - lodepng_free(prev_row); - return 83; /*alloc fail*/ - } - init_coins(coins, coinmem); - init_coins(prev_row, coinmem); - - /*first row, lowest denominator*/ - error = append_symbol_coins(coins, frequencies, numcodes, sum); - numcoins = numpresent; - qsort(coins, numcoins, sizeof(Coin), coin_compare); - if(!error) - { - unsigned numprev = 0; - for(j = 1; j <= maxbitlen && !error; j++) /*each of the remaining rows*/ - { - unsigned tempnum; - Coin* tempcoins; - /*swap prev_row and coins, and their amounts*/ - tempcoins = prev_row; prev_row = coins; coins = tempcoins; - tempnum = numprev; numprev = numcoins; numcoins = tempnum; - - cleanup_coins(coins, numcoins); - init_coins(coins, numcoins); - - numcoins = 0; - - /*fill in the merged coins of the previous row*/ - for(i = 0; i + 1 < numprev; i += 2) - { - /*merge prev_row[i] and prev_row[i + 1] into new coin*/ - Coin* coin = &coins[numcoins++]; - coin_copy(coin, &prev_row[i]); - add_coins(coin, &prev_row[i + 1]); - } - /*fill in all the original symbols again*/ - if(j < maxbitlen) - { - error = append_symbol_coins(coins + numcoins, frequencies, numcodes, sum); - numcoins += numpresent; - } - qsort(coins, numcoins, sizeof(Coin), coin_compare); - } - } - - if(!error) - { - /*calculate the lenghts of each symbol, as the amount of times a coin of each symbol is used*/ - for(i = 0; i < numpresent - 1; i++) - { - Coin* coin = &coins[i]; - for(j = 0; j < coin->symbols.size; j++) lengths[coin->symbols.data[j]]++; - } - } - - cleanup_coins(coins, coinmem); - lodepng_free(coins); - cleanup_coins(prev_row, coinmem); - lodepng_free(prev_row); - } - - return error; -} - -/*Create the Huffman tree given the symbol frequencies*/ -static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies, - size_t mincodes, size_t numcodes, unsigned maxbitlen) -{ - unsigned error = 0; - while(!frequencies[numcodes - 1] && numcodes > mincodes) numcodes--; /*trim zeroes*/ - tree->maxbitlen = maxbitlen; - tree->numcodes = (unsigned)numcodes; /*number of symbols*/ - tree->lengths = (unsigned*)lodepng_realloc(tree->lengths, numcodes * sizeof(unsigned)); - if(!tree->lengths) return 83; /*alloc fail*/ - /*initialize all lengths to 0*/ - memset(tree->lengths, 0, numcodes * sizeof(unsigned)); - - error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen); - if(!error) error = HuffmanTree_makeFromLengths2(tree); - return error; -} - -static unsigned HuffmanTree_getCode(const HuffmanTree* tree, unsigned index) -{ - return tree->tree1d[index]; -} - -static unsigned HuffmanTree_getLength(const HuffmanTree* tree, unsigned index) -{ - return tree->lengths[index]; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/ -static unsigned generateFixedLitLenTree(HuffmanTree* tree) -{ - unsigned i, error = 0; - unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); - if(!bitlen) return 83; /*alloc fail*/ - - /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/ - for(i = 0; i <= 143; i++) bitlen[i] = 8; - for(i = 144; i <= 255; i++) bitlen[i] = 9; - for(i = 256; i <= 279; i++) bitlen[i] = 7; - for(i = 280; i <= 287; i++) bitlen[i] = 8; - - error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15); - - lodepng_free(bitlen); - return error; -} - -/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/ -static unsigned generateFixedDistanceTree(HuffmanTree* tree) -{ - unsigned i, error = 0; - unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); - if(!bitlen) return 83; /*alloc fail*/ - - /*there are 32 distance codes, but 30-31 are unused*/ - for(i = 0; i < NUM_DISTANCE_SYMBOLS; i++) bitlen[i] = 5; - error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15); - - lodepng_free(bitlen); - return error; -} - -#ifdef LODEPNG_COMPILE_DECODER - -/* -returns the code, or (unsigned)(-1) if error happened -inbitlength is the length of the complete buffer, in bits (so its byte length times 8) -*/ -static unsigned huffmanDecodeSymbol(const unsigned char* in, size_t* bp, - const HuffmanTree* codetree, size_t inbitlength) -{ - unsigned treepos = 0, ct; - for(;;) - { - if(*bp >= inbitlength) return (unsigned)(-1); /*error: end of input memory reached without endcode*/ - /* - decode the symbol from the tree. The "readBitFromStream" code is inlined in - the expression below because this is the biggest bottleneck while decoding - */ - ct = codetree->tree2d[(treepos << 1) + READBIT(*bp, in)]; - (*bp)++; - if(ct < codetree->numcodes) return ct; /*the symbol is decoded, return it*/ - else treepos = ct - codetree->numcodes; /*symbol not yet decoded, instead move tree position*/ - - if(treepos >= codetree->numcodes) return (unsigned)(-1); /*error: it appeared outside the codetree*/ - } -} -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Inflator (Decompressor) / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*get the tree of a deflated block with fixed tree, as specified in the deflate specification*/ -static void getTreeInflateFixed(HuffmanTree* tree_ll, HuffmanTree* tree_d) -{ - /*TODO: check for out of memory errors*/ - generateFixedLitLenTree(tree_ll); - generateFixedDistanceTree(tree_d); -} - -/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/ -static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, - const unsigned char* in, size_t* bp, size_t inlength) -{ - /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/ - unsigned error = 0; - unsigned n, HLIT, HDIST, HCLEN, i; - size_t inbitlength = inlength * 8; - - /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/ - unsigned* bitlen_ll = 0; /*lit,len code lengths*/ - unsigned* bitlen_d = 0; /*dist code lengths*/ - /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/ - unsigned* bitlen_cl = 0; - HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/ - - if((*bp) >> 3 >= inlength - 2) return 49; /*error: the bit pointer is or will go past the memory*/ - - /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/ - HLIT = readBitsFromStream(bp, in, 5) + 257; - /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/ - HDIST = readBitsFromStream(bp, in, 5) + 1; - /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/ - HCLEN = readBitsFromStream(bp, in, 4) + 4; - - HuffmanTree_init(&tree_cl); - - while(!error) - { - /*read the code length codes out of 3 * (amount of code length codes) bits*/ - - bitlen_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned)); - if(!bitlen_cl) ERROR_BREAK(83 /*alloc fail*/); - - for(i = 0; i < NUM_CODE_LENGTH_CODES; i++) - { - if(i < HCLEN) bitlen_cl[CLCL_ORDER[i]] = readBitsFromStream(bp, in, 3); - else bitlen_cl[CLCL_ORDER[i]] = 0; /*if not, it must stay 0*/ - } - - error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7); - if(error) break; - - /*now we can use this tree to read the lengths for the tree that this function will return*/ - bitlen_ll = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); - bitlen_d = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); - if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/); - for(i = 0; i < NUM_DEFLATE_CODE_SYMBOLS; i++) bitlen_ll[i] = 0; - for(i = 0; i < NUM_DISTANCE_SYMBOLS; i++) bitlen_d[i] = 0; - - /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/ - i = 0; - while(i < HLIT + HDIST) - { - unsigned code = huffmanDecodeSymbol(in, bp, &tree_cl, inbitlength); - if(code <= 15) /*a length code*/ - { - if(i < HLIT) bitlen_ll[i] = code; - else bitlen_d[i - HLIT] = code; - i++; - } - else if(code == 16) /*repeat previous*/ - { - unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/ - unsigned value; /*set value to the previous code*/ - - if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ - if (i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/ - - replength += readBitsFromStream(bp, in, 2); - - if(i < HLIT + 1) value = bitlen_ll[i - 1]; - else value = bitlen_d[i - HLIT - 1]; - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; n++) - { - if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/ - if(i < HLIT) bitlen_ll[i] = value; - else bitlen_d[i - HLIT] = value; - i++; - } - } - else if(code == 17) /*repeat "0" 3-10 times*/ - { - unsigned replength = 3; /*read in the bits that indicate repeat length*/ - if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ - - replength += readBitsFromStream(bp, in, 3); - - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; n++) - { - if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/ - - if(i < HLIT) bitlen_ll[i] = 0; - else bitlen_d[i - HLIT] = 0; - i++; - } - } - else if(code == 18) /*repeat "0" 11-138 times*/ - { - unsigned replength = 11; /*read in the bits that indicate repeat length*/ - if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ - - replength += readBitsFromStream(bp, in, 7); - - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; n++) - { - if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/ - - if(i < HLIT) bitlen_ll[i] = 0; - else bitlen_d[i - HLIT] = 0; - i++; - } - } - else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ - { - if(code == (unsigned)(-1)) - { - /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol - (10=no endcode, 11=wrong jump outside of tree)*/ - error = (*bp) > inbitlength ? 10 : 11; - } - else error = 16; /*unexisting code, this can never happen*/ - break; - } - } - if(error) break; - - if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/ - - /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/ - error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15); - if(error) break; - error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15); - - break; /*end of error-while*/ - } - - lodepng_free(bitlen_cl); - lodepng_free(bitlen_ll); - lodepng_free(bitlen_d); - HuffmanTree_cleanup(&tree_cl); - - return error; -} - -/*inflate a block with dynamic of fixed Huffman tree*/ -static unsigned inflateHuffmanBlock(ucvector* out, const unsigned char* in, size_t* bp, - size_t* pos, size_t inlength, unsigned btype) -{ - unsigned error = 0; - HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/ - HuffmanTree tree_d; /*the huffman tree for distance codes*/ - size_t inbitlength = inlength * 8; - - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - - if(btype == 1) getTreeInflateFixed(&tree_ll, &tree_d); - else if(btype == 2) error = getTreeInflateDynamic(&tree_ll, &tree_d, in, bp, inlength); - - while(!error) /*decode all symbols until end reached, breaks at end code*/ - { - /*code_ll is literal, length or end code*/ - unsigned code_ll = huffmanDecodeSymbol(in, bp, &tree_ll, inbitlength); - if(code_ll <= 255) /*literal symbol*/ - { - if((*pos) >= out->size) - { - /*reserve more room at once*/ - if(!ucvector_resize(out, ((*pos) + 1) * 2)) ERROR_BREAK(83 /*alloc fail*/); - } - out->data[(*pos)] = (unsigned char)(code_ll); - (*pos)++; - } - else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/ - { - unsigned code_d, distance; - unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/ - size_t start, forward, backward, length; - - /*part 1: get length base*/ - length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX]; - - /*part 2: get extra bits and add the value of that to length*/ - numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX]; - if(*bp >= inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ - length += readBitsFromStream(bp, in, numextrabits_l); - - /*part 3: get distance code*/ - code_d = huffmanDecodeSymbol(in, bp, &tree_d, inbitlength); - if(code_d > 29) - { - if(code_ll == (unsigned)(-1)) /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ - { - /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol - (10=no endcode, 11=wrong jump outside of tree)*/ - error = (*bp) > inlength * 8 ? 10 : 11; - } - else error = 18; /*error: invalid distance code (30-31 are never used)*/ - break; - } - distance = DISTANCEBASE[code_d]; - - /*part 4: get extra bits from distance*/ - numextrabits_d = DISTANCEEXTRA[code_d]; - if(*bp >= inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ - - distance += readBitsFromStream(bp, in, numextrabits_d); - - /*part 5: fill in all the out[n] values based on the length and dist*/ - start = (*pos); - if(distance > start) ERROR_BREAK(52); /*too long backward distance*/ - backward = start - distance; - if((*pos) + length >= out->size) - { - /*reserve more room at once*/ - if(!ucvector_resize(out, ((*pos) + length) * 2)) ERROR_BREAK(83 /*alloc fail*/); - } - - for(forward = 0; forward < length; forward++) - { - out->data[(*pos)] = out->data[backward]; - (*pos)++; - backward++; - if(backward >= start) backward = start - distance; - } - } - else if(code_ll == 256) - { - break; /*end code, break the loop*/ - } - else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ - { - /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol - (10=no endcode, 11=wrong jump outside of tree)*/ - error = (*bp) > inlength * 8 ? 10 : 11; - break; - } - } - - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - - return error; -} - -static unsigned inflateNoCompression(ucvector* out, const unsigned char* in, size_t* bp, size_t* pos, size_t inlength) -{ - /*go to first boundary of byte*/ - size_t p; - unsigned LEN, NLEN, n, error = 0; - while(((*bp) & 0x7) != 0) (*bp)++; - p = (*bp) / 8; /*byte position*/ - - /*read LEN (2 bytes) and NLEN (2 bytes)*/ - if(p >= inlength - 4) return 52; /*error, bit pointer will jump past memory*/ - LEN = in[p] + 256 * in[p + 1]; p += 2; - NLEN = in[p] + 256 * in[p + 1]; p += 2; - - /*check if 16-bit NLEN is really the one's complement of LEN*/ - if(LEN + NLEN != 65535) return 21; /*error: NLEN is not one's complement of LEN*/ - - if((*pos) + LEN >= out->size) - { - if(!ucvector_resize(out, (*pos) + LEN)) return 83; /*alloc fail*/ - } - - /*read the literal data: LEN bytes are now stored in the out buffer*/ - if(p + LEN > inlength) return 23; /*error: reading outside of in buffer*/ - for(n = 0; n < LEN; n++) out->data[(*pos)++] = in[p++]; - - (*bp) = p * 8; - - return error; -} - -static unsigned lodepng_inflatev(ucvector* out, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings) -{ - /*bit pointer in the "in" data, current byte is bp >> 3, current bit is bp & 0x7 (from lsb to msb of the byte)*/ - size_t bp = 0; - unsigned BFINAL = 0; - size_t pos = 0; /*byte position in the out buffer*/ - - unsigned error = 0; - - (void)settings; - - while(!BFINAL) - { - unsigned BTYPE; - if(bp + 2 >= insize * 8) return 52; /*error, bit pointer will jump past memory*/ - BFINAL = readBitFromStream(&bp, in); - BTYPE = 1 * readBitFromStream(&bp, in); - BTYPE += 2 * readBitFromStream(&bp, in); - - if(BTYPE == 3) return 20; /*error: invalid BTYPE*/ - else if(BTYPE == 0) error = inflateNoCompression(out, in, &bp, &pos, insize); /*no compression*/ - else error = inflateHuffmanBlock(out, in, &bp, &pos, insize, BTYPE); /*compression, BTYPE 01 or 10*/ - - if(error) return error; - } - - /*Only now we know the true size of out, resize it to that*/ - if(!ucvector_resize(out, pos)) error = 83; /*alloc fail*/ - - return error; -} - -unsigned lodepng_inflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings) -{ - unsigned error; - ucvector v; - ucvector_init_buffer(&v, *out, *outsize); - error = lodepng_inflatev(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - return error; -} - -static unsigned inflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings) -{ - if(settings->custom_inflate) - { - return settings->custom_inflate(out, outsize, in, insize, settings); - } - else - { - return lodepng_inflate(out, outsize, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Deflator (Compressor) / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -static const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258; - -/*bitlen is the size in bits of the code*/ -static void addHuffmanSymbol(size_t* bp, ucvector* compressed, unsigned code, unsigned bitlen) -{ - addBitsToStreamReversed(bp, compressed, code, bitlen); -} - -/*search the index in the array, that has the largest value smaller than or equal to the given value, -given array must be sorted (if no value is smaller, it returns the size of the given array)*/ -static size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value) -{ - /*linear search implementation*/ - /*for(size_t i = 1; i < array_size; i++) if(array[i] > value) return i - 1; - return array_size - 1;*/ - - /*binary search implementation (not that much faster) (precondition: array_size > 0)*/ - size_t left = 1; - size_t right = array_size - 1; - while(left <= right) - { - size_t mid = (left + right) / 2; - if(array[mid] <= value) left = mid + 1; /*the value to find is more to the right*/ - else if(array[mid - 1] > value) right = mid - 1; /*the value to find is more to the left*/ - else return mid - 1; - } - return array_size - 1; -} - -static void addLengthDistance(uivector* values, size_t length, size_t distance) -{ - /*values in encoded vector are those used by deflate: - 0-255: literal bytes - 256: end - 257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits) - 286-287: invalid*/ - - unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length); - unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]); - unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance); - unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]); - - uivector_push_back(values, length_code + FIRST_LENGTH_CODE_INDEX); - uivector_push_back(values, extra_length); - uivector_push_back(values, dist_code); - uivector_push_back(values, extra_distance); -} - -static const unsigned HASH_BIT_MASK = 65535; -static const unsigned HASH_NUM_VALUES = 65536; -static const unsigned HASH_NUM_CHARACTERS = 3; -static const unsigned HASH_SHIFT = 2; -/* -The HASH_NUM_CHARACTERS value is used to make encoding faster by using longer -sequences to generate a hash value from the stream bytes. Setting it to 3 -gives exactly the same compression as the brute force method, since deflate's -run length encoding starts with lengths of 3. Setting it to higher values, -like 6, can make the encoding faster (not always though!), but will cause the -encoding to miss any length between 3 and this value, so that the compression -may be worse (but this can vary too depending on the image, sometimes it is -even a bit better instead). -The HASH_NUM_VALUES is the amount of unique possible hash values that -combinations of bytes can give, the higher it is the more memory is needed, but -if it's too low the advantage of hashing is gone. -*/ - -typedef struct Hash -{ - int* head; /*hash value to head circular pos*/ - int* val; /*circular pos to hash value*/ - /*circular pos to prev circular pos*/ - unsigned short* chain; - unsigned short* zeros; -} Hash; - -static unsigned hash_init(Hash* hash, unsigned windowsize) -{ - unsigned i; - hash->head = (int*)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES); - hash->val = (int*)lodepng_malloc(sizeof(int) * windowsize); - hash->chain = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); - hash->zeros = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); - - if(!hash->head || !hash->val || !hash->chain || !hash->zeros) return 83; /*alloc fail*/ - - /*initialize hash table*/ - for(i = 0; i < HASH_NUM_VALUES; i++) hash->head[i] = -1; - for(i = 0; i < windowsize; i++) hash->val[i] = -1; - for(i = 0; i < windowsize; i++) hash->chain[i] = i; /*same value as index indicates uninitialized*/ - - return 0; -} - -static void hash_cleanup(Hash* hash) -{ - lodepng_free(hash->head); - lodepng_free(hash->val); - lodepng_free(hash->chain); - lodepng_free(hash->zeros); -} - -static unsigned getHash(const unsigned char* data, size_t size, size_t pos) -{ - unsigned result = 0; - if (HASH_NUM_CHARACTERS == 3 && pos + 2 < size) { - result ^= (data[pos + 0] << (0 * HASH_SHIFT)); - result ^= (data[pos + 1] << (1 * HASH_SHIFT)); - result ^= (data[pos + 2] << (2 * HASH_SHIFT)); - } else { - size_t amount, i; - if(pos >= size) return 0; - amount = HASH_NUM_CHARACTERS; - if(pos + amount >= size) amount = size - pos; - for(i = 0; i < amount; i++) result ^= (data[pos + i] << (i * HASH_SHIFT)); - } - return result & HASH_BIT_MASK; -} - -static unsigned countZeros(const unsigned char* data, size_t size, size_t pos) -{ - const unsigned char* start = data + pos; - const unsigned char* end = start + MAX_SUPPORTED_DEFLATE_LENGTH; - if(end > data + size) end = data + size; - data = start; - while (data != end && *data == 0) data++; - /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/ - return (unsigned)(data - start); -} - -/*wpos = pos & (windowsize - 1)*/ -static void updateHashChain(Hash* hash, size_t wpos, int hashval) -{ - hash->val[wpos] = hashval; - if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval]; - hash->head[hashval] = wpos; -} - -/* -LZ77-encode the data. Return value is error code. The input are raw bytes, the output -is in the form of unsigned integers with codes representing for example literal bytes, or -length/distance pairs. -It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a -sliding window (of windowsize) is used, and all past bytes in that window can be used as -the "dictionary". A brute force search through all possible distances would be slow, and -this hash technique is one out of several ways to speed this up. -*/ -static unsigned encodeLZ77(uivector* out, Hash* hash, - const unsigned char* in, size_t inpos, size_t insize, unsigned windowsize, - unsigned minmatch, unsigned nicematch, unsigned lazymatching) -{ - unsigned pos, i, error = 0; - /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/ - unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8; - unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64; - - unsigned usezeros = 1; /*not sure if setting it to false for windowsize < 8192 is better or worse*/ - unsigned numzeros = 0; - - unsigned offset; /*the offset represents the distance in LZ77 terminology*/ - unsigned length; - unsigned lazy = 0; - unsigned lazylength = 0, lazyoffset = 0; - unsigned hashval; - unsigned current_offset, current_length; - const unsigned char *lastptr, *foreptr, *backptr; - unsigned hashpos, prevpos; - - if(windowsize <= 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/ - if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/ - - if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = MAX_SUPPORTED_DEFLATE_LENGTH; - - for(pos = inpos; pos < insize; pos++) - { - size_t wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/ - unsigned chainlength = 0; - - hashval = getHash(in, insize, pos); - updateHashChain(hash, wpos, hashval); - - if(usezeros && hashval == 0) - { - if (numzeros == 0) numzeros = countZeros(in, insize, pos); - else if (pos + numzeros >= insize || in[pos + numzeros - 1] != 0) numzeros--; - hash->zeros[wpos] = numzeros; - } - else - { - numzeros = 0; - } - - /*the length and offset found for the current position*/ - length = 0; - offset = 0; - - prevpos = hash->head[hashval]; - hashpos = hash->chain[prevpos]; - - lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH]; - - /*search for the longest string*/ - for(;;) - { - /*stop when went completely around the circular buffer*/ - if(prevpos < wpos && hashpos > prevpos && hashpos <= wpos) break; - if(prevpos > wpos && (hashpos <= wpos || hashpos > prevpos)) break; - if(chainlength++ >= maxchainlength) break; - - current_offset = hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize; - if(current_offset > 0) - { - /*test the next characters*/ - foreptr = &in[pos]; - backptr = &in[pos - current_offset]; - - /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/ - if(usezeros && hashval == 0 && hash->val[hashpos] == 0 /*hashval[hashpos] may be out of date*/) - { - unsigned skip = hash->zeros[hashpos]; - if(skip > numzeros) skip = numzeros; - backptr += skip; - foreptr += skip; - } - - while(foreptr != lastptr && *backptr == *foreptr) /*maximum supported length by deflate is max length*/ - { - ++backptr; - ++foreptr; - } - current_length = (unsigned)(foreptr - &in[pos]); - - if(current_length > length) - { - length = current_length; /*the longest length*/ - offset = current_offset; /*the offset that is related to this longest length*/ - /*jump out once a length of max length is found (speed gain). This also jumps - out if length is MAX_SUPPORTED_DEFLATE_LENGTH*/ - if(current_length >= nicematch) break; - } - } - - if(hashpos == hash->chain[hashpos]) break; - - prevpos = hashpos; - hashpos = hash->chain[hashpos]; - } - - if(lazymatching) - { - if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH) - { - lazy = 1; - lazylength = length; - lazyoffset = offset; - continue; /*try the next byte*/ - } - if(lazy) - { - lazy = 0; - if(pos == 0) ERROR_BREAK(81); - if(length > lazylength + 1) - { - /*push the previous character as literal*/ - if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/); - } - else - { - length = lazylength; - offset = lazyoffset; - hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/ - pos--; - } - } - } - if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/); - - /*encode it as length/distance pair or literal value*/ - if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/ - { - if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); - } - else if(length < minmatch || (length == 3 && offset > 4096)) - { - /*compensate for the fact that longer offsets have more extra bits, a - length of only 3 may be not worth it then*/ - if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); - } - else - { - addLengthDistance(out, length, offset); - for(i = 1; i < length; i++) - { - pos++; - wpos = pos & (windowsize - 1); - hashval = getHash(in, insize, pos); - updateHashChain(hash, wpos, hashval); - if(usezeros && hashval == 0) - { - if (numzeros == 0) numzeros = countZeros(in, insize, pos); - else if (pos + numzeros >= insize || in[pos + numzeros - 1] != 0) numzeros--; - hash->zeros[wpos] = numzeros; - } - else - { - numzeros = 0; - } - } - } - } /*end of the loop through each character of input*/ - - return error; -} - -/* /////////////////////////////////////////////////////////////////////////// */ - -static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, size_t datasize) -{ - /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte, - 2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/ - - size_t i, j, numdeflateblocks = (datasize + 65534) / 65535; - unsigned datapos = 0; - for(i = 0; i < numdeflateblocks; i++) - { - unsigned BFINAL, BTYPE, LEN, NLEN; - unsigned char firstbyte; - - BFINAL = (i == numdeflateblocks - 1); - BTYPE = 0; - - firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1) << 1) + ((BTYPE & 2) << 1)); - ucvector_push_back(out, firstbyte); - - LEN = 65535; - if(datasize - datapos < 65535) LEN = (unsigned)datasize - datapos; - NLEN = 65535 - LEN; - - ucvector_push_back(out, (unsigned char)(LEN % 256)); - ucvector_push_back(out, (unsigned char)(LEN / 256)); - ucvector_push_back(out, (unsigned char)(NLEN % 256)); - ucvector_push_back(out, (unsigned char)(NLEN / 256)); - - /*Decompressed data*/ - for(j = 0; j < 65535 && datapos < datasize; j++) - { - ucvector_push_back(out, data[datapos++]); - } - } - - return 0; -} - -/* -write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees. -tree_ll: the tree for lit and len codes. -tree_d: the tree for distance codes. -*/ -static void writeLZ77data(size_t* bp, ucvector* out, const uivector* lz77_encoded, - const HuffmanTree* tree_ll, const HuffmanTree* tree_d) -{ - size_t i = 0; - for(i = 0; i < lz77_encoded->size; i++) - { - unsigned val = lz77_encoded->data[i]; - addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_ll, val), HuffmanTree_getLength(tree_ll, val)); - if(val > 256) /*for a length code, 3 more things have to be added*/ - { - unsigned length_index = val - FIRST_LENGTH_CODE_INDEX; - unsigned n_length_extra_bits = LENGTHEXTRA[length_index]; - unsigned length_extra_bits = lz77_encoded->data[++i]; - - unsigned distance_code = lz77_encoded->data[++i]; - - unsigned distance_index = distance_code; - unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index]; - unsigned distance_extra_bits = lz77_encoded->data[++i]; - - addBitsToStream(bp, out, length_extra_bits, n_length_extra_bits); - addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_d, distance_code), - HuffmanTree_getLength(tree_d, distance_code)); - addBitsToStream(bp, out, distance_extra_bits, n_distance_extra_bits); - } - } -} - -/*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/ -static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, - const unsigned char* data, size_t datapos, size_t dataend, - const LodePNGCompressSettings* settings, int final) -{ - unsigned error = 0; - - /* - A block is compressed as follows: The PNG data is lz77 encoded, resulting in - literal bytes and length/distance pairs. This is then huffman compressed with - two huffman trees. One huffman tree is used for the lit and len values ("ll"), - another huffman tree is used for the dist values ("d"). These two trees are - stored using their code lengths, and to compress even more these code lengths - are also run-length encoded and huffman compressed. This gives a huffman tree - of code lengths "cl". The code lenghts used to describe this third tree are - the code length code lengths ("clcl"). - */ - - /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/ - uivector lz77_encoded; - HuffmanTree tree_ll; /*tree for lit,len values*/ - HuffmanTree tree_d; /*tree for distance codes*/ - HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/ - uivector frequencies_ll; /*frequency of lit,len codes*/ - uivector frequencies_d; /*frequency of dist codes*/ - uivector frequencies_cl; /*frequency of code length codes*/ - uivector bitlen_lld; /*lit,len,dist code lenghts (int bits), literally (without repeat codes).*/ - uivector bitlen_lld_e; /*bitlen_lld encoded with repeat codes (this is a rudemtary run length compression)*/ - /*bitlen_cl is the code length code lengths ("clcl"). The bit lengths of codes to represent tree_cl - (these are written as is in the file, it would be crazy to compress these using yet another huffman - tree that needs to be represented by yet another set of code lengths)*/ - uivector bitlen_cl; - size_t datasize = dataend - datapos; - - /* - Due to the huffman compression of huffman tree representations ("two levels"), there are some anologies: - bitlen_lld is to tree_cl what data is to tree_ll and tree_d. - bitlen_lld_e is to bitlen_lld what lz77_encoded is to data. - bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded. - */ - - unsigned BFINAL = final; - size_t numcodes_ll, numcodes_d, i; - unsigned HLIT, HDIST, HCLEN; - - uivector_init(&lz77_encoded); - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - HuffmanTree_init(&tree_cl); - uivector_init(&frequencies_ll); - uivector_init(&frequencies_d); - uivector_init(&frequencies_cl); - uivector_init(&bitlen_lld); - uivector_init(&bitlen_lld_e); - uivector_init(&bitlen_cl); - - /*This while loop never loops due to a break at the end, it is here to - allow breaking out of it to the cleanup phase on error conditions.*/ - while(!error) - { - if(settings->use_lz77) - { - error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, - settings->minmatch, settings->nicematch, settings->lazymatching); - if(error) break; - } - else - { - if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/); - for(i = datapos; i < dataend; i++) lz77_encoded.data[i] = data[i]; /*no LZ77, but still will be Huffman compressed*/ - } - - if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83 /*alloc fail*/); - if(!uivector_resizev(&frequencies_d, 30, 0)) ERROR_BREAK(83 /*alloc fail*/); - - /*Count the frequencies of lit, len and dist codes*/ - for(i = 0; i < lz77_encoded.size; i++) - { - unsigned symbol = lz77_encoded.data[i]; - frequencies_ll.data[symbol]++; - if(symbol > 256) - { - unsigned dist = lz77_encoded.data[i + 2]; - frequencies_d.data[dist]++; - i += 3; - } - } - frequencies_ll.data[256] = 1; /*there will be exactly 1 end code, at the end of the block*/ - - /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/ - error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll.data, 257, frequencies_ll.size, 15); - if(error) break; - /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/ - error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d.data, 2, frequencies_d.size, 15); - if(error) break; - - numcodes_ll = tree_ll.numcodes; if(numcodes_ll > 286) numcodes_ll = 286; - numcodes_d = tree_d.numcodes; if(numcodes_d > 30) numcodes_d = 30; - /*store the code lengths of both generated trees in bitlen_lld*/ - for(i = 0; i < numcodes_ll; i++) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_ll, (unsigned)i)); - for(i = 0; i < numcodes_d; i++) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_d, (unsigned)i)); - - /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times), - 17 (3-10 zeroes), 18 (11-138 zeroes)*/ - for(i = 0; i < (unsigned)bitlen_lld.size; i++) - { - unsigned j = 0; /*amount of repititions*/ - while(i + j + 1 < (unsigned)bitlen_lld.size && bitlen_lld.data[i + j + 1] == bitlen_lld.data[i]) j++; - - if(bitlen_lld.data[i] == 0 && j >= 2) /*repeat code for zeroes*/ - { - j++; /*include the first zero*/ - if(j <= 10) /*repeat code 17 supports max 10 zeroes*/ - { - uivector_push_back(&bitlen_lld_e, 17); - uivector_push_back(&bitlen_lld_e, j - 3); - } - else /*repeat code 18 supports max 138 zeroes*/ - { - if(j > 138) j = 138; - uivector_push_back(&bitlen_lld_e, 18); - uivector_push_back(&bitlen_lld_e, j - 11); - } - i += (j - 1); - } - else if(j >= 3) /*repeat code for value other than zero*/ - { - size_t k; - unsigned num = j / 6, rest = j % 6; - uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); - for(k = 0; k < num; k++) - { - uivector_push_back(&bitlen_lld_e, 16); - uivector_push_back(&bitlen_lld_e, 6 - 3); - } - if(rest >= 3) - { - uivector_push_back(&bitlen_lld_e, 16); - uivector_push_back(&bitlen_lld_e, rest - 3); - } - else j -= rest; - i += j; - } - else /*too short to benefit from repeat code*/ - { - uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); - } - } - - /*generate tree_cl, the huffmantree of huffmantrees*/ - - if(!uivector_resizev(&frequencies_cl, NUM_CODE_LENGTH_CODES, 0)) ERROR_BREAK(83 /*alloc fail*/); - for(i = 0; i < bitlen_lld_e.size; i++) - { - frequencies_cl.data[bitlen_lld_e.data[i]]++; - /*after a repeat code come the bits that specify the number of repetitions, - those don't need to be in the frequencies_cl calculation*/ - if(bitlen_lld_e.data[i] >= 16) i++; - } - - error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl.data, - frequencies_cl.size, frequencies_cl.size, 7); - if(error) break; - - if(!uivector_resize(&bitlen_cl, tree_cl.numcodes)) ERROR_BREAK(83 /*alloc fail*/); - for(i = 0; i < tree_cl.numcodes; i++) - { - /*lenghts of code length tree is in the order as specified by deflate*/ - bitlen_cl.data[i] = HuffmanTree_getLength(&tree_cl, CLCL_ORDER[i]); - } - while(bitlen_cl.data[bitlen_cl.size - 1] == 0 && bitlen_cl.size > 4) - { - /*remove zeros at the end, but minimum size must be 4*/ - if(!uivector_resize(&bitlen_cl, bitlen_cl.size - 1)) ERROR_BREAK(83 /*alloc fail*/); - } - if(error) break; - - /* - Write everything into the output - - After the BFINAL and BTYPE, the dynamic block consists out of the following: - - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN - - (HCLEN+4)*3 bits code lengths of code length alphabet - - HLIT + 257 code lenghts of lit/length alphabet (encoded using the code length - alphabet, + possible repetition codes 16, 17, 18) - - HDIST + 1 code lengths of distance alphabet (encoded using the code length - alphabet, + possible repetition codes 16, 17, 18) - - compressed data - - 256 (end code) - */ - - /*Write block type*/ - addBitToStream(bp, out, BFINAL); - addBitToStream(bp, out, 0); /*first bit of BTYPE "dynamic"*/ - addBitToStream(bp, out, 1); /*second bit of BTYPE "dynamic"*/ - - /*write the HLIT, HDIST and HCLEN values*/ - HLIT = (unsigned)(numcodes_ll - 257); - HDIST = (unsigned)(numcodes_d - 1); - HCLEN = (unsigned)bitlen_cl.size - 4; - /*trim zeroes for HCLEN. HLIT and HDIST were already trimmed at tree creation*/ - while(!bitlen_cl.data[HCLEN + 4 - 1] && HCLEN > 0) HCLEN--; - addBitsToStream(bp, out, HLIT, 5); - addBitsToStream(bp, out, HDIST, 5); - addBitsToStream(bp, out, HCLEN, 4); - - /*write the code lenghts of the code length alphabet*/ - for(i = 0; i < HCLEN + 4; i++) addBitsToStream(bp, out, bitlen_cl.data[i], 3); - - /*write the lenghts of the lit/len AND the dist alphabet*/ - for(i = 0; i < bitlen_lld_e.size; i++) - { - addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_cl, bitlen_lld_e.data[i]), - HuffmanTree_getLength(&tree_cl, bitlen_lld_e.data[i])); - /*extra bits of repeat codes*/ - if(bitlen_lld_e.data[i] == 16) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 2); - else if(bitlen_lld_e.data[i] == 17) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 3); - else if(bitlen_lld_e.data[i] == 18) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 7); - } - - /*write the compressed data symbols*/ - writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d); - /*error: the length of the end code 256 must be larger than 0*/ - if(HuffmanTree_getLength(&tree_ll, 256) == 0) ERROR_BREAK(64); - - /*write the end code*/ - addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256)); - - break; /*end of error-while*/ - } - - /*cleanup*/ - uivector_cleanup(&lz77_encoded); - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - HuffmanTree_cleanup(&tree_cl); - uivector_cleanup(&frequencies_ll); - uivector_cleanup(&frequencies_d); - uivector_cleanup(&frequencies_cl); - uivector_cleanup(&bitlen_lld_e); - uivector_cleanup(&bitlen_lld); - uivector_cleanup(&bitlen_cl); - - return error; -} - -static unsigned deflateFixed(ucvector* out, size_t* bp, Hash* hash, - const unsigned char* data, - size_t datapos, size_t dataend, - const LodePNGCompressSettings* settings, int final) -{ - HuffmanTree tree_ll; /*tree for literal values and length codes*/ - HuffmanTree tree_d; /*tree for distance codes*/ - - unsigned BFINAL = final; - unsigned error = 0; - size_t i; - - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - - generateFixedLitLenTree(&tree_ll); - generateFixedDistanceTree(&tree_d); - - addBitToStream(bp, out, BFINAL); - addBitToStream(bp, out, 1); /*first bit of BTYPE*/ - addBitToStream(bp, out, 0); /*second bit of BTYPE*/ - - if(settings->use_lz77) /*LZ77 encoded*/ - { - uivector lz77_encoded; - uivector_init(&lz77_encoded); - error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, - settings->minmatch, settings->nicematch, settings->lazymatching); - if(!error) writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d); - uivector_cleanup(&lz77_encoded); - } - else /*no LZ77, but still will be Huffman compressed*/ - { - for(i = datapos; i < dataend; i++) - { - addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, data[i]), HuffmanTree_getLength(&tree_ll, data[i])); - } - } - /*add END code*/ - if(!error) addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256)); - - /*cleanup*/ - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - - return error; -} - -static unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings) -{ - unsigned error = 0; - size_t i, blocksize, numdeflateblocks; - size_t bp = 0; /*the bit pointer*/ - Hash hash; - - if(settings->btype > 2) return 61; - else if(settings->btype == 0) return deflateNoCompression(out, in, insize); - else if(settings->btype == 1) blocksize = insize; - else /*if(settings->btype == 2)*/ - { - blocksize = insize / 8 + 8; - if(blocksize < 65535) blocksize = 65535; - } - - numdeflateblocks = (insize + blocksize - 1) / blocksize; - if(numdeflateblocks == 0) numdeflateblocks = 1; - - error = hash_init(&hash, settings->windowsize); - if(error) return error; - - for(i = 0; i < numdeflateblocks && !error; i++) - { - int final = i == numdeflateblocks - 1; - size_t start = i * blocksize; - size_t end = start + blocksize; - if(end > insize) end = insize; - - if(settings->btype == 1) error = deflateFixed(out, &bp, &hash, in, start, end, settings, final); - else if(settings->btype == 2) error = deflateDynamic(out, &bp, &hash, in, start, end, settings, final); - } - - hash_cleanup(&hash); - - return error; -} - -unsigned lodepng_deflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings) -{ - unsigned error; - ucvector v; - ucvector_init_buffer(&v, *out, *outsize); - error = lodepng_deflatev(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - return error; -} - -static unsigned deflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings) -{ - if(settings->custom_deflate) - { - return settings->custom_deflate(out, outsize, in, insize, settings); - } - else - { - return lodepng_deflate(out, outsize, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Adler32 */ -/* ////////////////////////////////////////////////////////////////////////// */ - -static unsigned update_adler32(unsigned adler, const unsigned char* data, unsigned len) -{ - unsigned s1 = adler & 0xffff; - unsigned s2 = (adler >> 16) & 0xffff; - - while(len > 0) - { - /*at least 5550 sums can be done before the sums overflow, saving a lot of module divisions*/ - unsigned amount = len > 5550 ? 5550 : len; - len -= amount; - while(amount > 0) - { - s1 += (*data++); - s2 += s1; - amount--; - } - s1 %= 65521; - s2 %= 65521; - } - - return (s2 << 16) | s1; -} - -/*Return the adler32 of the bytes data[0..len-1]*/ -static unsigned adler32(const unsigned char* data, unsigned len) -{ - return update_adler32(1L, data, len); -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Zlib / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_DECODER - -unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGDecompressSettings* settings) -{ - unsigned error = 0; - unsigned CM, CINFO, FDICT; - - if(insize < 2) return 53; /*error, size of zlib data too small*/ - /*read information from zlib header*/ - if((in[0] * 256 + in[1]) % 31 != 0) - { - /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/ - return 24; - } - - CM = in[0] & 15; - CINFO = (in[0] >> 4) & 15; - /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/ - FDICT = (in[1] >> 5) & 1; - /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/ - - if(CM != 8 || CINFO > 7) - { - /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/ - return 25; - } - if(FDICT != 0) - { - /*error: the specification of PNG says about the zlib stream: - "The additional flags shall not specify a preset dictionary."*/ - return 26; - } - - error = inflate(out, outsize, in + 2, insize - 2, settings); - if(error) return error; - - if(!settings->ignore_adler32) - { - unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]); - unsigned checksum = adler32(*out, (unsigned)(*outsize)); - if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/ - } - - return 0; /*no error*/ -} - -static unsigned zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGDecompressSettings* settings) -{ - if(settings->custom_zlib) - { - return settings->custom_zlib(out, outsize, in, insize, settings); - } - else - { - return lodepng_zlib_decompress(out, outsize, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER - -unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGCompressSettings* settings) -{ - /*initially, *out must be NULL and outsize 0, if you just give some random *out - that's pointing to a non allocated buffer, this'll crash*/ - ucvector outv; - size_t i; - unsigned error; - unsigned char* deflatedata = 0; - size_t deflatesize = 0; - - unsigned ADLER32; - /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/ - unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/ - unsigned FLEVEL = 0; - unsigned FDICT = 0; - unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64; - unsigned FCHECK = 31 - CMFFLG % 31; - CMFFLG += FCHECK; - - /*ucvector-controlled version of the output buffer, for dynamic array*/ - ucvector_init_buffer(&outv, *out, *outsize); - - ucvector_push_back(&outv, (unsigned char)(CMFFLG / 256)); - ucvector_push_back(&outv, (unsigned char)(CMFFLG % 256)); - - error = deflate(&deflatedata, &deflatesize, in, insize, settings); - - if(!error) - { - ADLER32 = adler32(in, (unsigned)insize); - for(i = 0; i < deflatesize; i++) ucvector_push_back(&outv, deflatedata[i]); - lodepng_free(deflatedata); - lodepng_add32bitInt(&outv, ADLER32); - } - - *out = outv.data; - *outsize = outv.size; - - return error; -} - -/* compress using the default or custom zlib function */ -static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGCompressSettings* settings) -{ - if(settings->custom_zlib) - { - return settings->custom_zlib(out, outsize, in, insize, settings); - } - else - { - return lodepng_zlib_compress(out, outsize, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#else /*no LODEPNG_COMPILE_ZLIB*/ - -#ifdef LODEPNG_COMPILE_DECODER -static unsigned zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGDecompressSettings* settings) -{ - if (!settings->custom_zlib) return 87; /*no custom zlib function provided */ - return settings->custom_zlib(out, outsize, in, insize, settings); -} -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER -static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGCompressSettings* settings) -{ - if (!settings->custom_zlib) return 87; /*no custom zlib function provided */ - return settings->custom_zlib(out, outsize, in, insize, settings); -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#endif /*LODEPNG_COMPILE_ZLIB*/ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_ENCODER - -/*this is a good tradeoff between speed and compression ratio*/ -#define DEFAULT_WINDOWSIZE 2048 - -void lodepng_compress_settings_init(LodePNGCompressSettings* settings) -{ - /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/ - settings->btype = 2; - settings->use_lz77 = 1; - settings->windowsize = DEFAULT_WINDOWSIZE; - settings->minmatch = 3; - settings->nicematch = 128; - settings->lazymatching = 1; - - settings->custom_zlib = 0; - settings->custom_deflate = 0; - settings->custom_context = 0; -} - -const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0}; - - -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings) -{ - settings->ignore_adler32 = 0; - - settings->custom_zlib = 0; - settings->custom_inflate = 0; - settings->custom_context = 0; -} - -const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0}; - -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // End of Zlib related code. Begin of PNG related code. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_PNG - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / CRC32 / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/* CRC polynomial: 0xedb88320 */ -static unsigned lodepng_crc32_table[256] = { - 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u, - 249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u, - 498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u, - 325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u, - 997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u, - 901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u, - 651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u, - 671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u, - 1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u, - 2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u, - 1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u, - 1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u, - 1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u, - 1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u, - 1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u, - 1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u, - 3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u, - 3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u, - 4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u, - 4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u, - 3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u, - 3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u, - 3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u, - 3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u, - 2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u, - 2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u, - 2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u, - 2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u, - 2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u, - 2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u, - 3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u, - 3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u -}; - -/*Return the CRC of the bytes buf[0..len-1].*/ -unsigned lodepng_crc32(const unsigned char* buf, size_t len) -{ - unsigned c = 0xffffffffL; - size_t n; - - for(n = 0; n < len; n++) - { - c = lodepng_crc32_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); - } - return c ^ 0xffffffffL; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Reading and writing single bits and bytes from/to stream for LodePNG / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream) -{ - unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1); - (*bitpointer)++; - return result; -} - -static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) -{ - unsigned result = 0; - size_t i; - for(i = nbits - 1; i < nbits; i--) - { - result += (unsigned)readBitFromReversedStream(bitpointer, bitstream) << i; - } - return result; -} - -#ifdef LODEPNG_COMPILE_DECODER -static void setBitOfReversedStream0(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) -{ - /*the current bit in bitstream must be 0 for this to work*/ - if(bit) - { - /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/ - bitstream[(*bitpointer) >> 3] |= (bit << (7 - ((*bitpointer) & 0x7))); - } - (*bitpointer)++; -} -#endif /*LODEPNG_COMPILE_DECODER*/ - -static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) -{ - /*the current bit in bitstream may be 0 or 1 for this to work*/ - if(bit == 0) bitstream[(*bitpointer) >> 3] &= (unsigned char)(~(1 << (7 - ((*bitpointer) & 0x7)))); - else bitstream[(*bitpointer) >> 3] |= (1 << (7 - ((*bitpointer) & 0x7))); - (*bitpointer)++; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG chunks / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -unsigned lodepng_chunk_length(const unsigned char* chunk) -{ - return lodepng_read32bitInt(&chunk[0]); -} - -void lodepng_chunk_type(char type[5], const unsigned char* chunk) -{ - unsigned i; - for(i = 0; i < 4; i++) type[i] = chunk[4 + i]; - type[4] = 0; /*null termination char*/ -} - -unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type) -{ - if(strlen(type) != 4) return 0; - return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]); -} - -unsigned char lodepng_chunk_ancillary(const unsigned char* chunk) -{ - return((chunk[4] & 32) != 0); -} - -unsigned char lodepng_chunk_private(const unsigned char* chunk) -{ - return((chunk[6] & 32) != 0); -} - -unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk) -{ - return((chunk[7] & 32) != 0); -} - -unsigned char* lodepng_chunk_data(unsigned char* chunk) -{ - return &chunk[8]; -} - -const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk) -{ - return &chunk[8]; -} - -unsigned lodepng_chunk_check_crc(const unsigned char* chunk) -{ - unsigned length = lodepng_chunk_length(chunk); - unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]); - /*the CRC is taken of the data and the 4 chunk type letters, not the length*/ - unsigned checksum = lodepng_crc32(&chunk[4], length + 4); - if(CRC != checksum) return 1; - else return 0; -} - -void lodepng_chunk_generate_crc(unsigned char* chunk) -{ - unsigned length = lodepng_chunk_length(chunk); - unsigned CRC = lodepng_crc32(&chunk[4], length + 4); - lodepng_set32bitInt(chunk + 8 + length, CRC); -} - -unsigned char* lodepng_chunk_next(unsigned char* chunk) -{ - unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; - return &chunk[total_chunk_length]; -} - -const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk) -{ - unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; - return &chunk[total_chunk_length]; -} - -unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk) -{ - unsigned i; - unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; - unsigned char *chunk_start, *new_buffer; - size_t new_length = (*outlength) + total_chunk_length; - if(new_length < total_chunk_length || new_length < (*outlength)) return 77; /*integer overflow happened*/ - - new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); - if(!new_buffer) return 83; /*alloc fail*/ - (*out) = new_buffer; - (*outlength) = new_length; - chunk_start = &(*out)[new_length - total_chunk_length]; - - for(i = 0; i < total_chunk_length; i++) chunk_start[i] = chunk[i]; - - return 0; -} - -unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, - const char* type, const unsigned char* data) -{ - unsigned i; - unsigned char *chunk, *new_buffer; - size_t new_length = (*outlength) + length + 12; - if(new_length < length + 12 || new_length < (*outlength)) return 77; /*integer overflow happened*/ - new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); - if(!new_buffer) return 83; /*alloc fail*/ - (*out) = new_buffer; - (*outlength) = new_length; - chunk = &(*out)[(*outlength) - length - 12]; - - /*1: length*/ - lodepng_set32bitInt(chunk, (unsigned)length); - - /*2: chunk name (4 letters)*/ - chunk[4] = type[0]; - chunk[5] = type[1]; - chunk[6] = type[2]; - chunk[7] = type[3]; - - /*3: the data*/ - for(i = 0; i < length; i++) chunk[8 + i] = data[i]; - - /*4: CRC (of the chunkname characters and the data)*/ - lodepng_chunk_generate_crc(chunk); - - return 0; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Color types and such / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*return type is a LodePNG error code*/ -static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) /*bd = bitdepth*/ -{ - switch(colortype) - { - case 0: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break; /*grey*/ - case 2: if(!( bd == 8 || bd == 16)) return 37; break; /*RGB*/ - case 3: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 )) return 37; break; /*palette*/ - case 4: if(!( bd == 8 || bd == 16)) return 37; break; /*grey + alpha*/ - case 6: if(!( bd == 8 || bd == 16)) return 37; break; /*RGBA*/ - default: return 31; - } - return 0; /*allowed color type / bits combination*/ -} - -static unsigned getNumColorChannels(LodePNGColorType colortype) -{ - switch(colortype) - { - case 0: return 1; /*grey*/ - case 2: return 3; /*RGB*/ - case 3: return 1; /*palette*/ - case 4: return 2; /*grey + alpha*/ - case 6: return 4; /*RGBA*/ - } - return 0; /*unexisting color type*/ -} - -static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) -{ - /*bits per pixel is amount of channels * bits per channel*/ - return getNumColorChannels(colortype) * bitdepth; -} - -/* ////////////////////////////////////////////////////////////////////////// */ - -void lodepng_color_mode_init(LodePNGColorMode* info) -{ - info->key_defined = 0; - info->key_r = info->key_g = info->key_b = 0; - info->colortype = LCT_RGBA; - info->bitdepth = 8; - info->palette = 0; - info->palettesize = 0; -} - -void lodepng_color_mode_cleanup(LodePNGColorMode* info) -{ - lodepng_palette_clear(info); -} - -unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source) -{ - size_t i; - lodepng_color_mode_cleanup(dest); - *dest = *source; - if(source->palette) - { - dest->palette = (unsigned char*)lodepng_malloc(1024); - if(!dest->palette && source->palettesize) return 83; /*alloc fail*/ - for(i = 0; i < source->palettesize * 4; i++) dest->palette[i] = source->palette[i]; - } - return 0; -} - -static int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColorMode* b) -{ - size_t i; - if(a->colortype != b->colortype) return 0; - if(a->bitdepth != b->bitdepth) return 0; - if(a->key_defined != b->key_defined) return 0; - if(a->key_defined) - { - if(a->key_r != b->key_r) return 0; - if(a->key_g != b->key_g) return 0; - if(a->key_b != b->key_b) return 0; - } - if(a->palettesize != b->palettesize) return 0; - for(i = 0; i < a->palettesize * 4; i++) - { - if(a->palette[i] != b->palette[i]) return 0; - } - return 1; -} - -void lodepng_palette_clear(LodePNGColorMode* info) -{ - if(info->palette) lodepng_free(info->palette); - info->palette = 0; - info->palettesize = 0; -} - -unsigned lodepng_palette_add(LodePNGColorMode* info, - unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - unsigned char* data; - /*the same resize technique as C++ std::vectors is used, and here it's made so that for a palette with - the max of 256 colors, it'll have the exact alloc size*/ - if(!info->palette) /*allocate palette if empty*/ - { - /*room for 256 colors with 4 bytes each*/ - data = (unsigned char*)lodepng_realloc(info->palette, 1024); - if(!data) return 83; /*alloc fail*/ - else info->palette = data; - } - info->palette[4 * info->palettesize + 0] = r; - info->palette[4 * info->palettesize + 1] = g; - info->palette[4 * info->palettesize + 2] = b; - info->palette[4 * info->palettesize + 3] = a; - info->palettesize++; - return 0; -} - -unsigned lodepng_get_bpp(const LodePNGColorMode* info) -{ - /*calculate bits per pixel out of colortype and bitdepth*/ - return lodepng_get_bpp_lct(info->colortype, info->bitdepth); -} - -unsigned lodepng_get_channels(const LodePNGColorMode* info) -{ - return getNumColorChannels(info->colortype); -} - -unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info) -{ - return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA; -} - -unsigned lodepng_is_alpha_type(const LodePNGColorMode* info) -{ - return (info->colortype & 4) != 0; /*4 or 6*/ -} - -unsigned lodepng_is_palette_type(const LodePNGColorMode* info) -{ - return info->colortype == LCT_PALETTE; -} - -unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info) -{ - size_t i; - for(i = 0; i < info->palettesize; i++) - { - if(info->palette[i * 4 + 3] < 255) return 1; - } - return 0; -} - -unsigned lodepng_can_have_alpha(const LodePNGColorMode* info) -{ - return info->key_defined - || lodepng_is_alpha_type(info) - || lodepng_has_palette_alpha(info); -} - -size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color) -{ - return (w * h * lodepng_get_bpp(color) + 7) / 8; -} - -size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) -{ - return (w * h * lodepng_get_bpp_lct(colortype, bitdepth) + 7) / 8; -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - -static void LodePNGUnknownChunks_init(LodePNGInfo* info) -{ - unsigned i; - for(i = 0; i < 3; i++) info->unknown_chunks_data[i] = 0; - for(i = 0; i < 3; i++) info->unknown_chunks_size[i] = 0; -} - -static void LodePNGUnknownChunks_cleanup(LodePNGInfo* info) -{ - unsigned i; - for(i = 0; i < 3; i++) lodepng_free(info->unknown_chunks_data[i]); -} - -static unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* src) -{ - unsigned i; - - LodePNGUnknownChunks_cleanup(dest); - - for(i = 0; i < 3; i++) - { - size_t j; - dest->unknown_chunks_size[i] = src->unknown_chunks_size[i]; - dest->unknown_chunks_data[i] = (unsigned char*)lodepng_malloc(src->unknown_chunks_size[i]); - if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/ - for(j = 0; j < src->unknown_chunks_size[i]; j++) - { - dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j]; - } - } - - return 0; -} - -/******************************************************************************/ - -static void LodePNGText_init(LodePNGInfo* info) -{ - info->text_num = 0; - info->text_keys = NULL; - info->text_strings = NULL; -} - -static void LodePNGText_cleanup(LodePNGInfo* info) -{ - size_t i; - for(i = 0; i < info->text_num; i++) - { - string_cleanup(&info->text_keys[i]); - string_cleanup(&info->text_strings[i]); - } - lodepng_free(info->text_keys); - lodepng_free(info->text_strings); -} - -static unsigned LodePNGText_copy(LodePNGInfo* dest, const LodePNGInfo* source) -{ - size_t i = 0; - dest->text_keys = 0; - dest->text_strings = 0; - dest->text_num = 0; - for(i = 0; i < source->text_num; i++) - { - CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i])); - } - return 0; -} - -void lodepng_clear_text(LodePNGInfo* info) -{ - LodePNGText_cleanup(info); -} - -unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str) -{ - char** new_keys = (char**)(lodepng_realloc(info->text_keys, sizeof(char*) * (info->text_num + 1))); - char** new_strings = (char**)(lodepng_realloc(info->text_strings, sizeof(char*) * (info->text_num + 1))); - if(!new_keys || !new_strings) - { - lodepng_free(new_keys); - lodepng_free(new_strings); - return 83; /*alloc fail*/ - } - - info->text_num++; - info->text_keys = new_keys; - info->text_strings = new_strings; - - string_init(&info->text_keys[info->text_num - 1]); - string_set(&info->text_keys[info->text_num - 1], key); - - string_init(&info->text_strings[info->text_num - 1]); - string_set(&info->text_strings[info->text_num - 1], str); - - return 0; -} - -/******************************************************************************/ - -static void LodePNGIText_init(LodePNGInfo* info) -{ - info->itext_num = 0; - info->itext_keys = NULL; - info->itext_langtags = NULL; - info->itext_transkeys = NULL; - info->itext_strings = NULL; -} - -static void LodePNGIText_cleanup(LodePNGInfo* info) -{ - size_t i; - for(i = 0; i < info->itext_num; i++) - { - string_cleanup(&info->itext_keys[i]); - string_cleanup(&info->itext_langtags[i]); - string_cleanup(&info->itext_transkeys[i]); - string_cleanup(&info->itext_strings[i]); - } - lodepng_free(info->itext_keys); - lodepng_free(info->itext_langtags); - lodepng_free(info->itext_transkeys); - lodepng_free(info->itext_strings); -} - -static unsigned LodePNGIText_copy(LodePNGInfo* dest, const LodePNGInfo* source) -{ - size_t i = 0; - dest->itext_keys = 0; - dest->itext_langtags = 0; - dest->itext_transkeys = 0; - dest->itext_strings = 0; - dest->itext_num = 0; - for(i = 0; i < source->itext_num; i++) - { - CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i], - source->itext_transkeys[i], source->itext_strings[i])); - } - return 0; -} - -void lodepng_clear_itext(LodePNGInfo* info) -{ - LodePNGIText_cleanup(info); -} - -unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, - const char* transkey, const char* str) -{ - char** new_keys = (char**)(lodepng_realloc(info->itext_keys, sizeof(char*) * (info->itext_num + 1))); - char** new_langtags = (char**)(lodepng_realloc(info->itext_langtags, sizeof(char*) * (info->itext_num + 1))); - char** new_transkeys = (char**)(lodepng_realloc(info->itext_transkeys, sizeof(char*) * (info->itext_num + 1))); - char** new_strings = (char**)(lodepng_realloc(info->itext_strings, sizeof(char*) * (info->itext_num + 1))); - if(!new_keys || !new_langtags || !new_transkeys || !new_strings) - { - lodepng_free(new_keys); - lodepng_free(new_langtags); - lodepng_free(new_transkeys); - lodepng_free(new_strings); - return 83; /*alloc fail*/ - } - - info->itext_num++; - info->itext_keys = new_keys; - info->itext_langtags = new_langtags; - info->itext_transkeys = new_transkeys; - info->itext_strings = new_strings; - - string_init(&info->itext_keys[info->itext_num - 1]); - string_set(&info->itext_keys[info->itext_num - 1], key); - - string_init(&info->itext_langtags[info->itext_num - 1]); - string_set(&info->itext_langtags[info->itext_num - 1], langtag); - - string_init(&info->itext_transkeys[info->itext_num - 1]); - string_set(&info->itext_transkeys[info->itext_num - 1], transkey); - - string_init(&info->itext_strings[info->itext_num - 1]); - string_set(&info->itext_strings[info->itext_num - 1], str); - - return 0; -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -void lodepng_info_init(LodePNGInfo* info) -{ - lodepng_color_mode_init(&info->color); - info->interlace_method = 0; - info->compression_method = 0; - info->filter_method = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - info->background_defined = 0; - info->background_r = info->background_g = info->background_b = 0; - - LodePNGText_init(info); - LodePNGIText_init(info); - - info->time_defined = 0; - info->phys_defined = 0; - - LodePNGUnknownChunks_init(info); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -void lodepng_info_cleanup(LodePNGInfo* info) -{ - lodepng_color_mode_cleanup(&info->color); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - LodePNGText_cleanup(info); - LodePNGIText_cleanup(info); - - LodePNGUnknownChunks_cleanup(info); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source) -{ - lodepng_info_cleanup(dest); - *dest = *source; - lodepng_color_mode_init(&dest->color); - CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color)); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - CERROR_TRY_RETURN(LodePNGText_copy(dest, source)); - CERROR_TRY_RETURN(LodePNGIText_copy(dest, source)); - - LodePNGUnknownChunks_init(dest); - CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source)); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - return 0; -} - -void lodepng_info_swap(LodePNGInfo* a, LodePNGInfo* b) -{ - LodePNGInfo temp = *a; - *a = *b; - *b = temp; -} - -/* ////////////////////////////////////////////////////////////////////////// */ - -/*index: bitgroup index, bits: bitgroup size(1, 2 or 4), in: bitgroup value, out: octet array to add bits to*/ -static void addColorBits(unsigned char* out, size_t index, unsigned bits, unsigned in) -{ - unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/ - /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/ - unsigned p = index & m; - in &= (1 << bits) - 1; /*filter out any other bits of the input value*/ - in = in << (bits * (m - p)); - if(p == 0) out[index * bits / 8] = in; - else out[index * bits / 8] |= in; -} - -typedef struct ColorTree ColorTree; - -/* -One node of a color tree -This is the data structure used to count the number of unique colors and to get a palette -index for a color. It's like an octree, but because the alpha channel is used too, each -node has 16 instead of 8 children. -*/ -struct ColorTree -{ - ColorTree* children[16]; /*up to 16 pointers to ColorTree of next level*/ - int index; /*the payload. Only has a meaningful value if this is in the last level*/ -}; - -static void color_tree_init(ColorTree* tree) -{ - int i; - for(i = 0; i < 16; i++) tree->children[i] = 0; - tree->index = -1; -} - -static void color_tree_cleanup(ColorTree* tree) -{ - int i; - for(i = 0; i < 16; i++) - { - if(tree->children[i]) - { - color_tree_cleanup(tree->children[i]); - lodepng_free(tree->children[i]); - } - } -} - -/*returns -1 if color not present, its index otherwise*/ -static int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - int bit = 0; - for(bit = 0; bit < 8; bit++) - { - int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); - if(!tree->children[i]) return -1; - else tree = tree->children[i]; - } - return tree ? tree->index : -1; -} - -#ifdef LODEPNG_COMPILE_ENCODER -static int color_tree_has(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - return color_tree_get(tree, r, g, b, a) >= 0; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/*color is not allowed to already exist. -Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist")*/ -static void color_tree_add(ColorTree* tree, - unsigned char r, unsigned char g, unsigned char b, unsigned char a, int index) -{ - int bit; - for(bit = 0; bit < 8; bit++) - { - int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); - if(!tree->children[i]) - { - tree->children[i] = (ColorTree*)lodepng_malloc(sizeof(ColorTree)); - color_tree_init(tree->children[i]); - } - tree = tree->children[i]; - } - tree->index = index; -} - -/*put a pixel, given its RGBA color, into image of any color type*/ -static unsigned rgba8ToPixel(unsigned char* out, size_t i, - const LodePNGColorMode* mode, ColorTree* tree /*for palette*/, - unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - if(mode->colortype == LCT_GREY) - { - unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/; - if(mode->bitdepth == 8) out[i] = grey; - else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = grey; - else - { - /*take the most significant bits of grey*/ - grey = (grey >> (8 - mode->bitdepth)) & ((1 << mode->bitdepth) - 1); - addColorBits(out, i, mode->bitdepth, grey); - } - } - else if(mode->colortype == LCT_RGB) - { - if(mode->bitdepth == 8) - { - out[i * 3 + 0] = r; - out[i * 3 + 1] = g; - out[i * 3 + 2] = b; - } - else - { - out[i * 6 + 0] = out[i * 6 + 1] = r; - out[i * 6 + 2] = out[i * 6 + 3] = g; - out[i * 6 + 4] = out[i * 6 + 5] = b; - } - } - else if(mode->colortype == LCT_PALETTE) - { - int index = color_tree_get(tree, r, g, b, a); - if(index < 0) return 82; /*color not in palette*/ - if(mode->bitdepth == 8) out[i] = index; - else addColorBits(out, i, mode->bitdepth, index); - } - else if(mode->colortype == LCT_GREY_ALPHA) - { - unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/; - if(mode->bitdepth == 8) - { - out[i * 2 + 0] = grey; - out[i * 2 + 1] = a; - } - else if(mode->bitdepth == 16) - { - out[i * 4 + 0] = out[i * 4 + 1] = grey; - out[i * 4 + 2] = out[i * 4 + 3] = a; - } - } - else if(mode->colortype == LCT_RGBA) - { - if(mode->bitdepth == 8) - { - out[i * 4 + 0] = r; - out[i * 4 + 1] = g; - out[i * 4 + 2] = b; - out[i * 4 + 3] = a; - } - else - { - out[i * 8 + 0] = out[i * 8 + 1] = r; - out[i * 8 + 2] = out[i * 8 + 3] = g; - out[i * 8 + 4] = out[i * 8 + 5] = b; - out[i * 8 + 6] = out[i * 8 + 7] = a; - } - } - - return 0; /*no error*/ -} - -/*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/ -static unsigned rgba16ToPixel(unsigned char* out, size_t i, - const LodePNGColorMode* mode, - unsigned short r, unsigned short g, unsigned short b, unsigned short a) -{ - if(mode->bitdepth != 16) return 85; /*must be 16 for this function*/ - if(mode->colortype == LCT_GREY) - { - unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; - out[i * 2 + 0] = (grey >> 8) & 255; - out[i * 2 + 1] = grey & 255; - } - else if(mode->colortype == LCT_RGB) - { - out[i * 6 + 0] = (r >> 8) & 255; - out[i * 6 + 1] = r & 255; - out[i * 6 + 2] = (g >> 8) & 255; - out[i * 6 + 3] = g & 255; - out[i * 6 + 4] = (b >> 8) & 255; - out[i * 6 + 5] = b & 255; - } - else if(mode->colortype == LCT_GREY_ALPHA) - { - unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; - out[i * 4 + 0] = (grey >> 8) & 255; - out[i * 4 + 1] = grey & 255; - out[i * 4 + 2] = (a >> 8) & 255; - out[i * 4 + 3] = a & 255; - } - else if(mode->colortype == LCT_RGBA) - { - out[i * 8 + 0] = (r >> 8) & 255; - out[i * 8 + 1] = r & 255; - out[i * 8 + 2] = (g >> 8) & 255; - out[i * 8 + 3] = g & 255; - out[i * 8 + 4] = (b >> 8) & 255; - out[i * 8 + 5] = b & 255; - out[i * 8 + 6] = (a >> 8) & 255; - out[i * 8 + 7] = a & 255; - } - - return 0; /*no error*/ -} - -/*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/ -static unsigned getPixelColorRGBA8(unsigned char* r, unsigned char* g, - unsigned char* b, unsigned char* a, - const unsigned char* in, size_t i, - const LodePNGColorMode* mode, - unsigned fix_png) -{ - if(mode->colortype == LCT_GREY) - { - if(mode->bitdepth == 8) - { - *r = *g = *b = in[i]; - if(mode->key_defined && *r == mode->key_r) *a = 0; - else *a = 255; - } - else if(mode->bitdepth == 16) - { - *r = *g = *b = in[i * 2 + 0]; - if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; - else *a = 255; - } - else - { - unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ - size_t j = i * mode->bitdepth; - unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); - *r = *g = *b = (value * 255) / highest; - if(mode->key_defined && value == mode->key_r) *a = 0; - else *a = 255; - } - } - else if(mode->colortype == LCT_RGB) - { - if(mode->bitdepth == 8) - { - *r = in[i * 3 + 0]; *g = in[i * 3 + 1]; *b = in[i * 3 + 2]; - if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0; - else *a = 255; - } - else - { - *r = in[i * 6 + 0]; - *g = in[i * 6 + 2]; - *b = in[i * 6 + 4]; - if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; - else *a = 255; - } - } - else if(mode->colortype == LCT_PALETTE) - { - unsigned index; - if(mode->bitdepth == 8) index = in[i]; - else - { - size_t j = i * mode->bitdepth; - index = readBitsFromReversedStream(&j, in, mode->bitdepth); - } - - if(index >= mode->palettesize) - { - /*This is an error according to the PNG spec, but fix_png can ignore it*/ - if(!fix_png) return (mode->bitdepth == 8 ? 46 : 47); /*index out of palette*/ - *r = *g = *b = 0; - *a = 255; - } - else - { - *r = mode->palette[index * 4 + 0]; - *g = mode->palette[index * 4 + 1]; - *b = mode->palette[index * 4 + 2]; - *a = mode->palette[index * 4 + 3]; - } - } - else if(mode->colortype == LCT_GREY_ALPHA) - { - if(mode->bitdepth == 8) - { - *r = *g = *b = in[i * 2 + 0]; - *a = in[i * 2 + 1]; - } - else - { - *r = *g = *b = in[i * 4 + 0]; - *a = in[i * 4 + 2]; - } - } - else if(mode->colortype == LCT_RGBA) - { - if(mode->bitdepth == 8) - { - *r = in[i * 4 + 0]; - *g = in[i * 4 + 1]; - *b = in[i * 4 + 2]; - *a = in[i * 4 + 3]; - } - else - { - *r = in[i * 8 + 0]; - *g = in[i * 8 + 2]; - *b = in[i * 8 + 4]; - *a = in[i * 8 + 6]; - } - } - - return 0; /*no error*/ -} - -/*Similar to getPixelColorRGBA8, but with all the for loops inside of the color -mode test cases, optimized to convert the colors much faster, when converting -to RGBA or RGB with 8 bit per cannel. buffer must be RGBA or RGB output with -enough memory, if has_alpha is true the output is RGBA. mode has the color mode -of the input buffer.*/ -static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, - unsigned has_alpha, const unsigned char* in, - const LodePNGColorMode* mode, - unsigned fix_png) -{ - unsigned num_channels = has_alpha ? 4 : 3; - size_t i; - if(mode->colortype == LCT_GREY) - { - if(mode->bitdepth == 8) - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = buffer[1] = buffer[2] = in[i]; - if(has_alpha) buffer[3] = mode->key_defined && in[i] == mode->key_r ? 0 : 255; - } - } - else if(mode->bitdepth == 16) - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = buffer[1] = buffer[2] = in[i * 2]; - if(has_alpha) buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255; - } - } - else - { - unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ - size_t j = 0; - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); - buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; - if(has_alpha) buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255; - } - } - } - else if(mode->colortype == LCT_RGB) - { - if(mode->bitdepth == 8) - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = in[i * 3 + 0]; - buffer[1] = in[i * 3 + 1]; - buffer[2] = in[i * 3 + 2]; - if(has_alpha) buffer[3] = mode->key_defined && buffer[0] == mode->key_r - && buffer[1]== mode->key_g && buffer[2] == mode->key_b ? 0 : 255; - } - } - else - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = in[i * 6 + 0]; - buffer[1] = in[i * 6 + 2]; - buffer[2] = in[i * 6 + 4]; - if(has_alpha) buffer[3] = mode->key_defined - && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255; - } - } - } - else if(mode->colortype == LCT_PALETTE) - { - unsigned index; - size_t j = 0; - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - if(mode->bitdepth == 8) index = in[i]; - else index = readBitsFromReversedStream(&j, in, mode->bitdepth); - - if(index >= mode->palettesize) - { - /*This is an error according to the PNG spec, but fix_png can ignore it*/ - if(!fix_png) return (mode->bitdepth == 8 ? 46 : 47); /*index out of palette*/ - buffer[0] = buffer[1] = buffer[2] = 0; - if(has_alpha) buffer[3] = 255; - } - else - { - buffer[0] = mode->palette[index * 4 + 0]; - buffer[1] = mode->palette[index * 4 + 1]; - buffer[2] = mode->palette[index * 4 + 2]; - if(has_alpha) buffer[3] = mode->palette[index * 4 + 3]; - } - } - } - else if(mode->colortype == LCT_GREY_ALPHA) - { - if(mode->bitdepth == 8) - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; - if(has_alpha) buffer[3] = in[i * 2 + 1]; - } - } - else - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; - if(has_alpha) buffer[3] = in[i * 4 + 2]; - } - } - } - else if(mode->colortype == LCT_RGBA) - { - if(mode->bitdepth == 8) - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = in[i * 4 + 0]; - buffer[1] = in[i * 4 + 1]; - buffer[2] = in[i * 4 + 2]; - if(has_alpha) buffer[3] = in[i * 4 + 3]; - } - } - else - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = in[i * 8 + 0]; - buffer[1] = in[i * 8 + 2]; - buffer[2] = in[i * 8 + 4]; - if(has_alpha) buffer[3] = in[i * 8 + 6]; - } - } - } - - return 0; /*no error*/ -} - -/*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with -given color type, but the given color type must be 16-bit itself.*/ -static unsigned getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a, - const unsigned char* in, size_t i, const LodePNGColorMode* mode) -{ - if(mode->bitdepth != 16) return 85; /*error: this function only supports 16-bit input*/ - - if(mode->colortype == LCT_GREY) - { - *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1]; - if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; - else *a = 65535; - } - else if(mode->colortype == LCT_RGB) - { - *r = 256 * in[i * 6 + 0] + in[i * 6 + 1]; - *g = 256 * in[i * 6 + 2] + in[i * 6 + 3]; - *b = 256 * in[i * 6 + 4] + in[i * 6 + 5]; - if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; - else *a = 65535; - } - else if(mode->colortype == LCT_GREY_ALPHA) - { - *r = *g = *b = 256 * in[i * 4 + 0] + in[i * 4 + 1]; - *a = 256 * in[i * 4 + 2] + in[i * 4 + 3]; - } - else if(mode->colortype == LCT_RGBA) - { - *r = 256 * in[i * 8 + 0] + in[i * 8 + 1]; - *g = 256 * in[i * 8 + 2] + in[i * 8 + 3]; - *b = 256 * in[i * 8 + 4] + in[i * 8 + 5]; - *a = 256 * in[i * 8 + 6] + in[i * 8 + 7]; - } - else return 85; /*error: this function only supports 16-bit input, not palettes*/ - - return 0; /*no error*/ -} - -/* -converts from any color type to 24-bit or 32-bit (later maybe more supported). return value = LodePNG error code -the out buffer must have (w * h * bpp + 7) / 8 bytes, where bpp is the bits per pixel of the output color type -(lodepng_get_bpp) for < 8 bpp images, there may _not_ be padding bits at the end of scanlines. -*/ -unsigned lodepng_convert(unsigned char* out, const unsigned char* in, - LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, - unsigned w, unsigned h, unsigned fix_png) -{ - unsigned error = 0; - size_t i; - ColorTree tree; - size_t numpixels = w * h; - - if(lodepng_color_mode_equal(mode_out, mode_in)) - { - size_t numbytes = lodepng_get_raw_size(w, h, mode_in); - for(i = 0; i < numbytes; i++) out[i] = in[i]; - return error; - } - - if(mode_out->colortype == LCT_PALETTE) - { - size_t palsize = 1 << mode_out->bitdepth; - if(mode_out->palettesize < palsize) palsize = mode_out->palettesize; - color_tree_init(&tree); - for(i = 0; i < palsize; i++) - { - unsigned char* p = &mode_out->palette[i * 4]; - color_tree_add(&tree, p[0], p[1], p[2], p[3], i); - } - } - - if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) - { - for(i = 0; i < numpixels; i++) - { - unsigned short r = 0, g = 0, b = 0, a = 0; - error = getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - if(error) break; - error = rgba16ToPixel(out, i, mode_out, r, g, b, a); - if(error) break; - } - } - else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) - { - error = getPixelColorsRGBA8(out, numpixels, 1, in, mode_in, fix_png); - } - else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) - { - error = getPixelColorsRGBA8(out, numpixels, 0, in, mode_in, fix_png); - } - else - { - unsigned char r = 0, g = 0, b = 0, a = 0; - for(i = 0; i < numpixels; i++) - { - error = getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in, fix_png); - if(error) break; - error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a); - if(error) break; - } - } - - if(mode_out->colortype == LCT_PALETTE) - { - color_tree_cleanup(&tree); - } - - return error; -} - -#ifdef LODEPNG_COMPILE_ENCODER - -typedef struct ColorProfile -{ - unsigned char sixteenbit; /*needs more than 8 bits per channel*/ - unsigned char sixteenbit_done; - - - unsigned char colored; /*not greyscale*/ - unsigned char colored_done; - - unsigned char key; /*a color key is required, or more*/ - unsigned short key_r; /*these values are always in 16-bit bitdepth in the profile*/ - unsigned short key_g; - unsigned short key_b; - unsigned char alpha; /*alpha channel, or alpha palette, required*/ - unsigned char alpha_done; - - unsigned numcolors; - ColorTree tree; /*for listing the counted colors, up to 256*/ - unsigned char* palette; /*size 1024. Remember up to the first 256 RGBA colors*/ - unsigned maxnumcolors; /*if more than that amount counted*/ - unsigned char numcolors_done; - - unsigned greybits; /*amount of bits required for greyscale (1, 2, 4, 8). Does not take 16 bit into account.*/ - unsigned char greybits_done; - -} ColorProfile; - -static void color_profile_init(ColorProfile* profile, const LodePNGColorMode* mode) -{ - profile->sixteenbit = 0; - profile->sixteenbit_done = mode->bitdepth == 16 ? 0 : 1; - - profile->colored = 0; - profile->colored_done = lodepng_is_greyscale_type(mode) ? 1 : 0; - - profile->key = 0; - profile->alpha = 0; - profile->alpha_done = lodepng_can_have_alpha(mode) ? 0 : 1; - - profile->numcolors = 0; - color_tree_init(&profile->tree); - profile->palette = (unsigned char*)lodepng_malloc(1024); - profile->maxnumcolors = 257; - if(lodepng_get_bpp(mode) <= 8) - { - int bpp = lodepng_get_bpp(mode); - profile->maxnumcolors = bpp == 1 ? 2 : (bpp == 2 ? 4 : (bpp == 4 ? 16 : 256)); - } - profile->numcolors_done = 0; - - profile->greybits = 1; - profile->greybits_done = lodepng_get_bpp(mode) == 1 ? 1 : 0; -} - -static void color_profile_cleanup(ColorProfile* profile) -{ - color_tree_cleanup(&profile->tree); - lodepng_free(profile->palette); -} - -/*function used for debug purposes with C++*/ -/*void printColorProfile(ColorProfile* p) -{ - std::cout << "sixteenbit: " << (int)p->sixteenbit << std::endl; - std::cout << "sixteenbit_done: " << (int)p->sixteenbit_done << std::endl; - std::cout << "colored: " << (int)p->colored << std::endl; - std::cout << "colored_done: " << (int)p->colored_done << std::endl; - std::cout << "key: " << (int)p->key << std::endl; - std::cout << "key_r: " << (int)p->key_r << std::endl; - std::cout << "key_g: " << (int)p->key_g << std::endl; - std::cout << "key_b: " << (int)p->key_b << std::endl; - std::cout << "alpha: " << (int)p->alpha << std::endl; - std::cout << "alpha_done: " << (int)p->alpha_done << std::endl; - std::cout << "numcolors: " << (int)p->numcolors << std::endl; - std::cout << "maxnumcolors: " << (int)p->maxnumcolors << std::endl; - std::cout << "numcolors_done: " << (int)p->numcolors_done << std::endl; - std::cout << "greybits: " << (int)p->greybits << std::endl; - std::cout << "greybits_done: " << (int)p->greybits_done << std::endl; -}*/ - -/*Returns how many bits needed to represent given value (max 8 bit)*/ -unsigned getValueRequiredBits(unsigned short value) -{ - if(value == 0 || value == 255) return 1; - /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/ - if(value % 17 == 0) return value % 85 == 0 ? 2 : 4; - return 8; -} - -/*profile must already have been inited with mode. -It's ok to set some parameters of profile to done already.*/ -static unsigned get_color_profile(ColorProfile* profile, - const unsigned char* in, - size_t numpixels /*must be full image size, for certain filesize based choices*/, - const LodePNGColorMode* mode, - unsigned fix_png) -{ - unsigned error = 0; - size_t i; - - if(mode->bitdepth == 16) - { - for(i = 0; i < numpixels; i++) - { - unsigned short r, g, b, a; - error = getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode); - if(error) break; - - /*a color is considered good for 8-bit if the first byte and the second byte are equal, - (so if it's divisible through 257), NOT necessarily if the second byte is 0*/ - if(!profile->sixteenbit_done - && (((r & 255) != ((r >> 8) & 255)) - || ((g & 255) != ((g >> 8) & 255)) - || ((b & 255) != ((b >> 8) & 255)))) - { - profile->sixteenbit = 1; - profile->sixteenbit_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore at 16-bit*/ - profile->numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ - } - - if(!profile->colored_done && (r != g || r != b)) - { - profile->colored = 1; - profile->colored_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - - if(!profile->alpha_done && a != 65535) - { - /*only use color key if numpixels large enough to justify tRNS chunk size*/ - if(a == 0 && numpixels > 16 && !(profile->key && (r != profile->key_r || g != profile->key_g || b != profile->key_b))) - { - if(!profile->alpha && !profile->key) - { - profile->key = 1; - profile->key_r = r; - profile->key_g = g; - profile->key_b = b; - } - } - else - { - profile->alpha = 1; - profile->alpha_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - } - - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - if(!profile->alpha_done && a == 65535 && profile->key - && r == profile->key_r && g == profile->key_g && b == profile->key_b) - { - profile->alpha = 1; - profile->alpha_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - - if(!profile->greybits_done) - { - /*assuming 8-bit r, this test does not care about 16-bit*/ - unsigned bits = getValueRequiredBits(r); - if(bits > profile->greybits) profile->greybits = bits; - if(profile->greybits >= 8) profile->greybits_done = 1; - } - - if(!profile->numcolors_done) - { - /*assuming 8-bit rgba, this test does not care about 16-bit*/ - if(!color_tree_has(&profile->tree, (unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a)) - { - color_tree_add(&profile->tree, (unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a, - profile->numcolors); - if(profile->numcolors < 256) - { - unsigned char* p = profile->palette; - unsigned i = profile->numcolors; - p[i * 4 + 0] = (unsigned char)r; - p[i * 4 + 1] = (unsigned char)g; - p[i * 4 + 2] = (unsigned char)b; - p[i * 4 + 3] = (unsigned char)a; - } - profile->numcolors++; - if(profile->numcolors >= profile->maxnumcolors) profile->numcolors_done = 1; - } - } - - if(profile->alpha_done && profile->numcolors_done - && profile->colored_done && profile->sixteenbit_done && profile->greybits_done) - { - break; - } - }; - } - else /* < 16-bit */ - { - for(i = 0; i < numpixels; i++) - { - unsigned char r = 0, g = 0, b = 0, a = 0; - error = getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode, fix_png); - if(error) break; - - if(!profile->colored_done && (r != g || r != b)) - { - profile->colored = 1; - profile->colored_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - - if(!profile->alpha_done && a != 255) - { - if(a == 0 && !(profile->key && (r != profile->key_r || g != profile->key_g || b != profile->key_b))) - { - if(!profile->key) - { - profile->key = 1; - profile->key_r = r; - profile->key_g = g; - profile->key_b = b; - } - } - else - { - profile->alpha = 1; - profile->alpha_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - } - - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - if(!profile->alpha_done && a == 255 && profile->key - && r == profile->key_r && g == profile->key_g && b == profile->key_b) - { - profile->alpha = 1; - profile->alpha_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - - if(!profile->greybits_done) - { - unsigned bits = getValueRequiredBits(r); - if(bits > profile->greybits) profile->greybits = bits; - if(profile->greybits >= 8) profile->greybits_done = 1; - } - - if(!profile->numcolors_done) - { - if(!color_tree_has(&profile->tree, r, g, b, a)) - { - - color_tree_add(&profile->tree, r, g, b, a, profile->numcolors); - if(profile->numcolors < 256) - { - unsigned char* p = profile->palette; - unsigned i = profile->numcolors; - p[i * 4 + 0] = r; - p[i * 4 + 1] = g; - p[i * 4 + 2] = b; - p[i * 4 + 3] = a; - } - profile->numcolors++; - if(profile->numcolors >= profile->maxnumcolors) profile->numcolors_done = 1; - } - } - - if(profile->alpha_done && profile->numcolors_done && profile->colored_done && profile->greybits_done) - { - break; - } - }; - } - - /*make the profile's key always 16-bit for consistency*/ - if(mode->bitdepth < 16) - { - /*repeat each byte twice*/ - profile->key_r *= 257; - profile->key_g *= 257; - profile->key_b *= 257; - } - - return error; -} - -static void setColorKeyFrom16bit(LodePNGColorMode* mode_out, unsigned r, unsigned g, unsigned b, unsigned bitdepth) -{ - unsigned mask = (1 << bitdepth) - 1; - mode_out->key_defined = 1; - mode_out->key_r = r & mask; - mode_out->key_g = g & mask; - mode_out->key_b = b & mask; -} - -/*updates values of mode with a potentially smaller color model. mode_out should -contain the user chosen color model, but will be overwritten with the new chosen one.*/ -unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out, - const unsigned char* image, unsigned w, unsigned h, - const LodePNGColorMode* mode_in, - LodePNGAutoConvert auto_convert) -{ - ColorProfile profile; - unsigned error = 0; - int no_nibbles = auto_convert == LAC_AUTO_NO_NIBBLES || auto_convert == LAC_AUTO_NO_NIBBLES_NO_PALETTE; - int no_palette = auto_convert == LAC_AUTO_NO_PALETTE || auto_convert == LAC_AUTO_NO_NIBBLES_NO_PALETTE; - - if(auto_convert == LAC_ALPHA) - { - if(mode_out->colortype != LCT_RGBA && mode_out->colortype != LCT_GREY_ALPHA) return 0; - } - - color_profile_init(&profile, mode_in); - if(auto_convert == LAC_ALPHA) - { - profile.colored_done = 1; - profile.greybits_done = 1; - profile.numcolors_done = 1; - profile.sixteenbit_done = 1; - } - error = get_color_profile(&profile, image, w * h, mode_in, 0 /*fix_png*/); - if(!error && auto_convert == LAC_ALPHA) - { - if(!profile.alpha) - { - mode_out->colortype = (mode_out->colortype == LCT_RGBA ? LCT_RGB : LCT_GREY); - if(profile.key) setColorKeyFrom16bit(mode_out, profile.key_r, profile.key_g, profile.key_b, mode_out->bitdepth); - } - } - else if(!error && auto_convert != LAC_ALPHA) - { - mode_out->key_defined = 0; - - if(profile.sixteenbit) - { - mode_out->bitdepth = 16; - if(profile.alpha) - { - mode_out->colortype = profile.colored ? LCT_RGBA : LCT_GREY_ALPHA; - } - else - { - mode_out->colortype = profile.colored ? LCT_RGB : LCT_GREY; - if(profile.key) setColorKeyFrom16bit(mode_out, profile.key_r, profile.key_g, profile.key_b, mode_out->bitdepth); - } - } - else /*less than 16 bits per channel*/ - { - /*don't add palette overhead if image hasn't got a lot of pixels*/ - unsigned n = profile.numcolors; - int palette_ok = !no_palette && n <= 256 && (n * 2 < w * h); - unsigned palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); - int grey_ok = !profile.colored && !profile.alpha; /*grey without alpha, with potentially low bits*/ - if(palette_ok || grey_ok) - { - if(!palette_ok || (grey_ok && profile.greybits <= palettebits)) - { - unsigned grey = profile.key_r; - mode_out->colortype = LCT_GREY; - mode_out->bitdepth = profile.greybits; - if(profile.key) setColorKeyFrom16bit(mode_out, grey, grey, grey, mode_out->bitdepth); - } - else - { - /*fill in the palette*/ - unsigned i; - unsigned char* p = profile.palette; - /*remove potential earlier palette*/ - lodepng_palette_clear(mode_out); - for(i = 0; i < profile.numcolors; i++) - { - error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); - if(error) break; - } - - mode_out->colortype = LCT_PALETTE; - mode_out->bitdepth = palettebits; - } - } - else /*8-bit per channel*/ - { - mode_out->bitdepth = 8; - if(profile.alpha) - { - mode_out->colortype = profile.colored ? LCT_RGBA : LCT_GREY_ALPHA; - } - else - { - mode_out->colortype = profile.colored ? LCT_RGB : LCT_GREY /*LCT_GREY normally won't occur, already done earlier*/; - if(profile.key) setColorKeyFrom16bit(mode_out, profile.key_r, profile.key_g, profile.key_b, mode_out->bitdepth); - } - } - } - } - - color_profile_cleanup(&profile); - - if(mode_out->colortype == LCT_PALETTE && mode_in->palettesize == mode_out->palettesize) - { - /*In this case keep the palette order of the input, so that the user can choose an optimal one*/ - size_t i; - for(i = 0; i < mode_in->palettesize * 4; i++) - { - mode_out->palette[i] = mode_in->palette[i]; - } - } - - if(no_nibbles && mode_out->bitdepth < 8) - { - /*palette can keep its small amount of colors, as long as no indices use it*/ - mode_out->bitdepth = 8; - } - - return error; -} - -#endif /* #ifdef LODEPNG_COMPILE_ENCODER */ - -/* -Paeth predicter, used by PNG filter type 4 -The parameters are of type short, but should come from unsigned chars, the shorts -are only needed to make the paeth calculation correct. -*/ -static unsigned char paethPredictor(short a, short b, short c) -{ - short pa = abs(b - c); - short pb = abs(a - c); - short pc = abs(a + b - c - c); - - if(pc < pa && pc < pb) return (unsigned char)c; - else if(pb < pa) return (unsigned char)b; - else return (unsigned char)a; -} - -/*shared values used by multiple Adam7 related functions*/ - -static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/ -static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/ -static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/ -static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/ - -/* -Outputs various dimensions and positions in the image related to the Adam7 reduced images. -passw: output containing the width of the 7 passes -passh: output containing the height of the 7 passes -filter_passstart: output containing the index of the start and end of each - reduced image with filter bytes -padded_passstart output containing the index of the start and end of each - reduced image when without filter bytes but with padded scanlines -passstart: output containing the index of the start and end of each reduced - image without padding between scanlines, but still padding between the images -w, h: width and height of non-interlaced image -bpp: bits per pixel -"padded" is only relevant if bpp is less than 8 and a scanline or image does not - end at a full byte -*/ -static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8], - size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) -{ - /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/ - unsigned i; - - /*calculate width and height in pixels of each pass*/ - for(i = 0; i < 7; i++) - { - passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i]; - passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i]; - if(passw[i] == 0) passh[i] = 0; - if(passh[i] == 0) passw[i] = 0; - } - - filter_passstart[0] = padded_passstart[0] = passstart[0] = 0; - for(i = 0; i < 7; i++) - { - /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/ - filter_passstart[i + 1] = filter_passstart[i] - + ((passw[i] && passh[i]) ? passh[i] * (1 + (passw[i] * bpp + 7) / 8) : 0); - /*bits padded if needed to fill full byte at end of each scanline*/ - padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7) / 8); - /*only padded at end of reduced image*/ - passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7) / 8; - } -} - -#ifdef LODEPNG_COMPILE_DECODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG Decoder / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*read the information from the header and store it in the LodePNGInfo. return value is error*/ -unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state, - const unsigned char* in, size_t insize) -{ - LodePNGInfo* info = &state->info_png; - if(insize == 0 || in == 0) - { - CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/ - } - if(insize < 29) - { - CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/ - } - - /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/ - lodepng_info_cleanup(info); - lodepng_info_init(info); - - if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71 - || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) - { - CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/ - } - if(in[12] != 'I' || in[13] != 'H' || in[14] != 'D' || in[15] != 'R') - { - CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/ - } - - /*read the values given in the header*/ - *w = lodepng_read32bitInt(&in[16]); - *h = lodepng_read32bitInt(&in[20]); - info->color.bitdepth = in[24]; - info->color.colortype = (LodePNGColorType)in[25]; - info->compression_method = in[26]; - info->filter_method = in[27]; - info->interlace_method = in[28]; - - if(!state->decoder.ignore_crc) - { - unsigned CRC = lodepng_read32bitInt(&in[29]); - unsigned checksum = lodepng_crc32(&in[12], 17); - if(CRC != checksum) - { - CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/ - } - } - - /*error: only compression method 0 is allowed in the specification*/ - if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32); - /*error: only filter method 0 is allowed in the specification*/ - if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33); - /*error: only interlace methods 0 and 1 exist in the specification*/ - if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34); - - state->error = checkColorValidity(info->color.colortype, info->color.bitdepth); - return state->error; -} - -static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon, - size_t bytewidth, unsigned char filterType, size_t length) -{ - /* - For PNG filter method 0 - unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte, - the filter works byte per byte (bytewidth = 1) - precon is the previous unfiltered scanline, recon the result, scanline the current one - the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead - recon and scanline MAY be the same memory address! precon must be disjoint. - */ - - size_t i; - switch(filterType) - { - case 0: - for(i = 0; i < length; i++) recon[i] = scanline[i]; - break; - case 1: - for(i = 0; i < bytewidth; i++) recon[i] = scanline[i]; - for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + recon[i - bytewidth]; - break; - case 2: - if(precon) - { - for(i = 0; i < length; i++) recon[i] = scanline[i] + precon[i]; - } - else - { - for(i = 0; i < length; i++) recon[i] = scanline[i]; - } - break; - case 3: - if(precon) - { - for(i = 0; i < bytewidth; i++) recon[i] = scanline[i] + precon[i] / 2; - for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) / 2); - } - else - { - for(i = 0; i < bytewidth; i++) recon[i] = scanline[i]; - for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + recon[i - bytewidth] / 2; - } - break; - case 4: - if(precon) - { - for(i = 0; i < bytewidth; i++) - { - recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/ - } - for(i = bytewidth; i < length; i++) - { - recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth])); - } - } - else - { - for(i = 0; i < bytewidth; i++) - { - recon[i] = scanline[i]; - } - for(i = bytewidth; i < length; i++) - { - /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/ - recon[i] = (scanline[i] + recon[i - bytewidth]); - } - } - break; - default: return 36; /*error: unexisting filter type given*/ - } - return 0; -} - -static unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) -{ - /* - For PNG filter method 0 - this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times) - out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline - w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel - in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes) - */ - - unsigned y; - unsigned char* prevline = 0; - - /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ - size_t bytewidth = (bpp + 7) / 8; - size_t linebytes = (w * bpp + 7) / 8; - - for(y = 0; y < h; y++) - { - size_t outindex = linebytes * y; - size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - unsigned char filterType = in[inindex]; - - CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes)); - - prevline = &out[outindex]; - } - - return 0; -} - -/* -in: Adam7 interlaced image, with no padding bits between scanlines, but between - reduced images so that each reduced image starts at a byte. -out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h -bpp: bits per pixel -out has the following size in bits: w * h * bpp. -in is possibly bigger due to padding bits between reduced images. -out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation -(because that's likely a little bit faster) -NOTE: comments about padding bits are only relevant if bpp < 8 -*/ -static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) -{ - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - if(bpp >= 8) - { - for(i = 0; i < 7; i++) - { - unsigned x, y, b; - size_t bytewidth = bpp / 8; - for(y = 0; y < passh[i]; y++) - for(x = 0; x < passw[i]; x++) - { - size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth; - size_t pixeloutstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; - for(b = 0; b < bytewidth; b++) - { - out[pixeloutstart + b] = in[pixelinstart + b]; - } - } - } - } - else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ - { - for(i = 0; i < 7; i++) - { - unsigned x, y, b; - unsigned ilinebits = bpp * passw[i]; - unsigned olinebits = bpp * w; - size_t obp, ibp; /*bit pointers (for out and in buffer)*/ - for(y = 0; y < passh[i]; y++) - for(x = 0; x < passw[i]; x++) - { - ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp); - obp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; - for(b = 0; b < bpp; b++) - { - unsigned char bit = readBitFromReversedStream(&ibp, in); - /*note that this function assumes the out buffer is completely 0, use setBitOfReversedStream otherwise*/ - setBitOfReversedStream0(&obp, out, bit); - } - } - } - } -} - -static void removePaddingBits(unsigned char* out, const unsigned char* in, - size_t olinebits, size_t ilinebits, unsigned h) -{ - /* - After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need - to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers - for the Adam7 code, the color convert code and the output to the user. - in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must - have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits - also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7 - only useful if (ilinebits - olinebits) is a value in the range 1..7 - */ - unsigned y; - size_t diff = ilinebits - olinebits; - size_t ibp = 0, obp = 0; /*input and output bit pointers*/ - for(y = 0; y < h; y++) - { - size_t x; - for(x = 0; x < olinebits; x++) - { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - ibp += diff; - } -} - -/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from -the IDAT chunks (with filter index bytes and possible padding bits) -return value is error*/ -static unsigned postProcessScanlines(unsigned char* out, unsigned char* in, - unsigned w, unsigned h, const LodePNGInfo* info_png) -{ - /* - This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype. - Steps: - *) if no Adam7: 1) unfilter 2) remove padding bits (= posible extra bits per scanline if bpp < 8) - *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace - NOTE: the in buffer will be overwritten with intermediate data! - */ - unsigned bpp = lodepng_get_bpp(&info_png->color); - if(bpp == 0) return 31; /*error: invalid colortype*/ - - if(info_png->interlace_method == 0) - { - if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) - { - CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp)); - removePaddingBits(out, in, w * bpp, ((w * bpp + 7) / 8) * 8, h); - } - /*we can immediatly filter into the out buffer, no other steps needed*/ - else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp)); - } - else /*interlace_method is 1 (Adam7)*/ - { - unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - for(i = 0; i < 7; i++) - { - CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp)); - /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, - move bytes instead of bits or move not at all*/ - if(bpp < 8) - { - /*remove padding bits in scanlines; after this there still may be padding - bits between the different reduced images: each reduced image still starts nicely at a byte*/ - removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp, - ((passw[i] * bpp + 7) / 8) * 8, passh[i]); - } - } - - Adam7_deinterlace(out, in, w, h, bpp); - } - - return 0; -} - -static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) -{ - unsigned pos = 0, i; - if(color->palette) lodepng_free(color->palette); - color->palettesize = chunkLength / 3; - color->palette = (unsigned char*)lodepng_malloc(4 * color->palettesize); - if(!color->palette && color->palettesize) - { - color->palettesize = 0; - return 83; /*alloc fail*/ - } - if(color->palettesize > 256) return 38; /*error: palette too big*/ - - for(i = 0; i < color->palettesize; i++) - { - color->palette[4 * i + 0] = data[pos++]; /*R*/ - color->palette[4 * i + 1] = data[pos++]; /*G*/ - color->palette[4 * i + 2] = data[pos++]; /*B*/ - color->palette[4 * i + 3] = 255; /*alpha*/ - } - - return 0; /* OK */ -} - -static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) -{ - unsigned i; - if(color->colortype == LCT_PALETTE) - { - /*error: more alpha values given than there are palette entries*/ - if(chunkLength > color->palettesize) return 38; - - for(i = 0; i < chunkLength; i++) color->palette[4 * i + 3] = data[i]; - } - else if(color->colortype == LCT_GREY) - { - /*error: this chunk must be 2 bytes for greyscale image*/ - if(chunkLength != 2) return 30; - - color->key_defined = 1; - color->key_r = color->key_g = color->key_b = 256 * data[0] + data[1]; - } - else if(color->colortype == LCT_RGB) - { - /*error: this chunk must be 6 bytes for RGB image*/ - if(chunkLength != 6) return 41; - - color->key_defined = 1; - color->key_r = 256 * data[0] + data[1]; - color->key_g = 256 * data[2] + data[3]; - color->key_b = 256 * data[4] + data[5]; - } - else return 42; /*error: tRNS chunk not allowed for other color models*/ - - return 0; /* OK */ -} - - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*background color chunk (bKGD)*/ -static unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) -{ - if(info->color.colortype == LCT_PALETTE) - { - /*error: this chunk must be 1 byte for indexed color image*/ - if(chunkLength != 1) return 43; - - info->background_defined = 1; - info->background_r = info->background_g = info->background_b = data[0]; - } - else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) - { - /*error: this chunk must be 2 bytes for greyscale image*/ - if(chunkLength != 2) return 44; - - info->background_defined = 1; - info->background_r = info->background_g = info->background_b - = 256 * data[0] + data[1]; - } - else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) - { - /*error: this chunk must be 6 bytes for greyscale image*/ - if(chunkLength != 6) return 45; - - info->background_defined = 1; - info->background_r = 256 * data[0] + data[1]; - info->background_g = 256 * data[2] + data[3]; - info->background_b = 256 * data[4] + data[5]; - } - - return 0; /* OK */ -} - -/*text chunk (tEXt)*/ -static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) -{ - unsigned error = 0; - char *key = 0, *str = 0; - unsigned i; - - while(!error) /*not really a while loop, only used to break on error*/ - { - unsigned length, string2_begin; - - length = 0; - while(length < chunkLength && data[length] != 0) length++; - /*even though it's not allowed by the standard, no error is thrown if - there's no null termination char, if the text is empty*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char*)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - key[length] = 0; - for(i = 0; i < length; i++) key[i] = data[i]; - - string2_begin = length + 1; /*skip keyword null terminator*/ - - length = chunkLength < string2_begin ? 0 : chunkLength - string2_begin; - str = (char*)lodepng_malloc(length + 1); - if(!str) CERROR_BREAK(error, 83); /*alloc fail*/ - - str[length] = 0; - for(i = 0; i < length; i++) str[i] = data[string2_begin + i]; - - error = lodepng_add_text(info, key, str); - - break; - } - - lodepng_free(key); - lodepng_free(str); - - return error; -} - -/*compressed text chunk (zTXt)*/ -static unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, - const unsigned char* data, size_t chunkLength) -{ - unsigned error = 0; - unsigned i; - - unsigned length, string2_begin; - char *key = 0; - ucvector decoded; - - ucvector_init(&decoded); - - while(!error) /*not really a while loop, only used to break on error*/ - { - for(length = 0; length < chunkLength && data[length] != 0; length++) ; - if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char*)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - key[length] = 0; - for(i = 0; i < length; i++) key[i] = data[i]; - - if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ - - string2_begin = length + 2; - if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ - - length = chunkLength - string2_begin; - /*will fail if zlib error, e.g. if length is too small*/ - error = zlib_decompress(&decoded.data, &decoded.size, - (unsigned char*)(&data[string2_begin]), - length, zlibsettings); - if(error) break; - ucvector_push_back(&decoded, 0); - - error = lodepng_add_text(info, key, (char*)decoded.data); - - break; - } - - lodepng_free(key); - ucvector_cleanup(&decoded); - - return error; -} - -/*international text chunk (iTXt)*/ -static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, - const unsigned char* data, size_t chunkLength) -{ - unsigned error = 0; - unsigned i; - - unsigned length, begin, compressed; - char *key = 0, *langtag = 0, *transkey = 0; - ucvector decoded; - ucvector_init(&decoded); - - while(!error) /*not really a while loop, only used to break on error*/ - { - /*Quick check if the chunk length isn't too small. Even without check - it'd still fail with other error checks below if it's too short. This just gives a different error code.*/ - if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/ - - /*read the key*/ - for(length = 0; length < chunkLength && data[length] != 0; length++) ; - if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char*)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - key[length] = 0; - for(i = 0; i < length; i++) key[i] = data[i]; - - /*read the compression method*/ - compressed = data[length + 1]; - if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ - - /*even though it's not allowed by the standard, no error is thrown if - there's no null termination char, if the text is empty for the next 3 texts*/ - - /*read the langtag*/ - begin = length + 3; - length = 0; - for(i = begin; i < chunkLength && data[i] != 0; i++) length++; - - langtag = (char*)lodepng_malloc(length + 1); - if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/ - - langtag[length] = 0; - for(i = 0; i < length; i++) langtag[i] = data[begin + i]; - - /*read the transkey*/ - begin += length + 1; - length = 0; - for(i = begin; i < chunkLength && data[i] != 0; i++) length++; - - transkey = (char*)lodepng_malloc(length + 1); - if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/ - - transkey[length] = 0; - for(i = 0; i < length; i++) transkey[i] = data[begin + i]; - - /*read the actual text*/ - begin += length + 1; - - length = chunkLength < begin ? 0 : chunkLength - begin; - - if(compressed) - { - /*will fail if zlib error, e.g. if length is too small*/ - error = zlib_decompress(&decoded.data, &decoded.size, - (unsigned char*)(&data[begin]), - length, zlibsettings); - if(error) break; - if(decoded.allocsize < decoded.size) decoded.allocsize = decoded.size; - ucvector_push_back(&decoded, 0); - } - else - { - if(!ucvector_resize(&decoded, length + 1)) CERROR_BREAK(error, 83 /*alloc fail*/); - - decoded.data[length] = 0; - for(i = 0; i < length; i++) decoded.data[i] = data[begin + i]; - } - - error = lodepng_add_itext(info, key, langtag, transkey, (char*)decoded.data); - - break; - } - - lodepng_free(key); - lodepng_free(langtag); - lodepng_free(transkey); - ucvector_cleanup(&decoded); - - return error; -} - -static unsigned readChunk_tIME(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) -{ - if(chunkLength != 7) return 73; /*invalid tIME chunk size*/ - - info->time_defined = 1; - info->time.year = 256 * data[0] + data[+ 1]; - info->time.month = data[2]; - info->time.day = data[3]; - info->time.hour = data[4]; - info->time.minute = data[5]; - info->time.second = data[6]; - - return 0; /* OK */ -} - -static unsigned readChunk_pHYs(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) -{ - if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/ - - info->phys_defined = 1; - info->phys_x = 16777216 * data[0] + 65536 * data[1] + 256 * data[2] + data[3]; - info->phys_y = 16777216 * data[4] + 65536 * data[5] + 256 * data[6] + data[7]; - info->phys_unit = data[8]; - - return 0; /* OK */ -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/ -static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize) -{ - unsigned char IEND = 0; - const unsigned char* chunk; - size_t i; - ucvector idat; /*the data from idat chunks*/ - ucvector scanlines; - - /*for unknown chunk order*/ - unsigned unknown = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - - /*provide some proper output values if error will happen*/ - *out = 0; - - state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/ - if(state->error) return; - - ucvector_init(&idat); - chunk = &in[33]; /*first byte of the first chunk after the header*/ - - /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk. - IDAT data is put at the start of the in buffer*/ - while(!IEND && !state->error) - { - unsigned chunkLength; - const unsigned char* data; /*the data in the chunk*/ - - /*error: size of the in buffer too small to contain next chunk*/ - if((size_t)((chunk - in) + 12) > insize || chunk < in) CERROR_BREAK(state->error, 30); - - /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/ - chunkLength = lodepng_chunk_length(chunk); - /*error: chunk length larger than the max PNG chunk size*/ - if(chunkLength > 2147483647) CERROR_BREAK(state->error, 63); - - if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in) - { - CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk*/ - } - - data = lodepng_chunk_data_const(chunk); - - /*IDAT chunk, containing compressed image data*/ - if(lodepng_chunk_type_equals(chunk, "IDAT")) - { - size_t oldsize = idat.size; - if(!ucvector_resize(&idat, oldsize + chunkLength)) CERROR_BREAK(state->error, 83 /*alloc fail*/); - for(i = 0; i < chunkLength; i++) idat.data[oldsize + i] = data[i]; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - critical_pos = 3; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } - /*IEND chunk*/ - else if(lodepng_chunk_type_equals(chunk, "IEND")) - { - IEND = 1; - } - /*palette chunk (PLTE)*/ - else if(lodepng_chunk_type_equals(chunk, "PLTE")) - { - state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength); - if(state->error) break; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - critical_pos = 2; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } - /*palette transparency chunk (tRNS)*/ - else if(lodepng_chunk_type_equals(chunk, "tRNS")) - { - state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength); - if(state->error) break; - } -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*background color chunk (bKGD)*/ - else if(lodepng_chunk_type_equals(chunk, "bKGD")) - { - state->error = readChunk_bKGD(&state->info_png, data, chunkLength); - if(state->error) break; - } - /*text chunk (tEXt)*/ - else if(lodepng_chunk_type_equals(chunk, "tEXt")) - { - if(state->decoder.read_text_chunks) - { - state->error = readChunk_tEXt(&state->info_png, data, chunkLength); - if(state->error) break; - } - } - /*compressed text chunk (zTXt)*/ - else if(lodepng_chunk_type_equals(chunk, "zTXt")) - { - if(state->decoder.read_text_chunks) - { - state->error = readChunk_zTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); - if(state->error) break; - } - } - /*international text chunk (iTXt)*/ - else if(lodepng_chunk_type_equals(chunk, "iTXt")) - { - if(state->decoder.read_text_chunks) - { - state->error = readChunk_iTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); - if(state->error) break; - } - } - else if(lodepng_chunk_type_equals(chunk, "tIME")) - { - state->error = readChunk_tIME(&state->info_png, data, chunkLength); - if(state->error) break; - } - else if(lodepng_chunk_type_equals(chunk, "pHYs")) - { - state->error = readChunk_pHYs(&state->info_png, data, chunkLength); - if(state->error) break; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - else /*it's not an implemented chunk type, so ignore it: skip over the data*/ - { - /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/ - if(!lodepng_chunk_ancillary(chunk)) CERROR_BREAK(state->error, 69); - - unknown = 1; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(state->decoder.remember_unknown_chunks) - { - state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1], - &state->info_png.unknown_chunks_size[critical_pos - 1], chunk); - if(state->error) break; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } - - if(!state->decoder.ignore_crc && !unknown) /*check CRC if wanted, only on known chunk types*/ - { - if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/ - } - - if(!IEND) chunk = lodepng_chunk_next_const(chunk); - } - - ucvector_init(&scanlines); - if(!state->error) - { - /*maximum final image length is already reserved in the vector's length - this is not really necessary*/ - if(!ucvector_resize(&scanlines, lodepng_get_raw_size(*w, *h, &state->info_png.color) + *h)) - { - state->error = 83; /*alloc fail*/ - } - } - if(!state->error) - { - /*decompress with the Zlib decompressor*/ - state->error = zlib_decompress(&scanlines.data, &scanlines.size, idat.data, - idat.size, &state->decoder.zlibsettings); - } - ucvector_cleanup(&idat); - - if(!state->error) - { - ucvector outv; - ucvector_init(&outv); - if(!ucvector_resizev(&outv, - lodepng_get_raw_size(*w, *h, &state->info_png.color), 0)) state->error = 83; /*alloc fail*/ - if(!state->error) state->error = postProcessScanlines(outv.data, scanlines.data, *w, *h, &state->info_png); - *out = outv.data; - } - ucvector_cleanup(&scanlines); -} - -unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize) -{ - *out = 0; - decodeGeneric(out, w, h, state, in, insize); - if(state->error) return state->error; - if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) - { - /*same color type, no copying or converting of data needed*/ - /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype - the raw image has to the end user*/ - if(!state->decoder.color_convert) - { - state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color); - if(state->error) return state->error; - } - } - else - { - /*color conversion needed; sort of copy of the data*/ - unsigned char* data = *out; - size_t outsize; - - /*TODO: check if this works according to the statement in the documentation: "The converter can convert - from greyscale input color type, to 8-bit greyscale or greyscale with alpha"*/ - if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA) - && !(state->info_raw.bitdepth == 8)) - { - return 56; /*unsupported color mode conversion*/ - } - - outsize = lodepng_get_raw_size(*w, *h, &state->info_raw); - *out = (unsigned char*)lodepng_malloc(outsize); - if(!(*out)) - { - state->error = 83; /*alloc fail*/ - } - else state->error = lodepng_convert(*out, data, &state->info_raw, &state->info_png.color, *w, *h, state->decoder.fix_png); - lodepng_free(data); - } - return state->error; -} - -unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, - size_t insize, LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned error; - LodePNGState state; - lodepng_state_init(&state); - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; - error = lodepng_decode(out, w, h, &state, in, insize); - lodepng_state_cleanup(&state); - return error; -} - -unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) -{ - return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8); -} - -unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) -{ - return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename, - LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned char* buffer; - size_t buffersize; - unsigned error; - error = lodepng_load_file(&buffer, &buffersize, filename); - if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth); - lodepng_free(buffer); - return error; -} - -unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) -{ - return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8); -} - -unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) -{ - return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8); -} -#endif /*LODEPNG_COMPILE_DISK*/ - -void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings) -{ - settings->color_convert = 1; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - settings->read_text_chunks = 1; - settings->remember_unknown_chunks = 0; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - settings->ignore_crc = 0; - settings->fix_png = 0; - lodepng_decompress_settings_init(&settings->zlibsettings); -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) - -void lodepng_state_init(LodePNGState* state) -{ -#ifdef LODEPNG_COMPILE_DECODER - lodepng_decoder_settings_init(&state->decoder); -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER - lodepng_encoder_settings_init(&state->encoder); -#endif /*LODEPNG_COMPILE_ENCODER*/ - lodepng_color_mode_init(&state->info_raw); - lodepng_info_init(&state->info_png); - state->error = 1; -} - -void lodepng_state_cleanup(LodePNGState* state) -{ - lodepng_color_mode_cleanup(&state->info_raw); - lodepng_info_cleanup(&state->info_png); -} - -void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source) -{ - lodepng_state_cleanup(dest); - *dest = *source; - lodepng_color_mode_init(&dest->info_raw); - lodepng_info_init(&dest->info_png); - dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); if(dest->error) return; - dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); if(dest->error) return; -} - -#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ - -#ifdef LODEPNG_COMPILE_ENCODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG Encoder / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*chunkName must be string of 4 characters*/ -static unsigned addChunk(ucvector* out, const char* chunkName, const unsigned char* data, size_t length) -{ - CERROR_TRY_RETURN(lodepng_chunk_create(&out->data, &out->size, (unsigned)length, chunkName, data)); - out->allocsize = out->size; /*fix the allocsize again*/ - return 0; -} - -static void writeSignature(ucvector* out) -{ - /*8 bytes PNG signature, aka the magic bytes*/ - ucvector_push_back(out, 137); - ucvector_push_back(out, 80); - ucvector_push_back(out, 78); - ucvector_push_back(out, 71); - ucvector_push_back(out, 13); - ucvector_push_back(out, 10); - ucvector_push_back(out, 26); - ucvector_push_back(out, 10); -} - -static unsigned addChunk_IHDR(ucvector* out, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) -{ - unsigned error = 0; - ucvector header; - ucvector_init(&header); - - lodepng_add32bitInt(&header, w); /*width*/ - lodepng_add32bitInt(&header, h); /*height*/ - ucvector_push_back(&header, (unsigned char)bitdepth); /*bit depth*/ - ucvector_push_back(&header, (unsigned char)colortype); /*color type*/ - ucvector_push_back(&header, 0); /*compression method*/ - ucvector_push_back(&header, 0); /*filter method*/ - ucvector_push_back(&header, interlace_method); /*interlace method*/ - - error = addChunk(out, "IHDR", header.data, header.size); - ucvector_cleanup(&header); - - return error; -} - -static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) -{ - unsigned error = 0; - size_t i; - ucvector PLTE; - ucvector_init(&PLTE); - for(i = 0; i < info->palettesize * 4; i++) - { - /*add all channels except alpha channel*/ - if(i % 4 != 3) ucvector_push_back(&PLTE, info->palette[i]); - } - error = addChunk(out, "PLTE", PLTE.data, PLTE.size); - ucvector_cleanup(&PLTE); - - return error; -} - -static unsigned addChunk_tRNS(ucvector* out, const LodePNGColorMode* info) -{ - unsigned error = 0; - size_t i; - ucvector tRNS; - ucvector_init(&tRNS); - if(info->colortype == LCT_PALETTE) - { - size_t amount = info->palettesize; - /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/ - for(i = info->palettesize; i > 0; i--) - { - if(info->palette[4 * (i - 1) + 3] == 255) amount--; - else break; - } - /*add only alpha channel*/ - for(i = 0; i < amount; i++) ucvector_push_back(&tRNS, info->palette[4 * i + 3]); - } - else if(info->colortype == LCT_GREY) - { - if(info->key_defined) - { - ucvector_push_back(&tRNS, (unsigned char)(info->key_r / 256)); - ucvector_push_back(&tRNS, (unsigned char)(info->key_r % 256)); - } - } - else if(info->colortype == LCT_RGB) - { - if(info->key_defined) - { - ucvector_push_back(&tRNS, (unsigned char)(info->key_r / 256)); - ucvector_push_back(&tRNS, (unsigned char)(info->key_r % 256)); - ucvector_push_back(&tRNS, (unsigned char)(info->key_g / 256)); - ucvector_push_back(&tRNS, (unsigned char)(info->key_g % 256)); - ucvector_push_back(&tRNS, (unsigned char)(info->key_b / 256)); - ucvector_push_back(&tRNS, (unsigned char)(info->key_b % 256)); - } - } - - error = addChunk(out, "tRNS", tRNS.data, tRNS.size); - ucvector_cleanup(&tRNS); - - return error; -} - -static unsigned addChunk_IDAT(ucvector* out, const unsigned char* data, size_t datasize, - LodePNGCompressSettings* zlibsettings) -{ - ucvector zlibdata; - unsigned error = 0; - - /*compress with the Zlib compressor*/ - ucvector_init(&zlibdata); - error = zlib_compress(&zlibdata.data, &zlibdata.size, data, datasize, zlibsettings); - if(!error) error = addChunk(out, "IDAT", zlibdata.data, zlibdata.size); - ucvector_cleanup(&zlibdata); - - return error; -} - -static unsigned addChunk_IEND(ucvector* out) -{ - unsigned error = 0; - error = addChunk(out, "IEND", 0, 0); - return error; -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - -static unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* textstring) -{ - unsigned error = 0; - size_t i; - ucvector text; - ucvector_init(&text); - for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&text, (unsigned char)keyword[i]); - if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ - ucvector_push_back(&text, 0); /*0 termination char*/ - for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&text, (unsigned char)textstring[i]); - error = addChunk(out, "tEXt", text.data, text.size); - ucvector_cleanup(&text); - - return error; -} - -static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* textstring, - LodePNGCompressSettings* zlibsettings) -{ - unsigned error = 0; - ucvector data, compressed; - size_t i, textsize = strlen(textstring); - - ucvector_init(&data); - ucvector_init(&compressed); - for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&data, (unsigned char)keyword[i]); - if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ - ucvector_push_back(&data, 0); /*0 termination char*/ - ucvector_push_back(&data, 0); /*compression method: 0*/ - - error = zlib_compress(&compressed.data, &compressed.size, - (unsigned char*)textstring, textsize, zlibsettings); - if(!error) - { - for(i = 0; i < compressed.size; i++) ucvector_push_back(&data, compressed.data[i]); - error = addChunk(out, "zTXt", data.data, data.size); - } - - ucvector_cleanup(&compressed); - ucvector_cleanup(&data); - return error; -} - -static unsigned addChunk_iTXt(ucvector* out, unsigned compressed, const char* keyword, const char* langtag, - const char* transkey, const char* textstring, LodePNGCompressSettings* zlibsettings) -{ - unsigned error = 0; - ucvector data; - size_t i, textsize = strlen(textstring); - - ucvector_init(&data); - - for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&data, (unsigned char)keyword[i]); - if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ - ucvector_push_back(&data, 0); /*null termination char*/ - ucvector_push_back(&data, compressed ? 1 : 0); /*compression flag*/ - ucvector_push_back(&data, 0); /*compression method*/ - for(i = 0; langtag[i] != 0; i++) ucvector_push_back(&data, (unsigned char)langtag[i]); - ucvector_push_back(&data, 0); /*null termination char*/ - for(i = 0; transkey[i] != 0; i++) ucvector_push_back(&data, (unsigned char)transkey[i]); - ucvector_push_back(&data, 0); /*null termination char*/ - - if(compressed) - { - ucvector compressed_data; - ucvector_init(&compressed_data); - error = zlib_compress(&compressed_data.data, &compressed_data.size, - (unsigned char*)textstring, textsize, zlibsettings); - if(!error) - { - for(i = 0; i < compressed_data.size; i++) ucvector_push_back(&data, compressed_data.data[i]); - } - ucvector_cleanup(&compressed_data); - } - else /*not compressed*/ - { - for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&data, (unsigned char)textstring[i]); - } - - if(!error) error = addChunk(out, "iTXt", data.data, data.size); - ucvector_cleanup(&data); - return error; -} - -static unsigned addChunk_bKGD(ucvector* out, const LodePNGInfo* info) -{ - unsigned error = 0; - ucvector bKGD; - ucvector_init(&bKGD); - if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) - { - ucvector_push_back(&bKGD, (unsigned char)(info->background_r / 256)); - ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256)); - } - else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) - { - ucvector_push_back(&bKGD, (unsigned char)(info->background_r / 256)); - ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256)); - ucvector_push_back(&bKGD, (unsigned char)(info->background_g / 256)); - ucvector_push_back(&bKGD, (unsigned char)(info->background_g % 256)); - ucvector_push_back(&bKGD, (unsigned char)(info->background_b / 256)); - ucvector_push_back(&bKGD, (unsigned char)(info->background_b % 256)); - } - else if(info->color.colortype == LCT_PALETTE) - { - ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256)); /*palette index*/ - } - - error = addChunk(out, "bKGD", bKGD.data, bKGD.size); - ucvector_cleanup(&bKGD); - - return error; -} - -static unsigned addChunk_tIME(ucvector* out, const LodePNGTime* time) -{ - unsigned error = 0; - unsigned char* data = (unsigned char*)lodepng_malloc(7); - if(!data) return 83; /*alloc fail*/ - data[0] = (unsigned char)(time->year / 256); - data[1] = (unsigned char)(time->year % 256); - data[2] = time->month; - data[3] = time->day; - data[4] = time->hour; - data[5] = time->minute; - data[6] = time->second; - error = addChunk(out, "tIME", data, 7); - lodepng_free(data); - return error; -} - -static unsigned addChunk_pHYs(ucvector* out, const LodePNGInfo* info) -{ - unsigned error = 0; - ucvector data; - ucvector_init(&data); - - lodepng_add32bitInt(&data, info->phys_x); - lodepng_add32bitInt(&data, info->phys_y); - ucvector_push_back(&data, info->phys_unit); - - error = addChunk(out, "pHYs", data.data, data.size); - ucvector_cleanup(&data); - - return error; -} - -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline, - size_t length, size_t bytewidth, unsigned char filterType) -{ - size_t i; - switch(filterType) - { - case 0: /*None*/ - for(i = 0; i < length; i++) out[i] = scanline[i]; - break; - case 1: /*Sub*/ - if(prevline) - { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; - for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth]; - } - else - { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; - for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth]; - } - break; - case 2: /*Up*/ - if(prevline) - { - for(i = 0; i < length; i++) out[i] = scanline[i] - prevline[i]; - } - else - { - for(i = 0; i < length; i++) out[i] = scanline[i]; - } - break; - case 3: /*Average*/ - if(prevline) - { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i] - prevline[i] / 2; - for(i = bytewidth; i < length; i++) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) / 2); - } - else - { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; - for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth] / 2; - } - break; - case 4: /*Paeth*/ - if(prevline) - { - /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ - for(i = 0; i < bytewidth; i++) out[i] = (scanline[i] - prevline[i]); - for(i = bytewidth; i < length; i++) - { - out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); - } - } - else - { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; - /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ - for(i = bytewidth; i < length; i++) out[i] = (scanline[i] - scanline[i - bytewidth]); - } - break; - default: return; /*unexisting filter type given*/ - } -} - -/* log2 approximation. A slight bit faster than std::log. */ -static float flog2(float f) -{ - float result = 0; - while(f > 32) { result += 4; f /= 16; } - while(f > 2) { result++; f /= 2; } - return result + 1.442695f * (f * f * f / 3 - 3 * f * f / 2 + 3 * f - 1.83333f); -} - -static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, - const LodePNGColorMode* info, const LodePNGEncoderSettings* settings) -{ - /* - For PNG filter method 0 - out must be a buffer with as size: h + (w * h * bpp + 7) / 8, because there are - the scanlines with 1 extra byte per scanline - */ - - unsigned bpp = lodepng_get_bpp(info); - /*the width of a scanline in bytes, not including the filter type*/ - size_t linebytes = (w * bpp + 7) / 8; - /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ - size_t bytewidth = (bpp + 7) / 8; - const unsigned char* prevline = 0; - unsigned x, y; - unsigned error = 0; - LodePNGFilterStrategy strategy = settings->filter_strategy; - - /* - There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard: - * If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e. - use fixed filtering, with the filter None). - * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is - not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply - all five filters and select the filter that produces the smallest sum of absolute values per row. - This heuristic is used if filter strategy is LFS_MINSUM and filter_palette_zero is true. - - If filter_palette_zero is true and filter_strategy is not LFS_MINSUM, the above heuristic is followed, - but for "the other case", whatever strategy filter_strategy is set to instead of the minimum sum - heuristic is used. - */ - if(settings->filter_palette_zero && - (info->colortype == LCT_PALETTE || info->bitdepth < 8)) strategy = LFS_ZERO; - - if(bpp == 0) return 31; /*error: invalid color type*/ - - if(strategy == LFS_ZERO) - { - for(y = 0; y < h; y++) - { - size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - size_t inindex = linebytes * y; - out[outindex] = 0; /*filter type byte*/ - filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, 0); - prevline = &in[inindex]; - } - } - else if(strategy == LFS_MINSUM) - { - /*adaptive filtering*/ - size_t sum[5]; - ucvector attempt[5]; /*five filtering attempts, one for each filter type*/ - size_t smallest = 0; - unsigned type, bestType = 0; - - for(type = 0; type < 5; type++) - { - ucvector_init(&attempt[type]); - if(!ucvector_resize(&attempt[type], linebytes)) return 83; /*alloc fail*/ - } - - if(!error) - { - for(y = 0; y < h; y++) - { - /*try the 5 filter types*/ - for(type = 0; type < 5; type++) - { - filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type); - - /*calculate the sum of the result*/ - sum[type] = 0; - if(type == 0) - { - for(x = 0; x < linebytes; x++) sum[type] += (unsigned char)(attempt[type].data[x]); - } - else - { - for(x = 0; x < linebytes; x++) - { - /*For differences, each byte should be treated as signed, values above 127 are negative - (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there. - This means filtertype 0 is almost never chosen, but that is justified.*/ - signed char s = (signed char)(attempt[type].data[x]); - sum[type] += s < 0 ? -s : s; - } - } - - /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || sum[type] < smallest) - { - bestType = type; - smallest = sum[type]; - } - } - - prevline = &in[y * linebytes]; - - /*now fill the out values*/ - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; - } - } - - for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]); - } - else if(strategy == LFS_ENTROPY) - { - float sum[5]; - ucvector attempt[5]; /*five filtering attempts, one for each filter type*/ - float smallest = 0; - unsigned type, bestType = 0; - unsigned count[256]; - - for(type = 0; type < 5; type++) - { - ucvector_init(&attempt[type]); - if(!ucvector_resize(&attempt[type], linebytes)) return 83; /*alloc fail*/ - } - - for(y = 0; y < h; y++) - { - /*try the 5 filter types*/ - for(type = 0; type < 5; type++) - { - filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type); - for(x = 0; x < 256; x++) count[x] = 0; - for(x = 0; x < linebytes; x++) count[attempt[type].data[x]]++; - count[type]++; /*the filter type itself is part of the scanline*/ - sum[type] = 0; - for(x = 0; x < 256; x++) - { - float p = count[x] / (float)(linebytes + 1); - sum[type] += count[x] == 0 ? 0 : flog2(1 / p) * p; - } - /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || sum[type] < smallest) - { - bestType = type; - smallest = sum[type]; - } - } - - prevline = &in[y * linebytes]; - - /*now fill the out values*/ - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; - } - - for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]); - } - else if(strategy == LFS_PREDEFINED) - { - for(y = 0; y < h; y++) - { - size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - size_t inindex = linebytes * y; - unsigned type = settings->predefined_filters[y]; - out[outindex] = type; /*filter type byte*/ - filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); - prevline = &in[inindex]; - } - } - else if(strategy == LFS_BRUTE_FORCE) - { - /*brute force filter chooser. - deflate the scanline after every filter attempt to see which one deflates best. - This is very slow and gives only slightly smaller, sometimes even larger, result*/ - size_t size[5]; - ucvector attempt[5]; /*five filtering attempts, one for each filter type*/ - size_t smallest = 0; - unsigned type = 0, bestType = 0; - unsigned char* dummy; - LodePNGCompressSettings zlibsettings = settings->zlibsettings; - /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose, - to simulate the true case where the tree is the same for the whole image. Sometimes it gives - better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare - cases better compression. It does make this a bit less slow, so it's worth doing this.*/ - zlibsettings.btype = 1; - /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG - images only, so disable it*/ - zlibsettings.custom_zlib = 0; - zlibsettings.custom_deflate = 0; - for(type = 0; type < 5; type++) - { - ucvector_init(&attempt[type]); - ucvector_resize(&attempt[type], linebytes); /*todo: give error if resize failed*/ - } - for(y = 0; y < h; y++) /*try the 5 filter types*/ - { - for(type = 0; type < 5; type++) - { - unsigned testsize = attempt[type].size; - /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/ - - filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type); - size[type] = 0; - dummy = 0; - zlib_compress(&dummy, &size[type], attempt[type].data, testsize, &zlibsettings); - lodepng_free(dummy); - /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || size[type] < smallest) - { - bestType = type; - smallest = size[type]; - } - } - prevline = &in[y * linebytes]; - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; - } - for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]); - } - else return 88; /* unknown filter strategy */ - - return error; -} - -static void addPaddingBits(unsigned char* out, const unsigned char* in, - size_t olinebits, size_t ilinebits, unsigned h) -{ - /*The opposite of the removePaddingBits function - olinebits must be >= ilinebits*/ - unsigned y; - size_t diff = olinebits - ilinebits; - size_t obp = 0, ibp = 0; /*bit pointers*/ - for(y = 0; y < h; y++) - { - size_t x; - for(x = 0; x < ilinebits; x++) - { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - /*obp += diff; --> no, fill in some value in the padding bits too, to avoid - "Use of uninitialised value of size ###" warning from valgrind*/ - for(x = 0; x < diff; x++) setBitOfReversedStream(&obp, out, 0); - } -} - -/* -in: non-interlaced image with size w*h -out: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with - no padding bits between scanlines, but between reduced images so that each - reduced image starts at a byte. -bpp: bits per pixel -there are no padding bits, not between scanlines, not between reduced images -in has the following size in bits: w * h * bpp. -out is possibly bigger due to padding bits between reduced images -NOTE: comments about padding bits are only relevant if bpp < 8 -*/ -static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) -{ - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - if(bpp >= 8) - { - for(i = 0; i < 7; i++) - { - unsigned x, y, b; - size_t bytewidth = bpp / 8; - for(y = 0; y < passh[i]; y++) - for(x = 0; x < passw[i]; x++) - { - size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; - size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth; - for(b = 0; b < bytewidth; b++) - { - out[pixeloutstart + b] = in[pixelinstart + b]; - } - } - } - } - else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ - { - for(i = 0; i < 7; i++) - { - unsigned x, y, b; - unsigned ilinebits = bpp * passw[i]; - unsigned olinebits = bpp * w; - size_t obp, ibp; /*bit pointers (for out and in buffer)*/ - for(y = 0; y < passh[i]; y++) - for(x = 0; x < passw[i]; x++) - { - ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; - obp = (8 * passstart[i]) + (y * ilinebits + x * bpp); - for(b = 0; b < bpp; b++) - { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - } - } - } -} - -/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image. -return value is error**/ -static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned char* in, - unsigned w, unsigned h, - const LodePNGInfo* info_png, const LodePNGEncoderSettings* settings) -{ - /* - This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps: - *) if no Adam7: 1) add padding bits (= posible extra bits per scanline if bpp < 8) 2) filter - *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter - */ - unsigned bpp = lodepng_get_bpp(&info_png->color); - unsigned error = 0; - - if(info_png->interlace_method == 0) - { - *outsize = h + (h * ((w * bpp + 7) / 8)); /*image size plus an extra byte per scanline + possible padding bits*/ - *out = (unsigned char*)lodepng_malloc(*outsize); - if(!(*out) && (*outsize)) error = 83; /*alloc fail*/ - - if(!error) - { - /*non multiple of 8 bits per scanline, padding bits needed per scanline*/ - if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) - { - unsigned char* padded = (unsigned char*)lodepng_malloc(h * ((w * bpp + 7) / 8)); - if(!padded) error = 83; /*alloc fail*/ - if(!error) - { - addPaddingBits(padded, in, ((w * bpp + 7) / 8) * 8, w * bpp, h); - error = filter(*out, padded, w, h, &info_png->color, settings); - } - lodepng_free(padded); - } - else - { - /*we can immediatly filter into the out buffer, no other steps needed*/ - error = filter(*out, in, w, h, &info_png->color, settings); - } - } - } - else /*interlace_method is 1 (Adam7)*/ - { - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned char* adam7; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/ - *out = (unsigned char*)lodepng_malloc(*outsize); - if(!(*out)) error = 83; /*alloc fail*/ - - adam7 = (unsigned char*)lodepng_malloc(passstart[7]); - if(!adam7 && passstart[7]) error = 83; /*alloc fail*/ - - if(!error) - { - unsigned i; - - Adam7_interlace(adam7, in, w, h, bpp); - for(i = 0; i < 7; i++) - { - if(bpp < 8) - { - unsigned char* padded = (unsigned char*)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]); - if(!padded) ERROR_BREAK(83); /*alloc fail*/ - addPaddingBits(padded, &adam7[passstart[i]], - ((passw[i] * bpp + 7) / 8) * 8, passw[i] * bpp, passh[i]); - error = filter(&(*out)[filter_passstart[i]], padded, - passw[i], passh[i], &info_png->color, settings); - lodepng_free(padded); - } - else - { - error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]], - passw[i], passh[i], &info_png->color, settings); - } - - if(error) break; - } - } - - lodepng_free(adam7); - } - - return error; -} - -/* -palette must have 4 * palettesize bytes allocated, and given in format RGBARGBARGBARGBA... -returns 0 if the palette is opaque, -returns 1 if the palette has a single color with alpha 0 ==> color key -returns 2 if the palette is semi-translucent. -*/ -static unsigned getPaletteTranslucency(const unsigned char* palette, size_t palettesize) -{ - size_t i, key = 0; - unsigned r = 0, g = 0, b = 0; /*the value of the color with alpha 0, so long as color keying is possible*/ - for(i = 0; i < palettesize; i++) - { - if(!key && palette[4 * i + 3] == 0) - { - r = palette[4 * i + 0]; g = palette[4 * i + 1]; b = palette[4 * i + 2]; - key = 1; - i = (size_t)(-1); /*restart from beginning, to detect earlier opaque colors with key's value*/ - } - else if(palette[4 * i + 3] != 255) return 2; - /*when key, no opaque RGB may have key's RGB*/ - else if(key && r == palette[i * 4 + 0] && g == palette[i * 4 + 1] && b == palette[i * 4 + 2]) return 2; - } - return key; -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -static unsigned addUnknownChunks(ucvector* out, unsigned char* data, size_t datasize) -{ - unsigned char* inchunk = data; - while((size_t)(inchunk - data) < datasize) - { - CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk)); - out->allocsize = out->size; /*fix the allocsize again*/ - inchunk = lodepng_chunk_next(inchunk); - } - return 0; -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -unsigned lodepng_encode(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h, - LodePNGState* state) -{ - LodePNGInfo info; - ucvector outv; - unsigned char* data = 0; /*uncompressed version of the IDAT chunk data*/ - size_t datasize = 0; - - /*provide some proper output values if error will happen*/ - *out = 0; - *outsize = 0; - state->error = 0; - - lodepng_info_init(&info); - lodepng_info_copy(&info, &state->info_png); - - if((info.color.colortype == LCT_PALETTE || state->encoder.force_palette) - && (info.color.palettesize == 0 || info.color.palettesize > 256)) - { - state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/ - return state->error; - } - - if(state->encoder.auto_convert != LAC_NO) - { - state->error = lodepng_auto_choose_color(&info.color, image, w, h, &state->info_raw, - state->encoder.auto_convert); - } - if(state->error) return state->error; - - if(state->encoder.zlibsettings.btype > 2) - { - CERROR_RETURN_ERROR(state->error, 61); /*error: unexisting btype*/ - } - if(state->info_png.interlace_method > 1) - { - CERROR_RETURN_ERROR(state->error, 71); /*error: unexisting interlace mode*/ - } - - state->error = checkColorValidity(info.color.colortype, info.color.bitdepth); - if(state->error) return state->error; /*error: unexisting color type given*/ - state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth); - if(state->error) return state->error; /*error: unexisting color type given*/ - - if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) - { - unsigned char* converted; - size_t size = (w * h * lodepng_get_bpp(&info.color) + 7) / 8; - - converted = (unsigned char*)lodepng_malloc(size); - if(!converted && size) state->error = 83; /*alloc fail*/ - if(!state->error) - { - state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h, 0 /*fix_png*/); - } - if(!state->error) preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder); - lodepng_free(converted); - } - else preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder); - - ucvector_init(&outv); - while(!state->error) /*while only executed once, to break on error*/ - { -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - size_t i; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*write signature and chunks*/ - writeSignature(&outv); - /*IHDR*/ - addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*unknown chunks between IHDR and PLTE*/ - if(info.unknown_chunks_data[0]) - { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]); - if(state->error) break; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*PLTE*/ - if(info.color.colortype == LCT_PALETTE) - { - addChunk_PLTE(&outv, &info.color); - } - if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) - { - addChunk_PLTE(&outv, &info.color); - } - /*tRNS*/ - if(info.color.colortype == LCT_PALETTE && getPaletteTranslucency(info.color.palette, info.color.palettesize) != 0) - { - addChunk_tRNS(&outv, &info.color); - } - if((info.color.colortype == LCT_GREY || info.color.colortype == LCT_RGB) && info.color.key_defined) - { - addChunk_tRNS(&outv, &info.color); - } -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*bKGD (must come between PLTE and the IDAt chunks*/ - if(info.background_defined) addChunk_bKGD(&outv, &info); - /*pHYs (must come before the IDAT chunks)*/ - if(info.phys_defined) addChunk_pHYs(&outv, &info); - - /*unknown chunks between PLTE and IDAT*/ - if(info.unknown_chunks_data[1]) - { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]); - if(state->error) break; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*IDAT (multiple IDAT chunks must be consecutive)*/ - state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings); - if(state->error) break; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*tIME*/ - if(info.time_defined) addChunk_tIME(&outv, &info.time); - /*tEXt and/or zTXt*/ - for(i = 0; i < info.text_num; i++) - { - if(strlen(info.text_keys[i]) > 79) - { - state->error = 66; /*text chunk too large*/ - break; - } - if(strlen(info.text_keys[i]) < 1) - { - state->error = 67; /*text chunk too small*/ - break; - } - if(state->encoder.text_compression) - { - addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings); - } - else - { - addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]); - } - } - /*LodePNG version id in text chunk*/ - if(state->encoder.add_id) - { - unsigned alread_added_id_text = 0; - for(i = 0; i < info.text_num; i++) - { - if(!strcmp(info.text_keys[i], "LodePNG")) - { - alread_added_id_text = 1; - break; - } - } - if(alread_added_id_text == 0) - { - addChunk_tEXt(&outv, "LodePNG", VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ - } - } - /*iTXt*/ - for(i = 0; i < info.itext_num; i++) - { - if(strlen(info.itext_keys[i]) > 79) - { - state->error = 66; /*text chunk too large*/ - break; - } - if(strlen(info.itext_keys[i]) < 1) - { - state->error = 67; /*text chunk too small*/ - break; - } - addChunk_iTXt(&outv, state->encoder.text_compression, - info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i], - &state->encoder.zlibsettings); - } - - /*unknown chunks between IDAT and IEND*/ - if(info.unknown_chunks_data[2]) - { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]); - if(state->error) break; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - addChunk_IEND(&outv); - - break; /*this isn't really a while loop; no error happened so break out now!*/ - } - - lodepng_info_cleanup(&info); - lodepng_free(data); - /*instead of cleaning the vector up, give it to the output*/ - *out = outv.data; - *outsize = outv.size; - - return state->error; -} - -unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, const unsigned char* image, - unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned error; - LodePNGState state; - lodepng_state_init(&state); - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; - state.info_png.color.colortype = colortype; - state.info_png.color.bitdepth = bitdepth; - lodepng_encode(out, outsize, image, w, h, &state); - error = state.error; - lodepng_state_cleanup(&state); - return error; -} - -unsigned lodepng_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) -{ - return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8); -} - -unsigned lodepng_encode24(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) -{ - return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned lodepng_encode_file(const char* filename, const unsigned char* image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned char* buffer; - size_t buffersize; - unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth); - if(!error) error = lodepng_save_file(buffer, buffersize, filename); - lodepng_free(buffer); - return error; -} - -unsigned lodepng_encode32_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) -{ - return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8); -} - -unsigned lodepng_encode24_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) -{ - return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8); -} -#endif /*LODEPNG_COMPILE_DISK*/ - -void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings) -{ - lodepng_compress_settings_init(&settings->zlibsettings); - settings->filter_palette_zero = 1; - settings->filter_strategy = LFS_MINSUM; - settings->auto_convert = LAC_AUTO; - settings->force_palette = 0; - settings->predefined_filters = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - settings->add_id = 0; - settings->text_compression = 1; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ERROR_TEXT -/* -This returns the description of a numerical error code in English. This is also -the documentation of all the error codes. -*/ -const char* lodepng_error_text(unsigned code) -{ - switch(code) - { - case 0: return "no error, everything went ok"; - case 1: return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/ - case 10: return "end of input memory reached without huffman end code"; /*while huffman decoding*/ - case 11: return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/ - case 13: return "problem while processing dynamic deflate block"; - case 14: return "problem while processing dynamic deflate block"; - case 15: return "problem while processing dynamic deflate block"; - case 16: return "unexisting code while processing dynamic deflate block"; - case 17: return "end of out buffer memory reached while inflating"; - case 18: return "invalid distance code while inflating"; - case 19: return "end of out buffer memory reached while inflating"; - case 20: return "invalid deflate block BTYPE encountered while decoding"; - case 21: return "NLEN is not ones complement of LEN in a deflate block"; - /*end of out buffer memory reached while inflating: - This can happen if the inflated deflate data is longer than the amount of bytes required to fill up - all the pixels of the image, given the color depth and image dimensions. Something that doesn't - happen in a normal, well encoded, PNG image.*/ - case 22: return "end of out buffer memory reached while inflating"; - case 23: return "end of in buffer memory reached while inflating"; - case 24: return "invalid FCHECK in zlib header"; - case 25: return "invalid compression method in zlib header"; - case 26: return "FDICT encountered in zlib header while it's not used for PNG"; - case 27: return "PNG file is smaller than a PNG header"; - /*Checks the magic file header, the first 8 bytes of the PNG file*/ - case 28: return "incorrect PNG signature, it's no PNG or corrupted"; - case 29: return "first chunk is not the header chunk"; - case 30: return "chunk length too large, chunk broken off at end of file"; - case 31: return "illegal PNG color type or bpp"; - case 32: return "illegal PNG compression method"; - case 33: return "illegal PNG filter method"; - case 34: return "illegal PNG interlace method"; - case 35: return "chunk length of a chunk is too large or the chunk too small"; - case 36: return "illegal PNG filter type encountered"; - case 37: return "illegal bit depth for this color type given"; - case 38: return "the palette is too big"; /*more than 256 colors*/ - case 39: return "more palette alpha values given in tRNS chunk than there are colors in the palette"; - case 40: return "tRNS chunk has wrong size for greyscale image"; - case 41: return "tRNS chunk has wrong size for RGB image"; - case 42: return "tRNS chunk appeared while it was not allowed for this color type"; - case 43: return "bKGD chunk has wrong size for palette image"; - case 44: return "bKGD chunk has wrong size for greyscale image"; - case 45: return "bKGD chunk has wrong size for RGB image"; - /*Is the palette too small?*/ - case 46: return "a value in indexed image is larger than the palette size (bitdepth = 8)"; - /*Is the palette too small?*/ - case 47: return "a value in indexed image is larger than the palette size (bitdepth < 8)"; - /*the input data is empty, maybe a PNG file doesn't exist or is in the wrong path*/ - case 48: return "empty input or file doesn't exist"; - case 49: return "jumped past memory while generating dynamic huffman tree"; - case 50: return "jumped past memory while generating dynamic huffman tree"; - case 51: return "jumped past memory while inflating huffman block"; - case 52: return "jumped past memory while inflating"; - case 53: return "size of zlib data too small"; - case 54: return "repeat symbol in tree while there was no value symbol yet"; - /*jumped past tree while generating huffman tree, this could be when the - tree will have more leaves than symbols after generating it out of the - given lenghts. They call this an oversubscribed dynamic bit lengths tree in zlib.*/ - case 55: return "jumped past tree while generating huffman tree"; - case 56: return "given output image colortype or bitdepth not supported for color conversion"; - case 57: return "invalid CRC encountered (checking CRC can be disabled)"; - case 58: return "invalid ADLER32 encountered (checking ADLER32 can be disabled)"; - case 59: return "requested color conversion not supported"; - case 60: return "invalid window size given in the settings of the encoder (must be 0-32768)"; - case 61: return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)"; - /*LodePNG leaves the choice of RGB to greyscale conversion formula to the user.*/ - case 62: return "conversion from color to greyscale not supported"; - case 63: return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk"; /*(2^31-1)*/ - /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/ - case 64: return "the length of the END symbol 256 in the Huffman tree is 0"; - case 66: return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes"; - case 67: return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte"; - case 68: return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors"; - case 69: return "unknown chunk type with 'critical' flag encountered by the decoder"; - case 71: return "unexisting interlace mode given to encoder (must be 0 or 1)"; - case 72: return "while decoding, unexisting compression method encountering in zTXt or iTXt chunk (it must be 0)"; - case 73: return "invalid tIME chunk size"; - case 74: return "invalid pHYs chunk size"; - /*length could be wrong, or data chopped off*/ - case 75: return "no null termination char found while decoding text chunk"; - case 76: return "iTXt chunk too short to contain required bytes"; - case 77: return "integer overflow in buffer size"; - case 78: return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/ - case 79: return "failed to open file for writing"; - case 80: return "tried creating a tree of 0 symbols"; - case 81: return "lazy matching at pos 0 is impossible"; - case 82: return "color conversion to palette requested while a color isn't in palette"; - case 83: return "memory allocation failed"; - case 84: return "given image too small to contain all pixels to be encoded"; - case 85: return "internal color conversion bug"; - case 86: return "impossible offset in lz77 encoding (internal bug)"; - case 87: return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined"; - case 88: return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy"; - case 89: return "text chunk keyword too short or long: must have size 1-79"; - /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/ - case 90: return "windowsize must be a power of two"; - } - return "unknown error code"; -} -#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // C++ Wrapper // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_CPP -namespace lodepng -{ - -#ifdef LODEPNG_COMPILE_DISK -void load_file(std::vector& buffer, const std::string& filename) -{ - std::ifstream file(filename.c_str(), std::ios::in|std::ios::binary|std::ios::ate); - - /*get filesize*/ - std::streamsize size = 0; - if(file.seekg(0, std::ios::end).good()) size = file.tellg(); - if(file.seekg(0, std::ios::beg).good()) size -= file.tellg(); - - /*read contents of the file into the vector*/ - buffer.resize(size_t(size)); - if(size > 0) file.read((char*)(&buffer[0]), size); -} - -/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ -void save_file(const std::vector& buffer, const std::string& filename) -{ - std::ofstream file(filename.c_str(), std::ios::out|std::ios::binary); - file.write(buffer.empty() ? 0 : (char*)&buffer[0], std::streamsize(buffer.size())); -} -#endif //LODEPNG_COMPILE_DISK - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_DECODER -unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGDecompressSettings& settings) -{ - unsigned char* buffer = 0; - size_t buffersize = 0; - unsigned error = zlib_decompress(&buffer, &buffersize, in, insize, &settings); - if(buffer) - { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned decompress(std::vector& out, const std::vector& in, - const LodePNGDecompressSettings& settings) -{ - return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings); -} -#endif //LODEPNG_COMPILE_DECODER - -#ifdef LODEPNG_COMPILE_ENCODER -unsigned compress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGCompressSettings& settings) -{ - unsigned char* buffer = 0; - size_t buffersize = 0; - unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings); - if(buffer) - { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned compress(std::vector& out, const std::vector& in, - const LodePNGCompressSettings& settings) -{ - return compress(out, in.empty() ? 0 : &in[0], in.size(), settings); -} -#endif //LODEPNG_COMPILE_ENCODER -#endif //LODEPNG_COMPILE_ZLIB - - -#ifdef LODEPNG_COMPILE_PNG - -State::State() -{ - lodepng_state_init(this); -} - -State::State(const State& other) -{ - lodepng_state_init(this); - lodepng_state_copy(this, &other); -} - -State::~State() -{ - lodepng_state_cleanup(this); -} - -State& State::operator=(const State& other) -{ - lodepng_state_copy(this, &other); - return *this; -} - -#ifdef LODEPNG_COMPILE_DECODER - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, const unsigned char* in, - size_t insize, LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned char* buffer; - unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth); - if(buffer && !error) - { - State state; - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; - size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const std::vector& in, LodePNGColorType colortype, unsigned bitdepth) -{ - return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth); -} - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const unsigned char* in, size_t insize) -{ - unsigned char* buffer = NULL; - unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize); - if(buffer && !error) - { - size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - } - lodepng_free(buffer); - return error; -} - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const std::vector& in) -{ - return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size()); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned decode(std::vector& out, unsigned& w, unsigned& h, const std::string& filename, - LodePNGColorType colortype, unsigned bitdepth) -{ - std::vector buffer; - load_file(buffer, filename); - return decode(out, w, h, buffer, colortype, bitdepth); -} -#endif //LODEPNG_COMPILE_DECODER -#endif //LODEPNG_COMPILE_DISK - -#ifdef LODEPNG_COMPILE_ENCODER -unsigned encode(std::vector& out, const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned char* buffer; - size_t buffersize; - unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth); - if(buffer) - { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; - return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); -} - -unsigned encode(std::vector& out, - const unsigned char* in, unsigned w, unsigned h, - State& state) -{ - unsigned char* buffer; - size_t buffersize; - unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state); - if(buffer) - { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - State& state) -{ - if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84; - return encode(out, in.empty() ? 0 : &in[0], w, h, state); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned encode(const std::string& filename, - const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - std::vector buffer; - unsigned error = encode(buffer, in, w, h, colortype, bitdepth); - if(!error) save_file(buffer, filename); - return error; -} - -unsigned encode(const std::string& filename, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; - return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); -} -#endif //LODEPNG_COMPILE_DISK -#endif //LODEPNG_COMPILE_ENCODER -#endif //LODEPNG_COMPILE_PNG -} //namespace lodepng -#endif /*LODEPNG_COMPILE_CPP*/ diff --git a/lib/lodepng/lodepng.h b/lib/lodepng/lodepng.h deleted file mode 100644 index c497a5c608..0000000000 --- a/lib/lodepng/lodepng.h +++ /dev/null @@ -1,1716 +0,0 @@ -/* -LodePNG version 20131222 - -Copyright (c) 2005-2013 Lode Vandevenne - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. -*/ - -#ifndef LODEPNG_H -#define LODEPNG_H - -#include /*for size_t*/ - -#ifdef __cplusplus -#include -#include -#endif /*__cplusplus*/ - -/* -The following #defines are used to create code sections. They can be disabled -to disable code sections, which can give faster compile time and smaller binary. -The "NO_COMPILE" defines are designed to be used to pass as defines to the -compiler command to disable them without modifying this header, e.g. --DLODEPNG_NO_COMPILE_ZLIB for gcc. -*/ -/*deflate & zlib. If disabled, you must specify alternative zlib functions in -the custom_zlib field of the compress and decompress settings*/ -#ifndef LODEPNG_NO_COMPILE_ZLIB -#define LODEPNG_COMPILE_ZLIB -#endif -/*png encoder and png decoder*/ -#ifndef LODEPNG_NO_COMPILE_PNG -#define LODEPNG_COMPILE_PNG -#endif -/*deflate&zlib decoder and png decoder*/ -#ifndef LODEPNG_NO_COMPILE_DECODER -#define LODEPNG_COMPILE_DECODER -#endif -/*deflate&zlib encoder and png encoder*/ -#ifndef LODEPNG_NO_COMPILE_ENCODER -#define LODEPNG_COMPILE_ENCODER -#endif -/*the optional built in harddisk file loading and saving functions*/ -#ifndef LODEPNG_NO_COMPILE_DISK -#define LODEPNG_COMPILE_DISK -#endif -/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/ -#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS -#define LODEPNG_COMPILE_ANCILLARY_CHUNKS -#endif -/*ability to convert error numerical codes to English text string*/ -#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT -#define LODEPNG_COMPILE_ERROR_TEXT -#endif -/*Compile the default allocators (C's free, malloc and realloc). If you disable this, -you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your -source files with custom allocators.*/ -#ifndef LODEPNG_NO_COMPILE_ALLOCATORS -#define LODEPNG_COMPILE_ALLOCATORS -#endif -/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/ -#ifdef __cplusplus -#ifndef LODEPNG_NO_COMPILE_CPP -#define LODEPNG_COMPILE_CPP -#endif -#endif - -#ifdef LODEPNG_COMPILE_PNG -/*The PNG color types (also used for raw).*/ -typedef enum LodePNGColorType -{ - LCT_GREY = 0, /*greyscale: 1,2,4,8,16 bit*/ - LCT_RGB = 2, /*RGB: 8,16 bit*/ - LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/ - LCT_GREY_ALPHA = 4, /*greyscale with alpha: 8,16 bit*/ - LCT_RGBA = 6 /*RGB with alpha: 8,16 bit*/ -} LodePNGColorType; - -#ifdef LODEPNG_COMPILE_DECODER -/* -Converts PNG data in memory to raw pixel data. -out: Output parameter. Pointer to buffer that will contain the raw pixel data. - After decoding, its size is w * h * (bytes per pixel) bytes larger than - initially. Bytes per pixel depends on colortype and bitdepth. - Must be freed after usage with free(*out). - Note: for 16-bit per channel colors, uses big endian format like PNG does. -w: Output parameter. Pointer to width of pixel data. -h: Output parameter. Pointer to height of pixel data. -in: Memory buffer with the PNG file. -insize: size of the in buffer. -colortype: the desired color type for the raw output image. See explanation on PNG color types. -bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types. -Return value: LodePNG error code (0 means no error). -*/ -unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/ -unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize); - -/*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/ -unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize); - -#ifdef LODEPNG_COMPILE_DISK -/* -Load PNG from disk, from file with given name. -Same as the other decode functions, but instead takes a filename as input. -*/ -unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, - const char* filename, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image.*/ -unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, - const char* filename); - -/*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image.*/ -unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, - const char* filename); -#endif /*LODEPNG_COMPILE_DISK*/ -#endif /*LODEPNG_COMPILE_DECODER*/ - - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Converts raw pixel data into a PNG image in memory. The colortype and bitdepth - of the output PNG image cannot be chosen, they are automatically determined - by the colortype, bitdepth and content of the input pixel data. - Note: for 16-bit per channel colors, needs big endian format like PNG does. -out: Output parameter. Pointer to buffer that will contain the PNG image data. - Must be freed after usage with free(*out). -outsize: Output parameter. Pointer to the size in bytes of the out buffer. -image: The raw pixel data to encode. The size of this buffer should be - w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth. -w: width of the raw pixel data in pixels. -h: height of the raw pixel data in pixels. -colortype: the color type of the raw input image. See explanation on PNG color types. -bitdepth: the bit depth of the raw input image. See explanation on PNG color types. -Return value: LodePNG error code (0 means no error). -*/ -unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/ -unsigned lodepng_encode32(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h); - -/*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/ -unsigned lodepng_encode24(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h); - -#ifdef LODEPNG_COMPILE_DISK -/* -Converts raw pixel data into a PNG file on disk. -Same as the other encode functions, but instead takes a filename as output. -NOTE: This overwrites existing files without warning! -*/ -unsigned lodepng_encode_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image.*/ -unsigned lodepng_encode32_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h); - -/*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image.*/ -unsigned lodepng_encode24_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h); -#endif /*LODEPNG_COMPILE_DISK*/ -#endif /*LODEPNG_COMPILE_ENCODER*/ - - -#ifdef LODEPNG_COMPILE_CPP -namespace lodepng -{ -#ifdef LODEPNG_COMPILE_DECODER -/*Same as lodepng_decode_memory, but decodes to an std::vector.*/ -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const unsigned char* in, size_t insize, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const std::vector& in, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#ifdef LODEPNG_COMPILE_DISK -/* -Converts PNG file from disk to raw pixel data in memory. -Same as the other decode functions, but instead takes a filename as input. -*/ -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const std::string& filename, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#endif //LODEPNG_COMPILE_DISK -#endif //LODEPNG_COMPILE_DECODER - -#ifdef LODEPNG_COMPILE_ENCODER -/*Same as lodepng_encode_memory, but encodes to an std::vector.*/ -unsigned encode(std::vector& out, - const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#ifdef LODEPNG_COMPILE_DISK -/* -Converts 32-bit RGBA raw pixel data into a PNG file on disk. -Same as the other encode functions, but instead takes a filename as output. -NOTE: This overwrites existing files without warning! -*/ -unsigned encode(const std::string& filename, - const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned encode(const std::string& filename, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#endif //LODEPNG_COMPILE_DISK -#endif //LODEPNG_COMPILE_ENCODER -} //namespace lodepng -#endif /*LODEPNG_COMPILE_CPP*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ERROR_TEXT -/*Returns an English description of the numerical error code.*/ -const char* lodepng_error_text(unsigned code); -#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ - -#ifdef LODEPNG_COMPILE_DECODER -/*Settings for zlib decompression*/ -typedef struct LodePNGDecompressSettings LodePNGDecompressSettings; -struct LodePNGDecompressSettings -{ - unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/ - - /*use custom zlib decoder instead of built in one (default: null)*/ - unsigned (*custom_zlib)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGDecompressSettings*); - /*use custom deflate decoder instead of built in one (default: null) - if custom_zlib is used, custom_deflate is ignored since only the built in - zlib function will call custom_deflate*/ - unsigned (*custom_inflate)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGDecompressSettings*); - - const void* custom_context; /*optional custom settings for custom functions*/ -}; - -extern const LodePNGDecompressSettings lodepng_default_decompress_settings; -void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Settings for zlib compression. Tweaking these settings tweaks the balance -between speed and compression ratio. -*/ -typedef struct LodePNGCompressSettings LodePNGCompressSettings; -struct LodePNGCompressSettings /*deflate = compress*/ -{ - /*LZ77 related settings*/ - unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/ - unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/ - unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Typical value: 2048.*/ - unsigned minmatch; /*mininum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/ - unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/ - unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/ - - /*use custom zlib encoder instead of built in one (default: null)*/ - unsigned (*custom_zlib)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGCompressSettings*); - /*use custom deflate encoder instead of built in one (default: null) - if custom_zlib is used, custom_deflate is ignored since only the built in - zlib function will call custom_deflate*/ - unsigned (*custom_deflate)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGCompressSettings*); - - const void* custom_context; /*optional custom settings for custom functions*/ -}; - -extern const LodePNGCompressSettings lodepng_default_compress_settings; -void lodepng_compress_settings_init(LodePNGCompressSettings* settings); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_PNG -/* -Color mode of an image. Contains all information required to decode the pixel -bits to RGBA colors. This information is the same as used in the PNG file -format, and is used both for PNG and raw image data in LodePNG. -*/ -typedef struct LodePNGColorMode -{ - /*header (IHDR)*/ - LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/ - unsigned bitdepth; /*bits per sample, see PNG standard or documentation further in this header file*/ - - /* - palette (PLTE and tRNS) - - Dynamically allocated with the colors of the palette, including alpha. - When encoding a PNG, to store your colors in the palette of the LodePNGColorMode, first use - lodepng_palette_clear, then for each color use lodepng_palette_add. - If you encode an image without alpha with palette, don't forget to put value 255 in each A byte of the palette. - - When decoding, by default you can ignore this palette, since LodePNG already - fills the palette colors in the pixels of the raw RGBA output. - - The palette is only supported for color type 3. - */ - unsigned char* palette; /*palette in RGBARGBA... order. When allocated, must be either 0, or have size 1024*/ - size_t palettesize; /*palette size in number of colors (amount of bytes is 4 * palettesize)*/ - - /* - transparent color key (tRNS) - - This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit. - For greyscale PNGs, r, g and b will all 3 be set to the same. - - When decoding, by default you can ignore this information, since LodePNG sets - pixels with this key to transparent already in the raw RGBA output. - - The color key is only supported for color types 0 and 2. - */ - unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/ - unsigned key_r; /*red/greyscale component of color key*/ - unsigned key_g; /*green component of color key*/ - unsigned key_b; /*blue component of color key*/ -} LodePNGColorMode; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_color_mode_init(LodePNGColorMode* info); -void lodepng_color_mode_cleanup(LodePNGColorMode* info); -/*return value is error code (0 means no error)*/ -unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source); - -void lodepng_palette_clear(LodePNGColorMode* info); -/*add 1 color to the palette*/ -unsigned lodepng_palette_add(LodePNGColorMode* info, - unsigned char r, unsigned char g, unsigned char b, unsigned char a); - -/*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/ -unsigned lodepng_get_bpp(const LodePNGColorMode* info); -/*get the amount of color channels used, based on colortype in the struct. -If a palette is used, it counts as 1 channel.*/ -unsigned lodepng_get_channels(const LodePNGColorMode* info); -/*is it a greyscale type? (only colortype 0 or 4)*/ -unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info); -/*has it got an alpha channel? (only colortype 2 or 6)*/ -unsigned lodepng_is_alpha_type(const LodePNGColorMode* info); -/*has it got a palette? (only colortype 3)*/ -unsigned lodepng_is_palette_type(const LodePNGColorMode* info); -/*only returns true if there is a palette and there is a value in the palette with alpha < 255. -Loops through the palette to check this.*/ -unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info); -/* -Check if the given color info indicates the possibility of having non-opaque pixels in the PNG image. -Returns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels). -Returns false if the image can only have opaque pixels. -In detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values, -or if "key_defined" is true. -*/ -unsigned lodepng_can_have_alpha(const LodePNGColorMode* info); -/*Returns the byte size of a raw image buffer with given width, height and color mode*/ -size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*The information of a Time chunk in PNG.*/ -typedef struct LodePNGTime -{ - unsigned year; /*2 bytes used (0-65535)*/ - unsigned month; /*1-12*/ - unsigned day; /*1-31*/ - unsigned hour; /*0-23*/ - unsigned minute; /*0-59*/ - unsigned second; /*0-60 (to allow for leap seconds)*/ -} LodePNGTime; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/*Information about the PNG image, except pixels, width and height.*/ -typedef struct LodePNGInfo -{ - /*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/ - unsigned compression_method;/*compression method of the original file. Always 0.*/ - unsigned filter_method; /*filter method of the original file*/ - unsigned interlace_method; /*interlace method of the original file*/ - LodePNGColorMode color; /*color type and bits, palette and transparency of the PNG file*/ - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /* - suggested background color chunk (bKGD) - This color uses the same color mode as the PNG (except alpha channel), which can be 1-bit to 16-bit. - - For greyscale PNGs, r, g and b will all 3 be set to the same. When encoding - the encoder writes the red one. For palette PNGs: When decoding, the RGB value - will be stored, not a palette index. But when encoding, specify the index of - the palette in background_r, the other two are then ignored. - - The decoder does not use this background color to edit the color of pixels. - */ - unsigned background_defined; /*is a suggested background color given?*/ - unsigned background_r; /*red component of suggested background color*/ - unsigned background_g; /*green component of suggested background color*/ - unsigned background_b; /*blue component of suggested background color*/ - - /* - non-international text chunks (tEXt and zTXt) - - The char** arrays each contain num strings. The actual messages are in - text_strings, while text_keys are keywords that give a short description what - the actual text represents, e.g. Title, Author, Description, or anything else. - - A keyword is minimum 1 character and maximum 79 characters long. It's - discouraged to use a single line length longer than 79 characters for texts. - - Don't allocate these text buffers yourself. Use the init/cleanup functions - correctly and use lodepng_add_text and lodepng_clear_text. - */ - size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/ - char** text_keys; /*the keyword of a text chunk (e.g. "Comment")*/ - char** text_strings; /*the actual text*/ - - /* - international text chunks (iTXt) - Similar to the non-international text chunks, but with additional strings - "langtags" and "transkeys". - */ - size_t itext_num; /*the amount of international texts in this PNG*/ - char** itext_keys; /*the English keyword of the text chunk (e.g. "Comment")*/ - char** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/ - char** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/ - char** itext_strings; /*the actual international text - UTF-8 string*/ - - /*time chunk (tIME)*/ - unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/ - LodePNGTime time; - - /*phys chunk (pHYs)*/ - unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/ - unsigned phys_x; /*pixels per unit in x direction*/ - unsigned phys_y; /*pixels per unit in y direction*/ - unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/ - - /* - unknown chunks - There are 3 buffers, one for each position in the PNG where unknown chunks can appear - each buffer contains all unknown chunks for that position consecutively - The 3 buffers are the unknown chunks between certain critical chunks: - 0: IHDR-PLTE, 1: PLTE-IDAT, 2: IDAT-IEND - Do not allocate or traverse this data yourself. Use the chunk traversing functions declared - later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct. - */ - unsigned char* unknown_chunks_data[3]; - size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGInfo; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_info_init(LodePNGInfo* info); -void lodepng_info_cleanup(LodePNGInfo* info); -/*return value is error code (0 means no error)*/ -unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -void lodepng_clear_text(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/ -unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str); /*push back both texts at once*/ - -void lodepng_clear_itext(LodePNGInfo* info); /*use this to clear the itexts again after you filled them in*/ -unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, - const char* transkey, const char* str); /*push back the 4 texts of 1 chunk at once*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/* -Converts raw buffer from one color type to another color type, based on -LodePNGColorMode structs to describe the input and output color type. -See the reference manual at the end of this header file to see which color conversions are supported. -return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported) -The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel -of the output color type (lodepng_get_bpp) -The fix_png value works as described in struct LodePNGDecoderSettings. -Note: for 16-bit per channel colors, uses big endian format like PNG does. -*/ -unsigned lodepng_convert(unsigned char* out, const unsigned char* in, - LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, - unsigned w, unsigned h, unsigned fix_png); - -#ifdef LODEPNG_COMPILE_DECODER -/* -Settings for the decoder. This contains settings for the PNG and the Zlib -decoder, but not the Info settings from the Info structs. -*/ -typedef struct LodePNGDecoderSettings -{ - LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/ - - unsigned ignore_crc; /*ignore CRC checksums*/ - /* - The fix_png setting, if 1, makes the decoder tolerant towards some PNG images - that do not correctly follow the PNG specification. This only supports errors - that are fixable, were found in images that are actually used on the web, and - are silently tolerated by other decoders as well. Currently only one such fix - is implemented: if a palette index is out of bounds given the palette size, - interpret it as opaque black. - By default this value is 0, which makes it stop with an error on such images. - */ - unsigned fix_png; - unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/ - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/ - /*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/ - unsigned remember_unknown_chunks; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGDecoderSettings; - -void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/ -typedef enum LodePNGFilterStrategy -{ - /*every filter at zero*/ - LFS_ZERO, - /*Use filter that gives minumum sum, as described in the official PNG filter heuristic.*/ - LFS_MINSUM, - /*Use the filter type that gives smallest Shannon entropy for this scanline. Depending - on the image, this is better or worse than minsum.*/ - LFS_ENTROPY, - /* - Brute-force-search PNG filters by compressing each filter for each scanline. - Experimental, very slow, and only rarely gives better compression than MINSUM. - */ - LFS_BRUTE_FORCE, - /*use predefined_filters buffer: you specify the filter type for each scanline*/ - LFS_PREDEFINED -} LodePNGFilterStrategy; - -/*automatically use color type with less bits per pixel if losslessly possible. Default: LAC_AUTO*/ -typedef enum LodePNGAutoConvert -{ - LAC_NO, /*use color type user requested*/ - LAC_ALPHA, /*use color type user requested, but if only opaque pixels and RGBA or grey+alpha, use RGB or grey*/ - LAC_AUTO, /*use PNG color type that can losslessly represent the uncompressed image the smallest possible*/ - /* - like AUTO, but do not choose 1, 2 or 4 bit per pixel types. - sometimes a PNG image compresses worse if less than 8 bits per pixels. - */ - LAC_AUTO_NO_NIBBLES, - /* - like AUTO, but never choose palette color type. For small images, encoding - the palette may take more bytes than what is gained. Note that AUTO also - already prevents encoding the palette for extremely small images, but that may - not be sufficient because due to the compression it cannot predict when to - switch. - */ - LAC_AUTO_NO_PALETTE, - LAC_AUTO_NO_NIBBLES_NO_PALETTE -} LodePNGAutoConvert; - - -/* -Automatically chooses color type that gives smallest amount of bits in the -output image, e.g. grey if there are only greyscale pixels, palette if there -are less than 256 colors, ... -The auto_convert parameter allows limiting it to not use palette, ... -*/ -unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out, - const unsigned char* image, unsigned w, unsigned h, - const LodePNGColorMode* mode_in, - LodePNGAutoConvert auto_convert); - -/*Settings for the encoder.*/ -typedef struct LodePNGEncoderSettings -{ - LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/ - - LodePNGAutoConvert auto_convert; /*how to automatically choose output PNG color type, if at all*/ - - /*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than - 8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to - completely follow the official PNG heuristic, filter_palette_zero must be true and - filter_strategy must be LFS_MINSUM*/ - unsigned filter_palette_zero; - /*Which filter strategy to use when not using zeroes due to filter_palette_zero. - Set filter_palette_zero to 0 to ensure always using your chosen strategy. Default: LFS_MINSUM*/ - LodePNGFilterStrategy filter_strategy; - /*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with - the same length as the amount of scanlines in the image, and each value must <= 5. You - have to cleanup this buffer, LodePNG will never free it. Don't forget that filter_palette_zero - must be set to 0 to ensure this is also used on palette or low bitdepth images.*/ - const unsigned char* predefined_filters; - - /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). - If colortype is 3, PLTE is _always_ created.*/ - unsigned force_palette; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*add LodePNG identifier and version as a text chunk, for debugging*/ - unsigned add_id; - /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/ - unsigned text_compression; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGEncoderSettings; - -void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings); -#endif /*LODEPNG_COMPILE_ENCODER*/ - - -#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) -/*The settings, state and information for extended encoding and decoding.*/ -typedef struct LodePNGState -{ -#ifdef LODEPNG_COMPILE_DECODER - LodePNGDecoderSettings decoder; /*the decoding settings*/ -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER - LodePNGEncoderSettings encoder; /*the encoding settings*/ -#endif /*LODEPNG_COMPILE_ENCODER*/ - LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/ - LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ - unsigned error; -#ifdef LODEPNG_COMPILE_CPP - //For the lodepng::State subclass. - virtual ~LodePNGState(){} -#endif -} LodePNGState; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_state_init(LodePNGState* state); -void lodepng_state_cleanup(LodePNGState* state); -void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source); -#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ - -#ifdef LODEPNG_COMPILE_DECODER -/* -Same as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and -getting much more information about the PNG image and color mode. -*/ -unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize); - -/* -Read the PNG header, but not the actual data. This returns only the information -that is in the header chunk of the PNG, such as width, height and color type. The -information is placed in the info_png field of the LodePNGState. -*/ -unsigned lodepng_inspect(unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize); -#endif /*LODEPNG_COMPILE_DECODER*/ - - -#ifdef LODEPNG_COMPILE_ENCODER -/*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/ -unsigned lodepng_encode(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h, - LodePNGState* state); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/* -The lodepng_chunk functions are normally not needed, except to traverse the -unknown chunks stored in the LodePNGInfo struct, or add new ones to it. -It also allows traversing the chunks of an encoded PNG file yourself. - -PNG standard chunk naming conventions: -First byte: uppercase = critical, lowercase = ancillary -Second byte: uppercase = public, lowercase = private -Third byte: must be uppercase -Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy -*/ - -/*get the length of the data of the chunk. Total chunk length has 12 bytes more.*/ -unsigned lodepng_chunk_length(const unsigned char* chunk); - -/*puts the 4-byte type in null terminated string*/ -void lodepng_chunk_type(char type[5], const unsigned char* chunk); - -/*check if the type is the given type*/ -unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type); - -/*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/ -unsigned char lodepng_chunk_ancillary(const unsigned char* chunk); - -/*0: public, 1: private (see PNG standard)*/ -unsigned char lodepng_chunk_private(const unsigned char* chunk); - -/*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/ -unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk); - -/*get pointer to the data of the chunk, where the input points to the header of the chunk*/ -unsigned char* lodepng_chunk_data(unsigned char* chunk); -const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk); - -/*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/ -unsigned lodepng_chunk_check_crc(const unsigned char* chunk); - -/*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/ -void lodepng_chunk_generate_crc(unsigned char* chunk); - -/*iterate to next chunks. don't use on IEND chunk, as there is no next chunk then*/ -unsigned char* lodepng_chunk_next(unsigned char* chunk); -const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk); - -/* -Appends chunk to the data in out. The given chunk should already have its chunk header. -The out variable and outlength are updated to reflect the new reallocated buffer. -Returns error code (0 if it went ok) -*/ -unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk); - -/* -Appends new chunk to out. The chunk to append is given by giving its length, type -and data separately. The type is a 4-letter string. -The out variable and outlength are updated to reflect the new reallocated buffer. -Returne error code (0 if it went ok) -*/ -unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, - const char* type, const unsigned char* data); - - -/*Calculate CRC32 of buffer*/ -unsigned lodepng_crc32(const unsigned char* buf, size_t len); -#endif /*LODEPNG_COMPILE_PNG*/ - - -#ifdef LODEPNG_COMPILE_ZLIB -/* -This zlib part can be used independently to zlib compress and decompress a -buffer. It cannot be used to create gzip files however, and it only supports the -part of zlib that is required for PNG, it does not support dictionaries. -*/ - -#ifdef LODEPNG_COMPILE_DECODER -/*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/ -unsigned lodepng_inflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings); - -/* -Decompresses Zlib data. Reallocates the out buffer and appends the data. The -data must be according to the zlib specification. -Either, *out must be NULL and *outsize must be 0, or, *out must be a valid -buffer and *outsize its size in bytes. out must be freed by user after usage. -*/ -unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Compresses data with Zlib. Reallocates the out buffer and appends the data. -Zlib adds a small header and trailer around the deflate data. -The data is output in the format of the zlib specification. -Either, *out must be NULL and *outsize must be 0, or, *out must be a valid -buffer and *outsize its size in bytes. out must be freed by user after usage. -*/ -unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings); - -/* -Find length-limited Huffman code for given frequencies. This function is in the -public interface only for tests, it's used internally by lodepng_deflate. -*/ -unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, - size_t numcodes, unsigned maxbitlen); - -/*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/ -unsigned lodepng_deflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings); - -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_ZLIB*/ - -#ifdef LODEPNG_COMPILE_DISK -/* -Load a file from disk into buffer. The function allocates the out buffer, and -after usage you should free it. -out: output parameter, contains pointer to loaded buffer. -outsize: output parameter, size of the allocated out buffer -filename: the path to the file to load -return value: error code (0 means ok) -*/ -unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename); - -/* -Save a file from buffer to disk. Warning, if it exists, this function overwrites -the file without warning! -buffer: the buffer to write -buffersize: size of the buffer to write -filename: the path to the file to save to -return value: error code (0 means ok) -*/ -unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename); -#endif /*LODEPNG_COMPILE_DISK*/ - -#ifdef LODEPNG_COMPILE_CPP -//The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. -namespace lodepng -{ -#ifdef LODEPNG_COMPILE_PNG -class State : public LodePNGState -{ - public: - State(); - State(const State& other); - virtual ~State(); - State& operator=(const State& other); -}; - -#ifdef LODEPNG_COMPILE_DECODER -//Same as other lodepng::decode, but using a State for more settings and information. -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const unsigned char* in, size_t insize); -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const std::vector& in); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -//Same as other lodepng::encode, but using a State for more settings and information. -unsigned encode(std::vector& out, - const unsigned char* in, unsigned w, unsigned h, - State& state); -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - State& state); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DISK -/* -Load a file from disk into an std::vector. If the vector is empty, then either -the file doesn't exist or is an empty file. -*/ -void load_file(std::vector& buffer, const std::string& filename); - -/* -Save the binary data in an std::vector to a file on disk. The file is overwritten -without warning. -*/ -void save_file(const std::vector& buffer, const std::string& filename); -#endif //LODEPNG_COMPILE_DISK -#endif //LODEPNG_COMPILE_PNG - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_DECODER -//Zlib-decompress an unsigned char buffer -unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); - -//Zlib-decompress an std::vector -unsigned decompress(std::vector& out, const std::vector& in, - const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); -#endif //LODEPNG_COMPILE_DECODER - -#ifdef LODEPNG_COMPILE_ENCODER -//Zlib-compress an unsigned char buffer -unsigned compress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGCompressSettings& settings = lodepng_default_compress_settings); - -//Zlib-compress an std::vector -unsigned compress(std::vector& out, const std::vector& in, - const LodePNGCompressSettings& settings = lodepng_default_compress_settings); -#endif //LODEPNG_COMPILE_ENCODER -#endif //LODEPNG_COMPILE_ZLIB -} //namespace lodepng -#endif /*LODEPNG_COMPILE_CPP*/ - -/* -TODO: -[.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often -[.] check compatibility with vareous compilers - done but needs to be redone for every newer version -[X] converting color to 16-bit per channel types -[ ] read all public PNG chunk types (but never let the color profile and gamma ones touch RGB values) -[ ] make sure encoder generates no chunks with size > (2^31)-1 -[ ] partial decoding (stream processing) -[X] let the "isFullyOpaque" function check color keys and transparent palettes too -[X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" -[ ] don't stop decoding on errors like 69, 57, 58 (make warnings) -[ ] make option to choose if the raw image with non multiple of 8 bits per scanline should have padding bits or not -[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes -*/ - -#endif /*LODEPNG_H inclusion guard*/ - -/* -LodePNG Documentation ---------------------- - -0. table of contents --------------------- - - 1. about - 1.1. supported features - 1.2. features not supported - 2. C and C++ version - 3. security - 4. decoding - 5. encoding - 6. color conversions - 6.1. PNG color types - 6.2. color conversions - 6.3. padding bits - 6.4. A note about 16-bits per channel and endianness - 7. error values - 8. chunks and PNG editing - 9. compiler support - 10. examples - 10.1. decoder C++ example - 10.2. decoder C example - 11. changes - 12. contact information - - -1. about --------- - -PNG is a file format to store raster images losslessly with good compression, -supporting different color types and alpha channel. - -LodePNG is a PNG codec according to the Portable Network Graphics (PNG) -Specification (Second Edition) - W3C Recommendation 10 November 2003. - -The specifications used are: - -*) Portable Network Graphics (PNG) Specification (Second Edition): - http://www.w3.org/TR/2003/REC-PNG-20031110 -*) RFC 1950 ZLIB Compressed Data Format version 3.3: - http://www.gzip.org/zlib/rfc-zlib.html -*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3: - http://www.gzip.org/zlib/rfc-deflate.html - -The most recent version of LodePNG can currently be found at -http://lodev.org/lodepng/ - -LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds -extra functionality. - -LodePNG exists out of two files: --lodepng.h: the header file for both C and C++ --lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage - -If you want to start using LodePNG right away without reading this doc, get the -examples from the LodePNG website to see how to use it in code, or check the -smaller examples in chapter 13 here. - -LodePNG is simple but only supports the basic requirements. To achieve -simplicity, the following design choices were made: There are no dependencies -on any external library. There are functions to decode and encode a PNG with -a single function call, and extended versions of these functions taking a -LodePNGState struct allowing to specify or get more information. By default -the colors of the raw image are always RGB or RGBA, no matter what color type -the PNG file uses. To read and write files, there are simple functions to -convert the files to/from buffers in memory. - -This all makes LodePNG suitable for loading textures in games, demos and small -programs, ... It's less suitable for full fledged image editors, loading PNGs -over network (it requires all the image data to be available before decoding can -begin), life-critical systems, ... - -1.1. supported features ------------------------ - -The following features are supported by the decoder: - -*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image, - or the same color type as the PNG -*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image -*) Adam7 interlace and deinterlace for any color type -*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk -*) support for alpha channels, including RGBA color model, translucent palettes and color keying -*) zlib decompression (inflate) -*) zlib compression (deflate) -*) CRC32 and ADLER32 checksums -*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks. -*) the following chunks are supported (generated/interpreted) by both encoder and decoder: - IHDR: header information - PLTE: color palette - IDAT: pixel data - IEND: the final chunk - tRNS: transparency for palettized images - tEXt: textual information - zTXt: compressed textual information - iTXt: international textual information - bKGD: suggested background color - pHYs: physical dimensions - tIME: modification time - -1.2. features not supported ---------------------------- - -The following features are _not_ supported: - -*) some features needed to make a conformant PNG-Editor might be still missing. -*) partial loading/stream processing. All data must be available and is processed in one call. -*) The following public chunks are not supported but treated as unknown chunks by LodePNG - cHRM, gAMA, iCCP, sRGB, sBIT, hIST, sPLT - Some of these are not supported on purpose: LodePNG wants to provide the RGB values - stored in the pixels, not values modified by system dependent gamma or color models. - - -2. C and C++ version --------------------- - -The C version uses buffers allocated with alloc that you need to free() -yourself. You need to use init and cleanup functions for each struct whenever -using a struct from the C version to avoid exploits and memory leaks. - -The C++ version has extra functions with std::vectors in the interface and the -lodepng::State class which is a LodePNGState with constructor and destructor. - -These files work without modification for both C and C++ compilers because all -the additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers -ignore it, and the C code is made to compile both with strict ISO C90 and C++. - -To use the C++ version, you need to rename the source file to lodepng.cpp -(instead of lodepng.c), and compile it with a C++ compiler. - -To use the C version, you need to rename the source file to lodepng.c (instead -of lodepng.cpp), and compile it with a C compiler. - - -3. Security ------------ - -Even if carefully designed, it's always possible that LodePNG contains possible -exploits. If you discover one, please let me know, and it will be fixed. - -When using LodePNG, care has to be taken with the C version of LodePNG, as well -as the C-style structs when working with C++. The following conventions are used -for all C-style structs: - --if a struct has a corresponding init function, always call the init function when making a new one --if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks --if a struct has a corresponding copy function, use the copy function instead of "=". - The destination must also be inited already. - - -4. Decoding ------------ - -Decoding converts a PNG compressed image to a raw pixel buffer. - -Most documentation on using the decoder is at its declarations in the header -above. For C, simple decoding can be done with functions such as -lodepng_decode32, and more advanced decoding can be done with the struct -LodePNGState and lodepng_decode. For C++, all decoding can be done with the -various lodepng::decode functions, and lodepng::State can be used for advanced -features. - -When using the LodePNGState, it uses the following fields for decoding: -*) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here -*) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get -*) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use - -LodePNGInfo info_png --------------------- - -After decoding, this contains extra information of the PNG image, except the actual -pixels, width and height because these are already gotten directly from the decoder -functions. - -It contains for example the original color type of the PNG image, text comments, -suggested background color, etc... More details about the LodePNGInfo struct are -at its declaration documentation. - -LodePNGColorMode info_raw -------------------------- - -When decoding, here you can specify which color type you want -the resulting raw image to be. If this is different from the colortype of the -PNG, then the decoder will automatically convert the result. This conversion -always works, except if you want it to convert a color PNG to greyscale or to -a palette with missing colors. - -By default, 32-bit color is used for the result. - -LodePNGDecoderSettings decoder ------------------------------- - -The settings can be used to ignore the errors created by invalid CRC and Adler32 -chunks, and to disable the decoding of tEXt chunks. - -There's also a setting color_convert, true by default. If false, no conversion -is done, the resulting data will be as it was in the PNG (after decompression) -and you'll have to puzzle the colors of the pixels together yourself using the -color type information in the LodePNGInfo. - - -5. Encoding ------------ - -Encoding converts a raw pixel buffer to a PNG compressed image. - -Most documentation on using the encoder is at its declarations in the header -above. For C, simple encoding can be done with functions such as -lodepng_encode32, and more advanced decoding can be done with the struct -LodePNGState and lodepng_encode. For C++, all encoding can be done with the -various lodepng::encode functions, and lodepng::State can be used for advanced -features. - -Like the decoder, the encoder can also give errors. However it gives less errors -since the encoder input is trusted, the decoder input (a PNG image that could -be forged by anyone) is not trusted. - -When using the LodePNGState, it uses the following fields for encoding: -*) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be. -*) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has -*) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use - -LodePNGInfo info_png --------------------- - -When encoding, you use this the opposite way as when decoding: for encoding, -you fill in the values you want the PNG to have before encoding. By default it's -not needed to specify a color type for the PNG since it's automatically chosen, -but it's possible to choose it yourself given the right settings. - -The encoder will not always exactly match the LodePNGInfo struct you give, -it tries as close as possible. Some things are ignored by the encoder. The -encoder uses, for example, the following settings from it when applicable: -colortype and bitdepth, text chunks, time chunk, the color key, the palette, the -background color, the interlace method, unknown chunks, ... - -When encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk. -If the palette contains any colors for which the alpha channel is not 255 (so -there are translucent colors in the palette), it'll add a tRNS chunk. - -LodePNGColorMode info_raw -------------------------- - -You specify the color type of the raw image that you give to the input here, -including a possible transparent color key and palette you happen to be using in -your raw image data. - -By default, 32-bit color is assumed, meaning your input has to be in RGBA -format with 4 bytes (unsigned chars) per pixel. - -LodePNGEncoderSettings encoder ------------------------------- - -The following settings are supported (some are in sub-structs): -*) auto_convert: when this option is enabled, the encoder will -automatically choose the smallest possible color mode (including color key) that -can encode the colors of all pixels without information loss. -*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree, - 2 = dynamic huffman tree (best compression). Should be 2 for proper - compression. -*) use_lz77: whether or not to use LZ77 for compressed block types. Should be - true for proper compression. -*) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value - 2048 by default, but can be set to 32768 for better, but slow, compression. -*) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE - chunk if force_palette is true. This can used as suggested palette to convert - to by viewers that don't support more than 256 colors (if those still exist) -*) add_id: add text chunk "Encoder: LodePNG " to the image. -*) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks. - zTXt chunks use zlib compression on the text. This gives a smaller result on - large texts but a larger result on small texts (such as a single program name). - It's all tEXt or all zTXt though, there's no separate setting per text yet. - - -6. color conversions --------------------- - -An important thing to note about LodePNG, is that the color type of the PNG, and -the color type of the raw image, are completely independent. By default, when -you decode a PNG, you get the result as a raw image in the color type you want, -no matter whether the PNG was encoded with a palette, greyscale or RGBA color. -And if you encode an image, by default LodePNG will automatically choose the PNG -color type that gives good compression based on the values of colors and amount -of colors in the image. It can be configured to let you control it instead as -well, though. - -To be able to do this, LodePNG does conversions from one color mode to another. -It can convert from almost any color type to any other color type, except the -following conversions: RGB to greyscale is not supported, and converting to a -palette when the palette doesn't have a required color is not supported. This is -not supported on purpose: this is information loss which requires a color -reduction algorithm that is beyong the scope of a PNG encoder (yes, RGB to grey -is easy, but there are multiple ways if you want to give some channels more -weight). - -By default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB -color, no matter what color type the PNG has. And by default when encoding, -LodePNG automatically picks the best color model for the output PNG, and expects -the input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control -the color format of the images yourself, you can skip this chapter. - -6.1. PNG color types --------------------- - -A PNG image can have many color types, ranging from 1-bit color to 64-bit color, -as well as palettized color modes. After the zlib decompression and unfiltering -in the PNG image is done, the raw pixel data will have that color type and thus -a certain amount of bits per pixel. If you want the output raw image after -decoding to have another color type, a conversion is done by LodePNG. - -The PNG specification gives the following color types: - -0: greyscale, bit depths 1, 2, 4, 8, 16 -2: RGB, bit depths 8 and 16 -3: palette, bit depths 1, 2, 4 and 8 -4: greyscale with alpha, bit depths 8 and 16 -6: RGBA, bit depths 8 and 16 - -Bit depth is the amount of bits per pixel per color channel. So the total amount -of bits per pixel is: amount of channels * bitdepth. - -6.2. color conversions ----------------------- - -As explained in the sections about the encoder and decoder, you can specify -color types and bit depths in info_png and info_raw to change the default -behaviour. - -If, when decoding, you want the raw image to be something else than the default, -you need to set the color type and bit depth you want in the LodePNGColorMode, -or the parameters of the simple function of LodePNG you're using. - -If, when encoding, you use another color type than the default in the input -image, you need to specify its color type and bit depth in the LodePNGColorMode -of the raw image, or use the parameters of the simplefunction of LodePNG you're -using. - -If, when encoding, you don't want LodePNG to choose the output PNG color type -but control it yourself, you need to set auto_convert in the encoder settings -to LAC_NONE, and specify the color type you want in the LodePNGInfo of the -encoder. - -If you do any of the above, LodePNG may need to do a color conversion, which -follows the rules below, and may sometimes not be allowed. - -To avoid some confusion: --the decoder converts from PNG to raw image --the encoder converts from raw image to PNG --the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image --the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG --when encoding, the color type in LodePNGInfo is ignored if auto_convert - is enabled, it is automatically generated instead --when decoding, the color type in LodePNGInfo is set by the decoder to that of the original - PNG image, but it can be ignored since the raw image has the color type you requested instead --if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion - between the color types is done if the color types are supported. If it is not - supported, an error is returned. If the types are the same, no conversion is done. --even though some conversions aren't supported, LodePNG supports loading PNGs from any - colortype and saving PNGs to any colortype, sometimes it just requires preparing - the raw image correctly before encoding. --both encoder and decoder use the same color converter. - -Non supported color conversions: --color to greyscale: no error is thrown, but the result will look ugly because -only the red channel is taken --anything, to palette when that palette does not have that color in it: in this -case an error is thrown - -Supported color conversions: --anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA --any grey or grey+alpha, to grey or grey+alpha --anything to a palette, as long as the palette has the requested colors in it --removing alpha channel --higher to smaller bitdepth, and vice versa - -If you want no color conversion to be done: --In the encoder, you can make it save a PNG with any color type by giving the -raw color mode and LodePNGInfo the same color mode, and setting auto_convert to -LAC_NO. --In the decoder, you can make it store the pixel data in the same color type -as the PNG has, by setting the color_convert setting to false. Settings in -info_raw are then ignored. - -The function lodepng_convert does the color conversion. It is available in the -interface but normally isn't needed since the encoder and decoder already call -it. - -6.3. padding bits ------------------ - -In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines -have a bit amount that isn't a multiple of 8, then padding bits are used so that each -scanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output. -The raw input image you give to the encoder, and the raw output image you get from the decoder -will NOT have these padding bits, e.g. in the case of a 1-bit image with a width -of 7 pixels, the first pixel of the second scanline will the the 8th bit of the first byte, -not the first bit of a new byte. - -6.4. A note about 16-bits per channel and endianness ----------------------------------------------------- - -LodePNG uses unsigned char arrays for 16-bit per channel colors too, just like -for any other color format. The 16-bit values are stored in big endian (most -significant byte first) in these arrays. This is the opposite order of the -little endian used by x86 CPU's. - -LodePNG always uses big endian because the PNG file format does so internally. -Conversions to other formats than PNG uses internally are not supported by -LodePNG on purpose, there are myriads of formats, including endianness of 16-bit -colors, the order in which you store R, G, B and A, and so on. Supporting and -converting to/from all that is outside the scope of LodePNG. - -This may mean that, depending on your use case, you may want to convert the big -endian output of LodePNG to little endian with a for loop. This is certainly not -always needed, many applications and libraries support big endian 16-bit colors -anyway, but it means you cannot simply cast the unsigned char* buffer to an -unsigned short* buffer on x86 CPUs. - - -7. error values ---------------- - -All functions in LodePNG that return an error code, return 0 if everything went -OK, or a non-zero code if there was an error. - -The meaning of the LodePNG error values can be retrieved with the function -lodepng_error_text: given the numerical error code, it returns a description -of the error in English as a string. - -Check the implementation of lodepng_error_text to see the meaning of each code. - - -8. chunks and PNG editing -------------------------- - -If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG -editor that should follow the rules about handling of unknown chunks, or if your -program is able to read other types of chunks than the ones handled by LodePNG, -then that's possible with the chunk functions of LodePNG. - -A PNG chunk has the following layout: - -4 bytes length -4 bytes type name -length bytes data -4 bytes CRC - -8.1. iterating through chunks ------------------------------ - -If you have a buffer containing the PNG image data, then the first chunk (the -IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the -signature of the PNG and are not part of a chunk. But if you start at byte 8 -then you have a chunk, and can check the following things of it. - -NOTE: none of these functions check for memory buffer boundaries. To avoid -exploits, always make sure the buffer contains all the data of the chunks. -When using lodepng_chunk_next, make sure the returned value is within the -allocated memory. - -unsigned lodepng_chunk_length(const unsigned char* chunk): - -Get the length of the chunk's data. The total chunk length is this length + 12. - -void lodepng_chunk_type(char type[5], const unsigned char* chunk): -unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type): - -Get the type of the chunk or compare if it's a certain type - -unsigned char lodepng_chunk_critical(const unsigned char* chunk): -unsigned char lodepng_chunk_private(const unsigned char* chunk): -unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk): - -Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are). -Check if the chunk is private (public chunks are part of the standard, private ones not). -Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical -chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your -program doesn't handle that type of unknown chunk. - -unsigned char* lodepng_chunk_data(unsigned char* chunk): -const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk): - -Get a pointer to the start of the data of the chunk. - -unsigned lodepng_chunk_check_crc(const unsigned char* chunk): -void lodepng_chunk_generate_crc(unsigned char* chunk): - -Check if the crc is correct or generate a correct one. - -unsigned char* lodepng_chunk_next(unsigned char* chunk): -const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk): - -Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these -functions do no boundary checking of the allocated data whatsoever, so make sure there is enough -data available in the buffer to be able to go to the next chunk. - -unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk): -unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, - const char* type, const unsigned char* data): - -These functions are used to create new chunks that are appended to the data in *out that has -length *outlength. The append function appends an existing chunk to the new data. The create -function creates a new chunk with the given parameters and appends it. Type is the 4-letter -name of the chunk. - -8.2. chunks in info_png ------------------------ - -The LodePNGInfo struct contains fields with the unknown chunk in it. It has 3 -buffers (each with size) to contain 3 types of unknown chunks: -the ones that come before the PLTE chunk, the ones that come between the PLTE -and the IDAT chunks, and the ones that come after the IDAT chunks. -It's necessary to make the distionction between these 3 cases because the PNG -standard forces to keep the ordering of unknown chunks compared to the critical -chunks, but does not force any other ordering rules. - -info_png.unknown_chunks_data[0] is the chunks before PLTE -info_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT -info_png.unknown_chunks_data[2] is the chunks after IDAT - -The chunks in these 3 buffers can be iterated through and read by using the same -way described in the previous subchapter. - -When using the decoder to decode a PNG, you can make it store all unknown chunks -if you set the option settings.remember_unknown_chunks to 1. By default, this -option is off (0). - -The encoder will always encode unknown chunks that are stored in the info_png. -If you need it to add a particular chunk that isn't known by LodePNG, you can -use lodepng_chunk_append or lodepng_chunk_create to the chunk data in -info_png.unknown_chunks_data[x]. - -Chunks that are known by LodePNG should not be added in that way. E.g. to make -LodePNG add a bKGD chunk, set background_defined to true and add the correct -parameters there instead. - - -9. compiler support -------------------- - -No libraries other than the current standard C library are needed to compile -LodePNG. For the C++ version, only the standard C++ library is needed on top. -Add the files lodepng.c(pp) and lodepng.h to your project, include -lodepng.h where needed, and your program can read/write PNG files. - -If performance is important, use optimization when compiling! For both the -encoder and decoder, this makes a large difference. - -Make sure that LodePNG is compiled with the same compiler of the same version -and with the same settings as the rest of the program, or the interfaces with -std::vectors and std::strings in C++ can be incompatible. - -CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets. - -*) gcc and g++ - -LodePNG is developed in gcc so this compiler is natively supported. It gives no -warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++ -version 4.7.1 on Linux, 32-bit and 64-bit. - -*) Mingw - -The Mingw compiler (a port of gcc) for Windows is fully supported by LodePNG. - -*) Visual Studio 2005 and up, Visual C++ Express Edition 2005 and up - -Visual Studio may give warnings about 'fopen' being deprecated. A multiplatform library -can't support the proposed Visual Studio alternative however, so LodePNG keeps using -fopen. If you don't want to see the deprecated warnings, put this on top of lodepng.h -before the inclusions: -#define _CRT_SECURE_NO_DEPRECATE - -Other than the above warnings, LodePNG should be warning-free with warning -level 3 (W3). Warning level 4 (W4) will give warnings about integer conversions. -I'm not planning to resolve these warnings. To get rid of them, let Visual -Studio use warning level W3 for lodepng.cpp only: right click lodepng.cpp, -Properties, C/C++, General, Warning Level: Level 3 (/W3). - -Visual Studio may want "stdafx.h" files to be included in each source file and -give an error "unexpected end of file while looking for precompiled header". -That is not standard C++ and will not be added to the stock LodePNG. You can -disable it for lodepng.cpp only by right clicking it, Properties, C/C++, -Precompiled Headers, and set it to Not Using Precompiled Headers there. - -*) Visual Studio 6.0 - -LodePNG support for Visual Studio 6.0 is not guaranteed because VS6 doesn't -follow the C++ standard correctly. - -*) Comeau C/C++ - -Vesion 20070107 compiles without problems on the Comeau C/C++ Online Test Drive -at http://www.comeaucomputing.com/tryitout in both C90 and C++ mode. - -*) Compilers on Macintosh - -LodePNG has been reported to work both with the gcc and LLVM for Macintosh, both -for C and C++. - -*) Other Compilers - -If you encounter problems on other compilers, feel free to let me know and I may -try to fix it if the compiler is modern standards complient. - - -10. examples ------------- - -This decoder example shows the most basic usage of LodePNG. More complex -examples can be found on the LodePNG website. - -10.1. decoder C++ example -------------------------- - -#include "lodepng.h" -#include - -int main(int argc, char *argv[]) -{ - const char* filename = argc > 1 ? argv[1] : "test.png"; - - //load and decode - std::vector image; - unsigned width, height; - unsigned error = lodepng::decode(image, width, height, filename); - - //if there's an error, display it - if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl; - - //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ... -} - -10.2. decoder C example ------------------------ - -#include "lodepng.h" - -int main(int argc, char *argv[]) -{ - unsigned error; - unsigned char* image; - size_t width, height; - const char* filename = argc > 1 ? argv[1] : "test.png"; - - error = lodepng_decode32_file(&image, &width, &height, filename); - - if(error) printf("decoder error %u: %s\n", error, lodepng_error_text(error)); - - / * use image here * / - - free(image); - return 0; -} - - -11. changes ------------ - -The version number of LodePNG is the date of the change given in the format -yyyymmdd. - -Some changes aren't backwards compatible. Those are indicated with a (!) -symbol. - -*) 22 dec 2013: Power of two windowsize required for optimization. -*) 15 apr 2013: Fixed bug with LAC_ALPHA and color key. -*) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png). -*) 11 mar 2013 (!): Bugfix with custom free. Changed from "my" to "lodepng_" - prefix for the custom allocators and made it possible with a new #define to - use custom ones in your project without needing to change lodepng's code. -*) 28 jan 2013: Bugfix with color key. -*) 27 okt 2012: Tweaks in text chunk keyword length error handling. -*) 8 okt 2012 (!): Added new filter strategy (entropy) and new auto color mode. - (no palette). Better deflate tree encoding. New compression tweak settings. - Faster color conversions while decoding. Some internal cleanups. -*) 23 sep 2012: Reduced warnings in Visual Studio a little bit. -*) 1 sep 2012 (!): Removed #define's for giving custom (de)compression functions - and made it work with function pointers instead. -*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc - and free functions and toggle #defines from compiler flags. Small fixes. -*) 6 may 2012 (!): Made plugging in custom zlib/deflate functions more flexible. -*) 22 apr 2012 (!): Made interface more consistent, renaming a lot. Removed - redundant C++ codec classes. Reduced amount of structs. Everything changed, - but it is cleaner now imho and functionality remains the same. Also fixed - several bugs and shrinked the implementation code. Made new samples. -*) 6 nov 2011 (!): By default, the encoder now automatically chooses the best - PNG color model and bit depth, based on the amount and type of colors of the - raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. -*) 9 okt 2011: simpler hash chain implementation for the encoder. -*) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching. -*) 23 aug 2011: tweaked the zlib compression parameters after benchmarking. - A bug with the PNG filtertype heuristic was fixed, so that it chooses much - better ones (it's quite significant). A setting to do an experimental, slow, - brute force search for PNG filter types is added. -*) 17 aug 2011 (!): changed some C zlib related function names. -*) 16 aug 2011: made the code less wide (max 120 characters per line). -*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors. -*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled. -*) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman - to optimize long sequences of zeros. -*) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and - LodePNG_InfoColor_canHaveAlpha functions for convenience. -*) 7 nov 2010: added LodePNG_error_text function to get error code description. -*) 30 okt 2010: made decoding slightly faster -*) 26 okt 2010: (!) changed some C function and struct names (more consistent). - Reorganized the documentation and the declaration order in the header. -*) 08 aug 2010: only changed some comments and external samples. -*) 05 jul 2010: fixed bug thanks to warnings in the new gcc version. -*) 14 mar 2010: fixed bug where too much memory was allocated for char buffers. -*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could - read by ignoring the problem but windows apps couldn't. -*) 06 jun 2008: added more error checks for out of memory cases. -*) 26 apr 2008: added a few more checks here and there to ensure more safety. -*) 06 mar 2008: crash with encoding of strings fixed -*) 02 feb 2008: support for international text chunks added (iTXt) -*) 23 jan 2008: small cleanups, and #defines to divide code in sections -*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor. -*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder. -*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added - Also vareous fixes, such as in the deflate and the padding bits code. -*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved - filtering code of encoder. -*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A - C++ wrapper around this provides an interface almost identical to before. - Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code - are together in these files but it works both for C and C++ compilers. -*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks -*) 30 aug 2007: bug fixed which makes this Borland C++ compatible -*) 09 aug 2007: some VS2005 warnings removed again -*) 21 jul 2007: deflate code placed in new namespace separate from zlib code -*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images -*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing - invalid std::vector element [0] fixed, and level 3 and 4 warnings removed -*) 02 jun 2007: made the encoder add a tag with version by default -*) 27 may 2007: zlib and png code separated (but still in the same file), - simple encoder/decoder functions added for more simple usage cases -*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69), - moved some examples from here to lodepng_examples.cpp -*) 12 may 2007: palette decoding bug fixed -*) 24 apr 2007: changed the license from BSD to the zlib license -*) 11 mar 2007: very simple addition: ability to encode bKGD chunks. -*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding - palettized PNG images. Plus little interface change with palette and texts. -*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes. - Fixed a bug where the end code of a block had length 0 in the Huffman tree. -*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented - and supported by the encoder, resulting in smaller PNGs at the output. -*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone. -*) 24 jan 2007: gave encoder an error interface. Added color conversion from any - greyscale type to 8-bit greyscale with or without alpha. -*) 21 jan 2007: (!) Totally changed the interface. It allows more color types - to convert to and is more uniform. See the manual for how it works now. -*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days: - encode/decode custom tEXt chunks, separate classes for zlib & deflate, and - at last made the decoder give errors for incorrect Adler32 or Crc. -*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel. -*) 29 dec 2006: Added support for encoding images without alpha channel, and - cleaned out code as well as making certain parts faster. -*) 28 dec 2006: Added "Settings" to the encoder. -*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now. - Removed some code duplication in the decoder. Fixed little bug in an example. -*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter. - Fixed a bug of the decoder with 16-bit per color. -*) 15 okt 2006: Changed documentation structure -*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the - given image buffer, however for now it's not compressed. -*) 08 sep 2006: (!) Changed to interface with a Decoder class -*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different - way. Renamed decodePNG to decodePNGGeneric. -*) 29 jul 2006: (!) Changed the interface: image info is now returned as a - struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy. -*) 28 jul 2006: Cleaned the code and added new error checks. - Corrected terminology "deflate" into "inflate". -*) 23 jun 2006: Added SDL example in the documentation in the header, this - example allows easy debugging by displaying the PNG and its transparency. -*) 22 jun 2006: (!) Changed way to obtain error value. Added - loadFile function for convenience. Made decodePNG32 faster. -*) 21 jun 2006: (!) Changed type of info vector to unsigned. - Changed position of palette in info vector. Fixed an important bug that - happened on PNGs with an uncompressed block. -*) 16 jun 2006: Internally changed unsigned into unsigned where - needed, and performed some optimizations. -*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them - in LodePNG namespace. Changed the order of the parameters. Rewrote the - documentation in the header. Renamed files to lodepng.cpp and lodepng.h -*) 22 apr 2006: Optimized and improved some code -*) 07 sep 2005: (!) Changed to std::vector interface -*) 12 aug 2005: Initial release (C++, decoder only) - - -12. contact information ------------------------ - -Feel free to contact me with suggestions, problems, comments, ... concerning -LodePNG. If you encounter a PNG image that doesn't work properly with this -decoder, feel free to send it and I'll use it to find and fix the problem. - -My email address is (puzzle the account and domain together with an @ symbol): -Domain: gmail dot com. -Account: lode dot vandevenne. - - -Copyright (c) 2005-2013 Lode Vandevenne -*/ diff --git a/pre-build.ps1 b/pre-build.ps1 index 8dadd76d26..dc0dcbb3d9 100644 --- a/pre-build.ps1 +++ b/pre-build.ps1 @@ -1,15 +1,11 @@ $path = Split-Path $Script:MyInvocation.MyCommand.Path -$zip = $path+'\lib\orcalibs.zip' +$zip = $path+'\orctlibs.zip' $libs = $path+'\lib' -$libcurl = Test-Path $path\lib\libcurl\ -$jansson = Test-Path $path\lib\jansson\ -$sdl = Test-Path $path\lib\sdl\ -if (!$libcurl -or !$jansson -or !$sdl) { - Invoke-WebRequest http://misozmiric.com/ted/openrct2/orcalibs-vs.zip -OutFile $path\lib\orcalibs.zip - rm $path\lib\libcurl -r -Force -ErrorAction SilentlyContinue - rm $path\lib\jansson -r -Force -ErrorAction SilentlyContinue - rm $path\lib\sdl -r -Force -ErrorAction SilentlyContinue +$libsTest = Test_path $libs +if (!$libsTest) { + mkdir $libs + Invoke-WebRequest https://download.openrct2.website/dev/lib/vs -OutFile $path\orctlibs.zip [System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') > $null [System.IO.Compression.ZipFile]::ExtractToDirectory($zip, $libs) - rm $path\lib\orcalibs.zip -Force -ErrorAction SilentlyContinue + rm $path\orctlibs.zip -Force -ErrorAction SilentlyContinue } From 2dda7e9f94a12828af7f71a65fd05b2a6f7d68a5 Mon Sep 17 00:00:00 2001 From: "Miso Zmiric (Mike Squinter)" Date: Fri, 3 Jul 2015 08:54:35 +0100 Subject: [PATCH 0170/1173] fix old bug in unix build where we built g2 before symlinking --- build.sh | 8 ++++---- install.sh | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.sh b/build.sh index 49df49f378..9a96a9851d 100755 --- a/build.sh +++ b/build.sh @@ -11,15 +11,15 @@ pushd build make popd +if [[ ! -h openrct2.dll ]]; then + ln -s build/openrct2.dll openrct2.dll +fi + if [[ -z "$DISABLE_G2_BUILD" ]]; then echo Building: data/g2.dat ./build_g2.sh > /dev/null 2>&1 fi -if [[ ! -h openrct2.dll ]]; then - ln -s build/openrct2.dll openrct2.dll -fi - if [[ -t 1 ]]; then echo -e "\nDone! Run OpenRCT2 by typing:\n\n\033[95mwine openrct2.exe\n\033[0m" else diff --git a/install.sh b/install.sh index fdc3a6778a..a3287d6413 100755 --- a/install.sh +++ b/install.sh @@ -85,7 +85,7 @@ if [[ ! -d $cachedir/SDL2-${SDL2_PV} ]]; then popd fi if [[ ! -f $cachedir/orctlibs.zip ]]; then - wget https://download.openrct2.website/dev/lib/mingw --secure-protocol=tlsv1_2 --output-document $cachedir/orctlibs.zip; + wget https://download.openrct2.website/dev/lib/mingw --secure-protocol=TLSv1 --output-document $cachedir/orctlibs.zip; fi if [[ ! -d $cachedir/orctlibs ]]; then mkdir -p $cachedir/orctlibs From 76fd00c18f6d84a50aee4b21e1a64f4829c26757 Mon Sep 17 00:00:00 2001 From: "Miso Zmiric (Mike Squinter)" Date: Fri, 3 Jul 2015 09:03:13 +0100 Subject: [PATCH 0171/1173] use curl instead of wget for the libs download, since travis installed wget can't handle sni tlsv1_2 certs :( --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index a3287d6413..0f2408cb4a 100755 --- a/install.sh +++ b/install.sh @@ -85,7 +85,7 @@ if [[ ! -d $cachedir/SDL2-${SDL2_PV} ]]; then popd fi if [[ ! -f $cachedir/orctlibs.zip ]]; then - wget https://download.openrct2.website/dev/lib/mingw --secure-protocol=TLSv1 --output-document $cachedir/orctlibs.zip; + curl https://download.openrct2.website/dev/lib/mingw -o $cachedir/orctlibs.zip; fi if [[ ! -d $cachedir/orctlibs ]]; then mkdir -p $cachedir/orctlibs From ae4b2277cde82a8069077e945d718bf662a94aad Mon Sep 17 00:00:00 2001 From: "Miso Zmiric (Mike Squinter)" Date: Fri, 3 Jul 2015 10:54:42 +0100 Subject: [PATCH 0172/1173] link pthread on linux so that dlls don't have to be copied form elsewhere --- CMakeLists_mingw.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists_mingw.txt b/CMakeLists_mingw.txt index 96fae66e68..538bdecf4e 100644 --- a/CMakeLists_mingw.txt +++ b/CMakeLists_mingw.txt @@ -12,7 +12,11 @@ SET(PKG_CONFIG_EXECUTABLE ${COMPILER_PREFIX}-pkg-config) # set(CMAKE_C_FLAGS "-masm=intel -std=gnu99 -fpack-struct=1" CACHE STRING "" FORCE) set(CMAKE_CXX_FLAGS "-masm=intel -std=c++0x -std=gnu++0x -fpack-struct=1" CACHE STRING "" FORCE) -set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++" CACHE STRING "" FORCE) +if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static -lpthread" CACHE STRING "" FORCE) +else() + set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++" CACHE STRING "" FORCE) +endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") # find and include SDL2 INCLUDE(FindPkgConfig) From 97ce46dc04adbddf8a5b4867dceab393d6002f47 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 3 Jul 2015 12:57:25 +0200 Subject: [PATCH 0173/1173] Fix selecting a newly invented ride when the user has selection by track type enabled. --- src/windows/new_ride.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index 125b686823..220c838de3 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -480,7 +480,11 @@ void window_new_ride_focus(ride_list_item rideItem) return; rideType = GET_RIDE_ENTRY(rideItem.entry_index); - window_new_ride_set_page(w, rideType->category[0]); + + if(!gConfigInterface.select_by_track_type) + window_new_ride_set_page(w, rideType->category[0]); + else + window_new_ride_set_page(w, gRideCategories[rideType->ride_type[0]]); ride_list_item *listItem = (ride_list_item*)0x00F43523; while (listItem->type != RIDE_TYPE_NULL) { From f3ca205902894384ad28f3102654cf47bc268708 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 3 Jul 2015 18:07:29 +0100 Subject: [PATCH 0174/1173] fix test-path prebuild mistake. --- pre-build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pre-build.ps1 b/pre-build.ps1 index dc0dcbb3d9..a4b2246d58 100644 --- a/pre-build.ps1 +++ b/pre-build.ps1 @@ -1,7 +1,7 @@ $path = Split-Path $Script:MyInvocation.MyCommand.Path $zip = $path+'\orctlibs.zip' $libs = $path+'\lib' -$libsTest = Test_path $libs +$libsTest = Test-Path $libs if (!$libsTest) { mkdir $libs Invoke-WebRequest https://download.openrct2.website/dev/lib/vs -OutFile $path\orctlibs.zip From 709a2c5ef1a383a85d45da3c4aadd9e84dafa48c Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Thu, 2 Jul 2015 20:07:44 +0100 Subject: [PATCH 0175/1173] Implement track_place. --- src/ride/ride.c | 3 +- src/ride/ride.h | 6 +- src/ride/track.c | 475 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 480 insertions(+), 4 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index f2296e2d90..059e252cfc 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -139,7 +139,6 @@ void ride_prepare_breakdown(int rideIndex, int breakdownReason); 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 sub_6B59C6(int rideIndex); static void ride_update_vehicle_colours(int rideIndex); rct_ride_type *ride_get_entry(rct_ride *ride) @@ -4956,7 +4955,7 @@ bool ride_are_all_possible_entrances_and_exits_built(rct_ride *ride) * * rct2: 0x006B59C6 */ -static void sub_6B59C6(int rideIndex) +void sub_6B59C6(int rideIndex) { rct_ride *ride = GET_RIDE(rideIndex); diff --git a/src/ride/ride.h b/src/ride/ride.h index 6733468af2..9d7cc817b7 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -319,7 +319,10 @@ typedef struct { uint16 total_air_time; // 0x1F4 uint8 pad_1F6; uint8 num_circuits; // 0x1F7 - uint8 pad_1F8[6]; + sint16 var_1F8; + sint16 var_1FA; + uint8 var_1FC; + uint8 pad_1FD; uint16 cable_lift; // 0x1FE uint16 queue_length[4]; // 0x200 uint8 pad_208[0x58]; @@ -895,6 +898,7 @@ void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, in void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void ride_clear_for_construction(int rideIndex); void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int num_images); +void sub_6B59C6(int rideIndex); void ride_select_next_section(); void ride_select_previous_section(); diff --git a/src/ride/track.c b/src/ride/track.c index 46a13ede5a..ba826cba43 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3441,13 +3441,486 @@ const rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackT return get_track_def_from_ride(GET_RIDE(rideIndex), trackType); } +static money32 track_place(int rideIndex, int type, int originX, int originY, int originZ, int direction, int properties_1, int properties_2, int properties_3, int edx_flags, int flags) +{ + rct_ride *ride = GET_RIDE(rideIndex); + rct_ride_type *rideEntry = GET_RIDE_ENTRY(ride->subtype); + rct_map_element *mapElement; + + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION; + RCT2_GLOBAL(0x009DEA5E, uint16) = originX + 16; + RCT2_GLOBAL(0x009DEA60, uint16) = originY + 16; + RCT2_GLOBAL(0x009DEA62, uint16) = originZ; + direction &= 3; + RCT2_GLOBAL(0x00F441D5, uint32) = properties_1; + RCT2_GLOBAL(0x00F441D9, uint32) = properties_2; + RCT2_GLOBAL(0x00F441DD, uint32) = properties_3; + RCT2_GLOBAL(0x00F441D4, uint8) = 0; + + uint64 enabledTrackPieces = 0; + enabledTrackPieces |= rideEntry->enabledTrackPiecesB & RCT2_ADDRESS(0x01357644, uint32)[ride->type]; + enabledTrackPieces <<= 32; + enabledTrackPieces |= rideEntry->enabledTrackPiecesA & RCT2_ADDRESS(0x01357444, uint32)[ride->type]; + uint32 rideTypeFlags = RCT2_GLOBAL(0x0097CF40 + (ride->type * 8), uint32); + RCT2_GLOBAL(0x00F44068, uint32) = rideTypeFlags; + + if ((ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) && type == 1) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_NOT_ALLOWED_TO_MODIFY_STATION; + return MONEY32_UNDEFINED; + } + if (!sub_68B044()) { + return MONEY32_UNDEFINED; + } + if (!(flags & (1 << 3))) { + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; + return MONEY32_UNDEFINED; + } + } + + uint16 *hmm = (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE) ? + (uint16*)0x0099443C : + (uint16*)0x0099423C; + if (hmm[type] & 0x100) { + if ((originZ & 0x0F) != 8) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 954; + return MONEY32_UNDEFINED; + } + } + else { + if ((originZ & 0x0F) != 0) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 954; + return MONEY32_UNDEFINED; + } + } + + if (type == TRACK_ELEM_ON_RIDE_PHOTO) { + if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_ONLY_ONE_ON_RIDE_PHOTO_PER_RIDE; + return MONEY32_UNDEFINED; + } + } + else if (type == TRACK_ELEM_CABLE_LIFT_HILL) { + if (ride->lifecycle_flags & RIDE_LIFECYCLE_16) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_ONLY_ONE_CABLE_LIFT_HILL_PER_RIDE; + return MONEY32_UNDEFINED; + } + } + + if ((edx_flags & (1 << 0)) && !(enabledTrackPieces & TRACK_LIFT_HILL_STEEP)) { + if (RCT2_ADDRESS(0x0099423C, uint16)[type] & 0x400) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_STEEP_FOR_LIFT_HILL; + return MONEY32_UNDEFINED; + } + } + + if (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE){ + RCT2_GLOBAL(0x00F44054, uint8*) = &RCT2_ADDRESS(0x0099AA94, uint8)[type * 16]; + } + else{ + RCT2_GLOBAL(0x00F44054, uint8*) = &RCT2_ADDRESS(0x00999A94, uint8)[type * 16]; + } + + money32 cost = 0; + const rct_preview_track *trackBlock = get_track_def_from_ride(ride, type); + for (; trackBlock->index != 0xFF; trackBlock++, RCT2_GLOBAL(0x00F44054, uint8*)++) { + int x, y, z, offsetX, offsetY; + int bl = trackBlock->var_08; + int bh; + switch (direction) { + case 0: + offsetX = trackBlock->x; + offsetY = trackBlock->y; + break; + case 1: + offsetX = trackBlock->y; + offsetY = -trackBlock->x; + bl = rol8(bl, 1); + bh = bl; + bh = ror8(bh, 4); + bl &= 0xEE; + bh &= 0x11; + bl |= bh; + break; + case 2: + offsetX = -trackBlock->x; + offsetY = -trackBlock->y; + bl = rol8(bl, 2); + bh = bl; + bh = ror8(bh, 4); + bl &= 0xCC; + bh &= 0x33; + bl |= bh; + break; + case 3: + offsetX = -trackBlock->y; + offsetY = trackBlock->x; + bl = rol8(bl, 3); + bh |= bl; + bh = ror8(bh, 4); + bl &= 0x88; + bh &= 0x77; + bl |= bh; + break; + } + x = originX + offsetX; + y = originY + offsetY; + z = originZ + trackBlock->z; + + if (z < 16) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_LOW; + return MONEY32_UNDEFINED; + } + + int baseZ = (originZ + trackBlock->z) / 8; + + int clearanceZ = trackBlock->var_07; + if (trackBlock->var_09 & (1 << 2) && RCT2_GLOBAL(0x0097D219 + (ride->type * 8), uint8) > 24){ + clearanceZ += 24; + } + else{ + clearanceZ += RCT2_GLOBAL(0x0097D219 + (ride->type * 8), uint8); + } + + clearanceZ = (clearanceZ / 8) + baseZ; + + if (clearanceZ >= 255) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_HIGH; + return MONEY32_UNDEFINED; + } + + _currentTrackEndX = x; + _currentTrackEndY = y; + + // Until 0x006C5A5F is implemented use this hacky struct. + struct{ + money32 cost; //0 + uint8 pad[0x10];//4 + uint8 flags;//14 + } clearance_struct; + clearance_struct.cost = cost; + clearance_struct.flags = flags; + + RCT2_GLOBAL(0x00F44060, void*) = &clearance_struct; + + if (!map_can_construct_with_clear_at(x, y, baseZ, clearanceZ, (void*)0x006C5A5F, bl)) { + return MONEY32_UNDEFINED; + } + // Again when 0x006C5A5F implemented remove this. + cost = clearance_struct.cost; + + //6c53dc + // push baseZ and clearanceZ + int cur_z = baseZ * 8; + + if ((flags & GAME_COMMAND_FLAG_APPLY) && !(flags & (1 << 3))) { + footpath_remove_litter(x, y, z); + // push bl bh?? + if (rideTypeFlags & RIDE_TYPE_FLAG_18) { + RCT2_CALLPROC_X(0x006E588E, x, (clearanceZ - baseZ) * 8, y, cur_z, 0, 0, 0); + } + else { + uint8 _bl = *RCT2_GLOBAL(0x00F44054, uint8*); + _bl ^= 0x0F; + + for (int dl = bitscanforward(_bl); dl != -1; dl = bitscanforward(_bl)){ + _bl &= ~(1 << dl); + map_remove_intersecting_walls(x, y, baseZ, clearanceZ, direction & 3); + } + } + } + + if (!map_is_location_owned(x, y, z)) { + return MONEY32_UNDEFINED; + } + + bh = RCT2_GLOBAL(0x00F1AD60, uint8) & 3; + if (RCT2_GLOBAL(0x00F441D4, uint8) != 0 && (RCT2_GLOBAL(0x00F441D4, uint8) & bh) == 0) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND; + return MONEY32_UNDEFINED; + } + + RCT2_GLOBAL(0x00F441D4, uint8) = bh; + if (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE) { + if (RCT2_ADDRESS(0x0099443C, uint16)[type] & 0x200) { + if (RCT2_GLOBAL(0x00F441D4, uint8) & 2) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; + return MONEY32_UNDEFINED; + } + } + } + else { + if (RCT2_ADDRESS(0x0099423C, uint16)[type] & 0x200) { + if (RCT2_GLOBAL(0x00F441D4, uint8) & 2) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; + return MONEY32_UNDEFINED; + } + } + } + + if (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE) { + if (RCT2_ADDRESS(0x0099443C, uint16)[type] & 1) { + if (!(RCT2_GLOBAL(0x00F1AD60, uint8) & 4)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_UNDERWATER; + return MONEY32_UNDEFINED; + } + } + } + else { + if (RCT2_ADDRESS(0x0099423C, uint16)[type] & 1) { + if (RCT2_GLOBAL(0x00F1AD60, uint8) & 4) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_UNDERWATER; + return MONEY32_UNDEFINED; + } + } + } + + if (RCT2_GLOBAL(0x00F1AD60, uint8) & 4) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_RIDE_CANT_BUILD_THIS_UNDERWATER; + return MONEY32_UNDEFINED; + } + + if ((rideTypeFlags & RIDE_TYPE_FLAG_6) && !(RCT2_GLOBAL(0x009D8150, uint8) & 1)) { + mapElement = map_get_surface_element_at(x / 32, y / 32); + + uint8 water_height = 2 * (mapElement->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK); + if (water_height == 0) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ON_WATER; + return MONEY32_UNDEFINED; + } + + if (water_height != baseZ) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ON_WATER; + return MONEY32_UNDEFINED; + } + water_height -= 2; + if (water_height == mapElement->base_height) { + bh = mapElement->properties.surface.slope & 0x0F; + if (bh == 7 || bh == 11 || bh == 13 || bh == 14) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ON_WATER; + return MONEY32_UNDEFINED; + } + } + } + + int entranceDirections; + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + entranceDirections = RCT2_ADDRESS(0x0099CA64, uint8)[type * 16]; + } + else { + entranceDirections = RCT2_ADDRESS(0x0099BA64, uint8)[type * 16]; + } + if ((entranceDirections & 0x10) && trackBlock->index == 0) { + if (RCT2_CALLPROC_X(0x006C4D89, x, rideIndex << 8, y, baseZ | (direction << 8), 0, 0, 0) & 0x100) { + return MONEY32_UNDEFINED; + } + } + //6c55be + if (entranceDirections & 0x20) { + entranceDirections &= 0x0F; + if (entranceDirections != 0) { + if (!(flags & GAME_COMMAND_FLAG_APPLY) && !(flags & 0x40)) { + uint8 _bl = entranceDirections; + for (int dl = bitscanforward(_bl); dl != -1; dl = bitscanforward(_bl)){ + _bl &= ~(1 << dl); + int temp_x = x, temp_y = y; + int temp_direction = (direction + dl) & 3; + temp_x += RCT2_ADDRESS(0x00993CCC, sint16)[temp_direction * 2]; + temp_y += RCT2_ADDRESS(0x00993CCE, sint16)[temp_direction * 2]; + temp_direction ^= (1 << 1); + map_remove_intersecting_walls(temp_x, temp_y, baseZ, clearanceZ, temp_direction & 3); + } + } + } + } + //6c5648 12 push + mapElement = map_get_surface_element_at(x / 32, y / 32); + int ride_height = clearanceZ - mapElement->base_height; + if (ride_height >= 0) { + int maxHeight = rideEntry->max_height; + if (maxHeight == 0) { + maxHeight = RCT2_GLOBAL(0x0097D218 + (ride->type * 8), uint8); + } + ride_height /= 2; + if (ride_height > maxHeight && !(RCT2_GLOBAL(0x009D8150, uint8) & 1)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_HIGH_FOR_SUPPORTS; + return MONEY32_UNDEFINED; + } + } + + int support_height = baseZ - mapElement->base_height; + if (support_height < 0) { + support_height = 10; + } + + cost += (support_height / 2) * RCT2_ADDRESS(0x0097DD7A, uint16)[ride->type * 2]; + //6c56d3 + + if (!(flags & GAME_COMMAND_FLAG_APPLY)) + continue; + + sub_6B59C6(rideIndex); + switch (type){ + case TRACK_ELEM_ON_RIDE_PHOTO: + ride->lifecycle_flags |= RIDE_LIFECYCLE_ON_RIDE_PHOTO; + break; + case TRACK_ELEM_CABLE_LIFT_HILL: + if (trackBlock->index != 0) + break; + ride->lifecycle_flags |= RIDE_LIFECYCLE_16; + ride->var_1F8 = x; + ride->var_1FA = y; + ride->var_1FC = baseZ; + break; + case 0xD8: + ride->num_block_brakes++; + ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_OPERATING; + ride->mode = RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED; + if (ride->type == RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER) + ride->mode = RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED; + break; + } + + if (trackBlock->index == 0){ + switch (type){ + case TRACK_ELEM_25_DEG_UP_TO_FLAT: + case TRACK_ELEM_60_DEG_UP_TO_FLAT: + case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT: + case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT: + if (!(edx_flags & 1)) + break; + //Fall Through + case TRACK_ELEM_CABLE_LIFT_HILL: + ride->num_block_brakes++; + break; + } + } + + entranceDirections = 0; + if (ride->overall_view != 0xFFFF){ + if (!(flags & (1 << 5))){ + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + entranceDirections = RCT2_ADDRESS(0x0099CA64, uint8)[type * 16]; + } + else { + entranceDirections = RCT2_ADDRESS(0x0099BA64, uint8)[type * 16]; + } + } + } + if (entranceDirections & (1 << 4) || ride->overall_view == 0xFFFF){ + ride->overall_view = (x >> 5) | (y << 3); + } + + mapElement = map_element_insert(x / 32, y / 32, baseZ, bl & 0xF); + mapElement->clearance_height = clearanceZ; + + uint8 map_type = direction; + map_type |= MAP_ELEMENT_TYPE_TRACK; + if (edx_flags & 1){ + map_type |= (1 << 7); + } + mapElement->type = map_type; + + mapElement->properties.track.sequence = trackBlock->index; + mapElement->properties.track.ride_index = rideIndex; + mapElement->properties.track.type = type; + mapElement->properties.track.colour = 0; + if (flags & (1 << 6)){ + mapElement->flags |= MAP_ELEMENT_FLAG_GHOST; + } + + switch (type) { + case TRACK_ELEM_WATERFALL: + map_animation_create(MAP_ANIMATION_TYPE_TRACK_WATERFALL, x, y, z); + break; + case TRACK_ELEM_RAPIDS: + map_animation_create(MAP_ANIMATION_TYPE_TRACK_RAPIDS, x, y, z); + break; + case TRACK_ELEM_WHIRLPOOL: + map_animation_create(MAP_ANIMATION_TYPE_TRACK_WHIRLPOOL, x, y, z); + break; + case TRACK_ELEM_SPINNING_TUNNEL: + map_animation_create(MAP_ANIMATION_TYPE_TRACK_SPINNINGTUNNEL, x, y, z); + break; + } + if (type == TRACK_ELEM_BRAKES) { + mapElement->properties.track.sequence = (properties_1 >> 1) << 4; + } + else { + mapElement->properties.track.colour = properties_3 << 4; + } + + uint8 colour = properties_2; + if (edx_flags & (1 << 1)){ + colour |= (1 << 2); + } + mapElement->properties.track.colour |= colour; + + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + entranceDirections = RCT2_ADDRESS(0x0099CA64, uint8)[type * 16]; + } + else { + entranceDirections = RCT2_ADDRESS(0x0099BA64, uint8)[type * 16]; + } + + if (entranceDirections & (1 << 4)){ + if (trackBlock->index == 0){ + RCT2_CALLPROC_X(0x006C4D89, + x, + (rideIndex << 8) | GAME_COMMAND_FLAG_APPLY, + y, + baseZ | (direction << 8), + 0, 0, 0); + } + sub_6CB945(rideIndex); + ride_update_max_vehicles(rideIndex); + } + + if (rideTypeFlags & RIDE_TYPE_FLAG_6){ + rct_map_element* surfaceElement = map_get_surface_element_at(x / 32, y / 32); + surfaceElement->type |= (1 << 6); + mapElement = surfaceElement; + } + + sub_6A6C66(x, y, mapElement, flags); + map_invalidate_tile_full(x, y); + } + + money32 price = RCT2_ADDRESS(0x0097DD78, money16)[ride->type * 2]; + price *= (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE) ? + RCT2_ADDRESS(0x0099DE34, money32)[type] : + RCT2_ADDRESS(0x0099DA34, money32)[type]; + + price >>= 16; + price = ((cost + price) / 2) * 10; + + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) { + return 0; + } + else { + return price; + } +} + /** * * rct2: 0x006C511D */ void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) { - RCT2_CALLFUNC_X(0x006C511D, eax, ebx, ecx, edx, esi, edi, ebp); + *ebx = track_place( + *edx & 0xFF, + (*edx >> 8) & 0xFF, + *eax & 0xFFFF, + *ecx & 0xFFFF, + *edi & 0xFFFF, + (*ebx >> 8) & 0xFF, + (*edi >> 16) & 0xFF, + (*edi >> 24) & 0x0F, + (*edi >> 28) & 0x0F, + (*edx >> 16), + *ebx & 0xFF + ); } /** From b947d11442f8548f4723abf652570e6600d95aeb Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Fri, 3 Jul 2015 21:40:26 +0100 Subject: [PATCH 0176/1173] Fix animated track elements. --- src/ride/track.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index ba826cba43..dee3efae74 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3831,16 +3831,16 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in switch (type) { case TRACK_ELEM_WATERFALL: - map_animation_create(MAP_ANIMATION_TYPE_TRACK_WATERFALL, x, y, z); + map_animation_create(MAP_ANIMATION_TYPE_TRACK_WATERFALL, x, y, mapElement->base_height); break; case TRACK_ELEM_RAPIDS: - map_animation_create(MAP_ANIMATION_TYPE_TRACK_RAPIDS, x, y, z); + map_animation_create(MAP_ANIMATION_TYPE_TRACK_RAPIDS, x, y, mapElement->base_height); break; case TRACK_ELEM_WHIRLPOOL: - map_animation_create(MAP_ANIMATION_TYPE_TRACK_WHIRLPOOL, x, y, z); + map_animation_create(MAP_ANIMATION_TYPE_TRACK_WHIRLPOOL, x, y, mapElement->base_height); break; case TRACK_ELEM_SPINNING_TUNNEL: - map_animation_create(MAP_ANIMATION_TYPE_TRACK_SPINNINGTUNNEL, x, y, z); + map_animation_create(MAP_ANIMATION_TYPE_TRACK_SPINNINGTUNNEL, x, y, mapElement->base_height); break; } if (type == TRACK_ELEM_BRAKES) { From 392c302d96145e9acce320b365b523aabb75be41 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 4 Jul 2015 04:00:14 +0100 Subject: [PATCH 0177/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 14c052c141..8c8a243d77 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3782,3 +3782,4 @@ STR_5449 :Spelsnelheid verlagen STR_5450 :Spelsnelheid verhogen STR_5451 :Cheatsvenster openen STR_5452 :Zichtbaarheid werkbalken schakelen +STR_5453 :Andere attractie selecteren From f230033eb009457cccf4c89aee1b9e5d07e55189 Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 4 Jul 2015 02:54:40 -0600 Subject: [PATCH 0178/1173] Fixed #1538 "Meeting the condition of having x guests..." --- src/scenario.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scenario.c b/src/scenario.c index 1e486f902a..e964f304be 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -1183,7 +1183,8 @@ static void scenario_objective_check_guests_and_rating() RCT2_GLOBAL(RCT2_ADDRESS_PARK_RATING_WARNING_DAYS, uint16) = 0; } - if (RCT2_GLOBAL(RCT2_ADDRESS_COMPLETED_COMPANY_VALUE, money32) != MONEY32_UNDEFINED) + // Not sure why this was checked here... + //if (RCT2_GLOBAL(RCT2_ADDRESS_COMPLETED_COMPANY_VALUE, money32) != MONEY32_UNDEFINED) if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, uint16) >= 700) if (RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) >= RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS, uint16)) scenario_success(); From 930ab6ac53a4aacb4abe5f5405dc8cd5fd8bdc6e Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 4 Jul 2015 03:37:38 -0600 Subject: [PATCH 0179/1173] Removed comment As requested --- src/scenario.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/scenario.c b/src/scenario.c index e964f304be..fde84c4687 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -1183,11 +1183,9 @@ static void scenario_objective_check_guests_and_rating() RCT2_GLOBAL(RCT2_ADDRESS_PARK_RATING_WARNING_DAYS, uint16) = 0; } - // Not sure why this was checked here... - //if (RCT2_GLOBAL(RCT2_ADDRESS_COMPLETED_COMPANY_VALUE, money32) != MONEY32_UNDEFINED) - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, uint16) >= 700) - if (RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) >= RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS, uint16)) - scenario_success(); + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, uint16) >= 700) + if (RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) >= RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS, uint16)) + scenario_success(); } static void scenario_objective_check_monthly_ride_income() @@ -1321,4 +1319,4 @@ static void scenario_objective_check() scenario_objective_check_monthly_food_income(); break; } -} \ No newline at end of file +} From 76b231c150641a324a4e36b253675d184fc5d8a4 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sat, 4 Jul 2015 13:00:32 -0600 Subject: [PATCH 0180/1173] add option to uncap fps, and fix #1470 --- data/language/english_uk.txt | 1 + src/config.c | 1 + src/config.h | 1 + src/game.c | 9 ---- src/openrct2.c | 81 ++++++++++++++++++++++++++++++------ src/platform/shared.c | 2 +- src/rct2.c | 26 +++++++++++- src/rct2.h | 1 + src/title.c | 7 +--- src/title.h | 1 + src/windows/options.c | 10 +++++ 11 files changed, 111 insertions(+), 29 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index dc258f115e..0286be4816 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3787,3 +3787,4 @@ STR_5450 :Increase game speed STR_5451 :Open cheats window STR_5452 :Toggle visibility of toolbars STR_5453 :Select another ride +STR_5454 :Uncap FPS \ No newline at end of file diff --git a/src/config.c b/src/config.c index 75e9c1dde0..de68b5ef6a 100644 --- a/src/config.c +++ b/src/config.c @@ -175,6 +175,7 @@ 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, uncap_fps), "uncap_fps", 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 }, { offsetof(general_configuration, date_format), "date_format", CONFIG_VALUE_TYPE_UINT8, DATE_FORMAT_DMY, _dateFormatEnum }, diff --git a/src/config.h b/src/config.h index 8c70b4b64b..160630f2a3 100644 --- a/src/config.h +++ b/src/config.h @@ -146,6 +146,7 @@ typedef struct { uint8 window_snap_proximity; uint8 autosave_frequency; uint8 hardware_display; + uint8 uncap_fps; uint8 test_unfinished_tracks; uint8 no_test_crashes; uint8 date_format; diff --git a/src/game.c b/src/game.c index 3febe86643..3ba4e54996 100644 --- a/src/game.c +++ b/src/game.c @@ -219,9 +219,6 @@ void game_update() { int i, numUpdates; - // Handles picked-up peep and rain redraw - redraw_peep_and_rain(); - // 0x006E3AEC // screen_game_process_mouse_input(); screenshot_check(); game_handle_keyboard_input(); @@ -288,7 +285,6 @@ void game_update() RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) &= ~(1 << 2); window_map_tooltip_update_visibility(); - window_update_all(); RCT2_GLOBAL(0x01388698, uint16)++; @@ -296,11 +292,6 @@ void game_update() RCT2_GLOBAL(0x0141F568, uint8) = RCT2_GLOBAL(0x0013CA740, uint8); game_handle_input(); - update_palette_effects(); - update_rain_animation(); - - stop_completed_sounds(); // removes other sounds that are no longer playing, this is normally called somewhere in rct2_init - if (RCT2_GLOBAL(0x009AAC73, uint8) != 255) { RCT2_GLOBAL(0x009AAC73, uint8)++; if (RCT2_GLOBAL(0x009AAC73, uint8) == 255) diff --git a/src/openrct2.c b/src/openrct2.c index d5589b8d0e..40e09b9ba0 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -24,6 +24,7 @@ #include "cmdline.h" #include "config.h" #include "editor.h" +#include "interface/window.h" #include "localisation/localisation.h" #include "network/http.h" #include "openrct2.h" @@ -236,24 +237,80 @@ void openrct2_dispose() static void openrct2_loop() { uint32 currentTick, ticksElapsed, lastTick = 0; + static uint32 uncapTick; + static int fps = 0; + static uint32 secondTick = 0; + static int uncappedinitialized = 0; + static struct { sint16 x, y, z; } spritelocations1[MAX_SPRITES], spritelocations2[MAX_SPRITES]; log_verbose("begin openrct2 loop"); _finished = 0; do { - currentTick = SDL_GetTicks(); - ticksElapsed = currentTick - lastTick; - if (ticksElapsed < 25) { - if (ticksElapsed < 15) - SDL_Delay(15 - ticksElapsed); - continue; + if (gConfigGeneral.uncap_fps) { + currentTick = SDL_GetTicks(); + if (!uncappedinitialized) { + uncapTick = SDL_GetTicks(); + for (uint16 i = 0; i < MAX_SPRITES; i++) { + spritelocations1[i].x = spritelocations2[i].x = g_sprite_list[i].unknown.x; + spritelocations1[i].y = spritelocations2[i].y = g_sprite_list[i].unknown.y; + spritelocations1[i].z = spritelocations2[i].z = g_sprite_list[i].unknown.z; + } + uncappedinitialized = 1; + } + while (uncapTick <= currentTick && currentTick - uncapTick > 25) { + for (uint16 i = 0; i < MAX_SPRITES; i++) { + spritelocations1[i].x = g_sprite_list[i].unknown.x; + spritelocations1[i].y = g_sprite_list[i].unknown.y; + spritelocations1[i].z = g_sprite_list[i].unknown.z; + } + rct2_update(); + for (uint16 i = 0; i < MAX_SPRITES; i++) { + spritelocations2[i].x = g_sprite_list[i].unknown.x; + spritelocations2[i].y = g_sprite_list[i].unknown.y; + spritelocations2[i].z = g_sprite_list[i].unknown.z; + } + uncapTick += 25; + } + float nudge = 1 - ((float)(currentTick - uncapTick) / 25); + for (uint16 i = 0; i < MAX_SPRITES; i++) { + if (!(g_sprite_list[i].unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_VEHICLE || g_sprite_list[i].unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_PEEP || g_sprite_list[i].unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_UNKNOWN)) { + continue; + } + sprite_move(spritelocations2[i].x + (sint16)((spritelocations1[i].x - spritelocations2[i].x) * nudge), spritelocations2[i].y + (sint16)((spritelocations1[i].y - spritelocations2[i].y) * nudge), spritelocations2[i].z + (sint16)((spritelocations1[i].z - spritelocations2[i].z) * nudge), &g_sprite_list[i]); + invalidate_sprite(&g_sprite_list[i]); + } + platform_process_messages(); + rct2_draw(); + platform_draw(); + fps++; + if (SDL_GetTicks() - secondTick >= 1000) { + fps = 0; + secondTick = SDL_GetTicks(); + } + for (uint16 i = 0; i < MAX_SPRITES; i++) { + if (!(g_sprite_list[i].unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_VEHICLE || g_sprite_list[i].unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_PEEP || g_sprite_list[i].unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_UNKNOWN)) { + continue; + } + sprite_move(spritelocations2[i].x, spritelocations2[i].y, spritelocations2[i].z, &g_sprite_list[i]); + } + } else { + uncappedinitialized = 0; + currentTick = SDL_GetTicks(); + ticksElapsed = currentTick - lastTick; + if (ticksElapsed < 25) { + if (ticksElapsed < 15) + SDL_Delay(15 - ticksElapsed); + continue; + } + + lastTick = currentTick; + + platform_process_messages(); + rct2_update(); + rct2_draw(); + platform_draw(); } - - lastTick = currentTick; - - platform_process_messages(); - rct2_update(); - platform_draw(); } while (!_finished); } diff --git a/src/platform/shared.c b/src/platform/shared.c index 77418e2137..529b7ce9cd 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -737,7 +737,7 @@ void platform_refresh_video() if (gConfigGeneral.hardware_display) { if (gRenderer == NULL) - gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED); + gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (gBufferTexture != NULL) SDL_DestroyTexture(gBufferTexture); diff --git a/src/rct2.c b/src/rct2.c index c2efdc4e92..b5b475e126 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -214,6 +214,29 @@ void rct2_update() rct2_update_2(); } +void rct2_draw() +{ + // Handles picked-up peep and rain redraw + redraw_peep_and_rain(); + + gfx_draw_all_dirty_blocks(); + + console_draw(RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo)); + + if (RCT2_GLOBAL(RCT2_ADDRESS_RUN_INTRO_TICK_PART, uint8) != 0) { + //intro + } else if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) { + //title + DrawOpenRCT2(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 20); + } else { + //game + } + + window_update_all(); + update_rain_animation(); + update_palette_effects(); +} + int rct2_open_file(const char *path) { char *extension = strrchr(path, '.'); @@ -350,9 +373,10 @@ void rct2_update_2() else game_update(); + stop_completed_sounds(); // removes other sounds that are no longer playing in directsound + twitch_update(); console_update(); - console_draw(RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo)); } void rct2_endupdate() diff --git a/src/rct2.h b/src/rct2.h index 9421c31888..30b4d7156d 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -305,6 +305,7 @@ static const struct file_to_check int rct2_init(); void rct2_update(); +void rct2_draw(); void rct2_endupdate(); void subsitute_path(char *dest, const char *path, const char *filename); int check_mutex(); diff --git a/src/title.c b/src/title.c index 310dba3c7e..11b819e756 100644 --- a/src/title.c +++ b/src/title.c @@ -420,7 +420,7 @@ static void title_update_showcase() } while (gTitleScriptSkipTo != -1 && gTitleScriptSkipLoad == -1); } -static void DrawOpenRCT2(int x, int y) +void DrawOpenRCT2(int x, int y) { char buffer[256]; rct_drawpixelinfo *dpi = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo); @@ -470,17 +470,12 @@ void title_update() window_map_tooltip_update_visibility(); window_dispatch_update_all(); - window_update_all(); - DrawOpenRCT2(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 20); RCT2_GLOBAL(0x01388698, uint16)++; // Input game_handle_input(); - update_palette_effects(); - update_rain_animation(); - if (RCT2_GLOBAL(0x009AAC73, uint8) != 255) { RCT2_GLOBAL(0x009AAC73, uint8)++; if (RCT2_GLOBAL(0x009AAC73, uint8) == 255) diff --git a/src/title.h b/src/title.h index b788e9e4aa..a07ee2e59b 100644 --- a/src/title.h +++ b/src/title.h @@ -45,5 +45,6 @@ void title_update(); void title_skip_from_beginning(); void title_script_get_line(FILE *file, char *parts); bool title_refresh_sequence(); +void DrawOpenRCT2(int x, int y); #endif diff --git a/src/windows/options.c b/src/windows/options.c index 86621a0836..a038be8344 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -78,6 +78,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_TILE_SMOOTHING_CHECKBOX, WIDX_GRIDLINES_CHECKBOX, WIDX_HARDWARE_DISPLAY_CHECKBOX, + WIDX_UNCAP_FPS_CHECKBOX, WIDX_MINIMIZE_FOCUS_LOSS, WIDX_CONSTRUCTION_MARKER, WIDX_CONSTRUCTION_MARKER_DROPDOWN, @@ -163,6 +164,7 @@ static rct_widget window_options_display_widgets[] = { { WWT_CHECKBOX, 1, 10, 290, 84, 95, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, // landscape smoothing { WWT_CHECKBOX, 1, 10, 290, 99, 110, STR_GRIDLINES, STR_GRIDLINES_TIP }, // gridlines { WWT_CHECKBOX, 1, 10, 290, 114, 125, 5154, STR_NONE }, // hardware display + { WWT_CHECKBOX, 1, 155, 290, 114, 125, 5454, STR_NONE }, // uncap fps { WWT_CHECKBOX, 1, 10, 290, 129, 140, 5440, STR_NONE }, // minimize fullscreen focus loss { WWT_DROPDOWN, 1, 155, 299, 143, 154, STR_NONE, STR_NONE }, // construction marker { WWT_DROPDOWN_BUTTON, 1, 288, 298, 144, 153, 876, STR_NONE }, @@ -327,6 +329,7 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_TILE_SMOOTHING_CHECKBOX) | (1 << WIDX_GRIDLINES_CHECKBOX) | (1 << WIDX_HARDWARE_DISPLAY_CHECKBOX) | + (1 << WIDX_UNCAP_FPS_CHECKBOX) | (1 << WIDX_MINIMIZE_FOCUS_LOSS) | (1 << WIDX_CONSTRUCTION_MARKER) | (1 << WIDX_CONSTRUCTION_MARKER_DROPDOWN) | @@ -463,6 +466,11 @@ static void window_options_mouseup() config_save_default(); window_invalidate(w); break; + case WIDX_UNCAP_FPS_CHECKBOX: + gConfigGeneral.uncap_fps ^= 1; + config_save_default(); + window_invalidate(w); + break; case WIDX_MINIMIZE_FOCUS_LOSS: gConfigGeneral.minimize_fullscreen_focus_loss ^= 1; platform_refresh_video(); @@ -1066,6 +1074,7 @@ static void window_options_invalidate() widget_set_checkbox_value(w, WIDX_TILE_SMOOTHING_CHECKBOX, (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_DISABLE_SMOOTH_LANDSCAPE) == 0); widget_set_checkbox_value(w, WIDX_GRIDLINES_CHECKBOX, RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_ALWAYS_SHOW_GRIDLINES); widget_set_checkbox_value(w, WIDX_HARDWARE_DISPLAY_CHECKBOX, gConfigGeneral.hardware_display); + widget_set_checkbox_value(w, WIDX_UNCAP_FPS_CHECKBOX, gConfigGeneral.uncap_fps); widget_set_checkbox_value(w, WIDX_MINIMIZE_FOCUS_LOSS, gConfigGeneral.minimize_fullscreen_focus_loss); // construction marker: celsius/fahrenheit @@ -1080,6 +1089,7 @@ static void window_options_invalidate() window_options_display_widgets[WIDX_CONSTRUCTION_MARKER].type = WWT_DROPDOWN; window_options_display_widgets[WIDX_CONSTRUCTION_MARKER_DROPDOWN].type = WWT_DROPDOWN_BUTTON; window_options_display_widgets[WIDX_HARDWARE_DISPLAY_CHECKBOX].type = WWT_CHECKBOX; + window_options_display_widgets[WIDX_UNCAP_FPS_CHECKBOX].type = WWT_CHECKBOX; window_options_display_widgets[WIDX_MINIMIZE_FOCUS_LOSS].type = WWT_CHECKBOX; window_options_display_widgets[WIDX_THEMES].type = WWT_DROPDOWN; window_options_display_widgets[WIDX_THEMES_DROPDOWN].type = WWT_DROPDOWN_BUTTON; From e0ea2d981765f7208584fef3c2b0498403118e0c Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 4 Jul 2015 22:50:48 +0100 Subject: [PATCH 0181/1173] Implemented track block get next and previous. Minor refactor of ride functions as well. --- src/ride/ride.c | 444 +++++++++++++++++++++++--------- src/ride/ride.h | 8 +- src/ride/ride_ratings.c | 4 +- src/ride/track.c | 26 +- src/ride/track.h | 11 + src/ride/track_data.c | 2 + src/ride/track_data.h | 12 +- src/windows/ride_construction.c | 20 +- src/windows/track_place.c | 4 +- 9 files changed, 368 insertions(+), 163 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 059e252cfc..51a371e404 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -43,6 +43,7 @@ #include "ride.h" #include "ride_data.h" #include "track.h" +#include "track_data.h" #include "station.h" #pragma region Ride classification table @@ -326,50 +327,274 @@ int sub_6CAF80(int rideIndex, rct_xy_element *output) return resultMapElement != NULL; } +/** +* +* rct2: 0x006C6096 +* Gets the next track block coordinates from the +* coordinates of the first of element of a track block. +* Use track_block_get_next if you are unsure if you are +* on the first element of a track block +*/ +bool track_block_get_next_from_zero(sint16 x, sint16 y, sint16 z_start, uint8 rideIndex, uint8 direction_start, rct_xy_element *output, int *z, int *direction) +{ + rct_ride* ride = GET_RIDE(rideIndex); + RCT2_GLOBAL(0x00F441D3, uint8) = direction_start; + + if (!(direction_start & (1 << 2))){ + x += RCT2_ADDRESS(0x00993CCC, sint16)[RCT2_GLOBAL(0x00F441D3, uint8) * 2]; + y += RCT2_ADDRESS(0x00993CCE, sint16)[RCT2_GLOBAL(0x00F441D3, uint8) * 2]; + } + + rct_map_element* mapElement = map_get_first_element_at(x / 32, y / 32); + if (mapElement == NULL){ + output->element = NULL; + output->x = (sint16)0x8000; + return 0; + } + + do{ + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) + continue; + + if (mapElement->properties.track.ride_index != rideIndex) + continue; + + if ((mapElement->properties.track.sequence & 0xF) != 0) + continue; + + const rct_preview_track* nextTrackBlock = get_track_def_from_ride(ride, mapElement->properties.track.type); + const rct_track_coordinates* nextTrackCoordinate = get_track_coord_from_ride(ride, mapElement->properties.track.type); + + uint8 nextRotation = + ((nextTrackCoordinate->rotation_begin + + (mapElement->type & MAP_ELEMENT_DIRECTION_MASK)) & MAP_ELEMENT_DIRECTION_MASK) | + (nextTrackCoordinate->rotation_begin & (1 << 2)); + + if (nextRotation != RCT2_GLOBAL(0x00F441D3, uint8)) + continue; + + sint16 nextZ = nextTrackCoordinate->z_begin - nextTrackBlock->z + mapElement->base_height * 8; + if (nextZ != z_start) + continue; + + if (z != NULL) *z = mapElement->base_height * 8; + if (direction != NULL) *direction = nextRotation; + output->x = x; + output->y = y; + output->element = mapElement; + return 1; + } while (!map_element_is_last_for_tile(mapElement++)); + + if (direction != NULL) *direction = RCT2_GLOBAL(0x00F441D3, uint8); + if (z != NULL) *z = z_start; + output->x = x; + output->y = y; + output->element = --mapElement; + return 0; +} + /** * * rct2: 0x006C60C2 */ -bool track_get_next(rct_xy_element *input, rct_xy_element *output, int *z, int *direction) +bool track_block_get_next(rct_xy_element *input, rct_xy_element *output, int *z, int *direction) { - int eax, ebx, ecx, edx, esi, edi, ebp, result; + uint8 rideIndex = input->element->properties.track.ride_index; + RCT2_GLOBAL(0x00F441D2, uint8) = rideIndex; + rct_ride* ride = GET_RIDE(rideIndex); - eax = input->x; - ecx = input->y; - esi = (int)input->element; - result = RCT2_CALLFUNC_X(0x006C60C2, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - output->x = *((uint16*)&eax); - output->y = *((uint16*)&ecx); - output->element = (rct_map_element*)esi; - if (z != NULL) *z = (edx & 0xFFFF); - if (direction != NULL) *direction = (ebx & 0xFF); + const rct_preview_track* trackBlock = get_track_def_from_ride(ride, input->element->properties.track.type); + uint8 sequence = input->element->properties.track.sequence & 0xF; + trackBlock += sequence; - return (result & 0x100) == 0; + const rct_track_coordinates* trackCoordinate = get_track_coord_from_ride(ride, input->element->properties.track.type); + + int x = input->x; + int y = input->y; + int OriginZ = input->element->base_height * 8; + + uint8 rotation = input->element->type & MAP_ELEMENT_DIRECTION_MASK; + switch (rotation){ + case 0: + x += trackCoordinate->x; + x -= trackBlock->x; + y += trackCoordinate->y; + y -= trackBlock->y; + break; + case 1: + x += trackCoordinate->y; + x -= trackBlock->y; + y -= trackCoordinate->x; + y += trackBlock->x; + break; + case 2: + x -= trackCoordinate->x; + x += trackBlock->x; + y -= trackCoordinate->y; + y += trackBlock->y; + break; + case 3: + x -= trackCoordinate->y; + x += trackBlock->y; + y += trackCoordinate->x; + y -= trackBlock->x; + break; + } + + OriginZ -= trackBlock->z; + OriginZ += trackCoordinate->z_end; + + uint8 directionStart = ((trackCoordinate->rotation_end + rotation) & MAP_ELEMENT_DIRECTION_MASK) | + (trackCoordinate->rotation_end & (1 << 2)); + + return track_block_get_next_from_zero(x, y, OriginZ, rideIndex, directionStart, output, z, direction); +} + +/* rct2: 0x006C63D6 + * Returns the begin position / direction and end position / direction of the track piece that procedes the given location. + * Gets the previous track block coordinates from the + * coordinates of the first of element of a track block. + * Use track_block_get_previous if you are unsure if you are + * on the first element of a track block + */ +bool track_block_get_previous_from_zero(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8 direction, track_begin_end *outTrackBeginEnd){ + rct_ride* ride = GET_RIDE(rideIndex); + + RCT2_GLOBAL(0x00F441D3, uint8) = direction; + direction ^= (1 << 1); + + if (!(direction & (1 << 2))){ + x += RCT2_ADDRESS(0x00993CCC, sint16)[direction * 2]; + y += RCT2_ADDRESS(0x00993CCE, sint16)[direction * 2]; + } + + rct_map_element* mapElement = map_get_first_element_at(x / 32, y / 32); + if (mapElement == NULL){ + outTrackBeginEnd->end_x = x; + outTrackBeginEnd->end_y = y; + outTrackBeginEnd->begin_element = NULL; + outTrackBeginEnd->begin_direction = RCT2_GLOBAL(0x00F441D3, uint8) ^ (1 << 1); + return 0; + } + + do{ + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) + continue; + + if (mapElement->properties.track.ride_index != rideIndex) + continue; + + const rct_preview_track* nextTrackBlock = get_track_def_from_ride(ride, mapElement->properties.track.type); + const rct_track_coordinates* nextTrackCoordinate = get_track_coord_from_ride(ride, mapElement->properties.track.type); + + nextTrackBlock += mapElement->properties.track.sequence & 0xF; + if ((nextTrackBlock + 1)->index != 255) + continue; + + uint8 nextRotation = + ((nextTrackCoordinate->rotation_end + + (mapElement->type & MAP_ELEMENT_DIRECTION_MASK)) & MAP_ELEMENT_DIRECTION_MASK) | + (nextTrackCoordinate->rotation_end & (1 << 2)); + + if (nextRotation != RCT2_GLOBAL(0x00F441D3, uint8)) + continue; + + sint16 nextZ = nextTrackCoordinate->z_end - nextTrackBlock->z + mapElement->base_height * 8; + if (nextZ != z) + continue; + + nextRotation = + ((nextTrackCoordinate->rotation_begin + + (mapElement->type & MAP_ELEMENT_DIRECTION_MASK)) & MAP_ELEMENT_DIRECTION_MASK) | + (nextTrackCoordinate->rotation_begin & (1 << 2)); + outTrackBeginEnd->begin_element = mapElement; + outTrackBeginEnd->begin_x = x; + outTrackBeginEnd->begin_y = y; + outTrackBeginEnd->end_x = x; + outTrackBeginEnd->end_y = y; + switch (nextRotation & 3){ + case 0: + outTrackBeginEnd->begin_x -= nextTrackCoordinate->x; + outTrackBeginEnd->begin_y -= nextTrackCoordinate->y; + break; + case 1: + outTrackBeginEnd->begin_x -= nextTrackCoordinate->y; + outTrackBeginEnd->begin_y += nextTrackCoordinate->x; + break; + case 2: + outTrackBeginEnd->begin_x += nextTrackCoordinate->x; + outTrackBeginEnd->begin_y += nextTrackCoordinate->y; + break; + case 3: + outTrackBeginEnd->begin_x += nextTrackCoordinate->y; + outTrackBeginEnd->begin_y -= nextTrackCoordinate->x; + break; + } + + outTrackBeginEnd->begin_z = mapElement->base_height * 8; + outTrackBeginEnd->begin_z += + nextTrackBlock->z - + get_track_def_from_ride(ride, mapElement->properties.track.type)->z; + + outTrackBeginEnd->begin_direction = nextRotation; + outTrackBeginEnd->end_direction = RCT2_GLOBAL(0x00F441D3, uint8) ^ (1 << 1); + return 1; + } while (!map_element_is_last_for_tile(mapElement++)); + + outTrackBeginEnd->end_x = x; + outTrackBeginEnd->end_y = y; + outTrackBeginEnd->begin_z = z; + outTrackBeginEnd->begin_element = NULL; + outTrackBeginEnd->end_direction = RCT2_GLOBAL(0x00F441D3, uint8) ^ (1 << 1); + return 0; } /** * * rct2: 0x006C6402 */ -bool track_get_previous(int x, int y, rct_map_element *mapElement, track_begin_end *outTrackBeginEnd) +bool track_block_get_previous(int x, int y, rct_map_element *mapElement, track_begin_end *outTrackBeginEnd) { - int eax, ebx, ecx, edx, esi, edi, ebp; + uint8 rideIndex = mapElement->properties.track.ride_index; + RCT2_GLOBAL(0x00F441D2, uint8) = rideIndex; + rct_ride* ride = GET_RIDE(rideIndex); - eax = x; - ecx = y; - esi = (int)mapElement; - int result = RCT2_CALLFUNC_X(0x006C6402, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - if (outTrackBeginEnd != NULL) { - outTrackBeginEnd->begin_x = ((eax >> 16) & 0xFFFF); - outTrackBeginEnd->begin_y = ((ecx >> 16) & 0xFFFF); - outTrackBeginEnd->begin_z = (edx & 0xFFFF); - outTrackBeginEnd->begin_direction = ((ebx >> 8) & 0xFF); - outTrackBeginEnd->begin_element = (rct_map_element*)esi; - outTrackBeginEnd->end_x = (eax & 0xFFFF); - outTrackBeginEnd->end_y = (ecx & 0xFFFF); - outTrackBeginEnd->end_direction = (ebx & 0xFF); + const rct_preview_track* trackBlock = get_track_def_from_ride(ride, mapElement->properties.track.type); + uint8 sequence = mapElement->properties.track.sequence & 0xF; + trackBlock += sequence; + + const rct_track_coordinates* trackCoordinate = get_track_coord_from_ride(ride, mapElement->properties.track.type); + + int z = mapElement->base_height * 8; + + uint8 rotation = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; + switch (rotation){ + case 0: + x -= trackBlock->x; + y -= trackBlock->y; + break; + case 1: + x -= trackBlock->y; + y += trackBlock->x; + break; + case 2: + x += trackBlock->x; + y += trackBlock->y; + break; + case 3: + x += trackBlock->y; + y -= trackBlock->x; + break; } - return (result & 0x100) == 0; + + z -= trackBlock->z; + z += trackCoordinate->z_begin; + + rotation = + ((trackCoordinate->rotation_begin + rotation) & MAP_ELEMENT_DIRECTION_MASK) | + (trackCoordinate->rotation_begin & (1 << 2)); + + return track_block_get_previous_from_zero(x, y, z, rideIndex, rotation, outTrackBeginEnd); } /** @@ -401,7 +626,7 @@ int ride_find_track_gap(rct_xy_element *input, rct_xy_element *output) loopTrackElement = NULL; while (1) { - if (!track_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { + if (!track_block_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { *output = trackElement; return 1; } @@ -944,56 +1169,6 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par return 0; } -/** - * - * rct2: 0x006C6096 - */ -rct_map_element *sub_6C6096(int *x, int *y, int *z, int *direction, int *direction2) -{ - int eax, ebx, ecx, edx, esi, edi, ebp; - eax = *x; - ecx = *y; - edx = *z; - ebx = *direction; - if (RCT2_CALLFUNC_X(0x006C6096, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) - return NULL; - - *x = (eax & 0xFFFF); - *y = (ecx & 0xFFFF); - *z = (edx & 0xFFFF); - *direction = (ebx & 0xFF); - if (direction2 != NULL) *direction2 = ((ebx >> 8) & 0xFF); - - return (rct_map_element*)esi; -} - -/** - * Returns the begin position / direction and end position / direction of the track piece that procedes the given location. - * rct2: 0x006C63D6 - */ -bool sub_6C63D6(int inX, int inY, int inZ, int inDirection, track_begin_end *outTrackBeginEnd) -{ - int eax, ebx, ecx, edx, esi, edi, ebp; - eax = inX; - ecx = inY; - edx = inZ; - ebx = inDirection; - if (RCT2_CALLFUNC_X(0x006C63D6, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) - return false; - - if (outTrackBeginEnd != NULL) { - outTrackBeginEnd->begin_x = ((eax >> 16) & 0xFFFF); - outTrackBeginEnd->begin_y = ((ecx >> 16) & 0xFFFF); - outTrackBeginEnd->begin_z = (edx & 0xFFFF); - outTrackBeginEnd->begin_direction = ((ebx >> 8) & 0xFF); - outTrackBeginEnd->begin_element = (rct_map_element*)esi; - outTrackBeginEnd->end_x = (eax & 0xFFFF); - outTrackBeginEnd->end_y = (ecx & 0xFFFF); - outTrackBeginEnd->end_direction = (ebx & 0xFF); - } - return true; -} - /** * * rct2: 0x006C96C0 @@ -1001,7 +1176,6 @@ bool sub_6C63D6(int inX, int inY, int inZ, int inDirection, track_begin_end *out void sub_6C96C0() { rct_ride *ride; - rct_map_element *trackElement; int rideIndex, x, y, z, direction; if (_currentTrackSelectionFlags & 4) { @@ -1038,13 +1212,14 @@ void sub_6C96C0() x -= TileDirectionDelta[direction].x; y -= TileDirectionDelta[direction].y; } - trackElement = sub_6C6096(&x, &y, &z, &direction, NULL); - if (trackElement != NULL) { + rct_xy_element next_track; + + if (track_block_get_next_from_zero(x, y, z, rideIndex, direction, &next_track, &z, &direction)) { game_do_command( - x, + next_track.x, 105 | ((direction & 3) << 8), - y, - trackElement->properties.track.type | ((trackElement->properties.track.sequence & 0x0F) << 8), + next_track.y, + next_track.element->properties.track.type | ((next_track.element->properties.track.sequence & 0x0F) << 8), GAME_COMMAND_REMOVE_TRACK, z, 0 @@ -1130,7 +1305,7 @@ void ride_select_next_section() inputElement.x = x; inputElement.y = y; inputElement.element = mapElement; - if (track_get_next(&inputElement, &outputElement, &z, &direction)) { + if (track_block_get_next(&inputElement, &outputElement, &z, &direction)) { x = outputElement.x; y = outputElement.y; mapElement = outputElement.element; @@ -1185,7 +1360,7 @@ void ride_select_previous_section() sub_6C84CE(); return; } - if (track_get_previous(x, y, mapElement, &trackBeginEnd)) { + if (track_block_get_previous(x, y, mapElement, &trackBeginEnd)) { _currentTrackBeginX = trackBeginEnd.begin_x; _currentTrackBeginY = trackBeginEnd.begin_y; _currentTrackBeginZ = trackBeginEnd.begin_z; @@ -3569,7 +3744,7 @@ int ride_check_block_brakes(rct_xy_element *input, rct_xy_element *output) loopTrackElement = NULL; while (1) { - if (!track_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { + if (!track_block_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { // Not sure why this is the case... RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_BLOCK_BRAKES_CANNOT_BE_USED_DIRECTLY_AFTER_STATION; *output = trackElement; @@ -3649,22 +3824,47 @@ int ride_check_track_suitability_b(rct_xy_element *input, rct_xy_element *output */ int ride_check_station_length(rct_xy_element *input, rct_xy_element *output) { - int eax, ebx, ecx, edx, esi, edi, ebp, result; + rct_window* w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w != 0 && + _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && + _currentRideIndex == input->element->properties.track.ride_index){ + sub_6C9627(); + } - // This function has a bug. If the station length is too short and it is - // the last station of a ride it will return a pointer to the map_element - // where the station piece should go. Instead it should pass the map_element - // of the last good station piece. This can cause null pointer dereferences - // and cause the map to move to the top left hand corner. - eax = input->x; - ecx = input->y; - esi = (int)input->element; - result = RCT2_CALLFUNC_X(0x006CB25D, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - output->x = (uint16)eax; - output->y = (uint16)ecx; - output->element = (rct_map_element*)esi; + output->x = input->x; + output->y = input->y; + output->element = input->element; + track_begin_end trackBeginEnd; + while (track_block_get_previous(output->x, output->y, output->element, &trackBeginEnd)){ + output->x = trackBeginEnd.begin_x; + output->y = trackBeginEnd.begin_y; + output->element = trackBeginEnd.begin_element; + } - return (result & 0x100) != 0; + int num_station_elements = 0; + rct_xy_element last_good_station = *output; + + do{ + if (RCT2_ADDRESS(0x0099BA64, uint8)[output->element->properties.track.type * 16] & 0x10){ + num_station_elements++; + last_good_station = *output; + } + else{ + if (num_station_elements == 0) + continue; + if (num_station_elements == 1){ + return 0; + } + num_station_elements = 0; + } + } while (track_block_get_next(output, output, NULL, NULL)); + + // Prevent returning a pointer to a map element with no track. + *output = last_good_station; + if (num_station_elements == 1) + return 0; + + return 1; } /** @@ -3717,17 +3917,17 @@ void sub_6B4D26(int rideIndex, rct_xy_element *startElement) do { trackType = currentElement.element->properties.track.type; switch (trackType) { - case 1: // end of station - case 123: // cable lift hill - case 9: // 25deg up to flat - case 63: // 60deg up to flat - case 147: // diag 25deg up to flat - case 155: // diag 60deg up to flat + case TRACK_ELEM_END_STATION: + case TRACK_ELEM_CABLE_LIFT_HILL: + case TRACK_ELEM_25_DEG_UP_TO_FLAT: + case TRACK_ELEM_60_DEG_UP_TO_FLAT: + case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT: + case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT: case 216: // block brakes currentElement.element->flags &= ~(1 << 5); break; } - } while (track_get_next(¤tElement, ¤tElement, NULL, NULL) && currentElement.element != startElement->element); + } while (track_block_get_next(¤tElement, ¤tElement, NULL, NULL) && currentElement.element != startElement->element); } } @@ -3940,14 +4140,8 @@ int ride_is_valid_for_test(int rideIndex, int goingToBeOpen, int isApplying) } 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); + if (!ride_check_station_length(&trackElement, &problematicTrackElement)) { + loc_6B528A(&problematicTrackElement); return 0; } @@ -4879,7 +5073,7 @@ bool ride_select_backwards_from_front() sub_6C9627(); RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex; - if (sub_6C63D6(_currentTrackBeginX, _currentTrackBeginY, _currentTrackBeginZ, _currentTrackPieceDirection, &trackBeginEnd)) { + if (track_block_get_previous_from_zero(_currentTrackBeginX, _currentTrackBeginY, _currentTrackBeginZ, _currentRideIndex, _currentTrackPieceDirection, &trackBeginEnd)) { _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; _currentTrackBeginX = trackBeginEnd.begin_x; _currentTrackBeginY = trackBeginEnd.begin_y; @@ -4896,7 +5090,6 @@ bool ride_select_backwards_from_front() bool ride_select_forwards_from_back() { - rct_map_element *mapElement; int x, y, z, direction; sub_6C9627(); @@ -4906,14 +5099,15 @@ bool ride_select_forwards_from_back() y = _currentTrackBeginY; z = _currentTrackBeginZ; direction = _currentTrackPieceDirection ^ 2; - mapElement = sub_6C6096(&x, &y, &z, &direction, NULL); - if (mapElement != NULL) { + rct_xy_element next_track; + + if (track_block_get_next_from_zero(x, y, z, _currentRideIndex, direction, &next_track, &z, &direction)) { _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; - _currentTrackBeginX = x; - _currentTrackBeginY = y; + _currentTrackBeginX = next_track.x; + _currentTrackBeginY = next_track.y; _currentTrackBeginZ = z; - _currentTrackPieceDirection = (mapElement->type & MAP_ELEMENT_DIRECTION_MASK); - _currentTrackPieceType = mapElement->properties.track.type; + _currentTrackPieceDirection = (next_track.element->type & MAP_ELEMENT_DIRECTION_MASK); + _currentTrackPieceType = next_track.element->properties.track.type; _currentTrackSelectionFlags = 0; _rideConstructionArrowPulseTime = 0; return true; diff --git a/src/ride/ride.h b/src/ride/ride.h index 9d7cc817b7..88bd311228 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -929,11 +929,11 @@ void ride_all_has_any_track_elements(bool *rideIndexArray); void sub_6C9800(); -bool track_get_next(rct_xy_element *input, rct_xy_element *output, int *z, int *direction); -bool track_get_previous(int x, int y, rct_map_element *mapElement, track_begin_end *outTrackBeginEnd); +bool track_block_get_next(rct_xy_element *input, rct_xy_element *output, int *z, int *direction); +bool track_block_get_next_from_zero(sint16 x, sint16 y, sint16 z_start, uint8 rideIndex, uint8 direction_start, rct_xy_element *output, int *z, int *direction); -rct_map_element *sub_6C6096(int *x, int *y, int *z, int *direction, int *direction2); -bool sub_6C63D6(int inX, int inY, int inZ, int inDirection, track_begin_end *outTrackBeginEnd); +bool track_block_get_previous(int x, int y, rct_map_element *mapElement, track_begin_end *outTrackBeginEnd); +bool track_block_get_previous_from_zero(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8 direction, track_begin_end *outTrackBeginEnd); void sub_6C84CE(); void sub_6C96C0(); diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index a74aa81263..14e0f2a61d 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -230,7 +230,7 @@ static void ride_ratings_update_state_2() trackElement.x = RCT2_GLOBAL(0x0138B584, uint16); trackElement.y = RCT2_GLOBAL(0x0138B586, uint16); trackElement.element = mapElement; - if (!track_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { + if (!track_block_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { _rideRatingsState = RIDE_RATINGS_STATE_4; return; } @@ -324,7 +324,7 @@ static void ride_ratings_update_state_5() x = RCT2_GLOBAL(0x0138B584, uint16); y = RCT2_GLOBAL(0x0138B586, uint16); - if (!track_get_previous(x, y, mapElement, NULL)) { + if (!track_block_get_previous(x, y, mapElement, NULL)) { _rideRatingsState = RIDE_RATINGS_STATE_CALCULATE; return; } diff --git a/src/ride/track.c b/src/ride/track.c index dee3efae74..2be86969fc 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1584,7 +1584,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac //di int temp_z = z; - temp_z -= track_coordinates->z_negative; + temp_z -= track_coordinates->z_begin; const rct_preview_track* trackBlock = TrackBlocks[track_type]; temp_z += trackBlock->z; @@ -1601,7 +1601,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac //di int temp_z = z; - temp_z -= track_coordinates->z_negative; + temp_z -= track_coordinates->z_begin; uint32 edi = ((track->flags & 0xF) << 17) | ((track->flags & 0xF) << 28) | (((track->flags >> 4) & 0x3) << 24) | @@ -1715,12 +1715,12 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac break; } - z -= track_coordinates->z_negative; - z += track_coordinates->z_positive; + z -= track_coordinates->z_begin; + z += track_coordinates->z_end; - rotation += track_coordinates->rotation_positive - track_coordinates->rotation_negative; + rotation += track_coordinates->rotation_end - track_coordinates->rotation_begin; rotation &= 3; - if (track_coordinates->rotation_positive & (1 << 2)) + if (track_coordinates->rotation_end & (1 << 2)) rotation |= (1 << 2); if (!(rotation & (1 << 2))){ @@ -2631,10 +2631,10 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra int z = 0; //6ce69e - if (track_get_previous(trackElement.x, trackElement.y, trackElement.element, &trackBeginEnd)) { + if (track_block_get_previous(trackElement.x, trackElement.y, trackElement.element, &trackBeginEnd)) { rct_map_element* initial_map = trackElement.element; do { - if (!track_get_previous(trackBeginEnd.begin_x, trackBeginEnd.begin_y, trackBeginEnd.begin_element, &trackBeginEnd)) { + if (!track_block_get_previous(trackBeginEnd.begin_x, trackBeginEnd.begin_y, trackBeginEnd.begin_element, &trackBeginEnd)) { break; } } while (initial_map != trackElement.element); @@ -2658,7 +2658,7 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra sint16 start_x = trackElement.x; sint16 start_y = trackElement.y; - sint16 start_z = z + trackCoordinates->z_negative; + sint16 start_z = z + trackCoordinates->z_begin; RCT2_GLOBAL(0x00F44142, sint16) = start_x; RCT2_GLOBAL(0x00F44144, sint16) = start_y; RCT2_GLOBAL(0x00F44146, sint16) = start_z; @@ -2729,7 +2729,7 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra track->flags = flags; track++; - if (!track_get_next(&trackElement, &trackElement, NULL, NULL)) + if (!track_block_get_next(&trackElement, &trackElement, NULL, NULL)) break; z = trackElement.element->base_height * 8; @@ -3436,6 +3436,12 @@ const rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType) TrackBlocks[trackType]; } +const rct_track_coordinates *get_track_coord_from_ride(rct_ride *ride, int trackType){ + return ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? + &FlatTrackCoordinates[trackType] : + &TrackCoordinates[trackType]; +} + const rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType) { return get_track_def_from_ride(GET_RIDE(rideIndex), trackType); diff --git a/src/ride/track.h b/src/ride/track.h index 39c05890c7..98b43c27dc 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -48,6 +48,16 @@ typedef struct { uint8 var_09; } rct_preview_track; +/* size 0x0A */ +typedef struct{ + sint8 rotation_begin; // 0x00 + sint8 rotation_end; // 0x01 + sint16 z_begin; // 0x02 + sint16 z_end; // 0x04 + sint16 x; // 0x06 + sint16 y; // 0x08 +}rct_track_coordinates; + /** * Size: 0x04 */ @@ -493,6 +503,7 @@ void track_save_select_nearby_scenery(int rideIndex); const rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType); const rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType); +const rct_track_coordinates *get_track_coord_from_ride(rct_ride *ride, int trackType); void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); diff --git a/src/ride/track_data.c b/src/ride/track_data.c index 5a3759230b..42d539eba7 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -21,6 +21,8 @@ #include "track.h" #include "track_data.h" +const rct_track_coordinates* FlatTrackCoordinates = RCT2_ADDRESS(0x009972BB, const rct_track_coordinates); + const rct_track_coordinates TrackCoordinates[256] = { { 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 }, diff --git a/src/ride/track_data.h b/src/ride/track_data.h index e4da7a149f..932e01636f 100644 --- a/src/ride/track_data.h +++ b/src/ride/track_data.h @@ -20,18 +20,10 @@ #include "../common.h" -/* size 0x0A */ -typedef struct{ - sint8 rotation_negative; // 0x00 - sint8 rotation_positive; // 0x01 - sint16 z_negative; // 0x02 - sint16 z_positive; // 0x04 - sint16 x; // 0x06 - sint16 y; // 0x08 -}rct_track_coordinates; - // 0x009968BB, 0x009968BC, 0x009968BD, 0x009968BF, 0x009968C1, 0x009968C3 extern const rct_track_coordinates TrackCoordinates[256]; +// 0x009972BB, 0x009972BC, 0x009972BD, 0x009972BF, 0x009972C1, 0x009972C3 +extern const rct_track_coordinates* FlatTrackCoordinates; extern const uint64 RideTypePossibleTrackConfigurations[91]; extern const rct_preview_track *TrackBlocks[256]; diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index ec0d61aa02..39bf04df6f 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1616,7 +1616,7 @@ static void window_ride_construction_construct(rct_window *w) y += TileDirectionDelta[trackDirection].y; } - if (sub_6C63D6(x, y, z, trackDirection, &trackBeginEnd)) { + if (track_block_get_previous_from_zero(x, y, z, _currentRideIndex, trackDirection, &trackBeginEnd)) { _currentTrackBeginX = trackBeginEnd.begin_x; _currentTrackBeginY = trackBeginEnd.begin_y; _currentTrackBeginZ = trackBeginEnd.begin_z; @@ -1640,14 +1640,13 @@ static void window_ride_construction_construct(rct_window *w) y -= TileDirectionDelta[trackDirection].y; } - int dir2; - rct_map_element *mapElement = sub_6C6096(&x, &y, &z, &trackDirection, &dir2); - if (mapElement != NULL) { - _currentTrackBeginX = x; - _currentTrackBeginY = y; + rct_xy_element next_track; + if (track_block_get_next_from_zero(x, y, z, _currentRideIndex, trackDirection, &next_track, &z, &trackDirection)) { + _currentTrackBeginX = next_track.x; + _currentTrackBeginY = next_track.y; _currentTrackBeginZ = z; - _currentTrackPieceDirection = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; - _currentTrackPieceType = mapElement->properties.track.type; + _currentTrackPieceDirection = next_track.element->type & MAP_ELEMENT_DIRECTION_MASK; + _currentTrackPieceType = next_track.element->properties.track.type; _currentTrackSelectionFlags = 0; _rideConstructionArrowPulseTime = 0; _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; @@ -1706,14 +1705,15 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) inputElement.x = x; inputElement.y = y; inputElement.element = mapElement; - if (track_get_previous(x, y, mapElement, &trackBeginEnd)) { + if (track_block_get_previous(x, y, mapElement, &trackBeginEnd)) { x = trackBeginEnd.begin_x; y = trackBeginEnd.begin_y; z = trackBeginEnd.begin_z; direction = trackBeginEnd.begin_direction; type = trackBeginEnd.begin_element->properties.track.type; gotoStartPlacementMode = false; - } else if (track_get_next(&inputElement, &outputElement, &z, &direction)) { + } + else if (track_block_get_next(&inputElement, &outputElement, &z, &direction)) { x = outputElement.x; y = outputElement.y; direction = outputElement.element->type & MAP_ELEMENT_DIRECTION_MASK; diff --git a/src/windows/track_place.c b/src/windows/track_place.c index c204bff517..83db7c7698 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -235,9 +235,9 @@ static void window_track_place_draw_mini_preview() originY += track_coordinate->x; break; } - rotation += track_coordinate->rotation_positive - track_coordinate->rotation_negative; + rotation += track_coordinate->rotation_end - track_coordinate->rotation_begin; rotation &= 3; - if (track_coordinate->rotation_positive & 4) + if (track_coordinate->rotation_end & 4) rotation |= 4; if (!(rotation & 4)) { originX += RCT2_GLOBAL(0x00993CCC + (rotation * 4), sint16); From f0bba54e79060cfad6567e6ccfe5b51ad6db6537 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 4 Jul 2015 23:51:23 +0100 Subject: [PATCH 0182/1173] uncapped FPS: fix viewport chopiness and reset after park load --- src/game.c | 1 + src/interface/window.c | 12 ++++++--- src/interface/window.h | 1 + src/openrct2.c | 58 ++++++++++++++++++++++++++++++++++++++---- src/openrct2.h | 1 + src/scenario.c | 2 ++ 6 files changed, 66 insertions(+), 9 deletions(-) diff --git a/src/game.c b/src/game.c index 3ba4e54996..02876215e0 100644 --- a/src/game.c +++ b/src/game.c @@ -670,6 +670,7 @@ int game_load_sv6(const char *path) reset_loaded_objects(); map_update_tile_pointers(); reset_0x69EBE4(); + gOpenRCT2ResetFrameSmoothing = true; return 1; } diff --git a/src/interface/window.c b/src/interface/window.c index 264d89beac..f5a23c6a66 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -156,6 +156,13 @@ void window_dispatch_update_all() RCT2_CALLPROC_EBPSAFE(0x006EE411); // handle_text_input } +void window_update_all_viewports() +{ + for (rct_window *w = g_window_list; w < RCT2_NEW_WINDOW; w++) + if (w->viewport != NULL) + viewport_update_position(w); +} + /** * * rct2: 0x006E77A1 @@ -169,10 +176,7 @@ void window_update_all() return; gfx_draw_all_dirty_blocks(); - - for (w = g_window_list; w < RCT2_NEW_WINDOW; w++) - if (w->viewport != NULL) - viewport_update_position(w); + window_update_all_viewports(); // 1000 tick update RCT2_GLOBAL(0x009DEB7C, sint16) += RCT2_GLOBAL(0x009DE588, sint16); diff --git a/src/interface/window.h b/src/interface/window.h index 9423d7c31c..6093d52ee1 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -459,6 +459,7 @@ extern rct_window* g_window_list; extern ride_list_item _window_track_list_item; void window_dispatch_update_all(); +void window_update_all_viewports(); void window_update_all(); rct_window *window_create(int x, int y, int width, int height, uint32 *event_handlers, rct_windowclass cls, uint16 flags); rct_window *window_create_auto_pos(int width, int height, uint32 *event_handlers, rct_windowclass cls, uint16 flags); diff --git a/src/openrct2.c b/src/openrct2.c index 40e09b9ba0..acea0970e8 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -42,6 +42,10 @@ bool gOpenRCT2Headless = false; bool gOpenRCT2ShowChangelog; +// This needs to be set when a park is loaded. It could also be used to reset other important states, it should then be renamed +// to something more general. +bool gOpenRCT2ResetFrameSmoothing = false; + /** If set, will end the OpenRCT2 game loop. Intentially private to this module so that the flag can not be set back to 0. */ int _finished; @@ -231,6 +235,21 @@ void openrct2_dispose() platform_free(); } +/** + * Determines whether its worth tweening a sprite or not when frame smoothing is on. + */ +static bool sprite_should_tween(rct_sprite *sprite) +{ + if (sprite->unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_VEHICLE) + return true; + if (sprite->unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_PEEP) + return true; + if (sprite->unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_UNKNOWN) + return true; + + return false; +} + /** * Run the main game loop until the finished flag is set at 40fps (25ms interval). */ @@ -250,6 +269,7 @@ static void openrct2_loop() if (gConfigGeneral.uncap_fps) { currentTick = SDL_GetTicks(); if (!uncappedinitialized) { + // Reset sprite locations uncapTick = SDL_GetTicks(); for (uint16 i = 0; i < MAX_SPRITES; i++) { spritelocations1[i].x = spritelocations2[i].x = g_sprite_list[i].unknown.x; @@ -258,28 +278,51 @@ static void openrct2_loop() } uncappedinitialized = 1; } + while (uncapTick <= currentTick && currentTick - uncapTick > 25) { + // Get the original position of each sprite for (uint16 i = 0; i < MAX_SPRITES; i++) { spritelocations1[i].x = g_sprite_list[i].unknown.x; spritelocations1[i].y = g_sprite_list[i].unknown.y; spritelocations1[i].z = g_sprite_list[i].unknown.z; } + + // Update the game so the sprite positions update rct2_update(); + if (gOpenRCT2ResetFrameSmoothing) { + gOpenRCT2ResetFrameSmoothing = false; + continue; + } + + // Get the next position of each sprite for (uint16 i = 0; i < MAX_SPRITES; i++) { spritelocations2[i].x = g_sprite_list[i].unknown.x; spritelocations2[i].y = g_sprite_list[i].unknown.y; spritelocations2[i].z = g_sprite_list[i].unknown.z; } + uncapTick += 25; } + + // Tween the position of each sprite from the last position to the new position based on the time between the last + // tick and the next tick. float nudge = 1 - ((float)(currentTick - uncapTick) / 25); for (uint16 i = 0; i < MAX_SPRITES; i++) { - if (!(g_sprite_list[i].unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_VEHICLE || g_sprite_list[i].unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_PEEP || g_sprite_list[i].unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_UNKNOWN)) { + if (!sprite_should_tween(&g_sprite_list[i])) continue; - } - sprite_move(spritelocations2[i].x + (sint16)((spritelocations1[i].x - spritelocations2[i].x) * nudge), spritelocations2[i].y + (sint16)((spritelocations1[i].y - spritelocations2[i].y) * nudge), spritelocations2[i].z + (sint16)((spritelocations1[i].z - spritelocations2[i].z) * nudge), &g_sprite_list[i]); + + sprite_move( + spritelocations2[i].x + (sint16)((spritelocations1[i].x - spritelocations2[i].x) * nudge), + spritelocations2[i].y + (sint16)((spritelocations1[i].y - spritelocations2[i].y) * nudge), + spritelocations2[i].z + (sint16)((spritelocations1[i].z - spritelocations2[i].z) * nudge), + &g_sprite_list[i] + ); invalidate_sprite(&g_sprite_list[i]); } + + // Viewports need to be updated to reduce chopiness of those which follow sprites + window_update_all_viewports(); + platform_process_messages(); rct2_draw(); platform_draw(); @@ -288,10 +331,12 @@ static void openrct2_loop() fps = 0; secondTick = SDL_GetTicks(); } + + // Restore the real positions of the sprites so they aren't left at the mid-tween positions for (uint16 i = 0; i < MAX_SPRITES; i++) { - if (!(g_sprite_list[i].unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_VEHICLE || g_sprite_list[i].unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_PEEP || g_sprite_list[i].unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_UNKNOWN)) { + if (!sprite_should_tween(&g_sprite_list[i])) continue; - } + sprite_move(spritelocations2[i].x, spritelocations2[i].y, spritelocations2[i].z, &g_sprite_list[i]); } } else { @@ -307,7 +352,10 @@ static void openrct2_loop() lastTick = currentTick; platform_process_messages(); + rct2_update(); + gOpenRCT2ResetFrameSmoothing = false; + rct2_draw(); platform_draw(); } diff --git a/src/openrct2.h b/src/openrct2.h index 120b09051f..227ca0cba4 100644 --- a/src/openrct2.h +++ b/src/openrct2.h @@ -35,6 +35,7 @@ extern char gOpenRCT2StartupActionPath[512]; extern char gExePath[MAX_PATH]; extern bool gOpenRCT2Headless; extern bool gOpenRCT2ShowChangelog; +extern bool gOpenRCT2ResetFrameSmoothing; bool openrct2_initialise(); void openrct2_launch(); diff --git a/src/scenario.c b/src/scenario.c index fde84c4687..e15ed1911b 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -30,6 +30,7 @@ #include "management/research.h" #include "management/news_item.h" #include "object.h" +#include "openrct2.h" #include "peep/staff.h" #include "platform/platform.h" #include "ride/ride.h" @@ -178,6 +179,7 @@ int scenario_load(const char *path) reset_loaded_objects(); map_update_tile_pointers(); reset_0x69EBE4(); + gOpenRCT2ResetFrameSmoothing = true; return 1; } From 8fe245721bca4122027a5559bdc79db90541a501 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 5 Jul 2015 04:00:14 +0100 Subject: [PATCH 0183/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/german.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/language/german.txt b/data/language/german.txt index e559b15816..a76e936a9c 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3487,7 +3487,7 @@ STR_5150 :Aktiviere Debugging-Tools STR_5151 :. STR_5152 :, STR_5153 :Themen bearbeiten... -STR_5154 :Anzeige über Hardware durchführen +STR_5154 :Anzeige durch Hardware STR_5155 :Testen unfertiger Bahnen erlauben STR_5156 :{SMALLFONT}{BLACK}Erlaubt das Testen der meisten Bahnarten, selbst wenn die Strecke nicht fertiggestellt ist, das gilt nicht für den Streckenmodus mit Blockbereichen STR_5157 :Alle Preise freischalten @@ -3787,3 +3787,4 @@ STR_5450 :Spielgeschwindigkeit erhöhen STR_5451 :Cheatfenster anzeigen STR_5452 :Symbolleiste ein-/ausblenden STR_5453 :Andere Attraktion auswählen +STR_5454 :FPS-Limit aufheben From 2c64609903995cf062323a2a3c3a9eb64579a1e9 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sun, 5 Jul 2015 11:01:20 +0200 Subject: [PATCH 0184/1173] Properly differentiate between the Twister RC track and the Twister RC vehicle. Stops two different rides from showing up as 'Twister RC'. --- data/language/english_uk.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 0286be4816..7a0c6f46b7 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -54,7 +54,7 @@ STR_0049 :Haunted House STR_0050 :First Aid Room STR_0051 :Circus Show STR_0052 :Ghost Train -STR_0053 :Twister Roller Coaster +STR_0053 :Steel Twister Roller Coaster STR_0054 :Wooden Roller Coaster STR_0055 :Side-Friction Roller Coaster STR_0056 :Wild Mouse @@ -3787,4 +3787,4 @@ STR_5450 :Increase game speed STR_5451 :Open cheats window STR_5452 :Toggle visibility of toolbars STR_5453 :Select another ride -STR_5454 :Uncap FPS \ No newline at end of file +STR_5454 :Uncap FPS From dfb63ebe8841c35b38ed416100a0f549dfa15b1f Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 5 Jul 2015 10:55:02 +0100 Subject: [PATCH 0185/1173] Fix track previous from not selecting corkscrews. Issue was caused by wrong order of adding up the z coordinates of the previous track block --- src/ride/ride.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 51a371e404..f5021b106a 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -533,8 +533,8 @@ bool track_block_get_previous_from_zero(sint16 x, sint16 y, sint16 z, uint8 ride outTrackBeginEnd->begin_z = mapElement->base_height * 8; outTrackBeginEnd->begin_z += - nextTrackBlock->z - - get_track_def_from_ride(ride, mapElement->properties.track.type)->z; + get_track_def_from_ride(ride, mapElement->properties.track.type)->z - + nextTrackBlock->z; outTrackBeginEnd->begin_direction = nextRotation; outTrackBeginEnd->end_direction = RCT2_GLOBAL(0x00F441D3, uint8) ^ (1 << 1); From 20f6b8731f60044c1adee6b7ca64384f9f4c2f11 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 5 Jul 2015 11:50:43 +0100 Subject: [PATCH 0186/1173] Implemented track_remove --- src/ride/track.c | 264 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 263 insertions(+), 1 deletion(-) diff --git a/src/ride/track.c b/src/ride/track.c index 2be86969fc..d3f26cb792 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3929,13 +3929,275 @@ void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, ); } +money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, sint16 originZ, uint8 rotation, uint8 flags){ + RCT2_GLOBAL(0x00141F56C, uint8) = 0; + RCT2_GLOBAL(0x009DEA5E, sint16) = originX + 16; + RCT2_GLOBAL(0x009DEA60, sint16) = originY + 16; + RCT2_GLOBAL(0x009DEA62, sint16) = originZ; + RCT2_GLOBAL(0x00F440E1, uint8) = sequence; + + switch (type){ + case TRACK_ELEM_BEGIN_STATION: + case TRACK_ELEM_MIDDLE_STATION: + type = TRACK_ELEM_END_STATION; + break; + } + + if (!(flags & (1 << 3)) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 2214; + return MONEY32_UNDEFINED; + } + + uint8 found = 0; + rct_map_element* mapElement = map_get_first_element_at(originX / 32, originY / 32); + do{ + if (mapElement->base_height * 8 != originZ) + continue; + + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) + continue; + + if ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) != rotation) + continue; + + if ((mapElement->properties.track.sequence & 0xF) != sequence) + continue; + + // Probably should add a check for ghost here as well! + + uint8 track_type = mapElement->properties.track.type; + switch (track_type){ + case TRACK_ELEM_BEGIN_STATION: + case TRACK_ELEM_MIDDLE_STATION: + track_type = TRACK_ELEM_END_STATION; + break; + } + + if (track_type != type) + continue; + + found = 1; + break; + } while (!map_element_is_last_for_tile(mapElement++)); + + if (!found){ + return MONEY32_UNDEFINED; + } + + if (mapElement->flags & (1 << 6)){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 3091; + return MONEY32_UNDEFINED; + } + + uint8 rideIndex = mapElement->properties.track.ride_index; + type = mapElement->properties.track.type; + RCT2_GLOBAL(0x00F44139, uint8) = type; + RCT2_GLOBAL(0x00F44138, uint8) = rideIndex; + RCT2_GLOBAL(0x00F4414C, uint8) = mapElement->type; + + rct_ride* ride = GET_RIDE(rideIndex); + const rct_preview_track* trackBlock = get_track_def_from_ride(ride, type); + trackBlock += mapElement->properties.track.sequence & 0xF; + + + switch (mapElement->type & MAP_ELEMENT_DIRECTION_MASK){ + case 0: + originX -= trackBlock->x; + originY -= trackBlock->y; + break; + case 1: + originX -= trackBlock->y; + originY += trackBlock->x; + break; + case 2: + originX += trackBlock->x; + originY += trackBlock->y; + break; + case 3: + originX += trackBlock->y; + originY -= trackBlock->x; + break; + } + + originZ -= trackBlock->z; + + money32 cost = 0; + + trackBlock = get_track_def_from_ride(ride, type); + for (; trackBlock->index != 255; trackBlock++){ + sint16 x = originX, y = originY, z = originZ; + + switch (mapElement->type & MAP_ELEMENT_DIRECTION_MASK){ + case 0: + x += trackBlock->x; + y += trackBlock->y; + break; + case 1: + x += trackBlock->y; + y -= trackBlock->x; + break; + case 2: + x -= trackBlock->x; + y -= trackBlock->y; + break; + case 3: + x -= trackBlock->y; + y += trackBlock->x; + break; + } + + z += trackBlock->z; + + map_invalidate_tile_full(x, y); + RCT2_GLOBAL(0x00F441C4, sint16) = x; + RCT2_GLOBAL(0x00F441C6, sint16) = y; + + found = 0; + mapElement = map_get_first_element_at(x / 32, y / 32); + do{ + if (mapElement->base_height != z / 8) + continue; + + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) + continue; + + if ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) != rotation) + continue; + + if ((mapElement->properties.track.sequence & 0xF) != trackBlock->index) + continue; + + if (mapElement->properties.track.type != type) + continue; + + found = 1; + break; + } while (!map_element_is_last_for_tile(mapElement++)); + + if (!found){ + log_error("Track map element part not found!"); + return MONEY32_UNDEFINED; + } + + int entranceDirections; + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + entranceDirections = RCT2_ADDRESS(0x0099CA64, uint8)[type * 16]; + } + else { + entranceDirections = RCT2_ADDRESS(0x0099BA64, uint8)[type * 16]; + } + + if (entranceDirections & (1 << 4) && (mapElement->properties.track.sequence == 0)){ + if (RCT2_CALLPROC_X(0x006C494B, x, (rideIndex << 8), y, (z / 8) | (rotation << 8), 0, 0, 0) & 0x100){ + return MONEY32_UNDEFINED; + } + } + + rct_map_element* surfaceElement = map_get_surface_element_at(x / 32, y / 32); + if (surfaceElement == NULL){ + return MONEY32_UNDEFINED; + } + + uint8 support_height = mapElement->base_height - surfaceElement->base_height; + if (support_height < 0){ + support_height = 10; + } + + cost += (support_height / 2) * RCT2_ADDRESS(0x0097DD7A, uint16)[ride->type * 2]; + + if (!(flags & GAME_COMMAND_FLAG_APPLY)) + continue; + + if (entranceDirections & (1 << 4) && (mapElement->properties.track.sequence == 0)){ + if (RCT2_CALLPROC_X(0x006C494B, x, GAME_COMMAND_FLAG_APPLY | (rideIndex << 8), y, (z / 8) | (rotation << 8), 0, 0, 0) & 0x100){ + return MONEY32_UNDEFINED; + } + } + + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_6)){ + surfaceElement->type &= ~(1 << 6); + } + + sub_6B59C6(rideIndex); + sub_6A7594(); + sub_6A6AA7(x, y, mapElement); + map_element_remove(mapElement); + sub_6CB945(rideIndex); + if (!(flags & (1 << 6))){ + ride_update_max_vehicles(rideIndex); + } + } + + if (flags & GAME_COMMAND_FLAG_APPLY){ + switch (type){ + case TRACK_ELEM_ON_RIDE_PHOTO: + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_ON_RIDE_PHOTO; + break; + case TRACK_ELEM_CABLE_LIFT_HILL: + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_16; + break; + case 216: + ride->num_block_brakes--; + if (ride->num_block_brakes == 0){ + ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_OPERATING; + ride->mode = RIDE_MODE_CONTINUOUS_CIRCUIT; + if (ride->type == RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER){ + ride->mode = RIDE_MODE_POWERED_LAUNCH; + } + } + break; + } + + switch (type){ + case TRACK_ELEM_25_DEG_UP_TO_FLAT: + case TRACK_ELEM_60_DEG_UP_TO_FLAT: + case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT: + case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT: + if (!(RCT2_GLOBAL(0x00F4414C, uint8) & (1 << 7))) + break; + // Fall through + case TRACK_ELEM_CABLE_LIFT_HILL: + ride->num_block_brakes--; + break; + } + } + + money32 price = RCT2_ADDRESS(0x0097DD78, money16)[ride->type * 2];; + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + price *= RCT2_ADDRESS(0x0099DA34, money32)[type]; + } + else { + price *= RCT2_ADDRESS(0x0099DE34, money32)[type]; + } + price >>= 16; + price = (price + cost) / 2; + if (ride->lifecycle_flags & RIDE_LIFECYCLE_EVER_BEEN_OPENED) + price *= -7; + else + price *= -10; + + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) + return 0; + else + return price; +} + /** * * rct2: 0x006C5B69 */ void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) { - RCT2_CALLFUNC_X(0x006C5B69, eax, ebx, ecx, edx, esi, edi, ebp); + *ebx = track_remove( + *edx & 0xFF, + (*edx >> 8) & 0xFF, + *eax & 0xFFFF, + *ecx & 0xFFFF, + *edi & 0xFFFF, + (*ebx >> 8) & 0xFF, + *ebx & 0xFF + ); + return; } /** From 57e059b167181059021a981318e50cbc81acedf8 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 5 Jul 2015 12:12:34 +0100 Subject: [PATCH 0187/1173] fix invalidation issues with uncapped FPS --- src/openrct2.c | 11 +++++++---- src/peep/peep.c | 4 ++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/openrct2.c b/src/openrct2.c index acea0970e8..7a74728b64 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -24,6 +24,7 @@ #include "cmdline.h" #include "config.h" #include "editor.h" +#include "game.h" #include "interface/window.h" #include "localisation/localisation.h" #include "network/http.h" @@ -259,14 +260,14 @@ static void openrct2_loop() static uint32 uncapTick; static int fps = 0; static uint32 secondTick = 0; - static int uncappedinitialized = 0; + static bool uncappedinitialized = false; static struct { sint16 x, y, z; } spritelocations1[MAX_SPRITES], spritelocations2[MAX_SPRITES]; log_verbose("begin openrct2 loop"); _finished = 0; do { - if (gConfigGeneral.uncap_fps) { + if (gConfigGeneral.uncap_fps && gGameSpeed <= 4) { currentTick = SDL_GetTicks(); if (!uncappedinitialized) { // Reset sprite locations @@ -276,7 +277,7 @@ static void openrct2_loop() spritelocations1[i].y = spritelocations2[i].y = g_sprite_list[i].unknown.y; spritelocations1[i].z = spritelocations2[i].z = g_sprite_list[i].unknown.z; } - uncappedinitialized = 1; + uncappedinitialized = true; } while (uncapTick <= currentTick && currentTick - uncapTick > 25) { @@ -291,6 +292,7 @@ static void openrct2_loop() rct2_update(); if (gOpenRCT2ResetFrameSmoothing) { gOpenRCT2ResetFrameSmoothing = false; + uncappedinitialized = false; continue; } @@ -337,10 +339,11 @@ static void openrct2_loop() if (!sprite_should_tween(&g_sprite_list[i])) continue; + invalidate_sprite(&g_sprite_list[i]); sprite_move(spritelocations2[i].x, spritelocations2[i].y, spritelocations2[i].z, &g_sprite_list[i]); } } else { - uncappedinitialized = 0; + uncappedinitialized = false; currentTick = SDL_GetTicks(); ticksElapsed = currentTick - lastTick; if (ticksElapsed < 25) { diff --git a/src/peep/peep.c b/src/peep/peep.c index 36167e023a..fb212db867 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -25,6 +25,7 @@ #include "../localisation/localisation.h" #include "../management/finance.h" #include "../management/news_item.h" +#include "../openrct2.h" #include "../ride/ride.h" #include "../scenario.h" #include "../sprites.h" @@ -5396,6 +5397,9 @@ static void peep_give_real_name(rct_peep *peep) void peep_update_name_sort(rct_peep *peep) { RCT2_CALLPROC_X(0x00699115, 0, 0, 0, 0, (int)peep, 0, 0); + + // This is required at the moment because this function reorders peeps in the sprite list + gOpenRCT2ResetFrameSmoothing = true; } /** From 4acb73abfe72fbda5684e72af56fbf12cb23cd0c Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 5 Jul 2015 15:22:56 +0100 Subject: [PATCH 0188/1173] Fix incorrect refund price for tracks. Fixes #1548. --- src/ride/track.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index d3f26cb792..3dd344b74b 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -4164,10 +4164,10 @@ money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, money32 price = RCT2_ADDRESS(0x0097DD78, money16)[ride->type * 2];; if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { - price *= RCT2_ADDRESS(0x0099DA34, money32)[type]; + price *= RCT2_ADDRESS(0x0099DE34, money32)[type]; } else { - price *= RCT2_ADDRESS(0x0099DE34, money32)[type]; + price *= RCT2_ADDRESS(0x0099DA34, money32)[type]; } price >>= 16; price = (price + cost) / 2; From 79c8044156af7d142e9db510eb4761573cfa5759 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 5 Jul 2015 15:34:15 +0100 Subject: [PATCH 0189/1173] Fix peep expenditure not adding to the correct type. Fixes #1547 --- src/peep/peep.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index fb212db867..53f153475a 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -46,7 +46,7 @@ static int peep_should_find_bench(rct_peep* peep); static void peep_stop_purchase_thought(rct_peep* peep, uint8 ride_type); static void sub_693BAB(rct_peep* peep); static void sub_693C9E(rct_peep *peep); -static void peep_spend_money(rct_peep *peep, money32 amount); +static void peep_spend_money(rct_peep *peep, money16 *peep_expend_type, money32 amount); static void sub_695444(rct_peep *peep, int rideIndex, int flags); static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price); static bool sub_69AEB7(rct_peep *peep, int rideIndex); @@ -1387,8 +1387,7 @@ static void peep_update_ride_sub_state_2_enter_ride(rct_peep* peep, rct_ride* ri ride->total_profit += ride->price; ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 20; - RCT2_GLOBAL(0xF1AEC0, uint32) = 230; - peep_spend_money(peep, ride->price); + peep_spend_money(peep, &peep->paid_on_rides, ride->price); } } @@ -5337,16 +5336,17 @@ static void sub_693C9E(rct_peep *peep) /** * * rct2: 0x0069926C + * Expend type was previously an offset saved in 0x00F1AEC0 */ -static void peep_spend_money(rct_peep *peep, money32 amount) +static void peep_spend_money(rct_peep *peep, money16 *peep_expend_type, money32 amount) { if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) return; peep->cash_in_pocket = max(0, peep->cash_in_pocket - amount); peep->cash_spent += amount; - if (RCT2_GLOBAL(0x00F1AEC0, uint32) == 0xFFFFFFFF) { - RCT2_GLOBAL(peep + RCT2_GLOBAL(0x00F1AEC0, uint32), money16) += (money16)amount; + if (peep_expend_type != NULL) { + *peep_expend_type += (money16)amount; } window_invalidate_by_number(WC_PEEP, peep->sprite_index); From 9eb4958ddecfd054008c770a3a22203bb92ad31a Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sun, 5 Jul 2015 08:57:01 -0600 Subject: [PATCH 0190/1173] fix #1002 --- src/drawing/drawing.c | 58 ++++++++++++++++++----------- src/input.c | 4 +- src/interface/console.c | 2 +- src/interface/viewport.c | 8 ++-- src/interface/window.c | 2 +- src/intro.c | 4 +- src/management/news_item.c | 2 +- src/platform/shared.c | 22 +++++------ src/title.c | 2 +- src/windows/clear_scenery.c | 2 +- src/windows/dropdown.c | 16 ++++---- src/windows/editor_bottom_toolbar.c | 6 +-- src/windows/editor_main.c | 4 +- src/windows/error.c | 4 +- src/windows/game_bottom_toolbar.c | 6 +-- src/windows/land.c | 2 +- src/windows/land_rights.c | 2 +- src/windows/main.c | 4 +- src/windows/park.c | 4 +- src/windows/scenery.c | 2 +- src/windows/title_exit.c | 2 +- src/windows/title_menu.c | 2 +- src/windows/title_options.c | 2 +- src/windows/top_toolbar.c | 4 +- src/windows/water.c | 2 +- 25 files changed, 91 insertions(+), 77 deletions(-) diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index 1b912d26aa..65415885a6 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -31,7 +31,8 @@ int gLastDrawStringX; int gLastDrawStringY; -uint8 _screenDirtyBlocks[5120]; +uint8* _screenDirtyBlocks = NULL; +int _screenDirtyBlocksSize = 0; #define MAX_RAIN_PIXELS 0xFFFE uint32 rainPixels[MAX_RAIN_PIXELS]; @@ -251,11 +252,24 @@ void gfx_invalidate_tile_if_zoomed(int x, int y, int base_height, int clearance_ */ void gfx_invalidate_screen() { - int width = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16); - int height = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16); + int width = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); + int height = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16); gfx_set_dirty_blocks(0, 0, width, height); } +uint8* gfx_get_dirty_blocks() +{ + int size = RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, uint32) * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_ROWS, uint32); + if (_screenDirtyBlocksSize != size) { + if (_screenDirtyBlocks) { + _screenDirtyBlocks = realloc(_screenDirtyBlocks, size); + } else { + _screenDirtyBlocks = malloc(size); + } + } + return _screenDirtyBlocks; +} + /** * * rct2: 0x006E732D @@ -267,12 +281,12 @@ void gfx_invalidate_screen() void gfx_set_dirty_blocks(int left, int top, int right, int bottom) { int x, y; - uint8 *screenDirtyBlocks = RCT2_ADDRESS(0x00EDE408, uint8); + uint8 *screenDirtyBlocks = gfx_get_dirty_blocks(); left = max(left, 0); top = max(top, 0); - right = min(right, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16)); - bottom = min(bottom, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16)); + right = min(right, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16)); + bottom = min(bottom, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16)); if (left >= right) return; @@ -289,7 +303,7 @@ void gfx_set_dirty_blocks(int left, int top, int right, int bottom) for (y = top; y <= bottom; y++) for (x = left; x <= right; x++) - screenDirtyBlocks[y * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, sint32) + x] = 0xFF; + screenDirtyBlocks[y * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, uint32) + x] = 0xFF; } /** @@ -298,24 +312,24 @@ void gfx_set_dirty_blocks(int left, int top, int right, int bottom) */ void gfx_draw_all_dirty_blocks() { - int x, y, xx, yy, columns, rows; - uint8 *screenDirtyBlocks = RCT2_ADDRESS(0x00EDE408, uint8); + unsigned int x, y, xx, yy, columns, rows; + uint8 *screenDirtyBlocks = gfx_get_dirty_blocks(); - for (x = 0; x < RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, sint32); x++) { - for (y = 0; y < RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_ROWS, sint32); y++) { - if (screenDirtyBlocks[y * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, sint32) + x] == 0) + for (x = 0; x < RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, uint32); x++) { + for (y = 0; y < RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_ROWS, uint32); y++) { + if (screenDirtyBlocks[y * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, uint32) + x] == 0) continue; // Determine columns - for (xx = x; xx < RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, sint32); xx++) - if (screenDirtyBlocks[y * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, sint32) + xx] == 0) + for (xx = x; xx < RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, uint32); xx++) + if (screenDirtyBlocks[y * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, uint32) + xx] == 0) break; columns = xx - x; // Check rows - for (yy = y; yy < RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_ROWS, sint32); yy++) + for (yy = y; yy < RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_ROWS, uint32); yy++) for (xx = x; xx < x + columns; xx++) - if (screenDirtyBlocks[yy * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, sint32) + xx] == 0) + if (screenDirtyBlocks[yy * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, uint32) + xx] == 0) goto endRowCheck; endRowCheck: @@ -328,18 +342,18 @@ void gfx_draw_all_dirty_blocks() static void gfx_draw_dirty_blocks(int x, int y, int columns, int rows) { int left, top, right, bottom; - uint8 *screenDirtyBlocks = RCT2_ADDRESS(0x00EDE408, uint8); + uint8 *screenDirtyBlocks = gfx_get_dirty_blocks(); // Unset dirty blocks for (top = y; top < y + rows; top++) for (left = x; left < x + columns; left++) - screenDirtyBlocks[top * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, sint32) + left] = 0; + screenDirtyBlocks[top * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, uint32) + left] = 0; // Determine region in pixels - left = max(0, x * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_WIDTH, sint16)); - top = max(0, y * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_HEIGHT, sint16)); - right = min(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16), left + (columns * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_WIDTH, sint16))); - bottom = min(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16), top + (rows * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_HEIGHT, sint16))); + left = max(0, x * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_WIDTH, uint16)); + top = max(0, y * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_HEIGHT, uint16)); + right = min(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16), left + (columns * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_WIDTH, uint16))); + bottom = min(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16), top + (rows * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_HEIGHT, uint16))); if (right <= left || bottom <= top) return; diff --git a/src/input.c b/src/input.c index 56c1218d94..d967cd4002 100644 --- a/src/input.c +++ b/src/input.c @@ -128,8 +128,8 @@ void game_handle_input() game_handle_input_mouse(x, y, state); } else if (x != 0x80000000) { - x = clamp(0, x, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 1); - y = clamp(0, y, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) - 1); + x = clamp(0, x, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 1); + y = clamp(0, y, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 1); game_handle_input_mouse(x, y, state); process_mouse_over(x, y); diff --git a/src/interface/console.c b/src/interface/console.c index 27bccea426..4d9852e112 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -99,7 +99,7 @@ void console_update() _consoleLeft = 0; _consoleTop = 0; - _consoleRight = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16); + _consoleRight = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); _consoleBottom = 322; if (gConsoleOpen) { diff --git a/src/interface/viewport.c b/src/interface/viewport.c index ae8fc30c5b..71d6c5206a 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -356,8 +356,8 @@ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ if (w->flags & WF_7){ int left = max(viewport->x, 0); int top = max(viewport->y, 0); - int right = min(viewport->x + viewport->width, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16)); - int bottom = min(viewport->y + viewport->height, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16)); + int right = min(viewport->x + viewport->width, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16)); + int bottom = min(viewport->y + viewport->height, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16)); if (left >= right) return; if (top >= bottom) return; @@ -376,7 +376,7 @@ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ viewport->x = 0; } - int eax = viewport->x + viewport->width - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16); + int eax = viewport->x + viewport->width - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); if (eax > 0){ viewport->width -= eax; viewport->view_width -= eax * zoom; @@ -394,7 +394,7 @@ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ viewport->y = 0; } - eax = viewport->y + viewport->height - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16); + eax = viewport->y + viewport->height - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16); if (eax > 0){ viewport->height -= eax; viewport->view_height -= eax * zoom; diff --git a/src/interface/window.c b/src/interface/window.c index f5a23c6a66..a80ffa2238 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -1202,7 +1202,7 @@ void window_push_others_below(rct_window *w1) continue; // Check if there is room to push it down - if (w1->y + w1->height + 80 >= RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16)) + if (w1->y + w1->height + 80 >= RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16)) continue; // Invalidate the window's current area diff --git a/src/intro.c b/src/intro.c index e5d9e09bef..c4ddd3b2b9 100644 --- a/src/intro.c +++ b/src/intro.c @@ -38,8 +38,8 @@ static int _tick_counter; ///< Used mainly for timing but also for Y coordina void intro_update() { rct_drawpixelinfo *screenDPI = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo); - int screenWidth = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16); - int screenHeight = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16); + int screenWidth = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); + int screenHeight = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16); uint8 (*part) = RCT2_ADDRESS(RCT2_ADDRESS_RUN_INTRO_TICK_PART, uint8); screen_intro_process_mouse_input(); diff --git a/src/management/news_item.c b/src/management/news_item.c index 188f17ba6e..101fbe6732 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -100,7 +100,7 @@ void news_item_update_current() newsItems[0].ticks++; if (newsItems[0].ticks == 1 && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 1)) { // Play sound - sound_play_panned(SOUND_NEWS_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) / 2, 0, 0, 0); + sound_play_panned(SOUND_NEWS_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2, 0, 0, 0); } // Removal of current news item diff --git a/src/platform/shared.c b/src/platform/shared.c index 529b7ce9cd..8531d0a897 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -175,8 +175,8 @@ void platform_get_closest_resolution(int inWidth, int inHeight, int *outWidth, i void platform_draw() { - int width = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16); - int height = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16); + int width = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); + int height = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16); if (gConfigGeneral.hardware_display) { void *pixels; @@ -239,8 +239,8 @@ static void platform_resize(int width, int height) { uint32 flags; - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) = width; - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) = height; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) = width; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) = height; platform_refresh_video(); @@ -457,7 +457,7 @@ void platform_process_messages() // Zoom gesture const int tolerance = 128; - int gesturePixels = (int)(_gestureRadius * RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16)); + int gesturePixels = (int)(_gestureRadius * RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16)); if (gesturePixels > tolerance) { _gestureRadius = 0; keyboard_shortcut_handle_command(SHORTCUT_ZOOM_VIEW_IN); @@ -730,8 +730,8 @@ int platform_get_cursor_pos(int* x, int* y) void platform_refresh_video() { - int width = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16); - int height = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16); + int width = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); + int height = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16); SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, gConfigGeneral.minimize_fullscreen_focus_loss ? "1" : "0"); @@ -830,8 +830,8 @@ static void platform_refresh_screenbuffer(int width, int height, int pitch) 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; + RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_WIDTH, uint16) = 64; + RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_HEIGHT, uint16) = 8; + RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, uint32) = (width >> 6) + 1; + RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_ROWS, uint32) = (height >> 3) + 1; } \ No newline at end of file diff --git a/src/title.c b/src/title.c index 11b819e756..ad472457df 100644 --- a/src/title.c +++ b/src/title.c @@ -151,7 +151,7 @@ static void title_create_windows() window_title_exit_open(); window_title_options_open(); window_title_logo_open(); - window_resize_gui(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16), RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16)); + window_resize_gui(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16), RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16)); } /** diff --git a/src/windows/clear_scenery.c b/src/windows/clear_scenery.c index 88b2c670c7..e7b5f1ffec 100644 --- a/src/windows/clear_scenery.c +++ b/src/windows/clear_scenery.c @@ -107,7 +107,7 @@ void window_clear_scenery_open() if (window_find_by_class(WC_CLEAR_SCENERY) != NULL) return; - window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 98, 29, 98, 94, (uint32*)window_clear_scenery_events, WC_CLEAR_SCENERY, 0); + window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 98, 29, 98, 94, (uint32*)window_clear_scenery_events, WC_CLEAR_SCENERY, 0); window->widgets = window_clear_scenery_widgets; window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_INCREMENT) | (1 << WIDX_DECREMENT) | (1 << WIDX_PREVIEW) | (1 << WIDX_SMALL_SCENERY) | (1 << WIDX_LARGE_SCENERY) | (1 << WIDX_FOOTPATH); diff --git a/src/windows/dropdown.c b/src/windows/dropdown.c index f8581cf490..6671284dd0 100644 --- a/src/windows/dropdown.c +++ b/src/windows/dropdown.c @@ -154,10 +154,10 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo width = _dropdown_item_width * _dropdown_num_columns + 3; int height = _dropdown_item_height * _dropdown_num_rows + 3; - if (x + width > RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16)) - x = max(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - width); - if (y + height > RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16)) - y = max(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) - height); + if (x + width > RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16)) + x = max(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - width); + if (y + height > RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16)) + y = max(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - height); window_dropdown_widgets[WIDX_BACKGROUND].bottom = _dropdown_item_height * num_items + 3; window_dropdown_widgets[WIDX_BACKGROUND].right = _dropdown_item_width + 3; @@ -233,10 +233,10 @@ void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 fl // Calculate position and size width = _dropdown_item_width * _dropdown_num_columns + 3; height = _dropdown_item_height * _dropdown_num_rows + 3; - if (x + width > RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16)) - x = max(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - width); - if (y + height > RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16)) - y = max(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) - height); + if (x + width > RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16)) + x = max(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - width); + if (y + height > RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16)) + y = max(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - height); window_dropdown_widgets[WIDX_BACKGROUND].right = width; window_dropdown_widgets[WIDX_BACKGROUND].bottom = height; diff --git a/src/windows/editor_bottom_toolbar.c b/src/windows/editor_bottom_toolbar.c index 6f235769bf..dfc63d52db 100644 --- a/src/windows/editor_bottom_toolbar.c +++ b/src/windows/editor_bottom_toolbar.c @@ -128,8 +128,8 @@ void window_editor_bottom_toolbar_open() { rct_window* window; - window = window_create(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) - 32, - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16), 32, + window = window_create(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 32, + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16), 32, (uint32*)window_editor_bottom_toolbar_events, WC_BOTTOM_TOOLBAR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5); window->widgets = window_editor_bottom_toolbar_widgets; @@ -384,7 +384,7 @@ void window_editor_bottom_toolbar_invalidate() { colour_scheme_update_by_class(w, (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) ? WC_EDITOR_SCENARIO_BOTTOM_TOOLBAR : WC_EDITOR_TRACK_BOTTOM_TOOLBAR); - sint16 screenWidth = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16); + uint16 screenWidth = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); window_editor_bottom_toolbar_widgets[WIDX_NEXT_IMAGE].left = screenWidth - 200; window_editor_bottom_toolbar_widgets[WIDX_NEXT_IMAGE].right = screenWidth - 1; window_editor_bottom_toolbar_widgets[WIDX_NEXT_STEP_BUTTON].left = screenWidth - 198; diff --git a/src/windows/editor_main.c b/src/windows/editor_main.c index a9635b4e47..8cd6b408e8 100644 --- a/src/windows/editor_main.c +++ b/src/windows/editor_main.c @@ -72,8 +72,8 @@ void window_editor_main_open() { rct_window* window; - window_editor_main_widgets[0].right = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16); - window_editor_main_widgets[0].bottom = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16); + window_editor_main_widgets[0].right = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); + window_editor_main_widgets[0].bottom = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16); window = window_create(0, 0, window_editor_main_widgets[0].right, window_editor_main_widgets[0].bottom, (uint32*)window_editor_main_events, WC_MAIN_WINDOW, WF_STICK_TO_BACK); window->widgets = window_editor_main_widgets; diff --git a/src/windows/error.c b/src/windows/error.c index 531c40d00e..c3779f4b3e 100644 --- a/src/windows/error.c +++ b/src/windows/error.c @@ -124,11 +124,11 @@ void window_error_open(rct_string_id title, rct_string_id message) window_error_widgets[WIDX_BACKGROUND].bottom = height; x = RCT2_GLOBAL(0x0142406C, sint32) - (width / 2); - x = clamp(0, x, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16)); + x = clamp(0, x, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16)); y = RCT2_GLOBAL(0x01424070, sint32) + 26; y = max(22, y); - maxY = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) - height; + maxY = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - height; if (y > maxY) { y = y - height - 40; y = min(y, maxY); diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index d86e41ff3c..51850976d5 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -131,8 +131,8 @@ void window_game_bottom_toolbar_open() rct_window* window; window = window_create( - 0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) - 32, - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16), 32, + 0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 32, + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16), 32, (uint32*)window_game_bottom_toolbar_events, WC_BOTTOM_TOOLBAR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5 @@ -259,7 +259,7 @@ static void window_game_bottom_toolbar_invalidate() colour_scheme_update(w); // Anchor the middle and right panel to the right - x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16); + x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); w->width = x; x--; window_game_bottom_toolbar_widgets[WIDX_RIGHT_OUTSET].right = x; diff --git a/src/windows/land.c b/src/windows/land.c index 8d456e9ba9..02bcd0961b 100644 --- a/src/windows/land.c +++ b/src/windows/land.c @@ -127,7 +127,7 @@ void window_land_open() if (window_find_by_class(WC_LAND) != NULL) return; - window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 98, 29, 98, 126, (uint32*)window_land_events, WC_LAND, 0); + window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 98, 29, 98, 126, (uint32*)window_land_events, WC_LAND, 0); window->widgets = window_land_widgets; window->enabled_widgets = (1 << WIDX_CLOSE) | diff --git a/src/windows/land_rights.c b/src/windows/land_rights.c index 9a81fc3cbb..a9bdad8db6 100644 --- a/src/windows/land_rights.c +++ b/src/windows/land_rights.c @@ -104,7 +104,7 @@ void window_land_rights_open() if (window_find_by_class(WC_LAND_RIGHTS) != NULL) return; - window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 98, 29, 98, 94, (uint32*)window_land_rights_events, WC_LAND_RIGHTS, 0); + window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 98, 29, 98, 94, (uint32*)window_land_rights_events, WC_LAND_RIGHTS, 0); window->widgets = window_land_rights_widgets; window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_DECREMENT) | (1 << WIDX_INCREMENT) | (1 << WIDX_PREVIEW) | (1 << WIDX_BUY_LAND_RIGHTS) | (1 << WIDX_BUY_CONSTRUCTION_RIGHTS); diff --git a/src/windows/main.c b/src/windows/main.c index f56303b4c6..cd9e3ace06 100644 --- a/src/windows/main.c +++ b/src/windows/main.c @@ -70,8 +70,8 @@ void window_main_open() { rct_window* window; - window_main_widgets[0].right = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16); - window_main_widgets[0].bottom = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16); + window_main_widgets[0].right = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); + window_main_widgets[0].bottom = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16); window = window_create( 0, 0, window_main_widgets[0].right, window_main_widgets[0].bottom, diff --git a/src/windows/park.c b/src/windows/park.c index c22e6c127c..3226d91786 100644 --- a/src/windows/park.c +++ b/src/windows/park.c @@ -1754,8 +1754,8 @@ void window_park_objective_open() window->hold_down_widgets = window_park_page_hold_down_widgets[WINDOW_PARK_PAGE_OBJECTIVE]; window->event_handlers = (uint32*)window_park_objective_events; window_init_scroll_widgets(window); - window->x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) / 2 - 115; - window->y = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) / 2 - 87; + window->x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2 - 115; + window->y = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) / 2 - 87; window_invalidate(window); } diff --git a/src/windows/scenery.c b/src/windows/scenery.c index aa495fd77b..0e3a18c127 100644 --- a/src/windows/scenery.c +++ b/src/windows/scenery.c @@ -423,7 +423,7 @@ void window_scenery_open() init_scenery(); window = window_create( - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - WINDOW_SCENERY_WIDTH, + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - WINDOW_SCENERY_WIDTH, 0x1D, WINDOW_SCENERY_WIDTH, WINDOW_SCENERY_HEIGHT, diff --git a/src/windows/title_exit.c b/src/windows/title_exit.c index 37ea4942fd..18ebb3d74f 100644 --- a/src/windows/title_exit.c +++ b/src/windows/title_exit.c @@ -77,7 +77,7 @@ void window_title_exit_open() rct_window* window; window = window_create( - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 40, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) - 64, + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 40, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 64, 40, 64, (uint32*)window_title_exit_events, WC_TITLE_EXIT, diff --git a/src/windows/title_menu.c b/src/windows/title_menu.c index fc65c97a2c..5ce6858c31 100644 --- a/src/windows/title_menu.c +++ b/src/windows/title_menu.c @@ -93,7 +93,7 @@ void window_title_menu_open() rct_window* window; window = window_create( - (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 328) / 2, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) - 142, + (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 328) / 2, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 142, 328, 82, (uint32*)window_title_menu_events, WC_TITLE_MENU, diff --git a/src/windows/title_options.c b/src/windows/title_options.c index 39be909cbd..ee4e22be77 100644 --- a/src/windows/title_options.c +++ b/src/windows/title_options.c @@ -75,7 +75,7 @@ void window_title_options_open() rct_window* window; window = window_create( - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 80, 0, + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 80, 0, 80, 12, (uint32*)window_title_options_events, WC_TITLE_OPTIONS, diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 25e21e990f..45dce4a486 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -241,7 +241,7 @@ void window_top_toolbar_open() window = window_create( 0, 0, - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16), 28, + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16), 28, (uint32*)window_top_toolbar_events, WC_TOP_TOOLBAR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5 @@ -618,7 +618,7 @@ static void window_top_toolbar_invalidate() // Align right hand side toolbar buttons firstAlignment = 1; - x = max(640, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16)); + x = max(640, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16)); for (int i = 0; i < countof(right_aligned_widgets_order); ++i) { widgetIndex = right_aligned_widgets_order[i]; widget = &window_top_toolbar_widgets[widgetIndex]; diff --git a/src/windows/water.c b/src/windows/water.c index ff74724149..33eb360ed9 100644 --- a/src/windows/water.c +++ b/src/windows/water.c @@ -101,7 +101,7 @@ void window_water_open() return; window = window_create( - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) - 76, + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 76, 29, 76, 77, From b374899bc8b3d6e2978a08c5fb1d6425bae2f7f8 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 5 Jul 2015 16:13:04 +0100 Subject: [PATCH 0191/1173] Fix finance issues. Small refactor. Fixes #1524 --- src/addresses.h | 1 + src/peep/peep.c | 4 +- src/peep/staff.c | 4 +- src/ride/ride.c | 12 +-- src/ride/track.c | 10 +-- src/world/park.c | 190 +---------------------------------------------- 6 files changed, 17 insertions(+), 204 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 14958a4dc0..119b397e07 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -495,6 +495,7 @@ #define RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER 0x0141ED68 +// This value is always 4 times the actual type #define RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE 0x0141F56C #define RCT2_ADDRESS_WATER_RAISE_COST 0x0141F738 diff --git a/src/peep/peep.c b/src/peep/peep.c index 53f153475a..1c55217281 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -1386,7 +1386,7 @@ static void peep_update_ride_sub_state_2_enter_ride(rct_peep* peep, rct_ride* ri else{ ride->total_profit += ride->price; ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 20; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_PARK_RIDE_TICKETS * 4; peep_spend_money(peep, &peep->paid_on_rides, ride->price); } } @@ -5351,7 +5351,7 @@ static void peep_spend_money(rct_peep *peep, money16 *peep_expend_type, money32 window_invalidate_by_number(WC_PEEP, peep->sprite_index); RCT2_GLOBAL(0x00141F568, uint8) = RCT2_GLOBAL(0x0013CA740, uint8); - finance_payment(-amount, RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint32)); + finance_payment(-amount, RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) / 4); sound_play_panned(SOUND_PURCHASE, 0x8001, peep->x, peep->y, peep->z); } diff --git a/src/peep/staff.c b/src/peep/staff.c index 73d6c9708a..f35a93239b 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -263,7 +263,7 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, */ void game_command_set_staff_order(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) { - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 40; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_WAGES * 4; uint8 order_id = *ebx >> 8; uint16 sprite_id = *edx; if(*ebx & GAME_COMMAND_FLAG_APPLY){ @@ -335,7 +335,7 @@ void game_command_set_staff_patrol(int *eax, int *ebx, int *ecx, int *edx, int * */ void game_command_fire_staff_member(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) { - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 40; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_WAGES * 4; if(*ebx & GAME_COMMAND_FLAG_APPLY){ window_close_by_class(WC_FIRE_PROMPT); uint16 sprite_id = *edx; diff --git a/src/ride/ride.c b/src/ride/ride.c index f5021b106a..459be68b40 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3461,7 +3461,7 @@ void ride_music_update_final() /* rct2: 0x006B5559 */ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) { - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 4; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_RUNNING_COSTS * 4; uint8 ride_id = *edx & 0xFF; rct_ride* ride = GET_RIDE(ride_id); @@ -4321,7 +4321,7 @@ void game_command_set_ride_status(int *eax, int *ebx, int *ecx, int *edx, int *e rideIndex = *edx & 0xFF; targetStatus = (*edx >> 8) & 0xFF; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 4; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_RUNNING_COSTS * 4; ride = GET_RIDE(rideIndex); RCT2_GLOBAL(0x00F43484, uint32) = RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8), uint32); @@ -4665,11 +4665,11 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi RCT2_GLOBAL(0x009DEA5E, uint16) = x; RCT2_GLOBAL(0x009DEA60, uint16) = y; RCT2_GLOBAL(0x009DEA62, uint16) = z; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION * 4; return; }else{ *ebx = 0; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION * 4; return; } } @@ -4758,7 +4758,7 @@ void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *es //edx ride_number //ebp ride_type - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 0x14; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_PARK_RIDE_TICKETS * 4; if (flags & 0x1) { if (!secondary_price) { shop_item = 0x1F; @@ -5490,7 +5490,7 @@ void game_command_set_ride_vehicles(int *eax, int *ebx, int *ecx, int *edx, int ride = GET_RIDE(rideIndex); - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_PARK_ENTRANCE_TICKETS; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_RUNNING_COSTS * 4; if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_HAS_BROKEN_DOWN_AND_REQUIRES_FIXING; diff --git a/src/ride/track.c b/src/ride/track.c index 3dd344b74b..770f5d0b47 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3210,7 +3210,7 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int game_do_command_p(GAME_COMMAND_CREATE_RIDE, &_eax, &_ebx, &_ecx, &_edx, &_esi, &_edi, &_ebp); if (_ebx == MONEY32_UNDEFINED){ *ebx = MONEY32_UNDEFINED; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION * 4; RCT2_GLOBAL(0x00F44121, money32) = MONEY32_UNDEFINED; return; } @@ -3244,7 +3244,7 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); *ebx = cost; RCT2_GLOBAL(0x00141E9AC, rct_string_id) = error_reason; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION * 4; RCT2_GLOBAL(0x00F44121, money32) = cost; return; } @@ -3311,7 +3311,7 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int ride_set_name(rideIndex, RCT2_ADDRESS(0x009E3504,const char)); - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION * 4; *ebx = RCT2_GLOBAL(0x00F44121, money32); *edi = rideIndex; } @@ -3453,7 +3453,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in rct_ride_type *rideEntry = GET_RIDE_ENTRY(ride->subtype); rct_map_element *mapElement; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION * 4; RCT2_GLOBAL(0x009DEA5E, uint16) = originX + 16; RCT2_GLOBAL(0x009DEA60, uint16) = originY + 16; RCT2_GLOBAL(0x009DEA62, uint16) = originZ; @@ -4215,7 +4215,7 @@ void game_command_set_brakes_speed(int *eax, int *ebx, int *ecx, int *edx, int * trackType = (*edx & 0xFF); brakesSpeed = ((*ebx >> 8) & 0xFF); - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION * 4; RCT2_GLOBAL(0x009DEA5E, uint8) = x + 16; RCT2_GLOBAL(0x009DEA60, uint8) = y + 16; RCT2_GLOBAL(0x009DEA62, uint8) = z; diff --git a/src/world/park.c b/src/world/park.c index 2a83928258..cdb174e8a6 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -891,7 +891,7 @@ void game_command_remove_park_entrance(int *eax, int *ebx, int *ecx, int *edx, i y = *ecx & 0xFFFF; z = *edx * 16; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint32) = RCT_EXPENDITURE_TYPE_LAND_PURCHASE * 4; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LAND_PURCHASE * 4; RCT2_GLOBAL(0x009DEA5E, uint16) = x; RCT2_GLOBAL(0x009DEA60, uint16) = y; RCT2_GLOBAL(0x009DEA62, uint16) = z; @@ -1219,194 +1219,6 @@ void game_command_buy_land_rights(int *eax, int *ebx, int *ecx, int *edx, int *e (*edx & 0xFF00) >> 8, *ebx & 0xFF ); - // Original decompiled function for Duncan to look at: - - /*RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LAND_PURCHASE * 4; - int x = *eax; - int y = *ecx; - int y2 = *ecx; - int z = map_element_height(x + 16, y + 16); - - RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; - RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; - RCT2_GLOBAL(0x009DEA62, uint16) = z; - - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; - if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) != 0 || RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0) { - - int tile_idx = (((y & 0xFFE0) * 256) + (x & 0xFFE0)) / 32; - while ((TILE_MAP_ELEMENT_POINTER(tile_idx)->type & 0x3C) != 0) { - y += 8; - tile_idx = (((y & 0xFFE0) * 256) + (x & 0xFFE0)) / 32; - } - uint8 ownership = TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership; - uint8 flags = (*edx & 0xFF00) >> 8; - switch (flags) { - case 0: - if ((ownership & OWNERSHIP_OWNED) != 0) { // If the land is already owned - *ebx = 0; - return; - } - else if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) != 0 || (ownership & OWNERSHIP_AVAILABLE) == 0) { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 1726; // Land not for sale! - *ebx = 0x80000000; - return; - } - else { - if ((*ebx & 1) != 0) { - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership |= OWNERSHIP_OWNED; - update_park_fences(x, y2); - update_park_fences(x - 32, y2); - update_park_fences(x + 32, y2); - update_park_fences(x, y2 + 32); - update_park_fences(x, y2 - 32); - } - *ebx = RCT2_GLOBAL(RCT2_ADDRESS_LAND_COST, uint16); - return; - } - break; - case 1: - if ((*ebx & 1) != 0) { - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership &= 0xCF; - update_park_fences(x, y2); - update_park_fences(x - 32, y2); - update_park_fences(x + 32, y2); - update_park_fences(x, y2 + 32); - update_park_fences(x, y2 - 32); - } - *ebx = 0; - break; - case 2: - if ((ownership & (OWNERSHIP_OWNED | OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED)) != 0) { // If the land or construction rights are already owned - *ebx = 0; - return; - } - else if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) != 0 || (ownership & OWNERSHIP_CONSTRUCTION_RIGHTS_AVAILABLE) == 0) { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 1727; // Construction rights not for sale! - *ebx = 0x80000000; - return; - } - else { - if ((*ebx & 1) != 0) { - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership |= OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED; - uint16 baseHeight = TILE_MAP_ELEMENT_POINTER(tile_idx)->base_height; - baseHeight *= 8; - gfx_invalidate_viewport_tile(x, y2, baseHeight, baseHeight + 16); - } - *ebx = RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCTION_RIGHTS_COST, uint16); - return; - } - break; - case 3: - if ((*ebx & 1) != 0) { - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership &= 0xEF; - uint16 baseHeight = TILE_MAP_ELEMENT_POINTER(tile_idx)->base_height; - baseHeight *= 8; - gfx_invalidate_viewport_tile(x, y2, baseHeight, baseHeight + 16); - } - *ebx = 0; - break; - break; - case 4: - if ((*ebx & 1) != 0) { - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership |= OWNERSHIP_AVAILABLE; - uint16 baseHeight = TILE_MAP_ELEMENT_POINTER(tile_idx)->base_height; - baseHeight *= 8; - gfx_invalidate_viewport_tile(x, y2, baseHeight, baseHeight + 16); - } - *ebx = 0; - break; - case 5: - if ((*ebx & 1) != 0) { - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership |= OWNERSHIP_CONSTRUCTION_RIGHTS_AVAILABLE; - uint16 baseHeight = TILE_MAP_ELEMENT_POINTER(tile_idx)->base_height; - baseHeight *= 8; - gfx_invalidate_viewport_tile(x, y2, baseHeight, baseHeight + 16); - } - *ebx = 0; - break; - default: - if (x <= 32) { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 3215; - *ebx = 0x80000000; - return; - } - else if (y <= 32) { - *ebp = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16); - *ebp -= 32; - if (x >= *ebp || y >= *ebp) { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 3215; - *ebx = 0x80000000; - return; - } - else { - int tile_idx2 = (((y & 0xFFE0) * 256) + (x & 0xFFE0)) / 32; - ownership = TILE_MAP_ELEMENT_POINTER(tile_idx2)->properties.surface.ownership; - do { - y += 8; - tile_idx2 = (((y & 0xFFE0) * 256) + (x & 0xFFE0)) / 32; - if ((TILE_MAP_ELEMENT_POINTER(tile_idx2)->type & 0x3C) == 0x10) { - *ebx = 0; - return; - } - - } while ((TILE_MAP_ELEMENT_POINTER(((((y - 8) & 0xFFE0) * 256) + (x & 0xFFE0)) / 32)->flags & 0x80) == 0); - - uint8 bh = (*ebx & 0xFF00) >> 4; - if (bh == (TILE_MAP_ELEMENT_POINTER(tile_idx2)->properties.surface.ownership & 0xF0)) { - *ebx = 0; - return; - } - else { - if ((*ebx & 1) == 0) { - *ebx = RCT2_GLOBAL(RCT2_ADDRESS_LAND_COST, uint16); - return; - } - if ((bh & 0xF0) == 0) { - uint16 bp = RCT2_GLOBAL(RCT2_ADDRESS_PEEP_SPAWNS, uint16); - if (x != (bp & 0xFFE0)) { - bp = RCT2_GLOBAL(RCT2_ADDRESS_PEEP_SPAWNS + 2, uint16); - if (y2 != (bp & 0xFFE0)) { - RCT2_GLOBAL(RCT2_ADDRESS_PEEP_SPAWNS, uint16) = 0xFFFF; - } - } - bp = RCT2_GLOBAL(0x13573F8, uint16); - if (x != (bp & 0xFFE0)) { - bp = RCT2_GLOBAL(0x13573F8 + 2, uint16); - if (y2 != (bp & 0xFFE0)) { - RCT2_GLOBAL(0x13573F8, uint16) = 0xFFFF; - } - } - } - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership &= 0x0F; - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership |= bh; - update_park_fences(x, y2); - update_park_fences(x - 32, y2); - update_park_fences(x + 32, y2); - update_park_fences(x, y2 + 32); - update_park_fences(x, y2 - 32); - RCT2_GLOBAL(0x9E2E28, uint8) |= 1; - - *ebx = 0; - return; - } - } - } - break; - } - } - else { - // Should this ever be called? esi is never set properly - if ((*ebx & 1) != 0) { - //TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership |= OWNERSHIP_OWNED; - update_park_fences(x, y); - update_park_fences(x - 32, y2); - update_park_fences(x + 32, y2); - update_park_fences(x, y2 + 32); - update_park_fences(x, y2 - 32); - } - *ebx = RCT2_GLOBAL(RCT2_ADDRESS_LAND_COST, uint16); - }*/ } From 66430b41db89b672f6a250c8e4e7d0bc8f0377a7 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 5 Jul 2015 16:44:51 +0100 Subject: [PATCH 0192/1173] Fix opening function passing incorrect parameters. Fixes #1526 --- src/ride/ride.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 459be68b40..a70a1be984 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3708,11 +3708,11 @@ void sub_6B5952(int rideIndex) if (xy == 0xFFFF) continue; - int x = xy & 0xFF; - int y = xy >> 8; + int x = (xy & 0xFF) * 32; + int y = (xy >> 8) * 32; int z = ride->station_heights[i]; - rct_map_element *mapElement = map_get_first_element_at(x, y); + rct_map_element *mapElement = map_get_first_element_at(x / 32, y / 32); do { if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE) continue; @@ -3721,7 +3721,7 @@ void sub_6B5952(int rideIndex) int direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; sub_6A742F(rideIndex, i, x, y, mapElement, direction ^ 2); - } while (map_element_is_last_for_tile(mapElement++)); + } while (!map_element_is_last_for_tile(mapElement++)); } } From 520d7840c01001aa09ebca08a0c3a42c7120d97e Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sun, 5 Jul 2015 09:48:25 -0600 Subject: [PATCH 0193/1173] fix bugs introduced in last commit --- src/drawing/drawing.c | 3 ++- src/drawing/drawing.h | 2 +- src/openrct2.c | 3 +++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index 65415885a6..888b4e43cb 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -266,6 +266,7 @@ uint8* gfx_get_dirty_blocks() } else { _screenDirtyBlocks = malloc(size); } + _screenDirtyBlocksSize = size; } return _screenDirtyBlocks; } @@ -278,7 +279,7 @@ uint8* gfx_get_dirty_blocks() * right (dx) * bottom (bp) */ -void gfx_set_dirty_blocks(int left, int top, int right, int bottom) +void gfx_set_dirty_blocks(uint16 left, uint16 top, uint16 right, uint16 bottom) { int x, y; uint8 *screenDirtyBlocks = gfx_get_dirty_blocks(); diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 6ca1340859..4e061cd5f8 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -80,7 +80,7 @@ extern rct_gx g2; // rct_drawpixelinfo* clip_drawpixelinfo(rct_drawpixelinfo* dpi, int left, int width, int top, int height); -void gfx_set_dirty_blocks(int left, int top, int right, int bottom); +void gfx_set_dirty_blocks(uint16 left, uint16 top, uint16 right, uint16 bottom); void gfx_draw_all_dirty_blocks(); void gfx_redraw_screen_rect(short left, short top, short right, short bottom); void gfx_invalidate_tile_if_zoomed(int x, int y, int base_height, int clearance_height); diff --git a/src/openrct2.c b/src/openrct2.c index 7a74728b64..cf8e99cc94 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -25,6 +25,7 @@ #include "config.h" #include "editor.h" #include "game.h" +#include "hook.h" #include "interface/window.h" #include "localisation/localisation.h" #include "network/http.h" @@ -189,6 +190,8 @@ bool openrct2_initialise() openrct2_copy_original_user_files_over(); + addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){EAX, EBX, EDX, EBP, END}, 0); // remove after all drawing is decompiled + Mixer_Init(NULL); return true; } From f42ac4715ae324ba2a0d4601b04980690754edcf Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 5 Jul 2015 20:31:25 +0100 Subject: [PATCH 0194/1173] Refactor ride_get_refund_price --- src/ride/ride.c | 118 ++++++++++++++++++++++++++---------------------- 1 file changed, 64 insertions(+), 54 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index a70a1be984..c1a2538c99 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4460,64 +4460,74 @@ int ride_get_refund_price(int ride_id) { uint8 oldpaused = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8); RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = 0; - RCT2_GLOBAL(0x00F4413A, int) = 0; - for(int x = 0; x < 8192; x += 32){ - for(int y = 0; y < 8192; y += 32){ - int tile_idx = ((y * 256) + x) / 32; - rct_map_element* map_element = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*)[tile_idx]; - do{ - if((map_element->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_TRACK && map_element->properties.track.ride_index == ride_id){ - int eax, ebx, ecx, edx, esi, edi, ebp; - eax = x; - ebx = ((map_element->type & MAP_ELEMENT_DIRECTION_MASK) << 8) | 0x01; - ecx = y; - edx = map_element->properties.track.type; - edi = map_element->base_height * 8; - if(map_element->properties.track.type == 101){ - edx = 2 << 8 | map_element->properties.track.ride_index; - int oldeax = eax; - int oldebx = ebx; - int oldecx = ecx; - int oldedx = edx; + RCT2_GLOBAL(0x00F4413A, money32) = 0; - ebx = oldebx; - ebx |= 0 << 0; - RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_SET_MAZE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - - ebx = oldebx; - ebx |= 1 << 8; - ecx = oldecx; - ecx += 16; - edx = oldedx; - RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_SET_MAZE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + map_element_iterator it; - ebx = oldebx; - ebx |= 2 << 8; - eax = oldeax; - eax += 16; - ecx = oldecx; - ecx += 16; - edx = oldedx; - RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_SET_MAZE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + map_element_iterator_begin(&it); + while (map_element_iterator_next(&it)) { + if (map_element_get_type(it.element) != MAP_ELEMENT_TYPE_TRACK) + continue; - ebx = oldebx; - ebx |= 3 << 8; - eax = oldeax; - eax += 16; - ecx = oldecx; - edx = oldedx; - RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_SET_MAZE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - }else{ - edx |= 0xFF << 8; - edx &= ((map_element->properties.track.sequence & 0xF) << 8) | 0xFF; - RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_REMOVE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - } - y -= 32; - break; - } - map_element++; - }while(!((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE)); + if (it.element->properties.track.ride_index != ride_id) + continue; + + int x = it.x * 32, y = it.y * 32; + int z = it.element->base_height * 8; + + uint8 rotation = it.element->type & MAP_ELEMENT_DIRECTION_MASK; + uint8 type = it.element->properties.track.type; + + if (type != TRACK_ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP){ + RCT2_GLOBAL(0x00F4413A, money32) += game_do_command( + x, + GAME_COMMAND_FLAG_APPLY | (rotation << 8), + y, + type | ((it.element->properties.track.sequence & 0xF) << 8), + GAME_COMMAND_REMOVE_TRACK, + z, + 0); + map_element_iterator_restart_for_tile(&it); + break; } + + RCT2_GLOBAL(0x00F4413A, money32) += game_do_command( + x, + GAME_COMMAND_FLAG_APPLY | (0 << 8), + y, + ride_id | (2 << 8), + GAME_COMMAND_SET_MAZE_TRACK, + z, + 0); + + RCT2_GLOBAL(0x00F4413A, money32) += game_do_command( + x, + GAME_COMMAND_FLAG_APPLY | (1 << 8), + y + 16, + ride_id | (2 << 8), + GAME_COMMAND_SET_MAZE_TRACK, + z, + 0); + + RCT2_GLOBAL(0x00F4413A, money32) += game_do_command( + x + 16, + GAME_COMMAND_FLAG_APPLY | (2 << 8), + y + 16, + ride_id | (2 << 8), + GAME_COMMAND_SET_MAZE_TRACK, + z, + 0); + + RCT2_GLOBAL(0x00F4413A, money32) += game_do_command( + x + 16, + GAME_COMMAND_FLAG_APPLY | (3 << 8), + y, + ride_id | (2 << 8), + GAME_COMMAND_SET_MAZE_TRACK, + z, + 0); + map_element_iterator_restart_for_tile(&it); + break; } RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = oldpaused; return RCT2_GLOBAL(0x00F4413A, int); From da0368d1a3619fb2331c76c324e331cac6bbf447 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 5 Jul 2015 20:57:14 +0100 Subject: [PATCH 0195/1173] Fix bug in track remove. Fixes #1552 --- src/ride/track.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index 770f5d0b47..9ed5663adb 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3999,8 +3999,8 @@ money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, const rct_preview_track* trackBlock = get_track_def_from_ride(ride, type); trackBlock += mapElement->properties.track.sequence & 0xF; - - switch (mapElement->type & MAP_ELEMENT_DIRECTION_MASK){ + uint8 originDirection = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; + switch (originDirection){ case 0: originX -= trackBlock->x; originY -= trackBlock->y; @@ -4027,7 +4027,7 @@ money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, for (; trackBlock->index != 255; trackBlock++){ sint16 x = originX, y = originY, z = originZ; - switch (mapElement->type & MAP_ELEMENT_DIRECTION_MASK){ + switch (originDirection){ case 0: x += trackBlock->x; y += trackBlock->y; From 946811068fcd3e82bd98ce86dc44c0eca1c87c6d Mon Sep 17 00:00:00 2001 From: "Miso Zmiric (Mike Squinter)" Date: Sun, 5 Jul 2015 21:08:16 +0100 Subject: [PATCH 0196/1173] add local libversion checks for VS (via powershell) --- .gitignore | 1 + pre-build.ps1 | 26 ++++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index a23212bf70..9a83493328 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ distribution/windows/*.exe #lib lib +libversion ################# ## Eclipse diff --git a/pre-build.ps1 b/pre-build.ps1 index a4b2246d58..938f4c7f7b 100644 --- a/pre-build.ps1 +++ b/pre-build.ps1 @@ -1,11 +1,33 @@ +#init +$libversion = 1 $path = Split-Path $Script:MyInvocation.MyCommand.Path $zip = $path+'\orctlibs.zip' $libs = $path+'\lib' +$libsVFile = $path+'\libversion' $libsTest = Test-Path $libs -if (!$libsTest) { - mkdir $libs + +#libs version test +$libsVersionTest = Test-Path $libsVFile +$currentVersion = 0 +$needsdownload = $true +if ($libsVersionTest) { + $currentVersion = [IO.File]::ReadAllText($libsVFile) +} +if ($currentVersion -ge $libversion) { + $needsdownload = $false +} + +#download +if (!$libsTest -or $needsdownload) { + if ($libsTest) { + rm $libs -Recurse -Force + } + mkdir $libs Invoke-WebRequest https://download.openrct2.website/dev/lib/vs -OutFile $path\orctlibs.zip [System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') > $null [System.IO.Compression.ZipFile]::ExtractToDirectory($zip, $libs) rm $path\orctlibs.zip -Force -ErrorAction SilentlyContinue + $libversion | Set-Content $libsVFile +} else { + echo 'All libs up to date' } From 87ea04c002b889bc472a874b206b4a6e2da9ef44 Mon Sep 17 00:00:00 2001 From: "Miso Zmiric (Mike Squinter)" Date: Sun, 5 Jul 2015 22:39:35 +0100 Subject: [PATCH 0197/1173] add libversion checks to mingw build --- build.sh | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/build.sh b/build.sh index 9a96a9851d..8835abe2c6 100755 --- a/build.sh +++ b/build.sh @@ -2,10 +2,51 @@ set -e +cachedir=.cache +mkdir -p $cachedir + if [[ ! -d build ]]; then mkdir -p build fi +libversion=1 +libVFile="./libversion" +libdir="./lib" +currentversion=0 +needsdownload="true" + +if [ -f $libVFile ]; then + while read line; do + currentversion=$line + continue + done < $libVFile +fi + +if [ $currentversion -ge $libversion ]; then + needsdownload="false" +fi + +if [ ! -d $libdir ]; then + needsdownload="true" +fi + +if [[ "$needsdownload" = "true" ]]; then + echo "New libraries need to be downloaded, the script might ask you for sudo access password" + rm -rf ./lib + if [[ -f $cachedir/orctlibs.zip ]]; then + rm -rf $cachedir/orctlibs.zip + fi + if [[ -d /usr/local/cross-tools/orctlibs ]]; then + sudo rm -rf /usr/local/cross-tools/orctlibs + fi + curl https://download.openrct2.website/dev/lib/mingw -o $cachedir/orctlibs.zip; + sudo mkdir -p /usr/local/cross-tools/orctlibs + mkdir -p lib + sudo cp -rf $cachedir/orctlibs/glob/* /usr/local/cross-tools/orctlibs/. + cp -rf $cachedir/orctlibs/local/* ./lib/. + echo $libversion > $libVFile +fi + pushd build cmake -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt -DCMAKE_BUILD_TYPE=Debug .. make From 995835f8095b20a2c2e95a28a9853052402e9da7 Mon Sep 17 00:00:00 2001 From: "Miso Zmiric (Mike Squinter)" Date: Mon, 6 Jul 2015 02:16:04 +0100 Subject: [PATCH 0198/1173] fix build.sh to actually unzip the downloaded libs --- build.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 8835abe2c6..a6bc78fb14 100755 --- a/build.sh +++ b/build.sh @@ -39,7 +39,14 @@ if [[ "$needsdownload" = "true" ]]; then if [[ -d /usr/local/cross-tools/orctlibs ]]; then sudo rm -rf /usr/local/cross-tools/orctlibs fi - curl https://download.openrct2.website/dev/lib/mingw -o $cachedir/orctlibs.zip; + if [[ -d $cachedir/orctlibs ]]; then + rm -rf $cachedir/orctlibs + fi + curl https://download.openrct2.website/dev/lib/mingw -o $cachedir/orctlibs.zip + mkdir -p $cachedir/orctlibs + pushd $cachedir/orctlibs + unzip -uaq ../orctlibs.zip + popd sudo mkdir -p /usr/local/cross-tools/orctlibs mkdir -p lib sudo cp -rf $cachedir/orctlibs/glob/* /usr/local/cross-tools/orctlibs/. From 294456daa1f84971bf504894896504ddc33757dc Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 6 Jul 2015 04:00:17 +0100 Subject: [PATCH 0199/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 2 +- data/language/english_us.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 8c8a243d77..3a435611d2 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -51,7 +51,7 @@ STR_0049 :Spookhuis STR_0050 :Eerste hulp STR_0051 :Circus STR_0052 :Spooktrein -STR_0053 :Twisterachtbaan +STR_0053 :Stalen twisterachtbaan STR_0054 :Houten achtbaan STR_0055 :Zijfrictie-achtbaan STR_0056 :Wilde muis diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 62e7f9dea6..af5c18329e 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -54,7 +54,7 @@ STR_0049 :Haunted House STR_0050 :First Aid Room STR_0051 :Circus Show STR_0052 :Tunnel Of Horror -STR_0053 :Twister Roller Coaster +STR_0053 :Steel Twister Roller Coaster STR_0054 :Wooden Roller Coaster STR_0055 :Side-Friction Roller Coaster STR_0056 :Wild Mouse From c4504323c8416f1b4b26728d5839eb1888b91818 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 5 Jul 2015 16:47:22 +0100 Subject: [PATCH 0200/1173] implement-editor-callprocs, part 1 --- src/localisation/string_ids.h | 1 + src/windows/editor_bottom_toolbar.c | 142 ++++++++++++++++++++++++-- src/world/footpath.c | 153 ++++++++++++++++++++++++++++ src/world/footpath.h | 4 + 4 files changed, 289 insertions(+), 11 deletions(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 0b0cc8eceb..73519e94d6 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1625,6 +1625,7 @@ enum { STR_OBJECTIVE = 3322, + STR_PEEP_SPAWNS_NOT_SET = 3327, STR_CANT_ADVANCE_TO_NEXT_EDITOR_STAGE = 3328, STR_NO_PARK_ENTRANCES = 3329, STR_PARK_MUST_OWN_SOME_LAND = 3330, diff --git a/src/windows/editor_bottom_toolbar.c b/src/windows/editor_bottom_toolbar.c index dfc63d52db..bd7528837f 100644 --- a/src/windows/editor_bottom_toolbar.c +++ b/src/windows/editor_bottom_toolbar.c @@ -25,15 +25,16 @@ #include "../scenario.h" #include "../sprites.h" #include "../localisation/localisation.h" +#include "../interface/themes.h" #include "../interface/viewport.h" #include "../interface/widget.h" #include "../interface/window.h" #include "../platform/platform.h" #include "../title.h" #include "../util/util.h" +#include "../world/footpath.h" #include "../world/scenery.h" #include "error.h" -#include "../interface/themes.h" enum { WIDX_PREVIOUS_IMAGE, // 1 @@ -153,13 +154,23 @@ void window_editor_bottom_toolbar_jump_back_to_object_selection() { gfx_invalidate_screen(); } +/** + * + * rct2: 0x006DFED0 + */ +static void sub_6DFED0() +{ + for (int i = 0; i < 56; i++) + RCT2_ADDRESS(0x01357BD0, sint32)[i] = -1; +} + /** * * rct2: 0x0066F62C */ void window_editor_bottom_toolbar_jump_back_to_landscape_editor() { window_close_all(); - RCT2_CALLPROC_EBPSAFE(0x006DFED0); + sub_6DFED0(); scenery_set_default_placement_configuration(); g_editor_step = EDITOR_STEP_LANDSCAPE_EDITOR; window_map_open(); @@ -199,13 +210,60 @@ void window_editor_bottom_toolbar_jump_back_to_options_selection() { gfx_invalidate_screen(); } +/** + * + * rct2: 0x006AB9B8 + */ +static bool editor_check_object_selection() +{ + return !(RCT2_CALLPROC_EBPSAFE(0x006AB9B8) & 0x100); +} + /** * * rct2: 0x006AB1CE */ -int window_editor_bottom_toolbar_check_object_selection() +bool window_editor_bottom_toolbar_check_object_selection() { - return RCT2_CALLPROC_EBPSAFE(0x006AB1CE) & 0x100; + rct_window *w; + + if (editor_check_object_selection()) { + window_close_by_class(WC_EDITOR_OBJECT_SELECTION); + return true; + } + + window_error_open(STR_INVALID_SELECTION_OF_OBJECTS, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id)); + w = window_find_by_class(WC_EDITOR_OBJECT_SELECTION); + if (w != NULL) { + // Click first tab (rides) + window_event_mouse_up_call(w, 4); + } + return false; +} + +/** + * + * rct2: 0x0066F6E3 + */ +static void sub_66F6E3() +{ + RCT2_GLOBAL(0x01357404, uint32) = 0xFFFFFFFF; + RCT2_GLOBAL(0x01357408, uint32) = 0xFFFFFFFF; + RCT2_GLOBAL(0x0135740C, uint32) = 0xFFFFFFFF; + RCT2_GLOBAL(0x01357410, uint32) = 0xFFFFFFFF; + + for (int i = 0; i < 128; i++) { + RCT2_ADDRESS(0x01357444, uint32)[i] = RCT2_ADDRESS(0x0097C468, uint32)[i]; + RCT2_ADDRESS(0x01357644, uint32)[i] = RCT2_ADDRESS(0x0097C5D4, uint32)[i]; + } + + for (int i = 0; i < 8; i++) { + RCT2_ADDRESS(0x01357424, uint32)[i] = 0xFFFFFFFF; + } + + window_new_ride_open(); + RCT2_GLOBAL(0x0141F570, uint8) = 6; + gfx_invalidate_screen(); } /** @@ -214,13 +272,13 @@ int window_editor_bottom_toolbar_check_object_selection() */ void window_editor_bottom_toolbar_jump_forward_from_object_selection() { - if (window_editor_bottom_toolbar_check_object_selection()) + if (!window_editor_bottom_toolbar_check_object_selection()) return; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) { - RCT2_CALLPROC_EBPSAFE(0x0066F6E3); + sub_66F6E3(); } else { - RCT2_CALLPROC_EBPSAFE(0x006DFED0); + sub_6DFED0(); scenery_set_default_placement_configuration(); RCT2_GLOBAL(0x00141F570, uint8) = 1; window_map_open(); @@ -228,14 +286,76 @@ void window_editor_bottom_toolbar_jump_forward_from_object_selection() } } +/** + * + * rct2: 0x0066FEAC + */ +bool editor_check_park() +{ + // return !(RCT2_CALLPROC_EBPSAFE(0x0066FEAC) & 0x100); + + int parkSize = park_calculate_size(); + if (parkSize == 0) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_PARK_MUST_OWN_SOME_LAND; + return false; + } + + for (int i = 0; i < 4; i++) { + if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i] != 0x8000) + break; + + if (i == 3) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_NO_PARK_ENTRANCES; + return false; + } + } + + for (int i = 0; i < 4; i++) { + if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i] == 0x8000) + continue; + + int x = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i]; + int y = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, uint16)[i]; + int z = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Z, uint16)[i] / 8; + int direction = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_DIRECTION, uint8)[i] ^ 2; + + // dh = 0; + // di = 0xFFFF; + RCT2_GLOBAL(0x00F1AEDC, uint8) = 16; + RCT2_GLOBAL(0x00F1AEE0, uint8) = 1; + RCT2_GLOBAL(0x00F1AEDE, uint16) = 0; + RCT2_GLOBAL(0x00F1AEDD, uint8) = 0; + if (!footpath_is_connected_to_map_edge(x, y, z, direction, 0)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_PARK_ENTRANCE_WRONG_DIRECTION_OR_NO_PATH; + if (RCT2_GLOBAL(0x00F1AEDD, uint8) & (1 << 6)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_PARK_ENTRANCE_PATH_INCOMPLETE_OR_COMPLEX; + } + return false; + } + + // dh = 0; + // di = 0xFFFF; + RCT2_GLOBAL(0x00F1AEDC, uint8) = 16; + RCT2_GLOBAL(0x00F1AEE0, uint8) = 1; + RCT2_GLOBAL(0x00F1AEDE, uint16) = 0; + RCT2_GLOBAL(0x00F1AEDD, uint8) = 0x20; + footpath_is_connected_to_map_edge(x, y, z, direction, 0x20); + } + + if (gPeepSpawns[0].x == 0xFFFF && gPeepSpawns[1].x == 0xFFFF) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_PEEP_SPAWNS_NOT_SET; + return false; + } + + return true; +} + /** * -* rct2: 0x0066f758 +* rct2: 0x0066F758 */ void window_editor_bottom_toolbar_jump_forward_to_invention_list_set_up() { - uint32 flags = RCT2_CALLPROC_X(0x0066FEAC, 0, 0, 0, 0, 0, 0, 0); - - if (!(flags & 0x100)) { + if (editor_check_park()) { window_close_all(); window_editor_inventions_list_open(); g_editor_step = EDITOR_STEP_INVENTIONS_LIST_SET_UP; diff --git a/src/world/footpath.c b/src/world/footpath.c index 3e5f38a2ef..75e2228707 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -731,3 +731,156 @@ void sub_6A759F() } } } + +static void loc_69ADBD(int x, int y, rct_map_element *pathElement) +{ + int ownershipUnk = 0; + int z = pathElement->base_height; + rct_map_element *surfaceElement = map_get_surface_element_at(x >> 5, y >> 5); + if (surfaceElement->base_height |= z) { + z -= 2; + if (surfaceElement->base_height |= z) { + ownershipUnk = (surfaceElement->properties.surface.ownership & 0xCF) >> 4; + } + } + map_buy_land_rights(x, y, x, y, 6, 1); +} + +bool get_next_direction(int edges, int *direction) +{ + int index = bitscanforward(edges); + if (index == -1) + return false; + + *direction = index; + return true; +} + +/** + * + * rct2: 0x0069AC1A + */ +bool footpath_is_connected_to_map_edge_recurse( + int x, int y, int z, int direction, int flags, + int level, int distanceFromJunction, int junctionTolerance +) { + // int eax, ebx, ecx, edx, esi, edi, ebp; + // RCT2_GLOBAL(0x00F1AEDC, uint8) = 16; + // RCT2_GLOBAL(0x00F1AEDD, uint8) = 0; + // RCT2_GLOBAL(0x00F1AEDE, uint16) = 0; + // RCT2_GLOBAL(0x00F1AEE0, uint8) = 1; + // dh + // di + // edx = 0; + // edi = 0xFFFF; + // RCT2_CALLFUNC_X(0x0069AC1A, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + // return edi & 0xFFFF; + + rct_map_element *mapElement; + int edges, slopeDirection; + + x += TileDirectionDelta[direction].x; + y += TileDirectionDelta[direction].y; + if (++level > 250) + return false; + + // Check if we are at edge of map + if (x < 32 || y < 32) + return true; + if (x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) || y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16)) + return true; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + + if (footpath_element_is_sloped(mapElement)) { + // loc_69AD78 + slopeDirection = footpath_element_get_slope_direction(mapElement); + if (slopeDirection != direction) { + if ((slopeDirection ^ 2) != direction) continue; + if (mapElement->base_height + 2 != z) continue; + + goto loc_69AD9F; + } + } + + if (mapElement->base_height != z) + continue; + + loc_69AD9F: + if (mapElement->type & RCT2_GLOBAL(0x00F1AEE0, uint8)) continue; + + flags |= 0x40; + if (flags & 0x20) { + loc_69ADBD(x, y, mapElement); + } + edges = mapElement->properties.path.edges & 0x0F; + direction ^= 2; + if ((mapElement + 1)->type == 28) { + // goto loc_69AC9C; + } + if ((mapElement + 1)->base_height == 28) { + // goto loc_69AD00; + } + goto loc_69AE22; + } while (!map_element_is_last_for_tile(mapElement++)); + return false; + +loc_69AE22: + // Exclude direction we came from + z = mapElement->base_height; + edges &= ~(1 << direction); + + // Find next direction to go + if (!get_next_direction(edges, &direction)) + return false; + + edges &= ~(1 << direction); + if (edges == 0) { + // Only possible direction to go + if (footpath_element_is_sloped(mapElement) && footpath_element_get_slope_direction(mapElement) == direction) { + z += 2; + } + return footpath_is_connected_to_map_edge_recurse( + x, y, z, direction, flags, + level, distanceFromJunction + 1, junctionTolerance + ); + } else { + // We have reached a junction + if (distanceFromJunction != 0) { + junctionTolerance--; + } + junctionTolerance--; + if (junctionTolerance < 0) + return false; + + do { + edges &= ~(1 << direction); + if (footpath_element_is_sloped(mapElement) && footpath_element_get_slope_direction(mapElement) == direction) { + z += 2; + } + if (footpath_is_connected_to_map_edge_recurse(x, y, z, direction, flags, level, 0, junctionTolerance)) { + return true; + } + } while (get_next_direction(edges, &direction)); + + return false; + } +} + +bool footpath_is_connected_to_map_edge(int x, int y, int z, int direction, int flags) +{ + footpath_is_connected_to_map_edge_recurse(x, y, z, direction, flags, 0, 0, 12); +} + +bool footpath_element_is_sloped(rct_map_element *mapElement) +{ + return mapElement->properties.path.type & 4; +} + +int footpath_element_get_slope_direction(rct_map_element *mapElement) +{ + return mapElement->properties.path.type & 3; +} diff --git a/src/world/footpath.h b/src/world/footpath.h index 5d4ce3d22f..59b25b25e3 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -57,4 +57,8 @@ void sub_6A742F(int rideIndex, int entranceIndex, int x, int y, rct_map_element void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, int *direction, rct_map_element **mapElement); +bool footpath_is_connected_to_map_edge(int x, int y, int z, int direction, int flags); +bool footpath_element_is_sloped(rct_map_element *mapElement); +int footpath_element_get_slope_direction(rct_map_element *mapElement); + #endif From 791c2391f55eacfbd8281777278a70016bb23803 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 6 Jul 2015 14:40:37 +0100 Subject: [PATCH 0201/1173] implement-editor-callprocs, part 2 --- src/editor.c | 66 ++++++++++++++++- src/editor.h | 3 + src/windows/editor_bottom_toolbar.c | 73 ------------------- src/world/footpath.c | 106 ++++++++++++++-------------- src/world/footpath.h | 9 ++- 5 files changed, 129 insertions(+), 128 deletions(-) diff --git a/src/editor.c b/src/editor.c index 8209478e56..4d92429e2c 100644 --- a/src/editor.c +++ b/src/editor.c @@ -39,6 +39,7 @@ #include "util/util.h" #include "world/banner.h" #include "world/climate.h" +#include "world/footpath.h" #include "world/map.h" #include "world/park.h" #include "world/scenery.h" @@ -599,4 +600,67 @@ static void editor_finalise_main_view() RCT2_GLOBAL(0x009DEB7C, uint16) = 0; load_palette(); gfx_invalidate_screen(); -} \ No newline at end of file +} + +/** + * + * rct2: 0x006AB9B8 + */ +bool editor_check_object_selection() +{ + return !(RCT2_CALLPROC_EBPSAFE(0x006AB9B8) & 0x100); +} + +/** + * + * rct2: 0x0066FEAC + */ +bool editor_check_park() +{ + int parkSize = park_calculate_size(); + if (parkSize == 0) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_PARK_MUST_OWN_SOME_LAND; + return false; + } + + for (int i = 0; i < 4; i++) { + if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i] != 0x8000) + break; + + if (i == 3) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_NO_PARK_ENTRANCES; + return false; + } + } + + for (int i = 0; i < 4; i++) { + if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i] == 0x8000) + continue; + + int x = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i]; + int y = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, uint16)[i]; + int z = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Z, uint16)[i] / 8; + int direction = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_DIRECTION, uint8)[i] ^ 2; + + switch (footpath_is_connected_to_map_edge(x, y, z, direction, 0)) { + case FOOTPATH_SEARCH_NOT_FOUND: + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_PARK_ENTRANCE_WRONG_DIRECTION_OR_NO_PATH; + return false; + case FOOTPATH_SEARCH_INCOMPLETE: + case FOOTPATH_SEARCH_TOO_COMPLEX: + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_PARK_ENTRANCE_PATH_INCOMPLETE_OR_COMPLEX; + return false; + case FOOTPATH_SEARCH_SUCCESS: + // Run the search again and unown the path + footpath_is_connected_to_map_edge(x, y, z, direction, 0x20); + break; + } + } + + if (gPeepSpawns[0].x == 0xFFFF && gPeepSpawns[1].x == 0xFFFF) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_PEEP_SPAWNS_NOT_SET; + return false; + } + + return true; +} diff --git a/src/editor.h b/src/editor.h index 9232dd7c59..8c0fd56699 100644 --- a/src/editor.h +++ b/src/editor.h @@ -47,4 +47,7 @@ void sub_6BD3A4(); void editor_open_windows_for_current_step(); +bool editor_check_park(); +bool editor_check_object_selection(); + #endif diff --git a/src/windows/editor_bottom_toolbar.c b/src/windows/editor_bottom_toolbar.c index bd7528837f..b5c15ce0cf 100644 --- a/src/windows/editor_bottom_toolbar.c +++ b/src/windows/editor_bottom_toolbar.c @@ -210,15 +210,6 @@ void window_editor_bottom_toolbar_jump_back_to_options_selection() { gfx_invalidate_screen(); } -/** - * - * rct2: 0x006AB9B8 - */ -static bool editor_check_object_selection() -{ - return !(RCT2_CALLPROC_EBPSAFE(0x006AB9B8) & 0x100); -} - /** * * rct2: 0x006AB1CE @@ -286,70 +277,6 @@ void window_editor_bottom_toolbar_jump_forward_from_object_selection() } } -/** - * - * rct2: 0x0066FEAC - */ -bool editor_check_park() -{ - // return !(RCT2_CALLPROC_EBPSAFE(0x0066FEAC) & 0x100); - - int parkSize = park_calculate_size(); - if (parkSize == 0) { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_PARK_MUST_OWN_SOME_LAND; - return false; - } - - for (int i = 0; i < 4; i++) { - if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i] != 0x8000) - break; - - if (i == 3) { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_NO_PARK_ENTRANCES; - return false; - } - } - - for (int i = 0; i < 4; i++) { - if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i] == 0x8000) - continue; - - int x = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i]; - int y = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, uint16)[i]; - int z = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Z, uint16)[i] / 8; - int direction = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_DIRECTION, uint8)[i] ^ 2; - - // dh = 0; - // di = 0xFFFF; - RCT2_GLOBAL(0x00F1AEDC, uint8) = 16; - RCT2_GLOBAL(0x00F1AEE0, uint8) = 1; - RCT2_GLOBAL(0x00F1AEDE, uint16) = 0; - RCT2_GLOBAL(0x00F1AEDD, uint8) = 0; - if (!footpath_is_connected_to_map_edge(x, y, z, direction, 0)) { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_PARK_ENTRANCE_WRONG_DIRECTION_OR_NO_PATH; - if (RCT2_GLOBAL(0x00F1AEDD, uint8) & (1 << 6)) { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_PARK_ENTRANCE_PATH_INCOMPLETE_OR_COMPLEX; - } - return false; - } - - // dh = 0; - // di = 0xFFFF; - RCT2_GLOBAL(0x00F1AEDC, uint8) = 16; - RCT2_GLOBAL(0x00F1AEE0, uint8) = 1; - RCT2_GLOBAL(0x00F1AEDE, uint16) = 0; - RCT2_GLOBAL(0x00F1AEDD, uint8) = 0x20; - footpath_is_connected_to_map_edge(x, y, z, direction, 0x20); - } - - if (gPeepSpawns[0].x == 0xFFFF && gPeepSpawns[1].x == 0xFFFF) { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_PEEP_SPAWNS_NOT_SET; - return false; - } - - return true; -} - /** * * rct2: 0x0066F758 diff --git a/src/world/footpath.c b/src/world/footpath.c index 75e2228707..a57491cfe2 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -732,7 +732,11 @@ void sub_6A759F() } } -static void loc_69ADBD(int x, int y, rct_map_element *pathElement) +/** + * + * rct2: 0x0069ADBD + */ +static void footpath_unown(int x, int y, rct_map_element *pathElement) { int ownershipUnk = 0; int z = pathElement->base_height; @@ -760,82 +764,75 @@ bool get_next_direction(int edges, int *direction) * * rct2: 0x0069AC1A */ -bool footpath_is_connected_to_map_edge_recurse( +int footpath_is_connected_to_map_edge_recurse( int x, int y, int z, int direction, int flags, int level, int distanceFromJunction, int junctionTolerance ) { - // int eax, ebx, ecx, edx, esi, edi, ebp; - // RCT2_GLOBAL(0x00F1AEDC, uint8) = 16; - // RCT2_GLOBAL(0x00F1AEDD, uint8) = 0; - // RCT2_GLOBAL(0x00F1AEDE, uint16) = 0; - // RCT2_GLOBAL(0x00F1AEE0, uint8) = 1; - // dh - // di - // edx = 0; - // edi = 0xFFFF; - // RCT2_CALLFUNC_X(0x0069AC1A, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - // return edi & 0xFFFF; - rct_map_element *mapElement; int edges, slopeDirection; x += TileDirectionDelta[direction].x; y += TileDirectionDelta[direction].y; if (++level > 250) - return false; + return FOOTPATH_SEARCH_TOO_COMPLEX; // Check if we are at edge of map if (x < 32 || y < 32) - return true; + return FOOTPATH_SEARCH_SUCCESS; if (x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) || y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16)) - return true; + return FOOTPATH_SEARCH_SUCCESS; mapElement = map_get_first_element_at(x >> 5, y >> 5); do { if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) continue; - if (footpath_element_is_sloped(mapElement)) { - // loc_69AD78 - slopeDirection = footpath_element_get_slope_direction(mapElement); - if (slopeDirection != direction) { - if ((slopeDirection ^ 2) != direction) continue; - if (mapElement->base_height + 2 != z) continue; - - goto loc_69AD9F; - } + if ( + footpath_element_is_sloped(mapElement) && + (slopeDirection = footpath_element_get_slope_direction(mapElement)) != direction + ) { + if ((slopeDirection ^ 2) != direction) continue; + if (mapElement->base_height + 2 != z) continue; + } else if (mapElement->base_height != z) { + continue; } - if (mapElement->base_height != z) - continue; + if (mapElement->type & RCT2_GLOBAL(0x00F1AEE0, uint8)) continue; - loc_69AD9F: - if (mapElement->type & RCT2_GLOBAL(0x00F1AEE0, uint8)) continue; - - flags |= 0x40; - if (flags & 0x20) { - loc_69ADBD(x, y, mapElement); + if (flags & 0x20) { + footpath_unown(x, y, mapElement); + } + edges = mapElement->properties.path.edges & 0x0F; + direction ^= 2; + if (!(flags & 0x80)) { + if (mapElement[1].type == MAP_ELEMENT_TYPE_BANNER) { + for (int i = 1; i < 4; i++) { + if (map_element_is_last_for_tile(&mapElement[i - 1])) break; + if (mapElement[i].type != MAP_ELEMENT_TYPE_BANNER) break; + edges &= mapElement[i].properties.banner.flags; + } } - edges = mapElement->properties.path.edges & 0x0F; - direction ^= 2; - if ((mapElement + 1)->type == 28) { - // goto loc_69AC9C; + if (mapElement[2].type == MAP_ELEMENT_TYPE_BANNER && mapElement[1].type != MAP_ELEMENT_TYPE_PATH) { + for (int i = 1; i < 6; i++) { + if (map_element_is_last_for_tile(&mapElement[i - 1])) break; + if (mapElement[i].type != MAP_ELEMENT_TYPE_BANNER) break; + edges &= mapElement[i].properties.banner.flags; + } } - if ((mapElement + 1)->base_height == 28) { - // goto loc_69AD00; - } - goto loc_69AE22; + } + goto searchFromFootpath; } while (!map_element_is_last_for_tile(mapElement++)); - return false; + return level == 1 ? FOOTPATH_SEARCH_NOT_FOUND : FOOTPATH_SEARCH_INCOMPLETE; -loc_69AE22: +searchFromFootpath: // Exclude direction we came from z = mapElement->base_height; edges &= ~(1 << direction); // Find next direction to go - if (!get_next_direction(edges, &direction)) - return false; + if (!get_next_direction(edges, &direction)) { + return FOOTPATH_SEARCH_INCOMPLETE; + } edges &= ~(1 << direction); if (edges == 0) { @@ -853,26 +850,29 @@ loc_69AE22: junctionTolerance--; } junctionTolerance--; - if (junctionTolerance < 0) - return false; + if (junctionTolerance < 0) { + return FOOTPATH_SEARCH_TOO_COMPLEX; + } do { edges &= ~(1 << direction); if (footpath_element_is_sloped(mapElement) && footpath_element_get_slope_direction(mapElement) == direction) { z += 2; } - if (footpath_is_connected_to_map_edge_recurse(x, y, z, direction, flags, level, 0, junctionTolerance)) { - return true; + int result = footpath_is_connected_to_map_edge_recurse(x, y, z, direction, flags, level, 0, junctionTolerance); + if (result == FOOTPATH_SEARCH_SUCCESS) { + return result; } } while (get_next_direction(edges, &direction)); - return false; + return FOOTPATH_SEARCH_INCOMPLETE; } } -bool footpath_is_connected_to_map_edge(int x, int y, int z, int direction, int flags) +int footpath_is_connected_to_map_edge(int x, int y, int z, int direction, int flags) { - footpath_is_connected_to_map_edge_recurse(x, y, z, direction, flags, 0, 0, 12); + RCT2_GLOBAL(0x00F1AEE0, uint8) = 1; + return footpath_is_connected_to_map_edge_recurse(x, y, z, direction, flags, 0, 0, 16); } bool footpath_element_is_sloped(rct_map_element *mapElement) diff --git a/src/world/footpath.h b/src/world/footpath.h index 59b25b25e3..a44538db1b 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -37,6 +37,13 @@ typedef struct { uint8 flags; // 0x0B } rct_path_type; +enum { + FOOTPATH_SEARCH_SUCCESS, + FOOTPATH_SEARCH_NOT_FOUND, + FOOTPATH_SEARCH_INCOMPLETE, + FOOTPATH_SEARCH_TOO_COMPLEX +}; + #define g_pathTypeEntries ((rct_path_type**)object_entry_groups[OBJECT_TYPE_PATHS].chunks) extern const rct_xy16 word_981D6C[4]; @@ -57,7 +64,7 @@ void sub_6A742F(int rideIndex, int entranceIndex, int x, int y, rct_map_element void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, int *direction, rct_map_element **mapElement); -bool footpath_is_connected_to_map_edge(int x, int y, int z, int direction, int flags); +int footpath_is_connected_to_map_edge(int x, int y, int z, int direction, int flags); bool footpath_element_is_sloped(rct_map_element *mapElement); int footpath_element_get_slope_direction(rct_map_element *mapElement); From c366571a992d32aa0cb1cc5c6dbe50d2b3444ee9 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 6 Jul 2015 15:37:40 +0100 Subject: [PATCH 0202/1173] implement editor_check_object_selection --- src/editor.c | 46 +++++++++++++++++++++++++++-- src/editor.h | 2 +- src/localisation/string_ids.h | 1 + src/windows/editor_bottom_toolbar.c | 7 +++-- 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/editor.c b/src/editor.c index 4d92429e2c..8c80024260 100644 --- a/src/editor.c +++ b/src/editor.c @@ -602,13 +602,55 @@ static void editor_finalise_main_view() gfx_invalidate_screen(); } +static bool editor_check_object_group_at_least_one_selected(int objectType) +{ + uint32 numObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); + rct_object_entry *entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); + uint8 *objectFlag = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); + for (uint32 i = 0; i < numObjects; i++) { + if ((entry->flags & 0x0F) == objectType && (*objectFlag & 1)) { + return true; + } + entry = object_get_next(entry); + objectFlag++; + } + return false; +} + /** * * rct2: 0x006AB9B8 */ -bool editor_check_object_selection() +int editor_check_object_selection() { - return !(RCT2_CALLPROC_EBPSAFE(0x006AB9B8) & 0x100); + bool isTrackDesignerManager = + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER); + + if (!isTrackDesignerManager) { + if (!editor_check_object_group_at_least_one_selected(OBJECT_TYPE_PATHS)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_AT_LEAST_ONE_PATH_OBJECT_MUST_BE_SELECTED; + return OBJECT_TYPE_PATHS; + } + } + + if (!editor_check_object_group_at_least_one_selected(OBJECT_TYPE_RIDE)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_AT_LEAST_ONE_RIDE_OBJECT_MUST_BE_SELECTED; + return OBJECT_TYPE_RIDE; + } + + if (!isTrackDesignerManager) { + if (!editor_check_object_group_at_least_one_selected(OBJECT_TYPE_PARK_ENTRANCE)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_PARK_ENTRANCE_TYPE_MUST_BE_SELECTED; + return OBJECT_TYPE_PARK_ENTRANCE; + } + + if (!editor_check_object_group_at_least_one_selected(OBJECT_TYPE_WATER)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_WATER_TYPE_MUST_BE_SELECTED; + return OBJECT_TYPE_WATER; + } + } + + return -1; } /** diff --git a/src/editor.h b/src/editor.h index 8c0fd56699..ac83963cd4 100644 --- a/src/editor.h +++ b/src/editor.h @@ -48,6 +48,6 @@ void sub_6BD3A4(); void editor_open_windows_for_current_step(); bool editor_check_park(); -bool editor_check_object_selection(); +int editor_check_object_selection(); #endif diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 73519e94d6..768315e2a9 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1515,6 +1515,7 @@ enum { STR_UNABLE_TO_SELECT_THIS_OBJECT = 3176, STR_UNABLE_TO_DE_SELECT_THIS_OBJECT = 3177, STR_AT_LEAST_ONE_PATH_OBJECT_MUST_BE_SELECTED = 3178, + STR_AT_LEAST_ONE_RIDE_OBJECT_MUST_BE_SELECTED = 3179, STR_INVALID_SELECTION_OF_OBJECTS = 3180, STR_OBJECT_SELECTION = 3181, diff --git a/src/windows/editor_bottom_toolbar.c b/src/windows/editor_bottom_toolbar.c index b5c15ce0cf..ed530f3469 100644 --- a/src/windows/editor_bottom_toolbar.c +++ b/src/windows/editor_bottom_toolbar.c @@ -218,7 +218,8 @@ bool window_editor_bottom_toolbar_check_object_selection() { rct_window *w; - if (editor_check_object_selection()) { + int missingObjectType = editor_check_object_selection(); + if (missingObjectType < 0) { window_close_by_class(WC_EDITOR_OBJECT_SELECTION); return true; } @@ -226,8 +227,8 @@ bool window_editor_bottom_toolbar_check_object_selection() window_error_open(STR_INVALID_SELECTION_OF_OBJECTS, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id)); w = window_find_by_class(WC_EDITOR_OBJECT_SELECTION); if (w != NULL) { - // Click first tab (rides) - window_event_mouse_up_call(w, 4); + // Click tab with missing object + window_event_mouse_up_call(w, 4 + missingObjectType); } return false; } From 40a495cabc623d768a13e20c33f9438cbdeec532 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Mon, 6 Jul 2015 09:27:41 -0600 Subject: [PATCH 0203/1173] fix bug in hook which caused it not to work on other OSes --- src/hook.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/hook.c b/src/hook.c index 6c8dd9395a..26733d6b24 100644 --- a/src/hook.c +++ b/src/hook.c @@ -139,10 +139,8 @@ void hookfunc(int address, int newaddress, int stacksize, int registerargs[], in data[i++] = 0xEC; data[i++] = 4 + (stacksize * 4) + rargssize; - data[i++] = 0xEA; // jmp - *((int *)&data[i]) = newaddress; i += 4; - data[i++] = 0x23; - data[i++] = 0x00; + data[i++] = 0xE9; // jmp + *((int *)&data[i]) = (newaddress - address - i - 4); i += 4; data[sizeoffset] = i - sizec; @@ -190,10 +188,8 @@ void addhook(int address, int newaddress, int stacksize, int registerargs[], int unsigned int hookaddress = (unsigned int)g_hooktableaddress + (g_hooktableoffset * 100); char data[9]; int i = 0; - data[i++] = 0xEA; // jmp - *((int *)&data[i]) = hookaddress; i += 4; - data[i++] = 0x23; - data[i++] = 0x00; + data[i++] = 0xE9; // jmp + *((int *)&data[i]) = hookaddress - address - i - 4; i += 4; data[i++] = 0xC3; // retn WriteProcessMemory(GetCurrentProcess(), (LPVOID)address, data, i, 0); hookfunc(hookaddress, newaddress, stacksize, registerargs, registersreturned); From 9e26a6149fe8d8f618f84e2155d56109c5bd12a1 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 6 Jul 2015 17:59:37 +0100 Subject: [PATCH 0204/1173] implement sign_set_colour and fix gfx_invalidate_viewport_tile --- src/windows/sign.c | 38 ++++++-------- src/world/banner.c | 67 +++++++++++++++---------- src/world/banner.h | 2 + src/world/map.c | 121 +++++++++++++++++++++++++++++++++++++++++++++ src/world/map.h | 2 + src/world/park.c | 93 +++++++++++++++++----------------- 6 files changed, 225 insertions(+), 98 deletions(-) diff --git a/src/windows/sign.c b/src/windows/sign.c index 934638a368..1c92097184 100644 --- a/src/windows/sign.c +++ b/src/windows/sign.c @@ -291,7 +291,7 @@ static void window_sign_mousedown(int widgetIndex, rct_window*w, rct_widget* wid static void window_sign_dropdown() { short widgetIndex, dropdownIndex; - rct_window* w; + rct_window *w; window_dropdown_get_registers(w, widgetIndex, dropdownIndex); @@ -308,30 +308,20 @@ static void window_sign_dropdown() return; } - rct_banner* banner = &gBanners[w->number]; - int x = banner->x << 5; - int y = banner->y << 5; + rct_banner *banner = &gBanners[w->number]; + rct_map_element *mapElement = banner_get_map_element(w->number); + if (mapElement == NULL || map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE) + return; - rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); - - while (1){ - if (map_element_get_type(map_element) == MAP_ELEMENT_TYPE_SCENERY_MULTIPLE) { - rct_scenery_entry* scenery_entry = g_largeSceneryEntries[map_element->properties.scenerymultiple.type & MAP_ELEMENT_LARGE_TYPE_MASK]; - if (scenery_entry->large_scenery.var_11 != 0xFF){ - int id = (map_element->type & 0xC0) | - ((map_element->properties.scenerymultiple.colour[0] & 0xE0) >> 2) | - ((map_element->properties.scenerymultiple.colour[1] & 0xE0) >> 5); - if (id == w->number) - break; - } - } - map_element++; - } - - int edx = map_element->base_height | ((map_element->properties.scenerymultiple.type >> 10) << 8); - int ebp = w->list_information_type | (w->var_492 << 8); - int ebx = (map_element->type & 0x3) << 8; - RCT2_CALLPROC_X(0x6B9B05, x, ebx, y, edx, 0, w->number, ebp); + sign_set_colour( + banner->x * 32, + banner->y * 32, + mapElement->base_height, + mapElement->type & 3, + mapElement->properties.scenerymultiple.type >> 10, + w->list_information_type & 0xFF, + w->var_492 & 0xFF + ); window_invalidate(w); } diff --git a/src/world/banner.c b/src/world/banner.c index 306b1cad26..9aed57fae4 100644 --- a/src/world/banner.c +++ b/src/world/banner.c @@ -22,6 +22,7 @@ #include "../game.h" #include "../localisation/localisation.h" #include "banner.h" +#include "map.h" rct_banner *gBanners = (rct_banner*)0x0135A124; @@ -29,39 +30,55 @@ rct_banner *gBanners = (rct_banner*)0x0135A124; * * rct2: 0x006B9CB0 */ -void banner_init() { - for(int i = 0; i < MAX_BANNERS; i++) { - gBanners[i].type = BANNER_NULL; - } +void banner_init() +{ + for (int i = 0; i < MAX_BANNERS; i++) { + gBanners[i].type = BANNER_NULL; + } } -/* rct2: 0x006BA278 +/** * Creates a new banner and returns the index of the banner * If the flag GAME_COMMAND_FLAG_APPLY is NOT set then returns * the first unused index but does NOT mark the banner as created. * returns 0xFF on failure. + * + * rct2: 0x006BA278 */ -int create_new_banner(uint8 flags){ - int banner_index = 0; - for (; banner_index < MAX_BANNERS; banner_index++){ - if (gBanners[banner_index].type == BANNER_NULL){ - break; - } - } +int create_new_banner(uint8 flags) +{ + int banner_index = 0; + for (; banner_index < MAX_BANNERS; banner_index++){ + if (gBanners[banner_index].type == BANNER_NULL){ + break; + } + } - if (banner_index == MAX_BANNERS){ - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_MANY_BANNERS_IN_GAME; - return BANNER_NULL; - } + if (banner_index == MAX_BANNERS){ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_MANY_BANNERS_IN_GAME; + return BANNER_NULL; + } - if (flags & GAME_COMMAND_FLAG_APPLY){ - rct_banner* banner = &gBanners[banner_index]; + if (flags & GAME_COMMAND_FLAG_APPLY){ + rct_banner* banner = &gBanners[banner_index]; - banner->flags = 0; - banner->type = 0; - banner->string_idx = 778; - banner->colour = 2; - banner->text_colour = 2; - } + banner->flags = 0; + banner->type = 0; + banner->string_idx = 778; + banner->colour = 2; + banner->text_colour = 2; + } return banner_index; -} \ No newline at end of file +} + +rct_map_element *banner_get_map_element(int bannerIndex) +{ + rct_banner *banner = &gBanners[bannerIndex]; + rct_map_element *mapElement = map_get_first_element_at(banner->x, banner->y); + do { + if (map_element_get_banner_index(mapElement) == bannerIndex) { + return mapElement; + } + } while (!map_element_is_last_for_tile(mapElement++)); + return NULL; +} diff --git a/src/world/banner.h b/src/world/banner.h index 3944fd7c9c..13043b9f13 100644 --- a/src/world/banner.h +++ b/src/world/banner.h @@ -22,6 +22,7 @@ #define _BANNER_H_ #include "../common.h" +#include "../world/map.h" #define BANNER_NULL 255 #define MAX_BANNERS 250 @@ -46,5 +47,6 @@ extern rct_banner *gBanners; void banner_init(); int create_new_banner(uint8 flags); +rct_map_element *banner_get_map_element(int bannerIndex); #endif diff --git a/src/world/map.c b/src/world/map.c index 0ebe546dfd..826df6347e 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3333,3 +3333,124 @@ bool map_element_is_underground(rct_map_element *mapElement) } while (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SURFACE); return true; } + +void map_rotate_position(int direction, int *x, int *y) +{ + int offsetX, offsetY; + + switch (direction) { + case 0: + offsetX = (*x); + offsetY = (*y); + break; + case 1: + offsetX = (*y); + offsetY = -(*x); + break; + case 2: + offsetX = -(*x); + offsetY = -(*y); + break; + case 3: + offsetX = -(*y); + offsetY = (*x); + break; + } + *x = offsetX; + *y = offsetY; +} + +rct_map_element *map_get_large_scenery_segment(int x, int y, int z, int direction, int sequence) +{ + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE) + continue; + if (mapElement->base_height != z) + continue; + if ((mapElement->properties.scenerymultiple.type >> 10) != sequence) + continue; + if ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) != direction) + continue; + + return mapElement; + } while (!map_element_is_last_for_tile(mapElement++)); + return NULL; +} + +bool map_large_scenery_get_origin( + int x, int y, int z, int direction, int sequence, + int *outX, int *outY, int *outZ +) { + rct_map_element *mapElement; + rct_scenery_entry *sceneryEntry; + rct_large_scenery_tile *tile; + int offsetX, offsetY; + + mapElement = map_get_large_scenery_segment(x, y, z, direction, sequence); + if (mapElement == NULL) + return false; + + sceneryEntry = g_largeSceneryEntries[(mapElement->properties.scenerymultiple.type) & 0x3FF]; + tile = &sceneryEntry->large_scenery.tiles[sequence]; + + offsetX = tile->x_offset; + offsetY = tile->y_offset; + map_rotate_position(direction, &offsetX, &offsetY); + + *outX = x - offsetX; + *outY = y - offsetY; + *outZ = (z * 8) - tile->z_offset; + return true; +} + +/** + * + * rct2: 0x006B9B05 + */ +void sign_set_colour(int x, int y, int z, int direction, int sequence, uint8 mainColour, uint8 textColour) +{ + // RCT2_CALLPROC_X(0x006B9B05, x, direction << 8, y, z | (type << 8), 0, 0, 0); + + rct_map_element *mapElement; + rct_scenery_entry *sceneryEntry; + rct_large_scenery_tile *sceneryTiles, *tile; + int x0, y0, z0, offsetX, offsetY; + + // Get the given segment of the large scenery element + mapElement = map_get_large_scenery_segment(x, y, z, direction, sequence); + if (mapElement == NULL) + return; + + // Get the origin position of the large scenery element + sceneryEntry = g_largeSceneryEntries[(mapElement->properties.scenerymultiple.type) & 0x3FF]; + sceneryTiles = sceneryEntry->large_scenery.tiles; + tile = &sceneryTiles[sequence]; + offsetX = tile->x_offset; + offsetY = tile->y_offset; + map_rotate_position(direction, &offsetX, &offsetY); + x0 = x - offsetX; + y0 = y - offsetY; + z0 = (z * 8) - tile->z_offset; + + // Iterate through each tile of the large scenery element + sequence = 0; + for (tile = sceneryTiles; tile->x_offset != -1; tile++, sequence++) { + offsetX = tile->x_offset; + offsetY = tile->y_offset; + map_rotate_position(direction, &offsetX, &offsetY); + + x = x0 + offsetX; + y = y0 + offsetY; + z = (z0 + tile->z_offset) / 8; + mapElement = map_get_large_scenery_segment(x, y, z, direction, sequence); + if (mapElement != NULL) { + mapElement->properties.scenerymultiple.colour[0] &= 0xE0; + mapElement->properties.scenerymultiple.colour[1] &= 0xE0; + mapElement->properties.scenerymultiple.colour[0] |= mainColour; + mapElement->properties.scenerymultiple.colour[1] |= textColour; + + gfx_invalidate_viewport_tile(x, y, mapElement->base_height * 8 , mapElement->clearance_height * 8); + } + } +} diff --git a/src/world/map.h b/src/world/map.h index 7fbd9991e2..f3e6399f10 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -341,4 +341,6 @@ bool map_element_is_underground(rct_map_element *mapElement); void map_remove_out_of_range_elements(); void map_extend_boundary_surface(); +void sign_set_colour(int x, int y, int z, int direction, int sequence, uint8 mainColour, uint8 textColour); + #endif diff --git a/src/world/park.c b/src/world/park.c index cdb174e8a6..627c806e10 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -715,66 +715,61 @@ int park_get_entrance_index(int x, int y, int z) return -1; } +static void translate_3d_to_2d(int rotation, int *x, int *y) +{ + int rx, ry; + + switch (rotation & 3) { + case 0: + rx = (*y) - (*x); + ry = (*x) + (*y); + break; + case 1: + rx = -(*x) - (*y); + ry = (*y) - (*x); + break; + case 2: + rx = (*x) - (*y); + ry = -(*x) - (*y); + break; + case 3: + rx = (*x) + (*y); + ry = (*x) - (*y); + break; + } + ry /= 2; + + *x = rx; + *y = ry; +} + /** -* -* rct2: 0x006EC847 -*/ + * + * rct2: 0x006EC847 + */ void gfx_invalidate_viewport_tile(int x, int y, int z0, int z1) { int x1, y1, x2, y2; - int tempx; + rct_viewport *viewport; + x += 16; y += 16; - int rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); - switch (rotation) { - case 0: - tempx = x; - x = -x + y; - y += tempx; - break; - case 1: - x = -x; - tempx = x; - x -= y; - y += tempx; - break; - case 2: - tempx = x; - x -= y; - y = -y - tempx; - break; - case 3: - tempx = x; - x += y; - y = -y + tempx; - break; - } - y /= 2; - x2 = x; - y2 = y; + translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y); - x -= 32; - y -= 32; - y -= z0; - x2 += 32; - y2 += 32; - y2 += z1; + x1 = x - 32; + y1 = y - 32 - z1; + x2 = x + 32; + y2 = y + 32 - z0; - x1 = x; - y1 = y; - rct_viewport* viewport = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); + viewport = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); while (viewport->width != 0) { int viewport_x2 = viewport->view_x + viewport->view_width; int viewport_y2 = viewport->view_y + viewport->view_height; - if (x2 > viewport_x2 && y2 > viewport_y2) { - if (x1 < viewport->view_x) - x1 = viewport->view_x; - if (x2 > viewport_x2) - x2 = viewport_x2; - if (y1 < viewport->view_y) - y1 = viewport->view_y; - if (y2 > viewport_y2) - y2 = viewport_y2; + if (x2 > viewport->view_x && y2 > viewport->view_y) { + x1 = max(x1, viewport->view_x); + y1 = max(y1, viewport->view_y); + x2 = min(x2, viewport_x2); + y2 = min(y2, viewport_y2); uint8 zoom = 1 << viewport->zoom; x1 -= viewport->view_x; From e898e4dfc48029fbd03f314b31590c7bb1cf9864 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 6 Jul 2015 18:21:42 +0100 Subject: [PATCH 0205/1173] Fix track bugs. Fixed issue with ride demolishing where only the first tile of a ride would get demolished causing issues when the ride entries were removed. Fixed issue with rotation 3 track pieces where invalid memory would be accessed. Fixes #1506 Fixes #1556 --- src/ride/ride.c | 3 +-- src/ride/track.c | 2 +- src/windows/game_bottom_toolbar.c | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index c1a2538c99..e71054e92a 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4488,7 +4488,7 @@ int ride_get_refund_price(int ride_id) z, 0); map_element_iterator_restart_for_tile(&it); - break; + continue; } RCT2_GLOBAL(0x00F4413A, money32) += game_do_command( @@ -4527,7 +4527,6 @@ int ride_get_refund_price(int ride_id) z, 0); map_element_iterator_restart_for_tile(&it); - break; } RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = oldpaused; return RCT2_GLOBAL(0x00F4413A, int); diff --git a/src/ride/track.c b/src/ride/track.c index 9ed5663adb..7fab6efde5 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3562,7 +3562,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in offsetX = -trackBlock->y; offsetY = trackBlock->x; bl = rol8(bl, 3); - bh |= bl; + bh = bl; bh = ror8(bh, 4); bl &= 0x88; bh &= 0x77; diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index 51850976d5..8dedde93f4 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -544,7 +544,7 @@ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rc // Text stringId = 1926; - // memcpy((char*)language_get_string(1926), &newsItem->colour, 256); + // memcpy((char*)language_get_string(1926) + 1, &newsItem->colour, 256); memcpy((void*)0x009B5F2C, &newsItem->colour, 256); x = w->x + (middleOutsetWidget->left + middleOutsetWidget->right) / 2; y = w->y + middleOutsetWidget->top + 11; From 0def7c0883b0358368b154a64a44f3c41b6269d5 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 6 Jul 2015 18:57:36 +0100 Subject: [PATCH 0206/1173] refactor invalidation of map tiles and viewports --- src/drawing/drawing.c | 68 ---------------- src/drawing/drawing.h | 1 - src/interface/viewport.c | 34 +++++++- src/interface/viewport.h | 2 + src/peep/peep.c | 10 +-- src/ride/ride.c | 6 +- src/ride/station.c | 2 +- src/windows/sign.c | 2 +- src/world/map.c | 167 ++++++++++++++++++++++++-------------- src/world/map.h | 9 +- src/world/map_animation.c | 28 +++---- src/world/park.c | 87 ++------------------ src/world/park.h | 2 +- src/world/scenery.c | 6 +- 14 files changed, 180 insertions(+), 244 deletions(-) diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index 888b4e43cb..cb75ded2b0 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -178,74 +178,6 @@ void load_palette(){ platform_update_palette((char*)0x01424680, 10, 236); } -/** -* -* rct2: 0x006EC9CE -* @param x (ax) -* @param y (cx) -* @param base_height (di) -* @param clearance_height (si) -*/ -void gfx_invalidate_tile_if_zoomed(int x, int y, int base_height, int clearance_height) -{ - x += 16; - y += 16; - int left, top, right, bottom; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) { - case 0: - left = (-x + y) - 32; - right = (-x + y) + 32; - top = ((y + x) / 2) - 32 - clearance_height; - bottom = ((y + x) / 2) + 32 - base_height; - break; - case 1: - left = (-x - y) - 32; - right = (-x - y) + 32; - top = ((y - x) / 2) - 32 - clearance_height; - bottom = ((y - x) / 2) + 32 - base_height; - break; - case 2: - left = (x - y) - 32; - right = (x - y) + 32; - top = ((-y - x) / 2) - 32 - clearance_height; - bottom = ((-y - x) / 2) + 32 - base_height; - break; - case 3: - left = (x + y) - 32; - right = (x + y) + 32; - top = ((-y + x) / 2) - 32 - clearance_height; - bottom = ((-y + x) / 2) + 32 - base_height; - break; - } - for (rct_viewport** viewport_p = RCT2_ADDRESS(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); *viewport_p; ++viewport_p) - { - rct_viewport* viewport = *viewport_p; - if (viewport->zoom < 1) { - if (right > viewport->view_x && bottom > viewport->view_y && left < viewport->view_x + viewport->view_width) { - if (left < viewport->view_x) { - left = viewport->view_x; - } - if (right > viewport->view_x + viewport->view_width) { - right = viewport->view_x + viewport->view_width; - } - if (top < viewport->view_y + viewport->view_height) { - if (top < viewport->view_y) { - top = viewport->view_y; - } - if (bottom > viewport->view_y + viewport->view_height) { - bottom = viewport->view_y + viewport->view_height; - } - left = ((left - viewport->view_x) >> viewport->zoom) + viewport->x; - top = ((top - viewport->view_y) >> viewport->zoom) + viewport->y; - right = ((right - viewport->view_x) >> viewport->zoom) + viewport->x; - bottom = ((bottom - viewport->view_y) >> viewport->zoom) + viewport->y; - gfx_set_dirty_blocks(left, top, right, bottom); - } - } - } - } -} - /** * * rct2: 0x006ED7E5 diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 4e061cd5f8..a6269c8f01 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -83,7 +83,6 @@ rct_drawpixelinfo* clip_drawpixelinfo(rct_drawpixelinfo* dpi, int left, int widt void gfx_set_dirty_blocks(uint16 left, uint16 top, uint16 right, uint16 bottom); void gfx_draw_all_dirty_blocks(); void gfx_redraw_screen_rect(short left, short top, short right, short bottom); -void gfx_invalidate_tile_if_zoomed(int x, int y, int base_height, int clearance_height); void gfx_invalidate_screen(); // palette diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 71d6c5206a..c3bcf35d45 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -2471,4 +2471,36 @@ void get_map_coordinates_from_pos(int screenX, int screenY, int flags, sint16 *x if (x != NULL) *x = RCT2_GLOBAL(0x9AC14C, int16_t); if (y != NULL) *y = RCT2_GLOBAL(0x9AC14E, int16_t); if (mapElement != NULL) *mapElement = RCT2_GLOBAL(0x9AC150, rct_map_element*); -} \ No newline at end of file +} + +/** + * Left, top, right and bottom represent 2D map coordinates at zoom 0. + */ +void viewport_invalidate(rct_viewport *viewport, int left, int top, int right, int bottom) +{ + int viewportLeft = viewport->view_x; + int viewportTop = viewport->view_y; + int viewportRight = viewport->view_x + viewport->view_width; + int viewportBottom = viewport->view_y + viewport->view_height; + if (right > viewportLeft && bottom > viewportTop) { + left = max(left, viewportLeft); + top = max(top, viewportTop); + right = min(right, viewportRight); + bottom = min(bottom, viewportBottom); + + uint8 zoom = 1 << viewport->zoom; + left -= viewportLeft; + top -= viewportTop; + right -= viewportLeft; + bottom -= viewportTop; + left /= zoom; + top /= zoom; + right /= zoom; + bottom /= zoom; + left += viewport->x; + top += viewport->y; + right += viewport->x; + bottom += viewport->y; + gfx_set_dirty_blocks(left, top, right, bottom); + } +} diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 62cfa47c7f..6cbcd5b264 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -130,4 +130,6 @@ void sub_0x68615B(int ebp); void sub_688485(); void sub_688217(); +void viewport_invalidate(rct_viewport *viewport, int left, int top, int right, int bottom); + #endif diff --git a/src/peep/peep.c b/src/peep/peep.c index 1c55217281..7b1557767d 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -2777,7 +2777,7 @@ static void peep_update_mowing(rct_peep* peep){ if ((map_element->properties.surface.terrain & MAP_ELEMENT_SURFACE_TERRAIN_MASK) == (TERRAIN_GRASS << 5)){ map_element->properties.surface.grass_length = 0; - gfx_invalidate_tile_if_zoomed(peep->next_x, peep->next_y, map_element->base_height * 8, map_element->base_height * 8 + 16); + map_invalidate_tile_zoom0(peep->next_x, peep->next_y, map_element->base_height * 8, map_element->base_height * 8 + 16); } peep->staff_lawns_mown++; peep->var_45 |= (1 << 5); @@ -2827,7 +2827,7 @@ static void peep_update_watering(rct_peep* peep){ continue; map_element->properties.scenery.age = 0; - gfx_invalidate_tile_if_zoomed(x, y, map_element->base_height * 8, map_element->clearance_height * 8); + map_invalidate_tile_zoom0(x, y, map_element->base_height * 8, map_element->clearance_height * 8); peep->staff_gardens_watered++; peep->var_45 |= (1 << 4); } while (!map_element_is_last_for_tile(map_element++)); @@ -2897,7 +2897,7 @@ static void peep_update_emptying_bin(rct_peep* peep){ map_element->properties.path.addition_status |= ((3 << peep->var_37) << peep->var_37); - gfx_invalidate_tile_if_zoomed(peep->next_x, peep->next_y, map_element->base_height * 8, map_element->clearance_height * 8); + map_invalidate_tile_zoom0(peep->next_x, peep->next_y, map_element->base_height * 8, map_element->clearance_height * 8); peep->staff_bins_emptied++; peep->var_45 |= (1 << 4); @@ -3316,7 +3316,7 @@ static void peep_update_walking_break_scenery(rct_peep* peep){ map_element->flags |= MAP_ELEMENT_FLAG_BROKEN; - map_invalidate_tile( + map_invalidate_tile_zoom1( peep->next_x, peep->next_y, (map_element->base_height << 3) + 32, @@ -3541,7 +3541,7 @@ static void peep_update_using_bin(rct_peep* peep){ // Then placeing the new value. map_element->properties.path.addition_status |= rubbish_in_bin << selected_bin; - gfx_invalidate_tile_if_zoomed(peep->next_x, peep->next_y, map_element->base_height << 3, map_element->clearance_height << 3); + map_invalidate_tile_zoom0(peep->next_x, peep->next_y, map_element->base_height << 3, map_element->clearance_height << 3); peep_state_reset(peep); } } diff --git a/src/ride/ride.c b/src/ride/ride.c index c1a2538c99..67fcaee246 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1756,12 +1756,12 @@ static void ride_chairlift_update(rct_ride *ride) x = (ride->var_13A & 0xFF) * 32; y = (ride->var_13A >> 8) * 32; z = ride->var_13E * 8; - map_invalidate_tile(x, y, z, z + (4 * 8)); + map_invalidate_tile_zoom1(x, y, z, z + (4 * 8)); x = (ride->var_13C & 0xFF) * 32; y = (ride->var_13C >> 8) * 32; z = ride->var_13F * 8; - map_invalidate_tile(x, y, z, z + (4 * 8)); + map_invalidate_tile_zoom1(x, y, z, z + (4 * 8)); } /** @@ -1837,7 +1837,7 @@ static void ride_spiral_slide_update(rct_ride *ride) x += RCT2_GLOBAL(0x0098DDB8 + (rotation * 4), sint16); y += RCT2_GLOBAL(0x0098DDBA + (rotation * 4), sint16); - gfx_invalidate_tile_if_zoomed(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); + map_invalidate_tile_zoom0(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); } } diff --git a/src/ride/station.c b/src/ride/station.c index c982a44757..9dffe1680a 100644 --- a/src/ride/station.c +++ b/src/ride/station.c @@ -300,7 +300,7 @@ static void ride_invalidate_station_start(rct_ride *ride, int stationIndex, int mapElement->properties.track.sequence |= 0x80; // Invalidate map tile - map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); + map_invalidate_tile_zoom1(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); } rct_map_element *ride_get_station_start_track_element(rct_ride *ride, int stationIndex) diff --git a/src/windows/sign.c b/src/windows/sign.c index 1c92097184..7c9cc5ed9e 100644 --- a/src/windows/sign.c +++ b/src/windows/sign.c @@ -623,7 +623,7 @@ static void window_sign_small_dropdown() ((w->var_492 & 0x7) << 5); map_element->flags |= ((w->var_492 & 0x18) << 2); - gfx_invalidate_viewport_tile(x, y, map_element->base_height * 8, map_element->clearance_height * 8); + map_invalidate_tile(x, y, map_element->base_height * 8, map_element->clearance_height * 8); window_invalidate(w); } diff --git a/src/world/map.c b/src/world/map.c index 826df6347e..381a568992 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -66,9 +66,11 @@ static void map_update_grass_length(int x, int y, rct_map_element *mapElement); static void map_set_grass_length(int x, int y, rct_map_element *mapElement, int length); static void sub_68AE2A(int x, int y); -void rotate_map_coordinates(sint16* x, sint16* y, int rotation){ +void rotate_map_coordinates(sint16 *x, sint16 *y, int rotation) +{ int temp; - switch (rotation){ + + switch (rotation) { case MAP_ELEMENT_DIRECTION_WEST: break; case MAP_ELEMENT_DIRECTION_NORTH: @@ -660,16 +662,6 @@ int map_is_location_in_park(int x, int y) return 0; } -/** - * - * rct2: 0x006ECB60 - * NOTE: x, y and z are in pixels, not tile units - */ -void map_invalidate_tile(int x, int y, int zLow, int zHigh) -{ - RCT2_CALLPROC_X(0x006ECB60, x, 0, y, 0, zHigh, zLow, 0); -} - /** * * rct2: 0x006E0E01 @@ -897,7 +889,7 @@ void game_command_remove_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi uint8 bannerType = banner->type; if (*ebx & GAME_COMMAND_FLAG_APPLY) { map_element_remove_banner_entry(map_element); - map_invalidate_tile(x, y, z, z + 32); + map_invalidate_tile_zoom1(x, y, z, z + 32); map_element_remove(map_element); } rct_scenery_entry *scenery_entry = (rct_scenery_entry*)object_entry_groups[OBJECT_TYPE_BANNERS].chunks[bannerType]; @@ -1003,7 +995,7 @@ void game_command_set_fence_colour(int* eax, int* ebx, int* ecx, int* edx, int* if(scenery_entry->wall.flags & 0x80){ map_element->properties.fence.item[0] = color3; } - map_invalidate_tile(x, y, z, z + 0x48); + map_invalidate_tile_zoom1(x, y, z, z + 0x48); } *ebx = 0; } else { @@ -1167,7 +1159,7 @@ void game_command_set_banner_colour(int* eax, int* ebx, int* ecx, int* edx, int* window_invalidate(window); } gBanners[map_element->properties.banner.index].colour = color; - map_invalidate_tile(x, y, z, z + 32); + map_invalidate_tile_zoom1(x, y, z, z + 32); } *ebx = 0; @@ -1953,7 +1945,7 @@ void game_command_remove_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, } map_element_remove_banner_entry(map_element); - map_invalidate_tile(x, y, map_element->base_height * 8, (map_element->base_height * 8) + 72); + map_invalidate_tile_zoom1(x, y, map_element->base_height * 8, (map_element->base_height * 8) + 72); map_element_remove(map_element); *ebx = 0; } @@ -2478,7 +2470,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, } RCT2_GLOBAL(0x00F64EBC, rct_map_element*) = map_element; - map_invalidate_tile(position.x, position.y, map_element->base_height * 8, map_element->base_height * 8 + 72); + map_invalidate_tile_zoom1(position.x, position.y, map_element->base_height * 8, map_element->base_height * 8 + 72); } if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY){ @@ -2706,15 +2698,6 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in *ebx = MONEY32_UNDEFINED; } -/** - * - * rct2: 0x006EC6D7 - */ -void map_invalidate_tile_full(int x, int y) -{ - RCT2_CALLPROC_X(0x006EC6D7, x, 0, y, 0, 0, 0, 0); -} - int map_get_station(rct_map_element *mapElement) { return (mapElement->properties.track.sequence & 0x70) >> 4; @@ -2975,7 +2958,7 @@ void map_remove_intersecting_walls(int x, int y, int z0, int z1, int direction) continue; map_element_remove_banner_entry(mapElement); - map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->base_height * 8 + 72); + map_invalidate_tile_zoom1(x, y, mapElement->base_height * 8, mapElement->base_height * 8 + 72); map_element_remove(mapElement); mapElement--; } while (!map_element_is_last_for_tile(mapElement++)); @@ -3084,7 +3067,7 @@ static void map_set_grass_length(int x, int y, rct_map_element *mapElement, int mapElement->properties.surface.grass_length = length; z0 = mapElement->base_height * 8; z1 = z0 + 16; - gfx_invalidate_viewport_tile(x, y, z0, z1); + map_invalidate_tile(x, y, z0, z1); } void sub_6A7594() @@ -3334,32 +3317,6 @@ bool map_element_is_underground(rct_map_element *mapElement) return true; } -void map_rotate_position(int direction, int *x, int *y) -{ - int offsetX, offsetY; - - switch (direction) { - case 0: - offsetX = (*x); - offsetY = (*y); - break; - case 1: - offsetX = (*y); - offsetY = -(*x); - break; - case 2: - offsetX = -(*x); - offsetY = -(*y); - break; - case 3: - offsetX = -(*y); - offsetY = (*x); - break; - } - *x = offsetX; - *y = offsetY; -} - rct_map_element *map_get_large_scenery_segment(int x, int y, int z, int direction, int sequence) { rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); @@ -3385,7 +3342,7 @@ bool map_large_scenery_get_origin( rct_map_element *mapElement; rct_scenery_entry *sceneryEntry; rct_large_scenery_tile *tile; - int offsetX, offsetY; + sint16 offsetX, offsetY; mapElement = map_get_large_scenery_segment(x, y, z, direction, sequence); if (mapElement == NULL) @@ -3396,7 +3353,7 @@ bool map_large_scenery_get_origin( offsetX = tile->x_offset; offsetY = tile->y_offset; - map_rotate_position(direction, &offsetX, &offsetY); + rotate_map_coordinates(&offsetX, &offsetY, direction); *outX = x - offsetX; *outY = y - offsetY; @@ -3410,12 +3367,11 @@ bool map_large_scenery_get_origin( */ void sign_set_colour(int x, int y, int z, int direction, int sequence, uint8 mainColour, uint8 textColour) { - // RCT2_CALLPROC_X(0x006B9B05, x, direction << 8, y, z | (type << 8), 0, 0, 0); - rct_map_element *mapElement; rct_scenery_entry *sceneryEntry; rct_large_scenery_tile *sceneryTiles, *tile; - int x0, y0, z0, offsetX, offsetY; + sint16 offsetX, offsetY; + int x0, y0, z0; // Get the given segment of the large scenery element mapElement = map_get_large_scenery_segment(x, y, z, direction, sequence); @@ -3428,7 +3384,7 @@ void sign_set_colour(int x, int y, int z, int direction, int sequence, uint8 mai tile = &sceneryTiles[sequence]; offsetX = tile->x_offset; offsetY = tile->y_offset; - map_rotate_position(direction, &offsetX, &offsetY); + rotate_map_coordinates(&offsetX, &offsetY, direction); x0 = x - offsetX; y0 = y - offsetY; z0 = (z * 8) - tile->z_offset; @@ -3438,7 +3394,7 @@ void sign_set_colour(int x, int y, int z, int direction, int sequence, uint8 mai for (tile = sceneryTiles; tile->x_offset != -1; tile++, sequence++) { offsetX = tile->x_offset; offsetY = tile->y_offset; - map_rotate_position(direction, &offsetX, &offsetY); + rotate_map_coordinates(&offsetX, &offsetY, direction); x = x0 + offsetX; y = y0 + offsetY; @@ -3450,7 +3406,94 @@ void sign_set_colour(int x, int y, int z, int direction, int sequence, uint8 mai mapElement->properties.scenerymultiple.colour[0] |= mainColour; mapElement->properties.scenerymultiple.colour[1] |= textColour; - gfx_invalidate_viewport_tile(x, y, mapElement->base_height * 8 , mapElement->clearance_height * 8); + map_invalidate_tile(x, y, mapElement->base_height * 8 , mapElement->clearance_height * 8); } } } + +static void translate_3d_to_2d(int rotation, int *x, int *y) +{ + int rx, ry; + + switch (rotation & 3) { + case 0: + rx = (*y) - (*x); + ry = (*x) + (*y); + break; + case 1: + rx = -(*x) - (*y); + ry = (*y) - (*x); + break; + case 2: + rx = (*x) - (*y); + ry = -(*x) - (*y); + break; + case 3: + rx = (*x) + (*y); + ry = (*x) - (*y); + break; + } + ry /= 2; + + *x = rx; + *y = ry; +} + +void map_invalidate_tile_under_zoom(int x, int y, int z0, int z1, int maxZoom) +{ + int x1, y1, x2, y2; + rct_viewport *viewport; + + x += 16; + y += 16; + translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y); + + x1 = x - 32; + y1 = y - 32 - z1; + x2 = x + 32; + y2 = y + 32 - z0; + + viewport = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); + while (viewport->width != 0) { + if (maxZoom == -1 || viewport->zoom <= maxZoom) { + viewport_invalidate(viewport, x1, y1, x2, y2); + } + viewport++; + } +} + +/** + * + * rct2: 0x006EC847 + */ +void map_invalidate_tile(int x, int y, int z0, int z1) +{ + map_invalidate_tile_under_zoom(x, y, z0, z1, -1); +} + +/** + * + * rct2: 0x006ECB60 + */ +void map_invalidate_tile_zoom1(int x, int y, int z0, int z1) +{ + map_invalidate_tile_under_zoom(x, y, z0, z1, 1); +} + +/** + * + * rct2: 0x006EC9CE + */ +void map_invalidate_tile_zoom0(int x, int y, int z0, int z1) +{ + map_invalidate_tile_under_zoom(x, y, z0, z1, 0); +} + +/** + * + * rct2: 0x006EC6D7 + */ +void map_invalidate_tile_full(int x, int y) +{ + map_invalidate_tile(x, y, 0, 2080); +} diff --git a/src/world/map.h b/src/world/map.h index f3e6399f10..ae2477c493 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -276,8 +276,6 @@ int map_coord_is_connected(int x, int y, int z, uint8 faceDirection); void sub_6A876D(); int map_is_location_owned(int x, int y, int z); int map_is_location_in_park(int x, int y); -void map_invalidate_tile(int x, int y, int zLow, int zHigh); -void map_invalidate_tile_full(int x, int y); int map_get_station(rct_map_element *mapElement); void map_element_remove(rct_map_element *mapElement); void sub_6A6AA7(int x, int y, rct_map_element *mapElement); @@ -289,7 +287,7 @@ int sub_68B044(); rct_map_element *map_element_insert(int x, int y, int z, int flags); int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *clearFunc, uint8 bl); int map_can_construct_at(int x, int y, int zLow, int zHigh, uint8 bl); -void rotate_map_coordinates(sint16* x, sint16* y, int rotation); +void rotate_map_coordinates(sint16 *x, sint16 *y, int rotation); rct_xy16 coordinate_3d_to_2d(const rct_xyz16* coordinate_3d, int rotation); money32 map_clear_scenery(int x0, int y0, int x1, int y1, int flags); money32 lower_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags); @@ -343,4 +341,9 @@ void map_extend_boundary_surface(); void sign_set_colour(int x, int y, int z, int direction, int sequence, uint8 mainColour, uint8 textColour); +void map_invalidate_tile(int x, int y, int z0, int z1); +void map_invalidate_tile_zoom1(int x, int y, int z0, int z1); +void map_invalidate_tile_zoom0(int x, int y, int z0, int z1); +void map_invalidate_tile_full(int x, int y); + #endif diff --git a/src/world/map_animation.c b/src/world/map_animation.c index 62f879448d..e612e07ed8 100644 --- a/src/world/map_animation.c +++ b/src/world/map_animation.c @@ -124,7 +124,7 @@ static bool map_animation_invalidate_ride_entrance(int x, int y, int baseZ) entranceDefinition = &RideEntranceDefinitions[ride->entrance_style]; int height = (mapElement->base_height * 8) + entranceDefinition->height + 8; - map_invalidate_tile(x, y, height, height + 16); + map_invalidate_tile_zoom1(x, y, height, height + 16); return false; } while (!map_element_is_last_for_tile(mapElement++)); @@ -153,7 +153,7 @@ static bool map_animation_invalidate_queue_banner(int x, int y, int baseZ) int direction = ((mapElement->type >> 6) + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) & 3; if (direction == MAP_ELEMENT_DIRECTION_NORTH || direction == MAP_ELEMENT_DIRECTION_EAST) { baseZ = mapElement->base_height * 8; - map_invalidate_tile(x, y, baseZ + 16, baseZ + 30); + map_invalidate_tile_zoom1(x, y, baseZ + 16, baseZ + 30); } return false; } while (!map_element_is_last_for_tile(mapElement++)); @@ -183,7 +183,7 @@ static bool map_animation_invalidate_small_scenery(int x, int y, int baseZ) sceneryEntry = g_smallSceneryEntries[mapElement->properties.scenery.type]; if (sceneryEntry->small_scenery.flags & 0xD800) { - map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); + map_invalidate_tile_zoom1(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); return false; } @@ -216,7 +216,7 @@ static bool map_animation_invalidate_small_scenery(int x, int y, int baseZ) break; } } - map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); + map_invalidate_tile_zoom1(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); return false; } } while (!map_element_is_last_for_tile(mapElement++)); @@ -243,7 +243,7 @@ static bool map_animation_invalidate_park_entrance(int x, int y, int baseZ) continue; baseZ = mapElement->base_height * 8; - map_invalidate_tile(x, y, baseZ + 32, baseZ + 64); + map_invalidate_tile_zoom1(x, y, baseZ + 32, baseZ + 64); return false; } while (!map_element_is_last_for_tile(mapElement++)); @@ -267,7 +267,7 @@ static bool map_animation_invalidate_track_waterfall(int x, int y, int baseZ) if (mapElement->properties.track.type == TRACK_ELEM_WATERFALL) { int z = mapElement->base_height * 8; - map_invalidate_tile(x, y, z + 14, z + 46); + map_invalidate_tile_zoom1(x, y, z + 14, z + 46); return false; } } while (!map_element_is_last_for_tile(mapElement++)); @@ -292,7 +292,7 @@ static bool map_animation_invalidate_track_rapids(int x, int y, int baseZ) if (mapElement->properties.track.type == TRACK_ELEM_RAPIDS) { int z = mapElement->base_height * 8; - map_invalidate_tile(x, y, z + 14, z + 18); + map_invalidate_tile_zoom1(x, y, z + 14, z + 18); return false; } } while (!map_element_is_last_for_tile(mapElement++)); @@ -318,7 +318,7 @@ static bool map_animation_invalidate_track_onridephoto(int x, int y, int baseZ) if (mapElement->properties.track.type == TRACK_ELEM_ON_RIDE_PHOTO) { int z = mapElement->base_height * 8; - map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); + map_invalidate_tile_zoom1(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); if (mapElement->properties.track.sequence & 0xF0) { mapElement->properties.track.sequence -= 0x10; return false; @@ -348,7 +348,7 @@ static bool map_animation_invalidate_track_whirlpool(int x, int y, int baseZ) if (mapElement->properties.track.type == TRACK_ELEM_WHIRLPOOL) { int z = mapElement->base_height * 8; - map_invalidate_tile(x, y, z + 14, z + 18); + map_invalidate_tile_zoom1(x, y, z + 14, z + 18); return false; } } while (!map_element_is_last_for_tile(mapElement++)); @@ -373,7 +373,7 @@ static bool map_animation_invalidate_track_spinningtunnel(int x, int y, int base if (mapElement->properties.track.type == TRACK_ELEM_SPINNING_TUNNEL) { int z = mapElement->base_height * 8; - map_invalidate_tile(x, y, z + 14, z + 32); + map_invalidate_tile_zoom1(x, y, z + 14, z + 32); return false; } } while (!map_element_is_last_for_tile(mapElement++)); @@ -406,7 +406,7 @@ static bool map_animation_invalidate_banner(int x, int y, int baseZ) continue; baseZ = mapElement->base_height * 8; - map_invalidate_tile(x, y, baseZ, baseZ + 16); + map_invalidate_tile_zoom1(x, y, baseZ, baseZ + 16); return false; } while (!map_element_is_last_for_tile(mapElement++)); @@ -433,7 +433,7 @@ static bool map_animation_invalidate_large_scenery(int x, int y, int baseZ) sceneryEntry = g_largeSceneryEntries[mapElement->properties.scenery.type & 0x3FF]; if (sceneryEntry->large_scenery.flags & (1 << 3)) { int z = mapElement->base_height * 8; - map_invalidate_tile(x, y, z, z + 16); + map_invalidate_tile_zoom1(x, y, z, z + 16); wasInvalidated = true; } } while (!map_element_is_last_for_tile(mapElement++)); @@ -488,7 +488,7 @@ static bool map_animation_invalidate_wall_unknown(int x, int y, int baseZ) mapElement->properties.fence.item[2] = bl; if (di & 1) { int z = mapElement->base_height * 8; - map_invalidate_tile(x, y, z, z + 32); + map_invalidate_tile_zoom1(x, y, z, z + 32); } if (di & 2) wasInvalidated = true; @@ -519,7 +519,7 @@ static bool map_animation_invalidate_wall(int x, int y, int baseZ) continue; int z = mapElement->base_height * 8; - map_invalidate_tile(x, y, z, z + 16); + map_invalidate_tile_zoom1(x, y, z, z + 16); wasInvalidated = true; } while (!map_element_is_last_for_tile(mapElement++)); diff --git a/src/world/park.c b/src/world/park.c index 627c806e10..2cb4a1e96d 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -715,81 +715,6 @@ int park_get_entrance_index(int x, int y, int z) return -1; } -static void translate_3d_to_2d(int rotation, int *x, int *y) -{ - int rx, ry; - - switch (rotation & 3) { - case 0: - rx = (*y) - (*x); - ry = (*x) + (*y); - break; - case 1: - rx = -(*x) - (*y); - ry = (*y) - (*x); - break; - case 2: - rx = (*x) - (*y); - ry = -(*x) - (*y); - break; - case 3: - rx = (*x) + (*y); - ry = (*x) - (*y); - break; - } - ry /= 2; - - *x = rx; - *y = ry; -} - -/** - * - * rct2: 0x006EC847 - */ -void gfx_invalidate_viewport_tile(int x, int y, int z0, int z1) -{ - int x1, y1, x2, y2; - rct_viewport *viewport; - - x += 16; - y += 16; - translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y); - - x1 = x - 32; - y1 = y - 32 - z1; - x2 = x + 32; - y2 = y + 32 - z0; - - viewport = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); - while (viewport->width != 0) { - int viewport_x2 = viewport->view_x + viewport->view_width; - int viewport_y2 = viewport->view_y + viewport->view_height; - if (x2 > viewport->view_x && y2 > viewport->view_y) { - x1 = max(x1, viewport->view_x); - y1 = max(y1, viewport->view_y); - x2 = min(x2, viewport_x2); - y2 = min(y2, viewport_y2); - - uint8 zoom = 1 << viewport->zoom; - x1 -= viewport->view_x; - y1 -= viewport->view_y; - x2 -= viewport->view_x; - y2 -= viewport->view_y; - x1 /= zoom; - y1 /= zoom; - x2 /= zoom; - y2 /= zoom; - x1 += viewport->x; - y1 += viewport->y; - x2 += viewport->x; - y2 += viewport->y; - gfx_set_dirty_blocks(x1, y1, x2, y2); - } - viewport++; - } -} - /** * * rct2: 0x00664D05 @@ -850,7 +775,7 @@ void update_park_fences(int x, int y) if (sufaceElement->properties.surface.ownership != newOwnership) { int z0 = sufaceElement->base_height * 8; int z1 = z0 + 16; - gfx_invalidate_viewport_tile(x, y, z0, z1); + map_invalidate_tile(x, y, z0, z1); sufaceElement->properties.surface.ownership = newOwnership; } } @@ -868,7 +793,7 @@ void park_remove_entrance_segment(int x, int y, int z) if (mapElement->properties.entrance.type != ENTRANCE_TYPE_PARK_ENTRANCE) continue; - gfx_invalidate_viewport_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); + map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); map_element_remove(mapElement); update_park_fences(x, y); } while (!map_element_is_last_for_tile(mapElement++)); @@ -1057,7 +982,7 @@ int map_buy_land_rights_for_tile(int x, int y, int setting, int flags) { TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership |= OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED; uint16 baseHeight = TILE_MAP_ELEMENT_POINTER(tile_idx)->base_height; baseHeight *= 8; - gfx_invalidate_viewport_tile(x, y, baseHeight, baseHeight + 16); + map_invalidate_tile(x, y, baseHeight, baseHeight + 16); } cost = RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCTION_RIGHTS_COST, uint16); return cost; @@ -1068,7 +993,7 @@ int map_buy_land_rights_for_tile(int x, int y, int setting, int flags) { TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership &= 0xEF; uint16 baseHeight = TILE_MAP_ELEMENT_POINTER(tile_idx)->base_height; baseHeight *= 8; - gfx_invalidate_viewport_tile(x, y, baseHeight, baseHeight + 16); + map_invalidate_tile(x, y, baseHeight, baseHeight + 16); } cost = 0; break; @@ -1078,7 +1003,7 @@ int map_buy_land_rights_for_tile(int x, int y, int setting, int flags) { TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership |= OWNERSHIP_AVAILABLE; uint16 baseHeight = TILE_MAP_ELEMENT_POINTER(tile_idx)->base_height; baseHeight *= 8; - gfx_invalidate_viewport_tile(x, y, baseHeight, baseHeight + 16); + map_invalidate_tile(x, y, baseHeight, baseHeight + 16); } cost = 0; break; @@ -1087,7 +1012,7 @@ int map_buy_land_rights_for_tile(int x, int y, int setting, int flags) { TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership |= OWNERSHIP_CONSTRUCTION_RIGHTS_AVAILABLE; uint16 baseHeight = TILE_MAP_ELEMENT_POINTER(tile_idx)->base_height; baseHeight *= 8; - gfx_invalidate_viewport_tile(x, y, baseHeight, baseHeight + 16); + map_invalidate_tile(x, y, baseHeight, baseHeight + 16); } cost = 0; break; diff --git a/src/world/park.h b/src/world/park.h index 855454434c..f50cd9dd93 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -80,7 +80,7 @@ void game_command_remove_park_entrance(int *eax, int *ebx, int *ecx, int *edx, i void game_command_set_park_name(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_buy_land_rights(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); -void gfx_invalidate_viewport_tile(int x, int y, int z0, int z1); +void map_invalidate_tile(int x, int y, int z0, int z1); void park_remove_ghost_entrance(); money32 park_place_ghost_entrance(int x, int y, int z, int direction); diff --git a/src/world/scenery.c b/src/world/scenery.c index 3a05927927..cbf9bf3ca3 100644 --- a/src/world/scenery.c +++ b/src/world/scenery.c @@ -82,7 +82,7 @@ void scenery_update_age(int x, int y, rct_map_element *mapElement) case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: case MAP_ELEMENT_TYPE_ENTRANCE: case MAP_ELEMENT_TYPE_PATH: - map_invalidate_tile(x, y, mapElementAbove->base_height * 8, mapElementAbove->clearance_height * 8); + map_invalidate_tile_zoom1(x, y, mapElementAbove->base_height * 8, mapElementAbove->clearance_height * 8); scenery_increase_age(x, y, mapElement); return; case MAP_ELEMENT_TYPE_SCENERY: @@ -97,7 +97,7 @@ void scenery_update_age(int x, int y, rct_map_element *mapElement) // Reset age / water plant mapElement->properties.scenery.age = 0; - map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); + map_invalidate_tile_zoom1(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); } void scenery_increase_age(int x, int y, rct_map_element *mapElement) @@ -107,7 +107,7 @@ void scenery_increase_age(int x, int y, rct_map_element *mapElement) if (mapElement->properties.scenery.age < 255) { mapElement->properties.scenery.age++; - map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); + map_invalidate_tile_zoom1(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); } } From 181a2e6209ca16ca9adc57370e422ee0969ffe48 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 6 Jul 2015 20:29:36 +0100 Subject: [PATCH 0207/1173] implement map_remove_walls_at --- src/ride/track.c | 2 +- src/world/map.c | 78 +++++++++++++++++++++++++++++++++++++----------- src/world/map.h | 2 ++ 3 files changed, 63 insertions(+), 19 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index 7fab6efde5..5eb672de77 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3623,7 +3623,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in footpath_remove_litter(x, y, z); // push bl bh?? if (rideTypeFlags & RIDE_TYPE_FLAG_18) { - RCT2_CALLPROC_X(0x006E588E, x, (clearanceZ - baseZ) * 8, y, cur_z, 0, 0, 0); + map_remove_walls_at(x, y, baseZ * 8, clearanceZ * 8); } else { uint8 _bl = *RCT2_GLOBAL(0x00F44054, uint8*); diff --git a/src/world/map.c b/src/world/map.c index 381a568992..48c79603c8 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1868,7 +1868,7 @@ void game_command_set_water_height(int* eax, int* ebx, int* ecx, int* edx, int* if(*ebx & GAME_COMMAND_FLAG_APPLY){ int element_height = map_element_height(x, y); footpath_remove_litter(x, y, element_height); - RCT2_CALLPROC_X(0x006E57E6, x, 0, y, element_height, 0, 0, 0); + map_remove_walls_at_z(x, y, element_height); } rct_map_element* map_element = map_get_surface_element_at(x / 32, y / 32); @@ -2099,7 +2099,7 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi if(*ebx & GAME_COMMAND_FLAG_APPLY && !(*ebx & 0x40)){ footpath_remove_litter(x, y, F64EC8); if(scenery_entry->small_scenery.flags & SMALL_SCENERY_FLAG19){ - RCT2_CALLPROC_X(0x006E588E, x, scenery_entry->small_scenery.height, y, F64EC8, 0, 0, 0); + map_remove_walls_at(x, y, F64EC8, F64EC8 + scenery_entry->small_scenery.height); } } rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); @@ -2225,9 +2225,26 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi } /** -* -* rct2: 0x006E519A -*/ + * + * rct2: 0x006E5C1A + */ +bool sub_6E5C1A(rct_scenery_entry *wall, int x, int y, int edge, int dl, int dh) +{ + return !(RCT2_CALLPROC_X(0x006E5C1A, + x, + edge, + y, + dl | (dh << 8), + 0, + (int)wall, + 0 + ) & 0x100); +} + +/** + * + * rct2: 0x006E519A + */ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp){ rct_xyz16 position = { .x = *eax & 0xFFFF, @@ -2418,17 +2435,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, RCT2_GLOBAL(0x00141F722, uint8) += fence->wall.height; if (!(flags & (1 << 7))){ - if ( - RCT2_CALLPROC_X(0x006E5C1A, - position.x, - edge, - position.y, - RCT2_GLOBAL(0x00141F721, uint8) | (RCT2_GLOBAL(0x00141F722, uint8) << 8), - 0, - (int)fence, - 0 - ) & 0x100 - ) { + if (!sub_6E5C1A(fence, position.x, position.y, edge, RCT2_GLOBAL(0x00141F721, uint8), RCT2_GLOBAL(0x00141F722, uint8))) { *ebx = MONEY32_UNDEFINED; return; } @@ -2635,8 +2642,7 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in if(*ebx & GAME_COMMAND_FLAG_APPLY){ if(!(*ebx & 0x40)){ footpath_remove_litter(x2, y2, zLow * 8); - int bh = (zHigh - zLow) * 8; - RCT2_CALLPROC_X(0x006E588E, x2, bh << 8 | flags, y2, zLow * 8, 0, 0, 0); + map_remove_walls_at(x2, y2, zLow * 8, zHigh * 8); } rct_map_element *new_map_element = map_element_insert(x2 / 32, y2 / 32, zLow, F43887); map_animation_create(0xB, x2, y2, zLow); @@ -3411,6 +3417,42 @@ void sign_set_colour(int x, int y, int z, int direction, int sequence, uint8 mai } } +/** + * + * rct2: 0x006E588E + */ +void map_remove_walls_at(int x, int y, int z0, int z1) +{ + rct_map_element *mapElement; + + z0 /= 8; + z1 /= 8; +repeat: + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_FENCE) + continue; + if (z0 >= mapElement->clearance_height) + continue; + if (z1 <= mapElement->base_height) + continue; + + map_element_remove_banner_entry(mapElement); + map_invalidate_tile_zoom1(x, y, mapElement->base_height, mapElement->base_height + 72); + map_element_remove(mapElement); + goto repeat; + } while (!map_element_is_last_for_tile(mapElement++)); +} + +/** + * + * rct2: 0x006E57E6 + */ +void map_remove_walls_at_z(int x, int y, int z) +{ + map_remove_walls_at(x, y, z, z + 48); +} + static void translate_3d_to_2d(int rotation, int *x, int *y) { int rx, ry; diff --git a/src/world/map.h b/src/world/map.h index ae2477c493..8a1f2cb5de 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -340,6 +340,8 @@ void map_remove_out_of_range_elements(); void map_extend_boundary_surface(); void sign_set_colour(int x, int y, int z, int direction, int sequence, uint8 mainColour, uint8 textColour); +void map_remove_walls_at(int x, int y, int z0, int z1); +void map_remove_walls_at_z(int x, int y, int z); void map_invalidate_tile(int x, int y, int z0, int z1); void map_invalidate_tile_zoom1(int x, int y, int z0, int z1); From bcd80b3db84a473bbe214ea5989f8e8441cbe95b Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 6 Jul 2015 21:09:01 +0100 Subject: [PATCH 0208/1173] Fix issue with tracks on uneven ground. Fixes #1525 --- src/windows/ride_construction.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 39bf04df6f..292c96bfe0 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -3446,6 +3446,7 @@ static void ride_construction_tooldown_construct(int screenX, int screenY) if (RCT2_GLOBAL(0x00F44074, money32) == MONEY32_UNDEFINED) { rct_string_id errorText = RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id); + z -= 8; if ( errorText == STR_NOT_ENOUGH_CASH_REQUIRES || errorText == STR_CAN_ONLY_BUILD_THIS_UNDERWATER || @@ -3453,7 +3454,7 @@ static void ride_construction_tooldown_construct(int screenX, int screenY) errorText == STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND || errorText == STR_TOO_HIGH_FOR_SUPPORTS || zAttempts == 0 || - z - 8 < 0 + z < 0 ) { int saveTrackDirection = _currentTrackPieceDirection; int saveCurrentTrackCurve = _currentTrackCurve; From f859eefc4b8b0a7e2b5f1b2dfea1b4f513e5a788 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 6 Jul 2015 22:12:45 +0100 Subject: [PATCH 0209/1173] implement footpath_remove_edges_at --- src/rct1.c | 5 +- src/ride/track.c | 4 +- src/world/footpath.c | 145 ++++++++++++++++++++++++++++++++++++++++++- src/world/footpath.h | 1 + src/world/map.c | 13 +--- src/world/map.h | 1 - 6 files changed, 149 insertions(+), 20 deletions(-) diff --git a/src/rct1.c b/src/rct1.c index 349b2d0768..b3da57080c 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -31,6 +31,7 @@ #include "util/sawyercoding.h" #include "util/util.h" #include "world/climate.h" +#include "world/footpath.h" #include "world/map.h" #include "world/scenery.h" @@ -309,7 +310,7 @@ static void rct1_remove_rides() case MAP_ELEMENT_TYPE_TRACK: sub_6A7594(); - sub_6A6AA7(it.x * 32, it.y * 32, it.element); + footpath_remove_edges_at(it.x * 32, it.y * 32, it.element); map_element_remove(it.element); map_element_iterator_restart_for_tile(&it); break; @@ -317,7 +318,7 @@ static void rct1_remove_rides() case MAP_ELEMENT_TYPE_ENTRANCE: if (it.element->properties.entrance.type != ENTRANCE_TYPE_PARK_ENTRANCE) { sub_6A7594(); - sub_6A6AA7(it.x * 32, it.y * 32, it.element); + footpath_remove_edges_at(it.x * 32, it.y * 32, it.element); map_element_remove(it.element); map_element_iterator_restart_for_tile(&it); } diff --git a/src/ride/track.c b/src/ride/track.c index 5eb672de77..273e534b8f 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1285,7 +1285,7 @@ int track_place_scenery(rct_track_scenery* scenery_start, uint8 rideIndex, int o continue; sub_6A7594(); - sub_6A6AA7(mapCoord.x, mapCoord.y, map_element); + footpath_remove_edges_at(mapCoord.x, mapCoord.y, map_element); bl = 1; if (RCT2_GLOBAL(0x00F440D4, uint8) == 5)bl = 41; @@ -4120,7 +4120,7 @@ money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, sub_6B59C6(rideIndex); sub_6A7594(); - sub_6A6AA7(x, y, mapElement); + footpath_remove_edges_at(x, y, mapElement); map_element_remove(mapElement); sub_6CB945(rideIndex); if (!(flags & (1 << 6))){ diff --git a/src/world/footpath.c b/src/world/footpath.c index a57491cfe2..9d81683fa3 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -175,7 +175,7 @@ static money32 footpath_element_insert(int type, int x, int y, int z, int slope, RCT2_GLOBAL(0x00F3EFF4, uint32) = 0x00F3EFF8; if (!(flags & (1 << 7))) - sub_6A6AA7(x, y, mapElement); + footpath_remove_edges_at(x, y, mapElement); if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !(flags & (1 << 6))) automatically_set_peep_spawn(x, y, mapElement->base_height / 2); @@ -276,7 +276,7 @@ static money32 footpath_element_update(int x, int y, rct_map_element *mapElement RCT2_GLOBAL(0x00F3EFF4, uint32) = 0x00F3EFF8; if (!(flags & (1 << 7))) - sub_6A6AA7(x, y, mapElement); + footpath_remove_edges_at(x, y, mapElement); mapElement->properties.path.type = (mapElement->properties.path.type & 0x0F) | (type << 4); mapElement->type = (mapElement->type & 0xFE) | (type >> 7); @@ -376,7 +376,7 @@ money32 footpath_remove_real(int x, int y, int z, int flags) if (mapElement != NULL && (flags & GAME_COMMAND_FLAG_APPLY)) { RCT2_GLOBAL(0x00F3EFF4, uint32) = 0x00F3EFF8; remove_banners_at_element(x, y, mapElement); - sub_6A6AA7(x, y, mapElement); + footpath_remove_edges_at(x, y, mapElement); map_invalidate_tile_full(x, y); map_element_remove(mapElement); sub_6A759F(); @@ -884,3 +884,142 @@ int footpath_element_get_slope_direction(rct_map_element *mapElement) { return mapElement->properties.path.type & 3; } + +/** + * + * rct2: 0x006A7642 + */ +void sub_6A7642(int x, int y, rct_map_element *mapElement) +{ + RCT2_CALLPROC_X(0x006A7642, x, 0, y, 0, (int)mapElement, 0, 0); +} + +/** + * + * rct2: 0x006A76E9 + */ +void sub_6A76E9(int rideIndex) +{ + if (rideIndex == 255) + return; + + *(RCT2_GLOBAL(0x00F3EFF4, uint8*)) = rideIndex; + RCT2_GLOBAL(0x00F3EFF4, uint8*)++; +} + +/** + * + * rct2: 0x006A6B7F + */ +static void footpath_remove_edges_towards_here(int x, int y, int z, int direction, rct_map_element *mapElement) +{ + int d; + + if (mapElement->type & 1) { + sub_6A76E9(mapElement->properties.path.addition_status); + } + + d = direction ^ 2; + mapElement->properties.path.edges &= ~(1 << d); + d = ((d - 1) & 3) + 4; + mapElement->properties.path.edges &= ~(1 << d); + d = (((d - 4) + 1) & 3) + 4; + mapElement->properties.path.edges &= ~(1 << d); + map_invalidate_tile(x, y, mapElement->base_height, mapElement->clearance_height); + + direction = (direction + 1) & 3; + x += TileDirectionDelta[direction].x; + y += TileDirectionDelta[direction].y; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + if (mapElement->base_height != z) + continue; + + if (footpath_element_is_sloped(mapElement)) + break; + + d = ((direction + 1) & 3) + 4; + mapElement->properties.path.edges &= ~(1 << d); + map_invalidate_tile(x, y, mapElement->base_height, mapElement->clearance_height); + break; + } while (!map_element_is_last_for_tile(mapElement++)); +} + +/** + * + * rct2: 0x006A6B14 + */ +void footpath_remove_edges_towards(int x, int y, int z0, int z1, int direction) +{ + rct_map_element *mapElement; + int slope; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + + if (z1 == mapElement->base_height) { + if (footpath_element_is_sloped(mapElement)) { + slope = footpath_element_get_slope_direction(mapElement); + if (slope != direction) + break; + } + footpath_remove_edges_towards_here(x, y, z1, direction, mapElement); + break; + } + if (z0 == mapElement->base_height) { + if (!footpath_element_is_sloped(mapElement)) + break; + + slope = footpath_element_get_slope_direction(mapElement) ^ 2; + if (slope != direction) + break; + + footpath_remove_edges_towards_here(x, y, z1, direction, mapElement); + break; + } + } while (!map_element_is_last_for_tile(mapElement++)); +} + +/** + * + * rct2: 0x006A6AA7 + * @param x x-coordinate in units (not tiles) + * @param y y-coordinate in units (not tiles) + */ +void footpath_remove_edges_at(int x, int y, rct_map_element *mapElement) +{ + rct_ride *ride; + int z0, z1, slope; + + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_TRACK) { + int rideIndex = mapElement->properties.track.ride_index; + ride = GET_RIDE(rideIndex); + if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) + return; + } + + sub_6A7642(x, y, mapElement); + + for (int direction = 0; direction < 4; direction++) { + z1 = mapElement->base_height; + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) { + if (footpath_element_is_sloped(mapElement)) { + slope = footpath_element_get_slope_direction(mapElement); + if ((slope - direction) & 1) + continue; + + z1 += slope == direction ? 2 : 0; + } + } + z0 = z1 - 2; + footpath_remove_edges_towards(x + TileDirectionDelta[direction].x, y + TileDirectionDelta[direction].y, z0, z1, direction); + } + + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) + mapElement->properties.path.edges = 0; +} diff --git a/src/world/footpath.h b/src/world/footpath.h index a44538db1b..ee34a3dbfd 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -67,5 +67,6 @@ void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, int footpath_is_connected_to_map_edge(int x, int y, int z, int direction, int flags); bool footpath_element_is_sloped(rct_map_element *mapElement); int footpath_element_get_slope_direction(rct_map_element *mapElement); +void footpath_remove_edges_at(int x, int y, rct_map_element *mapElement); #endif diff --git a/src/world/map.c b/src/world/map.c index 48c79603c8..822a7c8e4a 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2728,17 +2728,6 @@ void map_element_remove(rct_map_element *mapElement) } } -/** - * - * rct2: 0x006A6AA7 - * @param x x-coordinate in units (not tiles) - * @param y y-coordinate in units (not tiles) - */ -void sub_6A6AA7(int x, int y, rct_map_element *mapElement) -{ - RCT2_CALLPROC_X(0x006A6AA7, x, 0, y, 0, (int)mapElement, 0, 0); -} - /** * * rct2: 0x00675A8E @@ -2763,7 +2752,7 @@ void map_remove_all_rides() // fall-through case MAP_ELEMENT_TYPE_TRACK: sub_6A7594(); - sub_6A6AA7(it.x * 32, it.y * 32, it.element); + footpath_remove_edges_at(it.x * 32, it.y * 32, it.element); map_element_remove(it.element); map_element_iterator_restart_for_tile(&it); break; diff --git a/src/world/map.h b/src/world/map.h index 8a1f2cb5de..45239791f9 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -278,7 +278,6 @@ int map_is_location_owned(int x, int y, int z); int map_is_location_in_park(int x, int y); int map_get_station(rct_map_element *mapElement); void map_element_remove(rct_map_element *mapElement); -void sub_6A6AA7(int x, int y, rct_map_element *mapElement); void map_remove_all_rides(); void map_invalidate_map_selection_tiles(); void map_invalidate_selection_rect(); From 4acb7ff5e191b70c47673b02be7fd8d3cb51a359 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 6 Jul 2015 22:53:16 +0100 Subject: [PATCH 0210/1173] fix demolish of flat rides and unable to build it again --- src/windows/ride_construction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 292c96bfe0..84daa1f183 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1767,7 +1767,7 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) if (!sub_6CAF80(_currentRideIndex, &outputElement)) { sub_6CC3FB(_currentRideIndex); _currentTrackPieceDirection = _currentTrackPieceDirection; - if (slope & 0x100) { + if (!(slope & 0x100)) { _currentTrackCurve = slope; _previousTrackSlopeEnd = slopeEnd; _currentTrackSlopeEnd = b2; From 8113c9562b0dd41fe27032d802aa55f87e9ce072 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 7 Jul 2015 02:35:53 +0100 Subject: [PATCH 0211/1173] implement footpath_chain_ride_queue --- src/ride/ride.c | 2 +- src/world/footpath.c | 151 +++++++++++++++++++++++++++++++++++++------ src/world/footpath.h | 3 +- src/world/map.h | 5 +- 4 files changed, 138 insertions(+), 23 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 70dd918997..4112742f52 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3720,7 +3720,7 @@ void sub_6B5952(int rideIndex) continue; int direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; - sub_6A742F(rideIndex, i, x, y, mapElement, direction ^ 2); + footpath_chain_ride_queue(rideIndex, i, x, y, mapElement, direction ^ 2); } while (!map_element_is_last_for_tile(mapElement++)); } } diff --git a/src/world/footpath.c b/src/world/footpath.c index 9d81683fa3..9ccbd74008 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -19,15 +19,16 @@ *****************************************************************************/ #include "../addresses.h" -#include "../game.h" -#include "../localisation/localisation.h" -#include "../util/util.h" -#include "footpath.h" -#include "../management/finance.h" -#include "map.h" -#include "scenery.h" #include "../cheats.h" #include "../config.h" +#include "../game.h" +#include "../localisation/localisation.h" +#include "../management/finance.h" +#include "../util/util.h" +#include "footpath.h" +#include "map.h" +#include "map_animation.h" +#include "scenery.h" void footpath_interrupt_peeps(int x, int y, int z); @@ -210,7 +211,7 @@ static money32 footpath_element_update(int x, int y, rct_map_element *mapElement return MONEY32_UNDEFINED; } - if ((unk6 & 0x40) && (mapElement->type & 1)) { + if ((unk6 & 0x40) && footpath_element_is_queue(mapElement)) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CANNOT_PLACE_THESE_ON_QUEUE_LINE_AREA; return MONEY32_UNDEFINED; } @@ -220,7 +221,7 @@ static money32 footpath_element_update(int x, int y, rct_map_element *mapElement return MONEY32_UNDEFINED; } - if ((unk6 & 0x100) && !(mapElement->type & 1)) { + if ((unk6 & 0x100) && !footpath_element_is_queue(mapElement)) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_PLACE_THESE_ON_QUEUE_AREA; return MONEY32_UNDEFINED; } @@ -686,9 +687,95 @@ void sub_6A6C66(int x, int y, rct_map_element *mapElement, int flags) * * rct2: 0x006A742F */ -void sub_6A742F(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction) +void footpath_chain_ride_queue(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction) { - RCT2_CALLPROC_X(0x006A742F, x, direction, y, (entranceIndex << 8) | rideIndex, (int)mapElement, 0, 0); + rct_map_element *lastPathElement, *lastQueuePathElement; + int lastPathX, lastPathY, lastPathDirection; + + lastPathElement = NULL; + lastQueuePathElement = NULL; + int z = mapElement->base_height; + for (;;) { + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) { + lastPathElement = mapElement; + lastPathX = x; + lastPathY = y; + lastPathDirection = direction; + if (footpath_element_is_sloped(mapElement)) { + if (footpath_element_get_slope_direction(mapElement) == direction) { + z += 2; + } + } + } + + x += TileDirectionDelta[direction].x; + y += TileDirectionDelta[direction].y; + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (lastQueuePathElement == mapElement) + continue; + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + if (mapElement->base_height == z) { + if (footpath_element_is_sloped(mapElement)) { + if (footpath_element_get_slope_direction(mapElement) != direction) + break; + } + goto foundNextPath; + } + if (mapElement->base_height == z - 2) { + if (!footpath_element_is_sloped(mapElement)) + break; + + if ((footpath_element_get_slope_direction(mapElement) ^ 2) != direction) + break; + + z -= 2; + goto foundNextPath; + } + } while (!map_element_is_last_for_tile(mapElement++)); + break; + + foundNextPath: + if (footpath_element_is_queue(mapElement)) { + mapElement->properties.path.type &= ~(1 << 3); + mapElement->properties.path.edges |= (1 << (direction ^ 2)); + mapElement->properties.path.ride_index = rideIndex; + mapElement->properties.path.additions &= 0x8F; + mapElement->properties.path.additions |= (entranceIndex & 7) << 4; + if (lastQueuePathElement == NULL) { + lastQueuePathElement = mapElement; + } + + if (mapElement->properties.path.edges & (1 << direction)) + continue; + + direction = (direction + 1) & 3; + if (mapElement->properties.path.edges & (1 << direction)) + continue; + + direction ^= 2; + if (mapElement->properties.path.edges & (1 << direction)) + continue; + } + break; + } + + if (rideIndex != 255 && lastPathElement != NULL) { + if (footpath_element_is_queue(lastPathElement)) { + lastPathElement->properties.path.type |= (1 << 3); + lastPathElement->type &= 0x3F; + lastPathElement->type |= lastPathDirection << 6; + + map_animation_create( + MAP_ANIMATION_TYPE_QUEUE_BANNER, + lastPathX, + lastPathY, + lastPathElement->base_height + ); + } + } + } /** @@ -726,7 +813,7 @@ void sub_6A759F() continue; direction = (mapElement->type & 3) ^ 2; - sub_6A742F(rideIndex, i, x << 5, y << 5, mapElement, direction); + footpath_chain_ride_queue(rideIndex, i, x << 5, y << 5, mapElement, direction); } while (!map_element_is_last_for_tile(mapElement++)); } } @@ -885,13 +972,9 @@ int footpath_element_get_slope_direction(rct_map_element *mapElement) return mapElement->properties.path.type & 3; } -/** - * - * rct2: 0x006A7642 - */ -void sub_6A7642(int x, int y, rct_map_element *mapElement) +bool footpath_element_is_queue(rct_map_element *mapElement) { - RCT2_CALLPROC_X(0x006A7642, x, 0, y, 0, (int)mapElement, 0, 0); + return mapElement->type & 1; } /** @@ -907,6 +990,34 @@ void sub_6A76E9(int rideIndex) RCT2_GLOBAL(0x00F3EFF4, uint8*)++; } +/** + * + * rct2: 0x006A7642 + */ +void sub_6A7642(int x, int y, rct_map_element *mapElement) +{ + int elementType = map_element_get_type(mapElement); + switch (elementType) { + case MAP_ELEMENT_TYPE_PATH: + if (footpath_element_is_queue(mapElement)) { + sub_6A76E9(mapElement->properties.path.ride_index); + for (int direction = 0; direction < 4; direction++) { + if (mapElement->properties.path.edges & (1 << direction)) { + footpath_chain_ride_queue(255, 0, x, y, mapElement, direction); + } + } + mapElement->properties.path.ride_index = 255; + } + break; + case MAP_ELEMENT_TYPE_ENTRANCE: + if (mapElement->properties.entrance.type == ENTRANCE_TYPE_RIDE_ENTRANCE) { + sub_6A76E9(mapElement->properties.entrance.ride_index); + footpath_chain_ride_queue(255, 0, x, y, mapElement, (mapElement->type & MAP_ELEMENT_DIRECTION_MASK) ^ 2); + } + break; + } +} + /** * * rct2: 0x006A6B7F @@ -915,8 +1026,8 @@ static void footpath_remove_edges_towards_here(int x, int y, int z, int directio { int d; - if (mapElement->type & 1) { - sub_6A76E9(mapElement->properties.path.addition_status); + if (footpath_element_is_queue(mapElement)) { + sub_6A76E9(mapElement->properties.path.ride_index); } d = direction ^ 2; diff --git a/src/world/footpath.h b/src/world/footpath.h index ee34a3dbfd..09daa5cd43 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -60,13 +60,14 @@ void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, void footpath_remove_litter(int x, int y, int z); void sub_6A6C66(int x, int y, rct_map_element *mapElement, int flags); void sub_6A759F(); -void sub_6A742F(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction); +void footpath_chain_ride_queue(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction); void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, int *direction, rct_map_element **mapElement); int footpath_is_connected_to_map_edge(int x, int y, int z, int direction, int flags); bool footpath_element_is_sloped(rct_map_element *mapElement); int footpath_element_get_slope_direction(rct_map_element *mapElement); +bool footpath_element_is_queue(rct_map_element *mapElement); void footpath_remove_edges_at(int x, int y, rct_map_element *mapElement); #endif diff --git a/src/world/map.h b/src/world/map.h index 45239791f9..580e33a85f 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -34,7 +34,10 @@ typedef struct { uint8 type; //4 uint8 additions; //5 uint8 edges; //6 - uint8 addition_status; //7 + union { + uint8 addition_status; //7 + uint8 ride_index; + }; } rct_map_element_path_properties; typedef struct { From ef7603013ed836505f955800ad255656e837a6b1 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 7 Jul 2015 04:00:22 +0100 Subject: [PATCH 0212/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/german.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/german.txt b/data/language/german.txt index a76e936a9c..47e81a03f8 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -54,7 +54,7 @@ STR_0049 :Spukhaus STR_0050 :Erste Hilfe STR_0051 :Zirkus STR_0052 :Geisterbahn -STR_0053 :Twister-Achterbahn +STR_0053 :Stahl-Twister-Achterbahn STR_0054 :Holzachterbahn STR_0055 :Achterbahn mit seitlicher Führung STR_0056 :Wilde Maus From 0ab33d67e894c29d670a5d6153e7d1e5d95137e4 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 7 Jul 2015 19:09:12 +0100 Subject: [PATCH 0213/1173] implement footpath_connect_edges --- src/ride/track.c | 4 +- src/world/footpath.c | 360 ++++++++++++++++++++++++++++++++++++++++++- src/world/footpath.h | 2 +- src/world/map.c | 5 + src/world/map.h | 1 + 5 files changed, 362 insertions(+), 10 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index 273e534b8f..3758dcb8e7 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1291,7 +1291,7 @@ int track_place_scenery(rct_track_scenery* scenery_start, uint8 rideIndex, int o if (RCT2_GLOBAL(0x00F440D4, uint8) == 5)bl = 41; if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 105; - sub_6A6C66(mapCoord.x, mapCoord.y, map_element, bl); + footpath_connect_edges(mapCoord.x, mapCoord.y, map_element, bl); sub_6A759F(); continue; } @@ -3888,7 +3888,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in mapElement = surfaceElement; } - sub_6A6C66(x, y, mapElement, flags); + footpath_connect_edges(x, y, mapElement, flags); map_invalidate_tile_full(x, y); } diff --git a/src/world/footpath.c b/src/world/footpath.c index 9ccbd74008..faa21d9383 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -31,6 +31,8 @@ #include "scenery.h" void footpath_interrupt_peeps(int x, int y, int z); +void sub_6A7642(int x, int y, rct_map_element *mapElement); +void sub_6A76E9(int rideIndex); enum { FOOTPATH_CONSTRUCTION_FLAG_ALLOW_DURING_PAUSED = 1 << 3 @@ -113,7 +115,7 @@ static void loc_6A6620(int flags, int x, int y, rct_map_element *mapElement) } if (!(flags & (1 << 7))) - sub_6A6C66(x, y, mapElement, flags); + footpath_connect_edges(x, y, mapElement, flags); sub_6A759F(); map_invalidate_tile_full(x, y); @@ -392,10 +394,15 @@ money32 footpath_remove_real(int x, int y, int z, int flags) */ void game_command_place_footpath(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) { - if (*ebx & (1 << 5)) - RCT2_CALLFUNC_X(0x006A61DE, eax, ebx, ecx, edx, esi, edi, ebp); - else - *ebx = footpath_place_real((*edx >> 8) & 0xFF, *eax & 0xFFFF, *ecx & 0xFFFF, *edx & 0xFF, (*ebx >> 8) & 0xFF, *ebx & 0xFF, *edi & 0xFF); + *ebx = footpath_place_real( + (*edx >> 8) & 0xFF, + *eax & 0xFFFF, + *ecx & 0xFFFF, + *edx & 0xFF, + (*ebx >> 8) & 0xFF, + *ebx & 0xFF, + *edi & 0xFF + ); } /** @@ -674,13 +681,352 @@ void footpath_interrupt_peeps(int x, int y, int z) } } +bool sub_6E59DC(int x, int y, int z0, int z1, int direction) +{ + rct_map_element *mapElement; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_FENCE) + continue; + if (mapElement->flags & MAP_ELEMENT_FLAG_GHOST) + continue; + if (z0 >= mapElement->clearance_height) + continue; + if (z1 <= mapElement->base_height) + continue; + if ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) != direction) + continue; + + return true; + } while (!map_element_is_last_for_tile(mapElement++)); + return false; +} + +bool map_is_edge(int x, int y) +{ + return ( + x < 32 || + y < 32 || + x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) || + y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) + ); +} + +static rct_map_element *footpath_connect_corners_get_neighbour(int x, int y, int z, int requireEdges) +{ + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + if (footpath_element_is_queue(mapElement)) + continue; + if (mapElement->base_height != z) + continue; + if (!(mapElement->properties.path.edges & requireEdges)) + continue; + + return mapElement; + } while (!map_element_is_last_for_tile(mapElement++)); + return NULL; +} + +/** + * Sets the corner edges of four path tiles. + * The function will search for a path in the direction given, then check clockwise to see if it there is a path and again until + * it reaches the initial path. In other words, checks if there are four paths together so that it can set the inner corners of + * each one. + * + * rct2: 0x006A70EB + */ +static void footpath_connect_corners(int initialX, int initialY, rct_map_element *initialMapElement) +{ + rct_map_element *mapElement[4]; + + if (footpath_element_is_queue(initialMapElement)) + return; + if (footpath_element_is_sloped(initialMapElement)) + return; + + mapElement[0] = initialMapElement; + int z = initialMapElement->base_height; + for (int initialDirection = 0; initialDirection < 4; initialDirection++) { + int x = initialX; + int y = initialY; + int direction = initialDirection; + + x += TileDirectionDelta[direction].x; + y += TileDirectionDelta[direction].y; + mapElement[1] = footpath_connect_corners_get_neighbour(x, y, z, (1 << (direction ^ 2))); + if (mapElement[1] == NULL) + continue; + + direction = (direction + 1) & 3; + x += TileDirectionDelta[direction].x; + y += TileDirectionDelta[direction].y; + mapElement[2] = footpath_connect_corners_get_neighbour(x, y, z, (1 << (direction ^ 2))); + if (mapElement[2] == NULL) + continue; + + direction = (direction + 1) & 3; + x += TileDirectionDelta[direction].x; + y += TileDirectionDelta[direction].y; + mapElement[3] = footpath_connect_corners_get_neighbour(x, y, z, (1 << (direction ^ 2)) | (1 << (((direction ^ 2) - 1) & 3))); + if (mapElement[3] == NULL) + continue; + + direction = (direction + 1) & 3; + mapElement[3]->properties.path.edges |= (1 << (direction + 4)); + map_invalidate_element(x, y, mapElement[3]); + + direction = (direction - 1) & 3; + mapElement[2]->properties.path.edges |= (1 << (direction + 4)); + map_invalidate_element(x, y, mapElement[2]); + + direction = (direction - 1) & 3; + mapElement[1]->properties.path.edges |= (1 << (direction + 4)); + map_invalidate_element(x, y, mapElement[1]); + + direction = (direction - 1) & 3; + mapElement[0]->properties.path.edges |= (1 << (direction + 4)); + map_invalidate_element(x, y, mapElement[0]); + } +} + +typedef struct { + uint8 order; + uint8 direction; +} rct_neighbour; + +typedef struct { + rct_neighbour items[8]; + int count; +} rct_neighbour_list; + +static int rct_neighbour_compare(const void *a, const void *b) +{ + uint8 va = ((rct_neighbour*)a)->order; + uint8 vb = ((rct_neighbour*)b)->order; + if (va < vb) return 1; + else if (va == vb) return 0; + else return -1; +} + +static void neighbour_list_init(rct_neighbour_list *neighbourList) +{ + neighbourList->count = 0; +} + +static void neighbour_list_push(rct_neighbour_list *neighbourList, int order, int direction) +{ + neighbourList->items[neighbourList->count].order = order; + neighbourList->items[neighbourList->count].direction = direction; + neighbourList->count++; +} + +static bool neighbour_list_pop(rct_neighbour_list *neighbourList, rct_neighbour *outNeighbour) +{ + if (neighbourList->count == 0) + return false; + + *outNeighbour = neighbourList->items[0]; + for (int i = 0; i < neighbourList->count - 1; i++) + neighbourList->items[i] = neighbourList->items[i + 1]; + neighbourList->count--; + return true; +} + +static void neighbour_list_sort(rct_neighbour_list *neighbourList) +{ + qsort(neighbourList->items, neighbourList->count, sizeof(rct_neighbour), rct_neighbour_compare); +} + +/** + * + * rct2: 0x006A6D7E + */ +static void loc_6A6D7E( + int initialX, int initialY, int z, int direction, rct_map_element *initialMapElement, + int flags, bool query, rct_neighbour_list *neighbourList +) { + int x = initialX + TileDirectionDelta[direction].x; + int y = initialY + TileDirectionDelta[direction].y; + if (((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gSandboxMode) && map_is_edge(x, y)) { + if (query) { + neighbour_list_push(neighbourList, 7, direction); + } + } else { + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + switch (map_element_get_type(mapElement)) { + case MAP_ELEMENT_TYPE_PATH: + if (z == mapElement->base_height) { + if (footpath_element_is_sloped(mapElement) && footpath_element_get_slope_direction(mapElement) != direction) { + return; + } else { + goto loc_6A6F1F; + } + } + if (z + 2 == mapElement->base_height) { + if (footpath_element_is_sloped(mapElement)) { + if (footpath_element_get_slope_direction(mapElement) != (direction ^ 2)) { + return; + } + } else { + goto loc_6A6F1F; + } + } + break; + case MAP_ELEMENT_TYPE_TRACK: + if (z == mapElement->base_height) { + rct_ride *ride = GET_RIDE(mapElement->properties.track.ride_index); + if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + continue; + } + uint16 di = (mapElement->properties.track.sequence & 0x0F) | (mapElement->properties.track.type << 4); + if (!(RCT2_ADDRESS(0x0099CA64, uint8)[di] & (1 << 5))) { + return; + } + uint16 dx = (direction - mapElement->type) & 3; + if (!(RCT2_ADDRESS(0x0099CA64, uint16)[di / 2] & (1 << dx))) { + return; + } + if (query) { + neighbour_list_push(neighbourList, 1, direction); + } + goto loc_6A6FD2; + } + break; + case MAP_ELEMENT_TYPE_ENTRANCE: + if (z == mapElement->base_height) { + uint8 cl = (mapElement->properties.entrance.index & 0x0F) | (mapElement->properties.entrance.type << 4); + uint8 al = ((direction - mapElement->type) & 3) ^ 2; + if (!(RCT2_ADDRESS(0x0097B974, uint16)[cl / 2] & (1 << al))) { + return; + } + if (query) { + neighbour_list_push(neighbourList, 8, direction); + } else { + if (mapElement->properties.entrance.type != ENTRANCE_TYPE_PARK_ENTRANCE) { + sub_6A76E9(mapElement->properties.entrance.ride_index); + } + } + goto loc_6A6FD2; + } + break; + } + } while (!map_element_is_last_for_tile(mapElement++)); + return; + + loc_6A6F1F: + if (query) { + if (sub_6E59DC(x, y, mapElement->base_height, mapElement->clearance_height, direction & 2)) { + return; + } + if (footpath_element_is_queue(mapElement)) { + if (RCT2_ADDRESS(0x0098D7F0, uint8)[mapElement->properties.path.edges & 0x0F] < 2) { + neighbour_list_push(neighbourList, 3, direction); + } + } else { + neighbour_list_push(neighbourList, 2, direction); + } + } else { + mapElement->properties.path.edges |= (1 << (direction ^ 2)); + if (footpath_element_is_queue(mapElement)) { + sub_6A76E9(mapElement->properties.path.ride_index); + } + } + if (!(flags & 0x48)) { + footpath_interrupt_peeps(x, y, mapElement->base_height * 8); + } + map_invalidate_element(x, y, mapElement); + } + +loc_6A6FD2: + if (map_element_get_type(initialMapElement) == MAP_ELEMENT_TYPE_PATH) { + if (!query) { + initialMapElement->properties.path.edges |= (1 << direction); + map_invalidate_element(initialX, initialY, initialMapElement); + } + } +} + +static void loc_6A6C85( + int x, int y, int direction, rct_map_element *mapElement, + int flags, bool query, rct_neighbour_list *neighbourList +) { + if (query && sub_6E59DC(x, y, mapElement->base_height, mapElement->clearance_height, direction)) + return; + + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_ENTRANCE) { + uint16 di = (mapElement->properties.entrance.index & 0x0F) | (mapElement->properties.entrance.type << 4); + uint16 dx = (direction - mapElement->type) & 3; + if (RCT2_ADDRESS(0x0097B974, uint16)[di / 2] & (1 << dx)) { + return; + } + } + + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_TRACK) { + rct_ride *ride = GET_RIDE(mapElement->properties.track.ride_index); + if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + return; + } + uint16 di = (mapElement->properties.track.sequence & 0x0F) | (mapElement->properties.track.type << 4); + if (!(RCT2_ADDRESS(0x0099CA64, uint8)[di] & (1 << 5))) { + return; + } + uint16 dx = (direction - mapElement->type) & 3; + if (!(RCT2_ADDRESS(0x0099CA64, uint16)[di / 2] & (1 << dx))) { + return; + } + } + + int z = mapElement->base_height; + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) { + if (footpath_element_is_sloped(mapElement)) { + if ((footpath_element_get_slope_direction(mapElement) - direction) & 1) { + return; + } + if (footpath_element_get_slope_direction(mapElement) == direction) { + z += 2; + } + } + } + + loc_6A6D7E(x, y, z, direction, mapElement, flags, query, neighbourList); +} + /** * * rct2: 0x006A6C66 */ -void sub_6A6C66(int x, int y, rct_map_element *mapElement, int flags) +void footpath_connect_edges(int x, int y, rct_map_element *mapElement, int flags) { - RCT2_CALLPROC_X(0x006A6C66, x, flags, y, 0, (int)mapElement, 0, 0); + rct_neighbour_list neighbourList; + rct_neighbour neighbour; + + neighbour_list_init(&neighbourList); + + sub_6A7642(x, y, mapElement); + for (int direction = 0; direction < 4; direction++) { + loc_6A6C85(x, y, direction, mapElement, flags, true, &neighbourList); + } + + neighbour_list_sort(&neighbourList); + + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) { + if (footpath_element_is_queue(mapElement)) { + neighbourList.count = min(neighbourList.count, 2); + } + } + + while (neighbour_list_pop(&neighbourList, &neighbour)) { + loc_6A6C85(x, y, neighbour.direction, mapElement, flags, false, NULL); + } + + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) { + footpath_connect_corners(x, y, mapElement); + } } /** diff --git a/src/world/footpath.h b/src/world/footpath.h index 09daa5cd43..28f89cdb1f 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -58,7 +58,7 @@ void footpath_provisional_update(); void footpath_get_coordinates_from_pos(int screenX, int screenY, int *x, int *y, int *direction, rct_map_element **mapElement); void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, int *direction, rct_map_element **mapElement); void footpath_remove_litter(int x, int y, int z); -void sub_6A6C66(int x, int y, rct_map_element *mapElement, int flags); +void footpath_connect_edges(int x, int y, rct_map_element *mapElement, int flags); void sub_6A759F(); void footpath_chain_ride_queue(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction); diff --git a/src/world/map.c b/src/world/map.c index 822a7c8e4a..37c55ead43 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3528,3 +3528,8 @@ void map_invalidate_tile_full(int x, int y) { map_invalidate_tile(x, y, 0, 2080); } + +void map_invalidate_element(int x, int y, rct_map_element *mapElement) +{ + map_invalidate_tile(x, y, mapElement->base_height, mapElement->clearance_height); +} diff --git a/src/world/map.h b/src/world/map.h index 580e33a85f..dd76ad8174 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -349,5 +349,6 @@ void map_invalidate_tile(int x, int y, int z0, int z1); void map_invalidate_tile_zoom1(int x, int y, int z0, int z1); void map_invalidate_tile_zoom0(int x, int y, int z0, int z1); void map_invalidate_tile_full(int x, int y); +void map_invalidate_element(int x, int y, rct_map_element *mapElement); #endif From 728e5d5e1c81cd71247cf5fc3ba78c31471e82f8 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Wed, 8 Jul 2015 18:46:32 +0100 Subject: [PATCH 0214/1173] Fix multiple station platforms. Small mistake was causing multiple station platforms to not be properly deleted from a rct_ride. Fixes #1566 --- src/ride/track.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index 3758dcb8e7..a07217f466 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -4087,7 +4087,7 @@ money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, entranceDirections = RCT2_ADDRESS(0x0099BA64, uint8)[type * 16]; } - if (entranceDirections & (1 << 4) && (mapElement->properties.track.sequence == 0)){ + if (entranceDirections & (1 << 4) && ((mapElement->properties.track.sequence & 0xF) == 0)){ if (RCT2_CALLPROC_X(0x006C494B, x, (rideIndex << 8), y, (z / 8) | (rotation << 8), 0, 0, 0) & 0x100){ return MONEY32_UNDEFINED; } @@ -4108,7 +4108,7 @@ money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, if (!(flags & GAME_COMMAND_FLAG_APPLY)) continue; - if (entranceDirections & (1 << 4) && (mapElement->properties.track.sequence == 0)){ + if (entranceDirections & (1 << 4) && ((mapElement->properties.track.sequence & 0xF) == 0)){ if (RCT2_CALLPROC_X(0x006C494B, x, GAME_COMMAND_FLAG_APPLY | (rideIndex << 8), y, (z / 8) | (rotation << 8), 0, 0, 0) & 0x100){ return MONEY32_UNDEFINED; } From b22f6f401a62d90ebc6f83b9b86ea17afd44c425 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Wed, 8 Jul 2015 20:12:17 +0100 Subject: [PATCH 0215/1173] Implemented game_command_place_ride_entrance_or_exit --- src/game.c | 4 +- src/ride/ride.c | 195 ++++++++++++++++++++++++++++++++++++++++++++++++ src/ride/ride.h | 2 + 3 files changed, 199 insertions(+), 2 deletions(-) diff --git a/src/game.c b/src/game.c index 02876215e0..93f30fb135 100644 --- a/src/game.c +++ b/src/game.c @@ -910,7 +910,7 @@ static uint32 game_do_command_table[58] = { 0, 0, // 10 0, - 0x006660A8, + 0, 0x0066640B, 0, 0, @@ -973,7 +973,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_set_ride_vehicles, game_command_set_ride_name, // 10 game_command_set_ride_setting, - game_command_emptysub, + game_command_place_ride_entrance_or_exit, game_command_emptysub, game_command_remove_scenery, game_command_place_scenery, diff --git a/src/ride/ride.c b/src/ride/ride.c index 4112742f52..007236283c 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -39,6 +39,7 @@ #include "../world/banner.h" #include "../world/footpath.h" #include "../world/map.h" +#include "../world/map_animation.h" #include "../world/sprite.h" #include "ride.h" #include "ride_data.h" @@ -5565,3 +5566,197 @@ void sub_6CB945(int rideIndex) { RCT2_CALLPROC_X(0x006CB945, 0, 0, 0, rideIndex, 0, 0, 0); } + +money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 direction, uint8 flags, uint8 rideIndex, uint8 station_num, uint8 is_exit){ + // Remember when in Unknown station num mode rideIndex is unknown and z is set + // When in known station num mode rideIndex is known and z is unknown + + RCT2_GLOBAL(0x009E32B8, uint32) = 0; + RCT2_GLOBAL(0x009DEA5E, sint16) = x; + RCT2_GLOBAL(0x009DEA60, sint16) = y; + + if (!sub_68B044()) { + return MONEY32_UNDEFINED; + } + + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 2214; + return MONEY32_UNDEFINED; + } + + if (station_num == 0xFF){ + z *= 16; + if (flags & GAME_COMMAND_FLAG_APPLY) + return MONEY32_UNDEFINED; + + if (!map_is_location_owned(x, y, z)){ + return MONEY32_UNDEFINED; + } + + sint16 clear_z = z / 8 + (is_exit ? 5 : 7); + RCT2_GLOBAL(0x009E32C4, sint16) = x; + RCT2_GLOBAL(0x009E32C6, sint16) = y; + + // Horrible hack until map_can_construct_with_clear_at is implemented. + RCT2_GLOBAL(0x009E32C8, uint8*) = (&flags) - 4; + + if (!map_can_construct_with_clear_at(x, y, z / 8, clear_z, (void*)0x0066637E, 0xF)){ + return MONEY32_UNDEFINED; + } + + if (RCT2_GLOBAL(0x00F1AD60, uint8) & (1 << 2)){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1031; + return MONEY32_UNDEFINED; + } + + if (z > 1952){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 878; + return MONEY32_UNDEFINED; + } + + } + else{ + rct_ride* ride = GET_RIDE(rideIndex); + if (ride->status != RIDE_STATUS_CLOSED){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1006; + return MONEY32_UNDEFINED; + } + + if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 3092; + return MONEY32_UNDEFINED; + } + + ride_clear_for_construction(rideIndex); + ride_remove_peeps(rideIndex); + + uint8 requires_remove = 0; + sint16 remove_x = 0; + sint16 remove_y = 0; + + if (is_exit){ + if (ride->exits[station_num] != 0xFFFF){ + if (flags & (1 << 6)){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 0; + return MONEY32_UNDEFINED; + } + + remove_x = (ride->exits[station_num] & 0xFF) * 32; + remove_y = ((ride->exits[station_num] >> 8) & 0xFF) * 32; + requires_remove = 1; + } + } + else{ + if (ride->entrances[station_num] != 0xFFFF){ + if (flags & (1 << 6)){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 0; + return MONEY32_UNDEFINED; + } + + remove_x = (ride->entrances[station_num] & 0xFF) * 32; + remove_y = ((ride->entrances[station_num] >> 8) & 0xFF) * 32; + requires_remove = 1; + } + } + + if (requires_remove){ + money32 success = game_do_command( + remove_x, + flags, + remove_y, + rideIndex, + GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT, + station_num, + 0 + ); + + if (success = MONEY32_UNDEFINED){ + return MONEY32_UNDEFINED; + } + } + + z = ride->station_heights[station_num] * 8; + RCT2_GLOBAL(0x009DEA62, sint16) = z; + + if (flags & GAME_COMMAND_FLAG_APPLY && !(flags & 0x48)){ + footpath_remove_litter(x, y, z); + map_remove_walls_at_z(x, y, z); + } + + if (!map_is_location_owned(x, y, z)){ + return MONEY32_UNDEFINED; + } + + sint8 clear_z = (z / 8) + (is_exit ? 5 : 7); + RCT2_GLOBAL(0x009E32C4, sint16) = x; + RCT2_GLOBAL(0x009E32C6, sint16) = y; + + // Horrible hack until map_can_construct_with_clear_at is implemented. + RCT2_GLOBAL(0x009E32C8, uint8*) = (&flags) - 4; + + if (!map_can_construct_with_clear_at(x, y, z / 8, clear_z, (void*)0x0066637E, 0xF)){ + return MONEY32_UNDEFINED; + } + + if (RCT2_GLOBAL(0x00F1AD60, uint8) & (1 << 2)){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1031; + return MONEY32_UNDEFINED; + } + + if (z / 8 > 244){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 878; + return MONEY32_UNDEFINED; + } + + if (flags & GAME_COMMAND_FLAG_APPLY){ + + rct_map_element* mapElement = map_element_insert(x / 32, y / 32, z / 8, 0xF); + mapElement->clearance_height = clear_z; + mapElement->properties.entrance.type = is_exit; + mapElement->properties.entrance.index = station_num << 4; + mapElement->properties.entrance.ride_index = rideIndex; + mapElement->type = MAP_ELEMENT_TYPE_ENTRANCE | direction; + + if (flags & (1 << 6)){ + mapElement->flags |= MAP_ELEMENT_FLAG_GHOST; + } + + if (is_exit){ + ride->exits[station_num] = (x / 32) | (y / 32 << 8); + } + else{ + ride->entrances[station_num] = (x / 32) | (y / 32 << 8); + ride->first_peep_in_queue[station_num] = 0xFFFF; + ride->queue_length[station_num] = 0; + + map_animation_create(MAP_ANIMATION_TYPE_RIDE_ENTRANCE, x, y, z / 8); + } + + sub_6A7594(); + if (!(flags & (1 << 6))){ + RCT2_CALLPROC_X(0x00666CBE, x, 0, y, 0, (int)mapElement, 0, 0); + } + footpath_connect_edges(x, y, mapElement, flags); + sub_6A759F(); + + map_invalidate_tile_full(x, y); + } + } + + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION * 4; + return RCT2_GLOBAL(0x009E32B8, money32); +} + +/* rct2: 0x006660A8 */ +void game_command_place_ride_entrance_or_exit(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp){ + *ebx = place_ride_entrance_or_exit( + *eax & 0xFFFF, + *ecx & 0xFFFF, + *edx & 0xFF, + (*ebx >> 8) & 0xFF, + *ebx & 0xFF, + *edx & 0xFF, + *edi & 0xFF, + (*edx >> 8) & 0xFF + ); +} \ No newline at end of file diff --git a/src/ride/ride.h b/src/ride/ride.h index 88bd311228..4a494f2d64 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -956,6 +956,8 @@ void ride_set_num_vehicles(int rideIndex, int numVehicles); void ride_set_num_cars_per_vehicle(int rideIndex, int numCarsPerVehicle); void game_command_set_ride_vehicles(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +void game_command_place_ride_entrance_or_exit(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); + void sub_6CB945(int rideIndex); #endif From 82b60c1a56cc4699710e8db771bd84a464a2beb0 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Wed, 8 Jul 2015 20:47:27 +0100 Subject: [PATCH 0216/1173] Implement game_command_remove_ride_entrance_or_exit Fix bug in entrance placement that caused moving entrances/exits to fail --- src/game.c | 4 +-- src/ride/ride.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++- src/ride/ride.h | 1 + 3 files changed, 76 insertions(+), 3 deletions(-) diff --git a/src/game.c b/src/game.c index 93f30fb135..cb4ae078e1 100644 --- a/src/game.c +++ b/src/game.c @@ -911,7 +911,7 @@ static uint32 game_do_command_table[58] = { 0, // 10 0, 0, - 0x0066640B, + 0, 0, 0, 0, @@ -974,7 +974,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_set_ride_name, // 10 game_command_set_ride_setting, game_command_place_ride_entrance_or_exit, - game_command_emptysub, + game_command_remove_ride_entrance_or_exit, game_command_remove_scenery, game_command_place_scenery, game_command_set_water_height, diff --git a/src/ride/ride.c b/src/ride/ride.c index 007236283c..fc9f4cf11c 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5670,7 +5670,7 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio 0 ); - if (success = MONEY32_UNDEFINED){ + if (success == MONEY32_UNDEFINED){ return MONEY32_UNDEFINED; } } @@ -5759,4 +5759,76 @@ void game_command_place_ride_entrance_or_exit(int *eax, int *ebx, int *ecx, int *edi & 0xFF, (*edx >> 8) & 0xFF ); +} + +money32 remove_ride_entrance_or_exit(sint16 x, sint16 y, uint8 rideIndex, uint8 station_num, uint8 flags){ + rct_ride* ride = GET_RIDE(rideIndex); + + if (!(flags & (1 << 6))){ + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 2214; + return MONEY32_UNDEFINED; + } + } + + if (ride->status != RIDE_STATUS_CLOSED){ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1006; + return MONEY32_UNDEFINED; + } + + if (flags & GAME_COMMAND_FLAG_APPLY){ + ride_clear_for_construction(rideIndex); + ride_remove_peeps(rideIndex); + sub_6B59C6(rideIndex); + + uint8 found = 0; + rct_map_element* mapElement = map_get_first_element_at(x / 32, y / 32); + do{ + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE) + continue; + + if (mapElement->base_height != ride->station_heights[station_num]) + continue; + + found = 1; + break; + } while (!map_element_is_last_for_tile(mapElement++)); + + if (!found){ + return MONEY32_UNDEFINED; + } + + sub_6A7594(); + RCT2_CALLPROC_X(0x00666D6F, x, 0, y, 0, (int)mapElement, 0, 0); + footpath_remove_edges_at(x, y, mapElement); + + uint8 is_exit = mapElement->properties.entrance.type; + + map_element_remove(mapElement); + + if (is_exit){ + ride->exits[station_num] = 0xFFFF; + } + else{ + ride->entrances[station_num] = 0xFFFF; + } + + sub_6A759F(); + + map_invalidate_tile_full(x, y); + } + + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION * 4; + return 0; +} + +/* rct2: 0x0066640B */ +void game_command_remove_ride_entrance_or_exit(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp){ + *ebx = remove_ride_entrance_or_exit( + *eax & 0xFFFF, + *ecx & 0xFFFF, + *edx & 0xFF, + *edi & 0xFF, + *ebx & 0xFF + ); } \ No newline at end of file diff --git a/src/ride/ride.h b/src/ride/ride.h index 4a494f2d64..5919c29b5a 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -957,6 +957,7 @@ void ride_set_num_cars_per_vehicle(int rideIndex, int numCarsPerVehicle); void game_command_set_ride_vehicles(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_place_ride_entrance_or_exit(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +void game_command_remove_ride_entrance_or_exit(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void sub_6CB945(int rideIndex); From 5109224ba0181ce9ff6d1e9c008103974ddc5f02 Mon Sep 17 00:00:00 2001 From: Runelaenen Date: Thu, 9 Jul 2015 12:45:47 +0200 Subject: [PATCH 0217/1173] Add submenu and anti-clockwise rotation --- data/language/english_uk.txt | 2 ++ src/localisation/string_ids.h | 3 +++ src/windows/top_toolbar.c | 47 ++++++++++++++++++++++++++++++++--- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 7a0c6f46b7..e15b2be23c 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3788,3 +3788,5 @@ STR_5451 :Open cheats window STR_5452 :Toggle visibility of toolbars STR_5453 :Select another ride STR_5454 :Uncap FPS +STR_5455 :Rotate clockwise +STR_5456 :Rotate anti-clockwise diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 768315e2a9..459277cb3b 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -83,6 +83,9 @@ enum { STR_PAUSE_GAME_TIP = 833, STR_DISC_AND_GAME_OPTIONS_TIP = 834, + STR_ROTATE_CLOCKWISE = 5455, + STR_ROTATE_ANTI_CLOCKWISE = 5456, + STR_ABOUT = 847, STR_ROLLERCOASTER_TYCOON_2 = 848, STR_VERSION_X = 849, diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 45dce4a486..2380854f1a 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -218,6 +218,8 @@ void top_toolbar_init_view_menu(rct_window *window, rct_widget *widget); void top_toolbar_view_menu_dropdown(short dropdownIndex); void top_toolbar_init_fastforward_menu(rct_window *window, rct_widget *widget); void top_toolbar_fastforward_menu_dropdown(short dropdownIndex); +void top_toolbar_init_rotate_menu(rct_window *window, rct_widget *widget); +void top_toolbar_rotate_menu_dropdown(short dropdownIndex); void top_toolbar_init_debug_menu(rct_window *window, rct_widget *widget); void top_toolbar_debug_menu_dropdown(short dropdownIndex); @@ -274,10 +276,10 @@ static void window_top_toolbar_mouseup() if ((mainWindow = window_get_main()) != NULL) window_zoom_in(mainWindow); break; - case WIDX_ROTATE: + /*case WIDX_ROTATE: if ((mainWindow = window_get_main()) != NULL) window_rotate_camera(mainWindow); - break; + break;*/ case WIDX_CLEAR_SCENERY: toggle_clear_scenery_window(w, WIDX_CLEAR_SCENERY); break; @@ -422,6 +424,9 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg case WIDX_FASTFORWARD: top_toolbar_init_fastforward_menu(w, widget); break; + case WIDX_ROTATE: + top_toolbar_init_rotate_menu(w, widget); + break; case WIDX_DEBUG: top_toolbar_init_debug_menu(w, widget); break; @@ -506,6 +511,9 @@ static void window_top_toolbar_dropdown() case WIDX_FASTFORWARD: top_toolbar_fastforward_menu_dropdown(dropdownIndex); break; + case WIDX_ROTATE: + top_toolbar_rotate_menu_dropdown(dropdownIndex); + break; case WIDX_DEBUG: top_toolbar_debug_menu_dropdown(dropdownIndex); break; @@ -2792,7 +2800,7 @@ void top_toolbar_init_fastforward_menu(rct_window* w, rct_widget* widget) { gDropdownItemsArgs[1] = 5143; gDropdownItemsArgs[2] = 5144; gDropdownItemsArgs[3] = 5145; - + window_dropdown_show_text( w->x + widget->left, @@ -2828,6 +2836,39 @@ void top_toolbar_fastforward_menu_dropdown(short dropdownIndex) { } } +void top_toolbar_init_rotate_menu(rct_window* w, rct_widget* widget) { + gDropdownItemsFormat[0] = STR_ROTATE_CLOCKWISE; + gDropdownItemsFormat[1] = STR_ROTATE_ANTI_CLOCKWISE; + + window_dropdown_show_text( + w->x + widget->left, + w->y + widget->top, + widget->bottom - widget->top + 1, + w->colours[1] | 0x80, + 0, + 2 + ); + + RCT2_GLOBAL(0x9DEBA2, uint16) = 0; +} + +void top_toolbar_rotate_menu_dropdown(short dropdownIndex) { + if (dropdownIndex == -1) dropdownIndex = RCT2_GLOBAL(0x9DEBA2, uint16); + rct_window* w = window_get_main(); + if (w) { + if (dropdownIndex == 0) { + window_rotate_camera(w); + window_invalidate(w); + } + else if (dropdownIndex == 1){ + window_rotate_camera(w); + window_rotate_camera(w); + window_rotate_camera(w); + window_invalidate(w); + } + } +} + void top_toolbar_init_debug_menu(rct_window* w, rct_widget* widget) { gDropdownItemsFormat[0] = STR_DEBUG_DROPDOWN_CONSOLE; gDropdownItemsFormat[1] = STR_DEBUG_DROPDOWN_TILE_INSPECTOR; From 8ec0024a4d77c10a449dffebcd88d370c1fcd506 Mon Sep 17 00:00:00 2001 From: Runelaenen Date: Thu, 9 Jul 2015 12:46:43 +0200 Subject: [PATCH 0218/1173] Changed strings for #1495 --- data/language/english_uk.txt | 4 ++-- src/localisation/string_ids.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index e15b2be23c..7d2341055d 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3788,5 +3788,5 @@ STR_5451 :Open cheats window STR_5452 :Toggle visibility of toolbars STR_5453 :Select another ride STR_5454 :Uncap FPS -STR_5455 :Rotate clockwise -STR_5456 :Rotate anti-clockwise +STR_5458 :Rotate clockwise +STR_5459 :Rotate anti-clockwise diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 459277cb3b..7424d11e93 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -83,8 +83,8 @@ enum { STR_PAUSE_GAME_TIP = 833, STR_DISC_AND_GAME_OPTIONS_TIP = 834, - STR_ROTATE_CLOCKWISE = 5455, - STR_ROTATE_ANTI_CLOCKWISE = 5456, + STR_ROTATE_CLOCKWISE = 5458, + STR_ROTATE_ANTI_CLOCKWISE = 5459, STR_ABOUT = 847, STR_ROLLERCOASTER_TYCOON_2 = 848, From 624a402fa9115c2af5bdae0584ae3e3edf3357a6 Mon Sep 17 00:00:00 2001 From: Runelaenen Date: Thu, 9 Jul 2015 12:52:18 +0200 Subject: [PATCH 0219/1173] Removed comment --- src/windows/top_toolbar.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 2380854f1a..f94a5c3ce9 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -276,10 +276,6 @@ static void window_top_toolbar_mouseup() if ((mainWindow = window_get_main()) != NULL) window_zoom_in(mainWindow); break; - /*case WIDX_ROTATE: - if ((mainWindow = window_get_main()) != NULL) - window_rotate_camera(mainWindow); - break;*/ case WIDX_CLEAR_SCENERY: toggle_clear_scenery_window(w, WIDX_CLEAR_SCENERY); break; From bec1a52bba590f5bc83b4dcb44d0da08373e7ea4 Mon Sep 17 00:00:00 2001 From: Runelaenen Date: Thu, 9 Jul 2015 13:05:21 +0200 Subject: [PATCH 0220/1173] Changed function and occurences It doesnt have to rotate three times to get an anti-clockwise return. --- src/interface/window.c | 7 ++++--- src/interface/window.h | 2 +- src/title.c | 2 +- src/windows/top_toolbar.c | 6 ++---- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/interface/window.c b/src/interface/window.c index a80ffa2238..b4d4700765 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -1354,7 +1354,7 @@ void sub_688956() * * rct2: 0x0068881A */ -void window_rotate_camera(rct_window *w) +void window_rotate_camera(rct_window *w, int wise) { rct_viewport *viewport = w->viewport; if (viewport == NULL) @@ -1375,11 +1375,12 @@ void window_rotate_camera(rct_window *w) y = (viewport->view_height >> 1) + viewport->view_y; sub_689174(&x, &y, &z); - } else { + } + else { z = map_element_height(x, y); } - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 1) % 4; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + wise) % 4; int new_x, new_y; center_2d_coordinates(x, y, z, &new_x, &new_y, viewport); diff --git a/src/interface/window.h b/src/interface/window.h index 6093d52ee1..8b5aacee16 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -496,7 +496,7 @@ rct_window *window_get_main(); void window_scroll_to_viewport(rct_window *w); void window_scroll_to_location(rct_window *w, int x, int y, int z); -void window_rotate_camera(rct_window *w); +void window_rotate_camera(rct_window *w, int wise); void window_zoom_set(rct_window *w, int zoomLevel); void window_zoom_in(rct_window *w); void window_zoom_out(rct_window *w); diff --git a/src/title.c b/src/title.c index ad472457df..6fe269bd0b 100644 --- a/src/title.c +++ b/src/title.c @@ -300,7 +300,7 @@ static void title_do_next_script_opcode() w = window_get_main(); if (w != NULL) for (i = 0; i < script_operand; i++) - window_rotate_camera(w); + window_rotate_camera(w, 1); break; case TITLE_SCRIPT_ZOOM: script_operand = (*_currentScript++); diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index f94a5c3ce9..a880b07206 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -2853,13 +2853,11 @@ void top_toolbar_rotate_menu_dropdown(short dropdownIndex) { rct_window* w = window_get_main(); if (w) { if (dropdownIndex == 0) { - window_rotate_camera(w); + window_rotate_camera(w, 1); window_invalidate(w); } else if (dropdownIndex == 1){ - window_rotate_camera(w); - window_rotate_camera(w); - window_rotate_camera(w); + window_rotate_camera(w, -1); window_invalidate(w); } } From dd24011b5d8a6f627d46b78ecd06bef0a5dc9de4 Mon Sep 17 00:00:00 2001 From: Runelaenen Date: Thu, 9 Jul 2015 13:13:37 +0200 Subject: [PATCH 0221/1173] Fixed ' to rotate' Now uses less double code --- src/interface/keyboard_shortcut.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index d0382709c7..3c2e5d4ad3 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -157,17 +157,8 @@ static void shortcut_zoom_view_in() static void shortcut_rotate_view() { - rct_window *window; - - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_mouse_up_call(window, 4); - } - } - } + rct_window* w = window_get_main(); + window_rotate_camera(w, 1); } static void shortcut_rotate_construction_object() From 15a4c958eb74405d809c8bf491de5bffa0a8bde0 Mon Sep 17 00:00:00 2001 From: Runelaenen Date: Thu, 9 Jul 2015 13:46:02 +0200 Subject: [PATCH 0222/1173] Changed 'wise' to 'direction' --- src/interface/window.c | 7 +++++-- src/interface/window.h | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/interface/window.c b/src/interface/window.c index b4d4700765..06ee517216 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -1353,8 +1353,11 @@ void sub_688956() /** * * rct2: 0x0068881A + * direction can be used to alter the camera rotation: + * 1: clockwise + * -1: anti-clockwise */ -void window_rotate_camera(rct_window *w, int wise) +void window_rotate_camera(rct_window *w, int direction) { rct_viewport *viewport = w->viewport; if (viewport == NULL) @@ -1380,7 +1383,7 @@ void window_rotate_camera(rct_window *w, int wise) z = map_element_height(x, y); } - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + wise) % 4; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + direction) % 4; int new_x, new_y; center_2d_coordinates(x, y, z, &new_x, &new_y, viewport); diff --git a/src/interface/window.h b/src/interface/window.h index 8b5aacee16..6de725f398 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -496,7 +496,7 @@ rct_window *window_get_main(); void window_scroll_to_viewport(rct_window *w); void window_scroll_to_location(rct_window *w, int x, int y, int z); -void window_rotate_camera(rct_window *w, int wise); +void window_rotate_camera(rct_window *w, int direction); void window_zoom_set(rct_window *w, int zoomLevel); void window_zoom_in(rct_window *w); void window_zoom_out(rct_window *w); From 6527bc6ac2ca0e9b107e456d472216b8e378e23d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 9 Jul 2015 13:50:33 +0100 Subject: [PATCH 0223/1173] add shortcut versions and rotate clockwise/anticlockwise shortcut --- data/language/english_uk.txt | 3 ++- src/config.c | 34 +++++++++++++++++++++++-------- src/config.h | 4 +++- src/interface/keyboard_shortcut.c | 11 ++++++++-- src/localisation/string_ids.h | 4 +++- src/windows/shortcut_keys.c | 3 ++- 6 files changed, 45 insertions(+), 14 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 7d2341055d..af10cc361f 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2500,7 +2500,7 @@ STR_2495 :Cancel construction mode STR_2496 :Pause game STR_2497 :Zoom view out STR_2498 :Zoom view in -STR_2499 :Rotate view +STR_2499 :Rotate view clockwise STR_2500 :Rotate construction object STR_2501 :Underground view toggle STR_2502 :Remove base land toggle @@ -3790,3 +3790,4 @@ STR_5453 :Select another ride STR_5454 :Uncap FPS STR_5458 :Rotate clockwise STR_5459 :Rotate anti-clockwise +STR_5460 :Rotate view anti-clockwise diff --git a/src/config.c b/src/config.c index de68b5ef6a..8c42c9dfe7 100644 --- a/src/config.c +++ b/src/config.c @@ -914,18 +914,23 @@ void config_dat_save() #pragma region Shortcuts +#define SHIFT 0x100 +#define CTRL 0x200 +#define ALT 0x400 + // Current keyboard shortcuts uint16 gShortcutKeys[SHORTCUT_COUNT]; // Default keyboard shortcuts static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = { SDL_SCANCODE_BACKSPACE, // SHORTCUT_CLOSE_TOP_MOST_WINDOW - 0x0100 | SDL_SCANCODE_BACKSPACE, // SHORTCUT_CLOSE_ALL_FLOATING_WINDOWS + SHIFT | SDL_SCANCODE_BACKSPACE, // SHORTCUT_CLOSE_ALL_FLOATING_WINDOWS SDL_SCANCODE_ESCAPE, // SHORTCUT_CANCEL_CONSTRUCTION_MODE SDL_SCANCODE_PAUSE, // SHORTCUT_PAUSE_GAME SDL_SCANCODE_PAGEUP, // SHORTCUT_ZOOM_VIEW_OUT SDL_SCANCODE_PAGEDOWN, // SHORTCUT_ZOOM_VIEW_IN - SDL_SCANCODE_RETURN, // SHORTCUT_ROTATE_VIEW + SDL_SCANCODE_RETURN, // SHORTCUT_ROTATE_VIEW_CLOCKWISE + SHIFT | SDL_SCANCODE_RETURN, // SHORTCUT_ROTATE_VIEW_ANTICLOCKWISE SDL_SCANCODE_Z, // SHORTCUT_ROTATE_CONSTRUCTION_OBJECT SDL_SCANCODE_1, // SHORTCUT_UNDERGROUND_VIEW_TOGGLE SDL_SCANCODE_H, // SHORTCUT_REMOVE_BASE_LAND_TOGGLE @@ -950,15 +955,17 @@ static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = { SDL_SCANCODE_S, // SHORTCUT_SHOW_STAFF_LIST SDL_SCANCODE_M, // SHORTCUT_SHOW_RECENT_MESSAGES SDL_SCANCODE_TAB, // SHORTCUT_SHOW_MAP - 0x0200 | SDL_SCANCODE_S, // SHORTCUT_SCREENSHOT + CTRL | SDL_SCANCODE_S, // SHORTCUT_SCREENSHOT // New SDL_SCANCODE_MINUS, // SHORTCUT_REDUCE_GAME_SPEED, SDL_SCANCODE_EQUALS, // SHORTCUT_INCREASE_GAME_SPEED, - 0x0200 | 0x0400 | SDL_SCANCODE_C, // SHORTCUT_OPEN_CHEAT_WINDOW, + CTRL | ALT | SDL_SCANCODE_C, // SHORTCUT_OPEN_CHEAT_WINDOW, SDL_SCANCODE_T, // SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, }; +#define SHORTCUT_FILE_VERSION 1 + /** * * rct2: 0x006E3604 @@ -978,13 +985,19 @@ bool config_shortcut_keys_load() { char path[MAX_PATH]; FILE *file; - int result; + bool result; + uint16 version; config_shortcut_keys_get_path(path); file = fopen(path, "rb"); if (file != NULL) { - result = fread(gShortcutKeys, sizeof(gShortcutKeys), 1, file) == 1; + result = fread(&version, sizeof(version), 1, file) == 1; + if (result && version == SHORTCUT_FILE_VERSION) { + result = fread(gShortcutKeys, sizeof(gShortcutKeys), 1, file) == 1; + } else { + result = false; + } fclose(file); } else { result = false; @@ -995,15 +1008,20 @@ bool config_shortcut_keys_load() bool config_shortcut_keys_save() { + const uint16 version = SHORTCUT_FILE_VERSION; + char path[MAX_PATH]; FILE *file; - int result; + bool result; config_shortcut_keys_get_path(path); file = fopen(path, "wb"); if (file != NULL) { - result = fwrite(gShortcutKeys, sizeof(gShortcutKeys), 1, file) == 1; + result = fwrite(&version, sizeof(version), 1, file) == 1; + if (result) { + result = fwrite(gShortcutKeys, sizeof(gShortcutKeys), 1, file) == 1; + } fclose(file); } else { result = false; diff --git a/src/config.h b/src/config.h index 160630f2a3..4cb4a618f0 100644 --- a/src/config.h +++ b/src/config.h @@ -39,7 +39,8 @@ enum { SHORTCUT_PAUSE_GAME, SHORTCUT_ZOOM_VIEW_OUT, SHORTCUT_ZOOM_VIEW_IN, - SHORTCUT_ROTATE_VIEW, + SHORTCUT_ROTATE_VIEW_CLOCKWISE, + SHORTCUT_ROTATE_VIEW_ANTICLOCKWISE, SHORTCUT_ROTATE_CONSTRUCTION_OBJECT, SHORTCUT_UNDERGROUND_VIEW_TOGGLE, SHORTCUT_REMOVE_BASE_LAND_TOGGLE, @@ -71,6 +72,7 @@ enum { SHORTCUT_INCREASE_GAME_SPEED, SHORTCUT_OPEN_CHEAT_WINDOW, SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, + SHORTCUT_COUNT }; diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index 3c2e5d4ad3..3241fff1ad 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -155,12 +155,18 @@ static void shortcut_zoom_view_in() } } -static void shortcut_rotate_view() +static void shortcut_rotate_view_clockwise() { rct_window* w = window_get_main(); window_rotate_camera(w, 1); } +static void shortcut_rotate_view_anticlockwise() +{ + rct_window* w = window_get_main(); + window_rotate_camera(w, -1); +} + static void shortcut_rotate_construction_object() { rct_window *w; @@ -468,7 +474,8 @@ static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { shortcut_pause_game, shortcut_zoom_view_out, shortcut_zoom_view_in, - shortcut_rotate_view, + shortcut_rotate_view_clockwise, + shortcut_rotate_view_anticlockwise, shortcut_rotate_construction_object, shortcut_underground_view_toggle, shortcut_remove_base_land_toggle, diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 7424d11e93..1e475a29c1 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1159,7 +1159,7 @@ enum { STR_SHORTCUT_PAUSE_GAME = 2496, STR_SHORTCUT_ZOOM_VIEW_OUT = 2497, STR_SHORTCUT_ZOOM_VIEW_IN = 2498, - STR_SHORTCUT_ROTATE_VIEW = 2499, + STR_SHORTCUT_ROTATE_VIEW_CLOCKWISE = 2499, STR_SHORTCUT_ROTATE_CONSTRUCTION_OBJECT = 2500, STR_SHORTCUT_UNDERGROUND_VIEW_TOGGLE = 2501, STR_SHORTCUT_REMOVE_BASE_LAND_TOGGLE = 2502, @@ -1774,6 +1774,8 @@ enum { STR_SELECT_OTHER_RIDE = 5453, + STR_SHORTCUT_ROTATE_VIEW_ANTICLOCKWISE = 5460, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/shortcut_keys.c b/src/windows/shortcut_keys.c index 1accbd0c51..7c36ea0166 100644 --- a/src/windows/shortcut_keys.c +++ b/src/windows/shortcut_keys.c @@ -95,7 +95,8 @@ const rct_string_id ShortcutStringIds[] = { STR_SHORTCUT_PAUSE_GAME, STR_SHORTCUT_ZOOM_VIEW_OUT, STR_SHORTCUT_ZOOM_VIEW_IN, - STR_SHORTCUT_ROTATE_VIEW, + STR_SHORTCUT_ROTATE_VIEW_CLOCKWISE, + STR_SHORTCUT_ROTATE_VIEW_ANTICLOCKWISE, STR_SHORTCUT_ROTATE_CONSTRUCTION_OBJECT, STR_SHORTCUT_UNDERGROUND_VIEW_TOGGLE, STR_SHORTCUT_REMOVE_BASE_LAND_TOGGLE, From be635030bd984ab877386bf14fb1124699a8af1f Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 9 Jul 2015 16:34:34 +0200 Subject: [PATCH 0224/1173] Reorder cheats window, use actual currency, add cheats to give guests money and to set goal to have fun --- data/language/english_uk.txt | 18 ++-- src/localisation/string_ids.h | 6 ++ src/windows/cheats.c | 183 ++++++++++++++++++++-------------- 3 files changed, 126 insertions(+), 81 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index af10cc361f..52f76a4c94 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2683,7 +2683,7 @@ STR_2677 :??? STR_2678 :??? STR_2679 :??? STR_2680 :All research complete -STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} STR_2682 : STR_2683 : STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive @@ -2763,7 +2763,7 @@ STR_2756 :Remove litter STR_2757 :Force Sun STR_2758 :Force Thunder STR_2759 :Zero Clearance -STR_2760 :+5K Money +STR_2760 :+{CURRENCY} STR_2761 : STR_2762 : STR_2763 :??? @@ -3694,10 +3694,10 @@ STR_5357 :{BLACK}Nausea tolerance: STR_5358 :{BLACK}Bathroom: STR_5359 :Remove guests STR_5360 :{SMALLFONT}{BLACK}Removes all guests from the map -STR_5361 :{BLACK}Give all guests: -STR_5362 :{BLACK}Preferred intensity: -STR_5363 :> 1 -STR_5364 :< 15 +STR_5361 :Give all guests: +STR_5362 :{BLACK}Set all guests' preferred ride intensity to: +STR_5363 :More than 1 +STR_5364 :Less than 15 STR_5365 :{BLACK}Staff speed: STR_5366 :Normal STR_5367 :Fast @@ -3791,3 +3791,9 @@ STR_5454 :Uncap FPS STR_5458 :Rotate clockwise STR_5459 :Rotate anti-clockwise STR_5460 :Rotate view anti-clockwise +STR_5461 :Set guests' parameters +STR_5462 :{CURRENCY} +STR_5463 :Goal: Have fun! +STR_5464 :General +STR_5465 :Climate +STR_5466 :Staff diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 1e475a29c1..2456acb74d 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1773,6 +1773,12 @@ enum { STR_SHORTCUT_TOGGLE_VISIBILITY_OF_TOOLBARS = 5452, STR_SELECT_OTHER_RIDE = 5453, + STR_CHEAT_SET_GUESTS_PARAMETERS = 5461, + STR_CHEAT_CURRENCY_FORMAT = 5462, + STR_CHEAT_HAVE_FUN = 5463, + STR_CHEAT_GENERAL_GROUP = 5464, + STR_CHEAT_CLIMATE_GROUP = 5465, + STR_CHEAT_STAFF_GROUP = 5466, STR_SHORTCUT_ROTATE_VIEW_ANTICLOCKWISE = 5460, diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 52f1a38702..350d210470 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -60,7 +60,8 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_TAB_4, WIDX_HIGH_MONEY, WIDX_CLEAR_LOAN, - WIDX_GUEST_HAPPINESS_MAX = 8, //Same as HIGH_MONEY as it is also the 8th widget but on a different page + WIDX_GUEST_PARAMETERS_GROUP = 8, //Same as HIGH_MONEY as it is also the 8th widget but on a different page + WIDX_GUEST_HAPPINESS_MAX, WIDX_GUEST_HAPPINESS_MIN, WIDX_GUEST_ENERGY_MAX, WIDX_GUEST_ENERGY_MIN, @@ -76,32 +77,38 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_GUEST_BATHROOM_MIN, WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1, WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15, - WIDX_TRAM_GUESTS, - WIDX_REMOVE_ALL_GUESTS, - WIDX_EXPLODE_GUESTS, + WIDX_GIVE_ALL_GUESTS_GROUP, + WIDX_GIVE_GUESTS_MONEY, WIDX_GIVE_GUESTS_PARK_MAPS, WIDX_GIVE_GUESTS_BALLOONS, WIDX_GIVE_GUESTS_UMBRELLAS, - WIDX_FREEZE_CLIMATE = 8, + WIDX_TRAM_GUESTS, + WIDX_REMOVE_ALL_GUESTS, + WIDX_EXPLODE_GUESTS, + WIDX_GENERAL_GROUP = 8, WIDX_OPEN_CLOSE_PARK, + WIDX_PARK_PARAMETERS, + WIDX_SANDBOX_MODE, WIDX_ZERO_CLEARANCE, + WIDX_UNLOCK_ALL_PRICES, + WIDX_FORCE_PARK_RATING, + WIDX_PARK_RATING_SPINNER, + WIDX_INCREASE_PARK_RATING, + WIDX_DECREASE_PARK_RATING, + WIDX_WIN_SCENARIO, + WIDX_HAVE_FUN, + WIDX_CLIMATE_GROUP, + WIDX_FREEZE_CLIMATE, WIDX_WEATHER_SUN, WIDX_WEATHER_THUNDER, + WIDX_STAFF_GROUP, WIDX_CLEAR_GRASS, WIDX_MOWED_GRASS, WIDX_WATER_PLANTS, WIDX_FIX_VANDALISM, WIDX_REMOVE_LITTER, - WIDX_WIN_SCENARIO, - WIDX_UNLOCK_ALL_PRICES, - WIDX_SANDBOX_MODE, WIDX_FAST_STAFF, WIDX_NORMAL_STAFF, - WIDX_PARK_PARAMETERS, - WIDX_FORCE_PARK_RATING, - WIDX_PARK_RATING_SPINNER, - WIDX_INCREASE_PARK_RATING, - WIDX_DECREASE_PARK_RATING, WIDX_RENEW_RIDES = 8, WIDX_REMOVE_SIX_FLAGS, WIDX_MAKE_DESTRUCTIBLE, @@ -125,6 +132,7 @@ enum { }; enum { + OBJECT_MONEY, OBJECT_PARK_MAP, OBJECT_BALLOON, OBJECT_UMBRELLA @@ -152,7 +160,7 @@ enum { #define MIN_BTN_LEFT ((sint16)(XPL(1))) #define MIN_BTN_RIGHT ((sint16)(WPL(1) / 2)) #define MAX_BTN_LEFT ((sint16)(XPL(1.5))) -#define MAX_BTN_RIGHT ((sint16)(WPL(1.5) / 2)) +#define MAX_BTN_RIGHT ((sint16)(WPL(1))) #define TXTO 3 //text horizontal offset from button left (for button text) #pragma endregion @@ -176,54 +184,63 @@ static rct_widget window_cheats_money_widgets[] = { static rct_widget window_cheats_guests_widgets[] = { MAIN_CHEATS_WIDGETS, - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(0), HPL(0), STR_MAX, STR_NONE }, // happiness max - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(0), HPL(0), STR_MIN, STR_NONE }, // happiness min - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(1), HPL(1), STR_MAX, STR_NONE }, // energy max - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(1), HPL(1), STR_MIN, STR_NONE }, // energy min - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(2), HPL(2), STR_MAX, STR_NONE }, // hunger max - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(2), HPL(2), STR_MIN, STR_NONE }, // hunger min - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(3), HPL(3), STR_MAX, STR_NONE }, // thirst max - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(3), HPL(3), STR_MIN, STR_NONE }, // thirst min - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(4), HPL(4), STR_MAX, STR_NONE }, // nausea max - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(4), HPL(4), STR_MIN, STR_NONE }, // nausea min - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(5), HPL(5), STR_MAX, STR_NONE }, // nausea tolerance max - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(5), HPL(5), STR_MIN, STR_NONE }, // nausea tolerance min - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(6), HPL(6), STR_MAX, STR_NONE }, // bathroom max - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(6), HPL(6), STR_MIN, STR_NONE }, // bathroom min - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(7), HPL(7), STR_CHEAT_MORE_THAN_1, STR_NONE }, // ride intensity > 1 - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(7), HPL(7), STR_CHEAT_LESS_THAN_15, STR_NONE }, // ride intensity < 15 - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(10), HPL(10), STR_CHEAT_LARGE_TRAM_GUESTS, STR_CHEAT_TIP_LARGE_TRAM_GUESTS }, // large tram - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(11), HPL(11), STR_CHEAT_REMOVE_ALL_GUESTS, STR_CHEAT_TIP_REMOVE_ALL_GUESTS }, // explode guests - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(11), HPL(11), STR_CHEAT_EXPLODE, STR_CHEAT_TIP_EXPLODE }, // explode guests - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(9), HPL(9), 2018, STR_NONE }, // give guests park maps - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(9), HPL(9), 2016, STR_NONE }, // give guests balloons - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(8), HPL(8), 2020, STR_NONE }, // give guests umbrellas + { WWT_GROUPBOX, 1, XPL(0)-3, WPL(1)+3, YPL(0), HPL(9.5), STR_CHEAT_SET_GUESTS_PARAMETERS,STR_NONE }, // Guests parameters group frame + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(1), HPL(1), STR_MAX, STR_NONE }, // happiness max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(1), HPL(1), STR_MIN, STR_NONE }, // happiness min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(2), HPL(2), STR_MAX, STR_NONE }, // energy max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(2), HPL(2), STR_MIN, STR_NONE }, // energy min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(3), HPL(3), STR_MAX, STR_NONE }, // hunger max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(3), HPL(3), STR_MIN, STR_NONE }, // hunger min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(4), HPL(4), STR_MAX, STR_NONE }, // thirst max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(4), HPL(4), STR_MIN, STR_NONE }, // thirst min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(5), HPL(5), STR_MAX, STR_NONE }, // nausea max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(5), HPL(5), STR_MIN, STR_NONE }, // nausea min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(6), HPL(6), STR_MAX, STR_NONE }, // nausea tolerance max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(6), HPL(6), STR_MIN, STR_NONE }, // nausea tolerance min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(7), HPL(7), STR_MAX, STR_NONE }, // bathroom max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(7), HPL(7), STR_MIN, STR_NONE }, // bathroom min + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(9), HPL(9), STR_CHEAT_MORE_THAN_1, STR_NONE }, // ride intensity > 1 + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(9), HPL(9), STR_CHEAT_LESS_THAN_15, STR_NONE }, // ride intensity < 15 + { WWT_GROUPBOX, 1, XPL(0)-3, WPL(1)+3, YPL(11), HPL(13.5), STR_CHEAT_GIVE_ALL_GUESTS, STR_NONE }, // Guests parameters group frame + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(12), HPL(12), STR_CHEAT_CURRENCY_FORMAT, STR_NONE }, // give guests money + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(12), HPL(12), 2018, STR_NONE }, // give guests park maps + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(13), HPL(13), 2016, STR_NONE }, // give guests balloons + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(13), HPL(13), 2020, STR_NONE }, // give guests umbrellas + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(15), HPL(15), STR_CHEAT_LARGE_TRAM_GUESTS, STR_CHEAT_TIP_LARGE_TRAM_GUESTS }, // large tram + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(15), HPL(15), STR_CHEAT_REMOVE_ALL_GUESTS, STR_CHEAT_TIP_REMOVE_ALL_GUESTS }, // remove all guests + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(16), HPL(16), STR_CHEAT_EXPLODE, STR_CHEAT_TIP_EXPLODE }, // explode guests { WIDGETS_END }, }; //Strings for following moved to window_cheats_paint() static rct_widget window_cheats_misc_widgets[] = { MAIN_CHEATS_WIDGETS, - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_FREEZE_CLIMATE, STR_NONE}, // Freeze climate - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(0), HPL(0), STR_CHEAT_OPEN_PARK, STR_NONE}, // open / close park - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_ZERO_CLEARANCE, STR_NONE}, // Zero Clearance - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_FORCE_SUN, STR_NONE}, // Sun - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(2), HPL(2), STR_CHEAT_FORCE_THUNDER, STR_NONE}, // Thunder - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(3), HPL(3), STR_CHEAT_CLEAR_GRASS, STR_NONE}, // Clear grass - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(3), HPL(3), STR_CHEAT_MOWED_GRASS, STR_NONE}, // Mowed grass - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(4), HPL(4), STR_CHEAT_WATER_PLANTS, STR_NONE}, // Water plants - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(4), HPL(4), STR_CHEAT_FIX_VANDALISM, STR_NONE}, // Fix vandalism - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_CHEAT_REMOVE_LITTER, STR_NONE}, // Remove litter - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(0), HPL(0), STR_CHEAT_WIN_SCENARIO, STR_NONE}, // Win scenario - { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(11),OHPL(11), STR_CHEAT_UNLOCK_PRICES, STR_NONE}, // Unlock all prices - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(5), HPL(5), STR_CHEAT_SANDBOX_MODE, STR_CHEAT_SANDBOX_MODE_TIP}, // Sandbox mode (edit land ownership in-game) - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(6), HPL(6), STR_FAST, STR_NONE }, // fast staff - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(6), HPL(6), STR_NORMAL, STR_NONE }, // normal staff - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(7), HPL(7), STR_CHEAT_PARK_PARAMETERS, STR_CHEAT_TIP_PARK_PARAMETERS}, // Park parameters - { WWT_CHECKBOX, 1, XPL(0), WPL(0), YPL(8), HPL(8), STR_FORCE_PARK_RATING, STR_NONE}, // Force park rating - { WWT_SPINNER, 1, XPL(1), WPL(1) - 10, YPL(8) + 2, HPL(8) - 3, STR_NONE, STR_NONE }, // park rating - { WWT_DROPDOWN_BUTTON, 1, WPL(1) - 10, WPL(1), YPL(8) + 3, YPL(8) + 7, STR_NUMERIC_UP, STR_NONE }, // increase rating - { WWT_DROPDOWN_BUTTON, 1, WPL(1) - 10, WPL(1), YPL(8) + 8, YPL(8) + 12, STR_NUMERIC_DOWN, STR_NONE }, // decrease rating + { WWT_GROUPBOX, 1, XPL(0)-3, WPL(1)+3, YPL(0), HPL(5.5), STR_CHEAT_GENERAL_GROUP, STR_NONE }, // General group + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_OPEN_PARK, STR_NONE}, // open / close park + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_PARK_PARAMETERS, STR_CHEAT_TIP_PARK_PARAMETERS}, // Park parameters + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_SANDBOX_MODE, STR_CHEAT_SANDBOX_MODE_TIP}, // Sandbox mode (edit land ownership in-game) + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(2), HPL(2), STR_CHEAT_ZERO_CLEARANCE, STR_NONE}, // Zero Clearance + { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(3), OHPL(3), STR_CHEAT_UNLOCK_PRICES, STR_NONE}, // Unlock all prices + { WWT_CHECKBOX, 1, XPL(0), WPL(0), YPL(4), HPL(4), STR_FORCE_PARK_RATING, STR_NONE}, // Force park rating + { WWT_SPINNER, 1, XPL(1), WPL(1) - 10, YPL(4) + 2, HPL(4) - 3, STR_NONE, STR_NONE }, // park rating + { WWT_DROPDOWN_BUTTON,1,WPL(1) - 10,WPL(1), YPL(4) + 3, YPL(4) + 7, STR_NUMERIC_UP, STR_NONE }, // increase rating + { WWT_DROPDOWN_BUTTON,1,WPL(1) - 10,WPL(1), YPL(4) + 8, YPL(4) + 12,STR_NUMERIC_DOWN, STR_NONE }, // decrease rating + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_CHEAT_WIN_SCENARIO, STR_NONE}, // Win scenario + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(5), HPL(5), STR_CHEAT_HAVE_FUN, STR_NONE}, // Have fun! + { WWT_GROUPBOX, 1, XPL(0)-3, WPL(1)+3, YPL(7), HPL(9.5), STR_CHEAT_CLIMATE_GROUP, STR_NONE }, // Climate group + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(8), HPL(8), STR_CHEAT_FREEZE_CLIMATE, STR_NONE}, // Freeze climate + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(9), HPL(9), STR_CHEAT_FORCE_SUN, STR_NONE}, // Sun + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(9), HPL(9), STR_CHEAT_FORCE_THUNDER, STR_NONE}, // Thunder + { WWT_GROUPBOX, 1, XPL(0)-3, WPL(1)+3, YPL(11), HPL(15.5), STR_CHEAT_STAFF_GROUP, STR_NONE }, // Staff group + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(12), HPL(12), STR_CHEAT_CLEAR_GRASS, STR_NONE}, // Clear grass + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(12), HPL(12), STR_CHEAT_MOWED_GRASS, STR_NONE}, // Mowed grass + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(13), HPL(13), STR_CHEAT_WATER_PLANTS, STR_NONE}, // Water plants + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(13), HPL(13), STR_CHEAT_FIX_VANDALISM, STR_NONE}, // Fix vandalism + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(14), HPL(14), STR_CHEAT_REMOVE_LITTER, STR_NONE}, // Remove litter + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(15), HPL(15), STR_FAST, STR_NONE }, // Fast staff + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(15), HPL(15), STR_NORMAL, STR_NONE }, // Normal staff + + { WIDGETS_END }, }; static rct_widget window_cheats_rides_widgets[] = { @@ -391,11 +408,11 @@ static void* window_cheats_page_events[] = { window_cheats_rides_events, }; -static uint32 window_cheats_page_enabled_widgets[] = { - (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_HIGH_MONEY) | (1 << WIDX_CLEAR_LOAN), - (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_GUEST_HAPPINESS_MAX) | (1 << WIDX_GUEST_HAPPINESS_MIN) | (1 << WIDX_GUEST_ENERGY_MAX) | (1 << WIDX_GUEST_ENERGY_MIN) | (1 << WIDX_GUEST_HUNGER_MAX) | (1 << WIDX_GUEST_HUNGER_MIN) | (1 << WIDX_GUEST_THIRST_MAX) | (1 << WIDX_GUEST_THIRST_MIN) | (1 << WIDX_GUEST_NAUSEA_MAX) | (1 << WIDX_GUEST_NAUSEA_MIN) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1 << WIDX_GUEST_BATHROOM_MAX) | (1 << WIDX_GUEST_BATHROOM_MIN) | (1 << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1 << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1 << WIDX_TRAM_GUESTS) | (1 << WIDX_REMOVE_ALL_GUESTS) | (1 << WIDX_EXPLODE_GUESTS) | (1 << WIDX_GIVE_GUESTS_PARK_MAPS) | (1 << WIDX_GIVE_GUESTS_BALLOONS) | (1 << WIDX_GIVE_GUESTS_UMBRELLAS), - (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) | (1 << WIDX_UNLOCK_ALL_PRICES) | (1 << WIDX_SANDBOX_MODE) | (1 << WIDX_FAST_STAFF) | (1 << WIDX_NORMAL_STAFF) | (1 << WIDX_PARK_PARAMETERS) | (1 << WIDX_FORCE_PARK_RATING) | (1 << WIDX_INCREASE_PARK_RATING) | (1 << WIDX_DECREASE_PARK_RATING), - (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_RENEW_RIDES) | (1 << WIDX_REMOVE_SIX_FLAGS) | (1 << WIDX_MAKE_DESTRUCTIBLE) | (1 << WIDX_FIX_ALL) | (1 << WIDX_FAST_LIFT_HILL) | (1 << WIDX_DISABLE_BRAKES_FAILURE) | (1 << WIDX_DISABLE_ALL_BREAKDOWNS) | (1 << WIDX_BUILD_IN_PAUSE_MODE) | (1 << WIDX_RESET_CRASH_STATUS) +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_HIGH_MONEY) | (1ULL << WIDX_CLEAR_LOAN), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_GUEST_PARAMETERS_GROUP) | (1ULL << WIDX_GUEST_HAPPINESS_MAX) | (1ULL << WIDX_GUEST_HAPPINESS_MIN) | (1ULL << WIDX_GUEST_ENERGY_MAX) | (1ULL << WIDX_GUEST_ENERGY_MIN) | (1ULL << WIDX_GUEST_HUNGER_MAX) | (1ULL << WIDX_GUEST_HUNGER_MIN) | (1ULL << WIDX_GUEST_THIRST_MAX) | (1ULL << WIDX_GUEST_THIRST_MIN) | (1ULL << WIDX_GUEST_NAUSEA_MAX) | (1ULL << WIDX_GUEST_NAUSEA_MIN) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1ULL << WIDX_GUEST_BATHROOM_MAX) | (1ULL << WIDX_GUEST_BATHROOM_MIN) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1ULL << WIDX_GIVE_ALL_GUESTS_GROUP) | (1ULL << WIDX_GIVE_GUESTS_MONEY) | (1ULL << WIDX_GIVE_GUESTS_PARK_MAPS) | (1ULL << WIDX_GIVE_GUESTS_BALLOONS) | (1ULL << WIDX_GIVE_GUESTS_UMBRELLAS) | (1ULL << WIDX_TRAM_GUESTS) | (1ULL << WIDX_REMOVE_ALL_GUESTS) | (1ULL << WIDX_EXPLODE_GUESTS), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_FREEZE_CLIMATE) | (1ULL << WIDX_OPEN_CLOSE_PARK) | (1ULL << WIDX_ZERO_CLEARANCE) | (1ULL << WIDX_WEATHER_SUN) | (1ULL << WIDX_WEATHER_THUNDER) | (1ULL << WIDX_CLEAR_GRASS) | (1ULL << WIDX_MOWED_GRASS) | (1ULL << WIDX_WATER_PLANTS) | (1ULL << WIDX_FIX_VANDALISM) | (1ULL << WIDX_REMOVE_LITTER) | (1ULL << WIDX_WIN_SCENARIO) | (1ULL << WIDX_HAVE_FUN) | (1ULL << WIDX_UNLOCK_ALL_PRICES) | (1ULL << WIDX_SANDBOX_MODE) | (1ULL << WIDX_FAST_STAFF) | (1ULL << WIDX_NORMAL_STAFF) | (1ULL << WIDX_PARK_PARAMETERS) | (1ULL << WIDX_FORCE_PARK_RATING) | (1ULL << WIDX_INCREASE_PARK_RATING) | (1ULL << WIDX_DECREASE_PARK_RATING), + (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_REMOVE_SIX_FLAGS) | (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) }; static rct_string_id window_cheats_page_titles[] = { @@ -658,19 +675,23 @@ static void cheat_give_all_guests(int object) FOR_ALL_GUESTS(spriteIndex, peep) { switch(object) { + case OBJECT_MONEY: + peep->cash_in_pocket = MONEY(1000,00); + break; case OBJECT_PARK_MAP: peep->item_standard_flags |= PEEP_ITEM_MAP; break; case OBJECT_BALLOON: peep->item_standard_flags |= PEEP_ITEM_BALLOON; peep->balloon_colour=scenario_rand_max(31); + peep_update_sprite_type(peep); break; case OBJECT_UMBRELLA: peep->item_standard_flags |= PEEP_ITEM_UMBRELLA; peep->umbrella_colour=scenario_rand_max(31); + peep_update_sprite_type(peep); break; } - peep_update_sprite_type(peep); } window_invalidate_by_class(WC_PEEP); } @@ -846,6 +867,9 @@ static void window_cheats_guests_mouseup() case WIDX_EXPLODE_GUESTS: cheat_explode_guests(); break; + case WIDX_GIVE_GUESTS_MONEY: + cheat_give_all_guests(OBJECT_MONEY); + break; case WIDX_GIVE_GUESTS_PARK_MAPS: cheat_give_all_guests(OBJECT_PARK_MAP); break; @@ -911,6 +935,9 @@ static void window_cheats_misc_mouseup() case WIDX_WIN_SCENARIO: scenario_success(); break; + case WIDX_HAVE_FUN: + RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) = OBJECTIVE_HAVE_FUN; + break; case WIDX_UNLOCK_ALL_PRICES: gConfigCheat.unlock_all_prices ^= 1; config_save_default(); @@ -1054,6 +1081,12 @@ static void window_cheats_invalidate() w->pressed_widgets = 0; switch (w->page) { + case WINDOW_CHEATS_PAGE_MONEY: + RCT2_GLOBAL(0x013CE952, int) = 50000; + break; + case WINDOW_CHEATS_PAGE_GUESTS: + RCT2_GLOBAL(0x013CE952, int) = 10000; + break; case WINDOW_CHEATS_PAGE_MISC: w->widgets[WIDX_OPEN_CLOSE_PARK].image = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_OPEN ? STR_CHEAT_CLOSE_PARK : STR_CHEAT_OPEN_PARK; @@ -1089,23 +1122,23 @@ static void window_cheats_paint() window_cheats_draw_tab_images(dpi, w); if (w->page == WINDOW_CHEATS_PAGE_MONEY){ - gfx_draw_string_left(dpi, STR_CHEAT_TIP_5K_MONEY, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(0) + TXTO); - gfx_draw_string_left(dpi, STR_CHEAT_TIP_CLEAR_LOAN, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(4) + TXTO); + RCT2_GLOBAL(0x0013CE952, money32) = CHEATS_MONEY_INCREMENT; + gfx_draw_string_left(dpi, STR_CHEAT_TIP_5K_MONEY, (void*)0x0013CE952, 0, w->x + XPL(0) + TXTO, w->y + YPL(0) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_TIP_CLEAR_LOAN, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(4) + TXTO); } else if(w->page == WINDOW_CHEATS_PAGE_MISC){ - gfx_draw_string_left(dpi, STR_CHEAT_STAFF_SPEED, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(6) + TXTO); - gfx_draw_string_right(dpi, 5182, &park_rating_spinner_value, w->colours[2], w->x + WPL(1) - 10 - TXTO, w->y + YPL(8) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_STAFF_SPEED, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(15) + TXTO); + gfx_draw_string_right(dpi, 5182, &park_rating_spinner_value, w->colours[2], w->x + WPL(1) - 10 - TXTO, w->y + YPL(4) + TXTO); } else if (w->page == WINDOW_CHEATS_PAGE_GUESTS){ - gfx_draw_string_left(dpi, STR_CHEAT_GUEST_HAPPINESS, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(0) + TXTO); - gfx_draw_string_left(dpi, STR_CHEAT_GUEST_ENERGY, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(1) + TXTO); - gfx_draw_string_left(dpi, STR_CHEAT_GUEST_HUNGER, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(2) + TXTO); - gfx_draw_string_left(dpi, STR_CHEAT_GUEST_THIRST, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(3) + TXTO); - gfx_draw_string_left(dpi, STR_CHEAT_GUEST_NAUSEA, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(4) + TXTO); - gfx_draw_string_left(dpi, STR_CHEAT_GUEST_NAUSEA_TOLERANCE, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(5) + TXTO); - gfx_draw_string_left(dpi, STR_CHEAT_GUEST_BATHROOM, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(6) + TXTO); - gfx_draw_string_left(dpi, STR_CHEAT_GUEST_PREFERRED_INTENSITY,NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(7) + TXTO); - gfx_draw_string_left(dpi, STR_CHEAT_GIVE_ALL_GUESTS, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(8) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_HAPPINESS, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(1) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_ENERGY, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(2) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_HUNGER, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(3) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_THIRST, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(4) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_NAUSEA, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(5) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_NAUSEA_TOLERANCE, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(6) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_BATHROOM, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(7) + TXTO); + gfx_draw_string_left(dpi, STR_CHEAT_GUEST_PREFERRED_INTENSITY,NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(8) + TXTO); } } From 107de9bc208bac9495fcd212b6cfd854ef0eafcd Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 9 Jul 2015 16:43:05 +0200 Subject: [PATCH 0225/1173] Fix guilder spacing --- src/localisation/currency.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/localisation/currency.c b/src/localisation/currency.c index 7ef56e22f1..ee97d31904 100644 --- a/src/localisation/currency.c +++ b/src/localisation/currency.c @@ -28,7 +28,7 @@ const rct_currency_spec g_currency_specs[CURRENCY_END] = { { 1000 , "\xA5" , CURRENCY_PREFIX }, // Japanese Yen { 10 , "Pts" , CURRENCY_SUFFIX }, // Spanish Peseta { 1000 , "L" , CURRENCY_PREFIX }, // Italian Lira - { 10 , "fl." , CURRENCY_PREFIX }, // Dutch Guilder + { 10 , "fl. " , CURRENCY_PREFIX }, // Dutch Guilder { 10 , "kr." , CURRENCY_SUFFIX }, // Swedish Krona { 10 , "\xb5" , CURRENCY_PREFIX }, // Euro }; From 451bf7100b5c568e1fed9e366352d8808c27bed2 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Thu, 9 Jul 2015 09:04:24 -0600 Subject: [PATCH 0226/1173] fix #1570 and possibly #1572 --- src/world/map.c | 58 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 37c55ead43..0f7b5c7f6e 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -65,6 +65,7 @@ static void sub_6A87BB(int x, int y); static void map_update_grass_length(int x, int y, rct_map_element *mapElement); static void map_set_grass_length(int x, int y, rct_map_element *mapElement, int length); static void sub_68AE2A(int x, int y); +static void translate_3d_to_2d(int rotation, int *x, int *y); void rotate_map_coordinates(sint16 *x, sint16 *y, int rotation) { @@ -2775,25 +2776,66 @@ void map_invalidate_map_selection_tiles() map_invalidate_tile_full(position->x, position->y); } +void map_get_bounding_box(int ax, int ay, int bx, int by, int *left, int *top, int *right, int *bottom) +{ + int x, y; + x = ax; + y = ay; + translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y); + *left = x; + *right = x; + *top = y; + *bottom = y; + x = bx; + y = ay; + translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y); + if (x < *left) *left = x; + if (x > *right) *right = x; + if (y > *bottom) *bottom = y; + if (y < *top) *top = y; + x = bx; + y = by; + translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y); + if (x < *left) *left = x; + if (x > *right) *right = x; + if (y > *bottom) *bottom = y; + if (y < *top) *top = y; + x = ax; + y = by; + translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y); + if (x < *left) *left = x; + if (x > *right) *right = x; + if (y > *bottom) *bottom = y; + if (y < *top) *top = y; +} + /** * * rct2: 0x0068AAE1 */ void map_invalidate_selection_rect() { - int x, y, x0, y0, x1, y1; + int x0, y0, x1, y1, left, right, top, bottom; + rct_viewport *viewport; if (!(RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & (1 << 0))) return; - x0 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16); - y0 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16); - x1 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, sint16); - y1 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16); + x0 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16) + 16; + y0 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16) + 16; + x1 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, sint16) + 16; + y1 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16) + 16; + map_get_bounding_box(x0, y0, x1, y1, &left, &top, &right, &bottom); + left -= 32; + right += 32; + bottom += 32; + top -= 32 + 2080; - for (x = x0; x <= x1; x++) - for (y = y0; y <= y1; y++) - map_invalidate_tile_full(x, y); + viewport = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); + while (viewport->width != 0) { + viewport_invalidate(viewport, left, top, right, bottom); + viewport++; + } } /** From 4ace6a6e1b460d579f1167a31fdceabeb88ad619 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 9 Jul 2015 17:05:14 +0200 Subject: [PATCH 0227/1173] Fix display of 'No money' checkbox when opened in-game --- src/windows/editor_scenario_options.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/windows/editor_scenario_options.c b/src/windows/editor_scenario_options.c index f505aca17a..7c35c79730 100644 --- a/src/windows/editor_scenario_options.c +++ b/src/windows/editor_scenario_options.c @@ -604,7 +604,8 @@ static void window_editor_scenario_options_financial_invalidate() window_editor_scenario_options_set_pressed_tab(w); - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY_SCENARIO) { + if (((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY_SCENARIO)) || + (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY))) { w->pressed_widgets |= (1 << WIDX_NO_MONEY); for (i = WIDX_INITIAL_CASH; i <= WIDX_FORBID_MARKETING; i++) w->widgets[i].type = WWT_EMPTY; @@ -845,7 +846,8 @@ static void window_editor_scenario_options_guests_invalidate() window_editor_scenario_options_set_pressed_tab(w); - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY_SCENARIO) { + if (((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY_SCENARIO)) || + (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY))) { w->widgets[WIDX_CASH_PER_GUEST].type = WWT_EMPTY; w->widgets[WIDX_CASH_PER_GUEST_INCREASE].type = WWT_EMPTY; w->widgets[WIDX_CASH_PER_GUEST_DECREASE].type = WWT_EMPTY; @@ -1150,7 +1152,8 @@ static void window_editor_scenario_options_park_invalidate() window_editor_scenario_options_set_pressed_tab(w); - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY_SCENARIO) { + if (((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY_SCENARIO)) || + (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY))) { for (i = WIDX_LAND_COST; i <= WIDX_ENTRY_PRICE_DECREASE; i++) w->widgets[i].type = WWT_EMPTY; } else { From 7377de004976137def827d93b15c7acf49e95984 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 9 Jul 2015 17:19:55 +0100 Subject: [PATCH 0228/1173] fix #1578 --- src/world/footpath.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/world/footpath.c b/src/world/footpath.c index faa21d9383..1d48661286 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -867,14 +867,11 @@ static void loc_6A6D7E( goto loc_6A6F1F; } } - if (z + 2 == mapElement->base_height) { - if (footpath_element_is_sloped(mapElement)) { - if (footpath_element_get_slope_direction(mapElement) != (direction ^ 2)) { - return; - } - } else { - goto loc_6A6F1F; + if (z - 2 == mapElement->base_height) { + if (footpath_element_is_sloped(mapElement) && footpath_element_get_slope_direction(mapElement) != (direction ^ 2)) { + return; } + goto loc_6A6F1F; } break; case MAP_ELEMENT_TYPE_TRACK: From c971a260b78f0c4d424bd7c5b6fbd56b43b20347 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Thu, 9 Jul 2015 11:00:46 -0600 Subject: [PATCH 0229/1173] fix #1572 --- src/interface/viewport.c | 32 +++++++++++++++++++------------- src/interface/viewport.h | 1 + src/openrct2.c | 5 ++++- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index c3bcf35d45..671a0c61fd 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -442,22 +442,11 @@ void viewport_update_position(rct_window *window) rct_viewport* viewport = window->viewport; if (!viewport)return; - if (window->viewport_target_sprite != -1){ - rct_sprite* sprite = &g_sprite_list[window->viewport_target_sprite]; - - int height = (map_element_height(0xFFFF & sprite->unknown.x, 0xFFFF & sprite->unknown.y) & 0xFFFF) - 16; - int underground = sprite->unknown.z < height; - - viewport_set_underground_flag(underground, window, viewport); - - int center_x, center_y; - center_2d_coordinates(sprite->unknown.x, sprite->unknown.y, sprite->unknown.z, ¢er_x, ¢er_y, window->viewport); - - sub_6E7DE1(center_x, center_y, window, viewport); + if (window->viewport_target_sprite != -1) { + viewport_update_sprite_follow(window); return; } - sint16 x = viewport->view_width / 2 + window->saved_view_x; sint16 y = viewport->view_height / 2 + window->saved_view_y; sint16 z; @@ -547,6 +536,23 @@ void viewport_update_position(rct_window *window) sub_6E7DE1(x, y, window, viewport); } +void viewport_update_sprite_follow(rct_window *window) +{ + if (window->viewport_target_sprite != -1 && window->viewport){ + rct_sprite* sprite = &g_sprite_list[window->viewport_target_sprite]; + + int height = (map_element_height(0xFFFF & sprite->unknown.x, 0xFFFF & sprite->unknown.y) & 0xFFFF) - 16; + int underground = sprite->unknown.z < height; + + viewport_set_underground_flag(underground, window, window->viewport); + + int center_x, center_y; + center_2d_coordinates(sprite->unknown.x, sprite->unknown.y, sprite->unknown.z, ¢er_x, ¢er_y, window->viewport); + + sub_6E7DE1(center_x, center_y, window, window->viewport); + } +} + /** * * rct2: 0x00685C02 diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 6cbcd5b264..7671852ceb 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -96,6 +96,7 @@ void center_2d_coordinates(int x, int y, int z, int* out_x, int* out_y, rct_view void viewport_create(rct_window *w, int x, int y, int width, int height, int zoom, int center_x, int center_y, int center_z, char flags, sint16 sprite); void viewport_update_pointers(); void viewport_update_position(rct_window *window); +void viewport_update_sprite_follow(rct_window *window); void viewport_render(rct_drawpixelinfo *dpi, rct_viewport *viewport, int left, int top, int right, int bottom); void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, int top, int right, int bottom); diff --git a/src/openrct2.c b/src/openrct2.c index cf8e99cc94..76cf444a9a 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -27,6 +27,7 @@ #include "game.h" #include "hook.h" #include "interface/window.h" +#include "interface/viewport.h" #include "localisation/localisation.h" #include "network/http.h" #include "openrct2.h" @@ -326,7 +327,9 @@ static void openrct2_loop() } // Viewports need to be updated to reduce chopiness of those which follow sprites - window_update_all_viewports(); + for (rct_window *w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++) { + viewport_update_sprite_follow(w); + } platform_process_messages(); rct2_draw(); From e42a11efa3ee9ce70babb69ca28052baf0830ad1 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 9 Jul 2015 18:37:51 +0100 Subject: [PATCH 0230/1173] fix cheats window warnings and improve spacing --- src/windows/cheats.c | 159 ++++++++++++++++++++++--------------------- 1 file changed, 81 insertions(+), 78 deletions(-) diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 350d210470..629058a873 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -139,26 +139,29 @@ enum { }; #pragma region MEASUREMENTS -#define WW 240 -#define WH 300 -#define TAB_HEIGHT 43 -#define XSPA 5 //X spacing -#define YSPA 5 //Y spacing -#define XOS 0 + XSPA //X offset from left -#define YOS TAB_HEIGHT + YSPA //Y offset from top (includes tabs height) -#define BTNW 110 //button width -#define BTNH 16 //button height -#define OPTW 220 //Option (checkbox) width (two colums) -#define OPTH 10 //Option (checkbox) height (two colums) -#define YPL(ROW) YOS + ((BTNH + YSPA) * ROW) -#define HPL(ROW) YPL(ROW) + BTNH -#define OHPL(ROW) YPL(ROW) + OPTH -#define XPL(COL) XOS + ((BTNW + XSPA) * COL) -#define WPL(COL) XPL(COL) + BTNW -#define OWPL XPL(0) + OPTW + +#define WW 249 +#define WH 300 +#define TAB_HEIGHT 43 +#define XSPA 5 // X spacing +#define YSPA 5 // Y spacing +#define XOS 6 + XSPA // X offset from left +#define YOS TAB_HEIGHT + YSPA // Y offset from top (includes tabs height) +#define BTNW 110 // button width +#define BTNH 16 // button height +#define OPTW 220 // Option (checkbox) width (two colums) +#define OPTH 10 // Option (checkbox) height (two colums) +#define GROUP_SPACE 6 + +#define YPL(ROW) ((sint16)(YOS + ((BTNH + YSPA) * ROW))) +#define HPL(ROW) ((sint16)(YPL(ROW) + BTNH)) +#define OHPL(ROW) ((sint16)(YPL(ROW) + OPTH)) +#define XPL(COL) ((sint16)(XOS + ((BTNW + XSPA) * COL))) +#define WPL(COL) ((sint16)(XPL(COL) + BTNW)) +#define OWPL ((sint16)(XPL(0) + OPTW)) #define MIN_BTN_LEFT ((sint16)(XPL(1))) -#define MIN_BTN_RIGHT ((sint16)(WPL(1) / 2)) +#define MIN_BTN_RIGHT ((sint16)(WPL(1) - (BTNW / 2))) #define MAX_BTN_LEFT ((sint16)(XPL(1.5))) #define MAX_BTN_RIGHT ((sint16)(WPL(1))) @@ -177,83 +180,83 @@ enum { static rct_widget window_cheats_money_widgets[] = { MAIN_CHEATS_WIDGETS, - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_5K_MONEY, STR_NONE}, // high money - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_CHEAT_CLEAR_LOAN, STR_NONE }, // Clear loan + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_5K_MONEY, STR_NONE }, // high money + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_CHEAT_CLEAR_LOAN, STR_NONE }, // Clear loan { WIDGETS_END }, }; static rct_widget window_cheats_guests_widgets[] = { MAIN_CHEATS_WIDGETS, - { WWT_GROUPBOX, 1, XPL(0)-3, WPL(1)+3, YPL(0), HPL(9.5), STR_CHEAT_SET_GUESTS_PARAMETERS,STR_NONE }, // Guests parameters group frame - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(1), HPL(1), STR_MAX, STR_NONE }, // happiness max - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(1), HPL(1), STR_MIN, STR_NONE }, // happiness min - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(2), HPL(2), STR_MAX, STR_NONE }, // energy max - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(2), HPL(2), STR_MIN, STR_NONE }, // energy min - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(3), HPL(3), STR_MAX, STR_NONE }, // hunger max - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(3), HPL(3), STR_MIN, STR_NONE }, // hunger min - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(4), HPL(4), STR_MAX, STR_NONE }, // thirst max - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(4), HPL(4), STR_MIN, STR_NONE }, // thirst min - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(5), HPL(5), STR_MAX, STR_NONE }, // nausea max - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(5), HPL(5), STR_MIN, STR_NONE }, // nausea min - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(6), HPL(6), STR_MAX, STR_NONE }, // nausea tolerance max - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(6), HPL(6), STR_MIN, STR_NONE }, // nausea tolerance min - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(7), HPL(7), STR_MAX, STR_NONE }, // bathroom max - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(7), HPL(7), STR_MIN, STR_NONE }, // bathroom min - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(9), HPL(9), STR_CHEAT_MORE_THAN_1, STR_NONE }, // ride intensity > 1 - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(9), HPL(9), STR_CHEAT_LESS_THAN_15, STR_NONE }, // ride intensity < 15 - { WWT_GROUPBOX, 1, XPL(0)-3, WPL(1)+3, YPL(11), HPL(13.5), STR_CHEAT_GIVE_ALL_GUESTS, STR_NONE }, // Guests parameters group frame - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(12), HPL(12), STR_CHEAT_CURRENCY_FORMAT, STR_NONE }, // give guests money - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(12), HPL(12), 2018, STR_NONE }, // give guests park maps - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(13), HPL(13), 2016, STR_NONE }, // give guests balloons - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(13), HPL(13), 2020, STR_NONE }, // give guests umbrellas - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(15), HPL(15), STR_CHEAT_LARGE_TRAM_GUESTS, STR_CHEAT_TIP_LARGE_TRAM_GUESTS }, // large tram - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(15), HPL(15), STR_CHEAT_REMOVE_ALL_GUESTS, STR_CHEAT_TIP_REMOVE_ALL_GUESTS }, // remove all guests - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(16), HPL(16), STR_CHEAT_EXPLODE, STR_CHEAT_TIP_EXPLODE }, // explode guests + { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(0), HPL(9.5), STR_CHEAT_SET_GUESTS_PARAMETERS, STR_NONE }, // Guests parameters group frame + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(1), HPL(1), STR_MAX, STR_NONE }, // happiness max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(1), HPL(1), STR_MIN, STR_NONE }, // happiness min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(2), HPL(2), STR_MAX, STR_NONE }, // energy max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(2), HPL(2), STR_MIN, STR_NONE }, // energy min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(3), HPL(3), STR_MAX, STR_NONE }, // hunger max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(3), HPL(3), STR_MIN, STR_NONE }, // hunger min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(4), HPL(4), STR_MAX, STR_NONE }, // thirst max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(4), HPL(4), STR_MIN, STR_NONE }, // thirst min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(5), HPL(5), STR_MAX, STR_NONE }, // nausea max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(5), HPL(5), STR_MIN, STR_NONE }, // nausea min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(6), HPL(6), STR_MAX, STR_NONE }, // nausea tolerance max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(6), HPL(6), STR_MIN, STR_NONE }, // nausea tolerance min + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(7), HPL(7), STR_MAX, STR_NONE }, // bathroom max + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(7), HPL(7), STR_MIN, STR_NONE }, // bathroom min + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(9), HPL(9), STR_CHEAT_MORE_THAN_1, STR_NONE }, // ride intensity > 1 + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(9), HPL(9), STR_CHEAT_LESS_THAN_15, STR_NONE }, // ride intensity < 15 + { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(11), HPL(13.5), STR_CHEAT_GIVE_ALL_GUESTS, STR_NONE }, // Guests parameters group frame + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(12), HPL(12), STR_CHEAT_CURRENCY_FORMAT, STR_NONE }, // give guests money + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(12), HPL(12), 2018, STR_NONE }, // give guests park maps + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(13), HPL(13), 2016, STR_NONE }, // give guests balloons + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(13), HPL(13), 2020, STR_NONE }, // give guests umbrellas + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(15), HPL(15), STR_CHEAT_LARGE_TRAM_GUESTS, STR_CHEAT_TIP_LARGE_TRAM_GUESTS }, // large tram + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(15), HPL(15), STR_CHEAT_REMOVE_ALL_GUESTS, STR_CHEAT_TIP_REMOVE_ALL_GUESTS }, // remove all guests + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(16), HPL(16), STR_CHEAT_EXPLODE, STR_CHEAT_TIP_EXPLODE }, // explode guests { WIDGETS_END }, }; //Strings for following moved to window_cheats_paint() static rct_widget window_cheats_misc_widgets[] = { MAIN_CHEATS_WIDGETS, - { WWT_GROUPBOX, 1, XPL(0)-3, WPL(1)+3, YPL(0), HPL(5.5), STR_CHEAT_GENERAL_GROUP, STR_NONE }, // General group - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_OPEN_PARK, STR_NONE}, // open / close park - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_PARK_PARAMETERS, STR_CHEAT_TIP_PARK_PARAMETERS}, // Park parameters - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_SANDBOX_MODE, STR_CHEAT_SANDBOX_MODE_TIP}, // Sandbox mode (edit land ownership in-game) - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(2), HPL(2), STR_CHEAT_ZERO_CLEARANCE, STR_NONE}, // Zero Clearance - { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(3), OHPL(3), STR_CHEAT_UNLOCK_PRICES, STR_NONE}, // Unlock all prices - { WWT_CHECKBOX, 1, XPL(0), WPL(0), YPL(4), HPL(4), STR_FORCE_PARK_RATING, STR_NONE}, // Force park rating - { WWT_SPINNER, 1, XPL(1), WPL(1) - 10, YPL(4) + 2, HPL(4) - 3, STR_NONE, STR_NONE }, // park rating - { WWT_DROPDOWN_BUTTON,1,WPL(1) - 10,WPL(1), YPL(4) + 3, YPL(4) + 7, STR_NUMERIC_UP, STR_NONE }, // increase rating - { WWT_DROPDOWN_BUTTON,1,WPL(1) - 10,WPL(1), YPL(4) + 8, YPL(4) + 12,STR_NUMERIC_DOWN, STR_NONE }, // decrease rating - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_CHEAT_WIN_SCENARIO, STR_NONE}, // Win scenario - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(5), HPL(5), STR_CHEAT_HAVE_FUN, STR_NONE}, // Have fun! - { WWT_GROUPBOX, 1, XPL(0)-3, WPL(1)+3, YPL(7), HPL(9.5), STR_CHEAT_CLIMATE_GROUP, STR_NONE }, // Climate group - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(8), HPL(8), STR_CHEAT_FREEZE_CLIMATE, STR_NONE}, // Freeze climate - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(9), HPL(9), STR_CHEAT_FORCE_SUN, STR_NONE}, // Sun - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(9), HPL(9), STR_CHEAT_FORCE_THUNDER, STR_NONE}, // Thunder - { WWT_GROUPBOX, 1, XPL(0)-3, WPL(1)+3, YPL(11), HPL(15.5), STR_CHEAT_STAFF_GROUP, STR_NONE }, // Staff group - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(12), HPL(12), STR_CHEAT_CLEAR_GRASS, STR_NONE}, // Clear grass - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(12), HPL(12), STR_CHEAT_MOWED_GRASS, STR_NONE}, // Mowed grass - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(13), HPL(13), STR_CHEAT_WATER_PLANTS, STR_NONE}, // Water plants - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(13), HPL(13), STR_CHEAT_FIX_VANDALISM, STR_NONE}, // Fix vandalism - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(14), HPL(14), STR_CHEAT_REMOVE_LITTER, STR_NONE}, // Remove litter - { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(15), HPL(15), STR_FAST, STR_NONE }, // Fast staff - { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(15), HPL(15), STR_NORMAL, STR_NONE }, // Normal staff + { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(0), HPL(5.5), STR_CHEAT_GENERAL_GROUP, STR_NONE }, // General group + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_OPEN_PARK, STR_NONE}, // open / close park + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_PARK_PARAMETERS, STR_CHEAT_TIP_PARK_PARAMETERS}, // Park parameters + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_SANDBOX_MODE, STR_CHEAT_SANDBOX_MODE_TIP}, // Sandbox mode (edit land ownership in-game) + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(2), HPL(2), STR_CHEAT_ZERO_CLEARANCE, STR_NONE}, // Zero Clearance + { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(3), OHPL(3), STR_CHEAT_UNLOCK_PRICES, STR_NONE}, // Unlock all prices + { WWT_CHECKBOX, 1, XPL(0), WPL(0), YPL(4), HPL(4), STR_FORCE_PARK_RATING, STR_NONE}, // Force park rating + { WWT_SPINNER, 1, XPL(1), WPL(1) - 10, YPL(4) + 2, HPL(4) - 3, STR_NONE, STR_NONE }, // park rating + { WWT_DROPDOWN_BUTTON, 1, WPL(1) - 10, WPL(1), YPL(4) + 3, YPL(4) + 7, STR_NUMERIC_UP, STR_NONE }, // increase rating + { WWT_DROPDOWN_BUTTON, 1, WPL(1) - 10, WPL(1), YPL(4) + 8, YPL(4) + 12, STR_NUMERIC_DOWN, STR_NONE }, // decrease rating + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_CHEAT_WIN_SCENARIO, STR_NONE}, // Win scenario + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(5), HPL(5), STR_CHEAT_HAVE_FUN, STR_NONE}, // Have fun! + { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(7), HPL(9.5), STR_CHEAT_CLIMATE_GROUP, STR_NONE }, // Climate group + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(8), HPL(8), STR_CHEAT_FREEZE_CLIMATE, STR_NONE}, // Freeze climate + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(9), HPL(9), STR_CHEAT_FORCE_SUN, STR_NONE}, // Sun + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(9), HPL(9), STR_CHEAT_FORCE_THUNDER, STR_NONE}, // Thunder + { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(11), HPL(15.5), STR_CHEAT_STAFF_GROUP, STR_NONE }, // Staff group + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(12), HPL(12), STR_CHEAT_CLEAR_GRASS, STR_NONE}, // Clear grass + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(12), HPL(12), STR_CHEAT_MOWED_GRASS, STR_NONE}, // Mowed grass + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(13), HPL(13), STR_CHEAT_WATER_PLANTS, STR_NONE}, // Water plants + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(13), HPL(13), STR_CHEAT_FIX_VANDALISM, STR_NONE}, // Fix vandalism + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(14), HPL(14), STR_CHEAT_REMOVE_LITTER, STR_NONE}, // Remove litter + { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(15), HPL(15), STR_FAST, STR_NONE }, // Fast staff + { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(15), HPL(15), STR_NORMAL, STR_NONE }, // Normal staff { WIDGETS_END }, }; static rct_widget window_cheats_rides_widgets[] = { MAIN_CHEATS_WIDGETS, - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(0), HPL(0), STR_CHEAT_RENEW_RIDES, STR_NONE}, // Renew rides - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(0), HPL(0), STR_CHEAT_REMOVE_FLAGS, STR_NONE}, // Remove flags - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_MAKE_DESTRUCTABLE, STR_NONE}, // Make destructable - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_FIX_ALL_RIDES, STR_NONE }, // Fix all rides - { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(11),OHPL(11) + 8,STR_CHEAT_410_HILL_LIFT, STR_NONE }, // 410 km/h lift hill - { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(9),OHPL(9), STR_CHEAT_DISABLE_BRAKES_FAILURE,STR_NONE }, // Disable brakes failure - { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(10),OHPL(10), STR_CHEAT_DISABLE_BREAKDOWNS, STR_NONE }, // Disable all breakdowns - { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(8),OHPL(8), STR_CHEAT_BUILD_IN_PAUSE_MODE, STR_NONE }, // Build in pause mode - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_RESET_CRASH_STATUS, STR_NONE }, // Reset crash status + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(0), HPL(0), STR_CHEAT_RENEW_RIDES, STR_NONE}, // Renew rides + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(0), HPL(0), STR_CHEAT_REMOVE_FLAGS, STR_NONE}, // Remove flags + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_MAKE_DESTRUCTABLE, STR_NONE}, // Make destructable + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_FIX_ALL_RIDES, STR_NONE }, // Fix all rides + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(11), OHPL(11) + 8, STR_CHEAT_410_HILL_LIFT, STR_NONE }, // 410 km/h lift hill + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(9), OHPL(9), STR_CHEAT_DISABLE_BRAKES_FAILURE, STR_NONE }, // Disable brakes failure + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(10), OHPL(10), STR_CHEAT_DISABLE_BREAKDOWNS, STR_NONE }, // Disable all breakdowns + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(8), OHPL(8), STR_CHEAT_BUILD_IN_PAUSE_MODE, STR_NONE }, // Build in pause mode + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_RESET_CRASH_STATUS, STR_NONE }, // Reset crash status { WIDGETS_END }, }; From f906391c9d649e7dfab713abaabda0610cbd4853 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 10 Jul 2015 01:39:16 +0100 Subject: [PATCH 0231/1173] remove registers from window events and changed to typed signatures --- src/input.c | 12 +- src/interface/window.c | 218 +++--- src/interface/window.h | 182 +---- src/openrct2.c | 6 +- src/windows/about.c | 74 +- src/windows/banner.c | 117 ++- src/windows/changelog.c | 108 +-- src/windows/cheats.c | 286 ++++---- src/windows/clear_scenery.c | 88 +-- src/windows/demolish_ride_prompt.c | 100 ++- src/windows/dropdown.c | 187 +++-- src/windows/editor_bottom_toolbar.c | 100 ++- src/windows/editor_inventions_list.c | 226 +++--- src/windows/editor_main.c | 70 +- src/windows/editor_object_selection.c | 173 ++--- src/windows/editor_objective_options.c | 211 ++---- src/windows/editor_scenario_options.c | 248 +++---- src/windows/error.c | 77 +- src/windows/finances.c | 463 +++++------- src/windows/footpath.c | 119 +--- src/windows/game_bottom_toolbar.c | 105 +-- src/windows/guest.c | 695 ++++++++---------- src/windows/guest_list.c | 121 ++-- src/windows/install_track.c | 105 ++- src/windows/land.c | 92 +-- src/windows/land_rights.c | 90 +-- src/windows/loadsave.c | 207 +++--- src/windows/main.c | 68 +- src/windows/map.c | 205 ++---- src/windows/map_tooltip.c | 66 +- src/windows/mapgen.c | 253 +++---- src/windows/maze_construction.c | 137 ++-- src/windows/music_credits.c | 89 +-- src/windows/new_campaign.c | 84 +-- src/windows/new_ride.c | 108 +-- src/windows/news.c | 111 ++- src/windows/options.c | 110 +-- src/windows/park.c | 643 +++++++---------- src/windows/publisher_credits.c | 89 +-- src/windows/research.c | 163 ++--- src/windows/ride.c | 945 +++++++++---------------- src/windows/ride_construction.c | 117 ++- src/windows/ride_list.c | 122 ++-- src/windows/save_prompt.c | 82 +-- src/windows/scenery.c | 143 ++-- src/windows/shortcut_key_change.c | 83 +-- src/windows/shortcut_keys.c | 115 +-- src/windows/sign.c | 175 ++--- src/windows/staff.c | 337 ++++----- src/windows/staff_fire_prompt.c | 85 +-- src/windows/staff_list.c | 149 ++-- src/windows/text_input.c | 98 ++- src/windows/themes.c | 151 ++-- src/windows/tile_inspector.c | 137 ++-- src/windows/title_command_editor.c | 107 +-- src/windows/title_editor.c | 146 ++-- src/windows/title_exit.c | 79 +-- src/windows/title_logo.c | 68 +- src/windows/title_menu.c | 95 ++- src/windows/title_options.c | 79 +-- src/windows/title_scenarioselect.c | 109 +-- src/windows/tooltip.c | 68 +- src/windows/top_toolbar.c | 126 ++-- src/windows/track_list.c | 133 ++-- src/windows/track_manage.c | 182 ++--- src/windows/track_place.c | 140 ++-- src/windows/viewport.c | 83 +-- src/windows/water.c | 90 +-- 68 files changed, 4260 insertions(+), 6590 deletions(-) diff --git a/src/input.c b/src/input.c index d967cd4002..8ca4c6ee63 100644 --- a/src/input.c +++ b/src/input.c @@ -956,7 +956,7 @@ void process_mouse_over(int x, int y) int widgetId; int cursorId; - int eax, ebx, ecx, edx, esi, edi, ebp; + int ebx, esi, edi, ebp; cursorId = CURSOR_ARROW; RCT2_GLOBAL(0x9A9808, sint16) = -1; @@ -988,7 +988,8 @@ void process_mouse_over(int x, int y) ebx = ebx & 0xFFFFFF00; edi = cursorId; esi = (int)subWindow; - RCT2_CALLFUNC_X(subWindow->event_handlers[WE_UNKNOWN_0E], &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + // Not sure what this is for, no windows actually implement a handler + // RCT2_CALLFUNC_X(subWindow->event_handlers[WE_UNKNOWN_0E], &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); cursorId = edi; if ((ebx & 0xFF) != 0) { @@ -1354,10 +1355,9 @@ void game_handle_keyboard_input() } else { w = window_find_by_class(WC_TEXTINPUT); - if (w != NULL){ - ((void(*)(int, rct_window*))w->event_handlers[WE_TEXT_INPUT])(key, w); - } - else if (!gUsingWidgetTextBox) { + if (w != NULL) { + window_text_input_key(w, key); + } else if (!gUsingWidgetTextBox) { keyboard_shortcut_handle(key); } } diff --git a/src/interface/window.c b/src/interface/window.c index 06ee517216..6f6221de8f 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -31,6 +31,7 @@ #include "viewport.h" #include "../localisation/string_ids.h" #include "../localisation/localisation.h" +#include "../cursors.h" #define RCT2_FIRST_WINDOW (RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window)) #define RCT2_LAST_WINDOW (RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*) - 1) @@ -352,7 +353,7 @@ static void window_all_wheel_input() * @param flags (ch) * @param class (cl) */ -rct_window *window_create(int x, int y, int width, int height, uint32 *event_handlers, rct_windowclass cls, uint16 flags) +rct_window *window_create(int x, int y, int width, int height, rct_window_event_list *event_handlers, rct_windowclass cls, uint16 flags) { rct_window *w; // Check if there are any window slots left @@ -507,7 +508,7 @@ static bool sub_6EA95D(int x, int y, int width, int height) * @param flags (ch) * @param class (cl) */ -rct_window *window_create_auto_pos(int width, int height, uint32 *event_handlers, rct_windowclass cls, uint16 flags) +rct_window *window_create_auto_pos(int width, int height, rct_window_event_list *event_handlers, rct_windowclass cls, uint16 flags) { rct_window *w; int x, y; @@ -629,7 +630,7 @@ foundSpace: return window_create(x, y, width, height, event_handlers, cls, flags); } -rct_window *window_create_centred(int width, int height, uint32 *event_handlers, rct_windowclass cls, uint16 flags) +rct_window *window_create_centred(int width, int height, rct_window_event_list *event_handlers, rct_windowclass cls, uint16 flags) { int x, y; @@ -996,6 +997,8 @@ void window_init_scroll_widgets(rct_window *w) scroll = &w->scrolls[scroll_index]; scroll->flags = 0; + width = 0; + height = 0; window_get_scroll_size(w, scroll_index, &width, &height); scroll->h_left = 0; scroll->h_right = width + 1; @@ -1033,6 +1036,8 @@ void window_update_scroll_widgets(rct_window *w) continue; scroll = &w->scrolls[scrollIndex]; + width = 0; + height = 0; window_get_scroll_size(w, scrollIndex, &width, &height); if (height == 0){ scroll->v_top = 0; @@ -1813,211 +1818,180 @@ void window_guest_list_init_vars_b() RCT2_GLOBAL(0x00F1AF20, uint16) = 0; } -static void window_event_call_address(int address, rct_window *w) +void window_event_close_call(rct_window *w) { - #ifdef _MSC_VER - __asm { - push address - push w - mov esi, w - call[esp + 4] - add esp, 8 - } - #else - __asm__ ( "\ - push %[address]\n\ - mov eax, %[w] \n\ - push eax \n\ - mov esi, %[w] \n\ - call [esp+4] \n\ - add esp, 8 \n\ - " : [address] "+m" (address), [w] "+m" (w) : : "eax", "esi" ); - #endif + if (w->event_handlers->close != NULL) + w->event_handlers->close(w); } -void window_event_close_call(rct_window* w) +void window_event_mouse_up_call(rct_window *w, int widgetIndex) { - window_event_call_address(w->event_handlers[WE_CLOSE], w); + if (w->event_handlers->mouse_up != NULL) + w->event_handlers->mouse_up(w, widgetIndex); } -void window_event_mouse_up_call(rct_window* w, int widgetIndex) +void window_event_resize_call(rct_window *w) { - RCT2_CALLPROC_X(w->event_handlers[WE_MOUSE_UP], 0, 0, 0, widgetIndex, (int)w, (int)&(w->event_handlers[widgetIndex]), 0); -} - -void window_event_resize_call(rct_window* w) -{ - window_event_call_address(w->event_handlers[WE_RESIZE], w); + if (w->event_handlers->resize != NULL) + w->event_handlers->resize(w); } void window_event_mouse_down_call(rct_window *w, int widgetIndex) { - int address = w->event_handlers[WE_MOUSE_DOWN]; - rct_widget *widget = &w->widgets[widgetIndex]; - - #ifdef _MSC_VER - __asm { - push ebp - push address - push widget - push w - push widgetIndex - mov edi, widget - mov edx, widgetIndex - mov esi, w - call[esp + 12] - add esp, 16 - pop ebp - } - #else - __asm__("\ - push ebp \n\ - push %[address]\n\ - mov edi, %[widget] \n\ - mov eax, %[w] \n\ - mov edx, %[widgetIndex] \n\ - push edi \n\ - push eax \n\ - push edx \n\ - mov esi, %[w] \n\ - call [esp+12] \n\ - add esp, 16 \n\ - pop ebp \n\ - " :[address] "+m" (address), [w] "+m" (w), [widget] "+m" (widget), [widgetIndex] "+m" (widgetIndex): : "eax", "esi", "edx", "edi" - ); - #endif + if (w->event_handlers->mouse_down != NULL) + w->event_handlers->mouse_down(widgetIndex, w, &w->widgets[widgetIndex]); } -void window_event_dropdown_call(rct_window* w, int widgetIndex, int dropdownIndex) +void window_event_dropdown_call(rct_window *w, int widgetIndex, int dropdownIndex) { - RCT2_CALLPROC_X(w->event_handlers[WE_DROPDOWN], dropdownIndex, 0, 0, widgetIndex, (int)w, 0, 0); + if (w->event_handlers->dropdown != NULL) + w->event_handlers->dropdown(w, widgetIndex, dropdownIndex); } -void window_event_unknown_05_call(rct_window* w) +void window_event_unknown_05_call(rct_window *w) { - window_event_call_address(w->event_handlers[WE_UNKNOWN_05], w); + if (w->event_handlers->unknown_05 != NULL) + w->event_handlers->unknown_05(w); } void window_event_update_call(rct_window *w) { - window_event_call_address(w->event_handlers[WE_UPDATE], w); + if (w->event_handlers->update != NULL) + w->event_handlers->update(w); } -void window_event_unknown_07_call(rct_window* w) +void window_event_unknown_07_call(rct_window *w) { - window_event_call_address(w->event_handlers[WE_UNKNOWN_07], w); + if (w->event_handlers->unknown_07 != NULL) + w->event_handlers->unknown_07(w); } -void window_event_unknown_08_call(rct_window* w) +void window_event_unknown_08_call(rct_window *w) { - window_event_call_address(w->event_handlers[WE_UNKNOWN_08], w); + if (w->event_handlers->unknown_08 != NULL) + w->event_handlers->unknown_08(w); } -void window_event_tool_update_call(rct_window* w, int widgetIndex, int x, int y) +void window_event_tool_update_call(rct_window *w, int widgetIndex, int x, int y) { - RCT2_CALLPROC_X(w->event_handlers[WE_TOOL_UPDATE], x, y, 0, widgetIndex, (int)w, 0, 0); + if (w->event_handlers->tool_update != NULL) + w->event_handlers->tool_update(w, widgetIndex, x, y); } -void window_event_tool_down_call(rct_window* w, int widgetIndex, int x, int y) +void window_event_tool_down_call(rct_window *w, int widgetIndex, int x, int y) { - RCT2_CALLPROC_X(w->event_handlers[WE_TOOL_DOWN], x, y, 0, widgetIndex, (int)w, 0, 0); + if (w->event_handlers->tool_down != NULL) + w->event_handlers->tool_down(w, widgetIndex, x, y); } -void window_event_tool_drag_call(rct_window* w, int widgetIndex, int x, int y) +void window_event_tool_drag_call(rct_window *w, int widgetIndex, int x, int y) { - RCT2_CALLPROC_X(w->event_handlers[WE_TOOL_DRAG], x, y, 0, widgetIndex, (int)w, 0, 0); + if (w->event_handlers->tool_drag != NULL) + w->event_handlers->tool_drag(w, widgetIndex, x, y); } -void window_event_tool_up_call(rct_window* w, int widgetIndex, int x, int y) +void window_event_tool_up_call(rct_window *w, int widgetIndex, int x, int y) { - RCT2_CALLPROC_X(w->event_handlers[WE_TOOL_UP], x, y, 0, widgetIndex, (int)w, 0, 0); + if (w->event_handlers->tool_up != NULL) + w->event_handlers->tool_up(w, widgetIndex, x, y); } -void window_event_tool_abort_call(rct_window* w, int widgetIndex) +void window_event_tool_abort_call(rct_window *w, int widgetIndex) { - RCT2_CALLPROC_X(w->event_handlers[WE_TOOL_ABORT], 0, 0, 0, widgetIndex, (int)w, 0, 0); + if (w->event_handlers->tool_abort != NULL) + w->event_handlers->tool_abort(w, widgetIndex); } -void window_event_unknown_0E_call(rct_window* w) +void window_event_unknown_0E_call(rct_window *w) { - window_event_call_address(w->event_handlers[WE_UNKNOWN_0E], w); + if (w->event_handlers->unknown_0E != NULL) + w->event_handlers->unknown_0E(w); } -int window_get_scroll_size(rct_window *w, int scrollIndex, int *width, int *height) +void window_get_scroll_size(rct_window *w, int scrollIndex, int *width, int *height) { - rct_widget *widget = window_get_scroll_widget(w, scrollIndex); - int widgetIndex = window_get_widget_index(w, widget); + if (w->event_handlers->get_scroll_size != NULL) { + rct_widget *widget = window_get_scroll_widget(w, scrollIndex); + int widgetIndex = window_get_widget_index(w, widget); - int eax = scrollIndex, ebx = scrollIndex * sizeof(rct_scroll), ecx = 0, edx = 0, esi = (int)w, edi = widgetIndex * sizeof(rct_widget), ebp = 0; - RCT2_CALLFUNC_X(w->event_handlers[WE_SCROLL_GETSIZE], & eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - *width = ecx; - *height = edx; - return 1; + w->event_handlers->get_scroll_size(w, scrollIndex, width, height); + } } -void window_event_scroll_mousedown_call(rct_window* w, int scrollIndex, int x, int y) +void window_event_scroll_mousedown_call(rct_window *w, int scrollIndex, int x, int y) { - RCT2_CALLPROC_X(w->event_handlers[WE_SCROLL_MOUSEDOWN], scrollIndex, 0, x, y, (int)w, (int)window_get_scroll_widget(w, scrollIndex), 0); + if (w->event_handlers->scroll_mousedown != NULL) + w->event_handlers->scroll_mousedown(w, scrollIndex, x, y); } -void window_event_scroll_mousedrag_call(rct_window* w, int scrollIndex, int x, int y) +void window_event_scroll_mousedrag_call(rct_window *w, int scrollIndex, int x, int y) { - RCT2_CALLPROC_X(w->event_handlers[WE_SCROLL_MOUSEDRAG], scrollIndex, 0, x, y, (int)w, (int)window_get_scroll_widget(w, scrollIndex), 0); + if (w->event_handlers->scroll_mousedrag != NULL) + w->event_handlers->scroll_mousedrag(w, scrollIndex, x, y); } -void window_event_scroll_mouseover_call(rct_window* w, int scrollIndex, int x, int y) +void window_event_scroll_mouseover_call(rct_window *w, int scrollIndex, int x, int y) { - RCT2_CALLPROC_X(w->event_handlers[WE_SCROLL_MOUSEOVER], scrollIndex, 0, x, y, (int)w, (int)window_get_scroll_widget(w, scrollIndex), 0); + if (w->event_handlers->scroll_mouseover != NULL) + w->event_handlers->scroll_mouseover(w, scrollIndex, x, y); } void window_event_textinput_call(rct_window *w, int widgetIndex, char *text) { - RCT2_CALLPROC_X(w->event_handlers[WE_TEXT_INPUT], 0, 0, text != NULL, widgetIndex, (int)w, (int)text, 0); + if (w->event_handlers->text_input != NULL) + w->event_handlers->text_input(w, widgetIndex, text); } -void window_event_unknown_14_call(rct_window* w) +void window_event_unknown_14_call(rct_window *w) { - window_event_call_address(w->event_handlers[WE_UNKNOWN_14], w); + if (w->event_handlers->unknown_14 != NULL) + w->event_handlers->unknown_14(w); } -void window_event_unknown_15_call(rct_window* w, int scrollIndex, int scrollAreaType) +void window_event_unknown_15_call(rct_window *w, int scrollIndex, int scrollAreaType) { - rct_widget *widget = window_get_scroll_widget(w, scrollIndex); - RCT2_CALLPROC_X(w->event_handlers[WE_UNKNOWN_15], scrollIndex * sizeof(rct_scroll), 0, scrollAreaType, scrollIndex, (int)w, (int)widget, 0); + if (w->event_handlers->unknown_15 != NULL) + w->event_handlers->unknown_15(w, scrollIndex, scrollAreaType); } -rct_string_id window_event_tooltip_call(rct_window* w, int widgetIndex) +rct_string_id window_event_tooltip_call(rct_window *w, int widgetIndex) { - int eax = widgetIndex, ebx, ecx, edx, esi = (int)w, edi, ebp; - RCT2_CALLFUNC_X(w->event_handlers[WE_TOOLTIP], &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - return eax & 0xFFFF; + rct_string_id result = STR_NONE; + if (w->event_handlers->tooltip != NULL) + w->event_handlers->tooltip(w, widgetIndex, &result); + return result; } -int window_event_cursor_call(rct_window* w, int widgetIndex, int x, int y) +int window_event_cursor_call(rct_window *w, int widgetIndex, int x, int y) { - int eax = widgetIndex, ebx = -1, ecx = x, edx = y, esi = (int)w, edi = (int)&w->widgets[widgetIndex], ebp; - RCT2_CALLFUNC_X(w->event_handlers[WE_CURSOR], &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - return ebx; + int cursorId = CURSOR_ARROW; + if (w->event_handlers->cursor != NULL) + w->event_handlers->cursor(w, widgetIndex, x, y, &cursorId); + return cursorId; } -void window_event_moved_call(rct_window* w, int x, int y) +void window_event_moved_call(rct_window *w, int x, int y) { - RCT2_CALLPROC_X(w->event_handlers[WE_MOVED], 0, 0, x, y, (int)w, 0, 0); + if (w->event_handlers->moved != NULL) + w->event_handlers->moved(w, x, y); } -void window_event_invalidate_call(rct_window* w) +void window_event_invalidate_call(rct_window *w) { - RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0); + if (w->event_handlers->invalidate != NULL) + w->event_handlers->invalidate(w); } -void window_event_paint_call(rct_window* w, rct_drawpixelinfo *dpi) +void window_event_paint_call(rct_window *w, rct_drawpixelinfo *dpi) { - RCT2_CALLPROC_X(w->event_handlers[WE_PAINT], 0, 0, 0, 0, (int)w, (int)dpi, 0); + if (w->event_handlers->paint != NULL) + w->event_handlers->paint(w, dpi); } -void window_event_scroll_paint_call(rct_window* w, rct_drawpixelinfo *dpi, int scrollIndex) +void window_event_scroll_paint_call(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - RCT2_CALLPROC_X(w->event_handlers[WE_SCROLL_PAINT], scrollIndex, 0, 0, 0, (int)w, (int)dpi, 0); + if (w->event_handlers->scroll_paint != NULL) + w->event_handlers->scroll_paint(w, dpi, scrollIndex); } /** diff --git a/src/interface/window.h b/src/interface/window.h index 6de725f398..3d20200d32 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -134,6 +134,36 @@ enum{ }; #define VIEWPORT_FOCUS_Y_MASK 0x3FFF +typedef struct { + void (*close)(struct rct_window*); + void (*mouse_up)(struct rct_window*, int); + void (*resize)(struct rct_window*); + void (*mouse_down)(int, struct rct_window*, rct_widget*); + void (*dropdown)(struct rct_window*, int, int); + void (*unknown_05)(struct rct_window*); + void (*update)(struct rct_window*); + void (*unknown_07)(struct rct_window*); + void (*unknown_08)(struct rct_window*); + void (*tool_update)(struct rct_window*, int, int, int); + void (*tool_down)(struct rct_window*, int, int, int); + void (*tool_drag)(struct rct_window*, int, int, int); + void (*tool_up)(struct rct_window*, int, int, int); + void (*tool_abort)(struct rct_window*, int); + void (*unknown_0E)(struct rct_window*); + void (*get_scroll_size)(struct rct_window*, int, int*, int*); + void (*scroll_mousedown)(struct rct_window*, int, int, int); + void (*scroll_mousedrag)(struct rct_window*, int, int, int); + void (*scroll_mouseover)(struct rct_window*, int, int, int); + void (*text_input)(struct rct_window*, int, char*); + void (*unknown_14)(struct rct_window*); + void (*unknown_15)(struct rct_window*, int, int); + void (*tooltip)(struct rct_window*, int, rct_string_id*); + void (*cursor)(struct rct_window*, int, int, int, int*); + void (*moved)(struct rct_window*, int, int); + void (*invalidate)(struct rct_window*); + void (*paint)(struct rct_window*, rct_drawpixelinfo*); + void (*scroll_paint)(struct rct_window*, rct_drawpixelinfo*, int); +} rct_window_event_list; typedef struct{ sint16 campaign_type; @@ -192,7 +222,7 @@ typedef struct { * size: 0x4C0 */ typedef struct rct_window { - uint32* event_handlers; // 0x000 + rct_window_event_list* event_handlers; // 0x000 rct_viewport* viewport; // 0x004 uint64 enabled_widgets; // 0x008 uint64 disabled_widgets; // 0x010 @@ -461,9 +491,9 @@ extern ride_list_item _window_track_list_item; void window_dispatch_update_all(); void window_update_all_viewports(); void window_update_all(); -rct_window *window_create(int x, int y, int width, int height, uint32 *event_handlers, rct_windowclass cls, uint16 flags); -rct_window *window_create_auto_pos(int width, int height, uint32 *event_handlers, rct_windowclass cls, uint16 flags); -rct_window *window_create_centred(int width, int height, uint32 *event_handlers, rct_windowclass cls, uint16 flags); +rct_window *window_create(int x, int y, int width, int height, rct_window_event_list *event_handlers, rct_windowclass cls, uint16 flags); +rct_window *window_create_auto_pos(int width, int height, rct_window_event_list *event_handlers, rct_windowclass cls, uint16 flags); +rct_window *window_create_centred(int width, int height, rct_window_event_list *event_handlers, rct_windowclass cls, uint16 flags); void window_close(rct_window *window); void window_close_by_class(rct_windowclass cls); void window_close_by_number(rct_windowclass cls, rct_windownumber number); @@ -502,6 +532,7 @@ void window_zoom_in(rct_window *w); void window_zoom_out(rct_window *w); void window_show_textinput(rct_window *w, int widgetIndex, uint16 title, uint16 text, int value); +void window_text_input_key(rct_window* w, int key); void window_draw(rct_window *w, int left, int top, int right, int bottom); void window_draw_widgets(rct_window *w, rct_drawpixelinfo *dpi); @@ -631,7 +662,7 @@ void window_event_tool_drag_call(rct_window* w, int widgetIndex, int x, int y); void window_event_tool_up_call(rct_window* w, int widgetIndex, int x, int y); void window_event_tool_abort_call(rct_window* w, int widgetIndex); void window_event_unknown_0E_call(rct_window* w); -int window_get_scroll_size(rct_window *w, int scrollIndex, int *width, int *height); +void window_get_scroll_size(rct_window *w, int scrollIndex, int *width, int *height); void window_event_scroll_mousedown_call(rct_window* w, int scrollIndex, int x, int y); void window_event_scroll_mousedrag_call(rct_window* w, int scrollIndex, int x, int y); void window_event_scroll_mouseover_call(rct_window* w, int scrollIndex, int x, int y); @@ -661,145 +692,4 @@ bool land_tool_is_active(); //Cheat: in-game land ownership editor void toggle_ingame_land_ownership_editor(); -#ifdef _MSC_VER - #define window_get_register(w) \ - __asm mov w, esi - - #define window_widget_get_registers(w, widgetIndex) \ - __asm mov widgetIndex, dx \ - __asm mov w, esi - - #define window_dropdown_get_registers(w, widgetIndex, dropdownIndex) \ - __asm mov dropdownIndex, ax \ - __asm mov widgetIndex, dx \ - __asm mov w, esi - - #define window_text_input_get_registers(w, widgetIndex, result, text) \ - __asm mov widgetIndex, dx \ - __asm mov result, cl \ - __asm mov w, esi \ - __asm mov text, edi - - #define window_scroll_get_registers(w, i) \ - __asm mov i, ax \ - __asm mov w, esi - - #define window_scrollmouse_get_registers(w, i, x, y) \ - __asm mov i, ax \ - __asm mov x, cx \ - __asm mov y, dx \ - __asm mov w, esi - - #define window_tool_get_registers(w, widgetIndex, x, y) \ - __asm mov x, ax \ - __asm mov y, bx \ - __asm mov widgetIndex, dx \ - __asm mov w, esi - - #define window_textinput_get_registers(w, widgetIndex, result, text) \ - __asm mov result, cl \ - __asm mov widgetIndex, dx \ - __asm mov w, esi \ - __asm mov text, edi - - #define window_paint_get_registers(w, dpi) \ - __asm mov w, esi \ - __asm mov dpi, edi - - #define window_scrollpaint_get_registers(w, dpi, i) \ - __asm mov i, ax \ - __asm mov w, esi \ - __asm mov dpi, edi - - #define window_scrollsize_set_registers(width, height) \ - __asm mov ecx, width \ - __asm mov edx, height - - #define window_cursor_get_registers(w, widgetIndex, x, y) \ - __asm mov widgetIndex, ax \ - __asm mov x, cx \ - __asm mov y, dx \ - __asm mov w, esi - - #define window_cursor_set_registers(cursorId) \ - __asm mov ebx, cursorId - - #define window_tooltip_get_registers(w, widgetIndex) \ - __asm mov widgetIndex, ax \ - __asm mov w, esi - - #define window_tooltip_set_registers(value) \ - __asm mov ax, value - -#else - #define window_get_register(w) \ - __asm__ ( "mov %["#w"], esi " : [w] "+m" (w) ); - - #define window_widget_get_registers(w, widgetIndex) \ - __asm__ ( "mov %["#widgetIndex"], dx " : [widgetIndex] "+m" (widgetIndex) ); \ - __asm__ ( "mov %["#w"], esi " : [w] "+m" (w) ); - - #define window_dropdown_get_registers(w, widgetIndex, dropdownIndex) \ - __asm__ ( "mov %["#dropdownIndex"], ax " : [dropdownIndex] "+m" (dropdownIndex) ); \ - __asm__ ( "mov %["#widgetIndex"], dx " : [widgetIndex] "+m" (widgetIndex) ); \ - __asm__ ( "mov %["#w"], esi " : [w] "+m" (w) ); - - #define window_text_input_get_registers(w, widgetIndex, result, text) \ - __asm__ ( "mov %[_cl], cl " : [_cl] "+m" (result) ); \ - __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); \ - __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); \ - __asm__ ( "mov %[text], edi " : [text] "+m" (text) ); - - #define window_scroll_get_registers(w, i) \ - __asm__ ( "mov %["#i"], ax " : [i] "+m" (i) ); \ - __asm__ ( "mov %["#w"], esi " : [w] "+m" (w) ); - - #define window_scrollmouse_get_registers(w, i, x, y) \ - __asm__ ( "mov %["#i"], ax " : [i] "+m" (i) ); \ - __asm__ ( "mov %["#x"], cx " : [x] "+m" (x) ); \ - __asm__ ( "mov %["#y"], dx " : [y] "+m" (y) ); \ - __asm__ ( "mov %["#w"], esi " : [w] "+m" (w) ); - - #define window_tool_get_registers(w, widgetIndex, x, y) \ - __asm__ ( "mov %["#x"], ax " : [x] "+m" (x) ); \ - __asm__ ( "mov %["#y"], bx " : [y] "+m" (y) ); \ - __asm__ ( "mov %["#widgetIndex"], dx " : [widgetIndex] "+m" (widgetIndex) ); \ - __asm__ ( "mov %["#w"], esi " : [w] "+m" (w) ); - - #define window_textinput_get_registers(w, widgetIndex, result, text) \ - __asm__ ( "mov %[result], cl " : [result] "+m" (result) ); \ - __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); \ - __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); \ - __asm__ ( "mov %[text], edi " : [text] "+m" (text) ); - - #define window_paint_get_registers(w, dpi) \ - __asm__ ( "mov %["#w"], esi " : [w] "+m" (w) ); \ - __asm__ ( "mov %["#dpi"], edi " : [dpi] "+m" (dpi) ); - - #define window_scrollpaint_get_registers(w, dpi, i) \ - __asm__ ( "mov %["#i"], ax " : [i] "+m" (i) ); \ - __asm__ ( "mov %["#w"], esi " : [w] "+m" (w) ); \ - __asm__ ( "mov %["#dpi"], edi " : [dpi] "+m" (dpi) ); - - #define window_scrollsize_set_registers(width, height) \ - __asm__ ( "mov ecx, %[width] " : [width] "+m" (width) ); \ - __asm__ ( "mov edx, %[height] " : [height] "+m" (height) ); - - #define window_cursor_get_registers(w, widgetIndex, x, y) \ - __asm__ ( "mov %["#widgetIndex"], ax " : [widgetIndex] "+m" (widgetIndex) ); \ - __asm__ ( "mov %["#x"], cx " : [x] "+m" (x) ); \ - __asm__ ( "mov %["#y"], dx " : [y] "+m" (y) ); \ - __asm__ ( "mov %["#w"], esi " : [w] "+m" (w) ); - - #define window_cursor_set_registers(cursorId) \ - __asm__ ( "mov ebx, %[cursorId] " : [cursorId] "+m" (cursorId) ); - - #define window_tooltip_get_registers(w, widgetIndex) \ - __asm__ ( "mov %["#widgetIndex"], ax " : [widgetIndex] "+m" (widgetIndex) ); \ - __asm__ ( "mov %["#w"], esi " : [w] "+m" (w) ); - - #define window_tooltip_set_registers(value) \ - __asm__ ( "mov ax, %["#value"] " : [value] "+m" (value) ); -#endif - #endif diff --git a/src/openrct2.c b/src/openrct2.c index 76cf444a9a..9d491bfcef 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -186,13 +186,15 @@ bool openrct2_initialise() title_sequences_set_default(); title_sequences_load_presets(); + // Hooks to allow RCT2 to call OpenRCT2 functions instead + addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0); // remove after all drawing is decompiled + addhook(0x006E7499, (int)gfx_redraw_screen_rect, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0); // remove when 0x6E7FF3 is decompiled + if (!rct2_init()) return false; openrct2_copy_original_user_files_over(); - addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){EAX, EBX, EDX, EBP, END}, 0); // remove after all drawing is decompiled - Mixer_Init(NULL); return true; } diff --git a/src/windows/about.c b/src/windows/about.c index 9cc7045cd9..c0c18c75dc 100644 --- a/src/windows/about.c +++ b/src/windows/about.c @@ -42,39 +42,38 @@ rct_widget window_about_widgets[] = { { WIDGETS_END }, }; -static void window_about_emptysub() { } -static void window_about_mouseup(); -static void window_about_paint(); +static void window_about_mouseup(rct_window *w, int widgetIndex); +static void window_about_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_about_events[] = { - window_about_emptysub, +static rct_window_event_list window_about_events = { + NULL, window_about_mouseup, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, - window_about_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_about_paint, - window_about_emptysub + NULL }; /** @@ -93,7 +92,7 @@ void window_about_open() window = window_create_centred( 400, 330, - (uint32*)window_about_events, + &window_about_events, WC_ABOUT, 0 ); @@ -110,13 +109,8 @@ void window_about_open() * * rct2: 0x0066D4D5 */ -static void window_about_mouseup() +static void window_about_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -134,13 +128,9 @@ static void window_about_mouseup() * * rct2: 0x0066D321 */ -static void window_about_paint() +static void window_about_paint(rct_window *w, rct_drawpixelinfo *dpi) { int x, y; - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); window_draw_widgets(w, dpi); diff --git a/src/windows/banner.c b/src/windows/banner.c index b33b94fcdb..6116d0ac0c 100644 --- a/src/windows/banner.c +++ b/src/windows/banner.c @@ -63,44 +63,43 @@ rct_widget window_banner_widgets[] = { { WIDGETS_END }, }; -static void window_banner_emptysub() { } -static void window_banner_mouseup(); +static void window_banner_mouseup(rct_window *w, int widgetIndex); static void window_banner_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_banner_dropdown(); -static void window_banner_textinput(); -static void window_banner_invalidate(); -static void window_banner_paint(); -static void window_banner_unknown_14(); +static void window_banner_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); +static void window_banner_textinput(rct_window *w, int widgetIndex, char *text); +static void window_banner_unknown_14(rct_window *w); +static void window_banner_invalidate(rct_window *w); +static void window_banner_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_banner_events[] = { - window_banner_emptysub, +static rct_window_event_list window_banner_events = { + NULL, window_banner_mouseup, - window_banner_emptysub, + NULL, window_banner_mousedown, window_banner_dropdown, - window_banner_emptysub, - window_banner_emptysub, - window_banner_emptysub, - window_banner_emptysub, - window_banner_emptysub, - window_banner_emptysub, - window_banner_emptysub, - window_banner_emptysub, - window_banner_emptysub, - window_banner_emptysub, - window_banner_emptysub, - window_banner_emptysub, - window_banner_emptysub, - window_banner_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_banner_textinput, window_banner_unknown_14, - window_banner_emptysub, - window_banner_emptysub, - window_banner_emptysub, - window_banner_emptysub, + NULL, + NULL, + NULL, + NULL, window_banner_invalidate, - window_banner_paint, - window_banner_emptysub + window_banner_paint, + NULL }; /** @@ -118,7 +117,7 @@ void window_banner_open(rct_windownumber number) if (w != NULL) return; - w = window_create_auto_pos(WW, WH, (uint32*)window_banner_events, WC_BANNER, WF_2); + w = window_create_auto_pos(WW, WH, &window_banner_events, WC_BANNER, WF_2); w->widgets = window_banner_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | @@ -174,13 +173,8 @@ void window_banner_open(rct_windownumber number) } /* rct2: 0x6ba4d6*/ -static void window_banner_mouseup() +static void window_banner_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - rct_banner* banner = &gBanners[w->number]; int x = banner->x << 5; int y = banner->y << 5; @@ -251,26 +245,25 @@ static void window_banner_mousedown(int widgetIndex, rct_window*w, rct_widget* w } /* rct2: 0x6ba517 */ -static void window_banner_dropdown() -{ - short widgetIndex, dropdownIndex; - rct_window* w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - +static void window_banner_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) +{ rct_banner* banner = &gBanners[w->number]; switch(widgetIndex){ case WIDX_MAIN_COLOR: - if ( dropdownIndex == 0xFFFF) return; + if (dropdownIndex == -1) + break; + banner->colour = (uint8)dropdownIndex; window_invalidate(w); break; case WIDX_TEXT_COLOR_DROPDOWN_BUTTON: - if ( dropdownIndex == 0xFFFF) return; + if (dropdownIndex == -1) + break; + banner->text_colour = dropdownIndex + 1; - //Can be replaced with a buffer 34 chars wide ( 32 character + 1 colour_format + 1 '\0') + // Can be replaced with a buffer 34 chars wide ( 32 character + 1 colour_format + 1 '\0') uint8* text_buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, uint8); format_string(text_buffer, banner->string_idx, 0); @@ -298,18 +291,9 @@ static void window_banner_dropdown() } /* rct2: 0x6ba50c */ -static void window_banner_textinput() +static void window_banner_textinput(rct_window *w, int widgetIndex, char *text) { - short widgetIndex; - rct_window *w; - uint8 result; - uint8* text; - - window_text_input_get_registers(w, widgetIndex, result, text); - - - if (widgetIndex == WIDX_BANNER_TEXT && result) { - + if (widgetIndex == WIDX_BANNER_TEXT && text != NULL) { rct_banner* banner = &gBanners[w->number]; uint8* text_buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, uint8); @@ -330,11 +314,8 @@ static void window_banner_textinput() } /* rct2: 0x006BA44D */ -static void window_banner_invalidate() +static void window_banner_invalidate(rct_window *w) { - rct_window* w; - - window_get_register(w); colour_scheme_update(w); rct_banner* banner = &gBanners[w->number]; @@ -367,13 +348,8 @@ static void window_banner_invalidate() } /* rct2:0x006BA4C5 */ -static void window_banner_paint() +static void window_banner_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); // Draw viewport @@ -383,11 +359,8 @@ static void window_banner_paint() } /* rct2: 0x6BA7B5 */ -static void window_banner_unknown_14() +static void window_banner_unknown_14(rct_window *w) { - rct_window* w; - window_get_register(w); - rct_viewport* view = w->viewport; w->viewport = 0; diff --git a/src/windows/changelog.c b/src/windows/changelog.c index 1faa85ba46..a10d57fffd 100644 --- a/src/windows/changelog.c +++ b/src/windows/changelog.c @@ -32,41 +32,40 @@ rct_widget window_changelog_widgets[] = { { WIDGETS_END }, }; -static void window_changelog_emptysub() { } -static void window_changelog_close(); -static void window_changelog_mouseup(); -static void window_changelog_resize(); -static void window_changelog_scrollgetsize(); -static void window_changelog_invalidate(); -static void window_changelog_paint(); -static void window_changelog_scrollpaint(); +static void window_changelog_close(rct_window *w); +static void window_changelog_mouseup(rct_window *w, int widgetIndex); +static void window_changelog_resize(rct_window *w); +static void window_changelog_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_changelog_invalidate(rct_window *w); +static void window_changelog_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_changelog_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void* window_changelog_events[] = { +static rct_window_event_list window_changelog_events = { window_changelog_close, window_changelog_mouseup, window_changelog_resize, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_changelog_scrollgetsize, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, - window_changelog_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_changelog_invalidate, window_changelog_paint, window_changelog_scrollpaint @@ -98,7 +97,7 @@ rct_window *window_changelog_open() window = window_create_centred( screenWidth * 4 / 5, screenHeight * 4 / 5, - (uint32*)window_changelog_events, + &window_changelog_events, WC_CHANGELOG, WF_RESIZABLE ); @@ -116,18 +115,13 @@ rct_window *window_changelog_open() return window; } -static void window_changelog_close() +static void window_changelog_close(rct_window *w) { window_changelog_dispose_file(); } -static void window_changelog_mouseup() +static void window_changelog_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -135,12 +129,8 @@ static void window_changelog_mouseup() } } -static void window_changelog_resize() +static void window_changelog_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - int screenWidth = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); int screenHeight = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16); @@ -159,24 +149,14 @@ static void window_changelog_resize() } } -static void window_changelog_scrollgetsize() +static void window_changelog_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - rct_window *w; - int width, height; - window_get_register(w); - - width = _changelogLongestLineWidth + 4; - height = _changelogNumLines * 11; - - window_scrollsize_set_registers(width, height); + *width = _changelogLongestLineWidth + 4; + *height = _changelogNumLines * 11; } -static void window_changelog_invalidate() +static void window_changelog_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_changelog_widgets[WIDX_BACKGROUND].right = w->width - 1; window_changelog_widgets[WIDX_BACKGROUND].bottom = w->height - 1; window_changelog_widgets[WIDX_TITLE].right = w->width - 2; @@ -188,23 +168,13 @@ static void window_changelog_invalidate() window_changelog_widgets[WIDX_SCROLL].bottom = w->height - 15; } -static void window_changelog_paint() +static void window_changelog_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); } -static void window_changelog_scrollpaint() +static void window_changelog_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - uint16 *currentFontFlags = RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); sint16 *currentFontSpriteBase = RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16); *currentFontFlags = 0; diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 629058a873..b9f870b85c 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -267,148 +267,147 @@ static rct_widget *window_cheats_page_widgets[] = { window_cheats_rides_widgets, }; -static void window_cheats_emptysub() { } -static void window_cheats_money_mouseup(); -static void window_cheats_guests_mouseup(); -static void window_cheats_misc_mouseup(); -static void window_cheats_rides_mouseup(); -static void window_cheats_misc_tool_update(); -static void window_cheats_misc_tool_down(); +static void window_cheats_money_mouseup(rct_window *w, int widgetIndex); +static void window_cheats_guests_mouseup(rct_window *w, int widgetIndex); +static void window_cheats_misc_mouseup(rct_window *w, int widgetIndex); +static void window_cheats_rides_mouseup(rct_window *w, int widgetIndex); +static void window_cheats_misc_tool_update(rct_window* w, int widgetIndex, int x, int y); +static void window_cheats_misc_tool_down(rct_window* w, int widgetIndex, int x, int y); static void window_cheats_update(rct_window *w); -static void window_cheats_invalidate(); -static void window_cheats_paint(); +static void window_cheats_invalidate(rct_window *w); +static void window_cheats_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_cheats_set_page(rct_window *w, int page); -static void* window_cheats_money_events[] = { - window_cheats_emptysub, +static rct_window_event_list window_cheats_money_events = { + NULL, window_cheats_money_mouseup, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, + NULL, + NULL, + NULL, + NULL, window_cheats_update, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_cheats_invalidate, window_cheats_paint, - window_cheats_emptysub + NULL }; -static void* window_cheats_guests_events[] = { - window_cheats_emptysub, +static rct_window_event_list window_cheats_guests_events = { + NULL, window_cheats_guests_mouseup, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, + NULL, + NULL, + NULL, + NULL, window_cheats_update, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_cheats_invalidate, window_cheats_paint, - window_cheats_emptysub + NULL }; -static void* window_cheats_misc_events[] = { - window_cheats_emptysub, +static rct_window_event_list window_cheats_misc_events = { + NULL, window_cheats_misc_mouseup, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, + NULL, + NULL, + NULL, + NULL, window_cheats_update, - window_cheats_emptysub, - window_cheats_emptysub, + NULL, + NULL, window_cheats_misc_tool_update, window_cheats_misc_tool_down, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_cheats_invalidate, window_cheats_paint, - window_cheats_emptysub + NULL }; -static void* window_cheats_rides_events[] = { - window_cheats_emptysub, +static rct_window_event_list window_cheats_rides_events = { + NULL, window_cheats_rides_mouseup, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, + NULL, + NULL, + NULL, + NULL, window_cheats_update, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, - window_cheats_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_cheats_invalidate, window_cheats_paint, - window_cheats_emptysub + NULL }; -static void* window_cheats_page_events[] = { - window_cheats_money_events, - window_cheats_guests_events, - window_cheats_misc_events, - window_cheats_rides_events, +static rct_window_event_list *window_cheats_page_events[] = { + &window_cheats_money_events, + &window_cheats_guests_events, + &window_cheats_misc_events, + &window_cheats_rides_events, }; static uint64 window_cheats_page_enabled_widgets[] = { @@ -762,7 +761,7 @@ void window_cheats_open() if (window != NULL) return; - window = window_create(32, 32, WW, WH, (uint32*)window_cheats_money_events, WC_CHEATS, 0); + window = window_create(32, 32, WW, WH, &window_cheats_money_events, WC_CHEATS, 0); window->widgets = window_cheats_money_widgets; window->enabled_widgets = window_cheats_page_enabled_widgets[0]; window_init_scroll_widgets(window); @@ -770,13 +769,8 @@ void window_cheats_open() park_rating_spinner_value = get_forced_park_rating() >= 0 ? get_forced_park_rating() : 999; } -static void window_cheats_money_mouseup() +static void window_cheats_money_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -796,13 +790,8 @@ static void window_cheats_money_mouseup() } } -static void window_cheats_guests_mouseup() +static void window_cheats_guests_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -885,13 +874,8 @@ static void window_cheats_guests_mouseup() } } -static void window_cheats_misc_mouseup() +static void window_cheats_misc_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -987,13 +971,8 @@ static void window_cheats_misc_mouseup() } } -static void window_cheats_rides_mouseup() +static void window_cheats_rides_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -1067,12 +1046,10 @@ static void window_cheats_update(rct_window *w) } } -static void window_cheats_invalidate() +static void window_cheats_invalidate(rct_window *w) { int i; - rct_window *w; - window_get_register(w); colour_scheme_update(w); rct_widget *widgets = window_cheats_page_widgets[w->page]; @@ -1114,13 +1091,8 @@ static void window_cheats_invalidate() w->widgets[WIDX_TITLE].image = window_cheats_page_titles[w->page]; } -static void window_cheats_paint() +static void window_cheats_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_cheats_draw_tab_images(dpi, w); @@ -1207,15 +1179,10 @@ static void window_cheats_set_page(rct_window *w, int page) window_invalidate(w); } -static void window_cheats_misc_tool_update() +static void window_cheats_misc_tool_update(rct_window* w, int widgetIndex, int x, int y) { - short widgetIndex; - rct_window* w; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - - if (widgetIndex != WIDX_ZERO_CLEARANCE) return; + if (widgetIndex != WIDX_ZERO_CLEARANCE) + return; map_invalidate_selection_rect(); @@ -1236,15 +1203,10 @@ static void window_cheats_misc_tool_update() RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_SPRITE, sint32) = -1; } -static void window_cheats_misc_tool_down() +static void window_cheats_misc_tool_down(rct_window* w, int widgetIndex, int x, int y) { - short widgetIndex; - rct_window* w; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - - if (widgetIndex != WIDX_ZERO_CLEARANCE) return; + if (widgetIndex != WIDX_ZERO_CLEARANCE) + return; int dest_x, dest_y; footpath_get_coordinates_from_pos(x, y + 16, &dest_x, &dest_y, NULL, NULL); diff --git a/src/windows/clear_scenery.c b/src/windows/clear_scenery.c index e7b5f1ffec..090ddefda7 100644 --- a/src/windows/clear_scenery.c +++ b/src/windows/clear_scenery.c @@ -55,44 +55,43 @@ rct_widget window_clear_scenery_widgets[] = { static int window_clear_scenery_should_close(); -static void window_clear_scenery_emptysub() { } -static void window_clear_scenery_close(); -static void window_clear_scenery_mouseup(); +static void window_clear_scenery_close(rct_window *w); +static void window_clear_scenery_mouseup(rct_window *w, int widgetIndex); static void window_clear_scenery_update(rct_window *w); -static void window_clear_scenery_invalidate(); -static void window_clear_scenery_paint(); -static void window_clear_scenery_textinput(); +static void window_clear_scenery_invalidate(rct_window *w); +static void window_clear_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_clear_scenery_textinput(rct_window *w, int widgetIndex, char *text); static void window_clear_scenery_inputsize(rct_window *w); -static void* window_clear_scenery_events[] = { +static rct_window_event_list window_clear_scenery_events = { window_clear_scenery_close, window_clear_scenery_mouseup, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, + NULL, + NULL, + NULL, + NULL, window_clear_scenery_update, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_clear_scenery_textinput, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, - window_clear_scenery_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_clear_scenery_invalidate, window_clear_scenery_paint, - window_clear_scenery_emptysub + NULL }; /** @@ -107,7 +106,7 @@ void window_clear_scenery_open() if (window_find_by_class(WC_CLEAR_SCENERY) != NULL) return; - window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 98, 29, 98, 94, (uint32*)window_clear_scenery_events, WC_CLEAR_SCENERY, 0); + window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 98, 29, 98, 94, &window_clear_scenery_events, WC_CLEAR_SCENERY, 0); window->widgets = window_clear_scenery_widgets; window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_INCREMENT) | (1 << WIDX_DECREMENT) | (1 << WIDX_PREVIEW) | (1 << WIDX_SMALL_SCENERY) | (1 << WIDX_LARGE_SCENERY) | (1 << WIDX_FOOTPATH); @@ -125,7 +124,7 @@ void window_clear_scenery_open() * * rct2: 0x006E6B65 */ -static void window_clear_scenery_close() +static void window_clear_scenery_close(rct_window *w) { // If the tool wasn't changed, turn tool off if (!window_clear_scenery_should_close()) @@ -136,13 +135,9 @@ static void window_clear_scenery_close() * * rct2: 0x0068E185 */ -static void window_clear_scenery_mouseup() +static void window_clear_scenery_mouseup(rct_window *w, int widgetIndex) { - rct_window *w; int limit; - short widgetIndex; - - window_widget_get_registers(w, widgetIndex); switch (widgetIndex) { case WIDX_CLOSE: @@ -191,18 +186,12 @@ static void window_clear_scenery_mouseup() } } -static void window_clear_scenery_textinput() +static void window_clear_scenery_textinput(rct_window *w, int widgetIndex, char *text) { - uint8 result; - short widgetIndex; - rct_window *w; - char *text; int size; char* end; - window_textinput_get_registers(w, widgetIndex, result, text); - - if (widgetIndex != WIDX_PREVIEW || !result) + if (widgetIndex != WIDX_PREVIEW || text == NULL) return; size = strtol(text, &end, 10); @@ -236,11 +225,8 @@ static void window_clear_scenery_update(rct_window *w) * * rct2: 0x0068E115 */ -static void window_clear_scenery_invalidate() +static void window_clear_scenery_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); // Set the preview image button to be pressed down @@ -257,14 +243,10 @@ static void window_clear_scenery_invalidate() * * rct2: 0x0068E130 */ -static void window_clear_scenery_paint() +static void window_clear_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int x, y; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); // Draw cost amount diff --git a/src/windows/demolish_ride_prompt.c b/src/windows/demolish_ride_prompt.c index 3ad481bc28..2361ee46e1 100644 --- a/src/windows/demolish_ride_prompt.c +++ b/src/windows/demolish_ride_prompt.c @@ -42,60 +42,60 @@ enum WINDOW_RIDE_DEMOLISH_WIDGET_IDX { // 0x009AEBA0 static rct_widget window_ride_demolish_widgets[] = { - { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, STR_NONE, STR_NONE }, - { WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_DEMOLISH_RIDE, STR_WINDOW_TITLE_TIP }, - { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, - { WWT_DROPDOWN_BUTTON, 0, 10, 94, WH - 20, WH - 9, STR_DEMOLISH, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 0, WW - 95, WW - 11, WH - 20, WH - 9, STR_SAVE_PROMPT_CANCEL, STR_NONE }, - { WIDGETS_END } + { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, STR_NONE, STR_NONE }, + { WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_DEMOLISH_RIDE, STR_WINDOW_TITLE_TIP }, + { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, + { WWT_DROPDOWN_BUTTON, 0, 10, 94, WH - 20, WH - 9, STR_DEMOLISH, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 0, WW - 95, WW - 11, WH - 20, WH - 9, STR_SAVE_PROMPT_CANCEL, STR_NONE }, + { WIDGETS_END } }; -static void window_ride_demolish_emptysub(){} -static void window_ride_demolish_mouseup(); -static void window_ride_demolish_invalidate(); -static void window_ride_demolish_paint(); +static void window_ride_demolish_mouseup(rct_window *w, int widgetIndex); +static void window_ride_demolish_invalidate(rct_window *w); +static void window_ride_demolish_paint(rct_window *w, rct_drawpixelinfo *dpi); //0x0098E2E4 -static void* window_ride_demolish_events[] = { - window_ride_demolish_emptysub, +static rct_window_event_list window_ride_demolish_events = { + NULL, window_ride_demolish_mouseup, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, - window_ride_demolish_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_ride_demolish_invalidate, window_ride_demolish_paint, - window_ride_demolish_emptysub + NULL }; /** Based off of rct2: 0x006B486A */ -void window_ride_demolish_prompt_open(int rideIndex){ +void window_ride_demolish_prompt_open(int rideIndex) +{ rct_window *w; w = window_bring_to_front_by_number(WC_DEMOLISH_RIDE_PROMPT, rideIndex); if (w != NULL) return; - w = window_create_centred(WW, WH, (uint32*)window_ride_demolish_events, WC_DEMOLISH_RIDE_PROMPT, WF_TRANSPARENT); + w = window_create_centred(WW, WH, &window_ride_demolish_events, WC_DEMOLISH_RIDE_PROMPT, WF_TRANSPARENT); w->widgets = window_ride_demolish_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_CANCEL) | (1 << WIDX_DEMOLISH); window_init_scroll_widgets(w); @@ -107,13 +107,9 @@ void window_ride_demolish_prompt_open(int rideIndex){ * * rct2: 0x006B4933 */ -static void window_ride_demolish_mouseup(){ - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - - switch (widgetIndex){ +static void window_ride_demolish_mouseup(rct_window *w, int widgetIndex) +{ + switch (widgetIndex) { case WIDX_DEMOLISH: RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_DEMOLISH_RIDE; game_do_command(0, 1, 0, w->number, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); @@ -121,14 +117,12 @@ static void window_ride_demolish_mouseup(){ case WIDX_CANCEL: case WIDX_CLOSE: window_close(w); + break; } } -static void window_ride_demolish_invalidate() +static void window_ride_demolish_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); } @@ -136,12 +130,8 @@ static void window_ride_demolish_invalidate() * * rct2: 0x006B48E5 */ -static void window_ride_demolish_paint(){ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +static void window_ride_demolish_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ window_draw_widgets(w, dpi); rct_ride* ride = GET_RIDE(w->number); diff --git a/src/windows/dropdown.c b/src/windows/dropdown.c index 6671284dd0..362ac10e7b 100644 --- a/src/windows/dropdown.c +++ b/src/windows/dropdown.c @@ -56,38 +56,37 @@ sint64 gDropdownItemsArgs[64]; uint32 gDropdownItemsChecked; uint32 *gDropdownItemsDisabled = RCT2_ADDRESS(0x009DED34, uint32); -static void window_dropdown_emptysub() { } -static void window_dropdown_paint(); +static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_dropdown_events[] = { - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, - window_dropdown_emptysub, +static rct_window_event_list window_dropdown_events = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_dropdown_paint, - window_dropdown_emptysub + NULL }; /** @@ -167,7 +166,7 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo x, y + extray, window_dropdown_widgets[WIDX_BACKGROUND].right + 1, window_dropdown_widgets[WIDX_BACKGROUND].bottom + 1, - (uint32*)window_dropdown_events, + &window_dropdown_events, WC_DROPDOWN, 0x02 ); @@ -245,7 +244,7 @@ void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 fl x, y + extray, window_dropdown_widgets[WIDX_BACKGROUND].right + 1, window_dropdown_widgets[WIDX_BACKGROUND].bottom + 1, - (uint32*)window_dropdown_events, + &window_dropdown_events, WC_DROPDOWN, WF_STICK_TO_FRONT ); @@ -274,85 +273,79 @@ void window_dropdown_close() window_close_by_class(WC_DROPDOWN); } -static void window_dropdown_paint() +static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); + int cell_x, cell_y, l, t, r, b, item, image, colour; window_draw_widgets(w, dpi); _dropdown_highlighted_index = RCT2_GLOBAL(0x009DEBA2, sint16); - { - int i, cell_x, cell_y, l, t, r, b, item, image, colour; - for (i = 0; i < gDropdownNumItems; i++) { - cell_x = i % _dropdown_num_columns; - cell_y = i / _dropdown_num_columns; + for (int i = 0; i < gDropdownNumItems; i++) { + cell_x = i % _dropdown_num_columns; + cell_y = i / _dropdown_num_columns; - if (gDropdownItemsFormat[i] == DROPDOWN_SEPARATOR) { + if (gDropdownItemsFormat[i] == DROPDOWN_SEPARATOR) { + l = w->x + 2 + (cell_x * _dropdown_item_width); + t = w->y + 2 + (cell_y * _dropdown_item_height); + r = l + _dropdown_item_width - 1; + t += (_dropdown_item_height / 2); + b = t; + + if (w->colours[0] & 0x80) { + gfx_fill_rect(dpi, l, t, r, b, (RCT2_ADDRESS(0x009DEDF4, uint8)[w->colours[0]] | 0x02000000) + 1); + gfx_fill_rect(dpi, l, t + 1, r, b + 1, (RCT2_ADDRESS(0x009DEDF4, uint8)[w->colours[0]] | 0x02000000) + 2); + } else { + gfx_fill_rect(dpi, l, t, r, b, + *((char*)(0x00141FC47 + (w->colours[0] * 8)))); + gfx_fill_rect(dpi, l, t + 1, r, b + 1, + *((char*)(0x00141FC4B + (w->colours[0] * 8)))); + } + } else { + // + if (i == _dropdown_highlighted_index) { l = w->x + 2 + (cell_x * _dropdown_item_width); t = w->y + 2 + (cell_y * _dropdown_item_height); r = l + _dropdown_item_width - 1; - t += (_dropdown_item_height / 2); - b = t; + b = t + _dropdown_item_height - 1; + gfx_fill_rect(dpi, l, t, r, b, 0x2000000 | 0x2F); + } - if (w->colours[0] & 0x80) { - gfx_fill_rect(dpi, l, t, r, b, (RCT2_ADDRESS(0x009DEDF4, uint8)[w->colours[0]] | 0x02000000) + 1); - gfx_fill_rect(dpi, l, t + 1, r, b + 1, (RCT2_ADDRESS(0x009DEDF4, uint8)[w->colours[0]] | 0x02000000) + 2); - } else { - gfx_fill_rect(dpi, l, t, r, b, - *((char*)(0x00141FC47 + (w->colours[0] * 8)))); - gfx_fill_rect(dpi, l, t + 1, r, b + 1, - *((char*)(0x00141FC4B + (w->colours[0] * 8)))); - } + item = gDropdownItemsFormat[i]; + if (item == (uint16)-1 || item == (uint16)-2) { + // Image item + image = *((uint32*)&gDropdownItemsArgs[i]); + if (item == (uint16)-2 && _dropdown_highlighted_index == i) + image++; + + gfx_draw_sprite( + dpi, + image, + w->x + 2 + (cell_x * _dropdown_item_width), + w->y + 2 + (cell_y * _dropdown_item_height), 0 + ); } else { - // - if (i == _dropdown_highlighted_index) { - l = w->x + 2 + (cell_x * _dropdown_item_width); - t = w->y + 2 + (cell_y * _dropdown_item_height); - r = l + _dropdown_item_width - 1; - b = t + _dropdown_item_height - 1; - gfx_fill_rect(dpi, l, t, r, b, 0x2000000 | 0x2F); - } + // Text item + if (i < 32) + if (gDropdownItemsChecked & (1 << i)) + item++; - item = gDropdownItemsFormat[i]; - if (item == (uint16)-1 || item == (uint16)-2) { - // Image item - image = *((uint32*)&gDropdownItemsArgs[i]); - if (item == (uint16)-2 && _dropdown_highlighted_index == i) - image++; - - gfx_draw_sprite( - dpi, - image, - w->x + 2 + (cell_x * _dropdown_item_width), - w->y + 2 + (cell_y * _dropdown_item_height), 0 - ); - } else { - // Text item + // Calculate colour + colour = w->colours[0] & 0x7F; + if (i == _dropdown_highlighted_index) + colour = 2; + if (RCT2_GLOBAL(0x009DED34, uint32) & (1 << i)) if (i < 32) - if (gDropdownItemsChecked & (1 << i)) - item++; + colour = (w->colours[0] & 0x7F) | 0x40; - // Calculate colour - colour = w->colours[0] & 0x7F; - if (i == _dropdown_highlighted_index) - colour = 2; - if (RCT2_GLOBAL(0x009DED34, uint32) & (1 << i)) - if (i < 32) - colour = (w->colours[0] & 0x7F) | 0x40; - - // Draw item string - gfx_draw_string_left_clipped( - dpi, - item, - (void*)(&gDropdownItemsArgs[i]), colour, - w->x + 2 + (cell_x * _dropdown_item_width), - w->y + 1 + (cell_y * _dropdown_item_height), - w->width - 5 - ); - } + // Draw item string + gfx_draw_string_left_clipped( + dpi, + item, + (void*)(&gDropdownItemsArgs[i]), colour, + w->x + 2 + (cell_x * _dropdown_item_width), + w->y + 1 + (cell_y * _dropdown_item_height), + w->width - 5 + ); } } } diff --git a/src/windows/editor_bottom_toolbar.c b/src/windows/editor_bottom_toolbar.c index ed530f3469..5a3a4dbe38 100644 --- a/src/windows/editor_bottom_toolbar.c +++ b/src/windows/editor_bottom_toolbar.c @@ -51,11 +51,9 @@ static rct_widget window_editor_bottom_toolbar_widgets[] = { { WIDGETS_END }, }; -static void window_editor_bottom_toolbar_emptysub() { } - -static void window_editor_bottom_toolbar_mouseup(); -static void window_editor_bottom_toolbar_invalidate(); -static void window_editor_bottom_toolbar_paint(); +static void window_editor_bottom_toolbar_mouseup(rct_window *w, int widgetIndex); +static void window_editor_bottom_toolbar_invalidate(rct_window *w); +static void window_editor_bottom_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_editor_bottom_toolbar_jump_back_to_object_selection(); static void window_editor_bottom_toolbar_jump_back_to_landscape_editor(); @@ -68,57 +66,57 @@ static void window_editor_bottom_toolbar_jump_forward_to_options_selection(); static void window_editor_bottom_toolbar_jump_forward_to_objective_selection(); static void window_editor_bottom_toolbar_jump_forward_to_save_scenario(); -static void* window_editor_bottom_toolbar_events[] = { - window_editor_bottom_toolbar_emptysub, +static rct_window_event_list window_editor_bottom_toolbar_events = { + NULL, window_editor_bottom_toolbar_mouseup, //0x0066f5ae, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_editor_bottom_toolbar_invalidate, //0x0066f1c9, window_editor_bottom_toolbar_paint, //0x0066f25c, - window_editor_bottom_toolbar_emptysub + NULL }; -static EMPTY_ARGS_VOID_POINTER* previous_button_mouseup_events[] = { - window_editor_bottom_toolbar_emptysub, +static EMPTY_ARGS_VOID_POINTER *previous_button_mouseup_events[] = { + NULL, window_editor_bottom_toolbar_jump_back_to_object_selection, window_editor_bottom_toolbar_jump_back_to_landscape_editor, window_editor_bottom_toolbar_jump_back_to_invention_list_set_up, window_editor_bottom_toolbar_jump_back_to_options_selection, - window_editor_bottom_toolbar_emptysub, + NULL, window_editor_bottom_toolbar_jump_back_to_object_selection, - window_editor_bottom_toolbar_emptysub + NULL }; -static EMPTY_ARGS_VOID_POINTER* next_button_mouseup_events[] = { +static EMPTY_ARGS_VOID_POINTER *next_button_mouseup_events[] = { window_editor_bottom_toolbar_jump_forward_from_object_selection, window_editor_bottom_toolbar_jump_forward_to_invention_list_set_up, window_editor_bottom_toolbar_jump_forward_to_options_selection, window_editor_bottom_toolbar_jump_forward_to_objective_selection, window_editor_bottom_toolbar_jump_forward_to_save_scenario, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub, - window_editor_bottom_toolbar_emptysub + NULL, + NULL, + NULL }; /** @@ -131,7 +129,7 @@ void window_editor_bottom_toolbar_open() window = window_create(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 32, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16), 32, - (uint32*)window_editor_bottom_toolbar_events, + &window_editor_bottom_toolbar_events, WC_BOTTOM_TOOLBAR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5); window->widgets = window_editor_bottom_toolbar_widgets; @@ -394,13 +392,8 @@ void window_editor_bottom_toolbar_jump_forward_to_save_scenario() * * rct2: 0x0066F5AE */ -static void window_editor_bottom_toolbar_mouseup() +static void window_editor_bottom_toolbar_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (widgetIndex == WIDX_PREVIOUS_STEP_BUTTON) { if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) || RCT2_GLOBAL(0x13573C8, uint16) == 0x2710 && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_18)) { @@ -425,11 +418,8 @@ void hide_next_step_button() { * * rct2: 0x0066F1C9 */ -void window_editor_bottom_toolbar_invalidate() { - rct_window* w; - - window_get_register(w); - +void window_editor_bottom_toolbar_invalidate(rct_window *w) +{ colour_scheme_update_by_class(w, (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) ? WC_EDITOR_SCENARIO_BOTTOM_TOOLBAR : WC_EDITOR_TRACK_BOTTOM_TOOLBAR); uint16 screenWidth = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); @@ -463,12 +453,8 @@ void window_editor_bottom_toolbar_invalidate() { * * rct2: 0x0066F25C */ -void window_editor_bottom_toolbar_paint() { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +void window_editor_bottom_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ bool drawPreviousButton = false; bool drawNextButton = false; diff --git a/src/windows/editor_inventions_list.c b/src/windows/editor_inventions_list.c index 898e42f2b6..cd5c30fb66 100644 --- a/src/windows/editor_inventions_list.c +++ b/src/windows/editor_inventions_list.c @@ -70,86 +70,84 @@ static rct_widget window_editor_inventions_list_drag_widgets[] = { #pragma region Events -static void window_editor_inventions_list_emptysub() { } - -static void window_editor_inventions_list_close(); -static void window_editor_inventions_list_mouseup(); +static void window_editor_inventions_list_close(rct_window *w); +static void window_editor_inventions_list_mouseup(rct_window *w, int widgetIndex); static void window_editor_inventions_list_update(rct_window *w); -static void window_editor_inventions_list_scrollgetheight(); -static void window_editor_inventions_list_scrollmousedown(); -static void window_editor_inventions_list_scrollmouseover(); -static void window_editor_inventions_list_tooltip(); -static void window_editor_inventions_list_cursor(); -static void window_editor_inventions_list_invalidate(); -static void window_editor_inventions_list_paint(); -static void window_editor_inventions_list_scrollpaint(); +static void window_editor_inventions_list_scrollgetheight(rct_window *w, int scrollIndex, int *width, int *height); +static void window_editor_inventions_list_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_editor_inventions_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_editor_inventions_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_editor_inventions_list_cursor(rct_window *w, int widgetIndex, int x, int y, int *cursorId); +static void window_editor_inventions_list_invalidate(rct_window *w); +static void window_editor_inventions_list_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_editor_inventions_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void window_editor_inventions_list_drag_cursor(); -static void window_editor_inventions_list_drag_moved(); -static void window_editor_inventions_list_drag_paint(); +static void window_editor_inventions_list_drag_cursor(rct_window *w, int widgetIndex, int x, int y, int *cursorId); +static void window_editor_inventions_list_drag_moved(rct_window* w, int x, int y); +static void window_editor_inventions_list_drag_paint(rct_window *w, rct_drawpixelinfo *dpi); // 0x0098177C -static void* window_editor_inventions_list_events[] = { +static rct_window_event_list window_editor_inventions_list_events = { window_editor_inventions_list_close, window_editor_inventions_list_mouseup, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, + NULL, + NULL, + NULL, + NULL, window_editor_inventions_list_update, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_editor_inventions_list_scrollgetheight, window_editor_inventions_list_scrollmousedown, - window_editor_inventions_list_emptysub, + NULL, window_editor_inventions_list_scrollmouseover, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, + NULL, + NULL, + NULL, window_editor_inventions_list_tooltip, window_editor_inventions_list_cursor, - window_editor_inventions_list_emptysub, + NULL, window_editor_inventions_list_invalidate, window_editor_inventions_list_paint, window_editor_inventions_list_scrollpaint }; // 0x009817EC -static void* window_editor_inventions_list_drag_events[] = { - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, - window_editor_inventions_list_emptysub, +static rct_window_event_list window_editor_inventions_list_drag_events = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_editor_inventions_list_drag_cursor, window_editor_inventions_list_drag_moved, - window_editor_inventions_list_emptysub, + NULL, window_editor_inventions_list_drag_paint, - window_editor_inventions_list_emptysub + NULL }; #pragma endregion @@ -532,7 +530,7 @@ void window_editor_inventions_list_open() w = window_create_centred( 600, 400, - (uint32*)window_editor_inventions_list_events, + &window_editor_inventions_list_events, WC_EDITOR_INVENTION_LIST, WF_2 ); @@ -554,7 +552,7 @@ void window_editor_inventions_list_open() * * rct2: 0x006853D2 */ -static void window_editor_inventions_list_close() +static void window_editor_inventions_list_close(rct_window *w) { sub_685A79(); } @@ -563,13 +561,8 @@ static void window_editor_inventions_list_close() * * rct2: 0x0068521B */ -static void window_editor_inventions_list_mouseup() +static void window_editor_inventions_list_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -615,45 +608,33 @@ static void window_editor_inventions_list_update(rct_window *w) * * rct2: 0x00685239 */ -static void window_editor_inventions_list_scrollgetheight() +static void window_editor_inventions_list_scrollgetheight(rct_window *w, int scrollIndex, int *width, int *height) { - rct_window *w; - short scrollIndex; rct_research_item *researchItem; - int width, height; - window_scroll_get_registers(w, scrollIndex); - - width = 0; - height = 0; + *height = 0; // Count / skip pre-researched items for (researchItem = gResearchItems; researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR; researchItem++) - height += 10; + *height += 10; if (scrollIndex == 1) { researchItem++; // Count non pre-researched items - height = 0; + *height = 0; for (; researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++) - height += 10; + *height += 10; } - - window_scrollsize_set_registers(width, height); } /** * * rct2: 0x006852D4 */ -static void window_editor_inventions_list_scrollmousedown() +static void window_editor_inventions_list_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) { - rct_window *w; rct_research_item *researchItem; - short scrollIndex, x, y; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); researchItem = window_editor_inventions_list_get_item_from_scroll_y(scrollIndex, y); if (researchItem == NULL) @@ -670,14 +651,10 @@ static void window_editor_inventions_list_scrollmousedown() * * rct2: 0x00685275 */ -static void window_editor_inventions_list_scrollmouseover() +static void window_editor_inventions_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) { - rct_window *w; - short scrollIndex, x, y; rct_research_item *researchItem; - window_scrollmouse_get_registers(w, scrollIndex, x, y); - researchItem = window_editor_inventions_list_get_item_from_scroll_y(scrollIndex, y); if (researchItem != WindowHighlightedItem(w)) { WindowHighlightedItem(w) = researchItem; @@ -689,7 +666,7 @@ static void window_editor_inventions_list_scrollmouseover() * * rct2: 0x0068526B */ -static void window_editor_inventions_list_tooltip() +static void window_editor_inventions_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { RCT2_GLOBAL(0x013CE952, uint16) = 3159; } @@ -698,22 +675,19 @@ static void window_editor_inventions_list_tooltip() * * rct2: 0x00685291 */ -static void window_editor_inventions_list_cursor() +static void window_editor_inventions_list_cursor(rct_window *w, int widgetIndex, int x, int y, int *cursorId) { - rct_window *w; rct_research_item *researchItem; - short widgetIndex, x, y; - int scrollIndex, cursorId; + int scrollIndex; - window_cursor_get_registers(w, widgetIndex, x, y); - - if (widgetIndex == WIDX_PRE_RESEARCHED_SCROLL) { + switch (widgetIndex) { + case WIDX_PRE_RESEARCHED_SCROLL: scrollIndex = 0; - } else if (widgetIndex == WIDX_RESEARCH_ORDER_SCROLL) { + break; + case WIDX_RESEARCH_ORDER_SCROLL: scrollIndex = 1; - } else { - cursorId = -1; - window_cursor_set_registers(cursorId); + break; + default: return; } @@ -722,24 +696,18 @@ static void window_editor_inventions_list_cursor() return; if (researchItem->entryIndex < (uint32)RESEARCHED_ITEMS_END_2 && research_item_is_always_researched(researchItem)) { - cursorId = -1; - window_cursor_set_registers(cursorId); return; } - cursorId = CURSOR_HAND_OPEN; - window_cursor_set_registers(cursorId); + *cursorId = CURSOR_HAND_OPEN; } /** * * rct2: 0x00685392 */ -static void window_editor_inventions_list_invalidate() +static void window_editor_inventions_list_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); w->pressed_widgets |= 1 << WIDX_PREVIEW; @@ -753,17 +721,13 @@ static void window_editor_inventions_list_invalidate() * * rct2: 0x00684EE0 */ -static void window_editor_inventions_list_paint() +static void window_editor_inventions_list_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_widget *widget; rct_research_item *researchItem; rct_string_id stringId; int x, y, width; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); // Tab image @@ -833,11 +797,8 @@ static void window_editor_inventions_list_paint() * * rct2: 0x006850BD */ -static void window_editor_inventions_list_scrollpaint() +static void window_editor_inventions_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - rct_window *w; - rct_drawpixelinfo *dpi; - short scrollIndex; uint32 colour; rct_research_item *researchItem; int left, top, bottom, itemY, disableItemMovement; @@ -845,8 +806,6 @@ static void window_editor_inventions_list_scrollpaint() rct_string_id stringId; char buffer[256], *ptr; - window_scrollpaint_get_registers(w, dpi, scrollIndex); - // Draw background colour = RCT2_GLOBAL(0x0141FC48 + (w->colours[1] * 8), uint8); colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; @@ -944,7 +903,7 @@ static void window_editor_inventions_list_drag_open(rct_research_item *researchI RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_CURSOR_Y, uint16) - 7, stringWidth, 14, - (uint32*)window_editor_inventions_list_drag_events, + &window_editor_inventions_list_drag_events, WC_EDITOR_INVENTION_LIST_DRAG, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_NO_SNAPPING ); @@ -959,14 +918,10 @@ static void window_editor_inventions_list_drag_open(rct_research_item *researchI * * rct2: 0x0068549C */ -static void window_editor_inventions_list_drag_cursor() +static void window_editor_inventions_list_drag_cursor(rct_window *w, int widgetIndex, int x, int y, int *cursorId) { - rct_window *w, *inventionListWindow; + rct_window *inventionListWindow; rct_research_item *researchItem; - short widgetIndex, x, y; - int cursorId; - - window_cursor_get_registers(w, widgetIndex, x, y); inventionListWindow = window_find_by_class(WC_EDITOR_INVENTION_LIST); if (inventionListWindow != NULL) { @@ -977,21 +932,16 @@ static void window_editor_inventions_list_drag_cursor() } } - cursorId = CURSOR_HAND_CLOSED; - window_cursor_set_registers(cursorId); + *cursorId = CURSOR_HAND_CLOSED; } /** * * rct2: 0x00685412 */ -static void window_editor_inventions_list_drag_moved() +static void window_editor_inventions_list_drag_moved(rct_window* w, int x, int y) { - rct_window *w; rct_research_item *researchItem; - short x, y, widgetIndex; - - window_cursor_get_registers(w, widgetIndex, x, y); researchItem = get_research_item_at(x, y); if (researchItem != NULL) @@ -1006,15 +956,11 @@ static void window_editor_inventions_list_drag_moved() * * rct2: 0x006853D9 */ -static void window_editor_inventions_list_drag_paint() +static void window_editor_inventions_list_drag_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_string_id stringId; int x, y; - window_paint_get_registers(w, dpi); - x = w->x; y = w->y + 2; stringId = research_item_get_name(_editorInventionsListDraggedItem->entryIndex & 0xFFFFFF); diff --git a/src/windows/editor_main.c b/src/windows/editor_main.c index 8cd6b408e8..dcdd7d1830 100644 --- a/src/windows/editor_main.c +++ b/src/windows/editor_main.c @@ -23,39 +23,37 @@ #include "../interface/widget.h" #include "../interface/window.h" -static void window_editor_main_emptysub() { } +static void window_editor_main_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_editor_main_paint(); - -static void* window_editor_main_events[] = { - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, - window_editor_main_emptysub, +static rct_window_event_list window_editor_main_events = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_editor_main_paint,// 0x0066FC97, //window_editor_main_paint, - window_editor_main_emptysub, + NULL, }; static rct_widget window_editor_main_widgets[] = { @@ -75,7 +73,7 @@ void window_editor_main_open() window_editor_main_widgets[0].right = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); window_editor_main_widgets[0].bottom = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16); window = window_create(0, 0, window_editor_main_widgets[0].right, window_editor_main_widgets[0].bottom, - (uint32*)window_editor_main_events, WC_MAIN_WINDOW, WF_STICK_TO_BACK); + &window_editor_main_events, WC_MAIN_WINDOW, WF_STICK_TO_BACK); window->widgets = window_editor_main_widgets; viewport_create(window, window->x, window->y, window->width, window->height, 0, 0x0FFF, 0x0FFF, 0, 0x1, -1); @@ -96,11 +94,7 @@ void window_editor_main_open() * rct2: 0x0066FC97 * This function immediately jumps to 0x00685BE1 */ -static void window_editor_main_paint() { - rct_window* w; - rct_drawpixelinfo* dpi; - - window_paint_get_registers(w, dpi); - +static void window_editor_main_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ viewport_render(dpi, w->viewport, dpi->x, dpi->y, dpi->x + dpi->width, dpi->y + dpi->height); } \ No newline at end of file diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index a8471aca15..92f2a1499f 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -154,52 +154,50 @@ static rct_widget window_editor_object_selection_widgets[] = { #pragma region Events -static void window_editor_object_selection_emptysub() { } - -static void window_editor_object_selection_close(); -static void window_editor_object_selection_mouseup(); -static void window_editor_object_selection_resize(); +static void window_editor_object_selection_close(rct_window *w); +static void window_editor_object_selection_mouseup(rct_window *w, int widgetIndex); +static void window_editor_object_selection_resize(rct_window *w); static void window_editor_object_selection_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_editor_object_selection_dropdown(); +static void window_editor_object_selection_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_editor_object_selection_update(rct_window *w); -static void window_editor_object_selection_scrollgetsize(); -static void window_editor_object_selection_scroll_mousedown(); -static void window_editor_object_selection_scroll_mouseover(); -static void window_editor_object_selection_tooltip(); -static void window_editor_object_selection_invalidate(); -static void window_editor_object_selection_paint(); -static void window_editor_object_selection_scrollpaint(); -static void window_editor_object_selection_textinput(); +static void window_editor_object_selection_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_editor_object_selection_scroll_mousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_editor_object_selection_scroll_mouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_editor_object_selection_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_editor_object_selection_invalidate(rct_window *w); +static void window_editor_object_selection_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_editor_object_selection_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); +static void window_editor_object_selection_textinput(rct_window *w, int widgetIndex, char *text); -static void* window_editor_object_selection_events[] = { +static rct_window_event_list window_editor_object_selection_events = { window_editor_object_selection_close, - (void*)window_editor_object_selection_mouseup, - (void*)window_editor_object_selection_resize, - (void*)window_editor_object_selection_mousedown, - (void*)window_editor_object_selection_dropdown, - (void*)window_editor_object_selection_emptysub, - (void*)window_editor_object_selection_update, - (void*)window_editor_object_selection_emptysub, - (void*)window_editor_object_selection_emptysub, - (void*)window_editor_object_selection_emptysub, - (void*)window_editor_object_selection_emptysub, - (void*)window_editor_object_selection_emptysub, - (void*)window_editor_object_selection_emptysub, - (void*)window_editor_object_selection_emptysub, - (void*)window_editor_object_selection_emptysub, - (void*)window_editor_object_selection_scrollgetsize, - (void*)window_editor_object_selection_scroll_mousedown, - (void*)window_editor_object_selection_emptysub, - (void*)window_editor_object_selection_scroll_mouseover, - (void*)window_editor_object_selection_textinput, - (void*)window_editor_object_selection_emptysub, - (void*)window_editor_object_selection_emptysub, - (void*)window_editor_object_selection_tooltip, - (void*)window_editor_object_selection_emptysub, - (void*)window_editor_object_selection_emptysub, - (void*)window_editor_object_selection_invalidate, - (void*)window_editor_object_selection_paint, - (void*)window_editor_object_selection_scrollpaint + window_editor_object_selection_mouseup, + window_editor_object_selection_resize, + window_editor_object_selection_mousedown, + window_editor_object_selection_dropdown, + NULL, + window_editor_object_selection_update, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_editor_object_selection_scrollgetsize, + window_editor_object_selection_scroll_mousedown, + NULL, + window_editor_object_selection_scroll_mouseover, + window_editor_object_selection_textinput, + NULL, + NULL, + window_editor_object_selection_tooltip, + NULL, + NULL, + window_editor_object_selection_invalidate, + window_editor_object_selection_paint, + window_editor_object_selection_scrollpaint }; #pragma endregion @@ -386,7 +384,7 @@ void window_editor_object_selection_open() window = window_create_centred( 600, 400, - (uint32*)window_editor_object_selection_events, + &window_editor_object_selection_events, WC_EDITOR_OBJECT_SELECTION, WF_10 | WF_RESIZABLE ); @@ -735,11 +733,8 @@ void unload_unselected_objects(){ * * rct2: 0x006AB199 */ -static void window_editor_object_selection_close() +static void window_editor_object_selection_close(rct_window *w) { - rct_window* w; - window_get_register(w); - //if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_EDITOR)) // return; @@ -770,13 +765,8 @@ static void window_editor_object_selection_close() * * rct2: 0x006AAFAB */ -static void window_editor_object_selection_mouseup() +static void window_editor_object_selection_mouseup(rct_window *w, int widgetIndex) { - rct_window *w; - short widgetIndex; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_EDITOR) { @@ -877,12 +867,8 @@ static void window_editor_object_selection_mouseup() } } -static void window_editor_object_selection_resize() +static void window_editor_object_selection_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 600, 400, 1200, 1000); } @@ -920,16 +906,11 @@ void window_editor_object_selection_mousedown(int widgetIndex, rct_window*w, rct } } -static void window_editor_object_selection_dropdown() +static void window_editor_object_selection_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - short dropdownIndex; - short widgetIndex; - rct_window *w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (dropdownIndex == -1) return; + switch (widgetIndex) { case WIDX_FILTER_DROPDOWN: _filter_flags ^= (1 << dropdownIndex); @@ -947,31 +928,17 @@ static void window_editor_object_selection_dropdown() * * rct2: 0x006AB031 */ -static void window_editor_object_selection_scrollgetsize() +static void window_editor_object_selection_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - rct_window *w; - short scrollIndex; - int width, height; - - window_scroll_get_registers(w, scrollIndex); - - width = 0; - height = _numListItems * 12; - - window_scrollsize_set_registers(width, height); + *height = _numListItems * 12; } /** * * rct2: 0x006AB0B6 */ -static void window_editor_object_selection_scroll_mousedown() +static void window_editor_object_selection_scroll_mousedown(rct_window *w, int scrollIndex, int x, int y) { - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); - // Used for in-game object selection cheat to prevent crashing the game // when windows attempt to draw objects that don't exist any more window_close_all_except_class(WC_EDITOR_OBJECT_SELECTION); @@ -1025,16 +992,12 @@ static void window_editor_object_selection_scroll_mousedown() * * rct2: 0x006AB079 */ -static void window_editor_object_selection_scroll_mouseover() +static void window_editor_object_selection_scroll_mouseover(rct_window *w, int scrollIndex, int x, int y) { - rct_window *w; rct_object_entry *installedEntry; int selectedObject; - short x, y, scrollIndex; uint8 objectSelectionFlags; - window_scrollmouse_get_registers(w, scrollIndex, x, y); - selectedObject = get_object_from_object_selection( w->selected_tab & 0xFF, y, &objectSelectionFlags, &installedEntry ); @@ -1057,13 +1020,8 @@ static void window_editor_object_selection_scroll_mouseover() * * rct2: 0x006AB058 */ -static void window_editor_object_selection_tooltip() +static void window_editor_object_selection_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - rct_window *w; - short widgetIndex; - - window_scroll_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_TAB_1: case WIDX_TAB_2: @@ -1089,14 +1047,11 @@ static void window_editor_object_selection_tooltip() * * rct2: 0x006AA9FD */ -static void window_editor_object_selection_invalidate() +static void window_editor_object_selection_invalidate(rct_window *w) { int i, x; - rct_window *w; rct_widget *widget; - window_get_register(w); - colour_scheme_update(w); // Resize widgets @@ -1226,19 +1181,15 @@ static void window_editor_object_selection_invalidate() * * rct2: 0x006AAB56 */ -static void window_editor_object_selection_paint() +static void window_editor_object_selection_paint(rct_window *w, rct_drawpixelinfo *dpi) { int i, x, y, width, numSelected, totalSelectable, type; - rct_window *w; - rct_drawpixelinfo *dpi; rct_widget *widget; rct_object_entry *highlightedEntry; rct_string_id stringId; uint8 *text, source; char *datName, *name, *stringBuffer; - window_paint_get_registers(w, dpi); - /*if (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS) { gfx_fill_rect_inset(dpi, w->x + w->widgets[WIDX_FILTER_RIDE_TAB_ALL].left - 1, @@ -1447,14 +1398,9 @@ static void window_editor_object_selection_paint() * * rct2: 0x006AADA3 */ -static void window_editor_object_selection_scrollpaint() +static void window_editor_object_selection_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { int x, y, i, colour, colour2; - short scrollIndex; - rct_window *w; - rct_drawpixelinfo *dpi; - - window_scrollpaint_get_registers(w, dpi, scrollIndex); bool ridePage = (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS); @@ -2020,16 +1966,9 @@ static void window_editor_object_selection_update(rct_window *w) } } -static void window_editor_object_selection_textinput() +static void window_editor_object_selection_textinput(rct_window *w, int widgetIndex, char *text) { - uint8 result; - short widgetIndex; - rct_window *w; - char *text; - - window_textinput_get_registers(w, widgetIndex, result, text); - - if (widgetIndex != WIDX_FILTER_STRING_BUTTON || !result) + if (widgetIndex != WIDX_FILTER_STRING_BUTTON || text == NULL) return; if (strcmp(_filter_string, text) == 0) diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index 32bf8d52ab..8a6b489875 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -114,94 +114,92 @@ static rct_widget *window_editor_objective_options_widgets[] = { #pragma region Events -static void window_editor_objective_options_emptysub() { } - -static void window_editor_objective_options_main_mouseup(); -static void window_editor_objective_options_main_resize(); +static void window_editor_objective_options_main_mouseup(rct_window *w, int widgetIndex); +static void window_editor_objective_options_main_resize(rct_window *w); static void window_editor_objective_options_main_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_editor_objective_options_main_dropdown(); +static void window_editor_objective_options_main_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_editor_objective_options_main_update(rct_window *w); -static void window_editor_objective_options_main_textinput(); -static void window_editor_objective_options_main_invalidate(); -static void window_editor_objective_options_main_paint(); +static void window_editor_objective_options_main_textinput(rct_window *w, int widgetIndex, char *text); +static void window_editor_objective_options_main_invalidate(rct_window *w); +static void window_editor_objective_options_main_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_editor_objective_options_rides_mouseup(); -static void window_editor_objective_options_rides_resize(); +static void window_editor_objective_options_rides_mouseup(rct_window *w, int widgetIndex); +static void window_editor_objective_options_rides_resize(rct_window *w); static void window_editor_objective_options_rides_update(rct_window *w); -static void window_editor_objective_options_rides_scrollgetheight(); -static void window_editor_objective_options_rides_scrollmousedown(); -static void window_editor_objective_options_rides_scrollmouseover(); -static void window_editor_objective_options_rides_invalidate(); -static void window_editor_objective_options_rides_paint(); -static void window_editor_objective_options_rides_scrollpaint(); +static void window_editor_objective_options_rides_scrollgetheight(rct_window *w, int scrollIndex, int *width, int *height); +static void window_editor_objective_options_rides_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_editor_objective_options_rides_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_editor_objective_options_rides_invalidate(rct_window *w); +static void window_editor_objective_options_rides_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_editor_objective_options_rides_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); // 0x009A9DF4 -static void* window_objective_options_main_events[] = { - window_editor_objective_options_emptysub, +static rct_window_event_list window_objective_options_main_events = { + NULL, window_editor_objective_options_main_mouseup, window_editor_objective_options_main_resize, window_editor_objective_options_main_mousedown, window_editor_objective_options_main_dropdown, - window_editor_objective_options_emptysub, + NULL, window_editor_objective_options_main_update, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_editor_objective_options_main_textinput, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_editor_objective_options_main_invalidate, window_editor_objective_options_main_paint, - window_editor_objective_options_emptysub + NULL }; // 0x009A9F58 -static void* window_objective_options_rides_events[] = { - window_editor_objective_options_emptysub, +static rct_window_event_list window_objective_options_rides_events = { + NULL, window_editor_objective_options_rides_mouseup, window_editor_objective_options_rides_resize, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, + NULL, + NULL, + NULL, window_editor_objective_options_rides_update, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_editor_objective_options_rides_scrollgetheight, window_editor_objective_options_rides_scrollmousedown, - window_editor_objective_options_emptysub, + NULL, window_editor_objective_options_rides_scrollmouseover, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, - window_editor_objective_options_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_editor_objective_options_rides_invalidate, window_editor_objective_options_rides_paint, window_editor_objective_options_rides_scrollpaint }; -static void* window_editor_objective_options_page_events[] = { - window_objective_options_main_events, - window_objective_options_rides_events +static rct_window_event_list *window_editor_objective_options_page_events[] = { + &window_objective_options_main_events, + &window_objective_options_rides_events }; #pragma endregion @@ -260,7 +258,7 @@ void window_editor_objective_options_open() w = window_create_centred( 450, 228, - (uint32*)window_objective_options_main_events, + &window_objective_options_main_events, WC_EDTIOR_OBJECTIVE_OPTIONS, WF_10 ); @@ -395,13 +393,9 @@ static void window_editor_objective_options_set_objective(rct_window *w, int obj * * rct2: 0x006719CA */ -static void window_editor_objective_options_main_mouseup() +static void window_editor_objective_options_main_mouseup(rct_window *w, int widgetIndex) { rct_s6_info *s6Info = (rct_s6_info*)0x00141F570; - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); switch (widgetIndex) { case WIDX_CLOSE: @@ -434,12 +428,8 @@ static void window_editor_objective_options_main_mouseup() * * rct2: 0x00672254 */ -static void window_editor_objective_options_main_resize() +static void window_editor_objective_options_main_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 450, 229, 450, 229); } @@ -719,15 +709,11 @@ static void window_editor_objective_options_main_mousedown(int widgetIndex, rct_ * * rct2: 0x00671A54 */ -static void window_editor_objective_options_main_dropdown() +static void window_editor_objective_options_main_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { rct_s6_info *s6Info = (rct_s6_info*)0x00141F570; - rct_window *w; - short widgetIndex, dropdownIndex; uint8 newObjectiveType; - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (dropdownIndex == -1) return; @@ -792,17 +778,11 @@ static void window_editor_objective_options_main_update(rct_window *w) * * rct2: 0x00671A73 */ -static void window_editor_objective_options_main_textinput() +static void window_editor_objective_options_main_textinput(rct_window *w, int widgetIndex, char *text) { rct_s6_info *s6Info = (rct_s6_info*)0x00141F570; - uint8 result; - short widgetIndex; - rct_window *w; - char *text; - window_textinput_get_registers(w, widgetIndex, result, text); - - if (!result) + if (text == NULL) return; switch (widgetIndex) { @@ -827,13 +807,11 @@ static void window_editor_objective_options_main_textinput() * * rct2: 0x0067161C */ -static void window_editor_objective_options_main_invalidate() +static void window_editor_objective_options_main_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; rct_stex_entry *stex; - window_get_register(w); colour_scheme_update(w); stex = g_stexEntries[0]; @@ -906,18 +884,14 @@ static void window_editor_objective_options_main_invalidate() * * rct2: 0x0067161C */ -static void window_editor_objective_options_main_paint() +static void window_editor_objective_options_main_paint(rct_window *w, rct_drawpixelinfo *dpi) { rct_s6_info *s6Info = (rct_s6_info*)0x00141F570; rct_stex_entry *stex; - rct_window *w; - rct_drawpixelinfo *dpi; int x, y, width; rct_string_id stringId; uint32 arg; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_editor_objective_options_draw_tab_images(w, dpi); @@ -1078,13 +1052,9 @@ static void window_editor_objective_options_main_paint() * * rct2: 0x006724A4 */ -static void window_editor_objective_options_rides_mouseup() +static void window_editor_objective_options_rides_mouseup(rct_window *w, int widgetIndex) { rct_s6_info *s6Info = (rct_s6_info*)0x00141F570; - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); switch (widgetIndex) { case WIDX_CLOSE: @@ -1101,12 +1071,8 @@ static void window_editor_objective_options_rides_mouseup() * * rct2: 0x006725A8 */ -static void window_editor_objective_options_rides_resize() +static void window_editor_objective_options_rides_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 380, 224, 380, 224); } @@ -1142,32 +1108,20 @@ static void window_editor_objective_options_rides_update(rct_window *w) * * rct2: 0x006724BF */ -static void window_editor_objective_options_rides_scrollgetheight() +static void window_editor_objective_options_rides_scrollgetheight(rct_window *w, int scrollIndex, int *width, int *height) { - int width, height; - rct_window *w; - - window_get_register(w); - - width = 0; - height = w->no_list_items * 12; - - window_scrollsize_set_registers(width, height); + *height = w->no_list_items * 12; } /** * * rct2: 0x006724FC */ -static void window_editor_objective_options_rides_scrollmousedown() +static void window_editor_objective_options_rides_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) { rct_ride *ride; - rct_window *w; - short x, y, scrollIndex; int i; - window_scrollmouse_get_registers(w, scrollIndex, x, y); - i = y / 12; if (i < 0 || i >= w->no_list_items) return; @@ -1181,14 +1135,10 @@ static void window_editor_objective_options_rides_scrollmousedown() * * rct2: 0x006724CC */ -static void window_editor_objective_options_rides_scrollmouseover() +static void window_editor_objective_options_rides_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) { - rct_window *w; - short x, y, scrollIndex; int i; - window_scrollmouse_get_registers(w, scrollIndex, x, y); - i = y / 12; if (i < 0 || i >= w->no_list_items) return; @@ -1203,12 +1153,10 @@ static void window_editor_objective_options_rides_scrollmouseover() * * rct2: 0x006722B5 */ -static void window_editor_objective_options_rides_invalidate() +static void window_editor_objective_options_rides_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; - window_get_register(w); colour_scheme_update(w); widgets = window_editor_objective_options_widgets[w->page]; @@ -1229,13 +1177,8 @@ static void window_editor_objective_options_rides_invalidate() * * rct2: 0x00672340 */ -static void window_editor_objective_options_rides_paint() +static void window_editor_objective_options_rides_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_editor_objective_options_draw_tab_images(w, dpi); @@ -1246,16 +1189,12 @@ static void window_editor_objective_options_rides_paint() * * rct2: 0x0067236F */ -static void window_editor_objective_options_rides_scrollpaint() +static void window_editor_objective_options_rides_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { int i, y, colour; rct_string_id stringId; - rct_window *w; - rct_drawpixelinfo *dpi; rct_ride *ride; - window_paint_get_registers(w, dpi); - colour = RCT2_GLOBAL(0x0141FC48 + (w->colours[1] * 8), uint8); gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, colour); diff --git a/src/windows/editor_scenario_options.c b/src/windows/editor_scenario_options.c index f505aca17a..3fc3a95f49 100644 --- a/src/windows/editor_scenario_options.c +++ b/src/windows/editor_scenario_options.c @@ -184,130 +184,128 @@ static rct_widget *window_editor_scenario_options_widgets[] = { #pragma region Events -static void window_editor_scenario_options_emptysub() { } - -static void window_editor_scenario_options_financial_mouseup(); -static void window_editor_scenario_options_financial_resize(); +static void window_editor_scenario_options_financial_mouseup(rct_window *w, int widgetIndex); +static void window_editor_scenario_options_financial_resize(rct_window *w); static void window_editor_scenario_options_financial_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); static void window_editor_scenario_options_financial_update(rct_window *w); -static void window_editor_scenario_options_financial_invalidate(); -static void window_editor_scenario_options_financial_paint(); +static void window_editor_scenario_options_financial_invalidate(rct_window *w); +static void window_editor_scenario_options_financial_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_editor_scenario_options_guests_mouseup(); -static void window_editor_scenario_options_guests_resize(); +static void window_editor_scenario_options_guests_mouseup(rct_window *w, int widgetIndex); +static void window_editor_scenario_options_guests_resize(rct_window *w); static void window_editor_scenario_options_guests_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); static void window_editor_scenario_options_guests_update(rct_window *w); -static void window_editor_scenario_options_guests_invalidate(); -static void window_editor_scenario_options_guests_paint(); +static void window_editor_scenario_options_guests_invalidate(rct_window *w); +static void window_editor_scenario_options_guests_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_editor_scenario_options_park_mouseup(); -static void window_editor_scenario_options_park_resize(); +static void window_editor_scenario_options_park_mouseup(rct_window *w, int widgetIndex); +static void window_editor_scenario_options_park_resize(rct_window *w); static void window_editor_scenario_options_park_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); -static void window_editor_scenario_options_park_dropdown(); +static void window_editor_scenario_options_park_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_editor_scenario_options_park_update(rct_window *w); -static void window_editor_scenario_options_park_invalidate(); -static void window_editor_scenario_options_park_paint(); +static void window_editor_scenario_options_park_invalidate(rct_window *w); +static void window_editor_scenario_options_park_paint(rct_window *w, rct_drawpixelinfo *dpi); // 0x0097EB60 -static void* window_scenario_options_financial_events[] = { - window_editor_scenario_options_emptysub, +static rct_window_event_list window_scenario_options_financial_events = { + NULL, window_editor_scenario_options_financial_mouseup, window_editor_scenario_options_financial_resize, window_editor_scenario_options_financial_mousedown, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, + NULL, + NULL, window_editor_scenario_options_financial_update, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_editor_scenario_options_financial_invalidate, window_editor_scenario_options_financial_paint, - window_editor_scenario_options_emptysub + NULL }; // 0x0097EBD0 -static void* window_scenario_options_guests_events[] = { - window_editor_scenario_options_emptysub, +static rct_window_event_list window_scenario_options_guests_events = { + NULL, window_editor_scenario_options_guests_mouseup, window_editor_scenario_options_guests_resize, window_editor_scenario_options_guests_mousedown, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, + NULL, + NULL, window_editor_scenario_options_guests_update, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_editor_scenario_options_guests_invalidate, window_editor_scenario_options_guests_paint, - window_editor_scenario_options_emptysub + NULL }; // 0x0097EC40 -static void* window_scenario_options_park_events[] = { - window_editor_scenario_options_emptysub, +static rct_window_event_list window_scenario_options_park_events = { + NULL, window_editor_scenario_options_park_mouseup, window_editor_scenario_options_park_resize, window_editor_scenario_options_park_mousedown, window_editor_scenario_options_park_dropdown, - window_editor_scenario_options_emptysub, + NULL, window_editor_scenario_options_park_update, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, - window_editor_scenario_options_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_editor_scenario_options_park_invalidate, window_editor_scenario_options_park_paint, - window_editor_scenario_options_emptysub + NULL }; -static void* window_editor_scenario_options_page_events[] = { - window_scenario_options_financial_events, - window_scenario_options_guests_events, - window_scenario_options_park_events +static rct_window_event_list *window_editor_scenario_options_page_events[] = { + &window_scenario_options_financial_events, + &window_scenario_options_guests_events, + &window_scenario_options_park_events }; #pragma endregion @@ -434,13 +432,8 @@ static void window_editor_scenario_options_set_page(rct_window *w, int page) * * rct2: 0x0067049D */ -static void window_editor_scenario_options_financial_mouseup() +static void window_editor_scenario_options_financial_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -476,12 +469,8 @@ static void window_editor_scenario_options_financial_mouseup() * * rct2: 0x0067077A */ -static void window_editor_scenario_options_financial_resize() +static void window_editor_scenario_options_financial_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 280, 149, 280, 149); } @@ -587,13 +576,11 @@ static void window_editor_scenario_options_financial_update(rct_window *w) * * rct2: 0x006701CF */ -static void window_editor_scenario_options_financial_invalidate() +static void window_editor_scenario_options_financial_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; int i; - window_get_register(w); colour_scheme_update(w); widgets = window_editor_scenario_options_widgets[w->page]; @@ -640,14 +627,10 @@ static void window_editor_scenario_options_financial_invalidate() * * rct2: 0x00670338 */ -static void window_editor_scenario_options_financial_paint() +static void window_editor_scenario_options_financial_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int x, y; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_editor_scenario_options_draw_tab_images(w, dpi); @@ -700,13 +683,8 @@ static void window_editor_scenario_options_financial_paint() * * rct2: 0x00670A62 */ -static void window_editor_scenario_options_guests_mouseup() +static void window_editor_scenario_options_guests_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -731,12 +709,8 @@ static void window_editor_scenario_options_guests_mouseup() * * rct2: 0x00670C59 */ -static void window_editor_scenario_options_guests_resize() +static void window_editor_scenario_options_guests_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 380, 149, 380, 149); } @@ -829,12 +803,10 @@ static void window_editor_scenario_options_guests_update(rct_window *w) * * rct2: 0x006707DB */ -static void window_editor_scenario_options_guests_invalidate() +static void window_editor_scenario_options_guests_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; - window_get_register(w); colour_scheme_update(w); widgets = window_editor_scenario_options_widgets[w->page]; @@ -877,14 +849,10 @@ static void window_editor_scenario_options_guests_invalidate() * * rct2: 0x006708C4 */ -static void window_editor_scenario_options_guests_paint() +static void window_editor_scenario_options_guests_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int x, y, arg; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_editor_scenario_options_draw_tab_images(w, dpi); @@ -943,13 +911,8 @@ static void window_editor_scenario_options_guests_paint() * * rct2: 0x00670FD8 */ -static void window_editor_scenario_options_park_mouseup() +static void window_editor_scenario_options_park_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -986,12 +949,8 @@ static void window_editor_scenario_options_park_mouseup() * * rct2: 0x00671287 */ -static void window_editor_scenario_options_park_resize() +static void window_editor_scenario_options_park_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 400, 183, 400, 183); } @@ -1079,13 +1038,8 @@ static void window_editor_scenario_options_park_mousedown(int widgetIndex, rct_w * * rct2: 0x00671060 */ -static void window_editor_scenario_options_park_dropdown() +static void window_editor_scenario_options_park_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - rct_window *w; - short widgetIndex, dropdownIndex; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (widgetIndex == WIDX_PAY_FOR_PARK_OR_RIDES_DROPDOWN && dropdownIndex != -1) { if(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) { if (dropdownIndex == 0) { @@ -1132,14 +1086,12 @@ static void window_editor_scenario_options_park_update(rct_window *w) * * rct2: 0x00670CBA */ -static void window_editor_scenario_options_park_invalidate() +static void window_editor_scenario_options_park_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; int i; uint64 pressedWidgets; - window_get_register(w); colour_scheme_update(w); widgets = window_editor_scenario_options_widgets[w->page]; @@ -1205,15 +1157,11 @@ static void window_editor_scenario_options_park_invalidate() * * rct2: 0x00670E5B */ -static void window_editor_scenario_options_park_paint() +static void window_editor_scenario_options_park_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int x, y, arg; rct_string_id stringId; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_editor_scenario_options_draw_tab_images(w, dpi); diff --git a/src/windows/error.c b/src/windows/error.c index c3779f4b3e..35b699a66b 100644 --- a/src/windows/error.c +++ b/src/windows/error.c @@ -34,39 +34,38 @@ static rct_widget window_error_widgets[] = { { WIDGETS_END } }; -static void window_error_emptysub() { } -static void window_error_unknown5(); -static void window_error_paint(); +static void window_error_unknown5(rct_window *w); +static void window_error_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_error_events[] = { - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_unknown5, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_emptysub, - (uint32*)window_error_paint, - (uint32*)window_error_emptysub +static rct_window_event_list window_error_events = { + NULL, + NULL, + NULL, + NULL, + NULL, + window_error_unknown5, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_error_paint, + NULL }; static char _window_error_text[512]; @@ -134,7 +133,7 @@ void window_error_open(rct_string_id title, rct_string_id message) y = min(y, maxY); } - w = window_create(x, y, width, height, (uint32*)window_error_events, WC_ERROR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_RESIZABLE); + w = window_create(x, y, width, height, &window_error_events, WC_ERROR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_RESIZABLE); w->widgets = window_error_widgets; w->error.var_480 = 0; if (!(RCT2_GLOBAL(0x009A8C29, uint8) & 1)) @@ -145,12 +144,8 @@ void window_error_open(rct_string_id title, rct_string_id message) * * rct2: 0x00667BFE */ -static void window_error_unknown5() +static void window_error_unknown5(rct_window *w) { - rct_window *w; - - window_get_register(w); - w->error.var_480++; if (w->error.var_480 >= 8) window_close(w); @@ -160,14 +155,10 @@ static void window_error_unknown5() * * rct2: 0x00667AA3 */ -static void window_error_paint() +static void window_error_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int t, l, r, b; - window_paint_get_registers(w, dpi); - l = w->x; t = w->y; r = w->x + w->width - 1; diff --git a/src/windows/finances.c b/src/windows/finances.c index 686cc84f04..4aaa95ba39 100644 --- a/src/windows/finances.c +++ b/src/windows/finances.c @@ -202,240 +202,238 @@ static rct_widget *window_finances_page_widgets[] = { #pragma region Events -static void window_finances_emptysub() { } - -static void window_finances_summary_mouseup(); +static void window_finances_summary_mouseup(rct_window *w, int widgetIndex); static void window_finances_summary_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); static void window_finances_summary_update(rct_window *w); -static void window_finances_summary_invalidate(); -static void window_finances_summary_paint(); +static void window_finances_summary_invalidate(rct_window *w); +static void window_finances_summary_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_finances_financial_graph_mouseup(); +static void window_finances_financial_graph_mouseup(rct_window *w, int widgetIndex); static void window_finances_financial_graph_update(rct_window *w); -static void window_finances_financial_graph_invalidate(); -static void window_finances_financial_graph_paint(); +static void window_finances_financial_graph_invalidate(rct_window *w); +static void window_finances_financial_graph_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_finances_park_value_graph_mouseup(); +static void window_finances_park_value_graph_mouseup(rct_window *w, int widgetIndex); static void window_finances_park_value_graph_update(rct_window *w); -static void window_finances_park_value_graph_invalidate(); -static void window_finances_park_value_graph_paint(); +static void window_finances_park_value_graph_invalidate(rct_window *w); +static void window_finances_park_value_graph_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_finances_profit_graph_mouseup(); +static void window_finances_profit_graph_mouseup(rct_window *w, int widgetIndex); static void window_finances_profit_graph_update(rct_window *w); -static void window_finances_profit_graph_invalidate(); -static void window_finances_profit_graph_paint(); +static void window_finances_profit_graph_invalidate(rct_window *w); +static void window_finances_profit_graph_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_finances_marketing_mouseup(); +static void window_finances_marketing_mouseup(rct_window *w, int widgetIndex); static void window_finances_marketing_update(rct_window *w); -static void window_finances_marketing_invalidate(); -static void window_finances_marketing_paint(); +static void window_finances_marketing_invalidate(rct_window *w); +static void window_finances_marketing_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_finances_research_mouseup(); +static void window_finances_research_mouseup(rct_window *w, int widgetIndex); static void window_finances_research_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_finances_research_dropdown(); +static void window_finances_research_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_finances_research_update(rct_window *w); -static void window_finances_research_invalidate(); -static void window_finances_research_paint(); +static void window_finances_research_invalidate(rct_window *w); +static void window_finances_research_paint(rct_window *w, rct_drawpixelinfo *dpi); // 0x00988EB8 -static void* window_finances_summary_events[] = { - window_finances_emptysub, +static rct_window_event_list window_finances_summary_events = { + NULL, window_finances_summary_mouseup, - window_finances_emptysub, + NULL, window_finances_summary_mousedown, - window_finances_emptysub, - window_finances_emptysub, + NULL, + NULL, window_finances_summary_update, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_finances_summary_invalidate, window_finances_summary_paint, - window_finances_emptysub + NULL }; // 0x00988F28 -static void* window_finances_financial_graph_events[] = { - window_finances_emptysub, +static rct_window_event_list window_finances_financial_graph_events = { + NULL, window_finances_financial_graph_mouseup, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, + NULL, + NULL, + NULL, + NULL, window_finances_financial_graph_update, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_finances_financial_graph_invalidate, window_finances_financial_graph_paint, - window_finances_emptysub + NULL }; // 0x00988F98 -static void* window_finances_value_graph_events[] = { - window_finances_emptysub, +static rct_window_event_list window_finances_value_graph_events = { + NULL, window_finances_park_value_graph_mouseup, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, + NULL, + NULL, + NULL, + NULL, window_finances_park_value_graph_update, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_finances_park_value_graph_invalidate, window_finances_park_value_graph_paint, - window_finances_emptysub + NULL }; // 0x00989008 -static void* window_finances_profit_graph_events[] = { - window_finances_emptysub, +static rct_window_event_list window_finances_profit_graph_events = { + NULL, window_finances_profit_graph_mouseup, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, + NULL, + NULL, + NULL, + NULL, window_finances_profit_graph_update, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_finances_profit_graph_invalidate, window_finances_profit_graph_paint, - window_finances_emptysub + NULL }; // 0x00989078 -static void* window_finances_marketing_events[] = { - window_finances_emptysub, +static rct_window_event_list window_finances_marketing_events = { + NULL, window_finances_marketing_mouseup, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, + NULL, + NULL, + NULL, + NULL, window_finances_marketing_update, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_finances_marketing_invalidate, window_finances_marketing_paint, - window_finances_emptysub + NULL }; // 0x009890E8 -static void* window_finances_research_events[] = { - window_finances_emptysub, +static rct_window_event_list window_finances_research_events = { + NULL, window_finances_research_mouseup, - window_finances_emptysub, + NULL, window_finances_research_mousedown, window_finances_research_dropdown, - window_finances_emptysub, + NULL, window_finances_research_update, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, - window_finances_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_finances_research_invalidate, window_finances_research_paint, - window_finances_emptysub + NULL }; -static void* window_finances_page_events[] = { - window_finances_summary_events, - window_finances_financial_graph_events, - window_finances_value_graph_events, - window_finances_profit_graph_events, - window_finances_marketing_events, - window_finances_research_events +static rct_window_event_list *window_finances_page_events[] = { + &window_finances_summary_events, + &window_finances_financial_graph_events, + &window_finances_value_graph_events, + &window_finances_profit_graph_events, + &window_finances_marketing_events, + &window_finances_research_events }; static void window_finances_set_colours(); @@ -583,13 +581,8 @@ void window_finances_research_open() * * rct2: 0x0069CA99 */ -static void window_finances_summary_mouseup() +static void window_finances_summary_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (widgetIndex == WIDX_CLOSE) window_close(w); else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_6) @@ -636,11 +629,8 @@ static void window_finances_summary_update(rct_window *w) * * rct2: 0x0069C732 */ -static void window_finances_summary_invalidate() +static void window_finances_summary_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); if (w->widgets != window_finances_page_widgets[WINDOW_FINANCES_PAGE_SUMMARY]) { @@ -656,14 +646,10 @@ static void window_finances_summary_invalidate() * * rct2: 0x0069C771 */ -static void window_finances_summary_paint() +static void window_finances_summary_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int i, j, x, y; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_finances_draw_tab_images(dpi, w); @@ -781,13 +767,8 @@ static void window_finances_summary_paint() * * rct2: 0x0069CF70 */ -static void window_finances_financial_graph_mouseup() +static void window_finances_financial_graph_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (widgetIndex == WIDX_CLOSE) window_close(w); else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_6) @@ -810,11 +791,8 @@ static void window_finances_financial_graph_update(rct_window *w) * * rct2: 0x0069CBDB */ -static void window_finances_financial_graph_invalidate() +static void window_finances_financial_graph_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); if (w->widgets != window_finances_page_widgets[WINDOW_FINANCES_PAGE_FINANCIAL_GRAPH]) { @@ -829,14 +807,10 @@ static void window_finances_financial_graph_invalidate() * * rct2: 0x0069CC10 */ -static void window_finances_financial_graph_paint() +static void window_finances_financial_graph_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int i, x, y, graphLeft, graphTop, graphRight, graphBottom; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_finances_draw_tab_images(dpi, w); @@ -903,13 +877,8 @@ static void window_finances_financial_graph_paint() * * rct2: 0x0069D338 */ -static void window_finances_park_value_graph_mouseup() +static void window_finances_park_value_graph_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (widgetIndex == WIDX_CLOSE) window_close(w); else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_6) @@ -932,11 +901,8 @@ static void window_finances_park_value_graph_update(rct_window *w) * * rct2: 0x0069CFC0 */ -static void window_finances_park_value_graph_invalidate() +static void window_finances_park_value_graph_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); if (w->widgets != window_finances_page_widgets[WINDOW_FINANCES_PAGE_VALUE_GRAPH]) { @@ -951,14 +917,10 @@ static void window_finances_park_value_graph_invalidate() * * rct2: 0x0069CFF5 */ -static void window_finances_park_value_graph_paint() +static void window_finances_park_value_graph_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int i, x, y, graphLeft, graphTop, graphRight, graphBottom; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_finances_draw_tab_images(dpi, w); @@ -1021,13 +983,8 @@ static void window_finances_park_value_graph_paint() * * rct2: 0x0069D715 */ -static void window_finances_profit_graph_mouseup() +static void window_finances_profit_graph_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (widgetIndex == WIDX_CLOSE) window_close(w); else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_6) @@ -1050,11 +1007,8 @@ static void window_finances_profit_graph_update(rct_window *w) * * rct2: 0x0069D388 */ -static void window_finances_profit_graph_invalidate() +static void window_finances_profit_graph_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); if (w->widgets != window_finances_page_widgets[WINDOW_FINANCES_PAGE_PROFIT_GRAPH]) { @@ -1069,14 +1023,10 @@ static void window_finances_profit_graph_invalidate() * * rct2: 0x0069D3BD */ -static void window_finances_profit_graph_paint() +static void window_finances_profit_graph_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int i, x, y, graphLeft, graphTop, graphRight, graphBottom; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_finances_draw_tab_images(dpi, w); @@ -1139,13 +1089,8 @@ static void window_finances_profit_graph_paint() * * rct2: 0x0069D9F9 */ -static void window_finances_marketing_mouseup() +static void window_finances_marketing_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (widgetIndex == WIDX_CLOSE) window_close(w); else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_6) @@ -1171,12 +1116,10 @@ static void window_finances_marketing_update(rct_window *w) * * rct2: 0x0069D765 */ -static void window_finances_marketing_invalidate() +static void window_finances_marketing_invalidate(rct_window *w) { - rct_window *w; int i; - window_get_register(w); colour_scheme_update(w); if (w->widgets != window_finances_page_widgets[WINDOW_FINANCES_PAGE_MARKETING]) { @@ -1228,16 +1171,12 @@ static void window_finances_marketing_invalidate() * * rct2: 0x0069D834 */ -static void window_finances_marketing_paint() +static void window_finances_marketing_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int i, x, y; rct_ride *ride; rct_string_id shopString, weeksRemainingStringId; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_finances_draw_tab_images(dpi, w); @@ -1322,14 +1261,10 @@ static void window_finances_marketing_paint() * * rct2: 0x0069DB3F */ -static void window_finances_research_mouseup() +static void window_finances_research_mouseup(rct_window *w, int widgetIndex) { - rct_window * w; - short widgetIndex; int activeResearchTypes; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -1392,14 +1327,8 @@ static void window_finances_research_mousedown(int widgetIndex, rct_window *w, r * * rct2: 0x0069DB6D */ -static void window_finances_research_dropdown() +static void window_finances_research_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - rct_window *w; - short widgetIndex; - short dropdownIndex; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (widgetIndex != WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON || dropdownIndex == -1) return; @@ -1422,11 +1351,8 @@ static void window_finances_research_update(rct_window *w) * * rct2: 0x0069DA64 */ -static void window_finances_research_invalidate() +static void window_finances_research_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); if (w->widgets != window_finances_page_widgets[WINDOW_FINANCES_PAGE_RESEARCH]) { @@ -1471,13 +1397,8 @@ static void window_finances_research_invalidate() * * rct2: 0x0069DAF0 */ -static void window_finances_research_paint() +static void window_finances_research_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_finances_draw_tab_images(dpi, w); diff --git a/src/windows/footpath.c b/src/windows/footpath.c index c3135efe4a..c5bfd9586f 100644 --- a/src/windows/footpath.c +++ b/src/windows/footpath.c @@ -103,48 +103,47 @@ static rct_widget window_footpath_widgets[] = { { WIDGETS_END }, }; -static void window_footpath_emptysub() { } -static void window_footpath_close(); -static void window_footpath_mouseup(); +static void window_footpath_close(rct_window *w); +static void window_footpath_mouseup(rct_window *w, int widgetIndex); static void window_footpath_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); -static void window_footpath_dropdown(); +static void window_footpath_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_footpath_update(rct_window *w); -static void window_footpath_toolupdate(); -static void window_footpath_tooldown(); -static void window_footpath_tooldrag(); -static void window_footpath_toolup(); -static void window_footpath_invalidate(); -static void window_footpath_paint(); +static void window_footpath_toolupdate(rct_window* w, int widgetIndex, int x, int y); +static void window_footpath_tooldown(rct_window* w, int widgetIndex, int x, int y); +static void window_footpath_tooldrag(rct_window* w, int widgetIndex, int x, int y); +static void window_footpath_toolup(rct_window* w, int widgetIndex, int x, int y); +static void window_footpath_invalidate(rct_window *w); +static void window_footpath_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_footpath_events[] = { +static rct_window_event_list window_footpath_events = { window_footpath_close, window_footpath_mouseup, - window_footpath_emptysub, + NULL, window_footpath_mousedown, window_footpath_dropdown, - window_footpath_emptysub, + NULL, window_footpath_update, - window_footpath_emptysub, - window_footpath_emptysub, + NULL, + NULL, window_footpath_toolupdate, window_footpath_tooldown, window_footpath_tooldrag, window_footpath_toolup, - window_footpath_emptysub, - window_footpath_emptysub, - window_footpath_emptysub, - window_footpath_emptysub, - window_footpath_emptysub, - window_footpath_emptysub, - window_footpath_emptysub, - window_footpath_emptysub, - window_footpath_emptysub, - window_footpath_emptysub, - window_footpath_emptysub, - window_footpath_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_footpath_invalidate, window_footpath_paint, - window_footpath_emptysub + NULL }; money32 _window_footpath_cost; @@ -182,7 +181,7 @@ void window_footpath_open() 29, 106, 381, - (uint32*)window_footpath_events, + &window_footpath_events, WC_FOOTPATH, 0 ); @@ -226,12 +225,8 @@ void window_footpath_open() * * rct2: 0x006A852F */ -static void window_footpath_close() +static void window_footpath_close(rct_window *w) { - rct_window *w; - - window_get_register(w); - footpath_provisional_update(); viewport_set_visibility(0); map_invalidate_map_selection_tiles(); @@ -244,13 +239,8 @@ static void window_footpath_close() * * rct2: 0x006A7E92 */ -static void window_footpath_mouseup() +static void window_footpath_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -335,16 +325,11 @@ static void window_footpath_mousedown(int widgetIndex, rct_window*w, rct_widget* * * rct2: 0x006A7F18 */ -static void window_footpath_dropdown() +static void window_footpath_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { int i, j, pathId; - short dropdownIndex; - short widgetIndex; - rct_window *w; rct_path_type *pathType; - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (widgetIndex == WIDX_FOOTPATH_TYPE) RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_PATH_TYPE, uint8) = SELECTED_PATH_TYPE_NORMAL; else if (widgetIndex == WIDX_QUEUELINE_TYPE) @@ -390,14 +375,8 @@ static void window_footpath_dropdown() * * rct2: 0x006A8032 */ -static void window_footpath_toolupdate() +static void window_footpath_toolupdate(rct_window* w, int widgetIndex, int x, int y) { - short x, y; - short widgetIndex; - rct_window *w; - - window_tool_get_registers(w, widgetIndex, x, y); - if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) { window_footpath_set_provisional_path_at_point(x, y); } else if (widgetIndex == WIDX_CONSTRUCT_BRIDGE_OR_TUNNEL) { @@ -409,14 +388,8 @@ static void window_footpath_toolupdate() * * rct2: 0x006A8047 */ -static void window_footpath_tooldown() +static void window_footpath_tooldown(rct_window* w, int widgetIndex, int x, int y) { - short x, y; - short widgetIndex; - rct_window *w; - - window_tool_get_registers(w, widgetIndex, x, y); - if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) window_footpath_place_path_at_point(x, y); else if (widgetIndex == WIDX_CONSTRUCT_BRIDGE_OR_TUNNEL) @@ -427,14 +400,8 @@ static void window_footpath_tooldown() * * rct2: 0x006A8067 */ -static void window_footpath_tooldrag() +static void window_footpath_tooldrag(rct_window* w, int widgetIndex, int x, int y) { - short x, y; - short widgetIndex; - rct_window *w; - - window_tool_get_registers(w, widgetIndex, x, y); - if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) { window_footpath_place_path_at_point(x, y); } @@ -444,14 +411,8 @@ static void window_footpath_tooldrag() * * rct2: 0x006A8066 */ -static void window_footpath_toolup() +static void window_footpath_toolup(rct_window* w, int widgetIndex, int x, int y) { - short x, y; - short widgetIndex; - rct_window *w; - - window_tool_get_registers(w, widgetIndex, x, y); - if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) { // The function at 0x006A8380 in rct2 is just the following: RCT2_GLOBAL(RCT2_ADDRESS_PATH_ERROR_OCCURED, uint8) = 0; @@ -524,13 +485,11 @@ static void window_footpath_update(rct_window *w) * * rct2: 0x006A7D1C */ -static void window_footpath_invalidate() +static void window_footpath_invalidate(rct_window *w) { int selectedPath; rct_path_type *pathType; - rct_window *w; - window_get_register(w); colour_scheme_update(w); // Press / unpress footpath and queue type buttons @@ -569,14 +528,10 @@ static void window_footpath_invalidate() * * rct2: 0x006A7D8B */ -static void window_footpath_paint() +static void window_footpath_paint(rct_window *w, rct_drawpixelinfo *dpi) { int x, y, image, selectedPath; rct_path_type *pathType; - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); window_draw_widgets(w, dpi); diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index 8dedde93f4..2c3b41afc8 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -73,14 +73,13 @@ rct_widget window_game_bottom_toolbar_widgets[] = { { WIDGETS_END }, }; -static void window_game_bottom_toolbar_emptysub() { } -static void window_game_bottom_toolbar_mouseup(); -static void window_game_bottom_toolbar_tooltip(); -static void window_game_bottom_toolbar_invalidate(); -static void window_game_bottom_toolbar_paint(); +static void window_game_bottom_toolbar_mouseup(rct_window *w, int widgetIndex); +static void window_game_bottom_toolbar_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_game_bottom_toolbar_invalidate(rct_window *w); +static void window_game_bottom_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_game_bottom_toolbar_update(rct_window* w); -static void window_game_bottom_toolbar_cursor(); -static void window_game_bottom_toolbar_unknown05(); +static void window_game_bottom_toolbar_cursor(rct_window *w, int widgetIndex, int x, int y, int *cursorId); +static void window_game_bottom_toolbar_unknown05(rct_window *w); static void window_game_bottom_toolbar_draw_left_panel(rct_drawpixelinfo *dpi, rct_window *w); static void window_game_bottom_toolbar_draw_park_rating(rct_drawpixelinfo *dpi, rct_window *w, int colour, int x, int y, uint8 factor); @@ -89,35 +88,35 @@ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rc static void window_game_bottom_toolbar_draw_tutorial_text(rct_drawpixelinfo *dpi, rct_window *w); /* rct2: 0x0097BFDC */ -static void* window_game_bottom_toolbar_events[] = { - window_game_bottom_toolbar_emptysub, +static rct_window_event_list window_game_bottom_toolbar_events = { + NULL, window_game_bottom_toolbar_mouseup, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, + NULL, + NULL, + NULL, window_game_bottom_toolbar_unknown05, window_game_bottom_toolbar_update, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, - window_game_bottom_toolbar_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_game_bottom_toolbar_tooltip, window_game_bottom_toolbar_cursor, - window_game_bottom_toolbar_emptysub, + NULL, window_game_bottom_toolbar_invalidate, window_game_bottom_toolbar_paint, - window_game_bottom_toolbar_emptysub + NULL }; static void window_game_bottom_toolbar_invalidate_dirty_widgets(rct_window *w); @@ -133,7 +132,7 @@ void window_game_bottom_toolbar_open() window = window_create( 0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 32, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16), 32, - (uint32*)window_game_bottom_toolbar_events, + &window_game_bottom_toolbar_events, WC_BOTTOM_TOOLBAR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5 ); @@ -162,14 +161,11 @@ void window_game_bottom_toolbar_open() * * rct2: 0x0066C588 */ -static void window_game_bottom_toolbar_mouseup() +static void window_game_bottom_toolbar_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w, *mainWindow; + rct_window *mainWindow; rct_news_item *newsItem; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_LEFT_OUTSET: case WIDX_MONEY: @@ -214,23 +210,17 @@ static void window_game_bottom_toolbar_mouseup() } } -static void window_game_bottom_toolbar_tooltip() +static void window_game_bottom_toolbar_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { int month, day; - short widgetIndex, result; - rct_window *w; - - window_tooltip_get_registers(w, widgetIndex); switch (widgetIndex) { case WIDX_MONEY: RCT2_GLOBAL(0x013CE952, int) = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PROFIT, sint32); RCT2_GLOBAL(0x013CE956, int) = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_VALUE, sint32); - result = 0; break; case WIDX_PARK_RATING: RCT2_GLOBAL(0x013CE952, short) = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, sint16); - result = 0; break; case WIDX_DATE: month = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16) & 7; @@ -238,24 +228,19 @@ static void window_game_bottom_toolbar_tooltip() RCT2_GLOBAL(0x013CE952, short) = STR_DATE_DAY_1 + day; RCT2_GLOBAL(0x013CE954, short) = STR_MONTH_MARCH + month; - result = 0; break; } - - window_tooltip_set_registers(result); } /** * * rct2: 0x0066BBA0 */ -static void window_game_bottom_toolbar_invalidate() +static void window_game_bottom_toolbar_invalidate(rct_window *w) { int x; - rct_window *w; rct_news_item *newsItem; - window_get_register(w); colour_scheme_update(w); // Anchor the middle and right panel to the right @@ -343,13 +328,8 @@ void window_game_bottom_toolbar_invalidate_news_item() * * rct2: 0x0066BC87 */ -static void window_game_bottom_toolbar_paint() +static void window_game_bottom_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - // Draw panel grey backgrounds gfx_fill_rect( dpi, @@ -643,13 +623,9 @@ static void window_game_bottom_toolbar_update(rct_window* w){ } /* rct2: 0x006C644 */ -static void window_game_bottom_toolbar_cursor(){ - rct_window *w; - short widgetIndex, x, y; - - window_cursor_get_registers(w, widgetIndex, x, y); - - switch (widgetIndex){ +static void window_game_bottom_toolbar_cursor(rct_window *w, int widgetIndex, int x, int y, int *cursorId) +{ + switch (widgetIndex) { case WIDX_MONEY: case WIDX_GUESTS: case WIDX_PARK_RATING: @@ -660,11 +636,8 @@ static void window_game_bottom_toolbar_cursor(){ } /* rct2: 0x0066C6F2 */ -static void window_game_bottom_toolbar_unknown05(){ - rct_window* w; - - window_get_register(w); - +static void window_game_bottom_toolbar_unknown05(rct_window *w) +{ window_game_bottom_toolbar_invalidate_dirty_widgets(w); } diff --git a/src/windows/guest.c b/src/windows/guest.c index ffbfaae46c..228ba7b153 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -71,8 +71,6 @@ enum WINDOW_GUEST_WIDGET_IDX { WIDX_RIDE_SCROLL = 10 }; -void window_guest_emptysub(){}; - rct_widget window_guest_overview_widgets[] = { { WWT_FRAME, 0, 0, 191, 0, 156, 0x0FFFFFFFF, STR_NONE }, // Panel / Background { WWT_CAPTION, 0, 1, 190, 1, 14, 865, STR_WINDOW_TITLE_TIP }, // Title @@ -179,245 +177,245 @@ void window_guest_set_page(rct_window* w, int page); void window_guest_disable_widgets(rct_window* w); void window_guest_viewport_init(rct_window* w); -void window_guest_overview_close(); -void window_guest_overview_resize(); -void window_guest_overview_mouse_up(); -void window_guest_overview_paint(); -void window_guest_overview_invalidate(); -void window_guest_overview_viewport_init_wrapper(); +void window_guest_overview_close(rct_window *w); +void window_guest_overview_resize(rct_window *w); +void window_guest_overview_mouse_up(rct_window *w, int widgetIndex); +void window_guest_overview_paint(rct_window *w, rct_drawpixelinfo *dpi); +void window_guest_overview_invalidate(rct_window *w); +void window_guest_overview_unknown_14(rct_window *w); void window_guest_overview_update(rct_window* w); -void window_guest_overview_text_input(); -void window_guest_overview_tool_update(); -void window_guest_overview_tool_down(); -void window_guest_overview_tool_abort(); +void window_guest_overview_text_input(rct_window *w, int widgetIndex, char *text); +void window_guest_overview_tool_update(rct_window* w, int widgetIndex, int x, int y); +void window_guest_overview_tool_down(rct_window* w, int widgetIndex, int x, int y); +void window_guest_overview_tool_abort(rct_window *w, int widgetIndex); -static void* window_guest_overview_events[] = { +void window_guest_mouse_up(rct_window *w, int widgetIndex); +void window_guest_unknown_05(rct_window *w); + +void window_guest_stats_resize(rct_window *w); +void window_guest_stats_update(rct_window *w); +void window_guest_stats_invalidate(rct_window *w); +void window_guest_stats_paint(rct_window *w, rct_drawpixelinfo *dpi); + +void window_guest_rides_resize(rct_window *w); +void window_guest_rides_update(rct_window *w); +void window_guest_rides_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +void window_guest_rides_scroll_get_size(rct_window *w, int scrollIndex, int *width, int *height); +void window_guest_rides_scroll_mouse_down(rct_window *w, int scrollIndex, int x, int y); +void window_guest_rides_scroll_mouse_over(rct_window *w, int scrollIndex, int x, int y); +void window_guest_rides_invalidate(rct_window *w); +void window_guest_rides_paint(rct_window *w, rct_drawpixelinfo *dpi); +void window_guest_rides_scroll_paint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); + +void window_guest_finance_resize(rct_window *w); +void window_guest_finance_update(rct_window *w); +void window_guest_finance_invalidate(rct_window *w); +void window_guest_finance_paint(rct_window *w, rct_drawpixelinfo *dpi); + +void window_guest_thoughts_resize(rct_window *w); +void window_guest_thoughts_update(rct_window *w); +void window_guest_thoughts_invalidate(rct_window *w); +void window_guest_thoughts_paint(rct_window *w, rct_drawpixelinfo *dpi); + +void window_guest_inventory_resize(rct_window *w); +void window_guest_inventory_update(rct_window *w); +void window_guest_inventory_invalidate(rct_window *w); +void window_guest_inventory_paint(rct_window *w, rct_drawpixelinfo *dpi); + +static rct_window_event_list window_guest_overview_events = { window_guest_overview_close, window_guest_overview_mouse_up, window_guest_overview_resize, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, + NULL, + NULL, + NULL, window_guest_overview_update, - window_guest_emptysub, - window_guest_emptysub, - window_guest_overview_tool_update,//tool_update - window_guest_overview_tool_down,//tool_down - window_guest_emptysub, - window_guest_emptysub, - window_guest_overview_tool_abort,//tool_abort - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_overview_text_input,//text_input - window_guest_overview_viewport_init_wrapper, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_overview_invalidate, //Invalidate - window_guest_overview_paint, //Paint - window_guest_emptysub + NULL, + NULL, + window_guest_overview_tool_update, + window_guest_overview_tool_down, + NULL, + NULL, + window_guest_overview_tool_abort, + NULL, + NULL, + NULL, + NULL, + NULL, + window_guest_overview_text_input, + window_guest_overview_unknown_14, + NULL, + NULL, + NULL, + NULL, + window_guest_overview_invalidate, + window_guest_overview_paint, + NULL }; -void window_guest_mouse_up(); -void window_guest_unknown_05(); - -void window_guest_stats_resize(); -void window_guest_stats_update(); -void window_guest_stats_invalidate(); -void window_guest_stats_paint(); - -static void* window_guest_stats_events[] = { - window_guest_emptysub, - window_guest_mouse_up, //mouse_up - window_guest_stats_resize, //resize - window_guest_emptysub, - window_guest_emptysub, +static rct_window_event_list window_guest_stats_events = { + NULL, + window_guest_mouse_up, + window_guest_stats_resize, + NULL, + NULL, window_guest_unknown_05, window_guest_stats_update, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_stats_invalidate, //invalidate - window_guest_stats_paint, //paint - window_guest_emptysub + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_guest_stats_invalidate, + window_guest_stats_paint, + NULL }; -void window_guest_rides_resize(); -void window_guest_rides_update(); -void window_guest_rides_tooltip(); -void window_guest_rides_scroll_get_size(); -void window_guest_rides_scroll_mouse_down(); -void window_guest_rides_scroll_mouse_over(); -void window_guest_rides_invalidate(); -void window_guest_rides_paint(); -void window_guest_rides_scroll_paint(); - -static void* window_guest_rides_events[] = { - window_guest_emptysub, - window_guest_mouse_up, //mouse_up - window_guest_rides_resize, //resize - window_guest_emptysub, - window_guest_emptysub, +static rct_window_event_list window_guest_rides_events = { + NULL, + window_guest_mouse_up, + window_guest_rides_resize, + NULL, + NULL, window_guest_unknown_05, window_guest_rides_update, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_rides_scroll_get_size, //scroll_get_size - window_guest_rides_scroll_mouse_down, //scroll_mouse_down - window_guest_emptysub, - window_guest_rides_scroll_mouse_over, //scroll_mouse_over - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_rides_tooltip, //tooltip - window_guest_emptysub, - window_guest_emptysub, - window_guest_rides_invalidate, //invalidate - window_guest_rides_paint, //paint - window_guest_rides_scroll_paint //scroll_paint + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_guest_rides_scroll_get_size, + window_guest_rides_scroll_mouse_down, + NULL, + window_guest_rides_scroll_mouse_over, + NULL, + NULL, + NULL, + window_guest_rides_tooltip, + NULL, + NULL, + window_guest_rides_invalidate, + window_guest_rides_paint, + window_guest_rides_scroll_paint }; -void window_guest_finance_resize(); -void window_guest_finance_update(); -void window_guest_finance_invalidate(); -void window_guest_finance_paint(); - -static void* window_guest_finance_events[] = { - window_guest_emptysub, - window_guest_mouse_up, //mouse_up - window_guest_finance_resize, //resize - window_guest_emptysub, - window_guest_emptysub, +static rct_window_event_list window_guest_finance_events = { + NULL, + window_guest_mouse_up, + window_guest_finance_resize, + NULL, + NULL, window_guest_unknown_05, window_guest_finance_update, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_finance_invalidate, //invalidate - window_guest_finance_paint, //paint - window_guest_emptysub + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_guest_finance_invalidate, + window_guest_finance_paint, + NULL }; -void window_guest_thoughts_resize(); -void window_guest_thoughts_update(); -void window_guest_thoughts_invalidate(); -void window_guest_thoughts_paint(); - -static void* window_guest_thoughts_events[] = { - window_guest_emptysub, - window_guest_mouse_up, //mouse_up - window_guest_thoughts_resize, //resize - window_guest_emptysub, - window_guest_emptysub, +static rct_window_event_list window_guest_thoughts_events = { + NULL, + window_guest_mouse_up, + window_guest_thoughts_resize, + NULL, + NULL, window_guest_unknown_05, window_guest_thoughts_update, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_thoughts_invalidate, //invalidate - window_guest_thoughts_paint, //paint - window_guest_emptysub + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_guest_thoughts_invalidate, + window_guest_thoughts_paint, + NULL }; -void window_guest_inventory_resize(); -void window_guest_inventory_update(); -void window_guest_inventory_invalidate(); -void window_guest_inventory_paint(); - -static void* window_guest_inventory_events[] = { - window_guest_emptysub, - window_guest_mouse_up, //mouse_up - window_guest_inventory_resize, //resize - window_guest_emptysub, - window_guest_emptysub, +static rct_window_event_list window_guest_inventory_events = { + NULL, + window_guest_mouse_up, + window_guest_inventory_resize, + NULL, + NULL, window_guest_unknown_05, window_guest_inventory_update, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_emptysub, - window_guest_inventory_invalidate, //invalidate - window_guest_inventory_paint, //paint - window_guest_emptysub + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_guest_inventory_invalidate, + window_guest_inventory_paint, + NULL }; //0x981D24 -void* window_guest_page_events[] = { - window_guest_overview_events, - window_guest_stats_events, - window_guest_rides_events, - window_guest_finance_events, - window_guest_thoughts_events, - window_guest_inventory_events +static rct_window_event_list *window_guest_page_events[] = { + &window_guest_overview_events, + &window_guest_stats_events, + &window_guest_rides_events, + &window_guest_finance_events, + &window_guest_thoughts_events, + &window_guest_inventory_events }; void window_guest_set_colours(); @@ -493,7 +491,7 @@ void window_guest_open(rct_peep* peep){ window = window_bring_to_front_by_number(WC_PEEP, peep->sprite_index); if (window == NULL){ - window = window_create_auto_pos(192, 157, (uint32*)window_guest_overview_events, WC_PEEP, WF_RESIZABLE); + window = window_create_auto_pos(192, 157, &window_guest_overview_events, WC_PEEP, WF_RESIZABLE); window->widgets = window_guest_overview_widgets; window->enabled_widgets = window_guest_page_enabled_widgets[0]; window->number = peep->sprite_index; @@ -552,24 +550,17 @@ void window_guest_disable_widgets(rct_window* w){ } /* rct2: 0x00696A75 */ -void window_guest_overview_close(){ - rct_window* w; - - window_get_register(w); - +void window_guest_overview_close(rct_window *w) +{ if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE){ if (w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS,rct_windowclass) && - w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER,rct_windownumber)) + w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER,rct_windownumber)) tool_cancel(); } } /* rct2: 0x00696FBE */ -void window_guest_overview_resize(){ - rct_window* w; - - window_get_register(w); - +void window_guest_overview_resize(rct_window *w){ window_guest_disable_widgets(w); window_event_invalidate_call(w); @@ -596,10 +587,8 @@ void window_guest_overview_resize(){ } /* rct2: 0x00696A06 */ -void window_guest_overview_mouse_up(){ - short widgetIndex; - rct_window* w; - window_widget_get_registers(w, widgetIndex); +void window_guest_overview_mouse_up(rct_window *w, int widgetIndex) +{ rct_peep* peep = GET_PEEP(w->number); switch(widgetIndex){ @@ -687,10 +676,8 @@ void window_guest_set_page(rct_window* w, int page){ if (listen && w->viewport) w->viewport->flags |= VIEWPORT_FLAG_SOUND_ON; } -void window_guest_overview_viewport_init_wrapper(){ - rct_window* w; - window_get_register(w); - +void window_guest_overview_unknown_14(rct_window *w) +{ window_guest_viewport_init(w); } @@ -953,12 +940,8 @@ void window_guest_inventory_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ } /* rct2: 0x696887 */ -void window_guest_overview_paint(){ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +void window_guest_overview_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ window_draw_widgets(w, dpi); window_guest_overview_tab_paint(w, dpi); window_guest_stats_tab_paint(w, dpi); @@ -1025,9 +1008,8 @@ void window_guest_overview_paint(){ } /* rct2: 0x696749*/ -void window_guest_overview_invalidate(){ - rct_window* w; - window_get_register(w); +void window_guest_overview_invalidate(rct_window *w) +{ colour_scheme_update(w); if (window_guest_page_widgets[w->page] != w->widgets){ @@ -1111,17 +1093,13 @@ void window_guest_overview_update(rct_window* w){ } /* rct2:0x696A6A */ -void window_guest_overview_text_input(){ - short widgetIndex; - rct_window *w; - char _cl; - uint32* text; +void window_guest_overview_text_input(rct_window *w, int widgetIndex, char *text) +{ + if (widgetIndex != WIDX_RENAME) + return; - window_text_input_get_registers(w, widgetIndex, _cl, text); - - if (widgetIndex != WIDX_RENAME)return; - - if (!_cl) return; + if (text == NULL) + return; RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = 0x5AE; @@ -1131,14 +1109,10 @@ void window_guest_overview_text_input(){ } /* rct2: 0x696A5F */ -void window_guest_overview_tool_update(){ - short widgetIndex; - rct_window* w; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - - if (widgetIndex != WIDX_PICKUP) return; +void window_guest_overview_tool_update(rct_window* w, int widgetIndex, int x, int y) +{ + if (widgetIndex != WIDX_PICKUP) + return; map_invalidate_selection_rect(); @@ -1183,14 +1157,10 @@ void window_guest_overview_tool_update(){ } /* rct2: 0x696A54 */ -void window_guest_overview_tool_down(){ - short widgetIndex; - rct_window* w; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - - if (widgetIndex != WIDX_PICKUP) return; +void window_guest_overview_tool_down(rct_window* w, int widgetIndex, int x, int y) +{ + if (widgetIndex != WIDX_PICKUP) + return; int dest_x, dest_y; rct_map_element *mapElement; @@ -1242,16 +1212,14 @@ void window_guest_overview_tool_down(){ } /* rct2: 0x696A49 */ -void window_guest_overview_tool_abort(){ - short widgetIndex; - rct_window* w; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - if (widgetIndex != WIDX_PICKUP) return; +void window_guest_overview_tool_abort(rct_window *w, int widgetIndex) +{ + if (widgetIndex != WIDX_PICKUP) + return; rct_peep* peep = GET_PEEP(w->number); - if (peep->state != PEEP_STATE_PICKED) return; + if (peep->state != PEEP_STATE_PICKED) + return; sprite_move( w->var_48C, peep->y, peep->z + 8, (rct_sprite*)peep); invalidate_sprite((rct_sprite*)peep); @@ -1273,11 +1241,8 @@ void window_guest_overview_tool_abort(){ /* rct2:0x69744F, 0x697795, 0x697BDD, 0x697E18, 0x698279 * This is a combination of 5 functions that were identical */ -void window_guest_mouse_up(){ - short widgetIndex; - rct_window* w; - window_widget_get_registers(w, widgetIndex); - +void window_guest_mouse_up(rct_window *w, int widgetIndex) +{ switch (widgetIndex){ case WIDX_CLOSE: window_close(w); @@ -1294,28 +1259,22 @@ void window_guest_mouse_up(){ } /* rct2: 0x697488 */ -void window_guest_stats_resize(){ - rct_window* w; - window_get_register(w); - +void window_guest_stats_resize(rct_window *w) +{ window_set_resize(w, 192, 162, 192, 162); } /* rct2: 0x6974ED, 0x00697959, 0x00697C7B, 0x00697ED2, 0x00698333 * This is a combination of 5 functions that were identical */ -void window_guest_unknown_05(){ - rct_window* w; - window_get_register(w); - +void window_guest_unknown_05(rct_window *w) +{ widget_invalidate(w, WIDX_TAB_1); } /* rct2: 0x69746A */ -void window_guest_stats_update(){ - rct_window* w; - window_get_register(w); - +void window_guest_stats_update(rct_window *w) +{ w->frame_no++; rct_peep* peep = GET_PEEP(w->number); peep->var_45 &= ~(1<<1); @@ -1324,9 +1283,8 @@ void window_guest_stats_update(){ } /* rct2: 0x69707D */ -void window_guest_stats_invalidate(){ - rct_window* w; - window_get_register(w); +void window_guest_stats_invalidate(rct_window *w) +{ colour_scheme_update(w); if (w->widgets != window_guest_page_widgets[w->page]) { @@ -1380,12 +1338,8 @@ void window_guest_stats_bars_paint(int value, int x, int y, rct_window *w, rct_d } /* rct2: 0x0069711D */ -void window_guest_stats_paint(){ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +void window_guest_stats_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ window_draw_widgets(w, dpi); window_guest_overview_tab_paint(w, dpi); window_guest_stats_tab_paint(w, dpi); @@ -1536,18 +1490,14 @@ void window_guest_stats_paint(){ } /* rct2: 0x006978F4 */ -void window_guest_rides_resize(){ - rct_window* w; - window_get_register(w); - +void window_guest_rides_resize(rct_window *w) +{ window_set_resize(w, 192, 128, 500, 400); } /* rct2: 0x6977B0 */ -void window_guest_rides_update(){ - rct_window* w; - window_get_register(w); - +void window_guest_rides_update(rct_window *w) +{ w->frame_no++; widget_invalidate(w, WIDX_TAB_2); @@ -1580,27 +1530,22 @@ void window_guest_rides_update(){ } /* rct2: 0x697844 */ -void window_guest_rides_tooltip(){ +void window_guest_rides_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) +{ RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; } /* rct2: 0x69784E */ -void window_guest_rides_scroll_get_size() +void window_guest_rides_scroll_get_size(rct_window *w, int scrollIndex, int *width, int *height) { - rct_window *w; - int width, height; - - window_get_register(w); - - width = 0; - height = w->no_list_items * 10; + *height = w->no_list_items * 10; if (w->selected_list_item != -1){ w->selected_list_item = -1; window_invalidate(w); } - int visable_height = height + int visable_height = *height - window_guest_rides_widgets[WIDX_RIDE_SCROLL].bottom + window_guest_rides_widgets[WIDX_RIDE_SCROLL].top + 21; @@ -1611,17 +1556,12 @@ void window_guest_rides_scroll_get_size() w->scrolls[0].v_top = visable_height; window_invalidate(w); } - - window_scrollsize_set_registers(width, height); } /* rct2: 0x006978CC */ -void window_guest_rides_scroll_mouse_down(){ +void window_guest_rides_scroll_mouse_down(rct_window *w, int scrollIndex, int x, int y) +{ int index; - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); index = y / 10; if (index >= w->no_list_items) return; @@ -1630,12 +1570,9 @@ void window_guest_rides_scroll_mouse_down(){ } /* rct2: 0x0069789C */ -void window_guest_rides_scroll_mouse_over(){ +void window_guest_rides_scroll_mouse_over(rct_window *w, int scrollIndex, int x, int y) +{ int index; - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); index = y / 10; if (index >= w->no_list_items)return; @@ -1647,9 +1584,8 @@ void window_guest_rides_scroll_mouse_over(){ } /* rct2: 0x0069757A */ -void window_guest_rides_invalidate(){ - rct_window* w; - window_get_register(w); +void window_guest_rides_invalidate(rct_window *w) +{ colour_scheme_update(w); if (window_guest_page_widgets[w->page] != w->widgets){ @@ -1681,12 +1617,8 @@ void window_guest_rides_invalidate(){ } /* rct2: 0x00697637 */ -void window_guest_rides_paint(){ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +void window_guest_rides_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ window_draw_widgets(w, dpi); window_guest_overview_tab_paint(w, dpi); window_guest_stats_tab_paint(w, dpi); @@ -1720,12 +1652,8 @@ void window_guest_rides_paint(){ } /* rct2: 0x006976FC */ -void window_guest_rides_scroll_paint(){ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +void window_guest_rides_scroll_paint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) +{ // ax int left = dpi->x; // bx @@ -1752,18 +1680,14 @@ void window_guest_rides_scroll_paint(){ } /* rct2: 0x00697C16 */ -void window_guest_finance_resize(){ - rct_window* w; - window_get_register(w); - +void window_guest_finance_resize(rct_window *w) +{ window_set_resize(w, 210, 134, 210, 134); } /* rct2: 0x00697BF8 */ -void window_guest_finance_update(){ - rct_window* w; - window_get_register(w); - +void window_guest_finance_update(rct_window *w) +{ w->frame_no++; widget_invalidate(w, WIDX_TAB_2); @@ -1771,9 +1695,8 @@ void window_guest_finance_update(){ } /* rct2: 0x00697968 */ -void window_guest_finance_invalidate(){ - rct_window* w; - window_get_register(w); +void window_guest_finance_invalidate(rct_window *w) +{ colour_scheme_update(w); if (window_guest_page_widgets[w->page] != w->widgets){ @@ -1803,12 +1726,8 @@ void window_guest_finance_invalidate(){ } /* rct2: 0x00697A08 */ -void window_guest_finance_paint(){ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +void window_guest_finance_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ window_draw_widgets(w, dpi); window_guest_overview_tab_paint(w, dpi); window_guest_stats_tab_paint(w, dpi); @@ -1886,10 +1805,8 @@ void window_guest_finance_paint(){ } /* rct2: 0x00697E33 */ -void window_guest_thoughts_resize(){ - rct_window* w; - window_get_register(w); - +void window_guest_thoughts_resize(rct_window *w) +{ rct_peep* peep = GET_PEEP(w->number); if (peep->var_45 & 1){ peep->var_45 &=~(1 << 0); @@ -1900,10 +1817,8 @@ void window_guest_thoughts_resize(){ } /* rct2: 0x00697EB4 */ -void window_guest_thoughts_update(){ - rct_window* w; - window_get_register(w); - +void window_guest_thoughts_update(rct_window *w) +{ w->frame_no++; widget_invalidate(w, WIDX_TAB_2); @@ -1911,9 +1826,8 @@ void window_guest_thoughts_update(){ } /* rct2: 0x00697C8A */ -void window_guest_thoughts_invalidate(){ - rct_window* w; - window_get_register(w); +void window_guest_thoughts_invalidate(rct_window *w) +{ colour_scheme_update(w); if (window_guest_page_widgets[w->page] != w->widgets){ @@ -1943,12 +1857,8 @@ void window_guest_thoughts_invalidate(){ } /* rct2: 0x00697D2A */ -void window_guest_thoughts_paint(){ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +void window_guest_thoughts_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ window_draw_widgets(w, dpi); window_guest_overview_tab_paint(w, dpi); window_guest_stats_tab_paint(w, dpi); @@ -1989,10 +1899,8 @@ void window_guest_thoughts_paint(){ /* rct2: 0x00698294 */ -void window_guest_inventory_resize(){ - rct_window* w; - window_get_register(w); - +void window_guest_inventory_resize(rct_window *w) +{ rct_peep* peep = GET_PEEP(w->number); if (peep->var_45 & (1<<3)){ peep->var_45 &= ~(1 << 3); @@ -2003,10 +1911,8 @@ void window_guest_inventory_resize(){ } /* rct2: 0x00698315 */ -void window_guest_inventory_update(){ - rct_window* w; - window_get_register(w); - +void window_guest_inventory_update(rct_window *w) +{ w->frame_no++; widget_invalidate(w, WIDX_TAB_2); @@ -2014,9 +1920,8 @@ void window_guest_inventory_update(){ } /* rct2: 0x00697EE1 */ -void window_guest_inventory_invalidate(){ - rct_window* w; - window_get_register(w); +void window_guest_inventory_invalidate(rct_window *w) +{ colour_scheme_update(w); if (window_guest_page_widgets[w->page] != w->widgets){ @@ -2046,12 +1951,8 @@ void window_guest_inventory_invalidate(){ } /* rct2: 0x00697F81 */ -void window_guest_inventory_paint(){ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +void window_guest_inventory_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ window_draw_widgets(w, dpi); window_guest_overview_tab_paint(w, dpi); window_guest_stats_tab_paint(w, dpi); diff --git a/src/windows/guest_list.c b/src/windows/guest_list.c index 47fff45313..145defa3b5 100644 --- a/src/windows/guest_list.c +++ b/src/windows/guest_list.c @@ -72,46 +72,45 @@ static rct_widget window_guest_list_widgets[] = { { WIDGETS_END }, }; -static void window_guest_list_emptysub() { } -static void window_guest_list_mouseup(); -static void window_guest_list_resize(); +static void window_guest_list_mouseup(rct_window *w, int widgetIndex); +static void window_guest_list_resize(rct_window *w); static void window_guest_list_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_guest_list_dropdown(); +static void window_guest_list_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_guest_list_update(rct_window *w); -static void window_guest_list_scrollgetsize(); -static void window_guest_list_scrollmousedown(); -static void window_guest_list_scrollmouseover(); -static void window_guest_list_tooltip(); -static void window_guest_list_invalidate(); -static void window_guest_list_paint(); -static void window_guest_list_scrollpaint(); +static void window_guest_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_guest_list_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_guest_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_guest_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_guest_list_invalidate(rct_window *w); +static void window_guest_list_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_guest_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void* window_guest_list_events[] = { - window_guest_list_emptysub, +static rct_window_event_list window_guest_list_events = { + NULL, window_guest_list_mouseup, window_guest_list_resize, window_guest_list_mousedown, window_guest_list_dropdown, - window_guest_list_emptysub, + NULL, window_guest_list_update, - window_guest_list_emptysub, - window_guest_list_emptysub, - window_guest_list_emptysub, - window_guest_list_emptysub, - window_guest_list_emptysub, - window_guest_list_emptysub, - window_guest_list_emptysub, - window_guest_list_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_guest_list_scrollgetsize, window_guest_list_scrollmousedown, - window_guest_list_emptysub, + NULL, window_guest_list_scrollmouseover, - window_guest_list_emptysub, - window_guest_list_emptysub, - window_guest_list_emptysub, + NULL, + NULL, + NULL, window_guest_list_tooltip, - window_guest_list_emptysub, - window_guest_list_emptysub, + NULL, + NULL, window_guest_list_invalidate, window_guest_list_paint, window_guest_list_scrollpaint @@ -148,7 +147,7 @@ void window_guest_list_open() if (window != NULL) return; - window = window_create_auto_pos(350, 330, (uint32*)window_guest_list_events, WC_GUEST_LIST, WF_10 | WF_RESIZABLE); + window = window_create_auto_pos(350, 330, &window_guest_list_events, WC_GUEST_LIST, WF_10 | WF_RESIZABLE); window->widgets = window_guest_list_widgets; window->enabled_widgets = (1 << WIDX_CLOSE) | @@ -265,13 +264,8 @@ void window_guest_list_open_with_filter(int type, int index) * * rct2: 0x00699AAF */ -static void window_guest_list_mouseup() +static void window_guest_list_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -286,12 +280,8 @@ static void window_guest_list_mouseup() * * rct2: 0x00699EA3 */ -static void window_guest_list_resize() +static void window_guest_list_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - w->min_width = 350; w->min_height = 330; if (w->width < w->min_width) { @@ -373,13 +363,8 @@ static void window_guest_list_mousedown(int widgetIndex, rct_window*w, rct_widge * * rct2: 0x00699AE1 */ -static void window_guest_list_dropdown() +static void window_guest_list_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - short dropdownIndex, widgetIndex; - rct_window *w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - switch (widgetIndex) { case WIDX_PAGE_DROPDOWN_BUTTON: if (dropdownIndex == -1) @@ -414,14 +399,11 @@ static void window_guest_list_update(rct_window *w) * * rct2: 0x00699C55 */ -static void window_guest_list_scrollgetsize() +static void window_guest_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - int i, y, numGuests, spriteIndex, width, height; - rct_window *w; + int i, y, numGuests, spriteIndex; rct_peep *peep; - window_get_register(w); - switch (_window_guest_list_selected_tab) { case PAGE_INDIVIDUAL: // Count the number of guests @@ -467,25 +449,19 @@ static void window_guest_list_scrollgetsize() window_invalidate(w); } - width = 447; - height = y; - - window_scrollsize_set_registers(width, height); + *width = 447; + *height = y; } /** * * rct2: 0x00699D7D */ -static void window_guest_list_scrollmousedown() +static void window_guest_list_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) { int i, spriteIndex; - short x, y, scrollIndex; - rct_window *w; rct_peep *peep; - window_scrollmouse_get_registers(w, scrollIndex, x, y); - switch (_window_guest_list_selected_tab) { case PAGE_INDIVIDUAL: i = y / 10; @@ -525,13 +501,9 @@ static void window_guest_list_scrollmousedown() * * rct2: 0x00699D3B */ -static void window_guest_list_scrollmouseover() +static void window_guest_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) { int i; - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); i = y / (_window_guest_list_selected_tab == PAGE_INDIVIDUAL ? 10 : 21); i += _window_guest_list_selected_page * 3173; @@ -545,7 +517,7 @@ static void window_guest_list_scrollmouseover() * * rct2: 0x00699E4A */ -static void window_guest_list_tooltip() +static void window_guest_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; } @@ -554,11 +526,8 @@ static void window_guest_list_tooltip() * * rct2: 0x00699511 */ -static void window_guest_list_invalidate() +static void window_guest_list_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); w->pressed_widgets &= ~(1 << WIDX_TAB_1); @@ -587,13 +556,9 @@ static void window_guest_list_invalidate() * * rct2: 0x006995CC */ -static void window_guest_list_paint() +static void window_guest_list_paint(rct_window *w, rct_drawpixelinfo *dpi) { int i, x, y, format; - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); // Widgets window_draw_widgets(w, dpi); @@ -647,17 +612,13 @@ static void window_guest_list_paint() * * rct2: 0x00699701 */ -static void window_guest_list_scrollpaint() +static void window_guest_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { int spriteIndex, format, numGuests, i, j, y; - rct_window *w; - rct_drawpixelinfo *dpi; rct_peep *peep; rct_peep_thought *thought; uint32 argument_1, argument_2; - window_paint_get_registers(w, dpi); - // Background fill gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ((char*)0x0141FC48)[w->colours[1] * 8]); diff --git a/src/windows/install_track.c b/src/windows/install_track.c index c98aca69d0..6a8a25517c 100644 --- a/src/windows/install_track.c +++ b/src/windows/install_track.c @@ -53,42 +53,41 @@ static rct_widget window_install_track_widgets[] = { { WIDGETS_END }, }; -static void window_install_track_emptysub() { } -static void window_install_track_close(); -static void window_install_track_mouseup(); -static void window_install_track_invalidate(); -static void window_install_track_paint(); -static void window_install_track_text_input(); +static void window_install_track_close(rct_window *w); +static void window_install_track_mouseup(rct_window *w, int widgetIndex); +static void window_install_track_invalidate(rct_window *w); +static void window_install_track_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_install_track_text_input(rct_window *w, int widgetIndex, char *text); -static void* window_install_track_events[] = { - (uint32*)window_install_track_close, - (uint32*)window_install_track_mouseup, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_text_input, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_emptysub, - (uint32*)window_install_track_invalidate, - (uint32*)window_install_track_paint, - (uint32*)window_install_track_emptysub +static rct_window_event_list window_install_track_events = { + window_install_track_close, + window_install_track_mouseup, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_install_track_text_input, + NULL, + NULL, + NULL, + NULL, + NULL, + window_install_track_invalidate, + window_install_track_paint, + NULL }; ride_list_item _window_install_track_item; @@ -127,7 +126,7 @@ void window_install_track_open(const char* path) x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2 - 201; y = max(28, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) / 2 - 200); - w = window_create(x, y, 402, 400, (uint32*)window_install_track_events, WC_INSTALL_TRACK, 0); + w = window_create(x, y, 402, 400, &window_install_track_events, WC_INSTALL_TRACK, 0); w->widgets = window_install_track_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_ROTATE) | (1 << WIDX_TOGGLE_SCENERY) | (1 << WIDX_INSTALL) | (1 << WIDX_CANCEL); window_init_scroll_widgets(w); @@ -210,7 +209,7 @@ static void window_install_track_select(rct_window *w, int index) * * rct2: 0x006D41DC */ -static void window_install_track_close() +static void window_install_track_close(rct_window *w) { free(RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_CACHE, void*)); } @@ -219,12 +218,9 @@ static void window_install_track_close() * * rct2: 0x006D407A */ -static void window_install_track_mouseup() +static void window_install_track_mouseup(rct_window *w, int widgetIndex) { - rct_window *w; - short widgetIndex, result; - - window_widget_get_registers(w, widgetIndex); + int result; switch (widgetIndex) { case WIDX_CLOSE: @@ -264,10 +260,8 @@ static void window_install_track_mouseup() * * rct2: 0x006D3B06 */ -static void window_install_track_invalidate() +static void window_install_track_invalidate(rct_window *w) { - rct_window *w; - window_get_register(w); colour_scheme_update(w); w->pressed_widgets |= 1 << WIDX_TRACK_PREVIEW; @@ -288,10 +282,8 @@ static void window_install_track_invalidate() * * rct2: 0x006D3B1F */ -static void window_install_track_paint() +static void window_install_track_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_widget *widget; rct_track_design *trackDesign = NULL; uint8 *image, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8); @@ -300,8 +292,6 @@ static void window_install_track_paint() int x, y, colour, gForces, airTime; rct_g1_element tmpElement, *subsituteElement; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); if (w->track_list.var_482 == 0xFFFF) @@ -467,21 +457,14 @@ static void window_install_track_paint() * * rct2: 0x006D40A7 */ -static void window_install_track_text_input(){ - short widgetIndex; - rct_window *w; - char _cl; - char* text; - - window_text_input_get_registers(w, widgetIndex, _cl, text); - if (_cl == 0) - { +static void window_install_track_text_input(rct_window *w, int widgetIndex, char *text) +{ + if (text == NULL) { window_close(w); return; } - if (widgetIndex == WIDX_INSTALL){ - + if (widgetIndex == WIDX_INSTALL) { char* extension_pointer = track_dest_name; while (*extension_pointer++ != '.'); --extension_pointer; diff --git a/src/windows/land.c b/src/windows/land.c index 02bcd0961b..7e8c0e385b 100644 --- a/src/windows/land.c +++ b/src/windows/land.c @@ -53,47 +53,46 @@ static rct_widget window_land_widgets[] = { { WIDGETS_END }, }; -static void window_land_emptysub() { } -static void window_land_close(); -static void window_land_mouseup(); +static void window_land_close(rct_window *w); +static void window_land_mouseup(rct_window *w, int widgetIndex); static void window_land_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_land_dropdown(); +static void window_land_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_land_update(rct_window *w); -static void window_land_invalidate(); -static void window_land_paint(); -static void window_land_textinput(); +static void window_land_invalidate(rct_window *w); +static void window_land_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_land_textinput(rct_window *w, int widgetIndex, char *text); static void window_land_inputsize(rct_window *w); -static void* window_land_events[] = { +static rct_window_event_list window_land_events = { window_land_close, window_land_mouseup, - window_land_emptysub, + NULL, window_land_mousedown, window_land_dropdown, - window_land_emptysub, + NULL, window_land_update, - window_land_emptysub, - window_land_emptysub, - window_land_emptysub, - window_land_emptysub, - window_land_emptysub, - window_land_emptysub, - window_land_emptysub, - window_land_emptysub, - window_land_emptysub, - window_land_emptysub, - window_land_emptysub, - window_land_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_land_textinput, - window_land_emptysub, - window_land_emptysub, - window_land_emptysub, - window_land_emptysub, - window_land_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_land_invalidate, window_land_paint, - window_land_emptysub + NULL }; static char window_land_floor_texture_order[] = { @@ -127,7 +126,7 @@ void window_land_open() if (window_find_by_class(WC_LAND) != NULL) return; - window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 98, 29, 98, 126, (uint32*)window_land_events, WC_LAND, 0); + window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 98, 29, 98, 126, &window_land_events, WC_LAND, 0); window->widgets = window_land_widgets; window->enabled_widgets = (1 << WIDX_CLOSE) | @@ -153,7 +152,7 @@ void window_land_open() * * rct2: 0x006640A5 */ -static void window_land_close() +static void window_land_close(rct_window *w) { // If the tool wasn't changed, turn tool off if (land_tool_is_active()) @@ -164,13 +163,9 @@ static void window_land_close() * * rct2: 0x00664064 */ -static void window_land_mouseup() +static void window_land_mouseup(rct_window *w, int widgetIndex) { int limit; - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); switch (widgetIndex) { case WIDX_CLOSE: @@ -267,13 +262,9 @@ static void window_land_mousedown(int widgetIndex, rct_window*w, rct_widget* wid * * rct2: 0x00664090 */ -static void window_land_dropdown() +static void window_land_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { int type; - short dropdownIndex, widgetIndex; - rct_window *w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); switch (widgetIndex) { case WIDX_FLOOR: @@ -311,18 +302,12 @@ static void window_land_dropdown() } } -static void window_land_textinput() +static void window_land_textinput(rct_window *w, int widgetIndex, char *text) { - uint8 result; - short widgetIndex; - rct_window *w; - char *text; int size; char* end; - window_textinput_get_registers(w, widgetIndex, result, text); - - if (widgetIndex != WIDX_PREVIEW || !result) + if (widgetIndex != WIDX_PREVIEW || text == NULL) return; size = strtol(text, &end, 10); @@ -355,11 +340,8 @@ static void window_land_update(rct_window *w) * * rct2: 0x00663F20 */ -static void window_land_invalidate() +static void window_land_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); w->pressed_widgets = (1 << WIDX_PREVIEW); @@ -381,15 +363,11 @@ static void window_land_invalidate() * * rct2: 0x00663F7C */ -static void window_land_paint() +static void window_land_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int x, y, numTiles; money32 price; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); x = w->x + (window_land_widgets[WIDX_PREVIEW].left + window_land_widgets[WIDX_PREVIEW].right) / 2; diff --git a/src/windows/land_rights.c b/src/windows/land_rights.c index a9bdad8db6..4585068c18 100644 --- a/src/windows/land_rights.c +++ b/src/windows/land_rights.c @@ -56,44 +56,43 @@ static rct_widget window_land_rights_widgets[] = { static int window_land_rights_should_close(); -static void window_land_rights_emptysub() { } -static void window_land_rights_close(); -static void window_land_rights_mouseup(); -static void window_land_rights_update(); -static void window_land_rights_invalidate(); -static void window_land_rights_paint(); -static void window_land_rights_textinput(); +static void window_land_rights_close(rct_window *w); +static void window_land_rights_mouseup(rct_window *w, int widgetIndex); +static void window_land_rights_update(rct_window *w); +static void window_land_rights_invalidate(rct_window *w); +static void window_land_rights_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_land_rights_textinput(rct_window *w, int widgetIndex, char *text); static void window_land_rights_inputsize(rct_window *w); -static void* window_land_rights_events[] = { +static rct_window_event_list window_land_rights_events = { window_land_rights_close, window_land_rights_mouseup, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, + NULL, + NULL, + NULL, + NULL, window_land_rights_update, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_land_rights_textinput, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, - window_land_rights_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_land_rights_invalidate, window_land_rights_paint, - window_land_rights_emptysub + NULL }; void window_land_rights_open() @@ -104,7 +103,7 @@ void window_land_rights_open() if (window_find_by_class(WC_LAND_RIGHTS) != NULL) return; - window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 98, 29, 98, 94, (uint32*)window_land_rights_events, WC_LAND_RIGHTS, 0); + window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 98, 29, 98, 94, &window_land_rights_events, WC_LAND_RIGHTS, 0); window->widgets = window_land_rights_widgets; window->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_DECREMENT) | (1 << WIDX_INCREMENT) | (1 << WIDX_PREVIEW) | (1 << WIDX_BUY_LAND_RIGHTS) | (1 << WIDX_BUY_CONSTRUCTION_RIGHTS); @@ -120,7 +119,7 @@ void window_land_rights_open() show_land_rights(); } -static void window_land_rights_close() +static void window_land_rights_close(rct_window *w) { //if (LandRightsMode) // hide_land_rights(); @@ -131,13 +130,9 @@ static void window_land_rights_close() tool_cancel(); } -static void window_land_rights_mouseup() +static void window_land_rights_mouseup(rct_window *w, int widgetIndex) { - rct_window *w; int limit; - short widgetIndex; - - window_widget_get_registers(w, widgetIndex); switch (widgetIndex) { case WIDX_CLOSE: @@ -187,18 +182,12 @@ static void window_land_rights_mouseup() } } -static void window_land_rights_textinput() +static void window_land_rights_textinput(rct_window *w, int widgetIndex, char *text) { - uint8 result; - short widgetIndex; - rct_window *w; - char *text; int size; char* end; - window_textinput_get_registers(w, widgetIndex, result, text); - - if (widgetIndex != WIDX_PREVIEW || !result) + if (widgetIndex != WIDX_PREVIEW || text == NULL) return; size = strtol(text, &end, 10); @@ -224,11 +213,8 @@ static void window_land_rights_update(rct_window *w) window_close(w); } -static void window_land_rights_invalidate() +static void window_land_rights_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); // Set the preview image button to be pressed down @@ -241,14 +227,10 @@ static void window_land_rights_invalidate() 0xFFFFFFFF; } -static void window_land_rights_paint() +static void window_land_rights_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int x, y; - window_paint_get_registers(w, dpi); - x = w->x + (window_land_rights_widgets[WIDX_PREVIEW].left + window_land_rights_widgets[WIDX_PREVIEW].right) / 2; y = w->y + (window_land_rights_widgets[WIDX_PREVIEW].top + window_land_rights_widgets[WIDX_PREVIEW].bottom) / 2; diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 5b83b99b58..55da869e33 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -64,45 +64,44 @@ static rct_widget window_loadsave_widgets[] = { #pragma region Events -void window_loadsave_emptysub() { } -static void window_loadsave_close(); -static void window_loadsave_mouseup(); +static void window_loadsave_close(rct_window *w); +static void window_loadsave_mouseup(rct_window *w, int widgetIndex); static void window_loadsave_update(rct_window *w); -static void window_loadsave_scrollgetsize(); -static void window_loadsave_scrollmousedown(); -static void window_loadsave_scrollmouseover(); -static void window_loadsave_textinput(); -static void window_loadsave_tooltip(); -static void window_loadsave_invalidate(); -static void window_loadsave_paint(); -static void window_loadsave_scrollpaint(); +static void window_loadsave_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_loadsave_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_loadsave_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_loadsave_textinput(rct_window *w, int widgetIndex, char *text); +static void window_loadsave_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_loadsave_invalidate(rct_window *w); +static void window_loadsave_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_loadsave_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void* window_loadsave_events[] = { +static rct_window_event_list window_loadsave_events = { window_loadsave_close, window_loadsave_mouseup, - window_loadsave_emptysub, - window_loadsave_emptysub, - window_loadsave_emptysub, - window_loadsave_emptysub, - window_loadsave_emptysub, - window_loadsave_emptysub, - window_loadsave_emptysub, - window_loadsave_emptysub, - window_loadsave_emptysub, - window_loadsave_emptysub, - window_loadsave_emptysub, - window_loadsave_emptysub, - window_loadsave_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_loadsave_scrollgetsize, window_loadsave_scrollmousedown, - window_loadsave_emptysub, + NULL, window_loadsave_scrollmouseover, window_loadsave_textinput, - window_loadsave_emptysub, - window_loadsave_emptysub, + NULL, + NULL, window_loadsave_tooltip, - window_loadsave_emptysub, - window_loadsave_emptysub, + NULL, + NULL, window_loadsave_invalidate, window_loadsave_paint, window_loadsave_scrollpaint @@ -154,7 +153,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) w = window_bring_to_front_by_class(WC_LOADSAVE); if (w == NULL) { - w = window_create_centred(WW, WH, (uint32*)window_loadsave_events, WC_LOADSAVE, WF_STICK_TO_FRONT); + w = window_create_centred(WW, WH, &window_loadsave_events, WC_LOADSAVE, WF_STICK_TO_FRONT); w->widgets = window_loadsave_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_SORT_NAME) | (1 << WIDX_SORT_DATE) | (1 << WIDX_BROWSE); w->colours[0] = 7; @@ -253,7 +252,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) return w; } -static void window_loadsave_close() +static void window_loadsave_close(rct_window *w) { if (_listItems != NULL) { free(_listItems); @@ -263,15 +262,11 @@ static void window_loadsave_close() window_close_by_class(WC_LOADSAVE_OVERWRITE_PROMPT); } -static void window_loadsave_mouseup() +static void window_loadsave_mouseup(rct_window *w, int widgetIndex) { - rct_window *w; - short widgetIndex; int result; char filename[MAX_PATH], filter[MAX_PATH]; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex){ case WIDX_CLOSE: window_close(w); @@ -347,26 +342,14 @@ static int has_extension(char *path, char *extension) return 1; } -static void window_loadsave_scrollgetsize() +static void window_loadsave_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - rct_window *w; - int width, height; - - window_get_register(w); - - width = 0; - height = w->no_list_items * 10; - - window_scrollsize_set_registers(width, height); + *height = w->no_list_items * 10; } -static void window_loadsave_scrollmousedown() +static void window_loadsave_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) { int selectedItem; - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); selectedItem = y / 10; if (selectedItem >= w->no_list_items) @@ -408,13 +391,9 @@ static void window_loadsave_scrollmousedown() } } -static void window_loadsave_scrollmouseover() +static void window_loadsave_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) { int selectedItem; - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); selectedItem = y / 10; if (selectedItem >= w->no_list_items) @@ -425,17 +404,12 @@ static void window_loadsave_scrollmouseover() window_invalidate(w); } -static void window_loadsave_textinput() +static void window_loadsave_textinput(rct_window *w, int widgetIndex, char *text) { - rct_window *w; - short widgetIndex; - uint8 result; - char *text, path[MAX_PATH]; + char path[MAX_PATH]; int i, overwrite; - window_textinput_get_registers(w, widgetIndex, result, text); - - if (!result || text[0] == 0) + if (text == NULL || text[0] == 0) return; if (gLoadSaveTitleSequenceSave) { @@ -471,26 +445,18 @@ static void window_loadsave_textinput() window_loadsave_select(w, path); } -static void window_loadsave_tooltip() +static void window_loadsave_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; } -static void window_loadsave_invalidate() +static void window_loadsave_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); } -static void window_loadsave_paint() +static void window_loadsave_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); if (_shortenedDirectory[0] == '\0') @@ -551,16 +517,12 @@ static void shorten_path(char* path, char* buffer, int available_width){ return; } -static void window_loadsave_scrollpaint() +static void window_loadsave_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { int i, y; - rct_window *w; - rct_drawpixelinfo *dpi; rct_string_id stringId, templateStringId = 3165; char *templateString; - window_paint_get_registers(w, dpi); - gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, RCT2_ADDRESS(0x0141FC48,uint8)[w->colours[1] * 8]); templateString = (char*)language_get_string(templateStringId); @@ -868,40 +830,39 @@ static rct_widget window_overwrite_prompt_widgets[] = { { WIDGETS_END } }; -static void window_overwrite_prompt_emptysub(){} -static void window_overwrite_prompt_mouseup(); -static void window_overwrite_prompt_invalidate(); -static void window_overwrite_prompt_paint(); +static void window_overwrite_prompt_mouseup(rct_window *w, int widgetIndex); +static void window_overwrite_prompt_invalidate(rct_window *w); +static void window_overwrite_prompt_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_overwrite_prompt_events[] = { - window_overwrite_prompt_emptysub, +static rct_window_event_list window_overwrite_prompt_events = { + NULL, window_overwrite_prompt_mouseup, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, - window_overwrite_prompt_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_overwrite_prompt_invalidate, window_overwrite_prompt_paint, - window_overwrite_prompt_emptysub + NULL }; static char _window_overwrite_prompt_name[256]; @@ -913,7 +874,7 @@ static rct_window *window_overwrite_prompt_open(const char *name, const char *pa window_close_by_class(WC_LOADSAVE_OVERWRITE_PROMPT); - w = window_create_centred(OVERWRITE_WW, OVERWRITE_WH, (uint32*)window_overwrite_prompt_events, WC_LOADSAVE_OVERWRITE_PROMPT, WF_STICK_TO_FRONT); + w = window_create_centred(OVERWRITE_WW, OVERWRITE_WH, &window_overwrite_prompt_events, WC_LOADSAVE_OVERWRITE_PROMPT, WF_STICK_TO_FRONT); w->widgets = window_overwrite_prompt_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_OVERWRITE_CANCEL) | (1 << WIDX_OVERWRITE_OVERWRITE); window_init_scroll_widgets(w); @@ -926,14 +887,11 @@ static rct_window *window_overwrite_prompt_open(const char *name, const char *pa return w; } -static void window_overwrite_prompt_mouseup() +static void window_overwrite_prompt_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w, *loadsaveWindow; + rct_window *loadsaveWindow; - window_widget_get_registers(w, widgetIndex); - - switch (widgetIndex){ + switch (widgetIndex) { case WIDX_OVERWRITE_OVERWRITE: loadsaveWindow = window_find_by_class(WC_LOADSAVE); if (loadsaveWindow != NULL) @@ -943,24 +901,17 @@ static void window_overwrite_prompt_mouseup() case WIDX_OVERWRITE_CANCEL: case WIDX_OVERWRITE_CLOSE: window_close(w); + break; } } -static void window_overwrite_prompt_invalidate() +static void window_overwrite_prompt_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); } -static void window_overwrite_prompt_paint() +static void window_overwrite_prompt_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); rct_string_id templateStringId = 3165; diff --git a/src/windows/main.c b/src/windows/main.c index cd9e3ace06..1d6fdb8d10 100644 --- a/src/windows/main.c +++ b/src/windows/main.c @@ -28,38 +28,37 @@ rct_widget window_main_widgets[] = { { WIDGETS_END }, }; -void window_main_empty(){} -void window_main_paint(); +void window_main_paint(rct_window *w, rct_drawpixelinfo *dpi); -void* window_main_events[] = { - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, - window_main_empty, +static rct_window_event_list window_main_events = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_main_paint, - window_main_empty + NULL }; /** @@ -75,7 +74,7 @@ void window_main_open() window = window_create( 0, 0, window_main_widgets[0].right, window_main_widgets[0].bottom, - (uint32*)window_main_events, + &window_main_events, WC_MAIN_WINDOW, WF_STICK_TO_BACK ); @@ -97,12 +96,7 @@ void window_main_open() * This function immediately jumps to 0x00685BE1 this is the second function * decompiled. */ -void window_main_paint() +void window_main_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window* w; - rct_drawpixelinfo* dpi; - - window_paint_get_registers(w, dpi); - viewport_render(dpi, w->viewport, dpi->x, dpi->y, dpi->x + dpi->width, dpi->y + dpi->height); } diff --git a/src/windows/map.c b/src/windows/map.c index 22ed38688c..3cc06577be 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -96,50 +96,49 @@ const rct_xy16 MiniMapOffsets[] = { { 0 - 8, 256 } }; -static void window_map_emptysub() { } -static void window_map_close(); -static void window_map_resize(); -static void window_map_mouseup(); +static void window_map_close(rct_window *w); +static void window_map_resize(rct_window *w); +static void window_map_mouseup(rct_window *w, int widgetIndex); static void window_map_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); static void window_map_update(rct_window *w); -static void window_map_toolupdate(); -static void window_map_tooldown(); -static void window_map_tooldrag(); -static void window_map_toolabort(); -static void window_map_scrollgetsize(); -static void window_map_scrollmousedown(); -static void window_map_textinput(); -static void window_map_tooltip(); -static void window_map_invalidate(); -static void window_map_paint(); -static void window_map_scrollpaint(); +static void window_map_toolupdate(rct_window* w, int widgetIndex, int x, int y); +static void window_map_tooldown(rct_window* w, int widgetIndex, int x, int y); +static void window_map_tooldrag(rct_window* w, int widgetIndex, int x, int y); +static void window_map_toolabort(rct_window *w, int widgetIndex); +static void window_map_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_map_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_map_textinput(rct_window *w, int widgetIndex, char *text); +static void window_map_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_map_invalidate(rct_window *w); +static void window_map_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_map_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void* window_map_events[] = { +static rct_window_event_list window_map_events = { window_map_close, window_map_mouseup, window_map_resize, window_map_mousedown, - window_map_emptysub, - window_map_emptysub, + NULL, + NULL, window_map_update, - window_map_emptysub, - window_map_emptysub, + NULL, + NULL, window_map_toolupdate, window_map_tooldown, window_map_tooldrag, - window_map_emptysub, + NULL, window_map_toolabort, - window_map_emptysub, + NULL, window_map_scrollgetsize, window_map_scrollmousedown, window_map_scrollmousedown, - window_map_emptysub, + NULL, window_map_textinput, - window_map_emptysub, - window_map_emptysub, + NULL, + NULL, window_map_tooltip, - window_map_emptysub, - window_map_emptysub, + NULL, + NULL, window_map_invalidate, window_map_paint, window_map_scrollpaint @@ -190,7 +189,7 @@ void window_map_open() return; RCT2_GLOBAL(RCT2_ADDRESS_MAP_IMAGE_DATA, uint32*) = map_image_data; - w = window_create_auto_pos(245, 259, (uint32*)window_map_events, WC_MAP, WF_10); + w = window_create_auto_pos(245, 259, &window_map_events, WC_MAP, WF_10); w->widgets = window_map_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | @@ -228,12 +227,8 @@ void window_map_open() * * rct2: 0x0068D0F1 */ -static void window_map_close() +static void window_map_close(rct_window *w) { - rct_window *w; - - window_get_register(w); - free(RCT2_GLOBAL(RCT2_ADDRESS_MAP_IMAGE_DATA, uint32*)); if ((RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == w->classification && @@ -249,16 +244,11 @@ static void window_map_close() * * rct2: 0x0068CFC1 */ -static void window_map_mouseup() +static void window_map_mouseup(rct_window *w, int widgetIndex) { - rct_window *w; - short widgetIndex; - // Maximum land ownership tool size int landToolSizeLimit; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -374,12 +364,8 @@ static void window_map_mouseup() * * rct2: 0x0068D7DC */ -static void window_map_resize() +static void window_map_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - w->flags |= WF_RESIZABLE; w->min_width = 245; w->max_width = 800; @@ -445,14 +431,8 @@ static void window_map_update(rct_window *w) * * rct2: 0x0068D093 */ -static void window_map_toolupdate() +static void window_map_toolupdate(rct_window* w, int widgetIndex, int x, int y) { - rct_window *w; - short widgetIndex; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - switch (widgetIndex) { case WIDX_SET_LAND_RIGHTS: window_map_set_land_rights_tool_update(x, y); @@ -470,14 +450,8 @@ static void window_map_toolupdate() * * rct2: 0x0068D074 */ -static void window_map_tooldown() +static void window_map_tooldown(rct_window* w, int widgetIndex, int x, int y) { - rct_window *w; - short widgetIndex; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - switch (widgetIndex) { case WIDX_BUILD_PARK_ENTRANCE: window_map_place_park_entrance_tool_down(x, y); @@ -492,14 +466,8 @@ static void window_map_tooldown() * * rct2: 0x0068D088 */ -static void window_map_tooldrag() +static void window_map_tooldrag(rct_window* w, int widgetIndex, int x, int y) { - rct_window *w; - short widgetIndex; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - switch (widgetIndex) { case WIDX_SET_LAND_RIGHTS: if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & (1 << 0)) { @@ -522,14 +490,8 @@ static void window_map_tooldrag() * * rct2: 0x0068D055 */ -static void window_map_toolabort() +static void window_map_toolabort(rct_window *w, int widgetIndex) { - rct_window *w; - short widgetIndex; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - switch (widgetIndex) { case WIDX_SET_LAND_RIGHTS: window_invalidate(w); @@ -557,28 +519,22 @@ static void window_map_toolabort() * * rct2: 0x0068D7CC */ -static void window_map_scrollgetsize() +static void window_map_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - int width, height; + window_map_invalidate(w); - window_map_invalidate(); - - width = 512; - height = 512; - window_scrollsize_set_registers(width, height); + *width = 512; + *height = 512; } /** * * rct2: 0x0068D726 */ -static void window_map_scrollmousedown() +static void window_map_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) { int mapX, mapY, mapZ; - short x, y, scrollIndex; - rct_window *w, *mainWindow; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); + rct_window *mainWindow; map_window_screen_to_map(x, y, &mapX, &mapY); mapX = clamp(0, mapX, 8191); @@ -647,46 +603,41 @@ static void window_map_scrollmousedown() } } -static void window_map_textinput() +static void window_map_textinput(rct_window *w, int widgetIndex, char *text) { - uint8 result; - short widgetIndex; - rct_window *w; - char *text; int size; char* end; - window_textinput_get_registers(w, widgetIndex, result, text); + if (text == NULL) + return; - if (result) { - switch (widgetIndex) { - case WIDX_LAND_TOOL: - size = strtol(text, &end, 10); - if (*end == '\0') { - if (size < 1) size = 1; - if (size > 64) size = 64; - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = size; - window_invalidate(w); - } - break; - case WIDX_MAP_SIZE_SPINNER: - size = strtol(text, &end, 10); - if (*end == '\0') { - if (size < 50) size = 50; - if (size > 256) size = 256; - int currentSize = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16); - while (size < currentSize) { - map_window_decrease_map_size(); - currentSize--; - } - while (size > currentSize) { - map_window_increase_map_size(); - currentSize++; - } - window_invalidate(w); - } - break; + switch (widgetIndex) { + case WIDX_LAND_TOOL: + size = strtol(text, &end, 10); + if (*end == '\0') { + if (size < 1) size = 1; + if (size > 64) size = 64; + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = size; + window_invalidate(w); } + break; + case WIDX_MAP_SIZE_SPINNER: + size = strtol(text, &end, 10); + if (*end == '\0') { + if (size < 50) size = 50; + if (size > 256) size = 256; + int currentSize = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16); + while (size < currentSize) { + map_window_decrease_map_size(); + currentSize--; + } + while (size > currentSize) { + map_window_increase_map_size(); + currentSize++; + } + window_invalidate(w); + } + break; } } @@ -694,7 +645,7 @@ static void window_map_textinput() * * rct2: 0x0068D140 */ -static void window_map_tooltip() +static void window_map_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = 3157; } @@ -703,13 +654,11 @@ static void window_map_tooltip() * * rct2: 0x0068CA8F */ -static void window_map_invalidate() +static void window_map_invalidate(rct_window *w) { - rct_window *w; uint64 pressedWidgets; int i, height; - window_get_register(w); colour_scheme_update(w); // Set the pressed widgets @@ -837,14 +786,10 @@ static void window_map_invalidate() * * rct2: 0x0068CDA9 */ -static void window_map_paint() +static void window_map_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int i, x, y; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_map_draw_tab_images(w, dpi); @@ -893,14 +838,10 @@ static void window_map_paint() * * rct2: 0x0068CF23 */ -static void window_map_scrollpaint() +static void window_map_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_g1_element *g1_element, pushed_g1_element; - window_paint_get_registers(w, dpi); - gfx_clear(dpi, 0x0A0A0A0A); g1_element = &g1Elements[0]; diff --git a/src/windows/map_tooltip.c b/src/windows/map_tooltip.c index 3832471df4..a4dc5695c2 100644 --- a/src/windows/map_tooltip.c +++ b/src/windows/map_tooltip.c @@ -29,39 +29,38 @@ static rct_widget window_map_tooltip_widgets[] = { { WIDGETS_END } }; -static void window_map_tooltip_emptysub() { } static void window_map_tooltip_update(rct_window *w); -static void window_map_tooltip_paint(); +static void window_map_tooltip_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_map_tooltip_events[] = { - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, +static rct_window_event_list window_map_tooltip_events = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_map_tooltip_update, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, - window_map_tooltip_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_map_tooltip_paint, - window_map_tooltip_emptysub + NULL }; #define MAP_TOOLTIP_ARGS @@ -122,7 +121,7 @@ static void window_map_tooltip_open() w = window_find_by_class(WC_MAP_TOOLTIP); if (w == NULL) { w = window_create( - x, y, width, height, (uint32*)window_map_tooltip_events, WC_MAP_TOOLTIP, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5 + x, y, width, height, &window_map_tooltip_events, WC_MAP_TOOLTIP, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5 ); w->widgets = window_map_tooltip_widgets; } else { @@ -147,13 +146,8 @@ static void window_map_tooltip_update(rct_window *w) * * rct2: 0x006EE894 */ -static void window_map_tooltip_paint() +static void window_map_tooltip_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS, rct_string_id) == (rct_string_id)STR_NONE) return; diff --git a/src/windows/mapgen.c b/src/windows/mapgen.c index 01c48c457c..e641556f2c 100644 --- a/src/windows/mapgen.c +++ b/src/windows/mapgen.c @@ -186,124 +186,124 @@ static rct_widget *window_mapgen_page_widgets[] = { #pragma region Events -static void window_mapgen_emptysub() { } - -static void window_mapgen_base_mouseup(); +static void window_mapgen_base_mouseup(rct_window *w, int widgetIndex); static void window_mapgen_base_mousedown(int widgetIndex, rct_window *w, rct_widget* widget); -static void window_mapgen_base_dropdown(); +static void window_mapgen_base_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_mapgen_base_update(rct_window *w); -static void window_mapgen_textinput(); -static void window_mapgen_base_invalidate(); -static void window_mapgen_base_paint(); -static void window_mapgen_random_mouseup(); +static void window_mapgen_textinput(rct_window *w, int widgetIndex, char *text); +static void window_mapgen_base_invalidate(rct_window *w); +static void window_mapgen_base_paint(rct_window *w, rct_drawpixelinfo *dpi); + +static void window_mapgen_random_mouseup(rct_window *w, int widgetIndex); static void window_mapgen_random_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); static void window_mapgen_random_update(rct_window *w); -static void window_mapgen_random_invalidate(); -static void window_mapgen_random_paint(); -static void window_mapgen_simplex_mouseup(); -static void window_mapgen_simplex_mousedown(int widgetIndex, rct_window *w, rct_widget* widget); -static void window_mapgen_simplex_dropdown(); -static void window_mapgen_simplex_update(rct_window *w); -static void window_mapgen_simplex_invalidate(); -static void window_mapgen_simplex_paint(); +static void window_mapgen_random_invalidate(rct_window *w); +static void window_mapgen_random_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_mapgen_base_events[] = { - window_mapgen_emptysub, +static void window_mapgen_simplex_mouseup(rct_window *w, int widgetIndex); +static void window_mapgen_simplex_mousedown(int widgetIndex, rct_window *w, rct_widget* widget); +static void window_mapgen_simplex_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); +static void window_mapgen_simplex_update(rct_window *w); +static void window_mapgen_simplex_invalidate(rct_window *w); +static void window_mapgen_simplex_paint(rct_window *w, rct_drawpixelinfo *dpi); + +static rct_window_event_list window_mapgen_base_events = { + NULL, window_mapgen_base_mouseup, - window_mapgen_emptysub, + NULL, window_mapgen_base_mousedown, window_mapgen_base_dropdown, - window_mapgen_emptysub, + NULL, window_mapgen_base_update, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_mapgen_textinput, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_mapgen_base_invalidate, window_mapgen_base_paint, - window_mapgen_emptysub + NULL }; -static void* window_mapgen_random_events[] = { - window_mapgen_emptysub, +static rct_window_event_list window_mapgen_random_events = { + NULL, window_mapgen_random_mouseup, - window_mapgen_emptysub, + NULL, window_mapgen_random_mousedown, - window_mapgen_emptysub, - window_mapgen_emptysub, + NULL, + NULL, window_mapgen_random_update, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_mapgen_random_invalidate, window_mapgen_random_paint, - window_mapgen_emptysub + NULL }; -static void* window_mapgen_simplex_events[] = { - window_mapgen_emptysub, +static rct_window_event_list window_mapgen_simplex_events = { + NULL, window_mapgen_simplex_mouseup, - window_mapgen_emptysub, + NULL, window_mapgen_simplex_mousedown, window_mapgen_simplex_dropdown, - window_mapgen_emptysub, + NULL, window_mapgen_simplex_update, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, - window_mapgen_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_mapgen_simplex_invalidate, window_mapgen_simplex_paint, - window_mapgen_emptysub + NULL }; -static void* window_mapgen_page_events[] = { - window_mapgen_base_events, - window_mapgen_random_events, - window_mapgen_simplex_events +static rct_window_event_list *window_mapgen_page_events[] = { + &window_mapgen_base_events, + &window_mapgen_random_events, + &window_mapgen_simplex_events }; #pragma endregion @@ -461,14 +461,10 @@ rct_window *window_mapgen_open() #pragma region Base page -static void window_mapgen_base_mouseup() +static void window_mapgen_base_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; mapgen_settings mapgenSettings; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -572,13 +568,9 @@ static void window_mapgen_base_mousedown(int widgetIndex, rct_window *w, rct_wid } } -static void window_mapgen_base_dropdown() +static void window_mapgen_base_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { int type; - short dropdownIndex, widgetIndex; - rct_window *w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); switch (widgetIndex) { case WIDX_FLOOR_TEXTURE: @@ -624,20 +616,13 @@ static void window_mapgen_base_update(rct_window *w) widget_invalidate(w, WIDX_TAB_1); } -static void window_mapgen_textinput() +static void window_mapgen_textinput(rct_window *w, int widgetIndex, char *text) { - uint8 result; - short widgetIndex; - rct_window *w; - char *text; int value; char* end; - window_textinput_get_registers(w, widgetIndex, result, text); - - if (!result) { + if (text == NULL) return; - } value = strtol(text, &end, 10); @@ -661,11 +646,8 @@ static void window_mapgen_textinput() } -static void window_mapgen_base_invalidate() +static void window_mapgen_base_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); if (w->widgets != window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_BASE]) { @@ -680,13 +662,9 @@ static void window_mapgen_base_invalidate() window_mapgen_anchor_border_widgets(w); } -static void window_mapgen_base_paint() +static void window_mapgen_base_paint(rct_window *w, rct_drawpixelinfo *dpi) { uint16 arg; - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); window_draw_widgets(w, dpi); window_mapgen_draw_tab_images(dpi, w); @@ -710,14 +688,10 @@ static void window_mapgen_base_paint() #pragma region Random page -static void window_mapgen_random_mouseup() +static void window_mapgen_random_mouseup(rct_window *w, int widgetIndex) { - rct_window * w; - short widgetIndex; mapgen_settings mapgenSettings; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -765,11 +739,8 @@ static void window_mapgen_random_update(rct_window *w) widget_invalidate(w, WIDX_TAB_2); } -static void window_mapgen_random_invalidate() +static void window_mapgen_random_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); if (w->widgets != window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_RANDOM]) { @@ -787,13 +758,8 @@ static void window_mapgen_random_invalidate() window_mapgen_anchor_border_widgets(w); } -static void window_mapgen_random_paint() +static void window_mapgen_random_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_mapgen_draw_tab_images(dpi, w); } @@ -802,14 +768,10 @@ static void window_mapgen_random_paint() #pragma region Simplex page -static void window_mapgen_simplex_mouseup() +static void window_mapgen_simplex_mouseup(rct_window *w, int widgetIndex) { - rct_window * w; - short widgetIndex; mapgen_settings mapgenSettings; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -929,13 +891,9 @@ static void window_mapgen_simplex_mousedown(int widgetIndex, rct_window *w, rct_ } } -static void window_mapgen_simplex_dropdown() +static void window_mapgen_simplex_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { int type; - short dropdownIndex, widgetIndex; - rct_window *w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); switch (widgetIndex) { case WIDX_SIMPLEX_FLOOR_TEXTURE: @@ -983,11 +941,8 @@ static void window_mapgen_simplex_update(rct_window *w) widget_invalidate(w, WIDX_TAB_3); } -static void window_mapgen_simplex_invalidate() +static void window_mapgen_simplex_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); if (w->widgets != window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_SIMPLEX]) { @@ -1002,13 +957,9 @@ static void window_mapgen_simplex_invalidate() window_mapgen_anchor_border_widgets(w); } -static void window_mapgen_simplex_paint() +static void window_mapgen_simplex_paint(rct_window *w, rct_drawpixelinfo *dpi) { uint16 arg; - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); window_draw_widgets(w, dpi); window_mapgen_draw_tab_images(dpi, w); diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index 0c0ec22bc7..3e08cee16d 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -89,42 +89,46 @@ static rct_widget window_maze_construction_widgets[] = { #pragma region Events -static void window_maze_construction_emptysub() {} - -static void window_maze_construction_close(); -static void window_maze_construction_invalidate(); -static void window_maze_construction_paint(); +static void window_maze_construction_close(rct_window *w); +static void window_maze_construction_mouseup(rct_window *w, int widgetIndex); +static void window_maze_construction_resize(rct_window *w); +static void window_maze_construction_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); +static void window_maze_construction_update(rct_window *w); +static void window_ride_construction_toolupdate(rct_window* w, int widgetIndex, int x, int y); +static void window_ride_construction_tooldown(rct_window* w, int widgetIndex, int x, int y); +static void window_maze_construction_invalidate(rct_window *w); +static void window_maze_construction_paint(rct_window *w, rct_drawpixelinfo *dpi); // 0x993F6C -static void* window_maze_construction_events[] = { +static rct_window_event_list window_maze_construction_events = { window_maze_construction_close, - (void*)0x006CD461, - (void*)0x006CD623, - (void*)0x006CD48C, - window_maze_construction_emptysub, - window_maze_construction_emptysub, - (void*)0x006CD767, - window_maze_construction_emptysub, - window_maze_construction_emptysub, - (void*)0x006CD63E, - (void*)0x006CD65D, - window_maze_construction_emptysub, - window_maze_construction_emptysub, - window_maze_construction_emptysub, - window_maze_construction_emptysub, - window_maze_construction_emptysub, - window_maze_construction_emptysub, - window_maze_construction_emptysub, - window_maze_construction_emptysub, - window_maze_construction_emptysub, - window_maze_construction_emptysub, - window_maze_construction_emptysub, - window_maze_construction_emptysub, - window_maze_construction_emptysub, - window_maze_construction_emptysub, + window_maze_construction_mouseup, + window_maze_construction_resize, + window_maze_construction_mousedown, + NULL, + NULL, + window_maze_construction_update, + NULL, + NULL, + window_ride_construction_toolupdate, + window_ride_construction_tooldown, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_maze_construction_invalidate, window_maze_construction_paint, - window_maze_construction_emptysub + NULL }; #pragma endregion @@ -135,7 +139,7 @@ static void* window_maze_construction_events[] = { */ rct_window *window_maze_construction_open() { - rct_window *w = window_create(0, 29, 166, 200, (uint32*)window_maze_construction_events, WC_RIDE_CONSTRUCTION, WF_9); + rct_window *w = window_create(0, 29, 166, 200, &window_maze_construction_events, WC_RIDE_CONSTRUCTION, WF_9); w->widgets = window_maze_construction_widgets; w->enabled_widgets = 0x6F0001C4; @@ -153,12 +157,8 @@ rct_window *window_maze_construction_open() * * rct2: 0x006CD811 */ -static void window_maze_construction_close() +static void window_maze_construction_close(rct_window *w) { - rct_window *w; - - window_get_register(w); - sub_6C9627(); viewport_set_visibility(0); @@ -183,11 +183,65 @@ static void window_maze_construction_close() } } +/** + * + * rct2: 0x006CD461 + */ +static void window_maze_construction_mouseup(rct_window *w, int widgetIndex) +{ + RCT2_CALLPROC_X(0x006CD461, 0, 0, 0, widgetIndex, (int)w, 0, 0); +} + +/** + * + * rct2: 0x006CD623 + */ +static void window_maze_construction_resize(rct_window *w) +{ + RCT2_CALLPROC_X(0x006CD623, 0, 0, 0, 0, (int)w, 0, 0); +} + +/** + * + * rct2: 0x006CD48C + */ +static void window_maze_construction_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) +{ + RCT2_CALLPROC_X(0x006CD48C, 0, 0, 0, widgetIndex, (int)w, (int)widget, 0); +} + +/** + * + * rct2: 0x006CD767 + */ +static void window_maze_construction_update(rct_window *w) +{ + RCT2_CALLPROC_X(0x006CD767, 0, 0, 0, 0, (int)w, 0, 0); +} + +/** + * + * rct2: 0x006CD63E + */ +static void window_ride_construction_toolupdate(rct_window* w, int widgetIndex, int x, int y) +{ + RCT2_CALLPROC_X(0x006CD63E, x, y, 0, widgetIndex, (int)w, 0, 0); +} + +/** + * + * rct2: 0x006CD65D + */ +static void window_ride_construction_tooldown(rct_window* w, int widgetIndex, int x, int y) +{ + RCT2_CALLPROC_X(0x006CD65D, x, y, 0, widgetIndex, (int)w, 0, 0); +} + /** * * rct2: 0x006CD435 */ -static void window_maze_construction_invalidate() +static void window_maze_construction_invalidate(rct_window *w) { rct_ride *ride = GET_RIDE(_currentRideIndex); @@ -200,13 +254,8 @@ static void window_maze_construction_invalidate() * * rct2: 0x006CD45B */ -static void window_maze_construction_paint() +static void window_maze_construction_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); } diff --git a/src/windows/music_credits.c b/src/windows/music_credits.c index 1c628bde81..0fad3895c8 100644 --- a/src/windows/music_credits.c +++ b/src/windows/music_credits.c @@ -38,39 +38,38 @@ rct_widget window_music_credits_widgets[] = { { WIDGETS_END }, }; -static void window_music_credits_emptysub() { } -static void window_music_credits_mouseup(); -static void window_music_credits_scrollgetsize(); -static void window_music_credits_paint(); -static void window_music_credits_scrollpaint(); +static void window_music_credits_mouseup(rct_window *w, int widgetIndex); +static void window_music_credits_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_music_credits_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_music_credits_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void* window_music_credits_events[] = { - window_music_credits_emptysub, +static rct_window_event_list window_music_credits_events = { + NULL, window_music_credits_mouseup, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_music_credits_scrollgetsize, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, - window_music_credits_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_music_credits_paint, window_music_credits_scrollpaint }; @@ -91,7 +90,7 @@ void window_music_credits_open() window = window_create_centred( 510, 314, - (uint32*)window_music_credits_events, + &window_music_credits_events, WC_MUSIC_CREDITS, 0 ); @@ -110,13 +109,8 @@ void window_music_credits_open() * * rct2: 0x0066DB2C */ -static void window_music_credits_mouseup() +static void window_music_credits_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -128,26 +122,17 @@ static void window_music_credits_mouseup() * * rct2: 0x0066DB37 */ -static void window_music_credits_scrollgetsize() +static void window_music_credits_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - int width, height; - - width = 0; - height = 560; - window_scrollsize_set_registers(width, height); + *height = 560; } /** * * rct2: 0x0066D7B9 */ -static void window_music_credits_paint() +static void window_music_credits_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); } @@ -155,12 +140,8 @@ static void window_music_credits_paint() * * rct2: 0x0066D7BF */ -static void window_music_credits_scrollpaint() +static void window_music_credits_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - rct_window *w; - rct_drawpixelinfo *dpi; - window_paint_get_registers(w, dpi); - int x = 245; int y = 2; diff --git a/src/windows/new_campaign.c b/src/windows/new_campaign.c index c618b103e3..edf39c2c48 100644 --- a/src/windows/new_campaign.c +++ b/src/windows/new_campaign.c @@ -61,42 +61,41 @@ static rct_widget window_new_campaign_widgets[] = { }; -static void window_new_campaign_emptysub() { } -static void window_new_campaign_mouseup(); +static void window_new_campaign_mouseup(rct_window *w, int widgetIndex); static void window_new_campaign_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_new_campaign_dropdown(); -static void window_new_campaign_invalidate(); -static void window_new_campaign_paint(); +static void window_new_campaign_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); +static void window_new_campaign_invalidate(rct_window *w); +static void window_new_campaign_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_new_campaign_events[] = { - window_new_campaign_emptysub, +static rct_window_event_list window_new_campaign_events = { + NULL, window_new_campaign_mouseup, - window_new_campaign_emptysub, + NULL, window_new_campaign_mousedown, window_new_campaign_dropdown, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, - window_new_campaign_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_new_campaign_invalidate, window_new_campaign_paint, - window_new_campaign_emptysub + NULL }; uint8 window_new_campaign_rides[MAX_RIDES]; @@ -143,7 +142,7 @@ void window_new_campaign_open(sint16 campaignType) window_close(w); } - w = window_create_auto_pos(350, 107, (uint32*)window_new_campaign_events, WC_NEW_CAMPAIGN, 0); + w = window_create_auto_pos(350, 107, &window_new_campaign_events, WC_NEW_CAMPAIGN, 0); w->widgets = window_new_campaign_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | @@ -220,13 +219,8 @@ static void window_new_campaign_get_shop_items() * * rct2: 0x0069E50B */ -static void window_new_campaign_mouseup() +static void window_new_campaign_mouseup(rct_window *w, int widgetIndex) { - rct_window *w; - short widgetIndex; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -315,13 +309,8 @@ static void window_new_campaign_mousedown(int widgetIndex, rct_window *w, rct_wi * * rct2: 0x0069E537 */ -static void window_new_campaign_dropdown() +static void window_new_campaign_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - rct_window *w; - short widgetIndex, dropdownIndex; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (widgetIndex != WIDX_RIDE_DROPDOWN_BUTTON) return; @@ -341,11 +330,8 @@ static void window_new_campaign_dropdown() * * rct2: 0x0069E397 */ -static void window_new_campaign_invalidate() +static void window_new_campaign_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); window_new_campaign_widgets[WIDX_RIDE_LABEL].type = WWT_EMPTY; @@ -392,14 +378,10 @@ static void window_new_campaign_invalidate() * * rct2: 0x0069E493 */ -static void window_new_campaign_paint() +static void window_new_campaign_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int x, y; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); x = w->x + 14; diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index 220c838de3..c035581e4a 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -197,46 +197,44 @@ static rct_widget window_new_ride_widgets[] = { #pragma region Events -static void window_new_ride_emptysub() { } - -static void window_new_ride_mouseup(); +static void window_new_ride_mouseup(rct_window *w, int widgetIndex); static void window_new_ride_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); static void window_new_ride_update(rct_window *w); -static void window_new_ride_scrollgetsize(); -static void window_new_ride_scrollmousedown(); -static void window_new_ride_scrollmouseover(); -static void window_new_ride_tooltip(); -static void window_new_ride_invalidate(); -static void window_new_ride_paint(); -static void window_new_ride_scrollpaint(); +static void window_new_ride_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_new_ride_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_new_ride_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_new_ride_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_new_ride_invalidate(rct_window *w); +static void window_new_ride_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_new_ride_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); // 0x0098E354 -static void* window_new_ride_events[] = { - window_new_ride_emptysub, +static rct_window_event_list window_new_ride_events = { + NULL, window_new_ride_mouseup, - window_new_ride_emptysub, + NULL, window_new_ride_mousedown, - window_new_ride_emptysub, - window_new_ride_emptysub, + NULL, + NULL, window_new_ride_update, - window_new_ride_emptysub, - window_new_ride_emptysub, - window_new_ride_emptysub, - window_new_ride_emptysub, - window_new_ride_emptysub, - window_new_ride_emptysub, - window_new_ride_emptysub, - window_new_ride_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_new_ride_scrollgetsize, window_new_ride_scrollmousedown, - window_new_ride_emptysub, + NULL, window_new_ride_scrollmouseover, - window_new_ride_emptysub, - window_new_ride_emptysub, - window_new_ride_emptysub, + NULL, + NULL, + NULL, window_new_ride_tooltip, - window_new_ride_emptysub, - window_new_ride_emptysub, + NULL, + NULL, window_new_ride_invalidate, window_new_ride_paint, window_new_ride_scrollpaint @@ -381,7 +379,8 @@ static void window_new_ride_populate_list() */ static void window_new_ride_scroll_to_focused_ride(rct_window *w) { - int scrollWidth, scrollHeight; + int scrollWidth = 0; + int scrollHeight = 0; window_get_scroll_size(w, 0, &scrollWidth, &scrollHeight); // Find row index of the focused ride type @@ -422,7 +421,7 @@ rct_window *window_new_ride_open() window_close_by_class(WC_TRACK_DESIGN_LIST); window_close_by_class(WC_TRACK_DESIGN_PLACE); - w = window_create_auto_pos(601, 370, (uint32*)window_new_ride_events, WC_CONSTRUCT_RIDE, WF_10); + w = window_create_auto_pos(601, 370, &window_new_ride_events, WC_CONSTRUCT_RIDE, WF_10); w->widgets = window_new_ride_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | @@ -612,13 +611,8 @@ static void window_new_ride_draw_tab_images(rct_drawpixelinfo *dpi, rct_window * * * rct2: 0x006B6B38 */ -static void window_new_ride_mouseup() +static void window_new_ride_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -662,34 +656,26 @@ static void window_new_ride_update(rct_window *w) * * rct2: 0x006B6BC9 */ -static void window_new_ride_scrollgetsize() +static void window_new_ride_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { ride_list_item *listItem = (ride_list_item*)0x00F43523; - int width, height; int count = 0; while (listItem->type != 255 || listItem->entry_index != 255) { count++; listItem++; } - width = 0; - height = ((count + 4) / 5) * 116; - - window_scrollsize_set_registers(width, height); + *height = ((count + 4) / 5) * 116; } /** * * rct2: 0x006B6C89 */ -static void window_new_ride_scrollmousedown() +static void window_new_ride_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) { - short x, y, scrollIndex; - rct_window *w; ride_list_item item; - window_scrollmouse_get_registers(w, scrollIndex, x, y); - // Made it impossible to click a ride in pause mode. Since the UI now stays responsive in pause mode, always allow clicking a ride. /*if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0) return;*/ @@ -710,14 +696,10 @@ static void window_new_ride_scrollmousedown() * * rct2: 0x006B6C51 */ -static void window_new_ride_scrollmouseover() +static void window_new_ride_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) { - short x, y, scrollIndex; - rct_window *w; ride_list_item item; - window_scrollmouse_get_registers(w, scrollIndex, x, y); - if (w->new_ride.selected_ride_id != -1) return; @@ -735,7 +717,7 @@ static void window_new_ride_scrollmouseover() * * rct2: 0x006B6BBF */ -static void window_new_ride_tooltip() +static void window_new_ride_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { RCT2_GLOBAL(0x013CE952, uint16) = 3159; } @@ -744,11 +726,8 @@ static void window_new_ride_tooltip() * * rct2: 0x006B6819 */ -static void window_new_ride_invalidate() +static void window_new_ride_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); window_new_ride_set_pressed_tab(w); @@ -772,13 +751,8 @@ static void window_new_ride_invalidate() * * rct2: 0x006B689B */ -static void window_new_ride_paint() +static void window_new_ride_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_new_ride_draw_tab_images(dpi, w); @@ -795,14 +769,10 @@ static void window_new_ride_paint() * * rct2: 0x006B6ABF */ -static void window_new_ride_scrollpaint() +static void window_new_ride_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_ride_type **rideEntries = (rct_ride_type**)0x009ACFA4; - window_paint_get_registers(w, dpi); - if (_window_new_ride_current_tab == WINDOW_NEW_RIDE_PAGE_RESEARCH) return; diff --git a/src/windows/news.c b/src/windows/news.c index 512bff4d0e..71e4d5a420 100644 --- a/src/windows/news.c +++ b/src/windows/news.c @@ -44,42 +44,41 @@ static rct_widget window_news_widgets[] = { { WIDGETS_END }, }; -static void window_news_emptysub() { } -static void window_news_mouseup(); +static void window_news_mouseup(rct_window *w, int widgetIndex); static void window_news_update(rct_window *w); -static void window_news_scrollgetsize(); -static void window_news_scrollmousedown(); -static void window_news_tooltip(); -static void window_news_invalidate(); -static void window_news_paint(); -static void window_news_scrollpaint(); +static void window_news_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_news_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_news_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_news_invalidate(rct_window *w); +static void window_news_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_news_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void* window_news_events[] = { - window_news_emptysub, +static rct_window_event_list window_news_events = { + NULL, window_news_mouseup, - window_news_emptysub, - window_news_emptysub, - window_news_emptysub, - window_news_emptysub, + NULL, + NULL, + NULL, + NULL, window_news_update, - window_news_emptysub, - window_news_emptysub, - window_news_emptysub, - window_news_emptysub, - window_news_emptysub, - window_news_emptysub, - window_news_emptysub, - window_news_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_news_scrollgetsize, window_news_scrollmousedown, - window_news_emptysub, - window_news_emptysub, - window_news_emptysub, - window_news_emptysub, - window_news_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_news_tooltip, - window_news_emptysub, - window_news_emptysub, + NULL, + NULL, window_news_invalidate, window_news_paint, window_news_scrollpaint @@ -99,7 +98,7 @@ void window_news_open() window = window_create_auto_pos( 400, 300, - (uint32*)window_news_events, + &window_news_events, WC_RECENT_NEWS, 0 ); @@ -110,9 +109,10 @@ void window_news_open() } // sub_66E4BA: - int width, height; rct_widget *widget; + int width = 0; + int height = 0; window_get_scroll_size(window, 0, &width, &height); widget = &window_news_widgets[WIDX_SCROLL]; window->scrolls[0].v_top = max(0, height - (widget->bottom - widget->top - 1)); @@ -124,15 +124,13 @@ void window_news_open() * * rct2: 0x0066D4D5 */ -static void window_news_mouseup() +static void window_news_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - - if (widgetIndex == WIDX_CLOSE) + switch (widgetIndex) { + case WIDX_CLOSE: window_close(w); + break; + } } /** @@ -182,36 +180,29 @@ static void window_news_update(rct_window *w) * * rct2: 0x0066EA3C */ -static void window_news_scrollgetsize() +static void window_news_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - int i, width, height; + int i; rct_news_item *newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); - width = 0; - height = 0; + *height = 0; for (i = 11; i < 61; i++) { if (newsItems[i].type == NEWS_ITEM_NULL) break; - height += 42; + *height += 42; } - - window_scrollsize_set_registers(width, height); } /** * * rct2: 0x0066EA5C */ -static void window_news_scrollmousedown() +static void window_news_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) { int i, buttonIndex; - short x, y, scrollIndex; - rct_window *w; rct_news_item *newsItems; - window_scrollmouse_get_registers(w, scrollIndex, x, y); - buttonIndex = 0; newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); for (i = 11; i < 61; i++) { @@ -259,7 +250,7 @@ static void window_news_scrollmousedown() * * rct2: 0x0066EAAE */ -static void window_news_tooltip() +static void window_news_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { RCT2_GLOBAL(0x013CE952, uint16) = 3159; } @@ -268,21 +259,13 @@ static void window_news_tooltip() * * rct2: 0x0066E4E8 */ -static void window_news_paint() +static void window_news_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); } -static void window_news_invalidate() +static void window_news_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); } @@ -290,15 +273,11 @@ static void window_news_invalidate() * * rct2: 0x0066E4EE */ -static void window_news_scrollpaint() +static void window_news_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { int i, x, y, yy, press; - rct_window *w; - rct_drawpixelinfo *dpi; rct_news_item *newsItems, *newsItem, *newsItem2; - window_paint_get_registers(w, dpi); - y = 0; newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); for (i = 11; i < 61; i++) { diff --git a/src/windows/options.c b/src/windows/options.c index a038be8344..5a26ddf43f 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -265,46 +265,44 @@ static void window_options_update_height_markers(); #pragma region Events -static void window_options_emptysub() { } - -static void window_options_mouseup(); +static void window_options_mouseup(rct_window *w, int widgetIndex); static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_options_dropdown(); +static void window_options_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_options_update(rct_window *w); -static void window_options_invalidate(); -static void window_options_paint(); -static void window_options_scrollgetsize(); -static void window_options_text_input(); +static void window_options_invalidate(rct_window *w); +static void window_options_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_options_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_options_text_input(rct_window *w, int widgetIndex, char *text); -static void* window_options_events[] = { - window_options_emptysub, +static rct_window_event_list window_options_events = { + NULL, window_options_mouseup, - window_options_emptysub, + NULL, window_options_mousedown, window_options_dropdown, - window_options_emptysub, + NULL, window_options_update, - window_options_emptysub, - window_options_emptysub, - window_options_emptysub, - window_options_emptysub, - window_options_emptysub, - window_options_emptysub, - window_options_emptysub, - window_options_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_options_scrollgetsize, - window_options_emptysub, - window_options_emptysub, - window_options_emptysub, + NULL, + NULL, + NULL, window_options_text_input, - window_options_emptysub, - window_options_emptysub, - window_options_emptysub, - window_options_emptysub, - window_options_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_options_invalidate, window_options_paint, - window_options_emptysub + NULL }; #pragma endregion @@ -404,7 +402,7 @@ void window_options_open() if (w != NULL) return; - w = window_create_centred(WW, WH, (uint32*)window_options_events, WC_OPTIONS, WF_RESIZABLE); + w = window_create_centred(WW, WH, &window_options_events, WC_OPTIONS, WF_RESIZABLE); w->widgets = window_options_display_widgets; w->enabled_widgets = window_options_page_enabled_widgets[WINDOW_OPTIONS_PAGE_DISPLAY]; w->page = WINDOW_OPTIONS_PAGE_DISPLAY; @@ -420,13 +418,8 @@ void window_options_open() * * rct2: 0x006BAFCA */ -static void window_options_mouseup() +static void window_options_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -861,14 +854,8 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* * * rct2: 0x006BB076 */ -static void window_options_dropdown() +static void window_options_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - short dropdownIndex; - short widgetIndex; - rct_window *w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (dropdownIndex == -1) return; @@ -1039,13 +1026,11 @@ static void window_options_dropdown() * * rct2: 0x006BAD48 */ -static void window_options_invalidate() +static void window_options_invalidate(rct_window *w) { - rct_window *w; rct_widget* widget; sint32 currentSoundDevice; - window_get_register(w); colour_scheme_update(w); if (window_options_page_widgets[w->page] != w->widgets) { @@ -1252,13 +1237,8 @@ static void window_options_update(rct_window *w) * * rct2: 0x006BAEB4 */ -static void window_options_paint() +static void window_options_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_options_draw_tab_images(dpi, w); @@ -1365,33 +1345,19 @@ static void window_options_update_height_markers() gfx_invalidate_screen(); } -static void window_options_scrollgetsize() +static void window_options_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - rct_window *w; - short scrollIndex; - - window_scroll_get_registers(w, scrollIndex); - if (w->page == WINDOW_OPTIONS_PAGE_AUDIO) { - int width = 1000; - int height = 0; - window_scrollsize_set_registers(width, height); + *width = 1000; } } -static void window_options_text_input(){ - short widgetIndex; - rct_window *w; - char _cl; - char* text; - - window_text_input_get_registers(w, widgetIndex, _cl, text); - if (_cl == 0) - { +static void window_options_text_input(rct_window *w, int widgetIndex, char *text) +{ + if (text == NULL) return; - } - if (widgetIndex == WIDX_CHANNEL_BUTTON){ + if (widgetIndex == WIDX_CHANNEL_BUTTON) { if (gConfigTwitch.channel != NULL) free(gConfigTwitch.channel); gConfigTwitch.channel = _strdup(text); diff --git a/src/windows/park.c b/src/windows/park.c index 3226d91786..6eb5fe929e 100644 --- a/src/windows/park.c +++ b/src/windows/park.c @@ -159,286 +159,284 @@ static rct_widget *window_park_page_widgets[] = { #pragma region Events -static void window_park_emptysub() { } - -static void window_park_entrance_close(); -static void window_park_entrance_mouseup(); -static void window_park_entrance_resize(); +static void window_park_entrance_close(rct_window *w); +static void window_park_entrance_mouseup(rct_window *w, int widgetIndex); +static void window_park_entrance_resize(rct_window *w); static void window_park_entrance_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_park_entrance_dropdown(); +static void window_park_entrance_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_park_entrance_update(rct_window *w); -static void window_park_entrance_toolupdate(); -static void window_park_entrance_tooldown(); -static void window_park_entrance_tooldrag(); -static void window_park_entrance_toolabort(); -static void window_park_entrance_textinput(); -static void window_park_entrance_invalidate(); -static void window_park_entrance_paint(); +static void window_park_entrance_toolupdate(rct_window* w, int widgetIndex, int x, int y); +static void window_park_entrance_tooldown(rct_window* w, int widgetIndex, int x, int y); +static void window_park_entrance_tooldrag(rct_window* w, int widgetIndex, int x, int y); +static void window_park_entrance_toolabort(rct_window *w, int widgetIndex); +static void window_park_entrance_textinput(rct_window *w, int widgetIndex, char *text); +static void window_park_entrance_invalidate(rct_window *w); +static void window_park_entrance_paint(rct_window *w, rct_drawpixelinfo *dpi); void toggle_land_rights_window(rct_window *parkWindow, int widgetIndex); -static void window_park_rating_mouseup(); -static void window_park_rating_resize(); +static void window_park_rating_mouseup(rct_window *w, int widgetIndex); +static void window_park_rating_resize(rct_window *w); static void window_park_rating_update(rct_window *w); -static void window_park_rating_invalidate(); -static void window_park_rating_paint(); +static void window_park_rating_invalidate(rct_window *w); +static void window_park_rating_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_park_guests_mouseup(); -static void window_park_guests_resize(); +static void window_park_guests_mouseup(rct_window *w, int widgetIndex); +static void window_park_guests_resize(rct_window *w); static void window_park_guests_update(rct_window *w); -static void window_park_guests_invalidate(); -static void window_park_guests_paint(); +static void window_park_guests_invalidate(rct_window *w); +static void window_park_guests_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_park_price_mouseup(); -static void window_park_price_resize(); +static void window_park_price_mouseup(rct_window *w, int widgetIndex); +static void window_park_price_resize(rct_window *w); static void window_park_price_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); static void window_park_price_update(rct_window *w); -static void window_park_price_invalidate(); -static void window_park_price_paint(); +static void window_park_price_invalidate(rct_window *w); +static void window_park_price_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_park_stats_mouseup(); -static void window_park_stats_resize(); +static void window_park_stats_mouseup(rct_window *w, int widgetIndex); +static void window_park_stats_resize(rct_window *w); static void window_park_stats_update(rct_window *w); -static void window_park_stats_invalidate(); -static void window_park_stats_paint(); +static void window_park_stats_invalidate(rct_window *w); +static void window_park_stats_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_park_objective_mouseup(); -static void window_park_objective_resize(); +static void window_park_objective_mouseup(rct_window *w, int widgetIndex); +static void window_park_objective_resize(rct_window *w); static void window_park_objective_update(rct_window *w); -static void window_park_objective_textinput(); -static void window_park_objective_invalidate(); -static void window_park_objective_paint(); +static void window_park_objective_textinput(rct_window *w, int widgetIndex, char *text); +static void window_park_objective_invalidate(rct_window *w); +static void window_park_objective_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_park_awards_mouseup(); -static void window_park_awards_resize(); +static void window_park_awards_mouseup(rct_window *w, int widgetIndex); +static void window_park_awards_resize(rct_window *w); static void window_park_awards_update(rct_window *w); -static void window_park_awards_invalidate(); -static void window_park_awards_paint(); +static void window_park_awards_invalidate(rct_window *w); +static void window_park_awards_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_park_entrance_events[] = { +static rct_window_event_list window_park_entrance_events = { window_park_entrance_close, window_park_entrance_mouseup, window_park_entrance_resize, window_park_entrance_mousedown, window_park_entrance_dropdown, - window_park_emptysub, + NULL, window_park_entrance_update, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, window_park_entrance_toolupdate, window_park_entrance_tooldown, window_park_entrance_tooldrag, - window_park_emptysub, + NULL, window_park_entrance_toolabort, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_park_entrance_textinput, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_park_entrance_invalidate, window_park_entrance_paint, - window_park_emptysub + NULL }; -static void* window_park_rating_events[] = { - window_park_emptysub, +static rct_window_event_list window_park_rating_events = { + NULL, window_park_rating_mouseup, window_park_rating_resize, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, + NULL, window_park_rating_update, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_park_rating_invalidate, window_park_rating_paint, - window_park_emptysub + NULL }; -static void* window_park_guests_events[] = { - window_park_emptysub, +static rct_window_event_list window_park_guests_events = { + NULL, window_park_guests_mouseup, window_park_guests_resize, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, + NULL, window_park_guests_update, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_park_guests_invalidate, window_park_guests_paint, - window_park_emptysub + NULL }; -static void* window_park_price_events[] = { - window_park_emptysub, +static rct_window_event_list window_park_price_events = { + NULL, window_park_price_mouseup, window_park_price_resize, window_park_price_mousedown, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, window_park_price_update, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_park_price_invalidate, window_park_price_paint, - window_park_emptysub + NULL }; -static void* window_park_stats_events[] = { - window_park_emptysub, +static rct_window_event_list window_park_stats_events = { + NULL, window_park_stats_mouseup, window_park_stats_resize, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, + NULL, window_park_stats_update, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_park_stats_invalidate, window_park_stats_paint, - window_park_emptysub + NULL }; -static void* window_park_objective_events[] = { - window_park_emptysub, +static rct_window_event_list window_park_objective_events = { + NULL, window_park_objective_mouseup, window_park_objective_resize, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, + NULL, window_park_objective_update, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_park_objective_textinput, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_park_objective_invalidate, window_park_objective_paint, - window_park_emptysub + NULL }; -static void* window_park_awards_events[] = { - window_park_emptysub, +static rct_window_event_list window_park_awards_events = { + NULL, window_park_awards_mouseup, window_park_awards_resize, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, + NULL, window_park_awards_update, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, - window_park_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_park_awards_invalidate, window_park_awards_paint, - window_park_emptysub + NULL }; -static void* window_park_page_events[] = { - window_park_entrance_events, - window_park_rating_events, - window_park_guests_events, - window_park_price_events, - window_park_stats_events, - window_park_objective_events, - window_park_awards_events +static rct_window_event_list *window_park_page_events[] = { + &window_park_entrance_events, + &window_park_rating_events, + &window_park_guests_events, + &window_park_price_events, + &window_park_stats_events, + &window_park_objective_events, + &window_park_awards_events }; #pragma endregion @@ -550,7 +548,7 @@ rct_window *window_park_open() { rct_window* w; - w = window_create_auto_pos(230, 174 + 9, (uint32*)window_park_entrance_events, WC_PARK_INFORMATION, WF_10); + w = window_create_auto_pos(230, 174 + 9, &window_park_entrance_events, WC_PARK_INFORMATION, WF_10); w->widgets = window_park_entrance_widgets; w->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_ENTRANCE]; w->number = 0; @@ -602,7 +600,7 @@ void window_park_entrance_open() window_invalidate(window); window->widgets = window_park_entrance_widgets; window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_ENTRANCE]; - window->event_handlers = (uint32*)window_park_entrance_events; + window->event_handlers = &window_park_entrance_events; window->pressed_widgets = 0; window_init_scroll_widgets(window); window_park_init_viewport(window); @@ -612,12 +610,8 @@ void window_park_entrance_open() * * rct2: 0x0066860C */ -static void window_park_entrance_close() +static void window_park_entrance_close(rct_window *w) { - rct_window *w; - - window_get_register(w); - if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) if (w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) && w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber)) tool_cancel(); @@ -627,13 +621,8 @@ static void window_park_entrance_close() * * rct2: 0x0066817C */ -static void window_park_entrance_mouseup() +static void window_park_entrance_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -672,12 +661,8 @@ static void window_park_entrance_mouseup() * * rct2: 0x00668637 */ -static void window_park_entrance_resize() +static void window_park_entrance_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - w->flags |= WF_RESIZABLE; window_set_resize(w, 230, 174 + 9, 230 * 3, (274 + 9) * 3); window_park_init_viewport(w); @@ -717,13 +702,8 @@ static void window_park_entrance_mousedown(int widgetIndex, rct_window*w, rct_wi * * rct2: 0x006682B8 */ -static void window_park_entrance_dropdown() +static void window_park_entrance_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - short widgetIndex, dropdownIndex; - rct_window* w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (widgetIndex == WIDX_OPEN_OR_CLOSE) { if (dropdownIndex == -1) dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); @@ -830,13 +810,8 @@ void window_park_entrance_tool_update_land_rights(sint16 x, sint16 y){ * * rct2: 0x006681D1 */ -static void window_park_entrance_toolupdate() +static void window_park_entrance_toolupdate(rct_window* w, int widgetIndex, int x, int y) { - short x, y, widgetIndex; - rct_window *w; - - window_tool_get_registers(w, widgetIndex, x, y); - switch (widgetIndex){ case WIDX_BUY_LAND_RIGHTS: window_park_entrance_tool_update_land_rights(x, y); @@ -848,13 +823,8 @@ static void window_park_entrance_toolupdate() * * rct2: 0x006681E6 */ -static void window_park_entrance_tooldown() +static void window_park_entrance_tooldown(rct_window* w, int widgetIndex, int x, int y) { - short x, y, widgetIndex; - rct_window *w; - - window_tool_get_registers(w, widgetIndex, x, y); - switch (widgetIndex){ case WIDX_BUY_LAND_RIGHTS: if (LandRightsMode) { @@ -893,13 +863,8 @@ static void window_park_entrance_tooldown() * * rct2: 0x006681FB */ -static void window_park_entrance_tooldrag() +static void window_park_entrance_tooldrag(rct_window* w, int widgetIndex, int x, int y) { - short x, y, widgetIndex; - rct_window *w; - - window_tool_get_registers(w, widgetIndex, x, y); - rct_window* w2 = window_find_by_number(0xB, 0); if (!w2) { @@ -942,13 +907,8 @@ static void window_park_entrance_tooldrag() * * rct2: 0x0066822A */ -static void window_park_entrance_toolabort() +static void window_park_entrance_toolabort(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (widgetIndex == WIDX_BUY_LAND_RIGHTS) { hide_gridlines(); if (LandRightsMode) @@ -966,16 +926,9 @@ static void window_park_entrance_toolabort() * * rct2: 0x0066848B */ -static void window_park_entrance_textinput() +static void window_park_entrance_textinput(rct_window *w, int widgetIndex, char *text) { - uint8 result; - short widgetIndex; - rct_window *w; - char *text; - - window_textinput_get_registers(w, widgetIndex, result, text); - - if (widgetIndex == WIDX_RENAME && result) + if (widgetIndex == WIDX_RENAME && text != NULL) park_set_name(text); } @@ -983,12 +936,10 @@ static void window_park_entrance_textinput() * * rct2: 0x00667FDC */ -static void window_park_entrance_invalidate() +static void window_park_entrance_invalidate(rct_window *w) { int i, height; - rct_window *w; - window_get_register(w); colour_scheme_update(w); w->widgets = window_park_page_widgets[w->page]; @@ -1066,14 +1017,10 @@ static void window_park_entrance_invalidate() * * rct2: 0x006680D0 */ -static void window_park_entrance_paint() +static void window_park_entrance_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_widget *labelWidget; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1218,7 +1165,7 @@ void window_park_rating_open() window->widgets = window_park_rating_widgets; window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_RATING]; window->hold_down_widgets = window_park_page_hold_down_widgets[WINDOW_PARK_PAGE_RATING]; - window->event_handlers = (uint32*)window_park_rating_events; + window->event_handlers = &window_park_rating_events; window_init_scroll_widgets(window); } @@ -1226,13 +1173,8 @@ void window_park_rating_open() * * rct2: 0x00668A06 */ -static void window_park_rating_mouseup() +static void window_park_rating_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (widgetIndex == WIDX_CLOSE) window_close(w); else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_7) @@ -1243,12 +1185,8 @@ static void window_park_rating_mouseup() * * rct2: 0x00668A36 */ -static void window_park_rating_resize() +static void window_park_rating_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 230, 182, 230, 182); } @@ -1266,12 +1204,10 @@ static void window_park_rating_update(rct_window *w) * * rct2: 0x006686CB */ -static void window_park_rating_invalidate() +static void window_park_rating_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; - window_get_register(w); colour_scheme_update(w); widgets = window_park_page_widgets[w->page]; @@ -1291,15 +1227,11 @@ static void window_park_rating_invalidate() * * rct2: 0x0066875D */ -static void window_park_rating_paint() +static void window_park_rating_paint(rct_window *w, rct_drawpixelinfo *dpi) { int x, y; - rct_window *w; - rct_drawpixelinfo *dpi; rct_widget *widget; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1349,7 +1281,7 @@ void window_park_guests_open() window->widgets = window_park_guests_widgets; window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_GUESTS]; window->hold_down_widgets = window_park_page_hold_down_widgets[WINDOW_PARK_PAGE_GUESTS]; - window->event_handlers = (uint32*)window_park_guests_events; + window->event_handlers = &window_park_guests_events; window_init_scroll_widgets(window); } @@ -1357,13 +1289,8 @@ void window_park_guests_open() * * rct2: 0x00668DEB */ -static void window_park_guests_mouseup() +static void window_park_guests_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (widgetIndex == WIDX_CLOSE) window_close(w); else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_7) @@ -1374,12 +1301,8 @@ static void window_park_guests_mouseup() * * rct2: 0x00668E33 */ -static void window_park_guests_resize() +static void window_park_guests_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 230, 182, 230, 182); } @@ -1398,12 +1321,10 @@ static void window_park_guests_update(rct_window *w) * * rct2: 0x00668AB0 */ -static void window_park_guests_invalidate() +static void window_park_guests_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; - window_get_register(w); colour_scheme_update(w); widgets = window_park_page_widgets[w->page]; @@ -1423,15 +1344,11 @@ static void window_park_guests_invalidate() * * rct2: 0x00668B42 */ -static void window_park_guests_paint() +static void window_park_guests_paint(rct_window *w, rct_drawpixelinfo *dpi) { int x, y; - rct_window *w; - rct_drawpixelinfo *dpi; rct_widget *widget; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1460,13 +1377,8 @@ static void window_park_guests_paint() * * rct2: 0x00669011 */ -static void window_park_price_mouseup() +static void window_park_price_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (widgetIndex == WIDX_CLOSE) window_close(w); else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_7) @@ -1477,12 +1389,8 @@ static void window_park_price_mouseup() * * rct2: 0x0066908C */ -static void window_park_price_resize() +static void window_park_price_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 230, 124, 230, 124); } @@ -1532,12 +1440,10 @@ static void window_park_price_update(rct_window *w) * * rct2: 0x00668EAD */ -static void window_park_price_invalidate() +static void window_park_price_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; - window_get_register(w); colour_scheme_update(w); widgets = window_park_page_widgets[w->page]; @@ -1572,13 +1478,9 @@ static void window_park_price_invalidate() * * rct2: 0x00668F99 */ -static void window_park_price_paint() +static void window_park_price_paint(rct_window *w, rct_drawpixelinfo *dpi) { int x, y; - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1599,13 +1501,8 @@ static void window_park_price_paint() * * rct2: 0x0066928C */ -static void window_park_stats_mouseup() +static void window_park_stats_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (widgetIndex == WIDX_CLOSE) window_close(w); else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_7) @@ -1616,12 +1513,8 @@ static void window_park_stats_mouseup() * * rct2: 0x00669338 */ -static void window_park_stats_resize() +static void window_park_stats_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 230, 109, 230, 109); } @@ -1655,12 +1548,10 @@ static void window_park_stats_update(rct_window *w) * * rct2: 0x00669106 */ -static void window_park_stats_invalidate() +static void window_park_stats_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; - window_get_register(w); colour_scheme_update(w); widgets = window_park_page_widgets[w->page]; @@ -1680,13 +1571,9 @@ static void window_park_stats_invalidate() * * rct2: 0x00669198 */ -static void window_park_stats_paint() +static void window_park_stats_paint(rct_window *w, rct_drawpixelinfo *dpi) { int x, y, parkSize, stringIndex; - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1752,7 +1639,7 @@ void window_park_objective_open() window->widgets = window_park_objective_widgets; window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_OBJECTIVE]; window->hold_down_widgets = window_park_page_hold_down_widgets[WINDOW_PARK_PAGE_OBJECTIVE]; - window->event_handlers = (uint32*)window_park_objective_events; + window->event_handlers = &window_park_objective_events; window_init_scroll_widgets(window); window->x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2 - 115; window->y = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) / 2 - 87; @@ -1763,13 +1650,8 @@ void window_park_objective_open() * * rct2: 0x006695AA */ -static void window_park_objective_mouseup() +static void window_park_objective_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -1801,12 +1683,8 @@ static void window_park_objective_mouseup() * * rct2: 0x00669681 */ -static void window_park_objective_resize() +static void window_park_objective_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 230, 224, 230, 224); } @@ -1824,16 +1702,9 @@ static void window_park_objective_update(rct_window *w) * * rct2: 0x006695CC */ -static void window_park_objective_textinput() +static void window_park_objective_textinput(rct_window *w, int widgetIndex, char *text) { - uint8 result; - short widgetIndex; - rct_window *w; - char *text; - - window_textinput_get_registers(w, widgetIndex, result, text); - - if (widgetIndex == WIDX_ENTER_NAME && result && text[0] != 0) { + if (widgetIndex == WIDX_ENTER_NAME && text != NULL && text[0] != 0) { scenario_success_submit_name(text); window_invalidate(w); } @@ -1843,11 +1714,8 @@ static void window_park_objective_textinput() * * rct2: 0x006693B2 */ -static void window_park_objective_invalidate() +static void window_park_objective_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); window_park_set_pressed_tab(w); @@ -1867,13 +1735,9 @@ static void window_park_objective_invalidate() * * rct2: 0x0066945C */ -static void window_park_objective_paint() +static void window_park_objective_paint(rct_window *w, rct_drawpixelinfo *dpi) { int x, y; - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1940,7 +1804,7 @@ void window_park_awards_open() window->widgets = window_park_awards_widgets; window->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_AWARDS]; window->hold_down_widgets = window_park_page_hold_down_widgets[WINDOW_PARK_PAGE_AWARDS]; - window->event_handlers = (uint32*)window_park_awards_events; + window->event_handlers = &window_park_awards_events; window_init_scroll_widgets(window); } @@ -1948,13 +1812,8 @@ void window_park_awards_open() * * rct2: 0x00669851 */ -static void window_park_awards_mouseup() +static void window_park_awards_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (widgetIndex == WIDX_CLOSE) window_close(w); else if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_7) @@ -1965,12 +1824,8 @@ static void window_park_awards_mouseup() * * rct2: 0x00669882 */ -static void window_park_awards_resize() +static void window_park_awards_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 230, 182, 230, 182); } @@ -1988,12 +1843,10 @@ static void window_park_awards_update(rct_window *w) * * rct2: 0x006696FB */ -static void window_park_awards_invalidate() +static void window_park_awards_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; - window_get_register(w); colour_scheme_update(w); widgets = window_park_page_widgets[w->page]; @@ -2013,15 +1866,11 @@ static void window_park_awards_invalidate() * * rct2: 0x0066978D */ -static void window_park_awards_paint() +static void window_park_awards_paint(rct_window *w, rct_drawpixelinfo *dpi) { int i, count, x, y; - rct_window *w; - rct_drawpixelinfo *dpi; rct_award *award; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); diff --git a/src/windows/publisher_credits.c b/src/windows/publisher_credits.c index 270a2d790c..08eed0e41f 100644 --- a/src/windows/publisher_credits.c +++ b/src/windows/publisher_credits.c @@ -38,39 +38,38 @@ rct_widget window_publisher_credits_widgets[] = { { WIDGETS_END }, }; -static void window_publisher_credits_emptysub() { } -static void window_publisher_credits_mouseup(); -static void window_publisher_credits_scrollgetsize(); -static void window_publisher_credits_paint(); -static void window_publisher_credits_scrollpaint(); +static void window_publisher_credits_mouseup(rct_window *w, int widgetIndex); +static void window_publisher_credits_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_publisher_credits_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_publisher_credits_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void* window_publisher_credits_events[] = { - window_publisher_credits_emptysub, +static rct_window_event_list window_publisher_credits_events = { + NULL, window_publisher_credits_mouseup, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_publisher_credits_scrollgetsize, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, - window_publisher_credits_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_publisher_credits_paint, window_publisher_credits_scrollpaint }; @@ -91,7 +90,7 @@ void window_publisher_credits_open() window = window_create_centred( 420, 384, - (uint32*)window_publisher_credits_events, + &window_publisher_credits_events, WC_PUBLISHER_CREDITS, 0 ); @@ -110,13 +109,8 @@ void window_publisher_credits_open() * * rct2: 0x0066D7A8 */ -static void window_publisher_credits_mouseup() +static void window_publisher_credits_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -128,26 +122,17 @@ static void window_publisher_credits_mouseup() * * rct2: 0x0066D7B3 */ -static void window_publisher_credits_scrollgetsize() +static void window_publisher_credits_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - int width, height; - - width = 0; - height = 820; - window_scrollsize_set_registers(width, height); + *height = 820; } /** * * rct2: 0x0066D5CB */ -static void window_publisher_credits_paint() +static void window_publisher_credits_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); } @@ -180,12 +165,8 @@ int credits_order[] = { * * rct2: 0x0066D5D1 */ -static void window_publisher_credits_scrollpaint() +static void window_publisher_credits_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - rct_window *w; - rct_drawpixelinfo *dpi; - window_paint_get_registers(w, dpi); - int x = 200; int y = 2; diff --git a/src/windows/research.c b/src/windows/research.c index f33641ae5e..5c4292e3b6 100644 --- a/src/windows/research.c +++ b/src/windows/research.c @@ -109,87 +109,85 @@ static rct_widget *window_research_page_widgets[] = { #pragma region Events -static void window_research_emptysub() { } - -static void window_research_development_mouseup(); +static void window_research_development_mouseup(rct_window *w, int widgetIndex); static void window_research_development_update(rct_window *w); -static void window_research_development_invalidate(); -static void window_research_development_paint(); +static void window_research_development_invalidate(rct_window *w); +static void window_research_development_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_research_funding_mouseup(); +static void window_research_funding_mouseup(rct_window *w, int widgetIndex); static void window_research_funding_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_research_funding_dropdown(); +static void window_research_funding_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_research_funding_update(rct_window *w); -static void window_research_funding_invalidate(); -static void window_research_funding_paint(); +static void window_research_funding_invalidate(rct_window *w); +static void window_research_funding_paint(rct_window *w, rct_drawpixelinfo *dpi); // -static void* window_research_development_events[] = { - window_research_emptysub, +static rct_window_event_list window_research_development_events = { + NULL, window_research_development_mouseup, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, + NULL, + NULL, + NULL, + NULL, window_research_development_update, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_research_development_invalidate, window_research_development_paint, - window_research_emptysub + NULL }; // 0x009890E8 -static void* window_research_funding_events[] = { - window_research_emptysub, +static rct_window_event_list window_research_funding_events = { + NULL, window_research_funding_mouseup, - window_research_emptysub, + NULL, window_research_funding_mousedown, window_research_funding_dropdown, - window_research_emptysub, + NULL, window_research_funding_update, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, - window_research_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_research_funding_invalidate, window_research_funding_paint, - window_research_emptysub + NULL }; -static void* window_research_page_events[] = { - window_research_development_events, - window_research_funding_events +static rct_window_event_list *window_research_page_events[] = { + &window_research_development_events, + &window_research_funding_events }; #pragma endregion @@ -261,13 +259,8 @@ void window_research_open() * * rct2: 0x006B6B38 */ -static void window_research_development_mouseup() +static void window_research_development_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -298,11 +291,8 @@ static void window_research_development_update(rct_window *w) * * rct2: 0x006B6819 */ -static void window_research_development_invalidate() +static void window_research_development_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); if (w->widgets != window_research_page_widgets[WINDOW_RESEARCH_PAGE_DEVELOPMENT]) { @@ -324,13 +314,8 @@ static void window_research_development_invalidate() * * rct2: 0x006B689B */ -static void window_research_development_paint() +static void window_research_development_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_research_draw_tab_images(dpi, w); @@ -425,14 +410,10 @@ void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dp * * rct2: 0x0069DB3F */ -static void window_research_funding_mouseup() +static void window_research_funding_mouseup(rct_window *w, int widgetIndex) { - rct_window * w; - short widgetIndex; int activeResearchTypes; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -491,14 +472,8 @@ static void window_research_funding_mousedown(int widgetIndex, rct_window *w, rc * * rct2: 0x0069DB6D */ -static void window_research_funding_dropdown() +static void window_research_funding_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - rct_window *w; - short widgetIndex; - short dropdownIndex; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (widgetIndex != WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON || dropdownIndex == -1) return; @@ -522,11 +497,8 @@ static void window_research_funding_update(rct_window *w) * * rct2: 0x0069DA64 */ -static void window_research_funding_invalidate() +static void window_research_funding_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); if (w->widgets != window_research_page_widgets[WINDOW_RESEARCH_PAGE_FUNDING]) { @@ -578,13 +550,8 @@ static void window_research_funding_invalidate() * * rct2: 0x0069DAF0 */ -static void window_research_funding_paint() +static void window_research_funding_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_research_draw_tab_images(dpi, w); diff --git a/src/windows/ride.c b/src/windows/ride.c index fbe5ddf64d..9eb5b926a4 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -521,432 +521,431 @@ const uint64 window_ride_page_hold_down_widgets[] = { #pragma region Events -static void window_ride_emptysub() { } static void window_ride_init_viewport(rct_window *w); -static void window_ride_main_mouseup(); -static void window_ride_main_resize(); +static void window_ride_main_mouseup(rct_window *w, int widgetIndex); +static void window_ride_main_resize(rct_window *w); static void window_ride_main_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); -static void window_ride_main_dropdown(); +static void window_ride_main_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_ride_main_update(rct_window *w); -static void window_ride_main_textinput(); -static void window_ride_main_unknown_14(); -static void window_ride_main_invalidate(); -static void window_ride_main_paint(); +static void window_ride_main_textinput(rct_window *w, int widgetIndex, char *text); +static void window_ride_main_unknown_14(rct_window *w); +static void window_ride_main_invalidate(rct_window *w); +static void window_ride_main_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_ride_vehicle_mouseup(); -static void window_ride_vehicle_resize(); +static void window_ride_vehicle_mouseup(rct_window *w, int widgetIndex); +static void window_ride_vehicle_resize(rct_window *w); static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); -static void window_ride_vehicle_dropdown(); +static void window_ride_vehicle_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_ride_vehicle_update(rct_window *w); -static void window_ride_vehicle_invalidate(); -static void window_ride_vehicle_paint(); -static void window_ride_vehicle_scrollpaint(); +static void window_ride_vehicle_invalidate(rct_window *w); +static void window_ride_vehicle_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_ride_vehicle_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void window_ride_operating_mouseup(); -static void window_ride_operating_resize(); +static void window_ride_operating_mouseup(rct_window *w, int widgetIndex); +static void window_ride_operating_resize(rct_window *w); static void window_ride_operating_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); -static void window_ride_operating_dropdown(); +static void window_ride_operating_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_ride_operating_update(rct_window *w); -static void window_ride_operating_invalidate(); -static void window_ride_operating_paint(); +static void window_ride_operating_invalidate(rct_window *w); +static void window_ride_operating_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_ride_maintenance_mouseup(); -static void window_ride_maintenance_resize(); +static void window_ride_maintenance_mouseup(rct_window *w, int widgetIndex); +static void window_ride_maintenance_resize(rct_window *w); static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); -static void window_ride_maintenance_dropdown(); +static void window_ride_maintenance_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_ride_maintenance_update(rct_window *w); -static void window_ride_maintenance_invalidate(); -static void window_ride_maintenance_paint(); +static void window_ride_maintenance_invalidate(rct_window *w); +static void window_ride_maintenance_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_ride_colour_close(); -static void window_ride_colour_mouseup(); -static void window_ride_colour_resize(); +static void window_ride_colour_close(rct_window *w); +static void window_ride_colour_mouseup(rct_window *w, int widgetIndex); +static void window_ride_colour_resize(rct_window *w); static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); -static void window_ride_colour_dropdown(); +static void window_ride_colour_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_ride_colour_update(rct_window *w); -static void window_ride_colour_tooldown(); -static void window_ride_colour_tooldrag(); -static void window_ride_colour_invalidate(); -static void window_ride_colour_paint(); -static void window_ride_colour_scrollpaint(); +static void window_ride_colour_tooldown(rct_window *w, int widgetIndex, int x, int y); +static void window_ride_colour_tooldrag(rct_window *w, int widgetIndex, int x, int y); +static void window_ride_colour_invalidate(rct_window *w); +static void window_ride_colour_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_ride_colour_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void window_ride_music_mouseup(); -static void window_ride_music_resize(); +static void window_ride_music_mouseup(rct_window *w, int widgetIndex); +static void window_ride_music_resize(rct_window *w); static void window_ride_music_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); -static void window_ride_music_dropdown(); +static void window_ride_music_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_ride_music_update(rct_window *w); -static void window_ride_music_invalidate(); -static void window_ride_music_paint(); +static void window_ride_music_invalidate(rct_window *w); +static void window_ride_music_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_ride_measurements_close(); -static void window_ride_measurements_mouseup(); -static void window_ride_measurements_resize(); +static void window_ride_measurements_close(rct_window *w); +static void window_ride_measurements_mouseup(rct_window *w, int widgetIndex); +static void window_ride_measurements_resize(rct_window *w); static void window_ride_measurements_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); -static void window_ride_measurements_dropdown(); +static void window_ride_measurements_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_ride_measurements_update(rct_window *w); -static void window_ride_measurements_tooldown(); -static void window_ride_measurements_toolabort(); -static void window_ride_measurements_invalidate(); -static void window_ride_measurements_paint(); +static void window_ride_measurements_tooldown(rct_window *w, int widgetIndex, int x, int y); +static void window_ride_measurements_toolabort(rct_window *w, int widgetIndex); +static void window_ride_measurements_invalidate(rct_window *w); +static void window_ride_measurements_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_ride_graphs_mouseup(); -static void window_ride_graphs_resize(); +static void window_ride_graphs_mouseup(rct_window *w, int widgetIndex); +static void window_ride_graphs_resize(rct_window *w); static void window_ride_graphs_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); static void window_ride_graphs_update(rct_window *w); -static void window_ride_graphs_scrollgetheight(); -static void window_ride_graphs_15(); -static void window_ride_graphs_tooltip(); -static void window_ride_graphs_invalidate(); -static void window_ride_graphs_paint(); -static void window_ride_graphs_scrollpaint(); +static void window_ride_graphs_scrollgetheight(rct_window *w, int scrollIndex, int *width, int *height); +static void window_ride_graphs_15(rct_window *w, int scrollIndex, int scrollAreaType); +static void window_ride_graphs_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_ride_graphs_invalidate(rct_window *w); +static void window_ride_graphs_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_ride_graphs_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void window_ride_income_mouseup(); -static void window_ride_income_resize(); +static void window_ride_income_mouseup(rct_window *w, int widgetIndex); +static void window_ride_income_resize(rct_window *w); static void window_ride_income_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); static void window_ride_income_update(rct_window *w); -static void window_ride_income_invalidate(); -static void window_ride_income_paint(); +static void window_ride_income_invalidate(rct_window *w); +static void window_ride_income_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_ride_customer_mouseup(); -static void window_ride_customer_resize(); +static void window_ride_customer_mouseup(rct_window *w, int widgetIndex); +static void window_ride_customer_resize(rct_window *w); static void window_ride_customer_update(rct_window *w); -static void window_ride_customer_invalidate(); -static void window_ride_customer_paint(); +static void window_ride_customer_invalidate(rct_window *w); +static void window_ride_customer_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_ride_set_colours(); // 0x0098DFD4 -static void* window_ride_main_events[] = { - window_ride_emptysub, +static rct_window_event_list window_ride_main_events = { + NULL, window_ride_main_mouseup, window_ride_main_resize, window_ride_main_mousedown, window_ride_main_dropdown, - window_ride_emptysub, + NULL, window_ride_main_update, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_ride_main_textinput, window_ride_main_unknown_14, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, + NULL, window_ride_main_invalidate, window_ride_main_paint, - window_ride_emptysub + NULL }; // 0x0098E204 -static void* window_ride_vehicle_events[] = { - window_ride_emptysub, +static rct_window_event_list window_ride_vehicle_events = { + NULL, window_ride_vehicle_mouseup, window_ride_vehicle_resize, window_ride_vehicle_mousedown, window_ride_vehicle_dropdown, - window_ride_emptysub, + NULL, window_ride_vehicle_update, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_ride_vehicle_invalidate, window_ride_vehicle_paint, window_ride_vehicle_scrollpaint }; // 0x0098E0B4 -static void* window_ride_operating_events[] = { - window_ride_emptysub, +static rct_window_event_list window_ride_operating_events = { + NULL, window_ride_operating_mouseup, window_ride_operating_resize, window_ride_operating_mousedown, window_ride_operating_dropdown, - window_ride_emptysub, + NULL, window_ride_operating_update, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_ride_operating_invalidate, window_ride_operating_paint, - window_ride_emptysub + NULL }; // 0x0098E124 -static void* window_ride_maintenance_events[] = { - window_ride_emptysub, +static rct_window_event_list window_ride_maintenance_events = { + NULL, window_ride_maintenance_mouseup, window_ride_maintenance_resize, window_ride_maintenance_mousedown, window_ride_maintenance_dropdown, - window_ride_emptysub, + NULL, window_ride_maintenance_update, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_ride_maintenance_invalidate, window_ride_maintenance_paint, - window_ride_emptysub + NULL }; // 0x0098E044 -static void* window_ride_colour_events[] = { +static rct_window_event_list window_ride_colour_events = { window_ride_colour_close, window_ride_colour_mouseup, window_ride_colour_resize, window_ride_colour_mousedown, window_ride_colour_dropdown, - window_ride_emptysub, + NULL, window_ride_colour_update, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, window_ride_colour_tooldown, window_ride_colour_tooldrag, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_ride_colour_invalidate, window_ride_colour_paint, window_ride_colour_scrollpaint }; // 0x0098E194 -static void* window_ride_music_events[] = { - window_ride_emptysub, +static rct_window_event_list window_ride_music_events = { + NULL, window_ride_music_mouseup, window_ride_music_resize, window_ride_music_mousedown, window_ride_music_dropdown, - window_ride_emptysub, + NULL, window_ride_music_update, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_ride_music_invalidate, window_ride_music_paint, - window_ride_emptysub + NULL }; // 0x0098DE14 -static void* window_ride_measurements_events[] = { +static rct_window_event_list window_ride_measurements_events = { window_ride_measurements_close, window_ride_measurements_mouseup, window_ride_measurements_resize, window_ride_measurements_mousedown, window_ride_measurements_dropdown, - window_ride_emptysub, + NULL, window_ride_measurements_update, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, window_ride_measurements_tooldown, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, window_ride_measurements_toolabort, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_ride_measurements_invalidate, window_ride_measurements_paint, - window_ride_emptysub + NULL }; // 0x0098DF64 -static void* window_ride_graphs_events[] = { - window_ride_emptysub, +static rct_window_event_list window_ride_graphs_events = { + NULL, window_ride_graphs_mouseup, window_ride_graphs_resize, window_ride_graphs_mousedown, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, window_ride_graphs_update, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_ride_graphs_scrollgetheight, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_ride_graphs_15, window_ride_graphs_tooltip, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, window_ride_graphs_invalidate, window_ride_graphs_paint, window_ride_graphs_scrollpaint }; // 0x0098DEF4 -static void* window_ride_income_events[] = { - window_ride_emptysub, +static rct_window_event_list window_ride_income_events = { + NULL, window_ride_income_mouseup, window_ride_income_resize, window_ride_income_mousedown, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, window_ride_income_update, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_ride_income_invalidate, window_ride_income_paint, - window_ride_emptysub + NULL }; // 0x0098DE84 -static void* window_ride_customer_events[] = { - window_ride_emptysub, +static rct_window_event_list window_ride_customer_events = { + NULL, window_ride_customer_mouseup, window_ride_customer_resize, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, window_ride_customer_update, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, - window_ride_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_ride_customer_invalidate, window_ride_customer_paint, - window_ride_emptysub + NULL }; -static uint32* window_ride_page_events[] = { - (uint32*)window_ride_main_events, - (uint32*)window_ride_vehicle_events, - (uint32*)window_ride_operating_events, - (uint32*)window_ride_maintenance_events, - (uint32*)window_ride_colour_events, - (uint32*)window_ride_music_events, - (uint32*)window_ride_measurements_events, - (uint32*)window_ride_graphs_events, - (uint32*)window_ride_income_events, - (uint32*)window_ride_customer_events +static rct_window_event_list *window_ride_page_events[] = { + &window_ride_main_events, + &window_ride_vehicle_events, + &window_ride_operating_events, + &window_ride_maintenance_events, + &window_ride_colour_events, + &window_ride_music_events, + &window_ride_measurements_events, + &window_ride_graphs_events, + &window_ride_income_events, + &window_ride_customer_events }; #pragma endregion @@ -1614,15 +1613,11 @@ static void window_ride_rename(rct_window *w) * * rct2: 0x006AF17E */ -static void window_ride_main_mouseup() +static void window_ride_main_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; rct_ride *ride; int status; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -1683,14 +1678,11 @@ static void window_ride_main_mouseup() * * rct2: 0x006AF4A2 */ -static void window_ride_main_resize() +static void window_ride_main_resize(rct_window *w) { - rct_window *w; rct_viewport *viewport; int width, height; - window_get_register(w); - w->flags |= WF_RESIZABLE; int minHeight = 180; if (theme_get_preset()->features.rct1_ride_lights) @@ -1871,14 +1863,10 @@ static void window_ride_main_mousedown(int widgetIndex, rct_window *w, rct_widge * * rct2: 0x006AF300 */ -static void window_ride_main_dropdown() +static void window_ride_main_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { rct_ride *ride; - rct_window *w; int status; - short widgetIndex, dropdownIndex; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); switch (widgetIndex) { case WIDX_VIEW_DROPDOWN: @@ -1975,16 +1963,9 @@ static void window_ride_main_update(rct_window *w) * * rct2: 0x006AF2F9 */ -static void window_ride_main_textinput() +static void window_ride_main_textinput(rct_window *w, int widgetIndex, char *text) { - uint8 result; - short widgetIndex; - rct_window *w; - char *text; - - window_textinput_get_registers(w, widgetIndex, result, text); - - if (widgetIndex != WIDX_RENAME || !result) + if (widgetIndex != WIDX_RENAME || text == NULL) return; ride_set_name(w->number, text); @@ -1994,12 +1975,8 @@ static void window_ride_main_textinput() * * rct2: 0x006AF55A */ -static void window_ride_main_unknown_14() +static void window_ride_main_unknown_14(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_ride_init_viewport(w); } @@ -2007,13 +1984,11 @@ static void window_ride_main_unknown_14() * * rct2: 0x006AECF6 */ -static void window_ride_main_invalidate() +static void window_ride_main_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; int i, height; - window_get_register(w); colour_scheme_update(w); widgets = window_ride_page_widgets[w->page]; @@ -2230,16 +2205,12 @@ static rct_string_id window_ride_get_status(rct_window *w, void *arguments) * * rct2: 0x006AEE73 */ -static void window_ride_main_paint() +static void window_ride_main_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_ride *ride; rct_widget *widget; rct_string_id stringId; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_ride_draw_tab_images(dpi, w); @@ -2295,14 +2266,10 @@ static void window_ride_main_paint() * * rct2: 0x006B272D */ -static void window_ride_vehicle_mouseup() +static void window_ride_vehicle_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; rct_ride *ride; - window_widget_get_registers(w, widgetIndex); - ride = GET_RIDE(w->number); switch (widgetIndex) { @@ -2328,12 +2295,8 @@ static void window_ride_vehicle_mouseup() * * rct2: 0x006B2ABB */ -static void window_ride_vehicle_resize() +static void window_ride_vehicle_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 316, 208, 316, 208); } @@ -2445,15 +2408,11 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi * * rct2: 0x006B2767 */ -static void window_ride_vehicle_dropdown() +static void window_ride_vehicle_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - rct_window *w; - short widgetIndex, dropdownIndex; rct_ride *ride; rct_ride_type *rideEntry; - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (dropdownIndex == -1) return; @@ -2489,16 +2448,14 @@ static void window_ride_vehicle_update(rct_window *w) * * rct2: 0x006B222C */ -static void window_ride_vehicle_invalidate() +static void window_ride_vehicle_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; rct_ride *ride; rct_ride_type *rideEntry; rct_string_id stringId; int carsPerTrain; - window_get_register(w); colour_scheme_update(w); widgets = window_ride_page_widgets[w->page]; @@ -2565,18 +2522,14 @@ static void window_ride_vehicle_invalidate() * * rct2: 0x006B23DC */ -static void window_ride_vehicle_paint() +static void window_ride_vehicle_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_ride *ride; rct_ride_type *rideEntry; rct_string_id stringId; int x, y; sint16 factor; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_ride_draw_tab_images(dpi, w); @@ -2632,10 +2585,8 @@ rct_vehichle_paintinfo _sprites_to_draw[144]; * * rct2: 0x006B2502 */ -static void window_ride_vehicle_scrollpaint() +static void window_ride_vehicle_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_ride *ride; rct_ride_type *rideEntry; rct_widget *widget; @@ -2643,8 +2594,6 @@ static void window_ride_vehicle_scrollpaint() rct_vehichle_paintinfo *nextSpriteToDraw, *current, tmp; vehicle_colour vehicleColour; - window_paint_get_registers(w, dpi); - ride = GET_RIDE(w->number); rideEntry = ride_get_entry(ride); @@ -2886,14 +2835,10 @@ static void window_ride_load_dropdown(rct_window *w, rct_widget *widget) * * rct2: 0x006B10A7 */ -static void window_ride_operating_mouseup() +static void window_ride_operating_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; rct_ride *ride; - window_widget_get_registers(w, widgetIndex); - ride = GET_RIDE(w->number); switch (widgetIndex) { @@ -2934,12 +2879,8 @@ static void window_ride_operating_mouseup() * * rct2: 0x006B1715 */ -static void window_ride_operating_resize() +static void window_ride_operating_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 316, 186, 316, 186); } @@ -3002,16 +2943,12 @@ static void window_ride_operating_mousedown(int widgetIndex, rct_window *w, rct_ * * rct2: 0x006B1165 */ -static void window_ride_operating_dropdown() +static void window_ride_operating_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - rct_window *w; - short widgetIndex, dropdownIndex; rct_ride *ride; const uint8 *availableModes; int i; - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (dropdownIndex == -1) return; @@ -3055,15 +2992,13 @@ static void window_ride_operating_update(rct_window *w) * * rct2: 0x006B0B30 */ -static void window_ride_operating_invalidate() +static void window_ride_operating_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; rct_ride *ride; rct_ride_type *rideEntry; rct_string_id format, caption, tooltip; - window_get_register(w); colour_scheme_update(w); widgets = window_ride_page_widgets[w->page]; @@ -3265,15 +3200,11 @@ static void window_ride_operating_invalidate() * * rct2: 0x006B1001 */ -static void window_ride_operating_paint() +static void window_ride_operating_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_ride *ride; uint16 blockSections; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_ride_draw_tab_images(dpi, w); @@ -3348,13 +3279,8 @@ static void window_ride_maintenance_draw_bar(rct_window *w, rct_drawpixelinfo *d * * rct2: 0x006B1AAD */ -static void window_ride_maintenance_mouseup() +static void window_ride_maintenance_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -3381,12 +3307,8 @@ static void window_ride_maintenance_mouseup() * * rct2: 0x006B1D70 */ -static void window_ride_maintenance_resize() +static void window_ride_maintenance_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 316, 135, 316, 135); } @@ -3492,17 +3414,13 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc * * rct2: 0x006B1AD9 */ -static void window_ride_maintenance_dropdown() +static void window_ride_maintenance_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - rct_window *w; rct_ride *ride; rct_ride_type *ride_type; rct_vehicle *vehicle; - short widgetIndex, dropdownIndex; int i, j, num_items; - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (dropdownIndex == -1) return; @@ -3587,12 +3505,10 @@ static void window_ride_maintenance_update(rct_window *w) * * rct2: 0x006B17C8 */ -static void window_ride_maintenance_invalidate() +static void window_ride_maintenance_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; - window_get_register(w); colour_scheme_update(w); widgets = window_ride_page_widgets[w->page]; @@ -3625,10 +3541,8 @@ static void window_ride_maintenance_invalidate() * * rct2: 0x006B1877 */ -static void window_ride_maintenance_paint() +static void window_ride_maintenance_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_ride *ride; rct_widget *widget; rct_peep *mechanicSprite; @@ -3636,8 +3550,6 @@ static void window_ride_maintenance_paint() uint16 reliability, downTime, lastInspection; rct_string_id stringId, breakdownMessage; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_ride_draw_tab_images(dpi, w); @@ -3804,12 +3716,8 @@ static void window_ride_set_track_colour_scheme(rct_window *w, int x, int y) * * rct2: 0x006B04FA */ -static void window_ride_colour_close() +static void window_ride_colour_close(rct_window *w) { - rct_window *w; - - window_get_register(w); - if (!(RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE)) return; @@ -3826,13 +3734,8 @@ static void window_ride_colour_close() * * rct2: 0x006B02A1 */ -static void window_ride_colour_mouseup() +static void window_ride_colour_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -3859,12 +3762,8 @@ static void window_ride_colour_mouseup() * * rct2: 0x006B0AB6 */ -static void window_ride_colour_resize() +static void window_ride_colour_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 316, 207, 316, 207); } @@ -4015,13 +3914,8 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid * * rct2: 0x006B0331 */ -static void window_ride_colour_dropdown() +static void window_ride_colour_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - rct_window *w; - short widgetIndex, dropdownIndex; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (dropdownIndex == -1) return; @@ -4081,13 +3975,8 @@ static void window_ride_colour_update(rct_window *w) * * rct2: 0x006B04EC */ -static void window_ride_colour_tooldown() -{ - rct_window *w; - short widgetIndex, x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - +static void window_ride_colour_tooldown(rct_window *w, int widgetIndex, int x, int y) +{ if (widgetIndex == WIDX_PAINT_INDIVIDUAL_AREA) window_ride_set_track_colour_scheme(w, x, y); } @@ -4096,13 +3985,8 @@ static void window_ride_colour_tooldown() * * rct2: 0x006B04F3 */ -static void window_ride_colour_tooldrag() -{ - rct_window *w; - short widgetIndex, x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - +static void window_ride_colour_tooldrag(rct_window *w, int widgetIndex, int x, int y) +{ if (widgetIndex == WIDX_PAINT_INDIVIDUAL_AREA) window_ride_set_track_colour_scheme(w, x, y); } @@ -4111,9 +3995,8 @@ static void window_ride_colour_tooldrag() * * rct2: 0x006AFB36 */ -static void window_ride_colour_invalidate() +static void window_ride_colour_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; rct_ride_type *rideEntry; rct_ride *ride; @@ -4121,7 +4004,6 @@ static void window_ride_colour_invalidate() vehicle_colour vehicleColour; int vehicleColourSchemeType; - window_get_register(w); colour_scheme_update(w); widgets = window_ride_page_widgets[w->page]; @@ -4288,18 +4170,15 @@ static void window_ride_colour_invalidate() * * rct2: 0x006AFF3E */ -static void window_ride_colour_paint() +static void window_ride_colour_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi, *clippedDpi; + rct_drawpixelinfo *clippedDpi; rct_widget *widget; rct_ride *ride; rct_ride_type *rideEntry; int x, y, spriteIndex, terniaryColour; track_colour trackColour; - window_paint_get_registers(w, dpi); - ride = GET_RIDE(w->number); rideEntry = ride_get_entry(ride); @@ -4383,18 +4262,14 @@ static void window_ride_colour_paint() * * rct2: 0x006B0192 */ -static void window_ride_colour_scrollpaint() +static void window_ride_colour_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_ride *ride; rct_ride_type *rideEntry; rct_widget *vehiclePreviewWidget; int trainCarIndex, x, y, spriteIndex; vehicle_colour vehicleColour; - window_paint_get_registers(w, dpi); - ride = GET_RIDE(w->number); rideEntry = ride_get_entry(ride); vehiclePreviewWidget = &window_ride_colour_widgets[WIDX_VEHICLE_PREVIEW]; @@ -4484,13 +4359,8 @@ static void window_ride_toggle_music(rct_window *w) * * rct2: 0x006B1ED7 */ -static void window_ride_music_mouseup() +static void window_ride_music_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -4517,12 +4387,8 @@ static void window_ride_music_mouseup() * * rct2: 0x006AF4A2 */ -static void window_ride_music_resize() +static void window_ride_music_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - w->flags |= WF_RESIZABLE; window_set_resize(w, 316, 81, 316, 81); } @@ -4580,14 +4446,10 @@ static void window_ride_music_mousedown(int widgetIndex, rct_window *w, rct_widg * * rct2: 0x006B1F03 */ -static void window_ride_music_dropdown() +static void window_ride_music_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - rct_window *w; rct_ride *ride; uint8 musicStyle; - short widgetIndex, dropdownIndex; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); if (widgetIndex != WIDX_MUSIC_DROPDOWN || dropdownIndex == -1) return; @@ -4613,13 +4475,11 @@ static void window_ride_music_update(rct_window *w) * * rct2: 0x006B1DEA */ -static void window_ride_music_invalidate() +static void window_ride_music_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; int isMusicActivated; - window_get_register(w); colour_scheme_update(w); widgets = window_ride_page_widgets[w->page]; @@ -4657,13 +4517,8 @@ static void window_ride_music_invalidate() * * rct2: 0x006B1ECC */ -static void window_ride_music_paint() +static void window_ride_music_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_ride_draw_tab_images(dpi, w); } @@ -4759,7 +4614,7 @@ static void window_ride_measurements_design_save(rct_window *w) * * rct2: 0x006AD4DA */ -static void window_ride_measurements_close() +static void window_ride_measurements_close(rct_window *w) { window_ride_measurements_design_cancel(); } @@ -4768,13 +4623,8 @@ static void window_ride_measurements_close() * * rct2: 0x006AD478 */ -static void window_ride_measurements_mouseup() +static void window_ride_measurements_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -4810,12 +4660,8 @@ static void window_ride_measurements_mouseup() * * rct2: 0x006AD564 */ -static void window_ride_measurements_resize() +static void window_ride_measurements_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 316, 202, 316, 202); } @@ -4850,13 +4696,8 @@ static void window_ride_measurements_mousedown(int widgetIndex, rct_window *w, r * * rct2: 0x006AD4B2 */ -static void window_ride_measurements_dropdown() +static void window_ride_measurements_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - rct_window *w; - short widgetIndex, dropdownIndex; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (widgetIndex != WIDX_SAVE_TRACK_DESIGN) return; @@ -4884,13 +4725,8 @@ static void window_ride_measurements_update(rct_window *w) * * rct2: 0x006AD4EB */ -static void window_ride_measurements_tooldown() +static void window_ride_measurements_tooldown(rct_window *w, int widgetIndex, int x, int y) { - rct_window *w; - short x, y, widgetIndex; - - window_tool_get_registers(w, widgetIndex, x, y); - RCT2_CALLPROC_X(0x006D2AE7, x, y, 0, widgetIndex, (int)w, 0, 0); } @@ -4898,7 +4734,7 @@ static void window_ride_measurements_tooldown() * * rct2: 0x006AD4DA */ -static void window_ride_measurements_toolabort(rct_window *w) +static void window_ride_measurements_toolabort(rct_window *w, int widgetIndex) { window_ride_measurements_design_cancel(); } @@ -4907,12 +4743,10 @@ static void window_ride_measurements_toolabort(rct_window *w) * * rct2: 0x006ACDBC */ -static void window_ride_measurements_invalidate() +static void window_ride_measurements_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; - window_get_register(w); colour_scheme_update(w); widgets = window_ride_page_widgets[w->page]; @@ -4961,10 +4795,8 @@ static void window_ride_measurements_invalidate() * * rct2: 0x006ACF07 */ -static void window_ride_measurements_paint() +static void window_ride_measurements_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_widget *widget; rct_ride *ride; rct_string_id stringId; @@ -4972,8 +4804,6 @@ static void window_ride_measurements_paint() sint16 holes, maxSpeed, averageSpeed, drops, highestDropHeight, inversions, time; sint32 maxPositiveVerticalGs, maxNegativeVerticalGs, maxLateralGs, totalAirTime, length; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_ride_draw_tab_images(dpi, w); @@ -5177,13 +5007,8 @@ static void window_ride_set_graph(rct_window *w, int type) * * rct2: 0x006AE85D */ -static void window_ride_graphs_mouseup() +static void window_ride_graphs_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -5207,12 +5032,8 @@ static void window_ride_graphs_mouseup() * * rct2: 0x006AE8DA */ -static void window_ride_graphs_resize() +static void window_ride_graphs_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 316, 180, 500, 450); } @@ -5271,38 +5092,27 @@ static void window_ride_graphs_update(rct_window *w) * * rct2: 0x006AEA75 */ -static void window_ride_graphs_scrollgetheight() +static void window_ride_graphs_scrollgetheight(rct_window *w, int scrollIndex, int *width, int *height) { - rct_window *w; rct_ride_measurement *measurement; - int width, height; - - window_get_register(w); window_event_invalidate_call(w); // Set minimum size - width = window_ride_graphs_widgets[WIDX_GRAPH].right - window_ride_graphs_widgets[WIDX_GRAPH].left - 2; - height = 0; + *width = window_ride_graphs_widgets[WIDX_GRAPH].right - window_ride_graphs_widgets[WIDX_GRAPH].left - 2; // Get measurement size measurement = ride_get_measurement(w->number, NULL); if (measurement != NULL) - width = max(width, measurement->num_items); - - window_scrollsize_set_registers(width, height); + *width = max(*width, measurement->num_items); } /** * * rct2: 0x006AE953 */ -static void window_ride_graphs_15() +static void window_ride_graphs_15(rct_window *w, int scrollIndex, int scrollAreaType) { - rct_window *w; - - window_get_register(w); - w->list_information_type |= 0x8000; } @@ -5310,45 +5120,37 @@ static void window_ride_graphs_15() * * rct2: 0x006AEA05 */ -static void window_ride_graphs_tooltip() +static void window_ride_graphs_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - rct_window *w; - short widgetIndex, result; rct_ride *ride; rct_ride_measurement *measurement; - rct_string_id stringId; + rct_string_id message; - window_tooltip_get_registers(w, widgetIndex); - - result = -1; if (widgetIndex == WIDX_GRAPH) { RCT2_GLOBAL(0x013CE952, uint16) = 3158; - measurement = ride_get_measurement(w->number, &stringId); + measurement = ride_get_measurement(w->number, &message); if (measurement != NULL && (measurement->flags & RIDE_MEASUREMENT_FLAG_RUNNING)) { RCT2_GLOBAL(0x013CE952 + 4, uint16) = measurement->vehicle_index + 1; ride = GET_RIDE(w->number); RCT2_GLOBAL(0x013CE952 + 2, uint16) = RideNameConvention[ride->type].vehicle_name + 6; - result = 0; } else { - result = stringId; + *stringId = message; } + } else { + *stringId = STR_NONE; } - - window_tooltip_set_registers(result); } /** * * rct2: 0x006AE372 */ -static void window_ride_graphs_invalidate() +static void window_ride_graphs_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; rct_ride *ride; int x, y; - window_get_register(w); colour_scheme_update(w); widgets = window_ride_page_widgets[w->page]; @@ -5405,13 +5207,8 @@ static void window_ride_graphs_invalidate() * * rct2: 0x006AE4BC */ -static void window_ride_graphs_paint() +static void window_ride_graphs_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_ride_draw_tab_images(dpi, w); } @@ -5420,17 +5217,13 @@ static void window_ride_graphs_paint() * * rct2: 0x006AE4C7 */ -static void window_ride_graphs_scrollpaint() +static void window_ride_graphs_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_ride_measurement *measurement; rct_widget *widget; int x, y, width, time, listType, colour, top, bottom, tmp; rct_string_id stringId; - window_paint_get_registers(w, dpi); - gfx_clear(dpi, RCT2_GLOBAL(0x0141FC9D, uint8) * 0x01010101); widget = &window_ride_graphs_widgets[WIDX_GRAPH]; @@ -5732,13 +5525,8 @@ static void window_ride_income_decrease_secondary_price(rct_window *w) * * rct2: 0x006ADEA9 */ -static void window_ride_income_mouseup() +static void window_ride_income_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -5768,12 +5556,8 @@ static void window_ride_income_mouseup() * * rct2: 0x006AE2F8 */ -static void window_ride_income_resize() +static void window_ride_income_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_set_resize(w, 316, 177, 316, 177); } @@ -5822,15 +5606,13 @@ static void window_ride_income_update(rct_window *w) * * rct2: 0x006ADAA3 */ -static void window_ride_income_invalidate() +static void window_ride_income_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; rct_ride_type *rideEntry; rct_string_id stringId; int primaryItem, secondaryItem; - window_get_register(w); colour_scheme_update(w); widgets = window_ride_page_widgets[w->page]; @@ -5941,18 +5723,14 @@ static void window_ride_income_invalidate() * * rct2: 0x006ADCE5 */ -static void window_ride_income_paint() +static void window_ride_income_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_ride *ride; rct_ride_type *rideEntry; rct_string_id stringId; money32 profit, costPerHour; int x, y, primaryItem, secondaryItem; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_ride_draw_tab_images(dpi, w); @@ -6032,13 +5810,8 @@ static void window_ride_income_paint() * * rct2: 0x006AD986 */ -static void window_ride_customer_mouseup() +static void window_ride_customer_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -6071,12 +5844,8 @@ static void window_ride_customer_mouseup() * * rct2: 0x006ADA29 */ -static void window_ride_customer_resize() +static void window_ride_customer_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - w->flags |= WF_RESIZABLE; window_set_resize(w, 316, 139, 316, 139); } @@ -6107,12 +5876,10 @@ static void window_ride_customer_update(rct_window *w) * * rct2: 0x006AD5F8 */ -static void window_ride_customer_invalidate() +static void window_ride_customer_invalidate(rct_window *w) { - rct_window *w; rct_widget *widgets; - window_get_register(w); colour_scheme_update(w); widgets = window_ride_page_widgets[w->page]; @@ -6144,10 +5911,8 @@ static void window_ride_customer_invalidate() * * rct2: 0x006AD6CD */ -static void window_ride_customer_paint() +static void window_ride_customer_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_ride *ride; int x, y; uint8 shopItem; @@ -6155,8 +5920,6 @@ static void window_ride_customer_paint() sint32 customersPerHour; rct_string_id stringId; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_ride_draw_tab_images(dpi, w); diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 84daa1f183..b7f346abbe 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -132,49 +132,47 @@ static rct_widget window_ride_construction_widgets[] = { #pragma region Events -static void window_ride_construction_emptysub() {} - -static void window_ride_construction_close(); -static void window_ride_construction_mouseup(); -static void window_ride_construction_resize(); +static void window_ride_construction_close(rct_window *w); +static void window_ride_construction_mouseup(rct_window *w, int widgetIndex); +static void window_ride_construction_resize(rct_window *w); static void window_ride_construction_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); -static void window_ride_construction_dropdown(); +static void window_ride_construction_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_ride_construction_update(rct_window *w); -static void window_ride_construction_toolupdate(); -static void window_ride_construction_tooldown(); -static void window_ride_construction_invalidate(); -static void window_ride_construction_paint(); +static void window_ride_construction_toolupdate(rct_window* w, int widgetIndex, int x, int y); +static void window_ride_construction_tooldown(rct_window* w, int widgetIndex, int x, int y); +static void window_ride_construction_invalidate(rct_window *w); +static void window_ride_construction_paint(rct_window *w, rct_drawpixelinfo *dpi); //0x993EEC -static void* window_ride_construction_events[] = { +static rct_window_event_list window_ride_construction_events = { window_ride_construction_close, window_ride_construction_mouseup, window_ride_construction_resize, window_ride_construction_mousedown, window_ride_construction_dropdown, - window_ride_construction_emptysub, + NULL, window_ride_construction_update, - window_ride_construction_emptysub, - window_ride_construction_emptysub, + NULL, + NULL, window_ride_construction_toolupdate, window_ride_construction_tooldown, - window_ride_construction_emptysub, - window_ride_construction_emptysub, - window_ride_construction_emptysub, - window_ride_construction_emptysub, - window_ride_construction_emptysub, - window_ride_construction_emptysub, - window_ride_construction_emptysub, - window_ride_construction_emptysub, - window_ride_construction_emptysub, - window_ride_construction_emptysub, - window_ride_construction_emptysub, - window_ride_construction_emptysub, - window_ride_construction_emptysub, - window_ride_construction_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_ride_construction_invalidate, window_ride_construction_paint, - window_ride_construction_emptysub + NULL }; #pragma endregion @@ -507,7 +505,7 @@ rct_window *window_ride_construction_open() if (ride->type == RIDE_TYPE_MAZE) return window_maze_construction_open(); - w = window_create(0, 29, 166, 394, (uint32*)window_ride_construction_events, WC_RIDE_CONSTRUCTION, WF_9); + w = window_create(0, 29, 166, 394, &window_ride_construction_events, WC_RIDE_CONSTRUCTION, WF_9); w->widgets = window_ride_construction_widgets; w->enabled_widgets = 0x67EFFFFFC4; @@ -560,13 +558,10 @@ rct_window *window_ride_construction_open() * * rct2: 0x006C845D */ -static void window_ride_construction_close() +static void window_ride_construction_close(rct_window *w) { - rct_window *w; rct_xy_element mapElement; - window_get_register(w); - sub_6C9627(); viewport_set_visibility(0); @@ -596,13 +591,8 @@ static void window_ride_construction_close() * * rct2: 0x006C6E14 */ -static void window_ride_construction_mouseup() +static void window_ride_construction_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - window_ride_construction_update_enabled_track_pieces(); switch (widgetIndex){ case WIDX_CLOSE: @@ -636,12 +626,8 @@ static void window_ride_construction_mouseup() * * rct2: 0x006C7934 */ -static void window_ride_construction_resize() +static void window_ride_construction_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_ride_construction_update_enabled_track_pieces(); w->enabled_widgets &= ~(1 << WIDX_CONSTRUCT); if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_PLACE) { @@ -1528,13 +1514,8 @@ static void window_ride_construction_mousedown(int widgetIndex, rct_window *w, r * * rct2: 0x006C78CD */ -static void window_ride_construction_dropdown() +static void window_ride_construction_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - short dropdownIndex, widgetIndex; - rct_window *w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (widgetIndex != WIDX_SPECIAL_TRACK_DROPDOWN) return; if (dropdownIndex == -1) @@ -1931,20 +1912,15 @@ static bool ride_get_place_position_from_screen_position(int screenX, int screen * * rct2: 0x006C8229 */ -static void window_ride_construction_toolupdate() +static void window_ride_construction_toolupdate(rct_window* w, int widgetIndex, int x, int y) { - rct_window *w; - short screenX, screenY, widgetIndex; - - window_tool_get_registers(w, widgetIndex, screenX, screenY); - switch (widgetIndex) { case WIDX_CONSTRUCT: - ride_construction_toolupdate_construct(screenX, screenY); + ride_construction_toolupdate_construct(x, y); break; case WIDX_ENTRANCE: case WIDX_EXIT: - ride_construction_toolupdate_entrance_exit(screenX, screenY); + ride_construction_toolupdate_entrance_exit(x, y); break; } } @@ -1953,20 +1929,15 @@ static void window_ride_construction_toolupdate() * * rct2: 0x006C8248 */ -static void window_ride_construction_tooldown() +static void window_ride_construction_tooldown(rct_window* w, int widgetIndex, int x, int y) { - rct_window *w; - short screenX, screenY, widgetIndex; - - window_tool_get_registers(w, widgetIndex, screenX, screenY); - switch (widgetIndex) { case WIDX_CONSTRUCT: - ride_construction_tooldown_construct(screenX, screenY); + ride_construction_tooldown_construct(x, y); break; case WIDX_ENTRANCE: case WIDX_EXIT: - ride_construction_tooldown_entrance_exit(screenX, screenY); + ride_construction_tooldown_entrance_exit(x, y); break; } } @@ -1975,14 +1946,11 @@ static void window_ride_construction_tooldown() * * rct2: 0x006C6AD5 */ -static void window_ride_construction_invalidate() +static void window_ride_construction_invalidate(rct_window *w) { - rct_window *w; rct_ride *ride; rct_string_id stringId; - window_get_register(w); - ride = GET_RIDE(_currentRideIndex); stringId = STR_RIDE_CONSTRUCTION_SPECIAL; @@ -2011,15 +1979,12 @@ static void window_ride_construction_invalidate() * * rct2: 0x006C6B86 */ -static void window_ride_construction_paint() +static void window_ride_construction_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi, *clipdpi; + rct_drawpixelinfo *clipdpi; rct_widget *widget; int x, y, width, height; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); widget = &window_ride_construction_widgets[WIDX_CONSTRUCT]; diff --git a/src/windows/ride_list.c b/src/windows/ride_list.c index 704946e326..873a93c76e 100644 --- a/src/windows/ride_list.c +++ b/src/windows/ride_list.c @@ -71,46 +71,45 @@ static rct_widget window_ride_list_widgets[] = { { WIDGETS_END }, }; -static void window_ride_list_emptysub() { } -static void window_ride_list_mouseup(); -static void window_ride_list_resize(); +static void window_ride_list_mouseup(rct_window *w, int widgetIndex); +static void window_ride_list_resize(rct_window *w); static void window_ride_list_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_ride_list_dropdown(); +static void window_ride_list_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_ride_list_update(rct_window *w); -static void window_ride_list_scrollgetsize(); -static void window_ride_list_scrollmousedown(); -static void window_ride_list_scrollmouseover(); -static void window_ride_list_tooltip(); -static void window_ride_list_invalidate(); -static void window_ride_list_paint(); -static void window_ride_list_scrollpaint(); +static void window_ride_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_ride_list_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_ride_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_ride_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_ride_list_invalidate(rct_window *w); +static void window_ride_list_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_ride_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void* window_ride_list_events[] = { - window_ride_list_emptysub, +static rct_window_event_list window_ride_list_events = { + NULL, window_ride_list_mouseup, window_ride_list_resize, window_ride_list_mousedown, window_ride_list_dropdown, - window_ride_list_emptysub, + NULL, window_ride_list_update, - window_ride_list_emptysub, - window_ride_list_emptysub, - window_ride_list_emptysub, - window_ride_list_emptysub, - window_ride_list_emptysub, - window_ride_list_emptysub, - window_ride_list_emptysub, - window_ride_list_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_ride_list_scrollgetsize, window_ride_list_scrollmousedown, - window_ride_list_emptysub, + NULL, window_ride_list_scrollmouseover, - window_ride_list_emptysub, - window_ride_list_emptysub, - window_ride_list_emptysub, + NULL, + NULL, + NULL, window_ride_list_tooltip, - window_ride_list_emptysub, - window_ride_list_emptysub, + NULL, + NULL, window_ride_list_invalidate, window_ride_list_paint, window_ride_list_scrollpaint @@ -146,7 +145,7 @@ void window_ride_list_open() // Check if window is already open window = window_bring_to_front_by_class(WC_RIDE_LIST); if (window == NULL) { - window = window_create_auto_pos(340, 240, (uint32*)window_ride_list_events, WC_RIDE_LIST, WF_10 | WF_RESIZABLE); + window = window_create_auto_pos(340, 240, &window_ride_list_events, WC_RIDE_LIST, WF_10 | WF_RESIZABLE); window->widgets = window_ride_list_widgets; window->enabled_widgets = (1 << WIDX_CLOSE) | @@ -177,13 +176,8 @@ void window_ride_list_open() * * rct2: 0x006B3511 */ -static void window_ride_list_mouseup() +static void window_ride_list_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -219,12 +213,8 @@ static void window_ride_list_mouseup() * * rct2: 0x006B38A7 */ -static void window_ride_list_resize() +static void window_ride_list_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - w->min_width = 340; w->min_height = 124; if (w->width < w->min_width) { @@ -281,13 +271,8 @@ static void window_ride_list_mousedown(int widgetIndex, rct_window*w, rct_widget * * rct2: 0x006B3547 */ -static void window_ride_list_dropdown() +static void window_ride_list_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - short dropdownIndex, widgetIndex; - rct_window *w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (widgetIndex == WIDX_OPEN_CLOSE_ALL) { if (dropdownIndex == 0) window_ride_list_close_all(w); @@ -318,42 +303,32 @@ static void window_ride_list_update(rct_window *w) * * rct2: 0x006B35A1 */ -static void window_ride_list_scrollgetsize() +static void window_ride_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - int top, width, height; - rct_window *w; - - window_get_register(w); + int top; - height = w->no_list_items * 10; + *height = w->no_list_items * 10; if (w->selected_list_item != -1) { w->selected_list_item = -1; window_invalidate(w); } - top = height - window_ride_list_widgets[WIDX_LIST].bottom + window_ride_list_widgets[WIDX_LIST].top + 21; + top = *height - window_ride_list_widgets[WIDX_LIST].bottom + window_ride_list_widgets[WIDX_LIST].top + 21; if (top < 0) top = 0; if (top < w->scrolls[0].v_top) { w->scrolls[0].v_top = top; window_invalidate(w); } - - width = 0; - window_scrollsize_set_registers(width, height); } /** * * rct2: 0x006B361F */ -static void window_ride_list_scrollmousedown() +static void window_ride_list_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) { int index; - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); index = y / 10; if (index >= w->no_list_items) @@ -367,13 +342,9 @@ static void window_ride_list_scrollmousedown() * * rct2: 0x006B35EF */ -static void window_ride_list_scrollmouseover() +static void window_ride_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) { int index; - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); index = y / 10; if (index >= w->no_list_items) @@ -387,7 +358,7 @@ static void window_ride_list_scrollmouseover() * * rct2: 0x006B3861 */ -static void window_ride_list_tooltip() +static void window_ride_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; } @@ -396,13 +367,11 @@ static void window_ride_list_tooltip() * * rct2: 0x006B3182 */ -static void window_ride_list_invalidate() +static void window_ride_list_invalidate(rct_window *w) { int i; - rct_window *w; rct_ride *ride; - window_get_register(w); colour_scheme_update(w); window_ride_list_widgets[WIDX_CURRENT_INFORMATION_TYPE].image = STR_STATUS + _window_ride_list_information_type; @@ -463,13 +432,8 @@ static void window_ride_list_invalidate() * * rct2: 0x006B3235 */ -static void window_ride_list_paint() +static void window_ride_list_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); window_ride_list_draw_tab_images(dpi, w); } @@ -478,15 +442,11 @@ static void window_ride_list_paint() * * rct2: 0x006B3240 */ -static void window_ride_list_scrollpaint() +static void window_ride_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { int i, y, format, formatSecondary, argument; - rct_window *w; - rct_drawpixelinfo *dpi; rct_ride *ride; - window_paint_get_registers(w, dpi); - gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width, dpi->y + dpi->height, RCT2_GLOBAL(0x0141FC48 + (w->colours[1] * 8), uint8)); y = 0; diff --git a/src/windows/save_prompt.c b/src/windows/save_prompt.c index 61f5f40419..3bd10840cc 100644 --- a/src/windows/save_prompt.c +++ b/src/windows/save_prompt.c @@ -68,41 +68,40 @@ static rct_widget window_quit_prompt_widgets[] = { { WIDGETS_END }, }; -static void window_save_prompt_emptysub() { } -static void window_save_prompt_close(); -static void window_save_prompt_mouseup(); -static void window_save_prompt_invalidate(); -static void window_save_prompt_paint(); +static void window_save_prompt_close(rct_window *w); +static void window_save_prompt_mouseup(rct_window *w, int widgetIndex); +static void window_save_prompt_invalidate(rct_window *w); +static void window_save_prompt_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_save_prompt_events[] = { +static rct_window_event_list window_save_prompt_events = { window_save_prompt_close, window_save_prompt_mouseup, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, - window_save_prompt_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_save_prompt_invalidate, window_save_prompt_paint, - window_save_prompt_emptysub + NULL }; /** @@ -181,7 +180,7 @@ void window_save_prompt_open() window = window_create_centred( width, height, - (uint32*)window_save_prompt_events, + &window_save_prompt_events, WC_SAVE_PROMPT, WF_TRANSPARENT | WF_STICK_TO_FRONT ); @@ -208,7 +207,7 @@ void window_save_prompt_open() * * rct2: 0x0066DF17 */ -static void window_save_prompt_close() +static void window_save_prompt_close(rct_window *w) { // Unpause the game RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) &= ~2; @@ -220,13 +219,8 @@ static void window_save_prompt_close() * * rct2: 0x0066DDF2 */ -static void window_save_prompt_mouseup() +static void window_save_prompt_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TITLE_DEMO | SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) { switch (widgetIndex) { case WQIDX_OK: @@ -275,20 +269,12 @@ static void window_save_prompt_mouseup() } } -static void window_save_prompt_invalidate() +static void window_save_prompt_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); } -static void window_save_prompt_paint() +static void window_save_prompt_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); } \ No newline at end of file diff --git a/src/windows/scenery.c b/src/windows/scenery.c index 0e3a18c127..39865e9627 100644 --- a/src/windows/scenery.c +++ b/src/windows/scenery.c @@ -62,48 +62,47 @@ enum { WINDOW_SCENERY_TAB_20 }; -static void window_scenery_emptysub() { } -static void window_scenery_close(); -static void window_scenery_mouseup(); -static void window_scenery_resize(); +static void window_scenery_close(rct_window *w); +static void window_scenery_mouseup(rct_window *w, int widgetIndex); +static void window_scenery_resize(rct_window *w); static void window_scenery_mousedown(int widgetIndex, rct_window* w, rct_widget* widget); -static void window_scenery_dropdown(); +static void window_scenery_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_scenery_update(rct_window *w); -static void window_scenery_event_07(); -static void window_scenery_scrollgetsize(); -static void window_scenery_scrollmousedown(); -static void window_scenery_scrollmouseover(); -static void window_scenery_tooltip(); -static void window_scenery_invalidate(); -static void window_scenery_paint(); -static void window_scenery_scrollpaint(); +static void window_scenery_event_07(rct_window *w); +static void window_scenery_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_scenery_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_scenery_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_scenery_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_scenery_invalidate(rct_window *w); +static void window_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_scenery_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void* window_scenery_events[] = { +static rct_window_event_list window_scenery_events = { window_scenery_close, window_scenery_mouseup, window_scenery_resize, window_scenery_mousedown, window_scenery_dropdown, - window_scenery_emptysub, + NULL, window_scenery_update, window_scenery_event_07, - window_scenery_emptysub, - window_scenery_emptysub, - window_scenery_emptysub, - window_scenery_emptysub, - window_scenery_emptysub, - window_scenery_emptysub, - window_scenery_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_scenery_scrollgetsize, window_scenery_scrollmousedown, - window_scenery_emptysub, + NULL, window_scenery_scrollmouseover, - window_scenery_emptysub, - window_scenery_emptysub, - window_scenery_emptysub, + NULL, + NULL, + NULL, window_scenery_tooltip, - window_scenery_emptysub, - window_scenery_emptysub, + NULL, + NULL, window_scenery_invalidate, window_scenery_paint, window_scenery_scrollpaint, @@ -427,7 +426,7 @@ void window_scenery_open() 0x1D, WINDOW_SCENERY_WIDTH, WINDOW_SCENERY_HEIGHT, - (uint32*)window_scenery_events, + &window_scenery_events, WC_SCENERY, WF_2 ); @@ -503,11 +502,8 @@ bool window_scenery_is_scenery_tool_active() { * * rct2: 0x006E1A73 */ -void window_scenery_close() { - rct_window *w; - - window_get_register(w); - +void window_scenery_close(rct_window *w) +{ scenery_remove_ghost_tool_placement(); hide_gridlines(); viewport_set_visibility(0); @@ -534,13 +530,8 @@ int window_scenery_scrollgetsize_num() * * rct2: 0x006BD94C */ -static void window_scenery_mouseup() +static void window_scenery_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_SCENERY_CLOSE: window_close(w); @@ -595,12 +586,8 @@ void window_scenery_update_scroll(rct_window *w) * * rct2: 0x006E1E48 */ -static void window_scenery_resize() +static void window_scenery_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - if (w->width < w->min_width) { window_invalidate(w); w->width = w->min_width; @@ -661,11 +648,8 @@ static void window_scenery_mousedown(int widgetIndex, rct_window* w, rct_widget* * * rct2: 0x006E1A54 */ -static void window_scenery_dropdown() { - rct_window* w; - short widgetIndex, dropdownIndex; - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - +static void window_scenery_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) +{ if (dropdownIndex == -1) return; @@ -686,11 +670,8 @@ static void window_scenery_dropdown() { * * rct2: 0x006E1B9F */ -static void window_scenery_event_07() { - rct_window *w; - - window_get_register(w); - +static void window_scenery_event_07(rct_window *w) +{ if (w->scenery.selected_scenery_id != -1) { w->scenery.selected_scenery_id = -1; } @@ -777,14 +758,9 @@ static void window_scenery_update(rct_window *w) * * rct2: 0x006E1A91 */ -void window_scenery_scrollgetsize() +void window_scenery_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - int width, height; - - width = 0; - height = window_scenery_scrollgetsize_num(); - - window_scrollsize_set_registers(width, height); + *height = window_scenery_scrollgetsize_num(); } short get_scenery_id_by_cursor_pos(short x, short y) @@ -809,13 +785,8 @@ short get_scenery_id_by_cursor_pos(short x, short y) * * rct2: 0x006E1C4A */ -void window_scenery_scrollmousedown() +void window_scenery_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) { - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); - short sceneryId = get_scenery_id_by_cursor_pos(x, y); if (sceneryId == -1) return; @@ -834,12 +805,8 @@ void window_scenery_scrollmousedown() * * rct2: 0x006E1BB8 */ -void window_scenery_scrollmouseover() +void window_scenery_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) { - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); short sceneryId = get_scenery_id_by_cursor_pos(x, y); if (sceneryId != -1) { w->scenery.selected_scenery_id = sceneryId; @@ -851,14 +818,9 @@ void window_scenery_scrollmouseover() * * rct2: 0x006E1C05 */ -void window_scenery_tooltip() +void window_scenery_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - rct_window *w; - short widget; - - window_scroll_get_registers(w, widget); - - switch (widget) { + switch (widgetIndex) { case WIDX_SCENERY_LIST: RCT2_GLOBAL(0x013CE952, uint16) = 3159; break; @@ -882,7 +844,7 @@ void window_scenery_tooltip() case WIDX_SCENERY_TAB_18: case WIDX_SCENERY_TAB_19: case WIDX_SCENERY_TAB_20: - RCT2_GLOBAL(0x013CE952, uint16) = g_scenerySetEntries[widget - WIDX_SCENERY_TAB_1]->name; + RCT2_GLOBAL(0x013CE952, uint16) = g_scenerySetEntries[widgetIndex - WIDX_SCENERY_TAB_1]->name; break; } } @@ -891,11 +853,8 @@ void window_scenery_tooltip() * * rct2: 0x006E118B */ -void window_scenery_invalidate() +void window_scenery_invalidate(rct_window *w) { - rct_window* w; - - window_get_register(w); colour_scheme_update(w); uint16 tabIndex = window_scenery_active_tab_index; @@ -1018,13 +977,8 @@ void window_scenery_invalidate() * * rct2: 0x006E1462 */ -void window_scenery_paint() +void window_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); uint16 tabIndex = window_scenery_active_tab_index; @@ -1088,13 +1042,8 @@ void window_scenery_paint() * * rct2: 0x006E15ED */ -void window_scenery_scrollpaint() +void window_scenery_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - gfx_clear(dpi, ((char*)0x0141FC48)[w->colours[1] * 8] * 0x1010101); uint8 tabIndex = window_scenery_active_tab_index; diff --git a/src/windows/shortcut_key_change.c b/src/windows/shortcut_key_change.c index 01cf458ca6..bb9209490e 100644 --- a/src/windows/shortcut_key_change.c +++ b/src/windows/shortcut_key_change.c @@ -42,41 +42,40 @@ static rct_widget window_shortcut_change_widgets[] = { { WIDGETS_END } }; -static void window_shortcut_change_emptysub(){} -static void window_shortcut_change_mouseup(); -static void window_shortcut_change_invalidate(); -static void window_shortcut_change_paint(); +static void window_shortcut_change_mouseup(rct_window *w, int widgetIndex); +static void window_shortcut_change_invalidate(rct_window *w); +static void window_shortcut_change_paint(rct_window *w, rct_drawpixelinfo *dpi); //0x9A3F7C -static void* window_shortcut_change_events[] = { - window_shortcut_change_emptysub, +static rct_window_event_list window_shortcut_change_events = { + NULL, window_shortcut_change_mouseup, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, - window_shortcut_change_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_shortcut_change_invalidate, window_shortcut_change_paint, - window_shortcut_change_emptysub + NULL }; void window_shortcut_change_open(int selected_key){ @@ -84,7 +83,7 @@ void window_shortcut_change_open(int selected_key){ window_close_by_class(WC_CHANGE_KEYBOARD_SHORTCUT); // Save the item we are selecting for new window RCT2_GLOBAL(0x9DE511, uint8) = selected_key; - rct_window* w = window_create_auto_pos(WW, WH, (uint32*)window_shortcut_change_events, WC_CHANGE_KEYBOARD_SHORTCUT, 0); + rct_window* w = window_create_auto_pos(WW, WH, &window_shortcut_change_events, WC_CHANGE_KEYBOARD_SHORTCUT, 0); w->widgets = window_shortcut_change_widgets; w->enabled_widgets = (1 << 2); @@ -95,23 +94,17 @@ void window_shortcut_change_open(int selected_key){ * * rct2: 0x006E3AE0 */ -static void window_shortcut_change_mouseup(){ - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - +static void window_shortcut_change_mouseup(rct_window *w, int widgetIndex) +{ switch (widgetIndex){ case WIDX_CLOSE: window_close(w); + break; } } -static void window_shortcut_change_invalidate() +static void window_shortcut_change_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); } @@ -119,12 +112,8 @@ static void window_shortcut_change_invalidate() * * rct2: 0x006E3A9F */ -static void window_shortcut_change_paint(){ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +static void window_shortcut_change_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ window_draw_widgets(w, dpi); int x = w->x + 125; diff --git a/src/windows/shortcut_keys.c b/src/windows/shortcut_keys.c index 7c36ea0166..6f17099807 100644 --- a/src/windows/shortcut_keys.c +++ b/src/windows/shortcut_keys.c @@ -47,42 +47,41 @@ static rct_widget window_shortcut_widgets[] = { { WIDGETS_END } }; -void window_shortcut_emptysub() { } -static void window_shortcut_mouseup(); -static void window_shortcut_invalidate(); -static void window_shortcut_paint(); -static void window_shortcut_tooltip(); -static void window_shortcut_scrollgetsize(); -static void window_shortcut_scrollmousedown(); -static void window_shortcut_scrollmouseover(); -static void window_shortcut_scrollpaint(); +static void window_shortcut_mouseup(rct_window *w, int widgetIndex); +static void window_shortcut_invalidate(rct_window *w); +static void window_shortcut_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_shortcut_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_shortcut_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_shortcut_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_shortcut_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_shortcut_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void* window_shortcut_events[] = { - window_shortcut_emptysub, +static rct_window_event_list window_shortcut_events = { + NULL, window_shortcut_mouseup, - window_shortcut_emptysub, - window_shortcut_emptysub, - window_shortcut_emptysub, - window_shortcut_emptysub, - window_shortcut_emptysub, - window_shortcut_emptysub, - window_shortcut_emptysub, - window_shortcut_emptysub, - window_shortcut_emptysub, - window_shortcut_emptysub, - window_shortcut_emptysub, - window_shortcut_emptysub, - window_shortcut_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_shortcut_scrollgetsize, window_shortcut_scrollmousedown, - window_shortcut_emptysub, + NULL, window_shortcut_scrollmouseover, - window_shortcut_emptysub, - window_shortcut_emptysub, - window_shortcut_emptysub, + NULL, + NULL, + NULL, window_shortcut_tooltip, - window_shortcut_emptysub, - window_shortcut_emptysub, + NULL, + NULL, window_shortcut_invalidate, window_shortcut_paint, window_shortcut_scrollpaint @@ -140,7 +139,7 @@ void window_shortcut_keys_open() if (w) return; - w = window_create_auto_pos(WW, WH, (uint32*)window_shortcut_events, WC_KEYBOARD_SHORTCUT_LIST, 0); + w = window_create_auto_pos(WW, WH, &window_shortcut_events, WC_KEYBOARD_SHORTCUT_LIST, 0); w->widgets = window_shortcut_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_RESET); @@ -154,13 +153,8 @@ void window_shortcut_keys_open() * * rct2: 0x006E39E4 */ -static void window_shortcut_mouseup() +static void window_shortcut_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex){ case WIDX_CLOSE: window_close(w); @@ -173,11 +167,8 @@ static void window_shortcut_mouseup() } } -static void window_shortcut_invalidate() +static void window_shortcut_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); } @@ -185,13 +176,8 @@ static void window_shortcut_invalidate() * * rct2: 0x006E38E0 */ -static void window_shortcut_paint() +static void window_shortcut_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); } @@ -199,7 +185,7 @@ static void window_shortcut_paint() * * rct2: 0x006E3A0C */ -static void window_shortcut_tooltip() +static void window_shortcut_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; } @@ -208,30 +194,17 @@ static void window_shortcut_tooltip() * * rct2: 0x006E3A07 */ -static void window_shortcut_scrollgetsize() +static void window_shortcut_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - rct_window *w; - int width, height; - - window_get_register(w); - - width = 0; - height = w->no_list_items * 10; - - window_scrollsize_set_registers(width, height); + *height = w->no_list_items * 10; } /** * * rct2: 0x006E3A3E */ -static void window_shortcut_scrollmousedown() +static void window_shortcut_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) { - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); - int selected_item = y / 10; if (selected_item >= w->no_list_items) return; @@ -243,13 +216,8 @@ static void window_shortcut_scrollmousedown() * * rct2: 0x006E3A16 */ -static void window_shortcut_scrollmouseover() +static void window_shortcut_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) { - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); - int selected_item = y / 10; if (selected_item >= w->no_list_items) return; @@ -263,13 +231,8 @@ static void window_shortcut_scrollmouseover() * * rct2: 0x006E38E6 */ -static void window_shortcut_scrollpaint() +static void window_shortcut_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, RCT2_ADDRESS(0x0141FC48,uint8)[w->colours[1] * 8]); for (int i = 0; i < w->no_list_items; ++i) { diff --git a/src/windows/sign.c b/src/windows/sign.c index 7c9cc5ed9e..c27f0a6194 100644 --- a/src/windows/sign.c +++ b/src/windows/sign.c @@ -61,81 +61,81 @@ rct_widget window_sign_widgets[] = { { WIDGETS_END }, }; -static void window_sign_emptysub() { } -static void window_sign_mouseup(); +static void window_sign_mouseup(rct_window *w, int widgetIndex); static void window_sign_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_sign_dropdown(); -static void window_sign_textinput(); -static void window_sign_invalidate(); -static void window_sign_paint(); -static void window_sign_unknown_14(); +static void window_sign_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); +static void window_sign_textinput(rct_window *w, int widgetIndex, char *text); +static void window_sign_unknown_14(rct_window *w); +static void window_sign_invalidate(rct_window *w); +static void window_sign_paint(rct_window *w, rct_drawpixelinfo *dpi); + // 0x98E44C -static void* window_sign_events[] = { - window_sign_emptysub, +static rct_window_event_list window_sign_events = { + NULL, window_sign_mouseup, - window_sign_emptysub, + NULL, window_sign_mousedown, window_sign_dropdown, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_sign_textinput, window_sign_unknown_14, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, + NULL, + NULL, + NULL, + NULL, window_sign_invalidate, window_sign_paint, - window_sign_emptysub + NULL }; -static void window_sign_small_mouseup(); -static void window_sign_small_dropdown(); -static void window_sign_small_invalidate(); +static void window_sign_small_mouseup(rct_window *w, int widgetIndex); +static void window_sign_small_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); +static void window_sign_small_invalidate(rct_window *w); // 0x9A410C -static void* window_sign_small_events[] = { - window_sign_emptysub, +static rct_window_event_list window_sign_small_events = { + NULL, window_sign_small_mouseup, - window_sign_emptysub, + NULL, window_sign_mousedown, window_sign_small_dropdown, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_sign_textinput, window_sign_unknown_14, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, - window_sign_emptysub, + NULL, + NULL, + NULL, + NULL, window_sign_small_invalidate, window_sign_paint, - window_sign_emptysub + NULL }; /** @@ -153,7 +153,7 @@ void window_sign_open(rct_windownumber number) if (w != NULL) return; - w = window_create_auto_pos(WW, WH, (uint32*)window_sign_events, WC_BANNER, WF_2); + w = window_create_auto_pos(WW, WH, &window_sign_events, WC_BANNER, WF_2); w->widgets = window_sign_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | @@ -215,13 +215,8 @@ void window_sign_open(rct_windownumber number) } /* rct2: 0x6B9765*/ -static void window_sign_mouseup() +static void window_sign_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - rct_banner* banner = &gBanners[w->number]; int x = banner->x << 5; int y = banner->y << 5; @@ -288,13 +283,8 @@ static void window_sign_mousedown(int widgetIndex, rct_window*w, rct_widget* wid } /* rct2: 0x6B979C */ -static void window_sign_dropdown() +static void window_sign_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - short widgetIndex, dropdownIndex; - rct_window *w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - switch (widgetIndex){ case WIDX_MAIN_COLOR: if (dropdownIndex == -1) return; @@ -326,21 +316,14 @@ static void window_sign_dropdown() } /* rct2: 0x6B9791 & 0x6E6171*/ -static void window_sign_textinput() +static void window_sign_textinput(rct_window *w, int widgetIndex, char *text) { - short widgetIndex; - rct_window *w; - uint8 result; - uint8* text; - - window_text_input_get_registers(w, widgetIndex, result, text); rct_banner* banner = &gBanners[w->number]; int x = banner->x << 5; int y = banner->y << 5; - if (widgetIndex == WIDX_SIGN_TEXT && result) { - - if (*text != 0){ + if (widgetIndex == WIDX_SIGN_TEXT && text != NULL) { + if (*text != 0) { rct_string_id string_id = user_string_allocate(128, text); if (string_id != 0) { rct_string_id prev_string_id = banner->string_idx; @@ -369,11 +352,8 @@ static void window_sign_textinput() } /* rct2: 0x006B96F5 */ -static void window_sign_invalidate() +static void window_sign_invalidate(rct_window *w) { - rct_window* w; - - window_get_register(w); colour_scheme_update(w); rct_widget* main_colour_btn = &window_sign_widgets[WIDX_MAIN_COLOR]; @@ -396,13 +376,8 @@ static void window_sign_invalidate() } /* rct2: 0x006B9754 & 0x006E6134 */ -static void window_sign_paint() +static void window_sign_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); // Draw viewport @@ -412,11 +387,8 @@ static void window_sign_paint() } /* rct2: 0x6B9A6C & 0x6E6424 */ -static void window_sign_unknown_14() +static void window_sign_unknown_14(rct_window *w) { - rct_window* w; - window_get_register(w); - rct_viewport* view = w->viewport; w->viewport = 0; @@ -461,7 +433,7 @@ void window_sign_small_open(rct_windownumber number){ if (w != NULL) return; - w = window_create_auto_pos(WW, WH, (uint32*)window_sign_small_events, WC_BANNER, 0); + w = window_create_auto_pos(WW, WH, &window_sign_small_events, WC_BANNER, 0); w->widgets = window_sign_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | @@ -524,13 +496,8 @@ void window_sign_small_open(rct_windownumber number){ } /* rct2: 0x6E6145 */ -static void window_sign_small_mouseup() +static void window_sign_small_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - rct_banner* banner = &gBanners[w->number]; int x = banner->x << 5; int y = banner->y << 5; @@ -580,13 +547,8 @@ static void window_sign_small_mouseup() } /* rct2: 0x6E617C */ -static void window_sign_small_dropdown() +static void window_sign_small_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - short widgetIndex, dropdownIndex; - rct_window* w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - switch (widgetIndex){ case WIDX_MAIN_COLOR: if (dropdownIndex == -1) return; @@ -628,11 +590,8 @@ static void window_sign_small_dropdown() } /* rct2: 0x006E60D5 */ -static void window_sign_small_invalidate() +static void window_sign_small_invalidate(rct_window *w) { - rct_window* w; - - window_get_register(w); colour_scheme_update(w); rct_widget* main_colour_btn = &window_sign_widgets[WIDX_MAIN_COLOR]; diff --git a/src/windows/staff.c b/src/windows/staff.c index 9a877cdda8..de7e41d4ef 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -70,8 +70,6 @@ enum WINDOW_STAFF_WIDGET_IDX { WIDX_COSTUME_BTN, }; -void window_staff_emptysub(){}; - rct_widget window_staff_overview_widgets[] = { { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, 0x0FFFFFFFF, STR_NONE }, // Panel / Background { WWT_CAPTION, 0, 1, WW - 2, 1, 14, 0x361, STR_WINDOW_TITLE_TIP }, // Title @@ -131,141 +129,141 @@ rct_widget *window_staff_page_widgets[] = { void window_staff_set_page(rct_window* w, int page); void window_staff_disable_widgets(rct_window* w); -void window_staff_unknown_05(); +void window_staff_unknown_05(rct_window *w); void window_staff_viewport_init(rct_window* w); -void window_staff_overview_close(); -void window_staff_overview_mouseup(); -void window_staff_overview_resize(); +void window_staff_overview_close(rct_window *w); +void window_staff_overview_mouseup(rct_window *w, int widgetIndex); +void window_staff_overview_resize(rct_window *w); void window_staff_overview_mousedown(int widgetIndex, rct_window* w, rct_widget* widget); -void window_staff_overview_dropdown(); +void window_staff_overview_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); void window_staff_overview_update(rct_window* w); -void window_staff_overview_invalidate(); -void window_staff_overview_paint(); +void window_staff_overview_invalidate(rct_window *w); +void window_staff_overview_paint(rct_window *w, rct_drawpixelinfo *dpi); void window_staff_overview_tab_paint(rct_window* w, rct_drawpixelinfo* dpi); -void window_staff_overview_tool_update(); -void window_staff_overview_tool_down(); -void window_staff_overview_tool_abort(); -void window_staff_overview_text_input(); -void window_staff_overview_viewport_init_wrapper(); +void window_staff_overview_tool_update(rct_window* w, int widgetIndex, int x, int y); +void window_staff_overview_tool_down(rct_window* w, int widgetIndex, int x, int y); +void window_staff_overview_tool_abort(rct_window *w, int widgetIndex); +void window_staff_overview_text_input(rct_window *w, int widgetIndex, char *text); +void window_staff_overview_unknown_14(rct_window *w); -void window_staff_options_mouseup(); +void window_staff_options_mouseup(rct_window *w, int widgetIndex); void window_staff_options_update(rct_window* w); -void window_staff_options_invalidate(); -void window_staff_options_paint(); +void window_staff_options_invalidate(rct_window *w); +void window_staff_options_paint(rct_window *w, rct_drawpixelinfo *dpi); void window_staff_options_tab_paint(rct_window* w, rct_drawpixelinfo* dpi); void window_staff_options_mousedown(int widgetIndex, rct_window* w, rct_widget* widget); -void window_staff_options_dropdown(); +void window_staff_options_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); -void window_staff_stats_mouseup(); -void window_staff_stats_resize(); +void window_staff_stats_mouseup(rct_window *w, int widgetIndex); +void window_staff_stats_resize(rct_window *w); void window_staff_stats_update(rct_window* w); -void window_staff_stats_invalidate(); -void window_staff_stats_paint(); +void window_staff_stats_invalidate(rct_window *w); +void window_staff_stats_paint(rct_window *w, rct_drawpixelinfo *dpi); void window_staff_stats_tab_paint(rct_window* w, rct_drawpixelinfo* dpi); void window_staff_set_colours(); // 0x992AEC -static void* window_staff_overview_events[] = { +static rct_window_event_list window_staff_overview_events = { window_staff_overview_close, window_staff_overview_mouseup, window_staff_overview_resize, window_staff_overview_mousedown, window_staff_overview_dropdown, - window_staff_emptysub, + NULL, window_staff_overview_update, - window_staff_emptysub, - window_staff_emptysub, + NULL, + NULL, window_staff_overview_tool_update, window_staff_overview_tool_down, - window_staff_emptysub, - window_staff_emptysub, + NULL, + NULL, window_staff_overview_tool_abort, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_staff_overview_text_input, - window_staff_overview_viewport_init_wrapper, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, + window_staff_overview_unknown_14, + NULL, + NULL, + NULL, + NULL, window_staff_overview_invalidate, //Invalidate window_staff_overview_paint, //Paint - window_staff_emptysub + NULL }; // 0x992B5C -static void* window_staff_options_events[] = { - window_staff_emptysub, +static rct_window_event_list window_staff_options_events = { + NULL, window_staff_options_mouseup, window_staff_stats_resize, window_staff_options_mousedown, window_staff_options_dropdown, window_staff_unknown_05, window_staff_options_update, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_staff_options_invalidate, //Invalidate window_staff_options_paint, //Paint - window_staff_emptysub + NULL }; // 0x992BCC -static void* window_staff_stats_events[] = { - window_staff_emptysub, +static rct_window_event_list window_staff_stats_events = { + NULL, window_staff_stats_mouseup, window_staff_stats_resize, - window_staff_emptysub, - window_staff_emptysub, + NULL, + NULL, window_staff_unknown_05, window_staff_stats_update, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, - window_staff_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_staff_stats_invalidate, //Invalidate window_staff_stats_paint, //Paint - window_staff_emptysub + NULL }; -void* window_staff_page_events[] = { - window_staff_overview_events, - window_staff_options_events, - window_staff_stats_events +static rct_window_event_list *window_staff_page_events[] = { + &window_staff_overview_events, + &window_staff_options_events, + &window_staff_stats_events }; uint32 window_staff_page_enabled_widgets[] = { @@ -303,7 +301,7 @@ void window_staff_open(rct_peep* peep) { rct_window* w = window_bring_to_front_by_number(WC_PEEP, peep->sprite_index); if (w == NULL) { - w = window_create_auto_pos(WW, WH, (uint32*)window_staff_overview_events, WC_PEEP, WF_10 | WF_RESIZABLE); + w = window_create_auto_pos(WW, WH, &window_staff_overview_events, WC_PEEP, WF_10 | WF_RESIZABLE); w->widgets = RCT2_GLOBAL(0x9AF81C, rct_widget*); w->enabled_widgets = RCT2_GLOBAL(0x9929B0, uint32); @@ -369,12 +367,8 @@ void window_staff_disable_widgets(rct_window* w) * Same as window_peep_overview_close. * rct2: 0x006BDFF8 */ -void window_staff_overview_close() +void window_staff_overview_close(rct_window *w) { - rct_window* w; - - window_get_register(w); - if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE){ if (w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) && w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber)) @@ -431,11 +425,8 @@ void window_staff_set_page(rct_window* w, int page) } /** rct2: 0x006BDF55 */ -void window_staff_overview_mouseup() +void window_staff_overview_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window* w; - window_widget_get_registers(w, widgetIndex); rct_peep* peep = GET_PEEP(w->number); switch (widgetIndex) { @@ -475,11 +466,8 @@ void window_staff_overview_mouseup() } /** rct2: 0x006BE558 */ -void window_staff_overview_resize() +void window_staff_overview_resize(rct_window *w) { - rct_window* w; - window_get_register(w); - window_staff_disable_widgets(w); w->min_width = WW; @@ -554,13 +542,8 @@ void window_staff_overview_mousedown(int widgetIndex, rct_window* w, rct_widget* } /** rct2: 0x006BDFA3 */ -void window_staff_overview_dropdown() +void window_staff_overview_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - short widgetIndex, dropdownIndex; - rct_window* w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (widgetIndex != WIDX_PATROL) { return; } @@ -616,12 +599,8 @@ void window_staff_set_order(rct_window* w, int order_id) } /** rct2: 0x006BE7DB */ -void window_staff_options_mouseup() +void window_staff_options_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window* w; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -648,12 +627,8 @@ void window_staff_options_update(rct_window* w) } /** rct2: 0x006BEBCF */ -void window_staff_stats_mouseup() +void window_staff_stats_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window* w; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -667,11 +642,8 @@ void window_staff_stats_mouseup() } /** rct2: 0x006BEC1B and rct2: 0x006BE975 */ -void window_staff_stats_resize() +void window_staff_stats_resize(rct_window *w) { - rct_window* w; - window_get_register(w); - w->min_width = 190; w->max_width = 190; w->min_height = 119; @@ -712,17 +684,14 @@ void window_staff_stats_update(rct_window* w) } /* rct2: 0x6BEC80, 0x6BE9DA */ -void window_staff_unknown_05(){ - rct_window* w; - window_get_register(w); - +void window_staff_unknown_05(rct_window *w) +{ widget_invalidate(w, WIDX_TAB_1); } /* rct2: 0x006BE9E9 */ -void window_staff_stats_invalidate(){ - rct_window* w; - window_get_register(w); +void window_staff_stats_invalidate(rct_window *w) +{ colour_scheme_update_by_class(w, (rct_windowclass)WC_STAFF); if (window_staff_page_widgets[w->page] != w->widgets){ @@ -753,9 +722,8 @@ void window_staff_stats_invalidate(){ /* rct2: 0x006BE62B */ -void window_staff_options_invalidate(){ - rct_window* w; - window_get_register(w); +void window_staff_options_invalidate(rct_window *w) +{ colour_scheme_update_by_class(w, (rct_windowclass)WC_STAFF); if (window_staff_page_widgets[w->page] != w->widgets){ @@ -826,9 +794,8 @@ void window_staff_options_invalidate(){ } /* rct2: 0x006BDD91 */ -void window_staff_overview_invalidate(){ - rct_window* w; - window_get_register(w); +void window_staff_overview_invalidate(rct_window *w) +{ colour_scheme_update_by_class(w, (rct_windowclass)WC_STAFF); if (window_staff_page_widgets[w->page] != w->widgets){ @@ -880,12 +847,8 @@ void window_staff_overview_invalidate(){ } /* rct2: 0x6BDEAF */ -void window_staff_overview_paint(){ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +void window_staff_overview_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ window_draw_widgets(w, dpi); window_staff_overview_tab_paint(w, dpi); window_staff_options_tab_paint(w, dpi); @@ -915,7 +878,8 @@ void window_staff_overview_paint(){ } /* rct2: 0x6BEC8F */ -void window_staff_options_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ +void window_staff_options_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) +{ if (w->disabled_widgets & (1 << WIDX_TAB_2)) return; rct_widget* widget = &w->widgets[WIDX_TAB_2]; @@ -932,7 +896,8 @@ void window_staff_options_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ } /* rct2: 0x6BECD3 */ -void window_staff_stats_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ +void window_staff_stats_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) +{ if (w->disabled_widgets & (1 << WIDX_TAB_3)) return; rct_widget* widget = &w->widgets[WIDX_TAB_3]; @@ -951,7 +916,8 @@ void window_staff_stats_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ /** * Based on rct2: 0x6983dd in window_guest to be remerged into one when peep file added. */ -void window_staff_overview_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ +void window_staff_overview_tab_paint(rct_window* w, rct_drawpixelinfo* dpi) +{ if (w->disabled_widgets & (1 << WIDX_TAB_1)) return; @@ -1011,12 +977,8 @@ void window_staff_overview_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ } /* rct2: 0x6BE7C6 */ -void window_staff_options_paint(){ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +void window_staff_options_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ window_draw_widgets(w, dpi); window_staff_overview_tab_paint(w, dpi); window_staff_options_tab_paint(w, dpi); @@ -1024,12 +986,8 @@ void window_staff_options_paint(){ } /* rct2: 0x6BEA86 */ -void window_staff_stats_paint(){ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +void window_staff_stats_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ window_draw_widgets(w, dpi); window_staff_overview_tab_paint(w, dpi); window_staff_options_tab_paint(w, dpi); @@ -1076,14 +1034,10 @@ void window_staff_stats_paint(){ } /* rct2: 0x006BDFD8 */ -void window_staff_overview_tool_update(){ - short widgetIndex; - rct_window* w; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - - if (widgetIndex != WIDX_PICKUP) return; +void window_staff_overview_tool_update(rct_window* w, int widgetIndex, int x, int y) +{ + if (widgetIndex != WIDX_PICKUP) + return; RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_SPRITE, sint32) = -1; @@ -1109,15 +1063,9 @@ void window_staff_overview_tool_update(){ } /* rct2: 0x006BDFC3 */ -void window_staff_overview_tool_down(){ - short widgetIndex; - rct_window* w; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - - if (widgetIndex == WIDX_PICKUP){ - +void window_staff_overview_tool_down(rct_window* w, int widgetIndex, int x, int y) +{ + if (widgetIndex == WIDX_PICKUP) { int dest_x, dest_y; rct_map_element *mapElement; footpath_get_coordinates_from_pos(x, y + 16, &dest_x, &dest_y, NULL, &mapElement); @@ -1174,14 +1122,9 @@ void window_staff_overview_tool_down(){ } /* rct2: 0x6BDFAE */ -void window_staff_overview_tool_abort(){ - short widgetIndex; - rct_window* w; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - if (widgetIndex == WIDX_PICKUP){ - +void window_staff_overview_tool_abort(rct_window *w, int widgetIndex) +{ + if (widgetIndex == WIDX_PICKUP) { rct_peep* peep = GET_PEEP(w->number); if (peep->state != PEEP_STATE_PICKED) return; @@ -1209,17 +1152,13 @@ void window_staff_overview_tool_abort(){ } /* rct2:0x6BDFED */ -void window_staff_overview_text_input(){ - short widgetIndex; - rct_window *w; - char _cl; - uint32* text; +void window_staff_overview_text_input(rct_window *w, int widgetIndex, char *text) +{ + if (widgetIndex != WIDX_RENAME) + return; - window_text_input_get_registers(w, widgetIndex, _cl, text); - - if (widgetIndex != WIDX_RENAME)return; - - if (!_cl) return; + if (text == NULL) + return; RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = 2979; @@ -1229,10 +1168,8 @@ void window_staff_overview_text_input(){ } /* rct2: 0x006BE5FC */ -void window_staff_overview_viewport_init_wrapper(){ - rct_window* w; - window_get_register(w); - +void window_staff_overview_unknown_14(rct_window *w) +{ window_staff_viewport_init(w); } @@ -1360,22 +1297,16 @@ void window_staff_options_mousedown(int widgetIndex, rct_window* w, rct_widget* } /** rct2: 0x6BE809 */ -void window_staff_options_dropdown() +void window_staff_options_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - short widgetIndex, dropdownIndex; - rct_window* w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (widgetIndex != WIDX_COSTUME_BTN) { return; } - if (dropdownIndex == -1)return; + if (dropdownIndex == -1) + return; rct_peep* peep = GET_PEEP(w->number); - int costume = (RCT2_ADDRESS(0xF4391B, uint8)[dropdownIndex] - 4) | 0x80; - game_do_command(peep->x, (costume << 8) | 1, peep->y, w->number, GAME_COMMAND_SET_STAFF_ORDER, (int)peep, 0); } diff --git a/src/windows/staff_fire_prompt.c b/src/windows/staff_fire_prompt.c index dcf4ae0c28..0669f0bd8b 100644 --- a/src/windows/staff_fire_prompt.c +++ b/src/windows/staff_fire_prompt.c @@ -50,50 +50,50 @@ static rct_widget window_staff_fire_widgets[] = { { WIDGETS_END } }; -static void window_staff_fire_emptysub(){} -static void window_staff_fire_mouseup(); -static void window_staff_fire_invalidate(); -static void window_staff_fire_paint(); +static void window_staff_fire_mouseup(rct_window *w, int widgetIndex); +static void window_staff_fire_invalidate(rct_window *w); +static void window_staff_fire_paint(rct_window *w, rct_drawpixelinfo *dpi); //0x9A3F7C -static void* window_staff_fire_events[] = { - window_staff_fire_emptysub, +static rct_window_event_list window_staff_fire_events = { + NULL, window_staff_fire_mouseup, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, - window_staff_fire_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_staff_fire_invalidate, window_staff_fire_paint, - window_staff_fire_emptysub + NULL }; /** Based off of rct2: 0x6C0A77 */ -void window_staff_fire_prompt_open(rct_peep* peep){ +void window_staff_fire_prompt_open(rct_peep* peep) +{ // Check if the confirm window already exists. if (window_bring_to_front_by_number(WC_FIRE_PROMPT, peep->sprite_index)) { return; } - rct_window* w = window_create_centred(WW, WH, (uint32*)0x992C3C, 0x1A, WF_TRANSPARENT); + rct_window* w = window_create_centred(WW, WH, &window_staff_fire_events, WC_FIRE_PROMPT, WF_TRANSPARENT); w->widgets = window_staff_fire_widgets; w->enabled_widgets |= (1 << WIDX_CLOSE) | (1 << WIDX_YES) | (1 << WIDX_CANCEL); @@ -109,12 +109,8 @@ void window_staff_fire_prompt_open(rct_peep* peep){ * * rct2: 0x006C0B40 */ -static void window_staff_fire_mouseup(){ - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - +static void window_staff_fire_mouseup(rct_window *w, int widgetIndex) +{ rct_peep* peep = &g_sprite_list[w->number].peep; switch (widgetIndex){ @@ -127,11 +123,8 @@ static void window_staff_fire_mouseup(){ } } -static void window_staff_fire_invalidate() +static void window_staff_fire_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); } @@ -139,12 +132,8 @@ static void window_staff_fire_invalidate() * * rct2: 0x006C0AF2 */ -static void window_staff_fire_paint(){ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +static void window_staff_fire_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ window_draw_widgets(w, dpi); rct_peep* peep = &g_sprite_list[w->number].peep; diff --git a/src/windows/staff_list.c b/src/windows/staff_list.c index 18014ac40e..1da2146008 100644 --- a/src/windows/staff_list.c +++ b/src/windows/staff_list.c @@ -43,49 +43,48 @@ enum { bool _quick_fire_mode = false; -static void window_staff_list_emptysub() { } -static void window_staff_list_close(); -static void window_staff_list_mouseup(); -static void window_staff_list_resize(); +static void window_staff_list_close(rct_window *w); +static void window_staff_list_mouseup(rct_window *w, int widgetIndex); +static void window_staff_list_resize(rct_window *w); static void window_staff_list_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_staff_list_dropdown(); +static void window_staff_list_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_staff_list_update(rct_window *w); -static void window_staff_list_tooldown(); -static void window_staff_list_toolabort(); -static void window_staff_list_scrollgetsize(); -static void window_staff_list_scrollmousedown(); -static void window_staff_list_scrollmouseover(); -static void window_staff_list_tooltip(); -static void window_staff_list_invalidate(); -static void window_staff_list_paint(); -static void window_staff_list_scrollpaint(); +static void window_staff_list_tooldown(rct_window *w, int widgetIndex, int x, int y); +static void window_staff_list_toolabort(rct_window *w, int widgetIndex); +static void window_staff_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_staff_list_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_staff_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_staff_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_staff_list_invalidate(rct_window *w); +static void window_staff_list_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_staff_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void* window_staff_list_events[] = { +static rct_window_event_list window_staff_list_events = { window_staff_list_close, window_staff_list_mouseup, window_staff_list_resize, window_staff_list_mousedown, window_staff_list_dropdown, - window_staff_list_emptysub, + NULL, window_staff_list_update, - window_staff_list_emptysub, - window_staff_list_emptysub, - window_staff_list_emptysub, - (void*)0x006BD990, // window_staff_list_tooldown - window_staff_list_emptysub, - window_staff_list_emptysub, + NULL, + NULL, + NULL, + window_staff_list_tooldown, + NULL, + NULL, window_staff_list_toolabort, - window_staff_list_emptysub, + NULL, window_staff_list_scrollgetsize, window_staff_list_scrollmousedown, - window_staff_list_emptysub, + NULL, window_staff_list_scrollmouseover, - window_staff_list_emptysub, - window_staff_list_emptysub, - window_staff_list_emptysub, + NULL, + NULL, + NULL, window_staff_list_tooltip, - window_staff_list_emptysub, - window_staff_list_emptysub, + NULL, + NULL, window_staff_list_invalidate, window_staff_list_paint, window_staff_list_scrollpaint, @@ -151,7 +150,7 @@ void window_staff_list_open() if (window != NULL) return; - window = window_create_auto_pos(320, 270, (uint32*)window_staff_list_events, WC_STAFF_LIST, WF_10 | WF_RESIZABLE); + window = window_create_auto_pos(320, 270, &window_staff_list_events, WC_STAFF_LIST, WF_10 | WF_RESIZABLE); window->widgets = window_staff_list_widgets; window->enabled_widgets = (1 << WIDX_STAFF_LIST_CLOSE) | @@ -188,11 +187,8 @@ void window_staff_list_cancel_tools(rct_window *w) { /* * rct2: 0x006BD9B1 **/ -void window_staff_list_close() { - rct_window *w; - - window_get_register(w); - +void window_staff_list_close(rct_window *w) +{ window_staff_list_cancel_tools(w); } @@ -200,14 +196,10 @@ void window_staff_list_close() { * * rct2: 0x006BD94C */ -static void window_staff_list_mouseup() +static void window_staff_list_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; uint16 newStaffId; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_STAFF_LIST_CLOSE: window_close(w); @@ -247,12 +239,8 @@ static void window_staff_list_mouseup() * * rct2: 0x006BDD5D */ -static void window_staff_list_resize() +static void window_staff_list_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - w->min_width = 320; w->min_height = 270; if (w->width < w->min_width) { @@ -299,12 +287,8 @@ static void window_staff_list_mousedown(int widgetIndex, rct_window* w, rct_widg * * rct2: 0x006BD9A6 */ -static void window_staff_list_dropdown() +static void window_staff_list_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - rct_window* w; - short widgetIndex, dropdownIndex; - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (widgetIndex == WIDX_STAFF_LIST_UNIFORM_COLOR_PICKER && dropdownIndex != -1) { update_staff_colour(RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8), dropdownIndex); } @@ -337,16 +321,21 @@ void window_staff_list_update(rct_window *w) } } +/** + * + * rct2: 0x006BD990 + */ +static void window_staff_list_tooldown(rct_window *w, int widgetIndex, int x, int y) +{ + RCT2_CALLPROC_X(0x006BD990, x, y, 0, widgetIndex, (int)w, 0, 0); +} + /** * * rct2: 0x006BD99B */ -void window_staff_list_toolabort() { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - +void window_staff_list_toolabort(rct_window *w, int widgetIndex) +{ if (widgetIndex == WIDX_STAFF_LIST_SHOW_PATROL_AREA_BUTTON) { hide_gridlines(); tool_cancel(); @@ -359,13 +348,10 @@ void window_staff_list_toolabort() { * * rct2: 0x006BDBE6 */ -void window_staff_list_scrollgetsize() +void window_staff_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - int i, width, height, spriteIndex; + int i, spriteIndex; rct_peep *peep; - rct_window *w; - - window_get_register(w); uint16 staffCount = 0; FOR_ALL_PEEPS(spriteIndex, peep) { @@ -380,8 +366,8 @@ void window_staff_list_scrollgetsize() window_invalidate(w); } - height = staffCount * 10; - i = height - window_staff_list_widgets[WIDX_STAFF_LIST_LIST].bottom + window_staff_list_widgets[WIDX_STAFF_LIST_LIST].top + 21; + *height = staffCount * 10; + i = *height - window_staff_list_widgets[WIDX_STAFF_LIST_LIST].bottom + window_staff_list_widgets[WIDX_STAFF_LIST_LIST].top + 21; if (i < 0) i = 0; if (i < w->scrolls[0].v_top) { @@ -389,22 +375,18 @@ void window_staff_list_scrollgetsize() window_invalidate(w); } - width = 420; - window_scrollsize_set_registers(width, height); + *width = 420; } /** * * rct2: 0x006BDC9A */ -void window_staff_list_scrollmousedown() { +void window_staff_list_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) +{ int i, spriteIndex; - short x, y, scrollIndex; - rct_window *w; rct_peep *peep; - window_scrollmouse_get_registers(w, scrollIndex, x, y); - i = y / 10; FOR_ALL_PEEPS(spriteIndex, peep) { if (peep->type != PEEP_TYPE_STAFF) @@ -429,12 +411,9 @@ void window_staff_list_scrollmousedown() { * * rct2: 0x006BDC6B */ -void window_staff_list_scrollmouseover() { +void window_staff_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) +{ int i; - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); i = y / 10; if (i != RCT2_GLOBAL(RCT2_ADDRESS_STAFF_HIGHLIGHTED_INDEX, short)) { @@ -447,7 +426,7 @@ void window_staff_list_scrollmouseover() { * * rct2: 0x006BDC90 */ -void window_staff_list_tooltip() +void window_staff_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; } @@ -456,11 +435,8 @@ void window_staff_list_tooltip() * * rct2: 0x006BD477 */ -void window_staff_list_invalidate() +void window_staff_list_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); int pressed_widgets = w->pressed_widgets & 0xFFFFFF0F; @@ -497,13 +473,10 @@ void window_staff_list_invalidate() * * rct2: 0x006BD533 */ -void window_staff_list_paint() { +void window_staff_list_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ int i; uint8 selectedTab; - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); // Widgets window_draw_widgets(w, dpi); @@ -594,17 +567,13 @@ void window_staff_list_paint() { * * rct2: 0x006BD785 */ -void window_staff_list_scrollpaint() +void window_staff_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { int spriteIndex, y, i, staffOrderIcon_x, staffOrders, staffOrderSprite; uint32 argument_1, argument_2; uint8 selectedTab; - rct_window *w; - rct_drawpixelinfo *dpi; rct_peep *peep; - window_paint_get_registers(w, dpi); - gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ((char*)0x0141FC48)[w->colours[1] * 8]); y = 0; diff --git a/src/windows/text_input.c b/src/windows/text_input.c index c6dcfd9008..5f84c6aedf 100644 --- a/src/windows/text_input.c +++ b/src/windows/text_input.c @@ -53,44 +53,43 @@ static rct_widget window_text_input_widgets[] = { { WIDGETS_END } }; -static void window_text_input_emptysub(){} -static void window_text_input_mouseup(); -static void window_text_input_paint(); +static void window_text_input_close(rct_window *w); +static void window_text_input_mouseup(rct_window *w, int widgetIndex); +static void window_text_input_update7(rct_window *w); static void window_text_input_text(int key, rct_window* w); -static void window_text_input_update7(); -static void window_text_input_close(); -static void window_text_input_invalidate(); +static void window_text_input_invalidate(rct_window *w); +static void window_text_input_paint(rct_window *w, rct_drawpixelinfo *dpi); //0x9A3F7C -static void* window_text_input_events[] = { +static rct_window_event_list window_text_input_events = { window_text_input_close, window_text_input_mouseup, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_text_input_update7, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_text, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, - window_text_input_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_text_input_invalidate, window_text_input_paint, - window_text_input_emptysub + NULL }; int input_text_description; @@ -137,7 +136,7 @@ void window_text_input_open(rct_window* call_w, int call_widget, rct_string_id t rct_window* w = window_create_centred( WW, height, - (uint32*)window_text_input_events, + &window_text_input_events, WC_TEXTINPUT, WF_STICK_TO_FRONT ); @@ -198,7 +197,7 @@ void window_text_input_raw_open(rct_window* call_w, int call_widget, rct_string_ rct_window* w = window_create_centred( WW, height, - (uint32*)window_text_input_events, + &window_text_input_events, WC_TEXTINPUT, WF_STICK_TO_FRONT ); @@ -225,14 +224,11 @@ void window_text_input_raw_open(rct_window* call_w, int call_widget, rct_string_ /** * */ -static void window_text_input_mouseup(){ - short widgetIndex; - rct_window *w; +static void window_text_input_mouseup(rct_window *w, int widgetIndex) +{ rct_window *calling_w; - window_widget_get_registers(w, widgetIndex); calling_w = window_find_by_number(calling_class, calling_number); - switch (widgetIndex){ case WIDX_CANCEL: case WIDX_CLOSE: @@ -256,12 +252,8 @@ static void window_text_input_mouseup(){ /** * */ -static void window_text_input_paint(){ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +static void window_text_input_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ window_draw_widgets(w, dpi); int y = w->y + 25; @@ -329,9 +321,8 @@ static void window_text_input_paint(){ } } - -static void window_text_input_text(int key, rct_window* w){ - +void window_text_input_key(rct_window* w, int key) +{ int text = key; char new_char = platform_scancode_to_rct_keycode(0xFF&key); @@ -349,12 +340,8 @@ static void window_text_input_text(int key, rct_window* w){ window_invalidate(w); } -void window_text_input_update7() +void window_text_input_update7(rct_window *w) { - rct_window* w; - - window_get_register(w); - rct_window* calling_w = window_find_by_number(calling_class, calling_number); // If the calling window is closed then close the text // input window. @@ -368,18 +355,15 @@ void window_text_input_update7() window_invalidate(w); } -static void window_text_input_close() +static void window_text_input_close(rct_window *w) { // Make sure that we take it out of the text input // mode otherwise problems may occur. platform_stop_text_input(); } -static void window_text_input_invalidate(){ - rct_window* w; - - window_get_register(w); - +static void window_text_input_invalidate(rct_window *w) +{ // Work out the existing size of the window char wrapped_string[512]; strcpy(wrapped_string, text_input); diff --git a/src/windows/themes.c b/src/windows/themes.c index c6fa4ab4ba..ae3d3ea222 100644 --- a/src/windows/themes.c +++ b/src/windows/themes.c @@ -49,49 +49,47 @@ enum { WINDOW_THEMES_TAB_COUNT } WINDOW_THEMES_TAB; -static void window_themes_emptysub() { } -static void window_themes_close(); -static void window_themes_mouseup(); -static void window_themes_resize(); +static void window_themes_mouseup(rct_window *w, int widgetIndex); +static void window_themes_resize(rct_window *w); static void window_themes_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_themes_dropdown(); +static void window_themes_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_themes_update(rct_window *w); -static void window_themes_scrollgetsize(); -static void window_themes_scrollmousedown(); -static void window_themes_scrollmouseover(); -static void window_themes_textinput(); -static void window_themes_tooltip(); -static void window_themes_invalidate(); -static void window_themes_paint(); -static void window_themes_scrollpaint(); +static void window_themes_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_themes_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_themes_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_themes_textinput(rct_window *w, int widgetIndex, char *text); +static void window_themes_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_themes_invalidate(rct_window *w); +static void window_themes_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_themes_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); static void window_themes_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w); -static void* window_themes_events[] = { - window_themes_close, +static rct_window_event_list window_themes_events = { + NULL, window_themes_mouseup, window_themes_resize, window_themes_mousedown, window_themes_dropdown, - window_themes_emptysub, + NULL, window_themes_update, - window_themes_emptysub, - window_themes_emptysub, - window_themes_emptysub, - window_themes_emptysub, - window_themes_emptysub, - window_themes_emptysub, - window_themes_emptysub, - window_themes_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_themes_scrollgetsize, window_themes_scrollmousedown, - window_themes_emptysub, + NULL, window_themes_scrollmouseover, window_themes_textinput, - window_themes_emptysub, - window_themes_emptysub, + NULL, + NULL, window_themes_tooltip, - window_themes_emptysub, - window_themes_emptysub, + NULL, + NULL, window_themes_invalidate, window_themes_paint, window_themes_scrollpaint, @@ -370,7 +368,7 @@ void window_themes_open() if (window != NULL) return; - window = window_create_auto_pos(320, 107, (uint32*)window_themes_events, WC_THEMES, WF_10 | WF_RESIZABLE); + window = window_create_auto_pos(320, 107, &window_themes_events, WC_THEMES, WF_10 | WF_RESIZABLE); window->widgets = window_themes_widgets; window->enabled_widgets = (1 << WIDX_THEMES_CLOSE) | @@ -405,19 +403,8 @@ void window_themes_open() window->max_height = 107; } -void window_themes_close() { - rct_window *w; - - window_get_register(w); -} - -static void window_themes_mouseup() +static void window_themes_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_THEMES_CLOSE: window_close(w); @@ -444,12 +431,8 @@ static void window_themes_mouseup() } } -static void window_themes_resize() +static void window_themes_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - if (_selected_tab == WINDOW_THEMES_TAB_SETTINGS) { w->min_width = 320; w->min_height = 107; @@ -607,12 +590,8 @@ static void window_themes_mousedown(int widgetIndex, rct_window* w, rct_widget* } } -static void window_themes_dropdown() +static void window_themes_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - rct_window* w; - short widgetIndex, dropdownIndex; - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - switch (widgetIndex) { case WIDX_THEMES_LIST: if (dropdownIndex != -1) { @@ -647,11 +626,8 @@ void window_themes_update(rct_window *w) } -void window_themes_scrollgetsize() { - rct_window *w; - - window_get_register(w); - +void window_themes_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) +{ if (_selected_tab == WINDOW_THEMES_TAB_SETTINGS || _selected_tab == WINDOW_THEMES_TAB_FEATURES) return; @@ -664,25 +640,12 @@ void window_themes_scrollgetsize() { window_invalidate(w); } - #ifdef _MSC_VER - __asm mov ecx, 420 - #else - __asm__("mov ecx, 420 "); - #endif - - #ifdef _MSC_VER - __asm mov edx, scrollHeight - #else - __asm__("mov edx, %[scrollHeight] " : [scrollHeight] "+m" (scrollHeight)); - #endif + *width = 420; + *height = scrollHeight; } -void window_themes_scrollmousedown() { - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); - +void window_themes_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) +{ if (y / _row_height < get_colour_scheme_tab_count()) { int y2 = y % _row_height; _color_index_1 = y / _row_height; @@ -720,26 +683,15 @@ void window_themes_scrollmousedown() { } } -void window_themes_scrollmouseover() { - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); - +void window_themes_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) +{ //if (_selected_tab == WINDOW_THEMES_TAB_SETTINGS) // return; } -static void window_themes_textinput() +static void window_themes_textinput(rct_window *w, int widgetIndex, char *text) { - rct_window *w; - short widgetIndex; - uint8 result; - char *text; - - window_textinput_get_registers(w, widgetIndex, result, text); - - if (!result || text[0] == 0) + if (text == NULL || text[0] == 0) return; switch (widgetIndex) { @@ -772,16 +724,13 @@ static void window_themes_textinput() } } -void window_themes_tooltip() +void window_themes_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; } -void window_themes_invalidate() +void window_themes_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); int pressed_widgets = w->pressed_widgets & 0xFFFFE00F; @@ -854,12 +803,8 @@ void window_themes_invalidate() } } -void window_themes_paint() { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +void window_themes_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ // Widgets window_draw_widgets(w, dpi); window_themes_draw_tab_images(dpi, w); @@ -890,13 +835,9 @@ void window_themes_paint() { * * rct2: 0x006BD785 */ -void window_themes_scrollpaint() +void window_themes_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { int y; - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); if (_selected_tab == WINDOW_THEMES_TAB_SETTINGS || _selected_tab == WINDOW_THEMES_TAB_FEATURES) return; diff --git a/src/windows/tile_inspector.c b/src/windows/tile_inspector.c index 539b3a2f9b..c612c9ad88 100644 --- a/src/windows/tile_inspector.c +++ b/src/windows/tile_inspector.c @@ -53,45 +53,44 @@ static int window_tile_inspector_tile_x; static int window_tile_inspector_tile_y; static int window_tile_inspector_item_count; -static void window_tile_inspector_emptysub() { } -static void window_tile_inspector_close(); -static void window_tile_inspector_tool_update(); -static void window_tile_inspector_tool_down(); -static void window_tile_inspector_tool_abort(); -static void window_tile_inspector_scrollgetsize(); -static void window_tile_inspector_scrollmouseover(); -static void window_tile_inspector_mouseup(); -static void window_tile_inspector_resize(); -static void window_tile_inspector_invalidate(); -static void window_tile_inspector_paint(); -static void window_tile_inspector_scrollpaint(); +static void window_tile_inspector_close(rct_window *w); +static void window_tile_inspector_mouseup(rct_window *w, int widgetIndex); +static void window_tile_inspector_resize(rct_window *w); +static void window_tile_inspector_tool_update(rct_window* w, int widgetIndex, int x, int y); +static void window_tile_inspector_tool_down(rct_window* w, int widgetIndex, int x, int y); +static void window_tile_inspector_tool_abort(rct_window *w, int widgetIndex); +static void window_tile_inspector_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_tile_inspector_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_tile_inspector_invalidate(rct_window *w); +static void window_tile_inspector_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_tile_inspector_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void* window_tile_inspector_events[] = { +static rct_window_event_list window_tile_inspector_events = { window_tile_inspector_close, window_tile_inspector_mouseup, window_tile_inspector_resize, - window_tile_inspector_emptysub, - window_tile_inspector_emptysub, - window_tile_inspector_emptysub, - window_tile_inspector_emptysub, - window_tile_inspector_emptysub, - window_tile_inspector_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_tile_inspector_tool_update, window_tile_inspector_tool_down, - window_tile_inspector_emptysub, - window_tile_inspector_emptysub, + NULL, + NULL, window_tile_inspector_tool_abort, - window_tile_inspector_emptysub, + NULL, window_tile_inspector_scrollgetsize, - window_tile_inspector_emptysub, - window_tile_inspector_emptysub, + NULL, + NULL, window_tile_inspector_scrollmouseover, - window_tile_inspector_emptysub, - window_tile_inspector_emptysub, - window_tile_inspector_emptysub, - window_tile_inspector_emptysub, - window_tile_inspector_emptysub, - window_tile_inspector_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_tile_inspector_invalidate, window_tile_inspector_paint, window_tile_inspector_scrollpaint @@ -111,7 +110,7 @@ void window_tile_inspector_open() 29, WW, WH, - (uint32*)window_tile_inspector_events, + &window_tile_inspector_events, WC_TILE_INSPECTOR, WF_RESIZABLE ); @@ -133,18 +132,13 @@ void window_tile_inspector_open() tool_set(window, WIDX_BACKGROUND, 12); } -static void window_tile_inspector_close() +static void window_tile_inspector_close(rct_window *w) { tool_cancel(); } -static void window_tile_inspector_mouseup() +static void window_tile_inspector_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -152,12 +146,8 @@ static void window_tile_inspector_mouseup() } } -static void window_tile_inspector_resize() +static void window_tile_inspector_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - w->min_width = WW; w->min_height = MIN_WH; if (w->width < w->min_width) { @@ -170,17 +160,14 @@ static void window_tile_inspector_resize() } } -static void window_tile_inspector_tool_update() +static void window_tile_inspector_tool_update(rct_window* w, int widgetIndex, int x, int y) { - short widgetIndex; - rct_window *w; - short x, y; int direction; + short mapX, mapY; - window_tool_get_registers(w, widgetIndex, x, y); map_invalidate_selection_rect(); RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 0); - screen_pos_to_map_pos(&x, &y, &direction); + screen_pos_to_map_pos(&mapX, &mapY, &direction); if (x == (short)0x8000) { return; @@ -197,15 +184,12 @@ static void window_tile_inspector_tool_update() } -static void window_tile_inspector_tool_down() +static void window_tile_inspector_tool_down(rct_window* w, int widgetIndex, int x, int y) { - short widgetIndex; - rct_window* w; - short x, y; int direction; + short mapX, mapY; - window_tool_get_registers(w, widgetIndex, x, y); - screen_pos_to_map_pos(&x, &y, &direction); + screen_pos_to_map_pos(&mapX, &mapY, &direction); if (x == (short)0x8000) { return; @@ -226,43 +210,24 @@ static void window_tile_inspector_tool_down() window_invalidate(w); } -static void window_tile_inspector_tool_abort() +static void window_tile_inspector_tool_abort(rct_window *w, int widgetIndex) { - rct_window *w; - short widgetIndex, x, y; - window_tool_get_registers(w, widgetIndex, x, y); window_close(w); } -static void window_tile_inspector_scrollgetsize() +static void window_tile_inspector_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - - rct_window *w; - int width, height; - window_get_register(w); - - height = window_tile_inspector_item_count * 11; - width = WW - 30; - - window_scrollsize_set_registers(width, height); - + *width = WW - 30; + *height = window_tile_inspector_item_count * 11; } -static void window_tile_inspector_scrollmouseover() +static void window_tile_inspector_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) { - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); window_invalidate(w); } -static void window_tile_inspector_invalidate() +static void window_tile_inspector_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); - window_tile_inspector_widgets[WIDX_BACKGROUND].right = w->width - 1; window_tile_inspector_widgets[WIDX_BACKGROUND].bottom = w->height - 1; window_tile_inspector_widgets[WIDX_CLOSE].left = w->width - 13; @@ -272,15 +237,11 @@ static void window_tile_inspector_invalidate() window_tile_inspector_widgets[WIDX_SCROLL].bottom = w->height - 30; } -static void window_tile_inspector_paint() +static void window_tile_inspector_paint(rct_window *w, rct_drawpixelinfo *dpi) { int x, y; - rct_window *w; - rct_drawpixelinfo *dpi; char buffer[256]; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); x = w->x + 20; @@ -313,15 +274,11 @@ static void window_tile_inspector_paint() } -static void window_tile_inspector_scrollpaint() +static void window_tile_inspector_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { int x = 15, y = 11 * (window_tile_inspector_item_count - 1), i = 0; - rct_window *w; - rct_drawpixelinfo *dpi; char buffer[256]; - window_paint_get_registers(w, dpi); - if (window_tile_inspector_tile_x == -1) return; diff --git a/src/windows/title_command_editor.c b/src/windows/title_command_editor.c index 3fe009bbe8..d1b282a291 100644 --- a/src/windows/title_command_editor.c +++ b/src/windows/title_command_editor.c @@ -102,50 +102,48 @@ static rct_widget window_title_command_editor_widgets[] = { { WIDGETS_END }, }; -static void window_title_command_editor_emptysub() { } -static void window_title_command_editor_close(); -static void window_title_command_editor_mouseup(); +static void window_title_command_editor_mouseup(rct_window *w, int widgetIndex); static void window_title_command_editor_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_title_command_editor_dropdown(); -static void window_title_command_editor_update(); -static void window_title_command_editor_invalidate(); -static void window_title_command_editor_paint(); -static void window_title_command_editor_textinput(); +static void window_title_command_editor_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); +static void window_title_command_editor_update(rct_window *w); +static void window_title_command_editor_invalidate(rct_window *w); +static void window_title_command_editor_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_title_command_editor_textinput(rct_window *w, int widgetIndex, char *text); static void window_title_command_editor_inputsize(rct_window *w); static int get_command_info_index(int index); static TITLE_COMMAND_ORDER get_command_info(int index); static rct_xy16 get_location(); static uint8 get_zoom(); -static void* window_title_command_editor_events[] = { - window_title_command_editor_close, +static rct_window_event_list window_title_command_editor_events = { + NULL, window_title_command_editor_mouseup, - window_title_command_editor_emptysub, + NULL, window_title_command_editor_mousedown, window_title_command_editor_dropdown, - window_title_command_editor_emptysub, + NULL, window_title_command_editor_update, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_title_command_editor_textinput, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, - window_title_command_editor_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_title_command_editor_invalidate, window_title_command_editor_paint, - window_title_command_editor_emptysub + NULL }; static int get_command_info_index(int index) @@ -206,7 +204,7 @@ void window_title_command_editor_open(int index, bool insert) window = window_create_centred( WW, WH, - (uint32*)window_title_command_editor_events, + &window_title_command_editor_events, WC_TITLE_COMMAND_EDITOR, WF_STICK_TO_FRONT ); @@ -248,22 +246,12 @@ void window_title_command_editor_open(int index, bool insert) } } -static void window_title_command_editor_close() +static void window_title_command_editor_mouseup(rct_window *w, int widgetIndex) { - rct_window *w; - - window_get_register(w); -} - -static void window_title_command_editor_mouseup() -{ - rct_window *w, *title_editor_w; - short widgetIndex; + rct_window *title_editor_w; rct_xy16 mapCoord; uint8 zoom; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: case WIDX_CANCEL: @@ -378,13 +366,9 @@ static void window_title_command_editor_mousedown(int widgetIndex, rct_window* w } } -static void window_title_command_editor_dropdown() +static void window_title_command_editor_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - rct_window* w; - short widgetIndex, dropdownIndex; rct_xy16 mapCoord; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); if (dropdownIndex == -1) return; @@ -441,22 +425,17 @@ static void window_title_command_editor_dropdown() } } -static void window_title_command_editor_textinput() +static void window_title_command_editor_textinput(rct_window *w, int widgetIndex, char *text) { - uint8 result; - short widgetIndex; - rct_window *w; - char *text, * end; + char *end; int value; - window_textinput_get_registers(w, widgetIndex, result, text); - value = strtol(widgetIndex != WIDX_TEXTBOX_Y ? textbox1Buffer : textbox2Buffer, &end, 10); if (value < 0) value = 0; if (value > 255) value = 255; switch (widgetIndex) { case WIDX_TEXTBOX_FULL: - if (!result) { + if (text == NULL) { if (*end == '\0') { if (command.command == TITLE_SCRIPT_ROTATE || command.command == TITLE_SCRIPT_ZOOM) { if (value > 3) value = 3; @@ -474,7 +453,7 @@ static void window_title_command_editor_textinput() } break; case WIDX_TEXTBOX_X: - if (!result) { + if (text == NULL) { if (*end == '\0') command.x = (uint8)value; _itoa(command.x, textbox1Buffer, 10); @@ -485,7 +464,7 @@ static void window_title_command_editor_textinput() } break; case WIDX_TEXTBOX_Y: - if (!result) { + if (text == NULL) { if (*end == '\0') command.y = (uint8)value; _itoa(command.y, textbox2Buffer, 10); @@ -507,11 +486,8 @@ static void window_title_command_editor_update(rct_window *w) } } -static void window_title_command_editor_invalidate() +static void window_title_command_editor_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update_by_class(w, WC_TITLE_EDITOR); window_title_command_editor_widgets[WIDX_TEXTBOX_FULL].type = WWT_EMPTY; @@ -547,13 +523,8 @@ static void window_title_command_editor_invalidate() w->disabled_widgets &= ~(1 << WIDX_GET); } -static void window_title_command_editor_paint() +static void window_title_command_editor_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); gfx_draw_string_left(dpi, 5432, NULL, w->colours[1], w->x + WS, w->y + BY - 14); diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index 2b13bcc63a..1b3c22c50d 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -46,49 +46,48 @@ enum { WINDOW_TITLE_EDITOR_TAB_COUNT } WINDOW_TITLE_EDITOR_TAB; -static void window_title_editor_emptysub() { } -static void window_title_editor_close(); -static void window_title_editor_mouseup(); -static void window_title_editor_resize(); +static void window_title_editor_close(rct_window *w); +static void window_title_editor_mouseup(rct_window *w, int widgetIndex); +static void window_title_editor_resize(rct_window *w); static void window_title_editor_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_title_editor_dropdown(); +static void window_title_editor_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_title_editor_update(rct_window *w); -static void window_title_editor_scrollgetsize(); -static void window_title_editor_scrollmousedown(); -static void window_title_editor_scrollmouseover(); -static void window_title_editor_textinput(); -static void window_title_editor_tooltip(); -static void window_title_editor_invalidate(); -static void window_title_editor_paint(); -static void window_title_editor_scrollpaint(); +static void window_title_editor_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_title_editor_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_title_editor_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_title_editor_textinput(rct_window *w, int widgetIndex, char *text); +static void window_title_editor_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_title_editor_invalidate(rct_window *w); +static void window_title_editor_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_title_editor_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); static void window_title_editor_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w); -static void* window_title_editor_events[] = { +static rct_window_event_list window_title_editor_events = { window_title_editor_close, window_title_editor_mouseup, window_title_editor_resize, window_title_editor_mousedown, window_title_editor_dropdown, - window_title_editor_emptysub, + NULL, window_title_editor_update, - window_title_editor_emptysub, - window_title_editor_emptysub, - window_title_editor_emptysub, - window_title_editor_emptysub, - window_title_editor_emptysub, - window_title_editor_emptysub, - window_title_editor_emptysub, - window_title_editor_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_title_editor_scrollgetsize, window_title_editor_scrollmousedown, - window_title_editor_emptysub, + NULL, window_title_editor_scrollmouseover, window_title_editor_textinput, - window_title_editor_emptysub, - window_title_editor_emptysub, + NULL, + NULL, window_title_editor_tooltip, - window_title_editor_emptysub, - window_title_editor_emptysub, + NULL, + NULL, window_title_editor_invalidate, window_title_editor_paint, window_title_editor_scrollpaint, @@ -236,7 +235,7 @@ void window_title_editor_open(int tab) if (window != NULL) return; - window = window_create_auto_pos(WW, WH2, (uint32*)window_title_editor_events, WC_TITLE_EDITOR, WF_10 | WF_RESIZABLE); + window = window_create_auto_pos(WW, WH2, &window_title_editor_events, WC_TITLE_EDITOR, WF_10 | WF_RESIZABLE); window->widgets = window_title_editor_widgets; window->enabled_widgets = (1 << WIDX_TITLE_EDITOR_CLOSE) | @@ -285,10 +284,9 @@ void window_title_editor_open(int tab) } -void window_title_editor_close() { - rct_window *w, *command_editor_w, *load_save_w; - - window_get_register(w); +void window_title_editor_close(rct_window *w) +{ + rct_window *command_editor_w, *load_save_w; // Close the related windows command_editor_w = window_find_by_class(WC_TITLE_COMMAND_EDITOR); @@ -299,14 +297,11 @@ void window_title_editor_close() { window_close(load_save_w); } -static void window_title_editor_mouseup() +static void window_title_editor_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; char path[MAX_PATH]; char separator = platform_get_path_separator(); int defaultPreset, playing, inTitle, i, commandEditorOpen; - window_widget_get_registers(w, widgetIndex); defaultPreset = (gCurrentTitleSequence < TITLE_SEQUENCE_DEFAULT_PRESETS); playing = (gCurrentTitleSequence == gCurrentPreviewTitleSequence) && ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO); @@ -499,12 +494,8 @@ static void window_title_editor_mouseup() window_error_open(5398, 5399); } -static void window_title_editor_resize() -{ - rct_window *w; - - window_get_register(w); - +static void window_title_editor_resize(rct_window *w) +{ if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_PRESETS) { w->min_width = WW; w->min_height = WH2; @@ -602,13 +593,8 @@ static void window_title_editor_mousedown(int widgetIndex, rct_window* w, rct_wi } } -static void window_title_editor_dropdown() -{ - rct_window* w; - short widgetIndex, dropdownIndex; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - +static void window_title_editor_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) +{ if (dropdownIndex == -1) return; @@ -634,13 +620,10 @@ void window_title_editor_update(rct_window *w) widget_invalidate(w, WIDX_TITLE_EDITOR_PRESETS_TAB + w->selected_tab); } -void window_title_editor_scrollgetsize() +void window_title_editor_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - int i, width, height; + int i; uint16 lineCount; - rct_window *w; - - window_get_register(w); lineCount = 1; if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_SAVES) @@ -648,8 +631,8 @@ void window_title_editor_scrollgetsize() else if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_SCRIPT) lineCount = gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands; - height = lineCount * ROW_HEIGHT; - i = height - window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].bottom + window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].top + 21; + *height = lineCount * ROW_HEIGHT; + i = *height - window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].bottom + window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].top + 21; if (i < 0) i = 0; if (i < w->scrolls[0].v_top) { @@ -657,16 +640,12 @@ void window_title_editor_scrollgetsize() window_invalidate(w); } - width = SCROLL_WIDTH; - window_scrollsize_set_registers(width, height); + *width = SCROLL_WIDTH; } -void window_title_editor_scrollmousedown() { +void window_title_editor_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) +{ int index; - short x, y, scrollIndex; - rct_window *w; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); index = y / ROW_HEIGHT; w->selected_list_item = -1; @@ -686,13 +665,10 @@ void window_title_editor_scrollmousedown() { } } -void window_title_editor_scrollmouseover() { +void window_title_editor_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) +{ int index; - short x, y, scrollIndex; - rct_window *w; sint16 oldHighlightedIndex; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); index = y / ROW_HEIGHT; switch (w->selected_tab) { @@ -713,16 +689,9 @@ void window_title_editor_scrollmouseover() { //} } -static void window_title_editor_textinput() +static void window_title_editor_textinput(rct_window *w, int widgetIndex, char *text) { - rct_window *w; - short widgetIndex; - uint8 result; - char *text; - - window_textinput_get_registers(w, widgetIndex, result, text); - - if (!result || text[0] == 0) + if (text == NULL || text[0] == 0) return; switch (widgetIndex) { @@ -769,16 +738,13 @@ static void window_title_editor_textinput() } } -void window_title_editor_tooltip() +void window_title_editor_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; } -void window_title_editor_invalidate() +void window_title_editor_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); int pressed_widgets = w->pressed_widgets & 0xFFFFFF8F; @@ -883,12 +849,8 @@ void window_title_editor_invalidate() w->disabled_widgets &= ~((1 << WIDX_TITLE_EDITOR_REPLAY) | (1 << WIDX_TITLE_EDITOR_STOP) | (1 << WIDX_TITLE_EDITOR_SKIP) | (1 << WIDX_TITLE_EDITOR_SKIP_TO)); } -void window_title_editor_paint() { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - +void window_title_editor_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ // Widgets window_draw_widgets(w, dpi); window_title_editor_draw_tab_images(dpi, w); @@ -919,16 +881,12 @@ void window_title_editor_paint() { } } -void window_title_editor_scrollpaint() +void window_title_editor_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - rct_window *w; - rct_drawpixelinfo *dpi; char buffer[256]; bool selected, hover, error, inTitle; int y, x, x2, width; - window_paint_get_registers(w, dpi); - gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ((char*)0x0141FC48)[w->colours[1] * 8]); title_sequence *title = &gConfigTitleSequences.presets[gCurrentTitleSequence]; diff --git a/src/windows/title_exit.c b/src/windows/title_exit.c index 18ebb3d74f..b78c788ca5 100644 --- a/src/windows/title_exit.c +++ b/src/windows/title_exit.c @@ -32,40 +32,39 @@ static rct_widget window_title_exit_widgets[] = { { WIDGETS_END }, }; -static void window_title_exit_emptysub() {} -static void window_title_exit_paint(); -static void window_title_exit_mouseup(); -static void window_title_exit_invalidate(); +static void window_title_exit_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_title_exit_mouseup(rct_window *w, int widgetIndex); +static void window_title_exit_invalidate(rct_window *w); -static void* window_title_exit_events[] = { - window_title_exit_emptysub, +static rct_window_event_list window_title_exit_events = { + NULL, window_title_exit_mouseup, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, - window_title_exit_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_title_exit_invalidate, window_title_exit_paint, - window_title_exit_emptysub + NULL }; /** @@ -79,7 +78,7 @@ void window_title_exit_open() window = window_create( RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 40, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 64, 40, 64, - (uint32*)window_title_exit_events, + &window_title_exit_events, WC_TITLE_EXIT, WF_STICK_TO_BACK | WF_TRANSPARENT ); @@ -92,13 +91,8 @@ void window_title_exit_open() * * rct2: 0x0066B83C */ -static void window_title_exit_mouseup() +static void window_title_exit_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (RCT2_GLOBAL(RCT2_ADDRESS_RUN_INTRO_TICK_PART, uint8) != 0) return; @@ -111,19 +105,12 @@ static void window_title_exit_mouseup() * * rct2: 0x0066B836 */ -static void window_title_exit_paint() +static void window_title_exit_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); } -static void window_title_exit_invalidate() +static void window_title_exit_invalidate(rct_window *w) { - rct_window *w; - window_get_register(w); colour_scheme_update(w); } diff --git a/src/windows/title_logo.c b/src/windows/title_logo.c index dbb473c4bf..001be0e02d 100644 --- a/src/windows/title_logo.c +++ b/src/windows/title_logo.c @@ -29,38 +29,37 @@ static rct_widget window_title_logo_widgets[] = { { WIDGETS_END }, }; -static void window_title_logo_emptysub() {} -static void window_title_logo_paint(); +static void window_title_logo_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_title_logo_events[] = { - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, - window_title_logo_emptysub, +static rct_window_event_list window_title_logo_events = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_title_logo_paint, - window_title_logo_emptysub + NULL }; static void window_title_logo_draw_expansion_packs(rct_drawpixelinfo *dpi); @@ -86,7 +85,7 @@ void window_title_logo_open() 0, 200, 106 + (10 * packs), - (uint32*)window_title_logo_events, + &window_title_logo_events, WC_TITLE_LOGO, WF_STICK_TO_BACK | WF_TRANSPARENT ); @@ -101,13 +100,8 @@ void window_title_logo_open() * * rct2: 0x0066B872 */ -static void window_title_logo_paint() +static void window_title_logo_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - // gfx_draw_sprite(dpi, SPR_MENU_LOGO, w->x, w->y, 0); int x = 2, y = 2; gfx_draw_sprite(dpi, SPR_G2_LOGO, w->x + x, w->y + y, 0); diff --git a/src/windows/title_menu.c b/src/windows/title_menu.c index 5ce6858c31..0b2c289138 100644 --- a/src/windows/title_menu.c +++ b/src/windows/title_menu.c @@ -45,43 +45,42 @@ static rct_widget window_title_menu_widgets[] = { { WIDGETS_END }, }; -static void window_title_menu_emptysub() { } -static void window_title_menu_mouseup(); +static void window_title_menu_mouseup(rct_window *w, int widgetIndex); static void window_title_menu_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_title_menu_dropdown(); -static void window_title_menu_unknown17(); -static void window_title_menu_paint(); -static void window_title_menu_invalidate(); +static void window_title_menu_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); +static void window_title_menu_cursor(rct_window *w, int widgetIndex, int x, int y, int *cursorId); +static void window_title_menu_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_title_menu_invalidate(rct_window *w); -static void* window_title_menu_events[] = { - window_title_menu_emptysub, +static rct_window_event_list window_title_menu_events = { + NULL, window_title_menu_mouseup, - window_title_menu_emptysub, + NULL, window_title_menu_mousedown, window_title_menu_dropdown, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_emptysub, - window_title_menu_unknown17, - window_title_menu_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_title_menu_cursor, + NULL, window_title_menu_invalidate, window_title_menu_paint, - window_title_menu_emptysub + NULL }; /** @@ -95,7 +94,7 @@ void window_title_menu_open() window = window_create( (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 328) / 2, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 142, 328, 82, - (uint32*)window_title_menu_events, + &window_title_menu_events, WC_TITLE_MENU, WF_STICK_TO_BACK | WF_TRANSPARENT ); @@ -104,17 +103,15 @@ void window_title_menu_open() window_init_scroll_widgets(window); } -static void window_title_menu_mouseup() +static void window_title_menu_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window* w; - - window_widget_get_registers(w, widgetIndex); - - if (widgetIndex == WIDX_START_NEW_GAME) { + switch (widgetIndex) { + case WIDX_START_NEW_GAME: window_scenarioselect_open(); - } else if (widgetIndex == WIDX_CONTINUE_SAVED_GAME) { + break; + case WIDX_CONTINUE_SAVED_GAME: game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 0, 0); + break; } } @@ -148,13 +145,8 @@ static void window_title_menu_mousedown(int widgetIndex, rct_window*w, rct_widge } } -static void window_title_menu_dropdown() +static void window_title_menu_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - short widgetIndex, dropdownIndex; - rct_window *w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - if (widgetIndex == WIDX_SHOW_TUTORIAL) { tutorial_start(dropdownIndex); } else if (widgetIndex == WIDX_GAME_TOOLS) { @@ -175,24 +167,17 @@ static void window_title_menu_dropdown() } } -static void window_title_menu_unknown17() +static void window_title_menu_cursor(rct_window *w, int widgetIndex, int x, int y, int *cursorId) { RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TIMEOUT, sint16) = 2000; } -static void window_title_menu_paint() +static void window_title_menu_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); } -static void window_title_menu_invalidate() +static void window_title_menu_invalidate(rct_window *w) { - rct_window *w; - window_get_register(w); colour_scheme_update(w); } diff --git a/src/windows/title_options.c b/src/windows/title_options.c index ee4e22be77..40be52d339 100644 --- a/src/windows/title_options.c +++ b/src/windows/title_options.c @@ -31,40 +31,39 @@ static rct_widget window_title_options_widgets[] = { { WIDGETS_END }, }; -static void window_title_options_emptysub() {} -static void window_title_options_paint(); -static void window_title_options_mouseup(); -static void window_title_options_invalidate(); +static void window_title_options_mouseup(rct_window *w, int widgetIndex); +static void window_title_options_invalidate(rct_window *w); +static void window_title_options_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_title_options_events[] = { - window_title_options_emptysub, +static rct_window_event_list window_title_options_events = { + NULL, window_title_options_mouseup, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, - window_title_options_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_title_options_invalidate, window_title_options_paint, - window_title_options_emptysub + NULL }; /** @@ -77,7 +76,7 @@ void window_title_options_open() window = window_create( RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 80, 0, 80, 12, - (uint32*)window_title_options_events, + &window_title_options_events, WC_TITLE_OPTIONS, WF_STICK_TO_BACK | WF_TRANSPARENT ); @@ -86,13 +85,8 @@ void window_title_options_open() window_init_scroll_widgets(window); } -static void window_title_options_mouseup() +static void window_title_options_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (RCT2_GLOBAL(RCT2_ADDRESS_RUN_INTRO_TICK_PART, uint8) != 0) return; @@ -100,19 +94,12 @@ static void window_title_options_mouseup() window_options_open(); } -static void window_title_options_paint() +static void window_title_options_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); } -static void window_title_options_invalidate() +static void window_title_options_invalidate(rct_window *w) { - rct_window *w; - window_get_register(w); colour_scheme_update(w); } diff --git a/src/windows/title_scenarioselect.c b/src/windows/title_scenarioselect.c index 8fdf3fc80c..cb2997252f 100644 --- a/src/windows/title_scenarioselect.c +++ b/src/windows/title_scenarioselect.c @@ -58,42 +58,41 @@ static rct_widget window_scenarioselect_widgets[] = { static void window_scenarioselect_init_tabs(); -static void window_scenarioselect_emptysub() { } -static void window_scenarioselect_mouseup(); +static void window_scenarioselect_mouseup(rct_window *w, int widgetIndex); static void window_scenarioselect_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_scenarioselect_scrollgetsize(); -static void window_scenarioselect_scrollmousedown(); -static void window_scenarioselect_scrollmouseover(); -static void window_scenarioselect_invalidate(); -static void window_scenarioselect_paint(); -static void window_scenarioselect_scrollpaint(); +static void window_scenarioselect_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_scenarioselect_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_scenarioselect_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_scenarioselect_invalidate(rct_window *w); +static void window_scenarioselect_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_scenarioselect_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void* window_scenarioselect_events[] = { - window_scenarioselect_emptysub, +static rct_window_event_list window_scenarioselect_events = { + NULL, window_scenarioselect_mouseup, - window_scenarioselect_emptysub, + NULL, window_scenarioselect_mousedown, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_scenarioselect_scrollgetsize, window_scenarioselect_scrollmousedown, - window_scenarioselect_emptysub, + NULL, window_scenarioselect_scrollmouseover, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, - window_scenarioselect_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_scenarioselect_invalidate, window_scenarioselect_paint, window_scenarioselect_scrollpaint @@ -116,7 +115,7 @@ void window_scenarioselect_open() window = window_create_centred( 610, 334, - (uint32*)window_scenarioselect_events, + &window_scenarioselect_events, WC_SCENARIO_SELECT, WF_10 ); @@ -164,13 +163,8 @@ static void window_scenarioselect_init_tabs() } } -static void window_scenarioselect_mouseup() +static void window_scenarioselect_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w; - - window_widget_get_registers(w, widgetIndex); - if (widgetIndex == WIDX_CLOSE) window_close(w); } @@ -188,37 +182,27 @@ static void window_scenarioselect_mousedown(int widgetIndex, rct_window*w, rct_w } } -static void window_scenarioselect_scrollgetsize() +static void window_scenarioselect_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - int i, width, height; - rct_window *w; + int i; rct_scenario_basic *scenario; - window_get_register(w); - - width = 0; - height = 0; + *height = 0; for (i = 0; i < gScenarioListCount; i++) { scenario = &gScenarioList[i]; if (scenario->category != w->selected_tab) continue; if (scenario->flags & SCENARIO_FLAGS_VISIBLE) - height += 24; + *height += 24; } - - window_scrollsize_set_registers(width, height); } /* rct2: 0x6780FE */ -static void window_scenarioselect_scrollmousedown() +static void window_scenarioselect_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) { int i; - short x, y, scrollIndex; - rct_window *w; rct_scenario_basic *scenario; - window_scrollmouse_get_registers(w, scrollIndex, x, y); - for (i = 0; i < gScenarioListCount; i++) { scenario = &gScenarioList[i]; if (scenario->category != w->selected_tab) @@ -237,15 +221,11 @@ static void window_scenarioselect_scrollmousedown() } /* rct2: 0x678162 */ -static void window_scenarioselect_scrollmouseover() +static void window_scenarioselect_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) { int i; - short x, y, scrollIndex; - rct_window *w; rct_scenario_basic *scenario, *selected; - window_scrollmouse_get_registers(w, scrollIndex, x, y); - selected = NULL; for (i = 0; i < gScenarioListCount; i++) { scenario = &gScenarioList[i]; @@ -267,27 +247,20 @@ static void window_scenarioselect_scrollmouseover() } } -static void window_scenarioselect_invalidate() +static void window_scenarioselect_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); w->pressed_widgets &= ~(0x10 | 0x20 | 0x40 | 0x80 | 0x100); w->pressed_widgets |= 1LL << (w->selected_tab + 4); } -static void window_scenarioselect_paint() +static void window_scenarioselect_paint(rct_window *w, rct_drawpixelinfo *dpi) { int i, x, y, format; - rct_window *w; - rct_drawpixelinfo *dpi; rct_widget *widget; rct_scenario_basic *scenario; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); format = (theme_get_preset()->features.rct1_scenario_font) ? 5138 : 1193; @@ -342,15 +315,11 @@ static void window_scenarioselect_paint() } } -static void window_scenarioselect_scrollpaint() +static void window_scenarioselect_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { int i, y, colour, highlighted, highlighted_format, unhighlighted_format; - rct_window *w; - rct_drawpixelinfo *dpi; rct_scenario_basic *scenario; - window_paint_get_registers(w, dpi); - colour = ((char*)0x0141FC48)[w->colours[1] * 8]; colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; gfx_clear(dpi, colour); diff --git a/src/windows/tooltip.c b/src/windows/tooltip.c index 8a6e8a11e2..6f836cc1a0 100644 --- a/src/windows/tooltip.c +++ b/src/windows/tooltip.c @@ -33,40 +33,39 @@ static rct_widget window_tooltip_widgets[] = { { WIDGETS_END }, }; -static void window_tooltip_emptysub() { } -static void window_tooltip_onclose(); +static void window_tooltip_onclose(rct_window *w); static void window_tooltip_update(rct_window *w); -static void window_tooltip_paint(); +static void window_tooltip_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_tooltip_events[] = { +static rct_window_event_list window_tooltip_events = { window_tooltip_onclose, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_tooltip_update, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, - window_tooltip_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_tooltip_paint, - window_tooltip_emptysub + NULL }; void window_tooltip_reset(int x, int y) @@ -151,7 +150,7 @@ void window_tooltip_open(rct_window *widgetWindow, int widgetIndex, int x, int y y, width, height, - (uint32*)window_tooltip_events, + &window_tooltip_events, WC_TOOLTIP, WF_TRANSPARENT | WF_STICK_TO_FRONT ); @@ -177,7 +176,7 @@ void window_tooltip_close() * * rct2: 0x006EA578 */ -static void window_tooltip_onclose() +static void window_tooltip_onclose(rct_window *w) { RCT2_GLOBAL(0x009BC3B0, uint8) = 0; } @@ -196,13 +195,8 @@ static void window_tooltip_update(rct_window *w) * * rct2: 0x006EA41D */ -static void window_tooltip_paint() +static void window_tooltip_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - int left = w->x; int top = w->y; int right = w->x + w->width - 1; diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index a880b07206..a4a5dd0a04 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -171,47 +171,46 @@ static rct_widget window_top_toolbar_widgets[] = { { WIDGETS_END }, }; -static void window_top_toolbar_emptysub() { } -static void window_top_toolbar_mouseup(); +static void window_top_toolbar_mouseup(rct_window *w, int widgetIndex); static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_top_toolbar_dropdown(); -static void window_top_toolbar_tool_update(); -static void window_top_toolbar_tool_down(); -static void window_top_toolbar_tool_drag(); -static void window_top_toolbar_tool_up(); -static void window_top_toolbar_tool_abort(); -static void window_top_toolbar_invalidate(); -static void window_top_toolbar_paint(); +static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); +static void window_top_toolbar_tool_update(rct_window* w, int widgetIndex, int x, int y); +static void window_top_toolbar_tool_down(rct_window* w, int widgetIndex, int x, int y); +static void window_top_toolbar_tool_drag(rct_window* w, int widgetIndex, int x, int y); +static void window_top_toolbar_tool_up(rct_window* w, int widgetIndex, int x, int y); +static void window_top_toolbar_tool_abort(rct_window *w, int widgetIndex); +static void window_top_toolbar_invalidate(rct_window *w); +static void window_top_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_top_toolbar_events[] = { - window_top_toolbar_emptysub, +static rct_window_event_list window_top_toolbar_events = { + NULL, window_top_toolbar_mouseup, - window_top_toolbar_emptysub, + NULL, window_top_toolbar_mousedown, window_top_toolbar_dropdown, - window_top_toolbar_emptysub, - window_top_toolbar_emptysub, - window_top_toolbar_emptysub, - window_top_toolbar_emptysub, // check if editor versions are significantly different... + NULL, + NULL, + NULL, + NULL, // check if editor versions are significantly different... window_top_toolbar_tool_update, // editor: 0x0066fB0E window_top_toolbar_tool_down, // editor: 0x0066fB5C window_top_toolbar_tool_drag, // editor: 0x0066fB37 window_top_toolbar_tool_up, // editor: 0x0066fC44 (Exactly the same) window_top_toolbar_tool_abort, // editor: 0x0066fA74 (Exactly the same) - window_top_toolbar_emptysub, - window_top_toolbar_emptysub, - window_top_toolbar_emptysub, - window_top_toolbar_emptysub, - window_top_toolbar_emptysub, - window_top_toolbar_emptysub, - window_top_toolbar_emptysub, - window_top_toolbar_emptysub, - window_top_toolbar_emptysub, - window_top_toolbar_emptysub, - window_top_toolbar_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_top_toolbar_invalidate, window_top_toolbar_paint, - window_top_toolbar_emptysub + NULL }; void top_toolbar_init_view_menu(rct_window *window, rct_widget *widget); @@ -244,7 +243,7 @@ void window_top_toolbar_open() window = window_create( 0, 0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16), 28, - (uint32*)window_top_toolbar_events, + &window_top_toolbar_events, WC_TOP_TOOLBAR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5 ); @@ -257,12 +256,9 @@ void window_top_toolbar_open() * * rct2: 0x0066C957 */ -static void window_top_toolbar_mouseup() +static void window_top_toolbar_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w, *mainWindow; - - window_widget_get_registers(w, widgetIndex); + rct_window *mainWindow; switch (widgetIndex) { case WIDX_PAUSE: @@ -433,13 +429,8 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg * * rct2: 0x0066C9EA */ -static void window_top_toolbar_dropdown() +static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - short widgetIndex, dropdownIndex; - rct_window* w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - switch (widgetIndex) { case WIDX_FILE_MENU: if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) @@ -520,13 +511,11 @@ static void window_top_toolbar_dropdown() * * rct2: 0x0066C810 */ -static void window_top_toolbar_invalidate() +static void window_top_toolbar_invalidate(rct_window *w) { int i, x, enabledWidgets, widgetIndex, widgetWidth, firstAlignment; - rct_window *w; rct_widget *widget; - window_get_register(w); colour_scheme_update(w); // Enable / disable buttons @@ -671,13 +660,9 @@ static void window_top_toolbar_invalidate() * * rct2: 0x0066C8EC */ -static void window_top_toolbar_paint() +static void window_top_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi) { int x, y, imgId; - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); window_draw_widgets(w, dpi); @@ -2428,15 +2413,9 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ * * rct2: 0x0066CB25 */ -static void window_top_toolbar_tool_update() +static void window_top_toolbar_tool_update(rct_window* w, int widgetIndex, int x, int y) { - short widgetIndex; - rct_window *w; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - - switch (widgetIndex){ + switch (widgetIndex) { case WIDX_CLEAR_SCENERY: top_toolbar_tool_update_scenery_clear(x, y); break; @@ -2458,13 +2437,8 @@ static void window_top_toolbar_tool_update() /** * rct2: 0x0066CB73 */ -static void window_top_toolbar_tool_down(){ - short widgetIndex; - rct_window* w; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - +static void window_top_toolbar_tool_down(rct_window* w, int widgetIndex, int x, int y) +{ switch (widgetIndex){ case WIDX_CLEAR_SCENERY: if (!RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & (1 << 0)) @@ -2669,14 +2643,8 @@ void window_top_toolbar_water_tool_drag(short x, short y) * * rct2: 0x0066CB4E */ -static void window_top_toolbar_tool_drag() +static void window_top_toolbar_tool_drag(rct_window* w, int widgetIndex, int x, int y) { - short widgetIndex; - rct_window *w; - short x, y; - - window_tool_get_registers(w, widgetIndex, x, y); - switch (widgetIndex){ case WIDX_CLEAR_SCENERY: if (window_find_by_class(WC_ERROR) != NULL) @@ -2733,13 +2701,8 @@ static void window_top_toolbar_tool_drag() * * rct2: 0x0066CC5B */ -static void window_top_toolbar_tool_up() -{ - short widgetIndex, x, y; - rct_window *w; - - window_tool_get_registers(w, widgetIndex, x, y); - +static void window_top_toolbar_tool_up(rct_window* w, int widgetIndex, int x, int y) +{ switch (widgetIndex) { case WIDX_LAND: map_invalidate_selection_rect(); @@ -2763,13 +2726,8 @@ static void window_top_toolbar_tool_up() * * rct2: 0x0066CA58 */ -static void window_top_toolbar_tool_abort() +static void window_top_toolbar_tool_abort(rct_window *w, int widgetIndex) { - short widgetIndex, x, y; - rct_window* w; - - window_tool_get_registers(w, widgetIndex, x, y); - switch (widgetIndex) { case WIDX_LAND: case WIDX_WATER: diff --git a/src/windows/track_list.c b/src/windows/track_list.c index e15d4e6192..f32d4722b4 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -54,46 +54,45 @@ static rct_widget window_track_list_widgets[] = { { WIDGETS_END }, }; -static void window_track_list_emptysub() { } -static void window_track_list_close(); -static void window_track_list_mouseup(); -static void window_track_list_scrollgetsize(); -static void window_track_list_scrollmousedown(); -static void window_track_list_scrollmouseover(); -static void window_track_list_tooltip(); -static void window_track_list_invalidate(); -static void window_track_list_paint(); -static void window_track_list_scrollpaint(); +static void window_track_list_close(rct_window *w); +static void window_track_list_mouseup(rct_window *w, int widgetIndex); +static void window_track_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_track_list_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_track_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_track_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId); +static void window_track_list_invalidate(rct_window *w); +static void window_track_list_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_track_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void* window_track_list_events[] = { - (uint32*)window_track_list_close, - (uint32*)window_track_list_mouseup, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_scrollgetsize, - (uint32*)window_track_list_scrollmousedown, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_scrollmouseover, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_tooltip, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_emptysub, - (uint32*)window_track_list_invalidate, - (uint32*)window_track_list_paint, - (uint32*)window_track_list_scrollpaint +static rct_window_event_list window_track_list_events = { + window_track_list_close, + window_track_list_mouseup, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_track_list_scrollgetsize, + window_track_list_scrollmousedown, + NULL, + window_track_list_scrollmouseover, + NULL, + NULL, + NULL, + window_track_list_tooltip, + NULL, + NULL, + window_track_list_invalidate, + window_track_list_paint, + window_track_list_scrollpaint }; ride_list_item _window_track_list_item; @@ -133,7 +132,7 @@ void window_track_list_open(ride_list_item item) y, 600, 400, - (uint32*)window_track_list_events, + &window_track_list_events, WC_TRACK_DESIGN_LIST, 0 ); @@ -233,7 +232,7 @@ static int window_track_list_get_list_item_index_from_position(int x, int y) * * rct2: 0x006CFD76 */ -static void window_track_list_close() +static void window_track_list_close(rct_window *w) { free(RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_CACHE, void*)); } @@ -242,13 +241,8 @@ static void window_track_list_close() * * rct2: 0x006CFA31 */ -static void window_track_list_mouseup() +static void window_track_list_mouseup(rct_window *w, int widgetIndex) { - rct_window *w; - short widgetIndex; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -279,32 +273,22 @@ static void window_track_list_mouseup() * * rct2: 0x006CFAB0 */ -static void window_track_list_scrollgetsize() +static void window_track_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { - rct_window *w; - int width, height; uint8 *trackDesignItem, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8); - window_get_register(w); - - width = 0; - height = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 10; + *height = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 10; for (trackDesignItem = trackDesignList; *trackDesignItem != 0; trackDesignItem += 128) - height += 10; - - window_scrollsize_set_registers(width, height); + *height += 10; } /** * * rct2: 0x006CFB39 */ -static void window_track_list_scrollmousedown() +static void window_track_list_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) { - rct_window *w; - short i, x, y, scrollIndex; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); + int i; if (w->track_list.var_484 & 1) return; @@ -321,12 +305,9 @@ static void window_track_list_scrollmousedown() * * rct2: 0x006CFAD7 */ -static void window_track_list_scrollmouseover() +static void window_track_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) { - rct_window *w; - short i, x, y, scrollIndex; - - window_scrollmouse_get_registers(w, scrollIndex, x, y); + int i; if (w->track_list.var_484 & 1) return; @@ -344,7 +325,7 @@ static void window_track_list_scrollmouseover() * * rct2: 0x006CFD6C */ -static void window_track_list_tooltip() +static void window_track_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; } @@ -353,13 +334,11 @@ static void window_track_list_tooltip() * * rct2: 0x006CF2D6 */ -static void window_track_list_invalidate() +static void window_track_list_invalidate(rct_window *w) { - rct_window *w; rct_ride_type *entry; rct_string_id stringId; - window_get_register(w); colour_scheme_update(w); entry = GET_RIDE_ENTRY(_window_track_list_item.entry_index); @@ -398,10 +377,8 @@ static void window_track_list_invalidate() * * rct2: 0x006CF387 */ -static void window_track_list_paint() +static void window_track_list_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_widget *widget; rct_track_design *trackDesign = NULL; uint8 *image, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8); @@ -410,8 +387,6 @@ static void window_track_list_paint() int trackIndex, x, y, colour, gForces, airTime; rct_g1_element tmpElement, *subsituteElement; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); trackIndex = w->track_list.var_482; @@ -584,16 +559,12 @@ static void window_track_list_paint() * * rct2: 0x006CF8CD */ -static void window_track_list_scrollpaint() +static void window_track_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_string_id stringId, stringId2; int i, x, y, colour; uint8 *trackDesignItem, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8); - window_paint_get_registers(w, dpi); - colour = RCT2_GLOBAL(0x00141FC48 + (w->colours[0] * 8), uint8); colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; gfx_clear(dpi, colour); diff --git a/src/windows/track_manage.c b/src/windows/track_manage.c index 9f9bea901f..eaa9c122b3 100644 --- a/src/windows/track_manage.c +++ b/src/windows/track_manage.c @@ -61,82 +61,78 @@ static rct_widget window_track_delete_prompt_widgets[] = { #pragma region Events -static void window_track_manage_emptysub() { } +static void window_track_manage_close(rct_window *w); +static void window_track_manage_mouseup(rct_window *w, int widgetIndex); +static void window_track_manage_textinput(rct_window *w, int widgetIndex, char *text); +static void window_track_manage_invalidate(rct_window *w); +static void window_track_manage_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void window_track_manage_close(); -static void window_track_manage_mouseup(); -static void window_track_manage_textinput(); -static void window_track_manage_invalidate(); -static void window_track_manage_paint(); - -static void window_track_delete_prompt_emptysub() { } - -static void window_track_delete_prompt_mouseup(); -static void window_track_delete_prompt_invalidate(); -static void window_track_delete_prompt_paint(); +static void window_track_delete_prompt_mouseup(rct_window *w, int widgetIndex); +static void window_track_delete_prompt_invalidate(rct_window *w); +static void window_track_delete_prompt_paint(rct_window *w, rct_drawpixelinfo *dpi); // 0x009940EC -static void* window_track_manage_events[] = { +static rct_window_event_list window_track_manage_events = { window_track_manage_close, window_track_manage_mouseup, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_track_manage_textinput, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, - window_track_manage_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_track_manage_invalidate, window_track_manage_paint, - window_track_manage_emptysub + NULL }; // 0x0099415C -static void* window_track_delete_prompt_events[] = { - window_track_delete_prompt_emptysub, +static rct_window_event_list window_track_delete_prompt_events = { + NULL, window_track_delete_prompt_mouseup, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, - window_track_delete_prompt_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_track_delete_prompt_invalidate, window_track_delete_prompt_paint, - window_track_delete_prompt_emptysub + NULL }; #pragma endregion @@ -156,7 +152,7 @@ void window_track_manage_open() w = window_create_centred( 250, 44, - (uint32*)window_track_manage_events, + &window_track_manage_events, WC_MANAGE_TRACK_DESIGN, WF_STICK_TO_FRONT | WF_TRANSPARENT ); @@ -176,28 +172,23 @@ void window_track_manage_open() * * rct2: 0x006D364C */ -static void window_track_manage_close() +static void window_track_manage_close(rct_window *w) { - rct_window *w; - - w = window_find_by_class(WC_TRACK_DESIGN_LIST); - if (w != NULL) - w->track_list.var_484 &= ~1; + rct_window *trackDesignListWindow = window_find_by_class(WC_TRACK_DESIGN_LIST); + if (trackDesignListWindow != NULL) + trackDesignListWindow->track_list.var_484 &= ~1; } /** * * rct2: 0x006D3523 */ -static void window_track_manage_mouseup() +static void window_track_manage_mouseup(rct_window *w, int widgetIndex) { uint8 *trackDesignList = (uint8*)0x00F441EC; - rct_window *w, *trackDesignListWindow; - short widgetIndex; + rct_window *trackDesignListWindow; char *dst, *src; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -223,16 +214,9 @@ static void window_track_manage_mouseup() * * rct2: 0x006D3523 */ -static void window_track_manage_textinput() +static void window_track_manage_textinput(rct_window *w, int widgetIndex, char *text) { - rct_window *w; - short widgetIndex; - uint8 result; - char *text; - - window_textinput_get_registers(w, widgetIndex, result, text); - - if (widgetIndex != WIDX_RENAME || !result) + if (widgetIndex != WIDX_RENAME || text == NULL) return; if (track_rename(text)) { @@ -243,11 +227,8 @@ static void window_track_manage_textinput() } } -static void window_track_manage_invalidate() +static void window_track_manage_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); } @@ -255,13 +236,8 @@ static void window_track_manage_invalidate() * * rct2: 0x006D3523 */ -static void window_track_manage_paint() +static void window_track_manage_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); } @@ -280,7 +256,7 @@ static void window_track_delete_prompt_open() (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 44) / 2, 250, 74, - (uint32*)window_track_delete_prompt_events, + &window_track_delete_prompt_events, WC_TRACK_DELETE_PROMPT, WF_STICK_TO_FRONT ); @@ -297,13 +273,8 @@ static void window_track_delete_prompt_open() * * rct2: 0x006D3823 */ -static void window_track_delete_prompt_mouseup() +static void window_track_delete_prompt_mouseup(rct_window *w, int widgetIndex) { - rct_window *w; - short widgetIndex; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: case WIDX_PROMPT_CANCEL: @@ -319,11 +290,8 @@ static void window_track_delete_prompt_mouseup() } } -static void window_track_delete_prompt_invalidate() +static void window_track_delete_prompt_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); } @@ -331,14 +299,10 @@ static void window_track_delete_prompt_invalidate() * * rct2: 0x006D37EE */ -static void window_track_delete_prompt_paint() +static void window_track_delete_prompt_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; rct_string_id stringId; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); stringId = 3155; diff --git a/src/windows/track_place.c b/src/windows/track_place.c index 83db7c7698..22933ca5fc 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -56,46 +56,45 @@ static rct_widget window_track_place_widgets[] = { { WIDGETS_END }, }; -static void window_track_place_emptysub() { } -static void window_track_place_close(); -static void window_track_place_mouseup(); +static void window_track_place_close(rct_window *w); +static void window_track_place_mouseup(rct_window *w, int widgetIndex); static void window_track_place_update(rct_window *w); -static void window_track_place_toolupdate(); -static void window_track_place_tooldown(); -static void window_track_place_toolabort(); -static void window_track_place_unknown14(); -static void window_track_place_invalidate(); -static void window_track_place_paint(); +static void window_track_place_toolupdate(rct_window* w, int widgetIndex, int x, int y); +static void window_track_place_tooldown(rct_window* w, int widgetIndex, int x, int y); +static void window_track_place_toolabort(rct_window *w, int widgetIndex); +static void window_track_place_unknown14(rct_window *w); +static void window_track_place_invalidate(rct_window *w); +static void window_track_place_paint(rct_window *w, rct_drawpixelinfo *dpi); -static void* window_track_place_events[] = { +static rct_window_event_list window_track_place_events = { window_track_place_close, window_track_place_mouseup, - window_track_place_emptysub, - window_track_place_emptysub, - window_track_place_emptysub, - window_track_place_emptysub, + NULL, + NULL, + NULL, + NULL, window_track_place_update, - window_track_place_emptysub, - window_track_place_emptysub, + NULL, + NULL, window_track_place_toolupdate, window_track_place_tooldown, - window_track_place_emptysub, - window_track_place_emptysub, + NULL, + NULL, window_track_place_toolabort, - window_track_place_emptysub, - window_track_place_emptysub, - window_track_place_emptysub, - window_track_place_emptysub, - window_track_place_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_track_place_unknown14, - window_track_place_emptysub, - window_track_place_emptysub, - window_track_place_emptysub, - window_track_place_emptysub, - window_track_place_emptysub, + NULL, + NULL, + NULL, + NULL, window_track_place_invalidate, window_track_place_paint, - window_track_place_emptysub + NULL }; static uint8 *_window_track_place_mini_preview; @@ -381,7 +380,7 @@ void window_track_place_open() 29, 200, 124, - (uint32*)window_track_place_events, + &window_track_place_events, WC_TRACK_DESIGN_PLACE, 0 ); @@ -402,7 +401,7 @@ void window_track_place_open() * * rct2: 0x006D0119 */ -static void window_track_place_close() +static void window_track_place_close(rct_window *w) { window_track_place_clear_provisional(); viewport_set_visibility(0); @@ -416,13 +415,8 @@ static void window_track_place_close() * * rct2: 0x006CFEAC */ -static void window_track_place_mouseup() +static void window_track_place_mouseup(rct_window *w, int widgetIndex) { - rct_window *w; - short widgetIndex; - - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -463,96 +457,90 @@ static void window_track_place_update(rct_window *w) * * rct2: 0x006CFF2D */ -static void window_track_place_toolupdate() +static void window_track_place_toolupdate(rct_window* w, int widgetIndex, int x, int y) { - rct_window *w; - short widgetIndex, x, y; - int i, z; + int i; + short mapX, mapY, mapZ; money32 cost; uint8 rideIndex; - window_tool_get_registers(w, widgetIndex, x, y); - map_invalidate_map_selection_tiles(); RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~7; // Get the tool map position - sub_68A15E(x, y, &x, &y, NULL, NULL); - if (x == (short)0x8000) { + sub_68A15E(x, y, &mapX, &mapY, NULL, NULL); + if (mapX == (short)0x8000) { window_track_place_clear_provisional(); return; } // Check if tool map position has changed since last update - if (x == _window_track_place_last_x && y == _window_track_place_last_y) { - sub_6D01B3(0, 0, x, y, 0); + if (mapX == _window_track_place_last_x && mapY == _window_track_place_last_y) { + sub_6D01B3(0, 0, mapX, mapY, 0); return; } cost = MONEY32_UNDEFINED; // Get base Z position - z = window_track_place_get_base_z(x, y); + mapZ = window_track_place_get_base_z(mapX, mapY); if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0 || gConfigCheat.build_in_pause_mode) { window_track_place_clear_provisional(); // Try increasing Z until a feasible placement is found for (i = 0; i < 7; i++) { - window_track_place_attempt_placement(x, y, z, 105, &cost, &rideIndex); + window_track_place_attempt_placement(mapX, mapY, mapZ, 105, &cost, &rideIndex); if (cost != MONEY32_UNDEFINED) { RCT2_GLOBAL(0x00F440EB, uint16) = rideIndex; - _window_track_place_last_valid_x = x; - _window_track_place_last_valid_y = y; - _window_track_place_last_valid_z = z; + _window_track_place_last_valid_x = mapX; + _window_track_place_last_valid_y = mapY; + _window_track_place_last_valid_z = mapZ; _window_track_place_last_was_valid = 1; break; } - z += 8; + mapZ += 8; } } - _window_track_place_last_x = x; - _window_track_place_last_y = y; + _window_track_place_last_x = mapX; + _window_track_place_last_y = mapY; if (cost != _window_track_place_last_cost) { _window_track_place_last_cost = cost; widget_invalidate(w, WIDX_PRICE); } - sub_6D01B3(0, 0, x, y, z); + sub_6D01B3(0, 0, mapX, mapY, mapZ); } /** * * rct2: 0x006CFF34 */ -static void window_track_place_tooldown() +static void window_track_place_tooldown(rct_window* w, int widgetIndex, int x, int y) { - rct_window *w; - short widgetIndex, x, y, z; int i; + short mapX, mapY, mapZ; money32 cost; uint8 rideIndex; - window_tool_get_registers(w, widgetIndex, x, y); - window_track_place_clear_provisional(); map_invalidate_map_selection_tiles(); RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~7; - sub_68A15E(x, y, &x, &y, NULL, NULL); - if (x == (short)0x8000) + sub_68A15E(x, y, &mapX, &mapY, NULL, NULL); + if (mapX == (short)0x8000) return; // Try increasing Z until a feasible placement is found - z = window_track_place_get_base_z(x, y); + mapZ = window_track_place_get_base_z(mapX, mapY); for (i = 0; i < 7; i++) { RCT2_GLOBAL(0x009A8C29, uint8) |= 1; - window_track_place_attempt_placement(x, y, z, 1, &cost, &rideIndex); + window_track_place_attempt_placement(mapX, mapY, mapZ, 1, &cost, &rideIndex); RCT2_GLOBAL(0x009A8C29, uint8) &= ~1; if (cost != MONEY32_UNDEFINED) { window_close_by_class(WC_ERROR); - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, mapX, mapY, mapZ); RCT2_GLOBAL(0x00F440A7, uint8) = rideIndex; if (RCT2_GLOBAL(0x00F4414E, uint8) & 1) { @@ -570,18 +558,18 @@ static void window_track_place_tooldown() if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == 827) break; - z += 8; + mapZ += 8; } // Unable to build track - sound_play_panned(SOUND_ERROR, 0x8001, x, y, z); + sound_play_panned(SOUND_ERROR, 0x8001, mapX, mapY, mapZ); } /** * * rct2: 0x006D015C */ -static void window_track_place_toolabort() +static void window_track_place_toolabort(rct_window *w, int widgetIndex) { window_track_place_clear_provisional(); } @@ -590,16 +578,13 @@ static void window_track_place_toolabort() * * rct2: 0x006CFF01 */ -static void window_track_place_unknown14() +static void window_track_place_unknown14(rct_window *w) { window_track_place_draw_mini_preview(); } -static void window_track_place_invalidate() +static void window_track_place_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); } @@ -607,14 +592,11 @@ static void window_track_place_invalidate() * * rct2: 0x006CFD9D */ -static void window_track_place_paint() +static void window_track_place_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi, *clippedDpi; + rct_drawpixelinfo *clippedDpi; rct_g1_element tmpElement, *subsituteElement; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); // Draw mini tile preview diff --git a/src/windows/viewport.c b/src/windows/viewport.c index c40ea69850..43803bef5b 100644 --- a/src/windows/viewport.c +++ b/src/windows/viewport.c @@ -57,42 +57,41 @@ static rct_widget window_viewport_widgets[] = { { WIDGETS_END }, }; -static void window_viewport_empty(){} -static void window_viewport_mouseup(); -static void window_viewport_resize(); +static void window_viewport_mouseup(rct_window *w, int widgetIndex); +static void window_viewport_resize(rct_window *w); static void window_viewport_update(rct_window *w); -static void window_viewport_invalidate(); -static void window_viewport_paint(); +static void window_viewport_invalidate(rct_window *w); +static void window_viewport_paint(rct_window *w, rct_drawpixelinfo *dpi); -void* window_viewport_events[] = { - window_viewport_empty, +static rct_window_event_list window_viewport_events = { + NULL, window_viewport_mouseup, window_viewport_resize, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, + NULL, + NULL, + NULL, window_viewport_update, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, - window_viewport_empty, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_viewport_invalidate, window_viewport_paint, - window_viewport_empty + NULL }; static int _viewportNumber = 1; @@ -108,7 +107,7 @@ void window_viewport_open() w = window_create_auto_pos( INITIAL_WIDTH, INITIAL_HEIGHT, - (uint32*)window_viewport_events, + &window_viewport_events, WC_VIEWPORT, WF_RESIZABLE ); @@ -147,14 +146,11 @@ static void window_viewport_anchor_border_widgets(rct_window *w) w->widgets[WIDX_CLOSE].right = w->width - 3; } -static void window_viewport_mouseup() +static void window_viewport_mouseup(rct_window *w, int widgetIndex) { - short widgetIndex; - rct_window *w, *mainWindow; + rct_window *mainWindow; sint16 x, y; - window_widget_get_registers(w, widgetIndex); - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -181,12 +177,8 @@ static void window_viewport_mouseup() } } -static void window_viewport_resize() +static void window_viewport_resize(rct_window *w) { - rct_window *w; - - window_get_register(w); - w->flags |= WF_RESIZABLE; window_set_resize(w, 200, 200, 2000, 2000); } @@ -208,14 +200,12 @@ static void window_viewport_update(rct_window *w) //widget_invalidate(w, WIDX_VIEWPORT); } -static void window_viewport_invalidate() +static void window_viewport_invalidate(rct_window *w) { - rct_window *w; rct_widget *viewportWidget; rct_viewport *viewport; int i; - window_get_register(w); colour_scheme_update(w); viewportWidget = &window_viewport_widgets[WIDX_VIEWPORT]; @@ -248,13 +238,8 @@ static void window_viewport_invalidate() viewport->view_height = viewport->height << viewport->zoom; } -static void window_viewport_paint() +static void window_viewport_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); // Draw viewport diff --git a/src/windows/water.c b/src/windows/water.c index 33eb360ed9..5b2e4c2a5e 100644 --- a/src/windows/water.c +++ b/src/windows/water.c @@ -48,44 +48,43 @@ static rct_widget window_water_widgets[] = { static int window_water_should_close(); -static void window_water_emptysub() { } -static void window_water_close(); -static void window_water_mouseup(); -static void window_water_update(); -static void window_water_invalidate(); -static void window_water_paint(); -static void window_water_textinput(); +static void window_water_close(rct_window *w); +static void window_water_mouseup(rct_window *w, int widgetIndex); +static void window_water_update(rct_window *w); +static void window_water_invalidate(rct_window *w); +static void window_water_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_water_textinput(rct_window *w, int widgetIndex, char *text); static void window_water_inputsize(rct_window *w); -static void* window_water_events[] = { +static rct_window_event_list window_water_events = { window_water_close, window_water_mouseup, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, + NULL, + NULL, + NULL, + NULL, window_water_update, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_water_textinput, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, - window_water_emptysub, + NULL, + NULL, + NULL, + NULL, + NULL, window_water_invalidate, window_water_paint, - window_water_emptysub + NULL }; /** @@ -105,7 +104,7 @@ void window_water_open() 29, 76, 77, - (uint32*)window_water_events, + &window_water_events, WC_WATER, 0 ); @@ -122,7 +121,7 @@ void window_water_open() * * rct2: 0x006E6B65 */ -static void window_water_close() +static void window_water_close(rct_window *w) { // If the tool wasn't changed, turn tool off if (!window_water_should_close()) @@ -133,13 +132,9 @@ static void window_water_close() * * rct2: 0x006E6B4E */ -static void window_water_mouseup() +static void window_water_mouseup(rct_window *w, int widgetIndex) { - rct_window *w; int limit; - short widgetIndex; - - window_widget_get_registers(w, widgetIndex); switch (widgetIndex) { case WIDX_CLOSE: @@ -176,18 +171,12 @@ static void window_water_mouseup() } } -static void window_water_textinput() +static void window_water_textinput(rct_window *w, int widgetIndex, char *text) { - uint8 result; - short widgetIndex; - rct_window *w; - char *text; int size; char* end; - window_textinput_get_registers(w, widgetIndex, result, text); - - if (widgetIndex != WIDX_PREVIEW || !result) + if (widgetIndex != WIDX_PREVIEW || text == NULL) return; size = strtol(text, &end, 10); @@ -221,11 +210,8 @@ static void window_water_update(rct_window *w) * * rct2: 0x006E6AB8 */ -static void window_water_invalidate() +static void window_water_invalidate(rct_window *w) { - rct_window *w; - - window_get_register(w); colour_scheme_update(w); // Set the preview image button to be pressed down @@ -244,14 +230,10 @@ static void window_water_invalidate() * * rct2: 0x006E6ACF */ -static void window_water_paint() +static void window_water_paint(rct_window *w, rct_drawpixelinfo *dpi) { - rct_window *w; - rct_drawpixelinfo *dpi; int x, y; - window_paint_get_registers(w, dpi); - x = w->x + (window_water_widgets[WIDX_PREVIEW].left + window_water_widgets[WIDX_PREVIEW].right) / 2; y = w->y + (window_water_widgets[WIDX_PREVIEW].top + window_water_widgets[WIDX_PREVIEW].bottom) / 2; From 5724567b154e1d198f526d008c7c0ed6fd85fbbe Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 10 Jul 2015 14:54:02 +0100 Subject: [PATCH 0232/1173] implement ride_get_place_position_from_screen_position --- src/interface/viewport.c | 48 +++++++++++++++++- src/interface/viewport.h | 2 + src/rct2.h | 3 ++ src/windows/ride_construction.c | 89 +++++++++++++++++++++++++++------ src/windows/top_toolbar.c | 9 ---- 5 files changed, 127 insertions(+), 24 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 671a0c61fd..bfd2850113 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -2431,7 +2431,7 @@ void sub_68862C() * flags: edx * x: ax * y: cx - * z: bl + * interactionType: bl * mapElement: edx * viewport: edi */ @@ -2510,3 +2510,49 @@ void viewport_invalidate(rct_viewport *viewport, int left, int top, int right, i gfx_set_dirty_blocks(left, top, right, bottom); } } + +rct_viewport *viewport_find_from_point(int screenX, int screenY) +{ + rct_window *w; + rct_viewport *viewport; + + w = window_find_from_point(screenX, screenY); + if (w == NULL) + return NULL; + + viewport = w->viewport; + if (viewport == NULL) + return NULL; + + if (screenX < viewport->x || screenY < viewport->y) + return NULL; + if (screenX >= viewport->x + viewport->width || screenY >= viewport->y + viewport->height) + return NULL; + + return viewport; +} + +/** + * + * rct2: 0x006894D4 + */ +void sub_6894D4(sint16 screenX, sint16 screenY, sint16 z, sint16 *mapX, sint16 *mapY) +{ + rct_viewport *viewport = viewport_find_from_point(screenX, screenY); + if (viewport == NULL) { + *mapX = 0x8000; + return; + } + + screenX = viewport->view_x + ((screenX - viewport->x) << viewport->zoom); + screenY = viewport->view_y + ((screenY - viewport->y) << viewport->zoom); + + rct_xy16 mapPosition = viewport_coord_to_map_coord(screenX, screenY + z, 0); + if (mapPosition.x < 0 || mapPosition.x >= (256 * 32) || mapPosition.y < 0 || mapPosition.y >(256 * 32)) { + *mapX = 0x8000; + return; + } + + *mapX = mapPosition.x; + *mapY = mapPosition.y; +} diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 7671852ceb..529822f742 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -133,4 +133,6 @@ void sub_688217(); void viewport_invalidate(rct_viewport *viewport, int left, int top, int right, int bottom); +void sub_6894D4(sint16 screenX, sint16 screenY, sint16 z, sint16 *mapX, sint16 *mapY); + #endif diff --git a/src/rct2.h b/src/rct2.h index 30b4d7156d..3663e1a15c 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -66,6 +66,9 @@ typedef utf16* utf16string; #define sgn(x) ((x > 0) ? 1 : ((x < 0) ? -1 : 0)) #define clamp(l, x, h) (min(h, max(l, x))) +// Rounds an integer down to the given power of 2. y must be a power of 2. +#define floor2(x, y) ((x) & (~((y) - 1))) + #define countof(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x]))))) #ifndef _MSC_VER diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index b7f346abbe..e6bb6e2ad8 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -441,6 +441,14 @@ rct_string_id RideConfigurationStringIds[] = { #pragma endregion +#define _trackPlaceCtrlState RCT2_GLOBAL(0x00F44159, uint8) +static int _trackPlaceCtrlZ; +#define _trackPlaceShiftState RCT2_GLOBAL(0x00F4415C, uint8) +static int _trackPlaceShiftStartScreenX; +static int _trackPlaceShiftStartScreenY; +static int _trackPlaceShiftZ; +#define _trackPlaceZ RCT2_GLOBAL(0x00F44163, sint16) + static void window_ride_construction_next_section(rct_window *w); static void window_ride_construction_previous_section(rct_window *w); static void window_ride_construction_construct(rct_window *w); @@ -1897,15 +1905,70 @@ static void window_ride_construction_update(rct_window *w) */ static bool ride_get_place_position_from_screen_position(int screenX, int screenY, int *outX, int *outY) { - int eax, ebx, ecx, edx, esi, edi, ebp; - eax = screenX; - ebx = screenY; - RCT2_CALLFUNC_X(0x006CC538, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + short mapX, mapY, mapZ; + int interactionType, direction; + rct_map_element *mapElement; + rct_viewport *viewport; - if (outX != NULL) *outX = eax & 0xFFFF; - if (outY != NULL) *outY = ebx & 0xFFFF; + if (!_trackPlaceCtrlState) { + if (RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) & 2) { + get_map_coordinates_from_pos(screenX, screenY, 0xFCCA, &mapX, &mapY, &interactionType, &mapElement, &viewport); + if (interactionType != 0) { + _trackPlaceCtrlZ = mapElement->base_height * 8; + _trackPlaceCtrlState = true; + } + } + } else { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) & 2)) { + _trackPlaceCtrlState = false; + } + } - return (eax & 0xFFFF) != 0x8000; + if (!_trackPlaceShiftState) { + if (RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) & 1) { + _trackPlaceShiftState = true; + _trackPlaceShiftStartScreenX = screenX; + _trackPlaceShiftStartScreenY = screenY; + _trackPlaceShiftZ = 0; + } + } else { + if (RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) & 1) { + _trackPlaceShiftZ = floor2(_trackPlaceShiftStartScreenY - screenY + 4, 8); + screenX = _trackPlaceShiftStartScreenX; + screenY = _trackPlaceShiftStartScreenY; + } else { + _trackPlaceShiftState = false; + } + } + + if (!_trackPlaceCtrlState) { + sub_68A15E(screenX, screenY, &mapX, &mapY, &direction, &mapElement); + if (mapX == (short)0x8000) + return false; + + _trackPlaceZ = 0; + if (_trackPlaceShiftState) { + mapElement = map_get_surface_element_at(mapX >> 5, mapY >> 5); + mapZ = floor2(mapElement->base_height * 8, 16); + mapZ += _trackPlaceShiftZ; + mapZ = max(mapZ, 16); + _trackPlaceZ = mapZ; + } + } else { + mapZ = _trackPlaceCtrlZ; + sub_6894D4(screenX, screenY, mapZ, &mapX, &mapY); + if (_trackPlaceShiftState != 0) { + mapZ += _trackPlaceShiftZ; + } + _trackPlaceZ = max(mapZ, 16); + } + + if (mapX == (short)0x8000) + return false; + + *outX = floor2(mapX, 32); + *outY = floor2(mapY, 32); + return true; } /** @@ -3218,13 +3281,11 @@ static void ride_construction_toolupdate_construct(int screenX, int screenY) if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & 2) { rct_xy16 *selectedTile = gMapSelectionTiles; while (selectedTile->x != -1) { - if (selectedTile->x >= (256 * 32) || selectedTile->y >= (256 * 32)) - continue; - - z = map_get_highest_z(selectedTile->x >> 5, selectedTile->y >> 5); - if (z > highestZ) - highestZ = z; - + if (selectedTile->x < (256 * 32) && selectedTile->y < (256 * 32)) { + z = map_get_highest_z(selectedTile->x >> 5, selectedTile->y >> 5); + if (z > highestZ) + highestZ = z; + } selectedTile++; } } diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index a4a5dd0a04..1006bcf4f8 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -886,15 +886,6 @@ void sub_6896DC(sint16 x, sint16 y, sint16 z, sint16* grid_x, sint16* grid_y, ui *cl = ecx; } -void sub_6894D4(sint16 x, sint16 y, sint16 z, sint16* grid_x, sint16* grid_y){ - int eax = x, ebx = y, ecx = 0, edx = 0, esi = 0, edi = 0, ebp = z; - - RCT2_CALLFUNC_X(0x006894D4, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - - *grid_x = eax; - *grid_y = ebx; -} - /* rct2: 0x006E1F34 * Outputs * eax : grid_x From 8c4b82cadec4e74808bb07f23e9b9fd8eeaf59ec Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 10 Jul 2015 17:11:33 +0100 Subject: [PATCH 0233/1173] implement ride_get_entrance_or_exit_position_from_screen_position --- src/ride/ride.c | 206 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 189 insertions(+), 17 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index fc9f4cf11c..b56c4007e4 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5050,31 +5050,203 @@ void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int n */ money32 ride_get_entrance_or_exit_price(int rideIndex, int x, int y, int direction, int dh, int di) { - int eax, ebx, ecx, edx, esi, edi, ebp; - eax = x; - ebx = direction << 8; - ecx = y; - edx = rideIndex | (dh << 8); - edi = di; - RCT2_CALLFUNC_X(0x006CA28C, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - return ebx; + sub_6C96C0(); + money32 result = game_do_command( + x, + 105 | (direction << 8), + y, + rideIndex | (dh << 8), + GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, + di, + 0 + ); + if (result != MONEY32_UNDEFINED) { + _currentTrackSelectionFlags |= (1 << 2); + RCT2_GLOBAL(0x00F440BF, uint16) = x; + RCT2_GLOBAL(0x00F440C1, uint16) = y; + RCT2_GLOBAL(0x00F440C3, uint8) = direction; + RCT2_GLOBAL(0x00F440C4, uint8) = di & 0xFF; + } + return result; +} +int loc_6CD18E(short mapX, short mapY, short entranceMinX, short entranceMinY, short entranceMaxX, short entranceMaxY) +{ + int direction = 0; + if (mapX == entranceMinX) { + if (mapY > entranceMinY && mapY < entranceMaxY) { + return direction; + } + } + direction = 1; + if (mapY == entranceMaxY) { + if (mapX > entranceMinX && mapX < entranceMaxX) { + return direction; + } + } + direction = 2; + if (mapX == entranceMaxX) { + if (mapY > entranceMinY && mapY < entranceMaxY) { + return direction; + } + } + direction = 3; + if (mapY == entranceMinY) { + if (mapX > entranceMinX && mapX < entranceMaxX) { + return direction; + } + } + return -1; } /** * * rct2: 0x006CCF70 */ -void ride_get_entrance_or_exit_position_from_screen_position(int x, int y, int *outX, int *outY, int *outDirection) +void ride_get_entrance_or_exit_position_from_screen_position(int screenX, int screenY, int *outX, int *outY, int *outDirection) { - int eax, ebx, ecx, edx, esi, edi, ebp; - eax = x; - ebx = y; - RCT2_CALLFUNC_X(0x006CCF70, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - - if (outX != NULL) *outX = eax & 0xFFFF; - if (outY != NULL) *outY = ecx & 0xFFFF; - if (outDirection != NULL) *outDirection = ebx & 0xFF; + short mapX, mapY; + short entranceMinX, entranceMinY, entranceMaxX, entranceMaxY, word_F4418C, word_F4418E; + int interactionType, direction, stationHeight, stationDirection; + rct_map_element *mapElement; + rct_viewport *viewport; + rct_ride *ride; + + RCT2_GLOBAL(0x00F44194, uint8) = 255; + get_map_coordinates_from_pos(screenX, screenY, 0xFFFB, &mapX, &mapY, &interactionType, &mapElement, &viewport); + if (interactionType != 0) { + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_TRACK) { + if (mapElement->properties.track.ride_index == RCT2_GLOBAL(0x00F44192, uint8)) { + if (RCT2_ADDRESS(0x0099BA64, uint8)[mapElement->properties.track.type << 4] & 0x10) { + if (mapElement->properties.track.type == 101) { + RCT2_GLOBAL(0x00F44193, uint8) = 0; + } else { + RCT2_GLOBAL(0x00F44193, uint8) = (mapElement->properties.track.sequence & 0x70) >> 4; + } + } + } + } + } + + ride = GET_RIDE(RCT2_GLOBAL(0x00F44192, uint8)); + stationHeight = ride->station_heights[RCT2_GLOBAL(0x00F44193, uint8)]; + + sub_6894D4(screenX, screenY, stationHeight * 8, &mapX, &mapY); + if (mapX == (short)0x8000) { + *outX = 0x8000; + return; + } + + word_F4418C = mapX; + word_F4418E = mapY; + RCT2_GLOBAL(0x00F44188, uint16) = floor2(mapX, 32); + RCT2_GLOBAL(0x00F4418A, uint16) = floor2(mapY, 32); + + if (ride->type == RIDE_TYPE_NULL) + return; + + uint16 stationStartXY = ride->station_starts[RCT2_GLOBAL(0x00F44193, uint8)]; + if (stationStartXY == 0xFFFF) + return; + + RCT2_GLOBAL(0x00F44190, uint8) = stationHeight; + + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_3)) { + mapX = (word_F4418C & 0x1F) - 16; + mapY = (word_F4418E & 0x1F) - 16; + if (abs(mapX) < abs(mapY)) { + direction = mapY < 0 ? 3 : 1; + } else { + direction = mapX < 0 ? 0 : 2; + } + + for (int i = 0; i < 4; i++) { + mapX = word_F4418C + TileDirectionDelta[direction].x; + mapY = word_F4418E + TileDirectionDelta[direction].y; + if (mapX >= 0 && mapY >= 0 && mapX < (256 * 32) && mapY < (256 * 32)) { + mapElement = map_get_first_element_at(mapX >> 5, mapY >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) + continue; + if (mapElement->base_height != stationHeight) + continue; + if (mapElement->properties.track.ride_index != RCT2_GLOBAL(0x00F44192, uint8)) + continue; + if (mapElement->properties.track.type == 101) { + RCT2_GLOBAL(0x00F44194, uint8) = direction ^ 2; + *outX = mapX; + *outY = mapY; + return; + } + if (map_get_station(mapElement) != RCT2_GLOBAL(0x00F44193, uint8)) + continue; + + int ebx = (mapElement->properties.track.type << 4) + (mapElement->properties.track.sequence & 0x0F); + int eax = (direction + 2 - mapElement->type) & MAP_ELEMENT_DIRECTION_MASK; + if (RCT2_ADDRESS(0x0099CA64, uint8)[ebx] & eax) { + RCT2_GLOBAL(0x00F44194, uint8) = direction ^ 2; + *outX = mapX; + *outY = mapY; + return; + } + } while (!map_element_is_last_for_tile(mapElement++)); + } + direction = (direction + 1) & 3; + } + } else { + mapX = (stationStartXY & 0xFF) * 32; + mapY = (stationStartXY >> 8) * 32; + entranceMinX = mapX; + entranceMinY = mapY; + + mapElement = ride_get_station_start_track_element(ride, RCT2_GLOBAL(0x00F44193, uint8)); + direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; + stationDirection = direction; + + nextTile: + entranceMaxX = mapX; + entranceMaxY = mapY; + mapX -= TileDirectionDelta[direction].x; + mapY -= TileDirectionDelta[direction].y; + mapElement = map_get_first_element_at(mapX >> 5, mapY >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) + continue; + if (mapElement->properties.track.ride_index != RCT2_GLOBAL(0x00F44192, uint8)) + continue; + if (map_get_station(mapElement) != RCT2_GLOBAL(0x00F44193, uint8)) + continue; + + switch (mapElement->properties.track.type) { + case TRACK_ELEM_END_STATION: + case TRACK_ELEM_BEGIN_STATION: + case TRACK_ELEM_MIDDLE_STATION: + goto nextTile; + } + } while (!map_element_is_last_for_tile(mapElement++)); + + mapX = entranceMinX; + if (mapX > entranceMaxX) { + entranceMinX = entranceMaxX; + entranceMaxX = mapX; + } + + mapY = entranceMinY; + if (mapY > entranceMaxY) { + entranceMinY = entranceMaxY; + entranceMaxY = mapY; + } + + mapX = RCT2_GLOBAL(0x00F44188, uint16); + mapY = RCT2_GLOBAL(0x00F4418A, uint16); + direction = loc_6CD18E(mapX, mapY, entranceMinX - 32, entranceMinY - 32, entranceMaxX + 32, entranceMaxY + 32); + if (direction != -1 && direction != stationDirection && direction != (stationDirection ^ 2)) { + RCT2_GLOBAL(0x00F44194, uint8) = direction; + *outX = mapX; + *outY = mapY; + return; + } + } } bool ride_select_backwards_from_front() From 25cad9d9f1bf7c4b010d1018c490cac5ef696a7f Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 10 Jul 2015 20:29:50 +0100 Subject: [PATCH 0234/1173] implement ride_crash with hook --- src/localisation/string_ids.h | 1 + src/openrct2.c | 2 ++ src/ride/ride.c | 40 ++++++++++++++++++++++++----------- src/ride/ride.h | 6 ++---- 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 2456acb74d..c3305bd1be 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -842,6 +842,7 @@ enum { STR_CONTINUE_SAVED_GAME_TIP = 1922, STR_SHOW_TUTORIAL_TIP = 1923, STR_EXIT = 1924, + STR_RIDE_HAS_CRASHED = 1928, STR_SHOW_SUBJECT_TIP = 1937, diff --git a/src/openrct2.c b/src/openrct2.c index 9d491bfcef..bcada4e0dc 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -32,6 +32,7 @@ #include "network/http.h" #include "openrct2.h" #include "platform/platform.h" +#include "ride/ride.h" #include "util/sawyercoding.h" #include "world/mapgen.h" #include "title.h" @@ -189,6 +190,7 @@ bool openrct2_initialise() // Hooks to allow RCT2 to call OpenRCT2 functions instead addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0); // remove after all drawing is decompiled addhook(0x006E7499, (int)gfx_redraw_screen_rect, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0); // remove when 0x6E7FF3 is decompiled + addhook(0x006B752C, (int)ride_crash, 0, (int[]){ EDX, EBX, END }, 0); // remove when callers are decompiled if (!rct2_init()) return false; diff --git a/src/ride/ride.c b/src/ride/ride.c index b56c4007e4..6f9263913a 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1707,17 +1707,6 @@ static void ride_update(int 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); @@ -6003,4 +5992,31 @@ void game_command_remove_ride_entrance_or_exit(int *eax, int *ebx, int *ecx, int *edi & 0xFF, *ebx & 0xFF ); -} \ No newline at end of file +} + +/** + * + * rct2: 0x006B752C + */ +void ride_crash(int rideIndex, int vehicleIndex) +{ + rct_ride *ride; + rct_vehicle *vehicle; + rct_window *w; + + // TODO Remove these when hook is no longer used + rideIndex &= 0xFF; + vehicleIndex &= 0xFF; + + ride = GET_RIDE(rideIndex); + vehicle = &(g_sprite_list[ride->vehicles[vehicleIndex]]).vehicle; + + w = window_ride_open_vehicle(vehicle); + if (w->viewport != NULL) { + w->viewport->flags |= VIEWPORT_FLAG_SOUND_ON; + } + + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, rct_string_id) = ride->name; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 2, uint32) = ride->name_arguments; + news_item_add_to_queue(NEWS_ITEM_RIDE, STR_RIDE_HAS_CRASHED, rideIndex); +} diff --git a/src/ride/ride.h b/src/ride/ride.h index 5919c29b5a..6b96976888 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -387,10 +387,7 @@ enum { RIDE_LIFECYCLE_16 = 1 << 16, RIDE_LIFECYCLE_CABLE_LIFT = 1 << 17, RIDE_LIFECYCLE_18 = 1 << 18, - 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 + RIDE_LIFECYCLE_SIX_FLAGS = 1 << 19 }; // Constants used by the ride_type->flags property at 0x008 @@ -960,5 +957,6 @@ void game_command_place_ride_entrance_or_exit(int *eax, int *ebx, int *ecx, int void game_command_remove_ride_entrance_or_exit(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void sub_6CB945(int rideIndex); +void ride_crash(int rideIndex, int vehicleIndex); #endif From fbf3d6af765c5d1c59a0f286fae9fd553f2187ac Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 10 Jul 2015 20:58:09 +0100 Subject: [PATCH 0235/1173] fix #1587 --- src/world/footpath.c | 60 ++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/src/world/footpath.c b/src/world/footpath.c index 1d48661286..7bfdcd40ff 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -45,6 +45,25 @@ const rct_xy16 word_981D6C[4] = { { 0, -1 } }; +// rct2: 0x0097B974 +static const uint16 EntranceDirections[] = { + (4 ), 0, 0, 0, 0, 0, 0, 0, // ENTRANCE_TYPE_RIDE_ENTRANCE, + (4 ), 0, 0, 0, 0, 0, 0, 0, // ENTRANCE_TYPE_RIDE_EXIT, + (4 | 1), 0, 0, 0, 0, 0, 0, 0, // ENTRANCE_TYPE_PARK_ENTRANCE +}; + +static int entrance_get_directions(rct_map_element *mapElement) +{ + uint8 entranceType = mapElement->properties.entrance.type; + uint8 sequence = mapElement->properties.entrance.index & 0x0F; + return EntranceDirections[(entranceType * 8) + sequence]; +} + +static bool entrance_has_direction(rct_map_element *mapElement, int direction) +{ + return entrance_get_directions(mapElement) & (1 << direction); +} + /** * * rct2: 0x006A65AD @@ -591,11 +610,11 @@ void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, if (interactionType == VIEWPORT_INTERACTION_ITEM_RIDE && viewport->flags & (VIEWPORT_FLAG_UNDERGROUND_INSIDE | VIEWPORT_FLAG_HIDE_BASE | VIEWPORT_FLAG_HIDE_VERTICAL) - && map_element_get_type(*mapElement) == MAP_ELEMENT_TYPE_ENTRANCE) { - int ebp = (*mapElement)->properties.entrance.type << 4; - int bl = (*mapElement)->properties.entrance.index & 0xF; - if (RCT2_GLOBAL(0x0097B974 + ebp + bl, uint16) & 0xF) { - int bx = bitscanforward(RCT2_GLOBAL(0x0097B974 + ebp + bl, uint16)); + && map_element_get_type(*mapElement) == MAP_ELEMENT_TYPE_ENTRANCE + ) { + int directions = entrance_get_directions(*mapElement); + if (directions & 0x0F) { + int bx = bitscanforward(directions); bx += (*mapElement)->type; bx &= 3; if (direction != NULL) *direction = bx; @@ -607,11 +626,9 @@ void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, *x = map_pos.x; *y = map_pos.y; if (interactionType == VIEWPORT_INTERACTION_ITEM_RIDE && map_element_get_type(*mapElement) == MAP_ELEMENT_TYPE_ENTRANCE) { - int ebp = (*mapElement)->properties.entrance.type << 4; - int bl = (*mapElement)->properties.entrance.index & 0xF; // Seems to be always 0? - // The table at 0x0097B974 is only 48 bytes big - if (RCT2_GLOBAL(0x0097B974 + ebp + bl, uint16) & 0xF) { - int bx = bitscanforward(RCT2_GLOBAL(0x0097B974 + ebp + bl, uint16)); + int directions = entrance_get_directions(*mapElement); + if (directions & 0x0F) { + int bx = bitscanforward(directions); bx += (*mapElement)->type; // First two bits seem to contain the direction of entrance/exit bx &= 3; if (direction != NULL) *direction = bx; @@ -896,19 +913,16 @@ static void loc_6A6D7E( break; case MAP_ELEMENT_TYPE_ENTRANCE: if (z == mapElement->base_height) { - uint8 cl = (mapElement->properties.entrance.index & 0x0F) | (mapElement->properties.entrance.type << 4); - uint8 al = ((direction - mapElement->type) & 3) ^ 2; - if (!(RCT2_ADDRESS(0x0097B974, uint16)[cl / 2] & (1 << al))) { - return; - } - if (query) { - neighbour_list_push(neighbourList, 8, direction); - } else { - if (mapElement->properties.entrance.type != ENTRANCE_TYPE_PARK_ENTRANCE) { - sub_6A76E9(mapElement->properties.entrance.ride_index); + if (entrance_has_direction(mapElement, ((direction - mapElement->type) & 3) ^ 2)) { + if (query) { + neighbour_list_push(neighbourList, 8, direction); + } else { + if (mapElement->properties.entrance.type != ENTRANCE_TYPE_PARK_ENTRANCE) { + sub_6A76E9(mapElement->properties.entrance.ride_index); + } } + goto loc_6A6FD2; } - goto loc_6A6FD2; } break; } @@ -956,9 +970,7 @@ static void loc_6A6C85( return; if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_ENTRANCE) { - uint16 di = (mapElement->properties.entrance.index & 0x0F) | (mapElement->properties.entrance.type << 4); - uint16 dx = (direction - mapElement->type) & 3; - if (RCT2_ADDRESS(0x0097B974, uint16)[di / 2] & (1 << dx)) { + if (entrance_has_direction(mapElement, (direction - mapElement->type) & 3)) { return; } } From d5ffaefdf087b1cb6a32d30c404947ffafea8295 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 26 Jun 2015 22:40:09 +0100 Subject: [PATCH 0236/1173] add better disable clearance cheat --- data/language/english_uk.txt | 3 ++ projects/openrct2.vcxproj | 2 ++ projects/openrct2.vcxproj.filters | 6 ++++ src/cheats.c | 12 +++++++ src/cheats.h | 9 ++++- src/interface/viewport_interaction.c | 2 +- src/localisation/string_ids.h | 3 ++ src/windows/cheats.c | 2 +- src/windows/footpath.c | 6 ++-- src/windows/map.c | 6 ++-- src/windows/top_toolbar.c | 50 +++++++++++++++++++++++--- src/world/footpath.c | 4 +-- src/world/map.c | 54 ++++++++++++++-------------- 13 files changed, 117 insertions(+), 42 deletions(-) create mode 100644 src/cheats.c diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 52f76a4c94..b2579a7875 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3788,6 +3788,9 @@ STR_5451 :Open cheats window STR_5452 :Toggle visibility of toolbars STR_5453 :Select another ride STR_5454 :Uncap FPS +STR_5455 :Disable clearance checks +STR_5456 :Disable support limits + STR_5458 :Rotate clockwise STR_5459 :Rotate anti-clockwise STR_5460 :Rotate view anti-clockwise diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 84309b2bcf..8a3eeebd10 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -26,6 +26,7 @@ + @@ -185,6 +186,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index d2f78bd6b4..a9d0659525 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -492,6 +492,9 @@ Source\Windows + + Source + @@ -719,5 +722,8 @@ Source\Interface + + Source + \ No newline at end of file diff --git a/src/cheats.c b/src/cheats.c new file mode 100644 index 0000000000..4719dad484 --- /dev/null +++ b/src/cheats.c @@ -0,0 +1,12 @@ +#include "cheats.h" + +bool gCheatsSandboxMode = false; +bool gCheatsDisableClearanceChecks = false; +bool gCheatsDisableSupportLimits = false; + +void cheats_reset() +{ + gCheatsSandboxMode = false; + gCheatsDisableClearanceChecks = false; + gCheatsDisableSupportLimits = false; +} diff --git a/src/cheats.h b/src/cheats.h index 2ef58d5260..c18038de1a 100644 --- a/src/cheats.h +++ b/src/cheats.h @@ -21,5 +21,12 @@ #ifndef _CHEATS_H_ #define _CHEATS_H_ -int gSandboxMode; +#include "common.h" + +extern bool gCheatsSandboxMode; +extern bool gCheatsDisableClearanceChecks; +extern bool gCheatsDisableSupportLimits; + +void cheats_reset(); + #endif diff --git a/src/interface/viewport_interaction.c b/src/interface/viewport_interaction.c index e9e5592fed..9cf87e2a6a 100644 --- a/src/interface/viewport_interaction.c +++ b/src/interface/viewport_interaction.c @@ -301,7 +301,7 @@ int viewport_interaction_get_item_right(int x, int y, viewport_interaction_info return info->type; case VIEWPORT_INTERACTION_ITEM_PARK: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode) + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode) break; if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index c3305bd1be..dc0ec63f9c 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1783,6 +1783,9 @@ enum { STR_SHORTCUT_ROTATE_VIEW_ANTICLOCKWISE = 5460, + STR_DISABLE_CLEARANCE_CHECKS = 5455, + STR_DISABLE_SUPPORT_LIMITS = 5456, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/cheats.c b/src/windows/cheats.c index b9f870b85c..0fe18bd813 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -933,7 +933,7 @@ static void window_cheats_misc_mouseup(rct_window *w, int widgetIndex) window_invalidate_by_class(WC_PARK_INFORMATION); break; case WIDX_SANDBOX_MODE: - gSandboxMode = !gSandboxMode; + gCheatsSandboxMode = !gCheatsSandboxMode; w->widgets[widgetIndex].image = w->widgets[widgetIndex].image == STR_CHEAT_SANDBOX_MODE ? STR_CHEAT_SANDBOX_MODE_DISABLE : STR_CHEAT_SANDBOX_MODE; // To prevent tools from staying active after disabling cheat tool_cancel(); diff --git a/src/windows/footpath.c b/src/windows/footpath.c index c5bfd9586f..ed6fdaf397 100644 --- a/src/windows/footpath.c +++ b/src/windows/footpath.c @@ -209,7 +209,7 @@ void window_footpath_open() // If a restricted path was selected when the game is no longer in Sandbox mode, reset it pathId = RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_PATH_ID, sint16); pathType = g_pathTypeEntries[pathId]; - if((pathType->flags & 4) && !gSandboxMode) { + if((pathType->flags & 4) && !gCheatsSandboxMode) { RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_PATH_ID, sint16) = 0; } @@ -343,7 +343,7 @@ static void window_footpath_dropdown(rct_window *w, int widgetIndex, int dropdow pathId = RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_PATH_ID, sint16); } else { int flags = 4; - if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gSandboxMode) + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gCheatsSandboxMode) flags = 0; j = 0; @@ -581,7 +581,7 @@ static void window_footpath_show_footpath_types_dialog(rct_window *w, rct_widget numPathTypes = 0; flags = 4; // If the game is in sandbox mode, also show paths that are normally restricted to the scenario editor, but not their queues (since these usually shouldn't have one) - if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || (gSandboxMode && !showQueues)) + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || (gCheatsSandboxMode && !showQueues)) flags = 0; for (i = 0; i < 16; i++) { diff --git a/src/windows/map.c b/src/windows/map.c index 3cc06577be..d19a11a47a 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -698,7 +698,7 @@ static void window_map_invalidate(rct_window *w) w->widgets[WIDX_CLOSE].right = w->width - 2 - 11 + 10; w->widgets[WIDX_MAP].right = w->width - 4; - if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gSandboxMode) + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gCheatsSandboxMode) w->widgets[WIDX_MAP].bottom = w->height - 1 - 72; else if (w->selected_tab == PAGE_RIDES) w->widgets[WIDX_MAP].bottom = w->height - 1 - 44; @@ -742,7 +742,7 @@ static void window_map_invalidate(rct_window *w) w->widgets[i].type = WWT_EMPTY; } - if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gSandboxMode) { + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gCheatsSandboxMode) { // scenario editor: build park entrance selected, show rotate button if ( (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && @@ -813,7 +813,7 @@ static void window_map_paint(rct_window *w, rct_drawpixelinfo *dpi) gfx_draw_sprite(dpi, 0x0B6E0190A, x, y, 0); } - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode) { // Render the map legend if (w->selected_tab == PAGE_RIDES) { x = w->x + 4; diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 1006bcf4f8..78b1efe83f 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "../addresses.h" +#include "../cheats.h" #include "../config.h" #include "../editor.h" #include "../game.h" @@ -101,6 +102,12 @@ typedef enum { DDIDX_OBJECT_SELECTION = 2 } TOP_TOOLBAR_DEBUG_DDIDX; +enum { + DDIDX_CHEATS, + DDIDX_DISABLE_CLEARANCE_CHECKS = 2, + DDIDX_DISABLE_SUPPORT_LIMITS +}; + #pragma region Toolbar_widget_ordering // from left to right @@ -311,9 +318,6 @@ static void window_top_toolbar_mouseup(rct_window *w, int widgetIndex) case WIDX_RESEARCH: window_research_open(); break; - case WIDX_CHEATS: - window_cheats_open(); - break; } } @@ -390,6 +394,28 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg gDropdownItemsChecked |= (1 << 11); #endif break; + case WIDX_CHEATS: + gDropdownItemsFormat[0] = 1156; + gDropdownItemsFormat[1] = 0; + gDropdownItemsFormat[2] = 1156; + gDropdownItemsFormat[3] = 1156; + gDropdownItemsArgs[0] = 5217; + gDropdownItemsArgs[2] = STR_DISABLE_CLEARANCE_CHECKS; + gDropdownItemsArgs[3] = STR_DISABLE_SUPPORT_LIMITS; + window_dropdown_show_text( + w->x + widget->left, + w->y + widget->top, + widget->bottom - widget->top + 1, + w->colours[0] | 0x80, + 0, + 4 + ); + if (gCheatsDisableClearanceChecks) + gDropdownItemsChecked |= (1 << DDIDX_DISABLE_CLEARANCE_CHECKS); + if (gCheatsDisableSupportLimits) + gDropdownItemsChecked |= (1 << DDIDX_DISABLE_SUPPORT_LIMITS); + RCT2_GLOBAL(0x009DEBA2, uint16) = 0; + break; case WIDX_VIEW_MENU: top_toolbar_init_view_menu(w, widget); break; @@ -410,7 +436,7 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg w->colours[1] | 0x80, 0, numItems - ); + ); RCT2_GLOBAL(0x009DEBA2, uint16) = 0; break; case WIDX_FASTFORWARD: @@ -426,7 +452,7 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg } /** - * + * * rct2: 0x0066C9EA */ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -476,6 +502,20 @@ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int drop #endif } break; + case WIDX_CHEATS: + if (dropdownIndex == -1) dropdownIndex = RCT2_GLOBAL(0x009DEBA2, uint16); + switch (dropdownIndex) { + case DDIDX_CHEATS: + window_cheats_open(); + break; + case DDIDX_DISABLE_CLEARANCE_CHECKS: + gCheatsDisableClearanceChecks = !gCheatsDisableClearanceChecks; + break; + case DDIDX_DISABLE_SUPPORT_LIMITS: + gCheatsDisableSupportLimits = !gCheatsDisableSupportLimits; + break; + } + break; case WIDX_VIEW_MENU: top_toolbar_view_menu_dropdown(dropdownIndex); break; diff --git a/src/world/footpath.c b/src/world/footpath.c index 7bfdcd40ff..c62b1ca0f8 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -337,7 +337,7 @@ static money32 footpath_place_real(int type, int x, int y, int z, int slope, int return MONEY32_UNDEFINED; } - if (!((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gSandboxMode) && !map_is_location_owned(x, y, z * 8)) + if (!((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gCheatsSandboxMode) && !map_is_location_owned(x, y, z * 8)) return MONEY32_UNDEFINED; if (slope & 8) { @@ -391,7 +391,7 @@ money32 footpath_remove_real(int x, int y, int z, int flags) footpath_remove_litter(x, y, z * 8); } - if (!((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gSandboxMode) && !map_is_location_owned(x, y, z * 8)) + if (!((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gCheatsSandboxMode) && !map_is_location_owned(x, y, z * 8)) return MONEY32_UNDEFINED; mapElement = map_get_footpath_element(x / 32, y / 32, z); diff --git a/src/world/map.c b/src/world/map.c index 0f7b5c7f6e..85b9c42d59 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -690,7 +690,7 @@ void game_command_remove_scenery(int* eax, int* ebx, int* ecx, int* edx, int* es return; } - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !(*ebx & 0x40) && !gSandboxMode) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !(*ebx & 0x40) && !gCheatsSandboxMode) { // Check if allowed to remove item if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_FORBID_TREE_REMOVAL) { if (entry->small_scenery.height > 64) { @@ -808,7 +808,7 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i currentTile.y += firstTile.y; currentTile.z += firstTile.z; - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode){ + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode){ if (!map_is_location_owned(currentTile.x, currentTile.y, currentTile.z)){ *ebx = MONEY32_UNDEFINED; return; @@ -873,7 +873,7 @@ void game_command_remove_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi *ebx = MONEY32_UNDEFINED; return; } - if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode && !map_is_location_owned(x, y, z - 16)){ + if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode && !map_is_location_owned(x, y, z - 16)){ *ebx = MONEY32_UNDEFINED; return; } @@ -918,7 +918,7 @@ void game_command_set_scenery_colour(int* eax, int* ebx, int* ecx, int* edx, int RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; RCT2_GLOBAL(0x009DEA62, uint16) = z; - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode){ + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode){ if (!map_is_location_owned(x, y, z)){ *ebx = MONEY32_UNDEFINED; return; @@ -969,7 +969,7 @@ void game_command_set_fence_colour(int* eax, int* ebx, int* ecx, int* edx, int* RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; RCT2_GLOBAL(0x009DEA62, uint16) = z; - if((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || map_is_location_in_park(x, y) || gSandboxMode){ + if((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || map_is_location_in_park(x, y) || gCheatsSandboxMode){ rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); while(map_element_get_type(map_element) != MAP_ELEMENT_TYPE_FENCE || map_element->base_height != base_height || @@ -1094,7 +1094,7 @@ void game_command_set_large_scenery_colour(int* eax, int* ebx, int* ecx, int* ed x3 += x2; y3 += y2; z3 += z2; - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode){ + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode){ if (!map_is_location_owned(x3, y3, z3)){ *ebx = MONEY32_UNDEFINED; return; @@ -1138,7 +1138,7 @@ void game_command_set_banner_colour(int* eax, int* ebx, int* ecx, int* edx, int* RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; RCT2_GLOBAL(0x009DEA62, uint16) = z; - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode){ + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode){ if (!map_is_location_owned(x, y, z - 16)){ *ebx = MONEY32_UNDEFINED; return; @@ -1346,7 +1346,7 @@ money32 map_change_surface_style(int x0, int y0, int x1, int y1, uint8 surfaceSt return (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) ? 0 : cost; } - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode && RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_FORBID_LANDSCAPE_CHANGES) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode && RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_FORBID_LANDSCAPE_CHANGES) { cost += RCT2_GLOBAL(0x009E32B4, uint32); return (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) ? 0 : cost; } @@ -1356,7 +1356,7 @@ money32 map_change_surface_style(int x0, int y0, int x1, int y1, uint8 surfaceSt if (x > 0x1FFF) continue; if (y > 0x1FFF) continue; - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode) { if (!map_is_location_in_park(x, y)) continue; } @@ -1464,7 +1464,7 @@ static money32 sub_66397F(int flags, int x, int y, int height, int style, int se return MONEY32_UNDEFINED; } - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode) { if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_FORBID_LANDSCAPE_CHANGES) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_FORBIDDEN_BY_THE_LOCAL_AUTHORITY; return MONEY32_UNDEFINED; @@ -1494,7 +1494,7 @@ static money32 sub_66397F(int flags, int x, int y, int height, int style, int se return MONEY32_UNDEFINED; } - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode) { if (!map_is_location_in_park(x, y)) { return MONEY32_UNDEFINED; } @@ -1924,7 +1924,7 @@ void game_command_remove_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, *ebx = MONEY32_UNDEFINED; return; } - if(!(*ebx & 0x40) && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode && !map_is_location_owned(x, y, base_height * 8)){ + if(!(*ebx & 0x40) && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode && !map_is_location_owned(x, y, base_height * 8)){ *ebx = MONEY32_UNDEFINED; return; } @@ -1982,7 +1982,7 @@ void game_command_place_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi, return; } } - if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode && !map_is_location_owned(x, y, base_height * 16)){ + if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode && !map_is_location_owned(x, y, base_height * 16)){ *ebx = MONEY32_UNDEFINED; return; } @@ -2093,7 +2093,7 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi if(F64EC8 == 0){ F64EC8 = base_height2; } - if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode && !map_is_location_owned(x, y, F64EC8)){ + if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode && !map_is_location_owned(x, y, F64EC8)){ *ebx = MONEY32_UNDEFINED; return; } @@ -2107,7 +2107,7 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi while(map_element_get_type(map_element) != MAP_ELEMENT_TYPE_SURFACE){ map_element++; } - if(map_element->properties.surface.terrain & 0x1F){ + if(!gCheatsDisableClearanceChecks && (map_element->properties.surface.terrain & 0x1F)){ int water_height = ((map_element->properties.surface.terrain & 0x1F) * 16) - 1; if(water_height > F64EC8){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CANT_BUILD_THIS_UNDERWATER; @@ -2115,7 +2115,7 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi return; } } - if(!(scenery_entry->small_scenery.flags & SMALL_SCENERY_FLAG18)){ + if(!gCheatsDisableClearanceChecks && !(scenery_entry->small_scenery.flags & SMALL_SCENERY_FLAG18)){ if(F64F1D != 0){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CAN_ONLY_BUILD_THIS_ON_LAND; *ebx = MONEY32_UNDEFINED; @@ -2129,7 +2129,7 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi } } } - if(!(scenery_entry->small_scenery.flags & SMALL_SCENERY_FLAG_REQUIRE_FLAT_SURFACE) || z != 0 || F64F1D != 0 || !(map_element->properties.surface.slope & 0x1F)){ + if(gCheatsDisableClearanceChecks || !(scenery_entry->small_scenery.flags & SMALL_SCENERY_FLAG_REQUIRE_FLAT_SURFACE) || z != 0 || F64F1D != 0 || !(map_element->properties.surface.slope & 0x1F)){ if(scenery_entry->small_scenery.flags & SMALL_SCENERY_FLAG18 || z == 0){ l_6E0B78: ; int bp = quadrant; @@ -2171,7 +2171,7 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi RCT2_GLOBAL(0x00F64F22, uint16) = x; RCT2_GLOBAL(0x00F64F24, uint16) = y; RCT2_GLOBAL(0x00F64F1E, uint32) = (uint32)(ebx - 1); //0x006E0D6E uses [F64F1E+4] to read ebx value - if(map_can_construct_with_clear_at(x, y, zLow, zHigh, (void*)0x006E0D6E, bl)){ + if(gCheatsDisableClearanceChecks || map_can_construct_with_clear_at(x, y, zLow, zHigh, (void*)0x006E0D6E, bl)){ RCT2_GLOBAL(0x00F64F14, uint8) = RCT2_GLOBAL(0x00F1AD60, uint8) & 0x3; if(*ebx & GAME_COMMAND_FLAG_APPLY){ int flags = (bl & 0xf); @@ -2282,7 +2282,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, } if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && - !(flags & (1 << 7)) && !gSandboxMode){ + !(flags & (1 << 7)) && !gCheatsSandboxMode){ if (position.z == 0){ if (!map_is_location_in_park(position.x, position.y)){ @@ -2435,7 +2435,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, } RCT2_GLOBAL(0x00141F722, uint8) += fence->wall.height; - if (!(flags & (1 << 7))){ + if (!(flags & (1 << 7)) && !gCheatsDisableClearanceChecks){ if (!sub_6E5C1A(fence, position.x, position.y, edge, RCT2_GLOBAL(0x00141F721, uint8), RCT2_GLOBAL(0x00141F722, uint8))) { *ebx = MONEY32_UNDEFINED; return; @@ -2625,13 +2625,15 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in RCT2_GLOBAL(0x00F43892, sint16) = x2; RCT2_GLOBAL(0x00F43894, sint16) = y2; RCT2_GLOBAL(0x00F43896, uint32) = (uint32)(ebx - 3); // this is how ebx flags var is passed to 0x006B8D88 - if(map_can_construct_with_clear_at(x2, y2, zLow, zHigh, (void*)0x006B8D88, bl)){ + if(gCheatsDisableClearanceChecks || map_can_construct_with_clear_at(x2, y2, zLow, zHigh, (void*)0x006B8D88, bl)){ if(!(RCT2_GLOBAL(0x00F1AD60, uint8) & 4) && !(RCT2_GLOBAL(0x00F1AD60, uint8) & 2)){ int b = RCT2_GLOBAL(0x00F1AD60, uint8) & 0x3; - if(RCT2_GLOBAL(0x00F64F14, uint8) && !(RCT2_GLOBAL(0x00F64F14, uint8) & b)){ - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND; - *ebx = MONEY32_UNDEFINED; - return; + if (!gCheatsDisableClearanceChecks) { + if (RCT2_GLOBAL(0x00F64F14, uint8) && !(RCT2_GLOBAL(0x00F64F14, uint8) & b)){ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND; + *ebx = MONEY32_UNDEFINED; + return; + } } RCT2_GLOBAL(0x00F64F14, uint8) = b; if(x2 >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) || y2 >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16)){ @@ -2639,7 +2641,7 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in *ebx = MONEY32_UNDEFINED; return; } - if((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || map_is_location_owned(x2, y2, zLow * 8) || gSandboxMode){ + if((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || map_is_location_owned(x2, y2, zLow * 8) || gCheatsSandboxMode){ if(*ebx & GAME_COMMAND_FLAG_APPLY){ if(!(*ebx & 0x40)){ footpath_remove_litter(x2, y2, zLow * 8); From 4d56572fd45741393fbd80dd4f32cc535eb21bb3 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 27 Jun 2015 09:52:00 +0100 Subject: [PATCH 0237/1173] Fix large scenery ghost issue. --- src/world/map.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 85b9c42d59..a040e39f18 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -765,6 +765,10 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i if ((map_element->type & MAP_ELEMENT_DIRECTION_MASK) != map_element_direction) continue; + // If we are removing ghost elements + if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)) + continue; + element_found = 1; break; } while (!map_element_is_last_for_tile(map_element++)); @@ -774,11 +778,6 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i return; } - if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)){ - *ebx = 0; - return; - } - map_element_remove_banner_entry(map_element); int ecx2 = map_element->properties.scenerymultiple.type >> 10; @@ -835,6 +834,10 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i if (sceneryElement->base_height != currentTile.z / 8) continue; + // If we are removing ghost elements + if ((*ebx & 0x40) && !(sceneryElement->flags & MAP_ELEMENT_FLAG_GHOST)) + continue; + map_invalidate_tile_full(currentTile.x, currentTile.y); map_element_remove(sceneryElement); tile_not_found = 0; From 4fceb2801711e54b12fea8dd7a42743fce69c3f1 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 2 Jul 2015 19:02:59 +0100 Subject: [PATCH 0238/1173] fix sandbox variable rename --- src/world/map.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index a040e39f18..845554e4b2 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1840,7 +1840,7 @@ void game_command_set_water_height(int* eax, int* ebx, int* ecx, int* edx, int* *ebx = MONEY32_UNDEFINED; return; } - if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode && RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_FORBID_LANDSCAPE_CHANGES){ + if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode && RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_FORBID_LANDSCAPE_CHANGES){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_FORBIDDEN_BY_THE_LOCAL_AUTHORITY; *ebx = MONEY32_UNDEFINED; return; @@ -1864,7 +1864,7 @@ void game_command_set_water_height(int* eax, int* ebx, int* ecx, int* edx, int* return; } - if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gSandboxMode && !map_is_location_in_park(x, y)){ + if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode && !map_is_location_in_park(x, y)){ *ebx = MONEY32_UNDEFINED; return; } From 9c8be6a483f9ea0d8304256a6342654add872fc1 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 2 Jul 2015 19:25:04 +0100 Subject: [PATCH 0239/1173] allow disable clearance checks for footpaths --- data/language/english_uk.txt | 6 +++--- src/localisation/string_ids.h | 5 +++-- src/windows/top_toolbar.c | 16 ++++++++++++---- src/world/footpath.c | 6 +++--- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index b2579a7875..2fdada2e4f 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3788,9 +3788,9 @@ STR_5451 :Open cheats window STR_5452 :Toggle visibility of toolbars STR_5453 :Select another ride STR_5454 :Uncap FPS -STR_5455 :Disable clearance checks -STR_5456 :Disable support limits - +STR_5455 :Enable sandbox mode +STR_5456 :Disable clearance checks +STR_5457 :Disable support limits STR_5458 :Rotate clockwise STR_5459 :Rotate anti-clockwise STR_5460 :Rotate view anti-clockwise diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index dc0ec63f9c..f40045cd55 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1783,8 +1783,9 @@ enum { STR_SHORTCUT_ROTATE_VIEW_ANTICLOCKWISE = 5460, - STR_DISABLE_CLEARANCE_CHECKS = 5455, - STR_DISABLE_SUPPORT_LIMITS = 5456, + STR_ENABLE_SANDBOX_MODE = 5455, + STR_DISABLE_CLEARANCE_CHECKS = 5456, + STR_DISABLE_SUPPORT_LIMITS = 5457, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 78b1efe83f..b89fa750fa 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -104,7 +104,8 @@ typedef enum { enum { DDIDX_CHEATS, - DDIDX_DISABLE_CLEARANCE_CHECKS = 2, + DDIDX_ENABLE_SANDBOX_MODE = 2, + DDIDX_DISABLE_CLEARANCE_CHECKS, DDIDX_DISABLE_SUPPORT_LIMITS }; @@ -399,17 +400,21 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg gDropdownItemsFormat[1] = 0; gDropdownItemsFormat[2] = 1156; gDropdownItemsFormat[3] = 1156; + gDropdownItemsFormat[4] = 1156; gDropdownItemsArgs[0] = 5217; - gDropdownItemsArgs[2] = STR_DISABLE_CLEARANCE_CHECKS; - gDropdownItemsArgs[3] = STR_DISABLE_SUPPORT_LIMITS; + gDropdownItemsArgs[2] = STR_ENABLE_SANDBOX_MODE; + gDropdownItemsArgs[3] = STR_DISABLE_CLEARANCE_CHECKS; + gDropdownItemsArgs[4] = STR_DISABLE_SUPPORT_LIMITS; window_dropdown_show_text( w->x + widget->left, w->y + widget->top, widget->bottom - widget->top + 1, w->colours[0] | 0x80, 0, - 4 + 5 ); + if (gCheatsSandboxMode) + gDropdownItemsChecked |= (1 << DDIDX_ENABLE_SANDBOX_MODE); if (gCheatsDisableClearanceChecks) gDropdownItemsChecked |= (1 << DDIDX_DISABLE_CLEARANCE_CHECKS); if (gCheatsDisableSupportLimits) @@ -508,6 +513,9 @@ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int drop case DDIDX_CHEATS: window_cheats_open(); break; + case DDIDX_ENABLE_SANDBOX_MODE: + gCheatsSandboxMode = !gCheatsSandboxMode; + break; case DDIDX_DISABLE_CLEARANCE_CHECKS: gCheatsDisableClearanceChecks = !gCheatsDisableClearanceChecks; break; diff --git a/src/world/footpath.c b/src/world/footpath.c index c62b1ca0f8..9eda6403f9 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -168,11 +168,11 @@ static money32 footpath_element_insert(int type, int x, int y, int z, int slope, // 0x006A6733 expects the flags to be at (*0xF3EF7C) + 8 RCT2_GLOBAL(0x00F3EF7C, uint32) = (uint32)(&flags - 2); - if (!map_can_construct_with_clear_at(x, y, z, zHigh, (void*)0x006A6733, bl)) + if (!gCheatsDisableClearanceChecks && !map_can_construct_with_clear_at(x, y, z, zHigh, (void*)0x006A6733, bl)) return MONEY32_UNDEFINED; RCT2_GLOBAL(0x00F3EFA4, uint8) = RCT2_GLOBAL(0x00F1AD60, uint8); - if (RCT2_GLOBAL(0x00F1AD60, uint8) & 4) { + if (!gCheatsDisableClearanceChecks && (RCT2_GLOBAL(0x00F1AD60, uint8) & 4)) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CANT_BUILD_THIS_UNDERWATER; return MONEY32_UNDEFINED; } @@ -868,7 +868,7 @@ static void loc_6A6D7E( ) { int x = initialX + TileDirectionDelta[direction].x; int y = initialY + TileDirectionDelta[direction].y; - if (((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gSandboxMode) && map_is_edge(x, y)) { + if (((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gCheatsSandboxMode) && map_is_edge(x, y)) { if (query) { neighbour_list_push(neighbourList, 7, direction); } From da3be49f342a5aa318cae887d9a6b26f3104b160 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 2 Jul 2015 21:18:36 +0100 Subject: [PATCH 0240/1173] update sandbox icon --- resources/g2/33.png | Bin 0 -> 506 bytes src/sprites.h | 2 ++ src/windows/top_toolbar.c | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 resources/g2/33.png diff --git a/resources/g2/33.png b/resources/g2/33.png new file mode 100644 index 0000000000000000000000000000000000000000..c6d2c04941c9c2f223b32ce5abe327cff100f7aa GIT binary patch literal 506 zcmVs30001uP)t-s0000N zBO@~}08dK`KRW|KLA532S;x!Z%Y@q+h?QikAs(&S33)TS08UP0F%2@i{Eq8+uOIp!=JCO zOJieqdoPEdUz5kDLt9&0b8~NlgF9a*KT}hWV<#^|Lv|-+5&!@I0d!JMQvg8b*k%9# z0UJp~K~#7FwUB>LgD?<=cWr5RY_%OaJYB28P{)LQ|BvUDEHV7p{_{cz$;0!$?X9i@ zLJC;j9uNR`IDpF3Z4M&SW_?FDXjJ0M9js%%VW_u@`dV7nGeq;Ss4IukTEAP?K@`?$ zw1{rAa514CCF0K8xt^d@N})sasHb|Ol6kK2$)h*>S@D3CcBs9>VL>p_%~iLk_uN;G zb^c+{k@aUNiDvDRb&dYz^#By&ti8zJw0r-k>SF_uCWlvfQRJUr-*r{hNuMm0={U6n2;-9{d|`ayP>Kx0xSP`;!IF9=L?M(T w7-G+FihUydlz(`D6nParaV~!(zWU$!1@VFv(5fDP0ssI207*qoM6N<$f`e(;Z~y=R literal 0 HcmV?d00001 diff --git a/src/sprites.h b/src/sprites.h index 1118cd3f7f..337fef7c8e 100644 --- a/src/sprites.h +++ b/src/sprites.h @@ -385,6 +385,8 @@ enum { SPR_G2_TITLE_STOP = SPR_G2_BEGIN + 30, SPR_G2_TITLE_PLAY = SPR_G2_BEGIN + 31, SPR_G2_TITLE_SKIP = SPR_G2_BEGIN + 32, + + SPR_G2_SANDBOX = SPR_G2_BEGIN + 33, }; #endif diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index b89fa750fa..0f2f0114cc 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -171,7 +171,7 @@ static rct_widget window_top_toolbar_widgets[] = { { WWT_TRNBTN, 0, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 5148 }, // Fast forward { WWT_TRNBTN, 0, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 5149 }, // Cheats - { WWT_TRNBTN, 0, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_DEBUG_TIP }, // Debug + { WWT_TRNBTN, 0, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_DEBUG_TIP }, // Debug { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 3235 }, // Finances { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 2275 }, // Research @@ -752,7 +752,7 @@ static void window_top_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi) y = w->y + window_top_toolbar_widgets[WIDX_CHEATS].top - 1; if (widget_is_pressed(w, WIDX_CHEATS)) y++; - imgId = SPR_TAB_OBJECTIVE_0; + imgId = SPR_G2_SANDBOX; gfx_draw_sprite(dpi, imgId, x, y, 3); } From 529a4da8e3b4de33c76bf572e3dfc81269a8ff8a Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Fri, 3 Jul 2015 22:58:37 +0100 Subject: [PATCH 0241/1173] Added zero clearance to track placement. Due to how track placement works you need to hold down shift when placing the track. Ignore the ghost placement. Also disable support limits is enabled. --- src/ride/track.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index a07217f466..752e7c26fb 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3609,8 +3609,9 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in RCT2_GLOBAL(0x00F44060, void*) = &clearance_struct; - if (!map_can_construct_with_clear_at(x, y, baseZ, clearanceZ, (void*)0x006C5A5F, bl)) { - return MONEY32_UNDEFINED; + if (!gCheatsDisableClearanceChecks || flags & (1 << 6)){ + if (!map_can_construct_with_clear_at(x, y, baseZ, clearanceZ, (void*)0x006C5A5F, bl)) + return MONEY32_UNDEFINED; } // Again when 0x006C5A5F implemented remove this. cost = clearance_struct.cost; @@ -3741,16 +3742,18 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in } //6c5648 12 push mapElement = map_get_surface_element_at(x / 32, y / 32); - int ride_height = clearanceZ - mapElement->base_height; - if (ride_height >= 0) { - int maxHeight = rideEntry->max_height; - if (maxHeight == 0) { - maxHeight = RCT2_GLOBAL(0x0097D218 + (ride->type * 8), uint8); - } - ride_height /= 2; - if (ride_height > maxHeight && !(RCT2_GLOBAL(0x009D8150, uint8) & 1)) { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_HIGH_FOR_SUPPORTS; - return MONEY32_UNDEFINED; + if (!gCheatsDisableSupportLimits){ + int ride_height = clearanceZ - mapElement->base_height; + if (ride_height >= 0) { + int maxHeight = rideEntry->max_height; + if (maxHeight == 0) { + maxHeight = RCT2_GLOBAL(0x0097D218 + (ride->type * 8), uint8); + } + ride_height /= 2; + if (ride_height > maxHeight && !(RCT2_GLOBAL(0x009D8150, uint8) & 1)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_HIGH_FOR_SUPPORTS; + return MONEY32_UNDEFINED; + } } } From c80475f7dbf9cc07946b92e9d6908eb996eb2da2 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 2 Jul 2015 19:25:04 +0100 Subject: [PATCH 0242/1173] allow disable clearance checks for footpaths --- data/language/english_uk.txt | 3 +++ src/localisation/string_ids.h | 13 +++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 2fdada2e4f..f32156e242 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3791,6 +3791,7 @@ STR_5454 :Uncap FPS STR_5455 :Enable sandbox mode STR_5456 :Disable clearance checks STR_5457 :Disable support limits +<<<<<<< HEAD STR_5458 :Rotate clockwise STR_5459 :Rotate anti-clockwise STR_5460 :Rotate view anti-clockwise @@ -3800,3 +3801,5 @@ STR_5463 :Goal: Have fun! STR_5464 :General STR_5465 :Climate STR_5466 :Staff +======= +>>>>>>> allow disable clearance checks for footpaths diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index f40045cd55..e367ce7d39 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1774,6 +1774,13 @@ enum { STR_SHORTCUT_TOGGLE_VISIBILITY_OF_TOOLBARS = 5452, STR_SELECT_OTHER_RIDE = 5453, + + STR_ENABLE_SANDBOX_MODE = 5455, + STR_DISABLE_CLEARANCE_CHECKS = 5456, + STR_DISABLE_SUPPORT_LIMITS = 5457, + + STR_SHORTCUT_ROTATE_VIEW_ANTICLOCKWISE = 5460, + STR_CHEAT_SET_GUESTS_PARAMETERS = 5461, STR_CHEAT_CURRENCY_FORMAT = 5462, STR_CHEAT_HAVE_FUN = 5463, @@ -1781,12 +1788,6 @@ enum { STR_CHEAT_CLIMATE_GROUP = 5465, STR_CHEAT_STAFF_GROUP = 5466, - STR_SHORTCUT_ROTATE_VIEW_ANTICLOCKWISE = 5460, - - STR_ENABLE_SANDBOX_MODE = 5455, - STR_DISABLE_CLEARANCE_CHECKS = 5456, - STR_DISABLE_SUPPORT_LIMITS = 5457, - // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; From 38986c585241b9e7912b37e0cf1f87bed1048138 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 5 Jul 2015 12:19:59 +0100 Subject: [PATCH 0243/1173] Added sandbox mode and pause cheats to track place/remove --- src/ride/track.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index 752e7c26fb..3479b7d600 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3478,7 +3478,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in return MONEY32_UNDEFINED; } if (!(flags & (1 << 3))) { - if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0) { + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; return MONEY32_UNDEFINED; } @@ -3637,7 +3637,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in } } - if (!map_is_location_owned(x, y, z)) { + if (!map_is_location_owned(x, y, z) && !gCheatsSandboxMode) { return MONEY32_UNDEFINED; } @@ -3946,7 +3946,7 @@ money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, break; } - if (!(flags & (1 << 3)) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0){ + if (!(flags & (1 << 3)) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 2214; return MONEY32_UNDEFINED; } From fef4a25177b7f5eb3aa55332b606dc1847e0047e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 10 Jul 2015 21:47:39 +0100 Subject: [PATCH 0244/1173] add sandbox and clearance cheats for ride entrance / exit --- src/ride/ride.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 6f9263913a..2e83c14e4f 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -21,6 +21,7 @@ #include "../addresses.h" #include "../audio/audio.h" #include "../audio/mixer.h" +#include "../cheats.h" #include "../common.h" #include "../config.h" #include "../game.h" @@ -5750,7 +5751,7 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio if (flags & GAME_COMMAND_FLAG_APPLY) return MONEY32_UNDEFINED; - if (!map_is_location_owned(x, y, z)){ + if (!gCheatsSandboxMode && !map_is_location_owned(x, y, z)){ return MONEY32_UNDEFINED; } @@ -5761,7 +5762,7 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio // Horrible hack until map_can_construct_with_clear_at is implemented. RCT2_GLOBAL(0x009E32C8, uint8*) = (&flags) - 4; - if (!map_can_construct_with_clear_at(x, y, z / 8, clear_z, (void*)0x0066637E, 0xF)){ + if (!gCheatsDisableClearanceChecks && !map_can_construct_with_clear_at(x, y, z / 8, clear_z, (void*)0x0066637E, 0xF)){ return MONEY32_UNDEFINED; } @@ -5844,7 +5845,7 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio map_remove_walls_at_z(x, y, z); } - if (!map_is_location_owned(x, y, z)){ + if (!gCheatsSandboxMode && !map_is_location_owned(x, y, z)){ return MONEY32_UNDEFINED; } @@ -5855,7 +5856,7 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio // Horrible hack until map_can_construct_with_clear_at is implemented. RCT2_GLOBAL(0x009E32C8, uint8*) = (&flags) - 4; - if (!map_can_construct_with_clear_at(x, y, z / 8, clear_z, (void*)0x0066637E, 0xF)){ + if (!gCheatsDisableClearanceChecks && !map_can_construct_with_clear_at(x, y, z / 8, clear_z, (void*)0x0066637E, 0xF)){ return MONEY32_UNDEFINED; } From 11a98d2e232cfdb79e4fc556f925fe98037a3d76 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Fri, 10 Jul 2015 20:13:19 -0600 Subject: [PATCH 0245/1173] better solution to #1572 --- src/openrct2.c | 5 ----- src/rct2.c | 8 +++----- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/openrct2.c b/src/openrct2.c index bcada4e0dc..b6a5dcb8fe 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -330,11 +330,6 @@ static void openrct2_loop() invalidate_sprite(&g_sprite_list[i]); } - // Viewports need to be updated to reduce chopiness of those which follow sprites - for (rct_window *w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++) { - viewport_update_sprite_follow(w); - } - platform_process_messages(); rct2_draw(); platform_draw(); diff --git a/src/rct2.c b/src/rct2.c index b5b475e126..b9a231003d 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -218,7 +218,9 @@ void rct2_draw() { // Handles picked-up peep and rain redraw redraw_peep_and_rain(); - + window_update_all(); + update_rain_animation(); + update_palette_effects(); gfx_draw_all_dirty_blocks(); console_draw(RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo)); @@ -231,10 +233,6 @@ void rct2_draw() } else { //game } - - window_update_all(); - update_rain_animation(); - update_palette_effects(); } int rct2_open_file(const char *path) From a58458bbb3fa9d1b7dac0ea6f69579ea9a418b64 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Fri, 10 Jul 2015 20:50:31 -0600 Subject: [PATCH 0246/1173] fix issue with negative dirty blocks --- src/drawing/drawing.c | 2 +- src/drawing/drawing.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index cb75ded2b0..00d5ef84c4 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -211,7 +211,7 @@ uint8* gfx_get_dirty_blocks() * right (dx) * bottom (bp) */ -void gfx_set_dirty_blocks(uint16 left, uint16 top, uint16 right, uint16 bottom) +void gfx_set_dirty_blocks(sint16 left, sint16 top, sint16 right, sint16 bottom) { int x, y; uint8 *screenDirtyBlocks = gfx_get_dirty_blocks(); diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index a6269c8f01..97ec0b81e1 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -80,7 +80,7 @@ extern rct_gx g2; // rct_drawpixelinfo* clip_drawpixelinfo(rct_drawpixelinfo* dpi, int left, int width, int top, int height); -void gfx_set_dirty_blocks(uint16 left, uint16 top, uint16 right, uint16 bottom); +void gfx_set_dirty_blocks(sint16 left, sint16 top, sint16 right, sint16 bottom); void gfx_draw_all_dirty_blocks(); void gfx_redraw_screen_rect(short left, short top, short right, short bottom); void gfx_invalidate_screen(); From a1e67fd1064eaee6418003f51a45553253c7f227 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 11 Jul 2015 04:00:40 +0100 Subject: [PATCH 0247/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 1217 +++++++++++++------------ data/language/dutch.txt | 22 +- data/language/german.txt | 25 +- 3 files changed, 649 insertions(+), 615 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 5e43a7e846..b7bd4c908c 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -8,15 +8,15 @@ STR_0003 :Stand-up Roller Coaster STR_0004 :Suspended Swinging Coaster STR_0005 :Inverted Roller Coaster STR_0006 :Junior Roller Coaster -STR_0007 :Miniature Railway +STR_0007 :Miniature Railroad STR_0008 :Monorail STR_0009 :Mini Suspended Coaster -STR_0010 :Boat Ride +STR_0010 :Boat Hire STR_0011 :Wooden Wild Mouse STR_0012 :Steeplechase STR_0013 :Car Ride STR_0014 :Launched Freefall -STR_0015 :Bobsleigh Coaster +STR_0015 :Bobsled Coaster STR_0016 :Observation Tower STR_0017 :Looping Roller Coaster STR_0018 :Dinghy Slide @@ -28,7 +28,7 @@ STR_0023 :Spiral Slide STR_0024 :Go Karts STR_0025 :Log Flume STR_0026 :River Rapids -STR_0027 :Dodgems +STR_0027 :Bumper Cars STR_0028 :Pirate Ship STR_0029 :Swinging Inverter Ship STR_0030 :Food Stall @@ -36,25 +36,25 @@ STR_0031 :Unknown Stall (1D) STR_0032 :Drink Stall STR_0033 :Unknown Stall (1F) STR_0034 :Shop -STR_0035 :Merry-Go-Round +STR_0035 :Carousel STR_0036 :Unknown Stall (22) STR_0037 :Information Kiosk -STR_0038 :Toilets +STR_0038 :Restroom STR_0039 :Ferris Wheel STR_0040 :Motion Simulator -STR_0041 :3D Cinema +STR_0041 :3D Theater STR_0042 :Top Spin STR_0043 :Space Rings STR_0044 :Reverse Freefall Coaster -STR_0045 :Lift +STR_0045 :Elevator STR_0046 :Vertical Drop Roller Coaster -STR_0047 :Cash Machine +STR_0047 :ATM STR_0048 :Twist STR_0049 :Haunted House STR_0050 :First Aid Room STR_0051 :Circus Show -STR_0052 :Ghost Train -STR_0053 :Twister Roller Coaster +STR_0052 :Tunnel Of Horror +STR_0053 :Steel Twister Roller Coaster STR_0054 :Wooden Roller Coaster STR_0055 :Side-Friction Roller Coaster STR_0056 :Wild Mouse @@ -514,23 +514,23 @@ STR_0509 : STR_0510 : STR_0511 : STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. -STR_0513 :平順鋼脯軌道有垂直站轉能力的雲霄飛車 +STR_0513 :A looping roller coaster where the riders ride in a standing position STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides -STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track -STR_0518 :Passengers travel in electric trains along a monorail track +STR_0517 :乘客乘坐於小型火車延著窄軌鐵道行走 +STR_0518 :乘客乘坐於電氣化列車延著單軌鐵路行走 STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners -STR_0520 :A dock platform where 遊客s can drive/row personal watercraft on a body of water +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them STR_0523 :Riders travel slowly in powered vehicles along a track-based route -STR_0524 : +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track -STR_0526 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0526 :Passengers travel in an rotating observation cabin which travels up a tall tower STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track -STR_0529 :Mine train themes roller coaster trains career along steel roller coaster track made to look like old railway track +STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_0532 : @@ -556,7 +556,7 @@ STR_0551 : STR_0552 : STR_0553 : STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station -STR_0555 :遊客s ride in an elevator up or down a vertical tower to get from one level to another +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience STR_0557 : STR_0558 : @@ -604,231 +604,231 @@ STR_0599 :A compact roller coaster with individual cars and smooth twisting d STR_0600 :Powered mine trains career along a smooth and twisted track layout STR_0601 : STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions -STR_0603 :遊客 {INT32} -STR_0604 :遊客 {INT32} -STR_0605 :遊客 {INT32} -STR_0606 :遊客 {INT32} -STR_0607 :遊客 {INT32} -STR_0608 :遊客 {INT32} -STR_0609 :遊客 {INT32} -STR_0610 :遊客 {INT32} -STR_0611 :遊客 {INT32} -STR_0612 :遊客 {INT32} -STR_0613 :遊客 {INT32} -STR_0614 :遊客 {INT32} -STR_0615 :遊客 {INT32} -STR_0616 :遊客 {INT32} -STR_0617 :遊客 {INT32} -STR_0618 :遊客 {INT32} -STR_0619 :遊客 {INT32} -STR_0620 :遊客 {INT32} -STR_0621 :遊客 {INT32} -STR_0622 :遊客 {INT32} -STR_0623 :遊客 {INT32} -STR_0624 :遊客 {INT32} -STR_0625 :遊客 {INT32} -STR_0626 :遊客 {INT32} -STR_0627 :遊客 {INT32} -STR_0628 :遊客 {INT32} -STR_0629 :遊客 {INT32} -STR_0630 :遊客 {INT32} -STR_0631 :遊客 {INT32} -STR_0632 :遊客 {INT32} -STR_0633 :遊客 {INT32} -STR_0634 :遊客 {INT32} -STR_0635 :遊客 {INT32} -STR_0636 :遊客 {INT32} -STR_0637 :遊客 {INT32} -STR_0638 :遊客 {INT32} -STR_0639 :遊客 {INT32} -STR_0640 :遊客 {INT32} -STR_0641 :遊客 {INT32} -STR_0642 :遊客 {INT32} -STR_0643 :遊客 {INT32} -STR_0644 :遊客 {INT32} -STR_0645 :遊客 {INT32} -STR_0646 :遊客 {INT32} -STR_0647 :遊客 {INT32} -STR_0648 :遊客 {INT32} -STR_0649 :遊客 {INT32} -STR_0650 :遊客 {INT32} -STR_0651 :遊客 {INT32} -STR_0652 :遊客 {INT32} -STR_0653 :遊客 {INT32} -STR_0654 :遊客 {INT32} -STR_0655 :遊客 {INT32} -STR_0656 :遊客 {INT32} -STR_0657 :遊客 {INT32} -STR_0658 :遊客 {INT32} -STR_0659 :遊客 {INT32} -STR_0660 :遊客 {INT32} -STR_0661 :遊客 {INT32} -STR_0662 :遊客 {INT32} -STR_0663 :遊客 {INT32} -STR_0664 :遊客 {INT32} -STR_0665 :遊客 {INT32} -STR_0666 :遊客 {INT32} -STR_0667 :遊客 {INT32} -STR_0668 :遊客 {INT32} -STR_0669 :遊客 {INT32} -STR_0670 :遊客 {INT32} -STR_0671 :遊客 {INT32} -STR_0672 :遊客 {INT32} -STR_0673 :遊客 {INT32} -STR_0674 :遊客 {INT32} -STR_0675 :遊客 {INT32} -STR_0676 :遊客 {INT32} -STR_0677 :遊客 {INT32} -STR_0678 :遊客 {INT32} -STR_0679 :遊客 {INT32} -STR_0680 :遊客 {INT32} -STR_0681 :遊客 {INT32} -STR_0682 :遊客 {INT32} -STR_0683 :遊客 {INT32} -STR_0684 :遊客 {INT32} -STR_0685 :遊客 {INT32} -STR_0686 :遊客 {INT32} -STR_0687 :遊客 {INT32} -STR_0688 :遊客 {INT32} -STR_0689 :遊客 {INT32} -STR_0690 :遊客 {INT32} -STR_0691 :遊客 {INT32} -STR_0692 :遊客 {INT32} -STR_0693 :遊客 {INT32} -STR_0694 :遊客 {INT32} -STR_0695 :遊客 {INT32} -STR_0696 :遊客 {INT32} -STR_0697 :遊客 {INT32} -STR_0698 :遊客 {INT32} -STR_0699 :遊客 {INT32} -STR_0700 :遊客 {INT32} -STR_0701 :遊客 {INT32} -STR_0702 :遊客 {INT32} -STR_0703 :遊客 {INT32} -STR_0704 :遊客 {INT32} -STR_0705 :遊客 {INT32} -STR_0706 :遊客 {INT32} -STR_0707 :遊客 {INT32} -STR_0708 :遊客 {INT32} -STR_0709 :遊客 {INT32} -STR_0710 :遊客 {INT32} -STR_0711 :遊客 {INT32} -STR_0712 :遊客 {INT32} -STR_0713 :遊客 {INT32} -STR_0714 :遊客 {INT32} -STR_0715 :遊客 {INT32} -STR_0716 :遊客 {INT32} -STR_0717 :遊客 {INT32} -STR_0718 :遊客 {INT32} -STR_0719 :遊客 {INT32} -STR_0720 :遊客 {INT32} -STR_0721 :遊客 {INT32} -STR_0722 :遊客 {INT32} -STR_0723 :遊客 {INT32} -STR_0724 :遊客 {INT32} -STR_0725 :遊客 {INT32} -STR_0726 :遊客 {INT32} -STR_0727 :遊客 {INT32} -STR_0728 :遊客 {INT32} -STR_0729 :遊客 {INT32} -STR_0730 :遊客 {INT32} -STR_0731 :遊客 {INT32} -STR_0732 :遊客 {INT32} -STR_0733 :遊客 {INT32} -STR_0734 :遊客 {INT32} -STR_0735 :遊客 {INT32} -STR_0736 :遊客 {INT32} -STR_0737 :遊客 {INT32} -STR_0738 :遊客 {INT32} -STR_0739 :遊客 {INT32} -STR_0740 :遊客 {INT32} -STR_0741 :遊客 {INT32} -STR_0742 :遊客 {INT32} -STR_0743 :遊客 {INT32} -STR_0744 :遊客 {INT32} -STR_0745 :遊客 {INT32} -STR_0746 :遊客 {INT32} -STR_0747 :遊客 {INT32} -STR_0748 :遊客 {INT32} -STR_0749 :遊客 {INT32} -STR_0750 :遊客 {INT32} -STR_0751 :遊客 {INT32} -STR_0752 :遊客 {INT32} -STR_0753 :遊客 {INT32} -STR_0754 :遊客 {INT32} -STR_0755 :遊客 {INT32} -STR_0756 :遊客 {INT32} -STR_0757 :遊客 {INT32} -STR_0758 :遊客 {INT32} -STR_0759 :遊客 {INT32} -STR_0760 :遊客 {INT32} -STR_0761 :遊客 {INT32} -STR_0762 :遊客 {INT32} -STR_0763 :遊客 {INT32} -STR_0764 :遊客 {INT32} -STR_0765 :遊客 {INT32} -STR_0766 :遊客 {INT32} -STR_0767 :遊客 {INT32} -STR_0768 :清潔人員 {INT32} -STR_0769 :技術人員 {INT32} -STR_0770 :安全人員 {INT32} -STR_0771 :表演人員 {INT32} -STR_0772 :Unnamed park{POP16}{POP16} -STR_0773 :Unnamed park{POP16}{POP16} -STR_0774 :Unnamed park{POP16}{POP16} -STR_0775 :Unnamed park{POP16}{POP16} -STR_0776 :Unnamed park{POP16}{POP16} -STR_0777 :Unnamed park{POP16}{POP16} -STR_0778 :Sign -STR_0779 :1st -STR_0780 :2nd -STR_0781 :3rd -STR_0782 :4th -STR_0783 :5th -STR_0784 :6th -STR_0785 :7th -STR_0786 :8th -STR_0787 :9th -STR_0788 :10th -STR_0789 :11th -STR_0790 :12th -STR_0791 :13th -STR_0792 :14th -STR_0793 :15th -STR_0794 :16th -STR_0795 :17th -STR_0796 :18th -STR_0797 :19th -STR_0798 :20th -STR_0799 :21st -STR_0800 :22nd -STR_0801 :23rd -STR_0802 :24th -STR_0803 :25th -STR_0804 :26th -STR_0805 :27th -STR_0806 :28th -STR_0807 :29th -STR_0808 :30th -STR_0809 :31st -STR_0810 :Jan -STR_0811 :Feb -STR_0812 :Mar -STR_0813 :Apr -STR_0814 :May -STR_0815 :Jun -STR_0816 :Jul -STR_0817 :Aug -STR_0818 :Sep -STR_0819 :Oct -STR_0820 :Nov -STR_0821 :Dec -STR_0822 :Unable to access graphic data file -STR_0823 :Missing or inaccessible data file +STR_0603 :遊客{INT32} +STR_0604 :遊客{INT32} +STR_0605 :遊客{INT32} +STR_0606 :遊客{INT32} +STR_0607 :遊客{INT32} +STR_0608 :遊客{INT32} +STR_0609 :遊客{INT32} +STR_0610 :遊客{INT32} +STR_0611 :遊客{INT32} +STR_0612 :遊客{INT32} +STR_0613 :遊客{INT32} +STR_0614 :遊客{INT32} +STR_0615 :遊客{INT32} +STR_0616 :遊客{INT32} +STR_0617 :遊客{INT32} +STR_0618 :遊客{INT32} +STR_0619 :遊客{INT32} +STR_0620 :遊客{INT32} +STR_0621 :遊客{INT32} +STR_0622 :遊客{INT32} +STR_0623 :遊客{INT32} +STR_0624 :遊客{INT32} +STR_0625 :遊客{INT32} +STR_0626 :遊客{INT32} +STR_0627 :遊客{INT32} +STR_0628 :遊客{INT32} +STR_0629 :遊客{INT32} +STR_0630 :遊客{INT32} +STR_0631 :遊客{INT32} +STR_0632 :遊客{INT32} +STR_0633 :遊客{INT32} +STR_0634 :遊客{INT32} +STR_0635 :遊客{INT32} +STR_0636 :遊客{INT32} +STR_0637 :遊客{INT32} +STR_0638 :遊客{INT32} +STR_0639 :遊客{INT32} +STR_0640 :遊客{INT32} +STR_0641 :遊客{INT32} +STR_0642 :遊客{INT32} +STR_0643 :遊客{INT32} +STR_0644 :遊客{INT32} +STR_0645 :遊客{INT32} +STR_0646 :遊客{INT32} +STR_0647 :遊客{INT32} +STR_0648 :遊客{INT32} +STR_0649 :遊客{INT32} +STR_0650 :遊客{INT32} +STR_0651 :遊客{INT32} +STR_0652 :遊客{INT32} +STR_0653 :遊客{INT32} +STR_0654 :遊客{INT32} +STR_0655 :遊客{INT32} +STR_0656 :遊客{INT32} +STR_0657 :遊客{INT32} +STR_0658 :遊客{INT32} +STR_0659 :遊客{INT32} +STR_0660 :遊客{INT32} +STR_0661 :遊客{INT32} +STR_0662 :遊客{INT32} +STR_0663 :遊客{INT32} +STR_0664 :遊客{INT32} +STR_0665 :遊客{INT32} +STR_0666 :遊客{INT32} +STR_0667 :遊客{INT32} +STR_0668 :遊客{INT32} +STR_0669 :遊客{INT32} +STR_0670 :遊客{INT32} +STR_0671 :遊客{INT32} +STR_0672 :遊客{INT32} +STR_0673 :遊客{INT32} +STR_0674 :遊客{INT32} +STR_0675 :遊客{INT32} +STR_0676 :遊客{INT32} +STR_0677 :遊客{INT32} +STR_0678 :遊客{INT32} +STR_0679 :遊客{INT32} +STR_0680 :遊客{INT32} +STR_0681 :遊客{INT32} +STR_0682 :遊客{INT32} +STR_0683 :遊客{INT32} +STR_0684 :遊客{INT32} +STR_0685 :遊客{INT32} +STR_0686 :遊客{INT32} +STR_0687 :遊客{INT32} +STR_0688 :遊客{INT32} +STR_0689 :遊客{INT32} +STR_0690 :遊客{INT32} +STR_0691 :遊客{INT32} +STR_0692 :遊客{INT32} +STR_0693 :遊客{INT32} +STR_0694 :遊客{INT32} +STR_0695 :遊客{INT32} +STR_0696 :遊客{INT32} +STR_0697 :遊客{INT32} +STR_0698 :遊客{INT32} +STR_0699 :遊客{INT32} +STR_0700 :遊客{INT32} +STR_0701 :遊客{INT32} +STR_0702 :遊客{INT32} +STR_0703 :遊客{INT32} +STR_0704 :遊客{INT32} +STR_0705 :遊客{INT32} +STR_0706 :遊客{INT32} +STR_0707 :遊客{INT32} +STR_0708 :遊客{INT32} +STR_0709 :遊客{INT32} +STR_0710 :遊客{INT32} +STR_0711 :遊客{INT32} +STR_0712 :遊客{INT32} +STR_0713 :遊客{INT32} +STR_0714 :遊客{INT32} +STR_0715 :遊客{INT32} +STR_0716 :遊客{INT32} +STR_0717 :遊客{INT32} +STR_0718 :遊客{INT32} +STR_0719 :遊客{INT32} +STR_0720 :遊客{INT32} +STR_0721 :遊客{INT32} +STR_0722 :遊客{INT32} +STR_0723 :遊客{INT32} +STR_0724 :遊客{INT32} +STR_0725 :遊客{INT32} +STR_0726 :遊客{INT32} +STR_0727 :遊客{INT32} +STR_0728 :遊客{INT32} +STR_0729 :遊客{INT32} +STR_0730 :遊客{INT32} +STR_0731 :遊客{INT32} +STR_0732 :遊客{INT32} +STR_0733 :遊客{INT32} +STR_0734 :遊客{INT32} +STR_0735 :遊客{INT32} +STR_0736 :遊客{INT32} +STR_0737 :遊客{INT32} +STR_0738 :遊客{INT32} +STR_0739 :遊客{INT32} +STR_0740 :遊客{INT32} +STR_0741 :遊客{INT32} +STR_0742 :遊客{INT32} +STR_0743 :遊客{INT32} +STR_0744 :遊客{INT32} +STR_0745 :遊客{INT32} +STR_0746 :遊客{INT32} +STR_0747 :遊客{INT32} +STR_0748 :遊客{INT32} +STR_0749 :遊客{INT32} +STR_0750 :遊客{INT32} +STR_0751 :遊客{INT32} +STR_0752 :遊客{INT32} +STR_0753 :遊客{INT32} +STR_0754 :遊客{INT32} +STR_0755 :遊客{INT32} +STR_0756 :遊客{INT32} +STR_0757 :遊客{INT32} +STR_0758 :遊客{INT32} +STR_0759 :遊客{INT32} +STR_0760 :遊客{INT32} +STR_0761 :遊客{INT32} +STR_0762 :遊客{INT32} +STR_0763 :遊客{INT32} +STR_0764 :遊客{INT32} +STR_0765 :遊客{INT32} +STR_0766 :遊客{INT32} +STR_0767 :遊客{INT32} +STR_0768 :清潔工人{INT32} +STR_0769 :維修人員{INT32} +STR_0770 :安全警衛{INT32} +STR_0771 :表演人員{INT32} +STR_0772 :未命名樂園{POP16}{POP16} +STR_0773 :未命名樂園{POP16}{POP16} +STR_0774 :未命名樂園{POP16}{POP16} +STR_0775 :未命名樂園{POP16}{POP16} +STR_0776 :未命名樂園{POP16}{POP16} +STR_0777 :未命名樂園{POP16}{POP16} +STR_0778 :招牌 +STR_0779 :1日 +STR_0780 :2日 +STR_0781 :3日 +STR_0782 :4日 +STR_0783 :5日 +STR_0784 :6日 +STR_0785 :7日 +STR_0786 :8日 +STR_0787 :9日 +STR_0788 :10日 +STR_0789 :11日 +STR_0790 :12日 +STR_0791 :13日 +STR_0792 :14日 +STR_0793 :15日 +STR_0794 :16日 +STR_0795 :17日 +STR_0796 :18日 +STR_0797 :19日 +STR_0798 :20日 +STR_0799 :21日 +STR_0800 :22日 +STR_0801 :23日 +STR_0802 :24日 +STR_0803 :25日 +STR_0804 :26日 +STR_0805 :27日 +STR_0806 :28日 +STR_0807 :29日 +STR_0808 :30日 +STR_0809 :31日 +STR_0810 :1月 +STR_0811 :2月 +STR_0812 :3月 +STR_0813 :4月 +STR_0814 :5月 +STR_0815 :6月 +STR_0816 :7月 +STR_0817 :8月 +STR_0818 :9月 +STR_0819 :10月 +STR_0820 :11月 +STR_0821 :12月 +STR_0822 :無法讀取圖像檔案 +STR_0823 :缺少或不能讀取檔案 STR_0824 :{BLACK}{CROSS} STR_0825 :Chosen name in use already STR_0826 :Too many names defined -STR_0827 :Not enough cash - requires {CURRENCY2DP} +STR_0827 :沒有足夠現金 - 需要{CURRENCY2DP} STR_0828 :{SMALLFONT}{BLACK}Close window STR_0829 :{SMALLFONT}{BLACK}Window title - Drag this to move window STR_0830 :{SMALLFONT}{BLACK}Zoom view in @@ -837,27 +837,27 @@ STR_0832 :{SMALLFONT}{BLACK}Rotate view 90{DEGREE} clockwise STR_0833 :{SMALLFONT}{BLACK}Pause game STR_0834 :{SMALLFONT}{BLACK}Disk and game options STR_0835 :Game initialization failed -STR_0836 :Unable to start game in a minimised state -STR_0837 :Unable to initialise graphics system +STR_0836 :Unable to start game in a minimized state +STR_0837 :Unable to initialize graphics system STR_0838 :CD key code {INT32} is not valid for your RollerCoaster Tycoon 2 CD !{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Please un-install RollerCoaster Tycoon 2% and re-install with the correct CD Key Code STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} STR_0841 :Desktop window -STR_0842 :640x480 full screen -STR_0843 :800x600 full screen -STR_0844 :1024x768 full screen -STR_0845 :1152x864 full screen -STR_0846 :1280x1024 full screen -STR_0847 :About 'RollerCoaster Tycoon 2' +STR_0842 :640x480 全螢幕 +STR_0843 :800x600 全螢幕 +STR_0844 :1024x768 全螢幕 +STR_0845 :1152x864 全螢幕 +STR_0846 :1280x1024 全螢幕 +STR_0847 :有關'RollerCoaster Tycoon 2' STR_0848 :RollerCoaster Tycoon 2 -STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028 -STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, all rights reserved +STR_0849 :{WINDOW_COLOUR_2}版本 2.01.028 +STR_0850 :{WINDOW_COLOUR_2}版權商標 {COPYRIGHT} 2002 Chris Sawyer, 版權所有 STR_0851 :{WINDOW_COLOUR_2}Designed and programmed by Chris Sawyer STR_0852 :{WINDOW_COLOUR_2}Graphics by Simon Foster STR_0853 :{WINDOW_COLOUR_2}Sound and music by Allister Brimble STR_0854 :{WINDOW_COLOUR_2}Additional sounds recorded by David Ellis STR_0855 :{WINDOW_COLOUR_2}Representation by Jacqui Lyons at Marjacq Ltd. -STR_0856 :{WINDOW_COLOUR_2}Thanks to: +STR_0856 :{WINDOW_COLOUR_2}感謝: STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth, and John Wardley STR_0858 :{WINDOW_COLOUR_2} STR_0859 :{WINDOW_COLOUR_2} @@ -883,18 +883,18 @@ STR_0878 :Too high ! STR_0879 :Can't lower land here... STR_0880 :Can't raise land here... STR_0881 :Object in the way -STR_0882 :Load Game -STR_0883 :Save Game -STR_0884 :Load Landscape -STR_0885 :Save Landscape -STR_0886 :Quit Game -STR_0887 :Quit Scenario Editor -STR_0888 :Quit Roller Coaster Designer -STR_0889 :Quit Track Designs Manager +STR_0882 :載入遊戲 +STR_0883 :儲存遊戲 +STR_0884 :儲存劇情 +STR_0885 :儲存劇情 +STR_0886 :離開遊戲 +STR_0887 :離開劇情編輯工具 +STR_0888 :離開雲霄飛車設計工具 +STR_0889 :離開遊樂設施設計管理工具 STR_0890 :SCR{COMMA16}.BMP -STR_0891 :Screenshot -STR_0892 :Screenshot saved to disk as '{STRINGID}' -STR_0893 :Screenshot failed ! +STR_0891 :截圖 +STR_0892 :截圖'{STRINGID}'已儲存到硬碟中 +STR_0893 :截圖失敗! STR_0894 :Landscape data area full ! STR_0895 :Can't build partly above and partly below ground STR_0896 :{POP16}{POP16}{STRINGID} Construction @@ -945,15 +945,15 @@ STR_0940 :Remove Base Land STR_0941 :Remove Vertical Faces STR_0942 :See-Through Rides STR_0943 :See-Through Scenery -STR_0944 :Save -STR_0945 :Don't Save +STR_0944 :儲存 +STR_0945 :不要儲存 STR_0946 :Cancel STR_0947 :Save this before loading ? STR_0948 :Save this before quitting ? STR_0949 :Save this before quitting ? -STR_0950 :Load Game -STR_0951 :Quit Game -STR_0952 :Quit Game +STR_0950 :載入遊戲 +STR_0951 :離開遊戲 +STR_0952 :離開遊戲 STR_0953 :Load Landscape STR_0954 : STR_0955 :{SMALLFONT}{BLACK}Select seat rotation angle for this track section @@ -973,30 +973,29 @@ STR_0968 :+360{DEGREE} STR_0969 :+405{DEGREE} STR_0970 :+450{DEGREE} STR_0971 :+495{DEGREE} -STR_0972 :Cancel -STR_0973 :OK -STR_0974 :Rides -STR_0975 :Shops and Stalls -STR_0976 :Toilets and Information Kiosks -STR_0977 :New Transport Rides -STR_0978 :New Gentle Rides -STR_0979 :New Roller Coasters -STR_0980 :New Thrill Rides -STR_0981 :New Water Rides -STR_0982 :New Shops & Stalls -STR_0983 :Research & Development +STR_0972 :取消 +STR_0973 :確定 +STR_0974 :遊樂設施 +STR_0975 :商店及攤販 +STR_0976 :洗手間及服務台 +STR_0977 :建造新的運輸類遊樂設施 +STR_0978 :建造新的溫和類遊樂設施 +STR_0979 :建造新的雲霄飛車 +STR_0980 :建造新的剌激類遊樂設施 +STR_0981 :建造新的水文類遊樂設施 +STR_0983 :研究及開發 STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP} STR_0986 :{BLACK}{CURRENCY2DP} -STR_0987 :Too many rides/attractions -STR_0988 :Can't create new ride/attraction... +STR_0987 :太多遊樂設施/店鋪... +STR_0988 :不能興建遊樂設施/店鋪... STR_0989 :{STRINGID} STR_0990 :{SMALLFONT}{BLACK}Construction -STR_0991 :Station platform -STR_0992 :{SMALLFONT}{BLACK}Demolish entire ride/attraction -STR_0993 :Demolish ride/attraction -STR_0994 :Demolish -STR_0995 :{WINDOW_COLOUR_1}Are you sure you want to completely demolish {STRINGID}? +STR_0991 :車站月台 +STR_0992 :{SMALLFONT}{BLACK}拆除整個遊樂設施/店鋪 +STR_0993 :拆除遊樂設施/店鋪 +STR_0994 :拆除 +STR_0995 :{WINDOW_COLOUR_1}你確定要拆除整個{STRINGID}? STR_0996 :Overall view STR_0997 :{SMALLFONT}{BLACK}View selection STR_0998 :No more stations allowed on this ride @@ -1012,10 +1011,10 @@ STR_1007 :Unable to create enough vehicles STR_1008 :{SMALLFONT}{BLACK}Open, close, or test ride/attraction STR_1009 :{SMALLFONT}{BLACK}Open or close all rides/attractions STR_1010 :{SMALLFONT}{BLACK}Open or close park -STR_1011 :Close all -STR_1012 :Open all -STR_1013 :Close park -STR_1014 :Open park +STR_1011 :關閉所有遊樂設施 +STR_1012 :開啟所有遊樂設施 +STR_1013 :關閉樂園 +STR_1014 :開放樂園 STR_1015 :Unable to operate with more than one station platform in this mode STR_1016 :Unable to operate with less than two stations in this mode STR_1017 :Can't change operating mode... @@ -1041,10 +1040,10 @@ STR_1036 :Load Game STR_1037 :Load Landscape STR_1038 :Convert saved game to scenario STR_1039 :Install new track design -STR_1040 :Save Game +STR_1040 :儲存遊戲 STR_1041 :Save Scenario STR_1042 :Save Landscape -STR_1043 :RollerCoaster Tycoon 2 Saved Game +STR_1043 :RollerCoaster Tycoon 2 遊戲存檔 STR_1044 :RollerCoaster Tycoon 2 Scenario File STR_1045 :RollerCoaster Tycoon 2 Landscape File STR_1046 :RollerCoaster Tycoon 2 Track Design File @@ -1062,54 +1061,54 @@ STR_1057 :Ride/attraction name STR_1058 :Enter new name for this ride/attraction: STR_1059 :Can't rename ride/attraction... STR_1060 :Invalid ride/attraction name -STR_1061 :Normal mode -STR_1062 :Continuous circuit mode -STR_1063 :Reverse-Incline launched shuttle mode +STR_1061 :Normal 模式 +STR_1062 :Continuous circuit 模式 +STR_1063 :Reverse-Incline launched shuttle 模式 STR_1064 :Powered launch (passing station) -STR_1065 :Shuttle mode -STR_1066 :Boat hire mode +STR_1065 :穿梭模式 +STR_1066 :出租小船模式 STR_1067 :Upward launch -STR_1068 :Rotating lift mode -STR_1069 :Station to station mode +STR_1068 :Rotating lift 模式 +STR_1069 :Station to station 模式 STR_1070 :Single ride per admission STR_1071 :Unlimited rides per admission -STR_1072 :Maze mode -STR_1073 :Race mode -STR_1074 :Bumper-car mode -STR_1075 :Swing mode -STR_1076 :Shop stall mode -STR_1077 :Rotation mode +STR_1072 :迷宮模式 +STR_1073 :賽車模式 +STR_1074 :Bumper-car 模式 +STR_1075 :Swing 模式 +STR_1076 :Shop stall 模式 +STR_1077 :Rotation 模式 STR_1078 :Forward rotation STR_1079 :Backward rotation -STR_1080 :Film: {ENDQUOTES}Avenging aviators{ENDQUOTES} -STR_1081 :3D film: {ENDQUOTES}Mouse tails{ENDQUOTES} -STR_1082 :Space rings mode -STR_1083 :Beginners mode +STR_1080 :電影: {ENDQUOTES}Avenging aviators{ENDQUOTES} +STR_1081 :3D電影: {ENDQUOTES}Mouse tails{ENDQUOTES} +STR_1082 :Space rings 模式 +STR_1083 :Beginners 模式 STR_1084 :LIM-powered launch -STR_1085 :Film: {ENDQUOTES}Thrill riders{ENDQUOTES} -STR_1086 :3D film: {ENDQUOTES}Storm chasers{ENDQUOTES} -STR_1087 :3D film: {ENDQUOTES}Space raiders{ENDQUOTES} -STR_1088 :Intense mode -STR_1089 :Berserk mode -STR_1090 :Haunted house mode -STR_1091 :Circus show mode +STR_1085 :電影: {ENDQUOTES}Thrill riders{ENDQUOTES} +STR_1086 :3D電影: {ENDQUOTES}Storm chasers{ENDQUOTES} +STR_1087 :3D電影: {ENDQUOTES}Space raiders{ENDQUOTES} +STR_1088 :Intense 模式 +STR_1089 :Berserk 模式 +STR_1090 :Haunted house 模式 +STR_1091 :馬戲團表演模式 STR_1092 :Downward launch -STR_1093 :Crooked house mode -STR_1094 :Freefall drop mode -STR_1095 :Continuous circuit block sectioned mode +STR_1093 :Crooked house 模式 +STR_1094 :Freefall drop 模式 +STR_1095 :Continuous circuit block sectioned 模式 STR_1096 :Powered launch (without passing station) -STR_1097 :Powered launch block sectioned mode +STR_1097 :Powered launch block sectioned 模式 STR_1098 :Moving to end of {POP16}{STRINGID} STR_1099 :Waiting for passengers at {POP16}{STRINGID} STR_1100 :Waiting to depart {POP16}{STRINGID} STR_1101 :Departing {POP16}{STRINGID} -STR_1102 :Travelling at {VELOCITY} +STR_1102 :Traveling at {VELOCITY} STR_1103 :Arriving at {POP16}{STRINGID} STR_1104 :Unloading passengers at {POP16}{STRINGID} -STR_1105 :Travelling at {VELOCITY} +STR_1105 :Traveling at {VELOCITY} STR_1106 :Crashing! STR_1107 :Crashed! -STR_1108 :Travelling at {VELOCITY} +STR_1108 :Traveling at {VELOCITY} STR_1109 :Swinging STR_1110 :Rotating STR_1111 :Rotating @@ -1118,37 +1117,37 @@ STR_1113 :Showing film STR_1114 :Rotating STR_1115 :Operating STR_1116 :Operating -STR_1117 :Doing circus show +STR_1117 :馬戲團表演中 STR_1118 :Operating STR_1119 :Waiting for cable lift -STR_1120 :Travelling at {VELOCITY} +STR_1120 :Traveling at {VELOCITY} STR_1121 :Stopping -STR_1122 :Waiting for passengers +STR_1122 :等待乘客中 STR_1123 :Waiting to start STR_1124 :Starting STR_1125 :Operating STR_1126 :Stopping STR_1127 :Unloading passengers STR_1128 :Stopped by block brakes -STR_1129 :All vehicles in same colours -STR_1130 :Different colours per {STRINGID} -STR_1131 :Different colours per vehicle +STR_1129 :All vehicles in same colors +STR_1130 :Different colors per {STRINGID} +STR_1131 :Different colors per vehicle STR_1132 :Vehicle {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1133 :Vehicle {POP16}{COMMA16} STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} STR_1135 :{STRINGID} {COMMA16} -STR_1136 :{SMALLFONT}{BLACK}Select main colour -STR_1137 :{SMALLFONT}{BLACK}Select additional colour 1 -STR_1138 :{SMALLFONT}{BLACK}Select additional colour 2 -STR_1139 :{SMALLFONT}{BLACK}Select support structure colour -STR_1140 :{SMALLFONT}{BLACK}Select vehicle colour scheme option +STR_1136 :{SMALLFONT}{BLACK}Select main color +STR_1137 :{SMALLFONT}{BLACK}Select additional color 1 +STR_1138 :{SMALLFONT}{BLACK}Select additional color 2 +STR_1139 :{SMALLFONT}{BLACK}Select support structure color +STR_1140 :{SMALLFONT}{BLACK}Select vehicle color scheme option STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} STR_1144 :Can't build/move entrance for this ride/attraction... STR_1145 :Can't build/move exit for this ride/attraction... -STR_1146 :Entrance not yet built -STR_1147 :Exit not yet built +STR_1146 :尚未興建入口 +STR_1147 :尚未興建出口 STR_1148 :Quarter load STR_1149 :Half load STR_1150 :Three-quarter load @@ -1195,16 +1194,16 @@ STR_1190 :{SMALLFONT}{BLACK}Remove previous footpath section STR_1191 :{BLACK}{STRINGID} STR_1192 :{OUTLINE}{RED}{STRINGID} STR_1193 :{WINDOW_COLOUR_2}{STRINGID} -STR_1194 :Closed -STR_1195 :Test Run -STR_1196 :Open -STR_1197 :Broken Down -STR_1198 :Crashed! -STR_1199 :{COMMA16} person on ride -STR_1200 :{COMMA16} people on ride -STR_1201 :Nobody in queue line -STR_1202 :1 person in queue line -STR_1203 :{COMMA16} people in queue line +STR_1194 :已關閉 +STR_1195 :測試中 +STR_1196 :已開啟 +STR_1197 :故障了 +STR_1198 :毀壞了! +STR_1199 :{COMMA16} 個遊客在這個遊樂設施上 +STR_1200 :{COMMA16} 個遊客在這個遊樂設施上 +STR_1201 :無人在排隊 +STR_1202 :1個遊客在排隊 +STR_1203 :{COMMA16}個遊客在排隊 STR_1204 :{COMMA16} minute queue time STR_1205 :{COMMA16} minutes queue time STR_1206 :{WINDOW_COLOUR_2}Wait for: @@ -1216,20 +1215,20 @@ STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time: STR_1212 :{WINDOW_COLOUR_2}Maximum waiting time: STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing -STR_1215 :{WINDOW_COLOUR_2}Synchronise with adjacent stations -STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronise departure with all adjacent stations (for 'racing') -STR_1217 :{COMMA16} seconds +STR_1215 :{WINDOW_COLOUR_2}Synchronize with adjacent stations +STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronize departure with all adjacent stations (for 'racing') +STR_1217 :{COMMA16}秒 STR_1218 :{BLACK}{SMALLUP} STR_1219 :{BLACK}{SMALLDOWN} -STR_1220 :Exit only +STR_1220 :只准落客 STR_1221 :No entrance STR_1222 :No exit -STR_1223 :{SMALLFONT}{BLACK}Transport rides -STR_1224 :{SMALLFONT}{BLACK}Gentle rides -STR_1225 :{SMALLFONT}{BLACK}Roller coasters -STR_1226 :{SMALLFONT}{BLACK}Thrill rides -STR_1227 :{SMALLFONT}{BLACK}Water rides -STR_1228 :{SMALLFONT}{BLACK}Shops & stalls +STR_1223 :{SMALLFONT}{BLACK}運輸類遊樂設施 +STR_1224 :{SMALLFONT}{BLACK}溫和類遊樂設施 +STR_1225 :{SMALLFONT}{BLACK}雲霄飛車 +STR_1226 :{SMALLFONT}{BLACK}剌激類遊樂設施 +STR_1227 :{SMALLFONT}{BLACK}水文類遊樂設施 +STR_1228 :{SMALLFONT}{BLACK}商店及攤販 STR_1229 :train STR_1230 :trains STR_1231 :Train @@ -1397,7 +1396,7 @@ STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options STR_1394 :{SMALLFONT}{BLACK}Operating options STR_1395 :{SMALLFONT}{BLACK}Maintenance options -STR_1396 :{SMALLFONT}{BLACK}Colour scheme options +STR_1396 :{SMALLFONT}{BLACK}Color scheme options STR_1397 :{SMALLFONT}{BLACK}Sound & music options STR_1398 :{SMALLFONT}{BLACK}Measurements and test data STR_1399 :{SMALLFONT}{BLACK}Graphs @@ -1453,10 +1452,10 @@ STR_1448 :Watching new ride being constructed STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) -STR_1452 :遊客's name -STR_1453 :Enter name for this 遊客: -STR_1454 :Can't name 遊客... -STR_1455 :Invalid name for 遊客 +STR_1452 :Guest's name +STR_1453 :Enter name for this guest: +STR_1454 :Can't name guest... +STR_1455 :Invalid name for guest STR_1456 :{WINDOW_COLOUR_2}Cash spent: {BLACK}{CURRENCY2DP} STR_1457 :{WINDOW_COLOUR_2}Cash in pocket: {BLACK}{CURRENCY2DP} STR_1458 :{WINDOW_COLOUR_2}Time in park: {BLACK}{REALTIME} @@ -1464,12 +1463,12 @@ STR_1459 :Track style STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track STR_1462 :Too steep for lift hill -STR_1463 :遊客s +STR_1463 :遊客 STR_1464 :Helix up (small) STR_1465 :Helix up (large) STR_1466 :Helix down (small) STR_1467 :Helix down (large) -STR_1468 :Staff +STR_1468 :員工 STR_1469 :Ride must start and end with stations STR_1470 :Station not long enough STR_1471 :{WINDOW_COLOUR_2}Speed: @@ -1526,9 +1525,9 @@ STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} -STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}These fries from {STRINGID} are really good value{ENDQUOTES} STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} -STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}This cotton candy from {STRINGID} is really good value{ENDQUOTES} STR_1528 : STR_1529 : STR_1530 : @@ -1538,9 +1537,9 @@ STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} -STR_1537 :{SMALLFONT}{OPENQUOTES}This toffee apple from {STRINGID} is really good value{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}This candy apple from {STRINGID} is really good value{ENDQUOTES} STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} -STR_1539 :{SMALLFONT}{OPENQUOTES}This doughnut from {STRINGID} is really good value{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}This donut from {STRINGID} is really good value{ENDQUOTES} STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} STR_1541 : STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} @@ -1560,9 +1559,9 @@ STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride phot STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} -STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fries from {STRINGID}{ENDQUOTES} STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} -STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for cotton candy from {STRINGID}{ENDQUOTES} STR_1562 : STR_1563 : STR_1564 : @@ -1572,9 +1571,9 @@ STR_1567 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for popcorn from {S STR_1568 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hot dog from {STRINGID}{ENDQUOTES} STR_1569 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for tentacle from {STRINGID}{ENDQUOTES} STR_1570 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hat from {STRINGID}{ENDQUOTES} -STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a toffee apple from {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a candy apple from {STRINGID}{ENDQUOTES} STR_1572 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a T-shirt from {STRINGID}{ENDQUOTES} -STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a doughnut from {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a donut from {STRINGID}{ENDQUOTES} STR_1574 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for coffee from {STRINGID}{ENDQUOTES} STR_1575 : STR_1576 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried chicken from {STRINGID}{ENDQUOTES} @@ -1694,38 +1693,38 @@ STR_1689 :Block brakes STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} STR_1691 :{WINDOW_COLOUR_2} Cost: {BLACK}{CURRENCY} STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY} -STR_1693 :{SMALLFONT}{BLACK}遊客s -STR_1694 :{SMALLFONT}{BLACK}Staff +STR_1693 :{SMALLFONT}{BLACK}遊客 +STR_1694 :{SMALLFONT}{BLACK}員工 STR_1695 :{SMALLFONT}{BLACK}Income and costs STR_1696 :{SMALLFONT}{BLACK}Customer information STR_1697 :Cannot place these on queue line area STR_1698 :Can only place these on queue area STR_1699 :Too many people in game -STR_1700 :僱用新的清潔人員 -STR_1701 :Hire new Mechanic -STR_1702 :Hire new Security Guard -STR_1703 :Hire new Entertainer -STR_1704 :Can't hire new staff... +STR_1700 :僱用新的清潔工人 +STR_1701 :僱用新的維修人員 +STR_1702 :僱用新的安全警衛 +STR_1703 :僱用新的表演人員 +STR_1704 :不能僱用新員工... STR_1705 :{SMALLFONT}{BLACK}Sack this staff member STR_1706 :{SMALLFONT}{BLACK}Move this person to a new location STR_1707 :Too many staff in game STR_1708 :{SMALLFONT}{BLACK}Set patrol area for this staff member -STR_1709 :Sack staff +STR_1709 :解僱員工 STR_1710 :Yes STR_1711 :{WINDOW_COLOUR_1}Are you sure you want to sack {STRINGID}? STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Sweep footpaths STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Water gardens STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Empty litter bins STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Mow grass -STR_1716 :Invalid name for park -STR_1717 :Can't rename park... -STR_1718 :Park Name -STR_1719 :Enter name for park: -STR_1720 :{SMALLFONT}{BLACK}Name park -STR_1721 :Park closed -STR_1722 :Park open -STR_1723 :Can't open park... -STR_1724 :Can't close park... +STR_1716 :非法的樂園名稱 +STR_1717 :不能重命名樂園... +STR_1718 :樂園名稱 +STR_1719 :請輸入樂園名稱: +STR_1720 :{SMALLFONT}{BLACK}命名樂園 +STR_1721 :樂園關閉中 +STR_1722 :樂園開放中 +STR_1723 :不能開放樂園... +STR_1724 :不能關閉樂園... STR_1725 :Can't buy land... STR_1726 :Land not for sale! STR_1727 :Construction rights not for sale! @@ -1740,7 +1739,7 @@ STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1737 :{COMMA16} STR_1738 :Can't change number of laps... -STR_1739 :Race won by 遊客 {INT32} +STR_1739 :Race won by guest {INT32} STR_1740 :Race won by {STRINGID} STR_1741 :Not yet constructed ! STR_1742 :{WINDOW_COLOUR_2}Max. people on ride: @@ -1753,10 +1752,10 @@ STR_1748 :{SMALLFONT}{BLACK}Time limit for ride STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} STR_1750 :{DURATION} STR_1751 :Can't change time limit for ride... -STR_1752 :{SMALLFONT}{BLACK}Show list of individual 遊客s in park -STR_1753 :{SMALLFONT}{BLACK}Show summarised list of 遊客s in park -STR_1754 :{BLACK}{COMMA16} 遊客s -STR_1755 :{BLACK}{COMMA16} 遊客 +STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park +STR_1753 :{SMALLFONT}{BLACK}Show summarized list of guests in park +STR_1754 :{BLACK}{COMMA16} guests +STR_1755 :{BLACK}{COMMA16} guest STR_1756 :{WINDOW_COLOUR_2}Admission price: STR_1757 :{WINDOW_COLOUR_2}Reliability: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1758 :{SMALLFONT}{BLACK}Build mode @@ -1791,8 +1790,8 @@ STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume -STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff -STR_1791 :{WINDOW_COLOUR_2}Uniform colour: +STR_1790 :{SMALLFONT}{BLACK}Select uniform color for this type of staff +STR_1791 :{WINDOW_COLOUR_2}Uniform color: STR_1792 :Responding to {STRINGID} breakdown call STR_1793 :Heading to {STRINGID} for an inspection STR_1794 :Fixing {STRINGID} @@ -1817,16 +1816,16 @@ STR_1812 :{SMALLFONT}{BLACK}{STRINGID} STR_1813 :Miscellaneous Objects STR_1814 :Actions STR_1815 :Thoughts -STR_1816 :{SMALLFONT}{BLACK}Select information type to show in 遊客 list +STR_1816 :{SMALLFONT}{BLACK}Select information type to show in guest list STR_1817 :({COMMA16}) -STR_1818 :{WINDOW_COLOUR_2}All 遊客s -STR_1819 :{WINDOW_COLOUR_2}All 遊客s (summarised) -STR_1820 :{WINDOW_COLOUR_2}遊客s {STRINGID} -STR_1821 :{WINDOW_COLOUR_2}遊客s thinking {STRINGID} -STR_1822 :{WINDOW_COLOUR_2}遊客s thinking about {POP16}{STRINGID} -STR_1823 :{SMALLFONT}{BLACK}Show 遊客s' thoughts about this ride/attraction -STR_1824 :{SMALLFONT}{BLACK}Show 遊客s on this ride/attraction -STR_1825 :{SMALLFONT}{BLACK}Show 遊客s queuing for this ride/attraction +STR_1818 :{WINDOW_COLOUR_2}All guests +STR_1819 :{WINDOW_COLOUR_2}All guests (summarized) +STR_1820 :{WINDOW_COLOUR_2}Guests {STRINGID} +STR_1821 :{WINDOW_COLOUR_2}Guests thinking {STRINGID} +STR_1822 :{WINDOW_COLOUR_2}Guests thinking about {POP16}{STRINGID} +STR_1823 :{SMALLFONT}{BLACK}Show guests' thoughts about this ride/attraction +STR_1824 :{SMALLFONT}{BLACK}Show guests on this ride/attraction +STR_1825 :{SMALLFONT}{BLACK}Show guests queuing for this ride/attraction STR_1826 :Status STR_1827 :Popularity STR_1828 :Satisfaction @@ -1835,7 +1834,7 @@ STR_1830 :Queue length STR_1831 :Queue time STR_1832 :Reliability STR_1833 :Down-time -STR_1834 :遊客s favourite +STR_1834 :Guests favorite STR_1835 :Popularity: Unknown STR_1836 :Popularity: {COMMA16}% STR_1837 :Satisfaction: Unknown @@ -1843,14 +1842,14 @@ STR_1838 :Satisfaction: {COMMA16}% STR_1839 :Reliability: {COMMA16}% STR_1840 :Down-time: {COMMA16}% STR_1841 :Profit: {CURRENCY2DP} per hour -STR_1842 :Favourite of: {COMMA16} 遊客 -STR_1843 :Favourite of: {COMMA16} 遊客s +STR_1842 :Favorite of: {COMMA16} guest +STR_1843 :Favorite of: {COMMA16} guests STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list STR_1845 :{MONTHYEAR} -STR_1846 :{COMMA16} 遊客s -STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} 遊客s -STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} 遊客s -STR_1849 :{WINDOW_COLOUR_2}Play music +STR_1846 :{COMMA16} guests +STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} guests +STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} guests +STR_1849 :{WINDOW_COLOUR_2}播放音樂 STR_1850 :{SMALLFONT}{BLACK}Select whether music should be played for this ride STR_1851 :{WINDOW_COLOUR_2}Running cost: {BLACK}{CURRENCY2DP} per hour STR_1852 :{WINDOW_COLOUR_2}Running cost: {BLACK}Unknown @@ -1860,32 +1859,32 @@ STR_1855 :{WINDOW_COLOUR_2}Built: {BLACK}{COMMA16} Years Ago STR_1856 :{WINDOW_COLOUR_2}Profit per item sold: {BLACK}{CURRENCY2DP} STR_1857 :{WINDOW_COLOUR_2}Loss per item sold: {BLACK}{CURRENCY2DP} STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY2DP} per month -STR_1859 :Handymen -STR_1860 :Mechanics -STR_1861 :Security Guards -STR_1862 :Entertainers -STR_1863 :Handyman -STR_1864 :Mechanic -STR_1865 :Security Guard -STR_1866 :Entertainer +STR_1859 :清潔工人 +STR_1860 :維修人員 +STR_1861 :安全警衛 +STR_1862 :表演人員 +STR_1863 :清潔工人 +STR_1864 :維修人員 +STR_1865 :安全警衛 +STR_1866 :表演人員 STR_1867 :{BLACK}{COMMA16} {STRINGID} STR_1868 :Can't change number of rotations... STR_1869 :{WINDOW_COLOUR_2}Number of rotations: STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1872 :{COMMA16} -STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY2DP} per hour -STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour +STR_1873 :{WINDOW_COLOUR_2}收入: {BLACK}{CURRENCY2DP}/每小時 +STR_1874 :{WINDOW_COLOUR_2}營利: {BLACK}{CURRENCY2DP}/每小時 STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides STR_1878 :{WINDOW_COLOUR_2}Inspection: -STR_1879 :Every 10 minutes -STR_1880 :Every 20 minutes -STR_1881 :Every 30 minutes -STR_1882 :Every 45 minutes -STR_1883 :Every hour -STR_1884 :Every 2 hours +STR_1879 :每10分鐘 +STR_1880 :每20分鐘 +STR_1881 :每30分鐘 +STR_1882 :每45分鐘 +STR_1883 :每小時 +STR_1884 :每2小時 STR_1885 :Never STR_1886 :Inspecting {STRINGID} STR_1887 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}{COMMA16} minutes @@ -1925,13 +1924,13 @@ STR_1920 :Can't pay back loan! STR_1921 :{SMALLFONT}{BLACK}Start a new game STR_1922 :{SMALLFONT}{BLACK}Continue playing a saved game STR_1923 :{SMALLFONT}{BLACK}Show tutorial -STR_1924 :{SMALLFONT}{BLACK}Exit +STR_1924 :{SMALLFONT}{BLACK}退出遊戲 STR_1925 :Can't place person here... STR_1926 :{SMALLFONT} STR_1927 :{YELLOW}{STRINGID} has broken down STR_1928 :{RED}{STRINGID} has crashed! STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better -STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this 遊客 - (If tracking is on, 遊客's movements will be reported in the message area) +STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this guest - (If tracking is on, guest's movements will be reported in the message area) STR_1931 :{STRINGID} has joined the queue line for {STRINGID} STR_1932 :{STRINGID} is on {STRINGID} STR_1933 :{STRINGID} is in {STRINGID} @@ -1939,13 +1938,13 @@ STR_1934 :{STRINGID} has left {STRINGID} STR_1935 :{STRINGID} has left the park STR_1936 :{STRINGID} has bought {STRINGID} STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message -STR_1938 :{SMALLFONT}{BLACK}Show view of 遊客 +STR_1938 :{SMALLFONT}{BLACK}Show view of guest STR_1939 :{SMALLFONT}{BLACK}Show view of staff member -STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this 遊客 -STR_1941 :{SMALLFONT}{BLACK}Show which rides this 遊客 has been on -STR_1942 :{SMALLFONT}{BLACK}Show financial information about this 遊客 -STR_1943 :{SMALLFONT}{BLACK}Show 遊客's recent thoughts -STR_1944 :{SMALLFONT}{BLACK}Show items 遊客 is carrying +STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this guest +STR_1941 :{SMALLFONT}{BLACK}Show which rides this guest has been on +STR_1942 :{SMALLFONT}{BLACK}Show financial information about this guest +STR_1943 :{SMALLFONT}{BLACK}Show guest's recent thoughts +STR_1944 :{SMALLFONT}{BLACK}Show items guest is carrying STR_1945 :{SMALLFONT}{BLACK}Show orders and options for this staff member STR_1946 :{SMALLFONT}{BLACK}Select costume for this entertainer STR_1947 :{SMALLFONT}{BLACK}Show areas patrolled by selected staff type, and locate the nearest staff member @@ -1968,9 +1967,9 @@ STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: STR_1964 :{WINDOW_COLOUR_2}Umbrella price: STR_1965 :{WINDOW_COLOUR_2}Drink price: STR_1966 :{WINDOW_COLOUR_2}Burger price: -STR_1967 :{WINDOW_COLOUR_2}Chips price: +STR_1967 :{WINDOW_COLOUR_2}Fries price: STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: -STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: +STR_1969 :{WINDOW_COLOUR_2}Cotton Candy price: STR_1970 :{WINDOW_COLOUR_2} STR_1971 :{WINDOW_COLOUR_2} STR_1972 :{WINDOW_COLOUR_2} @@ -1980,9 +1979,9 @@ STR_1975 :{WINDOW_COLOUR_2}Popcorn price: STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: STR_1977 :{WINDOW_COLOUR_2}Tentacle price: STR_1978 :{WINDOW_COLOUR_2}Hat price: -STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: +STR_1979 :{WINDOW_COLOUR_2}Candy Apple price: STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: -STR_1981 :{WINDOW_COLOUR_2}Doughnut price: +STR_1981 :{WINDOW_COLOUR_2}Donut price: STR_1982 :{WINDOW_COLOUR_2}Coffee price: STR_1983 :{WINDOW_COLOUR_2} STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: @@ -1996,9 +1995,9 @@ STR_1991 :On-Ride Photo STR_1992 :Umbrella STR_1993 :Drink STR_1994 :Burger -STR_1995 :Chips +STR_1995 :Fries STR_1996 :Ice Cream -STR_1997 :Candyfloss +STR_1997 :Cotton Candy STR_1998 :Empty Can STR_1999 :Rubbish STR_2000 :Empty Burger Box @@ -2008,9 +2007,9 @@ STR_2003 :Popcorn STR_2004 :Hot Dog STR_2005 :Tentacle STR_2006 :Hat -STR_2007 :Toffee Apple +STR_2007 :Candy Apple STR_2008 :T-Shirt -STR_2009 :Doughnut +STR_2009 :Donut STR_2010 :Coffee STR_2011 :Empty Cup STR_2012 :Fried Chicken @@ -2024,9 +2023,9 @@ STR_2019 :On-Ride Photos STR_2020 :Umbrellas STR_2021 :Drinks STR_2022 :Burgers -STR_2023 :Chips +STR_2023 :Fries STR_2024 :Ice Creams -STR_2025 :Candyfloss +STR_2025 :Cotton Candy STR_2026 :Empty Cans STR_2027 :Rubbish STR_2028 :Empty Burger Boxes @@ -2036,9 +2035,9 @@ STR_2031 :Popcorn STR_2032 :Hot Dogs STR_2033 :Tentacles STR_2034 :Hats -STR_2035 :Toffee Apples +STR_2035 :Candy Apples STR_2036 :T-Shirts -STR_2037 :Doughnuts +STR_2037 :Donuts STR_2038 :Coffees STR_2039 :Empty Cups STR_2040 :Fried Chicken @@ -2052,9 +2051,9 @@ STR_2047 :an On-Ride Photo STR_2048 :an Umbrella STR_2049 :a Drink STR_2050 :a Burger -STR_2051 :some Chips +STR_2051 :some Fries STR_2052 :an Ice Cream -STR_2053 :some Candyfloss +STR_2053 :some Cotton Candy STR_2054 :an Empty Can STR_2055 :some Rubbish STR_2056 :an Empty Burger Box @@ -2064,9 +2063,9 @@ STR_2059 :some Popcorn STR_2060 :a Hot Dog STR_2061 :a Tentacle STR_2062 :a Hat -STR_2063 :a Toffee Apple +STR_2063 :a Candy Apple STR_2064 :a T-Shirt -STR_2065 :a Doughnut +STR_2065 :a Donut STR_2066 :a Coffee STR_2067 :an Empty Cup STR_2068 :some Fried Chicken @@ -2080,9 +2079,9 @@ STR_2075 :On-Ride Photo of {STRINGID} STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Umbrella STR_2077 :Drink STR_2078 :Burger -STR_2079 :Chips +STR_2079 :Fries STR_2080 :Ice Cream -STR_2081 :Candyfloss +STR_2081 :Cotton Candy STR_2082 :Empty Can STR_2083 :Rubbish STR_2084 :Empty Burger Box @@ -2092,9 +2091,9 @@ STR_2087 :Popcorn STR_2088 :Hot Dog STR_2089 :Tentacle STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hat -STR_2091 :Toffee Apple +STR_2091 :Candy Apple STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-Shirt -STR_2093 :Doughnut +STR_2093 :Donut STR_2094 :Coffee STR_2095 :Empty Cup STR_2096 :Fried Chicken @@ -2224,7 +2223,7 @@ STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} STR_2221 :{SMALLFONT}{BLACK}Park Rating: {COMMA16} STR_2222 :{SMALLFONT}{BLACK}{STRINGID} -STR_2223 :{WINDOW_COLOUR_2}遊客s in park: {BLACK}{COMMA16} +STR_2223 :{WINDOW_COLOUR_2}Guests in park: {BLACK}{COMMA16} STR_2224 :{WINDOW_COLOUR_2}Cash: {BLACK}{CURRENCY2DP} STR_2225 :{WINDOW_COLOUR_2}Cash: {RED}{CURRENCY2DP} STR_2226 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} @@ -2387,24 +2386,24 @@ STR_2382 :Land STR_2383 :Water STR_2384 :{WINDOW_COLOUR_2}Your objective: STR_2385 :{BLACK}None -STR_2386 :{BLACK}To have at least {COMMA16} 遊客s in your park at the end of {MONTHYEAR}, with a park rating of at least 600 +STR_2386 :{BLACK}To have at least {COMMA16} guests in your park at the end of {MONTHYEAR}, with a park rating of at least 600 STR_2387 :{BLACK}To achieve a park value of at least {POP16}{POP16}{CURRENCY} at the end of {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} STR_2388 :{BLACK}Have Fun! STR_2389 :{BLACK}Build the best {STRINGID} you can! STR_2390 :{BLACK}To have 10 different types of roller coasters operating in your park, each with an excitement value of at least 6.00 -STR_2391 :{BLACK}To have at least {COMMA16} 遊客s in your park. You must not let the park rating drop below 700 at any time! +STR_2391 :{BLACK}To have at least {COMMA16} guests in your park. You must not let the park rating drop below 700 at any time! STR_2392 :{BLACK}To achieve a monthly income from ride tickets of at least {POP16}{POP16}{CURRENCY} STR_2393 :{BLACK}To have 10 different types of roller coasters operating in your park, each with a minimum length of {LENGTH}, and an excitement rating of at least 7.00 STR_2394 :{BLACK}To finish building all 5 of the partially built roller coasters in this park, designing them to achieve excitement ratings of at least {POP16}{POP16}{COMMA2DP32} each STR_2395 :{BLACK}To repay your loan and achieve a park value of at least {POP16}{POP16}{CURRENCY} STR_2396 :{BLACK}To achieve a monthly profit from food, drink and merchandise sales of at least {POP16}{POP16}{CURRENCY} STR_2397 :None -STR_2398 :Number of 遊客s at a given date +STR_2398 :Number of guests at a given date STR_2399 :Park value at a given date STR_2400 :Have fun STR_2401 :Build the best ride you can STR_2402 :Build 10 roller coasters -STR_2403 :Number of 遊客s in park +STR_2403 :Number of guests in park STR_2404 :Monthly income from ride tickets STR_2405 :Build 10 roller coasters of a given length STR_2406 :Finish building 5 roller coasters @@ -2465,7 +2464,7 @@ STR_2460 :{SMALLFONT}{BLACK}Show graph of weekly profit STR_2461 :{SMALLFONT}{BLACK}Show marketing campaigns STR_2462 :{SMALLFONT}{BLACK}Show view of park entrance STR_2463 :{SMALLFONT}{BLACK}Show graph of park ratings over time -STR_2464 :{SMALLFONT}{BLACK}Show graph of 遊客 numbers over time +STR_2464 :{SMALLFONT}{BLACK}Show graph of guest numbers over time STR_2465 :{SMALLFONT}{BLACK}Show park entrance price and information STR_2466 :{SMALLFONT}{BLACK}Show park statistics STR_2467 :{SMALLFONT}{BLACK}Show objectives for this game @@ -2488,8 +2487,8 @@ STR_2483 :{WINDOW_COLOUR_2}Weekly profit: {BLACK}+{CURRENCY2DP} STR_2484 :{WINDOW_COLOUR_2}Weekly profit: {RED}{CURRENCY2DP} STR_2485 :Controls STR_2486 :General -STR_2487 :Show 'real' names of 遊客s -STR_2488 :{SMALLFONT}{BLACK}Toggle between showing 'real' names of 遊客s and 遊客 numbers +STR_2487 :Show 'real' names of guests +STR_2488 :{SMALLFONT}{BLACK}Toggle between showing 'real' names of guests and guest numbers STR_2489 :Shortcut keys... STR_2490 :Keyboard shortcuts STR_2491 :Reset keys @@ -2521,12 +2520,12 @@ STR_2516 :Show financial information STR_2517 :Show research information STR_2518 :Show rides list STR_2519 :Show park information -STR_2520 :Show 遊客 list +STR_2520 :Show guest list STR_2521 :Show staff list STR_2522 :Show recent messages STR_2523 :Show map STR_2524 :Screenshot -### The following need to be reordered to match SDL_keycode layout. + STR_2525 :??? STR_2526 :??? STR_2527 :??? @@ -2684,8 +2683,8 @@ STR_2678 :??? STR_2679 :??? STR_2680 :All research complete STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 -STR_2682 : -STR_2683 : +STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry +STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive STR_2685 :Simplex Noise Parameters STR_2686 :{WINDOW_COLOUR_2}Low: @@ -2752,6 +2751,7 @@ STR_2746 :] STR_2747 :{ENDQUOTES} STR_2748 :Bar STR_2749 :My new scenario + # New strings used in the cheats window previously these were ??? STR_2750 :Move all items to top STR_2751 :Move all items to bottom @@ -2764,10 +2764,10 @@ STR_2757 :Force Sun STR_2758 :Force Thunder STR_2759 :Zero Clearance STR_2760 :+5K Money -STR_2761 : -STR_2762 : +STR_2761 :Pay For Entrance +STR_2762 :Pay For Rides STR_2763 :??? -STR_2764 : +STR_2764 :Happy Guests STR_2765 :Large Tram STR_2766 :Win scenario STR_2767 :Freeze Climate @@ -2785,6 +2785,8 @@ STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} STR_2779 :Viewport #{COMMA16} STR_2780 :Extra viewport # End of new strings + + STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + @@ -2807,17 +2809,17 @@ STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32} STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP} STR_2802 :Map -STR_2803 :{SMALLFONT}{BLACK}Show these 遊客s highlighted on map +STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map STR_2805 :{SMALLFONT}{BLACK}Show map of park -STR_2806 :{RED}遊客s are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organizing them better -STR_2807 :{RED}遊客s are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organizing them better -STR_2808 :{RED}遊客s are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better -STR_2809 :{RED}遊客s are hungry and can't find anywhere to buy food -STR_2810 :{RED}遊客s are thirsty and can't find anywhere to buy drinks -STR_2811 :{RED}遊客s are complaining because they can't find the toilets in your park -STR_2812 :{RED}遊客s are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the 遊客s find their way around -STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more 遊客s +STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organizing them better +STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organizing them better +STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better +STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food +STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks +STR_2811 :{RED}Guests are complaining because they can't find the restrooms in your park +STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around +STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests STR_2814 :{WINDOW_COLOUR_2}Most untidy park award STR_2815 :{WINDOW_COLOUR_2}Tidiest park award STR_2816 :{WINDOW_COLOUR_2}Award for the park with the best roller coasters @@ -2828,11 +2830,11 @@ STR_2820 :{WINDOW_COLOUR_2}Safest park award STR_2821 :{WINDOW_COLOUR_2}Best staff award STR_2822 :{WINDOW_COLOUR_2}Best park food award STR_2823 :{WINDOW_COLOUR_2}Worst park food award -STR_2824 :{WINDOW_COLOUR_2}Best park toilets award +STR_2824 :{WINDOW_COLOUR_2}Best park restrooms award STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award STR_2826 :{WINDOW_COLOUR_2}Best water rides award STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award -STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride colour schemes award +STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride color schemes award STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award STR_2830 :{WINDOW_COLOUR_2}Best gentle ride award STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'! @@ -2845,11 +2847,11 @@ STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park i STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! -STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best toilet facilities in the country'! +STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best restroom facilities in the country'! STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water rides in the country'! STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed rides'! -STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of colour schemes'! +STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of color schemes'! STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle rides'! STR_2848 :{WINDOW_COLOUR_2}No recent awards @@ -2858,7 +2860,7 @@ STR_2850 :New track design installed successfully STR_2851 :Scenario already installed STR_2852 :Track design already installed STR_2853 :Forbidden by the local authority! -STR_2854 :{RED}遊客s can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance +STR_2854 :{RED}Guests can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the ride exit STR_2856 :{WINDOW_COLOUR_2}Tutorial STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) @@ -2973,33 +2975,33 @@ STR_2965 :{WINDOW_COLOUR_2} STR_2966 : STR_2967 : STR_2968 : -STR_2969 :Use of this product is subject to the terms of a licence agreement -STR_2970 :found in the product's {OPENQUOTES}ReadMe{ENDQUOTES} file and in the manual -STR_2971 :Main colour scheme -STR_2972 :Alternative colour scheme 1 -STR_2973 :Alternative colour scheme 2 -STR_2974 :Alternative colour scheme 3 -STR_2975 :{SMALLFONT}{BLACK}Select which colour scheme to change, or paint ride with -STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected colour scheme -STR_2977 :Staff member name -STR_2978 :Enter new name for this member of staff: -STR_2979 :Can't name staff member... -STR_2980 :Too many banners in game +STR_2969 :本產品的使用需經過版權授權 +STR_2970 :在產品的{OPENQUOTES}讀我檔案ReadMe{ENDQUOTES}檔案及手冊可找到 +STR_2971 :主要顏色調配 +STR_2972 :額外顏色調配1 +STR_2973 :額外顏色調配2 +STR_2974 :額外顏色調配3 +STR_2975 :{SMALLFONT}{BLACK}選取遊樂設施的顏色調配來修改 +STR_2976 :{SMALLFONT}{BLACK}將目前指定的顏色調配塗上遊樂設施的指定區域 +STR_2977 :員工命名 +STR_2978 :請輸入這位員工的新姓名: +STR_2979 :不能命名這位員工... +STR_2980 :太多招牌 STR_2981 :{RED}No entry - - -STR_2982 :Banner text -STR_2983 :Enter new text for this banner: -STR_2984 :Can't set new text for banner... -STR_2985 :Banner -STR_2986 :{SMALLFONT}{BLACK}Change text on banner -STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for 遊客s -STR_2988 :{SMALLFONT}{BLACK}Demolish this banner -STR_2989 :{SMALLFONT}{BLACK}Select main colour -STR_2990 :{SMALLFONT}{BLACK}Select text colour -STR_2991 :Sign -STR_2992 :Sign text -STR_2993 :Enter new text for this sign: -STR_2994 :{SMALLFONT}{BLACK}Change text on sign -STR_2995 :{SMALLFONT}{BLACK}Demolish this sign +STR_2982 :橫額文字 +STR_2983 :請輸入橫額中的文字: +STR_2984 :不能設定橫額中的文字... +STR_2985 :橫額 +STR_2986 :{SMALLFONT}{BLACK}修改橫額中的文字 +STR_2987 :{SMALLFONT}{BLACK}將此橫額顯示為'遊客止步' +STR_2988 :{SMALLFONT}{BLACK}拆除這個橫額 +STR_2989 :{SMALLFONT}{BLACK}選擇橫額顏色 +STR_2990 :{SMALLFONT}{BLACK}選擇文字顏色 +STR_2991 :招牌 +STR_2992 :修改招牌中的文字 +STR_2993 :請輸入招牌中的文字: +STR_2994 :{SMALLFONT}{BLACK}修改招牌中的文字 +STR_2995 :{SMALLFONT}{BLACK}拆除這個招牌 STR_2996 :{BLACK}ABC STR_2997 :{GREY}ABC STR_2998 :{WHITE}ABC @@ -3014,41 +3016,41 @@ STR_3006 :{PALEGOLD}ABC STR_3007 :{LIGHTPINK}ABC STR_3008 :{PEARLAQUA}ABC STR_3009 :{PALESILVER}ABC -STR_3010 :Unable to load file... -STR_3011 :File contains invalid data -STR_3012 :Dodgems beat style -STR_3013 :Fairground organ style -STR_3014 :Roman fanfare style -STR_3015 :Oriental style -STR_3016 :Martian style -STR_3017 :Jungle drums style -STR_3018 :Egyptian style -STR_3019 :Toyland style +STR_3010 :無法載入檔案... +STR_3011 :檔案中含有非法資料 +STR_3012 :Dodgems beat 風格 +STR_3013 :Fairground organ 風格 +STR_3014 :Roman fanfare 風格 +STR_3015 :Oriental 風格 +STR_3016 :Martian 風格 +STR_3017 :Jungle drums 風格 +STR_3018 :Egyptian 風格 +STR_3019 :Toyland 風格 STR_3020 : -STR_3021 :Space style -STR_3022 :Horror style -STR_3023 :Techno style -STR_3024 :Gentle style -STR_3025 :Summer style -STR_3026 :Water style -STR_3027 :Wild west style -STR_3028 :Jurassic style -STR_3029 :Rock style -STR_3030 :Ragtime style -STR_3031 :Fantasy style -STR_3032 :Rock style 2 -STR_3033 :Ice style -STR_3034 :Snow style +STR_3021 :Space 風格 +STR_3022 :Horror 風格 +STR_3023 :Techno 風格 +STR_3024 :Gentle 風格 +STR_3025 :Summer 風格 +STR_3026 :Water 風格 +STR_3027 :Wild west 風格 +STR_3028 :Jurassic 風格 +STR_3029 :Rock 風格 +STR_3030 :Ragtime 風格 +STR_3031 :Fantasy 風格 +STR_3032 :Rock 風格 2 +STR_3033 :Ice 風格 +STR_3034 :Snow 風格 STR_3035 :Custom music 1 STR_3036 :Custom music 2 -STR_3037 :Medieval style -STR_3038 :Urban style -STR_3039 :Organ style -STR_3040 :Mechanical style -STR_3041 :Modern style -STR_3042 :Pirates style -STR_3043 :Rock style 3 -STR_3044 :Candy style +STR_3037 :Medieval 風格 +STR_3038 :Urban 風格 +STR_3039 :Organ 風格 +STR_3040 :Mechanical 風格 +STR_3041 :Modern 風格 +STR_3042 :Pirates 風格 +STR_3043 :Rock 風格 3 +STR_3044 :Candy 風格 STR_3045 :{SMALLFONT}{BLACK}Select style of music to play STR_3046 :This ride cannot be modified STR_3047 :Local authority forbids demolition or modifications to this ride @@ -3085,7 +3087,7 @@ STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! STR_3078 :Plain entrance STR_3079 :Wooden entrance STR_3080 :Canvas tent entrance -STR_3081 :Castle entrance (grey) +STR_3081 :Castle entrance (gray) STR_3082 :Castle entrance (brown) STR_3083 :Jungle entrance STR_3084 :Log cabin entrance @@ -3097,20 +3099,20 @@ STR_3089 :Space entrance STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station STR_3091 :You are not allowed to remove this section! STR_3092 :You are not allowed to move or modify the station for this ride! -STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} +STR_3093 :{WINDOW_COLOUR_2}Favorite: {BLACK}{STRINGID} STR_3094 :N/A STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed STR_3098 :Can't change lift hill speed... -STR_3099 :{SMALLFONT}{BLACK}Select colour -STR_3100 :{SMALLFONT}{BLACK}Select second colour -STR_3101 :{SMALLFONT}{BLACK}Select third colour -STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape +STR_3099 :{SMALLFONT}{BLACK}Select color +STR_3100 :{SMALLFONT}{BLACK}Select second color +STR_3101 :{SMALLFONT}{BLACK}Select third color +STR_3102 :{SMALLFONT}{BLACK}Re-paint colored scenery on landscape STR_3103 :Can't re-paint this... STR_3104 :{SMALLFONT}{BLACK}List rides STR_3105 :{SMALLFONT}{BLACK}List shops and stalls -STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other 遊客 facilities +STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other guest facilities STR_3107 :Close STR_3108 :Test STR_3109 :Open @@ -3126,8 +3128,8 @@ STR_3118 :{BLACK}{STRINGID} is heading for the ride STR_3119 :{BLACK}{STRINGID} is fixing the ride STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy -STR_3122 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} 遊客 -STR_3123 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} 遊客s +STR_3122 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guest +STR_3123 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guests STR_3124 :Broken {STRINGID} STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% @@ -3176,7 +3178,7 @@ STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} STR_3169 :Data for the following object not found: STR_3170 :Not enough space for graphics STR_3171 :Too many objects of this type selected -STR_3172 :The following object must be selected first: {STRING} +STR_3172 :The following object must be selected first: STR_3173 :This object is currently in use STR_3174 :This object is required by another object STR_3175 :This object is always required @@ -3237,10 +3239,10 @@ STR_3229 :Block Brakes cannot be used directly after station STR_3230 :Block Brakes cannot be used directly after each other STR_3231 :Block Brakes cannot be used directly after the top of this lift hill STR_3232 :Options - Financial -STR_3233 :Options - 遊客s +STR_3233 :Options - Guests STR_3234 :Options - Park STR_3235 :{SMALLFONT}{BLACK}Show financial options -STR_3236 :{SMALLFONT}{BLACK}Show 遊客 options +STR_3236 :{SMALLFONT}{BLACK}Show guest options STR_3237 :{SMALLFONT}{BLACK}Show park options STR_3238 :No Money STR_3239 :{SMALLFONT}{BLACK}Make this park a 'no money' park with no financial restrictions @@ -3260,14 +3262,14 @@ STR_3252 :Can't increase maximum loan size any further! STR_3253 :Can't reduce maximum loan size any further! STR_3254 :Can't increase interest rate any further! STR_3255 :Can't reduce interest rate any further! -STR_3256 :遊客s prefer less intense rides -STR_3257 :{SMALLFONT}{BLACK}Select whether 遊客s should generally prefer less intense rides only -STR_3258 :遊客s prefer more intense rides -STR_3259 :{SMALLFONT}{BLACK}Select whether 遊客s should generally prefer more intense rides only -STR_3260 :{WINDOW_COLOUR_2}Cash per 遊客 (average): -STR_3261 :{WINDOW_COLOUR_2}遊客s initial happiness: -STR_3262 :{WINDOW_COLOUR_2}遊客s initial hunger: -STR_3263 :{WINDOW_COLOUR_2}遊客s initial thirst: +STR_3256 :Guests prefer less intense rides +STR_3257 :{SMALLFONT}{BLACK}Select whether guests should generally prefer less intense rides only +STR_3258 :Guests prefer more intense rides +STR_3259 :{SMALLFONT}{BLACK}Select whether guests should generally prefer more intense rides only +STR_3260 :{WINDOW_COLOUR_2}Cash per guest (average): +STR_3261 :{WINDOW_COLOUR_2}Guests initial happiness: +STR_3262 :{WINDOW_COLOUR_2}Guests initial hunger: +STR_3263 :{WINDOW_COLOUR_2}Guests initial thirst: STR_3264 :Can't increase this any further! STR_3265 :Can't reduce this any further! STR_3266 :{SMALLFONT}{BLACK}Select how this park charges for entrance and rides @@ -3279,8 +3281,8 @@ STR_3271 :Forbid high construction STR_3272 :{SMALLFONT}{BLACK}Forbid any tall construction STR_3273 :Park rating higher difficult level STR_3274 :{SMALLFONT}{BLACK}Make the park rating value more challenging -STR_3275 :遊客 generation higher difficult level -STR_3276 :{SMALLFONT}{BLACK}Make it more difficult to attract 遊客s to the park +STR_3275 :Guest generation higher difficult level +STR_3276 :{SMALLFONT}{BLACK}Make it more difficult to attract guests to the park STR_3277 :{WINDOW_COLOUR_2}Cost to buy land: STR_3278 :{WINDOW_COLOUR_2}Cost to buy construction rights: STR_3279 :Free park entry / Pay per ride @@ -3307,7 +3309,7 @@ STR_3299 :{WINDOW_COLOUR_2}Park/Scenario Details: STR_3300 :{WINDOW_COLOUR_2}Scenario Name: {BLACK}{STRINGID} STR_3301 :{WINDOW_COLOUR_2}Objective Date: STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR} -STR_3303 :{WINDOW_COLOUR_2}Number of 遊客s: +STR_3303 :{WINDOW_COLOUR_2}Number of guests: STR_3304 :{WINDOW_COLOUR_2}Park value: STR_3305 :{WINDOW_COLOUR_2}Monthly income: STR_3306 :{WINDOW_COLOUR_2}Monthly profit: @@ -3376,8 +3378,8 @@ STR_3368 :{BLACK}= Drink Stall STR_3369 :{BLACK}= Souvenir Stall STR_3370 :{BLACK}= Info. Kiosk STR_3371 :{BLACK}= First Aid -STR_3372 :{BLACK}= Cash Machine -STR_3373 :{BLACK}= Toilet +STR_3372 :{BLACK}= A.T.M. +STR_3373 :{BLACK}= Restroom STR_3374 :Warning: Too many objects selected! STR_3375 :Not all objects in this scenery group could be selected STR_3376 :Install new track design... @@ -3403,16 +3405,16 @@ STR_3395 :{SMALLFONT}{BLACK}Building anything at this scale is a bit difficul STR_3396 :{SMALLFONT}{BLACK}Let's build a simple ride to get the park started... STR_3397 :{SMALLFONT}{BLACK}The white 'ghost' image shows where the ride will be built. We'll move the pointer to select the position then click to build it... STR_3398 :{SMALLFONT}{BLACK}Rides need an entrance and an exit. We'll move the pointer to a square on the edge of the ride and then click to build first the entrance and then the exit... -STR_3399 :{SMALLFONT}{BLACK}We need to build footpaths to allow 遊客s to reach our new ride... +STR_3399 :{SMALLFONT}{BLACK}We need to build footpaths to allow guests to reach our new ride... STR_3400 :{SMALLFONT}{BLACK}For the path to the ride entrance we'll use a special 'queue line' path... STR_3401 :{SMALLFONT}{BLACK}For the exit path, just an 'ordinary' path will do... STR_3402 :{SMALLFONT}{BLACK}Right, lets open the ride! To open the ride we click the flag icon on the ride window and select 'open'... -STR_3403 :{SMALLFONT}{BLACK}But where are the 遊客s? +STR_3403 :{SMALLFONT}{BLACK}But where are the guests? STR_3404 :{SMALLFONT}{BLACK}Oh - The park is still closed! Right - Let's open it... -STR_3405 :{SMALLFONT}{BLACK}While we're waiting for our first 遊客s, let's build some scenery... +STR_3405 :{SMALLFONT}{BLACK}While we're waiting for our first guests, let's build some scenery... STR_3406 :{SMALLFONT}{BLACK}Here's our empty park. We're going to build a simple custom-designed ride... STR_3407 :{SMALLFONT}{BLACK}First we need to choose a starting position... -STR_3408 :{SMALLFONT}{BLACK}The section of track we've just built is a 'station platform', to allow 遊客s to get on and off the ride... +STR_3408 :{SMALLFONT}{BLACK}The section of track we've just built is a 'station platform', to allow guests to get on and off the ride... STR_3409 :{SMALLFONT}{BLACK}We'll extend the platform a bit by adding a couple more station platform sections... STR_3410 :{SMALLFONT}{BLACK}The icons at the top of the construction window let you choose different track pieces to add... STR_3411 :{SMALLFONT}{BLACK}We'll select a left-hand curve... @@ -3439,8 +3441,8 @@ STR_3431 :{SMALLFONT}{BLACK}That's better - Our train should make it up that STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve and station, so let's add some brakes... STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow two trains to operate more safely on the circuit... STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! -STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let 遊客s onto our new roller coaster... -STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... +STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... +STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customize the ride a bit... STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape STR_3438 :Unable to remove all scenery from here... STR_3439 :Clear Scenery @@ -3484,9 +3486,11 @@ STR_5147 :Show cheats button on toolbar STR_5148 :{SMALLFONT}{BLACK}Change the game speed STR_5149 :{SMALLFONT}{BLACK}Open the cheats window STR_5150 :Enable debugging tools +#Thousands separator STR_5151 :, +#Decimals separator STR_5152 :. -STR_5153 :Edit Themes... +STR_5153 :Color schemes... 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 @@ -3501,18 +3505,18 @@ STR_5164 :Twitch Channel name STR_5165 :Name peeps after followers STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers STR_5167 :Track follower peeps -STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for 遊客s named after channel's Twitch followers +STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after channel's Twitch followers STR_5169 :Name peeps after people in Twitch chat STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat STR_5171 :Track chat peeps -STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for 遊客s named after Twitch chat participants +STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after Twitch chat participants STR_5173 :Pull Twitch chat as news STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications STR_5175 :Input the name of your Twitch channel STR_5176 :Enable Twitch integration STR_5177 :Fullscreen mode: STR_5178 :{SMALLFONT}{BLACK}Show financial cheats -STR_5179 :{SMALLFONT}{BLACK}Show 遊客 cheats +STR_5179 :{SMALLFONT}{BLACK}Show guest cheats STR_5180 :{SMALLFONT}{BLACK}Show park cheats STR_5181 :{SMALLFONT}{BLACK}Show ride cheats STR_5182 :{INT32} @@ -3538,8 +3542,8 @@ STR_5201 :New Ride STR_5202 :Track Design Selection STR_5203 :Ride STR_5204 :Ride List -STR_5205 :遊客 -STR_5206 :遊客 List +STR_5205 :Guest +STR_5206 :Guest List STR_5207 :Staff STR_5208 :Staff List STR_5209 :Banner @@ -3587,8 +3591,8 @@ STR_5250 :Title Exit Button STR_5251 :Title Options Button STR_5252 :Title Scenario Selection STR_5253 :Park Information -STR_5254 : -STR_5255 : +STR_5254 :Create +STR_5255 :{SMALLFONT}{BLACK}Create a new title sequence from scratch STR_5256 :Create a new theme to make changes to STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one STR_5258 :{SMALLFONT}{BLACK}Delete the current theme @@ -3607,7 +3611,7 @@ STR_5270 :{SMALLFONT}{BLACK}Miscellaneous STR_5271 :{SMALLFONT}{BLACK}Twitch STR_5272 :{SMALLFONT}{BLACK}Small Scenery STR_5273 :{SMALLFONT}{BLACK}Large Scenery -STR_5274 :{SMALLFONT}{BLACK}Footpath +STR_5274 :{SMALLFONT}{BLACK}Footpaths STR_5275 :Search for Objects STR_5276 :Enter the name of an object to search for STR_5277 :Clear @@ -3619,7 +3623,7 @@ STR_5282 :RCT1 Ride Open/Close Lights STR_5283 :RCT1 Park Open/Close Lights STR_5284 :RCT1 Scenario Selection Font STR_5285 :EXPLODE!!! -STR_5286 :{SMALLFONT}{BLACK}Makes some 遊客s explode +STR_5286 :{SMALLFONT}{BLACK}Makes some guests explode STR_5287 :Ride is already broken down STR_5288 :Ride is closed STR_5289 :No breakdowns available for this ride @@ -3679,22 +3683,22 @@ STR_5342 :Choose a map tile STR_5343 :Automatically place staff STR_5344 :Changelog STR_5345 :Financial cheats -STR_5346 :遊客 cheats -STR_5347 :Ride cheats -STR_5348 :Park cheats +STR_5346 :Guest cheats +STR_5347 :Park cheats +STR_5348 :Ride cheats STR_5349 :{SMALLFONT}{BLACK}All Rides STR_5350 :Max STR_5351 :Min -STR_5352 :{BLACK}Happiness: -STR_5353 :{BLACK}Energy: -STR_5354 :{BLACK}Hunger: -STR_5355 :{BLACK}Thirst: -STR_5356 :{BLACK}Nausea: -STR_5357 :{BLACK}Nausea tolerance: -STR_5358 :{BLACK}Bathroom: -STR_5359 :Remove 遊客s -STR_5360 :{SMALLFONT}{BLACK}Removes all 遊客s from the map -STR_5361 :{BLACK}Give all 遊客s: +STR_5352 :{BLACK}快樂度: +STR_5353 :{BLACK}體力: +STR_5354 :{BLACK}飢餓度: +STR_5355 :{BLACK}口渴度: +STR_5356 :{BLACK}噁心度: +STR_5357 :{BLACK}忍受噁心程度: +STR_5358 :{BLACK}如廁度: +STR_5359 :移除遊客 +STR_5360 :{SMALLFONT}{BLACK}移除樂園中所有遊客 +STR_5361 :{BLACK}Give all guests: STR_5362 :{BLACK}Preferred intensity: STR_5363 :> 1 STR_5364 :< 15 @@ -3703,7 +3707,7 @@ STR_5366 :Normal STR_5367 :Fast STR_5368 :Reset crash status STR_5369 :Park parameters... -STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}遊客 generation and money. +STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. STR_5371 :Object Selection STR_5372 :Invert right mouse dragging STR_5373 :Name {STRINGID} @@ -3732,7 +3736,7 @@ STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game STR_5397 :Can only be used on the title screen STR_5398 :Cannot edit title sequence while it's playing -STR_5399 :Press the stop button to coninue editing +STR_5399 :Press the stop button to continue editing STR_5400 :Can't change this title sequence STR_5401 :Create a new title sequence to make changes to STR_5402 :Failed to load title sequence @@ -3772,6 +3776,17 @@ STR_5435 :Rename save STR_5436 :Edit Title Sequences... STR_5437 :No save selected STR_5438 :Can't make changes while command editor is open -STR_5439 :A restart is used without a wait command +STR_5439 :A wait command with at least 4 seconds is required with a restart command STR_5440 :Minimize fullscreen on focus loss -STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. Only{NEWLINE}toggleable in the title screen. +STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. +STR_5442 :Force park rating: +STR_5443 :Speed{MOVE_X}{87}{STRINGID} +STR_5444 :Speed: +STR_5445 :Speed +STR_5446 :Get +STR_5447 :Type {STRINGID} +STR_5448 :Ride / Vehicle {STRINGID} +STR_5449 :Reduce game speed +STR_5450 :Increase game speed +STR_5451 :Open cheats window +STR_5452 :Toggle visibility of toolbars diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 3a435611d2..bdbc71245d 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -2679,7 +2679,7 @@ STR_2677 :??? STR_2678 :??? STR_2679 :??? STR_2680 :Alle onderzoeken zijn voltooid -STR_2681 :{MEDIUMFONT}{BLACK}Krijg 5.000 extra geld +STR_2681 :{MEDIUMFONT}{BLACK}Verhoog je saldo met {CURRENCY} STR_2682 :{MEDIUMFONT}{BLACK}Wissel tussen betaalde en gratis entree STR_2683 :{MEDIUMFONT}{BLACK}Alle bezoekers hebben een maximale tevredenheid STR_2684 :{SMALLFONT}{BLACK}Er arriveert een grote groep bezoekers @@ -2758,7 +2758,7 @@ STR_2756 :Afval verwijderen STR_2757 :Mooi weer STR_2758 :Regen STR_2759 :Hoogtes op nul -STR_2760 :+5000 geld +STR_2760 :+{CURRENCY} STR_2761 :Betaalde entree STR_2762 :Betalen per rit STR_2763 :??? @@ -3690,10 +3690,10 @@ STR_5357 :{BLACK}Misselijkheidstol.: STR_5358 :{BLACK}WC: STR_5359 :Bez. verwijderen STR_5360 :{SMALLFONT}{BLACK}Verwijdert alle bezoekers van de kaart -STR_5361 :{BLACK}Geef alle bez.: -STR_5362 :{BLACK}Voorkeursintensiteit: -STR_5363 :> 1 -STR_5364 :< 15 +STR_5361 :Geef alle bez.: +STR_5362 :{BLACK}Zet de voorkeursintensiteit van alle bez. op: +STR_5363 :Meer dan 1 +STR_5364 :Minder dan 15 STR_5365 :{BLACK}Snelheid werknemers: STR_5366 :Normaal STR_5367 :Snel @@ -3783,3 +3783,13 @@ STR_5450 :Spelsnelheid verhogen STR_5451 :Cheatsvenster openen STR_5452 :Zichtbaarheid werkbalken schakelen STR_5453 :Andere attractie selecteren +STR_5454 :FPS-limiet opheffen +STR_5458 :Met de klok mee draaien +STR_5459 :Tegen de klok in draaien +STR_5460 :Beeld tegen de klok in draaien +STR_5461 :Bezoekersparameters aanpassen +STR_5462 :{CURRENCY} +STR_5463 :Doel: Plezier hebben! +STR_5464 :Algemeen +STR_5465 :Weer +STR_5466 :Werknemers diff --git a/data/language/german.txt b/data/language/german.txt index 47e81a03f8..ef55782316 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -2501,7 +2501,7 @@ STR_2495 :Baumodus abbrechen STR_2496 :Spielpause STR_2497 :Ansicht wegzoomen STR_2498 :Ansicht heranzoomen -STR_2499 :Ansicht drehen +STR_2499 :Ansicht im Uhrzeigersinn drehen STR_2500 :Bauobjekt drehen STR_2501 :Sicht auf Untergrund ein/aus STR_2502 :Grundfläche ein/aus @@ -2684,7 +2684,7 @@ STR_2677 :??? STR_2678 :??? STR_2679 :??? STR_2680 :Alle Forschungen beendet -STR_2681 :{MEDIUMFONT}{BLACK}Erhöht Ihr Geld um 5.000 +STR_2681 :{MEDIUMFONT}{BLACK}Erhöht Ihr Geld um {CURRENCY} STR_2682 :{MEDIUMFONT}{BLACK}Zw. freiem und kostenpfl. Eintritt umsch. STR_2683 :{MEDIUMFONT}{BLACK}Erhöht das Vergnügen der Besucher maximal STR_2684 :{SMALLFONT}{BLACK}Eine große Gruppe von Besuchern tritt ein @@ -2764,14 +2764,14 @@ STR_2756 :Müll beseitigen STR_2757 :Schönes Wetter STR_2758 :Gewitter STR_2759 :Höhen auf Null -STR_2760 :+5.000 Geld +STR_2760 :+{CURRENCY} STR_2761 :Bezahlen für Eintritt STR_2762 :Bezahlen für Bahnen STR_2763 :??? STR_2764 :Glückliche Gäste STR_2765 :Große Straßenbahn STR_2766 :Szenario gewinnen -STR_2767 :Wetter stoppen +STR_2767 :Wetter einfrieren STR_2768 :Wetter fortsetzen STR_2769 :Park öffnen STR_2770 :Park schließen @@ -3694,10 +3694,10 @@ STR_5357 :{BLACK}Übelkeitstoleranz: STR_5358 :{BLACK}Toilette: STR_5359 :Besucher entfernen STR_5360 :{SMALLFONT}{BLACK}Alle Besucher von der Karte entfernen -STR_5361 :{BLACK}Für alle Besucher: -STR_5362 :{BLACK}Bevorz. Intensität: -STR_5363 :> 1 -STR_5364 :< 15 +STR_5361 :Gib allen Besuchern: +STR_5362 :{BLACK}Bevorzugte Bahnintensität aller Besucher: +STR_5363 :Mehr als 1 +STR_5364 :Weniger als 15 STR_5365 :{BLACK}Personalgeschw.: STR_5366 :Normal STR_5367 :Schnell @@ -3788,3 +3788,12 @@ STR_5451 :Cheatfenster anzeigen STR_5452 :Symbolleiste ein-/ausblenden STR_5453 :Andere Attraktion auswählen STR_5454 :FPS-Limit aufheben +STR_5458 :Im Uhrzeigersinn drehen +STR_5459 :Gegen den Uhrzeigersinn drehen +STR_5460 :Ansicht gegen den Uhrzeigers. drehen +STR_5461 :Besucherparameter festlegen +STR_5462 :{CURRENCY} +STR_5463 :Ziel: Viel Spaß! +STR_5464 :Allgemein +STR_5465 :Klima +STR_5466 :Personal From e8d8f7c68423875d873a3163abf3689064ccf71b Mon Sep 17 00:00:00 2001 From: zsilencer Date: Fri, 10 Jul 2015 21:01:58 -0600 Subject: [PATCH 0248/1173] fix invalidation issue with picked up staff --- src/drawing/drawing.c | 33 +++++++++++++++++++-------------- src/drawing/drawing.h | 3 ++- src/game.c | 1 + src/interface/screenshot.c | 2 +- src/rct2.c | 3 +-- 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index 00d5ef84c4..5d573c2467 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -454,22 +454,9 @@ void gfx_draw_rain(int left, int top, int width, int height, sint32 x_start, sin * * rct2: 0x006843DC */ -void redraw_peep_and_rain() +void redraw_rain() { if (RCT2_GLOBAL(0x009ABDF2, uint32) != 0) { - int sprite = RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_SPRITE, sint32); - if (sprite != -1) { - sprite = sprite & 0x7FFFF; - - rct_g1_element *g1_elements = &g1Elements[sprite]; - int left = RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_X, sint16) + g1_elements->x_offset; - int top = RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_Y, sint16) + g1_elements->y_offset; - int right = left + g1_elements->width; - int bottom = top + g1_elements->height; - - gfx_set_dirty_blocks(left, top, right, bottom); - } - int rain_no_pixels = RCT2_GLOBAL(RCT2_ADDRESS_NO_RAIN_PIXELS, uint32); if (rain_no_pixels == 0) { return; @@ -495,6 +482,24 @@ void redraw_peep_and_rain() RCT2_GLOBAL(RCT2_ADDRESS_NO_RAIN_PIXELS, uint32) = 0; } +void gfx_invalidate_pickedup_peep() +{ + if (RCT2_GLOBAL(0x009ABDF2, uint32) != 0) { + int sprite = RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_SPRITE, sint32); + if (sprite != -1) { + sprite = sprite & 0x7FFFF; + + rct_g1_element *g1_elements = &g1Elements[sprite]; + int left = RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_X, sint16) + g1_elements->x_offset; + int top = RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_Y, sint16) + g1_elements->y_offset; + int right = left + g1_elements->width; + int bottom = top + g1_elements->height; + + gfx_set_dirty_blocks(left, top, right, bottom); + } + } +} + void sub_681DE2(rct_drawpixelinfo *dpi, int x, int y, int image1, int image2) { RCT2_CALLPROC_X(0x00681DE2, 0, image1, x, y, 0, (int)dpi, image2); diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 97ec0b81e1..c00d051747 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -93,6 +93,7 @@ void load_palette(); void gfx_draw_rain(int left, int top, int width, int height, sint32 x_start, sint32 y_start); void gfx_clear(rct_drawpixelinfo *dpi, int colour); void gfx_draw_pixel(rct_drawpixelinfo *dpi, int x, int y, int colour); +void gfx_invalidate_pickedup_peep(); // line void gfx_draw_line(rct_drawpixelinfo *dpi, int x1, int y1, int x2, int y2, int colour); @@ -134,7 +135,7 @@ void sub_6C1F57(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct // rain void update_rain_animation(); -void redraw_peep_and_rain(); +void redraw_rain(); // unknown void sub_681DE2(rct_drawpixelinfo *dpi, int x, int y, int image1, int image2); diff --git a/src/game.c b/src/game.c index cb4ae078e1..4c50bb68ae 100644 --- a/src/game.c +++ b/src/game.c @@ -325,6 +325,7 @@ void game_logic_update() peep_update_crowd_noise(); climate_update_sound(); editor_open_windows_for_current_step(); + gfx_invalidate_pickedup_peep(); // Update windows //window_dispatch_update_all(); diff --git a/src/interface/screenshot.c b/src/interface/screenshot.c index 5aa010ca5a..14a9d83b72 100644 --- a/src/interface/screenshot.c +++ b/src/interface/screenshot.c @@ -66,7 +66,7 @@ void screenshot_check() } RCT2_GLOBAL(0x009A8C29, uint8) &= ~1; - redraw_peep_and_rain(); + redraw_rain(); } } } diff --git a/src/rct2.c b/src/rct2.c index b9a231003d..a9c5a9a39e 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -216,8 +216,7 @@ void rct2_update() void rct2_draw() { - // Handles picked-up peep and rain redraw - redraw_peep_and_rain(); + redraw_rain(); window_update_all(); update_rain_animation(); update_palette_effects(); From b876591543854b480d8d93ff440437f0e5b41d1d Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sat, 4 Jul 2015 22:36:25 -0600 Subject: [PATCH 0249/1173] use SDL_RWops for save games --- src/audio/mixer.cpp | 15 +--- src/editor.c | 40 ++++----- src/game.c | 91 ++++++++++---------- src/game.h | 5 +- src/object.c | 48 +++++------ src/object.h | 7 +- src/object_list.c | 4 +- src/platform/platform.h | 1 + src/platform/shared.c | 8 ++ src/scenario.c | 125 ++++++++++++---------------- src/scenario.h | 4 +- src/title.c | 12 ++- src/util/sawyercoding.c | 21 ++--- src/util/sawyercoding.h | 4 +- src/windows/editor_bottom_toolbar.c | 6 +- src/windows/loadsave.c | 45 ++++++---- 16 files changed, 229 insertions(+), 207 deletions(-) diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index 6f242f933b..0d6844b616 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -90,11 +90,8 @@ bool Source_Sample::LoadWAV(const char* filename) { log_verbose("Source_Sample::LoadWAV(%s)", filename); - utf8 utf8filename[512]; - win1252_to_utf8(utf8filename, filename, sizeof(utf8filename)); - Unload(); - SDL_RWops* rw = SDL_RWFromFile(utf8filename, "rb"); + SDL_RWops* rw = platform_sdl_rwfromfile(filename, "rb"); if (rw == NULL) { log_verbose("Error loading %s", filename); return false; @@ -122,11 +119,8 @@ bool Source_Sample::LoadCSS1(const char* filename, unsigned int offset) { log_verbose("Source_Sample::LoadCSS1(%s, %d)", filename, offset); - utf8 utf8filename[512]; - win1252_to_utf8(utf8filename, filename, sizeof(utf8filename)); - Unload(); - SDL_RWops* rw = SDL_RWFromFile(utf8filename, "rb"); + SDL_RWops* rw = platform_sdl_rwfromfile(filename, "rb"); if (rw == NULL) { log_verbose("Unable to load %s", filename); return false; @@ -854,10 +848,7 @@ void* Mixer_Play_Music(int pathid, int loop, int streaming) if (streaming) { const char* filename = get_file_path(pathid); - utf8 utf8filename[512]; - win1252_to_utf8(utf8filename, filename, sizeof(utf8filename)); - - SDL_RWops* rw = SDL_RWFromFile(utf8filename, "rb"); + SDL_RWops* rw = platform_sdl_rwfromfile(filename, "rb"); if (rw == NULL) { return 0; } diff --git a/src/editor.c b/src/editor.c index 8c80024260..bb9bef8c2c 100644 --- a/src/editor.c +++ b/src/editor.c @@ -339,16 +339,16 @@ static int editor_load_landscape_from_sc4(const char *path) static int editor_read_s6(const char *path) { int i, j; - FILE *file; + SDL_RWops* rw; rct_s6_header *s6Header = (rct_s6_header*)0x009E34E4; rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; log_verbose("loading landscape, %s", path); - file = fopen(path, "rb"); - if (file != NULL) { - if (!sawyercoding_validate_checksum(file)) { - fclose(file); + rw = platform_sdl_rwfromfile(path, "rb"); + if (rw != NULL) { + if (!sawyercoding_validate_checksum(rw)) { + SDL_RWclose(rw); RCT2_GLOBAL(RCT2_ADDRESS_ERROR_TYPE, uint8) = 255; RCT2_GLOBAL(RCT2_ADDRESS_ERROR_STRING_ID, uint16) = STR_FILE_CONTAINS_INVALID_DATA; @@ -357,10 +357,10 @@ static int editor_read_s6(const char *path) } // Read first chunk - sawyercoding_read_chunk(file, (uint8*)s6Header); + sawyercoding_read_chunk(rw, (uint8*)s6Header); if (s6Header->type == S6_TYPE_SCENARIO) { // Read second chunk - sawyercoding_read_chunk(file, (uint8*)s6Info); + sawyercoding_read_chunk(rw, (uint8*)s6Info); if (s6Info->var_000 == 255) s6Info->var_000 = 1; @@ -374,50 +374,50 @@ static int editor_read_s6(const char *path) if (s6Header->num_packed_objects > 0) { j = 0; for (i = 0; i < s6Header->num_packed_objects; i++) - j += object_load_packed(file); + j += object_load_packed(rw); if (j > 0) object_list_load(); } - uint8 load_success = object_read_and_load_entries(file); + uint8 load_success = object_read_and_load_entries(rw); // Read flags (16 bytes). Loads: // RCT2_ADDRESS_CURRENT_MONTH_YEAR // RCT2_ADDRESS_CURRENT_MONTH_TICKS // RCT2_ADDRESS_SCENARIO_TICKS - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_CURRENT_MONTH_YEAR); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_CURRENT_MONTH_YEAR); // Read map elements memset((void*)RCT2_ADDRESS_MAP_ELEMENTS, 0, MAX_MAP_ELEMENTS * sizeof(rct_map_element)); - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_MAP_ELEMENTS); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_MAP_ELEMENTS); // Read game data, including sprites - sawyercoding_read_chunk(file, (uint8*)0x010E63B8); + sawyercoding_read_chunk(rw, (uint8*)0x010E63B8); if (s6Header->type == S6_TYPE_SCENARIO) { // Read number of guests in park and something else - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_GUESTS_IN_PARK); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_GUESTS_IN_PARK); // Read ? - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_LAST_GUESTS_IN_PARK); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_LAST_GUESTS_IN_PARK); // Read park rating - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_CURRENT_PARK_RATING); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_CURRENT_PARK_RATING); // Read ? - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES); // Read ? - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_CURRENT_EXPENDITURE); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_CURRENT_EXPENDITURE); // Read ? - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_CURRENT_PARK_VALUE); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_CURRENT_PARK_VALUE); // Read more game data, including research items and rides - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_COMPLETED_COMPANY_VALUE); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_COMPLETED_COMPANY_VALUE); } - fclose(file); + SDL_RWclose(rw); if (!load_success){ log_error("failed to load all entries."); set_load_objects_fail_reason(); diff --git a/src/game.c b/src/game.c index 4c50bb68ae..f014533ff2 100644 --- a/src/game.c +++ b/src/game.c @@ -593,32 +593,12 @@ static void load_landscape() * * rct2: 0x00675E1B */ -int game_load_sv6(const char *path) +int game_load_sv6(SDL_RWops* rw) { - FILE *file; int i, j; - log_verbose("loading saved game, %s", path); - - strcpy((char*)0x0141EF68, path); - strcpy((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2, path); - - strcpy(gScenarioSaveName, path_get_filename(path)); - path_remove_extension(gScenarioSaveName); - - file = fopen(path, "rb"); - if (file == NULL) { - log_error("unable to open %s", path); - - RCT2_GLOBAL(RCT2_ADDRESS_ERROR_TYPE, uint8) = 255; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = STR_FILE_CONTAINS_INVALID_DATA; - return 0; - } - - if (!sawyercoding_validate_checksum(file)) { - fclose(file); - - log_error("invalid checksum, %s", path); + if (!sawyercoding_validate_checksum(rw)) { + log_error("invalid checksum"); RCT2_GLOBAL(RCT2_ADDRESS_ERROR_TYPE, uint8) = 255; RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = STR_FILE_CONTAINS_INVALID_DATA; @@ -629,31 +609,29 @@ int game_load_sv6(const char *path) rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; // Read first chunk - sawyercoding_read_chunk(file, (uint8*)s6Header); + sawyercoding_read_chunk(rw, (uint8*)s6Header); if (s6Header->type == S6_TYPE_SAVEDGAME) { // Read packed objects if (s6Header->num_packed_objects > 0) { j = 0; for (i = 0; i < s6Header->num_packed_objects; i++) - j += object_load_packed(file); + j += object_load_packed(rw); if (j > 0) object_list_load(); } } - uint8 load_success = object_read_and_load_entries(file); + uint8 load_success = object_read_and_load_entries(rw); // Read flags (16 bytes) - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_CURRENT_MONTH_YEAR); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_CURRENT_MONTH_YEAR); // Read map elements memset((void*)RCT2_ADDRESS_MAP_ELEMENTS, 0, MAX_MAP_ELEMENTS * sizeof(rct_map_element)); - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_MAP_ELEMENTS); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_MAP_ELEMENTS); // Read game data, including sprites - sawyercoding_read_chunk(file, (uint8*)0x010E63B8); - - fclose(file); + sawyercoding_read_chunk(rw, (uint8*)0x010E63B8); if (!load_success){ set_load_objects_fail_reason(); @@ -683,12 +661,30 @@ int game_load_save(const char *path) { rct_window *mainWindow; - if (!game_load_sv6(path)) { - title_load(); - rct2_endupdate(); + log_verbose("loading saved game, %s", path); + + strcpy((char*)0x0141EF68, path); + strcpy((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2, path); + + strcpy(gScenarioSaveName, path_get_filename(path)); + path_remove_extension(gScenarioSaveName); + + SDL_RWops* rw = platform_sdl_rwfromfile(path, "rb"); + if (rw == NULL) { + log_error("unable to open %s", path); + RCT2_GLOBAL(RCT2_ADDRESS_ERROR_TYPE, uint8) = 255; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = STR_FILE_CONTAINS_INVALID_DATA; return 0; } + if (!game_load_sv6(rw)) { + title_load(); + rct2_endupdate(); + SDL_RWclose(rw); + return 0; + } + SDL_RWclose(rw); + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_PLAYING; viewport_init_all(); game_create_windows(); @@ -803,7 +799,7 @@ static int show_save_game_dialog(char *resultPath) return result; } -char save_game() +int save_game() { window_loadsave_open(LOADSAVETYPE_SAVE | LOADSAVETYPE_GAME, gScenarioSaveName); return 0; @@ -818,13 +814,17 @@ char save_game() // Ensure path has .SV6 extension path_set_extension(path, ".SV6"); - if (scenario_save(path, gConfigGeneral.save_plugin_data ? 1 : 0)) { - game_do_command(0, 1047, 0, -1, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); - gfx_invalidate_screen(); - return 1; - } else { - return 0; + SDL_RWops* rw = platform_sdl_rwfromfile(path, "wb+"); + if (rw != NULL) { + int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 1 : 0); + SDL_RWclose(rw); + if (success) { + game_do_command(0, 1047, 0, -1, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); + gfx_invalidate_screen(); + return 1; + } } + return 0; } void game_autosave() @@ -834,7 +834,14 @@ void game_autosave() platform_get_user_directory(path, "save"); strcat(path, "autosave.sv6"); - scenario_save(path, 0x80000000); + strcpy(gScenarioSaveName, path_get_filename(path)); + path_remove_extension(gScenarioSaveName); + + SDL_RWops* rw = platform_sdl_rwfromfile(path, "wb+"); + if (rw != NULL) { + scenario_save(rw, 0x80000000); + SDL_RWclose(rw); + } } /** diff --git a/src/game.h b/src/game.h index e46e48c8f5..5a2911113b 100644 --- a/src/game.h +++ b/src/game.h @@ -22,6 +22,7 @@ #define _GAME_H_ #include "common.h" +#include "platform/platform.h" enum GAME_COMMAND { GAME_COMMAND_SET_RIDE_APPEARANCE, @@ -107,11 +108,11 @@ void game_increase_game_speed(); void game_reduce_game_speed(); void game_load_or_quit_no_save_prompt(); -int game_load_sv6(const char *path); +int game_load_sv6(SDL_RWops* rw); int game_load_save(const char *path); void game_pause_toggle(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void pause_toggle(); -char save_game(); +int save_game(); void rct2_exit(); void rct2_exit_reason(rct_string_id title, rct_string_id body); void game_autosave(); diff --git a/src/object.c b/src/object.c index 2056562cff..2d44166568 100644 --- a/src/object.c +++ b/src/object.c @@ -55,19 +55,19 @@ int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSi uint8 objectType; rct_object_entry openedEntry; char path[260]; - FILE *file; + SDL_RWops* rw; subsitute_path(path, RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), (char*)installedObject + 16); log_verbose("loading object, %s", path); - file = fopen(path, "rb"); - if (file == NULL) + rw = platform_sdl_rwfromfile(path, "rb"); + if (rw == NULL) return 0; - fread(&openedEntry, sizeof(rct_object_entry), 1, file); + SDL_RWread(rw, &openedEntry, sizeof(rct_object_entry), 1); if (!object_entry_compare(&openedEntry, entry)) { - fclose(file); + SDL_RWclose(rw); return 0; } @@ -82,14 +82,14 @@ int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSi if (*chunkSize == 0xFFFFFFFF) { chunk = rct2_malloc(0x600000); - *chunkSize = sawyercoding_read_chunk(file, chunk); + *chunkSize = sawyercoding_read_chunk(rw, chunk); chunk = rct2_realloc(chunk, *chunkSize); } else { chunk = rct2_malloc(*chunkSize); - *chunkSize = sawyercoding_read_chunk(file, chunk); + *chunkSize = sawyercoding_read_chunk(rw, chunk); } - fclose(file); + SDL_RWclose(rw); @@ -177,7 +177,7 @@ int object_load(int groupIndex, rct_object_entry *entry, int* chunkSize) * ebx : file * ebp : entry */ -int write_object_file(FILE *file, rct_object_entry* entry){ +int write_object_file(SDL_RWops *rw, rct_object_entry* entry){ uint8 entryGroupIndex = 0, type = 0; uint8* chunk = 0; @@ -201,7 +201,7 @@ int write_object_file(FILE *file, rct_object_entry* entry){ chunkHeader.length = installed_entry->chunk_size; size_dst += sawyercoding_write_chunk_buffer(dst_buffer + sizeof(rct_object_entry), chunk, chunkHeader); - fwrite(dst_buffer, 1, size_dst, file); + SDL_RWwrite(rw, dst_buffer, 1, size_dst); free(dst_buffer); return 1; @@ -211,16 +211,16 @@ int write_object_file(FILE *file, rct_object_entry* entry){ * * rct2: 0x006AA2B7 */ -int object_load_packed(FILE *file) +int object_load_packed(SDL_RWops* rw) { object_unload_all(); rct_object_entry entry; - fread(&entry, 16, 1, file); + SDL_RWread(rw, &entry, 16, 1); uint8* chunk = rct2_malloc(0x600000); - uint32 chunkSize = sawyercoding_read_chunk(file, chunk); + uint32 chunkSize = sawyercoding_read_chunk(rw, chunk); chunk = rct2_realloc(chunk, chunkSize); if (chunk == NULL){ @@ -315,11 +315,11 @@ int object_load_packed(FILE *file) } // Actually write the object to the file - FILE* obj_file = fopen(path, "wb"); - if (obj_file){ - uint8 result = write_object_file(obj_file, &entry); + SDL_RWops* rw_out = platform_sdl_rwfromfile(path, "wb"); + if (rw_out != NULL){ + uint8 result = write_object_file(rw_out, &entry); - fclose(obj_file); + SDL_RWclose(rw_out); object_unload_all(); return result; @@ -1514,9 +1514,9 @@ int object_get_scenario_text(rct_object_entry *entry) subsitute_path(path, RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), objectPath); rct_object_entry openedEntry; - FILE *file = fopen(path, "rb"); - if (file != NULL) { - fread(&openedEntry, sizeof(rct_object_entry), 1, file); + SDL_RWops* rw = platform_sdl_rwfromfile(path, "rb"); + if (rw != NULL) { + SDL_RWread(rw, &openedEntry, sizeof(rct_object_entry), 1); if (object_entry_compare(&openedEntry, entry)) { // Skip over the object entry @@ -1530,14 +1530,14 @@ int object_get_scenario_text(rct_object_entry *entry) char *chunk; if (chunkSize == 0xFFFFFFFF) { chunk = malloc(0x600000); - chunkSize = sawyercoding_read_chunk(file, chunk); + chunkSize = sawyercoding_read_chunk(rw, chunk); chunk = realloc(chunk, chunkSize); } else { chunk = malloc(chunkSize); - sawyercoding_read_chunk(file, chunk); + sawyercoding_read_chunk(rw, chunk); } - fclose(file); + SDL_RWclose(rw); // Calculate and check checksum if (object_calculate_checksum(&openedEntry, chunk, chunkSize) != openedEntry.checksum) { @@ -1578,7 +1578,7 @@ int object_get_scenario_text(rct_object_entry *entry) return 1; } log_error("Opened object didn't match."); - fclose(file); + SDL_RWclose(rw); return 0; } log_error("File failed to open."); diff --git a/src/object.h b/src/object.h index 7d80e1841a..0294c98865 100644 --- a/src/object.h +++ b/src/object.h @@ -22,6 +22,7 @@ #define _OBJECT_H_ #include "common.h" +#include "platform/platform.h" // First 0xF of rct_object_entry->flags typedef enum{ @@ -94,8 +95,8 @@ extern rct_object_entry_group object_entry_groups[]; int object_load_entry(const char *path, rct_object_entry *outEntry); void object_list_load(); void set_load_objects_fail_reason(); -int object_read_and_load_entries(FILE *file); -int object_load_packed(FILE *file); +int object_read_and_load_entries(SDL_RWops* rw); +int object_load_packed(SDL_RWops* rw); void object_unload_all(); int check_object_entry(rct_object_entry *entry); @@ -109,7 +110,7 @@ int object_entry_compare(const rct_object_entry *a, const rct_object_entry *b); int object_calculate_checksum(const rct_object_entry *entry, const char *data, int dataLength); int object_paint(int type, int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); rct_object_entry *object_get_next(rct_object_entry *entry); -int write_object_file(FILE *file, rct_object_entry* entry); +int write_object_file(SDL_RWops* rw, rct_object_entry* entry); void reset_loaded_objects(); int find_object_in_entry_group(rct_object_entry* entry, uint8* entry_type, uint8* entry_index); void object_create_identifier_name(uint8* string_buffer, rct_object_entry* object); diff --git a/src/object_list.c b/src/object_list.c index de0ac3f4c7..8283f74139 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -518,7 +518,7 @@ void set_load_objects_fail_reason(){ * * rct2: 0x006AA0C6 */ -int object_read_and_load_entries(FILE *file) +int object_read_and_load_entries(SDL_RWops* rw) { object_unload_all(); @@ -529,7 +529,7 @@ int object_read_and_load_entries(FILE *file) // Read all the object entries entries = malloc(OBJECT_ENTRY_COUNT * sizeof(rct_object_entry)); - sawyercoding_read_chunk(file, (uint8*)entries); + sawyercoding_read_chunk(rw, (uint8*)entries); uint8 load_fail = 0; // Load each object diff --git a/src/platform/platform.h b/src/platform/platform.h index 3a6c7c6ba9..b7f5e0feb7 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -82,6 +82,7 @@ void platform_process_messages(); int platform_scancode_to_rct_keycode(int sdl_key); void platform_start_text_input(char* buffer, int max_length); void platform_stop_text_input(); +SDL_RWops* platform_sdl_rwfromfile(const char* filename, const char* mode); // Platform specific definitions char platform_get_path_separator(); diff --git a/src/platform/shared.c b/src/platform/shared.c index 8531d0a897..d0e33ae639 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -28,6 +28,7 @@ #include "../interface/keyboard_shortcut.h" #include "../interface/window.h" #include "../input.h" +#include "../localisation/localisation.h" #include "../openrct2.h" #include "platform.h" @@ -605,6 +606,13 @@ void platform_stop_text_input() gTextInput = NULL; } +SDL_RWops* platform_sdl_rwfromfile(const char* filename, const char* mode) +{ + utf8 utf8filename[512]; + win1252_to_utf8(utf8filename, filename, sizeof(utf8filename)); + return SDL_RWFromFile(utf8filename, mode); +} + static void platform_unload_cursors() { for (int i = 0; i < CURSOR_COUNT; i++) diff --git a/src/scenario.c b/src/scenario.c index e15ed1911b..49f1fe1275 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -58,18 +58,18 @@ static void scenario_objective_check(); */ int scenario_load_basic(const char *path, rct_s6_header *header, rct_s6_info *info) { - FILE *file; + SDL_RWops* rw; log_verbose("loading scenario details, %s", path); - file = fopen(path, "rb"); - if (file != NULL) { + rw = platform_sdl_rwfromfile(path, "rb"); + if (rw != NULL) { // Read first chunk - sawyercoding_read_chunk(file, (uint8*)header); + sawyercoding_read_chunk(rw, (uint8*)header); if (header->type == S6_TYPE_SCENARIO) { // Read second chunk - sawyercoding_read_chunk(file, (uint8*)info); - fclose(file); + sawyercoding_read_chunk(rw, (uint8*)info); + SDL_RWclose(rw); RCT2_GLOBAL(0x009AA00C, uint8) = 0; // Checks for a scenario string object (possibly for localisation) @@ -84,7 +84,7 @@ int scenario_load_basic(const char *path, rct_s6_header *header, rct_s6_info *in } return 1; } - fclose(file); + SDL_RWclose(rw); } log_error("invalid scenario, %s", path); @@ -102,15 +102,15 @@ int scenario_load(const char *path) { log_verbose("loading scenario, %s", path); - FILE *file; + SDL_RWops* rw; int i, j; rct_s6_header *s6Header = (rct_s6_header*)0x009E34E4; rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; - file = fopen(path, "rb"); - if (file != NULL) { - if (!sawyercoding_validate_checksum(file)) { - fclose(file); + rw = platform_sdl_rwfromfile(path, "rb"); + if (rw != NULL) { + if (!sawyercoding_validate_checksum(rw)) { + SDL_RWclose(rw); RCT2_GLOBAL(RCT2_ADDRESS_ERROR_TYPE, uint8) = 255; RCT2_GLOBAL(RCT2_ADDRESS_ERROR_STRING_ID, uint16) = STR_FILE_CONTAINS_INVALID_DATA; @@ -119,57 +119,57 @@ int scenario_load(const char *path) } // Read first chunk - sawyercoding_read_chunk(file, (uint8*)s6Header); + sawyercoding_read_chunk(rw, (uint8*)s6Header); if (s6Header->type == S6_TYPE_SCENARIO) { // Read second chunk - sawyercoding_read_chunk(file, (uint8*)s6Info); + sawyercoding_read_chunk(rw, (uint8*)s6Info); // Read packed objects if (s6Header->num_packed_objects > 0) { j = 0; for (i = 0; i < s6Header->num_packed_objects; i++) - j += object_load_packed(file); + j += object_load_packed(rw); if (j > 0) object_list_load(); } - uint8 load_success = object_read_and_load_entries(file); + uint8 load_success = object_read_and_load_entries(rw); // Read flags (16 bytes). Loads: // RCT2_ADDRESS_CURRENT_MONTH_YEAR // RCT2_ADDRESS_CURRENT_MONTH_TICKS // RCT2_ADDRESS_SCENARIO_TICKS - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_CURRENT_MONTH_YEAR); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_CURRENT_MONTH_YEAR); // Read map elements memset((void*)RCT2_ADDRESS_MAP_ELEMENTS, 0, MAX_MAP_ELEMENTS * sizeof(rct_map_element)); - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_MAP_ELEMENTS); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_MAP_ELEMENTS); // Read game data, including sprites - sawyercoding_read_chunk(file, (uint8*)0x010E63B8); + sawyercoding_read_chunk(rw, (uint8*)0x010E63B8); // Read number of guests in park and something else - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_GUESTS_IN_PARK); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_GUESTS_IN_PARK); // Read ? - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_LAST_GUESTS_IN_PARK); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_LAST_GUESTS_IN_PARK); // Read park rating - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_CURRENT_PARK_RATING); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_CURRENT_PARK_RATING); // Read ? - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES); // Read ? - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_CURRENT_EXPENDITURE); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_CURRENT_EXPENDITURE); // Read ? - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_CURRENT_PARK_VALUE); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_CURRENT_PARK_VALUE); // Read more game data, including research items and rides - sawyercoding_read_chunk(file, (uint8*)RCT2_ADDRESS_COMPLETED_COMPANY_VALUE); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_COMPLETED_COMPANY_VALUE); - fclose(file); + SDL_RWclose(rw); if (!load_success){ log_error("failed to load all entries."); set_load_objects_fail_reason(); @@ -183,7 +183,7 @@ int scenario_load(const char *path) return 1; } - fclose(file); + SDL_RWclose(rw); } log_error("failed to find scenario file."); @@ -745,7 +745,7 @@ int scenario_get_num_packed_objects_to_write() * * rct2: 0x006AA26E */ -int scenario_write_packed_objects(FILE *file) +int scenario_write_packed_objects(SDL_RWops* rw) { int i; rct_object_entry_extended *entry = (rct_object_entry_extended*)0x00F3F03C; @@ -753,7 +753,7 @@ int scenario_write_packed_objects(FILE *file) if (RCT2_ADDRESS(0x009ACFA4, uint32)[i] == 0xFFFFFFFF || (entry->flags & 0xF0)) continue; - if (!write_object_file(file, (rct_object_entry*)entry)) + if (!write_object_file(rw, (rct_object_entry*)entry)) return 0; } @@ -878,21 +878,16 @@ static scenario_fix_ghosts(rct_s6_data *s6) * rct2: 0x006754F5 * @param flags bit 0: pack objects, 1: save as scenario */ -int scenario_save(char *path, int flags) +int scenario_save(SDL_RWops* rw, int flags) { rct_window *w; rct_viewport *viewport; int viewX, viewY, viewZoom, viewRotation; - if (strcmp(path_get_filename(path), "autosave.sv6")) { - strcpy(gScenarioSaveName, path_get_filename(path)); - path_remove_extension(gScenarioSaveName); - } - if (flags & 2) - log_verbose("saving scenario, %s", path); + log_verbose("saving scenario"); else - log_verbose("saving game, %s", path); + log_verbose("saving game"); if (!(flags & 0x80000000)) @@ -949,7 +944,7 @@ int scenario_save(char *path, int flags) memcpy(&s6->dword_010E63B8, (void*)0x010E63B8, 0x2E8570); scenario_fix_ghosts(s6); - scenario_save_s6(path, s6); + scenario_save_s6(rw, s6); free(s6); @@ -961,25 +956,17 @@ int scenario_save(char *path, int flags) return 1; } -bool scenario_save_s6(char *path, rct_s6_data *s6) +bool scenario_save_s6(SDL_RWops* rw, rct_s6_data *s6) { - FILE *file; char *buffer; sawyercoding_chunk_header chunkHeader; int encodedLength; long fileSize; uint32 checksum; - file = fopen(path, "wb+"); - if (file == NULL) { - log_error("Unable to write to %s", path); - return false; - } - buffer = malloc(0x600000); if (buffer == NULL) { log_error("Unable to allocate enough space for a write buffer."); - fclose(file); return false; } @@ -987,21 +974,20 @@ bool scenario_save_s6(char *path, rct_s6_data *s6) chunkHeader.encoding = CHUNK_ENCODING_ROTATE; chunkHeader.length = sizeof(rct_s6_header); encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)&s6->header, chunkHeader); - fwrite(buffer, encodedLength, 1, file); + SDL_RWwrite(rw, buffer, encodedLength, 1); // 1: Write scenario info chunk if (s6->header.type == S6_TYPE_SCENARIO) { chunkHeader.encoding = CHUNK_ENCODING_ROTATE; chunkHeader.length = sizeof(rct_s6_info); encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)&s6->info, chunkHeader); - fwrite(buffer, encodedLength, 1, file); + SDL_RWwrite(rw, buffer, encodedLength, 1); } // 2: Write packed objects if (s6->header.num_packed_objects > 0) { - if (!scenario_write_packed_objects(file)) { + if (!scenario_write_packed_objects(rw)) { free(buffer); - fclose(file); return false; } } @@ -1010,92 +996,91 @@ bool scenario_save_s6(char *path, rct_s6_data *s6) chunkHeader.encoding = CHUNK_ENCODING_ROTATE; chunkHeader.length = 721 * sizeof(rct_object_entry); encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)s6->objects, chunkHeader); - fwrite(buffer, encodedLength, 1, file); + SDL_RWwrite(rw, buffer, encodedLength, 1); // 4: Misc fields (data, rand...) chunk chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED; chunkHeader.length = 16; encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)&s6->elapsed_months, chunkHeader); - fwrite(buffer, encodedLength, 1, file); + SDL_RWwrite(rw, buffer, encodedLength, 1); // 5: Map elements + sprites and other fields chunk chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED; chunkHeader.length = 0x180000; encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)s6->map_elements, chunkHeader); - fwrite(buffer, encodedLength, 1, file); + SDL_RWwrite(rw, buffer, encodedLength, 1); if (s6->header.type == S6_TYPE_SCENARIO) { // 6: chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED; chunkHeader.length = 0x27104C; encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)&s6->dword_010E63B8, chunkHeader); - fwrite(buffer, encodedLength, 1, file); + SDL_RWwrite(rw, buffer, encodedLength, 1); // 7: chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED; chunkHeader.length = 4; encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)&s6->guests_in_park, chunkHeader); - fwrite(buffer, encodedLength, 1, file); + SDL_RWwrite(rw, buffer, encodedLength, 1); // 8: chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED; chunkHeader.length = 8; encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)&s6->last_guests_in_park, chunkHeader); - fwrite(buffer, encodedLength, 1, file); + SDL_RWwrite(rw, buffer, encodedLength, 1); // 9: chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED; chunkHeader.length = 2; encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)&s6->park_rating, chunkHeader); - fwrite(buffer, encodedLength, 1, file); + SDL_RWwrite(rw, buffer, encodedLength, 1); // 10: chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED; chunkHeader.length = 1082; encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)&s6->active_research_types, chunkHeader); - fwrite(buffer, encodedLength, 1, file); + SDL_RWwrite(rw, buffer, encodedLength, 1); // 11: chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED; chunkHeader.length = 16; encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)&s6->current_expenditure, chunkHeader); - fwrite(buffer, encodedLength, 1, file); + SDL_RWwrite(rw, buffer, encodedLength, 1); // 12: chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED; chunkHeader.length = 4; encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)&s6->park_value, chunkHeader); - fwrite(buffer, encodedLength, 1, file); + SDL_RWwrite(rw, buffer, encodedLength, 1); // 13: chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED; chunkHeader.length = 0x761E8; encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)&s6->completed_company_value, chunkHeader); - fwrite(buffer, encodedLength, 1, file); + SDL_RWwrite(rw, buffer, encodedLength, 1); } else { // 6: Everything else... chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED; chunkHeader.length = 0x2E8570; encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)&s6->dword_010E63B8, chunkHeader); - fwrite(buffer, encodedLength, 1, file); + SDL_RWwrite(rw, buffer, encodedLength, 1); } free(buffer); // Determine number of bytes written - fileSize = ftell(file); - fseek(file, 0, SEEK_SET); + fileSize = (long)SDL_RWtell(rw); + SDL_RWseek(rw, 0, RW_SEEK_SET); // Read all written bytes back into a single buffer buffer = malloc(fileSize); - fread(buffer, fileSize, 1, file); + SDL_RWread(rw, buffer, fileSize, 1); checksum = sawyercoding_calculate_checksum(buffer, fileSize); free(buffer); // Append the checksum - fseek(file, fileSize, SEEK_SET); - fwrite(&checksum, sizeof(uint32), 1, file); - fclose(file); + SDL_RWseek(rw, fileSize, RW_SEEK_SET); + SDL_RWwrite(rw, &checksum, sizeof(uint32), 1); return true; } diff --git a/src/scenario.h b/src/scenario.h index 7fc1878d1a..5f4f842221 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -425,8 +425,8 @@ void scenario_update(); unsigned int scenario_rand(); unsigned int scenario_rand_max(unsigned int max); int scenario_prepare_for_save(); -int scenario_save(char *path, int flags); -bool scenario_save_s6(char *path, rct_s6_data *s6); +int scenario_save(SDL_RWops* rw, int flags); +bool scenario_save_s6(SDL_RWops* rw, rct_s6_data *s6); void scenario_set_filename(const char *value); void scenario_failure(); void scenario_success(); diff --git a/src/title.c b/src/title.c index 6fe269bd0b..79148ac83c 100644 --- a/src/title.c +++ b/src/title.c @@ -168,9 +168,15 @@ static int title_load_park(const char *path) rct_window* w; int successfulLoad; - successfulLoad = _strcmpi(path_get_extension(path), ".sv6") == 0 ? - game_load_sv6(path) : - scenario_load(path); + if (_strcmpi(path_get_extension(path), ".sv6") == 0) { + SDL_RWops* rw = platform_sdl_rwfromfile(path, "rb"); + if (rw != NULL) { + successfulLoad = game_load_sv6(rw); + SDL_RWclose(rw); + } + } else { + successfulLoad = scenario_load(path); + } if (!successfulLoad) return 0; diff --git a/src/util/sawyercoding.c b/src/util/sawyercoding.c index f11ddeb7cb..5f75cc2480 100644 --- a/src/util/sawyercoding.c +++ b/src/util/sawyercoding.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "../addresses.h" +#include "../platform/platform.h" #include "sawyercoding.h" static int decode_chunk_rle(uint8* src_buffer, uint8* dst_buffer, int length); @@ -42,24 +43,24 @@ uint32 sawyercoding_calculate_checksum(uint8* buffer, uint32 length) * * rct2: 0x00676FD2 */ -int sawyercoding_validate_checksum(FILE *file) +int sawyercoding_validate_checksum(SDL_RWops* rw) { uint32 i, checksum, fileChecksum, dataSize, bufferSize; uint8 buffer[1024]; // Get data size - fseek(file, 0, SEEK_END); - dataSize = ftell(file); + SDL_RWseek(rw, 0, RW_SEEK_END); + dataSize = (uint32)SDL_RWtell(rw); if (dataSize < 8) return 0; dataSize -= 4; // Calculate checksum - fseek(file, 0, SEEK_SET); + SDL_RWseek(rw, 0, RW_SEEK_SET); checksum = 0; do { bufferSize = min(dataSize, 1024); - if (fread(buffer, bufferSize, 1, file) != 1) + if (SDL_RWread(rw, buffer, bufferSize, 1) != 1) return 0; for (i = 0; i < bufferSize; i++) @@ -68,11 +69,11 @@ int sawyercoding_validate_checksum(FILE *file) } while (dataSize != 0); // Read file checksum - if (fread(&fileChecksum, sizeof(fileChecksum), 1, file) != 1) + if (SDL_RWread(rw, &fileChecksum, sizeof(fileChecksum), 1) != 1) return 0; // Reset file position - fseek(file, 0, SEEK_SET); + SDL_RWseek(rw, 0, RW_SEEK_SET); // Validate return checksum == fileChecksum; @@ -83,12 +84,12 @@ int sawyercoding_validate_checksum(FILE *file) * rct2: 0x0067685F * buffer (esi) */ -int sawyercoding_read_chunk(FILE *file, uint8 *buffer) +int sawyercoding_read_chunk(SDL_RWops* rw, uint8 *buffer) { sawyercoding_chunk_header chunkHeader; // Read chunk header - if (fread(&chunkHeader, sizeof(sawyercoding_chunk_header), 1, file) != 1) { + if (SDL_RWread(rw, &chunkHeader, sizeof(sawyercoding_chunk_header), 1) != 1) { log_error("Unable to read chunk header!"); return -1; } @@ -96,7 +97,7 @@ int sawyercoding_read_chunk(FILE *file, uint8 *buffer) uint8* src_buffer = malloc(chunkHeader.length); // Read chunk data - if (fread(src_buffer, chunkHeader.length, 1, file) != 1) { + if (SDL_RWread(rw, src_buffer, chunkHeader.length, 1) != 1) { free(src_buffer); log_error("Unable to read chunk data!"); return -1; diff --git a/src/util/sawyercoding.h b/src/util/sawyercoding.h index a1c702b334..f12e589ec6 100644 --- a/src/util/sawyercoding.h +++ b/src/util/sawyercoding.h @@ -47,9 +47,9 @@ enum { FILE_TYPE_SC4 = (2 << 2) }; -int sawyercoding_validate_checksum(FILE *file); +int sawyercoding_validate_checksum(SDL_RWops* rw); uint32 sawyercoding_calculate_checksum(uint8* buffer, uint32 length); -int sawyercoding_read_chunk(FILE *file, uint8 *buffer); +int sawyercoding_read_chunk(SDL_RWops* rw, uint8 *buffer); int sawyercoding_write_chunk_buffer(uint8 *dst_file, uint8* buffer, sawyercoding_chunk_header chunkHeader); int sawyercoding_decode_sv4(char *src, char *dst, int length); int sawyercoding_decode_sc4(char *src, char *dst, int length); diff --git a/src/windows/editor_bottom_toolbar.c b/src/windows/editor_bottom_toolbar.c index 5a3a4dbe38..e6d7614c7e 100644 --- a/src/windows/editor_bottom_toolbar.c +++ b/src/windows/editor_bottom_toolbar.c @@ -377,7 +377,11 @@ void window_editor_bottom_toolbar_jump_forward_to_save_scenario() // Save the scenario parkFlagsBackup = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32); RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_18; - success = scenario_save(path, gConfigGeneral.save_plugin_data ? 3 : 2); + SDL_RWops* rw = platform_sdl_rwfromfile(path, "wb+"); + if (rw != NULL) { + success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); + SDL_RWclose(rw); + } RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) = parkFlagsBackup; if (success) { diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 55da869e33..baa9ae3273 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -724,6 +724,7 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co static void window_loadsave_select(rct_window *w, const char *path) { + SDL_RWops* rw; switch (_loadsaveType) { case (LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME) : if (gLoadSaveTitleSequenceSave) { @@ -752,13 +753,19 @@ static void window_loadsave_select(rct_window *w, const char *path) } break; case (LOADSAVETYPE_SAVE | LOADSAVETYPE_GAME) : - if (scenario_save((char*)path, gConfigGeneral.save_plugin_data ? 1 : 0)) { - window_close(w); + rw = platform_sdl_rwfromfile(path, "wb+"); + if (rw != NULL) { + int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 1 : 0); + SDL_RWclose(rw); + if (success) { + window_close(w); - game_do_command(0, 1047, 0, -1, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); - gfx_invalidate_screen(); - } - else { + game_do_command(0, 1047, 0, -1, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); + gfx_invalidate_screen(); + } else { + window_error_open(STR_SAVE_GAME, 1047); + } + } else { window_error_open(STR_SAVE_GAME, 1047); } break; @@ -774,11 +781,17 @@ static void window_loadsave_select(rct_window *w, const char *path) } break; case (LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE) : - if (scenario_save((char*)path, gConfigGeneral.save_plugin_data ? 3 : 2)) { - window_close(w); - gfx_invalidate_screen(); - } - else { + rw = platform_sdl_rwfromfile(path, "wb+"); + if (rw != NULL) { + int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); + SDL_RWclose(rw); + if (success) { + window_close(w); + gfx_invalidate_screen(); + } else { + window_error_open(STR_SAVE_LANDSCAPE, 1049); + } + } else { window_error_open(STR_SAVE_LANDSCAPE, 1049); } break; @@ -788,14 +801,18 @@ static void window_loadsave_select(rct_window *w, const char *path) int parkFlagsBackup = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32); RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_18; s6Info->var_000 = 255; - int success = scenario_save((char*)path, gConfigGeneral.save_plugin_data ? 3 : 2); + rw = platform_sdl_rwfromfile(path, "wb+"); + int success = 0; + if (rw != NULL) { + success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); + SDL_RWclose(rw); + } RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) = parkFlagsBackup; if (success) { window_close(w); title_load(); - } - else { + } else { window_error_open(STR_SAVE_SCENARIO, STR_SCENARIO_SAVE_FAILED); s6Info->var_000 = 4; } From 6e3ff0e1df6b81a5f9a54c85d9fece0ea20f97d1 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Mon, 6 Jul 2015 15:21:25 -0600 Subject: [PATCH 0250/1173] refactor tween reset Conflicts: src/game.c --- src/game.c | 2 +- src/openrct2.c | 57 ++++++++++++++++++++++--------------------------- src/openrct2.h | 2 +- src/peep/peep.c | 2 +- src/scenario.c | 2 +- 5 files changed, 30 insertions(+), 35 deletions(-) diff --git a/src/game.c b/src/game.c index f014533ff2..e26db4bedd 100644 --- a/src/game.c +++ b/src/game.c @@ -649,7 +649,7 @@ int game_load_sv6(SDL_RWops* rw) reset_loaded_objects(); map_update_tile_pointers(); reset_0x69EBE4(); - gOpenRCT2ResetFrameSmoothing = true; + openrct2_reset_object_tween_locations(); return 1; } diff --git a/src/openrct2.c b/src/openrct2.c index b6a5dcb8fe..2aadec9c2b 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -46,13 +46,12 @@ bool gOpenRCT2Headless = false; bool gOpenRCT2ShowChangelog; -// This needs to be set when a park is loaded. It could also be used to reset other important states, it should then be renamed -// to something more general. -bool gOpenRCT2ResetFrameSmoothing = false; - /** If set, will end the OpenRCT2 game loop. Intentially private to this module so that the flag can not be set back to 0. */ int _finished; +// Used for object movement tweening +static struct { sint16 x, y, z; } _spritelocations1[MAX_SPRITES], _spritelocations2[MAX_SPRITES]; + static void openrct2_loop(); static void openrct2_copy_files_over(const char *originalDirectory, const char *newDirectory, const char *extension) @@ -265,11 +264,9 @@ static bool sprite_should_tween(rct_sprite *sprite) static void openrct2_loop() { uint32 currentTick, ticksElapsed, lastTick = 0; - static uint32 uncapTick; + static uint32 uncapTick = 0; static int fps = 0; static uint32 secondTick = 0; - static bool uncappedinitialized = false; - static struct { sint16 x, y, z; } spritelocations1[MAX_SPRITES], spritelocations2[MAX_SPRITES]; log_verbose("begin openrct2 loop"); @@ -277,38 +274,28 @@ static void openrct2_loop() do { if (gConfigGeneral.uncap_fps && gGameSpeed <= 4) { currentTick = SDL_GetTicks(); - if (!uncappedinitialized) { + if (uncapTick == 0) { // Reset sprite locations uncapTick = SDL_GetTicks(); - for (uint16 i = 0; i < MAX_SPRITES; i++) { - spritelocations1[i].x = spritelocations2[i].x = g_sprite_list[i].unknown.x; - spritelocations1[i].y = spritelocations2[i].y = g_sprite_list[i].unknown.y; - spritelocations1[i].z = spritelocations2[i].z = g_sprite_list[i].unknown.z; - } - uncappedinitialized = true; + openrct2_reset_object_tween_locations(); } while (uncapTick <= currentTick && currentTick - uncapTick > 25) { // Get the original position of each sprite for (uint16 i = 0; i < MAX_SPRITES; i++) { - spritelocations1[i].x = g_sprite_list[i].unknown.x; - spritelocations1[i].y = g_sprite_list[i].unknown.y; - spritelocations1[i].z = g_sprite_list[i].unknown.z; + _spritelocations1[i].x = g_sprite_list[i].unknown.x; + _spritelocations1[i].y = g_sprite_list[i].unknown.y; + _spritelocations1[i].z = g_sprite_list[i].unknown.z; } // Update the game so the sprite positions update rct2_update(); - if (gOpenRCT2ResetFrameSmoothing) { - gOpenRCT2ResetFrameSmoothing = false; - uncappedinitialized = false; - continue; - } // Get the next position of each sprite for (uint16 i = 0; i < MAX_SPRITES; i++) { - spritelocations2[i].x = g_sprite_list[i].unknown.x; - spritelocations2[i].y = g_sprite_list[i].unknown.y; - spritelocations2[i].z = g_sprite_list[i].unknown.z; + _spritelocations2[i].x = g_sprite_list[i].unknown.x; + _spritelocations2[i].y = g_sprite_list[i].unknown.y; + _spritelocations2[i].z = g_sprite_list[i].unknown.z; } uncapTick += 25; @@ -322,9 +309,9 @@ static void openrct2_loop() continue; sprite_move( - spritelocations2[i].x + (sint16)((spritelocations1[i].x - spritelocations2[i].x) * nudge), - spritelocations2[i].y + (sint16)((spritelocations1[i].y - spritelocations2[i].y) * nudge), - spritelocations2[i].z + (sint16)((spritelocations1[i].z - spritelocations2[i].z) * nudge), + _spritelocations2[i].x + (sint16)((_spritelocations1[i].x - _spritelocations2[i].x) * nudge), + _spritelocations2[i].y + (sint16)((_spritelocations1[i].y - _spritelocations2[i].y) * nudge), + _spritelocations2[i].z + (sint16)((_spritelocations1[i].z - _spritelocations2[i].z) * nudge), &g_sprite_list[i] ); invalidate_sprite(&g_sprite_list[i]); @@ -345,10 +332,10 @@ static void openrct2_loop() continue; invalidate_sprite(&g_sprite_list[i]); - sprite_move(spritelocations2[i].x, spritelocations2[i].y, spritelocations2[i].z, &g_sprite_list[i]); + sprite_move(_spritelocations2[i].x, _spritelocations2[i].y, _spritelocations2[i].z, &g_sprite_list[i]); } } else { - uncappedinitialized = false; + uncapTick = 0; currentTick = SDL_GetTicks(); ticksElapsed = currentTick - lastTick; if (ticksElapsed < 25) { @@ -362,7 +349,6 @@ static void openrct2_loop() platform_process_messages(); rct2_update(); - gOpenRCT2ResetFrameSmoothing = false; rct2_draw(); platform_draw(); @@ -376,4 +362,13 @@ static void openrct2_loop() void openrct2_finish() { _finished = 1; +} + +void openrct2_reset_object_tween_locations() +{ + for (uint16 i = 0; i < MAX_SPRITES; i++) { + _spritelocations1[i].x = _spritelocations2[i].x = g_sprite_list[i].unknown.x; + _spritelocations1[i].y = _spritelocations2[i].y = g_sprite_list[i].unknown.y; + _spritelocations1[i].z = _spritelocations2[i].z = g_sprite_list[i].unknown.z; + } } \ No newline at end of file diff --git a/src/openrct2.h b/src/openrct2.h index 227ca0cba4..da306caa9c 100644 --- a/src/openrct2.h +++ b/src/openrct2.h @@ -35,11 +35,11 @@ extern char gOpenRCT2StartupActionPath[512]; extern char gExePath[MAX_PATH]; extern bool gOpenRCT2Headless; extern bool gOpenRCT2ShowChangelog; -extern bool gOpenRCT2ResetFrameSmoothing; bool openrct2_initialise(); void openrct2_launch(); void openrct2_dispose(); void openrct2_finish(); +void openrct2_reset_object_tween_locations(); #endif \ No newline at end of file diff --git a/src/peep/peep.c b/src/peep/peep.c index 7b1557767d..6ccebd3711 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -5399,7 +5399,7 @@ void peep_update_name_sort(rct_peep *peep) RCT2_CALLPROC_X(0x00699115, 0, 0, 0, 0, (int)peep, 0, 0); // This is required at the moment because this function reorders peeps in the sprite list - gOpenRCT2ResetFrameSmoothing = true; + openrct2_reset_object_tween_locations(); } /** diff --git a/src/scenario.c b/src/scenario.c index 49f1fe1275..2519c13962 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -179,7 +179,7 @@ int scenario_load(const char *path) reset_loaded_objects(); map_update_tile_pointers(); reset_0x69EBE4(); - gOpenRCT2ResetFrameSmoothing = true; + openrct2_reset_object_tween_locations(); return 1; } From aeeca2454a0fb4410e65d3505c69cfcfbc91f630 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Mon, 6 Jul 2015 19:07:47 -0600 Subject: [PATCH 0251/1173] fixed source of non-deterministicness --- src/peep/peep.c | 2 +- src/world/climate.c | 2 +- src/world/map.c | 15 ++++++--------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 6ccebd3711..0f504260bf 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -4380,7 +4380,7 @@ void peep_problem_warnings_update() uint16 guests_in_park = RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16); int hunger_counter = 0, lost_counter = 0, noexit_counter = 0, thirst_counter = 0, litter_counter = 0, disgust_counter = 0, bathroom_counter = 0 ,vandalism_counter = 0; - static int warning_throttle[7] = { 0, 0, 0, 0, 0, 0, 0 }; + uint8* warning_throttle = RCT2_ADDRESS(0x01358750, uint8); RCT2_GLOBAL(RCT2_ADDRESS_RIDE_COUNT, sint16) = ride_get_count(); // refactor this to somewhere else diff --git a/src/world/climate.c b/src/world/climate.c index 79e231c2da..51ac92409a 100644 --- a/src/world/climate.c +++ b/src/world/climate.c @@ -223,7 +223,7 @@ static void climate_determine_future_weather() rct_weather_transition transition = climate_table[month]; // Generate a random variable with values 0 upto distribution_size-1 and chose weather from the distribution table accordingly - sint8 next_weather = transition.distribution[ ((rand() & 0xFF) * transition.distribution_size) >> 8 ]; + sint8 next_weather = transition.distribution[ ((scenario_rand() & 0xFF) * transition.distribution_size) >> 8 ]; gClimateNextWeather = next_weather; _climateNextTemperature = transition.base_temperature + climate_weather_data[next_weather].temp_delta; diff --git a/src/world/map.c b/src/world/map.c index 845554e4b2..f445517151 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -57,9 +57,6 @@ bool gClearSmallScenery; bool gClearLargeScenery; bool gClearFootpath; -int _sub_6A876D_save_x; -int _sub_6A876D_save_y; - static void tiles_init(); static void sub_6A87BB(int x, int y); static void map_update_grass_length(int x, int y, rct_map_element *mapElement); @@ -296,8 +293,8 @@ void map_init(int size) } RCT2_GLOBAL(RCT2_ADDRESS_GRASS_SCENERY_TILEPOS, sint16) = 0; - _sub_6A876D_save_x = 0; - _sub_6A876D_save_y = 0; + RCT2_GLOBAL(0x013CE774, sint16) = 0; + RCT2_GLOBAL(0x013CE776, sint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16) = size * 32 - 32; RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_MINUS_2, sint16) = size * 32 - 2; RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, sint16) = size; @@ -572,8 +569,8 @@ void sub_6A876D() // Presumebly sub_6A87BB is too computationally expensive to call for every // tile every update, so word_13CE774 and word_13CE776 store the x and y // progress. A maximum of 128 calls is done per update. - x = _sub_6A876D_save_x; - y = _sub_6A876D_save_y; + x = RCT2_GLOBAL(0x013CE774, sint16); + y = RCT2_GLOBAL(0x013CE776, sint16); for (i = 0; i < 128; i++) { sub_6A87BB(x, y); @@ -586,8 +583,8 @@ void sub_6A876D() y = 0; } } - _sub_6A876D_save_x = x; - _sub_6A876D_save_y = y; + RCT2_GLOBAL(0x013CE774, sint16) = x; + RCT2_GLOBAL(0x013CE776, sint16) = y; } /** From fbd402eb672d1eab9bf8fb59574f0f6efe9ad00b Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 11 Jul 2015 18:23:59 +0100 Subject: [PATCH 0252/1173] implement remaining screen_get_map_xy... functions --- src/interface/viewport.c | 154 ++++++++++++++++++++++---------- src/interface/viewport.h | 8 +- src/interface/window.c | 2 +- src/ride/ride.c | 2 +- src/windows/map.c | 2 +- src/windows/park.c | 2 +- src/windows/ride_construction.c | 2 +- src/windows/top_toolbar.c | 58 ++---------- src/world/map.c | 19 ++++ src/world/map.h | 3 + 10 files changed, 151 insertions(+), 101 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index bfd2850113..6bbe12d1f8 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -2075,56 +2075,13 @@ void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, in } } -/** - * - * rct2: 0x00688972 - * In: - * screen_x: eax - * screen_y: ebx - * Out: - * x: ax - * y: bx - * map_element: edx ? - * viewport: edi - */ -void sub_688972(int screenX, int screenY, sint16 *x, sint16 *y, rct_viewport **viewport) { - sint16 my_x, my_y; - int z, interactionType; - rct_viewport *myViewport; - get_map_coordinates_from_pos(screenX, screenY, VIEWPORT_INTERACTION_MASK_TERRAIN, &my_x, &my_y, &interactionType, NULL, &myViewport); - if (interactionType == VIEWPORT_INTERACTION_ITEM_NONE) { - *x = 0x8000; - return; - } - - RCT2_GLOBAL(0x00F1AD34, sint16) = my_x; - RCT2_GLOBAL(0x00F1AD36, sint16) = my_y; - RCT2_GLOBAL(0x00F1AD38, sint16) = my_x + 31; - RCT2_GLOBAL(0x00F1AD3A, sint16) = my_y + 31; - - rct_xy16 start_vp_pos = screen_coord_to_viewport_coord(myViewport, screenX, screenY); - rct_xy16 map_pos = { my_x + 16, my_y + 16 }; - - for (int i = 0; i < 5; i++) { - z = map_element_height(map_pos.x, map_pos.y); - map_pos = viewport_coord_to_map_coord(start_vp_pos.x, start_vp_pos.y, z); - map_pos.x = clamp(RCT2_GLOBAL(0x00F1AD34, sint16), map_pos.x, RCT2_GLOBAL(0x00F1AD38, sint16)); - map_pos.y = clamp(RCT2_GLOBAL(0x00F1AD36, sint16), map_pos.y, RCT2_GLOBAL(0x00F1AD3A, sint16)); - } - - *x = map_pos.x; - *y = map_pos.y; - - if (viewport != NULL) *viewport = myViewport; -} - /** * * rct2: 0x0068958D */ void screen_pos_to_map_pos(sint16 *x, sint16 *y, int *direction) { - sub_688972(*x, *y, x, y, NULL); + screen_get_map_xy(*x, *y, x, y, NULL); if (*x == (sint16)0x8000) return; @@ -2532,11 +2489,54 @@ rct_viewport *viewport_find_from_point(int screenX, int screenY) return viewport; } +/** + * + * rct2: 0x00688972 + * In: + * screen_x: eax + * screen_y: ebx + * Out: + * x: ax + * y: bx + * map_element: edx ? + * viewport: edi + */ +void screen_get_map_xy(int screenX, int screenY, sint16 *x, sint16 *y, rct_viewport **viewport) { + sint16 my_x, my_y; + int z, interactionType; + rct_viewport *myViewport; + get_map_coordinates_from_pos(screenX, screenY, VIEWPORT_INTERACTION_MASK_TERRAIN, &my_x, &my_y, &interactionType, NULL, &myViewport); + if (interactionType == VIEWPORT_INTERACTION_ITEM_NONE) { + *x = 0x8000; + return; + } + + RCT2_GLOBAL(0x00F1AD34, sint16) = my_x; + RCT2_GLOBAL(0x00F1AD36, sint16) = my_y; + RCT2_GLOBAL(0x00F1AD38, sint16) = my_x + 31; + RCT2_GLOBAL(0x00F1AD3A, sint16) = my_y + 31; + + rct_xy16 start_vp_pos = screen_coord_to_viewport_coord(myViewport, screenX, screenY); + rct_xy16 map_pos = { my_x + 16, my_y + 16 }; + + for (int i = 0; i < 5; i++) { + z = map_element_height(map_pos.x, map_pos.y); + map_pos = viewport_coord_to_map_coord(start_vp_pos.x, start_vp_pos.y, z); + map_pos.x = clamp(RCT2_GLOBAL(0x00F1AD34, sint16), map_pos.x, RCT2_GLOBAL(0x00F1AD38, sint16)); + map_pos.y = clamp(RCT2_GLOBAL(0x00F1AD36, sint16), map_pos.y, RCT2_GLOBAL(0x00F1AD3A, sint16)); + } + + *x = map_pos.x; + *y = map_pos.y; + + if (viewport != NULL) *viewport = myViewport; +} + /** * * rct2: 0x006894D4 */ -void sub_6894D4(sint16 screenX, sint16 screenY, sint16 z, sint16 *mapX, sint16 *mapY) +void screen_get_map_xy_with_z(sint16 screenX, sint16 screenY, sint16 z, sint16 *mapX, sint16 *mapY) { rct_viewport *viewport = viewport_find_from_point(screenX, screenY); if (viewport == NULL) { @@ -2556,3 +2556,67 @@ void sub_6894D4(sint16 screenX, sint16 screenY, sint16 z, sint16 *mapX, sint16 * *mapX = mapPosition.x; *mapY = mapPosition.y; } + +/** + * + * rct2: 0x00689604 + */ +void screen_get_map_xy_quadrant(sint16 screenX, sint16 screenY, sint16 *mapX, sint16 *mapY, uint8 *quadrant) +{ + rct_viewport *viewport; + + screen_get_map_xy(screenX, screenY, mapX, mapY, &viewport); + if (*mapX == (sint16)0x8000) + return; + + *quadrant = map_get_tile_quadrant(*mapX, *mapY); + *mapX = floor2(*mapX, 32); + *mapY = floor2(*mapY, 32); +} + +/** + * + * rct2: 0x0068964B + */ +void screen_get_map_xy_quadrant_with_z(sint16 screenX, sint16 screenY, sint16 z, sint16 *mapX, sint16 *mapY, uint8 *quadrant) +{ + screen_get_map_xy_with_z(screenX, screenY, z, mapX, mapY); + if (*mapX == (sint16)0x8000) + return; + + *quadrant = map_get_tile_quadrant(*mapX, *mapY); + *mapX = floor2(*mapX, 32); + *mapY = floor2(*mapY, 32); +} + +/** + * + * rct2: 0x00689692 + */ +void screen_get_map_xy_side(sint16 screenX, sint16 screenY, sint16 *mapX, sint16 *mapY, uint8 *side) +{ + rct_viewport *viewport; + + screen_get_map_xy(screenX, screenY, mapX, mapY, &viewport); + if (*mapX == (sint16)0x8000) + return; + + *side = map_get_tile_side(*mapX, *mapY); + *mapX = floor2(*mapX, 32); + *mapY = floor2(*mapY, 32); +} + +/** + * + * rct2: 0x006896DC + */ +void screen_get_map_xy_side_with_z(sint16 screenX, sint16 screenY, sint16 z, sint16 *mapX, sint16 *mapY, uint8 *side) +{ + screen_get_map_xy_with_z(screenX, screenY, z, mapX, mapY); + if (*mapX == (sint16)0x8000) + return; + + *side = map_get_tile_side(*mapX, *mapY); + *mapX = floor2(*mapX, 32); + *mapY = floor2(*mapY, 32); +} diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 529822f742..2d3abbd5a3 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -104,7 +104,6 @@ void sub_689174(sint16* x, sint16* y, sint16 *z); rct_xy16 screen_coord_to_viewport_coord(rct_viewport *viewport, uint16 x, uint16 y); rct_xy16 viewport_coord_to_map_coord(int x, int y, int z); -void sub_688972(int screenX, int screenY, sint16 *x, sint16 *y, rct_viewport **viewport); void screen_pos_to_map_pos(sint16 *x, sint16 *y, int *direction); void show_gridlines(); @@ -133,6 +132,11 @@ void sub_688217(); void viewport_invalidate(rct_viewport *viewport, int left, int top, int right, int bottom); -void sub_6894D4(sint16 screenX, sint16 screenY, sint16 z, sint16 *mapX, sint16 *mapY); +void screen_get_map_xy(int screenX, int screenY, sint16 *x, sint16 *y, rct_viewport **viewport); +void screen_get_map_xy_with_z(sint16 screenX, sint16 screenY, sint16 z, sint16 *mapX, sint16 *mapY); +void screen_get_map_xy_quadrant(sint16 screenX, sint16 screenY, sint16 *mapX, sint16 *mapY, uint8 *quadrant); +void screen_get_map_xy_quadrant_with_z(sint16 screenX, sint16 screenY, sint16 z, sint16 *mapX, sint16 *mapY, uint8 *quadrant); +void screen_get_map_xy_side(sint16 screenX, sint16 screenY, sint16 *mapX, sint16 *mapY, uint8 *side); +void screen_get_map_xy_side_with_z(sint16 screenX, sint16 screenY, sint16 z, sint16 *mapX, sint16 *mapY, uint8 *side); #endif diff --git a/src/interface/window.c b/src/interface/window.c index 6f6221de8f..66b34b756c 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -1374,7 +1374,7 @@ void window_rotate_camera(rct_window *w, int direction) //has something to do with checking if middle of the viewport is obstructed rct_viewport *other; - sub_688972(x, y, &x, &y, &other); + screen_get_map_xy(x, y, &x, &y, &other); // other != viewport probably triggers on viewports in ride or guest window? // x is 0x8000 if middle of viewport is obstructed by another window? diff --git a/src/ride/ride.c b/src/ride/ride.c index 2e83c14e4f..ef1a305386 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5121,7 +5121,7 @@ void ride_get_entrance_or_exit_position_from_screen_position(int screenX, int sc ride = GET_RIDE(RCT2_GLOBAL(0x00F44192, uint8)); stationHeight = ride->station_heights[RCT2_GLOBAL(0x00F44193, uint8)]; - sub_6894D4(screenX, screenY, stationHeight * 8, &mapX, &mapY); + screen_get_map_xy_with_z(screenX, screenY, stationHeight * 8, &mapX, &mapY); if (mapX == (short)0x8000) { *outX = 0x8000; return; diff --git a/src/windows/map.c b/src/windows/map.c index d19a11a47a..d8d39826bd 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -1140,7 +1140,7 @@ static void window_map_set_land_rights_tool_update(int x, int y) map_invalidate_selection_rect(); RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 0); - sub_688972(x, y, &mapX, &mapY, &viewport); + screen_get_map_xy(x, y, &mapX, &mapY, &viewport); if (mapX == (sint16)0x8000) return; diff --git a/src/windows/park.c b/src/windows/park.c index 6eb5fe929e..c078d91c10 100644 --- a/src/windows/park.c +++ b/src/windows/park.c @@ -734,7 +734,7 @@ void window_park_entrance_tool_update_land_rights(sint16 x, sint16 y){ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 0); rct_xy16 mapTile = { 0 }; - sub_688972(x, y, &mapTile.x, &mapTile.y, NULL); + screen_get_map_xy(x, y, &mapTile.x, &mapTile.y, NULL); if (mapTile.x == (sint16)0x8000){ if (RCT2_GLOBAL(0x00F1AD62, money32) != MONEY32_UNDEFINED){ diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index e6bb6e2ad8..80a45d4668 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1956,7 +1956,7 @@ static bool ride_get_place_position_from_screen_position(int screenX, int screen } } else { mapZ = _trackPlaceCtrlZ; - sub_6894D4(screenX, screenY, mapZ, &mapX, &mapY); + screen_get_map_xy_with_z(screenX, screenY, mapZ, &mapX, &mapY); if (_trackPlaceShiftState != 0) { mapZ += _trackPlaceShiftZ; } diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 0f2f0114cc..5694318419 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -894,46 +894,6 @@ static void repaint_scenery_tool_down(sint16 x, sint16 y, sint16 widgetIndex){ } } -void sub_689604(sint16 x, sint16 y, sint16* grid_x, sint16* grid_y, uint8* cl){ - int eax = x, ebx = y, ecx = 0, edx = 0, esi = 0, edi = 0, ebp = 0; - - RCT2_CALLFUNC_X(0x00689604, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - - *grid_x = eax; - *grid_y = ebx; - *cl = ecx; -} - -void sub_68964B(sint16 x, sint16 y, sint16 z, sint16* grid_x, sint16* grid_y, uint8* cl){ - int eax = x, ebx = y, ecx = 0, edx = 0, esi = 0, edi = 0, ebp = z; - - RCT2_CALLFUNC_X(0x0068964B, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - - *grid_x = eax; - *grid_y = ebx; - *cl = ecx; -} - -void sub_689692(sint16 x, sint16 y, sint16* grid_x, sint16* grid_y, uint8* cl){ - int eax = x, ebx = y, ecx = 0, edx = 0, esi = 0, edi = 0, ebp = 0; - - RCT2_CALLFUNC_X(0x00689692, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - - *grid_x = eax; - *grid_y = ebx; - *cl = ecx; -} - -void sub_6896DC(sint16 x, sint16 y, sint16 z, sint16* grid_x, sint16* grid_y, uint8* cl){ - int eax = x, ebx = y, ecx = 0, edx = 0, esi = 0, edi = 0, ebp = z; - - RCT2_CALLFUNC_X(0x006896DC, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - - *grid_x = eax; - *grid_y = ebx; - *cl = ecx; -} - /* rct2: 0x006E1F34 * Outputs * eax : grid_x @@ -1033,7 +993,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin // If CTRL not pressed if (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_CTRL_PRESSED, uint8) == 0){ - sub_689604(x, y, grid_x, grid_y, &cl); + screen_get_map_xy_quadrant(x, y, grid_x, grid_y, &cl); if (*grid_x == (sint16)0x8000) return; @@ -1063,7 +1023,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin else{ sint16 z = RCT2_GLOBAL(RCT2_ADDRESS_CTRL_PRESS_Z_COORDINATE, sint16); - sub_68964B(x, y, z, grid_x, grid_y, &cl); + screen_get_map_xy_quadrant_with_z(x, y, z, grid_x, grid_y, &cl); // If SHIFT pressed if (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_SHIFT_PRESSED, uint8) != 0){ @@ -1139,7 +1099,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin } else{ sint16 z = RCT2_GLOBAL(RCT2_ADDRESS_CTRL_PRESS_Z_COORDINATE, sint16); - sub_6894D4(x, y, z, grid_x, grid_y); + screen_get_map_xy_with_z(x, y, z, grid_x, grid_y); // If SHIFT pressed if (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_SHIFT_PRESSED, uint8) != 0){ @@ -1205,7 +1165,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin uint8 cl; // If CTRL not pressed if (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_CTRL_PRESSED, uint8) == 0){ - sub_689692(x, y, grid_x, grid_y, &cl); + screen_get_map_xy_side(x, y, grid_x, grid_y, &cl); if (*grid_x == (sint16)0x8000) return; @@ -1233,7 +1193,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin } else{ sint16 z = RCT2_GLOBAL(RCT2_ADDRESS_CTRL_PRESS_Z_COORDINATE, sint16); - sub_6896DC(x, y, z, grid_x, grid_y, &cl); + screen_get_map_xy_side_with_z(x, y, z, grid_x, grid_y, &cl); // If SHIFT pressed if (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_SHIFT_PRESSED, uint8) != 0){ @@ -1292,7 +1252,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin } else{ sint16 z = RCT2_GLOBAL(RCT2_ADDRESS_CTRL_PRESS_Z_COORDINATE, sint16); - sub_6894D4(x, y, z, grid_x, grid_y); + screen_get_map_xy_with_z(x, y, z, grid_x, grid_y); // If SHIFT pressed if (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_SHIFT_PRESSED, uint8) != 0){ @@ -1593,7 +1553,7 @@ void top_toolbar_tool_update_scenery_clear(sint16 x, sint16 y){ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 0); rct_xy16 mapTile = { 0 }; - sub_688972(x, y, &mapTile.x, &mapTile.y, NULL); + screen_get_map_xy(x, y, &mapTile.x, &mapTile.y, NULL); if (mapTile.x == (sint16)0x8000){ if (RCT2_GLOBAL(0x00F1AD62, money32) != MONEY32_UNDEFINED){ @@ -1674,7 +1634,7 @@ void top_toolbar_tool_update_land_paint(sint16 x, sint16 y){ RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 0); rct_xy16 mapTile = { 0 }; - sub_688972(x, y, &mapTile.x, &mapTile.y, NULL); + screen_get_map_xy(x, y, &mapTile.x, &mapTile.y, NULL); if (mapTile.x == (sint16)0x8000){ if (RCT2_GLOBAL(0x00F1AD62, money32) != MONEY32_UNDEFINED){ @@ -1829,7 +1789,7 @@ void top_toolbar_tool_update_land(sint16 x, sint16 y){ return; } - sub_688972(x, y, &mapTile.x, &mapTile.y, NULL); + screen_get_map_xy(x, y, &mapTile.x, &mapTile.y, NULL); if (mapTile.x == (sint16)0x8000){ money32 lower_cost = MONEY32_UNDEFINED; diff --git a/src/world/map.c b/src/world/map.c index f445517151..b65e8968bb 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3577,3 +3577,22 @@ void map_invalidate_element(int x, int y, rct_map_element *mapElement) { map_invalidate_tile(x, y, mapElement->base_height, mapElement->clearance_height); } + +int map_get_tile_side(int mapX, int mapY) +{ + int subMapX = mapX & (32 - 1); + int subMapY = mapY & (32 - 1); + return (subMapX < subMapY) ? + ((subMapX + subMapY) < 32 ? 0 : 1): + ((subMapX + subMapY) < 32 ? 3 : 2); +} + +int map_get_tile_quadrant(int mapX, int mapY) +{ + int subMapX = mapX & (32 - 1); + int subMapY = mapY & (32 - 1); + return (subMapX > 16) ? + (subMapY < 16 ? 1 : 0): + (subMapY < 16 ? 2 : 3); +} + diff --git a/src/world/map.h b/src/world/map.h index dd76ad8174..78aec14373 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -351,4 +351,7 @@ void map_invalidate_tile_zoom0(int x, int y, int z0, int z1); void map_invalidate_tile_full(int x, int y); void map_invalidate_element(int x, int y, rct_map_element *mapElement); +int map_get_tile_side(int mapX, int mapY); +int map_get_tile_quadrant(int mapX, int mapY); + #endif From daaf42d58191fd8ca6ff6180fe88b0b35ba229e9 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 11 Jul 2015 18:46:52 +0100 Subject: [PATCH 0253/1173] implement sub_679023 --- src/interface/viewport.c | 56 ++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 6bbe12d1f8..37f8627a1c 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -2336,13 +2336,44 @@ void store_interaction_info(paint_struct *ps) } /** - * rct2: 0x0068862C + * + * rct2: 0x00679074 + */ +void sub_679074(rct_drawpixelinfo *dpi, int imageId, int x, int y) +{ + RCT2_CALLPROC_X(0x00679074, 0, imageId, x, y, 0, (int)dpi, 0); +} + +/** + * + * rct2: 0x00679023 + */ +void sub_679023(rct_drawpixelinfo *dpi, int imageId, int x, int y) +{ + RCT2_GLOBAL(0x00141F569, uint8) = 0; + imageId &= 0xBFFFFFFF; + if (imageId & 0x20000000) { + RCT2_GLOBAL(0x00EDF81C, uint32) = 0; + sub_679074(dpi, imageId, x, y); + } else { + RCT2_GLOBAL(0x00EDF81C, uint32) = 0x20000000; + int index = (imageId >> 19) & 0x7F; + if (imageId & 0x80000000) { + index &= 0x1F; + } + int g1Index = RCT2_ADDRESS(0x0097FCBC, uint32)[index] << 4; + RCT2_GLOBAL(0x009ABDA4, uint8*) = g1Elements[g1Index].offset; + } +} + +/** + * + * rct2: 0x0068862C */ void sub_68862C() { rct_drawpixelinfo *dpi = RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*); paint_struct *ps = RCT2_GLOBAL(0x00EE7884, paint_struct*), *old_ps, *next_ps, *attached_ps; - uint32 eax = 0xBBBBBBBB, ebx = 0xBBBBBBBB, ecx = 0xBBBBBBBB, edx = 0xBBBBBBBB, esi = 0xBBBBBBBB, edi = 0xBBBBBBBB, ebp = 0xBBBBBBBB; while ((ps = ps->next_quadrant_ps) != NULL) { old_ps = ps; @@ -2350,13 +2381,7 @@ void sub_68862C() next_ps = ps; while (next_ps != NULL) { ps = next_ps; - ebx = ps->image_id; - ecx = ps->x; - edx = ps->y; - edi = (uint32)dpi; - ebp = (uint32)ps; - //sub_679023(ps->image_id, ps->x, ps->y, dpi); - RCT2_CALLFUNC_X(0x00679023, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + sub_679023(dpi, ps->image_id, ps->x, ps->y); store_interaction_info(ps); next_ps = ps->var_20; @@ -2364,13 +2389,12 @@ void sub_68862C() attached_ps = ps->attached_ps; while (attached_ps != NULL) { - esi = (uint32)attached_ps; - ebp = (uint32)ps; - ecx = (attached_ps->attached_x + ps->x) & 0xFFFF; - edx = (attached_ps->attached_y + ps->y) & 0xFFFF; - ebx = attached_ps->image_id; - //sub_679023(ebx, ecx, edx, dpi); - RCT2_CALLFUNC_X(0x00679023, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + sub_679023( + dpi, + attached_ps->image_id, + (attached_ps->attached_x + ps->x) & 0xFFFF, + (attached_ps->attached_y + ps->y) & 0xFFFF + ); store_interaction_info(ps); attached_ps = attached_ps->next_attached_ps; From 5deb97a745d08a65f264bd788a1f33516a6a4e62 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 11 Jul 2015 19:11:12 +0100 Subject: [PATCH 0254/1173] extract callfuncs into separate methods in peep.c --- src/peep/peep.c | 82 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 60 insertions(+), 22 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 0f504260bf..6fa22c1c9a 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -52,6 +52,8 @@ static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 pric static bool sub_69AEB7(rct_peep *peep, int rideIndex); static void sub_69A98C(rct_peep *peep); static void sub_68FD3A(rct_peep *peep); +static bool sub_690B99(rct_peep *peep, int edge, uint8 *rideToView, uint8 *rideSeatToView); +static int sub_694921(rct_peep *peep, int x, int y); static void peep_give_real_name(rct_peep *peep); const char *gPeepEasterEggNames[] = { @@ -2743,13 +2745,9 @@ static void peep_update_mowing(rct_peep* peep){ invalidate_sprite((rct_sprite*)peep); while (1){ - sint16 x = 0, y = 0, xy_distance; + sint16 x = 0, y = 0, z, xy_distance; if (peep_update_action(&x, &y, &xy_distance, peep)){ - int eax = x, ebx, ecx = y, z, ebp, edi; - - RCT2_CALLFUNC_X(0x662783, &eax, &ebx, &ecx, &z, (int*)&peep, &edi, &ebp); - x = eax; - y = ecx; + z = map_element_height(x, y) & 0xFFFF; sprite_move(x, y, z, (rct_sprite*)peep); invalidate_sprite((rct_sprite*)peep); return; @@ -2917,13 +2915,9 @@ static void peep_update_sweeping(rct_peep* peep){ peep->staff_litter_swept++; peep->var_45 |= (1 << 4); } - sint16 x = 0, y = 0, xy_distance; + sint16 x = 0, y = 0, z, xy_distance; if (peep_update_action(&x, &y, &xy_distance, peep)){ - int eax = x, ebx, ecx = y, z, ebp, edi; - - RCT2_CALLFUNC_X(0x694921, &eax, &ebx, &ecx, &z, (int*)&peep, &edi, &ebp); - x = eax; - y = ecx; + z = sub_694921(peep, x, y); sprite_move(x, y, z, (rct_sprite*)peep); invalidate_sprite((rct_sprite*)peep); return; @@ -4146,16 +4140,9 @@ static void peep_update_walking(rct_peep* peep){ for (; !(edges & (1 << chosen_edge));)chosen_edge = (chosen_edge + 1) & 3; - uint8 ride_to_view; - uint8 ride_seat_to_view; - { - int eax = chosen_edge, _ebx = 0, ecx, edx = 0, esi = (int)peep, _ebp = 0, edi = 0; - // Work out what to look at - if (RCT2_CALLFUNC_X(0x00690B99, &eax, &_ebx, &ecx, &edx, &esi, &edi, &_ebp) & 0x100)return; - - ride_to_view = ecx & 0xFF; - ride_seat_to_view = (ecx & 0xFF00) >> 8; - } + uint8 ride_to_view, ride_seat_to_view; + if (!sub_690B99(peep, chosen_edge, &ride_to_view, &ride_seat_to_view)) + return; uint16 sprite_id = RCT2_ADDRESS(0xF1EF60, uint16)[((peep->x & 0x1FE0) << 3) | (peep->y >> 5)]; for (rct_sprite* sprite; sprite_id != SPRITE_INDEX_NULL; sprite_id = sprite->unknown.next_in_quadrant){ @@ -5356,31 +5343,82 @@ static void peep_spend_money(rct_peep *peep, money16 *peep_expend_type, money32 sound_play_panned(SOUND_PURCHASE, 0x8001, peep->x, peep->y, peep->z); } +/** + * + * rct2: 0x00695444 + */ static void sub_695444(rct_peep *peep, int rideIndex, int flags) { RCT2_CALLPROC_X(0x00695444, 0, 0, 0, (rideIndex & 0xFF) | (flags << 8), (int)peep, 0, 0); } +/** + * + * rct2: 0x0069AF1E + */ static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price) { return !(RCT2_CALLPROC_X(0x0069AF1E, shopItem | (rideIndex << 8), 0, price, 0, (int)peep, 0, 0) & 0x100); } +/** + * + * rct2: 0x0069AEB7 + */ static bool sub_69AEB7(rct_peep *peep, int rideIndex) { return !(RCT2_CALLPROC_X(0x0069AEB7, rideIndex << 8, 0, 0, 0, (int)peep, 0, 0) & 0x100); } +/** + * + * rct2: 0x0069A98C + */ static void sub_69A98C(rct_peep *peep) { RCT2_CALLPROC_X(0x0069A98C, 0, 0, 0, 0, (int)peep, 0, 0); } +/** + * + * rct2: 0x0068FD3A + */ static void sub_68FD3A(rct_peep *peep) { RCT2_CALLPROC_X(0x0068FD3A, 0, 0, 0, 0, (int)peep, 0, 0); } +/** + * + * rct2: 0x00690B99 + */ +static bool sub_690B99(rct_peep *peep, int edge, uint8 *rideToView, uint8 *rideSeatToView) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + eax = edge; + esi = (int)peep; + if (RCT2_CALLFUNC_X(0x00690B99, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) + return false; + + *rideToView = ecx & 0xFF; + *rideSeatToView = (ecx >> 8) & 0xFF; + return true; +} + +/** + * + * rct2: 0x00694921 + */ +static int sub_694921(rct_peep *peep, int x, int y) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + eax = x; + ecx = y; + esi = (int)peep; + RCT2_CALLFUNC_X(0x00694921, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + return edx & 0xFFFF; +} + /** * * rct2: 0x0069C483 From 9dca351e8d82433d44c0c2d24c47cd34c8d557cd Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 11 Jul 2015 19:37:19 +0100 Subject: [PATCH 0255/1173] fix mistake in sub_679023 --- src/interface/viewport.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 37f8627a1c..4e3217ca95 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -2353,9 +2353,6 @@ void sub_679023(rct_drawpixelinfo *dpi, int imageId, int x, int y) RCT2_GLOBAL(0x00141F569, uint8) = 0; imageId &= 0xBFFFFFFF; if (imageId & 0x20000000) { - RCT2_GLOBAL(0x00EDF81C, uint32) = 0; - sub_679074(dpi, imageId, x, y); - } else { RCT2_GLOBAL(0x00EDF81C, uint32) = 0x20000000; int index = (imageId >> 19) & 0x7F; if (imageId & 0x80000000) { @@ -2363,6 +2360,9 @@ void sub_679023(rct_drawpixelinfo *dpi, int imageId, int x, int y) } int g1Index = RCT2_ADDRESS(0x0097FCBC, uint32)[index] << 4; RCT2_GLOBAL(0x009ABDA4, uint8*) = g1Elements[g1Index].offset; + } else { + RCT2_GLOBAL(0x00EDF81C, uint32) = 0; + sub_679074(dpi, imageId, x, y); } } From 9e9eb6a8332dfd5cbafae003745636ed30f3b60d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 11 Jul 2015 20:24:27 +0100 Subject: [PATCH 0256/1173] implement banner_get_closest_ride_index --- src/windows/sign.c | 9 +++--- src/world/banner.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++ src/world/banner.h | 1 + src/world/map.c | 21 ++++++------ 4 files changed, 96 insertions(+), 16 deletions(-) diff --git a/src/windows/sign.c b/src/windows/sign.c index c27f0a6194..29aac407f2 100644 --- a/src/windows/sign.c +++ b/src/windows/sign.c @@ -337,10 +337,11 @@ static void window_sign_textinput(rct_window *w, int widgetIndex, char *text) } } else{ - int eax = x, ebx = 0, ecx = y, edx = 16, ebp = 0, edi = 0, esi = 0; - RCT2_CALLFUNC_X(0x6B7D86, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - if ((eax & 0xFF) == 0xFF)return; - banner->colour = eax & 0xFF; + int rideIndex = banner_get_closest_ride_index(x, y, 16); + if (rideIndex == -1) + return; + + banner->colour = rideIndex; banner->flags |= BANNER_FLAG_2; rct_string_id prev_string_id = banner->string_idx; diff --git a/src/world/banner.c b/src/world/banner.c index 9aed57fae4..61a9a61d63 100644 --- a/src/world/banner.c +++ b/src/world/banner.c @@ -21,6 +21,7 @@ #include "../addresses.h" #include "../game.h" #include "../localisation/localisation.h" +#include "../ride/ride.h" #include "banner.h" #include "map.h" @@ -82,3 +83,83 @@ rct_map_element *banner_get_map_element(int bannerIndex) } while (!map_element_is_last_for_tile(mapElement++)); return NULL; } + +/** + * + * rct2: 0x006B7EAB + */ +static int banner_get_ride_index_at(int x, int y, int z) +{ + rct_map_element *mapElement; + rct_ride *ride; + int rideIndex, resultRideIndex; + + resultRideIndex = -1; + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) + continue; + + rideIndex = mapElement->properties.track.ride_index; + ride = GET_RIDE(rideIndex); + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) + continue; + + if ((mapElement->clearance_height * 8) + 32 <= z) + continue; + + resultRideIndex = rideIndex; + } while (!map_element_is_last_for_tile(mapElement++)); + + return resultRideIndex; +} + +/** + * + * rct2: 0x006B7D86 + */ +int banner_get_closest_ride_index(int x, int y, int z) +{ + int i, rideIndex; + rct_ride *ride; + + static const rct_xy16 NeighbourCheckOrder[] = { + { 32, 0 }, + { -32, 0 }, + { 0, 32 }, + { 0, -32 }, + { -32, +32 }, + { +32, -32 }, + { +32, +32 }, + { -32, +32 }, + { 0, 0 } + }; + + for (i = 0; i < countof(NeighbourCheckOrder); i++) { + rideIndex = banner_get_ride_index_at(x + NeighbourCheckOrder[i].x, y + NeighbourCheckOrder[i].y, z); + if (rideIndex != -1) { + return rideIndex; + } + } + + rideIndex = -1; + int resultDistance = INT_MAX; + FOR_ALL_RIDES(i, ride) { + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) + continue; + + uint16 xy = ride->overall_view; + if (xy == 0xFFFF) + continue; + + int rideX = (xy & 0xFF) * 32; + int rideY = (xy >> 8) * 32; + int distance = abs(x - rideX) + abs(y - rideY); + if (distance < resultDistance) { + resultDistance = distance; + rideIndex = i; + } + } + + return rideIndex; +} diff --git a/src/world/banner.h b/src/world/banner.h index 13043b9f13..e38176d029 100644 --- a/src/world/banner.h +++ b/src/world/banner.h @@ -48,5 +48,6 @@ extern rct_banner *gBanners; void banner_init(); int create_new_banner(uint8 flags); rct_map_element *banner_get_map_element(int bannerIndex); +int banner_get_closest_ride_index(int x, int y, int z); #endif diff --git a/src/world/map.c b/src/world/map.c index b65e8968bb..e005eec11c 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2411,12 +2411,9 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, banner->x = position.x / 32; banner->y = position.y / 32; - *eax = position.x; - *ecx = position.y; - *edx = position.z; - RCT2_CALLFUNC_X(0x6B7D86, eax, ebx, ecx, edx, esi, edi, ebp); - if ((*eax & 0xFF) != 0xFF){ - banner->colour = *eax & 0xFF; + int rideIndex = banner_get_closest_ride_index(position.x, position.y, position.z); + if (rideIndex != -1) { + banner->colour = rideIndex & 0xFF; banner->flags |= BANNER_FLAG_2; } } @@ -2516,20 +2513,20 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in rct_scenery_entry* scenery_entry = RCT2_ADDRESS(RCT2_ADDRESS_LARGE_SCENERY_ENTRIES, rct_scenery_entry*)[entry_index]; if(scenery_entry->large_scenery.var_11 != 0xFF){ banner_id = create_new_banner(flags); - if(banner_id == MAX_BANNERS){ + if (banner_id == MAX_BANNERS) { *ebx = MONEY32_UNDEFINED; return; } - if(flags & GAME_COMMAND_FLAG_APPLY){ + if (flags & GAME_COMMAND_FLAG_APPLY) { rct_banner* banner = &gBanners[banner_id]; banner->flags |= BANNER_FLAG_1; banner->type = 0; banner->x = x / 32; banner->y = y / 32; - int eax2 = x, ebx2 = *ebx, ecx2 = y, edx2 = z, esi2 = *esi, edi2 = *edi, ebp2 = *ebp; - RCT2_CALLFUNC_X(0x006B7D86, &eax2, &ebx2, &ecx2, &edx2, &esi2, &edi2, &ebp2); - if((uint8)eax2 != 0xFF){ - banner->colour = eax2; + + int rideIndex = banner_get_closest_ride_index(x, y, z); + if (rideIndex != -1) { + banner->colour = rideIndex; banner->flags |= BANNER_FLAG_2; } } From 48b71782fe2e44f94712e4b4a470d452d53bc190 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 11 Jul 2015 21:58:33 +0100 Subject: [PATCH 0257/1173] fix sub_679023 --- src/interface/viewport.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 4e3217ca95..ec8ad17070 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -2358,12 +2358,12 @@ void sub_679023(rct_drawpixelinfo *dpi, int imageId, int x, int y) if (imageId & 0x80000000) { index &= 0x1F; } - int g1Index = RCT2_ADDRESS(0x0097FCBC, uint32)[index] << 4; + int g1Index = RCT2_ADDRESS(0x0097FCBC, uint32)[index]; RCT2_GLOBAL(0x009ABDA4, uint8*) = g1Elements[g1Index].offset; } else { RCT2_GLOBAL(0x00EDF81C, uint32) = 0; - sub_679074(dpi, imageId, x, y); } + sub_679074(dpi, imageId, x, y); } /** From 6acf52ce63bcb4af67a7ffa31e1f99df36cdd720 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 11 Jul 2015 22:51:11 +0100 Subject: [PATCH 0258/1173] implement ride_check_track_contains_inversions, ride_check_track_contains_banked, refactor track circuit iteration and fix window event bug with hook --- src/openrct2.c | 3 +- src/ride/ride.c | 168 +++++++++++++++++++++++++---------------------- src/ride/ride.h | 4 +- src/ride/track.c | 30 ++++++++- src/ride/track.h | 13 ++++ 5 files changed, 137 insertions(+), 81 deletions(-) diff --git a/src/openrct2.c b/src/openrct2.c index 2aadec9c2b..a64cbef838 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -189,7 +189,8 @@ bool openrct2_initialise() // Hooks to allow RCT2 to call OpenRCT2 functions instead addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0); // remove after all drawing is decompiled addhook(0x006E7499, (int)gfx_redraw_screen_rect, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0); // remove when 0x6E7FF3 is decompiled - addhook(0x006B752C, (int)ride_crash, 0, (int[]){ EDX, EBX, END }, 0); // remove when callers are decompiled + addhook(0x006B752C, (int)ride_crash, 0, (int[]){ EDX, EBX, END }, 0); // remove when all callers are decompiled + addhook(0x0069A42F, (int)peep_window_state_update, 0, (int[]){ ESI }, 0); // remove when all callers are decompiled if (!rct2_init()) return false; diff --git a/src/ride/ride.c b/src/ride/ride.c index ef1a305386..8cd38dbb0e 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -609,14 +609,12 @@ bool track_block_get_previous(int x, int y, rct_map_element *mapElement, track_b */ int ride_find_track_gap(rct_xy_element *input, rct_xy_element *output) { - int rideIndex; - rct_xy_element trackElement, nextTrackElement; - rct_map_element *loopTrackElement; - rct_ride *ride; rct_window *w; + rct_ride *ride; + track_circuit_iterator it; + int rideIndex; - trackElement = *input; - rideIndex = trackElement.element->properties.track.ride_index; + rideIndex = input->element->properties.track.ride_index; ride = GET_RIDE(rideIndex); if (ride->type == RIDE_TYPE_MAZE) @@ -626,23 +624,16 @@ int ride_find_track_gap(rct_xy_element *input, rct_xy_element *output) if (w != NULL && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && _currentRideIndex == rideIndex) sub_6C9627(); - loopTrackElement = NULL; - while (1) { - if (!track_block_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { - *output = trackElement; + track_circuit_iterator_begin(&it, *input); + while (track_circuit_iterator_next(&it)) { + if (!track_is_connected_by_shape(it.last.element, it.current.element)) { + *output = it.current; return 1; } - - if (!track_is_connected_by_shape(trackElement.element, nextTrackElement.element)) { - *output = nextTrackElement; - return 1; - } - - trackElement = nextTrackElement; - if (loopTrackElement == NULL) - loopTrackElement = trackElement.element; - else if (loopTrackElement == trackElement.element) - break; + } + if (!it.looped) { + *output = it.last; + return 1; } return 0; @@ -3722,91 +3713,114 @@ void sub_6B5952(int rideIndex) */ int ride_check_block_brakes(rct_xy_element *input, rct_xy_element *output) { - int rideIndex, type; - rct_xy_element trackElement, nextTrackElement; - rct_map_element *loopTrackElement; rct_window *w; + track_circuit_iterator it; + int rideIndex, type; - trackElement = *input; - rideIndex = trackElement.element->properties.track.ride_index; + rideIndex = input->element->properties.track.ride_index; w = window_find_by_class(WC_RIDE_CONSTRUCTION); if (w != NULL && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && _currentRideIndex == rideIndex) sub_6C9627(); - loopTrackElement = NULL; - while (1) { - if (!track_block_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { - // Not sure why this is the case... - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_BLOCK_BRAKES_CANNOT_BE_USED_DIRECTLY_AFTER_STATION; - *output = trackElement; - return 0; - } - - if (nextTrackElement.element->properties.track.type == 216) { - type = trackElement.element->properties.track.type; + track_circuit_iterator_begin(&it, *input); + while (track_circuit_iterator_next(&it)) { + if (it.current.element->properties.track.type == 216) { + type = it.last.element->properties.track.type; if (type == 1) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_BLOCK_BRAKES_CANNOT_BE_USED_DIRECTLY_AFTER_STATION; - *output = nextTrackElement; + *output = it.current; return 0; } if (type == 216) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_BLOCK_BRAKES_CANNOT_BE_USED_DIRECTLY_AFTER_EACH_OTHER; - *output = nextTrackElement; + *output = it.current; return 0; } - if ((trackElement.element->type & 0x80) && type != 209 && type != 210) { + if ((it.last.element->type & 0x80) && type != 209 && type != 210) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_BLOCK_BRAKES_CANNOT_BE_USED_DIRECTLY_AFTER_THE_TOP_OF_THIS_LIFT_HILL; - *output = nextTrackElement; + *output = it.current; return 0; } } - - trackElement = nextTrackElement; - if (loopTrackElement == NULL) - loopTrackElement = trackElement.element; - else if (loopTrackElement == trackElement.element) - break; + } + if (!it.looped) { + // Not sure why this is the case... + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_BLOCK_BRAKES_CANNOT_BE_USED_DIRECTLY_AFTER_STATION; + *output = it.last; + return 0; } return 1; } /** - * + * Iterates along the track until an inversion (loop, corkscrew, barrel roll etc.) track piece is reached. + * @param input The start track element and position. + * @param output The first track element and position which is classified as an inversion. + * @returns true if an inversion track piece is found, otherwise false. * rct2: 0x006CB149 */ -int ride_check_track_suitability_a(rct_xy_element *input, rct_xy_element *output) +bool ride_check_track_contains_inversions(rct_xy_element *input, rct_xy_element *output) { - int eax, ebx, ecx, edx, esi, edi, ebp, result; + rct_window *w; + rct_ride *ride; + int rideIndex, trackType; + track_circuit_iterator it; - eax = input->x; - ecx = input->y; - esi = (int)input->element; - result = RCT2_CALLFUNC_X(0x006CB149, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - output->x = (uint16)eax; - output->y = (uint16)ecx; - output->element = (rct_map_element*)esi; + rideIndex = input->element->properties.track.ride_index; + ride = GET_RIDE(rideIndex); + if (ride->type == RIDE_TYPE_MAZE) + return true; - return (result & 0x100) != 0; + w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w != NULL && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && rideIndex == _currentRideIndex) { + sub_6C9627(); + } + + track_circuit_iterator_begin(&it, *input); + while (track_circuit_iterator_next(&it)) { + trackType = output->element->properties.track.type; + if (RCT2_ADDRESS(0x0099423C, uint16)[trackType] & 0x4000) { + *output = it.current; + return true; + } + } + return false; } /** - * + * Iterates along the track until a banked track piece is reached. + * @param input The start track element and position. + * @param output The first track element and position which is banked. + * @returns true if a banked track piece is found, otherwise false. * rct2: 0x006CB1D3 */ -int ride_check_track_suitability_b(rct_xy_element *input, rct_xy_element *output) +bool ride_check_track_contains_banked(rct_xy_element *input, rct_xy_element *output) { - int eax, ebx, ecx, edx, esi, edi, ebp, result; + rct_window *w; + rct_ride *ride; + int rideIndex, trackType; + track_circuit_iterator it; - eax = input->x; - ecx = input->y; - esi = (int)input->element; - result = RCT2_CALLFUNC_X(0x006CB1D3, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - output->x = (uint16)eax; - output->y = (uint16)ecx; - output->element = (rct_map_element*)esi; + rideIndex = input->element->properties.track.ride_index; + ride = GET_RIDE(rideIndex); + if (ride->type == RIDE_TYPE_MAZE) + return true; - return (result & 0x100) != 0; + w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w != NULL && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && rideIndex == _currentRideIndex) { + sub_6C9627(); + } + + track_circuit_iterator_begin(&it, *input); + while (track_circuit_iterator_next(&it)) { + trackType = output->element->properties.track.type; + if (RCT2_ADDRESS(0x0099423C, uint16)[trackType] & 0x8000) { + *output = it.current; + return true; + } + } + return false; } /** @@ -4108,16 +4122,16 @@ int ride_is_valid_for_test(int rideIndex, int goingToBeOpen, int isApplying) if (ride->subtype != 255) { rct_ride_type *rideType = GET_RIDE_ENTRY(ride->subtype); - if (rideType->flags & RIDE_ENTRY_FLAG_1) { + if (rideType->flags & RIDE_ENTRY_FLAG_NO_INVERSIONS) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN; - if (ride_check_track_suitability_a(&trackElement, &problematicTrackElement)) { + if (ride_check_track_contains_inversions(&trackElement, &problematicTrackElement)) { loc_6B528A(&problematicTrackElement); return 0; } } - if (rideType->flags & RIDE_ENTRY_FLAG_2) { + if (rideType->flags & RIDE_ENTRY_FLAG_NO_BANKED_TRACK) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN; - if (ride_check_track_suitability_b(&trackElement, &problematicTrackElement)) { + if (ride_check_track_contains_banked(&trackElement, &problematicTrackElement)) { loc_6B528A(&problematicTrackElement); return 0; } @@ -4231,16 +4245,16 @@ int ride_is_valid_for_open(int rideIndex, int goingToBeOpen, int isApplying) if (ride->subtype != 255) { rct_ride_type *rideType = GET_RIDE_ENTRY(ride->subtype); - if (rideType->flags & RIDE_ENTRY_FLAG_1) { + if (rideType->flags & RIDE_ENTRY_FLAG_NO_INVERSIONS) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN; - if (ride_check_track_suitability_a(&trackElement, &problematicTrackElement)) { + if (ride_check_track_contains_inversions(&trackElement, &problematicTrackElement)) { loc_6B528A(&problematicTrackElement); return 0; } } - if (rideType->flags & RIDE_ENTRY_FLAG_2) { + if (rideType->flags & RIDE_ENTRY_FLAG_NO_BANKED_TRACK) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN; - if (ride_check_track_suitability_b(&trackElement, &problematicTrackElement)) { + if (ride_check_track_contains_banked(&trackElement, &problematicTrackElement)) { loc_6B528A(&problematicTrackElement); return 0; } diff --git a/src/ride/ride.h b/src/ride/ride.h index 6b96976888..2bbd5998cd 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -393,8 +393,8 @@ enum { // Constants used by the ride_type->flags property at 0x008 enum { RIDE_ENTRY_FLAG_0 = 1 << 0, // 0x1 - RIDE_ENTRY_FLAG_1 = 1 << 1, // 0x2 - RIDE_ENTRY_FLAG_2 = 1 << 2, // 0x4 + RIDE_ENTRY_FLAG_NO_INVERSIONS = 1 << 1, // 0x2 + RIDE_ENTRY_FLAG_NO_BANKED_TRACK = 1 << 2, // 0x4 RIDE_ENTRY_FLAG_3 = 1 << 3, // 0x8 RIDE_ENTRY_FLAG_4 = 1 << 4, // 0x10 RIDE_ENTRY_FLAG_5 = 1 << 5, // 0x20 diff --git a/src/ride/track.c b/src/ride/track.c index 3479b7d600..95ac0c2378 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -4245,4 +4245,32 @@ void game_command_set_brakes_speed(int *eax, int *ebx, int *ecx, int *edx, int * } while (!map_element_is_last_for_tile(mapElement++)); *ebx = 0; -} \ No newline at end of file +} + +void track_circuit_iterator_begin(track_circuit_iterator *it, rct_xy_element first) +{ + it->last = first; + it->first = NULL; + it->firstIteration = true; + it->looped = false; +} + +bool track_circuit_iterator_next(track_circuit_iterator *it) +{ + if (it->first == NULL) { + if (!track_block_get_next(&it->last, &it->current, &it->currentZ, &it->currentDirection)) + return false; + + it->first = it->current.element; + return true; + } else { + if (!it->firstIteration && it->first == it->current.element) { + it->looped = true; + return false; + } + + it->firstIteration = false; + it->last = it->current; + return track_block_get_next(&it->last, &it->current, &it->currentZ, &it->currentDirection); + } +} diff --git a/src/ride/track.h b/src/ride/track.h index 98b43c27dc..a45588ac9c 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -480,6 +480,16 @@ enum { TRACK_ELEM_LEFT_LARGE_HALF_LOOP_DOWN }; +typedef struct { + rct_xy_element last; + rct_xy_element current; + int currentZ; + int currentDirection; + rct_map_element *first; + bool firstIteration; + bool looped; +} track_circuit_iterator; + extern const rct_trackdefinition *gTrackDefinitions; void track_load_list(ride_list_item item); @@ -509,4 +519,7 @@ void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_brakes_speed(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +void track_circuit_iterator_begin(track_circuit_iterator *it, rct_xy_element first); +bool track_circuit_iterator_next(track_circuit_iterator *it); + #endif From fe00e48139ec26f6eedf5c51ef9c7fcaf6e15be7 Mon Sep 17 00:00:00 2001 From: Kevin Burke Date: Sat, 11 Jul 2015 15:07:14 -0700 Subject: [PATCH 0259/1173] Put names on every track piece --- src/ride/track_data.c | 438 +++++++++++++++++++++--------------------- 1 file changed, 219 insertions(+), 219 deletions(-) diff --git a/src/ride/track_data.c b/src/ride/track_data.c index 42d539eba7..09b62a9a0a 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -24,225 +24,225 @@ const rct_track_coordinates* FlatTrackCoordinates = RCT2_ADDRESS(0x009972BB, const rct_track_coordinates); const rct_track_coordinates TrackCoordinates[256] = { - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 16, 0, 0 }, - { 0, 0, 0, 64, 0, 0 }, - { 0, 0, 0, 8, 0, 0 }, - { 0, 0, 0, 32, 0, 0 }, - { 0, 0, 0, 32, 0, 0 }, - { 0, 0, 0, 8, 0, 0 }, - { 0, 0, 16, 0, 0, 0 }, - { 0, 0, 64, 0, 0, 0 }, - { 0, 0, 8, 0, 0, 0 }, - { 0, 0, 32, 0, 0, 0 }, - { 0, 0, 32, 0, 0, 0 }, - { 0, 0, 8, 0, 0, 0 }, - { 0, 3, 0, 0, -64, -64 }, - { 0, 1, 0, 0, -64, 64 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 3, 0, 0, -64, -64 }, - { 0, 1, 0, 0, -64, 64 }, - { 0, 0, 0, 8, 0, 0 }, - { 0, 0, 0, 8, 0, 0 }, - { 0, 0, 0, 8, 0, 0 }, - { 0, 0, 0, 8, 0, 0 }, - { 0, 0, 8, 0, 0, 0 }, - { 0, 0, 8, 0, 0, 0 }, - { 0, 0, 8, 0, 0, 0 }, - { 0, 0, 8, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 3, 0, 64, -64, -64 }, - { 0, 1, 0, 64, -64, 64 }, - { 0, 3, 64, 0, -64, -64 }, - { 0, 1, 64, 0, -64, 64 }, - { 0, 0, 0, 0, -64, -32 }, - { 0, 0, 0, 0, -64, 32 }, - { 0, 0, 0, 0, -32, -32 }, - { 0, 0, 0, 0, -32, 32 }, - { 0, 3, 0, 0, -32, -32 }, - { 0, 1, 0, 0, -32, 32 }, - { 0, 3, 0, 0, -32, -32 }, - { 0, 1, 0, 0, -32, 32 }, - { 0, 3, 0, 32, -32, -32 }, - { 0, 1, 0, 32, -32, 32 }, - { 0, 3, 32, 0, -32, -32 }, - { 0, 1, 32, 0, -32, 32 }, - { 0, 3, 0, 0, 0, 0 }, - { 0, 1, 0, 0, 0, 0 }, - { 0, 0, 0, 16, -64, 0 }, - { 0, 0, 0, 16, -64, 0 }, - { 0, 0, 0, -16, -64, 0 }, - { 0, 0, 0, -16, -64, 0 }, - { 0, 2, 0, 152, -32, 0 }, - { 0, 2, 0, -152, 32, 0 }, - { 0, 3, 0, 80, -32, -32 }, - { 0, 1, 0, 80, -32, 32 }, - { 0, 3, 0, -80, -32, -32 }, - { 0, 1, 0, -80, -32, 32 }, - { 0, 0, 0, 24, 0, 0 }, - { 0, 0, 0, 24, 0, 0 }, - { 0, 0, 24, 0, 0, 0 }, - { 0, 0, 24, 0, 0, 0 }, - { 0, 0, 0, 96, 32, 0 }, - { 0, 0, 0, 32, 32, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 16, 0, 0 }, - { 0, 0, 0, 64, 0, 0 }, - { 0, 0, 0, 8, 0, 0 }, - { 0, 0, 0, 32, 0, 0 }, - { 0, 0, 0, 32, 0, 0 }, - { 0, 0, 0, 8, 0, 0 }, - { 0, 0, 16, 0, 0, 0 }, - { 0, 0, 64, 0, 0, 0 }, - { 0, 0, 8, 0, 0, 0 }, - { 0, 0, 32, 0, 0, 0 }, - { 0, 0, 32, 0, 0, 0 }, - { 0, 0, 8, 0, 0, 0 }, - { 0, 3, 0, 0, -64, -64 }, - { 0, 1, 0, 0, -64, 64 }, - { 0, 0, 0, 0, -64, -32 }, - { 0, 0, 0, 0, -64, 32 }, - { 0, 3, 0, 0, -32, -32 }, - { 0, 1, 0, 0, -32, 32 }, - { 0, 2, 0, 16, 0, -96 }, - { 0, 2, 0, 16, 0, 96 }, - { 0, 2, 16, 0, 0, -96 }, - { 0, 2, 16, 0, 0, 96 }, - { 0, 2, 0, 16, 0, -160 }, - { 0, 2, 0, 16, 0, 160 }, - { 0, 2, 16, 0, 0, -160 }, - { 0, 2, 16, 0, 0, 160 }, - { 0, 3, 0, 64, 0, 0 }, - { 0, 1, 0, 64, 0, 0 }, - { 0, 3, 64, 0, 0, 0 }, - { 0, 1, 64, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 3, 0, 16, -64, -64 }, - { 0, 1, 0, 16, -64, 64 }, - { 0, 3, 16, 0, -64, -64 }, - { 0, 1, 16, 0, -64, 64 }, - { 0, 3, 0, 16, -64, -64 }, - { 0, 1, 0, 16, -64, 64 }, - { 0, 3, 16, 0, -64, -64 }, - { 0, 1, 16, 0, -64, 64 }, - { 0, 0, 0, 16, 0, 0 }, - { 0, 0, 0, 16, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 16, 0, 0, 0 }, - { 0, 0, 16, 0, 0, 0 }, - { 0, 0, 16, 16, -128, 0 }, - { 0, 0, 0, 88, -96, 0 }, - { 0, 0, 0, 88, -96, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 88, 0, -96, 0 }, - { 0, 0, 88, 0, -96, 0 }, - { 0, 0, 0, -96, -96, 0 }, - { 0, 0, 0, 240, -160, 0 }, - { 0, 0, 0, 80, 32, 0 }, - { 0, 0, 0, 32, 32, 0 }, - { 0, 0, 32, 0, 32, 0 }, - { 0, 0, 0, 56, 32, 0 }, - { 0, 0, 56, 0, 0, 0 }, - { 0, 0, 0, 56, 0, 0 }, - { 0, 0, 56, 0, 32, 0 }, - { 0, 0, 24, 0, 0, 0 }, - { 0, 7, 0, 0, -64, -32 }, - { 0, 4, 0, 0, -64, 32 }, - { 4, 0, 0, 0, -64, 32 }, - { 4, 1, 0, 0, -32, 64 }, - { 0, 7, 0, 0, -64, -32 }, - { 0, 4, 0, 0, -64, 32 }, - { 4, 0, 0, 0, -64, 32 }, - { 4, 1, 0, 0, -32, 64 }, - { 4, 4, 0, 0, -32, 32 }, - { 4, 4, 0, 16, -32, 32 }, - { 4, 4, 0, 64, -32, 32 }, - { 4, 4, 0, 8, -32, 32 }, - { 4, 4, 0, 32, -32, 32 }, - { 4, 4, 0, 32, -32, 32 }, - { 4, 4, 0, 8, -32, 32 }, - { 4, 4, 16, 0, -32, 32 }, - { 4, 4, 64, 0, -32, 32 }, - { 4, 4, 8, 0, -32, 32 }, - { 4, 4, 32, 0, -32, 32 }, - { 4, 4, 32, 0, -32, 32 }, - { 4, 4, 8, 0, -32, 32 }, - { 4, 4, 0, 24, -32, 32 }, - { 4, 4, 0, 24, -32, 32 }, - { 4, 4, 24, 0, -32, 32 }, - { 4, 4, 24, 0, -32, 32 }, - { 4, 4, 0, 0, -32, 32 }, - { 4, 4, 0, 0, -32, 32 }, - { 4, 4, 0, 0, -32, 32 }, - { 4, 4, 0, 0, -32, 32 }, - { 4, 4, 0, 8, -32, 32 }, - { 4, 4, 0, 8, -32, 32 }, - { 4, 4, 0, 8, -32, 32 }, - { 4, 4, 0, 8, -32, 32 }, - { 4, 4, 8, 0, -32, 32 }, - { 4, 4, 8, 0, -32, 32 }, - { 4, 4, 8, 0, -32, 32 }, - { 4, 4, 8, 0, -32, 32 }, - { 4, 4, 0, 0, -32, 32 }, - { 4, 4, 0, 0, -32, 32 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 32, -64, 0 }, - { 0, 0, 0, 32, -64, 0 }, - { 0, 0, 0, -32, -64, 0 }, - { 0, 0, 0, -32, -64, 0 }, - { 0, 3, 0, 24, -32, -32 }, - { 0, 1, 0, 24, -32, 32 }, - { 0, 3, 24, 0, -32, -32 }, - { 0, 1, 24, 0, -32, 32 }, - { 0, 0, 0, 16, 0, 0 }, - { 0, 2, 0, 280, -64, -32 }, - { 0, 2, 0, 280, -64, 32 }, - { 0, 2, 0, -280, 64, -32 }, - { 0, 2, 0, -280, 64, 32 }, - { 0, 0, 0, -16, -64, 0 }, - { 0, 0, 0, -16, -64, 0 }, - { 0, 0, 0, 16, -64, 0 }, - { 0, 0, 0, 16, -64, 0 }, - { 0, 2, 0, 120, -32, 0 }, - { 0, 2, 0, -120, 32, 0 }, - { 0, 3, 0, 48, -32, -32 }, - { 0, 1, 0, 48, -32, 32 }, - { 0, 3, 0, -48, -32, -32 }, - { 0, 1, 0, -48, -32, 32 }, - { 0, 2, 0, 32, 0, 0 }, - { 0, 2, 0, -32, 0, 0 }, - { 0, 0, 0, 0, -160, 0 }, - { 0, 0, 0, 0, -160, 0 }, - { 0, 0, 0, 0, -32, 0 }, - { 0, 0, 0, 0, -32, 0 }, - { 0, 0, 0, 0, -32, 0 }, - { 0, 1, 0, 0, -32, 32 }, - { 0, 3, 0, 0, -32, -32 }, - { 0, 2, 0, -96, -96, 0 }, - { 0, 2, 0, 128, 64, 0 }, - { 0, 2, 0, -128, -96, 0 }, - { 0, 3, 0, 16, -32, -32 }, - { 0, 1, 0, 16, -32, 32 }, - { 0, 0, 0, 0, -64, 0 }, - { 0, 0, 0, 0, -64, 0 }, - { 0, 0, 0, 0, -32, 0 }, - { 0, 0, 80, 0, 32, 0 }, - { 0, 0, 240, 0, -160, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 3, 0, 32, -32, -32 }, - { 0, 1, 0, 32, -32, 32 }, + { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT + { 0, 0, 0, 0, 0, 0 }, // ELEM_END_STATION + { 0, 0, 0, 0, 0, 0 }, // ELEM_BEGIN_STATION + { 0, 0, 0, 0, 0, 0 }, // ELEM_MIDDLE_STATION + { 0, 0, 0, 16, 0, 0 }, // ELEM_25_DEG_UP + { 0, 0, 0, 64, 0, 0 }, // ELEM_60_DEG_UP + { 0, 0, 0, 8, 0, 0 }, // ELEM_FLAT_TO_25_DEG_UP + { 0, 0, 0, 32, 0, 0 }, // ELEM_25_DEG_UP_TO_60_DEG_UP + { 0, 0, 0, 32, 0, 0 }, // ELEM_60_DEG_UP_TO_25_DEG_UP + { 0, 0, 0, 8, 0, 0 }, // ELEM_25_DEG_UP_TO_FLAT + { 0, 0, 16, 0, 0, 0 }, // ELEM_25_DEG_DOWN + { 0, 0, 64, 0, 0, 0 }, // ELEM_60_DEG_DOWN + { 0, 0, 8, 0, 0, 0 }, // ELEM_FLAT_TO_25_DEG_DOWN + { 0, 0, 32, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN + { 0, 0, 32, 0, 0, 0 }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN + { 0, 0, 8, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_FLAT + { 0, 3, 0, 0, -64, -64 }, // ELEM_LEFT_QUARTER_TURN_5_TILES + { 0, 1, 0, 0, -64, 64 }, // ELEM_RIGHT_QUARTER_TURN_5_TILES + { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT_TO_LEFT_BANK + { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT_TO_RIGHT_BANK + { 0, 0, 0, 0, 0, 0 }, // ELEM_LEFT_BANK_TO_FLAT + { 0, 0, 0, 0, 0, 0 }, // ELEM_RIGHT_BANK_TO_FLAT + { 0, 3, 0, 0, -64, -64 }, // ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES + { 0, 1, 0, 0, -64, 64 }, // ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES + { 0, 0, 0, 8, 0, 0 }, // ELEM_LEFT_BANK_TO_25_DEG_UP + { 0, 0, 0, 8, 0, 0 }, // ELEM_RIGHT_BANK_TO_25_DEG_UP + { 0, 0, 0, 8, 0, 0 }, // ELEM_25_DEG_UP_TO_LEFT_BANK + { 0, 0, 0, 8, 0, 0 }, // ELEM_25_DEG_UP_TO_RIGHT_BANK + { 0, 0, 8, 0, 0, 0 }, // ELEM_LEFT_BANK_TO_25_DEG_DOWN + { 0, 0, 8, 0, 0, 0 }, // ELEM_RIGHT_BANK_TO_25_DEG_DOWN + { 0, 0, 8, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_LEFT_BANK + { 0, 0, 8, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_RIGHT_BANK + { 0, 0, 0, 0, 0, 0 }, // ELEM_LEFT_BANK + { 0, 0, 0, 0, 0, 0 }, // ELEM_RIGHT_BANK + { 0, 3, 0, 64, -64, -64 }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP + { 0, 1, 0, 64, -64, 64 }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP + { 0, 3, 64, 0, -64, -64 }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN + { 0, 1, 64, 0, -64, 64 }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN + { 0, 0, 0, 0, -64, -32 }, // ELEM_S_BEND_LEFT + { 0, 0, 0, 0, -64, 32 }, // ELEM_S_BEND_RIGHT + { 0, 0, 0, 0, -32, -32 }, // ELEM_LEFT_VERTICAL_LOOP + { 0, 0, 0, 0, -32, 32 }, // ELEM_RIGHT_VERTICAL_LOOP + { 0, 3, 0, 0, -32, -32 }, // ELEM_LEFT_QUARTER_TURN_3_TILES + { 0, 1, 0, 0, -32, 32 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES + { 0, 3, 0, 0, -32, -32 }, // ELEM_LEFT_QUARTER_TURN_3_TILES_BANK + { 0, 1, 0, 0, -32, 32 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK + { 0, 3, 0, 32, -32, -32 }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP + { 0, 1, 0, 32, -32, 32 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP + { 0, 3, 32, 0, -32, -32 }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN + { 0, 1, 32, 0, -32, 32 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN + { 0, 3, 0, 0, 0, 0 }, // ELEM_LEFT_QUARTER_TURN_1_TILE + { 0, 1, 0, 0, 0, 0 }, // ELEM_RIGHT_QUARTER_TURN_1_TILE + { 0, 0, 0, 16, -64, 0 }, // ELEM_LEFT_TWIST_DOWN_TO_UP + { 0, 0, 0, 16, -64, 0 }, // ELEM_RIGHT_TWIST_DOWN_TO_UP + { 0, 0, 0, -16, -64, 0 }, // ELEM_LEFT_TWIST_UP_TO_DOWN + { 0, 0, 0, -16, -64, 0 }, // ELEM_RIGHT_TWIST_UP_TO_DOWN + { 0, 2, 0, 152, -32, 0 }, // ELEM_HALF_LOOP_UP + { 0, 2, 0, -152, 32, 0 }, // ELEM_HALF_LOOP_DOWN + { 0, 3, 0, 80, -32, -32 }, // ELEM_LEFT_CORKSCREW_UP + { 0, 1, 0, 80, -32, 32 }, // ELEM_RIGHT_CORKSCREW_UP + { 0, 3, 0, -80, -32, -32 }, // ELEM_LEFT_CORKSCREW_DOWN + { 0, 1, 0, -80, -32, 32 }, // ELEM_RIGHT_CORKSCREW_DOWN + { 0, 0, 0, 24, 0, 0 }, // ELEM_FLAT_TO_60_DEG_UP + { 0, 0, 0, 24, 0, 0 }, // ELEM_60_DEG_UP_TO_FLAT + { 0, 0, 24, 0, 0, 0 }, // ELEM_FLAT_TO_60_DEG_DOWN + { 0, 0, 24, 0, 0, 0 }, // ELEM_60_DEG_DOWN_TO_FLAT + { 0, 0, 0, 96, 32, 0 }, // ELEM_TOWER_BASE + { 0, 0, 0, 32, 32, 0 }, // ELEM_TOWER_SECTION + { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT_COVERED + { 0, 0, 0, 16, 0, 0 }, // ELEM_25_DEG_UP_COVERED + { 0, 0, 0, 64, 0, 0 }, // ELEM_60_DEG_UP_COVERED + { 0, 0, 0, 8, 0, 0 }, // ELEM_FLAT_TO_25_DEG_UP_COVERED + { 0, 0, 0, 32, 0, 0 }, // ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED + { 0, 0, 0, 32, 0, 0 }, // ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED + { 0, 0, 0, 8, 0, 0 }, // ELEM_25_DEG_UP_TO_FLAT_COVERED + { 0, 0, 16, 0, 0, 0 }, // ELEM_25_DEG_DOWN_COVERED + { 0, 0, 64, 0, 0, 0 }, // ELEM_60_DEG_DOWN_COVERED + { 0, 0, 8, 0, 0, 0 }, // ELEM_FLAT_TO_25_DEG_DOWN_COVERED + { 0, 0, 32, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED + { 0, 0, 32, 0, 0, 0 }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED + { 0, 0, 8, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_FLAT_COVERED + { 0, 3, 0, 0, -64, -64 }, // ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED + { 0, 1, 0, 0, -64, 64 }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED + { 0, 0, 0, 0, -64, -32 }, // ELEM_S_BEND_LEFT_COVERED + { 0, 0, 0, 0, -64, 32 }, // ELEM_S_BEND_RIGHT_COVERED + { 0, 3, 0, 0, -32, -32 }, // ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED + { 0, 1, 0, 0, -32, 32 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED + { 0, 2, 0, 16, 0, -96 }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL + { 0, 2, 0, 16, 0, 96 }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL + { 0, 2, 16, 0, 0, -96 }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL + { 0, 2, 16, 0, 0, 96 }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL + { 0, 2, 0, 16, 0, -160 }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE + { 0, 2, 0, 16, 0, 160 }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE + { 0, 2, 16, 0, 0, -160 }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE + { 0, 2, 16, 0, 0, 160 }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE + { 0, 3, 0, 64, 0, 0 }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP + { 0, 1, 0, 64, 0, 0 }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP + { 0, 3, 64, 0, 0, 0 }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN + { 0, 1, 64, 0, 0, 0 }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN + { 0, 0, 0, 0, 0, 0 }, // ELEM_BRAKES + { 0, 0, 0, 0, 0, 0 }, // ELEM_ROTATION_CONTROL_TOGGLE + { 0, 0, 0, 0, 0, 0 }, // ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP + { 0, 3, 0, 16, -64, -64 }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP + { 0, 1, 0, 16, -64, 64 }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_UP + { 0, 3, 16, 0, -64, -64 }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_DOWN + { 0, 1, 16, 0, -64, 64 }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_DOWN + { 0, 3, 0, 16, -64, -64 }, // ELEM_LEFT_QUARTER_HELIX_LARGE_UP + { 0, 1, 0, 16, -64, 64 }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_UP + { 0, 3, 16, 0, -64, -64 }, // ELEM_LEFT_QUARTER_HELIX_LARGE_DOWN + { 0, 1, 16, 0, -64, 64 }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_DOWN + { 0, 0, 0, 16, 0, 0 }, // ELEM_25_DEG_UP_LEFT_BANKED + { 0, 0, 0, 16, 0, 0 }, // ELEM_25_DEG_UP_RIGHT_BANKED + { 0, 0, 0, 0, 0, 0 }, // ELEM_WATERFALL + { 0, 0, 0, 0, 0, 0 }, // ELEM_RAPIDS + { 0, 0, 0, 0, 0, 0 }, // ELEM_ON_RIDE_PHOTO + { 0, 0, 16, 0, 0, 0 }, // ELEM_25_DEG_DOWN_LEFT_BANKED + { 0, 0, 16, 0, 0, 0 }, // ELEM_25_DEG_DOWN_RIGHT_BANKED + { 0, 0, 16, 16, -128, 0 }, // ELEM_WATER_SPLASH + { 0, 0, 0, 88, -96, 0 }, // ELEM_FLAT_TO_60_DEG_UP_LONG_BASE + { 0, 0, 0, 88, -96, 0 }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE + { 0, 0, 0, 0, 0, 0 }, // ELEM_WHIRLPOOL + { 0, 0, 88, 0, -96, 0 }, // ELEM_60_DEG_DOWN_TO_FLAT_LONG_BASE + { 0, 0, 88, 0, -96, 0 }, // ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE + { 0, 0, 0, -96, -96, 0 }, // ELEM_CABLE_LIFT_HILL + { 0, 0, 0, 240, -160, 0 }, // ELEM_REVERSE_WHOA_BELLY_SLOPE + { 0, 0, 0, 80, 32, 0 }, // ELEM_REVERSE_WHOA_BELLY_VERTICAL + { 0, 0, 0, 32, 32, 0 }, // ELEM_90_DEG_UP + { 0, 0, 32, 0, 32, 0 }, // ELEM_90_DEG_DOWN + { 0, 0, 0, 56, 32, 0 }, // ELEM_60_DEG_UP_TO_90_DEG_UP + { 0, 0, 56, 0, 0, 0 }, // ELEM_90_DEG_DOWN_TO_60_DEG_DOWN + { 0, 0, 0, 56, 0, 0 }, // ELEM_90_DEG_UP_TO_60_DEG_UP + { 0, 0, 56, 0, 32, 0 }, // ELEM_60_DEG_DOWN_TO_90_DEG_DOWN + { 0, 0, 24, 0, 0, 0 }, // ELEM_BRAKE_FOR_DROP + { 0, 7, 0, 0, -64, -32 }, // ELEM_LEFT_EIGHTH_TO_DIAG + { 0, 4, 0, 0, -64, 32 }, // ELEM_RIGHT_EIGHTH_TO_DIAG + { 4, 0, 0, 0, -64, 32 }, // ELEM_LEFT_EIGHTH_TO_ORTHOGONAL + { 4, 1, 0, 0, -32, 64 }, // ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL + { 0, 7, 0, 0, -64, -32 }, // ELEM_LEFT_EIGHTH_BANK_TO_DIAG + { 0, 4, 0, 0, -64, 32 }, // ELEM_RIGHT_EIGHTH_BANK_TO_DIAG + { 4, 0, 0, 0, -64, 32 }, // ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL + { 4, 1, 0, 0, -32, 64 }, // ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL + { 4, 4, 0, 0, -32, 32 }, // ELEM_DIAG_FLAT + { 4, 4, 0, 16, -32, 32 }, // ELEM_DIAG_25_DEG_UP + { 4, 4, 0, 64, -32, 32 }, // ELEM_DIAG_60_DEG_UP + { 4, 4, 0, 8, -32, 32 }, // ELEM_DIAG_FLAT_TO_25_DEG_UP + { 4, 4, 0, 32, -32, 32 }, // ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP + { 4, 4, 0, 32, -32, 32 }, // ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP + { 4, 4, 0, 8, -32, 32 }, // ELEM_DIAG_25_DEG_UP_TO_FLAT + { 4, 4, 16, 0, -32, 32 }, // ELEM_DIAG_25_DEG_DOWN + { 4, 4, 64, 0, -32, 32 }, // ELEM_DIAG_60_DEG_DOWN + { 4, 4, 8, 0, -32, 32 }, // ELEM_DIAG_FLAT_TO_25_DEG_DOWN + { 4, 4, 32, 0, -32, 32 }, // ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN + { 4, 4, 32, 0, -32, 32 }, // ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN + { 4, 4, 8, 0, -32, 32 }, // ELEM_DIAG_25_DEG_DOWN_TO_FLAT + { 4, 4, 0, 24, -32, 32 }, // ELEM_DIAG_FLAT_TO_60_DEG_UP + { 4, 4, 0, 24, -32, 32 }, // ELEM_DIAG_60_DEG_UP_TO_FLAT + { 4, 4, 24, 0, -32, 32 }, // ELEM_DIAG_FLAT_TO_60_DEG_DOWN + { 4, 4, 24, 0, -32, 32 }, // ELEM_DIAG_60_DEG_DOWN_TO_FLAT + { 4, 4, 0, 0, -32, 32 }, // ELEM_DIAG_FLAT_TO_LEFT_BANK + { 4, 4, 0, 0, -32, 32 }, // ELEM_DIAG_FLAT_TO_RIGHT_BANK + { 4, 4, 0, 0, -32, 32 }, // ELEM_DIAG_LEFT_BANK_TO_FLAT + { 4, 4, 0, 0, -32, 32 }, // ELEM_DIAG_RIGHT_BANK_TO_FLAT + { 4, 4, 0, 8, -32, 32 }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP + { 4, 4, 0, 8, -32, 32 }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP + { 4, 4, 0, 8, -32, 32 }, // ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK + { 4, 4, 0, 8, -32, 32 }, // ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK + { 4, 4, 8, 0, -32, 32 }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN + { 4, 4, 8, 0, -32, 32 }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN + { 4, 4, 8, 0, -32, 32 }, // ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK + { 4, 4, 8, 0, -32, 32 }, // ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK + { 4, 4, 0, 0, -32, 32 }, // ELEM_DIAG_LEFT_BANK + { 4, 4, 0, 0, -32, 32 }, // ELEM_DIAG_RIGHT_BANK + { 0, 0, 0, 0, 0, 0 }, // ELEM_LOG_FLUME_REVERSER + { 0, 0, 0, 0, 0, 0 }, // ELEM_SPINNING_TUNNEL + { 0, 0, 0, 32, -64, 0 }, // ELEM_LEFT_BARREL_ROLL_UP_TO_DOWN + { 0, 0, 0, 32, -64, 0 }, // ELEM_RIGHT_BARREL_ROLL_UP_TO_DOWN + { 0, 0, 0, -32, -64, 0 }, // ELEM_LEFT_BARREL_ROLL_DOWN_TO_UP + { 0, 0, 0, -32, -64, 0 }, // ELEM_RIGHT_BARREL_ROLL_DOWN_TO_UP + { 0, 3, 0, 24, -32, -32 }, // ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP + { 0, 1, 0, 24, -32, 32 }, // ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP + { 0, 3, 24, 0, -32, -32 }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK + { 0, 1, 24, 0, -32, 32 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK + { 0, 0, 0, 16, 0, 0 }, // ELEM_POWERED_LIFT + { 0, 2, 0, 280, -64, -32 }, // ELEM_LEFT_LARGE_HALF_LOOP_UP + { 0, 2, 0, 280, -64, 32 }, // ELEM_RIGHT_LARGE_HALF_LOOP_UP + { 0, 2, 0, -280, 64, -32 }, // ELEM_RIGHT_LARGE_HALF_LOOP_DOWN + { 0, 2, 0, -280, 64, 32 }, // ELEM_LEFT_LARGE_HALF_LOOP_DOWN + { 0, 0, 0, -16, -64, 0 }, // ELEM_LEFT_FLYER_TWIST_UP_TO_DOWN + { 0, 0, 0, -16, -64, 0 }, // ELEM_RIGHT_FLYER_TWIST_UP_TO_DOWN + { 0, 0, 0, 16, -64, 0 }, // ELEM_LEFT_FLYER_TWIST_DOWN_TO_UP + { 0, 0, 0, 16, -64, 0 }, // ELEM_RIGHT_FLYER_TWIST_DOWN_TO_UP + { 0, 2, 0, 120, -32, 0 }, // ELEM_FLYER_HALF_LOOP_UP + { 0, 2, 0, -120, 32, 0 }, // ELEM_FLYER_HALF_LOOP_DOWN + { 0, 3, 0, 48, -32, -32 }, // ELEM_LEFT_FLY_CORKSCREW_UP_TO_DOWN + { 0, 1, 0, 48, -32, 32 }, // ELEM_RIGHT_FLY_CORKSCREW_UP_TO_DOWN + { 0, 3, 0, -48, -32, -32 }, // ELEM_LEFT_FLY_CORKSCREW_DOWN_TO_UP + { 0, 1, 0, -48, -32, 32 }, // ELEM_RIGHT_FLY_CORKSCREW_DOWN_TO_UP + { 0, 2, 0, 32, 0, 0 }, // ELEM_HEARTLINE_TRANSFER_UP + { 0, 2, 0, -32, 0, 0 }, // ELEM_HEARTLINE_TRANSFER_DOWN + { 0, 0, 0, 0, -160, 0 }, // ELEM_LEFT_HEARTLINE_ROLL + { 0, 0, 0, 0, -160, 0 }, // ELEM_RIGHT_HEARTLINE_ROLL + { 0, 0, 0, 0, -32, 0 }, // ELEM_MINI_GOLF_HOLE_A + { 0, 0, 0, 0, -32, 0 }, // ELEM_MINI_GOLF_HOLE_B + { 0, 0, 0, 0, -32, 0 }, // ELEM_MINI_GOLF_HOLE_C + { 0, 1, 0, 0, -32, 32 }, // ELEM_MINI_GOLF_HOLE_D + { 0, 3, 0, 0, -32, -32 }, // ELEM_MINI_GOLF_HOLE_E + { 0, 2, 0, -96, -96, 0 }, // ELEM_INVERTED_FLAT_TO_90_DEG_DOWN_QUARTER_LOOP + { 0, 2, 0, 128, 64, 0 }, // ELEM_90_DEG_UP_QUARTER_LOOP_TO_INVERTED + { 0, 2, 0, -128, -96, 0 }, // ELEM_QUARTER_LOOP_INVERT_TO_90_DEG_DOWN + { 0, 3, 0, 16, -32, -32 }, // ELEM_LEFT_CURVED_LIFT_HILL + { 0, 1, 0, 16, -32, 32 }, // ELEM_RIGHT_CURVED_LIFT_HILL + { 0, 0, 0, 0, -64, 0 }, // ELEM_LEFT_REVERSER + { 0, 0, 0, 0, -64, 0 }, // ELEM_RIGHT_REVERSER + { 0, 0, 0, 0, -32, 0 }, // ELEM_AIR_THRUST_TOP_CAP + { 0, 0, 80, 0, 32, 0 }, // ELEM_AIR_THRUST_VERTICAL_DOWN + { 0, 0, 240, 0, -160, 0 }, // ELEM_AIR_THRUST_VERTICAL_DOWN_TO_LEVEL + { 0, 0, 0, 0, 0, 0 }, // ELEM_BLOCK_BRAKES + { 0, 3, 0, 32, -32, -32 }, // ELEM_BANKED_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP + { 0, 1, 0, 32, -32, 32 }, // ELEM_BANKED_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP { 0, 3, 32, 0, -32, -32 }, { 0, 1, 32, 0, -32, 32 }, { 0, 3, 0, 64, -64, -64 }, From c36e9d9cb8e3be01ede9f31bd10e2b144e9f1164 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 12 Jul 2015 00:24:54 +0100 Subject: [PATCH 0260/1173] implement ride_ratings_check_valid_configuration and finalise other ride rating functions --- src/ride/ride.c | 3 ++ src/ride/ride_ratings.c | 79 +++++++++++++++++++++++++++++++++-------- 2 files changed, 67 insertions(+), 15 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 8cd38dbb0e..eb5cb63a66 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -554,6 +554,9 @@ bool track_block_get_previous_from_zero(sint16 x, sint16 y, sint16 z, uint8 ride /** * * rct2: 0x006C6402 + * + * @remarks outTrackBeginEnd.begin_x and outTrackBeginEnd.begin_y will be in the higher two bytes of ecx and edx where as + outTrackBeginEnd.end_x and outTrackBeginEnd.end_y will be in the lower two bytes (cx and dx). */ bool track_block_get_previous(int x, int y, rct_map_element *mapElement, track_begin_end *outTrackBeginEnd) { diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 14e0f2a61d..433028e38c 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -50,6 +50,8 @@ static void ride_ratings_update_state_5(); static void loc_6B5BB2(); static void ride_ratings_calculate(rct_ride *ride); static void ride_ratings_calculate_value(rct_ride *ride); +static void sub_6B5F9D(rct_map_element *mapElement); +static void ride_ratings_check_valid_configuration(int rideIndex); /** * @@ -189,10 +191,6 @@ static void loc_6B5BB2() */ static void ride_ratings_update_state_2() { - // TODO test this function - RCT2_CALLPROC_EBPSAFE(0x006B5C66); - return; - rct_ride *ride; rct_map_element *mapElement; rct_xy_element trackElement, nextTrackElement; @@ -225,7 +223,7 @@ static void ride_ratings_update_state_2() RCT2_GLOBAL(0x0138B5CE, uint16) |= 1; } - RCT2_CALLPROC_X(0x006B5F9D, 0, 0, 0, 0, (int)mapElement, 0, 0); + sub_6B5F9D(mapElement); trackElement.x = RCT2_GLOBAL(0x0138B584, uint16); trackElement.y = RCT2_GLOBAL(0x0138B586, uint16); @@ -268,7 +266,7 @@ static void ride_ratings_update_state_3() } ride_ratings_calculate(ride); - RCT2_CALLPROC_X(0x00655F64, 0, 0, 0, 0, 0, (int)ride, 0); + ride_ratings_check_valid_configuration(_rideRatingsCurrentRide); ride_ratings_calculate_value(ride); window_invalidate_by_number(WC_RIDE, _rideRatingsCurrentRide); @@ -291,13 +289,9 @@ static void ride_ratings_update_state_4() */ static void ride_ratings_update_state_5() { - // sub_6C6402 returns a carry, CALLFUNC doesn't support this - // so have to wait for sub_6C6402 to be decompiled - RCT2_CALLPROC_EBPSAFE(0x006B5D72); - return; - rct_ride *ride; rct_map_element *mapElement; + track_begin_end trackBeginEnd; int x, y, z, trackType; ride = GET_RIDE(_rideRatingsCurrentRide); @@ -320,17 +314,17 @@ static void ride_ratings_update_state_5() continue; if (trackType == 255 || trackType == mapElement->properties.track.type) { - RCT2_CALLPROC_X(0x006B5F9D, 0, 0, 0, 0, (int)mapElement, 0, 0); + sub_6B5F9D(mapElement); x = RCT2_GLOBAL(0x0138B584, uint16); y = RCT2_GLOBAL(0x0138B586, uint16); - if (!track_block_get_previous(x, y, mapElement, NULL)) { + if (!track_block_get_previous(x, y, mapElement, &trackBeginEnd)) { _rideRatingsState = RIDE_RATINGS_STATE_CALCULATE; return; } - x >>= 16; - y >>= 16; + x = trackBeginEnd.begin_x; + y = trackBeginEnd.begin_y; if (x == RCT2_GLOBAL(0x0138B58A, uint16) && y == RCT2_GLOBAL(0x0138B58C, uint16) && z == RCT2_GLOBAL(0x0138B58E, uint16)) { _rideRatingsState = RIDE_RATINGS_STATE_CALCULATE; return; @@ -345,6 +339,61 @@ static void ride_ratings_update_state_5() _rideRatingsState = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; } +/** + * + * rct2: 0x006B5F9D + */ +static void sub_6B5F9D(rct_map_element *mapElement) +{ + RCT2_CALLPROC_X(0x006B5F9D, 0, 0, 0, 0, (int)mapElement, 0, 0); +} + +/** + * + * rct2: 0x00655F64 + */ +static void ride_ratings_check_valid_configuration(int rideIndex) +{ + rct_ride *ride = GET_RIDE(rideIndex); + + // Check if launch speed is valid + switch (ride->mode) { + case RIDE_MODE_POWERED_LAUNCH_PASSTROUGH: + case RIDE_MODE_UPWARD_LAUNCH: + case RIDE_MODE_LIM_POWERED_LAUNCH: + case RIDE_MODE_POWERED_LAUNCH: + case RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED: + if (ride->launch_speed > RCT2_GLOBAL(0x0097CF40 + (ride->type * 8) + 5, uint8)) { + ride->unreliability_factor = 255; + ride->reliability /= 8; + } + break; + } + + // Check if number of vehicles is valid + ride_update_max_vehicles(rideIndex); + if (ride->num_vehicles > ride->max_trains) { + ride->unreliability_factor = 255; + ride->reliability /= 8; + } + + // Check if ride entry is valid + uint8 *availableRideEntries = (uint8*)0x009E32F8; + for (int i = 0; i < ride->type; i++) { + while (*availableRideEntries != 255) availableRideEntries++; + *availableRideEntries++; + } + + do { + if (ride->subtype == *availableRideEntries) { + return; + } + } while (*++availableRideEntries != 255); + + ride->unreliability_factor = 255; + ride->reliability /= 8; +} + static void ride_ratings_calculate(rct_ride *ride) { ride_ratings_calculation calcFunc; From 3ffffc699cac9494a554d1a5e4cf857fa30c5236 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 12 Jul 2015 01:46:52 +0100 Subject: [PATCH 0261/1173] clean up and remove various callprocs --- src/game.c | 4 ++-- src/game.h | 2 +- src/interface/viewport.c | 8 ++------ src/ride/ride.c | 14 -------------- src/windows/ride.c | 25 ++++--------------------- src/world/footpath.h | 1 + src/world/map.c | 38 ++++++++++++++++++++------------------ src/world/map.h | 1 + src/world/sprite.c | 15 +++++++-------- 9 files changed, 38 insertions(+), 70 deletions(-) diff --git a/src/game.c b/src/game.c index e26db4bedd..021efd0df4 100644 --- a/src/game.c +++ b/src/game.c @@ -907,7 +907,7 @@ void game_load_or_quit_no_save_prompt() static uint32 game_do_command_table[58] = { 0, - 0x0066397F, + 0, 0, 0, 0, @@ -970,7 +970,7 @@ void game_command_emptysub(int* eax, int* ebx, int* ecx, int* edx, int* esi, int static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_set_ride_appearance, - game_command_emptysub, + game_command_set_land_height, game_pause_toggle, game_command_place_track, game_command_remove_track, diff --git a/src/game.h b/src/game.h index 5a2911113b..5247ccd70e 100644 --- a/src/game.h +++ b/src/game.h @@ -26,7 +26,7 @@ enum GAME_COMMAND { GAME_COMMAND_SET_RIDE_APPEARANCE, - GAME_COMMAND_1, + GAME_COMMAND_SET_LAND_HEIGHT, GAME_COMMAND_TOGGLE_PAUSE, GAME_COMMAND_PLACE_TRACK, GAME_COMMAND_REMOVE_TRACK, diff --git a/src/interface/viewport.c b/src/interface/viewport.c index ec8ad17070..0a4878b9a4 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -2587,9 +2587,7 @@ void screen_get_map_xy_with_z(sint16 screenX, sint16 screenY, sint16 z, sint16 * */ void screen_get_map_xy_quadrant(sint16 screenX, sint16 screenY, sint16 *mapX, sint16 *mapY, uint8 *quadrant) { - rct_viewport *viewport; - - screen_get_map_xy(screenX, screenY, mapX, mapY, &viewport); + screen_get_map_xy(screenX, screenY, mapX, mapY, NULL); if (*mapX == (sint16)0x8000) return; @@ -2619,9 +2617,7 @@ void screen_get_map_xy_quadrant_with_z(sint16 screenX, sint16 screenY, sint16 z, */ void screen_get_map_xy_side(sint16 screenX, sint16 screenY, sint16 *mapX, sint16 *mapY, uint8 *side) { - rct_viewport *viewport; - - screen_get_map_xy(screenX, screenY, mapX, mapY, &viewport); + screen_get_map_xy(screenX, screenY, mapX, mapY, NULL); if (*mapX == (sint16)0x8000) return; diff --git a/src/ride/ride.c b/src/ride/ride.c index eb5cb63a66..f5a78109d5 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3000,20 +3000,6 @@ void ride_set_map_tooltip(rct_map_element *mapElement) */ int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint16 sampleRate, uint32 position, uint8 *tuneId) { - /*{ - int a_eax, a_ebx, a_ecx, a_edx, a_esi, a_edi, a_ebp; - - a_eax = x; - a_ebx = (*tuneId << 8) | rideIndex; - a_ecx = y; - a_edx = z; - a_edi = sampleRate; - a_ebp = position; - RCT2_CALLFUNC_X(0x006BC3AC, &a_eax, &a_ebx, &a_ecx, &a_edx, &a_esi, &a_edi, &a_ebp); - - *tuneId = (a_ebx >> 8) & 0xFF; - return a_ebp; - }*/ if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !RCT2_GLOBAL(0x009AF59C, uint8) && RCT2_GLOBAL(0x00F438A4, rct_viewport*) != (rct_viewport*)-1) { RCT2_GLOBAL(0x009AF47C, uint16) = sampleRate; sint16 v11; diff --git a/src/windows/ride.c b/src/windows/ride.c index 9eb5b926a4..3981ffa009 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -3674,24 +3674,14 @@ static void window_ride_set_track_colour_scheme(rct_window *w, int x, int y) { rct_map_element *mapElement; uint8 newColourScheme; + int interactionType, z, direction; newColourScheme = (uint8)(*((uint16*)&w->var_494)); - int interactionType; - rct_xy16 mapCoord = { 0 }; get_map_coordinates_from_pos(x, y, VIEWPORT_INTERACTION_MASK_RIDE, &mapCoord.x, &mapCoord.y, &interactionType, &mapElement, NULL); x = mapCoord.x; y = mapCoord.y; - // Get map coordinates from point - /*int eax, ebx, ecx, edx, esi, edi, ebp; - eax = x; - ebx = y; - edx = -5; - RCT2_CALLFUNC_X(0x00685ADC, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - x = eax & 0xFFFF; - y = ecx & 0xFFFF; - mapElement = (rct_map_element*)edx;*/ if (interactionType != VIEWPORT_INTERACTION_ITEM_RIDE) return; @@ -3700,16 +3690,9 @@ static void window_ride_set_track_colour_scheme(rct_window *w, int x, int y) if ((mapElement->properties.track.colour & 3) == newColourScheme) return; - RCT2_CALLPROC_X( - 0x006C683D, - x, - ((mapElement->type & 3) << 8) | mapElement->properties.track.type, - y, - mapElement->base_height << 3, - newColourScheme, - 0, - 4 - ); + z = mapElement->base_height * 8; + direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; + sub_6C683D(&x, &y, &z, direction, mapElement->properties.track.type, newColourScheme, NULL, 4); } /** diff --git a/src/world/footpath.h b/src/world/footpath.h index 28f89cdb1f..4cf703b54d 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -48,6 +48,7 @@ enum { extern const rct_xy16 word_981D6C[4]; +money32 footpath_remove_real(int x, int y, int z, int flags); void game_command_place_footpath(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_remove_footpath(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); money32 footpath_place(int type, int x, int y, int z, int slope, int flags); diff --git a/src/world/map.c b/src/world/map.c index e005eec11c..26d059aea6 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -20,6 +20,9 @@ #include "../addresses.h" #include "../audio/audio.h" +#include "../cheats.h" +#include "../config.h" +#include "../cursors.h" #include "../game.h" #include "../interface/window.h" #include "../localisation/date.h" @@ -33,9 +36,7 @@ #include "map_animation.h" #include "park.h" #include "scenery.h" -#include "../cheats.h" -#include "../config.h" -#include "../cursors.h" + const rct_xy16 TileDirectionDelta[] = { { -32, 0 }, @@ -1166,17 +1167,6 @@ void game_command_set_banner_colour(int* eax, int* ebx, int* ecx, int* edx, int* *ebx = 0; } -money32 sub_6A67C0(int x, int y, int z, int flags) -{ - int eax, ebx, ecx, edx, esi, edi, ebp; - eax = x * 32; - ecx = y * 32; - ebx = flags & 0xFF; - edx = z & 0xFF; - RCT2_CALLFUNC_X(0x006A67C0, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - return ebx; -} - // This will cause clear scenery to remove paths // This should be a flag for the game command which can be set via a checkbox on the clear scenery window. // #define CLEAR_SCENERY_REMOVES_PATHS @@ -1200,7 +1190,7 @@ restart_from_beginning: switch (type) { case MAP_ELEMENT_TYPE_PATH: if (gClearFootpath) { - cost = sub_6A67C0(x, y, mapElement->base_height, flags); + cost = footpath_remove_real(x * 32, y * 32, mapElement->base_height, flags); if (cost == MONEY32_UNDEFINED) return MONEY32_UNDEFINED; @@ -1457,7 +1447,7 @@ const uint8 map_element_lower_styles[5][32] = { { 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x0D, 0x0E, 0x00 }, }; -static money32 sub_66397F(int flags, int x, int y, int height, int style, int selectionType) +static money32 map_set_land_height(int flags, int x, int y, int height, int style, int selectionType) { if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; @@ -1505,6 +1495,18 @@ static money32 sub_66397F(int flags, int x, int y, int height, int style, int se return ebx; } +void game_command_set_land_height(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) +{ + *ebx = map_set_land_height( + *ebx & 0xFF, + *eax & 0xFFFF, + *ecx & 0xFFFF, + *edx & 0xFF, + (*edx >> 8) & 0xFF, + *edi >> 5 + ); +} + money32 raise_land(int flags, int x, int y, int z, int ax, int ay, int bx, int by, int selectionType) { money32 cost = 0; @@ -1541,7 +1543,7 @@ money32 raise_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b height += 2; newStyle &= ~0x20; } - money32 tileCost = sub_66397F(flags, xi, yi, height, newStyle, selectionType); + money32 tileCost = map_set_land_height(flags, xi, yi, height, newStyle, selectionType); if (tileCost == MONEY32_UNDEFINED) return MONEY32_UNDEFINED; @@ -1605,7 +1607,7 @@ money32 lower_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b height -= 2; newStyle &= ~0x20; } - money32 tileCost = sub_66397F(flags, xi, yi, height, newStyle, selectionType); + money32 tileCost = map_set_land_height(flags, xi, yi, height, newStyle, selectionType); if (tileCost == MONEY32_UNDEFINED) return MONEY32_UNDEFINED; diff --git a/src/world/map.h b/src/world/map.h index 78aec14373..eaed60b305 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -295,6 +295,7 @@ money32 map_clear_scenery(int x0, int y0, int x1, int y1, int flags); money32 lower_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags); money32 raise_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags); +void game_command_set_land_height(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_remove_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_remove_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); diff --git a/src/world/sprite.c b/src/world/sprite.c index 1aec4516a4..501020d1ff 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -476,14 +476,13 @@ void money_effect_create(money32 value) return; mainViewport = mainWindow->viewport; - mapPosition.x = mainViewport->x + (mainViewport->width / 2); - mapPosition.y = mainViewport->y + (mainViewport->height / 2); - - int eax = mapPosition.x, ebx = mapPosition.y, ecx, edx, esi, edi, ebp; - RCT2_CALLFUNC_X(0x00688972, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - mapPosition.x = eax; - mapPosition.y = ebx; - + screen_get_map_xy( + mainViewport->x + (mainViewport->width / 2), + mainViewport->y + (mainViewport->height / 2), + &mapPosition.x, + &mapPosition.y, + NULL + ); if (mapPosition.x == (sint16)0x8000) return; From ed5c6eb866e8b85d9a686c1dcbb98b9d7e7a0535 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 12 Jul 2015 14:26:14 +0100 Subject: [PATCH 0262/1173] implement ride_check_start_and_end_is_station and fix #1575 --- src/ride/ride.c | 54 ++++++++++++++++++++++++++++++------------------ src/ride/track.c | 34 ++++++++++++++++++++++++++++++ src/ride/track.h | 3 +++ 3 files changed, 71 insertions(+), 20 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index f5a78109d5..f28e41de56 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3865,19 +3865,39 @@ int ride_check_station_length(rct_xy_element *input, rct_xy_element *output) * * rct2: 0x006CB2DA */ -int ride_check_start_and_end_is_station(rct_xy_element *input, rct_xy_element *output) +bool ride_check_start_and_end_is_station(rct_xy_element *input, rct_xy_element *output) { - int eax, ebx, ecx, edx, esi, edi, ebp, result; + rct_window *w; + rct_ride *ride; + int rideIndex, trackType; + rct_xy_element trackBack, trackFront; - eax = input->x; - ecx = input->y; - esi = (int)input->element; - result = RCT2_CALLFUNC_X(0x006CB2DA, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - output->x = (uint16)eax; - output->y = (uint16)ecx; - output->element = (rct_map_element*)esi; + rideIndex = input->element->properties.track.ride_index; + ride = GET_RIDE(rideIndex); - return (result & 0x100) != 0; + w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w != NULL && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && rideIndex == _currentRideIndex) { + sub_6C9627(); + } + + // Check back of the track + track_get_back(input, &trackBack); + trackType = trackBack.element->properties.track.type; + if (!(RCT2_GLOBAL(0x0099BA64 + (trackType * 16), uint32) & 0x10)) { + return false; + } + ride->var_13A = (trackBack.x >> 5) | ((trackBack.y >> 5) << 8); + ride->var_13E = trackBack.element->base_height; + + // Check front of the track + track_get_front(input, &trackFront); + trackType = trackFront.element->properties.track.type; + if (!(RCT2_GLOBAL(0x0099BA64 + (trackType * 16), uint32) & 0x10)) { + return false; + } + ride->var_13C = (trackFront.x >> 5) | ((trackFront.y >> 5) << 8); + ride->var_13F = trackFront.element->base_height; + return true; } /** @@ -4140,7 +4160,7 @@ int ride_is_valid_for_test(int rideIndex, int goingToBeOpen, int isApplying) } 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)) { + if (!ride_check_start_and_end_is_station(&trackElement, &problematicTrackElement)) { loc_6B528A(&problematicTrackElement); return 0; } @@ -4257,19 +4277,13 @@ int ride_is_valid_for_open(int rideIndex, int goingToBeOpen, int isApplying) } 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); + if (!ride_check_station_length(&trackElement, &problematicTrackElement)) { + 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)) { + if (!ride_check_start_and_end_is_station(&trackElement, &problematicTrackElement)) { loc_6B528A(&problematicTrackElement); return 0; } diff --git a/src/ride/track.c b/src/ride/track.c index 95ac0c2378..297fe71508 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -4274,3 +4274,37 @@ bool track_circuit_iterator_next(track_circuit_iterator *it) return track_block_get_next(&it->last, &it->current, &it->currentZ, &it->currentDirection); } } + +void track_get_back(rct_xy_element *input, rct_xy_element *output) +{ + rct_xy_element lastTrack; + track_begin_end currentTrack; + bool result; + + lastTrack = *input; + do { + result = track_block_get_previous(lastTrack.x, lastTrack.y, lastTrack.element, ¤tTrack); + if (result) { + lastTrack.x = currentTrack.begin_x; + lastTrack.y = currentTrack.begin_y; + lastTrack.element = currentTrack.begin_element; + } + } while (result); + *output = lastTrack; +} + +void track_get_front(rct_xy_element *input, rct_xy_element *output) +{ + rct_xy_element lastTrack, currentTrack; + int z, direction; + bool result; + + lastTrack = *input; + do { + result = track_block_get_next(&lastTrack, ¤tTrack, &z, &direction); + if (result) { + lastTrack = currentTrack; + } + } while (result); + *output = lastTrack; +} diff --git a/src/ride/track.h b/src/ride/track.h index a45588ac9c..1a757d0b7d 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -522,4 +522,7 @@ void game_command_set_brakes_speed(int *eax, int *ebx, int *ecx, int *edx, int * void track_circuit_iterator_begin(track_circuit_iterator *it, rct_xy_element first); bool track_circuit_iterator_next(track_circuit_iterator *it); +void track_get_back(rct_xy_element *input, rct_xy_element *output); +void track_get_front(rct_xy_element *input, rct_xy_element *output); + #endif From 04a944822c5e9c43fc3eb96d31ca4b39119cdd17 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sun, 12 Jul 2015 16:00:40 +0200 Subject: [PATCH 0263/1173] Update changelog.txt --- distribution/changelog.txt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index ea635d13f8..9e9f56c3a5 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -1,3 +1,14 @@ +0.0.3-beta (not yet released) +------------------------------------------------------------------------ +- Feature: Adding extra title sequences. +- Feature: Title sequences can be edited in-game. +- Feature: Uncapped FPS. +- Feature: Ride selection in the Editor can now be sorted on track type or vehicle type. +- Feature: Load/save window can be sorted on date. +- Feature: Cheats for guest parameters like hunger, energy, nausea etc. +- Feature: Cheats for park parameters like guest generation, loan settings and switching to and from not using money. +- Fix: Launched TD4 rides will now always use the RCT1 launch mode (that doesn't pass the station). + 0.0.2-beta (2015-06-21) ------------------------------------------------------------------------ - Feature: Intro sequence does not show by default. @@ -42,4 +53,4 @@ - Feature: RollerCoaster Tycoon 1 scenarios can now be opened in the scenario editor or by using the 'edit' command line action. - Feature: The "have fun" objective can now be selected in the scenario editor. - Feature: Twitch integration -- Fix: Litter bins now get full and require emptying by handymen. \ No newline at end of file +- Fix: Litter bins now get full and require emptying by handymen. From 4a8b5843f7b550fa07bc29b679c41c294703b07e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 12 Jul 2015 15:16:15 +0100 Subject: [PATCH 0264/1173] implement ride_get_track_length --- src/ride/ride.c | 83 ++++++++++---- src/ride/track_data.c | 259 ++++++++++++++++++++++++++++++++++++++++++ src/ride/track_data.h | 2 + 3 files changed, 322 insertions(+), 22 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index f28e41de56..b8e625a092 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5472,13 +5472,58 @@ int ride_get_smallest_station_length(rct_ride *ride) return (int)result; } -static int sub_6CB3AA(rct_ride *ride) +/** + * + * rct2: 0x006CB3AA + */ +static int ride_get_track_length(rct_ride *ride) { - int eax, ebx, ecx, edx, esi, edi, ebp; + rct_window *w; + rct_map_element *mapElement; + track_circuit_iterator it; + int x, y, z, trackType, rideIndex, result; - edi = (int)ride; - RCT2_CALLFUNC_X(0x006CB3AA, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - return eax; + for (int i = 0; i < 4; i++) { + uint16 xy = ride->station_starts[i]; + if (xy == 0xFFFF) + continue; + + x = (xy & 0xFF) * 32; + y = (xy >> 8) * 32; + z = ride->station_heights[i]; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) + continue; + + trackType = mapElement->properties.track.type; + if (!RCT2_GLOBAL(0x0099BA64 + (trackType * 16), uint32) & 0x10) + continue; + + if (mapElement->base_height != z) + continue; + + goto foundTrack; + } while (!map_element_is_last_for_tile(mapElement++)); + } + return 0; + +foundTrack: + rideIndex = mapElement->properties.track.ride_index; + + w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w != NULL && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && _currentRideIndex == rideIndex) { + sub_6C9627(); + } + + result = 0; + track_circuit_iterator_begin(&it, (rct_xy_element){ x, y, mapElement }); + while (track_circuit_iterator_next(&it)) { + trackType = it.current.element->properties.track.type; + result += TrackPieceLengths[trackType]; + } + return result; } /** @@ -5576,23 +5621,17 @@ void ride_update_max_vehicles(int rideIndex) } totalSpacing >>= 13; - int unk2 = sub_6CB3AA(ride) / 4; - if (unk > 10) { - unk2 = (unk2 * 3) / 4; - } - if (unk > 25) { - unk2 = (unk2 * 3) / 4; - } - if (unk > 40) { - unk2 = (unk2 * 3) / 4; - } + int trackLength = ride_get_track_length(ride) / 4; + if (unk > 10) trackLength = (trackLength * 3) / 4; + if (unk > 25) trackLength = (trackLength * 3) / 4; + if (unk > 40) trackLength = (trackLength * 3) / 4; maxNumTrains = 0; - int unk3 = 0; + int length = 0; do { maxNumTrains++; - unk3 += totalSpacing; - } while (maxNumTrains < 31 && unk3 < unk2); + length += totalSpacing; + } while (maxNumTrains < 31 && length < trackLength); } break; } @@ -5601,10 +5640,10 @@ void ride_update_max_vehicles(int rideIndex) numCarsPerTrain = min(ride->var_0CB, maxCarsPerTrain); numVehicles = min(ride->var_0CA, maxNumTrains); } else { - ride->max_trains = rideEntry->cars_per_flat_ride; - ride->min_max_cars_per_train = rideEntry->max_cars_in_train | (rideEntry->min_cars_in_train << 4); - numCarsPerTrain = rideEntry->max_cars_in_train; - numVehicles = min(ride->var_0CA, rideEntry->cars_per_flat_ride); + ride->max_trains = rideEntry->cars_per_flat_ride; + ride->min_max_cars_per_train = rideEntry->max_cars_in_train | (rideEntry->min_cars_in_train << 4); + numCarsPerTrain = rideEntry->max_cars_in_train; + numVehicles = min(ride->var_0CA, rideEntry->cars_per_flat_ride); } // Refresh new current num vehicles / num cars per vehicle diff --git a/src/ride/track_data.c b/src/ride/track_data.c index 42d539eba7..1700176162 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -4689,3 +4689,262 @@ const rct_preview_track *FlatRideTrackBlocks[255] = { FlatRideTrackBlocks253, FlatRideTrackBlocks254 }; + +const uint8 TrackPieceLengths[256] = { + 32, // TRACK_ELEM_FLAT + 32, // TRACK_ELEM_END_STATION + 32, // TRACK_ELEM_BEGIN_STATION + 32, // TRACK_ELEM_MIDDLE_STATION + 33, // TRACK_ELEM_25_DEG_UP + 40, // TRACK_ELEM_60_DEG_UP + 32, // TRACK_ELEM_FLAT_TO_25_DEG_UP + 34, // TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP + 34, // TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP + 32, // TRACK_ELEM_25_DEG_UP_TO_FLAT + 33, // TRACK_ELEM_25_DEG_DOWN + 40, // TRACK_ELEM_60_DEG_DOWN + 32, // TRACK_ELEM_FLAT_TO_25_DEG_DOWN + 34, // TRACK_ELEM_25_DEG_DOWN_TO_60_DEG_DOWN + 34, // TRACK_ELEM_60_DEG_DOWN_TO_25_DEG_DOWN + 32, // TRACK_ELEM_25_DEG_DOWN_TO_FLAT + 124, // TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES + 124, // TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES + 32, // TRACK_ELEM_FLAT_TO_LEFT_BANK + 32, // TRACK_ELEM_FLAT_TO_RIGHT_BANK + 32, // TRACK_ELEM_LEFT_BANK_TO_FLAT + 32, // TRACK_ELEM_RIGHT_BANK_TO_FLAT + 124, // TRACK_ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES + 124, // TRACK_ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES + 32, // TRACK_ELEM_LEFT_BANK_TO_25_DEG_UP + 32, // TRACK_ELEM_RIGHT_BANK_TO_25_DEG_UP + 32, // TRACK_ELEM_25_DEG_UP_TO_LEFT_BANK + 32, // TRACK_ELEM_25_DEG_UP_TO_RIGHT_BANK + 32, // TRACK_ELEM_LEFT_BANK_TO_25_DEG_DOWN + 32, // TRACK_ELEM_RIGHT_BANK_TO_25_DEG_DOWN + 32, // TRACK_ELEM_25_DEG_DOWN_TO_LEFT_BANK + 32, // TRACK_ELEM_25_DEG_DOWN_TO_RIGHT_BANK + 32, // TRACK_ELEM_LEFT_BANK + 32, // TRACK_ELEM_RIGHT_BANK + 130, // TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP + 130, // TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP + 130, // TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN + 130, // TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN + 96, // TRACK_ELEM_S_BEND_LEFT + 96, // TRACK_ELEM_S_BEND_RIGHT + 120, // TRACK_ELEM_LEFT_VERTICAL_LOOP + 120, // TRACK_ELEM_RIGHT_VERTICAL_LOOP + 75, // TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES + 75, // TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES + 75, // TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_BANK + 75, // TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK + 77, // TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP + 77, // TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP + 77, // TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN + 77, // TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN + 24, // TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE + 24, // TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE + 96, // TRACK_ELEM_LEFT_TWIST_DOWN_TO_UP + 96, // TRACK_ELEM_RIGHT_TWIST_DOWN_TO_UP + 96, // TRACK_ELEM_LEFT_TWIST_UP_TO_DOWN + 96, // TRACK_ELEM_RIGHT_TWIST_UP_TO_DOWN + 60, // TRACK_ELEM_HALF_LOOP_UP + 60, // TRACK_ELEM_HALF_LOOP_DOWN + 55, // TRACK_ELEM_LEFT_CORKSCREW_UP + 55, // TRACK_ELEM_RIGHT_CORKSCREW_UP + 55, // TRACK_ELEM_LEFT_CORKSCREW_DOWN + 55, // TRACK_ELEM_RIGHT_CORKSCREW_DOWN + 36, // TRACK_ELEM_FLAT_TO_60_DEG_UP + 36, // TRACK_ELEM_60_DEG_UP_TO_FLAT + 36, // TRACK_ELEM_FLAT_TO_60_DEG_DOWN + 36, // TRACK_ELEM_60_DEG_DOWN_TO_FLAT + 32, // TRACK_ELEM_TOWER_BASE + 32, // TRACK_ELEM_TOWER_SECTION + 32, // TRACK_ELEM_FLAT_COVERED + 33, // TRACK_ELEM_25_DEG_UP_COVERED + 40, // TRACK_ELEM_60_DEG_UP_COVERED + 32, // TRACK_ELEM_FLAT_TO_25_DEG_UP_COVERED + 34, // TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED + 34, // TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED + 32, // TRACK_ELEM_25_DEG_UP_TO_FLAT_COVERED + 33, // TRACK_ELEM_25_DEG_DOWN_COVERED + 40, // TRACK_ELEM_60_DEG_DOWN_COVERED + 32, // TRACK_ELEM_FLAT_TO_25_DEG_DOWN_COVERED + 34, // TRACK_ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED + 34, // TRACK_ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED + 32, // TRACK_ELEM_25_DEG_DOWN_TO_FLAT_COVERED + 124, // TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED + 124, // TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED + 96, // TRACK_ELEM_S_BEND_LEFT_COVERED + 96, // TRACK_ELEM_S_BEND_RIGHT_COVERED + 75, // TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED + 75, // TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED + 150, // TRACK_ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL + 150, // TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL + 150, // TRACK_ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL + 150, // TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL + 248, // TRACK_ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE + 248, // TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE + 248, // TRACK_ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE + 248, // TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE + 64, // TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP + 64, // TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP + 64, // TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN + 64, // TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN + 32, // TRACK_ELEM_BRAKES + 32, // TRACK_ELEM_ROTATION_CONTROL_TOGGLE + 32, // TRACK_ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP + 124, // TRACK_ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP + 124, // TRACK_ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_UP + 124, // TRACK_ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_DOWN + 124, // TRACK_ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_DOWN + 124, // TRACK_ELEM_LEFT_QUARTER_HELIX_LARGE_UP + 124, // TRACK_ELEM_RIGHT_QUARTER_HELIX_LARGE_UP + 124, // TRACK_ELEM_LEFT_QUARTER_HELIX_LARGE_DOWN + 124, // TRACK_ELEM_RIGHT_QUARTER_HELIX_LARGE_DOWN + 33, // TRACK_ELEM_25_DEG_UP_LEFT_BANKED + 33, // TRACK_ELEM_25_DEG_UP_RIGHT_BANKED + 32, // TRACK_ELEM_WATERFALL + 32, // TRACK_ELEM_RAPIDS + 32, // TRACK_ELEM_ON_RIDE_PHOTO + 33, // TRACK_ELEM_25_DEG_DOWN_LEFT_BANKED + 33, // TRACK_ELEM_25_DEG_DOWN_RIGHT_BANKED + 128, // TRACK_ELEM_WATER_SPLASH + 165, // TRACK_ELEM_FLAT_TO_60_DEG_UP_LONG_BASE + 165, // TRACK_ELEM_60_DEG_UP_TO_FLAT_LONG_BASE + 32, // TRACK_ELEM_WHIRLPOOL + 165, // TRACK_ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE + 165, // TRACK_ELEM_60_DEG_UP_TO_FLAT_LONG_BASE_122 + 138, // TRACK_ELEM_CABLE_LIFT_HILL + 32, // TRACK_ELEM_REVERSE_WHOA_BELLY_SLOPE + 32, // TRACK_ELEM_REVERSE_WHOA_BELLY_VERTICAL + 32, // TRACK_ELEM_90_DEG_UP + 32, // TRACK_ELEM_90_DEG_DOWN + 32, // TRACK_ELEM_60_DEG_UP_TO_90_DEG_UP + 32, // TRACK_ELEM_90_DEG_DOWN_TO_60_DEG_DOWN + 32, // TRACK_ELEM_90_DEG_UP_TO_60_DEG_UP + 32, // TRACK_ELEM_60_DEG_DOWN_TO_90_DEG_DOWN + 32, // TRACK_ELEM_BRAKE_FOR_DROP + 87, // TRACK_ELEM_LEFT_EIGHTH_TO_DIAG + 87, // TRACK_ELEM_RIGHT_EIGHTH_TO_DIAG + 87, // TRACK_ELEM_LEFT_EIGHTH_TO_ORTHOGONAL + 87, // TRACK_ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL + 87, // TRACK_ELEM_LEFT_EIGHTH_BANK_TO_DIAG + 87, // TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_DIAG + 87, // TRACK_ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL + 87, // TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL + 45, // TRACK_ELEM_DIAG_FLAT + 45, // TRACK_ELEM_DIAG_25_DEG_UP + 45, // TRACK_ELEM_DIAG_60_DEG_UP + 45, // TRACK_ELEM_DIAG_FLAT_TO_25_DEG_UP + 45, // TRACK_ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP + 45, // TRACK_ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP + 45, // TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT + 45, // TRACK_ELEM_DIAG_25_DEG_DOWN + 45, // TRACK_ELEM_DIAG_60_DEG_DOWN + 45, // TRACK_ELEM_DIAG_FLAT_TO_25_DEG_DOWN + 45, // TRACK_ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN + 45, // TRACK_ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN + 45, // TRACK_ELEM_DIAG_25_DEG_DOWN_TO_FLAT + 45, // TRACK_ELEM_DIAG_FLAT_TO_60_DEG_UP + 45, // TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT + 45, // TRACK_ELEM_DIAG_FLAT_TO_60_DEG_DOWN + 45, // TRACK_ELEM_DIAG_60_DEG_DOWN_TO_FLAT + 45, // TRACK_ELEM_DIAG_FLAT_TO_LEFT_BANK + 45, // TRACK_ELEM_DIAG_FLAT_TO_RIGHT_BANK + 45, // TRACK_ELEM_DIAG_LEFT_BANK_TO_FLAT + 45, // TRACK_ELEM_DIAG_RIGHT_BANK_TO_FLAT + 45, // TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP + 45, // TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP + 45, // TRACK_ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK + 45, // TRACK_ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK + 45, // TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN + 45, // TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN + 45, // TRACK_ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK + 45, // TRACK_ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK + 45, // TRACK_ELEM_DIAG_LEFT_BANK + 45, // TRACK_ELEM_DIAG_RIGHT_BANK + 16, // TRACK_ELEM_LOG_FLUME_REVERSER + 32, // TRACK_ELEM_SPINNING_TUNNEL + 96, // TRACK_ELEM_LEFT_BARREL_ROLL_UP_TO_DOWN + 96, // TRACK_ELEM_RIGHT_BARREL_ROLL_UP_TO_DOWN + 96, // TRACK_ELEM_LEFT_BARREL_ROLL_DOWN_TO_UP + 96, // TRACK_ELEM_RIGHT_BARREL_ROLL_DOWN_TO_UP + 64, // TRACK_ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP + 64, // TRACK_ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP + 64, // TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK + 64, // TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK + 32, // TRACK_ELEM_POWERED_LIFT + 100, // TRACK_ELEM_LEFT_LARGE_HALF_LOOP_UP + 100, // TRACK_ELEM_RIGHT_LARGE_HALF_LOOP_UP + 100, // TRACK_ELEM_RIGHT_LARGE_HALF_LOOP_DOWN + 100, // TRACK_ELEM_LEFT_LARGE_HALF_LOOP_DOWN + 96, // + 96, // + 96, // + 96, // + 64, // + 64, // + 64, // + 64, // + 64, // + 64, // + 16, // + 16, // + 64, // + 64, // + 32, // + 32, // + 32, // + 32, // + 32, // + 80, // + 80, // + 80, // + 64, // + 64, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 80, // + 80, // + 80, // +}; diff --git a/src/ride/track_data.h b/src/ride/track_data.h index 932e01636f..e34d3f23ea 100644 --- a/src/ride/track_data.h +++ b/src/ride/track_data.h @@ -28,3 +28,5 @@ extern const rct_track_coordinates* FlatTrackCoordinates; extern const uint64 RideTypePossibleTrackConfigurations[91]; extern const rct_preview_track *TrackBlocks[256]; extern const rct_preview_track *FlatRideTrackBlocks[255]; + +extern const uint8 TrackPieceLengths[256]; From e96f42dc341a39193369d68b713917119c00fb57 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 12 Jul 2015 16:29:32 +0100 Subject: [PATCH 0265/1173] implement sub_65E277 --- src/ride/ride_ratings.c | 50 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 433028e38c..017f16375b 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -611,15 +611,57 @@ static void set_unreliability_factor(rct_ride *ride) ride->unreliability_factor += (ride->lift_hill_speed - lift_speed_adjustment) * 2; } +static uint32 sub_65E277_helper_1(uint16 x, uint16 max, uint32 multiplier) +{ + return (min(x, max) * multiplier) >> 16; +} + +static uint32 sub_65E277_helper_2(uint16 x, uint16 additionIfNotZero, uint16 max, uint32 multiplier) +{ + uint32 result = x; + if (result != 0) result += additionIfNotZero; + return (max(result, max) * multiplier) >> 16; +} + +static uint32 sub_65E277_helper_3(uint16 x, uint16 resultIfNotZero) +{ + return x == 0 ? 0 : resultIfNotZero; +} + /** * * rct2: 0x0065E277 */ -static int sub_65E277() +static uint32 sub_65E277() { - int eax, ebx, ecx, edx, esi, edi, ebp; - RCT2_CALLFUNC_X(0x0065E277, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - return ebx; + uint32 result = 0; + result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B596, uint16) , 60, 0x00AAAA); + result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B598, uint16) , 22, 0x0245D1); + result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B59A, uint16) , 10, 0x020000); + result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B59C, uint16) , 40, 0x00A000); + result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B59E, uint16) , 70, 0x01B6DB); + result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B5A0, uint16) + 8, 12, 0x064000); + result += sub_65E277_helper_3(RCT2_GLOBAL(0x0138B5A2, uint16) , 40 ); + result += sub_65E277_helper_3(RCT2_GLOBAL(0x0138B5A4, uint16) , 45 ); + result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5A6, uint16) , 10, 20, 0x03C000); + result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5A6, uint16) , 10, 20, 0x044000); + result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5AA, uint16) , 10, 15, 0x035555); + result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B5AC, uint16) , 5, 0x060000); + result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5AE, uint16) , 10, 15, 0x02AAAA); + result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5B0, uint16) , 10, 15, 0x04AAAA); + result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B5B2, uint16) , 5, 0x090000); + result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B5B4, uint16) , 35, 0x016DB6); + result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B5B6, uint16) , 35, 0x00DB6D); + result += sub_65E277_helper_3(RCT2_GLOBAL(0x0138B5B8, uint16) , 55 ); + result += sub_65E277_helper_3(RCT2_GLOBAL(0x0138B5BA, uint16) , 25 ); + result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5BC, uint16) , 4, 6, 0x140000); + result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5BE, uint16) , 4, 6, 0x0F0000); + result += sub_65E277_helper_3(RCT2_GLOBAL(0x0138B5C0, uint16) , 100 ); + result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5C2, uint16) , 4, 6, 0x0A0000); + result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5C4, uint16) , 10, 20, 0x01C000); + result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5C6, uint16) , 10, 20, 0x024000); + result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5C8, uint16) , 10, 20, 0x028000); + return result; } /** From a29ee4e1f07640b887a6e301c4d3e04bf0b50117 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 12 Jul 2015 17:48:52 +0100 Subject: [PATCH 0266/1173] implement ride_ratings_score_close_proximity --- src/ride/ride_ratings.c | 330 +++++++++++++++++++++++++++++----------- 1 file changed, 239 insertions(+), 91 deletions(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 017f16375b..b2f79e0f41 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -24,6 +24,7 @@ #include "ride.h" #include "ride_data.h" #include "ride_ratings.h" +#include "track.h" enum { RIDE_RATINGS_STATE_FIND_NEXT_RIDE, @@ -50,7 +51,7 @@ static void ride_ratings_update_state_5(); static void loc_6B5BB2(); static void ride_ratings_calculate(rct_ride *ride); static void ride_ratings_calculate_value(rct_ride *ride); -static void sub_6B5F9D(rct_map_element *mapElement); +static void ride_ratings_score_close_proximity(rct_map_element *mapElement); static void ride_ratings_check_valid_configuration(int rideIndex); /** @@ -223,7 +224,7 @@ static void ride_ratings_update_state_2() RCT2_GLOBAL(0x0138B5CE, uint16) |= 1; } - sub_6B5F9D(mapElement); + ride_ratings_score_close_proximity(mapElement); trackElement.x = RCT2_GLOBAL(0x0138B584, uint16); trackElement.y = RCT2_GLOBAL(0x0138B586, uint16); @@ -314,7 +315,7 @@ static void ride_ratings_update_state_5() continue; if (trackType == 255 || trackType == mapElement->properties.track.type) { - sub_6B5F9D(mapElement); + ride_ratings_score_close_proximity(mapElement); x = RCT2_GLOBAL(0x0138B584, uint16); y = RCT2_GLOBAL(0x0138B586, uint16); @@ -339,13 +340,160 @@ static void ride_ratings_update_state_5() _rideRatingsState = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; } +/** + * + * rct2: 0x006B6207 + */ +static void sub_6B6207(rct_map_element *inputMapElement, int direction) +{ + RCT2_CALLPROC_X(0x006B6207, 0, direction, 0, 0, (int)inputMapElement, 0, 0); +} + +/** + * + * rct2: 0x006B62DA + */ +static void loc_6B62DA(rct_map_element *inputMapElement) +{ + RCT2_CALLPROC_X(0x006B6207, 0, 0, 0, 0, (int)inputMapElement, 0, 0); +} + /** * * rct2: 0x006B5F9D */ -static void sub_6B5F9D(rct_map_element *mapElement) +static void ride_ratings_score_close_proximity(rct_map_element *inputMapElement) { - RCT2_CALLPROC_X(0x006B5F9D, 0, 0, 0, 0, (int)mapElement, 0, 0); + rct_map_element *mapElement; + int x, y, z, direction, waterHeight, trackType, sequence; + bool isStation; + + if (RCT2_GLOBAL(0x0138B5CE, uint16) & 1) + return; + + RCT2_GLOBAL(0x00138B594, uint16)++; + x = RCT2_GLOBAL(0x00138B584, uint16); + y = RCT2_GLOBAL(0x00138B586, uint16); + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + switch (map_element_get_type(mapElement)) { + case MAP_ELEMENT_TYPE_SURFACE: + RCT2_GLOBAL(0x0138B593, uint8) = mapElement->base_height; + if (mapElement->base_height * 8 != RCT2_GLOBAL(0x0138B588, uint16)) { + RCT2_GLOBAL(0x0138B59E, uint16)++; + } + waterHeight = (mapElement->properties.surface.terrain & 0x1F); + if (waterHeight != 0) { + z = waterHeight * 16; + if (z <= RCT2_GLOBAL(0x0138B588, uint16)) { + RCT2_GLOBAL(0x0138B596, uint16)++; + if (z == RCT2_GLOBAL(0x0138B588, uint16)) { + RCT2_GLOBAL(0x0138B598, uint16)++; + } + z += 16; + if (z == RCT2_GLOBAL(0x0138B588, uint16)) { + RCT2_GLOBAL(0x0138B59A, uint16)++; + } + z += 112; + if (z <= RCT2_GLOBAL(0x0138B588, uint16)) { + RCT2_GLOBAL(0x0138B59C, uint16)++; + } + } + } + break; + case MAP_ELEMENT_TYPE_PATH: + if (inputMapElement->properties.path.type & 0xF0) { + if (mapElement->clearance_height == inputMapElement->base_height) { + RCT2_GLOBAL(0x0138B5A6, uint16)++; + } + if (mapElement->base_height == inputMapElement->clearance_height) { + RCT2_GLOBAL(0x0138B5A8, uint16)++; + } + } else { + if (mapElement->clearance_height <= inputMapElement->base_height) { + RCT2_GLOBAL(0x0138B5A0, uint16)++; + } + if (mapElement->clearance_height == inputMapElement->base_height) { + RCT2_GLOBAL(0x0138B5A2, uint16)++; + } + if (mapElement->base_height == inputMapElement->clearance_height) { + RCT2_GLOBAL(0x0138B5A4, uint16)++; + } + } + break; + case MAP_ELEMENT_TYPE_TRACK: + trackType = mapElement->properties.track.type; + if (trackType == TRACK_ELEM_LEFT_VERTICAL_LOOP || trackType == TRACK_ELEM_RIGHT_VERTICAL_LOOP) { + sequence = mapElement->properties.track.sequence & 0x0F; + if (sequence == 3 || sequence == 6) { + if (mapElement->base_height - inputMapElement->clearance_height <= 10) { + RCT2_GLOBAL(0x0138B5C2, uint16)++; + } + } + } + if (inputMapElement->properties.track.ride_index == mapElement->properties.track.ride_index) { + RCT2_GLOBAL(0x0138B5AE, uint16)++; + if (mapElement->clearance_height == inputMapElement->base_height) { + RCT2_GLOBAL(0x0138B5B0, uint16)++; + } + if (mapElement->clearance_height + 2 <= inputMapElement->base_height) { + if (mapElement->clearance_height + 10 >= inputMapElement->base_height) { + RCT2_GLOBAL(0x0138B5B2, uint16)++; + } + } + if (inputMapElement->clearance_height == mapElement->base_height) { + RCT2_GLOBAL(0x0138B5B0, uint16)++; + } + if (inputMapElement->clearance_height + 2 == mapElement->base_height) { + if (inputMapElement->clearance_height + 10 >= mapElement->base_height) { + RCT2_GLOBAL(0x0138B5B2, uint16)++; + } + } + } else { + trackType = mapElement->properties.track.type; + isStation = ( + trackType == TRACK_ELEM_END_STATION || + trackType == TRACK_ELEM_MIDDLE_STATION || + trackType == TRACK_ELEM_BEGIN_STATION + ); + if (mapElement->clearance_height == inputMapElement->base_height) { + RCT2_GLOBAL(0x0138B5AA, uint16)++; + if (isStation) { + RCT2_GLOBAL(0x0138B5B8, uint16)++; + } + } + if (mapElement->clearance_height + 2 <= inputMapElement->base_height) { + if (mapElement->clearance_height + 10 >= inputMapElement->base_height) { + RCT2_GLOBAL(0x0138B5AC, uint16)++; + if (isStation) { + RCT2_GLOBAL(0x0138B5BA, uint16)++; + } + } + } + + if (inputMapElement->clearance_height == mapElement->base_height) { + RCT2_GLOBAL(0x0138B5AA, uint16)++; + if (isStation) { + RCT2_GLOBAL(0x0138B5B8, uint16)++; + } + } + if (inputMapElement->clearance_height + 2 <= mapElement->base_height) { + if (inputMapElement->clearance_height + 10 >= mapElement->base_height) { + RCT2_GLOBAL(0x0138B5AC, uint16)++; + if (isStation) { + RCT2_GLOBAL(0x0138B5BA, uint16)++; + } + } + } + } + break; + } + } while (!map_element_is_last_for_tile(mapElement++)); + + direction = inputMapElement->type & MAP_ELEMENT_DIRECTION_MASK; + sub_6B6207(inputMapElement, (direction + 1) & 3); + sub_6B6207(inputMapElement, (direction - 1) & 3); + loc_6B62DA(inputMapElement); } /** @@ -611,19 +759,19 @@ static void set_unreliability_factor(rct_ride *ride) ride->unreliability_factor += (ride->lift_hill_speed - lift_speed_adjustment) * 2; } -static uint32 sub_65E277_helper_1(uint16 x, uint16 max, uint32 multiplier) +static uint32 ride_ratings_get_proximity_score_helper_1(uint16 x, uint16 max, uint32 multiplier) { return (min(x, max) * multiplier) >> 16; } -static uint32 sub_65E277_helper_2(uint16 x, uint16 additionIfNotZero, uint16 max, uint32 multiplier) +static uint32 ride_ratings_get_proximity_score_helper_2(uint16 x, uint16 additionIfNotZero, uint16 max, uint32 multiplier) { uint32 result = x; if (result != 0) result += additionIfNotZero; return (max(result, max) * multiplier) >> 16; } -static uint32 sub_65E277_helper_3(uint16 x, uint16 resultIfNotZero) +static uint32 ride_ratings_get_proximity_score_helper_3(uint16 x, uint16 resultIfNotZero) { return x == 0 ? 0 : resultIfNotZero; } @@ -632,35 +780,35 @@ static uint32 sub_65E277_helper_3(uint16 x, uint16 resultIfNotZero) * * rct2: 0x0065E277 */ -static uint32 sub_65E277() +static uint32 ride_ratings_get_proximity_score() { uint32 result = 0; - result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B596, uint16) , 60, 0x00AAAA); - result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B598, uint16) , 22, 0x0245D1); - result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B59A, uint16) , 10, 0x020000); - result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B59C, uint16) , 40, 0x00A000); - result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B59E, uint16) , 70, 0x01B6DB); - result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B5A0, uint16) + 8, 12, 0x064000); - result += sub_65E277_helper_3(RCT2_GLOBAL(0x0138B5A2, uint16) , 40 ); - result += sub_65E277_helper_3(RCT2_GLOBAL(0x0138B5A4, uint16) , 45 ); - result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5A6, uint16) , 10, 20, 0x03C000); - result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5A6, uint16) , 10, 20, 0x044000); - result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5AA, uint16) , 10, 15, 0x035555); - result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B5AC, uint16) , 5, 0x060000); - result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5AE, uint16) , 10, 15, 0x02AAAA); - result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5B0, uint16) , 10, 15, 0x04AAAA); - result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B5B2, uint16) , 5, 0x090000); - result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B5B4, uint16) , 35, 0x016DB6); - result += sub_65E277_helper_1(RCT2_GLOBAL(0x0138B5B6, uint16) , 35, 0x00DB6D); - result += sub_65E277_helper_3(RCT2_GLOBAL(0x0138B5B8, uint16) , 55 ); - result += sub_65E277_helper_3(RCT2_GLOBAL(0x0138B5BA, uint16) , 25 ); - result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5BC, uint16) , 4, 6, 0x140000); - result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5BE, uint16) , 4, 6, 0x0F0000); - result += sub_65E277_helper_3(RCT2_GLOBAL(0x0138B5C0, uint16) , 100 ); - result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5C2, uint16) , 4, 6, 0x0A0000); - result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5C4, uint16) , 10, 20, 0x01C000); - result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5C6, uint16) , 10, 20, 0x024000); - result += sub_65E277_helper_2(RCT2_GLOBAL(0x0138B5C8, uint16) , 10, 20, 0x028000); + result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B596, uint16) , 60, 0x00AAAA); + result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B598, uint16) , 22, 0x0245D1); + result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B59A, uint16) , 10, 0x020000); + result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B59C, uint16) , 40, 0x00A000); + result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B59E, uint16) , 70, 0x01B6DB); + result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B5A0, uint16) + 8, 12, 0x064000); + result += ride_ratings_get_proximity_score_helper_3(RCT2_GLOBAL(0x0138B5A2, uint16) , 40 ); + result += ride_ratings_get_proximity_score_helper_3(RCT2_GLOBAL(0x0138B5A4, uint16) , 45 ); + result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5A6, uint16) , 10, 20, 0x03C000); + result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5A6, uint16) , 10, 20, 0x044000); + result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5AA, uint16) , 10, 15, 0x035555); + result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B5AC, uint16) , 5, 0x060000); + result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5AE, uint16) , 10, 15, 0x02AAAA); + result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5B0, uint16) , 10, 15, 0x04AAAA); + result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B5B2, uint16) , 5, 0x090000); + result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B5B4, uint16) , 35, 0x016DB6); + result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B5B6, uint16) , 35, 0x00DB6D); + result += ride_ratings_get_proximity_score_helper_3(RCT2_GLOBAL(0x0138B5B8, uint16) , 55 ); + result += ride_ratings_get_proximity_score_helper_3(RCT2_GLOBAL(0x0138B5BA, uint16) , 25 ); + result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5BC, uint16) , 4, 6, 0x140000); + result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5BE, uint16) , 4, 6, 0x0F0000); + result += ride_ratings_get_proximity_score_helper_3(RCT2_GLOBAL(0x0138B5C0, uint16) , 100 ); + result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5C2, uint16) , 4, 6, 0x0A0000); + result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5C4, uint16) , 10, 20, 0x01C000); + result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5C6, uint16) , 10, 20, 0x024000); + result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5C8, uint16) , 10, 20, 0x028000); return result; } @@ -1102,9 +1250,9 @@ static void ride_ratings_apply_operation_option(rating_tuple *ratings, rct_ride ratings->nausea += (ride->operation_option * nauseaMultiplier) >> 16; } -static void ride_ratings_apply_65E277(rating_tuple *ratings, rct_ride *ride, int excitementMultiplier) +static void ride_ratings_apply_proximity(rating_tuple *ratings, rct_ride *ride, int excitementMultiplier) { - ratings->excitement += (sub_65E277() * excitementMultiplier) >> 16; + ratings->excitement += (ride_ratings_get_proximity_score() * excitementMultiplier) >> 16; } static void ride_ratings_apply_scenery(rating_tuple *ratings, rct_ride *ride, int excitementMultiplier) @@ -1191,7 +1339,7 @@ static void ride_ratings_calculate_spiral_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 28235, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 43690, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if ((ride->inversions & 0x1F) == 0) @@ -1237,7 +1385,7 @@ static void ride_ratings_calculate_stand_up_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 34952, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 12850, 28398, 30427); - ride_ratings_apply_65E277(&ratings, ride, 17893); + ride_ratings_apply_proximity(&ratings, ride, 17893); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -1276,7 +1424,7 @@ static void ride_ratings_calculate_suspended_swinging_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 48036); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 6971); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xC0000, 2, 2, 2); @@ -1317,7 +1465,7 @@ static void ride_ratings_calculate_inverted_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 29552, 57186); ride_ratings_apply_drops(&ratings, ride, 29127, 39009, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 15291, 35108); - ride_ratings_apply_65E277(&ratings, ride, 15657); + ride_ratings_apply_proximity(&ratings, ride, 15657); ride_ratings_apply_scenery(&ratings, ride, 8366); if ((ride->inversions & 0x1F) == 0) @@ -1361,7 +1509,7 @@ static void ride_ratings_calculate_junior_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 25700, 30583, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -1396,7 +1544,7 @@ static void ride_ratings_calculate_miniature_railway(rct_ride *ride) ride_ratings_apply_average_speed(&ratings, ride, 291271, 436906); ride_ratings_apply_duration(&ratings, ride, 150, 26214); ride_ratings_apply_65E1C2(&ratings, ride, 4294960871, 6553, 23405); - ride_ratings_apply_65E277(&ratings, ride, 8946); + ride_ratings_apply_proximity(&ratings, ride, 8946); ride_ratings_apply_scenery(&ratings, ride, 20915); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xC80000, 2, 2, 2); @@ -1433,7 +1581,7 @@ static void ride_ratings_calculate_monorail(rct_ride *ride) ride_ratings_apply_average_speed(&ratings, ride, 291271, 218453); ride_ratings_apply_duration(&ratings, ride, 150, 21845); ride_ratings_apply_65E1C2(&ratings, ride, 5140, 6553, 18724); - ride_ratings_apply_65E277(&ratings, ride, 8946); + ride_ratings_apply_proximity(&ratings, ride, 8946); ride_ratings_apply_scenery(&ratings, ride, 16732); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xAA0000, 2, 2, 2); @@ -1474,7 +1622,7 @@ static void ride_ratings_calculate_mini_suspended_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 34179, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 58254, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 19275, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 13943); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x80000, 2, 2, 2); @@ -1510,7 +1658,7 @@ static void ride_ratings_calculate_boat_ride(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) ratings.excitement += RIDE_RATING(0,20); - ride_ratings_apply_65E277(&ratings, ride, 11183); + ride_ratings_apply_proximity(&ratings, ride, 11183); ride_ratings_apply_scenery(&ratings, ride, 22310); ride_ratings_apply_intensity_penalty(&ratings); @@ -1546,7 +1694,7 @@ static void ride_ratings_calculate_wooden_wild_mouse(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 29721, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_65E277(&ratings, ride, 17893); + ride_ratings_apply_proximity(&ratings, ride, 17893); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -1588,7 +1736,7 @@ static void ride_ratings_calculate_steeplechase(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 25700, 30583, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 4, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x80000, 2, 2, 2); @@ -1628,7 +1776,7 @@ static void ride_ratings_calculate_car_ride(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 14860, 0, 11437); ride_ratings_apply_drops(&ratings, ride, 8738, 0, 0); ride_ratings_apply_65E1C2(&ratings, ride, 12850, 6553, 4681); - ride_ratings_apply_65E277(&ratings, ride, 11183); + ride_ratings_apply_proximity(&ratings, ride, 11183); ride_ratings_apply_scenery(&ratings, ride, 8366); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xC80000, 8, 2, 2); @@ -1664,7 +1812,7 @@ static void ride_ratings_calculate_launched_freefall(rct_ride *ride) ratings.excitement += ((ride_get_total_length(ride) >> 16) * 32768) >> 16; ride_ratings_apply_operation_option(&ratings, ride, 0, 1355917, 451972); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 25098); ride_ratings_apply_intensity_penalty(&ratings); @@ -1700,7 +1848,7 @@ static void ride_ratings_calculate_bobsleigh_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xC0000, 2, 2, 2); ride_ratings_apply_max_lateral_g_penalty(&ratings, ride, FIXED_2DP(1,20), 2, 2, 2); @@ -1731,7 +1879,7 @@ static void ride_ratings_calculate_observation_tower(rct_ride *ride) ride_ratings_set(&ratings, RIDE_RATING(1,50), RIDE_RATING(0,00), RIDE_RATING(0,10)); ratings.excitement += ((ride_get_total_length(ride) >> 16) * 45875) >> 16; ratings.nausea += ((ride_get_total_length(ride) >> 16) * 26214) >> 16; - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 83662); ride_ratings_apply_intensity_penalty(&ratings); @@ -1771,7 +1919,7 @@ static void ride_ratings_calculate_looping_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if ((ride->inversions & 0x1F) == 0) @@ -1817,7 +1965,7 @@ static void ride_ratings_calculate_dinghy_slide(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 11183); + ride_ratings_apply_proximity(&ratings, ride, 11183); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -1856,7 +2004,7 @@ static void ride_ratings_calculate_mine_train_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 29721, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 19275, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 21472); + ride_ratings_apply_proximity(&ratings, ride, 21472); ride_ratings_apply_scenery(&ratings, ride, 16732); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -1894,7 +2042,7 @@ static void ride_ratings_calculate_chairlift(rct_ride *ride) ride_ratings_apply_duration(&ratings, ride, 150, 26214); ride_ratings_apply_65DDD1(&ratings, ride, 7430, 3476, 4574); ride_ratings_apply_65E1C2(&ratings, ride, 4294948021, 21845, 23405); - ride_ratings_apply_65E277(&ratings, ride, 11183); + ride_ratings_apply_proximity(&ratings, ride, 11183); ride_ratings_apply_scenery(&ratings, ride, 25098); ride_ratings_apply_first_length_penalty(&ratings, ride, 0x960000, 2, 2, 2); @@ -1940,7 +2088,7 @@ static void ride_ratings_calculate_corkscrew_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if ((ride->inversions & 0x1F) == 0) @@ -2051,7 +2199,7 @@ static void ride_ratings_calculate_go_karts(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 4458, 3476, 5718); ride_ratings_apply_drops(&ratings, ride, 8738, 5461, 6553); ride_ratings_apply_65E1C2(&ratings, ride, 2570, 8738, 2340); - ride_ratings_apply_65E277(&ratings, ride, 11183); + ride_ratings_apply_proximity(&ratings, ride, 11183); ride_ratings_apply_scenery(&ratings, ride, 16732); ride_ratings_apply_intensity_penalty(&ratings); @@ -2089,7 +2237,7 @@ static void ride_ratings_calculate_log_flume(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 22291, 20860, 4574); ride_ratings_apply_drops(&ratings, ride, 69905, 62415, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_65E277(&ratings, ride, 22367); + ride_ratings_apply_proximity(&ratings, ride, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 2, 2, 2, 2); @@ -2123,7 +2271,7 @@ static void ride_ratings_calculate_river_rapids(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 29721, 22598, 5718); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_65E277(&ratings, ride, 31314); + ride_ratings_apply_proximity(&ratings, ride, 31314); ride_ratings_apply_scenery(&ratings, ride, 13943); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 2, 2, 2, 2); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xC80000, 2, 2, 2); @@ -2478,7 +2626,7 @@ static void ride_ratings_calculate_reverse_freefall_coaster(rct_ride *ride) ride_ratings_apply_max_speed(&ratings, ride, 436906, 436906, 320398); ride_ratings_apply_gforces(&ratings, ride, 24576, 41704, 59578); ride_ratings_apply_65E1C2(&ratings, ride, 12850, 28398, 11702); - ride_ratings_apply_65E277(&ratings, ride, 17893); + ride_ratings_apply_proximity(&ratings, ride, 17893); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 34, 2, 2, 2); @@ -2511,7 +2659,7 @@ static void ride_ratings_calculate_lift(rct_ride *ride) ratings.excitement += (totalLength * 45875) >> 16; ratings.nausea += (totalLength * 26214) >> 16; - ride_ratings_apply_65E277(&ratings, ride, 11183); + ride_ratings_apply_proximity(&ratings, ride, 11183); ride_ratings_apply_scenery(&ratings, ride, 83662); ride_ratings_apply_intensity_penalty(&ratings); @@ -2549,7 +2697,7 @@ static void ride_ratings_calculate_vertical_drop_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 58254, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 20, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -2649,7 +2797,7 @@ static void ride_ratings_calculate_flying_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if ((ride->inversions & 0x1F) == 0) @@ -2695,7 +2843,7 @@ static void ride_ratings_calculate_virginia_reel(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 52012, 26075, 45749); ride_ratings_apply_drops(&ratings, ride, 43690, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_65E277(&ratings, ride, 22367); + ride_ratings_apply_proximity(&ratings, ride, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xD20000, 2, 2, 2); ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); @@ -2730,7 +2878,7 @@ static void ride_ratings_calculate_splash_boats(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 22291, 20860, 4574); ride_ratings_apply_drops(&ratings, ride, 87381, 93622, 62259); ride_ratings_apply_65E1C2(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_65E277(&ratings, ride, 22367); + ride_ratings_apply_proximity(&ratings, ride, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); @@ -2766,7 +2914,7 @@ static void ride_ratings_calculate_mini_helicopters(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 14860, 0, 4574); ride_ratings_apply_drops(&ratings, ride, 8738, 0, 0); ride_ratings_apply_65E1C2(&ratings, ride, 12850, 6553, 4681); - ride_ratings_apply_65E277(&ratings, ride, 8946); + ride_ratings_apply_proximity(&ratings, ride, 8946); ride_ratings_apply_scenery(&ratings, ride, 8366); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xA00000, 2, 2, 2); @@ -2803,7 +2951,7 @@ static void ride_ratings_calculate_lay_down_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if ((ride->inversions & 0x1F) == 0) { @@ -2848,7 +2996,7 @@ static void ride_ratings_calculate_suspended_monorail(rct_ride *ride) ride_ratings_apply_average_speed(&ratings, ride, 291271, 218453); ride_ratings_apply_duration(&ratings, ride, 150, 21845); ride_ratings_apply_65E1C2(&ratings, ride, 5140, 6553, 18724); - ride_ratings_apply_65E277(&ratings, ride, 12525); + ride_ratings_apply_proximity(&ratings, ride, 12525); ride_ratings_apply_scenery(&ratings, ride, 25098); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xAA0000, 2, 2, 2); @@ -2895,7 +3043,7 @@ static void ride_ratings_calculate_reverser_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_65E277(&ratings, ride, 22367); + ride_ratings_apply_proximity(&ratings, ride, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); if (RCT2_GLOBAL(0x0138B5CC, uint16) < 1) @@ -2937,7 +3085,7 @@ static void ride_ratings_calculate_heartline_twister_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 52150, 57186); ride_ratings_apply_drops(&ratings, ride, 29127, 53052, 55705); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 34952, 35108); - ride_ratings_apply_65E277(&ratings, ride, 9841); + ride_ratings_apply_proximity(&ratings, ride, 9841); ride_ratings_apply_scenery(&ratings, ride, 3904); if ((ride->inversions & 0x1F) == 0) @@ -2971,7 +3119,7 @@ static void ride_ratings_calculate_mini_golf(rct_ride *ride) ride_ratings_apply_length(&ratings, ride, 6000, 873); ride_ratings_apply_65DDD1(&ratings, ride, 14860, 0, 0); ride_ratings_apply_65E1C2(&ratings, ride, 5140, 6553, 4681); - ride_ratings_apply_65E277(&ratings, ride, 15657); + ride_ratings_apply_proximity(&ratings, ride, 15657); ride_ratings_apply_scenery(&ratings, ride, 27887); // Apply golf holes factor @@ -3046,7 +3194,7 @@ static void ride_ratings_calculate_ghost_train(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 14860, 0, 11437); ride_ratings_apply_drops(&ratings, ride, 8738, 0, 0); ride_ratings_apply_65E1C2(&ratings, ride, 25700, 6553, 4681); - ride_ratings_apply_65E277(&ratings, ride, 11183); + ride_ratings_apply_proximity(&ratings, ride, 11183); ride_ratings_apply_scenery(&ratings, ride, 8366); ride_ratings_apply_first_length_penalty(&ratings, ride, 0xB40000, 2, 2, 2); @@ -3083,7 +3231,7 @@ static void ride_ratings_calculate_twister_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if ((ride->inversions & 0x1F) == 0) @@ -3129,7 +3277,7 @@ static void ride_ratings_calculate_wooden_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_65E277(&ratings, ride, 22367); + ride_ratings_apply_proximity(&ratings, ride, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -3170,7 +3318,7 @@ static void ride_ratings_calculate_side_friction_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_65E277(&ratings, ride, 22367); + ride_ratings_apply_proximity(&ratings, ride, 22367); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x50000, 2, 2, 2); @@ -3210,7 +3358,7 @@ static void ride_ratings_calculate_wild_mouse(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 29721, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_65E277(&ratings, ride, 17893); + ride_ratings_apply_proximity(&ratings, ride, 17893); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -3251,7 +3399,7 @@ static void ride_ratings_calculate_multi_dimension_roller_coaster(rct_ride *ride ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if ((ride->inversions & 0x1F) == 0) @@ -3297,7 +3445,7 @@ static void ride_ratings_calculate_giga_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 28235, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 43690, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if ((ride->inversions & 0x1F) == 0) @@ -3339,7 +3487,7 @@ static void ride_ratings_calculate_roto_drop(rct_ride *ride) ratings.intensity += lengthFactor * 2; ratings.nausea += lengthFactor * 2; - ride_ratings_apply_65E277(&ratings, ride, 11183); + ride_ratings_apply_proximity(&ratings, ride, 11183); ride_ratings_apply_scenery(&ratings, ride, 25098); ride_ratings_apply_intensity_penalty(&ratings); @@ -3435,7 +3583,7 @@ static void ride_ratings_calculate_monorail_cycles(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 14860, 0, 4574); ride_ratings_apply_drops(&ratings, ride, 8738, 0, 0); ride_ratings_apply_65E1C2(&ratings, ride, 5140, 6553, 2340); - ride_ratings_apply_65E277(&ratings, ride, 8946); + ride_ratings_apply_proximity(&ratings, ride, 8946); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_first_length_penalty(&ratings, ride, 0x8C0000, 2, 2, 2); @@ -3472,7 +3620,7 @@ static void ride_ratings_calculate_compact_inverted_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 29552, 57186); ride_ratings_apply_drops(&ratings, ride, 29127, 39009, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 15291, 35108); - ride_ratings_apply_65E277(&ratings, ride, 15657); + ride_ratings_apply_proximity(&ratings, ride, 15657); ride_ratings_apply_scenery(&ratings, ride, 8366); if ((ride->inversions & 0x1F) == 0) @@ -3516,7 +3664,7 @@ static void ride_ratings_calculate_water_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 25700, 30583, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -3553,7 +3701,7 @@ static void ride_ratings_calculate_air_powered_vertical_coaster(rct_ride *ride) ride_ratings_apply_max_speed(&ratings, ride, 509724, 364088, 320398); ride_ratings_apply_gforces(&ratings, ride, 24576, 35746, 59578); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 21845, 11702); - ride_ratings_apply_65E277(&ratings, ride, 17893); + ride_ratings_apply_proximity(&ratings, ride, 17893); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 34, 2, 1, 1); @@ -3590,7 +3738,7 @@ static void ride_ratings_calculate_inverted_hairpin_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 29721, 43458, 45749); ride_ratings_apply_drops(&ratings, ride, 40777, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 16705, 30583, 35108); - ride_ratings_apply_65E277(&ratings, ride, 17893); + ride_ratings_apply_proximity(&ratings, ride, 17893); ride_ratings_apply_scenery(&ratings, ride, 5577); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -3651,7 +3799,7 @@ static void ride_ratings_calculate_submarine_ride(rct_ride *ride) ride_ratings_set(&ratings, RIDE_RATING(2,20), RIDE_RATING(1,80), RIDE_RATING(1,40)); ride_ratings_apply_length(&ratings, ride, 6000, 764); - ride_ratings_apply_65E277(&ratings, ride, 11183); + ride_ratings_apply_proximity(&ratings, ride, 11183); ride_ratings_apply_scenery(&ratings, ride, 22310); ride_ratings_apply_intensity_penalty(&ratings); @@ -3683,7 +3831,7 @@ static void ride_ratings_calculate_river_rafts(rct_ride *ride) ride_ratings_apply_duration(&ratings, ride, 500, 13107); ride_ratings_apply_65DDD1(&ratings, ride, 22291, 20860, 4574); ride_ratings_apply_drops(&ratings, ride, 78643, 93622, 62259); - ride_ratings_apply_65E277(&ratings, ride, 13420); + ride_ratings_apply_proximity(&ratings, ride, 13420); ride_ratings_apply_scenery(&ratings, ride, 11155); ride_ratings_apply_intensity_penalty(&ratings); @@ -3751,7 +3899,7 @@ static void ride_ratings_calculate_inverted_impulse_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 29552, 57186); ride_ratings_apply_drops(&ratings, ride, 29127, 39009, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 15291, 35108); - ride_ratings_apply_65E277(&ratings, ride, 15657); + ride_ratings_apply_proximity(&ratings, ride, 15657); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 20, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); @@ -3789,7 +3937,7 @@ static void ride_ratings_calculate_mini_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 25700, 30583, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 9760); ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); @@ -3829,7 +3977,7 @@ static void ride_ratings_calculate_mine_ride(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 29721, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 19275, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 21472); + ride_ratings_apply_proximity(&ratings, ride, 21472); ride_ratings_apply_scenery(&ratings, ride, 16732); ride_ratings_apply_first_length_penalty(&ratings, ride, 0x10E0000, 2, 2, 2); @@ -3866,7 +4014,7 @@ static void ride_ratings_calculate_lim_launched_roller_coaster(rct_ride *ride) ride_ratings_apply_65DDD1(&ratings, ride, 26749, 34767, 45749); ride_ratings_apply_drops(&ratings, ride, 29127, 46811, 49152); ride_ratings_apply_65E1C2(&ratings, ride, 15420, 32768, 35108); - ride_ratings_apply_65E277(&ratings, ride, 20130); + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); if ((ride->inversions & 0x1F) == 0) From d7a5dedea43c6c507d341901a2dca6c5320c389c Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 12 Jul 2015 21:18:40 +0100 Subject: [PATCH 0267/1173] refactor ride ratings proximity --- src/ride/ride_ratings.c | 245 +++++++++++++++++++++------------------- 1 file changed, 131 insertions(+), 114 deletions(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index b2f79e0f41..0af1b4a735 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -35,10 +35,47 @@ enum { RIDE_RATINGS_STATE_5 }; +enum { + PROXIMITY_WATER_OVER, // 0x0138B596 + PROXIMITY_WATER_TOUCH, // 0x0138B598 + PROXIMITY_WATER_LOW, // 0x0138B59A + PROXIMITY_WATER_HIGH, // 0x0138B59C + PROXIMITY_SURFACE_TOUCH, // 0x0138B59E + PROXIMITY_PATH_OVER, // 0x0138B5A0 + PROXIMITY_PATH_TOUCH_ABOVE, // 0x0138B5A2 + PROXIMITY_PATH_TOUCH_UNDER, // 0x0138B5A4 + PROXIMITY_138B5A6, // 0x0138B5A6 + PROXIMITY_138B5A8, // 0x0138B5A8 + PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE, // 0x0138B5AA + PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE, // 0x0138B5AC + PROXIMITY_OWN_TRACK_ABOVE_OR_BELOW, // 0x0138B5AE + PROXIMITY_OWN_TRACK_TOUCH_ABOVE, // 0x0138B5B0 + PROXIMITY_OWN_TRACK_CLOSE_ABOVE, // 0x0138B5B2 + PROXIMITY_138B5B4, // 0x0138B5B4 + PROXIMITY_138B5B6, // 0x0138B5B6 + PROXIMITY_FOREIGN_STATION_TOUCH_ABOVE, // 0x0138B5B8 + PROXIMITY_FOREIGN_STATION_CLOSE_ABOVE, // 0x0138B5BA + PROXIMITY_138B5BC, // 0x0138B5BC + PROXIMITY_138B5BE, // 0x0138B5BE + PROXIMITY_138B5C0, // 0x0138B5C0 + PROXIMITY_THROUGH_VERTICAL_LOOP, // 0x0138B5C2 + PROXIMITY_138B5C4, // 0x0138B5C4 + PROXIMITY_138B5C6, // 0x0138B5C6 + PROXIMITY_138B5C8, // 0x0138B5C8 + PROXIMITY_COUNT +}; + typedef void (*ride_ratings_calculation)(rct_ride *ride); -#define _rideRatingsState RCT2_GLOBAL(0x0138B591, uint8) +#define _rideRatingsProximityX RCT2_GLOBAL(0x0138B584, uint16) +#define _rideRatingsProximityY RCT2_GLOBAL(0x0138B586, uint16) +#define _rideRatingsProximityZ RCT2_GLOBAL(0x0138B588, uint16) #define _rideRatingsCurrentRide RCT2_GLOBAL(0x0138B590, uint8) +#define _rideRatingsState RCT2_GLOBAL(0x0138B591, uint8) +#define _rideRatingsProximityTrackType RCT2_GLOBAL(0x0138B592, uint8) +#define _rideRatingsProximityTotal RCT2_GLOBAL(0x0138B594, uint16) + +static uint16 *_proximityScores = (uint16*)0x0138B596; static const ride_ratings_calculation ride_ratings_calculate_func_table[91]; @@ -108,33 +145,10 @@ static void ride_ratings_update_state_0() */ static void ride_ratings_update_state_1() { - RCT2_GLOBAL(0x0138B594, uint16) = 0; - RCT2_GLOBAL(0x0138B596, uint16) = 0; - RCT2_GLOBAL(0x0138B598, uint16) = 0; - RCT2_GLOBAL(0x0138B59A, uint16) = 0; - RCT2_GLOBAL(0x0138B59C, uint16) = 0; - RCT2_GLOBAL(0x0138B59E, uint16) = 0; - RCT2_GLOBAL(0x0138B5A0, uint16) = 0; - RCT2_GLOBAL(0x0138B5A2, uint16) = 0; - RCT2_GLOBAL(0x0138B5A4, uint16) = 0; - RCT2_GLOBAL(0x0138B5A6, uint16) = 0; - RCT2_GLOBAL(0x0138B5A8, uint16) = 0; - RCT2_GLOBAL(0x0138B5AA, uint16) = 0; - RCT2_GLOBAL(0x0138B5AC, uint16) = 0; - RCT2_GLOBAL(0x0138B5AE, uint16) = 0; - RCT2_GLOBAL(0x0138B5B0, uint16) = 0; - RCT2_GLOBAL(0x0138B5B2, uint16) = 0; - RCT2_GLOBAL(0x0138B5B4, uint16) = 0; - RCT2_GLOBAL(0x0138B5B6, uint16) = 0; - RCT2_GLOBAL(0x0138B5B8, uint16) = 0; - RCT2_GLOBAL(0x0138B5BA, uint16) = 0; - RCT2_GLOBAL(0x0138B5BC, uint16) = 0; - RCT2_GLOBAL(0x0138B5BE, uint16) = 0; - RCT2_GLOBAL(0x0138B5C0, uint16) = 0; - RCT2_GLOBAL(0x0138B5C2, uint16) = 0; - RCT2_GLOBAL(0x0138B5C4, uint16) = 0; - RCT2_GLOBAL(0x0138B5C6, uint16) = 0; - RCT2_GLOBAL(0x0138B5C8, uint16) = 0; + _rideRatingsProximityTotal = 0; + for (int i = 0; i < PROXIMITY_COUNT; i++) { + _proximityScores[i] = 0; + } RCT2_GLOBAL(0x0138B5CA, uint16) = 0; RCT2_GLOBAL(0x0138B5CC, uint16) = 0; _rideRatingsState = RIDE_RATINGS_STATE_2; @@ -172,10 +186,10 @@ static void loc_6B5BB2() y = (ride->station_starts[i] >> 8) * 32; z = ride->station_heights[i] * 8; - RCT2_GLOBAL(0x0138B584, uint16) = x; - RCT2_GLOBAL(0x0138B586, uint16) = y; - RCT2_GLOBAL(0x0138B588, uint16) = z; - RCT2_GLOBAL(0x0138B592, uint8) = 255; + _rideRatingsProximityX = x; + _rideRatingsProximityY = y; + _rideRatingsProximityZ = z; + _rideRatingsProximityTrackType = 255; RCT2_GLOBAL(0x0138B58A, uint16) = x; RCT2_GLOBAL(0x0138B58C, uint16) = y; RCT2_GLOBAL(0x0138B58E, uint16) = z; @@ -203,13 +217,12 @@ static void ride_ratings_update_state_2() return; } - x = RCT2_GLOBAL(0x0138B584, uint16) / 32; - y = RCT2_GLOBAL(0x0138B586, uint16) / 32; - z = RCT2_GLOBAL(0x0138B588, uint16) / 8; + x = _rideRatingsProximityX / 32; + y = _rideRatingsProximityY / 32; + z = _rideRatingsProximityZ / 8; + trackType = _rideRatingsProximityTrackType; mapElement = map_get_first_element_at(x, y); - trackType = RCT2_GLOBAL(0x0138B592, uint8); - do { if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; @@ -226,8 +239,8 @@ static void ride_ratings_update_state_2() ride_ratings_score_close_proximity(mapElement); - trackElement.x = RCT2_GLOBAL(0x0138B584, uint16); - trackElement.y = RCT2_GLOBAL(0x0138B586, uint16); + trackElement.x = _rideRatingsProximityX; + trackElement.y = _rideRatingsProximityY; trackElement.element = mapElement; if (!track_block_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { _rideRatingsState = RIDE_RATINGS_STATE_4; @@ -242,10 +255,10 @@ static void ride_ratings_update_state_2() _rideRatingsState = RIDE_RATINGS_STATE_CALCULATE; return; } - RCT2_GLOBAL(0x0138B584, uint16) = x; - RCT2_GLOBAL(0x0138B586, uint16) = y; - RCT2_GLOBAL(0x0138B588, uint16) = z; - RCT2_GLOBAL(0x0138B592, uint8) = mapElement->properties.track.type; + _rideRatingsProximityX = x; + _rideRatingsProximityY = y; + _rideRatingsProximityZ = z; + _rideRatingsProximityTrackType = mapElement->properties.track.type; } } while (!map_element_is_last_for_tile(mapElement++)); @@ -301,13 +314,12 @@ static void ride_ratings_update_state_5() return; } - x = RCT2_GLOBAL(0x0138B584, uint16) / 32; - y = RCT2_GLOBAL(0x0138B586, uint16) / 32; - z = RCT2_GLOBAL(0x0138B588, uint16) / 8; + x = _rideRatingsProximityX / 32; + y = _rideRatingsProximityY / 32; + z = _rideRatingsProximityZ / 8; + trackType = _rideRatingsProximityTrackType; mapElement = map_get_first_element_at(x, y); - trackType = RCT2_GLOBAL(0x0138B592, uint8); - do { if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; @@ -317,8 +329,8 @@ static void ride_ratings_update_state_5() if (trackType == 255 || trackType == mapElement->properties.track.type) { ride_ratings_score_close_proximity(mapElement); - x = RCT2_GLOBAL(0x0138B584, uint16); - y = RCT2_GLOBAL(0x0138B586, uint16); + x = _rideRatingsProximityX; + y = _rideRatingsProximityY; if (!track_block_get_previous(x, y, mapElement, &trackBeginEnd)) { _rideRatingsState = RIDE_RATINGS_STATE_CALCULATE; return; @@ -330,16 +342,21 @@ static void ride_ratings_update_state_5() _rideRatingsState = RIDE_RATINGS_STATE_CALCULATE; return; } - RCT2_GLOBAL(0x0138B584, uint16) = x; - RCT2_GLOBAL(0x0138B586, uint16) = y; - RCT2_GLOBAL(0x0138B588, uint16) = z; - RCT2_GLOBAL(0x0138B592, uint8) = mapElement->properties.track.type; + _rideRatingsProximityX = x; + _rideRatingsProximityY = y; + _rideRatingsProximityZ = z; + _rideRatingsProximityTrackType = mapElement->properties.track.type; } } while (!map_element_is_last_for_tile(mapElement++)); _rideRatingsState = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; } +static void proximity_score_increment(int type) +{ + _proximityScores[type]++; +} + /** * * rct2: 0x006B6207 @@ -371,32 +388,32 @@ static void ride_ratings_score_close_proximity(rct_map_element *inputMapElement) if (RCT2_GLOBAL(0x0138B5CE, uint16) & 1) return; - RCT2_GLOBAL(0x00138B594, uint16)++; - x = RCT2_GLOBAL(0x00138B584, uint16); - y = RCT2_GLOBAL(0x00138B586, uint16); + _rideRatingsProximityTotal++; + x = _rideRatingsProximityX; + y = _rideRatingsProximityY; mapElement = map_get_first_element_at(x >> 5, y >> 5); do { switch (map_element_get_type(mapElement)) { case MAP_ELEMENT_TYPE_SURFACE: RCT2_GLOBAL(0x0138B593, uint8) = mapElement->base_height; - if (mapElement->base_height * 8 != RCT2_GLOBAL(0x0138B588, uint16)) { + if (mapElement->base_height * 8 != _rideRatingsProximityZ) { RCT2_GLOBAL(0x0138B59E, uint16)++; } waterHeight = (mapElement->properties.surface.terrain & 0x1F); if (waterHeight != 0) { z = waterHeight * 16; - if (z <= RCT2_GLOBAL(0x0138B588, uint16)) { - RCT2_GLOBAL(0x0138B596, uint16)++; - if (z == RCT2_GLOBAL(0x0138B588, uint16)) { - RCT2_GLOBAL(0x0138B598, uint16)++; + if (z <= _rideRatingsProximityZ) { + proximity_score_increment(PROXIMITY_WATER_OVER); + if (z == _rideRatingsProximityZ) { + proximity_score_increment(PROXIMITY_WATER_TOUCH); } z += 16; - if (z == RCT2_GLOBAL(0x0138B588, uint16)) { - RCT2_GLOBAL(0x0138B59A, uint16)++; + if (z == _rideRatingsProximityZ) { + proximity_score_increment(PROXIMITY_WATER_LOW); } z += 112; - if (z <= RCT2_GLOBAL(0x0138B588, uint16)) { - RCT2_GLOBAL(0x0138B59C, uint16)++; + if (z <= _rideRatingsProximityZ) { + proximity_score_increment(PROXIMITY_WATER_HIGH); } } } @@ -404,20 +421,20 @@ static void ride_ratings_score_close_proximity(rct_map_element *inputMapElement) case MAP_ELEMENT_TYPE_PATH: if (inputMapElement->properties.path.type & 0xF0) { if (mapElement->clearance_height == inputMapElement->base_height) { - RCT2_GLOBAL(0x0138B5A6, uint16)++; + proximity_score_increment(PROXIMITY_138B5A6); } if (mapElement->base_height == inputMapElement->clearance_height) { - RCT2_GLOBAL(0x0138B5A8, uint16)++; + proximity_score_increment(PROXIMITY_138B5A8); } } else { if (mapElement->clearance_height <= inputMapElement->base_height) { - RCT2_GLOBAL(0x0138B5A0, uint16)++; + proximity_score_increment(PROXIMITY_PATH_OVER); } if (mapElement->clearance_height == inputMapElement->base_height) { - RCT2_GLOBAL(0x0138B5A2, uint16)++; + proximity_score_increment(PROXIMITY_PATH_TOUCH_ABOVE); } if (mapElement->base_height == inputMapElement->clearance_height) { - RCT2_GLOBAL(0x0138B5A4, uint16)++; + proximity_score_increment(PROXIMITY_PATH_TOUCH_UNDER); } } break; @@ -427,26 +444,26 @@ static void ride_ratings_score_close_proximity(rct_map_element *inputMapElement) sequence = mapElement->properties.track.sequence & 0x0F; if (sequence == 3 || sequence == 6) { if (mapElement->base_height - inputMapElement->clearance_height <= 10) { - RCT2_GLOBAL(0x0138B5C2, uint16)++; + proximity_score_increment(PROXIMITY_THROUGH_VERTICAL_LOOP); } } } if (inputMapElement->properties.track.ride_index == mapElement->properties.track.ride_index) { - RCT2_GLOBAL(0x0138B5AE, uint16)++; + proximity_score_increment(PROXIMITY_OWN_TRACK_ABOVE_OR_BELOW); if (mapElement->clearance_height == inputMapElement->base_height) { - RCT2_GLOBAL(0x0138B5B0, uint16)++; + proximity_score_increment(PROXIMITY_OWN_TRACK_TOUCH_ABOVE); } if (mapElement->clearance_height + 2 <= inputMapElement->base_height) { if (mapElement->clearance_height + 10 >= inputMapElement->base_height) { - RCT2_GLOBAL(0x0138B5B2, uint16)++; + proximity_score_increment(PROXIMITY_OWN_TRACK_CLOSE_ABOVE); } } if (inputMapElement->clearance_height == mapElement->base_height) { - RCT2_GLOBAL(0x0138B5B0, uint16)++; + proximity_score_increment(PROXIMITY_OWN_TRACK_TOUCH_ABOVE); } if (inputMapElement->clearance_height + 2 == mapElement->base_height) { if (inputMapElement->clearance_height + 10 >= mapElement->base_height) { - RCT2_GLOBAL(0x0138B5B2, uint16)++; + proximity_score_increment(PROXIMITY_OWN_TRACK_CLOSE_ABOVE); } } } else { @@ -457,31 +474,31 @@ static void ride_ratings_score_close_proximity(rct_map_element *inputMapElement) trackType == TRACK_ELEM_BEGIN_STATION ); if (mapElement->clearance_height == inputMapElement->base_height) { - RCT2_GLOBAL(0x0138B5AA, uint16)++; + proximity_score_increment(PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE); if (isStation) { - RCT2_GLOBAL(0x0138B5B8, uint16)++; + proximity_score_increment(PROXIMITY_FOREIGN_STATION_TOUCH_ABOVE); } } if (mapElement->clearance_height + 2 <= inputMapElement->base_height) { if (mapElement->clearance_height + 10 >= inputMapElement->base_height) { - RCT2_GLOBAL(0x0138B5AC, uint16)++; + proximity_score_increment(PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE); if (isStation) { - RCT2_GLOBAL(0x0138B5BA, uint16)++; + proximity_score_increment(PROXIMITY_FOREIGN_STATION_CLOSE_ABOVE); } } } if (inputMapElement->clearance_height == mapElement->base_height) { - RCT2_GLOBAL(0x0138B5AA, uint16)++; + proximity_score_increment(PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE); if (isStation) { - RCT2_GLOBAL(0x0138B5B8, uint16)++; + proximity_score_increment(PROXIMITY_FOREIGN_STATION_TOUCH_ABOVE); } } if (inputMapElement->clearance_height + 2 <= mapElement->base_height) { if (inputMapElement->clearance_height + 10 >= mapElement->base_height) { - RCT2_GLOBAL(0x0138B5AC, uint16)++; + proximity_score_increment(PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE); if (isStation) { - RCT2_GLOBAL(0x0138B5BA, uint16)++; + proximity_score_increment(PROXIMITY_FOREIGN_STATION_CLOSE_ABOVE); } } } @@ -759,19 +776,19 @@ static void set_unreliability_factor(rct_ride *ride) ride->unreliability_factor += (ride->lift_hill_speed - lift_speed_adjustment) * 2; } -static uint32 ride_ratings_get_proximity_score_helper_1(uint16 x, uint16 max, uint32 multiplier) +static uint32 get_proximity_score_helper_1(uint16 x, uint16 max, uint32 multiplier) { return (min(x, max) * multiplier) >> 16; } -static uint32 ride_ratings_get_proximity_score_helper_2(uint16 x, uint16 additionIfNotZero, uint16 max, uint32 multiplier) +static uint32 get_proximity_score_helper_2(uint16 x, uint16 additionIfNotZero, uint16 max, uint32 multiplier) { uint32 result = x; if (result != 0) result += additionIfNotZero; return (max(result, max) * multiplier) >> 16; } -static uint32 ride_ratings_get_proximity_score_helper_3(uint16 x, uint16 resultIfNotZero) +static uint32 get_proximity_score_helper_3(uint16 x, uint16 resultIfNotZero) { return x == 0 ? 0 : resultIfNotZero; } @@ -783,32 +800,32 @@ static uint32 ride_ratings_get_proximity_score_helper_3(uint16 x, uint16 resultI static uint32 ride_ratings_get_proximity_score() { uint32 result = 0; - result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B596, uint16) , 60, 0x00AAAA); - result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B598, uint16) , 22, 0x0245D1); - result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B59A, uint16) , 10, 0x020000); - result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B59C, uint16) , 40, 0x00A000); - result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B59E, uint16) , 70, 0x01B6DB); - result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B5A0, uint16) + 8, 12, 0x064000); - result += ride_ratings_get_proximity_score_helper_3(RCT2_GLOBAL(0x0138B5A2, uint16) , 40 ); - result += ride_ratings_get_proximity_score_helper_3(RCT2_GLOBAL(0x0138B5A4, uint16) , 45 ); - result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5A6, uint16) , 10, 20, 0x03C000); - result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5A6, uint16) , 10, 20, 0x044000); - result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5AA, uint16) , 10, 15, 0x035555); - result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B5AC, uint16) , 5, 0x060000); - result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5AE, uint16) , 10, 15, 0x02AAAA); - result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5B0, uint16) , 10, 15, 0x04AAAA); - result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B5B2, uint16) , 5, 0x090000); - result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B5B4, uint16) , 35, 0x016DB6); - result += ride_ratings_get_proximity_score_helper_1(RCT2_GLOBAL(0x0138B5B6, uint16) , 35, 0x00DB6D); - result += ride_ratings_get_proximity_score_helper_3(RCT2_GLOBAL(0x0138B5B8, uint16) , 55 ); - result += ride_ratings_get_proximity_score_helper_3(RCT2_GLOBAL(0x0138B5BA, uint16) , 25 ); - result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5BC, uint16) , 4, 6, 0x140000); - result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5BE, uint16) , 4, 6, 0x0F0000); - result += ride_ratings_get_proximity_score_helper_3(RCT2_GLOBAL(0x0138B5C0, uint16) , 100 ); - result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5C2, uint16) , 4, 6, 0x0A0000); - result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5C4, uint16) , 10, 20, 0x01C000); - result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5C6, uint16) , 10, 20, 0x024000); - result += ride_ratings_get_proximity_score_helper_2(RCT2_GLOBAL(0x0138B5C8, uint16) , 10, 20, 0x028000); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_OVER ] , 60, 0x00AAAA); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_TOUCH ] , 22, 0x0245D1); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_LOW ] , 10, 0x020000); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_HIGH ] , 40, 0x00A000); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_SURFACE_TOUCH ] , 70, 0x01B6DB); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_PATH_OVER ] + 8, 12, 0x064000); + result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_PATH_TOUCH_ABOVE ] , 40 ); + result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_PATH_TOUCH_UNDER ] , 45 ); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5A6 ] , 10, 20, 0x03C000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5A8 ] , 10, 20, 0x044000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE ] , 10, 15, 0x035555); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE ] , 5, 0x060000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_OWN_TRACK_ABOVE_OR_BELOW ] , 10, 15, 0x02AAAA); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_OWN_TRACK_TOUCH_ABOVE ] , 10, 15, 0x04AAAA); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_OWN_TRACK_CLOSE_ABOVE ] , 5, 0x090000); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_138B5B4 ] , 35, 0x016DB6); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_138B5B6 ] , 35, 0x00DB6D); + result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_FOREIGN_STATION_TOUCH_ABOVE] , 55 ); + result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_FOREIGN_STATION_CLOSE_ABOVE] , 25 ); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5BC ] , 4, 6, 0x140000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5BE ] , 4, 6, 0x0F0000); + result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_138B5C0 ] , 100 ); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_THROUGH_VERTICAL_LOOP ] , 4, 6, 0x0A0000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5C4 ] , 10, 20, 0x01C000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5C6 ] , 10, 20, 0x024000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5C8 ] , 10, 20, 0x028000); return result; } From d264a271958c5b707c6a04e15033e48573ce7ad7 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 12 Jul 2015 21:40:21 +0100 Subject: [PATCH 0268/1173] ride_ratings_score_close_proximity_in_direction --- src/ride/ride_ratings.c | 87 ++++++++++++++++++++++++++++++----------- 1 file changed, 65 insertions(+), 22 deletions(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 0af1b4a735..70f2d712d1 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -51,29 +51,30 @@ enum { PROXIMITY_OWN_TRACK_ABOVE_OR_BELOW, // 0x0138B5AE PROXIMITY_OWN_TRACK_TOUCH_ABOVE, // 0x0138B5B0 PROXIMITY_OWN_TRACK_CLOSE_ABOVE, // 0x0138B5B2 - PROXIMITY_138B5B4, // 0x0138B5B4 - PROXIMITY_138B5B6, // 0x0138B5B6 + PROXIMITY_SCENERY_SIDE_BELOW, // 0x0138B5B4 + PROXIMITY_SCENERY_SIDE_ABOVE, // 0x0138B5B6 PROXIMITY_FOREIGN_STATION_TOUCH_ABOVE, // 0x0138B5B8 PROXIMITY_FOREIGN_STATION_CLOSE_ABOVE, // 0x0138B5BA PROXIMITY_138B5BC, // 0x0138B5BC PROXIMITY_138B5BE, // 0x0138B5BE PROXIMITY_138B5C0, // 0x0138B5C0 PROXIMITY_THROUGH_VERTICAL_LOOP, // 0x0138B5C2 - PROXIMITY_138B5C4, // 0x0138B5C4 - PROXIMITY_138B5C6, // 0x0138B5C6 - PROXIMITY_138B5C8, // 0x0138B5C8 + PROXIMITY_PATH_SIDE_CLOSE, // 0x0138B5C4 + PROXIMITY_FOREIGN_TRACK_SIDE_CLOSE, // 0x0138B5C6 + PROXIMITY_SURFACE_SIDE_CLOSE, // 0x0138B5C8 PROXIMITY_COUNT }; typedef void (*ride_ratings_calculation)(rct_ride *ride); -#define _rideRatingsProximityX RCT2_GLOBAL(0x0138B584, uint16) -#define _rideRatingsProximityY RCT2_GLOBAL(0x0138B586, uint16) -#define _rideRatingsProximityZ RCT2_GLOBAL(0x0138B588, uint16) -#define _rideRatingsCurrentRide RCT2_GLOBAL(0x0138B590, uint8) -#define _rideRatingsState RCT2_GLOBAL(0x0138B591, uint8) -#define _rideRatingsProximityTrackType RCT2_GLOBAL(0x0138B592, uint8) -#define _rideRatingsProximityTotal RCT2_GLOBAL(0x0138B594, uint16) +#define _rideRatingsProximityX RCT2_GLOBAL(0x0138B584, uint16) +#define _rideRatingsProximityY RCT2_GLOBAL(0x0138B586, uint16) +#define _rideRatingsProximityZ RCT2_GLOBAL(0x0138B588, uint16) +#define _rideRatingsCurrentRide RCT2_GLOBAL(0x0138B590, uint8) +#define _rideRatingsState RCT2_GLOBAL(0x0138B591, uint8) +#define _rideRatingsProximityTrackType RCT2_GLOBAL(0x0138B592, uint8) +#define _rideRatingsProximityBaseHeight RCT2_GLOBAL(0x0138B593, uint8) +#define _rideRatingsProximityTotal RCT2_GLOBAL(0x0138B594, uint16) static uint16 *_proximityScores = (uint16*)0x0138B596; @@ -361,9 +362,51 @@ static void proximity_score_increment(int type) * * rct2: 0x006B6207 */ -static void sub_6B6207(rct_map_element *inputMapElement, int direction) +static void ride_ratings_score_close_proximity_in_direction(rct_map_element *inputMapElement, int direction) { - RCT2_CALLPROC_X(0x006B6207, 0, direction, 0, 0, (int)inputMapElement, 0, 0); + rct_map_element *mapElement; + int x, y; + + x = _rideRatingsProximityX + TileDirectionDelta[direction].x; + y = _rideRatingsProximityY + TileDirectionDelta[direction].y; + if (x < 0 || y < 0 || x >= (32 * 256) || y >= (32 * 256)) + return; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + switch (map_element_get_type(mapElement)) { + case MAP_ELEMENT_TYPE_SURFACE: + if (_rideRatingsProximityBaseHeight <= inputMapElement->base_height) { + if (inputMapElement->clearance_height <= mapElement->base_height) { + proximity_score_increment(PROXIMITY_SURFACE_SIDE_CLOSE); + } + } + break; + case MAP_ELEMENT_TYPE_PATH: + if (abs((int)inputMapElement->base_height - (int)mapElement->base_height) <= 2) { + proximity_score_increment(PROXIMITY_PATH_SIDE_CLOSE); + } + break; + case MAP_ELEMENT_TYPE_TRACK: + if (inputMapElement->properties.track.ride_index != mapElement->properties.track.ride_index) { + if (abs((int)inputMapElement->base_height - (int)mapElement->base_height) <= 2) { + proximity_score_increment(PROXIMITY_FOREIGN_TRACK_SIDE_CLOSE); + } + } + break; + case MAP_ELEMENT_TYPE_SCENERY: + case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: + if (mapElement->base_height < inputMapElement->clearance_height) { + if (inputMapElement->base_height > mapElement->clearance_height) { + proximity_score_increment(PROXIMITY_SCENERY_SIDE_ABOVE); + } else { + proximity_score_increment(PROXIMITY_SCENERY_SIDE_BELOW); + } + } + break; + } + } while (!map_element_is_last_for_tile(mapElement++)); + } /** @@ -395,7 +438,7 @@ static void ride_ratings_score_close_proximity(rct_map_element *inputMapElement) do { switch (map_element_get_type(mapElement)) { case MAP_ELEMENT_TYPE_SURFACE: - RCT2_GLOBAL(0x0138B593, uint8) = mapElement->base_height; + _rideRatingsProximityBaseHeight = mapElement->base_height; if (mapElement->base_height * 8 != _rideRatingsProximityZ) { RCT2_GLOBAL(0x0138B59E, uint16)++; } @@ -508,8 +551,8 @@ static void ride_ratings_score_close_proximity(rct_map_element *inputMapElement) } while (!map_element_is_last_for_tile(mapElement++)); direction = inputMapElement->type & MAP_ELEMENT_DIRECTION_MASK; - sub_6B6207(inputMapElement, (direction + 1) & 3); - sub_6B6207(inputMapElement, (direction - 1) & 3); + ride_ratings_score_close_proximity_in_direction(inputMapElement, (direction + 1) & 3); + ride_ratings_score_close_proximity_in_direction(inputMapElement, (direction - 1) & 3); loc_6B62DA(inputMapElement); } @@ -815,17 +858,17 @@ static uint32 ride_ratings_get_proximity_score() result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_OWN_TRACK_ABOVE_OR_BELOW ] , 10, 15, 0x02AAAA); result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_OWN_TRACK_TOUCH_ABOVE ] , 10, 15, 0x04AAAA); result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_OWN_TRACK_CLOSE_ABOVE ] , 5, 0x090000); - result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_138B5B4 ] , 35, 0x016DB6); - result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_138B5B6 ] , 35, 0x00DB6D); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_SCENERY_SIDE_BELOW ] , 35, 0x016DB6); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_SCENERY_SIDE_ABOVE ] , 35, 0x00DB6D); result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_FOREIGN_STATION_TOUCH_ABOVE] , 55 ); result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_FOREIGN_STATION_CLOSE_ABOVE] , 25 ); result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5BC ] , 4, 6, 0x140000); result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5BE ] , 4, 6, 0x0F0000); result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_138B5C0 ] , 100 ); result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_THROUGH_VERTICAL_LOOP ] , 4, 6, 0x0A0000); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5C4 ] , 10, 20, 0x01C000); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5C6 ] , 10, 20, 0x024000); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5C8 ] , 10, 20, 0x028000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_PATH_SIDE_CLOSE ] , 10, 20, 0x01C000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_FOREIGN_TRACK_SIDE_CLOSE ] , 10, 20, 0x024000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_SURFACE_SIDE_CLOSE ] , 10, 20, 0x028000); return result; } From 01d2d599ca5a74d945ab99040c1a858ca657f365 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 12 Jul 2015 22:13:08 +0100 Subject: [PATCH 0269/1173] implement ride_ratings_score_close_proximity_loops --- src/ride/ride_ratings.c | 79 ++++++++++++++++++++++++++++++++++------- 1 file changed, 67 insertions(+), 12 deletions(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 70f2d712d1..d25a41705d 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -40,7 +40,7 @@ enum { PROXIMITY_WATER_TOUCH, // 0x0138B598 PROXIMITY_WATER_LOW, // 0x0138B59A PROXIMITY_WATER_HIGH, // 0x0138B59C - PROXIMITY_SURFACE_TOUCH, // 0x0138B59E + PROXIMITY_SURFACE_NO_TOUCH, // 0x0138B59E PROXIMITY_PATH_OVER, // 0x0138B5A0 PROXIMITY_PATH_TOUCH_ABOVE, // 0x0138B5A2 PROXIMITY_PATH_TOUCH_UNDER, // 0x0138B5A4 @@ -55,9 +55,9 @@ enum { PROXIMITY_SCENERY_SIDE_ABOVE, // 0x0138B5B6 PROXIMITY_FOREIGN_STATION_TOUCH_ABOVE, // 0x0138B5B8 PROXIMITY_FOREIGN_STATION_CLOSE_ABOVE, // 0x0138B5BA - PROXIMITY_138B5BC, // 0x0138B5BC - PROXIMITY_138B5BE, // 0x0138B5BE - PROXIMITY_138B5C0, // 0x0138B5C0 + PROXIMITY_TRACK_THROUGH_VERTICAL_LOOP, // 0x0138B5BC + PROXIMITY_PATH_TROUGH_VERTICAL_LOOP, // 0x0138B5BE + PROXIMITY_INTERSECTING_VERTICAL_LOOP, // 0x0138B5C0 PROXIMITY_THROUGH_VERTICAL_LOOP, // 0x0138B5C2 PROXIMITY_PATH_SIDE_CLOSE, // 0x0138B5C4 PROXIMITY_FOREIGN_TRACK_SIDE_CLOSE, // 0x0138B5C6 @@ -409,13 +409,58 @@ static void ride_ratings_score_close_proximity_in_direction(rct_map_element *inp } +static void ride_ratings_score_close_proximity_loops_helper(rct_map_element *inputMapElement, int x, int y) +{ + rct_map_element *mapElement; + int zDiff, unk; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + switch (map_element_get_type(mapElement)) { + case MAP_ELEMENT_TYPE_PATH: + zDiff = (int)mapElement->base_height - (int)inputMapElement->base_height; + if (zDiff >= 0 && zDiff <= 16) { + proximity_score_increment(PROXIMITY_PATH_TROUGH_VERTICAL_LOOP); + } + break; + case MAP_ELEMENT_TYPE_TRACK: + unk = (mapElement->type ^ inputMapElement->type) & 1; + if (unk != 0) { + zDiff = (int)mapElement->base_height - (int)inputMapElement->base_height; + if (zDiff >= 0 && zDiff <= 16) { + proximity_score_increment(PROXIMITY_TRACK_THROUGH_VERTICAL_LOOP); + if ( + mapElement->properties.track.type == TRACK_ELEM_LEFT_VERTICAL_LOOP || + mapElement->properties.track.type == TRACK_ELEM_RIGHT_VERTICAL_LOOP + ) { + proximity_score_increment(PROXIMITY_INTERSECTING_VERTICAL_LOOP); + } + } + } + break; + } + } while (!map_element_is_last_for_tile(mapElement++)); +} + /** * * rct2: 0x006B62DA */ -static void loc_6B62DA(rct_map_element *inputMapElement) +static void ride_ratings_score_close_proximity_loops(rct_map_element *inputMapElement) { - RCT2_CALLPROC_X(0x006B6207, 0, 0, 0, 0, (int)inputMapElement, 0, 0); + int x, y, direction, trackType; + + trackType = inputMapElement->properties.track.type; + if (trackType == TRACK_ELEM_LEFT_VERTICAL_LOOP || trackType == TRACK_ELEM_RIGHT_VERTICAL_LOOP) { + x = _rideRatingsProximityX; + y = _rideRatingsProximityY; + ride_ratings_score_close_proximity_loops_helper(inputMapElement, _rideRatingsProximityX, _rideRatingsProximityY); + + direction = inputMapElement->type & MAP_ELEMENT_DIRECTION_MASK; + x = _rideRatingsProximityX + TileDirectionDelta[direction].x; + y = _rideRatingsProximityY + TileDirectionDelta[direction].y; + ride_ratings_score_close_proximity_loops_helper(inputMapElement, x, y); + } } /** @@ -440,7 +485,7 @@ static void ride_ratings_score_close_proximity(rct_map_element *inputMapElement) case MAP_ELEMENT_TYPE_SURFACE: _rideRatingsProximityBaseHeight = mapElement->base_height; if (mapElement->base_height * 8 != _rideRatingsProximityZ) { - RCT2_GLOBAL(0x0138B59E, uint16)++; + proximity_score_increment(PROXIMITY_SURFACE_NO_TOUCH); } waterHeight = (mapElement->properties.surface.terrain & 0x1F); if (waterHeight != 0) { @@ -553,7 +598,17 @@ static void ride_ratings_score_close_proximity(rct_map_element *inputMapElement) direction = inputMapElement->type & MAP_ELEMENT_DIRECTION_MASK; ride_ratings_score_close_proximity_in_direction(inputMapElement, (direction + 1) & 3); ride_ratings_score_close_proximity_in_direction(inputMapElement, (direction - 1) & 3); - loc_6B62DA(inputMapElement); + ride_ratings_score_close_proximity_loops(inputMapElement); + + switch (_rideRatingsProximityTrackType) { + case TRACK_ELEM_BRAKES: + RCT2_GLOBAL(0x0138B5CA, uint16)++; + break; + case 211: + case 212: + RCT2_GLOBAL(0x0138B5CC, uint16)++; + break; + } } /** @@ -847,7 +902,7 @@ static uint32 ride_ratings_get_proximity_score() result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_TOUCH ] , 22, 0x0245D1); result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_LOW ] , 10, 0x020000); result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_HIGH ] , 40, 0x00A000); - result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_SURFACE_TOUCH ] , 70, 0x01B6DB); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_SURFACE_NO_TOUCH ] , 70, 0x01B6DB); result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_PATH_OVER ] + 8, 12, 0x064000); result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_PATH_TOUCH_ABOVE ] , 40 ); result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_PATH_TOUCH_UNDER ] , 45 ); @@ -862,9 +917,9 @@ static uint32 ride_ratings_get_proximity_score() result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_SCENERY_SIDE_ABOVE ] , 35, 0x00DB6D); result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_FOREIGN_STATION_TOUCH_ABOVE] , 55 ); result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_FOREIGN_STATION_CLOSE_ABOVE] , 25 ); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5BC ] , 4, 6, 0x140000); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5BE ] , 4, 6, 0x0F0000); - result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_138B5C0 ] , 100 ); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_TRACK_THROUGH_VERTICAL_LOOP] , 4, 6, 0x140000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_PATH_TROUGH_VERTICAL_LOOP ] , 4, 6, 0x0F0000); + result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_INTERSECTING_VERTICAL_LOOP ] , 100 ); result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_THROUGH_VERTICAL_LOOP ] , 4, 6, 0x0A0000); result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_PATH_SIDE_CLOSE ] , 10, 20, 0x01C000); result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_FOREIGN_TRACK_SIDE_CLOSE ] , 10, 20, 0x024000); From af68e9d9ea2a24f702bb2ff8eb78b81463883eb7 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sun, 12 Jul 2015 20:23:58 -0600 Subject: [PATCH 0270/1173] fix #1590 --- src/drawing/drawing.c | 16 ++++++++++++++++ src/drawing/drawing.h | 1 + src/drawing/rain.c | 10 ---------- src/game.c | 1 - src/interface/window.c | 1 + src/openrct2.c | 2 +- src/rct2.c | 3 ++- 7 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index 5d573c2467..85a41e0f9c 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -500,6 +500,22 @@ void gfx_invalidate_pickedup_peep() } } +void gfx_draw_pickedup_peep() +{ + if (RCT2_GLOBAL(0x009ABDF2, uint8) == 0) + return; + + // Draw picked-up peep + if (RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_SPRITE, uint32) != 0xFFFFFFFF) { + gfx_draw_sprite( + (rct_drawpixelinfo*)RCT2_ADDRESS_SCREEN_DPI, + RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_SPRITE, uint32), + RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_X, sint16), + RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_Y, sint16), 0 + ); + } +} + void sub_681DE2(rct_drawpixelinfo *dpi, int x, int y, int image1, int image2) { RCT2_CALLPROC_X(0x00681DE2, 0, image1, x, y, 0, (int)dpi, image2); diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index c00d051747..6da2217523 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -94,6 +94,7 @@ void gfx_draw_rain(int left, int top, int width, int height, sint32 x_start, sin void gfx_clear(rct_drawpixelinfo *dpi, int colour); void gfx_draw_pixel(rct_drawpixelinfo *dpi, int x, int y, int colour); void gfx_invalidate_pickedup_peep(); +void gfx_draw_pickedup_peep(); // line void gfx_draw_line(rct_drawpixelinfo *dpi, int x1, int y1, int x2, int y2, int colour); diff --git a/src/drawing/rain.c b/src/drawing/rain.c index b1660e5fb6..cfae4449f2 100644 --- a/src/drawing/rain.c +++ b/src/drawing/rain.c @@ -155,16 +155,6 @@ void update_rain_animation() if (RCT2_GLOBAL(0x009ABDF2, uint8) == 0) return; - // Draw picked-up peep - if (RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_SPRITE, uint32) != 0xFFFFFFFF) { - gfx_draw_sprite( - (rct_drawpixelinfo*)RCT2_ADDRESS_SCREEN_DPI, - RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_SPRITE, uint32), - RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_X, sint16), - RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_Y, sint16), 0 - ); - } - // Get rain draw function and draw rain uint32 draw_rain_func = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8); if (draw_rain_func > 0 && !(RCT2_GLOBAL(0x009DEA6F, uint8) & 1)) diff --git a/src/game.c b/src/game.c index 021efd0df4..a54de0effc 100644 --- a/src/game.c +++ b/src/game.c @@ -325,7 +325,6 @@ void game_logic_update() peep_update_crowd_noise(); climate_update_sound(); editor_open_windows_for_current_step(); - gfx_invalidate_pickedup_peep(); // Update windows //window_dispatch_update_all(); diff --git a/src/interface/window.c b/src/interface/window.c index 66b34b756c..76f93c12f0 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -178,6 +178,7 @@ void window_update_all() gfx_draw_all_dirty_blocks(); window_update_all_viewports(); + gfx_draw_all_dirty_blocks(); // 1000 tick update RCT2_GLOBAL(0x009DEB7C, sint16) += RCT2_GLOBAL(0x009DE588, sint16); diff --git a/src/openrct2.c b/src/openrct2.c index a64cbef838..4778d89e2a 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -187,7 +187,7 @@ bool openrct2_initialise() title_sequences_load_presets(); // Hooks to allow RCT2 to call OpenRCT2 functions instead - addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0); // remove after all drawing is decompiled + addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0); // remove when all callers are decompiled addhook(0x006E7499, (int)gfx_redraw_screen_rect, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0); // remove when 0x6E7FF3 is decompiled addhook(0x006B752C, (int)ride_crash, 0, (int[]){ EDX, EBX, END }, 0); // remove when all callers are decompiled addhook(0x0069A42F, (int)peep_window_state_update, 0, (int[]){ ESI }, 0); // remove when all callers are decompiled diff --git a/src/rct2.c b/src/rct2.c index a9c5a9a39e..ccc67b8837 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -218,9 +218,10 @@ void rct2_draw() { redraw_rain(); window_update_all(); + gfx_invalidate_pickedup_peep(); + gfx_draw_pickedup_peep(); update_rain_animation(); update_palette_effects(); - gfx_draw_all_dirty_blocks(); console_draw(RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo)); From a63642b630803c34124f818868eabe1ba5060323 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 3 Jul 2015 12:06:53 +0200 Subject: [PATCH 0271/1173] Fix some warnings --- src/rct2.c | 1 + src/scenario.c | 2 +- src/windows/options.c | 10 +++++----- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/rct2.c b/src/rct2.c index ccc67b8837..ef8940af49 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -21,6 +21,7 @@ #pragma warning(disable : 4996) // GetVersionExA deprecated #include +#include #include "addresses.h" #include "audio/audio.h" #include "audio/mixer.h" diff --git a/src/scenario.c b/src/scenario.c index 2519c13962..582803e2c8 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -828,7 +828,7 @@ static void sub_674BCF() /** * Modifys the given S6 data so that ghost elements, rides with no track elements or unused banners / user strings are saved. */ -static scenario_fix_ghosts(rct_s6_data *s6) +static void scenario_fix_ghosts(rct_s6_data *s6) { // Remove all ghost elements size_t mapElementTotalSize = MAX_MAP_ELEMENTS * sizeof(rct_map_element); diff --git a/src/windows/options.c b/src/windows/options.c index 5a26ddf43f..1aab0a5cdb 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -675,13 +675,13 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* num_items = gConfigThemes.num_presets; gDropdownItemsFormat[0] = 2777; - gDropdownItemsArgs[0] = (uint64)&gConfigThemes.presets[1].name; + gDropdownItemsArgs[0] = (uint32)&gConfigThemes.presets[1].name; gDropdownItemsFormat[1] = 2777; - gDropdownItemsArgs[1] = (uint64)&gConfigThemes.presets[0].name; + gDropdownItemsArgs[1] = (uint32)&gConfigThemes.presets[0].name; for (i = 2; i < num_items; i++) { gDropdownItemsFormat[i] = 2777; - gDropdownItemsArgs[i] = (uint64)&gConfigThemes.presets[i].name; + gDropdownItemsArgs[i] = (uint32)&gConfigThemes.presets[i].name; } window_dropdown_show_text_custom_width( @@ -749,7 +749,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* case WIDX_LANGUAGE_DROPDOWN: for (i = 1; i < LANGUAGE_COUNT; i++) { gDropdownItemsFormat[i - 1] = 2777; - gDropdownItemsArgs[i - 1] = (sint64)language_names[i]; + gDropdownItemsArgs[i - 1] = (sint32)language_names[i]; } window_options_show_dropdown(w, widget, LANGUAGE_COUNT - 1); gDropdownItemsChecked = 1 << (gCurrentLanguage - 1); @@ -827,7 +827,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* for (i = 0; i < num_items; i++) { gDropdownItemsFormat[i] = 2777; - gDropdownItemsArgs[i] = (uint64)&gConfigTitleSequences.presets[i].name; + gDropdownItemsArgs[i] = (uint32)&gConfigTitleSequences.presets[i].name; } window_dropdown_show_text_custom_width( From 0cbabb479eaf00842be30a27522163a47e130f38 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 13 Jul 2015 11:56:58 +0200 Subject: [PATCH 0272/1173] Fix some warnings --- src/interface/viewport.c | 2 +- src/windows/themes.c | 6 +++--- src/windows/title_command_editor.c | 2 +- src/windows/title_editor.c | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 0a4878b9a4..6c40f26334 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1118,7 +1118,7 @@ int scrolling_text_setup(rct_string_id string_id, uint16 scroll, uint16 scrollin * dx : height * edi : unknown */ -int sub_6629BC(int height, uint16 ax, uint32 image_id, uint32 edi){ +int 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/windows/themes.c b/src/windows/themes.c index ae3d3ea222..9984df3f22 100644 --- a/src/windows/themes.c +++ b/src/windows/themes.c @@ -533,13 +533,13 @@ static void window_themes_mousedown(int widgetIndex, rct_window* w, rct_widget* widget--; gDropdownItemsFormat[0] = 2777; - gDropdownItemsArgs[0] = (uint64)&gConfigThemes.presets[1].name; + gDropdownItemsArgs[0] = (uint32)&gConfigThemes.presets[1].name; gDropdownItemsFormat[1] = 2777; - gDropdownItemsArgs[1] = (uint64)&gConfigThemes.presets[0].name; + gDropdownItemsArgs[1] = (uint32)&gConfigThemes.presets[0].name; for (i = 2; i < num_items; i++) { gDropdownItemsFormat[i] = 2777; - gDropdownItemsArgs[i] = (uint64)&gConfigThemes.presets[i].name; + gDropdownItemsArgs[i] = (uint32)&gConfigThemes.presets[i].name; } window_dropdown_show_text_custom_width( diff --git a/src/windows/title_command_editor.c b/src/windows/title_command_editor.c index d1b282a291..7350a129f9 100644 --- a/src/windows/title_command_editor.c +++ b/src/windows/title_command_editor.c @@ -347,7 +347,7 @@ static void window_title_command_editor_mousedown(int widgetIndex, rct_window* w num_items = gConfigTitleSequences.presets[gCurrentTitleSequence].num_saves; for (i = 0; i < num_items; i++) { gDropdownItemsFormat[i] = 2777; - gDropdownItemsArgs[i] = (uint64)&gConfigTitleSequences.presets[gCurrentTitleSequence].saves[i]; + gDropdownItemsArgs[i] = (uint32)&gConfigTitleSequences.presets[gCurrentTitleSequence].saves[i]; } window_dropdown_show_text_custom_width( diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index 1b3c22c50d..feb68f79e0 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -574,7 +574,7 @@ static void window_title_editor_mousedown(int widgetIndex, rct_window* w, rct_wi widget--; for (i = 0; i < num_items; i++) { gDropdownItemsFormat[i] = 2777; - gDropdownItemsArgs[i] = (uint64)&gConfigTitleSequences.presets[i].name; + gDropdownItemsArgs[i] = (uint32)&gConfigTitleSequences.presets[i].name; } window_dropdown_show_text_custom_width( @@ -997,4 +997,4 @@ void window_title_editor_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int gfx_draw_string_left(dpi, 1170, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, w->colours[1], x + 5, y); } } -} \ No newline at end of file +} From 1d9f404b5be67505cb97f42b91e722961c1fa8e2 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 13 Jul 2015 12:47:31 +0100 Subject: [PATCH 0273/1173] implement ride_construction_set_default_next_piece --- src/addresses.h | 1 - src/localisation/localisation.c | 25 +- src/ride/ride.c | 151 +++++++++- src/ride/ride.h | 2 +- src/ride/track.c | 1 + src/ride/track.h | 1 + src/ride/track_data.c | 520 ++++++++++++++++++++++++++++++++ src/ride/track_data.h | 8 + src/windows/ride_construction.c | 26 +- 9 files changed, 712 insertions(+), 23 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 119b397e07..4e108201ba 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -59,7 +59,6 @@ // translate between scroll positions for drawing #define RCT2_ADDRESS_SCROLLING_MODE_POSITIONS 0x00992FB8 -#define RCT2_ADDRESS_RIDE_PROPERTIES 0x00997C9D #define RCT2_ADDRESS_LAND_TOOL_SIZE 0x009A9800 #define RCT2_ADDRESS_SAVE_PROMPT_MODE 0x009A9802 #define RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS 0x009A9804 diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index db22c239fd..312c5215f3 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -794,9 +794,26 @@ int get_string_length(char* buffer) int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength) { - utf16 intermediateBuffer[512]; + utf16 stackBuffer[256]; + utf16 *heapBuffer = NULL; + utf16 *intermediateBuffer = stackBuffer; + int bufferCount = countof(stackBuffer); - // TODO this supports only a maximum of 512 characters - MultiByteToWideChar(CP_ACP, 0, src, -1, intermediateBuffer, 512); - return WideCharToMultiByte(CP_UTF8, 0, intermediateBuffer, -1, dst, maxBufferLength, NULL, NULL); + if (maxBufferLength > bufferCount) { + int srcLength = strlen(src); + if (srcLength > bufferCount) { + bufferCount = srcLength + 4; + heapBuffer = malloc(bufferCount * sizeof(utf16)); + intermediateBuffer = heapBuffer; + } + } + + MultiByteToWideChar(CP_ACP, 0, src, -1, intermediateBuffer, bufferCount); + int result = WideCharToMultiByte(CP_UTF8, 0, intermediateBuffer, -1, dst, maxBufferLength, NULL, NULL); + + if (heapBuffer != NULL) { + free(heapBuffer); + } + + return result; } diff --git a/src/ride/ride.c b/src/ride/ride.c index b8e625a092..2b751a364f 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1267,13 +1267,156 @@ void sub_6C9627() } } +/** + * + * rct2: 0x006C9B19 + */ +static void ride_construction_reset_current_piece() +{ + rct_ride *ride; + + ride = GET_RIDE(_currentRideIndex); + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_15) || ride->num_stations != 0) { + _currentTrackCurve = RCT2_GLOBAL(0x0097CC68 + (ride->type * 2), uint8) | 0x100; + _currentTrackSlopeEnd = 0; + _currentTrackBankEnd = 0; + _currentTrackLiftHill = 0; + _currentTrackCovered = 0; + if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x8000) { + _currentTrackCovered |= 2; + } + _previousTrackSlopeEnd = 0; + _previousTrackBankEnd = 0; + } else { + _currentTrackCurve = 0xFFFF; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_0; + } +} + /** * * rct2: 0x006C9800 */ -void sub_6C9800() +void ride_construction_set_default_next_piece() { - RCT2_CALLPROC_EBPSAFE(0x006C9800); + int x, y, z, direction, rideIndex, trackType, curve, bank, slope; + rct_ride *ride; + track_begin_end trackBeginEnd; + rct_xy_element xyElement; + rct_map_element *mapElement; + + _currentTrackPrice = MONEY32_UNDEFINED; + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_FRONT: + rideIndex = _currentRideIndex; + ride = GET_RIDE(rideIndex); + + RCT2_GLOBAL(0x00F441D2, uint8) = rideIndex; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection; + if (!track_block_get_previous_from_zero(x, y, z, rideIndex, direction, &trackBeginEnd)) { + ride_construction_reset_current_piece(); + return; + } + mapElement = trackBeginEnd.begin_element; + trackType = mapElement->properties.track.type; + + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_15)) { + ride_construction_reset_current_piece(); + return; + } + + // Set whether track is covered + _currentTrackCovered &= ~2; + if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 8) { + if (mapElement->properties.track.colour & 4) { + _currentTrackCovered |= 2; + } + } + + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + curve = gFlatRideTrackCurveChain[trackType].next; + bank = gFlatRideTrackDefinitions[trackType].bank_end; + slope = gFlatRideTrackDefinitions[trackType].vangle_end; + } else { + curve = gTrackCurveChain[trackType].next; + bank = gTrackDefinitions[trackType].bank_end; + slope = gTrackDefinitions[trackType].vangle_end; + } + + // Set track curve + _currentTrackCurve = curve; + + // Set track banking + if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 8) { + if (bank == TRACK_BANK_UPSIDE_DOWN) { + bank = TRACK_BANK_NONE; + _currentTrackCovered ^= 2; + } + } + _currentTrackBankEnd = bank; + _previousTrackBankEnd = bank; + + // Set track slope and lift hill + _currentTrackSlopeEnd = slope; + _previousTrackSlopeEnd = slope; + _currentTrackLiftHill = ((mapElement->type & 0x80) && slope != TRACK_SLOPE_DOWN_25 && slope != TRACK_SLOPE_DOWN_60); + break; + case RIDE_CONSTRUCTION_STATE_BACK: + rideIndex = _currentRideIndex; + ride = GET_RIDE(rideIndex); + + RCT2_GLOBAL(0x00F441D2, uint8) = rideIndex; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection ^ 2; + if (!track_block_get_next_from_zero(x, y, z, rideIndex, direction, &xyElement, &z, &direction)) { + ride_construction_reset_current_piece(); + return; + } + mapElement = xyElement.element; + trackType = mapElement->properties.track.type; + + // Set whether track is covered + _currentTrackCovered &= ~2; + if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 8) { + if (mapElement->properties.track.colour & 4) { + _currentTrackCovered |= 2; + } + } + + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + curve = gFlatRideTrackCurveChain[trackType].previous; + bank = gFlatRideTrackDefinitions[trackType].bank_start; + slope = gFlatRideTrackDefinitions[trackType].vangle_start; + } else { + curve = gTrackCurveChain[trackType].previous; + bank = gTrackDefinitions[trackType].bank_start; + slope = gTrackDefinitions[trackType].vangle_start; + } + + // Set track curve + _currentTrackCurve = curve; + + // Set track banking + if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 8) { + if (bank == TRACK_BANK_UPSIDE_DOWN) { + bank = TRACK_BANK_NONE; + _currentTrackCovered ^= 2; + } + } + _currentTrackBankEnd = bank; + _previousTrackBankEnd = bank; + + // Set track slope and lift hill + _currentTrackSlopeEnd = slope; + _previousTrackSlopeEnd = slope; + _currentTrackLiftHill = (mapElement->type & 0x80); + break; + } } /** @@ -1314,7 +1457,7 @@ void ride_select_next_section() _currentTrackPieceType = mapElement->properties.track.type; _currentTrackSelectionFlags = 0; _rideConstructionArrowPulseTime = 0; - sub_6C9800(); + ride_construction_set_default_next_piece(); sub_6C84CE(); return; } @@ -1374,7 +1517,7 @@ void ride_select_previous_section() _currentTrackPieceType = mapElement->properties.track.type; _currentTrackSelectionFlags = 0; _rideConstructionArrowPulseTime = 0; - sub_6C9800(); + ride_construction_set_default_next_piece(); sub_6C84CE(); } } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) { diff --git a/src/ride/ride.h b/src/ride/ride.h index 2bbd5998cd..f8bfc6e024 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -924,7 +924,7 @@ bool ride_is_powered_launched(rct_ride *ride); bool ride_has_any_track_elements(int rideIndex); void ride_all_has_any_track_elements(bool *rideIndexArray); -void sub_6C9800(); +void ride_construction_set_default_next_piece(); bool track_block_get_next(rct_xy_element *input, rct_xy_element *output, int *z, int *direction); bool track_block_get_next_from_zero(sint16 x, sint16 y, sint16 z_start, uint8 rideIndex, uint8 direction_start, rct_xy_element *output, int *z, int *direction); diff --git a/src/ride/track.c b/src/ride/track.c index 297fe71508..22fe6ab0d5 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -45,6 +45,7 @@ * rct2: 0x00997C9D */ const rct_trackdefinition *gTrackDefinitions = (rct_trackdefinition*)0x00997C9D; +const rct_trackdefinition *gFlatRideTrackDefinitions = (rct_trackdefinition*)0x0099849D; // TODO This table is incorrect or at least missing 69 elements. There should be 256 in total! const rct_trackdefinition gTrackDefinitions_INCORRECT[] = { diff --git a/src/ride/track.h b/src/ride/track.h index 1a757d0b7d..df71a307c7 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -490,6 +490,7 @@ typedef struct { bool looped; } track_circuit_iterator; +extern const rct_trackdefinition *gFlatRideTrackDefinitions; extern const rct_trackdefinition *gTrackDefinitions; void track_load_list(ride_list_item item); diff --git a/src/ride/track_data.c b/src/ride/track_data.c index 1700176162..c29975e447 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -4948,3 +4948,523 @@ const uint8 TrackPieceLengths[256] = { 80, // 80, // }; + +// rct2: 0x00998C95 +const track_curve_chain gTrackCurveChain[256] = { + { 0, 0 }, + { 257, 257 }, + { 257, 257 }, + { 257, 257 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 1, 1 }, + { 2, 2 }, + { 1, 0 }, + { 2, 0 }, + { 0, 1 }, + { 0, 2 }, + { 1, 1 }, + { 2, 2 }, + { 0, 1 }, + { 0, 2 }, + { 1, 0 }, + { 2, 0 }, + { 0, 1 }, + { 0, 2 }, + { 1, 0 }, + { 2, 0 }, + { 1, 1 }, + { 2, 2 }, + { 1, 1 }, + { 2, 2 }, + { 1, 1 }, + { 2, 2 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 3, 3 }, + { 4, 4 }, + { 3, 3 }, + { 4, 4 }, + { 3, 3 }, + { 4, 4 }, + { 3, 3 }, + { 4, 4 }, + { 5, 5 }, + { 6, 6 }, + { 310, 0 }, + { 311, 0 }, + { 0, 308 }, + { 0, 309 }, + { 313, 0 }, + { 0, 312 }, + { 317, 0 }, + { 316, 0 }, + { 0, 315 }, + { 0, 314 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 323, 0 }, + { 323, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 1, 1 }, + { 2, 2 }, + { 0, 0 }, + { 0, 0 }, + { 3, 3 }, + { 4, 4 }, + { 343, 343 }, + { 344, 344 }, + { 345, 345 }, + { 346, 346 }, + { 347, 347 }, + { 348, 348 }, + { 349, 349 }, + { 350, 350 }, + { 3, 3 }, + { 4, 4 }, + { 3, 3 }, + { 4, 4 }, + { 355, 355 }, + { 0, 0 }, + { 0, 0 }, + { 358, 358 }, + { 359, 359 }, + { 360, 360 }, + { 361, 361 }, + { 362, 362 }, + { 363, 363 }, + { 364, 364 }, + { 365, 365 }, + { 1, 1 }, + { 2, 2 }, + { 368, 368 }, + { 369, 369 }, + { 0, 0 }, + { 1, 1 }, + { 2, 2 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 381, 0 }, + { 381, 381 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 7, 7 }, + { 8, 8 }, + { 7, 7 }, + { 8, 8 }, + { 7, 7 }, + { 8, 8 }, + { 7, 7 }, + { 8, 8 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 7, 0 }, + { 8, 0 }, + { 0, 7 }, + { 0, 8 }, + { 0, 7 }, + { 0, 8 }, + { 7, 0 }, + { 8, 0 }, + { 0, 7 }, + { 0, 8 }, + { 7, 0 }, + { 8, 0 }, + { 7, 7 }, + { 8, 8 }, + { 0, 0 }, + { 0, 0 }, + { 432, 0 }, + { 433, 0 }, + { 0, 430 }, + { 0, 431 }, + { 3, 3 }, + { 4, 4 }, + { 3, 3 }, + { 4, 4 }, + { 438, 190 }, + { 442, 0 }, + { 441, 0 }, + { 0, 440 }, + { 0, 439 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 464, 0 }, + { 0, 463 }, + { 465, 465 }, + { 466, 466 }, + { 0, 0 }, + { 0, 0 }, + { 470, 381 }, + { 470, 470 }, + { 0, 470 }, + { 0, 0 }, + { 3, 3 }, + { 4, 4 }, + { 3, 3 }, + { 4, 4 }, + { 1, 1 }, + { 2, 2 }, + { 1, 1 }, + { 2, 2 }, + { 1, 0 }, + { 2, 0 }, + { 0, 1 }, + { 0, 2 }, + { 1, 0 }, + { 2, 0 }, + { 0, 1 }, + { 0, 2 }, + { 1, 1 }, + { 2, 2 }, + { 1, 1 }, + { 2, 2 }, + { 1, 1 }, + { 2, 2 }, + { 1, 1 }, + { 2, 2 }, + { 1, 0 }, + { 2, 0 }, + { 0, 1 }, + { 0, 2 }, + { 1, 0 }, + { 2, 0 }, + { 0, 1 }, + { 0, 2 }, + { 3, 3 }, + { 4, 4 }, + { 3, 3 }, + { 4, 4 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, +}; + +// rct2: 0x00999095 +const track_curve_chain gFlatRideTrackCurveChain[256] = { + { 0, 0 }, + { 257, 257 }, + { 257, 257 }, + { 257, 257 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 1, 1 }, + { 2, 2 }, + { 1, 0 }, + { 2, 0 }, + { 0, 1 }, + { 0, 2 }, + { 1, 1 }, + { 2, 2 }, + { 0, 1 }, + { 0, 2 }, + { 1, 0 }, + { 2, 0 }, + { 0, 1 }, + { 0, 2 }, + { 1, 0 }, + { 2, 0 }, + { 1, 1 }, + { 2, 2 }, + { 1, 1 }, + { 2, 2 }, + { 1, 1 }, + { 2, 2 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 3, 3 }, + { 4, 4 }, + { 3, 3 }, + { 4, 4 }, + { 3, 3 }, + { 4, 4 }, + { 3, 3 }, + { 4, 4 }, + { 5, 5 }, + { 6, 6 }, + { 310, 0 }, + { 311, 0 }, + { 0, 308 }, + { 0, 309 }, + { 313, 0 }, + { 0, 312 }, + { 317, 0 }, + { 316, 0 }, + { 0, 315 }, + { 0, 314 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 323, 0 }, + { 323, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 1, 1 }, + { 2, 2 }, + { 0, 0 }, + { 0, 0 }, + { 3, 3 }, + { 4, 4 }, + { 343, 343 }, + { 344, 344 }, + { 345, 345 }, + { 346, 346 }, + { 347, 347 }, + { 348, 348 }, + { 349, 349 }, + { 350, 350 }, + { 65535, 65535 }, + { 4, 4 }, + { 3, 3 }, + { 4, 4 }, + { 355, 355 }, + { 0, 0 }, + { 0, 0 }, + { 358, 358 }, + { 359, 359 }, + { 360, 360 }, + { 361, 361 }, + { 362, 362 }, + { 363, 363 }, + { 364, 364 }, + { 365, 365 }, + { 65535, 65535 }, + { 65535, 65535 }, + { 368, 368 }, + { 369, 369 }, + { 0, 0 }, + { 65535, 65535 }, + { 65535, 65535 }, + { 0, 0 }, + { 65535, 65535 }, + { 65535, 65535 }, + { 0, 0 }, + { 65535, 65535 }, + { 65535, 65535 }, + { 65535, 65535 }, + { 381, 0 }, + { 381, 381 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 7, 7 }, + { 8, 8 }, + { 7, 7 }, + { 8, 8 }, + { 7, 7 }, + { 8, 8 }, + { 7, 7 }, + { 8, 8 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 7, 0 }, + { 8, 0 }, + { 0, 7 }, + { 0, 8 }, + { 0, 7 }, + { 0, 8 }, + { 7, 0 }, + { 8, 0 }, + { 0, 7 }, + { 0, 8 }, + { 7, 0 }, + { 8, 0 }, + { 7, 7 }, + { 8, 8 }, + { 0, 0 }, + { 0, 0 }, + { 432, 0 }, + { 433, 0 }, + { 0, 430 }, + { 0, 431 }, + { 3, 3 }, + { 4, 4 }, + { 3, 3 }, + { 4, 4 }, + { 438, 190 }, + { 442, 0 }, + { 441, 0 }, + { 0, 440 }, + { 0, 439 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 465, 465 }, + { 466, 466 }, + { 0, 0 }, + { 0, 0 }, + { 470, 381 }, + { 470, 470 }, + { 0, 470 }, + { 0, 0 }, + { 3, 3 }, + { 4, 4 }, + { 3, 3 }, + { 4, 4 }, + { 1, 1 }, + { 2, 2 }, + { 1, 1 }, + { 2, 2 }, + { 1, 0 }, + { 2, 0 }, + { 0, 1 }, + { 0, 1 }, + { 1, 0 }, + { 2, 0 }, + { 0, 1 }, + { 0, 2 }, + { 1, 1 }, + { 2, 2 }, + { 1, 1 }, + { 2, 2 }, + { 1, 1 }, + { 2, 2 }, + { 1, 1 }, + { 2, 2 }, + { 1, 0 }, + { 2, 0 }, + { 0, 1 }, + { 0, 2 }, + { 1, 0 }, + { 2, 0 }, + { 0, 1 }, + { 0, 2 }, + { 3, 3 }, + { 4, 4 }, + { 3, 3 }, + { 4, 4 }, + { 0, 0 }, + { 0, 0 }, + { 0, 57088 }, +}; diff --git a/src/ride/track_data.h b/src/ride/track_data.h index e34d3f23ea..e477642fa2 100644 --- a/src/ride/track_data.h +++ b/src/ride/track_data.h @@ -30,3 +30,11 @@ extern const rct_preview_track *TrackBlocks[256]; extern const rct_preview_track *FlatRideTrackBlocks[255]; extern const uint8 TrackPieceLengths[256]; + +typedef struct { + uint16 next; + uint16 previous; +} track_curve_chain; + +extern const track_curve_chain gTrackCurveChain[256]; +extern const track_curve_chain gFlatRideTrackCurveChain[256]; diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 80a45d4668..d46e3de5ff 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1751,7 +1751,7 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) bankStart = _currentTrackBankEnd; b5 = _currentTrackCovered; b4 = _currentTrackLiftHill; - sub_6C9800(); + ride_construction_set_default_next_piece(); sub_6C84CE(); if (!sub_6CAF80(_currentRideIndex, &outputElement)) { sub_6CC3FB(_currentRideIndex); @@ -2575,8 +2575,8 @@ static void window_ride_construction_update_possible_ride_configurations() _numCurrentPossibleSpecialTrackPieces = 0; for (trackType = 0; trackType < 256; trackType++) { edx = ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? - RCT2_GLOBAL(0x0099849D + (trackType * 8), uint8) : - RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8); + gFlatRideTrackDefinitions[trackType].type : + gTrackDefinitions[trackType].type; if (edx == 0) continue; @@ -2592,19 +2592,19 @@ static void window_ride_construction_update_possible_ride_configurations() int slope, bank; if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT || _rideConstructionState == RIDE_CONSTRUCTION_STATE_PLACE) { if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { - slope = RCT2_GLOBAL(0x0099849F + (trackType * 8), uint8); - bank = RCT2_GLOBAL(0x009984A1 + (trackType * 8), uint8); + slope = gFlatRideTrackDefinitions[trackType].vangle_start; + bank = gFlatRideTrackDefinitions[trackType].bank_start; } else { - slope = RCT2_GLOBAL(0x00997C9F + (trackType * 8), uint8); - bank = RCT2_GLOBAL(0x00997CA1 + (trackType * 8), uint8); + slope = gTrackDefinitions[trackType].vangle_start; + bank = gTrackDefinitions[trackType].bank_start; } } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { - slope = RCT2_GLOBAL(0x0099849E + (trackType * 8), uint8); - bank = RCT2_GLOBAL(0x009984A0 + (trackType * 8), uint8); + slope = gFlatRideTrackDefinitions[trackType].vangle_end; + bank = gFlatRideTrackDefinitions[trackType].bank_end; } else { - slope = RCT2_GLOBAL(0x00997C9E + (trackType * 8), uint8); - bank = RCT2_GLOBAL(0x00997CA0 + (trackType * 8), uint8); + slope = gTrackDefinitions[trackType].vangle_end; + bank = gTrackDefinitions[trackType].bank_end; } } else { continue; @@ -2612,8 +2612,8 @@ static void window_ride_construction_update_possible_ride_configurations() if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { if ( - RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) == TRACK_HELIX_SMALL || - RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) == TRACK_HELIX_LARGE + gTrackDefinitions[trackType].type == TRACK_HELIX_SMALL || + gTrackDefinitions[trackType].type == TRACK_HELIX_LARGE ) { if (bank != _previousTrackBankEnd) { if (_previousTrackBankEnd != TRACK_BANK_NONE) From bb2374d6ad1488eccdea8ef8bedd1499d561046d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 13 Jul 2015 18:22:28 +0100 Subject: [PATCH 0274/1173] fix #1597 --- src/ride/ride_ratings.c | 211 ++++++++++++++++++++-------------------- 1 file changed, 108 insertions(+), 103 deletions(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index d25a41705d..67de73fa2c 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -40,21 +40,21 @@ enum { PROXIMITY_WATER_TOUCH, // 0x0138B598 PROXIMITY_WATER_LOW, // 0x0138B59A PROXIMITY_WATER_HIGH, // 0x0138B59C - PROXIMITY_SURFACE_NO_TOUCH, // 0x0138B59E + PROXIMITY_SURFACE_TOUCH, // 0x0138B59E PROXIMITY_PATH_OVER, // 0x0138B5A0 PROXIMITY_PATH_TOUCH_ABOVE, // 0x0138B5A2 PROXIMITY_PATH_TOUCH_UNDER, // 0x0138B5A4 PROXIMITY_138B5A6, // 0x0138B5A6 PROXIMITY_138B5A8, // 0x0138B5A8 - PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE, // 0x0138B5AA - PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE, // 0x0138B5AC - PROXIMITY_OWN_TRACK_ABOVE_OR_BELOW, // 0x0138B5AE - PROXIMITY_OWN_TRACK_TOUCH_ABOVE, // 0x0138B5B0 - PROXIMITY_OWN_TRACK_CLOSE_ABOVE, // 0x0138B5B2 + PROXIMITY_OWN_TRACK_TOUCH_ABOVE, // 0x0138B5AA + PROXIMITY_OWN_TRACK_CLOSE_ABOVE, // 0x0138B5AC + PROXIMITY_FOREIGN_TRACK_ABOVE_OR_BELOW, // 0x0138B5AE + PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE, // 0x0138B5B0 + PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE, // 0x0138B5B2 PROXIMITY_SCENERY_SIDE_BELOW, // 0x0138B5B4 PROXIMITY_SCENERY_SIDE_ABOVE, // 0x0138B5B6 - PROXIMITY_FOREIGN_STATION_TOUCH_ABOVE, // 0x0138B5B8 - PROXIMITY_FOREIGN_STATION_CLOSE_ABOVE, // 0x0138B5BA + PROXIMITY_OWN_STATION_TOUCH_ABOVE, // 0x0138B5B8 + PROXIMITY_OWN_STATION_CLOSE_ABOVE, // 0x0138B5BA PROXIMITY_TRACK_THROUGH_VERTICAL_LOOP, // 0x0138B5BC PROXIMITY_PATH_TROUGH_VERTICAL_LOOP, // 0x0138B5BE PROXIMITY_INTERSECTING_VERTICAL_LOOP, // 0x0138B5C0 @@ -75,6 +75,9 @@ typedef void (*ride_ratings_calculation)(rct_ride *ride); #define _rideRatingsProximityTrackType RCT2_GLOBAL(0x0138B592, uint8) #define _rideRatingsProximityBaseHeight RCT2_GLOBAL(0x0138B593, uint8) #define _rideRatingsProximityTotal RCT2_GLOBAL(0x0138B594, uint16) +#define _rideRatingsProximityStartX RCT2_GLOBAL(0x0138B58A, uint16) +#define _rideRatingsProximityStartY RCT2_GLOBAL(0x0138B58C, uint16) +#define _rideRatingsProximityStartZ RCT2_GLOBAL(0x0138B58E, uint16) static uint16 *_proximityScores = (uint16*)0x0138B596; @@ -86,7 +89,7 @@ static void ride_ratings_update_state_2(); static void ride_ratings_update_state_3(); static void ride_ratings_update_state_4(); static void ride_ratings_update_state_5(); -static void loc_6B5BB2(); +static void ride_ratings_begin_proximity_loop(); static void ride_ratings_calculate(rct_ride *ride); static void ride_ratings_calculate_value(rct_ride *ride); static void ride_ratings_score_close_proximity(rct_map_element *mapElement); @@ -154,51 +157,7 @@ static void ride_ratings_update_state_1() RCT2_GLOBAL(0x0138B5CC, uint16) = 0; _rideRatingsState = RIDE_RATINGS_STATE_2; RCT2_GLOBAL(0x0138B5CE, uint16) = 0; - loc_6B5BB2(); -} - -/** - * - * rct2: 0x006B5BB2 - */ -static void loc_6B5BB2() -{ - rct_ride *ride; - int i, x, y, z; - - ride = GET_RIDE(_rideRatingsCurrentRide); - if (ride->type == RIDE_TYPE_NULL || ride->status == RIDE_STATUS_CLOSED) { - _rideRatingsState = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; - return; - } - - if (ride->type == RIDE_TYPE_MAZE) { - _rideRatingsState = RIDE_RATINGS_STATE_CALCULATE; - return; - } - - for (i = 0; i < 4; i++) { - if (ride->station_starts[i] != 0xFFFF) { - RCT2_GLOBAL(0x0138B5CE, uint16) &= ~1; - if (ride->entrances[i] == 0xFFFF) - RCT2_GLOBAL(0x0138B5CE, uint16) |= 1; - - x = (ride->station_starts[i] & 0xFF) * 32; - y = (ride->station_starts[i] >> 8) * 32; - z = ride->station_heights[i] * 8; - - _rideRatingsProximityX = x; - _rideRatingsProximityY = y; - _rideRatingsProximityZ = z; - _rideRatingsProximityTrackType = 255; - RCT2_GLOBAL(0x0138B58A, uint16) = x; - RCT2_GLOBAL(0x0138B58C, uint16) = y; - RCT2_GLOBAL(0x0138B58E, uint16) = z; - return; - } - } - - _rideRatingsState = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + ride_ratings_begin_proximity_loop(); } /** @@ -230,8 +189,8 @@ static void ride_ratings_update_state_2() if (mapElement->base_height != z) continue; - if (trackType == 255 || (!(mapElement->properties.track.sequence & 0x0F) && trackType == mapElement->properties.track.type)) { - if (trackType == 1) { + if (trackType == 255 || ((mapElement->properties.track.sequence & 0x0F) == 0 && trackType == mapElement->properties.track.type)) { + if (trackType == TRACK_ELEM_END_STATION) { entranceIndex = (mapElement->properties.track.sequence >> 4) & 7; RCT2_GLOBAL(0x0138B5CE, uint16) &= ~1; if (ride->entrances[entranceIndex] == 0xFFFF) @@ -252,7 +211,7 @@ static void ride_ratings_update_state_2() y = nextTrackElement.y; z = nextTrackElement.element->base_height * 8; mapElement = nextTrackElement.element; - if (x == RCT2_GLOBAL(0x0138B58A, uint16) && y == RCT2_GLOBAL(0x0138B58C, uint16) && z == RCT2_GLOBAL(0x0138B58E, uint16)) { + if (x == _rideRatingsProximityStartX && y == _rideRatingsProximityStartY && z == _rideRatingsProximityStartZ) { _rideRatingsState = RIDE_RATINGS_STATE_CALCULATE; return; } @@ -260,6 +219,7 @@ static void ride_ratings_update_state_2() _rideRatingsProximityY = y; _rideRatingsProximityZ = z; _rideRatingsProximityTrackType = mapElement->properties.track.type; + return; } } while (!map_element_is_last_for_tile(mapElement++)); @@ -295,7 +255,7 @@ static void ride_ratings_update_state_3() static void ride_ratings_update_state_4() { _rideRatingsState = RIDE_RATINGS_STATE_5; - loc_6B5BB2(); + ride_ratings_begin_proximity_loop(); } /** @@ -339,7 +299,7 @@ static void ride_ratings_update_state_5() x = trackBeginEnd.begin_x; y = trackBeginEnd.begin_y; - if (x == RCT2_GLOBAL(0x0138B58A, uint16) && y == RCT2_GLOBAL(0x0138B58C, uint16) && z == RCT2_GLOBAL(0x0138B58E, uint16)) { + if (x == _rideRatingsProximityStartX && y == _rideRatingsProximityStartY && z == _rideRatingsProximityStartZ) { _rideRatingsState = RIDE_RATINGS_STATE_CALCULATE; return; } @@ -347,12 +307,57 @@ static void ride_ratings_update_state_5() _rideRatingsProximityY = y; _rideRatingsProximityZ = z; _rideRatingsProximityTrackType = mapElement->properties.track.type; + return; } } while (!map_element_is_last_for_tile(mapElement++)); _rideRatingsState = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; } +/** + * + * rct2: 0x006B5BB2 + */ +static void ride_ratings_begin_proximity_loop() +{ + rct_ride *ride; + int i, x, y, z; + + ride = GET_RIDE(_rideRatingsCurrentRide); + if (ride->type == RIDE_TYPE_NULL || ride->status == RIDE_STATUS_CLOSED) { + _rideRatingsState = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; + return; + } + + if (ride->type == RIDE_TYPE_MAZE) { + _rideRatingsState = RIDE_RATINGS_STATE_CALCULATE; + return; + } + + for (i = 0; i < 4; i++) { + if (ride->station_starts[i] != 0xFFFF) { + RCT2_GLOBAL(0x0138B5CE, uint16) &= ~1; + if (ride->entrances[i] == 0xFFFF) + RCT2_GLOBAL(0x0138B5CE, uint16) |= 1; + + x = (ride->station_starts[i] & 0xFF) * 32; + y = (ride->station_starts[i] >> 8) * 32; + z = ride->station_heights[i] * 8; + + _rideRatingsProximityX = x; + _rideRatingsProximityY = y; + _rideRatingsProximityZ = z; + _rideRatingsProximityTrackType = 255; + _rideRatingsProximityStartX = x; + _rideRatingsProximityStartY = y; + _rideRatingsProximityStartZ = z; + return; + } + } + + _rideRatingsState = RIDE_RATINGS_STATE_FIND_NEXT_RIDE; +} + static void proximity_score_increment(int type) { _proximityScores[type]++; @@ -484,8 +489,8 @@ static void ride_ratings_score_close_proximity(rct_map_element *inputMapElement) switch (map_element_get_type(mapElement)) { case MAP_ELEMENT_TYPE_SURFACE: _rideRatingsProximityBaseHeight = mapElement->base_height; - if (mapElement->base_height * 8 != _rideRatingsProximityZ) { - proximity_score_increment(PROXIMITY_SURFACE_NO_TOUCH); + if (mapElement->base_height * 8 == _rideRatingsProximityZ) { + proximity_score_increment(PROXIMITY_SURFACE_TOUCH); } waterHeight = (mapElement->properties.surface.terrain & 0x1F); if (waterHeight != 0) { @@ -507,7 +512,7 @@ static void ride_ratings_score_close_proximity(rct_map_element *inputMapElement) } break; case MAP_ELEMENT_TYPE_PATH: - if (inputMapElement->properties.path.type & 0xF0) { + if (mapElement->properties.path.type & 0xF0) { if (mapElement->clearance_height == inputMapElement->base_height) { proximity_score_increment(PROXIMITY_138B5A6); } @@ -536,22 +541,22 @@ static void ride_ratings_score_close_proximity(rct_map_element *inputMapElement) } } } - if (inputMapElement->properties.track.ride_index == mapElement->properties.track.ride_index) { - proximity_score_increment(PROXIMITY_OWN_TRACK_ABOVE_OR_BELOW); + if (inputMapElement->properties.track.ride_index != mapElement->properties.track.ride_index) { + proximity_score_increment(PROXIMITY_FOREIGN_TRACK_ABOVE_OR_BELOW); if (mapElement->clearance_height == inputMapElement->base_height) { - proximity_score_increment(PROXIMITY_OWN_TRACK_TOUCH_ABOVE); + proximity_score_increment(PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE); } if (mapElement->clearance_height + 2 <= inputMapElement->base_height) { if (mapElement->clearance_height + 10 >= inputMapElement->base_height) { - proximity_score_increment(PROXIMITY_OWN_TRACK_CLOSE_ABOVE); + proximity_score_increment(PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE); } } if (inputMapElement->clearance_height == mapElement->base_height) { - proximity_score_increment(PROXIMITY_OWN_TRACK_TOUCH_ABOVE); + proximity_score_increment(PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE); } if (inputMapElement->clearance_height + 2 == mapElement->base_height) { if (inputMapElement->clearance_height + 10 >= mapElement->base_height) { - proximity_score_increment(PROXIMITY_OWN_TRACK_CLOSE_ABOVE); + proximity_score_increment(PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE); } } } else { @@ -562,31 +567,31 @@ static void ride_ratings_score_close_proximity(rct_map_element *inputMapElement) trackType == TRACK_ELEM_BEGIN_STATION ); if (mapElement->clearance_height == inputMapElement->base_height) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE); + proximity_score_increment(PROXIMITY_OWN_TRACK_TOUCH_ABOVE); if (isStation) { - proximity_score_increment(PROXIMITY_FOREIGN_STATION_TOUCH_ABOVE); + proximity_score_increment(PROXIMITY_OWN_STATION_TOUCH_ABOVE); } } if (mapElement->clearance_height + 2 <= inputMapElement->base_height) { if (mapElement->clearance_height + 10 >= inputMapElement->base_height) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE); + proximity_score_increment(PROXIMITY_OWN_TRACK_CLOSE_ABOVE); if (isStation) { - proximity_score_increment(PROXIMITY_FOREIGN_STATION_CLOSE_ABOVE); + proximity_score_increment(PROXIMITY_OWN_STATION_CLOSE_ABOVE); } } } if (inputMapElement->clearance_height == mapElement->base_height) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE); + proximity_score_increment(PROXIMITY_OWN_TRACK_TOUCH_ABOVE); if (isStation) { - proximity_score_increment(PROXIMITY_FOREIGN_STATION_TOUCH_ABOVE); + proximity_score_increment(PROXIMITY_OWN_STATION_TOUCH_ABOVE); } } if (inputMapElement->clearance_height + 2 <= mapElement->base_height) { if (inputMapElement->clearance_height + 10 >= mapElement->base_height) { - proximity_score_increment(PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE); + proximity_score_increment(PROXIMITY_OWN_TRACK_CLOSE_ABOVE); if (isStation) { - proximity_score_increment(PROXIMITY_FOREIGN_STATION_CLOSE_ABOVE); + proximity_score_increment(PROXIMITY_OWN_STATION_CLOSE_ABOVE); } } } @@ -883,7 +888,7 @@ static uint32 get_proximity_score_helper_2(uint16 x, uint16 additionIfNotZero, u { uint32 result = x; if (result != 0) result += additionIfNotZero; - return (max(result, max) * multiplier) >> 16; + return (min(result, max) * multiplier) >> 16; } static uint32 get_proximity_score_helper_3(uint16 x, uint16 resultIfNotZero) @@ -898,32 +903,32 @@ static uint32 get_proximity_score_helper_3(uint16 x, uint16 resultIfNotZero) static uint32 ride_ratings_get_proximity_score() { uint32 result = 0; - result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_OVER ] , 60, 0x00AAAA); - result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_TOUCH ] , 22, 0x0245D1); - result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_LOW ] , 10, 0x020000); - result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_HIGH ] , 40, 0x00A000); - result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_SURFACE_NO_TOUCH ] , 70, 0x01B6DB); - result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_PATH_OVER ] + 8, 12, 0x064000); - result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_PATH_TOUCH_ABOVE ] , 40 ); - result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_PATH_TOUCH_UNDER ] , 45 ); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5A6 ] , 10, 20, 0x03C000); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5A8 ] , 10, 20, 0x044000); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE ] , 10, 15, 0x035555); - result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE ] , 5, 0x060000); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_OWN_TRACK_ABOVE_OR_BELOW ] , 10, 15, 0x02AAAA); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_OWN_TRACK_TOUCH_ABOVE ] , 10, 15, 0x04AAAA); - result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_OWN_TRACK_CLOSE_ABOVE ] , 5, 0x090000); - result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_SCENERY_SIDE_BELOW ] , 35, 0x016DB6); - result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_SCENERY_SIDE_ABOVE ] , 35, 0x00DB6D); - result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_FOREIGN_STATION_TOUCH_ABOVE] , 55 ); - result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_FOREIGN_STATION_CLOSE_ABOVE] , 25 ); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_TRACK_THROUGH_VERTICAL_LOOP] , 4, 6, 0x140000); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_PATH_TROUGH_VERTICAL_LOOP ] , 4, 6, 0x0F0000); - result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_INTERSECTING_VERTICAL_LOOP ] , 100 ); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_THROUGH_VERTICAL_LOOP ] , 4, 6, 0x0A0000); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_PATH_SIDE_CLOSE ] , 10, 20, 0x01C000); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_FOREIGN_TRACK_SIDE_CLOSE ] , 10, 20, 0x024000); - result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_SURFACE_SIDE_CLOSE ] , 10, 20, 0x028000); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_OVER ] , 60, 0x00AAAA); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_TOUCH ] , 22, 0x0245D1); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_LOW ] , 10, 0x020000); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_WATER_HIGH ] , 40, 0x00A000); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_SURFACE_TOUCH ] , 70, 0x01B6DB); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_PATH_OVER ] + 8, 12, 0x064000); + result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_PATH_TOUCH_ABOVE ] , 40 ); + result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_PATH_TOUCH_UNDER ] , 45 ); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5A6 ] , 10, 20, 0x03C000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_138B5A8 ] , 10, 20, 0x044000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_OWN_TRACK_TOUCH_ABOVE ] , 10, 15, 0x035555); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_OWN_TRACK_CLOSE_ABOVE ] , 5, 0x060000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_FOREIGN_TRACK_ABOVE_OR_BELOW] , 10, 15, 0x02AAAA); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_FOREIGN_TRACK_TOUCH_ABOVE ] , 10, 15, 0x04AAAA); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_FOREIGN_TRACK_CLOSE_ABOVE ] , 5, 0x090000); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_SCENERY_SIDE_BELOW ] , 35, 0x016DB6); + result += get_proximity_score_helper_1(_proximityScores[PROXIMITY_SCENERY_SIDE_ABOVE ] , 35, 0x00DB6D); + result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_OWN_STATION_TOUCH_ABOVE ] , 55 ); + result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_OWN_STATION_CLOSE_ABOVE ] , 25 ); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_TRACK_THROUGH_VERTICAL_LOOP ] , 4, 6, 0x140000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_PATH_TROUGH_VERTICAL_LOOP ] , 4, 6, 0x0F0000); + result += get_proximity_score_helper_3(_proximityScores[PROXIMITY_INTERSECTING_VERTICAL_LOOP ] , 100 ); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_THROUGH_VERTICAL_LOOP ] , 4, 6, 0x0A0000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_PATH_SIDE_CLOSE ] , 10, 20, 0x01C000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_FOREIGN_TRACK_SIDE_CLOSE ] , 10, 20, 0x024000); + result += get_proximity_score_helper_2(_proximityScores[PROXIMITY_SURFACE_SIDE_CLOSE ] , 10, 20, 0x028000); return result; } From 5cda9af81f25dbb056dac36f3eae70895e2baa15 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 13 Jul 2015 19:51:46 +0100 Subject: [PATCH 0275/1173] implement window_staff_list_tooldown --- src/interface/window.h | 2 +- src/localisation/string_ids.h | 2 + src/peep/staff.c | 14 +++++++ src/peep/staff.h | 4 ++ src/windows/staff.c | 5 ++- src/windows/staff_list.c | 69 +++++++++++++++++++++++++++++------ 6 files changed, 82 insertions(+), 14 deletions(-) diff --git a/src/interface/window.h b/src/interface/window.h index 3d20200d32..347df9c53f 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -579,7 +579,7 @@ void window_options_open(); void window_shortcut_keys_open(); void window_shortcut_change_open(int selected_key); void window_guest_open(rct_peep* peep); -void window_staff_open(rct_peep* peep); +rct_window *window_staff_open(rct_peep* peep); void window_staff_fire_prompt_open(rct_peep* peep); void window_park_awards_open(); void window_park_entrance_open(); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index e367ce7d39..d3a1bdd0cd 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -809,6 +809,8 @@ enum { STR_DOWN_TIME_LABEL_1889 = 1889, STR_SELECT_HOW_OFTEN_A_MECHANIC_SHOULD_CHECK_THIS_RIDE = 1890, + STR_NO_THING_IN_PARK_YET = 1891, + STR_ITEMS_SOLD = 1894, STR_BUILD_RIDE_TIP = 1895, STR_FINANCES_SUMMARY_EXPENDITURE_INCOME = 1896, diff --git a/src/peep/staff.c b/src/peep/staff.c index f35a93239b..11cf6b1966 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -29,6 +29,9 @@ #include "peep.h" #include "staff.h" +uint32 *gStaffPatrolAreas = (uint32*)0x013B0E72; +uint8 *gStaffModes = (uint8*)0x013CA672; + /** * * rct2: 0x00669E55 @@ -451,3 +454,14 @@ void staff_reset_stats() peep->staff_bins_emptied = 0; } } + +bool staff_is_patrol_area_set(int staffIndex, int x, int y) +{ + x = (x & 0x1F80) >> 7; + y = (y & 0x1F80) >> 1; + + int peepOffset = staffIndex * 128; + int offset = (x | y) >> 5; + int bitIndex = (x | y) & 0x1F; + return gStaffPatrolAreas[peepOffset + offset] & (1 << bitIndex); +} diff --git a/src/peep/staff.h b/src/peep/staff.h index 51467efecc..42303f33f7 100644 --- a/src/peep/staff.h +++ b/src/peep/staff.h @@ -49,6 +49,9 @@ enum STAFF_ORDERS{ STAFF_ORDERS_FIX_RIDES = (1 << 1) }; +extern uint32 *gStaffPatrolAreas; +extern uint8 *gStaffModes; + void game_command_update_staff_colour(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_hire_new_staff_member(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_staff_order(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); @@ -60,5 +63,6 @@ uint16 hire_new_staff_member(uint8 staffType); void staff_update_greyed_patrol_areas(); int mechanic_is_location_in_patrol(rct_peep *mechanic, int x, int y); void staff_reset_stats(); +bool staff_is_patrol_area_set(int staffIndex, int x, int y); #endif \ No newline at end of file diff --git a/src/windows/staff.c b/src/windows/staff.c index de7e41d4ef..eddac342b5 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -297,7 +297,7 @@ uint32 window_staff_page_enabled_widgets[] = { * * rct2: 0x006BEE98 */ -void window_staff_open(rct_peep* peep) +rct_window *window_staff_open(rct_peep* peep) { rct_window* w = window_bring_to_front_by_number(WC_PEEP, peep->sprite_index); if (w == NULL) { @@ -318,7 +318,6 @@ void window_staff_open(rct_peep* peep) w->min_height = WH; w->max_width = 500; w->max_height = 450; - } w->page = 0; window_invalidate(w); @@ -333,6 +332,8 @@ void window_staff_open(rct_peep* peep) window_staff_viewport_init(w); if (g_sprite_list[w->number].peep.state == PEEP_STATE_PICKED) window_event_mouse_up_call(w, WIDX_CHECKBOX_3); + + return w; } /** diff --git a/src/windows/staff_list.c b/src/windows/staff_list.c index 1da2146008..68c3b8134a 100644 --- a/src/windows/staff_list.c +++ b/src/windows/staff_list.c @@ -23,16 +23,18 @@ #include "../game.h" #include "../drawing/drawing.h" #include "../input.h" +#include "../interface/themes.h" #include "../interface/viewport.h" #include "../interface/widget.h" #include "../interface/window.h" #include "../localisation/localisation.h" #include "../peep/peep.h" #include "../peep/staff.h" +#include "../sprites.h" +#include "../world/footpath.h" #include "../world/sprite.h" #include "dropdown.h" -#include "../interface/themes.h" -#include "../sprites.h" +#include "error.h" enum { WINDOW_STAFF_LIST_TAB_HANDYMEN, @@ -216,14 +218,11 @@ static void window_staff_list_mouseup(rct_window *w, int widgetIndex) break; case WIDX_STAFF_LIST_SHOW_PATROL_AREA_BUTTON: - RCT2_CALLPROC_X(0x006BD9FF, 0, 0, 0, widgetIndex, (int)w, 0, 0); - - // TODO: The code below works, but due to some funny things, when clicking again on the show patrol area button to disable the tool, - // the mouseup event is getting called when it should not be - //tool_set(w, WIDX_STAFF_LIST_SHOW_PATROL_AREA_BUTTON, 0x0C); - //show_gridlines(); - //RCT2_GLOBAL(0x009DEA50, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8) | 0x8000; - //gfx_invalidate_screen(); + if (!tool_set(w, WIDX_STAFF_LIST_SHOW_PATROL_AREA_BUTTON, 12)) { + show_gridlines(); + RCT2_GLOBAL(0x009DEA50, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8) | 0x8000; + gfx_invalidate_screen(); + } break; case WIDX_STAFF_LIST_MAP: window_map_open(); @@ -327,7 +326,55 @@ void window_staff_list_update(rct_window *w) */ static void window_staff_list_tooldown(rct_window *w, int widgetIndex, int x, int y) { - RCT2_CALLPROC_X(0x006BD990, x, y, 0, widgetIndex, (int)w, 0, 0); + int direction, distance, closestPeepDistance, selectedPeepType; + rct_map_element *mapElement; + rct_peep *peep, *closestPeep; + uint16 spriteIndex; + + if (widgetIndex == WIDX_STAFF_LIST_SHOW_PATROL_AREA_BUTTON) { + selectedPeepType = RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_STAFF_LIST_SELECTED_TAB, uint8); + + footpath_get_coordinates_from_pos(x, y, &x, &y, &direction, &mapElement); + if (x == 0x8000) + return; + + bool isPatrolAreaSet = staff_is_patrol_area_set(200 + selectedPeepType, x, y); + + closestPeep = NULL; + closestPeepDistance = INT_MAX; + FOR_ALL_STAFF(spriteIndex, peep) { + if (peep->staff_type != selectedPeepType) + continue; + + if (isPatrolAreaSet) { + if (!(gStaffModes[peep->staff_id] & 2)) { + continue; + } + if (!mechanic_is_location_in_patrol(peep, x, y)) { + continue; + } + } + + if (peep->x == (sint16)0x8000) { + continue; + } + + distance = abs(x - peep->x) + abs(y - peep->y); + if (distance < closestPeepDistance) { + closestPeepDistance = distance; + closestPeep = peep; + } + } + + if (closestPeep != NULL) { + tool_cancel(); + rct_window *staffWindow = window_staff_open(closestPeep); + window_event_dropdown_call(staffWindow, 11, 0); + } else { + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, rct_string_id) = STR_HANDYMAN_PLURAL + selectedPeepType; + window_error_open(STR_NO_THING_IN_PARK_YET, STR_NONE); + } + } } /** From b2d620bb9d288fa753f7f818e4afbdc43af01758 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 13 Jul 2015 20:43:17 +0100 Subject: [PATCH 0276/1173] implement window_ride_measurements_tooldown and refactor track save scenery --- src/localisation/string_ids.h | 3 ++ src/ride/track.c | 93 +++++++++++++++++++++++------------ src/ride/track.h | 3 ++ src/windows/ride.c | 18 +++++-- 4 files changed, 83 insertions(+), 34 deletions(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index d3a1bdd0cd..2e145c2c6e 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1677,6 +1677,9 @@ enum { STR_TUTORIAL_CUSTOM_RIDES = 3386, STR_TUTORIAL_ROLLER_COASTER = 3387, + STR_SAVE_TRACK_SCENERY_UNABLE_TO_SELECT_ADDITIONAL_ITEM_OF_SCENERY = 3389, + STR_SAVE_TRACK_SCENERY_TOO_MANY_ITEMS_SELECTED = 3390, + STR_OBJECTIVE_2_NONE = 2397, STR_OBJECTIVE_2_NUMBER_OF_GUESTS_AT_A_GIVEN_DATE = STR_OBJECTIVE_2_NONE + 1, STR_OBJECTIVE_2_PARK_VALUE_AT_A_GIVEN_DATE = STR_OBJECTIVE_2_NONE + 2, diff --git a/src/ride/track.c b/src/ride/track.c index 22fe6ab0d5..8bcf72593f 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -239,9 +239,11 @@ const rct_trackdefinition gTrackDefinitions_INCORRECT[] = { { TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_LEFT_LARGE_HALF_LOOP_DOWN }; +rct_map_element **gTrackSavedMapElements = (rct_map_element**)0x00F63674; + static bool track_save_should_select_scenery_around(int rideIndex, rct_map_element *mapElement); static void track_save_select_nearby_scenery_for_tile(int rideIndex, int cx, int cy); -static void track_save_add_map_element(int mapElementSelectType, int x, int y, rct_map_element *mapElement); +static bool track_save_add_map_element(int interactionType, int x, int y, rct_map_element *mapElement); uint32* sub_6AB49A(rct_object_entry* entry){ rct_object_entry* object_list_entry = object_list_find(entry); @@ -3323,13 +3325,60 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int */ void track_save_reset_scenery() { - rct_map_element **savedMapElements = (rct_map_element**)0x00F63674; - RCT2_GLOBAL(0x009DA193, uint8) = 255; - savedMapElements[0] = (rct_map_element*)0xFFFFFFFF; + gTrackSavedMapElements[0] = (rct_map_element*)0xFFFFFFFF; gfx_invalidate_screen(); } +static bool track_save_contains_map_element(rct_map_element *mapElement) +{ + rct_map_element **savedMapElement; + + savedMapElement = gTrackSavedMapElements; + do { + if (*savedMapElement == mapElement) { + return true; + } + } while (*savedMapElement++ != (rct_map_element*)-1); + return false; +} + +/** + * + * rct2: 0x006D2B3C + */ +static bool track_save_add_map_element(int interactionType, int x, int y, rct_map_element *mapElement) +{ + return !(RCT2_CALLPROC_X(0x006D2B3C, x, interactionType | (0 << 8), y, (int)mapElement, 0, 0, 0) & 0x100); +} + +/** + * + * rct2: 0x006D2B3C + */ +static void track_save_remove_map_element(int interactionType, int x, int y, rct_map_element *mapElement) +{ + RCT2_CALLPROC_X(0x006D2B3C, x, interactionType | (1 << 8), y, (int)mapElement, 0, 0, 0); +} + +/** + * + * rct2: 0x006D2B07 + */ +void track_save_toggle_map_element(int interactionType, int x, int y, rct_map_element *mapElement) +{ + if (track_save_contains_map_element(mapElement)) { + track_save_remove_map_element(interactionType, x, y, mapElement); + } else { + if (!track_save_add_map_element(interactionType, x, y, mapElement)) { + window_error_open( + STR_SAVE_TRACK_SCENERY_UNABLE_TO_SELECT_ADDITIONAL_ITEM_OF_SCENERY, + STR_SAVE_TRACK_SCENERY_TOO_MANY_ITEMS_SELECTED + ); + } + } +} + /** * * rct2: 0x006D303D @@ -3383,53 +3432,35 @@ static void track_save_select_nearby_scenery_for_tile(int rideIndex, int cx, int for (int x = cx - 1; x <= cx + 1; x++) { mapElement = map_get_first_element_at(x, y); do { - int mapElementSelectType = 0; + int interactionType = VIEWPORT_INTERACTION_ITEM_NONE; switch (map_element_get_type(mapElement)) { case MAP_ELEMENT_TYPE_PATH: if (!(mapElement->type & 1)) - mapElementSelectType = 6; + interactionType = VIEWPORT_INTERACTION_ITEM_FOOTPATH; else if (mapElement->properties.path.addition_status == rideIndex) - mapElementSelectType = 6; + interactionType = VIEWPORT_INTERACTION_ITEM_FOOTPATH; break; case MAP_ELEMENT_TYPE_SCENERY: - mapElementSelectType = 5; + interactionType = VIEWPORT_INTERACTION_ITEM_SCENERY; break; case MAP_ELEMENT_TYPE_FENCE: - mapElementSelectType = 9; + interactionType = VIEWPORT_INTERACTION_ITEM_WALL; break; case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: - mapElementSelectType = 10; + interactionType = VIEWPORT_INTERACTION_ITEM_LARGE_SCENERY; break; } - if (mapElementSelectType != 0) { - bool mapElementAlreadySelected = false; - rct_map_element **savedMapElement = (rct_map_element**)0x00F63674; - while (*savedMapElement != (rct_map_element*)0xFFFFFFFF) { - if (*savedMapElement == mapElement) { - mapElementAlreadySelected = true; - break; - } - savedMapElement++; + if (interactionType != VIEWPORT_INTERACTION_ITEM_NONE) { + if (!track_save_contains_map_element(mapElement)) { + track_save_add_map_element(interactionType, x * 32, y * 32, mapElement); } - - if (!mapElementAlreadySelected) - track_save_add_map_element(mapElementSelectType, x * 32, y * 32, mapElement); } } while (!map_element_is_last_for_tile(mapElement++)); } } } -/** - * - * rct2: 0x006D2B3C - */ -static void track_save_add_map_element(int mapElementSelectType, int x, int y, rct_map_element *mapElement) -{ - RCT2_CALLPROC_X(0x006D2B3C, x, mapElementSelectType, y, (int)mapElement, 0, 0, 0); -} - const rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType) { return ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? diff --git a/src/ride/track.h b/src/ride/track.h index df71a307c7..89a302f241 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -493,6 +493,8 @@ typedef struct { extern const rct_trackdefinition *gFlatRideTrackDefinitions; extern const rct_trackdefinition *gTrackDefinitions; +extern rct_map_element **gTrackSavedMapElements; + void track_load_list(ride_list_item item); int sub_67726A(const char *path); rct_track_design *track_get_info(int index, uint8** preview); @@ -511,6 +513,7 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int void track_save_reset_scenery(); void track_save_select_nearby_scenery(int rideIndex); +void track_save_toggle_map_element(int interactionType, int x, int y, rct_map_element *mapElement); const rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType); const rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType); diff --git a/src/windows/ride.c b/src/windows/ride.c index 3981ffa009..0620dd2c4b 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -4539,7 +4539,7 @@ static void setup_scenery_selection(rct_window* w){ RCT2_GLOBAL(0x00F64DE8, uint8) = (uint8)w->number; RCT2_GLOBAL(0x009DA193, uint8) = 0xFF; - RCT2_GLOBAL(0x00F63674, sint32) = -1; + gTrackSavedMapElements[0] = (rct_map_element*)-1; RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) |= (1 << 2); RCT2_GLOBAL(0x009DEA6F, uint8) |= 1; @@ -4706,11 +4706,23 @@ static void window_ride_measurements_update(rct_window *w) /** * - * rct2: 0x006AD4EB + * rct2: 0x006D2AE7 */ static void window_ride_measurements_tooldown(rct_window *w, int widgetIndex, int x, int y) { - RCT2_CALLPROC_X(0x006D2AE7, x, y, 0, widgetIndex, (int)w, 0, 0); + rct_map_element *mapElement; + sint16 mapX, mapY; + int interactionType; + + get_map_coordinates_from_pos(x, y, 0xFCCF, &mapX, &mapY, &interactionType, &mapElement, NULL); + switch (interactionType) { + case VIEWPORT_INTERACTION_ITEM_SCENERY: + case VIEWPORT_INTERACTION_ITEM_LARGE_SCENERY: + case VIEWPORT_INTERACTION_ITEM_WALL: + case VIEWPORT_INTERACTION_ITEM_FOOTPATH: + track_save_toggle_map_element(interactionType, mapX, mapY, mapElement); + break; + } } /** From 8504486b283fe1dd3f88460ec637b065f1a24e1d Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 13 Jul 2015 21:09:36 +0100 Subject: [PATCH 0277/1173] Fix entrance/exit placement. Fixes #1591 --- src/interface/viewport.c | 4 ++-- src/ride/ride.c | 26 ++++++++++++-------------- src/ride/track.c | 16 ++++++++-------- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 6c40f26334..cea49c6928 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1578,8 +1578,8 @@ void map_element_paint_setup(int x, int y) RCT2_GLOBAL(0x9DE56A, uint16) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) && RCT2_GLOBAL(0x9DE56E, uint16) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16)){ uint8 arrowRotation = - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) - + (RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) & 3) & 3; + (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + + (RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) & 3)) & 3; uint32 imageId = arrowRotation + diff --git a/src/ride/ride.c b/src/ride/ride.c index 2b751a364f..3407b7e0ba 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5291,6 +5291,8 @@ void ride_get_entrance_or_exit_position_from_screen_position(int screenX, int sc word_F4418E = mapY; RCT2_GLOBAL(0x00F44188, uint16) = floor2(mapX, 32); RCT2_GLOBAL(0x00F4418A, uint16) = floor2(mapY, 32); + *outX = RCT2_GLOBAL(0x00F44188, uint16); + *outY = RCT2_GLOBAL(0x00F4418A, uint16); if (ride->type == RIDE_TYPE_NULL) return; @@ -5311,8 +5313,8 @@ void ride_get_entrance_or_exit_position_from_screen_position(int screenX, int sc } for (int i = 0; i < 4; i++) { - mapX = word_F4418C + TileDirectionDelta[direction].x; - mapY = word_F4418E + TileDirectionDelta[direction].y; + mapX = RCT2_GLOBAL(0x00F44188, uint16) + TileDirectionDelta[direction].x; + mapY = RCT2_GLOBAL(0x00F4418A, uint16) + TileDirectionDelta[direction].y; if (mapX >= 0 && mapY >= 0 && mapX < (256 * 32) && mapY < (256 * 32)) { mapElement = map_get_first_element_at(mapX >> 5, mapY >> 5); do { @@ -5323,9 +5325,8 @@ void ride_get_entrance_or_exit_position_from_screen_position(int screenX, int sc if (mapElement->properties.track.ride_index != RCT2_GLOBAL(0x00F44192, uint8)) continue; if (mapElement->properties.track.type == 101) { - RCT2_GLOBAL(0x00F44194, uint8) = direction ^ 2; - *outX = mapX; - *outY = mapY; + RCT2_GLOBAL(0x00F44194, uint8) = direction; + *outDirection = direction ^ 2; return; } if (map_get_station(mapElement) != RCT2_GLOBAL(0x00F44193, uint8)) @@ -5333,16 +5334,16 @@ void ride_get_entrance_or_exit_position_from_screen_position(int screenX, int sc int ebx = (mapElement->properties.track.type << 4) + (mapElement->properties.track.sequence & 0x0F); int eax = (direction + 2 - mapElement->type) & MAP_ELEMENT_DIRECTION_MASK; - if (RCT2_ADDRESS(0x0099CA64, uint8)[ebx] & eax) { - RCT2_GLOBAL(0x00F44194, uint8) = direction ^ 2; - *outX = mapX; - *outY = mapY; + if (RCT2_ADDRESS(0x0099CA64, uint8)[ebx] & (1 << eax)) { + RCT2_GLOBAL(0x00F44194, uint8) = direction; + *outDirection = direction ^ 2; return; } } while (!map_element_is_last_for_tile(mapElement++)); } direction = (direction + 1) & 3; } + RCT2_GLOBAL(0x00F44194, uint8) = 0xFF; } else { mapX = (stationStartXY & 0xFF) * 32; mapY = (stationStartXY >> 8) * 32; @@ -5387,13 +5388,10 @@ void ride_get_entrance_or_exit_position_from_screen_position(int screenX, int sc entranceMaxY = mapY; } - mapX = RCT2_GLOBAL(0x00F44188, uint16); - mapY = RCT2_GLOBAL(0x00F4418A, uint16); - direction = loc_6CD18E(mapX, mapY, entranceMinX - 32, entranceMinY - 32, entranceMaxX + 32, entranceMaxY + 32); + direction = loc_6CD18E(*outX, *outY, entranceMinX - 32, entranceMinY - 32, entranceMaxX + 32, entranceMaxY + 32); if (direction != -1 && direction != stationDirection && direction != (stationDirection ^ 2)) { RCT2_GLOBAL(0x00F44194, uint8) = direction; - *outX = mapX; - *outY = mapY; + *outDirection = direction; return; } } diff --git a/src/ride/track.c b/src/ride/track.c index 8bcf72593f..4f91fb9755 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1328,11 +1328,11 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac { if (RCT2_GLOBAL(0x00F440D4, uint8) == 0){ gMapSelectionTiles->x = -1; - RCT2_GLOBAL(0x009DEA48, sint16) = x; - RCT2_GLOBAL(0x009DEA4A, sint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, sint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, sint16) = y; - RCT2_GLOBAL(0x009DEA4C, sint16) = map_element_height(x, y) & 0xFFFF; - RCT2_GLOBAL(0x009DEA4E, uint8) = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, sint16) = map_element_height(x, y) & 0xFFFF; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); } RCT2_GLOBAL(0x00F440D5, uint32) = 0; @@ -1513,11 +1513,11 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac if (RCT2_GLOBAL(0x00F440D4, uint8) == 0){ gMapSelectionTiles->x = -1; - RCT2_GLOBAL(0x009DEA48, sint16) = x; - RCT2_GLOBAL(0x009DEA4A, sint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, sint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, sint16) = y; - RCT2_GLOBAL(0x009DEA4C, sint16) = map_element_height(x, y) & 0xFFFF; - RCT2_GLOBAL(0x009DEA4E, uint8) = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, sint16) = map_element_height(x, y) & 0xFFFF; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); } RCT2_GLOBAL(0x00F440D5, uint32) = 0; From 23bb22c3af57bb8697692245568f55dedf5b4cc8 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 13 Jul 2015 21:18:55 +0100 Subject: [PATCH 0278/1173] Add check for ghost entrance removal. Fixes #1601 --- src/ride/ride.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ride/ride.c b/src/ride/ride.c index 3407b7e0ba..9c98b5b636 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -6149,6 +6149,9 @@ money32 remove_ride_entrance_or_exit(sint16 x, sint16 y, uint8 rideIndex, uint8 if (mapElement->base_height != ride->station_heights[station_num]) continue; + if (flags & (1 << 5) && !(mapElement->flags & MAP_ELEMENT_FLAG_GHOST)) + continue; + found = 1; break; } while (!map_element_is_last_for_tile(mapElement++)); From 118b9ea2ac42c1acac1b3cfe1dcb6122f025dffe Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 13 Jul 2015 21:43:54 +0100 Subject: [PATCH 0279/1173] fix tile inspector --- src/windows/tile_inspector.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/windows/tile_inspector.c b/src/windows/tile_inspector.c index c612c9ad88..54fac90b7a 100644 --- a/src/windows/tile_inspector.c +++ b/src/windows/tile_inspector.c @@ -167,17 +167,19 @@ static void window_tile_inspector_tool_update(rct_window* w, int widgetIndex, in map_invalidate_selection_rect(); RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 0); - screen_pos_to_map_pos(&mapX, &mapY, &direction); - if (x == (short)0x8000) { + mapX = x; + mapY = y; + screen_pos_to_map_pos(&mapX, &mapY, &direction); + if (mapX == (short)0x8000) { return; } RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= (1 << 0); - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16) = x; - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16) = y; - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, sint16) = x; - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16) = mapX; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16) = mapY; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, sint16) = mapX; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16) = mapY; RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16) = 4; map_invalidate_selection_rect(); @@ -189,14 +191,15 @@ static void window_tile_inspector_tool_down(rct_window* w, int widgetIndex, int int direction; short mapX, mapY; + mapX = x; + mapY = y; screen_pos_to_map_pos(&mapX, &mapY, &direction); - - if (x == (short)0x8000) { + if (mapX == (short)0x8000) { return; } - window_tile_inspector_tile_x = x >> 5; - window_tile_inspector_tile_y = y >> 5; + window_tile_inspector_tile_x = mapX >> 5; + window_tile_inspector_tile_y = mapY >> 5; rct_map_element *element = map_get_first_element_at(window_tile_inspector_tile_x, window_tile_inspector_tile_y); int numItems = 0; From af5aab97bc29d788601b0a6c3cc190d091203349 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 13 Jul 2015 22:04:47 +0100 Subject: [PATCH 0280/1173] Fix ride construction auto entrance selection --- src/ride/ride.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 9c98b5b636..832acac9de 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1276,7 +1276,7 @@ static void ride_construction_reset_current_piece() rct_ride *ride; ride = GET_RIDE(_currentRideIndex); - if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_15) || ride->num_stations != 0) { + if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_15) || ride->num_stations == 0) { _currentTrackCurve = RCT2_GLOBAL(0x0097CC68 + (ride->type * 2), uint8) | 0x100; _currentTrackSlopeEnd = 0; _currentTrackBankEnd = 0; From 345b71f8a4725c57832adf4b5a478c573169c8be Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 13 Jul 2015 23:49:39 +0100 Subject: [PATCH 0281/1173] implement rct1_clear_extra_sprite_entries and rct1_clear_extra_tile_entries --- projects/openrct2.vcxproj.user | 3 +- src/rct1.c | 94 +++++++++++++++++++++++++++++----- src/world/map.c | 2 + src/world/map.h | 4 ++ 4 files changed, 88 insertions(+), 15 deletions(-) diff --git a/projects/openrct2.vcxproj.user b/projects/openrct2.vcxproj.user index 33fff921b3..02863ba3d9 100644 --- a/projects/openrct2.vcxproj.user +++ b/projects/openrct2.vcxproj.user @@ -4,8 +4,7 @@ $(TargetDir) WindowsLocalDebugger $(TargetDir)\openrct2.exe - - + edit "C:\Users\Ted\Desktop\rct1ll\Scenarios\sc0.sc4" $(TargetDir) diff --git a/src/rct1.c b/src/rct1.c index b3da57080c..7f5dba32d6 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -53,8 +53,8 @@ static void rct1_reset_research(); static void sub_69F06A(); static void sub_666DFD(); -static void sub_69F007(); -static void sub_69F44B(); +static void rct1_clear_extra_sprite_entries(); +static void rct1_clear_extra_tile_entries(); static void sub_69F143(); static void sub_69F2D0(); static void sub_69F3AB(); @@ -190,7 +190,7 @@ void rct1_fix_landscape() rct_sprite *sprite; rct_ride *ride; - sub_69F007(); + rct1_clear_extra_sprite_entries(); // Free sprite user strings for (i = 0; i < MAX_SPRITES; i++) { @@ -210,7 +210,7 @@ void rct1_fix_landscape() RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_GUEST_CHANGE_MODIFIER, uint8) = 0; - sub_69F44B(); + rct1_clear_extra_tile_entries(); sub_69F06A(); sub_69F143(); sub_69F2D0(); @@ -304,7 +304,7 @@ static void rct1_remove_rides() case MAP_ELEMENT_TYPE_PATH: if (it.element->type & 1) { it.element->properties.path.type &= 0xF7; - it.element->properties.path.addition_status = 255; + it.element->properties.path.ride_index = 255; } break; @@ -513,9 +513,7 @@ static void sub_666DFD() if (x == (sint16)0x8000) return; - x /= 32; - y /= 32; - mapElement = map_get_first_element_at(x, y); + mapElement = map_get_first_element_at(x >> 5, y >> 5); do { if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_ENTRANCE) { if (mapElement->properties.entrance.type == ENTRANCE_TYPE_PARK_ENTRANCE) { @@ -530,18 +528,88 @@ static void sub_666DFD() * * rct2: 0x0069F007 */ -static void sub_69F007() +static void rct1_clear_extra_sprite_entries() { - RCT2_CALLPROC_EBPSAFE(0x0069F007); + rct_unk_sprite *sprite; + + for (int i = 5000; i < MAX_SPRITES; i++) { + sprite = &(g_sprite_list[i].unknown); + + memset(&g_sprite_list[i], 0, sizeof(rct_sprite)); + + sprite->sprite_identifier = 255; + sprite->sprite_index = i; + sprite->linked_list_type_offset = SPRITE_LINKEDLIST_OFFSET_NULL; + sprite->previous = SPRITE_INDEX_NULL; + sprite->next = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_NEXT_INDEX, uint16); + RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_NEXT_INDEX, uint16) = i; + + sprite = &(g_sprite_list[sprite->next].unknown); + sprite->previous = i; + } + RCT2_GLOBAL(0x013573C8, uint16) += 5000; } /** * * rct2: 0x0069F44B */ -static void sub_69F44B() +static void rct1_clear_extra_tile_entries() { - RCT2_CALLPROC_EBPSAFE(0x0069F44B); + // Reset the map tile pointers + for (int i = 0; i < 0x10000; i++) { + gMapElementTilePointers[i] = (rct_map_element*)-1; + } + + // Get the first free map element + rct_map_element *nextFreeMapElement = gMapElements; + for (int i = 0; i < 128 * 128; i++) { + do { + + } while (!map_element_is_last_for_tile(nextFreeMapElement++)); + } + + rct_map_element *mapElement = gMapElements; + rct_map_element **tilePointer = gMapElementTilePointers; + + // 128 rows of map data from RCT1 map + for (int x = 0; x < 128; x++) { + // Assign the first half of this row + for (int y = 0; y < 128; y++) { + *tilePointer++ = mapElement; + do { + + } while (!map_element_is_last_for_tile(mapElement++)); + } + + // Fill the rest of the row with blank tiles + for (int y = 0; y < 128; y++) { + nextFreeMapElement->type = MAP_ELEMENT_TYPE_SURFACE; + nextFreeMapElement->flags = MAP_ELEMENT_FLAG_LAST_TILE; + nextFreeMapElement->base_height = 2; + nextFreeMapElement->clearance_height = 0; + nextFreeMapElement->properties.surface.slope = 0; + nextFreeMapElement->properties.surface.terrain = 0; + nextFreeMapElement->properties.surface.grass_length = GRASS_LENGTH_CLEAR_0; + nextFreeMapElement->properties.surface.ownership = 0; + *tilePointer++ = nextFreeMapElement++; + } + } + + // 128 extra rows left to fill with blank tiles + for (int y = 0; y < 128 * 256; y++) { + nextFreeMapElement->type = MAP_ELEMENT_TYPE_SURFACE; + nextFreeMapElement->flags = MAP_ELEMENT_FLAG_LAST_TILE; + nextFreeMapElement->base_height = 2; + nextFreeMapElement->clearance_height = 0; + nextFreeMapElement->properties.surface.slope = 0; + nextFreeMapElement->properties.surface.terrain = 0; + nextFreeMapElement->properties.surface.grass_length = GRASS_LENGTH_CLEAR_0; + nextFreeMapElement->properties.surface.ownership = 0; + *tilePointer++ = nextFreeMapElement++; + } + + RCT2_GLOBAL(0x0140E9A4, rct_map_element*) = nextFreeMapElement; } /** @@ -586,7 +654,7 @@ static void sub_6A2730() */ static void sub_69E891() { - RCT2_CALLPROC_EBPSAFE(0x0069E891); + RCT2_GLOBAL(0x013587D8, uint16) = 63; } #pragma region Tables diff --git a/src/world/map.c b/src/world/map.c index 26d059aea6..df66204385 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -49,6 +49,8 @@ const rct_xy16 TileDirectionDelta[] = { { -32, -32 } }; +rct_map_element *gMapElements = (rct_map_element*)RCT2_ADDRESS_MAP_ELEMENTS; +rct_map_element **gMapElementTilePointers = (rct_map_element**)RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS; rct_xy16 *gMapSelectionTiles = (rct_xy16*)0x009DE596; rct2_peep_spawn *gPeepSpawns = (rct2_peep_spawn*)RCT2_ADDRESS_PEEP_SPAWNS; diff --git a/src/world/map.h b/src/world/map.h index eaed60b305..048f06dc75 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -248,6 +248,10 @@ typedef struct { } rct2_peep_spawn; extern const rct_xy16 TileDirectionDelta[]; + +extern rct_map_element *gMapElements; +extern rct_map_element **gMapElementTilePointers; + extern rct_xy16 *gMapSelectionTiles; extern rct2_peep_spawn *gPeepSpawns; // Used in the land tool window to allow dragging and changing land styles From 836c208dc5d86784586e789150f6396ce629d0ff Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 14 Jul 2015 00:42:27 +0100 Subject: [PATCH 0282/1173] implement rct1_fix_z --- src/rct1.c | 60 +++++++++++++++++++++++++++++++++++++++++++++---- src/ride/ride.h | 2 +- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/rct1.c b/src/rct1.c index 7f5dba32d6..06bbf8348a 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -33,6 +33,7 @@ #include "world/climate.h" #include "world/footpath.h" #include "world/map.h" +#include "world/map_animation.h" #include "world/scenery.h" typedef struct { @@ -56,7 +57,7 @@ static void sub_666DFD(); static void rct1_clear_extra_sprite_entries(); static void rct1_clear_extra_tile_entries(); static void sub_69F143(); -static void sub_69F2D0(); +static void rct1_fix_z(); static void sub_69F3AB(); static void sub_6A2730(); static void sub_69E891(); @@ -213,7 +214,7 @@ void rct1_fix_landscape() rct1_clear_extra_tile_entries(); sub_69F06A(); sub_69F143(); - sub_69F2D0(); + rct1_fix_z(); sub_69F3AB(); rct1_remove_rides(); object_unload_all(); @@ -625,9 +626,60 @@ static void sub_69F143() * * rct2: 0x0069F2D0 */ -static void sub_69F2D0() +static void rct1_fix_z() { - RCT2_CALLPROC_EBPSAFE(0x0069F2D0); + int i; + rct_ride *ride; + rct_unk_sprite *sprite; + rct_peep *peep; + rct_ride_measurement *rideMeasurement; + rct_map_element *mapElement; + + FOR_ALL_RIDES(i, ride) { + for (int i = 0; i < 4; i++) { + ride->station_heights[i] /= 2; + } + ride->var_116 /= 2; + ride->highest_drop_height = 1; + if (ride->var_11F != 255) { + ride->var_11F /= 2; + } + ride->var_13E /= 2; + ride->var_13F /= 2; + } + + for (int i = 0; i < RCT2_GLOBAL(0x0138B580, uint16); i++) { + gAnimatedObjects[i].baseZ /= 2; + } + + for (int i = 0; i < MAX_SPRITES; i++) { + sprite = &(g_sprite_list[i].unknown); + if (sprite->sprite_identifier == SPRITE_IDENTIFIER_PEEP) { + peep = (rct_peep*)sprite; + peep->next_z /= 2; + RCT2_GLOBAL((int)peep + 0xCE, uint8) /= 2; + } + } + + for (int i = 0; i < MAX_RIDE_MEASUREMENTS; i++) { + rideMeasurement = GET_RIDE_MEASUREMENT(i); + if (rideMeasurement->ride_index == 255) + continue; + + for (int i = 0; i < RIDE_MEASUREMENT_MAX_ITEMS; i++) { + rideMeasurement->altitude[i] /= 2; + } + } + + mapElement = gMapElements; + while (mapElement < RCT2_GLOBAL(0x0140E9A4, rct_map_element*)) { + if (mapElement->base_height != 255) { + mapElement->base_height /= 2; + mapElement->clearance_height /= 2; + } + mapElement++; + } + RCT2_GLOBAL(0x01359208, uint16) = 7; } /** diff --git a/src/ride/ride.h b/src/ride/ride.h index f8bfc6e024..e17f05d300 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -209,7 +209,7 @@ typedef struct { uint8 holes; // 0x114 (???X XXXX) }; uint8 drops; // 0x115 (??XX XXXX) - uint8 pad_116; + uint8 var_116; uint8 highest_drop_height; // 0x117 sint32 sheltered_length; // 0x118 uint8 pad_11C[0x2]; From 26a540e78d134fbe85f9352d5579e10f60a04289 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 14 Jul 2015 01:26:00 +0100 Subject: [PATCH 0283/1173] fix #1605 --- src/world/footpath.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/world/footpath.c b/src/world/footpath.c index 9eda6403f9..4efd16b99e 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -901,7 +901,7 @@ static void loc_6A6D7E( if (!(RCT2_ADDRESS(0x0099CA64, uint8)[di] & (1 << 5))) { return; } - uint16 dx = (direction - mapElement->type) & 3; + uint16 dx = ((direction - mapElement->type) & 3) ^ 2; if (!(RCT2_ADDRESS(0x0099CA64, uint16)[di / 2] & (1 << dx))) { return; } @@ -913,7 +913,7 @@ static void loc_6A6D7E( break; case MAP_ELEMENT_TYPE_ENTRANCE: if (z == mapElement->base_height) { - if (entrance_has_direction(mapElement, ((direction - mapElement->type) & 3) ^ 2)) { + if (entrance_has_direction(mapElement, (direction - mapElement->type) & 3)) { if (query) { neighbour_list_push(neighbourList, 8, direction); } else { From b04ba504008cf51366f01e2a4dc202d644e304d9 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 14 Jul 2015 04:00:24 +0100 Subject: [PATCH 0284/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/german.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/data/language/german.txt b/data/language/german.txt index ef55782316..d0ac9af195 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3611,8 +3611,8 @@ STR_5274 :{SMALLFONT}{BLACK}Fußwege STR_5275 :Nach Objekten suchen STR_5276 :Zu suchenden Objektnamen eingeben: STR_5277 :Entfernen -STR_5278 :Sandkasten-Modus -STR_5279 :Sandk.-Modus aus +STR_5278 :Sandkastenmodus +STR_5279 :Sandkastenmod. aus STR_5280 :{SMALLFONT}{BLACK}Erlaubt das Bearbeiten der Landrechte im Kartenfenster sowie andere Optionen welche normalerweise nur im Szenario-Editor verfügbar sind STR_5281 :{SMALLFONT}{BLACK}Features STR_5282 :RCT1-Ampel Bahn öffnen/schließen @@ -3788,6 +3788,9 @@ STR_5451 :Cheatfenster anzeigen STR_5452 :Symbolleiste ein-/ausblenden STR_5453 :Andere Attraktion auswählen STR_5454 :FPS-Limit aufheben +STR_5455 :Sandkastenmodus aktivieren +STR_5456 :Höhenüberprüfung deaktivieren +STR_5457 :Stützenlimit deaktivieren STR_5458 :Im Uhrzeigersinn drehen STR_5459 :Gegen den Uhrzeigersinn drehen STR_5460 :Ansicht gegen den Uhrzeigers. drehen From f7dd9859e489b57b663542326c69b8506a2c70ec Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Tue, 14 Jul 2015 10:16:16 +0200 Subject: [PATCH 0285/1173] Fix merge error in englush_uk.txt --- data/language/english_uk.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index f32156e242..2fdada2e4f 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3791,7 +3791,6 @@ STR_5454 :Uncap FPS STR_5455 :Enable sandbox mode STR_5456 :Disable clearance checks STR_5457 :Disable support limits -<<<<<<< HEAD STR_5458 :Rotate clockwise STR_5459 :Rotate anti-clockwise STR_5460 :Rotate view anti-clockwise @@ -3801,5 +3800,3 @@ STR_5463 :Goal: Have fun! STR_5464 :General STR_5465 :Climate STR_5466 :Staff -======= ->>>>>>> allow disable clearance checks for footpaths From 968aec9040f1ceb488fe0869117eecc02b8989ec Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 14 Jul 2015 11:43:19 +0100 Subject: [PATCH 0286/1173] fix #1605 --- src/ride/ride.c | 4 ++-- src/world/footpath.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 832acac9de..6362cd4e7f 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5325,7 +5325,7 @@ void ride_get_entrance_or_exit_position_from_screen_position(int screenX, int sc if (mapElement->properties.track.ride_index != RCT2_GLOBAL(0x00F44192, uint8)) continue; if (mapElement->properties.track.type == 101) { - RCT2_GLOBAL(0x00F44194, uint8) = direction; + RCT2_GLOBAL(0x00F44194, uint8) = direction ^ 2; *outDirection = direction ^ 2; return; } @@ -5335,7 +5335,7 @@ void ride_get_entrance_or_exit_position_from_screen_position(int screenX, int sc int ebx = (mapElement->properties.track.type << 4) + (mapElement->properties.track.sequence & 0x0F); int eax = (direction + 2 - mapElement->type) & MAP_ELEMENT_DIRECTION_MASK; if (RCT2_ADDRESS(0x0099CA64, uint8)[ebx] & (1 << eax)) { - RCT2_GLOBAL(0x00F44194, uint8) = direction; + RCT2_GLOBAL(0x00F44194, uint8) = direction ^ 2; *outDirection = direction ^ 2; return; } diff --git a/src/world/footpath.c b/src/world/footpath.c index 4efd16b99e..d0de5d7f9c 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -913,7 +913,7 @@ static void loc_6A6D7E( break; case MAP_ELEMENT_TYPE_ENTRANCE: if (z == mapElement->base_height) { - if (entrance_has_direction(mapElement, (direction - mapElement->type) & 3)) { + if (entrance_has_direction(mapElement, ((direction - mapElement->type) & 3) ^ 2)) { if (query) { neighbour_list_push(neighbourList, 8, direction); } else { From e0c744be3240d926df0d261c07548624a6b88fe4 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Tue, 14 Jul 2015 18:00:55 +0100 Subject: [PATCH 0287/1173] Remove debugging path. --- projects/openrct2.vcxproj.user | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/projects/openrct2.vcxproj.user b/projects/openrct2.vcxproj.user index 02863ba3d9..33fff921b3 100644 --- a/projects/openrct2.vcxproj.user +++ b/projects/openrct2.vcxproj.user @@ -4,7 +4,8 @@ $(TargetDir) WindowsLocalDebugger $(TargetDir)\openrct2.exe - edit "C:\Users\Ted\Desktop\rct1ll\Scenarios\sc0.sc4" + + $(TargetDir) From 445d603abef57076375e9f804964cd94167453af Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 14 Jul 2015 18:18:10 +0100 Subject: [PATCH 0288/1173] refactor various things such as scenario begin and staff mode reset, add rct1 ride struct --- src/editor.c | 23 ++------- src/editor.h | 2 - src/peep/staff.c | 15 ++++++ src/peep/staff.h | 1 + src/rct1.c | 16 +++++- src/rct1.h | 129 ++++++++++++++++++++++++++++++++++++++++++++++- src/rct2.c | 4 +- src/scenario.c | 29 +++++------ src/scenario.h | 1 + src/title.c | 3 +- 10 files changed, 182 insertions(+), 41 deletions(-) diff --git a/src/editor.c b/src/editor.c index bb9bef8c2c..b3960732ce 100644 --- a/src/editor.c +++ b/src/editor.c @@ -69,7 +69,7 @@ void editor_load() reset_sprite_list(); ride_init_all(); window_guest_list_init_vars_a(); - sub_6BD3A4(); + staff_reset_modes(); park_init(); finance_init(); date_reset(); @@ -186,7 +186,7 @@ void trackdesigner_load() reset_sprite_list(); ride_init_all(); window_guest_list_init_vars_a(); - sub_6BD3A4(); + staff_reset_modes(); park_init(); finance_init(); date_reset(); @@ -223,7 +223,7 @@ void trackmanager_load() reset_sprite_list(); ride_init_all(); window_guest_list_init_vars_a(); - sub_6BD3A4(); + staff_reset_modes(); park_init(); finance_init(); date_reset(); @@ -254,21 +254,6 @@ static void set_all_land_owned() game_do_command(64, 1, 64, 2, GAME_COMMAND_SET_LAND_OWNERSHIP, (mapSize - 2) * 32, (mapSize - 2) * 32); } -/** - * - * rct2: 0x006BD3A4 - */ -void sub_6BD3A4() -{ - for (int i = 0; i < 200; i++) - RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[i] = STAFF_MODE_NONE; - - for (int i = 200; i < 204; i++) - RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[i] = STAFF_MODE_WALK; - - staff_update_greyed_patrol_areas(); -} - /** * * rct2: 0x006758C0 @@ -447,7 +432,7 @@ static int editor_read_s6(const char *path) } reset_sprite_list(); - sub_6BD3A4(); + staff_reset_modes(); RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16) = 0; diff --git a/src/editor.h b/src/editor.h index ac83963cd4..54044a3dfa 100644 --- a/src/editor.h +++ b/src/editor.h @@ -43,8 +43,6 @@ void trackdesigner_load(); void trackmanager_load(); void editor_load_landscape(const char *path); -void sub_6BD3A4(); - void editor_open_windows_for_current_step(); bool editor_check_park(); diff --git a/src/peep/staff.c b/src/peep/staff.c index 11cf6b1966..e7725d093d 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -32,6 +32,21 @@ uint32 *gStaffPatrolAreas = (uint32*)0x013B0E72; uint8 *gStaffModes = (uint8*)0x013CA672; +/** + * + * rct2: 0x006BD3A4 + */ +void staff_reset_modes() +{ + for (int i = 0; i < 200; i++) + RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[i] = STAFF_MODE_NONE; + + for (int i = 200; i < 204; i++) + RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[i] = STAFF_MODE_WALK; + + staff_update_greyed_patrol_areas(); +} + /** * * rct2: 0x00669E55 diff --git a/src/peep/staff.h b/src/peep/staff.h index 42303f33f7..68b2b32321 100644 --- a/src/peep/staff.h +++ b/src/peep/staff.h @@ -58,6 +58,7 @@ void game_command_set_staff_order(int *eax, int *ebx, int *ecx, int *edx, int *e void game_command_set_staff_patrol(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_fire_staff_member(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +void staff_reset_modes(); void update_staff_colour(uint8 staffType, uint16 color); uint16 hire_new_staff_member(uint8 staffType); void staff_update_greyed_patrol_areas(); diff --git a/src/rct1.c b/src/rct1.c index 06bbf8348a..95c5b11364 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -328,6 +328,16 @@ static void rct1_remove_rides() } while (map_element_iterator_next(&it)); } +static bool is_object_name_blank(rct_object_entry *entry) +{ + for (int i = 0; i < 8; i++) { + if (entry->name[i] != ' ') { + return false; + } + } + return true; +} + /** * * rct2: 0x0069F53D @@ -337,6 +347,10 @@ static void rct1_load_default_objects() for (int i = 0; i < 9; i++) { rct_object_entry *entries = (rct_object_entry*)RCT1DefaultObjects[i].entries; for (int j = 0; j < RCT1DefaultObjects[i].count; j++) { + if (is_object_name_blank(&entries[j])) { + continue; + } + if (!object_load(j, &entries[j], NULL)) { error_string_quit(0x99990000 + (i * 0x100) + j, -1); return; @@ -1283,7 +1297,7 @@ static const rct_object_entry RCT1DefaultObjectsWater[] = { }; static const RCT1DefaultObjectsGroup RCT1DefaultObjects[10] = { - { NULL, 0 }, + { RCT1DefaultObjectsRides, countof(RCT1DefaultObjectsRides) }, { RCT1DefaultObjectsSmallScenery, countof(RCT1DefaultObjectsSmallScenery) }, { RCT1DefaultObjectsLargeScenery, countof(RCT1DefaultObjectsLargeScenery) }, { RCT1DefaultObjectsWall, countof(RCT1DefaultObjectsWall) }, diff --git a/src/rct1.h b/src/rct1.h index c28f087653..5a3c66555b 100644 --- a/src/rct1.h +++ b/src/rct1.h @@ -37,6 +37,131 @@ typedef struct { uint8 direction; } rct1_entrance; +/** + * RCT1 ride structure + * size: 0x260 + */ +typedef struct { + uint8 type; + uint8 vehicle_type; + uint16 lifecycle_flags; + uint8 operating_mode; + uint8 colour_scheme; + uint16 vehicle_colours[12]; + uint8 track_primary_colour; + uint8 track_secondary_colour; + uint8 track_support_colour; + uint8 status; + uint16 name; + uint16 name_argument_ride; + uint16 name_argument_number; + uint16 overall_view; + uint16 station_starts[4]; + uint8 station_height[4]; + uint8 station_length[4]; + uint8 station_light[4]; + uint8 station_depart[4]; + uint16 entrance[4]; + uint16 exit[4]; + uint16 first_peep_in_queue[4]; + uint8 num_peeps_in_queue[4]; + uint16 vehicles[12]; + uint8 depart_flags; + uint8 num_stations; + uint8 num_trains; + uint8 num_cars_per_train; + uint8 unk_7A; + uint8 unk_7B; + uint8 max_trains; + uint8 unk_7D; + uint8 min_waiting_time; + uint8 max_waiting_time; + uint8 operation_option; + uint8 unk_081[0x3]; + uint8 data_logging_index; + uint8 special_track_elements; + uint16 unk_86; + sint32 max_speed; + sint32 average_speed; + uint8 pad_090[4]; + sint32 length[4]; + uint16 time[4]; + fixed16_2dp max_positive_vertical_g; + fixed16_2dp max_negative_vertical_g; + fixed16_2dp max_lateral_g; + uint8 unk_B2[18]; + union { + uint8 num_inversions; + uint8 num_holes; + }; + uint8 num_drops; + uint8 unk_C6; + uint8 highest_drop_height; + sint32 sheltered_length; + uint8 unk_CC[2]; + uint8 num_sheltered_sections; + uint8 unk_CF; + sint16 unk_D0; + sint16 unk_D2; + sint16 customers_per_hour; + sint16 unk_D6; + sint16 unk_D8; + sint16 unk_DA; + sint16 unk_DC; + sint16 unk_DE; + uint16 age; + sint16 running_cost; + sint16 unk_E4; + sint16 unk_E6; + money16 price; + sint16 var_EA; + sint16 var_EC; + uint8 var_EE; + uint8 var_EF; + union { + rating_tuple ratings; + struct { + ride_rating excitement; + ride_rating intensity; + ride_rating nausea; + }; + }; + uint16 value; + uint16 var_F8; + uint8 satisfaction; + uint8 satisfaction_time_out; + uint8 satisfaction_next; + uint8 window_invalidate_flags; + uint8 unk_FE[2]; + uint32 total_customers; + money32 total_profit; + uint8 popularity; + uint8 popularity_time_out; + uint8 popularity_next; + uint8 num_riders; + uint8 unk_10C[36]; + sint16 build_date; + money16 upkeep_cost; + uint8 unk_134[15]; + uint8 breakdown_reason; + uint8 unk_144[2]; + uint16 reliability; + uint8 unreliability_factor; + uint8 unk_148; + uint8 inspection_interval; + uint8 last_inspection; + uint8 unk_14C[20]; + money32 income_per_hour; + money32 profit; + uint8 queue_time[4]; + uint8 track_colour_main[4]; + uint8 track_colour_additional[4]; + uint8 track_colour_supports[4]; + uint8 music; + uint8 entrance_style; + uint8 unk_17A[230]; +} rct1_ride; + /** * RCT1,AA,LL scenario / saved game structure. * size: 0x1F850C @@ -166,9 +291,9 @@ typedef struct { rct_research_item research_items_LL[180]; uint8 unk_19A020[5468]; rct_banner banners[100]; - char string_table[32][1024]; + char string_table[1024][32]; uint32 game_time_counter; - rct_ride rides[255]; + rct1_ride rides[255]; uint16 unk_game_time_counter; uint16 view_x; uint16 view_y; diff --git a/src/rct2.c b/src/rct2.c index ef8940af49..a41de22853 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -38,7 +38,9 @@ #include "network/twitch.h" #include "object.h" #include "openrct2.h" +#include "peep/staff.h" #include "platform/platform.h" +#include "rct1.h" #include "ride/ride.h" #include "ride/track.h" #include "scenario.h" @@ -108,7 +110,7 @@ int rct2_init() reset_sprite_list(); ride_init_all(); window_guest_list_init_vars_a(); - sub_6BD3A4(); + staff_reset_modes(); map_init(150); park_init(); if (!gOpenRCT2Headless) diff --git a/src/scenario.c b/src/scenario.c index 582803e2c8..1310af5a61 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -207,14 +207,6 @@ int scenario_load_and_play(const rct_scenario_basic *scenario) int scenario_load_and_play_from_path(const char *path) { - rct_window *mainWindow; - rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; - - // Create the scenario pseduo-random seeds using the current time - uint32 srand0, srand1; - srand0 = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32) ^ platform_get_ticks(); - srand1 = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_1, uint32) ^ platform_get_ticks(); - window_close_construction_windows(); if (!scenario_load(path)) @@ -224,6 +216,15 @@ int scenario_load_and_play_from_path(const char *path) _scenarioFileName = path_get_filename(_scenarioPath); log_verbose("starting scenario, %s", path); + scenario_begin(); + + return 1; +} + +void scenario_begin() +{ + rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; + rct_window *mainWindow; RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_PLAYING; viewport_init_all(); @@ -234,9 +235,9 @@ int scenario_load_and_play_from_path(const char *path) mainWindow->saved_view_x = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_X, sint16); mainWindow->saved_view_y = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_Y, sint16); - uint8 _cl = (RCT2_GLOBAL(0x0138869E, sint16) & 0xFF) - mainWindow->viewport->zoom; - mainWindow->viewport->zoom = RCT2_GLOBAL(0x0138869E, sint16) & 0xFF; - *((char*)(&RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, sint32))) = RCT2_GLOBAL(0x0138869E, sint16) >> 8; + uint8 _cl = (RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, sint16) & 0xFF) - mainWindow->viewport->zoom; + mainWindow->viewport->zoom = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, sint16) & 0xFF; + *((char*)(&RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, sint32))) = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, sint16) >> 8; if (_cl != 0) { if (_cl < 0) { _cl = -_cl; @@ -255,8 +256,8 @@ int scenario_load_and_play_from_path(const char *path) window_new_ride_init_vars(); // Set the scenario pseduo-random seeds - RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, sint32) = srand0; - RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_1, sint32) = srand1; + RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, sint32) ^= platform_get_ticks(); + RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_1, sint32) ^= platform_get_ticks(); RCT2_GLOBAL(0x009DEB7C, sint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, sint32) &= 0xFFFFF7FF; @@ -340,8 +341,6 @@ int scenario_load_and_play_from_path(const char *path) RCT2_GLOBAL(0x009DEA66, uint16) = 0; RCT2_GLOBAL(0x009DEA5C, uint16) = 62000; // (doesn't appear to ever be read) gGameSpeed = 1; - - return 1; } void scenario_end() diff --git a/src/scenario.h b/src/scenario.h index 5f4f842221..d2cdd74b98 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -421,6 +421,7 @@ int scenario_load_basic(const char *path, rct_s6_header *header, rct_s6_info *in int scenario_load(const char *path); int scenario_load_and_play(const rct_scenario_basic *scenario); int scenario_load_and_play_from_path(const char *path); +void scenario_begin(); void scenario_update(); unsigned int scenario_rand(); unsigned int scenario_rand_max(unsigned int max); diff --git a/src/title.c b/src/title.c index 79148ac83c..838e8924c7 100644 --- a/src/title.c +++ b/src/title.c @@ -34,6 +34,7 @@ #include "management/news_item.h" #include "management/research.h" #include "openrct2.h" +#include "peep/staff.h" #include "ride/ride.h" #include "scenario.h" #include "util/util.h" @@ -110,7 +111,7 @@ void title_load() reset_sprite_list(); ride_init_all(); window_guest_list_init_vars_a(); - sub_6BD3A4(); + staff_reset_modes(); map_init(150); park_init(); date_reset(); From 48c5fe16263cdbfc617d71a838b0ef53e493be46 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 14 Jul 2015 19:13:43 +0100 Subject: [PATCH 0289/1173] implement rct_fix_paths --- src/rct1.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 4 deletions(-) diff --git a/src/rct1.c b/src/rct1.c index 95c5b11364..62bd546824 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -58,7 +58,7 @@ static void rct1_clear_extra_sprite_entries(); static void rct1_clear_extra_tile_entries(); static void sub_69F143(); static void rct1_fix_z(); -static void sub_69F3AB(); +static void rct1_fix_paths(); static void sub_6A2730(); static void sub_69E891(); @@ -215,7 +215,7 @@ void rct1_fix_landscape() sub_69F06A(); sub_69F143(); rct1_fix_z(); - sub_69F3AB(); + rct1_fix_paths(); rct1_remove_rides(); object_unload_all(); rct1_load_default_objects(); @@ -696,13 +696,90 @@ static void rct1_fix_z() RCT2_GLOBAL(0x01359208, uint16) = 7; } +// rct2: 0x0098BC9F +uint8 RCT1PathTypeConversionTable[] = { + 0x80 | 0, 0x80 | 1, 0x80 | 2, 0x80 | 3, + 0x80 | 0, 0x80 | 1, 0x80 | 2, 0x80 | 3, + 0x80 | 0, 0x80 | 1, 0x80 | 2, 0x80 | 3, + 0x80 | 0, 0x80 | 1, 0x80 | 2, 0x80 | 3, + 0, 0, 0, 0, + 2, 2, 2, 2, + 1, 1, 1, 1, + 0, 0, 0, 0, + 3, 3, 3, 3, + 6, 6, 6, 6, + 0, 0, 0, 0, + 0, 0, 0, 0, + 5, 5, 5, 5, + 5, 5, 5, 5, + 5, 5, 5, 5, + 5, 5, 5, 5, + 4, 4, 4, 4, + 4, 4, 4, 4, + 4, 4, 4, 4, + 4, 4, 4, 4, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, +}; + + +// rct2: 0x0098BCFF +uint8 RCT1PathAdditionConversionTable[] = { + 0, + 1, 2, 3, 4, 5, 6, 7, + 0x80 | 1, 0x80 | 2, 0x80 | 3, 0x80 | 4, 0x80 | 6, 0x80 | 7, + 8, +}; + + /** * * rct2: 0x0069F3AB */ -static void sub_69F3AB() +static void rct1_fix_paths() { - RCT2_CALLPROC_EBPSAFE(0x0069F3AB); + rct_map_element *mapElement; + int pathType, secondaryType, additions; + + while (mapElement < RCT2_GLOBAL(0x0140E9A4, rct_map_element*)) { + switch (map_element_get_type(mapElement)) { + case MAP_ELEMENT_TYPE_PATH: + // Type + pathType = (mapElement->properties.path.type & 0xF0 >> 2) | (mapElement->type & 3); + secondaryType = (mapElement->flags & 0x60) >> 5; + pathType = RCT1PathTypeConversionTable[pathType * 4 + secondaryType]; + + mapElement->type &= 0xFC; + mapElement->flags &= ~0x60; + mapElement->properties.path.type &= 0x0F; + mapElement->properties.path.additions &= 0x7F; + if (pathType & 0x80) { + mapElement->type |= 1; + } + mapElement->properties.path.type |= pathType << 4; + + // Additions + additions = mapElement->properties.path.additions & 0x0F; + additions = RCT1PathAdditionConversionTable[additions]; + if (additions & 0x80) { + additions &= ~0x80; + mapElement->flags |= MAP_ELEMENT_FLAG_BROKEN; + } else { + mapElement->flags &= ~MAP_ELEMENT_FLAG_BROKEN; + } + mapElement->properties.path.additions &= 0xF0; + mapElement->properties.path.additions |= additions; + break; + case MAP_ELEMENT_TYPE_ENTRANCE: + if (mapElement->properties.entrance.type == ENTRANCE_TYPE_PARK_ENTRANCE) { + pathType = mapElement->properties.entrance.path_type; + mapElement->properties.entrance.path_type = RCT1PathTypeConversionTable[pathType * 4] & 0x7F; + } + break; + } + } } /** From dcbdc7cb3a31f44898f2c3cfdd237863307da6fa Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 14 Jul 2015 21:07:27 +0100 Subject: [PATCH 0290/1173] fix rct1_fix_paths --- src/rct1.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/rct1.c b/src/rct1.c index 62bd546824..a374090e4b 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -743,6 +743,7 @@ static void rct1_fix_paths() rct_map_element *mapElement; int pathType, secondaryType, additions; + mapElement = gMapElements; while (mapElement < RCT2_GLOBAL(0x0140E9A4, rct_map_element*)) { switch (map_element_get_type(mapElement)) { case MAP_ELEMENT_TYPE_PATH: @@ -779,6 +780,7 @@ static void rct1_fix_paths() } break; } + mapElement++; } } From 1440ac185d54a78800770b06bcd6a1cbd3a082d6 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Tue, 14 Jul 2015 21:20:22 +0100 Subject: [PATCH 0291/1173] Fix invalid hook register list. Fixes #1607 --- src/openrct2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openrct2.c b/src/openrct2.c index 4778d89e2a..30f8ff86a5 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -190,7 +190,7 @@ bool openrct2_initialise() addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0); // remove when all callers are decompiled addhook(0x006E7499, (int)gfx_redraw_screen_rect, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0); // remove when 0x6E7FF3 is decompiled addhook(0x006B752C, (int)ride_crash, 0, (int[]){ EDX, EBX, END }, 0); // remove when all callers are decompiled - addhook(0x0069A42F, (int)peep_window_state_update, 0, (int[]){ ESI }, 0); // remove when all callers are decompiled + addhook(0x0069A42F, (int)peep_window_state_update, 0, (int[]){ ESI, END }, 0); // remove when all callers are decompiled if (!rct2_init()) return false; From 8acd9e73ca6eae63897c7b86e16d85276e5db923 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 14 Jul 2015 21:58:45 +0100 Subject: [PATCH 0292/1173] implement rct1_fix_colours --- src/rct1.c | 173 +++++++++++++++++++++++++++++++++------------ src/rct1.h | 2 + src/ride/track.c | 4 +- src/world/sprite.h | 1 + 4 files changed, 131 insertions(+), 49 deletions(-) diff --git a/src/rct1.c b/src/rct1.c index a374090e4b..3c877e2095 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -41,8 +41,10 @@ typedef struct { int count; } RCT1DefaultObjectsGroup; -const uint8 RCT1TerrainConvertTable[16]; -const uint8 RCT1TerrainEdgeConvertTable[16]; +static const uint8 RCT1TerrainConvertTable[16]; +static const uint8 RCT1TerrainEdgeConvertTable[16]; +static const uint8 RCT1PathTypeConversionTable[96]; +static const uint8 RCT1PathAdditionConversionTable[15]; static const RCT1DefaultObjectsGroup RCT1DefaultObjects[10]; static void rct1_remove_rides(); @@ -56,7 +58,7 @@ static void sub_69F06A(); static void sub_666DFD(); static void rct1_clear_extra_sprite_entries(); static void rct1_clear_extra_tile_entries(); -static void sub_69F143(); +static void rct1_fix_colours(); static void rct1_fix_z(); static void rct1_fix_paths(); static void sub_6A2730(); @@ -213,7 +215,7 @@ void rct1_fix_landscape() RCT2_GLOBAL(RCT2_ADDRESS_GUEST_CHANGE_MODIFIER, uint8) = 0; rct1_clear_extra_tile_entries(); sub_69F06A(); - sub_69F143(); + rct1_fix_colours(); rct1_fix_z(); rct1_fix_paths(); rct1_remove_rides(); @@ -631,9 +633,80 @@ static void rct1_clear_extra_tile_entries() * * rct2: 0x0069F143 */ -static void sub_69F143() +static void rct1_fix_colours() { - RCT2_CALLPROC_EBPSAFE(0x0069F143); + int rideIndex, colour; + rct_ride *ride; + rct_unk_sprite *sprite; + rct_peep *peep; + rct_balloon *balloon; + rct_map_element *mapElement; + + FOR_ALL_RIDES(rideIndex, ride) { + for (int i = 0; i < 4; i++) { + ride->track_colour_main[i] = RCT1ColourConversionTable[ride->track_colour_main[i]]; + ride->track_colour_additional[i] = RCT1ColourConversionTable[ride->track_colour_additional[i]]; + ride->track_colour_supports[i] = RCT1ColourConversionTable[ride->track_colour_supports[i]]; + } + + for (int i = 0; i < 32; i++) { + ride->vehicle_colours[i].body_colour = RCT1ColourConversionTable[ride->vehicle_colours[i].body_colour]; + ride->vehicle_colours[i].trim_colour = RCT1ColourConversionTable[ride->vehicle_colours[i].trim_colour]; + } + } + + for (int i = 0; i < MAX_SPRITES; i++) { + sprite = &(g_sprite_list[i].unknown); + switch (sprite->sprite_identifier) { + case SPRITE_IDENTIFIER_PEEP: + peep = (rct_peep*)sprite; + peep->tshirt_colour = RCT1ColourConversionTable[peep->tshirt_colour]; + peep->trousers_colour = RCT1ColourConversionTable[peep->trousers_colour]; + peep->balloon_colour = RCT1ColourConversionTable[peep->balloon_colour]; + peep->umbrella_colour = RCT1ColourConversionTable[peep->umbrella_colour]; + peep->hat_colour = RCT1ColourConversionTable[peep->hat_colour]; + break; + case SPRITE_IDENTIFIER_MISC: + balloon = (rct_balloon*)sprite; + balloon->colour = RCT1ColourConversionTable[balloon->colour]; + balloon->var_2D = RCT1ColourConversionTable[balloon->var_2D]; + break; + } + } + + mapElement = gMapElements; + while (mapElement < RCT2_GLOBAL(0x0140E9A4, rct_map_element*)) { + if (mapElement->base_height != 255) { + switch (map_element_get_type(mapElement)) { + case MAP_ELEMENT_TYPE_SCENERY: + colour = RCT1ColourConversionTable[mapElement->properties.scenery.colour_1 & 0x1F]; + mapElement->properties.scenery.colour_1 &= 0xE0; + mapElement->properties.scenery.colour_1 |= colour; + break; + case MAP_ELEMENT_TYPE_FENCE: + colour = RCT1ColourConversionTable[ + ((mapElement->type & 0xC0) >> 3) | + ((mapElement->properties.fence.type & 0xE0) >> 5) + ]; + + mapElement->type &= 0x3F; + mapElement->properties.fence.type &= 0x1F; + mapElement->type |= (colour & 0x18) << 3; + mapElement->properties.fence.type |= (colour & 7) << 5; + break; + case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: + colour = RCT1ColourConversionTable[mapElement->properties.scenerymultiple.colour[0] & 0x1F]; + mapElement->properties.scenerymultiple.colour[0] &= 0xE0; + mapElement->properties.scenerymultiple.colour[0] |= colour; + + colour = RCT1ColourConversionTable[mapElement->properties.scenerymultiple.colour[1] & 0x1F]; + mapElement->properties.scenerymultiple.colour[1] &= 0xE0; + mapElement->properties.scenerymultiple.colour[1] |= colour; + break; + } + } + mapElement++; + } } /** @@ -696,44 +769,6 @@ static void rct1_fix_z() RCT2_GLOBAL(0x01359208, uint16) = 7; } -// rct2: 0x0098BC9F -uint8 RCT1PathTypeConversionTable[] = { - 0x80 | 0, 0x80 | 1, 0x80 | 2, 0x80 | 3, - 0x80 | 0, 0x80 | 1, 0x80 | 2, 0x80 | 3, - 0x80 | 0, 0x80 | 1, 0x80 | 2, 0x80 | 3, - 0x80 | 0, 0x80 | 1, 0x80 | 2, 0x80 | 3, - 0, 0, 0, 0, - 2, 2, 2, 2, - 1, 1, 1, 1, - 0, 0, 0, 0, - 3, 3, 3, 3, - 6, 6, 6, 6, - 0, 0, 0, 0, - 0, 0, 0, 0, - 5, 5, 5, 5, - 5, 5, 5, 5, - 5, 5, 5, 5, - 5, 5, 5, 5, - 4, 4, 4, 4, - 4, 4, 4, 4, - 4, 4, 4, 4, - 4, 4, 4, 4, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, -}; - - -// rct2: 0x0098BCFF -uint8 RCT1PathAdditionConversionTable[] = { - 0, - 1, 2, 3, 4, 5, 6, 7, - 0x80 | 1, 0x80 | 2, 0x80 | 3, 0x80 | 4, 0x80 | 6, 0x80 | 7, - 8, -}; - - /** * * rct2: 0x0069F3AB @@ -748,7 +783,7 @@ static void rct1_fix_paths() switch (map_element_get_type(mapElement)) { case MAP_ELEMENT_TYPE_PATH: // Type - pathType = (mapElement->properties.path.type & 0xF0 >> 2) | (mapElement->type & 3); + pathType = ((mapElement->properties.path.type & 0xF0) >> 2) | (mapElement->type & 3); secondaryType = (mapElement->flags & 0x60) >> 5; pathType = RCT1PathTypeConversionTable[pathType * 4 + secondaryType]; @@ -804,7 +839,15 @@ static void sub_69E891() #pragma region Tables -const uint8 RCT1TerrainConvertTable[16] = { +// rct2: 0x0097F0BC & 0x0098BC60 +const uint8 RCT1ColourConversionTable[32] = { + 0, 1, 2, 4, 5, 6, 7, 9, + 11, 12, 13, 14, 15, 16, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, + 28, 30, 31, 29, 3, 10, 17, 8 +}; + +static const uint8 RCT1TerrainConvertTable[16] = { TERRAIN_GRASS, TERRAIN_SAND, TERRAIN_DIRT, @@ -823,7 +866,7 @@ const uint8 RCT1TerrainConvertTable[16] = { TERRAIN_GRID_GREEN }; -const uint8 RCT1TerrainEdgeConvertTable[16] = { +static const uint8 RCT1TerrainEdgeConvertTable[16] = { TERRAIN_EDGE_ROCK, TERRAIN_EDGE_ROCK, // Originally TERRAIN_EDGE_BRICK TERRAIN_EDGE_ROCK, // Originally TERRAIN_EDGE_IRON @@ -842,6 +885,42 @@ const uint8 RCT1TerrainEdgeConvertTable[16] = { TERRAIN_EDGE_ROCK // Unused }; +// rct2: 0x0098BC9F +static const uint8 RCT1PathTypeConversionTable[96] = { + 0x80 | 0, 0x80 | 1, 0x80 | 2, 0x80 | 3, + 0x80 | 0, 0x80 | 1, 0x80 | 2, 0x80 | 3, + 0x80 | 0, 0x80 | 1, 0x80 | 2, 0x80 | 3, + 0x80 | 0, 0x80 | 1, 0x80 | 2, 0x80 | 3, + 0, 0, 0, 0, + 2, 2, 2, 2, + 1, 1, 1, 1, + 0, 0, 0, 0, + 3, 3, 3, 3, + 6, 6, 6, 6, + 0, 0, 0, 0, + 0, 0, 0, 0, + 5, 5, 5, 5, + 5, 5, 5, 5, + 5, 5, 5, 5, + 5, 5, 5, 5, + 4, 4, 4, 4, + 4, 4, 4, 4, + 4, 4, 4, 4, + 4, 4, 4, 4, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, +}; + +// rct2: 0x0098BCFF +static const uint8 RCT1PathAdditionConversionTable[15] = { + 0, + 1, 2, 3, 4, 5, 6, 7, + 0x80 | 1, 0x80 | 2, 0x80 | 3, 0x80 | 4, 0x80 | 6, 0x80 | 7, + 8, +}; + #pragma endregion #pragma region RCT1 Default Objects diff --git a/src/rct1.h b/src/rct1.h index 5a3c66555b..2b6b19b539 100644 --- a/src/rct1.h +++ b/src/rct1.h @@ -477,6 +477,8 @@ typedef struct{ uint16 start_track_data_AA_CF; // 0xC4 }rct_track_td4; // Information based off RCTTechDepot +extern const uint8 RCT1ColourConversionTable[32]; + char **gVehicleHierarchies[0x60]; const uint8 gRideCategories[0x60]; diff --git a/src/ride/track.c b/src/ride/track.c index 4f91fb9755..e74647c9eb 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -597,12 +597,12 @@ rct_track_td6* load_track_design(const char *path) // Unsure why it is 67 edi = (uint8*)&track_design->vehicle_colours; for (i = 0; i < 67; i++, edi++) - *edi = RCT2_ADDRESS(0x0097F0BC, uint8)[*edi]; + *edi = RCT1ColourConversionTable[*edi]; // Edit the colours to use the new versions edi = (uint8*)&track_design->track_spine_colour; for (i = 0; i < 12; i++, edi++) - *edi = RCT2_ADDRESS(0x0097F0BC, uint8)[*edi]; + *edi = RCT1ColourConversionTable[*edi]; // Highest drop height is 1bit = 3/4 a meter in td6 // Highest drop height is 1bit = 1/3 a meter in td4 diff --git a/src/world/sprite.h b/src/world/sprite.h index 4ca4681fef..597bf049d4 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -124,6 +124,7 @@ typedef struct { }; uint8 pad_28[4]; uint8 colour; // 0x2C + uint8 var_2D; } rct_balloon; typedef struct { From cde0cece1682be7b2c226844169908eed403e5e1 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 14 Jul 2015 23:15:21 +0100 Subject: [PATCH 0293/1173] implement rct1_fix_walls --- src/rct1.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++--- src/world/map.c | 15 +++++++++ src/world/map.h | 1 + 3 files changed, 94 insertions(+), 4 deletions(-) diff --git a/src/rct1.c b/src/rct1.c index 3c877e2095..ce8394e4ed 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -61,7 +61,7 @@ static void rct1_clear_extra_tile_entries(); static void rct1_fix_colours(); static void rct1_fix_z(); static void rct1_fix_paths(); -static void sub_6A2730(); +static void rct1_fix_walls(); static void sub_69E891(); static void read(void *dst, void *src, int length) @@ -222,7 +222,7 @@ void rct1_fix_landscape() object_unload_all(); rct1_load_default_objects(); reset_loaded_objects(); - sub_6A2730(); + rct1_fix_walls(); rct1_fix_scenery(); rct1_fix_terrain(); rct1_fix_entrance_positions(); @@ -819,13 +819,87 @@ static void rct1_fix_paths() } } +/** + * + * rct2: 0x006A28F5 + */ +static void rct1_convert_wall(int *type, int *colourA, int *colourB, int *colourC) +{ + switch (*type) { + case 12: // creepy gate + *colourA = 24; + break; + case 26: // medium brown castle wall + *type = 12; + *colourA = 25; + break; + case 27: // tall castle wall with grey window + *type = 12; + *colourA = 2; + case 50: // plate glass + *colourA = 24; + break; + case 13: + *colourB = *colourA; + *colourA = 24; + break; + case 11: // tall castle wall with grey gate + case 22: // brick wall with gate + *colourB = 2; + break; + case 35: // wood post fence + case 42: // tall grey castle wall + case 43: // wooden fence with snow + case 44: + case 45: + case 46: + *colourA = 1; + break; + } +} + /** * * rct2: 0x006A2730 */ -static void sub_6A2730() +static void rct1_fix_walls() { - RCT2_CALLPROC_EBPSAFE(0x006A2730); + rct_map_element *mapElement, originalMapElement; + + for (int x = 0; x < 128; x++) { + for (int y = 0; y < 128; y++) { + mapElement = map_get_first_element_at(x, y); + do { + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_FENCE) { + originalMapElement = *mapElement; + map_element_remove(mapElement); + + uint8 var_05 = originalMapElement.properties.fence.item[0]; + uint16 var_06 = ( + originalMapElement.properties.fence.item[1] | + (originalMapElement.properties.fence.item[2] << 8) + ); + + for (int edge = 0; edge < 4; edge++) { + int typeA = (var_05 >> (edge * 2)) & 3; + int typeB = (var_06 >> (edge * 4)) & 0x0F; + if (typeB != 0x0F) { + int type = typeA | (typeB << 2); + int colourA = ( + ((originalMapElement.type & 0xC0) >> 3) | + (originalMapElement.properties.fence.type >> 5) + ); + int colourB = 0; + int colourC = 0; + rct1_convert_wall(&type, &colourA, &colourB, &colourC); + map_place_fence(type, x * 32, y * 32, 0, edge, colourA, colourB, colourC, 169); + } + } + break; + } + } while (!map_element_is_last_for_tile(mapElement++)); + } + } } /** diff --git a/src/world/map.c b/src/world/map.c index df66204385..8ed9721923 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2490,6 +2490,21 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, } } +money32 map_place_fence( + int type, int x, int y, int z, int edge, int primaryColour, int secondaryColour, int tertiaryColour, int flags +) { + int eax, ebx, ecx, edx, esi, edi, ebp; + + eax = x; + ebx = flags | (type << 8); + ecx = y; + edx = edge | (primaryColour << 8); + edi = z; + ebp = secondaryColour | (tertiaryColour << 8); + game_command_place_fence(&eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + return ebx; +} + /** * * rct2: 0x006B893C diff --git a/src/world/map.h b/src/world/map.h index 048f06dc75..b037e40e88 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -298,6 +298,7 @@ rct_xy16 coordinate_3d_to_2d(const rct_xyz16* coordinate_3d, int rotation); money32 map_clear_scenery(int x0, int y0, int x1, int y1, int flags); money32 lower_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags); money32 raise_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags); +money32 map_place_fence(int type, int x, int y, int z, int edge, int primaryColour, int secondaryColour, int tertiaryColour, int flags); void game_command_set_land_height(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_remove_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); From 81a8434873f7d3aece4f25ab3b7f92b4c71ec580 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 14 Jul 2015 23:37:22 +0100 Subject: [PATCH 0294/1173] fix and refactor rct1_process_scenario_flags --- src/rct1.c | 40 +++++++++++++++------------------------- src/rct1.h | 23 +++++++++++++++++++++++ 2 files changed, 38 insertions(+), 25 deletions(-) diff --git a/src/rct1.c b/src/rct1.c index ce8394e4ed..2b1f33bcf5 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -54,8 +54,8 @@ static void rct1_fix_scenery(); static void rct1_fix_entrance_positions(); static void rct1_reset_research(); -static void sub_69F06A(); -static void sub_666DFD(); +static void rct1_process_scenario_flags(); +static void rct1_reset_park_entrance_path_type(); static void rct1_clear_extra_sprite_entries(); static void rct1_clear_extra_tile_entries(); static void rct1_fix_colours(); @@ -214,7 +214,7 @@ void rct1_fix_landscape() RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_GUEST_CHANGE_MODIFIER, uint8) = 0; rct1_clear_extra_tile_entries(); - sub_69F06A(); + rct1_process_scenario_flags(); rct1_fix_colours(); rct1_fix_z(); rct1_fix_paths(); @@ -479,48 +479,38 @@ static void rct1_reset_research() * * rct2: 0x0069F06A */ -static void sub_69F06A() +static void rct1_process_scenario_flags() { - RCT2_CALLPROC_EBPSAFE(0x0069F06A); return; + uint32 scenarioFlags = RCT2_GLOBAL(0x013CE770, uint32); - // TODO, bug with the following code - RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 0) | (1 << 1) | (1 << 14) | (1 << 2) | (1 << 3); - if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 4))) { - RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 4); - banner_init(); // 6B9CB0 + if (!(scenarioFlags & RCT1_SCENARIO_FLAG_ENABLE_BANNERS)) { + banner_init(); } - if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 6))) { - RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 6); + if (!(scenarioFlags & (1 << 6))) { sub_69E891(); } - RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 7); - if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 8))) { - RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 8); - sub_666DFD(); + if (!(scenarioFlags & RCT1_SCENARIO_FLAG_CUSTOM_PARK_ENTRANCE_PATH)) { + rct1_reset_park_entrance_path_type(); } - if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 9))) { - RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 9); + if (!(scenarioFlags & RCT1_SCENARIO_FLAG_NO_CASH_RESET)) { finance_reset_cash_to_initial(); } - if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 13))) { - RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 13); + if (!(scenarioFlags & RCT1_SCENARIO_FLAG_CUSTOM_MAP_SIZE)) { RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) = 127 * 32; RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_MINUS_2, uint16) = 4350; - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) = 128; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) = 128; RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16) = 4095; } - if (!(RCT2_GLOBAL(0x013CE770, uint32) & (1 << 15))) { - RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 15); + if (!(scenarioFlags & (1 << 15))) { RCT2_GLOBAL(0x01358838, uint32) = 0; } - RCT2_GLOBAL(0x013CE770, uint32) |= (1 << 16) | (1 << 18) | (1 << 19); } /** * * rct2: 0x00666DFD */ -static void sub_666DFD() +static void rct1_reset_park_entrance_path_type() { int x, y; rct_map_element *mapElement; diff --git a/src/rct1.h b/src/rct1.h index 2b6b19b539..07acdc4b95 100644 --- a/src/rct1.h +++ b/src/rct1.h @@ -477,6 +477,29 @@ typedef struct{ uint16 start_track_data_AA_CF; // 0xC4 }rct_track_td4; // Information based off RCTTechDepot +enum { + RCT1_SCENARIO_FLAG_0 = 1 << 0, + RCT1_SCENARIO_FLAG_1 = 1 << 1, + RCT1_SCENARIO_FLAG_2 = 1 << 2, + RCT1_SCENARIO_FLAG_3 = 1 << 3, + RCT1_SCENARIO_FLAG_ENABLE_BANNERS = 1 << 4, + RCT1_SCENARIO_FLAG_5 = 1 << 5, + RCT1_SCENARIO_FLAG_6 = 1 << 6, + RCT1_SCENARIO_FLAG_7 = 1 << 7, + RCT1_SCENARIO_FLAG_CUSTOM_PARK_ENTRANCE_PATH = 1 << 8, + RCT1_SCENARIO_FLAG_NO_CASH_RESET = 1 << 9, + RCT1_SCENARIO_FLAG_10 = 1 << 10, + RCT1_SCENARIO_FLAG_11 = 1 << 11, + RCT1_SCENARIO_FLAG_12 = 1 << 12, + RCT1_SCENARIO_FLAG_CUSTOM_MAP_SIZE = 1 << 13, + RCT1_SCENARIO_FLAG_14 = 1 << 14, + RCT1_SCENARIO_FLAG_15 = 1 << 15, + RCT1_SCENARIO_FLAG_16 = 1 << 16, + RCT1_SCENARIO_FLAG_17 = 1 << 17, + RCT1_SCENARIO_FLAG_18 = 1 << 18, + RCT1_SCENARIO_FLAG_19 = 1 << 19, +}; + extern const uint8 RCT1ColourConversionTable[32]; char **gVehicleHierarchies[0x60]; From 689f7c9f1dcf7b6846565f8e4269645411ad9040 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Tue, 14 Jul 2015 15:49:46 -0600 Subject: [PATCH 0295/1173] #1130 save last audio device --- src/config.c | 1 + src/config.h | 1 + src/openrct2.c | 11 ++++++++++- src/windows/options.c | 8 +++++++- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 8c42c9dfe7..d596175a65 100644 --- a/src/config.c +++ b/src/config.c @@ -202,6 +202,7 @@ config_property_definition _soundDefinitions[] = { { offsetof(sound_configuration, ride_music), "ride_music", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, { offsetof(sound_configuration, master_volume), "master_volume", CONFIG_VALUE_TYPE_UINT8, 100, NULL }, { offsetof(sound_configuration, music_volume), "music_volume", CONFIG_VALUE_TYPE_UINT8, 100, NULL }, + { offsetof(sound_configuration, device), "audio_device", CONFIG_VALUE_TYPE_STRING, { .value_string = NULL }, NULL }, }; config_property_definition _cheatDefinitions[] = { diff --git a/src/config.h b/src/config.h index 4cb4a618f0..aa7fdfa6c3 100644 --- a/src/config.h +++ b/src/config.h @@ -175,6 +175,7 @@ typedef struct { uint8 ride_music; uint8 master_volume; uint8 music_volume; + utf8string device; } sound_configuration; typedef struct { diff --git a/src/openrct2.c b/src/openrct2.c index 30f8ff86a5..a7611086b7 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -197,7 +197,16 @@ bool openrct2_initialise() openrct2_copy_original_user_files_over(); - Mixer_Init(NULL); + char* devicename = gConfigSound.device; + if (strlen(devicename) == 0) { + devicename = NULL; + } + Mixer_Init(devicename); + for (int i = 0; i < gAudioDeviceCount; i++) { + if (strcmp(gAudioDevices[i].name, gConfigSound.device) == 0) { + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = i; + } + } return true; } diff --git a/src/windows/options.c b/src/windows/options.c index 1aab0a5cdb..a13cd32401 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -961,10 +961,16 @@ static void window_options_dropdown(rct_window *w, int widgetIndex, int dropdown #ifdef USE_MIXER if (dropdownIndex == 0) { Mixer_Init(NULL); + gConfigSound.device = NULL; } else { - Mixer_Init(gAudioDevices[dropdownIndex].name); + char* devicename = gAudioDevices[dropdownIndex].name; + Mixer_Init(devicename); + SafeFree(gConfigSound.device); + gConfigSound.device = malloc(strlen(devicename) + 1); + strcpy(gConfigSound.device, devicename); } + config_save_default(); #endif } /*#ifdef _MSC_VER From ca6c3d68aa5059c09939fecfea7900a2b032d4da Mon Sep 17 00:00:00 2001 From: zsilencer Date: Tue, 14 Jul 2015 16:38:56 -0600 Subject: [PATCH 0296/1173] fix #1155 --- src/audio/audio.c | 31 ++++++++++++------------------- src/audio/audio.h | 1 + src/audio/mixer.cpp | 2 +- src/peep/peep.c | 5 +++-- src/ride/ride.c | 4 ++-- src/ride/vehicle.c | 3 ++- src/world/climate.c | 5 +++-- 7 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 2e69cbff2d..9459019066 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -39,6 +39,7 @@ rct_ride_music_params gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC]; rct_ride_music_params *gRideMusicParamsListEnd; void *gCrowdSoundChannel = 0; void *gTitleMusicChannel = 0; +bool gGameSoundsOff = false; void audio_init(int i) { @@ -1423,7 +1424,7 @@ int get_dsound_devices() int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z) { int result = 0; - if (RCT2_GLOBAL(0x009AF59D, uint8) & 1) { + if (gConfigSound.sound) { RCT2_GLOBAL(0x00F438AD, uint8) = 0; int volume = 0; if (ebx == 0x8001) { @@ -1557,7 +1558,7 @@ void start_title_music() break; } - if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0)) && RCT2_GLOBAL(0x009AF59D, uint8) & 1 + if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0)) && gConfigSound.sound && RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) { if (!RCT2_GLOBAL(0x009AF600, uint8)) { #ifdef USE_MIXER @@ -1809,13 +1810,11 @@ void audio_close() /* rct2: 0x006BAB8A */ void toggle_all_sounds(){ - // When all sound code is reversed replace with gConfigSound.sound - RCT2_GLOBAL(0x009AF59D, uint8) ^= 1; - if (RCT2_GLOBAL(0x009AF59D, uint8) == 0) { + gConfigSound.sound = !gConfigSound.sound; + if (!gConfigSound.sound) { stop_title_music(); pause_sounds(); - } - else{ + } else { unpause_sounds(); } } @@ -1826,15 +1825,11 @@ void toggle_all_sounds(){ */ void pause_sounds() { - // When all sound code is reversed replace with gConfigSound.sound - RCT2_GLOBAL(0x009AF59C, uint8) = 1; - if (RCT2_GLOBAL(0x009AF59C, uint8) == 1) { - stop_other_sounds(); - stop_vehicle_sounds(); - stop_ride_music(); - stop_crowd_sound(); - } - gConfigSound.sound = 0; + gGameSoundsOff = 1; + stop_other_sounds(); + stop_vehicle_sounds(); + stop_ride_music(); + stop_crowd_sound(); } /** @@ -1843,9 +1838,7 @@ void pause_sounds() */ void unpause_sounds() { - // When all sound code is reversed replace with gConfigSound.sound - RCT2_GLOBAL(0x009AF59C, uint8) = 0; - gConfigSound.sound = 1; + gGameSoundsOff = 0; } /** diff --git a/src/audio/audio.h b/src/audio/audio.h index 037206227a..ef41f56601 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -156,6 +156,7 @@ extern rct_ride_music_params gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC]; extern rct_ride_music_params *gRideMusicParamsListEnd; extern void *gCrowdSoundChannel; extern void *gTitleMusicChannel; +extern bool gGameSoundsOff; void audio_timefunc(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2, int channel); int CALLBACK audio_timer_callback(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2); diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index 0d6844b616..17dc692d4f 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -568,7 +568,7 @@ void SDLCALL Mixer::Callback(void* arg, uint8* stream, int length) void Mixer::MixChannel(Channel& channel, uint8* data, int length) { - if (channel.source && channel.source->Length() > 0 && !channel.done) { + if (channel.source && channel.source->Length() > 0 && !channel.done && gConfigSound.sound) { AudioFormat streamformat = channel.source->Format(); int loaded = 0; SDL_AudioCVT cvt; diff --git a/src/peep/peep.c b/src/peep/peep.c index 6fa22c1c9a..31877ee159 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -25,6 +25,7 @@ #include "../localisation/localisation.h" #include "../management/finance.h" #include "../management/news_item.h" +#include "../config.h" #include "../openrct2.h" #include "../ride/ride.h" #include "../scenario.h" @@ -4494,10 +4495,10 @@ void peep_update_crowd_noise() if (!(RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0))) return; - if (RCT2_GLOBAL(0x009AF59C, uint8) != 0) + if (gGameSoundsOff) return; - if (!(RCT2_GLOBAL(0x009AF59D, uint8) & (1 << 0))) + if (!gConfigSound.sound) return; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) diff --git a/src/ride/ride.c b/src/ride/ride.c index 6362cd4e7f..d6823183ee 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3143,7 +3143,7 @@ void ride_set_map_tooltip(rct_map_element *mapElement) */ int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint16 sampleRate, uint32 position, uint8 *tuneId) { - if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !RCT2_GLOBAL(0x009AF59C, uint8) && RCT2_GLOBAL(0x00F438A4, rct_viewport*) != (rct_viewport*)-1) { + if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gGameSoundsOff && RCT2_GLOBAL(0x00F438A4, rct_viewport*) != (rct_viewport*)-1) { RCT2_GLOBAL(0x009AF47C, uint16) = sampleRate; sint16 v11; sint16 v12; @@ -3373,7 +3373,7 @@ void ride_music_update_final() int ebx; if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2)) { if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0))) { - if (!RCT2_GLOBAL(0x009AF59C, uint8) && RCT2_GLOBAL(0x009AF59D, uint8) & 1 && RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8) && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 1)) { + if (!gGameSoundsOff && gConfigSound.sound && RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8) && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 1)) { // set to stop music if volume <= 1 ? while (1) { int v8 = 0; diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index 3536ea1985..6b8dcfa672 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -21,6 +21,7 @@ #include "../addresses.h" #include "../audio/audio.h" #include "../audio/mixer.h" +#include "../config.h" #include "../interface/viewport.h" #include "../world/sprite.h" #include "ride.h" @@ -166,7 +167,7 @@ int sub_6BC2F3(rct_vehicle* vehicle) */ void vehicle_sounds_update() { - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) != -1 && !RCT2_GLOBAL(0x009AF59C, uint8) && RCT2_GLOBAL(0x009AF59D, uint8) & 1) { + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) != -1 && !gGameSoundsOff && gConfigSound.sound) { RCT2_GLOBAL(0x00F438A4, rct_viewport*) = (rct_viewport*)-1; rct_viewport* viewport = (rct_viewport*)-1; rct_window* window = RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); diff --git a/src/world/climate.c b/src/world/climate.c index 51ac92409a..60347f3d10 100644 --- a/src/world/climate.c +++ b/src/world/climate.c @@ -21,6 +21,7 @@ #include "../addresses.h" #include "../audio/audio.h" #include "../audio/mixer.h" +#include "../config.h" #include "../drawing/drawing.h" #include "../localisation/date.h" #include "../scenario.h" @@ -242,9 +243,9 @@ void climate_update_sound() { if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) == 0xFFFFFFFF) return; - if (RCT2_GLOBAL(0x009AF59C, uint8) != 0) + if (gGameSoundsOff) return; - if (!(RCT2_GLOBAL(0x009AF59D, uint8) & 1)) + if (!gConfigSound.sound) return; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) return; From 72d16dd4d03cc0a1d797598b3efabaadeba15fe0 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Tue, 14 Jul 2015 16:44:35 -0600 Subject: [PATCH 0297/1173] make all sounds play correctly through hook --- src/openrct2.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/openrct2.c b/src/openrct2.c index a7611086b7..d912c9921f 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -191,6 +191,7 @@ bool openrct2_initialise() addhook(0x006E7499, (int)gfx_redraw_screen_rect, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0); // remove when 0x6E7FF3 is decompiled addhook(0x006B752C, (int)ride_crash, 0, (int[]){ EDX, EBX, END }, 0); // remove when all callers are decompiled addhook(0x0069A42F, (int)peep_window_state_update, 0, (int[]){ ESI, END }, 0); // remove when all callers are decompiled + addhook(0x006BB76E, (int)sound_play_panned, 0, (int[]){EAX, EBX, ECX, EDX, EBP, END}, EAX); // remove when all callers are decompiled if (!rct2_init()) return false; From 07717abdfd64f3ae3e614e4342d94b9812a6118c Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 14 Jul 2015 23:59:29 +0100 Subject: [PATCH 0298/1173] fix audio initialisation bug when device is not set in config --- src/openrct2.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/openrct2.c b/src/openrct2.c index d912c9921f..3ac3b6eb3d 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -33,9 +33,10 @@ #include "openrct2.h" #include "platform/platform.h" #include "ride/ride.h" -#include "util/sawyercoding.h" -#include "world/mapgen.h" #include "title.h" +#include "util/sawyercoding.h" +#include "util/util.h" +#include "world/mapgen.h" int gOpenRCT2StartupAction = STARTUP_ACTION_TITLE; char gOpenRCT2StartupActionPath[512] = { 0 }; @@ -198,16 +199,19 @@ bool openrct2_initialise() openrct2_copy_original_user_files_over(); - char* devicename = gConfigSound.device; - if (strlen(devicename) == 0) { - devicename = NULL; - } - Mixer_Init(devicename); - for (int i = 0; i < gAudioDeviceCount; i++) { - if (strcmp(gAudioDevices[i].name, gConfigSound.device) == 0) { - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = i; + // TODO move to audio initialise function + if (str_is_null_or_empty(gConfigSound.device)) { + Mixer_Init(NULL); + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = 0; + } else { + Mixer_Init(gConfigSound.device); + for (int i = 0; i < gAudioDeviceCount; i++) { + if (strcmp(gAudioDevices[i].name, gConfigSound.device) == 0) { + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = i; + } } } + return true; } From f180ceb71cefa6f76bc5f847439a25c3eabceb51 Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 15 Jul 2015 04:00:16 +0100 Subject: [PATCH 0299/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 701 +++++++++++++------------- data/language/dutch.txt | 3 + data/language/english_us.txt | 26 +- 3 files changed, 378 insertions(+), 352 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index b7bd4c908c..68e791ae5e 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -8,15 +8,15 @@ STR_0003 :Stand-up Roller Coaster STR_0004 :Suspended Swinging Coaster STR_0005 :Inverted Roller Coaster STR_0006 :Junior Roller Coaster -STR_0007 :Miniature Railroad +STR_0007 :Miniature Railway STR_0008 :Monorail STR_0009 :Mini Suspended Coaster -STR_0010 :Boat Hire +STR_0010 :Boat Ride STR_0011 :Wooden Wild Mouse STR_0012 :Steeplechase STR_0013 :Car Ride STR_0014 :Launched Freefall -STR_0015 :Bobsled Coaster +STR_0015 :Bobsleigh Coaster STR_0016 :Observation Tower STR_0017 :Looping Roller Coaster STR_0018 :Dinghy Slide @@ -28,7 +28,7 @@ STR_0023 :Spiral Slide STR_0024 :Go Karts STR_0025 :Log Flume STR_0026 :River Rapids -STR_0027 :Bumper Cars +STR_0027 :Dodgems STR_0028 :Pirate Ship STR_0029 :Swinging Inverter Ship STR_0030 :Food Stall @@ -36,24 +36,24 @@ STR_0031 :Unknown Stall (1D) STR_0032 :Drink Stall STR_0033 :Unknown Stall (1F) STR_0034 :Shop -STR_0035 :Carousel +STR_0035 :Merry-Go-Round STR_0036 :Unknown Stall (22) STR_0037 :Information Kiosk -STR_0038 :Restroom +STR_0038 :Toilets STR_0039 :Ferris Wheel STR_0040 :Motion Simulator -STR_0041 :3D Theater +STR_0041 :3D Cinema STR_0042 :Top Spin STR_0043 :Space Rings STR_0044 :Reverse Freefall Coaster -STR_0045 :Elevator +STR_0045 :Lift STR_0046 :Vertical Drop Roller Coaster -STR_0047 :ATM +STR_0047 :Cash Machine STR_0048 :Twist STR_0049 :Haunted House STR_0050 :First Aid Room STR_0051 :Circus Show -STR_0052 :Tunnel Of Horror +STR_0052 :Ghost Train STR_0053 :Steel Twister Roller Coaster STR_0054 :Wooden Roller Coaster STR_0055 :Side-Friction Roller Coaster @@ -527,7 +527,7 @@ STR_0522 :A smaller roller coaster where the riders sit above the track with STR_0523 :Riders travel slowly in powered vehicles along a track-based route STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track -STR_0526 :Passengers travel in an rotating observation cabin which travels up a tall tower +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track @@ -829,16 +829,16 @@ STR_0824 :{BLACK}{CROSS} STR_0825 :Chosen name in use already STR_0826 :Too many names defined STR_0827 :沒有足夠現金 - 需要{CURRENCY2DP} -STR_0828 :{SMALLFONT}{BLACK}Close window -STR_0829 :{SMALLFONT}{BLACK}Window title - Drag this to move window +STR_0828 :{SMALLFONT}{BLACK}關閉視窗 +STR_0829 :{SMALLFONT}{BLACK}視窗標題 - 拖曳此來移動本視窗 STR_0830 :{SMALLFONT}{BLACK}Zoom view in STR_0831 :{SMALLFONT}{BLACK}Zoom view out STR_0832 :{SMALLFONT}{BLACK}Rotate view 90{DEGREE} clockwise -STR_0833 :{SMALLFONT}{BLACK}Pause game +STR_0833 :{SMALLFONT}{BLACK}暫停遊戲 STR_0834 :{SMALLFONT}{BLACK}Disk and game options STR_0835 :Game initialization failed -STR_0836 :Unable to start game in a minimized state -STR_0837 :Unable to initialize graphics system +STR_0836 :Unable to start game in a minimised state +STR_0837 :Unable to initialise graphics system STR_0838 :CD key code {INT32} is not valid for your RollerCoaster Tycoon 2 CD !{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Please un-install RollerCoaster Tycoon 2% and re-install with the correct CD Key Code STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} @@ -878,11 +878,11 @@ STR_0873 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_0874 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_0875 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_0876 :{BLACK}{DOWN} -STR_0877 :Too low ! -STR_0878 :Too high ! -STR_0879 :Can't lower land here... -STR_0880 :Can't raise land here... -STR_0881 :Object in the way +STR_0877 :太低! +STR_0878 :太高! +STR_0879 :不能降低此地... +STR_0880 :不能升高此地... +STR_0881 :物件擋於此地 STR_0882 :載入遊戲 STR_0883 :儲存遊戲 STR_0884 :儲存劇情 @@ -896,61 +896,61 @@ STR_0891 :截圖 STR_0892 :截圖'{STRINGID}'已儲存到硬碟中 STR_0893 :截圖失敗! STR_0894 :Landscape data area full ! -STR_0895 :Can't build partly above and partly below ground -STR_0896 :{POP16}{POP16}{STRINGID} Construction -STR_0897 :Direction -STR_0898 :{SMALLFONT}{BLACK}Left-hand curve -STR_0899 :{SMALLFONT}{BLACK}Right-hand curve -STR_0900 :{SMALLFONT}{BLACK}Left-hand curve (small radius) -STR_0901 :{SMALLFONT}{BLACK}Right-hand curve (small radius) -STR_0902 :{SMALLFONT}{BLACK}Left-hand curve (very small radius) -STR_0903 :{SMALLFONT}{BLACK}Right-hand curve (very small radius) -STR_0904 :{SMALLFONT}{BLACK}Left-hand curve (large radius) -STR_0905 :{SMALLFONT}{BLACK}Right-hand curve (large radius) -STR_0906 :{SMALLFONT}{BLACK}Straight -STR_0907 :Slope -STR_0908 :Roll/Banking +STR_0895 :不能建造在一半露天一半地底的地勢 +STR_0896 :{POP16}{POP16}{STRINGID} 建造 +STR_0897 :方向 +STR_0898 :{SMALLFONT}{BLACK}左彎 +STR_0899 :{SMALLFONT}{BLACK}右彎 +STR_0900 :{SMALLFONT}{BLACK}左彎 (小弧度) +STR_0901 :{SMALLFONT}{BLACK}右彎 (小弧度) +STR_0902 :{SMALLFONT}{BLACK}左彎 (很小弧度) +STR_0903 :{SMALLFONT}{BLACK}右彎 (很小弧度) +STR_0904 :{SMALLFONT}{BLACK}左彎 (大弧度) +STR_0905 :{SMALLFONT}{BLACK}右彎 (大弧度) +STR_0906 :{SMALLFONT}{BLACK}直向前 +STR_0907 :斜度 +STR_0908 :滾動/傾斜 STR_0909 :Seat Rot. -STR_0910 :{SMALLFONT}{BLACK}Roll for left-hand curve -STR_0911 :{SMALLFONT}{BLACK}Roll for right-hand curve -STR_0912 :{SMALLFONT}{BLACK}No roll -STR_0913 :{SMALLFONT}{BLACK}Move to previous section -STR_0914 :{SMALLFONT}{BLACK}Move to next section -STR_0915 :{SMALLFONT}{BLACK}Construct the selected section -STR_0916 :{SMALLFONT}{BLACK}Remove the highlighted section -STR_0917 :{SMALLFONT}{BLACK}Vertical drop -STR_0918 :{SMALLFONT}{BLACK}Steep slope down -STR_0919 :{SMALLFONT}{BLACK}Slope down -STR_0920 :{SMALLFONT}{BLACK}Level -STR_0921 :{SMALLFONT}{BLACK}Slope up -STR_0922 :{SMALLFONT}{BLACK}Steep slope up -STR_0923 :{SMALLFONT}{BLACK}Vertical rise -STR_0924 :{SMALLFONT}{BLACK}Helix down -STR_0925 :{SMALLFONT}{BLACK}Helix up -STR_0926 :Can't remove this... -STR_0927 :Can't construct this here... -STR_0928 :{SMALLFONT}{BLACK}Chain lift, to pull cars up slopes -STR_0929 :'S' Bend (left) -STR_0930 :'S' Bend (right) -STR_0931 :Vertical Loop (left) -STR_0932 :Vertical Loop (right) -STR_0933 :Raise or lower land first -STR_0934 :Ride entrance in the way -STR_0935 :Ride exit in the way -STR_0936 :Park entrance in the way -STR_0937 :{SMALLFONT}{BLACK}View options -STR_0938 :{SMALLFONT}{BLACK}Adjust land height and slope -STR_0939 :Underground/Inside View -STR_0940 :Remove Base Land -STR_0941 :Remove Vertical Faces -STR_0942 :See-Through Rides -STR_0943 :See-Through Scenery +STR_0910 :{SMALLFONT}{BLACK}向左傾斜 +STR_0911 :{SMALLFONT}{BLACK}向右傾斜 +STR_0912 :{SMALLFONT}{BLACK}無傾斜 +STR_0913 :{SMALLFONT}{BLACK}移動到前一個軌道 +STR_0914 :{SMALLFONT}{BLACK}移動到後一個軌道 +STR_0915 :{SMALLFONT}{BLACK}建造此被選中的軌道 +STR_0916 :{SMALLFONT}{BLACK}拆除被高亮選中的軌道 +STR_0917 :{SMALLFONT}{BLACK}垂直下坡 +STR_0918 :{SMALLFONT}{BLACK}陡下坡 +STR_0919 :{SMALLFONT}{BLACK}下坡 +STR_0920 :{SMALLFONT}{BLACK}水平 +STR_0921 :{SMALLFONT}{BLACK}上坡 +STR_0922 :{SMALLFONT}{BLACK}陡上坡 +STR_0923 :{SMALLFONT}{BLACK}垂直上坡 +STR_0924 :{SMALLFONT}{BLACK}向下盤旋 +STR_0925 :{SMALLFONT}{BLACK}向上盤旋 +STR_0926 :不能移除... +STR_0927 :不能在此建造... +STR_0928 :{SMALLFONT}{BLACK}帶有鏈條的坡道, 將車卡拉上坡 +STR_0929 :'S'型彎道 (向左) +STR_0930 :'S'型彎道 (向右) +STR_0931 :垂直回環 (向左) +STR_0932 :垂直回環 (向右) +STR_0933 :先把地面降低或升高 +STR_0934 :遊樂設施的入口擋於此地 +STR_0935 :遊樂設施的出口擋於此地 +STR_0936 :樂園入口擋於此地 +STR_0937 :{SMALLFONT}{BLACK}檢視選項 +STR_0938 :{SMALLFONT}{BLACK}調整地勢高低及陡峭 +STR_0939 :地底/內部檢視模式 +STR_0940 :移除地表 +STR_0941 :移除垂直表面 +STR_0942 :略過遊樂設施 +STR_0943 :略過景物 STR_0944 :儲存 STR_0945 :不要儲存 -STR_0946 :Cancel -STR_0947 :Save this before loading ? -STR_0948 :Save this before quitting ? -STR_0949 :Save this before quitting ? +STR_0946 :取消 +STR_0947 :載入其他遊戲之前儲存此遊戲? +STR_0948 :離開遊戲之前儲存此遊戲? +STR_0949 :離開遊戲之前儲存此遊戲? STR_0950 :載入遊戲 STR_0951 :離開遊戲 STR_0952 :離開遊戲 @@ -990,27 +990,27 @@ STR_0986 :{BLACK}{CURRENCY2DP} STR_0987 :太多遊樂設施/店鋪... STR_0988 :不能興建遊樂設施/店鋪... STR_0989 :{STRINGID} -STR_0990 :{SMALLFONT}{BLACK}Construction +STR_0990 :{SMALLFONT}{BLACK}建造 STR_0991 :車站月台 STR_0992 :{SMALLFONT}{BLACK}拆除整個遊樂設施/店鋪 STR_0993 :拆除遊樂設施/店鋪 STR_0994 :拆除 STR_0995 :{WINDOW_COLOUR_1}你確定要拆除整個{STRINGID}? -STR_0996 :Overall view -STR_0997 :{SMALLFONT}{BLACK}View selection -STR_0998 :No more stations allowed on this ride -STR_0999 :Requires a station platform -STR_1000 :Track is not a complete circuit -STR_1001 :Track unsuitable for type of train -STR_1002 :Can't open {POP16}{POP16}{POP16}{STRINGID}... -STR_1003 :Can't test {POP16}{POP16}{POP16}{STRINGID}... -STR_1004 :Can't close {POP16}{POP16}{POP16}{STRINGID}... -STR_1005 :Can't start construction on {POP16}{POP16}{POP16}{STRINGID}... -STR_1006 :Must be closed first -STR_1007 :Unable to create enough vehicles -STR_1008 :{SMALLFONT}{BLACK}Open, close, or test ride/attraction -STR_1009 :{SMALLFONT}{BLACK}Open or close all rides/attractions -STR_1010 :{SMALLFONT}{BLACK}Open or close park +STR_0996 :整體外觀 +STR_0997 :{SMALLFONT}{BLACK}選擇檢視範圍 +STR_0998 :此遊樂設施的車站數量已達到上限 +STR_0999 :需要一個車站站台 +STR_1000 :軌道並未完整連接 +STR_1001 :軌道不適合此類型的車卡 +STR_1002 :不能開啟{POP16}{POP16}{POP16}{STRINGID}... +STR_1003 :不能測試{POP16}{POP16}{POP16}{STRINGID}... +STR_1004 :不能關閉{POP16}{POP16}{POP16}{STRINGID}... +STR_1005 :不能於{POP16}{POP16}{POP16}{STRINGID}中建設... +STR_1006 :必需先行關閉 +STR_1007 :無法創建足夠的車輛 +STR_1008 :{SMALLFONT}{BLACK}關閉, 開啟或測試遊樂設施/店鋪 +STR_1009 :{SMALLFONT}{BLACK}關閉或開放所有遊樂設施/店鋪 +STR_1010 :{SMALLFONT}{BLACK}關閉或開放樂園 STR_1011 :關閉所有遊樂設施 STR_1012 :開啟所有遊樂設施 STR_1013 :關閉樂園 @@ -1041,18 +1041,18 @@ STR_1037 :Load Landscape STR_1038 :Convert saved game to scenario STR_1039 :Install new track design STR_1040 :儲存遊戲 -STR_1041 :Save Scenario -STR_1042 :Save Landscape +STR_1041 :儲存劇情 +STR_1042 :儲存地型 STR_1043 :RollerCoaster Tycoon 2 遊戲存檔 -STR_1044 :RollerCoaster Tycoon 2 Scenario File -STR_1045 :RollerCoaster Tycoon 2 Landscape File -STR_1046 :RollerCoaster Tycoon 2 Track Design File -STR_1047 :Game save failed! -STR_1048 :Scenario save failed! -STR_1049 :Landscape save failed! -STR_1050 :Failed to load...{NEWLINE}File contains invalid data! -STR_1051 :Invisible Supports -STR_1052 :Invisible People +STR_1044 :RollerCoaster Tycoon 2 劇情檔案 +STR_1045 :RollerCoaster Tycoon 2 地型檔案 +STR_1046 :RollerCoaster Tycoon 2 軌道設計檔案 +STR_1047 :儲存遊戲失敗! +STR_1048 :儲存劇情失敗! +STR_1049 :儲存地型失敗! +STR_1050 :載入失敗...{NEWLINE}檔案中含有非法資料! +STR_1051 :透明化支撐 +STR_1052 :透明化遊客 STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park STR_1054 :{SMALLFONT}{BLACK}Name ride/attraction STR_1055 :{SMALLFONT}{BLACK}Name person @@ -1061,8 +1061,8 @@ STR_1057 :Ride/attraction name STR_1058 :Enter new name for this ride/attraction: STR_1059 :Can't rename ride/attraction... STR_1060 :Invalid ride/attraction name -STR_1061 :Normal 模式 -STR_1062 :Continuous circuit 模式 +STR_1061 :正常模式 +STR_1062 :連續巡迴模式 STR_1063 :Reverse-Incline launched shuttle 模式 STR_1064 :Powered launch (passing station) STR_1065 :穿梭模式 @@ -1074,12 +1074,12 @@ STR_1070 :Single ride per admission STR_1071 :Unlimited rides per admission STR_1072 :迷宮模式 STR_1073 :賽車模式 -STR_1074 :Bumper-car 模式 +STR_1074 :碰碰車模式 STR_1075 :Swing 模式 -STR_1076 :Shop stall 模式 -STR_1077 :Rotation 模式 -STR_1078 :Forward rotation -STR_1079 :Backward rotation +STR_1076 :店面模式 +STR_1077 :旋轉模式 +STR_1078 :向前旋轉 +STR_1079 :向後旋轉 STR_1080 :電影: {ENDQUOTES}Avenging aviators{ENDQUOTES} STR_1081 :3D電影: {ENDQUOTES}Mouse tails{ENDQUOTES} STR_1082 :Space rings 模式 @@ -1095,20 +1095,20 @@ STR_1091 :馬戲團表演模式 STR_1092 :Downward launch STR_1093 :Crooked house 模式 STR_1094 :Freefall drop 模式 -STR_1095 :Continuous circuit block sectioned 模式 +STR_1095 :Continuous circuit block sectioned mode STR_1096 :Powered launch (without passing station) -STR_1097 :Powered launch block sectioned 模式 -STR_1098 :Moving to end of {POP16}{STRINGID} -STR_1099 :Waiting for passengers at {POP16}{STRINGID} -STR_1100 :Waiting to depart {POP16}{STRINGID} -STR_1101 :Departing {POP16}{STRINGID} -STR_1102 :Traveling at {VELOCITY} -STR_1103 :Arriving at {POP16}{STRINGID} -STR_1104 :Unloading passengers at {POP16}{STRINGID} -STR_1105 :Traveling at {VELOCITY} -STR_1106 :Crashing! -STR_1107 :Crashed! -STR_1108 :Traveling at {VELOCITY} +STR_1097 :Powered launch block sectioned mode +STR_1098 :移動到{POP16}{STRINGID}的最尾中 +STR_1099 :在{POP16}{STRINGID}等待乘客中 +STR_1100 :等待離開{POP16}{STRINGID}中 +STR_1101 :離開{POP16}{STRINGID} +STR_1102 :以{VELOCITY}行走 +STR_1103 :到達{POP16}{STRINGID} +STR_1104 :在{POP16}{STRINGID}卸去乘客中 +STR_1105 :以{VELOCITY}行走 +STR_1106 :毀壞中! +STR_1107 :毀壞了! +STR_1108 :以{VELOCITY}行走 STR_1109 :Swinging STR_1110 :Rotating STR_1111 :Rotating @@ -1120,7 +1120,7 @@ STR_1116 :Operating STR_1117 :馬戲團表演中 STR_1118 :Operating STR_1119 :Waiting for cable lift -STR_1120 :Traveling at {VELOCITY} +STR_1120 :Travelling at {VELOCITY} STR_1121 :Stopping STR_1122 :等待乘客中 STR_1123 :Waiting to start @@ -1129,25 +1129,25 @@ STR_1125 :Operating STR_1126 :Stopping STR_1127 :Unloading passengers STR_1128 :Stopped by block brakes -STR_1129 :All vehicles in same colors -STR_1130 :Different colors per {STRINGID} -STR_1131 :Different colors per vehicle +STR_1129 :All vehicles in same colours +STR_1130 :Different colours per {STRINGID} +STR_1131 :Different colours per vehicle STR_1132 :Vehicle {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1133 :Vehicle {POP16}{COMMA16} STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} STR_1135 :{STRINGID} {COMMA16} -STR_1136 :{SMALLFONT}{BLACK}Select main color -STR_1137 :{SMALLFONT}{BLACK}Select additional color 1 -STR_1138 :{SMALLFONT}{BLACK}Select additional color 2 -STR_1139 :{SMALLFONT}{BLACK}Select support structure color -STR_1140 :{SMALLFONT}{BLACK}Select vehicle color scheme option +STR_1136 :{SMALLFONT}{BLACK}Select main colour +STR_1137 :{SMALLFONT}{BLACK}Select additional colour 1 +STR_1138 :{SMALLFONT}{BLACK}Select additional colour 2 +STR_1139 :{SMALLFONT}{BLACK}Select support structure colour +STR_1140 :{SMALLFONT}{BLACK}Select vehicle colour scheme option STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} STR_1144 :Can't build/move entrance for this ride/attraction... STR_1145 :Can't build/move exit for this ride/attraction... -STR_1146 :尚未興建入口 -STR_1147 :尚未興建出口 +STR_1146 :Entrance not yet built +STR_1147 :Exit not yet built STR_1148 :Quarter load STR_1149 :Half load STR_1150 :Three-quarter load @@ -1215,9 +1215,9 @@ STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time: STR_1212 :{WINDOW_COLOUR_2}Maximum waiting time: STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing -STR_1215 :{WINDOW_COLOUR_2}Synchronize with adjacent stations -STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronize departure with all adjacent stations (for 'racing') -STR_1217 :{COMMA16}秒 +STR_1215 :{WINDOW_COLOUR_2}Synchronise with adjacent stations +STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronise departure with all adjacent stations (for 'racing') +STR_1217 :{COMMA16} seconds STR_1218 :{BLACK}{SMALLUP} STR_1219 :{BLACK}{SMALLDOWN} STR_1220 :只准落客 @@ -1236,12 +1236,12 @@ STR_1232 :Trains STR_1233 :{COMMA16} train STR_1234 :{COMMA16} trains STR_1235 :Train {COMMA16} -STR_1236 :boat -STR_1237 :boats -STR_1238 :Boat -STR_1239 :Boats -STR_1240 :{COMMA16} boat -STR_1241 :{COMMA16} boats +STR_1236 :小船 +STR_1237 :小船 +STR_1238 :小船 +STR_1239 :小船 +STR_1240 :{COMMA16} 小船 +STR_1241 :{COMMA16} 小船 STR_1242 :Boat {COMMA16} STR_1243 :track STR_1244 :tracks @@ -1250,20 +1250,20 @@ STR_1246 :Tracks STR_1247 :{COMMA16} track STR_1248 :{COMMA16} tracks STR_1249 :Track {COMMA16} -STR_1250 :docking platform -STR_1251 :docking platforms -STR_1252 :Docking platform -STR_1253 :Docking platforms -STR_1254 :{COMMA16} docking platform -STR_1255 :{COMMA16} docking platforms -STR_1256 :Docking platform {COMMA16} -STR_1257 :station -STR_1258 :stations -STR_1259 :Station -STR_1260 :Stations -STR_1261 :{COMMA16} station -STR_1262 :{COMMA16} stations -STR_1263 :Station {COMMA16} +STR_1250 :船用月台 +STR_1251 :船用月台 +STR_1252 :船用月台 +STR_1253 :船用月台 +STR_1254 :{COMMA16} 船用月台 +STR_1255 :{COMMA16} 船用月台 +STR_1256 :船用月台 {COMMA16} +STR_1257 :車站 +STR_1258 :車站 +STR_1259 :車站 +STR_1260 :車站 +STR_1261 :{COMMA16} 車站 +STR_1262 :{COMMA16} 車站 +STR_1263 :車站 {COMMA16} STR_1264 :car STR_1265 :cars STR_1266 :Car @@ -1339,7 +1339,7 @@ STR_1335 :{STRINGID} - Entrance{POP16}{POP16} STR_1336 :{STRINGID} - Station {POP16}{COMMA16} Entrance STR_1337 :{STRINGID} - Exit{POP16}{POP16} STR_1338 :{STRINGID} - Station {POP16}{COMMA16} Exit -STR_1339 :{BLACK}No test results yet... +STR_1339 :{BLACK}暫無測試結果... STR_1340 :{WINDOW_COLOUR_2}Max. speed: {BLACK}{VELOCITY} STR_1341 :{WINDOW_COLOUR_2}Ride time: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} STR_1342 :{DURATION} @@ -1396,7 +1396,7 @@ STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options STR_1394 :{SMALLFONT}{BLACK}Operating options STR_1395 :{SMALLFONT}{BLACK}Maintenance options -STR_1396 :{SMALLFONT}{BLACK}Color scheme options +STR_1396 :{SMALLFONT}{BLACK}Colour scheme options STR_1397 :{SMALLFONT}{BLACK}Sound & music options STR_1398 :{SMALLFONT}{BLACK}Measurements and test data STR_1399 :{SMALLFONT}{BLACK}Graphs @@ -1464,10 +1464,10 @@ STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track STR_1462 :Too steep for lift hill STR_1463 :遊客 -STR_1464 :Helix up (small) -STR_1465 :Helix up (large) -STR_1466 :Helix down (small) -STR_1467 :Helix down (large) +STR_1464 :向上盤旋 (小型) +STR_1465 :向上盤旋 (大型) +STR_1466 :向下盤旋 (小型) +STR_1467 :向下盤旋 (大型) STR_1468 :員工 STR_1469 :Ride must start and end with stations STR_1470 :Station not long enough @@ -1525,9 +1525,9 @@ STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} -STR_1525 :{SMALLFONT}{OPENQUOTES}These fries from {STRINGID} are really good value{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} -STR_1527 :{SMALLFONT}{OPENQUOTES}This cotton candy from {STRINGID} is really good value{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} STR_1528 : STR_1529 : STR_1530 : @@ -1537,9 +1537,9 @@ STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} -STR_1537 :{SMALLFONT}{OPENQUOTES}This candy apple from {STRINGID} is really good value{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}This toffee apple from {STRINGID} is really good value{ENDQUOTES} STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} -STR_1539 :{SMALLFONT}{OPENQUOTES}This donut from {STRINGID} is really good value{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}This doughnut from {STRINGID} is really good value{ENDQUOTES} STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} STR_1541 : STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} @@ -1559,9 +1559,9 @@ STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride phot STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} -STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fries from {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} -STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for cotton candy from {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} STR_1562 : STR_1563 : STR_1564 : @@ -1571,9 +1571,9 @@ STR_1567 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for popcorn from {S STR_1568 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hot dog from {STRINGID}{ENDQUOTES} STR_1569 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for tentacle from {STRINGID}{ENDQUOTES} STR_1570 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hat from {STRINGID}{ENDQUOTES} -STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a candy apple from {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a toffee apple from {STRINGID}{ENDQUOTES} STR_1572 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a T-shirt from {STRINGID}{ENDQUOTES} -STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a donut from {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a doughnut from {STRINGID}{ENDQUOTES} STR_1574 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for coffee from {STRINGID}{ENDQUOTES} STR_1575 : STR_1576 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried chicken from {STRINGID}{ENDQUOTES} @@ -1695,7 +1695,7 @@ STR_1691 :{WINDOW_COLOUR_2} Cost: {BLACK}{CURRENCY} STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY} STR_1693 :{SMALLFONT}{BLACK}遊客 STR_1694 :{SMALLFONT}{BLACK}員工 -STR_1695 :{SMALLFONT}{BLACK}Income and costs +STR_1695 :{SMALLFONT}{BLACK}收入和支出 STR_1696 :{SMALLFONT}{BLACK}Customer information STR_1697 :Cannot place these on queue line area STR_1698 :Can only place these on queue area @@ -1753,7 +1753,7 @@ STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DUR STR_1750 :{DURATION} STR_1751 :Can't change time limit for ride... STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park -STR_1753 :{SMALLFONT}{BLACK}Show summarized list of guests in park +STR_1753 :{SMALLFONT}{BLACK}Show summarised list of guests in park STR_1754 :{BLACK}{COMMA16} guests STR_1755 :{BLACK}{COMMA16} guest STR_1756 :{WINDOW_COLOUR_2}Admission price: @@ -1790,8 +1790,8 @@ STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume -STR_1790 :{SMALLFONT}{BLACK}Select uniform color for this type of staff -STR_1791 :{WINDOW_COLOUR_2}Uniform color: +STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff +STR_1791 :{WINDOW_COLOUR_2}Uniform colour: STR_1792 :Responding to {STRINGID} breakdown call STR_1793 :Heading to {STRINGID} for an inspection STR_1794 :Fixing {STRINGID} @@ -1819,7 +1819,7 @@ STR_1815 :Thoughts STR_1816 :{SMALLFONT}{BLACK}Select information type to show in guest list STR_1817 :({COMMA16}) STR_1818 :{WINDOW_COLOUR_2}All guests -STR_1819 :{WINDOW_COLOUR_2}All guests (summarized) +STR_1819 :{WINDOW_COLOUR_2}All guests (summarised) STR_1820 :{WINDOW_COLOUR_2}Guests {STRINGID} STR_1821 :{WINDOW_COLOUR_2}Guests thinking {STRINGID} STR_1822 :{WINDOW_COLOUR_2}Guests thinking about {POP16}{STRINGID} @@ -1834,7 +1834,7 @@ STR_1830 :Queue length STR_1831 :Queue time STR_1832 :Reliability STR_1833 :Down-time -STR_1834 :Guests favorite +STR_1834 :Guests favourite STR_1835 :Popularity: Unknown STR_1836 :Popularity: {COMMA16}% STR_1837 :Satisfaction: Unknown @@ -1842,8 +1842,8 @@ STR_1838 :Satisfaction: {COMMA16}% STR_1839 :Reliability: {COMMA16}% STR_1840 :Down-time: {COMMA16}% STR_1841 :Profit: {CURRENCY2DP} per hour -STR_1842 :Favorite of: {COMMA16} guest -STR_1843 :Favorite of: {COMMA16} guests +STR_1842 :Favourite of: {COMMA16} guest +STR_1843 :Favourite of: {COMMA16} guests STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list STR_1845 :{MONTHYEAR} STR_1846 :{COMMA16} guests @@ -1885,7 +1885,7 @@ STR_1881 :每30分鐘 STR_1882 :每45分鐘 STR_1883 :每小時 STR_1884 :每2小時 -STR_1885 :Never +STR_1885 :從不 STR_1886 :Inspecting {STRINGID} STR_1887 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}{COMMA16} minutes STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hours @@ -1923,7 +1923,7 @@ STR_1919 :Not enough cash available! STR_1920 :Can't pay back loan! STR_1921 :{SMALLFONT}{BLACK}Start a new game STR_1922 :{SMALLFONT}{BLACK}Continue playing a saved game -STR_1923 :{SMALLFONT}{BLACK}Show tutorial +STR_1923 :{SMALLFONT}{BLACK}開始教學 STR_1924 :{SMALLFONT}{BLACK}退出遊戲 STR_1925 :Can't place person here... STR_1926 :{SMALLFONT} @@ -1967,9 +1967,9 @@ STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: STR_1964 :{WINDOW_COLOUR_2}Umbrella price: STR_1965 :{WINDOW_COLOUR_2}Drink price: STR_1966 :{WINDOW_COLOUR_2}Burger price: -STR_1967 :{WINDOW_COLOUR_2}Fries price: +STR_1967 :{WINDOW_COLOUR_2}Chips price: STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: -STR_1969 :{WINDOW_COLOUR_2}Cotton Candy price: +STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: STR_1970 :{WINDOW_COLOUR_2} STR_1971 :{WINDOW_COLOUR_2} STR_1972 :{WINDOW_COLOUR_2} @@ -1979,9 +1979,9 @@ STR_1975 :{WINDOW_COLOUR_2}Popcorn price: STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: STR_1977 :{WINDOW_COLOUR_2}Tentacle price: STR_1978 :{WINDOW_COLOUR_2}Hat price: -STR_1979 :{WINDOW_COLOUR_2}Candy Apple price: +STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: -STR_1981 :{WINDOW_COLOUR_2}Donut price: +STR_1981 :{WINDOW_COLOUR_2}Doughnut price: STR_1982 :{WINDOW_COLOUR_2}Coffee price: STR_1983 :{WINDOW_COLOUR_2} STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: @@ -1995,9 +1995,9 @@ STR_1991 :On-Ride Photo STR_1992 :Umbrella STR_1993 :Drink STR_1994 :Burger -STR_1995 :Fries +STR_1995 :Chips STR_1996 :Ice Cream -STR_1997 :Cotton Candy +STR_1997 :Candyfloss STR_1998 :Empty Can STR_1999 :Rubbish STR_2000 :Empty Burger Box @@ -2007,9 +2007,9 @@ STR_2003 :Popcorn STR_2004 :Hot Dog STR_2005 :Tentacle STR_2006 :Hat -STR_2007 :Candy Apple +STR_2007 :Toffee Apple STR_2008 :T-Shirt -STR_2009 :Donut +STR_2009 :Doughnut STR_2010 :Coffee STR_2011 :Empty Cup STR_2012 :Fried Chicken @@ -2023,9 +2023,9 @@ STR_2019 :On-Ride Photos STR_2020 :Umbrellas STR_2021 :Drinks STR_2022 :Burgers -STR_2023 :Fries +STR_2023 :Chips STR_2024 :Ice Creams -STR_2025 :Cotton Candy +STR_2025 :Candyfloss STR_2026 :Empty Cans STR_2027 :Rubbish STR_2028 :Empty Burger Boxes @@ -2035,9 +2035,9 @@ STR_2031 :Popcorn STR_2032 :Hot Dogs STR_2033 :Tentacles STR_2034 :Hats -STR_2035 :Candy Apples +STR_2035 :Toffee Apples STR_2036 :T-Shirts -STR_2037 :Donuts +STR_2037 :Doughnuts STR_2038 :Coffees STR_2039 :Empty Cups STR_2040 :Fried Chicken @@ -2051,9 +2051,9 @@ STR_2047 :an On-Ride Photo STR_2048 :an Umbrella STR_2049 :a Drink STR_2050 :a Burger -STR_2051 :some Fries +STR_2051 :some Chips STR_2052 :an Ice Cream -STR_2053 :some Cotton Candy +STR_2053 :some Candyfloss STR_2054 :an Empty Can STR_2055 :some Rubbish STR_2056 :an Empty Burger Box @@ -2063,9 +2063,9 @@ STR_2059 :some Popcorn STR_2060 :a Hot Dog STR_2061 :a Tentacle STR_2062 :a Hat -STR_2063 :a Candy Apple +STR_2063 :a Toffee Apple STR_2064 :a T-Shirt -STR_2065 :a Donut +STR_2065 :a Doughnut STR_2066 :a Coffee STR_2067 :an Empty Cup STR_2068 :some Fried Chicken @@ -2079,9 +2079,9 @@ STR_2075 :On-Ride Photo of {STRINGID} STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Umbrella STR_2077 :Drink STR_2078 :Burger -STR_2079 :Fries +STR_2079 :Chips STR_2080 :Ice Cream -STR_2081 :Cotton Candy +STR_2081 :Candyfloss STR_2082 :Empty Can STR_2083 :Rubbish STR_2084 :Empty Burger Box @@ -2091,9 +2091,9 @@ STR_2087 :Popcorn STR_2088 :Hot Dog STR_2089 :Tentacle STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hat -STR_2091 :Candy Apple +STR_2091 :Toffee Apple STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-Shirt -STR_2093 :Donut +STR_2093 :Doughnut STR_2094 :Coffee STR_2095 :Empty Cup STR_2096 :Fried Chicken @@ -2499,7 +2499,7 @@ STR_2495 :Cancel construction mode STR_2496 :Pause game STR_2497 :Zoom view out STR_2498 :Zoom view in -STR_2499 :Rotate view +STR_2499 :Rotate view clockwise STR_2500 :Rotate construction object STR_2501 :Underground view toggle STR_2502 :Remove base land toggle @@ -2523,9 +2523,9 @@ STR_2519 :Show park information STR_2520 :Show guest list STR_2521 :Show staff list STR_2522 :Show recent messages -STR_2523 :Show map -STR_2524 :Screenshot - +STR_2523 :顯示地圖 +STR_2524 :截圖 +### The following need to be reordered to match SDL_keycode layout. STR_2525 :??? STR_2526 :??? STR_2527 :??? @@ -2682,9 +2682,9 @@ STR_2677 :??? STR_2678 :??? STR_2679 :??? STR_2680 :All research complete -STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 -STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry -STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2682 : +STR_2683 : STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive STR_2685 :Simplex Noise Parameters STR_2686 :{WINDOW_COLOUR_2}Low: @@ -2701,14 +2701,14 @@ STR_2696 :Place trees STR_2697 :??? STR_2698 :??? STR_2699 :??? -STR_2700 :Autosave frequency: -STR_2701 :Every week -STR_2702 :Every 2 weeks -STR_2703 :Every month -STR_2704 :Every 4 months -STR_2705 :Every year -STR_2706 :Never -STR_2707 :Open new window +STR_2700 :自動儲存的頻率: +STR_2701 :每週 +STR_2702 :每兩週 +STR_2703 :每月 +STR_2704 :每四個月 +STR_2705 :每年 +STR_2706 :從不 +STR_2707 :開啟新視窗 STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? STR_2709 :Overwrite STR_2710 :Type the name of the file. @@ -2741,8 +2741,8 @@ STR_2736 :{MONTH}, Year {COMMA16} STR_2737 :{STRINGID} {MONTH}, Year {COMMA16} STR_2738 :Title screen music: STR_2739 :None -STR_2740 :RollerCoaster Tycoon 1 -STR_2741 :RollerCoaster Tycoon 2 +STR_2740 :夢幻遊樂園 (RCT1) +STR_2741 :模擬樂園 (RCT2) STR_2742 :css50.dat not found STR_2743 :Copy data\css17.dat from your RCT1 installation to data\css50.dat in your RCT2 installation. STR_2744 :[ @@ -2751,7 +2751,6 @@ STR_2746 :] STR_2747 :{ENDQUOTES} STR_2748 :Bar STR_2749 :My new scenario - # New strings used in the cheats window previously these were ??? STR_2750 :Move all items to top STR_2751 :Move all items to bottom @@ -2763,11 +2762,11 @@ STR_2756 :Remove litter STR_2757 :Force Sun STR_2758 :Force Thunder STR_2759 :Zero Clearance -STR_2760 :+5K Money -STR_2761 :Pay For Entrance -STR_2762 :Pay For Rides +STR_2760 :+{CURRENCY} +STR_2761 : +STR_2762 : STR_2763 :??? -STR_2764 :Happy Guests +STR_2764 : STR_2765 :Large Tram STR_2766 :Win scenario STR_2767 :Freeze Climate @@ -2785,8 +2784,6 @@ STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} STR_2779 :Viewport #{COMMA16} STR_2780 :Extra viewport # End of new strings - - STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + @@ -2817,7 +2814,7 @@ STR_2807 :{RED}Guests are complaining about the amount of litter in your park STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks -STR_2811 :{RED}Guests are complaining because they can't find the restrooms in your park +STR_2811 :{RED}Guests are complaining because they can't find the toilets in your park STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests STR_2814 :{WINDOW_COLOUR_2}Most untidy park award @@ -2830,11 +2827,11 @@ STR_2820 :{WINDOW_COLOUR_2}Safest park award STR_2821 :{WINDOW_COLOUR_2}Best staff award STR_2822 :{WINDOW_COLOUR_2}Best park food award STR_2823 :{WINDOW_COLOUR_2}Worst park food award -STR_2824 :{WINDOW_COLOUR_2}Best park restrooms award +STR_2824 :{WINDOW_COLOUR_2}Best park toilets award STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award STR_2826 :{WINDOW_COLOUR_2}Best water rides award STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award -STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride color schemes award +STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride colour schemes award STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award STR_2830 :{WINDOW_COLOUR_2}Best gentle ride award STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'! @@ -2847,11 +2844,11 @@ STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park i STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! -STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best restroom facilities in the country'! +STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best toilet facilities in the country'! STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water rides in the country'! STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed rides'! -STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of color schemes'! +STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of colour schemes'! STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle rides'! STR_2848 :{WINDOW_COLOUR_2}No recent awards @@ -3018,39 +3015,39 @@ STR_3008 :{PEARLAQUA}ABC STR_3009 :{PALESILVER}ABC STR_3010 :無法載入檔案... STR_3011 :檔案中含有非法資料 -STR_3012 :Dodgems beat 風格 -STR_3013 :Fairground organ 風格 -STR_3014 :Roman fanfare 風格 -STR_3015 :Oriental 風格 -STR_3016 :Martian 風格 -STR_3017 :Jungle drums 風格 -STR_3018 :Egyptian 風格 -STR_3019 :Toyland 風格 +STR_3012 :Dodgems beat style +STR_3013 :Fairground organ style +STR_3014 :Roman fanfare style +STR_3015 :Oriental style +STR_3016 :Martian style +STR_3017 :Jungle drums style +STR_3018 :Egyptian style +STR_3019 :Toyland style STR_3020 : -STR_3021 :Space 風格 -STR_3022 :Horror 風格 -STR_3023 :Techno 風格 -STR_3024 :Gentle 風格 -STR_3025 :Summer 風格 -STR_3026 :Water 風格 -STR_3027 :Wild west 風格 -STR_3028 :Jurassic 風格 -STR_3029 :Rock 風格 -STR_3030 :Ragtime 風格 -STR_3031 :Fantasy 風格 -STR_3032 :Rock 風格 2 -STR_3033 :Ice 風格 -STR_3034 :Snow 風格 +STR_3021 :Space style +STR_3022 :Horror style +STR_3023 :Techno style +STR_3024 :Gentle style +STR_3025 :Summer style +STR_3026 :Water style +STR_3027 :Wild west style +STR_3028 :Jurassic style +STR_3029 :Rock style +STR_3030 :Ragtime style +STR_3031 :Fantasy style +STR_3032 :Rock style 2 +STR_3033 :Ice style +STR_3034 :Snow style STR_3035 :Custom music 1 STR_3036 :Custom music 2 -STR_3037 :Medieval 風格 -STR_3038 :Urban 風格 -STR_3039 :Organ 風格 -STR_3040 :Mechanical 風格 -STR_3041 :Modern 風格 -STR_3042 :Pirates 風格 -STR_3043 :Rock 風格 3 -STR_3044 :Candy 風格 +STR_3037 :Medieval style +STR_3038 :Urban style +STR_3039 :Organ style +STR_3040 :Mechanical style +STR_3041 :Modern style +STR_3042 :Pirates style +STR_3043 :Rock style 3 +STR_3044 :Candy style STR_3045 :{SMALLFONT}{BLACK}Select style of music to play STR_3046 :This ride cannot be modified STR_3047 :Local authority forbids demolition or modifications to this ride @@ -3070,11 +3067,11 @@ STR_3060 :Ice blocks STR_3061 :Wooden fences STR_3062 :{SMALLFONT}{BLACK}Standard roller coaster track STR_3063 :{SMALLFONT}{BLACK}Water channel (track submerged) -STR_3064 :Beginner Parks -STR_3065 :Challenging Parks -STR_3066 :Expert Parks -STR_3067 :{OPENQUOTES}Real{ENDQUOTES} Parks -STR_3068 :Other Parks +STR_3064 :新手級樂園 +STR_3065 :挑戰級樂園 +STR_3066 :專家級樂園 +STR_3067 :{OPENQUOTES}真實{ENDQUOTES}樂園 +STR_3068 :其他樂園 STR_3069 :Top Section STR_3070 :Slope to Level STR_3071 :{WINDOW_COLOUR_2}Same price throughout park @@ -3087,7 +3084,7 @@ STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! STR_3078 :Plain entrance STR_3079 :Wooden entrance STR_3080 :Canvas tent entrance -STR_3081 :Castle entrance (gray) +STR_3081 :Castle entrance (grey) STR_3082 :Castle entrance (brown) STR_3083 :Jungle entrance STR_3084 :Log cabin entrance @@ -3099,16 +3096,16 @@ STR_3089 :Space entrance STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station STR_3091 :You are not allowed to remove this section! STR_3092 :You are not allowed to move or modify the station for this ride! -STR_3093 :{WINDOW_COLOUR_2}Favorite: {BLACK}{STRINGID} +STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} STR_3094 :N/A STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed STR_3098 :Can't change lift hill speed... -STR_3099 :{SMALLFONT}{BLACK}Select color -STR_3100 :{SMALLFONT}{BLACK}Select second color -STR_3101 :{SMALLFONT}{BLACK}Select third color -STR_3102 :{SMALLFONT}{BLACK}Re-paint colored scenery on landscape +STR_3099 :{SMALLFONT}{BLACK}Select colour +STR_3100 :{SMALLFONT}{BLACK}Select second colour +STR_3101 :{SMALLFONT}{BLACK}Select third colour +STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape STR_3103 :Can't re-paint this... STR_3104 :{SMALLFONT}{BLACK}List rides STR_3105 :{SMALLFONT}{BLACK}List shops and stalls @@ -3128,8 +3125,8 @@ STR_3118 :{BLACK}{STRINGID} is heading for the ride STR_3119 :{BLACK}{STRINGID} is fixing the ride STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy -STR_3122 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guest -STR_3123 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guests +STR_3122 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guest +STR_3123 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guests STR_3124 :Broken {STRINGID} STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% @@ -3178,7 +3175,7 @@ STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} STR_3169 :Data for the following object not found: STR_3170 :Not enough space for graphics STR_3171 :Too many objects of this type selected -STR_3172 :The following object must be selected first: +STR_3172 :The following object must be selected first: {STRING} STR_3173 :This object is currently in use STR_3174 :This object is required by another object STR_3175 :This object is always required @@ -3378,8 +3375,8 @@ STR_3368 :{BLACK}= Drink Stall STR_3369 :{BLACK}= Souvenir Stall STR_3370 :{BLACK}= Info. Kiosk STR_3371 :{BLACK}= First Aid -STR_3372 :{BLACK}= A.T.M. -STR_3373 :{BLACK}= Restroom +STR_3372 :{BLACK}= Cash Machine +STR_3373 :{BLACK}= Toilet STR_3374 :Warning: Too many objects selected! STR_3375 :Not all objects in this scenery group could be selected STR_3376 :Install new track design... @@ -3397,21 +3394,21 @@ STR_3387 :Roller Coaster Building Tutorial STR_3388 :Unable to switch to selected mode STR_3389 :Unable to select additional item of scenery... STR_3390 :Too many items selected -STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... -STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... -STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... -STR_3394 :{SMALLFONT}{BLACK}You can also rotate the view in 90 degree steps... -STR_3395 :{SMALLFONT}{BLACK}Building anything at this scale is a bit difficult, so let's zoom the view back in again... -STR_3396 :{SMALLFONT}{BLACK}Let's build a simple ride to get the park started... -STR_3397 :{SMALLFONT}{BLACK}The white 'ghost' image shows where the ride will be built. We'll move the pointer to select the position then click to build it... -STR_3398 :{SMALLFONT}{BLACK}Rides need an entrance and an exit. We'll move the pointer to a square on the edge of the ride and then click to build first the entrance and then the exit... -STR_3399 :{SMALLFONT}{BLACK}We need to build footpaths to allow guests to reach our new ride... -STR_3400 :{SMALLFONT}{BLACK}For the path to the ride entrance we'll use a special 'queue line' path... -STR_3401 :{SMALLFONT}{BLACK}For the exit path, just an 'ordinary' path will do... -STR_3402 :{SMALLFONT}{BLACK}Right, lets open the ride! To open the ride we click the flag icon on the ride window and select 'open'... -STR_3403 :{SMALLFONT}{BLACK}But where are the guests? -STR_3404 :{SMALLFONT}{BLACK}Oh - The park is still closed! Right - Let's open it... -STR_3405 :{SMALLFONT}{BLACK}While we're waiting for our first guests, let's build some scenery... +STR_3391 :{SMALLFONT}{BLACK}這個就是我們的樂園 - 先瞧瞧周邊的環境吧... +STR_3392 :{SMALLFONT}{BLACK}最簡單的方法就是按住滑鼠右鍵, 然後拖曳來移動檢視範圍... +STR_3393 :{SMALLFONT}{BLACK}如果要觀看更多樂園的部份, 你可以按最上工具列中的縮小檢視圖標來縮小檢視... +STR_3394 :{SMALLFONT}{BLACK}你亦可以旋轉90度來檢視... +STR_3395 :{SMALLFONT}{BLACK}這樣的比例下建造東西實在太困難了, 所以我們先還原基本步... +STR_3396 :{SMALLFONT}{BLACK}讓我們一起建造一個簡單的遊樂設施來開放這個樂園吧... +STR_3397 :{SMALLFONT}{BLACK}白色的'鬼影'顯示著建造遊樂設施的地方. 我們移動滑鼠到一個位置, 然後按下左鍵即可建造該遊樂設施... +STR_3398 :{SMALLFONT}{BLACK}遊樂設施需要一個入口及出口. 我們移動滑鼠到一個鄰近遊樂設施的方格, 然後按下左鍵即可建造入口, 然後重覆步驟建造出口... +STR_3399 :{SMALLFONT}{BLACK}為了遊客能享用我們新落成的遊樂設施, 我們需要建造道路連接出入口... +STR_3400 :{SMALLFONT}{BLACK}入口的道路我們可以使用特別的'輪侯區'道路... +STR_3401 :{SMALLFONT}{BLACK}至於離開道路, 任何'普通'道路皆可... +STR_3402 :{SMALLFONT}{BLACK}大功告成, 我們可以開啟此遊樂設施了! 要開啟此遊樂設施, 我們需在遊樂設施視窗中按下旗幟圖標, 然後選擇'開啟'... +STR_3403 :{SMALLFONT}{BLACK}但遊客們在哪? +STR_3404 :{SMALLFONT}{BLACK}噢 - 樂園依然是關閉中! 好吧 - 我們去開放樂園... +STR_3405 :{SMALLFONT}{BLACK}當我們等待第一批進入樂園的遊客之時, 先建造一些景物吧... STR_3406 :{SMALLFONT}{BLACK}Here's our empty park. We're going to build a simple custom-designed ride... STR_3407 :{SMALLFONT}{BLACK}First we need to choose a starting position... STR_3408 :{SMALLFONT}{BLACK}The section of track we've just built is a 'station platform', to allow guests to get on and off the ride... @@ -3442,15 +3439,15 @@ STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow two trains to operate more safely on the circuit... STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... -STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customize the ride a bit... +STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape STR_3438 :Unable to remove all scenery from here... STR_3439 :Clear Scenery -STR_3440 :Page 1 -STR_3441 :Page 2 -STR_3442 :Page 3 -STR_3443 :Page 4 -STR_3444 :Page 5 +STR_3440 :頁1 +STR_3441 :頁2 +STR_3442 :頁3 +STR_3443 :頁4 +STR_3444 :頁5 STR_3445 :Set Patrol Area STR_3446 :Cancel Patrol Area @@ -3477,26 +3474,24 @@ STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} STR_5139 :{WHITE}{STRINGID} STR_5140 :Disable brakes failure STR_5141 :Disable all breakdowns -STR_5142 :Normal Speed -STR_5143 :Quick Speed -STR_5144 :Fast Speed -STR_5145 :Turbo Speed -STR_5146 :Hyper Speed +STR_5142 :正常速度 +STR_5143 :快速速度 +STR_5144 :加快速度 +STR_5145 :更快速度 +STR_5146 :超快速度 STR_5147 :Show cheats button on toolbar STR_5148 :{SMALLFONT}{BLACK}Change the game speed STR_5149 :{SMALLFONT}{BLACK}Open the cheats window STR_5150 :Enable debugging tools -#Thousands separator STR_5151 :, -#Decimals separator STR_5152 :. -STR_5153 :Color schemes... +STR_5153 :Edit Themes... 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 STR_5157 :Unlock all prices STR_5158 :Quit to menu -STR_5159 :Exit OpenRCT2 +STR_5159 :離開OpenRCT2 STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} STR_5161 :Date Format: STR_5162 :Day/Month/Year @@ -3597,7 +3592,7 @@ STR_5256 :Create a new theme to make changes to STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one STR_5258 :{SMALLFONT}{BLACK}Delete the current theme STR_5259 :{SMALLFONT}{BLACK}Rename the current theme -STR_5260 :Giant Screenshot +STR_5260 :巨型截圖 STR_5261 :Filter STR_5262 :Wacky Worlds STR_5263 :Time Twister @@ -3611,23 +3606,23 @@ STR_5270 :{SMALLFONT}{BLACK}Miscellaneous STR_5271 :{SMALLFONT}{BLACK}Twitch STR_5272 :{SMALLFONT}{BLACK}Small Scenery STR_5273 :{SMALLFONT}{BLACK}Large Scenery -STR_5274 :{SMALLFONT}{BLACK}Footpaths +STR_5274 :{SMALLFONT}{BLACK}Footpath STR_5275 :Search for Objects STR_5276 :Enter the name of an object to search for STR_5277 :Clear -STR_5278 :Sandbox mode -STR_5279 :Sandbox mode off +STR_5278 :沙盒模式 +STR_5279 :沙盒模式關閉 STR_5280 :{SMALLFONT}{BLACK}Allow editing land ownership settings through the Map window and other options that are normally restricted to the Scenario Editor STR_5281 :{SMALLFONT}{BLACK}Features STR_5282 :RCT1 Ride Open/Close Lights STR_5283 :RCT1 Park Open/Close Lights STR_5284 :RCT1 Scenario Selection Font -STR_5285 :EXPLODE!!! -STR_5286 :{SMALLFONT}{BLACK}Makes some guests explode +STR_5285 :人肉炸彈!!! +STR_5286 :{SMALLFONT}{BLACK}將某些遊客爆炸,嘻嘻! STR_5287 :Ride is already broken down STR_5288 :Ride is closed STR_5289 :No breakdowns available for this ride -STR_5290 :Fix ride +STR_5290 :修復遊樂設施 STR_5291 :Can't force breakdown STR_5292 :{SMALLFONT}{BLACK}Force a breakdown STR_5293 :{SMALLFONT}{BLACK}Close ride/attraction @@ -3637,17 +3632,17 @@ STR_5296 :{SMALLFONT}{BLACK}Close park STR_5297 :{SMALLFONT}{BLACK}Open park STR_5298 :{RED}{STRINGID} STR_5299 :{LIGHTPINK}{STRINGID} -STR_5300 :{SMALLFONT}{BLACK}Quick fire staff -STR_5301 :{MEDIUMFONT}{BLACK}Clear your loan -STR_5302 :Clear loan -STR_5303 :Allow building in pause mode -STR_5304 :Title Sequence: -STR_5305 :RollerCoaster Tycoon 1 -STR_5306 :RollerCoaster Tycoon 1 (AA) -STR_5307 :RollerCoaster Tycoon 1 (AA + LL) -STR_5308 :RollerCoaster Tycoon 2 +STR_5300 :{SMALLFONT}{BLACK}一鍵解僱員工 +STR_5301 :{MEDIUMFONT}{BLACK}付清你的貸款 +STR_5302 :付清貸款 +STR_5303 :暫停時可以建造物件 +STR_5304 :主畫面動畫: +STR_5305 :夢幻遊樂場 (RCT1) +STR_5306 :夢幻遊樂場 (RCT1) (+資料片1 - AA) +STR_5307 :夢幻遊樂場 (RCT1) (+資料片1&2 - AA+LL) +STR_5308 :模擬樂園2 STR_5309 :OpenRCT2 -STR_5310 :Random +STR_5310 :隨機 STR_5311 :{SMALLFONT}{BLACK}Debug tools STR_5312 :Show console STR_5313 :Show tile inspector @@ -3681,14 +3676,14 @@ STR_5340 :Clearance height STR_5341 :Flags STR_5342 :Choose a map tile STR_5343 :Automatically place staff -STR_5344 :Changelog -STR_5345 :Financial cheats -STR_5346 :Guest cheats -STR_5347 :Park cheats -STR_5348 :Ride cheats -STR_5349 :{SMALLFONT}{BLACK}All Rides -STR_5350 :Max -STR_5351 :Min +STR_5344 :更新日誌 +STR_5345 :用於財政的密技 +STR_5346 :用於遊客的密技 +STR_5347 :用於樂園的密技 +STR_5348 :用於設施的密技 +STR_5349 :{SMALLFONT}{BLACK}所有遊樂設施 +STR_5350 :最高 +STR_5351 :最低 STR_5352 :{BLACK}快樂度: STR_5353 :{BLACK}體力: STR_5354 :{BLACK}飢餓度: @@ -3697,15 +3692,15 @@ STR_5356 :{BLACK}噁心度: STR_5357 :{BLACK}忍受噁心程度: STR_5358 :{BLACK}如廁度: STR_5359 :移除遊客 -STR_5360 :{SMALLFONT}{BLACK}移除樂園中所有遊客 -STR_5361 :{BLACK}Give all guests: -STR_5362 :{BLACK}Preferred intensity: -STR_5363 :> 1 -STR_5364 :< 15 -STR_5365 :{BLACK}Staff speed: -STR_5366 :Normal -STR_5367 :Fast -STR_5368 :Reset crash status +STR_5360 :{SMALLFONT}{BLACK}移除地圖上所有遊客 +STR_5361 :給予全部遊客: +STR_5362 :{BLACK}Set all guests' preferred ride intensity to: +STR_5363 :高於1 +STR_5364 :低於15 +STR_5365 :{BLACK}員工行走速度: +STR_5366 :正常 +STR_5367 :快速 +STR_5368 :重設毀壞狀態 STR_5369 :Park parameters... STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. STR_5371 :Object Selection @@ -3765,7 +3760,7 @@ STR_5424 :Wait{MOVE_X}{87}{COMMA16} STR_5425 :Restart STR_5426 :End STR_5427 :Coordinates: -STR_5428 :Counter-clockwise rotations: +STR_5428 :Anticlockwise rotations: STR_5429 :Zoom level: STR_5430 :Seconds to wait: STR_5431 :Save to load: @@ -3777,16 +3772,30 @@ STR_5436 :Edit Title Sequences... STR_5437 :No save selected STR_5438 :Can't make changes while command editor is open STR_5439 :A wait command with at least 4 seconds is required with a restart command -STR_5440 :Minimize fullscreen on focus loss +STR_5440 :Minimise fullscreen on focus loss STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. -STR_5442 :Force park rating: -STR_5443 :Speed{MOVE_X}{87}{STRINGID} -STR_5444 :Speed: -STR_5445 :Speed +STR_5442 :固定樂園評價: +STR_5443 :速度{MOVE_X}{87}{STRINGID} +STR_5444 :速度: +STR_5445 :速度 STR_5446 :Get STR_5447 :Type {STRINGID} STR_5448 :Ride / Vehicle {STRINGID} -STR_5449 :Reduce game speed -STR_5450 :Increase game speed -STR_5451 :Open cheats window +STR_5449 :減慢遊戲速度 +STR_5450 :增快遊戲速度 +STR_5451 :開啟密技視窗 STR_5452 :Toggle visibility of toolbars +STR_5453 :Select another ride +STR_5454 :去除FPS上限 +STR_5455 :啟用沙盒模式 +STR_5456 :去除阻礙檢查 +STR_5457 :去除支撐限制 +STR_5458 :順時計旋轉 +STR_5459 :逆時計旋轉 +STR_5460 :Rotate view anti-clockwise +STR_5461 :Set guests' parameters +STR_5462 :{CURRENCY} +STR_5463 :目標: 盡情玩吧! +STR_5464 :一般 +STR_5465 :氣候 +STR_5466 :員工 diff --git a/data/language/dutch.txt b/data/language/dutch.txt index bdbc71245d..c25e92adef 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3784,6 +3784,9 @@ STR_5451 :Cheatsvenster openen STR_5452 :Zichtbaarheid werkbalken schakelen STR_5453 :Andere attractie selecteren STR_5454 :FPS-limiet opheffen +STR_5455 :Zandboxmodus inschakelen +STR_5456 :Hoogtecontroles uitschakelen +STR_5457 :Ondersteuningslimieten uitschakelen STR_5458 :Met de klok mee draaien STR_5459 :Tegen de klok in draaien STR_5460 :Beeld tegen de klok in draaien diff --git a/data/language/english_us.txt b/data/language/english_us.txt index af5c18329e..92a6b32598 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -2683,7 +2683,7 @@ STR_2677 :??? STR_2678 :??? STR_2679 :??? STR_2680 :All research complete -STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive @@ -2764,7 +2764,7 @@ STR_2756 :Remove litter STR_2757 :Force Sun STR_2758 :Force Thunder STR_2759 :Zero Clearance -STR_2760 :+5K Money +STR_2760 :+{CURRENCY} STR_2761 :Pay For Entrance STR_2762 :Pay For Rides STR_2763 :??? @@ -3179,7 +3179,7 @@ STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} STR_3169 :Data for the following object not found: STR_3170 :Not enough space for graphics STR_3171 :Too many objects of this type selected -STR_3172 :The following object must be selected first: +STR_3172 :The following object must be selected first: {STRING} STR_3173 :This object is currently in use STR_3174 :This object is required by another object STR_3175 :This object is always required @@ -3700,9 +3700,9 @@ STR_5358 :{BLACK}Bathroom: STR_5359 :Remove guests STR_5360 :{SMALLFONT}{BLACK}Removes all guests from the map STR_5361 :{BLACK}Give all guests: -STR_5362 :{BLACK}Preferred intensity: -STR_5363 :> 1 -STR_5364 :< 15 +STR_5362 :{BLACK}Set all guests' preferred ride intensity to: +STR_5363 :More than 1 +STR_5364 :Less than 15 STR_5365 :{BLACK}Staff speed: STR_5366 :Normal STR_5367 :Fast @@ -3791,3 +3791,17 @@ STR_5449 :Reduce game speed STR_5450 :Increase game speed STR_5451 :Open cheats window STR_5452 :Toggle visibility of toolbars +STR_5453 :Select another ride +STR_5454 :Uncap FPS +STR_5455 :Enable sandbox mode +STR_5456 :Disable clearance checks +STR_5457 :Disable support limits +STR_5458 :Rotate clockwise +STR_5459 :Rotate counterclockwise +STR_5460 :Rotate view counterclockwise +STR_5461 :Set guests' parameters +STR_5462 :{CURRENCY} +STR_5463 :Goal: Have fun! +STR_5464 :General +STR_5465 :Climate +STR_5466 :Staff From 84783815958348e95eec983070e664f730f0c9d9 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Wed, 15 Jul 2015 11:36:47 +0200 Subject: [PATCH 0300/1173] RCT1: Import the correct chip shop --- src/rct1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rct1.c b/src/rct1.c index 2b1f33bcf5..2b3eb628a3 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -1019,7 +1019,7 @@ static const rct_object_entry RCT1DefaultObjectsRides[] = { { 0x00008000, { "SWSH1 " }, 0 }, { 0x00008000, { "SWSH2 " }, 0 }, { 0x00008000, { "ICECR1 " }, 0 }, - { 0x00008000, { "CHPSH2 " }, 0 }, + { 0x00008000, { "CHPSH " }, 0 }, { 0x00008000, { "DRNKS " }, 0 }, { 0x00008000, { "CNDYF " }, 0 }, { 0x00008000, { "BURGB " }, 0 }, From 2bdb32061bc11b5f4aecd7e96407704dfea3f908 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Wed, 15 Jul 2015 21:35:34 +0100 Subject: [PATCH 0301/1173] Fix path connection to ride entrances. Fixes #1616. Small fix to queue chaining as well. --- src/world/footpath.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/world/footpath.c b/src/world/footpath.c index d0de5d7f9c..4d58cfbed6 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -931,7 +931,7 @@ static void loc_6A6D7E( loc_6A6F1F: if (query) { - if (sub_6E59DC(x, y, mapElement->base_height, mapElement->clearance_height, direction & 2)) { + if (sub_6E59DC(x, y, mapElement->base_height, mapElement->clearance_height, direction ^ 2)) { return; } if (footpath_element_is_queue(mapElement)) { @@ -970,7 +970,7 @@ static void loc_6A6C85( return; if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_ENTRANCE) { - if (entrance_has_direction(mapElement, (direction - mapElement->type) & 3)) { + if (!entrance_has_direction(mapElement, (direction - mapElement->type) & 3)) { return; } } From 38b691b460d47e8b4c353c456f8112c8a84927dc Mon Sep 17 00:00:00 2001 From: zsilencer Date: Wed, 15 Jul 2015 15:44:05 -0600 Subject: [PATCH 0302/1173] fix #1624 --- src/audio/audio.c | 12 ------------ src/ride/ride.c | 2 +- src/windows/options.c | 11 +++++------ 3 files changed, 6 insertions(+), 19 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 9459019066..8dc38f7744 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -1770,18 +1770,6 @@ void audio_init2(int device) if (!(RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & 1 << 4)) { RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) |= 1 << 4; } - - // When all sound code is reversed this can be removed. - if (!gConfigSound.sound){ - toggle_all_sounds(); - } - - // When all sound code is reversed this can be removed. - if (!gConfigSound.ride_music){ - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8) ^= 1; - if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8) == 0) - stop_ride_music(); - } } /** diff --git a/src/ride/ride.c b/src/ride/ride.c index d6823183ee..01ea817317 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3373,7 +3373,7 @@ void ride_music_update_final() int ebx; if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2)) { if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0))) { - if (!gGameSoundsOff && gConfigSound.sound && RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8) && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 1)) { + if (!gGameSoundsOff && gConfigSound.sound && gConfigSound.ride_music && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 1)) { // set to stop music if volume <= 1 ? while (1) { int v8 = 0; diff --git a/src/windows/options.c b/src/windows/options.c index a13cd32401..3d0e982d70 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -488,11 +488,10 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) window_invalidate(w); break; case WIDX_MUSIC_CHECKBOX: - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8) ^= 1; - if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8) == 0) + gConfigSound.ride_music = !gConfigSound.ride_music; + if (!gConfigSound.ride_music) { stop_ride_music(); - - gConfigSound.ride_music ^= 1; + } config_save_default(); window_invalidate(w); break; @@ -1127,10 +1126,10 @@ static void window_options_invalidate(rct_window *w) } // music: on/off - RCT2_GLOBAL(0x013CE952 + 8, uint16) = STR_OFF + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8); + RCT2_GLOBAL(0x013CE952 + 8, uint16) = STR_OFF + gConfigSound.ride_music; widget_set_checkbox_value(w, WIDX_SOUND_CHECKBOX, gConfigSound.sound); - widget_set_checkbox_value(w, WIDX_MUSIC_CHECKBOX, RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8)); + widget_set_checkbox_value(w, WIDX_MUSIC_CHECKBOX, gConfigSound.ride_music); if(w->frame_no == 0){ // initialize only on first frame, otherwise the scrollbars wont be able to be modified widget = &window_options_audio_widgets[WIDX_MASTER_VOLUME]; From 7cddad5026dd3870a78f345f29b61c4a7700e00a Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 16 Jul 2015 01:38:18 +0100 Subject: [PATCH 0303/1173] implement game_command_create_ride --- src/game.c | 4 +- src/localisation/string_ids.h | 2 + src/rct2.h | 3 + src/ride/ride.c | 378 ++++++++++++++++++++++++++++++++++ src/ride/ride.h | 16 +- 5 files changed, 399 insertions(+), 4 deletions(-) diff --git a/src/game.c b/src/game.c index a54de0effc..489952cfdc 100644 --- a/src/game.c +++ b/src/game.c @@ -911,7 +911,7 @@ static uint32 game_do_command_table[58] = { 0, 0, 0, - 0x006B3F0F, + 0, 0, 0, 0, @@ -974,7 +974,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_place_track, game_command_remove_track, game_load_or_quit, - game_command_emptysub, + game_command_create_ride, game_command_demolish_ride, game_command_set_ride_status, game_command_set_ride_vehicles, diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 2e145c2c6e..b3041369f3 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -224,6 +224,8 @@ enum { STR_LOWER_COST_AMOUNT = 985, STR_COST_AMOUNT = 986, + STR_TOO_MANY_RIDES = 987, + STR_CONSTRUCTION = 990, STR_STATION_PLATFORM = 991, diff --git a/src/rct2.h b/src/rct2.h index 3663e1a15c..2edc71e9e1 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -90,12 +90,15 @@ typedef utf16* utf16string; #define OPENRCT2_COMMIT_SHA1_SHORT "" // Represent fixed point numbers. dp = decimal point +typedef uint8 fixed8_1dp; +typedef uint8 fixed8_2dp; typedef sint16 fixed16_1dp; typedef sint16 fixed16_2dp; typedef sint32 fixed32_1dp; typedef sint32 fixed32_2dp; // Money is stored as a multiple of 0.10. +typedef fixed8_1dp money8; typedef fixed16_1dp money16; typedef fixed32_1dp money32; diff --git a/src/ride/ride.c b/src/ride/ride.c index 01ea817317..273266c62c 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -143,6 +143,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 sub_6DE52C(rct_ride *ride); rct_ride_type *ride_get_entry(rct_ride *ride) { @@ -4707,6 +4708,383 @@ static void ride_stop_peeps_queuing(int rideIndex) } } +static int ride_get_empty_slot() +{ + rct_ride *ride; + for (int i = 0; i < MAX_RIDES; i++) { + ride = GET_RIDE(i); + if (ride->type == RIDE_TYPE_NULL) { + return i; + } + } + return -1; +} + +static int ride_get_default_mode(rct_ride *ride) +{ + const rct_ride_type *rideEntry = GET_RIDE_ENTRY(ride->subtype); + const uint8 *availableModes = RideAvailableModes; + + for (int i = 0; i < ride->type; i++) { + while (*(availableModes++) != 255) {} + } + if (rideEntry->flags & RIDE_ENTRY_FLAG_17) { + availableModes += 2; + } + return availableModes[0]; +} + +static bool ride_with_colour_config_exists(int rideType, const track_colour *colours) +{ + rct_ride *ride; + int i; + + FOR_ALL_RIDES(i, ride) { + if (ride->type != rideType) 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; + + return true; + } + return false; +} + +static bool ride_name_exists(char *name) +{ + char buffer[256]; + rct_ride *ride; + int i; + + FOR_ALL_RIDES(i, ride) { + format_string(buffer, ride->name, &ride->name_arguments); + if (strcmp(buffer, name) == 0) { + return true; + } + } + + return false; +} + +/** + * + * rct2: 0x006B4776 + */ +static void ride_set_to_random_colour_preset(rct_ride *ride) +{ + const track_colour_preset_list *colourPresets; + const track_colour *colours; + + 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; + colours = &colourPresets->list[listIndex]; + + if (!ride_with_colour_config_exists(ride->type, colours)) { + break; + } + } + + for (int i = 0; i < 4; i++) { + ride->track_colour_main[i] = colours->main; + ride->track_colour_additional[i] = colours->additional; + ride->track_colour_supports[i] = colours->supports; + } + ride->colour_scheme_type = 0; +} + +static money32 ride_get_common_price(rct_ride *forRide) +{ + rct_ride *ride; + int i; + + FOR_ALL_RIDES(i, ride) { + if (ride->type == forRide->type && ride != forRide) { + return ride->price; + } + } + + return MONEY32_UNDEFINED; +} + +static money32 shop_item_get_common_price(rct_ride *forRide, int shopItem) +{ + rct_ride_type *rideEntry; + rct_ride *ride; + int i; + + FOR_ALL_RIDES(i, ride) { + if (ride != forRide) { + rideEntry = GET_RIDE_ENTRY(ride->subtype); + if (rideEntry->shop_item == shopItem) { + return ride->price; + } + if (rideEntry->shop_item_secondary == shopItem) { + return ride->price_secondary; + } + } + } + + return MONEY32_UNDEFINED; +} + +static bool shop_item_has_common_price(int shopItem) +{ + if (shopItem < 32) { + return RCT2_GLOBAL(0x01358838, uint32) & (1 << shopItem); + } else { + return RCT2_GLOBAL(0x0135934C, uint32) & (1 << (shopItem - 32)); + } +} + +/** + * + * rct2: 0x006B3F0F + */ +money32 ride_create(int type, int subType, int flags, int *outRideIndex) +{ + char rideNameBuffer[256]; + rct_ride *ride; + rct_ride_type *rideEntry; + int rideIndex, rideEntryIndex; + + if (subType == 255) { + uint8 *availableRideEntries = get_ride_entry_indices_for_ride_type(type); + for (uint8 *rei = availableRideEntries; *rei != 255; rei++) { + rideEntry = GET_RIDE_ENTRY(*rei); + if (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) { + subType = *rei; + goto foundRideEntry; + } + } + subType = availableRideEntries[0]; + } + +foundRideEntry: + rideEntryIndex = subType; + rideIndex = ride_get_empty_slot(); + if (rideIndex == -1) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_MANY_RIDES; + return MONEY32_UNDEFINED; + } + *outRideIndex = rideIndex; + + if (!(flags & GAME_COMMAND_FLAG_APPLY)) { + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION; + RCT2_GLOBAL(0x009DEA5E, uint16) = 0x8000; + return 0; + } + + ride = GET_RIDE(rideIndex); + rideEntry = GET_RIDE_ENTRY(rideEntryIndex); + ride->type = type; + ride->subtype = rideEntryIndex; + ride_set_to_random_colour_preset(ride); + ride->overall_view = 0xFFFF; + + // Ride name + if (rideEntryIndex == 255) { + useDefaultName: + ride->name = STR_NONE; + + struct { + uint16 type_name; + uint16 number; + } name_args; + name_args.type_name = 2 + ride->type; + name_args.number = 0; + do { + name_args.number++; + format_string(rideNameBuffer, 1, &name_args); + } while (ride_name_exists(rideNameBuffer)); + ride->name = 1; + ride->name_arguments_type_name = name_args.type_name; + ride->name_arguments_number = name_args.number; + } else { + if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) { + goto useDefaultName; + } + ride->name = 1; + ride->name_arguments_type_name = rideEntry->name; + ride->name_arguments_number = 0; + + rct_string_id rideNameStringId = 0; + for (int i = 0; i < 100; i++) { + ride->name_arguments_number++; + format_string(rideNameBuffer, ride->name, &ride->name_arguments); + + rideNameStringId = user_string_allocate(4, rideNameBuffer); + if (rideNameStringId != 0) { + ride->name = rideNameStringId; + break; + } + } + if (rideNameStringId == 0) { + goto useDefaultName; + } + } + + for (int i = 0; i < 4; i++) { + ride->station_starts[i] = 0xFFFF; + ride->entrances[i] = 0xFFFF; + ride->exits[i] = 0xFFFF; + ride->var_066[i] = 255; + ride->queue_time[i] = 0; + } + + for (int i = 0; i < 32; i++) { + ride->vehicles[i] = 0xFFFF; + } + + ride->status = RIDE_STATUS_CLOSED; + ride->lifecycle_flags = 0; + ride->var_1CA = 0; + ride->num_stations = 0; + ride->num_vehicles = 1; + ride->var_0CA = 32; + ride->var_0CB = 32; + ride->num_cars_per_train = 1; + ride->var_0CB = 12; + ride->min_waiting_time = 10; + ride->max_waiting_time = 60; + ride->depart_flags = RIDE_DEPART_WAIT_FOR_MINIMUM_LENGTH | 3; + if (RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 4] & 2) { + ride->lifecycle_flags |= RIDE_LIFECYCLE_MUSIC; + } + ride->music = RCT2_ADDRESS(0x0097D4F4, uint8)[ride->type * 8]; + + ride->operation_option = ( + RCT2_GLOBAL(0x0097CF40 + 4 + (ride->type * 8), uint8) + + RCT2_GLOBAL(0x0097CF40 + 4 + (ride->type * 8), uint8) + + RCT2_GLOBAL(0x0097CF40 + 4 + (ride->type * 8), uint8) + + RCT2_GLOBAL(0x0097CF40 + 5 + (ride->type * 8), uint8) + ) / 4; + + ride->lift_hill_speed = RCT2_ADDRESS(0x0097D7C9, uint8)[ride->type * 4]; + + ride->measurement_index = 255; + ride->excitement = (ride_rating)-1; + ride->var_120 = 0; + ride->var_122 = 0; + ride->var_148 = 0; + + ride->price = 0; + ride->price_secondary = 0; + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { + ride->price = RCT2_GLOBAL(0x0097D4F0 + 0 + (ride->type * 8), uint8); + ride->price_secondary = RCT2_GLOBAL(0x0097D4F0 + 1 + (ride->type * 8), uint8); + + if (rideEntry->shop_item != 255) { + ride->price = RCT2_ADDRESS(0x00982358, money8)[rideEntry->shop_item]; + } + if (rideEntry->shop_item_secondary != 255) { + ride->price = RCT2_ADDRESS(0x00982358, money8)[rideEntry->shop_item_secondary]; + } + if (rideEntry->shop_item == 255 && (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY)) { + ride->price = 0; + } + if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) == OBJECTIVE_BUILD_THE_BEST) { + ride->price = 0; + } + + if (ride->type == RIDE_TYPE_TOILETS) { + if (RCT2_GLOBAL(0x01358838, uint32) & (1 << 31)) { + money32 price = ride_get_common_price(ride); + if (price != MONEY32_UNDEFINED) { + ride->price = (money16)price; + } + } + } + + if (rideEntry->shop_item != 255) { + if (shop_item_has_common_price(rideEntry->shop_item)) { + money32 price = shop_item_get_common_price(ride, rideEntry->shop_item); + if (price != MONEY32_UNDEFINED) { + ride->price = (money16)price; + } + } + } + + if (rideEntry->shop_item_secondary != 255) { + if (shop_item_has_common_price(rideEntry->shop_item_secondary)) { + money32 price = shop_item_get_common_price(ride, rideEntry->shop_item_secondary); + if (price != MONEY32_UNDEFINED) { + ride->price_secondary = (money16)price; + } + } + } + } + + // The next 10 variables are treated like an array of 10 items + ride->var_124 = 0; + ride->var_124 = 0; + ride->var_126 = 0; + ride->var_128 = 0; + ride->var_12A = 0; + ride->var_12C = 0; + ride->var_12E = 0; + ride->age = 0; + ride->running_cost = 0; + ride->var_134 = 0; + ride->var_136 = 0; + + ride->value = 0xFFFF; + ride->satisfaction = 255; + ride->satisfaction_time_out = 0; + ride->satisfaction_next = 0; + ride->popularity = 255; + ride->popularity_time_out = 0; + ride->popularity_next = 0; + ride->window_invalidate_flags = 0; + ride->total_customers = 0; + ride->total_profit = 0; + ride->num_riders = 0; + ride->var_15D = 0; + ride->maze_tiles = 0; + ride->build_date = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); + ride->music_tune_id = 255; + + ride->breakdown_reason = 255; + ride->upkeep_cost = (money16)-1; + ride->reliability = 0x64FF; + ride->unreliability_factor = 1; + ride->inspection_interval = RIDE_INSPECTION_EVERY_30_MINUTES; + ride->last_inspection = 0; + ride->downtime = 0; + ride->var_19C = 0; + ride->var_1A0 = 0; + ride->no_primary_items_sold = 0; + ride->no_secondary_items_sold = 0; + ride->last_crash_type = RIDE_CRASH_TYPE_NONE; + ride->income_per_hour = MONEY32_UNDEFINED; + ride->profit = MONEY32_UNDEFINED; + ride->connected_message_throttle = 0; + ride->entrance_style = RIDE_ENTRANCE_STYLE_PLAIN; + ride->num_block_brakes = 0; + ride->guests_favourite = 0; + + 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; + sub_6DE52C(ride); + window_invalidate_by_class(WC_RIDE_LIST); + + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION; + RCT2_GLOBAL(0x009DEA5E, uint16) = 0x8000; + return 0; +} + +/** + * + * rct2: 0x006B3F0F + */ +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); +} + /** * * rct2: 0x006B49D9 diff --git a/src/ride/ride.h b/src/ride/ride.h index e17f05d300..34e8f6514e 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -150,7 +150,13 @@ typedef struct { // 0 = closed, 1 = open, 2 = test uint8 status; // 0x049 rct_string_id name; // 0x04A - uint32 name_arguments; // 0x04C probably just for when a ride hasn't been named (e.g. Crooked House 1) + union { + uint32 name_arguments; // 0x04C + struct { + rct_string_id name_arguments_type_name; // 0x04C + uint16 name_arguments_number; // 0x04E + }; + }; uint16 overall_view; // 0x050 00XX = X, XX00 = Y (* 32 + 16) uint16 station_starts[4]; // 0x052 uint8 station_heights[4]; // 0x05A @@ -300,7 +306,7 @@ typedef struct { uint32 no_secondary_items_sold; // 0x1A8 uint8 var_1AC; uint8 var_1AD; - uint8 last_crash_type; + uint8 last_crash_type; // 0x1AE uint8 connected_message_throttle; // 0x1AF money32 income_per_hour; // 0x1B0 money32 profit; // 0x1B4 @@ -707,6 +713,11 @@ typedef struct { uint8 additional_2; } vehicle_colour; +typedef struct { + uint8 count; + track_colour list[256]; +} track_colour_preset_list; + enum { RIDE_MEASUREMENT_FLAG_RUNNING = 1 << 0, RIDE_MEASUREMENT_FLAG_UNLOADING = 1 << 1, @@ -890,6 +901,7 @@ void ride_set_name(int rideIndex, const char *name); void game_command_set_ride_name(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); int ride_get_refund_price(int ride_id); +void game_command_create_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); From 58247a2d6b0783a8e0dbc5365f8f39178dae9001 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 16 Jul 2015 10:21:10 +0200 Subject: [PATCH 0304/1173] Console UX improvements, fixes #1622 --- src/interface/console.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/interface/console.c b/src/interface/console.c index 4d9852e112..3c3aaf02af 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -88,6 +88,7 @@ void console_init() { _consoleInitialised = true; console_writeline(OPENRCT2_NAME " " OPENRCT2_VERSION); + console_writeline("Type 'help' for a list of available commands. Type 'hide' to hide the console."); console_writeline(""); console_write_prompt(); } @@ -1011,6 +1012,10 @@ void console_execute_silent(const char *src) if (argc == 0) return; + // Aliases for hiding the console + if(strcmp(argv[0],"quit") == 0 || strcmp(argv[0],"exit") == 0) + argv[0]="hide"; + bool validCommand = false; for (int i = 0; i < countof(console_command_table); i++) { if (strcmp(argv[0], console_command_table[i].command) == 0) { @@ -1037,4 +1042,4 @@ static bool invalidArguments(bool *invalid, bool arguments) return false; } return true; -} \ No newline at end of file +} From 97fa80d044d81ba492053d4092a61c81719875bd Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 16 Jul 2015 11:00:27 +0200 Subject: [PATCH 0305/1173] Use correct ride naming in select-by-track-type mode --- src/ride/ride.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 273266c62c..b57f86fb21 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -34,6 +34,7 @@ #include "../management/news_item.h" #include "../peep/peep.h" #include "../peep/staff.h" +#include "../rct1.h" #include "../scenario.h" #include "../util/util.h" #include "../windows/error.h" @@ -4854,7 +4855,7 @@ money32 ride_create(int type, int subType, int flags, int *outRideIndex) uint8 *availableRideEntries = get_ride_entry_indices_for_ride_type(type); for (uint8 *rei = availableRideEntries; *rei != 255; rei++) { rideEntry = GET_RIDE_ENTRY(*rei); - if (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) { + if ((rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) && !rideTypeShouldLoseSeparateFlag(rideEntry)) { subType = *rei; goto foundRideEntry; } @@ -4903,7 +4904,7 @@ foundRideEntry: ride->name_arguments_type_name = name_args.type_name; ride->name_arguments_number = name_args.number; } else { - if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) { + if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) || rideTypeShouldLoseSeparateFlag(rideEntry)) { goto useDefaultName; } ride->name = 1; From 354d604b26792b6ba9f65ce02f34e09f298ae025 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 16 Jul 2015 16:05:21 +0100 Subject: [PATCH 0306/1173] fix #1633 --- src/ride/ride.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index b57f86fb21..e0f46b18ed 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4983,7 +4983,7 @@ foundRideEntry: if (rideEntry->shop_item_secondary != 255) { ride->price = RCT2_ADDRESS(0x00982358, money8)[rideEntry->shop_item_secondary]; } - if (rideEntry->shop_item == 255 && (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY)) { + if (rideEntry->shop_item == 255 && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY)) { ride->price = 0; } if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) == OBJECTIVE_BUILD_THE_BEST) { From 48028fcfc4fc6ba3719ade041d63313da9ebb674 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 16 Jul 2015 16:42:46 +0100 Subject: [PATCH 0307/1173] fix #1631, fix #1632 --- data/language/english_uk.txt | 1 + src/interface/keyboard_shortcut.c | 21 +++++++++++++++++++++ src/interface/keyboard_shortcut.h | 1 + src/localisation/string_ids.h | 2 ++ src/windows/shortcut_key_change.c | 6 ++++-- src/windows/shortcut_keys.c | 25 ++++++------------------- 6 files changed, 35 insertions(+), 21 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 2fdada2e4f..363baf0fee 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3800,3 +3800,4 @@ STR_5463 :Goal: Have fun! STR_5464 :General STR_5465 :Climate STR_5466 :Staff +STR_5467 :ALT + diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index 3241fff1ad..948dde6dd9 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -22,6 +22,7 @@ #include "../config.h" #include "../game.h" #include "../input.h" +#include "../localisation/localisation.h" #include "keyboard_shortcut.h" #include "viewport.h" #include "window.h" @@ -75,6 +76,26 @@ void keyboard_shortcut_handle_command(int shortcutIndex) shortcut_table[shortcutIndex](); } +void keyboard_shortcut_format_string(char *buffer, uint16 shortcutKey) +{ + char *formatBuffer[256]; + + *buffer = 0; + if (shortcutKey & 0x100) { + format_string(formatBuffer, STR_SHIFT_PLUS, NULL); + strcat(buffer, formatBuffer); + } + if (shortcutKey & 0x200) { + format_string(formatBuffer, STR_CTRL_PLUS, NULL); + strcat(buffer, formatBuffer); + } + if (shortcutKey & 0x400) { + format_string(formatBuffer, STR_ALT_PLUS, NULL); + strcat(buffer, formatBuffer); + } + strcat(buffer, SDL_GetScancodeName(shortcutKey & 0xFF)); +} + #pragma region Shortcut Commands static void toggle_view_flag(int viewportFlag) diff --git a/src/interface/keyboard_shortcut.h b/src/interface/keyboard_shortcut.h index e735a85592..d9e4e20535 100644 --- a/src/interface/keyboard_shortcut.h +++ b/src/interface/keyboard_shortcut.h @@ -24,5 +24,6 @@ void keyboard_shortcut_set(int key); void keyboard_shortcut_handle(int key); void keyboard_shortcut_handle_command(int shortcutIndex); +void keyboard_shortcut_format_string(char *buffer, uint16 shortcutKey); #endif \ No newline at end of file diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index b3041369f3..8f6afbe503 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1795,6 +1795,8 @@ enum { STR_CHEAT_CLIMATE_GROUP = 5465, STR_CHEAT_STAFF_GROUP = 5466, + STR_ALT_PLUS = 5467, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/shortcut_key_change.c b/src/windows/shortcut_key_change.c index bb9209490e..912b1c8309 100644 --- a/src/windows/shortcut_key_change.c +++ b/src/windows/shortcut_key_change.c @@ -25,6 +25,8 @@ #include "../localisation/localisation.h" #include "../interface/themes.h" +extern const rct_string_id ShortcutStringIds[]; + #define WW 250 #define WH 60 @@ -119,6 +121,6 @@ static void window_shortcut_change_paint(rct_window *w, rct_drawpixelinfo *dpi) int x = w->x + 125; int y = w->y + 30; - RCT2_GLOBAL(0x13CE952, uint16) = 2493 + RCT2_GLOBAL(0x9DE511, uint8); - gfx_draw_string_centred_wrapped(dpi, (void*)0x13CE952, x, y, 242, 2785, RCT2_GLOBAL(0x9DEB8D, uint8)); + RCT2_GLOBAL(0x13CE952, uint16) = ShortcutStringIds[RCT2_GLOBAL(0x009DE511, uint8)]; + gfx_draw_string_centred_wrapped(dpi, (void*)0x013CE952, x, y, 242, 2785, RCT2_GLOBAL(0x9DEB8D, uint8)); } \ No newline at end of file diff --git a/src/windows/shortcut_keys.c b/src/windows/shortcut_keys.c index 6f17099807..bbd60b47fe 100644 --- a/src/windows/shortcut_keys.c +++ b/src/windows/shortcut_keys.c @@ -24,6 +24,7 @@ #include "../interface/widget.h" #include "../localisation/localisation.h" #include "../platform/platform.h" +#include "../interface/keyboard_shortcut.h" #include "../interface/themes.h" #define WW 340 @@ -247,27 +248,13 @@ static void window_shortcut_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, i gfx_fill_rect(dpi, 0, y, 800, y + 9, 0x2000031); } - RCT2_GLOBAL(0x13CE954, uint16) = ShortcutStringIds[i]; - RCT2_GLOBAL(0x13CE956, uint16) = 0; - RCT2_GLOBAL(0x13CE958, uint16) = 0; - - uint16 shortcut_entry = gShortcutKeys[i]; - if (shortcut_entry != 0xFFFF) { - rct_string_id templateStringId = 2525; - const char *scanCodeName = SDL_GetScancodeName(shortcut_entry & 0xFF); - char *templateString = (char*)language_get_string(templateStringId); - strcpy(templateString, scanCodeName); - - RCT2_GLOBAL(0x13CE958, uint16) = templateStringId; - - // Display the modifer - if (shortcut_entry & 0x100) - RCT2_GLOBAL(0x13CE956, uint16) = STR_SHIFT_PLUS; - else if (shortcut_entry & 0x200) - RCT2_GLOBAL(0x13CE956, uint16) = STR_CTRL_PLUS; - } + rct_string_id templateStringId = 2525; + char *templateString = (char*)language_get_string(templateStringId); + keyboard_shortcut_format_string(templateString, gShortcutKeys[i]); RCT2_GLOBAL(0x13CE952, uint16) = STR_SHORTCUT_ENTRY_FORMAT; + RCT2_GLOBAL(0x13CE954, uint16) = ShortcutStringIds[i]; + RCT2_GLOBAL(0x13CE956, uint16) = templateStringId; gfx_draw_string_left(dpi, format, (void*)0x13CE952, 0, 0, y - 1); } } \ No newline at end of file From e0f425ab618178b33108a90462409959672ab962 Mon Sep 17 00:00:00 2001 From: LRFLEW Date: Wed, 8 Jul 2015 00:58:48 -0500 Subject: [PATCH 0308/1173] Improved Queue Pathing --- src/world/footpath.c | 121 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 109 insertions(+), 12 deletions(-) diff --git a/src/world/footpath.c b/src/world/footpath.c index 4d58cfbed6..8bcbd4ea52 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -192,7 +192,7 @@ static money32 footpath_element_insert(int type, int x, int y, int z, int slope, mapElement->properties.path.addition_status = 255; mapElement->flags &= ~MAP_ELEMENT_FLAG_BROKEN; if (flags & (1 << 6)) - mapElement->flags |= 1 << 4; + mapElement->flags |= MAP_ELEMENT_FLAG_GHOST; RCT2_GLOBAL(0x00F3EFF4, uint32) = 0x00F3EFF8; @@ -825,8 +825,14 @@ static int rct_neighbour_compare(const void *a, const void *b) uint8 va = ((rct_neighbour*)a)->order; uint8 vb = ((rct_neighbour*)b)->order; if (va < vb) return 1; - else if (va == vb) return 0; - else return -1; + else if (va > vb) return -1; + else { + uint8 da = ((rct_neighbour*)a)->direction; + uint8 db = ((rct_neighbour*)b)->direction; + if (va < vb) return -1; + else if (va > vb) return 1; + else return 0; + } } static void neighbour_list_init(rct_neighbour_list *neighbourList) @@ -858,6 +864,87 @@ static void neighbour_list_sort(rct_neighbour_list *neighbourList) qsort(neighbourList->items, neighbourList->count, sizeof(rct_neighbour), rct_neighbour_compare); } +static rct_map_element *footpath_get_element(int x, int y, int z0, int z1, int direction) +{ + rct_map_element *mapElement; + int slope; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + + if (z1 == mapElement->base_height) { + if (footpath_element_is_sloped(mapElement)) { + slope = footpath_element_get_slope_direction(mapElement); + if (slope != direction) + break; + } + return mapElement; + } + if (z0 == mapElement->base_height) { + if (!footpath_element_is_sloped(mapElement)) + break; + + slope = footpath_element_get_slope_direction(mapElement) ^ 2; + if (slope != direction) + break; + + return mapElement; + } + } while (!map_element_is_last_for_tile(mapElement++)); + return NULL; +} + +static bool sub_footpath_disconnect_queue_from_path(int x, int y, rct_map_element *mapElement, int action, int direction) { + if (((mapElement->properties.path.edges & (1 << direction)) == 0) ^ (action < 0)) + return false; + if ((action < 0) && sub_6E59DC(x, y, mapElement->base_height, mapElement->clearance_height, direction)) + return false; + + int x1 = x + TileDirectionDelta[direction].x; + int y1 = y + TileDirectionDelta[direction].y; + int z = mapElement->base_height; + rct_map_element *otherMapElement = footpath_get_element(x1, y1, z - 2, z, direction); + if (otherMapElement != NULL && !footpath_element_is_queue(otherMapElement)) { + mapElement->properties.path.type &= 0xFC; + if (action > 0) { + mapElement->properties.path.edges &= ~(1 << direction); + otherMapElement->properties.path.edges &= ~(1 << ((direction + 2) & 3)); + if (action >= 2) mapElement->properties.path.type |= direction; + } + else if (action < 0) { + mapElement->properties.path.edges |= (1 << direction); + otherMapElement->properties.path.edges |= (1 << ((direction + 2) & 3)); + } + if (action != 0) map_invalidate_tile_full(x1, y1); + return true; + } + return false; +} + +static bool footpath_disconnect_queue_from_path(int x, int y, rct_map_element *mapElement, int action) { + if (!footpath_element_is_queue(mapElement)) return false; + + if (mapElement->properties.path.type & 4) return false; + + uint8 c = RCT2_ADDRESS(0x0098D7F0, uint8)[mapElement->properties.path.edges & 0x0F]; + if ((action < 0) ? (c >= 2) : (c < 2)) return false; + + if (action < 0) { + if (sub_footpath_disconnect_queue_from_path(x, y, mapElement, action, mapElement->properties.path.type & 3)) + return true; + } + + for (int direction = 0; direction < 4; direction++) { + if ((action < 0) && (direction == (mapElement->properties.path.type & 3))) continue; + if (sub_footpath_disconnect_queue_from_path(x, y, mapElement, action, direction)) + return true; + } + + return false; +} + /** * * rct2: 0x006A6D7E @@ -937,11 +1024,19 @@ static void loc_6A6D7E( if (footpath_element_is_queue(mapElement)) { if (RCT2_ADDRESS(0x0098D7F0, uint8)[mapElement->properties.path.edges & 0x0F] < 2) { neighbour_list_push(neighbourList, 3, direction); + } else { + if (map_element_get_type(initialMapElement) == MAP_ELEMENT_TYPE_PATH && + footpath_element_is_queue(initialMapElement)) { + if (footpath_disconnect_queue_from_path(x, y, mapElement, 0)) { + neighbour_list_push(neighbourList, 3, direction); + } + } } } else { neighbour_list_push(neighbourList, 2, direction); } } else { + footpath_disconnect_queue_from_path(x, y, mapElement, 1 + ((flags >> 6) & 1)); mapElement->properties.path.edges |= (1 << (direction ^ 2)); if (footpath_element_is_queue(mapElement)) { sub_6A76E9(mapElement->properties.path.ride_index); @@ -1023,10 +1118,9 @@ void footpath_connect_edges(int x, int y, rct_map_element *mapElement, int flags neighbour_list_sort(&neighbourList); - if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) { - if (footpath_element_is_queue(mapElement)) { - neighbourList.count = min(neighbourList.count, 2); - } + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH + && footpath_element_is_queue(mapElement)) { + neighbourList.count = min(neighbourList.count, 2); } while (neighbour_list_pop(&neighbourList, &neighbour)) { @@ -1377,7 +1471,7 @@ void sub_6A7642(int x, int y, rct_map_element *mapElement) * * rct2: 0x006A6B7F */ -static void footpath_remove_edges_towards_here(int x, int y, int z, int direction, rct_map_element *mapElement) +static void footpath_remove_edges_towards_here(int x, int y, int z, int direction, rct_map_element *mapElement, bool isQueue) { int d; @@ -1393,6 +1487,8 @@ static void footpath_remove_edges_towards_here(int x, int y, int z, int directio mapElement->properties.path.edges &= ~(1 << d); map_invalidate_tile(x, y, mapElement->base_height, mapElement->clearance_height); + if (isQueue) footpath_disconnect_queue_from_path(x, y, mapElement, -1); + direction = (direction + 1) & 3; x += TileDirectionDelta[direction].x; y += TileDirectionDelta[direction].y; @@ -1418,7 +1514,7 @@ static void footpath_remove_edges_towards_here(int x, int y, int z, int directio * * rct2: 0x006A6B14 */ -void footpath_remove_edges_towards(int x, int y, int z0, int z1, int direction) +static void footpath_remove_edges_towards(int x, int y, int z0, int z1, int direction, bool isQueue) { rct_map_element *mapElement; int slope; @@ -1434,7 +1530,7 @@ void footpath_remove_edges_towards(int x, int y, int z0, int z1, int direction) if (slope != direction) break; } - footpath_remove_edges_towards_here(x, y, z1, direction, mapElement); + footpath_remove_edges_towards_here(x, y, z1, direction, mapElement, isQueue); break; } if (z0 == mapElement->base_height) { @@ -1445,7 +1541,7 @@ void footpath_remove_edges_towards(int x, int y, int z0, int z1, int direction) if (slope != direction) break; - footpath_remove_edges_towards_here(x, y, z1, direction, mapElement); + footpath_remove_edges_towards_here(x, y, z1, direction, mapElement, isQueue); break; } } while (!map_element_is_last_for_tile(mapElement++)); @@ -1483,7 +1579,8 @@ void footpath_remove_edges_at(int x, int y, rct_map_element *mapElement) } } z0 = z1 - 2; - footpath_remove_edges_towards(x + TileDirectionDelta[direction].x, y + TileDirectionDelta[direction].y, z0, z1, direction); + footpath_remove_edges_towards(x + TileDirectionDelta[direction].x, y + TileDirectionDelta[direction].y, + z0, z1, direction, footpath_element_is_queue(mapElement)); } if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) From b3f30554290c9e683b93847169df2e048c6f4111 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 17 Jul 2015 02:43:22 +0100 Subject: [PATCH 0309/1173] fix mistake in ride_create --- src/ride/ride.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index e0f46b18ed..47b774496e 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4945,7 +4945,7 @@ foundRideEntry: ride->num_stations = 0; ride->num_vehicles = 1; ride->var_0CA = 32; - ride->var_0CB = 32; + ride->max_trains = 32; ride->num_cars_per_train = 1; ride->var_0CB = 12; ride->min_waiting_time = 10; From 57818c38357619d3e6b8f81cf5095dc90fd4235c Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Fri, 17 Jul 2015 10:21:18 +0200 Subject: [PATCH 0310/1173] Use standard spelling of 'tigre', closes #1637 --- data/language/english_uk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 363baf0fee..1a0fe5c80d 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -1781,7 +1781,7 @@ STR_1776 :On STR_1777 :{WINDOW_COLOUR_2}Music STR_1778 :{STRINGID} - - STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume -STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tigre costume +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume From 3e5e4431c0689e629025db75b3a3b12139efa934 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 17 Jul 2015 13:49:36 +0200 Subject: [PATCH 0311/1173] Rename sub_6B59C6() to invalidate_test_results() --- src/ride/ride.c | 14 +++++++------- src/ride/ride.h | 2 +- src/ride/track.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 47b774496e..21c9c0e9a2 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3625,7 +3625,7 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * switch (setting){ case 0: - sub_6B59C6(ride_id); + invalidate_test_results(ride_id); ride_clear_for_construction(ride_id); ride_remove_peeps(ride_id); @@ -3667,7 +3667,7 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * ride->min_waiting_time = min(new_value, ride->min_waiting_time); break; case 4: - sub_6B59C6(ride_id); + invalidate_test_results(ride_id); ride->time_limit = new_value; break; case 5: @@ -3688,13 +3688,13 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * case 8: if (new_value != ride->lift_hill_speed){ ride->lift_hill_speed = new_value; - sub_6B59C6(ride_id); + invalidate_test_results(ride_id); } break; case 9: if (new_value != ride->num_circuits){ ride->num_circuits = new_value; - sub_6B59C6(ride_id); + invalidate_test_results(ride_id); } break; } @@ -5858,7 +5858,7 @@ bool ride_are_all_possible_entrances_and_exits_built(rct_ride *ride) * * rct2: 0x006B59C6 */ -void sub_6B59C6(int rideIndex) +void invalidate_test_results(int rideIndex) { rct_ride *ride = GET_RIDE(rideIndex); @@ -6257,7 +6257,7 @@ void game_command_set_ride_vehicles(int *eax, int *ebx, int *ecx, int *edx, int return; } - sub_6B59C6(rideIndex); + invalidate_test_results(rideIndex); ride_clear_for_construction(rideIndex); ride_remove_peeps(rideIndex); ride->var_1CA = 100; @@ -6517,7 +6517,7 @@ money32 remove_ride_entrance_or_exit(sint16 x, sint16 y, uint8 rideIndex, uint8 if (flags & GAME_COMMAND_FLAG_APPLY){ ride_clear_for_construction(rideIndex); ride_remove_peeps(rideIndex); - sub_6B59C6(rideIndex); + invalidate_test_results(rideIndex); uint8 found = 0; rct_map_element* mapElement = map_get_first_element_at(x / 32, y / 32); diff --git a/src/ride/ride.h b/src/ride/ride.h index 34e8f6514e..171d5922d3 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -907,7 +907,7 @@ void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, in void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void ride_clear_for_construction(int rideIndex); void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int num_images); -void sub_6B59C6(int rideIndex); +void invalidate_test_results(int rideIndex); void ride_select_next_section(); void ride_select_previous_section(); diff --git a/src/ride/track.c b/src/ride/track.c index e74647c9eb..7b00435503 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3800,7 +3800,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in if (!(flags & GAME_COMMAND_FLAG_APPLY)) continue; - sub_6B59C6(rideIndex); + invalidate_test_results(rideIndex); switch (type){ case TRACK_ELEM_ON_RIDE_PHOTO: ride->lifecycle_flags |= RIDE_LIFECYCLE_ON_RIDE_PHOTO; @@ -4153,7 +4153,7 @@ money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, surfaceElement->type &= ~(1 << 6); } - sub_6B59C6(rideIndex); + invalidate_test_results(rideIndex); sub_6A7594(); footpath_remove_edges_at(x, y, mapElement); map_element_remove(mapElement); From e967e9465f66c6db9e75e63d034abcefa3ea0b81 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 17 Jul 2015 16:00:21 +0100 Subject: [PATCH 0312/1173] implement sub_68B2B7 --- src/interface/viewport.c | 432 ++++++++++++++++++-------------- src/interface/viewport.h | 1 + src/windows/ride_construction.c | 9 - 3 files changed, 247 insertions(+), 195 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index cea49c6928..a1d33730e9 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1520,194 +1520,253 @@ void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* m 0x1500, scrolling_text_setup(string_id, scroll, scrollingMode), 0, height + 22, 1, 1, 0); } -/*rct2: 0x0068B35F*/ +/** + * + * rct2: 0x0068B3FB + */ +static void sub_68B3FB(int x, int y) +{ + rct_drawpixelinfo *dpi = RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*); + + RCT2_GLOBAL(0x141F56A, uint16_t) = 0; + RCT2_GLOBAL(0x9E3138, uint8_t) = 0xFF; + RCT2_GLOBAL(0x9E30B6, uint8_t) = 0xFF; + RCT2_GLOBAL(0x9E323C, uint8_t) = 0xFF; + RCT2_GLOBAL(0x9DE56A, uint16_t) = x; + RCT2_GLOBAL(0x9DE56E, uint16_t) = y; + RCT2_GLOBAL(0x9DE574, uint16_t) = x; + RCT2_GLOBAL(0x9DE576, uint16_t) = y; + + rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); + + int dx = 0; + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) { + case 0: + dx = x + y; + break; + case 1: + x += 32; + dx = y - x; + break; + case 2: + x += 32; + y += 32; + dx = -(x + y); + break; + case 3: + y += 32; + dx = x - y; + break; + } + dx /= 2; + // Display little yellow arrow when building footpaths? + if ((RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & 4) && + RCT2_GLOBAL(0x9DE56A, uint16) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) && + RCT2_GLOBAL(0x9DE56E, uint16) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16)){ + uint8 arrowRotation = + (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + + (RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) & 3)) & 3; + + uint32 imageId = + arrowRotation + + (RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) & 0xFC) + + 0x20900C27; + + int arrowZ = RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16); + + RCT2_GLOBAL(0x9DE568, sint16) = x; + RCT2_GLOBAL(0x9DE56C, sint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_NONE; + RCT2_GLOBAL(0x9DEA52, uint16) = 0; + RCT2_GLOBAL(0x9DEA54, uint16) = 0; + RCT2_GLOBAL(0x9DEA56, uint16) = arrowZ + 18; + + sub_98197C(0, 0xFF, imageId, y & 0xFF00, arrowZ, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + } + int bx = dx + 52; + + if (bx <= dpi->y) + return; + + rct_map_element* element = map_element;//push map_element + + sint16 max_height = 0; + do{ + max_height = max(max_height, element->clearance_height); + } while (!map_element_is_last_for_tile(element++)); + + element--; + + if (map_element_get_type(element) == MAP_ELEMENT_TYPE_SURFACE && + (element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) != 0){ + max_height = (element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) << 1; + } + + max_height *= 8; + + dx -= max_height + 32; + + element = map_element;//pop map_element + dx -= dpi->height; + if (dx >= dpi->y) + return; + + RCT2_GLOBAL(0x9DE568, sint16) = x; + RCT2_GLOBAL(0x9DE56C, sint16) = y; + RCT2_GLOBAL(0x9DE57C, uint16) = 0; + do { + int direction = (map_element->type + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) & MAP_ELEMENT_DIRECTION_MASK; + int height = map_element->base_height * 8; + + uint32_t dword_9DE574 = RCT2_GLOBAL(0x9DE574, uint32_t); + RCT2_GLOBAL(0x9DE578, rct_map_element*) = map_element; + //setup the painting of for example: the underground, signs, rides, scenery, etc. + switch (map_element_get_type(map_element)) + { + case MAP_ELEMENT_TYPE_SURFACE: + RCT2_CALLPROC_X(0x66062C, 0, 0, direction, height, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_PATH: + RCT2_CALLPROC_X(0x6A3590, 0, 0, direction, height, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_TRACK: + RCT2_CALLPROC_X(0x6C4794, 0, 0, direction, height, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_SCENERY: + RCT2_CALLPROC_X(0x6DFF47, 0, 0, direction, height, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_ENTRANCE: + viewport_entrance_paint_setup(direction, height, map_element); + break; + case MAP_ELEMENT_TYPE_FENCE: + RCT2_CALLPROC_X(0x6E44B0, 0, 0, direction, height, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: + RCT2_CALLPROC_X(0x6B7F0C, 0, 0, direction, height, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_BANNER: + viewport_banner_paint_setup(direction, height, map_element); + break; + default: + // This is a little hack for taking care of undefined map_elements + // 8cars MOM used a dirty version of this to skip drawing certain elements + if (map_element_is_last_for_tile(map_element)) + return; + map_element++; + break; + } + RCT2_GLOBAL(0x9DE574, uint32_t) = dword_9DE574; + } while (!map_element_is_last_for_tile(map_element++)); +} + +/** + * + * rct2: 0x0068B60E + */ +static void sub_68B60E(int x, int y) +{ + rct_drawpixelinfo *dpi = RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*); + + int dx; + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) { + case 0: + dx = x + y; + break; + case 1: + x += 32; + dx = y - x; + break; + case 2: + x += 32; + y += 32; + dx = -(x + y); + break; + case 3: + y += 32; + dx = x - y; + break; + } + dx /= 2; + dx -= 16; + int bx = dx + 32; + if (bx <= dpi->y) return; + dx -= 20; + dx -= dpi->height; + if (dx >= dpi->y) return; + RCT2_GLOBAL(0x9DE568, sint16) = x; + RCT2_GLOBAL(0x9DE56C, sint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8_t) = VIEWPORT_INTERACTION_ITEM_NONE; + RCT2_CALLPROC_X( + (int)RCT2_ADDRESS(0x98196C, uint32_t*)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0xFF00, + 3123, + y & 0xFF00, + 16, + 32, + 32, + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t) + ); +} + +/** + * + * rct2: 0x0068B2B7 + */ +void sub_68B2B7(int x, int y) +{ + if ( + x < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) && + y < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) && + x >= 32 && + y >= 32 + ) { + RCT2_GLOBAL(0x0141E9B4, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9B8, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9BC, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9C0, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9C4, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9C8, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9CC, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9D0, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9D4, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9D8, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9DC, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9DB, uint8) |= 2; + + sub_68B3FB(x, y); + } else { + sub_68B60E(x, y); + } +} + +/** + * + * rct2: 0x0068B35F + */ void map_element_paint_setup(int x, int y) { - rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); - - if (x < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16_t) && - y < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16_t) && - x >= 32 && y >= 32){ - - RCT2_GLOBAL(0x141E9B4, uint32_t) = 0xFFFF; - RCT2_GLOBAL(0x141E9B8, uint32_t) = 0xFFFF; - RCT2_GLOBAL(0x141E9BC, uint32_t) = 0xFFFF; - RCT2_GLOBAL(0x141E9C0, uint32_t) = 0xFFFF; - RCT2_GLOBAL(0x141E9C4, uint32_t) = 0xFFFF; - RCT2_GLOBAL(0x141E9C8, uint32_t) = 0xFFFF; - RCT2_GLOBAL(0x141E9CC, uint32_t) = 0xFFFF; - RCT2_GLOBAL(0x141E9D0, uint32_t) = 0xFFFF; - RCT2_GLOBAL(0x141E9D4, uint32_t) = 0xFFFF; - RCT2_GLOBAL(0x141E9D8, uint32_t) = 0xFFFF; - RCT2_GLOBAL(0x141E9DC, uint32_t) = 0xFFFF; - //loc_68B3FB: Another function jumps to here. We need to split this! - RCT2_GLOBAL(0x141F56A, uint16_t) = 0; - RCT2_GLOBAL(0x9E3138, uint8_t) = 0xFF; - RCT2_GLOBAL(0x9E30B6, uint8_t) = 0xFF; - RCT2_GLOBAL(0x9E323C, uint8_t) = 0xFF; - RCT2_GLOBAL(0x9DE56A, uint16_t) = x; - RCT2_GLOBAL(0x9DE56E, uint16_t) = y; - RCT2_GLOBAL(0x9DE574, uint16_t) = x; - RCT2_GLOBAL(0x9DE576, uint16_t) = y; - - rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); - - int dx = 0; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) - { - case 0: - dx = x + y; - break; - case 1: - x += 32; - dx = y - x; - break; - case 2: - x += 32; - y += 32; - dx = -(x + y); - break; - case 3: - y += 32; - dx = x - y; - break; - } - dx /= 2; - // Display little yellow arrow when building footpaths? - if ((RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & 4) && - RCT2_GLOBAL(0x9DE56A, uint16) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) && - RCT2_GLOBAL(0x9DE56E, uint16) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16)){ - uint8 arrowRotation = - (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) - + (RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) & 3)) & 3; - - uint32 imageId = - arrowRotation + - (RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) & 0xFC) + - 0x20900C27; - - int arrowZ = RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16); - - RCT2_GLOBAL(0x9DE568, sint16) = x; - RCT2_GLOBAL(0x9DE56C, sint16) = y; - RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_NONE; - RCT2_GLOBAL(0x9DEA52, uint16) = 0; - RCT2_GLOBAL(0x9DEA54, uint16) = 0; - RCT2_GLOBAL(0x9DEA56, uint16) = arrowZ + 18; - - sub_98197C(0, 0xFF, imageId, y & 0xFF00, arrowZ, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); - } - int bx = dx + 52; - - if (bx <= dpi->y) - return; + rct_drawpixelinfo *dpi = RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*); + if ( + x < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) && + y < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) && + x >= 32 && + y >= 32 + ) { + RCT2_GLOBAL(0x0141E9B4, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9B8, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9BC, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9C0, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9C4, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9C8, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9CC, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9D0, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9D4, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9D8, uint32) = 0xFFFF; + RCT2_GLOBAL(0x0141E9DC, uint32) = 0xFFFF; - rct_map_element* element = map_element;//push map_element - - sint16 max_height = 0; - do{ - max_height = max(max_height, element->clearance_height); - } while (!map_element_is_last_for_tile(element++)); - - element--; - - if (map_element_get_type(element) == MAP_ELEMENT_TYPE_SURFACE && - (element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) != 0){ - max_height = (element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) << 1; - } - - max_height *= 8; - - dx -= max_height + 32; - - element = map_element;//pop map_element - dx -= dpi->height; - if (dx >= dpi->y) - return; - - RCT2_GLOBAL(0x9DE568, sint16) = x; - RCT2_GLOBAL(0x9DE56C, sint16) = y; - RCT2_GLOBAL(0x9DE57C, uint16) = 0; - do{ - int direction = (map_element->type + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) & MAP_ELEMENT_DIRECTION_MASK; - int height = map_element->base_height * 8; - - uint32_t dword_9DE574 = RCT2_GLOBAL(0x9DE574, uint32_t); - RCT2_GLOBAL(0x9DE578, rct_map_element*) = map_element; - //setup the painting of for example: the underground, signs, rides, scenery, etc. - switch (map_element_get_type(map_element)) - { - case MAP_ELEMENT_TYPE_SURFACE: - RCT2_CALLPROC_X(0x66062C, 0, 0, direction, height, (int)map_element, 0, 0); - break; - case MAP_ELEMENT_TYPE_PATH: - RCT2_CALLPROC_X(0x6A3590, 0, 0, direction, height, (int)map_element, 0, 0); - break; - case MAP_ELEMENT_TYPE_TRACK: - RCT2_CALLPROC_X(0x6C4794, 0, 0, direction, height, (int)map_element, 0, 0); - break; - case MAP_ELEMENT_TYPE_SCENERY: - RCT2_CALLPROC_X(0x6DFF47, 0, 0, direction, height, (int)map_element, 0, 0); - break; - case MAP_ELEMENT_TYPE_ENTRANCE: - viewport_entrance_paint_setup(direction, height, map_element); - //RCT2_CALLPROC_X(0x664FD4, 0, 0, direction, height, (int)map_element, 0, 0); - break; - case MAP_ELEMENT_TYPE_FENCE: - RCT2_CALLPROC_X(0x6E44B0, 0, 0, direction, height, (int)map_element, 0, 0); - break; - case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: - RCT2_CALLPROC_X(0x6B7F0C, 0, 0, direction, height, (int)map_element, 0, 0); - break; - case MAP_ELEMENT_TYPE_BANNER: - viewport_banner_paint_setup(direction, height, map_element); - break; - default: - // This is a little hack for taking care of undefined map_elements - // 8cars MOM used a dirty version of this to skip drawing certain elements - if (map_element_is_last_for_tile(map_element)) - return; - map_element++; - break; - } - RCT2_GLOBAL(0x9DE574, uint32_t) = dword_9DE574; - } while (!map_element_is_last_for_tile(map_element++)); - - } - else{ - - int dx; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) - { - case 0: - dx = x + y; - break; - case 1: - x += 32; - dx = y - x; - break; - case 2: - x += 32; - y += 32; - dx = -(x + y); - break; - case 3: - y += 32; - dx = x - y; - break; - } - dx /= 2; - dx -= 16; - int bx = dx + 32; - if (bx <= dpi->y) return; - dx -= 20; - dx -= dpi->height; - if (dx >= dpi->y) return; - RCT2_GLOBAL(0x9DE568, sint16) = x; - RCT2_GLOBAL(0x9DE56C, sint16) = y; - RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8_t) = VIEWPORT_INTERACTION_ITEM_NONE; - RCT2_CALLPROC_X((int)RCT2_ADDRESS(0x98196C, uint32_t*)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0xFF00, 3123, y & 0xFF00, 16, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_68B3FB(x, y); + } else { + sub_68B60E(x, y); } } @@ -1715,7 +1774,8 @@ void map_element_paint_setup(int x, int y) * * rct2: 0x0068B6C2 */ -void viewport_paint_setup(){ +void viewport_paint_setup() +{ rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); rct_xy16 mapTile = { diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 2d3abbd5a3..f270b0cb94 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -126,6 +126,7 @@ void sub_68A15E(int screenX, int screenY, short *x, short *y, int *direction, rc void viewport_interaction_remove_park_entrance(rct_map_element *mapElement, int x, int y); +void sub_68B2B7(int x, int y); void sub_0x68615B(int ebp); void sub_688485(); void sub_688217(); diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index d46e3de5ff..38e836a4a0 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -2084,15 +2084,6 @@ static void window_ride_construction_paint(rct_window *w, rct_drawpixelinfo *dpi } } -/** - * - * rct2: 0x0068B2B7 - */ -static void sub_68B2B7(int x, int y) -{ - RCT2_CALLPROC_X(0x0068B2B7, x, 0, y, 0, 0, 0, 0); -} - static void window_ride_construction_draw_track_piece( rct_window *w, rct_drawpixelinfo *dpi, int rideIndex, int trackType, int trackDirection, int unknown, From 74dc18b062bd49fef78480843f04850398db9799 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 17 Jul 2015 17:18:01 +0100 Subject: [PATCH 0313/1173] implement viewport_track_paint_setup --- src/interface/viewport.c | 76 ++++++++++++++++++++++++++++++-- src/ride/track_data.c | 94 ++++++++++++++++++++++++++++++++++++++++ src/ride/track_data.h | 3 ++ 3 files changed, 169 insertions(+), 4 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index a1d33730e9..7d5f902b3e 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -22,6 +22,7 @@ #include "../config.h" #include "../drawing/drawing.h" #include "../localisation/localisation.h" +#include "../ride/track_data.h" #include "../sprites.h" #include "../world/map.h" #include "../world/sprite.h" @@ -1407,6 +1408,73 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele } } +/** + * + * rct2: 0x006C4794 + */ +void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *mapElement) +{ + rct_drawpixelinfo *dpi = RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*); + rct_ride *ride; + int trackType, trackColourScheme, trackSequence; + + if (!(RCT2_GLOBAL(0x009DEA6F, uint8) & 1) || mapElement->properties.track.ride_index == RCT2_GLOBAL(0x00F64DE8, uint8)) { + ride = GET_RIDE(mapElement->properties.track.ride_index); + trackType = mapElement->properties.track.type; + trackSequence = mapElement->properties.track.sequence & 0x0F; + trackColourScheme = mapElement->properties.track.colour & 3; + + if ((RCT2_GLOBAL(0x0141E9E4, uint16) & 0x20) && dpi->zoom_level == 0) { + RCT2_GLOBAL(0x009DE570, uint8) = 0; + if (RCT2_ADDRESS(0x00999694, uint32)[trackType] & (1 << trackSequence)) { + uint16 ax = RCT2_GLOBAL(0x0097D21A + (ride->type * 8), uint8); + uint32 ebx = 0x20381689 + (height + 8) / 16; + ebx += RCT2_GLOBAL(0x009AACBD, uint16); + ebx -= RCT2_GLOBAL(0x01359208, uint16); + RCT2_GLOBAL(0x009DEA52, uint16) = 1000; + RCT2_GLOBAL(0x009DEA54, uint16) = 1000; + RCT2_GLOBAL(0x009DEA56, uint16) = 2047; + RCT2_CALLPROC_X( + RCT2_ADDRESS(0x0098197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)], + 16, + ebx, + 16, + height + ax + 3, + 1, + 1, + 0 + ); + } + } + + RCT2_GLOBAL(0x009DE570, uint8) = 3; + RCT2_GLOBAL(0x00F44198, uint32) = (ride->track_colour_main[trackColourScheme] << 19) | (ride->track_colour_additional[trackColourScheme] << 24) | 0xA0000000; + RCT2_GLOBAL(0x00F441A0, uint32) = 0x20000000; + RCT2_GLOBAL(0x00F441A4, uint32) = 0x20C00000; + RCT2_GLOBAL(0x00F4419C, uint32) = (ride->track_colour_supports[trackColourScheme] << 19) | 0x20000000; + if (mapElement->type & 0x40) { + RCT2_GLOBAL(0x00F44198, uint32) = 0x21600000; + RCT2_GLOBAL(0x00F4419C, uint32) = 0x21600000; + RCT2_GLOBAL(0x00F441A0, uint32) = 0x21600000; + RCT2_GLOBAL(0x00F441A4, uint32) = 0x21600000; + } + if (mapElement->flags & MAP_ELEMENT_FLAG_GHOST) { + uint32 meh = RCT2_ADDRESS(0x00993CC4, uint32)[RCT2_GLOBAL(0x009AACBF, uint8)]; + RCT2_GLOBAL(0x009DE570, uint8) = 0; + RCT2_GLOBAL(0x00F44198, uint32) = meh; + RCT2_GLOBAL(0x00F4419C, uint32) = meh; + RCT2_GLOBAL(0x00F441A0, uint32) = meh; + RCT2_GLOBAL(0x00F441A4, uint32) = meh; + } + + uint32 **trackTypeList = (uint32**)RideTypeTrackPaintFunctions[ride->type]; + uint32 *trackDirectionList = trackTypeList[trackType]; + + // Have to call from this point as it pushes esi and expects callee to pop it + RCT2_CALLPROC_X(0x006C4934, 0, (int)trackDirectionList, direction, height, (int)mapElement, 0, trackSequence); + } +} + /* rct2: 0x00664FD4 */ void viewport_entrance_paint_setup(uint8 direction, int height, rct_map_element* map_element){ RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8_t) = VIEWPORT_INTERACTION_ITEM_LABEL; @@ -1630,7 +1698,7 @@ static void sub_68B3FB(int x, int y) RCT2_CALLPROC_X(0x6A3590, 0, 0, direction, height, (int)map_element, 0, 0); break; case MAP_ELEMENT_TYPE_TRACK: - RCT2_CALLPROC_X(0x6C4794, 0, 0, direction, height, (int)map_element, 0, 0); + viewport_track_paint_setup(direction, height, map_element); break; case MAP_ELEMENT_TYPE_SCENERY: RCT2_CALLPROC_X(0x6DFF47, 0, 0, direction, height, (int)map_element, 0, 0); @@ -1663,7 +1731,7 @@ static void sub_68B3FB(int x, int y) * * rct2: 0x0068B60E */ -static void sub_68B60E(int x, int y) +static void viewport_blank_tiles_paint_setup(int x, int y) { rct_drawpixelinfo *dpi = RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*); @@ -1735,7 +1803,7 @@ void sub_68B2B7(int x, int y) sub_68B3FB(x, y); } else { - sub_68B60E(x, y); + viewport_blank_tiles_paint_setup(x, y); } } @@ -1766,7 +1834,7 @@ void map_element_paint_setup(int x, int y) sub_68B3FB(x, y); } else { - sub_68B60E(x, y); + viewport_blank_tiles_paint_setup(x, y); } } diff --git a/src/ride/track_data.c b/src/ride/track_data.c index c29975e447..cc81434b26 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -5468,3 +5468,97 @@ const track_curve_chain gFlatRideTrackCurveChain[256] = { { 0, 0 }, { 0, 57088 }, }; + +const uint32 RideTypeTrackPaintFunctions[91] = { + 0x008A42F4, // RIDE_TYPE_SPIRAL_ROLLER_COASTER + 0x008A6DB0, // RIDE_TYPE_STAND_UP_ROLLER_COASTER + 0x008A85E4, // RIDE_TYPE_SUSPENDED_SWINGING_COASTER + 0x008A8EE4, // RIDE_TYPE_INVERTED_ROLLER_COASTER + 0x008AAA0C, // RIDE_TYPE_JUNIOR_ROLLER_COASTER + 0x008ACE48, // RIDE_TYPE_MINIATURE_RAILWAY + 0x008ADF34, // RIDE_TYPE_MONORAIL + 0x008AFC24, // RIDE_TYPE_MINI_SUSPENDED_COASTER + 0x008B0D60, // RIDE_TYPE_BOAT_RIDE + 0x008A534C, // RIDE_TYPE_WOODEN_WILD_MOUSE + 0x008A5634, // RIDE_TYPE_STEEPLECHASE + 0x006F7000, // RIDE_TYPE_CAR_RIDE + 0x006FD0E8, // RIDE_TYPE_LAUNCHED_FREEFALL + 0x006FE240, // RIDE_TYPE_BOBSLEIGH_COASTER + 0x0070DC5C, // RIDE_TYPE_OBSERVATION_TOWER + 0x008A5B88, // RIDE_TYPE_LOOPING_ROLLER_COASTER + 0x0070EDB4, // RIDE_TYPE_DINGHY_SLIDE + 0x0071BC40, // RIDE_TYPE_MINE_TRAIN_COASTER + 0x00743EC8, // RIDE_TYPE_CHAIRLIFT + 0x008A7784, // RIDE_TYPE_CORKSCREW_ROLLER_COASTER + 0x008A81E8, // RIDE_TYPE_MAZE + 0x0074840C, // RIDE_TYPE_SPIRAL_SLIDE + 0x0074A668, // RIDE_TYPE_GO_KARTS + 0x0074DDEC, // RIDE_TYPE_LOG_FLUME + 0x0075745C, // RIDE_TYPE_RIVER_RAPIDS + 0x0075C9D0, // RIDE_TYPE_DODGEMS + 0x008A83E0, // RIDE_TYPE_PIRATE_SHIP + 0x00760070, // RIDE_TYPE_SWINGING_INVERTER_SHIP + 0x00761160, // RIDE_TYPE_FOOD_STALL + 0x00761160, // RIDE_TYPE_1D + 0x00761160, // RIDE_TYPE_DRINK_STALL + 0x00761160, // RIDE_TYPE_1F + 0x00761160, // RIDE_TYPE_SHOP + 0x0076190C, // RIDE_TYPE_MERRY_GO_ROUND + 0x00761160, // RIDE_TYPE_22 + 0x00761160, // RIDE_TYPE_INFORMATION_KIOSK + 0x00762D44, // RIDE_TYPE_TOILETS + 0x008A8CC8, // RIDE_TYPE_FERRIS_WHEEL + 0x00763520, // RIDE_TYPE_MOTION_SIMULATOR + 0x0076554C, // RIDE_TYPE_3D_CINEMA + 0x0076659C, // RIDE_TYPE_TOP_SPIN + 0x00767A40, // RIDE_TYPE_SPACE_RINGS + 0x00768BAC, // RIDE_TYPE_REVERSE_FREEFALL_COASTER + 0x0076C5BC, // RIDE_TYPE_LIFT + 0x008A9C08, // RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER + 0x00761160, // RIDE_TYPE_CASH_MACHINE + 0x0076D658, // RIDE_TYPE_TWIST + 0x0076E7B0, // RIDE_TYPE_HAUNTED_HOUSE + 0x00762D44, // RIDE_TYPE_FIRST_AID + 0x0076F8D4, // RIDE_TYPE_CIRCUS_SHOW + 0x00770924, // RIDE_TYPE_GHOST_TRAIN + 0x008AB2A0, // RIDE_TYPE_TWISTER_ROLLER_COASTER + 0x008AC164, // RIDE_TYPE_WOODEN_ROLLER_COASTER + 0x00778124, // RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER + 0x0078AE80, // RIDE_TYPE_WILD_MOUSE + 0x00792978, // RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER + 0x00792978, // RIDE_TYPE_38 + 0x007C6C00, // RIDE_TYPE_FLYING_ROLLER_COASTER + 0x007C6C00, // RIDE_TYPE_3A + 0x00811184, // RIDE_TYPE_VIRGINIA_REEL + 0x008164AC, // RIDE_TYPE_SPLASH_BOATS + 0x0081F268, // RIDE_TYPE_MINI_HELICOPTERS + 0x008245A8, // RIDE_TYPE_LAY_DOWN_ROLLER_COASTER + 0x0086347C, // RIDE_TYPE_SUSPENDED_MONORAIL + 0x008245A8, // RIDE_TYPE_40 + 0x0086E2F8, // RIDE_TYPE_REVERSER_ROLLER_COASTER + 0x00876618, // RIDE_TYPE_HEARTLINE_TWISTER_COASTER + 0x0087EDC4, // RIDE_TYPE_MINI_GOLF + 0x008AD280, // RIDE_TYPE_GIGA_COASTER + 0x00886074, // RIDE_TYPE_ROTO_DROP + 0x00887208, // RIDE_TYPE_FLYING_SAUCERS + 0x00889C28, // RIDE_TYPE_CROOKED_HOUSE + 0x0088AC88, // RIDE_TYPE_MONORAIL_CYCLES + 0x008AE36C, // RIDE_TYPE_COMPACT_INVERTED_COASTER + 0x008AEDE0, // RIDE_TYPE_WATER_COASTER + 0x008AF764, // RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER + 0x00890940, // RIDE_TYPE_INVERTED_HAIRPIN_COASTER + 0x00898384, // RIDE_TYPE_MAGIC_CARPET + 0x008995D4, // RIDE_TYPE_SUBMARINE_RIDE + 0x0089B0C0, // RIDE_TYPE_RIVER_RAFTS + 0x00761160, // RIDE_TYPE_50 + 0x008A13B4, // RIDE_TYPE_ENTERPRISE + 0x00761160, // RIDE_TYPE_52 + 0x00761160, // RIDE_TYPE_53 + 0x00761160, // RIDE_TYPE_54 + 0x00000000, // RIDE_TYPE_55 + 0x008B005C, // RIDE_TYPE_INVERTED_IMPULSE_COASTER + 0x008A46D8, // RIDE_TYPE_MINI_ROLLER_COASTER + 0x008B0610, // RIDE_TYPE_MINE_RIDE + 0x00000000, // RIDE_TYPE_59 + 0x008A5F6C, // RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER +}; diff --git a/src/ride/track_data.h b/src/ride/track_data.h index e477642fa2..1a6010df89 100644 --- a/src/ride/track_data.h +++ b/src/ride/track_data.h @@ -19,6 +19,7 @@ *****************************************************************************/ #include "../common.h" +#include "track.h" // 0x009968BB, 0x009968BC, 0x009968BD, 0x009968BF, 0x009968C1, 0x009968C3 extern const rct_track_coordinates TrackCoordinates[256]; @@ -38,3 +39,5 @@ typedef struct { extern const track_curve_chain gTrackCurveChain[256]; extern const track_curve_chain gFlatRideTrackCurveChain[256]; + +extern const uint32 RideTypeTrackPaintFunctions[91]; From 5f1878dca909173b59e27a8c84e4cc8da27b72e6 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 17 Jul 2015 17:54:01 +0100 Subject: [PATCH 0314/1173] fix keyboard_shortcut_format_string --- src/interface/keyboard_shortcut.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index 948dde6dd9..224b17dd55 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -78,7 +78,7 @@ void keyboard_shortcut_handle_command(int shortcutIndex) void keyboard_shortcut_format_string(char *buffer, uint16 shortcutKey) { - char *formatBuffer[256]; + char formatBuffer[256]; *buffer = 0; if (shortcutKey & 0x100) { From b692caf9fefaf403d9444daa2e73ec04441153bc Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 17 Jul 2015 20:09:13 +0100 Subject: [PATCH 0315/1173] add missing junior track pieces --- resources/g2/34.png | Bin 0 -> 518 bytes resources/g2/35.png | Bin 0 -> 255 bytes resources/g2/36.png | Bin 0 -> 272 bytes resources/g2/37.png | Bin 0 -> 605 bytes resources/g2/38.png | Bin 0 -> 264 bytes resources/g2/39.png | Bin 0 -> 254 bytes resources/g2/40.png | Bin 0 -> 542 bytes resources/g2/41.png | Bin 0 -> 250 bytes resources/g2/42.png | Bin 0 -> 238 bytes resources/g2/43.png | Bin 0 -> 577 bytes resources/g2/44.png | Bin 0 -> 261 bytes resources/g2/45.png | Bin 0 -> 265 bytes resources/g2/46.png | Bin 0 -> 595 bytes resources/g2/47.png | Bin 0 -> 326 bytes resources/g2/48.png | Bin 0 -> 280 bytes resources/g2/49.png | Bin 0 -> 721 bytes resources/g2/50.png | Bin 0 -> 270 bytes resources/g2/51.png | Bin 0 -> 275 bytes resources/g2/52.png | Bin 0 -> 614 bytes resources/g2/53.png | Bin 0 -> 265 bytes resources/g2/54.png | Bin 0 -> 238 bytes resources/g2/55.png | Bin 0 -> 691 bytes resources/g2/56.png | Bin 0 -> 299 bytes resources/g2/57.png | Bin 0 -> 306 bytes 24 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/g2/34.png create mode 100644 resources/g2/35.png create mode 100644 resources/g2/36.png create mode 100644 resources/g2/37.png create mode 100644 resources/g2/38.png create mode 100644 resources/g2/39.png create mode 100644 resources/g2/40.png create mode 100644 resources/g2/41.png create mode 100644 resources/g2/42.png create mode 100644 resources/g2/43.png create mode 100644 resources/g2/44.png create mode 100644 resources/g2/45.png create mode 100644 resources/g2/46.png create mode 100644 resources/g2/47.png create mode 100644 resources/g2/48.png create mode 100644 resources/g2/49.png create mode 100644 resources/g2/50.png create mode 100644 resources/g2/51.png create mode 100644 resources/g2/52.png create mode 100644 resources/g2/53.png create mode 100644 resources/g2/54.png create mode 100644 resources/g2/55.png create mode 100644 resources/g2/56.png create mode 100644 resources/g2/57.png diff --git a/resources/g2/34.png b/resources/g2/34.png new file mode 100644 index 0000000000000000000000000000000000000000..992c5bdad436f723ad5cf0d75d2c2a5f2227e671 GIT binary patch literal 518 zcmV+h0{Q)kP)j0000gP)t-s0001w z7f+)fU$-Z3dka5j05g|AGlMrTt3xx>PbMkGovK+_A*g?bE2$yzFz zzw`o(JwXprhQeCzQrj%}V-Fxbf4~3U^LK!(s2D?N#bO%7CwUMC(G9{$aTBKJZTt7o zru4%8wge|Qvu(3?%9aQNWVqslC*}r6%><>tpMuggqb5v01E+%07lQ_Ch&aJ3js}K` zX2cY}S~ljxDR*!p`b6ceu3gkb{p1QaPAsMAW@aN5`FWOaxQPlv!}4!{2EVwkGU4ug z!%Aw()kT#4=%%$2{-7M)w2(<6-pXijLChxH&?u}cqO#%xQ0p3mPm>C^#PxY*5x>Tz z?Lsn}AkN&eGIUW;6+@3*=2N9@x%9GmF1u!$w0RVLT5iWoGhh5;>4rXg@w>*`^2pke zr{&3EcWHBKjXB6rg+-*nnY1-@i+>VB4Fl1^ae<8FMJNgy*2h%`Ul&pZqasU7T07*qo IM6N<$f~mRXoB#j- literal 0 HcmV?d00001 diff --git a/resources/g2/35.png b/resources/g2/35.png new file mode 100644 index 0000000000000000000000000000000000000000..fffe5fa9f06d6031cf70c04922f96ff28a7d912f GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^DnKmC!3-oNf9zQVq>KZ6LR^7#v$=jXxBchx-TS@u z?HQyO%g6t}{{DHma=*C$cJ=(}_Qv0*pZ;I3zS`ONwsn6xgR!DgqykVIV@Z%-FoVOh z8)-mJm8XkiNCji>#f!TR8E`N^xL7Q9`ofFf_G_0`aT{*`yKo>?|rQoP0n0k`_8_QXHJT_zujY=Pg!QS+Dum0bJ(dJy7iiIwc0Q4 z!;jl%rFwn5bL4g5=htdqKVEvXN2Kumx05EKGtIxJvTQi4vg0Ap6%3xPelF{r5}E+c CyJ%ei literal 0 HcmV?d00001 diff --git a/resources/g2/36.png b/resources/g2/36.png new file mode 100644 index 0000000000000000000000000000000000000000..c83d1eba746364a7ca70563abe02aa35a220d8a7 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^sz5Bl!VDyTOnYeoq;vy(LR^7#zqo%jxBYZ`<8%h& z)y~Gx!B0{DK)Ap4~_TawdAZ zIEGX(rk*$CaxxTPx$r~q$hm_?`!{UZ%(ZFnH8Zb>)_N|-JYUV61GkdA}fYYWs zbFS}C38T&H%nP3-=H>2;m6m>S@6sp* z&0is9ix(k{Ic@9}d~#Qlk5sI%uRD8}QRCUCNT+DKJ;Dvoe=S>^wd&W)zo+cEW=Naf TGUh)8bR2`HtDnm{r-UW|X#8t; literal 0 HcmV?d00001 diff --git a/resources/g2/37.png b/resources/g2/37.png new file mode 100644 index 0000000000000000000000000000000000000000..f4579749ea9b0fa7c53ddd3c0f47ee19085380da GIT binary patch literal 605 zcmV-j0;2tiP)RwcezX>gG^(?1<+ewz^;e^hI z3)kdhYRhGQhcX=>oJL8WW!BpmH}B=>mmYtp=WN5abr4T%$tb00000NkvXXu0mjf{|6^G literal 0 HcmV?d00001 diff --git a/resources/g2/38.png b/resources/g2/38.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1dd09956fd38142265bfa277e441e6450ae989 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eZ!3-q5rDLmrludw7h%1n;=CSrto@(X5gcy=QV$f@#laSW+oES>Oh-C+feRzYp{EqlwO@BfcwkD9!;@VWR$?i%$= z?n0N>7u+j~YE)9%vm}5cVXCbAj&q{9yTn&q)jq(mds~^v{Xd`e92q&kPx~+L-#gLe zcqd=Sn$^d3j%(-n)V|q$3^!3-pq+%$6mQf2`@A+A8Wn%jQ6dj9+9)wiwt z`^Eh~m+!vpul>JX{eQgtesBH7^6}{m#{Xv=ZqhGZXf+ zNvIU_F?{ZQEUb9Jkp0VdlAD2Hf=T{>?02`}A zGfUkSFaQ7m0d!JMQvg8b*k%9#0h38YK~#7Fjg(Oi;~)$~?EgWQ^8XstWhIyVb34lEG3vzw{@Vv6|aHWxka2 zd*HuT5s|s(mfM7LPL=@?azt8ft@ZGd*Q^G6v|1FOvsx@MgQZq=HsIp12x9nkSaHVz z5-d8)gz@ULq7PkHoop7TA>-g`yPQlmB6k#8uOf_oRYHb@!o_E`wd+s;>u_SSkf>`T zS`kl}SjL$R*k>byoeP2PnAsM_bRf%xL)iK{N5!2RxZ7~A?OICUV?&%^DVK0@ThrQf zF=rXRMBn1IKIAshjgN82Gnjm1TJYRyKNvln+rf~2mHx$U1Ot8+y^drjnA#hg>DERo z7#G_cwRyo@C#sB~S07*qoM6N<$f<;I4Jpcdz literal 0 HcmV?d00001 diff --git a/resources/g2/41.png b/resources/g2/41.png new file mode 100644 index 0000000000000000000000000000000000000000..1aab1c2aad780d50b140c6ccea8cc976513e6b5d GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5el!VDxi>JME7Qd$8%A+A8Wn%jQ6dj99~-S4AU z-?r{wEFYiFVB9b6zuMV&y1ns!Z~bO-{mcH^&jt5Q1FB{$3GxeOaCmkj4alkUba4!+ zVD#|-M6e8TDQ(-WV7A7+TpF!OBaFsJ(iCq%&ThPdUxyG8lI$c>i;mdKI;Vst0J|Mwr2qf` literal 0 HcmV?d00001 diff --git a/resources/g2/42.png b/resources/g2/42.png new file mode 100644 index 0000000000000000000000000000000000000000..303ef490ee9fee7a81e983683b06ea6d6aaed3fd GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5el!VDxi>JME7QtAOdA+A9Bee~+v*8TnB{@c~_ z7t6<2bK5tY>#ue;-tVoS&R{&<-q@Z&nuqJFI8Z5LNswPKgTu2MX+Tb?r;B4q1!L$L zL#}263DyVuMT}bfY@J>*GWF}kPJY+As@P#q^X|o)cRyfdIo|VVZ_k4IN$%77zkd?G z8|UvTlbvv1{GCP6TrID^rVV8_dF=t4m%MM_-~4jAy_??09QxCmGJNZT!rF3v is7|^$MQys*3R#&sA_-L!qZ)w@VDNPHb6Mw<&;$Sh-&7y~ literal 0 HcmV?d00001 diff --git a/resources/g2/43.png b/resources/g2/43.png new file mode 100644 index 0000000000000000000000000000000000000000..1bedcf6fd3d24d8571a6ba73b1eb6cde7451fc51 GIT binary patch literal 577 zcmV-H0>1r;P)_(=S-!t<00001bW%=J06^y0W&i*Ir%6OXRCoccluOpEAPj^N zBmympNYne@=}qwQ>wv)EGRrxY&!R{ak2AU_{`o4 zfpRAoR~L?>uzsG`P^v8=ey?8^t)}SG$(dvl$V2n53pY*z% ztS)jffF}enNV>n^$aPQgak zl4p{ubzY$)lNkBWAuXC|{+JT|&&hf)$1A4%HP+$#_BekQ2Z?1dhFF zp*agz19fxT5lN2ou8xj|^-EqFf-0#8_NMzG7dSLvAh2-qDzAbXcrWDjmXjkk7nJY$ zF7UQ|E*SF#59eQ3cSdm(JgxqiU05{>hMH_sa`{x2Lu%>C*O;m`UXfZG_*V@qAM P00000NkvXXu0mjfJUI*N literal 0 HcmV?d00001 diff --git a/resources/g2/44.png b/resources/g2/44.png new file mode 100644 index 0000000000000000000000000000000000000000..075dae7638a5ed80e91a52b7f7b51011b3106f97 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMO!VDxUZdxAzQU(D&A+A8WU)+DOeEfFx{M*+3 z@1s{&bK9?WHcn?S-tVnH-QM_lxN@_({$+pd|Mlwsx7)jMoDT)+VJr#q3ubV5b|VeQ zY4&t+45?sr?cK=9kltqEpjm=GGeRLd6ekiDgB`UBjJO0#ctCJxEcSj{MV;HCn^M#J8m^nqZDTyJ zbL;h=ijhZk_k~9;W-Qck^Ip7fc7v2yd}ii9uWg!7|1ta&kzOp8EjJhF90pHUKbLh* G2~7a6!eJKx literal 0 HcmV?d00001 diff --git a/resources/g2/45.png b/resources/g2/45.png new file mode 100644 index 0000000000000000000000000000000000000000..16f8ca9e62677dc5e70eea1344fc18607509b2a7 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5ej!VDxQziT)QqznRlLR^7#HMjk3>;CuAtGBD? z_lx^4mXE*euf5+}|9`#uYG>pB@$%2ZmD3rFr`sDho9io0Ih735!&nmJ7tG-B>_!@p z)9&fw7*fHgduAi=AqO7T0At4hwgo3#uV~y;c=W3w$4lx6k07h6t5%tV)ypT*Et3Q# znqFzWiK+X(?<+5Z_VW$4>k|EXqn~|ryjSq@PiFnz-bQ|{M{&1B?w|S6xS8kHQXRu3 z);UjB&r*1FuI;A9)f>~6E1f@8TBotfC64zy>nWKPk$%(e8~tL|%vCzGEOd@A&`AuQ Lu6{1-oD!MUym10dka6eCvTTOGpj>0gEucfQ&UT0V0004WQchC9TOMLPFWIeu%JM+pP;=!kAh$lb) z&&4zb;Lxk3m|aIqal)mZ*M2TH0l>Mw8~a#jEe+Fb(sFE z>&qcFVq$)cRL5hWT!;=_#-gprd8U$S{Y6BNbEMaOiWkC1#$V}LwF0Z4VWx;9}ivTxF%j&)?+&Q(O+k*D`s~!5j3chTy70bT2E*$QP_cgWj!3VnC}y^wY{7FT+Ya z?tKI|>Q-W4W_slo&a~6-0=G=9^g8<(2kNrT5iBBXRK5pwK@da4Ws&%N4CBgFWQ1*p zOF;)Z9mfb|>qu?m&NeOU$p|5|o3wdpTtd1pv({ygp-P`AM194SuIZ7Jldic4ePtZ6 zcsa?k{oe|W=TC?s<^js~YgFhEdS82=D4tqQa}qm$f3LmOpQ h5tHTPteWc$>JLnx5b+T&MMwYu002ovPDHLkV1g?y3WERu literal 0 HcmV?d00001 diff --git a/resources/g2/47.png b/resources/g2/47.png new file mode 100644 index 0000000000000000000000000000000000000000..4dac4d418eb3c39185d90264ee24542fd5706b92 GIT binary patch literal 326 zcmV-M0lEH(P)*L_t(|0fmx5 z7K0!RL;<5hgj%ts?foy>0o#ob$@c$D2A}GBwCM-~jZ;UUkvakmSHdg{Q>ix_A~TD- z#|cTmuC`gAwxDvjW0p&n2Ur*lVOjoyXKP)>9f#W*aDo_fulN>2+#ey=GZ5UyrC>D**=kAFjF9nS$ei+}KwK#=aLm(T~f23ZQ9pKaIbF YUxI%Hpg0Z=SpWb407*qoM6N<$g5er}EC2ui literal 0 HcmV?d00001 diff --git a/resources/g2/48.png b/resources/g2/48.png new file mode 100644 index 0000000000000000000000000000000000000000..9cb20f7ecf87aebe9271bc0944ac785af255ad30 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^N zzqr4BaIklBvc9wPYG>nSbN%V|#@p5N?HQyO%g4WuUVYoTf4{dr|BICGK%I;wL4Lsu z4$p3+0XY*qT^vIy7+WtmPC9JB;S!j*)0D%culE0Gwl^VVB@z3Z^tY;Q`nq=GO~Wc4 zWu^LCp;L1wSuXEeICp`9v1?9}iuua}8XY^UrQ{tdPZdZrtTy>?+*2*F@_uS(L4dN5 zhVR|advsWgXU?%?x%o$G)A6^(Z;m$G%r4xdv|WA0zhh~f2Y0`}xv@@p_qyb@pO?JY bck|x6*{oZS@IPJvbQ^=GtDnm{r-UW|E;?(< literal 0 HcmV?d00001 diff --git a/resources/g2/49.png b/resources/g2/49.png new file mode 100644 index 0000000000000000000000000000000000000000..08c8af888d4c4c1aaf4ff19829b9bb2c831f5195 GIT binary patch literal 721 zcmV;?0xtcDP)a@x8L`d z%Y&Df?^~;T3qRXCk3UmW|6d=E7f-80Gyj`2ze_Lkce~S1D?b1m=T{@QCvRJGbN{zL zmT>G&00001bW%=J06^y0W&i*J6G=otRCocEl--u2AP|K8r2&;0jSw+vGQXS+0|8)RaMoOX#o{LEibW3Hv-BQ`3rJ71Mt;V<@dGm0!$00 z3~G7~&IeW9TBthodK)=4*7epH1EwhMQz?69yp@9|@hZ#aN8{P?ejHSHM><;`nU_6d z7Kt@HG~0Lf^lNRC`12z`?=5ZSvb3i^y*)4|9G~W&GLF~#9<4KOtqTM7GzTw^9Y55b za{MIAxQ+gnh~FKj-l9L>kW*|YHU}<@k4~}oc*IPRLwu7kSTX@OV2e!trf{K3gMYpz zPL8V=0Rm!?x0y)?#~+F=RHcfp+a@l2?*=Q-<%?eSZ^@)-kOL}@^GhF(fKYzO0P<<>Gm60E+hHIX(3p~joz0JITwx{Ih=R7@c^!lpn zba~G2>y5-HsNMj5iuZxn^Q@HWD)VTe9#TBT?e#{bFR?rTw>8D*#BUqGy9I%bHe%xV z-U(y&H{3d0^Wu}dl}-vpS8CBskqdQ+)InPnZPZ2ASYv9w#0WIPz3JLGBNZA2<@f z4neN7zj0>K*KxyD{FBFi5swG#j>~x1@E@x-|wyeJY2b7+&{m$dAhyv|9JUkbNzG%W0U$l z>OdnHOM?7@862M7NCR?eJzX3_Dj0qH0;jbYaImoY9BA02bMOBe=aM<;wPCZ~>6kZc zQQCTKy1B<0l`FTe9TQf$(77SveQAKW*Ke&Q3=3*@h#Id9`Li&K<^S^!tACZa1gwnX zvlD7szIEq=NvXztTnDxsKDGUCq({_=0a`9J-a&))yUoS)6Q(4%?Q RZ=gdMJYD@<);T3K0RW1AYB2x+ literal 0 HcmV?d00001 diff --git a/resources/g2/51.png b/resources/g2/51.png new file mode 100644 index 0000000000000000000000000000000000000000..21ee9e0ddd232d3abfb7f31f828ee3b58a4470a3 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5ej!3-qBRN@8+#`wM;8}g_Se>TcD4@=PG>OAZ*Kk{FaN(@z1dv<|7_#u;mZ5H^;bI^ zpKCkg0yKrOB*-tA!Qt7BG$5zm)5S5Qf-$x~P^ejf$K@ugh@$S&BfsOfO3GRv`~I`+ z#)gM{5|f1$6_l literal 0 HcmV?d00001 diff --git a/resources/g2/52.png b/resources/g2/52.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd0252a14feb85622415f8e2ef1f71b006904d7 GIT binary patch literal 614 zcmV-s0-61ZP)kt_ z)x^kiz+h?0stNZCBM1sJ7O907SVNn#jwEz?ebPGSwG)2U^!D&Js&=O&nfRP|8M%N9%%S~ii?3o+Qa2^5FnoMnF>-OM?7@862M7NCR?8JzX3_Dj0LmM!b`cWf`z_4 zpL{MlCC1BB?eNPvpNc-#oc&pL{kUCth($ literal 0 HcmV?d00001 diff --git a/resources/g2/54.png b/resources/g2/54.png new file mode 100644 index 0000000000000000000000000000000000000000..cd8625707ee2a2442cfbb7adb3cc1eb266ad6c70 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6G!3-o%eH76GQpN#3A+A7L-`Tm@Tz|WIzI|}8 zcXG10vU0z;|847jWn<&T^6{&kji=ii@AuYEXE3&Bkgn#ozao288K{l1B*-tA!Qt7B zG$1F_)5S5Qg0Xc%ARn_Lhl}Hu1rcxm`bRIy-J~^puKn}Wd4V$yGWcm6YgxZHHBCwI z%#Q2(6V8aUiwiDf^omN23cX*v`R+v?pG#o^A=#-`jH}sREMMKfnEBt25Zi_%{*QI5 i@AB~M*t*j011l3F^XqDbH9vutGI+ZBxvX2%Lo zz-?+C73eG z7}Z2y8)=N;++j37Q``|P`Z00+)mgaI$n#z0rC5Y~Ht&|{tkn|;T- zdAq&1Ue|V@zs?G_f$qX;e^P=`m_k0V5`B6PtAwZ=mkW?@``g;A&xw z`|CcwN8I(L@ExvS9}zD-N0k2fX>YsJ(zw*A2+K-W1?gIW^m-abX?Y&5EbgDWjPi51 Ze*tiWDT`)`1GoSH002ovPDHLkV1n9CN6!EN literal 0 HcmV?d00001 diff --git a/resources/g2/56.png b/resources/g2/56.png new file mode 100644 index 0000000000000000000000000000000000000000..17e96bbd20999f19745e57bc7a9025e90885531b GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^GC<73!3-qbSaofIly`tnh%1m5S5|H|*VlJ;UhQlg zU0ghW{rc_d`M0h6-$$=jHa4~o4!(T*cE7m)V)^)LZu|V^X7A+W?S~Ifw>NH{K7GHp z{_}9<%l_Kw48}_A|E2(qV=M{s3ubV5b|VeQ>GO1P45?r&?Z3FGS%JqT+2e>e%fXna z|Np(EkCbI)pHDuQQYL;+lFebqAxkB>zgK?D{&SL5OuXXR45@p6Hr=1euJTZzDaDh0 zUu8k6TUBZ{dIvXbP%-4Cd|3+}6ap2k&tEO6=RB?Etnpa-cxMD-j-ahkL>&vdZ vSKa&g%f^SEJ?;CqFr0o@@6n(;?+Nq$b8M$mw$2Rzx{Sfo)z4*}Q$iB}$3}L3 literal 0 HcmV?d00001 diff --git a/resources/g2/57.png b/resources/g2/57.png new file mode 100644 index 0000000000000000000000000000000000000000..6a1c64c248580416188aa80c7689df4aa26a3a31 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^(m>3^!3-pq+%$6mQceLrA+A7ryL$d@>;CuAtM#3o zy_1vod+Rrw>sNEz_lx_lb~aWvHqLKujxH{K9 zHszZQJb#KkX*m+};OwNo5p!KVL??3iPcD9~{ryRlnOmuMY~0PPlrw9OZ@=TpW2m#x zZo#kh9XDE8E5whNw1p;iN*#53eeKZ3{c@{6<;Wh+K9gN_J9V9}yY2O!)yI_zjy&>q z6qK}cG~5=(zm!G3;zrDlR{1-Dr`Z22?fFz&#q_|2?Qq94u}MIeGI+ZBxvX Date: Fri, 17 Jul 2015 21:32:22 +0100 Subject: [PATCH 0316/1173] fix #1641 --- src/interface/viewport.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 7d5f902b3e..9f89645871 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1416,10 +1416,11 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma { rct_drawpixelinfo *dpi = RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*); rct_ride *ride; - int trackType, trackColourScheme, trackSequence; + int rideIndex, trackType, trackColourScheme, trackSequence; if (!(RCT2_GLOBAL(0x009DEA6F, uint8) & 1) || mapElement->properties.track.ride_index == RCT2_GLOBAL(0x00F64DE8, uint8)) { - ride = GET_RIDE(mapElement->properties.track.ride_index); + rideIndex = mapElement->properties.track.ride_index; + ride = GET_RIDE(rideIndex); trackType = mapElement->properties.track.type; trackSequence = mapElement->properties.track.sequence & 0x0F; trackColourScheme = mapElement->properties.track.colour & 3; @@ -1471,7 +1472,16 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma uint32 *trackDirectionList = trackTypeList[trackType]; // Have to call from this point as it pushes esi and expects callee to pop it - RCT2_CALLPROC_X(0x006C4934, 0, (int)trackDirectionList, direction, height, (int)mapElement, 0, trackSequence); + RCT2_CALLPROC_X( + 0x006C4934, + ride->type, + (int)trackDirectionList, + direction, + height, + (int)mapElement, + rideIndex * sizeof(rct_ride), + trackSequence + ); } } From 6d6ceccc978cc9ec8891e77f9d8d83e0f52035de Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 18 Jul 2015 04:00:13 +0100 Subject: [PATCH 0317/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 720 +++++++++++++------------- 1 file changed, 360 insertions(+), 360 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 68e791ae5e..7f8f99cdbd 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -21,9 +21,9 @@ STR_0016 :Observation Tower STR_0017 :Looping Roller Coaster STR_0018 :Dinghy Slide STR_0019 :Mine Train Coaster -STR_0020 :Chairlift +STR_0020 :纜車 STR_0021 :Corkscrew Roller Coaster -STR_0022 :Maze +STR_0022 :迷宮 STR_0023 :Spiral Slide STR_0024 :Go Karts STR_0025 :Log Flume @@ -36,26 +36,26 @@ STR_0031 :Unknown Stall (1D) STR_0032 :Drink Stall STR_0033 :Unknown Stall (1F) STR_0034 :Shop -STR_0035 :Merry-Go-Round +STR_0035 :旋轉木馬 STR_0036 :Unknown Stall (22) STR_0037 :Information Kiosk -STR_0038 :Toilets -STR_0039 :Ferris Wheel +STR_0038 :廁所 +STR_0039 :摩天輪 STR_0040 :Motion Simulator -STR_0041 :3D Cinema +STR_0041 :3D戲院 STR_0042 :Top Spin STR_0043 :Space Rings STR_0044 :Reverse Freefall Coaster -STR_0045 :Lift +STR_0045 :升降機 STR_0046 :Vertical Drop Roller Coaster -STR_0047 :Cash Machine +STR_0047 :提款機 STR_0048 :Twist -STR_0049 :Haunted House -STR_0050 :First Aid Room -STR_0051 :Circus Show +STR_0049 :鬼屋 +STR_0050 :急救室 +STR_0051 :馬戲團 STR_0052 :Ghost Train STR_0053 :Steel Twister Roller Coaster -STR_0054 :Wooden Roller Coaster +STR_0054 :木製雲霄飛車 STR_0055 :Side-Friction Roller Coaster STR_0056 :Wild Mouse STR_0057 :Multi-Dimension Roller Coaster @@ -70,7 +70,7 @@ STR_0065 :Suspended Monorail STR_0066 :Unknown Ride (40) STR_0067 :Reverser Roller Coaster STR_0068 :Heartline Twister Coaster -STR_0069 :Mini Golf +STR_0069 :迷你高爾夫 STR_0070 :Giga Coaster STR_0071 :Roto-Drop STR_0072 :Flying Saucers @@ -826,16 +826,16 @@ STR_0821 :12月 STR_0822 :無法讀取圖像檔案 STR_0823 :缺少或不能讀取檔案 STR_0824 :{BLACK}{CROSS} -STR_0825 :Chosen name in use already +STR_0825 :此名字已被使用 STR_0826 :Too many names defined STR_0827 :沒有足夠現金 - 需要{CURRENCY2DP} STR_0828 :{SMALLFONT}{BLACK}關閉視窗 STR_0829 :{SMALLFONT}{BLACK}視窗標題 - 拖曳此來移動本視窗 -STR_0830 :{SMALLFONT}{BLACK}Zoom view in -STR_0831 :{SMALLFONT}{BLACK}Zoom view out -STR_0832 :{SMALLFONT}{BLACK}Rotate view 90{DEGREE} clockwise +STR_0830 :{SMALLFONT}{BLACK}放大檢視區域 +STR_0831 :{SMALLFONT}{BLACK}縮小檢視區域 +STR_0832 :{SMALLFONT}{BLACK}將檢視區域順時針旋轉90{DEGREE} STR_0833 :{SMALLFONT}{BLACK}暫停遊戲 -STR_0834 :{SMALLFONT}{BLACK}Disk and game options +STR_0834 :{SMALLFONT}{BLACK}硬碟及遊戲設定 STR_0835 :Game initialization failed STR_0836 :Unable to start game in a minimised state STR_0837 :Unable to initialise graphics system @@ -890,13 +890,13 @@ STR_0885 :儲存劇情 STR_0886 :離開遊戲 STR_0887 :離開劇情編輯工具 STR_0888 :離開雲霄飛車設計工具 -STR_0889 :離開遊樂設施設計管理工具 +STR_0889 :離開軌道設計管理工具 STR_0890 :SCR{COMMA16}.BMP STR_0891 :截圖 STR_0892 :截圖'{STRINGID}'已儲存到硬碟中 STR_0893 :截圖失敗! STR_0894 :Landscape data area full ! -STR_0895 :不能建造在一半露天一半地底的地勢 +STR_0895 :不能建造在一半露天一半地底的地勢中 STR_0896 :{POP16}{POP16}{STRINGID} 建造 STR_0897 :方向 STR_0898 :{SMALLFONT}{BLACK}左彎 @@ -954,7 +954,7 @@ STR_0949 :離開遊戲之前儲存此遊戲? STR_0950 :載入遊戲 STR_0951 :離開遊戲 STR_0952 :離開遊戲 -STR_0953 :Load Landscape +STR_0953 :載入地型 STR_0954 : STR_0955 :{SMALLFONT}{BLACK}Select seat rotation angle for this track section STR_0956 :-180{DEGREE} @@ -1144,18 +1144,18 @@ STR_1140 :{SMALLFONT}{BLACK}Select vehicle colour scheme option STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} -STR_1144 :Can't build/move entrance for this ride/attraction... -STR_1145 :Can't build/move exit for this ride/attraction... -STR_1146 :Entrance not yet built -STR_1147 :Exit not yet built -STR_1148 :Quarter load -STR_1149 :Half load -STR_1150 :Three-quarter load -STR_1151 :Full load -STR_1152 :Any load -STR_1153 :Height Marks on Ride Tracks -STR_1154 :Height Marks on Land -STR_1155 :Height Marks on Paths +STR_1144 :不能建造/移動這個遊樂設施的入口... +STR_1145 :不能建造/移動這個遊樂設施的出口... +STR_1146 :尚未建造入口 +STR_1147 :尚未建造出口 +STR_1148 :四分之一載客量 +STR_1149 :一半載客量 +STR_1150 :四分之三載客量 +STR_1151 :最大載客量 +STR_1152 :任意載客量 +STR_1153 :在設施軌道上標記高度 +STR_1154 :在土地上標記高度 +STR_1155 :在道路上標記高度 STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} STR_1158 :Can't remove this... @@ -1362,27 +1362,27 @@ STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs STR_1359 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minute STR_1360 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minutes STR_1361 :Can't change speed... -STR_1362 :Can't change launch speed... +STR_1362 :不能改變發車速度... STR_1363 :Too high for supports! STR_1364 :Supports for track above can't be extended any further! -STR_1365 :In-line Twist (left) -STR_1366 :In-line Twist (right) -STR_1367 :Half Loop -STR_1368 :Half Corkscrew (left) -STR_1369 :Half Corkscrew (right) -STR_1370 :Barrel Roll (left) -STR_1371 :Barrel Roll (right) -STR_1372 :Launched Lift Hill -STR_1373 :Large Half Loop (left) -STR_1374 :Large Half Loop (right) +STR_1365 :In-line Twist (向左) +STR_1366 :In-line Twist (向右) +STR_1367 :二分之一迴環 +STR_1368 :二分之一螺旋 (向左) +STR_1369 :二分之一螺旋 (向右) +STR_1370 :橫滾軌道 (向左) +STR_1371 :橫滾軌道 (向右) +STR_1372 :加速式的鏈條坡道 +STR_1373 :巨型的二分之一迴環 (向左) +STR_1374 :巨型的二分之一迴環 (向右) STR_1375 :Upper Transfer STR_1376 :Lower Transfer -STR_1377 :Heartline Roll (left) -STR_1378 :Heartline Roll (right) -STR_1379 :Reverser (left) -STR_1380 :Reverser (right) -STR_1381 :Curved Lift Hill (left) -STR_1382 :Curved Lift Hill (right) +STR_1377 :橫滾軌道 (向左) +STR_1378 :橫滾軌道 (向右) +STR_1379 :Reverser (向左) +STR_1380 :Reverser (向右) +STR_1381 :彎型的鏈條坡道 (向左) +STR_1382 :彎型的鏈條坡道 (向右) STR_1383 :Quarter Loop STR_1384 :{YELLOW}{STRINGID} STR_1385 :{SMALLFONT}{BLACK}Other track configurations @@ -1400,11 +1400,11 @@ STR_1396 :{SMALLFONT}{BLACK}Colour scheme options STR_1397 :{SMALLFONT}{BLACK}Sound & music options STR_1398 :{SMALLFONT}{BLACK}Measurements and test data STR_1399 :{SMALLFONT}{BLACK}Graphs -STR_1400 :Entrance -STR_1401 :Exit +STR_1400 :入口 +STR_1401 :出口 STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction -STR_1404 :{SMALLFONT}{BLACK}Rotate 90{DEGREE} +STR_1404 :{SMALLFONT}{BLACK}90{DEGREE}旋轉 STR_1405 :{SMALLFONT}{BLACK}Mirror image STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) STR_1407 :{WINDOW_COLOUR_2}Build this... @@ -1425,16 +1425,16 @@ STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g STR_1422 :{SMALLFONT}{BLACK}Logging data from {POP16}{STRINGID} STR_1423 :{SMALLFONT}{BLACK}Queue line path STR_1424 :{SMALLFONT}{BLACK}Footpath -STR_1425 :Footpath +STR_1425 :道路 STR_1426 :Queue Line STR_1427 :{WINDOW_COLOUR_2}Customers: {BLACK}{COMMA32} per hour STR_1428 :{WINDOW_COLOUR_2}Admission price: STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} -STR_1430 :Free -STR_1431 :Walking -STR_1432 :Heading for {STRINGID} -STR_1433 :Queuing for {STRINGID} -STR_1434 :Drowning +STR_1430 :免費 +STR_1431 :行走中 +STR_1432 :前往{STRINGID}中 +STR_1433 :輪侯{STRINGID}中 +STR_1434 :溺水中 STR_1435 :On {STRINGID} STR_1436 :In {STRINGID} STR_1437 :At {STRINGID} @@ -1452,17 +1452,17 @@ STR_1448 :Watching new ride being constructed STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) -STR_1452 :Guest's name -STR_1453 :Enter name for this guest: -STR_1454 :Can't name guest... -STR_1455 :Invalid name for guest -STR_1456 :{WINDOW_COLOUR_2}Cash spent: {BLACK}{CURRENCY2DP} -STR_1457 :{WINDOW_COLOUR_2}Cash in pocket: {BLACK}{CURRENCY2DP} -STR_1458 :{WINDOW_COLOUR_2}Time in park: {BLACK}{REALTIME} +STR_1452 :遊客的名字 +STR_1453 :請輸入這位遊客的新姓名: +STR_1454 :不能命名這位遊客... +STR_1455 :不適合的遊客姓名 +STR_1456 :{WINDOW_COLOUR_2}已花費的現金: {BLACK}{CURRENCY2DP} +STR_1457 :{WINDOW_COLOUR_2}在銀包中的現金: {BLACK}{CURRENCY2DP} +STR_1458 :{WINDOW_COLOUR_2}已逗留在樂園的時間: {BLACK}{REALTIME} STR_1459 :Track style -STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track -STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track -STR_1462 :Too steep for lift hill +STR_1460 :{SMALLFONT}{BLACK}'U'型的開放式軌道 +STR_1461 :{SMALLFONT}{BLACK}'O'型的封閉式軌道 +STR_1462 :對於帶有鏈條的坡道來說太陡斜 STR_1463 :遊客 STR_1464 :向上盤旋 (小型) STR_1465 :向上盤旋 (大型) @@ -1470,141 +1470,141 @@ STR_1466 :向下盤旋 (小型) STR_1467 :向下盤旋 (大型) STR_1468 :員工 STR_1469 :Ride must start and end with stations -STR_1470 :Station not long enough -STR_1471 :{WINDOW_COLOUR_2}Speed: -STR_1472 :{SMALLFONT}{BLACK}Speed of this ride -STR_1473 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1474 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}Not yet available -STR_1475 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1476 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}Not yet available -STR_1477 :{WINDOW_COLOUR_2}Intensity rating: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) -STR_1478 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1479 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}Not yet available -STR_1480 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} -STR_1481 :{SMALLFONT}{OPENQUOTES}I've spent all my money{ENDQUOTES} -STR_1482 :{SMALLFONT}{OPENQUOTES}I feel sick{ENDQUOTES} -STR_1483 :{SMALLFONT}{OPENQUOTES}I feel very sick{ENDQUOTES} -STR_1484 :{SMALLFONT}{OPENQUOTES}I want to go on something more thrilling than {STRINGID}{ENDQUOTES} -STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} looks too intense for me{ENDQUOTES} -STR_1486 :{SMALLFONT}{OPENQUOTES}I haven't finished my {STRINGID} yet{ENDQUOTES} -STR_1487 :{SMALLFONT}{OPENQUOTES}Just looking at {STRINGID} makes me feel sick{ENDQUOTES} -STR_1488 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to go on {STRINGID}{ENDQUOTES} -STR_1489 :{SMALLFONT}{OPENQUOTES}I want to go home{ENDQUOTES} -STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} is really good value{ENDQUOTES} -STR_1491 :{SMALLFONT}{OPENQUOTES}I've already got {STRINGID}{ENDQUOTES} -STR_1492 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} -STR_1493 :{SMALLFONT}{OPENQUOTES}I'm not hungry{ENDQUOTES} -STR_1494 :{SMALLFONT}{OPENQUOTES}I'm not thirsty{ENDQUOTES} -STR_1495 :{SMALLFONT}{OPENQUOTES}Help! I'm drowning!{ENDQUOTES} -STR_1496 :{SMALLFONT}{OPENQUOTES}I'm lost!{ENDQUOTES} -STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} was great{ENDQUOTES} -STR_1498 :{SMALLFONT}{OPENQUOTES}I've been queuing for {STRINGID} for ages{ENDQUOTES} -STR_1499 :{SMALLFONT}{OPENQUOTES}I'm tired{ENDQUOTES} -STR_1500 :{SMALLFONT}{OPENQUOTES}I'm hungry{ENDQUOTES} -STR_1501 :{SMALLFONT}{OPENQUOTES}I'm thirsty{ENDQUOTES} -STR_1502 :{SMALLFONT}{OPENQUOTES}I need to go to the bathroom{ENDQUOTES} -STR_1503 :{SMALLFONT}{OPENQUOTES}I can't find {STRINGID}{ENDQUOTES} -STR_1504 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to use {STRINGID}{ENDQUOTES} -STR_1505 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} while it's raining{ENDQUOTES} -STR_1506 :{SMALLFONT}{OPENQUOTES}The litter here is really bad{ENDQUOTES} -STR_1507 :{SMALLFONT}{OPENQUOTES}I can't find the park exit{ENDQUOTES} -STR_1508 :{SMALLFONT}{OPENQUOTES}I want to get off {STRINGID}{ENDQUOTES} -STR_1509 :{SMALLFONT}{OPENQUOTES}I want to get out of {STRINGID}{ENDQUOTES} -STR_1510 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} - It isn't safe{ENDQUOTES} -STR_1511 :{SMALLFONT}{OPENQUOTES}This path is disgusting{ENDQUOTES} -STR_1512 :{SMALLFONT}{OPENQUOTES}It's too crowded here{ENDQUOTES} -STR_1513 :{SMALLFONT}{OPENQUOTES}The vandalism here is really bad{ENDQUOTES} -STR_1514 :{SMALLFONT}{OPENQUOTES}Great scenery!{ENDQUOTES} -STR_1515 :{SMALLFONT}{OPENQUOTES}This park is really clean and tidy{ENDQUOTES} -STR_1516 :{SMALLFONT}{OPENQUOTES}The jumping fountains are great{ENDQUOTES} -STR_1517 :{SMALLFONT}{OPENQUOTES}The music is nice here{ENDQUOTES} -STR_1518 :{SMALLFONT}{OPENQUOTES}This balloon from {STRINGID} is really good value{ENDQUOTES} -STR_1519 :{SMALLFONT}{OPENQUOTES}This cuddly toy from {STRINGID} is really good value{ENDQUOTES} -STR_1520 :{SMALLFONT}{OPENQUOTES}This park map from {STRINGID} is really good value{ENDQUOTES} -STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} -STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} -STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} -STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} -STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} -STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} -STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} +STR_1470 :車站不夠長 +STR_1471 :{WINDOW_COLOUR_2}速度: +STR_1472 :{SMALLFONT}{BLACK}此遊樂設施的速度 +STR_1473 :{WINDOW_COLOUR_2}興奮度: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1474 :{WINDOW_COLOUR_2}興奮度: {BLACK}暫無 +STR_1475 :{WINDOW_COLOUR_2}刺激度: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1476 :{WINDOW_COLOUR_2}刺激度: {BLACK}暫無 +STR_1477 :{WINDOW_COLOUR_2}刺激度: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) +STR_1478 :{WINDOW_COLOUR_2}噁心度: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1479 :{WINDOW_COLOUR_2}噁心度: {BLACK}暫無 +STR_1480 :{SMALLFONT}{OPENQUOTES}我已經不夠錢去乘坐{STRINGID}了{ENDQUOTES} +STR_1481 :{SMALLFONT}{OPENQUOTES}我已經花光我的錢了{ENDQUOTES} +STR_1482 :{SMALLFONT}{OPENQUOTES}我感到不適{ENDQUOTES} +STR_1483 :{SMALLFONT}{OPENQUOTES}我感到非常不適{ENDQUOTES} +STR_1484 :{SMALLFONT}{OPENQUOTES}我想去試試比{STRINGID}更刺激的遊樂設施{ENDQUOTES} +STR_1485 :{SMALLFONT}{OPENQUOTES}對我來說, {STRINGID}看起來太刺激了{ENDQUOTES} +STR_1486 :{SMALLFONT}{OPENQUOTES}我還未吃/喝完我的{STRINGID}{ENDQUOTES} +STR_1487 :{SMALLFONT}{OPENQUOTES}只是看著{STRINGID}已經讓我感到不適{ENDQUOTES} +STR_1488 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢去乘坐{STRINGID}{ENDQUOTES} +STR_1489 :{SMALLFONT}{OPENQUOTES}我想回家{ENDQUOTES} +STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID}真的是超值{ENDQUOTES} +STR_1491 :{SMALLFONT}{OPENQUOTES}我已經擁有{STRINGID}了{ENDQUOTES} +STR_1492 :{SMALLFONT}{OPENQUOTES}我已經不夠錢從{STRINGID}購買東西了{ENDQUOTES} +STR_1493 :{SMALLFONT}{OPENQUOTES}我還未餓{ENDQUOTES} +STR_1494 :{SMALLFONT}{OPENQUOTES}我還未渴{ENDQUOTES} +STR_1495 :{SMALLFONT}{OPENQUOTES}救命! 我快要溺死了!{ENDQUOTES} +STR_1496 :{SMALLFONT}{OPENQUOTES}我迷路了!{ENDQUOTES} +STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID}真棒{ENDQUOTES} +STR_1498 :{SMALLFONT}{OPENQUOTES}我輪侯{STRINGID}很長時間了{ENDQUOTES} +STR_1499 :{SMALLFONT}{OPENQUOTES}我累了{ENDQUOTES} +STR_1500 :{SMALLFONT}{OPENQUOTES}我餓了{ENDQUOTES} +STR_1501 :{SMALLFONT}{OPENQUOTES}我渴了{ENDQUOTES} +STR_1502 :{SMALLFONT}{OPENQUOTES}我要上廁所{ENDQUOTES} +STR_1503 :{SMALLFONT}{OPENQUOTES}我找不到{STRINGID}{ENDQUOTES} +STR_1504 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢去使用{STRINGID}{ENDQUOTES} +STR_1505 :{SMALLFONT}{OPENQUOTES}我不會在下雨時乘坐{STRINGID}{ENDQUOTES} +STR_1506 :{SMALLFONT}{OPENQUOTES}這裡真多垃圾{ENDQUOTES} +STR_1507 :{SMALLFONT}{OPENQUOTES}我找不到樂園出口{ENDQUOTES} +STR_1508 :{SMALLFONT}{OPENQUOTES}我想從{STRINGID}中下來{ENDQUOTES} +STR_1509 :{SMALLFONT}{OPENQUOTES}我想從{STRINGID}中出來{ENDQUOTES} +STR_1510 :{SMALLFONT}{OPENQUOTES}我不會乘坐{STRINGID} - 它一點都不安全{ENDQUOTES} +STR_1511 :{SMALLFONT}{OPENQUOTES}這道路真是令人噁心{ENDQUOTES} +STR_1512 :{SMALLFONT}{OPENQUOTES}這裡太擠逼了{ENDQUOTES} +STR_1513 :{SMALLFONT}{OPENQUOTES}這裡真多被刻意毀壞的設施{ENDQUOTES} +STR_1514 :{SMALLFONT}{OPENQUOTES}這裡的景色真是美不勝收!{ENDQUOTES} +STR_1515 :{SMALLFONT}{OPENQUOTES}這樂園真是又整齊又乾淨{ENDQUOTES} +STR_1516 :{SMALLFONT}{OPENQUOTES}這些跳躍噴泉真棒{ENDQUOTES} +STR_1517 :{SMALLFONT}{OPENQUOTES}這裡播放的音樂挺不錯{ENDQUOTES} +STR_1518 :{SMALLFONT}{OPENQUOTES}這個由{STRINGID}購買的氣球真的是超值{ENDQUOTES} +STR_1519 :{SMALLFONT}{OPENQUOTES}這隻由{STRINGID}購買的熊寶寶真的是超值{ENDQUOTES} +STR_1520 :{SMALLFONT}{OPENQUOTES}這份由{STRINGID}購買的樂園地圖真的是超值{ENDQUOTES} +STR_1521 :{SMALLFONT}{OPENQUOTES}這張由{STRINGID}購買的即時照片真的是超值{ENDQUOTES} +STR_1522 :{SMALLFONT}{OPENQUOTES}這把由{STRINGID}購買的雨傘真的是超值{ENDQUOTES} +STR_1523 :{SMALLFONT}{OPENQUOTES}這杯由{STRINGID}購買的飲料真的是超值{ENDQUOTES} +STR_1524 :{SMALLFONT}{OPENQUOTES}這個由{STRINGID}購買的漢堡真的是超值{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}這客由{STRINGID}購買的薯條真的是超值{ENDQUOTES} +STR_1526 :{SMALLFONT}{OPENQUOTES}這個由{STRINGID}購買的冰淇淋真的是超值{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}這個由{STRINGID}購買的棉花糖真的是超值{ENDQUOTES} STR_1528 : STR_1529 : STR_1530 : -STR_1531 :{SMALLFONT}{OPENQUOTES}This pizza from {STRINGID} is really good value{ENDQUOTES} +STR_1531 :{SMALLFONT}{OPENQUOTES}這件由{STRINGID}購買的批薩真的是超值{ENDQUOTES} STR_1532 : -STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good value{ENDQUOTES} -STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} -STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} -STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} -STR_1537 :{SMALLFONT}{OPENQUOTES}This toffee apple from {STRINGID} is really good value{ENDQUOTES} -STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} -STR_1539 :{SMALLFONT}{OPENQUOTES}This doughnut from {STRINGID} is really good value{ENDQUOTES} -STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} +STR_1533 :{SMALLFONT}{OPENQUOTES}這客由{STRINGID}購買的爆米花真的是超值{ENDQUOTES} +STR_1534 :{SMALLFONT}{OPENQUOTES}這隻由{STRINGID}購買的熱狗真的是超值{ENDQUOTES} +STR_1535 :{SMALLFONT}{OPENQUOTES}這隻由{STRINGID}購買的觸手真的是超值{ENDQUOTES} +STR_1536 :{SMALLFONT}{OPENQUOTES}這頂由{STRINGID}購買的帽子真的是超值{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}這個由{STRINGID}購買的太妃蘋果糖真的是超值{ENDQUOTES} +STR_1538 :{SMALLFONT}{OPENQUOTES}這件由{STRINGID}購買的T-shirt真的是超值{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}這件由{STRINGID}購買的甜甜圈真的是超值{ENDQUOTES} +STR_1540 :{SMALLFONT}{OPENQUOTES}這杯由{STRINGID}購買的咖啡真的是超值{ENDQUOTES} STR_1541 : -STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} -STR_1543 :{SMALLFONT}{OPENQUOTES}This lemonade from {STRINGID} is really good value{ENDQUOTES} +STR_1542 :{SMALLFONT}{OPENQUOTES}這件由{STRINGID}購買的炸雞真的是超值{ENDQUOTES} +STR_1543 :{SMALLFONT}{OPENQUOTES}這杯由{STRINGID}購買的檸檬水真的是超值{ENDQUOTES} STR_1544 : STR_1545 : STR_1546 : STR_1547 : STR_1548 : STR_1549 : -STR_1550 :{SMALLFONT}{OPENQUOTES}Wow!{ENDQUOTES} -STR_1551 :{SMALLFONT}{OPENQUOTES}I have the strangest feeling someone is watching me{ENDQUOTES} -STR_1552 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a balloon from {STRINGID}{ENDQUOTES} -STR_1553 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cuddly toy from {STRINGID}{ENDQUOTES} -STR_1554 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a park map from {STRINGID}{ENDQUOTES} -STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} -STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} -STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} -STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} -STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} -STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} -STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} +STR_1550 :{SMALLFONT}{OPENQUOTES}嘩!{ENDQUOTES} +STR_1551 :{SMALLFONT}{OPENQUOTES}奇怪, 我覺得有人在偷窺我{ENDQUOTES} +STR_1552 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一個氣球{ENDQUOTES} +STR_1553 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一隻熊寶寶{ENDQUOTES} +STR_1554 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一份樂園地圖{ENDQUOTES} +STR_1555 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一張即時照片{ENDQUOTES} +STR_1556 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一把雨傘{ENDQUOTES} +STR_1557 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一杯飲料{ENDQUOTES} +STR_1558 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一個漢堡{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一客薯條{ENDQUOTES} +STR_1560 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一個冰淇淋{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一個棉花糖{ENDQUOTES} STR_1562 : STR_1563 : STR_1564 : -STR_1565 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for pizza from {STRINGID}{ENDQUOTES} +STR_1565 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一件批薩{ENDQUOTES} STR_1566 : -STR_1567 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for popcorn from {STRINGID}{ENDQUOTES} -STR_1568 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hot dog from {STRINGID}{ENDQUOTES} -STR_1569 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for tentacle from {STRINGID}{ENDQUOTES} -STR_1570 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hat from {STRINGID}{ENDQUOTES} -STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a toffee apple from {STRINGID}{ENDQUOTES} -STR_1572 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a T-shirt from {STRINGID}{ENDQUOTES} -STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a doughnut from {STRINGID}{ENDQUOTES} -STR_1574 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for coffee from {STRINGID}{ENDQUOTES} +STR_1567 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一客爆米花{ENDQUOTES} +STR_1568 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一隻熱狗{ENDQUOTES} +STR_1569 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一隻觸手{ENDQUOTES} +STR_1570 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一頂帽子{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一個太妃蘋果糖{ENDQUOTES} +STR_1572 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一件T-shirt{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一件甜甜圈{ENDQUOTES} +STR_1574 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一杯咖啡{ENDQUOTES} STR_1575 : -STR_1576 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried chicken from {STRINGID}{ENDQUOTES} -STR_1577 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for lemonade from {STRINGID}{ENDQUOTES} +STR_1576 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一件炸雞{ENDQUOTES} +STR_1577 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一杯檸檬水{ENDQUOTES} STR_1578 : STR_1579 : STR_1580 : STR_1581 : STR_1582 : STR_1583 : -STR_1584 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} -STR_1585 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} -STR_1586 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} -STR_1587 :{SMALLFONT}{OPENQUOTES}This pretzel from {STRINGID} is really good value{ENDQUOTES} -STR_1588 :{SMALLFONT}{OPENQUOTES}This hot chocolate from {STRINGID} is really good value{ENDQUOTES} -STR_1589 :{SMALLFONT}{OPENQUOTES}This iced tea from {STRINGID} is really good value{ENDQUOTES} -STR_1590 :{SMALLFONT}{OPENQUOTES}This funnel cake from {STRINGID} is really good value{ENDQUOTES} -STR_1591 :{SMALLFONT}{OPENQUOTES}These sunglasses from {STRINGID} are really good value{ENDQUOTES} -STR_1592 :{SMALLFONT}{OPENQUOTES}These beef noodles from {STRINGID} are really good value{ENDQUOTES} -STR_1593 :{SMALLFONT}{OPENQUOTES}These fried rice noodles from {STRINGID} are really good value{ENDQUOTES} -STR_1594 :{SMALLFONT}{OPENQUOTES}This wonton soup from {STRINGID} is really good value{ENDQUOTES} -STR_1595 :{SMALLFONT}{OPENQUOTES}This meatball soup from {STRINGID} is really good value{ENDQUOTES} -STR_1596 :{SMALLFONT}{OPENQUOTES}This fruit juice from {STRINGID} is really good value{ENDQUOTES} -STR_1597 :{SMALLFONT}{OPENQUOTES}This soybean milk from {STRINGID} is really good value{ENDQUOTES} -STR_1598 :{SMALLFONT}{OPENQUOTES}This sujongkwa from {STRINGID} is really good value{ENDQUOTES} -STR_1599 :{SMALLFONT}{OPENQUOTES}This sub sandwich from {STRINGID} is really good value{ENDQUOTES} -STR_1600 :{SMALLFONT}{OPENQUOTES}This cookie from {STRINGID} is really good value{ENDQUOTES} +STR_1584 :{SMALLFONT}{OPENQUOTES}這張由{STRINGID}購買的即時照片真的是超值{ENDQUOTES} +STR_1585 :{SMALLFONT}{OPENQUOTES}這張由{STRINGID}購買的即時照片真的是超值{ENDQUOTES} +STR_1586 :{SMALLFONT}{OPENQUOTES}這張由{STRINGID}購買的即時照片真的是超值{ENDQUOTES} +STR_1587 :{SMALLFONT}{OPENQUOTES}這件由{STRINGID}購買的椒鹽卷餅真的是超值{ENDQUOTES} +STR_1588 :{SMALLFONT}{OPENQUOTES}這杯由{STRINGID}購買的熱巧克力真的是超值{ENDQUOTES} +STR_1589 :{SMALLFONT}{OPENQUOTES}這杯由{STRINGID}購買的冰紅茶真的是超值{ENDQUOTES} +STR_1590 :{SMALLFONT}{OPENQUOTES}這個由{STRINGID}購買的漏斗蛋糕真的是超值{ENDQUOTES} +STR_1591 :{SMALLFONT}{OPENQUOTES}這副由{STRINGID}購買的太陽眼鏡真的是超值{ENDQUOTES} +STR_1592 :{SMALLFONT}{OPENQUOTES}這份由{STRINGID}購買的牛肉麵真的是超值{ENDQUOTES} +STR_1593 :{SMALLFONT}{OPENQUOTES}這份由{STRINGID}購買的炒米粉真的是超值{ENDQUOTES} +STR_1594 :{SMALLFONT}{OPENQUOTES}這份由{STRINGID}購買的湯雲吞真的是超值{ENDQUOTES} +STR_1595 :{SMALLFONT}{OPENQUOTES}這份由{STRINGID}購買的肉丸湯真的是超值{ENDQUOTES} +STR_1596 :{SMALLFONT}{OPENQUOTES}這杯由{STRINGID}購買的果汁真的是超值{ENDQUOTES} +STR_1597 :{SMALLFONT}{OPENQUOTES}這杯由{STRINGID}購買的豆漿真的是超值{ENDQUOTES} +STR_1598 :{SMALLFONT}{OPENQUOTES}這杯由{STRINGID}購買的水正果真的是超值{ENDQUOTES} +STR_1599 :{SMALLFONT}{OPENQUOTES}這件由{STRINGID}購買的潛艇三文治真的是超值{ENDQUOTES} +STR_1600 :{SMALLFONT}{OPENQUOTES}這件由{STRINGID}購買的曲奇真的是超值{ENDQUOTES} STR_1601 : STR_1602 : STR_1603 : -STR_1604 :{SMALLFONT}{OPENQUOTES}This roast sausage from {STRINGID} are really good value{ENDQUOTES} +STR_1604 :{SMALLFONT}{OPENQUOTES}這條由{STRINGID}購買的烤香腸真的是超值{ENDQUOTES} STR_1605 : STR_1606 : STR_1607 : @@ -1725,22 +1725,22 @@ STR_1721 :樂園關閉中 STR_1722 :樂園開放中 STR_1723 :不能開放樂園... STR_1724 :不能關閉樂園... -STR_1725 :Can't buy land... -STR_1726 :Land not for sale! -STR_1727 :Construction rights not for sale! -STR_1728 :Can't buy construction rights here... -STR_1729 :Land not owned by park! +STR_1725 :不能購買土地... +STR_1726 :土地不供購買! +STR_1727 :建造權不供購買! +STR_1728 :不能在此購買建造權... +STR_1729 :土地不是由樂園所擁有! STR_1730 :{RED}Closed - - STR_1731 :{WHITE}{STRINGID} - - STR_1732 :Build STR_1733 :Mode -STR_1734 :{WINDOW_COLOUR_2}Number of laps: +STR_1734 :{WINDOW_COLOUR_2}圈數: STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1737 :{COMMA16} -STR_1738 :Can't change number of laps... -STR_1739 :Race won by guest {INT32} -STR_1740 :Race won by {STRINGID} +STR_1738 :不能改變圈數... +STR_1739 :此賽事由遊客{INT32}勝出 +STR_1740 :此賽事由{STRINGID}勝出 STR_1741 :Not yet constructed ! STR_1742 :{WINDOW_COLOUR_2}Max. people on ride: STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this ride at one time @@ -1779,17 +1779,17 @@ STR_1775 :Off STR_1776 :On STR_1777 :{WINDOW_COLOUR_2}Music STR_1778 :{STRINGID} - - -STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume -STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tigre costume -STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume -STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume -STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume -STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snowman costume -STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Knight costume -STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume -STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume -STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume -STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume +STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} 熊貓服裝 +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} 老虎服裝 +STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} 大象服裝 +STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} 羅馬服裝 +STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} 哥斯拉服裝 +STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} 雪人服裝 +STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} 騎士服裝 +STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} 太空人服裝 +STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} 土匪服裝 +STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} 警長服裝 +STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} 海盜服裝 STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff STR_1791 :{WINDOW_COLOUR_2}Uniform colour: STR_1792 :Responding to {STRINGID} breakdown call @@ -1826,39 +1826,39 @@ STR_1822 :{WINDOW_COLOUR_2}Guests thinking about {POP16}{STRINGID} STR_1823 :{SMALLFONT}{BLACK}Show guests' thoughts about this ride/attraction STR_1824 :{SMALLFONT}{BLACK}Show guests on this ride/attraction STR_1825 :{SMALLFONT}{BLACK}Show guests queuing for this ride/attraction -STR_1826 :Status -STR_1827 :Popularity -STR_1828 :Satisfaction -STR_1829 :Profit -STR_1830 :Queue length -STR_1831 :Queue time -STR_1832 :Reliability -STR_1833 :Down-time -STR_1834 :Guests favourite -STR_1835 :Popularity: Unknown -STR_1836 :Popularity: {COMMA16}% -STR_1837 :Satisfaction: Unknown -STR_1838 :Satisfaction: {COMMA16}% -STR_1839 :Reliability: {COMMA16}% -STR_1840 :Down-time: {COMMA16}% -STR_1841 :Profit: {CURRENCY2DP} per hour -STR_1842 :Favourite of: {COMMA16} guest -STR_1843 :Favourite of: {COMMA16} guests -STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list +STR_1826 :狀態 +STR_1827 :人氣度 +STR_1828 :滿意度 +STR_1829 :利潤 +STR_1830 :輪候隊列長度 +STR_1831 :輪候時間 +STR_1832 :可靠度 +STR_1833 :故障度 +STR_1834 :遊客最愛的遊樂設施 +STR_1835 :人氣度: 未知 +STR_1836 :人氣度: {COMMA16}% +STR_1837 :滿意度: 未知 +STR_1838 :滿意度: {COMMA16}% +STR_1839 :可靠度: {COMMA16}% +STR_1840 :故障度: {COMMA16}% +STR_1841 :利潤: 每小時{CURRENCY2DP} +STR_1842 :{COMMA16}遊客最愛的遊樂設施 +STR_1843 :{COMMA16}遊客最愛的遊樂設施 +STR_1844 :{SMALLFONT}{BLACK}選擇要在遊樂設施/店面列表中顯示的資訊類別 STR_1845 :{MONTHYEAR} -STR_1846 :{COMMA16} guests -STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} guests -STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} guests +STR_1846 :{COMMA16}遊客 +STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16}遊客 +STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16}遊客 STR_1849 :{WINDOW_COLOUR_2}播放音樂 -STR_1850 :{SMALLFONT}{BLACK}Select whether music should be played for this ride -STR_1851 :{WINDOW_COLOUR_2}Running cost: {BLACK}{CURRENCY2DP} per hour -STR_1852 :{WINDOW_COLOUR_2}Running cost: {BLACK}Unknown -STR_1853 :{WINDOW_COLOUR_2}Built: {BLACK}This Year -STR_1854 :{WINDOW_COLOUR_2}Built: {BLACK}Last Year -STR_1855 :{WINDOW_COLOUR_2}Built: {BLACK}{COMMA16} Years Ago -STR_1856 :{WINDOW_COLOUR_2}Profit per item sold: {BLACK}{CURRENCY2DP} -STR_1857 :{WINDOW_COLOUR_2}Loss per item sold: {BLACK}{CURRENCY2DP} -STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY2DP} per month +STR_1850 :{SMALLFONT}{BLACK}選擇此遊樂設施播放音樂與否 +STR_1851 :{WINDOW_COLOUR_2}運行成本: {BLACK}每小時{CURRENCY2DP} +STR_1852 :{WINDOW_COLOUR_2}運行成本: {BLACK}未知 +STR_1853 :{WINDOW_COLOUR_2}落成年份: {BLACK}今年 +STR_1854 :{WINDOW_COLOUR_2}落成年份: {BLACK}去年 +STR_1855 :{WINDOW_COLOUR_2}落成年份: {BLACK}{COMMA16}年前 +STR_1856 :{WINDOW_COLOUR_2}每件售出產品的利潤: {BLACK}{CURRENCY2DP} +STR_1857 :{WINDOW_COLOUR_2}每件售出產品的虧損: {BLACK}{CURRENCY2DP} +STR_1858 :{WINDOW_COLOUR_2}成本: {BLACK}每個月{CURRENCY2DP} STR_1859 :清潔工人 STR_1860 :維修人員 STR_1861 :安全警衛 @@ -2233,39 +2233,39 @@ STR_2229 :Slope up to vertical STR_2230 :Vertical track STR_2231 :Holding brake for drop STR_2232 :Cable lift hill -STR_2233 :{SMALLFONT}{BLACK}Park information -STR_2234 :Recent Messages +STR_2233 :{SMALLFONT}{BLACK}樂園資料 +STR_2234 :最近訊息 STR_2235 :{SMALLFONT}{STRINGID} {STRINGID} -STR_2236 :January -STR_2237 :February -STR_2238 :March -STR_2239 :April -STR_2240 :May -STR_2241 :June -STR_2242 :July -STR_2243 :August -STR_2244 :September -STR_2245 :October -STR_2246 :November -STR_2247 :December -STR_2248 :Can't demolish ride/attraction... -STR_2249 :{BABYBLUE}New ride/attraction now available:{NEWLINE}{STRINGID} -STR_2250 :{BABYBLUE}New scenery/themeing now available:{NEWLINE}{STRINGID} +STR_2236 :1月 +STR_2237 :2月 +STR_2238 :3月 +STR_2239 :4月 +STR_2240 :5月 +STR_2241 :6月 +STR_2242 :7月 +STR_2243 :8月 +STR_2244 :9月 +STR_2245 :10月 +STR_2246 :11月 +STR_2247 :12月 +STR_2248 :不能移除遊樂設施/店鋪... +STR_2249 :{BABYBLUE}全新遊樂設施/店鋪可供使用:{NEWLINE}{STRINGID} +STR_2250 :{BABYBLUE}全新景物/主題景物可供使用:{NEWLINE}{STRINGID} STR_2251 :Can only be built on paths! STR_2252 :Can only be built across paths! -STR_2253 :Transport Rides -STR_2254 :Gentle Rides -STR_2255 :Roller Coasters -STR_2256 :Thrill Rides -STR_2257 :Water Rides -STR_2258 :Shops & Stalls -STR_2259 :Scenery & Themeing +STR_2253 :運輸類遊樂設施 +STR_2254 :溫和類遊樂設施 +STR_2255 :雲霄飛車 +STR_2256 :剌激類遊樂設施 +STR_2257 :水文類遊樂設施 +STR_2258 :商店及攤販 +STR_2259 :景物及主題景物 STR_2260 :No funding STR_2261 :Minimum funding STR_2262 :Normal funding STR_2263 :Maximum funding STR_2264 :Research funding -STR_2265 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} per month +STR_2265 :{WINDOW_COLOUR_2}費用: {BLACK}每個月{CURRENCY} STR_2266 :Research priorities STR_2267 :Currently in development STR_2268 :Last development @@ -2277,18 +2277,18 @@ STR_2273 :{WINDOW_COLOUR_2}Scenery/themeing:{NEWLINE}{BLACK}{STRINGID} STR_2274 :{SMALLFONT}{BLACK}Show details of this invention or development STR_2275 :{SMALLFONT}{BLACK}Show funding and options for research & development STR_2276 :{SMALLFONT}{BLACK}Show research & development status -STR_2277 :Unknown -STR_2278 :Transport Ride -STR_2279 :Gentle Ride -STR_2280 :Roller Coaster -STR_2281 :Thrill Ride -STR_2282 :Water Ride -STR_2283 :Shop/Stall -STR_2284 :Scenery/Themeing -STR_2285 :Initial research -STR_2286 :Designing -STR_2287 :Completing design -STR_2288 :Unknown +STR_2277 :未知 +STR_2278 :運輸類遊樂設施 +STR_2279 :溫和類遊樂設施 +STR_2280 :雲霄飛車 +STR_2281 :剌激類遊樂設施 +STR_2282 :水文類遊樂設施 +STR_2283 :商店及攤販 +STR_2284 :景物及主題景物 +STR_2285 :初始研發 +STR_2286 :設計中 +STR_2287 :完成設計中 +STR_2288 :未知 STR_2289 :{STRINGID} {STRINGID} STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} STR_2291 :Select scenario for new game @@ -2347,20 +2347,20 @@ STR_2343 :Euros ({EURO}) STR_2344 :Imperial STR_2345 :Metric STR_2346 :Display -STR_2347 :{RED}{STRINGID} has drowned! +STR_2347 :{RED}{STRINGID}已被溺死! STR_2348 :{SMALLFONT}{BLACK}Show statistics for this staff member -STR_2349 :{WINDOW_COLOUR_2}Wages: {BLACK}{CURRENCY} per month -STR_2350 :{WINDOW_COLOUR_2}Employed: {BLACK}{MONTHYEAR} -STR_2351 :{WINDOW_COLOUR_2}Lawns mown: {BLACK}{COMMA16} -STR_2352 :{WINDOW_COLOUR_2}Gardens watered: {BLACK}{COMMA16} -STR_2353 :{WINDOW_COLOUR_2}Litter swept: {BLACK}{COMMA16} -STR_2354 :{WINDOW_COLOUR_2}Bins emptied: {BLACK}{COMMA16} -STR_2355 :{WINDOW_COLOUR_2}Rides fixed: {BLACK}{COMMA16} -STR_2356 :{WINDOW_COLOUR_2}Rides inspected: {BLACK}{COMMA16} +STR_2349 :{WINDOW_COLOUR_2}工資: {BLACK}每個月{CURRENCY} +STR_2350 :{WINDOW_COLOUR_2}僱用日期: {BLACK}{MONTHYEAR} +STR_2351 :{WINDOW_COLOUR_2}除草次數: {BLACK}{COMMA16} +STR_2352 :{WINDOW_COLOUR_2}灌溉次數: {BLACK}{COMMA16} +STR_2353 :{WINDOW_COLOUR_2}掃地次數: {BLACK}{COMMA16} +STR_2354 :{WINDOW_COLOUR_2}清空拉坡筒次數: {BLACK}{COMMA16} +STR_2355 :{WINDOW_COLOUR_2}修理遊樂設施次數: {BLACK}{COMMA16} +STR_2356 :{WINDOW_COLOUR_2}檢驗遊樂設施次數: {BLACK}{COMMA16} STR_2357 :House STR_2358 :Units STR_2359 :Real Values -STR_2360 :{WINDOW_COLOUR_2}Display Resolution: +STR_2360 :{WINDOW_COLOUR_2}屏幕解析度: STR_2361 :Landscape Smoothing STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off STR_2363 :Gridlines on Landscape @@ -2436,12 +2436,12 @@ STR_2432 :{BLACK}Vouchers for half-price entry to {STRINGID} STR_2433 :{BLACK}Vouchers for free {STRINGID} STR_2434 :{BLACK}Advertising campaign for {STRINGID} STR_2435 :{BLACK}Advertising campaign for {STRINGID} -STR_2436 :1 week -STR_2437 :2 weeks -STR_2438 :3 weeks -STR_2439 :4 weeks -STR_2440 :5 weeks -STR_2441 :6 weeks +STR_2436 :1週 +STR_2437 :2週 +STR_2438 :3週 +STR_2439 :4週 +STR_2440 :5週 +STR_2441 :6週 STR_2442 :{BLACK}({STRINGID} remaining) STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} @@ -3057,7 +3057,7 @@ STR_3050 :Golf hole B STR_3051 :Golf hole C STR_3052 :Golf hole D STR_3053 :Golf hole E -STR_3054 :Loading... +STR_3054 :載入中... STR_3055 :White STR_3056 :Translucent STR_3057 :{WINDOW_COLOUR_2}Construction Marker: @@ -3110,9 +3110,9 @@ STR_3103 :Can't re-paint this... STR_3104 :{SMALLFONT}{BLACK}List rides STR_3105 :{SMALLFONT}{BLACK}List shops and stalls STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other guest facilities -STR_3107 :Close -STR_3108 :Test -STR_3109 :Open +STR_3107 :關閉 +STR_3108 :測試 +STR_3109 :開啟 STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16} STR_3111 :{SMALLFONT}{BLACK}Click on design to build it STR_3112 :{SMALLFONT}{BLACK}Click on design to rename or delete it @@ -3289,29 +3289,29 @@ STR_3282 :{SMALLFONT}{BLACK}Select objective and park name STR_3283 :{SMALLFONT}{BLACK}Select rides to be preserved STR_3284 :Objective Selection STR_3285 :Preserved Rides -STR_3286 :{SMALLFONT}{BLACK}Select objective for this scenario -STR_3287 :{WINDOW_COLOUR_2}Objective: -STR_3288 :{SMALLFONT}{BLACK}Select climate -STR_3289 :{WINDOW_COLOUR_2}Climate: -STR_3290 :Cool and wet -STR_3291 :Warm -STR_3292 :Hot and dry -STR_3293 :Cold -STR_3294 :Change... +STR_3286 :{SMALLFONT}{BLACK}選擇此劇情的目標 +STR_3287 :{WINDOW_COLOUR_2}目標: +STR_3288 :{SMALLFONT}{BLACK}選擇氣候 +STR_3289 :{WINDOW_COLOUR_2}氣候: +STR_3290 :又冷又潮濕 +STR_3291 :溫暖 +STR_3292 :又熱又乾燥 +STR_3293 :寒冷 +STR_3294 :更改... STR_3295 :{SMALLFONT}{BLACK}Change name of park STR_3296 :{SMALLFONT}{BLACK}Change name of scenario STR_3297 :{SMALLFONT}{BLACK}Change detail notes about park / scenario STR_3298 :{WINDOW_COLOUR_2}Park Name: {BLACK}{STRINGID} STR_3299 :{WINDOW_COLOUR_2}Park/Scenario Details: -STR_3300 :{WINDOW_COLOUR_2}Scenario Name: {BLACK}{STRINGID} -STR_3301 :{WINDOW_COLOUR_2}Objective Date: +STR_3300 :{WINDOW_COLOUR_2}劇情名稱: {BLACK}{STRINGID} +STR_3301 :{WINDOW_COLOUR_2}達成目標的日期: STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR} -STR_3303 :{WINDOW_COLOUR_2}Number of guests: -STR_3304 :{WINDOW_COLOUR_2}Park value: -STR_3305 :{WINDOW_COLOUR_2}Monthly income: -STR_3306 :{WINDOW_COLOUR_2}Monthly profit: -STR_3307 :{WINDOW_COLOUR_2}Minimum length: -STR_3308 :{WINDOW_COLOUR_2}Excitement rating: +STR_3303 :{WINDOW_COLOUR_2}遊客數量: +STR_3304 :{WINDOW_COLOUR_2}樂園評價: +STR_3305 :{WINDOW_COLOUR_2}每月收入: +STR_3306 :{WINDOW_COLOUR_2}每月利潤: +STR_3307 :{WINDOW_COLOUR_2}最少長度: +STR_3308 :{WINDOW_COLOUR_2}興奮度: STR_3309 :{WINDOW_COLOUR_2}{COMMA16} STR_3310 :{WINDOW_COLOUR_2}{LENGTH} STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32} @@ -3347,12 +3347,12 @@ STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout STR_3341 :{SMALLFONT}{BLACK}Game tools STR_3342 :Scenario Editor STR_3343 :Convert Saved Game to Scenario -STR_3344 :Roller Coaster Designer -STR_3345 :Track Designs Manager -STR_3346 :Can't save track design... -STR_3347 :Ride is too large, contains too many elements, or scenery is too spread out -STR_3348 :Rename -STR_3349 :Delete +STR_3344 :雲霄飛車設計工具 +STR_3345 :軌道設計管理工具 +STR_3346 :無法儲存軌道設計... +STR_3347 :遊樂設施太巨型, 含有太多物件, 或景物分佈太散亂 +STR_3348 :重命名 +STR_3349 :刪除 STR_3350 :Track design name STR_3351 :Enter new name for this track design: STR_3352 :Can't rename track design... @@ -3363,7 +3363,7 @@ STR_3356 :Delete File STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ? STR_3358 :Can't delete track design... STR_3359 :{BLACK}No track designs of this type -STR_3360 :Warning! +STR_3360 :警告! STR_3361 :Too many track designs of this type - Some will not be listed. STR_3362 :Forced Software Buffer Mixing STR_3363 :{SMALLFONT}{BLACK}Select this option to improve performance if the game pauses slightly when sounds start or interference is heard @@ -3377,23 +3377,23 @@ STR_3370 :{BLACK}= Info. Kiosk STR_3371 :{BLACK}= First Aid STR_3372 :{BLACK}= Cash Machine STR_3373 :{BLACK}= Toilet -STR_3374 :Warning: Too many objects selected! +STR_3374 :警告: 選取了太多物件! STR_3375 :Not all objects in this scenery group could be selected STR_3376 :Install new track design... STR_3377 :{SMALLFONT}{BLACK}Install a new track design file -STR_3378 :Install -STR_3379 :Cancel +STR_3378 :安裝 +STR_3379 :取消 STR_3380 :Unable to install this track design... STR_3381 :File is not compatible or contains invalid data STR_3382 :File copy failed STR_3383 :Select new name for track design STR_3384 :An existing track design already has this name - Please select a new name for this design: -STR_3385 :Beginners Tutorial -STR_3386 :Custom Rides Tutorial -STR_3387 :Roller Coaster Building Tutorial +STR_3385 :新手入門教學 +STR_3386 :自訂遊樂設施教學 +STR_3387 :雲霄飛車建造教學 STR_3388 :Unable to switch to selected mode STR_3389 :Unable to select additional item of scenery... -STR_3390 :Too many items selected +STR_3390 :選取了太多物件 STR_3391 :{SMALLFONT}{BLACK}這個就是我們的樂園 - 先瞧瞧周邊的環境吧... STR_3392 :{SMALLFONT}{BLACK}最簡單的方法就是按住滑鼠右鍵, 然後拖曳來移動檢視範圍... STR_3393 :{SMALLFONT}{BLACK}如果要觀看更多樂園的部份, 你可以按最上工具列中的縮小檢視圖標來縮小檢視... @@ -3441,61 +3441,61 @@ STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape -STR_3438 :Unable to remove all scenery from here... -STR_3439 :Clear Scenery +STR_3438 :無法移除這裡所有的景物... +STR_3439 :移除景物 STR_3440 :頁1 STR_3441 :頁2 STR_3442 :頁3 STR_3443 :頁4 STR_3444 :頁5 -STR_3445 :Set Patrol Area -STR_3446 :Cancel Patrol Area +STR_3445 :設置巡邏區域 +STR_3446 :取得巡邏區域 # New strings, cleaner STR_5120 :Show finances button on toolbar STR_5121 :Show research button on toolbar -STR_5122 :Select rides by track type (like in RCT1) -STR_5123 :Renew rides -STR_5124 :No Six Flags +STR_5122 :(像RCT1一樣)以軌道類型選擇遊樂設施 +STR_5123 :翻新遊樂設施 +STR_5124 :去除"六旗"標誌 STR_5125 :All destructable -STR_5126 :Random title music +STR_5126 :隨機播放主題曲 STR_5127 :{SMALLFONT}{BLACK}Disable land elevation -STR_5128 :Selection size -STR_5129 :Enter selection size between {COMMA16} and {COMMA16} -STR_5130 :Map size -STR_5131 :Enter map size between {COMMA16} and {COMMA16} -STR_5132 :Fix all rides +STR_5128 :選擇大小 +STR_5129 :請輸入介於{COMMA16}及{COMMA16}的選擇大小 +STR_5130 :地圖大小 +STR_5131 :請輸入介於{COMMA16}及{COMMA16}的地圖大小 +STR_5132 :修理好所有遊樂設施 STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights STR_5136 :Land rights -STR_5137 :Allow lift hill and launch speeds{NEWLINE}up to {VELOCITY} +STR_5137 :允許鏈條及發車速度{NEWLINE}高至{VELOCITY} STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} STR_5139 :{WHITE}{STRINGID} -STR_5140 :Disable brakes failure -STR_5141 :Disable all breakdowns +STR_5140 :去除煞車組件故障 +STR_5141 :去除所有故障機會 STR_5142 :正常速度 STR_5143 :快速速度 STR_5144 :加快速度 STR_5145 :更快速度 STR_5146 :超快速度 -STR_5147 :Show cheats button on toolbar +STR_5147 :在工具列顯示"密技"按鈕 STR_5148 :{SMALLFONT}{BLACK}Change the game speed STR_5149 :{SMALLFONT}{BLACK}Open the cheats window -STR_5150 :Enable debugging tools +STR_5150 :啟用除錯工具 STR_5151 :, STR_5152 :. -STR_5153 :Edit Themes... -STR_5154 :Hardware display -STR_5155 :Allow testing of unfinished tracks +STR_5153 :編輯配色主題... +STR_5154 :使用硬體顯示 +STR_5155 :容許測試未建造好的軌道設計 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 -STR_5158 :Quit to menu +STR_5157 :允許設置進入樂園及乘坐遊樂設施的價格 +STR_5158 :回到主選單 STR_5159 :離開OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} -STR_5161 :Date Format: -STR_5162 :Day/Month/Year -STR_5163 :Month/Day/Year +STR_5160 :{MONTH} {STRINGID}, 第{COMMA16}年 +STR_5161 :日期格式: +STR_5162 :日/月/年 +STR_5163 :月/日/年 STR_5164 :Twitch Channel name STR_5165 :Name peeps after followers STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers @@ -3509,7 +3509,7 @@ STR_5173 :Pull Twitch chat as news STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications STR_5175 :Input the name of your Twitch channel STR_5176 :Enable Twitch integration -STR_5177 :Fullscreen mode: +STR_5177 :全屏幕模式: STR_5178 :{SMALLFONT}{BLACK}Show financial cheats STR_5179 :{SMALLFONT}{BLACK}Show guest cheats STR_5180 :{SMALLFONT}{BLACK}Show park cheats @@ -3535,13 +3535,13 @@ STR_5199 :Ride Construction STR_5200 :Track Design Place STR_5201 :New Ride STR_5202 :Track Design Selection -STR_5203 :Ride -STR_5204 :Ride List -STR_5205 :Guest -STR_5206 :Guest List -STR_5207 :Staff -STR_5208 :Staff List -STR_5209 :Banner +STR_5203 :遊樂設施 +STR_5204 :遊樂設施列表 +STR_5205 :遊客 +STR_5206 :遊客列表 +STR_5207 :員工 +STR_5208 :員工列表 +STR_5209 :橫額 STR_5210 :Object Selection STR_5211 :Invention List STR_5212 :Scenario Options @@ -3549,7 +3549,7 @@ STR_5213 :Objective Options STR_5214 :Map Generation STR_5215 :Track Design Manager STR_5216 :Track Design Manager List -STR_5217 :Cheats +STR_5217 :密技 STR_5218 :Themes STR_5219 :Options STR_5220 :Keyboard Shortcuts @@ -3570,7 +3570,7 @@ STR_5234 :{SMALLFONT}{BLACK}Prompts STR_5235 :{SMALLFONT}{BLACK}Settings STR_5236 :Window: STR_5237 :Palette: -STR_5238 :Current Theme: +STR_5238 :目前主題: STR_5239 :Duplicate STR_5240 :Enter a name for the theme STR_5241 :Can't change this theme @@ -3644,7 +3644,7 @@ STR_5308 :模擬樂園2 STR_5309 :OpenRCT2 STR_5310 :隨機 STR_5311 :{SMALLFONT}{BLACK}Debug tools -STR_5312 :Show console +STR_5312 :顯示命名行 STR_5313 :Show tile inspector STR_5314 :Tile inspector STR_5315 :Grass @@ -3667,9 +3667,9 @@ STR_5331 :Rock STR_5332 :Wood (red) STR_5333 :Wood (black) STR_5334 :Ice -STR_5335 :Ride entrance -STR_5336 :Ride exit -STR_5337 :Park entrance +STR_5335 :遊樂設施入口 +STR_5336 :遊樂設施出口 +STR_5337 :樂園入口 STR_5338 :Element type STR_5339 :Base height STR_5340 :Clearance height @@ -3792,7 +3792,7 @@ STR_5456 :去除阻礙檢查 STR_5457 :去除支撐限制 STR_5458 :順時計旋轉 STR_5459 :逆時計旋轉 -STR_5460 :Rotate view anti-clockwise +STR_5460 :逆時針旋轉檢視範圍 STR_5461 :Set guests' parameters STR_5462 :{CURRENCY} STR_5463 :目標: 盡情玩吧! From 09ea7a1c93f7258d113f97fbc9140ee032c9b8f5 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Tue, 14 Jul 2015 22:08:22 +0100 Subject: [PATCH 0318/1173] Started implementing sub_68F41A --- src/peep/peep.c | 138 ++++++++++++++++++++++++++++++++++++++++++++++-- src/peep/peep.h | 11 ++-- 2 files changed, 142 insertions(+), 7 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 31877ee159..54fd927b64 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -129,12 +129,144 @@ void peep_update_all() } } +/* rct2: 0x0069BC9A */ +static uint8 sub_69BC9A(sint16 x, sint16 y, sint16 z){ + int eax = x, ebx = 0, ecx = y, edx = z, esi, edi, ebp; + RCT2_CALLFUNC_X(0x0069BC9A, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + return ebx & 0xFF; +} + /** * * rct2: 0x0068F41A */ static void sub_68F41A(rct_peep *peep, int index) { + if (peep->type == PEEP_TYPE_STAFF){ + if (peep->staff_type != STAFF_TYPE_SECURITY) + return; + + uint8 sprite_type = 23; + if (peep->state != PEEP_STATE_PATROLLING) + sprite_type = 3; + + if (peep->sprite_type == sprite_type) + return; + + peep->sprite_type = sprite_type; + peep->action_sprite_image_offset = 0; + peep->no_action_frame_no = 0; + if (peep->action < PEEP_ACTION_NONE_1) + peep->action = PEEP_ACTION_NONE_2; + + peep->flags &= ~PEEP_FLAGS_SLOW_WALK; + if (RCT2_ADDRESS(0x00982134, uint8)[sprite_type] & 1){ + peep->flags |= PEEP_FLAGS_SLOW_WALK; + } + + peep->action_sprite_type = 0xFF; + sub_693B58(peep); + return; + } + + if ((index & 0x1FF) == (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x1FF)){ + RCT2_GLOBAL(0x00F1EDFE, uint32) = index; + + if (peep->flags & PEEP_FLAGS_CROWDED){ + uint8 thought_type = RCT2_ADDRESS(0x009823AC, uint8)[scenario_rand() & 0xF]; + if (thought_type != PEEP_THOUGHT_TYPE_NONE){ + peep_insert_new_thought(peep, thought_type, 0xFF); + } + } + + if (peep->flags & PEEP_FLAGS_EXPLODE && peep->x != (sint16)0x8000){ + sound_play_panned(SOUND_CRASH, 0x8001, peep->x, peep->y, peep->z); + + RCT2_CALLPROC_X(0x0067363D, peep->x, 0, peep->y, peep->z + 16, (int)peep, 0, 0); + RCT2_CALLPROC_X(0x0067366B, peep->x, 0, peep->y, peep->z + 16, (int)peep, 0, 0); + + peep_remove(peep); + return; + } + + if (peep->flags & PEEP_FLAGS_HUNGER){ + if (peep->hunger >= 15)peep->hunger -= 15; + } + + if (peep->flags & PEEP_FLAGS_BATHROOM){ + if (peep->bathroom <= 180)peep->bathroom += 50; + } + + if (peep->flags & PEEP_FLAGS_HAPPINESS){ + peep->happiness_growth_rate = 5; + } + + if (peep->flags & PEEP_FLAGS_NAUSEA){ + peep->nausea_growth_rate = 200; + if (peep->nausea <= 130)peep->nausea = 130; + } + + if (peep->var_F3 != 0) + peep->var_F3--; + + if (peep->state == PEEP_STATE_WALKING || peep->state == PEEP_STATE_SITTING){ + peep->var_F2++; + if (peep->var_F2 >= 18){ + peep->var_F2 = 0; + if (peep->x != (sint16)0x8000){ + + uint8 bl = sub_69BC9A(peep->x & 0xFFE0, peep->y & 0xFFE0, peep->z); + + if (bl != 0){ + peep->happiness_growth_rate = min(255, peep->happiness_growth_rate + 45); + + switch (bl){ + case 1: + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SCENERY, 0xFF); + break; + case 2: + peep_insert_new_thought(peep, PEEP_THOUGHT_VERY_CLEAN, 0xFF); + break; + case 3: + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_FOUNTAINS, 0xFF); + break; + default: + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_MUSIC, 0xFF); + break; + } + } + } + } + } + + peep_update_sprite_type(peep); + + if (peep->state == PEEP_STATE_ON_RIDE || peep->state == PEEP_STATE_ENTERING_RIDE){ + peep->time_on_ride = min(255, peep->time_on_ride + 1); + + if (peep->flags & PEEP_FLAGS_WOW){ + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_WOW2, 0xFF); + } + + if (peep->time_on_ride > 15){ + peep->happiness_growth_rate = min(0, peep->happiness_growth_rate - 5); + + if (peep->time_on_ride > 22){ + rct_ride* ride = GET_RIDE(peep->current_ride); + + uint8 thought_type = ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IN_RIDE) ? + PEEP_THOUGHT_TYPE_GET_OUT : + PEEP_THOUGHT_TYPE_GET_OFF; + + peep_insert_new_thought(peep, thought_type, peep->current_ride); + } + } + } + + //68F64D + } + // 68FA89 + RCT2_CALLPROC_X(0x0068F41A, 0, 0, 0, index, (int)peep, 0, 0); } @@ -969,7 +1101,7 @@ static void peep_go_to_ride_entrance(rct_peep* peep, rct_ride* ride){ peep_window_state_update(peep); peep->var_AC = 0; - peep->var_E2 = 0; + peep->time_on_ride = 0; remove_peep_from_queue(peep); } @@ -1587,7 +1719,7 @@ static void peep_update_ride_sub_state_5(rct_peep* peep){ peep_decrement_num_riders(seated_peep); seated_peep->state = PEEP_STATE_ON_RIDE; peep_window_state_update(seated_peep); - seated_peep->var_E2 = 0; + seated_peep->time_on_ride = 0; seated_peep->sub_state = 6; sub_695444(seated_peep, peep->current_ride, 0); } @@ -1605,7 +1737,7 @@ static void peep_update_ride_sub_state_5(rct_peep* peep){ peep->state = PEEP_STATE_ON_RIDE; peep_window_state_update(peep); - peep->var_E2 = 0; + peep->time_on_ride = 0; peep->sub_state = 6; sub_695444(peep, peep->current_ride, 0); diff --git a/src/peep/peep.h b/src/peep/peep.h index e623d518b6..f68d013a05 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -252,14 +252,14 @@ enum PEEP_FLAGS { PEEP_FLAGS_WAVING = (1 << 4), // Makes the peep wave PEEP_FLAGS_PHOTO = (1 << 6), // Makes the peep take a picture - PEEP_FLAGS_PAINTING = (1 << 7), - + PEEP_FLAGS_PAINTING = (1 << 7), + PEEP_FLAGS_WOW = (1 << 8), // Makes a peep WOW2 PEEP_FLAGS_LITTER = (1 << 9), // Makes the peep throw litter PEEP_FLAGS_LOST = (1 << 10), // Makes the peep feel lost (animation trigerred) PEEP_FLAGS_HUNGER = (1 << 11), // Makes the peep become hungry quicker PEEP_FLAGS_BATHROOM = (1 << 12), // Makes the peep want to go to the bathroom PEEP_FLAGS_CROWDED = (1 << 13), // The peep will start feeling crowded - + PEEP_FLAGS_HAPPINESS = (1 << 14), // The peep will start increasing happiness PEEP_FLAGS_NAUSEA = (1 << 15), // Makes the peep feel sick (e.g. after an extreme ride) PEEP_FLAGS_EATING = (1 << 17), // Reduces hunger @@ -469,7 +469,10 @@ typedef struct { uint8 pad_D0[0x10]; uint8 no_action_frame_no; // 0xE0 uint8 var_E1; - uint8 var_E2; // 0xE2 + union{ + uint8 time_on_ride; // 0xE2 + uint8 var_E2; // 0xE2 + }; uint8 var_E3; union{ money16 paid_to_enter; // 0xE4 From 067fbb59a4a23fdd0c752d99460fbd23d738edf5 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 16 Jul 2015 23:04:01 +0100 Subject: [PATCH 0319/1173] implement sprite_misc_3_create and sprite_misc_5_create --- src/peep/peep.c | 103 +++++++++++++++++++++++++++++++++++++++++++-- src/world/sprite.c | 36 ++++++++++++++++ src/world/sprite.h | 6 ++- 3 files changed, 140 insertions(+), 5 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 54fd927b64..5705cc5352 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -170,7 +170,7 @@ static void sub_68F41A(rct_peep *peep, int index) } if ((index & 0x1FF) == (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x1FF)){ - RCT2_GLOBAL(0x00F1EDFE, uint32) = index; + //RCT2_GLOBAL(0x00F1EDFE, uint32) = index; not needed all cases accounted for if (peep->flags & PEEP_FLAGS_CROWDED){ uint8 thought_type = RCT2_ADDRESS(0x009823AC, uint8)[scenario_rand() & 0xF]; @@ -182,8 +182,8 @@ static void sub_68F41A(rct_peep *peep, int index) if (peep->flags & PEEP_FLAGS_EXPLODE && peep->x != (sint16)0x8000){ sound_play_panned(SOUND_CRASH, 0x8001, peep->x, peep->y, peep->z); - RCT2_CALLPROC_X(0x0067363D, peep->x, 0, peep->y, peep->z + 16, (int)peep, 0, 0); - RCT2_CALLPROC_X(0x0067366B, peep->x, 0, peep->y, peep->z + 16, (int)peep, 0, 0); + sprite_misc_3_create(peep->x, peep->y, peep->z + 16); + sprite_misc_5_create(peep->x, peep->y, peep->z + 16); peep_remove(peep); return; @@ -262,8 +262,103 @@ static void sub_68F41A(rct_peep *peep, int index) } } } + + if (peep->state == PEEP_STATE_WALKING && + peep->var_2A == 0 && + !(peep->flags & PEEP_FLAGS_LEAVING_PARK) && + peep->no_of_rides == 0 && + peep->guest_heading_to_ride_id == 0xFF){ - //68F64D + uint32 time_duration = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) - peep->time_in_park; + time_duration /= 2048; + + if (time_duration >= 5){ + RCT2_CALLPROC_X(0x00695DD2, 0, 0, 0, 0, (int)peep, 0, 0); + + if (peep->guest_heading_to_ride_id == 0xFF){ + peep->happiness_growth_rate = max(peep->happiness_growth_rate - 128, 0); + //goto 0x0068F93E + } + } + } + + if ((scenario_rand() & 0xFFFF) <= (peep->item_standard_flags & PEEP_ITEM_MAP ? 8192 : 2184)){ + RCT2_CALLPROC_X(0x00695DD2, 0, 0, 0, 0, (int)peep, 0, 0); + } + + if ((index & 0x3FF) == (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x3FF)){ + + if (peep->var_2A == 0 && + (peep->state == PEEP_STATE_WALKING || peep->state == PEEP_STATE_SITTING)){ + + uint8 num_thoughts = 0; + uint8 possible_thoughts[5] = { 0 }; + + if (peep->flags & PEEP_FLAGS_LEAVING_PARK){ + possible_thoughts[num_thoughts++] = PEEP_THOUGHT_TYPE_GO_HOME; + } + else{ + if (peep->energy <= 70 && + peep->happiness < 128){ + possible_thoughts[num_thoughts++] = PEEP_THOUGHT_TYPE_TIRED; + } + + if (peep->hunger <= 10 && + !peep_has_food(peep)){ + possible_thoughts[num_thoughts++] = PEEP_THOUGHT_TYPE_HUNGRY; + } + + if (peep->thirst <= 25 && + !peep_has_food(peep)){ + possible_thoughts[num_thoughts++] = PEEP_THOUGHT_TYPE_THIRSTY; + } + + if (peep->bathroom >= 160){ + possible_thoughts[num_thoughts++] = PEEP_THOUGHT_TYPE_BATHROOM; + } + + // Not sure why the happiness check is like that seems wrong to me + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) && + peep->cash_in_pocket <= MONEY(9,00) && + peep->happiness >= 105 && + peep->happiness >= 70){ + possible_thoughts[num_thoughts++] = PEEP_THOUGHT_RUNNING_OUT; + } + } + + if (num_thoughts != 0){ + uint8 chosen_thought = possible_thoughts[scenario_rand() % num_thoughts]; + + peep_insert_new_thought(peep, chosen_thought, 0xFF); + + switch (chosen_thought){ + case PEEP_THOUGHT_TYPE_HUNGRY: + RCT2_CALLPROC_X(0x006958D0, 0x00800000, 0, 0, 0, (int)peep, 0, 0); + break; + case PEEP_THOUGHT_TYPE_THIRSTY: + RCT2_CALLPROC_X(0x006958D0, 0x01000000, 0, 0, 0, (int)peep, 0, 0); + break; + case PEEP_THOUGHT_TYPE_BATHROOM: + RCT2_CALLPROC_X(0x006958D0, 0x0200000, 0, 0, 0, (int)peep, 0, 0); + break; + case PEEP_THOUGHT_RUNNING_OUT: + RCT2_CALLPROC_X(0x00695B70, RIDE_TYPE_CASH_MACHINE, 0, 0, 0, (int)peep, 0, 0); + break; + } + } + } + } + else{ + if (peep->nausea >= 140){ + uint8 thought = PEEP_THOUGHT_TYPE_SICK; + if (peep->nausea >= 200){ + thought = PEEP_THOUGHT_TYPE_VERY_SICK; + RCT2_CALLPROC_X(0x00695B70, RIDE_TYPE_FIRST_AID, 0, 0, 0, (int)peep, 0, 0); + } + peep_insert_new_thought(peep, thought, 0xFF); + } + } + //68F807 } // 68FA89 diff --git a/src/world/sprite.c b/src/world/sprite.c index 501020d1ff..2a362decde 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -1038,3 +1038,39 @@ void sub_6738E1(int x, int y, int z) { RCT2_CALLPROC_X(0x006738E1, x, 0, y, z, 0, 0, 0); } + +/** + * + * rct2: 0x0067363D + */ +void sprite_misc_3_create(int x, int y, int z) +{ + rct_unk_sprite *sprite = (rct_unk_sprite*)create_sprite(2); + if (sprite != NULL) { + sprite->sprite_width = 44; + sprite->sprite_height_negative = 32; + sprite->sprite_height_positive = 34; + sprite->sprite_identifier = SPRITE_IDENTIFIER_MISC; + sprite_move(x, y, z + 4, (rct_sprite*)sprite); + sprite->misc_identifier = SPRITE_MISC_3; + sprite->var_26 = 0; + } +} + +/** + * + * rct2: 0x0067366B + */ +void sprite_misc_5_create(int x, int y, int z) +{ + rct_unk_sprite *sprite = (rct_unk_sprite*)create_sprite(2); + if (sprite != NULL) { + sprite->sprite_width = 25; + sprite->sprite_height_negative = 85; + sprite->sprite_height_positive = 8; + sprite->sprite_identifier = SPRITE_IDENTIFIER_MISC; + sprite_move(x, y, z + 4, (rct_sprite*)sprite); + sprite->misc_identifier = SPRITE_MISC_5; + sprite->var_26 = 0; + } +} diff --git a/src/world/sprite.h b/src/world/sprite.h index 597bf049d4..11b0b45522 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -71,7 +71,9 @@ typedef struct { uint8 sprite_direction; //direction of sprite? 0x1e uint8 pad_1F[3]; // 0x1f uint16 name_string_idx; // 0x22 - uint8 pad_24[7]; + uint8 pad_24[2]; + uint16 var_26; + uint8 var_28[3]; uint8 var_2B; uint8 pad_2C[0x45]; uint8 var_71; @@ -260,5 +262,7 @@ void sprite_remove(rct_sprite *sprite); void litter_create(int x, int y, int z, int direction, int type); void sub_6EC53F(rct_sprite *sprite); void sub_6738E1(int x, int y, int z); +void sprite_misc_3_create(int x, int y, int z); +void sprite_misc_5_create(int x, int y, int z); #endif From 37f49646dd385f4257734f181f987c154a38704c Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 18 Jul 2015 13:19:46 +0100 Subject: [PATCH 0320/1173] implement peep_pick_ride_to_go_on --- src/peep/peep.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++-- src/peep/peep.h | 1 + src/ride/ride.h | 2 +- 3 files changed, 133 insertions(+), 4 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 5705cc5352..c6ff1960fe 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -55,6 +55,7 @@ static void sub_69A98C(rct_peep *peep); static void sub_68FD3A(rct_peep *peep); static bool sub_690B99(rct_peep *peep, int edge, uint8 *rideToView, uint8 *rideSeatToView); static int sub_694921(rct_peep *peep, int x, int y); +static void peep_pick_ride_to_go_on(rct_peep *peep); static void peep_give_real_name(rct_peep *peep); const char *gPeepEasterEggNames[] = { @@ -273,7 +274,7 @@ static void sub_68F41A(rct_peep *peep, int index) time_duration /= 2048; if (time_duration >= 5){ - RCT2_CALLPROC_X(0x00695DD2, 0, 0, 0, 0, (int)peep, 0, 0); + peep_pick_ride_to_go_on(peep); if (peep->guest_heading_to_ride_id == 0xFF){ peep->happiness_growth_rate = max(peep->happiness_growth_rate - 128, 0); @@ -282,8 +283,8 @@ static void sub_68F41A(rct_peep *peep, int index) } } - if ((scenario_rand() & 0xFFFF) <= (peep->item_standard_flags & PEEP_ITEM_MAP ? 8192 : 2184)){ - RCT2_CALLPROC_X(0x00695DD2, 0, 0, 0, 0, (int)peep, 0, 0); + if ((scenario_rand() & 0xFFFF) <= (peep->item_standard_flags & PEEP_ITEM_MAP ? 8192U : 2184U)){ + peep_pick_ride_to_go_on(peep); } if ((index & 0x3FF) == (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x3FF)){ @@ -5647,6 +5648,133 @@ static int sub_694921(rct_peep *peep, int x, int y) return edx & 0xFFFF; } +/** + * + * rct2: 0x006960AB + */ +static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) +{ + return RCT2_CALLPROC_X(0x006960AB, 0, 0, 0, rideIndex | (dh << 8), (int)peep, 0, bp) & 0x100; +} + +/** + * + * rct2: 0x00695DD2 + */ +static void peep_pick_ride_to_go_on(rct_peep *peep) +{ + rct_ride *ride; + + if (peep->state == PEEP_STATE_WALKING) return; + if (peep->guest_heading_to_ride_id != 255) return; + if (peep->flags & PEEP_FLAGS_LEAVING_PARK) return; + if (peep_has_food(peep)) return; + if (peep->x == (sint16)0x8000) return; + + RCT2_GLOBAL(0x00F1AD98, uint32) = 0; + RCT2_GLOBAL(0x00F1AD9C, uint32) = 0; + RCT2_GLOBAL(0x00F1ADA0, uint32) = 0; + RCT2_GLOBAL(0x00F1ADA4, uint32) = 0; + RCT2_GLOBAL(0x00F1ADA8, uint32) = 0; + RCT2_GLOBAL(0x00F1ADAC, uint32) = 0; + RCT2_GLOBAL(0x00F1ADB0, uint32) = 0; + RCT2_GLOBAL(0x00F1ADB4, uint32) = 0; + + // TODO Check for a toy is likely a mistake and should be a map, + // but then again this seems to only allow the peep to go on + // rides they haven't been on before. + if (peep->item_standard_flags & PEEP_ITEM_TOY) { + // Consider rides that peep hasn't been on yet + int i; + FOR_ALL_RIDES(i, ride) { + if (!(peep->rides_been_on[i >> 5] & (i & 0x1F))) { + RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= i & 0x1F; + } + } + } else { + // Take nearby rides into consideration + int cx = floor2(peep->x, 32); + int cy = floor2(peep->y, 32); + for (int x = cx - 320; x <= cx + 320; x++) { + for (int y = cy - 320; y <= cy + 320; y++) { + if (x >= 0 && y >= 0 && x < (256 * 32) && y < (256 * 32)) { + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; + + int rideIndex = mapElement->properties.track.ride_index; + RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (rideIndex & 0x1F); + } while (!map_element_is_last_for_tile(mapElement++)); + } + } + } + + // Always take the big rides into consideration (realistic as you can usually see them from anywhere in the park) + int i; + FOR_ALL_RIDES(i, ride) { + if (ride->lifecycle_flags == RIDE_LIFECYCLE_TESTED) continue; + if (ride->excitement == (ride_rating)0xFFFF) continue; + if (ride->highest_drop_height <= 66 && ride->excitement < RIDE_RATING(8,00)) continue; + + RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= i & 0x1F; + } + } + + // Filter the considered rides + uint8 *potentialRides = (uint8*)0x00F1ADBC; + uint8 *nextPotentialRide = potentialRides; + int numPotentialRides = 0; + for (int i = 0; i < MAX_RIDES; i++) { + if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (i & 0x1F))) + continue; + + rct_ride *ride = GET_RIDE(i); + if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_9)) { + if (sub_6960AB(peep, i, 0, 6)) { + *nextPotentialRide++ = i; + numPotentialRides++; + } + } + } + + // Pick the most exciting ride + int mostExcitingRideIndex = -1; + ride_rating mostExcitingRideRating = 0; + for (int i = 0; i < numPotentialRides; i++) { + ride = GET_RIDE(potentialRides[i]); + if (ride->excitement == (ride_rating)0xFFFF) continue; + if (ride->excitement > mostExcitingRideRating) { + mostExcitingRideIndex = potentialRides[i]; + mostExcitingRideRating = ride->excitement; + } + } + if (mostExcitingRideIndex == -1) + return; + + // Head to that ride + peep->guest_heading_to_ride_id = mostExcitingRideIndex; + peep->var_C6 = 200; + sub_69A98C(peep); + + // Invalidate windows + rct_window *w = window_find_by_number(WC_PEEP, peep->sprite_index); + if (w != NULL) { + window_event_invalidate_call(w); + } + widget_invalidate_by_number(WC_RIDE, mostExcitingRideIndex, 23); + + // Make peep look at their map if they have one + if (peep->item_standard_flags & PEEP_ITEM_MAP) { + if (peep->action == PEEP_ACTION_NONE_1 || peep->action == PEEP_ACTION_NONE_2) { + peep->action = PEEP_ACTION_READ_MAP; + peep->action_frame = 0; + peep->action_sprite_image_offset = 0; + sub_693B58(peep); + invalidate_sprite((rct_sprite*)peep); + } + } +} + /** * * rct2: 0x0069C483 diff --git a/src/peep/peep.h b/src/peep/peep.h index f68d013a05..98655b35b8 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -230,6 +230,7 @@ enum PEEP_ACTION_EVENTS { PEEP_ACTION_STAFF_FIX_2 = 16, PEEP_ACTION_STAFF_FIX_GROUND = 17, PEEP_ACTION_STAFF_WATERING = 19, + PEEP_ACTION_READ_MAP = 21, PEEP_ACTION_WAVE = 22, PEEP_ACTION_STAFF_EMPTY_BIN = 23, PEEP_ACTION_WAVE_2 = 24, diff --git a/src/ride/ride.h b/src/ride/ride.h index 171d5922d3..99ab93d5e5 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -383,7 +383,7 @@ enum { RIDE_LIFECYCLE_BREAKDOWN_PENDING = 1 << 6, RIDE_LIFECYCLE_BROKEN_DOWN = 1 << 7, RIDE_LIFECYCLE_DUE_INSPECTION = 1 << 8, - + RIDE_LIFECYCLE_9 = 1 << 9, RIDE_LIFECYCLE_CRASHED = 1 << 10, RIDE_LIFECYCLE_11 = 1 << 11, RIDE_LIFECYCLE_EVER_BEEN_OPENED = 1 << 12, From a86d1cd07d20c1924fe3a2161f8c94e9174d7ee6 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 18 Jul 2015 14:01:40 +0100 Subject: [PATCH 0321/1173] implement peep_head_for_nearest_ride_type --- src/peep/peep.c | 202 ++++++++++++++++++++++++++++++++++++++++++++++-- src/peep/peep.h | 4 +- 2 files changed, 199 insertions(+), 7 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index c6ff1960fe..158022d485 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -56,6 +56,7 @@ static void sub_68FD3A(rct_peep *peep); static bool sub_690B99(rct_peep *peep, int edge, uint8 *rideToView, uint8 *rideSeatToView); static int sub_694921(rct_peep *peep, int x, int y); static void peep_pick_ride_to_go_on(rct_peep *peep); +static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType); static void peep_give_real_name(rct_peep *peep); const char *gPeepEasterEggNames[] = { @@ -137,6 +138,28 @@ static uint8 sub_69BC9A(sint16 x, sint16 y, sint16 z){ return ebx & 0xFF; } +/* rct2: 0x0068F93E */ +static void peep_leave_park(rct_peep* peep){ + peep->guest_heading_to_ride_id = 0xFF; + if (peep->flags & PEEP_FLAGS_LEAVING_PARK){ + if (peep->var_C6 < 60){ + return; + } + } + else{ + peep->var_C6 = 254; + peep->flags |= PEEP_FLAGS_LEAVING_PARK; + peep->flags &= ~PEEP_FLAGS_20; + } + + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_GO_HOME, 0xFF); + + rct_window* w = window_find_by_number(WC_PEEP, peep->sprite_index); + window_event_invalidate_call(w); + window_invalidate_by_number(WC_PEEP, peep->sprite_index); + // At end of this go to 68f9a9 +} + /** * * rct2: 0x0068F41A @@ -278,7 +301,8 @@ static void sub_68F41A(rct_peep *peep, int index) if (peep->guest_heading_to_ride_id == 0xFF){ peep->happiness_growth_rate = max(peep->happiness_growth_rate - 128, 0); - //goto 0x0068F93E + peep_leave_park(peep); + //goto 69f9a9 } } } @@ -289,7 +313,7 @@ static void sub_68F41A(rct_peep *peep, int index) if ((index & 0x3FF) == (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x3FF)){ - if (peep->var_2A == 0 && + if (peep->var_2A == 0 && (peep->state == PEEP_STATE_WALKING || peep->state == PEEP_STATE_SITTING)){ uint8 num_thoughts = 0; @@ -320,7 +344,7 @@ static void sub_68F41A(rct_peep *peep, int index) // Not sure why the happiness check is like that seems wrong to me if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) && - peep->cash_in_pocket <= MONEY(9,00) && + peep->cash_in_pocket <= MONEY(9, 00) && peep->happiness >= 105 && peep->happiness >= 70){ possible_thoughts[num_thoughts++] = PEEP_THOUGHT_RUNNING_OUT; @@ -343,7 +367,7 @@ static void sub_68F41A(rct_peep *peep, int index) RCT2_CALLPROC_X(0x006958D0, 0x0200000, 0, 0, 0, (int)peep, 0, 0); break; case PEEP_THOUGHT_RUNNING_OUT: - RCT2_CALLPROC_X(0x00695B70, RIDE_TYPE_CASH_MACHINE, 0, 0, 0, (int)peep, 0, 0); + peep_head_for_nearest_ride_type(peep, RIDE_TYPE_CASH_MACHINE); break; } } @@ -354,11 +378,71 @@ static void sub_68F41A(rct_peep *peep, int index) uint8 thought = PEEP_THOUGHT_TYPE_SICK; if (peep->nausea >= 200){ thought = PEEP_THOUGHT_TYPE_VERY_SICK; - RCT2_CALLPROC_X(0x00695B70, RIDE_TYPE_FIRST_AID, 0, 0, 0, (int)peep, 0, 0); + peep_head_for_nearest_ride_type(peep, RIDE_TYPE_FIRST_AID); } peep_insert_new_thought(peep, thought, 0xFF); } } + + if (peep->state == PEEP_STATE_WALKING || + peep->state == PEEP_STATE_LEAVING_PARK || + peep->state == PEEP_STATE_ENTERING_PARK){ + //68f8CD + + if (peep->energy_growth_rate >= 33) + peep->energy_growth_rate -= 2; + + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TEMPERATURE, uint8) >= 15){ + if (peep->thirst >= 5) + peep->thirst--; + } + + if (peep->var_2A == 0){ + if (!(peep->flags & PEEP_FLAGS_LEAVING_PARK)){ + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)){ + if (peep->energy < 55 || + peep->happiness < 45 || + peep->cash_in_pocket < MONEY(5, 00)){ + + if ((scenario_rand() & 0xFFFF) <= 3276){ + peep_leave_park(peep); + } + } + } + else{ + if (peep->energy < 70 || + peep->happiness < 60){ + + if ((scenario_rand() & 0xFFFF) <= 3276){ + peep_leave_park(peep); + } + } + } + } + else{ + peep_leave_park(peep); + } + } + }//68f9a9 + + if (peep->state == PEEP_STATE_SITTING){ + //68f9c9 + } + + if (peep->state == PEEP_STATE_QUEUING){ + //68f84c + }//68f9a9 + + if (peep->state == PEEP_STATE_ENTERING_RIDE){ + if (peep->sub_state == 17 || + peep->sub_state == 15){ + //68f8cd + }//69f9a9 + } + + if (/*not the above*/1){ + //68f9f3 + } //68F807 } // 68FA89 @@ -5775,6 +5859,114 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) } } +/** + * + * rct2: 0x00695B70 + */ +static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) +{ + rct_ride *ride; + + if (peep->state != PEEP_STATE_SITTING && peep->state != PEEP_STATE_WATCHING && peep->state != PEEP_STATE_WALKING) { + return; + } + if (peep->flags & PEEP_FLAGS_LEAVING_PARK) return; + if (peep->x == (sint16)0x8000) return; + if (peep->guest_heading_to_ride_id != 255) { + ride = GET_RIDE(peep->guest_heading_to_ride_id); + if (ride->type == rideType) { + return; + } + } + + RCT2_GLOBAL(0x00F1AD98, uint32) = 0; + RCT2_GLOBAL(0x00F1AD9C, uint32) = 0; + RCT2_GLOBAL(0x00F1ADA0, uint32) = 0; + RCT2_GLOBAL(0x00F1ADA4, uint32) = 0; + RCT2_GLOBAL(0x00F1ADA8, uint32) = 0; + RCT2_GLOBAL(0x00F1ADAC, uint32) = 0; + RCT2_GLOBAL(0x00F1ADB0, uint32) = 0; + RCT2_GLOBAL(0x00F1ADB4, uint32) = 0; + + // TODO Check for a toy is likely a mistake and should be a map + if ((peep->item_standard_flags & PEEP_ITEM_TOY) && rideType != RIDE_TYPE_FIRST_AID) { + // Consider all rides in the park + int i; + FOR_ALL_RIDES(i, ride) { + if (ride->type == rideType) { + RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= i & 0x1F; + } + } + } else { + // Take nearby rides into consideration + int cx = floor2(peep->x, 32); + int cy = floor2(peep->y, 32); + for (int x = cx - 320; x <= cx + 320; x++) { + for (int y = cy - 320; y <= cy + 320; y++) { + if (x >= 0 && y >= 0 && x < (256 * 32) && y < (256 * 32)) { + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; + + int rideIndex = mapElement->properties.track.ride_index; + ride = GET_RIDE(rideIndex); + if (ride->type == rideType) { + RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (rideIndex & 0x1F); + } + } while (!map_element_is_last_for_tile(mapElement++)); + } + } + } + } + + // Filter the considered rides + uint8 *potentialRides = (uint8*)0x00F1ADBC; + uint8 *nextPotentialRide = potentialRides; + int numPotentialRides = 0; + for (int i = 0; i < MAX_RIDES; i++) { + if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (i & 0x1F))) + continue; + + rct_ride *ride = GET_RIDE(i); + if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_9)) { + if (sub_6960AB(peep, i, 0, 6)) { + *nextPotentialRide++ = i; + numPotentialRides++; + } + } + } + + // Pick the closest ride + int closestRideIndex = -1; + int closestRideDistance = INT_MAX; + for (int i = 0; i < numPotentialRides; i++) { + ride = GET_RIDE(potentialRides[i]); + int rideX = (ride->station_starts[0] & 0xFF) * 32; + int rideY = (ride->station_starts[0] >> 8) * 32; + int distance = abs(rideX - peep->x) + abs(rideY - peep->y); + if (distance < closestRideDistance) { + closestRideIndex = potentialRides[i]; + closestRideDistance = distance; + } + } + if (closestRideIndex == -1) + return; + + // Head to that ride + peep->guest_heading_to_ride_id = closestRideIndex; + peep->var_C6 = 200; + sub_69A98C(peep); + + // Invalidate windows + rct_window *w = window_find_by_number(WC_PEEP, peep->sprite_index); + if (w != NULL) { + window_event_invalidate_call(w); + } + widget_invalidate_by_number(WC_RIDE, closestRideIndex, 23); + + peep->var_F4 = 0; +} + /** * * rct2: 0x0069C483 diff --git a/src/peep/peep.h b/src/peep/peep.h index 98655b35b8..b4e47dd04d 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -265,8 +265,8 @@ enum PEEP_FLAGS { PEEP_FLAGS_EATING = (1 << 17), // Reduces hunger PEEP_FLAGS_EXPLODE = (1 << 18), - - PEEP_FLAGS_21 = (1<<21), + PEEP_FLAGS_20 = (1 << 20), + PEEP_FLAGS_21 = (1 << 21), PEEP_FLAGS_JOY = (1 << 23), // Makes the peep jump in joy PEEP_FLAGS_ANGRY = (1 << 24), From a64a8c602126f92ec22df62f62b8d7c2a96a672a Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 18 Jul 2015 14:25:46 +0100 Subject: [PATCH 0322/1173] implement peep_head_for_nearest_ride_with_flags --- src/peep/peep.c | 733 +++++++++++++++++++++++++++++++++++++++----- src/peep/peep.h | 16 +- src/peep/staff.c | 2 +- src/ride/ride.c | 10 +- src/ride/ride.h | 3 + src/windows/guest.c | 10 +- src/windows/staff.c | 4 +- src/world/park.h | 1 + 8 files changed, 695 insertions(+), 84 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 158022d485..fdd542a246 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "../addresses.h" +#include "../util/util.h" #include "../audio/audio.h" #include "../audio/mixer.h" #include "../interface/window.h" @@ -39,6 +40,7 @@ static void sub_68F41A(rct_peep *peep, int index); static void peep_update(rct_peep *peep); static int peep_has_empty_container(rct_peep* peep); +static int peep_has_drink(rct_peep* peep); static int peep_has_food_standard_flag(rct_peep* peep); static int peep_has_food_extra_flag(rct_peep* peep); static int peep_empty_container_standard_flag(rct_peep* peep); @@ -57,6 +59,7 @@ static bool sub_690B99(rct_peep *peep, int edge, uint8 *rideToView, uint8 *rideS static int sub_694921(rct_peep *peep, int x, int y); static void peep_pick_ride_to_go_on(rct_peep *peep); static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType); +static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFlags); static void peep_give_real_name(rct_peep *peep); const char *gPeepEasterEggNames[] = { @@ -138,6 +141,15 @@ static uint8 sub_69BC9A(sint16 x, sint16 y, sint16 z){ return ebx & 0xFF; } +/* rct2: 0x0068F9A9*/ +static void peep_update_hunger(rct_peep *peep){ + if (peep->hunger >= 3){ + peep->hunger -= 2; + peep->energy_growth_rate = min(peep->energy_growth_rate + 2, 255); + peep->bathroom = min(peep->bathroom + 1, 255); + } +} + /* rct2: 0x0068F93E */ static void peep_leave_park(rct_peep* peep){ peep->guest_heading_to_ride_id = 0xFF; @@ -155,9 +167,45 @@ static void peep_leave_park(rct_peep* peep){ peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_GO_HOME, 0xFF); rct_window* w = window_find_by_number(WC_PEEP, peep->sprite_index); - window_event_invalidate_call(w); + if (w != NULL) window_event_invalidate_call(w); window_invalidate_by_number(WC_PEEP, peep->sprite_index); - // At end of this go to 68f9a9 +} + +/* rct2: 0x0068f8CD*/ +static void sub_68F8CD(rct_peep *peep){ + if (peep->energy_growth_rate >= 33) + peep->energy_growth_rate -= 2; + + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TEMPERATURE, uint8) >= 21){ + if (peep->thirst >= 5) + peep->thirst--; + } + + if (peep->var_2A != 0) + return; + + if (!(peep->flags & PEEP_FLAGS_LEAVING_PARK)){ + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)){ + if (peep->energy >= 55) + return; + + if (peep->happiness >= 45) + return; + + if (peep->cash_in_pocket >= MONEY(5, 00)) + return; + } + else{ + if (peep->energy >= 70) + return; + + if (peep->happiness >= 60) + return; + } + if ((scenario_rand() & 0xFFFF) > 3276) + return; + } + peep_leave_park(peep); } /** @@ -302,7 +350,8 @@ static void sub_68F41A(rct_peep *peep, int index) if (peep->guest_heading_to_ride_id == 0xFF){ peep->happiness_growth_rate = max(peep->happiness_growth_rate - 128, 0); peep_leave_park(peep); - //goto 69f9a9 + peep_update_hunger(peep); + goto loc_68F9F3; } } } @@ -358,13 +407,13 @@ static void sub_68F41A(rct_peep *peep, int index) switch (chosen_thought){ case PEEP_THOUGHT_TYPE_HUNGRY: - RCT2_CALLPROC_X(0x006958D0, 0x00800000, 0, 0, 0, (int)peep, 0, 0); + peep_head_for_nearest_ride_with_flags(peep, 0x00800000); break; case PEEP_THOUGHT_TYPE_THIRSTY: - RCT2_CALLPROC_X(0x006958D0, 0x01000000, 0, 0, 0, (int)peep, 0, 0); + peep_head_for_nearest_ride_with_flags(peep, 0x01000000); break; case PEEP_THOUGHT_TYPE_BATHROOM: - RCT2_CALLPROC_X(0x006958D0, 0x0200000, 0, 0, 0, (int)peep, 0, 0); + peep_head_for_nearest_ride_with_flags(peep, 0x00200000); break; case PEEP_THOUGHT_RUNNING_OUT: peep_head_for_nearest_ride_type(peep, RIDE_TYPE_CASH_MACHINE); @@ -384,70 +433,224 @@ static void sub_68F41A(rct_peep *peep, int index) } } - if (peep->state == PEEP_STATE_WALKING || - peep->state == PEEP_STATE_LEAVING_PARK || - peep->state == PEEP_STATE_ENTERING_PARK){ - //68f8CD - if (peep->energy_growth_rate >= 33) - peep->energy_growth_rate -= 2; + switch (peep->state){ + case PEEP_STATE_WALKING: + case PEEP_STATE_LEAVING_PARK: + case PEEP_STATE_ENTERING_PARK: + sub_68F8CD(peep); + peep_update_hunger(peep); + break; - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TEMPERATURE, uint8) >= 15){ - if (peep->thirst >= 5) - peep->thirst--; + case PEEP_STATE_SITTING: + if (peep->energy_growth_rate <= 135) + peep->energy_growth_rate += 5; + + if (peep->thirst >= 5){ + peep->thirst -= 4; + peep->bathroom = min(255, peep->bathroom + 3); } - if (peep->var_2A == 0){ - if (!(peep->flags & PEEP_FLAGS_LEAVING_PARK)){ - if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)){ - if (peep->energy < 55 || - peep->happiness < 45 || - peep->cash_in_pocket < MONEY(5, 00)){ + if (peep->nausea_growth_rate >= 50) + peep->nausea_growth_rate -= 6; - if ((scenario_rand() & 0xFFFF) <= 3276){ - peep_leave_park(peep); - } + // In the original this branched differently + // but it would mean setting the peep happiness from + // a thought type entry which i think is incorrect. + peep_update_hunger(peep); + break; + + case PEEP_STATE_QUEUING: + if (peep->time_in_queue >= 2000){ + rct_map_element* mapElement = map_get_first_element_at(peep->next_x / 32, peep->next_y / 32); + uint8 found = 0; + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + if (mapElement->base_height != peep->next_z) + continue; + + uint8 additions = mapElement->properties.path.additions & 0xF; + if (additions != 0 && mapElement->properties.path.additions & (1 << 7)){ + rct_scenery_entry *sceneryEntry = g_pathBitSceneryEntries[additions - 1]; + if (sceneryEntry->path_bit.var_06 & (1 << 8)){ + found = 1; } } - else{ - if (peep->energy < 70 || - peep->happiness < 60){ + break; + } while (!map_element_is_last_for_tile(mapElement++)); - if ((scenario_rand() & 0xFFFF) <= 3276){ - peep_leave_park(peep); - } - } - } + if (found){ + if (peep->happiness_growth_rate < 90) + peep->happiness_growth_rate = 90; + + if (peep->happiness_growth_rate < 165) + peep->happiness_growth_rate += 2; } else{ - peep_leave_park(peep); + peep->happiness_growth_rate = max(peep->happiness_growth_rate - 4, 0); } } - }//68f9a9 - - if (peep->state == PEEP_STATE_SITTING){ - //68f9c9 - } - - if (peep->state == PEEP_STATE_QUEUING){ - //68f84c - }//68f9a9 - - if (peep->state == PEEP_STATE_ENTERING_RIDE){ + peep_update_hunger(peep); + break; + case PEEP_STATE_ENTERING_RIDE: if (peep->sub_state == 17 || peep->sub_state == 15){ - //68f8cd - }//69f9a9 + sub_68F8CD(peep); + } + peep_update_hunger(peep); + break; } - if (/*not the above*/1){ - //68f9f3 + loc_68F9F3: + if (peep->happiness_growth_rate >= 128) + peep->happiness_growth_rate--; + else + peep->happiness_growth_rate++; + + peep->nausea_growth_rate = max(peep->nausea_growth_rate - 2, 0); + + if (peep->energy <= 50){ + peep->energy = max(peep->energy - 2, 0); } - //68F807 - } + + if (peep->hunger < 10){ + peep->hunger = max(peep->hunger - 1, 0); + } + + if (peep->thirst < 10){ + peep->thirst = max(peep->thirst - 1, 0); + } + + if (peep->bathroom >= 195){ + peep->bathroom--; + } + + if (peep->state == PEEP_STATE_WALKING && + peep->nausea_growth_rate >= 128){ + + if ((scenario_rand() & 0xFF) <= (uint8)((peep->nausea - 128) / 2)){ + if (peep->action >= PEEP_ACTION_NONE_1){ + peep->action = PEEP_ACTION_THROW_UP; + peep->action_frame = 0; + peep->action_sprite_image_offset = 0; + sub_693B58(peep); + invalidate_sprite((rct_sprite*)peep); + } + } + } + } // 68FA89 + if (peep->var_42 == 0 && + peep_has_food(peep)){ + peep->var_42 += 3; + } - RCT2_CALLPROC_X(0x0068F41A, 0, 0, 0, index, (int)peep, 0, 0); + if (peep->var_42 != 0 && + peep->state != PEEP_STATE_ON_RIDE){ + + peep->var_42 = max(peep->var_42 - 3, 0); + + if (peep_has_drink(peep)){ + peep->thirst = min(peep->thirst + 7, 255); + } + else{ + peep->hunger = min(peep->hunger + 7, 255); + peep->thirst = max(peep->thirst - 3, 0); + peep->bathroom = min(peep->bathroom + 2, 255); + } + + if (peep->var_42 == 0){ + int chosen_food = bitscanforward(peep_has_food_standard_flag(peep)); + if (chosen_food != -1){ + peep->item_standard_flags &= ~(1 << chosen_food); + + uint8 discard_container = RCT2_ADDRESS(0x00982326, uint8)[chosen_food]; + if (discard_container != 0xFF){ + peep->item_standard_flags |= (1 << discard_container); + } + + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; + peep_update_sprite_type(peep); + } + else{ + chosen_food = bitscanforward(peep_has_food_extra_flag(peep)); + if (chosen_food != -1){ + peep->item_extra_flags &= ~(1 << chosen_food); + uint8 discard_container = RCT2_ADDRESS(0x00982342, uint8)[chosen_food]; + if (discard_container != 0xFF){ + if (discard_container >= 32) + peep->item_extra_flags |= (1 << (discard_container - 32)); + else + peep->item_standard_flags |= (1 << discard_container); + } + + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; + peep_update_sprite_type(peep); + } + } + } + } + + uint8 energy = peep->energy; + uint8 energy_growth = peep->energy_growth_rate; + if (energy >= energy_growth){ + energy -= 2; + if (energy < energy_growth) + energy = energy_growth; + } + else{ + energy = min(255, energy + 4); + if (energy > energy_growth) + energy = energy_growth; + } + + if (energy < 32) + energy = 32; + + if (energy > 128) + energy = 128; + + if (energy != peep->energy){ + peep->energy = energy; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_2; + } + + uint8 happiness = peep->happiness; + uint8 happiness_growth = peep->happiness_growth_rate; + if (happiness >= happiness_growth){ + happiness = max(happiness - 4, 0); + if (happiness < happiness_growth) + happiness = happiness_growth; + } + else{ + happiness = min(255, happiness + 4); + if (happiness > happiness_growth) + happiness = happiness_growth; + } + + if (happiness != peep->happiness){ + peep->happiness = happiness; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_2; + } + + uint8 nausea = peep->nausea; + uint8 nausea_growth = peep->nausea_growth_rate; + if (nausea >= nausea_growth){ + nausea = max(nausea - 4, 0); + if (nausea < nausea_growth) + nausea = nausea_growth; + } + else{ + nausea = min(255, nausea + 4); + if (nausea > nausea_growth) + nausea = nausea_growth; + } + + if (nausea != peep->nausea){ + peep->nausea = nausea; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_2; + } } /* some sort of check to see if peep is connected to the ground?? */ @@ -676,7 +879,7 @@ int peep_update_action(sint16* x, sint16* y, sint16* xy_distance, rct_peep* peep else peep->nausea -= 30; - peep->var_45 |= (1 << 2); + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_2; // Create sick at location litter_create(peep->x, peep->y, peep->z, peep->sprite_direction, peep->sprite_index & 1); @@ -795,7 +998,7 @@ void peep_update_sprite_type(rct_peep* peep){ peep->item_standard_flags &= ~PEEP_ITEM_BALLOON; - peep->var_45 |= (1 << 3); + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; } if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8) != 0 && @@ -999,7 +1202,7 @@ void peep_update_falling(rct_peep* peep){ if (peep->sprite_type == 19 && peep->x != (sint16)0x8000){ create_balloon(peep->x, peep->y, height, peep->balloon_colour, 0); - peep->var_45 |= (1 << 3); + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; peep_update_sprite_type(peep); } } @@ -1696,7 +1899,7 @@ static void peep_update_ride_sub_state_2_enter_ride(rct_peep* peep, rct_ride* ri (peep->voucher_arguments == peep->current_ride)){ peep->item_standard_flags &= ~PEEP_ITEM_VOUCHER; - peep->var_45 |= (1 << 3); + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; } else{ ride->total_profit += ride->price; @@ -3091,7 +3294,7 @@ static void peep_update_mowing(rct_peep* peep){ map_invalidate_tile_zoom0(peep->next_x, peep->next_y, map_element->base_height * 8, map_element->base_height * 8 + 16); } peep->staff_lawns_mown++; - peep->var_45 |= (1 << 5); + peep->window_invalidate_flags |= PEEP_INVALIDATE_STAFF_STATS; } } @@ -3140,7 +3343,7 @@ static void peep_update_watering(rct_peep* peep){ map_element->properties.scenery.age = 0; map_invalidate_tile_zoom0(x, y, map_element->base_height * 8, map_element->clearance_height * 8); peep->staff_gardens_watered++; - peep->var_45 |= (1 << 4); + peep->window_invalidate_flags |= PEEP_INVALIDATE_STAFF_STATS; } while (!map_element_is_last_for_tile(map_element++)); peep_state_reset(peep); @@ -3211,7 +3414,7 @@ static void peep_update_emptying_bin(rct_peep* peep){ map_invalidate_tile_zoom0(peep->next_x, peep->next_y, map_element->base_height * 8, map_element->clearance_height * 8); peep->staff_bins_emptied++; - peep->var_45 |= (1 << 4); + peep->window_invalidate_flags |= PEEP_INVALIDATE_STAFF_STATS; } } @@ -3226,7 +3429,7 @@ static void peep_update_sweeping(rct_peep* peep){ // Remove sick at this location sub_6738E1(peep->x, peep->y, peep->z); peep->staff_litter_swept++; - peep->var_45 |= (1 << 4); + peep->window_invalidate_flags |= PEEP_INVALIDATE_STAFF_STATS; } sint16 x = 0, y = 0, z, xy_distance; if (peep_update_action(&x, &y, &xy_distance, peep)){ @@ -3795,7 +3998,7 @@ static void peep_update_using_bin(rct_peep* peep){ // switched to scenario_rand as it is more reliable if (scenario_rand() & 7) rubbish_in_bin--; peep->item_standard_flags &= ~(1 << cur_container); - peep->var_45 |= 8; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; peep_update_sprite_type(peep); continue; } @@ -3807,7 +4010,7 @@ static void peep_update_using_bin(rct_peep* peep){ litter_create(x, y, peep->z, scenario_rand() & 3, bp); peep->item_standard_flags &= ~(1 << cur_container); - peep->var_45 |= 8; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; peep_update_sprite_type(peep); } @@ -3825,7 +4028,7 @@ static void peep_update_using_bin(rct_peep* peep){ // switched to scenario_rand as it is more reliable if (scenario_rand() & 7) rubbish_in_bin--; peep->item_extra_flags &= ~(1 << cur_container); - peep->var_45 |= 8; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; peep_update_sprite_type(peep); continue; @@ -3838,7 +4041,7 @@ static void peep_update_using_bin(rct_peep* peep){ litter_create(x, y, peep->z, scenario_rand() & 3, bp); peep->item_extra_flags &= ~(1 << cur_container); - peep->var_45 |= 8; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; peep_update_sprite_type(peep); } @@ -4366,7 +4569,7 @@ static void peep_update_walking(rct_peep* peep){ bp = RCT2_ADDRESS(0x97EFE8, uint8)[pos_extr]; } - peep->var_45 |= 8; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; peep_update_sprite_type(peep); int x = peep->x + (scenario_rand() & 0x7) - 3; @@ -4532,7 +4735,7 @@ static void peep_update_thoughts(rct_peep* peep){ if (++peep->thoughts[i].var_3 == 0) { // When thought is older than ~6900 ticks remove it if (++peep->thoughts[i].var_2 >= 28) { - peep->var_45 |= 1; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_THOUGHTS; // Clear top thought, push others up memmove(&peep->thoughts[i], &peep->thoughts[i + 1], sizeof(rct_peep_thought)*(PEEP_MAX_THOUGHTS - i - 1)); @@ -4549,7 +4752,7 @@ static void peep_update_thoughts(rct_peep* peep){ // fresh. if (add_fresh && fresh_thought != -1) { peep->thoughts[fresh_thought].var_2 = 1; - peep->var_45 |= 1; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_THOUGHTS; } } @@ -4916,7 +5119,7 @@ void peep_applause() peep->item_standard_flags &= ~PEEP_ITEM_BALLOON; if (peep->x != (sint16)0x8000) { create_balloon(peep->x, peep->y, peep->z + 9, peep->balloon_colour, 0); - peep->var_45 |= 8; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; peep_update_sprite_type(peep); } } @@ -4995,7 +5198,7 @@ rct_peep *peep_generate(int x, int y, int z) peep->type = PEEP_TYPE_GUEST; peep->previous_ride = 0xFF; peep->thoughts->type = PEEP_THOUGHT_TYPE_NONE; - peep->var_45 = 0; + peep->window_invalidate_flags = 0; uint8 al = (scenario_rand() & 0x7) + 3; uint8 ah = min(al, 7) - 3; @@ -5460,6 +5663,31 @@ int peep_has_food(rct_peep* peep){ peep_has_food_extra_flag(peep); } +static int peep_has_drink_standard_flag(rct_peep* peep){ + return peep->item_standard_flags &( + PEEP_ITEM_DRINK | + PEEP_ITEM_COFFEE | + PEEP_ITEM_LEMONADE); +} + +static int peep_has_drink_extra_flag(rct_peep* peep){ + return peep->item_extra_flags &( + PEEP_ITEM_CHOCOLATE | + PEEP_ITEM_ICED_TEA | + PEEP_ITEM_FRUIT_JUICE | + PEEP_ITEM_SOYBEAN_MILK | + PEEP_ITEM_SU_JONGKWA + ); +} + +/* To simplify check of NOT(0x12BA3C0 and 0x118F48) + * returns 0 on no food. + */ +static int peep_has_drink(rct_peep* peep){ + return peep_has_drink_standard_flag(peep) || + peep_has_drink_extra_flag(peep); +} + static int peep_empty_container_standard_flag(rct_peep* peep){ return peep->item_standard_flags &( PEEP_ITEM_EMPTY_CAN | @@ -5544,7 +5772,7 @@ void peep_insert_new_thought(rct_peep *peep, uint8 thought_type, uint8 thought_a peep->thoughts[0].var_2 = 0; peep->thoughts[0].var_3 = 0; - peep->var_45 |= (1 << 0); + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_THOUGHTS; } /* rct2: 0x00699FE3 @@ -5581,7 +5809,7 @@ static void peep_stop_purchase_thought(rct_peep* peep, uint8 ride_type){ peep->thoughts[PEEP_MAX_THOUGHTS - 1].type = PEEP_THOUGHT_TYPE_NONE; - peep->var_45 |= (1 << 0); + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_THOUGHTS; i--; } } @@ -5732,13 +5960,262 @@ static int sub_694921(rct_peep *peep, int x, int y) return edx & 0xFFFF; } +static bool peep_has_voucher_for_free_ride(rct_peep *peep, int rideIndex) +{ + return + peep->item_standard_flags & PEEP_ITEM_VOUCHER && + peep->voucher_type == VOUCHER_TYPE_RIDE_FREE && + peep->voucher_arguments == rideIndex; +} + +static void peep_reset_ride_heading(rct_peep *peep) +{ + rct_window *w; + + peep->guest_heading_to_ride_id = 255; + w = window_find_by_number(WC_PEEP, peep->sprite_index); + if (w != NULL) { + window_event_invalidate_call(w); + widget_invalidate(w, 12); + } +} + /** * * rct2: 0x006960AB */ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) { - return RCT2_CALLPROC_X(0x006960AB, 0, 0, 0, rideIndex | (dh << 8), (int)peep, 0, bp) & 0x100; + // return RCT2_CALLPROC_X(0x006960AB, 0, 0, 0, rideIndex | (dh << 8), (int)peep, 0, bp) & 0x100; + + rct_ride *ride = GET_RIDE(rideIndex); + rct_ride_type *rideEntry; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_8)) { + if (ride->status == RIDE_STATUS_OPEN && !(ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN)) { + if (!(RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 8] & 0x1000) || ride->value == 0xFFFF || ride->price != 0) { + if (peep->flags & PEEP_FLAGS_LEAVING_PARK) { + goto loc_69666E; + } + } + if (RCT2_ADDRESS(0x0097CF40, uint32)[ride->type * 2] & 0x20000) { + if (rideIndex == peep->previous_ride) goto loc_69666E; + if (ride->type != RIDE_TYPE_CASH_MACHINE) { + if (ride->type == RIDE_TYPE_FIRST_AID) { + if (peep->nausea < 128) goto loc_69666E; + goto loc_69652C; + } + rideEntry = GET_RIDE_ENTRY(ride->subtype); + if (rideEntry->shop_item == 255) { + if (peep->bathroom < 70) goto loc_69666E; + money16 ax = ride->price * 40; + if ((ax >> 8) != 0 || (ax & 0xFF) > peep->bathroom) { + if (!(bp & 4)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_PAYING, rideIndex); + if (peep->happiness_growth_rate >= 60) { + peep->happiness_growth_rate -= 16; + } + ride_update_popularity(ride, 0); + } + goto loc_696658; + } + } + + if (ride->price != 0) { + if (peep->cash_in_pocket <= 0) { + if (!(bp & 4)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 255); + } + goto loc_696658; + } + if (ride->price > peep->cash_in_pocket) { + if (!(bp & 4)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, rideIndex); + } + goto loc_696658; + } + } + } + + loc_69652C: + if (!(bp & 4)) { + ride_update_popularity(ride, 1); + if (rideIndex == peep->guest_heading_to_ride_id) { + peep_reset_ride_heading(peep); + } + } + return true; + } + if (bp & 2) { + if (ride->queue_length[dh] == 1000) + goto loc_696645; + if (!(bp & 1)) { + if (ride->first_peep_in_queue[dh] != 0xFFFF) + goto loc_696645; + } else { + if (ride->first_peep_in_queue[dh] != 0xFFFF) { + rct_peep *firstPeepInQueue = &(g_sprite_list[ride->first_peep_in_queue[dh]].peep); + if (abs(firstPeepInQueue->z - peep->z) <= 6) { + int dx = abs(firstPeepInQueue->x = peep->x); + int dy = abs(firstPeepInQueue->y - peep->y); + int maxD = max(dx, dy); + if (maxD <= 13) { + if (firstPeepInQueue->time_in_queue > 10) + goto loc_696645; + if (maxD < 8) + goto loc_696645; + } + } + } + } + } + if (!(RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 8] & 0x1000) || ride->value == 0xFFFF || ride->price != 0) { + if (peep->previous_ride == rideIndex) + goto loc_69666E; + if (ride->price != 0 && !peep_has_voucher_for_free_ride(peep, rideIndex)) { + if (peep->cash_in_pocket <= 0) { + if (!(bp & 4)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 255); + } + goto loc_696658; + } + if (ride->price > peep->cash_in_pocket) { + if (!(bp & 4)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, rideIndex); + } + goto loc_696658; + } + } + if (ride->last_crash_type != RIDE_CRASH_TYPE_NONE) { + if (peep->happiness < 225) { + if (!(bp & 4)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_SAFE, rideIndex); + if (peep->happiness_growth_rate >= 64) { + peep->happiness_growth_rate -= 8; + } + ride_update_popularity(ride, 0); + } + goto loc_696658; + } + } + if (ride->excitement != 0xFFFF) { + if (rideIndex == peep->guest_heading_to_ride_id) { + if (ride->intensity > RIDE_RATING(10, 00)) goto loc_6965F1; + goto loc_696387; + } + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8) != 0) { + if ((ride->var_114 >> 5) >= 3) goto loc_696387; + if (!(bp & 4)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_WHILE_RAINING, rideIndex); + if (peep->happiness_growth_rate >= 64) { + peep->happiness_growth_rate -= 8; + } + ride_update_popularity(ride, 0); + } + goto loc_696658; + } + ride_rating maxIntensity = min((peep->intensity >> 4) * 100, 1000) + peep->happiness; + ride_rating minIntensity = ((peep->intensity & 0x0F) * 100) - peep->happiness; + if (ride->intensity < minIntensity) { + if (!(bp & 4)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_MORE_THRILLING, rideIndex); + if (peep->happiness_growth_rate >= 64) { + peep->happiness_growth_rate -= 8; + } + ride_update_popularity(ride, 0); + } + goto loc_696658; + } + if (ride->intensity > maxIntensity) goto loc_6965F1; + + ride_rating minNausea = RCT2_ADDRESS(0x00982390, uint16)[(peep->nausea_tolerance & 3) * 2] - peep->happiness; + ride_rating maxNausea = RCT2_ADDRESS(0x00982392, uint16)[(peep->nausea_tolerance & 3) * 2] + peep->happiness; + if (ride->nausea > maxNausea) { + if (!(bp & 4)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SICKENING, rideIndex); + if (peep->happiness_growth_rate >= 64) { + peep->happiness_growth_rate -= 8; + } + ride_update_popularity(ride, 0); + } + goto loc_696658; + } + if (ride->nausea >= 140 && peep->nausea > 160) goto loc_69666E; + goto loc_696387; + } + + if (RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 8] & 0x10) { + if (scenario_rand() > 0x1999U) goto loc_69666E; + if (ride->max_positive_vertical_g > 500) goto loc_69666E; + if (ride->max_negative_vertical_g < -400) goto loc_69666E; + if (ride->max_lateral_g > 400) goto loc_69666E; + } + + loc_696387:; + uint32 value = ride->value; + if (value != 0xFFFF && !peep_has_voucher_for_free_ride(peep, rideIndex)) { + if (peep->flags & PEEP_FLAGS_5) value /= 4; + if (ride->price > (money16)(value * 2)) { + if (bp & 4) goto loc_696658; + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_BAD_VALUE, rideIndex); + if (peep->happiness_growth_rate < 60) { + peep->happiness_growth_rate -= 16; + } + ride_update_popularity(ride, 0); + goto loc_696658; + } + if (ride->price <= (money16)(value / 2) && bp == 4) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_GOOD_VALUE, rideIndex); + } + } + } + } + } + + if (!(bp & 4)) { + ride_update_popularity(ride, 1); + if ((peep->flags & PEEP_FLAGS_27) && ride_type_is_intamin(ride->type)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_EXCITED, 255); + } + } + + if (rideIndex == peep->guest_heading_to_ride_id) { + peep_reset_ride_heading(peep); + } + + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_9; + return true; + } + } +loc_69666E: + if (rideIndex == peep->guest_heading_to_ride_id) { + peep_reset_ride_heading(peep); + } + return false; + +loc_6965F1: + if (!(bp & 4)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_INTENSE, rideIndex); + if (peep->happiness_growth_rate >= 64) { + peep->happiness_growth_rate -= 8; + } + ride_update_popularity(ride, 0); + } + goto loc_696658; + +loc_696645: + ride->lifecycle_flags |= RIDE_LIFECYCLE_9; + +loc_696658: + if (!(bp & 4)) { + peep->previous_ride = rideIndex; + peep->previous_ride_time_out = 0; + } + + peep_reset_ride_heading(peep); + return false; } /** @@ -5844,8 +6321,8 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) rct_window *w = window_find_by_number(WC_PEEP, peep->sprite_index); if (w != NULL) { window_event_invalidate_call(w); + widget_invalidate(w, 12); } - widget_invalidate_by_number(WC_RIDE, mostExcitingRideIndex, 23); // Make peep look at their map if they have one if (peep->item_standard_flags & PEEP_ITEM_MAP) { @@ -5957,6 +6434,118 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) peep->var_C6 = 200; sub_69A98C(peep); + // Invalidate windows + rct_window *w = window_find_by_number(WC_PEEP, peep->sprite_index); + if (w != NULL) { + window_event_invalidate_call(w); + widget_invalidate(w, 12); + } + + peep->var_F4 = 0; +} + +/** + * + * rct2: 0x006958D0 + */ +static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFlags) +{ + rct_ride *ride; + + if (peep->state != PEEP_STATE_SITTING && peep->state != PEEP_STATE_WATCHING && peep->state != PEEP_STATE_WALKING) { + return; + } + if (peep->flags & PEEP_FLAGS_LEAVING_PARK) return; + if (peep->x == (sint16)0x8000) return; + if (peep->guest_heading_to_ride_id != 255) { + ride = GET_RIDE(peep->guest_heading_to_ride_id); + if (RCT2_ADDRESS(0x0097CF40, uint32)[ride->type * 2] & 0x03800000) { + return; + } + } + + if ((rideTypeFlags & 0x002000000) && peep_has_food(peep)) { + return; + } + + RCT2_GLOBAL(0x00F1AD98, uint32) = 0; + RCT2_GLOBAL(0x00F1AD9C, uint32) = 0; + RCT2_GLOBAL(0x00F1ADA0, uint32) = 0; + RCT2_GLOBAL(0x00F1ADA4, uint32) = 0; + RCT2_GLOBAL(0x00F1ADA8, uint32) = 0; + RCT2_GLOBAL(0x00F1ADAC, uint32) = 0; + RCT2_GLOBAL(0x00F1ADB0, uint32) = 0; + RCT2_GLOBAL(0x00F1ADB4, uint32) = 0; + + // TODO Check for a toy is likely a mistake and should be a map + if (peep->item_standard_flags & PEEP_ITEM_TOY) { + // Consider all rides in the park + int i; + FOR_ALL_RIDES(i, ride) { + if (RCT2_ADDRESS(0x0097CF40, uint32)[ride->type * 2] & rideTypeFlags) { + RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= i & 0x1F; + } + } + } else { + // Take nearby rides into consideration + int cx = floor2(peep->x, 32); + int cy = floor2(peep->y, 32); + for (int x = cx - 320; x <= cx + 320; x++) { + for (int y = cy - 320; y <= cy + 320; y++) { + if (x >= 0 && y >= 0 && x < (256 * 32) && y < (256 * 32)) { + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; + + int rideIndex = mapElement->properties.track.ride_index; + ride = GET_RIDE(rideIndex); + if (RCT2_ADDRESS(0x0097CF40, uint32)[ride->type * 2] & rideTypeFlags) { + RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (rideIndex & 0x1F); + } + } while (!map_element_is_last_for_tile(mapElement++)); + } + } + } + } + + // Filter the considered rides + uint8 *potentialRides = (uint8*)0x00F1ADBC; + uint8 *nextPotentialRide = potentialRides; + int numPotentialRides = 0; + for (int i = 0; i < MAX_RIDES; i++) { + if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (i & 0x1F))) + continue; + + rct_ride *ride = GET_RIDE(i); + if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_9)) { + if (sub_6960AB(peep, i, 0, 6)) { + *nextPotentialRide++ = i; + numPotentialRides++; + } + } + } + + // Pick the closest ride + int closestRideIndex = -1; + int closestRideDistance = INT_MAX; + for (int i = 0; i < numPotentialRides; i++) { + ride = GET_RIDE(potentialRides[i]); + int rideX = (ride->station_starts[0] & 0xFF) * 32; + int rideY = (ride->station_starts[0] >> 8) * 32; + int distance = abs(rideX - peep->x) + abs(rideY - peep->y); + if (distance < closestRideDistance) { + closestRideIndex = potentialRides[i]; + closestRideDistance = distance; + } + } + if (closestRideIndex == -1) + return; + + // Head to that ride + peep->guest_heading_to_ride_id = closestRideIndex; + peep->var_C6 = 200; + sub_69A98C(peep); + // Invalidate windows rct_window *w = window_find_by_number(WC_PEEP, peep->sprite_index); if (w != NULL) { diff --git a/src/peep/peep.h b/src/peep/peep.h index b4e47dd04d..79fe7da4f3 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -40,6 +40,7 @@ enum PEEP_TYPE { }; enum PEEP_THOUGHT_TYPE { + PEEP_THOUGHT_TYPE_CANT_AFFORD_0 = 0, // "I can't afford" PEEP_THOUGHT_TYPE_SPENT_MONEY = 1, // "I've spent all my money" PEEP_THOUGHT_TYPE_SICK = 2, // "I feel sick" PEEP_THOUGHT_TYPE_VERY_SICK = 3, // "I feel very sick" @@ -251,7 +252,7 @@ enum PEEP_FLAGS { PEEP_FLAGS_TRACKING = (1 << 3), PEEP_FLAGS_WAVING = (1 << 4), // Makes the peep wave - + PEEP_FLAGS_5 = (1 << 5), PEEP_FLAGS_PHOTO = (1 << 6), // Makes the peep take a picture PEEP_FLAGS_PAINTING = (1 << 7), PEEP_FLAGS_WOW = (1 << 8), // Makes a peep WOW2 @@ -271,7 +272,7 @@ enum PEEP_FLAGS { PEEP_FLAGS_JOY = (1 << 23), // Makes the peep jump in joy PEEP_FLAGS_ANGRY = (1 << 24), PEEP_FLAGS_ICE_CREAM = (1 << 25), // Unconfirmed - + PEEP_FLAGS_27 = (1 << 27), PEEP_FLAGS_TWITCH = (1 << 31) // Added for twitch integration }; @@ -338,6 +339,15 @@ enum PEEP_ITEM { PEEP_ITEM_EMPTY_BOWL_BLUE = (1 << 21) }; +// Flags used by peep->window_invalidate_flags +enum { + PEEP_INVALIDATE_PEEP_THOUGHTS = 1, + PEEP_INVALIDATE_PEEP_STATS = 1 << 1, + PEEP_INVALIDATE_PEEP_2 = 1 << 2, + PEEP_INVALIDATE_PEEP_INVENTORY = 1 << 3, + PEEP_INVALIDATE_STAFF_STATS = 1 << 4, +}; + typedef struct { uint8 type; //0 uint8 item; //1 @@ -402,7 +412,7 @@ typedef struct { uint8 var_42; uint8 intensity; // 0x43 uint8 nausea_tolerance; // 0x44 - uint8 var_45; // Some sort of flags? + uint8 window_invalidate_flags; // 0x45 money16 paid_on_drink; // 0x46 uint8 var_48[16]; uint32 item_extra_flags; // 0x58 diff --git a/src/peep/staff.c b/src/peep/staff.c index e7725d093d..2df648d85c 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -127,7 +127,7 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, move_sprite_to_list((rct_sprite *)newPeep, SPRITE_LINKEDLIST_OFFSET_PEEP); newPeep->sprite_identifier = 1; - newPeep->var_45 = 0; + newPeep->window_invalidate_flags = 0; newPeep->action = PEEP_ACTION_NONE_2; newPeep->var_6D = 0; newPeep->action_sprite_image_offset = 0; diff --git a/src/ride/ride.c b/src/ride/ride.c index 21c9c0e9a2..ca8e546b51 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1013,7 +1013,7 @@ void ride_remove_peeps(int rideIndex) peep->happiness = min(peep->happiness, peep->happiness_growth_rate) / 2; peep->happiness_growth_rate = peep->happiness; - peep->var_45 |= 2; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_STATS; } } @@ -6600,3 +6600,11 @@ void ride_crash(int rideIndex, int vehicleIndex) RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 2, uint32) = ride->name_arguments; news_item_add_to_queue(NEWS_ITEM_RIDE, STR_RIDE_HAS_CRASHED, rideIndex); } + +bool ride_type_is_intamin(int rideType) +{ + return + rideType == RIDE_TYPE_HEARTLINE_TWISTER_COASTER || + rideType == RIDE_TYPE_GIGA_COASTER || + rideType == RIDE_TYPE_INVERTED_IMPULSE_COASTER; +} diff --git a/src/ride/ride.h b/src/ride/ride.h index 99ab93d5e5..d10844e11d 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -213,6 +213,7 @@ typedef struct { union { uint8 inversions; // 0x114 (???X XXXX) uint8 holes; // 0x114 (???X XXXX) + uint8 var_114; }; uint8 drops; // 0x115 (??XX XXXX) uint8 var_116; @@ -971,4 +972,6 @@ void game_command_remove_ride_entrance_or_exit(int *eax, int *ebx, int *ecx, int void sub_6CB945(int rideIndex); void ride_crash(int rideIndex, int vehicleIndex); +bool ride_type_is_intamin(int rideType); + #endif diff --git a/src/windows/guest.c b/src/windows/guest.c index 228ba7b153..722522e746 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -1277,7 +1277,7 @@ void window_guest_stats_update(rct_window *w) { w->frame_no++; rct_peep* peep = GET_PEEP(w->number); - peep->var_45 &= ~(1<<1); + peep->window_invalidate_flags &= ~PEEP_INVALIDATE_PEEP_STATS; window_invalidate(w); } @@ -1808,8 +1808,8 @@ void window_guest_finance_paint(rct_window *w, rct_drawpixelinfo *dpi) void window_guest_thoughts_resize(rct_window *w) { rct_peep* peep = GET_PEEP(w->number); - if (peep->var_45 & 1){ - peep->var_45 &=~(1 << 0); + if (peep->window_invalidate_flags & PEEP_INVALIDATE_PEEP_THOUGHTS){ + peep->window_invalidate_flags &= ~PEEP_INVALIDATE_PEEP_THOUGHTS; window_invalidate(w); } @@ -1902,8 +1902,8 @@ void window_guest_thoughts_paint(rct_window *w, rct_drawpixelinfo *dpi) void window_guest_inventory_resize(rct_window *w) { rct_peep* peep = GET_PEEP(w->number); - if (peep->var_45 & (1<<3)){ - peep->var_45 &= ~(1 << 3); + if (peep->window_invalidate_flags & PEEP_INVALIDATE_PEEP_INVENTORY){ + peep->window_invalidate_flags &= ~PEEP_INVALIDATE_PEEP_INVENTORY; window_invalidate(w); } diff --git a/src/windows/staff.c b/src/windows/staff.c index eddac342b5..8f185db156 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -678,8 +678,8 @@ void window_staff_stats_update(rct_window* w) widget_invalidate(w, WIDX_TAB_3); rct_peep* peep = GET_PEEP(w->number); - if (peep->var_45 & 0x10) { - peep->var_45 &= 0xEF; + if (peep->window_invalidate_flags & PEEP_INVALIDATE_STAFF_STATS) { + peep->window_invalidate_flags &= ~PEEP_INVALIDATE_STAFF_STATS; window_invalidate(w); } } diff --git a/src/world/park.h b/src/world/park.h index f50cd9dd93..9be1c31621 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -35,6 +35,7 @@ enum { PARK_FLAGS_FORBID_HIGH_CONSTRUCTION = (1 << 5), // below tree height PARK_FLAGS_PREF_LESS_INTENSE_RIDES = (1 << 6), PARK_FLAGS_FORBID_MARKETING_CAMPAIGN = (1 << 7), + PARK_FLAGS_8 = (1 << 8), PARK_FLAGS_PREF_MORE_INTENSE_RIDES = (1 << 9), PARK_FLAGS_NO_MONEY = (1 << 11), PARK_FLAGS_DIFFICULT_GUEST_GENERATION = (1 << 12), From 9e8b9b10c7fbca5e34295b66d55e56731d42d20b Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 19 Jul 2015 10:00:43 +0100 Subject: [PATCH 0323/1173] Fix footpath connection bug --- src/world/footpath.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/footpath.c b/src/world/footpath.c index 8bcbd4ea52..a4943c1ee6 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -972,7 +972,7 @@ static void loc_6A6D7E( } } if (z - 2 == mapElement->base_height) { - if (footpath_element_is_sloped(mapElement) && footpath_element_get_slope_direction(mapElement) != (direction ^ 2)) { + if (!footpath_element_is_sloped(mapElement) && footpath_element_get_slope_direction(mapElement) != (direction ^ 2)) { return; } goto loc_6A6F1F; From 72b740bd83526cb9fa821f4c478bc456ccdbb049 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 19 Jul 2015 10:22:49 +0100 Subject: [PATCH 0324/1173] Implement peep_get_height_on_slope --- src/peep/peep.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index fdd542a246..a3541625af 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -56,7 +56,7 @@ static bool sub_69AEB7(rct_peep *peep, int rideIndex); static void sub_69A98C(rct_peep *peep); static void sub_68FD3A(rct_peep *peep); static bool sub_690B99(rct_peep *peep, int edge, uint8 *rideToView, uint8 *rideSeatToView); -static int sub_694921(rct_peep *peep, int x, int y); +static int peep_get_height_on_slope(rct_peep *peep, int x, int y); static void peep_pick_ride_to_go_on(rct_peep *peep); static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType); static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFlags); @@ -3433,7 +3433,7 @@ static void peep_update_sweeping(rct_peep* peep){ } sint16 x = 0, y = 0, z, xy_distance; if (peep_update_action(&x, &y, &xy_distance, peep)){ - z = sub_694921(peep, x, y); + z = peep_get_height_on_slope(peep, x, y); sprite_move(x, y, z, (rct_sprite*)peep); invalidate_sprite((rct_sprite*)peep); return; @@ -5949,15 +5949,21 @@ static bool sub_690B99(rct_peep *peep, int edge, uint8 *rideToView, uint8 *rideS /** * * rct2: 0x00694921 + * Gets the height including the bit depending + * on how far up the slope the peep is. */ -static int sub_694921(rct_peep *peep, int x, int y) +static int peep_get_height_on_slope(rct_peep *peep, int x, int y) { - int eax, ebx, ecx, edx, esi, edi, ebp; - eax = x; - ecx = y; - esi = (int)peep; - RCT2_CALLFUNC_X(0x00694921, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - return edx & 0xFFFF; + if (x == (sint16)0x8000) + return 0; + + if (peep->next_var_29 & 0x18){ + return map_element_height(x, y); + } + + int z = peep->next_z * 8; + + return z + map_height_from_slope(x, y, peep->next_var_29); } static bool peep_has_voucher_for_free_ride(rct_peep *peep, int rideIndex) From 34109b7978e9e238dd1c14a066a57274b993abc8 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 19 Jul 2015 11:10:06 +0100 Subject: [PATCH 0325/1173] Implement peep_assess_surroundings --- src/peep/peep.c | 111 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 105 insertions(+), 6 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index a3541625af..4d7ee944b4 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -135,10 +135,109 @@ void peep_update_all() } /* rct2: 0x0069BC9A */ -static uint8 sub_69BC9A(sint16 x, sint16 y, sint16 z){ - int eax = x, ebx = 0, ecx = y, edx = z, esi, edi, ebp; - RCT2_CALLFUNC_X(0x0069BC9A, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - return ebx & 0xFF; +static uint8 peep_assess_surroundings(sint16 center_x, sint16 center_y, sint16 center_z){ + if ((map_element_height(center_x, center_y) & 0xFFFF) > center_z) + return 0; + + uint16 num_scenery = 0; + uint16 num_fountains = 0; + uint16 nearby_music = 0; + uint16 num_rubbish = 0; + + sint16 initial_x = max(center_x - 160, 0); + sint16 initial_y = max(center_y - 160, 0); + sint16 final_x = min(center_x + 160, 8192); + sint16 final_y = min(center_y + 160, 8192); + + for (sint16 x = initial_x; x < final_x; x += 32){ + for (sint16 y = initial_y; y < final_y; y += 32){ + rct_map_element* mapElement = map_get_first_element_at(x / 32, y / 32); + + do{ + rct_ride* ride; + rct_scenery_entry* scenery; + + switch (map_element_get_type(mapElement)){ + case MAP_ELEMENT_TYPE_PATH: + if ((mapElement->properties.path.additions & 0xF) == 0) + break; + + scenery = g_pathBitSceneryEntries[mapElement->properties.path.additions - 1]; + if (mapElement->properties.path.additions & (1 << 7)) + break; + + if (scenery->path_bit.var_06 & + (PATH_BIT_FLAG_JUMPING_FOUNTAIN_WATER | + PATH_BIT_FLAG_JUMPING_FOUNTAIN_SNOW)){ + num_fountains++; + break; + } + if (mapElement->flags & MAP_ELEMENT_FLAG_BROKEN){ + num_rubbish++; + } + break; + case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: + case MAP_ELEMENT_TYPE_SCENERY: + num_scenery++; + break; + case MAP_ELEMENT_TYPE_TRACK: + ride = GET_RIDE(mapElement->properties.track.ride_index); + if (ride->type == RIDE_TYPE_MERRY_GO_ROUND && + ride->music_tune_id != 0xFF){ + nearby_music |= 1; + break; + } + + if (ride->music_tune_id == MUSIC_STYLE_ORGAN){ + nearby_music |= 1; + break; + } + + if (ride->type == RIDE_TYPE_DODGEMS && + ride->music_tune_id != 0xFF){ + // Dodgems drown out music? + nearby_music |= 2; + } + break; + } + } while (!map_element_is_last_for_tile(mapElement++)); + } + } + + + short num_litter; + + num_litter = 0; + rct_litter* litter; + for (uint16 sprite_idx = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_LITTER, uint16); sprite_idx != SPRITE_INDEX_NULL; sprite_idx = litter->next) { + litter = &(g_sprite_list[sprite_idx].litter); + + sint16 dist_x = abs(litter->x - center_x); + sint16 dist_y = abs(litter->y - center_y); + if (max(dist_x, dist_y) <= 160){ + num_rubbish++; + } + } + + if (num_fountains >= 5){ + if (num_rubbish < 20) + return 3; + } + + if (num_scenery >= 40){ + if (num_rubbish < 8) + return 1; + } + + if (nearby_music == 1){ + if (num_rubbish < 20) + return 4; + } + + if (num_rubbish < 2) + return 2; + + return 0; } /* rct2: 0x0068F9A9*/ @@ -287,7 +386,7 @@ static void sub_68F41A(rct_peep *peep, int index) peep->var_F2 = 0; if (peep->x != (sint16)0x8000){ - uint8 bl = sub_69BC9A(peep->x & 0xFFE0, peep->y & 0xFFE0, peep->z); + uint8 bl = peep_assess_surroundings(peep->x & 0xFFE0, peep->y & 0xFFE0, peep->z); if (bl != 0){ peep->happiness_growth_rate = min(255, peep->happiness_growth_rate + 45); @@ -5958,7 +6057,7 @@ static int peep_get_height_on_slope(rct_peep *peep, int x, int y) return 0; if (peep->next_var_29 & 0x18){ - return map_element_height(x, y); + return map_element_height(x, y) & 0xFFFF; } int z = peep->next_z * 8; From d2bcf096f7a3df3aaa802198a931e9bb9f127e92 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 19 Jul 2015 15:11:24 +0100 Subject: [PATCH 0326/1173] Fix slope end when deleting sections. Fixes #1646 --- src/windows/ride_construction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 38e836a4a0..14d2327a5c 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1741,7 +1741,7 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) z &= 0xFFF0; _currentTrackBeginZ = z; _rideConstructionState = RIDE_CONSTRUCTION_STATE_FRONT; - _currentTrackSlopeEnd = 0; + _currentTrackSelectionFlags = 0; _rideConstructionArrowPulseTime = 0; direction = _currentTrackPieceDirection; slope = _currentTrackCurve; From c0354fb16a74cfcb180777b3008533f3e4782e11 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sun, 19 Jul 2015 12:38:29 -0600 Subject: [PATCH 0327/1173] fix #1645 --- src/game.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/game.c b/src/game.c index 489952cfdc..af5efbd4a1 100644 --- a/src/game.c +++ b/src/game.c @@ -833,9 +833,6 @@ void game_autosave() platform_get_user_directory(path, "save"); strcat(path, "autosave.sv6"); - strcpy(gScenarioSaveName, path_get_filename(path)); - path_remove_extension(gScenarioSaveName); - SDL_RWops* rw = platform_sdl_rwfromfile(path, "wb+"); if (rw != NULL) { scenario_save(rw, 0x80000000); From 82217d0053a2d130309f8d9efe978989b5379158 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 20 Jul 2015 17:21:32 +0100 Subject: [PATCH 0328/1173] Fix support cost multiplier underground. Fixes #1651 --- src/ride/track.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ride/track.c b/src/ride/track.c index 7b00435503..155cca3eb2 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -4133,7 +4133,7 @@ money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, return MONEY32_UNDEFINED; } - uint8 support_height = mapElement->base_height - surfaceElement->base_height; + sint8 support_height = mapElement->base_height - surfaceElement->base_height; if (support_height < 0){ support_height = 10; } From be58c6a6885581b590e743d9a95914b90d92740f Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 20 Jul 2015 17:33:02 +0100 Subject: [PATCH 0329/1173] Fix dereference of unset information. Fixes #1650 --- src/ride/ride.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index ca8e546b51..770af4911a 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3913,7 +3913,7 @@ bool ride_check_track_contains_inversions(rct_xy_element *input, rct_xy_element track_circuit_iterator_begin(&it, *input); while (track_circuit_iterator_next(&it)) { - trackType = output->element->properties.track.type; + trackType = it.current.element->properties.track.type; if (RCT2_ADDRESS(0x0099423C, uint16)[trackType] & 0x4000) { *output = it.current; return true; From a877dd4a5bc2172aa8c463cb9abb816853196a74 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 19 Jul 2015 17:20:27 +0100 Subject: [PATCH 0330/1173] Get the initial maze construct working. Note entrances are broken --- src/interface/window.h | 4 ++ src/windows/maze_construction.c | 22 +++++++- src/windows/ride_construction.c | 92 +++++++++++++++++++++++++++++---- 3 files changed, 107 insertions(+), 11 deletions(-) diff --git a/src/interface/window.h b/src/interface/window.h index 347df9c53f..6e1d617eec 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -598,6 +598,10 @@ void window_ride_construct(rct_window *w); void window_ride_list_open(); rct_window *window_ride_construction_open(); rct_window *window_maze_construction_open(); +void ride_construction_toolupdate_entrance_exit(int screenX, int screenY); +void ride_construction_toolupdate_construct(int screenX, int screenY); +void ride_construction_tooldown_construct(int screenX, int screenY); + void window_maze_construction_update_pressed_widgets(); void window_track_place_open(); rct_window *window_new_ride_open(); diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index 3e08cee16d..e4a4aa539d 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -46,6 +46,8 @@ enum { WIDX_MAZE_DIRECTION_NE, WIDX_MAZE_DIRECTION_SW, WIDX_MAZE_DIRECTION_SE, + WIDX_MAZE_ENTRANCE = 29, + WIDX_MAZE_EXIT, }; static rct_widget window_maze_construction_widgets[] = { @@ -225,7 +227,15 @@ static void window_maze_construction_update(rct_window *w) */ static void window_ride_construction_toolupdate(rct_window* w, int widgetIndex, int x, int y) { - RCT2_CALLPROC_X(0x006CD63E, x, y, 0, widgetIndex, (int)w, 0, 0); + switch (widgetIndex){ + case WIDX_MAZE_DIRECTION_GROUPBOX: + ride_construction_toolupdate_construct(x, y); + break; + case WIDX_MAZE_ENTRANCE: + case WIDX_MAZE_EXIT: + ride_construction_toolupdate_entrance_exit(x, y); + break; + } } /** @@ -234,7 +244,15 @@ static void window_ride_construction_toolupdate(rct_window* w, int widgetIndex, */ static void window_ride_construction_tooldown(rct_window* w, int widgetIndex, int x, int y) { - RCT2_CALLPROC_X(0x006CD65D, x, y, 0, widgetIndex, (int)w, 0, 0); + switch (widgetIndex){ + case WIDX_MAZE_DIRECTION_GROUPBOX: + ride_construction_tooldown_construct(x, y); + break; + case WIDX_MAZE_ENTRANCE: + case WIDX_MAZE_EXIT: + RCT2_CALLPROC_X(0x006C825F, x, 0, y, widgetIndex, (int)w, 0, 0); + break; + } } /** diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 14d2327a5c..6e95b1b0e9 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -478,10 +478,6 @@ static void window_ride_construction_show_special_track_dropdown(rct_window *w, static void ride_selected_track_set_seat_rotation(int seatRotation); static void loc_6C7502(int al); static void ride_construction_set_brakes_speed(int brakesSpeed); - -static void ride_construction_toolupdate_construct(int screenX, int screenY); -static void ride_construction_toolupdate_entrance_exit(int screenX, int screenY); -static void ride_construction_tooldown_construct(int screenX, int screenY); static void ride_construction_tooldown_entrance_exit(int screenX, int screenY); uint8 *_currentPossibleRideConfigurations = (uint8*)0x00F4407C; @@ -3221,7 +3217,7 @@ static void ride_construction_set_brakes_speed(int brakesSpeed) * * rct2: 0x006CC6A8 */ -static void ride_construction_toolupdate_construct(int screenX, int screenY) +void ride_construction_toolupdate_construct(int screenX, int screenY) { int x, y, z, highestZ; rct_ride *ride; @@ -3311,7 +3307,26 @@ static void ride_construction_toolupdate_construct(int screenX, int screenY) _previousTrackPieceY = y; _previousTrackPieceZ = z; if (ride->type == RIDE_TYPE_MAZE) { - // goto loc_6CCA31 + for (;;) { + sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, NULL); + _currentTrackPrice = sub_6CA162(rideIndex, trackType, trackDirection, edxRS16, x, y, z); + if (_currentTrackPrice != MONEY32_UNDEFINED) + break; + + bx--; + if (bx == 0) + break; + + _currentTrackBeginZ -= 8; + if (_currentTrackBeginZ & 0x8000) + break; + + if (bx >= 0) + _currentTrackBeginZ += 16; + } + + window_maze_construction_update_pressed_widgets(); + map_invalidate_map_selection_tiles(); return; } @@ -3341,7 +3356,7 @@ static void ride_construction_toolupdate_construct(int screenX, int screenY) * * rct2: 0x006CD354 */ -static void ride_construction_toolupdate_entrance_exit(int screenX, int screenY) +void ride_construction_toolupdate_entrance_exit(int screenX, int screenY) { int x, y, direction; uint8 unk; @@ -3386,7 +3401,7 @@ static void ride_construction_toolupdate_entrance_exit(int screenX, int screenY) * * rct2: 0x006CCA73 */ -static void ride_construction_tooldown_construct(int screenX, int screenY) +void ride_construction_tooldown_construct(int screenX, int screenY) { int trackType, trackDirection, rideIndex, edxRS16, x, y, z, properties, highestZ; rct_window *w; @@ -3441,7 +3456,66 @@ static void ride_construction_tooldown_construct(int screenX, int screenY) } if (ride->type == RIDE_TYPE_MAZE) { - // goto loc_6CCDE4 + for (int zAttempts = 41; zAttempts >= 0; zAttempts--) { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_6; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + window_maze_construction_update_pressed_widgets(); + w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w == NULL) + break; + + RCT2_GLOBAL(0x009A8C29, uint8) |= 1; + + RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; + RCT2_GLOBAL(0x00F44074, money32) = game_do_command( + _currentTrackBeginX, + GAME_COMMAND_FLAG_APPLY | (4 << 8), + _currentTrackBeginY, + _currentRideIndex, + GAME_COMMAND_SET_MAZE_TRACK, + _currentTrackBeginZ, + 0); + + RCT2_GLOBAL(0x009A8C29, uint8) &= ~1; + + if (RCT2_GLOBAL(0x00F44074, money32) == MONEY32_UNDEFINED) { + rct_string_id errorText = RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id); + z -= 8; + if ( + errorText == STR_NOT_ENOUGH_CASH_REQUIRES || + errorText == STR_CAN_ONLY_BUILD_THIS_UNDERWATER || + errorText == STR_CAN_ONLY_BUILD_THIS_ON_WATER || + errorText == STR_RIDE_CANT_BUILD_THIS_UNDERWATER || + errorText == STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND || + errorText == STR_TOO_HIGH_FOR_SUPPORTS || + zAttempts == 0 || + z < 0 + ) { + sound_play_panned(SOUND_ERROR, RCT2_GLOBAL(0x0142406C, sint32), x, y, z); + w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w != NULL){ + tool_set(w, 23, 12); + RCT2_GLOBAL(0x009DE518, uint32) |= (1 << 6); + RCT2_GLOBAL(0x00F44159, uint8) = 0; + RCT2_GLOBAL(0x00F4415C, uint8) = 0; + } + window_maze_construction_update_pressed_widgets(); + break; + } + else if (zAttempts >= 0) { + z += 16; + } + } + else { + window_close_by_class(WC_ERROR); + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, _currentTrackBeginX, _currentTrackBeginY, _currentTrackBeginZ); + break; + } + } return; } From ed23efe38969fe6e8cce6e3f0000a0b4c600f0cd Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 20 Jul 2015 18:43:57 +0100 Subject: [PATCH 0331/1173] Implement remaining functions that were crashing --- src/windows/maze_construction.c | 99 ++++++++++++++++++++++++++++++--- 1 file changed, 91 insertions(+), 8 deletions(-) diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index e4a4aa539d..9e68c4dd3e 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -96,8 +96,8 @@ static void window_maze_construction_mouseup(rct_window *w, int widgetIndex); static void window_maze_construction_resize(rct_window *w); static void window_maze_construction_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); static void window_maze_construction_update(rct_window *w); -static void window_ride_construction_toolupdate(rct_window* w, int widgetIndex, int x, int y); -static void window_ride_construction_tooldown(rct_window* w, int widgetIndex, int x, int y); +static void window_maze_construction_toolupdate(rct_window* w, int widgetIndex, int x, int y); +static void window_maze_construction_tooldown(rct_window* w, int widgetIndex, int x, int y); static void window_maze_construction_invalidate(rct_window *w); static void window_maze_construction_paint(rct_window *w, rct_drawpixelinfo *dpi); @@ -112,8 +112,8 @@ static rct_window_event_list window_maze_construction_events = { window_maze_construction_update, NULL, NULL, - window_ride_construction_toolupdate, - window_ride_construction_tooldown, + window_maze_construction_toolupdate, + window_maze_construction_tooldown, NULL, NULL, NULL, @@ -185,13 +185,46 @@ static void window_maze_construction_close(rct_window *w) } } +static void window_maze_construction_entrance_mouseup(rct_window *w, int widgetIndex){ + if (tool_set(w, widgetIndex, 12)) + return; + + RCT2_GLOBAL(0x00F44191, uint8) = widgetIndex == WIDX_MAZE_ENTRANCE ? 0 : 1; + RCT2_GLOBAL(0x00F44192, uint8) = w->number; + RCT2_GLOBAL(0x00F44193, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) |= INPUT_FLAG_6; + + sub_6C9627(); + + // ??? + uint8 old_state = _rideConstructionState; + _rideConstructionState = 5; + if (old_state != 5) + _rideConstructionState = old_state; + window_maze_construction_update_pressed_widgets(); +} + /** * * rct2: 0x006CD461 */ static void window_maze_construction_mouseup(rct_window *w, int widgetIndex) { - RCT2_CALLPROC_X(0x006CD461, 0, 0, 0, widgetIndex, (int)w, 0, 0); + switch (widgetIndex){ + case WIDX_CLOSE: + window_close(w); + break; + case WIDX_MAZE_ENTRANCE: + case WIDX_MAZE_EXIT: + window_maze_construction_entrance_mouseup(w, widgetIndex); + break; + case WIDX_MAZE_DIRECTION_NW: + case WIDX_MAZE_DIRECTION_NE: + case WIDX_MAZE_DIRECTION_SE: + case WIDX_MAZE_DIRECTION_SW: + RCT2_CALLPROC_X(0x006CD4AB, 0, 0, 0, widgetIndex, (int)w, 0, 0); + break; + } } /** @@ -225,7 +258,7 @@ static void window_maze_construction_update(rct_window *w) * * rct2: 0x006CD63E */ -static void window_ride_construction_toolupdate(rct_window* w, int widgetIndex, int x, int y) +static void window_maze_construction_toolupdate(rct_window* w, int widgetIndex, int x, int y) { switch (widgetIndex){ case WIDX_MAZE_DIRECTION_GROUPBOX: @@ -238,11 +271,61 @@ static void window_ride_construction_toolupdate(rct_window* w, int widgetIndex, } } +/* rct2: 0x006C825F */ +static void window_maze_construction_entrance_tooldown(int x, int y, rct_window* w){ + sub_6C9627(); + + map_invalidate_selection_rect(); + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~((1 << 0) | (1 << 2)); + + int direction = 0; + ride_get_entrance_or_exit_position_from_screen_position(x, y, &x, &y, &direction); + + if (RCT2_GLOBAL(0x00F44194, uint8) == 0xFF) + return; + + uint8 rideIndex = RCT2_GLOBAL(0x00F44192, uint8); + uint8 is_exit = RCT2_GLOBAL(0x00F44191, uint8); + RCT2_GLOBAL(0x00141E9AE, rct_string_id) = is_exit ? 1144 : 1145; + + money32 cost = game_do_command( + x, + GAME_COMMAND_FLAG_APPLY | ((direction ^ 2) << 8), + y, + rideIndex | (is_exit << 8), + GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, + RCT2_GLOBAL(0x00F44193, uint8), + 0); + + if (cost == MONEY32_UNDEFINED) + return; + + sound_play_panned( + SOUND_PLACE_ITEM, + 0x8001, + RCT2_GLOBAL(0x009DEA5E, sint16), + RCT2_GLOBAL(0x009DEA60, sint16), + RCT2_GLOBAL(0x009DEA62, uint16)); + + rct_ride* ride = GET_RIDE(rideIndex); + if (ride_are_all_possible_entrances_and_exits_built(ride)){ + tool_cancel(); + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_15)) + window_close(w); + } + else{ + RCT2_GLOBAL(0x00F44191, uint8) = is_exit ^ 1; + window_invalidate_by_class(WC_RIDE_CONSTRUCTION); + RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint8) = is_exit ? WIDX_MAZE_ENTRANCE : WIDX_MAZE_EXIT; + } +} + /** * * rct2: 0x006CD65D */ -static void window_ride_construction_tooldown(rct_window* w, int widgetIndex, int x, int y) +static void window_maze_construction_tooldown(rct_window* w, int widgetIndex, int x, int y) { switch (widgetIndex){ case WIDX_MAZE_DIRECTION_GROUPBOX: @@ -250,7 +333,7 @@ static void window_ride_construction_tooldown(rct_window* w, int widgetIndex, in break; case WIDX_MAZE_ENTRANCE: case WIDX_MAZE_EXIT: - RCT2_CALLPROC_X(0x006C825F, x, 0, y, widgetIndex, (int)w, 0, 0); + window_maze_construction_entrance_tooldown(x, y, w); break; } } From 1725211713b44e9a6e6abcd6753c96e097d56e85 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 20 Jul 2015 19:47:54 +0100 Subject: [PATCH 0332/1173] Fix incorrect widgets enabled in ride construction. --- src/windows/ride_construction.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 6e95b1b0e9..d5028653bf 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -678,7 +678,7 @@ static void window_ride_construction_resize(rct_window *w) if (is_track_enabled(TRACK_CURVE_VERTICAL)) { // Disable all curves only on vertical track if (_previousTrackSlopeEnd != TRACK_SLOPE_UP_90 || _currentTrackSlopeEnd != TRACK_SLOPE_UP_90) { - if (_previousTrackSlopeEnd == TRACK_SLOPE_DOWN_90 && _currentTrackSlopeEnd != TRACK_SLOPE_DOWN_90) { + if (_previousTrackSlopeEnd != TRACK_SLOPE_DOWN_90 || _currentTrackSlopeEnd != TRACK_SLOPE_DOWN_90) { disabledWidgets |= (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | (1ULL << WIDX_LEFT_CURVE_SMALL) | @@ -2684,7 +2684,7 @@ static void window_ride_construction_update_widgets(rct_window *w) window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].right = 137; window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].image = 5138; window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].image = 5139; - if (is_track_enabled(TRACK_SLOPE_STEEP_LONG)) { + if (is_track_enabled(TRACK_CURVE_VERTICAL)) { window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].type = WWT_FLATBTN; window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].left = 6; window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].right = 27; From 1176e74ff6c59b8325e0f3c5c93584c81a6996a9 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 20 Jul 2015 20:21:12 +0100 Subject: [PATCH 0333/1173] fix guest and staff renaming --- src/windows/guest.c | 9 ++++----- src/windows/staff.c | 7 +++---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/windows/guest.c b/src/windows/guest.c index 722522e746..9ede943524 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -1101,11 +1101,10 @@ void window_guest_overview_text_input(rct_window *w, int widgetIndex, char *text if (text == NULL) return; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = 0x5AE; - - game_do_command(1, 1, w->number, *text, 22, *(text + 2), *(text + 1)); - game_do_command(2, 1, 0, *(text + 3), 22, *(text + 5), *(text + 4)); - game_do_command(0, 1, 0, *(text + 6), 22, *(text + 8), *(text + 7)); + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = 1454; + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 0)), GAME_COMMAND_SET_PEEP_NAME, *((int*)(text + 8)), *((int*)(text + 4))); + game_do_command(2, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 12)), GAME_COMMAND_SET_PEEP_NAME, *((int*)(text + 20)), *((int*)(text + 16))); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 24)), GAME_COMMAND_SET_PEEP_NAME, *((int*)(text + 32)), *((int*)(text + 28))); } /* rct2: 0x696A5F */ diff --git a/src/windows/staff.c b/src/windows/staff.c index 8f185db156..141ddc6b64 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -1162,10 +1162,9 @@ void window_staff_overview_text_input(rct_window *w, int widgetIndex, char *text return; RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = 2979; - - game_do_command(1, 1, w->number, *text, GAME_COMMAND_SET_PEEP_NAME, *(text + 2), *(text + 1)); - game_do_command(2, 1, 0, *(text + 3), GAME_COMMAND_SET_PEEP_NAME, *(text + 5), *(text + 4)); - game_do_command(0, 1, 0, *(text + 6), GAME_COMMAND_SET_PEEP_NAME, *(text + 8), *(text + 7)); + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 0)), GAME_COMMAND_SET_PEEP_NAME, *((int*)(text + 8)), *((int*)(text + 4))); + game_do_command(2, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 12)), GAME_COMMAND_SET_PEEP_NAME, *((int*)(text + 20)), *((int*)(text + 16))); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 24)), GAME_COMMAND_SET_PEEP_NAME, *((int*)(text + 32)), *((int*)(text + 28))); } /* rct2: 0x006BE5FC */ From 4a16573786efe470732d9ee23157cea25d80c703 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 20 Jul 2015 20:25:05 +0100 Subject: [PATCH 0334/1173] fix cast warning --- src/windows/maze_construction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index 9e68c4dd3e..4f11f5bd2f 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -190,7 +190,7 @@ static void window_maze_construction_entrance_mouseup(rct_window *w, int widgetI return; RCT2_GLOBAL(0x00F44191, uint8) = widgetIndex == WIDX_MAZE_ENTRANCE ? 0 : 1; - RCT2_GLOBAL(0x00F44192, uint8) = w->number; + RCT2_GLOBAL(0x00F44192, uint8) = (uint8)w->number; RCT2_GLOBAL(0x00F44193, uint8) = 0; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) |= INPUT_FLAG_6; From b94d77ccae099561d080208364b1ed7ae33194dc Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 20 Jul 2015 20:49:56 +0100 Subject: [PATCH 0335/1173] Fix issue where saving would close toolbar. Fixes 1537. Issue was caused by the window order being changed further down a function call. This meant all pointers to windows were invalid. --- src/windows/loadsave.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index baa9ae3273..286caeca65 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -758,8 +758,7 @@ static void window_loadsave_select(rct_window *w, const char *path) int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 1 : 0); SDL_RWclose(rw); if (success) { - window_close(w); - + window_close_by_class(WC_LOADSAVE); game_do_command(0, 1047, 0, -1, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); gfx_invalidate_screen(); } else { @@ -786,7 +785,7 @@ static void window_loadsave_select(rct_window *w, const char *path) int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); SDL_RWclose(rw); if (success) { - window_close(w); + window_close_by_class(WC_LOADSAVE); gfx_invalidate_screen(); } else { window_error_open(STR_SAVE_LANDSCAPE, 1049); @@ -810,7 +809,7 @@ static void window_loadsave_select(rct_window *w, const char *path) RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) = parkFlagsBackup; if (success) { - window_close(w); + window_close_by_class(WC_LOADSAVE); title_load(); } else { window_error_open(STR_SAVE_SCENARIO, STR_SCENARIO_SAVE_FAILED); @@ -913,7 +912,9 @@ static void window_overwrite_prompt_mouseup(rct_window *w, int widgetIndex) loadsaveWindow = window_find_by_class(WC_LOADSAVE); if (loadsaveWindow != NULL) window_loadsave_select(loadsaveWindow, _window_overwrite_prompt_path); - window_close(w); + // As the window_loadsave_select function can change the order of the + // windows we can't use window_close(w). + window_close_by_class(WC_LOADSAVE_OVERWRITE_PROMPT); break; case WIDX_OVERWRITE_CANCEL: case WIDX_OVERWRITE_CLOSE: From 519937c9624f503dd90fdf6a32b0df137a4d8db2 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 21 Jul 2015 14:39:30 +0100 Subject: [PATCH 0336/1173] implement peep_should_use_cash_machine --- src/peep/peep.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 4d7ee944b4..6f2c96ebe2 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -52,7 +52,7 @@ static void sub_693C9E(rct_peep *peep); static void peep_spend_money(rct_peep *peep, money16 *peep_expend_type, money32 amount); static void sub_695444(rct_peep *peep, int rideIndex, int flags); static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price); -static bool sub_69AEB7(rct_peep *peep, int rideIndex); +static bool peep_should_use_cash_machine(rct_peep *peep, int rideIndex); static void sub_69A98C(rct_peep *peep); static void sub_68FD3A(rct_peep *peep); static bool sub_690B99(rct_peep *peep, int edge, uint8 *rideToView, uint8 *rideSeatToView); @@ -3977,7 +3977,7 @@ static void peep_update_buying(rct_peep* peep) if (peep->current_ride != peep->previous_ride){ if (ride->type == RIDE_TYPE_CASH_MACHINE){ - item_bought = sub_69AEB7(peep, peep->current_ride); + item_bought = peep_should_use_cash_machine(peep, peep->current_ride); if (!item_bought) { peep->previous_ride = peep->current_ride; peep->previous_ride_time_out = 0; @@ -6005,9 +6005,20 @@ static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 pric * * rct2: 0x0069AEB7 */ -static bool sub_69AEB7(rct_peep *peep, int rideIndex) +static bool peep_should_use_cash_machine(rct_peep *peep, int rideIndex) { - return !(RCT2_CALLPROC_X(0x0069AEB7, rideIndex << 8, 0, 0, 0, (int)peep, 0, 0) & 0x100); + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) return false; + if (peep->flags & PEEP_FLAGS_LEAVING_PARK) return false; + if (peep->cash_in_pocket > MONEY(20,00)) return false; + if (115 + (scenario_rand() % 128) > peep->happiness) return false; + if (peep->energy < 80) return false; + + rct_ride *ride = GET_RIDE(rideIndex); + ride_update_satisfaction(ride, peep->happiness >> 6); + ride->var_120++; + ride->total_customers++; + ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_CUSTOMER; + return true; } /** @@ -6016,7 +6027,7 @@ static bool sub_69AEB7(rct_peep *peep, int rideIndex) */ static void sub_69A98C(rct_peep *peep) { - RCT2_CALLPROC_X(0x0069A98C, 0, 0, 0, 0, (int)peep, 0, 0); + peep->var_CC = 0xFFFFFFFF; } /** From f35c23bb684af096f6b312ab0168e3d8b1a0ad62 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 21 Jul 2015 15:02:53 +0100 Subject: [PATCH 0337/1173] implement window_maze_construction_update --- src/ride/ride.h | 1 + src/windows/maze_construction.c | 29 ++++++++++++++++++++++++++++- src/windows/ride_construction.c | 1 - 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/ride/ride.h b/src/ride/ride.h index d10844e11d..a1c917a321 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -973,5 +973,6 @@ void sub_6CB945(int rideIndex); void ride_crash(int rideIndex, int vehicleIndex); bool ride_type_is_intamin(int rideType); +void sub_6C94D8(); #endif diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index 4f11f5bd2f..9c5c7b63e4 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -251,7 +251,34 @@ static void window_maze_construction_mousedown(int widgetIndex, rct_window *w, r */ static void window_maze_construction_update(rct_window *w) { - RCT2_CALLPROC_X(0x006CD767, 0, 0, 0, 0, (int)w, 0, 0); + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_PLACE: + if (!widget_is_active_tool(w, WIDX_MAZE_DIRECTION_GROUPBOX)) { + window_close(w); + return; + } + break; + case RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT: + if (!widget_is_active_tool(w, WIDX_MAZE_ENTRANCE) && !widget_is_active_tool(w, WIDX_MAZE_EXIT)) { + _rideConstructionState = RCT2_GLOBAL(0x00F440CC, uint8); + window_maze_construction_update_pressed_widgets(); + } + break; + } + + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_FRONT: + case RIDE_CONSTRUCTION_STATE_BACK: + case RIDE_CONSTRUCTION_STATE_SELECTED: + if ( + (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint8) & INPUT_FLAG_TOOL_ACTIVE) && + RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) == WC_RIDE_CONSTRUCTION + ) { + tool_cancel(); + } + break; + } + sub_6C94D8(); } /** diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index d5028653bf..4b418a4aa2 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -463,7 +463,6 @@ static void window_ride_construction_draw_track_piece( int width, int height ); static void window_ride_construction_update_enabled_track_pieces(); -void sub_6C94D8(); static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *properties); static void sub_6CBCE2( int rideIndex, int trackType, int trackDirection, int edx, From d3742319b365235734d652c61647262530448add Mon Sep 17 00:00:00 2001 From: LRFLEW Date: Tue, 21 Jul 2015 13:15:11 -0500 Subject: [PATCH 0338/1173] Fix #1654 --- src/world/footpath.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/world/footpath.c b/src/world/footpath.c index a4943c1ee6..2426cac8fc 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -926,7 +926,7 @@ static bool sub_footpath_disconnect_queue_from_path(int x, int y, rct_map_elemen static bool footpath_disconnect_queue_from_path(int x, int y, rct_map_element *mapElement, int action) { if (!footpath_element_is_queue(mapElement)) return false; - if (mapElement->properties.path.type & 4) return false; + if (footpath_element_is_sloped(mapElement)) return false; uint8 c = RCT2_ADDRESS(0x0098D7F0, uint8)[mapElement->properties.path.edges & 0x0F]; if ((action < 0) ? (c >= 2) : (c < 2)) return false; @@ -972,7 +972,7 @@ static void loc_6A6D7E( } } if (z - 2 == mapElement->base_height) { - if (!footpath_element_is_sloped(mapElement) && footpath_element_get_slope_direction(mapElement) != (direction ^ 2)) { + if (!footpath_element_is_sloped(mapElement) || footpath_element_get_slope_direction(mapElement) != (direction ^ 2)) { return; } goto loc_6A6F1F; From 18e492b89851db5c5c32799fcd349c1bb32595f4 Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 22 Jul 2015 04:00:14 +0100 Subject: [PATCH 0339/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 530 +++++++++++++------------- 1 file changed, 266 insertions(+), 264 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 7f8f99cdbd..0466ea524a 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -4,41 +4,41 @@ STR_0000 : STR_0001 :{STRINGID} {COMMA16} STR_0002 :Spiral Roller Coaster -STR_0003 :Stand-up Roller Coaster +STR_0003 :站立式雲霄飛車 STR_0004 :Suspended Swinging Coaster STR_0005 :Inverted Roller Coaster STR_0006 :Junior Roller Coaster -STR_0007 :Miniature Railway -STR_0008 :Monorail +STR_0007 :小火車 +STR_0008 :單軌電車 STR_0009 :Mini Suspended Coaster -STR_0010 :Boat Ride +STR_0010 :小船出租 STR_0011 :Wooden Wild Mouse STR_0012 :Steeplechase STR_0013 :Car Ride -STR_0014 :Launched Freefall +STR_0014 :自由落體 STR_0015 :Bobsleigh Coaster -STR_0016 :Observation Tower +STR_0016 :觀景塔 STR_0017 :Looping Roller Coaster -STR_0018 :Dinghy Slide +STR_0018 :滑水道 STR_0019 :Mine Train Coaster STR_0020 :纜車 STR_0021 :Corkscrew Roller Coaster STR_0022 :迷宮 STR_0023 :Spiral Slide -STR_0024 :Go Karts -STR_0025 :Log Flume -STR_0026 :River Rapids -STR_0027 :Dodgems -STR_0028 :Pirate Ship +STR_0024 :小型賽車 +STR_0025 :運木水道 +STR_0026 :激流船 +STR_0027 :碰碰車 +STR_0028 :海盜船 STR_0029 :Swinging Inverter Ship -STR_0030 :Food Stall +STR_0030 :食物店 STR_0031 :Unknown Stall (1D) -STR_0032 :Drink Stall +STR_0032 :飲料店 STR_0033 :Unknown Stall (1F) -STR_0034 :Shop +STR_0034 :商店 STR_0035 :旋轉木馬 STR_0036 :Unknown Stall (22) -STR_0037 :Information Kiosk +STR_0037 :訪客資訊中心 STR_0038 :廁所 STR_0039 :摩天輪 STR_0040 :Motion Simulator @@ -64,7 +64,7 @@ STR_0059 :Flying Roller Coaster STR_0060 :Unknown Ride (3A) STR_0061 :Virginia Reel STR_0062 :Splash Boats -STR_0063 :Mini Helicopters +STR_0063 :迷你直升機 STR_0064 :Lay-down Roller Coaster STR_0065 :Suspended Monorail STR_0066 :Unknown Ride (40) @@ -90,7 +90,7 @@ STR_0085 :Unknown Ride (53) STR_0086 :Unknown Ride (54) STR_0087 :Unknown Ride (55) STR_0088 :Inverted Impulse Coaster -STR_0089 :Mini Roller Coaster +STR_0089 :迷你雲霄飛車 STR_0090 :Mine Ride STR_0091 :Unknown Ride (59) STR_0092 :LIM Launched Roller Coaster @@ -983,6 +983,7 @@ STR_0978 :建造新的溫和類遊樂設施 STR_0979 :建造新的雲霄飛車 STR_0980 :建造新的剌激類遊樂設施 STR_0981 :建造新的水文類遊樂設施 +STR_0982 :建造新的商店及攤販 STR_0983 :研究及開發 STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP} @@ -999,8 +1000,8 @@ STR_0995 :{WINDOW_COLOUR_1}你確定要拆除整個{STRINGID}? STR_0996 :整體外觀 STR_0997 :{SMALLFONT}{BLACK}選擇檢視範圍 STR_0998 :此遊樂設施的車站數量已達到上限 -STR_0999 :需要一個車站站台 -STR_1000 :軌道並未完整連接 +STR_0999 :需要一個車站月台 +STR_1000 :軌道並未完整地連接好 STR_1001 :軌道不適合此類型的車卡 STR_1002 :不能開啟{POP16}{POP16}{POP16}{STRINGID}... STR_1003 :不能測試{POP16}{POP16}{POP16}{STRINGID}... @@ -1024,9 +1025,9 @@ STR_1020 :Can't make changes... STR_1021 :{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_1022 :{POP16}{POP16}{POP16}{COMMA16} car per train STR_1023 :{POP16}{POP16}{POP16}{COMMA16} cars per train -STR_1024 :{COMMA16} car per train -STR_1025 :{COMMA16} cars per train -STR_1026 :Station platform too long! +STR_1024 :每列車{COMMA16}車卡 +STR_1025 :每列車{COMMA16}車卡 +STR_1026 :車站月台太長! STR_1027 :{SMALLFONT}{BLACK}Locate this on Main View STR_1028 :Off edge of map! STR_1029 :Cannot build partly above and partly below water! @@ -1036,10 +1037,10 @@ STR_1032 :Can only build this on water! STR_1033 :Can only build this above ground! STR_1034 :Can only build this on land! STR_1035 :Local authority won't allow construction above tree-height! -STR_1036 :Load Game -STR_1037 :Load Landscape -STR_1038 :Convert saved game to scenario -STR_1039 :Install new track design +STR_1036 :載入遊戲 +STR_1037 :載入地型 +STR_1038 :將存檔轉換成劇情 +STR_1039 :安裝新軌道設計 STR_1040 :儲存遊戲 STR_1041 :儲存劇情 STR_1042 :儲存地型 @@ -1054,13 +1055,13 @@ STR_1050 :載入失敗...{NEWLINE}檔案中含有非法資料! STR_1051 :透明化支撐 STR_1052 :透明化遊客 STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park -STR_1054 :{SMALLFONT}{BLACK}Name ride/attraction -STR_1055 :{SMALLFONT}{BLACK}Name person -STR_1056 :{SMALLFONT}{BLACK}Name staff member -STR_1057 :Ride/attraction name -STR_1058 :Enter new name for this ride/attraction: -STR_1059 :Can't rename ride/attraction... -STR_1060 :Invalid ride/attraction name +STR_1054 :{SMALLFONT}{BLACK}命名遊樂設施/店鋪 +STR_1055 :{SMALLFONT}{BLACK}命名遊客 +STR_1056 :{SMALLFONT}{BLACK}命名員工 +STR_1057 :遊樂設施/店鋪名稱 +STR_1058 :請輸入這個遊樂設施/店鋪的新名稱: +STR_1059 :不能重命名遊樂設施/店鋪... +STR_1060 :不適合的遊樂設施/店鋪名稱 STR_1061 :正常模式 STR_1062 :連續巡迴模式 STR_1063 :Reverse-Incline launched shuttle 模式 @@ -1180,17 +1181,17 @@ STR_1176 :Can't build footpath here... STR_1177 :Can't remove footpath from here... STR_1178 :Land slope unsuitable STR_1179 :Footpath in the way -STR_1180 :Can't build this underwater! -STR_1181 :Footpaths -STR_1182 :Type -STR_1183 :Direction -STR_1184 :Slope -STR_1185 :{SMALLFONT}{BLACK}Direction -STR_1186 :{SMALLFONT}{BLACK}Slope down -STR_1187 :{SMALLFONT}{BLACK}Level -STR_1188 :{SMALLFONT}{BLACK}Slope up -STR_1189 :{SMALLFONT}{BLACK}Construct the selected footpath section -STR_1190 :{SMALLFONT}{BLACK}Remove previous footpath section +STR_1180 :不能建造此於水底! +STR_1181 :道路 +STR_1182 :類別 +STR_1183 :方向 +STR_1184 :坡道 +STR_1185 :{SMALLFONT}{BLACK}方向 +STR_1186 :{SMALLFONT}{BLACK}下坡 +STR_1187 :{SMALLFONT}{BLACK}水平 +STR_1188 :{SMALLFONT}{BLACK}上坡 +STR_1189 :{SMALLFONT}{BLACK}建造此被選中的道路 +STR_1190 :{SMALLFONT}{BLACK}移除上一段道路 STR_1191 :{BLACK}{STRINGID} STR_1192 :{OUTLINE}{RED}{STRINGID} STR_1193 :{WINDOW_COLOUR_2}{STRINGID} @@ -1229,20 +1230,20 @@ STR_1225 :{SMALLFONT}{BLACK}雲霄飛車 STR_1226 :{SMALLFONT}{BLACK}剌激類遊樂設施 STR_1227 :{SMALLFONT}{BLACK}水文類遊樂設施 STR_1228 :{SMALLFONT}{BLACK}商店及攤販 -STR_1229 :train -STR_1230 :trains -STR_1231 :Train -STR_1232 :Trains -STR_1233 :{COMMA16} train -STR_1234 :{COMMA16} trains -STR_1235 :Train {COMMA16} +STR_1229 :列車 +STR_1230 :列車 +STR_1231 :列車 +STR_1232 :列車 +STR_1233 :{COMMA16}列車 +STR_1234 :{COMMA16}列車 +STR_1235 :列車{COMMA16} STR_1236 :小船 STR_1237 :小船 STR_1238 :小船 STR_1239 :小船 -STR_1240 :{COMMA16} 小船 -STR_1241 :{COMMA16} 小船 -STR_1242 :Boat {COMMA16} +STR_1240 :{COMMA16}小船 +STR_1241 :{COMMA16}小船 +STR_1242 :小船{COMMA16} STR_1243 :track STR_1244 :tracks STR_1245 :Track @@ -1254,23 +1255,23 @@ STR_1250 :船用月台 STR_1251 :船用月台 STR_1252 :船用月台 STR_1253 :船用月台 -STR_1254 :{COMMA16} 船用月台 -STR_1255 :{COMMA16} 船用月台 -STR_1256 :船用月台 {COMMA16} +STR_1254 :{COMMA16}船用月台 +STR_1255 :{COMMA16}船用月台 +STR_1256 :船用月台{COMMA16} STR_1257 :車站 STR_1258 :車站 STR_1259 :車站 STR_1260 :車站 -STR_1261 :{COMMA16} 車站 -STR_1262 :{COMMA16} 車站 -STR_1263 :車站 {COMMA16} -STR_1264 :car -STR_1265 :cars -STR_1266 :Car -STR_1267 :Cars -STR_1268 :{COMMA16} car -STR_1269 :{COMMA16} cars -STR_1270 :Car {COMMA16} +STR_1261 :{COMMA16}車站 +STR_1262 :{COMMA16}車站 +STR_1263 :車站{COMMA16} +STR_1264 :車輛 +STR_1265 :車輛 +STR_1266 :車輛 +STR_1267 :車輛 +STR_1268 :{COMMA16}車輛 +STR_1269 :{COMMA16}車輛 +STR_1270 :車輛{COMMA16} STR_1271 :building STR_1272 :buildings STR_1273 :Building @@ -1327,7 +1328,7 @@ STR_1323 :Courses STR_1324 :{COMMA16} course STR_1325 :{COMMA16} courses STR_1326 :Course {COMMA16} -STR_1327 :{SMALLFONT}{BLACK}Rotate objects by 90{DEGREE} +STR_1327 :{SMALLFONT}{BLACK}將物件旋轉90{DEGREE} STR_1328 :Level land required STR_1329 :{WINDOW_COLOUR_2}Launch speed: STR_1330 :{SMALLFONT}{BLACK}Maximum speed when leaving station @@ -1335,19 +1336,19 @@ STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VEL STR_1332 :{VELOCITY} STR_1333 :{STRINGID} - {STRINGID}{POP16} STR_1334 :{STRINGID} - {STRINGID} {COMMA16} -STR_1335 :{STRINGID} - Entrance{POP16}{POP16} -STR_1336 :{STRINGID} - Station {POP16}{COMMA16} Entrance -STR_1337 :{STRINGID} - Exit{POP16}{POP16} -STR_1338 :{STRINGID} - Station {POP16}{COMMA16} Exit +STR_1335 :{STRINGID} - 入口{POP16}{POP16} +STR_1336 :{STRINGID} - 車站{POP16}{COMMA16}入口 +STR_1337 :{STRINGID} - 出口{POP16}{POP16} +STR_1338 :{STRINGID} - 車站{POP16}{COMMA16}出口 STR_1339 :{BLACK}暫無測試結果... -STR_1340 :{WINDOW_COLOUR_2}Max. speed: {BLACK}{VELOCITY} -STR_1341 :{WINDOW_COLOUR_2}Ride time: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1340 :{WINDOW_COLOUR_2}最高速度: {BLACK}{VELOCITY} +STR_1341 :{WINDOW_COLOUR_2}遊玩時間: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} STR_1342 :{DURATION} STR_1343 :{DURATION} / -STR_1344 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1344 :{WINDOW_COLOUR_2}軌道長度: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} STR_1345 :{LENGTH} STR_1346 :{LENGTH} / -STR_1347 :{WINDOW_COLOUR_2}Average speed: {BLACK}{VELOCITY} +STR_1347 :{WINDOW_COLOUR_2}平均速度: {BLACK}{VELOCITY} STR_1348 :{WINDOW_COLOUR_2}Max. positive vertical G's: {BLACK}{COMMA2DP32}g STR_1349 :{WINDOW_COLOUR_2}Max. positive vertical G's: {OUTLINE}{RED}{COMMA2DP32}g STR_1350 :{WINDOW_COLOUR_2}Max. negative vertical G's: {BLACK}{COMMA2DP32}g @@ -1361,7 +1362,7 @@ STR_1357 :{WINDOW_COLOUR_2}Holes: {BLACK}{COMMA16} STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs STR_1359 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minute STR_1360 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minutes -STR_1361 :Can't change speed... +STR_1361 :不能改變速度... STR_1362 :不能改變發車速度... STR_1363 :Too high for supports! STR_1364 :Supports for track above can't be extended any further! @@ -1379,15 +1380,15 @@ STR_1375 :Upper Transfer STR_1376 :Lower Transfer STR_1377 :橫滾軌道 (向左) STR_1378 :橫滾軌道 (向右) -STR_1379 :Reverser (向左) -STR_1380 :Reverser (向右) +STR_1379 :逆向裝置 (向左) +STR_1380 :逆向裝置 (向右) STR_1381 :彎型的鏈條坡道 (向左) STR_1382 :彎型的鏈條坡道 (向右) -STR_1383 :Quarter Loop +STR_1383 :四分之一迴環 STR_1384 :{YELLOW}{STRINGID} STR_1385 :{SMALLFONT}{BLACK}Other track configurations -STR_1386 :Special... -STR_1387 :Can't change land type... +STR_1386 :特殊軌道... +STR_1387 :不能改變土地類型... STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} STR_1389 :{OUTLINE}{RED}- {CURRENCY} STR_1390 :{CURRENCY2DP} @@ -1407,11 +1408,11 @@ STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction STR_1404 :{SMALLFONT}{BLACK}90{DEGREE}旋轉 STR_1405 :{SMALLFONT}{BLACK}Mirror image STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) -STR_1407 :{WINDOW_COLOUR_2}Build this... -STR_1408 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} +STR_1407 :{WINDOW_COLOUR_2}建造此軌道... +STR_1408 :{WINDOW_COLOUR_2}費用: {BLACK}{CURRENCY} STR_1409 :Entry/Exit Platform STR_1410 :Vertical Tower -STR_1411 :{STRINGID} in the way +STR_1411 :{STRINGID}擋在路中 STR_1412 :{WINDOW_COLOUR_3}Data logging not available for this type of ride STR_1413 :{WINDOW_COLOUR_3}Data logging will start when next {STRINGID} leaves {STRINGID} STR_1414 :{SMALLFONT}{BLACK}{DURATION} @@ -1433,7 +1434,7 @@ STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} STR_1430 :免費 STR_1431 :行走中 STR_1432 :前往{STRINGID}中 -STR_1433 :輪侯{STRINGID}中 +STR_1433 :輪候{STRINGID}中 STR_1434 :溺水中 STR_1435 :On {STRINGID} STR_1436 :In {STRINGID} @@ -1498,7 +1499,7 @@ STR_1494 :{SMALLFONT}{OPENQUOTES}我還未渴{ENDQUOTES} STR_1495 :{SMALLFONT}{OPENQUOTES}救命! 我快要溺死了!{ENDQUOTES} STR_1496 :{SMALLFONT}{OPENQUOTES}我迷路了!{ENDQUOTES} STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID}真棒{ENDQUOTES} -STR_1498 :{SMALLFONT}{OPENQUOTES}我輪侯{STRINGID}很長時間了{ENDQUOTES} +STR_1498 :{SMALLFONT}{OPENQUOTES}我輪候{STRINGID}很長時間了{ENDQUOTES} STR_1499 :{SMALLFONT}{OPENQUOTES}我累了{ENDQUOTES} STR_1500 :{SMALLFONT}{OPENQUOTES}我餓了{ENDQUOTES} STR_1501 :{SMALLFONT}{OPENQUOTES}我渴了{ENDQUOTES} @@ -1594,8 +1595,8 @@ STR_1590 :{SMALLFONT}{OPENQUOTES}這個由{STRINGID}購買的漏斗蛋糕真 STR_1591 :{SMALLFONT}{OPENQUOTES}這副由{STRINGID}購買的太陽眼鏡真的是超值{ENDQUOTES} STR_1592 :{SMALLFONT}{OPENQUOTES}這份由{STRINGID}購買的牛肉麵真的是超值{ENDQUOTES} STR_1593 :{SMALLFONT}{OPENQUOTES}這份由{STRINGID}購買的炒米粉真的是超值{ENDQUOTES} -STR_1594 :{SMALLFONT}{OPENQUOTES}這份由{STRINGID}購買的湯雲吞真的是超值{ENDQUOTES} -STR_1595 :{SMALLFONT}{OPENQUOTES}這份由{STRINGID}購買的肉丸湯真的是超值{ENDQUOTES} +STR_1594 :{SMALLFONT}{OPENQUOTES}這客由{STRINGID}購買的湯雲吞真的是超值{ENDQUOTES} +STR_1595 :{SMALLFONT}{OPENQUOTES}這客由{STRINGID}購買的肉丸湯真的是超值{ENDQUOTES} STR_1596 :{SMALLFONT}{OPENQUOTES}這杯由{STRINGID}購買的果汁真的是超值{ENDQUOTES} STR_1597 :{SMALLFONT}{OPENQUOTES}這杯由{STRINGID}購買的豆漿真的是超值{ENDQUOTES} STR_1598 :{SMALLFONT}{OPENQUOTES}這杯由{STRINGID}購買的水正果真的是超值{ENDQUOTES} @@ -1616,27 +1617,27 @@ STR_1612 : STR_1613 : STR_1614 : STR_1615 : -STR_1616 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} -STR_1617 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} -STR_1618 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} -STR_1619 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a pretzel from {STRINGID}{ENDQUOTES} -STR_1620 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for hot chocolate from {STRINGID}{ENDQUOTES} -STR_1621 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for iced tea from {STRINGID}{ENDQUOTES} -STR_1622 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a funnel cake from {STRINGID}{ENDQUOTES} -STR_1623 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sunglasses from {STRINGID}{ENDQUOTES} -STR_1624 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for beef noodles from {STRINGID}{ENDQUOTES} -STR_1625 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried rice noodles from {STRINGID}{ENDQUOTES} -STR_1626 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for wonton soup from {STRINGID}{ENDQUOTES} -STR_1627 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for meatball soup from {STRINGID}{ENDQUOTES} -STR_1628 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fruit juice from {STRINGID}{ENDQUOTES} -STR_1629 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for soybean milk from {STRINGID}{ENDQUOTES} -STR_1630 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sujongkwa from {STRINGID}{ENDQUOTES} -STR_1631 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a sub sandwich from {STRINGID}{ENDQUOTES} -STR_1632 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cookie from {STRINGID}{ENDQUOTES} +STR_1616 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一張即時照片{ENDQUOTES} +STR_1617 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一張即時照片{ENDQUOTES} +STR_1618 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一張即時照片{ENDQUOTES} +STR_1619 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一件椒鹽卷餅{ENDQUOTES} +STR_1620 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一杯熱巧克力{ENDQUOTES} +STR_1621 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一杯冰紅茶{ENDQUOTES} +STR_1622 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一個漏斗蛋糕{ENDQUOTES} +STR_1623 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一副太陽眼鏡{ENDQUOTES} +STR_1624 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一份牛肉麵{ENDQUOTES} +STR_1625 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一份炒米粉{ENDQUOTES} +STR_1626 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一客湯雲吞{ENDQUOTES} +STR_1627 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一客肉丸湯{ENDQUOTES} +STR_1628 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一杯果汁{ENDQUOTES} +STR_1629 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一杯豆漿{ENDQUOTES} +STR_1630 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一杯水正果{ENDQUOTES} +STR_1631 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一件潛艇三文治{ENDQUOTES} +STR_1632 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一件曲奇{ENDQUOTES} STR_1633 : STR_1634 : STR_1635 : -STR_1636 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a roast sausage from {STRINGID}{ENDQUOTES} +STR_1636 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一條烤香腸{ENDQUOTES} STR_1637 : STR_1638 : STR_1639 : @@ -1648,30 +1649,30 @@ STR_1644 : STR_1645 : STR_1646 : STR_1647 : -STR_1648 :{SMALLFONT}{OPENQUOTES}Help! Put me down!{ENDQUOTES} -STR_1649 :{SMALLFONT}{OPENQUOTES}I'm running out of cash!{ENDQUOTES} -STR_1650 :{SMALLFONT}{OPENQUOTES}Wow! A new ride being built!{ENDQUOTES} -STR_1651 :{SMALLFONT}{OPENQUOTES}Nice ride! But not as good as the Phoenix...{ENDQUOTES} -STR_1652 :{SMALLFONT}{OPENQUOTES}I'm so excited - It's an Intamin ride!{ENDQUOTES} -STR_1653 :{SMALLFONT}{OPENQUOTES}...and here we are on {STRINGID}!{ENDQUOTES} -STR_1654 :{WINDOW_COLOUR_2}Recent thoughts: -STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land -STR_1656 :{SMALLFONT}{BLACK}Construct bridge or tunnel footpath -STR_1657 :{WINDOW_COLOUR_2}Preferred ride -STR_1658 :{WINDOW_COLOUR_2}intensity: {BLACK}less than {COMMA16} -STR_1659 :{WINDOW_COLOUR_2}intensity: {BLACK}between {COMMA16} and {COMMA16} -STR_1660 :{WINDOW_COLOUR_2}intensity: {BLACK}more than {COMMA16} -STR_1661 :{WINDOW_COLOUR_2}Nausea tolerance: {BLACK}{STRINGID} -STR_1662 :{WINDOW_COLOUR_2}Happiness: -STR_1663 :{WINDOW_COLOUR_2}Nausea: -STR_1664 :{WINDOW_COLOUR_2}Energy: -STR_1665 :{WINDOW_COLOUR_2}Hunger: -STR_1666 :{WINDOW_COLOUR_2}Thirst: -STR_1667 :{WINDOW_COLOUR_2}Bathroom: -STR_1668 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}Unknown -STR_1669 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}{COMMA16}% -STR_1670 :{WINDOW_COLOUR_2}Total customers: {BLACK}{COMMA32} -STR_1671 :{WINDOW_COLOUR_2}Total profit: {BLACK}{CURRENCY2DP} +STR_1648 :{SMALLFONT}{OPENQUOTES}救命! 放我下去!{ENDQUOTES} +STR_1649 :{SMALLFONT}{OPENQUOTES}我花光了我身上所有的錢了!{ENDQUOTES} +STR_1650 :{SMALLFONT}{OPENQUOTES}嘩! 嶄新的遊樂設施在建造中呢!{ENDQUOTES} +STR_1651 :{SMALLFONT}{OPENQUOTES}這個遊樂設施不錯喔! 只是比起Phoneix還是差一截呢...{ENDQUOTES} +STR_1652 :{SMALLFONT}{OPENQUOTES}我好興奮 - 因為這是Intamin創造的遊樂設施!{ENDQUOTES} +STR_1653 :{SMALLFONT}{OPENQUOTES}...然而, 現在我們已經在{STRINGID}之上!{ENDQUOTES} +STR_1654 :{WINDOW_COLOUR_2}最近的想法: +STR_1655 :{SMALLFONT}{BLACK}在地上建造道路 +STR_1656 :{SMALLFONT}{BLACK}建造橋樑或隧道 +STR_1657 :{WINDOW_COLOUR_2}遊樂設施偏好 +STR_1658 :{WINDOW_COLOUR_2}刺激度: {BLACK}少於{COMMA16} +STR_1659 :{WINDOW_COLOUR_2}刺激度: {BLACK}介乎{COMMA16}及{COMMA16}之間 +STR_1660 :{WINDOW_COLOUR_2}刺激度: {BLACK}高於{COMMA16} +STR_1661 :{WINDOW_COLOUR_2}噁心忍受程度: {BLACK}{STRINGID} +STR_1662 :{WINDOW_COLOUR_2}快樂度: +STR_1663 :{WINDOW_COLOUR_2}噁心度: +STR_1664 :{WINDOW_COLOUR_2}體力: +STR_1665 :{WINDOW_COLOUR_2}飢餓度: +STR_1666 :{WINDOW_COLOUR_2}口渴度: +STR_1667 :{WINDOW_COLOUR_2}如廁度: +STR_1668 :{WINDOW_COLOUR_2}滿意度: {BLACK}未知 +STR_1669 :{WINDOW_COLOUR_2}滿意度: {BLACK}{COMMA16}% +STR_1670 :{WINDOW_COLOUR_2}總乘客數: {BLACK}{COMMA32} +STR_1671 :{WINDOW_COLOUR_2}總利潤: {BLACK}{CURRENCY2DP} STR_1672 :Brakes STR_1673 :Spinning Control Toggle Track STR_1674 :Brake speed @@ -1813,19 +1814,19 @@ STR_1809 :{WINDOW_COLOUR_2}Current breakdown: {OUTLINE}{RED}{STRINGID} STR_1810 :{WINDOW_COLOUR_2}Carrying: STR_1811 :Can't build this here... STR_1812 :{SMALLFONT}{BLACK}{STRINGID} -STR_1813 :Miscellaneous Objects -STR_1814 :Actions -STR_1815 :Thoughts -STR_1816 :{SMALLFONT}{BLACK}Select information type to show in guest list +STR_1813 :其他物件 +STR_1814 :動作 +STR_1815 :想法 +STR_1816 :{SMALLFONT}{BLACK}選擇遊客列表中要顯示的資訊類別 STR_1817 :({COMMA16}) -STR_1818 :{WINDOW_COLOUR_2}All guests -STR_1819 :{WINDOW_COLOUR_2}All guests (summarised) -STR_1820 :{WINDOW_COLOUR_2}Guests {STRINGID} -STR_1821 :{WINDOW_COLOUR_2}Guests thinking {STRINGID} -STR_1822 :{WINDOW_COLOUR_2}Guests thinking about {POP16}{STRINGID} -STR_1823 :{SMALLFONT}{BLACK}Show guests' thoughts about this ride/attraction -STR_1824 :{SMALLFONT}{BLACK}Show guests on this ride/attraction -STR_1825 :{SMALLFONT}{BLACK}Show guests queuing for this ride/attraction +STR_1818 :{WINDOW_COLOUR_2}所有遊客 +STR_1819 :{WINDOW_COLOUR_2}所有遊客 (總匯) +STR_1820 :{WINDOW_COLOUR_2}{STRINGID}的遊客 +STR_1821 :{WINDOW_COLOUR_2}在想{STRINGID}的遊客 +STR_1822 :{WINDOW_COLOUR_2}在想{POP16}{STRINGID}的遊客 +STR_1823 :{SMALLFONT}{BLACK}顯示遊客對此遊樂設施/店面的想法 +STR_1824 :{SMALLFONT}{BLACK}顯示在使用此遊樂設施/店面的遊客 +STR_1825 :{SMALLFONT}{BLACK}顯示在輪候此遊樂設施/店面的遊客 STR_1826 :狀態 STR_1827 :人氣度 STR_1828 :滿意度 @@ -2368,27 +2369,27 @@ STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off STR_2365 :The bank refuses to increase your loan! STR_2366 :Celsius ({DEGREE}C) STR_2367 :Fahrenheit (F) -STR_2368 :None -STR_2369 :Low -STR_2370 :Average -STR_2371 :High -STR_2372 :Low -STR_2373 :Medium -STR_2374 :High -STR_2375 :Very high -STR_2376 :Extreme -STR_2377 :Ultra-Extreme +STR_2368 :無 +STR_2369 :低 +STR_2370 :普通 +STR_2371 :高 +STR_2372 :低 +STR_2373 :中 +STR_2374 :高 +STR_2375 :很高 +STR_2376 :極端 +STR_2377 :超極端 STR_2378 :{SMALLFONT}{BLACK}Adjust smaller area of land STR_2379 :{SMALLFONT}{BLACK}Adjust larger area of land STR_2380 :{SMALLFONT}{BLACK}Adjust smaller area of water STR_2381 :{SMALLFONT}{BLACK}Adjust larger area of water STR_2382 :Land STR_2383 :Water -STR_2384 :{WINDOW_COLOUR_2}Your objective: -STR_2385 :{BLACK}None +STR_2384 :{WINDOW_COLOUR_2}你的目標: +STR_2385 :{BLACK}無 STR_2386 :{BLACK}To have at least {COMMA16} guests in your park at the end of {MONTHYEAR}, with a park rating of at least 600 STR_2387 :{BLACK}To achieve a park value of at least {POP16}{POP16}{CURRENCY} at the end of {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} -STR_2388 :{BLACK}Have Fun! +STR_2388 :{BLACK}盡情玩吧! STR_2389 :{BLACK}Build the best {STRINGID} you can! STR_2390 :{BLACK}To have 10 different types of roller coasters operating in your park, each with an excitement value of at least 6.00 STR_2391 :{BLACK}To have at least {COMMA16} guests in your park. You must not let the park rating drop below 700 at any time! @@ -2496,7 +2497,7 @@ STR_2492 :{SMALLFONT}{BLACK}Set all keyboard shortcuts back to default settin STR_2493 :Close top-most window STR_2494 :Close all floating windows STR_2495 :Cancel construction mode -STR_2496 :Pause game +STR_2496 :暫停遊戲 STR_2497 :Zoom view out STR_2498 :Zoom view in STR_2499 :Rotate view clockwise @@ -2511,18 +2512,18 @@ STR_2507 :Invisible people toggle STR_2508 :Height marks on land toggle STR_2509 :Height marks on ride tracks toggle STR_2510 :Height marks on paths toggle -STR_2511 :Adjust land -STR_2512 :Adjust water -STR_2513 :Build scenery -STR_2514 :Build paths -STR_2515 :Build new ride -STR_2516 :Show financial information -STR_2517 :Show research information -STR_2518 :Show rides list -STR_2519 :Show park information -STR_2520 :Show guest list -STR_2521 :Show staff list -STR_2522 :Show recent messages +STR_2511 :調整土地 +STR_2512 :調整水面 +STR_2513 :建造景物 +STR_2514 :建造道路 +STR_2515 :建造新的遊樂設施 +STR_2516 :顯示財政狀況 +STR_2517 :顯示研發狀況 +STR_2518 :顯示遊樂設施/店面列表 +STR_2519 :顯示樂園狀況 +STR_2520 :顯示遊客列表 +STR_2521 :顯示員工列表 +STR_2522 :顯示最近訊息 STR_2523 :顯示地圖 STR_2524 :截圖 ### The following need to be reordered to match SDL_keycode layout. @@ -2739,7 +2740,7 @@ STR_2734 :{COMMA16}mph STR_2735 :{COMMA16}km/h STR_2736 :{MONTH}, Year {COMMA16} STR_2737 :{STRINGID} {MONTH}, Year {COMMA16} -STR_2738 :Title screen music: +STR_2738 :主選單音樂: STR_2739 :None STR_2740 :夢幻遊樂園 (RCT1) STR_2741 :模擬樂園 (RCT2) @@ -2767,18 +2768,18 @@ STR_2761 : STR_2762 : STR_2763 :??? STR_2764 : -STR_2765 :Large Tram -STR_2766 :Win scenario -STR_2767 :Freeze Climate -STR_2768 :Unfreeze Climate -STR_2769 :Open Park -STR_2770 :Close Park -STR_2771 :Slower Gamespeed -STR_2772 :Faster Gamespeed -STR_2773 :Windowed -STR_2774 :Fullscreen -STR_2775 :Fullscreen (desktop) -STR_2776 :Language: +STR_2765 :添加超多遊客到訪 +STR_2766 :贏得此劇情 +STR_2767 :靜止氣候 +STR_2768 :不再靜止氣候 +STR_2769 :開放樂園 +STR_2770 :關閉樂園 +STR_2771 :減慢遊戲速度 +STR_2772 :加快遊戲速度 +STR_2773 :視窗化 +STR_2774 :全螢幕 +STR_2775 :全螢幕 (桌面尺寸) +STR_2776 :語言: STR_2777 :{MOVE_X}{SMALLFONT}{STRING} STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} STR_2779 :Viewport #{COMMA16} @@ -2787,7 +2788,7 @@ STR_2780 :Extra viewport STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + -STR_2784 :Change keyboard shortcut +STR_2784 :更改鍵盤快捷鍵 STR_2785 :{WINDOW_COLOUR_2}Press new shortcut key for:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} STR_2786 :{SMALLFONT}{BLACK}Click on shortcut description to select new key STR_2787 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} @@ -2805,53 +2806,53 @@ STR_2798 :{SMALLFONT}{BLACK}Select whether to scroll the view when the mouse STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32} STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP} -STR_2802 :Map +STR_2802 :地圖 STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map STR_2805 :{SMALLFONT}{BLACK}Show map of park STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organizing them better STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organizing them better STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better -STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food -STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks -STR_2811 :{RED}Guests are complaining because they can't find the toilets in your park -STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around -STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests -STR_2814 :{WINDOW_COLOUR_2}Most untidy park award -STR_2815 :{WINDOW_COLOUR_2}Tidiest park award -STR_2816 :{WINDOW_COLOUR_2}Award for the park with the best roller coasters -STR_2817 :{WINDOW_COLOUR_2}Best value park award -STR_2818 :{WINDOW_COLOUR_2}Most beautiful park award -STR_2819 :{WINDOW_COLOUR_2}Worst value park award -STR_2820 :{WINDOW_COLOUR_2}Safest park award -STR_2821 :{WINDOW_COLOUR_2}Best staff award -STR_2822 :{WINDOW_COLOUR_2}Best park food award -STR_2823 :{WINDOW_COLOUR_2}Worst park food award -STR_2824 :{WINDOW_COLOUR_2}Best park toilets award -STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award -STR_2826 :{WINDOW_COLOUR_2}Best water rides award -STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award -STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride colour schemes award -STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award -STR_2830 :{WINDOW_COLOUR_2}Best gentle ride award -STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'! -STR_2832 :{TOPAZ}Your park has received an award for being 'The tidiest park in the country'! -STR_2833 :{TOPAZ}Your park has received an award for being 'The park with the best roller coasters'! -STR_2834 :{TOPAZ}Your park has received an award for being 'The best value park in the country'! -STR_2835 :{TOPAZ}Your park has received an award for being 'The most beautiful park in the country'! -STR_2836 :{TOPAZ}Your park has received an award for being 'The worst value park in the country'! -STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park in the country'! -STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! -STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! -STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! -STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best toilet facilities in the country'! -STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! -STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water rides in the country'! -STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed rides'! -STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of colour schemes'! -STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! -STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle rides'! -STR_2848 :{WINDOW_COLOUR_2}No recent awards +STR_2809 :{RED}遊客都餓了, 但他們找不到賣食物的店舖 +STR_2810 :{RED}遊客都渴了, 但他們找不到賣飲料的店舖 +STR_2811 :{RED}因為遊客都找不到樂園裡有廁所, 所以他們抱怨了 +STR_2812 :{RED}遊客都被卡住或迷失了{NEWLINE}請檢查樂園的道路設計是否需要改善, 以便遊客找到出路 +STR_2813 :{RED}你的樂園入場費太貴了!{NEWLINE}減低入場費或增加樂團價值來吸引更多遊客來訪 +STR_2814 :{WINDOW_COLOUR_2}最骯髒樂園獎 +STR_2815 :{WINDOW_COLOUR_2}最整潔樂園獎 +STR_2816 :{WINDOW_COLOUR_2}擁有最佳雲霄飛車獎 +STR_2817 :{WINDOW_COLOUR_2}最佳價值樂園獎 +STR_2818 :{WINDOW_COLOUR_2}最漂亮樂園獎 +STR_2819 :{WINDOW_COLOUR_2}最差價值樂園獎 +STR_2820 :{WINDOW_COLOUR_2}最安全樂園獎 +STR_2821 :{WINDOW_COLOUR_2}擁有最佳員工獎 +STR_2822 :{WINDOW_COLOUR_2}擁有最佳食物獎 +STR_2823 :{WINDOW_COLOUR_2}擁有最差食物獎 +STR_2824 :{WINDOW_COLOUR_2}擁有最佳廁所獎 +STR_2825 :{WINDOW_COLOUR_2}最令人失望樂園獎 +STR_2826 :{WINDOW_COLOUR_2}擁有最佳水文類遊樂設施獎 +STR_2827 :{WINDOW_COLOUR_2}擁有最佳自定設計的遊樂設施獎 +STR_2828 :{WINDOW_COLOUR_2}擁有最大膽的色彩選配獎 +STR_2829 :{WINDOW_COLOUR_2}擁有最令人迷失的道路獎 +STR_2830 :{WINDOW_COLOUR_2}擁有最佳溫和類遊樂設施獎 +STR_2831 :{TOPAZ}你的樂園剛獲得了'全國最骯髒樂園獎'! +STR_2832 :{TOPAZ}你的樂園剛獲得了'全國最整潔樂園獎'! +STR_2833 :{TOPAZ}你的樂園剛獲得了'擁有最佳雲霄飛車的樂園獎'! +STR_2834 :{TOPAZ}你的樂園剛獲得了'全國最佳價值樂園獎'! +STR_2835 :{TOPAZ}你的樂園剛獲得了'全國最漂亮樂園獎'! +STR_2836 :{TOPAZ}你的樂園剛獲得了'全國最差價值樂園獎'! +STR_2837 :{TOPAZ}你的樂園剛獲得了'全國最安全樂園獎'! +STR_2838 :{TOPAZ}你的樂園剛獲得了'擁有最佳員工的樂園獎'! +STR_2839 :{TOPAZ}你的樂園剛獲得了'擁有最佳食物的樂園獎'! +STR_2840 :{TOPAZ}你的樂園剛獲得了'擁有最差食物的樂園獎'! +STR_2841 :{TOPAZ}你的樂園剛獲得了'擁有最佳廁所的樂園獎'! +STR_2842 :{TOPAZ}你的樂園剛獲得了'全國最令人失望的樂園獎'! +STR_2843 :{TOPAZ}你的樂園剛獲得了'擁有最佳水文類遊樂設施的樂園獎'! +STR_2844 :{TOPAZ}你的樂園剛獲得了'擁有最佳自定設計的遊樂設施的樂園獎'! +STR_2845 :{TOPAZ}你的樂園剛獲得了'擁有最大膽的色彩選配的樂園獎'! +STR_2846 :{TOPAZ}你的樂園剛獲得了'擁有最令人迷失的道路的樂園獎'! +STR_2847 :{TOPAZ}你的樂園剛獲得了'擁有最佳溫和類遊樂設施的樂園獎'! +STR_2848 :{WINDOW_COLOUR_2}暫無獲得任何獎項 STR_2849 :New scenario installed successfully STR_2850 :New track design installed successfully STR_2851 :Scenario already installed @@ -2859,8 +2860,8 @@ STR_2852 :Track design already installed STR_2853 :Forbidden by the local authority! STR_2854 :{RED}Guests can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the ride exit -STR_2856 :{WINDOW_COLOUR_2}Tutorial -STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) +STR_2856 :{WINDOW_COLOUR_2}教學 +STR_2857 :{WINDOW_COLOUR_2}(按下任意鍵來獲取控制) STR_2858 :Can't start marketing campaign... STR_2859 :Another instance of RollerCoaster Tycoon 2 is already running STR_2860 :Infogrames Interactive credits... @@ -3403,44 +3404,44 @@ STR_3396 :{SMALLFONT}{BLACK}讓我們一起建造一個簡單的遊樂設施 STR_3397 :{SMALLFONT}{BLACK}白色的'鬼影'顯示著建造遊樂設施的地方. 我們移動滑鼠到一個位置, 然後按下左鍵即可建造該遊樂設施... STR_3398 :{SMALLFONT}{BLACK}遊樂設施需要一個入口及出口. 我們移動滑鼠到一個鄰近遊樂設施的方格, 然後按下左鍵即可建造入口, 然後重覆步驟建造出口... STR_3399 :{SMALLFONT}{BLACK}為了遊客能享用我們新落成的遊樂設施, 我們需要建造道路連接出入口... -STR_3400 :{SMALLFONT}{BLACK}入口的道路我們可以使用特別的'輪侯區'道路... +STR_3400 :{SMALLFONT}{BLACK}入口的道路我們可以使用特別的'輪候區'道路... STR_3401 :{SMALLFONT}{BLACK}至於離開道路, 任何'普通'道路皆可... STR_3402 :{SMALLFONT}{BLACK}大功告成, 我們可以開啟此遊樂設施了! 要開啟此遊樂設施, 我們需在遊樂設施視窗中按下旗幟圖標, 然後選擇'開啟'... STR_3403 :{SMALLFONT}{BLACK}但遊客們在哪? STR_3404 :{SMALLFONT}{BLACK}噢 - 樂園依然是關閉中! 好吧 - 我們去開放樂園... STR_3405 :{SMALLFONT}{BLACK}當我們等待第一批進入樂園的遊客之時, 先建造一些景物吧... -STR_3406 :{SMALLFONT}{BLACK}Here's our empty park. We're going to build a simple custom-designed ride... -STR_3407 :{SMALLFONT}{BLACK}First we need to choose a starting position... -STR_3408 :{SMALLFONT}{BLACK}The section of track we've just built is a 'station platform', to allow guests to get on and off the ride... -STR_3409 :{SMALLFONT}{BLACK}We'll extend the platform a bit by adding a couple more station platform sections... -STR_3410 :{SMALLFONT}{BLACK}The icons at the top of the construction window let you choose different track pieces to add... -STR_3411 :{SMALLFONT}{BLACK}We'll select a left-hand curve... -STR_3412 :{SMALLFONT}{BLACK}The curve hasn't been built yet, but the white ghost image shows where it will be built. Clicking the large 'build this' icon actually builds the track... -STR_3413 :{SMALLFONT}{BLACK}Now we want to build straight track, so we click the straight track icon... -STR_3414 :{SMALLFONT}{BLACK}Now that the circuit is complete, we need to build the ride entrance and exit... -STR_3415 :{SMALLFONT}{BLACK}Let's test our ride to check it works... -STR_3416 :{SMALLFONT}{BLACK}White it's being tested, we'll build the queue line and exit path... -STR_3417 :{SMALLFONT}{BLACK}OK - Let's open the park and the ride... -STR_3418 :{SMALLFONT}{BLACK}Our new ride isn't very exciting - Perhaps we should add some scenery? -STR_3419 :{SMALLFONT}{BLACK}To build scenery above other scenery or in mid-air, hold down the SHIFT key and move the mouse to select the height... -STR_3420 :{SMALLFONT}{BLACK}Some types of scenery can be re-painted after it's built... -STR_3421 :{SMALLFONT}{BLACK}Let's add some music to the ride... -STR_3422 :{SMALLFONT}{BLACK}Let's build a roller coaster ! -STR_3423 :{SMALLFONT}{BLACK}There are loads of pre-designed coasters, but we're going to build our own custom design... -STR_3424 :{SMALLFONT}{BLACK}That's the station platform built. Now we need a lift hill... -STR_3425 :{SMALLFONT}{BLACK}Roller coaster trains aren't powered, so a 'chain lift' is needed to pull the train up the first hill... -STR_3426 :{SMALLFONT}{BLACK}That's the lift hill complete - Now for the first drop... -STR_3427 :{SMALLFONT}{BLACK}Those curves are a bad idea - The riders will be flung to the sides by the lateral G forces as the train hurtles around... -STR_3428 :{SMALLFONT}{BLACK}Banking the curves will improve the ride - Riders will be pushed down into their seats instead of flung to the sides... -STR_3429 :{SMALLFONT}{BLACK}No - That won't work! Look at the height marks - The second hill is taller than the lift hill... -STR_3430 :{SMALLFONT}{BLACK}To ensure the train makes it around, each hill should be slightly smaller than the previous one... -STR_3431 :{SMALLFONT}{BLACK}That's better - Our train should make it up that hill now! Let's try some more twisted track... -STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve and station, so let's add some brakes... -STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow two trains to operate more safely on the circuit... -STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! -STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... -STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... -STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape +STR_3406 :{SMALLFONT}{BLACK}又回到初學者教學中那個空空如也的樂園了. 我們將會建造一個簡單的自訂設計遊樂設施... +STR_3407 :{SMALLFONT}{BLACK}首先, 我們需要選擇一個開始的位置... +STR_3408 :{SMALLFONT}{BLACK}剛剛建好的軌道部份為'車站月台', 顧名思義, 即是給遊客上落車的地方... +STR_3409 :{SMALLFONT}{BLACK}我們會加多一點車站月台, 以便擴展月台... +STR_3410 :{SMALLFONT}{BLACK}你可以選擇在建造視窗上方的圖標來建造不同的軌道組合... +STR_3411 :{SMALLFONT}{BLACK}我們會選擇左彎道... +STR_3412 :{SMALLFONT}{BLACK}這個彎道尚未建好, 但白色的鬼影會顯示它建成的位置. 按下在建造視窗的巨型"建造此"按鈕便可建造這個彎道... +STR_3413 :{SMALLFONT}{BLACK}現在我們要建造直向前的軌道, 所以我們就點直向前軌道的圖標... +STR_3414 :{SMALLFONT}{BLACK}現在整個環形軌道就完成了, 我們要建造入口及出口... +STR_3415 :{SMALLFONT}{BLACK}讓我們測試一下這個設施, 看看他能不能運行... +STR_3416 :{SMALLFONT}{BLACK}在它測試的途中, 我們去建造輪候區及連結出口的道路吧... +STR_3417 :{SMALLFONT}{BLACK}OK - 讓我們開放樂園, 同時開放設施吧... +STR_3418 :{SMALLFONT}{BLACK}我們的新遊樂設施好像不會令人太過興奮 - 不如我們來添加點景物吧? +STR_3419 :{SMALLFONT}{BLACK}要在高空中建造景物, 按下SHIFT鍵, 然後移動滑鼠來選擇高度... +STR_3420 :{SMALLFONT}{BLACK}有些景物建造後是可以修改顏色的... +STR_3421 :{SMALLFONT}{BLACK}最後, 我們一起設置這個設施播放音樂吧... +STR_3422 :{SMALLFONT}{BLACK}這次, 讓我們建造一座雲霄飛車! +STR_3423 :{SMALLFONT}{BLACK}這裡有挺多預先設計好的雲霄飛車, 但是我們要建造獨一無二的自訂設計... +STR_3424 :{SMALLFONT}{BLACK}剛剛我們建好了車站月台, 現在我們要建造帶有鏈條的坡道... +STR_3425 :{SMALLFONT}{BLACK}雲霄飛車沒有任何驅動力, 所以'帶有鏈條的坡道'就是用來拉雲霄飛車上第一個斜坡... +STR_3426 :{SMALLFONT}{BLACK}帶有鏈條的坡道建好了 - 現在要建造第一個下坡... +STR_3427 :{SMALLFONT}{BLACK}建造這些彎道是個壞主意 - 當列車急速穿過彎道時, 乘客會被垂直G力所猛推到兩側... +STR_3428 :{SMALLFONT}{BLACK}大幅改善的方法就是傾斜這些彎道 - 橫向G力現在會推乘客到他們的座位, 而不是推到兩側... +STR_3429 :{SMALLFONT}{BLACK}不 - 這不行! 看看高度標記 - 第二個坡現在比第一個高... +STR_3430 :{SMALLFONT}{BLACK}為了確保列車能返回車站, 每個坡都要比上一個矮... +STR_3431 :{SMALLFONT}{BLACK}這樣就好了 - 我們的雲霄飛車應該可以攀上這個坡了! 我們現在試試一些更曲折的軌道吧... +STR_3432 :{SMALLFONT}{BLACK}我們需要在列車進入最後一個彎道及車站前減慢列車, 所以我們要建造一些制動器... +STR_3433 :{SMALLFONT}{BLACK}最後, 我們要建造一些'區間制動器', 以便兩組列車在設施上運行得更安全... +STR_3434 :{SMALLFONT}{BLACK}我們測試一下新的雲霄飛車, 看看它能不能運作吧! +STR_3435 :{SMALLFONT}{BLACK}太好了 - 一切順利! 現在又要做一些熟悉的動作: 建造道路, 然後讓遊客乘坐這座嶄新的雲霄飛車... +STR_3436 :{SMALLFONT}{BLACK}在它迎來第一個乘客的途中, 我們可以自訂化一下這座雲霄飛車... +STR_3437 :{SMALLFONT}{BLACK}在地型中清理某些大範圍內的景物 STR_3438 :無法移除這裡所有的景物... STR_3439 :移除景物 STR_3440 :頁1 @@ -3689,12 +3690,12 @@ STR_5353 :{BLACK}體力: STR_5354 :{BLACK}飢餓度: STR_5355 :{BLACK}口渴度: STR_5356 :{BLACK}噁心度: -STR_5357 :{BLACK}忍受噁心程度: +STR_5357 :{BLACK}噁心忍受程度: STR_5358 :{BLACK}如廁度: STR_5359 :移除遊客 STR_5360 :{SMALLFONT}{BLACK}移除地圖上所有遊客 STR_5361 :給予全部遊客: -STR_5362 :{BLACK}Set all guests' preferred ride intensity to: +STR_5362 :{BLACK}設置所有遊客對遊樂設施的偏好刺激度為: STR_5363 :高於1 STR_5364 :低於15 STR_5365 :{BLACK}員工行走速度: @@ -3785,7 +3786,7 @@ STR_5449 :減慢遊戲速度 STR_5450 :增快遊戲速度 STR_5451 :開啟密技視窗 STR_5452 :Toggle visibility of toolbars -STR_5453 :Select another ride +STR_5453 :選擇另一類遊樂設施 STR_5454 :去除FPS上限 STR_5455 :啟用沙盒模式 STR_5456 :去除阻礙檢查 @@ -3793,9 +3794,10 @@ STR_5457 :去除支撐限制 STR_5458 :順時計旋轉 STR_5459 :逆時計旋轉 STR_5460 :逆時針旋轉檢視範圍 -STR_5461 :Set guests' parameters +STR_5461 :設置遊客的屬性 STR_5462 :{CURRENCY} STR_5463 :目標: 盡情玩吧! STR_5464 :一般 STR_5465 :氣候 STR_5466 :員工 +STR_5467 :ALT + From 1f2502c8c28d930ac9946b651b2cee85b7d94816 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 22 Jul 2015 18:13:35 +0100 Subject: [PATCH 0340/1173] add recent messages to toolbar, closes #1423 --- data/language/english_uk.txt | 1 + resources/g2/58.png | Bin 0 -> 387 bytes src/config.c | 3 ++- src/config.h | 1 + src/localisation/string_ids.h | 1 + src/sprites.h | 2 ++ src/windows/options.c | 25 ++++++++++++++++++------- src/windows/top_toolbar.c | 25 +++++++++++++++++++++++-- 8 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 resources/g2/58.png diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 1a0fe5c80d..a1993df8a2 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3801,3 +3801,4 @@ STR_5464 :General STR_5465 :Climate STR_5466 :Staff STR_5467 :ALT + +STR_5468 :Show recent messages button on toolbar diff --git a/resources/g2/58.png b/resources/g2/58.png new file mode 100644 index 0000000000000000000000000000000000000000..38dab8711a2df7d76015e9dc6081c1f65d11d841 GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^5anMpauy~7sn6}@2!&#PCaD6J$0y(p9bGdh}z77RPhrfA7z?hlH2T&v{oc z_fr&8JYQ#v!F*>zpj fjqlsND5_xg@hGi&)v(GM7;p@pu6{1-oD!Menabled_widgets = enabledWidgets; @@ -785,6 +796,16 @@ static void window_top_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi) imgId = SPR_FINANCE; gfx_draw_sprite(dpi, imgId, x, y, 0); } + + // Draw news button + if (window_top_toolbar_widgets[WIDX_NEWS].type != WWT_EMPTY) { + x = w->x + window_top_toolbar_widgets[WIDX_NEWS].left + 3; + y = w->y + window_top_toolbar_widgets[WIDX_NEWS].top + 0; + if (widget_is_pressed(w, WIDX_NEWS)) + y++; + imgId = SPR_G2_TAB_NEWS; + gfx_draw_sprite(dpi, imgId, x, y, 0); + } } /* rct2: 0x006E3158 */ From 43b657730ecdc5524a9e8683c3cbc7612cd86fc5 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 22 Jul 2015 20:29:25 +0100 Subject: [PATCH 0341/1173] fix #1658 --- src/peep/peep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 6f2c96ebe2..29a6980888 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -162,7 +162,7 @@ static uint8 peep_assess_surroundings(sint16 center_x, sint16 center_y, sint16 c if ((mapElement->properties.path.additions & 0xF) == 0) break; - scenery = g_pathBitSceneryEntries[mapElement->properties.path.additions - 1]; + scenery = g_pathBitSceneryEntries[(mapElement->properties.path.additions & 0x0F) - 1]; if (mapElement->properties.path.additions & (1 << 7)) break; From 1662b18a7e09a53b64dbb985b94a7c1a5f6e33e4 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 23 Jul 2015 18:38:43 +0100 Subject: [PATCH 0342/1173] fix #1662, consistent location sign --- src/interface/window.c | 2 +- src/management/news_item.c | 2 +- src/peep/peep.c | 4 ++-- src/peep/staff.c | 4 ++-- src/scenario.c | 6 +++--- src/windows/game_bottom_toolbar.c | 2 +- src/windows/park.c | 8 ++++---- src/world/sprite.c | 5 ++--- src/world/sprite.h | 2 +- 9 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/interface/window.c b/src/interface/window.c index 76f93c12f0..a1093824aa 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -1379,7 +1379,7 @@ void window_rotate_camera(rct_window *w, int direction) // other != viewport probably triggers on viewports in ride or guest window? // x is 0x8000 if middle of viewport is obstructed by another window? - if (x == (sint16)SPRITE_LOCATION_NULL || other != viewport){ + if (x == SPRITE_LOCATION_NULL || other != viewport) { x = (viewport->view_width >> 1) + viewport->view_x; y = (viewport->view_height >> 1) + viewport->view_y; diff --git a/src/management/news_item.c b/src/management/news_item.c index 101fbe6732..13e33b9d50 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -199,7 +199,7 @@ void news_item_get_subject_location(int type, int subject, int *x, int *y, int * *x = peep->x; *y = peep->y; *z = peep->z; - if (*((uint16*)x) != SPRITE_LOCATION_NULL) + if (*x != SPRITE_LOCATION_NULL) break; if (peep->state != 3 && peep->state != 7) { diff --git a/src/peep/peep.c b/src/peep/peep.c index 29a6980888..545f38adc5 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -3913,9 +3913,9 @@ static void peep_update_walking_break_scenery(rct_peep* peep){ uint16 sprite_index; FOR_ALL_STAFF(sprite_index, inner_peep){ - if (inner_peep->staff_type != STAFF_TYPE_SECURITY)continue; + if (inner_peep->staff_type != STAFF_TYPE_SECURITY) continue; - if (inner_peep->x == (sint16)SPRITE_LOCATION_NULL)continue; + if (inner_peep->x == SPRITE_LOCATION_NULL) continue; int x_diff = abs(inner_peep->x - peep->x); int y_diff = abs(inner_peep->y - peep->y); diff --git a/src/peep/staff.c b/src/peep/staff.c index 2df648d85c..da8442bc68 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -201,13 +201,13 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, count = 0; uint8 i; for (i = 0; i < 4; ++i) { - if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i] != SPRITE_LOCATION_NULL) ++count; + if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[i] != SPRITE_LOCATION_NULL) ++count; } if (count > 0) { uint32 rand = scenario_rand_max(count); for (i = 0; i < 4; ++i) { - if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i] != SPRITE_LOCATION_NULL) { + if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[i] != SPRITE_LOCATION_NULL) { if (rand == 0) break; --rand; } diff --git a/src/scenario.c b/src/scenario.c index 1310af5a61..220a7d867c 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -445,9 +445,9 @@ void scenario_entrance_fee_too_high_check() uint32 game_flags = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), packed_xy; if ((game_flags & PARK_FLAGS_PARK_OPEN) && park_entrance_fee > max_fee) { - for (int i = 0; RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i] != SPRITE_LOCATION_NULL; ++i) { - x = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i] + 16; - y = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, uint16)[i] + 16; + for (int i = 0; RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[i] != SPRITE_LOCATION_NULL; i++) { + x = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[i] + 16; + y = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, sint16)[i] + 16; } packed_xy = (y << 16) | x; diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index 2c3b41afc8..549ec4c3af 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -196,7 +196,7 @@ static void window_game_bottom_toolbar_mouseup(rct_window *w, int widgetIndex) news_item_get_subject_location(newsItem->type, subject, &x, &y, &z); - if ((uint16)x == SPRITE_LOCATION_NULL) + if (x == SPRITE_LOCATION_NULL) break; if ((mainWindow = window_get_main()) != NULL) diff --git a/src/windows/park.c b/src/windows/park.c index c078d91c10..230160f55e 100644 --- a/src/windows/park.c +++ b/src/windows/park.c @@ -1060,10 +1060,10 @@ static void window_park_init_viewport(rct_window *w) return; for (i = 0; i < 4; i++) { - if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i] != SPRITE_LOCATION_NULL) { - x = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i] + 16; - y = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, uint16)[i] + 16; - z = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Z, uint16)[i] + 32; + if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[i] != SPRITE_LOCATION_NULL) { + x = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[i] + 16; + y = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, sint16)[i] + 16; + z = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Z, sint16)[i] + 32; r = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); xy = 0x40000000 | (y << 16) | x; diff --git a/src/world/sprite.c b/src/world/sprite.c index 2a362decde..2d676fbe3a 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -626,10 +626,9 @@ void reset_0x69EBE4(){ if (spr->unknown.sprite_identifier != 0xFF){ uint32 edi = spr->unknown.x; - if ((uint16)(spr->unknown.x) == SPRITE_LOCATION_NULL){ + if (spr->unknown.x == SPRITE_LOCATION_NULL){ edi = 0x10000; - } - else{ + } else { int ecx = spr->unknown.y; ecx >>= 5; edi &= 0x1FE0; diff --git a/src/world/sprite.h b/src/world/sprite.h index 11b0b45522..2b1ef468ea 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -26,7 +26,7 @@ #include "../ride/vehicle.h" #define SPRITE_INDEX_NULL 0xFFFF -#define SPRITE_LOCATION_NULL 0x8000 +#define SPRITE_LOCATION_NULL ((sint16)0x8000) #define MAX_SPRITES 10000 enum SPRITE_IDENTIFIER{ From faacd66ad952fbc11e56763e2ef770836cb5e929 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 23 Jul 2015 18:55:51 +0100 Subject: [PATCH 0343/1173] allow trees to be raised if supports limits are disabled, close #1663 --- src/windows/top_toolbar.c | 2 +- src/world/map.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index d021941a90..b7c2b493d3 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -947,7 +947,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin type = 1; } - if (type == 0){ + if (type == 0 && !gCheatsDisableSupportLimits) { RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_CTRL_PRESSED, uint8) = 0; RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_SHIFT_PRESSED, uint8) = 0; } diff --git a/src/world/map.c b/src/world/map.c index 8ed9721923..a3434ca198 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2134,7 +2134,7 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi } } if(gCheatsDisableClearanceChecks || !(scenery_entry->small_scenery.flags & SMALL_SCENERY_FLAG_REQUIRE_FLAT_SURFACE) || z != 0 || F64F1D != 0 || !(map_element->properties.surface.slope & 0x1F)){ - if(scenery_entry->small_scenery.flags & SMALL_SCENERY_FLAG18 || z == 0){ + if(gCheatsDisableSupportLimits || scenery_entry->small_scenery.flags & SMALL_SCENERY_FLAG18 || z == 0){ l_6E0B78: ; int bp = quadrant; int zLow = F64EC8 / 8; From 8f2dc5fd1a0aabaf53c5be19904d149e0239ce73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 23 Jul 2015 19:45:48 +0200 Subject: [PATCH 0344/1173] sub_0x68615B doesn't really take any params In all cases, sub_0x68615B takes a single argument, 0xEE788C. It now takes 0 arguments and simply knows about its initializing values. --- src/interface/viewport.c | 9 ++++----- src/interface/viewport.h | 2 +- src/windows/ride_construction.c | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 9f89645871..769d340b03 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -608,10 +608,9 @@ void viewport_render(rct_drawpixelinfo *dpi, rct_viewport *viewport, int left, i /** * * rct2: 0x0068615B -* ebp: ebp */ -void sub_0x68615B(int ebp){ - RCT2_GLOBAL(0xEE7888, uint32) = ebp; +void painter_setup(){ + RCT2_GLOBAL(0xEE7888, uint32) = 0x00EE788C; RCT2_GLOBAL(0xF1AD28, uint32) = 0; RCT2_GLOBAL(0xF1AD2C, uint32) = 0; uint8* edi = RCT2_ADDRESS(0xF1A50C, uint8); @@ -2200,7 +2199,7 @@ void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, in RCT2_GLOBAL(0xEE7880, uint32) = 0xF1A4CC; RCT2_GLOBAL(0x140E9A8, uint32) = (int)dpi2; int ebp = 0, ebx = 0, esi = 0, ecx = 0; - sub_0x68615B(0xEE788C); //Memory copy + painter_setup(); viewport_paint_setup(); sub_688217(); sub_688485(); @@ -2585,7 +2584,7 @@ void get_map_coordinates_from_pos(int screenX, int screenY, int flags, sint16 *x dpi->width = 1; RCT2_GLOBAL(0xEE7880, uint32_t) = 0xF1A4CC; RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*) = dpi; - sub_0x68615B(0xEE788C); + painter_setup(); viewport_paint_setup(); sub_688217(); sub_68862C(); diff --git a/src/interface/viewport.h b/src/interface/viewport.h index f270b0cb94..aad675b6d9 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -127,7 +127,7 @@ void sub_68A15E(int screenX, int screenY, short *x, short *y, int *direction, rc void viewport_interaction_remove_park_entrance(rct_map_element *mapElement, int x, int y); void sub_68B2B7(int x, int y); -void sub_0x68615B(int ebp); +void painter_setup(); void sub_688485(); void sub_688217(); diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 4b418a4aa2..ed19902a9f 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -2185,7 +2185,7 @@ static void sub_6CBCE2( trackDirection &= 3; RCT2_GLOBAL(0x00EE7880, uint32) = 0x00F1A4CC; - sub_0x68615B(0x00EE788C); + painter_setup(); ride = GET_RIDE(rideIndex); From b12b1b5faf282ad80c5c6962738c3a0b5f1b789a Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 24 Jul 2015 19:20:24 +0100 Subject: [PATCH 0345/1173] support map scroll keyboard shortcuts, e.g. WASD. Closes #757 --- data/language/english_uk.txt | 4 +++ src/config.c | 4 +++ src/config.h | 5 +++- src/input.c | 45 ++++++++++++++++++++++++------- src/interface/keyboard_shortcut.c | 13 +++++++-- src/localisation/string_ids.h | 5 ++++ src/windows/shortcut_keys.c | 4 +++ 7 files changed, 67 insertions(+), 13 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index a1993df8a2..bb4ad88248 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3802,3 +3802,7 @@ STR_5465 :Climate STR_5466 :Staff STR_5467 :ALT + STR_5468 :Show recent messages button on toolbar +STR_5469 :Scroll map up +STR_5470 :Scroll map left +STR_5471 :Scroll map down +STR_5472 :Scroll map right diff --git a/src/config.c b/src/config.c index 55ad3ecbde..256ccefa75 100644 --- a/src/config.c +++ b/src/config.c @@ -964,6 +964,10 @@ static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = { SDL_SCANCODE_EQUALS, // SHORTCUT_INCREASE_GAME_SPEED, CTRL | ALT | SDL_SCANCODE_C, // SHORTCUT_OPEN_CHEAT_WINDOW, SDL_SCANCODE_T, // SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, + SDL_SCANCODE_UP, // SHORTCUT_SCROLL_MAP_UP + SDL_SCANCODE_LEFT, // SHORTCUT_SCROLL_MAP_LEFT + SDL_SCANCODE_DOWN, // SHORTCUT_SCROLL_MAP_DOWN + SDL_SCANCODE_RIGHT, // SHORTCUT_SCROLL_MAP_RIGHT }; #define SHORTCUT_FILE_VERSION 1 diff --git a/src/config.h b/src/config.h index 6190edfa4c..e274e937c7 100644 --- a/src/config.h +++ b/src/config.h @@ -72,7 +72,10 @@ enum { SHORTCUT_INCREASE_GAME_SPEED, SHORTCUT_OPEN_CHEAT_WINDOW, SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, - + SHORTCUT_SCROLL_MAP_UP, + SHORTCUT_SCROLL_MAP_LEFT, + SHORTCUT_SCROLL_MAP_DOWN, + SHORTCUT_SCROLL_MAP_RIGHT, SHORTCUT_COUNT }; diff --git a/src/input.c b/src/input.c index 8ca4c6ee63..c5f49fb870 100644 --- a/src/input.c +++ b/src/input.c @@ -1583,17 +1583,42 @@ void game_handle_key_scroll() scrollX = 0; scrollY = 0; - // Scroll left / right - if (gKeysState[SDL_SCANCODE_LEFT]) - scrollX = -1; - else if (gKeysState[SDL_SCANCODE_RIGHT]) - scrollX = 1; + for (int shortcutId = SHORTCUT_SCROLL_MAP_UP; shortcutId <= SHORTCUT_SCROLL_MAP_RIGHT; shortcutId++) { + const int SHIFT = 0x100; + const int CTRL = 0x200; + const int ALT = 0x400; - // Scroll up / down - if (gKeysState[SDL_SCANCODE_UP]) - scrollY = -1; - else if (gKeysState[SDL_SCANCODE_DOWN]) - scrollY = 1; + uint16 shortcutKey = gShortcutKeys[shortcutId]; + uint8 scancode = shortcutKey & 0xFF; + + if (shortcutKey == 0xFFFF) continue; + if (!gKeysState[scancode]) continue; + + if (shortcutKey & SHIFT) { + if (!gKeysState[SDL_SCANCODE_LSHIFT] && !gKeysState[SDL_SCANCODE_RSHIFT]) continue; + } + if (shortcutKey & CTRL) { + if (!gKeysState[SDL_SCANCODE_LCTRL] && !gKeysState[SDL_SCANCODE_RCTRL]) continue; + } + if (shortcutKey & ALT) { + if (!gKeysState[SDL_SCANCODE_LALT] && !gKeysState[SDL_SCANCODE_RALT]) continue; + } + + switch (shortcutId) { + case SHORTCUT_SCROLL_MAP_UP: + scrollY = -1; + break; + case SHORTCUT_SCROLL_MAP_LEFT: + scrollX = -1; + break; + case SHORTCUT_SCROLL_MAP_DOWN: + scrollY = 1; + break; + case SHORTCUT_SCROLL_MAP_RIGHT: + scrollX = 1; + break; + } + } // Scroll viewport if (scrollX != 0) { diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index 224b17dd55..a810083713 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -72,8 +72,12 @@ void keyboard_shortcut_handle(int key) void keyboard_shortcut_handle_command(int shortcutIndex) { - if (shortcutIndex >= 0 && shortcutIndex < countof(shortcut_table)) - shortcut_table[shortcutIndex](); + if (shortcutIndex >= 0 && shortcutIndex < countof(shortcut_table)) { + shortcut_action action = shortcut_table[shortcutIndex]; + if (action != NULL) { + action(); + } + } } void keyboard_shortcut_format_string(char *buffer, uint16 shortcutKey) @@ -81,6 +85,7 @@ void keyboard_shortcut_format_string(char *buffer, uint16 shortcutKey) char formatBuffer[256]; *buffer = 0; + if (shortcutKey == 0xFFFF) return; if (shortcutKey & 0x100) { format_string(formatBuffer, STR_SHIFT_PLUS, NULL); strcat(buffer, formatBuffer); @@ -528,6 +533,10 @@ static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { shortcut_increase_game_speed, shortcut_open_cheat_window, shortcut_remove_top_bottom_toolbar_toggle, + NULL, + NULL, + NULL, + NULL, }; #pragma endregion diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 7bdd8aba14..80244ad75a 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1798,6 +1798,11 @@ enum { STR_ALT_PLUS = 5467, STR_SHOW_RECENT_MESSAGES_ON_TOOLBAR = 5468, + STR_SHORTCUT_SCROLL_MAP_UP = 5469, + STR_SHORTCUT_SCROLL_MAP_LEFT = 5470, + STR_SHORTCUT_SCROLL_MAP_DOWN = 5471, + STR_SHORTCUT_SCROLL_MAP_RIGHT = 5472, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/shortcut_keys.c b/src/windows/shortcut_keys.c index bbd60b47fe..956c9410e3 100644 --- a/src/windows/shortcut_keys.c +++ b/src/windows/shortcut_keys.c @@ -126,6 +126,10 @@ const rct_string_id ShortcutStringIds[] = { STR_SHORTCUT_INCREASE_GAME_SPEED, STR_SHORTCUT_OPEN_CHEATS_WINDOW, STR_SHORTCUT_TOGGLE_VISIBILITY_OF_TOOLBARS, + STR_SHORTCUT_SCROLL_MAP_UP, + STR_SHORTCUT_SCROLL_MAP_LEFT, + STR_SHORTCUT_SCROLL_MAP_DOWN, + STR_SHORTCUT_SCROLL_MAP_RIGHT }; /** From dd107ee25c30267887f9151f7cd39e80484c0b8f Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 24 Jul 2015 20:15:13 +0100 Subject: [PATCH 0346/1173] save object selection filter, closes #1599 --- src/config.c | 1 + src/config.h | 1 + src/windows/editor_object_selection.c | 9 ++++++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 256ccefa75..3ca1fbba27 100644 --- a/src/config.c +++ b/src/config.c @@ -195,6 +195,7 @@ config_property_definition _interfaceDefinitions[] = { { offsetof(interface_configuration, console_small_font), "console_small_font", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(interface_configuration, current_theme_preset), "current_theme", CONFIG_VALUE_TYPE_STRING, { .value_string = "*RCT2" }, NULL }, { offsetof(interface_configuration, current_title_sequence_preset), "current_title_sequence", CONFIG_VALUE_TYPE_STRING, { .value_string = "*OPENRCT2" },NULL }, + { offsetof(interface_configuration, object_selection_filter_flags), "object_selection_filter_flags",CONFIG_VALUE_TYPE_UINT32, 0x7EF, NULL }, }; config_property_definition _soundDefinitions[] = { diff --git a/src/config.h b/src/config.h index e274e937c7..32b2ca06df 100644 --- a/src/config.h +++ b/src/config.h @@ -171,6 +171,7 @@ typedef struct { uint8 console_small_font; utf8string current_theme_preset; utf8string current_title_sequence_preset; + uint32 object_selection_filter_flags; } interface_configuration; typedef struct { diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 92f2a1499f..b885a55439 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -400,7 +400,7 @@ void window_editor_object_selection_open() (1 << WIDX_LIST_SORT_TYPE) | (1 << WIDX_LIST_SORT_RIDE); - _filter_flags = FILTER_ALL; + _filter_flags = gConfigInterface.object_selection_filter_flags; memset(_filter_string, 0, sizeof(_filter_string)); for (int i = WIDX_TAB_1; i <= WIDX_TAB_11; i++) @@ -793,6 +793,9 @@ static void window_editor_object_selection_mouseup(rct_window *w, int widgetInde break; case WIDX_FILTER_RIDE_TAB_ALL: _filter_flags |= 0x7E0; + gConfigInterface.object_selection_filter_flags = _filter_flags; + config_save_default(); + filter_update_counts(); visible_list_refresh(w); @@ -810,6 +813,8 @@ static void window_editor_object_selection_mouseup(rct_window *w, int widgetInde case WIDX_FILTER_RIDE_TAB_STALL: _filter_flags &= ~0x7E0; _filter_flags |= (1 << (widgetIndex - WIDX_FILTER_RIDE_TAB_TRANSPORT + 5)); + gConfigInterface.object_selection_filter_flags = _filter_flags; + config_save_default(); filter_update_counts(); visible_list_refresh(w); @@ -914,6 +919,8 @@ static void window_editor_object_selection_dropdown(rct_window *w, int widgetInd switch (widgetIndex) { case WIDX_FILTER_DROPDOWN: _filter_flags ^= (1 << dropdownIndex); + gConfigInterface.object_selection_filter_flags = _filter_flags; + config_save_default(); filter_update_counts(); w->scrolls->v_top = 0; From 5f69e6f37ace9372fa840b5caa7e8bed37277f69 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 24 Jul 2015 22:58:41 +0100 Subject: [PATCH 0347/1173] add cycle day / night --- data/language/english_uk.txt | 1 + src/config.h | 1 + src/game.c | 1 + src/game.h | 1 + src/localisation/string_ids.h | 2 ++ src/platform/shared.c | 32 ++++++++++++++++++++++++++++++++ src/scenario.c | 23 +++++++++++++++++++++++ src/windows/options.c | 14 ++++++++++++-- 8 files changed, 73 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index bb4ad88248..c2f7958242 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3806,3 +3806,4 @@ STR_5469 :Scroll map up STR_5470 :Scroll map left STR_5471 :Scroll map down STR_5472 :Scroll map right +STR_5473 :Cycle day / night diff --git a/src/config.h b/src/config.h index 32b2ca06df..0bc0b35d06 100644 --- a/src/config.h +++ b/src/config.h @@ -160,6 +160,7 @@ typedef struct { uint8 invert_viewport_drag; uint8 load_save_sort; uint8 minimize_fullscreen_focus_loss; + uint8 day_night_cycle; } general_configuration; typedef struct { diff --git a/src/game.c b/src/game.c index af5efbd4a1..3c0c753dae 100644 --- a/src/game.c +++ b/src/game.c @@ -58,6 +58,7 @@ #include "world/water.h" int gGameSpeed = 1; +float gDayNightCycle = 0; void game_increase_game_speed() { diff --git a/src/game.h b/src/game.h index 5247ccd70e..55e48051e9 100644 --- a/src/game.h +++ b/src/game.h @@ -91,6 +91,7 @@ enum GAME_COMMAND { typedef void (GAME_COMMAND_POINTER)(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); extern int gGameSpeed; +extern float gDayNightCycle; void game_increase_game_speed(); void game_reduce_game_speed(); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 80244ad75a..88aac31936 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1803,6 +1803,8 @@ enum { STR_SHORTCUT_SCROLL_MAP_DOWN = 5471, STR_SHORTCUT_SCROLL_MAP_RIGHT = 5472, + STR_CYCLE_DAY_NIGHT = 5473, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/platform/shared.c b/src/platform/shared.c index d0e33ae639..0cf5d96885 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -24,6 +24,7 @@ #include "../config.h" #include "../cursors.h" #include "../drawing/drawing.h" +#include "../game.h" #include "../interface/console.h" #include "../interface/keyboard_shortcut.h" #include "../interface/window.h" @@ -266,6 +267,29 @@ static void platform_resize(int width, int height) } } +static uint8 soft_light(uint8 a, uint8 b) +{ + float fa = a / 255.0f; + float fb = b / 255.0f; + float fr; + if (fb < 0.5f) { + fr = (2 * fa * fb) + ((fa * fa) * (1 - (2 * fb))); + } else { + fr = (2 * fa * (1 - fb)) + (sqrtf(fa) * ((2 * fb) - 1)); + } + return (uint8)(clamp(0.0f, fr, 1.0f) * 255.0f); +} + +static uint8 lerp(uint8 a, uint8 b, float t) +{ + if (t <= 0) return a; + if (t >= 1) return b; + + int range = b - a; + int amount = (int)(range * t); + return (uint8)(a + amount); +} + void platform_update_palette(char* colours, int start_index, int num_colours) { SDL_Surface *surface; @@ -276,6 +300,14 @@ void platform_update_palette(char* colours, int start_index, int num_colours) gPalette[i].g = colours[1]; gPalette[i].b = colours[0]; gPalette[i].a = 0; + + float night = gDayNightCycle; + if (night >= 0 && RCT2_GLOBAL(RCT2_ADDRESS_LIGHTNING_ACTIVE, uint8) == 0) { + gPalette[i].r = lerp(gPalette[i].r, soft_light(gPalette[i].r, 8), night); + gPalette[i].g = lerp(gPalette[i].g, soft_light(gPalette[i].g, 8), night); + gPalette[i].b = lerp(gPalette[i].b, soft_light(gPalette[i].b, 128), night); + } + colours += 4; if (gBufferTextureFormat != NULL) { gPaletteHWMapped[i] = SDL_MapRGB(gBufferTextureFormat, gPalette[i].r, gPalette[i].g, gPalette[i].b); diff --git a/src/scenario.c b/src/scenario.c index 220a7d867c..7ae17eeb67 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -544,6 +544,27 @@ static void scenario_month_update() award_update_all(); } +static void scenario_update_daynight_cycle() +{ + gDayNightCycle = 0; + + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) != SCREEN_FLAGS_PLAYING) return; + if (!gConfigGeneral.day_night_cycle) return; + + float monthFraction = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16) / (float)0x10000; + if (monthFraction < (1 / 8.0f)) { + gDayNightCycle = 0.0f; + } else if (monthFraction < (3 / 8.0f)) { + gDayNightCycle = (monthFraction - (1 / 8.0f)) / (2 / 8.0f); + } else if (monthFraction < (5 / 8.0f)) { + gDayNightCycle = 1.0f; + } else if (monthFraction < (7 / 8.0f)) { + gDayNightCycle = 1.0f - ((monthFraction - (5 / 8.0f)) / (2 / 8.0f)); + } else { + gDayNightCycle = 0.0f; + } +} + /* * Scenario and finance related update iteration. * rct2: 0x006C44B1 @@ -574,6 +595,8 @@ void scenario_update() RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16)++; scenario_month_update(); } + + scenario_update_daynight_cycle(); } /** diff --git a/src/windows/options.c b/src/windows/options.c index eb7a968a48..883a41dcda 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -85,6 +85,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_THEMES, WIDX_THEMES_DROPDOWN, WIDX_THEMES_BUTTON, + WIDX_DAY_NIGHT_CHECKBOX, // Culture / Units WIDX_LANGUAGE = WIDX_PAGE_START, @@ -142,7 +143,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { }; #define WW 310 -#define WH 194 +#define WH 208 #define MAIN_OPTIONS_WIDGETS \ { WWT_FRAME, 0, 0, WW-1, 0, WH-1, STR_NONE, STR_NONE }, \ @@ -172,6 +173,7 @@ static rct_widget window_options_display_widgets[] = { { WWT_DROPDOWN, 1, 155, 299, 158, 169, STR_NONE, STR_NONE }, // colour schemes { WWT_DROPDOWN_BUTTON, 1, 288, 298, 159, 168, 876, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 26, 185, 174, 185, 5153, STR_NONE }, // colour schemes button + { WWT_CHECKBOX, 1, 10, 290, 190, 201, STR_CYCLE_DAY_NIGHT,STR_NONE }, // cycle day-night { WIDGETS_END }, }; @@ -335,7 +337,8 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_CONSTRUCTION_MARKER_DROPDOWN) | (1 << WIDX_THEMES) | (1 << WIDX_THEMES_DROPDOWN) | - (1 << WIDX_THEMES_BUTTON), + (1 << WIDX_THEMES_BUTTON) | + (1 << WIDX_DAY_NIGHT_CHECKBOX), MAIN_OPTIONS_ENABLED_WIDGETS | (1 << WIDX_LANGUAGE) | @@ -477,6 +480,11 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) window_themes_open(); window_invalidate(w); break; + case WIDX_DAY_NIGHT_CHECKBOX: + gConfigGeneral.day_night_cycle ^= 1; + config_save_default(); + window_invalidate(w); + break; } break; @@ -1075,6 +1083,7 @@ static void window_options_invalidate(rct_window *w) widget_set_checkbox_value(w, WIDX_HARDWARE_DISPLAY_CHECKBOX, gConfigGeneral.hardware_display); widget_set_checkbox_value(w, WIDX_UNCAP_FPS_CHECKBOX, gConfigGeneral.uncap_fps); widget_set_checkbox_value(w, WIDX_MINIMIZE_FOCUS_LOSS, gConfigGeneral.minimize_fullscreen_focus_loss); + widget_set_checkbox_value(w, WIDX_DAY_NIGHT_CHECKBOX, gConfigGeneral.day_night_cycle); // construction marker: celsius/fahrenheit window_options_display_widgets[WIDX_CONSTRUCTION_MARKER].image = STR_WHITE + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CONSTRUCTION_MARKER, uint8); @@ -1093,6 +1102,7 @@ static void window_options_invalidate(rct_window *w) window_options_display_widgets[WIDX_THEMES].type = WWT_DROPDOWN; window_options_display_widgets[WIDX_THEMES_DROPDOWN].type = WWT_DROPDOWN_BUTTON; window_options_display_widgets[WIDX_THEMES_BUTTON].type = WWT_DROPDOWN_BUTTON; + window_options_display_widgets[WIDX_DAY_NIGHT_CHECKBOX].type = WWT_CHECKBOX; break; case WINDOW_OPTIONS_PAGE_CULTURE: From 08504257ad6778dcea31b9d59d147bad9abaed67 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 24 Jul 2015 23:00:24 +0100 Subject: [PATCH 0348/1173] fix saving of day night config --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 3ca1fbba27..f51c4c5389 100644 --- a/src/config.c +++ b/src/config.c @@ -184,6 +184,7 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, invert_viewport_drag), "invert_viewport_drag", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, load_save_sort), "load_save_sort", CONFIG_VALUE_TYPE_UINT8, SORT_NAME_ASCENDING, NULL }, { offsetof(general_configuration, minimize_fullscreen_focus_loss), "minimize_fullscreen_focus_loss",CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, + { offsetof(general_configuration, day_night_cycle), "day_night_cycle", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, }; config_property_definition _interfaceDefinitions[] = { From fe69ad6d53e4e0eb753985b62f216daa7abeff53 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 24 Jul 2015 23:05:31 +0100 Subject: [PATCH 0349/1173] fix day / night cycle for title sequence --- src/scenario.c | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/scenario.c b/src/scenario.c index 7ae17eeb67..f1dd4f0e30 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -571,29 +571,28 @@ static void scenario_update_daynight_cycle() **/ void scenario_update() { - if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & ~SCREEN_FLAGS_PLAYING) - return; + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & ~SCREEN_FLAGS_PLAYING)) { + uint32 currentMonthTick = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16); + uint32 nextMonthTick = currentMonthTick + 4; + uint8 currentMonth = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16) & 7; + uint8 currentDaysInMonth = (uint8)days_in_month[currentMonth]; - uint32 currentMonthTick = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16); - uint32 nextMonthTick = currentMonthTick + 4; - uint8 currentMonth = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16) & 7; - uint8 currentDaysInMonth = (uint8)days_in_month[currentMonth]; + scenario_autosave_check(); + if ((currentDaysInMonth * nextMonthTick) >> 16 != (currentDaysInMonth * currentMonthTick) >> 16) { + scenario_day_update(); + } + if (nextMonthTick % 0x4000 == 0) { + scenario_week_update(); + } + if (nextMonthTick % 0x8000 == 0) { + scenario_fortnight_update(); + } - scenario_autosave_check(); - if ((currentDaysInMonth * nextMonthTick) >> 16 != (currentDaysInMonth * currentMonthTick) >> 16) { - scenario_day_update(); - } - if (nextMonthTick % 0x4000 == 0) { - scenario_week_update(); - } - if (nextMonthTick % 0x8000 == 0) { - scenario_fortnight_update(); - } - - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16) = (uint16)nextMonthTick; - if (nextMonthTick >= 0x10000) { - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16)++; - scenario_month_update(); + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16) = (uint16)nextMonthTick; + if (nextMonthTick >= 0x10000) { + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16)++; + scenario_month_update(); + } } scenario_update_daynight_cycle(); From 50187adc3749333276aa4b8aac278416cf7d0582 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 24 Jul 2015 23:48:23 +0100 Subject: [PATCH 0350/1173] enable debug configuration and add optimisations to release configuration --- projects/language/language.vcxproj | 3 + projects/libs/libs.vcxproj | 9 +- projects/openrct2.vcxproj | 14 +- projects/openrct2.vcxproj.user | 5 + projects/~AutoRecover.openrct2.vcxproj | 423 ------------------------- src/management/research.c | 6 +- src/object_list.c | 4 +- src/peep/staff.c | 2 +- src/ride/ride.c | 4 +- src/ride/track.c | 2 +- src/windows/editor_object_selection.c | 2 +- src/windows/guest_list.c | 2 +- src/windows/scenery.c | 12 +- 13 files changed, 43 insertions(+), 445 deletions(-) delete mode 100644 projects/~AutoRecover.openrct2.vcxproj diff --git a/projects/language/language.vcxproj b/projects/language/language.vcxproj index b37e1107f4..69620f3659 100644 --- a/projects/language/language.vcxproj +++ b/projects/language/language.vcxproj @@ -73,6 +73,9 @@ true + + xcopy /Y "$(SolutionDir)\..\Data\Language\*.*" "$(TargetDir)\Data\Language\" + diff --git a/projects/libs/libs.vcxproj b/projects/libs/libs.vcxproj index c1ae556f71..bbad0231d7 100644 --- a/projects/libs/libs.vcxproj +++ b/projects/libs/libs.vcxproj @@ -55,7 +55,8 @@ $(SolutionDir)..\build\$(Configuration)\ $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ - ..\..\lib\openssl\include;$(IncludePath) + ..\..\lib\libcurl\include;..\..\lib\jansson;..\..\lib\cutest\CuTest.h;$(IncludePath) + ..\..\lib\libcurl\lib;$(LibraryPath) $(SolutionDir)..\build\$(Configuration)\ @@ -81,6 +82,12 @@ true + + libcurl.lib;Ws2_32.lib;%(AdditionalDependencies) + + + Powershell -NonInteractive -ExecutionPolicy "ByPass" -File "$(ProjectDir)../../pre-build.ps1" + diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 8a3eeebd10..645c2c5455 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -310,8 +310,8 @@ - $(SolutionDir)..\lodepng;$(SolutionDir)..\sdl\include;$(SolutionDir)..\libspeex;$(IncludePath) - $(SolutionDir)..\sdl\lib\x86;$(LibraryPath) + $(SolutionDir)..\lib;$(SolutionDir)..\lib\libspeex;$(SolutionDir)..\lib\sdl\include;$(SolutionDir)..\lib\libcurl\include;$(SolutionDir)..\lib\jansson;$(SolutionDir)..\lib\cutest;$(IncludePath) + $(SolutionDir)..\lib\sdl\lib\x86;$(SolutionDir)..\lib\libcurl\lib;$(LibraryPath) $(SolutionDir)..\build\$(Configuration)\ $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ @@ -336,8 +336,12 @@ Disabled true 1Byte - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;%(PreprocessorDefinitions) MultiThreaded + true + $(IntDir)fake\%(RelativeDir) + 4013 + false true @@ -346,12 +350,13 @@ "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\..\Data\g2.dat" "$(SolutionDir)\..\Resources\g2\" xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" + Build g2.dat and copy the Data directory. Level3 - Disabled + Full true true @@ -365,6 +370,7 @@ xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;%(PreprocessorDefinitions) $(IntDir)fake\%(RelativeDir) true + Speed true diff --git a/projects/openrct2.vcxproj.user b/projects/openrct2.vcxproj.user index 33fff921b3..97aec8541a 100644 --- a/projects/openrct2.vcxproj.user +++ b/projects/openrct2.vcxproj.user @@ -17,4 +17,9 @@ false + + $(TargetDir)\openrct2.exe + WindowsLocalDebugger + $(TargetDir) + \ No newline at end of file diff --git a/projects/~AutoRecover.openrct2.vcxproj b/projects/~AutoRecover.openrct2.vcxproj deleted file mode 100644 index de18e4d204..0000000000 --- a/projects/~AutoRecover.openrct2.vcxproj +++ /dev/null @@ -1,423 +0,0 @@ - - - - - - - - - - Debug - Win32 - - - Release with Tests - Win32 - - - Release - Win32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {074dc930-05c6-4b7f-b5dd-dd237e6e44db} - - - - {D24D94F6-2A74-480C-B512-629C306CE92F} - openrct2 - openrct2 - - - - DynamicLibrary - true - v120 - MultiByte - - - DynamicLibrary - false - v120 - true - MultiByte - - - DynamicLibrary - false - v120 - true - MultiByte - - - - - - - - - - - - - - - - $(SolutionDir)..\lodepng;$(SolutionDir)..\sdl\include;$(SolutionDir)..\libspeex;$(IncludePath) - $(SolutionDir)..\sdl\lib\x86;$(LibraryPath) - $(SolutionDir)..\build\$(Configuration)\ - $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ - - - $(SolutionDir)..\lib;$(SolutionDir)..\lib\libspeex;$(SolutionDir)..\lib\sdl\include;$(SolutionDir)..\lib\libcurl\include;$(SolutionDir)..\lib\jansson;$(SolutionDir)..\lib\cutest;$(IncludePath) - $(SolutionDir)..\lib\sdl\lib\x86;$(SolutionDir)..\lib\libcurl\lib;$(LibraryPath) - $(SolutionDir)..\build\$(Configuration)\ - $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ - - - - - $(SolutionDir)..\lib;$(SolutionDir)..\lib\libspeex;$(SolutionDir)..\lib\sdl\include;$(SolutionDir)..\lib\libcurl\include;$(SolutionDir)..\lib\jansson;$(SolutionDir)..\lib\cutest;$(IncludePath) - $(SolutionDir)..\lib\sdl\lib\x86;$(SolutionDir)..\lib\libcurl\lib;$(LibraryPath) - $(SolutionDir)..\build\Release\ - $(SolutionDir)..\obj\$(ProjectName)\Release\ - - - - - Level3 - Disabled - true - 1Byte - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;%(PreprocessorDefinitions) - MultiThreaded - - - true - winmm.lib;sdl2.lib;Dsound.lib;%(AdditionalDependencies) - - - "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\..\Data\g2.dat" "$(SolutionDir)\..\Resources\g2\" -xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" - - - - - Level3 - Disabled - true - true - - - MultiThreaded - 1Byte - 4013 - - - false - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;%(PreprocessorDefinitions) - $(IntDir)fake\%(RelativeDir) - true - - - true - true - true - winmm.lib;sdl2.lib;Dsound.lib;%(AdditionalDependencies) - /ignore:4099 %(AdditionalOptions) - - - "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\..\Data\g2.dat" "$(SolutionDir)\..\Resources\g2\" -xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" - Build g2.dat and copy the Data directory. - - - - - - - - - - - - - Level3 - Disabled - true - true - - - MultiThreaded - 1Byte - 4013 - - - false - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;ENABLE_TESTS;%(PreprocessorDefinitions) - $(IntDir)fake\%(RelativeDir) - true - - - true - true - true - winmm.lib;sdl2.lib;Dsound.lib;%(AdditionalDependencies) - /ignore:4099 %(AdditionalOptions) - - - "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\..\Data\g2.dat" "$(SolutionDir)\..\Resources\g2\" -xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" - Build g2.dat and copy the Data directory. - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/management/research.c b/src/management/research.c index 2c348274d0..063827fdc1 100644 --- a/src/management/research.c +++ b/src/management/research.c @@ -282,10 +282,10 @@ void sub_684AC3(){ for (; research->entryIndex != RESEARCHED_ITEMS_END_2; research += 2){ if (scenario_rand() & 1) continue; - rct_research_item* edx; - rct_research_item* ebp; + rct_research_item* edx = NULL; + rct_research_item* ebp = NULL; rct_research_item* inner_research = gResearchItems; - do{ + do { if (research->entryIndex == inner_research->entryIndex){ edx = inner_research; } diff --git a/src/object_list.c b/src/object_list.c index 8283f74139..12409ecb0a 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -102,8 +102,8 @@ static void get_plugin_path(char *outPath) static void object_list_sort() { - rct_object_entry **objectBuffer, *newBuffer, *entry, *destEntry, *lowestEntry; - rct_object_filters *newFilters, *destFilter; + rct_object_entry **objectBuffer, *newBuffer, *entry, *destEntry, *lowestEntry = NULL; + rct_object_filters *newFilters = NULL, *destFilter = NULL; int numObjects, i, j, bufferSize, entrySize, lowestIndex; char *objectName, *lowestString; uint8 *copied; diff --git a/src/peep/staff.c b/src/peep/staff.c index da8442bc68..8a179d42e7 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -192,7 +192,7 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, sint16 x, y, z; uint32 count = 0; uint16 sprite_index; - rct_peep *guest; + rct_peep *guest = NULL; FOR_ALL_GUESTS(sprite_index, guest) if (guest->state == PEEP_STATE_WALKING) ++count; diff --git a/src/ride/ride.c b/src/ride/ride.c index 770af4911a..27eb49b92f 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -2437,7 +2437,7 @@ rct_peep *find_closest_mechanic(int x, int y, int forInspection) { unsigned int closestDistance, distance; uint16 spriteIndex; - rct_peep *peep, *closestMechanic; + rct_peep *peep, *closestMechanic = NULL; closestDistance = -1; FOR_ALL_STAFF(spriteIndex, peep) { @@ -3371,7 +3371,7 @@ rct_ride_music_info* ride_music_info_list[] = { */ void ride_music_update_final() { - rct_ride_music_params* edi; + rct_ride_music_params* edi = NULL; int ebx; if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2)) { if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0))) { diff --git a/src/ride/track.c b/src/ride/track.c index 155cca3eb2..c55c3d0cd8 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -2461,7 +2461,7 @@ int copy_scenery_to_track(uint8** track_pointer){ /* rct2: 0x006CEAAE */ int maze_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_elements){ - rct_map_element* map_element; + rct_map_element* map_element = NULL; uint8 map_found = 0; sint16 start_x, start_y; diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index b885a55439..0aa9843f4d 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -342,7 +342,7 @@ static void visible_list_refresh(rct_window *w) _listItems = realloc(_listItems, _numListItems * sizeof(list_item)); - sortFunc sortFunc; + sortFunc sortFunc = NULL; switch (_listSortType) { case RIDE_SORT_TYPE: sortFunc = visible_list_sort_ride_type; diff --git a/src/windows/guest_list.c b/src/windows/guest_list.c index 145defa3b5..2ec2e8770f 100644 --- a/src/windows/guest_list.c +++ b/src/windows/guest_list.c @@ -197,7 +197,7 @@ void window_guest_list_open_with_filter(int type, int index) RCT2_GLOBAL(0x009AC7E0, uint8) = 0; RCT2_GLOBAL(0x009AC7F0, uint8) = 0; - rct_ride *ride; + rct_ride *ride = NULL; if (type != 3) { // common for cases 0, 1, 2 ride = GET_RIDE(index & 0x000000FF); eax = ride->name; diff --git a/src/windows/scenery.c b/src/windows/scenery.c index 39865e9627..3deb35e692 100644 --- a/src/windows/scenery.c +++ b/src/windows/scenery.c @@ -312,11 +312,11 @@ void init_scenery() for (int widgetIndex = WIDX_SCENERY_TAB_1; widgetIndex < WIDX_SCENERY_LIST; widgetIndex++) window_scenery_widgets[widgetIndex].type = 0; - uint8 tabIndexes[0x13]; - uint8 order[0x13]; + uint8 tabIndexes[20]; + uint8 order[20]; int usedValues = 0; - for (int scenerySetId = 0; scenerySetId < 0x13; scenerySetId++) { + for (int scenerySetId = 0; scenerySetId < 19; scenerySetId++) { rct_scenery_set_entry* sceneryEntry = g_scenerySetEntries[scenerySetId]; if ((uint32)sceneryEntry == 0xFFFFFFFF) continue; @@ -345,7 +345,7 @@ void init_scenery() break; } - tabIndexes[usedValues] = 0x13; + tabIndexes[usedValues] = 19; usedValues++; uint16 left = 3; @@ -353,7 +353,7 @@ void init_scenery() uint32 tabIndex = tabIndexes[i]; rct_widget* tabWidget = &window_scenery_widgets[tabIndex + WIDX_SCENERY_TAB_1]; - if (left != 3 || tabIndex != 0x13) { + if (left != 3 || tabIndex != 19) { if (window_scenery_tab_entries[tabIndex][0] == -1) continue; @@ -366,7 +366,7 @@ void init_scenery() tabWidget->right = left + 0x1E; left += 0x1F; - if (tabIndex >= 0x13) + if (tabIndex >= 19) continue; tabWidget->image = g_scenerySetEntries[tabIndex]->image | 0x20000000; From 04dcca546848d1d9273d484762fb7c5d01044526 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 25 Jul 2015 02:58:38 +0100 Subject: [PATCH 0351/1173] implement peep_on_enter_or_exit_ride --- src/peep/peep.c | 270 ++++++++++++++++++++++++++++++++++++++++++++++-- src/peep/peep.h | 4 +- 2 files changed, 263 insertions(+), 11 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 545f38adc5..cfc31c828d 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -50,7 +50,11 @@ static void peep_stop_purchase_thought(rct_peep* peep, uint8 ride_type); static void sub_693BAB(rct_peep* peep); static void sub_693C9E(rct_peep *peep); static void peep_spend_money(rct_peep *peep, money16 *peep_expend_type, money32 amount); -static void sub_695444(rct_peep *peep, int rideIndex, int flags); +static void peep_set_has_ridden(rct_peep *peep, int rideIndex); +static bool peep_has_ridden(rct_peep *peep, int rideIndex); +static void peep_set_has_ridden_ride_type(rct_peep *peep, int rideType); +static bool peep_has_ridden_ride_type(rct_peep *peep, int rideType); +static void peep_on_enter_or_exit_ride(rct_peep *peep, int rideIndex, int flags); static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price); static bool peep_should_use_cash_machine(rct_peep *peep, int rideIndex); static void sub_69A98C(rct_peep *peep); @@ -1823,7 +1827,7 @@ void peep_update_ride_sub_state_1(rct_peep* peep){ peep->destination_tolerence = 3; ride->var_120++; - sub_695444(peep, peep->current_ride, 0); + peep_on_enter_or_exit_ride(peep, peep->current_ride, 0); peep->sub_state = 17; return; } @@ -1850,7 +1854,7 @@ void peep_update_ride_sub_state_1(rct_peep* peep){ peep->current_car = 0; ride->var_120++; - sub_695444(peep, peep->current_ride, 0); + peep_on_enter_or_exit_ride(peep, peep->current_ride, 0); peep->sub_state = 14; return; } @@ -2203,7 +2207,7 @@ static void peep_update_ride_sub_state_5(rct_peep* peep){ peep_window_state_update(seated_peep); seated_peep->time_on_ride = 0; seated_peep->sub_state = 6; - sub_695444(seated_peep, peep->current_ride, 0); + peep_on_enter_or_exit_ride(seated_peep, peep->current_ride, 0); } vehicle->num_peeps++; @@ -2222,7 +2226,7 @@ static void peep_update_ride_sub_state_5(rct_peep* peep){ peep->time_on_ride = 0; peep->sub_state = 6; - sub_695444(peep, peep->current_ride, 0); + peep_on_enter_or_exit_ride(peep, peep->current_ride, 0); } /* rct2: 0x00693028*/ @@ -3025,7 +3029,7 @@ static void peep_update_ride_sub_state_18(rct_peep* peep){ return; } - sub_695444(peep, peep->current_ride, 1); + peep_on_enter_or_exit_ride(peep, peep->current_ride, 1); if (peep->flags & PEEP_FLAGS_TRACKING){ RCT2_GLOBAL(0x13CE952, uint16) = peep->name_string_idx; @@ -5346,7 +5350,7 @@ rct_peep *peep_generate(int x, int y, int z) memset(&peep->rides_been_on, 0, 32); peep->no_of_rides = 0; - memset(&peep->var_48, 0, 16); + memset(&peep->ride_types_been_on, 0, 16); peep->id = RCT2_GLOBAL(0x013B0E6C, uint32)++; peep->name_string_idx = 767; @@ -5983,13 +5987,259 @@ static void peep_spend_money(rct_peep *peep, money16 *peep_expend_type, money32 sound_play_panned(SOUND_PURCHASE, 0x8001, peep->x, peep->y, peep->z); } +static void peep_set_has_ridden(rct_peep *peep, int rideIndex) +{ + peep->rides_been_on[rideIndex >> 5] |= 1 << (rideIndex & 0x1F); +} + +static bool peep_has_ridden(rct_peep *peep, int rideIndex) +{ + return peep->rides_been_on[rideIndex >> 5] & (1 << (rideIndex & 0x1F)); +} + +static void peep_set_has_ridden_ride_type(rct_peep *peep, int rideType) +{ + peep->rides_been_on[rideType >> 5] |= 1 << (rideType & 0x1F); +} + +static bool peep_has_ridden_ride_type(rct_peep *peep, int rideType) +{ + return peep->rides_been_on[rideType >> 5] & (1 << (rideType & 0x1F)); +} + +/** + * + * rct2: 0x0069545B + */ +static void peep_on_enter_ride(rct_peep *peep, int rideIndex) +{ + rct_ride *ride; + ride_rating minIntensity, maxIntensity; + ride_rating minNausea, maxNausea; + uint16 satisfactionFlags; + + ride = GET_RIDE(rideIndex); + peep->flags &= ~PEEP_FLAGS_19; + if (ride->excitement == (ride_rating)0xFFFF) { + satisfactionFlags = 0x1FF; + } else { + satisfactionFlags = 0; + maxIntensity = (peep->intensity & 0x0F) * 100; + minIntensity = (peep->intensity / 16) * 100; + if (maxIntensity <= ride->intensity || minIntensity >= ride->intensity) { + satisfactionFlags |= (1 << 1); + } + maxIntensity -= peep->happiness * 2; + minIntensity += peep->happiness; + if (maxIntensity <= ride->intensity || minIntensity >= ride->intensity) { + satisfactionFlags |= (1 << 4); + } + maxIntensity -= peep->happiness * 2; + minIntensity += peep->happiness; + if (maxIntensity <= ride->intensity || minIntensity >= ride->intensity) { + satisfactionFlags |= (1 << 7); + } + + minNausea = RCT2_ADDRESS(0x00982390, uint16)[(peep->nausea_tolerance & 3) * 2]; + maxNausea = RCT2_ADDRESS(0x00982392, uint16)[(peep->nausea_tolerance & 3) * 2]; + if (maxNausea <= ride->nausea || minNausea >= ride->nausea) { + satisfactionFlags |= (1 << 2); + } + maxNausea -= peep->happiness * 2; + minNausea += peep->happiness; + if (maxNausea <= ride->nausea || minNausea >= ride->nausea) { + satisfactionFlags |= (1 << 5); + } + maxNausea -= peep->happiness * 2; + minNausea += peep->happiness; + if (maxNausea <= ride->nausea || minNausea >= ride->nausea) { + satisfactionFlags |= (1 << 8); + } + satisfactionFlags |= (1 << 9); + } + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { + if (ride->value != 0xFFFF) { + satisfactionFlags &= ~(1 << 9); + satisfactionFlags |= (1 << 10); + if ((money16)ride->value < ride->price) { + satisfactionFlags &= ~(1 << 10); + satisfactionFlags |= (1 << 9); + if ((ride->value + ((ride->value * peep->happiness) / 256)) < ride->price) { + satisfactionFlags &= ~(1 << 9); + } + } + } + } + + uint8 satisfactionVar = 0; + if (satisfactionFlags & (1 << 9)) satisfactionVar += 15; + if (satisfactionFlags & (1 << 10)) satisfactionVar += 40; + if ((satisfactionFlags & (1 << 9)) && (satisfactionFlags & (1 << 10))) satisfactionVar -= 45; + if ((satisfactionFlags & 6) == 6) { + satisfactionVar += 70; + } else { + if (satisfactionFlags & 6) satisfactionVar += 15; + if ((satisfactionFlags & 0x30) == 0x30) { + satisfactionVar += 35; + } else { + if (satisfactionFlags & 0x30) satisfactionVar += 10; + if ((satisfactionFlags & 0x180) == 0x180) { + satisfactionVar += 10; + } else { + satisfactionVar -= 60; + } + } + } + + if (peep->time_in_queue <= 750) { + satisfactionVar += 10; + } else if (peep->time_in_queue >= 2250) { + satisfactionVar -= 10; + if (peep->time_in_queue >= 4500) { + satisfactionVar -= 25; + } + } + + if (peep_has_ridden(peep, peep->current_ride)) satisfactionVar += 10; + peep_set_has_ridden(peep, peep->current_ride); + if (peep->no_of_rides < 255) peep->no_of_rides++; + + if (peep_has_ridden_ride_type(peep, ride->type)) satisfactionVar += 10; + peep_set_has_ridden_ride_type(peep, ride->type); + + uint8 unkExcitementValue = clamp(0, (ride->excitement / 4) + peep->happiness, 255); + if (unkExcitementValue >= peep->var_FA) { + if (peep->happiness >= 160 && peep->happiness_growth_rate >= 160) { + peep->var_FA = unkExcitementValue; + peep->flags |= PEEP_FLAGS_19; + } + } + + uint8 satisfaction = 0; + if (satisfactionVar >= 0) { + satisfaction++; + if (satisfactionVar >= 20) { + satisfaction++; + if (satisfactionVar >= 40) { + satisfaction++; + } + } + } + ride_update_satisfaction(ride, satisfaction); + peep->happiness_growth_rate = clamp(0, satisfactionVar + peep->happiness_growth_rate, 255); + + uint32 nauseaMultiplier = clamp(64, 256 - peep->happiness_growth_rate, 200); + uint32 nauseaGrowthRateChange = (ride->nausea * nauseaMultiplier) / 512; + nauseaGrowthRateChange *= max(128, peep->hunger); + nauseaGrowthRateChange /= 128; + nauseaGrowthRateChange *= 2; + nauseaGrowthRateChange >>= (peep->nausea_tolerance & 3); + peep->nausea_growth_rate = (uint8)clamp(0, peep->nausea_growth_rate + nauseaGrowthRateChange, 255); +} + +static bool peep_should_go_on_ride_again(rct_peep *peep, rct_ride *ride) +{ + if (!(RCT2_GLOBAL(0x0097CF40 + (ride->type * 8), uint32) & 0x100000)) return false; + if (ride->excitement == (ride_rating)0xFFFF) return false; + if (ride->intensity > RIDE_RATING(10,00)) return false; + if (peep->happiness < 180) return false; + if (peep->energy < 100) return false; + if (peep->nausea > 160) return false; + if (peep->hunger < 30) return false; + if (peep->thirst < 20) return false; + if (peep->balloon_colour > 170) return false; + + uint8 r = (scenario_rand() & 0xFF); + if (r <= 128) { + if (peep->no_of_rides > 7) return false; + if (r > 64) return false; + } + + return true; +} + +static bool peep_should_preferred_intensity_increase(rct_peep *peep) +{ + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PREF_LESS_INTENSE_RIDES) return false; + if (peep->happiness < 200) return false; + + return (scenario_rand() & 0xFF) >= peep->intensity; +} + +static bool peep_really_liked_ride(rct_peep *peep, rct_ride *ride) +{ + return + peep->happiness >= 215 && + peep->nausea <= 120 && + ride->excitement != (ride_rating)0xFFFF && + ride->intensity <= RIDE_RATING(10,00); +} + +/** + * + * rct2: 0x0069576E + */ +static void peep_on_exit_ride(rct_peep *peep, int rideIndex) +{ + rct_ride *ride = GET_RIDE(rideIndex); + + if (peep->flags & PEEP_FLAGS_19) { + peep->flags &= ~PEEP_FLAGS_19; + peep->favourite_ride = rideIndex; + // TODO fix this flag name or add another one + peep->window_invalidate_flags |= PEEP_INVALIDATE_STAFF_STATS; + } + peep->happiness = peep->happiness_growth_rate; + peep->nausea = peep->nausea_growth_rate; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_STATS; + + if (peep_should_go_on_ride_again(peep, ride)) { + peep->guest_heading_to_ride_id = rideIndex; + peep->var_C6 = 200; + sub_69A98C(peep); + + rct_window *w = window_find_by_number(WC_PEEP, peep->sprite_index); + if (w != NULL) { + window_event_invalidate_call(w); + widget_invalidate(w, 12); + } + } + + if (peep_should_preferred_intensity_increase(peep)) { + if (peep->intensity <= 255 - 16) { + peep->intensity += 16; + } + } + + if (peep->flags & PEEP_FLAGS_26) { + peep_insert_new_thought(peep, PEEP_THOUGHT_NICE_RIDE, 255); + } + + if (peep_really_liked_ride(peep, ride)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_WAS_GREAT, rideIndex); + + int laugh = scenario_rand() & 7; + if (laugh < 3) { + sound_play_panned(SOUND_LAUGH_1 + laugh, 0x8001, peep->x, peep->y, peep->z); + } + } + + ride->total_customers++; + ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_CUSTOMER; +} + /** * * rct2: 0x00695444 */ -static void sub_695444(rct_peep *peep, int rideIndex, int flags) +static void peep_on_enter_or_exit_ride(rct_peep *peep, int rideIndex, int flags) { - RCT2_CALLPROC_X(0x00695444, 0, 0, 0, (rideIndex & 0xFF) | (flags << 8), (int)peep, 0, 0); + if (flags & 1) { + peep_on_exit_ride(peep, rideIndex); + } else { + peep_on_enter_ride(peep, rideIndex); + } } /** @@ -6364,7 +6614,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) // Consider rides that peep hasn't been on yet int i; FOR_ALL_RIDES(i, ride) { - if (!(peep->rides_been_on[i >> 5] & (i & 0x1F))) { + if (!peep_has_ridden(peep, i)) { RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= i & 0x1F; } } diff --git a/src/peep/peep.h b/src/peep/peep.h index 79fe7da4f3..5399d760b1 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -266,12 +266,14 @@ enum PEEP_FLAGS { PEEP_FLAGS_EATING = (1 << 17), // Reduces hunger PEEP_FLAGS_EXPLODE = (1 << 18), + PEEP_FLAGS_19 = (1 << 19), PEEP_FLAGS_20 = (1 << 20), PEEP_FLAGS_21 = (1 << 21), PEEP_FLAGS_JOY = (1 << 23), // Makes the peep jump in joy PEEP_FLAGS_ANGRY = (1 << 24), PEEP_FLAGS_ICE_CREAM = (1 << 25), // Unconfirmed + PEEP_FLAGS_26 = (1 << 26), PEEP_FLAGS_27 = (1 << 27), PEEP_FLAGS_TWITCH = (1 << 31) // Added for twitch integration }; @@ -414,7 +416,7 @@ typedef struct { uint8 nausea_tolerance; // 0x44 uint8 window_invalidate_flags; // 0x45 money16 paid_on_drink; // 0x46 - uint8 var_48[16]; + uint8 ride_types_been_on[16]; // 0x48 uint32 item_extra_flags; // 0x58 uint8 photo2_ride_ref; // 0x5C uint8 photo3_ride_ref; // 0x5D From bb46510def7e9f79055f4d3a938ad863266ee007 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Fri, 24 Jul 2015 19:03:06 -0600 Subject: [PATCH 0352/1173] implement map_can_construct_with_clear_at --- src/localisation/string_ids.h | 2 +- src/world/map.c | 99 ++++++++++++++++++++++++++++++++++- 2 files changed, 99 insertions(+), 2 deletions(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 7bdd8aba14..e4a5640fed 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -270,7 +270,7 @@ enum { STR_CAN_ONLY_BUILD_THIS_ON_WATER = 1032, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND = 1033, STR_CAN_ONLY_BUILD_THIS_ON_LAND = 1034, - + STR_LOCAL_AUTHORITY_WONT_ALLOW_CONSTRUCTION_ABOVE_TREE_HEIGHT = 1035, STR_LOAD_GAME_DIALOG_TITLE = 1036, STR_LOAD_LANDSCAPE_DIALOG_TITLE = 1037, STR_CONVERT_SAVED_GAME_TO_SCENARIO_1038 = 1038, diff --git a/src/world/map.c b/src/world/map.c index a3434ca198..2f501d3d3a 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2981,7 +2981,104 @@ rct_map_element *map_element_insert(int x, int y, int z, int flags) */ int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *clearFunc, uint8 bl) { - return (RCT2_CALLPROC_X(0x0068B932, x, bl, y, (zHigh << 8) | zLow, 0, 0, (int)clearFunc) & 0x100) == 0; + //return (RCT2_CALLPROC_X(0x0068B932, x, bl, y, (zHigh << 8) | zLow, 0, 0, (int)clearFunc) & 0x100) == 0; + RCT2_GLOBAL(0x00F1AD40, void*) = clearFunc; + RCT2_GLOBAL(0x00F1AD60, uint8) = 1; + if (x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16) || y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16) || x < 32 || y < 32) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_OFF_EDGE_OF_MAP; + return false; + } + rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); + do { + if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_SURFACE) { + if (zLow < map_element->clearance_height && zHigh > map_element->base_height && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)) { + if (map_element->flags & (bl & 0x0F)) { + goto loc_68BABC; + } + } + continue; + } + int water_height = ((map_element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) * 2); + if (water_height && water_height >= zLow && map_element->base_height < zHigh) { + RCT2_GLOBAL(0x00F1AD60, uint8) |= 4; + if (water_height > zHigh) { + goto loc_68BAE6; + } + } + loc_68B9B7: + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_FORBID_HIGH_CONSTRUCTION) { + int al = zHigh - map_element->base_height; + if (al >= 0) { + if (al > 18) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_LOCAL_AUTHORITY_WONT_ALLOW_CONSTRUCTION_ABOVE_TREE_HEIGHT; + return false; + } + } + } + if ((bl & 0xF0) != 0xF0) { + if (map_element->base_height >= zHigh) { + // loc_68BA81 + RCT2_GLOBAL(0x00F1AD60, uint8) |= 2; + RCT2_GLOBAL(0x00F1AD60, uint8) &= 0xFE; + } else { + int al = map_element->base_height; + int ah = al; + int cl = al; + int ch = al; + uint8 slope = map_element->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; //F + if (slope & 1) { + al += 2; + if (slope == 0x1B) + al += 2; + } + if (slope & 2) { + ah += 2; + if (slope == 0x17) + ah += 2; + } + if (slope & 4) { + cl += 2; + if (slope == 0x1E) + cl += 2; + } + if (slope & 8) { + ch += 2; + if (slope == 0x1D) + ch += 2; + } + int bh = zLow + 4; + if ((!(bl & 1) || (bl & 0x10 || zLow >= al) && bh >= al) && + (!(bl & 2) || (bl & 0x20 || zLow >= ah) && bh >= ah) && + (!(bl & 4) || (bl & 0x40 || zLow >= cl) && bh >= cl) && + (!(bl & 8) || (bl & 0x80 || zLow >= ch) && bh >= ch)) { + continue; + } + loc_68BABC: + if (RCT2_GLOBAL(0x00F1AD40, void*) != (void*)0xFFFFFFFF) { + int zero = 0; + if (!(RCT2_CALLFUNC_X((int)RCT2_GLOBAL(0x00F1AD40, void*), &zero, &zero, &zero, &zero, (int*)&map_element, &zero, &zero) & 0x100)) { + continue; + } + } + if (map_element != (rct_map_element*)0xFFFFFFF) { + RCT2_CALLPROC_X(0x0068BB18, 0, 0, 0, 0, (int)map_element, 0, 0); + } + return false; + loc_68BAE6: + if (RCT2_GLOBAL(0x00F1AD40, void*) != (void*)0xFFFFFFFF) { + int zero = 0; + if (!(RCT2_CALLFUNC_X((int)RCT2_GLOBAL(0x00F1AD40, void*), &zero, &zero, &zero, &zero, (int*)&map_element, &zero, &zero) & 0x100)) { + goto loc_68B9B7; + } + } + if (map_element != (rct_map_element*)0xFFFFFFF) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CANNOT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_WATER; + } + return false; + } + } + } while (!map_element_is_last_for_tile(map_element++)); + return true; } /** From 9cf5240c90f1f3dc8df58298abab842310aa0cc2 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Tue, 21 Jul 2015 19:17:25 +0100 Subject: [PATCH 0353/1173] Start implementing sub_693C9E --- src/peep/peep.c | 459 +++++++++++++++++++++++++++++++++++++++++++++++- src/peep/peep.h | 4 +- 2 files changed, 459 insertions(+), 4 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index cfc31c828d..29d90d3d04 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -33,6 +33,7 @@ #include "../sprites.h" #include "../world/sprite.h" #include "../world/scenery.h" +#include "../world/footpath.h" #include "../management/marketing.h" #include "peep.h" #include "staff.h" @@ -48,7 +49,7 @@ static int peep_empty_container_extra_flag(rct_peep* peep); static int peep_should_find_bench(rct_peep* peep); static void peep_stop_purchase_thought(rct_peep* peep, uint8 ride_type); static void sub_693BAB(rct_peep* peep); -static void sub_693C9E(rct_peep *peep); +static int sub_693C9E(rct_peep *peep); static void peep_spend_money(rct_peep *peep, money16 *peep_expend_type, money32 amount); static void peep_set_has_ridden(rct_peep *peep, int rideIndex); static bool peep_has_ridden(rct_peep *peep, int rideIndex); @@ -57,6 +58,7 @@ static bool peep_has_ridden_ride_type(rct_peep *peep, int rideType); static void peep_on_enter_or_exit_ride(rct_peep *peep, int rideIndex, int flags); static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price); static bool peep_should_use_cash_machine(rct_peep *peep, int rideIndex); +static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp); static void sub_69A98C(rct_peep *peep); static void sub_68FD3A(rct_peep *peep); static bool sub_690B99(rct_peep *peep, int edge, uint8 *rideToView, uint8 *rideSeatToView); @@ -5955,12 +5957,465 @@ void sub_693BAB(rct_peep* peep) { } } +/** + * + * rct2: 0x00693CBB + */ +static int peep_update_queue_position(rct_peep* peep){ + peep->time_in_queue++; + if (peep->next_in_queue == 0xFFFF) + return 0; + + rct_peep* peep_next = GET_PEEP(peep->next_in_queue); + + sint16 x_diff = abs(peep_next->x - peep->x); + sint16 y_diff = abs(peep_next->y - peep->y); + sint16 z_diff = abs(peep_next->z - peep->z); + + if (z_diff > 10) + return 0; + + if (x_diff < y_diff){ + sint16 temp_x = x_diff; + x_diff = y_diff; + y_diff = temp_x; + } + + x_diff += y_diff / 2; + if (x_diff > 7){ + if (x_diff > 13){ + if ((peep->x & 0xFFE0) != (peep_next->x & 0xFFE0) || + (peep->y & 0xFFE0) != (peep_next->y & 0xFFE0)) + return 0; + } + + if (peep->sprite_direction != peep_next->sprite_direction) + return 0; + + switch (peep->sprite_direction / 8){ + case 0: + if (peep->x >= peep_next->x) + return 0; + break; + case 1: + if (peep->y <= peep_next->y) + return 0; + break; + case 2: + if (peep->x <= peep_next->x) + return 0; + break; + case 3: + if (peep->y >= peep_next->y) + return 0; + break; + } + } + + sint16 xy_dist, x, y; + if (peep->action < PEEP_ACTION_NONE_1) + peep_update_action(&x, &y, &xy_dist, peep); + + if (peep->action != PEEP_ACTION_NONE_2) + return 1; + + peep->action = PEEP_ACTION_NONE_1; + peep->var_6F = 2; + if (RCT2_GLOBAL(0x00F1AEF1, uint8) != 0xFE) + invalidate_sprite((rct_sprite*)peep); + return 1; +} + +/* rct2: 0x00693EF2 */ +static int peep_return_to_center_of_tile(rct_peep* peep){ + peep->var_78 ^= (1 << 1); + peep->destination_x = peep->x & 0xFFE0 + 16; + peep->destination_y = peep->y & 0xFFE0 + 16; + peep->destination_tolerence = 5; + return 1; +} + +/* rct2: 0x00693f2C*/ +static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_map_element* map_element){ + uint8 entranceType = map_element->properties.entrance.type; + uint8 rideIndex = map_element->properties.entrance.ride_index; + + if (entranceType == ENTRANCE_TYPE_RIDE_EXIT){ + RCT2_GLOBAL(0x00F1EE18, uint8) |= (1 << 2); + RCT2_GLOBAL(0x00F1EE1A, rct_map_element*) = map_element; + } + else if (entranceType == ENTRANCE_TYPE_RIDE_ENTRANCE){ + RCT2_GLOBAL(0x00F1EE18, uint8) |= (1 << 3); + RCT2_GLOBAL(0x00F1EE1A, rct_map_element*) = map_element; + } + + if (entranceType == ENTRANCE_TYPE_RIDE_EXIT){ + peep->var_79 = 0xFF; + return peep_return_to_center_of_tile(peep); + } + + if (entranceType == ENTRANCE_TYPE_RIDE_ENTRANCE){ + if (peep->type == PEEP_TYPE_STAFF){ + peep->var_79 = 0xFF; + return peep_return_to_center_of_tile(peep); + } + + if (peep->state = PEEP_STATE_QUEUING){ + peep->sub_state = 11; + peep->action_sprite_image_offset = RCT2_GLOBAL(0x00F1AEF0, uint8); + return 1; + } + + if (peep->var_79 == rideIndex) + return peep_return_to_center_of_tile(peep); + + peep->var_F4 = 0; + uint8 stationNum = (map_element->properties.entrance.index >> 4) & 0x7; + if (!sub_6960AB(peep, rideIndex, stationNum, 0)){ + peep->var_79 = rideIndex; + return peep_return_to_center_of_tile(peep); + } + + peep->action_sprite_image_offset = RCT2_GLOBAL(0x00F1AEF0, uint8); + peep->var_79 = rideIndex; + + rct_ride* ride = GET_RIDE(rideIndex); + uint16 previous_first = ride->first_peep_in_queue[stationNum]; + ride->first_peep_in_queue[stationNum] = peep->sprite_index; + peep->next_in_queue = previous_first; + ride->queue_length[stationNum]++; + + peep_decrement_num_riders(peep); + peep->current_ride = rideIndex; + peep->current_ride_station = stationNum; + peep->state = PEEP_STATE_QUEUING; + peep->days_in_queue = 0; + peep_window_state_update(peep); + peep->sub_state = 11; + peep->time_in_queue = 0; + if (peep->flags & PEEP_FLAGS_TRACKING){ + RCT2_GLOBAL(0x0013CE952, rct_string_id) = peep->name_string_idx; + RCT2_GLOBAL(0x0013CE954, uint32) = peep->id; + RCT2_GLOBAL(0x0013CE958, rct_string_id) = ride->name; + RCT2_GLOBAL(0x0013CE95A, uint32) = ride->name_arguments; + news_item_add_to_queue(NEWS_ITEM_PEEP_ON_RIDE, 1931, peep->sprite_index); + } + return 1; + } + else{ + // PARK_ENTRANCE + if (peep->type == PEEP_TYPE_STAFF) + return peep_return_to_center_of_tile(peep); + + // If not the center of the entrance arch + if (map_element->properties.entrance.index & 0xF) + return peep_return_to_center_of_tile(peep); + + uint8 entranceDirection = map_element->type & MAP_ELEMENT_DIRECTION_MASK; + if (entranceDirection != peep->var_78){ + if ((entranceDirection ^ (1 << 1)) != peep->var_78) + return peep_return_to_center_of_tile(peep); + // Peep is leaving the park. + if (peep->state != PEEP_STATE_WALKING) + return peep_return_to_center_of_tile(peep); + + if (!(peep->flags & PEEP_FLAGS_LEAVING_PARK)){ + // If the park is open and leaving flag isnt set return to center + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_OPEN) + return peep_return_to_center_of_tile(peep); + } + + peep->destination_x += RCT2_ADDRESS(0x00993CCC, sint16)[peep->var_78 * 2]; + peep->destination_y += RCT2_ADDRESS(0x00993CCE, sint16)[peep->var_78 * 2]; + peep->destination_tolerence = 9; + invalidate_sprite((rct_sprite*)peep); + sprite_move(peep->destination_x, peep->destination_y, peep->z, (rct_sprite*)peep); + invalidate_sprite((rct_sprite*)peep); + + peep_decrement_num_riders(peep); + peep->state = PEEP_STATE_LEAVING_PARK; + peep_window_state_update(peep); + + peep->var_37 = 0; + if (peep->flags & PEEP_FLAGS_TRACKING){ + RCT2_GLOBAL(0x0013CE952, rct_string_id) = peep->name_string_idx; + RCT2_GLOBAL(0x0013CE954, uint32) = peep->id; + news_item_add_to_queue(NEWS_ITEM_PEEP_ON_RIDE, 1935, peep->sprite_index); + } + return 1; + } + + // Peep is entering the park. + + if (peep->state != PEEP_STATE_ENTERING_PARK) + return peep_return_to_center_of_tile(peep); + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_OPEN)){ + peep->state = PEEP_STATE_LEAVING_PARK; + peep->var_37 = 1; + RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16)--; + peep_window_state_update(peep); + return peep_return_to_center_of_tile(peep); + } + + uint8 entranceIndex = 0; + while (1){ + if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[entranceIndex] == (x & 0xFFE0) && + RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, sint16)[entranceIndex] == (y & 0xFFE0)) + break; + entranceIndex++; + } + + sint16 z = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Z, sint16)[entranceIndex] / 8; + entranceDirection = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_DIRECTION, uint8)[entranceIndex]; + + sint16 next_x = (x & 0xFFE0) + RCT2_ADDRESS(0x00993CCC, sint16)[entranceDirection * 2]; + sint16 next_y = (y & 0xFFE0) + RCT2_ADDRESS(0x00993CCE, sint16)[entranceDirection * 2]; + + uint8 found = 0; + rct_map_element* nextMapElement = map_get_first_element_at(next_x / 32, next_y / 32); + do{ + if (map_element_get_type(nextMapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + + if (nextMapElement->type & 1) + continue; + + if (footpath_element_is_sloped(nextMapElement)){ + uint8 slopeDirection = footpath_element_get_slope_direction(nextMapElement); + if (slopeDirection == entranceDirection){ + if (z != nextMapElement->base_height){ + continue; + } + found = 1; + break; + } + + if ((slopeDirection ^ (1 << 1)) != entranceDirection) + continue; + + if (z - 2 != nextMapElement->base_height) + continue; + found = 1; + break; + } + else{ + if (z != nextMapElement->base_height){ + continue; + } + found = 1; + break; + } + } while (!map_element_is_last_for_tile(nextMapElement++)); + + if (!found){ + peep->state = PEEP_STATE_LEAVING_PARK; + peep->var_37 = 1; + RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16)--; + peep_window_state_update(peep); + return peep_return_to_center_of_tile(peep); + } + + money16 entranceFee = RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, money16); + if (entranceFee != 0){ + if (peep->item_standard_flags & PEEP_ITEM_VOUCHER){ + if (peep->voucher_type == VOUCHER_TYPE_PARK_ENTRY_HALF_PRICE){ + entranceFee /= 2; + peep->item_standard_flags &= ~PEEP_ITEM_VOUCHER; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; + } + else if (peep->voucher_type == VOUCHER_TYPE_PARK_ENTRY_FREE){ + entranceFee = 0; + peep->item_standard_flags &= ~PEEP_ITEM_VOUCHER; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; + } + } + if (entranceFee > peep->cash_in_pocket){ + peep->state = PEEP_STATE_LEAVING_PARK; + peep->var_37 = 1; + RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16)--; + peep_window_state_update(peep); + return peep_return_to_center_of_tile(peep); + } + + RCT2_GLOBAL(RCT2_ADDRESS_INCOME_FROM_ADMISSIONS, money32) += entranceFee; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_PARK_ENTRANCE_TICKETS * 4; + peep_spend_money(peep, &peep->paid_to_enter, entranceFee); + peep->flags |= PEEP_FLAGS_5; + } + + RCT2_GLOBAL(RCT2_ADDRESS_TOTAL_ADMISSIONS, uint32)++; + window_invalidate_by_number(WC_PARK_INFORMATION, 0); + + peep->var_37 = 1; + peep->destination_x += RCT2_ADDRESS(0x00993CCC, sint16)[peep->var_78 * 2]; + peep->destination_y += RCT2_ADDRESS(0x00993CCE, sint16)[peep->var_78 * 2]; + peep->destination_tolerence = 7; + + invalidate_sprite((rct_sprite*)peep); + sprite_move(peep->destination_x, peep->destination_y, peep->z, (rct_sprite*)peep); + invalidate_sprite((rct_sprite*)peep); + + return 1; + } +} + +/* rct2: 0x00693F70 */ +static int peep_interact_with_shop(rct_peep* peep, sint16 x, sint16 y, rct_map_element* map_element){ + uint8 rideIndex = map_element->properties.track.ride_index; + rct_ride* ride = GET_RIDE(rideIndex); + + if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) + return 0; + + if (peep->type == PEEP_TYPE_STAFF) + return peep_return_to_center_of_tile(peep); + + peep->var_F4 = 0; + + if (ride->status != RIDE_STATUS_OPEN) + return peep_return_to_center_of_tile(peep); + + if (peep->var_79 == rideIndex) + return peep_return_to_center_of_tile(peep); + + if (peep->flags & PEEP_FLAGS_LEAVING_PARK) + return peep_return_to_center_of_tile(peep); + + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_21)){ + peep->var_F4 = 0; + if (!sub_6960AB(peep, rideIndex, 0, 0)) + return peep_return_to_center_of_tile(peep); + + money16 cost = ride->price; + if (cost != 0){ + ride->total_profit += cost; + ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_PARK_RIDE_TICKETS * 4; + peep_spend_money(peep, NULL, cost); + } + peep->destination_x = x + 16; + peep->destination_y = y + 16; + peep->destination_tolerence = 3; + + peep_decrement_num_riders(peep); + peep->current_ride = rideIndex; + peep->state = PEEP_STATE_ENTERING_RIDE; + peep->sub_state = 19; + peep_window_state_update(peep); + + peep->time_on_ride = 0; + ride->var_120++; + if (peep->flags & PEEP_FLAGS_TRACKING){ + RCT2_GLOBAL(0x0013CE952, rct_string_id) = peep->name_string_idx; + RCT2_GLOBAL(0x0013CE954, uint32) = peep->id; + RCT2_GLOBAL(0x0013CE958, rct_string_id) = ride->name; + RCT2_GLOBAL(0x0013CE95A, uint32) = ride->name_arguments; + rct_string_id string_id = ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IN_RIDE) ? 1933 : 1932; + news_item_add_to_queue(NEWS_ITEM_PEEP_ON_RIDE, string_id, peep->sprite_index); + } + return 1; + } + else{ + if (peep->guest_heading_to_ride_id == rideIndex) + peep->guest_heading_to_ride_id = 0xFF; + peep->action_sprite_image_offset = RCT2_GLOBAL(0x00F1AEF0, uint8); + peep_decrement_num_riders(peep); + peep->current_ride = rideIndex; + peep->state = PEEP_STATE_BUYING; + peep->sub_state = 0; + peep_window_state_update(peep); + return 1; + } +} + /** * * rct2: 0x00693C9E */ -static void sub_693C9E(rct_peep *peep) +static int sub_693C9E(rct_peep *peep) { + RCT2_GLOBAL(0x00F1EE18, uint16) = 0; + RCT2_GLOBAL(0x00F1AEF1, uint8) = peep->action; + + if (peep->action == PEEP_ACTION_NONE_1) + peep->action = PEEP_ACTION_NONE_2; + + if (peep->state == PEEP_STATE_QUEUING){ + if (peep_update_queue_position(peep)) + return 1; + } + + //693dc1 + sint16 x, y, xy_dist; + if (!peep_update_action(&x, &y, &xy_dist, peep)){ + RCT2_GLOBAL(0x00F1EE18, uint16) |= 1; + uint8 result = 0; + if (peep->type == PEEP_TYPE_GUEST){ + result = RCT2_CALLPROC_X(0x00694C35, x, 0, y, 0, (int)peep, 0, 0) & 0x100; + } + else{ + result = RCT2_CALLPROC_X(0x006BF926, x, 0, y, 0, (int)peep, 0, 0) & 0x100; + } + + if (result != 0) + return 1; + + if (peep_update_action(&x, &y, &xy_dist, peep)) + return 1; + } + + if ((x & 0xFFE0) == peep->next_x && (y & 0xFFE0) == peep->next_y){ + sint16 z = peep_get_height_on_slope(peep, x, y); + invalidate_sprite((rct_sprite*)peep); + sprite_move(x, y, z, (rct_sprite*)peep); + invalidate_sprite((rct_sprite*)peep); + return 1; + } + + //693e16 + if (x < 32 || y >= 32 || x < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) || y < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16)){ + if (peep->type == PEEP_TYPE_STAFF){ + RCT2_GLOBAL(0x00F1EE18, uint16) |= (1 << 1); + } + return peep_return_to_center_of_tile(peep); + } + + rct_map_element* mapElement = map_get_first_element_at(x / 32, y / 32); + sint16 base_z = max(0, (peep->z / 8) - 2); + sint16 top_z = (peep->z / 8) + 1; + + do{ + if (base_z > mapElement->base_height) + continue; + if (top_z < mapElement->base_height) + continue; + + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH){ + if ((mapElement->flags & MAP_ELEMENT_FLAG_GHOST)) + continue; + //goto 69455e + } + else if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_TRACK){ + if (peep_interact_with_shop(peep, x, y, mapElement)) + return 1; + } + else if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_ENTRANCE){ + if (peep_interact_with_entrance(peep, x, y, mapElement)) + return 1; + } + } while (!map_element_is_last_for_tile(mapElement++)); + + if (peep->type == PEEP_TYPE_STAFF || (peep->next_var_29 & 0x18)){ + sint16 z = abs(map_element_height(x, y) - peep->z); + + if (z <= 3 || (peep->type == PEEP_TYPE_STAFF && z <= 32)){ + //goto 6944d9 + } + } + return peep_return_to_center_of_tile(peep); + + RCT2_CALLPROC_X(0x00693C9E, 0, 0, 0, 0, (int)peep, 0, 0); } diff --git a/src/peep/peep.h b/src/peep/peep.h index 5399d760b1..a532ecd6bb 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -252,7 +252,7 @@ enum PEEP_FLAGS { PEEP_FLAGS_TRACKING = (1 << 3), PEEP_FLAGS_WAVING = (1 << 4), // Makes the peep wave - PEEP_FLAGS_5 = (1 << 5), + PEEP_FLAGS_5 = (1 << 5), // Set on paying to enter park? PEEP_FLAGS_PHOTO = (1 << 6), // Makes the peep take a picture PEEP_FLAGS_PAINTING = (1 << 7), PEEP_FLAGS_WOW = (1 << 8), // Makes a peep WOW2 @@ -451,7 +451,7 @@ typedef struct { uint8 pad_77; union{ uint8 maze_last_edge; // 0x78 - uint8 var_78; + uint8 var_78; //Direction ? }; uint8 var_79; uint16 time_in_queue; // 0x7A From 0ca26a7fca495bdd9961da774096a1a424f7148c Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Thu, 23 Jul 2015 21:22:58 +0100 Subject: [PATCH 0354/1173] Fix #1430 --- src/peep/peep.c | 287 +++++++++++++++++++++++++++++++++++++++++++++--- src/peep/peep.h | 6 +- 2 files changed, 274 insertions(+), 19 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 29d90d3d04..b64053b3fe 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -3882,8 +3882,8 @@ static void peep_update_walking_break_scenery(rct_peep* peep){ if (peep->energy < 85) return; if (peep->state != PEEP_STATE_WALKING) return; - if ((peep->var_E1 & 0xC0) != 0xC0 && - (peep->var_E3 & 0xC0) != 0xC0) return; + if ((peep->litter_count & 0xC0) != 0xC0 && + (peep->disgusting_count & 0xC0) != 0xC0) return; if ((scenario_rand() & 0xFFFF) > 3276) return; } @@ -5378,8 +5378,8 @@ rct_peep *peep_generate(int x, int y, int z) peep->item_standard_flags = 0; peep->item_extra_flags = 0; peep->guest_heading_to_ride_id = 0xFF; - peep->var_E1 = 0; - peep->var_E3 = 0; + peep->litter_count = 0; + peep->disgusting_count = 0; peep->var_EF = 0; peep->paid_to_enter = 0; peep->paid_on_rides = 0; @@ -6060,7 +6060,7 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m return peep_return_to_center_of_tile(peep); } - if (peep->state = PEEP_STATE_QUEUING){ + if (peep->state == PEEP_STATE_QUEUING){ peep->sub_state = 11; peep->action_sprite_image_offset = RCT2_GLOBAL(0x00F1AEF0, uint8); return 1; @@ -6217,7 +6217,7 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m } money16 entranceFee = RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, money16); - if (entranceFee != 0){ + if (entranceFee != 0 && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)){ if (peep->item_standard_flags & PEEP_ITEM_VOUCHER){ if (peep->voucher_type == VOUCHER_TYPE_PARK_ENTRY_HALF_PRICE){ entranceFee /= 2; @@ -6260,6 +6260,232 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m } } +/* rct2: 0x006946D8 */ +static int peep_queue_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_map_element* map_element, bool vandalism){ + peep->next_x = (x & 0xFFE0); + peep->next_y = (y & 0xFFE0); + peep->next_z = map_element->base_height; + peep->next_var_29 = map_element->properties.path.type & 3; + + sint16 z = peep_get_height_on_slope(peep, x, y); + + if (peep->type == PEEP_TYPE_STAFF){ + invalidate_sprite((rct_sprite*)peep); + sprite_move(x, y, z, (rct_sprite*)peep); + invalidate_sprite((rct_sprite*)peep); + return 1; + } + //6946FB + uint8 var_EF = (peep->var_EF * 2) & 0x3F; + peep->var_EF &= 0xC0; + peep->var_EF |= var_EF; + + if (RCT2_GLOBAL(0x00F1AEE2, uint8) == 1){ + peep->var_EF |= 1; + if (peep->var_EF & 0x3E && + !(peep->var_EF & 0xC0)){ + + if ((scenario_rand() & 0xFFFF) <= 10922){ + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_VANDALISM, 0xFF); + peep->happiness_growth_rate = max(0, peep->happiness_growth_rate - 17); + } + peep->var_EF |= 0xC0; + } + } + + if (peep->var_EF & 0xC0 && + (scenario_rand()&0xFFFF) <= 4369){ + peep->var_EF -= 0x40; + } + + uint16 crowded = 0; + uint8 litter_count = 0; + uint8 sick_count = 0; + uint16 sprite_id = RCT2_ADDRESS(0xF1EF60, uint16)[((x & 0x1FE0) << 3) | (y >> 5)]; + for (rct_sprite* sprite; sprite_id != 0xFFFF; sprite_id = sprite->unknown.next_in_quadrant){ + sprite = &g_sprite_list[sprite_id]; + if (sprite->unknown.sprite_identifier == SPRITE_IDENTIFIER_PEEP){ + rct_peep* other_peep = (rct_peep*)sprite; + if (other_peep->state != PEEP_STATE_WALKING) + continue; + + if (abs(other_peep->z - peep->next_z * 8) > 16) + continue; + crowded++; + continue; + } + else if (sprite->unknown.sprite_identifier == SPRITE_IDENTIFIER_LITTER){ + rct_litter* litter = (rct_litter*)sprite; + if (abs(litter->z - peep->next_z * 8) > 16) + continue; + + litter_count++; + if (litter->type > 1) + continue; + + litter_count--; + sick_count++; + } + } + + if (crowded >= 10 && + peep->state == PEEP_STATE_WALKING && + (scenario_rand() & 0xFFFF) <= 21845){ + + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CROWDED, 0xFF); + peep->happiness_growth_rate = max(0, peep->happiness_growth_rate - 14); + } + + litter_count = min(3, litter_count); + sick_count = min(3, sick_count); + + uint8 disgusting_time = peep->disgusting_count & 0xC0; + uint8 disgusting_count = ((peep->disgusting_count & 0xF) << 2) | sick_count; + peep->disgusting_count = disgusting_count | disgusting_time; + + if (disgusting_time & 0xC0 && + (scenario_rand() & 0xFFFF) <= 4369){ + // Reduce the disgusting time + peep->disgusting_count -= 0x40; + } + else{ + uint8 total_sick = 0; + for (uint8 time = 0; time < 3; time++){ + total_sick += (disgusting_count >> (2 * time)) & 0x3; + } + + if (total_sick >= 3 && + (scenario_rand() & 0xFFFF) <= 10922){ + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_PATH_DISGUSTING, 0xFF); + peep->happiness_growth_rate = max(0, peep->happiness_growth_rate - 17); + // Reset disgusting time + peep->disgusting_count |= 0xC0; + } + } + + uint8 litter_time = peep->litter_count & 0xC0; + litter_count = ((peep->litter_count & 0xF) << 2) | litter_count; + peep->litter_count = litter_count | litter_time; + + if (litter_time & 0xC0 && + (scenario_rand() & 0xFFFF) <= 4369){ + // Reduce the litter time + peep->litter_count -= 0x40; + } + else{ + uint8 total_litter = 0; + for (uint8 time = 0; time < 3; time++){ + total_litter += (litter_count >> (2 * time)) & 0x3; + } + + if (total_litter >= 3 && + (scenario_rand() & 0xFFFF) <= 10922){ + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_BAD_LITTER, 0xFF); + peep->happiness_growth_rate = max(0, peep->happiness_growth_rate - 17); + // Reset litter time + peep->litter_count |= 0xC0; + } + } + + invalidate_sprite((rct_sprite*)peep); + sprite_move(x, y, z, (rct_sprite*)peep); + invalidate_sprite((rct_sprite*)peep); + return 1; +} + +/* rct2: 0x0069455E */ +static int peep_interact_with_path(rct_peep* peep, sint16 x, sint16 y, rct_map_element* map_element){ + + // 0x00F1AEE2 + bool vandalism_present = false; + if ((map_element->properties.path.additions & 0xF) != 0 && + (map_element->flags & MAP_ELEMENT_FLAG_BROKEN) && + (map_element->properties.path.edges & 0xF) != 0xF){ + vandalism_present = 1; + } + + sint16 z = map_element->base_height * 8; + if (!map_is_location_owned(x, y, z)){ + if (peep->var_2A == 0) + return peep_return_to_center_of_tile(peep); + } + else{ + if (peep->var_2A == 1) + return peep_return_to_center_of_tile(peep); + } + + if (peep->type == PEEP_TYPE_GUEST && + footpath_element_is_queue(map_element)){ + //6945d8 + uint8 rideIndex = map_element->properties.path.ride_index; + + if (rideIndex == 0xFF){ + peep->var_79 = 0xFF; + return peep_queue_move_forward(peep, x, y, map_element, vandalism_present); + } + + if (peep->state == PEEP_STATE_QUEUING){ + if (peep->current_ride == rideIndex){ + return peep_queue_move_forward(peep, x, y, map_element, vandalism_present); + } + remove_peep_from_queue(peep); + peep_decrement_num_riders(peep); + peep->state = PEEP_STATE_1; + peep_window_state_update(peep); + return peep_queue_move_forward(peep, x, y, map_element, vandalism_present); + } + + if (peep->var_79 == rideIndex){ + return peep_queue_move_forward(peep, x, y, map_element, vandalism_present); + } + + peep->var_F4 = 0; + uint8 stationNum = (map_element->properties.path.additions & 0x70) >> 4; + if (!sub_6960AB(peep, rideIndex, stationNum, 1)){ + peep->var_79 = rideIndex; + return peep_return_to_center_of_tile(peep); + } + + peep->var_79 = rideIndex; + rct_ride* ride = GET_RIDE(rideIndex); + + uint16 old_first_peep = ride->first_peep_in_queue[stationNum]; + ride->first_peep_in_queue[stationNum] = peep->sprite_index; + peep->next_in_queue = old_first_peep; + ride->queue_length[stationNum]++; + + peep_decrement_num_riders(peep); + peep->current_ride = rideIndex; + peep->current_ride_station = stationNum; + peep->state = PEEP_STATE_QUEUING; + peep->days_in_queue = 0; + peep_window_state_update(peep); + + peep->sub_state = 10; + peep->destination_tolerence = 2; + peep->time_in_queue = 0; + if (peep->flags & PEEP_FLAGS_TRACKING){ + RCT2_GLOBAL(0x0013CE952, rct_string_id) = peep->name_string_idx; + RCT2_GLOBAL(0x0013CE954, uint32) = peep->id; + RCT2_GLOBAL(0x0013CE958, rct_string_id) = ride->name; + RCT2_GLOBAL(0x0013CE95A, uint32) = ride->name_arguments; + news_item_add_to_queue(NEWS_ITEM_PEEP_ON_RIDE, 1931, peep->sprite_index); + } + + return peep_queue_move_forward(peep, x, y, map_element, vandalism_present); + } + else{ + peep->var_79 = 0xFF; + if (peep->state == PEEP_STATE_QUEUING){ + remove_peep_from_queue(peep); + peep_decrement_num_riders(peep); + peep->state = PEEP_STATE_1; + peep_window_state_update(peep); + } + return peep_queue_move_forward(peep, x, y, map_element, vandalism_present); + } +} + /* rct2: 0x00693F70 */ static int peep_interact_with_shop(rct_peep* peep, sint16 x, sint16 y, rct_map_element* map_element){ uint8 rideIndex = map_element->properties.track.ride_index; @@ -6294,8 +6520,8 @@ static int peep_interact_with_shop(rct_peep* peep, sint16 x, sint16 y, rct_map_e RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_PARK_RIDE_TICKETS * 4; peep_spend_money(peep, NULL, cost); } - peep->destination_x = x + 16; - peep->destination_y = y + 16; + peep->destination_x = (x & 0xFFE0) + 16; + peep->destination_y = (y & 0xFFE0) + 16; peep->destination_tolerence = 3; peep_decrement_num_riders(peep); @@ -6361,7 +6587,7 @@ static int sub_693C9E(rct_peep *peep) if (result != 0) return 1; - if (peep_update_action(&x, &y, &xy_dist, peep)) + if (!peep_update_action(&x, &y, &xy_dist, peep)) return 1; } @@ -6374,7 +6600,7 @@ static int sub_693C9E(rct_peep *peep) } //693e16 - if (x < 32 || y >= 32 || x < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) || y < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16)){ + if (x < 32 || y < 32 || x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) || y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16)){ if (peep->type == PEEP_TYPE_STAFF){ RCT2_GLOBAL(0x00F1EE18, uint16) |= (1 << 1); } @@ -6394,7 +6620,8 @@ static int sub_693C9E(rct_peep *peep) if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH){ if ((mapElement->flags & MAP_ELEMENT_FLAG_GHOST)) continue; - //goto 69455e + if (peep_interact_with_path(peep, x, y, mapElement)) + return 1; } else if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_TRACK){ if (peep_interact_with_shop(peep, x, y, mapElement)) @@ -6410,13 +6637,39 @@ static int sub_693C9E(rct_peep *peep) sint16 z = abs(map_element_height(x, y) - peep->z); if (z <= 3 || (peep->type == PEEP_TYPE_STAFF && z <= 32)){ - //goto 6944d9 + peep->var_79 = 0xFF; + if (peep->state == PEEP_STATE_QUEUING){ + remove_peep_from_queue(peep); + peep_decrement_num_riders(peep); + peep->state = PEEP_STATE_1; + peep_window_state_update(peep); + } + + if (!map_is_location_in_park(x & 0xFFE0, y & 0xFFE0)){ + return peep_return_to_center_of_tile(peep); + } + + mapElement = map_get_surface_element_at(x / 32, y / 32); + if (mapElement == NULL) + return peep_return_to_center_of_tile(peep); + + sint16 water_height = mapElement->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK; + if (water_height) + return peep_return_to_center_of_tile(peep); + + peep->next_x = x & 0xFFE0; + peep->next_y = y & 0xFFE0; + peep->next_z = mapElement->base_height; + peep->next_var_29 = 8; + + sint16 z = peep_get_height_on_slope(peep, x, y); + invalidate_sprite((rct_sprite*)peep); + sprite_move(x, y, z, (rct_sprite*)peep); + invalidate_sprite((rct_sprite*)peep); + return 1; } } return peep_return_to_center_of_tile(peep); - - - RCT2_CALLPROC_X(0x00693C9E, 0, 0, 0, 0, (int)peep, 0, 0); } /** @@ -6867,7 +7120,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) } return true; } - if (bp & 2) { + if (!(bp & 2)) { if (ride->queue_length[dh] == 1000) goto loc_696645; if (!(bp & 1)) { @@ -6877,7 +7130,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) if (ride->first_peep_in_queue[dh] != 0xFFFF) { rct_peep *firstPeepInQueue = &(g_sprite_list[ride->first_peep_in_queue[dh]].peep); if (abs(firstPeepInQueue->z - peep->z) <= 6) { - int dx = abs(firstPeepInQueue->x = peep->x); + int dx = abs(firstPeepInQueue->x - peep->x); int dy = abs(firstPeepInQueue->y - peep->y); int maxD = max(dx, dy); if (maxD <= 13) { diff --git a/src/peep/peep.h b/src/peep/peep.h index a532ecd6bb..db10e81af4 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -481,12 +481,14 @@ typedef struct { uint32 var_CC; uint8 pad_D0[0x10]; uint8 no_action_frame_no; // 0xE0 - uint8 var_E1; + // 0x3F Litter Count split into lots of 3 with time, 0xC0 Time since last recalc + uint8 litter_count; // 0xE1 union{ uint8 time_on_ride; // 0xE2 uint8 var_E2; // 0xE2 }; - uint8 var_E3; + // 0x3F Sick Count split into lots of 3 with time, 0xC0 Time since last recalc + uint8 disgusting_count; // 0xE3 union{ money16 paid_to_enter; // 0xE4 uint16 staff_lawns_mown; // 0xE4 From c93671af3f4692123f10034a0ee28db90df31ad1 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 25 Jul 2015 00:35:34 +0100 Subject: [PATCH 0355/1173] Small refactor --- src/peep/peep.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index b64053b3fe..5bf4a6411d 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -6261,7 +6261,7 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m } /* rct2: 0x006946D8 */ -static int peep_queue_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_map_element* map_element, bool vandalism){ +static int peep_footpath_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_map_element* map_element, bool vandalism){ peep->next_x = (x & 0xFFE0); peep->next_y = (y & 0xFFE0); peep->next_z = map_element->base_height; @@ -6421,22 +6421,22 @@ static int peep_interact_with_path(rct_peep* peep, sint16 x, sint16 y, rct_map_e if (rideIndex == 0xFF){ peep->var_79 = 0xFF; - return peep_queue_move_forward(peep, x, y, map_element, vandalism_present); + return peep_footpath_move_forward(peep, x, y, map_element, vandalism_present); } if (peep->state == PEEP_STATE_QUEUING){ if (peep->current_ride == rideIndex){ - return peep_queue_move_forward(peep, x, y, map_element, vandalism_present); + return peep_footpath_move_forward(peep, x, y, map_element, vandalism_present); } remove_peep_from_queue(peep); peep_decrement_num_riders(peep); peep->state = PEEP_STATE_1; peep_window_state_update(peep); - return peep_queue_move_forward(peep, x, y, map_element, vandalism_present); + return peep_footpath_move_forward(peep, x, y, map_element, vandalism_present); } if (peep->var_79 == rideIndex){ - return peep_queue_move_forward(peep, x, y, map_element, vandalism_present); + return peep_footpath_move_forward(peep, x, y, map_element, vandalism_present); } peep->var_F4 = 0; @@ -6472,7 +6472,7 @@ static int peep_interact_with_path(rct_peep* peep, sint16 x, sint16 y, rct_map_e news_item_add_to_queue(NEWS_ITEM_PEEP_ON_RIDE, 1931, peep->sprite_index); } - return peep_queue_move_forward(peep, x, y, map_element, vandalism_present); + return peep_footpath_move_forward(peep, x, y, map_element, vandalism_present); } else{ peep->var_79 = 0xFF; @@ -6482,7 +6482,7 @@ static int peep_interact_with_path(rct_peep* peep, sint16 x, sint16 y, rct_map_e peep->state = PEEP_STATE_1; peep_window_state_update(peep); } - return peep_queue_move_forward(peep, x, y, map_element, vandalism_present); + return peep_footpath_move_forward(peep, x, y, map_element, vandalism_present); } } From 074b2a6909aa8899b5feb8a970ae2ff84fe0add8 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 25 Jul 2015 09:09:26 +0100 Subject: [PATCH 0356/1173] Remove code offset comments, fix destination bug --- src/peep/peep.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 5bf4a6411d..427ec4813f 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -6029,8 +6029,8 @@ static int peep_update_queue_position(rct_peep* peep){ /* rct2: 0x00693EF2 */ static int peep_return_to_center_of_tile(rct_peep* peep){ peep->var_78 ^= (1 << 1); - peep->destination_x = peep->x & 0xFFE0 + 16; - peep->destination_y = peep->y & 0xFFE0 + 16; + peep->destination_x = (peep->x & 0xFFE0) + 16; + peep->destination_y = (peep->y & 0xFFE0) + 16; peep->destination_tolerence = 5; return 1; } @@ -6275,7 +6275,7 @@ static int peep_footpath_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_ma invalidate_sprite((rct_sprite*)peep); return 1; } - //6946FB + uint8 var_EF = (peep->var_EF * 2) & 0x3F; peep->var_EF &= 0xC0; peep->var_EF |= var_EF; @@ -6416,7 +6416,7 @@ static int peep_interact_with_path(rct_peep* peep, sint16 x, sint16 y, rct_map_e if (peep->type == PEEP_TYPE_GUEST && footpath_element_is_queue(map_element)){ - //6945d8 + uint8 rideIndex = map_element->properties.path.ride_index; if (rideIndex == 0xFF){ @@ -6572,7 +6572,6 @@ static int sub_693C9E(rct_peep *peep) return 1; } - //693dc1 sint16 x, y, xy_dist; if (!peep_update_action(&x, &y, &xy_dist, peep)){ RCT2_GLOBAL(0x00F1EE18, uint16) |= 1; @@ -6599,7 +6598,6 @@ static int sub_693C9E(rct_peep *peep) return 1; } - //693e16 if (x < 32 || y < 32 || x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) || y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16)){ if (peep->type == PEEP_TYPE_STAFF){ RCT2_GLOBAL(0x00F1EE18, uint16) |= (1 << 1); From bff00b29bf5474c72de5b8c79ed4683d1bb9b02c Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 25 Jul 2015 10:12:51 +0100 Subject: [PATCH 0357/1173] Fix more small pathfinding bugs. Fix unset memory errors --- src/peep/peep.c | 10 +++++----- src/windows/guest.c | 2 +- src/windows/staff.c | 2 +- src/world/footpath.c | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 427ec4813f..001e328035 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -6129,7 +6129,7 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m peep->destination_y += RCT2_ADDRESS(0x00993CCE, sint16)[peep->var_78 * 2]; peep->destination_tolerence = 9; invalidate_sprite((rct_sprite*)peep); - sprite_move(peep->destination_x, peep->destination_y, peep->z, (rct_sprite*)peep); + sprite_move(x, y, peep->z, (rct_sprite*)peep); invalidate_sprite((rct_sprite*)peep); peep_decrement_num_riders(peep); @@ -6253,7 +6253,7 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m peep->destination_tolerence = 7; invalidate_sprite((rct_sprite*)peep); - sprite_move(peep->destination_x, peep->destination_y, peep->z, (rct_sprite*)peep); + sprite_move(x, y, peep->z, (rct_sprite*)peep); invalidate_sprite((rct_sprite*)peep); return 1; @@ -6265,7 +6265,7 @@ static int peep_footpath_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_ma peep->next_x = (x & 0xFFE0); peep->next_y = (y & 0xFFE0); peep->next_z = map_element->base_height; - peep->next_var_29 = map_element->properties.path.type & 3; + peep->next_var_29 = map_element->properties.path.type & 7; sint16 z = peep_get_height_on_slope(peep, x, y); @@ -6280,7 +6280,7 @@ static int peep_footpath_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_ma peep->var_EF &= 0xC0; peep->var_EF |= var_EF; - if (RCT2_GLOBAL(0x00F1AEE2, uint8) == 1){ + if (vandalism == true){ peep->var_EF |= 1; if (peep->var_EF & 0x3E && !(peep->var_EF & 0xC0)){ @@ -6599,7 +6599,7 @@ static int sub_693C9E(rct_peep *peep) } if (x < 32 || y < 32 || x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) || y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16)){ - if (peep->type == PEEP_TYPE_STAFF){ + if (peep->var_2A == 1){ RCT2_GLOBAL(0x00F1EE18, uint16) |= (1 << 1); } return peep_return_to_center_of_tile(peep); diff --git a/src/windows/guest.c b/src/windows/guest.c index 9ede943524..bd068b719d 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -688,7 +688,7 @@ void window_guest_viewport_init(rct_window* w){ union{ sprite_focus sprite; coordinate_focus coordinate; - } focus; //The focus will be either a sprite or a coordinate. + } focus = { 0 }; //The focus will be either a sprite or a coordinate. focus.sprite.sprite_id = w->number; diff --git a/src/windows/staff.c b/src/windows/staff.c index 141ddc6b64..fd2d4bc17c 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -1177,7 +1177,7 @@ void window_staff_overview_unknown_14(rct_window *w) void window_staff_viewport_init(rct_window* w){ if (w->page != WINDOW_STAFF_OVERVIEW) return; - sprite_focus focus; + sprite_focus focus = { 0 }; focus.sprite_id = w->number; diff --git a/src/world/footpath.c b/src/world/footpath.c index 2426cac8fc..a212baf0e4 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -518,7 +518,7 @@ void footpath_provisional_update() */ void footpath_get_coordinates_from_pos(int screenX, int screenY, int *x, int *y, int *direction, rct_map_element **mapElement) { - int z, interactionType; + int z = 0, interactionType; rct_map_element *myMapElement; rct_viewport *viewport; rct_xy16 map_pos = { 0 }; From 6adb384a7eef4a7069c0523aaad9c111f8300d3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 24 Jul 2015 23:40:04 +0200 Subject: [PATCH 0358/1173] Refactoring in news_item Now news_items are fetched only with exposed calls, which add a layer of simple checks. I also switched few places to access a read-only version of news_item. --- src/management/news_item.c | 135 ++++++++++++++++++++++-------- src/management/news_item.h | 4 + src/peep/peep.h | 2 +- src/windows/game_bottom_toolbar.c | 16 ++-- src/windows/news.c | 43 +++++----- 5 files changed, 132 insertions(+), 68 deletions(-) diff --git a/src/management/news_item.c b/src/management/news_item.c index 13e33b9d50..787dbbdeca 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -28,11 +28,42 @@ #include "../world/sprite.h" #include "news_item.h" -rct_news_item *newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); - +rct_news_item *gNewsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); void window_game_bottom_toolbar_invalidate_news_item(); static int news_item_get_new_history_slot(); +#define MAX_NEWS 60 + +bool news_item_is_valid_idx(const uint8 idx) +{ + if (idx > MAX_NEWS) + { + log_error("Tried to get news item past MAX_NEWS."); + return false; + } + return true; +} + +rct_news_item *news_item_get(const uint8 idx) +{ + if (news_item_is_valid_idx(idx)) + { + return &gNewsItems[idx]; + } else { + return NULL; + } +} + +bool news_item_is_empty(const uint8 idx) +{ + return news_item_get(idx)->type == NEWS_ITEM_NULL; +} + +bool news_item_is_queue_empty() +{ + return news_item_is_empty(0); +} + /** * * rct2: 0x0066DF32 @@ -40,16 +71,41 @@ static int news_item_get_new_history_slot(); void news_item_init_queue() { int i; - rct_news_item *newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); - newsItems[0].type = NEWS_ITEM_NULL; - newsItems[11].type = NEWS_ITEM_NULL; + news_item_get(0)->type = NEWS_ITEM_NULL; + news_item_get(11)->type = NEWS_ITEM_NULL; + // Throttles for warning types (PEEP_*_WARNING) for (i = 0; i < 16; i++) RCT2_ADDRESS(0x01358750, uint8)[i] = 0; window_game_bottom_toolbar_invalidate_news_item(); } +static void news_item_tick_current() +{ + int ticks; + ticks = news_item_get(0)->ticks++; + if (ticks == 1 && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 1)) { + // Play sound + sound_play_panned(SOUND_NEWS_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2, 0, 0, 0); + } +} + +static bool news_item_is_current_old() +{ + int remove_time = 320; + if (!news_item_is_empty(5) && + !news_item_is_empty(4) && + !news_item_is_empty(3) && + !news_item_is_empty(2)) + remove_time = 256; + + if (news_item_get(0)->ticks >= remove_time) + return true; + + return false; +} + /** * * rct2: 0x0066E252 @@ -57,7 +113,6 @@ void news_item_init_queue() void news_item_update_current() { short ax, bx, remove_time; - rct_news_item *newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); get_system_time(); @@ -91,27 +146,16 @@ void news_item_update_current() RCT2_GLOBAL(0x009DEA6B, sint16) = RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_MONTH, sint16); // Check if there is a current news item - if (newsItems[0].type == 0) + if (news_item_is_queue_empty()) return; window_game_bottom_toolbar_invalidate_news_item(); // Update the current news item - newsItems[0].ticks++; - if (newsItems[0].ticks == 1 && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 1)) { - // Play sound - sound_play_panned(SOUND_NEWS_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2, 0, 0, 0); - } + news_item_tick_current(); // Removal of current news item - remove_time = 320; - if (newsItems[2].type != 0 && - newsItems[3].type != 0 && - newsItems[4].type != 0 && - newsItems[5].type != 0) - remove_time = 256; - - if (newsItems[0].ticks >= remove_time) + if (news_item_is_current_old()) news_item_close_current(); } @@ -125,7 +169,7 @@ void news_item_close_current() rct_news_item *newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); // Check if there is a current message - if (newsItems[0].type == NEWS_ITEM_NULL) + if (news_item_is_queue_empty()) return; // Find an available history news item slot for current message @@ -135,7 +179,7 @@ void news_item_close_current() newsItems[i] = newsItems[0]; // Set the end of the end of the history list - if (i < 60) + if (i < MAX_NEWS) newsItems[i + 1].type = NEWS_ITEM_NULL; // Invalidate the news window @@ -150,6 +194,15 @@ void news_item_close_current() window_game_bottom_toolbar_invalidate_news_item(); } +static void news_item_shift_history_up() +{ + const int history_idx = 11; + rct_news_item *history_start = news_item_get(history_idx); + const size_t count = sizeof(rct_news_item) * (MAX_NEWS - 1 - history_idx); + memmove(history_start, history_start + 1, count); +} + + /** * Finds a spare history slot or replaces an existing one if there are no spare * slots available. @@ -157,17 +210,15 @@ void news_item_close_current() static int news_item_get_new_history_slot() { int i; - rct_news_item *newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); // Find an available history news item slot - for (i = 11; i < 61; i++) - if (newsItems[i].type == NEWS_ITEM_NULL) + for (i = 11; i <= MAX_NEWS; i++) + if (news_item_is_empty(i)) return i; // Dequeue the first history news item, shift history up - for (i = 11; i < 60; i++) - newsItems[i] = newsItems[i + 1]; - return 60; + news_item_shift_history_up(); + return MAX_NEWS; } /** @@ -264,7 +315,7 @@ void news_item_add_to_queue_raw(uint8 type, const char *text, uint32 assoc) // find first open slot while (newsItem->type != NEWS_ITEM_NULL) { - if (newsItem + 1 >= (rct_news_item*)0x13CB1CC) + if (newsItem + 1 >= (rct_news_item*)0x13CB1CC) // &news_list[10] news_item_close_current(); else newsItem++; @@ -358,24 +409,36 @@ void news_item_open_subject(int type, int subject) * rct2: 0x0066E407 */ void news_item_disable_news(uint8 type, uint32 assoc) { - rct_news_item* newsItem = newsItems; - while (newsItem->type != NEWS_ITEM_NULL) { + // TODO: write test invalidating windows + int i; + for (i = 0; i < 11; i++) + { + if (!news_item_is_empty(i)) + { + rct_news_item * const newsItem; if (type == newsItem->type && assoc == newsItem->assoc) { newsItem->flags |= 0x1; - if (newsItem == RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item)) { + if (i == 0) { window_game_bottom_toolbar_invalidate_news_item(); } } - newsItem++; + } else { + break; + } } - newsItem = &newsItems[11]; //0x13CB2D8 - while (newsItem->type != NEWS_ITEM_NULL) { + for (i = 11; i <= MAX_NEWS; i++) + { + if (!news_item_is_empty(i)) + { + rct_news_item * const newsItem = news_item_get(i); if (type == newsItem->type && assoc == newsItem->assoc) { newsItem->flags |= 0x1; window_invalidate_by_class(WC_RECENT_NEWS); } - newsItem++; + } else { + break; + } } } diff --git a/src/management/news_item.h b/src/management/news_item.h index 34d4459147..c998f6ce31 100644 --- a/src/management/news_item.h +++ b/src/management/news_item.h @@ -60,5 +60,9 @@ void news_item_add_to_queue(uint8 type, rct_string_id string_id, uint32 assoc); void news_item_add_to_queue_raw(uint8 type, const char *text, uint32 assoc); void news_item_open_subject(int type, int subject); void news_item_disable_news(uint8 type, uint32 assoc); +rct_news_item *news_item_get(const uint8 idx); +bool news_item_is_empty(const uint8 idx); +bool news_item_is_queue_empty(); +bool news_item_is_valid_idx(const uint8 idx); #endif diff --git a/src/peep/peep.h b/src/peep/peep.h index 5399d760b1..8b0f89cebb 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -557,7 +557,7 @@ enum { #define GET_PEEP(sprite_index) &(g_sprite_list[sprite_index].peep) /** - * Helper macro loop for enumerating through all the non null rides. To avoid needing a end loop counterpart, statements are + * Helper macro loop for enumerating through all the peeps. To avoid needing a end loop counterpart, statements are * applied in tautology if statements. */ #define FOR_ALL_PEEPS(sprite_index, peep) \ diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index 549ec4c3af..60052aff9a 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -182,15 +182,15 @@ static void window_game_bottom_toolbar_mouseup(rct_window *w, int widgetIndex) news_item_close_current(); break; case WIDX_NEWS_SUBJECT: - newsItem = &(RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item)[0]); + newsItem = news_item_get(0); news_item_open_subject(newsItem->type, newsItem->assoc); break; case WIDX_NEWS_LOCATE: - newsItem = &(RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item)[0]); - if (newsItem->type == NEWS_ITEM_NULL) + if (news_item_is_queue_empty()) break; { + newsItem = news_item_get(0); int x, y, z; int subject = newsItem->assoc; @@ -268,12 +268,12 @@ static void window_game_bottom_toolbar_invalidate(rct_window *w) window_game_bottom_toolbar_widgets[WIDX_LEFT_INSET].type = WWT_EMPTY; window_game_bottom_toolbar_widgets[WIDX_RIGHT_INSET].type = WWT_EMPTY; - newsItem = &(RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item)[0]); - if (newsItem->type == 0) { + if (news_item_is_queue_empty()) { window_game_bottom_toolbar_widgets[WIDX_MIDDLE_INSET].type = WWT_EMPTY; window_game_bottom_toolbar_widgets[WIDX_NEWS_SUBJECT].type = WWT_EMPTY; window_game_bottom_toolbar_widgets[WIDX_NEWS_LOCATE].type = WWT_EMPTY; } else { + newsItem = news_item_get(0); window_game_bottom_toolbar_widgets[WIDX_MIDDLE_INSET].type = WWT_25; window_game_bottom_toolbar_widgets[WIDX_NEWS_SUBJECT].type = WWT_FLATBTN; window_game_bottom_toolbar_widgets[WIDX_NEWS_LOCATE].type = WWT_FLATBTN; @@ -320,7 +320,7 @@ static void window_game_bottom_toolbar_invalidate(rct_window *w) void window_game_bottom_toolbar_invalidate_news_item() { window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].type = - RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item)[0].type == NEWS_ITEM_NULL ? WWT_EMPTY : WWT_IMGBTN; + news_item_is_queue_empty() ? WWT_EMPTY : WWT_IMGBTN; widget_invalidate_by_class(WC_BOTTOM_TOOLBAR, WIDX_MIDDLE_OUTSET); } @@ -353,7 +353,7 @@ static void window_game_bottom_toolbar_paint(rct_window *w, rct_drawpixelinfo *d window_game_bottom_toolbar_draw_left_panel(dpi, w); window_game_bottom_toolbar_draw_right_panel(dpi, w); - if (RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item)[0].type != 0) + if (!news_item_is_queue_empty()) window_game_bottom_toolbar_draw_news_item(dpi, w); else if (RCT2_GLOBAL(RCT2_ADDRESS_ON_TUTORIAL, uint8)) window_game_bottom_toolbar_draw_tutorial_text(dpi, w); @@ -509,7 +509,7 @@ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rc rct_widget *middleOutsetWidget; middleOutsetWidget = &window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET]; - newsItem = &(RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item)[0]); + newsItem = news_item_get(0); // Current news item gfx_fill_rect_inset( diff --git a/src/windows/news.c b/src/windows/news.c index 71e4d5a420..3c54c736c4 100644 --- a/src/windows/news.c +++ b/src/windows/news.c @@ -140,7 +140,6 @@ static void window_news_mouseup(rct_window *w, int widgetIndex) static void window_news_update(rct_window *w) { int i, j, x, y, z; - rct_news_item *newsItems; if (w->news.var_480 == -1) return; @@ -150,22 +149,22 @@ static void window_news_update(rct_window *w) window_invalidate(w); sound_play_panned(SOUND_CLICK_2, w->x + (w->width / 2), 0, 0, 0); - newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); j = w->news.var_480; w->news.var_480 = -1; for (i = 11; i < 61; i++) { - if (newsItems[i].type == NEWS_ITEM_NULL) + if (news_item_is_empty(i)) return; if (j == 0) { - if (newsItems[i].flags & 1) + rct_news_item * const newsItem = news_item_get(i); + if (newsItem->flags & 1) return; if (w->news.var_482 == 1) { - news_item_open_subject(newsItems[i].type, newsItems[i].assoc); + news_item_open_subject(newsItem->type, newsItem->assoc); return; } else if (w->news.var_482 > 1) { - news_item_get_subject_location(newsItems[i].type, newsItems[i].assoc, &x, &y, &z); + news_item_get_subject_location(newsItem->type, newsItem->assoc, &x, &y, &z); if (x != SPRITE_LOCATION_NULL) if ((w = window_get_main()) != NULL) window_scroll_to_location(w, x, y, z); @@ -183,11 +182,10 @@ static void window_news_update(rct_window *w) static void window_news_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) { int i; - rct_news_item *newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); *height = 0; for (i = 11; i < 61; i++) { - if (newsItems[i].type == NEWS_ITEM_NULL) + if (news_item_is_empty(i)) break; *height += 42; @@ -201,16 +199,15 @@ static void window_news_scrollgetsize(rct_window *w, int scrollIndex, int *width static void window_news_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) { int i, buttonIndex; - rct_news_item *newsItems; buttonIndex = 0; - newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); for (i = 11; i < 61; i++) { - if (newsItems[i].type == NEWS_ITEM_NULL) + if (news_item_is_empty(i)) break; if (y < 42) { - if (newsItems[i].flags & 1) { + rct_news_item * const newsItem = news_item_get(i); + if (newsItem->flags & 1) { buttonIndex = 0; break; } else if (y < 14) { @@ -223,12 +220,12 @@ static void window_news_scrollmousedown(rct_window *w, int scrollIndex, int x, i buttonIndex = 0; break; } else if (x < 351) { - if (RCT2_ADDRESS(0x0097BE7C, uint8)[newsItems[i].type] & 2) { + if (RCT2_ADDRESS(0x0097BE7C, uint8)[newsItem->type] & 2) { buttonIndex = 1; break; } } else if (x < 376) { - if (RCT2_ADDRESS(0x0097BE7C, uint8)[newsItems[i].type] & 1) { + if (RCT2_ADDRESS(0x0097BE7C, uint8)[newsItem->type] & 1) { buttonIndex = 2; break; } @@ -276,13 +273,11 @@ static void window_news_invalidate(rct_window *w) static void window_news_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { int i, x, y, yy, press; - rct_news_item *newsItems, *newsItem, *newsItem2; y = 0; - newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); for (i = 11; i < 61; i++) { - newsItem = &newsItems[i]; - if (newsItem->type == NEWS_ITEM_NULL) + rct_news_item * const newsItem = news_item_get(i); + if (news_item_is_empty(i)) break; if (y >= dpi->y + dpi->height) break; @@ -313,8 +308,9 @@ static void window_news_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int s press = 0; if (w->news.var_480 != -1) { - newsItem2 = &newsItems[11 + w->news.var_480]; - if (newsItem == newsItem2 && w->news.var_482 == 1) + const uint8 idx = 11 + w->news.var_480; + news_item_is_valid_idx(idx); + if (i == idx && w->news.var_482 == 1) press = 0x20; } gfx_fill_rect_inset(dpi, x, yy, x + 23, yy + 23, w->colours[2], press); @@ -376,8 +372,9 @@ static void window_news_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int s press = 0; if (w->news.var_480 != -1) { - newsItem2 = &newsItems[11 + w->news.var_480]; - if (newsItem == newsItem2 && w->news.var_482 == 2) + const uint8 idx = 11 + w->news.var_480; + news_item_is_valid_idx(idx); + if (i == idx && w->news.var_482 == 2) press = 0x20; } gfx_fill_rect_inset(dpi, x, yy, x + 23, yy + 23, w->colours[2], press); @@ -386,4 +383,4 @@ static void window_news_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int s y += 42; } -} \ No newline at end of file +} From 812010001d30b53d54a0247a4193cbb8bfcc05f1 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 25 Jul 2015 11:16:59 +0100 Subject: [PATCH 0359/1173] Implement guest surface path finding --- src/peep/peep.c | 95 ++++++++++++++++++++++++++++++++++++++++++++ src/world/footpath.c | 9 +++-- src/world/footpath.h | 1 + src/world/map.c | 39 ++++++++++++++++++ src/world/map.h | 1 + 5 files changed, 141 insertions(+), 4 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 001e328035..f7347f55c2 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -67,6 +67,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep); static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType); static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFlags); static void peep_give_real_name(rct_peep *peep); +static int guest_surface_path_finding(rct_peep* peep); const char *gPeepEasterEggNames[] = { "MICHAEL SCHUMACHER", @@ -6555,6 +6556,100 @@ static int peep_interact_with_shop(rct_peep* peep, sint16 x, sint16 y, rct_map_e } } +/* rct2: 0x0069524E */ +static int peep_move_one_tile(uint8 direction, rct_peep* peep){ + sint16 x = peep->next_x; + sint16 y = peep->next_y; + x += RCT2_ADDRESS(0x00993CC, sint16)[direction * 2]; + y += RCT2_ADDRESS(0x00993CE, sint16)[direction * 2]; + + if (x >= 8192 || y >= 8192){ + // This could loop! + return guest_surface_path_finding(peep); + } + + peep->var_78 = direction; + peep->destination_x = x + 16; + peep->destination_y = y + 16; + peep->destination_tolerence = 2; + if (peep->state == PEEP_STATE_QUEUING){ + peep->destination_tolerence = (scenario_rand() & 7) + 2; + } + return 0; +} + +/* rct2: 0x00694C41 */ +static int guest_surface_path_finding(rct_peep* peep){ + sint16 x = peep->next_x; + sint16 y = peep->next_y; + sint16 z = peep->next_z; + uint8 randDirection = scenario_rand() & 3; + + if (!fence_in_the_way(x, y, z, z + 4, randDirection)){ + x += RCT2_ADDRESS(0x00993CC, sint16)[randDirection * 2]; + y += RCT2_ADDRESS(0x00993CE, sint16)[randDirection * 2]; + randDirection ^= (1 << 1); + + if (!fence_in_the_way(x, y, z, z + 4, randDirection)){ + randDirection ^= (1 << 1); + if (!map_surface_is_blocked(x, y)){ + return peep_move_one_tile(randDirection, peep); + } + } + } + + randDirection++; + uint8 rand_backwards = scenario_rand() & 1; + if (rand_backwards){ + randDirection -= 2; + } + randDirection &= 3; + + if (!fence_in_the_way(x, y, z, z + 4, randDirection)){ + x += RCT2_ADDRESS(0x00993CC, sint16)[randDirection * 2]; + y += RCT2_ADDRESS(0x00993CE, sint16)[randDirection * 2]; + randDirection ^= (1 << 1); + + if (!fence_in_the_way(x, y, z, z + 4, randDirection)){ + randDirection ^= (1 << 1); + if (!map_surface_is_blocked(x, y)){ + return peep_move_one_tile(randDirection, peep); + } + } + } + + randDirection -= 2; + randDirection &= 3; + + if (!fence_in_the_way(x, y, z, z + 4, randDirection)){ + x += RCT2_ADDRESS(0x00993CC, sint16)[randDirection * 2]; + y += RCT2_ADDRESS(0x00993CE, sint16)[randDirection * 2]; + randDirection ^= (1 << 1); + + if (!fence_in_the_way(x, y, z, z + 4, randDirection)){ + randDirection ^= (1 << 1); + if (!map_surface_is_blocked(x, y)){ + return peep_move_one_tile(randDirection, peep); + } + } + } + + randDirection--; + if (rand_backwards){ + randDirection += 2; + } + return peep_move_one_tile(randDirection, peep); +} + +/* rct2: 0x00694C35 */ +static int guest_path_finding(rct_peep* peep){ + sint16 x, y, z; + if (peep->next_var_29 & 0x18){ + return guest_surface_path_finding(peep); + } + //694DA8 +} + /** * * rct2: 0x00693C9E diff --git a/src/world/footpath.c b/src/world/footpath.c index a212baf0e4..997c80b1e9 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -698,7 +698,8 @@ void footpath_interrupt_peeps(int x, int y, int z) } } -bool sub_6E59DC(int x, int y, int z0, int z1, int direction) +/* rct2: 0x006E59DC */ +bool fence_in_the_way(int x, int y, int z0, int z1, int direction) { rct_map_element *mapElement; @@ -899,7 +900,7 @@ static rct_map_element *footpath_get_element(int x, int y, int z0, int z1, int d static bool sub_footpath_disconnect_queue_from_path(int x, int y, rct_map_element *mapElement, int action, int direction) { if (((mapElement->properties.path.edges & (1 << direction)) == 0) ^ (action < 0)) return false; - if ((action < 0) && sub_6E59DC(x, y, mapElement->base_height, mapElement->clearance_height, direction)) + if ((action < 0) && fence_in_the_way(x, y, mapElement->base_height, mapElement->clearance_height, direction)) return false; int x1 = x + TileDirectionDelta[direction].x; @@ -1018,7 +1019,7 @@ static void loc_6A6D7E( loc_6A6F1F: if (query) { - if (sub_6E59DC(x, y, mapElement->base_height, mapElement->clearance_height, direction ^ 2)) { + if (fence_in_the_way(x, y, mapElement->base_height, mapElement->clearance_height, direction ^ 2)) { return; } if (footpath_element_is_queue(mapElement)) { @@ -1061,7 +1062,7 @@ static void loc_6A6C85( int x, int y, int direction, rct_map_element *mapElement, int flags, bool query, rct_neighbour_list *neighbourList ) { - if (query && sub_6E59DC(x, y, mapElement->base_height, mapElement->clearance_height, direction)) + if (query && fence_in_the_way(x, y, mapElement->base_height, mapElement->clearance_height, direction)) return; if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_ENTRANCE) { diff --git a/src/world/footpath.h b/src/world/footpath.h index 4cf703b54d..fbd00b2d0c 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -61,6 +61,7 @@ void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, void footpath_remove_litter(int x, int y, int z); void footpath_connect_edges(int x, int y, rct_map_element *mapElement, int flags); void sub_6A759F(); +bool fence_in_the_way(int x, int y, int z0, int z1, int direction); void footpath_chain_ride_queue(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction); void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, int *direction, rct_map_element **mapElement); diff --git a/src/world/map.c b/src/world/map.c index a3434ca198..9f719e4177 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3612,3 +3612,42 @@ int map_get_tile_quadrant(int mapX, int mapY) (subMapY < 16 ? 2 : 3); } +/* rct2: 0x00693BFF */ +bool map_surface_is_blocked(sint16 x, sint16 y){ + rct_map_element *mapElement; + if (x >= 8192 || y >= 8192) + return true; + + mapElement = map_get_surface_element_at(x / 32, y / 32); + + sint16 water_height = mapElement->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK; + water_height *= 2; + if (water_height > mapElement->base_height) + return true; + + sint16 base_z = mapElement->base_height; + sint16 clear_z = mapElement->base_height + 2; + if (mapElement->properties.surface.slope & (1 << 4)) + clear_z += 2; + + while (!map_element_is_last_for_tile(mapElement++)){ + if (clear_z >= mapElement->clearance_height) + continue; + + if (base_z < mapElement->base_height) + continue; + + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH || + map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_FENCE) + continue; + + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SCENERY) + return true; + + rct_scenery_entry* scenery = g_smallSceneryEntries[mapElement->properties.scenery.type]; + if (scenery->small_scenery.flags & SMALL_SCENERY_FLAG_FULL_TILE) + return true; + } + return false; +} + diff --git a/src/world/map.h b/src/world/map.h index b037e40e88..edbd136d2a 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -283,6 +283,7 @@ int map_coord_is_connected(int x, int y, int z, uint8 faceDirection); void sub_6A876D(); int map_is_location_owned(int x, int y, int z); int map_is_location_in_park(int x, int y); +bool map_surface_is_blocked(sint16 x, sint16 y); int map_get_station(rct_map_element *mapElement); void map_element_remove(rct_map_element *mapElement); void map_remove_all_rides(); From c4a8d27648f4fc86cb059a9c662c5af056fec917 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sat, 25 Jul 2015 08:50:59 -0600 Subject: [PATCH 0360/1173] fix couple of bugs --- src/management/news_item.c | 4 ++-- src/world/map.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/management/news_item.c b/src/management/news_item.c index 787dbbdeca..bf3fc32a18 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -112,7 +112,7 @@ static bool news_item_is_current_old() */ void news_item_update_current() { - short ax, bx, remove_time; + short ax, bx; get_system_time(); @@ -415,7 +415,7 @@ void news_item_disable_news(uint8 type, uint32 assoc) { { if (!news_item_is_empty(i)) { - rct_news_item * const newsItem; + rct_news_item * const newsItem = news_item_get(i); if (type == newsItem->type && assoc == newsItem->assoc) { newsItem->flags |= 0x1; if (i == 0) { diff --git a/src/world/map.c b/src/world/map.c index b74cc7398a..97c14edb39 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2999,9 +2999,9 @@ int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *cle continue; } int water_height = ((map_element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) * 2); - if (water_height && water_height >= zLow && map_element->base_height < zHigh) { + if (water_height && water_height > zLow && map_element->base_height < zHigh) { RCT2_GLOBAL(0x00F1AD60, uint8) |= 4; - if (water_height > zHigh) { + if (water_height < zHigh) { goto loc_68BAE6; } } @@ -3025,7 +3025,7 @@ int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *cle int ah = al; int cl = al; int ch = al; - uint8 slope = map_element->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; //F + uint8 slope = map_element->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; if (slope & 1) { al += 2; if (slope == 0x1B) From e3c275644b9bfd9c9c1e9cf9fcfedc4b7331b859 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sat, 25 Jul 2015 18:07:38 +0200 Subject: [PATCH 0361/1173] Update and mark obsolete strings --- data/language/english_uk.txt | 37 +++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index c2f7958242..6d265cadba 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -839,16 +839,17 @@ STR_0834 :{SMALLFONT}{BLACK}Disk and game options STR_0835 :Game initialization failed STR_0836 :Unable to start game in a minimised state STR_0837 :Unable to initialise graphics system -STR_0838 :CD key code {INT32} is not valid for your RollerCoaster Tycoon 2 CD !{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Please un-install RollerCoaster Tycoon 2% and re-install with the correct CD Key Code +STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -STR_0841 :Desktop window -STR_0842 :640x480 full screen -STR_0843 :800x600 full screen -STR_0844 :1024x768 full screen -STR_0845 :1152x864 full screen -STR_0846 :1280x1024 full screen -STR_0847 :About 'RollerCoaster Tycoon 2' +# The follwing six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :About 'OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028 STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, all rights reserved @@ -1044,10 +1045,10 @@ STR_1039 :Install new track design STR_1040 :Save Game STR_1041 :Save Scenario STR_1042 :Save Landscape -STR_1043 :RollerCoaster Tycoon 2 Saved Game -STR_1044 :RollerCoaster Tycoon 2 Scenario File -STR_1045 :RollerCoaster Tycoon 2 Landscape File -STR_1046 :RollerCoaster Tycoon 2 Track Design File +STR_1043 :OpenRCT2 Saved Game +STR_1044 :OpenRCT2 2 Scenario File +STR_1045 :OpenRCT2 Landscape File +STR_1046 :OpenRCT2 Track Design File STR_1047 :Game save failed! STR_1048 :Scenario save failed! STR_1049 :Landscape save failed! @@ -1893,8 +1894,10 @@ STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hou STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride STR_1891 :No {STRINGID} in park yet! -STR_1892 :RollerCoaster Tycoon 2 -STR_1893 :Please insert your RollerCoaster Tycoon 2 CD in the following drive: +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}Build new ride/attraction STR_1896 :{WINDOW_COLOUR_2}Expenditure/Income @@ -2863,7 +2866,7 @@ STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Constru STR_2856 :{WINDOW_COLOUR_2}Tutorial STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) STR_2858 :Can't start marketing campaign... -STR_2859 :Another instance of RollerCoaster Tycoon 2 is already running +STR_2859 :Another instance of OpenRCT2 is already running STR_2860 :Infogrames Interactive credits... STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. STR_2862 :Music acknowledgements... @@ -3164,8 +3167,8 @@ STR_3156 : STR_3157 :map STR_3158 :graph STR_3159 :list -STR_3160 :RollerCoaster Tycoon 2: Starting for the first time... -STR_3161 :RollerCoaster Tycoon 2: Checking object files... +STR_3160 : +STR_3161 : STR_3162 :Unable to allocate enough memory STR_3163 :Installing new data: STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) From 290fbfb6e4394a891c909b6d4b8915e54c18c20b Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sat, 25 Jul 2015 18:09:30 +0200 Subject: [PATCH 0362/1173] Fix typo --- data/language/english_uk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 6d265cadba..c8e16f4f4a 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -1046,7 +1046,7 @@ STR_1040 :Save Game STR_1041 :Save Scenario STR_1042 :Save Landscape STR_1043 :OpenRCT2 Saved Game -STR_1044 :OpenRCT2 2 Scenario File +STR_1044 :OpenRCT2 Scenario File STR_1045 :OpenRCT2 Landscape File STR_1046 :OpenRCT2 Track Design File STR_1047 :Game save failed! From 5028e83b5283592bbb45a6ceccbd7071ffd12431 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sat, 25 Jul 2015 18:18:27 +0200 Subject: [PATCH 0363/1173] Align comments with tab spacing of 4 --- src/ride/track_data.c | 178 +++++++++++++++++++++--------------------- 1 file changed, 89 insertions(+), 89 deletions(-) diff --git a/src/ride/track_data.c b/src/ride/track_data.c index 5165c3a462..2a44f51788 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -24,40 +24,40 @@ const rct_track_coordinates* FlatTrackCoordinates = RCT2_ADDRESS(0x009972BB, const rct_track_coordinates); const rct_track_coordinates TrackCoordinates[256] = { - { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT - { 0, 0, 0, 0, 0, 0 }, // ELEM_END_STATION - { 0, 0, 0, 0, 0, 0 }, // ELEM_BEGIN_STATION - { 0, 0, 0, 0, 0, 0 }, // ELEM_MIDDLE_STATION - { 0, 0, 0, 16, 0, 0 }, // ELEM_25_DEG_UP - { 0, 0, 0, 64, 0, 0 }, // ELEM_60_DEG_UP - { 0, 0, 0, 8, 0, 0 }, // ELEM_FLAT_TO_25_DEG_UP - { 0, 0, 0, 32, 0, 0 }, // ELEM_25_DEG_UP_TO_60_DEG_UP - { 0, 0, 0, 32, 0, 0 }, // ELEM_60_DEG_UP_TO_25_DEG_UP - { 0, 0, 0, 8, 0, 0 }, // ELEM_25_DEG_UP_TO_FLAT - { 0, 0, 16, 0, 0, 0 }, // ELEM_25_DEG_DOWN - { 0, 0, 64, 0, 0, 0 }, // ELEM_60_DEG_DOWN - { 0, 0, 8, 0, 0, 0 }, // ELEM_FLAT_TO_25_DEG_DOWN - { 0, 0, 32, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN - { 0, 0, 32, 0, 0, 0 }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN - { 0, 0, 8, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_FLAT + { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT + { 0, 0, 0, 0, 0, 0 }, // ELEM_END_STATION + { 0, 0, 0, 0, 0, 0 }, // ELEM_BEGIN_STATION + { 0, 0, 0, 0, 0, 0 }, // ELEM_MIDDLE_STATION + { 0, 0, 0, 16, 0, 0 }, // ELEM_25_DEG_UP + { 0, 0, 0, 64, 0, 0 }, // ELEM_60_DEG_UP + { 0, 0, 0, 8, 0, 0 }, // ELEM_FLAT_TO_25_DEG_UP + { 0, 0, 0, 32, 0, 0 }, // ELEM_25_DEG_UP_TO_60_DEG_UP + { 0, 0, 0, 32, 0, 0 }, // ELEM_60_DEG_UP_TO_25_DEG_UP + { 0, 0, 0, 8, 0, 0 }, // ELEM_25_DEG_UP_TO_FLAT + { 0, 0, 16, 0, 0, 0 }, // ELEM_25_DEG_DOWN + { 0, 0, 64, 0, 0, 0 }, // ELEM_60_DEG_DOWN + { 0, 0, 8, 0, 0, 0 }, // ELEM_FLAT_TO_25_DEG_DOWN + { 0, 0, 32, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN + { 0, 0, 32, 0, 0, 0 }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN + { 0, 0, 8, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_FLAT { 0, 3, 0, 0, -64, -64 }, // ELEM_LEFT_QUARTER_TURN_5_TILES { 0, 1, 0, 0, -64, 64 }, // ELEM_RIGHT_QUARTER_TURN_5_TILES - { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT_TO_LEFT_BANK - { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT_TO_RIGHT_BANK - { 0, 0, 0, 0, 0, 0 }, // ELEM_LEFT_BANK_TO_FLAT - { 0, 0, 0, 0, 0, 0 }, // ELEM_RIGHT_BANK_TO_FLAT + { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT_TO_LEFT_BANK + { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT_TO_RIGHT_BANK + { 0, 0, 0, 0, 0, 0 }, // ELEM_LEFT_BANK_TO_FLAT + { 0, 0, 0, 0, 0, 0 }, // ELEM_RIGHT_BANK_TO_FLAT { 0, 3, 0, 0, -64, -64 }, // ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES { 0, 1, 0, 0, -64, 64 }, // ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES - { 0, 0, 0, 8, 0, 0 }, // ELEM_LEFT_BANK_TO_25_DEG_UP - { 0, 0, 0, 8, 0, 0 }, // ELEM_RIGHT_BANK_TO_25_DEG_UP - { 0, 0, 0, 8, 0, 0 }, // ELEM_25_DEG_UP_TO_LEFT_BANK - { 0, 0, 0, 8, 0, 0 }, // ELEM_25_DEG_UP_TO_RIGHT_BANK - { 0, 0, 8, 0, 0, 0 }, // ELEM_LEFT_BANK_TO_25_DEG_DOWN - { 0, 0, 8, 0, 0, 0 }, // ELEM_RIGHT_BANK_TO_25_DEG_DOWN - { 0, 0, 8, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_LEFT_BANK - { 0, 0, 8, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_RIGHT_BANK - { 0, 0, 0, 0, 0, 0 }, // ELEM_LEFT_BANK - { 0, 0, 0, 0, 0, 0 }, // ELEM_RIGHT_BANK + { 0, 0, 0, 8, 0, 0 }, // ELEM_LEFT_BANK_TO_25_DEG_UP + { 0, 0, 0, 8, 0, 0 }, // ELEM_RIGHT_BANK_TO_25_DEG_UP + { 0, 0, 0, 8, 0, 0 }, // ELEM_25_DEG_UP_TO_LEFT_BANK + { 0, 0, 0, 8, 0, 0 }, // ELEM_25_DEG_UP_TO_RIGHT_BANK + { 0, 0, 8, 0, 0, 0 }, // ELEM_LEFT_BANK_TO_25_DEG_DOWN + { 0, 0, 8, 0, 0, 0 }, // ELEM_RIGHT_BANK_TO_25_DEG_DOWN + { 0, 0, 8, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_LEFT_BANK + { 0, 0, 8, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_RIGHT_BANK + { 0, 0, 0, 0, 0, 0 }, // ELEM_LEFT_BANK + { 0, 0, 0, 0, 0, 0 }, // ELEM_RIGHT_BANK { 0, 3, 0, 64, -64, -64 }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP { 0, 1, 0, 64, -64, 64 }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP { 0, 3, 64, 0, -64, -64 }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN @@ -74,8 +74,8 @@ const rct_track_coordinates TrackCoordinates[256] = { { 0, 1, 0, 32, -32, 32 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP { 0, 3, 32, 0, -32, -32 }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN { 0, 1, 32, 0, -32, 32 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN - { 0, 3, 0, 0, 0, 0 }, // ELEM_LEFT_QUARTER_TURN_1_TILE - { 0, 1, 0, 0, 0, 0 }, // ELEM_RIGHT_QUARTER_TURN_1_TILE + { 0, 3, 0, 0, 0, 0 }, // ELEM_LEFT_QUARTER_TURN_1_TILE + { 0, 1, 0, 0, 0, 0 }, // ELEM_RIGHT_QUARTER_TURN_1_TILE { 0, 0, 0, 16, -64, 0 }, // ELEM_LEFT_TWIST_DOWN_TO_UP { 0, 0, 0, 16, -64, 0 }, // ELEM_RIGHT_TWIST_DOWN_TO_UP { 0, 0, 0, -16, -64, 0 }, // ELEM_LEFT_TWIST_UP_TO_DOWN @@ -86,25 +86,25 @@ const rct_track_coordinates TrackCoordinates[256] = { { 0, 1, 0, 80, -32, 32 }, // ELEM_RIGHT_CORKSCREW_UP { 0, 3, 0, -80, -32, -32 }, // ELEM_LEFT_CORKSCREW_DOWN { 0, 1, 0, -80, -32, 32 }, // ELEM_RIGHT_CORKSCREW_DOWN - { 0, 0, 0, 24, 0, 0 }, // ELEM_FLAT_TO_60_DEG_UP - { 0, 0, 0, 24, 0, 0 }, // ELEM_60_DEG_UP_TO_FLAT - { 0, 0, 24, 0, 0, 0 }, // ELEM_FLAT_TO_60_DEG_DOWN - { 0, 0, 24, 0, 0, 0 }, // ELEM_60_DEG_DOWN_TO_FLAT - { 0, 0, 0, 96, 32, 0 }, // ELEM_TOWER_BASE - { 0, 0, 0, 32, 32, 0 }, // ELEM_TOWER_SECTION - { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT_COVERED - { 0, 0, 0, 16, 0, 0 }, // ELEM_25_DEG_UP_COVERED - { 0, 0, 0, 64, 0, 0 }, // ELEM_60_DEG_UP_COVERED - { 0, 0, 0, 8, 0, 0 }, // ELEM_FLAT_TO_25_DEG_UP_COVERED - { 0, 0, 0, 32, 0, 0 }, // ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED - { 0, 0, 0, 32, 0, 0 }, // ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED - { 0, 0, 0, 8, 0, 0 }, // ELEM_25_DEG_UP_TO_FLAT_COVERED - { 0, 0, 16, 0, 0, 0 }, // ELEM_25_DEG_DOWN_COVERED - { 0, 0, 64, 0, 0, 0 }, // ELEM_60_DEG_DOWN_COVERED - { 0, 0, 8, 0, 0, 0 }, // ELEM_FLAT_TO_25_DEG_DOWN_COVERED - { 0, 0, 32, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED - { 0, 0, 32, 0, 0, 0 }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED - { 0, 0, 8, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_FLAT_COVERED + { 0, 0, 0, 24, 0, 0 }, // ELEM_FLAT_TO_60_DEG_UP + { 0, 0, 0, 24, 0, 0 }, // ELEM_60_DEG_UP_TO_FLAT + { 0, 0, 24, 0, 0, 0 }, // ELEM_FLAT_TO_60_DEG_DOWN + { 0, 0, 24, 0, 0, 0 }, // ELEM_60_DEG_DOWN_TO_FLAT + { 0, 0, 0, 96, 32, 0 }, // ELEM_TOWER_BASE + { 0, 0, 0, 32, 32, 0 }, // ELEM_TOWER_SECTION + { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT_COVERED + { 0, 0, 0, 16, 0, 0 }, // ELEM_25_DEG_UP_COVERED + { 0, 0, 0, 64, 0, 0 }, // ELEM_60_DEG_UP_COVERED + { 0, 0, 0, 8, 0, 0 }, // ELEM_FLAT_TO_25_DEG_UP_COVERED + { 0, 0, 0, 32, 0, 0 }, // ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED + { 0, 0, 0, 32, 0, 0 }, // ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED + { 0, 0, 0, 8, 0, 0 }, // ELEM_25_DEG_UP_TO_FLAT_COVERED + { 0, 0, 16, 0, 0, 0 }, // ELEM_25_DEG_DOWN_COVERED + { 0, 0, 64, 0, 0, 0 }, // ELEM_60_DEG_DOWN_COVERED + { 0, 0, 8, 0, 0, 0 }, // ELEM_FLAT_TO_25_DEG_DOWN_COVERED + { 0, 0, 32, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED + { 0, 0, 32, 0, 0, 0 }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED + { 0, 0, 8, 0, 0, 0 }, // ELEM_25_DEG_DOWN_TO_FLAT_COVERED { 0, 3, 0, 0, -64, -64 }, // ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED { 0, 1, 0, 0, -64, 64 }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED { 0, 0, 0, 0, -64, -32 }, // ELEM_S_BEND_LEFT_COVERED @@ -112,20 +112,20 @@ const rct_track_coordinates TrackCoordinates[256] = { { 0, 3, 0, 0, -32, -32 }, // ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED { 0, 1, 0, 0, -32, 32 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED { 0, 2, 0, 16, 0, -96 }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL - { 0, 2, 0, 16, 0, 96 }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL + { 0, 2, 0, 16, 0, 96 }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL { 0, 2, 16, 0, 0, -96 }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL - { 0, 2, 16, 0, 0, 96 }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL + { 0, 2, 16, 0, 0, 96 }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL { 0, 2, 0, 16, 0, -160 }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE { 0, 2, 0, 16, 0, 160 }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE { 0, 2, 16, 0, 0, -160 }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE { 0, 2, 16, 0, 0, 160 }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE - { 0, 3, 0, 64, 0, 0 }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP - { 0, 1, 0, 64, 0, 0 }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP - { 0, 3, 64, 0, 0, 0 }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN - { 0, 1, 64, 0, 0, 0 }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN - { 0, 0, 0, 0, 0, 0 }, // ELEM_BRAKES - { 0, 0, 0, 0, 0, 0 }, // ELEM_ROTATION_CONTROL_TOGGLE - { 0, 0, 0, 0, 0, 0 }, // ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP + { 0, 3, 0, 64, 0, 0 }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP + { 0, 1, 0, 64, 0, 0 }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP + { 0, 3, 64, 0, 0, 0 }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN + { 0, 1, 64, 0, 0, 0 }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN + { 0, 0, 0, 0, 0, 0 }, // ELEM_BRAKES + { 0, 0, 0, 0, 0, 0 }, // ELEM_ROTATION_CONTROL_TOGGLE + { 0, 0, 0, 0, 0, 0 }, // ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP { 0, 3, 0, 16, -64, -64 }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP { 0, 1, 0, 16, -64, 64 }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_UP { 0, 3, 16, 0, -64, -64 }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_DOWN @@ -134,29 +134,29 @@ const rct_track_coordinates TrackCoordinates[256] = { { 0, 1, 0, 16, -64, 64 }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_UP { 0, 3, 16, 0, -64, -64 }, // ELEM_LEFT_QUARTER_HELIX_LARGE_DOWN { 0, 1, 16, 0, -64, 64 }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_DOWN - { 0, 0, 0, 16, 0, 0 }, // ELEM_25_DEG_UP_LEFT_BANKED - { 0, 0, 0, 16, 0, 0 }, // ELEM_25_DEG_UP_RIGHT_BANKED - { 0, 0, 0, 0, 0, 0 }, // ELEM_WATERFALL - { 0, 0, 0, 0, 0, 0 }, // ELEM_RAPIDS - { 0, 0, 0, 0, 0, 0 }, // ELEM_ON_RIDE_PHOTO - { 0, 0, 16, 0, 0, 0 }, // ELEM_25_DEG_DOWN_LEFT_BANKED - { 0, 0, 16, 0, 0, 0 }, // ELEM_25_DEG_DOWN_RIGHT_BANKED + { 0, 0, 0, 16, 0, 0 }, // ELEM_25_DEG_UP_LEFT_BANKED + { 0, 0, 0, 16, 0, 0 }, // ELEM_25_DEG_UP_RIGHT_BANKED + { 0, 0, 0, 0, 0, 0 }, // ELEM_WATERFALL + { 0, 0, 0, 0, 0, 0 }, // ELEM_RAPIDS + { 0, 0, 0, 0, 0, 0 }, // ELEM_ON_RIDE_PHOTO + { 0, 0, 16, 0, 0, 0 }, // ELEM_25_DEG_DOWN_LEFT_BANKED + { 0, 0, 16, 0, 0, 0 }, // ELEM_25_DEG_DOWN_RIGHT_BANKED { 0, 0, 16, 16, -128, 0 }, // ELEM_WATER_SPLASH { 0, 0, 0, 88, -96, 0 }, // ELEM_FLAT_TO_60_DEG_UP_LONG_BASE { 0, 0, 0, 88, -96, 0 }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE - { 0, 0, 0, 0, 0, 0 }, // ELEM_WHIRLPOOL + { 0, 0, 0, 0, 0, 0 }, // ELEM_WHIRLPOOL { 0, 0, 88, 0, -96, 0 }, // ELEM_60_DEG_DOWN_TO_FLAT_LONG_BASE { 0, 0, 88, 0, -96, 0 }, // ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE { 0, 0, 0, -96, -96, 0 }, // ELEM_CABLE_LIFT_HILL { 0, 0, 0, 240, -160, 0 }, // ELEM_REVERSE_WHOA_BELLY_SLOPE - { 0, 0, 0, 80, 32, 0 }, // ELEM_REVERSE_WHOA_BELLY_VERTICAL - { 0, 0, 0, 32, 32, 0 }, // ELEM_90_DEG_UP - { 0, 0, 32, 0, 32, 0 }, // ELEM_90_DEG_DOWN - { 0, 0, 0, 56, 32, 0 }, // ELEM_60_DEG_UP_TO_90_DEG_UP - { 0, 0, 56, 0, 0, 0 }, // ELEM_90_DEG_DOWN_TO_60_DEG_DOWN - { 0, 0, 0, 56, 0, 0 }, // ELEM_90_DEG_UP_TO_60_DEG_UP - { 0, 0, 56, 0, 32, 0 }, // ELEM_60_DEG_DOWN_TO_90_DEG_DOWN - { 0, 0, 24, 0, 0, 0 }, // ELEM_BRAKE_FOR_DROP + { 0, 0, 0, 80, 32, 0 }, // ELEM_REVERSE_WHOA_BELLY_VERTICAL + { 0, 0, 0, 32, 32, 0 }, // ELEM_90_DEG_UP + { 0, 0, 32, 0, 32, 0 }, // ELEM_90_DEG_DOWN + { 0, 0, 0, 56, 32, 0 }, // ELEM_60_DEG_UP_TO_90_DEG_UP + { 0, 0, 56, 0, 0, 0 }, // ELEM_90_DEG_DOWN_TO_60_DEG_DOWN + { 0, 0, 0, 56, 0, 0 }, // ELEM_90_DEG_UP_TO_60_DEG_UP + { 0, 0, 56, 0, 32, 0 }, // ELEM_60_DEG_DOWN_TO_90_DEG_DOWN + { 0, 0, 24, 0, 0, 0 }, // ELEM_BRAKE_FOR_DROP { 0, 7, 0, 0, -64, -32 }, // ELEM_LEFT_EIGHTH_TO_DIAG { 0, 4, 0, 0, -64, 32 }, // ELEM_RIGHT_EIGHTH_TO_DIAG { 4, 0, 0, 0, -64, 32 }, // ELEM_LEFT_EIGHTH_TO_ORTHOGONAL @@ -196,8 +196,8 @@ const rct_track_coordinates TrackCoordinates[256] = { { 4, 4, 8, 0, -32, 32 }, // ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK { 4, 4, 0, 0, -32, 32 }, // ELEM_DIAG_LEFT_BANK { 4, 4, 0, 0, -32, 32 }, // ELEM_DIAG_RIGHT_BANK - { 0, 0, 0, 0, 0, 0 }, // ELEM_LOG_FLUME_REVERSER - { 0, 0, 0, 0, 0, 0 }, // ELEM_SPINNING_TUNNEL + { 0, 0, 0, 0, 0, 0 }, // ELEM_LOG_FLUME_REVERSER + { 0, 0, 0, 0, 0, 0 }, // ELEM_SPINNING_TUNNEL { 0, 0, 0, 32, -64, 0 }, // ELEM_LEFT_BARREL_ROLL_UP_TO_DOWN { 0, 0, 0, 32, -64, 0 }, // ELEM_RIGHT_BARREL_ROLL_UP_TO_DOWN { 0, 0, 0, -32, -64, 0 }, // ELEM_LEFT_BARREL_ROLL_DOWN_TO_UP @@ -206,7 +206,7 @@ const rct_track_coordinates TrackCoordinates[256] = { { 0, 1, 0, 24, -32, 32 }, // ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP { 0, 3, 24, 0, -32, -32 }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK { 0, 1, 24, 0, -32, 32 }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK - { 0, 0, 0, 16, 0, 0 }, // ELEM_POWERED_LIFT + { 0, 0, 0, 16, 0, 0 }, // ELEM_POWERED_LIFT { 0, 2, 0, 280, -64, -32 }, // ELEM_LEFT_LARGE_HALF_LOOP_UP { 0, 2, 0, 280, -64, 32 }, // ELEM_RIGHT_LARGE_HALF_LOOP_UP { 0, 2, 0, -280, 64, -32 }, // ELEM_RIGHT_LARGE_HALF_LOOP_DOWN @@ -221,13 +221,13 @@ const rct_track_coordinates TrackCoordinates[256] = { { 0, 1, 0, 48, -32, 32 }, // ELEM_RIGHT_FLY_CORKSCREW_UP_TO_DOWN { 0, 3, 0, -48, -32, -32 }, // ELEM_LEFT_FLY_CORKSCREW_DOWN_TO_UP { 0, 1, 0, -48, -32, 32 }, // ELEM_RIGHT_FLY_CORKSCREW_DOWN_TO_UP - { 0, 2, 0, 32, 0, 0 }, // ELEM_HEARTLINE_TRANSFER_UP - { 0, 2, 0, -32, 0, 0 }, // ELEM_HEARTLINE_TRANSFER_DOWN + { 0, 2, 0, 32, 0, 0 }, // ELEM_HEARTLINE_TRANSFER_UP + { 0, 2, 0, -32, 0, 0 }, // ELEM_HEARTLINE_TRANSFER_DOWN { 0, 0, 0, 0, -160, 0 }, // ELEM_LEFT_HEARTLINE_ROLL { 0, 0, 0, 0, -160, 0 }, // ELEM_RIGHT_HEARTLINE_ROLL - { 0, 0, 0, 0, -32, 0 }, // ELEM_MINI_GOLF_HOLE_A - { 0, 0, 0, 0, -32, 0 }, // ELEM_MINI_GOLF_HOLE_B - { 0, 0, 0, 0, -32, 0 }, // ELEM_MINI_GOLF_HOLE_C + { 0, 0, 0, 0, -32, 0 }, // ELEM_MINI_GOLF_HOLE_A + { 0, 0, 0, 0, -32, 0 }, // ELEM_MINI_GOLF_HOLE_B + { 0, 0, 0, 0, -32, 0 }, // ELEM_MINI_GOLF_HOLE_C { 0, 1, 0, 0, -32, 32 }, // ELEM_MINI_GOLF_HOLE_D { 0, 3, 0, 0, -32, -32 }, // ELEM_MINI_GOLF_HOLE_E { 0, 2, 0, -96, -96, 0 }, // ELEM_INVERTED_FLAT_TO_90_DEG_DOWN_QUARTER_LOOP @@ -235,12 +235,12 @@ const rct_track_coordinates TrackCoordinates[256] = { { 0, 2, 0, -128, -96, 0 }, // ELEM_QUARTER_LOOP_INVERT_TO_90_DEG_DOWN { 0, 3, 0, 16, -32, -32 }, // ELEM_LEFT_CURVED_LIFT_HILL { 0, 1, 0, 16, -32, 32 }, // ELEM_RIGHT_CURVED_LIFT_HILL - { 0, 0, 0, 0, -64, 0 }, // ELEM_LEFT_REVERSER - { 0, 0, 0, 0, -64, 0 }, // ELEM_RIGHT_REVERSER - { 0, 0, 0, 0, -32, 0 }, // ELEM_AIR_THRUST_TOP_CAP - { 0, 0, 80, 0, 32, 0 }, // ELEM_AIR_THRUST_VERTICAL_DOWN + { 0, 0, 0, 0, -64, 0 }, // ELEM_LEFT_REVERSER + { 0, 0, 0, 0, -64, 0 }, // ELEM_RIGHT_REVERSER + { 0, 0, 0, 0, -32, 0 }, // ELEM_AIR_THRUST_TOP_CAP + { 0, 0, 80, 0, 32, 0 }, // ELEM_AIR_THRUST_VERTICAL_DOWN { 0, 0, 240, 0, -160, 0 }, // ELEM_AIR_THRUST_VERTICAL_DOWN_TO_LEVEL - { 0, 0, 0, 0, 0, 0 }, // ELEM_BLOCK_BRAKES + { 0, 0, 0, 0, 0, 0 }, // ELEM_BLOCK_BRAKES { 0, 3, 0, 32, -32, -32 }, // ELEM_BANKED_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP { 0, 1, 0, 32, -32, 32 }, // ELEM_BANKED_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP { 0, 3, 32, 0, -32, -32 }, From 801d2ec34132054bb04e05dd9cf1075daad5dde2 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 25 Jul 2015 17:47:47 +0100 Subject: [PATCH 0364/1173] implement window_maze_construction_mousedown --- src/ride/ride.c | 8 ++++---- src/ride/ride.h | 6 +++--- src/windows/maze_construction.c | 21 +++++++++++++++++---- src/windows/ride_construction.c | 2 +- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 27eb49b92f..06de016512 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1247,9 +1247,9 @@ void sub_6C9627() 1 ); break; - case RIDE_CONSTRUCTION_STATE_6: - case RIDE_CONSTRUCTION_STATE_7: - case RIDE_CONSTRUCTION_STATE_8: + case RIDE_CONSTRUCTION_STATE_MAZE_BUILD: + case RIDE_CONSTRUCTION_STATE_MAZE_MOVE: + case RIDE_CONSTRUCTION_STATE_MAZE_FILL: if (_currentTrackSelectionFlags & 1) { map_invalidate_tile_full( _currentTrackBeginX & 0xFFE0, @@ -1594,7 +1594,7 @@ static int ride_modify_entrance_or_exit(rct_map_element *mapElement, int x, int int ride_modify_maze(rct_map_element *mapElement, int x, int y) { _currentRideIndex = mapElement->properties.track.ride_index; - _rideConstructionState = RIDE_CONSTRUCTION_STATE_6; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_MAZE_BUILD; _currentTrackBeginX = x; _currentTrackBeginY = y; _currentTrackBeginZ = mapElement->base_height * 8; diff --git a/src/ride/ride.h b/src/ride/ride.h index a1c917a321..d802ec541d 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -780,9 +780,9 @@ enum { RIDE_CONSTRUCTION_STATE_SELECTED, RIDE_CONSTRUCTION_STATE_PLACE, RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT, - RIDE_CONSTRUCTION_STATE_6, - RIDE_CONSTRUCTION_STATE_7, - RIDE_CONSTRUCTION_STATE_8 + RIDE_CONSTRUCTION_STATE_MAZE_BUILD, + RIDE_CONSTRUCTION_STATE_MAZE_MOVE, + RIDE_CONSTRUCTION_STATE_MAZE_FILL }; enum { diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index 9c5c7b63e4..dda47e957c 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -242,7 +242,20 @@ static void window_maze_construction_resize(rct_window *w) */ static void window_maze_construction_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) { - RCT2_CALLPROC_X(0x006CD48C, 0, 0, 0, widgetIndex, (int)w, (int)widget, 0); + switch (widgetIndex) { + case WIDX_MAZE_BUILD_MODE: + _rideConstructionState = RIDE_CONSTRUCTION_STATE_MAZE_BUILD; + window_maze_construction_update_pressed_widgets(); + break; + case WIDX_MAZE_MOVE_MODE: + _rideConstructionState = RIDE_CONSTRUCTION_STATE_MAZE_MOVE; + window_maze_construction_update_pressed_widgets(); + break; + case WIDX_MAZE_FILL_MODE: + _rideConstructionState = RIDE_CONSTRUCTION_STATE_MAZE_FILL; + window_maze_construction_update_pressed_widgets(); + break; + } } /** @@ -405,13 +418,13 @@ void window_maze_construction_update_pressed_widgets() pressedWidgets &= ~(1ULL << WIDX_MAZE_FILL_MODE); switch (_rideConstructionState) { - case RIDE_CONSTRUCTION_STATE_6: + case RIDE_CONSTRUCTION_STATE_MAZE_BUILD: pressedWidgets |= (1ULL << WIDX_MAZE_BUILD_MODE); break; - case RIDE_CONSTRUCTION_STATE_7: + case RIDE_CONSTRUCTION_STATE_MAZE_MOVE: pressedWidgets |= (1ULL << WIDX_MAZE_MOVE_MODE); break; - case RIDE_CONSTRUCTION_STATE_8: + case RIDE_CONSTRUCTION_STATE_MAZE_FILL: pressedWidgets |= (1ULL << WIDX_MAZE_FILL_MODE); break; } diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index ed19902a9f..1a112ae70e 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -3456,7 +3456,7 @@ void ride_construction_tooldown_construct(int screenX, int screenY) if (ride->type == RIDE_TYPE_MAZE) { for (int zAttempts = 41; zAttempts >= 0; zAttempts--) { - _rideConstructionState = RIDE_CONSTRUCTION_STATE_6; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_MAZE_BUILD; _currentTrackBeginX = x; _currentTrackBeginY = y; _currentTrackBeginZ = z; From ae32b463c0a0bbe74ec388a6a4ea5a6d056d11d4 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 25 Jul 2015 21:38:23 +0200 Subject: [PATCH 0365/1173] Add feature to make banners display text in all caps --- data/language/english_uk.txt | 1 + src/config.c | 1 + src/config.h | 1 + src/interface/viewport.c | 5 ++++- src/localisation/string_ids.h | 1 + src/windows/options.c | 30 ++++++++++++++++++++---------- 6 files changed, 28 insertions(+), 11 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index c2f7958242..83afd41154 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3807,3 +3807,4 @@ STR_5470 :Scroll map left STR_5471 :Scroll map down STR_5472 :Scroll map right STR_5473 :Cycle day / night +STR_5474 :Display text on banners in upper case diff --git a/src/config.c b/src/config.c index f51c4c5389..eed5bd3de9 100644 --- a/src/config.c +++ b/src/config.c @@ -185,6 +185,7 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, load_save_sort), "load_save_sort", CONFIG_VALUE_TYPE_UINT8, SORT_NAME_ASCENDING, NULL }, { offsetof(general_configuration, minimize_fullscreen_focus_loss), "minimize_fullscreen_focus_loss",CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, { offsetof(general_configuration, day_night_cycle), "day_night_cycle", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(general_configuration, upper_case_banners), "upper_case_banners", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, }; config_property_definition _interfaceDefinitions[] = { diff --git a/src/config.h b/src/config.h index 0bc0b35d06..a4c5993f67 100644 --- a/src/config.h +++ b/src/config.h @@ -161,6 +161,7 @@ typedef struct { uint8 load_save_sort; uint8 minimize_fullscreen_focus_loss; uint8 day_night_cycle; + uint8 upper_case_banners; } general_configuration; typedef struct { diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 769d340b03..90771a2bb2 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1051,7 +1051,10 @@ int scrolling_text_setup(rct_string_id string_id, uint16 scroll, uint16 scrollin // Convert string id back into a string for processing uint8 scroll_string[MAX_PATH]; - format_string(scroll_string, string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + if(gConfigGeneral.upper_case_banners) + format_string_to_upper(scroll_string, string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + else + format_string(scroll_string, string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); // Setup character colour from ??? uint8 character = RCT2_GLOBAL(0x13CE959, uint8); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index d2799c3879..adfffa116c 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1804,6 +1804,7 @@ enum { STR_SHORTCUT_SCROLL_MAP_RIGHT = 5472, STR_CYCLE_DAY_NIGHT = 5473, + STR_UPPER_CASE_BANNERS = 5474, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/windows/options.c b/src/windows/options.c index 883a41dcda..29d5a239b5 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -86,6 +86,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_THEMES_DROPDOWN, WIDX_THEMES_BUTTON, WIDX_DAY_NIGHT_CHECKBOX, + WIDX_UPPER_CASE_BANNERS_CHECKBOX, // Culture / Units WIDX_LANGUAGE = WIDX_PAGE_START, @@ -143,7 +144,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { }; #define WW 310 -#define WH 208 +#define WH 238 #define MAIN_OPTIONS_WIDGETS \ { WWT_FRAME, 0, 0, WW-1, 0, WH-1, STR_NONE, STR_NONE }, \ @@ -166,14 +167,15 @@ static rct_widget window_options_display_widgets[] = { { WWT_CHECKBOX, 1, 10, 290, 84, 95, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, // landscape smoothing { WWT_CHECKBOX, 1, 10, 290, 99, 110, STR_GRIDLINES, STR_GRIDLINES_TIP }, // gridlines { WWT_CHECKBOX, 1, 10, 290, 114, 125, 5154, STR_NONE }, // hardware display - { WWT_CHECKBOX, 1, 155, 290, 114, 125, 5454, STR_NONE }, // uncap fps - { WWT_CHECKBOX, 1, 10, 290, 129, 140, 5440, STR_NONE }, // minimize fullscreen focus loss - { WWT_DROPDOWN, 1, 155, 299, 143, 154, STR_NONE, STR_NONE }, // construction marker - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 144, 153, 876, STR_NONE }, - { WWT_DROPDOWN, 1, 155, 299, 158, 169, STR_NONE, STR_NONE }, // colour schemes - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 159, 168, 876, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 26, 185, 174, 185, 5153, STR_NONE }, // colour schemes button - { WWT_CHECKBOX, 1, 10, 290, 190, 201, STR_CYCLE_DAY_NIGHT,STR_NONE }, // cycle day-night + { WWT_CHECKBOX, 1, 10, 290, 129, 140, 5454, STR_NONE }, // uncap fps + { WWT_CHECKBOX, 1, 10, 290, 144, 155, 5440, STR_NONE }, // minimize fullscreen focus loss + { WWT_DROPDOWN, 1, 155, 299, 158, 169, STR_NONE, STR_NONE }, // construction marker + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 159, 178, 876, STR_NONE }, + { WWT_DROPDOWN, 1, 155, 299, 173, 184, STR_NONE, STR_NONE }, // colour schemes + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 174, 183, 876, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 26, 185, 189, 200, 5153, STR_NONE }, // colour schemes button + { WWT_CHECKBOX, 1, 10, 290, 204, 216, STR_CYCLE_DAY_NIGHT,STR_NONE }, // cycle day-night + { WWT_CHECKBOX, 1, 10, 290, 219, 231, STR_UPPER_CASE_BANNERS,STR_NONE }, // upper case banners { WIDGETS_END }, }; @@ -338,7 +340,8 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_THEMES) | (1 << WIDX_THEMES_DROPDOWN) | (1 << WIDX_THEMES_BUTTON) | - (1 << WIDX_DAY_NIGHT_CHECKBOX), + (1 << WIDX_DAY_NIGHT_CHECKBOX) | + (1 << WIDX_UPPER_CASE_BANNERS_CHECKBOX), MAIN_OPTIONS_ENABLED_WIDGETS | (1 << WIDX_LANGUAGE) | @@ -485,6 +488,11 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) config_save_default(); window_invalidate(w); break; + case WIDX_UPPER_CASE_BANNERS_CHECKBOX: + gConfigGeneral.upper_case_banners ^= 1; + config_save_default(); + window_invalidate(w); + break; } break; @@ -1084,6 +1092,7 @@ static void window_options_invalidate(rct_window *w) widget_set_checkbox_value(w, WIDX_UNCAP_FPS_CHECKBOX, gConfigGeneral.uncap_fps); widget_set_checkbox_value(w, WIDX_MINIMIZE_FOCUS_LOSS, gConfigGeneral.minimize_fullscreen_focus_loss); widget_set_checkbox_value(w, WIDX_DAY_NIGHT_CHECKBOX, gConfigGeneral.day_night_cycle); + widget_set_checkbox_value(w, WIDX_UPPER_CASE_BANNERS_CHECKBOX, gConfigGeneral.upper_case_banners); // construction marker: celsius/fahrenheit window_options_display_widgets[WIDX_CONSTRUCTION_MARKER].image = STR_WHITE + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CONSTRUCTION_MARKER, uint8); @@ -1103,6 +1112,7 @@ static void window_options_invalidate(rct_window *w) window_options_display_widgets[WIDX_THEMES_DROPDOWN].type = WWT_DROPDOWN_BUTTON; window_options_display_widgets[WIDX_THEMES_BUTTON].type = WWT_DROPDOWN_BUTTON; window_options_display_widgets[WIDX_DAY_NIGHT_CHECKBOX].type = WWT_CHECKBOX; + window_options_display_widgets[WIDX_UPPER_CASE_BANNERS_CHECKBOX].type = WWT_CHECKBOX; break; case WINDOW_OPTIONS_PAGE_CULTURE: From 0d8d797f151d78eea35c5fd044d123d7a6c7d060 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 26 Jul 2015 04:00:14 +0100 Subject: [PATCH 0366/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 54 ++++++++++++++++++++++++---------------- data/language/german.txt | 41 +++++++++++++++++------------- 2 files changed, 56 insertions(+), 39 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index c25e92adef..d28b49b80d 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -836,16 +836,17 @@ STR_0834 :{SMALLFONT}{BLACK}Schijf- en spelopties STR_0835 :Kan het spel niet initialiseren STR_0836 :Kan het spel niet in geminimaliseerde toestand starten STR_0837 :Kan het grafisch systeem niet starten -STR_0838 :CD-code {INT32} is niet geldig voor deze CD van RollerCoaster Tycoon 2!{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Deïnstalleer RollerCoaster Tycoon 2% en installeer het opnieuw met de correcte CD-code +STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -STR_0841 :Bureaubladvenster -STR_0842 :640x480 (volledig scherm) -STR_0843 :800x600 (volledig scherm) -STR_0844 :1024x768 (volledig scherm) -STR_0845 :1152x864 (volledig scherm) -STR_0846 :1280x1024 (volledig scherm) -STR_0847 :Over 'RollerCoaster Tycoon 2' +# The follwing six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :Over 'OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}Versie 2.01.028 STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, alle rechten voorbehouden @@ -1041,10 +1042,10 @@ STR_1039 :Nieuw baanontwerp installeren STR_1040 :Spel opslaan STR_1041 :Scenario opslaan STR_1042 :Landschap opslaan -STR_1043 :Opgeslagen spel van RollerCoaster Tycoon 2 -STR_1044 :Scenario voor RollerCoaster Tycoon 2 -STR_1045 :Landschap voor RollerCoaster Tycoon 2 -STR_1046 :Baanontwerp voor RollerCoaster Tycoon 2 +STR_1043 :Opgeslagen spel van OpenRCT2 +STR_1044 :Scenario voor OpenRCT2 +STR_1045 :Landschap voor OpenRCT2 +STR_1046 :Baanontwerp voor OpenRCT2 STR_1047 :Spel opslaan mislukt! STR_1048 :Scenario opslaan mislukt! STR_1049 :Landschap opslaan mislukt! @@ -1890,8 +1891,10 @@ STR_1888 :{WINDOW_COLOUR_2}Tijd sinds laatste inspectie: {BLACK}meer dan 4 uu STR_1889 :{WINDOW_COLOUR_2}Stilstandtijd: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1890 :{SMALLFONT}{BLACK}Selecteer hoe vaak een monteur deze attractie moet inspecteren STR_1891 :Nog geen {STRINGID} in het park! -STR_1892 :RollerCoaster Tycoon 2 -STR_1893 :Voer je CD van RollerCoaster Tycoon 2 in het volgende station in: +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : STR_1894 :{WINDOW_COLOUR_2}{STRINGID} verkocht: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}Nieuwe attractie bouwen STR_1896 :{WINDOW_COLOUR_2}Uitgaven/Inkomsten @@ -2680,8 +2683,8 @@ STR_2678 :??? STR_2679 :??? STR_2680 :Alle onderzoeken zijn voltooid STR_2681 :{MEDIUMFONT}{BLACK}Verhoog je saldo met {CURRENCY} -STR_2682 :{MEDIUMFONT}{BLACK}Wissel tussen betaalde en gratis entree -STR_2683 :{MEDIUMFONT}{BLACK}Alle bezoekers hebben een maximale tevredenheid +STR_2682 : +STR_2683 : STR_2684 :{SMALLFONT}{BLACK}Er arriveert een grote groep bezoekers STR_2685 :Parameters voor Simplex noise STR_2686 :Minimum: @@ -2759,10 +2762,10 @@ STR_2757 :Mooi weer STR_2758 :Regen STR_2759 :Hoogtes op nul STR_2760 :+{CURRENCY} -STR_2761 :Betaalde entree -STR_2762 :Betalen per rit +STR_2761 : +STR_2762 : STR_2763 :??? -STR_2764 :Tevreden gasten +STR_2764 : STR_2765 :Grote groep STR_2766 :Win scenario STR_2767 :Weer vastzetten @@ -2857,7 +2860,7 @@ STR_2855 :{RED}{STRINGID} heeft geen pad vanaf de uitgang!{NEWLINE}Bouw een p STR_2856 :{WINDOW_COLOUR_2}Tutorial STR_2857 :{WINDOW_COLOUR_2}(Druk op een toets of muisknop om de controle over te nemen) STR_2858 :Kan marketingcampagne niet starten... -STR_2859 :RollerCoaster Tycoon 2 draait al +STR_2859 :OpenRCT2 draait al STR_2860 :Credits voor Infogrames Interactive... STR_2861 :{WINDOW_COLOUR_2}In licentie geven aan Infogrames Interactive Inc. STR_2862 :Muziekdankwoord... @@ -3158,8 +3161,8 @@ STR_3156 : STR_3157 :kaart STR_3158 :grafiek STR_3159 :lijst -STR_3160 :RollerCoaster Tycoon 2: Eerste start... -STR_3161 :RollerCoaster Tycoon 2: Objectbestanden controleren... +STR_3160 : +STR_3161 : STR_3162 :Kan niet voldoende geheugen toewijzen STR_3163 :Nieuwe data installeren: STR_3164 :{BLACK}{COMMA16} geselecteerd (maximum: {COMMA16}) @@ -3796,3 +3799,10 @@ STR_5463 :Doel: Plezier hebben! STR_5464 :Algemeen STR_5465 :Weer STR_5466 :Werknemers +STR_5467 :ALT + +STR_5468 :'Recente berichten'-knop in werkbalk tonen +STR_5469 :Kaart naar boven scrollen +STR_5470 :Kaart naar links scrollen +STR_5471 :Kaart naar beneden scrollen +STR_5472 :Kaart naar rechts scrollen +STR_5473 :Dag-nachtcyclus diff --git a/data/language/german.txt b/data/language/german.txt index d0ac9af195..8e9ea3d3cd 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -839,16 +839,16 @@ STR_0834 :{SMALLFONT}{BLACK}Festplatten- und Spieloptionen STR_0835 :Spielinitialisierung fehlgeschlagen STR_0836 :Spiel kann nicht im minimierten Zustand gestartet werden STR_0837 :Grafiksystem kann nicht initialisiert werden -STR_0838 :CD-Code {INT32} ist für Ihre RollerCoaster Tycoon 2-CD nicht gültig!{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Deinstallieren Sie RollerCoaster Tycoon 2% und installieren Sie das Spiel mit dem korrekten CD-Code erneut +STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -STR_0841 :Desktop-Fenster -STR_0842 :640x480-Vollbild -STR_0843 :800x600-Vollbild -STR_0844 :1024x768-Vollbild -STR_0845 :1152x864-Vollbild -STR_0846 :1280x1024-Vollbild -STR_0847 :Infos zu `RollerCoaster Tycoon 2' +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :Infos zu `OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}Version 2.01.032 STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, alle Rechte vorbehalten @@ -1044,10 +1044,10 @@ STR_1039 :Neuen Streckenentwurf installieren STR_1040 :Spiel speichern STR_1041 :Szenario speichern STR_1042 :Landschaft speichern -STR_1043 :RollerCoaster Tycoon 2 - gespeichertes Spiel -STR_1044 :RollerCoaster Tycoon 2 - Szenariodatei -STR_1045 :RollerCoaster Tycoon 2 - Landschaftsdatei -STR_1046 :RollerCoaster Tycoon 2 - Streckenentwurfsdatei +STR_1043 :OpenRCT2 - gespeichertes Spiel +STR_1044 :OpenRCT2 - Szenariodatei +STR_1045 :OpenRCT2 - Landschaftsdatei +STR_1046 :OpenRCT2 - Streckenentwurfsdatei STR_1047 :Speicherung des Spiels fehlgeschlagen! STR_1048 :Speicherung des Szenarios fehlgeschlagen! STR_1049 :Speicherung der Landschaft fehlgeschlagen! @@ -1893,8 +1893,8 @@ STR_1888 :{WINDOW_COLOUR_2}Letzte Inspektion vor: {BLACK}mehr als 4 Stunden STR_1889 :{WINDOW_COLOUR_2}Ausfallzeit: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1890 :{SMALLFONT}{BLACK}Auswählen, wie oft ein Mechaniker{NEWLINE}diese Bahn überprüfen soll STR_1891 :Noch kein {STRINGID} im Park -STR_1892 :RollerCoaster Tycoon 2 -STR_1893 :Legen Sie die RollerCoaster Tycoon 2-CD in folgendes Laufwerk ein: +STR_1892 : +STR_1893 : STR_1894 :{WINDOW_COLOUR_2}{STRINGID} verkauft: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}Neue Attraktion bauen STR_1896 :{WINDOW_COLOUR_2}Ausgaben/Einnahmen @@ -2864,7 +2864,7 @@ STR_2855 :{RED}{STRINGID} hat keinen Fußweg, der vom Ausgang wegführt!{NEWL STR_2856 :{WINDOW_COLOUR_2}Lehrgang STR_2857 :{WINDOW_COLOUR_2}(Drücken Sie eine Taste oder klicken Sie mit der Maus, um die Kontrolle zu übernehmen) STR_2858 :Marketingkampage kann nicht gestartet werden... -STR_2859 :RollerCoaster Tycoon 2 läuft bereits +STR_2859 :OpenRCT2 läuft bereits STR_2860 :Infogrames Interactive Credits... STR_2861 :{WINDOW_COLOUR_2}Lizenziert für Infogrames Interactive Inc. STR_2862 :Musik... @@ -3165,8 +3165,8 @@ STR_3156 : STR_3157 :Karte STR_3158 :Diagramm STR_3159 :Liste -STR_3160 :RollerCoaster Tycoon 2: Wird zum ersten Mal gestartet... -STR_3161 :RollerCoaster Tycoon 2: Objektdateien werden überprüft... +STR_3160 : +STR_3161 : STR_3162 :Es kann nicht genügend Geld bereitgestellt werden STR_3163 :Neue Daten werden installiert: STR_3164 :{BLACK}{COMMA16} ausgewählt (maximal {COMMA16}) @@ -3800,3 +3800,10 @@ STR_5463 :Ziel: Viel Spaß! STR_5464 :Allgemein STR_5465 :Klima STR_5466 :Personal +STR_5467 :ALT + +STR_5468 :Letzte Nachrichten in der Symbolleiste anzeigen +STR_5469 :Karte nach oben verschieben +STR_5470 :Karte nach links verschieben +STR_5471 :Karte nach unten verschieben +STR_5472 :Karte nach rechts verschieben +STR_5473 :Tag-Nacht-Wechsel From 568915d7fbad7c85afb0bab4ceb964c487c19120 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 26 Jul 2015 07:41:44 +0100 Subject: [PATCH 0367/1173] Fix peeps not moving when footpath changed. Fixes #1604 --- src/world/footpath.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/footpath.c b/src/world/footpath.c index 997c80b1e9..a7cb85f7a0 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -683,7 +683,7 @@ void footpath_interrupt_peeps(int x, int y, int z) nextSpriteIndex = peep->next_in_quadrant; if (peep->linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_PEEP) { if (peep->state == PEEP_STATE_SITTING || peep->state == PEEP_STATE_WATCHING) { - if (peep->z == 0) { + if (peep->z == z) { peep_decrement_num_riders(peep); peep->state = PEEP_STATE_WALKING; peep_window_state_update(peep); From bcdfdcb7a061c943fd9058f0b61e08d750284a95 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 26 Jul 2015 14:37:27 +0200 Subject: [PATCH 0368/1173] Reorder Options window --- data/language/english_uk.txt | 16 +- src/localisation/string_ids.h | 28 ++++ src/windows/options.c | 283 +++++++++++++++++----------------- 3 files changed, 181 insertions(+), 146 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 21d6989d8c..ca09abc8b8 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3456,8 +3456,8 @@ STR_3445 :Set Patrol Area STR_3446 :Cancel Patrol Area # New strings, cleaner -STR_5120 :Show finances button on toolbar -STR_5121 :Show research button on toolbar +STR_5120 :Finances +STR_5121 :Research STR_5122 :Select rides by track type (like in RCT1) STR_5123 :Renew rides STR_5124 :No Six Flags @@ -3483,7 +3483,7 @@ STR_5143 :Quick Speed STR_5144 :Fast Speed STR_5145 :Turbo Speed STR_5146 :Hyper Speed -STR_5147 :Show cheats button on toolbar +STR_5147 :Cheats STR_5148 :{SMALLFONT}{BLACK}Change the game speed STR_5149 :{SMALLFONT}{BLACK}Open the cheats window STR_5150 :Enable debugging tools @@ -3605,7 +3605,7 @@ STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible STR_5266 :{SMALLFONT}{BLACK}Display STR_5267 :{SMALLFONT}{BLACK}Culture and Units STR_5268 :{SMALLFONT}{BLACK}Audio -STR_5269 :{SMALLFONT}{BLACK}Controls +STR_5269 :{SMALLFONT}{BLACK}Controls and interface STR_5270 :{SMALLFONT}{BLACK}Miscellaneous STR_5271 :{SMALLFONT}{BLACK}Twitch STR_5272 :{SMALLFONT}{BLACK}Small Scenery @@ -3804,10 +3804,16 @@ STR_5464 :General STR_5465 :Climate STR_5466 :Staff STR_5467 :ALT + -STR_5468 :Show recent messages button on toolbar +STR_5468 :Recent messages STR_5469 :Scroll map up STR_5470 :Scroll map left STR_5471 :Scroll map down STR_5472 :Scroll map right STR_5473 :Cycle day / night STR_5474 :Display text on banners in upper case +STR_5476 :Hardware +STR_5477 :Map rendering +STR_5478 :Controls +STR_5479 :Toolbar +STR_5480 :Show toolbar buttons for: +STR_5481 :Themes diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index adfffa116c..d3a0ad9267 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -83,6 +83,8 @@ enum { STR_PAUSE_GAME_TIP = 833, STR_DISC_AND_GAME_OPTIONS_TIP = 834, + STR_RESOLUTION_X_BY_Y = 840, + STR_ROTATE_CLOCKWISE = 5458, STR_ROTATE_ANTI_CLOCKWISE = 5459, @@ -1709,6 +1711,13 @@ enum { STR_OPENRCT2_BEGIN_STRING_ID = 5120, + STR_FINANCES_BUTTON_ON_TOOLBAR = 5120, + STR_RESEARCH_BUTTON_ON_TOOLBAR = 5121, + STR_SELECT_BY_TRACK_TYPE = 5122, + STR_CHEATS_BUTTON_ON_TOOLBAR = 5147, + + STR_HARDWARE_DISPLAY = 5154, + STR_TWITCH_NAME = 5164, STR_TWITCH_PEEP_FOLLOWERS = 5165, STR_TWITCH_PEEP_FOLLOWERS_TIP = 5166, @@ -1727,6 +1736,13 @@ enum { STR_GIANT_SCREENSHOT = 5260, + STR_OPTIONS_DISPLAY_TIP = 5266, + STR_OPTIONS_CULTURE_TIP = 5267, + STR_OPTIONS_AUDIO_TIP = 5268, + STR_OPTIONS_CONTROLS_AND_INTERFACE_TIP = 5269, + STR_OPTIONS_MISCELLANEOUS_TIP = 5270, + STR_OPTIONS_TWITCH_TIP = 5271, + STR_CHEAT_SANDBOX_MODE = 5278, STR_CHEAT_SANDBOX_MODE_DISABLE = 5279, STR_CHEAT_SANDBOX_MODE_TIP = 5280, @@ -1770,6 +1786,10 @@ enum { STR_UP = 5375, STR_DOWN = 5376, + STR_MININISE_FULL_SCREEN_ON_FOCUS_LOSS = 5440, + + STR_SELECT_BY_TRACK_TYPE_TIP = 5441, + STR_FORCE_PARK_RATING = 5442, STR_OBJECTS_SORT_TYPE = 5447, @@ -1782,6 +1802,8 @@ enum { STR_SELECT_OTHER_RIDE = 5453, + STR_UNCAP_FPS = 5454, + STR_ENABLE_SANDBOX_MODE = 5455, STR_DISABLE_CLEARANCE_CHECKS = 5456, STR_DISABLE_SUPPORT_LIMITS = 5457, @@ -1805,6 +1827,12 @@ enum { STR_CYCLE_DAY_NIGHT = 5473, STR_UPPER_CASE_BANNERS = 5474, + STR_HARDWARE_GROUP = 5476, + STR_RENDERING_GROUP = 5477, + STR_CONTROLS_GROUP = 5478, + STR_TOOLBAR_BUTTONS_GROUP = 5479, + STR_SHOW_TOOLBAR_BUTTONS_FOR = 5480, + STR_THEMES_GROUP = 5481, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/windows/options.c b/src/windows/options.c index 29d5a239b5..779e63d2f7 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -48,7 +48,7 @@ enum WINDOW_OPTIONS_PAGE { WINDOW_OPTIONS_PAGE_DISPLAY, WINDOW_OPTIONS_PAGE_CULTURE, WINDOW_OPTIONS_PAGE_AUDIO, - WINDOW_OPTIONS_PAGE_CONTROLS, + WINDOW_OPTIONS_PAGE_CONTROLS_AND_INTERFACE, WINDOW_OPTIONS_PAGE_MISC, WINDOW_OPTIONS_PAGE_TWITCH, WINDOW_OPTIONS_PAGE_COUNT @@ -71,20 +71,19 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_PAGE_START, // Display - WIDX_RESOLUTION = WIDX_PAGE_START, + WIDX_HARDWARE_GROUP = WIDX_PAGE_START, + WIDX_RESOLUTION, WIDX_RESOLUTION_DROPDOWN, WIDX_FULLSCREEN, WIDX_FULLSCREEN_DROPDOWN, - WIDX_TILE_SMOOTHING_CHECKBOX, - WIDX_GRIDLINES_CHECKBOX, WIDX_HARDWARE_DISPLAY_CHECKBOX, WIDX_UNCAP_FPS_CHECKBOX, WIDX_MINIMIZE_FOCUS_LOSS, + WIDX_RENDERING_GROUP, + WIDX_TILE_SMOOTHING_CHECKBOX, + WIDX_GRIDLINES_CHECKBOX, WIDX_CONSTRUCTION_MARKER, WIDX_CONSTRUCTION_MARKER_DROPDOWN, - WIDX_THEMES, - WIDX_THEMES_DROPDOWN, - WIDX_THEMES_BUTTON, WIDX_DAY_NIGHT_CHECKBOX, WIDX_UPPER_CASE_BANNERS_CHECKBOX, @@ -112,21 +111,27 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_MASTER_VOLUME, WIDX_MUSIC_VOLUME, - // Controls - WIDX_SCREEN_EDGE_SCROLLING = WIDX_PAGE_START, + // Controls and interface + WIDX_CONTROLS_GROUP = WIDX_PAGE_START, + WIDX_SCREEN_EDGE_SCROLLING, WIDX_INVERT_DRAG, WIDX_HOTKEY_DROPDOWN, + WIDX_THEMES_GROUP, + WIDX_THEMES, + WIDX_THEMES_DROPDOWN, + WIDX_THEMES_BUTTON, + WIDX_TOOLBAR_BUTTONS_GROUP, WIDX_TOOLBAR_SHOW_FINANCES, WIDX_TOOLBAR_SHOW_RESEARCH, WIDX_TOOLBAR_SHOW_CHEATS, WIDX_TOOLBAR_SHOW_NEWS, + WIDX_SELECT_BY_TRACK_TYPE, // Misc WIDX_REAL_NAME_CHECKBOX = WIDX_PAGE_START, WIDX_SAVE_PLUGIN_DATA_CHECKBOX, WIDX_AUTOSAVE, WIDX_AUTOSAVE_DROPDOWN, - WIDX_SELECT_BY_TRACK_TYPE, WIDX_TEST_UNFINISHED_TRACKS, WIDX_AUTO_STAFF_PLACEMENT, WIDX_DEBUGGING_TOOLS, @@ -143,39 +148,39 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_NEWS_CHECKBOX }; -#define WW 310 -#define WH 238 +#define WW 310 +#define WH 265 #define MAIN_OPTIONS_WIDGETS \ { WWT_FRAME, 0, 0, WW-1, 0, WH-1, STR_NONE, STR_NONE }, \ { WWT_CAPTION, 0, 1, WW-2, 1, 14, STR_OPTIONS_TITLE, STR_WINDOW_TITLE_TIP }, \ { WWT_CLOSEBOX, 0, WW-13, WW-3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, \ { WWT_RESIZE, 1, 0, WW-1, 43, WH-1, 0xFFFFFFFF, STR_NONE }, \ - { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, 5266 }, \ - { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, 5267 }, \ - { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, 5268 }, \ - { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, 5269 }, \ - { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, 5270 }, \ - { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, 5271 } + { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_OPTIONS_DISPLAY_TIP }, \ + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_OPTIONS_CULTURE_TIP }, \ + { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_OPTIONS_AUDIO_TIP }, \ + { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_OPTIONS_CONTROLS_AND_INTERFACE_TIP }, \ + { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_OPTIONS_MISCELLANEOUS_TIP }, \ + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_OPTIONS_TWITCH_TIP } static rct_widget window_options_display_widgets[] = { MAIN_OPTIONS_WIDGETS, - { WWT_DROPDOWN, 1, 155, 299, 53, 64, 840, STR_NONE }, // resolution - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 54, 63, 876, STR_NONE }, - { WWT_DROPDOWN, 1, 155, 299, 68, 79, 871, STR_NONE }, // fullscreen - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 69, 78, 876, STR_NONE }, - { WWT_CHECKBOX, 1, 10, 290, 84, 95, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, // landscape smoothing - { WWT_CHECKBOX, 1, 10, 290, 99, 110, STR_GRIDLINES, STR_GRIDLINES_TIP }, // gridlines - { WWT_CHECKBOX, 1, 10, 290, 114, 125, 5154, STR_NONE }, // hardware display - { WWT_CHECKBOX, 1, 10, 290, 129, 140, 5454, STR_NONE }, // uncap fps - { WWT_CHECKBOX, 1, 10, 290, 144, 155, 5440, STR_NONE }, // minimize fullscreen focus loss - { WWT_DROPDOWN, 1, 155, 299, 158, 169, STR_NONE, STR_NONE }, // construction marker - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 159, 178, 876, STR_NONE }, - { WWT_DROPDOWN, 1, 155, 299, 173, 184, STR_NONE, STR_NONE }, // colour schemes - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 174, 183, 876, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 26, 185, 189, 200, 5153, STR_NONE }, // colour schemes button - { WWT_CHECKBOX, 1, 10, 290, 204, 216, STR_CYCLE_DAY_NIGHT,STR_NONE }, // cycle day-night - { WWT_CHECKBOX, 1, 10, 290, 219, 231, STR_UPPER_CASE_BANNERS,STR_NONE }, // upper case banners + { WWT_GROUPBOX, 1, 5, 304, 53, 145, STR_HARDWARE_GROUP, STR_NONE }, // Hardware group + { WWT_DROPDOWN, 1, 155, 299, 68, 79, STR_RESOLUTION_X_BY_Y, STR_NONE }, // resolution + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 69, 78, 876, STR_NONE }, + { WWT_DROPDOWN, 1, 155, 299, 83, 94, 871, STR_NONE }, // fullscreen + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 84, 93, 876, STR_NONE }, + { WWT_CHECKBOX, 1, 10, 290, 99, 110, STR_HARDWARE_DISPLAY, STR_NONE }, // hardware display + { WWT_CHECKBOX, 1, 10, 290, 114, 125, STR_UNCAP_FPS, STR_NONE }, // uncap fps + { WWT_CHECKBOX, 1, 10, 290, 129, 140, STR_MININISE_FULL_SCREEN_ON_FOCUS_LOSS, STR_NONE }, // minimise fullscreen focus loss + + { WWT_GROUPBOX, 1, 5, 304, 149, 240, STR_RENDERING_GROUP, STR_NONE }, // Rendering group + { WWT_CHECKBOX, 1, 10, 290, 164, 175, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, // landscape smoothing + { WWT_CHECKBOX, 1, 10, 290, 179, 190, STR_GRIDLINES, STR_GRIDLINES_TIP }, // gridlines + { WWT_DROPDOWN, 1, 155, 299, 193, 204, STR_NONE, STR_NONE }, // construction marker + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 194, 203, 876, STR_NONE }, + { WWT_CHECKBOX, 1, 10, 290, 209, 220, STR_CYCLE_DAY_NIGHT, STR_NONE }, // cycle day-night + { WWT_CHECKBOX, 1, 10, 290, 224, 235, STR_UPPER_CASE_BANNERS, STR_NONE }, // upper case banners { WIDGETS_END }, }; @@ -209,15 +214,25 @@ static rct_widget window_options_audio_widgets[] = { { WIDGETS_END }, }; -static rct_widget window_options_controls_widgets[] = { +static rct_widget window_options_controls_and_interface_widgets[] = { MAIN_OPTIONS_WIDGETS, - { WWT_CHECKBOX, 2, 10, 299, 54, 65, STR_SCREEN_EDGE_SCROLLING, STR_SCREEN_EDGE_SCROLLING_TIP }, - { WWT_CHECKBOX, 2, 10, 299, 69, 80, STR_INVERT_RIGHT_MOUSE_DRAG, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 26, 185, 84, 95, STR_HOTKEY, STR_HOTKEY_TIP }, - { WWT_CHECKBOX, 2, 10, 299, 99, 110, 5120, STR_NONE }, - { WWT_CHECKBOX, 2, 10, 299, 114, 125, 5121, STR_NONE }, - { WWT_CHECKBOX, 2, 10, 299, 129, 140, 5147, STR_NONE }, - { WWT_CHECKBOX, 2, 10, 299, 144, 155, STR_SHOW_RECENT_MESSAGES_ON_TOOLBAR, STR_NONE }, + { WWT_GROUPBOX, 1, 5, 304, 53, 114, STR_CONTROLS_GROUP, STR_NONE }, // Controls group + { WWT_CHECKBOX, 2, 10, 299, 68, 79, STR_SCREEN_EDGE_SCROLLING, STR_SCREEN_EDGE_SCROLLING_TIP }, // Edge scrolling + { WWT_CHECKBOX, 2, 10, 299, 83, 94, STR_INVERT_RIGHT_MOUSE_DRAG, STR_NONE }, // Invert right mouse dragging + { WWT_DROPDOWN_BUTTON, 1, 26, 185, 98, 109, STR_HOTKEY, STR_HOTKEY_TIP }, // Set hotkeys buttons + + { WWT_GROUPBOX, 1, 5, 304, 118, 164, STR_THEMES_GROUP, STR_NONE }, // Toolbar buttons group + { WWT_DROPDOWN, 1, 155, 299, 132, 143, STR_NONE, STR_NONE }, // Themes + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 133, 142, 876, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 10, 145, 148, 159, 5153, STR_NONE }, // Themes button + + { WWT_GROUPBOX, 1, 5, 304, 168, 230, STR_TOOLBAR_BUTTONS_GROUP, STR_NONE }, // Toolbar buttons group + { WWT_CHECKBOX, 2, 10, 145, 199, 210, STR_FINANCES_BUTTON_ON_TOOLBAR, STR_NONE }, // Finances + { WWT_CHECKBOX, 2, 10, 145, 214, 225, STR_RESEARCH_BUTTON_ON_TOOLBAR, STR_NONE }, // Research + { WWT_CHECKBOX, 2, 155, 299, 199, 210, STR_CHEATS_BUTTON_ON_TOOLBAR, STR_NONE }, // Cheats + { WWT_CHECKBOX, 2, 155, 299, 214, 225, STR_SHOW_RECENT_MESSAGES_ON_TOOLBAR, STR_NONE }, // Recent messages + + { WWT_CHECKBOX, 2, 10, 299, 239, 250, STR_SELECT_BY_TRACK_TYPE, STR_SELECT_BY_TRACK_TYPE_TIP }, // Select by track type { WIDGETS_END }, }; @@ -227,7 +242,6 @@ static rct_widget window_options_misc_widgets[] = { { WWT_CHECKBOX, 2, 10, 299, 69, 80, STR_SAVE_PLUGIN_DATA, STR_SAVE_PLUGIN_DATA_TIP }, { WWT_DROPDOWN, 1, 155, 299, 83, 94, STR_NONE, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 288, 298, 84, 93, 876, STR_NONE }, - { WWT_CHECKBOX, 2, 10, 299, 99, 110, 5122, 5441 }, // select by track type { WWT_CHECKBOX, 2, 10, 299, 114, 125, 5155, 5156 }, // test unfinished tracks { WWT_CHECKBOX, 2, 10, 299, 129, 140, 5343, STR_NONE }, // auto staff placement { WWT_CHECKBOX, 2, 10, 299, 144, 155, 5150, STR_NONE }, // enabled debugging tools @@ -252,7 +266,7 @@ rct_widget *window_options_page_widgets[] = { window_options_display_widgets, window_options_culture_widgets, window_options_audio_widgets, - window_options_controls_widgets, + window_options_controls_and_interface_widgets, window_options_misc_widgets, window_options_twitch_widgets }; @@ -337,9 +351,6 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_MINIMIZE_FOCUS_LOSS) | (1 << WIDX_CONSTRUCTION_MARKER) | (1 << WIDX_CONSTRUCTION_MARKER_DROPDOWN) | - (1 << WIDX_THEMES) | - (1 << WIDX_THEMES_DROPDOWN) | - (1 << WIDX_THEMES_BUTTON) | (1 << WIDX_DAY_NIGHT_CHECKBOX) | (1 << WIDX_UPPER_CASE_BANNERS_CHECKBOX), @@ -372,14 +383,17 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_TOOLBAR_SHOW_FINANCES) | (1 << WIDX_TOOLBAR_SHOW_RESEARCH) | (1 << WIDX_TOOLBAR_SHOW_CHEATS) | - (1 << WIDX_TOOLBAR_SHOW_NEWS), + (1 << WIDX_TOOLBAR_SHOW_NEWS) | + (1 << WIDX_THEMES) | + (1 << WIDX_THEMES_DROPDOWN) | + (1 << WIDX_THEMES_BUTTON) | + (1 << WIDX_SELECT_BY_TRACK_TYPE), MAIN_OPTIONS_ENABLED_WIDGETS | (1 << WIDX_REAL_NAME_CHECKBOX) | (1 << WIDX_SAVE_PLUGIN_DATA_CHECKBOX) | (1 << WIDX_AUTOSAVE) | (1 << WIDX_AUTOSAVE_DROPDOWN) | - (1 << WIDX_SELECT_BY_TRACK_TYPE) | (1 << WIDX_TEST_UNFINISHED_TRACKS) | (1 << WIDX_AUTO_STAFF_PLACEMENT) | (1 << WIDX_DEBUGGING_TOOLS) | @@ -479,10 +493,6 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) config_save_default(); window_invalidate(w); break; - case WIDX_THEMES_BUTTON: - window_themes_open(); - window_invalidate(w); - break; case WIDX_DAY_NIGHT_CHECKBOX: gConfigGeneral.day_night_cycle ^= 1; config_save_default(); @@ -517,7 +527,7 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) } break; - case WINDOW_OPTIONS_PAGE_CONTROLS: + case WINDOW_OPTIONS_PAGE_CONTROLS_AND_INTERFACE: switch (widgetIndex) { case WIDX_HOTKEY_DROPDOWN: window_shortcut_keys_open(); @@ -556,11 +566,10 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) config_save_default(); window_invalidate(w); break; - } - break; - - case WINDOW_OPTIONS_PAGE_MISC: - switch (widgetIndex) { + case WIDX_THEMES_BUTTON: + window_themes_open(); + window_invalidate(w); + break; case WIDX_SELECT_BY_TRACK_TYPE: gConfigInterface.select_by_track_type ^= 1; config_save_default(); @@ -568,6 +577,11 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) window_invalidate_by_class(WC_RIDE); window_invalidate_by_class(WC_CONSTRUCT_RIDE); break; + } + break; + + case WINDOW_OPTIONS_PAGE_MISC: + switch (widgetIndex) { case WIDX_DEBUGGING_TOOLS: gConfigGeneral.debugging_tools ^= 1; config_save_default(); @@ -695,34 +709,6 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* gDropdownItemsChecked = 1 << gConfigGeneral.construction_marker_colour; break; - case WIDX_THEMES_DROPDOWN: - num_items = gConfigThemes.num_presets; - - gDropdownItemsFormat[0] = 2777; - gDropdownItemsArgs[0] = (uint32)&gConfigThemes.presets[1].name; - gDropdownItemsFormat[1] = 2777; - gDropdownItemsArgs[1] = (uint32)&gConfigThemes.presets[0].name; - - for (i = 2; i < num_items; i++) { - gDropdownItemsFormat[i] = 2777; - gDropdownItemsArgs[i] = (uint32)&gConfigThemes.presets[i].name; - } - - window_dropdown_show_text_custom_width( - w->x + widget->left, - w->y + widget->top, - widget->bottom - widget->top + 1, - w->colours[1], - DROPDOWN_FLAG_STAY_OPEN, - num_items, - widget->right - widget->left - 3 - ); - - if (gCurrentTheme == 0 || gCurrentTheme == 1) - gDropdownItemsChecked = 1 << (gCurrentTheme ^ 1); - else - gDropdownItemsChecked = 1 << (gCurrentTheme); - break; } break; @@ -822,7 +808,37 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* } break; - case WINDOW_OPTIONS_PAGE_CONTROLS: + case WINDOW_OPTIONS_PAGE_CONTROLS_AND_INTERFACE: + switch (widgetIndex) { + case WIDX_THEMES_DROPDOWN: + num_items = gConfigThemes.num_presets; + + gDropdownItemsFormat[0] = 2777; + gDropdownItemsArgs[0] = (uint32)&gConfigThemes.presets[1].name; + gDropdownItemsFormat[1] = 2777; + gDropdownItemsArgs[1] = (uint32)&gConfigThemes.presets[0].name; + + for (i = 2; i < num_items; i++) { + gDropdownItemsFormat[i] = 2777; + gDropdownItemsArgs[i] = (uint32)&gConfigThemes.presets[i].name; + } + + window_dropdown_show_text_custom_width( + w->x + widget->left, + w->y + widget->top, + widget->bottom - widget->top + 1, + w->colours[1], + DROPDOWN_FLAG_STAY_OPEN, + num_items, + widget->right - widget->left - 3 + ); + + if (gCurrentTheme == 0 || gCurrentTheme == 1) + gDropdownItemsChecked = 1 << (gCurrentTheme ^ 1); + else + gDropdownItemsChecked = 1 << (gCurrentTheme); + break; + } break; case WINDOW_OPTIONS_PAGE_MISC: @@ -836,17 +852,6 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* gDropdownItemsChecked = 1 << gConfigGeneral.autosave_frequency; break; case WIDX_TITLE_SEQUENCE_DROPDOWN: - /* gDropdownItemsFormat[0] = 1142; - gDropdownItemsArgs[0] = STR_TITLE_SEQUENCE_RCT2; - gDropdownItemsFormat[1] = 1142; - gDropdownItemsArgs[1] = STR_TITLE_SEQUENCE_OPENRCT2; - window_options_show_dropdown(w, widget, 2); - if (gConfigGeneral.title_sequence == TITLE_SEQUENCE_RCT2) - gDropdownItemsChecked = 1 << 0; - else if (gConfigGeneral.title_sequence == TITLE_SEQUENCE_OPENRCT2) - gDropdownItemsChecked = 1 << 1; - break; - case WIDX_THEMES_DROPDOWN:*/ num_items = gConfigTitleSequences.num_presets; for (i = 0; i < num_items; i++) { @@ -917,14 +922,6 @@ static void window_options_dropdown(rct_window *w, int widgetIndex, int dropdown gfx_invalidate_screen(); } break; - case WIDX_THEMES_DROPDOWN: - if (dropdownIndex != -1) { - if (dropdownIndex == 0 || dropdownIndex == 1) - dropdownIndex ^= 1; - theme_change_preset(dropdownIndex); - } - config_save_default(); - break; } break; @@ -997,14 +994,6 @@ static void window_options_dropdown(rct_window *w, int widgetIndex, int dropdown config_save_default(); #endif } - /*#ifdef _MSC_VER - __asm movzx ax, dropdownIndex - #else - __asm__ ( "movzx ax, %[dropdownIndex] " : : [dropdownIndex] "g" ((char)dropdownIndex) ); - #endif - // the switch replaces ax value - RCT2_CALLPROC_EBPSAFE(0x006BA9B5); // part of init audio*/ - window_invalidate(w); break; case WIDX_TITLE_MUSIC_DROPDOWN: @@ -1024,7 +1013,17 @@ static void window_options_dropdown(rct_window *w, int widgetIndex, int dropdown } break; - case WINDOW_OPTIONS_PAGE_CONTROLS: + case WINDOW_OPTIONS_PAGE_CONTROLS_AND_INTERFACE: + switch (widgetIndex) { + case WIDX_THEMES_DROPDOWN: + if (dropdownIndex != -1) { + if (dropdownIndex == 0 || dropdownIndex == 1) + dropdownIndex ^= 1; + theme_change_preset(dropdownIndex); + } + config_save_default(); + break; + } break; case WINDOW_OPTIONS_PAGE_MISC: @@ -1108,9 +1107,6 @@ static void window_options_invalidate(rct_window *w) window_options_display_widgets[WIDX_HARDWARE_DISPLAY_CHECKBOX].type = WWT_CHECKBOX; window_options_display_widgets[WIDX_UNCAP_FPS_CHECKBOX].type = WWT_CHECKBOX; window_options_display_widgets[WIDX_MINIMIZE_FOCUS_LOSS].type = WWT_CHECKBOX; - window_options_display_widgets[WIDX_THEMES].type = WWT_DROPDOWN; - window_options_display_widgets[WIDX_THEMES_DROPDOWN].type = WWT_DROPDOWN_BUTTON; - window_options_display_widgets[WIDX_THEMES_BUTTON].type = WWT_DROPDOWN_BUTTON; window_options_display_widgets[WIDX_DAY_NIGHT_CHECKBOX].type = WWT_CHECKBOX; window_options_display_widgets[WIDX_UPPER_CASE_BANNERS_CHECKBOX].type = WWT_CHECKBOX; break; @@ -1180,20 +1176,25 @@ static void window_options_invalidate(rct_window *w) window_options_audio_widgets[WIDX_MUSIC_VOLUME].type = WWT_SCROLL; break; - case WINDOW_OPTIONS_PAGE_CONTROLS: + case WINDOW_OPTIONS_PAGE_CONTROLS_AND_INTERFACE: widget_set_checkbox_value(w, WIDX_SCREEN_EDGE_SCROLLING, gConfigGeneral.edge_scrolling); widget_set_checkbox_value(w, WIDX_INVERT_DRAG, gConfigGeneral.invert_viewport_drag); widget_set_checkbox_value(w, WIDX_TOOLBAR_SHOW_FINANCES, gConfigInterface.toolbar_show_finances); widget_set_checkbox_value(w, WIDX_TOOLBAR_SHOW_RESEARCH, gConfigInterface.toolbar_show_research); widget_set_checkbox_value(w, WIDX_TOOLBAR_SHOW_CHEATS, gConfigInterface.toolbar_show_cheats); widget_set_checkbox_value(w, WIDX_TOOLBAR_SHOW_NEWS, gConfigInterface.toolbar_show_news); + widget_set_checkbox_value(w, WIDX_SELECT_BY_TRACK_TYPE, gConfigInterface.select_by_track_type); - window_options_controls_widgets[WIDX_SCREEN_EDGE_SCROLLING].type = WWT_CHECKBOX; - window_options_controls_widgets[WIDX_HOTKEY_DROPDOWN].type = WWT_DROPDOWN_BUTTON; - window_options_controls_widgets[WIDX_TOOLBAR_SHOW_FINANCES].type = WWT_CHECKBOX; - window_options_controls_widgets[WIDX_TOOLBAR_SHOW_RESEARCH].type = WWT_CHECKBOX; - window_options_controls_widgets[WIDX_TOOLBAR_SHOW_CHEATS].type = WWT_CHECKBOX; - window_options_controls_widgets[WIDX_TOOLBAR_SHOW_NEWS].type = WWT_CHECKBOX; + window_options_controls_and_interface_widgets[WIDX_THEMES].type = WWT_DROPDOWN; + window_options_controls_and_interface_widgets[WIDX_THEMES_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_options_controls_and_interface_widgets[WIDX_THEMES_BUTTON].type = WWT_DROPDOWN_BUTTON; + window_options_controls_and_interface_widgets[WIDX_SCREEN_EDGE_SCROLLING].type = WWT_CHECKBOX; + window_options_controls_and_interface_widgets[WIDX_HOTKEY_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_options_controls_and_interface_widgets[WIDX_TOOLBAR_SHOW_FINANCES].type = WWT_CHECKBOX; + window_options_controls_and_interface_widgets[WIDX_TOOLBAR_SHOW_RESEARCH].type = WWT_CHECKBOX; + window_options_controls_and_interface_widgets[WIDX_TOOLBAR_SHOW_CHEATS].type = WWT_CHECKBOX; + window_options_controls_and_interface_widgets[WIDX_TOOLBAR_SHOW_NEWS].type = WWT_CHECKBOX; + window_options_controls_and_interface_widgets[WIDX_SELECT_BY_TRACK_TYPE].type = WWT_CHECKBOX; break; case WINDOW_OPTIONS_PAGE_MISC: @@ -1207,7 +1208,6 @@ static void window_options_invalidate(rct_window *w) else window_options_misc_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_CHECKBOX; - widget_set_checkbox_value(w, WIDX_SELECT_BY_TRACK_TYPE, gConfigInterface.select_by_track_type); widget_set_checkbox_value(w, WIDX_REAL_NAME_CHECKBOX, RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SHOW_REAL_GUEST_NAMES); widget_set_checkbox_value(w, WIDX_SAVE_PLUGIN_DATA_CHECKBOX, gConfigGeneral.save_plugin_data); widget_set_checkbox_value(w, WIDX_TEST_UNFINISHED_TRACKS, gConfigGeneral.test_unfinished_tracks); @@ -1218,7 +1218,6 @@ static void window_options_invalidate(rct_window *w) window_options_misc_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_CHECKBOX; window_options_misc_widgets[WIDX_AUTOSAVE].type = WWT_DROPDOWN; window_options_misc_widgets[WIDX_AUTOSAVE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; - window_options_misc_widgets[WIDX_SELECT_BY_TRACK_TYPE].type = WWT_CHECKBOX; window_options_misc_widgets[WIDX_TEST_UNFINISHED_TRACKS].type = WWT_CHECKBOX; window_options_misc_widgets[WIDX_AUTO_STAFF_PLACEMENT].type = WWT_CHECKBOX; window_options_misc_widgets[WIDX_DEBUGGING_TOOLS].type = WWT_CHECKBOX; @@ -1283,18 +1282,6 @@ static void window_options_paint(rct_window *w, rct_drawpixelinfo *dpi) gfx_draw_string_left(dpi, STR_DISPLAY_RESOLUTION, w, w->colours[1], w->x + 10, w->y + window_options_display_widgets[WIDX_RESOLUTION].top + 1); gfx_draw_string_left(dpi, STR_FULLSCREEN_MODE, w, w->colours[1], w->x + 10, w->y + window_options_display_widgets[WIDX_FULLSCREEN].top + 1); gfx_draw_string_left(dpi, STR_CONSTRUCTION_MARKER, w, w->colours[1], w->x + 10, w->y + window_options_display_widgets[WIDX_CONSTRUCTION_MARKER].top + 1); - - RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&gConfigThemes.presets[gCurrentTheme].name; - gfx_draw_string_left(dpi, 5238, NULL, w->colours[1], w->x + 10, w->y + window_options_display_widgets[WIDX_THEMES].top + 1); - gfx_draw_string_left_clipped( - dpi, - 1170, - (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, - w->colours[1], - w->x + window_options_display_widgets[WIDX_THEMES].left + 1, - w->y + window_options_display_widgets[WIDX_THEMES].top, - window_options_display_widgets[WIDX_THEMES_DROPDOWN].left - window_options_display_widgets[WIDX_THEMES].left - 4 - ); break; case WINDOW_OPTIONS_PAGE_CULTURE: gfx_draw_string_left(dpi, 2776, w, w->colours[1], w->x + 10, w->y + window_options_culture_widgets[WIDX_LANGUAGE].top + 1); @@ -1333,6 +1320,20 @@ static void window_options_paint(rct_window *w, rct_drawpixelinfo *dpi) w->y + window_options_audio_widgets[WIDX_TITLE_MUSIC].top ); break; + case WINDOW_OPTIONS_PAGE_CONTROLS_AND_INTERFACE: + gfx_draw_string_left(dpi, STR_SHOW_TOOLBAR_BUTTONS_FOR, w, w->colours[1], w->x + 10, w->y + window_options_controls_and_interface_widgets[WIDX_TOOLBAR_BUTTONS_GROUP].top + 15); + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&gConfigThemes.presets[gCurrentTheme].name; + gfx_draw_string_left(dpi, 5238, NULL, w->colours[1], w->x + 10, w->y + window_options_controls_and_interface_widgets[WIDX_THEMES].top + 1); + gfx_draw_string_left_clipped( + dpi, + 1170, + (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, + w->colours[1], + w->x + window_options_controls_and_interface_widgets[WIDX_THEMES].left + 1, + w->y + window_options_controls_and_interface_widgets[WIDX_THEMES].top, + window_options_controls_and_interface_widgets[WIDX_THEMES_DROPDOWN].left - window_options_controls_and_interface_widgets[WIDX_THEMES].left - 4 + ); + break; case WINDOW_OPTIONS_PAGE_MISC: gfx_draw_string_left(dpi, 2700, w, w->colours[1], w->x + 10, w->y + window_options_misc_widgets[WIDX_AUTOSAVE].top + 1); gfx_draw_string_left( @@ -1445,7 +1446,7 @@ static void window_options_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w window_options_draw_tab_image(dpi, w, WINDOW_OPTIONS_PAGE_DISPLAY, 5442); window_options_draw_tab_image(dpi, w, WINDOW_OPTIONS_PAGE_CULTURE, 5229); window_options_draw_tab_image(dpi, w, WINDOW_OPTIONS_PAGE_AUDIO, 5335); - window_options_draw_tab_image(dpi, w, WINDOW_OPTIONS_PAGE_CONTROLS, 5201); + window_options_draw_tab_image(dpi, w, WINDOW_OPTIONS_PAGE_CONTROLS_AND_INTERFACE, 5201); window_options_draw_tab_image(dpi, w, WINDOW_OPTIONS_PAGE_MISC, 5205); window_options_draw_tab_image(dpi, w, WINDOW_OPTIONS_PAGE_TWITCH, SPR_G2_TAB_TWITCH); } From 19d2bbf919f5190858275904fa53ee8e02467fb6 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 26 Jul 2015 15:14:38 +0200 Subject: [PATCH 0369/1173] Disable tutorial button --- src/windows/title_menu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/windows/title_menu.c b/src/windows/title_menu.c index 0b2c289138..9ef748705d 100644 --- a/src/windows/title_menu.c +++ b/src/windows/title_menu.c @@ -99,7 +99,8 @@ void window_title_menu_open() WF_STICK_TO_BACK | WF_TRANSPARENT ); window->widgets = window_title_menu_widgets; - window->enabled_widgets |= (8 | 4 | 2 | 1); + window->enabled_widgets |= (8 | 2 | 1); + window->disabled_widgets |= (4); // Disable tutorial button window_init_scroll_widgets(window); } From ce7a0ac27b4b87cfb9538f515f658dca38ff8eeb Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 26 Jul 2015 16:07:58 +0200 Subject: [PATCH 0370/1173] Remove Infogrames disclaimer from intro and fix config option --- data/language/english_uk.txt | 4 ++-- src/intro.c | 23 ++--------------------- src/localisation/string_ids.h | 3 --- src/openrct2.c | 7 +++++-- 4 files changed, 9 insertions(+), 28 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 21d6989d8c..71d6f8a96e 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2976,8 +2976,8 @@ STR_2965 :{WINDOW_COLOUR_2} STR_2966 : STR_2967 : STR_2968 : -STR_2969 :Use of this product is subject to the terms of a licence agreement -STR_2970 :found in the product's {OPENQUOTES}ReadMe{ENDQUOTES} file and in the manual +STR_2969 : +STR_2970 : STR_2971 :Main colour scheme STR_2972 :Alternative colour scheme 1 STR_2973 :Alternative colour scheme 2 diff --git a/src/intro.c b/src/intro.c index c4ddd3b2b9..0757c467ff 100644 --- a/src/intro.c +++ b/src/intro.c @@ -47,29 +47,10 @@ void intro_update() RCT2_GLOBAL(0x009E2C78, int) = 1; switch ((*part)) { + // Cases 8 and 9 were used for the disclaimer text. There might be some residual occurences. case 8: - // Clear the screen - gfx_clear(screenDPI, 10); - - // Draw the disclaimer text - gfx_draw_string_centred(screenDPI, STR_LICENCE_AGREEMENT_NOTICE_1, screenWidth / 2, 180, 13, 0); - gfx_draw_string_centred(screenDPI, STR_LICENCE_AGREEMENT_NOTICE_2, screenWidth / 2, 195, 13, 0); - - // Set palette thing - gfx_transpose_palette(1532, 255); - - // Reset wait counter - _tick_counter = 0; - - // Move to next part - (*part)++; - break; case 9: - // Wait 320 game ticks, then move to part 1 - _tick_counter++; - if (_tick_counter >= 320) - (*part) = 1; - break; + (*part) = 1; case 1: // Clear the screen gfx_clear(screenDPI, 10); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index adfffa116c..808c45cad3 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1372,9 +1372,6 @@ enum { STR_CHANGE_SIGN_TEXT_TIP = 2994, STR_DEMOLISH_SIGN_TIP = 2995, - STR_LICENCE_AGREEMENT_NOTICE_1 = 2969, - STR_LICENCE_AGREEMENT_NOTICE_2 = 2970, - STR_COLOUR_SCHEME_TO_CHANGE_TIP = 2975, STR_PAINT_INDIVIDUAL_AREA_TIP = 2976, diff --git a/src/openrct2.c b/src/openrct2.c index 3ac3b6eb3d..8177e3e830 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -222,9 +222,12 @@ void openrct2_launch() { if (openrct2_initialise()) { RCT2_GLOBAL(RCT2_ADDRESS_RUN_INTRO_TICK_PART, uint8) = 0; + if((gOpenRCT2StartupAction == STARTUP_ACTION_TITLE) && gConfigGeneral.play_intro) + gOpenRCT2StartupAction = STARTUP_ACTION_INTRO; + switch (gOpenRCT2StartupAction) { case STARTUP_ACTION_INTRO: - RCT2_GLOBAL(RCT2_ADDRESS_RUN_INTRO_TICK_PART, uint8) = 8; + RCT2_GLOBAL(RCT2_ADDRESS_RUN_INTRO_TICK_PART, uint8) = 1; break; case STARTUP_ACTION_TITLE: RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_TITLE_DEMO; @@ -386,4 +389,4 @@ void openrct2_reset_object_tween_locations() _spritelocations1[i].y = _spritelocations2[i].y = g_sprite_list[i].unknown.y; _spritelocations1[i].z = _spritelocations2[i].z = g_sprite_list[i].unknown.z; } -} \ No newline at end of file +} From 06f2adb9d6fbd75fe6a2ff6924bb4adb679a5c6e Mon Sep 17 00:00:00 2001 From: Matt Layher Date: Sun, 26 Jul 2015 18:34:51 +0200 Subject: [PATCH 0371/1173] Properly merge #1672: incorrect plural form for last inspection time, fixes #1513, closes #1672 --- data/language/english_uk.txt | 1 + src/localisation/string_ids.h | 2 ++ src/windows/ride.c | 12 +++++++++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index ca09abc8b8..26ba6780d5 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3817,3 +3817,4 @@ STR_5478 :Controls STR_5479 :Toolbar STR_5480 :Show toolbar buttons for: STR_5481 :Themes +STR_5482 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}1 minute diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index d3a0ad9267..dd2673e084 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1834,6 +1834,8 @@ enum { STR_SHOW_TOOLBAR_BUTTONS_FOR = 5480, STR_THEMES_GROUP = 5481, + STR_TIME_SINCE_LAST_INSPECTION_MINUTE = 5482, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/ride.c b/src/windows/ride.c index 0620dd2c4b..a39bd33402 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -3584,9 +3584,15 @@ static void window_ride_maintenance_paint(rct_window *w, rct_drawpixelinfo *dpi) // Last inspection lastInspection = ride->last_inspection; - stringId = lastInspection <= 240 ? - STR_TIME_SINCE_LAST_INSPECTION_MINUTES : - STR_TIME_SINCE_LAST_INSPECTION_MORE_THAN_4_HOURS; + + // Use singular form for 1 minute of time or less + if (lastInspection <= 1) + stringId = STR_TIME_SINCE_LAST_INSPECTION_MINUTE; + else if (lastInspection <= 240) + stringId = STR_TIME_SINCE_LAST_INSPECTION_MINUTES; + else + stringId = STR_TIME_SINCE_LAST_INSPECTION_MORE_THAN_4_HOURS; + gfx_draw_string_left(dpi, stringId, &lastInspection, 0, x, y); y += 12; From 777065e6a6a20183ea3da7c0474ad2ca7d22ec6f Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 26 Jul 2015 12:14:14 +0200 Subject: [PATCH 0372/1173] Allow running marketing campaigns for up to 12 weeks --- data/language/english_uk.txt | 11 ++++++----- src/localisation/string_ids.h | 8 +++----- src/windows/new_campaign.c | 6 ++++-- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 26ba6780d5..247485e245 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2441,11 +2441,11 @@ STR_2433 :{BLACK}Vouchers for free {STRINGID} STR_2434 :{BLACK}Advertising campaign for {STRINGID} STR_2435 :{BLACK}Advertising campaign for {STRINGID} STR_2436 :1 week -STR_2437 :2 weeks -STR_2438 :3 weeks -STR_2439 :4 weeks -STR_2440 :5 weeks -STR_2441 :6 weeks +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : STR_2442 :{BLACK}({STRINGID} remaining) STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} @@ -3811,6 +3811,7 @@ STR_5471 :Scroll map down STR_5472 :Scroll map right STR_5473 :Cycle day / night STR_5474 :Display text on banners in upper case +STR_5475 :{COMMA16} weeks STR_5476 :Hardware STR_5477 :Map rendering STR_5478 :Controls diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index dd2673e084..795fb67de8 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1096,11 +1096,6 @@ enum { STR_ADVERTISING_CAMPAIGN_FOR_2 = 2435, STR_MARKETING_1_WEEK = 2436, - STR_MARKETING_2_WEEKS = 2437, - STR_MARKETING_3_WEEKS = 2438, - STR_MARKETING_4_WEEKS = 2439, - STR_MARKETING_5_WEEKS = 2440, - STR_MARKETING_6_WEEKS = 2441, STR_MARKETING_WEEKS_REMAINING = 2442, STR_MARKETING_COST_PER_WEEK = 2443, STR_MARKETING_TOTAL_COST = 2444, @@ -1827,6 +1822,9 @@ enum { STR_CYCLE_DAY_NIGHT = 5473, STR_UPPER_CASE_BANNERS = 5474, + + STR_X_WEEKS = 5475, + STR_HARDWARE_GROUP = 5476, STR_RENDERING_GROUP = 5477, STR_CONTROLS_GROUP = 5478, diff --git a/src/windows/new_campaign.c b/src/windows/new_campaign.c index edf39c2c48..7e2877bc4e 100644 --- a/src/windows/new_campaign.c +++ b/src/windows/new_campaign.c @@ -294,8 +294,9 @@ static void window_new_campaign_mousedown(int widgetIndex, rct_window *w, rct_wi ); } break; + // In RCT2, the maximum was 6 weeks case WIDX_WEEKS_INCREASE_BUTTON: - w->campaign.no_weeks = min(w->campaign.no_weeks + 1, 6); + w->campaign.no_weeks = min(w->campaign.no_weeks + 1, 12); window_invalidate(w); break; case WIDX_WEEKS_DECREASE_BUTTON: @@ -366,7 +367,8 @@ static void window_new_campaign_invalidate(rct_window *w) } // Set current number of weeks spinner - window_new_campaign_widgets[WIDX_WEEKS_SPINNER].image = (STR_MARKETING_1_WEEK - 1) + w->campaign.no_weeks; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = w->campaign.no_weeks; + window_new_campaign_widgets[WIDX_WEEKS_SPINNER].image = w->campaign.no_weeks == 1 ? STR_MARKETING_1_WEEK : STR_X_WEEKS; // Enable / disable start button based on ride dropdown w->disabled_widgets &= ~(1 << WIDX_START_BUTTON); From 0ef96270584dca36b77c3643d919fa8779b38204 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 27 Jul 2015 04:00:15 +0100 Subject: [PATCH 0373/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 1014 +++++++++++++------------ data/language/dutch.txt | 17 +- data/language/english_us.txt | 77 +- data/language/french.txt | 671 ++++++++++------ data/language/german.txt | 33 +- 5 files changed, 1031 insertions(+), 781 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 0466ea524a..da721516dd 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -5,26 +5,26 @@ STR_0000 : STR_0001 :{STRINGID} {COMMA16} STR_0002 :Spiral Roller Coaster STR_0003 :站立式雲霄飛車 -STR_0004 :Suspended Swinging Coaster +STR_0004 :懸吊式雲霄飛車 STR_0005 :Inverted Roller Coaster -STR_0006 :Junior Roller Coaster +STR_0006 :兒童雲霄飛車 STR_0007 :小火車 STR_0008 :單軌電車 -STR_0009 :Mini Suspended Coaster +STR_0009 :迷你懸吊式雲霄飛車 STR_0010 :小船出租 STR_0011 :Wooden Wild Mouse -STR_0012 :Steeplechase +STR_0012 :越野賽馬式雲霄飛車 STR_0013 :Car Ride STR_0014 :自由落體 STR_0015 :Bobsleigh Coaster STR_0016 :觀景塔 STR_0017 :Looping Roller Coaster STR_0018 :滑水道 -STR_0019 :Mine Train Coaster +STR_0019 :採礦列車雲霄飛車 STR_0020 :纜車 STR_0021 :Corkscrew Roller Coaster STR_0022 :迷宮 -STR_0023 :Spiral Slide +STR_0023 :螺旋滑道 STR_0024 :小型賽車 STR_0025 :運木水道 STR_0026 :激流船 @@ -41,24 +41,24 @@ STR_0036 :Unknown Stall (22) STR_0037 :訪客資訊中心 STR_0038 :廁所 STR_0039 :摩天輪 -STR_0040 :Motion Simulator +STR_0040 :動感模擬器 STR_0041 :3D戲院 STR_0042 :Top Spin -STR_0043 :Space Rings -STR_0044 :Reverse Freefall Coaster +STR_0043 :太空飛輪 +STR_0044 :向後自由落體式雲霄飛車 STR_0045 :升降機 -STR_0046 :Vertical Drop Roller Coaster +STR_0046 :垂直雲霄飛車 STR_0047 :提款機 -STR_0048 :Twist +STR_0048 :龍捲風 STR_0049 :鬼屋 STR_0050 :急救室 STR_0051 :馬戲團 STR_0052 :Ghost Train -STR_0053 :Steel Twister Roller Coaster +STR_0053 :鐵架旋轉式雲霄飛車 STR_0054 :木製雲霄飛車 STR_0055 :Side-Friction Roller Coaster STR_0056 :Wild Mouse -STR_0057 :Multi-Dimension Roller Coaster +STR_0057 :多維度雲霄飛車 STR_0058 :Unknown Ride (38) STR_0059 :Flying Roller Coaster STR_0060 :Unknown Ride (3A) @@ -74,7 +74,7 @@ STR_0069 :迷你高爾夫 STR_0070 :Giga Coaster STR_0071 :Roto-Drop STR_0072 :Flying Saucers -STR_0073 :Crooked House +STR_0073 :古怪屋 STR_0074 :Monorail Cycles STR_0075 :Compact Inverted Coaster STR_0076 :Water Coaster @@ -93,7 +93,7 @@ STR_0088 :Inverted Impulse Coaster STR_0089 :迷你雲霄飛車 STR_0090 :Mine Ride STR_0091 :Unknown Ride (59) -STR_0092 :LIM Launched Roller Coaster +STR_0092 :直線電動機發車雲霄飛車 STR_0093 : STR_0094 : STR_0095 : @@ -842,6 +842,7 @@ STR_0837 :Unable to initialise graphics system STR_0838 :CD key code {INT32} is not valid for your RollerCoaster Tycoon 2 CD !{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Please un-install RollerCoaster Tycoon 2% and re-install with the correct CD Key Code STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} +# The follwing six strings were used for display resolutions, but have been replaced. STR_0841 :Desktop window STR_0842 :640x480 全螢幕 STR_0843 :800x600 全螢幕 @@ -956,7 +957,7 @@ STR_0951 :離開遊戲 STR_0952 :離開遊戲 STR_0953 :載入地型 STR_0954 : -STR_0955 :{SMALLFONT}{BLACK}Select seat rotation angle for this track section +STR_0955 :{SMALLFONT}{BLACK}選擇此軌道的座位旋轉角度 STR_0956 :-180{DEGREE} STR_0957 :-135{DEGREE} STR_0958 :-90{DEGREE} @@ -1064,15 +1065,15 @@ STR_1059 :不能重命名遊樂設施/店鋪... STR_1060 :不適合的遊樂設施/店鋪名稱 STR_1061 :正常模式 STR_1062 :連續巡迴模式 -STR_1063 :Reverse-Incline launched shuttle 模式 -STR_1064 :Powered launch (passing station) +STR_1063 :反向發車巡迴模式 +STR_1064 :動力發車 (穿過車站) STR_1065 :穿梭模式 STR_1066 :出租小船模式 STR_1067 :Upward launch -STR_1068 :Rotating lift 模式 -STR_1069 :Station to station 模式 -STR_1070 :Single ride per admission -STR_1071 :Unlimited rides per admission +STR_1068 :旋轉升降模式 +STR_1069 :站對站模式 +STR_1070 :一次付費單次溜滑梯 +STR_1071 :一次付費無限次溜滑梯 STR_1072 :迷宮模式 STR_1073 :賽車模式 STR_1074 :碰碰車模式 @@ -1083,7 +1084,7 @@ STR_1078 :向前旋轉 STR_1079 :向後旋轉 STR_1080 :電影: {ENDQUOTES}Avenging aviators{ENDQUOTES} STR_1081 :3D電影: {ENDQUOTES}Mouse tails{ENDQUOTES} -STR_1082 :Space rings 模式 +STR_1082 :太空飛輪模式 STR_1083 :Beginners 模式 STR_1084 :LIM-powered launch STR_1085 :電影: {ENDQUOTES}Thrill riders{ENDQUOTES} @@ -1097,38 +1098,38 @@ STR_1092 :Downward launch STR_1093 :Crooked house 模式 STR_1094 :Freefall drop 模式 STR_1095 :Continuous circuit block sectioned mode -STR_1096 :Powered launch (without passing station) +STR_1096 :動力發車 (不穿過車站) STR_1097 :Powered launch block sectioned mode STR_1098 :移動到{POP16}{STRINGID}的最尾中 STR_1099 :在{POP16}{STRINGID}等待乘客中 STR_1100 :等待離開{POP16}{STRINGID}中 STR_1101 :離開{POP16}{STRINGID} -STR_1102 :以{VELOCITY}行走 +STR_1102 :以{VELOCITY}行走中 STR_1103 :到達{POP16}{STRINGID} STR_1104 :在{POP16}{STRINGID}卸去乘客中 -STR_1105 :以{VELOCITY}行走 +STR_1105 :以{VELOCITY}行走中 STR_1106 :毀壞中! STR_1107 :毀壞了! -STR_1108 :以{VELOCITY}行走 -STR_1109 :Swinging -STR_1110 :Rotating -STR_1111 :Rotating -STR_1112 :Operating -STR_1113 :Showing film -STR_1114 :Rotating -STR_1115 :Operating -STR_1116 :Operating +STR_1108 :以{VELOCITY}行走中 +STR_1109 :擺動中 +STR_1110 :旋轉中 +STR_1111 :旋轉中 +STR_1112 :運作中 +STR_1113 :放映中 +STR_1114 :旋轉中 +STR_1115 :運作中 +STR_1116 :運作中 STR_1117 :馬戲團表演中 -STR_1118 :Operating -STR_1119 :Waiting for cable lift -STR_1120 :Travelling at {VELOCITY} -STR_1121 :Stopping +STR_1118 :運作中 +STR_1119 :等候纜索拉上坡中 +STR_1120 :以{VELOCITY}行走中 +STR_1121 :停止中 STR_1122 :等待乘客中 -STR_1123 :Waiting to start -STR_1124 :Starting -STR_1125 :Operating -STR_1126 :Stopping -STR_1127 :Unloading passengers +STR_1123 :等待開始中 +STR_1124 :開始中 +STR_1125 :運作中 +STR_1126 :停止中 +STR_1127 :卸客中 STR_1128 :Stopped by block brakes STR_1129 :All vehicles in same colours STR_1130 :Different colours per {STRINGID} @@ -1159,18 +1160,18 @@ STR_1154 :在土地上標記高度 STR_1155 :在道路上標記高度 STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} -STR_1158 :Can't remove this... +STR_1158 :不能移除... STR_1159 :{SMALLFONT}{BLACK}Place scenery, gardens, and other accessories STR_1160 :{SMALLFONT}{BLACK}Create/adjust lakes & water -STR_1161 :Can't position this here... +STR_1161 :不能放置於此... STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} -STR_1163 :{STRINGID}{NEWLINE}(Right-Click to Modify) -STR_1164 :{STRINGID}{NEWLINE}(Right-Click to Remove) +STR_1163 :{STRINGID}{NEWLINE}(按右鍵修改) +STR_1164 :{STRINGID}{NEWLINE}(按右鍵移除) STR_1165 :{STRINGID} - {STRINGID} {COMMA16} -STR_1166 :Can't lower water level here... -STR_1167 :Can't raise water level here... -STR_1168 :Options -STR_1169 :(None) +STR_1166 :不能在此降低水位... +STR_1167 :不能在此升高水位... +STR_1168 :選項 +STR_1169 :(無) STR_1170 :{STRING} STR_1171 :{RED}Closed - - STR_1172 :{YELLOW}{STRINGID} - - @@ -1180,7 +1181,7 @@ STR_1175 :Can't build this on sloped footpath STR_1176 :Can't build footpath here... STR_1177 :Can't remove footpath from here... STR_1178 :Land slope unsuitable -STR_1179 :Footpath in the way +STR_1179 :道路擋在路中 STR_1180 :不能建造此於水底! STR_1181 :道路 STR_1182 :類別 @@ -1205,23 +1206,23 @@ STR_1200 :{COMMA16} 個遊客在這個遊樂設施上 STR_1201 :無人在排隊 STR_1202 :1個遊客在排隊 STR_1203 :{COMMA16}個遊客在排隊 -STR_1204 :{COMMA16} minute queue time -STR_1205 :{COMMA16} minutes queue time +STR_1204 :{COMMA16}分鐘的輪候時間 +STR_1205 :{COMMA16}分鐘的輪候時間 STR_1206 :{WINDOW_COLOUR_2}Wait for: STR_1207 :{WINDOW_COLOUR_2}Leave if another train arrives at station STR_1208 :{WINDOW_COLOUR_2}Leave if another boat arrives at station STR_1209 :{SMALLFONT}{BLACK}Select whether should wait for passengers before departing STR_1210 :{SMALLFONT}{BLACK}Select whether should leave if another vehicle arrives at the same station -STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time: -STR_1212 :{WINDOW_COLOUR_2}Maximum waiting time: +STR_1211 :{WINDOW_COLOUR_2}最短等待時間: +STR_1212 :{WINDOW_COLOUR_2}最長等待時間: STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing -STR_1215 :{WINDOW_COLOUR_2}Synchronise with adjacent stations +STR_1215 :{WINDOW_COLOUR_2}與鄰近車站同步發車 STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronise departure with all adjacent stations (for 'racing') STR_1217 :{COMMA16} seconds STR_1218 :{BLACK}{SMALLUP} STR_1219 :{BLACK}{SMALLDOWN} -STR_1220 :只准落客 +STR_1220 :只准卸客 STR_1221 :No entrance STR_1222 :No exit STR_1223 :{SMALLFONT}{BLACK}運輸類遊樂設施 @@ -1244,12 +1245,12 @@ STR_1239 :小船 STR_1240 :{COMMA16}小船 STR_1241 :{COMMA16}小船 STR_1242 :小船{COMMA16} -STR_1243 :track -STR_1244 :tracks -STR_1245 :Track -STR_1246 :Tracks -STR_1247 :{COMMA16} track -STR_1248 :{COMMA16} tracks +STR_1243 :軌道 +STR_1244 :軌道 +STR_1245 :軌道 +STR_1246 :軌道 +STR_1247 :{COMMA16}軌道 +STR_1248 :{COMMA16}軌道 STR_1249 :Track {COMMA16} STR_1250 :船用月台 STR_1251 :船用月台 @@ -1272,13 +1273,13 @@ STR_1267 :車輛 STR_1268 :{COMMA16}車輛 STR_1269 :{COMMA16}車輛 STR_1270 :車輛{COMMA16} -STR_1271 :building -STR_1272 :buildings -STR_1273 :Building -STR_1274 :Buildings -STR_1275 :{COMMA16} building -STR_1276 :{COMMA16} buildings -STR_1277 :Building {COMMA16} +STR_1271 :建築物 +STR_1272 :建築物 +STR_1273 :建築物 +STR_1274 :建築物 +STR_1275 :{COMMA16}建築物 +STR_1276 :{COMMA16}建築物 +STR_1277 :建築物{COMMA16} STR_1278 :structure STR_1279 :structures STR_1280 :Structure @@ -1307,20 +1308,20 @@ STR_1302 :Wheels STR_1303 :{COMMA16} wheel STR_1304 :{COMMA16} wheels STR_1305 :Wheel {COMMA16} -STR_1306 :ring -STR_1307 :rings -STR_1308 :Ring -STR_1309 :Rings -STR_1310 :{COMMA16} ring -STR_1311 :{COMMA16} rings -STR_1312 :Ring {COMMA16} -STR_1313 :player -STR_1314 :players -STR_1315 :Player -STR_1316 :Players -STR_1317 :{COMMA16} player -STR_1318 :{COMMA16} players -STR_1319 :Player {COMMA16} +STR_1306 :飛輪 +STR_1307 :飛輪 +STR_1308 :飛輪 +STR_1309 :飛輪 +STR_1310 :{COMMA16}個飛輪 +STR_1311 :{COMMA16}個飛輪 +STR_1312 :飛輪{COMMA16} +STR_1313 :玩家 +STR_1314 :玩家 +STR_1315 :玩家 +STR_1316 :玩家 +STR_1317 :{COMMA16}玩家 +STR_1318 :{COMMA16}玩家 +STR_1319 :玩家{COMMA16} STR_1320 :course STR_1321 :courses STR_1322 :Course @@ -1329,9 +1330,9 @@ STR_1324 :{COMMA16} course STR_1325 :{COMMA16} courses STR_1326 :Course {COMMA16} STR_1327 :{SMALLFONT}{BLACK}將物件旋轉90{DEGREE} -STR_1328 :Level land required -STR_1329 :{WINDOW_COLOUR_2}Launch speed: -STR_1330 :{SMALLFONT}{BLACK}Maximum speed when leaving station +STR_1328 :需要升高或降低土地 +STR_1329 :{WINDOW_COLOUR_2}發車速度: +STR_1330 :{SMALLFONT}{BLACK}離開車站時的最高速度 STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} STR_1332 :{VELOCITY} STR_1333 :{STRINGID} - {STRINGID}{POP16} @@ -1360,8 +1361,8 @@ STR_1355 :{WINDOW_COLOUR_2}Drops: {BLACK}{COMMA16} STR_1356 :{WINDOW_COLOUR_2}Inversions: {BLACK}{COMMA16} STR_1357 :{WINDOW_COLOUR_2}Holes: {BLACK}{COMMA16} STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs -STR_1359 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minute -STR_1360 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minutes +STR_1359 :{WINDOW_COLOUR_2}輪候時間: {BLACK}{COMMA16}分鐘 +STR_1360 :{WINDOW_COLOUR_2}輪候時間: {BLACK}{COMMA16}分鐘 STR_1361 :不能改變速度... STR_1362 :不能改變發車速度... STR_1363 :Too high for supports! @@ -1376,8 +1377,8 @@ STR_1371 :橫滾軌道 (向右) STR_1372 :加速式的鏈條坡道 STR_1373 :巨型的二分之一迴環 (向左) STR_1374 :巨型的二分之一迴環 (向右) -STR_1375 :Upper Transfer -STR_1376 :Lower Transfer +STR_1375 :向上的傳輸裝置 +STR_1376 :向下的蝕輸裝置 STR_1377 :橫滾軌道 (向左) STR_1378 :橫滾軌道 (向右) STR_1379 :逆向裝置 (向左) @@ -1403,14 +1404,14 @@ STR_1398 :{SMALLFONT}{BLACK}Measurements and test data STR_1399 :{SMALLFONT}{BLACK}Graphs STR_1400 :入口 STR_1401 :出口 -STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction -STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction +STR_1402 :{SMALLFONT}{BLACK}建造或移動遊樂設施的入口 +STR_1403 :{SMALLFONT}{BLACK}建造或移動遊樂設施的出口 STR_1404 :{SMALLFONT}{BLACK}90{DEGREE}旋轉 STR_1405 :{SMALLFONT}{BLACK}Mirror image STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) STR_1407 :{WINDOW_COLOUR_2}建造此軌道... STR_1408 :{WINDOW_COLOUR_2}費用: {BLACK}{CURRENCY} -STR_1409 :Entry/Exit Platform +STR_1409 :入口/出口平台 STR_1410 :Vertical Tower STR_1411 :{STRINGID}擋在路中 STR_1412 :{WINDOW_COLOUR_3}Data logging not available for this type of ride @@ -1423,33 +1424,33 @@ STR_1418 :{WINDOW_COLOUR_2}Lat.G's STR_1419 :{SMALLFONT}{BLACK}{VELOCITY} STR_1420 :{SMALLFONT}{BLACK}{LENGTH} STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g -STR_1422 :{SMALLFONT}{BLACK}Logging data from {POP16}{STRINGID} -STR_1423 :{SMALLFONT}{BLACK}Queue line path -STR_1424 :{SMALLFONT}{BLACK}Footpath +STR_1422 :{SMALLFONT}{BLACK}從{POP16}{STRINGID}記錄資料中 +STR_1423 :{SMALLFONT}{BLACK}輪侯區道路 +STR_1424 :{SMALLFONT}{BLACK}道路 STR_1425 :道路 -STR_1426 :Queue Line -STR_1427 :{WINDOW_COLOUR_2}Customers: {BLACK}{COMMA32} per hour -STR_1428 :{WINDOW_COLOUR_2}Admission price: +STR_1426 :輪侯區 +STR_1427 :{WINDOW_COLOUR_2}乘客: {BLACK}每小時{COMMA32}個 +STR_1428 :{WINDOW_COLOUR_2}門票價格: STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} STR_1430 :免費 STR_1431 :行走中 STR_1432 :前往{STRINGID}中 STR_1433 :輪候{STRINGID}中 STR_1434 :溺水中 -STR_1435 :On {STRINGID} -STR_1436 :In {STRINGID} -STR_1437 :At {STRINGID} -STR_1438 :Sitting -STR_1439 :(select location) +STR_1435 :在{STRINGID}上 +STR_1436 :在{STRINGID}中 +STR_1437 :在{STRINGID}中 +STR_1438 :坐下中 +STR_1439 :(請選擇位置) STR_1440 :Mowing grass -STR_1441 :Sweeping footpath -STR_1442 :Emptying litter bin -STR_1443 :Watering gardens -STR_1444 :Watching {STRINGID} -STR_1445 :Watching construction of {STRINGID} -STR_1446 :Looking at scenery -STR_1447 :Leaving the park -STR_1448 :Watching new ride being constructed +STR_1441 :清掃道路中 +STR_1442 :清空垃圾筒中 +STR_1443 :灌溉花圃中 +STR_1444 :觀看{STRINGID}中 +STR_1445 :觀看{STRINGID}的建造中 +STR_1446 :觀看景物中 +STR_1447 :離開樂園中 +STR_1448 :觀看新遊樂設施的建造過程中 STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) @@ -1460,7 +1461,7 @@ STR_1455 :不適合的遊客姓名 STR_1456 :{WINDOW_COLOUR_2}已花費的現金: {BLACK}{CURRENCY2DP} STR_1457 :{WINDOW_COLOUR_2}在銀包中的現金: {BLACK}{CURRENCY2DP} STR_1458 :{WINDOW_COLOUR_2}已逗留在樂園的時間: {BLACK}{REALTIME} -STR_1459 :Track style +STR_1459 :軌道款式 STR_1460 :{SMALLFONT}{BLACK}'U'型的開放式軌道 STR_1461 :{SMALLFONT}{BLACK}'O'型的封閉式軌道 STR_1462 :對於帶有鏈條的坡道來說太陡斜 @@ -1470,7 +1471,7 @@ STR_1465 :向上盤旋 (大型) STR_1466 :向下盤旋 (小型) STR_1467 :向下盤旋 (大型) STR_1468 :員工 -STR_1469 :Ride must start and end with stations +STR_1469 :遊樂設施必需要由車站發車以及到達車站卸客 STR_1470 :車站不夠長 STR_1471 :{WINDOW_COLOUR_2}速度: STR_1472 :{SMALLFONT}{BLACK}此遊樂設施的速度 @@ -1520,7 +1521,7 @@ STR_1515 :{SMALLFONT}{OPENQUOTES}這樂園真是又整齊又乾淨{ENDQUOTES} STR_1516 :{SMALLFONT}{OPENQUOTES}這些跳躍噴泉真棒{ENDQUOTES} STR_1517 :{SMALLFONT}{OPENQUOTES}這裡播放的音樂挺不錯{ENDQUOTES} STR_1518 :{SMALLFONT}{OPENQUOTES}這個由{STRINGID}購買的氣球真的是超值{ENDQUOTES} -STR_1519 :{SMALLFONT}{OPENQUOTES}這隻由{STRINGID}購買的熊寶寶真的是超值{ENDQUOTES} +STR_1519 :{SMALLFONT}{OPENQUOTES}這隻由{STRINGID}購買的毛公仔真的是超值{ENDQUOTES} STR_1520 :{SMALLFONT}{OPENQUOTES}這份由{STRINGID}購買的樂園地圖真的是超值{ENDQUOTES} STR_1521 :{SMALLFONT}{OPENQUOTES}這張由{STRINGID}購買的即時照片真的是超值{ENDQUOTES} STR_1522 :{SMALLFONT}{OPENQUOTES}這把由{STRINGID}購買的雨傘真的是超值{ENDQUOTES} @@ -1554,7 +1555,7 @@ STR_1549 : STR_1550 :{SMALLFONT}{OPENQUOTES}嘩!{ENDQUOTES} STR_1551 :{SMALLFONT}{OPENQUOTES}奇怪, 我覺得有人在偷窺我{ENDQUOTES} STR_1552 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一個氣球{ENDQUOTES} -STR_1553 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一隻熊寶寶{ENDQUOTES} +STR_1553 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一隻毛公仔{ENDQUOTES} STR_1554 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一份樂園地圖{ENDQUOTES} STR_1555 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一張即時照片{ENDQUOTES} STR_1556 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一把雨傘{ENDQUOTES} @@ -1673,24 +1674,24 @@ STR_1668 :{WINDOW_COLOUR_2}滿意度: {BLACK}未知 STR_1669 :{WINDOW_COLOUR_2}滿意度: {BLACK}{COMMA16}% STR_1670 :{WINDOW_COLOUR_2}總乘客數: {BLACK}{COMMA32} STR_1671 :{WINDOW_COLOUR_2}總利潤: {BLACK}{CURRENCY2DP} -STR_1672 :Brakes +STR_1672 :煞車裝置 STR_1673 :Spinning Control Toggle Track -STR_1674 :Brake speed +STR_1674 :煞車速度 STR_1675 :{POP16}{VELOCITY} -STR_1676 :{SMALLFONT}{BLACK}Set speed limit for brakes -STR_1677 :{WINDOW_COLOUR_2}Popularity: {BLACK}Unknown -STR_1678 :{WINDOW_COLOUR_2}Popularity: {BLACK}{COMMA16}% -STR_1679 :Helix up (left) -STR_1680 :Helix up (right) -STR_1681 :Helix down (left) -STR_1682 :Helix down (right) +STR_1676 :{SMALLFONT}{BLACK}設置煞車速度限制 +STR_1677 :{WINDOW_COLOUR_2}受歡迎度: {BLACK}未知 +STR_1678 :{WINDOW_COLOUR_2}受歡迎度: {BLACK}{COMMA16}% +STR_1679 :向上盤旋 (向左) +STR_1680 :向上盤旋 (向右) +STR_1681 :向下盤旋 (向左) +STR_1682 :向下盤旋 (向右) STR_1683 :Base size 2 x 2 STR_1684 :Base size 4 x 4 STR_1685 :Base size 2 x 4 STR_1686 :Base size 5 x 1 STR_1687 :Water splash STR_1688 :Base size 4 x 1 -STR_1689 :Block brakes +STR_1689 :區域煞車裝置 STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} STR_1691 :{WINDOW_COLOUR_2} Cost: {BLACK}{CURRENCY} STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY} @@ -1698,24 +1699,24 @@ STR_1693 :{SMALLFONT}{BLACK}遊客 STR_1694 :{SMALLFONT}{BLACK}員工 STR_1695 :{SMALLFONT}{BLACK}收入和支出 STR_1696 :{SMALLFONT}{BLACK}Customer information -STR_1697 :Cannot place these on queue line area -STR_1698 :Can only place these on queue area -STR_1699 :Too many people in game +STR_1697 :不能在輪侯區放置此物件 +STR_1698 :只能在輪侯區放置此物件 +STR_1699 :遊戲中已有太多人物 STR_1700 :僱用新的清潔工人 STR_1701 :僱用新的維修人員 STR_1702 :僱用新的安全警衛 STR_1703 :僱用新的表演人員 STR_1704 :不能僱用新員工... -STR_1705 :{SMALLFONT}{BLACK}Sack this staff member -STR_1706 :{SMALLFONT}{BLACK}Move this person to a new location -STR_1707 :Too many staff in game -STR_1708 :{SMALLFONT}{BLACK}Set patrol area for this staff member +STR_1705 :{SMALLFONT}{BLACK}解僱這位員工 +STR_1706 :{SMALLFONT}{BLACK}移動這個人物到新的位置 +STR_1707 :遊戲中已有太多員工 +STR_1708 :{SMALLFONT}{BLACK}設置這位員工的巡邏位置 STR_1709 :解僱員工 -STR_1710 :Yes -STR_1711 :{WINDOW_COLOUR_1}Are you sure you want to sack {STRINGID}? -STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Sweep footpaths -STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Water gardens -STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Empty litter bins +STR_1710 :確定 +STR_1711 :{WINDOW_COLOUR_1}你確定要解僱{STRINGID}嗎? +STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}清掃道路 +STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}灌溉花圃 +STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}清空垃圾筒 STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Mow grass STR_1716 :非法的樂園名稱 STR_1717 :不能重命名樂園... @@ -1733,8 +1734,8 @@ STR_1728 :不能在此購買建造權... STR_1729 :土地不是由樂園所擁有! STR_1730 :{RED}Closed - - STR_1731 :{WHITE}{STRINGID} - - -STR_1732 :Build -STR_1733 :Mode +STR_1732 :建造 +STR_1733 :模式 STR_1734 :{WINDOW_COLOUR_2}圈數: STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} @@ -1742,31 +1743,31 @@ STR_1737 :{COMMA16} STR_1738 :不能改變圈數... STR_1739 :此賽事由遊客{INT32}勝出 STR_1740 :此賽事由{STRINGID}勝出 -STR_1741 :Not yet constructed ! +STR_1741 :尚未建造! STR_1742 :{WINDOW_COLOUR_2}Max. people on ride: STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this ride at one time STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1745 :{COMMA16} -STR_1746 :Can't change this... -STR_1747 :{WINDOW_COLOUR_2}Time limit: -STR_1748 :{SMALLFONT}{BLACK}Time limit for ride +STR_1746 :不能改變... +STR_1747 :{WINDOW_COLOUR_2}遊玩時間限制: +STR_1748 :{SMALLFONT}{BLACK}此遊樂設施的遊玩時間限制 STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} STR_1750 :{DURATION} -STR_1751 :Can't change time limit for ride... +STR_1751 :不能改變此遊樂設施的遊玩時間限制... STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park STR_1753 :{SMALLFONT}{BLACK}Show summarised list of guests in park STR_1754 :{BLACK}{COMMA16} guests STR_1755 :{BLACK}{COMMA16} guest -STR_1756 :{WINDOW_COLOUR_2}Admission price: -STR_1757 :{WINDOW_COLOUR_2}Reliability: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1756 :{WINDOW_COLOUR_2}門票價格: +STR_1757 :{WINDOW_COLOUR_2}可靠度: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1758 :{SMALLFONT}{BLACK}Build mode STR_1759 :{SMALLFONT}{BLACK}Move mode STR_1760 :{SMALLFONT}{BLACK}Fill-in mode -STR_1761 :{SMALLFONT}{BLACK}Build maze in this direction -STR_1762 :Waterfalls -STR_1763 :Rapids -STR_1764 :Log Bumps -STR_1765 :On-ride photo section +STR_1761 :{SMALLFONT}{BLACK}以此方向建造迷宮 +STR_1762 :瀑布 +STR_1763 :急流 +STR_1764 :漩渦 +STR_1765 :即時拍照區域 STR_1766 :Reverser turntable STR_1767 :Spinning tunnel STR_1768 :Can't change number of swings... @@ -1776,9 +1777,9 @@ STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COM STR_1772 :{COMMA16} STR_1773 :Only one on-ride photo section allowed per ride STR_1774 :Only one cable lift hill allowed per ride -STR_1775 :Off -STR_1776 :On -STR_1777 :{WINDOW_COLOUR_2}Music +STR_1775 :關閉 +STR_1776 :開啟 +STR_1777 :{WINDOW_COLOUR_2}音樂 STR_1778 :{STRINGID} - - STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} 熊貓服裝 STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} 老虎服裝 @@ -1791,8 +1792,8 @@ STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} 太空人服裝 STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} 土匪服裝 STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} 警長服裝 STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} 海盜服裝 -STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff -STR_1791 :{WINDOW_COLOUR_2}Uniform colour: +STR_1790 :{SMALLFONT}{BLACK}選擇這種員工的制服顏色 +STR_1791 :{WINDOW_COLOUR_2}制服的顏色: STR_1792 :Responding to {STRINGID} breakdown call STR_1793 :Heading to {STRINGID} for an inspection STR_1794 :Fixing {STRINGID} @@ -1809,10 +1810,10 @@ STR_1804 :Doors stuck open STR_1805 :Vehicle malfunction STR_1806 :Brakes failure STR_1807 :Control failure -STR_1808 :{WINDOW_COLOUR_2}Last breakdown: {BLACK}{STRINGID} -STR_1809 :{WINDOW_COLOUR_2}Current breakdown: {OUTLINE}{RED}{STRINGID} +STR_1808 :{WINDOW_COLOUR_2}上次故障原因: {BLACK}{STRINGID} +STR_1809 :{WINDOW_COLOUR_2}今次故障原因: {OUTLINE}{RED}{STRINGID} STR_1810 :{WINDOW_COLOUR_2}Carrying: -STR_1811 :Can't build this here... +STR_1811 :不能建造於此... STR_1812 :{SMALLFONT}{BLACK}{STRINGID} STR_1813 :其他物件 STR_1814 :動作 @@ -1869,17 +1870,17 @@ STR_1864 :維修人員 STR_1865 :安全警衛 STR_1866 :表演人員 STR_1867 :{BLACK}{COMMA16} {STRINGID} -STR_1868 :Can't change number of rotations... -STR_1869 :{WINDOW_COLOUR_2}Number of rotations: -STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations +STR_1868 :不能改變旋轉次數... +STR_1869 :{WINDOW_COLOUR_2}旋轉次數: +STR_1870 :{SMALLFONT}{BLACK}完整旋轉次數 STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1872 :{COMMA16} STR_1873 :{WINDOW_COLOUR_2}收入: {BLACK}{CURRENCY2DP}/每小時 STR_1874 :{WINDOW_COLOUR_2}營利: {BLACK}{CURRENCY2DP}/每小時 STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} -STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides -STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides -STR_1878 :{WINDOW_COLOUR_2}Inspection: +STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}檢查遊樂設施 +STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}修理遊樂設施 +STR_1878 :{WINDOW_COLOUR_2}檢查時距: STR_1879 :每10分鐘 STR_1880 :每20分鐘 STR_1881 :每30分鐘 @@ -1887,17 +1888,19 @@ STR_1882 :每45分鐘 STR_1883 :每小時 STR_1884 :每2小時 STR_1885 :從不 -STR_1886 :Inspecting {STRINGID} -STR_1887 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}{COMMA16} minutes -STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hours +STR_1886 :檢查{STRINGID}中 +STR_1887 :{WINDOW_COLOUR_2}上次檢查時間: {BLACK}{COMMA16}分鐘 +STR_1888 :{WINDOW_COLOUR_2}上次檢查時間: {BLACK}多於4小時 STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% -STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride -STR_1891 :No {STRINGID} in park yet! +STR_1890 :{SMALLFONT}{BLACK}選擇維修人員檢查此遊樂設施的時距 +STR_1891 :在樂園裡暫未有{STRINGID}! +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. STR_1892 :RollerCoaster Tycoon 2 STR_1893 :Please insert your RollerCoaster Tycoon 2 CD in the following drive: -STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} -STR_1895 :{SMALLFONT}{BLACK}Build new ride/attraction -STR_1896 :{WINDOW_COLOUR_2}Expenditure/Income +STR_1894 :{WINDOW_COLOUR_2}賣出{STRINGID}: {BLACK}{COMMA32} +STR_1895 :{SMALLFONT}{BLACK}建造新的遊樂設施/店鋪 +STR_1896 :{WINDOW_COLOUR_2}支出/收入 STR_1897 :{WINDOW_COLOUR_2}Ride construction STR_1898 :{WINDOW_COLOUR_2}Ride running costs STR_1899 :{WINDOW_COLOUR_2}Land purchase @@ -1910,34 +1913,34 @@ STR_1905 :{WINDOW_COLOUR_2}Food/drink sales STR_1906 :{WINDOW_COLOUR_2}Food/drink stock STR_1907 :{WINDOW_COLOUR_2}Staff wages STR_1908 :{WINDOW_COLOUR_2}Marketing -STR_1909 :{WINDOW_COLOUR_2}Research -STR_1910 :{WINDOW_COLOUR_2}Loan interest -STR_1911 :{BLACK} at {COMMA16}% per year +STR_1909 :{WINDOW_COLOUR_2}研發 +STR_1910 :{WINDOW_COLOUR_2}貸款利息 +STR_1911 :{BLACK} 每年 {COMMA16}% STR_1912 :{MONTH} STR_1913 :{BLACK}+{CURRENCY2DP} STR_1914 :{BLACK}{CURRENCY2DP} STR_1915 :{RED}{CURRENCY2DP} -STR_1916 :{WINDOW_COLOUR_2}Loan: +STR_1916 :{WINDOW_COLOUR_2}貸款: STR_1917 :{POP16}{POP16}{POP16}{CURRENCY} -STR_1918 :Can't borrow any more money! -STR_1919 :Not enough cash available! -STR_1920 :Can't pay back loan! -STR_1921 :{SMALLFONT}{BLACK}Start a new game -STR_1922 :{SMALLFONT}{BLACK}Continue playing a saved game +STR_1918 :不能再借貸更多錢! +STR_1919 :沒有足夠的現金! +STR_1920 :不能償還貸款! +STR_1921 :{SMALLFONT}{BLACK}開新遊戲 +STR_1922 :{SMALLFONT}{BLACK}繼續遊玩存檔 STR_1923 :{SMALLFONT}{BLACK}開始教學 STR_1924 :{SMALLFONT}{BLACK}退出遊戲 -STR_1925 :Can't place person here... +STR_1925 :不能放置人物於此... STR_1926 :{SMALLFONT} -STR_1927 :{YELLOW}{STRINGID} has broken down -STR_1928 :{RED}{STRINGID} has crashed! +STR_1927 :{YELLOW}{STRINGID}發生故障了 +STR_1928 :{RED}{STRINGID}毀壞了! STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this guest - (If tracking is on, guest's movements will be reported in the message area) -STR_1931 :{STRINGID} has joined the queue line for {STRINGID} -STR_1932 :{STRINGID} is on {STRINGID} -STR_1933 :{STRINGID} is in {STRINGID} -STR_1934 :{STRINGID} has left {STRINGID} -STR_1935 :{STRINGID} has left the park -STR_1936 :{STRINGID} has bought {STRINGID} +STR_1931 :{STRINGID}已在輪候{STRINGID} +STR_1932 :{STRINGID}已在{STRINGID}上 +STR_1933 :{STRINGID}已在{STRINGID}中 +STR_1934 :{STRINGID}已離開{STRINGID} +STR_1935 :{STRINGID}已離開樂園 +STR_1936 :{STRINGID}已購買{STRINGID} STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message STR_1938 :{SMALLFONT}{BLACK}Show view of guest STR_1939 :{SMALLFONT}{BLACK}Show view of staff member @@ -1961,90 +1964,90 @@ STR_1956 :{SMALLFONT}{BLACK}Number of circuits of track per ride STR_1957 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1958 :{COMMA16} STR_1959 :Can't change number of circuits... -STR_1960 :{WINDOW_COLOUR_2}Balloon price: -STR_1961 :{WINDOW_COLOUR_2}Cuddly Toy price: -STR_1962 :{WINDOW_COLOUR_2}Park Map price: -STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: -STR_1964 :{WINDOW_COLOUR_2}Umbrella price: -STR_1965 :{WINDOW_COLOUR_2}Drink price: -STR_1966 :{WINDOW_COLOUR_2}Burger price: -STR_1967 :{WINDOW_COLOUR_2}Chips price: -STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: -STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: +STR_1960 :{WINDOW_COLOUR_2}氣球價格: +STR_1961 :{WINDOW_COLOUR_2}毛公仔價格: +STR_1962 :{WINDOW_COLOUR_2}樂園地圖價格: +STR_1963 :{WINDOW_COLOUR_2}即時照片價格: +STR_1964 :{WINDOW_COLOUR_2}雨傘價格: +STR_1965 :{WINDOW_COLOUR_2}飲料價格: +STR_1966 :{WINDOW_COLOUR_2}漢堡價格: +STR_1967 :{WINDOW_COLOUR_2}薯條價格: +STR_1968 :{WINDOW_COLOUR_2}冰淇淋價格: +STR_1969 :{WINDOW_COLOUR_2}棉花糖價格: STR_1970 :{WINDOW_COLOUR_2} STR_1971 :{WINDOW_COLOUR_2} STR_1972 :{WINDOW_COLOUR_2} -STR_1973 :{WINDOW_COLOUR_2}Pizza price: +STR_1973 :{WINDOW_COLOUR_2}批薩價格: STR_1974 :{WINDOW_COLOUR_2} -STR_1975 :{WINDOW_COLOUR_2}Popcorn price: -STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: -STR_1977 :{WINDOW_COLOUR_2}Tentacle price: -STR_1978 :{WINDOW_COLOUR_2}Hat price: -STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: -STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: -STR_1981 :{WINDOW_COLOUR_2}Doughnut price: -STR_1982 :{WINDOW_COLOUR_2}Coffee price: +STR_1975 :{WINDOW_COLOUR_2}爆米花價格: +STR_1976 :{WINDOW_COLOUR_2}熱狗價格: +STR_1977 :{WINDOW_COLOUR_2}觸手價格: +STR_1978 :{WINDOW_COLOUR_2}帽子價格: +STR_1979 :{WINDOW_COLOUR_2}太妃蘋果糖價格: +STR_1980 :{WINDOW_COLOUR_2}T-Shirt價格: +STR_1981 :{WINDOW_COLOUR_2}甜甜圈價格: +STR_1982 :{WINDOW_COLOUR_2}咖啡價格: STR_1983 :{WINDOW_COLOUR_2} -STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: -STR_1985 :{WINDOW_COLOUR_2}Lemonade price: +STR_1984 :{WINDOW_COLOUR_2}炸雞價格: +STR_1985 :{WINDOW_COLOUR_2}檸檬水價格: STR_1986 :{WINDOW_COLOUR_2} STR_1987 :{WINDOW_COLOUR_2} -STR_1988 :Balloon -STR_1989 :Cuddly Toy -STR_1990 :Park Map -STR_1991 :On-Ride Photo -STR_1992 :Umbrella -STR_1993 :Drink -STR_1994 :Burger -STR_1995 :Chips -STR_1996 :Ice Cream -STR_1997 :Candyfloss -STR_1998 :Empty Can -STR_1999 :Rubbish -STR_2000 :Empty Burger Box -STR_2001 :Pizza -STR_2002 :Voucher -STR_2003 :Popcorn -STR_2004 :Hot Dog -STR_2005 :Tentacle -STR_2006 :Hat -STR_2007 :Toffee Apple +STR_1988 :氣球 +STR_1989 :毛公仔 +STR_1990 :樂園地圖 +STR_1991 :即時照片 +STR_1992 :雨傘 +STR_1993 :飲料 +STR_1994 :漢堡 +STR_1995 :薯條 +STR_1996 :冰淇淋 +STR_1997 :棉花糖 +STR_1998 :空罐子 +STR_1999 :垃圾 +STR_2000 :空漢堡盒子 +STR_2001 :批薩 +STR_2002 :優惠卷 +STR_2003 :爆米花 +STR_2004 :熱狗 +STR_2005 :觸手 +STR_2006 :帽子 +STR_2007 :太妃蘋果糖 STR_2008 :T-Shirt -STR_2009 :Doughnut -STR_2010 :Coffee -STR_2011 :Empty Cup -STR_2012 :Fried Chicken -STR_2013 :Lemonade -STR_2014 :Empty Box -STR_2015 :Empty Bottle -STR_2016 :Balloons -STR_2017 :Cuddly Toys -STR_2018 :Park Maps -STR_2019 :On-Ride Photos -STR_2020 :Umbrellas -STR_2021 :Drinks -STR_2022 :Burgers -STR_2023 :Chips -STR_2024 :Ice Creams -STR_2025 :Candyfloss -STR_2026 :Empty Cans -STR_2027 :Rubbish -STR_2028 :Empty Burger Boxes -STR_2029 :Pizzas -STR_2030 :Vouchers -STR_2031 :Popcorn -STR_2032 :Hot Dogs -STR_2033 :Tentacles -STR_2034 :Hats -STR_2035 :Toffee Apples -STR_2036 :T-Shirts -STR_2037 :Doughnuts -STR_2038 :Coffees -STR_2039 :Empty Cups -STR_2040 :Fried Chicken -STR_2041 :Lemonade -STR_2042 :Empty Boxes -STR_2043 :Empty Bottles +STR_2009 :甜甜圈 +STR_2010 :咖啡 +STR_2011 :空杯子 +STR_2012 :炸雞 +STR_2013 :檸檬水 +STR_2014 :空盒子 +STR_2015 :空瓶子 +STR_2016 :氣球 +STR_2017 :毛公仔 +STR_2018 :樂園地圖 +STR_2019 :即時照片 +STR_2020 :雨傘 +STR_2021 :飲料 +STR_2022 :漢堡 +STR_2023 :薯條 +STR_2024 :冰淇淋 +STR_2025 :棉花糖 +STR_2026 :空罐子 +STR_2027 :垃圾 +STR_2028 :空漢堡盒子 +STR_2029 :批薩 +STR_2030 :優惠卷 +STR_2031 :爆米花 +STR_2032 :熱狗 +STR_2033 :觸手 +STR_2034 :帽子 +STR_2035 :太妃蘋果糖 +STR_2036 :T-Shirt +STR_2037 :甜甜圈 +STR_2038 :咖啡 +STR_2039 :空杯子 +STR_2040 :炸雞 +STR_2041 :檸檬水 +STR_2042 :空盒子 +STR_2043 :空瓶子 STR_2044 :a Balloon STR_2045 :a Cuddly Toy STR_2046 :a Park Map @@ -2261,23 +2264,23 @@ STR_2256 :剌激類遊樂設施 STR_2257 :水文類遊樂設施 STR_2258 :商店及攤販 STR_2259 :景物及主題景物 -STR_2260 :No funding -STR_2261 :Minimum funding -STR_2262 :Normal funding -STR_2263 :Maximum funding -STR_2264 :Research funding +STR_2260 :無資金 +STR_2261 :最少資金 +STR_2262 :普通資金 +STR_2263 :最多資金 +STR_2264 :研發資金分配 STR_2265 :{WINDOW_COLOUR_2}費用: {BLACK}每個月{CURRENCY} -STR_2266 :Research priorities -STR_2267 :Currently in development -STR_2268 :Last development -STR_2269 :{WINDOW_COLOUR_2}Type: {BLACK}{STRINGID} -STR_2270 :{WINDOW_COLOUR_2}Progress: {BLACK}{STRINGID} -STR_2271 :{WINDOW_COLOUR_2}Expected: {BLACK}{STRINGID} -STR_2272 :{WINDOW_COLOUR_2}Ride/attraction:{NEWLINE}{BLACK}{STRINGID} -STR_2273 :{WINDOW_COLOUR_2}Scenery/themeing:{NEWLINE}{BLACK}{STRINGID} -STR_2274 :{SMALLFONT}{BLACK}Show details of this invention or development -STR_2275 :{SMALLFONT}{BLACK}Show funding and options for research & development -STR_2276 :{SMALLFONT}{BLACK}Show research & development status +STR_2266 :研發優先項目 +STR_2267 :目前研發項目 +STR_2268 :上次研發項目 +STR_2269 :{WINDOW_COLOUR_2}類別: {BLACK}{STRINGID} +STR_2270 :{WINDOW_COLOUR_2}進度: {BLACK}{STRINGID} +STR_2271 :{WINDOW_COLOUR_2}預計完工日期: {BLACK}{STRINGID} +STR_2272 :{WINDOW_COLOUR_2}遊樂設施/店鋪:{NEWLINE}{BLACK}{STRINGID} +STR_2273 :{WINDOW_COLOUR_2}景物/主題景物:{NEWLINE}{BLACK}{STRINGID} +STR_2274 :{SMALLFONT}{BLACK}顯示此研發項目的詳細資料 +STR_2275 :{SMALLFONT}{BLACK}顯示研發的資金分配及選項 +STR_2276 :{SMALLFONT}{BLACK}顯示研發項目進度 STR_2277 :未知 STR_2278 :運輸類遊樂設施 STR_2279 :溫和類遊樂設施 @@ -2297,15 +2300,15 @@ STR_2292 :{WINDOW_COLOUR_2}Rides been on: STR_2293 :{BLACK} Nothing STR_2294 :{SMALLFONT}{BLACK}Change base land style STR_2295 :{SMALLFONT}{BLACK}Change vertical edges of land -STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} paid to enter park -STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} ride -STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} rides -STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} item of food -STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} items of food -STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drink -STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drinks -STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenir -STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenirs +STR_2296 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}進入樂園 +STR_2297 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}乘坐{BLACK}{COMMA16}個遊樂設施 +STR_2298 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}乘坐{BLACK}{COMMA16}個遊樂設施 +STR_2299 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}享用{BLACK}{COMMA16}款食物 +STR_2300 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}享用{BLACK}{COMMA16}款食物 +STR_2301 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}享用{BLACK}{COMMA16}款飲料 +STR_2302 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}享用{BLACK}{COMMA16}款飲料 +STR_2303 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}購買{BLACK}{COMMA16}個記念品 +STR_2304 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}購買{BLACK}{COMMA16}個記念品 STR_2305 :Track design files STR_2306 :Save track design STR_2307 :Select {STRINGID} design @@ -2318,22 +2321,22 @@ STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) STR_2314 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks -STR_2317 :{WINDOW_COLOUR_2}Sound Quality: -STR_2318 :Low -STR_2319 :Medium -STR_2320 :High +STR_2317 :{WINDOW_COLOUR_2}音效品質: +STR_2318 :低 +STR_2319 :中 +STR_2320 :高 STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} STR_2324 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}sq.ft. STR_2325 :{SMALLFONT}{BLACK}Buy land to extend park STR_2326 :{SMALLFONT}{BLACK}Buy construction rights to allow construction above or below land outside the park -STR_2327 :Options -STR_2328 :{WINDOW_COLOUR_2}Currency: -STR_2329 :{WINDOW_COLOUR_2}Distance and Speed: -STR_2330 :{WINDOW_COLOUR_2}Temperature: -STR_2331 :{WINDOW_COLOUR_2}Height Labels: -STR_2332 :Units +STR_2327 :選項 +STR_2328 :{WINDOW_COLOUR_2}貨幣單位: +STR_2329 :{WINDOW_COLOUR_2}距離及速度單位: +STR_2330 :{WINDOW_COLOUR_2}溫度單位: +STR_2331 :{WINDOW_COLOUR_2}高度標記單位: +STR_2332 :單位 STR_2333 :Sound STR_2334 :Pounds ({POUND}) STR_2335 :Dollars ($) @@ -2366,9 +2369,9 @@ STR_2361 :Landscape Smoothing STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off STR_2363 :Gridlines on Landscape STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off -STR_2365 :The bank refuses to increase your loan! -STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2365 :銀行拒絕增加你的貸款額! +STR_2366 :攝氏 ({DEGREE}C) +STR_2367 :華氏 (F) STR_2368 :無 STR_2369 :低 STR_2370 :普通 @@ -2387,17 +2390,17 @@ STR_2382 :Land STR_2383 :Water STR_2384 :{WINDOW_COLOUR_2}你的目標: STR_2385 :{BLACK}無 -STR_2386 :{BLACK}To have at least {COMMA16} guests in your park at the end of {MONTHYEAR}, with a park rating of at least 600 -STR_2387 :{BLACK}To achieve a park value of at least {POP16}{POP16}{CURRENCY} at the end of {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} +STR_2386 :{BLACK}在{MONTHYEAR}尾之前, 樂園裡至少有{COMMA16}個遊客, 而且樂園評價並不低於600 +STR_2387 :{BLACK}在{PUSH16}{PUSH16}{PUSH16}{MONTHYEAR}尾之前, 樂園價值必需達到{POP16}{POP16}{CURRENCY} STR_2388 :{BLACK}盡情玩吧! -STR_2389 :{BLACK}Build the best {STRINGID} you can! -STR_2390 :{BLACK}To have 10 different types of roller coasters operating in your park, each with an excitement value of at least 6.00 -STR_2391 :{BLACK}To have at least {COMMA16} guests in your park. You must not let the park rating drop below 700 at any time! -STR_2392 :{BLACK}To achieve a monthly income from ride tickets of at least {POP16}{POP16}{CURRENCY} -STR_2393 :{BLACK}To have 10 different types of roller coasters operating in your park, each with a minimum length of {LENGTH}, and an excitement rating of at least 7.00 -STR_2394 :{BLACK}To finish building all 5 of the partially built roller coasters in this park, designing them to achieve excitement ratings of at least {POP16}{POP16}{COMMA2DP32} each -STR_2395 :{BLACK}To repay your loan and achieve a park value of at least {POP16}{POP16}{CURRENCY} -STR_2396 :{BLACK}To achieve a monthly profit from food, drink and merchandise sales of at least {POP16}{POP16}{CURRENCY} +STR_2389 :{BLACK}建造你的最佳{STRINGID}吧! +STR_2390 :{BLACK}樂園必需建造十種不同種類的雲霄飛車, 而且每座的興奮度不低於6.00 +STR_2391 :{BLACK}樂園裡至少有{COMMA16}個遊客. 任何時間下, 你並不可以令樂園評價跌至700以下! +STR_2392 :{BLACK}遊樂設施的門票收入至少要達到每月{POP16}{POP16}{CURRENCY} +STR_2393 :{BLACK}樂園必需建造十種不同種類的雲霄飛車, 每座的長度至少需要{LENGTH}, 而且興奮度都不低於7.00 +STR_2394 :{BLACK}建造好五座未完成的雲霄飛車, 將他們每座設計成興奮度至少達到{POP16}{POP16}{COMMA2DP32} +STR_2395 :{BLACK}還清樂園的貸款, 並令其價值至少達到{POP16}{POP16}{CURRENCY} +STR_2396 :{BLACK}食物, 飲料及記念品的銷售收入至少要達到每月{POP16}{POP16}{CURRENCY} STR_2397 :None STR_2398 :Number of guests at a given date STR_2399 :Park value at a given date @@ -2411,11 +2414,11 @@ STR_2406 :Finish building 5 roller coasters STR_2407 :Repay loan and achieve a given park value STR_2408 :Monthly profit from food/merchandise STR_2409 :{WINDOW_COLOUR_2}Marketing campaigns in operation -STR_2410 :{BLACK}None +STR_2410 :{BLACK}無 STR_2411 :{WINDOW_COLOUR_2}Marketing campaigns available STR_2412 :{SMALLFONT}{BLACK}Start this marketing campaign -STR_2413 :{BLACK}({CURRENCY2DP} per week) -STR_2414 :(Not Selected) +STR_2413 :{BLACK}(每週{CURRENCY2DP}) +STR_2414 :(尚未選擇) STR_2415 :{WINDOW_COLOUR_2}Ride: STR_2416 :{WINDOW_COLOUR_2}Item: STR_2417 :{WINDOW_COLOUR_2}Length of time: @@ -2423,38 +2426,38 @@ STR_2418 :Free entry to {STRINGID} STR_2419 :Free ride on {STRINGID} STR_2420 :Half-price entry to {STRINGID} STR_2421 :Free {STRINGID} -STR_2422 :Advertising campaign for {STRINGID} -STR_2423 :Advertising campaign for {STRINGID} -STR_2424 :{WINDOW_COLOUR_2}Vouchers for free entry to the park -STR_2425 :{WINDOW_COLOUR_2}Vouchers for free rides on a particular ride -STR_2426 :{WINDOW_COLOUR_2}Vouchers for half-price entry to the park -STR_2427 :{WINDOW_COLOUR_2}Vouchers for free food or drink -STR_2428 :{WINDOW_COLOUR_2}Advertising campaign for the park -STR_2429 :{WINDOW_COLOUR_2}Advertising campaign for a particular ride -STR_2430 :{BLACK}Vouchers for free entry to {STRINGID} -STR_2431 :{BLACK}Vouchers for free ride on {STRINGID} -STR_2432 :{BLACK}Vouchers for half-price entry to {STRINGID} -STR_2433 :{BLACK}Vouchers for free {STRINGID} -STR_2434 :{BLACK}Advertising campaign for {STRINGID} -STR_2435 :{BLACK}Advertising campaign for {STRINGID} +STR_2422 :{STRINGID}的推廣計劃 +STR_2423 :{STRINGID}的推廣計劃 +STR_2424 :{WINDOW_COLOUR_2}發放免費進入樂園卷 +STR_2425 :{WINDOW_COLOUR_2}發放免費乘坐個別遊樂設施卷 +STR_2426 :{WINDOW_COLOUR_2}發放半價進入樂園卷 +STR_2427 :{WINDOW_COLOUR_2}發放免費進入食物或飲料樂園卷 +STR_2428 :{WINDOW_COLOUR_2}開始針對樂園的推廣計劃 +STR_2429 :{WINDOW_COLOUR_2}開始針對個別遊樂設施的推廣計劃 +STR_2430 :{BLACK}免費進入{STRINGID}的優惠卷 +STR_2431 :{BLACK}免費乘坐{STRINGID}的優惠卷 +STR_2432 :{BLACK}半價進入{STRINGID}的優惠卷 +STR_2433 :{BLACK}免費{STRINGID}的優惠卷 +STR_2434 :{BLACK}{STRINGID}的推廣計劃 +STR_2435 :{BLACK}{STRINGID}的推廣計劃 STR_2436 :1週 STR_2437 :2週 STR_2438 :3週 STR_2439 :4週 STR_2440 :5週 STR_2441 :6週 -STR_2442 :{BLACK}({STRINGID} remaining) -STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} -STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} -STR_2445 :Start this marketing campaign +STR_2442 :{BLACK}(還剩{STRINGID}結束) +STR_2443 :{WINDOW_COLOUR_2}每週費用: {BLACK}{CURRENCY2DP} +STR_2444 :{WINDOW_COLOUR_2}總費用: {BLACK}{CURRENCY2DP} +STR_2445 :開始實行此營銷計劃 STR_2446 :{YELLOW}Your marketing campaign for free entry to the park has finished STR_2447 :{YELLOW}Your marketing campaign for free rides on {STRINGID} has finished STR_2448 :{YELLOW}Your marketing campaign for half-price entry to the park has finished STR_2449 :{YELLOW}Your marketing campaign for free {STRINGID} has finished STR_2450 :{YELLOW}Your advertising campaign for the park has finished STR_2451 :{YELLOW}Your advertising campaign for {STRINGID} has finished -STR_2452 :{WINDOW_COLOUR_2}Cash (less loan): {BLACK}{CURRENCY2DP} -STR_2453 :{WINDOW_COLOUR_2}Cash (less loan): {RED}{CURRENCY2DP} +STR_2452 :{WINDOW_COLOUR_2}現金 (減去貸款): {BLACK}{CURRENCY2DP} +STR_2453 :{WINDOW_COLOUR_2}現金 (減去貸款): {RED}{CURRENCY2DP} STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} - STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} - STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} - @@ -2471,13 +2474,13 @@ STR_2466 :{SMALLFONT}{BLACK}Show park statistics STR_2467 :{SMALLFONT}{BLACK}Show objectives for this game STR_2468 :{SMALLFONT}{BLACK}Show recent awards this park has received STR_2469 :{SMALLFONT}{BLACK}Select level of research & development -STR_2470 :{SMALLFONT}{BLACK}Research new transport rides -STR_2471 :{SMALLFONT}{BLACK}Research new gentle rides -STR_2472 :{SMALLFONT}{BLACK}Research new roller coasters -STR_2473 :{SMALLFONT}{BLACK}Research new thrill rides -STR_2474 :{SMALLFONT}{BLACK}Research new water rides -STR_2475 :{SMALLFONT}{BLACK}Research new shops and stalls -STR_2476 :{SMALLFONT}{BLACK}Research new scenery and themeing +STR_2470 :{SMALLFONT}{BLACK}研發新的運輸類遊樂設施 +STR_2471 :{SMALLFONT}{BLACK}研發新的溫和類遊樂設施 +STR_2472 :{SMALLFONT}{BLACK}研發新的雲霄飛車 +STR_2473 :{SMALLFONT}{BLACK}研發新的剌激類遊樂設施 +STR_2474 :{SMALLFONT}{BLACK}研發新的水文類遊樂設施 +STR_2475 :{SMALLFONT}{BLACK}研發新的商店及攤販 +STR_2476 :{SMALLFONT}{BLACK}研發新的景物及主題景物 STR_2477 :{SMALLFONT}{BLACK}Select operating mode for this ride/attraction STR_2478 :{SMALLFONT}{BLACK}Show graph of velocity against time STR_2479 :{SMALLFONT}{BLACK}Show graph of altitude against time @@ -2710,9 +2713,9 @@ STR_2704 :每四個月 STR_2705 :每年 STR_2706 :從不 STR_2707 :開啟新視窗 -STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? -STR_2709 :Overwrite -STR_2710 :Type the name of the file. +STR_2708 :{WINDOW_COLOUR_1}你確定要覆蓋存檔{STRINGID}? +STR_2709 :覆蓋 +STR_2710 :請輸入存檔名稱: STR_2711 :; STR_2712 := STR_2713 :, @@ -2720,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(up) -STR_2719 :(new file) +STR_2718 :(向上層) +STR_2719 :(建立新檔案) STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec @@ -2741,11 +2744,11 @@ STR_2735 :{COMMA16}km/h STR_2736 :{MONTH}, Year {COMMA16} STR_2737 :{STRINGID} {MONTH}, Year {COMMA16} STR_2738 :主選單音樂: -STR_2739 :None +STR_2739 :無 STR_2740 :夢幻遊樂園 (RCT1) STR_2741 :模擬樂園 (RCT2) -STR_2742 :css50.dat not found -STR_2743 :Copy data\css17.dat from your RCT1 installation to data\css50.dat in your RCT2 installation. +STR_2742 :找不到css50.dat +STR_2743 :複製夢幻遊樂園(RCT1)文件夾中的'data\css17.dat'到模擬樂園(RCT2)的文件夾, 並重新命名為'data\css50.dat'. STR_2744 :[ STR_2745 :\ STR_2746 :] @@ -2789,16 +2792,16 @@ STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :更改鍵盤快捷鍵 -STR_2785 :{WINDOW_COLOUR_2}Press new shortcut key for:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} -STR_2786 :{SMALLFONT}{BLACK}Click on shortcut description to select new key -STR_2787 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} -STR_2788 :{WINDOW_COLOUR_2}Congratulations !{NEWLINE}{BLACK}You achieved your objective with a company value of {CURRENCY} ! -STR_2789 :{WINDOW_COLOUR_2}You have failed your objective ! -STR_2790 :Enter name into scenario chart -STR_2791 :Enter name -STR_2792 :Please enter your name for the scenario chart: -STR_2793 :{SMALLFONT}(Completed by {STRINGID}) -STR_2794 :{WINDOW_COLOUR_2}Completed by: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} with a company value of: {BLACK}{CURRENCY} +STR_2785 :{WINDOW_COLOUR_2}請按下屬於下列快捷鍵的新鍵位:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} +STR_2786 :{SMALLFONT}{BLACK}按一下快捷鍵的描述來選擇新的鍵位 +STR_2787 :{WINDOW_COLOUR_2}樂園價值: {BLACK}{CURRENCY} +STR_2788 :{WINDOW_COLOUR_2}恭喜您!{NEWLINE}{BLACK}你已經達到你的目標, 並令公司價值增至 {CURRENCY} ! +STR_2789 :{WINDOW_COLOUR_2}你未能達到目標! +STR_2790 :請輸入你要在劇情列表顯示的名字 +STR_2791 :輸入名字 +STR_2792 :請輸入你要在劇情列表顯示的名字: +STR_2793 :{SMALLFONT}(已由{STRINGID}完成) +STR_2794 :{WINDOW_COLOUR_2}完成目標者: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} 令公司價值增至: {BLACK}{CURRENCY} STR_2795 :Sort STR_2796 :{SMALLFONT}{BLACK}Sort the ride list into order using the information type displayed STR_2797 :Scroll view when pointer at screen edge @@ -2857,9 +2860,9 @@ STR_2849 :New scenario installed successfully STR_2850 :New track design installed successfully STR_2851 :Scenario already installed STR_2852 :Track design already installed -STR_2853 :Forbidden by the local authority! -STR_2854 :{RED}Guests can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance -STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the ride exit +STR_2853 :被當地政府禁止! +STR_2854 :{RED}遊客都不能走到去{STRINGID}的入口!{NEWLINE}請建造道路連接入口 +STR_2855 :{RED}{STRINGID}的出口並沒有道路連接!{NEWLINE}請建造道路連接出口 STR_2856 :{WINDOW_COLOUR_2}教學 STR_2857 :{WINDOW_COLOUR_2}(按下任意鍵來獲取控制) STR_2858 :Can't start marketing campaign... @@ -3016,52 +3019,52 @@ STR_3008 :{PEARLAQUA}ABC STR_3009 :{PALESILVER}ABC STR_3010 :無法載入檔案... STR_3011 :檔案中含有非法資料 -STR_3012 :Dodgems beat style -STR_3013 :Fairground organ style -STR_3014 :Roman fanfare style -STR_3015 :Oriental style -STR_3016 :Martian style -STR_3017 :Jungle drums style -STR_3018 :Egyptian style -STR_3019 :Toyland style +STR_3012 :碰碰車節奏風格 +STR_3013 :遊樂場風琴風格 +STR_3014 :羅馬號角風格 +STR_3015 :東方風格 +STR_3016 :火星風格 +STR_3017 :叢林敲擊風格 +STR_3018 :埃及風格 +STR_3019 :童真風格 STR_3020 : -STR_3021 :Space style -STR_3022 :Horror style -STR_3023 :Techno style -STR_3024 :Gentle style -STR_3025 :Summer style -STR_3026 :Water style -STR_3027 :Wild west style -STR_3028 :Jurassic style -STR_3029 :Rock style -STR_3030 :Ragtime style -STR_3031 :Fantasy style -STR_3032 :Rock style 2 -STR_3033 :Ice style -STR_3034 :Snow style -STR_3035 :Custom music 1 -STR_3036 :Custom music 2 -STR_3037 :Medieval style -STR_3038 :Urban style -STR_3039 :Organ style -STR_3040 :Mechanical style -STR_3041 :Modern style -STR_3042 :Pirates style -STR_3043 :Rock style 3 -STR_3044 :Candy style -STR_3045 :{SMALLFONT}{BLACK}Select style of music to play -STR_3046 :This ride cannot be modified -STR_3047 :Local authority forbids demolition or modifications to this ride -STR_3048 :Marketing campaigns forbidden by local authority -STR_3049 :Golf hole A -STR_3050 :Golf hole B -STR_3051 :Golf hole C -STR_3052 :Golf hole D -STR_3053 :Golf hole E +STR_3021 :太空風格 +STR_3022 :恐怖風格 +STR_3023 :電子風格 +STR_3024 :溫和風格 +STR_3025 :夏日風格 +STR_3026 :水文風格 +STR_3027 :美國西部風格 +STR_3028 :侏儸紀風格 +STR_3029 :搖滾風格 +STR_3030 :雷格泰姆音樂風格 +STR_3031 :夢幻風格 +STR_3032 :搖滾風格2 +STR_3033 :冰封風格 +STR_3034 :雪地風格 +STR_3035 :自訂音樂1 +STR_3036 :自訂音樂2 +STR_3037 :中世紀風格 +STR_3038 :都市風格 +STR_3039 :風琴風格 +STR_3040 :機械風格 +STR_3041 :摩登風格 +STR_3042 :海盜風格 +STR_3043 :搖滾風格3 +STR_3044 :糖果風格 +STR_3045 :{SMALLFONT}{BLACK}選擇要播放的音樂風格: +STR_3046 :此遊樂設施不能被修改 +STR_3047 :當地政府禁止拆除或修改此遊樂設施 +STR_3048 :當地政府禁止所有推廣計劃進行 +STR_3049 :哥爾夫球洞A +STR_3050 :哥爾夫球洞B +STR_3051 :哥爾夫球洞C +STR_3052 :哥爾夫球洞D +STR_3053 :哥爾夫球洞E STR_3054 :載入中... -STR_3055 :White -STR_3056 :Translucent -STR_3057 :{WINDOW_COLOUR_2}Construction Marker: +STR_3055 :白色 +STR_3056 :透明 +STR_3057 :{WINDOW_COLOUR_2}建造標記: STR_3058 :Brick walls STR_3059 :Hedges STR_3060 :Ice blocks @@ -3075,29 +3078,29 @@ STR_3067 :{OPENQUOTES}真實{ENDQUOTES}樂園 STR_3068 :其他樂園 STR_3069 :Top Section STR_3070 :Slope to Level -STR_3071 :{WINDOW_COLOUR_2}Same price throughout park -STR_3072 :{SMALLFONT}{BLACK}Select whether this price is used throughout the entire park +STR_3071 :{WINDOW_COLOUR_2}劃一樂園內的價格 +STR_3072 :{SMALLFONT}{BLACK}選擇是否以此價格為劃一價格 STR_3073 :{RED}WARNING: Your park rating has dropped below 700 !{NEWLINE}If you haven't raised the park rating in 4 weeks, your park will be closed down STR_3074 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have 3 weeks to raise the park rating STR_3075 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have only 2 weeks to raise the park rating, or your park will be closed down STR_3076 :{RED}FINAL WARNING: Your park rating is still below 700 !{NEWLINE}In just 7 days your park will be closed down unless you can raise the rating STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! -STR_3078 :Plain entrance -STR_3079 :Wooden entrance -STR_3080 :Canvas tent entrance -STR_3081 :Castle entrance (grey) -STR_3082 :Castle entrance (brown) -STR_3083 :Jungle entrance -STR_3084 :Log cabin entrance -STR_3085 :Classical/Roman entrance -STR_3086 :Abstract entrance -STR_3087 :Snow/Ice entrance -STR_3088 :Pagoda entrance -STR_3089 :Space entrance +STR_3078 :普通入口 +STR_3079 :木製入口 +STR_3080 :帆布帳幕式入口 +STR_3081 :城堡主題入口 (灰) +STR_3082 :城堡主題入口 (啡) +STR_3083 :叢林主題入口 +STR_3084 :木屋式入口 +STR_3085 :古羅馬主題入口 +STR_3086 :抽象主題入口 +STR_3087 :冰雪主題入口 +STR_3088 :寶塔式入口 +STR_3089 :太空主題入口 STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station STR_3091 :You are not allowed to remove this section! STR_3092 :You are not allowed to move or modify the station for this ride! -STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} +STR_3093 :{WINDOW_COLOUR_2}最愛: {BLACK}{STRINGID} STR_3094 :N/A STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} @@ -3115,12 +3118,12 @@ STR_3107 :關閉 STR_3108 :測試 STR_3109 :開啟 STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16} -STR_3111 :{SMALLFONT}{BLACK}Click on design to build it -STR_3112 :{SMALLFONT}{BLACK}Click on design to rename or delete it -STR_3113 :Select a different design -STR_3114 :{SMALLFONT}{BLACK}Go back to design selection window -STR_3115 :{SMALLFONT}{BLACK}Save track design -STR_3116 :{SMALLFONT}{BLACK}Save track design (Not possible until ride has been tested and statistics have been generated) +STR_3111 :{SMALLFONT}{BLACK}點擊建造設計 +STR_3112 :{SMALLFONT}{BLACK}點擊刪除或重命名設計 +STR_3113 :選擇另一個設計 +STR_3114 :{SMALLFONT}{BLACK}返回選擇設計視窗 +STR_3115 :{SMALLFONT}{BLACK}儲存軌道設計 +STR_3116 :{SMALLFONT}{BLACK}儲存軌道設計 (在測試完結及測試資料生成完畢前不可用) STR_3117 :{BLACK}Calling mechanic... STR_3118 :{BLACK}{STRINGID} is heading for the ride STR_3119 :{BLACK}{STRINGID} is fixing the ride @@ -3129,13 +3132,13 @@ STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy STR_3122 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guest STR_3123 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guests STR_3124 :Broken {STRINGID} -STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% -STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% -STR_3127 :{WINDOW_COLOUR_2}Nausea Factor: {BLACK}+{COMMA16}% -STR_3128 :Save Track Design -STR_3129 :Save Track Design with Scenery -STR_3130 :Save -STR_3131 :Cancel +STR_3125 :{WINDOW_COLOUR_2}興奮度加成: {BLACK}+{COMMA16}% +STR_3126 :{WINDOW_COLOUR_2}刺激度加成: {BLACK}+{COMMA16}% +STR_3127 :{WINDOW_COLOUR_2}噁心度加成: {BLACK}+{COMMA16}% +STR_3128 :儲存軌道設計 +STR_3129 :儲存軌道設計及周邊景物 +STR_3130 :儲存 +STR_3131 :取消 STR_3132 :{BLACK}Click items of scenery to select them to be saved with track design... STR_3133 :Unable to build this on a slope STR_3134 :{RED}(Design includes scenery which is unavailable) @@ -3185,19 +3188,19 @@ STR_3177 :Unable to de-select this object STR_3178 :At least one path object must be selected STR_3179 :At least one ride vehicle/attraction object must be selected STR_3180 :Invalid selection of objects -STR_3181 :Object Selection - {STRINGID} -STR_3182 :Park entrance type must be selected -STR_3183 :Water type must be selected -STR_3184 :Ride Vehicles/Attractions -STR_3185 :Small Scenery -STR_3186 :Large Scenery -STR_3187 :Walls/Fences -STR_3188 :Path Signs -STR_3189 :Footpaths -STR_3190 :Path Extras -STR_3191 :Scenery Groups -STR_3192 :Park Entrance -STR_3193 :Water +STR_3181 :物件選擇 - {STRINGID} +STR_3182 :必須選擇樂園入口類別 +STR_3183 :必須選擇水塘類別 +STR_3184 :遊樂設施/其車輛 +STR_3185 :小型景物 +STR_3186 :大型景物 +STR_3187 :牆壁/柵欄 +STR_3188 :道路指示牌 +STR_3189 :道路 +STR_3190 :額外的道路物件 +STR_3191 :景物組別 +STR_3192 :樂園入口 +STR_3193 :水塘 STR_3194 :Scenario Description STR_3195 :Invention List STR_3196 :{WINDOW_COLOUR_2}Research Group: {BLACK}{STRINGID} @@ -3205,17 +3208,17 @@ STR_3197 :{WINDOW_COLOUR_2}Items pre-invented at start of game: STR_3198 :{WINDOW_COLOUR_2}Items to invent during game: STR_3199 :Random Shuffle STR_3200 :{SMALLFONT}{BLACK}Randomly shuffle the list of items to invent during the game -STR_3201 :Object Selection -STR_3202 :Landscape Editor -STR_3203 :Invention List Set Up -STR_3204 :Options Selection -STR_3205 :Objective Selection -STR_3206 :Save Scenario -STR_3207 :Roller Coaster Designer -STR_3208 :Track Designs Manager -STR_3209 :Back to Previous Step: -STR_3210 :Forward to Next Step: -STR_3211 :{WINDOW_COLOUR_2}Map size: +STR_3201 :選取物件 +STR_3202 :編輯地勢 +STR_3203 :設定研發清單 +STR_3204 :選取選項 +STR_3205 :選取目標 +STR_3206 :儲存劇情 +STR_3207 :雲霄飛車設計工具 +STR_3208 :軌道設計管理工具 +STR_3209 :上一步: +STR_3210 :下一步: +STR_3211 :{WINDOW_COLOUR_2}地圖大小: STR_3212 :{POP16}{COMMA16} x {PUSH16}{COMMA16} STR_3213 :Can't decrease map size any further STR_3214 :Can't increase map size any further @@ -3231,7 +3234,7 @@ STR_3223 :{SMALLFONT}{BLACK}Set land to be available to purchase by the park STR_3224 :{SMALLFONT}{BLACK}Set construction rights to be available to purchase by the park STR_3225 :{SMALLFONT}{BLACK}Toggle on/off building a random cluster of objects around the selected position STR_3226 :{SMALLFONT}{BLACK}Build park entrance -STR_3227 :Too many park entrances! +STR_3227 :太多樂園入口! STR_3228 :{SMALLFONT}{BLACK}Set starting positions for people STR_3229 :Block Brakes cannot be used directly after station STR_3230 :Block Brakes cannot be used directly after each other @@ -3339,9 +3342,9 @@ STR_3331 :Path from park entrance to map edge either not complete or too comp STR_3332 :Park entrance is the wrong way round or has no path leading to the map edge STR_3333 :Export plug-in objects with saved games STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data -STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles -STR_3336 :Track Designs Manager - Select Ride Type -STR_3337 :Six Flags Park +STR_3335 :雲霄飛車設計工具 - 選擇要設計的雲霄飛車的類型及車輛種類 +STR_3336 :軌道設計管理工具 - 選擇要管理的遊樂設施的類型 +STR_3337 :六旗樂園 STR_3338 :{BLACK}Custom-designed layout STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout @@ -3481,15 +3484,15 @@ STR_5144 :加快速度 STR_5145 :更快速度 STR_5146 :超快速度 STR_5147 :在工具列顯示"密技"按鈕 -STR_5148 :{SMALLFONT}{BLACK}Change the game speed -STR_5149 :{SMALLFONT}{BLACK}Open the cheats window +STR_5148 :{SMALLFONT}{BLACK}改變遊戲速度 +STR_5149 :{SMALLFONT}{BLACK}開啟密技視窗 STR_5150 :啟用除錯工具 STR_5151 :, STR_5152 :. STR_5153 :編輯配色主題... STR_5154 :使用硬體顯示 STR_5155 :容許測試未建造好的軌道設計 -STR_5156 :{SMALLFONT}{BLACK}Allows testing of most ride types even when the track is unfinished, does not apply to block sectioned modes +STR_5156 :{SMALLFONT}{BLACK}容許測試大部份軌道設計, 即使未建造好的也可以. 但不能適用於區域煞車模式 STR_5157 :允許設置進入樂園及乘坐遊樂設施的價格 STR_5158 :回到主選單 STR_5159 :離開OpenRCT2 @@ -3511,10 +3514,10 @@ STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news f STR_5175 :Input the name of your Twitch channel STR_5176 :Enable Twitch integration STR_5177 :全屏幕模式: -STR_5178 :{SMALLFONT}{BLACK}Show financial cheats -STR_5179 :{SMALLFONT}{BLACK}Show guest cheats -STR_5180 :{SMALLFONT}{BLACK}Show park cheats -STR_5181 :{SMALLFONT}{BLACK}Show ride cheats +STR_5178 :{SMALLFONT}{BLACK}顯示用於財政的密技 +STR_5179 :{SMALLFONT}{BLACK}顯示用於遊客的密技 +STR_5180 :{SMALLFONT}{BLACK}顯示用於樂園的密技 +STR_5181 :{SMALLFONT}{BLACK}顯示用於設施的密技 STR_5182 :{INT32} STR_5183 :Base height STR_5184 :Enter base height between {COMMA16} and {COMMA16} @@ -3543,19 +3546,19 @@ STR_5206 :遊客列表 STR_5207 :員工 STR_5208 :員工列表 STR_5209 :橫額 -STR_5210 :Object Selection -STR_5211 :Invention List -STR_5212 :Scenario Options -STR_5213 :Objective Options -STR_5214 :Map Generation -STR_5215 :Track Design Manager -STR_5216 :Track Design Manager List +STR_5210 :選取物件 +STR_5211 :研發列表 +STR_5212 :劇情選項 +STR_5213 :目標選項 +STR_5214 :生成地圖 +STR_5215 :軌道設計管理工具 +STR_5216 :軌道設計管理工具列表 STR_5217 :密技 -STR_5218 :Themes -STR_5219 :Options -STR_5220 :Keyboard Shortcuts +STR_5218 :主題 +STR_5219 :選項 +STR_5220 :鍵盤快鍵盤 STR_5221 :Change Keyboard Shortcut -STR_5222 :Load/Save +STR_5222 :載入/儲存 STR_5223 :Save Prompt STR_5224 :Demolish Ride Prompt STR_5225 :Fire Staff Prompt @@ -3608,9 +3611,9 @@ STR_5271 :{SMALLFONT}{BLACK}Twitch STR_5272 :{SMALLFONT}{BLACK}Small Scenery STR_5273 :{SMALLFONT}{BLACK}Large Scenery STR_5274 :{SMALLFONT}{BLACK}Footpath -STR_5275 :Search for Objects -STR_5276 :Enter the name of an object to search for -STR_5277 :Clear +STR_5275 :搜尋物件 +STR_5276 :請輸入你要搜尋的物件名稱 +STR_5277 :清除 STR_5278 :沙盒模式 STR_5279 :沙盒模式關閉 STR_5280 :{SMALLFONT}{BLACK}Allow editing land ownership settings through the Map window and other options that are normally restricted to the Scenario Editor @@ -3620,17 +3623,17 @@ STR_5283 :RCT1 Park Open/Close Lights STR_5284 :RCT1 Scenario Selection Font STR_5285 :人肉炸彈!!! STR_5286 :{SMALLFONT}{BLACK}將某些遊客爆炸,嘻嘻! -STR_5287 :Ride is already broken down -STR_5288 :Ride is closed -STR_5289 :No breakdowns available for this ride +STR_5287 :遊樂設施已經故障了 +STR_5288 :遊樂設施已關閉了 +STR_5289 :沒有故障可適用於此遊樂設施 STR_5290 :修復遊樂設施 -STR_5291 :Can't force breakdown -STR_5292 :{SMALLFONT}{BLACK}Force a breakdown -STR_5293 :{SMALLFONT}{BLACK}Close ride/attraction -STR_5294 :{SMALLFONT}{BLACK}Test ride/attraction -STR_5295 :{SMALLFONT}{BLACK}Open ride/attraction -STR_5296 :{SMALLFONT}{BLACK}Close park -STR_5297 :{SMALLFONT}{BLACK}Open park +STR_5291 :不能強制令遊樂設施故障 +STR_5292 :{SMALLFONT}{BLACK}強制故障 +STR_5293 :{SMALLFONT}{BLACK}關閉遊樂設施/店鋪 +STR_5294 :{SMALLFONT}{BLACK}測試遊樂設施 +STR_5295 :{SMALLFONT}{BLACK}開啟遊樂設施/店鋪 +STR_5296 :{SMALLFONT}{BLACK}關閉樂園 +STR_5297 :{SMALLFONT}{BLACK}開放樂園 STR_5298 :{RED}{STRINGID} STR_5299 :{LIGHTPINK}{STRINGID} STR_5300 :{SMALLFONT}{BLACK}一鍵解僱員工 @@ -3644,7 +3647,7 @@ STR_5307 :夢幻遊樂場 (RCT1) (+資料片1&2 - AA+LL) STR_5308 :模擬樂園2 STR_5309 :OpenRCT2 STR_5310 :隨機 -STR_5311 :{SMALLFONT}{BLACK}Debug tools +STR_5311 :{SMALLFONT}{BLACK}除錯工具 STR_5312 :顯示命名行 STR_5313 :Show tile inspector STR_5314 :Tile inspector @@ -3801,3 +3804,10 @@ STR_5464 :一般 STR_5465 :氣候 STR_5466 :員工 STR_5467 :ALT + +STR_5468 :在工具列顯示"最近消息"的按鈕 +STR_5469 :Scroll map up +STR_5470 :Scroll map left +STR_5471 :Scroll map down +STR_5472 :Scroll map right +STR_5473 :日與夜循環 +STR_5474 :Display text on banners in upper case diff --git a/data/language/dutch.txt b/data/language/dutch.txt index d28b49b80d..f4f2c97668 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3450,8 +3450,8 @@ STR_3445 :Werkgebied instellen STR_3446 :Werkgebied wissen #Start van OpenRCT2-indices -STR_5120 :'Financiën'-knop in de werkbalk tonen -STR_5121 :'Onderzoek'-knop in de werkbalk tonen +STR_5120 :Financiën +STR_5121 :Onderzoek STR_5122 :Attracties op baantype sorteren STR_5123 :Attr. vernieuwen STR_5124 :Six Flags weg @@ -3477,7 +3477,7 @@ STR_5143 :Vlot STR_5144 :Hard STR_5145 :Turbo STR_5146 :Nitro -STR_5147 :'Cheats'-knop in de werkbalk tonen +STR_5147 :Cheats STR_5148 :{SMALLFONT}{BLACK}Spelsnelheid veranderen STR_5149 :{SMALLFONT}{BLACK}Het cheatsvenster openen STR_5150 :Debugging-hulpmiddelen inschakelen @@ -3601,7 +3601,7 @@ STR_5265 :{SMALLFONT}{BLACK}Selecteer uit welke bronnen objecten zichtbaar zi STR_5266 :{SMALLFONT}{BLACK}Weergave STR_5267 :{SMALLFONT}{BLACK}Landinstellingen STR_5268 :{SMALLFONT}{BLACK}Audio -STR_5269 :{SMALLFONT}{BLACK}Bediening +STR_5269 :{SMALLFONT}{BLACK}Bediening en interface STR_5270 :{SMALLFONT}{BLACK}Overig STR_5271 :{SMALLFONT}{BLACK}Twitch STR_5272 :{SMALLFONT}{BLACK}Klein decor @@ -3800,9 +3800,16 @@ STR_5464 :Algemeen STR_5465 :Weer STR_5466 :Werknemers STR_5467 :ALT + -STR_5468 :'Recente berichten'-knop in werkbalk tonen +STR_5468 :Recente berichten STR_5469 :Kaart naar boven scrollen STR_5470 :Kaart naar links scrollen STR_5471 :Kaart naar beneden scrollen STR_5472 :Kaart naar rechts scrollen STR_5473 :Dag-nachtcyclus +STR_5474 :Teksten op lichtkranten in hoofdletters tonen +STR_5476 :Hardware +STR_5477 :Kaartrendering +STR_5478 :Bediening +STR_5479 :Werkbalk +STR_5480 :Knoppen in de werkbalk tonen voor: +STR_5481 :Thema's diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 92a6b32598..1d44d5fa75 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -527,7 +527,7 @@ STR_0522 :A smaller roller coaster where the riders sit above the track with STR_0523 :Riders travel slowly in powered vehicles along a track-based route STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track -STR_0526 :Passengers travel in an rotating observation cabin which travels up a tall tower +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track @@ -839,16 +839,17 @@ STR_0834 :{SMALLFONT}{BLACK}Disk and game options STR_0835 :Game initialization failed STR_0836 :Unable to start game in a minimized state STR_0837 :Unable to initialize graphics system -STR_0838 :CD key code {INT32} is not valid for your RollerCoaster Tycoon 2 CD !{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Please un-install RollerCoaster Tycoon 2% and re-install with the correct CD Key Code +STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -STR_0841 :Desktop window -STR_0842 :640x480 full screen -STR_0843 :800x600 full screen -STR_0844 :1024x768 full screen -STR_0845 :1152x864 full screen -STR_0846 :1280x1024 full screen -STR_0847 :About 'RollerCoaster Tycoon 2' +# The following six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :About 'OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028 STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, all rights reserved @@ -1044,10 +1045,10 @@ STR_1039 :Install new track design STR_1040 :Save Game STR_1041 :Save Scenario STR_1042 :Save Landscape -STR_1043 :RollerCoaster Tycoon 2 Saved Game -STR_1044 :RollerCoaster Tycoon 2 Scenario File -STR_1045 :RollerCoaster Tycoon 2 Landscape File -STR_1046 :RollerCoaster Tycoon 2 Track Design File +STR_1043 :OpenRCT2 Saved Game +STR_1044 :OpenRCT2 Scenario File +STR_1045 :OpenRCT2 Landscape File +STR_1046 :OpenRCT2 Track Design File STR_1047 :Game save failed! STR_1048 :Scenario save failed! STR_1049 :Landscape save failed! @@ -1781,7 +1782,7 @@ STR_1776 :On STR_1777 :{WINDOW_COLOUR_2}Music STR_1778 :{STRINGID} - - STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume -STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tigre costume +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume @@ -1893,8 +1894,10 @@ STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hou STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride STR_1891 :No {STRINGID} in park yet! -STR_1892 :RollerCoaster Tycoon 2 -STR_1893 :Please insert your RollerCoaster Tycoon 2 CD in the following drive: +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}Build new ride/attraction STR_1896 :{WINDOW_COLOUR_2}Expenditure/Income @@ -2684,8 +2687,8 @@ STR_2678 :??? STR_2679 :??? STR_2680 :All research complete STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} -STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry -STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max +STR_2682 : +STR_2683 : STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive STR_2685 :Simplex Noise Parameters STR_2686 :{WINDOW_COLOUR_2}Low: @@ -2765,10 +2768,10 @@ STR_2757 :Force Sun STR_2758 :Force Thunder STR_2759 :Zero Clearance STR_2760 :+{CURRENCY} -STR_2761 :Pay For Entrance -STR_2762 :Pay For Rides +STR_2761 : +STR_2762 : STR_2763 :??? -STR_2764 :Happy Guests +STR_2764 : STR_2765 :Large Tram STR_2766 :Win scenario STR_2767 :Freeze Climate @@ -2866,7 +2869,7 @@ STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Constru STR_2856 :{WINDOW_COLOUR_2}Tutorial STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) STR_2858 :Can't start marketing campaign... -STR_2859 :Another instance of RollerCoaster Tycoon 2 is already running +STR_2859 :Another instance of OpenRCT2 is already running STR_2860 :Infogrames Interactive credits... STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. STR_2862 :Music acknowledgements... @@ -3167,8 +3170,8 @@ STR_3156 : STR_3157 :map STR_3158 :graph STR_3159 :list -STR_3160 :RollerCoaster Tycoon 2: Starting for the first time... -STR_3161 :RollerCoaster Tycoon 2: Checking object files... +STR_3160 : +STR_3161 : STR_3162 :Unable to allocate enough memory STR_3163 :Installing new data: STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) @@ -3456,8 +3459,8 @@ STR_3445 :Set Patrol Area STR_3446 :Cancel Patrol Area # New strings, cleaner -STR_5120 :Show finances button on toolbar -STR_5121 :Show research button on toolbar +STR_5120 :Finances +STR_5121 :Research STR_5122 :Select rides by track type (like in RCT1) STR_5123 :Renew rides STR_5124 :No Six Flags @@ -3483,7 +3486,7 @@ STR_5143 :Quick Speed STR_5144 :Fast Speed STR_5145 :Turbo Speed STR_5146 :Hyper Speed -STR_5147 :Show cheats button on toolbar +STR_5147 :Cheats STR_5148 :{SMALLFONT}{BLACK}Change the game speed STR_5149 :{SMALLFONT}{BLACK}Open the cheats window STR_5150 :Enable debugging tools @@ -3491,7 +3494,7 @@ STR_5150 :Enable debugging tools STR_5151 :, #Decimals separator STR_5152 :. -STR_5153 :Color schemes... +STR_5153 :Edit Themes... 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 @@ -3607,7 +3610,7 @@ STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible STR_5266 :{SMALLFONT}{BLACK}Display STR_5267 :{SMALLFONT}{BLACK}Culture and Units STR_5268 :{SMALLFONT}{BLACK}Audio -STR_5269 :{SMALLFONT}{BLACK}Controls +STR_5269 :{SMALLFONT}{BLACK}Controls and interface STR_5270 :{SMALLFONT}{BLACK}Miscellaneous STR_5271 :{SMALLFONT}{BLACK}Twitch STR_5272 :{SMALLFONT}{BLACK}Small Scenery @@ -3699,7 +3702,7 @@ STR_5357 :{BLACK}Nausea tolerance: STR_5358 :{BLACK}Bathroom: STR_5359 :Remove guests STR_5360 :{SMALLFONT}{BLACK}Removes all guests from the map -STR_5361 :{BLACK}Give all guests: +STR_5361 :Give all guests: STR_5362 :{BLACK}Set all guests' preferred ride intensity to: STR_5363 :More than 1 STR_5364 :Less than 15 @@ -3805,3 +3808,17 @@ STR_5463 :Goal: Have fun! STR_5464 :General STR_5465 :Climate STR_5466 :Staff +STR_5467 :ALT + +STR_5468 :Recent messages +STR_5469 :Scroll map up +STR_5470 :Scroll map left +STR_5471 :Scroll map down +STR_5472 :Scroll map right +STR_5473 :Cycle day / night +STR_5474 :Display text on banners in upper case +STR_5476 :Hardware +STR_5477 :Map rendering +STR_5478 :Controls +STR_5479 :Toolbar +STR_5480 :Show toolbar buttons for: +STR_5481 :Themes diff --git a/data/language/french.txt b/data/language/french.txt index 3322f1656a..6d0530e147 100644 --- a/data/language/french.txt +++ b/data/language/french.txt @@ -3,97 +3,97 @@ # Use # at the beginning of a line to leave a comment. STR_0000 : STR_0001 :{STRINGID} {COMMA16} -STR_0002 :Attraction -STR_0003 :Attraction +STR_0002 :Spiral Roller Coaster +STR_0003 :Stand-up Roller Coaster STR_0004 :Suspended Swinging Coaster -STR_0005 :Attraction +STR_0005 :Inverted Roller Coaster STR_0006 :Junior Roller Coaster STR_0007 :Miniature Railway STR_0008 :Monorail STR_0009 :Mini Suspended Coaster -STR_0010 :Attraction -STR_0011 :Attraction -STR_0012 :Attraction +STR_0010 :Boat Hire +STR_0011 :Wooden Wild Mouse +STR_0012 :Steeplechase STR_0013 :Car Ride -STR_0014 :Attraction -STR_0015 :Attraction -STR_0016 :Attraction +STR_0014 :Launched Freefall +STR_0015 :Bobsleigh Coaster +STR_0016 :Observation Tower STR_0017 :Looping Roller Coaster -STR_0018 :Attraction -STR_0019 :Attraction +STR_0018 :Dinghy Slide +STR_0019 :Mine Train Coaster STR_0020 :Chairlift -STR_0021 :Attraction -STR_0022 :Attraction -STR_0023 :Attraction -STR_0024 :Attraction -STR_0025 :Attraction -STR_0026 :Attraction -STR_0027 :Attraction -STR_0028 :Attraction -STR_0029 :Attraction -STR_0030 :Stall -STR_0031 :Stall -STR_0032 :Stall -STR_0033 :Stall -STR_0034 :Stall -STR_0035 :Attraction -STR_0036 :Stall -STR_0037 :Kiosk -STR_0038 :Toilettes -STR_0039 :Attraction -STR_0040 :Attraction -STR_0041 :Attraction -STR_0042 :Attraction -STR_0043 :Attraction +STR_0021 :Corkscrew Roller Coaster +STR_0022 :Maze +STR_0023 :Spiral Slide +STR_0024 :Go Karts +STR_0025 :Log Flume +STR_0026 :River Rapids +STR_0027 :Dodgems +STR_0028 :Pirate Ship +STR_0029 :Swinging Inverter Ship +STR_0030 :Food Stall +STR_0031 :Unknown Stall (1D) +STR_0032 :Drink Stall +STR_0033 :Unknown Stall (1F) +STR_0034 :Shop +STR_0035 :Merry-Go-Round +STR_0036 :Unknown Stall (22) +STR_0037 :Information Kiosk +STR_0038 :Toilets +STR_0039 :Ferris Wheel +STR_0040 :Motion Simulator +STR_0041 :3D Cinema +STR_0042 :Top Spin +STR_0043 :Space Rings STR_0044 :Reverse Freefall Coaster STR_0045 :Lift -STR_0046 :Attraction -STR_0047 :Attraction -STR_0048 :Attraction -STR_0049 :Attraction -STR_0050 :Attraction -STR_0051 :Attraction -STR_0052 :Attraction -STR_0053 :Hyper-Twister Roller Coaster +STR_0046 :Vertical Drop Roller Coaster +STR_0047 :Cash Machine +STR_0048 :Twist +STR_0049 :Haunted House +STR_0050 :First Aid Room +STR_0051 :Circus Show +STR_0052 :Ghost Train +STR_0053 :Steel Twister Roller Coaster STR_0054 :Wooden Roller Coaster STR_0055 :Side-Friction Roller Coaster STR_0056 :Wild Mouse STR_0057 :Multi-Dimension Roller Coaster -STR_0058 :Attraction -STR_0059 :Aerial Inverted Roller Coaster -STR_0060 :Attraction -STR_0061 :Attraction -STR_0062 :Attraction -STR_0063 :Attraction -STR_0064 :Attraction +STR_0058 :Unknown Ride (38) +STR_0059 :Flying Roller Coaster +STR_0060 :Unknown Ride (3A) +STR_0061 :Virginia Reel +STR_0062 :Splash Boats +STR_0063 :Mini Helicopters +STR_0064 :Lay-down Roller Coaster STR_0065 :Suspended Monorail -STR_0066 :Attraction -STR_0067 :Attraction +STR_0066 :Unknown Ride (40) +STR_0067 :Reverser Roller Coaster STR_0068 :Heartline Twister Coaster -STR_0069 :Attraction -STR_0070 :Attraction -STR_0071 :Attraction -STR_0072 :Attraction -STR_0073 :Attraction -STR_0074 :Attraction -STR_0075 :Attraction +STR_0069 :Mini Golf +STR_0070 :Giga Coaster +STR_0071 :Roto-Drop +STR_0072 :Flying Saucers +STR_0073 :Crooked House +STR_0074 :Monorail Cycles +STR_0075 :Compact Inverted Coaster STR_0076 :Water Coaster -STR_0077 :Attraction -STR_0078 :Attraction -STR_0079 :Attraction -STR_0080 :Attraction -STR_0081 :Attraction -STR_0082 :Attraction -STR_0083 :Attraction -STR_0084 :Attraction -STR_0085 :Attraction -STR_0086 :Attraction -STR_0087 :Attraction -STR_0088 :Attraction +STR_0077 :Air Powered Vertical Coaster +STR_0078 :Inverted Hairpin Coaster +STR_0079 :Magic Carpet +STR_0080 :Submarine Ride +STR_0081 :River Rafts +STR_0082 :Unknown Ride (50) +STR_0083 :Enterprise +STR_0084 :Unknown Ride (52) +STR_0085 :Unknown Ride (53) +STR_0086 :Unknown Ride (54) +STR_0087 :Unknown Ride (55) +STR_0088 :Inverted Impulse Coaster STR_0089 :Mini Roller Coaster -STR_0090 :Attraction -STR_0091 :Attraction -STR_0092 :Attraction +STR_0090 :Mine Ride +STR_0091 :Unknown Ride (59) +STR_0092 :LIM Launched Roller Coaster STR_0093 : STR_0094 : STR_0095 : @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 : -STR_0513 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :A looping roller coaster where the riders ride in a standing position STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners -STR_0515 : +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track STR_0518 :Passengers travel in electric trains along a monorail track STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners -STR_0520 : -STR_0521 : -STR_0522 : +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them STR_0523 :Riders travel slowly in powered vehicles along a track-based route -STR_0524 : -STR_0525 : -STR_0526 : +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops -STR_0528 : -STR_0529 : +STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again -STR_0531 : +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_0532 : STR_0533 : -STR_0534 : -STR_0535 : -STR_0536 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids STR_0537 : STR_0538 : STR_0539 : @@ -556,14 +556,14 @@ STR_0551 : STR_0552 : STR_0553 : STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station -STR_0555 : -STR_0556 : +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity @@ -572,38 +572,38 @@ STR_0567 :Sitting in seats suspended either side of the track, riders are pit STR_0568 : STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air STR_0570 : -STR_0571 : -STR_0572 : -STR_0573 : -STR_0574 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground STR_0575 :Powered trains hanging from a single rail transport people around the park STR_0576 : -STR_0577 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists STR_0579 : STR_0580 : STR_0581 : STR_0582 : STR_0583 : -STR_0584 : -STR_0585 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections -STR_0587 : -STR_0588 : +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops STR_0589 : -STR_0590 : -STR_0591 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track STR_0599 :A compact roller coaster with individual cars and smooth twisting drops -STR_0600 : +STR_0600 :Powered mine trains career along a smooth and twisted track layout STR_0601 : -STR_0602 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions STR_0603 :Visiteur {INT32} STR_0604 :Visiteur {INT32} STR_0605 :Visiteur {INT32} @@ -837,18 +837,19 @@ STR_0832 :{SMALLFONT}{BLACK}Rotate view 90{DEGREE} clockwise STR_0833 :{SMALLFONT}{BLACK}Pause game STR_0834 :{SMALLFONT}{BLACK}Disk and game options STR_0835 :Game initialization failed -STR_0836 :Unable to start game in a minimized state -STR_0837 :Unable to initialize graphics system -STR_0838 :CD key code {INT32} is not valid for your RollerCoaster Tycoon 2 CD !{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Please un-install RollerCoaster Tycoon 2% and re-install with the correct CD Key Code +STR_0836 :Unable to start game in a minimised state +STR_0837 :Unable to initialise graphics system +STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -STR_0841 :En une fenêtre -STR_0842 :640x480 plein écran -STR_0843 :800x600 plein écran -STR_0844 :1024x768 plein écran -STR_0845 :1152x864 plein écran -STR_0846 :1280x1024 plein écran -STR_0847 :A propos 'RollerCoaster Tycoon 2' +# The follwing six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :A propos 'OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028 STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, tous droits réservés @@ -977,7 +978,7 @@ STR_0972 :Annuler STR_0973 :OK STR_0974 :Rides STR_0975 :Shops and Stalls -STR_0976 :Restrooms and Information Kiosks +STR_0976 :Toilets and Information Kiosks STR_0977 :New Transport Rides STR_0978 :New Gentle Rides STR_0979 :Nouvelles montagnes russes @@ -1044,10 +1045,10 @@ STR_1039 :Install new track design STR_1040 :Sauvegarder la partie STR_1041 :Sauvegarder le scénario STR_1042 :Save Landscape -STR_1043 :RollerCoaster Tycoon 2 Saved Game -STR_1044 :RollerCoaster Tycoon 2 Scenario File -STR_1045 :RollerCoaster Tycoon 2 Landscape File -STR_1046 :RollerCoaster Tycoon 2 Track Design File +STR_1043 :OpenRCT2 Saved Game +STR_1044 :OpenRCT2 Scenario File +STR_1045 :OpenRCT2 Landscape File +STR_1046 :OpenRCT2 Track Design File STR_1047 :Game save failed! STR_1048 :Scenario save failed! STR_1049 :Landscape save failed! @@ -1103,13 +1104,13 @@ STR_1098 :Moving to end of {POP16}{STRINGID} STR_1099 :Waiting for passengers at {POP16}{STRINGID} STR_1100 :Waiting to depart {POP16}{STRINGID} STR_1101 :Departing {POP16}{STRINGID} -STR_1102 :Traveling at {VELOCITY} +STR_1102 :Travelling at {VELOCITY} STR_1103 :Arriving at {POP16}{STRINGID} STR_1104 :Unloading passengers at {POP16}{STRINGID} -STR_1105 :Traveling at {VELOCITY} +STR_1105 :Travelling at {VELOCITY} STR_1106 :Crashing! STR_1107 :Crashed! -STR_1108 :Traveling at {VELOCITY} +STR_1108 :Travelling at {VELOCITY} STR_1109 :Swinging STR_1110 :Rotating STR_1111 :Rotating @@ -1121,7 +1122,7 @@ STR_1116 :Operating STR_1117 :Doing circus show STR_1118 :Operating STR_1119 :Waiting for cable lift -STR_1120 :Traveling at {VELOCITY} +STR_1120 :Travelling at {VELOCITY} STR_1121 :Stopping STR_1122 :Waiting for passengers STR_1123 :Waiting to start @@ -1130,18 +1131,18 @@ STR_1125 :Operating STR_1126 :Stopping STR_1127 :Unloading passengers STR_1128 :Stopped by block brakes -STR_1129 :All vehicles in same colors -STR_1130 :Different colors per {STRINGID} -STR_1131 :Different colors per vehicle +STR_1129 :All vehicles in same colours +STR_1130 :Different colours per {STRINGID} +STR_1131 :Different colours per vehicle STR_1132 :Vehicle {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1133 :Vehicle {POP16}{COMMA16} STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} STR_1135 :{STRINGID} {COMMA16} -STR_1136 :{SMALLFONT}{BLACK}Select main color -STR_1137 :{SMALLFONT}{BLACK}Select additional color 1 -STR_1138 :{SMALLFONT}{BLACK}Select additional color 2 -STR_1139 :{SMALLFONT}{BLACK}Select support structure color -STR_1140 :{SMALLFONT}{BLACK}Select vehicle color scheme option +STR_1136 :{SMALLFONT}{BLACK}Select main colour +STR_1137 :{SMALLFONT}{BLACK}Select additional colour 1 +STR_1138 :{SMALLFONT}{BLACK}Select additional colour 2 +STR_1139 :{SMALLFONT}{BLACK}Select support structure colour +STR_1140 :{SMALLFONT}{BLACK}Select vehicle colour scheme option STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} @@ -1185,7 +1186,7 @@ STR_1180 :Can't build this underwater! STR_1181 :Allées STR_1182 :Type STR_1183 :Direction -STR_1184 :Direction +STR_1184 :Slope STR_1185 :{SMALLFONT}{BLACK}Direction STR_1186 :{SMALLFONT}{BLACK}Slope down STR_1187 :{SMALLFONT}{BLACK}Level @@ -1216,20 +1217,20 @@ STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time: STR_1212 :{WINDOW_COLOUR_2}Maximum waiting time: STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing -STR_1215 :{WINDOW_COLOUR_2}Synchronize with adjacent stations -STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronize departure with all adjacent stations (for 'racing') +STR_1215 :{WINDOW_COLOUR_2}Synchronise with adjacent stations +STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronise departure with all adjacent stations (for 'racing') STR_1217 :{COMMA16} secondes STR_1218 :{BLACK}{SMALLUP} STR_1219 :{BLACK}{SMALLDOWN} STR_1220 :Exit only STR_1221 :No entrance STR_1222 :No exit -STR_1223 :{SMALLFONT}{BLACK}Transport rides -STR_1224 :{SMALLFONT}{BLACK}Gentle rides -STR_1225 :{SMALLFONT}{BLACK}Roller coasters -STR_1226 :{SMALLFONT}{BLACK}Thrill rides -STR_1227 :{SMALLFONT}{BLACK}Water rides -STR_1228 :{SMALLFONT}{BLACK}Shops & stalls +STR_1223 :{SMALLFONT}{BLACK}Attractions de transport +STR_1224 :{SMALLFONT}{BLACK}Attractions tranquilles +STR_1225 :{SMALLFONT}{BLACK}Montagnes russes +STR_1226 :{SMALLFONT}{BLACK}Attractions frisson +STR_1227 :{SMALLFONT}{BLACK}Attractions aquatiques +STR_1228 :{SMALLFONT}{BLACK}Magasins et boutiques STR_1229 :train STR_1230 :trains STR_1231 :Train @@ -1397,7 +1398,7 @@ STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options STR_1394 :{SMALLFONT}{BLACK}Operating options STR_1395 :{SMALLFONT}{BLACK}Maintenance options -STR_1396 :{SMALLFONT}{BLACK}Color scheme options +STR_1396 :{SMALLFONT}{BLACK}Colour scheme options STR_1397 :{SMALLFONT}{BLACK}Sound & music options STR_1398 :{SMALLFONT}{BLACK}Measurements and test data STR_1399 :{SMALLFONT}{BLACK}Graphs @@ -1526,9 +1527,9 @@ STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} -STR_1525 :{SMALLFONT}{OPENQUOTES}These fries from {STRINGID} are really good value{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} -STR_1527 :{SMALLFONT}{OPENQUOTES}This cotton candy from {STRINGID} is really good value{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} STR_1528 : STR_1529 : STR_1530 : @@ -1538,9 +1539,9 @@ STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} -STR_1537 :{SMALLFONT}{OPENQUOTES}This candy apple from {STRINGID} is really good value{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}This toffee apple from {STRINGID} is really good value{ENDQUOTES} STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} -STR_1539 :{SMALLFONT}{OPENQUOTES}This donut from {STRINGID} is really good value{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}This doughnut from {STRINGID} is really good value{ENDQUOTES} STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} STR_1541 : STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} @@ -1560,9 +1561,9 @@ STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride phot STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} -STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fries from {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} -STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for cotton candy from {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} STR_1562 : STR_1563 : STR_1564 : @@ -1572,9 +1573,9 @@ STR_1567 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for popcorn from {S STR_1568 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hot dog from {STRINGID}{ENDQUOTES} STR_1569 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for tentacle from {STRINGID}{ENDQUOTES} STR_1570 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hat from {STRINGID}{ENDQUOTES} -STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a candy apple from {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a toffee apple from {STRINGID}{ENDQUOTES} STR_1572 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a T-shirt from {STRINGID}{ENDQUOTES} -STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a donut from {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a doughnut from {STRINGID}{ENDQUOTES} STR_1574 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for coffee from {STRINGID}{ENDQUOTES} STR_1575 : STR_1576 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried chicken from {STRINGID}{ENDQUOTES} @@ -1658,7 +1659,7 @@ STR_1653 :{SMALLFONT}{OPENQUOTES}...and here we are on {STRINGID}!{ENDQUOTES} STR_1654 :{WINDOW_COLOUR_2}Recent thoughts: STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land STR_1656 :{SMALLFONT}{BLACK}Construct bridge or tunnel footpath -STR_1657 :{WINDOW_COLOUR_2}Attraction favorite +STR_1657 :{WINDOW_COLOUR_2}Attraction favourite STR_1658 :{WINDOW_COLOUR_2}intensity: {BLACK}less than {COMMA16} STR_1659 :{WINDOW_COLOUR_2}intensité: {BLACK}entre {COMMA16} et {COMMA16} STR_1660 :{WINDOW_COLOUR_2}intensity: {BLACK}more than {COMMA16} @@ -1754,7 +1755,7 @@ STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DUR STR_1750 :{DURATION} STR_1751 :Can't change time limit for ride... STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park -STR_1753 :{SMALLFONT}{BLACK}Show summarized list of guests in park +STR_1753 :{SMALLFONT}{BLACK}Show summarised list of guests in park STR_1754 :{BLACK}{COMMA16} guests STR_1755 :{BLACK}{COMMA16} guest STR_1756 :{WINDOW_COLOUR_2}Admission price: @@ -1781,7 +1782,7 @@ STR_1776 :On STR_1777 :{WINDOW_COLOUR_2}Music STR_1778 :{STRINGID} - - STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume -STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tigre costume +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume @@ -1791,8 +1792,8 @@ STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume -STR_1790 :{SMALLFONT}{BLACK}Select uniform color for this type of staff -STR_1791 :{WINDOW_COLOUR_2}Uniform color: +STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff +STR_1791 :{WINDOW_COLOUR_2}Uniform colour: STR_1792 :Responding to {STRINGID} breakdown call STR_1793 :Heading to {STRINGID} for an inspection STR_1794 :Fixing {STRINGID} @@ -1859,7 +1860,7 @@ STR_1854 :{WINDOW_COLOUR_2}Built: {BLACK}Last Year STR_1855 :{WINDOW_COLOUR_2}Built: {BLACK}{COMMA16} Years Ago STR_1856 :{WINDOW_COLOUR_2}Profit per item sold: {BLACK}{CURRENCY2DP} STR_1857 :{WINDOW_COLOUR_2}Loss per item sold: {BLACK}{CURRENCY2DP} -STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} per month +STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY2DP} per month STR_1859 :Handymen STR_1860 :Mécaniciens STR_1861 :Security Guards @@ -1874,8 +1875,8 @@ STR_1869 :{WINDOW_COLOUR_2}Number of rotations: STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1872 :{COMMA16} -STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY} per hour -STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY} per hour +STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY2DP} per hour +STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides @@ -1893,8 +1894,10 @@ STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hou STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride STR_1891 :No {STRINGID} in park yet! -STR_1892 :RollerCoaster Tycoon 2 -STR_1893 :Please insert your RollerCoaster Tycoon 2 CD in the following drive: +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}Build new ride/attraction STR_1896 :{WINDOW_COLOUR_2}Dépenses/Revenus @@ -1941,7 +1944,7 @@ STR_1936 :{STRINGID} has bought {STRINGID} STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message STR_1938 :{SMALLFONT}{BLACK}Show view of guest STR_1939 :{SMALLFONT}{BLACK}Show view of staff member -STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this gugest +STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this guest STR_1941 :{SMALLFONT}{BLACK}Show which rides this guest has been on STR_1942 :{SMALLFONT}{BLACK}Show financial information about this guest STR_1943 :{SMALLFONT}{BLACK}Show guest's recent thoughts @@ -1968,9 +1971,9 @@ STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: STR_1964 :{WINDOW_COLOUR_2}Umbrella price: STR_1965 :{WINDOW_COLOUR_2}Drink price: STR_1966 :{WINDOW_COLOUR_2}Burger price: -STR_1967 :{WINDOW_COLOUR_2}Fries price: +STR_1967 :{WINDOW_COLOUR_2}Chips price: STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: -STR_1969 :{WINDOW_COLOUR_2}Cotton Candy price: +STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: STR_1970 :{WINDOW_COLOUR_2} STR_1971 :{WINDOW_COLOUR_2} STR_1972 :{WINDOW_COLOUR_2} @@ -1980,9 +1983,9 @@ STR_1975 :{WINDOW_COLOUR_2}Popcorn price: STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: STR_1977 :{WINDOW_COLOUR_2}Tentacle price: STR_1978 :{WINDOW_COLOUR_2}Hat price: -STR_1979 :{WINDOW_COLOUR_2}Candy Apple price: +STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: -STR_1981 :{WINDOW_COLOUR_2}Donut price: +STR_1981 :{WINDOW_COLOUR_2}Doughnut price: STR_1982 :{WINDOW_COLOUR_2}Coffee price: STR_1983 :{WINDOW_COLOUR_2} STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: @@ -1996,9 +1999,9 @@ STR_1991 :On-Ride Photo STR_1992 :Umbrella STR_1993 :Drink STR_1994 :Burger -STR_1995 :Fries +STR_1995 :Chips STR_1996 :Ice Cream -STR_1997 :Cotton Candy +STR_1997 :Candyfloss STR_1998 :Empty Can STR_1999 :Rubbish STR_2000 :Empty Burger Box @@ -2008,9 +2011,9 @@ STR_2003 :Popcorn STR_2004 :Hot Dog STR_2005 :Tentacle STR_2006 :Hat -STR_2007 :Candy Apple +STR_2007 :Toffee Apple STR_2008 :T-Shirt -STR_2009 :Donut +STR_2009 :Doughnut STR_2010 :Coffee STR_2011 :Empty Cup STR_2012 :Fried Chicken @@ -2024,9 +2027,9 @@ STR_2019 :On-Ride Photos STR_2020 :Umbrellas STR_2021 :Drinks STR_2022 :Burgers -STR_2023 :Fries +STR_2023 :Chips STR_2024 :Ice Creams -STR_2025 :Cotton Candy +STR_2025 :Candyfloss STR_2026 :Empty Cans STR_2027 :Rubbish STR_2028 :Empty Burger Boxes @@ -2036,9 +2039,9 @@ STR_2031 :Popcorn STR_2032 :Hot Dogs STR_2033 :Tentacles STR_2034 :Hats -STR_2035 :Candy Apples +STR_2035 :Toffee Apples STR_2036 :T-Shirts -STR_2037 :Donuts +STR_2037 :Doughnuts STR_2038 :Coffees STR_2039 :Empty Cups STR_2040 :Fried Chicken @@ -2052,9 +2055,9 @@ STR_2047 :an On-Ride Photo STR_2048 :an Umbrella STR_2049 :a Drink STR_2050 :a Burger -STR_2051 :some Fries +STR_2051 :some Chips STR_2052 :an Ice Cream -STR_2053 :some Cotton Candy +STR_2053 :some Candyfloss STR_2054 :an Empty Can STR_2055 :some Rubbish STR_2056 :an Empty Burger Box @@ -2064,9 +2067,9 @@ STR_2059 :some Popcorn STR_2060 :a Hot Dog STR_2061 :a Tentacle STR_2062 :a Hat -STR_2063 :a Candy Apple +STR_2063 :a Toffee Apple STR_2064 :a T-Shirt -STR_2065 :a Donut +STR_2065 :a Doughnut STR_2066 :a Coffee STR_2067 :an Empty Cup STR_2068 :some Fried Chicken @@ -2080,9 +2083,9 @@ STR_2075 :On-Ride Photo of {STRINGID} STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Umbrella STR_2077 :Drink STR_2078 :Burger -STR_2079 :Fries +STR_2079 :Chips STR_2080 :Ice Cream -STR_2081 :Cotton Candy +STR_2081 :Candyfloss STR_2082 :Empty Can STR_2083 :Rubbish STR_2084 :Empty Burger Box @@ -2092,9 +2095,9 @@ STR_2087 :Popcorn STR_2088 :Hot Dog STR_2089 :Tentacle STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hat -STR_2091 :Candy Apple +STR_2091 :Toffee Apple STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-Shirt -STR_2093 :Donut +STR_2093 :Doughnut STR_2094 :Coffee STR_2095 :Empty Cup STR_2096 :Fried Chicken @@ -2500,7 +2503,7 @@ STR_2495 :Cancel construction mode STR_2496 :Pause game STR_2497 :Zoom view out STR_2498 :Zoom view in -STR_2499 :Rotate view +STR_2499 :Rotate view clockwise STR_2500 :Rotate construction object STR_2501 :Underground view toggle STR_2502 :Remove base land toggle @@ -2682,10 +2685,10 @@ STR_2677 :??? STR_2678 :??? STR_2679 :??? STR_2680 :All research complete -STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 -STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry -STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max -STR_2684 :{MEDIUMFONT}{BLACK}Large group of peeps arrive +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2682 : +STR_2683 : +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive STR_2685 :Simplex Noise Parameters STR_2686 :{WINDOW_COLOUR_2}Low: STR_2687 :{WINDOW_COLOUR_2}High: @@ -2725,7 +2728,7 @@ STR_2720 :{UINT16}s STR_2721 :{UINT16}s STR_2722 :{UINT16}m {UINT16}s STR_2723 :{UINT16}m {UINT16}s -STR_2724 :{UINT16}mins:{UINT16}s +STR_2724 :{UINT16}m {UINT16}s STR_2725 :{UINT16}m {UINT16}s STR_2726 :{UINT16}m STR_2727 :{UINT16}m @@ -2762,11 +2765,11 @@ STR_2757 :Force Sun STR_2758 :Force Thunder STR_2759 :Zero Clearance # New strings used in the cheats window previously these were ??? -STR_2760 :+5000 d'argent -STR_2761 :Pay For Entrance -STR_2762 :Pay For Rides +STR_2760 :+{CURRENCY} +STR_2761 : +STR_2762 : STR_2763 :??? -STR_2764 :Happy Guests +STR_2764 : STR_2765 :Large Tram STR_2766 :Win scenario STR_2767 :Freeze Climate @@ -2814,7 +2817,7 @@ STR_2807 :{RED}Guests are complaining about the amount of litter in your park STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks -STR_2811 :{RED}Guests are complaining because they can't find the restrooms in your park +STR_2811 :{RED}Guests are complaining because they can't find the toilets in your park STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests STR_2814 :{WINDOW_COLOUR_2}Most untidy park award @@ -2827,11 +2830,11 @@ STR_2820 :{WINDOW_COLOUR_2}Safest park award STR_2821 :{WINDOW_COLOUR_2}Best staff award STR_2822 :{WINDOW_COLOUR_2}Best park food award STR_2823 :{WINDOW_COLOUR_2}Worst park food award -STR_2824 :{WINDOW_COLOUR_2}Best park restrooms award +STR_2824 :{WINDOW_COLOUR_2}Best park toilets award STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award STR_2826 :{WINDOW_COLOUR_2}Best water rides award STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award -STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride color schemes award +STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride colour schemes award STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award STR_2830 :{WINDOW_COLOUR_2}Best gentle ride award STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'! @@ -2844,11 +2847,11 @@ STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park i STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! -STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best restroom facilities in the country'! +STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best toilet facilities in the country'! STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water rides in the country'! STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed rides'! -STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of color schemes'! +STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of colour schemes'! STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle rides'! STR_2848 :{WINDOW_COLOUR_2}Pas de récompense récente @@ -2862,7 +2865,7 @@ STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Constru STR_2856 :{WINDOW_COLOUR_2}Didacticiel STR_2857 :{WINDOW_COLOUR_2}(Appuyez sur une touche ou un bouton de la souris pour essayer vous-même) STR_2858 :Can't start marketing campaign... -STR_2859 :Another instance of RollerCoaster Tycoon 2 is already running +STR_2859 :Another instance of OpenRCT2 is already running STR_2860 :Infogrames Interactive credits... STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. STR_2862 :Remerciements musique... @@ -2974,12 +2977,12 @@ STR_2967 : STR_2968 : STR_2969 :Use of this product is subject to the terms of a license agreement STR_2970 :found in the product's {OPENQUOTES}ReadMe{ENDQUOTES} file and in the manual -STR_2971 :Main color scheme -STR_2972 :Alternative color scheme 1 -STR_2973 :Alternative color scheme 2 -STR_2974 :Alternative color scheme 3 -STR_2975 :{SMALLFONT}{BLACK}Select which color scheme to change, or paint ride with -STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected color scheme +STR_2971 :Main colour scheme +STR_2972 :Alternative colour scheme 1 +STR_2973 :Alternative colour scheme 2 +STR_2974 :Alternative colour scheme 3 +STR_2975 :{SMALLFONT}{BLACK}Select which colour scheme to change, or paint ride with +STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected colour scheme STR_2977 :Staff member name STR_2978 :Enter new name for this member of staff: STR_2979 :Can't name staff member... @@ -2992,8 +2995,8 @@ STR_2985 :Banner STR_2986 :{SMALLFONT}{BLACK}Change text on banner STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for guests STR_2988 :{SMALLFONT}{BLACK}Demolish this banner -STR_2989 :{SMALLFONT}{BLACK}Select main color -STR_2990 :{SMALLFONT}{BLACK}Select text color +STR_2989 :{SMALLFONT}{BLACK}Select main colour +STR_2990 :{SMALLFONT}{BLACK}Select text colour STR_2991 :Sign STR_2992 :Sign text STR_2993 :Enter new text for this sign: @@ -3084,7 +3087,7 @@ STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! STR_3078 :Plain entrance STR_3079 :Wooden entrance STR_3080 :Canvas tent entrance -STR_3081 :Castle entrance (gray) +STR_3081 :Castle entrance (grey) STR_3082 :Castle entrance (brown) STR_3083 :Jungle entrance STR_3084 :Log cabin entrance @@ -3096,16 +3099,16 @@ STR_3089 :Space entrance STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station STR_3091 :You are not allowed to remove this section! STR_3092 :You are not allowed to move or modify the station for this ride! -STR_3093 :{WINDOW_COLOUR_2}Favorite: {BLACK}{STRINGID} +STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} STR_3094 :N/A STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed STR_3098 :Can't change lift hill speed... -STR_3099 :{SMALLFONT}{BLACK}Select color -STR_3100 :{SMALLFONT}{BLACK}Select second color -STR_3101 :{SMALLFONT}{BLACK}Select third color -STR_3102 :{SMALLFONT}{BLACK}Re-paint colored scenery on landscape +STR_3099 :{SMALLFONT}{BLACK}Select colour +STR_3100 :{SMALLFONT}{BLACK}Select second colour +STR_3101 :{SMALLFONT}{BLACK}Select third colour +STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape STR_3103 :Can't re-paint this... STR_3104 :{SMALLFONT}{BLACK}List rides STR_3105 :{SMALLFONT}{BLACK}List shops and stalls @@ -3125,8 +3128,8 @@ STR_3118 :{BLACK}{STRINGID} is heading for the ride STR_3119 :{BLACK}{STRINGID} is fixing the ride STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy -STR_3122 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guest -STR_3123 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guests +STR_3122 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guest +STR_3123 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guests STR_3124 :Broken {STRINGID} STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% @@ -3163,8 +3166,8 @@ STR_3156 : STR_3157 :plan STR_3158 :graphique STR_3159 :liste -STR_3160 :RollerCoaster Tycoon 2: Première visite... -STR_3161 :RollerCoaster Tycoon 2: Checking object files... +STR_3160 : +STR_3161 : STR_3162 :Unable to allocate enough memory STR_3163 :Installing new data: STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) @@ -3175,7 +3178,7 @@ STR_3168 :{WINDOW_COLOUR_2}Texte: {BLACK}{STRINGID} STR_3169 :Data for the following object not found: STR_3170 :Not enough space for graphics STR_3171 :Too many objects of this type selected -STR_3172 :The following object must be selected first: +STR_3172 :The following object must be selected first: {STRING} STR_3173 :This object is currently in use STR_3174 :This object is required by another object STR_3175 :This object is always required @@ -3450,10 +3453,11 @@ STR_3443 :Page 4 STR_3444 :Page 5 STR_3445 :Définir Zone de Patrouille STR_3446 :Annuler Zone de Patrouille + # New strings, cleaner -STR_5120 :Show finances button on toolbar -STR_5121 :Show research button on toolbar -STR_5122 :Show all vehicles sharing a track/ride type +STR_5120 :Finances +STR_5121 :Research +STR_5122 :Select rides by track type (like in RCT1) STR_5123 :Renouveler attr. STR_5124 :Pas de Six Flags STR_5125 :All destructable @@ -3478,7 +3482,7 @@ STR_5143 :Quick Speed STR_5144 :Fast Speed STR_5145 :Turbo Speed STR_5146 :Hyper Speed -STR_5147 :Show cheats button on toolbar +STR_5147 :Cheats STR_5148 :{SMALLFONT}{BLACK}Change the game speed STR_5149 :{SMALLFONT}{BLACK}Open the cheats window STR_5150 :Enable debugging tools @@ -3486,14 +3490,14 @@ STR_5150 :Enable debugging tools STR_5151 :. #Decimal separator STR_5152 :, -STR_5153 :Colour schemes... +STR_5153 :Thèmes... 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 STR_5157 :Unlock all prices STR_5158 :Quit to menu -STR_5159 :Exit OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} +STR_5159 :Quitter OpenRCT2 +STR_5160 :{MONTH} {STRINGID}, an {COMMA16} STR_5161 :Date Format: STR_5162 :Day/Month/Year STR_5163 :Month/Day/Year @@ -3536,10 +3540,10 @@ STR_5199 :Ride Construction STR_5200 :Track Design Place STR_5201 :New Ride STR_5202 :Track Design Selection -STR_5203 :Ride -STR_5204 :Ride List -STR_5205 :Guest -STR_5206 :Guest List +STR_5203 :Attraction +STR_5204 :Liste des attractions +STR_5205 :Visiteur +STR_5206 :Liste des visiteurs STR_5207 :Staff STR_5208 :Staff List STR_5209 :Banner @@ -3551,7 +3555,7 @@ STR_5214 :Map Generation STR_5215 :Track Design Manager STR_5216 :Track Design Manager List STR_5217 :Cheats -STR_5218 :Themes +STR_5218 :Thèmes STR_5219 :Options STR_5220 :Keyboard Shortcuts STR_5221 :Change Keyboard Shortcut @@ -3577,7 +3581,7 @@ STR_5240 :Enter a name for the theme STR_5241 :Can't change this theme STR_5242 :Theme name already exists STR_5243 :Invalid characters used -STR_5244 :Themes +STR_5244 :Thèmes STR_5245 :Top Toolbar STR_5246 :Bottom Toolbar STR_5247 :Track Editor Bottom Toolbar @@ -3587,8 +3591,8 @@ STR_5250 :Title Exit Button STR_5251 :Title Options Button STR_5252 :Title Scenario Selection STR_5253 :Park Information -STR_5254 :Add nausea -STR_5255 :{MEDIUMFONT}{BLACK}All peeps become nauseous +STR_5254 :Create +STR_5255 :{SMALLFONT}{BLACK}Create a new title sequence from scratch STR_5256 :Create a new theme to make changes to STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one STR_5258 :{SMALLFONT}{BLACK}Delete the current theme @@ -3602,7 +3606,7 @@ STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible STR_5266 :{SMALLFONT}{BLACK}Display STR_5267 :{SMALLFONT}{BLACK}Culture and Units STR_5268 :{SMALLFONT}{BLACK}Audio -STR_5269 :{SMALLFONT}{BLACK}Controls +STR_5269 :{SMALLFONT}{BLACK}Controls and interface STR_5270 :{SMALLFONT}{BLACK}Miscellaneous STR_5271 :{SMALLFONT}{BLACK}Twitch STR_5272 :{SMALLFONT}{BLACK}Small Scenery @@ -3611,3 +3615,206 @@ STR_5274 :{SMALLFONT}{BLACK}Footpaths STR_5275 :Search for Objects STR_5276 :Enter the name of an object to search for STR_5277 :Clear +STR_5278 :Sandbox mode +STR_5279 :Sandbox mode off +STR_5280 :{SMALLFONT}{BLACK}Allow editing land ownership settings through the Map window and other options that are normally restricted to the Scenario Editor +STR_5281 :{SMALLFONT}{BLACK}Features +STR_5282 :RCT1 Ride Open/Close Lights +STR_5283 :RCT1 Park Open/Close Lights +STR_5284 :RCT1 Scenario Selection Font +STR_5285 :EXPLODE!!! +STR_5286 :{SMALLFONT}{BLACK}Makes some guests explode +STR_5287 :Ride is already broken down +STR_5288 :Ride is closed +STR_5289 :No breakdowns available for this ride +STR_5290 :Fix ride +STR_5291 :Can't force breakdown +STR_5292 :{SMALLFONT}{BLACK}Force a breakdown +STR_5293 :{SMALLFONT}{BLACK}Close ride/attraction +STR_5294 :{SMALLFONT}{BLACK}Test ride/attraction +STR_5295 :{SMALLFONT}{BLACK}Open ride/attraction +STR_5296 :{SMALLFONT}{BLACK}Close park +STR_5297 :{SMALLFONT}{BLACK}Open park +STR_5298 :{RED}{STRINGID} +STR_5299 :{LIGHTPINK}{STRINGID} +STR_5300 :{SMALLFONT}{BLACK}Quick fire staff +STR_5301 :{MEDIUMFONT}{BLACK}Clear your loan +STR_5302 :Clear loan +STR_5303 :Allow building in pause mode +STR_5304 :Title Sequence: +STR_5305 :RollerCoaster Tycoon 1 +STR_5306 :RollerCoaster Tycoon 1 (AA) +STR_5307 :RollerCoaster Tycoon 1 (AA + LL) +STR_5308 :RollerCoaster Tycoon 2 +STR_5309 :OpenRCT2 +STR_5310 :Random +STR_5311 :{SMALLFONT}{BLACK}Debug tools +STR_5312 :Show console +STR_5313 :Show tile inspector +STR_5314 :Tile inspector +STR_5315 :Grass +STR_5316 :Sand +STR_5317 :Dirt +STR_5318 :Rock +STR_5319 :Martian +STR_5320 :Checkerboard +STR_5321 :Grass clumps +STR_5322 :Ice +STR_5323 :Grid (red) +STR_5324 :Grid (yellow) +STR_5325 :Grid (blue) +STR_5326 :Grid (green) +STR_5327 :Sand (dark) +STR_5328 :Sand (light) +STR_5329 :Checkerboard (inverted) +STR_5330 :Underground view +STR_5331 :Rock +STR_5332 :Wood (red) +STR_5333 :Wood (black) +STR_5334 :Ice +STR_5335 :Ride entrance +STR_5336 :Ride exit +STR_5337 :Park entrance +STR_5338 :Element type +STR_5339 :Base height +STR_5340 :Clearance height +STR_5341 :Flags +STR_5342 :Choose a map tile +STR_5343 :Automatically place staff +STR_5344 :Changelog +STR_5345 :Financial cheats +STR_5346 :Guest cheats +STR_5347 :Park cheats +STR_5348 :Ride cheats +STR_5349 :{SMALLFONT}{BLACK}All Rides +STR_5350 :Max +STR_5351 :Min +STR_5352 :{BLACK}Bonheur: +STR_5353 :{BLACK}Energie: +STR_5354 :{BLACK}Faim: +STR_5355 :{BLACK}Soif: +STR_5356 :{BLACK}Nausée: +STR_5357 :{BLACK}Tolérance nausée: +STR_5358 :{BLACK}Toilettes: +STR_5359 :Remove guests +STR_5360 :{SMALLFONT}{BLACK}Removes all guests from the map +STR_5361 :Give all guests: +STR_5362 :{BLACK}Set all guests' preferred ride intensity to: +STR_5363 :More than 1 +STR_5364 :Less than 15 +STR_5365 :{BLACK}Staff speed: +STR_5366 :Normal +STR_5367 :Fast +STR_5368 :Reset crash status +STR_5369 :Park parameters... +STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. +STR_5371 :Object Selection +STR_5372 :Invert right mouse dragging +STR_5373 :Nom {STRINGID} +STR_5374 :Date {STRINGID} +STR_5375 :{UP} +STR_5376 :{DOWN} +STR_5377 :{SMALLFONT}{BLACK}Saves +STR_5378 :{SMALLFONT}{BLACK}Script +STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command +STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence +STR_5381 :{SMALLFONT}{BLACK}Stop playing title sequence +STR_5382 :{SMALLFONT}{BLACK}Restart title sequence +STR_5383 :{SMALLFONT}{BLACK}Create a new title sequence based on the current one +STR_5384 :{SMALLFONT}{BLACK}Delete the current title sequence +STR_5385 :{SMALLFONT}{BLACK}Rename the current title sequence +STR_5386 :{SMALLFONT}{BLACK}Insert a new command +STR_5387 :{SMALLFONT}{BLACK}Edit the selected command +STR_5388 :{SMALLFONT}{BLACK}Delete the selected command +STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence +STR_5390 :{SMALLFONT}{BLACK}Move the selected command down +STR_5391 :{SMALLFONT}{BLACK}Move the selected command up +STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence +STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence +STR_5394 :{SMALLFONT}{BLACK}Rename the selected save +STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game +STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game +STR_5397 :Can only be used on the title screen +STR_5398 :Cannot edit title sequence while it's playing +STR_5399 :Press the stop button to continue editing +STR_5400 :Can't change this title sequence +STR_5401 :Create a new title sequence to make changes to +STR_5402 :Failed to load title sequence +STR_5403 :There may be no Load or Wait command or a save may be invalid +STR_5404 :Name already exists +STR_5405 :Enter a name for the save +STR_5406 :Enter a name for the title sequence +STR_5407 :Add +STR_5408 :Remove +STR_5409 :Insert +STR_5410 :Edit +STR_5411 :Reload +STR_5412 :Skip to +STR_5413 :Load +STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :Load{MOVE_X}{87}{STRING} +STR_5416 :Load{MOVE_X}{87}No save selected +STR_5417 :Location +STR_5418 :Location{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :Rotate +STR_5420 :Rotate{MOVE_X}{87}{COMMA16} +STR_5421 :Zoom +STR_5422 :Zoom{MOVE_X}{87}{COMMA16} +STR_5423 :Wait +STR_5424 :Wait{MOVE_X}{87}{COMMA16} +STR_5425 :Restart +STR_5426 :End +STR_5427 :Coordinates: +STR_5428 :Anticlockwise rotations: +STR_5429 :Zoom level: +STR_5430 :Seconds to wait: +STR_5431 :Save to load: +STR_5432 :Command: +STR_5433 :Title Sequences +STR_5434 :Command Editor +STR_5435 :Rename save +STR_5436 :Edit Title Sequences... +STR_5437 :No save selected +STR_5438 :Can't make changes while command editor is open +STR_5439 :A wait command with at least 4 seconds is required with a restart command +STR_5440 :Minimise fullscreen on focus loss +STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. +STR_5442 :Force park rating: +STR_5443 :Speed{MOVE_X}{87}{STRINGID} +STR_5444 :Speed: +STR_5445 :Speed +STR_5446 :Get +STR_5447 :Type {STRINGID} +STR_5448 :Ride / Vehicle {STRINGID} +STR_5449 :Reduce game speed +STR_5450 :Increase game speed +STR_5451 :Open cheats window +STR_5452 :Toggle visibility of toolbars +STR_5453 :Select another ride +STR_5454 :Uncap FPS +STR_5455 :Enable sandbox mode +STR_5456 :Disable clearance checks +STR_5457 :Disable support limits +STR_5458 :Rotate clockwise +STR_5459 :Rotate anti-clockwise +STR_5460 :Rotate view anti-clockwise +STR_5461 :Set guests' parameters +STR_5462 :{CURRENCY} +STR_5463 :Goal: Have fun! +STR_5464 :General +STR_5465 :Climate +STR_5466 :Staff +STR_5467 :ALT + +STR_5468 :Recent messages +STR_5469 :Scroll map up +STR_5470 :Scroll map left +STR_5471 :Scroll map down +STR_5472 :Scroll map right +STR_5473 :Cycle day / night +STR_5474 :Display text on banners in upper case +STR_5476 :Hardware +STR_5477 :Map rendering +STR_5478 :Controls +STR_5479 :Toolbar +STR_5480 :Show toolbar buttons for: +STR_5481 :Thèmes diff --git a/data/language/german.txt b/data/language/german.txt index 8e9ea3d3cd..762e5ee5f4 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -2438,11 +2438,11 @@ STR_2433 :{BLACK}Gutscheine für Gratis-{STRINGID} STR_2434 :{BLACK}Werbekampagne für {STRINGID} STR_2435 :{BLACK}Werbekampagne für {STRINGID} STR_2436 :1 Woche -STR_2437 :2 Wochen -STR_2438 :3 Wochen -STR_2439 :4 Wochen -STR_2440 :5 Wochen -STR_2441 :6 Wochen +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : STR_2442 :{BLACK}({STRINGID} übrig) STR_2443 :{WINDOW_COLOUR_2}Kosten pro Woche: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Gesamtkosten: {BLACK}{CURRENCY2DP} @@ -2974,8 +2974,8 @@ STR_2965 :{WINDOW_COLOUR_2} STR_2966 : STR_2967 : STR_2968 : -STR_2969 :Die Verwendung dieses Produkts unterliegt den Bestimmungen eines Lizenzvertrages, -STR_2970 :der in der {OPENQUOTES}ReadMe{ENDQUOTES}-Datei und dem Handbuch nachgesehen werden kann +STR_2969 : +STR_2970 : STR_2971 :Hauptfarbschema STR_2972 :Alternatives Farbschema 1 STR_2973 :Alternatives Farbschema 2 @@ -3453,8 +3453,8 @@ STR_3444 :Seite 5 STR_3445 :Patrouillenbereich festlegen STR_3446 :Patrouillenbereich verwerfen # New strings, cleaner -STR_5120 :Finanzen in der Symbolleiste anzeigen -STR_5121 :Forschung in der Symbolleiste anzeigen +STR_5120 :Finanzen +STR_5121 :Forschung STR_5122 :Bahnen nach Streckentyp auswählen (wie in RCT1) STR_5123 :Bahnen erneuern STR_5124 :Keine Six Flags @@ -3480,7 +3480,7 @@ STR_5143 :Erhöhte Geschwindigkeit STR_5144 :Hohe Geschwindigkeit STR_5145 :Sehr Hohe Geschwindigkeit STR_5146 :Extreme Geschwindigkeit -STR_5147 :Cheats in der Symbolleiste anzeigen +STR_5147 :Cheats STR_5148 :{SMALLFONT}{BLACK}Spielgeschwindigkeit ändern STR_5149 :{SMALLFONT}{BLACK}Cheats anzeigen STR_5150 :Aktiviere Debugging-Tools @@ -3602,7 +3602,7 @@ STR_5265 :{SMALLFONT}{BLACK}Auswählen, welche Inhaltsquellen{NEWLINE}angezei STR_5266 :{SMALLFONT}{BLACK}Anzeige STR_5267 :{SMALLFONT}{BLACK}Sprache und Einheiten STR_5268 :{SMALLFONT}{BLACK}Audio -STR_5269 :{SMALLFONT}{BLACK}Steuerung +STR_5269 :{SMALLFONT}{BLACK}Bedienung und Oberfläche STR_5270 :{SMALLFONT}{BLACK}Sonstiges STR_5271 :{SMALLFONT}{BLACK}Twitch STR_5272 :{SMALLFONT}{BLACK}Kleine Szenerie @@ -3801,9 +3801,18 @@ STR_5464 :Allgemein STR_5465 :Klima STR_5466 :Personal STR_5467 :ALT + -STR_5468 :Letzte Nachrichten in der Symbolleiste anzeigen +STR_5468 :Letzte Nachrichten STR_5469 :Karte nach oben verschieben STR_5470 :Karte nach links verschieben STR_5471 :Karte nach unten verschieben STR_5472 :Karte nach rechts verschieben STR_5473 :Tag-Nacht-Wechsel +STR_5474 :Text auf Banner in Großbuchstaben anzeigen +STR_5475 :{COMMA16} Wochen +STR_5476 :Hardware +STR_5477 :Kartendarstellung +STR_5478 :Bedienung +STR_5479 :Symbolleiste +STR_5480 :Schaltflächen anzeigen für: +STR_5481 :Themen +STR_5482 :{WINDOW_COLOUR_2}Letzte Inspektion vor: {BLACK}1 Minute From c2fe82dcb77b30f09d189e7540c8fc31fa3ae4e4 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 27 Jul 2015 10:16:08 +0200 Subject: [PATCH 0374/1173] Mark more obsolete strings --- data/language/english_uk.txt | 14 +++++++------- src/localisation/string_ids.h | 6 ------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 6f7217545d..ae5bb0e51a 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -842,7 +842,7 @@ STR_0837 :Unable to initialise graphics system STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -# The follwing six strings were used for display resolutions, but have been replaced. +# The following six strings were used for display resolutions, but have been replaced. STR_0841 : STR_0842 : STR_0843 : @@ -2321,10 +2321,10 @@ STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) STR_2314 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks -STR_2317 :{WINDOW_COLOUR_2}Sound Quality: -STR_2318 :Low -STR_2319 :Medium -STR_2320 :High +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} @@ -3369,8 +3369,8 @@ STR_3358 :Can't delete track design... STR_3359 :{BLACK}No track designs of this type STR_3360 :Warning! STR_3361 :Too many track designs of this type - Some will not be listed. -STR_3362 :Forced Software Buffer Mixing -STR_3363 :{SMALLFONT}{BLACK}Select this option to improve performance if the game pauses slightly when sounds start or interference is heard +STR_3362 : +STR_3363 : STR_3364 :Advanced STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups STR_3366 :{BLACK}= Ride diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index b0d85eefc4..a633436da5 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -983,10 +983,6 @@ enum { STR_TRACK_LIST_COST_AROUND = 2315, STR_TRACK_LIST_SPACE_REQUIRED = 2316, - STR_SOUND_QUALITY = 2317, - STR_SOUND_LOW = 2318, - STR_SOUND_MEDIUM = 2319, - STR_SOUND_HIGH = 2320, STR_NUMBER_OF_RIDES_LABEL = 2321, STR_STAFF_LABEL = 2322, STR_PARK_SIZE_METRIC_LABEL = 2323, @@ -1657,8 +1653,6 @@ enum { STR_WARNING = 3360, STR_TOO_MANY_TRACK_DESIGNS_OF_THIS_TYPE = 3361, - STR_SOUND_FORCED_SOFTWARE_BUFFER_MIXING = 3362, - STR_SOUND_FORCED_SOFTWARE_BUFFER_MIXING_TIP = 3363, STR_OBJECT_SELECTION_ADVANCED = 3364, STR_OBJECT_SELECTION_ADVANCED_TIP = 3365, From 38f031655c03f4eeed783a3e23a79b2fc243a2a1 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 27 Jul 2015 10:34:19 +0200 Subject: [PATCH 0375/1173] Fix display of remaining marketing campaign weeks --- data/language/english_uk.txt | 3 ++- src/localisation/string_ids.h | 3 ++- src/windows/finances.c | 8 ++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 6f7217545d..6d6e301575 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2446,7 +2446,7 @@ STR_2438 : STR_2439 : STR_2440 : STR_2441 : -STR_2442 :{BLACK}({STRINGID} remaining) +STR_2442 : STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} STR_2445 :Start this marketing campaign @@ -3819,3 +3819,4 @@ STR_5479 :Toolbar STR_5480 :Show toolbar buttons for: STR_5481 :Themes STR_5482 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}1 minute +STR_5483 :{BLACK}({COMMA16} weeks remaining) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index b0d85eefc4..d2f7c2fe3b 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1096,7 +1096,6 @@ enum { STR_ADVERTISING_CAMPAIGN_FOR_2 = 2435, STR_MARKETING_1_WEEK = 2436, - STR_MARKETING_WEEKS_REMAINING = 2442, STR_MARKETING_COST_PER_WEEK = 2443, STR_MARKETING_TOTAL_COST = 2444, STR_MARKETING_START_THIS_MARKETING_CAMPAIGN = 2445, @@ -1831,6 +1830,8 @@ enum { STR_TIME_SINCE_LAST_INSPECTION_MINUTE = 5482, + STR_X_WEEKS_REMAINING = 5483, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/finances.c b/src/windows/finances.c index 4aaa95ba39..f9fc60455c 100644 --- a/src/windows/finances.c +++ b/src/windows/finances.c @@ -1173,9 +1173,9 @@ static void window_finances_marketing_invalidate(rct_window *w) */ static void window_finances_marketing_paint(rct_window *w, rct_drawpixelinfo *dpi) { - int i, x, y; + int i, x, y, weeksRemaining; rct_ride *ride; - rct_string_id shopString, weeksRemainingStringId; + rct_string_id shopString; window_draw_widgets(w, dpi); window_finances_draw_tab_images(dpi, w); @@ -1212,8 +1212,8 @@ static void window_finances_marketing_paint(rct_window *w, rct_drawpixelinfo *dp gfx_draw_string_left_clipped(dpi, STR_VOUCHERS_FOR_FREE_ENTRY_TO + i, (void*)0x013CE952, 0, x + 4, y, 296); // Duration - weeksRemainingStringId = (STR_MARKETING_1_WEEK - 1) + (gMarketingCampaignDaysLeft[i] % 128); - gfx_draw_string_left(dpi, STR_MARKETING_WEEKS_REMAINING, &weeksRemainingStringId, 0, x + 304, y); + weeksRemaining = (gMarketingCampaignDaysLeft[i] % 128); + gfx_draw_string_left(dpi, STR_X_WEEKS_REMAINING, &weeksRemaining, 0, x + 304, y); y += 10; } From 65900982c42da441c1bf426eb40f1481234594f2 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 27 Jul 2015 17:33:22 +0200 Subject: [PATCH 0376/1173] Fix '1 weeks remaining' --- data/language/english_uk.txt | 1 + src/localisation/string_ids.h | 1 + src/windows/finances.c | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index f71a258c92..7db4ea7d12 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3820,3 +3820,4 @@ STR_5480 :Show toolbar buttons for: STR_5481 :Themes STR_5482 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}1 minute STR_5483 :{BLACK}({COMMA16} weeks remaining) +STR_5484 :{BLACK}({COMMA16} week remaining) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 9608794c8f..f2ee362d62 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1825,6 +1825,7 @@ enum { STR_TIME_SINCE_LAST_INSPECTION_MINUTE = 5482, STR_X_WEEKS_REMAINING = 5483, + STR_1_WEEK_REMAINING = 5484, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/windows/finances.c b/src/windows/finances.c index f9fc60455c..6a39d27690 100644 --- a/src/windows/finances.c +++ b/src/windows/finances.c @@ -1213,7 +1213,7 @@ static void window_finances_marketing_paint(rct_window *w, rct_drawpixelinfo *dp // Duration weeksRemaining = (gMarketingCampaignDaysLeft[i] % 128); - gfx_draw_string_left(dpi, STR_X_WEEKS_REMAINING, &weeksRemaining, 0, x + 304, y); + gfx_draw_string_left(dpi, weeksRemaining == 1 ? STR_1_WEEK_REMAINING : STR_X_WEEKS_REMAINING, &weeksRemaining, 0, x + 304, y); y += 10; } From 5ed8948e4f94ba35b2a95a77d3e6310dd7017a0e Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 27 Jul 2015 21:47:55 +0200 Subject: [PATCH 0377/1173] Remove Six Flags branding and limitations, mark the lifecycle flag as deprecated, rename previously unidentified flag --- data/language/english_uk.txt | 2 +- src/localisation/string_ids.h | 1 - src/management/award.c | 2 +- src/ride/ride.c | 18 +----------------- src/ride/ride.h | 4 ++-- src/ride/track.c | 9 +-------- src/ride/track.h | 2 +- src/windows/cheats.c | 19 +------------------ src/windows/ride.c | 22 ++++++++-------------- src/windows/title_scenarioselect.c | 4 ---- src/windows/track_list.c | 5 ----- 11 files changed, 16 insertions(+), 72 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index f71a258c92..26ffe96b3b 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3460,7 +3460,7 @@ STR_5120 :Finances STR_5121 :Research STR_5122 :Select rides by track type (like in RCT1) STR_5123 :Renew rides -STR_5124 :No Six Flags +STR_5124 : STR_5125 :All destructable STR_5126 :Random title music STR_5127 :{SMALLFONT}{BLACK}Disable land elevation diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 9608794c8f..050676970e 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1243,7 +1243,6 @@ enum { // Rides STR_CHEAT_RENEW_RIDES = 5123, - STR_CHEAT_REMOVE_FLAGS = 5124, STR_CHEAT_MAKE_DESTRUCTABLE = 5125, STR_CHEAT_FIX_ALL_RIDES = 5132, STR_CHEAT_410_HILL_LIFT = 5137, diff --git a/src/management/award.c b/src/management/award.c index 7b7762f3b6..6448725c79 100644 --- a/src/management/award.c +++ b/src/management/award.c @@ -463,7 +463,7 @@ static int award_is_deserved_best_custom_designed_rides(int awardType, int activ FOR_ALL_RIDES(i, ride) { if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_TRACK)) continue; - if (ride->lifecycle_flags & RIDE_LIFECYCLE_18) + if (ride->lifecycle_flags & RIDE_LIFECYCLE_NOT_CUSTOM_DESIGN) continue; if (ride->excitement < RIDE_RATING(5, 50)) continue; diff --git a/src/ride/ride.c b/src/ride/ride.c index 06de016512..87ec7617ce 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1629,13 +1629,6 @@ int ride_modify(rct_xy_element *input) return 0; } - if (ride->lifecycle_flags & RIDE_LIFECYCLE_SIX_FLAGS) { - RCT2_GLOBAL(0x013CE952 + 6, uint16) = ride->name; - RCT2_GLOBAL(0x013CE952 + 8, uint32) = ride->name_arguments; - window_error_open(STR_CANT_START_CONSTRUCTION_ON, STR_THIS_RIDE_CANNOT_BE_MODIFIED); - return 0; - } - ride_clear_for_construction(rideIndex); ride_remove_peeps(rideIndex); @@ -2168,7 +2161,7 @@ static int ride_get_new_breakdown_problem(rct_ride *ride) return -1; monthsOld = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint8) - ride->build_date; - if (monthsOld < 16 || ride->reliability > (50 << 8) || ride->lifecycle_flags & RIDE_LIFECYCLE_SIX_FLAGS) + if (monthsOld < 16 || ride->reliability > (50 << 8)) return -1; return BREAKDOWN_BRAKES_FAILURE; @@ -3601,15 +3594,6 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * } } - if (ride->lifecycle_flags & RIDE_LIFECYCLE_SIX_FLAGS){ - if (setting == 0 || setting == 4 || setting == 8 || setting == 9) - { - RCT2_GLOBAL(0x141E9AC, uint16) = 1797; - *ebx = MONEY32_UNDEFINED; - return; - } - } - if (setting == 9 && ride->lifecycle_flags & RIDE_LIFECYCLE_CABLE_LIFT && new_value > 1){ diff --git a/src/ride/ride.h b/src/ride/ride.h index d802ec541d..6d322b45ba 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -393,8 +393,8 @@ enum { RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK = 1 << 15, RIDE_LIFECYCLE_16 = 1 << 16, RIDE_LIFECYCLE_CABLE_LIFT = 1 << 17, - RIDE_LIFECYCLE_18 = 1 << 18, - RIDE_LIFECYCLE_SIX_FLAGS = 1 << 19 + RIDE_LIFECYCLE_NOT_CUSTOM_DESIGN = 1 << 18, // Used for the Award for Best Custom-designed Rides + RIDE_LIFECYCLE_SIX_FLAGS_DEPRECATED = 1 << 19 // Not used anymore }; // Constants used by the ride_type->flags property at 0x008 diff --git a/src/ride/track.c b/src/ride/track.c index c55c3d0cd8..5a2172e5bc 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -2931,9 +2931,6 @@ int ride_to_td6(uint8 rideIndex){ track_design->flags = 0; track_design->var_6C = 0; - if (ride->lifecycle_flags & RIDE_LIFECYCLE_SIX_FLAGS) - track_design->var_6C |= (1 << 31); - uint8* track_elements = RCT2_ADDRESS(0x9D821B, uint8); memset(track_elements, 0, 8000); @@ -3278,11 +3275,7 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int rct_ride* ride = GET_RIDE(rideIndex); - ride->lifecycle_flags |= RIDE_LIFECYCLE_18; - - if (track_design->var_6C & (1 << 31)){ - ride->lifecycle_flags |= RIDE_LIFECYCLE_SIX_FLAGS; - } + ride->lifecycle_flags |= RIDE_LIFECYCLE_NOT_CUSTOM_DESIGN; ride->colour_scheme_type = track_design->version_and_colour_scheme & 3; diff --git a/src/ride/track.h b/src/ride/track.h index 89a302f241..c9eabb1c97 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -173,7 +173,7 @@ typedef struct { uint8 track_spine_colour[4]; // 0x60 uint8 track_rail_colour[4]; // 0x64 uint8 track_support_colour[4]; // 0x68 - uint32 var_6C; + uint32 var_6C; // some flags rct_object_entry vehicle_object; // 0x70 uint8 space_required_x; // 0x80 uint8 space_required_y; // 0x81 diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 0fe18bd813..d48374eeb9 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -110,7 +110,6 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_FAST_STAFF, WIDX_NORMAL_STAFF, WIDX_RENEW_RIDES = 8, - WIDX_REMOVE_SIX_FLAGS, WIDX_MAKE_DESTRUCTIBLE, WIDX_FIX_ALL, WIDX_FAST_LIFT_HILL, @@ -249,7 +248,6 @@ static rct_widget window_cheats_misc_widgets[] = { static rct_widget window_cheats_rides_widgets[] = { MAIN_CHEATS_WIDGETS, { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(0), HPL(0), STR_CHEAT_RENEW_RIDES, STR_NONE}, // Renew rides - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(0), HPL(0), STR_CHEAT_REMOVE_FLAGS, STR_NONE}, // Remove flags { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_MAKE_DESTRUCTABLE, STR_NONE}, // Make destructable { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_FIX_ALL_RIDES, STR_NONE }, // Fix all rides { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(11), OHPL(11) + 8, STR_CHEAT_410_HILL_LIFT, STR_NONE }, // 410 km/h lift hill @@ -414,7 +412,7 @@ 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_HIGH_MONEY) | (1ULL << WIDX_CLEAR_LOAN), (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_GUEST_PARAMETERS_GROUP) | (1ULL << WIDX_GUEST_HAPPINESS_MAX) | (1ULL << WIDX_GUEST_HAPPINESS_MIN) | (1ULL << WIDX_GUEST_ENERGY_MAX) | (1ULL << WIDX_GUEST_ENERGY_MIN) | (1ULL << WIDX_GUEST_HUNGER_MAX) | (1ULL << WIDX_GUEST_HUNGER_MIN) | (1ULL << WIDX_GUEST_THIRST_MAX) | (1ULL << WIDX_GUEST_THIRST_MIN) | (1ULL << WIDX_GUEST_NAUSEA_MAX) | (1ULL << WIDX_GUEST_NAUSEA_MIN) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1ULL << WIDX_GUEST_BATHROOM_MAX) | (1ULL << WIDX_GUEST_BATHROOM_MIN) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1ULL << WIDX_GIVE_ALL_GUESTS_GROUP) | (1ULL << WIDX_GIVE_GUESTS_MONEY) | (1ULL << WIDX_GIVE_GUESTS_PARK_MAPS) | (1ULL << WIDX_GIVE_GUESTS_BALLOONS) | (1ULL << WIDX_GIVE_GUESTS_UMBRELLAS) | (1ULL << WIDX_TRAM_GUESTS) | (1ULL << WIDX_REMOVE_ALL_GUESTS) | (1ULL << WIDX_EXPLODE_GUESTS), (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_FREEZE_CLIMATE) | (1ULL << WIDX_OPEN_CLOSE_PARK) | (1ULL << WIDX_ZERO_CLEARANCE) | (1ULL << WIDX_WEATHER_SUN) | (1ULL << WIDX_WEATHER_THUNDER) | (1ULL << WIDX_CLEAR_GRASS) | (1ULL << WIDX_MOWED_GRASS) | (1ULL << WIDX_WATER_PLANTS) | (1ULL << WIDX_FIX_VANDALISM) | (1ULL << WIDX_REMOVE_LITTER) | (1ULL << WIDX_WIN_SCENARIO) | (1ULL << WIDX_HAVE_FUN) | (1ULL << WIDX_UNLOCK_ALL_PRICES) | (1ULL << WIDX_SANDBOX_MODE) | (1ULL << WIDX_FAST_STAFF) | (1ULL << WIDX_NORMAL_STAFF) | (1ULL << WIDX_PARK_PARAMETERS) | (1ULL << WIDX_FORCE_PARK_RATING) | (1ULL << WIDX_INCREASE_PARK_RATING) | (1ULL << WIDX_DECREASE_PARK_RATING), - (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_REMOVE_SIX_FLAGS) | (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_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) }; static rct_string_id window_cheats_page_titles[] = { @@ -555,18 +553,6 @@ static void cheat_renew_rides() window_invalidate_by_class(WC_RIDE); } -static void cheat_remove_six_flags() -{ - int i; - rct_ride *ride; - FOR_ALL_RIDES(i, ride) - { - if (ride->lifecycle_flags & RIDE_LIFECYCLE_SIX_FLAGS) - ride->lifecycle_flags&=~RIDE_LIFECYCLE_SIX_FLAGS; - } - window_invalidate_by_class(WC_RIDE); -} - static void cheat_make_destructible() { int i; @@ -986,9 +972,6 @@ static void window_cheats_rides_mouseup(rct_window *w, int widgetIndex) case WIDX_RENEW_RIDES: cheat_renew_rides(); break; - case WIDX_REMOVE_SIX_FLAGS: - cheat_remove_six_flags(); - break; case WIDX_MAKE_DESTRUCTIBLE: cheat_make_destructible(); break; diff --git a/src/windows/ride.c b/src/windows/ride.c index a39bd33402..9debc78f25 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -2003,8 +2003,6 @@ static void window_ride_main_invalidate(rct_window *w) w->disabled_widgets &= ~((1 << 22) | (1 << 19)); if (ride->lifecycle_flags & (RIDE_LIFECYCLE_INDESTRUCTIBLE | RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK)) w->disabled_widgets |= (1 << 22); - if (ride->lifecycle_flags & RIDE_LIFECYCLE_SIX_FLAGS) - w->disabled_widgets |= (1 << 19); RCT2_GLOBAL(0x013CE952 + 0, uint16) = ride->name; RCT2_GLOBAL(0x013CE952 + 2, uint32) = ride->name_arguments; @@ -4774,15 +4772,14 @@ static void window_ride_measurements_invalidate(rct_window *w) window_ride_measurements_widgets[WIDX_RESET_SELECTION].type = WWT_EMPTY; window_ride_measurements_widgets[WIDX_SAVE_DESIGN].type = WWT_EMPTY; window_ride_measurements_widgets[WIDX_CANCEL_DESIGN].type = WWT_EMPTY; - if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_SIX_FLAGS)) { - if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_TRACK)) { - window_ride_measurements_widgets[WIDX_SAVE_TRACK_DESIGN].type = WWT_FLATBTN; - w->disabled_widgets |= (1 << WIDX_SAVE_TRACK_DESIGN); - if (ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED) { - if (ride->excitement != -1) { - w->disabled_widgets &= ~(1 << WIDX_SAVE_TRACK_DESIGN); - window_ride_measurements_widgets[WIDX_SAVE_TRACK_DESIGN].tooltip = STR_SAVE_TRACK_DESIGN; - } + + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_TRACK)) { + window_ride_measurements_widgets[WIDX_SAVE_TRACK_DESIGN].type = WWT_FLATBTN; + w->disabled_widgets |= (1 << WIDX_SAVE_TRACK_DESIGN); + if (ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED) { + if (ride->excitement != -1) { + w->disabled_widgets &= ~(1 << WIDX_SAVE_TRACK_DESIGN); + window_ride_measurements_widgets[WIDX_SAVE_TRACK_DESIGN].tooltip = STR_SAVE_TRACK_DESIGN; } } } @@ -4821,9 +4818,6 @@ static void window_ride_measurements_paint(rct_window *w, rct_drawpixelinfo *dpi } else { ride = GET_RIDE(w->number); - if (ride->lifecycle_flags & RIDE_LIFECYCLE_SIX_FLAGS) - gfx_draw_sprite(dpi, 23225, w->x + w->width - 53, w->y + w->height - 73, 0); - x = w->x + window_ride_measurements_widgets[WIDX_PAGE_BACKGROUND].left + 4; y = w->y + window_ride_measurements_widgets[WIDX_PAGE_BACKGROUND].top + 4; diff --git a/src/windows/title_scenarioselect.c b/src/windows/title_scenarioselect.c index cb2997252f..b817b6113a 100644 --- a/src/windows/title_scenarioselect.c +++ b/src/windows/title_scenarioselect.c @@ -282,10 +282,6 @@ static void window_scenarioselect_paint(rct_window *w, rct_drawpixelinfo *dpi) if (scenario == NULL) return; - // Draw SixFlags image - if (scenario->flags & SCENARIO_FLAGS_SIXFLAGS) - gfx_draw_sprite(dpi, SPR_SIX_FLAGS, w->x + w->width - 55, w->y + w->height - 75, 0); - // Scenario name x = w->x + window_scenarioselect_widgets[WIDX_SCENARIOLIST].right + 4; y = w->y + window_scenarioselect_widgets[WIDX_TABCONTENT].top + 5; diff --git a/src/windows/track_list.c b/src/windows/track_list.c index f32d4722b4..3288317456 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -449,11 +449,6 @@ static void window_track_list_paint(rct_window *w, rct_drawpixelinfo *dpi) x = w->x + widget->left + 1; y = w->y + widget->bottom + 2; - if (track_td6->var_6C & 0x80000000) { - // Six flags logo - gfx_draw_sprite(dpi, SPR_SIX_FLAGS, w->x + widget->right - 50, y + 4, 0); - } - // Stats rating = track_td6->excitement * 10; gfx_draw_string_left(dpi, STR_TRACK_LIST_EXCITEMENT_RATING, &rating, 0, x, y); From c35d1ce65f8d89d8e3c642b81b5131b599e8b732 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 28 Jul 2015 04:00:14 +0100 Subject: [PATCH 0378/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_simplified.txt | 3829 +++++++++++++++++++++++++ data/language/chinese_traditional.txt | 810 +++--- data/language/dutch.txt | 28 +- data/language/german.txt | 16 +- 4 files changed, 4262 insertions(+), 421 deletions(-) create mode 100644 data/language/chinese_simplified.txt diff --git a/data/language/chinese_simplified.txt b/data/language/chinese_simplified.txt new file mode 100644 index 0000000000..78c2668896 --- /dev/null +++ b/data/language/chinese_simplified.txt @@ -0,0 +1,3829 @@ +# STR_XXXX part is read and XXXX becomes the string id number. +# Everything after the colon and before the new line will be saved as the string. +# Use # at the beginning of a line to leave a comment. +STR_0000 : +STR_0001 :{STRINGID} {COMMA16} +STR_0002 :螺旋过山车 +STR_0003 :站立式过山车 +STR_0004 :悬挂摇摆过山车 +STR_0005 :回转过山车 +STR_0006 :儿童过山车 +STR_0007 :迷你火车 +STR_0008 :单轨电车 +STR_0009 :迷你悬挂过山车 +STR_0010 :游船出租 +STR_0011 :木制疯狂老鼠过山车 +STR_0012 :赛马过山车 +STR_0013 :轨道小车 +STR_0014 :喷射-自由落体 +STR_0015 :雪橇过山车 +STR_0016 :观景塔 +# I could not find this thing in the game +STR_0017 :Looping Roller Coaster +STR_0018 :充气小艇滑道 +STR_0019 :矿车过山车 +STR_0020 :缆车 +# STR_0021 has the same meaning as STR_0001 in chinese +STR_0021 :Corkscrew Roller Coaster +STR_0022 :迷宫 +STR_0023 :螺旋滑梯 +STR_0024 :卡丁车 +STR_0025 :原木滑水道 +STR_0026 :激流探险 +STR_0027 :碰碰车 +STR_0028 :海盗船 +STR_0029 :摇摆海盗船 +STR_0030 :食品小站 +STR_0031 :Unknown Stall (1D) +STR_0032 :饮料铺 +STR_0033 :Unknown Stall (1F) +STR_0034 :商店 +STR_0035 :旋转木马 +STR_0036 :Unknown Stall (22) +STR_0037 :问讯处 +STR_0038 :厕所 +STR_0039 :摩天轮 +STR_0040 :动感模拟器 +STR_0041 :3D电影院 +# passengers ride in a gondola +STR_0042 :旋转贡多拉 +# alternative may be 失速模拟 +STR_0043 :太空转轮 +STR_0044 :反向自由落体过山车 +STR_0045 :升降观景台 +STR_0046 :垂直坠落过山车 +STR_0047 :自动取款机 +STR_0048 :Twist +STR_0049 :鬼屋 +STR_0050 :急救室 +STR_0051 :马戏表演 +STR_0052 :Tunnel Of Horror +STR_0053 :Steel Twister Roller Coaster +STR_0054 :木制过山车 +STR_0055 :Side-Friction Roller Coaster +STR_0056 :疯狂老鼠过山车 +STR_0057 :多维过山车 +STR_0058 :Unknown Ride (38) +STR_0059 :飞翔过山车 +STR_0060 :Unknown Ride (3A) +STR_0061 :弗吉尼亚卷轴 +STR_0062 :Splash Boats +STR_0063 :迷你直升机 +STR_0064 :躺卧式过山车 +STR_0065 :悬挂式单轨电车 +STR_0066 :Unknown Ride (40) +STR_0067 :反转过山车 +STR_0068 :Heartline Twister Coaster +STR_0069 :迷你高尔夫 +STR_0070 :巨型过山车 +STR_0071 :Roto-Drop +STR_0072 :飞一般的碟子 +STR_0073 :鬼怪屋 +STR_0074 :单轨自行车 +STR_0075 :紧凑回转过山车 +STR_0076 :Water Coaster +STR_0077 :喷射弹射过山车 +STR_0078 :回转发卡过山车 +STR_0079 :魔毯 +STR_0080 :迷你潜艇 +STR_0081 :小木筏 +STR_0082 :Unknown Ride (50) +STR_0083 :Enterprise +STR_0084 :Unknown Ride (52) +STR_0085 :Unknown Ride (53) +STR_0086 :Unknown Ride (54) +STR_0087 :Unknown Ride (55) +STR_0088 :回转冲力过山车 +STR_0089 :迷你过山车 +STR_0090 :Mine Ride +STR_0091 :Unknown Ride (59) +# LIM: Linear Induction Motors +STR_0092 :LIM喷射过山车 +STR_0093 : +STR_0094 : +STR_0095 : +STR_0096 : +STR_0097 : +STR_0098 : +STR_0099 : +STR_0100 : +STR_0101 : +STR_0102 : +STR_0103 : +STR_0104 : +STR_0105 : +STR_0106 : +STR_0107 : +STR_0108 : +STR_0109 : +STR_0110 : +STR_0111 : +STR_0112 : +STR_0113 : +STR_0114 : +STR_0115 : +STR_0116 : +STR_0117 : +STR_0118 : +STR_0119 : +STR_0120 : +STR_0121 : +STR_0122 : +STR_0123 : +STR_0124 : +STR_0125 : +STR_0126 : +STR_0127 : +STR_0128 : +STR_0129 : +STR_0130 : +STR_0131 : +STR_0132 : +STR_0133 : +STR_0134 : +STR_0135 : +STR_0136 : +STR_0137 : +STR_0138 : +STR_0139 : +STR_0140 : +STR_0141 : +STR_0142 : +STR_0143 : +STR_0144 : +STR_0145 : +STR_0146 : +STR_0147 : +STR_0148 : +STR_0149 : +STR_0150 : +STR_0151 : +STR_0152 : +STR_0153 : +STR_0154 : +STR_0155 : +STR_0156 : +STR_0157 : +STR_0158 : +STR_0159 : +STR_0160 : +STR_0161 : +STR_0162 : +STR_0163 : +STR_0164 : +STR_0165 : +STR_0166 : +STR_0167 : +STR_0168 : +STR_0169 : +STR_0170 : +STR_0171 : +STR_0172 : +STR_0173 : +STR_0174 : +STR_0175 : +STR_0176 : +STR_0177 : +STR_0178 : +STR_0179 : +STR_0180 : +STR_0181 : +STR_0182 : +STR_0183 : +STR_0184 : +STR_0185 : +STR_0186 : +STR_0187 : +STR_0188 : +STR_0189 : +STR_0190 : +STR_0191 : +STR_0192 : +STR_0193 : +STR_0194 : +STR_0195 : +STR_0196 : +STR_0197 : +STR_0198 : +STR_0199 : +STR_0200 : +STR_0201 : +STR_0202 : +STR_0203 : +STR_0204 : +STR_0205 : +STR_0206 : +STR_0207 : +STR_0208 : +STR_0209 : +STR_0210 : +STR_0211 : +STR_0212 : +STR_0213 : +STR_0214 : +STR_0215 : +STR_0216 : +STR_0217 : +STR_0218 : +STR_0219 : +STR_0220 : +STR_0221 : +STR_0222 : +STR_0223 : +STR_0224 : +STR_0225 : +STR_0226 : +STR_0227 : +STR_0228 : +STR_0229 : +STR_0230 : +STR_0231 : +STR_0232 : +STR_0233 : +STR_0234 : +STR_0235 : +STR_0236 : +STR_0237 : +STR_0238 : +STR_0239 : +STR_0240 : +STR_0241 : +STR_0242 : +STR_0243 : +STR_0244 : +STR_0245 : +STR_0246 : +STR_0247 : +STR_0248 : +STR_0249 : +STR_0250 : +STR_0251 : +STR_0252 : +STR_0253 : +STR_0254 : +STR_0255 : +STR_0256 : +STR_0257 : +STR_0258 : +STR_0259 : +STR_0260 : +STR_0261 : +STR_0262 : +STR_0263 : +STR_0264 : +STR_0265 : +STR_0266 : +STR_0267 : +STR_0268 : +STR_0269 : +STR_0270 : +STR_0271 : +STR_0272 : +STR_0273 : +STR_0274 : +STR_0275 : +STR_0276 : +STR_0277 : +STR_0278 : +STR_0279 : +STR_0280 : +STR_0281 : +STR_0282 : +STR_0283 : +STR_0284 : +STR_0285 : +STR_0286 : +STR_0287 : +STR_0288 : +STR_0289 : +STR_0290 : +STR_0291 : +STR_0292 : +STR_0293 : +STR_0294 : +STR_0295 : +STR_0296 : +STR_0297 : +STR_0298 : +STR_0299 : +STR_0300 : +STR_0301 : +STR_0302 : +STR_0303 : +STR_0304 : +STR_0305 : +STR_0306 : +STR_0307 : +STR_0308 : +STR_0309 : +STR_0310 : +STR_0311 : +STR_0312 : +STR_0313 : +STR_0314 : +STR_0315 : +STR_0316 : +STR_0317 : +STR_0318 : +STR_0319 : +STR_0320 : +STR_0321 : +STR_0322 : +STR_0323 : +STR_0324 : +STR_0325 : +STR_0326 : +STR_0327 : +STR_0328 : +STR_0329 : +STR_0330 : +STR_0331 : +STR_0332 : +STR_0333 : +STR_0334 : +STR_0335 : +STR_0336 : +STR_0337 : +STR_0338 : +STR_0339 : +STR_0340 : +STR_0341 : +STR_0342 : +STR_0343 : +STR_0344 : +STR_0345 : +STR_0346 : +STR_0347 : +STR_0348 : +STR_0349 : +STR_0350 : +STR_0351 : +STR_0352 : +STR_0353 : +STR_0354 : +STR_0355 : +STR_0356 : +STR_0357 : +STR_0358 : +STR_0359 : +STR_0360 : +STR_0361 : +STR_0362 : +STR_0363 : +STR_0364 : +STR_0365 : +STR_0366 : +STR_0367 : +STR_0368 : +STR_0369 : +STR_0370 : +STR_0371 : +STR_0372 : +STR_0373 : +STR_0374 : +STR_0375 : +STR_0376 : +STR_0377 : +STR_0378 : +STR_0379 : +STR_0380 : +STR_0381 : +STR_0382 : +STR_0383 : +STR_0384 : +STR_0385 : +STR_0386 : +STR_0387 : +STR_0388 : +STR_0389 : +STR_0390 : +STR_0391 : +STR_0392 : +STR_0393 : +STR_0394 : +STR_0395 : +STR_0396 : +STR_0397 : +STR_0398 : +STR_0399 : +STR_0400 : +STR_0401 : +STR_0402 : +STR_0403 : +STR_0404 : +STR_0405 : +STR_0406 : +STR_0407 : +STR_0408 : +STR_0409 : +STR_0410 : +STR_0411 : +STR_0412 : +STR_0413 : +STR_0414 : +STR_0415 : +STR_0416 : +STR_0417 : +STR_0418 : +STR_0419 : +STR_0420 : +STR_0421 : +STR_0422 : +STR_0423 : +STR_0424 : +STR_0425 : +STR_0426 : +STR_0427 : +STR_0428 : +STR_0429 : +STR_0430 : +STR_0431 : +STR_0432 : +STR_0433 : +STR_0434 : +STR_0435 : +STR_0436 : +STR_0437 : +STR_0438 : +STR_0439 : +STR_0440 : +STR_0441 : +STR_0442 : +STR_0443 : +STR_0444 : +STR_0445 : +STR_0446 : +STR_0447 : +STR_0448 : +STR_0449 : +STR_0450 : +STR_0451 : +STR_0452 : +STR_0453 : +STR_0454 : +STR_0455 : +STR_0456 : +STR_0457 : +STR_0458 : +STR_0459 : +STR_0460 : +STR_0461 : +STR_0462 : +STR_0463 : +STR_0464 : +STR_0465 : +STR_0466 : +STR_0467 : +STR_0468 : +STR_0469 : +STR_0470 : +STR_0471 : +STR_0472 : +STR_0473 : +STR_0474 : +STR_0475 : +STR_0476 : +STR_0477 : +STR_0478 : +STR_0479 : +STR_0480 : +STR_0481 : +STR_0482 : +STR_0483 : +STR_0484 : +STR_0485 : +STR_0486 : +STR_0487 : +STR_0488 : +STR_0489 : +STR_0490 : +STR_0491 : +STR_0492 : +STR_0493 : +STR_0494 : +STR_0495 : +STR_0496 : +STR_0497 : +STR_0498 : +STR_0499 : +STR_0500 : +STR_0501 : +STR_0502 : +STR_0503 : +STR_0504 : +STR_0505 : +STR_0506 : +STR_0507 : +STR_0508 : +STR_0509 : +STR_0510 : +STR_0511 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :A looping roller coaster where the riders ride in a standing position +STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements +STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides +STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track +STR_0518 :Passengers travel in electric trains along a monorail track +STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them +STR_0523 :Riders travel slowly in powered vehicles along a track-based route +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower +STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops +STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track +STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops +STR_0532 : +STR_0533 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids +STR_0537 : +STR_0538 : +STR_0539 : +STR_0540 : +STR_0541 : +STR_0542 : +STR_0543 : +STR_0544 : +STR_0545 : +STR_0546 : +STR_0547 : +STR_0548 : +STR_0549 : +STR_0550 : +STR_0551 : +STR_0552 : +STR_0553 : +STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience +STR_0557 : +STR_0558 : +STR_0559 : +STR_0560 : +STR_0561 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects +STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills +STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' +STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity +STR_0566 :Individual roller coaster cars zip around a tight zig-zag layout of track with sharp corners and short sharp drops +STR_0567 :Sitting in seats suspended either side of the track, riders are pitched head-over-heels while they plunge down steep drops and travel through various inversions +STR_0568 : +STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air +STR_0570 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground +STR_0575 :Powered trains hanging from a single rail transport people around the park +STR_0576 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections +STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists +STR_0579 : +STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes +STR_0582 : +STR_0583 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions +STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops +STR_0589 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track +STR_0592 : +STR_0593 : +STR_0594 : +STR_0595 : +STR_0596 : +STR_0597 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track +STR_0599 :A compact roller coaster with individual cars and smooth twisting drops +STR_0600 :Powered mine trains career along a smooth and twisted track layout +STR_0601 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions +STR_0603 :Guest {INT32} +STR_0604 :Guest {INT32} +STR_0605 :Guest {INT32} +STR_0606 :Guest {INT32} +STR_0607 :Guest {INT32} +STR_0608 :Guest {INT32} +STR_0609 :Guest {INT32} +STR_0610 :Guest {INT32} +STR_0611 :Guest {INT32} +STR_0612 :Guest {INT32} +STR_0613 :Guest {INT32} +STR_0614 :Guest {INT32} +STR_0615 :Guest {INT32} +STR_0616 :Guest {INT32} +STR_0617 :Guest {INT32} +STR_0618 :Guest {INT32} +STR_0619 :Guest {INT32} +STR_0620 :Guest {INT32} +STR_0621 :Guest {INT32} +STR_0622 :Guest {INT32} +STR_0623 :Guest {INT32} +STR_0624 :Guest {INT32} +STR_0625 :Guest {INT32} +STR_0626 :Guest {INT32} +STR_0627 :Guest {INT32} +STR_0628 :Guest {INT32} +STR_0629 :Guest {INT32} +STR_0630 :Guest {INT32} +STR_0631 :Guest {INT32} +STR_0632 :Guest {INT32} +STR_0633 :Guest {INT32} +STR_0634 :Guest {INT32} +STR_0635 :Guest {INT32} +STR_0636 :Guest {INT32} +STR_0637 :Guest {INT32} +STR_0638 :Guest {INT32} +STR_0639 :Guest {INT32} +STR_0640 :Guest {INT32} +STR_0641 :Guest {INT32} +STR_0642 :Guest {INT32} +STR_0643 :Guest {INT32} +STR_0644 :Guest {INT32} +STR_0645 :Guest {INT32} +STR_0646 :Guest {INT32} +STR_0647 :Guest {INT32} +STR_0648 :Guest {INT32} +STR_0649 :Guest {INT32} +STR_0650 :Guest {INT32} +STR_0651 :Guest {INT32} +STR_0652 :Guest {INT32} +STR_0653 :Guest {INT32} +STR_0654 :Guest {INT32} +STR_0655 :Guest {INT32} +STR_0656 :Guest {INT32} +STR_0657 :Guest {INT32} +STR_0658 :Guest {INT32} +STR_0659 :Guest {INT32} +STR_0660 :Guest {INT32} +STR_0661 :Guest {INT32} +STR_0662 :Guest {INT32} +STR_0663 :Guest {INT32} +STR_0664 :Guest {INT32} +STR_0665 :Guest {INT32} +STR_0666 :Guest {INT32} +STR_0667 :Guest {INT32} +STR_0668 :Guest {INT32} +STR_0669 :Guest {INT32} +STR_0670 :Guest {INT32} +STR_0671 :Guest {INT32} +STR_0672 :Guest {INT32} +STR_0673 :Guest {INT32} +STR_0674 :Guest {INT32} +STR_0675 :Guest {INT32} +STR_0676 :Guest {INT32} +STR_0677 :Guest {INT32} +STR_0678 :Guest {INT32} +STR_0679 :Guest {INT32} +STR_0680 :Guest {INT32} +STR_0681 :Guest {INT32} +STR_0682 :Guest {INT32} +STR_0683 :Guest {INT32} +STR_0684 :Guest {INT32} +STR_0685 :Guest {INT32} +STR_0686 :Guest {INT32} +STR_0687 :Guest {INT32} +STR_0688 :Guest {INT32} +STR_0689 :Guest {INT32} +STR_0690 :Guest {INT32} +STR_0691 :Guest {INT32} +STR_0692 :Guest {INT32} +STR_0693 :Guest {INT32} +STR_0694 :Guest {INT32} +STR_0695 :Guest {INT32} +STR_0696 :Guest {INT32} +STR_0697 :Guest {INT32} +STR_0698 :Guest {INT32} +STR_0699 :Guest {INT32} +STR_0700 :Guest {INT32} +STR_0701 :Guest {INT32} +STR_0702 :Guest {INT32} +STR_0703 :Guest {INT32} +STR_0704 :Guest {INT32} +STR_0705 :Guest {INT32} +STR_0706 :Guest {INT32} +STR_0707 :Guest {INT32} +STR_0708 :Guest {INT32} +STR_0709 :Guest {INT32} +STR_0710 :Guest {INT32} +STR_0711 :Guest {INT32} +STR_0712 :Guest {INT32} +STR_0713 :Guest {INT32} +STR_0714 :Guest {INT32} +STR_0715 :Guest {INT32} +STR_0716 :Guest {INT32} +STR_0717 :Guest {INT32} +STR_0718 :Guest {INT32} +STR_0719 :Guest {INT32} +STR_0720 :Guest {INT32} +STR_0721 :Guest {INT32} +STR_0722 :Guest {INT32} +STR_0723 :Guest {INT32} +STR_0724 :Guest {INT32} +STR_0725 :Guest {INT32} +STR_0726 :Guest {INT32} +STR_0727 :Guest {INT32} +STR_0728 :Guest {INT32} +STR_0729 :Guest {INT32} +STR_0730 :Guest {INT32} +STR_0731 :Guest {INT32} +STR_0732 :Guest {INT32} +STR_0733 :Guest {INT32} +STR_0734 :Guest {INT32} +STR_0735 :Guest {INT32} +STR_0736 :Guest {INT32} +STR_0737 :Guest {INT32} +STR_0738 :Guest {INT32} +STR_0739 :Guest {INT32} +STR_0740 :Guest {INT32} +STR_0741 :Guest {INT32} +STR_0742 :Guest {INT32} +STR_0743 :Guest {INT32} +STR_0744 :Guest {INT32} +STR_0745 :Guest {INT32} +STR_0746 :Guest {INT32} +STR_0747 :Guest {INT32} +STR_0748 :Guest {INT32} +STR_0749 :Guest {INT32} +STR_0750 :Guest {INT32} +STR_0751 :Guest {INT32} +STR_0752 :Guest {INT32} +STR_0753 :Guest {INT32} +STR_0754 :Guest {INT32} +STR_0755 :Guest {INT32} +STR_0756 :Guest {INT32} +STR_0757 :Guest {INT32} +STR_0758 :Guest {INT32} +STR_0759 :Guest {INT32} +STR_0760 :Guest {INT32} +STR_0761 :Guest {INT32} +STR_0762 :Guest {INT32} +STR_0763 :Guest {INT32} +STR_0764 :Guest {INT32} +STR_0765 :Guest {INT32} +STR_0766 :Guest {INT32} +STR_0767 :Guest {INT32} +STR_0768 :Handyman {INT32} +STR_0769 :Mechanic {INT32} +STR_0770 :Security Guard {INT32} +STR_0771 :Entertainer {INT32} +STR_0772 :Unnamed park{POP16}{POP16} +STR_0773 :Unnamed park{POP16}{POP16} +STR_0774 :Unnamed park{POP16}{POP16} +STR_0775 :Unnamed park{POP16}{POP16} +STR_0776 :Unnamed park{POP16}{POP16} +STR_0777 :Unnamed park{POP16}{POP16} +STR_0778 :Sign +STR_0779 :1st +STR_0780 :2nd +STR_0781 :3rd +STR_0782 :4th +STR_0783 :5th +STR_0784 :6th +STR_0785 :7th +STR_0786 :8th +STR_0787 :9th +STR_0788 :10th +STR_0789 :11th +STR_0790 :12th +STR_0791 :13th +STR_0792 :14th +STR_0793 :15th +STR_0794 :16th +STR_0795 :17th +STR_0796 :18th +STR_0797 :19th +STR_0798 :20th +STR_0799 :21st +STR_0800 :22nd +STR_0801 :23rd +STR_0802 :24th +STR_0803 :25th +STR_0804 :26th +STR_0805 :27th +STR_0806 :28th +STR_0807 :29th +STR_0808 :30th +STR_0809 :31st +STR_0810 :Jan +STR_0811 :Feb +STR_0812 :Mar +STR_0813 :Apr +STR_0814 :May +STR_0815 :Jun +STR_0816 :Jul +STR_0817 :Aug +STR_0818 :Sep +STR_0819 :Oct +STR_0820 :Nov +STR_0821 :Dec +STR_0822 :Unable to access graphic data file +STR_0823 :Missing or inaccessible data file +STR_0824 :{BLACK}{CROSS} +STR_0825 :Chosen name in use already +STR_0826 :Too many names defined +STR_0827 :Not enough cash - requires {CURRENCY2DP} +STR_0828 :{SMALLFONT}{BLACK}Close window +STR_0829 :{SMALLFONT}{BLACK}Window title - Drag this to move window +STR_0830 :{SMALLFONT}{BLACK}Zoom view in +STR_0831 :{SMALLFONT}{BLACK}Zoom view out +STR_0832 :{SMALLFONT}{BLACK}Rotate view 90{DEGREE} clockwise +STR_0833 :{SMALLFONT}{BLACK}Pause game +STR_0834 :{SMALLFONT}{BLACK}Disk and game options +STR_0835 :Game initialization failed +STR_0836 :Unable to start game in a minimized state +STR_0837 :Unable to initialize graphics system +STR_0838 : +STR_0839 :{UINT16} x {UINT16} +STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} +# The following six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :About 'OpenRCT2' +STR_0848 :RollerCoaster Tycoon 2 +STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028 +STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, all rights reserved +STR_0851 :{WINDOW_COLOUR_2}Designed and programmed by Chris Sawyer +STR_0852 :{WINDOW_COLOUR_2}Graphics by Simon Foster +STR_0853 :{WINDOW_COLOUR_2}Sound and music by Allister Brimble +STR_0854 :{WINDOW_COLOUR_2}Additional sounds recorded by David Ellis +STR_0855 :{WINDOW_COLOUR_2}Representation by Jacqui Lyons at Marjacq Ltd. +STR_0856 :{WINDOW_COLOUR_2}Thanks to: +STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth, and John Wardley +STR_0858 :{WINDOW_COLOUR_2} +STR_0859 :{WINDOW_COLOUR_2} +STR_0860 :{WINDOW_COLOUR_2} +STR_0861 : +STR_0862 : +STR_0863 : +STR_0864 : +STR_0865 :{STRINGID} +STR_0866 :{POP16}{STRINGID} +STR_0867 :{POP16}{POP16}{STRINGID} +STR_0868 :{POP16}{POP16}{POP16}{STRINGID} +STR_0869 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0870 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0872 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0873 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0874 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0875 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0876 :{BLACK}{DOWN} +STR_0877 :Too low ! +STR_0878 :Too high ! +STR_0879 :Can't lower land here... +STR_0880 :Can't raise land here... +STR_0881 :Object in the way +STR_0882 :Load Game +STR_0883 :Save Game +STR_0884 :Load Landscape +STR_0885 :Save Landscape +STR_0886 :Quit Game +STR_0887 :Quit Scenario Editor +STR_0888 :Quit Roller Coaster Designer +STR_0889 :Quit Track Designs Manager +STR_0890 :SCR{COMMA16}.BMP +STR_0891 :Screenshot +STR_0892 :Screenshot saved to disk as '{STRINGID}' +STR_0893 :Screenshot failed ! +STR_0894 :Landscape data area full ! +STR_0895 :Can't build partly above and partly below ground +STR_0896 :{POP16}{POP16}{STRINGID} Construction +STR_0897 :Direction +STR_0898 :{SMALLFONT}{BLACK}Left-hand curve +STR_0899 :{SMALLFONT}{BLACK}Right-hand curve +STR_0900 :{SMALLFONT}{BLACK}Left-hand curve (small radius) +STR_0901 :{SMALLFONT}{BLACK}Right-hand curve (small radius) +STR_0902 :{SMALLFONT}{BLACK}Left-hand curve (very small radius) +STR_0903 :{SMALLFONT}{BLACK}Right-hand curve (very small radius) +STR_0904 :{SMALLFONT}{BLACK}Left-hand curve (large radius) +STR_0905 :{SMALLFONT}{BLACK}Right-hand curve (large radius) +STR_0906 :{SMALLFONT}{BLACK}Straight +STR_0907 :Slope +STR_0908 :Roll/Banking +STR_0909 :Seat Rot. +STR_0910 :{SMALLFONT}{BLACK}Roll for left-hand curve +STR_0911 :{SMALLFONT}{BLACK}Roll for right-hand curve +STR_0912 :{SMALLFONT}{BLACK}No roll +STR_0913 :{SMALLFONT}{BLACK}Move to previous section +STR_0914 :{SMALLFONT}{BLACK}Move to next section +STR_0915 :{SMALLFONT}{BLACK}Construct the selected section +STR_0916 :{SMALLFONT}{BLACK}Remove the highlighted section +STR_0917 :{SMALLFONT}{BLACK}Vertical drop +STR_0918 :{SMALLFONT}{BLACK}Steep slope down +STR_0919 :{SMALLFONT}{BLACK}Slope down +STR_0920 :{SMALLFONT}{BLACK}Level +STR_0921 :{SMALLFONT}{BLACK}Slope up +STR_0922 :{SMALLFONT}{BLACK}Steep slope up +STR_0923 :{SMALLFONT}{BLACK}Vertical rise +STR_0924 :{SMALLFONT}{BLACK}Helix down +STR_0925 :{SMALLFONT}{BLACK}Helix up +STR_0926 :Can't remove this... +STR_0927 :Can't construct this here... +STR_0928 :{SMALLFONT}{BLACK}Chain lift, to pull cars up slopes +STR_0929 :'S' Bend (left) +STR_0930 :'S' Bend (right) +STR_0931 :Vertical Loop (left) +STR_0932 :Vertical Loop (right) +STR_0933 :Raise or lower land first +STR_0934 :Ride entrance in the way +STR_0935 :Ride exit in the way +STR_0936 :Park entrance in the way +STR_0937 :{SMALLFONT}{BLACK}View options +STR_0938 :{SMALLFONT}{BLACK}Adjust land height and slope +STR_0939 :Underground/Inside View +STR_0940 :Remove Base Land +STR_0941 :Remove Vertical Faces +STR_0942 :See-Through Rides +STR_0943 :See-Through Scenery +STR_0944 :Save +STR_0945 :Don't Save +STR_0946 :Cancel +STR_0947 :Save this before loading ? +STR_0948 :Save this before quitting ? +STR_0949 :Save this before quitting ? +STR_0950 :Load Game +STR_0951 :Quit Game +STR_0952 :Quit Game +STR_0953 :Load Landscape +STR_0954 : +STR_0955 :{SMALLFONT}{BLACK}Select seat rotation angle for this track section +STR_0956 :-180{DEGREE} +STR_0957 :-135{DEGREE} +STR_0958 :-90{DEGREE} +STR_0959 :-45{DEGREE} +STR_0960 :0{DEGREE} +STR_0961 :+45{DEGREE} +STR_0962 :+90{DEGREE} +STR_0963 :+135{DEGREE} +STR_0964 :+180{DEGREE} +STR_0965 :+225{DEGREE} +STR_0966 :+270{DEGREE} +STR_0967 :+315{DEGREE} +STR_0968 :+360{DEGREE} +STR_0969 :+405{DEGREE} +STR_0970 :+450{DEGREE} +STR_0971 :+495{DEGREE} +STR_0972 :Cancel +STR_0973 :OK +STR_0974 :Rides +STR_0975 :Shops and Stalls +STR_0976 :Restrooms and Information Kiosks +STR_0977 :New Transport Rides +STR_0978 :New Gentle Rides +STR_0979 :New Roller Coasters +STR_0980 :New Thrill Rides +STR_0981 :New Water Rides +STR_0982 :New Shops & Stalls +STR_0983 :Research & Development +STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} +STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP} +STR_0986 :{BLACK}{CURRENCY2DP} +STR_0987 :Too many rides/attractions +STR_0988 :Can't create new ride/attraction... +STR_0989 :{STRINGID} +STR_0990 :{SMALLFONT}{BLACK}Construction +STR_0991 :Station platform +STR_0992 :{SMALLFONT}{BLACK}Demolish entire ride/attraction +STR_0993 :Demolish ride/attraction +STR_0994 :Demolish +STR_0995 :{WINDOW_COLOUR_1}Are you sure you want to completely demolish {STRINGID}? +STR_0996 :Overall view +STR_0997 :{SMALLFONT}{BLACK}View selection +STR_0998 :No more stations allowed on this ride +STR_0999 :Requires a station platform +STR_1000 :Track is not a complete circuit +STR_1001 :Track unsuitable for type of train +STR_1002 :Can't open {POP16}{POP16}{POP16}{STRINGID}... +STR_1003 :Can't test {POP16}{POP16}{POP16}{STRINGID}... +STR_1004 :Can't close {POP16}{POP16}{POP16}{STRINGID}... +STR_1005 :Can't start construction on {POP16}{POP16}{POP16}{STRINGID}... +STR_1006 :Must be closed first +STR_1007 :Unable to create enough vehicles +STR_1008 :{SMALLFONT}{BLACK}Open, close, or test ride/attraction +STR_1009 :{SMALLFONT}{BLACK}Open or close all rides/attractions +STR_1010 :{SMALLFONT}{BLACK}Open or close park +STR_1011 :Close all +STR_1012 :Open all +STR_1013 :Close park +STR_1014 :Open park +STR_1015 :Unable to operate with more than one station platform in this mode +STR_1016 :Unable to operate with less than two stations in this mode +STR_1017 :Can't change operating mode... +STR_1018 :Can't make changes... +STR_1019 :Can't make changes... +STR_1020 :Can't make changes... +STR_1021 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_1022 :{POP16}{POP16}{POP16}{COMMA16} car per train +STR_1023 :{POP16}{POP16}{POP16}{COMMA16} cars per train +STR_1024 :{COMMA16} car per train +STR_1025 :{COMMA16} cars per train +STR_1026 :Station platform too long! +STR_1027 :{SMALLFONT}{BLACK}Locate this on Main View +STR_1028 :Off edge of map! +STR_1029 :Cannot build partly above and partly below water! +STR_1030 :Can only build this underwater! +STR_1031 :Can't build this underwater! +STR_1032 :Can only build this on water! +STR_1033 :Can only build this above ground! +STR_1034 :Can only build this on land! +STR_1035 :Local authority won't allow construction above tree-height! +STR_1036 :Load Game +STR_1037 :Load Landscape +STR_1038 :Convert saved game to scenario +STR_1039 :Install new track design +STR_1040 :Save Game +STR_1041 :Save Scenario +STR_1042 :Save Landscape +STR_1043 :OpenRCT2 Saved Game +STR_1044 :OpenRCT2 Scenario File +STR_1045 :OpenRCT2 Landscape File +STR_1046 :OpenRCT2 Track Design File +STR_1047 :Game save failed! +STR_1048 :Scenario save failed! +STR_1049 :Landscape save failed! +STR_1050 :Failed to load...{NEWLINE}File contains invalid data! +STR_1051 :Invisible Supports +STR_1052 :Invisible People +STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park +STR_1054 :{SMALLFONT}{BLACK}Name ride/attraction +STR_1055 :{SMALLFONT}{BLACK}Name person +STR_1056 :{SMALLFONT}{BLACK}Name staff member +STR_1057 :Ride/attraction name +STR_1058 :Enter new name for this ride/attraction: +STR_1059 :Can't rename ride/attraction... +STR_1060 :Invalid ride/attraction name +STR_1061 :Normal mode +STR_1062 :Continuous circuit mode +STR_1063 :Reverse-Incline launched shuttle mode +STR_1064 :Powered launch (passing station) +STR_1065 :Shuttle mode +STR_1066 :Boat hire mode +STR_1067 :Upward launch +STR_1068 :Rotating lift mode +STR_1069 :Station to station mode +STR_1070 :Single ride per admission +STR_1071 :Unlimited rides per admission +STR_1072 :Maze mode +STR_1073 :Race mode +STR_1074 :Bumper-car mode +STR_1075 :Swing mode +STR_1076 :Shop stall mode +STR_1077 :Rotation mode +STR_1078 :Forward rotation +STR_1079 :Backward rotation +STR_1080 :Film: {ENDQUOTES}Avenging aviators{ENDQUOTES} +STR_1081 :3D film: {ENDQUOTES}Mouse tails{ENDQUOTES} +STR_1082 :Space rings mode +STR_1083 :Beginners mode +STR_1084 :LIM-powered launch +STR_1085 :Film: {ENDQUOTES}Thrill riders{ENDQUOTES} +STR_1086 :3D film: {ENDQUOTES}Storm chasers{ENDQUOTES} +STR_1087 :3D film: {ENDQUOTES}Space raiders{ENDQUOTES} +STR_1088 :Intense mode +STR_1089 :Berserk mode +STR_1090 :Haunted house mode +STR_1091 :Circus show mode +STR_1092 :Downward launch +STR_1093 :Crooked house mode +STR_1094 :Freefall drop mode +STR_1095 :Continuous circuit block sectioned mode +STR_1096 :Powered launch (without passing station) +STR_1097 :Powered launch block sectioned mode +STR_1098 :Moving to end of {POP16}{STRINGID} +STR_1099 :Waiting for passengers at {POP16}{STRINGID} +STR_1100 :Waiting to depart {POP16}{STRINGID} +STR_1101 :Departing {POP16}{STRINGID} +STR_1102 :Traveling at {VELOCITY} +STR_1103 :Arriving at {POP16}{STRINGID} +STR_1104 :Unloading passengers at {POP16}{STRINGID} +STR_1105 :Traveling at {VELOCITY} +STR_1106 :Crashing! +STR_1107 :Crashed! +STR_1108 :Traveling at {VELOCITY} +STR_1109 :Swinging +STR_1110 :Rotating +STR_1111 :Rotating +STR_1112 :Operating +STR_1113 :Showing film +STR_1114 :Rotating +STR_1115 :Operating +STR_1116 :Operating +STR_1117 :Doing circus show +STR_1118 :Operating +STR_1119 :Waiting for cable lift +STR_1120 :Traveling at {VELOCITY} +STR_1121 :Stopping +STR_1122 :Waiting for passengers +STR_1123 :Waiting to start +STR_1124 :Starting +STR_1125 :Operating +STR_1126 :Stopping +STR_1127 :Unloading passengers +STR_1128 :Stopped by block brakes +STR_1129 :All vehicles in same colors +STR_1130 :Different colors per {STRINGID} +STR_1131 :Different colors per vehicle +STR_1132 :Vehicle {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1133 :Vehicle {POP16}{COMMA16} +STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} +STR_1135 :{STRINGID} {COMMA16} +STR_1136 :{SMALLFONT}{BLACK}Select main color +STR_1137 :{SMALLFONT}{BLACK}Select additional color 1 +STR_1138 :{SMALLFONT}{BLACK}Select additional color 2 +STR_1139 :{SMALLFONT}{BLACK}Select support structure color +STR_1140 :{SMALLFONT}{BLACK}Select vehicle color scheme option +STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify +STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} +STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} +STR_1144 :Can't build/move entrance for this ride/attraction... +STR_1145 :Can't build/move exit for this ride/attraction... +STR_1146 :Entrance not yet built +STR_1147 :Exit not yet built +STR_1148 :Quarter load +STR_1149 :Half load +STR_1150 :Three-quarter load +STR_1151 :Full load +STR_1152 :Any load +STR_1153 :Height Marks on Ride Tracks +STR_1154 :Height Marks on Land +STR_1155 :Height Marks on Paths +STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} +STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} +STR_1158 :Can't remove this... +STR_1159 :{SMALLFONT}{BLACK}Place scenery, gardens, and other accessories +STR_1160 :{SMALLFONT}{BLACK}Create/adjust lakes & water +STR_1161 :Can't position this here... +STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} +STR_1163 :{STRINGID}{NEWLINE}(Right-Click to Modify) +STR_1164 :{STRINGID}{NEWLINE}(Right-Click to Remove) +STR_1165 :{STRINGID} - {STRINGID} {COMMA16} +STR_1166 :Can't lower water level here... +STR_1167 :Can't raise water level here... +STR_1168 :Options +STR_1169 :(None) +STR_1170 :{STRING} +STR_1171 :{RED}Closed - - +STR_1172 :{YELLOW}{STRINGID} - - +STR_1173 :{SMALLFONT}{BLACK}Build footpaths and queue lines +STR_1174 :Banner sign in the way +STR_1175 :Can't build this on sloped footpath +STR_1176 :Can't build footpath here... +STR_1177 :Can't remove footpath from here... +STR_1178 :Land slope unsuitable +STR_1179 :Footpath in the way +STR_1180 :Can't build this underwater! +STR_1181 :Footpaths +STR_1182 :Type +STR_1183 :Direction +STR_1184 :Slope +STR_1185 :{SMALLFONT}{BLACK}Direction +STR_1186 :{SMALLFONT}{BLACK}Slope down +STR_1187 :{SMALLFONT}{BLACK}Level +STR_1188 :{SMALLFONT}{BLACK}Slope up +STR_1189 :{SMALLFONT}{BLACK}Construct the selected footpath section +STR_1190 :{SMALLFONT}{BLACK}Remove previous footpath section +STR_1191 :{BLACK}{STRINGID} +STR_1192 :{OUTLINE}{RED}{STRINGID} +STR_1193 :{WINDOW_COLOUR_2}{STRINGID} +STR_1194 :Closed +STR_1195 :Test Run +STR_1196 :Open +STR_1197 :Broken Down +STR_1198 :Crashed! +STR_1199 :{COMMA16} person on ride +STR_1200 :{COMMA16} people on ride +STR_1201 :Nobody in queue line +STR_1202 :1 person in queue line +STR_1203 :{COMMA16} people in queue line +STR_1204 :{COMMA16} minute queue time +STR_1205 :{COMMA16} minutes queue time +STR_1206 :{WINDOW_COLOUR_2}Wait for: +STR_1207 :{WINDOW_COLOUR_2}Leave if another train arrives at station +STR_1208 :{WINDOW_COLOUR_2}Leave if another boat arrives at station +STR_1209 :{SMALLFONT}{BLACK}Select whether should wait for passengers before departing +STR_1210 :{SMALLFONT}{BLACK}Select whether should leave if another vehicle arrives at the same station +STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time: +STR_1212 :{WINDOW_COLOUR_2}Maximum waiting time: +STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing +STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing +STR_1215 :{WINDOW_COLOUR_2}Synchronize with adjacent stations +STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronize departure with all adjacent stations (for 'racing') +STR_1217 :{COMMA16} seconds +STR_1218 :{BLACK}{SMALLUP} +STR_1219 :{BLACK}{SMALLDOWN} +STR_1220 :Exit only +STR_1221 :No entrance +STR_1222 :No exit +STR_1223 :{SMALLFONT}{BLACK}Transport rides +STR_1224 :{SMALLFONT}{BLACK}Gentle rides +STR_1225 :{SMALLFONT}{BLACK}Roller coasters +STR_1226 :{SMALLFONT}{BLACK}Thrill rides +STR_1227 :{SMALLFONT}{BLACK}Water rides +STR_1228 :{SMALLFONT}{BLACK}Shops & stalls +STR_1229 :train +STR_1230 :trains +STR_1231 :Train +STR_1232 :Trains +STR_1233 :{COMMA16} train +STR_1234 :{COMMA16} trains +STR_1235 :Train {COMMA16} +STR_1236 :boat +STR_1237 :boats +STR_1238 :Boat +STR_1239 :Boats +STR_1240 :{COMMA16} boat +STR_1241 :{COMMA16} boats +STR_1242 :Boat {COMMA16} +STR_1243 :track +STR_1244 :tracks +STR_1245 :Track +STR_1246 :Tracks +STR_1247 :{COMMA16} track +STR_1248 :{COMMA16} tracks +STR_1249 :Track {COMMA16} +STR_1250 :docking platform +STR_1251 :docking platforms +STR_1252 :Docking platform +STR_1253 :Docking platforms +STR_1254 :{COMMA16} docking platform +STR_1255 :{COMMA16} docking platforms +STR_1256 :Docking platform {COMMA16} +STR_1257 :station +STR_1258 :stations +STR_1259 :Station +STR_1260 :Stations +STR_1261 :{COMMA16} station +STR_1262 :{COMMA16} stations +STR_1263 :Station {COMMA16} +STR_1264 :car +STR_1265 :cars +STR_1266 :Car +STR_1267 :Cars +STR_1268 :{COMMA16} car +STR_1269 :{COMMA16} cars +STR_1270 :Car {COMMA16} +STR_1271 :building +STR_1272 :buildings +STR_1273 :Building +STR_1274 :Buildings +STR_1275 :{COMMA16} building +STR_1276 :{COMMA16} buildings +STR_1277 :Building {COMMA16} +STR_1278 :structure +STR_1279 :structures +STR_1280 :Structure +STR_1281 :Structures +STR_1282 :{COMMA16} structure +STR_1283 :{COMMA16} structures +STR_1284 :Structure {COMMA16} +STR_1285 :ship +STR_1286 :ships +STR_1287 :Ship +STR_1288 :Ships +STR_1289 :{COMMA16} ship +STR_1290 :{COMMA16} ships +STR_1291 :Ship {COMMA16} +STR_1292 :cabin +STR_1293 :cabins +STR_1294 :Cabin +STR_1295 :Cabins +STR_1296 :{COMMA16} cabin +STR_1297 :{COMMA16} cabins +STR_1298 :Cabin {COMMA16} +STR_1299 :wheel +STR_1300 :wheels +STR_1301 :Wheel +STR_1302 :Wheels +STR_1303 :{COMMA16} wheel +STR_1304 :{COMMA16} wheels +STR_1305 :Wheel {COMMA16} +STR_1306 :ring +STR_1307 :rings +STR_1308 :Ring +STR_1309 :Rings +STR_1310 :{COMMA16} ring +STR_1311 :{COMMA16} rings +STR_1312 :Ring {COMMA16} +STR_1313 :player +STR_1314 :players +STR_1315 :Player +STR_1316 :Players +STR_1317 :{COMMA16} player +STR_1318 :{COMMA16} players +STR_1319 :Player {COMMA16} +STR_1320 :course +STR_1321 :courses +STR_1322 :Course +STR_1323 :Courses +STR_1324 :{COMMA16} course +STR_1325 :{COMMA16} courses +STR_1326 :Course {COMMA16} +STR_1327 :{SMALLFONT}{BLACK}Rotate objects by 90{DEGREE} +STR_1328 :Level land required +STR_1329 :{WINDOW_COLOUR_2}Launch speed: +STR_1330 :{SMALLFONT}{BLACK}Maximum speed when leaving station +STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_1332 :{VELOCITY} +STR_1333 :{STRINGID} - {STRINGID}{POP16} +STR_1334 :{STRINGID} - {STRINGID} {COMMA16} +STR_1335 :{STRINGID} - Entrance{POP16}{POP16} +STR_1336 :{STRINGID} - Station {POP16}{COMMA16} Entrance +STR_1337 :{STRINGID} - Exit{POP16}{POP16} +STR_1338 :{STRINGID} - Station {POP16}{COMMA16} Exit +STR_1339 :{BLACK}No test results yet... +STR_1340 :{WINDOW_COLOUR_2}Max. speed: {BLACK}{VELOCITY} +STR_1341 :{WINDOW_COLOUR_2}Ride time: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1342 :{DURATION} +STR_1343 :{DURATION} / +STR_1344 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1345 :{LENGTH} +STR_1346 :{LENGTH} / +STR_1347 :{WINDOW_COLOUR_2}Average speed: {BLACK}{VELOCITY} +STR_1348 :{WINDOW_COLOUR_2}Max. positive vertical G's: {BLACK}{COMMA2DP32}g +STR_1349 :{WINDOW_COLOUR_2}Max. positive vertical G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1350 :{WINDOW_COLOUR_2}Max. negative vertical G's: {BLACK}{COMMA2DP32}g +STR_1351 :{WINDOW_COLOUR_2}Max. negative vertical G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1352 :{WINDOW_COLOUR_2}Max. lateral G's: {BLACK}{COMMA2DP32}g +STR_1353 :{WINDOW_COLOUR_2}Max. lateral G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1354 :{WINDOW_COLOUR_2}Highest drop height: {BLACK}{LENGTH} +STR_1355 :{WINDOW_COLOUR_2}Drops: {BLACK}{COMMA16} +STR_1356 :{WINDOW_COLOUR_2}Inversions: {BLACK}{COMMA16} +STR_1357 :{WINDOW_COLOUR_2}Holes: {BLACK}{COMMA16} +STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs +STR_1359 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minute +STR_1360 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minutes +STR_1361 :Can't change speed... +STR_1362 :Can't change launch speed... +STR_1363 :Too high for supports! +STR_1364 :Supports for track above can't be extended any further! +STR_1365 :In-line Twist (left) +STR_1366 :In-line Twist (right) +STR_1367 :Half Loop +STR_1368 :Half Corkscrew (left) +STR_1369 :Half Corkscrew (right) +STR_1370 :Barrel Roll (left) +STR_1371 :Barrel Roll (right) +STR_1372 :Launched Lift Hill +STR_1373 :Large Half Loop (left) +STR_1374 :Large Half Loop (right) +STR_1375 :Upper Transfer +STR_1376 :Lower Transfer +STR_1377 :Heartline Roll (left) +STR_1378 :Heartline Roll (right) +STR_1379 :Reverser (left) +STR_1380 :Reverser (right) +STR_1381 :Curved Lift Hill (left) +STR_1382 :Curved Lift Hill (right) +STR_1383 :Quarter Loop +STR_1384 :{YELLOW}{STRINGID} +STR_1385 :{SMALLFONT}{BLACK}Other track configurations +STR_1386 :Special... +STR_1387 :Can't change land type... +STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} +STR_1389 :{OUTLINE}{RED}- {CURRENCY} +STR_1390 :{CURRENCY2DP} +STR_1391 :{RED}{CURRENCY2DP} +STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction +STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options +STR_1394 :{SMALLFONT}{BLACK}Operating options +STR_1395 :{SMALLFONT}{BLACK}Maintenance options +STR_1396 :{SMALLFONT}{BLACK}Color scheme options +STR_1397 :{SMALLFONT}{BLACK}Sound & music options +STR_1398 :{SMALLFONT}{BLACK}Measurements and test data +STR_1399 :{SMALLFONT}{BLACK}Graphs +STR_1400 :Entrance +STR_1401 :Exit +STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction +STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction +STR_1404 :{SMALLFONT}{BLACK}Rotate 90{DEGREE} +STR_1405 :{SMALLFONT}{BLACK}Mirror image +STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) +STR_1407 :{WINDOW_COLOUR_2}Build this... +STR_1408 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} +STR_1409 :Entry/Exit Platform +STR_1410 :Vertical Tower +STR_1411 :{STRINGID} in the way +STR_1412 :{WINDOW_COLOUR_3}Data logging not available for this type of ride +STR_1413 :{WINDOW_COLOUR_3}Data logging will start when next {STRINGID} leaves {STRINGID} +STR_1414 :{SMALLFONT}{BLACK}{DURATION} +STR_1415 :{WINDOW_COLOUR_2}Velocity +STR_1416 :{WINDOW_COLOUR_2}Altitude +STR_1417 :{WINDOW_COLOUR_2}Vert.G's +STR_1418 :{WINDOW_COLOUR_2}Lat.G's +STR_1419 :{SMALLFONT}{BLACK}{VELOCITY} +STR_1420 :{SMALLFONT}{BLACK}{LENGTH} +STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g +STR_1422 :{SMALLFONT}{BLACK}Logging data from {POP16}{STRINGID} +STR_1423 :{SMALLFONT}{BLACK}Queue line path +STR_1424 :{SMALLFONT}{BLACK}Footpath +STR_1425 :Footpath +STR_1426 :Queue Line +STR_1427 :{WINDOW_COLOUR_2}Customers: {BLACK}{COMMA32} per hour +STR_1428 :{WINDOW_COLOUR_2}Admission price: +STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1430 :Free +STR_1431 :Walking +STR_1432 :Heading for {STRINGID} +STR_1433 :Queuing for {STRINGID} +STR_1434 :Drowning +STR_1435 :On {STRINGID} +STR_1436 :In {STRINGID} +STR_1437 :At {STRINGID} +STR_1438 :Sitting +STR_1439 :(select location) +STR_1440 :Mowing grass +STR_1441 :Sweeping footpath +STR_1442 :Emptying litter bin +STR_1443 :Watering gardens +STR_1444 :Watching {STRINGID} +STR_1445 :Watching construction of {STRINGID} +STR_1446 :Looking at scenery +STR_1447 :Leaving the park +STR_1448 :Watching new ride being constructed +STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) +STR_1452 :Guest's name +STR_1453 :Enter name for this guest: +STR_1454 :Can't name guest... +STR_1455 :Invalid name for guest +STR_1456 :{WINDOW_COLOUR_2}Cash spent: {BLACK}{CURRENCY2DP} +STR_1457 :{WINDOW_COLOUR_2}Cash in pocket: {BLACK}{CURRENCY2DP} +STR_1458 :{WINDOW_COLOUR_2}Time in park: {BLACK}{REALTIME} +STR_1459 :Track style +STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track +STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track +STR_1462 :Too steep for lift hill +STR_1463 :Guests +STR_1464 :Helix up (small) +STR_1465 :Helix up (large) +STR_1466 :Helix down (small) +STR_1467 :Helix down (large) +STR_1468 :Staff +STR_1469 :Ride must start and end with stations +STR_1470 :Station not long enough +STR_1471 :{WINDOW_COLOUR_2}Speed: +STR_1472 :{SMALLFONT}{BLACK}Speed of this ride +STR_1473 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1474 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}Not yet available +STR_1475 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1476 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}Not yet available +STR_1477 :{WINDOW_COLOUR_2}Intensity rating: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) +STR_1478 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1479 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}Not yet available +STR_1480 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} +STR_1481 :{SMALLFONT}{OPENQUOTES}I've spent all my money{ENDQUOTES} +STR_1482 :{SMALLFONT}{OPENQUOTES}I feel sick{ENDQUOTES} +STR_1483 :{SMALLFONT}{OPENQUOTES}I feel very sick{ENDQUOTES} +STR_1484 :{SMALLFONT}{OPENQUOTES}I want to go on something more thrilling than {STRINGID}{ENDQUOTES} +STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} looks too intense for me{ENDQUOTES} +STR_1486 :{SMALLFONT}{OPENQUOTES}I haven't finished my {STRINGID} yet{ENDQUOTES} +STR_1487 :{SMALLFONT}{OPENQUOTES}Just looking at {STRINGID} makes me feel sick{ENDQUOTES} +STR_1488 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to go on {STRINGID}{ENDQUOTES} +STR_1489 :{SMALLFONT}{OPENQUOTES}I want to go home{ENDQUOTES} +STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} is really good value{ENDQUOTES} +STR_1491 :{SMALLFONT}{OPENQUOTES}I've already got {STRINGID}{ENDQUOTES} +STR_1492 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} +STR_1493 :{SMALLFONT}{OPENQUOTES}I'm not hungry{ENDQUOTES} +STR_1494 :{SMALLFONT}{OPENQUOTES}I'm not thirsty{ENDQUOTES} +STR_1495 :{SMALLFONT}{OPENQUOTES}Help! I'm drowning!{ENDQUOTES} +STR_1496 :{SMALLFONT}{OPENQUOTES}I'm lost!{ENDQUOTES} +STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} was great{ENDQUOTES} +STR_1498 :{SMALLFONT}{OPENQUOTES}I've been queuing for {STRINGID} for ages{ENDQUOTES} +STR_1499 :{SMALLFONT}{OPENQUOTES}I'm tired{ENDQUOTES} +STR_1500 :{SMALLFONT}{OPENQUOTES}I'm hungry{ENDQUOTES} +STR_1501 :{SMALLFONT}{OPENQUOTES}I'm thirsty{ENDQUOTES} +STR_1502 :{SMALLFONT}{OPENQUOTES}I need to go to the bathroom{ENDQUOTES} +STR_1503 :{SMALLFONT}{OPENQUOTES}I can't find {STRINGID}{ENDQUOTES} +STR_1504 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to use {STRINGID}{ENDQUOTES} +STR_1505 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} while it's raining{ENDQUOTES} +STR_1506 :{SMALLFONT}{OPENQUOTES}The litter here is really bad{ENDQUOTES} +STR_1507 :{SMALLFONT}{OPENQUOTES}I can't find the park exit{ENDQUOTES} +STR_1508 :{SMALLFONT}{OPENQUOTES}I want to get off {STRINGID}{ENDQUOTES} +STR_1509 :{SMALLFONT}{OPENQUOTES}I want to get out of {STRINGID}{ENDQUOTES} +STR_1510 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} - It isn't safe{ENDQUOTES} +STR_1511 :{SMALLFONT}{OPENQUOTES}This path is disgusting{ENDQUOTES} +STR_1512 :{SMALLFONT}{OPENQUOTES}It's too crowded here{ENDQUOTES} +STR_1513 :{SMALLFONT}{OPENQUOTES}The vandalism here is really bad{ENDQUOTES} +STR_1514 :{SMALLFONT}{OPENQUOTES}Great scenery!{ENDQUOTES} +STR_1515 :{SMALLFONT}{OPENQUOTES}This park is really clean and tidy{ENDQUOTES} +STR_1516 :{SMALLFONT}{OPENQUOTES}The jumping fountains are great{ENDQUOTES} +STR_1517 :{SMALLFONT}{OPENQUOTES}The music is nice here{ENDQUOTES} +STR_1518 :{SMALLFONT}{OPENQUOTES}This balloon from {STRINGID} is really good value{ENDQUOTES} +STR_1519 :{SMALLFONT}{OPENQUOTES}This cuddly toy from {STRINGID} is really good value{ENDQUOTES} +STR_1520 :{SMALLFONT}{OPENQUOTES}This park map from {STRINGID} is really good value{ENDQUOTES} +STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} +STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} +STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}These fries from {STRINGID} are really good value{ENDQUOTES} +STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}This cotton candy from {STRINGID} is really good value{ENDQUOTES} +STR_1528 : +STR_1529 : +STR_1530 : +STR_1531 :{SMALLFONT}{OPENQUOTES}This pizza from {STRINGID} is really good value{ENDQUOTES} +STR_1532 : +STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good value{ENDQUOTES} +STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} +STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} +STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}This candy apple from {STRINGID} is really good value{ENDQUOTES} +STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}This donut from {STRINGID} is really good value{ENDQUOTES} +STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} +STR_1541 : +STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} +STR_1543 :{SMALLFONT}{OPENQUOTES}This lemonade from {STRINGID} is really good value{ENDQUOTES} +STR_1544 : +STR_1545 : +STR_1546 : +STR_1547 : +STR_1548 : +STR_1549 : +STR_1550 :{SMALLFONT}{OPENQUOTES}Wow!{ENDQUOTES} +STR_1551 :{SMALLFONT}{OPENQUOTES}I have the strangest feeling someone is watching me{ENDQUOTES} +STR_1552 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a balloon from {STRINGID}{ENDQUOTES} +STR_1553 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cuddly toy from {STRINGID}{ENDQUOTES} +STR_1554 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a park map from {STRINGID}{ENDQUOTES} +STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} +STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} +STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fries from {STRINGID}{ENDQUOTES} +STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for cotton candy from {STRINGID}{ENDQUOTES} +STR_1562 : +STR_1563 : +STR_1564 : +STR_1565 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for pizza from {STRINGID}{ENDQUOTES} +STR_1566 : +STR_1567 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for popcorn from {STRINGID}{ENDQUOTES} +STR_1568 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hot dog from {STRINGID}{ENDQUOTES} +STR_1569 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for tentacle from {STRINGID}{ENDQUOTES} +STR_1570 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hat from {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a candy apple from {STRINGID}{ENDQUOTES} +STR_1572 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a T-shirt from {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a donut from {STRINGID}{ENDQUOTES} +STR_1574 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for coffee from {STRINGID}{ENDQUOTES} +STR_1575 : +STR_1576 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried chicken from {STRINGID}{ENDQUOTES} +STR_1577 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for lemonade from {STRINGID}{ENDQUOTES} +STR_1578 : +STR_1579 : +STR_1580 : +STR_1581 : +STR_1582 : +STR_1583 : +STR_1584 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1585 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1586 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1587 :{SMALLFONT}{OPENQUOTES}This pretzel from {STRINGID} is really good value{ENDQUOTES} +STR_1588 :{SMALLFONT}{OPENQUOTES}This hot chocolate from {STRINGID} is really good value{ENDQUOTES} +STR_1589 :{SMALLFONT}{OPENQUOTES}This iced tea from {STRINGID} is really good value{ENDQUOTES} +STR_1590 :{SMALLFONT}{OPENQUOTES}This funnel cake from {STRINGID} is really good value{ENDQUOTES} +STR_1591 :{SMALLFONT}{OPENQUOTES}These sunglasses from {STRINGID} are really good value{ENDQUOTES} +STR_1592 :{SMALLFONT}{OPENQUOTES}These beef noodles from {STRINGID} are really good value{ENDQUOTES} +STR_1593 :{SMALLFONT}{OPENQUOTES}These fried rice noodles from {STRINGID} are really good value{ENDQUOTES} +STR_1594 :{SMALLFONT}{OPENQUOTES}This wonton soup from {STRINGID} is really good value{ENDQUOTES} +STR_1595 :{SMALLFONT}{OPENQUOTES}This meatball soup from {STRINGID} is really good value{ENDQUOTES} +STR_1596 :{SMALLFONT}{OPENQUOTES}This fruit juice from {STRINGID} is really good value{ENDQUOTES} +STR_1597 :{SMALLFONT}{OPENQUOTES}This soybean milk from {STRINGID} is really good value{ENDQUOTES} +STR_1598 :{SMALLFONT}{OPENQUOTES}This sujongkwa from {STRINGID} is really good value{ENDQUOTES} +STR_1599 :{SMALLFONT}{OPENQUOTES}This sub sandwich from {STRINGID} is really good value{ENDQUOTES} +STR_1600 :{SMALLFONT}{OPENQUOTES}This cookie from {STRINGID} is really good value{ENDQUOTES} +STR_1601 : +STR_1602 : +STR_1603 : +STR_1604 :{SMALLFONT}{OPENQUOTES}This roast sausage from {STRINGID} are really good value{ENDQUOTES} +STR_1605 : +STR_1606 : +STR_1607 : +STR_1608 : +STR_1609 : +STR_1610 : +STR_1611 : +STR_1612 : +STR_1613 : +STR_1614 : +STR_1615 : +STR_1616 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1617 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1618 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1619 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a pretzel from {STRINGID}{ENDQUOTES} +STR_1620 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for hot chocolate from {STRINGID}{ENDQUOTES} +STR_1621 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for iced tea from {STRINGID}{ENDQUOTES} +STR_1622 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a funnel cake from {STRINGID}{ENDQUOTES} +STR_1623 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sunglasses from {STRINGID}{ENDQUOTES} +STR_1624 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for beef noodles from {STRINGID}{ENDQUOTES} +STR_1625 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried rice noodles from {STRINGID}{ENDQUOTES} +STR_1626 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for wonton soup from {STRINGID}{ENDQUOTES} +STR_1627 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for meatball soup from {STRINGID}{ENDQUOTES} +STR_1628 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fruit juice from {STRINGID}{ENDQUOTES} +STR_1629 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for soybean milk from {STRINGID}{ENDQUOTES} +STR_1630 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sujongkwa from {STRINGID}{ENDQUOTES} +STR_1631 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a sub sandwich from {STRINGID}{ENDQUOTES} +STR_1632 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cookie from {STRINGID}{ENDQUOTES} +STR_1633 : +STR_1634 : +STR_1635 : +STR_1636 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a roast sausage from {STRINGID}{ENDQUOTES} +STR_1637 : +STR_1638 : +STR_1639 : +STR_1640 : +STR_1641 : +STR_1642 : +STR_1643 : +STR_1644 : +STR_1645 : +STR_1646 : +STR_1647 : +STR_1648 :{SMALLFONT}{OPENQUOTES}Help! Put me down!{ENDQUOTES} +STR_1649 :{SMALLFONT}{OPENQUOTES}I'm running out of cash!{ENDQUOTES} +STR_1650 :{SMALLFONT}{OPENQUOTES}Wow! A new ride being built!{ENDQUOTES} +STR_1651 :{SMALLFONT}{OPENQUOTES}Nice ride! But not as good as the Phoenix...{ENDQUOTES} +STR_1652 :{SMALLFONT}{OPENQUOTES}I'm so excited - It's an Intamin ride!{ENDQUOTES} +STR_1653 :{SMALLFONT}{OPENQUOTES}...and here we are on {STRINGID}!{ENDQUOTES} +STR_1654 :{WINDOW_COLOUR_2}Recent thoughts: +STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land +STR_1656 :{SMALLFONT}{BLACK}Construct bridge or tunnel footpath +STR_1657 :{WINDOW_COLOUR_2}Preferred ride +STR_1658 :{WINDOW_COLOUR_2}intensity: {BLACK}less than {COMMA16} +STR_1659 :{WINDOW_COLOUR_2}intensity: {BLACK}between {COMMA16} and {COMMA16} +STR_1660 :{WINDOW_COLOUR_2}intensity: {BLACK}more than {COMMA16} +STR_1661 :{WINDOW_COLOUR_2}Nausea tolerance: {BLACK}{STRINGID} +STR_1662 :{WINDOW_COLOUR_2}Happiness: +STR_1663 :{WINDOW_COLOUR_2}Nausea: +STR_1664 :{WINDOW_COLOUR_2}Energy: +STR_1665 :{WINDOW_COLOUR_2}Hunger: +STR_1666 :{WINDOW_COLOUR_2}Thirst: +STR_1667 :{WINDOW_COLOUR_2}Bathroom: +STR_1668 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}Unknown +STR_1669 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}{COMMA16}% +STR_1670 :{WINDOW_COLOUR_2}Total customers: {BLACK}{COMMA32} +STR_1671 :{WINDOW_COLOUR_2}Total profit: {BLACK}{CURRENCY2DP} +STR_1672 :Brakes +STR_1673 :Spinning Control Toggle Track +STR_1674 :Brake speed +STR_1675 :{POP16}{VELOCITY} +STR_1676 :{SMALLFONT}{BLACK}Set speed limit for brakes +STR_1677 :{WINDOW_COLOUR_2}Popularity: {BLACK}Unknown +STR_1678 :{WINDOW_COLOUR_2}Popularity: {BLACK}{COMMA16}% +STR_1679 :Helix up (left) +STR_1680 :Helix up (right) +STR_1681 :Helix down (left) +STR_1682 :Helix down (right) +STR_1683 :Base size 2 x 2 +STR_1684 :Base size 4 x 4 +STR_1685 :Base size 2 x 4 +STR_1686 :Base size 5 x 1 +STR_1687 :Water splash +STR_1688 :Base size 4 x 1 +STR_1689 :Block brakes +STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} +STR_1691 :{WINDOW_COLOUR_2} Cost: {BLACK}{CURRENCY} +STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY} +STR_1693 :{SMALLFONT}{BLACK}Guests +STR_1694 :{SMALLFONT}{BLACK}Staff +STR_1695 :{SMALLFONT}{BLACK}Income and costs +STR_1696 :{SMALLFONT}{BLACK}Customer information +STR_1697 :Cannot place these on queue line area +STR_1698 :Can only place these on queue area +STR_1699 :Too many people in game +STR_1700 :Hire new Handyman +STR_1701 :Hire new Mechanic +STR_1702 :Hire new Security Guard +STR_1703 :Hire new Entertainer +STR_1704 :Can't hire new staff... +STR_1705 :{SMALLFONT}{BLACK}Sack this staff member +STR_1706 :{SMALLFONT}{BLACK}Move this person to a new location +STR_1707 :Too many staff in game +STR_1708 :{SMALLFONT}{BLACK}Set patrol area for this staff member +STR_1709 :Sack staff +STR_1710 :Yes +STR_1711 :{WINDOW_COLOUR_1}Are you sure you want to sack {STRINGID}? +STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Sweep footpaths +STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Water gardens +STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Empty litter bins +STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Mow grass +STR_1716 :Invalid name for park +STR_1717 :Can't rename park... +STR_1718 :Park Name +STR_1719 :Enter name for park: +STR_1720 :{SMALLFONT}{BLACK}Name park +STR_1721 :Park closed +STR_1722 :Park open +STR_1723 :Can't open park... +STR_1724 :Can't close park... +STR_1725 :Can't buy land... +STR_1726 :Land not for sale! +STR_1727 :Construction rights not for sale! +STR_1728 :Can't buy construction rights here... +STR_1729 :Land not owned by park! +STR_1730 :{RED}Closed - - +STR_1731 :{WHITE}{STRINGID} - - +STR_1732 :Build +STR_1733 :Mode +STR_1734 :{WINDOW_COLOUR_2}Number of laps: +STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit +STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1737 :{COMMA16} +STR_1738 :Can't change number of laps... +STR_1739 :Race won by guest {INT32} +STR_1740 :Race won by {STRINGID} +STR_1741 :Not yet constructed ! +STR_1742 :{WINDOW_COLOUR_2}Max. people on ride: +STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this ride at one time +STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1745 :{COMMA16} +STR_1746 :Can't change this... +STR_1747 :{WINDOW_COLOUR_2}Time limit: +STR_1748 :{SMALLFONT}{BLACK}Time limit for ride +STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} +STR_1750 :{DURATION} +STR_1751 :Can't change time limit for ride... +STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park +STR_1753 :{SMALLFONT}{BLACK}Show summarized list of guests in park +STR_1754 :{BLACK}{COMMA16} guests +STR_1755 :{BLACK}{COMMA16} guest +STR_1756 :{WINDOW_COLOUR_2}Admission price: +STR_1757 :{WINDOW_COLOUR_2}Reliability: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1758 :{SMALLFONT}{BLACK}Build mode +STR_1759 :{SMALLFONT}{BLACK}Move mode +STR_1760 :{SMALLFONT}{BLACK}Fill-in mode +STR_1761 :{SMALLFONT}{BLACK}Build maze in this direction +STR_1762 :Waterfalls +STR_1763 :Rapids +STR_1764 :Log Bumps +STR_1765 :On-ride photo section +STR_1766 :Reverser turntable +STR_1767 :Spinning tunnel +STR_1768 :Can't change number of swings... +STR_1769 :{WINDOW_COLOUR_2}Number of swings: +STR_1770 :{SMALLFONT}{BLACK}Number of complete swings +STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1772 :{COMMA16} +STR_1773 :Only one on-ride photo section allowed per ride +STR_1774 :Only one cable lift hill allowed per ride +STR_1775 :Off +STR_1776 :On +STR_1777 :{WINDOW_COLOUR_2}Music +STR_1778 :{STRINGID} - - +STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume +STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume +STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume +STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume +STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snowman costume +STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Knight costume +STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume +STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume +STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume +STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume +STR_1790 :{SMALLFONT}{BLACK}Select uniform color for this type of staff +STR_1791 :{WINDOW_COLOUR_2}Uniform color: +STR_1792 :Responding to {STRINGID} breakdown call +STR_1793 :Heading to {STRINGID} for an inspection +STR_1794 :Fixing {STRINGID} +STR_1795 :Answering radio call +STR_1796 :Has broken down and requires fixing +STR_1797 :This option cannot be changed for this ride +STR_1798 :Whirlpool +STR_1799 :{POP16}{POP16}{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1800 :Safety cut-out +STR_1801 :Restraints stuck closed +STR_1802 :Restraints stuck open +STR_1803 :Doors stuck closed +STR_1804 :Doors stuck open +STR_1805 :Vehicle malfunction +STR_1806 :Brakes failure +STR_1807 :Control failure +STR_1808 :{WINDOW_COLOUR_2}Last breakdown: {BLACK}{STRINGID} +STR_1809 :{WINDOW_COLOUR_2}Current breakdown: {OUTLINE}{RED}{STRINGID} +STR_1810 :{WINDOW_COLOUR_2}Carrying: +STR_1811 :Can't build this here... +STR_1812 :{SMALLFONT}{BLACK}{STRINGID} +STR_1813 :Miscellaneous Objects +STR_1814 :Actions +STR_1815 :Thoughts +STR_1816 :{SMALLFONT}{BLACK}Select information type to show in guest list +STR_1817 :({COMMA16}) +STR_1818 :{WINDOW_COLOUR_2}All guests +STR_1819 :{WINDOW_COLOUR_2}All guests (summarized) +STR_1820 :{WINDOW_COLOUR_2}Guests {STRINGID} +STR_1821 :{WINDOW_COLOUR_2}Guests thinking {STRINGID} +STR_1822 :{WINDOW_COLOUR_2}Guests thinking about {POP16}{STRINGID} +STR_1823 :{SMALLFONT}{BLACK}Show guests' thoughts about this ride/attraction +STR_1824 :{SMALLFONT}{BLACK}Show guests on this ride/attraction +STR_1825 :{SMALLFONT}{BLACK}Show guests queuing for this ride/attraction +STR_1826 :Status +STR_1827 :Popularity +STR_1828 :Satisfaction +STR_1829 :Profit +STR_1830 :Queue length +STR_1831 :Queue time +STR_1832 :Reliability +STR_1833 :Down-time +STR_1834 :Guests favorite +STR_1835 :Popularity: Unknown +STR_1836 :Popularity: {COMMA16}% +STR_1837 :Satisfaction: Unknown +STR_1838 :Satisfaction: {COMMA16}% +STR_1839 :Reliability: {COMMA16}% +STR_1840 :Down-time: {COMMA16}% +STR_1841 :Profit: {CURRENCY2DP} per hour +STR_1842 :Favorite of: {COMMA16} guest +STR_1843 :Favorite of: {COMMA16} guests +STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list +STR_1845 :{MONTHYEAR} +STR_1846 :{COMMA16} guests +STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} guests +STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} guests +STR_1849 :{WINDOW_COLOUR_2}Play music +STR_1850 :{SMALLFONT}{BLACK}Select whether music should be played for this ride +STR_1851 :{WINDOW_COLOUR_2}Running cost: {BLACK}{CURRENCY2DP} per hour +STR_1852 :{WINDOW_COLOUR_2}Running cost: {BLACK}Unknown +STR_1853 :{WINDOW_COLOUR_2}Built: {BLACK}This Year +STR_1854 :{WINDOW_COLOUR_2}Built: {BLACK}Last Year +STR_1855 :{WINDOW_COLOUR_2}Built: {BLACK}{COMMA16} Years Ago +STR_1856 :{WINDOW_COLOUR_2}Profit per item sold: {BLACK}{CURRENCY2DP} +STR_1857 :{WINDOW_COLOUR_2}Loss per item sold: {BLACK}{CURRENCY2DP} +STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY2DP} per month +STR_1859 :Handymen +STR_1860 :Mechanics +STR_1861 :Security Guards +STR_1862 :Entertainers +STR_1863 :Handyman +STR_1864 :Mechanic +STR_1865 :Security Guard +STR_1866 :Entertainer +STR_1867 :{BLACK}{COMMA16} {STRINGID} +STR_1868 :Can't change number of rotations... +STR_1869 :{WINDOW_COLOUR_2}Number of rotations: +STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations +STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1872 :{COMMA16} +STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY2DP} per hour +STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour +STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} +STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides +STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides +STR_1878 :{WINDOW_COLOUR_2}Inspection: +STR_1879 :Every 10 minutes +STR_1880 :Every 20 minutes +STR_1881 :Every 30 minutes +STR_1882 :Every 45 minutes +STR_1883 :Every hour +STR_1884 :Every 2 hours +STR_1885 :Never +STR_1886 :Inspecting {STRINGID} +STR_1887 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}{COMMA16} minutes +STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hours +STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride +STR_1891 :No {STRINGID} in park yet! +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : +STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} +STR_1895 :{SMALLFONT}{BLACK}Build new ride/attraction +STR_1896 :{WINDOW_COLOUR_2}Expenditure/Income +STR_1897 :{WINDOW_COLOUR_2}Ride construction +STR_1898 :{WINDOW_COLOUR_2}Ride running costs +STR_1899 :{WINDOW_COLOUR_2}Land purchase +STR_1900 :{WINDOW_COLOUR_2}Landscaping +STR_1901 :{WINDOW_COLOUR_2}Park entrance tickets +STR_1902 :{WINDOW_COLOUR_2}Ride tickets +STR_1903 :{WINDOW_COLOUR_2}Shop sales +STR_1904 :{WINDOW_COLOUR_2}Shop stock +STR_1905 :{WINDOW_COLOUR_2}Food/drink sales +STR_1906 :{WINDOW_COLOUR_2}Food/drink stock +STR_1907 :{WINDOW_COLOUR_2}Staff wages +STR_1908 :{WINDOW_COLOUR_2}Marketing +STR_1909 :{WINDOW_COLOUR_2}Research +STR_1910 :{WINDOW_COLOUR_2}Loan interest +STR_1911 :{BLACK} at {COMMA16}% per year +STR_1912 :{MONTH} +STR_1913 :{BLACK}+{CURRENCY2DP} +STR_1914 :{BLACK}{CURRENCY2DP} +STR_1915 :{RED}{CURRENCY2DP} +STR_1916 :{WINDOW_COLOUR_2}Loan: +STR_1917 :{POP16}{POP16}{POP16}{CURRENCY} +STR_1918 :Can't borrow any more money! +STR_1919 :Not enough cash available! +STR_1920 :Can't pay back loan! +STR_1921 :{SMALLFONT}{BLACK}Start a new game +STR_1922 :{SMALLFONT}{BLACK}Continue playing a saved game +STR_1923 :{SMALLFONT}{BLACK}Show tutorial +STR_1924 :{SMALLFONT}{BLACK}Exit +STR_1925 :Can't place person here... +STR_1926 :{SMALLFONT} +STR_1927 :{YELLOW}{STRINGID} has broken down +STR_1928 :{RED}{STRINGID} has crashed! +STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better +STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this guest - (If tracking is on, guest's movements will be reported in the message area) +STR_1931 :{STRINGID} has joined the queue line for {STRINGID} +STR_1932 :{STRINGID} is on {STRINGID} +STR_1933 :{STRINGID} is in {STRINGID} +STR_1934 :{STRINGID} has left {STRINGID} +STR_1935 :{STRINGID} has left the park +STR_1936 :{STRINGID} has bought {STRINGID} +STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message +STR_1938 :{SMALLFONT}{BLACK}Show view of guest +STR_1939 :{SMALLFONT}{BLACK}Show view of staff member +STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this guest +STR_1941 :{SMALLFONT}{BLACK}Show which rides this guest has been on +STR_1942 :{SMALLFONT}{BLACK}Show financial information about this guest +STR_1943 :{SMALLFONT}{BLACK}Show guest's recent thoughts +STR_1944 :{SMALLFONT}{BLACK}Show items guest is carrying +STR_1945 :{SMALLFONT}{BLACK}Show orders and options for this staff member +STR_1946 :{SMALLFONT}{BLACK}Select costume for this entertainer +STR_1947 :{SMALLFONT}{BLACK}Show areas patrolled by selected staff type, and locate the nearest staff member +STR_1948 :{SMALLFONT}{BLACK}Hire a new staff member of the selected type +STR_1949 :Financial Summary +STR_1950 :Financial Graph +STR_1951 :Park Value Graph +STR_1952 :Profit Graph +STR_1953 :Marketing +STR_1954 :Research Funding +STR_1955 :{WINDOW_COLOUR_2}Number of circuits: +STR_1956 :{SMALLFONT}{BLACK}Number of circuits of track per ride +STR_1957 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1958 :{COMMA16} +STR_1959 :Can't change number of circuits... +STR_1960 :{WINDOW_COLOUR_2}Balloon price: +STR_1961 :{WINDOW_COLOUR_2}Cuddly Toy price: +STR_1962 :{WINDOW_COLOUR_2}Park Map price: +STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_1964 :{WINDOW_COLOUR_2}Umbrella price: +STR_1965 :{WINDOW_COLOUR_2}Drink price: +STR_1966 :{WINDOW_COLOUR_2}Burger price: +STR_1967 :{WINDOW_COLOUR_2}Fries price: +STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: +STR_1969 :{WINDOW_COLOUR_2}Cotton Candy price: +STR_1970 :{WINDOW_COLOUR_2} +STR_1971 :{WINDOW_COLOUR_2} +STR_1972 :{WINDOW_COLOUR_2} +STR_1973 :{WINDOW_COLOUR_2}Pizza price: +STR_1974 :{WINDOW_COLOUR_2} +STR_1975 :{WINDOW_COLOUR_2}Popcorn price: +STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: +STR_1977 :{WINDOW_COLOUR_2}Tentacle price: +STR_1978 :{WINDOW_COLOUR_2}Hat price: +STR_1979 :{WINDOW_COLOUR_2}Candy Apple price: +STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: +STR_1981 :{WINDOW_COLOUR_2}Donut price: +STR_1982 :{WINDOW_COLOUR_2}Coffee price: +STR_1983 :{WINDOW_COLOUR_2} +STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: +STR_1985 :{WINDOW_COLOUR_2}Lemonade price: +STR_1986 :{WINDOW_COLOUR_2} +STR_1987 :{WINDOW_COLOUR_2} +STR_1988 :Balloon +STR_1989 :Cuddly Toy +STR_1990 :Park Map +STR_1991 :On-Ride Photo +STR_1992 :Umbrella +STR_1993 :Drink +STR_1994 :Burger +STR_1995 :Fries +STR_1996 :Ice Cream +STR_1997 :Cotton Candy +STR_1998 :Empty Can +STR_1999 :Rubbish +STR_2000 :Empty Burger Box +STR_2001 :Pizza +STR_2002 :Voucher +STR_2003 :Popcorn +STR_2004 :Hot Dog +STR_2005 :Tentacle +STR_2006 :Hat +STR_2007 :Candy Apple +STR_2008 :T-Shirt +STR_2009 :Donut +STR_2010 :Coffee +STR_2011 :Empty Cup +STR_2012 :Fried Chicken +STR_2013 :Lemonade +STR_2014 :Empty Box +STR_2015 :Empty Bottle +STR_2016 :Balloons +STR_2017 :Cuddly Toys +STR_2018 :Park Maps +STR_2019 :On-Ride Photos +STR_2020 :Umbrellas +STR_2021 :Drinks +STR_2022 :Burgers +STR_2023 :Fries +STR_2024 :Ice Creams +STR_2025 :Cotton Candy +STR_2026 :Empty Cans +STR_2027 :Rubbish +STR_2028 :Empty Burger Boxes +STR_2029 :Pizzas +STR_2030 :Vouchers +STR_2031 :Popcorn +STR_2032 :Hot Dogs +STR_2033 :Tentacles +STR_2034 :Hats +STR_2035 :Candy Apples +STR_2036 :T-Shirts +STR_2037 :Donuts +STR_2038 :Coffees +STR_2039 :Empty Cups +STR_2040 :Fried Chicken +STR_2041 :Lemonade +STR_2042 :Empty Boxes +STR_2043 :Empty Bottles +STR_2044 :a Balloon +STR_2045 :a Cuddly Toy +STR_2046 :a Park Map +STR_2047 :an On-Ride Photo +STR_2048 :an Umbrella +STR_2049 :a Drink +STR_2050 :a Burger +STR_2051 :some Fries +STR_2052 :an Ice Cream +STR_2053 :some Cotton Candy +STR_2054 :an Empty Can +STR_2055 :some Rubbish +STR_2056 :an Empty Burger Box +STR_2057 :a Pizza +STR_2058 :a Voucher +STR_2059 :some Popcorn +STR_2060 :a Hot Dog +STR_2061 :a Tentacle +STR_2062 :a Hat +STR_2063 :a Candy Apple +STR_2064 :a T-Shirt +STR_2065 :a Donut +STR_2066 :a Coffee +STR_2067 :an Empty Cup +STR_2068 :some Fried Chicken +STR_2069 :some Lemonade +STR_2070 :an Empty Box +STR_2071 :an Empty Bottle +STR_2072 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Balloon +STR_2073 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Cuddly Toy +STR_2074 :Map of {STRINGID} +STR_2075 :On-Ride Photo of {STRINGID} +STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Umbrella +STR_2077 :Drink +STR_2078 :Burger +STR_2079 :Fries +STR_2080 :Ice Cream +STR_2081 :Cotton Candy +STR_2082 :Empty Can +STR_2083 :Rubbish +STR_2084 :Empty Burger Box +STR_2085 :Pizza +STR_2086 :Voucher for {STRINGID} +STR_2087 :Popcorn +STR_2088 :Hot Dog +STR_2089 :Tentacle +STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hat +STR_2091 :Candy Apple +STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-Shirt +STR_2093 :Donut +STR_2094 :Coffee +STR_2095 :Empty Cup +STR_2096 :Fried Chicken +STR_2097 :Lemonade +STR_2098 :Empty Box +STR_2099 :Empty Bottle +STR_2100 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2101 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2102 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2103 :{WINDOW_COLOUR_2}Pretzel price: +STR_2104 :{WINDOW_COLOUR_2}Hot Chocolate price: +STR_2105 :{WINDOW_COLOUR_2}Iced Tea price: +STR_2106 :{WINDOW_COLOUR_2}Funnel Cake price: +STR_2107 :{WINDOW_COLOUR_2}Sunglasses price: +STR_2108 :{WINDOW_COLOUR_2}Beef Noodles price: +STR_2109 :{WINDOW_COLOUR_2}Fried Rice Noodles price: +STR_2110 :{WINDOW_COLOUR_2}Wonton Soup price: +STR_2111 :{WINDOW_COLOUR_2}Meatball Soup price: +STR_2112 :{WINDOW_COLOUR_2}Fruit Juice price: +STR_2113 :{WINDOW_COLOUR_2}Soybean Milk price: +STR_2114 :{WINDOW_COLOUR_2}Sujongkwa price: +STR_2115 :{WINDOW_COLOUR_2}Sub Sandwich price: +STR_2116 :{WINDOW_COLOUR_2}Cookie price: +STR_2117 :{WINDOW_COLOUR_2} +STR_2118 :{WINDOW_COLOUR_2} +STR_2119 :{WINDOW_COLOUR_2} +STR_2120 :{WINDOW_COLOUR_2}Roast Sausage price: +STR_2121 :{WINDOW_COLOUR_2} +STR_2122 :On-Ride Photo +STR_2123 :On-Ride Photo +STR_2124 :On-Ride Photo +STR_2125 :Pretzel +STR_2126 :Hot Chocolate +STR_2127 :Iced Tea +STR_2128 :Funnel Cake +STR_2129 :Sunglasses +STR_2130 :Beef Noodles +STR_2131 :Fried Rice Noodles +STR_2132 :Wonton Soup +STR_2133 :Meatball Soup +STR_2134 :Fruit Juice +STR_2135 :Soybean Milk +STR_2136 :Sujongkwa +STR_2137 :Sub Sandwich +STR_2138 :Cookie +STR_2139 :Empty Bowl +STR_2140 :Empty Drink Carton +STR_2141 :Empty Juice Cup +STR_2142 :Roast Sausage +STR_2143 :Empty Bowl +STR_2144 :On-Ride Photos +STR_2145 :On-Ride Photos +STR_2146 :On-Ride Photos +STR_2147 :Pretzels +STR_2148 :Hot Chocolates +STR_2149 :Iced Teas +STR_2150 :Funnel Cakes +STR_2151 :Sunglasses +STR_2152 :Beef Noodles +STR_2153 :Fried Rice Noodles +STR_2154 :Wonton Soups +STR_2155 :Meatball Soups +STR_2156 :Fruit Juices +STR_2157 :Soybean Milks +STR_2158 :Sujongkwa +STR_2159 :Sub Sandwiches +STR_2160 :Cookies +STR_2161 :Empty Bowls +STR_2162 :Empty Drink Cartons +STR_2163 :Empty Juice cups +STR_2164 :Roast Sausages +STR_2165 :Empty Bowls +STR_2166 :an On-Ride Photo +STR_2167 :an On-Ride Photo +STR_2168 :an On-Ride Photo +STR_2169 :a Pretzel +STR_2170 :a Hot Chocolate +STR_2171 :an Iced Tea +STR_2172 :a Funnel Cake +STR_2173 :a pair of Sunglasses +STR_2174 :some Beef Noodles +STR_2175 :some Fried Rice Noodles +STR_2176 :some Wonton Soup +STR_2177 :some Meatball Soup +STR_2178 :a Fruit Juice +STR_2179 :some Soybean Milk +STR_2180 :some Sujongkwa +STR_2181 :a Sub Sandwich +STR_2182 :a Cookie +STR_2183 :an Empty Bowl +STR_2184 :an Empty Drink Carton +STR_2185 :an Empty Juice Cup +STR_2186 :a Roast Sausage +STR_2187 :an Empty Bowl +STR_2188 :On-Ride Photo of {STRINGID} +STR_2189 :On-Ride Photo of {STRINGID} +STR_2190 :On-Ride Photo of {STRINGID} +STR_2191 :Pretzel +STR_2192 :Hot Chocolate +STR_2193 :Iced Tea +STR_2194 :Funnel Cake +STR_2195 :Sunglasses +STR_2196 :Beef Noodles +STR_2197 :Fried Rice Noodles +STR_2198 :Wonton Soup +STR_2199 :Meatball Soup +STR_2200 :Fruit Juice +STR_2201 :Soybean Milk +STR_2202 :Sujongkwa +STR_2203 :Sub Sandwich +STR_2204 :Cookie +STR_2205 :Empty Bowl +STR_2206 :Empty Drink Carton +STR_2207 :Empty Juice Cup +STR_2208 :Roast Sausage +STR_2209 :Empty Bowl +STR_2210 :{SMALLFONT}{BLACK}Show list of handymen in park +STR_2211 :{SMALLFONT}{BLACK}Show list of mechanics in park +STR_2212 :{SMALLFONT}{BLACK}Show list of security guards in park +STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park +STR_2214 :Construction not possible while game is paused! +STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) +STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled +STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} +STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} +STR_2221 :{SMALLFONT}{BLACK}Park Rating: {COMMA16} +STR_2222 :{SMALLFONT}{BLACK}{STRINGID} +STR_2223 :{WINDOW_COLOUR_2}Guests in park: {BLACK}{COMMA16} +STR_2224 :{WINDOW_COLOUR_2}Cash: {BLACK}{CURRENCY2DP} +STR_2225 :{WINDOW_COLOUR_2}Cash: {RED}{CURRENCY2DP} +STR_2226 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} +STR_2227 :{WINDOW_COLOUR_2}Company value: {BLACK}{CURRENCY} +STR_2228 :{WINDOW_COLOUR_2}Last month's profit from food/drink and{NEWLINE}merchandise sales: {BLACK}{CURRENCY} +STR_2229 :Slope up to vertical +STR_2230 :Vertical track +STR_2231 :Holding brake for drop +STR_2232 :Cable lift hill +STR_2233 :{SMALLFONT}{BLACK}Park information +STR_2234 :Recent Messages +STR_2235 :{SMALLFONT}{STRINGID} {STRINGID} +STR_2236 :January +STR_2237 :February +STR_2238 :March +STR_2239 :April +STR_2240 :May +STR_2241 :June +STR_2242 :July +STR_2243 :August +STR_2244 :September +STR_2245 :October +STR_2246 :November +STR_2247 :December +STR_2248 :Can't demolish ride/attraction... +STR_2249 :{BABYBLUE}New ride/attraction now available:{NEWLINE}{STRINGID} +STR_2250 :{BABYBLUE}New scenery/themeing now available:{NEWLINE}{STRINGID} +STR_2251 :Can only be built on paths! +STR_2252 :Can only be built across paths! +STR_2253 :Transport Rides +STR_2254 :Gentle Rides +STR_2255 :Roller Coasters +STR_2256 :Thrill Rides +STR_2257 :Water Rides +STR_2258 :Shops & Stalls +STR_2259 :Scenery & Themeing +STR_2260 :No funding +STR_2261 :Minimum funding +STR_2262 :Normal funding +STR_2263 :Maximum funding +STR_2264 :Research funding +STR_2265 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} per month +STR_2266 :Research priorities +STR_2267 :Currently in development +STR_2268 :Last development +STR_2269 :{WINDOW_COLOUR_2}Type: {BLACK}{STRINGID} +STR_2270 :{WINDOW_COLOUR_2}Progress: {BLACK}{STRINGID} +STR_2271 :{WINDOW_COLOUR_2}Expected: {BLACK}{STRINGID} +STR_2272 :{WINDOW_COLOUR_2}Ride/attraction:{NEWLINE}{BLACK}{STRINGID} +STR_2273 :{WINDOW_COLOUR_2}Scenery/themeing:{NEWLINE}{BLACK}{STRINGID} +STR_2274 :{SMALLFONT}{BLACK}Show details of this invention or development +STR_2275 :{SMALLFONT}{BLACK}Show funding and options for research & development +STR_2276 :{SMALLFONT}{BLACK}Show research & development status +STR_2277 :Unknown +STR_2278 :Transport Ride +STR_2279 :Gentle Ride +STR_2280 :Roller Coaster +STR_2281 :Thrill Ride +STR_2282 :Water Ride +STR_2283 :Shop/Stall +STR_2284 :Scenery/Themeing +STR_2285 :Initial research +STR_2286 :Designing +STR_2287 :Completing design +STR_2288 :Unknown +STR_2289 :{STRINGID} {STRINGID} +STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} +STR_2291 :Select scenario for new game +STR_2292 :{WINDOW_COLOUR_2}Rides been on: +STR_2293 :{BLACK} Nothing +STR_2294 :{SMALLFONT}{BLACK}Change base land style +STR_2295 :{SMALLFONT}{BLACK}Change vertical edges of land +STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} paid to enter park +STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} ride +STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} rides +STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} item of food +STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} items of food +STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drink +STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drinks +STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenir +STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenirs +STR_2305 :Track design files +STR_2306 :Save track design +STR_2307 :Select {STRINGID} design +STR_2308 :{STRINGID} Track Designs +STR_2309 :Install New Track Design +STR_2310 :Build custom design +STR_2311 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} (approx.) +STR_2312 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} (approx.) +STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) +STR_2314 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID} +STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} +STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks +STR_2317 :{WINDOW_COLOUR_2}Sound Quality: +STR_2318 :Low +STR_2319 :Medium +STR_2320 :High +STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} +STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} +STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} +STR_2324 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}sq.ft. +STR_2325 :{SMALLFONT}{BLACK}Buy land to extend park +STR_2326 :{SMALLFONT}{BLACK}Buy construction rights to allow construction above or below land outside the park +STR_2327 :Options +STR_2328 :{WINDOW_COLOUR_2}Currency: +STR_2329 :{WINDOW_COLOUR_2}Distance and Speed: +STR_2330 :{WINDOW_COLOUR_2}Temperature: +STR_2331 :{WINDOW_COLOUR_2}Height Labels: +STR_2332 :Units +STR_2333 :Sound +STR_2334 :Pounds ({POUND}) +STR_2335 :Dollars ($) +STR_2336 :Franc (F) +STR_2337 :Deutschmark (DM) +STR_2338 :Yen ({YEN}) +STR_2339 :Peseta (Pts) +STR_2340 :Lira (L) +STR_2341 :Guilders (fl.) +STR_2342 :Krona (kr) +STR_2343 :Euros ({EURO}) +STR_2344 :Imperial +STR_2345 :Metric +STR_2346 :Display +STR_2347 :{RED}{STRINGID} has drowned! +STR_2348 :{SMALLFONT}{BLACK}Show statistics for this staff member +STR_2349 :{WINDOW_COLOUR_2}Wages: {BLACK}{CURRENCY} per month +STR_2350 :{WINDOW_COLOUR_2}Employed: {BLACK}{MONTHYEAR} +STR_2351 :{WINDOW_COLOUR_2}Lawns mown: {BLACK}{COMMA16} +STR_2352 :{WINDOW_COLOUR_2}Gardens watered: {BLACK}{COMMA16} +STR_2353 :{WINDOW_COLOUR_2}Litter swept: {BLACK}{COMMA16} +STR_2354 :{WINDOW_COLOUR_2}Bins emptied: {BLACK}{COMMA16} +STR_2355 :{WINDOW_COLOUR_2}Rides fixed: {BLACK}{COMMA16} +STR_2356 :{WINDOW_COLOUR_2}Rides inspected: {BLACK}{COMMA16} +STR_2357 :House +STR_2358 :Units +STR_2359 :Real Values +STR_2360 :{WINDOW_COLOUR_2}Display Resolution: +STR_2361 :Landscape Smoothing +STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off +STR_2363 :Gridlines on Landscape +STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off +STR_2365 :The bank refuses to increase your loan! +STR_2366 :Celsius ({DEGREE}C) +STR_2367 :Fahrenheit (F) +STR_2368 :None +STR_2369 :Low +STR_2370 :Average +STR_2371 :High +STR_2372 :Low +STR_2373 :Medium +STR_2374 :High +STR_2375 :Very high +STR_2376 :Extreme +STR_2377 :Ultra-Extreme +STR_2378 :{SMALLFONT}{BLACK}Adjust smaller area of land +STR_2379 :{SMALLFONT}{BLACK}Adjust larger area of land +STR_2380 :{SMALLFONT}{BLACK}Adjust smaller area of water +STR_2381 :{SMALLFONT}{BLACK}Adjust larger area of water +STR_2382 :Land +STR_2383 :Water +STR_2384 :{WINDOW_COLOUR_2}Your objective: +STR_2385 :{BLACK}None +STR_2386 :{BLACK}To have at least {COMMA16} guests in your park at the end of {MONTHYEAR}, with a park rating of at least 600 +STR_2387 :{BLACK}To achieve a park value of at least {POP16}{POP16}{CURRENCY} at the end of {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} +STR_2388 :{BLACK}Have Fun! +STR_2389 :{BLACK}Build the best {STRINGID} you can! +STR_2390 :{BLACK}To have 10 different types of roller coasters operating in your park, each with an excitement value of at least 6.00 +STR_2391 :{BLACK}To have at least {COMMA16} guests in your park. You must not let the park rating drop below 700 at any time! +STR_2392 :{BLACK}To achieve a monthly income from ride tickets of at least {POP16}{POP16}{CURRENCY} +STR_2393 :{BLACK}To have 10 different types of roller coasters operating in your park, each with a minimum length of {LENGTH}, and an excitement rating of at least 7.00 +STR_2394 :{BLACK}To finish building all 5 of the partially built roller coasters in this park, designing them to achieve excitement ratings of at least {POP16}{POP16}{COMMA2DP32} each +STR_2395 :{BLACK}To repay your loan and achieve a park value of at least {POP16}{POP16}{CURRENCY} +STR_2396 :{BLACK}To achieve a monthly profit from food, drink and merchandise sales of at least {POP16}{POP16}{CURRENCY} +STR_2397 :None +STR_2398 :Number of guests at a given date +STR_2399 :Park value at a given date +STR_2400 :Have fun +STR_2401 :Build the best ride you can +STR_2402 :Build 10 roller coasters +STR_2403 :Number of guests in park +STR_2404 :Monthly income from ride tickets +STR_2405 :Build 10 roller coasters of a given length +STR_2406 :Finish building 5 roller coasters +STR_2407 :Repay loan and achieve a given park value +STR_2408 :Monthly profit from food/merchandise +STR_2409 :{WINDOW_COLOUR_2}Marketing campaigns in operation +STR_2410 :{BLACK}None +STR_2411 :{WINDOW_COLOUR_2}Marketing campaigns available +STR_2412 :{SMALLFONT}{BLACK}Start this marketing campaign +STR_2413 :{BLACK}({CURRENCY2DP} per week) +STR_2414 :(Not Selected) +STR_2415 :{WINDOW_COLOUR_2}Ride: +STR_2416 :{WINDOW_COLOUR_2}Item: +STR_2417 :{WINDOW_COLOUR_2}Length of time: +STR_2418 :Free entry to {STRINGID} +STR_2419 :Free ride on {STRINGID} +STR_2420 :Half-price entry to {STRINGID} +STR_2421 :Free {STRINGID} +STR_2422 :Advertising campaign for {STRINGID} +STR_2423 :Advertising campaign for {STRINGID} +STR_2424 :{WINDOW_COLOUR_2}Vouchers for free entry to the park +STR_2425 :{WINDOW_COLOUR_2}Vouchers for free rides on a particular ride +STR_2426 :{WINDOW_COLOUR_2}Vouchers for half-price entry to the park +STR_2427 :{WINDOW_COLOUR_2}Vouchers for free food or drink +STR_2428 :{WINDOW_COLOUR_2}Advertising campaign for the park +STR_2429 :{WINDOW_COLOUR_2}Advertising campaign for a particular ride +STR_2430 :{BLACK}Vouchers for free entry to {STRINGID} +STR_2431 :{BLACK}Vouchers for free ride on {STRINGID} +STR_2432 :{BLACK}Vouchers for half-price entry to {STRINGID} +STR_2433 :{BLACK}Vouchers for free {STRINGID} +STR_2434 :{BLACK}Advertising campaign for {STRINGID} +STR_2435 :{BLACK}Advertising campaign for {STRINGID} +STR_2436 :1 week +STR_2437 :2 weeks +STR_2438 :3 weeks +STR_2439 :4 weeks +STR_2440 :5 weeks +STR_2441 :6 weeks +STR_2442 :{BLACK}({STRINGID} remaining) +STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} +STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} +STR_2445 :Start this marketing campaign +STR_2446 :{YELLOW}Your marketing campaign for free entry to the park has finished +STR_2447 :{YELLOW}Your marketing campaign for free rides on {STRINGID} has finished +STR_2448 :{YELLOW}Your marketing campaign for half-price entry to the park has finished +STR_2449 :{YELLOW}Your marketing campaign for free {STRINGID} has finished +STR_2450 :{YELLOW}Your advertising campaign for the park has finished +STR_2451 :{YELLOW}Your advertising campaign for {STRINGID} has finished +STR_2452 :{WINDOW_COLOUR_2}Cash (less loan): {BLACK}{CURRENCY2DP} +STR_2453 :{WINDOW_COLOUR_2}Cash (less loan): {RED}{CURRENCY2DP} +STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} - +STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} - +STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} - +STR_2457 :{SMALLFONT}{BLACK}Show financial accounts +STR_2458 :{SMALLFONT}{BLACK}Show graph of cash (less loan) over time +STR_2459 :{SMALLFONT}{BLACK}Show graph of park value over time +STR_2460 :{SMALLFONT}{BLACK}Show graph of weekly profit +STR_2461 :{SMALLFONT}{BLACK}Show marketing campaigns +STR_2462 :{SMALLFONT}{BLACK}Show view of park entrance +STR_2463 :{SMALLFONT}{BLACK}Show graph of park ratings over time +STR_2464 :{SMALLFONT}{BLACK}Show graph of guest numbers over time +STR_2465 :{SMALLFONT}{BLACK}Show park entrance price and information +STR_2466 :{SMALLFONT}{BLACK}Show park statistics +STR_2467 :{SMALLFONT}{BLACK}Show objectives for this game +STR_2468 :{SMALLFONT}{BLACK}Show recent awards this park has received +STR_2469 :{SMALLFONT}{BLACK}Select level of research & development +STR_2470 :{SMALLFONT}{BLACK}Research new transport rides +STR_2471 :{SMALLFONT}{BLACK}Research new gentle rides +STR_2472 :{SMALLFONT}{BLACK}Research new roller coasters +STR_2473 :{SMALLFONT}{BLACK}Research new thrill rides +STR_2474 :{SMALLFONT}{BLACK}Research new water rides +STR_2475 :{SMALLFONT}{BLACK}Research new shops and stalls +STR_2476 :{SMALLFONT}{BLACK}Research new scenery and themeing +STR_2477 :{SMALLFONT}{BLACK}Select operating mode for this ride/attraction +STR_2478 :{SMALLFONT}{BLACK}Show graph of velocity against time +STR_2479 :{SMALLFONT}{BLACK}Show graph of altitude against time +STR_2480 :{SMALLFONT}{BLACK}Show graph of vertical acceleration against time +STR_2481 :{SMALLFONT}{BLACK}Show graph of lateral acceleration against time +STR_2482 :{SMALLFONT}{BLACK}Profit: {CURRENCY} per week, Park Value: {CURRENCY} +STR_2483 :{WINDOW_COLOUR_2}Weekly profit: {BLACK}+{CURRENCY2DP} +STR_2484 :{WINDOW_COLOUR_2}Weekly profit: {RED}{CURRENCY2DP} +STR_2485 :Controls +STR_2486 :General +STR_2487 :Show 'real' names of guests +STR_2488 :{SMALLFONT}{BLACK}Toggle between showing 'real' names of guests and guest numbers +STR_2489 :Shortcut keys... +STR_2490 :Keyboard shortcuts +STR_2491 :Reset keys +STR_2492 :{SMALLFONT}{BLACK}Set all keyboard shortcuts back to default settings +STR_2493 :Close top-most window +STR_2494 :Close all floating windows +STR_2495 :Cancel construction mode +STR_2496 :Pause game +STR_2497 :Zoom view out +STR_2498 :Zoom view in +STR_2499 :Rotate view +STR_2500 :Rotate construction object +STR_2501 :Underground view toggle +STR_2502 :Remove base land toggle +STR_2503 :Remove vertical land toggle +STR_2504 :See-through rides toggle +STR_2505 :See-through scenery toggle +STR_2506 :Invisible supports toggle +STR_2507 :Invisible people toggle +STR_2508 :Height marks on land toggle +STR_2509 :Height marks on ride tracks toggle +STR_2510 :Height marks on paths toggle +STR_2511 :Adjust land +STR_2512 :Adjust water +STR_2513 :Build scenery +STR_2514 :Build paths +STR_2515 :Build new ride +STR_2516 :Show financial information +STR_2517 :Show research information +STR_2518 :Show rides list +STR_2519 :Show park information +STR_2520 :Show guest list +STR_2521 :Show staff list +STR_2522 :Show recent messages +STR_2523 :Show map +STR_2524 :Screenshot + +STR_2525 :??? +STR_2526 :??? +STR_2527 :??? +STR_2528 :??? +STR_2529 :??? +STR_2530 :??? +STR_2531 :??? +STR_2532 :??? +STR_2533 :Backspace +STR_2534 :Tab +STR_2535 :??? +STR_2536 :??? +STR_2537 :Clear +STR_2538 :Return +STR_2539 :??? +STR_2540 :??? +STR_2541 :??? +STR_2542 :??? +STR_2543 :Alt/Menu +STR_2544 :Pause +STR_2545 :Caps +STR_2546 :??? +STR_2547 :??? +STR_2548 :??? +STR_2549 :??? +STR_2550 :??? +STR_2551 :??? +STR_2552 :Escape +STR_2553 :??? +STR_2554 :??? +STR_2555 :??? +STR_2556 :??? +STR_2557 :Spacebar +STR_2558 :PgUp +STR_2559 :PgDn +STR_2560 :End +STR_2561 :Home +STR_2562 :Left +STR_2563 :Up +STR_2564 :Right +STR_2565 :Down +STR_2566 :Select +STR_2567 :Print +STR_2568 :Execute +STR_2569 :Snapshot +STR_2570 :Insert +STR_2571 :Delete +STR_2572 :Help +STR_2573 :0 +STR_2574 :1 +STR_2575 :2 +STR_2576 :3 +STR_2577 :4 +STR_2578 :5 +STR_2579 :6 +STR_2580 :7 +STR_2581 :8 +STR_2582 :9 +STR_2583 :??? +STR_2584 :??? +STR_2585 :??? +STR_2586 :??? +STR_2587 :??? +STR_2588 :??? +STR_2589 :??? +STR_2590 :A +STR_2591 :B +STR_2592 :C +STR_2593 :D +STR_2594 :E +STR_2595 :F +STR_2596 :G +STR_2597 :H +STR_2598 :I +STR_2599 :J +STR_2600 :K +STR_2601 :L +STR_2602 :M +STR_2603 :N +STR_2604 :O +STR_2605 :P +STR_2606 :Q +STR_2607 :R +STR_2608 :S +STR_2609 :T +STR_2610 :U +STR_2611 :V +STR_2612 :W +STR_2613 :X +STR_2614 :Y +STR_2615 :Z +STR_2616 :??? +STR_2617 :??? +STR_2618 :Menu +STR_2619 :??? +STR_2620 :??? +STR_2621 :NumPad 0 +STR_2622 :NumPad 1 +STR_2623 :NumPad 2 +STR_2624 :NumPad 3 +STR_2625 :NumPad 4 +STR_2626 :NumPad 5 +STR_2627 :NumPad 6 +STR_2628 :NumPad 7 +STR_2629 :NumPad 8 +STR_2630 :NumPad 9 +STR_2631 :NumPad * +STR_2632 :NumPad + +STR_2633 :??? +STR_2634 :NumPad - +STR_2635 :NumPad . +STR_2636 :NumPad / +STR_2637 :F1 +STR_2638 :F2 +STR_2639 :F3 +STR_2640 :F4 +STR_2641 :F5 +STR_2642 :F6 +STR_2643 :F7 +STR_2644 :F8 +STR_2645 :F9 +STR_2646 :F10 +STR_2647 :F11 +STR_2648 :F12 +STR_2649 :F13 +STR_2650 :F14 +STR_2651 :F15 +STR_2652 :F16 +STR_2653 :F17 +STR_2654 :F18 +STR_2655 :F19 +STR_2656 :F20 +STR_2657 :F21 +STR_2658 :F22 +STR_2659 :F23 +STR_2660 :F24 +STR_2661 :??? +STR_2662 :??? +STR_2663 :??? +STR_2664 :??? +STR_2665 :??? +STR_2666 :??? +STR_2667 :??? +STR_2668 :??? +STR_2669 :NumLock +STR_2670 :Scroll +STR_2671 :??? +STR_2672 :??? +STR_2673 :??? +STR_2674 :??? +STR_2675 :??? +STR_2676 :??? +STR_2677 :??? +STR_2678 :??? +STR_2679 :??? +STR_2680 :All research complete +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2682 : +STR_2683 : +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive +STR_2685 :Simplex Noise Parameters +STR_2686 :{WINDOW_COLOUR_2}Low: +STR_2687 :{WINDOW_COLOUR_2}High: +STR_2688 :{WINDOW_COLOUR_2}Base Frequency: +STR_2689 :{WINDOW_COLOUR_2}Octaves: +STR_2690 :Map Generation +STR_2691 :{WINDOW_COLOUR_2}Base height: +STR_2692 :{WINDOW_COLOUR_2}Water level: +STR_2693 :{WINDOW_COLOUR_2}Terrain: +STR_2694 :Generate +STR_2695 :Random terrain +STR_2696 :Place trees +STR_2697 :??? +STR_2698 :??? +STR_2699 :??? +STR_2700 :Autosave frequency: +STR_2701 :Every week +STR_2702 :Every 2 weeks +STR_2703 :Every month +STR_2704 :Every 4 months +STR_2705 :Every year +STR_2706 :Never +STR_2707 :Open new window +STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? +STR_2709 :Overwrite +STR_2710 :Type the name of the file. +STR_2711 :; +STR_2712 := +STR_2713 :, +STR_2714 :- +STR_2715 :. +STR_2716 :/ +STR_2717 :' +STR_2718 :(up) +STR_2719 :(new file) +STR_2720 :{UINT16}sec +STR_2721 :{UINT16}secs +STR_2722 :{UINT16}min:{UINT16}sec +STR_2723 :{UINT16}min:{UINT16}secs +STR_2724 :{UINT16}mins:{UINT16}sec +STR_2725 :{UINT16}mins:{UINT16}secs +STR_2726 :{UINT16}min +STR_2727 :{UINT16}mins +STR_2728 :{UINT16}hour:{UINT16}min +STR_2729 :{UINT16}hour:{UINT16}mins +STR_2730 :{UINT16}hours:{UINT16}min +STR_2731 :{UINT16}hours:{UINT16}mins +STR_2732 :{COMMA16}ft +STR_2733 :{COMMA16}m +STR_2734 :{COMMA16}mph +STR_2735 :{COMMA16}km/h +STR_2736 :{MONTH}, Year {COMMA16} +STR_2737 :{STRINGID} {MONTH}, Year {COMMA16} +STR_2738 :Title screen music: +STR_2739 :None +STR_2740 :RollerCoaster Tycoon 1 +STR_2741 :RollerCoaster Tycoon 2 +STR_2742 :css50.dat not found +STR_2743 :Copy data\css17.dat from your RCT1 installation to data\css50.dat in your RCT2 installation. +STR_2744 :[ +STR_2745 :\ +STR_2746 :] +STR_2747 :{ENDQUOTES} +STR_2748 :Bar +STR_2749 :My new scenario + +# New strings used in the cheats window previously these were ??? +STR_2750 :Move all items to top +STR_2751 :Move all items to bottom +STR_2752 :Clear grass +STR_2753 :Mowed grass +STR_2754 :Water plants +STR_2755 :Fix vandalism +STR_2756 :Remove litter +STR_2757 :Force Sun +STR_2758 :Force Thunder +STR_2759 :Zero Clearance +STR_2760 :+{CURRENCY} +STR_2761 : +STR_2762 : +STR_2763 :??? +STR_2764 : +STR_2765 :Large Tram +STR_2766 :Win scenario +STR_2767 :Freeze Climate +STR_2768 :Unfreeze Climate +STR_2769 :Open Park +STR_2770 :Close Park +STR_2771 :Slower Gamespeed +STR_2772 :Faster Gamespeed +STR_2773 :Windowed +STR_2774 :Fullscreen +STR_2775 :Fullscreen (desktop) +STR_2776 :Language: +STR_2777 :{MOVE_X}{SMALLFONT}{STRING} +STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} +STR_2779 :Viewport #{COMMA16} +STR_2780 :Extra viewport +# End of new strings + + +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2782 :SHIFT + +STR_2783 :CTRL + +STR_2784 :Change keyboard shortcut +STR_2785 :{WINDOW_COLOUR_2}Press new shortcut key for:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} +STR_2786 :{SMALLFONT}{BLACK}Click on shortcut description to select new key +STR_2787 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} +STR_2788 :{WINDOW_COLOUR_2}Congratulations !{NEWLINE}{BLACK}You achieved your objective with a company value of {CURRENCY} ! +STR_2789 :{WINDOW_COLOUR_2}You have failed your objective ! +STR_2790 :Enter name into scenario chart +STR_2791 :Enter name +STR_2792 :Please enter your name for the scenario chart: +STR_2793 :{SMALLFONT}(Completed by {STRINGID}) +STR_2794 :{WINDOW_COLOUR_2}Completed by: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} with a company value of: {BLACK}{CURRENCY} +STR_2795 :Sort +STR_2796 :{SMALLFONT}{BLACK}Sort the ride list into order using the information type displayed +STR_2797 :Scroll view when pointer at screen edge +STR_2798 :{SMALLFONT}{BLACK}Select whether to scroll the view when the mouse pointer is at the screen edge +STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments +STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32} +STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP} +STR_2802 :Map +STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map +STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map +STR_2805 :{SMALLFONT}{BLACK}Show map of park +STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organizing them better +STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organizing them better +STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better +STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food +STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks +STR_2811 :{RED}Guests are complaining because they can't find the restrooms in your park +STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around +STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests +STR_2814 :{WINDOW_COLOUR_2}Most untidy park award +STR_2815 :{WINDOW_COLOUR_2}Tidiest park award +STR_2816 :{WINDOW_COLOUR_2}Award for the park with the best roller coasters +STR_2817 :{WINDOW_COLOUR_2}Best value park award +STR_2818 :{WINDOW_COLOUR_2}Most beautiful park award +STR_2819 :{WINDOW_COLOUR_2}Worst value park award +STR_2820 :{WINDOW_COLOUR_2}Safest park award +STR_2821 :{WINDOW_COLOUR_2}Best staff award +STR_2822 :{WINDOW_COLOUR_2}Best park food award +STR_2823 :{WINDOW_COLOUR_2}Worst park food award +STR_2824 :{WINDOW_COLOUR_2}Best park restrooms award +STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award +STR_2826 :{WINDOW_COLOUR_2}Best water rides award +STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award +STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride color schemes award +STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award +STR_2830 :{WINDOW_COLOUR_2}Best gentle ride award +STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'! +STR_2832 :{TOPAZ}Your park has received an award for being 'The tidiest park in the country'! +STR_2833 :{TOPAZ}Your park has received an award for being 'The park with the best roller coasters'! +STR_2834 :{TOPAZ}Your park has received an award for being 'The best value park in the country'! +STR_2835 :{TOPAZ}Your park has received an award for being 'The most beautiful park in the country'! +STR_2836 :{TOPAZ}Your park has received an award for being 'The worst value park in the country'! +STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park in the country'! +STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! +STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! +STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! +STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best restroom facilities in the country'! +STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! +STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water rides in the country'! +STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed rides'! +STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of color schemes'! +STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! +STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle rides'! +STR_2848 :{WINDOW_COLOUR_2}No recent awards +STR_2849 :New scenario installed successfully +STR_2850 :New track design installed successfully +STR_2851 :Scenario already installed +STR_2852 :Track design already installed +STR_2853 :Forbidden by the local authority! +STR_2854 :{RED}Guests can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance +STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the ride exit +STR_2856 :{WINDOW_COLOUR_2}Tutorial +STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) +STR_2858 :Can't start marketing campaign... +STR_2859 :Another instance of OpenRCT2 is already running +STR_2860 :Infogrames Interactive credits... +STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. +STR_2862 :Music acknowledgements... +STR_2863 :Music acknowledgements +STR_2864 :{WINDOW_COLOUR_2}March - Children of the Regiment: (Fucik) non copyright +STR_2865 :{WINDOW_COLOUR_2}Heyken's Serenade: (J.Heyken) British Standard Music Coy; GEMA, BRITICO +STR_2866 :{WINDOW_COLOUR_2}In Continental Mood: (Composer unknown) Copyright Control +STR_2867 :{WINDOW_COLOUR_2}Wedding Journey: (Traditional) +STR_2868 :{WINDOW_COLOUR_2}Tales from the Vienna Woods: (Johann Strauss) non copyright +STR_2869 :{WINDOW_COLOUR_2}Slavonic Dance: (Traditional) +STR_2870 :{WINDOW_COLOUR_2}Das Alpenhorn: (Traditional) +STR_2871 :{WINDOW_COLOUR_2}The Blond Sailor: (Traditional) +STR_2872 :{WINDOW_COLOUR_2}Overture - Poet and Peasant: (Suppe) non copyright +STR_2873 :{WINDOW_COLOUR_2}Waltz Medley: (Johann Strauss) non copyright +STR_2874 :{WINDOW_COLOUR_2}Bella Bella Bimba: (Traditional) +STR_2875 :{WINDOW_COLOUR_2}Original recordings (P) 1976 C.J.Mears Organization, used with consent +STR_2876 :{WINDOW_COLOUR_2}RollerCoaster Tycoon 2 Title Music: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2877 :{WINDOW_COLOUR_2}Dodgems Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2878 :{WINDOW_COLOUR_2}Mid Summer's Heat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2879 :{WINDOW_COLOUR_2}Pharaoh's Tomb: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2880 :{WINDOW_COLOUR_2}Caesar's March: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2881 :{WINDOW_COLOUR_2}Drifting To Heaven: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2882 :{WINDOW_COLOUR_2}Invaders: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2883 :{WINDOW_COLOUR_2}Eternal Toybox: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2884 :{WINDOW_COLOUR_2}Jungle Juice: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2885 :{WINDOW_COLOUR_2}Ninja's Noodles: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2886 :{WINDOW_COLOUR_2}Voyage to Andromeda: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2887 :{WINDOW_COLOUR_2}Brimble's Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2888 :{WINDOW_COLOUR_2}Atlantis: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2889 :{WINDOW_COLOUR_2}Wild West Kid: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2890 :{WINDOW_COLOUR_2}Vampire's Lair: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2891 :{WINDOW_COLOUR_2}Blockbuster: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2892 :{WINDOW_COLOUR_2}Airtime Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2893 :{WINDOW_COLOUR_2}Searchlight Rag: (Scott Joplin/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2894 :{WINDOW_COLOUR_2}Flight of Fantasy: (Steve Blenkinsopp) copyright {COPYRIGHT} Chris Sawyer +STR_2895 :{WINDOW_COLOUR_2}Big Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2896 :{WINDOW_COLOUR_2}Hypothermia: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2897 :{WINDOW_COLOUR_2}Last Sleigh Ride: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2898 :{WINDOW_COLOUR_2}Pipes of Glencairn: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2899 :{WINDOW_COLOUR_2}Traffic Jam: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2900 :{WINDOW_COLOUR_2} +STR_2901 :{WINDOW_COLOUR_2}(Samples courtesy of Spectrasonics {ENDQUOTES}Liquid Grooves{ENDQUOTES}) +STR_2902 :{WINDOW_COLOUR_2}Toccata: (C.M.Widor, played by Peter James Adcock) recording {COPYRIGHT} Chris Sawyer +STR_2903 :{WINDOW_COLOUR_2}Space Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2904 :{WINDOW_COLOUR_2}Manic Mechanic: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2905 :{WINDOW_COLOUR_2}Techno Torture: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2906 :{WINDOW_COLOUR_2}Sweat Dreams: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2907 :{WINDOW_COLOUR_2}What shall we do with the Drunken Sailor: (Anon/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2908 :{WINDOW_COLOUR_2}Infogrames Interactive +STR_2909 :{WINDOW_COLOUR_2}Senior Producer: Thomas J. Zahorik +STR_2910 :{WINDOW_COLOUR_2}Executive Producer: Bill Levay +STR_2911 :{WINDOW_COLOUR_2}Senior Marketing Product Manager: Scott Triola +STR_2912 :{WINDOW_COLOUR_2}V.P. of Product Development: Scott Walker +STR_2913 :{WINDOW_COLOUR_2}General Manager: John Hurlbut +STR_2914 :{WINDOW_COLOUR_2}Director of Quality Assurance: Michael Craighead +STR_2915 :{WINDOW_COLOUR_2}Q.A. Certification Manager: Kurt Boutin +STR_2916 :{WINDOW_COLOUR_2}Q.A. Certification Lead: Mark Huggins +STR_2917 :{WINDOW_COLOUR_2}Testers: Dena Irene Fitzgerald, Scott Rollins, Christopher McPhail +STR_2918 :{WINDOW_COLOUR_2}Clif McClure, Erik Maramaldi, Erik Jeffery +STR_2919 :{WINDOW_COLOUR_2}Director of Marketing: Ann Marie Bland +STR_2920 :{WINDOW_COLOUR_2}Manager of Creative Services: Steve Martin +STR_2921 :{WINDOW_COLOUR_2}Manager of Editorial & Documentation Services: Elizabeth Mackney +STR_2922 :{WINDOW_COLOUR_2}Graphic Designer: Paul Anselmi +STR_2923 :{WINDOW_COLOUR_2}Copywriter: Kurt Carlson +STR_2924 :{WINDOW_COLOUR_2}Special Thanks to: Peter Matiss +STR_2925 :{WINDOW_COLOUR_2}Engineering Specialist: Ken Edwards +STR_2926 :{WINDOW_COLOUR_2}Engineering Services Manager: Luis Rivas +STR_2927 :{WINDOW_COLOUR_2}Lead Compatibility Analyst: Geoffrey Smith +STR_2928 :{WINDOW_COLOUR_2}Compatibility Analysts: Jason Cordero, Burke McQuinn, Kim Jardin +STR_2929 :{WINDOW_COLOUR_2}Lead Tester: Daniel Frisoli +STR_2930 :{WINDOW_COLOUR_2}Senior Tester: Matt Pantaleoni +STR_2931 :{WINDOW_COLOUR_2} +STR_2932 :{WINDOW_COLOUR_2} +STR_2933 :{WINDOW_COLOUR_2} +STR_2934 :{WINDOW_COLOUR_2} +STR_2935 :{WINDOW_COLOUR_2} +STR_2936 :{WINDOW_COLOUR_2} +STR_2937 :{WINDOW_COLOUR_2} +STR_2938 :{WINDOW_COLOUR_2} +STR_2939 :{WINDOW_COLOUR_2} +STR_2940 :{WINDOW_COLOUR_2} +STR_2941 :{WINDOW_COLOUR_2} +STR_2942 :{WINDOW_COLOUR_2} +STR_2943 :{WINDOW_COLOUR_2} +STR_2944 :{WINDOW_COLOUR_2} +STR_2945 :{WINDOW_COLOUR_2} +STR_2946 :{WINDOW_COLOUR_2} +STR_2947 :{WINDOW_COLOUR_2} +STR_2948 :{WINDOW_COLOUR_2} +STR_2949 :{WINDOW_COLOUR_2} +STR_2950 :{WINDOW_COLOUR_2} +STR_2951 :{WINDOW_COLOUR_2} +STR_2952 :{WINDOW_COLOUR_2} +STR_2953 :{WINDOW_COLOUR_2} +STR_2954 :{WINDOW_COLOUR_2} +STR_2955 :{WINDOW_COLOUR_2} +STR_2956 :{WINDOW_COLOUR_2} +STR_2957 :{WINDOW_COLOUR_2} +STR_2958 :{WINDOW_COLOUR_2} +STR_2959 :{WINDOW_COLOUR_2} +STR_2960 :{WINDOW_COLOUR_2} +STR_2961 :{WINDOW_COLOUR_2} +STR_2962 :{WINDOW_COLOUR_2} +STR_2963 :{WINDOW_COLOUR_2} +STR_2964 :{WINDOW_COLOUR_2} +STR_2965 :{WINDOW_COLOUR_2} +STR_2966 : +STR_2967 : +STR_2968 : +STR_2969 :Use of this product is subject to the terms of a license agreement +STR_2970 :found in the product's {OPENQUOTES}ReadMe{ENDQUOTES} file and in the manual +STR_2971 :Main color scheme +STR_2972 :Alternative color scheme 1 +STR_2973 :Alternative color scheme 2 +STR_2974 :Alternative color scheme 3 +STR_2975 :{SMALLFONT}{BLACK}Select which color scheme to change, or paint ride with +STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected color scheme +STR_2977 :Staff member name +STR_2978 :Enter new name for this member of staff: +STR_2979 :Can't name staff member... +STR_2980 :Too many banners in game +STR_2981 :{RED}No entry - - +STR_2982 :Banner text +STR_2983 :Enter new text for this banner: +STR_2984 :Can't set new text for banner... +STR_2985 :Banner +STR_2986 :{SMALLFONT}{BLACK}Change text on banner +STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for guests +STR_2988 :{SMALLFONT}{BLACK}Demolish this banner +STR_2989 :{SMALLFONT}{BLACK}Select main color +STR_2990 :{SMALLFONT}{BLACK}Select text color +STR_2991 :Sign +STR_2992 :Sign text +STR_2993 :Enter new text for this sign: +STR_2994 :{SMALLFONT}{BLACK}Change text on sign +STR_2995 :{SMALLFONT}{BLACK}Demolish this sign +STR_2996 :{BLACK}ABC +STR_2997 :{GREY}ABC +STR_2998 :{WHITE}ABC +STR_2999 :{RED}ABC +STR_3000 :{GREEN}ABC +STR_3001 :{YELLOW}ABC +STR_3002 :{TOPAZ}ABC +STR_3003 :{CELADON}ABC +STR_3004 :{BABYBLUE}ABC +STR_3005 :{PALELAVENDER}ABC +STR_3006 :{PALEGOLD}ABC +STR_3007 :{LIGHTPINK}ABC +STR_3008 :{PEARLAQUA}ABC +STR_3009 :{PALESILVER}ABC +STR_3010 :Unable to load file... +STR_3011 :File contains invalid data +STR_3012 :Dodgems beat style +STR_3013 :Fairground organ style +STR_3014 :Roman fanfare style +STR_3015 :Oriental style +STR_3016 :Martian style +STR_3017 :Jungle drums style +STR_3018 :Egyptian style +STR_3019 :Toyland style +STR_3020 : +STR_3021 :Space style +STR_3022 :Horror style +STR_3023 :Techno style +STR_3024 :Gentle style +STR_3025 :Summer style +STR_3026 :Water style +STR_3027 :Wild west style +STR_3028 :Jurassic style +STR_3029 :Rock style +STR_3030 :Ragtime style +STR_3031 :Fantasy style +STR_3032 :Rock style 2 +STR_3033 :Ice style +STR_3034 :Snow style +STR_3035 :Custom music 1 +STR_3036 :Custom music 2 +STR_3037 :Medieval style +STR_3038 :Urban style +STR_3039 :Organ style +STR_3040 :Mechanical style +STR_3041 :Modern style +STR_3042 :Pirates style +STR_3043 :Rock style 3 +STR_3044 :Candy style +STR_3045 :{SMALLFONT}{BLACK}Select style of music to play +STR_3046 :This ride cannot be modified +STR_3047 :Local authority forbids demolition or modifications to this ride +STR_3048 :Marketing campaigns forbidden by local authority +STR_3049 :Golf hole A +STR_3050 :Golf hole B +STR_3051 :Golf hole C +STR_3052 :Golf hole D +STR_3053 :Golf hole E +STR_3054 :Loading... +STR_3055 :White +STR_3056 :Translucent +STR_3057 :{WINDOW_COLOUR_2}Construction Marker: +STR_3058 :Brick walls +STR_3059 :Hedges +STR_3060 :Ice blocks +STR_3061 :Wooden fences +STR_3062 :{SMALLFONT}{BLACK}Standard roller coaster track +STR_3063 :{SMALLFONT}{BLACK}Water channel (track submerged) +STR_3064 :Beginner Parks +STR_3065 :Challenging Parks +STR_3066 :Expert Parks +STR_3067 :{OPENQUOTES}Real{ENDQUOTES} Parks +STR_3068 :Other Parks +STR_3069 :Top Section +STR_3070 :Slope to Level +STR_3071 :{WINDOW_COLOUR_2}Same price throughout park +STR_3072 :{SMALLFONT}{BLACK}Select whether this price is used throughout the entire park +STR_3073 :{RED}WARNING: Your park rating has dropped below 700 !{NEWLINE}If you haven't raised the park rating in 4 weeks, your park will be closed down +STR_3074 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have 3 weeks to raise the park rating +STR_3075 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have only 2 weeks to raise the park rating, or your park will be closed down +STR_3076 :{RED}FINAL WARNING: Your park rating is still below 700 !{NEWLINE}In just 7 days your park will be closed down unless you can raise the rating +STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! +STR_3078 :Plain entrance +STR_3079 :Wooden entrance +STR_3080 :Canvas tent entrance +STR_3081 :Castle entrance (gray) +STR_3082 :Castle entrance (brown) +STR_3083 :Jungle entrance +STR_3084 :Log cabin entrance +STR_3085 :Classical/Roman entrance +STR_3086 :Abstract entrance +STR_3087 :Snow/Ice entrance +STR_3088 :Pagoda entrance +STR_3089 :Space entrance +STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station +STR_3091 :You are not allowed to remove this section! +STR_3092 :You are not allowed to move or modify the station for this ride! +STR_3093 :{WINDOW_COLOUR_2}Favorite: {BLACK}{STRINGID} +STR_3094 :N/A +STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: +STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed +STR_3098 :Can't change lift hill speed... +STR_3099 :{SMALLFONT}{BLACK}Select color +STR_3100 :{SMALLFONT}{BLACK}Select second color +STR_3101 :{SMALLFONT}{BLACK}Select third color +STR_3102 :{SMALLFONT}{BLACK}Re-paint colored scenery on landscape +STR_3103 :Can't re-paint this... +STR_3104 :{SMALLFONT}{BLACK}List rides +STR_3105 :{SMALLFONT}{BLACK}List shops and stalls +STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other guest facilities +STR_3107 :Close +STR_3108 :Test +STR_3109 :Open +STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16} +STR_3111 :{SMALLFONT}{BLACK}Click on design to build it +STR_3112 :{SMALLFONT}{BLACK}Click on design to rename or delete it +STR_3113 :Select a different design +STR_3114 :{SMALLFONT}{BLACK}Go back to design selection window +STR_3115 :{SMALLFONT}{BLACK}Save track design +STR_3116 :{SMALLFONT}{BLACK}Save track design (Not possible until ride has been tested and statistics have been generated) +STR_3117 :{BLACK}Calling mechanic... +STR_3118 :{BLACK}{STRINGID} is heading for the ride +STR_3119 :{BLACK}{STRINGID} is fixing the ride +STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride +STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy +STR_3122 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guest +STR_3123 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guests +STR_3124 :Broken {STRINGID} +STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% +STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% +STR_3127 :{WINDOW_COLOUR_2}Nausea Factor: {BLACK}+{COMMA16}% +STR_3128 :Save Track Design +STR_3129 :Save Track Design with Scenery +STR_3130 :Save +STR_3131 :Cancel +STR_3132 :{BLACK}Click items of scenery to select them to be saved with track design... +STR_3133 :Unable to build this on a slope +STR_3134 :{RED}(Design includes scenery which is unavailable) +STR_3135 :{RED}(Vehicle design unavailable - Ride performance may be affected) +STR_3136 :Warning: This design will be built with an alternative vehicle type and may not perform as expected +STR_3137 :Select Nearby Scenery +STR_3138 :Reset Selection +STR_3139 :Cable lift unable to work in this operating mode +STR_3140 :Cable lift hill must start immediately after station +STR_3141 :Multi-circuit per ride not possible with cable lift hill +STR_3142 :{WINDOW_COLOUR_2}Capacity: {BLACK}{STRINGID} +STR_3143 :{SMALLFONT}{BLACK}Show people on map +STR_3144 :{SMALLFONT}{BLACK}Show rides and stalls on map +STR_3145 :{SMALLFONT}{BLACK}Scroll {STRINGID} left +STR_3146 :{SMALLFONT}{BLACK}Scroll {STRINGID} right +STR_3147 :{SMALLFONT}{BLACK}Scroll {STRINGID} left fast +STR_3148 :{SMALLFONT}{BLACK}Scroll {STRINGID} right fast +STR_3149 :{SMALLFONT}{BLACK}Scroll {STRINGID} left/right +STR_3150 :{SMALLFONT}{BLACK}Scroll {STRINGID} up +STR_3151 :{SMALLFONT}{BLACK}Scroll {STRINGID} down +STR_3152 :{SMALLFONT}{BLACK}Scroll {STRINGID} up fast +STR_3153 :{SMALLFONT}{BLACK}Scroll {STRINGID} down fast +STR_3154 :{SMALLFONT}{BLACK}Scroll {STRINGID} up/down +STR_3155 : +STR_3156 : +STR_3157 :map +STR_3158 :graph +STR_3159 :list +STR_3160 : +STR_3161 : +STR_3162 :Unable to allocate enough memory +STR_3163 :Installing new data: +STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) +STR_3165 : +STR_3166 :{BLACK}(ID: +STR_3167 :{WINDOW_COLOUR_2}Includes: {BLACK}{COMMA16} objects +STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} +STR_3169 :Data for the following object not found: +STR_3170 :Not enough space for graphics +STR_3171 :Too many objects of this type selected +STR_3172 :The following object must be selected first: {STRING} +STR_3173 :This object is currently in use +STR_3174 :This object is required by another object +STR_3175 :This object is always required +STR_3176 :Unable to select this object +STR_3177 :Unable to de-select this object +STR_3178 :At least one path object must be selected +STR_3179 :At least one ride vehicle/attraction object must be selected +STR_3180 :Invalid selection of objects +STR_3181 :Object Selection - {STRINGID} +STR_3182 :Park entrance type must be selected +STR_3183 :Water type must be selected +STR_3184 :Ride Vehicles/Attractions +STR_3185 :Small Scenery +STR_3186 :Large Scenery +STR_3187 :Walls/Fences +STR_3188 :Path Signs +STR_3189 :Footpaths +STR_3190 :Path Extras +STR_3191 :Scenery Groups +STR_3192 :Park Entrance +STR_3193 :Water +STR_3194 :Scenario Description +STR_3195 :Invention List +STR_3196 :{WINDOW_COLOUR_2}Research Group: {BLACK}{STRINGID} +STR_3197 :{WINDOW_COLOUR_2}Items pre-invented at start of game: +STR_3198 :{WINDOW_COLOUR_2}Items to invent during game: +STR_3199 :Random Shuffle +STR_3200 :{SMALLFONT}{BLACK}Randomly shuffle the list of items to invent during the game +STR_3201 :Object Selection +STR_3202 :Landscape Editor +STR_3203 :Invention List Set Up +STR_3204 :Options Selection +STR_3205 :Objective Selection +STR_3206 :Save Scenario +STR_3207 :Roller Coaster Designer +STR_3208 :Track Designs Manager +STR_3209 :Back to Previous Step: +STR_3210 :Forward to Next Step: +STR_3211 :{WINDOW_COLOUR_2}Map size: +STR_3212 :{POP16}{COMMA16} x {PUSH16}{COMMA16} +STR_3213 :Can't decrease map size any further +STR_3214 :Can't increase map size any further +STR_3215 :Too close to edge of map +STR_3216 :{SMALLFONT}{BLACK}Select park-owned land etc. +STR_3217 :Land Owned +STR_3218 :Construction Rights Owned +STR_3219 :Land For Sale +STR_3220 :Construction Rights For Sale +STR_3221 :{SMALLFONT}{BLACK}Set land to be owned by the park +STR_3222 :{SMALLFONT}{BLACK}Set construction rights only to be owned by the park +STR_3223 :{SMALLFONT}{BLACK}Set land to be available to purchase by the park +STR_3224 :{SMALLFONT}{BLACK}Set construction rights to be available to purchase by the park +STR_3225 :{SMALLFONT}{BLACK}Toggle on/off building a random cluster of objects around the selected position +STR_3226 :{SMALLFONT}{BLACK}Build park entrance +STR_3227 :Too many park entrances! +STR_3228 :{SMALLFONT}{BLACK}Set starting positions for people +STR_3229 :Block Brakes cannot be used directly after station +STR_3230 :Block Brakes cannot be used directly after each other +STR_3231 :Block Brakes cannot be used directly after the top of this lift hill +STR_3232 :Options - Financial +STR_3233 :Options - Guests +STR_3234 :Options - Park +STR_3235 :{SMALLFONT}{BLACK}Show financial options +STR_3236 :{SMALLFONT}{BLACK}Show guest options +STR_3237 :{SMALLFONT}{BLACK}Show park options +STR_3238 :No Money +STR_3239 :{SMALLFONT}{BLACK}Make this park a 'no money' park with no financial restrictions +STR_3240 :{WINDOW_COLOUR_2}Initial cash: +STR_3241 :{WINDOW_COLOUR_2}Initial loan: +STR_3242 :{WINDOW_COLOUR_2}Maximum loan size: +STR_3243 :{WINDOW_COLOUR_2}Annual interest rate: +STR_3244 :Forbid marketing campaigns +STR_3245 :{SMALLFONT}{BLACK}Forbid advertising, promotional schemes, and other marketing campaigns +STR_3246 :{WINDOW_COLOUR_2}{CURRENCY} +STR_3247 :{WINDOW_COLOUR_2}{COMMA16}% +STR_3248 :Can't increase initial cash any further! +STR_3249 :Can't reduce initial cash any further! +STR_3250 :Can't increase initial loan any further! +STR_3251 :Can't reduce initial loan any further! +STR_3252 :Can't increase maximum loan size any further! +STR_3253 :Can't reduce maximum loan size any further! +STR_3254 :Can't increase interest rate any further! +STR_3255 :Can't reduce interest rate any further! +STR_3256 :Guests prefer less intense rides +STR_3257 :{SMALLFONT}{BLACK}Select whether guests should generally prefer less intense rides only +STR_3258 :Guests prefer more intense rides +STR_3259 :{SMALLFONT}{BLACK}Select whether guests should generally prefer more intense rides only +STR_3260 :{WINDOW_COLOUR_2}Cash per guest (average): +STR_3261 :{WINDOW_COLOUR_2}Guests initial happiness: +STR_3262 :{WINDOW_COLOUR_2}Guests initial hunger: +STR_3263 :{WINDOW_COLOUR_2}Guests initial thirst: +STR_3264 :Can't increase this any further! +STR_3265 :Can't reduce this any further! +STR_3266 :{SMALLFONT}{BLACK}Select how this park charges for entrance and rides +STR_3267 :Forbid tree removal +STR_3268 :{SMALLFONT}{BLACK}Forbid tall trees being removed +STR_3269 :Forbid landscape changes +STR_3270 :{SMALLFONT}{BLACK}Forbid any changes to the landscape +STR_3271 :Forbid high construction +STR_3272 :{SMALLFONT}{BLACK}Forbid any tall construction +STR_3273 :Park rating higher difficult level +STR_3274 :{SMALLFONT}{BLACK}Make the park rating value more challenging +STR_3275 :Guest generation higher difficult level +STR_3276 :{SMALLFONT}{BLACK}Make it more difficult to attract guests to the park +STR_3277 :{WINDOW_COLOUR_2}Cost to buy land: +STR_3278 :{WINDOW_COLOUR_2}Cost to buy construction rights: +STR_3279 :Free park entry / Pay per ride +STR_3280 :Pay to enter park / Free rides +STR_3281 :{WINDOW_COLOUR_2}Entry price: +STR_3282 :{SMALLFONT}{BLACK}Select objective and park name +STR_3283 :{SMALLFONT}{BLACK}Select rides to be preserved +STR_3284 :Objective Selection +STR_3285 :Preserved Rides +STR_3286 :{SMALLFONT}{BLACK}Select objective for this scenario +STR_3287 :{WINDOW_COLOUR_2}Objective: +STR_3288 :{SMALLFONT}{BLACK}Select climate +STR_3289 :{WINDOW_COLOUR_2}Climate: +STR_3290 :Cool and wet +STR_3291 :Warm +STR_3292 :Hot and dry +STR_3293 :Cold +STR_3294 :Change... +STR_3295 :{SMALLFONT}{BLACK}Change name of park +STR_3296 :{SMALLFONT}{BLACK}Change name of scenario +STR_3297 :{SMALLFONT}{BLACK}Change detail notes about park / scenario +STR_3298 :{WINDOW_COLOUR_2}Park Name: {BLACK}{STRINGID} +STR_3299 :{WINDOW_COLOUR_2}Park/Scenario Details: +STR_3300 :{WINDOW_COLOUR_2}Scenario Name: {BLACK}{STRINGID} +STR_3301 :{WINDOW_COLOUR_2}Objective Date: +STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR} +STR_3303 :{WINDOW_COLOUR_2}Number of guests: +STR_3304 :{WINDOW_COLOUR_2}Park value: +STR_3305 :{WINDOW_COLOUR_2}Monthly income: +STR_3306 :{WINDOW_COLOUR_2}Monthly profit: +STR_3307 :{WINDOW_COLOUR_2}Minimum length: +STR_3308 :{WINDOW_COLOUR_2}Excitement rating: +STR_3309 :{WINDOW_COLOUR_2}{COMMA16} +STR_3310 :{WINDOW_COLOUR_2}{LENGTH} +STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32} +STR_3312 :{WINDOW_COLOUR_2}Rides/attractions under a preservation order: +STR_3313 :Scenario Name +STR_3314 :Enter name for scenario: +STR_3315 :Park/Scenario Details +STR_3316 :Enter description of this scenario: +STR_3317 :No details yet +STR_3318 :{SMALLFONT}{BLACK}Select which group this scenario appears in +STR_3319 :{WINDOW_COLOUR_2}Scenario Group: +STR_3320 :Unable to save scenario file... +STR_3321 :New objects installed successfully +STR_3322 :{WINDOW_COLOUR_2}Objective: {BLACK}{STRINGID} +STR_3323 :Missing object data, ID: +STR_3324 :Requires Add-On Pack: +STR_3325 :Requires an Add-On Pack +STR_3326 :{WINDOW_COLOUR_2}(no image) +STR_3327 :Starting positions for people not set +STR_3328 :Can't advance to next editor stage... +STR_3329 :Park entrance not yet built +STR_3330 :Park must own some land +STR_3331 :Path from park entrance to map edge either not complete or too complex - Path must be single-width with as few junctions and corners as possible +STR_3332 :Park entrance is the wrong way round or has no path leading to the map edge +STR_3333 :Export plug-in objects with saved games +STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data +STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles +STR_3336 :Track Designs Manager - Select Ride Type +STR_3337 :Six Flags Park +STR_3338 :{BLACK}Custom-designed layout +STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout +STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout +STR_3341 :{SMALLFONT}{BLACK}Game tools +STR_3342 :Scenario Editor +STR_3343 :Convert Saved Game to Scenario +STR_3344 :Roller Coaster Designer +STR_3345 :Track Designs Manager +STR_3346 :Can't save track design... +STR_3347 :Ride is too large, contains too many elements, or scenery is too spread out +STR_3348 :Rename +STR_3349 :Delete +STR_3350 :Track design name +STR_3351 :Enter new name for this track design: +STR_3352 :Can't rename track design... +STR_3353 :New name contains invalid characters +STR_3354 :Another file exists with this name, or file is write-protected +STR_3355 :File is write-protected or locked +STR_3356 :Delete File +STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ? +STR_3358 :Can't delete track design... +STR_3359 :{BLACK}No track designs of this type +STR_3360 :Warning! +STR_3361 :Too many track designs of this type - Some will not be listed. +STR_3362 :Forced Software Buffer Mixing +STR_3363 :{SMALLFONT}{BLACK}Select this option to improve performance if the game pauses slightly when sounds start or interference is heard +STR_3364 :Advanced +STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups +STR_3366 :{BLACK}= Ride +STR_3367 :{BLACK}= Food Stall +STR_3368 :{BLACK}= Drink Stall +STR_3369 :{BLACK}= Souvenir Stall +STR_3370 :{BLACK}= Info. Kiosk +STR_3371 :{BLACK}= First Aid +STR_3372 :{BLACK}= A.T.M. +STR_3373 :{BLACK}= Restroom +STR_3374 :Warning: Too many objects selected! +STR_3375 :Not all objects in this scenery group could be selected +STR_3376 :Install new track design... +STR_3377 :{SMALLFONT}{BLACK}Install a new track design file +STR_3378 :Install +STR_3379 :Cancel +STR_3380 :Unable to install this track design... +STR_3381 :File is not compatible or contains invalid data +STR_3382 :File copy failed +STR_3383 :Select new name for track design +STR_3384 :An existing track design already has this name - Please select a new name for this design: +STR_3385 :Beginners Tutorial +STR_3386 :Custom Rides Tutorial +STR_3387 :Roller Coaster Building Tutorial +STR_3388 :Unable to switch to selected mode +STR_3389 :Unable to select additional item of scenery... +STR_3390 :Too many items selected +STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... +STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... +STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... +STR_3394 :{SMALLFONT}{BLACK}You can also rotate the view in 90 degree steps... +STR_3395 :{SMALLFONT}{BLACK}Building anything at this scale is a bit difficult, so let's zoom the view back in again... +STR_3396 :{SMALLFONT}{BLACK}Let's build a simple ride to get the park started... +STR_3397 :{SMALLFONT}{BLACK}The white 'ghost' image shows where the ride will be built. We'll move the pointer to select the position then click to build it... +STR_3398 :{SMALLFONT}{BLACK}Rides need an entrance and an exit. We'll move the pointer to a square on the edge of the ride and then click to build first the entrance and then the exit... +STR_3399 :{SMALLFONT}{BLACK}We need to build footpaths to allow guests to reach our new ride... +STR_3400 :{SMALLFONT}{BLACK}For the path to the ride entrance we'll use a special 'queue line' path... +STR_3401 :{SMALLFONT}{BLACK}For the exit path, just an 'ordinary' path will do... +STR_3402 :{SMALLFONT}{BLACK}Right, lets open the ride! To open the ride we click the flag icon on the ride window and select 'open'... +STR_3403 :{SMALLFONT}{BLACK}But where are the guests? +STR_3404 :{SMALLFONT}{BLACK}Oh - The park is still closed! Right - Let's open it... +STR_3405 :{SMALLFONT}{BLACK}While we're waiting for our first guests, let's build some scenery... +STR_3406 :{SMALLFONT}{BLACK}Here's our empty park. We're going to build a simple custom-designed ride... +STR_3407 :{SMALLFONT}{BLACK}First we need to choose a starting position... +STR_3408 :{SMALLFONT}{BLACK}The section of track we've just built is a 'station platform', to allow guests to get on and off the ride... +STR_3409 :{SMALLFONT}{BLACK}We'll extend the platform a bit by adding a couple more station platform sections... +STR_3410 :{SMALLFONT}{BLACK}The icons at the top of the construction window let you choose different track pieces to add... +STR_3411 :{SMALLFONT}{BLACK}We'll select a left-hand curve... +STR_3412 :{SMALLFONT}{BLACK}The curve hasn't been built yet, but the white ghost image shows where it will be built. Clicking the large 'build this' icon actually builds the track... +STR_3413 :{SMALLFONT}{BLACK}Now we want to build straight track, so we click the straight track icon... +STR_3414 :{SMALLFONT}{BLACK}Now that the circuit is complete, we need to build the ride entrance and exit... +STR_3415 :{SMALLFONT}{BLACK}Let's test our ride to check it works... +STR_3416 :{SMALLFONT}{BLACK}White it's being tested, we'll build the queue line and exit path... +STR_3417 :{SMALLFONT}{BLACK}OK - Let's open the park and the ride... +STR_3418 :{SMALLFONT}{BLACK}Our new ride isn't very exciting - Perhaps we should add some scenery? +STR_3419 :{SMALLFONT}{BLACK}To build scenery above other scenery or in mid-air, hold down the SHIFT key and move the mouse to select the height... +STR_3420 :{SMALLFONT}{BLACK}Some types of scenery can be re-painted after it's built... +STR_3421 :{SMALLFONT}{BLACK}Let's add some music to the ride... +STR_3422 :{SMALLFONT}{BLACK}Let's build a roller coaster ! +STR_3423 :{SMALLFONT}{BLACK}There are loads of pre-designed coasters, but we're going to build our own custom design... +STR_3424 :{SMALLFONT}{BLACK}That's the station platform built. Now we need a lift hill... +STR_3425 :{SMALLFONT}{BLACK}Roller coaster trains aren't powered, so a 'chain lift' is needed to pull the train up the first hill... +STR_3426 :{SMALLFONT}{BLACK}That's the lift hill complete - Now for the first drop... +STR_3427 :{SMALLFONT}{BLACK}Those curves are a bad idea - The riders will be flung to the sides by the lateral G forces as the train hurtles around... +STR_3428 :{SMALLFONT}{BLACK}Banking the curves will improve the ride - Riders will be pushed down into their seats instead of flung to the sides... +STR_3429 :{SMALLFONT}{BLACK}No - That won't work! Look at the height marks - The second hill is taller than the lift hill... +STR_3430 :{SMALLFONT}{BLACK}To ensure the train makes it around, each hill should be slightly smaller than the previous one... +STR_3431 :{SMALLFONT}{BLACK}That's better - Our train should make it up that hill now! Let's try some more twisted track... +STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve and station, so let's add some brakes... +STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow two trains to operate more safely on the circuit... +STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! +STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... +STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customize the ride a bit... +STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape +STR_3438 :Unable to remove all scenery from here... +STR_3439 :Clear Scenery +STR_3440 :Page 1 +STR_3441 :Page 2 +STR_3442 :Page 3 +STR_3443 :Page 4 +STR_3444 :Page 5 +STR_3445 :Set Patrol Area +STR_3446 :Cancel Patrol Area + +# New strings, cleaner +STR_5120 :Finances +STR_5121 :Research +STR_5122 :Select rides by track type (like in RCT1) +STR_5123 :Renew rides +STR_5124 :No Six Flags +STR_5125 :All destructable +STR_5126 :Random title music +STR_5127 :{SMALLFONT}{BLACK}Disable land elevation +STR_5128 :Selection size +STR_5129 :Enter selection size between {COMMA16} and {COMMA16} +STR_5130 :Map size +STR_5131 :Enter map size between {COMMA16} and {COMMA16} +STR_5132 :Fix all rides +STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights +STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights +STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights +STR_5136 :Land rights +STR_5137 :Allow lift hill and launch speeds{NEWLINE}up to {VELOCITY} +STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} +STR_5139 :{WHITE}{STRINGID} +STR_5140 :Disable brakes failure +STR_5141 :Disable all breakdowns +STR_5142 :Normal Speed +STR_5143 :Quick Speed +STR_5144 :Fast Speed +STR_5145 :Turbo Speed +STR_5146 :Hyper Speed +STR_5147 :Cheats +STR_5148 :{SMALLFONT}{BLACK}Change the game speed +STR_5149 :{SMALLFONT}{BLACK}Open the cheats window +STR_5150 :Enable debugging tools +#Thousands separator +STR_5151 :, +#Decimals separator +STR_5152 :. +STR_5153 :Edit Themes... +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 +STR_5157 :Unlock all prices +STR_5158 :Quit to menu +STR_5159 :Exit OpenRCT2 +STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} +STR_5161 :Date Format: +STR_5162 :Day/Month/Year +STR_5163 :Month/Day/Year +STR_5164 :Twitch Channel name +STR_5165 :Name peeps after followers +STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers +STR_5167 :Track follower peeps +STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after channel's Twitch followers +STR_5169 :Name peeps after people in Twitch chat +STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat +STR_5171 :Track chat peeps +STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after Twitch chat participants +STR_5173 :Pull Twitch chat as news +STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications +STR_5175 :Input the name of your Twitch channel +STR_5176 :Enable Twitch integration +STR_5177 :Fullscreen mode: +STR_5178 :{SMALLFONT}{BLACK}Show financial cheats +STR_5179 :{SMALLFONT}{BLACK}Show guest cheats +STR_5180 :{SMALLFONT}{BLACK}Show park cheats +STR_5181 :{SMALLFONT}{BLACK}Show ride cheats +STR_5182 :{INT32} +STR_5183 :Base height +STR_5184 :Enter base height between {COMMA16} and {COMMA16} +STR_5185 :Water level +STR_5186 :Enter water level between {COMMA16} and {COMMA16} +STR_5187 :Finances +STR_5188 :New Campaign +STR_5189 :Research +STR_5190 :Map +STR_5191 :Viewport +STR_5192 :Recent News +STR_5193 :Land +STR_5194 :Water +STR_5195 :Clear Scenery +STR_5196 :Land Rights +STR_5197 :Scenery +STR_5198 :Footpath +STR_5199 :Ride Construction +STR_5200 :Track Design Place +STR_5201 :New Ride +STR_5202 :Track Design Selection +STR_5203 :Ride +STR_5204 :Ride List +STR_5205 :Guest +STR_5206 :Guest List +STR_5207 :Staff +STR_5208 :Staff List +STR_5209 :Banner +STR_5210 :Object Selection +STR_5211 :Invention List +STR_5212 :Scenario Options +STR_5213 :Objective Options +STR_5214 :Map Generation +STR_5215 :Track Design Manager +STR_5216 :Track Design Manager List +STR_5217 :Cheats +STR_5218 :Themes +STR_5219 :Options +STR_5220 :Keyboard Shortcuts +STR_5221 :Change Keyboard Shortcut +STR_5222 :Load/Save +STR_5223 :Save Prompt +STR_5224 :Demolish Ride Prompt +STR_5225 :Fire Staff Prompt +STR_5226 :Track Delete Prompt +STR_5227 :Save Overwrite Prompt +STR_5228 :{SMALLFONT}{BLACK}Main UI +STR_5229 :{SMALLFONT}{BLACK}Park +STR_5230 :{SMALLFONT}{BLACK}Tools +STR_5231 :{SMALLFONT}{BLACK}Rides and Peeps +STR_5232 :{SMALLFONT}{BLACK}Editors +STR_5233 :{SMALLFONT}{BLACK}Miscellaneous +STR_5234 :{SMALLFONT}{BLACK}Prompts +STR_5235 :{SMALLFONT}{BLACK}Settings +STR_5236 :Window: +STR_5237 :Palette: +STR_5238 :Current Theme: +STR_5239 :Duplicate +STR_5240 :Enter a name for the theme +STR_5241 :Can't change this theme +STR_5242 :Theme name already exists +STR_5243 :Invalid characters used +STR_5244 :Themes +STR_5245 :Top Toolbar +STR_5246 :Bottom Toolbar +STR_5247 :Track Editor Bottom Toolbar +STR_5248 :Scenario Editor Bottom Toolbar +STR_5249 :Title Menu Buttons +STR_5250 :Title Exit Button +STR_5251 :Title Options Button +STR_5252 :Title Scenario Selection +STR_5253 :Park Information +STR_5254 :Create +STR_5255 :{SMALLFONT}{BLACK}Create a new title sequence from scratch +STR_5256 :Create a new theme to make changes to +STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one +STR_5258 :{SMALLFONT}{BLACK}Delete the current theme +STR_5259 :{SMALLFONT}{BLACK}Rename the current theme +STR_5260 :Giant Screenshot +STR_5261 :Filter +STR_5262 :Wacky Worlds +STR_5263 :Time Twister +STR_5264 :Custom +STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible +STR_5266 :{SMALLFONT}{BLACK}Display +STR_5267 :{SMALLFONT}{BLACK}Culture and Units +STR_5268 :{SMALLFONT}{BLACK}Audio +STR_5269 :{SMALLFONT}{BLACK}Controls and interface +STR_5270 :{SMALLFONT}{BLACK}Miscellaneous +STR_5271 :{SMALLFONT}{BLACK}Twitch +STR_5272 :{SMALLFONT}{BLACK}Small Scenery +STR_5273 :{SMALLFONT}{BLACK}Large Scenery +STR_5274 :{SMALLFONT}{BLACK}Footpaths +STR_5275 :Search for Objects +STR_5276 :Enter the name of an object to search for +STR_5277 :Clear +STR_5278 :Sandbox mode +STR_5279 :Sandbox mode off +STR_5280 :{SMALLFONT}{BLACK}Allow editing land ownership settings through the Map window and other options that are normally restricted to the Scenario Editor +STR_5281 :{SMALLFONT}{BLACK}Features +STR_5282 :RCT1 Ride Open/Close Lights +STR_5283 :RCT1 Park Open/Close Lights +STR_5284 :RCT1 Scenario Selection Font +STR_5285 :EXPLODE!!! +STR_5286 :{SMALLFONT}{BLACK}Makes some guests explode +STR_5287 :Ride is already broken down +STR_5288 :Ride is closed +STR_5289 :No breakdowns available for this ride +STR_5290 :Fix ride +STR_5291 :Can't force breakdown +STR_5292 :{SMALLFONT}{BLACK}Force a breakdown +STR_5293 :{SMALLFONT}{BLACK}Close ride/attraction +STR_5294 :{SMALLFONT}{BLACK}Test ride/attraction +STR_5295 :{SMALLFONT}{BLACK}Open ride/attraction +STR_5296 :{SMALLFONT}{BLACK}Close park +STR_5297 :{SMALLFONT}{BLACK}Open park +STR_5298 :{RED}{STRINGID} +STR_5299 :{LIGHTPINK}{STRINGID} +STR_5300 :{SMALLFONT}{BLACK}Quick fire staff +STR_5301 :{MEDIUMFONT}{BLACK}Clear your loan +STR_5302 :Clear loan +STR_5303 :Allow building in pause mode +STR_5304 :Title Sequence: +STR_5305 :RollerCoaster Tycoon 1 +STR_5306 :RollerCoaster Tycoon 1 (AA) +STR_5307 :RollerCoaster Tycoon 1 (AA + LL) +STR_5308 :RollerCoaster Tycoon 2 +STR_5309 :OpenRCT2 +STR_5310 :Random +STR_5311 :{SMALLFONT}{BLACK}Debug tools +STR_5312 :Show console +STR_5313 :Show tile inspector +STR_5314 :Tile inspector +STR_5315 :Grass +STR_5316 :Sand +STR_5317 :Dirt +STR_5318 :Rock +STR_5319 :Martian +STR_5320 :Checkerboard +STR_5321 :Grass clumps +STR_5322 :Ice +STR_5323 :Grid (red) +STR_5324 :Grid (yellow) +STR_5325 :Grid (blue) +STR_5326 :Grid (green) +STR_5327 :Sand (dark) +STR_5328 :Sand (light) +STR_5329 :Checkerboard (inverted) +STR_5330 :Underground view +STR_5331 :Rock +STR_5332 :Wood (red) +STR_5333 :Wood (black) +STR_5334 :Ice +STR_5335 :Ride entrance +STR_5336 :Ride exit +STR_5337 :Park entrance +STR_5338 :Element type +STR_5339 :Base height +STR_5340 :Clearance height +STR_5341 :Flags +STR_5342 :Choose a map tile +STR_5343 :Automatically place staff +STR_5344 :Changelog +STR_5345 :Financial cheats +STR_5346 :Guest cheats +STR_5347 :Park cheats +STR_5348 :Ride cheats +STR_5349 :{SMALLFONT}{BLACK}All Rides +STR_5350 :Max +STR_5351 :Min +STR_5352 :{BLACK}Happiness: +STR_5353 :{BLACK}Energy: +STR_5354 :{BLACK}Hunger: +STR_5355 :{BLACK}Thirst: +STR_5356 :{BLACK}Nausea: +STR_5357 :{BLACK}Nausea tolerance: +STR_5358 :{BLACK}Bathroom: +STR_5359 :Remove guests +STR_5360 :{SMALLFONT}{BLACK}Removes all guests from the map +STR_5361 :Give all guests: +STR_5362 :{BLACK}Set all guests' preferred ride intensity to: +STR_5363 :More than 1 +STR_5364 :Less than 15 +STR_5365 :{BLACK}Staff speed: +STR_5366 :Normal +STR_5367 :Fast +STR_5368 :Reset crash status +STR_5369 :Park parameters... +STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. +STR_5371 :Object Selection +STR_5372 :Invert right mouse dragging +STR_5373 :Name {STRINGID} +STR_5374 :Date {STRINGID} +STR_5375 :{UP} +STR_5376 :{DOWN} +STR_5377 :{SMALLFONT}{BLACK}Saves +STR_5378 :{SMALLFONT}{BLACK}Script +STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command +STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence +STR_5381 :{SMALLFONT}{BLACK}Stop playing title sequence +STR_5382 :{SMALLFONT}{BLACK}Restart title sequence +STR_5383 :{SMALLFONT}{BLACK}Create a new title sequence based on the current one +STR_5384 :{SMALLFONT}{BLACK}Delete the current title sequence +STR_5385 :{SMALLFONT}{BLACK}Rename the current title sequence +STR_5386 :{SMALLFONT}{BLACK}Insert a new command +STR_5387 :{SMALLFONT}{BLACK}Edit the selected command +STR_5388 :{SMALLFONT}{BLACK}Delete the selected command +STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence +STR_5390 :{SMALLFONT}{BLACK}Move the selected command down +STR_5391 :{SMALLFONT}{BLACK}Move the selected command up +STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence +STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence +STR_5394 :{SMALLFONT}{BLACK}Rename the selected save +STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game +STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game +STR_5397 :Can only be used on the title screen +STR_5398 :Cannot edit title sequence while it's playing +STR_5399 :Press the stop button to continue editing +STR_5400 :Can't change this title sequence +STR_5401 :Create a new title sequence to make changes to +STR_5402 :Failed to load title sequence +STR_5403 :There may be no Load or Wait command or a save may be invalid +STR_5404 :Name already exists +STR_5405 :Enter a name for the save +STR_5406 :Enter a name for the title sequence +STR_5407 :Add +STR_5408 :Remove +STR_5409 :Insert +STR_5410 :Edit +STR_5411 :Reload +STR_5412 :Skip to +STR_5413 :Load +STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :Load{MOVE_X}{87}{STRING} +STR_5416 :Load{MOVE_X}{87}No save selected +STR_5417 :Location +STR_5418 :Location{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :Rotate +STR_5420 :Rotate{MOVE_X}{87}{COMMA16} +STR_5421 :Zoom +STR_5422 :Zoom{MOVE_X}{87}{COMMA16} +STR_5423 :Wait +STR_5424 :Wait{MOVE_X}{87}{COMMA16} +STR_5425 :Restart +STR_5426 :End +STR_5427 :Coordinates: +STR_5428 :Counter-clockwise rotations: +STR_5429 :Zoom level: +STR_5430 :Seconds to wait: +STR_5431 :Save to load: +STR_5432 :Command: +STR_5433 :Title Sequences +STR_5434 :Command Editor +STR_5435 :Rename save +STR_5436 :Edit Title Sequences... +STR_5437 :No save selected +STR_5438 :Can't make changes while command editor is open +STR_5439 :A wait command with at least 4 seconds is required with a restart command +STR_5440 :Minimize fullscreen on focus loss +STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. +STR_5442 :Force park rating: +STR_5443 :Speed{MOVE_X}{87}{STRINGID} +STR_5444 :Speed: +STR_5445 :Speed +STR_5446 :Get +STR_5447 :Type {STRINGID} +STR_5448 :Ride / Vehicle {STRINGID} +STR_5449 :Reduce game speed +STR_5450 :Increase game speed +STR_5451 :Open cheats window +STR_5452 :Toggle visibility of toolbars +STR_5453 :Select another ride +STR_5454 :Uncap FPS +STR_5455 :Enable sandbox mode +STR_5456 :Disable clearance checks +STR_5457 :Disable support limits +STR_5458 :Rotate clockwise +STR_5459 :Rotate counterclockwise +STR_5460 :Rotate view counterclockwise +STR_5461 :Set guests' parameters +STR_5462 :{CURRENCY} +STR_5463 :Goal: Have fun! +STR_5464 :General +STR_5465 :Climate +STR_5466 :Staff +STR_5467 :ALT + +STR_5468 :Recent messages +STR_5469 :Scroll map up +STR_5470 :Scroll map left +STR_5471 :Scroll map down +STR_5472 :Scroll map right +STR_5473 :Cycle day / night +STR_5474 :Display text on banners in upper case +STR_5476 :Hardware +STR_5477 :Map rendering +STR_5478 :Controls +STR_5479 :Toolbar +STR_5480 :Show toolbar buttons for: +STR_5481 :Themes diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index da721516dd..bf5ea3eabc 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3,18 +3,18 @@ # Use # at the beginning of a line to leave a comment. STR_0000 : STR_0001 :{STRINGID} {COMMA16} -STR_0002 :Spiral Roller Coaster +STR_0002 :螺旋式雲霄飛車 STR_0003 :站立式雲霄飛車 STR_0004 :懸吊式雲霄飛車 -STR_0005 :Inverted Roller Coaster +STR_0005 :反轉式雲霄飛車 STR_0006 :兒童雲霄飛車 STR_0007 :小火車 STR_0008 :單軌電車 STR_0009 :迷你懸吊式雲霄飛車 STR_0010 :小船出租 -STR_0011 :Wooden Wild Mouse +STR_0011 :木製野鼠式雲霄飛車 STR_0012 :越野賽馬式雲霄飛車 -STR_0013 :Car Ride +STR_0013 :自駕軌道車輛 STR_0014 :自由落體 STR_0015 :Bobsleigh Coaster STR_0016 :觀景塔 @@ -22,7 +22,7 @@ STR_0017 :Looping Roller Coaster STR_0018 :滑水道 STR_0019 :採礦列車雲霄飛車 STR_0020 :纜車 -STR_0021 :Corkscrew Roller Coaster +STR_0021 :瓶塞鑽式雲霄飛車 STR_0022 :迷宮 STR_0023 :螺旋滑道 STR_0024 :小型賽車 @@ -30,10 +30,10 @@ STR_0025 :運木水道 STR_0026 :激流船 STR_0027 :碰碰車 STR_0028 :海盜船 -STR_0029 :Swinging Inverter Ship -STR_0030 :食物店 +STR_0029 :迴旋海盜船 +STR_0030 :食物店鋪 STR_0031 :Unknown Stall (1D) -STR_0032 :飲料店 +STR_0032 :飲料店鋪 STR_0033 :Unknown Stall (1F) STR_0034 :商店 STR_0035 :旋轉木馬 @@ -843,13 +843,13 @@ STR_0838 :CD key code {INT32} is not valid for your RollerCoaster Tycoon 2 CD STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} # The follwing six strings were used for display resolutions, but have been replaced. -STR_0841 :Desktop window -STR_0842 :640x480 全螢幕 -STR_0843 :800x600 全螢幕 -STR_0844 :1024x768 全螢幕 -STR_0845 :1152x864 全螢幕 -STR_0846 :1280x1024 全螢幕 -STR_0847 :有關'RollerCoaster Tycoon 2' +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :有關'OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}版本 2.01.028 STR_0850 :{WINDOW_COLOUR_2}版權商標 {COPYRIGHT} 2002 Chris Sawyer, 版權所有 @@ -1019,13 +1019,13 @@ STR_1013 :關閉樂園 STR_1014 :開放樂園 STR_1015 :Unable to operate with more than one station platform in this mode STR_1016 :Unable to operate with less than two stations in this mode -STR_1017 :Can't change operating mode... -STR_1018 :Can't make changes... -STR_1019 :Can't make changes... -STR_1020 :Can't make changes... +STR_1017 :不能改變運行模式... +STR_1018 :不能作出更變... +STR_1019 :不能作出更變... +STR_1020 :不能作出更變... STR_1021 :{POP16}{POP16}{POP16}{POP16}{STRINGID} -STR_1022 :{POP16}{POP16}{POP16}{COMMA16} car per train -STR_1023 :{POP16}{POP16}{POP16}{COMMA16} cars per train +STR_1022 :每列車{POP16}{POP16}{POP16}{COMMA16}車卡 +STR_1023 :每列車{POP16}{POP16}{POP16}{COMMA16}車卡 STR_1024 :每列車{COMMA16}車卡 STR_1025 :每列車{COMMA16}車卡 STR_1026 :車站月台太長! @@ -1037,7 +1037,7 @@ STR_1031 :Can't build this underwater! STR_1032 :Can only build this on water! STR_1033 :Can only build this above ground! STR_1034 :Can only build this on land! -STR_1035 :Local authority won't allow construction above tree-height! +STR_1035 :當地政府不允許建造高於樹木的物件! STR_1036 :載入遊戲 STR_1037 :載入地型 STR_1038 :將存檔轉換成劇情 @@ -1055,7 +1055,7 @@ STR_1049 :儲存地型失敗! STR_1050 :載入失敗...{NEWLINE}檔案中含有非法資料! STR_1051 :透明化支撐 STR_1052 :透明化遊客 -STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park +STR_1053 :{SMALLFONT}{BLACK}樂園內的遊樂設施/店鋪 STR_1054 :{SMALLFONT}{BLACK}命名遊樂設施/店鋪 STR_1055 :{SMALLFONT}{BLACK}命名遊客 STR_1056 :{SMALLFONT}{BLACK}命名員工 @@ -1064,8 +1064,8 @@ STR_1058 :請輸入這個遊樂設施/店鋪的新名稱: STR_1059 :不能重命名遊樂設施/店鋪... STR_1060 :不適合的遊樂設施/店鋪名稱 STR_1061 :正常模式 -STR_1062 :連續巡迴模式 -STR_1063 :反向發車巡迴模式 +STR_1062 :連續循環模式 +STR_1063 :反向發車循環模式 STR_1064 :動力發車 (穿過車站) STR_1065 :穿梭模式 STR_1066 :出租小船模式 @@ -1097,7 +1097,7 @@ STR_1091 :馬戲團表演模式 STR_1092 :Downward launch STR_1093 :Crooked house 模式 STR_1094 :Freefall drop 模式 -STR_1095 :Continuous circuit block sectioned mode +STR_1095 :有區域煞車的連續循環模式 STR_1096 :動力發車 (不穿過車站) STR_1097 :Powered launch block sectioned mode STR_1098 :移動到{POP16}{STRINGID}的最尾中 @@ -1130,20 +1130,20 @@ STR_1124 :開始中 STR_1125 :運作中 STR_1126 :停止中 STR_1127 :卸客中 -STR_1128 :Stopped by block brakes -STR_1129 :All vehicles in same colours -STR_1130 :Different colours per {STRINGID} -STR_1131 :Different colours per vehicle -STR_1132 :Vehicle {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} -STR_1133 :Vehicle {POP16}{COMMA16} +STR_1128 :被區域煞車裝置煞停了 +STR_1129 :全部車卡使用相同顏色 +STR_1130 :不同{STRINGID}使用不同顏色 +STR_1131 :不同車卡使用不同顏色 +STR_1132 :車卡{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1133 :車卡{POP16}{COMMA16} STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} STR_1135 :{STRINGID} {COMMA16} -STR_1136 :{SMALLFONT}{BLACK}Select main colour -STR_1137 :{SMALLFONT}{BLACK}Select additional colour 1 -STR_1138 :{SMALLFONT}{BLACK}Select additional colour 2 -STR_1139 :{SMALLFONT}{BLACK}Select support structure colour -STR_1140 :{SMALLFONT}{BLACK}Select vehicle colour scheme option -STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify +STR_1136 :{SMALLFONT}{BLACK}選擇主要顏色調配 +STR_1137 :{SMALLFONT}{BLACK}選擇額外顏色調配1 +STR_1138 :{SMALLFONT}{BLACK}選擇額外顏色調配2 +STR_1139 :{SMALLFONT}{BLACK}選擇支撐顏色 +STR_1140 :{SMALLFONT}{BLACK}選擇有關車卡顏色調配的選項 +STR_1141 :{SMALLFONT}{BLACK}選擇要修改的車卡/列車 STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} STR_1144 :不能建造/移動這個遊樂設施的入口... @@ -1161,8 +1161,8 @@ STR_1155 :在道路上標記高度 STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} STR_1158 :不能移除... -STR_1159 :{SMALLFONT}{BLACK}Place scenery, gardens, and other accessories -STR_1160 :{SMALLFONT}{BLACK}Create/adjust lakes & water +STR_1159 :{SMALLFONT}{BLACK}放置景物, 花圃及其他裝飾物 +STR_1160 :{SMALLFONT}{BLACK}創造或調整湖泊及水塘 STR_1161 :不能放置於此... STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} STR_1163 :{STRINGID}{NEWLINE}(按右鍵修改) @@ -1280,20 +1280,20 @@ STR_1274 :建築物 STR_1275 :{COMMA16}建築物 STR_1276 :{COMMA16}建築物 STR_1277 :建築物{COMMA16} -STR_1278 :structure -STR_1279 :structures -STR_1280 :Structure -STR_1281 :Structures -STR_1282 :{COMMA16} structure -STR_1283 :{COMMA16} structures -STR_1284 :Structure {COMMA16} -STR_1285 :ship -STR_1286 :ships -STR_1287 :Ship -STR_1288 :Ships -STR_1289 :{COMMA16} ship -STR_1290 :{COMMA16} ships -STR_1291 :Ship {COMMA16} +STR_1278 :結構 +STR_1279 :結構 +STR_1280 :結構 +STR_1281 :結構 +STR_1282 :{COMMA16}結構 +STR_1283 :{COMMA16}結構 +STR_1284 :結構{COMMA16} +STR_1285 :船隻 +STR_1286 :船隻 +STR_1287 :船隻 +STR_1288 :船隻 +STR_1289 :{COMMA16}船隻 +STR_1290 :{COMMA16}船隻 +STR_1291 :船隻{COMMA16} STR_1292 :cabin STR_1293 :cabins STR_1294 :Cabin @@ -1350,23 +1350,23 @@ STR_1344 :{WINDOW_COLOUR_2}軌道長度: {BLACK}{STRINGID}{STRINGID}{STRINGID STR_1345 :{LENGTH} STR_1346 :{LENGTH} / STR_1347 :{WINDOW_COLOUR_2}平均速度: {BLACK}{VELOCITY} -STR_1348 :{WINDOW_COLOUR_2}Max. positive vertical G's: {BLACK}{COMMA2DP32}g -STR_1349 :{WINDOW_COLOUR_2}Max. positive vertical G's: {OUTLINE}{RED}{COMMA2DP32}g -STR_1350 :{WINDOW_COLOUR_2}Max. negative vertical G's: {BLACK}{COMMA2DP32}g -STR_1351 :{WINDOW_COLOUR_2}Max. negative vertical G's: {OUTLINE}{RED}{COMMA2DP32}g -STR_1352 :{WINDOW_COLOUR_2}Max. lateral G's: {BLACK}{COMMA2DP32}g -STR_1353 :{WINDOW_COLOUR_2}Max. lateral G's: {OUTLINE}{RED}{COMMA2DP32}g -STR_1354 :{WINDOW_COLOUR_2}Highest drop height: {BLACK}{LENGTH} -STR_1355 :{WINDOW_COLOUR_2}Drops: {BLACK}{COMMA16} -STR_1356 :{WINDOW_COLOUR_2}Inversions: {BLACK}{COMMA16} -STR_1357 :{WINDOW_COLOUR_2}Holes: {BLACK}{COMMA16} -STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs +STR_1348 :{WINDOW_COLOUR_2}最大正垂直重力: {BLACK}{COMMA2DP32}g +STR_1349 :{WINDOW_COLOUR_2}最大正垂直重力: {OUTLINE}{RED}{COMMA2DP32}g +STR_1350 :{WINDOW_COLOUR_2}最大負垂直重力: {BLACK}{COMMA2DP32}g +STR_1351 :{WINDOW_COLOUR_2}最大負垂直重力: {OUTLINE}{RED}{COMMA2DP32}g +STR_1352 :{WINDOW_COLOUR_2}最大橫向重力: {BLACK}{COMMA2DP32}g +STR_1353 :{WINDOW_COLOUR_2}最大橫向重力: {OUTLINE}{RED}{COMMA2DP32}g +STR_1354 :{WINDOW_COLOUR_2}最高下落高度: {BLACK}{LENGTH} +STR_1355 :{WINDOW_COLOUR_2}下落數量: {BLACK}{COMMA16} +STR_1356 :{WINDOW_COLOUR_2}反轉數量: {BLACK}{COMMA16} +STR_1357 :{WINDOW_COLOUR_2}桿洞數量: {BLACK}{COMMA16} +STR_1358 :{WINDOW_COLOUR_2}總'空中'時間: {BLACK}{COMMA2DP32}secs STR_1359 :{WINDOW_COLOUR_2}輪候時間: {BLACK}{COMMA16}分鐘 STR_1360 :{WINDOW_COLOUR_2}輪候時間: {BLACK}{COMMA16}分鐘 STR_1361 :不能改變速度... STR_1362 :不能改變發車速度... -STR_1363 :Too high for supports! -STR_1364 :Supports for track above can't be extended any further! +STR_1363 :高度過高無法支撐! +STR_1364 :無法再擴展空中軌道的支撐! STR_1365 :In-line Twist (向左) STR_1366 :In-line Twist (向右) STR_1367 :二分之一迴環 @@ -1544,7 +1544,7 @@ STR_1538 :{SMALLFONT}{OPENQUOTES}這件由{STRINGID}購買的T-shirt真的是 STR_1539 :{SMALLFONT}{OPENQUOTES}這件由{STRINGID}購買的甜甜圈真的是超值{ENDQUOTES} STR_1540 :{SMALLFONT}{OPENQUOTES}這杯由{STRINGID}購買的咖啡真的是超值{ENDQUOTES} STR_1541 : -STR_1542 :{SMALLFONT}{OPENQUOTES}這件由{STRINGID}購買的炸雞真的是超值{ENDQUOTES} +STR_1542 :{SMALLFONT}{OPENQUOTES}這客由{STRINGID}購買的炸雞真的是超值{ENDQUOTES} STR_1543 :{SMALLFONT}{OPENQUOTES}這杯由{STRINGID}購買的檸檬水真的是超值{ENDQUOTES} STR_1544 : STR_1545 : @@ -1563,7 +1563,7 @@ STR_1557 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買 STR_1558 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一個漢堡{ENDQUOTES} STR_1559 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一客薯條{ENDQUOTES} STR_1560 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一個冰淇淋{ENDQUOTES} -STR_1561 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一個棉花糖{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一球棉花糖{ENDQUOTES} STR_1562 : STR_1563 : STR_1564 : @@ -1578,7 +1578,7 @@ STR_1572 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買 STR_1573 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一件甜甜圈{ENDQUOTES} STR_1574 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一杯咖啡{ENDQUOTES} STR_1575 : -STR_1576 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一件炸雞{ENDQUOTES} +STR_1576 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一客炸雞{ENDQUOTES} STR_1577 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一杯檸檬水{ENDQUOTES} STR_1578 : STR_1579 : @@ -1718,7 +1718,7 @@ STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}清掃道路 STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}灌溉花圃 STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}清空垃圾筒 STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Mow grass -STR_1716 :非法的樂園名稱 +STR_1716 :不適合的樂園名稱 STR_1717 :不能重命名樂園... STR_1718 :樂園名稱 STR_1719 :請輸入樂園名稱: @@ -1889,7 +1889,7 @@ STR_1883 :每小時 STR_1884 :每2小時 STR_1885 :從不 STR_1886 :檢查{STRINGID}中 -STR_1887 :{WINDOW_COLOUR_2}上次檢查時間: {BLACK}{COMMA16}分鐘 +STR_1887 :{WINDOW_COLOUR_2}上次檢查時間: {BLACK}{COMMA16}分鐘前 STR_1888 :{WINDOW_COLOUR_2}上次檢查時間: {BLACK}多於4小時 STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1890 :{SMALLFONT}{BLACK}選擇維修人員檢查此遊樂設施的時距 @@ -1901,19 +1901,19 @@ STR_1893 :Please insert your RollerCoaster Tycoon 2 CD in the following drive STR_1894 :{WINDOW_COLOUR_2}賣出{STRINGID}: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}建造新的遊樂設施/店鋪 STR_1896 :{WINDOW_COLOUR_2}支出/收入 -STR_1897 :{WINDOW_COLOUR_2}Ride construction -STR_1898 :{WINDOW_COLOUR_2}Ride running costs -STR_1899 :{WINDOW_COLOUR_2}Land purchase -STR_1900 :{WINDOW_COLOUR_2}Landscaping -STR_1901 :{WINDOW_COLOUR_2}Park entrance tickets -STR_1902 :{WINDOW_COLOUR_2}Ride tickets -STR_1903 :{WINDOW_COLOUR_2}Shop sales -STR_1904 :{WINDOW_COLOUR_2}Shop stock -STR_1905 :{WINDOW_COLOUR_2}Food/drink sales -STR_1906 :{WINDOW_COLOUR_2}Food/drink stock -STR_1907 :{WINDOW_COLOUR_2}Staff wages -STR_1908 :{WINDOW_COLOUR_2}Marketing -STR_1909 :{WINDOW_COLOUR_2}研發 +STR_1897 :{WINDOW_COLOUR_2}建造遊樂設施 +STR_1898 :{WINDOW_COLOUR_2}運行遊樂設施費用 +STR_1899 :{WINDOW_COLOUR_2}購買土地 +STR_1900 :{WINDOW_COLOUR_2}調整地形 +STR_1901 :{WINDOW_COLOUR_2}樂園入場門票 +STR_1902 :{WINDOW_COLOUR_2}遊樂設施門票 +STR_1903 :{WINDOW_COLOUR_2}其他商品銷售額 +STR_1904 :{WINDOW_COLOUR_2}其他商品進貨 +STR_1905 :{WINDOW_COLOUR_2}食物/飲料銷售額 +STR_1906 :{WINDOW_COLOUR_2}食物/飲料進貨 +STR_1907 :{WINDOW_COLOUR_2}員工薪金 +STR_1908 :{WINDOW_COLOUR_2}營銷費用 +STR_1909 :{WINDOW_COLOUR_2}研發費用 STR_1910 :{WINDOW_COLOUR_2}貸款利息 STR_1911 :{BLACK} 每年 {COMMA16}% STR_1912 :{MONTH} @@ -2048,195 +2048,195 @@ STR_2040 :炸雞 STR_2041 :檸檬水 STR_2042 :空盒子 STR_2043 :空瓶子 -STR_2044 :a Balloon -STR_2045 :a Cuddly Toy -STR_2046 :a Park Map -STR_2047 :an On-Ride Photo -STR_2048 :an Umbrella -STR_2049 :a Drink -STR_2050 :a Burger -STR_2051 :some Chips -STR_2052 :an Ice Cream -STR_2053 :some Candyfloss -STR_2054 :an Empty Can -STR_2055 :some Rubbish -STR_2056 :an Empty Burger Box -STR_2057 :a Pizza -STR_2058 :a Voucher -STR_2059 :some Popcorn -STR_2060 :a Hot Dog -STR_2061 :a Tentacle -STR_2062 :a Hat -STR_2063 :a Toffee Apple -STR_2064 :a T-Shirt -STR_2065 :a Doughnut -STR_2066 :a Coffee -STR_2067 :an Empty Cup -STR_2068 :some Fried Chicken -STR_2069 :some Lemonade -STR_2070 :an Empty Box -STR_2071 :an Empty Bottle -STR_2072 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Balloon -STR_2073 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Cuddly Toy -STR_2074 :Map of {STRINGID} -STR_2075 :On-Ride Photo of {STRINGID} -STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Umbrella -STR_2077 :Drink -STR_2078 :Burger -STR_2079 :Chips -STR_2080 :Ice Cream -STR_2081 :Candyfloss -STR_2082 :Empty Can -STR_2083 :Rubbish -STR_2084 :Empty Burger Box -STR_2085 :Pizza -STR_2086 :Voucher for {STRINGID} -STR_2087 :Popcorn -STR_2088 :Hot Dog -STR_2089 :Tentacle -STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hat -STR_2091 :Toffee Apple +STR_2044 :一個氣球 +STR_2045 :一隻毛公仔 +STR_2046 :一份樂園地圖 +STR_2047 :一張即時照片 +STR_2048 :一把雨傘 +STR_2049 :一杯飲料 +STR_2050 :一個漢堡 +STR_2051 :一客薯條 +STR_2052 :一個冰淇淋 +STR_2053 :一球棉花糖 +STR_2054 :一個空罐子 +STR_2055 :一些垃圾 +STR_2056 :一個空漢堡盒子 +STR_2057 :一件批薩 +STR_2058 :一張優惠卷 +STR_2059 :一客爆米花 +STR_2060 :一隻熱狗 +STR_2061 :一隻觸手 +STR_2062 :一頂帽子 +STR_2063 :一個太妃蘋果糖 +STR_2064 :一件T-shirt +STR_2065 :一件甜甜圈 +STR_2066 :一杯咖啡 +STR_2067 :一個空杯子 +STR_2068 :一客炸雞 +STR_2069 :一杯檸檬水 +STR_2070 :一個空盒子 +STR_2071 :一個空瓶子 +STR_2072 :{OPENQUOTES}{STRINGID}{ENDQUOTES}氣球 +STR_2073 :{OPENQUOTES}{STRINGID}{ENDQUOTES}毛公仔 +STR_2074 :{STRINGID}的地圖 +STR_2075 :{STRINGID}的即時照片 +STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES}雨傘 +STR_2077 :飲料 +STR_2078 :漢堡 +STR_2079 :薯條 +STR_2080 :冰淇淋 +STR_2081 :棉花糖 +STR_2082 :空罐子 +STR_2083 :垃圾 +STR_2084 :空漢堡盒子 +STR_2085 :批薩 +STR_2086 :{STRINGID}的優惠卷 +STR_2087 :爆米花 +STR_2088 :熱狗 +STR_2089 :觸手 +STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES}帽子 +STR_2091 :太妃蘋果糖 STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-Shirt -STR_2093 :Doughnut -STR_2094 :Coffee -STR_2095 :Empty Cup -STR_2096 :Fried Chicken -STR_2097 :Lemonade -STR_2098 :Empty Box -STR_2099 :Empty Bottle -STR_2100 :{WINDOW_COLOUR_2}On-Ride Photo price: -STR_2101 :{WINDOW_COLOUR_2}On-Ride Photo price: -STR_2102 :{WINDOW_COLOUR_2}On-Ride Photo price: -STR_2103 :{WINDOW_COLOUR_2}Pretzel price: -STR_2104 :{WINDOW_COLOUR_2}Hot Chocolate price: -STR_2105 :{WINDOW_COLOUR_2}Iced Tea price: -STR_2106 :{WINDOW_COLOUR_2}Funnel Cake price: -STR_2107 :{WINDOW_COLOUR_2}Sunglasses price: -STR_2108 :{WINDOW_COLOUR_2}Beef Noodles price: -STR_2109 :{WINDOW_COLOUR_2}Fried Rice Noodles price: -STR_2110 :{WINDOW_COLOUR_2}Wonton Soup price: -STR_2111 :{WINDOW_COLOUR_2}Meatball Soup price: -STR_2112 :{WINDOW_COLOUR_2}Fruit Juice price: -STR_2113 :{WINDOW_COLOUR_2}Soybean Milk price: -STR_2114 :{WINDOW_COLOUR_2}Sujongkwa price: -STR_2115 :{WINDOW_COLOUR_2}Sub Sandwich price: -STR_2116 :{WINDOW_COLOUR_2}Cookie price: +STR_2093 :甜甜圈 +STR_2094 :咖啡 +STR_2095 :空杯子 +STR_2096 :炸雞 +STR_2097 :檸檬水 +STR_2098 :空盒子 +STR_2099 :空瓶子 +STR_2100 :{WINDOW_COLOUR_2}即時照片價格: +STR_2101 :{WINDOW_COLOUR_2}即時照片價格: +STR_2102 :{WINDOW_COLOUR_2}即時照片價格: +STR_2103 :{WINDOW_COLOUR_2}椒鹽卷餅價格: +STR_2104 :{WINDOW_COLOUR_2}熱巧克力價格: +STR_2105 :{WINDOW_COLOUR_2}冰紅茶價格: +STR_2106 :{WINDOW_COLOUR_2}漏斗蛋糕價格: +STR_2107 :{WINDOW_COLOUR_2}太陽眼鏡價格: +STR_2108 :{WINDOW_COLOUR_2}牛肉麵價格: +STR_2109 :{WINDOW_COLOUR_2}炒米粉價格: +STR_2110 :{WINDOW_COLOUR_2}湯雲吞價格: +STR_2111 :{WINDOW_COLOUR_2}肉丸湯價格: +STR_2112 :{WINDOW_COLOUR_2}果汁價格: +STR_2113 :{WINDOW_COLOUR_2}豆漿價格: +STR_2114 :{WINDOW_COLOUR_2}水正果價格: +STR_2115 :{WINDOW_COLOUR_2}潛艇三文治價格: +STR_2116 :{WINDOW_COLOUR_2}曲奇價格: STR_2117 :{WINDOW_COLOUR_2} STR_2118 :{WINDOW_COLOUR_2} STR_2119 :{WINDOW_COLOUR_2} -STR_2120 :{WINDOW_COLOUR_2}Roast Sausage price: +STR_2120 :{WINDOW_COLOUR_2}烤香腸價格: STR_2121 :{WINDOW_COLOUR_2} -STR_2122 :On-Ride Photo -STR_2123 :On-Ride Photo -STR_2124 :On-Ride Photo -STR_2125 :Pretzel -STR_2126 :Hot Chocolate -STR_2127 :Iced Tea -STR_2128 :Funnel Cake -STR_2129 :Sunglasses -STR_2130 :Beef Noodles -STR_2131 :Fried Rice Noodles -STR_2132 :Wonton Soup -STR_2133 :Meatball Soup -STR_2134 :Fruit Juice -STR_2135 :Soybean Milk -STR_2136 :Sujongkwa -STR_2137 :Sub Sandwich -STR_2138 :Cookie -STR_2139 :Empty Bowl -STR_2140 :Empty Drink Carton -STR_2141 :Empty Juice Cup -STR_2142 :Roast Sausage -STR_2143 :Empty Bowl -STR_2144 :On-Ride Photos -STR_2145 :On-Ride Photos -STR_2146 :On-Ride Photos -STR_2147 :Pretzels -STR_2148 :Hot Chocolates -STR_2149 :Iced Teas -STR_2150 :Funnel Cakes -STR_2151 :Sunglasses -STR_2152 :Beef Noodles -STR_2153 :Fried Rice Noodles -STR_2154 :Wonton Soups -STR_2155 :Meatball Soups -STR_2156 :Fruit Juices -STR_2157 :Soybean Milks -STR_2158 :Sujongkwa -STR_2159 :Sub Sandwiches -STR_2160 :Cookies -STR_2161 :Empty Bowls -STR_2162 :Empty Drink Cartons -STR_2163 :Empty Juice cups -STR_2164 :Roast Sausages -STR_2165 :Empty Bowls -STR_2166 :an On-Ride Photo -STR_2167 :an On-Ride Photo -STR_2168 :an On-Ride Photo -STR_2169 :a Pretzel -STR_2170 :a Hot Chocolate -STR_2171 :an Iced Tea -STR_2172 :a Funnel Cake -STR_2173 :a pair of Sunglasses -STR_2174 :some Beef Noodles -STR_2175 :some Fried Rice Noodles -STR_2176 :some Wonton Soup -STR_2177 :some Meatball Soup -STR_2178 :a Fruit Juice -STR_2179 :some Soybean Milk -STR_2180 :some Sujongkwa -STR_2181 :a Sub Sandwich -STR_2182 :a Cookie -STR_2183 :an Empty Bowl -STR_2184 :an Empty Drink Carton -STR_2185 :an Empty Juice Cup -STR_2186 :a Roast Sausage -STR_2187 :an Empty Bowl -STR_2188 :On-Ride Photo of {STRINGID} -STR_2189 :On-Ride Photo of {STRINGID} -STR_2190 :On-Ride Photo of {STRINGID} -STR_2191 :Pretzel -STR_2192 :Hot Chocolate -STR_2193 :Iced Tea -STR_2194 :Funnel Cake -STR_2195 :Sunglasses -STR_2196 :Beef Noodles -STR_2197 :Fried Rice Noodles -STR_2198 :Wonton Soup -STR_2199 :Meatball Soup -STR_2200 :Fruit Juice -STR_2201 :Soybean Milk -STR_2202 :Sujongkwa -STR_2203 :Sub Sandwich -STR_2204 :Cookie -STR_2205 :Empty Bowl -STR_2206 :Empty Drink Carton -STR_2207 :Empty Juice Cup -STR_2208 :Roast Sausage -STR_2209 :Empty Bowl -STR_2210 :{SMALLFONT}{BLACK}Show list of handymen in park -STR_2211 :{SMALLFONT}{BLACK}Show list of mechanics in park -STR_2212 :{SMALLFONT}{BLACK}Show list of security guards in park -STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park -STR_2214 :Construction not possible while game is paused! +STR_2122 :即時照片 +STR_2123 :即時照片 +STR_2124 :即時照片 +STR_2125 :椒鹽卷餅 +STR_2126 :熱巧克力 +STR_2127 :冰紅茶 +STR_2128 :漏斗蛋糕 +STR_2129 :太陽眼鏡 +STR_2130 :牛肉麵 +STR_2131 :炒米粉 +STR_2132 :湯雲吞 +STR_2133 :肉丸湯 +STR_2134 :果汁 +STR_2135 :豆漿 +STR_2136 :水正果 +STR_2137 :潛艇三文治 +STR_2138 :曲奇 +STR_2139 :空碗子 +STR_2140 :空的飲品紙包裝 +STR_2141 :空果汁杯子 +STR_2142 :烤香腸 +STR_2143 :空碗子 +STR_2144 :即時照片 +STR_2145 :即時照片 +STR_2146 :即時照片 +STR_2147 :椒鹽卷餅 +STR_2148 :熱巧克力 +STR_2149 :冰紅茶 +STR_2150 :漏斗蛋糕 +STR_2151 :太陽眼鏡 +STR_2152 :牛肉麵 +STR_2153 :炒米粉 +STR_2154 :湯雲吞 +STR_2155 :肉丸湯 +STR_2156 :果汁 +STR_2157 :豆漿 +STR_2158 :水正果 +STR_2159 :潛艇三文治 +STR_2160 :曲奇 +STR_2161 :空碗子 +STR_2162 :空的飲品紙包裝 +STR_2163 :空果汁杯子 +STR_2164 :烤香腸 +STR_2165 :空碗子 +STR_2166 :一張即時照片 +STR_2167 :一張即時照片 +STR_2168 :一張即時照片 +STR_2169 :一件椒鹽卷餅 +STR_2170 :一杯熱巧克力 +STR_2171 :一杯冰紅茶 +STR_2172 :一個漏斗蛋糕 +STR_2173 :一副太陽眼鏡 +STR_2174 :一份牛肉麵 +STR_2175 :一份炒米粉 +STR_2176 :一客湯雲吞 +STR_2177 :一客肉丸湯 +STR_2178 :一杯果汁 +STR_2179 :一杯豆漿 +STR_2180 :一杯水正果 +STR_2181 :一件潛艇三文治 +STR_2182 :一件曲奇 +STR_2183 :一個空碗子 +STR_2184 :一盒空的飲品紙包裝 +STR_2185 :一個空果汁杯子 +STR_2186 :一條烤香腸 +STR_2187 :一個空碗子 +STR_2188 :{STRINGID}的即時照片 +STR_2189 :{STRINGID}的即時照片 +STR_2190 :{STRINGID}的即時照片 +STR_2191 :椒鹽卷餅 +STR_2192 :熱巧克力 +STR_2193 :冰紅茶 +STR_2194 :漏斗蛋糕 +STR_2195 :太陽眼鏡 +STR_2196 :牛肉麵 +STR_2197 :炒米粉 +STR_2198 :湯雲吞 +STR_2199 :肉丸湯 +STR_2200 :果汁 +STR_2201 :豆漿 +STR_2202 :水正果 +STR_2203 :潛艇三文治 +STR_2204 :曲奇 +STR_2205 :空碗子 +STR_2206 :空的飲品紙包裝 +STR_2207 :空果汁杯子 +STR_2208 :烤香腸 +STR_2209 :空碗子 +STR_2210 :{SMALLFONT}{BLACK}列出樂園內的清潔工人 +STR_2211 :{SMALLFONT}{BLACK}列出樂園內的維修人員 +STR_2212 :{SMALLFONT}{BLACK}列出樂園內的安全警衛 +STR_2213 :{SMALLFONT}{BLACK}列出樂園內的表演人員 +STR_2214 :遊戲暫停時無法建造任何物件! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F -STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled -STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} -STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} -STR_2221 :{SMALLFONT}{BLACK}Park Rating: {COMMA16} +STR_2218 :{RED}{STRINGID}, {STRINGID}的一部份, 尚未返回到{STRINGID}!{NEWLINE}檢查是否被卡住或被停止了 +STR_2219 :{RED}{COMMA16}人已喪生於{STRINGID}的意外中 +STR_2220 :{WINDOW_COLOUR_2}樂園評價: {BLACK}{COMMA16} +STR_2221 :{SMALLFONT}{BLACK}樂園評價: {COMMA16} STR_2222 :{SMALLFONT}{BLACK}{STRINGID} -STR_2223 :{WINDOW_COLOUR_2}Guests in park: {BLACK}{COMMA16} -STR_2224 :{WINDOW_COLOUR_2}Cash: {BLACK}{CURRENCY2DP} -STR_2225 :{WINDOW_COLOUR_2}Cash: {RED}{CURRENCY2DP} -STR_2226 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} -STR_2227 :{WINDOW_COLOUR_2}Company value: {BLACK}{CURRENCY} -STR_2228 :{WINDOW_COLOUR_2}Last month's profit from food/drink and{NEWLINE}merchandise sales: {BLACK}{CURRENCY} -STR_2229 :Slope up to vertical -STR_2230 :Vertical track -STR_2231 :Holding brake for drop -STR_2232 :Cable lift hill +STR_2223 :{WINDOW_COLOUR_2}園內遊客: {BLACK}{COMMA16} +STR_2224 :{WINDOW_COLOUR_2}現金: {BLACK}{CURRENCY2DP} +STR_2225 :{WINDOW_COLOUR_2}現金: {RED}{CURRENCY2DP} +STR_2226 :{WINDOW_COLOUR_2}樂園價值: {BLACK}{CURRENCY} +STR_2227 :{WINDOW_COLOUR_2}公司價值: {BLACK}{CURRENCY} +STR_2228 :{WINDOW_COLOUR_2}上個月來自食物/飲料以及{NEWLINE}其他商品的銷售額: {BLACK}{CURRENCY} +STR_2229 :上坡到垂直的過渡軌道 +STR_2230 :垂直軌道 +STR_2231 :下落煞車裝置 +STR_2232 :纜索坡道 STR_2233 :{SMALLFONT}{BLACK}樂園資料 STR_2234 :最近訊息 STR_2235 :{SMALLFONT}{STRINGID} {STRINGID} @@ -2295,11 +2295,11 @@ STR_2287 :完成設計中 STR_2288 :未知 STR_2289 :{STRINGID} {STRINGID} STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} -STR_2291 :Select scenario for new game -STR_2292 :{WINDOW_COLOUR_2}Rides been on: -STR_2293 :{BLACK} Nothing -STR_2294 :{SMALLFONT}{BLACK}Change base land style -STR_2295 :{SMALLFONT}{BLACK}Change vertical edges of land +STR_2291 :選擇新遊戲的劇情 +STR_2292 :{WINDOW_COLOUR_2}乘坐過的遊樂設施: +STR_2293 :{BLACK}無 +STR_2294 :{SMALLFONT}{BLACK}更改基礎土地樣式 +STR_2295 :{SMALLFONT}{BLACK}更改土地的垂直邊界 STR_2296 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}進入樂園 STR_2297 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}乘坐{BLACK}{COMMA16}個遊樂設施 STR_2298 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}乘坐{BLACK}{COMMA16}個遊樂設施 @@ -2309,18 +2309,18 @@ STR_2301 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}享用{ STR_2302 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}享用{BLACK}{COMMA16}款飲料 STR_2303 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}購買{BLACK}{COMMA16}個記念品 STR_2304 :{WINDOW_COLOUR_2}付了{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}購買{BLACK}{COMMA16}個記念品 -STR_2305 :Track design files -STR_2306 :Save track design -STR_2307 :Select {STRINGID} design -STR_2308 :{STRINGID} Track Designs -STR_2309 :Install New Track Design -STR_2310 :Build custom design -STR_2311 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} (approx.) -STR_2312 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} (approx.) -STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) -STR_2314 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID} -STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} -STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks +STR_2305 :軌道設計檔案 +STR_2306 :儲存軌道設計 +STR_2307 :選擇{STRINGID}的設計 +STR_2308 :{STRINGID}的設計檔案 +STR_2309 :安裝新的軌道設計 +STR_2310 :建造自訂設計 +STR_2311 :{WINDOW_COLOUR_2}興奮度: {BLACK}{COMMA2DP32} (approx.) +STR_2312 :{WINDOW_COLOUR_2}刺激度: {BLACK}{COMMA2DP32} (approx.) +STR_2313 :{WINDOW_COLOUR_2}噁心度: {BLACK}{COMMA2DP32} (approx.) +STR_2314 :{WINDOW_COLOUR_2}軌道長度: {BLACK}{STRINGID} +STR_2315 :{WINDOW_COLOUR_2}建造費用: {BLACK}約{CURRENCY} +STR_2316 :{WINDOW_COLOUR_2}需要空間: {BLACK}{COMMA16} x {COMMA16}格 STR_2317 :{WINDOW_COLOUR_2}音效品質: STR_2318 :低 STR_2319 :中 @@ -2338,21 +2338,21 @@ STR_2330 :{WINDOW_COLOUR_2}溫度單位: STR_2331 :{WINDOW_COLOUR_2}高度標記單位: STR_2332 :單位 STR_2333 :Sound -STR_2334 :Pounds ({POUND}) -STR_2335 :Dollars ($) -STR_2336 :Franc (F) -STR_2337 :Deutschmark (DM) -STR_2338 :Yen ({YEN}) -STR_2339 :Peseta (Pts) -STR_2340 :Lira (L) -STR_2341 :Guilders (fl.) -STR_2342 :Krona (kr) -STR_2343 :Euros ({EURO}) +STR_2334 :英鎊 ({POUND}) +STR_2335 :美金 ($) +STR_2336 :法郎 (F) +STR_2337 :馬克 (DM) +STR_2338 :日元 ({YEN}) +STR_2339 :比塞塔 (Pts) +STR_2340 :裡拉 (L) +STR_2341 :荷蘭盾 (fl.) +STR_2342 :克朗 (kr) +STR_2343 :歐元 ({EURO}) STR_2344 :Imperial STR_2345 :Metric STR_2346 :Display STR_2347 :{RED}{STRINGID}已被溺死! -STR_2348 :{SMALLFONT}{BLACK}Show statistics for this staff member +STR_2348 :{SMALLFONT}{BLACK}顯示這位員工的統計資料 STR_2349 :{WINDOW_COLOUR_2}工資: {BLACK}每個月{CURRENCY} STR_2350 :{WINDOW_COLOUR_2}僱用日期: {BLACK}{MONTHYEAR} STR_2351 :{WINDOW_COLOUR_2}除草次數: {BLACK}{COMMA16} @@ -2365,10 +2365,10 @@ STR_2357 :House STR_2358 :Units STR_2359 :Real Values STR_2360 :{WINDOW_COLOUR_2}屏幕解析度: -STR_2361 :Landscape Smoothing -STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off -STR_2363 :Gridlines on Landscape -STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off +STR_2361 :土地邊緣平滑化 +STR_2362 :{SMALLFONT}{BLACK}開啟/關閉土地邊緣平滑化 +STR_2363 :土地上的網格 +STR_2364 :{SMALLFONT}{BLACK}開啟/關閉土地上的網格 STR_2365 :銀行拒絕增加你的貸款額! STR_2366 :攝氏 ({DEGREE}C) STR_2367 :華氏 (F) @@ -2440,12 +2440,12 @@ STR_2432 :{BLACK}半價進入{STRINGID}的優惠卷 STR_2433 :{BLACK}免費{STRINGID}的優惠卷 STR_2434 :{BLACK}{STRINGID}的推廣計劃 STR_2435 :{BLACK}{STRINGID}的推廣計劃 -STR_2436 :1週 -STR_2437 :2週 -STR_2438 :3週 -STR_2439 :4週 -STR_2440 :5週 -STR_2441 :6週 +STR_2436 : +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : STR_2442 :{BLACK}(還剩{STRINGID}結束) STR_2443 :{WINDOW_COLOUR_2}每週費用: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}總費用: {BLACK}{CURRENCY2DP} @@ -2725,18 +2725,18 @@ STR_2716 :/ STR_2717 :' STR_2718 :(向上層) STR_2719 :(建立新檔案) -STR_2720 :{UINT16}sec -STR_2721 :{UINT16}secs -STR_2722 :{UINT16}min:{UINT16}sec -STR_2723 :{UINT16}min:{UINT16}secs -STR_2724 :{UINT16}mins:{UINT16}sec -STR_2725 :{UINT16}mins:{UINT16}secs -STR_2726 :{UINT16}min -STR_2727 :{UINT16}mins -STR_2728 :{UINT16}hour:{UINT16}min -STR_2729 :{UINT16}hour:{UINT16}mins -STR_2730 :{UINT16}hours:{UINT16}min -STR_2731 :{UINT16}hours:{UINT16}mins +STR_2720 :{UINT16}秒 +STR_2721 :{UINT16}秒 +STR_2722 :{UINT16}分:{UINT16}秒 +STR_2723 :{UINT16}分:{UINT16}秒 +STR_2724 :{UINT16}分:{UINT16}秒 +STR_2725 :{UINT16}分:{UINT16}秒 +STR_2726 :{UINT16}分 +STR_2727 :{UINT16}分 +STR_2728 :{UINT16}小時:{UINT16}分 +STR_2729 :{UINT16}小時:{UINT16}分 +STR_2730 :{UINT16}小時:{UINT16}分 +STR_2731 :{UINT16}小時:{UINT16}分 STR_2732 :{COMMA16}ft STR_2733 :{COMMA16}m STR_2734 :{COMMA16}mph @@ -2976,8 +2976,8 @@ STR_2965 :{WINDOW_COLOUR_2} STR_2966 : STR_2967 : STR_2968 : -STR_2969 :本產品的使用需經過版權授權 -STR_2970 :在產品的{OPENQUOTES}讀我檔案ReadMe{ENDQUOTES}檔案及手冊可找到 +STR_2969 : +STR_2970 : STR_2971 :主要顏色調配 STR_2972 :額外顏色調配1 STR_2973 :額外顏色調配2 @@ -3065,12 +3065,12 @@ STR_3054 :載入中... STR_3055 :白色 STR_3056 :透明 STR_3057 :{WINDOW_COLOUR_2}建造標記: -STR_3058 :Brick walls -STR_3059 :Hedges -STR_3060 :Ice blocks -STR_3061 :Wooden fences -STR_3062 :{SMALLFONT}{BLACK}Standard roller coaster track -STR_3063 :{SMALLFONT}{BLACK}Water channel (track submerged) +STR_3058 :磚牆 +STR_3059 :樹籬 +STR_3060 :冰磚牆 +STR_3061 :木柵欄 +STR_3062 :{SMALLFONT}{BLACK}標準雲霄飛車軌道 +STR_3063 :{SMALLFONT}{BLACK}水濺軌道 (軌道半浸於水中) STR_3064 :新手級樂園 STR_3065 :挑戰級樂園 STR_3066 :專家級樂園 @@ -3080,11 +3080,11 @@ STR_3069 :Top Section STR_3070 :Slope to Level STR_3071 :{WINDOW_COLOUR_2}劃一樂園內的價格 STR_3072 :{SMALLFONT}{BLACK}選擇是否以此價格為劃一價格 -STR_3073 :{RED}WARNING: Your park rating has dropped below 700 !{NEWLINE}If you haven't raised the park rating in 4 weeks, your park will be closed down -STR_3074 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have 3 weeks to raise the park rating -STR_3075 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have only 2 weeks to raise the park rating, or your park will be closed down -STR_3076 :{RED}FINAL WARNING: Your park rating is still below 700 !{NEWLINE}In just 7 days your park will be closed down unless you can raise the rating -STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! +STR_3073 :{RED}警告: 你的樂園評價已跌至低於700!{NEWLINE}如果你在4週內尚未改善樂園評價, 你的樂園將會被強制關閉 +STR_3074 :{RED}警告: 你的樂園評價仍然低於700!{NEWLINE}你還有3週去改善評價 +STR_3075 :{RED}警告: 你的樂園評價仍然低於700!{NEWLINE}你還有2週去改善評價, 否則你的樂園將會被強制關閉 +STR_3076 :{RED}最後通諜: 你的樂園評價仍然低於700!{NEWLINE}7日之內你的樂園將會被強制關閉, 除非你能改善樂園評價 +STR_3077 :{RED}關閉告示: 你的樂園已被強制關閉! STR_3078 :普通入口 STR_3079 :木製入口 STR_3080 :帆布帳幕式入口 @@ -3164,18 +3164,18 @@ STR_3153 :{SMALLFONT}{BLACK}Scroll {STRINGID} down fast STR_3154 :{SMALLFONT}{BLACK}Scroll {STRINGID} up/down STR_3155 : STR_3156 : -STR_3157 :map -STR_3158 :graph -STR_3159 :list -STR_3160 :RollerCoaster Tycoon 2: Starting for the first time... -STR_3161 :RollerCoaster Tycoon 2: Checking object files... -STR_3162 :Unable to allocate enough memory -STR_3163 :Installing new data: -STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) +STR_3157 :地圖 +STR_3158 :圖表 +STR_3159 :列表 +STR_3160 : +STR_3161 : +STR_3162 :無法分配足夠的記憶體 +STR_3163 :安裝新資料檔中: +STR_3164 :{BLACK}已選擇{COMMA16}項 (最多{COMMA16}項) STR_3165 : STR_3166 :{BLACK}(ID: -STR_3167 :{WINDOW_COLOUR_2}Includes: {BLACK}{COMMA16} objects -STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} +STR_3167 :{WINDOW_COLOUR_2}包含: {BLACK}{COMMA16}項物件 +STR_3168 :{WINDOW_COLOUR_2}文字: {BLACK}{STRINGID} STR_3169 :Data for the following object not found: STR_3170 :Not enough space for graphics STR_3171 :Too many objects of this type selected @@ -3201,13 +3201,13 @@ STR_3190 :額外的道路物件 STR_3191 :景物組別 STR_3192 :樂園入口 STR_3193 :水塘 -STR_3194 :Scenario Description -STR_3195 :Invention List -STR_3196 :{WINDOW_COLOUR_2}Research Group: {BLACK}{STRINGID} -STR_3197 :{WINDOW_COLOUR_2}Items pre-invented at start of game: -STR_3198 :{WINDOW_COLOUR_2}Items to invent during game: -STR_3199 :Random Shuffle -STR_3200 :{SMALLFONT}{BLACK}Randomly shuffle the list of items to invent during the game +STR_3194 :劇情簡介 +STR_3195 :研發列表 +STR_3196 :{WINDOW_COLOUR_2}研發組別: {BLACK}{STRINGID} +STR_3197 :{WINDOW_COLOUR_2}遊戲開始時已研發好的項目: +STR_3198 :{WINDOW_COLOUR_2}需要在遊戲中研發的項目: +STR_3199 :隨機分配 +STR_3200 :{SMALLFONT}{BLACK}將需要在遊戲中研發的項目隨機分配 STR_3201 :選取物件 STR_3202 :編輯地勢 STR_3203 :設定研發清單 @@ -3220,9 +3220,9 @@ STR_3209 :上一步: STR_3210 :下一步: STR_3211 :{WINDOW_COLOUR_2}地圖大小: STR_3212 :{POP16}{COMMA16} x {PUSH16}{COMMA16} -STR_3213 :Can't decrease map size any further -STR_3214 :Can't increase map size any further -STR_3215 :Too close to edge of map +STR_3213 :不能再縮小地圖 +STR_3214 :不能再擴大地圖 +STR_3215 :太接近地圖的邊緣 STR_3216 :{SMALLFONT}{BLACK}Select park-owned land etc. STR_3217 :Land Owned STR_3218 :Construction Rights Owned @@ -3302,11 +3302,11 @@ STR_3291 :溫暖 STR_3292 :又熱又乾燥 STR_3293 :寒冷 STR_3294 :更改... -STR_3295 :{SMALLFONT}{BLACK}Change name of park -STR_3296 :{SMALLFONT}{BLACK}Change name of scenario -STR_3297 :{SMALLFONT}{BLACK}Change detail notes about park / scenario -STR_3298 :{WINDOW_COLOUR_2}Park Name: {BLACK}{STRINGID} -STR_3299 :{WINDOW_COLOUR_2}Park/Scenario Details: +STR_3295 :{SMALLFONT}{BLACK}更改樂園名稱 +STR_3296 :{SMALLFONT}{BLACK}更改劇情名稱 +STR_3297 :{SMALLFONT}{BLACK}更改樂園/劇情的簡介 +STR_3298 :{WINDOW_COLOUR_2}樂園名稱: {BLACK}{STRINGID} +STR_3299 :{WINDOW_COLOUR_2}樂園/劇情的簡介: STR_3300 :{WINDOW_COLOUR_2}劇情名稱: {BLACK}{STRINGID} STR_3301 :{WINDOW_COLOUR_2}達成目標的日期: STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR} @@ -3319,12 +3319,12 @@ STR_3308 :{WINDOW_COLOUR_2}興奮度: STR_3309 :{WINDOW_COLOUR_2}{COMMA16} STR_3310 :{WINDOW_COLOUR_2}{LENGTH} STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32} -STR_3312 :{WINDOW_COLOUR_2}Rides/attractions under a preservation order: -STR_3313 :Scenario Name -STR_3314 :Enter name for scenario: -STR_3315 :Park/Scenario Details -STR_3316 :Enter description of this scenario: -STR_3317 :No details yet +STR_3312 :{WINDOW_COLOUR_2}請選取要保留的遊樂設施/店鋪: +STR_3313 :劇情名稱 +STR_3314 :請輸入這個劇情的名稱: +STR_3315 :樂園/劇情的簡介 +STR_3316 :請輸入這個樂園/劇情的簡介: +STR_3317 :暫無簡介 STR_3318 :{SMALLFONT}{BLACK}Select which group this scenario appears in STR_3319 :{WINDOW_COLOUR_2}Scenario Group: STR_3320 :Unable to save scenario file... @@ -3345,58 +3345,58 @@ STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in obj STR_3335 :雲霄飛車設計工具 - 選擇要設計的雲霄飛車的類型及車輛種類 STR_3336 :軌道設計管理工具 - 選擇要管理的遊樂設施的類型 STR_3337 :六旗樂園 -STR_3338 :{BLACK}Custom-designed layout -STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout -STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout -STR_3341 :{SMALLFONT}{BLACK}Game tools -STR_3342 :Scenario Editor -STR_3343 :Convert Saved Game to Scenario +STR_3338 :{BLACK}自訂設計 +STR_3339 :{BLACK}可選{COMMA16}項預設計, 或可自訂設計 +STR_3340 :{BLACK}可選{COMMA16}項預設計, 或可自訂設計 +STR_3341 :{SMALLFONT}{BLACK}遊戲工具 +STR_3342 :劇情修改工具 +STR_3343 :將存檔轉換成劇情 STR_3344 :雲霄飛車設計工具 STR_3345 :軌道設計管理工具 STR_3346 :無法儲存軌道設計... STR_3347 :遊樂設施太巨型, 含有太多物件, 或景物分佈太散亂 STR_3348 :重命名 STR_3349 :刪除 -STR_3350 :Track design name -STR_3351 :Enter new name for this track design: -STR_3352 :Can't rename track design... -STR_3353 :New name contains invalid characters -STR_3354 :Another file exists with this name, or file is write-protected -STR_3355 :File is write-protected or locked -STR_3356 :Delete File -STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ? -STR_3358 :Can't delete track design... -STR_3359 :{BLACK}No track designs of this type +STR_3350 :軌道設計名稱 +STR_3351 :請輸入這個軌道設計的新名稱: +STR_3352 :不能重命名這個軌道設計... +STR_3353 :新名稱含有不適合的字符 +STR_3354 :已有另外一個檔案為相同名稱, 或檔案被寫入保護 +STR_3355 :檔案被寫入保護或被鎖定 +STR_3356 :刪除檔案 +STR_3357 :{WINDOW_COLOUR_2}你確定要永久刪除{STRINGID} ? +STR_3358 :不能刪除軌道設計... +STR_3359 :{BLACK}這類遊樂設施沒有已設計好的軌道設計 STR_3360 :警告! -STR_3361 :Too many track designs of this type - Some will not be listed. +STR_3361 :這種遊樂設施擁有太多軌道設計 - 將不會列出某些軌道設計. STR_3362 :Forced Software Buffer Mixing STR_3363 :{SMALLFONT}{BLACK}Select this option to improve performance if the game pauses slightly when sounds start or interference is heard STR_3364 :Advanced STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups -STR_3366 :{BLACK}= Ride -STR_3367 :{BLACK}= Food Stall -STR_3368 :{BLACK}= Drink Stall -STR_3369 :{BLACK}= Souvenir Stall -STR_3370 :{BLACK}= Info. Kiosk -STR_3371 :{BLACK}= First Aid -STR_3372 :{BLACK}= Cash Machine -STR_3373 :{BLACK}= Toilet +STR_3366 :{BLACK}= 遊樂設施 +STR_3367 :{BLACK}= 食物店鋪 +STR_3368 :{BLACK}= 飲料店鋪 +STR_3369 :{BLACK}= 記念品店鋪 +STR_3370 :{BLACK}= 訪客資訊中心 +STR_3371 :{BLACK}= 急救室 +STR_3372 :{BLACK}= 提款機 +STR_3373 :{BLACK}= 廁所 STR_3374 :警告: 選取了太多物件! -STR_3375 :Not all objects in this scenery group could be selected -STR_3376 :Install new track design... -STR_3377 :{SMALLFONT}{BLACK}Install a new track design file +STR_3375 :不是在此景觀組別中的所有物件都能夠選取 +STR_3376 :安裝新的軌道設計... +STR_3377 :{SMALLFONT}{BLACK}安裝新的軌道設計檔案 STR_3378 :安裝 STR_3379 :取消 -STR_3380 :Unable to install this track design... -STR_3381 :File is not compatible or contains invalid data -STR_3382 :File copy failed -STR_3383 :Select new name for track design -STR_3384 :An existing track design already has this name - Please select a new name for this design: +STR_3380 :無法安裝這個軌道設計 +STR_3381 :不兼容的檔案或含有非法資料 +STR_3382 :複製檔案失敗 +STR_3383 :輸入這個軌道設計的新名稱 +STR_3384 :已有相同名稱的軌道設計 - 請輸入這個軌道設計的新名稱: STR_3385 :新手入門教學 STR_3386 :自訂遊樂設施教學 STR_3387 :雲霄飛車建造教學 -STR_3388 :Unable to switch to selected mode -STR_3389 :Unable to select additional item of scenery... +STR_3388 :無法切換至已選擇的模式 +STR_3389 :無法選擇額外的景觀物件... STR_3390 :選取了太多物件 STR_3391 :{SMALLFONT}{BLACK}這個就是我們的樂園 - 先瞧瞧周邊的環境吧... STR_3392 :{SMALLFONT}{BLACK}最簡單的方法就是按住滑鼠右鍵, 然後拖曳來移動檢視範圍... @@ -3456,8 +3456,8 @@ STR_3445 :設置巡邏區域 STR_3446 :取得巡邏區域 # New strings, cleaner -STR_5120 :Show finances button on toolbar -STR_5121 :Show research button on toolbar +STR_5120 :財政 +STR_5121 :研發 STR_5122 :(像RCT1一樣)以軌道類型選擇遊樂設施 STR_5123 :翻新遊樂設施 STR_5124 :去除"六旗"標誌 @@ -3483,7 +3483,7 @@ STR_5143 :快速速度 STR_5144 :加快速度 STR_5145 :更快速度 STR_5146 :超快速度 -STR_5147 :在工具列顯示"密技"按鈕 +STR_5147 :密技 STR_5148 :{SMALLFONT}{BLACK}改變遊戲速度 STR_5149 :{SMALLFONT}{BLACK}開啟密技視窗 STR_5150 :啟用除錯工具 @@ -3556,8 +3556,8 @@ STR_5216 :軌道設計管理工具列表 STR_5217 :密技 STR_5218 :主題 STR_5219 :選項 -STR_5220 :鍵盤快鍵盤 -STR_5221 :Change Keyboard Shortcut +STR_5220 :鍵盤快捷鍵 +STR_5221 :更改鍵盤快捷鍵 STR_5222 :載入/儲存 STR_5223 :Save Prompt STR_5224 :Demolish Ride Prompt @@ -3679,7 +3679,7 @@ STR_5339 :Base height STR_5340 :Clearance height STR_5341 :Flags STR_5342 :Choose a map tile -STR_5343 :Automatically place staff +STR_5343 :自動放置員工 STR_5344 :更新日誌 STR_5345 :用於財政的密技 STR_5346 :用於遊客的密技 @@ -3804,10 +3804,18 @@ STR_5464 :一般 STR_5465 :氣候 STR_5466 :員工 STR_5467 :ALT + -STR_5468 :在工具列顯示"最近消息"的按鈕 +STR_5468 :最近消息 STR_5469 :Scroll map up STR_5470 :Scroll map left STR_5471 :Scroll map down STR_5472 :Scroll map right STR_5473 :日與夜循環 STR_5474 :Display text on banners in upper case +STR_5475 :{COMMA16}週 +STR_5476 :硬件 +STR_5477 :地圖顯示 +STR_5478 :控制 +STR_5479 :工具列 +STR_5480 :顯示工具列按鈕: +STR_5481 :主題 +STR_5482 :{WINDOW_COLOUR_2}上次檢查時間: {BLACK} 1分鐘前 diff --git a/data/language/dutch.txt b/data/language/dutch.txt index f4f2c97668..baed8ea4ae 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -2318,10 +2318,10 @@ STR_2313 :{WINDOW_COLOUR_2}Misselijkheidswaarde: {BLACK}{COMMA2DP32} (ongevee STR_2314 :{WINDOW_COLOUR_2}Lengte: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}Kosten: {BLACK}ongeveer {CURRENCY} STR_2316 :{WINDOW_COLOUR_2}Vereiste ruimte: {BLACK}{COMMA16} x {COMMA16} blokken -STR_2317 :{WINDOW_COLOUR_2}Geluidskwaliteit: -STR_2318 :Laag -STR_2319 :Gemiddeld -STR_2320 :Hoog +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : STR_2321 :{WINDOW_COLOUR_2}Aantal attracties: {BLACK}{COMMA16} STR_2322 :{WINDOW_COLOUR_2}Werknemers: {BLACK}{COMMA16} STR_2323 :{WINDOW_COLOUR_2}Parkgrootte: {BLACK}{COMMA32}m{SQUARED} @@ -2438,11 +2438,11 @@ STR_2433 :{BLACK}Bonnen voor gratis {STRINGID} STR_2434 :{BLACK}Advertentiecampagne voor {STRINGID} STR_2435 :{BLACK}Advertentiecampagne voor {STRINGID} STR_2436 :1 week -STR_2437 :2 weken -STR_2438 :3 weken -STR_2439 :4 weken -STR_2440 :5 weken -STR_2441 :6 weken +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : STR_2442 :{BLACK}({STRINGID} resterend) STR_2443 :{WINDOW_COLOUR_2}Kosten per week: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Totale kosten: {BLACK}{CURRENCY2DP} @@ -2970,8 +2970,8 @@ STR_2965 :{WINDOW_COLOUR_2} STR_2966 : STR_2967 : STR_2968 : -STR_2969 :Het gebruik van dit product is onderhevig aan de bepalingen in de gebruikersovereenkomst -STR_2970 :die te raadplegen is in de {OPENQUOTES}ReadMe{ENDQUOTES} of de handleiding. +STR_2969 : +STR_2970 : STR_2971 :Standaard kleurenschema STR_2972 :Alternatief kleurenschema 1 STR_2973 :Alternatief kleurenschema 2 @@ -3363,8 +3363,8 @@ STR_3358 :Kan het baanontwerp niet verwijderen... STR_3359 :{BLACK}Geen baanontwerpen van dit type STR_3360 :Waarschuwing! STR_3361 :Te veel baanontwerpen van dit type; sommige staan niet in de lijst -STR_3362 :Mixen via softwarebuffer forceren -STR_3363 :{SMALLFONT}{BLACK}Selecteer deze optie om de prestaties te verbeteren als het spel vertraagt bij het afspelen van geluiden of als er ruis hoorbaar is +STR_3362 : +STR_3363 : STR_3364 :Meer opties STR_3365 :{SMALLFONT}{BLACK}Maakt naast selectie van decorgroepen ook selectie van losse items mogelijk STR_3366 :{BLACK}= Attractie @@ -3807,9 +3807,11 @@ STR_5471 :Kaart naar beneden scrollen STR_5472 :Kaart naar rechts scrollen STR_5473 :Dag-nachtcyclus STR_5474 :Teksten op lichtkranten in hoofdletters tonen +STR_5475 :{COMMA16} weken STR_5476 :Hardware STR_5477 :Kaartrendering STR_5478 :Bediening STR_5479 :Werkbalk STR_5480 :Knoppen in de werkbalk tonen voor: STR_5481 :Thema's +STR_5482 :{WINDOW_COLOUR_2}Tijd sinds laatste inspectie: {BLACK}1 minuut diff --git a/data/language/german.txt b/data/language/german.txt index 762e5ee5f4..942259e496 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -2318,10 +2318,10 @@ STR_2313 :{WINDOW_COLOUR_2}Übelkeitswert: {BLACK}{COMMA2DP32} (ungefähr) STR_2314 :{WINDOW_COLOUR_2}Fahrtlänge: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}Kosten: {BLACK}ungefähr {CURRENCY} STR_2316 :{WINDOW_COLOUR_2}Erforderlicher Platz: {BLACK}{COMMA16} x {COMMA16} Blöcke -STR_2317 :{WINDOW_COLOUR_2}Soundqualität: -STR_2318 :Niedrig -STR_2319 :Mittel -STR_2320 :Hoch +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : STR_2321 :{WINDOW_COLOUR_2}Anzahl der Attraktionen: {BLACK}{COMMA16} STR_2322 :{WINDOW_COLOUR_2}Personal: {BLACK}{COMMA16} STR_2323 :{WINDOW_COLOUR_2}Parkgröße: {BLACK}{COMMA32}m{SQUARED} @@ -2443,7 +2443,7 @@ STR_2438 : STR_2439 : STR_2440 : STR_2441 : -STR_2442 :{BLACK}({STRINGID} übrig) +STR_2442 : STR_2443 :{WINDOW_COLOUR_2}Kosten pro Woche: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Gesamtkosten: {BLACK}{CURRENCY2DP} STR_2445 :Diese Marketingkampagne starten @@ -3367,8 +3367,8 @@ STR_3358 :Streckenentwurf kann nicht gelöscht werden... STR_3359 :{BLACK}Keine Streckenentwürfe dieser Art STR_3360 :Warnung! STR_3361 :Zu viele Streckenentwürfe dieser Art - einige werden nicht aufgeführt. -STR_3362 :Erzwungenes Software-Buffer-Mixing -STR_3363 :{SMALLFONT}{BLACK}Diese Option wählen, falls das Spiel jedesmal kurz anhält sobald Töne gespielt werden oder falls ein Rauschen zu hören ist. +STR_3362 : +STR_3363 : STR_3364 :Fortgeschritten STR_3365 :{SMALLFONT}{BLACK}Ermöglichen Sie die Auswahl einzelner Szenerieobjekte zusätzlich zu Szeneriegruppen STR_3366 :{BLACK}= Bahn @@ -3816,3 +3816,5 @@ STR_5479 :Symbolleiste STR_5480 :Schaltflächen anzeigen für: STR_5481 :Themen STR_5482 :{WINDOW_COLOUR_2}Letzte Inspektion vor: {BLACK}1 Minute +STR_5483 :{BLACK}({COMMA16} Wochen verbleibend) +STR_5484 :{BLACK}({COMMA16} Woche verbleibend) From 9976b9673a1a1bdcb2848e15297c4fcad87b8ce8 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 28 Jul 2015 10:13:16 +0200 Subject: [PATCH 0379/1173] Remove rest of Six Flags branding. --- data/language/english_uk.txt | 2 +- src/localisation/string_ids.h | 1 - src/sprites.h | 1 - src/windows/editor_objective_options.c | 23 ++--------------------- src/windows/install_track.c | 7 +------ src/world/park.h | 2 +- 6 files changed, 5 insertions(+), 31 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 26ffe96b3b..cf8efe8e80 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3344,7 +3344,7 @@ STR_3333 :Export plug-in objects with saved games STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles STR_3336 :Track Designs Manager - Select Ride Type -STR_3337 :Six Flags Park +STR_3337 : STR_3338 :{BLACK}Custom-designed layout STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 050676970e..11b72cdccf 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1632,7 +1632,6 @@ enum { STR_SAVE_PLUGIN_DATA_TIP = 3334, STR_ROLLER_COASTER_DESIGNER_SELECT_RIDE_TYPES_VEHICLES = 3335, STR_TRACK_DESIGNS_MANAGER_SELECT_RIDE_TYPE = 3336, - STR_SIX_FLAGS_PARK = 3337, STR_GAME_TOOLS = 3341, STR_SCENARIO_EDITOR = 3342, diff --git a/src/sprites.h b/src/sprites.h index f0935e0748..67c8d71a4f 100644 --- a/src/sprites.h +++ b/src/sprites.h @@ -339,7 +339,6 @@ enum { SPR_INTRO_LOGO_11 = SPR_INTRO_LOGO_00 + 4, SPR_INTRO_LOGO_21 = SPR_INTRO_LOGO_00 + 5, - SPR_SIX_FLAGS = 23225, SPR_INTRO_INFOGRAMES_00 = 23226, SPR_INTRO_INFOGRAMES_10 = SPR_INTRO_INFOGRAMES_00 + 1, SPR_INTRO_INFOGRAMES_01 = SPR_INTRO_INFOGRAMES_00 + 2, diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index 8a6b489875..df340dcbf0 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -30,8 +30,6 @@ #include "error.h" #include "../interface/themes.h" -#define DISABLE_SIX_FLAGS_CHECKBOX - #pragma region Widgets enum { @@ -63,7 +61,6 @@ enum { WIDX_CATEGORY, WIDX_CATEGORY_DROPDOWN, WIDX_DETAILS, - WIDX_SIX_FLAGS, WIDX_RIDES = 6 }; @@ -90,7 +87,6 @@ static rct_widget window_editor_objective_options_main_widgets[] = { { WWT_DROPDOWN, 1, 98, 277, 150, 161, STR_NONE, STR_SELECT_WHICH_GROUP_THIS_SCENARIO_APPEARS_IN }, { WWT_DROPDOWN_BUTTON, 1, 266, 276, 151, 160, STR_DROPDOWN_GLYPH, STR_SELECT_WHICH_GROUP_THIS_SCENARIO_APPEARS_IN }, { WWT_DROPDOWN_BUTTON, 1, 370, 444, 167, 178, STR_CHANGE, STR_CHANGE_DETAIL_NOTES_ABOUT_PARK_SCENARIO_TIP }, - { WWT_CHECKBOX, 1, 8, 441, 215, 226, STR_SIX_FLAGS_PARK, STR_NONE }, { WIDGETS_END } }; @@ -222,8 +218,7 @@ static uint64 window_editor_objective_options_page_enabled_widgets[] = { (1 << WIDX_SCENARIO_NAME) | (1 << WIDX_CATEGORY) | (1 << WIDX_CATEGORY_DROPDOWN) | - (1 << WIDX_DETAILS) | - (1 << WIDX_SIX_FLAGS), + (1 << WIDX_DETAILS), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | @@ -417,10 +412,6 @@ static void window_editor_objective_options_main_mouseup(rct_window *w, int widg strcpy((char*)0x009BC677, s6Info->details); window_text_input_open(w, WIDX_DETAILS, 3315, 3316, 3165, 0, 256); break; - case WIDX_SIX_FLAGS: - RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) ^= PARK_FLAGS_SIX_FLAGS; - window_invalidate(w); - break; } } @@ -826,16 +817,6 @@ static void window_editor_objective_options_main_invalidate(rct_window *w) window_editor_objective_options_set_pressed_tab(w); - // This options was only available in development version -#ifdef DISABLE_SIX_FLAGS_CHECKBOX - window_editor_objective_options_main_widgets[WIDX_SIX_FLAGS].type = WWT_EMPTY; -#endif - - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SIX_FLAGS) - w->pressed_widgets |= (1 << WIDX_SIX_FLAGS); - else - w->pressed_widgets &= ~(1 << WIDX_SIX_FLAGS); - if (stex == NULL) w->disabled_widgets &= ~(WIDX_PARK_NAME | WIDX_SCENARIO_NAME); else @@ -1249,4 +1230,4 @@ static void window_editor_objective_options_update_disabled_widgets(rct_window * } else { w->disabled_widgets |= (1 << WIDX_TAB_2); } -} \ No newline at end of file +} diff --git a/src/windows/install_track.c b/src/windows/install_track.c index 6a8a25517c..70615409f6 100644 --- a/src/windows/install_track.c +++ b/src/windows/install_track.c @@ -346,11 +346,6 @@ static void window_install_track_paint(rct_window *w, rct_drawpixelinfo *dpi) y = w->y + widget->bottom + 2; // 0x006D3CF1 -- 0x006d3d71 missing - if (track_td6->var_6C & 0x80000000) { - // Six flags logo - gfx_draw_sprite(dpi, SPR_SIX_FLAGS, w->x + widget->right - 50, y + 4, 0); - } - // Stats rating = track_td6->excitement * 10; gfx_draw_string_left(dpi, STR_TRACK_LIST_EXCITEMENT_RATING, &rating, 0, x, y); @@ -472,4 +467,4 @@ static void window_install_track_text_input(rct_window *w, int widgetIndex, char strcpy(track_dest_name, text); window_event_mouse_up_call(w, WIDX_INSTALL); } -} \ No newline at end of file +} diff --git a/src/world/park.h b/src/world/park.h index 9be1c31621..2c66a3321a 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -43,7 +43,7 @@ enum { PARK_FLAGS_DIFFICULT_PARK_RATING = (1 << 14), PARK_FLAGS_NO_MONEY_SCENARIO = (1 << 17), // equivalent to PARK_FLAGS_NO_MONEY, but used in scenario editor PARK_FLAGS_18 = (1 << 18), - PARK_FLAGS_SIX_FLAGS = (1 << 19) + PARK_FLAGS_SIX_FLAGS_DEPRECATED = (1 << 19) }; extern uint8 *gParkRatingHistory; From 88f4185b3b64744b2f5aa6a7ca079620d9233b21 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 28 Jul 2015 19:17:25 +0200 Subject: [PATCH 0380/1173] Allow setting 'Guests at given date' in increments of 50, with a minimum of 250 --- src/windows/editor_objective_options.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index df340dcbf0..f9524e77f9 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -590,7 +590,7 @@ static void window_editor_objective_options_arg_1_increase(rct_window *w) if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS, uint16) >= 5000) { window_error_open(3264, STR_NONE); } else { - RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS, uint16) += 100; + RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS, uint16) += 50; window_invalidate(w); } break; @@ -635,10 +635,10 @@ static void window_editor_objective_options_arg_1_decrease(rct_window *w) } break; default: - if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS, uint16) <= 500) { + if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS, uint16) <= 250) { window_error_open(3265, STR_NONE); } else { - RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS, uint16) -= 100; + RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS, uint16) -= 50; window_invalidate(w); } break; From 481e286dd9a6f7d264510c05fe70511b55da49ee Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 25 Jul 2015 12:49:58 +0100 Subject: [PATCH 0381/1173] Implemented start of guest_path_finding --- src/peep/peep.c | 142 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 141 insertions(+), 1 deletion(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index f7347f55c2..33bc5dad3e 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -6641,13 +6641,153 @@ static int guest_surface_path_finding(rct_peep* peep){ return peep_move_one_tile(randDirection, peep); } +rct_map_element* get_banner_on_path(rct_map_element *path_element){ + // This is an improved version of original. + // That only checked for one fence in the way. + if (map_element_is_last_for_tile(path_element)) + return NULL; + + rct_map_element *bannerElement = path_element + 1; + do { + // Path on top, so no banners + if (map_element_get_type(bannerElement) == MAP_ELEMENT_TYPE_PATH) + return NULL; + // Found a banner + if (map_element_get_type(bannerElement) == MAP_ELEMENT_TYPE_BANNER) + return bannerElement; + // Last element so there cant be any other banners + if (map_element_is_last_for_tile(bannerElement)) + return NULL; + + } while (bannerElement++); + + return NULL; +} + +/* rct2: 0x00694BAE */ +static uint8 sub_694BAE(sint16 x, sint16 y, sint16 z, rct_map_element *map_element, uint8 chosen_direction){ + uint32 eax, ebx, ecx, edx, esi, edi, ebp; + eax = x; + ecx = y; + edx = z; + edi = (int)map_element; + ebp = chosen_direction; + RCT2_CALLFUNC_X(0x00694BAE, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + return eax & 0xFF; +} + +/* rct2: 0x006949A4 */ +static uint8 sub_6949A4(sint16 x, sint16 y, sint16 z, rct_map_element *map_element, uint8 chosen_direction){ + uint32 eax, ebx, ecx, edx, esi, edi, ebp; + eax = x; + ecx = y; + edx = z; + edi = (int)map_element; + ebp = chosen_direction; + RCT2_CALLFUNC_X(0x006949A4, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + return eax & 0xFF; +} + /* rct2: 0x00694C35 */ static int guest_path_finding(rct_peep* peep){ sint16 x, y, z; if (peep->next_var_29 & 0x18){ return guest_surface_path_finding(peep); } - //694DA8 + + + x = peep->next_x; + y = peep->next_y; + z = peep->next_z; + + bool found = false; + rct_map_element *mapElement = map_get_first_element_at(x / 32, y / 32); + do{ + if (z != mapElement->base_height) + continue; + + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + + found = true; + break; + } while (!map_element_is_last_for_tile(mapElement++)); + + if (!found){ + return 1; + } + + uint8 edges = mapElement->properties.path.edges; + rct_map_element *bannerElement = get_banner_on_path(mapElement); + if (bannerElement != NULL){ + do{ + edges &= bannerElement->properties.banner.flags; + } while ((bannerElement = get_banner_on_path(bannerElement)) != NULL); + } + edges &= 0xF; + + if (peep->var_2A == 0 && + (peep->guest_heading_to_ride_id == 0xFF || + peep->flags & PEEP_FLAGS_LEAVING_PARK)){ + + uint8 adjustedEdges = edges; + uint8 chosenDirection = 0; + for (; chosenDirection < 4; ++chosenDirection){ + // If there is no path in that direction try another + if (!(adjustedEdges & (1 << chosenDirection))) + continue; + + if (sub_694BAE(peep->next_x, peep->next_y, peep->next_z, mapElement, chosenDirection) == 6){ + adjustedEdges &= ~(1 << chosenDirection); + } + } + if (adjustedEdges != 0) + edges = adjustedEdges; + } + + if (edges == 0) + return guest_surface_path_finding(peep); + + uint8 direction = peep->var_78 ^ (1 << 1); + if (!(edges & ~(1 << direction))){ + peep_check_if_lost(peep); + peep_check_cant_find_ride(peep); + peep_check_cant_find_exit(peep); + } + else{ + edges &= ~(1 << direction); + } + + direction = bitscanforward(edges); + // IF only one edge to choose from + if ((edges & ~(1 << direction)) == 0){ + return peep_move_one_tile(direction, peep); + } + + //694F19 + if (peep->var_2A == 0){ + if (!peep_has_food(peep) && + (scenario_rand()&0xFFFF) >= 2184){ + + uint8 adjustedEdges = edges; + uint8 chosenDirection = 0; + for (; chosenDirection < 4; ++chosenDirection){ + // If there is no path in that direction try another + if (!(adjustedEdges & (1 << chosenDirection))) + continue; + + uint8 al = sub_6949A4(peep->next_x, peep->next_y, peep->next_z, mapElement, chosenDirection); + if (al == 6 || al <= 1){ + adjustedEdges &= ~(1 << chosenDirection); + } + } + if (adjustedEdges != 0) + edges = adjustedEdges; + } + //694f7f + } + //6952AB + } /** From 065b9bedbddb4858a3b7b45d0d4c78207bd88589 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 25 Jul 2015 18:05:29 +0100 Subject: [PATCH 0382/1173] implement sub_694BAE --- src/peep/peep.c | 49 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 33bc5dad3e..8763c80a15 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -6664,16 +6664,45 @@ rct_map_element* get_banner_on_path(rct_map_element *path_element){ return NULL; } -/* rct2: 0x00694BAE */ -static uint8 sub_694BAE(sint16 x, sint16 y, sint16 z, rct_map_element *map_element, uint8 chosen_direction){ - uint32 eax, ebx, ecx, edx, esi, edi, ebp; - eax = x; - ecx = y; - edx = z; - edi = (int)map_element; - ebp = chosen_direction; - RCT2_CALLFUNC_X(0x00694BAE, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - return eax & 0xFF; +/** + * + * rct2: 0x00694BAE + */ +static uint8 sub_694BAE(sint16 x, sint16 y, sint16 z, rct_map_element *mapElement, uint8 chosenDirection) +{ + rct_map_element *nextMapElement; + + if (footpath_element_is_sloped(mapElement)) { + if (footpath_element_get_slope_direction(mapElement) == chosenDirection) { + z += 2; + } + } + + x += TileDirectionDelta[chosenDirection].x; + y += TileDirectionDelta[chosenDirection].y; + nextMapElement = map_get_first_element_at(x, y); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) continue; + + if (footpath_element_is_sloped(nextMapElement)) { + int slopeDirection = footpath_element_get_slope_direction(nextMapElement); + if (slopeDirection == chosenDirection) { + if (z != nextMapElement->base_height) continue; + } else { + slopeDirection ^= 2; + if (slopeDirection != chosenDirection) continue; + if (z != nextMapElement->base_height + 2) continue; + } + } else { + if (z != nextMapElement->base_height) continue; + } + + if (!(nextMapElement->type & 2)) return 6; + + return 0; + } while (!map_element_is_last_for_tile(nextMapElement++)); + + return 0; } /* rct2: 0x006949A4 */ From 3a07af140b49b64b44bbfe064d4dbcf50bf8e113 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 25 Jul 2015 19:24:21 +0100 Subject: [PATCH 0383/1173] Implement more peep path finding --- src/interface/viewport_interaction.c | 2 +- src/peep/peep.c | 605 ++++++++++++++++++++++++--- src/peep/peep.h | 2 +- src/windows/guest_list.c | 2 +- src/world/map.c | 2 +- 5 files changed, 542 insertions(+), 71 deletions(-) diff --git a/src/interface/viewport_interaction.c b/src/interface/viewport_interaction.c index 9cf87e2a6a..b3c7897a56 100644 --- a/src/interface/viewport_interaction.c +++ b/src/interface/viewport_interaction.c @@ -573,7 +573,7 @@ static rct_peep *viewport_interaction_get_closest_peep(int x, int y, int maxDist void sub_68A15E(int screenX, int screenY, short *x, short *y, int *direction, rct_map_element **mapElement) { sint16 my_x, my_y; - int z, interactionType; + int z = 0, interactionType; rct_map_element *myMapElement; rct_viewport *viewport; get_map_coordinates_from_pos(screenX, screenY, VIEWPORT_INTERACTION_MASK_TERRAIN & VIEWPORT_INTERACTION_MASK_WATER, &my_x, &my_y, &interactionType, &myMapElement, &viewport); diff --git a/src/peep/peep.c b/src/peep/peep.c index 8763c80a15..81145307b8 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -267,7 +267,7 @@ static void peep_leave_park(rct_peep* peep){ else{ peep->var_C6 = 254; peep->flags |= PEEP_FLAGS_LEAVING_PARK; - peep->flags &= ~PEEP_FLAGS_20; + peep->flags &= ~PEEP_FLAGS_PARK_ENTRANCE_CHOSEN; } peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_GO_HOME, 0xFF); @@ -1809,8 +1809,8 @@ void peep_update_ride_sub_state_1(rct_peep* peep){ x *= 32; y *= 32; - x += RCT2_ADDRESS(0x993CCC, sint16)[direction_entrance * 2]; - y += RCT2_ADDRESS(0x993CCE, sint16)[direction_entrance * 2]; + x += TileDirectionDelta[direction_entrance].x; + y += TileDirectionDelta[direction_entrance].y; uint8 direction = direction_entrance * 4 + 11; if (scenario_rand() & 0x40){ @@ -2957,8 +2957,8 @@ static void peep_update_ride_sub_state_17(rct_peep* peep){ chosen_edge = (chosen_edge + 1) & 3; } - x = RCT2_ADDRESS(0x993CCC, sint16)[chosen_edge * 2] / 2; - y = RCT2_ADDRESS(0x993CCE, sint16)[chosen_edge * 2] / 2; + x = TileDirectionDelta[chosen_edge].x / 2; + y = TileDirectionDelta[chosen_edge].y / 2; x += peep->destination_x; y += peep->destination_y; @@ -3429,8 +3429,8 @@ static void peep_update_watering(rct_peep* peep){ return; } - int x = peep->next_x + RCT2_ADDRESS(0x993CCC, sint16)[peep->var_37 * 2]; - int y = peep->next_y + RCT2_ADDRESS(0x993CCE, sint16)[peep->var_37 * 2]; + int x = peep->next_x + TileDirectionDelta[peep->var_37].x; + int y = peep->next_y + TileDirectionDelta[peep->var_37].y; rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); @@ -4387,8 +4387,8 @@ static int peep_update_patrolling_find_watering(rct_peep* peep){ for (int i = 0; i < 8; ++i, ++chosen_position){ chosen_position &= 7; - int x = peep->next_x + RCT2_ADDRESS(0x00993CCC, sint16)[chosen_position * 2]; - int y = peep->next_y + RCT2_ADDRESS(0x00993CCE, sint16)[chosen_position * 2]; + int x = peep->next_x + TileDirectionDelta[chosen_position].x; + int y = peep->next_y + TileDirectionDelta[chosen_position].y; rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); @@ -6126,8 +6126,8 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m return peep_return_to_center_of_tile(peep); } - peep->destination_x += RCT2_ADDRESS(0x00993CCC, sint16)[peep->var_78 * 2]; - peep->destination_y += RCT2_ADDRESS(0x00993CCE, sint16)[peep->var_78 * 2]; + peep->destination_x += TileDirectionDelta[peep->var_78].x; + peep->destination_y += TileDirectionDelta[peep->var_78].y; peep->destination_tolerence = 9; invalidate_sprite((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); @@ -6170,8 +6170,8 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m sint16 z = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Z, sint16)[entranceIndex] / 8; entranceDirection = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_DIRECTION, uint8)[entranceIndex]; - sint16 next_x = (x & 0xFFE0) + RCT2_ADDRESS(0x00993CCC, sint16)[entranceDirection * 2]; - sint16 next_y = (y & 0xFFE0) + RCT2_ADDRESS(0x00993CCE, sint16)[entranceDirection * 2]; + sint16 next_x = (x & 0xFFE0) + TileDirectionDelta[entranceDirection].x; + sint16 next_y = (y & 0xFFE0) + TileDirectionDelta[entranceDirection].y; uint8 found = 0; rct_map_element* nextMapElement = map_get_first_element_at(next_x / 32, next_y / 32); @@ -6249,8 +6249,8 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m window_invalidate_by_number(WC_PARK_INFORMATION, 0); peep->var_37 = 1; - peep->destination_x += RCT2_ADDRESS(0x00993CCC, sint16)[peep->var_78 * 2]; - peep->destination_y += RCT2_ADDRESS(0x00993CCE, sint16)[peep->var_78 * 2]; + peep->destination_x += TileDirectionDelta[peep->var_78].x; + peep->destination_y += TileDirectionDelta[peep->var_78].y; peep->destination_tolerence = 7; invalidate_sprite((rct_sprite*)peep); @@ -6560,8 +6560,8 @@ static int peep_interact_with_shop(rct_peep* peep, sint16 x, sint16 y, rct_map_e static int peep_move_one_tile(uint8 direction, rct_peep* peep){ sint16 x = peep->next_x; sint16 y = peep->next_y; - x += RCT2_ADDRESS(0x00993CC, sint16)[direction * 2]; - y += RCT2_ADDRESS(0x00993CE, sint16)[direction * 2]; + x += TileDirectionDelta[direction].x; + y += TileDirectionDelta[direction].y; if (x >= 8192 || y >= 8192){ // This could loop! @@ -6586,8 +6586,8 @@ static int guest_surface_path_finding(rct_peep* peep){ uint8 randDirection = scenario_rand() & 3; if (!fence_in_the_way(x, y, z, z + 4, randDirection)){ - x += RCT2_ADDRESS(0x00993CC, sint16)[randDirection * 2]; - y += RCT2_ADDRESS(0x00993CE, sint16)[randDirection * 2]; + x += TileDirectionDelta[randDirection].x; + y += TileDirectionDelta[randDirection].y; randDirection ^= (1 << 1); if (!fence_in_the_way(x, y, z, z + 4, randDirection)){ @@ -6606,8 +6606,8 @@ static int guest_surface_path_finding(rct_peep* peep){ randDirection &= 3; if (!fence_in_the_way(x, y, z, z + 4, randDirection)){ - x += RCT2_ADDRESS(0x00993CC, sint16)[randDirection * 2]; - y += RCT2_ADDRESS(0x00993CE, sint16)[randDirection * 2]; + x += TileDirectionDelta[randDirection].x; + y += TileDirectionDelta[randDirection].y; randDirection ^= (1 << 1); if (!fence_in_the_way(x, y, z, z + 4, randDirection)){ @@ -6622,8 +6622,8 @@ static int guest_surface_path_finding(rct_peep* peep){ randDirection &= 3; if (!fence_in_the_way(x, y, z, z + 4, randDirection)){ - x += RCT2_ADDRESS(0x00993CC, sint16)[randDirection * 2]; - y += RCT2_ADDRESS(0x00993CE, sint16)[randDirection * 2]; + x += TileDirectionDelta[randDirection].x; + y += TileDirectionDelta[randDirection].y; randDirection ^= (1 << 1); if (!fence_in_the_way(x, y, z, z + 4, randDirection)){ @@ -6664,6 +6664,23 @@ rct_map_element* get_banner_on_path(rct_map_element *path_element){ return NULL; } +static bool is_valid_path_z_and_direction(rct_map_element *mapElement, int currentZ, int currentDirection) +{ + if (footpath_element_is_sloped(mapElement)) { + int slopeDirection = footpath_element_get_slope_direction(mapElement); + if (slopeDirection == currentDirection) { + if (currentZ != mapElement->base_height) return false; + } else { + slopeDirection ^= 2; + if (slopeDirection != currentDirection) return false; + if (currentZ != mapElement->base_height + 2) return false; + } + } else { + if (currentZ != mapElement->base_height) return false; + } + return true; +} + /** * * rct2: 0x00694BAE @@ -6680,24 +6697,12 @@ static uint8 sub_694BAE(sint16 x, sint16 y, sint16 z, rct_map_element *mapElemen x += TileDirectionDelta[chosenDirection].x; y += TileDirectionDelta[chosenDirection].y; - nextMapElement = map_get_first_element_at(x, y); + nextMapElement = map_get_first_element_at(x / 32, y / 32); do { - if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) continue; - - if (footpath_element_is_sloped(nextMapElement)) { - int slopeDirection = footpath_element_get_slope_direction(nextMapElement); - if (slopeDirection == chosenDirection) { - if (z != nextMapElement->base_height) continue; - } else { - slopeDirection ^= 2; - if (slopeDirection != chosenDirection) continue; - if (z != nextMapElement->base_height + 2) continue; - } - } else { - if (z != nextMapElement->base_height) continue; - } + if (map_element_get_type(nextMapElement) != MAP_ELEMENT_TYPE_PATH) continue; + if (!is_valid_path_z_and_direction(nextMapElement, z, chosenDirection)) continue; - if (!(nextMapElement->type & 2)) return 6; + if (nextMapElement->type & 2) return 6; return 0; } while (!map_element_is_last_for_tile(nextMapElement++)); @@ -6705,16 +6710,368 @@ static uint8 sub_694BAE(sint16 x, sint16 y, sint16 z, rct_map_element *mapElemen return 0; } -/* rct2: 0x006949A4 */ -static uint8 sub_6949A4(sint16 x, sint16 y, sint16 z, rct_map_element *map_element, uint8 chosen_direction){ - uint32 eax, ebx, ecx, edx, esi, edi, ebp; - eax = x; - ecx = y; - edx = z; - edi = (int)map_element; - ebp = chosen_direction; - RCT2_CALLFUNC_X(0x006949A4, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - return eax & 0xFF; +/** + * + * rct2: 0x006949B9 + */ +static uint8 loc_6949B9( + sint16 x, sint16 y, sint16 z, rct_map_element *inputMapElement, uint8 chosenDirection, uint8 *outRideIndex, + int level +) { + rct_map_element *mapElement; + int direction; + + if (level > 25) return 5; + + x += TileDirectionDelta[chosenDirection].x; + y += TileDirectionDelta[chosenDirection].y; + mapElement = map_get_first_element_at(x / 32, y / 32); + do { + if (mapElement->flags & MAP_ELEMENT_FLAG_GHOST) continue; + + switch (map_element_get_type(mapElement)) { + case MAP_ELEMENT_TYPE_TRACK: + if (z != mapElement->base_height) continue; + int rideIndex = inputMapElement->properties.path.ride_index; + rct_ride *ride = GET_RIDE(rideIndex); + if (RCT2_GLOBAL(0x0097CF40 + (ride->type * 8), uint32) & 0x20000) { + *outRideIndex = rideIndex; + return 2; + } + break; + case MAP_ELEMENT_TYPE_ENTRANCE: + if (z != mapElement->base_height) continue; + switch (mapElement->properties.entrance.type) { + case ENTRANCE_TYPE_RIDE_ENTRANCE: + direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; + if (direction == chosenDirection) { + *outRideIndex = mapElement->properties.entrance.ride_index; + return 2; + } + break; + case ENTRANCE_TYPE_RIDE_EXIT: + direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; + if (direction == chosenDirection) { + *outRideIndex = mapElement->properties.entrance.ride_index; + return 1; + } + break; + case ENTRANCE_TYPE_PARK_ENTRANCE: + return 4; + } + break; + case MAP_ELEMENT_TYPE_PATH: + if (!is_valid_path_z_and_direction(mapElement, z, chosenDirection)) continue; + if (!(mapElement->type & 2)) return 6; + + uint8 edges = mapElement->properties.path.edges; + rct_map_element *bannerElement = get_banner_on_path(mapElement); + if (bannerElement != NULL) { + do { + edges &= bannerElement->properties.banner.flags; + } while ((bannerElement = get_banner_on_path(bannerElement)) != NULL); + } + edges &= 0x0F; + edges &= ~(1 << (chosenDirection ^ 2)); + z = mapElement->base_height; + + for (direction = 0; direction < 4; direction++) { + if (!(edges & (1 << direction))) continue; + + edges &= ~(1 << direction); + if (edges != 0) return 3; + + if (footpath_element_is_sloped(mapElement)) { + if (footpath_element_get_slope_direction(mapElement) == direction) { + z += 2; + } + } + return loc_6949B9(x, y, z, mapElement, direction, outRideIndex, level + 1); + } + } + } while (!map_element_is_last_for_tile(mapElement++)); + + return 0; +} + +/** + * Returns: + * 0 - dead end? + * 1 - ride exit + * 2 - ride entrance + * 4 - park entrance / exit + * 5 - search limit reached + * 6 - (path->type & 2)? + * rct2: 0x006949A4 + */ +static uint8 sub_6949A4(sint16 x, sint16 y, sint16 z, rct_map_element *inputMapElement, uint8 chosenDirection, uint8 *outRideIndex) +{ + if (footpath_element_is_sloped(inputMapElement)) { + if (footpath_element_get_slope_direction(inputMapElement) == chosenDirection) { + z += 2; + } + } + + return loc_6949B9(x, y, z, inputMapElement, chosenDirection, outRideIndex, 0); +} + +/* rct2: 0x00695225 */ +static int guest_path_find_aimless(rct_peep* peep, uint8 edges){ + if (scenario_rand() & 1){ + // If possible go straight + if (edges & (1 << peep->var_78)){ + return peep_move_one_tile(peep->var_78, peep); + } + } + + while (1){ + uint8 direction = scenario_rand() & 3; + if (edges & (1 << direction)){ + return peep_move_one_tile(direction, peep); + } + } +} + +/* rct2: 0x0069A5F0 */ +static int sub_69A5F0(sint16 x, sint16 y, sint16 z, rct_peep *peep, rct_map_element *map_element){ + int eax = x, ebx, ecx = y, edx = z, esi = (int)peep, ebp, edi = (int)map_element; + RCT2_CALLFUNC_X(0x0069A5F0, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + return ebp; +} + +/* rct2: 0x006952C0 */ +static int guest_path_find_entering_park(rct_peep *peep, rct_map_element *map_element, uint8 edges){ + uint8 chosenEntrance = 0xFF; + uint16 nearestDist = 0xFFFF; + for (uint8 entranceNum = 0; entranceNum < 4; ++entranceNum){ + if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[entranceNum] == (sint16)0x8000) + continue; + + uint16 dist = abs(RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[entranceNum] - peep->next_x) + + abs(RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, sint16)[entranceNum] - peep->next_y); + + if (dist >= nearestDist) + continue; + + nearestDist = dist; + chosenEntrance = entranceNum; + } + + if (chosenEntrance == 0xFF) + return guest_path_find_aimless(peep, edges); + + sint16 x = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[chosenEntrance]; + sint16 y = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, sint16)[chosenEntrance]; + sint16 z = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Z, sint16)[chosenEntrance]; + RCT2_GLOBAL(0x00F1AECE, sint16) = x; + RCT2_GLOBAL(0x00F1AED0, sint16) = y; + RCT2_GLOBAL(0x00F1AED2, uint8) = z / 8; + + RCT2_GLOBAL(0x00F1AEE0, uint8) = 1; + RCT2_GLOBAL(0x00F1AEE1, uint8) = 0xFF; + + int chosenDirection = sub_69A5F0(peep->next_x, peep->next_y, peep->next_z, peep, map_element); + + if (chosenDirection == -1) + return guest_path_find_aimless(peep, edges); + else + return peep_move_one_tile(chosenDirection, peep); +} + +/* rct2: 0x0069536C */ +static int guest_path_find_leaving_park(rct_peep *peep, rct_map_element *map_element, uint8 edges){ + rct2_peep_spawn* peepSpawn = &gPeepSpawns[0]; + // Peeps for whatever reason return to their original spawn point + // this in future should look for the nearest. + if (peep->sprite_index & 1 && gPeepSpawns[1].x != 0xFFFF){ + peepSpawn++; + } + + sint16 x = peepSpawn->x & 0xFFE0; + sint16 y = peepSpawn->y & 0xFFE0; + uint8 z = peepSpawn->z * 2; + uint8 direction = peepSpawn->direction; + + RCT2_GLOBAL(0x00F1AECE, sint16) = x; + RCT2_GLOBAL(0x00F1AED0, sint16) = y; + RCT2_GLOBAL(0x00F1AED2, uint8) = z; + + if (x == peep->next_x && y == peep->next_y){ + return peep_move_one_tile(direction, peep); + } + + RCT2_GLOBAL(0x00F1AEE0, uint8) = 1; + RCT2_GLOBAL(0x00F1AEE1, uint8) = 0xFF; + direction = sub_69A5F0(peep->next_x, peep->next_y, peep->next_z, peep, map_element); + if (direction == -1) + return guest_path_find_aimless(peep, edges); + else + return peep_move_one_tile(direction, peep); +} + +/* rct2: 0x00695161 */ +static int guest_path_find_park_entrance(rct_peep* peep, rct_map_element *map_element, uint8 edges){ + uint8 entranceNum; + + if (!(peep->flags & PEEP_FLAGS_PARK_ENTRANCE_CHOSEN)){ + uint8 chosenEntrance = 0xFF; + uint16 nearestDist = 0xFFFF; + for (entranceNum = 0; entranceNum < 4; ++entranceNum){ + if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[entranceNum] == (sint16)0x8000) + continue; + + uint16 dist = abs(RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[entranceNum] - peep->next_x) + + abs(RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, sint16)[entranceNum] - peep->next_y); + + if (dist >= nearestDist) + continue; + + nearestDist = dist; + chosenEntrance = entranceNum; + } + + if (chosenEntrance == 0xFF) + return guest_path_find_aimless(peep, edges); + + peep->current_ride = chosenEntrance; + peep->flags |= PEEP_FLAGS_PARK_ENTRANCE_CHOSEN; + } + + entranceNum = peep->current_ride; + sint16 x = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[entranceNum]; + sint16 y = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, sint16)[entranceNum]; + sint16 z = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Z, sint16)[entranceNum]; + RCT2_GLOBAL(0x00F1AECE, sint16) = x; + RCT2_GLOBAL(0x00F1AED0, sint16) = y; + RCT2_GLOBAL(0x00F1AED2, uint8) = z / 8; + + RCT2_GLOBAL(0x00F1AEE0, uint8) = 1; + RCT2_GLOBAL(0x00F1AEE1, uint8) = 0xFF; + + int chosenDirection = sub_69A5F0(peep->next_x, peep->next_y, peep->next_z, peep, map_element); + + if (chosenDirection == -1) + return guest_path_find_aimless(peep, edges); + else + return peep_move_one_tile(chosenDirection, peep); +} + +/* rct2: 0x006A72C5 */ +static void get_ride_queue_end(sint16 *x, sint16 *y, sint16 *z, sint16 dist){ + rct_map_element *mapElement = map_get_first_element_at(*x / 32, *y / 32); + + bool found = false; + do{ + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE) + continue; + + if (*z != mapElement->base_height) + continue; + + found = true; + break; + } while (!map_element_is_last_for_tile(mapElement++)); + + if (!found) + return; + + uint8 direction = (mapElement->type & 3) ^ (1 << 1); + RCT2_GLOBAL(0x00F3EFE0, rct_map_element*) = NULL; + RCT2_GLOBAL(0x00F3EFE8, rct_map_element*) = NULL; + + sint16 baseZ = mapElement->base_height; + sint16 nextX = *x; + sint16 nextY = *y; + while (1){ + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH){ + RCT2_GLOBAL(0x00F3EFE0, rct_map_element*) = mapElement; + RCT2_GLOBAL(0x00F3EFE4, sint16) = nextX; + RCT2_GLOBAL(0x00F3EFE6, sint16) = nextY; + RCT2_GLOBAL(0x00F3EFEC, uint32) = direction; + if (footpath_element_is_sloped(mapElement)){ + if (footpath_element_get_slope_direction(mapElement) == direction){ + baseZ += 2; + } + } + } + nextX += TileDirectionDelta[direction].x; + nextY += TileDirectionDelta[direction].y; + + mapElement = map_get_first_element_at(nextX / 32, nextY / 32); + found = false; + do{ + if (mapElement == RCT2_GLOBAL(0x00F3EFE8, rct_map_element*)) + continue; + + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + + if (baseZ == mapElement->base_height){ + if (footpath_element_is_sloped(mapElement)){ + if (footpath_element_get_slope_direction(mapElement) != direction){ + break; + } + } + found = true; + break; + } + + if (baseZ - 2 == mapElement->base_height){ + if (!footpath_element_is_sloped(mapElement)) + break; + + if (footpath_element_get_slope_direction(mapElement) != direction) + break; + + baseZ -= 2; + found = true; + break; + } + } while (!map_element_is_last_for_tile(mapElement++)); + + if (found == false) + break; + + if (!footpath_element_is_queue(mapElement)) + break; + + if (!(mapElement->properties.path.edges & (1 << (direction ^ (1 << 1))))) + break; + + if (RCT2_GLOBAL(0x00F3EFE8, rct_map_element*) == NULL) + RCT2_GLOBAL(0x00F3EFE8, rct_map_element*) = mapElement; + + // More queue to go. + if (mapElement->properties.path.edges & (1 << (direction))) + continue; + + direction++; + direction &= 3; + // More queue to go. + if (mapElement->properties.path.edges & (1 << (direction))) + continue; + + direction ^= (1 << 1); + // More queue to go. + if (mapElement->properties.path.edges & (1 << (direction))) + continue; + + break; + } + + if ((uint8)*z == 0xFF) + return; + + mapElement = RCT2_GLOBAL(0x00F3EFE0, rct_map_element*); + if (mapElement == NULL) + return; + + if (!footpath_element_is_queue(mapElement)) + return; + + *x = RCT2_GLOBAL(0x00F3EFE4, sint16); + *y = RCT2_GLOBAL(0x00F3EFE6, sint16); + *z = mapElement->base_height; } /* rct2: 0x00694C35 */ @@ -6777,7 +7134,7 @@ static int guest_path_finding(rct_peep* peep){ if (edges == 0) return guest_surface_path_finding(peep); - uint8 direction = peep->var_78 ^ (1 << 1); + sint8 direction = peep->var_78 ^ (1 << 1); if (!(edges & ~(1 << direction))){ peep_check_if_lost(peep); peep_check_cant_find_ride(peep); @@ -6794,29 +7151,143 @@ static int guest_path_finding(rct_peep* peep){ } //694F19 - if (peep->var_2A == 0){ - if (!peep_has_food(peep) && - (scenario_rand()&0xFFFF) >= 2184){ + if (peep->var_2A != 0){ + if (peep->state == PEEP_STATE_ENTERING_PARK){ + return guest_path_find_entering_park(peep, mapElement, edges); + } + else if (peep->state == PEEP_STATE_LEAVING_PARK){ + return guest_path_find_leaving_park(peep, mapElement, edges); + } + return guest_path_find_aimless(peep, edges); + } - uint8 adjustedEdges = edges; - uint8 chosenDirection = 0; - for (; chosenDirection < 4; ++chosenDirection){ - // If there is no path in that direction try another - if (!(adjustedEdges & (1 << chosenDirection))) - continue; + + if (!peep_has_food(peep) && + (scenario_rand()&0xFFFF) >= 2184){ + + uint8 adjustedEdges = edges; + uint8 chosenDirection = 0; + for (; chosenDirection < 4; ++chosenDirection){ + // If there is no path in that direction try another + if (!(adjustedEdges & (1 << chosenDirection))) + continue; - uint8 al = sub_6949A4(peep->next_x, peep->next_y, peep->next_z, mapElement, chosenDirection); - if (al == 6 || al <= 1){ - adjustedEdges &= ~(1 << chosenDirection); + uint8 rideIndex; + uint8 al = sub_6949A4(peep->next_x, peep->next_y, peep->next_z, mapElement, chosenDirection, &rideIndex); + if (al == 6 || al <= 1){ + adjustedEdges &= ~(1 << chosenDirection); + } + } + if (adjustedEdges != 0) + edges = adjustedEdges; + } + + if (peep->item_standard_flags & PEEP_ITEM_MAP){ + // If at least 2 directions consult map + direction = bitscanforward(edges); + if (direction != -1){ + uint8 edges2 = edges & ~(1 << direction); + if (bitscanforward(edges2) != -1){ + + uint16 probability = 1638; + if ((peep->flags & PEEP_FLAGS_LEAVING_PARK) || + peep->guest_heading_to_ride_id == 0xFF){ + probability = 9362; + } + + if ((scenario_rand() & 0xFFFF) < probability){ + if (peep->action >= PEEP_ACTION_NONE_1){ + peep->action = PEEP_ACTION_READ_MAP; + peep->action_frame = 0; + peep->action_sprite_image_offset = 0; + sub_693B58(peep); + invalidate_sprite((rct_sprite*)peep); + } } } - if (adjustedEdges != 0) - edges = adjustedEdges; } - //694f7f } - //6952AB + + if (peep->flags & PEEP_FLAGS_LEAVING_PARK) + return guest_path_find_park_entrance(peep, mapElement, edges); + + if (peep->guest_heading_to_ride_id == 0xFF) + return guest_path_find_aimless(peep, edges); + uint8 rideIndex = peep->guest_heading_to_ride_id; + rct_ride* ride = GET_RIDE(rideIndex); + + if (ride->status != RIDE_STATUS_OPEN) + return guest_path_find_aimless(peep, edges); + + RCT2_GLOBAL(0x00F1AEE1, uint8) = rideIndex; + + RCT2_GLOBAL(0x00F1AEBC, uint32) = 4; + + uint16 closestDist = 0xFFFF; + uint8 closestStationNum = 4; + + for (uint8 stationNum = 0; stationNum < 4; ++stationNum){ + if (ride->entrances[stationNum] == 0xFFFF) + continue; + + sint16 stationX = (ride->entrances[stationNum] & 0xFF) * 32; + sint16 stationY = (ride->entrances[stationNum] & 0xFF00) / 8; + uint16 dist = abs(stationX - peep->next_x) + abs(stationY - peep->next_y); + + if (dist < closestDist){ + closestDist = dist; + RCT2_GLOBAL(0x00F1AEBC, uint32) = closestStationNum; + closestStationNum = stationNum; + continue; + } + + if (RCT2_GLOBAL(0x00F1AEBC, uint32) == 4){ + RCT2_GLOBAL(0x00F1AEBC, uint32) = stationNum; + } + } + + if (closestStationNum == 4) + closestStationNum = 0; + + if (RCT2_GLOBAL(0x00F1AEBC, uint32) != 4){ + if (ride->depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS && + ride->num_stations == 2 && + ride->entrances[0] != 0xFFFF && + ride->entrances[1] != 0xFFFF){ + closestStationNum = 0; + if (peep->no_of_rides & 1) + closestStationNum++; + } + } + + uint16 entranceXY = ride->entrances[closestStationNum]; + if (entranceXY == 0xFFFF){ + entranceXY = ride->entrances[closestStationNum + 1]; + if (entranceXY == 0xFFFF){ + entranceXY = ride->entrances[closestStationNum + 2]; + } + } + + if (closestDist == 0xFFFF){ + entranceXY = ride->station_starts[closestStationNum]; + } + + x = (entranceXY & 0xFF) * 32; + y = (entranceXY & 0xFF00) / 8; + z = ride->station_heights[closestStationNum]; + + get_ride_queue_end(&x, &y, &z, closestDist); + RCT2_GLOBAL(0x00F1AECE, sint16) = x; + RCT2_GLOBAL(0x00F1AECE, sint16) = y; + RCT2_GLOBAL(0x00F1AECE, uint8) = (uint8)z; + RCT2_GLOBAL(0x00F1AEE0, uint8) = 1; + + direction = sub_69A5F0(peep->next_x, peep->next_y, peep->next_z, peep, mapElement); + if (direction == -1){ + return guest_path_find_aimless(peep, edges); + } + return peep_move_one_tile(direction, peep); } /** @@ -6841,7 +7312,7 @@ static int sub_693C9E(rct_peep *peep) RCT2_GLOBAL(0x00F1EE18, uint16) |= 1; uint8 result = 0; if (peep->type == PEEP_TYPE_GUEST){ - result = RCT2_CALLPROC_X(0x00694C35, x, 0, y, 0, (int)peep, 0, 0) & 0x100; + result = guest_path_finding(peep); } else{ result = RCT2_CALLPROC_X(0x006BF926, x, 0, y, 0, (int)peep, 0, 0) & 0x100; diff --git a/src/peep/peep.h b/src/peep/peep.h index cb650b8a5a..e186c4dced 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -267,7 +267,7 @@ enum PEEP_FLAGS { PEEP_FLAGS_EATING = (1 << 17), // Reduces hunger PEEP_FLAGS_EXPLODE = (1 << 18), PEEP_FLAGS_19 = (1 << 19), - PEEP_FLAGS_20 = (1 << 20), + PEEP_FLAGS_PARK_ENTRANCE_CHOSEN = (1 << 20), //Set when the nearest park entrance has been chosen PEEP_FLAGS_21 = (1 << 21), PEEP_FLAGS_JOY = (1 << 23), // Makes the peep jump in joy diff --git a/src/windows/guest_list.c b/src/windows/guest_list.c index 2ec2e8770f..8c40b24962 100644 --- a/src/windows/guest_list.c +++ b/src/windows/guest_list.c @@ -419,6 +419,7 @@ static void window_guest_list_scrollgetsize(rct_window *w, int scrollIndex, int } w->var_492 = numGuests; y = numGuests * 10; + RCT2_GLOBAL(0x00F1EE09, uint32) = numGuests; break; case PAGE_SUMMARISED: // Find the groups @@ -428,7 +429,6 @@ static void window_guest_list_scrollgetsize(rct_window *w, int scrollIndex, int break; } - RCT2_GLOBAL(0x00F1EE09, uint32) = numGuests; i = _window_guest_list_selected_page; for (i = _window_guest_list_selected_page - 1; i >= 0; i--) y -= 0x7BF2; diff --git a/src/world/map.c b/src/world/map.c index 97c14edb39..b3d21a0b8d 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -37,7 +37,7 @@ #include "park.h" #include "scenery.h" - +/* Replaces 0x00993CCC & 0x00993CCE */ const rct_xy16 TileDirectionDelta[] = { { -32, 0 }, { 0, +32 }, From bf59c164f83a04c5559769676dee421f3da33ba1 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Tue, 28 Jul 2015 18:30:45 +0100 Subject: [PATCH 0384/1173] Start implementing main path find function. --- src/peep/peep.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++- src/peep/peep.h | 7 ++-- src/peep/staff.c | 5 ++- src/world/map.h | 4 ++ 4 files changed, 116 insertions(+), 6 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 81145307b8..9c347137d0 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -5375,7 +5375,10 @@ rct_peep *peep_generate(int x, int y, int z) peep->cash_in_pocket = cash; peep->cash_spent = 0; peep->time_in_park = -1; - peep->var_CC = 0xFFFF; + peep->var_CC.x = 0xFF; + peep->var_CC.y = 0xFF; + peep->var_CC.z = 0xFF; + peep->var_CC.direction = 0xFF; peep->item_standard_flags = 0; peep->item_extra_flags = 0; peep->guest_heading_to_ride_id = 0xFF; @@ -6832,8 +6835,104 @@ static int guest_path_find_aimless(rct_peep* peep, uint8 edges){ } } +/* rct2: 0x0069A60A */ +uint8 sub_69A60A(rct_peep* peep){ + RCT2_GLOBAL(0x00F1AED8, uint32) = 0xC350; + RCT2_GLOBAL(0x00F1AEDD, uint8) = 0x80; + + if (peep->type == PEEP_TYPE_STAFF) + return 16; + + RCT2_GLOBAL(0x00F1AED8, uint32) = 0x3A98; + RCT2_GLOBAL(0x00F1AEDD, uint8) = 0; + if ((peep->flags & PEEP_FLAGS_2)){ + if ((scenario_rand() & 0xFFFF) <= 7281) + peep->flags &= ~PEEP_FLAGS_2; + + return 16; + } + + if (peep->flags & PEEP_FLAGS_LEAVING_PARK && + peep->var_C6 < 90){ + return 16; + } + + if (peep->item_standard_flags & PEEP_ITEM_MAP) + return 14; + + if (peep->flags & PEEP_FLAGS_LEAVING_PARK) + return 14; + + return 10; +} + /* rct2: 0x0069A5F0 */ static int sub_69A5F0(sint16 x, sint16 y, sint16 z, rct_peep *peep, rct_map_element *map_element){ + //RCT2_GLOBAL(0x00F1AEDC, uint8) = sub_69A60A(peep); + + //// Redundant check to make sure peep is not null?? + //sint16 start_x = RCT2_GLOBAL(0x00F1AECE, sint16); + //sint16 start_y = RCT2_GLOBAL(0x00F1AED0, sint16); + //uint8 start_z = RCT2_GLOBAL(0x00F1AED2, uint8); + // + //uint8 edges = 0xF; + //if (peep->var_CC.x == (start_x / 32) && + // peep->var_CC.y == (start_y / 32) && + // peep->var_CC.z == start_z){ + + // uint8 index = 0; + // for (; index < 4; ++index){ + // if (peep->var_D0[index].x == x && + // peep->var_D0[index].y == y && + // peep->var_D0[index].z == z){ + // edges = peep->var_D0[index].direction & 0xF; + // break; + // } + // } + //} + + //bool found = false; + //rct_map_element *destMapElement = map_get_first_element_at(x / 32, y / 32); + //do{ + // if (destMapElement->base_height != z) + // continue; + + // if (map_element_get_type(destMapElement) != MAP_ELEMENT_TYPE_PATH) + // continue; + + // found = true; + // break; + //} while (!map_element_is_last_for_tile(destMapElement++)); + + //sint8 chosenDirection = 0xF; + //if (!found){ + // chosenDirection = 0xF; + // //goto 69A89C + //} + + //edges &= destMapElement->properties.path.edges & 0xF; + //rct_map_element *bannerElement = get_banner_on_path(destMapElement); + //if (bannerElement != NULL) { + // do { + // edges &= bannerElement->properties.banner.flags; + // } while ((bannerElement = get_banner_on_path(bannerElement)) != NULL); + //} + + //if (edges == 0){ + // chosenDirection = 0xF; + // // goto 69A89C + //} + + //chosenDirection = bitscanforward(edges); + //if (edges & ~(1 << chosenDirection) == 0){ + // // goto 69A8A1 chosenDirection + //} + + //for (; chosenDirection != -1; chosenDirection = bitscanforward(edges)){ + // edges &= ~(1 << chosenDirection); + // //69a814 + //} + ////69a895 int eax = x, ebx, ecx = y, edx = z, esi = (int)peep, ebp, edi = (int)map_element; RCT2_CALLFUNC_X(0x0069A5F0, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); return ebp; @@ -7718,7 +7817,10 @@ static bool peep_should_use_cash_machine(rct_peep *peep, int rideIndex) */ static void sub_69A98C(rct_peep *peep) { - peep->var_CC = 0xFFFFFFFF; + peep->var_CC.x = 0xFF; + peep->var_CC.y = 0xFF; + peep->var_CC.z = 0xFF; + peep->var_CC.direction = 0xFF; } /** diff --git a/src/peep/peep.h b/src/peep/peep.h index e186c4dced..6d02b8e4a2 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -22,6 +22,7 @@ #define _PEEP_H_ #include "../common.h" +#include "../world/map.h" #define PEEP_MAX_THOUGHTS 5 @@ -249,7 +250,7 @@ enum PEEP_ACTION_EVENTS { enum PEEP_FLAGS { PEEP_FLAGS_LEAVING_PARK = (1 << 0), PEEP_FLAGS_SLOW_WALK = (1 << 1), - + PEEP_FLAGS_2 = (1 << 2), PEEP_FLAGS_TRACKING = (1 << 3), PEEP_FLAGS_WAVING = (1 << 4), // Makes the peep wave PEEP_FLAGS_5 = (1 << 5), // Set on paying to enter park? @@ -478,8 +479,8 @@ typedef struct { }; uint8 photo1_ride_ref; // 0xC7 uint32 flags; // 0xC8 - uint32 var_CC; - uint8 pad_D0[0x10]; + rct_xyzd8 var_CC; + rct_xyzd8 var_D0[4]; uint8 no_action_frame_no; // 0xE0 // 0x3F Litter Count split into lots of 3 with time, 0xC0 Time since last recalc uint8 litter_count; // 0xE1 diff --git a/src/peep/staff.c b/src/peep/staff.c index 8a179d42e7..019f072113 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -248,7 +248,10 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, } newPeep->time_in_park = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); - newPeep->var_CC = 0xFFFFFFFF; + newPeep->var_CC.x = 0xFF; + newPeep->var_CC.y = 0xFF; + newPeep->var_CC.z = 0xFF; + newPeep->var_CC.direction = 0xFF; uint8 colour = RCT2_ADDRESS(RCT2_ADDRESS_HANDYMAN_COLOUR, uint8)[staff_type > 2 ? 2 : staff_type]; newPeep->tshirt_colour = colour; diff --git a/src/world/map.h b/src/world/map.h index edbd136d2a..790306c521 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -227,6 +227,10 @@ typedef struct { uint8 x, y; } rct_xy8; +typedef struct{ + uint8 x, y, z, direction; +} rct_xyzd8; + typedef struct { sint16 x, y; } rct_xy16; From ade8779195c33936af993237b0f66cd049153d4a Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 28 Jul 2015 20:44:44 +0200 Subject: [PATCH 0385/1173] Name a park flag and a TD6 flag. --- src/ride/track.h | 2 +- src/windows/options.c | 2 +- src/world/park.h | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ride/track.h b/src/ride/track.h index c9eabb1c97..52856d520b 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -173,7 +173,7 @@ typedef struct { uint8 track_spine_colour[4]; // 0x60 uint8 track_rail_colour[4]; // 0x64 uint8 track_support_colour[4]; // 0x68 - uint32 var_6C; // some flags + uint32 var_6C; // some extra flags. (1 << 31) was used to mark the TD6 as a Six Flags ride. rct_object_entry vehicle_object; // 0x70 uint8 space_required_x; // 0x80 uint8 space_required_y; // 0x81 diff --git a/src/windows/options.c b/src/windows/options.c index 779e63d2f7..52718cf0d1 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -1199,7 +1199,7 @@ static void window_options_invalidate(rct_window *w) case WINDOW_OPTIONS_PAGE_MISC: // unknown park flag can disable real name checkbox - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & 0x8000) + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_LOCK_REAL_NAMES_OPTION) w->disabled_widgets |= (1ULL << WIDX_REAL_NAME_CHECKBOX); // save plugin data checkbox: visible or not diff --git a/src/world/park.h b/src/world/park.h index 2c66a3321a..c9125dbaec 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -41,6 +41,7 @@ enum { PARK_FLAGS_DIFFICULT_GUEST_GENERATION = (1 << 12), PARK_FLAGS_PARK_FREE_ENTRY = (1 << 13), PARK_FLAGS_DIFFICULT_PARK_RATING = (1 << 14), + PARK_FLAGS_LOCK_REAL_NAMES_OPTION = (1 << 15), PARK_FLAGS_NO_MONEY_SCENARIO = (1 << 17), // equivalent to PARK_FLAGS_NO_MONEY, but used in scenario editor PARK_FLAGS_18 = (1 << 18), PARK_FLAGS_SIX_FLAGS_DEPRECATED = (1 << 19) From 4e8d5572cc1540d5f82f74d36c216b9712c9dfb4 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 28 Jul 2015 20:59:54 +0200 Subject: [PATCH 0386/1173] Name PEEP_FLAGS_19 --- src/peep/peep.c | 8 ++++---- src/peep/peep.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 9c347137d0..79310fee88 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7559,7 +7559,7 @@ static void peep_on_enter_ride(rct_peep *peep, int rideIndex) uint16 satisfactionFlags; ride = GET_RIDE(rideIndex); - peep->flags &= ~PEEP_FLAGS_19; + peep->flags &= ~PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE; if (ride->excitement == (ride_rating)0xFFFF) { satisfactionFlags = 0x1FF; } else { @@ -7652,7 +7652,7 @@ static void peep_on_enter_ride(rct_peep *peep, int rideIndex) if (unkExcitementValue >= peep->var_FA) { if (peep->happiness >= 160 && peep->happiness_growth_rate >= 160) { peep->var_FA = unkExcitementValue; - peep->flags |= PEEP_FLAGS_19; + peep->flags |= PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE; } } @@ -7724,8 +7724,8 @@ static void peep_on_exit_ride(rct_peep *peep, int rideIndex) { rct_ride *ride = GET_RIDE(rideIndex); - if (peep->flags & PEEP_FLAGS_19) { - peep->flags &= ~PEEP_FLAGS_19; + if (peep->flags & PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE) { + peep->flags &= ~PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE; peep->favourite_ride = rideIndex; // TODO fix this flag name or add another one peep->window_invalidate_flags |= PEEP_INVALIDATE_STAFF_STATS; diff --git a/src/peep/peep.h b/src/peep/peep.h index 6d02b8e4a2..2eea21800e 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -267,7 +267,7 @@ enum PEEP_FLAGS { PEEP_FLAGS_EATING = (1 << 17), // Reduces hunger PEEP_FLAGS_EXPLODE = (1 << 18), - PEEP_FLAGS_19 = (1 << 19), + PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE = (1 << 19), PEEP_FLAGS_PARK_ENTRANCE_CHOSEN = (1 << 20), //Set when the nearest park entrance has been chosen PEEP_FLAGS_21 = (1 << 21), From 5785530e007e36093bba15547fd9f3a23679cd3b Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 28 Jul 2015 21:28:29 +0200 Subject: [PATCH 0387/1173] Name RIDE_TYPE_FLAG_21 --- src/peep/peep.c | 2 +- src/ride/ride.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 9c347137d0..664598c72e 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -6512,7 +6512,7 @@ static int peep_interact_with_shop(rct_peep* peep, sint16 x, sint16 y, rct_map_e if (peep->flags & PEEP_FLAGS_LEAVING_PARK) return peep_return_to_center_of_tile(peep); - if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_21)){ + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_PEEP_SHOULD_GO_INSIDE_FACILITY)){ peep->var_F4 = 0; if (!sub_6960AB(peep, rideIndex, 0, 0)) return peep_return_to_center_of_tile(peep); diff --git a/src/ride/ride.h b/src/ride/ride.h index 6d322b45ba..7f2d567faa 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -754,7 +754,7 @@ enum { RIDE_TYPE_FLAG_18 = 1 << 18, RIDE_TYPE_FLAG_FLAT_RIDE = 1 << 19, RIDE_TYPE_FLAG_20 = 1 << 20, - RIDE_TYPE_FLAG_21 = 1 << 21, // used only by toilets and first aid + RIDE_TYPE_FLAG_PEEP_SHOULD_GO_INSIDE_FACILITY = 1 << 21, // used by toilets and first aid to mark that peep should go inside the building (rather than 'buying' at the counter) RIDE_TYPE_FLAG_IN_RIDE = 1 << 22, // peeps are "IN" (ride) rather than "ON" (ride) RIDE_TYPE_FLAG_SELLS_FOOD = 1 << 23, RIDE_TYPE_FLAG_SELLS_DRINKS = 1 << 24, From af5a85c4ecdb13902307a570bc8d89288de1923f Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Tue, 28 Jul 2015 21:47:18 +0200 Subject: [PATCH 0388/1173] Update changelog.txt --- distribution/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 9e9f56c3a5..4adca07f93 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -8,6 +8,7 @@ - Feature: Cheats for guest parameters like hunger, energy, nausea etc. - Feature: Cheats for park parameters like guest generation, loan settings and switching to and from not using money. - Fix: Launched TD4 rides will now always use the RCT1 launch mode (that doesn't pass the station). +- Fix: Guests will no longer ignore no entry signs if the tile contains more than one fence. 0.0.2-beta (2015-06-21) ------------------------------------------------------------------------ From 828280257446c8ecd68acf70cb43e59ef9d9b4fb Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 29 Jul 2015 04:00:14 +0100 Subject: [PATCH 0389/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 1041 +++++++++++++------------ 1 file changed, 522 insertions(+), 519 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index bf5ea3eabc..6a277b776b 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -16,9 +16,9 @@ STR_0011 :木製野鼠式雲霄飛車 STR_0012 :越野賽馬式雲霄飛車 STR_0013 :自駕軌道車輛 STR_0014 :自由落體 -STR_0015 :Bobsleigh Coaster +STR_0015 :雪橇式雲霄飛車 STR_0016 :觀景塔 -STR_0017 :Looping Roller Coaster +STR_0017 :迴環式雲霄飛車 STR_0018 :滑水道 STR_0019 :採礦列車雲霄飛車 STR_0020 :纜車 @@ -73,25 +73,25 @@ STR_0068 :Heartline Twister Coaster STR_0069 :迷你高爾夫 STR_0070 :Giga Coaster STR_0071 :Roto-Drop -STR_0072 :Flying Saucers +STR_0072 :碰碰飛碟 STR_0073 :古怪屋 -STR_0074 :Monorail Cycles -STR_0075 :Compact Inverted Coaster -STR_0076 :Water Coaster +STR_0074 :單軌單車 +STR_0075 :緊湊的反轉式雲霄飛車 +STR_0076 :濺水式雲霄飛車 STR_0077 :Air Powered Vertical Coaster STR_0078 :Inverted Hairpin Coaster STR_0079 :Magic Carpet -STR_0080 :Submarine Ride -STR_0081 :River Rafts +STR_0080 :潛艇遊道 +STR_0081 :木筏河道 STR_0082 :Unknown Ride (50) -STR_0083 :Enterprise +STR_0083 :太空摩天輪 STR_0084 :Unknown Ride (52) STR_0085 :Unknown Ride (53) STR_0086 :Unknown Ride (54) STR_0087 :Unknown Ride (55) STR_0088 :Inverted Impulse Coaster STR_0089 :迷你雲霄飛車 -STR_0090 :Mine Ride +STR_0090 :礦遊式雲霄飛車 STR_0091 :Unknown Ride (59) STR_0092 :直線電動機發車雲霄飛車 STR_0093 : @@ -827,7 +827,7 @@ STR_0822 :無法讀取圖像檔案 STR_0823 :缺少或不能讀取檔案 STR_0824 :{BLACK}{CROSS} STR_0825 :此名字已被使用 -STR_0826 :Too many names defined +STR_0826 :太多名稱被命名 STR_0827 :沒有足夠現金 - 需要{CURRENCY2DP} STR_0828 :{SMALLFONT}{BLACK}關閉視窗 STR_0829 :{SMALLFONT}{BLACK}視窗標題 - 拖曳此來移動本視窗 @@ -839,10 +839,10 @@ STR_0834 :{SMALLFONT}{BLACK}硬碟及遊戲設定 STR_0835 :Game initialization failed STR_0836 :Unable to start game in a minimised state STR_0837 :Unable to initialise graphics system -STR_0838 :CD key code {INT32} is not valid for your RollerCoaster Tycoon 2 CD !{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Please un-install RollerCoaster Tycoon 2% and re-install with the correct CD Key Code +STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -# The follwing six strings were used for display resolutions, but have been replaced. +# The following six strings were used for display resolutions, but have been replaced. STR_0841 : STR_0842 : STR_0843 : @@ -896,7 +896,7 @@ STR_0890 :SCR{COMMA16}.BMP STR_0891 :截圖 STR_0892 :截圖'{STRINGID}'已儲存到硬碟中 STR_0893 :截圖失敗! -STR_0894 :Landscape data area full ! +STR_0894 :地型資料的範圍已滿! STR_0895 :不能建造在一半露天一半地底的地勢中 STR_0896 :{POP16}{POP16}{STRINGID} 建造 STR_0897 :方向 @@ -911,7 +911,7 @@ STR_0905 :{SMALLFONT}{BLACK}右彎 (大弧度) STR_0906 :{SMALLFONT}{BLACK}直向前 STR_0907 :斜度 STR_0908 :滾動/傾斜 -STR_0909 :Seat Rot. +STR_0909 :旋轉座位 STR_0910 :{SMALLFONT}{BLACK}向左傾斜 STR_0911 :{SMALLFONT}{BLACK}向右傾斜 STR_0912 :{SMALLFONT}{BLACK}無傾斜 @@ -1077,26 +1077,26 @@ STR_1071 :一次付費無限次溜滑梯 STR_1072 :迷宮模式 STR_1073 :賽車模式 STR_1074 :碰碰車模式 -STR_1075 :Swing 模式 +STR_1075 :搖擺模式 STR_1076 :店面模式 STR_1077 :旋轉模式 STR_1078 :向前旋轉 STR_1079 :向後旋轉 -STR_1080 :電影: {ENDQUOTES}Avenging aviators{ENDQUOTES} -STR_1081 :3D電影: {ENDQUOTES}Mouse tails{ENDQUOTES} +STR_1080 :電影: {ENDQUOTES}飛行師復仇行{ENDQUOTES} +STR_1081 :3D電影: {ENDQUOTES}鼠尾擺擺擺{ENDQUOTES} STR_1082 :太空飛輪模式 -STR_1083 :Beginners 模式 -STR_1084 :LIM-powered launch -STR_1085 :電影: {ENDQUOTES}Thrill riders{ENDQUOTES} -STR_1086 :3D電影: {ENDQUOTES}Storm chasers{ENDQUOTES} -STR_1087 :3D電影: {ENDQUOTES}Space raiders{ENDQUOTES} -STR_1088 :Intense 模式 -STR_1089 :Berserk 模式 -STR_1090 :Haunted house 模式 +STR_1083 :初學者模式 +STR_1084 :直線電動機發車 +STR_1085 :電影: {ENDQUOTES}驚天乘客{ENDQUOTES} +STR_1086 :3D電影: {ENDQUOTES}追風者{ENDQUOTES} +STR_1087 :3D電影: {ENDQUOTES}太空海盜{ENDQUOTES} +STR_1088 :剌激模式 +STR_1089 :狂暴模式 +STR_1090 :鬼屋模式 STR_1091 :馬戲團表演模式 STR_1092 :Downward launch -STR_1093 :Crooked house 模式 -STR_1094 :Freefall drop 模式 +STR_1093 :古怪屋模式 +STR_1094 :自由落體模式 STR_1095 :有區域煞車的連續循環模式 STR_1096 :動力發車 (不穿過車站) STR_1097 :Powered launch block sectioned mode @@ -1138,9 +1138,9 @@ STR_1132 :車卡{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1133 :車卡{POP16}{COMMA16} STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} STR_1135 :{STRINGID} {COMMA16} -STR_1136 :{SMALLFONT}{BLACK}選擇主要顏色調配 -STR_1137 :{SMALLFONT}{BLACK}選擇額外顏色調配1 -STR_1138 :{SMALLFONT}{BLACK}選擇額外顏色調配2 +STR_1136 :{SMALLFONT}{BLACK}選擇主要色彩選配 +STR_1137 :{SMALLFONT}{BLACK}選擇額外色彩選配1 +STR_1138 :{SMALLFONT}{BLACK}選擇額外色彩選配2 STR_1139 :{SMALLFONT}{BLACK}選擇支撐顏色 STR_1140 :{SMALLFONT}{BLACK}選擇有關車卡顏色調配的選項 STR_1141 :{SMALLFONT}{BLACK}選擇要修改的車卡/列車 @@ -1175,12 +1175,12 @@ STR_1169 :(無) STR_1170 :{STRING} STR_1171 :{RED}Closed - - STR_1172 :{YELLOW}{STRINGID} - - -STR_1173 :{SMALLFONT}{BLACK}Build footpaths and queue lines -STR_1174 :Banner sign in the way -STR_1175 :Can't build this on sloped footpath -STR_1176 :Can't build footpath here... -STR_1177 :Can't remove footpath from here... -STR_1178 :Land slope unsuitable +STR_1173 :{SMALLFONT}{BLACK}建造道路及'輪候區'道路 +STR_1174 :橫額擋在路上 +STR_1175 :不能在斜路上建造此物件 +STR_1176 :不能在此建造道路... +STR_1177 :不能移除此處道路... +STR_1178 :不適合的土地斜度 STR_1179 :道路擋在路中 STR_1180 :不能建造此於水底! STR_1181 :道路 @@ -1208,23 +1208,23 @@ STR_1202 :1個遊客在排隊 STR_1203 :{COMMA16}個遊客在排隊 STR_1204 :{COMMA16}分鐘的輪候時間 STR_1205 :{COMMA16}分鐘的輪候時間 -STR_1206 :{WINDOW_COLOUR_2}Wait for: -STR_1207 :{WINDOW_COLOUR_2}Leave if another train arrives at station -STR_1208 :{WINDOW_COLOUR_2}Leave if another boat arrives at station -STR_1209 :{SMALLFONT}{BLACK}Select whether should wait for passengers before departing -STR_1210 :{SMALLFONT}{BLACK}Select whether should leave if another vehicle arrives at the same station +STR_1206 :{WINDOW_COLOUR_2}等待至: +STR_1207 :{WINDOW_COLOUR_2}當另一客列車到達車站後便發車 +STR_1208 :{WINDOW_COLOUR_2}當另一艘小船到達船用月台後便發車 +STR_1209 :{SMALLFONT}{BLACK}選擇發車前是否等候乘客 +STR_1210 :{SMALLFONT}{BLACK}選擇當另一列車/小船到達車站時是否發車 STR_1211 :{WINDOW_COLOUR_2}最短等待時間: STR_1212 :{WINDOW_COLOUR_2}最長等待時間: -STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing -STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing +STR_1213 :{SMALLFONT}{BLACK}選擇發車前最少的等待時長 +STR_1214 :{SMALLFONT}{BLACK}選擇發車前最多的等待時長 STR_1215 :{WINDOW_COLOUR_2}與鄰近車站同步發車 -STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronise departure with all adjacent stations (for 'racing') -STR_1217 :{COMMA16} seconds +STR_1216 :{SMALLFONT}{BLACK}選擇是否與全部鄰近車站同步發車 (以便'競賽') +STR_1217 :{COMMA16}秒 STR_1218 :{BLACK}{SMALLUP} STR_1219 :{BLACK}{SMALLDOWN} STR_1220 :只准卸客 -STR_1221 :No entrance -STR_1222 :No exit +STR_1221 :尚未建造入口 +STR_1222 :尚未建造出口 STR_1223 :{SMALLFONT}{BLACK}運輸類遊樂設施 STR_1224 :{SMALLFONT}{BLACK}溫和類遊樂設施 STR_1225 :{SMALLFONT}{BLACK}雲霄飛車 @@ -1294,20 +1294,20 @@ STR_1288 :船隻 STR_1289 :{COMMA16}船隻 STR_1290 :{COMMA16}船隻 STR_1291 :船隻{COMMA16} -STR_1292 :cabin -STR_1293 :cabins -STR_1294 :Cabin -STR_1295 :Cabins -STR_1296 :{COMMA16} cabin -STR_1297 :{COMMA16} cabins -STR_1298 :Cabin {COMMA16} -STR_1299 :wheel -STR_1300 :wheels -STR_1301 :Wheel -STR_1302 :Wheels -STR_1303 :{COMMA16} wheel -STR_1304 :{COMMA16} wheels -STR_1305 :Wheel {COMMA16} +STR_1292 :座艙 +STR_1293 :座艙 +STR_1294 :座艙 +STR_1295 :座艙 +STR_1296 :{COMMA16}個座艙 +STR_1297 :{COMMA16}個座艙 +STR_1298 :座艙{COMMA16} +STR_1299 :摩天輪 +STR_1300 :摩天輪 +STR_1301 :摩天輪 +STR_1302 :摩天輪 +STR_1303 :{COMMA16}個摩天輪 +STR_1304 :{COMMA16}個摩天輪 +STR_1305 :摩天輪{COMMA16} STR_1306 :飛輪 STR_1307 :飛輪 STR_1308 :飛輪 @@ -1319,8 +1319,8 @@ STR_1313 :玩家 STR_1314 :玩家 STR_1315 :玩家 STR_1316 :玩家 -STR_1317 :{COMMA16}玩家 -STR_1318 :{COMMA16}玩家 +STR_1317 :{COMMA16}位玩家 +STR_1318 :{COMMA16}位玩家 STR_1319 :玩家{COMMA16} STR_1320 :course STR_1321 :courses @@ -1360,20 +1360,20 @@ STR_1354 :{WINDOW_COLOUR_2}最高下落高度: {BLACK}{LENGTH} STR_1355 :{WINDOW_COLOUR_2}下落數量: {BLACK}{COMMA16} STR_1356 :{WINDOW_COLOUR_2}反轉數量: {BLACK}{COMMA16} STR_1357 :{WINDOW_COLOUR_2}桿洞數量: {BLACK}{COMMA16} -STR_1358 :{WINDOW_COLOUR_2}總'空中'時間: {BLACK}{COMMA2DP32}secs +STR_1358 :{WINDOW_COLOUR_2}總'空中'時間: {BLACK}{COMMA2DP32}秒 STR_1359 :{WINDOW_COLOUR_2}輪候時間: {BLACK}{COMMA16}分鐘 STR_1360 :{WINDOW_COLOUR_2}輪候時間: {BLACK}{COMMA16}分鐘 STR_1361 :不能改變速度... STR_1362 :不能改變發車速度... STR_1363 :高度過高無法支撐! STR_1364 :無法再擴展空中軌道的支撐! -STR_1365 :In-line Twist (向左) -STR_1366 :In-line Twist (向右) +STR_1365 :直線滾翻 (向左) +STR_1366 :直線滾翻 (向右) STR_1367 :二分之一迴環 STR_1368 :二分之一螺旋 (向左) STR_1369 :二分之一螺旋 (向右) -STR_1370 :橫滾軌道 (向左) -STR_1371 :橫滾軌道 (向右) +STR_1370 :直線滾翻 (向左) +STR_1371 :直線滾翻 (向右) STR_1372 :加速式的鏈條坡道 STR_1373 :巨型的二分之一迴環 (向左) STR_1374 :巨型的二分之一迴環 (向右) @@ -1387,21 +1387,21 @@ STR_1381 :彎型的鏈條坡道 (向左) STR_1382 :彎型的鏈條坡道 (向右) STR_1383 :四分之一迴環 STR_1384 :{YELLOW}{STRINGID} -STR_1385 :{SMALLFONT}{BLACK}Other track configurations +STR_1385 :{SMALLFONT}{BLACK}其他軌道選項 STR_1386 :特殊軌道... STR_1387 :不能改變土地類型... STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} STR_1389 :{OUTLINE}{RED}- {CURRENCY} STR_1390 :{CURRENCY2DP} STR_1391 :{RED}{CURRENCY2DP} -STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction -STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options -STR_1394 :{SMALLFONT}{BLACK}Operating options -STR_1395 :{SMALLFONT}{BLACK}Maintenance options -STR_1396 :{SMALLFONT}{BLACK}Colour scheme options -STR_1397 :{SMALLFONT}{BLACK}Sound & music options -STR_1398 :{SMALLFONT}{BLACK}Measurements and test data -STR_1399 :{SMALLFONT}{BLACK}Graphs +STR_1392 :{SMALLFONT}{BLACK}觀看遊樂設施/店鋪 +STR_1393 :{SMALLFONT}{BLACK}車卡詳情及選項 +STR_1394 :{SMALLFONT}{BLACK}運行選項 +STR_1395 :{SMALLFONT}{BLACK}維修選項 +STR_1396 :{SMALLFONT}{BLACK}色彩選配選項 +STR_1397 :{SMALLFONT}{BLACK}聲音及音樂選項 +STR_1398 :{SMALLFONT}{BLACK}測試數據及統計 +STR_1399 :{SMALLFONT}{BLACK}圖表 STR_1400 :入口 STR_1401 :出口 STR_1402 :{SMALLFONT}{BLACK}建造或移動遊樂設施的入口 @@ -1412,15 +1412,15 @@ STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this desi STR_1407 :{WINDOW_COLOUR_2}建造此軌道... STR_1408 :{WINDOW_COLOUR_2}費用: {BLACK}{CURRENCY} STR_1409 :入口/出口平台 -STR_1410 :Vertical Tower +STR_1410 :垂直高塔 STR_1411 :{STRINGID}擋在路中 -STR_1412 :{WINDOW_COLOUR_3}Data logging not available for this type of ride -STR_1413 :{WINDOW_COLOUR_3}Data logging will start when next {STRINGID} leaves {STRINGID} +STR_1412 :{WINDOW_COLOUR_3}這類型的遊樂設施並不適合數據記錄 +STR_1413 :{WINDOW_COLOUR_3}數據會於{STRINGID}離開{STRINGID}後記錄 STR_1414 :{SMALLFONT}{BLACK}{DURATION} -STR_1415 :{WINDOW_COLOUR_2}Velocity -STR_1416 :{WINDOW_COLOUR_2}Altitude -STR_1417 :{WINDOW_COLOUR_2}Vert.G's -STR_1418 :{WINDOW_COLOUR_2}Lat.G's +STR_1415 :{WINDOW_COLOUR_2}速度 +STR_1416 :{WINDOW_COLOUR_2}高度 +STR_1417 :{WINDOW_COLOUR_2}垂直重力 +STR_1418 :{WINDOW_COLOUR_2}橫向重力 STR_1419 :{SMALLFONT}{BLACK}{VELOCITY} STR_1420 :{SMALLFONT}{BLACK}{LENGTH} STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g @@ -1693,12 +1693,12 @@ STR_1687 :Water splash STR_1688 :Base size 4 x 1 STR_1689 :區域煞車裝置 STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} -STR_1691 :{WINDOW_COLOUR_2} Cost: {BLACK}{CURRENCY} -STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY} +STR_1691 :{WINDOW_COLOUR_2} 費用: {BLACK}{CURRENCY} +STR_1692 :{WINDOW_COLOUR_2} 費用: {BLACK}{CURRENCY}起 STR_1693 :{SMALLFONT}{BLACK}遊客 STR_1694 :{SMALLFONT}{BLACK}員工 STR_1695 :{SMALLFONT}{BLACK}收入和支出 -STR_1696 :{SMALLFONT}{BLACK}Customer information +STR_1696 :{SMALLFONT}{BLACK}顧客資訊 STR_1697 :不能在輪侯區放置此物件 STR_1698 :只能在輪侯區放置此物件 STR_1699 :遊戲中已有太多人物 @@ -1737,15 +1737,15 @@ STR_1731 :{WHITE}{STRINGID} - - STR_1732 :建造 STR_1733 :模式 STR_1734 :{WINDOW_COLOUR_2}圈數: -STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit +STR_1735 :{SMALLFONT}{BLACK}每次循環的圈數 STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1737 :{COMMA16} STR_1738 :不能改變圈數... STR_1739 :此賽事由遊客{INT32}勝出 STR_1740 :此賽事由{STRINGID}勝出 STR_1741 :尚未建造! -STR_1742 :{WINDOW_COLOUR_2}Max. people on ride: -STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this ride at one time +STR_1742 :{WINDOW_COLOUR_2}設施的最大載客量: +STR_1743 :{SMALLFONT}{BLACK}同時間遊樂設施上最多可接受的乘客數量 STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1745 :{COMMA16} STR_1746 :不能改變... @@ -1754,15 +1754,15 @@ STR_1748 :{SMALLFONT}{BLACK}此遊樂設施的遊玩時間限制 STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} STR_1750 :{DURATION} STR_1751 :不能改變此遊樂設施的遊玩時間限制... -STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park -STR_1753 :{SMALLFONT}{BLACK}Show summarised list of guests in park -STR_1754 :{BLACK}{COMMA16} guests -STR_1755 :{BLACK}{COMMA16} guest +STR_1752 :{SMALLFONT}{BLACK}列出樂園內每個遊客 +STR_1753 :{SMALLFONT}{BLACK}列出樂園內遊客的總匯 +STR_1754 :{BLACK}{COMMA16}名遊客 +STR_1755 :{BLACK}{COMMA16}名遊客 STR_1756 :{WINDOW_COLOUR_2}門票價格: STR_1757 :{WINDOW_COLOUR_2}可靠度: {MOVE_X}{255}{BLACK}{COMMA16}% -STR_1758 :{SMALLFONT}{BLACK}Build mode -STR_1759 :{SMALLFONT}{BLACK}Move mode -STR_1760 :{SMALLFONT}{BLACK}Fill-in mode +STR_1758 :{SMALLFONT}{BLACK}建造模式 +STR_1759 :{SMALLFONT}{BLACK}移動模式 +STR_1760 :{SMALLFONT}{BLACK}填補模式 STR_1761 :{SMALLFONT}{BLACK}以此方向建造迷宮 STR_1762 :瀑布 STR_1763 :急流 @@ -1770,9 +1770,9 @@ STR_1764 :漩渦 STR_1765 :即時拍照區域 STR_1766 :Reverser turntable STR_1767 :Spinning tunnel -STR_1768 :Can't change number of swings... -STR_1769 :{WINDOW_COLOUR_2}Number of swings: -STR_1770 :{SMALLFONT}{BLACK}Number of complete swings +STR_1768 :不能改變搖擺次數... +STR_1769 :{WINDOW_COLOUR_2}搖擺次數: +STR_1770 :{SMALLFONT}{BLACK}完全搖擺的次數 STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1772 :{COMMA16} STR_1773 :Only one on-ride photo section allowed per ride @@ -1800,19 +1800,19 @@ STR_1794 :Fixing {STRINGID} STR_1795 :Answering radio call STR_1796 :Has broken down and requires fixing STR_1797 :This option cannot be changed for this ride -STR_1798 :Whirlpool +STR_1798 :漩渦 STR_1799 :{POP16}{POP16}{POP16}{POP16}{POP16}{CURRENCY2DP} -STR_1800 :Safety cut-out -STR_1801 :Restraints stuck closed -STR_1802 :Restraints stuck open -STR_1803 :Doors stuck closed -STR_1804 :Doors stuck open -STR_1805 :Vehicle malfunction -STR_1806 :Brakes failure -STR_1807 :Control failure +STR_1800 :保險裝置跳掣 +STR_1801 :保護裝置卡住不能開啟 +STR_1802 :保護裝置卡住不能關閉 +STR_1803 :車門卡住不能開啟 +STR_1804 :車門卡住不能關閉 +STR_1805 :車輛失靈 +STR_1806 :煞車裝置故障 +STR_1807 :控制裝置故障 STR_1808 :{WINDOW_COLOUR_2}上次故障原因: {BLACK}{STRINGID} STR_1809 :{WINDOW_COLOUR_2}今次故障原因: {OUTLINE}{RED}{STRINGID} -STR_1810 :{WINDOW_COLOUR_2}Carrying: +STR_1810 :{WINDOW_COLOUR_2}攜帶中: STR_1811 :不能建造於此... STR_1812 :{SMALLFONT}{BLACK}{STRINGID} STR_1813 :其他物件 @@ -1896,8 +1896,8 @@ STR_1890 :{SMALLFONT}{BLACK}選擇維修人員檢查此遊樂設施的時距 STR_1891 :在樂園裡暫未有{STRINGID}! # The following two strings were used to display an error when the disc was missing. # This has been replaced in OpenRCT2. -STR_1892 :RollerCoaster Tycoon 2 -STR_1893 :Please insert your RollerCoaster Tycoon 2 CD in the following drive: +STR_1892 : +STR_1893 : STR_1894 :{WINDOW_COLOUR_2}賣出{STRINGID}: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}建造新的遊樂設施/店鋪 STR_1896 :{WINDOW_COLOUR_2}支出/收入 @@ -1933,8 +1933,8 @@ STR_1925 :不能放置人物於此... STR_1926 :{SMALLFONT} STR_1927 :{YELLOW}{STRINGID}發生故障了 STR_1928 :{RED}{STRINGID}毀壞了! -STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better -STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this guest - (If tracking is on, guest's movements will be reported in the message area) +STR_1929 :{RED}{STRINGID}依然未修復好{NEWLINE}請檢查維修人員位置所在, 或考慮以更好的方法管理他們 +STR_1930 :{SMALLFONT}{BLACK}開啟/關閉這位遊客的追蹤資訊 - (假若開啟追蹤, 這位遊客的行動將會報告於最近消息裡) STR_1931 :{STRINGID}已在輪候{STRINGID} STR_1932 :{STRINGID}已在{STRINGID}上 STR_1933 :{STRINGID}已在{STRINGID}中 @@ -1953,17 +1953,17 @@ STR_1945 :{SMALLFONT}{BLACK}Show orders and options for this staff member STR_1946 :{SMALLFONT}{BLACK}Select costume for this entertainer STR_1947 :{SMALLFONT}{BLACK}Show areas patrolled by selected staff type, and locate the nearest staff member STR_1948 :{SMALLFONT}{BLACK}Hire a new staff member of the selected type -STR_1949 :Financial Summary -STR_1950 :Financial Graph -STR_1951 :Park Value Graph -STR_1952 :Profit Graph -STR_1953 :Marketing -STR_1954 :Research Funding -STR_1955 :{WINDOW_COLOUR_2}Number of circuits: -STR_1956 :{SMALLFONT}{BLACK}Number of circuits of track per ride +STR_1949 :財政概要 +STR_1950 :財政圖表 +STR_1951 :樂園價值圖表 +STR_1952 :營利圖表 +STR_1953 :營銷計劃 +STR_1954 :研發資金 +STR_1955 :{WINDOW_COLOUR_2}圈數: +STR_1956 :{SMALLFONT}{BLACK}每次運轉遊樂設施的圈數 STR_1957 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1958 :{COMMA16} -STR_1959 :Can't change number of circuits... +STR_1959 :不能改變圈數... STR_1960 :{WINDOW_COLOUR_2}氣球價格: STR_1961 :{WINDOW_COLOUR_2}毛公仔價格: STR_1962 :{WINDOW_COLOUR_2}樂園地圖價格: @@ -2255,8 +2255,8 @@ STR_2247 :12月 STR_2248 :不能移除遊樂設施/店鋪... STR_2249 :{BABYBLUE}全新遊樂設施/店鋪可供使用:{NEWLINE}{STRINGID} STR_2250 :{BABYBLUE}全新景物/主題景物可供使用:{NEWLINE}{STRINGID} -STR_2251 :Can only be built on paths! -STR_2252 :Can only be built across paths! +STR_2251 :只可以在道路上建造! +STR_2252 :只可以橫過道路建造! STR_2253 :運輸類遊樂設施 STR_2254 :溫和類遊樂設施 STR_2255 :雲霄飛車 @@ -2321,16 +2321,16 @@ STR_2313 :{WINDOW_COLOUR_2}噁心度: {BLACK}{COMMA2DP32} (approx.) STR_2314 :{WINDOW_COLOUR_2}軌道長度: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}建造費用: {BLACK}約{CURRENCY} STR_2316 :{WINDOW_COLOUR_2}需要空間: {BLACK}{COMMA16} x {COMMA16}格 -STR_2317 :{WINDOW_COLOUR_2}音效品質: -STR_2318 :低 -STR_2319 :中 -STR_2320 :高 -STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} -STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} -STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} -STR_2324 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}sq.ft. -STR_2325 :{SMALLFONT}{BLACK}Buy land to extend park -STR_2326 :{SMALLFONT}{BLACK}Buy construction rights to allow construction above or below land outside the park +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : +STR_2321 :{WINDOW_COLOUR_2}遊樂設施/店鋪數目: {BLACK}{COMMA16} +STR_2322 :{WINDOW_COLOUR_2}員工數目: {BLACK}{COMMA16} +STR_2323 :{WINDOW_COLOUR_2}樂園大小: {BLACK}{COMMA32}m{SQUARED} +STR_2324 :{WINDOW_COLOUR_2}樂園大小: {BLACK}{COMMA32}sq.ft. +STR_2325 :{SMALLFONT}{BLACK}購買土地來擴展樂園 +STR_2326 :{SMALLFONT}{BLACK}購買建造權來准許在樂園範圍外的空中或地底建造物件 STR_2327 :選項 STR_2328 :{WINDOW_COLOUR_2}貨幣單位: STR_2329 :{WINDOW_COLOUR_2}距離及速度單位: @@ -2362,7 +2362,7 @@ STR_2354 :{WINDOW_COLOUR_2}清空拉坡筒次數: {BLACK}{COMMA16} STR_2355 :{WINDOW_COLOUR_2}修理遊樂設施次數: {BLACK}{COMMA16} STR_2356 :{WINDOW_COLOUR_2}檢驗遊樂設施次數: {BLACK}{COMMA16} STR_2357 :House -STR_2358 :Units +STR_2358 :單位 STR_2359 :Real Values STR_2360 :{WINDOW_COLOUR_2}屏幕解析度: STR_2361 :土地邊緣平滑化 @@ -2382,12 +2382,12 @@ STR_2374 :高 STR_2375 :很高 STR_2376 :極端 STR_2377 :超極端 -STR_2378 :{SMALLFONT}{BLACK}Adjust smaller area of land -STR_2379 :{SMALLFONT}{BLACK}Adjust larger area of land -STR_2380 :{SMALLFONT}{BLACK}Adjust smaller area of water -STR_2381 :{SMALLFONT}{BLACK}Adjust larger area of water -STR_2382 :Land -STR_2383 :Water +STR_2378 :{SMALLFONT}{BLACK}調整較小的土地區域 +STR_2379 :{SMALLFONT}{BLACK}調整較大的土地區域 +STR_2380 :{SMALLFONT}{BLACK}調整較小的水塘區域 +STR_2381 :{SMALLFONT}{BLACK}調整較大的水塘區域 +STR_2382 :土地 +STR_2383 :水塘 STR_2384 :{WINDOW_COLOUR_2}你的目標: STR_2385 :{BLACK}無 STR_2386 :{BLACK}在{MONTHYEAR}尾之前, 樂園裡至少有{COMMA16}個遊客, 而且樂園評價並不低於600 @@ -2401,31 +2401,31 @@ STR_2393 :{BLACK}樂園必需建造十種不同種類的雲霄飛車, 每座 STR_2394 :{BLACK}建造好五座未完成的雲霄飛車, 將他們每座設計成興奮度至少達到{POP16}{POP16}{COMMA2DP32} STR_2395 :{BLACK}還清樂園的貸款, 並令其價值至少達到{POP16}{POP16}{CURRENCY} STR_2396 :{BLACK}食物, 飲料及記念品的銷售收入至少要達到每月{POP16}{POP16}{CURRENCY} -STR_2397 :None -STR_2398 :Number of guests at a given date -STR_2399 :Park value at a given date -STR_2400 :Have fun -STR_2401 :Build the best ride you can -STR_2402 :Build 10 roller coasters -STR_2403 :Number of guests in park -STR_2404 :Monthly income from ride tickets -STR_2405 :Build 10 roller coasters of a given length -STR_2406 :Finish building 5 roller coasters -STR_2407 :Repay loan and achieve a given park value -STR_2408 :Monthly profit from food/merchandise -STR_2409 :{WINDOW_COLOUR_2}Marketing campaigns in operation +STR_2397 :無 +STR_2398 :指定日期要達到的遊客數量 +STR_2399 :指定日期要達到的樂園評價 +STR_2400 :盡情玩吧 +STR_2401 :建造你的最佳遊樂設施 +STR_2402 :建造十座雲霄飛車 +STR_2403 :樂園內遊客數量 +STR_2404 :遊樂設施門票的每月收入 +STR_2405 :建造十座指定長度的雲霄飛車 +STR_2406 :完成建造五座雲霄飛車 +STR_2407 :付清貸款及達到指定樂園評價 +STR_2408 :食物/飲料或其他商品的每月收入 +STR_2409 :{WINDOW_COLOUR_2}實行中的營銷計劃 STR_2410 :{BLACK}無 -STR_2411 :{WINDOW_COLOUR_2}Marketing campaigns available -STR_2412 :{SMALLFONT}{BLACK}Start this marketing campaign +STR_2411 :{WINDOW_COLOUR_2}可以實行的營銷計劃 +STR_2412 :{SMALLFONT}{BLACK}開始實行這個營銷計劃 STR_2413 :{BLACK}(每週{CURRENCY2DP}) STR_2414 :(尚未選擇) -STR_2415 :{WINDOW_COLOUR_2}Ride: -STR_2416 :{WINDOW_COLOUR_2}Item: -STR_2417 :{WINDOW_COLOUR_2}Length of time: -STR_2418 :Free entry to {STRINGID} -STR_2419 :Free ride on {STRINGID} -STR_2420 :Half-price entry to {STRINGID} -STR_2421 :Free {STRINGID} +STR_2415 :{WINDOW_COLOUR_2}遊樂設施: +STR_2416 :{WINDOW_COLOUR_2}物品: +STR_2417 :{WINDOW_COLOUR_2}時長: +STR_2418 :免費進入{STRINGID} +STR_2419 :免費乘坐{STRINGID} +STR_2420 :半價進入{STRINGID} +STR_2421 :免費{STRINGID} STR_2422 :{STRINGID}的推廣計劃 STR_2423 :{STRINGID}的推廣計劃 STR_2424 :{WINDOW_COLOUR_2}發放免費進入樂園卷 @@ -2446,22 +2446,22 @@ STR_2438 : STR_2439 : STR_2440 : STR_2441 : -STR_2442 :{BLACK}(還剩{STRINGID}結束) +STR_2442 : STR_2443 :{WINDOW_COLOUR_2}每週費用: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}總費用: {BLACK}{CURRENCY2DP} STR_2445 :開始實行此營銷計劃 -STR_2446 :{YELLOW}Your marketing campaign for free entry to the park has finished -STR_2447 :{YELLOW}Your marketing campaign for free rides on {STRINGID} has finished -STR_2448 :{YELLOW}Your marketing campaign for half-price entry to the park has finished -STR_2449 :{YELLOW}Your marketing campaign for free {STRINGID} has finished -STR_2450 :{YELLOW}Your advertising campaign for the park has finished -STR_2451 :{YELLOW}Your advertising campaign for {STRINGID} has finished +STR_2446 :{YELLOW}你舉行的行銷計劃 - 免費進入樂園營銷計劃現已結束 +STR_2447 :{YELLOW}你舉行的行銷計劃 - 免費乘坐遊樂設施{STRINGID}現已結束 +STR_2448 :{YELLOW}你舉行的行銷計劃 - 半價進入樂園現已結束 +STR_2449 :{YELLOW}你舉行的行銷計劃 - 免費{STRINGID}現已結束 +STR_2450 :{YELLOW}你針對樂園的推廣計劃現已結束 +STR_2451 :{YELLOW}你針對{STRINGID}的推廣計劃現已結束 STR_2452 :{WINDOW_COLOUR_2}現金 (減去貸款): {BLACK}{CURRENCY2DP} STR_2453 :{WINDOW_COLOUR_2}現金 (減去貸款): {RED}{CURRENCY2DP} STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} - STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} - STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} - -STR_2457 :{SMALLFONT}{BLACK}Show financial accounts +STR_2457 :{SMALLFONT}{BLACK}顯示財政報表 STR_2458 :{SMALLFONT}{BLACK}Show graph of cash (less loan) over time STR_2459 :{SMALLFONT}{BLACK}Show graph of park value over time STR_2460 :{SMALLFONT}{BLACK}Show graph of weekly profit @@ -2486,24 +2486,24 @@ STR_2478 :{SMALLFONT}{BLACK}Show graph of velocity against time STR_2479 :{SMALLFONT}{BLACK}Show graph of altitude against time STR_2480 :{SMALLFONT}{BLACK}Show graph of vertical acceleration against time STR_2481 :{SMALLFONT}{BLACK}Show graph of lateral acceleration against time -STR_2482 :{SMALLFONT}{BLACK}Profit: {CURRENCY} per week, Park Value: {CURRENCY} -STR_2483 :{WINDOW_COLOUR_2}Weekly profit: {BLACK}+{CURRENCY2DP} -STR_2484 :{WINDOW_COLOUR_2}Weekly profit: {RED}{CURRENCY2DP} -STR_2485 :Controls -STR_2486 :General -STR_2487 :Show 'real' names of guests -STR_2488 :{SMALLFONT}{BLACK}Toggle between showing 'real' names of guests and guest numbers -STR_2489 :Shortcut keys... -STR_2490 :Keyboard shortcuts -STR_2491 :Reset keys -STR_2492 :{SMALLFONT}{BLACK}Set all keyboard shortcuts back to default settings +STR_2482 :{SMALLFONT}{BLACK}營利: 每週{CURRENCY}, 樂園價值: {CURRENCY} +STR_2483 :{WINDOW_COLOUR_2}每週營利: {BLACK}+{CURRENCY2DP} +STR_2484 :{WINDOW_COLOUR_2}每週營利: {RED}{CURRENCY2DP} +STR_2485 :控制 +STR_2486 :基本 +STR_2487 :顯示遊客的'真實'姓名 +STR_2488 :{SMALLFONT}{BLACK}設定顯示遊客的'真實'名字或顯示遊客名字為數字 +STR_2489 :快捷鍵... +STR_2490 :鍵盤快捷鍵 +STR_2491 :重設快捷鍵 +STR_2492 :{SMALLFONT}{BLACK}初始化所有快捷鍵設定 STR_2493 :Close top-most window STR_2494 :Close all floating windows STR_2495 :Cancel construction mode STR_2496 :暫停遊戲 -STR_2497 :Zoom view out -STR_2498 :Zoom view in -STR_2499 :Rotate view clockwise +STR_2497 :縮小檢視範圍 +STR_2498 :放大檢視範圍 +STR_2499 :順時針旋轉檢視範圍 STR_2500 :Rotate construction object STR_2501 :Underground view toggle STR_2502 :Remove base land toggle @@ -2685,11 +2685,11 @@ STR_2676 :??? STR_2677 :??? STR_2678 :??? STR_2679 :??? -STR_2680 :All research complete -STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2680 :所有研發項目都已完成 +STR_2681 :{MEDIUMFONT}{BLACK}增加{CURRENCY}到你的金錢裡 STR_2682 : STR_2683 : -STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive +STR_2684 :{SMALLFONT}{BLACK}一大群遊客到訪 STR_2685 :Simplex Noise Parameters STR_2686 :{WINDOW_COLOUR_2}Low: STR_2687 :{WINDOW_COLOUR_2}High: @@ -2741,8 +2741,8 @@ STR_2732 :{COMMA16}ft STR_2733 :{COMMA16}m STR_2734 :{COMMA16}mph STR_2735 :{COMMA16}km/h -STR_2736 :{MONTH}, Year {COMMA16} -STR_2737 :{STRINGID} {MONTH}, Year {COMMA16} +STR_2736 :{MONTH}, 第{COMMA16}年 +STR_2737 :{STRINGID} {MONTH}, 第{COMMA16}年 STR_2738 :主選單音樂: STR_2739 :無 STR_2740 :夢幻遊樂園 (RCT1) @@ -2978,16 +2978,16 @@ STR_2967 : STR_2968 : STR_2969 : STR_2970 : -STR_2971 :主要顏色調配 -STR_2972 :額外顏色調配1 -STR_2973 :額外顏色調配2 -STR_2974 :額外顏色調配3 -STR_2975 :{SMALLFONT}{BLACK}選取遊樂設施的顏色調配來修改 -STR_2976 :{SMALLFONT}{BLACK}將目前指定的顏色調配塗上遊樂設施的指定區域 +STR_2971 :主要色彩選配 +STR_2972 :額外色彩選配1 +STR_2973 :額外色彩選配2 +STR_2974 :額外色彩選配3 +STR_2975 :{SMALLFONT}{BLACK}選取遊樂設施的色彩選配來修改 +STR_2976 :{SMALLFONT}{BLACK}將目前指定的色彩選配塗上遊樂設施的指定區域 STR_2977 :員工命名 STR_2978 :請輸入這位員工的新姓名: STR_2979 :不能命名這位員工... -STR_2980 :太多招牌 +STR_2980 :遊戲中太多橫額 STR_2981 :{RED}No entry - - STR_2982 :橫額文字 STR_2983 :請輸入橫額中的文字: @@ -3076,8 +3076,8 @@ STR_3065 :挑戰級樂園 STR_3066 :專家級樂園 STR_3067 :{OPENQUOTES}真實{ENDQUOTES}樂園 STR_3068 :其他樂園 -STR_3069 :Top Section -STR_3070 :Slope to Level +STR_3069 :最上的區域 +STR_3070 :斜坡至平面 STR_3071 :{WINDOW_COLOUR_2}劃一樂園內的價格 STR_3072 :{SMALLFONT}{BLACK}選擇是否以此價格為劃一價格 STR_3073 :{RED}警告: 你的樂園評價已跌至低於700!{NEWLINE}如果你在4週內尚未改善樂園評價, 你的樂園將會被強制關閉 @@ -3097,41 +3097,41 @@ STR_3086 :抽象主題入口 STR_3087 :冰雪主題入口 STR_3088 :寶塔式入口 STR_3089 :太空主題入口 -STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station -STR_3091 :You are not allowed to remove this section! -STR_3092 :You are not allowed to move or modify the station for this ride! +STR_3090 :{SMALLFONT}{BLACK}選擇入口, 出口以及車站的風格 +STR_3091 :你無法刪除此軌道! +STR_3092 :你無法移動或修改這個遊樂設施的車站! STR_3093 :{WINDOW_COLOUR_2}最愛: {BLACK}{STRINGID} STR_3094 :N/A -STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: +STR_3095 :{WINDOW_COLOUR_2}鏈條坡道的鏈條速度: STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} -STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed -STR_3098 :Can't change lift hill speed... -STR_3099 :{SMALLFONT}{BLACK}Select colour -STR_3100 :{SMALLFONT}{BLACK}Select second colour -STR_3101 :{SMALLFONT}{BLACK}Select third colour -STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape -STR_3103 :Can't re-paint this... -STR_3104 :{SMALLFONT}{BLACK}List rides -STR_3105 :{SMALLFONT}{BLACK}List shops and stalls -STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other guest facilities +STR_3097 :{SMALLFONT}{BLACK}選擇鏈條坡道的鏈條上拉速度 +STR_3098 :不能更改鏈條坡道的鏈條速度... +STR_3099 :{SMALLFONT}{BLACK}選擇顏色 +STR_3100 :{SMALLFONT}{BLACK}選擇第二顏色 +STR_3101 :{SMALLFONT}{BLACK}選擇第三顏色 +STR_3102 :{SMALLFONT}{BLACK}將地型的景物重新上色 +STR_3103 :不能重新上色這個物件... +STR_3104 :{SMALLFONT}{BLACK}列出遊樂設施 +STR_3105 :{SMALLFONT}{BLACK}列出商店及攤販 +STR_3106 :{SMALLFONT}{BLACK}列出訪客資訊中心或其他遊客設施 STR_3107 :關閉 STR_3108 :測試 STR_3109 :開啟 -STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16} +STR_3110 :{WINDOW_COLOUR_2}煞車區間: {BLACK}{COMMA16} STR_3111 :{SMALLFONT}{BLACK}點擊建造設計 STR_3112 :{SMALLFONT}{BLACK}點擊刪除或重命名設計 STR_3113 :選擇另一個設計 STR_3114 :{SMALLFONT}{BLACK}返回選擇設計視窗 STR_3115 :{SMALLFONT}{BLACK}儲存軌道設計 STR_3116 :{SMALLFONT}{BLACK}儲存軌道設計 (在測試完結及測試資料生成完畢前不可用) -STR_3117 :{BLACK}Calling mechanic... -STR_3118 :{BLACK}{STRINGID} is heading for the ride -STR_3119 :{BLACK}{STRINGID} is fixing the ride -STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride -STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy -STR_3122 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guest -STR_3123 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guests -STR_3124 :Broken {STRINGID} +STR_3117 :{BLACK}呼叫維修人員中... +STR_3118 :{BLACK}{STRINGID}正在前往到這個遊樂設施 +STR_3119 :{BLACK}{STRINGID}正在修復這個遊樂設施 +STR_3120 :{SMALLFONT}{BLACK}將最鄰近, 或在維修此遊樂設施的維修人員定位 +STR_3121 :無法將維修人員定位, 或者附近的維修人員都在工作中 +STR_3122 :{WINDOW_COLOUR_2}遊客的最愛: {BLACK}{COMMA16}位遊客 +STR_3123 :{WINDOW_COLOUR_2}遊客的最愛: {BLACK}{COMMA16}位遊客 +STR_3124 :故障的{STRINGID} STR_3125 :{WINDOW_COLOUR_2}興奮度加成: {BLACK}+{COMMA16}% STR_3126 :{WINDOW_COLOUR_2}刺激度加成: {BLACK}+{COMMA16}% STR_3127 :{WINDOW_COLOUR_2}噁心度加成: {BLACK}+{COMMA16}% @@ -3139,29 +3139,29 @@ STR_3128 :儲存軌道設計 STR_3129 :儲存軌道設計及周邊景物 STR_3130 :儲存 STR_3131 :取消 -STR_3132 :{BLACK}Click items of scenery to select them to be saved with track design... -STR_3133 :Unable to build this on a slope -STR_3134 :{RED}(Design includes scenery which is unavailable) -STR_3135 :{RED}(Vehicle design unavailable - Ride performance may be affected) -STR_3136 :Warning: This design will be built with an alternative vehicle type and may not perform as expected -STR_3137 :Select Nearby Scenery -STR_3138 :Reset Selection -STR_3139 :Cable lift unable to work in this operating mode -STR_3140 :Cable lift hill must start immediately after station -STR_3141 :Multi-circuit per ride not possible with cable lift hill -STR_3142 :{WINDOW_COLOUR_2}Capacity: {BLACK}{STRINGID} -STR_3143 :{SMALLFONT}{BLACK}Show people on map -STR_3144 :{SMALLFONT}{BLACK}Show rides and stalls on map -STR_3145 :{SMALLFONT}{BLACK}Scroll {STRINGID} left -STR_3146 :{SMALLFONT}{BLACK}Scroll {STRINGID} right -STR_3147 :{SMALLFONT}{BLACK}Scroll {STRINGID} left fast -STR_3148 :{SMALLFONT}{BLACK}Scroll {STRINGID} right fast -STR_3149 :{SMALLFONT}{BLACK}Scroll {STRINGID} left/right -STR_3150 :{SMALLFONT}{BLACK}Scroll {STRINGID} up -STR_3151 :{SMALLFONT}{BLACK}Scroll {STRINGID} down -STR_3152 :{SMALLFONT}{BLACK}Scroll {STRINGID} up fast -STR_3153 :{SMALLFONT}{BLACK}Scroll {STRINGID} down fast -STR_3154 :{SMALLFONT}{BLACK}Scroll {STRINGID} up/down +STR_3132 :{BLACK}點擊選擇景物, 以便儲存於軌道設計內... +STR_3133 :無法於斜坡上建造此物件 +STR_3134 :{RED}(設計中含有不可用的景物) +STR_3135 :{RED}(車輛款式不可用 - 遊樂設施的性能可能會有影響) +STR_3136 :警告: 此設計會使用另一款車輛, 它的運作可能會跟預期有落差 +STR_3137 :選擇鄰近景物 +STR_3138 :重新選擇 +STR_3139 :纜道坡道不能在這個運作模式運行 +STR_3140 :纜道坡道需要連接至車站 +STR_3141 :纜道坡道並不適合於單次多圈數的遊樂設施 +STR_3142 :{WINDOW_COLOUR_2}載客量: {BLACK}{STRINGID} +STR_3143 :{SMALLFONT}{BLACK}在地圖上顯示所有人物 +STR_3144 :{SMALLFONT}{BLACK}在地圖上顯示所有遊樂設施及店鋪 +STR_3145 :{SMALLFONT}{BLACK}向左捲動{STRINGID} +STR_3146 :{SMALLFONT}{BLACK}向右捲動{STRINGID} +STR_3147 :{SMALLFONT}{BLACK}快速向左捲動{STRINGID} +STR_3148 :{SMALLFONT}{BLACK}快速向右捲動{STRINGID} +STR_3149 :{SMALLFONT}{BLACK}向左/向右捲動{STRINGID} +STR_3150 :{SMALLFONT}{BLACK}向上捲動{STRINGID} +STR_3151 :{SMALLFONT}{BLACK}向下捲動{STRINGID} +STR_3152 :{SMALLFONT}{BLACK}快速向上捲動{STRINGID} +STR_3153 :{SMALLFONT}{BLACK}快速向下捲動{STRINGID} +STR_3154 :{SMALLFONT}{BLACK}向上/向下捲動{STRINGID} STR_3155 : STR_3156 : STR_3157 :地圖 @@ -3176,18 +3176,18 @@ STR_3165 : STR_3166 :{BLACK}(ID: STR_3167 :{WINDOW_COLOUR_2}包含: {BLACK}{COMMA16}項物件 STR_3168 :{WINDOW_COLOUR_2}文字: {BLACK}{STRINGID} -STR_3169 :Data for the following object not found: -STR_3170 :Not enough space for graphics -STR_3171 :Too many objects of this type selected -STR_3172 :The following object must be selected first: {STRING} -STR_3173 :This object is currently in use -STR_3174 :This object is required by another object -STR_3175 :This object is always required -STR_3176 :Unable to select this object -STR_3177 :Unable to de-select this object -STR_3178 :At least one path object must be selected -STR_3179 :At least one ride vehicle/attraction object must be selected -STR_3180 :Invalid selection of objects +STR_3169 :找不到以下物件的資料: +STR_3170 :沒有空間繪製圖像 +STR_3171 :選擇了太多此類型的物件 +STR_3172 :必需要先選擇以下的物件: {STRING} +STR_3173 :這個物件目前被使用中 +STR_3174 :其他物件需要這個物件 +STR_3175 :這個物件是必需的 +STR_3176 :無法選擇這個物件 +STR_3177 :無法取消選擇這個物件 +STR_3178 :至少需要選擇一項道路款式 +STR_3179 :至少需要選擇一項遊樂設施/店鋪 +STR_3180 :不合適的物件選擇 STR_3181 :物件選擇 - {STRINGID} STR_3182 :必須選擇樂園入口類別 STR_3183 :必須選擇水塘類別 @@ -3223,11 +3223,11 @@ STR_3212 :{POP16}{COMMA16} x {PUSH16}{COMMA16} STR_3213 :不能再縮小地圖 STR_3214 :不能再擴大地圖 STR_3215 :太接近地圖的邊緣 -STR_3216 :{SMALLFONT}{BLACK}Select park-owned land etc. -STR_3217 :Land Owned -STR_3218 :Construction Rights Owned -STR_3219 :Land For Sale -STR_3220 :Construction Rights For Sale +STR_3216 :{SMALLFONT}{BLACK}選擇樂園擁有的土地及其他選項 +STR_3217 :已擁有的土地 +STR_3218 :已擁有建造權的土地 +STR_3219 :可供購買的土地 +STR_3220 :可供購買建造權的土地 STR_3221 :{SMALLFONT}{BLACK}Set land to be owned by the park STR_3222 :{SMALLFONT}{BLACK}Set construction rights only to be owned by the park STR_3223 :{SMALLFONT}{BLACK}Set land to be available to purchase by the park @@ -3239,60 +3239,60 @@ STR_3228 :{SMALLFONT}{BLACK}Set starting positions for people STR_3229 :Block Brakes cannot be used directly after station STR_3230 :Block Brakes cannot be used directly after each other STR_3231 :Block Brakes cannot be used directly after the top of this lift hill -STR_3232 :Options - Financial -STR_3233 :Options - Guests -STR_3234 :Options - Park -STR_3235 :{SMALLFONT}{BLACK}Show financial options -STR_3236 :{SMALLFONT}{BLACK}Show guest options -STR_3237 :{SMALLFONT}{BLACK}Show park options -STR_3238 :No Money -STR_3239 :{SMALLFONT}{BLACK}Make this park a 'no money' park with no financial restrictions -STR_3240 :{WINDOW_COLOUR_2}Initial cash: -STR_3241 :{WINDOW_COLOUR_2}Initial loan: -STR_3242 :{WINDOW_COLOUR_2}Maximum loan size: -STR_3243 :{WINDOW_COLOUR_2}Annual interest rate: -STR_3244 :Forbid marketing campaigns -STR_3245 :{SMALLFONT}{BLACK}Forbid advertising, promotional schemes, and other marketing campaigns +STR_3232 :選項 - 財政 +STR_3233 :選項 - 遊客 +STR_3234 :選項 - 樂園 +STR_3235 :{SMALLFONT}{BLACK}顯示財政選項 +STR_3236 :{SMALLFONT}{BLACK}顯示遊客選項 +STR_3237 :{SMALLFONT}{BLACK}顯示樂園選項 +STR_3238 :無金錢限制 +STR_3239 :{SMALLFONT}{BLACK}將這個樂園設定為無金錢限制的樂園 +STR_3240 :{WINDOW_COLOUR_2}初始現金: +STR_3241 :{WINDOW_COLOUR_2}初始貸款額: +STR_3242 :{WINDOW_COLOUR_2}最高貸款額: +STR_3243 :{WINDOW_COLOUR_2}貸款年利率: +STR_3244 :禁止營銷計劃 +STR_3245 :{SMALLFONT}{BLACK}禁止推銷, 推廣計劃以及其他營銷計劃 STR_3246 :{WINDOW_COLOUR_2}{CURRENCY} STR_3247 :{WINDOW_COLOUR_2}{COMMA16}% -STR_3248 :Can't increase initial cash any further! -STR_3249 :Can't reduce initial cash any further! -STR_3250 :Can't increase initial loan any further! -STR_3251 :Can't reduce initial loan any further! -STR_3252 :Can't increase maximum loan size any further! -STR_3253 :Can't reduce maximum loan size any further! -STR_3254 :Can't increase interest rate any further! -STR_3255 :Can't reduce interest rate any further! -STR_3256 :Guests prefer less intense rides -STR_3257 :{SMALLFONT}{BLACK}Select whether guests should generally prefer less intense rides only -STR_3258 :Guests prefer more intense rides -STR_3259 :{SMALLFONT}{BLACK}Select whether guests should generally prefer more intense rides only -STR_3260 :{WINDOW_COLOUR_2}Cash per guest (average): -STR_3261 :{WINDOW_COLOUR_2}Guests initial happiness: -STR_3262 :{WINDOW_COLOUR_2}Guests initial hunger: -STR_3263 :{WINDOW_COLOUR_2}Guests initial thirst: -STR_3264 :Can't increase this any further! -STR_3265 :Can't reduce this any further! -STR_3266 :{SMALLFONT}{BLACK}Select how this park charges for entrance and rides -STR_3267 :Forbid tree removal -STR_3268 :{SMALLFONT}{BLACK}Forbid tall trees being removed -STR_3269 :Forbid landscape changes -STR_3270 :{SMALLFONT}{BLACK}Forbid any changes to the landscape -STR_3271 :Forbid high construction -STR_3272 :{SMALLFONT}{BLACK}Forbid any tall construction -STR_3273 :Park rating higher difficult level -STR_3274 :{SMALLFONT}{BLACK}Make the park rating value more challenging -STR_3275 :Guest generation higher difficult level -STR_3276 :{SMALLFONT}{BLACK}Make it more difficult to attract guests to the park -STR_3277 :{WINDOW_COLOUR_2}Cost to buy land: -STR_3278 :{WINDOW_COLOUR_2}Cost to buy construction rights: -STR_3279 :Free park entry / Pay per ride -STR_3280 :Pay to enter park / Free rides -STR_3281 :{WINDOW_COLOUR_2}Entry price: -STR_3282 :{SMALLFONT}{BLACK}Select objective and park name -STR_3283 :{SMALLFONT}{BLACK}Select rides to be preserved -STR_3284 :Objective Selection -STR_3285 :Preserved Rides +STR_3248 :不能再增加初始現金! +STR_3249 :不能再減少初始現金! +STR_3250 :不能再增加初始貸款額! +STR_3251 :不能再減少初始貸款額! +STR_3252 :不能再增加最高貸款額! +STR_3253 :不能再減少最高貸款額! +STR_3254 :不能再增加貸款利率! +STR_3255 :不能再減少貸款利率! +STR_3256 :遊客喜歡較溫和的遊樂設施 +STR_3257 :{SMALLFONT}{BLACK}選擇普遍遊客是否只喜歡較溫和的遊樂設施 +STR_3258 :遊客喜歡較刺激的遊樂設施 +STR_3259 :{SMALLFONT}{BLACK}選擇普遍遊客是否只喜歡較刺激的遊樂設施 +STR_3260 :{WINDOW_COLOUR_2}遊客身上現金 (平均值): +STR_3261 :{WINDOW_COLOUR_2}遊客初始快樂度: +STR_3262 :{WINDOW_COLOUR_2}遊客初始飢餓度: +STR_3263 :{WINDOW_COLOUR_2}遊客初始口渴度: +STR_3264 :不能再增加這個選項! +STR_3265 :不能再減少這個選項! +STR_3266 :{SMALLFONT}{BLACK}選擇這個樂園的收費策略 +STR_3267 :禁止移除樹木 +STR_3268 :{SMALLFONT}{BLACK}禁止移除高壯的樹木 +STR_3269 :禁止調整地型 +STR_3270 :{SMALLFONT}{BLACK}禁止對地型作任何調整 +STR_3271 :禁止高空建造 +STR_3272 :{SMALLFONT}{BLACK}禁止任何高空發展 +STR_3273 :較高難度的樂園評價公式 +STR_3274 :{SMALLFONT}{BLACK}使增加樂園評價更加有挑戰性 +STR_3275 :較難生成遊客 +STR_3276 :{SMALLFONT}{BLACK}使吸引遊客更加有挑戰性 +STR_3277 :{WINDOW_COLOUR_2}購買土地的費用: +STR_3278 :{WINDOW_COLOUR_2}購買建造權利的費用: +STR_3279 :免費進入樂園 / 需費乘搭遊樂設施 +STR_3280 :需費進入樂園 / 免費乘搭遊樂設施 +STR_3281 :{WINDOW_COLOUR_2}樂園門票價格: +STR_3282 :{SMALLFONT}{BLACK}選擇目標及樂園名稱 +STR_3283 :{SMALLFONT}{BLACK}選擇要保留的遊樂設施/店鋪 +STR_3284 :選取目標 +STR_3285 :保留遊樂設施/店鋪 STR_3286 :{SMALLFONT}{BLACK}選擇此劇情的目標 STR_3287 :{WINDOW_COLOUR_2}目標: STR_3288 :{SMALLFONT}{BLACK}選擇氣候 @@ -3325,23 +3325,23 @@ STR_3314 :請輸入這個劇情的名稱: STR_3315 :樂園/劇情的簡介 STR_3316 :請輸入這個樂園/劇情的簡介: STR_3317 :暫無簡介 -STR_3318 :{SMALLFONT}{BLACK}Select which group this scenario appears in -STR_3319 :{WINDOW_COLOUR_2}Scenario Group: -STR_3320 :Unable to save scenario file... -STR_3321 :New objects installed successfully -STR_3322 :{WINDOW_COLOUR_2}Objective: {BLACK}{STRINGID} -STR_3323 :Missing object data, ID: -STR_3324 :Requires Add-On Pack: -STR_3325 :Requires an Add-On Pack -STR_3326 :{WINDOW_COLOUR_2}(no image) -STR_3327 :Starting positions for people not set -STR_3328 :Can't advance to next editor stage... -STR_3329 :Park entrance not yet built -STR_3330 :Park must own some land -STR_3331 :Path from park entrance to map edge either not complete or too complex - Path must be single-width with as few junctions and corners as possible -STR_3332 :Park entrance is the wrong way round or has no path leading to the map edge -STR_3333 :Export plug-in objects with saved games -STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data +STR_3318 :{SMALLFONT}{BLACK}選擇這個劇情要在哪個組別中顯示 +STR_3319 :{WINDOW_COLOUR_2}劇情組別: +STR_3320 :無法儲存劇情檔案... +STR_3321 :成功安裝新物件 +STR_3322 :{WINDOW_COLOUR_2}目標: {BLACK}{STRINGID} +STR_3323 :缺少物件資料, ID為: +STR_3324 :需要資料片: +STR_3325 :需要一隻資料片 +STR_3326 :{WINDOW_COLOUR_2}(暫無圖片) +STR_3327 :尚未設定遊客的開始步行位置 +STR_3328 :不能進行下一步編輯... +STR_3329 :尚未建造樂園入口 +STR_3330 :樂園必需有一些己擁有的土地 +STR_3331 :由地圖邊緣到樂園入口的道路尚未連接好, 或者太覆雜 - 這些道路必需是一格寬度, 並以越少交界及彎位越好 +STR_3332 :樂園入口倒轉了, 或沒有道路連接至地圖邊緣 +STR_3333 :在存檔中導出附加物件 +STR_3334 :{SMALLFONT}{BLACK}選擇是否儲存附加物件(額外加入的附加物件)到存檔, 以便存檔給沒有那些附加物件的人載入 STR_3335 :雲霄飛車設計工具 - 選擇要設計的雲霄飛車的類型及車輛種類 STR_3336 :軌道設計管理工具 - 選擇要管理的遊樂設施的類型 STR_3337 :六旗樂園 @@ -3369,9 +3369,9 @@ STR_3358 :不能刪除軌道設計... STR_3359 :{BLACK}這類遊樂設施沒有已設計好的軌道設計 STR_3360 :警告! STR_3361 :這種遊樂設施擁有太多軌道設計 - 將不會列出某些軌道設計. -STR_3362 :Forced Software Buffer Mixing -STR_3363 :{SMALLFONT}{BLACK}Select this option to improve performance if the game pauses slightly when sounds start or interference is heard -STR_3364 :Advanced +STR_3362 : +STR_3363 : +STR_3364 :進階 STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups STR_3366 :{BLACK}= 遊樂設施 STR_3367 :{BLACK}= 食物店鋪 @@ -3461,9 +3461,9 @@ STR_5121 :研發 STR_5122 :(像RCT1一樣)以軌道類型選擇遊樂設施 STR_5123 :翻新遊樂設施 STR_5124 :去除"六旗"標誌 -STR_5125 :All destructable +STR_5125 :全可拆卸 STR_5126 :隨機播放主題曲 -STR_5127 :{SMALLFONT}{BLACK}Disable land elevation +STR_5127 :{SMALLFONT}{BLACK}禁止調整地勢 STR_5128 :選擇大小 STR_5129 :請輸入介於{COMMA16}及{COMMA16}的選擇大小 STR_5130 :地圖大小 @@ -3500,19 +3500,19 @@ STR_5160 :{MONTH} {STRINGID}, 第{COMMA16}年 STR_5161 :日期格式: STR_5162 :日/月/年 STR_5163 :月/日/年 -STR_5164 :Twitch Channel name -STR_5165 :Name peeps after followers -STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers -STR_5167 :Track follower peeps -STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after channel's Twitch followers -STR_5169 :Name peeps after people in Twitch chat -STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat -STR_5171 :Track chat peeps -STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after Twitch chat participants -STR_5173 :Pull Twitch chat as news -STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications -STR_5175 :Input the name of your Twitch channel -STR_5176 :Enable Twitch integration +STR_5164 :Twitch頻道名稱 +STR_5165 :以追隨者的用戶名命名遊客 +STR_5166 :{SMALLFONT}{BLACK}會以Twitch頻道的追隨者命名遊客 +STR_5167 :追蹤'追隨者'遊客 +STR_5168 :{SMALLFONT}{BLACK}會將追隨者用戶名的遊客開啟追蹤資訊 +STR_5169 :以聊天室用戶的名字命名遊客 +STR_5170 :{SMALLFONT}{BLACK}會以Twitch頻道的聊天室用戶的名字命名遊客 +STR_5171 :追蹤'聊天室用戶'遊客 +STR_5172 :{SMALLFONT}{BLACK}會將聊天室用戶名的遊客開啟追蹤資訊 +STR_5173 :將Twitch聊天室的內容推送為新聞 +STR_5174 :{SMALLFONT}{BLACK}會將Twitch聊天室所有標'!news'的內容以最近消息顯示於遊戲內 +STR_5175 :請輸入你的Twitch頻道名稱 +STR_5176 :准許Twitch頻道融合於遊戲之中 STR_5177 :全屏幕模式: STR_5178 :{SMALLFONT}{BLACK}顯示用於財政的密技 STR_5179 :{SMALLFONT}{BLACK}顯示用於遊客的密技 @@ -3523,22 +3523,22 @@ STR_5183 :Base height STR_5184 :Enter base height between {COMMA16} and {COMMA16} STR_5185 :Water level STR_5186 :Enter water level between {COMMA16} and {COMMA16} -STR_5187 :Finances -STR_5188 :New Campaign -STR_5189 :Research -STR_5190 :Map -STR_5191 :Viewport -STR_5192 :Recent News -STR_5193 :Land -STR_5194 :Water -STR_5195 :Clear Scenery -STR_5196 :Land Rights -STR_5197 :Scenery -STR_5198 :Footpath -STR_5199 :Ride Construction -STR_5200 :Track Design Place -STR_5201 :New Ride -STR_5202 :Track Design Selection +STR_5187 :財政 +STR_5188 :新的營銷計劃 +STR_5189 :研發 +STR_5190 :地圖 +STR_5191 :額外檢視視窗 +STR_5192 :最近消息 +STR_5193 :土地 +STR_5194 :水塘 +STR_5195 :清除景物 +STR_5196 :土地擁有權 +STR_5197 :景物 +STR_5198 :道路 +STR_5199 :建造遊樂設施 +STR_5200 :放置軌道設計 +STR_5201 :新的遊樂設施 +STR_5202 :選擇軌道設計 STR_5203 :遊樂設施 STR_5204 :遊樂設施列表 STR_5205 :遊客 @@ -3559,68 +3559,68 @@ STR_5219 :選項 STR_5220 :鍵盤快捷鍵 STR_5221 :更改鍵盤快捷鍵 STR_5222 :載入/儲存 -STR_5223 :Save Prompt -STR_5224 :Demolish Ride Prompt -STR_5225 :Fire Staff Prompt -STR_5226 :Track Delete Prompt -STR_5227 :Save Overwrite Prompt -STR_5228 :{SMALLFONT}{BLACK}Main UI -STR_5229 :{SMALLFONT}{BLACK}Park -STR_5230 :{SMALLFONT}{BLACK}Tools -STR_5231 :{SMALLFONT}{BLACK}Rides and Peeps -STR_5232 :{SMALLFONT}{BLACK}Editors -STR_5233 :{SMALLFONT}{BLACK}Miscellaneous -STR_5234 :{SMALLFONT}{BLACK}Prompts -STR_5235 :{SMALLFONT}{BLACK}Settings -STR_5236 :Window: -STR_5237 :Palette: +STR_5223 :儲存對話框 +STR_5224 :拆除遊樂設施對話框 +STR_5225 :解僱員工對話框 +STR_5226 :刪除軌道設計對話框 +STR_5227 :覆蓋存檔對話框 +STR_5228 :{SMALLFONT}{BLACK}主界面 +STR_5229 :{SMALLFONT}{BLACK}樂園 +STR_5230 :{SMALLFONT}{BLACK}工具 +STR_5231 :{SMALLFONT}{BLACK}遊樂設施及遊客 +STR_5232 :{SMALLFONT}{BLACK}編輯工具 +STR_5233 :{SMALLFONT}{BLACK}其他 +STR_5234 :{SMALLFONT}{BLACK}彈出視窗 +STR_5235 :{SMALLFONT}{BLACK}設定 +STR_5236 :主題: +STR_5237 :調色盤: STR_5238 :目前主題: -STR_5239 :Duplicate -STR_5240 :Enter a name for the theme -STR_5241 :Can't change this theme -STR_5242 :Theme name already exists -STR_5243 :Invalid characters used -STR_5244 :Themes -STR_5245 :Top Toolbar -STR_5246 :Bottom Toolbar -STR_5247 :Track Editor Bottom Toolbar -STR_5248 :Scenario Editor Bottom Toolbar -STR_5249 :Title Menu Buttons -STR_5250 :Title Exit Button -STR_5251 :Title Options Button -STR_5252 :Title Scenario Selection -STR_5253 :Park Information -STR_5254 :Create -STR_5255 :{SMALLFONT}{BLACK}Create a new title sequence from scratch -STR_5256 :Create a new theme to make changes to -STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one -STR_5258 :{SMALLFONT}{BLACK}Delete the current theme -STR_5259 :{SMALLFONT}{BLACK}Rename the current theme +STR_5239 :複製 +STR_5240 :請輸入這個主題的名稱 +STR_5241 :不能改變這個主題 +STR_5242 :主題名稱已經存在 +STR_5243 :使用了不適合的字符 +STR_5244 :主題 +STR_5245 :頂部工具列 +STR_5246 :底部工具列 +STR_5247 :雲霄飛車設計工具的底部工具列 +STR_5248 :劇情編輯工具的底部工具列 +STR_5249 :主選單的選單按鈕 +STR_5250 :主選單的'離開遊戲'按鈕 +STR_5251 :主選單的'選項'按鈕 +STR_5252 :主選單的'劇情選擇'視窗 +STR_5253 :樂園資訊 +STR_5254 :建立 +STR_5255 :{SMALLFONT}{BLACK}建立全新的主選單動畫 +STR_5256 :建立新的主題, 並作出更改 +STR_5257 :{SMALLFONT}{BLACK}以這個主題作為基礎, 建立新的主題 +STR_5258 :{SMALLFONT}{BLACK}刪除這個主題 +STR_5259 :{SMALLFONT}{BLACK}重命名這個主題 STR_5260 :巨型截圖 -STR_5261 :Filter -STR_5262 :Wacky Worlds -STR_5263 :Time Twister -STR_5264 :Custom -STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible -STR_5266 :{SMALLFONT}{BLACK}Display -STR_5267 :{SMALLFONT}{BLACK}Culture and Units -STR_5268 :{SMALLFONT}{BLACK}Audio -STR_5269 :{SMALLFONT}{BLACK}Controls -STR_5270 :{SMALLFONT}{BLACK}Miscellaneous +STR_5261 :過濾 +STR_5262 :瘋狂世界 (WW) +STR_5263 :時空歷險 (TT) +STR_5264 :自訂 +STR_5265 :{SMALLFONT}{BLACK}選擇哪些內容來源的物件為可視 +STR_5266 :{SMALLFONT}{BLACK}顯示 +STR_5267 :{SMALLFONT}{BLACK}語言及單位 +STR_5268 :{SMALLFONT}{BLACK}音效 +STR_5269 :{SMALLFONT}{BLACK}控制及界面 +STR_5270 :{SMALLFONT}{BLACK}其他 STR_5271 :{SMALLFONT}{BLACK}Twitch -STR_5272 :{SMALLFONT}{BLACK}Small Scenery -STR_5273 :{SMALLFONT}{BLACK}Large Scenery -STR_5274 :{SMALLFONT}{BLACK}Footpath +STR_5272 :{SMALLFONT}{BLACK}小型景物 +STR_5273 :{SMALLFONT}{BLACK}大型景物 +STR_5274 :{SMALLFONT}{BLACK}道路 STR_5275 :搜尋物件 STR_5276 :請輸入你要搜尋的物件名稱 STR_5277 :清除 STR_5278 :沙盒模式 STR_5279 :沙盒模式關閉 -STR_5280 :{SMALLFONT}{BLACK}Allow editing land ownership settings through the Map window and other options that are normally restricted to the Scenario Editor -STR_5281 :{SMALLFONT}{BLACK}Features -STR_5282 :RCT1 Ride Open/Close Lights -STR_5283 :RCT1 Park Open/Close Lights -STR_5284 :RCT1 Scenario Selection Font +STR_5280 :{SMALLFONT}{BLACK}允許從地圖視窗中修改土地擁有權, 以及其他平常只適用於劇情編輯工具的選項 +STR_5281 :{SMALLFONT}{BLACK}功能 +STR_5282 :夢幻遊樂場 (RCT1)遊樂設施開關燈號 +STR_5283 :夢幻遊樂場 (RCT1)樂園開關燈號 +STR_5284 :夢幻遊樂場 (RCT1)選擇劇情字體 STR_5285 :人肉炸彈!!! STR_5286 :{SMALLFONT}{BLACK}將某些遊客爆炸,嘻嘻! STR_5287 :遊樂設施已經故障了 @@ -3651,26 +3651,27 @@ STR_5311 :{SMALLFONT}{BLACK}除錯工具 STR_5312 :顯示命名行 STR_5313 :Show tile inspector STR_5314 :Tile inspector -STR_5315 :Grass -STR_5316 :Sand -STR_5317 :Dirt -STR_5318 :Rock -STR_5319 :Martian -STR_5320 :Checkerboard -STR_5321 :Grass clumps -STR_5322 :Ice -STR_5323 :Grid (red) -STR_5324 :Grid (yellow) -STR_5325 :Grid (blue) -STR_5326 :Grid (green) -STR_5327 :Sand (dark) -STR_5328 :Sand (light) -STR_5329 :Checkerboard (inverted) -STR_5330 :Underground view -STR_5331 :Rock -STR_5332 :Wood (red) -STR_5333 :Wood (black) -STR_5334 :Ice +STR_5315 :草地 +STR_5316 :沙地 +STR_5317 :泥地 +STR_5318 :石地 +STR_5319 :火星 +STR_5320 :棋盤 +STR_5321 :雜草叢生草地 +STR_5322 :雪地 +STR_5323 :網格 (紅色) +STR_5324 :網格 (黃色) +STR_5325 :網格 (藍色) +STR_5326 :網格 (綠色) +STR_5327 :沙地 (較暗) +STR_5328 :沙地 (較淺) +STR_5329 :棋盤 (反轉) +STR_5330 :地底檢視模式 +STR_5330 :地底檢視模式 +STR_5331 :石地 +STR_5332 :木地 (紅色) +STR_5333 :木地 (黑色) +STR_5334 :雪地 STR_5335 :遊樂設施入口 STR_5336 :遊樂設施出口 STR_5337 :樂園入口 @@ -3705,84 +3706,84 @@ STR_5365 :{BLACK}員工行走速度: STR_5366 :正常 STR_5367 :快速 STR_5368 :重設毀壞狀態 -STR_5369 :Park parameters... -STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. -STR_5371 :Object Selection -STR_5372 :Invert right mouse dragging -STR_5373 :Name {STRINGID} -STR_5374 :Date {STRINGID} +STR_5369 :樂園參數... +STR_5370 :{SMALLFONT}{BLACK}按此來修改樂園參數{NEWLINE}例如有關限制, 生成遊客{NEWLINE}及金錢的選項 +STR_5371 :選取物件 +STR_5372 :滑鼠左鍵拖拉 +STR_5373 :名稱 {STRINGID} +STR_5374 :日期 {STRINGID} STR_5375 :{UP} STR_5376 :{DOWN} -STR_5377 :{SMALLFONT}{BLACK}Saves -STR_5378 :{SMALLFONT}{BLACK}Script -STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command -STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence -STR_5381 :{SMALLFONT}{BLACK}Stop playing title sequence -STR_5382 :{SMALLFONT}{BLACK}Restart title sequence -STR_5383 :{SMALLFONT}{BLACK}Create a new title sequence based on the current one -STR_5384 :{SMALLFONT}{BLACK}Delete the current title sequence -STR_5385 :{SMALLFONT}{BLACK}Rename the current title sequence -STR_5386 :{SMALLFONT}{BLACK}Insert a new command -STR_5387 :{SMALLFONT}{BLACK}Edit the selected command -STR_5388 :{SMALLFONT}{BLACK}Delete the selected command -STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence -STR_5390 :{SMALLFONT}{BLACK}Move the selected command down -STR_5391 :{SMALLFONT}{BLACK}Move the selected command up -STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence -STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence -STR_5394 :{SMALLFONT}{BLACK}Rename the selected save -STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game -STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game -STR_5397 :Can only be used on the title screen -STR_5398 :Cannot edit title sequence while it's playing -STR_5399 :Press the stop button to continue editing -STR_5400 :Can't change this title sequence -STR_5401 :Create a new title sequence to make changes to -STR_5402 :Failed to load title sequence -STR_5403 :There may be no Load or Wait command or a save may be invalid -STR_5404 :Name already exists -STR_5405 :Enter a name for the save -STR_5406 :Enter a name for the title sequence -STR_5407 :Add -STR_5408 :Remove -STR_5409 :Insert -STR_5410 :Edit -STR_5411 :Reload -STR_5412 :Skip to -STR_5413 :Load -STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6 -STR_5415 :Load{MOVE_X}{87}{STRING} -STR_5416 :Load{MOVE_X}{87}No save selected -STR_5417 :Location -STR_5418 :Location{MOVE_X}{87}{COMMA16} {COMMA16} -STR_5419 :Rotate -STR_5420 :Rotate{MOVE_X}{87}{COMMA16} -STR_5421 :Zoom -STR_5422 :Zoom{MOVE_X}{87}{COMMA16} -STR_5423 :Wait -STR_5424 :Wait{MOVE_X}{87}{COMMA16} -STR_5425 :Restart -STR_5426 :End -STR_5427 :Coordinates: -STR_5428 :Anticlockwise rotations: -STR_5429 :Zoom level: -STR_5430 :Seconds to wait: -STR_5431 :Save to load: -STR_5432 :Command: -STR_5433 :Title Sequences -STR_5434 :Command Editor -STR_5435 :Rename save -STR_5436 :Edit Title Sequences... -STR_5437 :No save selected -STR_5438 :Can't make changes while command editor is open -STR_5439 :A wait command with at least 4 seconds is required with a restart command -STR_5440 :Minimise fullscreen on focus loss -STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. +STR_5377 :{SMALLFONT}{BLACK}儲存 +STR_5378 :{SMALLFONT}{BLACK}主選單動畫劇本 +STR_5379 :{SMALLFONT}{BLACK}跳至下一個等待(Wait)命令 +STR_5380 :{SMALLFONT}{BLACK}開始播放此選單動畫 +STR_5381 :{SMALLFONT}{BLACK}停止播放此主選單動畫 +STR_5382 :{SMALLFONT}{BLACK}重新開始播放此主選單動畫 +STR_5383 :{SMALLFONT}{BLACK}以這個主選單動畫作為基礎, 建立新的主選單動畫 +STR_5384 :{SMALLFONT}{BLACK}刪除這個主選單動畫 +STR_5385 :{SMALLFONT}{BLACK}重命名這個主選單動畫 +STR_5386 :{SMALLFONT}{BLACK}插入新的命令 +STR_5387 :{SMALLFONT}{BLACK}編輯選中的命令 +STR_5388 :{SMALLFONT}{BLACK}刪除選中的命令 +STR_5389 :{SMALLFONT}{BLACK}將播放中的主選單動畫跳至選中的命令 +STR_5390 :{SMALLFONT}{BLACK}將選中的命令移到下方 +STR_5391 :{SMALLFONT}{BLACK}將選中的命令移到上方 +STR_5392 :{SMALLFONT}{BLACK}添加存檔到此主選單動畫 +STR_5393 :{SMALLFONT}{BLACK}從此主選單動畫中移除選中的存檔 +STR_5394 :{SMALLFONT}{BLACK}重命名選中的存檔 +STR_5395 :{SMALLFONT}{BLACK}載入選中的存檔 +STR_5396 :{SMALLFONT}{BLACK}重新載入此主選單動畫劇本, 以便顯示在遊戲外作出的改變 +STR_5397 :只可以用於主選單中 +STR_5398 :不能在主選單動畫時編輯其劇本 +STR_5399 :按'暫停'按鈕繼續編輯 +STR_5400 :不能更改此主選單動畫 +STR_5401 :建立新的主選單動畫, 並作出更改 +STR_5402 :載入主選單動畫失敗 +STR_5403 :非法的存檔或沒有'Load'或'Wait'指令 +STR_5404 :名稱已經存在 +STR_5405 :請輸入存檔名稱 +STR_5406 :請輸入主選單動畫存檔名稱 +STR_5407 :增加 +STR_5408 :移除 +STR_5409 :插入 +STR_5410 :編輯 +STR_5411 :重新載入 +STR_5412 :跳至 +STR_5413 :載入 +STR_5414 :載入{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :載入{MOVE_X}{87}{STRING} +STR_5416 :載入{MOVE_X}{87}無存檔被選中 +STR_5417 :定位 +STR_5418 :定位{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :旋轉 +STR_5420 :旋轉{MOVE_X}{87}{COMMA16} +STR_5421 :放大 +STR_5422 :放大{MOVE_X}{87}{COMMA16} +STR_5423 :等候 +STR_5424 :等候{MOVE_X}{87}{COMMA16} +STR_5425 :重新開始 +STR_5426 :結束 +STR_5427 :座標: +STR_5428 :逆時計轉動次數: +STR_5429 :放大等級: +STR_5430 :等待秒數: +STR_5431 :要載入的存檔: +STR_5432 :命令: +STR_5433 :主選單動畫 +STR_5434 :命令編輯工具 +STR_5435 :重命名存檔 +STR_5436 :修改主選單動畫... +STR_5437 :暫無存檔被選中 +STR_5438 :當命令編輯工具開啟不能作出改變 +STR_5439 :4秒以上的等待(Wait)命令需要加上重新開始(Restart)命令 +STR_5440 :當焦點失去時最小化全螢幕的遊戲 +STR_5441 :{SMALLFONT}{BLACK}以軌道類別分別遊樂設施,{NEWLINE}令到車輔風格可以在建造後更改,(RCT1){NEWLINE}就像夢幻遊樂園1一樣. STR_5442 :固定樂園評價: STR_5443 :速度{MOVE_X}{87}{STRINGID} STR_5444 :速度: STR_5445 :速度 -STR_5446 :Get +STR_5446 :獲取 STR_5447 :Type {STRINGID} STR_5448 :Ride / Vehicle {STRINGID} STR_5449 :減慢遊戲速度 @@ -3805,12 +3806,12 @@ STR_5465 :氣候 STR_5466 :員工 STR_5467 :ALT + STR_5468 :最近消息 -STR_5469 :Scroll map up -STR_5470 :Scroll map left -STR_5471 :Scroll map down -STR_5472 :Scroll map right -STR_5473 :日與夜循環 -STR_5474 :Display text on banners in upper case +STR_5469 :向上捲動地圖 +STR_5470 :向左捲動地圖 +STR_5471 :向下捲動地圖 +STR_5472 :向右捲動地圖 +STR_5473 :循環日與夜 +STR_5474 :於橫額中顯示全大寫英文 STR_5475 :{COMMA16}週 STR_5476 :硬件 STR_5477 :地圖顯示 @@ -3819,3 +3820,5 @@ STR_5479 :工具列 STR_5480 :顯示工具列按鈕: STR_5481 :主題 STR_5482 :{WINDOW_COLOUR_2}上次檢查時間: {BLACK} 1分鐘前 +STR_5483 :{BLACK}(還剩{COMMA16}週結束) +STR_5484 :{BLACK}(還剩{COMMA16}週結束) From 238a632bd6b62feae730288944721bfafe8f5e80 Mon Sep 17 00:00:00 2001 From: Krutonium Date: Wed, 29 Jul 2015 01:11:25 -0400 Subject: [PATCH 0390/1173] Add cmake to install.sh Mostly because it isn't installed and needs to be. --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 0f2408cb4a..22fd15a6a3 100755 --- a/install.sh +++ b/install.sh @@ -73,7 +73,7 @@ if [[ `uname` == "Darwin" ]]; then popd fi elif [[ `uname` == "Linux" ]]; then - sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 + sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake fi if [[ ! -f $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz ]]; then From f12cbeb22beaa660266d142d0d978800faceb8de Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 29 Jul 2015 08:43:04 +0200 Subject: [PATCH 0391/1173] Rename var_6C to flags2 and put all know flags of it into an enum --- src/ride/track.c | 4 ++-- src/ride/track.h | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index 5a2172e5bc..d8fe740f24 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -2711,7 +2711,7 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra track_design->flags |= (1 << 31); if (track->type == TRACK_ELEM_LOG_FLUME_REVERSER) - track_design->var_6C |= (1 << 1); + track_design->flags2 |= TRACK_FLAGS2_CONTAINS_LOG_FLUME_REVERSER; uint8 bh; if (track->type == TRACK_ELEM_BRAKES){ @@ -2929,7 +2929,7 @@ int ride_to_td6(uint8 rideIndex){ track_design->upkeep_cost = ride->upkeep_cost; track_design->flags = 0; - track_design->var_6C = 0; + track_design->flags2 = 0; uint8* track_elements = RCT2_ADDRESS(0x9D821B, uint8); memset(track_elements, 0, 8000); diff --git a/src/ride/track.h b/src/ride/track.h index 52856d520b..241fad4a65 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -173,7 +173,7 @@ typedef struct { uint8 track_spine_colour[4]; // 0x60 uint8 track_rail_colour[4]; // 0x64 uint8 track_support_colour[4]; // 0x68 - uint32 var_6C; // some extra flags. (1 << 31) was used to mark the TD6 as a Six Flags ride. + uint32 flags2; // 0x6C rct_object_entry vehicle_object; // 0x70 uint8 space_required_x; // 0x80 uint8 space_required_y; // 0x81 @@ -186,6 +186,10 @@ typedef struct{ uint8 preview[4][TRACK_PREVIEW_IMAGE_SIZE]; // 0xA3 } rct_track_design; +enum { + TRACK_FLAGS2_CONTAINS_LOG_FLUME_REVERSER = (1 << 1), + TRACK_FLAGS2_SIX_FLAGS_RIDE_DEPRECATED = (1 << 31) // Not used anymore. +}; enum { TRACK_NONE = 0, From e16b6fb2d0701c1a44bc1598ba17d9e4c93b2d01 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Wed, 29 Jul 2015 08:46:32 +0200 Subject: [PATCH 0392/1173] GB: Fix use of American English --- data/language/english_uk.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index cd67310736..c08c63c1d7 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -836,7 +836,7 @@ STR_0831 :{SMALLFONT}{BLACK}Zoom view out STR_0832 :{SMALLFONT}{BLACK}Rotate view 90{DEGREE} clockwise STR_0833 :{SMALLFONT}{BLACK}Pause game STR_0834 :{SMALLFONT}{BLACK}Disk and game options -STR_0835 :Game initialization failed +STR_0835 :Game initialisation failed STR_0836 :Unable to start game in a minimised state STR_0837 :Unable to initialise graphics system STR_0838 : @@ -2813,9 +2813,9 @@ STR_2802 :Map STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map STR_2805 :{SMALLFONT}{BLACK}Show map of park -STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organizing them better -STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organizing them better -STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better +STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organising them better STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks STR_2811 :{RED}Guests are complaining because they can't find the toilets in your park From e7b36632c5fb88053c705ee8c8ace162209536ac Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 29 Jul 2015 10:43:13 +0200 Subject: [PATCH 0393/1173] Reinstate Reverse Inclined Shuttle for Junior RC (like in RCT1), fix comments and whitespace --- src/ride/ride_data.c | 228 +++++++++++++++++++++---------------------- 1 file changed, 114 insertions(+), 114 deletions(-) diff --git a/src/ride/ride_data.c b/src/ride/ride_data.c index 593eaac1c8..6a4962793b 100644 --- a/src/ride/ride_data.c +++ b/src/ride/ride_data.c @@ -4,7 +4,7 @@ * * Data source is 0x0097E3AC * - * Generating function is here + * Generating function is here * https://gist.github.com/kevinburke/eaeb1d8149a6eef0dcc1 */ @@ -20,7 +20,7 @@ const bool hasRunningTrack[0x60] = { true, // 5 Mini Railroad true, // 6 Monorail true, // 7 Mini Suspended Coaster - false, // 8 Bumper Boats + false, // 8 Boat Ride true, // 9 Wooden Wild Mine/Mouse true, // a Steeplechase/Motorbike/Soap Box Derby true, // b Car Ride @@ -52,7 +52,7 @@ const bool hasRunningTrack[0x60] = { false, // 25 Ferris Wheel false, // 26 Motion Simulator false, // 27 3D Cinema - false, // 28 Gravitron + false, // 28 Topspin false, // 29 Space Rings true, // 2a Reverse Freefall Coaster true, // 2b Elevator @@ -120,7 +120,7 @@ const uint8 initialUpkeepCosts[0x60] = { 60, // 05 Mini Railroad 65, // 06 Monorail 40, // 07 Mini Suspended Coaster - 50, // 08 Bumper Boats + 50, // 08 Boat Ride 40, // 09 Wooden Wild Mine/Mouse 40, // 0a Steeplechase/Motorbike/Soap Box Derby 70, // 0b Car Ride @@ -152,7 +152,7 @@ const uint8 initialUpkeepCosts[0x60] = { 50, // 25 Ferris Wheel 50, // 26 Motion Simulator 50, // 27 3D Cinema - 50, // 28 Gravitron + 50, // 28 Topspin 50, // 29 Space Rings 80, // 2a Reverse Freefall Coaster 50, // 2b Elevator @@ -213,7 +213,7 @@ const uint8 costPerTrackPiece[0x60] = { 0, // 05 Mini Railroad 0, // 06 Monorail 80, // 07 Mini Suspended Coaster - 0, // 08 Bumper Boats + 0, // 08 Boat Ride 80, // 09 Wooden Wild Mine/Mouse 80, // 0a Steeplechase/Motorbike/Soap Box Derby 0, // 0b Car Ride @@ -245,7 +245,7 @@ const uint8 costPerTrackPiece[0x60] = { 0, // 25 Ferris Wheel 0, // 26 Motion Simulator 0, // 27 3D Cinema - 0, // 28 Gravitron + 0, // 28 Topspin 0, // 29 Space Rings 0, // 2a Reverse Freefall Coaster 0, // 2b Elevator @@ -309,7 +309,7 @@ const uint8 rideUnknownData1[0x60] = { 10, // 05 Mini Railroad 10, // 06 Monorail 10, // 07 Mini Suspended Coaster - 4, // 08 Bumper Boats + 4, // 08 Boat Ride 9, // 09 Wooden Wild Mine/Mouse 10, // 0a Steeplechase/Motorbike/Soap Box Derby 8, // 0b Car Ride @@ -341,7 +341,7 @@ const uint8 rideUnknownData1[0x60] = { 0, // 25 Ferris Wheel 0, // 26 Motion Simulator 0, // 27 3D Cinema - 0, // 28 Gravitron + 0, // 28 Topspin 0, // 29 Space Rings 0, // 2a Reverse Freefall Coaster 10, // 2b Elevator @@ -406,7 +406,7 @@ const bool rideUnknownData2[0x60] = { true, // 05 Mini Railroad true, // 06 Monorail true, // 07 Mini Suspended Coaster - false, // 08 Bumper Boats + false, // 08 Boat Ride true, // 09 Wooden Wild Mine/Mouse true, // 0a Steeplechase/Motorbike/Soap Box Derby true, // 0b Car Ride @@ -438,7 +438,7 @@ const bool rideUnknownData2[0x60] = { false, // 25 Ferris Wheel false, // 26 Motion Simulator false, // 27 3D Cinema - false, // 28 Gravitron + false, // 28 Topspin false, // 29 Space Rings false, // 2a Reverse Freefall Coaster false, // 2b Elevator @@ -500,7 +500,7 @@ const uint8 rideUnknownData3[0x60] = { 5, // 05 Mini Railroad 10, // 06 Monorail 10, // 07 Mini Suspended Coaster - 0, // 08 Bumper Boats + 0, // 08 Boat Ride 10, // 09 Wooden Wild Mine/Mouse 10, // 0a Steeplechase/Motorbike/Soap Box Derby 5, // 0b Car Ride @@ -532,7 +532,7 @@ const uint8 rideUnknownData3[0x60] = { 0, // 25 Ferris Wheel 0, // 26 Motion Simulator 0, // 27 3D Cinema - 0, // 28 Gravitron + 0, // 28 Topspin 0, // 29 Space Rings 10, // 2a Reverse Freefall Coaster 0, // 2b Elevator @@ -593,7 +593,7 @@ const rct_ride_name_convention RideNameConvention[96] = { { 1229, 1243, 1257, 0 }, // 05 Mini Railroad { 1229, 1243, 1257, 0 }, // 06 Monorail { 1264, 1243, 1257, 0 }, // 07 Mini Suspended Coaster - { 1236, 1250, 1250, 0 }, // 08 Bumper Boats + { 1236, 1250, 1250, 0 }, // 08 Boat Ride { 1264, 1243, 1257, 0 }, // 09 Wooden Wild Mine/Mouse { 1264, 1243, 1257, 0 }, // 0a Steeplechase/Motorbike/Soap Box Derby { 1264, 1243, 1257, 0 }, // 0b Car Ride @@ -625,7 +625,7 @@ const rct_ride_name_convention RideNameConvention[96] = { { 1299, 1278, 1257, 0 }, // 25 Ferris Wheel { 1264, 1278, 1257, 0 }, // 26 Motion Simulator { 1271, 1278, 1257, 0 }, // 27 3D Cinema - { 1264, 1278, 1257, 0 }, // 28 Gravitron + { 1264, 1278, 1257, 0 }, // 28 Topspin { 1306, 1278, 1257, 0 }, // 29 Space Rings { 1264, 1243, 1257, 0 }, // 2a Reverse Freefall Coaster { 1292, 1243, 1257, 0 }, // 2b Elevator @@ -684,11 +684,11 @@ const uint8 RideAvailableModes[] = { RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 01 Stand Up Coaster RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 02 Suspended Swinging RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 03 Inverted - RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 04 Steel Mini Coaster + RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE, 0xFF, // 04 Steel Mini Coaster RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_SHUTTLE, 0xFF, // 05 Mini Railroad RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_SHUTTLE, 0xFF, // 06 Monorail RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 07 Mini Suspended Coaster - RIDE_MODE_BOAT_HIRE, 0xFF, // 08 Bumper Boats + RIDE_MODE_BOAT_HIRE, 0xFF, // 08 Boat Ride RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 09 Wooden Wild Mine/Mouse RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 0A Steeplechase/Motorbike/Soap Box Derby RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 0B Car Ride @@ -720,7 +720,7 @@ const uint8 RideAvailableModes[] = { RIDE_MODE_FORWARD_ROTATION, RIDE_MODE_BACKWARD_ROTATION, 0xFF, // 25 Ferris Wheel RIDE_MODE_FILM_AVENGING_AVIATORS, RIDE_MODE_FILM_THRILL_RIDERS, 0xFF, // 26 Motion Simulator RIDE_MODE_3D_FILM_MOUSE_TAILS, RIDE_MODE_3D_FILM_STORM_CHASERS, RIDE_MODE_3D_FILM_SPACE_RAIDERS, 0xFF, // 27 3D Cinema - RIDE_MODE_BEGINNERS, RIDE_MODE_INTENSE, RIDE_MODE_BERSERK, 0xFF, // 28 Gravitron + RIDE_MODE_BEGINNERS, RIDE_MODE_INTENSE, RIDE_MODE_BERSERK, 0xFF, // 28 Topspin RIDE_MODE_SPACE_RINGS, 0xFF, // 29 Space Rings RIDE_MODE_LIM_POWERED_LAUNCH, 0xFF, // 2A Reverse Freefall Coaster RIDE_MODE_SHUTTLE, 0xFF, // 2B Elevator @@ -769,8 +769,8 @@ const uint8 RideAvailableModes[] = { RIDE_MODE_POWERED_LAUNCH_PASSTROUGH, RIDE_MODE_POWERED_LAUNCH, 0xFF, // 56 Inverted Impulse Coaster RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 57 Mini Roller Coaster RIDE_MODE_CONTINUOUS_CIRCUIT, 0xFF, // 58 Mine Ride - RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 59 LIM Launched Roller Coaster - RIDE_MODE_POWERED_LAUNCH_PASSTROUGH, RIDE_MODE_POWERED_LAUNCH, RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED, 0xFF // 60 (none) + RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, 0xFF, // 59 Unknown + RIDE_MODE_POWERED_LAUNCH_PASSTROUGH, RIDE_MODE_POWERED_LAUNCH, RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED, 0xFF // 60 LIM Launched Roller Coaster }; const uint8 RideAvailableBreakdowns[] = { @@ -782,7 +782,7 @@ const uint8 RideAvailableBreakdowns[] = { (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), // 05 Mini Railroad (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_DOORS_STUCK_CLOSED) | (1 << BREAKDOWN_DOORS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), // 06 Monorail (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), // 07 Mini Suspended Coaster - (1 << BREAKDOWN_VEHICLE_MALFUNCTION), // 08 Bumper Boats + (1 << BREAKDOWN_VEHICLE_MALFUNCTION), // 08 Boat Ride (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), // 09 Wooden Wild Mine/Mouse (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), // 0A Steeplechase/Motorbike/Soap Box Derby (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), // 0B Car Ride @@ -814,7 +814,7 @@ const uint8 RideAvailableBreakdowns[] = { (1 << BREAKDOWN_SAFETY_CUT_OUT), // 25 Ferris Wheel (1 << BREAKDOWN_SAFETY_CUT_OUT), // 26 Motion Simulator (1 << BREAKDOWN_SAFETY_CUT_OUT), // 27 3D Cinema - (1 << BREAKDOWN_SAFETY_CUT_OUT), // 28 Gravitron + (1 << BREAKDOWN_SAFETY_CUT_OUT), // 28 Topspin (1 << BREAKDOWN_SAFETY_CUT_OUT), // 29 Space Rings (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), // 2A Reverse Freefall Coaster (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_DOORS_STUCK_CLOSED) | (1 << BREAKDOWN_DOORS_STUCK_OPEN), // 2B Elevator @@ -863,8 +863,8 @@ const uint8 RideAvailableBreakdowns[] = { (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), // 56 Inverted Impulse Coaster (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), // 57 Mini Roller Coaster (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), // 58 Mine Ride - (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), // 59 LIM Launched Roller Coaster - (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE) // 60 (none) + (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), // 59 Unknown + (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE) // 60 LIM Launched Roller Coaster }; const rct_ride_entrance_definition RideEntranceDefinitions[12] = { @@ -884,94 +884,94 @@ const rct_ride_entrance_definition RideEntranceDefinitions[12] = { // Data read from 0x0097D7C9 4 bytes at a time const uint8 RideLiftHillAdjustments[0x60] = { - 7, // Spiral Roller coaster - 4, // Stand Up Coaster - 4, // Suspended Swinging - 5, // Inverted - 4, // Steel Mini Coaster - 5, // Mini Railroad - 5, // Monorail - 4, // Mini Suspended Coaster - 5, // Bumper Boats - 4, // Wooden Wild Mine/Mouse - 4, // Steeplechase/Motorbike/Soap Box Derby - 5, // Car Ride - 5, // Launched Freefall - 4, // Bobsleigh Coaster - 5, // Observation Tower - 4, // Looping Roller Coaster - 4, // Dinghy Slide - 4, // Mine Train Coaster - 5, // Chairlift - 4, // Corkscrew Roller Coaster - 5, // Maze - 5, // Spiral Slide - 5, // Go Karts - 5, // Log Flume - 5, // River Rapids - 5, // Bumper Cars - 5, // Pirate Ship - 5, // Swinging Inverter Ship - 5, // Food Stall - 5, // (none) - 5, // Drink Stall - 5, // (none) - 5, // Shop (all types) - 5, // Merry Go Round - 5, // Balloon Stall (maybe) - 5, // Information Kiosk - 5, // Bathroom - 5, // Ferris Wheel - 5, // Motion Simulator - 5, // 3D Cinema - 5, // Gravitron - 5, // Space Rings - 5, // Reverse Freefall Coaster - 5, // Elevator - 4, // Vertical Drop Roller Coaster - 5, // ATM - 5, // Twist - 5, // Haunted House - 5, // First Aid - 5, // Circus Show - 5, // Ghost Train - 5, // Twister Roller Coaster - 5, // Wooden Roller Coaster - 3, // Side-Friction Roller Coaster - 4, // Wild Mouse - 4, // Multi Dimension Coaster - 4, // (none) - 4, // Flying Roller Coaster - 4, // (none) - 3, // Virginia Reel - 5, // Splash Boats - 5, // Mini Helicopters - 4, // Lay-down Roller Coaster - 5, // Suspended Monorail - 4, // (none) - 3, // Reverser Roller Coaster - 4, // Heartline Twister Roller Coaster - 5, // Mini Golf - 5, // Giga Coaster - 5, // Roto-Drop - 5, // Flying Saucers - 5, // Crooked House - 5, // Monorail Cycles - 4, // Compact Inverted Coaster - 4, // Water Coaster - 5, // Air Powered Vertical Coaster - 4, // Inverted Hairpin Coaster - 5, // Magic Carpet - 5, // Submarine Ride - 5, // River Rafts - 5, // (none) - 5, // Enterprise - 5, // (none) - 5, // (none) - 5, // (none) - 4, // (none) - 4, // Inverted Impulse Coaster - 4, // Mini Roller Coaster - 5, // Mine Ride - 4 // LIM Launched Roller Coaster + 7, // Spiral Roller coaster + 4, // Stand Up Coaster + 4, // Suspended Swinging + 5, // Inverted + 4, // Steel Mini Coaster + 5, // Mini Railroad + 5, // Monorail + 4, // Mini Suspended Coaster + 5, // Boat Ride + 4, // Wooden Wild Mine/Mouse + 4, // Steeplechase/Motorbike/Soap Box Derby + 5, // Car Ride + 5, // Launched Freefall + 4, // Bobsleigh Coaster + 5, // Observation Tower + 4, // Looping Roller Coaster + 4, // Dinghy Slide + 4, // Mine Train Coaster + 5, // Chairlift + 4, // Corkscrew Roller Coaster + 5, // Maze + 5, // Spiral Slide + 5, // Go Karts + 5, // Log Flume + 5, // River Rapids + 5, // Bumper Cars + 5, // Pirate Ship + 5, // Swinging Inverter Ship + 5, // Food Stall + 5, // (none) + 5, // Drink Stall + 5, // (none) + 5, // Shop (all types) + 5, // Merry Go Round + 5, // Balloon Stall (maybe) + 5, // Information Kiosk + 5, // Bathroom + 5, // Ferris Wheel + 5, // Motion Simulator + 5, // 3D Cinema + 5, // Topspin + 5, // Space Rings + 5, // Reverse Freefall Coaster + 5, // Elevator + 4, // Vertical Drop Roller Coaster + 5, // ATM + 5, // Twist + 5, // Haunted House + 5, // First Aid + 5, // Circus Show + 5, // Ghost Train + 5, // Twister Roller Coaster + 5, // Wooden Roller Coaster + 3, // Side-Friction Roller Coaster + 4, // Wild Mouse + 4, // Multi Dimension Coaster + 4, // (none) + 4, // Flying Roller Coaster + 4, // (none) + 3, // Virginia Reel + 5, // Splash Boats + 5, // Mini Helicopters + 4, // Lay-down Roller Coaster + 5, // Suspended Monorail + 4, // (none) + 3, // Reverser Roller Coaster + 4, // Heartline Twister Roller Coaster + 5, // Mini Golf + 5, // Giga Coaster + 5, // Roto-Drop + 5, // Flying Saucers + 5, // Crooked House + 5, // Monorail Cycles + 4, // Compact Inverted Coaster + 4, // Water Coaster + 5, // Air Powered Vertical Coaster + 4, // Inverted Hairpin Coaster + 5, // Magic Carpet + 5, // Submarine Ride + 5, // River Rafts + 5, // (none) + 5, // Enterprise + 5, // (none) + 5, // (none) + 5, // (none) + 4, // (none) + 4, // Inverted Impulse Coaster + 4, // Mini Roller Coaster + 5, // Mine Ride + 4 // LIM Launched Roller Coaster }; From a89cee3abf370d030ed404a3990c64bacc4bfd3c Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 29 Jul 2015 11:04:38 +0200 Subject: [PATCH 0394/1173] Fix scrollbar getting stuck on large lists --- src/interface/window.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/interface/window.h b/src/interface/window.h index 6e1d617eec..1ec2837736 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -92,14 +92,14 @@ typedef struct { */ typedef struct { uint16 flags; // 0x00 - sint16 h_left; // 0x02 - sint16 h_right; // 0x04 - sint16 h_thumb_left; // 0x06 - sint16 h_thumb_right; // 0x08 - sint16 v_top; // 0x0A - sint16 v_bottom; // 0x0C - sint16 v_thumb_top; // 0x0E - sint16 v_thumb_bottom; // 0x10 + sint32 h_left; // 0x02 + sint32 h_right; // 0x04 + sint32 h_thumb_left; // 0x06 + sint32 h_thumb_right; // 0x08 + sint32 v_top; // 0x0A + sint32 v_bottom; // 0x0C + sint32 v_thumb_top; // 0x0E + sint32 v_thumb_bottom; // 0x10 } rct_scroll; /** From 7a445467a4a16a5659babf74167ddd2aa24de9ef Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 29 Jul 2015 16:53:04 +0200 Subject: [PATCH 0395/1173] Use unsigned 16-bit integer --- src/interface/window.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/interface/window.h b/src/interface/window.h index 1ec2837736..a942bc1b7c 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -92,14 +92,14 @@ typedef struct { */ typedef struct { uint16 flags; // 0x00 - sint32 h_left; // 0x02 - sint32 h_right; // 0x04 - sint32 h_thumb_left; // 0x06 - sint32 h_thumb_right; // 0x08 - sint32 v_top; // 0x0A - sint32 v_bottom; // 0x0C - sint32 v_thumb_top; // 0x0E - sint32 v_thumb_bottom; // 0x10 + uint16 h_left; // 0x02 + uint16 h_right; // 0x04 + uint16 h_thumb_left; // 0x06 + uint16 h_thumb_right; // 0x08 + uint16 v_top; // 0x0A + uint16 v_bottom; // 0x0C + uint16 v_thumb_top; // 0x0E + uint16 v_thumb_bottom; // 0x10 } rct_scroll; /** From 6f1aca52f55ad6fd54d05e1e1abed58da20a9143 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 30 Jul 2015 00:26:32 +0100 Subject: [PATCH 0396/1173] fix #1657 --- src/interface/window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/window.c b/src/interface/window.c index a1093824aa..db2b98c60b 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -1957,7 +1957,7 @@ void window_event_unknown_15_call(rct_window *w, int scrollIndex, int scrollArea rct_string_id window_event_tooltip_call(rct_window *w, int widgetIndex) { - rct_string_id result = STR_NONE; + rct_string_id result = 0; if (w->event_handlers->tooltip != NULL) w->event_handlers->tooltip(w, widgetIndex, &result); return result; From 192289de870e38ce46c1241d5db8d8329b52b19c Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 30 Jul 2015 04:00:13 +0100 Subject: [PATCH 0397/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 340 +++++++++++++------------- data/language/dutch.txt | 12 +- 2 files changed, 177 insertions(+), 175 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 6a277b776b..8f3657b2a0 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -12,7 +12,7 @@ STR_0007 :小火車 STR_0008 :單軌電車 STR_0009 :迷你懸吊式雲霄飛車 STR_0010 :小船出租 -STR_0011 :木製野鼠式雲霄飛車 +STR_0011 :木製飛鼠式雲霄飛車 STR_0012 :越野賽馬式雲霄飛車 STR_0013 :自駕軌道車輛 STR_0014 :自由落體 @@ -53,20 +53,20 @@ STR_0048 :龍捲風 STR_0049 :鬼屋 STR_0050 :急救室 STR_0051 :馬戲團 -STR_0052 :Ghost Train +STR_0052 :驚奇之旅 STR_0053 :鐵架旋轉式雲霄飛車 STR_0054 :木製雲霄飛車 -STR_0055 :Side-Friction Roller Coaster -STR_0056 :Wild Mouse +STR_0055 :木製軌道阻力式雲霄飛車 +STR_0056 :飛鼠式雲霄飛車 STR_0057 :多維度雲霄飛車 STR_0058 :Unknown Ride (38) STR_0059 :Flying Roller Coaster STR_0060 :Unknown Ride (3A) STR_0061 :Virginia Reel -STR_0062 :Splash Boats +STR_0062 :濺水船 STR_0063 :迷你直升機 -STR_0064 :Lay-down Roller Coaster -STR_0065 :Suspended Monorail +STR_0064 :躺身式雲霄飛車 +STR_0065 :懸吊式單軌電車 STR_0066 :Unknown Ride (40) STR_0067 :Reverser Roller Coaster STR_0068 :Heartline Twister Coaster @@ -78,9 +78,9 @@ STR_0073 :古怪屋 STR_0074 :單軌單車 STR_0075 :緊湊的反轉式雲霄飛車 STR_0076 :濺水式雲霄飛車 -STR_0077 :Air Powered Vertical Coaster -STR_0078 :Inverted Hairpin Coaster -STR_0079 :Magic Carpet +STR_0077 :以空氣為動力的垂直式雲霄飛車 +STR_0078 :反轉髮夾彎式雲霄飛車 +STR_0079 :魔法地毯 STR_0080 :潛艇遊道 STR_0081 :木筏河道 STR_0082 :Unknown Ride (50) @@ -535,7 +535,7 @@ STR_0530 :Cars hang from a steel cable which runs continuously from one end o STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_0532 : STR_0533 : -STR_0534 :Self-drive petrol-engined go karts +STR_0534 :自駕式, 並以氣油驅動的小型賽車(卡丁車) STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids STR_0537 : @@ -592,7 +592,7 @@ STR_0587 :After an exhilarating air-powered launch, the train speeds up a ver STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops STR_0589 : STR_0590 :Riders ride in a submerged submarine through an underwater course -STR_0591 :Raft-shaped boats gently meander around a river track +STR_0591 :木筏造型船於河道上慢慢地遊覽著 STR_0592 : STR_0593 : STR_0594 : @@ -836,9 +836,9 @@ STR_0831 :{SMALLFONT}{BLACK}縮小檢視區域 STR_0832 :{SMALLFONT}{BLACK}將檢視區域順時針旋轉90{DEGREE} STR_0833 :{SMALLFONT}{BLACK}暫停遊戲 STR_0834 :{SMALLFONT}{BLACK}硬碟及遊戲設定 -STR_0835 :Game initialization failed -STR_0836 :Unable to start game in a minimised state -STR_0837 :Unable to initialise graphics system +STR_0835 :遊戲初始化失敗 +STR_0836 :無法於最小化的狀態下啟動遊戲 +STR_0837 :無法初始化繪製圖像系統 STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} @@ -1017,9 +1017,9 @@ STR_1011 :關閉所有遊樂設施 STR_1012 :開啟所有遊樂設施 STR_1013 :關閉樂園 STR_1014 :開放樂園 -STR_1015 :Unable to operate with more than one station platform in this mode -STR_1016 :Unable to operate with less than two stations in this mode -STR_1017 :不能改變運行模式... +STR_1015 :在這個模式下, 多過一個車站的遊樂設施將無法運作 +STR_1016 :在這個模式下, 少於兩個車站的遊樂設施將無法運作 +STR_1017 :不能改變運作模式... STR_1018 :不能作出更變... STR_1019 :不能作出更變... STR_1020 :不能作出更變... @@ -1029,14 +1029,14 @@ STR_1023 :每列車{POP16}{POP16}{POP16}{COMMA16}車卡 STR_1024 :每列車{COMMA16}車卡 STR_1025 :每列車{COMMA16}車卡 STR_1026 :車站月台太長! -STR_1027 :{SMALLFONT}{BLACK}Locate this on Main View -STR_1028 :Off edge of map! -STR_1029 :Cannot build partly above and partly below water! -STR_1030 :Can only build this underwater! -STR_1031 :Can't build this underwater! -STR_1032 :Can only build this on water! -STR_1033 :Can only build this above ground! -STR_1034 :Can only build this on land! +STR_1027 :{SMALLFONT}{BLACK}在主視範圍裡將此定位 +STR_1028 :離開了地圖邊緣! +STR_1029 :不能建造於一半地上一半水底的地勢中! +STR_1030 :只能建造於水底! +STR_1031 :不能建造於水底! +STR_1032 :只能建造此於水上! +STR_1033 :只能建造此於地上! +STR_1034 :只能建造此於地面! STR_1035 :當地政府不允許建造高於樹木的物件! STR_1036 :載入遊戲 STR_1037 :載入地型 @@ -1069,7 +1069,7 @@ STR_1063 :反向發車循環模式 STR_1064 :動力發車 (穿過車站) STR_1065 :穿梭模式 STR_1066 :出租小船模式 -STR_1067 :Upward launch +STR_1067 :向上發車 STR_1068 :旋轉升降模式 STR_1069 :站對站模式 STR_1070 :一次付費單次溜滑梯 @@ -1094,12 +1094,12 @@ STR_1088 :剌激模式 STR_1089 :狂暴模式 STR_1090 :鬼屋模式 STR_1091 :馬戲團表演模式 -STR_1092 :Downward launch +STR_1092 :向下發車 STR_1093 :古怪屋模式 STR_1094 :自由落體模式 -STR_1095 :有區域煞車的連續循環模式 +STR_1095 :含區域煞車的連續循環模式 STR_1096 :動力發車 (不穿過車站) -STR_1097 :Powered launch block sectioned mode +STR_1097 :含區域煞車的動力發車模式 STR_1098 :移動到{POP16}{STRINGID}的最尾中 STR_1099 :在{POP16}{STRINGID}等待乘客中 STR_1100 :等待離開{POP16}{STRINGID}中 @@ -1396,11 +1396,11 @@ STR_1390 :{CURRENCY2DP} STR_1391 :{RED}{CURRENCY2DP} STR_1392 :{SMALLFONT}{BLACK}觀看遊樂設施/店鋪 STR_1393 :{SMALLFONT}{BLACK}車卡詳情及選項 -STR_1394 :{SMALLFONT}{BLACK}運行選項 +STR_1394 :{SMALLFONT}{BLACK}運作選項 STR_1395 :{SMALLFONT}{BLACK}維修選項 STR_1396 :{SMALLFONT}{BLACK}色彩選配選項 STR_1397 :{SMALLFONT}{BLACK}聲音及音樂選項 -STR_1398 :{SMALLFONT}{BLACK}測試數據及統計 +STR_1398 :{SMALLFONT}{BLACK}測試數據及統計資料 STR_1399 :{SMALLFONT}{BLACK}圖表 STR_1400 :入口 STR_1401 :出口 @@ -1442,7 +1442,7 @@ STR_1436 :在{STRINGID}中 STR_1437 :在{STRINGID}中 STR_1438 :坐下中 STR_1439 :(請選擇位置) -STR_1440 :Mowing grass +STR_1440 :修剪草皮中 STR_1441 :清掃道路中 STR_1442 :清空垃圾筒中 STR_1443 :灌溉花圃中 @@ -1675,7 +1675,7 @@ STR_1669 :{WINDOW_COLOUR_2}滿意度: {BLACK}{COMMA16}% STR_1670 :{WINDOW_COLOUR_2}總乘客數: {BLACK}{COMMA32} STR_1671 :{WINDOW_COLOUR_2}總利潤: {BLACK}{CURRENCY2DP} STR_1672 :煞車裝置 -STR_1673 :Spinning Control Toggle Track +STR_1673 :控制旋轉開/關軌道 STR_1674 :煞車速度 STR_1675 :{POP16}{VELOCITY} STR_1676 :{SMALLFONT}{BLACK}設置煞車速度限制 @@ -1685,12 +1685,12 @@ STR_1679 :向上盤旋 (向左) STR_1680 :向上盤旋 (向右) STR_1681 :向下盤旋 (向左) STR_1682 :向下盤旋 (向右) -STR_1683 :Base size 2 x 2 -STR_1684 :Base size 4 x 4 -STR_1685 :Base size 2 x 4 -STR_1686 :Base size 5 x 1 -STR_1687 :Water splash -STR_1688 :Base size 4 x 1 +STR_1683 :2 x 2地基 +STR_1684 :4 x 4地基 +STR_1685 :2 x 4地基 +STR_1686 :5 x 1地基 +STR_1687 :水濺軌道 +STR_1688 :4 x 1地基 STR_1689 :區域煞車裝置 STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} STR_1691 :{WINDOW_COLOUR_2} 費用: {BLACK}{CURRENCY} @@ -1717,7 +1717,7 @@ STR_1711 :{WINDOW_COLOUR_1}你確定要解僱{STRINGID}嗎? STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}清掃道路 STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}灌溉花圃 STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}清空垃圾筒 -STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Mow grass +STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}修剪草皮 STR_1716 :不適合的樂園名稱 STR_1717 :不能重命名樂園... STR_1718 :樂園名稱 @@ -1768,8 +1768,8 @@ STR_1762 :瀑布 STR_1763 :急流 STR_1764 :漩渦 STR_1765 :即時拍照區域 -STR_1766 :Reverser turntable -STR_1767 :Spinning tunnel +STR_1766 :倒轉轉木裝置 +STR_1767 :不斷旋轉的隧道 STR_1768 :不能改變搖擺次數... STR_1769 :{WINDOW_COLOUR_2}搖擺次數: STR_1770 :{SMALLFONT}{BLACK}完全搖擺的次數 @@ -1794,12 +1794,12 @@ STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} 警長服裝 STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} 海盜服裝 STR_1790 :{SMALLFONT}{BLACK}選擇這種員工的制服顏色 STR_1791 :{WINDOW_COLOUR_2}制服的顏色: -STR_1792 :Responding to {STRINGID} breakdown call -STR_1793 :Heading to {STRINGID} for an inspection -STR_1794 :Fixing {STRINGID} -STR_1795 :Answering radio call -STR_1796 :Has broken down and requires fixing -STR_1797 :This option cannot be changed for this ride +STR_1792 :回應{STRINGID}的故障呼叫中 +STR_1793 :前往到{STRINGID}作出檢查中 +STR_1794 :修理{STRINGID}中 +STR_1795 :回應電台呼叫中 +STR_1796 :已經故障並需要修復 +STR_1797 :不能在這個遊樂設施中更改這個選項 STR_1798 :漩渦 STR_1799 :{POP16}{POP16}{POP16}{POP16}{POP16}{CURRENCY2DP} STR_1800 :保險裝置跳掣 @@ -1853,8 +1853,8 @@ STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16}遊客 STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16}遊客 STR_1849 :{WINDOW_COLOUR_2}播放音樂 STR_1850 :{SMALLFONT}{BLACK}選擇此遊樂設施播放音樂與否 -STR_1851 :{WINDOW_COLOUR_2}運行成本: {BLACK}每小時{CURRENCY2DP} -STR_1852 :{WINDOW_COLOUR_2}運行成本: {BLACK}未知 +STR_1851 :{WINDOW_COLOUR_2}運作成本: {BLACK}每小時{CURRENCY2DP} +STR_1852 :{WINDOW_COLOUR_2}運作成本: {BLACK}未知 STR_1853 :{WINDOW_COLOUR_2}落成年份: {BLACK}今年 STR_1854 :{WINDOW_COLOUR_2}落成年份: {BLACK}去年 STR_1855 :{WINDOW_COLOUR_2}落成年份: {BLACK}{COMMA16}年前 @@ -1941,18 +1941,18 @@ STR_1933 :{STRINGID}已在{STRINGID}中 STR_1934 :{STRINGID}已離開{STRINGID} STR_1935 :{STRINGID}已離開樂園 STR_1936 :{STRINGID}已購買{STRINGID} -STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message -STR_1938 :{SMALLFONT}{BLACK}Show view of guest -STR_1939 :{SMALLFONT}{BLACK}Show view of staff member -STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this guest -STR_1941 :{SMALLFONT}{BLACK}Show which rides this guest has been on -STR_1942 :{SMALLFONT}{BLACK}Show financial information about this guest -STR_1943 :{SMALLFONT}{BLACK}Show guest's recent thoughts -STR_1944 :{SMALLFONT}{BLACK}Show items guest is carrying -STR_1945 :{SMALLFONT}{BLACK}Show orders and options for this staff member -STR_1946 :{SMALLFONT}{BLACK}Select costume for this entertainer -STR_1947 :{SMALLFONT}{BLACK}Show areas patrolled by selected staff type, and locate the nearest staff member -STR_1948 :{SMALLFONT}{BLACK}Hire a new staff member of the selected type +STR_1937 :{SMALLFONT}{BLACK}顯示關於這個訊息標題的資訊 +STR_1938 :{SMALLFONT}{BLACK}顯示遊客所視 +STR_1939 :{SMALLFONT}{BLACK}顯示員工所視 +STR_1940 :{SMALLFONT}{BLACK}顯示這位遊客的快樂度, 體力, 飢餓度等指標 +STR_1941 :{SMALLFONT}{BLACK}顯示這位遊客乘坐了甚麼遊樂設施 +STR_1942 :{SMALLFONT}{BLACK}顯示這位遊客的財政狀況 +STR_1943 :{SMALLFONT}{BLACK}顯示這位遊客的最近想法 +STR_1944 :{SMALLFONT}{BLACK}顯示這位遊客攜帶中的物件 +STR_1945 :{SMALLFONT}{BLACK}顯示有關這位員工的排序及選項 +STR_1946 :{SMALLFONT}{BLACK}選擇這位表演人員的服裝 +STR_1947 :{SMALLFONT}{BLACK}顯示已分配被巡邏的區域, 以及將最近的員工定位 +STR_1948 :{SMALLFONT}{BLACK}僱用這個類別的新員工 STR_1949 :財政概要 STR_1950 :財政圖表 STR_1951 :樂園價值圖表 @@ -2337,7 +2337,7 @@ STR_2329 :{WINDOW_COLOUR_2}距離及速度單位: STR_2330 :{WINDOW_COLOUR_2}溫度單位: STR_2331 :{WINDOW_COLOUR_2}高度標記單位: STR_2332 :單位 -STR_2333 :Sound +STR_2333 :聲效 STR_2334 :英鎊 ({POUND}) STR_2335 :美金 ($) STR_2336 :法郎 (F) @@ -2348,9 +2348,9 @@ STR_2340 :裡拉 (L) STR_2341 :荷蘭盾 (fl.) STR_2342 :克朗 (kr) STR_2343 :歐元 ({EURO}) -STR_2344 :Imperial -STR_2345 :Metric -STR_2346 :Display +STR_2344 :英制 +STR_2345 :公制 +STR_2346 :顯示 STR_2347 :{RED}{STRINGID}已被溺死! STR_2348 :{SMALLFONT}{BLACK}顯示這位員工的統計資料 STR_2349 :{WINDOW_COLOUR_2}工資: {BLACK}每個月{CURRENCY} @@ -2462,18 +2462,18 @@ STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} - STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} - STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} - STR_2457 :{SMALLFONT}{BLACK}顯示財政報表 -STR_2458 :{SMALLFONT}{BLACK}Show graph of cash (less loan) over time -STR_2459 :{SMALLFONT}{BLACK}Show graph of park value over time -STR_2460 :{SMALLFONT}{BLACK}Show graph of weekly profit -STR_2461 :{SMALLFONT}{BLACK}Show marketing campaigns -STR_2462 :{SMALLFONT}{BLACK}Show view of park entrance -STR_2463 :{SMALLFONT}{BLACK}Show graph of park ratings over time -STR_2464 :{SMALLFONT}{BLACK}Show graph of guest numbers over time -STR_2465 :{SMALLFONT}{BLACK}Show park entrance price and information -STR_2466 :{SMALLFONT}{BLACK}Show park statistics -STR_2467 :{SMALLFONT}{BLACK}Show objectives for this game -STR_2468 :{SMALLFONT}{BLACK}Show recent awards this park has received -STR_2469 :{SMALLFONT}{BLACK}Select level of research & development +STR_2458 :{SMALLFONT}{BLACK}以圖表顯示過往到現在的凈現金 +STR_2459 :{SMALLFONT}{BLACK}以圖表顯示過往到現在的樂園價格 +STR_2460 :{SMALLFONT}{BLACK}以圖表顯示過往到現在的每週營利 +STR_2461 :{SMALLFONT}{BLACK}顯示營銷計劃詳情 +STR_2462 :{SMALLFONT}{BLACK}顯示樂園入口的視點 +STR_2463 :{SMALLFONT}{BLACK}以圖表顯示過往到現在的樂園評價 +STR_2464 :{SMALLFONT}{BLACK}以圖表顯示過往到現在的遊客人員 +STR_2465 :{SMALLFONT}{BLACK}顯示樂園門票價格以及其資訊 +STR_2466 :{SMALLFONT}{BLACK}顯示樂園的統計資料 +STR_2467 :{SMALLFONT}{BLACK}顯示是次遊戲的目標 +STR_2468 :{SMALLFONT}{BLACK}顯示這個樂園最近獲得的獎項 +STR_2469 :{SMALLFONT}{BLACK}選擇投放多少資金到研發當中 STR_2470 :{SMALLFONT}{BLACK}研發新的運輸類遊樂設施 STR_2471 :{SMALLFONT}{BLACK}研發新的溫和類遊樂設施 STR_2472 :{SMALLFONT}{BLACK}研發新的雲霄飛車 @@ -2481,11 +2481,11 @@ STR_2473 :{SMALLFONT}{BLACK}研發新的剌激類遊樂設施 STR_2474 :{SMALLFONT}{BLACK}研發新的水文類遊樂設施 STR_2475 :{SMALLFONT}{BLACK}研發新的商店及攤販 STR_2476 :{SMALLFONT}{BLACK}研發新的景物及主題景物 -STR_2477 :{SMALLFONT}{BLACK}Select operating mode for this ride/attraction -STR_2478 :{SMALLFONT}{BLACK}Show graph of velocity against time -STR_2479 :{SMALLFONT}{BLACK}Show graph of altitude against time -STR_2480 :{SMALLFONT}{BLACK}Show graph of vertical acceleration against time -STR_2481 :{SMALLFONT}{BLACK}Show graph of lateral acceleration against time +STR_2477 :{SMALLFONT}{BLACK}選擇這個遊樂設施的運作模式 +STR_2478 :{SMALLFONT}{BLACK}以圖表顯示速度與運作時間的關係 +STR_2479 :{SMALLFONT}{BLACK}以圖表顯示高度與運作時間的關係 +STR_2480 :{SMALLFONT}{BLACK}以圖表顯示垂直加速與運作時間的關係 +STR_2481 :{SMALLFONT}{BLACK}以圖表顯示橫向加速與運作時間的關係 STR_2482 :{SMALLFONT}{BLACK}營利: 每週{CURRENCY}, 樂園價值: {CURRENCY} STR_2483 :{WINDOW_COLOUR_2}每週營利: {BLACK}+{CURRENCY2DP} STR_2484 :{WINDOW_COLOUR_2}每週營利: {RED}{CURRENCY2DP} @@ -2497,24 +2497,24 @@ STR_2489 :快捷鍵... STR_2490 :鍵盤快捷鍵 STR_2491 :重設快捷鍵 STR_2492 :{SMALLFONT}{BLACK}初始化所有快捷鍵設定 -STR_2493 :Close top-most window -STR_2494 :Close all floating windows -STR_2495 :Cancel construction mode +STR_2493 :關閉最頂層的視窗 +STR_2494 :關閉所有視窗 +STR_2495 :退出建造模式 STR_2496 :暫停遊戲 STR_2497 :縮小檢視範圍 STR_2498 :放大檢視範圍 STR_2499 :順時針旋轉檢視範圍 -STR_2500 :Rotate construction object -STR_2501 :Underground view toggle -STR_2502 :Remove base land toggle -STR_2503 :Remove vertical land toggle -STR_2504 :See-through rides toggle -STR_2505 :See-through scenery toggle -STR_2506 :Invisible supports toggle -STR_2507 :Invisible people toggle -STR_2508 :Height marks on land toggle -STR_2509 :Height marks on ride tracks toggle -STR_2510 :Height marks on paths toggle +STR_2500 :旋轉要建造的物件 +STR_2501 :開關地底檢視模式 +STR_2502 :開關’移除地表’選項 +STR_2503 :開關’移除垂直表面’選項 +STR_2504 :開關’略過遊樂設施’選項 +STR_2505 :開關’略過景物’選項 +STR_2506 :開關’透明化支撐’選項 +STR_2507 :開關’透明化遊客’選項 +STR_2508 :開關’在土地上標記高度’選項 +STR_2509 :開關’在設施軌道上標記高度’選項 +STR_2510 :開關’在道路上標記高度’選項 STR_2511 :調整土地 STR_2512 :調整水面 STR_2513 :建造景物 @@ -2690,18 +2690,18 @@ STR_2681 :{MEDIUMFONT}{BLACK}增加{CURRENCY}到你的金錢裡 STR_2682 : STR_2683 : STR_2684 :{SMALLFONT}{BLACK}一大群遊客到訪 -STR_2685 :Simplex Noise Parameters -STR_2686 :{WINDOW_COLOUR_2}Low: -STR_2687 :{WINDOW_COLOUR_2}High: -STR_2688 :{WINDOW_COLOUR_2}Base Frequency: -STR_2689 :{WINDOW_COLOUR_2}Octaves: -STR_2690 :Map Generation -STR_2691 :{WINDOW_COLOUR_2}Base height: -STR_2692 :{WINDOW_COLOUR_2}Water level: -STR_2693 :{WINDOW_COLOUR_2}Terrain: -STR_2694 :Generate -STR_2695 :Random terrain -STR_2696 :Place trees +STR_2685 :簡單雜噪參數 +STR_2686 :{WINDOW_COLOUR_2}最低值: +STR_2687 :{WINDOW_COLOUR_2}最高值: +STR_2688 :{WINDOW_COLOUR_2}基本頻律: +STR_2689 :{WINDOW_COLOUR_2}八度: +STR_2690 :生成地圖 +STR_2691 :{WINDOW_COLOUR_2}土地基本高度: +STR_2692 :{WINDOW_COLOUR_2}水面高度: +STR_2693 :{WINDOW_COLOUR_2}地質: +STR_2694 :生成 +STR_2695 :隨機地質 +STR_2696 :放置樹木 STR_2697 :??? STR_2698 :??? STR_2699 :??? @@ -2753,19 +2753,19 @@ STR_2744 :[ STR_2745 :\ STR_2746 :] STR_2747 :{ENDQUOTES} -STR_2748 :Bar -STR_2749 :My new scenario +STR_2748 :列 +STR_2749 :我的新劇情 # New strings used in the cheats window previously these were ??? -STR_2750 :Move all items to top -STR_2751 :Move all items to bottom -STR_2752 :Clear grass -STR_2753 :Mowed grass -STR_2754 :Water plants -STR_2755 :Fix vandalism -STR_2756 :Remove litter -STR_2757 :Force Sun -STR_2758 :Force Thunder -STR_2759 :Zero Clearance +STR_2750 :移到所有物件至最頂部 +STR_2751 :移到所有物件至最底部 +STR_2752 :無雜草的草地 +STR_2753 :除好草的草地 +STR_2754 :灌溉花圃 +STR_2755 :修復被毀壞的物件 +STR_2756 :移除垃圾 +STR_2757 :強制晴天 +STR_2758 :強制雷暴 +STR_2759 :無'擋在路中'檢查 STR_2760 :+{CURRENCY} STR_2761 : STR_2762 : @@ -2785,8 +2785,8 @@ STR_2775 :全螢幕 (桌面尺寸) STR_2776 :語言: STR_2777 :{MOVE_X}{SMALLFONT}{STRING} STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} -STR_2779 :Viewport #{COMMA16} -STR_2780 :Extra viewport +STR_2779 :額外檢視視窗#{COMMA16} +STR_2780 :新的額外檢視視窗 # End of new strings STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} STR_2782 :SHIFT + @@ -2802,20 +2802,20 @@ STR_2791 :輸入名字 STR_2792 :請輸入你要在劇情列表顯示的名字: STR_2793 :{SMALLFONT}(已由{STRINGID}完成) STR_2794 :{WINDOW_COLOUR_2}完成目標者: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} 令公司價值增至: {BLACK}{CURRENCY} -STR_2795 :Sort -STR_2796 :{SMALLFONT}{BLACK}Sort the ride list into order using the information type displayed -STR_2797 :Scroll view when pointer at screen edge -STR_2798 :{SMALLFONT}{BLACK}Select whether to scroll the view when the mouse pointer is at the screen edge -STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments -STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32} -STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP} +STR_2795 :排序 +STR_2796 :{SMALLFONT}{BLACK}將遊樂設施以不同類別列出 +STR_2797 :當滑鼠遊標放置於邊緣時, 捲動檢視範圍 +STR_2798 :{SMALLFONT}{BLACK}選擇到底當滑鼠游標放置於邊緣時, 捲動檢視範圍 +STR_2799 :{SMALLFONT}{BLACK}檢視或改變控制按鍵佈局 +STR_2800 :{WINDOW_COLOUR_2}總進園人數: {BLACK}{COMMA32} +STR_2801 :{WINDOW_COLOUR_2}樂園門票所得收入: {BLACK}{CURRENCY2DP} STR_2802 :地圖 -STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map -STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map -STR_2805 :{SMALLFONT}{BLACK}Show map of park -STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organizing them better -STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organizing them better -STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better +STR_2803 :{SMALLFONT}{BLACK}將這些遊客高亮顯示於地圖中 +STR_2804 :{SMALLFONT}{BLACK}將這些員工高亮顯示於地圖中 +STR_2805 :{SMALLFONT}{BLACK}顯示樂園地圖 +STR_2806 :{RED}遊客都在投訴樂園裡的道路十分骯髒{NEWLINE}請檢查你的清潔工人位置所在, 並考慮以更好的方法管理他們 +STR_2807 :{RED}遊客都在投訴樂園裡隨地拋棄的垃圾十分多{NEWLINE}請檢查你的清潔工人位置所在, 並考慮以更好的方法管理他們 +STR_2808 :{RED}遊客都在投訴樂園裡的公物被毀壞{NEWLINE}請檢查你的安全警衛位置所在, 並考慮以更好的方法管理他們 STR_2809 :{RED}遊客都餓了, 但他們找不到賣食物的店舖 STR_2810 :{RED}遊客都渴了, 但他們找不到賣飲料的店舖 STR_2811 :{RED}因為遊客都找不到樂園裡有廁所, 所以他們抱怨了 @@ -2856,17 +2856,17 @@ STR_2845 :{TOPAZ}你的樂園剛獲得了'擁有最大膽的色彩選配的 STR_2846 :{TOPAZ}你的樂園剛獲得了'擁有最令人迷失的道路的樂園獎'! STR_2847 :{TOPAZ}你的樂園剛獲得了'擁有最佳溫和類遊樂設施的樂園獎'! STR_2848 :{WINDOW_COLOUR_2}暫無獲得任何獎項 -STR_2849 :New scenario installed successfully -STR_2850 :New track design installed successfully -STR_2851 :Scenario already installed -STR_2852 :Track design already installed +STR_2849 :成功安裝新劇情 +STR_2850 :成功安裝新軌道設計 +STR_2851 :劇情已曾安裝 +STR_2852 :軌道設計已曾安裝 STR_2853 :被當地政府禁止! STR_2854 :{RED}遊客都不能走到去{STRINGID}的入口!{NEWLINE}請建造道路連接入口 STR_2855 :{RED}{STRINGID}的出口並沒有道路連接!{NEWLINE}請建造道路連接出口 STR_2856 :{WINDOW_COLOUR_2}教學 STR_2857 :{WINDOW_COLOUR_2}(按下任意鍵來獲取控制) -STR_2858 :Can't start marketing campaign... -STR_2859 :Another instance of RollerCoaster Tycoon 2 is already running +STR_2858 :不能開始實行營銷計劃... +STR_2859 :另外一個OpenRCT2程序已在運行中 STR_2860 :Infogrames Interactive credits... STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. STR_2862 :Music acknowledgements... @@ -3146,7 +3146,7 @@ STR_3135 :{RED}(車輛款式不可用 - 遊樂設施的性能可能會有影 STR_3136 :警告: 此設計會使用另一款車輛, 它的運作可能會跟預期有落差 STR_3137 :選擇鄰近景物 STR_3138 :重新選擇 -STR_3139 :纜道坡道不能在這個運作模式運行 +STR_3139 :纜道坡道不能在這個運作模式運作 STR_3140 :纜道坡道需要連接至車站 STR_3141 :纜道坡道並不適合於單次多圈數的遊樂設施 STR_3142 :{WINDOW_COLOUR_2}載客量: {BLACK}{STRINGID} @@ -3228,17 +3228,17 @@ STR_3217 :已擁有的土地 STR_3218 :已擁有建造權的土地 STR_3219 :可供購買的土地 STR_3220 :可供購買建造權的土地 -STR_3221 :{SMALLFONT}{BLACK}Set land to be owned by the park -STR_3222 :{SMALLFONT}{BLACK}Set construction rights only to be owned by the park -STR_3223 :{SMALLFONT}{BLACK}Set land to be available to purchase by the park -STR_3224 :{SMALLFONT}{BLACK}Set construction rights to be available to purchase by the park -STR_3225 :{SMALLFONT}{BLACK}Toggle on/off building a random cluster of objects around the selected position -STR_3226 :{SMALLFONT}{BLACK}Build park entrance +STR_3221 :{SMALLFONT}{BLACK}將樂園設置成為土地的擁有者 +STR_3222 :{SMALLFONT}{BLACK}尤樂園擁有土地的建造權 +STR_3223 :{SMALLFONT}{BLACK}將土地設置成為可供樂園購買 +STR_3224 :{SMALLFONT}{BLACK}將土地的建造權設置成為可供樂園購買 +STR_3225 :{SMALLFONT}{BLACK}設置是否在選中的位置中建造一些隨機物件 +STR_3226 :{SMALLFONT}{BLACK}建造樂園入口 STR_3227 :太多樂園入口! -STR_3228 :{SMALLFONT}{BLACK}Set starting positions for people -STR_3229 :Block Brakes cannot be used directly after station -STR_3230 :Block Brakes cannot be used directly after each other -STR_3231 :Block Brakes cannot be used directly after the top of this lift hill +STR_3228 :{SMALLFONT}{BLACK}設置遊客的開始步行位置 +STR_3229 :區域煞車不能建造在車站之後 +STR_3230 :區域煞車不能建造在自己之後 +STR_3231 :區域煞車不能建造在這個鏈條坡道的頂部之後 STR_3232 :選項 - 財政 STR_3233 :選項 - 遊客 STR_3234 :選項 - 樂園 @@ -3344,7 +3344,7 @@ STR_3333 :在存檔中導出附加物件 STR_3334 :{SMALLFONT}{BLACK}選擇是否儲存附加物件(額外加入的附加物件)到存檔, 以便存檔給沒有那些附加物件的人載入 STR_3335 :雲霄飛車設計工具 - 選擇要設計的雲霄飛車的類型及車輛種類 STR_3336 :軌道設計管理工具 - 選擇要管理的遊樂設施的類型 -STR_3337 :六旗樂園 +STR_3337 : STR_3338 :{BLACK}自訂設計 STR_3339 :{BLACK}可選{COMMA16}項預設計, 或可自訂設計 STR_3340 :{BLACK}可選{COMMA16}項預設計, 或可自訂設計 @@ -3372,7 +3372,7 @@ STR_3361 :這種遊樂設施擁有太多軌道設計 - 將不會列出某些 STR_3362 : STR_3363 : STR_3364 :進階 -STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups +STR_3365 :{SMALLFONT}{BLACK}在選擇景物組別之外, 允許選擇單項景物 STR_3366 :{BLACK}= 遊樂設施 STR_3367 :{BLACK}= 食物店鋪 STR_3368 :{BLACK}= 飲料店鋪 @@ -3422,7 +3422,7 @@ STR_3411 :{SMALLFONT}{BLACK}我們會選擇左彎道... STR_3412 :{SMALLFONT}{BLACK}這個彎道尚未建好, 但白色的鬼影會顯示它建成的位置. 按下在建造視窗的巨型"建造此"按鈕便可建造這個彎道... STR_3413 :{SMALLFONT}{BLACK}現在我們要建造直向前的軌道, 所以我們就點直向前軌道的圖標... STR_3414 :{SMALLFONT}{BLACK}現在整個環形軌道就完成了, 我們要建造入口及出口... -STR_3415 :{SMALLFONT}{BLACK}讓我們測試一下這個設施, 看看他能不能運行... +STR_3415 :{SMALLFONT}{BLACK}讓我們測試一下這個設施, 看看他能不能運作... STR_3416 :{SMALLFONT}{BLACK}在它測試的途中, 我們去建造輪候區及連結出口的道路吧... STR_3417 :{SMALLFONT}{BLACK}OK - 讓我們開放樂園, 同時開放設施吧... STR_3418 :{SMALLFONT}{BLACK}我們的新遊樂設施好像不會令人太過興奮 - 不如我們來添加點景物吧? @@ -3460,7 +3460,7 @@ STR_5120 :財政 STR_5121 :研發 STR_5122 :(像RCT1一樣)以軌道類型選擇遊樂設施 STR_5123 :翻新遊樂設施 -STR_5124 :去除"六旗"標誌 +STR_5124 : STR_5125 :全可拆卸 STR_5126 :隨機播放主題曲 STR_5127 :{SMALLFONT}{BLACK}禁止調整地勢 @@ -3469,11 +3469,11 @@ STR_5129 :請輸入介於{COMMA16}及{COMMA16}的選擇大小 STR_5130 :地圖大小 STR_5131 :請輸入介於{COMMA16}及{COMMA16}的地圖大小 STR_5132 :修理好所有遊樂設施 -STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights -STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights -STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights -STR_5136 :Land rights -STR_5137 :允許鏈條及發車速度{NEWLINE}高至{VELOCITY} +STR_5133 :{SMALLFONT}{BLACK}選擇較小的土地範圍 +STR_5134 :{SMALLFONT}{BLACK}選擇較大的土地範圍 +STR_5135 :{SMALLFONT}{BLACK}購買土地擁有權或建造權 +STR_5136 :土地擁有權 +STR_5137 :允許鏈條上拉及發車速度{NEWLINE}高至{VELOCITY} STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} STR_5139 :{WHITE}{STRINGID} STR_5140 :去除煞車組件故障 @@ -3519,10 +3519,10 @@ STR_5179 :{SMALLFONT}{BLACK}顯示用於遊客的密技 STR_5180 :{SMALLFONT}{BLACK}顯示用於樂園的密技 STR_5181 :{SMALLFONT}{BLACK}顯示用於設施的密技 STR_5182 :{INT32} -STR_5183 :Base height -STR_5184 :Enter base height between {COMMA16} and {COMMA16} -STR_5185 :Water level -STR_5186 :Enter water level between {COMMA16} and {COMMA16} +STR_5183 :土地地面高度 +STR_5184 :靖輸入介乎{COMMA16}及{COMMA16}的土地地面高度 +STR_5185 :水面高度 +STR_5186 :靖輸入介乎{COMMA16}及{COMMA16}的水面高度 STR_5187 :財政 STR_5188 :新的營銷計劃 STR_5189 :研發 @@ -3649,8 +3649,8 @@ STR_5309 :OpenRCT2 STR_5310 :隨機 STR_5311 :{SMALLFONT}{BLACK}除錯工具 STR_5312 :顯示命名行 -STR_5313 :Show tile inspector -STR_5314 :Tile inspector +STR_5313 :顯示地圖網格檢查工具 +STR_5314 :地圖網格檢查工具 STR_5315 :草地 STR_5316 :沙地 STR_5317 :泥地 @@ -3789,7 +3789,7 @@ STR_5448 :Ride / Vehicle {STRINGID} STR_5449 :減慢遊戲速度 STR_5450 :增快遊戲速度 STR_5451 :開啟密技視窗 -STR_5452 :Toggle visibility of toolbars +STR_5452 :調整工具列的可視度 STR_5453 :選擇另一類遊樂設施 STR_5454 :去除FPS上限 STR_5455 :啟用沙盒模式 diff --git a/data/language/dutch.txt b/data/language/dutch.txt index baed8ea4ae..672754ec8f 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -839,7 +839,7 @@ STR_0837 :Kan het grafisch systeem niet starten STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -# The follwing six strings were used for display resolutions, but have been replaced. +# The following six strings were used for display resolutions, but have been replaced. STR_0841 : STR_0842 : STR_0843 : @@ -2437,13 +2437,13 @@ STR_2432 :{BLACK}Bonnen voor 50% korting op entree voor {STRINGID} STR_2433 :{BLACK}Bonnen voor gratis {STRINGID} STR_2434 :{BLACK}Advertentiecampagne voor {STRINGID} STR_2435 :{BLACK}Advertentiecampagne voor {STRINGID} -STR_2436 :1 week +STR_2436 : STR_2437 : STR_2438 : STR_2439 : STR_2440 : STR_2441 : -STR_2442 :{BLACK}({STRINGID} resterend) +STR_2442 : STR_2443 :{WINDOW_COLOUR_2}Kosten per week: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Totale kosten: {BLACK}{CURRENCY2DP} STR_2445 :Start deze marketingcampagne @@ -3338,7 +3338,7 @@ STR_3333 :Plug-inobjecten meeleveren in opgeslagen spellen STR_3334 :{SMALLFONT}{BLACK}Selecteer of toegevoegde (niet-standaard) objecten in opgeslagen spellen en scenario's moeten worden meegeleverd, zodat ze geopend kunnen worden door iemand die deze objecten nog niet heeft STR_3335 :Achtbaanontwerper - Attractietypes en -voertuigen selecteren STR_3336 :Baanontwerpbeheer - Attractietype selecteren -STR_3337 :Six Flags-park +STR_3337 : STR_3338 :{BLACK}Eigen ontwerp STR_3339 :{BLACK}{COMMA16} ontwerp beschikbaar, of maak een eigen ontwerp STR_3340 :{BLACK}{COMMA16} ontwerpen beschikbaar, of maak een eigen ontwerp @@ -3454,7 +3454,7 @@ STR_5120 :Financiën STR_5121 :Onderzoek STR_5122 :Attracties op baantype sorteren STR_5123 :Attr. vernieuwen -STR_5124 :Six Flags weg +STR_5124 : STR_5125 :Afbreekbaar maken STR_5126 :Willekeurige titelmuziek STR_5127 :{SMALLFONT}{BLACK}Landtype i.p.v. landhoogte aanpassen bij slepen @@ -3815,3 +3815,5 @@ STR_5479 :Werkbalk STR_5480 :Knoppen in de werkbalk tonen voor: STR_5481 :Thema's STR_5482 :{WINDOW_COLOUR_2}Tijd sinds laatste inspectie: {BLACK}1 minuut +STR_5483 :{BLACK}({COMMA16} weken resterend) +STR_5484 :{BLACK}({COMMA16} week resterend) From fc844b5148177000fe37c83ee3c7e79ef4268894 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 30 Jul 2015 19:47:23 +0200 Subject: [PATCH 0398/1173] Disable integrity check for data files --- src/rct2.h | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/rct2.h b/src/rct2.h index 2edc71e9e1..5e352d01e3 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -283,29 +283,6 @@ static const struct file_to_check int pathId; // ID of file unsigned int fileSize; // Expected size in bytes } files_to_check[] = { - { PATH_ID_CSS18, 8429568 }, - { PATH_ID_CSS19, 10143784 }, - { PATH_ID_CSS20, 12271656 }, - { PATH_ID_CSS21, 9680968 }, - { PATH_ID_CSS22, 10062056 }, - { PATH_ID_CSS23, 11067432 }, - { PATH_ID_CSS24, 12427456 }, - { PATH_ID_CSS25, 15181512 }, - { PATH_ID_CSS26, 10694816 }, - { PATH_ID_CSS27, 10421232 }, - { PATH_ID_CSS28, 13118376 }, - { PATH_ID_CSS29, 15310892 }, - { PATH_ID_CSS30, 10215464 }, - { PATH_ID_CSS31, 11510316 }, - { PATH_ID_CSS32, 11771944 }, - { PATH_ID_CSS33, 10759724 }, - { PATH_ID_CSS34, 14030716 }, - { PATH_ID_CSS35, 11642576 }, - { PATH_ID_CSS36, 8953764 }, - { PATH_ID_CSS37, 13303852 }, - { PATH_ID_CSS38, 10093888 }, - { PATH_ID_CSS39, 7531564 }, - { PATH_ID_CSS40, 5291306 }, { PATH_ID_END, 0 } }; From 2b6cfdec1d426ed1c45573b916b4bd5dcb53f8f2 Mon Sep 17 00:00:00 2001 From: olegv11 Date: Fri, 31 Jul 2015 12:42:40 +0300 Subject: [PATCH 0399/1173] Added a helper function footpath_element_is_wide --- src/world/footpath.c | 5 +++++ src/world/footpath.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/world/footpath.c b/src/world/footpath.c index a7cb85f7a0..5523cb401b 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -1427,6 +1427,11 @@ bool footpath_element_is_queue(rct_map_element *mapElement) return mapElement->type & 1; } +bool footpath_element_is_wide(rct_map_element *mapElement) +{ + return mapElement->type & 2; +} + /** * * rct2: 0x006A76E9 diff --git a/src/world/footpath.h b/src/world/footpath.h index fbd00b2d0c..450c8a38fc 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -70,6 +70,7 @@ int footpath_is_connected_to_map_edge(int x, int y, int z, int direction, int fl bool footpath_element_is_sloped(rct_map_element *mapElement); int footpath_element_get_slope_direction(rct_map_element *mapElement); bool footpath_element_is_queue(rct_map_element *mapElement); +bool footpath_element_is_wide(rct_map_element *mapElement); void footpath_remove_edges_at(int x, int y, rct_map_element *mapElement); #endif From 8ea6adc5554691a3b9e20714f64a31250c730655 Mon Sep 17 00:00:00 2001 From: olegv11 Date: Fri, 31 Jul 2015 00:57:15 +0300 Subject: [PATCH 0400/1173] Implemented sub_6A87BB (now update_path_wide_flags), sub_6A8ACF and sub_6A8B12 --- src/world/map.c | 191 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 186 insertions(+), 5 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index b3d21a0b8d..1fe979725a 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -61,7 +61,7 @@ bool gClearLargeScenery; bool gClearFootpath; static void tiles_init(); -static void sub_6A87BB(int x, int y); +static void update_path_wide_flags(int x, int y); static void map_update_grass_length(int x, int y, rct_map_element *mapElement); static void map_set_grass_length(int x, int y, rct_map_element *mapElement, int length); static void sub_68AE2A(int x, int y); @@ -569,13 +569,13 @@ void sub_6A876D() if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) return; - // Presumebly sub_6A87BB is too computationally expensive to call for every + // Presumebly update_path_wide_flags is too computationally expensive to call for every // tile every update, so word_13CE774 and word_13CE776 store the x and y // progress. A maximum of 128 calls is done per update. x = RCT2_GLOBAL(0x013CE774, sint16); y = RCT2_GLOBAL(0x013CE776, sint16); for (i = 0; i < 128; i++) { - sub_6A87BB(x, y); + update_path_wide_flags(x, y); // Next x, y tile x += 32; @@ -590,13 +590,194 @@ void sub_6A876D() RCT2_GLOBAL(0x013CE776, sint16) = y; } +/** + * + * rct2: 0x006A8B12 + */ +static void sub_6A8B12(int x, int y) +{ + rct_map_element *mapElement = map_get_first_element_at(x / 32, y / 32); + do { + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) { + mapElement->type &= ~0x2; + } + } while (!map_element_is_last_for_tile(mapElement++)); +} + +/** + * + * rct2: 0x006A8ACF + */ +static void sub_6A8ACF(int x, int y, uint8 height, rct_map_element **l) +{ + rct_map_element *mapElement = map_get_first_element_at(x / 32, y / 32); + do { + if ((map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) && + !footpath_element_is_queue(mapElement) && !footpath_element_is_sloped(mapElement) && + (height == mapElement->base_height)) { + *l = mapElement; + return; + } + } while (!map_element_is_last_for_tile(mapElement++)); + *l = (rct_map_element*)0xFFFFFFFF; +} + + /** * * rct2: 0x006A87BB */ -static void sub_6A87BB(int x, int y) +static void update_path_wide_flags(int x, int y) { - RCT2_CALLPROC_X(0x006A87BB, x, 0, y, 0, 0, 0, 0); + if (x < 0x20) + return; + if (y < 0x20) + return; + if (x > 0x1FDF) + return; + if (y > 0x1FDF) + return; + + sub_6A8B12(x, y); + x += 0x20; + sub_6A8B12(x, y); + y += 0x20; + sub_6A8B12(x, y); + x -= 0x20; + sub_6A8B12(x, y); + y -= 0x20; + + if (!(x & 0xE0)) + return; + if (!(y & 0xE0)) + return; + + rct_map_element *mapElement = map_get_first_element_at(x / 32, y / 32); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + + if (footpath_element_is_queue(mapElement)) + continue; + + if (footpath_element_is_sloped(mapElement)) + continue; + + uint8 height = mapElement->base_height; + + // pathList is a list of elements, set by sub_6A8ACF adjacent to x,y + // Spanned from 0x00F3EFA8 to 0x00F3EFC7 (8 elements) in the original + rct_map_element *pathList[8]; + + x -= 0x20; + y -= 0x20; + sub_6A8ACF(x, y, height, pathList + 0); + y += 0x20; + sub_6A8ACF(x, y, height, pathList + 1); + y += 0x20; + sub_6A8ACF(x, y, height, pathList + 2); + x += 0x20; + sub_6A8ACF(x, y, height, pathList + 3); + x += 0x20; + sub_6A8ACF(x, y, height, pathList + 4); + y -= 0x20; + sub_6A8ACF(x, y, height, pathList + 5); + y -= 0x20; + sub_6A8ACF(x, y, height, pathList + 6); + x -= 0x20; + sub_6A8ACF(x, y, height, pathList + 7); + y += 0x20; + + uint8 F3EFA5 = 0; + const rct_map_element *invalidPointer = (rct_map_element*)0xFFFFFFFF; + + if (mapElement->properties.path.edges & 8) { + F3EFA5 |= 0x80; + if (pathList[7] != invalidPointer) { + if (footpath_element_is_wide(pathList[7])) { + F3EFA5 &= ~0x80; + } + } + } + + if (mapElement->properties.path.edges & 1) { + F3EFA5 |= 0x2; + if (pathList[1] != invalidPointer) { + if (footpath_element_is_wide(pathList[1])) { + F3EFA5 &= ~0x2; + } + } + } + + if (mapElement->properties.path.edges & 2) { + F3EFA5 |= 0x8; + if (pathList[3] != invalidPointer) { + if (footpath_element_is_wide(pathList[3])) { + F3EFA5 &= ~0x8; + } + } + } + + if (mapElement->properties.path.edges & 4) { + F3EFA5 |= 0x20; + if (pathList[5] != invalidPointer) { + if (footpath_element_is_wide(pathList[5])) { + F3EFA5 &= ~0x20; + } + } + } + + if ((F3EFA5 & 0x80) && (pathList[7] != invalidPointer) && !(footpath_element_is_wide(pathList[7]))) { + if ((F3EFA5 & 2) && + (pathList[0] != invalidPointer) && (!footpath_element_is_wide(pathList[0])) && + ((pathList[0]->properties.path.edges & 6) == 6) && // N E + (pathList[1] != invalidPointer) && (!footpath_element_is_wide(pathList[1]))) { + F3EFA5 |= 0x1; + } + + if ((F3EFA5 & 0x20) && + (pathList[6] != invalidPointer) && (!footpath_element_is_wide(pathList[6])) && + ((pathList[6]->properties.path.edges & 3) == 3) && // N W + (pathList[5] != invalidPointer) && (!footpath_element_is_wide(pathList[5]))) { + F3EFA5 |= 0x40; + } + } + + + if ((F3EFA5 & 0x8) && (pathList[3] != invalidPointer) && !(pathList[3]->type & 2)) { + if ((F3EFA5 & 2) && + (pathList[2] != invalidPointer) && (!footpath_element_is_wide(pathList[2])) && + ((pathList[2]->properties.path.edges & 0xC) == 0xC) && + (pathList[1] != invalidPointer) && (!footpath_element_is_wide(pathList[1]))) { + F3EFA5 |= 0x4; + } + + if ((F3EFA5 & 0x20) && + (pathList[4] != invalidPointer) && (!footpath_element_is_wide(pathList[4])) && + ((pathList[4]->properties.path.edges & 9) == 9) && + (pathList[5] != invalidPointer) && (!footpath_element_is_wide(pathList[5]))) { + F3EFA5 |= 0x10; + } + } + + if ((F3EFA5 & 0x80) && (F3EFA5 & (0x40 | 0x1))) + F3EFA5 &= ~0x80; + + if ((F3EFA5 & 0x2) && (F3EFA5 & (0x4 | 0x1))) + F3EFA5 &= ~0x2; + + if ((F3EFA5 & 0x8) && (F3EFA5 & (0x10 | 0x4))) + F3EFA5 &= ~0x8; + + if ((F3EFA5 & 0x20) && (F3EFA5 & (0x40 | 0x10))) + F3EFA5 &= ~0x20; + + if (!(F3EFA5 & (0x2 | 0x8 | 0x20 | 0x80))) { + uint8 e = mapElement->properties.path.edges; + if ((e != 0xAF) && (e != 0x5F) && (e != 0xEF)) + mapElement->type |= 2; + } + } while (!map_element_is_last_for_tile(mapElement++)); } /** From 8d80e12af217d84220c4e937ac36ade208b45be1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 31 Jul 2015 22:37:28 +0200 Subject: [PATCH 0401/1173] Play sound when message first appears, not later --- src/management/news_item.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/management/news_item.c b/src/management/news_item.c index bf3fc32a18..3709416696 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -84,7 +84,7 @@ void news_item_init_queue() static void news_item_tick_current() { int ticks; - ticks = news_item_get(0)->ticks++; + ticks = ++news_item_get(0)->ticks; if (ticks == 1 && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 1)) { // Play sound sound_play_panned(SOUND_NEWS_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2, 0, 0, 0); From c389228141e0d4e1042fa06fd819602a4924395e Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 1 Aug 2015 04:00:15 +0100 Subject: [PATCH 0402/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 672754ec8f..b5bf36ce2b 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -1171,7 +1171,7 @@ STR_1168 :Opties STR_1169 :(Geen) STR_1170 :{STRING} STR_1171 :{RED}Gesloten - - -STR_1172 :{YELLLOW}{STRINGID} - - +STR_1172 :{YELLOW}{STRINGID} - - STR_1173 :{SMALLFONT}{BLACK}Voetpaden en wachtrijen aanleggen STR_1174 :Lichtkrant in de weg STR_1175 :Kan dit niet op hellend voetpad neerzetten From c4b355f64800db7074d7ddc3899b7dcfa61c19dd Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 26 Jul 2015 00:55:17 +0100 Subject: [PATCH 0403/1173] implement utf8, part 1 --- projects/libs/libs.vcxproj | 18 +-- projects/openrct2.vcxproj | 6 +- src/drawing/drawing.h | 3 + src/drawing/string.c | 274 +++++++++++++++++++++++++++++++- src/interface/widget.c | 13 +- src/localisation/language.c | 44 ++++- src/localisation/language.h | 3 + src/localisation/localisation.c | 16 +- src/title.c | 10 +- 9 files changed, 354 insertions(+), 33 deletions(-) diff --git a/projects/libs/libs.vcxproj b/projects/libs/libs.vcxproj index bbad0231d7..5a518056a2 100644 --- a/projects/libs/libs.vcxproj +++ b/projects/libs/libs.vcxproj @@ -55,20 +55,20 @@ $(SolutionDir)..\build\$(Configuration)\ $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ - ..\..\lib\libcurl\include;..\..\lib\jansson;..\..\lib\cutest\CuTest.h;$(IncludePath) - ..\..\lib\libcurl\lib;$(LibraryPath) + ..\..\lib\libcurl\include;..\..\lib\jansson;..\..\lib\cutest\CuTest.h;..\..\lib\SDL2_ttf\include;$(IncludePath) + ..\..\lib\libcurl\lib;..\..\lib\SDL2_ttf\lib\x86;$(LibraryPath) $(SolutionDir)..\build\$(Configuration)\ $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ - ..\..\lib\libcurl\include;..\..\lib\jansson;..\..\lib\cutest\CuTest.h;$(IncludePath) - ..\..\lib\libcurl\lib;$(LibraryPath) + ..\..\lib\libcurl\include;..\..\lib\jansson;..\..\lib\cutest\CuTest.h;..\..\lib\SDL2_ttf\include;$(IncludePath) + ..\..\lib\libcurl\lib;..\..\lib\SDL2_ttf\lib\x86;$(LibraryPath) $(SolutionDir)..\build\Release\ $(SolutionDir)..\obj\$(ProjectName)\Release\ - ..\..\lib\libcurl\include;..\..\lib\jansson;..\..\lib\cutest\CuTest.h;$(IncludePath) - ..\..\lib\libcurl\lib;$(LibraryPath) + ..\..\lib\libcurl\include;..\..\lib\jansson;..\..\lib\cutest\CuTest.h;..\..\lib\SDL2_ttf\include;$(IncludePath) + ..\..\lib\libcurl\lib;..\..\lib\SDL2_ttf\lib\x86;$(LibraryPath) @@ -83,7 +83,7 @@ true - libcurl.lib;Ws2_32.lib;%(AdditionalDependencies) + libcurl.lib;Ws2_32.lib;SDL2_ttf.lib;%(AdditionalDependencies) Powershell -NonInteractive -ExecutionPolicy "ByPass" -File "$(ProjectDir)../../pre-build.ps1" @@ -108,7 +108,7 @@ true - libcurl.lib;Ws2_32.lib;%(AdditionalDependencies) + libcurl.lib;Ws2_32.lib;SDL2_ttf.lib;%(AdditionalDependencies) Powershell -NonInteractive -ExecutionPolicy "ByPass" -File "$(ProjectDir)../../pre-build.ps1" @@ -133,7 +133,7 @@ true - libcurl.lib;Ws2_32.lib;%(AdditionalDependencies) + libcurl.lib;Ws2_32.lib;SDL2_ttf.lib;%(AdditionalDependencies) Powershell -NonInteractive -ExecutionPolicy "ByPass" -File "$(ProjectDir)../../pre-build.ps1" diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 645c2c5455..ebf89bf5f7 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -310,13 +310,13 @@ - $(SolutionDir)..\lib;$(SolutionDir)..\lib\libspeex;$(SolutionDir)..\lib\sdl\include;$(SolutionDir)..\lib\libcurl\include;$(SolutionDir)..\lib\jansson;$(SolutionDir)..\lib\cutest;$(IncludePath) + $(SolutionDir)..\lib;$(SolutionDir)..\lib\libspeex;$(SolutionDir)..\lib\sdl\include;$(SolutionDir)..\lib\libcurl\include;$(SolutionDir)..\lib\jansson;$(SolutionDir)..\lib\cutest;$(SolutionDir)..\lib\SDL2_ttf\include;$(IncludePath) $(SolutionDir)..\lib\sdl\lib\x86;$(SolutionDir)..\lib\libcurl\lib;$(LibraryPath) $(SolutionDir)..\build\$(Configuration)\ $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ - $(SolutionDir)..\lib;$(SolutionDir)..\lib\libspeex;$(SolutionDir)..\lib\sdl\include;$(SolutionDir)..\lib\libcurl\include;$(SolutionDir)..\lib\jansson;$(SolutionDir)..\lib\cutest;$(IncludePath) + $(SolutionDir)..\lib;$(SolutionDir)..\lib\libspeex;$(SolutionDir)..\lib\sdl\include;$(SolutionDir)..\lib\libcurl\include;$(SolutionDir)..\lib\jansson;$(SolutionDir)..\lib\cutest;$(SolutionDir)..\lib\SDL2_ttf\include;$(IncludePath) $(SolutionDir)..\lib\sdl\lib\x86;$(SolutionDir)..\lib\libcurl\lib;$(LibraryPath) $(SolutionDir)..\build\$(Configuration)\ $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ @@ -324,7 +324,7 @@ - $(SolutionDir)..\lib;$(SolutionDir)..\lib\libspeex;$(SolutionDir)..\lib\sdl\include;$(SolutionDir)..\lib\libcurl\include;$(SolutionDir)..\lib\jansson;$(SolutionDir)..\lib\cutest;$(IncludePath) + $(SolutionDir)..\lib;$(SolutionDir)..\lib\libspeex;$(SolutionDir)..\lib\sdl\include;$(SolutionDir)..\lib\libcurl\include;$(SolutionDir)..\lib\jansson;$(SolutionDir)..\lib\cutest;$(SolutionDir)..\lib\SDL2_ttf\include;$(IncludePath) $(SolutionDir)..\lib\sdl\lib\x86;$(SolutionDir)..\lib\libcurl\lib;$(LibraryPath) $(SolutionDir)..\build\Release\ $(SolutionDir)..\obj\$(ProjectName)\Release\ diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 6da2217523..9ed88c96f1 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -134,6 +134,9 @@ void draw_string_right_underline(rct_drawpixelinfo *dpi, int format, void *args, int string_get_height_raw(char *buffer); void sub_6C1F57(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct_string_id format, void *args, int ticks); +bool ttf_initialise(); +void ttf_dispose(); + // rain void update_rain_animation(); void redraw_rain(); diff --git a/src/drawing/string.c b/src/drawing/string.c index ebf4c47f23..820bd80be1 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -18,11 +18,18 @@ * along with this program. If not, see . *****************************************************************************/ +#include #include "../addresses.h" #include "../localisation/localisation.h" #include "../sprites.h" #include "drawing.h" +static int ttf_get_string_width(const utf8 *text); +static void ttf_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, int y); + +static bool _ttfInitialised = false; +static TTF_Font *_ttfFont = NULL; + /** * * rct2: 0x006C19AC @@ -166,6 +173,10 @@ int gfx_get_string_width_new_lined(char* buffer){ */ int gfx_get_string_width(char* buffer) { + if (_ttfInitialised) { + return ttf_get_string_width(buffer); + } + // Current font sprites uint16* current_font_sprite_base; // Width of string @@ -766,7 +777,6 @@ void colour_char_window(uint8 colour, uint16* current_font_flags,uint8* palette_ RCT2_GLOBAL(0x009ABDA4, uint32) = (uint32)palette_pointer; } - /** * * rct2: 0x00682702 @@ -778,6 +788,10 @@ void colour_char_window(uint8 colour, uint16* current_font_flags,uint8* palette_ */ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, int y) { + if (_ttfInitialised) { + ttf_draw_string(dpi, buffer, colour, x, y); + return; + } int eax, ebx, ebp; rct_g1_element* g1_element; @@ -1057,7 +1071,7 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in uint32 char_offset = al - 0x20 + *current_font_sprite_base; RCT2_GLOBAL(0x00EDF81C, uint32) = (IMAGE_TYPE_USE_PALETTE << 28); - + gfx_draw_sprite_palette_set(dpi, ((IMAGE_TYPE_USE_PALETTE << 28) | char_offset) + SPR_CHAR_START, max_x, max_y, palette_pointer, NULL); max_x += (RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH, uint8)[char_offset] & 0xFF); continue; @@ -1245,4 +1259,258 @@ void sub_6C1F57(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct (int)dpi, (width & 0xFFFF) | (ticks << 16) ); -} \ No newline at end of file +} + +bool ttf_initialise() +{ + if (!_ttfInitialised) { + if (TTF_Init() != 0) + return false; + + _ttfFont = TTF_OpenFont("C:\\Windows\\Fonts\\tahoma.ttf", 11); + if (_ttfFont == NULL) { + TTF_Quit(); + return false; + } + + _ttfInitialised = true; + } + return true; +} + +void ttf_dispose() +{ + if (!_ttfInitialised) + return; + + if (_ttfFont != NULL) + TTF_CloseFont(_ttfFont); + + TTF_Quit(); +} + +enum { + TEXT_DRAW_FLAG_NO_DRAW = 1 << 31 +}; + +typedef struct { + int x; + int y; + int flags; + uint8 colour; +} text_draw_info; + +static void ttf_draw_string_raw(rct_drawpixelinfo *dpi, const utf8 *text, text_draw_info *info) +{ + if (!_ttfInitialised && !ttf_initialise()) + return; + + if (info->flags & TEXT_DRAW_FLAG_NO_DRAW) { + int width, height; + + TTF_SizeUTF8(_ttfFont, text, &width, &height); + info->x += width; + return; + } else { + uint8 colour = info->colour; + SDL_Color c = { 0, 0, 0, 255 }; + SDL_Surface *surface = TTF_RenderUTF8_Solid(_ttfFont, text, c); + if (surface == NULL) + return; + + if (SDL_LockSurface(surface) != 0) { + SDL_FreeSurface(surface); + return; + } + + int width = surface->w; + int height = surface->h; + int skipX = info->x - dpi->x; + int skipY = info->y - dpi->y; + info->x += width; + + uint8 *src = surface->pixels; + uint8 *dst = dpi->bits; + + if (skipX < 0) { + width += skipX; + src += -skipX; + } + if (skipY < 0) { + height += skipY; + src += (-skipY * surface->pitch); + } + dst += skipX; + dst += skipY * (dpi->width + dpi->pitch); + + int srcScanSkip = surface->pitch - width; + int dstScanSkip = dpi->width + dpi->pitch - width; + for (int yy = 0; yy < height; yy++) { + for (int xx = 0; xx < width; xx++) { + if (*src != 0) *dst = colour; + src++; + dst++; + } + src += srcScanSkip; + dst += dstScanSkip; + } + SDL_UnlockSurface(surface); + + SDL_FreeSurface(surface); + } +} + +static bool utf8_is_format_code(int codepoint) +{ + if (codepoint < 32) return true; + if (codepoint >= 123 && codepoint <= 155) return true; + return false; +} + +static const utf8 *ttf_process_format_code(rct_drawpixelinfo *dpi, const utf8 *text, text_draw_info *info) +{ + const utf8 *nextCh; + int codepoint; + + codepoint = utf8_get_next(text, &nextCh); + switch (codepoint) { + case FORMAT_MOVE_X: + info->x += *nextCh++; + break; + case FORMAT_ADJUST_PALETTE: + case 3: + case 4: + nextCh++; + break; + case FORMAT_NEWLINE: + case FORMAT_NEWLINE_SMALLER: + break; + case FORMAT_TINYFONT: + break; + case FORMAT_BIGFONT: + break; + case FORMAT_MEDIUMFONT: + break; + case FORMAT_SMALLFONT: + break; + case FORMAT_OUTLINE: + case FORMAT_OUTLINE_OFF: + break; + case FORMAT_WINDOW_COLOUR_1: + { + uint8 palette[5]; + uint16 flags = info->flags; + colour_char_window(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_1, uint8) - FORMAT_COLOUR_CODE_START, &flags, palette); + info->colour = palette[1]; + break; + } + case FORMAT_WINDOW_COLOUR_2: + { + uint8 palette[5]; + uint16 flags = info->flags; + colour_char_window(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_2, uint8) - FORMAT_COLOUR_CODE_START, &flags, palette); + info->colour = palette[1]; + break; + } + case FORMAT_WINDOW_COLOUR_3: + { + uint8 palette[5]; + uint16 flags = info->flags; + colour_char_window(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_3, uint8) - FORMAT_COLOUR_CODE_START, &flags, palette); + info->colour = palette[1]; + break; + } + case 0x10: + break; + case FORMAT_INLINE_SPRITE: + // g1Element = g1Elements[*((uint32*)(nextCh)) & 0x7FFFF]; + // width += g1Element.width; + nextCh += 4; + break; + default: + if (codepoint >= FORMAT_COLOUR_CODE_START && codepoint <= FORMAT_COLOUR_CODE_END) { + if (info->flags == 1) { + + } + + uint8 palette[5]; + uint16 flags = info->flags; + colour_char(codepoint - FORMAT_COLOUR_CODE_START, &flags, palette); + info->colour = palette[1]; + } else if (codepoint <= 0x16) { //case 0x11? FORMAT_NEW_LINE_X_Y + nextCh += 2; + } else { + nextCh += 4;//never happens? + } + break; + } + return nextCh; +} + +static const utf8 *ttf_process_glyph_run(rct_drawpixelinfo *dpi, const utf8 *text, text_draw_info *info) +{ + utf8 buffer[512]; + const utf8 *ch = text; + int codepoint; + + do { + codepoint = utf8_get_next(ch, &ch); + } while (!utf8_is_format_code(codepoint)); + if (codepoint == 0) { + ttf_draw_string_raw(dpi, text, info); + return ch - 1; + } else { + int length = ch - text - 1; + memcpy(buffer, text, length); + buffer[length] = 0; + ttf_draw_string_raw(dpi, buffer, info); + return ch; + } +} + +static void ttf_draw_string(rct_drawpixelinfo *dpi, char *text, int colour, int x, int y) +{ + text_draw_info info; + info.colour = colour; + info.flags = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); + info.x = x; + info.y = y; + + const utf8 *ch = text; + const utf8 *nextCh; + int codepoint; + while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { + if (utf8_is_format_code(codepoint)) { + ch = ttf_process_format_code(dpi, ch, &info); + } else { + ch = ttf_process_glyph_run(dpi, ch, &info); + } + } + + gLastDrawStringX = info.x; + gLastDrawStringY = info.y; +} + +static int ttf_get_string_width(const utf8 *text) +{ + text_draw_info info; + info.colour = 0; + info.flags = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); + info.x = 0; + info.y = 0; + + info.flags |= TEXT_DRAW_FLAG_NO_DRAW; + + const utf8 *ch = text; + const utf8 *nextCh; + int codepoint; + while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { + if (utf8_is_format_code(codepoint)) { + ch = ttf_process_format_code(NULL, ch, &info); + } else { + ch = ttf_process_glyph_run(NULL, ch, &info); + } + } + + return info.x; +} diff --git a/src/interface/widget.c b/src/interface/widget.c index 02ddf9ad14..9069c4b0af 100644 --- a/src/interface/widget.c +++ b/src/interface/widget.c @@ -848,6 +848,11 @@ static void widget_scroll_draw(rct_drawpixelinfo *dpi, rct_window *w, int widget window_event_scroll_paint_call(w, &scroll_dpi, scrollIndex); } +static utf8 BlackUpArrowString[] = { 0xC2, 0x8E, 0xC2, 0xA0, 0x00 }; +static utf8 BlackDownArrowString[] = { 0xC2, 0x8E, 0xC2, 0xAA, 0x00 }; +static utf8 BlackLeftArrowString[] = { 0xC2, 0x8E, 0xC2, 0xBE, 0x00 }; +static utf8 BlackRightArrowString[] = { 0xC2, 0x8E, 0xC2, 0xAF, 0x00 }; + static void widget_hscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, int l, int t, int r, int b, int colour) { colour &= 0x7F; @@ -861,7 +866,7 @@ static void widget_hscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i // Left button gfx_fill_rect_inset(dpi, l, t, l + 9, b, colour, (scroll->flags & HSCROLLBAR_LEFT_PRESSED ? 0x20 : 0)); - gfx_draw_string(dpi, (char*)0x009DED6C, 0, l + 1, t); + gfx_draw_string(dpi, BlackLeftArrowString, 0, l + 1, t); // Thumb gfx_fill_rect_inset(dpi, @@ -871,7 +876,7 @@ static void widget_hscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i // Right button gfx_fill_rect_inset(dpi, r - 9, t, r, b, colour, (scroll->flags & HSCROLLBAR_RIGHT_PRESSED ? 0x20 : 0)); - gfx_draw_string(dpi, (char*)0x009DED6F, 0, r - 6, t); + gfx_draw_string(dpi, BlackRightArrowString, 0, r - 6, t); } static void widget_vscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, int l, int t, int r, int b, int colour) @@ -887,7 +892,7 @@ static void widget_vscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i // Up button gfx_fill_rect_inset(dpi, l, t, r, t + 9, colour, (scroll->flags & VSCROLLBAR_UP_PRESSED ? 0x20 : 0)); - gfx_draw_string(dpi, (char*)0x009DED66, 0, l + 1, t - 1); + gfx_draw_string(dpi, BlackUpArrowString, 0, l + 1, t - 1); // Thumb gfx_fill_rect_inset(dpi, @@ -897,7 +902,7 @@ static void widget_vscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i // Down button gfx_fill_rect_inset(dpi, l, b - 9, r, b, colour, (scroll->flags & VSCROLLBAR_DOWN_PRESSED ? 0x20 : 0)); - gfx_draw_string(dpi, (char*)0x009DED69, 0, l + 1, b - 9); + gfx_draw_string(dpi, BlackDownArrowString, 0, l + 1, b - 9); } /** diff --git a/src/localisation/language.c b/src/localisation/language.c index 05c7eae239..07e468076b 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -19,10 +19,11 @@ *****************************************************************************/ #include "../addresses.h" +#include "../drawing/drawing.h" #include "../object.h" +#include "../openrct2.h" #include "../util/util.h" #include "localisation.h" -#include "../openrct2.h" typedef struct { int id; @@ -72,7 +73,7 @@ const char **_languageOriginal = (char**)0x009BF2D4; static int language_open_file(const char *filename, language_data *language); static void language_close(language_data *language); -static int utf8_get_next(char *char_ptr, char **nextchar_ptr) +uint32 utf8_get_next(const utf8 *char_ptr, const utf8 **nextchar_ptr) { int result; int numBytes; @@ -80,10 +81,15 @@ static int utf8_get_next(char *char_ptr, char **nextchar_ptr) if (!(char_ptr[0] & 0x80)) { result = char_ptr[0]; numBytes = 1; - } else if (!(char_ptr[0] & 0x20)) { + } else if ((char_ptr[0] & 0xE0) == 0xC0) { result = ((char_ptr[0] & 0x1F) << 6) | (char_ptr[1] & 0x3F); numBytes = 2; + } else if ((char_ptr[0] & 0xF0) == 0xE0) { + result = ((char_ptr[0] & 0x0F) << 12) | ((char_ptr[1] & 0x3F) << 6) | (char_ptr[2] & 0x3F); + numBytes = 3; } else { + // TODO 4 bytes + result = ' '; numBytes = 1; } @@ -92,6 +98,29 @@ static int utf8_get_next(char *char_ptr, char **nextchar_ptr) return result; } +utf8 *utf8_write_codepoint(utf8 *dst, uint32 codepoint) +{ + if (codepoint <= 0x7F) { + dst[0] = codepoint; + return dst + 1; + } else if (codepoint <= 0x7FF) { + dst[0] = 0xC0 | ((codepoint >> 6) & 0x1F); + dst[1] = 0x80 | (codepoint & 0x3F); + return dst + 2; + } else if (codepoint <= 0xFFFF) { + dst[0] = 0xE0 | ((codepoint >> 12) & 0x0F); + dst[1] = 0x80 | ((codepoint >> 6) & 0x3F); + dst[2] = 0x80 | (codepoint & 0x3F); + return dst + 3; + } else { + dst[0] = 0xF0 | ((codepoint >> 18) & 0x07); + dst[1] = 0x80 | ((codepoint >> 12) & 0x3F); + dst[2] = 0x80 | ((codepoint >> 6) & 0x3F); + dst[3] = 0x80 | (codepoint & 0x3F); + return dst + 4; + } +} + const char *language_get_string(rct_string_id id) { const char *openrctString = NULL; @@ -133,6 +162,11 @@ int language_open(int id) if (language_open_file(filename, &_languageCurrent)) { _languageCurrent.id = id; gCurrentLanguage = id; + + if (!ttf_initialise()) { + log_warning("Unable to initialise TrueType fonts."); + } + return 1; } @@ -242,10 +276,10 @@ static int language_open_file(const char *filename, language_data *language) int tokenLength = min(src - token, sizeof(tokenBuffer) - 1); memcpy(tokenBuffer, token, tokenLength); tokenBuffer[tokenLength] = 0; - char code = format_get_code(tokenBuffer); + uint8 code = (uint8)format_get_code(tokenBuffer); if (code == 0) code = atoi(tokenBuffer); - *dst++ = code; + dst = utf8_write_codepoint(dst, code); mode = 1; } break; diff --git a/src/localisation/language.h b/src/localisation/language.h index a8eeb81f5d..f51c02f8a3 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -48,4 +48,7 @@ void language_close_all(); rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/*ecx*/, int index/*ebx*/, int tableindex/*edx*/); +uint32 utf8_get_next(const utf8 *char_ptr, const utf8 **nextchar_ptr); +utf8 *utf8_write_codepoint(utf8 *dst, uint32 codepoint); + #endif diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 312c5215f3..4eb6e6e0a0 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -579,11 +579,11 @@ void format_string_code(unsigned char format_code, char **dest, char **args) } } -void format_string_part_from_raw(char **dest, const char *src, char **args) +void format_string_part_from_raw(utf8 **dest, const utf8 *src, char **args) { - unsigned char code; + unsigned int code; while (1) { - code = *src++; + code = utf8_get_next(src, &src); if (code < ' ') { if (code == 0) { *(*dest)++ = code; @@ -609,12 +609,12 @@ void format_string_part_from_raw(char **dest, const char *src, char **args) } else if (code < 142) { format_string_code(code, dest, args); } else { - *(*dest)++ = code; + *dest = utf8_write_codepoint(*dest, code); } } } -void format_string_part(char **dest, rct_string_id format, char **args) +void format_string_part(utf8 **dest, rct_string_id format, char **args) { if (format == (rct_string_id)STR_NONE) { **dest = 0; @@ -654,12 +654,12 @@ void format_string_part(char **dest, rct_string_id format, char **args) * format (ax) * args (ecx) */ -void format_string(char *dest, rct_string_id format, void *args) +void format_string(utf8 *dest, rct_string_id format, void *args) { format_string_part(&dest, format, (char**)&args); } -void format_string_raw(char *dest, char *src, void *args) +void format_string_raw(utf8 *dest, utf8 *src, void *args) { format_string_part_from_raw(&dest, src, (char**)&args); } @@ -671,7 +671,7 @@ void format_string_raw(char *dest, char *src, void *args) * format (ax) * args (ecx) */ -void format_string_to_upper(char *dest, rct_string_id format, void *args) +void format_string_to_upper(utf8 *dest, rct_string_id format, void *args) { format_string(dest, format, args); diff --git a/src/title.c b/src/title.c index 838e8924c7..e875ecfd19 100644 --- a/src/title.c +++ b/src/title.c @@ -436,7 +436,15 @@ void DrawOpenRCT2(int x, int y) gfx_fill_rect_inset(dpi, x, y, x + 128, y + 20, 0x80 | 12, 0x8); // Format text (name and version) - sprintf(buffer, "%c%c%c%s, v%s", FORMAT_MEDIUMFONT, FORMAT_OUTLINE, FORMAT_WHITE, OPENRCT2_NAME, OPENRCT2_VERSION); + char *ch = buffer;; + ch = utf8_write_codepoint(ch, FORMAT_MEDIUMFONT); + ch = utf8_write_codepoint(ch, FORMAT_OUTLINE); + ch = utf8_write_codepoint(ch, FORMAT_WHITE); + strcpy(ch, OPENRCT2_NAME); + strcat(buffer, ", v"); + strcat(buffer, OPENRCT2_VERSION); + + // sprintf(buffer, "%c%c%c%s, v%s", FORMAT_MEDIUMFONT, FORMAT_OUTLINE, FORMAT_WHITE, OPENRCT2_NAME, OPENRCT2_VERSION); if (!str_is_null_or_empty(OPENRCT2_BRANCH)) sprintf(strchr(buffer, 0), "-%s", OPENRCT2_BRANCH); if (!str_is_null_or_empty(OPENRCT2_BUILD_NUMBER)) From e21bea62cefcda4edf845c152b870a253d978b4d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 26 Jul 2015 13:58:53 +0100 Subject: [PATCH 0404/1173] implement utf8, part 2 --- projects/language/language.vcxproj | 1 + projects/language/language.vcxproj.filters | 3 + src/drawing/string.c | 227 ++++++++++++++++----- src/localisation/language.c | 60 +++--- src/localisation/language.h | 1 + 5 files changed, 213 insertions(+), 79 deletions(-) diff --git a/projects/language/language.vcxproj b/projects/language/language.vcxproj index 69620f3659..232d4f6509 100644 --- a/projects/language/language.vcxproj +++ b/projects/language/language.vcxproj @@ -112,6 +112,7 @@ + diff --git a/projects/language/language.vcxproj.filters b/projects/language/language.vcxproj.filters index 0c3b4d393c..6810d604ae 100644 --- a/projects/language/language.vcxproj.filters +++ b/projects/language/language.vcxproj.filters @@ -37,5 +37,8 @@ Resource Files\Language + + Resource Files\Language + \ No newline at end of file diff --git a/src/drawing/string.c b/src/drawing/string.c index 820bd80be1..545c2cbe05 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -29,6 +29,8 @@ static void ttf_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, in static bool _ttfInitialised = false; static TTF_Font *_ttfFont = NULL; +static int _ttfFontOffsetX = 0; +static int _ttfFontOffsetY = 0; /** * @@ -1267,12 +1269,14 @@ bool ttf_initialise() if (TTF_Init() != 0) return false; - _ttfFont = TTF_OpenFont("C:\\Windows\\Fonts\\tahoma.ttf", 11); + _ttfFont = TTF_OpenFont("C:\\Windows\\Fonts\\msyh.ttc", 11); if (_ttfFont == NULL) { TTF_Quit(); return false; } + _ttfFontOffsetX = 0; + _ttfFontOffsetY = -2; _ttfInitialised = true; } return true; @@ -1290,6 +1294,8 @@ void ttf_dispose() } enum { + TEXT_DRAW_FLAG_OUTLINE = 1 << 1, + TEXT_DRAW_FLAG_TTF = 1 << 30, TEXT_DRAW_FLAG_NO_DRAW = 1 << 31 }; @@ -1297,14 +1303,50 @@ typedef struct { int x; int y; int flags; - uint8 colour; + uint8 palette[8]; + uint16 font_sprite_base; } text_draw_info; -static void ttf_draw_string_raw(rct_drawpixelinfo *dpi, const utf8 *text, text_draw_info *info) +static bool utf8_is_format_code(int codepoint) +{ + if (codepoint < 32) return true; + if (codepoint >= 123 && codepoint <= 155) return true; + return false; +} + +static void ttf_draw_string_raw_sprite(rct_drawpixelinfo *dpi, const utf8 *text, text_draw_info *info) +{ + const utf8 *ch = text; + int codepoint; + + while (!utf8_is_format_code(codepoint = utf8_get_next(ch, &ch))) { + uint32 charOffset = info->font_sprite_base + codepoint - 32; + int charWidth = RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH, uint8)[charOffset] & 0xFF; + + if (!(info->flags & TEXT_DRAW_FLAG_NO_DRAW)) { + RCT2_GLOBAL(0x009ABDA4, uint8*) = (uint8*)&info->palette; + RCT2_GLOBAL(0x00EDF81C, uint32) = (IMAGE_TYPE_USE_PALETTE << 28); + gfx_draw_sprite_palette_set(dpi, SPR_CHAR_START + ((IMAGE_TYPE_USE_PALETTE << 28) | charOffset), info->x, info->y, info->palette, NULL); + } + + info->x += charWidth; + }; +} + +static void ttf_draw_string_raw_ttf(rct_drawpixelinfo *dpi, const utf8 *text, text_draw_info *info) { if (!_ttfInitialised && !ttf_initialise()) return; + int fontStyle = TTF_GetFontStyle(_ttfFont); + int newFontStyle = 0; + if (info->flags & TEXT_DRAW_FLAG_OUTLINE) { + newFontStyle |= TTF_STYLE_BOLD; + } + if (fontStyle != newFontStyle) { + TTF_SetFontStyle(_ttfFont, newFontStyle); + } + if (info->flags & TEXT_DRAW_FLAG_NO_DRAW) { int width, height; @@ -1312,7 +1354,7 @@ static void ttf_draw_string_raw(rct_drawpixelinfo *dpi, const utf8 *text, text_d info->x += width; return; } else { - uint8 colour = info->colour; + uint8 colour = info->palette[1]; SDL_Color c = { 0, 0, 0, 255 }; SDL_Surface *surface = TTF_RenderUTF8_Solid(_ttfFont, text, c); if (surface == NULL) @@ -1323,10 +1365,17 @@ static void ttf_draw_string_raw(rct_drawpixelinfo *dpi, const utf8 *text, text_d return; } + int drawX = info->x + _ttfFontOffsetX; + int drawY = info->y + _ttfFontOffsetY; int width = surface->w; int height = surface->h; - int skipX = info->x - dpi->x; - int skipY = info->y - dpi->y; + + int overflowX = (dpi->x + dpi->width) - (drawX + width); + int overflowY = (dpi->y + dpi->height) - (drawY + height); + if (overflowX < 0) width += overflowX; + if (overflowY < 0) height += overflowY; + int skipX = drawX - dpi->x; + int skipY = drawY - dpi->y; info->x += width; uint8 *src = surface->pixels; @@ -1335,11 +1384,14 @@ static void ttf_draw_string_raw(rct_drawpixelinfo *dpi, const utf8 *text, text_d if (skipX < 0) { width += skipX; src += -skipX; + skipX = 0; } if (skipY < 0) { height += skipY; src += (-skipY * surface->pitch); + skipY = 0; } + dst += skipX; dst += skipY * (dpi->width + dpi->pitch); @@ -1360,11 +1412,13 @@ static void ttf_draw_string_raw(rct_drawpixelinfo *dpi, const utf8 *text, text_d } } -static bool utf8_is_format_code(int codepoint) +static void ttf_draw_string_raw(rct_drawpixelinfo *dpi, const utf8 *text, text_draw_info *info) { - if (codepoint < 32) return true; - if (codepoint >= 123 && codepoint <= 155) return true; - return false; + if (info->flags & TEXT_DRAW_FLAG_TTF) { + ttf_draw_string_raw_ttf(dpi, text, info); + } else { + ttf_draw_string_raw_sprite(dpi, text, info); + } } static const utf8 *ttf_process_format_code(rct_drawpixelinfo *dpi, const utf8 *text, text_draw_info *info) @@ -1378,65 +1432,88 @@ static const utf8 *ttf_process_format_code(rct_drawpixelinfo *dpi, const utf8 *t info->x += *nextCh++; break; case FORMAT_ADJUST_PALETTE: + { + uint16 eax = palette_to_g1_offset[*nextCh++]; + rct_g1_element *g1Element = &g1Elements[eax]; + uint32 ebx = g1Element->offset[249] + 256; + if (!(info->flags & TEXT_DRAW_FLAG_OUTLINE)) { + ebx = ebx & 0xFF; + } + info->palette[1] = ebx & 0xFF; + info->palette[2] = (ebx >> 8) & 0xFF; + + // Adjust the text palette + memcpy(info->palette + 3, &(g1Element->offset[247]), 2); + memcpy(info->palette + 5, &(g1Element->offset[250]), 2); + + // Set the palette pointer + RCT2_GLOBAL(0x009ABDA4, uint32) = (uint32)&info->palette; + break; + } case 3: case 4: nextCh++; break; case FORMAT_NEWLINE: + if (info->font_sprite_base <= 224) { info->y += 28; } + else if (info->font_sprite_base <= 448) { info->y += 24; } + else { info->y += 18; } + break; case FORMAT_NEWLINE_SMALLER: break; case FORMAT_TINYFONT: + info->font_sprite_base = 448; break; case FORMAT_BIGFONT: + info->font_sprite_base = 672; break; case FORMAT_MEDIUMFONT: + info->font_sprite_base = 224; break; case FORMAT_SMALLFONT: + info->font_sprite_base = 0; break; case FORMAT_OUTLINE: + info->flags |= TEXT_DRAW_FLAG_OUTLINE; + break; case FORMAT_OUTLINE_OFF: + info->flags &= ~TEXT_DRAW_FLAG_OUTLINE; break; case FORMAT_WINDOW_COLOUR_1: { - uint8 palette[5]; uint16 flags = info->flags; - colour_char_window(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_1, uint8) - FORMAT_COLOUR_CODE_START, &flags, palette); - info->colour = palette[1]; + colour_char_window(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_1, uint8), &flags, info->palette); break; } case FORMAT_WINDOW_COLOUR_2: { - uint8 palette[5]; uint16 flags = info->flags; - colour_char_window(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_2, uint8) - FORMAT_COLOUR_CODE_START, &flags, palette); - info->colour = palette[1]; + colour_char_window(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_2, uint8), &flags, info->palette); break; } case FORMAT_WINDOW_COLOUR_3: { - uint8 palette[5]; uint16 flags = info->flags; - colour_char_window(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_3, uint8) - FORMAT_COLOUR_CODE_START, &flags, palette); - info->colour = palette[1]; + colour_char_window(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_3, uint8), &flags, info->palette); break; } case 0x10: break; case FORMAT_INLINE_SPRITE: - // g1Element = g1Elements[*((uint32*)(nextCh)) & 0x7FFFF]; - // width += g1Element.width; + { nextCh += 4; + uint32 imageId = *((uint32*)(nextCh - 3)); + rct_g1_element *g1Element = &g1Elements[imageId & 0x7FFFF]; + if (!(info->flags & TEXT_DRAW_FLAG_NO_DRAW)) { + gfx_draw_sprite(dpi, imageId, info->x, info->y, 0); + } + info->x += g1Element->width; break; + } default: if (codepoint >= FORMAT_COLOUR_CODE_START && codepoint <= FORMAT_COLOUR_CODE_END) { - if (info->flags == 1) { - - } - - uint8 palette[5]; uint16 flags = info->flags; - colour_char(codepoint - FORMAT_COLOUR_CODE_START, &flags, palette); - info->colour = palette[1]; + colour_char(codepoint - FORMAT_COLOUR_CODE_START, &flags, info->palette); } else if (codepoint <= 0x16) { //case 0x11? FORMAT_NEW_LINE_X_Y nextCh += 2; } else { @@ -1468,24 +1545,86 @@ static const utf8 *ttf_process_glyph_run(rct_drawpixelinfo *dpi, const utf8 *tex } } -static void ttf_draw_string(rct_drawpixelinfo *dpi, char *text, int colour, int x, int y) +static void ttf_process_string(rct_drawpixelinfo *dpi, const utf8 *text, text_draw_info *info) { - text_draw_info info; - info.colour = colour; - info.flags = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); - info.x = x; - info.y = y; - const utf8 *ch = text; const utf8 *nextCh; int codepoint; while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { if (utf8_is_format_code(codepoint)) { - ch = ttf_process_format_code(dpi, ch, &info); + ch = ttf_process_format_code(dpi, ch, info); } else { - ch = ttf_process_glyph_run(dpi, ch, &info); + ch = ttf_process_glyph_run(dpi, ch, info); } } +} + +static void ttf_process_initial_colour(int colour, text_draw_info *info) +{ + if (colour != 254 && colour != 255) { + info->flags &= ~(1 | 2 | 4 | 8); + if (info->font_sprite_base < 0) { + info->flags |= 4; + if (info->font_sprite_base != -1) { + info->flags |= 8; + } + info->font_sprite_base = 224; + } + if (colour & (1 << 5)) { + info->flags |= TEXT_DRAW_FLAG_OUTLINE; + } + colour &= ~(1 << 5); + if (!(colour & (1 << 6))) { + if (!(info->flags & 1)) { + uint16 flags = info->flags; + colour_char_window(colour, &flags, (uint8*)&info->palette); + } + } else { + info->flags |= 1; + colour &= 0x1F; + + uint32 eax; + if (info->flags & 4) { + if (info->flags & 8) { + eax = RCT2_ADDRESS(0x0141FC48, uint8)[colour * 8]; + eax = eax << 16; + eax = eax | RCT2_ADDRESS(0x0141FC46, uint8)[colour * 8]; + } else { + eax = RCT2_ADDRESS(0x0141FC49, uint8)[colour * 8]; + eax = eax << 16; + eax = eax | RCT2_ADDRESS(0x0141FC47, uint8)[colour * 8]; + } + } else { + eax = RCT2_ADDRESS(0x0141FC4A, uint8)[colour * 8]; + eax = eax << 16; + eax = eax | RCT2_ADDRESS(0x0141FC48, uint8)[colour * 8]; + } + + // Adjust text palette. Store current colour? ; + info->palette[1] = eax & 0xFF; + info->palette[2] = (eax >> 8) & 0xFF; + info->palette[3] = (eax >> 16) & 0xFF; + info->palette[4] = (eax >> 24) & 0xFF; + RCT2_GLOBAL(0x009ABDA4, uint8*) = (uint8*)&info->palette; + eax = 0; + } + } +} + +static void ttf_draw_string(rct_drawpixelinfo *dpi, char *text, int colour, int x, int y) +{ + text_draw_info info; + info.font_sprite_base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + info.flags = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); + info.x = x; + info.y = y; + + info.flags |= TEXT_DRAW_FLAG_TTF; + + memset(info.palette, 0, sizeof(info.palette)); + + ttf_process_initial_colour(colour, &info); + ttf_process_string(dpi, text, &info); gLastDrawStringX = info.x; gLastDrawStringY = info.y; @@ -1494,23 +1633,15 @@ static void ttf_draw_string(rct_drawpixelinfo *dpi, char *text, int colour, int static int ttf_get_string_width(const utf8 *text) { text_draw_info info; - info.colour = 0; + info.font_sprite_base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); info.flags = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); info.x = 0; info.y = 0; + info.flags |= TEXT_DRAW_FLAG_TTF; info.flags |= TEXT_DRAW_FLAG_NO_DRAW; - const utf8 *ch = text; - const utf8 *nextCh; - int codepoint; - while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { - if (utf8_is_format_code(codepoint)) { - ch = ttf_process_format_code(NULL, ch, &info); - } else { - ch = ttf_process_glyph_run(NULL, ch, &info); - } - } + ttf_process_string(NULL, text, &info); return info.x; } diff --git a/src/localisation/language.c b/src/localisation/language.c index 07e468076b..f620661168 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -34,33 +34,35 @@ typedef struct { } language_data; const char *language_names[LANGUAGE_COUNT] = { - "", // LANGUAGE_UNDEFINED - "English (UK)", // LANGUAGE_ENGLISH_UK - "English (US)", // LANGUAGE_ENGLISH_US - "Deutsch", // LANGUAGE_GERMAN - "Nederlands", // LANGUAGE_DUTCH - "Fran\u00E7ais", // LANGUAGE_FRENCH - "Magyar", // LANGUAGE_HUNGARIAN - "Polski", // LANGUAGE_POLISH - "Espa\u00F1ol", // LANGUAGE_SPANISH - "Svenska", // LANGUAGE_SWEDISH - "Italiano", // LANGUAGE_ITALIAN - "Portug\u00CAs (BR)"// LANGUAGE_PORTUGUESE_BR + "", // LANGUAGE_UNDEFINED + "English (UK)", // LANGUAGE_ENGLISH_UK + "English (US)", // LANGUAGE_ENGLISH_US + "Deutsch", // LANGUAGE_GERMAN + "Nederlands", // LANGUAGE_DUTCH + "Fran\u00E7ais", // LANGUAGE_FRENCH + "Magyar", // LANGUAGE_HUNGARIAN + "Polski", // LANGUAGE_POLISH + "Espa\u00F1ol", // LANGUAGE_SPANISH + "Svenska", // LANGUAGE_SWEDISH + "Italiano", // LANGUAGE_ITALIAN + "Portug\u00CAs (BR)", // LANGUAGE_PORTUGUESE_BR + "Chinese Traditional" // LANGUAGE_CHINESE_TRADITIONAL }; const char *language_filenames[LANGUAGE_COUNT] = { - "", // LANGUAGE_UNDEFINED - "english_uk", // LANGUAGE_ENGLISH_UK - "english_us", // LANGUAGE_ENGLISH_US - "german", // LANGUAGE_GERMAN - "dutch", // LANGUAGE_DUTCH - "french", // LANGUAGE_FRENCH - "hungarian", // LANGUAGE_HUNGARIAN - "polish", // LANGUAGE_POLISH - "spanish_sp", // LANGUAGE_SPANISH - "swedish", // LANGUAGE_SWEDISH - "italian", // LANGUAGE_ITALIAN - "portuguese_br" // LANGUAGE_PORTUGUESE_BR + "", // LANGUAGE_UNDEFINED + "english_uk", // LANGUAGE_ENGLISH_UK + "english_us", // LANGUAGE_ENGLISH_US + "german", // LANGUAGE_GERMAN + "dutch", // LANGUAGE_DUTCH + "french", // LANGUAGE_FRENCH + "hungarian", // LANGUAGE_HUNGARIAN + "polish", // LANGUAGE_POLISH + "spanish_sp", // LANGUAGE_SPANISH + "swedish", // LANGUAGE_SWEDISH + "italian", // LANGUAGE_ITALIAN + "portuguese_br", // LANGUAGE_PORTUGUESE_BR + "chinese_traditional" // LANGUAGE_CHINESE_TRADITIONAL }; int gCurrentLanguage = LANGUAGE_UNDEFINED; @@ -101,7 +103,7 @@ uint32 utf8_get_next(const utf8 *char_ptr, const utf8 **nextchar_ptr) utf8 *utf8_write_codepoint(utf8 *dst, uint32 codepoint) { if (codepoint <= 0x7F) { - dst[0] = codepoint; + dst[0] = (utf8)codepoint; return dst + 1; } else if (codepoint <= 0x7FF) { dst[0] = 0xC0 | ((codepoint >> 6) & 0x1F); @@ -231,12 +233,8 @@ static int language_open_file(const char *filename, language_data *language) // Handle UTF-8 char *srcNext; - int utf8Char = utf8_get_next(src, &srcNext); + uint32 utf8Char = utf8_get_next(src, &srcNext); i += srcNext - src - 1; - if (utf8Char > 0xFF) - utf8Char = '?'; - else if (utf8Char > 0x7F) - utf8Char &= 0xFF; switch (mode) { case 0: @@ -267,7 +265,7 @@ static int language_open_file(const char *filename, language_data *language) *dst = 0; mode = 0; } else { - *dst++ = utf8Char; + dst = utf8_write_codepoint(dst, utf8Char); } break; case 2: diff --git a/src/localisation/language.h b/src/localisation/language.h index f51c02f8a3..2999ec9d6b 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -36,6 +36,7 @@ enum { LANGUAGE_SWEDISH, LANGUAGE_ITALIAN, LANGUAGE_PORTUGUESE_BR, + LANGUAGE_CHINESE_TRADITIONAL, LANGUAGE_COUNT }; From 2bb0c6c53f7ed88ced72ae54684975c7575d07a4 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 26 Jul 2015 17:50:01 +0100 Subject: [PATCH 0405/1173] implement utf8, part 3 --- src/drawing/string.c | 597 ++++++++------------------------ src/interface/widget.c | 8 +- src/localisation/currency.c | 20 +- src/localisation/currency.h | 4 +- src/localisation/format_codes.h | 48 +-- src/localisation/language.c | 71 ++-- src/localisation/language.h | 15 +- src/localisation/localisation.c | 137 +++++--- src/localisation/localisation.h | 6 +- src/windows/options.c | 4 +- 10 files changed, 329 insertions(+), 581 deletions(-) diff --git a/src/drawing/string.c b/src/drawing/string.c index 545c2cbe05..93341e69a8 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -28,17 +28,28 @@ static int ttf_get_string_width(const utf8 *text); static void ttf_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, int y); static bool _ttfInitialised = false; -static TTF_Font *_ttfFont = NULL; +static TTF_Font *_ttfFont[4] = { NULL }; static int _ttfFontOffsetX = 0; static int _ttfFontOffsetY = 0; +static const int TTFFontSizes[] = { 7, 9, 11, 13 }; + +enum { + FONT_SPRITE_BASE_TINY = 448, + FONT_SPRITE_BASE_SMALL = 0, + FONT_SPRITE_BASE_MEDIUM = 224, + FONT_SPRITE_BASE_BIG = 672 +}; + +static uint8 *_spriteFontCharacterWidths = (uint8*)RCT2_ADDRESS_FONT_CHAR_WIDTH; + /** * * rct2: 0x006C19AC */ void gfx_load_character_widths(){ - uint8* char_width_pointer = RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH, uint8); + uint8* char_width_pointer = _spriteFontCharacterWidths; for (int char_set_offset = 0; char_set_offset < 4*0xE0; char_set_offset+=0xE0){ for (uint8 c = 0; c < 0xE0; c++, char_width_pointer++){ rct_g1_element g1 = g1Elements[c + SPR_CHAR_START + char_set_offset]; @@ -108,7 +119,7 @@ int gfx_get_string_width_new_lined(char* buffer){ for (uint8* curr_char = (uint8*)buffer; *curr_char != (uint8)0; curr_char++) { if (*curr_char >= 0x20) { - width += RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH, uint8)[*current_font_sprite_base + (*curr_char - 0x20)]; + width += _spriteFontCharacterWidths[*current_font_sprite_base + (*curr_char - 0x20)]; continue; } switch (*curr_char) { @@ -175,72 +186,7 @@ int gfx_get_string_width_new_lined(char* buffer){ */ int gfx_get_string_width(char* buffer) { - if (_ttfInitialised) { - return ttf_get_string_width(buffer); - } - - // Current font sprites - uint16* current_font_sprite_base; - // Width of string - int width; - rct_g1_element g1_element; - - current_font_sprite_base = RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); - width = 0; - - for (uint8* curr_char = (uint8*)buffer; *curr_char != (uint8)0; curr_char++) { - - if (*curr_char >= 0x20) { - width += RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH, uint8)[*current_font_sprite_base + (*curr_char - 0x20)]; - continue; - } - switch(*curr_char) { - case FORMAT_MOVE_X: - curr_char++; - width = *curr_char; - break; - case FORMAT_ADJUST_PALETTE: - case 3: - case 4: - curr_char++; - break; - case FORMAT_NEWLINE: - case FORMAT_NEWLINE_SMALLER: - continue; - case FORMAT_TINYFONT: - *current_font_sprite_base = 0x1C0; - break; - case FORMAT_BIGFONT: - *current_font_sprite_base = 0x2A0; - break; - case FORMAT_MEDIUMFONT: - *current_font_sprite_base = 0x0E0; - break; - case FORMAT_SMALLFONT: - *current_font_sprite_base = 0; - break; - case FORMAT_OUTLINE: - case FORMAT_OUTLINE_OFF: - case FORMAT_WINDOW_COLOUR_1: - case FORMAT_WINDOW_COLOUR_2: - case FORMAT_WINDOW_COLOUR_3: - case 0x10: - continue; - case FORMAT_INLINE_SPRITE: - g1_element = g1Elements[*((uint32*)(curr_char + 1)) & 0x7FFFF]; - width += g1_element.width; - curr_char += 4; - break; - default: - if (*curr_char <= 0x16) { //case 0x11? FORMAT_NEW_LINE_X_Y - curr_char += 2; - continue; - } - curr_char += 4;//never happens? - break; - } - } - return width; + return ttf_get_string_width(buffer); } /** @@ -250,57 +196,52 @@ int gfx_get_string_width(char* buffer) * buffer (esi) * width (edi) */ -int gfx_clip_string(char* buffer, int width) +int gfx_clip_string(utf8 *text, int width) { - // Location of font sprites - uint16 current_font_sprite_base; - // Width the string has to fit into - unsigned int max_width; - // Character to change to ellipsis - unsigned char* last_char; - // Width of the string, including ellipsis - - unsigned int clipped_width; - rct_g1_element g1_element; + uint16 fontSpriteBase; + int maxWidth; if (width < 6) { - *buffer = 0; + *text = 0; return 0; } + + fontSpriteBase = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + int dotCharacterWidth = _spriteFontCharacterWidths[fontSpriteBase + ('.' - ' ')]; + int elipsisCharacterWidth = dotCharacterWidth * 3; - current_font_sprite_base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); - max_width = width - (3 * RCT2_ADDRESS(0x141E9F6, uint8)[current_font_sprite_base]); + maxWidth = width - elipsisCharacterWidth; - clipped_width = 0; - last_char = buffer; - - for (unsigned char* curr_char = buffer; *curr_char != (uint8)0; curr_char++) { - if (*curr_char < 0x20) { - switch (*curr_char) { + int clippedWidth = 0; + utf8 *lastCh = text; + utf8 *ch = text; + int codepoint; + while ((codepoint = utf8_get_next(ch, &ch)) != 0) { + if (utf8_is_format_code(codepoint)) { + switch (codepoint) { case FORMAT_MOVE_X: - curr_char++; - clipped_width = *curr_char; - continue; + clippedWidth = *ch++; + break; case FORMAT_ADJUST_PALETTE: case 3: case 4: - curr_char++; - continue; + ch++; + break; case FORMAT_NEWLINE: case FORMAT_NEWLINE_SMALLER: - continue; + break; case FORMAT_TINYFONT: - current_font_sprite_base = 0x1C0; - break; - case FORMAT_BIGFONT: - current_font_sprite_base = 0x2A0; - break; - case FORMAT_MEDIUMFONT: - current_font_sprite_base = 0x0E0; + fontSpriteBase = 448; break; case FORMAT_SMALLFONT: - current_font_sprite_base = 0; + fontSpriteBase = 0; + break; + case FORMAT_MEDIUMFONT: + fontSpriteBase = 224; + break; + case FORMAT_BIGFONT: + fontSpriteBase = 672; break; case FORMAT_OUTLINE: case FORMAT_OUTLINE_OFF: @@ -308,36 +249,40 @@ int gfx_clip_string(char* buffer, int width) case FORMAT_WINDOW_COLOUR_2: case FORMAT_WINDOW_COLOUR_3: case 0x10: - continue; + break; case FORMAT_INLINE_SPRITE: - g1_element = g1Elements[*((uint32*)(curr_char + 1)) & 0x7FFFF]; - clipped_width += g1_element.width; - curr_char += 4; - continue; + g1_element = g1Elements[*((uint32*)(ch - 1)) & 0x7FFFF]; + clippedWidth += g1_element.width; + ch += 4; + break; default: - if (*curr_char <= 0x16) { //case 0x11? FORMAT_NEW_LINE_X_Y - curr_char += 2; - continue; + if (codepoint >= FORMAT_COLOUR_CODE_START || codepoint <= FORMAT_COLOUR_CODE_END) { + break; } - curr_char += 4;//never happens? - continue; + if (codepoint <= 22) { //case 0x11? FORMAT_NEW_LINE_X_Y + ch += 2; + } else { + ch += 4;//never happens? + } + break; } - max_width = width - (3 * RCT2_ADDRESS(0x141E9F6, uint8)[current_font_sprite_base]); - } - clipped_width += RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH, uint8)[current_font_sprite_base + (*curr_char - 0x20)]; - - if ((int)clipped_width > width) { -// *((uint32*)last_char) = '...'; - strcpy(last_char-3, "..."); - clipped_width = width; - return clipped_width; - } - if (clipped_width <= max_width) { - last_char = curr_char+1; + dotCharacterWidth = _spriteFontCharacterWidths[fontSpriteBase + ('.' - ' ')]; + elipsisCharacterWidth = dotCharacterWidth * 3; + maxWidth = width - elipsisCharacterWidth; + } else { + clippedWidth += _spriteFontCharacterWidths[fontSpriteBase + utf8_get_sprite_offset_for_codepoint(codepoint)]; + if (clippedWidth > width) { + strcpy(lastCh - 3, "..."); + clippedWidth = width; + return clippedWidth; + } + if (clippedWidth <= maxWidth) { + lastCh = ch + 1; + } } } - return clipped_width; + return clippedWidth; } @@ -423,7 +368,7 @@ int gfx_wrap_string(char* buffer, int width, int* num_lines, int* font_height) } } - line_width += RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH, uint8)[*font_height + (*curr_char - 0x20)]; + line_width += _spriteFontCharacterWidths[*font_height + (*curr_char - 0x20)]; if ((int)line_width <= width) { continue; @@ -790,298 +735,7 @@ void colour_char_window(uint8 colour, uint16* current_font_flags,uint8* palette_ */ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, int y) { - if (_ttfInitialised) { - ttf_draw_string(dpi, buffer, colour, x, y); - return; - } - - int eax, ebx, ebp; - rct_g1_element* g1_element; - - // Maximum length/height of string - int max_x = x; - int max_y = y; - - // - uint16 *current_font_flags = RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); - sint16 *current_font_sprite_base = RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16); - - uint8* palette_pointer = text_palette; - - // Flag for skipping non-printing characters - int skip_char = 0; - - if (colour != 0xFE) { - - if (x >= dpi->x + dpi->width) - return; - - if (x + 0x280 <= dpi->x) - return; - - if (y >= dpi->y + dpi->height) - return; - - if (y + 0x5A <= dpi->y) { - return; - } - - if (colour != 0xFF) { - - // switch_colour: - *current_font_flags = 0; - if (*current_font_sprite_base < 0) { - *current_font_flags |= 4; - if (*current_font_sprite_base != -1) { - *current_font_flags |= 8; - } - *current_font_sprite_base = 224; - } - if (colour & (1 << 5)) { - *current_font_flags |= 2; - } - colour &= ~(1 << 5); - - if (!(colour & 0x40)) { - ebp = colour; - if (*current_font_flags & 1) { - if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { - skip_char = 1; - } else { - skip_char = 0; - } - } else { - colour_char_window(ebp, current_font_flags, palette_pointer); - } - } else { - *current_font_flags |= 1; - colour &= 0x1F; - - if (*current_font_flags & 4) { - if (*current_font_flags & 8) { - eax = RCT2_ADDRESS(0x0141FC48, uint8)[colour * 8]; - eax = eax << 16; - eax = eax | RCT2_ADDRESS(0x0141FC46, uint8)[colour * 8]; - } else { - eax = RCT2_ADDRESS(0x0141FC49, uint8)[colour * 8]; - eax = eax << 16; - eax = eax | RCT2_ADDRESS(0x0141FC47, uint8)[colour * 8]; - } - } else { - eax = RCT2_ADDRESS(0x0141FC4A, uint8)[colour * 8]; - eax = eax << 16; - eax = eax | RCT2_ADDRESS(0x0141FC48, uint8)[colour * 8]; - } - // Adjust text palette. Store current colour? ; - palette_pointer[1] = eax & 0xFF; - palette_pointer[2] = (eax >> 8) & 0xFF; - palette_pointer[3] = (eax >> 16) & 0xFF; - palette_pointer[4] = (eax >> 24) & 0xFF; - RCT2_GLOBAL(0x009ABDA4, uint32) = (uint32)palette_pointer; - eax = 0; - } - } - } - - if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { - skip_char = 1; - } - - for (uint8 al = *buffer; al > 0; ++buffer, al = *buffer) { - - // Skip to the next printing character - if (skip_char) { - if (al < 0x20) { - // Control codes - skip_char = 0; - } else if (al >= FORMAT_COLOUR_CODE_START && al <= FORMAT_COLOUR_CODE_END) { - // Colour codes - if (*current_font_flags == 1) { - if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { - skip_char = 1; - } else { - skip_char = 0; - } - continue; - } - colour_char(al - FORMAT_COLOUR_CODE_START, current_font_flags, palette_pointer); - continue; - } else { - continue; - } - } - - // Control codes - switch (al) { - case FORMAT_MOVE_X://Start New Line at start+buffer x, same y. (Overwrite?) - max_x = x + (uint8)*++buffer; - break; - case FORMAT_ADJUST_PALETTE: - al = *++buffer; - if (*current_font_flags & 1) { - if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { - skip_char = 1; - break; - } - } - - eax = palette_to_g1_offset[al]; //RCT2_ADDRESS(0x097FCBC, uint32)[al * 4]; - g1_element = &g1Elements[eax]; - ebx = g1_element->offset[0xF9] + (1 << 8); - if (!(*current_font_flags & 2)) { - ebx = ebx & 0xFF; - } - - palette_pointer[1] = ebx & 0xff; - palette_pointer[2] = (ebx >> 8) & 0xff; - //Adjust the text palette - memcpy(palette_pointer + 3, &(g1_element->offset[0xF7]), 2); - memcpy(palette_pointer + 5, &(g1_element->offset[0xFA]), 2); - //Set the palette pointer - RCT2_GLOBAL(0x009ABDA4, uint32) = (uint32)palette_pointer; - - - if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { - skip_char = 1; - } - break; - case FORMAT_NEWLINE://Start New Line at set y lower - max_x = x; - if (*current_font_sprite_base <= 224) { - max_y += 10; - break; - } - else if (*current_font_sprite_base == 448) { - max_y += 6; - break; - } - max_y += 18; - break; - case FORMAT_NEWLINE_SMALLER://Start New Line at set y lower - max_x = x; - if (*current_font_sprite_base <= 224) { - max_y += 5; - break; - } - else if (*current_font_sprite_base == 448) { - max_y += 3; - break; - } - max_y += 9; - break; - case FORMAT_TINYFONT: - *current_font_sprite_base = 448; - break; - case FORMAT_BIGFONT: - *current_font_sprite_base = 672; - break; - case FORMAT_MEDIUMFONT: - *current_font_sprite_base = 224; - break; - case FORMAT_SMALLFONT: - *current_font_sprite_base = 0; - break; - case FORMAT_OUTLINE: - *current_font_flags |= 2; - break; - case FORMAT_OUTLINE_OFF: - *current_font_flags &= 0x0FFFD; - break; - case FORMAT_WINDOW_COLOUR_1: - ebp = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_1, uint8); - if (*current_font_flags & 1) { - if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { - skip_char = 1; - } - else { - skip_char = 0; - } - break; - } - colour_char_window(ebp, current_font_flags, palette_pointer); - break; - case FORMAT_WINDOW_COLOUR_2: - ebp = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_2, uint8); - if (*current_font_flags & 1) { - if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { - skip_char = 1; - } - else { - skip_char = 0; - } - break; - } - colour_char_window(ebp, current_font_flags, palette_pointer); - break; - case FORMAT_WINDOW_COLOUR_3: - ebp = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WINDOW_COLOUR_3, uint8); - if (*current_font_flags & 1) { - if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { - skip_char = 1; - } - else { - skip_char = 0; - } - break; - } - colour_char_window(ebp, current_font_flags, palette_pointer); - break; - case FORMAT_NEWLINE_X_Y: //Start new line at specified x,y - max_x = x + *++buffer; - max_y = y + *++buffer; - break; - case FORMAT_INLINE_SPRITE: - buffer += 4; - if (max_x >= dpi->x + dpi->width) { - skip_char = 1; - break; - } - uint32 image_id = *((uint32*)(buffer - 3)); - uint32 image_offset = image_id & 0x7FFFF; - g1_element = &g1Elements[image_offset]; - - gfx_draw_sprite(dpi, image_id, max_x, max_y, 0); - - max_x = max_x + g1_element->width; - break; - default: - // Colour codes - if ((al >= FORMAT_COLOUR_CODE_START) && (al <= FORMAT_COLOUR_CODE_END)){ - - if (*current_font_flags == 1) { - if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { - skip_char = 1; - } else { - skip_char = 0; - } - continue; - } - colour_char(al - FORMAT_COLOUR_CODE_START, current_font_flags, palette_pointer); - continue; - } - - // Normal Characters - if (max_x >= dpi->x + dpi->width) { - skip_char = 1; - } - if (max_x + 0x1A < dpi->x) { - ebx = al-0x20; - ebx += *current_font_sprite_base; - max_x = max_x + (RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH, uint8)[ebx] & 0xFF); - continue; - } - - uint32 char_offset = al - 0x20 + *current_font_sprite_base; - RCT2_GLOBAL(0x00EDF81C, uint32) = (IMAGE_TYPE_USE_PALETTE << 28); - - gfx_draw_sprite_palette_set(dpi, ((IMAGE_TYPE_USE_PALETTE << 28) | char_offset) + SPR_CHAR_START, max_x, max_y, palette_pointer, NULL); - max_x += (RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH, uint8)[char_offset] & 0xFF); - continue; - } - } - - gLastDrawStringX = max_x; - gLastDrawStringY = max_y; + ttf_draw_string(dpi, buffer, colour, x, y); } void draw_string_left_underline(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y) @@ -1269,14 +923,18 @@ bool ttf_initialise() if (TTF_Init() != 0) return false; - _ttfFont = TTF_OpenFont("C:\\Windows\\Fonts\\msyh.ttc", 11); - if (_ttfFont == NULL) { - TTF_Quit(); - return false; + utf8 fontPath[MAX_PATH] = "C:\\Windows\\Fonts\\"; + strcat(fontPath, gTrueTypeFontPath); + for (int i = 0; i < 4; i++) { + _ttfFont[i] = TTF_OpenFont(fontPath, TTFFontSizes[i]); + if (_ttfFont[i] == NULL) { + TTF_Quit(); + return false; + } } _ttfFontOffsetX = 0; - _ttfFontOffsetY = -2; + _ttfFontOffsetY = -3; _ttfInitialised = true; } return true; @@ -1287,10 +945,15 @@ void ttf_dispose() if (!_ttfInitialised) return; - if (_ttfFont != NULL) - TTF_CloseFont(_ttfFont); + if (_ttfFont != NULL) { + for (int i = 0; i < 4; i++) { + TTF_CloseFont(_ttfFont[i]); + _ttfFont[i] = NULL; + } + } TTF_Quit(); + _ttfInitialised = false; } enum { @@ -1300,6 +963,8 @@ enum { }; typedef struct { + int startX; + int startY; int x; int y; int flags; @@ -1307,21 +972,14 @@ typedef struct { uint16 font_sprite_base; } text_draw_info; -static bool utf8_is_format_code(int codepoint) -{ - if (codepoint < 32) return true; - if (codepoint >= 123 && codepoint <= 155) return true; - return false; -} - static void ttf_draw_string_raw_sprite(rct_drawpixelinfo *dpi, const utf8 *text, text_draw_info *info) { const utf8 *ch = text; int codepoint; while (!utf8_is_format_code(codepoint = utf8_get_next(ch, &ch))) { - uint32 charOffset = info->font_sprite_base + codepoint - 32; - int charWidth = RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH, uint8)[charOffset] & 0xFF; + uint32 charOffset = info->font_sprite_base + utf8_get_sprite_offset_for_codepoint(codepoint); + int charWidth = _spriteFontCharacterWidths[charOffset] & 0xFF; if (!(info->flags & TEXT_DRAW_FLAG_NO_DRAW)) { RCT2_GLOBAL(0x009ABDA4, uint8*) = (uint8*)&info->palette; @@ -1338,25 +996,42 @@ static void ttf_draw_string_raw_ttf(rct_drawpixelinfo *dpi, const utf8 *text, te if (!_ttfInitialised && !ttf_initialise()) return; - int fontStyle = TTF_GetFontStyle(_ttfFont); + TTF_Font *font; + switch (info->font_sprite_base) { + case FONT_SPRITE_BASE_TINY: + font = _ttfFont[0]; + break; + case FONT_SPRITE_BASE_SMALL: + font = _ttfFont[1]; + break; + default: + case FONT_SPRITE_BASE_MEDIUM: + font = _ttfFont[2]; + break; + case FONT_SPRITE_BASE_BIG: + font = _ttfFont[3]; + break; + } + + int fontStyle = TTF_GetFontStyle(font); int newFontStyle = 0; if (info->flags & TEXT_DRAW_FLAG_OUTLINE) { newFontStyle |= TTF_STYLE_BOLD; } if (fontStyle != newFontStyle) { - TTF_SetFontStyle(_ttfFont, newFontStyle); + TTF_SetFontStyle(font, newFontStyle); } if (info->flags & TEXT_DRAW_FLAG_NO_DRAW) { int width, height; - TTF_SizeUTF8(_ttfFont, text, &width, &height); + TTF_SizeUTF8(font, text, &width, &height); info->x += width; return; } else { uint8 colour = info->palette[1]; SDL_Color c = { 0, 0, 0, 255 }; - SDL_Surface *surface = TTF_RenderUTF8_Solid(_ttfFont, text, c); + SDL_Surface *surface = TTF_RenderUTF8_Solid(font, text, c); if (surface == NULL) return; @@ -1429,7 +1104,7 @@ static const utf8 *ttf_process_format_code(rct_drawpixelinfo *dpi, const utf8 *t codepoint = utf8_get_next(text, &nextCh); switch (codepoint) { case FORMAT_MOVE_X: - info->x += *nextCh++; + info->x = info->startX + *nextCh++; break; case FORMAT_ADJUST_PALETTE: { @@ -1464,14 +1139,14 @@ static const utf8 *ttf_process_format_code(rct_drawpixelinfo *dpi, const utf8 *t case FORMAT_TINYFONT: info->font_sprite_base = 448; break; - case FORMAT_BIGFONT: - info->font_sprite_base = 672; + case FORMAT_SMALLFONT: + info->font_sprite_base = 0; break; case FORMAT_MEDIUMFONT: info->font_sprite_base = 224; break; - case FORMAT_SMALLFONT: - info->font_sprite_base = 0; + case FORMAT_BIGFONT: + info->font_sprite_base = 672; break; case FORMAT_OUTLINE: info->flags |= TEXT_DRAW_FLAG_OUTLINE; @@ -1501,13 +1176,13 @@ static const utf8 *ttf_process_format_code(rct_drawpixelinfo *dpi, const utf8 *t break; case FORMAT_INLINE_SPRITE: { - nextCh += 4; - uint32 imageId = *((uint32*)(nextCh - 3)); + uint32 imageId = *((uint32*)(nextCh)); rct_g1_element *g1Element = &g1Elements[imageId & 0x7FFFF]; if (!(info->flags & TEXT_DRAW_FLAG_NO_DRAW)) { gfx_draw_sprite(dpi, imageId, info->x, info->y, 0); } info->x += g1Element->width; + nextCh += 4; break; } default: @@ -1528,16 +1203,17 @@ static const utf8 *ttf_process_glyph_run(rct_drawpixelinfo *dpi, const utf8 *tex { utf8 buffer[512]; const utf8 *ch = text; + const utf8 *lastCh; int codepoint; - do { - codepoint = utf8_get_next(ch, &ch); - } while (!utf8_is_format_code(codepoint)); + while (!utf8_is_format_code(codepoint = utf8_get_next(ch, &lastCh))) { + ch = lastCh; + } if (codepoint == 0) { ttf_draw_string_raw(dpi, text, info); - return ch - 1; + return ch; } else { - int length = ch - text - 1; + int length = ch - text; memcpy(buffer, text, length); buffer[length] = 0; ttf_draw_string_raw(dpi, buffer, info); @@ -1550,9 +1226,16 @@ static void ttf_process_string(rct_drawpixelinfo *dpi, const utf8 *text, text_dr const utf8 *ch = text; const utf8 *nextCh; int codepoint; + + bool isTTF = info->flags & TEXT_DRAW_FLAG_TTF; + while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { if (utf8_is_format_code(codepoint)) { ch = ttf_process_format_code(dpi, ch, info); + } else if (isTTF && utf8_should_use_sprite_for_codepoint(codepoint)) { + info->flags &= ~TEXT_DRAW_FLAG_TTF; + ch = ttf_process_glyph_run(dpi, ch, info); + info->flags |= TEXT_DRAW_FLAG_TTF; } else { ch = ttf_process_glyph_run(dpi, ch, info); } @@ -1616,15 +1299,17 @@ static void ttf_draw_string(rct_drawpixelinfo *dpi, char *text, int colour, int text_draw_info info; info.font_sprite_base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); info.flags = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); + info.startX = x; + info.startY = x; info.x = x; info.y = y; - info.flags |= TEXT_DRAW_FLAG_TTF; - - memset(info.palette, 0, sizeof(info.palette)); + if (gUseTrueTypeFont) info.flags |= TEXT_DRAW_FLAG_TTF; + memcpy(info.palette, text_palette, sizeof(info.palette)); ttf_process_initial_colour(colour, &info); ttf_process_string(dpi, text, &info); + memcpy(text_palette, info.palette, sizeof(info.palette)); gLastDrawStringX = info.x; gLastDrawStringY = info.y; @@ -1635,11 +1320,13 @@ static int ttf_get_string_width(const utf8 *text) text_draw_info info; info.font_sprite_base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); info.flags = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); + info.startX = 0; + info.startY = 0; info.x = 0; info.y = 0; - info.flags |= TEXT_DRAW_FLAG_TTF; info.flags |= TEXT_DRAW_FLAG_NO_DRAW; + if (gUseTrueTypeFont) info.flags |= TEXT_DRAW_FLAG_TTF; ttf_process_string(NULL, text, &info); diff --git a/src/interface/widget.c b/src/interface/widget.c index 9069c4b0af..226d179961 100644 --- a/src/interface/widget.c +++ b/src/interface/widget.c @@ -848,10 +848,10 @@ static void widget_scroll_draw(rct_drawpixelinfo *dpi, rct_window *w, int widget window_event_scroll_paint_call(w, &scroll_dpi, scrollIndex); } -static utf8 BlackUpArrowString[] = { 0xC2, 0x8E, 0xC2, 0xA0, 0x00 }; -static utf8 BlackDownArrowString[] = { 0xC2, 0x8E, 0xC2, 0xAA, 0x00 }; -static utf8 BlackLeftArrowString[] = { 0xC2, 0x8E, 0xC2, 0xBE, 0x00 }; -static utf8 BlackRightArrowString[] = { 0xC2, 0x8E, 0xC2, 0xAF, 0x00 }; +static utf8 BlackUpArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xB2, 0x00 }; +static utf8 BlackDownArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xBC, 0x00 }; +static utf8 BlackLeftArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0x80, 0x00 }; +static utf8 BlackRightArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xB6, 0x00 }; static void widget_hscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, int l, int t, int r, int b, int colour) { diff --git a/src/localisation/currency.c b/src/localisation/currency.c index ee97d31904..d451a8bc27 100644 --- a/src/localisation/currency.c +++ b/src/localisation/currency.c @@ -21,14 +21,14 @@ #include "currency.h" const rct_currency_spec g_currency_specs[CURRENCY_END] = { - { 10 , "\xA3" , CURRENCY_PREFIX }, // British Pound - { 10 , "\x24" , CURRENCY_PREFIX }, // US Dollar - { 10 , "F" , CURRENCY_SUFFIX }, // French Franc - { 10 , "DM" , CURRENCY_PREFIX }, // Deutsche Mark - { 1000 , "\xA5" , CURRENCY_PREFIX }, // Japanese Yen - { 10 , "Pts" , CURRENCY_SUFFIX }, // Spanish Peseta - { 1000 , "L" , CURRENCY_PREFIX }, // Italian Lira - { 10 , "fl. " , CURRENCY_PREFIX }, // Dutch Guilder - { 10 , "kr." , CURRENCY_SUFFIX }, // Swedish Krona - { 10 , "\xb5" , CURRENCY_PREFIX }, // Euro + { 10 , "\xC2\xA3" , CURRENCY_PREFIX }, // British Pound + { 10 , "$" , CURRENCY_PREFIX }, // US Dollar + { 10 , "F" , CURRENCY_SUFFIX }, // French Franc + { 10 , "DM" , CURRENCY_PREFIX }, // Deutsche Mark + { 1000 , "\xC2\xA5" , CURRENCY_PREFIX }, // Japanese Yen + { 10 , "Pts" , CURRENCY_SUFFIX }, // Spanish Peseta + { 1000 , "L" , CURRENCY_PREFIX }, // Italian Lira + { 10 , "fl. " , CURRENCY_PREFIX }, // Dutch Guilder + { 10 , "kr." , CURRENCY_SUFFIX }, // Swedish Krona + { 10 , "\xE2\x82\xAC" , CURRENCY_PREFIX }, // Euro }; diff --git a/src/localisation/currency.h b/src/localisation/currency.h index 69b40556aa..c7cbd71300 100644 --- a/src/localisation/currency.h +++ b/src/localisation/currency.h @@ -21,6 +21,8 @@ #ifndef CURRENCY_H #define CURRENCY_H +#include "../common.h" + // List of currencies typedef enum { CURRENCY_POUNDS, // British Pound @@ -46,7 +48,7 @@ typedef enum { typedef struct { // Rate is relative to 0.1 GBP int rate; - char symbol[8]; + utf8 symbol[8]; int affix; } rct_currency_spec; diff --git a/src/localisation/format_codes.h b/src/localisation/format_codes.h index c0931c0b4b..ff82440447 100644 --- a/src/localisation/format_codes.h +++ b/src/localisation/format_codes.h @@ -21,8 +21,8 @@ #ifndef _FORMAT_CODES_H_ #define _FORMAT_CODES_H_ -char format_get_code(const char *token); -const char *format_get_token(char code); +uint32 format_get_code(const char *token); +const char *format_get_token(uint32 code); enum { // Font format codes @@ -56,9 +56,6 @@ enum { // The next 4 bytes specify the sprite FORMAT_INLINE_SPRITE = 23, - // Non ascii-characters - FORMAT_ENDQUOTES = 34, - // Argument format codes FORMAT_ARGUMENT_CODE_START = 123, FORMAT_COMMA32 = 123, @@ -101,27 +98,34 @@ enum { // Extra non-ascii characters FORMAT_AMINUSCULE = 159, - FORMAT_UP, FORMAT_POUND = 163, FORMAT_YEN = 165, FORMAT_COPYRIGHT = 169, - FORMAT_DOWN, - FORMAT_LEFTGUILLEMET, - FORMAT_TICK, - FORMAT_CROSS, - FORMAT_RIGHT = 175, - FORMAT_DEGREE, + FORMAT_LEFTGUILLEMET = 171, + FORMAT_DEGREE = 176, FORMAT_SQUARED = 178, - FORMAT_OPENQUOTES = 180, - FORMAT_EURO = 181, - FORMAT_APPROX = 184, - FORMAT_POWERNEGATIVEONE, - FORMAT_BULLET, - FORMAT_RIGHTGUILLEMET, - FORMAT_SMALLUP, - FORMAT_SMALLDOWN, - FORMAT_LEFT, - FORMAT_INVERTEDQUESTION + FORMAT_RIGHTGUILLEMET = 187, + FORMAT_INVERTEDQUESTION = 191, + + FORMAT_OPENQUOTES = 8220, + FORMAT_ENDQUOTES = 8221, + + FORMAT_BULLET = 8226, + FORMAT_POWERNEGATIVEONE = 8315, + FORMAT_EURO = 8364, + + FORMAT_APPROX = 8776, + + FORMAT_UP = 9650, + FORMAT_RIGHT = 9654, + FORMAT_DOWN = 9660, + FORMAT_LEFT = 9664, + + FORMAT_SMALLUP = 9652, + FORMAT_SMALLDOWN = 9662, + + FORMAT_TICK = 10003, + FORMAT_CROSS = 10005, }; #endif \ No newline at end of file diff --git a/src/localisation/language.c b/src/localisation/language.c index f620661168..4f891fd02e 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -33,39 +33,25 @@ typedef struct { char *string_data; } language_data; -const char *language_names[LANGUAGE_COUNT] = { - "", // LANGUAGE_UNDEFINED - "English (UK)", // LANGUAGE_ENGLISH_UK - "English (US)", // LANGUAGE_ENGLISH_US - "Deutsch", // LANGUAGE_GERMAN - "Nederlands", // LANGUAGE_DUTCH - "Fran\u00E7ais", // LANGUAGE_FRENCH - "Magyar", // LANGUAGE_HUNGARIAN - "Polski", // LANGUAGE_POLISH - "Espa\u00F1ol", // LANGUAGE_SPANISH - "Svenska", // LANGUAGE_SWEDISH - "Italiano", // LANGUAGE_ITALIAN - "Portug\u00CAs (BR)", // LANGUAGE_PORTUGUESE_BR - "Chinese Traditional" // LANGUAGE_CHINESE_TRADITIONAL -}; - -const char *language_filenames[LANGUAGE_COUNT] = { - "", // LANGUAGE_UNDEFINED - "english_uk", // LANGUAGE_ENGLISH_UK - "english_us", // LANGUAGE_ENGLISH_US - "german", // LANGUAGE_GERMAN - "dutch", // LANGUAGE_DUTCH - "french", // LANGUAGE_FRENCH - "hungarian", // LANGUAGE_HUNGARIAN - "polish", // LANGUAGE_POLISH - "spanish_sp", // LANGUAGE_SPANISH - "swedish", // LANGUAGE_SWEDISH - "italian", // LANGUAGE_ITALIAN - "portuguese_br", // LANGUAGE_PORTUGUESE_BR - "chinese_traditional" // LANGUAGE_CHINESE_TRADITIONAL +const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { + { "", "", "", "", FONT_OPENRCT2_SPRITE }, // LANGUAGE_UNDEFINED + { "en-GB", "English (UK)", "English (UK)", "english_uk", FONT_OPENRCT2_SPRITE }, // LANGUAGE_ENGLISH_UK + { "en-US", "English (US)", "English (US)", "english_us", FONT_OPENRCT2_SPRITE }, // LANGUAGE_ENGLISH_US + { "de-DE", "German", "Deutsch", "german", FONT_OPENRCT2_SPRITE }, // LANGUAGE_GERMAN + { "nl-NL", "Dutch", "Nederlands", "dutch", FONT_OPENRCT2_SPRITE }, // LANGUAGE_DUTCH + { "fr-FR", "French", "Fran\xC3\xA7" "ais", "french", FONT_OPENRCT2_SPRITE }, // LANGUAGE_FRENCH + { "hu-HU", "Hungarian", "Magyar", "hungarian", FONT_OPENRCT2_SPRITE }, // LANGUAGE_HUNGARIAN + { "pl-PL", "Polish", "Polski", "polish", FONT_OPENRCT2_SPRITE }, // LANGUAGE_POLISH + { "es-ES", "Spanish", "Espa\xC3\xB1ol", "spanish_sp", FONT_OPENRCT2_SPRITE }, // LANGUAGE_SPANISH + { "sv-SE", "Swedish", "Svenska", "swedish", FONT_OPENRCT2_SPRITE }, // LANGUAGE_SWEDISH + { "it-IT", "Italian", "Italiano", "italian", FONT_OPENRCT2_SPRITE }, // LANGUAGE_ITALIAN + { "pt-BR", "Portuguese (BR)", "Portug\xC3\xAAs (BR)", "portuguese_br", FONT_OPENRCT2_SPRITE }, // LANGUAGE_PORTUGUESE_BR + { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", "msjh.ttc" }, // LANGUAGE_CHINESE_TRADITIONAL }; int gCurrentLanguage = LANGUAGE_UNDEFINED; +bool gUseTrueTypeFont = false; +const utf8 *gTrueTypeFontPath; language_data _languageFallback = { 0 }; language_data _languageCurrent = { 0 }; @@ -154,19 +140,27 @@ int language_open(int id) return 1; if (id != LANGUAGE_ENGLISH_UK) { - sprintf(filename, languagePath, gExePath, language_filenames[LANGUAGE_ENGLISH_UK]); + sprintf(filename, languagePath, gExePath, LanguagesDescriptors[LANGUAGE_ENGLISH_UK].path); if (language_open_file(filename, &_languageFallback)) { _languageFallback.id = LANGUAGE_ENGLISH_UK; } } - sprintf(filename, languagePath, gExePath, language_filenames[id]); + sprintf(filename, languagePath, gExePath, LanguagesDescriptors[id].path); if (language_open_file(filename, &_languageCurrent)) { _languageCurrent.id = id; gCurrentLanguage = id; - if (!ttf_initialise()) { - log_warning("Unable to initialise TrueType fonts."); + if (LanguagesDescriptors[id].font == FONT_OPENRCT2_SPRITE) { + gUseTrueTypeFont = false; + gTrueTypeFontPath = NULL; + ttf_dispose(); + } else { + gUseTrueTypeFont = true; + gTrueTypeFontPath = LanguagesDescriptors[id].font; + if (!ttf_initialise()) { + log_warning("Unable to initialise TrueType fonts."); + } } return 1; @@ -274,10 +268,13 @@ static int language_open_file(const char *filename, language_data *language) int tokenLength = min(src - token, sizeof(tokenBuffer) - 1); memcpy(tokenBuffer, token, tokenLength); tokenBuffer[tokenLength] = 0; - uint8 code = (uint8)format_get_code(tokenBuffer); - if (code == 0) + uint32 code = format_get_code(tokenBuffer); + if (code == 0) { code = atoi(tokenBuffer); - dst = utf8_write_codepoint(dst, code); + *dst++ = code & 0xFF; + } else { + dst = utf8_write_codepoint(dst, code); + } mode = 1; } break; diff --git a/src/localisation/language.h b/src/localisation/language.h index 2999ec9d6b..cc6ed220b8 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -40,8 +40,21 @@ enum { LANGUAGE_COUNT }; -extern const char *language_names[LANGUAGE_COUNT]; +#define FONT_OPENRCT2_SPRITE NULL + +typedef struct { + const char *locale; + const utf8 *english_name; + const utf8 *native_name; + const utf8 *path; + const utf8 *font; +} language_descriptor; + +extern const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT]; + extern int gCurrentLanguage; +extern bool gUseTrueTypeFont; +extern const utf8 *gTrueTypeFontPath; const char *language_get_string(rct_string_id id); int language_open(int id); diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 4eb6e6e0a0..ae6d71882c 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -29,8 +29,8 @@ #pragma region Format codes typedef struct { - char code; - char *token; + uint32 code; + const char *token; } format_code_token; format_code_token format_code_tokens[] = { @@ -107,7 +107,7 @@ format_code_token format_code_tokens[] = { { FORMAT_INVERTEDQUESTION, "INVERTEDQUESTION" } }; -char format_get_code(const char *token) +uint32 format_get_code(const char *token) { int i; for (i = 0; i < countof(format_code_tokens); i++) @@ -116,7 +116,7 @@ char format_get_code(const char *token) return 0; } -const char *format_get_token(char code) +const char *format_get_token(uint32 code) { int i; for (i = 0; i < countof(format_code_tokens); i++) @@ -125,6 +125,66 @@ const char *format_get_token(char code) return 0; } +bool utf8_is_format_code(int codepoint) +{ + if (codepoint < 32) return true; + if (codepoint >= 123 && codepoint <= 155) return true; + return false; +} + +bool utf8_should_use_sprite_for_codepoint(int codepoint) +{ + switch (codepoint) { + case FORMAT_UP: + case FORMAT_DOWN: + case FORMAT_LEFTGUILLEMET: + case FORMAT_TICK: + case FORMAT_CROSS: + case FORMAT_RIGHT: + case FORMAT_RIGHTGUILLEMET: + case FORMAT_SMALLUP: + case FORMAT_SMALLDOWN: + case FORMAT_LEFT: + case FORMAT_OPENQUOTES: + case FORMAT_ENDQUOTES: + return true; + default: + return false; + } +} + +int utf8_get_sprite_offset_for_codepoint(int codepoint) +{ + switch (codepoint) { + case FORMAT_AMINUSCULE: return 159 - 32; + case FORMAT_POUND: return 163 - 32; + case FORMAT_YEN: return 165 - 32; + case FORMAT_COPYRIGHT: return 169 - 32; + case FORMAT_LEFTGUILLEMET: return 171 - 32; + case FORMAT_DEGREE: return 176 - 32; + case FORMAT_SQUARED: return 178 - 32; + case FORMAT_RIGHTGUILLEMET: return 187 - 32; + case FORMAT_INVERTEDQUESTION: return 191 - 32; + case FORMAT_OPENQUOTES: return 180 - 32; + case FORMAT_ENDQUOTES: return 34 - 32; + case FORMAT_BULLET: return 186 - 32; + case FORMAT_POWERNEGATIVEONE: return 185 - 32; + case FORMAT_EURO: return 181 - 32; + case FORMAT_APPROX: return 184 - 32; + case FORMAT_UP: return 160 - 32; + case FORMAT_RIGHT: return 175 - 32; + case FORMAT_DOWN: return 170 - 32; + case FORMAT_LEFT: return 190 - 32; + case FORMAT_SMALLUP: return 188 - 32; + case FORMAT_SMALLDOWN: return 189 - 32; + case FORMAT_TICK: return 172 - 32; + case FORMAT_CROSS: return 173 - 32; + default: + if (codepoint > 224) codepoint = ' '; + return codepoint - 32; + } +} + #pragma endregion void format_string_part_from_raw(char **dest, const char *src, char **args); @@ -312,7 +372,7 @@ void format_currency(char **dest, long long value) } // Currency symbol - const char *symbol = currencySpec->symbol; + const utf8 *symbol = currencySpec->symbol; // Prefix if (currencySpec->affix == CURRENCY_PREFIX) { @@ -343,7 +403,7 @@ void format_currency_2dp(char **dest, long long value) } // Currency symbol - const char *symbol = currencySpec->symbol; + const utf8 *symbol = currencySpec->symbol; // Prefix if (currencySpec->affix == CURRENCY_PREFIX) { @@ -743,53 +803,34 @@ void generate_string_file() * * buffer (esi) */ -int get_string_length(char* buffer) +int get_string_length(const utf8* text) { - // Length of string - int length = 0; + int codepoint; + const utf8 *ch = text; - for (uint8* curr_char = (uint8*)buffer; *curr_char != (uint8)0; curr_char++) { - length++; - if (*curr_char >= 0x20) { - continue; - } - switch (*curr_char) { - case FORMAT_MOVE_X: - case FORMAT_ADJUST_PALETTE: - case 3: - case 4: - curr_char++; - length++; - break; - case FORMAT_NEWLINE: - case FORMAT_NEWLINE_SMALLER: - case FORMAT_TINYFONT: - case FORMAT_BIGFONT: - case FORMAT_MEDIUMFONT: - case FORMAT_SMALLFONT: - case FORMAT_OUTLINE: - case FORMAT_OUTLINE_OFF: - case FORMAT_WINDOW_COLOUR_1: - case FORMAT_WINDOW_COLOUR_2: - case FORMAT_WINDOW_COLOUR_3: - case 0x10: - continue; - case FORMAT_INLINE_SPRITE: - length += 4; - curr_char += 4; - break; - default: - if (*curr_char <= 0x16) { //case 0x11? FORMAT_NEW_LINE_X_Y - length += 2; - curr_char += 2; - continue; + while ((codepoint = utf8_get_next(ch, &ch)) != 0) { + if (utf8_is_format_code(codepoint)) { + switch (codepoint) { + case FORMAT_MOVE_X: + case FORMAT_ADJUST_PALETTE: + case 3: + case 4: + ch++; + break; + case FORMAT_INLINE_SPRITE: + ch += 4; + break; + default: + if (codepoint <= 22) { + ch += 2; + } else { + ch += 4; + } + break; } - length += 4; - curr_char += 4;//never happens? - break; } } - return length; + return ch - text - 1; } int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength) diff --git a/src/localisation/localisation.h b/src/localisation/localisation.h index 9d7a8e7f42..238931da6e 100644 --- a/src/localisation/localisation.h +++ b/src/localisation/localisation.h @@ -26,12 +26,16 @@ #include "language.h" #include "string_ids.h" +bool utf8_is_format_code(int codepoint); +bool utf8_should_use_sprite_for_codepoint(int codepoint); +int utf8_get_sprite_offset_for_codepoint(int codepoint); + void format_string(char *dest, rct_string_id format, void *args); void format_string_raw(char *dest, char *src, void *args); void format_string_to_upper(char *dest, rct_string_id format, void *args); void generate_string_file(); void error_string_quit(int error, rct_string_id format); -int get_string_length(char* buffer); +int get_string_length(const utf8* buffer); void user_string_clear_all(); rct_string_id user_string_allocate(int base, const char *text); diff --git a/src/windows/options.c b/src/windows/options.c index 52718cf0d1..31c6ce51a4 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -759,7 +759,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* case WIDX_LANGUAGE_DROPDOWN: for (i = 1; i < LANGUAGE_COUNT; i++) { gDropdownItemsFormat[i - 1] = 2777; - gDropdownItemsArgs[i - 1] = (sint32)language_names[i]; + gDropdownItemsArgs[i - 1] = (sint32)LanguagesDescriptors[i].native_name; } window_options_show_dropdown(w, widget, LANGUAGE_COUNT - 1); gDropdownItemsChecked = 1 << (gCurrentLanguage - 1); @@ -1289,7 +1289,7 @@ static void window_options_paint(rct_window *w, rct_drawpixelinfo *dpi) RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; gfx_draw_string( dpi, - (char*)language_names[gCurrentLanguage], + (char*)LanguagesDescriptors[gCurrentLanguage].native_name, w->colours[1], w->x + window_options_culture_widgets[WIDX_LANGUAGE].left + 1, w->y + window_options_culture_widgets[WIDX_LANGUAGE].top From 1682eae048a34402ff7102e53e765d5adb541f7e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 26 Jul 2015 18:47:26 +0100 Subject: [PATCH 0406/1173] implement utf8, part 4 --- src/drawing/string.c | 3 +++ src/interface/widget.c | 20 +++++++++++--------- src/management/news_item.c | 3 +-- src/management/news_item.h | 3 +-- src/windows/game_bottom_toolbar.c | 4 ++-- src/windows/news.c | 11 ++++++----- 6 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/drawing/string.c b/src/drawing/string.c index 93341e69a8..5b412382e8 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -1311,6 +1311,9 @@ static void ttf_draw_string(rct_drawpixelinfo *dpi, char *text, int colour, int ttf_process_string(dpi, text, &info); memcpy(text_palette, info.palette, sizeof(info.palette)); + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = info.font_sprite_base; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16) = info.flags; + gLastDrawStringX = info.x; gLastDrawStringY = info.y; } diff --git a/src/interface/widget.c b/src/interface/widget.c index 226d179961..e94b6d232e 100644 --- a/src/interface/widget.c +++ b/src/interface/widget.c @@ -725,6 +725,8 @@ static void widget_closebox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg gfx_draw_string_centred_clipped(dpi, widget->image, (void*)0x013CE952, colour, l, t, widget->right - widget->left - 2); } +static const utf8 CheckBoxMarkString[] = { 0xE2, 0x9C, 0x93, 0x00 }; + /** * * rct2: 0x006EBAD9 @@ -754,7 +756,7 @@ static void widget_checkbox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg // fill it when checkbox is pressed if (widget_is_pressed(w, widgetIndex)) { RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; - gfx_draw_string(dpi, (char*)0x009DED72, colour & 0x7F, l, yMid - 5); + gfx_draw_string(dpi, (char*)CheckBoxMarkString, colour & 0x7F, l, yMid - 5); } } @@ -848,10 +850,10 @@ static void widget_scroll_draw(rct_drawpixelinfo *dpi, rct_window *w, int widget window_event_scroll_paint_call(w, &scroll_dpi, scrollIndex); } -static utf8 BlackUpArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xB2, 0x00 }; -static utf8 BlackDownArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xBC, 0x00 }; -static utf8 BlackLeftArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0x80, 0x00 }; -static utf8 BlackRightArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xB6, 0x00 }; +static const utf8 BlackUpArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xB2, 0x00 }; +static const utf8 BlackDownArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xBC, 0x00 }; +static const utf8 BlackLeftArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0x80, 0x00 }; +static const utf8 BlackRightArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xB6, 0x00 }; static void widget_hscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, int l, int t, int r, int b, int colour) { @@ -866,7 +868,7 @@ static void widget_hscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i // Left button gfx_fill_rect_inset(dpi, l, t, l + 9, b, colour, (scroll->flags & HSCROLLBAR_LEFT_PRESSED ? 0x20 : 0)); - gfx_draw_string(dpi, BlackLeftArrowString, 0, l + 1, t); + gfx_draw_string(dpi, (char*)BlackLeftArrowString, 0, l + 1, t); // Thumb gfx_fill_rect_inset(dpi, @@ -876,7 +878,7 @@ static void widget_hscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i // Right button gfx_fill_rect_inset(dpi, r - 9, t, r, b, colour, (scroll->flags & HSCROLLBAR_RIGHT_PRESSED ? 0x20 : 0)); - gfx_draw_string(dpi, BlackRightArrowString, 0, r - 6, t); + gfx_draw_string(dpi, (char*)BlackRightArrowString, 0, r - 6, t); } static void widget_vscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, int l, int t, int r, int b, int colour) @@ -892,7 +894,7 @@ static void widget_vscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i // Up button gfx_fill_rect_inset(dpi, l, t, r, t + 9, colour, (scroll->flags & VSCROLLBAR_UP_PRESSED ? 0x20 : 0)); - gfx_draw_string(dpi, BlackUpArrowString, 0, l + 1, t - 1); + gfx_draw_string(dpi, (char*)BlackUpArrowString, 0, l + 1, t - 1); // Thumb gfx_fill_rect_inset(dpi, @@ -902,7 +904,7 @@ static void widget_vscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i // Down button gfx_fill_rect_inset(dpi, l, b - 9, r, b, colour, (scroll->flags & VSCROLLBAR_DOWN_PRESSED ? 0x20 : 0)); - gfx_draw_string(dpi, BlackDownArrowString, 0, l + 1, b - 9); + gfx_draw_string(dpi, (char*)BlackDownArrowString, 0, l + 1, b - 9); } /** diff --git a/src/management/news_item.c b/src/management/news_item.c index bf3fc32a18..74d0eeb8ae 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -328,8 +328,7 @@ void news_item_add_to_queue_raw(uint8 type, const char *text, uint32 assoc) newsItem->ticks = 0; newsItem->month_year = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); newsItem->day = ((days_in_month[(newsItem->month_year & 7)] * RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16)) >> 16) + 1; - newsItem->colour = text[0]; - strncpy(newsItem->text, text + 1, 254); + strncpy(newsItem->text, text, 255); newsItem->text[254] = 0; // blatant disregard for what happens on the last element. diff --git a/src/management/news_item.h b/src/management/news_item.h index c998f6ce31..d4512aea9b 100644 --- a/src/management/news_item.h +++ b/src/management/news_item.h @@ -48,8 +48,7 @@ typedef struct { uint16 month_year; // 0x08 uint8 day; // 0x0A uint8 pad_0B; // 0x0B - uint8 colour; // 0x0C - char text[255]; // 0x0D + utf8 text[256]; // 0x0C } rct_news_item; void news_item_init_queue(); diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index 60052aff9a..912af9919e 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -524,8 +524,8 @@ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rc // Text stringId = 1926; - // memcpy((char*)language_get_string(1926) + 1, &newsItem->colour, 256); - memcpy((void*)0x009B5F2C, &newsItem->colour, 256); + utf8 *buffer = (utf8*)0x009B5F2C; + memcpy(buffer, &newsItem->text, 256); x = w->x + (middleOutsetWidget->left + middleOutsetWidget->right) / 2; y = w->y + middleOutsetWidget->top + 11; width = middleOutsetWidget->right - middleOutsetWidget->left - 62; diff --git a/src/windows/news.c b/src/windows/news.c index 3c54c736c4..623aa7a073 100644 --- a/src/windows/news.c +++ b/src/windows/news.c @@ -295,11 +295,12 @@ static void window_news_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int s gfx_draw_string_left(dpi, 2235, (void*)0x013CE952, 2, 4, y); // Item text - char sz[400];// = (char*)0x09B5F2C; - char* args[1]; - args[0] = (char*)&sz; - sprintf(sz, "%c%c%s", newsItem->colour, FORMAT_SMALLFONT, newsItem->text); - gfx_draw_string_left_wrapped(dpi, args, 2, y + 10, 325, 1170, 14); + utf8 buffer[400]; + utf8 *ch = buffer; + ch = utf8_write_codepoint(ch, FORMAT_SMALLFONT); + memcpy(ch, newsItem->text, 256); + ch = buffer; + gfx_draw_string_left_wrapped(dpi, &ch, 2, y + 10, 325, 1170, 14); // Subject button if ((RCT2_ADDRESS(0x0097BE7C, uint8)[newsItem->type] & 2) && !(newsItem->flags & 1)) { From 795c01cab55ae2cf70fe7c17d9dc531192fe5528 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 27 Jul 2015 01:09:24 +0100 Subject: [PATCH 0407/1173] implement utf8, part 5 --- src/config.c | 1 + src/drawing/string.c | 40 +++-- src/interface/widget.c | 7 - src/localisation/language.c | 220 ++++++++++++++++++++----- src/localisation/language.h | 7 + src/localisation/localisation.c | 8 + src/localisation/localisation.h | 1 + src/windows/editor_object_selection.c | 5 +- src/windows/editor_objective_options.c | 2 +- src/windows/themes.c | 2 +- 10 files changed, 222 insertions(+), 71 deletions(-) diff --git a/src/config.c b/src/config.c index eed5bd3de9..a2de18bdfb 100644 --- a/src/config.c +++ b/src/config.c @@ -138,6 +138,7 @@ config_enum_definition _languageEnum[] = { { "sv-SE", LANGUAGE_SWEDISH }, { "it-IT", LANGUAGE_ITALIAN }, { "pt-BR", LANGUAGE_PORTUGUESE_BR }, + { "zh-Hant", LANGUAGE_CHINESE_TRADITIONAL }, END_OF_ENUM }; diff --git a/src/drawing/string.c b/src/drawing/string.c index 5b412382e8..5e2dc7e470 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -933,7 +933,7 @@ bool ttf_initialise() } } - _ttfFontOffsetX = 0; + _ttfFontOffsetX = 1; _ttfFontOffsetY = -3; _ttfInitialised = true; } @@ -972,22 +972,27 @@ typedef struct { uint16 font_sprite_base; } text_draw_info; +static void ttf_draw_character_sprite(rct_drawpixelinfo *dpi, int codepoint, text_draw_info *info) +{ + uint32 charOffset = info->font_sprite_base + utf8_get_sprite_offset_for_codepoint(codepoint); + int charWidth = _spriteFontCharacterWidths[charOffset] & 0xFF; + + if (!(info->flags & TEXT_DRAW_FLAG_NO_DRAW)) { + RCT2_GLOBAL(0x009ABDA4, uint8*) = (uint8*)&info->palette; + RCT2_GLOBAL(0x00EDF81C, uint32) = (IMAGE_TYPE_USE_PALETTE << 28); + gfx_draw_sprite_palette_set(dpi, SPR_CHAR_START + ((IMAGE_TYPE_USE_PALETTE << 28) | charOffset), info->x, info->y, info->palette, NULL); + } + + info->x += charWidth; +} + static void ttf_draw_string_raw_sprite(rct_drawpixelinfo *dpi, const utf8 *text, text_draw_info *info) { const utf8 *ch = text; int codepoint; while (!utf8_is_format_code(codepoint = utf8_get_next(ch, &ch))) { - uint32 charOffset = info->font_sprite_base + utf8_get_sprite_offset_for_codepoint(codepoint); - int charWidth = _spriteFontCharacterWidths[charOffset] & 0xFF; - - if (!(info->flags & TEXT_DRAW_FLAG_NO_DRAW)) { - RCT2_GLOBAL(0x009ABDA4, uint8*) = (uint8*)&info->palette; - RCT2_GLOBAL(0x00EDF81C, uint32) = (IMAGE_TYPE_USE_PALETTE << 28); - gfx_draw_sprite_palette_set(dpi, SPR_CHAR_START + ((IMAGE_TYPE_USE_PALETTE << 28) | charOffset), info->x, info->y, info->palette, NULL); - } - - info->x += charWidth; + ttf_draw_character_sprite(dpi, codepoint, info); }; } @@ -1206,7 +1211,11 @@ static const utf8 *ttf_process_glyph_run(rct_drawpixelinfo *dpi, const utf8 *tex const utf8 *lastCh; int codepoint; + bool isTTF = info->flags & TEXT_DRAW_FLAG_TTF; while (!utf8_is_format_code(codepoint = utf8_get_next(ch, &lastCh))) { + if (isTTF && utf8_should_use_sprite_for_codepoint(codepoint)) { + break; + } ch = lastCh; } if (codepoint == 0) { @@ -1233,9 +1242,8 @@ static void ttf_process_string(rct_drawpixelinfo *dpi, const utf8 *text, text_dr if (utf8_is_format_code(codepoint)) { ch = ttf_process_format_code(dpi, ch, info); } else if (isTTF && utf8_should_use_sprite_for_codepoint(codepoint)) { - info->flags &= ~TEXT_DRAW_FLAG_TTF; - ch = ttf_process_glyph_run(dpi, ch, info); - info->flags |= TEXT_DRAW_FLAG_TTF; + ttf_draw_character_sprite(dpi, codepoint, info); + ch = nextCh; } else { ch = ttf_process_glyph_run(dpi, ch, info); } @@ -1246,9 +1254,9 @@ static void ttf_process_initial_colour(int colour, text_draw_info *info) { if (colour != 254 && colour != 255) { info->flags &= ~(1 | 2 | 4 | 8); - if (info->font_sprite_base < 0) { + if ((sint16)info->font_sprite_base < 0) { info->flags |= 4; - if (info->font_sprite_base != -1) { + if ((sint16)info->font_sprite_base != -1) { info->flags |= 8; } info->font_sprite_base = 224; diff --git a/src/interface/widget.c b/src/interface/widget.c index e94b6d232e..3a060a548a 100644 --- a/src/interface/widget.c +++ b/src/interface/widget.c @@ -725,8 +725,6 @@ static void widget_closebox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg gfx_draw_string_centred_clipped(dpi, widget->image, (void*)0x013CE952, colour, l, t, widget->right - widget->left - 2); } -static const utf8 CheckBoxMarkString[] = { 0xE2, 0x9C, 0x93, 0x00 }; - /** * * rct2: 0x006EBAD9 @@ -850,11 +848,6 @@ static void widget_scroll_draw(rct_drawpixelinfo *dpi, rct_window *w, int widget window_event_scroll_paint_call(w, &scroll_dpi, scrollIndex); } -static const utf8 BlackUpArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xB2, 0x00 }; -static const utf8 BlackDownArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xBC, 0x00 }; -static const utf8 BlackLeftArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0x80, 0x00 }; -static const utf8 BlackRightArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xB6, 0x00 }; - static void widget_hscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, int l, int t, int r, int b, int colour) { colour &= 0x7F; diff --git a/src/localisation/language.c b/src/localisation/language.c index 4f891fd02e..56eff314bf 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -33,20 +33,38 @@ typedef struct { char *string_data; } language_data; +enum { + RCT2_LANGUAGE_ID_ENGLISH_UK, + RCT2_LANGUAGE_ID_ENGLISH_US, + RCT2_LANGUAGE_ID_FRENCH, + RCT2_LANGUAGE_ID_GERMAN, + RCT2_LANGUAGE_ID_SPANISH, + RCT2_LANGUAGE_ID_ITALIAN, + RCT2_LANGUAGE_ID_DUTCH, + RCT2_LANGUAGE_ID_SWEDISH, + RCT2_LANGUAGE_ID_8, + RCT2_LANGUAGE_ID_KOREAN, + RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL, + RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED, + RCT2_LANGUAGE_ID_12, + RCT2_LANGUAGE_ID_PORTUGESE, + RCT2_LANGUAGE_ID_END = 255 +}; + const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { - { "", "", "", "", FONT_OPENRCT2_SPRITE }, // LANGUAGE_UNDEFINED - { "en-GB", "English (UK)", "English (UK)", "english_uk", FONT_OPENRCT2_SPRITE }, // LANGUAGE_ENGLISH_UK - { "en-US", "English (US)", "English (US)", "english_us", FONT_OPENRCT2_SPRITE }, // LANGUAGE_ENGLISH_US - { "de-DE", "German", "Deutsch", "german", FONT_OPENRCT2_SPRITE }, // LANGUAGE_GERMAN - { "nl-NL", "Dutch", "Nederlands", "dutch", FONT_OPENRCT2_SPRITE }, // LANGUAGE_DUTCH - { "fr-FR", "French", "Fran\xC3\xA7" "ais", "french", FONT_OPENRCT2_SPRITE }, // LANGUAGE_FRENCH - { "hu-HU", "Hungarian", "Magyar", "hungarian", FONT_OPENRCT2_SPRITE }, // LANGUAGE_HUNGARIAN - { "pl-PL", "Polish", "Polski", "polish", FONT_OPENRCT2_SPRITE }, // LANGUAGE_POLISH - { "es-ES", "Spanish", "Espa\xC3\xB1ol", "spanish_sp", FONT_OPENRCT2_SPRITE }, // LANGUAGE_SPANISH - { "sv-SE", "Swedish", "Svenska", "swedish", FONT_OPENRCT2_SPRITE }, // LANGUAGE_SWEDISH - { "it-IT", "Italian", "Italiano", "italian", FONT_OPENRCT2_SPRITE }, // LANGUAGE_ITALIAN - { "pt-BR", "Portuguese (BR)", "Portug\xC3\xAAs (BR)", "portuguese_br", FONT_OPENRCT2_SPRITE }, // LANGUAGE_PORTUGUESE_BR - { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", "msjh.ttc" }, // LANGUAGE_CHINESE_TRADITIONAL + { "", "", "", "", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_UNDEFINED + { "en-GB", "English (UK)", "English (UK)", "english_uk", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_ENGLISH_UK + { "en-US", "English (US)", "English (US)", "english_us", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_US }, // LANGUAGE_ENGLISH_US + { "de-DE", "German", "Deutsch", "german", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_GERMAN }, // LANGUAGE_GERMAN + { "nl-NL", "Dutch", "Nederlands", "dutch", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_DUTCH }, // LANGUAGE_DUTCH + { "fr-FR", "French", "Fran\xC3\xA7" "ais", "french", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_FRENCH }, // LANGUAGE_FRENCH + { "hu-HU", "Hungarian", "Magyar", "hungarian", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_HUNGARIAN + { "pl-PL", "Polish", "Polski", "polish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_POLISH + { "es-ES", "Spanish", "Espa\xC3\xB1ol", "spanish_sp", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_SPANISH }, // LANGUAGE_SPANISH + { "sv-SE", "Swedish", "Svenska", "swedish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_SWEDISH }, // LANGUAGE_SWEDISH + { "it-IT", "Italian", "Italiano", "italian", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ITALIAN }, // LANGUAGE_ITALIAN + { "pt-BR", "Portuguese (BR)", "Portug\xC3\xAAs (BR)", "portuguese_br", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_PORTUGESE }, // LANGUAGE_PORTUGUESE_BR + { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", "msjh.ttc", RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL }; int gCurrentLanguage = LANGUAGE_UNDEFINED; @@ -58,6 +76,12 @@ language_data _languageCurrent = { 0 }; const char **_languageOriginal = (char**)0x009BF2D4; +const utf8 BlackUpArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xB2, 0x00 }; +const utf8 BlackDownArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xBC, 0x00 }; +const utf8 BlackLeftArrowString[] = { 0xC2, 0x8E, 0xE2, 0x97, 0x80, 0x00 }; +const utf8 BlackRightArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xB6, 0x00 }; +const utf8 CheckBoxMarkString[] = { 0xE2, 0x9C, 0x93, 0x00 }; + static int language_open_file(const char *filename, language_data *language); static void language_close(language_data *language); @@ -299,56 +323,141 @@ static void language_close(language_data *language) } const int OpenRCT2LangIdToObjectLangId[] = { - 0, 0, 1, 3, 6, 2, 0, 0, 4, 7, 5, 13 + 0, + 0, + 1, + 3, + 6, + 2, + 0, + 0, + 4, + 7, + 5, + 13 }; +#define STEX_BASE_STRING_ID 3447 +#define NONSTEX_BASE_STRING_ID 3463 +#define MAX_OBJECT_CACHED_STRINGS 2048 + /* rct2: 0x0098DA16 */ uint16 ObjectTypeStringTableCount[] = { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }; +utf8 *_cachedObjectStrings[MAX_OBJECT_CACHED_STRINGS] = { NULL }; + +void utf8_trim_string(utf8 *text) +{ + utf8 *src = text; + utf8 *dst = text; + utf8 *last = text; + int codepoint; + + // Trim left + while ((codepoint = utf8_get_next(src, &src)) != 0) { + if (codepoint != ' ') { + dst = utf8_write_codepoint(dst, codepoint); + last = dst; + break; + } + } + if (codepoint != 0) { + // Trim right + while ((codepoint = utf8_get_next(src, &src)) != 0) { + dst = utf8_write_codepoint(dst, codepoint); + if (codepoint != ' ') { + last = dst; + } + } + } + *last = 0; +} + +static utf8 *convert_multibyte_charset(const char *src) +{ + int reservedLength = (strlen(src) * 4) + 1; + utf8 *buffer = malloc(reservedLength); + utf8 *dst = buffer; + for (const uint8 *ch = src; *ch != 0;) { + if (*ch == 0xFF) { + ch++; + uint8 a = *ch++; + uint8 b = *ch++; + uint16 codepoint = (a << 8) | b; + dst = utf8_write_codepoint(dst, codepoint); + } else { + *dst++ = *ch++; + } + } + *dst++ = 0; + int actualLength = dst - buffer; + return realloc(buffer, actualLength); +} + +static bool rct2_language_is_multibyte_charset(int languageId) +{ + switch (languageId) { + case RCT2_LANGUAGE_ID_KOREAN: + case RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL: + case RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED: + return true; + default: + return false; + } +} + /* rct2: 0x006A9E24*/ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/*ecx*/, int index/*ebx*/, int tableindex/*edx*/) { - char* pString = NULL; + uint8 languageId, chosenLanguageId; + char *pString = NULL; int result = 0; - while (true) - { - uint8_t language_code = *(*pStringTable)++; - - if (language_code == 0xFF) //end of string table - break; + bool isBlank; + + while ((languageId = *(*pStringTable)++) != RCT2_LANGUAGE_ID_END) { + isBlank = true; + + // Strings that are just ' ' are set as invalid langauges. + // But if there is no real string then it will set the string as + // the blank string + for (char *ch = *pStringTable; *ch != 0; ch++) { + if (!isblank(*ch)) { + isBlank = false; + break; + } + } + + if (isBlank) languageId = 0xFE; // This is the ideal situation. Language found - if (language_code == OpenRCT2LangIdToObjectLangId[gCurrentLanguage])//1) - { + if (languageId == LanguagesDescriptors[gCurrentLanguage].rct2_original_id) { + chosenLanguageId = languageId; pString = *pStringTable; result |= 1; } // Just in case always load english into pString - if (language_code == 0 && !(result & 1)) - { + if (languageId == RCT2_LANGUAGE_ID_ENGLISH_UK && !(result & 1)) { + chosenLanguageId = languageId; pString = *pStringTable; result |= 2; } // Failing that fall back to whatever is first string - if (!(result & 7)) - { + if (!(result & 7)) { + chosenLanguageId = languageId; pString = *pStringTable; - result |= 4; + if (!isBlank) result |= 4; } - // Skip over the actual string entry to get to the next - // entry + // Skip over the actual string entry to get to the next entry while (*(*pStringTable)++ != 0); } // If not scenario text - if (RCT2_GLOBAL(0x9ADAFC, uint8_t) == 0) - { - int stringid = 3463; - for (int i = 0; i < type; i++) - { + if (RCT2_GLOBAL(0x009ADAFC, uint8) == 0) { + int stringid = NONSTEX_BASE_STRING_ID; + for (int i = 0; i < type; i++) { int nrobjects = object_entry_group_counts[i]; int nrstringtables = ObjectTypeStringTableCount[i]; stringid += nrobjects * nrstringtables; @@ -358,23 +467,48 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_BASE_STRING_ID, uint32) = stringid; stringid += tableindex; + // cache UTF-8 string + int cacheStringOffset = stringid - STEX_BASE_STRING_ID; + utf8 **cacheString = &_cachedObjectStrings[cacheStringOffset]; + if (*cacheString != NULL) { + free(*cacheString); + } + if (rct2_language_is_multibyte_charset(chosenLanguageId)) { + *cacheString = convert_multibyte_charset(pString); + } else { + *cacheString = win1252_to_utf8_alloc(pString); + } + utf8_trim_string(*cacheString); + //put pointer in stringtable if (_languageCurrent.num_strings > stringid) - _languageCurrent.strings[stringid] = pString; + _languageCurrent.strings[stringid] = *cacheString; // Until all string related functions are finished copy // to old array as well. - _languageOriginal[stringid] = pString; + _languageOriginal[stringid] = *cacheString; return stringid; - } - else - { - int stringid = 3447 + tableindex; + } else { + int stringid = STEX_BASE_STRING_ID + tableindex; + + // cache UTF-8 string + int cacheStringOffset = stringid - STEX_BASE_STRING_ID; + utf8 **cacheString = &_cachedObjectStrings[cacheStringOffset]; + if (*cacheString != NULL) { + free(*cacheString); + } + if (rct2_language_is_multibyte_charset(chosenLanguageId)) { + *cacheString = convert_multibyte_charset(pString); + } else { + *cacheString = win1252_to_utf8_alloc(pString); + } + utf8_trim_string(*cacheString); + //put pointer in stringtable if (_languageCurrent.num_strings > stringid) - _languageCurrent.strings[stringid] = pString; + _languageCurrent.strings[stringid] = *cacheString; // Until all string related functions are finished copy // to old array as well. - _languageOriginal[stringid] = pString; + _languageOriginal[stringid] = *cacheString; return stringid; } } diff --git a/src/localisation/language.h b/src/localisation/language.h index cc6ed220b8..2b8fcb5d1b 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -48,6 +48,7 @@ typedef struct { const utf8 *native_name; const utf8 *path; const utf8 *font; + uint8 rct2_original_id; } language_descriptor; extern const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT]; @@ -56,6 +57,12 @@ extern int gCurrentLanguage; extern bool gUseTrueTypeFont; extern const utf8 *gTrueTypeFontPath; +extern const utf8 BlackUpArrowString[]; +extern const utf8 BlackDownArrowString[]; +extern const utf8 BlackLeftArrowString[]; +extern const utf8 BlackRightArrowString[]; +extern const utf8 CheckBoxMarkString[]; + const char *language_get_string(rct_string_id id); int language_open(int id); void language_close_all(); diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index ae6d71882c..659eae6a28 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -833,6 +833,14 @@ int get_string_length(const utf8* text) return ch - text - 1; } +utf8 *win1252_to_utf8_alloc(const char *src) +{ + int reservedSpace = (strlen(src) * 4) + 1; + utf8 *result = malloc(reservedSpace); + int actualSpace = win1252_to_utf8(result, src, reservedSpace); + return (utf8*)realloc(result, actualSpace); +} + int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength) { utf16 stackBuffer[256]; diff --git a/src/localisation/localisation.h b/src/localisation/localisation.h index 238931da6e..e6c31049cf 100644 --- a/src/localisation/localisation.h +++ b/src/localisation/localisation.h @@ -42,6 +42,7 @@ rct_string_id user_string_allocate(int base, const char *text); void user_string_free(rct_string_id id); bool is_user_string_id(rct_string_id stringId); +utf8 *win1252_to_utf8_alloc(const char *src); int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength); #define MAX_USER_STRINGS 1024 diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 0aa9843f4d..26e05f526e 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -1439,14 +1439,13 @@ static void window_editor_object_selection_scrollpaint(rct_window *w, rct_drawpi if (*listItem->flags & (OBJECT_SELECTION_FLAG_IN_USE | OBJECT_SELECTION_FLAG_REQUIRED | OBJECT_SELECTION_FLAG_ALWAYS_REQUIRED)) colour2 |= 0x40; - gfx_draw_string(dpi, (char*)0x009DED72, colour2, x, y); + gfx_draw_string(dpi, (char*)CheckBoxMarkString, colour2, x, y); } x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 15; char *bufferWithColour = (char*)0x0141ED68; - char *buffer = bufferWithColour + 1; - bufferWithColour[0] = colour; + char *buffer = utf8_write_codepoint(bufferWithColour, colour); if (*listItem->flags & OBJECT_SELECTION_FLAG_6) { colour = w->colours[1] & 0x7F; RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = -1; diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index f9524e77f9..480ba6b44d 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -1200,7 +1200,7 @@ static void window_editor_objective_options_rides_scrollpaint(rct_window *w, rct ride = GET_RIDE(i); if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE) { RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = stringId == 1193 ? 0xFFFE : 0xFFFF; - gfx_draw_string(dpi, (char*)0x009DED72, w->colours[1] & 0x7F, 2, y); + gfx_draw_string(dpi, (char*)CheckBoxMarkString, w->colours[1] & 0x7F, 2, y); } // Ride name diff --git a/src/windows/themes.c b/src/windows/themes.c index 9984df3f22..11e2a8aee4 100644 --- a/src/windows/themes.c +++ b/src/windows/themes.c @@ -881,7 +881,7 @@ void window_themes_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scroll gfx_fill_rect_inset(dpi, _button_offset_x + 12 * j, y + _check_offset_y, _button_offset_x + 12 * j + 9, y + _check_offset_y + 10, w->colours[1], 0xE0); if (get_colour_scheme_tab_by_index(i)->colours[j] & 0x80) { RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = -1; - gfx_draw_string(dpi, (char*)0x009DED72, w->colours[1] & 0x7F, _button_offset_x + 12 * j, y + _check_offset_y); + gfx_draw_string(dpi, (char*)CheckBoxMarkString, w->colours[1] & 0x7F, _button_offset_x + 12 * j, y + _check_offset_y); } } From d6a7025a3a942d7b451074134cb9d8b7a71f8404 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 27 Jul 2015 14:26:22 +0100 Subject: [PATCH 0408/1173] implement utf8, part 6 --- projects/openrct2.vcxproj | 1 + projects/openrct2.vcxproj.filters | 3 + projects/openrct2.vcxproj.user | 7 +- src/drawing/string.c | 212 +- src/localisation/convert.c | 7477 +++++++++++++++++++++++++++++ src/localisation/language.c | 8 +- src/localisation/localisation.c | 32 +- src/localisation/localisation.h | 3 + 8 files changed, 7623 insertions(+), 120 deletions(-) create mode 100644 src/localisation/convert.c diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index ebf89bf5f7..efe3e09bcc 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -58,6 +58,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index a9d0659525..5a8f3f4179 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -495,6 +495,9 @@ Source + + Source\Localisation + diff --git a/projects/openrct2.vcxproj.user b/projects/openrct2.vcxproj.user index 97aec8541a..da4d8aed24 100644 --- a/projects/openrct2.vcxproj.user +++ b/projects/openrct2.vcxproj.user @@ -4,15 +4,13 @@ $(TargetDir) WindowsLocalDebugger $(TargetDir)\openrct2.exe - - + "C:\Program Files (x86)\Infogrames\RollerCoaster Tycoon 2\Scenarios\Electric Fields.SC6" $(TargetDir) WindowsLocalDebugger $(TargetDir)\openrct2.exe - - + "C:\Program Files (x86)\Infogrames\RollerCoaster Tycoon 2\Scenarios\Electric Fields.SC6" false @@ -21,5 +19,6 @@ $(TargetDir)\openrct2.exe WindowsLocalDebugger $(TargetDir) + "C:\Program Files (x86)\Infogrames\RollerCoaster Tycoon 2\Scenarios\Electric Fields.SC6" \ No newline at end of file diff --git a/src/drawing/string.c b/src/drawing/string.c index 5e2dc7e470..81aa881a24 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -299,121 +299,109 @@ int gfx_clip_string(utf8 *text, int width) * num_lines (edi) - out * font_height (ebx) - out */ -int gfx_wrap_string(char* buffer, int width, int* num_lines, int* font_height) +int gfx_wrap_string(utf8 *text, int width, int *num_lines, int *font_height) { - unsigned int line_width = 0; - unsigned int max_width = 0; - rct_g1_element g1_element; + int lineWidth = 0; + int maxWidth = 0; + rct_g1_element g1Element; *num_lines = 0; *font_height = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); // Pointer to the start of the current word - unsigned char* curr_word = NULL; + utf8 *currentWord = NULL; // Width of line up to current word - unsigned int curr_width; - - for (unsigned char* curr_char = buffer; *curr_char != (uint8)0; curr_char++) { + int currentWidth; + utf8 *ch = text; + utf8 *lastCh; + int codepoint; + while ((codepoint = utf8_get_next(ch, &lastCh)) != 0) { // Remember start of current word and line width up to this word - if (*curr_char == ' ') { - curr_word = curr_char; - curr_width = line_width; - } - - // 5 is RCT2 new line? - if (*curr_char != 5) { - if (*curr_char < ' ') { - switch(*curr_char) { - case FORMAT_MOVE_X: - case FORMAT_ADJUST_PALETTE: - case 3: - case 4: - curr_char++; - continue; - case FORMAT_NEWLINE: - case FORMAT_NEWLINE_SMALLER: - continue; - case FORMAT_TINYFONT: - *font_height = 0x1C0; - continue; - case FORMAT_BIGFONT: - *font_height = 0x2A0; - continue; - case FORMAT_MEDIUMFONT: - *font_height = 0xE0; - continue; - case FORMAT_SMALLFONT: - *font_height = 0; - continue; - case FORMAT_OUTLINE: - case FORMAT_OUTLINE_OFF: - case FORMAT_WINDOW_COLOUR_1: - case FORMAT_WINDOW_COLOUR_2: - case FORMAT_WINDOW_COLOUR_3: - case 0x10: - continue; - case FORMAT_INLINE_SPRITE: - g1_element = g1Elements[*((uint32*)(curr_char + 1)) & 0x7FFFF]; - line_width += g1_element.width; - curr_char += 4; - break; - default: - if (*curr_char <= 0x16) { - curr_char += 2; - continue; - } - curr_char += 4; - continue; - } - } - - line_width += _spriteFontCharacterWidths[*font_height + (*curr_char - 0x20)]; - - if ((int)line_width <= width) { - continue; - } - if (curr_word == 0) { - curr_char--; - unsigned char* old_char = curr_char; - unsigned char swap_char = 0; - unsigned char temp; - // Insert NULL at current character - // Aboslutely no guarantee that this won't overrun! - do { - temp = swap_char; - swap_char = *curr_char; - *curr_char = temp; - curr_char++; - } while(swap_char != 0); - - *curr_char = swap_char; - curr_char = old_char; - curr_char++; - *num_lines += 1; - - if (line_width > max_width) { - max_width = line_width; - } - line_width = 0; - curr_word = 0; - continue; - } - curr_char = curr_word; - line_width = curr_width; - } - - *num_lines += 1; - *curr_char = 0; - - if (line_width > max_width) { - max_width = line_width; + if (codepoint == ' ') { + currentWord = ch; + currentWidth = lineWidth; + } + + if (utf8_is_format_code(codepoint)) { + switch (codepoint) { + case FORMAT_MOVE_X: + case FORMAT_ADJUST_PALETTE: + case 3: + case 4: + ch++; + break; + case FORMAT_NEWLINE: + case FORMAT_NEWLINE_SMALLER: + *num_lines += 1; + *ch = 0; + if (lineWidth > maxWidth) { + maxWidth = lineWidth; + } + lineWidth = 0; + currentWord = 0; + break; + case FORMAT_TINYFONT: + *font_height = FONT_SPRITE_BASE_TINY; + break; + case FORMAT_SMALLFONT: + *font_height = FONT_SPRITE_BASE_SMALL; + break; + case FORMAT_MEDIUMFONT: + *font_height = FONT_SPRITE_BASE_MEDIUM; + break; + case FORMAT_BIGFONT: + *font_height = FONT_SPRITE_BASE_BIG; + break; + case FORMAT_OUTLINE: + case FORMAT_OUTLINE_OFF: + case FORMAT_WINDOW_COLOUR_1: + case FORMAT_WINDOW_COLOUR_2: + case FORMAT_WINDOW_COLOUR_3: + case 0x10: + break; + case FORMAT_INLINE_SPRITE: + g1Element = g1Elements[*((uint32*)(ch + 1)) & 0x7FFFF]; + lineWidth += g1Element.width; + lastCh += 4; + break; + default: + if (codepoint < FORMAT_COLOUR_CODE_START || codepoint > FORMAT_COLOUR_CODE_END) { + if (codepoint <= 0x16) { + lastCh += 2; + } else { + lastCh += 4; + } + } + break; + } + ch = lastCh; + } else { + lineWidth += _spriteFontCharacterWidths[*font_height + utf8_get_sprite_offset_for_codepoint(codepoint)]; + if ((int)lineWidth <= width) { + ch = lastCh; + } else if (currentWord == NULL) { + // Single word is longer than line, insert null terminator + utf8 *end = get_string_end(ch); + memmove(ch + 1, ch, end - ch + 1); + *ch++ = 0; + + maxWidth = max(maxWidth, lineWidth); + *num_lines += 1; + lineWidth = 0; + currentWord = NULL; + } else { + ch = currentWord; + *ch++ = 0; + + maxWidth = max(maxWidth, currentWidth); + *num_lines += 1; + lineWidth = 0; + currentWord = NULL; + } } - line_width = 0; - curr_word = 0; } - if (max_width == 0)return line_width; - return max_width; + return maxWidth == 0 ? lineWidth : maxWidth; } @@ -1018,15 +1006,6 @@ static void ttf_draw_string_raw_ttf(rct_drawpixelinfo *dpi, const utf8 *text, te break; } - int fontStyle = TTF_GetFontStyle(font); - int newFontStyle = 0; - if (info->flags & TEXT_DRAW_FLAG_OUTLINE) { - newFontStyle |= TTF_STYLE_BOLD; - } - if (fontStyle != newFontStyle) { - TTF_SetFontStyle(font, newFontStyle); - } - if (info->flags & TEXT_DRAW_FLAG_NO_DRAW) { int width, height; @@ -1079,7 +1058,12 @@ static void ttf_draw_string_raw_ttf(rct_drawpixelinfo *dpi, const utf8 *text, te int dstScanSkip = dpi->width + dpi->pitch - width; for (int yy = 0; yy < height; yy++) { for (int xx = 0; xx < width; xx++) { - if (*src != 0) *dst = colour; + if (*src != 0) { + *dst = colour; + if (info->flags & TEXT_DRAW_FLAG_OUTLINE) { + *(dst + width + dstScanSkip + 1) = 0; + } + } src++; dst++; } diff --git a/src/localisation/convert.c b/src/localisation/convert.c new file mode 100644 index 0000000000..ddb36e39e7 --- /dev/null +++ b/src/localisation/convert.c @@ -0,0 +1,7477 @@ +#include "localisation.h" + +typedef struct { + uint16 code; + uint16 unicode; +} encoding_convert_entry; + +static const encoding_convert_entry GB2312ToUnicodeTable[7445]; + +static int encoding_search_compare(const void *pKey, const void *pEntry) +{ + uint16 key = *((uint16*)pKey); + encoding_convert_entry *entry = (encoding_convert_entry*)pEntry; + if (key < entry->code) return -1; + if (key > entry->code) return 1; + return 0; +} + +static wchar_t encoding_convert_x_to_unicode(wchar_t code, const encoding_convert_entry *table, int count) +{ + encoding_convert_entry *entry = bsearch(&code, table, count, sizeof(encoding_convert_entry), encoding_search_compare); + if (entry == NULL) return code; + else return entry->unicode; +} + +wchar_t encoding_convert_gb2312_to_unicode(wchar_t gb2312) +{ + return encoding_convert_x_to_unicode(gb2312, GB2312ToUnicodeTable, countof(GB2312ToUnicodeTable)); +} + +static const encoding_convert_entry GB2312ToUnicodeTable[7445] = { + { 8481, 12288 }, + { 8482, 12289 }, + { 8483, 12290 }, + { 8484, 12539 }, + { 8485, 713 }, + { 8486, 711 }, + { 8487, 168 }, + { 8488, 12291 }, + { 8489, 12293 }, + { 8490, 8213 }, + { 8491, 65374 }, + { 8492, 8741 }, + { 8493, 8230 }, + { 8494, 8216 }, + { 8495, 8217 }, + { 8496, 8220 }, + { 8497, 8221 }, + { 8498, 12308 }, + { 8499, 12309 }, + { 8500, 12296 }, + { 8501, 12297 }, + { 8502, 12298 }, + { 8503, 12299 }, + { 8504, 12300 }, + { 8505, 12301 }, + { 8506, 12302 }, + { 8507, 12303 }, + { 8508, 12310 }, + { 8509, 12311 }, + { 8510, 12304 }, + { 8511, 12305 }, + { 8512, 177 }, + { 8513, 215 }, + { 8514, 247 }, + { 8515, 8758 }, + { 8516, 8743 }, + { 8517, 8744 }, + { 8518, 8721 }, + { 8519, 8719 }, + { 8520, 8746 }, + { 8521, 8745 }, + { 8522, 8712 }, + { 8523, 8759 }, + { 8524, 8730 }, + { 8525, 8869 }, + { 8526, 8741 }, + { 8527, 8736 }, + { 8528, 8978 }, + { 8529, 8857 }, + { 8530, 8747 }, + { 8531, 8750 }, + { 8532, 8801 }, + { 8533, 8780 }, + { 8534, 8776 }, + { 8535, 8765 }, + { 8536, 8733 }, + { 8537, 8800 }, + { 8538, 8814 }, + { 8539, 8815 }, + { 8540, 8804 }, + { 8541, 8805 }, + { 8542, 8734 }, + { 8543, 8757 }, + { 8544, 8756 }, + { 8545, 9794 }, + { 8546, 9792 }, + { 8547, 176 }, + { 8548, 8242 }, + { 8549, 8243 }, + { 8550, 8451 }, + { 8551, 65284 }, + { 8552, 164 }, + { 8553, 65504 }, + { 8554, 65505 }, + { 8555, 8240 }, + { 8556, 167 }, + { 8557, 8470 }, + { 8558, 9734 }, + { 8559, 9733 }, + { 8560, 9675 }, + { 8561, 9679 }, + { 8562, 9678 }, + { 8563, 9671 }, + { 8564, 9670 }, + { 8565, 9633 }, + { 8566, 9632 }, + { 8567, 9651 }, + { 8568, 9650 }, + { 8569, 8251 }, + { 8570, 8594 }, + { 8571, 8592 }, + { 8572, 8593 }, + { 8573, 8595 }, + { 8574, 12307 }, + { 8753, 9352 }, + { 8754, 9353 }, + { 8755, 9354 }, + { 8756, 9355 }, + { 8757, 9356 }, + { 8758, 9357 }, + { 8759, 9358 }, + { 8760, 9359 }, + { 8761, 9360 }, + { 8762, 9361 }, + { 8763, 9362 }, + { 8764, 9363 }, + { 8765, 9364 }, + { 8766, 9365 }, + { 8767, 9366 }, + { 8768, 9367 }, + { 8769, 9368 }, + { 8770, 9369 }, + { 8771, 9370 }, + { 8772, 9371 }, + { 8773, 9332 }, + { 8774, 9333 }, + { 8775, 9334 }, + { 8776, 9335 }, + { 8777, 9336 }, + { 8778, 9337 }, + { 8779, 9338 }, + { 8780, 9339 }, + { 8781, 9340 }, + { 8782, 9341 }, + { 8783, 9342 }, + { 8784, 9343 }, + { 8785, 9344 }, + { 8786, 9345 }, + { 8787, 9346 }, + { 8788, 9347 }, + { 8789, 9348 }, + { 8790, 9349 }, + { 8791, 9350 }, + { 8792, 9351 }, + { 8793, 9312 }, + { 8794, 9313 }, + { 8795, 9314 }, + { 8796, 9315 }, + { 8797, 9316 }, + { 8798, 9317 }, + { 8799, 9318 }, + { 8800, 9319 }, + { 8801, 9320 }, + { 8802, 9321 }, + { 8805, 12832 }, + { 8806, 12833 }, + { 8807, 12834 }, + { 8808, 12835 }, + { 8809, 12836 }, + { 8810, 12837 }, + { 8811, 12838 }, + { 8812, 12839 }, + { 8813, 12840 }, + { 8814, 12841 }, + { 8817, 8544 }, + { 8818, 8545 }, + { 8819, 8546 }, + { 8820, 8547 }, + { 8821, 8548 }, + { 8822, 8549 }, + { 8823, 8550 }, + { 8824, 8551 }, + { 8825, 8552 }, + { 8826, 8553 }, + { 8827, 8554 }, + { 8828, 8555 }, + { 8993, 65281 }, + { 8994, 65282 }, + { 8995, 65283 }, + { 8996, 65509 }, + { 8997, 65285 }, + { 8998, 65286 }, + { 8999, 65287 }, + { 9000, 65288 }, + { 9001, 65289 }, + { 9002, 65290 }, + { 9003, 65291 }, + { 9004, 65292 }, + { 9005, 65293 }, + { 9006, 65294 }, + { 9007, 65295 }, + { 9008, 65296 }, + { 9009, 65297 }, + { 9010, 65298 }, + { 9011, 65299 }, + { 9012, 65300 }, + { 9013, 65301 }, + { 9014, 65302 }, + { 9015, 65303 }, + { 9016, 65304 }, + { 9017, 65305 }, + { 9018, 65306 }, + { 9019, 65307 }, + { 9020, 65308 }, + { 9021, 65309 }, + { 9022, 65310 }, + { 9023, 65311 }, + { 9024, 65312 }, + { 9025, 65313 }, + { 9026, 65314 }, + { 9027, 65315 }, + { 9028, 65316 }, + { 9029, 65317 }, + { 9030, 65318 }, + { 9031, 65319 }, + { 9032, 65320 }, + { 9033, 65321 }, + { 9034, 65322 }, + { 9035, 65323 }, + { 9036, 65324 }, + { 9037, 65325 }, + { 9038, 65326 }, + { 9039, 65327 }, + { 9040, 65328 }, + { 9041, 65329 }, + { 9042, 65330 }, + { 9043, 65331 }, + { 9044, 65332 }, + { 9045, 65333 }, + { 9046, 65334 }, + { 9047, 65335 }, + { 9048, 65336 }, + { 9049, 65337 }, + { 9050, 65338 }, + { 9051, 65339 }, + { 9052, 65340 }, + { 9053, 65341 }, + { 9054, 65342 }, + { 9055, 65343 }, + { 9056, 65344 }, + { 9057, 65345 }, + { 9058, 65346 }, + { 9059, 65347 }, + { 9060, 65348 }, + { 9061, 65349 }, + { 9062, 65350 }, + { 9063, 65351 }, + { 9064, 65352 }, + { 9065, 65353 }, + { 9066, 65354 }, + { 9067, 65355 }, + { 9068, 65356 }, + { 9069, 65357 }, + { 9070, 65358 }, + { 9071, 65359 }, + { 9072, 65360 }, + { 9073, 65361 }, + { 9074, 65362 }, + { 9075, 65363 }, + { 9076, 65364 }, + { 9077, 65365 }, + { 9078, 65366 }, + { 9079, 65367 }, + { 9080, 65368 }, + { 9081, 65369 }, + { 9082, 65370 }, + { 9083, 65371 }, + { 9084, 65372 }, + { 9085, 65373 }, + { 9086, 65507 }, + { 9249, 12353 }, + { 9250, 12354 }, + { 9251, 12355 }, + { 9252, 12356 }, + { 9253, 12357 }, + { 9254, 12358 }, + { 9255, 12359 }, + { 9256, 12360 }, + { 9257, 12361 }, + { 9258, 12362 }, + { 9259, 12363 }, + { 9260, 12364 }, + { 9261, 12365 }, + { 9262, 12366 }, + { 9263, 12367 }, + { 9264, 12368 }, + { 9265, 12369 }, + { 9266, 12370 }, + { 9267, 12371 }, + { 9268, 12372 }, + { 9269, 12373 }, + { 9270, 12374 }, + { 9271, 12375 }, + { 9272, 12376 }, + { 9273, 12377 }, + { 9274, 12378 }, + { 9275, 12379 }, + { 9276, 12380 }, + { 9277, 12381 }, + { 9278, 12382 }, + { 9279, 12383 }, + { 9280, 12384 }, + { 9281, 12385 }, + { 9282, 12386 }, + { 9283, 12387 }, + { 9284, 12388 }, + { 9285, 12389 }, + { 9286, 12390 }, + { 9287, 12391 }, + { 9288, 12392 }, + { 9289, 12393 }, + { 9290, 12394 }, + { 9291, 12395 }, + { 9292, 12396 }, + { 9293, 12397 }, + { 9294, 12398 }, + { 9295, 12399 }, + { 9296, 12400 }, + { 9297, 12401 }, + { 9298, 12402 }, + { 9299, 12403 }, + { 9300, 12404 }, + { 9301, 12405 }, + { 9302, 12406 }, + { 9303, 12407 }, + { 9304, 12408 }, + { 9305, 12409 }, + { 9306, 12410 }, + { 9307, 12411 }, + { 9308, 12412 }, + { 9309, 12413 }, + { 9310, 12414 }, + { 9311, 12415 }, + { 9312, 12416 }, + { 9313, 12417 }, + { 9314, 12418 }, + { 9315, 12419 }, + { 9316, 12420 }, + { 9317, 12421 }, + { 9318, 12422 }, + { 9319, 12423 }, + { 9320, 12424 }, + { 9321, 12425 }, + { 9322, 12426 }, + { 9323, 12427 }, + { 9324, 12428 }, + { 9325, 12429 }, + { 9326, 12430 }, + { 9327, 12431 }, + { 9328, 12432 }, + { 9329, 12433 }, + { 9330, 12434 }, + { 9331, 12435 }, + { 9505, 12449 }, + { 9506, 12450 }, + { 9507, 12451 }, + { 9508, 12452 }, + { 9509, 12453 }, + { 9510, 12454 }, + { 9511, 12455 }, + { 9512, 12456 }, + { 9513, 12457 }, + { 9514, 12458 }, + { 9515, 12459 }, + { 9516, 12460 }, + { 9517, 12461 }, + { 9518, 12462 }, + { 9519, 12463 }, + { 9520, 12464 }, + { 9521, 12465 }, + { 9522, 12466 }, + { 9523, 12467 }, + { 9524, 12468 }, + { 9525, 12469 }, + { 9526, 12470 }, + { 9527, 12471 }, + { 9528, 12472 }, + { 9529, 12473 }, + { 9530, 12474 }, + { 9531, 12475 }, + { 9532, 12476 }, + { 9533, 12477 }, + { 9534, 12478 }, + { 9535, 12479 }, + { 9536, 12480 }, + { 9537, 12481 }, + { 9538, 12482 }, + { 9539, 12483 }, + { 9540, 12484 }, + { 9541, 12485 }, + { 9542, 12486 }, + { 9543, 12487 }, + { 9544, 12488 }, + { 9545, 12489 }, + { 9546, 12490 }, + { 9547, 12491 }, + { 9548, 12492 }, + { 9549, 12493 }, + { 9550, 12494 }, + { 9551, 12495 }, + { 9552, 12496 }, + { 9553, 12497 }, + { 9554, 12498 }, + { 9555, 12499 }, + { 9556, 12500 }, + { 9557, 12501 }, + { 9558, 12502 }, + { 9559, 12503 }, + { 9560, 12504 }, + { 9561, 12505 }, + { 9562, 12506 }, + { 9563, 12507 }, + { 9564, 12508 }, + { 9565, 12509 }, + { 9566, 12510 }, + { 9567, 12511 }, + { 9568, 12512 }, + { 9569, 12513 }, + { 9570, 12514 }, + { 9571, 12515 }, + { 9572, 12516 }, + { 9573, 12517 }, + { 9574, 12518 }, + { 9575, 12519 }, + { 9576, 12520 }, + { 9577, 12521 }, + { 9578, 12522 }, + { 9579, 12523 }, + { 9580, 12524 }, + { 9581, 12525 }, + { 9582, 12526 }, + { 9583, 12527 }, + { 9584, 12528 }, + { 9585, 12529 }, + { 9586, 12530 }, + { 9587, 12531 }, + { 9588, 12532 }, + { 9589, 12533 }, + { 9590, 12534 }, + { 9761, 913 }, + { 9762, 914 }, + { 9763, 915 }, + { 9764, 916 }, + { 9765, 917 }, + { 9766, 918 }, + { 9767, 919 }, + { 9768, 920 }, + { 9769, 921 }, + { 9770, 922 }, + { 9771, 923 }, + { 9772, 924 }, + { 9773, 925 }, + { 9774, 926 }, + { 9775, 927 }, + { 9776, 928 }, + { 9777, 929 }, + { 9778, 931 }, + { 9779, 932 }, + { 9780, 933 }, + { 9781, 934 }, + { 9782, 935 }, + { 9783, 936 }, + { 9784, 937 }, + { 9793, 945 }, + { 9794, 946 }, + { 9795, 947 }, + { 9796, 948 }, + { 9797, 949 }, + { 9798, 950 }, + { 9799, 951 }, + { 9800, 952 }, + { 9801, 953 }, + { 9802, 954 }, + { 9803, 955 }, + { 9804, 956 }, + { 9805, 957 }, + { 9806, 958 }, + { 9807, 959 }, + { 9808, 960 }, + { 9809, 961 }, + { 9810, 963 }, + { 9811, 964 }, + { 9812, 965 }, + { 9813, 966 }, + { 9814, 967 }, + { 9815, 968 }, + { 9816, 969 }, + { 10017, 1040 }, + { 10018, 1041 }, + { 10019, 1042 }, + { 10020, 1043 }, + { 10021, 1044 }, + { 10022, 1045 }, + { 10023, 1025 }, + { 10024, 1046 }, + { 10025, 1047 }, + { 10026, 1048 }, + { 10027, 1049 }, + { 10028, 1050 }, + { 10029, 1051 }, + { 10030, 1052 }, + { 10031, 1053 }, + { 10032, 1054 }, + { 10033, 1055 }, + { 10034, 1056 }, + { 10035, 1057 }, + { 10036, 1058 }, + { 10037, 1059 }, + { 10038, 1060 }, + { 10039, 1061 }, + { 10040, 1062 }, + { 10041, 1063 }, + { 10042, 1064 }, + { 10043, 1065 }, + { 10044, 1066 }, + { 10045, 1067 }, + { 10046, 1068 }, + { 10047, 1069 }, + { 10048, 1070 }, + { 10049, 1071 }, + { 10065, 1072 }, + { 10066, 1073 }, + { 10067, 1074 }, + { 10068, 1075 }, + { 10069, 1076 }, + { 10070, 1077 }, + { 10071, 1105 }, + { 10072, 1078 }, + { 10073, 1079 }, + { 10074, 1080 }, + { 10075, 1081 }, + { 10076, 1082 }, + { 10077, 1083 }, + { 10078, 1084 }, + { 10079, 1085 }, + { 10080, 1086 }, + { 10081, 1087 }, + { 10082, 1088 }, + { 10083, 1089 }, + { 10084, 1090 }, + { 10085, 1091 }, + { 10086, 1092 }, + { 10087, 1093 }, + { 10088, 1094 }, + { 10089, 1095 }, + { 10090, 1096 }, + { 10091, 1097 }, + { 10092, 1098 }, + { 10093, 1099 }, + { 10094, 1100 }, + { 10095, 1101 }, + { 10096, 1102 }, + { 10097, 1103 }, + { 10273, 257 }, + { 10274, 225 }, + { 10275, 462 }, + { 10276, 224 }, + { 10277, 275 }, + { 10278, 233 }, + { 10279, 283 }, + { 10280, 232 }, + { 10281, 299 }, + { 10282, 237 }, + { 10283, 464 }, + { 10284, 236 }, + { 10285, 333 }, + { 10286, 243 }, + { 10287, 466 }, + { 10288, 242 }, + { 10289, 363 }, + { 10290, 250 }, + { 10291, 468 }, + { 10292, 249 }, + { 10293, 470 }, + { 10294, 472 }, + { 10295, 474 }, + { 10296, 476 }, + { 10297, 252 }, + { 10298, 234 }, + { 10309, 12549 }, + { 10310, 12550 }, + { 10311, 12551 }, + { 10312, 12552 }, + { 10313, 12553 }, + { 10314, 12554 }, + { 10315, 12555 }, + { 10316, 12556 }, + { 10317, 12557 }, + { 10318, 12558 }, + { 10319, 12559 }, + { 10320, 12560 }, + { 10321, 12561 }, + { 10322, 12562 }, + { 10323, 12563 }, + { 10324, 12564 }, + { 10325, 12565 }, + { 10326, 12566 }, + { 10327, 12567 }, + { 10328, 12568 }, + { 10329, 12569 }, + { 10330, 12570 }, + { 10331, 12571 }, + { 10332, 12572 }, + { 10333, 12573 }, + { 10334, 12574 }, + { 10335, 12575 }, + { 10336, 12576 }, + { 10337, 12577 }, + { 10338, 12578 }, + { 10339, 12579 }, + { 10340, 12580 }, + { 10341, 12581 }, + { 10342, 12582 }, + { 10343, 12583 }, + { 10344, 12584 }, + { 10345, 12585 }, + { 10532, 9472 }, + { 10533, 9473 }, + { 10534, 9474 }, + { 10535, 9475 }, + { 10536, 9476 }, + { 10537, 9477 }, + { 10538, 9478 }, + { 10539, 9479 }, + { 10540, 9480 }, + { 10541, 9481 }, + { 10542, 9482 }, + { 10543, 9483 }, + { 10544, 9484 }, + { 10545, 9485 }, + { 10546, 9486 }, + { 10547, 9487 }, + { 10548, 9488 }, + { 10549, 9489 }, + { 10550, 9490 }, + { 10551, 9491 }, + { 10552, 9492 }, + { 10553, 9493 }, + { 10554, 9494 }, + { 10555, 9495 }, + { 10556, 9496 }, + { 10557, 9497 }, + { 10558, 9498 }, + { 10559, 9499 }, + { 10560, 9500 }, + { 10561, 9501 }, + { 10562, 9502 }, + { 10563, 9503 }, + { 10564, 9504 }, + { 10565, 9505 }, + { 10566, 9506 }, + { 10567, 9507 }, + { 10568, 9508 }, + { 10569, 9509 }, + { 10570, 9510 }, + { 10571, 9511 }, + { 10572, 9512 }, + { 10573, 9513 }, + { 10574, 9514 }, + { 10575, 9515 }, + { 10576, 9516 }, + { 10577, 9517 }, + { 10578, 9518 }, + { 10579, 9519 }, + { 10580, 9520 }, + { 10581, 9521 }, + { 10582, 9522 }, + { 10583, 9523 }, + { 10584, 9524 }, + { 10585, 9525 }, + { 10586, 9526 }, + { 10587, 9527 }, + { 10588, 9528 }, + { 10589, 9529 }, + { 10590, 9530 }, + { 10591, 9531 }, + { 10592, 9532 }, + { 10593, 9533 }, + { 10594, 9534 }, + { 10595, 9535 }, + { 10596, 9536 }, + { 10597, 9537 }, + { 10598, 9538 }, + { 10599, 9539 }, + { 10600, 9540 }, + { 10601, 9541 }, + { 10602, 9542 }, + { 10603, 9543 }, + { 10604, 9544 }, + { 10605, 9545 }, + { 10606, 9546 }, + { 10607, 9547 }, + { 12321, 21834 }, + { 12322, 38463 }, + { 12323, 22467 }, + { 12324, 25384 }, + { 12325, 21710 }, + { 12326, 21769 }, + { 12327, 21696 }, + { 12328, 30353 }, + { 12329, 30284 }, + { 12330, 34108 }, + { 12331, 30702 }, + { 12332, 33406 }, + { 12333, 30861 }, + { 12334, 29233 }, + { 12335, 38552 }, + { 12336, 38797 }, + { 12337, 27688 }, + { 12338, 23433 }, + { 12339, 20474 }, + { 12340, 25353 }, + { 12341, 26263 }, + { 12342, 23736 }, + { 12343, 33018 }, + { 12344, 26696 }, + { 12345, 32942 }, + { 12346, 26114 }, + { 12347, 30414 }, + { 12348, 20985 }, + { 12349, 25942 }, + { 12350, 29100 }, + { 12351, 32753 }, + { 12352, 34948 }, + { 12353, 20658 }, + { 12354, 22885 }, + { 12355, 25034 }, + { 12356, 28595 }, + { 12357, 33453 }, + { 12358, 25420 }, + { 12359, 25170 }, + { 12360, 21485 }, + { 12361, 21543 }, + { 12362, 31494 }, + { 12363, 20843 }, + { 12364, 30116 }, + { 12365, 24052 }, + { 12366, 25300 }, + { 12367, 36299 }, + { 12368, 38774 }, + { 12369, 25226 }, + { 12370, 32793 }, + { 12371, 22365 }, + { 12372, 38712 }, + { 12373, 32610 }, + { 12374, 29240 }, + { 12375, 30333 }, + { 12376, 26575 }, + { 12377, 30334 }, + { 12378, 25670 }, + { 12379, 20336 }, + { 12380, 36133 }, + { 12381, 25308 }, + { 12382, 31255 }, + { 12383, 26001 }, + { 12384, 29677 }, + { 12385, 25644 }, + { 12386, 25203 }, + { 12387, 33324 }, + { 12388, 39041 }, + { 12389, 26495 }, + { 12390, 29256 }, + { 12391, 25198 }, + { 12392, 25292 }, + { 12393, 20276 }, + { 12394, 29923 }, + { 12395, 21322 }, + { 12396, 21150 }, + { 12397, 32458 }, + { 12398, 37030 }, + { 12399, 24110 }, + { 12400, 26758 }, + { 12401, 27036 }, + { 12402, 33152 }, + { 12403, 32465 }, + { 12404, 26834 }, + { 12405, 30917 }, + { 12406, 34444 }, + { 12407, 38225 }, + { 12408, 20621 }, + { 12409, 35876 }, + { 12410, 33502 }, + { 12411, 32990 }, + { 12412, 21253 }, + { 12413, 35090 }, + { 12414, 21093 }, + { 12577, 34180 }, + { 12578, 38649 }, + { 12579, 20445 }, + { 12580, 22561 }, + { 12581, 39281 }, + { 12582, 23453 }, + { 12583, 25265 }, + { 12584, 25253 }, + { 12585, 26292 }, + { 12586, 35961 }, + { 12587, 40077 }, + { 12588, 29190 }, + { 12589, 26479 }, + { 12590, 30865 }, + { 12591, 24754 }, + { 12592, 21329 }, + { 12593, 21271 }, + { 12594, 36744 }, + { 12595, 32972 }, + { 12596, 36125 }, + { 12597, 38049 }, + { 12598, 20493 }, + { 12599, 29384 }, + { 12600, 22791 }, + { 12601, 24811 }, + { 12602, 28953 }, + { 12603, 34987 }, + { 12604, 22868 }, + { 12605, 33519 }, + { 12606, 26412 }, + { 12607, 31528 }, + { 12608, 23849 }, + { 12609, 32503 }, + { 12610, 29997 }, + { 12611, 27893 }, + { 12612, 36454 }, + { 12613, 36856 }, + { 12614, 36924 }, + { 12615, 40763 }, + { 12616, 27604 }, + { 12617, 37145 }, + { 12618, 31508 }, + { 12619, 24444 }, + { 12620, 30887 }, + { 12621, 34006 }, + { 12622, 34109 }, + { 12623, 27605 }, + { 12624, 27609 }, + { 12625, 27606 }, + { 12626, 24065 }, + { 12627, 24199 }, + { 12628, 30201 }, + { 12629, 38381 }, + { 12630, 25949 }, + { 12631, 24330 }, + { 12632, 24517 }, + { 12633, 36767 }, + { 12634, 22721 }, + { 12635, 33218 }, + { 12636, 36991 }, + { 12637, 38491 }, + { 12638, 38829 }, + { 12639, 36793 }, + { 12640, 32534 }, + { 12641, 36140 }, + { 12642, 25153 }, + { 12643, 20415 }, + { 12644, 21464 }, + { 12645, 21342 }, + { 12646, 36776 }, + { 12647, 36777 }, + { 12648, 36779 }, + { 12649, 36941 }, + { 12650, 26631 }, + { 12651, 24426 }, + { 12652, 33176 }, + { 12653, 34920 }, + { 12654, 40150 }, + { 12655, 24971 }, + { 12656, 21035 }, + { 12657, 30250 }, + { 12658, 24428 }, + { 12659, 25996 }, + { 12660, 28626 }, + { 12661, 28392 }, + { 12662, 23486 }, + { 12663, 25672 }, + { 12664, 20853 }, + { 12665, 20912 }, + { 12666, 26564 }, + { 12667, 19993 }, + { 12668, 31177 }, + { 12669, 39292 }, + { 12670, 28851 }, + { 12833, 30149 }, + { 12834, 24182 }, + { 12835, 29627 }, + { 12836, 33760 }, + { 12837, 25773 }, + { 12838, 25320 }, + { 12839, 38069 }, + { 12840, 27874 }, + { 12841, 21338 }, + { 12842, 21187 }, + { 12843, 25615 }, + { 12844, 38082 }, + { 12845, 31636 }, + { 12846, 20271 }, + { 12847, 24091 }, + { 12848, 33334 }, + { 12849, 33046 }, + { 12850, 33162 }, + { 12851, 28196 }, + { 12852, 27850 }, + { 12853, 39539 }, + { 12854, 25429 }, + { 12855, 21340 }, + { 12856, 21754 }, + { 12857, 34917 }, + { 12858, 22496 }, + { 12859, 19981 }, + { 12860, 24067 }, + { 12861, 27493 }, + { 12862, 31807 }, + { 12863, 37096 }, + { 12864, 24598 }, + { 12865, 25830 }, + { 12866, 29468 }, + { 12867, 35009 }, + { 12868, 26448 }, + { 12869, 25165 }, + { 12870, 36130 }, + { 12871, 30572 }, + { 12872, 36393 }, + { 12873, 37319 }, + { 12874, 24425 }, + { 12875, 33756 }, + { 12876, 34081 }, + { 12877, 39184 }, + { 12878, 21442 }, + { 12879, 34453 }, + { 12880, 27531 }, + { 12881, 24813 }, + { 12882, 24808 }, + { 12883, 28799 }, + { 12884, 33485 }, + { 12885, 33329 }, + { 12886, 20179 }, + { 12887, 27815 }, + { 12888, 34255 }, + { 12889, 25805 }, + { 12890, 31961 }, + { 12891, 27133 }, + { 12892, 26361 }, + { 12893, 33609 }, + { 12894, 21397 }, + { 12895, 31574 }, + { 12896, 20391 }, + { 12897, 20876 }, + { 12898, 27979 }, + { 12899, 23618 }, + { 12900, 36461 }, + { 12901, 25554 }, + { 12902, 21449 }, + { 12903, 33580 }, + { 12904, 33590 }, + { 12905, 26597 }, + { 12906, 30900 }, + { 12907, 25661 }, + { 12908, 23519 }, + { 12909, 23700 }, + { 12910, 24046 }, + { 12911, 35815 }, + { 12912, 25286 }, + { 12913, 26612 }, + { 12914, 35962 }, + { 12915, 25600 }, + { 12916, 25530 }, + { 12917, 34633 }, + { 12918, 39307 }, + { 12919, 35863 }, + { 12920, 32544 }, + { 12921, 38130 }, + { 12922, 20135 }, + { 12923, 38416 }, + { 12924, 39076 }, + { 12925, 26124 }, + { 12926, 29462 }, + { 13089, 22330 }, + { 13090, 23581 }, + { 13091, 24120 }, + { 13092, 38271 }, + { 13093, 20607 }, + { 13094, 32928 }, + { 13095, 21378 }, + { 13096, 25950 }, + { 13097, 30021 }, + { 13098, 21809 }, + { 13099, 20513 }, + { 13100, 36229 }, + { 13101, 25220 }, + { 13102, 38046 }, + { 13103, 26397 }, + { 13104, 22066 }, + { 13105, 28526 }, + { 13106, 24034 }, + { 13107, 21557 }, + { 13108, 28818 }, + { 13109, 36710 }, + { 13110, 25199 }, + { 13111, 25764 }, + { 13112, 25507 }, + { 13113, 24443 }, + { 13114, 28552 }, + { 13115, 37108 }, + { 13116, 33251 }, + { 13117, 36784 }, + { 13118, 23576 }, + { 13119, 26216 }, + { 13120, 24561 }, + { 13121, 27785 }, + { 13122, 38472 }, + { 13123, 36225 }, + { 13124, 34924 }, + { 13125, 25745 }, + { 13126, 31216 }, + { 13127, 22478 }, + { 13128, 27225 }, + { 13129, 25104 }, + { 13130, 21576 }, + { 13131, 20056 }, + { 13132, 31243 }, + { 13133, 24809 }, + { 13134, 28548 }, + { 13135, 35802 }, + { 13136, 25215 }, + { 13137, 36894 }, + { 13138, 39563 }, + { 13139, 31204 }, + { 13140, 21507 }, + { 13141, 30196 }, + { 13142, 25345 }, + { 13143, 21273 }, + { 13144, 27744 }, + { 13145, 36831 }, + { 13146, 24347 }, + { 13147, 39536 }, + { 13148, 32827 }, + { 13149, 40831 }, + { 13150, 20360 }, + { 13151, 23610 }, + { 13152, 36196 }, + { 13153, 32709 }, + { 13154, 26021 }, + { 13155, 28861 }, + { 13156, 20805 }, + { 13157, 20914 }, + { 13158, 34411 }, + { 13159, 23815 }, + { 13160, 23456 }, + { 13161, 25277 }, + { 13162, 37228 }, + { 13163, 30068 }, + { 13164, 36364 }, + { 13165, 31264 }, + { 13166, 24833 }, + { 13167, 31609 }, + { 13168, 20167 }, + { 13169, 32504 }, + { 13170, 30597 }, + { 13171, 19985 }, + { 13172, 33261 }, + { 13173, 21021 }, + { 13174, 20986 }, + { 13175, 27249 }, + { 13176, 21416 }, + { 13177, 36487 }, + { 13178, 38148 }, + { 13179, 38607 }, + { 13180, 28353 }, + { 13181, 38500 }, + { 13182, 26970 }, + { 13345, 30784 }, + { 13346, 20648 }, + { 13347, 30679 }, + { 13348, 25616 }, + { 13349, 35302 }, + { 13350, 22788 }, + { 13351, 25571 }, + { 13352, 24029 }, + { 13353, 31359 }, + { 13354, 26941 }, + { 13355, 20256 }, + { 13356, 33337 }, + { 13357, 21912 }, + { 13358, 20018 }, + { 13359, 30126 }, + { 13360, 31383 }, + { 13361, 24162 }, + { 13362, 24202 }, + { 13363, 38383 }, + { 13364, 21019 }, + { 13365, 21561 }, + { 13366, 28810 }, + { 13367, 25462 }, + { 13368, 38180 }, + { 13369, 22402 }, + { 13370, 26149 }, + { 13371, 26943 }, + { 13372, 37255 }, + { 13373, 21767 }, + { 13374, 28147 }, + { 13375, 32431 }, + { 13376, 34850 }, + { 13377, 25139 }, + { 13378, 32496 }, + { 13379, 30133 }, + { 13380, 33576 }, + { 13381, 30913 }, + { 13382, 38604 }, + { 13383, 36766 }, + { 13384, 24904 }, + { 13385, 29943 }, + { 13386, 35789 }, + { 13387, 27492 }, + { 13388, 21050 }, + { 13389, 36176 }, + { 13390, 27425 }, + { 13391, 32874 }, + { 13392, 33905 }, + { 13393, 22257 }, + { 13394, 21254 }, + { 13395, 20174 }, + { 13396, 19995 }, + { 13397, 20945 }, + { 13398, 31895 }, + { 13399, 37259 }, + { 13400, 31751 }, + { 13401, 20419 }, + { 13402, 36479 }, + { 13403, 31713 }, + { 13404, 31388 }, + { 13405, 25703 }, + { 13406, 23828 }, + { 13407, 20652 }, + { 13408, 33030 }, + { 13409, 30209 }, + { 13410, 31929 }, + { 13411, 28140 }, + { 13412, 32736 }, + { 13413, 26449 }, + { 13414, 23384 }, + { 13415, 23544 }, + { 13416, 30923 }, + { 13417, 25774 }, + { 13418, 25619 }, + { 13419, 25514 }, + { 13420, 25387 }, + { 13421, 38169 }, + { 13422, 25645 }, + { 13423, 36798 }, + { 13424, 31572 }, + { 13425, 30249 }, + { 13426, 25171 }, + { 13427, 22823 }, + { 13428, 21574 }, + { 13429, 27513 }, + { 13430, 20643 }, + { 13431, 25140 }, + { 13432, 24102 }, + { 13433, 27526 }, + { 13434, 20195 }, + { 13435, 36151 }, + { 13436, 34955 }, + { 13437, 24453 }, + { 13438, 36910 }, + { 13601, 24608 }, + { 13602, 32829 }, + { 13603, 25285 }, + { 13604, 20025 }, + { 13605, 21333 }, + { 13606, 37112 }, + { 13607, 25528 }, + { 13608, 32966 }, + { 13609, 26086 }, + { 13610, 27694 }, + { 13611, 20294 }, + { 13612, 24814 }, + { 13613, 28129 }, + { 13614, 35806 }, + { 13615, 24377 }, + { 13616, 34507 }, + { 13617, 24403 }, + { 13618, 25377 }, + { 13619, 20826 }, + { 13620, 33633 }, + { 13621, 26723 }, + { 13622, 20992 }, + { 13623, 25443 }, + { 13624, 36424 }, + { 13625, 20498 }, + { 13626, 23707 }, + { 13627, 31095 }, + { 13628, 23548 }, + { 13629, 21040 }, + { 13630, 31291 }, + { 13631, 24764 }, + { 13632, 36947 }, + { 13633, 30423 }, + { 13634, 24503 }, + { 13635, 24471 }, + { 13636, 30340 }, + { 13637, 36460 }, + { 13638, 28783 }, + { 13639, 30331 }, + { 13640, 31561 }, + { 13641, 30634 }, + { 13642, 20979 }, + { 13643, 37011 }, + { 13644, 22564 }, + { 13645, 20302 }, + { 13646, 28404 }, + { 13647, 36842 }, + { 13648, 25932 }, + { 13649, 31515 }, + { 13650, 29380 }, + { 13651, 28068 }, + { 13652, 32735 }, + { 13653, 23265 }, + { 13654, 25269 }, + { 13655, 24213 }, + { 13656, 22320 }, + { 13657, 33922 }, + { 13658, 31532 }, + { 13659, 24093 }, + { 13660, 24351 }, + { 13661, 36882 }, + { 13662, 32532 }, + { 13663, 39072 }, + { 13664, 25474 }, + { 13665, 28359 }, + { 13666, 30872 }, + { 13667, 28857 }, + { 13668, 20856 }, + { 13669, 38747 }, + { 13670, 22443 }, + { 13671, 30005 }, + { 13672, 20291 }, + { 13673, 30008 }, + { 13674, 24215 }, + { 13675, 24806 }, + { 13676, 22880 }, + { 13677, 28096 }, + { 13678, 27583 }, + { 13679, 30857 }, + { 13680, 21500 }, + { 13681, 38613 }, + { 13682, 20939 }, + { 13683, 20993 }, + { 13684, 25481 }, + { 13685, 21514 }, + { 13686, 38035 }, + { 13687, 35843 }, + { 13688, 36300 }, + { 13689, 29241 }, + { 13690, 30879 }, + { 13691, 34678 }, + { 13692, 36845 }, + { 13693, 35853 }, + { 13694, 21472 }, + { 13857, 19969 }, + { 13858, 30447 }, + { 13859, 21486 }, + { 13860, 38025 }, + { 13861, 39030 }, + { 13862, 40718 }, + { 13863, 38189 }, + { 13864, 23450 }, + { 13865, 35746 }, + { 13866, 20002 }, + { 13867, 19996 }, + { 13868, 20908 }, + { 13869, 33891 }, + { 13870, 25026 }, + { 13871, 21160 }, + { 13872, 26635 }, + { 13873, 20375 }, + { 13874, 24683 }, + { 13875, 20923 }, + { 13876, 27934 }, + { 13877, 20828 }, + { 13878, 25238 }, + { 13879, 26007 }, + { 13880, 38497 }, + { 13881, 35910 }, + { 13882, 36887 }, + { 13883, 30168 }, + { 13884, 37117 }, + { 13885, 30563 }, + { 13886, 27602 }, + { 13887, 29322 }, + { 13888, 29420 }, + { 13889, 35835 }, + { 13890, 22581 }, + { 13891, 30585 }, + { 13892, 36172 }, + { 13893, 26460 }, + { 13894, 38208 }, + { 13895, 32922 }, + { 13896, 24230 }, + { 13897, 28193 }, + { 13898, 22930 }, + { 13899, 31471 }, + { 13900, 30701 }, + { 13901, 38203 }, + { 13902, 27573 }, + { 13903, 26029 }, + { 13904, 32526 }, + { 13905, 22534 }, + { 13906, 20817 }, + { 13907, 38431 }, + { 13908, 23545 }, + { 13909, 22697 }, + { 13910, 21544 }, + { 13911, 36466 }, + { 13912, 25958 }, + { 13913, 39039 }, + { 13914, 22244 }, + { 13915, 38045 }, + { 13916, 30462 }, + { 13917, 36929 }, + { 13918, 25479 }, + { 13919, 21702 }, + { 13920, 22810 }, + { 13921, 22842 }, + { 13922, 22427 }, + { 13923, 36530 }, + { 13924, 26421 }, + { 13925, 36346 }, + { 13926, 33333 }, + { 13927, 21057 }, + { 13928, 24816 }, + { 13929, 22549 }, + { 13930, 34558 }, + { 13931, 23784 }, + { 13932, 40517 }, + { 13933, 20420 }, + { 13934, 39069 }, + { 13935, 35769 }, + { 13936, 23077 }, + { 13937, 24694 }, + { 13938, 21380 }, + { 13939, 25212 }, + { 13940, 36943 }, + { 13941, 37122 }, + { 13942, 39295 }, + { 13943, 24681 }, + { 13944, 32780 }, + { 13945, 20799 }, + { 13946, 32819 }, + { 13947, 23572 }, + { 13948, 39285 }, + { 13949, 27953 }, + { 13950, 20108 }, + { 14113, 36144 }, + { 14114, 21457 }, + { 14115, 32602 }, + { 14116, 31567 }, + { 14117, 20240 }, + { 14118, 20047 }, + { 14119, 38400 }, + { 14120, 27861 }, + { 14121, 29648 }, + { 14122, 34281 }, + { 14123, 24070 }, + { 14124, 30058 }, + { 14125, 32763 }, + { 14126, 27146 }, + { 14127, 30718 }, + { 14128, 38034 }, + { 14129, 32321 }, + { 14130, 20961 }, + { 14131, 28902 }, + { 14132, 21453 }, + { 14133, 36820 }, + { 14134, 33539 }, + { 14135, 36137 }, + { 14136, 29359 }, + { 14137, 39277 }, + { 14138, 27867 }, + { 14139, 22346 }, + { 14140, 33459 }, + { 14141, 26041 }, + { 14142, 32938 }, + { 14143, 25151 }, + { 14144, 38450 }, + { 14145, 22952 }, + { 14146, 20223 }, + { 14147, 35775 }, + { 14148, 32442 }, + { 14149, 25918 }, + { 14150, 33778 }, + { 14151, 38750 }, + { 14152, 21857 }, + { 14153, 39134 }, + { 14154, 32933 }, + { 14155, 21290 }, + { 14156, 35837 }, + { 14157, 21536 }, + { 14158, 32954 }, + { 14159, 24223 }, + { 14160, 27832 }, + { 14161, 36153 }, + { 14162, 33452 }, + { 14163, 37210 }, + { 14164, 21545 }, + { 14165, 27675 }, + { 14166, 20998 }, + { 14167, 32439 }, + { 14168, 22367 }, + { 14169, 28954 }, + { 14170, 27774 }, + { 14171, 31881 }, + { 14172, 22859 }, + { 14173, 20221 }, + { 14174, 24575 }, + { 14175, 24868 }, + { 14176, 31914 }, + { 14177, 20016 }, + { 14178, 23553 }, + { 14179, 26539 }, + { 14180, 34562 }, + { 14181, 23792 }, + { 14182, 38155 }, + { 14183, 39118 }, + { 14184, 30127 }, + { 14185, 28925 }, + { 14186, 36898 }, + { 14187, 20911 }, + { 14188, 32541 }, + { 14189, 35773 }, + { 14190, 22857 }, + { 14191, 20964 }, + { 14192, 20315 }, + { 14193, 21542 }, + { 14194, 22827 }, + { 14195, 25975 }, + { 14196, 32932 }, + { 14197, 23413 }, + { 14198, 25206 }, + { 14199, 25282 }, + { 14200, 36752 }, + { 14201, 24133 }, + { 14202, 27679 }, + { 14203, 31526 }, + { 14204, 20239 }, + { 14205, 20440 }, + { 14206, 26381 }, + { 14369, 28014 }, + { 14370, 28074 }, + { 14371, 31119 }, + { 14372, 34993 }, + { 14373, 24343 }, + { 14374, 29995 }, + { 14375, 25242 }, + { 14376, 36741 }, + { 14377, 20463 }, + { 14378, 37340 }, + { 14379, 26023 }, + { 14380, 33071 }, + { 14381, 33105 }, + { 14382, 24220 }, + { 14383, 33104 }, + { 14384, 36212 }, + { 14385, 21103 }, + { 14386, 35206 }, + { 14387, 36171 }, + { 14388, 22797 }, + { 14389, 20613 }, + { 14390, 20184 }, + { 14391, 38428 }, + { 14392, 29238 }, + { 14393, 33145 }, + { 14394, 36127 }, + { 14395, 23500 }, + { 14396, 35747 }, + { 14397, 38468 }, + { 14398, 22919 }, + { 14399, 32538 }, + { 14400, 21648 }, + { 14401, 22134 }, + { 14402, 22030 }, + { 14403, 35813 }, + { 14404, 25913 }, + { 14405, 27010 }, + { 14406, 38041 }, + { 14407, 30422 }, + { 14408, 28297 }, + { 14409, 24178 }, + { 14410, 29976 }, + { 14411, 26438 }, + { 14412, 26577 }, + { 14413, 31487 }, + { 14414, 32925 }, + { 14415, 36214 }, + { 14416, 24863 }, + { 14417, 31174 }, + { 14418, 25954 }, + { 14419, 36195 }, + { 14420, 20872 }, + { 14421, 21018 }, + { 14422, 38050 }, + { 14423, 32568 }, + { 14424, 32923 }, + { 14425, 32434 }, + { 14426, 23703 }, + { 14427, 28207 }, + { 14428, 26464 }, + { 14429, 31705 }, + { 14430, 30347 }, + { 14431, 39640 }, + { 14432, 33167 }, + { 14433, 32660 }, + { 14434, 31957 }, + { 14435, 25630 }, + { 14436, 38224 }, + { 14437, 31295 }, + { 14438, 21578 }, + { 14439, 21733 }, + { 14440, 27468 }, + { 14441, 25601 }, + { 14442, 25096 }, + { 14443, 40509 }, + { 14444, 33011 }, + { 14445, 30105 }, + { 14446, 21106 }, + { 14447, 38761 }, + { 14448, 33883 }, + { 14449, 26684 }, + { 14450, 34532 }, + { 14451, 38401 }, + { 14452, 38548 }, + { 14453, 38124 }, + { 14454, 20010 }, + { 14455, 21508 }, + { 14456, 32473 }, + { 14457, 26681 }, + { 14458, 36319 }, + { 14459, 32789 }, + { 14460, 26356 }, + { 14461, 24218 }, + { 14462, 32697 }, + { 14625, 22466 }, + { 14626, 32831 }, + { 14627, 26775 }, + { 14628, 24037 }, + { 14629, 25915 }, + { 14630, 21151 }, + { 14631, 24685 }, + { 14632, 40858 }, + { 14633, 20379 }, + { 14634, 36524 }, + { 14635, 20844 }, + { 14636, 23467 }, + { 14637, 24339 }, + { 14638, 24041 }, + { 14639, 27742 }, + { 14640, 25329 }, + { 14641, 36129 }, + { 14642, 20849 }, + { 14643, 38057 }, + { 14644, 21246 }, + { 14645, 27807 }, + { 14646, 33503 }, + { 14647, 29399 }, + { 14648, 22434 }, + { 14649, 26500 }, + { 14650, 36141 }, + { 14651, 22815 }, + { 14652, 36764 }, + { 14653, 33735 }, + { 14654, 21653 }, + { 14655, 31629 }, + { 14656, 20272 }, + { 14657, 27837 }, + { 14658, 23396 }, + { 14659, 22993 }, + { 14660, 40723 }, + { 14661, 21476 }, + { 14662, 34506 }, + { 14663, 39592 }, + { 14664, 35895 }, + { 14665, 32929 }, + { 14666, 25925 }, + { 14667, 39038 }, + { 14668, 22266 }, + { 14669, 38599 }, + { 14670, 21038 }, + { 14671, 29916 }, + { 14672, 21072 }, + { 14673, 23521 }, + { 14674, 25346 }, + { 14675, 35074 }, + { 14676, 20054 }, + { 14677, 25296 }, + { 14678, 24618 }, + { 14679, 26874 }, + { 14680, 20851 }, + { 14681, 23448 }, + { 14682, 20896 }, + { 14683, 35266 }, + { 14684, 31649 }, + { 14685, 39302 }, + { 14686, 32592 }, + { 14687, 24815 }, + { 14688, 28748 }, + { 14689, 36143 }, + { 14690, 20809 }, + { 14691, 24191 }, + { 14692, 36891 }, + { 14693, 29808 }, + { 14694, 35268 }, + { 14695, 22317 }, + { 14696, 30789 }, + { 14697, 24402 }, + { 14698, 40863 }, + { 14699, 38394 }, + { 14700, 36712 }, + { 14701, 39740 }, + { 14702, 35809 }, + { 14703, 30328 }, + { 14704, 26690 }, + { 14705, 26588 }, + { 14706, 36330 }, + { 14707, 36149 }, + { 14708, 21053 }, + { 14709, 36746 }, + { 14710, 28378 }, + { 14711, 26829 }, + { 14712, 38149 }, + { 14713, 37101 }, + { 14714, 22269 }, + { 14715, 26524 }, + { 14716, 35065 }, + { 14717, 36807 }, + { 14718, 21704 }, + { 14881, 39608 }, + { 14882, 23401 }, + { 14883, 28023 }, + { 14884, 27686 }, + { 14885, 20133 }, + { 14886, 23475 }, + { 14887, 39559 }, + { 14888, 37219 }, + { 14889, 25000 }, + { 14890, 37039 }, + { 14891, 38889 }, + { 14892, 21547 }, + { 14893, 28085 }, + { 14894, 23506 }, + { 14895, 20989 }, + { 14896, 21898 }, + { 14897, 32597 }, + { 14898, 32752 }, + { 14899, 25788 }, + { 14900, 25421 }, + { 14901, 26097 }, + { 14902, 25022 }, + { 14903, 24717 }, + { 14904, 28938 }, + { 14905, 27735 }, + { 14906, 27721 }, + { 14907, 22831 }, + { 14908, 26477 }, + { 14909, 33322 }, + { 14910, 22741 }, + { 14911, 22158 }, + { 14912, 35946 }, + { 14913, 27627 }, + { 14914, 37085 }, + { 14915, 22909 }, + { 14916, 32791 }, + { 14917, 21495 }, + { 14918, 28009 }, + { 14919, 21621 }, + { 14920, 21917 }, + { 14921, 33655 }, + { 14922, 33743 }, + { 14923, 26680 }, + { 14924, 31166 }, + { 14925, 21644 }, + { 14926, 20309 }, + { 14927, 21512 }, + { 14928, 30418 }, + { 14929, 35977 }, + { 14930, 38402 }, + { 14931, 27827 }, + { 14932, 28088 }, + { 14933, 36203 }, + { 14934, 35088 }, + { 14935, 40548 }, + { 14936, 36154 }, + { 14937, 22079 }, + { 14938, 40657 }, + { 14939, 30165 }, + { 14940, 24456 }, + { 14941, 29408 }, + { 14942, 24680 }, + { 14943, 21756 }, + { 14944, 20136 }, + { 14945, 27178 }, + { 14946, 34913 }, + { 14947, 24658 }, + { 14948, 36720 }, + { 14949, 21700 }, + { 14950, 28888 }, + { 14951, 34425 }, + { 14952, 40511 }, + { 14953, 27946 }, + { 14954, 23439 }, + { 14955, 24344 }, + { 14956, 32418 }, + { 14957, 21897 }, + { 14958, 20399 }, + { 14959, 29492 }, + { 14960, 21564 }, + { 14961, 21402 }, + { 14962, 20505 }, + { 14963, 21518 }, + { 14964, 21628 }, + { 14965, 20046 }, + { 14966, 24573 }, + { 14967, 29786 }, + { 14968, 22774 }, + { 14969, 33899 }, + { 14970, 32993 }, + { 14971, 34676 }, + { 14972, 29392 }, + { 14973, 31946 }, + { 14974, 28246 }, + { 15137, 24359 }, + { 15138, 34382 }, + { 15139, 21804 }, + { 15140, 25252 }, + { 15141, 20114 }, + { 15142, 27818 }, + { 15143, 25143 }, + { 15144, 33457 }, + { 15145, 21719 }, + { 15146, 21326 }, + { 15147, 29502 }, + { 15148, 28369 }, + { 15149, 30011 }, + { 15150, 21010 }, + { 15151, 21270 }, + { 15152, 35805 }, + { 15153, 27088 }, + { 15154, 24458 }, + { 15155, 24576 }, + { 15156, 28142 }, + { 15157, 22351 }, + { 15158, 27426 }, + { 15159, 29615 }, + { 15160, 26707 }, + { 15161, 36824 }, + { 15162, 32531 }, + { 15163, 25442 }, + { 15164, 24739 }, + { 15165, 21796 }, + { 15166, 30186 }, + { 15167, 35938 }, + { 15168, 28949 }, + { 15169, 28067 }, + { 15170, 23462 }, + { 15171, 24187 }, + { 15172, 33618 }, + { 15173, 24908 }, + { 15174, 40644 }, + { 15175, 30970 }, + { 15176, 34647 }, + { 15177, 31783 }, + { 15178, 30343 }, + { 15179, 20976 }, + { 15180, 24822 }, + { 15181, 29004 }, + { 15182, 26179 }, + { 15183, 24140 }, + { 15184, 24653 }, + { 15185, 35854 }, + { 15186, 28784 }, + { 15187, 25381 }, + { 15188, 36745 }, + { 15189, 24509 }, + { 15190, 24674 }, + { 15191, 34516 }, + { 15192, 22238 }, + { 15193, 27585 }, + { 15194, 24724 }, + { 15195, 24935 }, + { 15196, 21321 }, + { 15197, 24800 }, + { 15198, 26214 }, + { 15199, 36159 }, + { 15200, 31229 }, + { 15201, 20250 }, + { 15202, 28905 }, + { 15203, 27719 }, + { 15204, 35763 }, + { 15205, 35826 }, + { 15206, 32472 }, + { 15207, 33636 }, + { 15208, 26127 }, + { 15209, 23130 }, + { 15210, 39746 }, + { 15211, 27985 }, + { 15212, 28151 }, + { 15213, 35905 }, + { 15214, 27963 }, + { 15215, 20249 }, + { 15216, 28779 }, + { 15217, 33719 }, + { 15218, 25110 }, + { 15219, 24785 }, + { 15220, 38669 }, + { 15221, 36135 }, + { 15222, 31096 }, + { 15223, 20987 }, + { 15224, 22334 }, + { 15225, 22522 }, + { 15226, 26426 }, + { 15227, 30072 }, + { 15228, 31293 }, + { 15229, 31215 }, + { 15230, 31637 }, + { 15393, 32908 }, + { 15394, 39269 }, + { 15395, 36857 }, + { 15396, 28608 }, + { 15397, 35749 }, + { 15398, 40481 }, + { 15399, 23020 }, + { 15400, 32489 }, + { 15401, 32521 }, + { 15402, 21513 }, + { 15403, 26497 }, + { 15404, 26840 }, + { 15405, 36753 }, + { 15406, 31821 }, + { 15407, 38598 }, + { 15408, 21450 }, + { 15409, 24613 }, + { 15410, 30142 }, + { 15411, 27762 }, + { 15412, 21363 }, + { 15413, 23241 }, + { 15414, 32423 }, + { 15415, 25380 }, + { 15416, 20960 }, + { 15417, 33034 }, + { 15418, 24049 }, + { 15419, 34015 }, + { 15420, 25216 }, + { 15421, 20864 }, + { 15422, 23395 }, + { 15423, 20238 }, + { 15424, 31085 }, + { 15425, 21058 }, + { 15426, 24760 }, + { 15427, 27982 }, + { 15428, 23492 }, + { 15429, 23490 }, + { 15430, 35745 }, + { 15431, 35760 }, + { 15432, 26082 }, + { 15433, 24524 }, + { 15434, 38469 }, + { 15435, 22931 }, + { 15436, 32487 }, + { 15437, 32426 }, + { 15438, 22025 }, + { 15439, 26551 }, + { 15440, 22841 }, + { 15441, 20339 }, + { 15442, 23478 }, + { 15443, 21152 }, + { 15444, 33626 }, + { 15445, 39050 }, + { 15446, 36158 }, + { 15447, 30002 }, + { 15448, 38078 }, + { 15449, 20551 }, + { 15450, 31292 }, + { 15451, 20215 }, + { 15452, 26550 }, + { 15453, 39550 }, + { 15454, 23233 }, + { 15455, 27516 }, + { 15456, 30417 }, + { 15457, 22362 }, + { 15458, 23574 }, + { 15459, 31546 }, + { 15460, 38388 }, + { 15461, 29006 }, + { 15462, 20860 }, + { 15463, 32937 }, + { 15464, 33392 }, + { 15465, 22904 }, + { 15466, 32516 }, + { 15467, 33575 }, + { 15468, 26816 }, + { 15469, 26604 }, + { 15470, 30897 }, + { 15471, 30839 }, + { 15472, 25315 }, + { 15473, 25441 }, + { 15474, 31616 }, + { 15475, 20461 }, + { 15476, 21098 }, + { 15477, 20943 }, + { 15478, 33616 }, + { 15479, 27099 }, + { 15480, 37492 }, + { 15481, 36341 }, + { 15482, 36145 }, + { 15483, 35265 }, + { 15484, 38190 }, + { 15485, 31661 }, + { 15486, 20214 }, + { 15649, 20581 }, + { 15650, 33328 }, + { 15651, 21073 }, + { 15652, 39279 }, + { 15653, 28176 }, + { 15654, 28293 }, + { 15655, 28071 }, + { 15656, 24314 }, + { 15657, 20725 }, + { 15658, 23004 }, + { 15659, 23558 }, + { 15660, 27974 }, + { 15661, 27743 }, + { 15662, 30086 }, + { 15663, 33931 }, + { 15664, 26728 }, + { 15665, 22870 }, + { 15666, 35762 }, + { 15667, 21280 }, + { 15668, 37233 }, + { 15669, 38477 }, + { 15670, 34121 }, + { 15671, 26898 }, + { 15672, 30977 }, + { 15673, 28966 }, + { 15674, 33014 }, + { 15675, 20132 }, + { 15676, 37066 }, + { 15677, 27975 }, + { 15678, 39556 }, + { 15679, 23047 }, + { 15680, 22204 }, + { 15681, 25605 }, + { 15682, 38128 }, + { 15683, 30699 }, + { 15684, 20389 }, + { 15685, 33050 }, + { 15686, 29409 }, + { 15687, 35282 }, + { 15688, 39290 }, + { 15689, 32564 }, + { 15690, 32478 }, + { 15691, 21119 }, + { 15692, 25945 }, + { 15693, 37237 }, + { 15694, 36735 }, + { 15695, 36739 }, + { 15696, 21483 }, + { 15697, 31382 }, + { 15698, 25581 }, + { 15699, 25509 }, + { 15700, 30342 }, + { 15701, 31224 }, + { 15702, 34903 }, + { 15703, 38454 }, + { 15704, 25130 }, + { 15705, 21163 }, + { 15706, 33410 }, + { 15707, 26708 }, + { 15708, 26480 }, + { 15709, 25463 }, + { 15710, 30571 }, + { 15711, 31469 }, + { 15712, 27905 }, + { 15713, 32467 }, + { 15714, 35299 }, + { 15715, 22992 }, + { 15716, 25106 }, + { 15717, 34249 }, + { 15718, 33445 }, + { 15719, 30028 }, + { 15720, 20511 }, + { 15721, 20171 }, + { 15722, 30117 }, + { 15723, 35819 }, + { 15724, 23626 }, + { 15725, 24062 }, + { 15726, 31563 }, + { 15727, 26020 }, + { 15728, 37329 }, + { 15729, 20170 }, + { 15730, 27941 }, + { 15731, 35167 }, + { 15732, 32039 }, + { 15733, 38182 }, + { 15734, 20165 }, + { 15735, 35880 }, + { 15736, 36827 }, + { 15737, 38771 }, + { 15738, 26187 }, + { 15739, 31105 }, + { 15740, 36817 }, + { 15741, 28908 }, + { 15742, 28024 }, + { 15905, 23613 }, + { 15906, 21170 }, + { 15907, 33606 }, + { 15908, 20834 }, + { 15909, 33550 }, + { 15910, 30555 }, + { 15911, 26230 }, + { 15912, 40120 }, + { 15913, 20140 }, + { 15914, 24778 }, + { 15915, 31934 }, + { 15916, 31923 }, + { 15917, 32463 }, + { 15918, 20117 }, + { 15919, 35686 }, + { 15920, 26223 }, + { 15921, 39048 }, + { 15922, 38745 }, + { 15923, 22659 }, + { 15924, 25964 }, + { 15925, 38236 }, + { 15926, 24452 }, + { 15927, 30153 }, + { 15928, 38742 }, + { 15929, 31455 }, + { 15930, 31454 }, + { 15931, 20928 }, + { 15932, 28847 }, + { 15933, 31384 }, + { 15934, 25578 }, + { 15935, 31350 }, + { 15936, 32416 }, + { 15937, 29590 }, + { 15938, 38893 }, + { 15939, 20037 }, + { 15940, 28792 }, + { 15941, 20061 }, + { 15942, 37202 }, + { 15943, 21417 }, + { 15944, 25937 }, + { 15945, 26087 }, + { 15946, 33276 }, + { 15947, 33285 }, + { 15948, 21646 }, + { 15949, 23601 }, + { 15950, 30106 }, + { 15951, 38816 }, + { 15952, 25304 }, + { 15953, 29401 }, + { 15954, 30141 }, + { 15955, 23621 }, + { 15956, 39545 }, + { 15957, 33738 }, + { 15958, 23616 }, + { 15959, 21632 }, + { 15960, 30697 }, + { 15961, 20030 }, + { 15962, 27822 }, + { 15963, 32858 }, + { 15964, 25298 }, + { 15965, 25454 }, + { 15966, 24040 }, + { 15967, 20855 }, + { 15968, 36317 }, + { 15969, 36382 }, + { 15970, 38191 }, + { 15971, 20465 }, + { 15972, 21477 }, + { 15973, 24807 }, + { 15974, 28844 }, + { 15975, 21095 }, + { 15976, 25424 }, + { 15977, 40515 }, + { 15978, 23071 }, + { 15979, 20518 }, + { 15980, 30519 }, + { 15981, 21367 }, + { 15982, 32482 }, + { 15983, 25733 }, + { 15984, 25899 }, + { 15985, 25225 }, + { 15986, 25496 }, + { 15987, 20500 }, + { 15988, 29237 }, + { 15989, 35273 }, + { 15990, 20915 }, + { 15991, 35776 }, + { 15992, 32477 }, + { 15993, 22343 }, + { 15994, 33740 }, + { 15995, 38055 }, + { 15996, 20891 }, + { 15997, 21531 }, + { 15998, 23803 }, + { 16161, 20426 }, + { 16162, 31459 }, + { 16163, 27994 }, + { 16164, 37089 }, + { 16165, 39567 }, + { 16166, 21888 }, + { 16167, 21654 }, + { 16168, 21345 }, + { 16169, 21679 }, + { 16170, 24320 }, + { 16171, 25577 }, + { 16172, 26999 }, + { 16173, 20975 }, + { 16174, 24936 }, + { 16175, 21002 }, + { 16176, 22570 }, + { 16177, 21208 }, + { 16178, 22350 }, + { 16179, 30733 }, + { 16180, 30475 }, + { 16181, 24247 }, + { 16182, 24951 }, + { 16183, 31968 }, + { 16184, 25179 }, + { 16185, 25239 }, + { 16186, 20130 }, + { 16187, 28821 }, + { 16188, 32771 }, + { 16189, 25335 }, + { 16190, 28900 }, + { 16191, 38752 }, + { 16192, 22391 }, + { 16193, 33499 }, + { 16194, 26607 }, + { 16195, 26869 }, + { 16196, 30933 }, + { 16197, 39063 }, + { 16198, 31185 }, + { 16199, 22771 }, + { 16200, 21683 }, + { 16201, 21487 }, + { 16202, 28212 }, + { 16203, 20811 }, + { 16204, 21051 }, + { 16205, 23458 }, + { 16206, 35838 }, + { 16207, 32943 }, + { 16208, 21827 }, + { 16209, 22438 }, + { 16210, 24691 }, + { 16211, 22353 }, + { 16212, 21549 }, + { 16213, 31354 }, + { 16214, 24656 }, + { 16215, 23380 }, + { 16216, 25511 }, + { 16217, 25248 }, + { 16218, 21475 }, + { 16219, 25187 }, + { 16220, 23495 }, + { 16221, 26543 }, + { 16222, 21741 }, + { 16223, 31391 }, + { 16224, 33510 }, + { 16225, 37239 }, + { 16226, 24211 }, + { 16227, 35044 }, + { 16228, 22840 }, + { 16229, 22446 }, + { 16230, 25358 }, + { 16231, 36328 }, + { 16232, 33007 }, + { 16233, 22359 }, + { 16234, 31607 }, + { 16235, 20393 }, + { 16236, 24555 }, + { 16237, 23485 }, + { 16238, 27454 }, + { 16239, 21281 }, + { 16240, 31568 }, + { 16241, 29378 }, + { 16242, 26694 }, + { 16243, 30719 }, + { 16244, 30518 }, + { 16245, 26103 }, + { 16246, 20917 }, + { 16247, 20111 }, + { 16248, 30420 }, + { 16249, 23743 }, + { 16250, 31397 }, + { 16251, 33909 }, + { 16252, 22862 }, + { 16253, 39745 }, + { 16254, 20608 }, + { 16417, 39304 }, + { 16418, 24871 }, + { 16419, 28291 }, + { 16420, 22372 }, + { 16421, 26118 }, + { 16422, 25414 }, + { 16423, 22256 }, + { 16424, 25324 }, + { 16425, 25193 }, + { 16426, 24275 }, + { 16427, 38420 }, + { 16428, 22403 }, + { 16429, 25289 }, + { 16430, 21895 }, + { 16431, 34593 }, + { 16432, 33098 }, + { 16433, 36771 }, + { 16434, 21862 }, + { 16435, 33713 }, + { 16436, 26469 }, + { 16437, 36182 }, + { 16438, 34013 }, + { 16439, 23146 }, + { 16440, 26639 }, + { 16441, 25318 }, + { 16442, 31726 }, + { 16443, 38417 }, + { 16444, 20848 }, + { 16445, 28572 }, + { 16446, 35888 }, + { 16447, 25597 }, + { 16448, 35272 }, + { 16449, 25042 }, + { 16450, 32518 }, + { 16451, 28866 }, + { 16452, 28389 }, + { 16453, 29701 }, + { 16454, 27028 }, + { 16455, 29436 }, + { 16456, 24266 }, + { 16457, 37070 }, + { 16458, 26391 }, + { 16459, 28010 }, + { 16460, 25438 }, + { 16461, 21171 }, + { 16462, 29282 }, + { 16463, 32769 }, + { 16464, 20332 }, + { 16465, 23013 }, + { 16466, 37226 }, + { 16467, 28889 }, + { 16468, 28061 }, + { 16469, 21202 }, + { 16470, 20048 }, + { 16471, 38647 }, + { 16472, 38253 }, + { 16473, 34174 }, + { 16474, 30922 }, + { 16475, 32047 }, + { 16476, 20769 }, + { 16477, 22418 }, + { 16478, 25794 }, + { 16479, 32907 }, + { 16480, 31867 }, + { 16481, 27882 }, + { 16482, 26865 }, + { 16483, 26974 }, + { 16484, 20919 }, + { 16485, 21400 }, + { 16486, 26792 }, + { 16487, 29313 }, + { 16488, 40654 }, + { 16489, 31729 }, + { 16490, 29432 }, + { 16491, 31163 }, + { 16492, 28435 }, + { 16493, 29702 }, + { 16494, 26446 }, + { 16495, 37324 }, + { 16496, 40100 }, + { 16497, 31036 }, + { 16498, 33673 }, + { 16499, 33620 }, + { 16500, 21519 }, + { 16501, 26647 }, + { 16502, 20029 }, + { 16503, 21385 }, + { 16504, 21169 }, + { 16505, 30782 }, + { 16506, 21382 }, + { 16507, 21033 }, + { 16508, 20616 }, + { 16509, 20363 }, + { 16510, 20432 }, + { 16673, 30178 }, + { 16674, 31435 }, + { 16675, 31890 }, + { 16676, 27813 }, + { 16677, 38582 }, + { 16678, 21147 }, + { 16679, 29827 }, + { 16680, 21737 }, + { 16681, 20457 }, + { 16682, 32852 }, + { 16683, 33714 }, + { 16684, 36830 }, + { 16685, 38256 }, + { 16686, 24265 }, + { 16687, 24604 }, + { 16688, 28063 }, + { 16689, 24088 }, + { 16690, 25947 }, + { 16691, 33080 }, + { 16692, 38142 }, + { 16693, 24651 }, + { 16694, 28860 }, + { 16695, 32451 }, + { 16696, 31918 }, + { 16697, 20937 }, + { 16698, 26753 }, + { 16699, 31921 }, + { 16700, 33391 }, + { 16701, 20004 }, + { 16702, 36742 }, + { 16703, 37327 }, + { 16704, 26238 }, + { 16705, 20142 }, + { 16706, 35845 }, + { 16707, 25769 }, + { 16708, 32842 }, + { 16709, 20698 }, + { 16710, 30103 }, + { 16711, 29134 }, + { 16712, 23525 }, + { 16713, 36797 }, + { 16714, 28518 }, + { 16715, 20102 }, + { 16716, 25730 }, + { 16717, 38243 }, + { 16718, 24278 }, + { 16719, 26009 }, + { 16720, 21015 }, + { 16721, 35010 }, + { 16722, 28872 }, + { 16723, 21155 }, + { 16724, 29454 }, + { 16725, 29747 }, + { 16726, 26519 }, + { 16727, 30967 }, + { 16728, 38678 }, + { 16729, 20020 }, + { 16730, 37051 }, + { 16731, 40158 }, + { 16732, 28107 }, + { 16733, 20955 }, + { 16734, 36161 }, + { 16735, 21533 }, + { 16736, 25294 }, + { 16737, 29618 }, + { 16738, 33777 }, + { 16739, 38646 }, + { 16740, 40836 }, + { 16741, 38083 }, + { 16742, 20278 }, + { 16743, 32666 }, + { 16744, 20940 }, + { 16745, 28789 }, + { 16746, 38517 }, + { 16747, 23725 }, + { 16748, 39046 }, + { 16749, 21478 }, + { 16750, 20196 }, + { 16751, 28316 }, + { 16752, 29705 }, + { 16753, 27060 }, + { 16754, 30827 }, + { 16755, 39311 }, + { 16756, 30041 }, + { 16757, 21016 }, + { 16758, 30244 }, + { 16759, 27969 }, + { 16760, 26611 }, + { 16761, 20845 }, + { 16762, 40857 }, + { 16763, 32843 }, + { 16764, 21657 }, + { 16765, 31548 }, + { 16766, 31423 }, + { 16929, 38534 }, + { 16930, 22404 }, + { 16931, 25314 }, + { 16932, 38471 }, + { 16933, 27004 }, + { 16934, 23044 }, + { 16935, 25602 }, + { 16936, 31699 }, + { 16937, 28431 }, + { 16938, 38475 }, + { 16939, 33446 }, + { 16940, 21346 }, + { 16941, 39045 }, + { 16942, 24208 }, + { 16943, 28809 }, + { 16944, 25523 }, + { 16945, 21348 }, + { 16946, 34383 }, + { 16947, 40065 }, + { 16948, 40595 }, + { 16949, 30860 }, + { 16950, 38706 }, + { 16951, 36335 }, + { 16952, 36162 }, + { 16953, 40575 }, + { 16954, 28510 }, + { 16955, 31108 }, + { 16956, 24405 }, + { 16957, 38470 }, + { 16958, 25134 }, + { 16959, 39540 }, + { 16960, 21525 }, + { 16961, 38109 }, + { 16962, 20387 }, + { 16963, 26053 }, + { 16964, 23653 }, + { 16965, 23649 }, + { 16966, 32533 }, + { 16967, 34385 }, + { 16968, 27695 }, + { 16969, 24459 }, + { 16970, 29575 }, + { 16971, 28388 }, + { 16972, 32511 }, + { 16973, 23782 }, + { 16974, 25371 }, + { 16975, 23402 }, + { 16976, 28390 }, + { 16977, 21365 }, + { 16978, 20081 }, + { 16979, 25504 }, + { 16980, 30053 }, + { 16981, 25249 }, + { 16982, 36718 }, + { 16983, 20262 }, + { 16984, 20177 }, + { 16985, 27814 }, + { 16986, 32438 }, + { 16987, 35770 }, + { 16988, 33821 }, + { 16989, 34746 }, + { 16990, 32599 }, + { 16991, 36923 }, + { 16992, 38179 }, + { 16993, 31657 }, + { 16994, 39585 }, + { 16995, 35064 }, + { 16996, 33853 }, + { 16997, 27931 }, + { 16998, 39558 }, + { 16999, 32476 }, + { 17000, 22920 }, + { 17001, 40635 }, + { 17002, 29595 }, + { 17003, 30721 }, + { 17004, 34434 }, + { 17005, 39532 }, + { 17006, 39554 }, + { 17007, 22043 }, + { 17008, 21527 }, + { 17009, 22475 }, + { 17010, 20080 }, + { 17011, 40614 }, + { 17012, 21334 }, + { 17013, 36808 }, + { 17014, 33033 }, + { 17015, 30610 }, + { 17016, 39314 }, + { 17017, 34542 }, + { 17018, 28385 }, + { 17019, 34067 }, + { 17020, 26364 }, + { 17021, 24930 }, + { 17022, 28459 }, + { 17185, 35881 }, + { 17186, 33426 }, + { 17187, 33579 }, + { 17188, 30450 }, + { 17189, 27667 }, + { 17190, 24537 }, + { 17191, 33725 }, + { 17192, 29483 }, + { 17193, 33541 }, + { 17194, 38170 }, + { 17195, 27611 }, + { 17196, 30683 }, + { 17197, 38086 }, + { 17198, 21359 }, + { 17199, 33538 }, + { 17200, 20882 }, + { 17201, 24125 }, + { 17202, 35980 }, + { 17203, 36152 }, + { 17204, 20040 }, + { 17205, 29611 }, + { 17206, 26522 }, + { 17207, 26757 }, + { 17208, 37238 }, + { 17209, 38665 }, + { 17210, 29028 }, + { 17211, 27809 }, + { 17212, 30473 }, + { 17213, 23186 }, + { 17214, 38209 }, + { 17215, 27599 }, + { 17216, 32654 }, + { 17217, 26151 }, + { 17218, 23504 }, + { 17219, 22969 }, + { 17220, 23194 }, + { 17221, 38376 }, + { 17222, 38391 }, + { 17223, 20204 }, + { 17224, 33804 }, + { 17225, 33945 }, + { 17226, 27308 }, + { 17227, 30431 }, + { 17228, 38192 }, + { 17229, 29467 }, + { 17230, 26790 }, + { 17231, 23391 }, + { 17232, 30511 }, + { 17233, 37274 }, + { 17234, 38753 }, + { 17235, 31964 }, + { 17236, 36855 }, + { 17237, 35868 }, + { 17238, 24357 }, + { 17239, 31859 }, + { 17240, 31192 }, + { 17241, 35269 }, + { 17242, 27852 }, + { 17243, 34588 }, + { 17244, 23494 }, + { 17245, 24130 }, + { 17246, 26825 }, + { 17247, 30496 }, + { 17248, 32501 }, + { 17249, 20885 }, + { 17250, 20813 }, + { 17251, 21193 }, + { 17252, 23081 }, + { 17253, 32517 }, + { 17254, 38754 }, + { 17255, 33495 }, + { 17256, 25551 }, + { 17257, 30596 }, + { 17258, 34256 }, + { 17259, 31186 }, + { 17260, 28218 }, + { 17261, 24217 }, + { 17262, 22937 }, + { 17263, 34065 }, + { 17264, 28781 }, + { 17265, 27665 }, + { 17266, 25279 }, + { 17267, 30399 }, + { 17268, 25935 }, + { 17269, 24751 }, + { 17270, 38397 }, + { 17271, 26126 }, + { 17272, 34719 }, + { 17273, 40483 }, + { 17274, 38125 }, + { 17275, 21517 }, + { 17276, 21629 }, + { 17277, 35884 }, + { 17278, 25720 }, + { 17441, 25721 }, + { 17442, 34321 }, + { 17443, 27169 }, + { 17444, 33180 }, + { 17445, 30952 }, + { 17446, 25705 }, + { 17447, 39764 }, + { 17448, 25273 }, + { 17449, 26411 }, + { 17450, 33707 }, + { 17451, 22696 }, + { 17452, 40664 }, + { 17453, 27819 }, + { 17454, 28448 }, + { 17455, 23518 }, + { 17456, 38476 }, + { 17457, 35851 }, + { 17458, 29279 }, + { 17459, 26576 }, + { 17460, 25287 }, + { 17461, 29281 }, + { 17462, 20137 }, + { 17463, 22982 }, + { 17464, 27597 }, + { 17465, 22675 }, + { 17466, 26286 }, + { 17467, 24149 }, + { 17468, 21215 }, + { 17469, 24917 }, + { 17470, 26408 }, + { 17471, 30446 }, + { 17472, 30566 }, + { 17473, 29287 }, + { 17474, 31302 }, + { 17475, 25343 }, + { 17476, 21738 }, + { 17477, 21584 }, + { 17478, 38048 }, + { 17479, 37027 }, + { 17480, 23068 }, + { 17481, 32435 }, + { 17482, 27670 }, + { 17483, 20035 }, + { 17484, 22902 }, + { 17485, 32784 }, + { 17486, 22856 }, + { 17487, 21335 }, + { 17488, 30007 }, + { 17489, 38590 }, + { 17490, 22218 }, + { 17491, 25376 }, + { 17492, 33041 }, + { 17493, 24700 }, + { 17494, 38393 }, + { 17495, 28118 }, + { 17496, 21602 }, + { 17497, 39297 }, + { 17498, 20869 }, + { 17499, 23273 }, + { 17500, 33021 }, + { 17501, 22958 }, + { 17502, 38675 }, + { 17503, 20522 }, + { 17504, 27877 }, + { 17505, 23612 }, + { 17506, 25311 }, + { 17507, 20320 }, + { 17508, 21311 }, + { 17509, 33147 }, + { 17510, 36870 }, + { 17511, 28346 }, + { 17512, 34091 }, + { 17513, 25288 }, + { 17514, 24180 }, + { 17515, 30910 }, + { 17516, 25781 }, + { 17517, 25467 }, + { 17518, 24565 }, + { 17519, 23064 }, + { 17520, 37247 }, + { 17521, 40479 }, + { 17522, 23615 }, + { 17523, 25423 }, + { 17524, 32834 }, + { 17525, 23421 }, + { 17526, 21870 }, + { 17527, 38218 }, + { 17528, 38221 }, + { 17529, 28037 }, + { 17530, 24744 }, + { 17531, 26592 }, + { 17532, 29406 }, + { 17533, 20957 }, + { 17534, 23425 }, + { 17697, 25319 }, + { 17698, 27870 }, + { 17699, 29275 }, + { 17700, 25197 }, + { 17701, 38062 }, + { 17702, 32445 }, + { 17703, 33043 }, + { 17704, 27987 }, + { 17705, 20892 }, + { 17706, 24324 }, + { 17707, 22900 }, + { 17708, 21162 }, + { 17709, 24594 }, + { 17710, 22899 }, + { 17711, 26262 }, + { 17712, 34384 }, + { 17713, 30111 }, + { 17714, 25386 }, + { 17715, 25062 }, + { 17716, 31983 }, + { 17717, 35834 }, + { 17718, 21734 }, + { 17719, 27431 }, + { 17720, 40485 }, + { 17721, 27572 }, + { 17722, 34261 }, + { 17723, 21589 }, + { 17724, 20598 }, + { 17725, 27812 }, + { 17726, 21866 }, + { 17727, 36276 }, + { 17728, 29228 }, + { 17729, 24085 }, + { 17730, 24597 }, + { 17731, 29750 }, + { 17732, 25293 }, + { 17733, 25490 }, + { 17734, 29260 }, + { 17735, 24472 }, + { 17736, 28227 }, + { 17737, 27966 }, + { 17738, 25856 }, + { 17739, 28504 }, + { 17740, 30424 }, + { 17741, 30928 }, + { 17742, 30460 }, + { 17743, 30036 }, + { 17744, 21028 }, + { 17745, 21467 }, + { 17746, 20051 }, + { 17747, 24222 }, + { 17748, 26049 }, + { 17749, 32810 }, + { 17750, 32982 }, + { 17751, 25243 }, + { 17752, 21638 }, + { 17753, 21032 }, + { 17754, 28846 }, + { 17755, 34957 }, + { 17756, 36305 }, + { 17757, 27873 }, + { 17758, 21624 }, + { 17759, 32986 }, + { 17760, 22521 }, + { 17761, 35060 }, + { 17762, 36180 }, + { 17763, 38506 }, + { 17764, 37197 }, + { 17765, 20329 }, + { 17766, 27803 }, + { 17767, 21943 }, + { 17768, 30406 }, + { 17769, 30768 }, + { 17770, 25256 }, + { 17771, 28921 }, + { 17772, 28558 }, + { 17773, 24429 }, + { 17774, 34028 }, + { 17775, 26842 }, + { 17776, 30844 }, + { 17777, 31735 }, + { 17778, 33192 }, + { 17779, 26379 }, + { 17780, 40527 }, + { 17781, 25447 }, + { 17782, 30896 }, + { 17783, 22383 }, + { 17784, 30738 }, + { 17785, 38713 }, + { 17786, 25209 }, + { 17787, 25259 }, + { 17788, 21128 }, + { 17789, 29749 }, + { 17790, 27607 }, + { 17953, 21860 }, + { 17954, 33086 }, + { 17955, 30130 }, + { 17956, 30382 }, + { 17957, 21305 }, + { 17958, 30174 }, + { 17959, 20731 }, + { 17960, 23617 }, + { 17961, 35692 }, + { 17962, 31687 }, + { 17963, 20559 }, + { 17964, 29255 }, + { 17965, 39575 }, + { 17966, 39128 }, + { 17967, 28418 }, + { 17968, 29922 }, + { 17969, 31080 }, + { 17970, 25735 }, + { 17971, 30629 }, + { 17972, 25340 }, + { 17973, 39057 }, + { 17974, 36139 }, + { 17975, 21697 }, + { 17976, 32856 }, + { 17977, 20050 }, + { 17978, 22378 }, + { 17979, 33529 }, + { 17980, 33805 }, + { 17981, 24179 }, + { 17982, 20973 }, + { 17983, 29942 }, + { 17984, 35780 }, + { 17985, 23631 }, + { 17986, 22369 }, + { 17987, 27900 }, + { 17988, 39047 }, + { 17989, 23110 }, + { 17990, 30772 }, + { 17991, 39748 }, + { 17992, 36843 }, + { 17993, 31893 }, + { 17994, 21078 }, + { 17995, 25169 }, + { 17996, 38138 }, + { 17997, 20166 }, + { 17998, 33670 }, + { 17999, 33889 }, + { 18000, 33769 }, + { 18001, 33970 }, + { 18002, 22484 }, + { 18003, 26420 }, + { 18004, 22275 }, + { 18005, 26222 }, + { 18006, 28006 }, + { 18007, 35889 }, + { 18008, 26333 }, + { 18009, 28689 }, + { 18010, 26399 }, + { 18011, 27450 }, + { 18012, 26646 }, + { 18013, 25114 }, + { 18014, 22971 }, + { 18015, 19971 }, + { 18016, 20932 }, + { 18017, 28422 }, + { 18018, 26578 }, + { 18019, 27791 }, + { 18020, 20854 }, + { 18021, 26827 }, + { 18022, 22855 }, + { 18023, 27495 }, + { 18024, 30054 }, + { 18025, 23822 }, + { 18026, 33040 }, + { 18027, 40784 }, + { 18028, 26071 }, + { 18029, 31048 }, + { 18030, 31041 }, + { 18031, 39569 }, + { 18032, 36215 }, + { 18033, 23682 }, + { 18034, 20062 }, + { 18035, 20225 }, + { 18036, 21551 }, + { 18037, 22865 }, + { 18038, 30732 }, + { 18039, 22120 }, + { 18040, 27668 }, + { 18041, 36804 }, + { 18042, 24323 }, + { 18043, 27773 }, + { 18044, 27875 }, + { 18045, 35755 }, + { 18046, 25488 }, + { 18209, 24688 }, + { 18210, 27965 }, + { 18211, 29301 }, + { 18212, 25190 }, + { 18213, 38030 }, + { 18214, 38085 }, + { 18215, 21315 }, + { 18216, 36801 }, + { 18217, 31614 }, + { 18218, 20191 }, + { 18219, 35878 }, + { 18220, 20094 }, + { 18221, 40660 }, + { 18222, 38065 }, + { 18223, 38067 }, + { 18224, 21069 }, + { 18225, 28508 }, + { 18226, 36963 }, + { 18227, 27973 }, + { 18228, 35892 }, + { 18229, 22545 }, + { 18230, 23884 }, + { 18231, 27424 }, + { 18232, 27465 }, + { 18233, 26538 }, + { 18234, 21595 }, + { 18235, 33108 }, + { 18236, 32652 }, + { 18237, 22681 }, + { 18238, 34103 }, + { 18239, 24378 }, + { 18240, 25250 }, + { 18241, 27207 }, + { 18242, 38201 }, + { 18243, 25970 }, + { 18244, 24708 }, + { 18245, 26725 }, + { 18246, 30631 }, + { 18247, 20052 }, + { 18248, 20392 }, + { 18249, 24039 }, + { 18250, 38808 }, + { 18251, 25772 }, + { 18252, 32728 }, + { 18253, 23789 }, + { 18254, 20431 }, + { 18255, 31373 }, + { 18256, 20999 }, + { 18257, 33540 }, + { 18258, 19988 }, + { 18259, 24623 }, + { 18260, 31363 }, + { 18261, 38054 }, + { 18262, 20405 }, + { 18263, 20146 }, + { 18264, 31206 }, + { 18265, 29748 }, + { 18266, 21220 }, + { 18267, 33465 }, + { 18268, 25810 }, + { 18269, 31165 }, + { 18270, 23517 }, + { 18271, 27777 }, + { 18272, 38738 }, + { 18273, 36731 }, + { 18274, 27682 }, + { 18275, 20542 }, + { 18276, 21375 }, + { 18277, 28165 }, + { 18278, 25806 }, + { 18279, 26228 }, + { 18280, 27696 }, + { 18281, 24773 }, + { 18282, 39031 }, + { 18283, 35831 }, + { 18284, 24198 }, + { 18285, 29756 }, + { 18286, 31351 }, + { 18287, 31179 }, + { 18288, 19992 }, + { 18289, 37041 }, + { 18290, 29699 }, + { 18291, 27714 }, + { 18292, 22234 }, + { 18293, 37195 }, + { 18294, 27845 }, + { 18295, 36235 }, + { 18296, 21306 }, + { 18297, 34502 }, + { 18298, 26354 }, + { 18299, 36527 }, + { 18300, 23624 }, + { 18301, 39537 }, + { 18302, 28192 }, + { 18465, 21462 }, + { 18466, 23094 }, + { 18467, 40843 }, + { 18468, 36259 }, + { 18469, 21435 }, + { 18470, 22280 }, + { 18471, 39079 }, + { 18472, 26435 }, + { 18473, 37275 }, + { 18474, 27849 }, + { 18475, 20840 }, + { 18476, 30154 }, + { 18477, 25331 }, + { 18478, 29356 }, + { 18479, 21048 }, + { 18480, 21149 }, + { 18481, 32570 }, + { 18482, 28820 }, + { 18483, 30264 }, + { 18484, 21364 }, + { 18485, 40522 }, + { 18486, 27063 }, + { 18487, 30830 }, + { 18488, 38592 }, + { 18489, 35033 }, + { 18490, 32676 }, + { 18491, 28982 }, + { 18492, 29123 }, + { 18493, 20873 }, + { 18494, 26579 }, + { 18495, 29924 }, + { 18496, 22756 }, + { 18497, 25880 }, + { 18498, 22199 }, + { 18499, 35753 }, + { 18500, 39286 }, + { 18501, 25200 }, + { 18502, 32469 }, + { 18503, 24825 }, + { 18504, 28909 }, + { 18505, 22764 }, + { 18506, 20161 }, + { 18507, 20154 }, + { 18508, 24525 }, + { 18509, 38887 }, + { 18510, 20219 }, + { 18511, 35748 }, + { 18512, 20995 }, + { 18513, 22922 }, + { 18514, 32427 }, + { 18515, 25172 }, + { 18516, 20173 }, + { 18517, 26085 }, + { 18518, 25102 }, + { 18519, 33592 }, + { 18520, 33993 }, + { 18521, 33635 }, + { 18522, 34701 }, + { 18523, 29076 }, + { 18524, 28342 }, + { 18525, 23481 }, + { 18526, 32466 }, + { 18527, 20887 }, + { 18528, 25545 }, + { 18529, 26580 }, + { 18530, 32905 }, + { 18531, 33593 }, + { 18532, 34837 }, + { 18533, 20754 }, + { 18534, 23418 }, + { 18535, 22914 }, + { 18536, 36785 }, + { 18537, 20083 }, + { 18538, 27741 }, + { 18539, 20837 }, + { 18540, 35109 }, + { 18541, 36719 }, + { 18542, 38446 }, + { 18543, 34122 }, + { 18544, 29790 }, + { 18545, 38160 }, + { 18546, 38384 }, + { 18547, 28070 }, + { 18548, 33509 }, + { 18549, 24369 }, + { 18550, 25746 }, + { 18551, 27922 }, + { 18552, 33832 }, + { 18553, 33134 }, + { 18554, 40131 }, + { 18555, 22622 }, + { 18556, 36187 }, + { 18557, 19977 }, + { 18558, 21441 }, + { 18721, 20254 }, + { 18722, 25955 }, + { 18723, 26705 }, + { 18724, 21971 }, + { 18725, 20007 }, + { 18726, 25620 }, + { 18727, 39578 }, + { 18728, 25195 }, + { 18729, 23234 }, + { 18730, 29791 }, + { 18731, 33394 }, + { 18732, 28073 }, + { 18733, 26862 }, + { 18734, 20711 }, + { 18735, 33678 }, + { 18736, 30722 }, + { 18737, 26432 }, + { 18738, 21049 }, + { 18739, 27801 }, + { 18740, 32433 }, + { 18741, 20667 }, + { 18742, 21861 }, + { 18743, 29022 }, + { 18744, 31579 }, + { 18745, 26194 }, + { 18746, 29642 }, + { 18747, 33515 }, + { 18748, 26441 }, + { 18749, 23665 }, + { 18750, 21024 }, + { 18751, 29053 }, + { 18752, 34923 }, + { 18753, 38378 }, + { 18754, 38485 }, + { 18755, 25797 }, + { 18756, 36193 }, + { 18757, 33203 }, + { 18758, 21892 }, + { 18759, 27733 }, + { 18760, 25159 }, + { 18761, 32558 }, + { 18762, 22674 }, + { 18763, 20260 }, + { 18764, 21830 }, + { 18765, 36175 }, + { 18766, 26188 }, + { 18767, 19978 }, + { 18768, 23578 }, + { 18769, 35059 }, + { 18770, 26786 }, + { 18771, 25422 }, + { 18772, 31245 }, + { 18773, 28903 }, + { 18774, 33421 }, + { 18775, 21242 }, + { 18776, 38902 }, + { 18777, 23569 }, + { 18778, 21736 }, + { 18779, 37045 }, + { 18780, 32461 }, + { 18781, 22882 }, + { 18782, 36170 }, + { 18783, 34503 }, + { 18784, 33292 }, + { 18785, 33293 }, + { 18786, 36198 }, + { 18787, 25668 }, + { 18788, 23556 }, + { 18789, 24913 }, + { 18790, 28041 }, + { 18791, 31038 }, + { 18792, 35774 }, + { 18793, 30775 }, + { 18794, 30003 }, + { 18795, 21627 }, + { 18796, 20280 }, + { 18797, 36523 }, + { 18798, 28145 }, + { 18799, 23072 }, + { 18800, 32453 }, + { 18801, 31070 }, + { 18802, 27784 }, + { 18803, 23457 }, + { 18804, 23158 }, + { 18805, 29978 }, + { 18806, 32958 }, + { 18807, 24910 }, + { 18808, 28183 }, + { 18809, 22768 }, + { 18810, 29983 }, + { 18811, 29989 }, + { 18812, 29298 }, + { 18813, 21319 }, + { 18814, 32499 }, + { 18977, 30465 }, + { 18978, 30427 }, + { 18979, 21097 }, + { 18980, 32988 }, + { 18981, 22307 }, + { 18982, 24072 }, + { 18983, 22833 }, + { 18984, 29422 }, + { 18985, 26045 }, + { 18986, 28287 }, + { 18987, 35799 }, + { 18988, 23608 }, + { 18989, 34417 }, + { 18990, 21313 }, + { 18991, 30707 }, + { 18992, 25342 }, + { 18993, 26102 }, + { 18994, 20160 }, + { 18995, 39135 }, + { 18996, 34432 }, + { 18997, 23454 }, + { 18998, 35782 }, + { 18999, 21490 }, + { 19000, 30690 }, + { 19001, 20351 }, + { 19002, 23630 }, + { 19003, 39542 }, + { 19004, 22987 }, + { 19005, 24335 }, + { 19006, 31034 }, + { 19007, 22763 }, + { 19008, 19990 }, + { 19009, 26623 }, + { 19010, 20107 }, + { 19011, 25325 }, + { 19012, 35475 }, + { 19013, 36893 }, + { 19014, 21183 }, + { 19015, 26159 }, + { 19016, 21980 }, + { 19017, 22124 }, + { 19018, 36866 }, + { 19019, 20181 }, + { 19020, 20365 }, + { 19021, 37322 }, + { 19022, 39280 }, + { 19023, 27663 }, + { 19024, 24066 }, + { 19025, 24643 }, + { 19026, 23460 }, + { 19027, 35270 }, + { 19028, 35797 }, + { 19029, 25910 }, + { 19030, 25163 }, + { 19031, 39318 }, + { 19032, 23432 }, + { 19033, 23551 }, + { 19034, 25480 }, + { 19035, 21806 }, + { 19036, 21463 }, + { 19037, 30246 }, + { 19038, 20861 }, + { 19039, 34092 }, + { 19040, 26530 }, + { 19041, 26803 }, + { 19042, 27530 }, + { 19043, 25234 }, + { 19044, 36755 }, + { 19045, 21460 }, + { 19046, 33298 }, + { 19047, 28113 }, + { 19048, 30095 }, + { 19049, 20070 }, + { 19050, 36174 }, + { 19051, 23408 }, + { 19052, 29087 }, + { 19053, 34223 }, + { 19054, 26257 }, + { 19055, 26329 }, + { 19056, 32626 }, + { 19057, 34560 }, + { 19058, 40653 }, + { 19059, 40736 }, + { 19060, 23646 }, + { 19061, 26415 }, + { 19062, 36848 }, + { 19063, 26641 }, + { 19064, 26463 }, + { 19065, 25101 }, + { 19066, 31446 }, + { 19067, 22661 }, + { 19068, 24246 }, + { 19069, 25968 }, + { 19070, 28465 }, + { 19233, 24661 }, + { 19234, 21047 }, + { 19235, 32781 }, + { 19236, 25684 }, + { 19237, 34928 }, + { 19238, 29993 }, + { 19239, 24069 }, + { 19240, 26643 }, + { 19241, 25332 }, + { 19242, 38684 }, + { 19243, 21452 }, + { 19244, 29245 }, + { 19245, 35841 }, + { 19246, 27700 }, + { 19247, 30561 }, + { 19248, 31246 }, + { 19249, 21550 }, + { 19250, 30636 }, + { 19251, 39034 }, + { 19252, 33308 }, + { 19253, 35828 }, + { 19254, 30805 }, + { 19255, 26388 }, + { 19256, 28865 }, + { 19257, 26031 }, + { 19258, 25749 }, + { 19259, 22070 }, + { 19260, 24605 }, + { 19261, 31169 }, + { 19262, 21496 }, + { 19263, 19997 }, + { 19264, 27515 }, + { 19265, 32902 }, + { 19266, 23546 }, + { 19267, 21987 }, + { 19268, 22235 }, + { 19269, 20282 }, + { 19270, 20284 }, + { 19271, 39282 }, + { 19272, 24051 }, + { 19273, 26494 }, + { 19274, 32824 }, + { 19275, 24578 }, + { 19276, 39042 }, + { 19277, 36865 }, + { 19278, 23435 }, + { 19279, 35772 }, + { 19280, 35829 }, + { 19281, 25628 }, + { 19282, 33368 }, + { 19283, 25822 }, + { 19284, 22013 }, + { 19285, 33487 }, + { 19286, 37221 }, + { 19287, 20439 }, + { 19288, 32032 }, + { 19289, 36895 }, + { 19290, 31903 }, + { 19291, 20723 }, + { 19292, 22609 }, + { 19293, 28335 }, + { 19294, 23487 }, + { 19295, 35785 }, + { 19296, 32899 }, + { 19297, 37240 }, + { 19298, 33948 }, + { 19299, 31639 }, + { 19300, 34429 }, + { 19301, 38539 }, + { 19302, 38543 }, + { 19303, 32485 }, + { 19304, 39635 }, + { 19305, 30862 }, + { 19306, 23681 }, + { 19307, 31319 }, + { 19308, 36930 }, + { 19309, 38567 }, + { 19310, 31071 }, + { 19311, 23385 }, + { 19312, 25439 }, + { 19313, 31499 }, + { 19314, 34001 }, + { 19315, 26797 }, + { 19316, 21766 }, + { 19317, 32553 }, + { 19318, 29712 }, + { 19319, 32034 }, + { 19320, 38145 }, + { 19321, 25152 }, + { 19322, 22604 }, + { 19323, 20182 }, + { 19324, 23427 }, + { 19325, 22905 }, + { 19326, 22612 }, + { 19489, 29549 }, + { 19490, 25374 }, + { 19491, 36427 }, + { 19492, 36367 }, + { 19493, 32974 }, + { 19494, 33492 }, + { 19495, 25260 }, + { 19496, 21488 }, + { 19497, 27888 }, + { 19498, 37214 }, + { 19499, 22826 }, + { 19500, 24577 }, + { 19501, 27760 }, + { 19502, 22349 }, + { 19503, 25674 }, + { 19504, 36138 }, + { 19505, 30251 }, + { 19506, 28393 }, + { 19507, 22363 }, + { 19508, 27264 }, + { 19509, 30192 }, + { 19510, 28525 }, + { 19511, 35885 }, + { 19512, 35848 }, + { 19513, 22374 }, + { 19514, 27631 }, + { 19515, 34962 }, + { 19516, 30899 }, + { 19517, 25506 }, + { 19518, 21497 }, + { 19519, 28845 }, + { 19520, 27748 }, + { 19521, 22616 }, + { 19522, 25642 }, + { 19523, 22530 }, + { 19524, 26848 }, + { 19525, 33179 }, + { 19526, 21776 }, + { 19527, 31958 }, + { 19528, 20504 }, + { 19529, 36538 }, + { 19530, 28108 }, + { 19531, 36255 }, + { 19532, 28907 }, + { 19533, 25487 }, + { 19534, 28059 }, + { 19535, 28372 }, + { 19536, 32486 }, + { 19537, 33796 }, + { 19538, 26691 }, + { 19539, 36867 }, + { 19540, 28120 }, + { 19541, 38518 }, + { 19542, 35752 }, + { 19543, 22871 }, + { 19544, 29305 }, + { 19545, 34276 }, + { 19546, 33150 }, + { 19547, 30140 }, + { 19548, 35466 }, + { 19549, 26799 }, + { 19550, 21076 }, + { 19551, 36386 }, + { 19552, 38161 }, + { 19553, 25552 }, + { 19554, 39064 }, + { 19555, 36420 }, + { 19556, 21884 }, + { 19557, 20307 }, + { 19558, 26367 }, + { 19559, 22159 }, + { 19560, 24789 }, + { 19561, 28053 }, + { 19562, 21059 }, + { 19563, 23625 }, + { 19564, 22825 }, + { 19565, 28155 }, + { 19566, 22635 }, + { 19567, 30000 }, + { 19568, 29980 }, + { 19569, 24684 }, + { 19570, 33300 }, + { 19571, 33094 }, + { 19572, 25361 }, + { 19573, 26465 }, + { 19574, 36834 }, + { 19575, 30522 }, + { 19576, 36339 }, + { 19577, 36148 }, + { 19578, 38081 }, + { 19579, 24086 }, + { 19580, 21381 }, + { 19581, 21548 }, + { 19582, 28867 }, + { 19745, 27712 }, + { 19746, 24311 }, + { 19747, 20572 }, + { 19748, 20141 }, + { 19749, 24237 }, + { 19750, 25402 }, + { 19751, 33351 }, + { 19752, 36890 }, + { 19753, 26704 }, + { 19754, 37230 }, + { 19755, 30643 }, + { 19756, 21516 }, + { 19757, 38108 }, + { 19758, 24420 }, + { 19759, 31461 }, + { 19760, 26742 }, + { 19761, 25413 }, + { 19762, 31570 }, + { 19763, 32479 }, + { 19764, 30171 }, + { 19765, 20599 }, + { 19766, 25237 }, + { 19767, 22836 }, + { 19768, 36879 }, + { 19769, 20984 }, + { 19770, 31171 }, + { 19771, 31361 }, + { 19772, 22270 }, + { 19773, 24466 }, + { 19774, 36884 }, + { 19775, 28034 }, + { 19776, 23648 }, + { 19777, 22303 }, + { 19778, 21520 }, + { 19779, 20820 }, + { 19780, 28237 }, + { 19781, 22242 }, + { 19782, 25512 }, + { 19783, 39059 }, + { 19784, 33151 }, + { 19785, 34581 }, + { 19786, 35114 }, + { 19787, 36864 }, + { 19788, 21534 }, + { 19789, 23663 }, + { 19790, 33216 }, + { 19791, 25302 }, + { 19792, 25176 }, + { 19793, 33073 }, + { 19794, 40501 }, + { 19795, 38464 }, + { 19796, 39534 }, + { 19797, 39548 }, + { 19798, 26925 }, + { 19799, 22949 }, + { 19800, 25299 }, + { 19801, 21822 }, + { 19802, 25366 }, + { 19803, 21703 }, + { 19804, 34521 }, + { 19805, 27964 }, + { 19806, 23043 }, + { 19807, 29926 }, + { 19808, 34972 }, + { 19809, 27498 }, + { 19810, 22806 }, + { 19811, 35916 }, + { 19812, 24367 }, + { 19813, 28286 }, + { 19814, 29609 }, + { 19815, 39037 }, + { 19816, 20024 }, + { 19817, 28919 }, + { 19818, 23436 }, + { 19819, 30871 }, + { 19820, 25405 }, + { 19821, 26202 }, + { 19822, 30358 }, + { 19823, 24779 }, + { 19824, 23451 }, + { 19825, 23113 }, + { 19826, 19975 }, + { 19827, 33109 }, + { 19828, 27754 }, + { 19829, 29579 }, + { 19830, 20129 }, + { 19831, 26505 }, + { 19832, 32593 }, + { 19833, 24448 }, + { 19834, 26106 }, + { 19835, 26395 }, + { 19836, 24536 }, + { 19837, 22916 }, + { 19838, 23041 }, + { 20001, 24013 }, + { 20002, 24494 }, + { 20003, 21361 }, + { 20004, 38886 }, + { 20005, 36829 }, + { 20006, 26693 }, + { 20007, 22260 }, + { 20008, 21807 }, + { 20009, 24799 }, + { 20010, 20026 }, + { 20011, 28493 }, + { 20012, 32500 }, + { 20013, 33479 }, + { 20014, 33806 }, + { 20015, 22996 }, + { 20016, 20255 }, + { 20017, 20266 }, + { 20018, 23614 }, + { 20019, 32428 }, + { 20020, 26410 }, + { 20021, 34074 }, + { 20022, 21619 }, + { 20023, 30031 }, + { 20024, 32963 }, + { 20025, 21890 }, + { 20026, 39759 }, + { 20027, 20301 }, + { 20028, 28205 }, + { 20029, 35859 }, + { 20030, 23561 }, + { 20031, 24944 }, + { 20032, 21355 }, + { 20033, 30239 }, + { 20034, 28201 }, + { 20035, 34442 }, + { 20036, 25991 }, + { 20037, 38395 }, + { 20038, 32441 }, + { 20039, 21563 }, + { 20040, 31283 }, + { 20041, 32010 }, + { 20042, 38382 }, + { 20043, 21985 }, + { 20044, 32705 }, + { 20045, 29934 }, + { 20046, 25373 }, + { 20047, 34583 }, + { 20048, 28065 }, + { 20049, 31389 }, + { 20050, 25105 }, + { 20051, 26017 }, + { 20052, 21351 }, + { 20053, 25569 }, + { 20054, 27779 }, + { 20055, 24043 }, + { 20056, 21596 }, + { 20057, 38056 }, + { 20058, 20044 }, + { 20059, 27745 }, + { 20060, 35820 }, + { 20061, 23627 }, + { 20062, 26080 }, + { 20063, 33436 }, + { 20064, 26791 }, + { 20065, 21566 }, + { 20066, 21556 }, + { 20067, 27595 }, + { 20068, 27494 }, + { 20069, 20116 }, + { 20070, 25410 }, + { 20071, 21320 }, + { 20072, 33310 }, + { 20073, 20237 }, + { 20074, 20398 }, + { 20075, 22366 }, + { 20076, 25098 }, + { 20077, 38654 }, + { 20078, 26212 }, + { 20079, 29289 }, + { 20080, 21247 }, + { 20081, 21153 }, + { 20082, 24735 }, + { 20083, 35823 }, + { 20084, 26132 }, + { 20085, 29081 }, + { 20086, 26512 }, + { 20087, 35199 }, + { 20088, 30802 }, + { 20089, 30717 }, + { 20090, 26224 }, + { 20091, 22075 }, + { 20092, 21560 }, + { 20093, 38177 }, + { 20094, 29306 }, + { 20257, 31232 }, + { 20258, 24687 }, + { 20259, 24076 }, + { 20260, 24713 }, + { 20261, 33181 }, + { 20262, 22805 }, + { 20263, 24796 }, + { 20264, 29060 }, + { 20265, 28911 }, + { 20266, 28330 }, + { 20267, 27728 }, + { 20268, 29312 }, + { 20269, 27268 }, + { 20270, 34989 }, + { 20271, 24109 }, + { 20272, 20064 }, + { 20273, 23219 }, + { 20274, 21916 }, + { 20275, 38115 }, + { 20276, 27927 }, + { 20277, 31995 }, + { 20278, 38553 }, + { 20279, 25103 }, + { 20280, 32454 }, + { 20281, 30606 }, + { 20282, 34430 }, + { 20283, 21283 }, + { 20284, 38686 }, + { 20285, 36758 }, + { 20286, 26247 }, + { 20287, 23777 }, + { 20288, 20384 }, + { 20289, 29421 }, + { 20290, 19979 }, + { 20291, 21414 }, + { 20292, 22799 }, + { 20293, 21523 }, + { 20294, 25472 }, + { 20295, 38184 }, + { 20296, 20808 }, + { 20297, 20185 }, + { 20298, 40092 }, + { 20299, 32420 }, + { 20300, 21688 }, + { 20301, 36132 }, + { 20302, 34900 }, + { 20303, 33335 }, + { 20304, 38386 }, + { 20305, 28046 }, + { 20306, 24358 }, + { 20307, 23244 }, + { 20308, 26174 }, + { 20309, 38505 }, + { 20310, 29616 }, + { 20311, 29486 }, + { 20312, 21439 }, + { 20313, 33146 }, + { 20314, 39301 }, + { 20315, 32673 }, + { 20316, 23466 }, + { 20317, 38519 }, + { 20318, 38480 }, + { 20319, 32447 }, + { 20320, 30456 }, + { 20321, 21410 }, + { 20322, 38262 }, + { 20323, 39321 }, + { 20324, 31665 }, + { 20325, 35140 }, + { 20326, 28248 }, + { 20327, 20065 }, + { 20328, 32724 }, + { 20329, 31077 }, + { 20330, 35814 }, + { 20331, 24819 }, + { 20332, 21709 }, + { 20333, 20139 }, + { 20334, 39033 }, + { 20335, 24055 }, + { 20336, 27233 }, + { 20337, 20687 }, + { 20338, 21521 }, + { 20339, 35937 }, + { 20340, 33831 }, + { 20341, 30813 }, + { 20342, 38660 }, + { 20343, 21066 }, + { 20344, 21742 }, + { 20345, 22179 }, + { 20346, 38144 }, + { 20347, 28040 }, + { 20348, 23477 }, + { 20349, 28102 }, + { 20350, 26195 }, + { 20513, 23567 }, + { 20514, 23389 }, + { 20515, 26657 }, + { 20516, 32918 }, + { 20517, 21880 }, + { 20518, 31505 }, + { 20519, 25928 }, + { 20520, 26964 }, + { 20521, 20123 }, + { 20522, 27463 }, + { 20523, 34638 }, + { 20524, 38795 }, + { 20525, 21327 }, + { 20526, 25375 }, + { 20527, 25658 }, + { 20528, 37034 }, + { 20529, 26012 }, + { 20530, 32961 }, + { 20531, 35856 }, + { 20532, 20889 }, + { 20533, 26800 }, + { 20534, 21368 }, + { 20535, 34809 }, + { 20536, 25032 }, + { 20537, 27844 }, + { 20538, 27899 }, + { 20539, 35874 }, + { 20540, 23633 }, + { 20541, 34218 }, + { 20542, 33455 }, + { 20543, 38156 }, + { 20544, 27427 }, + { 20545, 36763 }, + { 20546, 26032 }, + { 20547, 24571 }, + { 20548, 24515 }, + { 20549, 20449 }, + { 20550, 34885 }, + { 20551, 26143 }, + { 20552, 33125 }, + { 20553, 29481 }, + { 20554, 24826 }, + { 20555, 20852 }, + { 20556, 21009 }, + { 20557, 22411 }, + { 20558, 24418 }, + { 20559, 37026 }, + { 20560, 34892 }, + { 20561, 37266 }, + { 20562, 24184 }, + { 20563, 26447 }, + { 20564, 24615 }, + { 20565, 22995 }, + { 20566, 20804 }, + { 20567, 20982 }, + { 20568, 33016 }, + { 20569, 21256 }, + { 20570, 27769 }, + { 20571, 38596 }, + { 20572, 29066 }, + { 20573, 20241 }, + { 20574, 20462 }, + { 20575, 32670 }, + { 20576, 26429 }, + { 20577, 21957 }, + { 20578, 38152 }, + { 20579, 31168 }, + { 20580, 34966 }, + { 20581, 32483 }, + { 20582, 22687 }, + { 20583, 25100 }, + { 20584, 38656 }, + { 20585, 34394 }, + { 20586, 22040 }, + { 20587, 39035 }, + { 20588, 24464 }, + { 20589, 35768 }, + { 20590, 33988 }, + { 20591, 37207 }, + { 20592, 21465 }, + { 20593, 26093 }, + { 20594, 24207 }, + { 20595, 30044 }, + { 20596, 24676 }, + { 20597, 32110 }, + { 20598, 23167 }, + { 20599, 32490 }, + { 20600, 32493 }, + { 20601, 36713 }, + { 20602, 21927 }, + { 20603, 23459 }, + { 20604, 24748 }, + { 20605, 26059 }, + { 20606, 29572 }, + { 20769, 36873 }, + { 20770, 30307 }, + { 20771, 30505 }, + { 20772, 32474 }, + { 20773, 38772 }, + { 20774, 34203 }, + { 20775, 23398 }, + { 20776, 31348 }, + { 20777, 38634 }, + { 20778, 34880 }, + { 20779, 21195 }, + { 20780, 29071 }, + { 20781, 24490 }, + { 20782, 26092 }, + { 20783, 35810 }, + { 20784, 23547 }, + { 20785, 39535 }, + { 20786, 24033 }, + { 20787, 27529 }, + { 20788, 27739 }, + { 20789, 35757 }, + { 20790, 35759 }, + { 20791, 36874 }, + { 20792, 36805 }, + { 20793, 21387 }, + { 20794, 25276 }, + { 20795, 40486 }, + { 20796, 40493 }, + { 20797, 21568 }, + { 20798, 20011 }, + { 20799, 33469 }, + { 20800, 29273 }, + { 20801, 34460 }, + { 20802, 23830 }, + { 20803, 34905 }, + { 20804, 28079 }, + { 20805, 38597 }, + { 20806, 21713 }, + { 20807, 20122 }, + { 20808, 35766 }, + { 20809, 28937 }, + { 20810, 21693 }, + { 20811, 38409 }, + { 20812, 28895 }, + { 20813, 28153 }, + { 20814, 30416 }, + { 20815, 20005 }, + { 20816, 30740 }, + { 20817, 34578 }, + { 20818, 23721 }, + { 20819, 24310 }, + { 20820, 35328 }, + { 20821, 39068 }, + { 20822, 38414 }, + { 20823, 28814 }, + { 20824, 27839 }, + { 20825, 22852 }, + { 20826, 25513 }, + { 20827, 30524 }, + { 20828, 34893 }, + { 20829, 28436 }, + { 20830, 33395 }, + { 20831, 22576 }, + { 20832, 29141 }, + { 20833, 21388 }, + { 20834, 30746 }, + { 20835, 38593 }, + { 20836, 21761 }, + { 20837, 24422 }, + { 20838, 28976 }, + { 20839, 23476 }, + { 20840, 35866 }, + { 20841, 39564 }, + { 20842, 27523 }, + { 20843, 22830 }, + { 20844, 40495 }, + { 20845, 31207 }, + { 20846, 26472 }, + { 20847, 25196 }, + { 20848, 20335 }, + { 20849, 30113 }, + { 20850, 32650 }, + { 20851, 27915 }, + { 20852, 38451 }, + { 20853, 27687 }, + { 20854, 20208 }, + { 20855, 30162 }, + { 20856, 20859 }, + { 20857, 26679 }, + { 20858, 28478 }, + { 20859, 36992 }, + { 20860, 33136 }, + { 20861, 22934 }, + { 20862, 29814 }, + { 21025, 25671 }, + { 21026, 23591 }, + { 21027, 36965 }, + { 21028, 31377 }, + { 21029, 35875 }, + { 21030, 23002 }, + { 21031, 21676 }, + { 21032, 33280 }, + { 21033, 33647 }, + { 21034, 35201 }, + { 21035, 32768 }, + { 21036, 26928 }, + { 21037, 22094 }, + { 21038, 32822 }, + { 21039, 29239 }, + { 21040, 37326 }, + { 21041, 20918 }, + { 21042, 20063 }, + { 21043, 39029 }, + { 21044, 25494 }, + { 21045, 19994 }, + { 21046, 21494 }, + { 21047, 26355 }, + { 21048, 33099 }, + { 21049, 22812 }, + { 21050, 28082 }, + { 21051, 19968 }, + { 21052, 22777 }, + { 21053, 21307 }, + { 21054, 25558 }, + { 21055, 38129 }, + { 21056, 20381 }, + { 21057, 20234 }, + { 21058, 34915 }, + { 21059, 39056 }, + { 21060, 22839 }, + { 21061, 36951 }, + { 21062, 31227 }, + { 21063, 20202 }, + { 21064, 33008 }, + { 21065, 30097 }, + { 21066, 27778 }, + { 21067, 23452 }, + { 21068, 23016 }, + { 21069, 24413 }, + { 21070, 26885 }, + { 21071, 34433 }, + { 21072, 20506 }, + { 21073, 24050 }, + { 21074, 20057 }, + { 21075, 30691 }, + { 21076, 20197 }, + { 21077, 33402 }, + { 21078, 25233 }, + { 21079, 26131 }, + { 21080, 37009 }, + { 21081, 23673 }, + { 21082, 20159 }, + { 21083, 24441 }, + { 21084, 33222 }, + { 21085, 36920 }, + { 21086, 32900 }, + { 21087, 30123 }, + { 21088, 20134 }, + { 21089, 35028 }, + { 21090, 24847 }, + { 21091, 27589 }, + { 21092, 24518 }, + { 21093, 20041 }, + { 21094, 30410 }, + { 21095, 28322 }, + { 21096, 35811 }, + { 21097, 35758 }, + { 21098, 35850 }, + { 21099, 35793 }, + { 21100, 24322 }, + { 21101, 32764 }, + { 21102, 32716 }, + { 21103, 32462 }, + { 21104, 33589 }, + { 21105, 33643 }, + { 21106, 22240 }, + { 21107, 27575 }, + { 21108, 38899 }, + { 21109, 38452 }, + { 21110, 23035 }, + { 21111, 21535 }, + { 21112, 38134 }, + { 21113, 28139 }, + { 21114, 23493 }, + { 21115, 39278 }, + { 21116, 23609 }, + { 21117, 24341 }, + { 21118, 38544 }, + { 21281, 21360 }, + { 21282, 33521 }, + { 21283, 27185 }, + { 21284, 23156 }, + { 21285, 40560 }, + { 21286, 24212 }, + { 21287, 32552 }, + { 21288, 33721 }, + { 21289, 33828 }, + { 21290, 33829 }, + { 21291, 33639 }, + { 21292, 34631 }, + { 21293, 36814 }, + { 21294, 36194 }, + { 21295, 30408 }, + { 21296, 24433 }, + { 21297, 39062 }, + { 21298, 30828 }, + { 21299, 26144 }, + { 21300, 21727 }, + { 21301, 25317 }, + { 21302, 20323 }, + { 21303, 33219 }, + { 21304, 30152 }, + { 21305, 24248 }, + { 21306, 38605 }, + { 21307, 36362 }, + { 21308, 34553 }, + { 21309, 21647 }, + { 21310, 27891 }, + { 21311, 28044 }, + { 21312, 27704 }, + { 21313, 24703 }, + { 21314, 21191 }, + { 21315, 29992 }, + { 21316, 24189 }, + { 21317, 20248 }, + { 21318, 24736 }, + { 21319, 24551 }, + { 21320, 23588 }, + { 21321, 30001 }, + { 21322, 37038 }, + { 21323, 38080 }, + { 21324, 29369 }, + { 21325, 27833 }, + { 21326, 28216 }, + { 21327, 37193 }, + { 21328, 26377 }, + { 21329, 21451 }, + { 21330, 21491 }, + { 21331, 20305 }, + { 21332, 37321 }, + { 21333, 35825 }, + { 21334, 21448 }, + { 21335, 24188 }, + { 21336, 36802 }, + { 21337, 28132 }, + { 21338, 20110 }, + { 21339, 30402 }, + { 21340, 27014 }, + { 21341, 34398 }, + { 21342, 24858 }, + { 21343, 33286 }, + { 21344, 20313 }, + { 21345, 20446 }, + { 21346, 36926 }, + { 21347, 40060 }, + { 21348, 24841 }, + { 21349, 28189 }, + { 21350, 28180 }, + { 21351, 38533 }, + { 21352, 20104 }, + { 21353, 23089 }, + { 21354, 38632 }, + { 21355, 19982 }, + { 21356, 23679 }, + { 21357, 31161 }, + { 21358, 23431 }, + { 21359, 35821 }, + { 21360, 32701 }, + { 21361, 29577 }, + { 21362, 22495 }, + { 21363, 33419 }, + { 21364, 37057 }, + { 21365, 21505 }, + { 21366, 36935 }, + { 21367, 21947 }, + { 21368, 23786 }, + { 21369, 24481 }, + { 21370, 24840 }, + { 21371, 27442 }, + { 21372, 29425 }, + { 21373, 32946 }, + { 21374, 35465 }, + { 21537, 28020 }, + { 21538, 23507 }, + { 21539, 35029 }, + { 21540, 39044 }, + { 21541, 35947 }, + { 21542, 39533 }, + { 21543, 40499 }, + { 21544, 28170 }, + { 21545, 20900 }, + { 21546, 20803 }, + { 21547, 22435 }, + { 21548, 34945 }, + { 21549, 21407 }, + { 21550, 25588 }, + { 21551, 36757 }, + { 21552, 22253 }, + { 21553, 21592 }, + { 21554, 22278 }, + { 21555, 29503 }, + { 21556, 28304 }, + { 21557, 32536 }, + { 21558, 36828 }, + { 21559, 33489 }, + { 21560, 24895 }, + { 21561, 24616 }, + { 21562, 38498 }, + { 21563, 26352 }, + { 21564, 32422 }, + { 21565, 36234 }, + { 21566, 36291 }, + { 21567, 38053 }, + { 21568, 23731 }, + { 21569, 31908 }, + { 21570, 26376 }, + { 21571, 24742 }, + { 21572, 38405 }, + { 21573, 32792 }, + { 21574, 20113 }, + { 21575, 37095 }, + { 21576, 21248 }, + { 21577, 38504 }, + { 21578, 20801 }, + { 21579, 36816 }, + { 21580, 34164 }, + { 21581, 37213 }, + { 21582, 26197 }, + { 21583, 38901 }, + { 21584, 23381 }, + { 21585, 21277 }, + { 21586, 30776 }, + { 21587, 26434 }, + { 21588, 26685 }, + { 21589, 21705 }, + { 21590, 28798 }, + { 21591, 23472 }, + { 21592, 36733 }, + { 21593, 20877 }, + { 21594, 22312 }, + { 21595, 21681 }, + { 21596, 25874 }, + { 21597, 26242 }, + { 21598, 36190 }, + { 21599, 36163 }, + { 21600, 33039 }, + { 21601, 33900 }, + { 21602, 36973 }, + { 21603, 31967 }, + { 21604, 20991 }, + { 21605, 34299 }, + { 21606, 26531 }, + { 21607, 26089 }, + { 21608, 28577 }, + { 21609, 34468 }, + { 21610, 36481 }, + { 21611, 22122 }, + { 21612, 36896 }, + { 21613, 30338 }, + { 21614, 28790 }, + { 21615, 29157 }, + { 21616, 36131 }, + { 21617, 25321 }, + { 21618, 21017 }, + { 21619, 27901 }, + { 21620, 36156 }, + { 21621, 24590 }, + { 21622, 22686 }, + { 21623, 24974 }, + { 21624, 26366 }, + { 21625, 36192 }, + { 21626, 25166 }, + { 21627, 21939 }, + { 21628, 28195 }, + { 21629, 26413 }, + { 21630, 36711 }, + { 21793, 38113 }, + { 21794, 38392 }, + { 21795, 30504 }, + { 21796, 26629 }, + { 21797, 27048 }, + { 21798, 21643 }, + { 21799, 20045 }, + { 21800, 28856 }, + { 21801, 35784 }, + { 21802, 25688 }, + { 21803, 25995 }, + { 21804, 23429 }, + { 21805, 31364 }, + { 21806, 20538 }, + { 21807, 23528 }, + { 21808, 30651 }, + { 21809, 27617 }, + { 21810, 35449 }, + { 21811, 31896 }, + { 21812, 27838 }, + { 21813, 30415 }, + { 21814, 26025 }, + { 21815, 36759 }, + { 21816, 23853 }, + { 21817, 23637 }, + { 21818, 34360 }, + { 21819, 26632 }, + { 21820, 21344 }, + { 21821, 25112 }, + { 21822, 31449 }, + { 21823, 28251 }, + { 21824, 32509 }, + { 21825, 27167 }, + { 21826, 31456 }, + { 21827, 24432 }, + { 21828, 28467 }, + { 21829, 24352 }, + { 21830, 25484 }, + { 21831, 28072 }, + { 21832, 26454 }, + { 21833, 19976 }, + { 21834, 24080 }, + { 21835, 36134 }, + { 21836, 20183 }, + { 21837, 32960 }, + { 21838, 30260 }, + { 21839, 38556 }, + { 21840, 25307 }, + { 21841, 26157 }, + { 21842, 25214 }, + { 21843, 27836 }, + { 21844, 36213 }, + { 21845, 29031 }, + { 21846, 32617 }, + { 21847, 20806 }, + { 21848, 32903 }, + { 21849, 21484 }, + { 21850, 36974 }, + { 21851, 25240 }, + { 21852, 21746 }, + { 21853, 34544 }, + { 21854, 36761 }, + { 21855, 32773 }, + { 21856, 38167 }, + { 21857, 34071 }, + { 21858, 36825 }, + { 21859, 27993 }, + { 21860, 29645 }, + { 21861, 26015 }, + { 21862, 30495 }, + { 21863, 29956 }, + { 21864, 30759 }, + { 21865, 33275 }, + { 21866, 36126 }, + { 21867, 38024 }, + { 21868, 20390 }, + { 21869, 26517 }, + { 21870, 30137 }, + { 21871, 35786 }, + { 21872, 38663 }, + { 21873, 25391 }, + { 21874, 38215 }, + { 21875, 38453 }, + { 21876, 33976 }, + { 21877, 25379 }, + { 21878, 30529 }, + { 21879, 24449 }, + { 21880, 29424 }, + { 21881, 20105 }, + { 21882, 24596 }, + { 21883, 25972 }, + { 21884, 25327 }, + { 21885, 27491 }, + { 21886, 25919 }, + { 22049, 24103 }, + { 22050, 30151 }, + { 22051, 37073 }, + { 22052, 35777 }, + { 22053, 33437 }, + { 22054, 26525 }, + { 22055, 25903 }, + { 22056, 21553 }, + { 22057, 34584 }, + { 22058, 30693 }, + { 22059, 32930 }, + { 22060, 33026 }, + { 22061, 27713 }, + { 22062, 20043 }, + { 22063, 32455 }, + { 22064, 32844 }, + { 22065, 30452 }, + { 22066, 26893 }, + { 22067, 27542 }, + { 22068, 25191 }, + { 22069, 20540 }, + { 22070, 20356 }, + { 22071, 22336 }, + { 22072, 25351 }, + { 22073, 27490 }, + { 22074, 36286 }, + { 22075, 21482 }, + { 22076, 26088 }, + { 22077, 32440 }, + { 22078, 24535 }, + { 22079, 25370 }, + { 22080, 25527 }, + { 22081, 33267 }, + { 22082, 33268 }, + { 22083, 32622 }, + { 22084, 24092 }, + { 22085, 23769 }, + { 22086, 21046 }, + { 22087, 26234 }, + { 22088, 31209 }, + { 22089, 31258 }, + { 22090, 36136 }, + { 22091, 28825 }, + { 22092, 30164 }, + { 22093, 28382 }, + { 22094, 27835 }, + { 22095, 31378 }, + { 22096, 20013 }, + { 22097, 30405 }, + { 22098, 24544 }, + { 22099, 38047 }, + { 22100, 34935 }, + { 22101, 32456 }, + { 22102, 31181 }, + { 22103, 32959 }, + { 22104, 37325 }, + { 22105, 20210 }, + { 22106, 20247 }, + { 22107, 33311 }, + { 22108, 21608 }, + { 22109, 24030 }, + { 22110, 27954 }, + { 22111, 35788 }, + { 22112, 31909 }, + { 22113, 36724 }, + { 22114, 32920 }, + { 22115, 24090 }, + { 22116, 21650 }, + { 22117, 30385 }, + { 22118, 23449 }, + { 22119, 26172 }, + { 22120, 39588 }, + { 22121, 29664 }, + { 22122, 26666 }, + { 22123, 34523 }, + { 22124, 26417 }, + { 22125, 29482 }, + { 22126, 35832 }, + { 22127, 35803 }, + { 22128, 36880 }, + { 22129, 31481 }, + { 22130, 28891 }, + { 22131, 29038 }, + { 22132, 25284 }, + { 22133, 30633 }, + { 22134, 22065 }, + { 22135, 20027 }, + { 22136, 33879 }, + { 22137, 26609 }, + { 22138, 21161 }, + { 22139, 34496 }, + { 22140, 36142 }, + { 22141, 38136 }, + { 22142, 31569 }, + { 22305, 20303 }, + { 22306, 27880 }, + { 22307, 31069 }, + { 22308, 39547 }, + { 22309, 25235 }, + { 22310, 29226 }, + { 22311, 25341 }, + { 22312, 19987 }, + { 22313, 30742 }, + { 22314, 36716 }, + { 22315, 25776 }, + { 22316, 36186 }, + { 22317, 31686 }, + { 22318, 26729 }, + { 22319, 24196 }, + { 22320, 35013 }, + { 22321, 22918 }, + { 22322, 25758 }, + { 22323, 22766 }, + { 22324, 29366 }, + { 22325, 26894 }, + { 22326, 38181 }, + { 22327, 36861 }, + { 22328, 36184 }, + { 22329, 22368 }, + { 22330, 32512 }, + { 22331, 35846 }, + { 22332, 20934 }, + { 22333, 25417 }, + { 22334, 25305 }, + { 22335, 21331 }, + { 22336, 26700 }, + { 22337, 29730 }, + { 22338, 33537 }, + { 22339, 37196 }, + { 22340, 21828 }, + { 22341, 30528 }, + { 22342, 28796 }, + { 22343, 27978 }, + { 22344, 20857 }, + { 22345, 21672 }, + { 22346, 36164 }, + { 22347, 23039 }, + { 22348, 28363 }, + { 22349, 28100 }, + { 22350, 23388 }, + { 22351, 32043 }, + { 22352, 20180 }, + { 22353, 31869 }, + { 22354, 28371 }, + { 22355, 23376 }, + { 22356, 33258 }, + { 22357, 28173 }, + { 22358, 23383 }, + { 22359, 39683 }, + { 22360, 26837 }, + { 22361, 36394 }, + { 22362, 23447 }, + { 22363, 32508 }, + { 22364, 24635 }, + { 22365, 32437 }, + { 22366, 37049 }, + { 22367, 36208 }, + { 22368, 22863 }, + { 22369, 25549 }, + { 22370, 31199 }, + { 22371, 36275 }, + { 22372, 21330 }, + { 22373, 26063 }, + { 22374, 31062 }, + { 22375, 35781 }, + { 22376, 38459 }, + { 22377, 32452 }, + { 22378, 38075 }, + { 22379, 32386 }, + { 22380, 22068 }, + { 22381, 37257 }, + { 22382, 26368 }, + { 22383, 32618 }, + { 22384, 23562 }, + { 22385, 36981 }, + { 22386, 26152 }, + { 22387, 24038 }, + { 22388, 20304 }, + { 22389, 26590 }, + { 22390, 20570 }, + { 22391, 20316 }, + { 22392, 22352 }, + { 22393, 24231 }, + { 22561, 20109 }, + { 22562, 19980 }, + { 22563, 20800 }, + { 22564, 19984 }, + { 22565, 24319 }, + { 22566, 21317 }, + { 22567, 19989 }, + { 22568, 20120 }, + { 22569, 19998 }, + { 22570, 39730 }, + { 22571, 23404 }, + { 22572, 22121 }, + { 22573, 20008 }, + { 22574, 31162 }, + { 22575, 20031 }, + { 22576, 21269 }, + { 22577, 20039 }, + { 22578, 22829 }, + { 22579, 29243 }, + { 22580, 21358 }, + { 22581, 27664 }, + { 22582, 22239 }, + { 22583, 32996 }, + { 22584, 39319 }, + { 22585, 27603 }, + { 22586, 30590 }, + { 22587, 40727 }, + { 22588, 20022 }, + { 22589, 20127 }, + { 22590, 40720 }, + { 22591, 20060 }, + { 22592, 20073 }, + { 22593, 20115 }, + { 22594, 33416 }, + { 22595, 23387 }, + { 22596, 21868 }, + { 22597, 22031 }, + { 22598, 20164 }, + { 22599, 21389 }, + { 22600, 21405 }, + { 22601, 21411 }, + { 22602, 21413 }, + { 22603, 21422 }, + { 22604, 38757 }, + { 22605, 36189 }, + { 22606, 21274 }, + { 22607, 21493 }, + { 22608, 21286 }, + { 22609, 21294 }, + { 22610, 21310 }, + { 22611, 36188 }, + { 22612, 21350 }, + { 22613, 21347 }, + { 22614, 20994 }, + { 22615, 21000 }, + { 22616, 21006 }, + { 22617, 21037 }, + { 22618, 21043 }, + { 22619, 21055 }, + { 22620, 21056 }, + { 22621, 21068 }, + { 22622, 21086 }, + { 22623, 21089 }, + { 22624, 21084 }, + { 22625, 33967 }, + { 22626, 21117 }, + { 22627, 21122 }, + { 22628, 21121 }, + { 22629, 21136 }, + { 22630, 21139 }, + { 22631, 20866 }, + { 22632, 32596 }, + { 22633, 20155 }, + { 22634, 20163 }, + { 22635, 20169 }, + { 22636, 20162 }, + { 22637, 20200 }, + { 22638, 20193 }, + { 22639, 20203 }, + { 22640, 20190 }, + { 22641, 20251 }, + { 22642, 20211 }, + { 22643, 20258 }, + { 22644, 20324 }, + { 22645, 20213 }, + { 22646, 20261 }, + { 22647, 20263 }, + { 22648, 20233 }, + { 22649, 20267 }, + { 22650, 20318 }, + { 22651, 20327 }, + { 22652, 25912 }, + { 22653, 20314 }, + { 22654, 20317 }, + { 22817, 20319 }, + { 22818, 20311 }, + { 22819, 20274 }, + { 22820, 20285 }, + { 22821, 20342 }, + { 22822, 20340 }, + { 22823, 20369 }, + { 22824, 20361 }, + { 22825, 20355 }, + { 22826, 20367 }, + { 22827, 20350 }, + { 22828, 20347 }, + { 22829, 20394 }, + { 22830, 20348 }, + { 22831, 20396 }, + { 22832, 20372 }, + { 22833, 20454 }, + { 22834, 20456 }, + { 22835, 20458 }, + { 22836, 20421 }, + { 22837, 20442 }, + { 22838, 20451 }, + { 22839, 20444 }, + { 22840, 20433 }, + { 22841, 20447 }, + { 22842, 20472 }, + { 22843, 20521 }, + { 22844, 20556 }, + { 22845, 20467 }, + { 22846, 20524 }, + { 22847, 20495 }, + { 22848, 20526 }, + { 22849, 20525 }, + { 22850, 20478 }, + { 22851, 20508 }, + { 22852, 20492 }, + { 22853, 20517 }, + { 22854, 20520 }, + { 22855, 20606 }, + { 22856, 20547 }, + { 22857, 20565 }, + { 22858, 20552 }, + { 22859, 20558 }, + { 22860, 20588 }, + { 22861, 20603 }, + { 22862, 20645 }, + { 22863, 20647 }, + { 22864, 20649 }, + { 22865, 20666 }, + { 22866, 20694 }, + { 22867, 20742 }, + { 22868, 20717 }, + { 22869, 20716 }, + { 22870, 20710 }, + { 22871, 20718 }, + { 22872, 20743 }, + { 22873, 20747 }, + { 22874, 20189 }, + { 22875, 27709 }, + { 22876, 20312 }, + { 22877, 20325 }, + { 22878, 20430 }, + { 22879, 40864 }, + { 22880, 27718 }, + { 22881, 31860 }, + { 22882, 20846 }, + { 22883, 24061 }, + { 22884, 40649 }, + { 22885, 39320 }, + { 22886, 20865 }, + { 22887, 22804 }, + { 22888, 21241 }, + { 22889, 21261 }, + { 22890, 35335 }, + { 22891, 21264 }, + { 22892, 20971 }, + { 22893, 22809 }, + { 22894, 20821 }, + { 22895, 20128 }, + { 22896, 20822 }, + { 22897, 20147 }, + { 22898, 34926 }, + { 22899, 34980 }, + { 22900, 20149 }, + { 22901, 33044 }, + { 22902, 35026 }, + { 22903, 31104 }, + { 22904, 23348 }, + { 22905, 34819 }, + { 22906, 32696 }, + { 22907, 20907 }, + { 22908, 20913 }, + { 22909, 20925 }, + { 22910, 20924 }, + { 23073, 20935 }, + { 23074, 20886 }, + { 23075, 20898 }, + { 23076, 20901 }, + { 23077, 35744 }, + { 23078, 35750 }, + { 23079, 35751 }, + { 23080, 35754 }, + { 23081, 35764 }, + { 23082, 35765 }, + { 23083, 35767 }, + { 23084, 35778 }, + { 23085, 35779 }, + { 23086, 35787 }, + { 23087, 35791 }, + { 23088, 35790 }, + { 23089, 35794 }, + { 23090, 35795 }, + { 23091, 35796 }, + { 23092, 35798 }, + { 23093, 35800 }, + { 23094, 35801 }, + { 23095, 35804 }, + { 23096, 35807 }, + { 23097, 35808 }, + { 23098, 35812 }, + { 23099, 35816 }, + { 23100, 35817 }, + { 23101, 35822 }, + { 23102, 35824 }, + { 23103, 35827 }, + { 23104, 35830 }, + { 23105, 35833 }, + { 23106, 35836 }, + { 23107, 35839 }, + { 23108, 35840 }, + { 23109, 35842 }, + { 23110, 35844 }, + { 23111, 35847 }, + { 23112, 35852 }, + { 23113, 35855 }, + { 23114, 35857 }, + { 23115, 35858 }, + { 23116, 35860 }, + { 23117, 35861 }, + { 23118, 35862 }, + { 23119, 35865 }, + { 23120, 35867 }, + { 23121, 35864 }, + { 23122, 35869 }, + { 23123, 35871 }, + { 23124, 35872 }, + { 23125, 35873 }, + { 23126, 35877 }, + { 23127, 35879 }, + { 23128, 35882 }, + { 23129, 35883 }, + { 23130, 35886 }, + { 23131, 35887 }, + { 23132, 35890 }, + { 23133, 35891 }, + { 23134, 35893 }, + { 23135, 35894 }, + { 23136, 21353 }, + { 23137, 21370 }, + { 23138, 38429 }, + { 23139, 38434 }, + { 23140, 38433 }, + { 23141, 38449 }, + { 23142, 38442 }, + { 23143, 38461 }, + { 23144, 38460 }, + { 23145, 38466 }, + { 23146, 38473 }, + { 23147, 38484 }, + { 23148, 38495 }, + { 23149, 38503 }, + { 23150, 38508 }, + { 23151, 38514 }, + { 23152, 38516 }, + { 23153, 38536 }, + { 23154, 38541 }, + { 23155, 38551 }, + { 23156, 38576 }, + { 23157, 37015 }, + { 23158, 37019 }, + { 23159, 37021 }, + { 23160, 37017 }, + { 23161, 37036 }, + { 23162, 37025 }, + { 23163, 37044 }, + { 23164, 37043 }, + { 23165, 37046 }, + { 23166, 37050 }, + { 23329, 37048 }, + { 23330, 37040 }, + { 23331, 37071 }, + { 23332, 37061 }, + { 23333, 37054 }, + { 23334, 37072 }, + { 23335, 37060 }, + { 23336, 37063 }, + { 23337, 37075 }, + { 23338, 37094 }, + { 23339, 37090 }, + { 23340, 37084 }, + { 23341, 37079 }, + { 23342, 37083 }, + { 23343, 37099 }, + { 23344, 37103 }, + { 23345, 37118 }, + { 23346, 37124 }, + { 23347, 37154 }, + { 23348, 37150 }, + { 23349, 37155 }, + { 23350, 37169 }, + { 23351, 37167 }, + { 23352, 37177 }, + { 23353, 37187 }, + { 23354, 37190 }, + { 23355, 21005 }, + { 23356, 22850 }, + { 23357, 21154 }, + { 23358, 21164 }, + { 23359, 21165 }, + { 23360, 21182 }, + { 23361, 21759 }, + { 23362, 21200 }, + { 23363, 21206 }, + { 23364, 21232 }, + { 23365, 21471 }, + { 23366, 29166 }, + { 23367, 30669 }, + { 23368, 24308 }, + { 23369, 20981 }, + { 23370, 20988 }, + { 23371, 39727 }, + { 23372, 21430 }, + { 23373, 24321 }, + { 23374, 30042 }, + { 23375, 24047 }, + { 23376, 22348 }, + { 23377, 22441 }, + { 23378, 22433 }, + { 23379, 22654 }, + { 23380, 22716 }, + { 23381, 22725 }, + { 23382, 22737 }, + { 23383, 22313 }, + { 23384, 22316 }, + { 23385, 22314 }, + { 23386, 22323 }, + { 23387, 22329 }, + { 23388, 22318 }, + { 23389, 22319 }, + { 23390, 22364 }, + { 23391, 22331 }, + { 23392, 22338 }, + { 23393, 22377 }, + { 23394, 22405 }, + { 23395, 22379 }, + { 23396, 22406 }, + { 23397, 22396 }, + { 23398, 22395 }, + { 23399, 22376 }, + { 23400, 22381 }, + { 23401, 22390 }, + { 23402, 22387 }, + { 23403, 22445 }, + { 23404, 22436 }, + { 23405, 22412 }, + { 23406, 22450 }, + { 23407, 22479 }, + { 23408, 22439 }, + { 23409, 22452 }, + { 23410, 22419 }, + { 23411, 22432 }, + { 23412, 22485 }, + { 23413, 22488 }, + { 23414, 22490 }, + { 23415, 22489 }, + { 23416, 22482 }, + { 23417, 22456 }, + { 23418, 22516 }, + { 23419, 22511 }, + { 23420, 22520 }, + { 23421, 22500 }, + { 23422, 22493 }, + { 23585, 22539 }, + { 23586, 22541 }, + { 23587, 22525 }, + { 23588, 22509 }, + { 23589, 22528 }, + { 23590, 22558 }, + { 23591, 22553 }, + { 23592, 22596 }, + { 23593, 22560 }, + { 23594, 22629 }, + { 23595, 22636 }, + { 23596, 22657 }, + { 23597, 22665 }, + { 23598, 22682 }, + { 23599, 22656 }, + { 23600, 39336 }, + { 23601, 40729 }, + { 23602, 25087 }, + { 23603, 33401 }, + { 23604, 33405 }, + { 23605, 33407 }, + { 23606, 33423 }, + { 23607, 33418 }, + { 23608, 33448 }, + { 23609, 33412 }, + { 23610, 33422 }, + { 23611, 33425 }, + { 23612, 33431 }, + { 23613, 33433 }, + { 23614, 33451 }, + { 23615, 33464 }, + { 23616, 33470 }, + { 23617, 33456 }, + { 23618, 33480 }, + { 23619, 33482 }, + { 23620, 33507 }, + { 23621, 33432 }, + { 23622, 33463 }, + { 23623, 33454 }, + { 23624, 33483 }, + { 23625, 33484 }, + { 23626, 33473 }, + { 23627, 33449 }, + { 23628, 33460 }, + { 23629, 33441 }, + { 23630, 33450 }, + { 23631, 33439 }, + { 23632, 33476 }, + { 23633, 33486 }, + { 23634, 33444 }, + { 23635, 33505 }, + { 23636, 33545 }, + { 23637, 33527 }, + { 23638, 33508 }, + { 23639, 33551 }, + { 23640, 33543 }, + { 23641, 33500 }, + { 23642, 33524 }, + { 23643, 33490 }, + { 23644, 33496 }, + { 23645, 33548 }, + { 23646, 33531 }, + { 23647, 33491 }, + { 23648, 33553 }, + { 23649, 33562 }, + { 23650, 33542 }, + { 23651, 33556 }, + { 23652, 33557 }, + { 23653, 33504 }, + { 23654, 33493 }, + { 23655, 33564 }, + { 23656, 33617 }, + { 23657, 33627 }, + { 23658, 33628 }, + { 23659, 33544 }, + { 23660, 33682 }, + { 23661, 33596 }, + { 23662, 33588 }, + { 23663, 33585 }, + { 23664, 33691 }, + { 23665, 33630 }, + { 23666, 33583 }, + { 23667, 33615 }, + { 23668, 33607 }, + { 23669, 33603 }, + { 23670, 33631 }, + { 23671, 33600 }, + { 23672, 33559 }, + { 23673, 33632 }, + { 23674, 33581 }, + { 23675, 33594 }, + { 23676, 33587 }, + { 23677, 33638 }, + { 23678, 33637 }, + { 23841, 33640 }, + { 23842, 33563 }, + { 23843, 33641 }, + { 23844, 33644 }, + { 23845, 33642 }, + { 23846, 33645 }, + { 23847, 33646 }, + { 23848, 33712 }, + { 23849, 33656 }, + { 23850, 33715 }, + { 23851, 33716 }, + { 23852, 33696 }, + { 23853, 33706 }, + { 23854, 33683 }, + { 23855, 33692 }, + { 23856, 33669 }, + { 23857, 33660 }, + { 23858, 33718 }, + { 23859, 33705 }, + { 23860, 33661 }, + { 23861, 33720 }, + { 23862, 33659 }, + { 23863, 33688 }, + { 23864, 33694 }, + { 23865, 33704 }, + { 23866, 33722 }, + { 23867, 33724 }, + { 23868, 33729 }, + { 23869, 33793 }, + { 23870, 33765 }, + { 23871, 33752 }, + { 23872, 22535 }, + { 23873, 33816 }, + { 23874, 33803 }, + { 23875, 33757 }, + { 23876, 33789 }, + { 23877, 33750 }, + { 23878, 33820 }, + { 23879, 33848 }, + { 23880, 33809 }, + { 23881, 33798 }, + { 23882, 33748 }, + { 23883, 33759 }, + { 23884, 33807 }, + { 23885, 33795 }, + { 23886, 33784 }, + { 23887, 33785 }, + { 23888, 33770 }, + { 23889, 33733 }, + { 23890, 33728 }, + { 23891, 33830 }, + { 23892, 33776 }, + { 23893, 33761 }, + { 23894, 33884 }, + { 23895, 33873 }, + { 23896, 33882 }, + { 23897, 33881 }, + { 23898, 33907 }, + { 23899, 33927 }, + { 23900, 33928 }, + { 23901, 33914 }, + { 23902, 33929 }, + { 23903, 33912 }, + { 23904, 33852 }, + { 23905, 33862 }, + { 23906, 33897 }, + { 23907, 33910 }, + { 23908, 33932 }, + { 23909, 33934 }, + { 23910, 33841 }, + { 23911, 33901 }, + { 23912, 33985 }, + { 23913, 33997 }, + { 23914, 34000 }, + { 23915, 34022 }, + { 23916, 33981 }, + { 23917, 34003 }, + { 23918, 33994 }, + { 23919, 33983 }, + { 23920, 33978 }, + { 23921, 34016 }, + { 23922, 33953 }, + { 23923, 33977 }, + { 23924, 33972 }, + { 23925, 33943 }, + { 23926, 34021 }, + { 23927, 34019 }, + { 23928, 34060 }, + { 23929, 29965 }, + { 23930, 34104 }, + { 23931, 34032 }, + { 23932, 34105 }, + { 23933, 34079 }, + { 23934, 34106 }, + { 24097, 34134 }, + { 24098, 34107 }, + { 24099, 34047 }, + { 24100, 34044 }, + { 24101, 34137 }, + { 24102, 34120 }, + { 24103, 34152 }, + { 24104, 34148 }, + { 24105, 34142 }, + { 24106, 34170 }, + { 24107, 30626 }, + { 24108, 34115 }, + { 24109, 34162 }, + { 24110, 34171 }, + { 24111, 34212 }, + { 24112, 34216 }, + { 24113, 34183 }, + { 24114, 34191 }, + { 24115, 34169 }, + { 24116, 34222 }, + { 24117, 34204 }, + { 24118, 34181 }, + { 24119, 34233 }, + { 24120, 34231 }, + { 24121, 34224 }, + { 24122, 34259 }, + { 24123, 34241 }, + { 24124, 34268 }, + { 24125, 34303 }, + { 24126, 34343 }, + { 24127, 34309 }, + { 24128, 34345 }, + { 24129, 34326 }, + { 24130, 34364 }, + { 24131, 24318 }, + { 24132, 24328 }, + { 24133, 22844 }, + { 24134, 22849 }, + { 24135, 32823 }, + { 24136, 22869 }, + { 24137, 22874 }, + { 24138, 22872 }, + { 24139, 21263 }, + { 24140, 23586 }, + { 24141, 23589 }, + { 24142, 23596 }, + { 24143, 23604 }, + { 24144, 25164 }, + { 24145, 25194 }, + { 24146, 25247 }, + { 24147, 25275 }, + { 24148, 25290 }, + { 24149, 25306 }, + { 24150, 25303 }, + { 24151, 25326 }, + { 24152, 25378 }, + { 24153, 25334 }, + { 24154, 25401 }, + { 24155, 25419 }, + { 24156, 25411 }, + { 24157, 25517 }, + { 24158, 25590 }, + { 24159, 25457 }, + { 24160, 25466 }, + { 24161, 25486 }, + { 24162, 25524 }, + { 24163, 25453 }, + { 24164, 25516 }, + { 24165, 25482 }, + { 24166, 25449 }, + { 24167, 25518 }, + { 24168, 25532 }, + { 24169, 25586 }, + { 24170, 25592 }, + { 24171, 25568 }, + { 24172, 25599 }, + { 24173, 25540 }, + { 24174, 25566 }, + { 24175, 25550 }, + { 24176, 25682 }, + { 24177, 25542 }, + { 24178, 25534 }, + { 24179, 25669 }, + { 24180, 25665 }, + { 24181, 25611 }, + { 24182, 25627 }, + { 24183, 25632 }, + { 24184, 25612 }, + { 24185, 25638 }, + { 24186, 25633 }, + { 24187, 25694 }, + { 24188, 25732 }, + { 24189, 25709 }, + { 24190, 25750 }, + { 24353, 25722 }, + { 24354, 25783 }, + { 24355, 25784 }, + { 24356, 25753 }, + { 24357, 25786 }, + { 24358, 25792 }, + { 24359, 25808 }, + { 24360, 25815 }, + { 24361, 25828 }, + { 24362, 25826 }, + { 24363, 25865 }, + { 24364, 25893 }, + { 24365, 25902 }, + { 24366, 24331 }, + { 24367, 24530 }, + { 24368, 29977 }, + { 24369, 24337 }, + { 24370, 21343 }, + { 24371, 21489 }, + { 24372, 21501 }, + { 24373, 21481 }, + { 24374, 21480 }, + { 24375, 21499 }, + { 24376, 21522 }, + { 24377, 21526 }, + { 24378, 21510 }, + { 24379, 21579 }, + { 24380, 21586 }, + { 24381, 21587 }, + { 24382, 21588 }, + { 24383, 21590 }, + { 24384, 21571 }, + { 24385, 21537 }, + { 24386, 21591 }, + { 24387, 21593 }, + { 24388, 21539 }, + { 24389, 21554 }, + { 24390, 21634 }, + { 24391, 21652 }, + { 24392, 21623 }, + { 24393, 21617 }, + { 24394, 21604 }, + { 24395, 21658 }, + { 24396, 21659 }, + { 24397, 21636 }, + { 24398, 21622 }, + { 24399, 21606 }, + { 24400, 21661 }, + { 24401, 21712 }, + { 24402, 21677 }, + { 24403, 21698 }, + { 24404, 21684 }, + { 24405, 21714 }, + { 24406, 21671 }, + { 24407, 21670 }, + { 24408, 21715 }, + { 24409, 21716 }, + { 24410, 21618 }, + { 24411, 21667 }, + { 24412, 21717 }, + { 24413, 21691 }, + { 24414, 21695 }, + { 24415, 21708 }, + { 24416, 21721 }, + { 24417, 21722 }, + { 24418, 21724 }, + { 24419, 21673 }, + { 24420, 21674 }, + { 24421, 21668 }, + { 24422, 21725 }, + { 24423, 21711 }, + { 24424, 21726 }, + { 24425, 21787 }, + { 24426, 21735 }, + { 24427, 21792 }, + { 24428, 21757 }, + { 24429, 21780 }, + { 24430, 21747 }, + { 24431, 21794 }, + { 24432, 21795 }, + { 24433, 21775 }, + { 24434, 21777 }, + { 24435, 21799 }, + { 24436, 21802 }, + { 24437, 21863 }, + { 24438, 21903 }, + { 24439, 21941 }, + { 24440, 21833 }, + { 24441, 21869 }, + { 24442, 21825 }, + { 24443, 21845 }, + { 24444, 21823 }, + { 24445, 21840 }, + { 24446, 21820 }, + { 24609, 21815 }, + { 24610, 21846 }, + { 24611, 21877 }, + { 24612, 21878 }, + { 24613, 21879 }, + { 24614, 21811 }, + { 24615, 21808 }, + { 24616, 21852 }, + { 24617, 21899 }, + { 24618, 21970 }, + { 24619, 21891 }, + { 24620, 21937 }, + { 24621, 21945 }, + { 24622, 21896 }, + { 24623, 21889 }, + { 24624, 21919 }, + { 24625, 21886 }, + { 24626, 21974 }, + { 24627, 21905 }, + { 24628, 21883 }, + { 24629, 21983 }, + { 24630, 21949 }, + { 24631, 21950 }, + { 24632, 21908 }, + { 24633, 21913 }, + { 24634, 21994 }, + { 24635, 22007 }, + { 24636, 21961 }, + { 24637, 22047 }, + { 24638, 21969 }, + { 24639, 21995 }, + { 24640, 21996 }, + { 24641, 21972 }, + { 24642, 21990 }, + { 24643, 21981 }, + { 24644, 21956 }, + { 24645, 21999 }, + { 24646, 21989 }, + { 24647, 22002 }, + { 24648, 22003 }, + { 24649, 21964 }, + { 24650, 21965 }, + { 24651, 21992 }, + { 24652, 22005 }, + { 24653, 21988 }, + { 24654, 36756 }, + { 24655, 22046 }, + { 24656, 22024 }, + { 24657, 22028 }, + { 24658, 22017 }, + { 24659, 22052 }, + { 24660, 22051 }, + { 24661, 22014 }, + { 24662, 22016 }, + { 24663, 22055 }, + { 24664, 22061 }, + { 24665, 22104 }, + { 24666, 22073 }, + { 24667, 22103 }, + { 24668, 22060 }, + { 24669, 22093 }, + { 24670, 22114 }, + { 24671, 22105 }, + { 24672, 22108 }, + { 24673, 22092 }, + { 24674, 22100 }, + { 24675, 22150 }, + { 24676, 22116 }, + { 24677, 22129 }, + { 24678, 22123 }, + { 24679, 22139 }, + { 24680, 22140 }, + { 24681, 22149 }, + { 24682, 22163 }, + { 24683, 22191 }, + { 24684, 22228 }, + { 24685, 22231 }, + { 24686, 22237 }, + { 24687, 22241 }, + { 24688, 22261 }, + { 24689, 22251 }, + { 24690, 22265 }, + { 24691, 22271 }, + { 24692, 22276 }, + { 24693, 22282 }, + { 24694, 22281 }, + { 24695, 22300 }, + { 24696, 24079 }, + { 24697, 24089 }, + { 24698, 24084 }, + { 24699, 24081 }, + { 24700, 24113 }, + { 24701, 24123 }, + { 24702, 24124 }, + { 24865, 24119 }, + { 24866, 24132 }, + { 24867, 24148 }, + { 24868, 24155 }, + { 24869, 24158 }, + { 24870, 24161 }, + { 24871, 23692 }, + { 24872, 23674 }, + { 24873, 23693 }, + { 24874, 23696 }, + { 24875, 23702 }, + { 24876, 23688 }, + { 24877, 23704 }, + { 24878, 23705 }, + { 24879, 23697 }, + { 24880, 23706 }, + { 24881, 23708 }, + { 24882, 23733 }, + { 24883, 23714 }, + { 24884, 23741 }, + { 24885, 23724 }, + { 24886, 23723 }, + { 24887, 23729 }, + { 24888, 23715 }, + { 24889, 23745 }, + { 24890, 23735 }, + { 24891, 23748 }, + { 24892, 23762 }, + { 24893, 23780 }, + { 24894, 23755 }, + { 24895, 23781 }, + { 24896, 23810 }, + { 24897, 23811 }, + { 24898, 23847 }, + { 24899, 23846 }, + { 24900, 23854 }, + { 24901, 23844 }, + { 24902, 23838 }, + { 24903, 23814 }, + { 24904, 23835 }, + { 24905, 23896 }, + { 24906, 23870 }, + { 24907, 23860 }, + { 24908, 23869 }, + { 24909, 23916 }, + { 24910, 23899 }, + { 24911, 23919 }, + { 24912, 23901 }, + { 24913, 23915 }, + { 24914, 23883 }, + { 24915, 23882 }, + { 24916, 23913 }, + { 24917, 23924 }, + { 24918, 23938 }, + { 24919, 23961 }, + { 24920, 23965 }, + { 24921, 35955 }, + { 24922, 23991 }, + { 24923, 24005 }, + { 24924, 24435 }, + { 24925, 24439 }, + { 24926, 24450 }, + { 24927, 24455 }, + { 24928, 24457 }, + { 24929, 24460 }, + { 24930, 24469 }, + { 24931, 24473 }, + { 24932, 24476 }, + { 24933, 24488 }, + { 24934, 24493 }, + { 24935, 24501 }, + { 24936, 24508 }, + { 24937, 34914 }, + { 24938, 24417 }, + { 24939, 29357 }, + { 24940, 29360 }, + { 24941, 29364 }, + { 24942, 29367 }, + { 24943, 29368 }, + { 24944, 29379 }, + { 24945, 29377 }, + { 24946, 29390 }, + { 24947, 29389 }, + { 24948, 29394 }, + { 24949, 29416 }, + { 24950, 29423 }, + { 24951, 29417 }, + { 24952, 29426 }, + { 24953, 29428 }, + { 24954, 29431 }, + { 24955, 29441 }, + { 24956, 29427 }, + { 24957, 29443 }, + { 24958, 29434 }, + { 25121, 29435 }, + { 25122, 29463 }, + { 25123, 29459 }, + { 25124, 29473 }, + { 25125, 29450 }, + { 25126, 29470 }, + { 25127, 29469 }, + { 25128, 29461 }, + { 25129, 29474 }, + { 25130, 29497 }, + { 25131, 29477 }, + { 25132, 29484 }, + { 25133, 29496 }, + { 25134, 29489 }, + { 25135, 29520 }, + { 25136, 29517 }, + { 25137, 29527 }, + { 25138, 29536 }, + { 25139, 29548 }, + { 25140, 29551 }, + { 25141, 29566 }, + { 25142, 33307 }, + { 25143, 22821 }, + { 25144, 39143 }, + { 25145, 22820 }, + { 25146, 22786 }, + { 25147, 39267 }, + { 25148, 39271 }, + { 25149, 39272 }, + { 25150, 39273 }, + { 25151, 39274 }, + { 25152, 39275 }, + { 25153, 39276 }, + { 25154, 39284 }, + { 25155, 39287 }, + { 25156, 39293 }, + { 25157, 39296 }, + { 25158, 39300 }, + { 25159, 39303 }, + { 25160, 39306 }, + { 25161, 39309 }, + { 25162, 39312 }, + { 25163, 39313 }, + { 25164, 39315 }, + { 25165, 39316 }, + { 25166, 39317 }, + { 25167, 24192 }, + { 25168, 24209 }, + { 25169, 24203 }, + { 25170, 24214 }, + { 25171, 24229 }, + { 25172, 24224 }, + { 25173, 24249 }, + { 25174, 24245 }, + { 25175, 24254 }, + { 25176, 24243 }, + { 25177, 36179 }, + { 25178, 24274 }, + { 25179, 24273 }, + { 25180, 24283 }, + { 25181, 24296 }, + { 25182, 24298 }, + { 25183, 33210 }, + { 25184, 24516 }, + { 25185, 24521 }, + { 25186, 24534 }, + { 25187, 24527 }, + { 25188, 24579 }, + { 25189, 24558 }, + { 25190, 24580 }, + { 25191, 24545 }, + { 25192, 24548 }, + { 25193, 24574 }, + { 25194, 24581 }, + { 25195, 24582 }, + { 25196, 24554 }, + { 25197, 24557 }, + { 25198, 24568 }, + { 25199, 24601 }, + { 25200, 24629 }, + { 25201, 24614 }, + { 25202, 24603 }, + { 25203, 24591 }, + { 25204, 24589 }, + { 25205, 24617 }, + { 25206, 24619 }, + { 25207, 24586 }, + { 25208, 24639 }, + { 25209, 24609 }, + { 25210, 24696 }, + { 25211, 24697 }, + { 25212, 24699 }, + { 25213, 24698 }, + { 25214, 24642 }, + { 25377, 24682 }, + { 25378, 24701 }, + { 25379, 24726 }, + { 25380, 24730 }, + { 25381, 24749 }, + { 25382, 24733 }, + { 25383, 24707 }, + { 25384, 24722 }, + { 25385, 24716 }, + { 25386, 24731 }, + { 25387, 24812 }, + { 25388, 24763 }, + { 25389, 24753 }, + { 25390, 24797 }, + { 25391, 24792 }, + { 25392, 24774 }, + { 25393, 24794 }, + { 25394, 24756 }, + { 25395, 24864 }, + { 25396, 24870 }, + { 25397, 24853 }, + { 25398, 24867 }, + { 25399, 24820 }, + { 25400, 24832 }, + { 25401, 24846 }, + { 25402, 24875 }, + { 25403, 24906 }, + { 25404, 24949 }, + { 25405, 25004 }, + { 25406, 24980 }, + { 25407, 24999 }, + { 25408, 25015 }, + { 25409, 25044 }, + { 25410, 25077 }, + { 25411, 24541 }, + { 25412, 38579 }, + { 25413, 38377 }, + { 25414, 38379 }, + { 25415, 38385 }, + { 25416, 38387 }, + { 25417, 38389 }, + { 25418, 38390 }, + { 25419, 38396 }, + { 25420, 38398 }, + { 25421, 38403 }, + { 25422, 38404 }, + { 25423, 38406 }, + { 25424, 38408 }, + { 25425, 38410 }, + { 25426, 38411 }, + { 25427, 38412 }, + { 25428, 38413 }, + { 25429, 38415 }, + { 25430, 38418 }, + { 25431, 38421 }, + { 25432, 38422 }, + { 25433, 38423 }, + { 25434, 38425 }, + { 25435, 38426 }, + { 25436, 20012 }, + { 25437, 29247 }, + { 25438, 25109 }, + { 25439, 27701 }, + { 25440, 27732 }, + { 25441, 27740 }, + { 25442, 27722 }, + { 25443, 27811 }, + { 25444, 27781 }, + { 25445, 27792 }, + { 25446, 27796 }, + { 25447, 27788 }, + { 25448, 27752 }, + { 25449, 27753 }, + { 25450, 27764 }, + { 25451, 27766 }, + { 25452, 27782 }, + { 25453, 27817 }, + { 25454, 27856 }, + { 25455, 27860 }, + { 25456, 27821 }, + { 25457, 27895 }, + { 25458, 27896 }, + { 25459, 27889 }, + { 25460, 27863 }, + { 25461, 27826 }, + { 25462, 27872 }, + { 25463, 27862 }, + { 25464, 27898 }, + { 25465, 27883 }, + { 25466, 27886 }, + { 25467, 27825 }, + { 25468, 27859 }, + { 25469, 27887 }, + { 25470, 27902 }, + { 25633, 27961 }, + { 25634, 27943 }, + { 25635, 27916 }, + { 25636, 27971 }, + { 25637, 27976 }, + { 25638, 27911 }, + { 25639, 27908 }, + { 25640, 27929 }, + { 25641, 27918 }, + { 25642, 27947 }, + { 25643, 27981 }, + { 25644, 27950 }, + { 25645, 27957 }, + { 25646, 27930 }, + { 25647, 27983 }, + { 25648, 27986 }, + { 25649, 27988 }, + { 25650, 27955 }, + { 25651, 28049 }, + { 25652, 28015 }, + { 25653, 28062 }, + { 25654, 28064 }, + { 25655, 27998 }, + { 25656, 28051 }, + { 25657, 28052 }, + { 25658, 27996 }, + { 25659, 28000 }, + { 25660, 28028 }, + { 25661, 28003 }, + { 25662, 28186 }, + { 25663, 28103 }, + { 25664, 28101 }, + { 25665, 28126 }, + { 25666, 28174 }, + { 25667, 28095 }, + { 25668, 28128 }, + { 25669, 28177 }, + { 25670, 28134 }, + { 25671, 28125 }, + { 25672, 28121 }, + { 25673, 28182 }, + { 25674, 28075 }, + { 25675, 28172 }, + { 25676, 28078 }, + { 25677, 28203 }, + { 25678, 28270 }, + { 25679, 28238 }, + { 25680, 28267 }, + { 25681, 28338 }, + { 25682, 28255 }, + { 25683, 28294 }, + { 25684, 28243 }, + { 25685, 28244 }, + { 25686, 28210 }, + { 25687, 28197 }, + { 25688, 28228 }, + { 25689, 28383 }, + { 25690, 28337 }, + { 25691, 28312 }, + { 25692, 28384 }, + { 25693, 28461 }, + { 25694, 28386 }, + { 25695, 28325 }, + { 25696, 28327 }, + { 25697, 28349 }, + { 25698, 28347 }, + { 25699, 28343 }, + { 25700, 28375 }, + { 25701, 28340 }, + { 25702, 28367 }, + { 25703, 28303 }, + { 25704, 28354 }, + { 25705, 28319 }, + { 25706, 28514 }, + { 25707, 28486 }, + { 25708, 28487 }, + { 25709, 28452 }, + { 25710, 28437 }, + { 25711, 28409 }, + { 25712, 28463 }, + { 25713, 28470 }, + { 25714, 28491 }, + { 25715, 28532 }, + { 25716, 28458 }, + { 25717, 28425 }, + { 25718, 28457 }, + { 25719, 28553 }, + { 25720, 28557 }, + { 25721, 28556 }, + { 25722, 28536 }, + { 25723, 28530 }, + { 25724, 28540 }, + { 25725, 28538 }, + { 25726, 28625 }, + { 25889, 28617 }, + { 25890, 28583 }, + { 25891, 28601 }, + { 25892, 28598 }, + { 25893, 28610 }, + { 25894, 28641 }, + { 25895, 28654 }, + { 25896, 28638 }, + { 25897, 28640 }, + { 25898, 28655 }, + { 25899, 28698 }, + { 25900, 28707 }, + { 25901, 28699 }, + { 25902, 28729 }, + { 25903, 28725 }, + { 25904, 28751 }, + { 25905, 28766 }, + { 25906, 23424 }, + { 25907, 23428 }, + { 25908, 23445 }, + { 25909, 23443 }, + { 25910, 23461 }, + { 25911, 23480 }, + { 25912, 29999 }, + { 25913, 39582 }, + { 25914, 25652 }, + { 25915, 23524 }, + { 25916, 23534 }, + { 25917, 35120 }, + { 25918, 23536 }, + { 25919, 36423 }, + { 25920, 35591 }, + { 25921, 36790 }, + { 25922, 36819 }, + { 25923, 36821 }, + { 25924, 36837 }, + { 25925, 36846 }, + { 25926, 36836 }, + { 25927, 36841 }, + { 25928, 36838 }, + { 25929, 36851 }, + { 25930, 36840 }, + { 25931, 36869 }, + { 25932, 36868 }, + { 25933, 36875 }, + { 25934, 36902 }, + { 25935, 36881 }, + { 25936, 36877 }, + { 25937, 36886 }, + { 25938, 36897 }, + { 25939, 36917 }, + { 25940, 36918 }, + { 25941, 36909 }, + { 25942, 36911 }, + { 25943, 36932 }, + { 25944, 36945 }, + { 25945, 36946 }, + { 25946, 36944 }, + { 25947, 36968 }, + { 25948, 36952 }, + { 25949, 36962 }, + { 25950, 36955 }, + { 25951, 26297 }, + { 25952, 36980 }, + { 25953, 36989 }, + { 25954, 36994 }, + { 25955, 37000 }, + { 25956, 36995 }, + { 25957, 37003 }, + { 25958, 24400 }, + { 25959, 24407 }, + { 25960, 24406 }, + { 25961, 24408 }, + { 25962, 23611 }, + { 25963, 21675 }, + { 25964, 23632 }, + { 25965, 23641 }, + { 25966, 23409 }, + { 25967, 23651 }, + { 25968, 23654 }, + { 25969, 32700 }, + { 25970, 24362 }, + { 25971, 24361 }, + { 25972, 24365 }, + { 25973, 33396 }, + { 25974, 24380 }, + { 25975, 39739 }, + { 25976, 23662 }, + { 25977, 22913 }, + { 25978, 22915 }, + { 25979, 22925 }, + { 25980, 22953 }, + { 25981, 22954 }, + { 25982, 22947 }, + { 26145, 22935 }, + { 26146, 22986 }, + { 26147, 22955 }, + { 26148, 22942 }, + { 26149, 22948 }, + { 26150, 22994 }, + { 26151, 22962 }, + { 26152, 22959 }, + { 26153, 22999 }, + { 26154, 22974 }, + { 26155, 23045 }, + { 26156, 23046 }, + { 26157, 23005 }, + { 26158, 23048 }, + { 26159, 23011 }, + { 26160, 23000 }, + { 26161, 23033 }, + { 26162, 23052 }, + { 26163, 23049 }, + { 26164, 23090 }, + { 26165, 23092 }, + { 26166, 23057 }, + { 26167, 23075 }, + { 26168, 23059 }, + { 26169, 23104 }, + { 26170, 23143 }, + { 26171, 23114 }, + { 26172, 23125 }, + { 26173, 23100 }, + { 26174, 23138 }, + { 26175, 23157 }, + { 26176, 33004 }, + { 26177, 23210 }, + { 26178, 23195 }, + { 26179, 23159 }, + { 26180, 23162 }, + { 26181, 23230 }, + { 26182, 23275 }, + { 26183, 23218 }, + { 26184, 23250 }, + { 26185, 23252 }, + { 26186, 23224 }, + { 26187, 23264 }, + { 26188, 23267 }, + { 26189, 23281 }, + { 26190, 23254 }, + { 26191, 23270 }, + { 26192, 23256 }, + { 26193, 23260 }, + { 26194, 23305 }, + { 26195, 23319 }, + { 26196, 23318 }, + { 26197, 23346 }, + { 26198, 23351 }, + { 26199, 23360 }, + { 26200, 23573 }, + { 26201, 23580 }, + { 26202, 23386 }, + { 26203, 23397 }, + { 26204, 23411 }, + { 26205, 23377 }, + { 26206, 23379 }, + { 26207, 23394 }, + { 26208, 39541 }, + { 26209, 39543 }, + { 26210, 39544 }, + { 26211, 39546 }, + { 26212, 39551 }, + { 26213, 39549 }, + { 26214, 39552 }, + { 26215, 39553 }, + { 26216, 39557 }, + { 26217, 39560 }, + { 26218, 39562 }, + { 26219, 39568 }, + { 26220, 39570 }, + { 26221, 39571 }, + { 26222, 39574 }, + { 26223, 39576 }, + { 26224, 39579 }, + { 26225, 39580 }, + { 26226, 39581 }, + { 26227, 39583 }, + { 26228, 39584 }, + { 26229, 39586 }, + { 26230, 39587 }, + { 26231, 39589 }, + { 26232, 39591 }, + { 26233, 32415 }, + { 26234, 32417 }, + { 26235, 32419 }, + { 26236, 32421 }, + { 26237, 32424 }, + { 26238, 32425 }, + { 26401, 32429 }, + { 26402, 32432 }, + { 26403, 32446 }, + { 26404, 32448 }, + { 26405, 32449 }, + { 26406, 32450 }, + { 26407, 32457 }, + { 26408, 32459 }, + { 26409, 32460 }, + { 26410, 32464 }, + { 26411, 32468 }, + { 26412, 32471 }, + { 26413, 32475 }, + { 26414, 32480 }, + { 26415, 32481 }, + { 26416, 32488 }, + { 26417, 32491 }, + { 26418, 32494 }, + { 26419, 32495 }, + { 26420, 32497 }, + { 26421, 32498 }, + { 26422, 32525 }, + { 26423, 32502 }, + { 26424, 32506 }, + { 26425, 32507 }, + { 26426, 32510 }, + { 26427, 32513 }, + { 26428, 32514 }, + { 26429, 32515 }, + { 26430, 32519 }, + { 26431, 32520 }, + { 26432, 32523 }, + { 26433, 32524 }, + { 26434, 32527 }, + { 26435, 32529 }, + { 26436, 32530 }, + { 26437, 32535 }, + { 26438, 32537 }, + { 26439, 32540 }, + { 26440, 32539 }, + { 26441, 32543 }, + { 26442, 32545 }, + { 26443, 32546 }, + { 26444, 32547 }, + { 26445, 32548 }, + { 26446, 32549 }, + { 26447, 32550 }, + { 26448, 32551 }, + { 26449, 32554 }, + { 26450, 32555 }, + { 26451, 32556 }, + { 26452, 32557 }, + { 26453, 32559 }, + { 26454, 32560 }, + { 26455, 32561 }, + { 26456, 32562 }, + { 26457, 32563 }, + { 26458, 32565 }, + { 26459, 24186 }, + { 26460, 30079 }, + { 26461, 24027 }, + { 26462, 30014 }, + { 26463, 37013 }, + { 26464, 29582 }, + { 26465, 29585 }, + { 26466, 29614 }, + { 26467, 29602 }, + { 26468, 29599 }, + { 26469, 29647 }, + { 26470, 29634 }, + { 26471, 29649 }, + { 26472, 29623 }, + { 26473, 29619 }, + { 26474, 29632 }, + { 26475, 29641 }, + { 26476, 29640 }, + { 26477, 29669 }, + { 26478, 29657 }, + { 26479, 39036 }, + { 26480, 29706 }, + { 26481, 29673 }, + { 26482, 29671 }, + { 26483, 29662 }, + { 26484, 29626 }, + { 26485, 29682 }, + { 26486, 29711 }, + { 26487, 29738 }, + { 26488, 29787 }, + { 26489, 29734 }, + { 26490, 29733 }, + { 26491, 29736 }, + { 26492, 29744 }, + { 26493, 29742 }, + { 26494, 29740 }, + { 26657, 29723 }, + { 26658, 29722 }, + { 26659, 29761 }, + { 26660, 29788 }, + { 26661, 29783 }, + { 26662, 29781 }, + { 26663, 29785 }, + { 26664, 29815 }, + { 26665, 29805 }, + { 26666, 29822 }, + { 26667, 29852 }, + { 26668, 29838 }, + { 26669, 29824 }, + { 26670, 29825 }, + { 26671, 29831 }, + { 26672, 29835 }, + { 26673, 29854 }, + { 26674, 29864 }, + { 26675, 29865 }, + { 26676, 29840 }, + { 26677, 29863 }, + { 26678, 29906 }, + { 26679, 29882 }, + { 26680, 38890 }, + { 26681, 38891 }, + { 26682, 38892 }, + { 26683, 26444 }, + { 26684, 26451 }, + { 26685, 26462 }, + { 26686, 26440 }, + { 26687, 26473 }, + { 26688, 26533 }, + { 26689, 26503 }, + { 26690, 26474 }, + { 26691, 26483 }, + { 26692, 26520 }, + { 26693, 26535 }, + { 26694, 26485 }, + { 26695, 26536 }, + { 26696, 26526 }, + { 26697, 26541 }, + { 26698, 26507 }, + { 26699, 26487 }, + { 26700, 26492 }, + { 26701, 26608 }, + { 26702, 26633 }, + { 26703, 26584 }, + { 26704, 26634 }, + { 26705, 26601 }, + { 26706, 26544 }, + { 26707, 26636 }, + { 26708, 26585 }, + { 26709, 26549 }, + { 26710, 26586 }, + { 26711, 26547 }, + { 26712, 26589 }, + { 26713, 26624 }, + { 26714, 26563 }, + { 26715, 26552 }, + { 26716, 26594 }, + { 26717, 26638 }, + { 26718, 26561 }, + { 26719, 26621 }, + { 26720, 26674 }, + { 26721, 26675 }, + { 26722, 26720 }, + { 26723, 26721 }, + { 26724, 26702 }, + { 26725, 26722 }, + { 26726, 26692 }, + { 26727, 26724 }, + { 26728, 26755 }, + { 26729, 26653 }, + { 26730, 26709 }, + { 26731, 26726 }, + { 26732, 26689 }, + { 26733, 26727 }, + { 26734, 26688 }, + { 26735, 26686 }, + { 26736, 26698 }, + { 26737, 26697 }, + { 26738, 26665 }, + { 26739, 26805 }, + { 26740, 26767 }, + { 26741, 26740 }, + { 26742, 26743 }, + { 26743, 26771 }, + { 26744, 26731 }, + { 26745, 26818 }, + { 26746, 26990 }, + { 26747, 26876 }, + { 26748, 26911 }, + { 26749, 26912 }, + { 26750, 26873 }, + { 26913, 26916 }, + { 26914, 26864 }, + { 26915, 26891 }, + { 26916, 26881 }, + { 26917, 26967 }, + { 26918, 26851 }, + { 26919, 26896 }, + { 26920, 26993 }, + { 26921, 26937 }, + { 26922, 26976 }, + { 26923, 26946 }, + { 26924, 26973 }, + { 26925, 27012 }, + { 26926, 26987 }, + { 26927, 27008 }, + { 26928, 27032 }, + { 26929, 27000 }, + { 26930, 26932 }, + { 26931, 27084 }, + { 26932, 27015 }, + { 26933, 27016 }, + { 26934, 27086 }, + { 26935, 27017 }, + { 26936, 26982 }, + { 26937, 26979 }, + { 26938, 27001 }, + { 26939, 27035 }, + { 26940, 27047 }, + { 26941, 27067 }, + { 26942, 27051 }, + { 26943, 27053 }, + { 26944, 27092 }, + { 26945, 27057 }, + { 26946, 27073 }, + { 26947, 27082 }, + { 26948, 27103 }, + { 26949, 27029 }, + { 26950, 27104 }, + { 26951, 27021 }, + { 26952, 27135 }, + { 26953, 27183 }, + { 26954, 27117 }, + { 26955, 27159 }, + { 26956, 27160 }, + { 26957, 27237 }, + { 26958, 27122 }, + { 26959, 27204 }, + { 26960, 27198 }, + { 26961, 27296 }, + { 26962, 27216 }, + { 26963, 27227 }, + { 26964, 27189 }, + { 26965, 27278 }, + { 26966, 27257 }, + { 26967, 27197 }, + { 26968, 27176 }, + { 26969, 27224 }, + { 26970, 27260 }, + { 26971, 27281 }, + { 26972, 27280 }, + { 26973, 27305 }, + { 26974, 27287 }, + { 26975, 27307 }, + { 26976, 29495 }, + { 26977, 29522 }, + { 26978, 27521 }, + { 26979, 27522 }, + { 26980, 27527 }, + { 26981, 27524 }, + { 26982, 27538 }, + { 26983, 27539 }, + { 26984, 27533 }, + { 26985, 27546 }, + { 26986, 27547 }, + { 26987, 27553 }, + { 26988, 27562 }, + { 26989, 36715 }, + { 26990, 36717 }, + { 26991, 36721 }, + { 26992, 36722 }, + { 26993, 36723 }, + { 26994, 36725 }, + { 26995, 36726 }, + { 26996, 36728 }, + { 26997, 36727 }, + { 26998, 36729 }, + { 26999, 36730 }, + { 27000, 36732 }, + { 27001, 36734 }, + { 27002, 36737 }, + { 27003, 36738 }, + { 27004, 36740 }, + { 27005, 36743 }, + { 27006, 36747 }, + { 27169, 36749 }, + { 27170, 36750 }, + { 27171, 36751 }, + { 27172, 36760 }, + { 27173, 36762 }, + { 27174, 36558 }, + { 27175, 25099 }, + { 27176, 25111 }, + { 27177, 25115 }, + { 27178, 25119 }, + { 27179, 25122 }, + { 27180, 25121 }, + { 27181, 25125 }, + { 27182, 25124 }, + { 27183, 25132 }, + { 27184, 33255 }, + { 27185, 29935 }, + { 27186, 29940 }, + { 27187, 29951 }, + { 27188, 29967 }, + { 27189, 29969 }, + { 27190, 29971 }, + { 27191, 25908 }, + { 27192, 26094 }, + { 27193, 26095 }, + { 27194, 26096 }, + { 27195, 26122 }, + { 27196, 26137 }, + { 27197, 26482 }, + { 27198, 26115 }, + { 27199, 26133 }, + { 27200, 26112 }, + { 27201, 28805 }, + { 27202, 26359 }, + { 27203, 26141 }, + { 27204, 26164 }, + { 27205, 26161 }, + { 27206, 26166 }, + { 27207, 26165 }, + { 27208, 32774 }, + { 27209, 26207 }, + { 27210, 26196 }, + { 27211, 26177 }, + { 27212, 26191 }, + { 27213, 26198 }, + { 27214, 26209 }, + { 27215, 26199 }, + { 27216, 26231 }, + { 27217, 26244 }, + { 27218, 26252 }, + { 27219, 26279 }, + { 27220, 26269 }, + { 27221, 26302 }, + { 27222, 26331 }, + { 27223, 26332 }, + { 27224, 26342 }, + { 27225, 26345 }, + { 27226, 36146 }, + { 27227, 36147 }, + { 27228, 36150 }, + { 27229, 36155 }, + { 27230, 36157 }, + { 27231, 36160 }, + { 27232, 36165 }, + { 27233, 36166 }, + { 27234, 36168 }, + { 27235, 36169 }, + { 27236, 36167 }, + { 27237, 36173 }, + { 27238, 36181 }, + { 27239, 36185 }, + { 27240, 35271 }, + { 27241, 35274 }, + { 27242, 35275 }, + { 27243, 35276 }, + { 27244, 35278 }, + { 27245, 35279 }, + { 27246, 35280 }, + { 27247, 35281 }, + { 27248, 29294 }, + { 27249, 29343 }, + { 27250, 29277 }, + { 27251, 29286 }, + { 27252, 29295 }, + { 27253, 29310 }, + { 27254, 29311 }, + { 27255, 29316 }, + { 27256, 29323 }, + { 27257, 29325 }, + { 27258, 29327 }, + { 27259, 29330 }, + { 27260, 25352 }, + { 27261, 25394 }, + { 27262, 25520 }, + { 27425, 25663 }, + { 27426, 25816 }, + { 27427, 32772 }, + { 27428, 27626 }, + { 27429, 27635 }, + { 27430, 27645 }, + { 27431, 27637 }, + { 27432, 27641 }, + { 27433, 27653 }, + { 27434, 27655 }, + { 27435, 27654 }, + { 27436, 27661 }, + { 27437, 27669 }, + { 27438, 27672 }, + { 27439, 27673 }, + { 27440, 27674 }, + { 27441, 27681 }, + { 27442, 27689 }, + { 27443, 27684 }, + { 27444, 27690 }, + { 27445, 27698 }, + { 27446, 25909 }, + { 27447, 25941 }, + { 27448, 25963 }, + { 27449, 29261 }, + { 27450, 29266 }, + { 27451, 29270 }, + { 27452, 29232 }, + { 27453, 34402 }, + { 27454, 21014 }, + { 27455, 32927 }, + { 27456, 32924 }, + { 27457, 32915 }, + { 27458, 32956 }, + { 27459, 26378 }, + { 27460, 32957 }, + { 27461, 32945 }, + { 27462, 32939 }, + { 27463, 32941 }, + { 27464, 32948 }, + { 27465, 32951 }, + { 27466, 32999 }, + { 27467, 33000 }, + { 27468, 33001 }, + { 27469, 33002 }, + { 27470, 32987 }, + { 27471, 32962 }, + { 27472, 32964 }, + { 27473, 32985 }, + { 27474, 32973 }, + { 27475, 32983 }, + { 27476, 26384 }, + { 27477, 32989 }, + { 27478, 33003 }, + { 27479, 33009 }, + { 27480, 33012 }, + { 27481, 33005 }, + { 27482, 33037 }, + { 27483, 33038 }, + { 27484, 33010 }, + { 27485, 33020 }, + { 27486, 26389 }, + { 27487, 33042 }, + { 27488, 35930 }, + { 27489, 33078 }, + { 27490, 33054 }, + { 27491, 33068 }, + { 27492, 33048 }, + { 27493, 33074 }, + { 27494, 33096 }, + { 27495, 33100 }, + { 27496, 33107 }, + { 27497, 33140 }, + { 27498, 33113 }, + { 27499, 33114 }, + { 27500, 33137 }, + { 27501, 33120 }, + { 27502, 33129 }, + { 27503, 33148 }, + { 27504, 33149 }, + { 27505, 33133 }, + { 27506, 33127 }, + { 27507, 22605 }, + { 27508, 23221 }, + { 27509, 33160 }, + { 27510, 33154 }, + { 27511, 33169 }, + { 27512, 28373 }, + { 27513, 33187 }, + { 27514, 33194 }, + { 27515, 33228 }, + { 27516, 26406 }, + { 27517, 33226 }, + { 27518, 33211 }, + { 27681, 33217 }, + { 27682, 33190 }, + { 27683, 27428 }, + { 27684, 27447 }, + { 27685, 27449 }, + { 27686, 27459 }, + { 27687, 27462 }, + { 27688, 27481 }, + { 27689, 39121 }, + { 27690, 39122 }, + { 27691, 39123 }, + { 27692, 39125 }, + { 27693, 39129 }, + { 27694, 39130 }, + { 27695, 27571 }, + { 27696, 24384 }, + { 27697, 27586 }, + { 27698, 35315 }, + { 27699, 26000 }, + { 27700, 40785 }, + { 27701, 26003 }, + { 27702, 26044 }, + { 27703, 26054 }, + { 27704, 26052 }, + { 27705, 26051 }, + { 27706, 26060 }, + { 27707, 26062 }, + { 27708, 26066 }, + { 27709, 26070 }, + { 27710, 28800 }, + { 27711, 28828 }, + { 27712, 28822 }, + { 27713, 28829 }, + { 27714, 28859 }, + { 27715, 28864 }, + { 27716, 28855 }, + { 27717, 28843 }, + { 27718, 28849 }, + { 27719, 28904 }, + { 27720, 28874 }, + { 27721, 28944 }, + { 27722, 28947 }, + { 27723, 28950 }, + { 27724, 28975 }, + { 27725, 28977 }, + { 27726, 29043 }, + { 27727, 29020 }, + { 27728, 29032 }, + { 27729, 28997 }, + { 27730, 29042 }, + { 27731, 29002 }, + { 27732, 29048 }, + { 27733, 29050 }, + { 27734, 29080 }, + { 27735, 29107 }, + { 27736, 29109 }, + { 27737, 29096 }, + { 27738, 29088 }, + { 27739, 29152 }, + { 27740, 29140 }, + { 27741, 29159 }, + { 27742, 29177 }, + { 27743, 29213 }, + { 27744, 29224 }, + { 27745, 28780 }, + { 27746, 28952 }, + { 27747, 29030 }, + { 27748, 29113 }, + { 27749, 25150 }, + { 27750, 25149 }, + { 27751, 25155 }, + { 27752, 25160 }, + { 27753, 25161 }, + { 27754, 31035 }, + { 27755, 31040 }, + { 27756, 31046 }, + { 27757, 31049 }, + { 27758, 31067 }, + { 27759, 31068 }, + { 27760, 31059 }, + { 27761, 31066 }, + { 27762, 31074 }, + { 27763, 31063 }, + { 27764, 31072 }, + { 27765, 31087 }, + { 27766, 31079 }, + { 27767, 31098 }, + { 27768, 31109 }, + { 27769, 31114 }, + { 27770, 31130 }, + { 27771, 31143 }, + { 27772, 31155 }, + { 27773, 24529 }, + { 27774, 24528 }, + { 27937, 24636 }, + { 27938, 24669 }, + { 27939, 24666 }, + { 27940, 24679 }, + { 27941, 24641 }, + { 27942, 24665 }, + { 27943, 24675 }, + { 27944, 24747 }, + { 27945, 24838 }, + { 27946, 24845 }, + { 27947, 24925 }, + { 27948, 25001 }, + { 27949, 24989 }, + { 27950, 25035 }, + { 27951, 25041 }, + { 27952, 25094 }, + { 27953, 32896 }, + { 27954, 32895 }, + { 27955, 27795 }, + { 27956, 27894 }, + { 27957, 28156 }, + { 27958, 30710 }, + { 27959, 30712 }, + { 27960, 30720 }, + { 27961, 30729 }, + { 27962, 30743 }, + { 27963, 30744 }, + { 27964, 30737 }, + { 27965, 26027 }, + { 27966, 30765 }, + { 27967, 30748 }, + { 27968, 30749 }, + { 27969, 30777 }, + { 27970, 30778 }, + { 27971, 30779 }, + { 27972, 30751 }, + { 27973, 30780 }, + { 27974, 30757 }, + { 27975, 30764 }, + { 27976, 30755 }, + { 27977, 30761 }, + { 27978, 30798 }, + { 27979, 30829 }, + { 27980, 30806 }, + { 27981, 30807 }, + { 27982, 30758 }, + { 27983, 30800 }, + { 27984, 30791 }, + { 27985, 30796 }, + { 27986, 30826 }, + { 27987, 30875 }, + { 27988, 30867 }, + { 27989, 30874 }, + { 27990, 30855 }, + { 27991, 30876 }, + { 27992, 30881 }, + { 27993, 30883 }, + { 27994, 30898 }, + { 27995, 30905 }, + { 27996, 30885 }, + { 27997, 30932 }, + { 27998, 30937 }, + { 27999, 30921 }, + { 28000, 30956 }, + { 28001, 30962 }, + { 28002, 30981 }, + { 28003, 30964 }, + { 28004, 30995 }, + { 28005, 31012 }, + { 28006, 31006 }, + { 28007, 31028 }, + { 28008, 40859 }, + { 28009, 40697 }, + { 28010, 40699 }, + { 28011, 40700 }, + { 28012, 30449 }, + { 28013, 30468 }, + { 28014, 30477 }, + { 28015, 30457 }, + { 28016, 30471 }, + { 28017, 30472 }, + { 28018, 30490 }, + { 28019, 30498 }, + { 28020, 30489 }, + { 28021, 30509 }, + { 28022, 30502 }, + { 28023, 30517 }, + { 28024, 30520 }, + { 28025, 30544 }, + { 28026, 30545 }, + { 28027, 30535 }, + { 28028, 30531 }, + { 28029, 30554 }, + { 28030, 30568 }, + { 28193, 30562 }, + { 28194, 30565 }, + { 28195, 30591 }, + { 28196, 30605 }, + { 28197, 30589 }, + { 28198, 30592 }, + { 28199, 30604 }, + { 28200, 30609 }, + { 28201, 30623 }, + { 28202, 30624 }, + { 28203, 30640 }, + { 28204, 30645 }, + { 28205, 30653 }, + { 28206, 30010 }, + { 28207, 30016 }, + { 28208, 30030 }, + { 28209, 30027 }, + { 28210, 30024 }, + { 28211, 30043 }, + { 28212, 30066 }, + { 28213, 30073 }, + { 28214, 30083 }, + { 28215, 32600 }, + { 28216, 32609 }, + { 28217, 32607 }, + { 28218, 35400 }, + { 28219, 32616 }, + { 28220, 32628 }, + { 28221, 32625 }, + { 28222, 32633 }, + { 28223, 32641 }, + { 28224, 32638 }, + { 28225, 30413 }, + { 28226, 30437 }, + { 28227, 34866 }, + { 28228, 38021 }, + { 28229, 38022 }, + { 28230, 38023 }, + { 28231, 38027 }, + { 28232, 38026 }, + { 28233, 38028 }, + { 28234, 38029 }, + { 28235, 38031 }, + { 28236, 38032 }, + { 28237, 38036 }, + { 28238, 38039 }, + { 28239, 38037 }, + { 28240, 38042 }, + { 28241, 38043 }, + { 28242, 38044 }, + { 28243, 38051 }, + { 28244, 38052 }, + { 28245, 38059 }, + { 28246, 38058 }, + { 28247, 38061 }, + { 28248, 38060 }, + { 28249, 38063 }, + { 28250, 38064 }, + { 28251, 38066 }, + { 28252, 38068 }, + { 28253, 38070 }, + { 28254, 38071 }, + { 28255, 38072 }, + { 28256, 38073 }, + { 28257, 38074 }, + { 28258, 38076 }, + { 28259, 38077 }, + { 28260, 38079 }, + { 28261, 38084 }, + { 28262, 38088 }, + { 28263, 38089 }, + { 28264, 38090 }, + { 28265, 38091 }, + { 28266, 38092 }, + { 28267, 38093 }, + { 28268, 38094 }, + { 28269, 38096 }, + { 28270, 38097 }, + { 28271, 38098 }, + { 28272, 38101 }, + { 28273, 38102 }, + { 28274, 38103 }, + { 28275, 38105 }, + { 28276, 38104 }, + { 28277, 38107 }, + { 28278, 38110 }, + { 28279, 38111 }, + { 28280, 38112 }, + { 28281, 38114 }, + { 28282, 38116 }, + { 28283, 38117 }, + { 28284, 38119 }, + { 28285, 38120 }, + { 28286, 38122 }, + { 28449, 38121 }, + { 28450, 38123 }, + { 28451, 38126 }, + { 28452, 38127 }, + { 28453, 38131 }, + { 28454, 38132 }, + { 28455, 38133 }, + { 28456, 38135 }, + { 28457, 38137 }, + { 28458, 38140 }, + { 28459, 38141 }, + { 28460, 38143 }, + { 28461, 38147 }, + { 28462, 38146 }, + { 28463, 38150 }, + { 28464, 38151 }, + { 28465, 38153 }, + { 28466, 38154 }, + { 28467, 38157 }, + { 28468, 38158 }, + { 28469, 38159 }, + { 28470, 38162 }, + { 28471, 38163 }, + { 28472, 38164 }, + { 28473, 38165 }, + { 28474, 38166 }, + { 28475, 38168 }, + { 28476, 38171 }, + { 28477, 38173 }, + { 28478, 38174 }, + { 28479, 38175 }, + { 28480, 38178 }, + { 28481, 38186 }, + { 28482, 38187 }, + { 28483, 38185 }, + { 28484, 38188 }, + { 28485, 38193 }, + { 28486, 38194 }, + { 28487, 38196 }, + { 28488, 38198 }, + { 28489, 38199 }, + { 28490, 38200 }, + { 28491, 38204 }, + { 28492, 38206 }, + { 28493, 38207 }, + { 28494, 38210 }, + { 28495, 38197 }, + { 28496, 38212 }, + { 28497, 38213 }, + { 28498, 38214 }, + { 28499, 38217 }, + { 28500, 38220 }, + { 28501, 38222 }, + { 28502, 38223 }, + { 28503, 38226 }, + { 28504, 38227 }, + { 28505, 38228 }, + { 28506, 38230 }, + { 28507, 38231 }, + { 28508, 38232 }, + { 28509, 38233 }, + { 28510, 38235 }, + { 28511, 38238 }, + { 28512, 38239 }, + { 28513, 38237 }, + { 28514, 38241 }, + { 28515, 38242 }, + { 28516, 38244 }, + { 28517, 38245 }, + { 28518, 38246 }, + { 28519, 38247 }, + { 28520, 38248 }, + { 28521, 38249 }, + { 28522, 38250 }, + { 28523, 38251 }, + { 28524, 38252 }, + { 28525, 38255 }, + { 28526, 38257 }, + { 28527, 38258 }, + { 28528, 38259 }, + { 28529, 38202 }, + { 28530, 30695 }, + { 28531, 30700 }, + { 28532, 38601 }, + { 28533, 31189 }, + { 28534, 31213 }, + { 28535, 31203 }, + { 28536, 31211 }, + { 28537, 31238 }, + { 28538, 23879 }, + { 28539, 31235 }, + { 28540, 31234 }, + { 28541, 31262 }, + { 28542, 31252 }, + { 28705, 31289 }, + { 28706, 31287 }, + { 28707, 31313 }, + { 28708, 40655 }, + { 28709, 39333 }, + { 28710, 31344 }, + { 28711, 30344 }, + { 28712, 30350 }, + { 28713, 30355 }, + { 28714, 30361 }, + { 28715, 30372 }, + { 28716, 29918 }, + { 28717, 29920 }, + { 28718, 29996 }, + { 28719, 40480 }, + { 28720, 40482 }, + { 28721, 40488 }, + { 28722, 40489 }, + { 28723, 40490 }, + { 28724, 40491 }, + { 28725, 40492 }, + { 28726, 40498 }, + { 28727, 40497 }, + { 28728, 40502 }, + { 28729, 40504 }, + { 28730, 40503 }, + { 28731, 40505 }, + { 28732, 40506 }, + { 28733, 40510 }, + { 28734, 40513 }, + { 28735, 40514 }, + { 28736, 40516 }, + { 28737, 40518 }, + { 28738, 40519 }, + { 28739, 40520 }, + { 28740, 40521 }, + { 28741, 40523 }, + { 28742, 40524 }, + { 28743, 40526 }, + { 28744, 40529 }, + { 28745, 40533 }, + { 28746, 40535 }, + { 28747, 40538 }, + { 28748, 40539 }, + { 28749, 40540 }, + { 28750, 40542 }, + { 28751, 40547 }, + { 28752, 40550 }, + { 28753, 40551 }, + { 28754, 40552 }, + { 28755, 40553 }, + { 28756, 40554 }, + { 28757, 40555 }, + { 28758, 40556 }, + { 28759, 40561 }, + { 28760, 40557 }, + { 28761, 40563 }, + { 28762, 30098 }, + { 28763, 30100 }, + { 28764, 30102 }, + { 28765, 30112 }, + { 28766, 30109 }, + { 28767, 30124 }, + { 28768, 30115 }, + { 28769, 30131 }, + { 28770, 30132 }, + { 28771, 30136 }, + { 28772, 30148 }, + { 28773, 30129 }, + { 28774, 30128 }, + { 28775, 30147 }, + { 28776, 30146 }, + { 28777, 30166 }, + { 28778, 30157 }, + { 28779, 30179 }, + { 28780, 30184 }, + { 28781, 30182 }, + { 28782, 30180 }, + { 28783, 30187 }, + { 28784, 30183 }, + { 28785, 30211 }, + { 28786, 30193 }, + { 28787, 30204 }, + { 28788, 30207 }, + { 28789, 30224 }, + { 28790, 30208 }, + { 28791, 30213 }, + { 28792, 30220 }, + { 28793, 30231 }, + { 28794, 30218 }, + { 28795, 30245 }, + { 28796, 30232 }, + { 28797, 30229 }, + { 28798, 30233 }, + { 28961, 30235 }, + { 28962, 30268 }, + { 28963, 30242 }, + { 28964, 30240 }, + { 28965, 30272 }, + { 28966, 30253 }, + { 28967, 30256 }, + { 28968, 30271 }, + { 28969, 30261 }, + { 28970, 30275 }, + { 28971, 30270 }, + { 28972, 30259 }, + { 28973, 30285 }, + { 28974, 30302 }, + { 28975, 30292 }, + { 28976, 30300 }, + { 28977, 30294 }, + { 28978, 30315 }, + { 28979, 30319 }, + { 28980, 32714 }, + { 28981, 31462 }, + { 28982, 31352 }, + { 28983, 31353 }, + { 28984, 31360 }, + { 28985, 31366 }, + { 28986, 31368 }, + { 28987, 31381 }, + { 28988, 31398 }, + { 28989, 31392 }, + { 28990, 31404 }, + { 28991, 31400 }, + { 28992, 31405 }, + { 28993, 31411 }, + { 28994, 34916 }, + { 28995, 34921 }, + { 28996, 34930 }, + { 28997, 34941 }, + { 28998, 34943 }, + { 28999, 34946 }, + { 29000, 34978 }, + { 29001, 35014 }, + { 29002, 34999 }, + { 29003, 35004 }, + { 29004, 35017 }, + { 29005, 35042 }, + { 29006, 35022 }, + { 29007, 35043 }, + { 29008, 35045 }, + { 29009, 35057 }, + { 29010, 35098 }, + { 29011, 35068 }, + { 29012, 35048 }, + { 29013, 35070 }, + { 29014, 35056 }, + { 29015, 35105 }, + { 29016, 35097 }, + { 29017, 35091 }, + { 29018, 35099 }, + { 29019, 35082 }, + { 29020, 35124 }, + { 29021, 35115 }, + { 29022, 35126 }, + { 29023, 35137 }, + { 29024, 35174 }, + { 29025, 35195 }, + { 29026, 30091 }, + { 29027, 32997 }, + { 29028, 30386 }, + { 29029, 30388 }, + { 29030, 30684 }, + { 29031, 32786 }, + { 29032, 32788 }, + { 29033, 32790 }, + { 29034, 32796 }, + { 29035, 32800 }, + { 29036, 32802 }, + { 29037, 32805 }, + { 29038, 32806 }, + { 29039, 32807 }, + { 29040, 32809 }, + { 29041, 32808 }, + { 29042, 32817 }, + { 29043, 32779 }, + { 29044, 32821 }, + { 29045, 32835 }, + { 29046, 32838 }, + { 29047, 32845 }, + { 29048, 32850 }, + { 29049, 32873 }, + { 29050, 32881 }, + { 29051, 35203 }, + { 29052, 39032 }, + { 29053, 39040 }, + { 29054, 39043 }, + { 29217, 39049 }, + { 29218, 39052 }, + { 29219, 39053 }, + { 29220, 39055 }, + { 29221, 39060 }, + { 29222, 39066 }, + { 29223, 39067 }, + { 29224, 39070 }, + { 29225, 39071 }, + { 29226, 39073 }, + { 29227, 39074 }, + { 29228, 39077 }, + { 29229, 39078 }, + { 29230, 34381 }, + { 29231, 34388 }, + { 29232, 34412 }, + { 29233, 34414 }, + { 29234, 34431 }, + { 29235, 34426 }, + { 29236, 34428 }, + { 29237, 34427 }, + { 29238, 34472 }, + { 29239, 34445 }, + { 29240, 34443 }, + { 29241, 34476 }, + { 29242, 34461 }, + { 29243, 34471 }, + { 29244, 34467 }, + { 29245, 34474 }, + { 29246, 34451 }, + { 29247, 34473 }, + { 29248, 34486 }, + { 29249, 34500 }, + { 29250, 34485 }, + { 29251, 34510 }, + { 29252, 34480 }, + { 29253, 34490 }, + { 29254, 34481 }, + { 29255, 34479 }, + { 29256, 34505 }, + { 29257, 34511 }, + { 29258, 34484 }, + { 29259, 34537 }, + { 29260, 34545 }, + { 29261, 34546 }, + { 29262, 34541 }, + { 29263, 34547 }, + { 29264, 34512 }, + { 29265, 34579 }, + { 29266, 34526 }, + { 29267, 34548 }, + { 29268, 34527 }, + { 29269, 34520 }, + { 29270, 34513 }, + { 29271, 34563 }, + { 29272, 34567 }, + { 29273, 34552 }, + { 29274, 34568 }, + { 29275, 34570 }, + { 29276, 34573 }, + { 29277, 34569 }, + { 29278, 34595 }, + { 29279, 34619 }, + { 29280, 34590 }, + { 29281, 34597 }, + { 29282, 34606 }, + { 29283, 34586 }, + { 29284, 34622 }, + { 29285, 34632 }, + { 29286, 34612 }, + { 29287, 34609 }, + { 29288, 34601 }, + { 29289, 34615 }, + { 29290, 34623 }, + { 29291, 34690 }, + { 29292, 34594 }, + { 29293, 34685 }, + { 29294, 34686 }, + { 29295, 34683 }, + { 29296, 34656 }, + { 29297, 34672 }, + { 29298, 34636 }, + { 29299, 34670 }, + { 29300, 34699 }, + { 29301, 34643 }, + { 29302, 34659 }, + { 29303, 34684 }, + { 29304, 34660 }, + { 29305, 34649 }, + { 29306, 34661 }, + { 29307, 34707 }, + { 29308, 34735 }, + { 29309, 34728 }, + { 29310, 34770 }, + { 29473, 34758 }, + { 29474, 34696 }, + { 29475, 34693 }, + { 29476, 34733 }, + { 29477, 34711 }, + { 29478, 34691 }, + { 29479, 34731 }, + { 29480, 34789 }, + { 29481, 34732 }, + { 29482, 34741 }, + { 29483, 34739 }, + { 29484, 34763 }, + { 29485, 34771 }, + { 29486, 34749 }, + { 29487, 34769 }, + { 29488, 34752 }, + { 29489, 34762 }, + { 29490, 34779 }, + { 29491, 34794 }, + { 29492, 34784 }, + { 29493, 34798 }, + { 29494, 34838 }, + { 29495, 34835 }, + { 29496, 34814 }, + { 29497, 34826 }, + { 29498, 34843 }, + { 29499, 34849 }, + { 29500, 34873 }, + { 29501, 34876 }, + { 29502, 32566 }, + { 29503, 32578 }, + { 29504, 32580 }, + { 29505, 32581 }, + { 29506, 33296 }, + { 29507, 31482 }, + { 29508, 31485 }, + { 29509, 31496 }, + { 29510, 31491 }, + { 29511, 31492 }, + { 29512, 31509 }, + { 29513, 31498 }, + { 29514, 31531 }, + { 29515, 31503 }, + { 29516, 31559 }, + { 29517, 31544 }, + { 29518, 31530 }, + { 29519, 31513 }, + { 29520, 31534 }, + { 29521, 31537 }, + { 29522, 31520 }, + { 29523, 31525 }, + { 29524, 31524 }, + { 29525, 31539 }, + { 29526, 31550 }, + { 29527, 31518 }, + { 29528, 31576 }, + { 29529, 31578 }, + { 29530, 31557 }, + { 29531, 31605 }, + { 29532, 31564 }, + { 29533, 31581 }, + { 29534, 31584 }, + { 29535, 31598 }, + { 29536, 31611 }, + { 29537, 31586 }, + { 29538, 31602 }, + { 29539, 31601 }, + { 29540, 31632 }, + { 29541, 31654 }, + { 29542, 31655 }, + { 29543, 31672 }, + { 29544, 31660 }, + { 29545, 31645 }, + { 29546, 31656 }, + { 29547, 31621 }, + { 29548, 31658 }, + { 29549, 31644 }, + { 29550, 31650 }, + { 29551, 31659 }, + { 29552, 31668 }, + { 29553, 31697 }, + { 29554, 31681 }, + { 29555, 31692 }, + { 29556, 31709 }, + { 29557, 31706 }, + { 29558, 31717 }, + { 29559, 31718 }, + { 29560, 31722 }, + { 29561, 31756 }, + { 29562, 31742 }, + { 29563, 31740 }, + { 29564, 31759 }, + { 29565, 31766 }, + { 29566, 31755 }, + { 29729, 31775 }, + { 29730, 31786 }, + { 29731, 31782 }, + { 29732, 31800 }, + { 29733, 31809 }, + { 29734, 31808 }, + { 29735, 33278 }, + { 29736, 33281 }, + { 29737, 33282 }, + { 29738, 33284 }, + { 29739, 33260 }, + { 29740, 34884 }, + { 29741, 33313 }, + { 29742, 33314 }, + { 29743, 33315 }, + { 29744, 33325 }, + { 29745, 33327 }, + { 29746, 33320 }, + { 29747, 33323 }, + { 29748, 33336 }, + { 29749, 33339 }, + { 29750, 33331 }, + { 29751, 33332 }, + { 29752, 33342 }, + { 29753, 33348 }, + { 29754, 33353 }, + { 29755, 33355 }, + { 29756, 33359 }, + { 29757, 33370 }, + { 29758, 33375 }, + { 29759, 33384 }, + { 29760, 34942 }, + { 29761, 34949 }, + { 29762, 34952 }, + { 29763, 35032 }, + { 29764, 35039 }, + { 29765, 35166 }, + { 29766, 32669 }, + { 29767, 32671 }, + { 29768, 32679 }, + { 29769, 32687 }, + { 29770, 32688 }, + { 29771, 32690 }, + { 29772, 31868 }, + { 29773, 25929 }, + { 29774, 31889 }, + { 29775, 31901 }, + { 29776, 31900 }, + { 29777, 31902 }, + { 29778, 31906 }, + { 29779, 31922 }, + { 29780, 31932 }, + { 29781, 31933 }, + { 29782, 31937 }, + { 29783, 31943 }, + { 29784, 31948 }, + { 29785, 31949 }, + { 29786, 31944 }, + { 29787, 31941 }, + { 29788, 31959 }, + { 29789, 31976 }, + { 29790, 33390 }, + { 29791, 26280 }, + { 29792, 32703 }, + { 29793, 32718 }, + { 29794, 32725 }, + { 29795, 32741 }, + { 29796, 32737 }, + { 29797, 32742 }, + { 29798, 32745 }, + { 29799, 32750 }, + { 29800, 32755 }, + { 29801, 31992 }, + { 29802, 32119 }, + { 29803, 32166 }, + { 29804, 32174 }, + { 29805, 32327 }, + { 29806, 32411 }, + { 29807, 40632 }, + { 29808, 40628 }, + { 29809, 36211 }, + { 29810, 36228 }, + { 29811, 36244 }, + { 29812, 36241 }, + { 29813, 36273 }, + { 29814, 36199 }, + { 29815, 36205 }, + { 29816, 35911 }, + { 29817, 35913 }, + { 29818, 37194 }, + { 29819, 37200 }, + { 29820, 37198 }, + { 29821, 37199 }, + { 29822, 37220 }, + { 29985, 37218 }, + { 29986, 37217 }, + { 29987, 37232 }, + { 29988, 37225 }, + { 29989, 37231 }, + { 29990, 37245 }, + { 29991, 37246 }, + { 29992, 37234 }, + { 29993, 37236 }, + { 29994, 37241 }, + { 29995, 37260 }, + { 29996, 37253 }, + { 29997, 37264 }, + { 29998, 37261 }, + { 29999, 37265 }, + { 30000, 37282 }, + { 30001, 37283 }, + { 30002, 37290 }, + { 30003, 37293 }, + { 30004, 37294 }, + { 30005, 37295 }, + { 30006, 37301 }, + { 30007, 37300 }, + { 30008, 37306 }, + { 30009, 35925 }, + { 30010, 40574 }, + { 30011, 36280 }, + { 30012, 36331 }, + { 30013, 36357 }, + { 30014, 36441 }, + { 30015, 36457 }, + { 30016, 36277 }, + { 30017, 36287 }, + { 30018, 36284 }, + { 30019, 36282 }, + { 30020, 36292 }, + { 30021, 36310 }, + { 30022, 36311 }, + { 30023, 36314 }, + { 30024, 36318 }, + { 30025, 36302 }, + { 30026, 36303 }, + { 30027, 36315 }, + { 30028, 36294 }, + { 30029, 36332 }, + { 30030, 36343 }, + { 30031, 36344 }, + { 30032, 36323 }, + { 30033, 36345 }, + { 30034, 36347 }, + { 30035, 36324 }, + { 30036, 36361 }, + { 30037, 36349 }, + { 30038, 36372 }, + { 30039, 36381 }, + { 30040, 36383 }, + { 30041, 36396 }, + { 30042, 36398 }, + { 30043, 36387 }, + { 30044, 36399 }, + { 30045, 36410 }, + { 30046, 36416 }, + { 30047, 36409 }, + { 30048, 36405 }, + { 30049, 36413 }, + { 30050, 36401 }, + { 30051, 36425 }, + { 30052, 36417 }, + { 30053, 36418 }, + { 30054, 36433 }, + { 30055, 36434 }, + { 30056, 36426 }, + { 30057, 36464 }, + { 30058, 36470 }, + { 30059, 36476 }, + { 30060, 36463 }, + { 30061, 36468 }, + { 30062, 36485 }, + { 30063, 36495 }, + { 30064, 36500 }, + { 30065, 36496 }, + { 30066, 36508 }, + { 30067, 36510 }, + { 30068, 35960 }, + { 30069, 35970 }, + { 30070, 35978 }, + { 30071, 35973 }, + { 30072, 35992 }, + { 30073, 35988 }, + { 30074, 26011 }, + { 30075, 35286 }, + { 30076, 35294 }, + { 30077, 35290 }, + { 30078, 35292 }, + { 30241, 35301 }, + { 30242, 35307 }, + { 30243, 35311 }, + { 30244, 35390 }, + { 30245, 35622 }, + { 30246, 38739 }, + { 30247, 38633 }, + { 30248, 38643 }, + { 30249, 38639 }, + { 30250, 38662 }, + { 30251, 38657 }, + { 30252, 38664 }, + { 30253, 38671 }, + { 30254, 38670 }, + { 30255, 38698 }, + { 30256, 38701 }, + { 30257, 38704 }, + { 30258, 38718 }, + { 30259, 40832 }, + { 30260, 40835 }, + { 30261, 40837 }, + { 30262, 40838 }, + { 30263, 40839 }, + { 30264, 40840 }, + { 30265, 40841 }, + { 30266, 40842 }, + { 30267, 40844 }, + { 30268, 40702 }, + { 30269, 40715 }, + { 30270, 40717 }, + { 30271, 38585 }, + { 30272, 38588 }, + { 30273, 38589 }, + { 30274, 38606 }, + { 30275, 38610 }, + { 30276, 30655 }, + { 30277, 38624 }, + { 30278, 37518 }, + { 30279, 37550 }, + { 30280, 37576 }, + { 30281, 37694 }, + { 30282, 37738 }, + { 30283, 37834 }, + { 30284, 37775 }, + { 30285, 37950 }, + { 30286, 37995 }, + { 30287, 40063 }, + { 30288, 40066 }, + { 30289, 40069 }, + { 30290, 40070 }, + { 30291, 40071 }, + { 30292, 40072 }, + { 30293, 31267 }, + { 30294, 40075 }, + { 30295, 40078 }, + { 30296, 40080 }, + { 30297, 40081 }, + { 30298, 40082 }, + { 30299, 40084 }, + { 30300, 40085 }, + { 30301, 40090 }, + { 30302, 40091 }, + { 30303, 40094 }, + { 30304, 40095 }, + { 30305, 40096 }, + { 30306, 40097 }, + { 30307, 40098 }, + { 30308, 40099 }, + { 30309, 40101 }, + { 30310, 40102 }, + { 30311, 40103 }, + { 30312, 40104 }, + { 30313, 40105 }, + { 30314, 40107 }, + { 30315, 40109 }, + { 30316, 40110 }, + { 30317, 40112 }, + { 30318, 40113 }, + { 30319, 40114 }, + { 30320, 40115 }, + { 30321, 40116 }, + { 30322, 40117 }, + { 30323, 40118 }, + { 30324, 40119 }, + { 30325, 40122 }, + { 30326, 40123 }, + { 30327, 40124 }, + { 30328, 40125 }, + { 30329, 40132 }, + { 30330, 40133 }, + { 30331, 40134 }, + { 30332, 40135 }, + { 30333, 40138 }, + { 30334, 40139 }, + { 30497, 40140 }, + { 30498, 40141 }, + { 30499, 40142 }, + { 30500, 40143 }, + { 30501, 40144 }, + { 30502, 40147 }, + { 30503, 40148 }, + { 30504, 40149 }, + { 30505, 40151 }, + { 30506, 40152 }, + { 30507, 40153 }, + { 30508, 40156 }, + { 30509, 40157 }, + { 30510, 40159 }, + { 30511, 40162 }, + { 30512, 38780 }, + { 30513, 38789 }, + { 30514, 38801 }, + { 30515, 38802 }, + { 30516, 38804 }, + { 30517, 38831 }, + { 30518, 38827 }, + { 30519, 38819 }, + { 30520, 38834 }, + { 30521, 38836 }, + { 30522, 39601 }, + { 30523, 39600 }, + { 30524, 39607 }, + { 30525, 40536 }, + { 30526, 39606 }, + { 30527, 39610 }, + { 30528, 39612 }, + { 30529, 39617 }, + { 30530, 39616 }, + { 30531, 39621 }, + { 30532, 39618 }, + { 30533, 39627 }, + { 30534, 39628 }, + { 30535, 39633 }, + { 30536, 39749 }, + { 30537, 39747 }, + { 30538, 39751 }, + { 30539, 39753 }, + { 30540, 39752 }, + { 30541, 39757 }, + { 30542, 39761 }, + { 30543, 39144 }, + { 30544, 39181 }, + { 30545, 39214 }, + { 30546, 39253 }, + { 30547, 39252 }, + { 30548, 39647 }, + { 30549, 39649 }, + { 30550, 39654 }, + { 30551, 39663 }, + { 30552, 39659 }, + { 30553, 39675 }, + { 30554, 39661 }, + { 30555, 39673 }, + { 30556, 39688 }, + { 30557, 39695 }, + { 30558, 39699 }, + { 30559, 39711 }, + { 30560, 39715 }, + { 30561, 40637 }, + { 30562, 40638 }, + { 30563, 32315 }, + { 30564, 40578 }, + { 30565, 40583 }, + { 30566, 40584 }, + { 30567, 40587 }, + { 30568, 40594 }, + { 30569, 37846 }, + { 30570, 40605 }, + { 30571, 40607 }, + { 30572, 40667 }, + { 30573, 40668 }, + { 30574, 40669 }, + { 30575, 40672 }, + { 30576, 40671 }, + { 30577, 40674 }, + { 30578, 40681 }, + { 30579, 40679 }, + { 30580, 40677 }, + { 30581, 40682 }, + { 30582, 40687 }, + { 30583, 40738 }, + { 30584, 40748 }, + { 30585, 40751 }, + { 30586, 40761 }, + { 30587, 40759 }, + { 30588, 40765 }, + { 30589, 40766 }, + { 30590, 40772 }, +}; diff --git a/src/localisation/language.c b/src/localisation/language.c index 56eff314bf..619021ba61 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -99,6 +99,9 @@ uint32 utf8_get_next(const utf8 *char_ptr, const utf8 **nextchar_ptr) } else if ((char_ptr[0] & 0xF0) == 0xE0) { result = ((char_ptr[0] & 0x0F) << 12) | ((char_ptr[1] & 0x3F) << 6) | (char_ptr[2] & 0x3F); numBytes = 3; + } else if ((char_ptr[0] & 0xF8) == 0xF0) { + result = ((char_ptr[0] & 0x07) << 18) | ((char_ptr[1] & 0x3F) << 12) | ((char_ptr[1] & 0x3F) << 6) | (char_ptr[2] & 0x3F); + numBytes = 4; } else { // TODO 4 bytes result = ' '; @@ -384,6 +387,8 @@ static utf8 *convert_multibyte_charset(const char *src) uint8 a = *ch++; uint8 b = *ch++; uint16 codepoint = (a << 8) | b; + + codepoint = encoding_convert_gb2312_to_unicode(codepoint - 0x8080); dst = utf8_write_codepoint(dst, codepoint); } else { *dst++ = *ch++; @@ -391,7 +396,8 @@ static utf8 *convert_multibyte_charset(const char *src) } *dst++ = 0; int actualLength = dst - buffer; - return realloc(buffer, actualLength); + buffer = realloc(buffer, actualLength); + return buffer; } static bool rct2_language_is_multibyte_charset(int languageId) diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 659eae6a28..7f981db1c7 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -180,7 +180,7 @@ int utf8_get_sprite_offset_for_codepoint(int codepoint) case FORMAT_TICK: return 172 - 32; case FORMAT_CROSS: return 173 - 32; default: - if (codepoint > 224) codepoint = ' '; + if (codepoint > 224) codepoint = 'W'; return codepoint - 32; } } @@ -797,6 +797,36 @@ void generate_string_file() fclose(f); } +utf8 *get_string_end(utf8 *text) +{ + int codepoint; + const utf8 *ch = text; + + while ((codepoint = utf8_get_next(ch, &ch)) != 0) { + if (utf8_is_format_code(codepoint)) { + switch (codepoint) { + case FORMAT_MOVE_X: + case FORMAT_ADJUST_PALETTE: + case 3: + case 4: + ch++; + break; + case FORMAT_INLINE_SPRITE: + ch += 4; + break; + default: + if (codepoint <= 22) { + ch += 2; + } else { + ch += 4; + } + break; + } + } + } + return ch - 1; +} + /** * Return the length of the string in buffer. * note you can't use strlen as there can be inline sprites! diff --git a/src/localisation/localisation.h b/src/localisation/localisation.h index e6c31049cf..0bb6c27918 100644 --- a/src/localisation/localisation.h +++ b/src/localisation/localisation.h @@ -35,6 +35,7 @@ void format_string_raw(char *dest, char *src, void *args); void format_string_to_upper(char *dest, rct_string_id format, void *args); void generate_string_file(); void error_string_quit(int error, rct_string_id format); +utf8 *get_string_end(utf8 *text); int get_string_length(const utf8* buffer); void user_string_clear_all(); @@ -45,6 +46,8 @@ bool is_user_string_id(rct_string_id stringId); utf8 *win1252_to_utf8_alloc(const char *src); int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength); +wchar_t encoding_convert_gb2312_to_unicode(wchar_t gb2312); + #define MAX_USER_STRINGS 1024 #define USER_STRING_MAX_LENGTH 32 From f14187f89d604321128d55ca149168260afaefbc Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 27 Jul 2015 15:12:36 +0100 Subject: [PATCH 0409/1173] implement utf8, part 7 --- projects/openrct2.vcxproj.user | 9 +- src/localisation/convert.c | 13724 +++++++++++++++++++++++++++++- src/localisation/language.c | 26 +- src/localisation/language.h | 1 + src/localisation/localisation.c | 2 +- src/localisation/localisation.h | 1 + 6 files changed, 13753 insertions(+), 10 deletions(-) diff --git a/projects/openrct2.vcxproj.user b/projects/openrct2.vcxproj.user index da4d8aed24..093ce205e6 100644 --- a/projects/openrct2.vcxproj.user +++ b/projects/openrct2.vcxproj.user @@ -4,13 +4,15 @@ $(TargetDir) WindowsLocalDebugger $(TargetDir)\openrct2.exe - "C:\Program Files (x86)\Infogrames\RollerCoaster Tycoon 2\Scenarios\Electric Fields.SC6" + + $(TargetDir) WindowsLocalDebugger $(TargetDir)\openrct2.exe - "C:\Program Files (x86)\Infogrames\RollerCoaster Tycoon 2\Scenarios\Electric Fields.SC6" + + false @@ -19,6 +21,7 @@ $(TargetDir)\openrct2.exe WindowsLocalDebugger $(TargetDir) - "C:\Program Files (x86)\Infogrames\RollerCoaster Tycoon 2\Scenarios\Electric Fields.SC6" + + \ No newline at end of file diff --git a/src/localisation/convert.c b/src/localisation/convert.c index ddb36e39e7..fe77e039d9 100644 --- a/src/localisation/convert.c +++ b/src/localisation/convert.c @@ -6,6 +6,7 @@ typedef struct { } encoding_convert_entry; static const encoding_convert_entry GB2312ToUnicodeTable[7445]; +static const encoding_convert_entry Big5ToUnicodeTable[13710]; static int encoding_search_compare(const void *pKey, const void *pEntry) { @@ -25,7 +26,12 @@ static wchar_t encoding_convert_x_to_unicode(wchar_t code, const encoding_conver wchar_t encoding_convert_gb2312_to_unicode(wchar_t gb2312) { - return encoding_convert_x_to_unicode(gb2312, GB2312ToUnicodeTable, countof(GB2312ToUnicodeTable)); + return encoding_convert_x_to_unicode(gb2312 - 0x8080, GB2312ToUnicodeTable, countof(GB2312ToUnicodeTable)); +} + +wchar_t encoding_convert_big5_to_unicode(wchar_t big5) +{ + return encoding_convert_x_to_unicode(big5, Big5ToUnicodeTable, countof(Big5ToUnicodeTable)); } static const encoding_convert_entry GB2312ToUnicodeTable[7445] = { @@ -7475,3 +7481,13719 @@ static const encoding_convert_entry GB2312ToUnicodeTable[7445] = { { 30589, 40766 }, { 30590, 40772 }, }; + +static const encoding_convert_entry Big5ToUnicodeTable[13710] = { + { 0xA140, 0x3000 }, + { 0xA141, 0xFF0C }, + { 0xA142, 0x3001 }, + { 0xA143, 0x3002 }, + { 0xA144, 0xFF0E }, + { 0xA145, 0x2022 }, + { 0xA146, 0xFF1B }, + { 0xA147, 0xFF1A }, + { 0xA148, 0xFF1F }, + { 0xA149, 0xFF01 }, + { 0xA14A, 0xFE30 }, + { 0xA14B, 0x2026 }, + { 0xA14C, 0x2025 }, + { 0xA14D, 0xFE50 }, + { 0xA14E, 0xFF64 }, + { 0xA14F, 0xFE52 }, + { 0xA150, 0x00B7 }, + { 0xA151, 0xFE54 }, + { 0xA152, 0xFE55 }, + { 0xA153, 0xFE56 }, + { 0xA154, 0xFE57 }, + { 0xA155, 0xFF5C }, + { 0xA156, 0x2013 }, + { 0xA157, 0xFE31 }, + { 0xA158, 0x2014 }, + { 0xA159, 0xFE33 }, + { 0xA15A, 0xFFFD }, + { 0xA15B, 0xFE34 }, + { 0xA15C, 0xFE4F }, + { 0xA15D, 0xFF08 }, + { 0xA15E, 0xFF09 }, + { 0xA15F, 0xFE35 }, + { 0xA160, 0xFE36 }, + { 0xA161, 0xFF5B }, + { 0xA162, 0xFF5D }, + { 0xA163, 0xFE37 }, + { 0xA164, 0xFE38 }, + { 0xA165, 0x3014 }, + { 0xA166, 0x3015 }, + { 0xA167, 0xFE39 }, + { 0xA168, 0xFE3A }, + { 0xA169, 0x3010 }, + { 0xA16A, 0x3011 }, + { 0xA16B, 0xFE3B }, + { 0xA16C, 0xFE3C }, + { 0xA16D, 0x300A }, + { 0xA16E, 0x300B }, + { 0xA16F, 0xFE3D }, + { 0xA170, 0xFE3E }, + { 0xA171, 0x3008 }, + { 0xA172, 0x3009 }, + { 0xA173, 0xFE3F }, + { 0xA174, 0xFE40 }, + { 0xA175, 0x300C }, + { 0xA176, 0x300D }, + { 0xA177, 0xFE41 }, + { 0xA178, 0xFE42 }, + { 0xA179, 0x300E }, + { 0xA17A, 0x300F }, + { 0xA17B, 0xFE43 }, + { 0xA17C, 0xFE44 }, + { 0xA17D, 0xFE59 }, + { 0xA17E, 0xFE5A }, + { 0xA1A1, 0xFE5B }, + { 0xA1A2, 0xFE5C }, + { 0xA1A3, 0xFE5D }, + { 0xA1A4, 0xFE5E }, + { 0xA1A5, 0x2018 }, + { 0xA1A6, 0x2019 }, + { 0xA1A7, 0x201C }, + { 0xA1A8, 0x201D }, + { 0xA1A9, 0x301D }, + { 0xA1AA, 0x301E }, + { 0xA1AB, 0x2035 }, + { 0xA1AC, 0x2032 }, + { 0xA1AD, 0xFF03 }, + { 0xA1AE, 0xFF06 }, + { 0xA1AF, 0xFF0A }, + { 0xA1B0, 0x203B }, + { 0xA1B1, 0x00A7 }, + { 0xA1B2, 0x3003 }, + { 0xA1B3, 0x25CB }, + { 0xA1B4, 0x25CF }, + { 0xA1B5, 0x25B3 }, + { 0xA1B6, 0x25B2 }, + { 0xA1B7, 0x25CE }, + { 0xA1B8, 0x2606 }, + { 0xA1B9, 0x2605 }, + { 0xA1BA, 0x25C7 }, + { 0xA1BB, 0x25C6 }, + { 0xA1BC, 0x25A1 }, + { 0xA1BD, 0x25A0 }, + { 0xA1BE, 0x25BD }, + { 0xA1BF, 0x25BC }, + { 0xA1C0, 0x32A3 }, + { 0xA1C1, 0x2105 }, + { 0xA1C2, 0x203E }, + { 0xA1C3, 0xFFFD }, + { 0xA1C4, 0xFF3F }, + { 0xA1C5, 0xFFFD }, + { 0xA1C6, 0xFE49 }, + { 0xA1C7, 0xFE4A }, + { 0xA1C8, 0xFE4D }, + { 0xA1C9, 0xFE4E }, + { 0xA1CA, 0xFE4B }, + { 0xA1CB, 0xFE4C }, + { 0xA1CC, 0xFE5F }, + { 0xA1CD, 0xFE60 }, + { 0xA1CE, 0xFE61 }, + { 0xA1CF, 0xFF0B }, + { 0xA1D0, 0xFF0D }, + { 0xA1D1, 0x00D7 }, + { 0xA1D2, 0x00F7 }, + { 0xA1D3, 0x00B1 }, + { 0xA1D4, 0x221A }, + { 0xA1D5, 0xFF1C }, + { 0xA1D6, 0xFF1E }, + { 0xA1D7, 0xFF1D }, + { 0xA1D8, 0x2266 }, + { 0xA1D9, 0x2267 }, + { 0xA1DA, 0x2260 }, + { 0xA1DB, 0x221E }, + { 0xA1DC, 0x2252 }, + { 0xA1DD, 0x2261 }, + { 0xA1DE, 0xFE62 }, + { 0xA1DF, 0xFE63 }, + { 0xA1E0, 0xFE64 }, + { 0xA1E1, 0xFE65 }, + { 0xA1E2, 0xFE66 }, + { 0xA1E3, 0x223C }, + { 0xA1E4, 0x2229 }, + { 0xA1E5, 0x222A }, + { 0xA1E6, 0x22A5 }, + { 0xA1E7, 0x2220 }, + { 0xA1E8, 0x221F }, + { 0xA1E9, 0x22BF }, + { 0xA1EA, 0x33D2 }, + { 0xA1EB, 0x33D1 }, + { 0xA1EC, 0x222B }, + { 0xA1ED, 0x222E }, + { 0xA1EE, 0x2235 }, + { 0xA1EF, 0x2234 }, + { 0xA1F0, 0x2640 }, + { 0xA1F1, 0x2642 }, + { 0xA1F2, 0x2641 }, + { 0xA1F3, 0x2609 }, + { 0xA1F4, 0x2191 }, + { 0xA1F5, 0x2193 }, + { 0xA1F6, 0x2190 }, + { 0xA1F7, 0x2192 }, + { 0xA1F8, 0x2196 }, + { 0xA1F9, 0x2197 }, + { 0xA1FA, 0x2199 }, + { 0xA1FB, 0x2198 }, + { 0xA1FC, 0x2225 }, + { 0xA1FD, 0x2223 }, + { 0xA1FE, 0xFFFD }, + { 0xA240, 0xFFFD }, + { 0xA241, 0xFF0F }, + { 0xA242, 0xFF3C }, + { 0xA243, 0xFF04 }, + { 0xA244, 0x00A5 }, + { 0xA245, 0x3012 }, + { 0xA246, 0x00A2 }, + { 0xA247, 0x00A3 }, + { 0xA248, 0xFF05 }, + { 0xA249, 0xFF20 }, + { 0xA24A, 0x2103 }, + { 0xA24B, 0x2109 }, + { 0xA24C, 0xFE69 }, + { 0xA24D, 0xFE6A }, + { 0xA24E, 0xFE6B }, + { 0xA24F, 0x33D5 }, + { 0xA250, 0x339C }, + { 0xA251, 0x339D }, + { 0xA252, 0x339E }, + { 0xA253, 0x33CE }, + { 0xA254, 0x33A1 }, + { 0xA255, 0x338E }, + { 0xA256, 0x338F }, + { 0xA257, 0x33C4 }, + { 0xA258, 0x00B0 }, + { 0xA259, 0x5159 }, + { 0xA25A, 0x515B }, + { 0xA25B, 0x515E }, + { 0xA25C, 0x515D }, + { 0xA25D, 0x5161 }, + { 0xA25E, 0x5163 }, + { 0xA25F, 0x55E7 }, + { 0xA260, 0x74E9 }, + { 0xA261, 0x7CCE }, + { 0xA262, 0x2581 }, + { 0xA263, 0x2582 }, + { 0xA264, 0x2583 }, + { 0xA265, 0x2584 }, + { 0xA266, 0x2585 }, + { 0xA267, 0x2586 }, + { 0xA268, 0x2587 }, + { 0xA269, 0x2588 }, + { 0xA26A, 0x258F }, + { 0xA26B, 0x258E }, + { 0xA26C, 0x258D }, + { 0xA26D, 0x258C }, + { 0xA26E, 0x258B }, + { 0xA26F, 0x258A }, + { 0xA270, 0x2589 }, + { 0xA271, 0x253C }, + { 0xA272, 0x2534 }, + { 0xA273, 0x252C }, + { 0xA274, 0x2524 }, + { 0xA275, 0x251C }, + { 0xA276, 0x2594 }, + { 0xA277, 0x2500 }, + { 0xA278, 0x2502 }, + { 0xA279, 0x2595 }, + { 0xA27A, 0x250C }, + { 0xA27B, 0x2510 }, + { 0xA27C, 0x2514 }, + { 0xA27D, 0x2518 }, + { 0xA27E, 0x256D }, + { 0xA2A1, 0x256E }, + { 0xA2A2, 0x2570 }, + { 0xA2A3, 0x256F }, + { 0xA2A4, 0x2550 }, + { 0xA2A5, 0x255E }, + { 0xA2A6, 0x256A }, + { 0xA2A7, 0x2561 }, + { 0xA2A8, 0x25E2 }, + { 0xA2A9, 0x25E3 }, + { 0xA2AA, 0x25E5 }, + { 0xA2AB, 0x25E4 }, + { 0xA2AC, 0x2571 }, + { 0xA2AD, 0x2572 }, + { 0xA2AE, 0x2573 }, + { 0xA2AF, 0xFF10 }, + { 0xA2B0, 0xFF11 }, + { 0xA2B1, 0xFF12 }, + { 0xA2B2, 0xFF13 }, + { 0xA2B3, 0xFF14 }, + { 0xA2B4, 0xFF15 }, + { 0xA2B5, 0xFF16 }, + { 0xA2B6, 0xFF17 }, + { 0xA2B7, 0xFF18 }, + { 0xA2B8, 0xFF19 }, + { 0xA2B9, 0x2160 }, + { 0xA2BA, 0x2161 }, + { 0xA2BB, 0x2162 }, + { 0xA2BC, 0x2163 }, + { 0xA2BD, 0x2164 }, + { 0xA2BE, 0x2165 }, + { 0xA2BF, 0x2166 }, + { 0xA2C0, 0x2167 }, + { 0xA2C1, 0x2168 }, + { 0xA2C2, 0x2169 }, + { 0xA2C3, 0x3021 }, + { 0xA2C4, 0x3022 }, + { 0xA2C5, 0x3023 }, + { 0xA2C6, 0x3024 }, + { 0xA2C7, 0x3025 }, + { 0xA2C8, 0x3026 }, + { 0xA2C9, 0x3027 }, + { 0xA2CA, 0x3028 }, + { 0xA2CB, 0x3029 }, + { 0xA2CC, 0xFFFD }, + { 0xA2CD, 0x5344 }, + { 0xA2CE, 0xFFFD }, + { 0xA2CF, 0xFF21 }, + { 0xA2D0, 0xFF22 }, + { 0xA2D1, 0xFF23 }, + { 0xA2D2, 0xFF24 }, + { 0xA2D3, 0xFF25 }, + { 0xA2D4, 0xFF26 }, + { 0xA2D5, 0xFF27 }, + { 0xA2D6, 0xFF28 }, + { 0xA2D7, 0xFF29 }, + { 0xA2D8, 0xFF2A }, + { 0xA2D9, 0xFF2B }, + { 0xA2DA, 0xFF2C }, + { 0xA2DB, 0xFF2D }, + { 0xA2DC, 0xFF2E }, + { 0xA2DD, 0xFF2F }, + { 0xA2DE, 0xFF30 }, + { 0xA2DF, 0xFF31 }, + { 0xA2E0, 0xFF32 }, + { 0xA2E1, 0xFF33 }, + { 0xA2E2, 0xFF34 }, + { 0xA2E3, 0xFF35 }, + { 0xA2E4, 0xFF36 }, + { 0xA2E5, 0xFF37 }, + { 0xA2E6, 0xFF38 }, + { 0xA2E7, 0xFF39 }, + { 0xA2E8, 0xFF3A }, + { 0xA2E9, 0xFF41 }, + { 0xA2EA, 0xFF42 }, + { 0xA2EB, 0xFF43 }, + { 0xA2EC, 0xFF44 }, + { 0xA2ED, 0xFF45 }, + { 0xA2EE, 0xFF46 }, + { 0xA2EF, 0xFF47 }, + { 0xA2F0, 0xFF48 }, + { 0xA2F1, 0xFF49 }, + { 0xA2F2, 0xFF4A }, + { 0xA2F3, 0xFF4B }, + { 0xA2F4, 0xFF4C }, + { 0xA2F5, 0xFF4D }, + { 0xA2F6, 0xFF4E }, + { 0xA2F7, 0xFF4F }, + { 0xA2F8, 0xFF50 }, + { 0xA2F9, 0xFF51 }, + { 0xA2FA, 0xFF52 }, + { 0xA2FB, 0xFF53 }, + { 0xA2FC, 0xFF54 }, + { 0xA2FD, 0xFF55 }, + { 0xA2FE, 0xFF56 }, + { 0xA340, 0xFF57 }, + { 0xA341, 0xFF58 }, + { 0xA342, 0xFF59 }, + { 0xA343, 0xFF5A }, + { 0xA344, 0x0391 }, + { 0xA345, 0x0392 }, + { 0xA346, 0x0393 }, + { 0xA347, 0x0394 }, + { 0xA348, 0x0395 }, + { 0xA349, 0x0396 }, + { 0xA34A, 0x0397 }, + { 0xA34B, 0x0398 }, + { 0xA34C, 0x0399 }, + { 0xA34D, 0x039A }, + { 0xA34E, 0x039B }, + { 0xA34F, 0x039C }, + { 0xA350, 0x039D }, + { 0xA351, 0x039E }, + { 0xA352, 0x039F }, + { 0xA353, 0x03A0 }, + { 0xA354, 0x03A1 }, + { 0xA355, 0x03A3 }, + { 0xA356, 0x03A4 }, + { 0xA357, 0x03A5 }, + { 0xA358, 0x03A6 }, + { 0xA359, 0x03A7 }, + { 0xA35A, 0x03A8 }, + { 0xA35B, 0x03A9 }, + { 0xA35C, 0x03B1 }, + { 0xA35D, 0x03B2 }, + { 0xA35E, 0x03B3 }, + { 0xA35F, 0x03B4 }, + { 0xA360, 0x03B5 }, + { 0xA361, 0x03B6 }, + { 0xA362, 0x03B7 }, + { 0xA363, 0x03B8 }, + { 0xA364, 0x03B9 }, + { 0xA365, 0x03BA }, + { 0xA366, 0x03BB }, + { 0xA367, 0x03BC }, + { 0xA368, 0x03BD }, + { 0xA369, 0x03BE }, + { 0xA36A, 0x03BF }, + { 0xA36B, 0x03C0 }, + { 0xA36C, 0x03C1 }, + { 0xA36D, 0x03C3 }, + { 0xA36E, 0x03C4 }, + { 0xA36F, 0x03C5 }, + { 0xA370, 0x03C6 }, + { 0xA371, 0x03C7 }, + { 0xA372, 0x03C8 }, + { 0xA373, 0x03C9 }, + { 0xA374, 0x3105 }, + { 0xA375, 0x3106 }, + { 0xA376, 0x3107 }, + { 0xA377, 0x3108 }, + { 0xA378, 0x3109 }, + { 0xA379, 0x310A }, + { 0xA37A, 0x310B }, + { 0xA37B, 0x310C }, + { 0xA37C, 0x310D }, + { 0xA37D, 0x310E }, + { 0xA37E, 0x310F }, + { 0xA3A1, 0x3110 }, + { 0xA3A2, 0x3111 }, + { 0xA3A3, 0x3112 }, + { 0xA3A4, 0x3113 }, + { 0xA3A5, 0x3114 }, + { 0xA3A6, 0x3115 }, + { 0xA3A7, 0x3116 }, + { 0xA3A8, 0x3117 }, + { 0xA3A9, 0x3118 }, + { 0xA3AA, 0x3119 }, + { 0xA3AB, 0x311A }, + { 0xA3AC, 0x311B }, + { 0xA3AD, 0x311C }, + { 0xA3AE, 0x311D }, + { 0xA3AF, 0x311E }, + { 0xA3B0, 0x311F }, + { 0xA3B1, 0x3120 }, + { 0xA3B2, 0x3121 }, + { 0xA3B3, 0x3122 }, + { 0xA3B4, 0x3123 }, + { 0xA3B5, 0x3124 }, + { 0xA3B6, 0x3125 }, + { 0xA3B7, 0x3126 }, + { 0xA3B8, 0x3127 }, + { 0xA3B9, 0x3128 }, + { 0xA3BA, 0x3129 }, + { 0xA3BB, 0x02D9 }, + { 0xA3BC, 0x02C9 }, + { 0xA3BD, 0x02CA }, + { 0xA3BE, 0x02C7 }, + { 0xA3BF, 0x02CB }, + { 0xA440, 0x4E00 }, + { 0xA441, 0x4E59 }, + { 0xA442, 0x4E01 }, + { 0xA443, 0x4E03 }, + { 0xA444, 0x4E43 }, + { 0xA445, 0x4E5D }, + { 0xA446, 0x4E86 }, + { 0xA447, 0x4E8C }, + { 0xA448, 0x4EBA }, + { 0xA449, 0x513F }, + { 0xA44A, 0x5165 }, + { 0xA44B, 0x516B }, + { 0xA44C, 0x51E0 }, + { 0xA44D, 0x5200 }, + { 0xA44E, 0x5201 }, + { 0xA44F, 0x529B }, + { 0xA450, 0x5315 }, + { 0xA451, 0x5341 }, + { 0xA452, 0x535C }, + { 0xA453, 0x53C8 }, + { 0xA454, 0x4E09 }, + { 0xA455, 0x4E0B }, + { 0xA456, 0x4E08 }, + { 0xA457, 0x4E0A }, + { 0xA458, 0x4E2B }, + { 0xA459, 0x4E38 }, + { 0xA45A, 0x51E1 }, + { 0xA45B, 0x4E45 }, + { 0xA45C, 0x4E48 }, + { 0xA45D, 0x4E5F }, + { 0xA45E, 0x4E5E }, + { 0xA45F, 0x4E8E }, + { 0xA460, 0x4EA1 }, + { 0xA461, 0x5140 }, + { 0xA462, 0x5203 }, + { 0xA463, 0x52FA }, + { 0xA464, 0x5343 }, + { 0xA465, 0x53C9 }, + { 0xA466, 0x53E3 }, + { 0xA467, 0x571F }, + { 0xA468, 0x58EB }, + { 0xA469, 0x5915 }, + { 0xA46A, 0x5927 }, + { 0xA46B, 0x5973 }, + { 0xA46C, 0x5B50 }, + { 0xA46D, 0x5B51 }, + { 0xA46E, 0x5B53 }, + { 0xA46F, 0x5BF8 }, + { 0xA470, 0x5C0F }, + { 0xA471, 0x5C22 }, + { 0xA472, 0x5C38 }, + { 0xA473, 0x5C71 }, + { 0xA474, 0x5DDD }, + { 0xA475, 0x5DE5 }, + { 0xA476, 0x5DF1 }, + { 0xA477, 0x5DF2 }, + { 0xA478, 0x5DF3 }, + { 0xA479, 0x5DFE }, + { 0xA47A, 0x5E72 }, + { 0xA47B, 0x5EFE }, + { 0xA47C, 0x5F0B }, + { 0xA47D, 0x5F13 }, + { 0xA47E, 0x624D }, + { 0xA4A1, 0x4E11 }, + { 0xA4A2, 0x4E10 }, + { 0xA4A3, 0x4E0D }, + { 0xA4A4, 0x4E2D }, + { 0xA4A5, 0x4E30 }, + { 0xA4A6, 0x4E39 }, + { 0xA4A7, 0x4E4B }, + { 0xA4A8, 0x5C39 }, + { 0xA4A9, 0x4E88 }, + { 0xA4AA, 0x4E91 }, + { 0xA4AB, 0x4E95 }, + { 0xA4AC, 0x4E92 }, + { 0xA4AD, 0x4E94 }, + { 0xA4AE, 0x4EA2 }, + { 0xA4AF, 0x4EC1 }, + { 0xA4B0, 0x4EC0 }, + { 0xA4B1, 0x4EC3 }, + { 0xA4B2, 0x4EC6 }, + { 0xA4B3, 0x4EC7 }, + { 0xA4B4, 0x4ECD }, + { 0xA4B5, 0x4ECA }, + { 0xA4B6, 0x4ECB }, + { 0xA4B7, 0x4EC4 }, + { 0xA4B8, 0x5143 }, + { 0xA4B9, 0x5141 }, + { 0xA4BA, 0x5167 }, + { 0xA4BB, 0x516D }, + { 0xA4BC, 0x516E }, + { 0xA4BD, 0x516C }, + { 0xA4BE, 0x5197 }, + { 0xA4BF, 0x51F6 }, + { 0xA4C0, 0x5206 }, + { 0xA4C1, 0x5207 }, + { 0xA4C2, 0x5208 }, + { 0xA4C3, 0x52FB }, + { 0xA4C4, 0x52FE }, + { 0xA4C5, 0x52FF }, + { 0xA4C6, 0x5316 }, + { 0xA4C7, 0x5339 }, + { 0xA4C8, 0x5348 }, + { 0xA4C9, 0x5347 }, + { 0xA4CA, 0x5345 }, + { 0xA4CB, 0x535E }, + { 0xA4CC, 0x5384 }, + { 0xA4CD, 0x53CB }, + { 0xA4CE, 0x53CA }, + { 0xA4CF, 0x53CD }, + { 0xA4D0, 0x58EC }, + { 0xA4D1, 0x5929 }, + { 0xA4D2, 0x592B }, + { 0xA4D3, 0x592A }, + { 0xA4D4, 0x592D }, + { 0xA4D5, 0x5B54 }, + { 0xA4D6, 0x5C11 }, + { 0xA4D7, 0x5C24 }, + { 0xA4D8, 0x5C3A }, + { 0xA4D9, 0x5C6F }, + { 0xA4DA, 0x5DF4 }, + { 0xA4DB, 0x5E7B }, + { 0xA4DC, 0x5EFF }, + { 0xA4DD, 0x5F14 }, + { 0xA4DE, 0x5F15 }, + { 0xA4DF, 0x5FC3 }, + { 0xA4E0, 0x6208 }, + { 0xA4E1, 0x6236 }, + { 0xA4E2, 0x624B }, + { 0xA4E3, 0x624E }, + { 0xA4E4, 0x652F }, + { 0xA4E5, 0x6587 }, + { 0xA4E6, 0x6597 }, + { 0xA4E7, 0x65A4 }, + { 0xA4E8, 0x65B9 }, + { 0xA4E9, 0x65E5 }, + { 0xA4EA, 0x66F0 }, + { 0xA4EB, 0x6708 }, + { 0xA4EC, 0x6728 }, + { 0xA4ED, 0x6B20 }, + { 0xA4EE, 0x6B62 }, + { 0xA4EF, 0x6B79 }, + { 0xA4F0, 0x6BCB }, + { 0xA4F1, 0x6BD4 }, + { 0xA4F2, 0x6BDB }, + { 0xA4F3, 0x6C0F }, + { 0xA4F4, 0x6C34 }, + { 0xA4F5, 0x706B }, + { 0xA4F6, 0x722A }, + { 0xA4F7, 0x7236 }, + { 0xA4F8, 0x723B }, + { 0xA4F9, 0x7247 }, + { 0xA4FA, 0x7259 }, + { 0xA4FB, 0x725B }, + { 0xA4FC, 0x72AC }, + { 0xA4FD, 0x738B }, + { 0xA4FE, 0x4E19 }, + { 0xA540, 0x4E16 }, + { 0xA541, 0x4E15 }, + { 0xA542, 0x4E14 }, + { 0xA543, 0x4E18 }, + { 0xA544, 0x4E3B }, + { 0xA545, 0x4E4D }, + { 0xA546, 0x4E4F }, + { 0xA547, 0x4E4E }, + { 0xA548, 0x4EE5 }, + { 0xA549, 0x4ED8 }, + { 0xA54A, 0x4ED4 }, + { 0xA54B, 0x4ED5 }, + { 0xA54C, 0x4ED6 }, + { 0xA54D, 0x4ED7 }, + { 0xA54E, 0x4EE3 }, + { 0xA54F, 0x4EE4 }, + { 0xA550, 0x4ED9 }, + { 0xA551, 0x4EDE }, + { 0xA552, 0x5145 }, + { 0xA553, 0x5144 }, + { 0xA554, 0x5189 }, + { 0xA555, 0x518A }, + { 0xA556, 0x51AC }, + { 0xA557, 0x51F9 }, + { 0xA558, 0x51FA }, + { 0xA559, 0x51F8 }, + { 0xA55A, 0x520A }, + { 0xA55B, 0x52A0 }, + { 0xA55C, 0x529F }, + { 0xA55D, 0x5305 }, + { 0xA55E, 0x5306 }, + { 0xA55F, 0x5317 }, + { 0xA560, 0x531D }, + { 0xA561, 0x4EDF }, + { 0xA562, 0x534A }, + { 0xA563, 0x5349 }, + { 0xA564, 0x5361 }, + { 0xA565, 0x5360 }, + { 0xA566, 0x536F }, + { 0xA567, 0x536E }, + { 0xA568, 0x53BB }, + { 0xA569, 0x53EF }, + { 0xA56A, 0x53E4 }, + { 0xA56B, 0x53F3 }, + { 0xA56C, 0x53EC }, + { 0xA56D, 0x53EE }, + { 0xA56E, 0x53E9 }, + { 0xA56F, 0x53E8 }, + { 0xA570, 0x53FC }, + { 0xA571, 0x53F8 }, + { 0xA572, 0x53F5 }, + { 0xA573, 0x53EB }, + { 0xA574, 0x53E6 }, + { 0xA575, 0x53EA }, + { 0xA576, 0x53F2 }, + { 0xA577, 0x53F1 }, + { 0xA578, 0x53F0 }, + { 0xA579, 0x53E5 }, + { 0xA57A, 0x53ED }, + { 0xA57B, 0x53FB }, + { 0xA57C, 0x56DB }, + { 0xA57D, 0x56DA }, + { 0xA57E, 0x5916 }, + { 0xA5A1, 0x592E }, + { 0xA5A2, 0x5931 }, + { 0xA5A3, 0x5974 }, + { 0xA5A4, 0x5976 }, + { 0xA5A5, 0x5B55 }, + { 0xA5A6, 0x5B83 }, + { 0xA5A7, 0x5C3C }, + { 0xA5A8, 0x5DE8 }, + { 0xA5A9, 0x5DE7 }, + { 0xA5AA, 0x5DE6 }, + { 0xA5AB, 0x5E02 }, + { 0xA5AC, 0x5E03 }, + { 0xA5AD, 0x5E73 }, + { 0xA5AE, 0x5E7C }, + { 0xA5AF, 0x5F01 }, + { 0xA5B0, 0x5F18 }, + { 0xA5B1, 0x5F17 }, + { 0xA5B2, 0x5FC5 }, + { 0xA5B3, 0x620A }, + { 0xA5B4, 0x6253 }, + { 0xA5B5, 0x6254 }, + { 0xA5B6, 0x6252 }, + { 0xA5B7, 0x6251 }, + { 0xA5B8, 0x65A5 }, + { 0xA5B9, 0x65E6 }, + { 0xA5BA, 0x672E }, + { 0xA5BB, 0x672C }, + { 0xA5BC, 0x672A }, + { 0xA5BD, 0x672B }, + { 0xA5BE, 0x672D }, + { 0xA5BF, 0x6B63 }, + { 0xA5C0, 0x6BCD }, + { 0xA5C1, 0x6C11 }, + { 0xA5C2, 0x6C10 }, + { 0xA5C3, 0x6C38 }, + { 0xA5C4, 0x6C41 }, + { 0xA5C5, 0x6C40 }, + { 0xA5C6, 0x6C3E }, + { 0xA5C7, 0x72AF }, + { 0xA5C8, 0x7384 }, + { 0xA5C9, 0x7389 }, + { 0xA5CA, 0x74DC }, + { 0xA5CB, 0x74E6 }, + { 0xA5CC, 0x7518 }, + { 0xA5CD, 0x751F }, + { 0xA5CE, 0x7528 }, + { 0xA5CF, 0x7529 }, + { 0xA5D0, 0x7530 }, + { 0xA5D1, 0x7531 }, + { 0xA5D2, 0x7532 }, + { 0xA5D3, 0x7533 }, + { 0xA5D4, 0x758B }, + { 0xA5D5, 0x767D }, + { 0xA5D6, 0x76AE }, + { 0xA5D7, 0x76BF }, + { 0xA5D8, 0x76EE }, + { 0xA5D9, 0x77DB }, + { 0xA5DA, 0x77E2 }, + { 0xA5DB, 0x77F3 }, + { 0xA5DC, 0x793A }, + { 0xA5DD, 0x79BE }, + { 0xA5DE, 0x7A74 }, + { 0xA5DF, 0x7ACB }, + { 0xA5E0, 0x4E1E }, + { 0xA5E1, 0x4E1F }, + { 0xA5E2, 0x4E52 }, + { 0xA5E3, 0x4E53 }, + { 0xA5E4, 0x4E69 }, + { 0xA5E5, 0x4E99 }, + { 0xA5E6, 0x4EA4 }, + { 0xA5E7, 0x4EA6 }, + { 0xA5E8, 0x4EA5 }, + { 0xA5E9, 0x4EFF }, + { 0xA5EA, 0x4F09 }, + { 0xA5EB, 0x4F19 }, + { 0xA5EC, 0x4F0A }, + { 0xA5ED, 0x4F15 }, + { 0xA5EE, 0x4F0D }, + { 0xA5EF, 0x4F10 }, + { 0xA5F0, 0x4F11 }, + { 0xA5F1, 0x4F0F }, + { 0xA5F2, 0x4EF2 }, + { 0xA5F3, 0x4EF6 }, + { 0xA5F4, 0x4EFB }, + { 0xA5F5, 0x4EF0 }, + { 0xA5F6, 0x4EF3 }, + { 0xA5F7, 0x4EFD }, + { 0xA5F8, 0x4F01 }, + { 0xA5F9, 0x4F0B }, + { 0xA5FA, 0x5149 }, + { 0xA5FB, 0x5147 }, + { 0xA5FC, 0x5146 }, + { 0xA5FD, 0x5148 }, + { 0xA5FE, 0x5168 }, + { 0xA640, 0x5171 }, + { 0xA641, 0x518D }, + { 0xA642, 0x51B0 }, + { 0xA643, 0x5217 }, + { 0xA644, 0x5211 }, + { 0xA645, 0x5212 }, + { 0xA646, 0x520E }, + { 0xA647, 0x5216 }, + { 0xA648, 0x52A3 }, + { 0xA649, 0x5308 }, + { 0xA64A, 0x5321 }, + { 0xA64B, 0x5320 }, + { 0xA64C, 0x5370 }, + { 0xA64D, 0x5371 }, + { 0xA64E, 0x5409 }, + { 0xA64F, 0x540F }, + { 0xA650, 0x540C }, + { 0xA651, 0x540A }, + { 0xA652, 0x5410 }, + { 0xA653, 0x5401 }, + { 0xA654, 0x540B }, + { 0xA655, 0x5404 }, + { 0xA656, 0x5411 }, + { 0xA657, 0x540D }, + { 0xA658, 0x5408 }, + { 0xA659, 0x5403 }, + { 0xA65A, 0x540E }, + { 0xA65B, 0x5406 }, + { 0xA65C, 0x5412 }, + { 0xA65D, 0x56E0 }, + { 0xA65E, 0x56DE }, + { 0xA65F, 0x56DD }, + { 0xA660, 0x5733 }, + { 0xA661, 0x5730 }, + { 0xA662, 0x5728 }, + { 0xA663, 0x572D }, + { 0xA664, 0x572C }, + { 0xA665, 0x572F }, + { 0xA666, 0x5729 }, + { 0xA667, 0x5919 }, + { 0xA668, 0x591A }, + { 0xA669, 0x5937 }, + { 0xA66A, 0x5938 }, + { 0xA66B, 0x5984 }, + { 0xA66C, 0x5978 }, + { 0xA66D, 0x5983 }, + { 0xA66E, 0x597D }, + { 0xA66F, 0x5979 }, + { 0xA670, 0x5982 }, + { 0xA671, 0x5981 }, + { 0xA672, 0x5B57 }, + { 0xA673, 0x5B58 }, + { 0xA674, 0x5B87 }, + { 0xA675, 0x5B88 }, + { 0xA676, 0x5B85 }, + { 0xA677, 0x5B89 }, + { 0xA678, 0x5BFA }, + { 0xA679, 0x5C16 }, + { 0xA67A, 0x5C79 }, + { 0xA67B, 0x5DDE }, + { 0xA67C, 0x5E06 }, + { 0xA67D, 0x5E76 }, + { 0xA67E, 0x5E74 }, + { 0xA6A1, 0x5F0F }, + { 0xA6A2, 0x5F1B }, + { 0xA6A3, 0x5FD9 }, + { 0xA6A4, 0x5FD6 }, + { 0xA6A5, 0x620E }, + { 0xA6A6, 0x620C }, + { 0xA6A7, 0x620D }, + { 0xA6A8, 0x6210 }, + { 0xA6A9, 0x6263 }, + { 0xA6AA, 0x625B }, + { 0xA6AB, 0x6258 }, + { 0xA6AC, 0x6536 }, + { 0xA6AD, 0x65E9 }, + { 0xA6AE, 0x65E8 }, + { 0xA6AF, 0x65EC }, + { 0xA6B0, 0x65ED }, + { 0xA6B1, 0x66F2 }, + { 0xA6B2, 0x66F3 }, + { 0xA6B3, 0x6709 }, + { 0xA6B4, 0x673D }, + { 0xA6B5, 0x6734 }, + { 0xA6B6, 0x6731 }, + { 0xA6B7, 0x6735 }, + { 0xA6B8, 0x6B21 }, + { 0xA6B9, 0x6B64 }, + { 0xA6BA, 0x6B7B }, + { 0xA6BB, 0x6C16 }, + { 0xA6BC, 0x6C5D }, + { 0xA6BD, 0x6C57 }, + { 0xA6BE, 0x6C59 }, + { 0xA6BF, 0x6C5F }, + { 0xA6C0, 0x6C60 }, + { 0xA6C1, 0x6C50 }, + { 0xA6C2, 0x6C55 }, + { 0xA6C3, 0x6C61 }, + { 0xA6C4, 0x6C5B }, + { 0xA6C5, 0x6C4D }, + { 0xA6C6, 0x6C4E }, + { 0xA6C7, 0x7070 }, + { 0xA6C8, 0x725F }, + { 0xA6C9, 0x725D }, + { 0xA6CA, 0x767E }, + { 0xA6CB, 0x7AF9 }, + { 0xA6CC, 0x7C73 }, + { 0xA6CD, 0x7CF8 }, + { 0xA6CE, 0x7F36 }, + { 0xA6CF, 0x7F8A }, + { 0xA6D0, 0x7FBD }, + { 0xA6D1, 0x8001 }, + { 0xA6D2, 0x8003 }, + { 0xA6D3, 0x800C }, + { 0xA6D4, 0x8012 }, + { 0xA6D5, 0x8033 }, + { 0xA6D6, 0x807F }, + { 0xA6D7, 0x8089 }, + { 0xA6D8, 0x808B }, + { 0xA6D9, 0x808C }, + { 0xA6DA, 0x81E3 }, + { 0xA6DB, 0x81EA }, + { 0xA6DC, 0x81F3 }, + { 0xA6DD, 0x81FC }, + { 0xA6DE, 0x820C }, + { 0xA6DF, 0x821B }, + { 0xA6E0, 0x821F }, + { 0xA6E1, 0x826E }, + { 0xA6E2, 0x8272 }, + { 0xA6E3, 0x827E }, + { 0xA6E4, 0x866B }, + { 0xA6E5, 0x8840 }, + { 0xA6E6, 0x884C }, + { 0xA6E7, 0x8863 }, + { 0xA6E8, 0x897F }, + { 0xA6E9, 0x9621 }, + { 0xA6EA, 0x4E32 }, + { 0xA6EB, 0x4EA8 }, + { 0xA6EC, 0x4F4D }, + { 0xA6ED, 0x4F4F }, + { 0xA6EE, 0x4F47 }, + { 0xA6EF, 0x4F57 }, + { 0xA6F0, 0x4F5E }, + { 0xA6F1, 0x4F34 }, + { 0xA6F2, 0x4F5B }, + { 0xA6F3, 0x4F55 }, + { 0xA6F4, 0x4F30 }, + { 0xA6F5, 0x4F50 }, + { 0xA6F6, 0x4F51 }, + { 0xA6F7, 0x4F3D }, + { 0xA6F8, 0x4F3A }, + { 0xA6F9, 0x4F38 }, + { 0xA6FA, 0x4F43 }, + { 0xA6FB, 0x4F54 }, + { 0xA6FC, 0x4F3C }, + { 0xA6FD, 0x4F46 }, + { 0xA6FE, 0x4F63 }, + { 0xA740, 0x4F5C }, + { 0xA741, 0x4F60 }, + { 0xA742, 0x4F2F }, + { 0xA743, 0x4F4E }, + { 0xA744, 0x4F36 }, + { 0xA745, 0x4F59 }, + { 0xA746, 0x4F5D }, + { 0xA747, 0x4F48 }, + { 0xA748, 0x4F5A }, + { 0xA749, 0x514C }, + { 0xA74A, 0x514B }, + { 0xA74B, 0x514D }, + { 0xA74C, 0x5175 }, + { 0xA74D, 0x51B6 }, + { 0xA74E, 0x51B7 }, + { 0xA74F, 0x5225 }, + { 0xA750, 0x5224 }, + { 0xA751, 0x5229 }, + { 0xA752, 0x522A }, + { 0xA753, 0x5228 }, + { 0xA754, 0x52AB }, + { 0xA755, 0x52A9 }, + { 0xA756, 0x52AA }, + { 0xA757, 0x52AC }, + { 0xA758, 0x5323 }, + { 0xA759, 0x5373 }, + { 0xA75A, 0x5375 }, + { 0xA75B, 0x541D }, + { 0xA75C, 0x542D }, + { 0xA75D, 0x541E }, + { 0xA75E, 0x543E }, + { 0xA75F, 0x5426 }, + { 0xA760, 0x544E }, + { 0xA761, 0x5427 }, + { 0xA762, 0x5446 }, + { 0xA763, 0x5443 }, + { 0xA764, 0x5433 }, + { 0xA765, 0x5448 }, + { 0xA766, 0x5442 }, + { 0xA767, 0x541B }, + { 0xA768, 0x5429 }, + { 0xA769, 0x544A }, + { 0xA76A, 0x5439 }, + { 0xA76B, 0x543B }, + { 0xA76C, 0x5438 }, + { 0xA76D, 0x542E }, + { 0xA76E, 0x5435 }, + { 0xA76F, 0x5436 }, + { 0xA770, 0x5420 }, + { 0xA771, 0x543C }, + { 0xA772, 0x5440 }, + { 0xA773, 0x5431 }, + { 0xA774, 0x542B }, + { 0xA775, 0x541F }, + { 0xA776, 0x542C }, + { 0xA777, 0x56EA }, + { 0xA778, 0x56F0 }, + { 0xA779, 0x56E4 }, + { 0xA77A, 0x56EB }, + { 0xA77B, 0x574A }, + { 0xA77C, 0x5751 }, + { 0xA77D, 0x5740 }, + { 0xA77E, 0x574D }, + { 0xA7A1, 0x5747 }, + { 0xA7A2, 0x574E }, + { 0xA7A3, 0x573E }, + { 0xA7A4, 0x5750 }, + { 0xA7A5, 0x574F }, + { 0xA7A6, 0x573B }, + { 0xA7A7, 0x58EF }, + { 0xA7A8, 0x593E }, + { 0xA7A9, 0x599D }, + { 0xA7AA, 0x5992 }, + { 0xA7AB, 0x59A8 }, + { 0xA7AC, 0x599E }, + { 0xA7AD, 0x59A3 }, + { 0xA7AE, 0x5999 }, + { 0xA7AF, 0x5996 }, + { 0xA7B0, 0x598D }, + { 0xA7B1, 0x59A4 }, + { 0xA7B2, 0x5993 }, + { 0xA7B3, 0x598A }, + { 0xA7B4, 0x59A5 }, + { 0xA7B5, 0x5B5D }, + { 0xA7B6, 0x5B5C }, + { 0xA7B7, 0x5B5A }, + { 0xA7B8, 0x5B5B }, + { 0xA7B9, 0x5B8C }, + { 0xA7BA, 0x5B8B }, + { 0xA7BB, 0x5B8F }, + { 0xA7BC, 0x5C2C }, + { 0xA7BD, 0x5C40 }, + { 0xA7BE, 0x5C41 }, + { 0xA7BF, 0x5C3F }, + { 0xA7C0, 0x5C3E }, + { 0xA7C1, 0x5C90 }, + { 0xA7C2, 0x5C91 }, + { 0xA7C3, 0x5C94 }, + { 0xA7C4, 0x5C8C }, + { 0xA7C5, 0x5DEB }, + { 0xA7C6, 0x5E0C }, + { 0xA7C7, 0x5E8F }, + { 0xA7C8, 0x5E87 }, + { 0xA7C9, 0x5E8A }, + { 0xA7CA, 0x5EF7 }, + { 0xA7CB, 0x5F04 }, + { 0xA7CC, 0x5F1F }, + { 0xA7CD, 0x5F64 }, + { 0xA7CE, 0x5F62 }, + { 0xA7CF, 0x5F77 }, + { 0xA7D0, 0x5F79 }, + { 0xA7D1, 0x5FD8 }, + { 0xA7D2, 0x5FCC }, + { 0xA7D3, 0x5FD7 }, + { 0xA7D4, 0x5FCD }, + { 0xA7D5, 0x5FF1 }, + { 0xA7D6, 0x5FEB }, + { 0xA7D7, 0x5FF8 }, + { 0xA7D8, 0x5FEA }, + { 0xA7D9, 0x6212 }, + { 0xA7DA, 0x6211 }, + { 0xA7DB, 0x6284 }, + { 0xA7DC, 0x6297 }, + { 0xA7DD, 0x6296 }, + { 0xA7DE, 0x6280 }, + { 0xA7DF, 0x6276 }, + { 0xA7E0, 0x6289 }, + { 0xA7E1, 0x626D }, + { 0xA7E2, 0x628A }, + { 0xA7E3, 0x627C }, + { 0xA7E4, 0x627E }, + { 0xA7E5, 0x6279 }, + { 0xA7E6, 0x6273 }, + { 0xA7E7, 0x6292 }, + { 0xA7E8, 0x626F }, + { 0xA7E9, 0x6298 }, + { 0xA7EA, 0x626E }, + { 0xA7EB, 0x6295 }, + { 0xA7EC, 0x6293 }, + { 0xA7ED, 0x6291 }, + { 0xA7EE, 0x6286 }, + { 0xA7EF, 0x6539 }, + { 0xA7F0, 0x653B }, + { 0xA7F1, 0x6538 }, + { 0xA7F2, 0x65F1 }, + { 0xA7F3, 0x66F4 }, + { 0xA7F4, 0x675F }, + { 0xA7F5, 0x674E }, + { 0xA7F6, 0x674F }, + { 0xA7F7, 0x6750 }, + { 0xA7F8, 0x6751 }, + { 0xA7F9, 0x675C }, + { 0xA7FA, 0x6756 }, + { 0xA7FB, 0x675E }, + { 0xA7FC, 0x6749 }, + { 0xA7FD, 0x6746 }, + { 0xA7FE, 0x6760 }, + { 0xA840, 0x6753 }, + { 0xA841, 0x6757 }, + { 0xA842, 0x6B65 }, + { 0xA843, 0x6BCF }, + { 0xA844, 0x6C42 }, + { 0xA845, 0x6C5E }, + { 0xA846, 0x6C99 }, + { 0xA847, 0x6C81 }, + { 0xA848, 0x6C88 }, + { 0xA849, 0x6C89 }, + { 0xA84A, 0x6C85 }, + { 0xA84B, 0x6C9B }, + { 0xA84C, 0x6C6A }, + { 0xA84D, 0x6C7A }, + { 0xA84E, 0x6C90 }, + { 0xA84F, 0x6C70 }, + { 0xA850, 0x6C8C }, + { 0xA851, 0x6C68 }, + { 0xA852, 0x6C96 }, + { 0xA853, 0x6C92 }, + { 0xA854, 0x6C7D }, + { 0xA855, 0x6C83 }, + { 0xA856, 0x6C72 }, + { 0xA857, 0x6C7E }, + { 0xA858, 0x6C74 }, + { 0xA859, 0x6C86 }, + { 0xA85A, 0x6C76 }, + { 0xA85B, 0x6C8D }, + { 0xA85C, 0x6C94 }, + { 0xA85D, 0x6C98 }, + { 0xA85E, 0x6C82 }, + { 0xA85F, 0x7076 }, + { 0xA860, 0x707C }, + { 0xA861, 0x707D }, + { 0xA862, 0x7078 }, + { 0xA863, 0x7262 }, + { 0xA864, 0x7261 }, + { 0xA865, 0x7260 }, + { 0xA866, 0x72C4 }, + { 0xA867, 0x72C2 }, + { 0xA868, 0x7396 }, + { 0xA869, 0x752C }, + { 0xA86A, 0x752B }, + { 0xA86B, 0x7537 }, + { 0xA86C, 0x7538 }, + { 0xA86D, 0x7682 }, + { 0xA86E, 0x76EF }, + { 0xA86F, 0x77E3 }, + { 0xA870, 0x79C1 }, + { 0xA871, 0x79C0 }, + { 0xA872, 0x79BF }, + { 0xA873, 0x7A76 }, + { 0xA874, 0x7CFB }, + { 0xA875, 0x7F55 }, + { 0xA876, 0x8096 }, + { 0xA877, 0x8093 }, + { 0xA878, 0x809D }, + { 0xA879, 0x8098 }, + { 0xA87A, 0x809B }, + { 0xA87B, 0x809A }, + { 0xA87C, 0x80B2 }, + { 0xA87D, 0x826F }, + { 0xA87E, 0x8292 }, + { 0xA8A1, 0x828B }, + { 0xA8A2, 0x828D }, + { 0xA8A3, 0x898B }, + { 0xA8A4, 0x89D2 }, + { 0xA8A5, 0x8A00 }, + { 0xA8A6, 0x8C37 }, + { 0xA8A7, 0x8C46 }, + { 0xA8A8, 0x8C55 }, + { 0xA8A9, 0x8C9D }, + { 0xA8AA, 0x8D64 }, + { 0xA8AB, 0x8D70 }, + { 0xA8AC, 0x8DB3 }, + { 0xA8AD, 0x8EAB }, + { 0xA8AE, 0x8ECA }, + { 0xA8AF, 0x8F9B }, + { 0xA8B0, 0x8FB0 }, + { 0xA8B1, 0x8FC2 }, + { 0xA8B2, 0x8FC6 }, + { 0xA8B3, 0x8FC5 }, + { 0xA8B4, 0x8FC4 }, + { 0xA8B5, 0x5DE1 }, + { 0xA8B6, 0x9091 }, + { 0xA8B7, 0x90A2 }, + { 0xA8B8, 0x90AA }, + { 0xA8B9, 0x90A6 }, + { 0xA8BA, 0x90A3 }, + { 0xA8BB, 0x9149 }, + { 0xA8BC, 0x91C6 }, + { 0xA8BD, 0x91CC }, + { 0xA8BE, 0x9632 }, + { 0xA8BF, 0x962E }, + { 0xA8C0, 0x9631 }, + { 0xA8C1, 0x962A }, + { 0xA8C2, 0x962C }, + { 0xA8C3, 0x4E26 }, + { 0xA8C4, 0x4E56 }, + { 0xA8C5, 0x4E73 }, + { 0xA8C6, 0x4E8B }, + { 0xA8C7, 0x4E9B }, + { 0xA8C8, 0x4E9E }, + { 0xA8C9, 0x4EAB }, + { 0xA8CA, 0x4EAC }, + { 0xA8CB, 0x4F6F }, + { 0xA8CC, 0x4F9D }, + { 0xA8CD, 0x4F8D }, + { 0xA8CE, 0x4F73 }, + { 0xA8CF, 0x4F7F }, + { 0xA8D0, 0x4F6C }, + { 0xA8D1, 0x4F9B }, + { 0xA8D2, 0x4F8B }, + { 0xA8D3, 0x4F86 }, + { 0xA8D4, 0x4F83 }, + { 0xA8D5, 0x4F70 }, + { 0xA8D6, 0x4F75 }, + { 0xA8D7, 0x4F88 }, + { 0xA8D8, 0x4F69 }, + { 0xA8D9, 0x4F7B }, + { 0xA8DA, 0x4F96 }, + { 0xA8DB, 0x4F7E }, + { 0xA8DC, 0x4F8F }, + { 0xA8DD, 0x4F91 }, + { 0xA8DE, 0x4F7A }, + { 0xA8DF, 0x5154 }, + { 0xA8E0, 0x5152 }, + { 0xA8E1, 0x5155 }, + { 0xA8E2, 0x5169 }, + { 0xA8E3, 0x5177 }, + { 0xA8E4, 0x5176 }, + { 0xA8E5, 0x5178 }, + { 0xA8E6, 0x51BD }, + { 0xA8E7, 0x51FD }, + { 0xA8E8, 0x523B }, + { 0xA8E9, 0x5238 }, + { 0xA8EA, 0x5237 }, + { 0xA8EB, 0x523A }, + { 0xA8EC, 0x5230 }, + { 0xA8ED, 0x522E }, + { 0xA8EE, 0x5236 }, + { 0xA8EF, 0x5241 }, + { 0xA8F0, 0x52BE }, + { 0xA8F1, 0x52BB }, + { 0xA8F2, 0x5352 }, + { 0xA8F3, 0x5354 }, + { 0xA8F4, 0x5353 }, + { 0xA8F5, 0x5351 }, + { 0xA8F6, 0x5366 }, + { 0xA8F7, 0x5377 }, + { 0xA8F8, 0x5378 }, + { 0xA8F9, 0x5379 }, + { 0xA8FA, 0x53D6 }, + { 0xA8FB, 0x53D4 }, + { 0xA8FC, 0x53D7 }, + { 0xA8FD, 0x5473 }, + { 0xA8FE, 0x5475 }, + { 0xA940, 0x5496 }, + { 0xA941, 0x5478 }, + { 0xA942, 0x5495 }, + { 0xA943, 0x5480 }, + { 0xA944, 0x547B }, + { 0xA945, 0x5477 }, + { 0xA946, 0x5484 }, + { 0xA947, 0x5492 }, + { 0xA948, 0x5486 }, + { 0xA949, 0x547C }, + { 0xA94A, 0x5490 }, + { 0xA94B, 0x5471 }, + { 0xA94C, 0x5476 }, + { 0xA94D, 0x548C }, + { 0xA94E, 0x549A }, + { 0xA94F, 0x5462 }, + { 0xA950, 0x5468 }, + { 0xA951, 0x548B }, + { 0xA952, 0x547D }, + { 0xA953, 0x548E }, + { 0xA954, 0x56FA }, + { 0xA955, 0x5783 }, + { 0xA956, 0x5777 }, + { 0xA957, 0x576A }, + { 0xA958, 0x5769 }, + { 0xA959, 0x5761 }, + { 0xA95A, 0x5766 }, + { 0xA95B, 0x5764 }, + { 0xA95C, 0x577C }, + { 0xA95D, 0x591C }, + { 0xA95E, 0x5949 }, + { 0xA95F, 0x5947 }, + { 0xA960, 0x5948 }, + { 0xA961, 0x5944 }, + { 0xA962, 0x5954 }, + { 0xA963, 0x59BE }, + { 0xA964, 0x59BB }, + { 0xA965, 0x59D4 }, + { 0xA966, 0x59B9 }, + { 0xA967, 0x59AE }, + { 0xA968, 0x59D1 }, + { 0xA969, 0x59C6 }, + { 0xA96A, 0x59D0 }, + { 0xA96B, 0x59CD }, + { 0xA96C, 0x59CB }, + { 0xA96D, 0x59D3 }, + { 0xA96E, 0x59CA }, + { 0xA96F, 0x59AF }, + { 0xA970, 0x59B3 }, + { 0xA971, 0x59D2 }, + { 0xA972, 0x59C5 }, + { 0xA973, 0x5B5F }, + { 0xA974, 0x5B64 }, + { 0xA975, 0x5B63 }, + { 0xA976, 0x5B97 }, + { 0xA977, 0x5B9A }, + { 0xA978, 0x5B98 }, + { 0xA979, 0x5B9C }, + { 0xA97A, 0x5B99 }, + { 0xA97B, 0x5B9B }, + { 0xA97C, 0x5C1A }, + { 0xA97D, 0x5C48 }, + { 0xA97E, 0x5C45 }, + { 0xA9A1, 0x5C46 }, + { 0xA9A2, 0x5CB7 }, + { 0xA9A3, 0x5CA1 }, + { 0xA9A4, 0x5CB8 }, + { 0xA9A5, 0x5CA9 }, + { 0xA9A6, 0x5CAB }, + { 0xA9A7, 0x5CB1 }, + { 0xA9A8, 0x5CB3 }, + { 0xA9A9, 0x5E18 }, + { 0xA9AA, 0x5E1A }, + { 0xA9AB, 0x5E16 }, + { 0xA9AC, 0x5E15 }, + { 0xA9AD, 0x5E1B }, + { 0xA9AE, 0x5E11 }, + { 0xA9AF, 0x5E78 }, + { 0xA9B0, 0x5E9A }, + { 0xA9B1, 0x5E97 }, + { 0xA9B2, 0x5E9C }, + { 0xA9B3, 0x5E95 }, + { 0xA9B4, 0x5E96 }, + { 0xA9B5, 0x5EF6 }, + { 0xA9B6, 0x5F26 }, + { 0xA9B7, 0x5F27 }, + { 0xA9B8, 0x5F29 }, + { 0xA9B9, 0x5F80 }, + { 0xA9BA, 0x5F81 }, + { 0xA9BB, 0x5F7F }, + { 0xA9BC, 0x5F7C }, + { 0xA9BD, 0x5FDD }, + { 0xA9BE, 0x5FE0 }, + { 0xA9BF, 0x5FFD }, + { 0xA9C0, 0x5FF5 }, + { 0xA9C1, 0x5FFF }, + { 0xA9C2, 0x600F }, + { 0xA9C3, 0x6014 }, + { 0xA9C4, 0x602F }, + { 0xA9C5, 0x6035 }, + { 0xA9C6, 0x6016 }, + { 0xA9C7, 0x602A }, + { 0xA9C8, 0x6015 }, + { 0xA9C9, 0x6021 }, + { 0xA9CA, 0x6027 }, + { 0xA9CB, 0x6029 }, + { 0xA9CC, 0x602B }, + { 0xA9CD, 0x601B }, + { 0xA9CE, 0x6216 }, + { 0xA9CF, 0x6215 }, + { 0xA9D0, 0x623F }, + { 0xA9D1, 0x623E }, + { 0xA9D2, 0x6240 }, + { 0xA9D3, 0x627F }, + { 0xA9D4, 0x62C9 }, + { 0xA9D5, 0x62CC }, + { 0xA9D6, 0x62C4 }, + { 0xA9D7, 0x62BF }, + { 0xA9D8, 0x62C2 }, + { 0xA9D9, 0x62B9 }, + { 0xA9DA, 0x62D2 }, + { 0xA9DB, 0x62DB }, + { 0xA9DC, 0x62AB }, + { 0xA9DD, 0x62D3 }, + { 0xA9DE, 0x62D4 }, + { 0xA9DF, 0x62CB }, + { 0xA9E0, 0x62C8 }, + { 0xA9E1, 0x62A8 }, + { 0xA9E2, 0x62BD }, + { 0xA9E3, 0x62BC }, + { 0xA9E4, 0x62D0 }, + { 0xA9E5, 0x62D9 }, + { 0xA9E6, 0x62C7 }, + { 0xA9E7, 0x62CD }, + { 0xA9E8, 0x62B5 }, + { 0xA9E9, 0x62DA }, + { 0xA9EA, 0x62B1 }, + { 0xA9EB, 0x62D8 }, + { 0xA9EC, 0x62D6 }, + { 0xA9ED, 0x62D7 }, + { 0xA9EE, 0x62C6 }, + { 0xA9EF, 0x62AC }, + { 0xA9F0, 0x62CE }, + { 0xA9F1, 0x653E }, + { 0xA9F2, 0x65A7 }, + { 0xA9F3, 0x65BC }, + { 0xA9F4, 0x65FA }, + { 0xA9F5, 0x6614 }, + { 0xA9F6, 0x6613 }, + { 0xA9F7, 0x660C }, + { 0xA9F8, 0x6606 }, + { 0xA9F9, 0x6602 }, + { 0xA9FA, 0x660E }, + { 0xA9FB, 0x6600 }, + { 0xA9FC, 0x660F }, + { 0xA9FD, 0x6615 }, + { 0xA9FE, 0x660A }, + { 0xAA40, 0x6607 }, + { 0xAA41, 0x670D }, + { 0xAA42, 0x670B }, + { 0xAA43, 0x676D }, + { 0xAA44, 0x678B }, + { 0xAA45, 0x6795 }, + { 0xAA46, 0x6771 }, + { 0xAA47, 0x679C }, + { 0xAA48, 0x6773 }, + { 0xAA49, 0x6777 }, + { 0xAA4A, 0x6787 }, + { 0xAA4B, 0x679D }, + { 0xAA4C, 0x6797 }, + { 0xAA4D, 0x676F }, + { 0xAA4E, 0x6770 }, + { 0xAA4F, 0x677F }, + { 0xAA50, 0x6789 }, + { 0xAA51, 0x677E }, + { 0xAA52, 0x6790 }, + { 0xAA53, 0x6775 }, + { 0xAA54, 0x679A }, + { 0xAA55, 0x6793 }, + { 0xAA56, 0x677C }, + { 0xAA57, 0x676A }, + { 0xAA58, 0x6772 }, + { 0xAA59, 0x6B23 }, + { 0xAA5A, 0x6B66 }, + { 0xAA5B, 0x6B67 }, + { 0xAA5C, 0x6B7F }, + { 0xAA5D, 0x6C13 }, + { 0xAA5E, 0x6C1B }, + { 0xAA5F, 0x6CE3 }, + { 0xAA60, 0x6CE8 }, + { 0xAA61, 0x6CF3 }, + { 0xAA62, 0x6CB1 }, + { 0xAA63, 0x6CCC }, + { 0xAA64, 0x6CE5 }, + { 0xAA65, 0x6CB3 }, + { 0xAA66, 0x6CBD }, + { 0xAA67, 0x6CBE }, + { 0xAA68, 0x6CBC }, + { 0xAA69, 0x6CE2 }, + { 0xAA6A, 0x6CAB }, + { 0xAA6B, 0x6CD5 }, + { 0xAA6C, 0x6CD3 }, + { 0xAA6D, 0x6CB8 }, + { 0xAA6E, 0x6CC4 }, + { 0xAA6F, 0x6CB9 }, + { 0xAA70, 0x6CC1 }, + { 0xAA71, 0x6CAE }, + { 0xAA72, 0x6CD7 }, + { 0xAA73, 0x6CC5 }, + { 0xAA74, 0x6CF1 }, + { 0xAA75, 0x6CBF }, + { 0xAA76, 0x6CBB }, + { 0xAA77, 0x6CE1 }, + { 0xAA78, 0x6CDB }, + { 0xAA79, 0x6CCA }, + { 0xAA7A, 0x6CAC }, + { 0xAA7B, 0x6CEF }, + { 0xAA7C, 0x6CDC }, + { 0xAA7D, 0x6CD6 }, + { 0xAA7E, 0x6CE0 }, + { 0xAAA1, 0x7095 }, + { 0xAAA2, 0x708E }, + { 0xAAA3, 0x7092 }, + { 0xAAA4, 0x708A }, + { 0xAAA5, 0x7099 }, + { 0xAAA6, 0x722C }, + { 0xAAA7, 0x722D }, + { 0xAAA8, 0x7238 }, + { 0xAAA9, 0x7248 }, + { 0xAAAA, 0x7267 }, + { 0xAAAB, 0x7269 }, + { 0xAAAC, 0x72C0 }, + { 0xAAAD, 0x72CE }, + { 0xAAAE, 0x72D9 }, + { 0xAAAF, 0x72D7 }, + { 0xAAB0, 0x72D0 }, + { 0xAAB1, 0x73A9 }, + { 0xAAB2, 0x73A8 }, + { 0xAAB3, 0x739F }, + { 0xAAB4, 0x73AB }, + { 0xAAB5, 0x73A5 }, + { 0xAAB6, 0x753D }, + { 0xAAB7, 0x759D }, + { 0xAAB8, 0x7599 }, + { 0xAAB9, 0x759A }, + { 0xAABA, 0x7684 }, + { 0xAABB, 0x76C2 }, + { 0xAABC, 0x76F2 }, + { 0xAABD, 0x76F4 }, + { 0xAABE, 0x77E5 }, + { 0xAABF, 0x77FD }, + { 0xAAC0, 0x793E }, + { 0xAAC1, 0x7940 }, + { 0xAAC2, 0x7941 }, + { 0xAAC3, 0x79C9 }, + { 0xAAC4, 0x79C8 }, + { 0xAAC5, 0x7A7A }, + { 0xAAC6, 0x7A79 }, + { 0xAAC7, 0x7AFA }, + { 0xAAC8, 0x7CFE }, + { 0xAAC9, 0x7F54 }, + { 0xAACA, 0x7F8C }, + { 0xAACB, 0x7F8B }, + { 0xAACC, 0x8005 }, + { 0xAACD, 0x80BA }, + { 0xAACE, 0x80A5 }, + { 0xAACF, 0x80A2 }, + { 0xAAD0, 0x80B1 }, + { 0xAAD1, 0x80A1 }, + { 0xAAD2, 0x80AB }, + { 0xAAD3, 0x80A9 }, + { 0xAAD4, 0x80B4 }, + { 0xAAD5, 0x80AA }, + { 0xAAD6, 0x80AF }, + { 0xAAD7, 0x81E5 }, + { 0xAAD8, 0x81FE }, + { 0xAAD9, 0x820D }, + { 0xAADA, 0x82B3 }, + { 0xAADB, 0x829D }, + { 0xAADC, 0x8299 }, + { 0xAADD, 0x82AD }, + { 0xAADE, 0x82BD }, + { 0xAADF, 0x829F }, + { 0xAAE0, 0x82B9 }, + { 0xAAE1, 0x82B1 }, + { 0xAAE2, 0x82AC }, + { 0xAAE3, 0x82A5 }, + { 0xAAE4, 0x82AF }, + { 0xAAE5, 0x82B8 }, + { 0xAAE6, 0x82A3 }, + { 0xAAE7, 0x82B0 }, + { 0xAAE8, 0x82BE }, + { 0xAAE9, 0x82B7 }, + { 0xAAEA, 0x864E }, + { 0xAAEB, 0x8671 }, + { 0xAAEC, 0x521D }, + { 0xAAED, 0x8868 }, + { 0xAAEE, 0x8ECB }, + { 0xAAEF, 0x8FCE }, + { 0xAAF0, 0x8FD4 }, + { 0xAAF1, 0x8FD1 }, + { 0xAAF2, 0x90B5 }, + { 0xAAF3, 0x90B8 }, + { 0xAAF4, 0x90B1 }, + { 0xAAF5, 0x90B6 }, + { 0xAAF6, 0x91C7 }, + { 0xAAF7, 0x91D1 }, + { 0xAAF8, 0x9577 }, + { 0xAAF9, 0x9580 }, + { 0xAAFA, 0x961C }, + { 0xAAFB, 0x9640 }, + { 0xAAFC, 0x963F }, + { 0xAAFD, 0x963B }, + { 0xAAFE, 0x9644 }, + { 0xAB40, 0x9642 }, + { 0xAB41, 0x96B9 }, + { 0xAB42, 0x96E8 }, + { 0xAB43, 0x9752 }, + { 0xAB44, 0x975E }, + { 0xAB45, 0x4E9F }, + { 0xAB46, 0x4EAD }, + { 0xAB47, 0x4EAE }, + { 0xAB48, 0x4FE1 }, + { 0xAB49, 0x4FB5 }, + { 0xAB4A, 0x4FAF }, + { 0xAB4B, 0x4FBF }, + { 0xAB4C, 0x4FE0 }, + { 0xAB4D, 0x4FD1 }, + { 0xAB4E, 0x4FCF }, + { 0xAB4F, 0x4FDD }, + { 0xAB50, 0x4FC3 }, + { 0xAB51, 0x4FB6 }, + { 0xAB52, 0x4FD8 }, + { 0xAB53, 0x4FDF }, + { 0xAB54, 0x4FCA }, + { 0xAB55, 0x4FD7 }, + { 0xAB56, 0x4FAE }, + { 0xAB57, 0x4FD0 }, + { 0xAB58, 0x4FC4 }, + { 0xAB59, 0x4FC2 }, + { 0xAB5A, 0x4FDA }, + { 0xAB5B, 0x4FCE }, + { 0xAB5C, 0x4FDE }, + { 0xAB5D, 0x4FB7 }, + { 0xAB5E, 0x5157 }, + { 0xAB5F, 0x5192 }, + { 0xAB60, 0x5191 }, + { 0xAB61, 0x51A0 }, + { 0xAB62, 0x524E }, + { 0xAB63, 0x5243 }, + { 0xAB64, 0x524A }, + { 0xAB65, 0x524D }, + { 0xAB66, 0x524C }, + { 0xAB67, 0x524B }, + { 0xAB68, 0x5247 }, + { 0xAB69, 0x52C7 }, + { 0xAB6A, 0x52C9 }, + { 0xAB6B, 0x52C3 }, + { 0xAB6C, 0x52C1 }, + { 0xAB6D, 0x530D }, + { 0xAB6E, 0x5357 }, + { 0xAB6F, 0x537B }, + { 0xAB70, 0x539A }, + { 0xAB71, 0x53DB }, + { 0xAB72, 0x54AC }, + { 0xAB73, 0x54C0 }, + { 0xAB74, 0x54A8 }, + { 0xAB75, 0x54CE }, + { 0xAB76, 0x54C9 }, + { 0xAB77, 0x54B8 }, + { 0xAB78, 0x54A6 }, + { 0xAB79, 0x54B3 }, + { 0xAB7A, 0x54C7 }, + { 0xAB7B, 0x54C2 }, + { 0xAB7C, 0x54BD }, + { 0xAB7D, 0x54AA }, + { 0xAB7E, 0x54C1 }, + { 0xABA1, 0x54C4 }, + { 0xABA2, 0x54C8 }, + { 0xABA3, 0x54AF }, + { 0xABA4, 0x54AB }, + { 0xABA5, 0x54B1 }, + { 0xABA6, 0x54BB }, + { 0xABA7, 0x54A9 }, + { 0xABA8, 0x54A7 }, + { 0xABA9, 0x54BF }, + { 0xABAA, 0x56FF }, + { 0xABAB, 0x5782 }, + { 0xABAC, 0x578B }, + { 0xABAD, 0x57A0 }, + { 0xABAE, 0x57A3 }, + { 0xABAF, 0x57A2 }, + { 0xABB0, 0x57CE }, + { 0xABB1, 0x57AE }, + { 0xABB2, 0x5793 }, + { 0xABB3, 0x5955 }, + { 0xABB4, 0x5951 }, + { 0xABB5, 0x594F }, + { 0xABB6, 0x594E }, + { 0xABB7, 0x5950 }, + { 0xABB8, 0x59DC }, + { 0xABB9, 0x59D8 }, + { 0xABBA, 0x59FF }, + { 0xABBB, 0x59E3 }, + { 0xABBC, 0x59E8 }, + { 0xABBD, 0x5A03 }, + { 0xABBE, 0x59E5 }, + { 0xABBF, 0x59EA }, + { 0xABC0, 0x59DA }, + { 0xABC1, 0x59E6 }, + { 0xABC2, 0x5A01 }, + { 0xABC3, 0x59FB }, + { 0xABC4, 0x5B69 }, + { 0xABC5, 0x5BA3 }, + { 0xABC6, 0x5BA6 }, + { 0xABC7, 0x5BA4 }, + { 0xABC8, 0x5BA2 }, + { 0xABC9, 0x5BA5 }, + { 0xABCA, 0x5C01 }, + { 0xABCB, 0x5C4E }, + { 0xABCC, 0x5C4F }, + { 0xABCD, 0x5C4D }, + { 0xABCE, 0x5C4B }, + { 0xABCF, 0x5CD9 }, + { 0xABD0, 0x5CD2 }, + { 0xABD1, 0x5DF7 }, + { 0xABD2, 0x5E1D }, + { 0xABD3, 0x5E25 }, + { 0xABD4, 0x5E1F }, + { 0xABD5, 0x5E7D }, + { 0xABD6, 0x5EA0 }, + { 0xABD7, 0x5EA6 }, + { 0xABD8, 0x5EFA }, + { 0xABD9, 0x5F08 }, + { 0xABDA, 0x5F2D }, + { 0xABDB, 0x5F65 }, + { 0xABDC, 0x5F88 }, + { 0xABDD, 0x5F85 }, + { 0xABDE, 0x5F8A }, + { 0xABDF, 0x5F8B }, + { 0xABE0, 0x5F87 }, + { 0xABE1, 0x5F8C }, + { 0xABE2, 0x5F89 }, + { 0xABE3, 0x6012 }, + { 0xABE4, 0x601D }, + { 0xABE5, 0x6020 }, + { 0xABE6, 0x6025 }, + { 0xABE7, 0x600E }, + { 0xABE8, 0x6028 }, + { 0xABE9, 0x604D }, + { 0xABEA, 0x6070 }, + { 0xABEB, 0x6068 }, + { 0xABEC, 0x6062 }, + { 0xABED, 0x6046 }, + { 0xABEE, 0x6043 }, + { 0xABEF, 0x606C }, + { 0xABF0, 0x606B }, + { 0xABF1, 0x606A }, + { 0xABF2, 0x6064 }, + { 0xABF3, 0x6241 }, + { 0xABF4, 0x62DC }, + { 0xABF5, 0x6316 }, + { 0xABF6, 0x6309 }, + { 0xABF7, 0x62FC }, + { 0xABF8, 0x62ED }, + { 0xABF9, 0x6301 }, + { 0xABFA, 0x62EE }, + { 0xABFB, 0x62FD }, + { 0xABFC, 0x6307 }, + { 0xABFD, 0x62F1 }, + { 0xABFE, 0x62F7 }, + { 0xAC40, 0x62EF }, + { 0xAC41, 0x62EC }, + { 0xAC42, 0x62FE }, + { 0xAC43, 0x62F4 }, + { 0xAC44, 0x6311 }, + { 0xAC45, 0x6302 }, + { 0xAC46, 0x653F }, + { 0xAC47, 0x6545 }, + { 0xAC48, 0x65AB }, + { 0xAC49, 0x65BD }, + { 0xAC4A, 0x65E2 }, + { 0xAC4B, 0x6625 }, + { 0xAC4C, 0x662D }, + { 0xAC4D, 0x6620 }, + { 0xAC4E, 0x6627 }, + { 0xAC4F, 0x662F }, + { 0xAC50, 0x661F }, + { 0xAC51, 0x6628 }, + { 0xAC52, 0x6631 }, + { 0xAC53, 0x6624 }, + { 0xAC54, 0x66F7 }, + { 0xAC55, 0x67FF }, + { 0xAC56, 0x67D3 }, + { 0xAC57, 0x67F1 }, + { 0xAC58, 0x67D4 }, + { 0xAC59, 0x67D0 }, + { 0xAC5A, 0x67EC }, + { 0xAC5B, 0x67B6 }, + { 0xAC5C, 0x67AF }, + { 0xAC5D, 0x67F5 }, + { 0xAC5E, 0x67E9 }, + { 0xAC5F, 0x67EF }, + { 0xAC60, 0x67C4 }, + { 0xAC61, 0x67D1 }, + { 0xAC62, 0x67B4 }, + { 0xAC63, 0x67DA }, + { 0xAC64, 0x67E5 }, + { 0xAC65, 0x67B8 }, + { 0xAC66, 0x67CF }, + { 0xAC67, 0x67DE }, + { 0xAC68, 0x67F3 }, + { 0xAC69, 0x67B0 }, + { 0xAC6A, 0x67D9 }, + { 0xAC6B, 0x67E2 }, + { 0xAC6C, 0x67DD }, + { 0xAC6D, 0x67D2 }, + { 0xAC6E, 0x6B6A }, + { 0xAC6F, 0x6B83 }, + { 0xAC70, 0x6B86 }, + { 0xAC71, 0x6BB5 }, + { 0xAC72, 0x6BD2 }, + { 0xAC73, 0x6BD7 }, + { 0xAC74, 0x6C1F }, + { 0xAC75, 0x6CC9 }, + { 0xAC76, 0x6D0B }, + { 0xAC77, 0x6D32 }, + { 0xAC78, 0x6D2A }, + { 0xAC79, 0x6D41 }, + { 0xAC7A, 0x6D25 }, + { 0xAC7B, 0x6D0C }, + { 0xAC7C, 0x6D31 }, + { 0xAC7D, 0x6D1E }, + { 0xAC7E, 0x6D17 }, + { 0xACA1, 0x6D3B }, + { 0xACA2, 0x6D3D }, + { 0xACA3, 0x6D3E }, + { 0xACA4, 0x6D36 }, + { 0xACA5, 0x6D1B }, + { 0xACA6, 0x6CF5 }, + { 0xACA7, 0x6D39 }, + { 0xACA8, 0x6D27 }, + { 0xACA9, 0x6D38 }, + { 0xACAA, 0x6D29 }, + { 0xACAB, 0x6D2E }, + { 0xACAC, 0x6D35 }, + { 0xACAD, 0x6D0E }, + { 0xACAE, 0x6D2B }, + { 0xACAF, 0x70AB }, + { 0xACB0, 0x70BA }, + { 0xACB1, 0x70B3 }, + { 0xACB2, 0x70AC }, + { 0xACB3, 0x70AF }, + { 0xACB4, 0x70AD }, + { 0xACB5, 0x70B8 }, + { 0xACB6, 0x70AE }, + { 0xACB7, 0x70A4 }, + { 0xACB8, 0x7230 }, + { 0xACB9, 0x7272 }, + { 0xACBA, 0x726F }, + { 0xACBB, 0x7274 }, + { 0xACBC, 0x72E9 }, + { 0xACBD, 0x72E0 }, + { 0xACBE, 0x72E1 }, + { 0xACBF, 0x73B7 }, + { 0xACC0, 0x73CA }, + { 0xACC1, 0x73BB }, + { 0xACC2, 0x73B2 }, + { 0xACC3, 0x73CD }, + { 0xACC4, 0x73C0 }, + { 0xACC5, 0x73B3 }, + { 0xACC6, 0x751A }, + { 0xACC7, 0x752D }, + { 0xACC8, 0x754F }, + { 0xACC9, 0x754C }, + { 0xACCA, 0x754E }, + { 0xACCB, 0x754B }, + { 0xACCC, 0x75AB }, + { 0xACCD, 0x75A4 }, + { 0xACCE, 0x75A5 }, + { 0xACCF, 0x75A2 }, + { 0xACD0, 0x75A3 }, + { 0xACD1, 0x7678 }, + { 0xACD2, 0x7686 }, + { 0xACD3, 0x7687 }, + { 0xACD4, 0x7688 }, + { 0xACD5, 0x76C8 }, + { 0xACD6, 0x76C6 }, + { 0xACD7, 0x76C3 }, + { 0xACD8, 0x76C5 }, + { 0xACD9, 0x7701 }, + { 0xACDA, 0x76F9 }, + { 0xACDB, 0x76F8 }, + { 0xACDC, 0x7709 }, + { 0xACDD, 0x770B }, + { 0xACDE, 0x76FE }, + { 0xACDF, 0x76FC }, + { 0xACE0, 0x7707 }, + { 0xACE1, 0x77DC }, + { 0xACE2, 0x7802 }, + { 0xACE3, 0x7814 }, + { 0xACE4, 0x780C }, + { 0xACE5, 0x780D }, + { 0xACE6, 0x7946 }, + { 0xACE7, 0x7949 }, + { 0xACE8, 0x7948 }, + { 0xACE9, 0x7947 }, + { 0xACEA, 0x79B9 }, + { 0xACEB, 0x79BA }, + { 0xACEC, 0x79D1 }, + { 0xACED, 0x79D2 }, + { 0xACEE, 0x79CB }, + { 0xACEF, 0x7A7F }, + { 0xACF0, 0x7A81 }, + { 0xACF1, 0x7AFF }, + { 0xACF2, 0x7AFD }, + { 0xACF3, 0x7C7D }, + { 0xACF4, 0x7D02 }, + { 0xACF5, 0x7D05 }, + { 0xACF6, 0x7D00 }, + { 0xACF7, 0x7D09 }, + { 0xACF8, 0x7D07 }, + { 0xACF9, 0x7D04 }, + { 0xACFA, 0x7D06 }, + { 0xACFB, 0x7F38 }, + { 0xACFC, 0x7F8E }, + { 0xACFD, 0x7FBF }, + { 0xACFE, 0x8004 }, + { 0xAD40, 0x8010 }, + { 0xAD41, 0x800D }, + { 0xAD42, 0x8011 }, + { 0xAD43, 0x8036 }, + { 0xAD44, 0x80D6 }, + { 0xAD45, 0x80E5 }, + { 0xAD46, 0x80DA }, + { 0xAD47, 0x80C3 }, + { 0xAD48, 0x80C4 }, + { 0xAD49, 0x80CC }, + { 0xAD4A, 0x80E1 }, + { 0xAD4B, 0x80DB }, + { 0xAD4C, 0x80CE }, + { 0xAD4D, 0x80DE }, + { 0xAD4E, 0x80E4 }, + { 0xAD4F, 0x80DD }, + { 0xAD50, 0x81F4 }, + { 0xAD51, 0x8222 }, + { 0xAD52, 0x82E7 }, + { 0xAD53, 0x8303 }, + { 0xAD54, 0x8305 }, + { 0xAD55, 0x82E3 }, + { 0xAD56, 0x82DB }, + { 0xAD57, 0x82E6 }, + { 0xAD58, 0x8304 }, + { 0xAD59, 0x82E5 }, + { 0xAD5A, 0x8302 }, + { 0xAD5B, 0x8309 }, + { 0xAD5C, 0x82D2 }, + { 0xAD5D, 0x82D7 }, + { 0xAD5E, 0x82F1 }, + { 0xAD5F, 0x8301 }, + { 0xAD60, 0x82DC }, + { 0xAD61, 0x82D4 }, + { 0xAD62, 0x82D1 }, + { 0xAD63, 0x82DE }, + { 0xAD64, 0x82D3 }, + { 0xAD65, 0x82DF }, + { 0xAD66, 0x82EF }, + { 0xAD67, 0x8306 }, + { 0xAD68, 0x8650 }, + { 0xAD69, 0x8679 }, + { 0xAD6A, 0x867B }, + { 0xAD6B, 0x867A }, + { 0xAD6C, 0x884D }, + { 0xAD6D, 0x886B }, + { 0xAD6E, 0x8981 }, + { 0xAD6F, 0x89D4 }, + { 0xAD70, 0x8A08 }, + { 0xAD71, 0x8A02 }, + { 0xAD72, 0x8A03 }, + { 0xAD73, 0x8C9E }, + { 0xAD74, 0x8CA0 }, + { 0xAD75, 0x8D74 }, + { 0xAD76, 0x8D73 }, + { 0xAD77, 0x8DB4 }, + { 0xAD78, 0x8ECD }, + { 0xAD79, 0x8ECC }, + { 0xAD7A, 0x8FF0 }, + { 0xAD7B, 0x8FE6 }, + { 0xAD7C, 0x8FE2 }, + { 0xAD7D, 0x8FEA }, + { 0xAD7E, 0x8FE5 }, + { 0xADA1, 0x8FED }, + { 0xADA2, 0x8FEB }, + { 0xADA3, 0x8FE4 }, + { 0xADA4, 0x8FE8 }, + { 0xADA5, 0x90CA }, + { 0xADA6, 0x90CE }, + { 0xADA7, 0x90C1 }, + { 0xADA8, 0x90C3 }, + { 0xADA9, 0x914B }, + { 0xADAA, 0x914A }, + { 0xADAB, 0x91CD }, + { 0xADAC, 0x9582 }, + { 0xADAD, 0x9650 }, + { 0xADAE, 0x964B }, + { 0xADAF, 0x964C }, + { 0xADB0, 0x964D }, + { 0xADB1, 0x9762 }, + { 0xADB2, 0x9769 }, + { 0xADB3, 0x97CB }, + { 0xADB4, 0x97ED }, + { 0xADB5, 0x97F3 }, + { 0xADB6, 0x9801 }, + { 0xADB7, 0x98A8 }, + { 0xADB8, 0x98DB }, + { 0xADB9, 0x98DF }, + { 0xADBA, 0x9996 }, + { 0xADBB, 0x9999 }, + { 0xADBC, 0x4E58 }, + { 0xADBD, 0x4EB3 }, + { 0xADBE, 0x500C }, + { 0xADBF, 0x500D }, + { 0xADC0, 0x5023 }, + { 0xADC1, 0x4FEF }, + { 0xADC2, 0x5026 }, + { 0xADC3, 0x5025 }, + { 0xADC4, 0x4FF8 }, + { 0xADC5, 0x5029 }, + { 0xADC6, 0x5016 }, + { 0xADC7, 0x5006 }, + { 0xADC8, 0x503C }, + { 0xADC9, 0x501F }, + { 0xADCA, 0x501A }, + { 0xADCB, 0x5012 }, + { 0xADCC, 0x5011 }, + { 0xADCD, 0x4FFA }, + { 0xADCE, 0x5000 }, + { 0xADCF, 0x5014 }, + { 0xADD0, 0x5028 }, + { 0xADD1, 0x4FF1 }, + { 0xADD2, 0x5021 }, + { 0xADD3, 0x500B }, + { 0xADD4, 0x5019 }, + { 0xADD5, 0x5018 }, + { 0xADD6, 0x4FF3 }, + { 0xADD7, 0x4FEE }, + { 0xADD8, 0x502D }, + { 0xADD9, 0x502A }, + { 0xADDA, 0x4FFE }, + { 0xADDB, 0x502B }, + { 0xADDC, 0x5009 }, + { 0xADDD, 0x517C }, + { 0xADDE, 0x51A4 }, + { 0xADDF, 0x51A5 }, + { 0xADE0, 0x51A2 }, + { 0xADE1, 0x51CD }, + { 0xADE2, 0x51CC }, + { 0xADE3, 0x51C6 }, + { 0xADE4, 0x51CB }, + { 0xADE5, 0x5256 }, + { 0xADE6, 0x525C }, + { 0xADE7, 0x5254 }, + { 0xADE8, 0x525B }, + { 0xADE9, 0x525D }, + { 0xADEA, 0x532A }, + { 0xADEB, 0x537F }, + { 0xADEC, 0x539F }, + { 0xADED, 0x539D }, + { 0xADEE, 0x53DF }, + { 0xADEF, 0x54E8 }, + { 0xADF0, 0x5510 }, + { 0xADF1, 0x5501 }, + { 0xADF2, 0x5537 }, + { 0xADF3, 0x54FC }, + { 0xADF4, 0x54E5 }, + { 0xADF5, 0x54F2 }, + { 0xADF6, 0x5506 }, + { 0xADF7, 0x54FA }, + { 0xADF8, 0x5514 }, + { 0xADF9, 0x54E9 }, + { 0xADFA, 0x54ED }, + { 0xADFB, 0x54E1 }, + { 0xADFC, 0x5509 }, + { 0xADFD, 0x54EE }, + { 0xADFE, 0x54EA }, + { 0xAE40, 0x54E6 }, + { 0xAE41, 0x5527 }, + { 0xAE42, 0x5507 }, + { 0xAE43, 0x54FD }, + { 0xAE44, 0x550F }, + { 0xAE45, 0x5703 }, + { 0xAE46, 0x5704 }, + { 0xAE47, 0x57C2 }, + { 0xAE48, 0x57D4 }, + { 0xAE49, 0x57CB }, + { 0xAE4A, 0x57C3 }, + { 0xAE4B, 0x5809 }, + { 0xAE4C, 0x590F }, + { 0xAE4D, 0x5957 }, + { 0xAE4E, 0x5958 }, + { 0xAE4F, 0x595A }, + { 0xAE50, 0x5A11 }, + { 0xAE51, 0x5A18 }, + { 0xAE52, 0x5A1C }, + { 0xAE53, 0x5A1F }, + { 0xAE54, 0x5A1B }, + { 0xAE55, 0x5A13 }, + { 0xAE56, 0x59EC }, + { 0xAE57, 0x5A20 }, + { 0xAE58, 0x5A23 }, + { 0xAE59, 0x5A29 }, + { 0xAE5A, 0x5A25 }, + { 0xAE5B, 0x5A0C }, + { 0xAE5C, 0x5A09 }, + { 0xAE5D, 0x5B6B }, + { 0xAE5E, 0x5C58 }, + { 0xAE5F, 0x5BB0 }, + { 0xAE60, 0x5BB3 }, + { 0xAE61, 0x5BB6 }, + { 0xAE62, 0x5BB4 }, + { 0xAE63, 0x5BAE }, + { 0xAE64, 0x5BB5 }, + { 0xAE65, 0x5BB9 }, + { 0xAE66, 0x5BB8 }, + { 0xAE67, 0x5C04 }, + { 0xAE68, 0x5C51 }, + { 0xAE69, 0x5C55 }, + { 0xAE6A, 0x5C50 }, + { 0xAE6B, 0x5CED }, + { 0xAE6C, 0x5CFD }, + { 0xAE6D, 0x5CFB }, + { 0xAE6E, 0x5CEA }, + { 0xAE6F, 0x5CE8 }, + { 0xAE70, 0x5CF0 }, + { 0xAE71, 0x5CF6 }, + { 0xAE72, 0x5D01 }, + { 0xAE73, 0x5CF4 }, + { 0xAE74, 0x5DEE }, + { 0xAE75, 0x5E2D }, + { 0xAE76, 0x5E2B }, + { 0xAE77, 0x5EAB }, + { 0xAE78, 0x5EAD }, + { 0xAE79, 0x5EA7 }, + { 0xAE7A, 0x5F31 }, + { 0xAE7B, 0x5F92 }, + { 0xAE7C, 0x5F91 }, + { 0xAE7D, 0x5F90 }, + { 0xAE7E, 0x6059 }, + { 0xAEA1, 0x6063 }, + { 0xAEA2, 0x6065 }, + { 0xAEA3, 0x6050 }, + { 0xAEA4, 0x6055 }, + { 0xAEA5, 0x606D }, + { 0xAEA6, 0x6069 }, + { 0xAEA7, 0x606F }, + { 0xAEA8, 0x6084 }, + { 0xAEA9, 0x609F }, + { 0xAEAA, 0x609A }, + { 0xAEAB, 0x608D }, + { 0xAEAC, 0x6094 }, + { 0xAEAD, 0x608C }, + { 0xAEAE, 0x6085 }, + { 0xAEAF, 0x6096 }, + { 0xAEB0, 0x6247 }, + { 0xAEB1, 0x62F3 }, + { 0xAEB2, 0x6308 }, + { 0xAEB3, 0x62FF }, + { 0xAEB4, 0x634E }, + { 0xAEB5, 0x633E }, + { 0xAEB6, 0x632F }, + { 0xAEB7, 0x6355 }, + { 0xAEB8, 0x6342 }, + { 0xAEB9, 0x6346 }, + { 0xAEBA, 0x634F }, + { 0xAEBB, 0x6349 }, + { 0xAEBC, 0x633A }, + { 0xAEBD, 0x6350 }, + { 0xAEBE, 0x633D }, + { 0xAEBF, 0x632A }, + { 0xAEC0, 0x632B }, + { 0xAEC1, 0x6328 }, + { 0xAEC2, 0x634D }, + { 0xAEC3, 0x634C }, + { 0xAEC4, 0x6548 }, + { 0xAEC5, 0x6549 }, + { 0xAEC6, 0x6599 }, + { 0xAEC7, 0x65C1 }, + { 0xAEC8, 0x65C5 }, + { 0xAEC9, 0x6642 }, + { 0xAECA, 0x6649 }, + { 0xAECB, 0x664F }, + { 0xAECC, 0x6643 }, + { 0xAECD, 0x6652 }, + { 0xAECE, 0x664C }, + { 0xAECF, 0x6645 }, + { 0xAED0, 0x6641 }, + { 0xAED1, 0x66F8 }, + { 0xAED2, 0x6714 }, + { 0xAED3, 0x6715 }, + { 0xAED4, 0x6717 }, + { 0xAED5, 0x6821 }, + { 0xAED6, 0x6838 }, + { 0xAED7, 0x6848 }, + { 0xAED8, 0x6846 }, + { 0xAED9, 0x6853 }, + { 0xAEDA, 0x6839 }, + { 0xAEDB, 0x6842 }, + { 0xAEDC, 0x6854 }, + { 0xAEDD, 0x6829 }, + { 0xAEDE, 0x68B3 }, + { 0xAEDF, 0x6817 }, + { 0xAEE0, 0x684C }, + { 0xAEE1, 0x6851 }, + { 0xAEE2, 0x683D }, + { 0xAEE3, 0x67F4 }, + { 0xAEE4, 0x6850 }, + { 0xAEE5, 0x6840 }, + { 0xAEE6, 0x683C }, + { 0xAEE7, 0x6843 }, + { 0xAEE8, 0x682A }, + { 0xAEE9, 0x6845 }, + { 0xAEEA, 0x6813 }, + { 0xAEEB, 0x6818 }, + { 0xAEEC, 0x6841 }, + { 0xAEED, 0x6B8A }, + { 0xAEEE, 0x6B89 }, + { 0xAEEF, 0x6BB7 }, + { 0xAEF0, 0x6C23 }, + { 0xAEF1, 0x6C27 }, + { 0xAEF2, 0x6C28 }, + { 0xAEF3, 0x6C26 }, + { 0xAEF4, 0x6C24 }, + { 0xAEF5, 0x6CF0 }, + { 0xAEF6, 0x6D6A }, + { 0xAEF7, 0x6D95 }, + { 0xAEF8, 0x6D88 }, + { 0xAEF9, 0x6D87 }, + { 0xAEFA, 0x6D66 }, + { 0xAEFB, 0x6D78 }, + { 0xAEFC, 0x6D77 }, + { 0xAEFD, 0x6D59 }, + { 0xAEFE, 0x6D93 }, + { 0xAF40, 0x6D6C }, + { 0xAF41, 0x6D89 }, + { 0xAF42, 0x6D6E }, + { 0xAF43, 0x6D5A }, + { 0xAF44, 0x6D74 }, + { 0xAF45, 0x6D69 }, + { 0xAF46, 0x6D8C }, + { 0xAF47, 0x6D8A }, + { 0xAF48, 0x6D79 }, + { 0xAF49, 0x6D85 }, + { 0xAF4A, 0x6D65 }, + { 0xAF4B, 0x6D94 }, + { 0xAF4C, 0x70CA }, + { 0xAF4D, 0x70D8 }, + { 0xAF4E, 0x70E4 }, + { 0xAF4F, 0x70D9 }, + { 0xAF50, 0x70C8 }, + { 0xAF51, 0x70CF }, + { 0xAF52, 0x7239 }, + { 0xAF53, 0x7279 }, + { 0xAF54, 0x72FC }, + { 0xAF55, 0x72F9 }, + { 0xAF56, 0x72FD }, + { 0xAF57, 0x72F8 }, + { 0xAF58, 0x72F7 }, + { 0xAF59, 0x7386 }, + { 0xAF5A, 0x73ED }, + { 0xAF5B, 0x7409 }, + { 0xAF5C, 0x73EE }, + { 0xAF5D, 0x73E0 }, + { 0xAF5E, 0x73EA }, + { 0xAF5F, 0x73DE }, + { 0xAF60, 0x7554 }, + { 0xAF61, 0x755D }, + { 0xAF62, 0x755C }, + { 0xAF63, 0x755A }, + { 0xAF64, 0x7559 }, + { 0xAF65, 0x75BE }, + { 0xAF66, 0x75C5 }, + { 0xAF67, 0x75C7 }, + { 0xAF68, 0x75B2 }, + { 0xAF69, 0x75B3 }, + { 0xAF6A, 0x75BD }, + { 0xAF6B, 0x75BC }, + { 0xAF6C, 0x75B9 }, + { 0xAF6D, 0x75C2 }, + { 0xAF6E, 0x75B8 }, + { 0xAF6F, 0x768B }, + { 0xAF70, 0x76B0 }, + { 0xAF71, 0x76CA }, + { 0xAF72, 0x76CD }, + { 0xAF73, 0x76CE }, + { 0xAF74, 0x7729 }, + { 0xAF75, 0x771F }, + { 0xAF76, 0x7720 }, + { 0xAF77, 0x7728 }, + { 0xAF78, 0x77E9 }, + { 0xAF79, 0x7830 }, + { 0xAF7A, 0x7827 }, + { 0xAF7B, 0x7838 }, + { 0xAF7C, 0x781D }, + { 0xAF7D, 0x7834 }, + { 0xAF7E, 0x7837 }, + { 0xAFA1, 0x7825 }, + { 0xAFA2, 0x782D }, + { 0xAFA3, 0x7820 }, + { 0xAFA4, 0x781F }, + { 0xAFA5, 0x7832 }, + { 0xAFA6, 0x7955 }, + { 0xAFA7, 0x7950 }, + { 0xAFA8, 0x7960 }, + { 0xAFA9, 0x795F }, + { 0xAFAA, 0x7956 }, + { 0xAFAB, 0x795E }, + { 0xAFAC, 0x795D }, + { 0xAFAD, 0x7957 }, + { 0xAFAE, 0x795A }, + { 0xAFAF, 0x79E4 }, + { 0xAFB0, 0x79E3 }, + { 0xAFB1, 0x79E7 }, + { 0xAFB2, 0x79DF }, + { 0xAFB3, 0x79E6 }, + { 0xAFB4, 0x79E9 }, + { 0xAFB5, 0x79D8 }, + { 0xAFB6, 0x7A84 }, + { 0xAFB7, 0x7A88 }, + { 0xAFB8, 0x7AD9 }, + { 0xAFB9, 0x7B06 }, + { 0xAFBA, 0x7B11 }, + { 0xAFBB, 0x7C89 }, + { 0xAFBC, 0x7D21 }, + { 0xAFBD, 0x7D17 }, + { 0xAFBE, 0x7D0B }, + { 0xAFBF, 0x7D0A }, + { 0xAFC0, 0x7D20 }, + { 0xAFC1, 0x7D22 }, + { 0xAFC2, 0x7D14 }, + { 0xAFC3, 0x7D10 }, + { 0xAFC4, 0x7D15 }, + { 0xAFC5, 0x7D1A }, + { 0xAFC6, 0x7D1C }, + { 0xAFC7, 0x7D0D }, + { 0xAFC8, 0x7D19 }, + { 0xAFC9, 0x7D1B }, + { 0xAFCA, 0x7F3A }, + { 0xAFCB, 0x7F5F }, + { 0xAFCC, 0x7F94 }, + { 0xAFCD, 0x7FC5 }, + { 0xAFCE, 0x7FC1 }, + { 0xAFCF, 0x8006 }, + { 0xAFD0, 0x8018 }, + { 0xAFD1, 0x8015 }, + { 0xAFD2, 0x8019 }, + { 0xAFD3, 0x8017 }, + { 0xAFD4, 0x803D }, + { 0xAFD5, 0x803F }, + { 0xAFD6, 0x80F1 }, + { 0xAFD7, 0x8102 }, + { 0xAFD8, 0x80F0 }, + { 0xAFD9, 0x8105 }, + { 0xAFDA, 0x80ED }, + { 0xAFDB, 0x80F4 }, + { 0xAFDC, 0x8106 }, + { 0xAFDD, 0x80F8 }, + { 0xAFDE, 0x80F3 }, + { 0xAFDF, 0x8108 }, + { 0xAFE0, 0x80FD }, + { 0xAFE1, 0x810A }, + { 0xAFE2, 0x80FC }, + { 0xAFE3, 0x80EF }, + { 0xAFE4, 0x81ED }, + { 0xAFE5, 0x81EC }, + { 0xAFE6, 0x8200 }, + { 0xAFE7, 0x8210 }, + { 0xAFE8, 0x822A }, + { 0xAFE9, 0x822B }, + { 0xAFEA, 0x8228 }, + { 0xAFEB, 0x822C }, + { 0xAFEC, 0x82BB }, + { 0xAFED, 0x832B }, + { 0xAFEE, 0x8352 }, + { 0xAFEF, 0x8354 }, + { 0xAFF0, 0x834A }, + { 0xAFF1, 0x8338 }, + { 0xAFF2, 0x8350 }, + { 0xAFF3, 0x8349 }, + { 0xAFF4, 0x8335 }, + { 0xAFF5, 0x8334 }, + { 0xAFF6, 0x834F }, + { 0xAFF7, 0x8332 }, + { 0xAFF8, 0x8339 }, + { 0xAFF9, 0x8336 }, + { 0xAFFA, 0x8317 }, + { 0xAFFB, 0x8340 }, + { 0xAFFC, 0x8331 }, + { 0xAFFD, 0x8328 }, + { 0xAFFE, 0x8343 }, + { 0xB040, 0x8654 }, + { 0xB041, 0x868A }, + { 0xB042, 0x86AA }, + { 0xB043, 0x8693 }, + { 0xB044, 0x86A4 }, + { 0xB045, 0x86A9 }, + { 0xB046, 0x868C }, + { 0xB047, 0x86A3 }, + { 0xB048, 0x869C }, + { 0xB049, 0x8870 }, + { 0xB04A, 0x8877 }, + { 0xB04B, 0x8881 }, + { 0xB04C, 0x8882 }, + { 0xB04D, 0x887D }, + { 0xB04E, 0x8879 }, + { 0xB04F, 0x8A18 }, + { 0xB050, 0x8A10 }, + { 0xB051, 0x8A0E }, + { 0xB052, 0x8A0C }, + { 0xB053, 0x8A15 }, + { 0xB054, 0x8A0A }, + { 0xB055, 0x8A17 }, + { 0xB056, 0x8A13 }, + { 0xB057, 0x8A16 }, + { 0xB058, 0x8A0F }, + { 0xB059, 0x8A11 }, + { 0xB05A, 0x8C48 }, + { 0xB05B, 0x8C7A }, + { 0xB05C, 0x8C79 }, + { 0xB05D, 0x8CA1 }, + { 0xB05E, 0x8CA2 }, + { 0xB05F, 0x8D77 }, + { 0xB060, 0x8EAC }, + { 0xB061, 0x8ED2 }, + { 0xB062, 0x8ED4 }, + { 0xB063, 0x8ECF }, + { 0xB064, 0x8FB1 }, + { 0xB065, 0x9001 }, + { 0xB066, 0x9006 }, + { 0xB067, 0x8FF7 }, + { 0xB068, 0x9000 }, + { 0xB069, 0x8FFA }, + { 0xB06A, 0x8FF4 }, + { 0xB06B, 0x9003 }, + { 0xB06C, 0x8FFD }, + { 0xB06D, 0x9005 }, + { 0xB06E, 0x8FF8 }, + { 0xB06F, 0x9095 }, + { 0xB070, 0x90E1 }, + { 0xB071, 0x90DD }, + { 0xB072, 0x90E2 }, + { 0xB073, 0x9152 }, + { 0xB074, 0x914D }, + { 0xB075, 0x914C }, + { 0xB076, 0x91D8 }, + { 0xB077, 0x91DD }, + { 0xB078, 0x91D7 }, + { 0xB079, 0x91DC }, + { 0xB07A, 0x91D9 }, + { 0xB07B, 0x9583 }, + { 0xB07C, 0x9662 }, + { 0xB07D, 0x9663 }, + { 0xB07E, 0x9661 }, + { 0xB0A1, 0x965B }, + { 0xB0A2, 0x965D }, + { 0xB0A3, 0x9664 }, + { 0xB0A4, 0x9658 }, + { 0xB0A5, 0x965E }, + { 0xB0A6, 0x96BB }, + { 0xB0A7, 0x98E2 }, + { 0xB0A8, 0x99AC }, + { 0xB0A9, 0x9AA8 }, + { 0xB0AA, 0x9AD8 }, + { 0xB0AB, 0x9B25 }, + { 0xB0AC, 0x9B32 }, + { 0xB0AD, 0x9B3C }, + { 0xB0AE, 0x4E7E }, + { 0xB0AF, 0x507A }, + { 0xB0B0, 0x507D }, + { 0xB0B1, 0x505C }, + { 0xB0B2, 0x5047 }, + { 0xB0B3, 0x5043 }, + { 0xB0B4, 0x504C }, + { 0xB0B5, 0x505A }, + { 0xB0B6, 0x5049 }, + { 0xB0B7, 0x5065 }, + { 0xB0B8, 0x5076 }, + { 0xB0B9, 0x504E }, + { 0xB0BA, 0x5055 }, + { 0xB0BB, 0x5075 }, + { 0xB0BC, 0x5074 }, + { 0xB0BD, 0x5077 }, + { 0xB0BE, 0x504F }, + { 0xB0BF, 0x500F }, + { 0xB0C0, 0x506F }, + { 0xB0C1, 0x506D }, + { 0xB0C2, 0x515C }, + { 0xB0C3, 0x5195 }, + { 0xB0C4, 0x51F0 }, + { 0xB0C5, 0x526A }, + { 0xB0C6, 0x526F }, + { 0xB0C7, 0x52D2 }, + { 0xB0C8, 0x52D9 }, + { 0xB0C9, 0x52D8 }, + { 0xB0CA, 0x52D5 }, + { 0xB0CB, 0x5310 }, + { 0xB0CC, 0x530F }, + { 0xB0CD, 0x5319 }, + { 0xB0CE, 0x533F }, + { 0xB0CF, 0x5340 }, + { 0xB0D0, 0x533E }, + { 0xB0D1, 0x53C3 }, + { 0xB0D2, 0x66FC }, + { 0xB0D3, 0x5546 }, + { 0xB0D4, 0x556A }, + { 0xB0D5, 0x5566 }, + { 0xB0D6, 0x5544 }, + { 0xB0D7, 0x555E }, + { 0xB0D8, 0x5561 }, + { 0xB0D9, 0x5543 }, + { 0xB0DA, 0x554A }, + { 0xB0DB, 0x5531 }, + { 0xB0DC, 0x5556 }, + { 0xB0DD, 0x554F }, + { 0xB0DE, 0x5555 }, + { 0xB0DF, 0x552F }, + { 0xB0E0, 0x5564 }, + { 0xB0E1, 0x5538 }, + { 0xB0E2, 0x552E }, + { 0xB0E3, 0x555C }, + { 0xB0E4, 0x552C }, + { 0xB0E5, 0x5563 }, + { 0xB0E6, 0x5533 }, + { 0xB0E7, 0x5541 }, + { 0xB0E8, 0x5557 }, + { 0xB0E9, 0x5708 }, + { 0xB0EA, 0x570B }, + { 0xB0EB, 0x5709 }, + { 0xB0EC, 0x57DF }, + { 0xB0ED, 0x5805 }, + { 0xB0EE, 0x580A }, + { 0xB0EF, 0x5806 }, + { 0xB0F0, 0x57E0 }, + { 0xB0F1, 0x57E4 }, + { 0xB0F2, 0x57FA }, + { 0xB0F3, 0x5802 }, + { 0xB0F4, 0x5835 }, + { 0xB0F5, 0x57F7 }, + { 0xB0F6, 0x57F9 }, + { 0xB0F7, 0x5920 }, + { 0xB0F8, 0x5962 }, + { 0xB0F9, 0x5A36 }, + { 0xB0FA, 0x5A41 }, + { 0xB0FB, 0x5A49 }, + { 0xB0FC, 0x5A66 }, + { 0xB0FD, 0x5A6A }, + { 0xB0FE, 0x5A40 }, + { 0xB140, 0x5A3C }, + { 0xB141, 0x5A62 }, + { 0xB142, 0x5A5A }, + { 0xB143, 0x5A46 }, + { 0xB144, 0x5A4A }, + { 0xB145, 0x5B70 }, + { 0xB146, 0x5BC7 }, + { 0xB147, 0x5BC5 }, + { 0xB148, 0x5BC4 }, + { 0xB149, 0x5BC2 }, + { 0xB14A, 0x5BBF }, + { 0xB14B, 0x5BC6 }, + { 0xB14C, 0x5C09 }, + { 0xB14D, 0x5C08 }, + { 0xB14E, 0x5C07 }, + { 0xB14F, 0x5C60 }, + { 0xB150, 0x5C5C }, + { 0xB151, 0x5C5D }, + { 0xB152, 0x5D07 }, + { 0xB153, 0x5D06 }, + { 0xB154, 0x5D0E }, + { 0xB155, 0x5D1B }, + { 0xB156, 0x5D16 }, + { 0xB157, 0x5D22 }, + { 0xB158, 0x5D11 }, + { 0xB159, 0x5D29 }, + { 0xB15A, 0x5D14 }, + { 0xB15B, 0x5D19 }, + { 0xB15C, 0x5D24 }, + { 0xB15D, 0x5D27 }, + { 0xB15E, 0x5D17 }, + { 0xB15F, 0x5DE2 }, + { 0xB160, 0x5E38 }, + { 0xB161, 0x5E36 }, + { 0xB162, 0x5E33 }, + { 0xB163, 0x5E37 }, + { 0xB164, 0x5EB7 }, + { 0xB165, 0x5EB8 }, + { 0xB166, 0x5EB6 }, + { 0xB167, 0x5EB5 }, + { 0xB168, 0x5EBE }, + { 0xB169, 0x5F35 }, + { 0xB16A, 0x5F37 }, + { 0xB16B, 0x5F57 }, + { 0xB16C, 0x5F6C }, + { 0xB16D, 0x5F69 }, + { 0xB16E, 0x5F6B }, + { 0xB16F, 0x5F97 }, + { 0xB170, 0x5F99 }, + { 0xB171, 0x5F9E }, + { 0xB172, 0x5F98 }, + { 0xB173, 0x5FA1 }, + { 0xB174, 0x5FA0 }, + { 0xB175, 0x5F9C }, + { 0xB176, 0x607F }, + { 0xB177, 0x60A3 }, + { 0xB178, 0x6089 }, + { 0xB179, 0x60A0 }, + { 0xB17A, 0x60A8 }, + { 0xB17B, 0x60CB }, + { 0xB17C, 0x60B4 }, + { 0xB17D, 0x60E6 }, + { 0xB17E, 0x60BD }, + { 0xB1A1, 0x60C5 }, + { 0xB1A2, 0x60BB }, + { 0xB1A3, 0x60B5 }, + { 0xB1A4, 0x60DC }, + { 0xB1A5, 0x60BC }, + { 0xB1A6, 0x60D8 }, + { 0xB1A7, 0x60D5 }, + { 0xB1A8, 0x60C6 }, + { 0xB1A9, 0x60DF }, + { 0xB1AA, 0x60B8 }, + { 0xB1AB, 0x60DA }, + { 0xB1AC, 0x60C7 }, + { 0xB1AD, 0x621A }, + { 0xB1AE, 0x621B }, + { 0xB1AF, 0x6248 }, + { 0xB1B0, 0x63A0 }, + { 0xB1B1, 0x63A7 }, + { 0xB1B2, 0x6372 }, + { 0xB1B3, 0x6396 }, + { 0xB1B4, 0x63A2 }, + { 0xB1B5, 0x63A5 }, + { 0xB1B6, 0x6377 }, + { 0xB1B7, 0x6367 }, + { 0xB1B8, 0x6398 }, + { 0xB1B9, 0x63AA }, + { 0xB1BA, 0x6371 }, + { 0xB1BB, 0x63A9 }, + { 0xB1BC, 0x6389 }, + { 0xB1BD, 0x6383 }, + { 0xB1BE, 0x639B }, + { 0xB1BF, 0x636B }, + { 0xB1C0, 0x63A8 }, + { 0xB1C1, 0x6384 }, + { 0xB1C2, 0x6388 }, + { 0xB1C3, 0x6399 }, + { 0xB1C4, 0x63A1 }, + { 0xB1C5, 0x63AC }, + { 0xB1C6, 0x6392 }, + { 0xB1C7, 0x638F }, + { 0xB1C8, 0x6380 }, + { 0xB1C9, 0x637B }, + { 0xB1CA, 0x6369 }, + { 0xB1CB, 0x6368 }, + { 0xB1CC, 0x637A }, + { 0xB1CD, 0x655D }, + { 0xB1CE, 0x6556 }, + { 0xB1CF, 0x6551 }, + { 0xB1D0, 0x6559 }, + { 0xB1D1, 0x6557 }, + { 0xB1D2, 0x555F }, + { 0xB1D3, 0x654F }, + { 0xB1D4, 0x6558 }, + { 0xB1D5, 0x6555 }, + { 0xB1D6, 0x6554 }, + { 0xB1D7, 0x659C }, + { 0xB1D8, 0x659B }, + { 0xB1D9, 0x65AC }, + { 0xB1DA, 0x65CF }, + { 0xB1DB, 0x65CB }, + { 0xB1DC, 0x65CC }, + { 0xB1DD, 0x65CE }, + { 0xB1DE, 0x665D }, + { 0xB1DF, 0x665A }, + { 0xB1E0, 0x6664 }, + { 0xB1E1, 0x6668 }, + { 0xB1E2, 0x6666 }, + { 0xB1E3, 0x665E }, + { 0xB1E4, 0x66F9 }, + { 0xB1E5, 0x52D7 }, + { 0xB1E6, 0x671B }, + { 0xB1E7, 0x6881 }, + { 0xB1E8, 0x68AF }, + { 0xB1E9, 0x68A2 }, + { 0xB1EA, 0x6893 }, + { 0xB1EB, 0x68B5 }, + { 0xB1EC, 0x687F }, + { 0xB1ED, 0x6876 }, + { 0xB1EE, 0x68B1 }, + { 0xB1EF, 0x68A7 }, + { 0xB1F0, 0x6897 }, + { 0xB1F1, 0x68B0 }, + { 0xB1F2, 0x6883 }, + { 0xB1F3, 0x68C4 }, + { 0xB1F4, 0x68AD }, + { 0xB1F5, 0x6886 }, + { 0xB1F6, 0x6885 }, + { 0xB1F7, 0x6894 }, + { 0xB1F8, 0x689D }, + { 0xB1F9, 0x68A8 }, + { 0xB1FA, 0x689F }, + { 0xB1FB, 0x68A1 }, + { 0xB1FC, 0x6882 }, + { 0xB1FD, 0x6B32 }, + { 0xB1FE, 0x6BBA }, + { 0xB240, 0x6BEB }, + { 0xB241, 0x6BEC }, + { 0xB242, 0x6C2B }, + { 0xB243, 0x6D8E }, + { 0xB244, 0x6DBC }, + { 0xB245, 0x6DF3 }, + { 0xB246, 0x6DD9 }, + { 0xB247, 0x6DB2 }, + { 0xB248, 0x6DE1 }, + { 0xB249, 0x6DCC }, + { 0xB24A, 0x6DE4 }, + { 0xB24B, 0x6DFB }, + { 0xB24C, 0x6DFA }, + { 0xB24D, 0x6E05 }, + { 0xB24E, 0x6DC7 }, + { 0xB24F, 0x6DCB }, + { 0xB250, 0x6DAF }, + { 0xB251, 0x6DD1 }, + { 0xB252, 0x6DAE }, + { 0xB253, 0x6DDE }, + { 0xB254, 0x6DF9 }, + { 0xB255, 0x6DB8 }, + { 0xB256, 0x6DF7 }, + { 0xB257, 0x6DF5 }, + { 0xB258, 0x6DC5 }, + { 0xB259, 0x6DD2 }, + { 0xB25A, 0x6E1A }, + { 0xB25B, 0x6DB5 }, + { 0xB25C, 0x6DDA }, + { 0xB25D, 0x6DEB }, + { 0xB25E, 0x6DD8 }, + { 0xB25F, 0x6DEA }, + { 0xB260, 0x6DF1 }, + { 0xB261, 0x6DEE }, + { 0xB262, 0x6DE8 }, + { 0xB263, 0x6DC6 }, + { 0xB264, 0x6DC4 }, + { 0xB265, 0x6DAA }, + { 0xB266, 0x6DEC }, + { 0xB267, 0x6DBF }, + { 0xB268, 0x6DE6 }, + { 0xB269, 0x70F9 }, + { 0xB26A, 0x7109 }, + { 0xB26B, 0x710A }, + { 0xB26C, 0x70FD }, + { 0xB26D, 0x70EF }, + { 0xB26E, 0x723D }, + { 0xB26F, 0x727D }, + { 0xB270, 0x7281 }, + { 0xB271, 0x731C }, + { 0xB272, 0x731B }, + { 0xB273, 0x7316 }, + { 0xB274, 0x7313 }, + { 0xB275, 0x7319 }, + { 0xB276, 0x7387 }, + { 0xB277, 0x7405 }, + { 0xB278, 0x740A }, + { 0xB279, 0x7403 }, + { 0xB27A, 0x7406 }, + { 0xB27B, 0x73FE }, + { 0xB27C, 0x740D }, + { 0xB27D, 0x74E0 }, + { 0xB27E, 0x74F6 }, + { 0xB2A1, 0x74F7 }, + { 0xB2A2, 0x751C }, + { 0xB2A3, 0x7522 }, + { 0xB2A4, 0x7565 }, + { 0xB2A5, 0x7566 }, + { 0xB2A6, 0x7562 }, + { 0xB2A7, 0x7570 }, + { 0xB2A8, 0x758F }, + { 0xB2A9, 0x75D4 }, + { 0xB2AA, 0x75D5 }, + { 0xB2AB, 0x75B5 }, + { 0xB2AC, 0x75CA }, + { 0xB2AD, 0x75CD }, + { 0xB2AE, 0x768E }, + { 0xB2AF, 0x76D4 }, + { 0xB2B0, 0x76D2 }, + { 0xB2B1, 0x76DB }, + { 0xB2B2, 0x7737 }, + { 0xB2B3, 0x773E }, + { 0xB2B4, 0x773C }, + { 0xB2B5, 0x7736 }, + { 0xB2B6, 0x7738 }, + { 0xB2B7, 0x773A }, + { 0xB2B8, 0x786B }, + { 0xB2B9, 0x7843 }, + { 0xB2BA, 0x784E }, + { 0xB2BB, 0x7965 }, + { 0xB2BC, 0x7968 }, + { 0xB2BD, 0x796D }, + { 0xB2BE, 0x79FB }, + { 0xB2BF, 0x7A92 }, + { 0xB2C0, 0x7A95 }, + { 0xB2C1, 0x7B20 }, + { 0xB2C2, 0x7B28 }, + { 0xB2C3, 0x7B1B }, + { 0xB2C4, 0x7B2C }, + { 0xB2C5, 0x7B26 }, + { 0xB2C6, 0x7B19 }, + { 0xB2C7, 0x7B1E }, + { 0xB2C8, 0x7B2E }, + { 0xB2C9, 0x7C92 }, + { 0xB2CA, 0x7C97 }, + { 0xB2CB, 0x7C95 }, + { 0xB2CC, 0x7D46 }, + { 0xB2CD, 0x7D43 }, + { 0xB2CE, 0x7D71 }, + { 0xB2CF, 0x7D2E }, + { 0xB2D0, 0x7D39 }, + { 0xB2D1, 0x7D3C }, + { 0xB2D2, 0x7D40 }, + { 0xB2D3, 0x7D30 }, + { 0xB2D4, 0x7D33 }, + { 0xB2D5, 0x7D44 }, + { 0xB2D6, 0x7D2F }, + { 0xB2D7, 0x7D42 }, + { 0xB2D8, 0x7D32 }, + { 0xB2D9, 0x7D31 }, + { 0xB2DA, 0x7F3D }, + { 0xB2DB, 0x7F9E }, + { 0xB2DC, 0x7F9A }, + { 0xB2DD, 0x7FCC }, + { 0xB2DE, 0x7FCE }, + { 0xB2DF, 0x7FD2 }, + { 0xB2E0, 0x801C }, + { 0xB2E1, 0x804A }, + { 0xB2E2, 0x8046 }, + { 0xB2E3, 0x812F }, + { 0xB2E4, 0x8116 }, + { 0xB2E5, 0x8123 }, + { 0xB2E6, 0x812B }, + { 0xB2E7, 0x8129 }, + { 0xB2E8, 0x8130 }, + { 0xB2E9, 0x8124 }, + { 0xB2EA, 0x8202 }, + { 0xB2EB, 0x8235 }, + { 0xB2EC, 0x8237 }, + { 0xB2ED, 0x8236 }, + { 0xB2EE, 0x8239 }, + { 0xB2EF, 0x838E }, + { 0xB2F0, 0x839E }, + { 0xB2F1, 0x8398 }, + { 0xB2F2, 0x8378 }, + { 0xB2F3, 0x83A2 }, + { 0xB2F4, 0x8396 }, + { 0xB2F5, 0x83BD }, + { 0xB2F6, 0x83AB }, + { 0xB2F7, 0x8392 }, + { 0xB2F8, 0x838A }, + { 0xB2F9, 0x8393 }, + { 0xB2FA, 0x8389 }, + { 0xB2FB, 0x83A0 }, + { 0xB2FC, 0x8377 }, + { 0xB2FD, 0x837B }, + { 0xB2FE, 0x837C }, + { 0xB340, 0x8386 }, + { 0xB341, 0x83A7 }, + { 0xB342, 0x8655 }, + { 0xB343, 0x5F6A }, + { 0xB344, 0x86C7 }, + { 0xB345, 0x86C0 }, + { 0xB346, 0x86B6 }, + { 0xB347, 0x86C4 }, + { 0xB348, 0x86B5 }, + { 0xB349, 0x86C6 }, + { 0xB34A, 0x86CB }, + { 0xB34B, 0x86B1 }, + { 0xB34C, 0x86AF }, + { 0xB34D, 0x86C9 }, + { 0xB34E, 0x8853 }, + { 0xB34F, 0x889E }, + { 0xB350, 0x8888 }, + { 0xB351, 0x88AB }, + { 0xB352, 0x8892 }, + { 0xB353, 0x8896 }, + { 0xB354, 0x888D }, + { 0xB355, 0x888B }, + { 0xB356, 0x8993 }, + { 0xB357, 0x898F }, + { 0xB358, 0x8A2A }, + { 0xB359, 0x8A1D }, + { 0xB35A, 0x8A23 }, + { 0xB35B, 0x8A25 }, + { 0xB35C, 0x8A31 }, + { 0xB35D, 0x8A2D }, + { 0xB35E, 0x8A1F }, + { 0xB35F, 0x8A1B }, + { 0xB360, 0x8A22 }, + { 0xB361, 0x8C49 }, + { 0xB362, 0x8C5A }, + { 0xB363, 0x8CA9 }, + { 0xB364, 0x8CAC }, + { 0xB365, 0x8CAB }, + { 0xB366, 0x8CA8 }, + { 0xB367, 0x8CAA }, + { 0xB368, 0x8CA7 }, + { 0xB369, 0x8D67 }, + { 0xB36A, 0x8D66 }, + { 0xB36B, 0x8DBE }, + { 0xB36C, 0x8DBA }, + { 0xB36D, 0x8EDB }, + { 0xB36E, 0x8EDF }, + { 0xB36F, 0x9019 }, + { 0xB370, 0x900D }, + { 0xB371, 0x901A }, + { 0xB372, 0x9017 }, + { 0xB373, 0x9023 }, + { 0xB374, 0x901F }, + { 0xB375, 0x901D }, + { 0xB376, 0x9010 }, + { 0xB377, 0x9015 }, + { 0xB378, 0x901E }, + { 0xB379, 0x9020 }, + { 0xB37A, 0x900F }, + { 0xB37B, 0x9022 }, + { 0xB37C, 0x9016 }, + { 0xB37D, 0x901B }, + { 0xB37E, 0x9014 }, + { 0xB3A1, 0x90E8 }, + { 0xB3A2, 0x90ED }, + { 0xB3A3, 0x90FD }, + { 0xB3A4, 0x9157 }, + { 0xB3A5, 0x91CE }, + { 0xB3A6, 0x91F5 }, + { 0xB3A7, 0x91E6 }, + { 0xB3A8, 0x91E3 }, + { 0xB3A9, 0x91E7 }, + { 0xB3AA, 0x91ED }, + { 0xB3AB, 0x91E9 }, + { 0xB3AC, 0x9589 }, + { 0xB3AD, 0x966A }, + { 0xB3AE, 0x9675 }, + { 0xB3AF, 0x9673 }, + { 0xB3B0, 0x9678 }, + { 0xB3B1, 0x9670 }, + { 0xB3B2, 0x9674 }, + { 0xB3B3, 0x9676 }, + { 0xB3B4, 0x9677 }, + { 0xB3B5, 0x966C }, + { 0xB3B6, 0x96C0 }, + { 0xB3B7, 0x96EA }, + { 0xB3B8, 0x96E9 }, + { 0xB3B9, 0x7AE0 }, + { 0xB3BA, 0x7ADF }, + { 0xB3BB, 0x9802 }, + { 0xB3BC, 0x9803 }, + { 0xB3BD, 0x9B5A }, + { 0xB3BE, 0x9CE5 }, + { 0xB3BF, 0x9E75 }, + { 0xB3C0, 0x9E7F }, + { 0xB3C1, 0x9EA5 }, + { 0xB3C2, 0x9EBB }, + { 0xB3C3, 0x50A2 }, + { 0xB3C4, 0x508D }, + { 0xB3C5, 0x5085 }, + { 0xB3C6, 0x5099 }, + { 0xB3C7, 0x5091 }, + { 0xB3C8, 0x5080 }, + { 0xB3C9, 0x5096 }, + { 0xB3CA, 0x5098 }, + { 0xB3CB, 0x509A }, + { 0xB3CC, 0x6700 }, + { 0xB3CD, 0x51F1 }, + { 0xB3CE, 0x5272 }, + { 0xB3CF, 0x5274 }, + { 0xB3D0, 0x5275 }, + { 0xB3D1, 0x5269 }, + { 0xB3D2, 0x52DE }, + { 0xB3D3, 0x52DD }, + { 0xB3D4, 0x52DB }, + { 0xB3D5, 0x535A }, + { 0xB3D6, 0x53A5 }, + { 0xB3D7, 0x557B }, + { 0xB3D8, 0x5580 }, + { 0xB3D9, 0x55A7 }, + { 0xB3DA, 0x557C }, + { 0xB3DB, 0x558A }, + { 0xB3DC, 0x559D }, + { 0xB3DD, 0x5598 }, + { 0xB3DE, 0x5582 }, + { 0xB3DF, 0x559C }, + { 0xB3E0, 0x55AA }, + { 0xB3E1, 0x5594 }, + { 0xB3E2, 0x5587 }, + { 0xB3E3, 0x558B }, + { 0xB3E4, 0x5583 }, + { 0xB3E5, 0x55B3 }, + { 0xB3E6, 0x55AE }, + { 0xB3E7, 0x559F }, + { 0xB3E8, 0x553E }, + { 0xB3E9, 0x55B2 }, + { 0xB3EA, 0x559A }, + { 0xB3EB, 0x55BB }, + { 0xB3EC, 0x55AC }, + { 0xB3ED, 0x55B1 }, + { 0xB3EE, 0x557E }, + { 0xB3EF, 0x5589 }, + { 0xB3F0, 0x55AB }, + { 0xB3F1, 0x5599 }, + { 0xB3F2, 0x570D }, + { 0xB3F3, 0x582F }, + { 0xB3F4, 0x582A }, + { 0xB3F5, 0x5834 }, + { 0xB3F6, 0x5824 }, + { 0xB3F7, 0x5830 }, + { 0xB3F8, 0x5831 }, + { 0xB3F9, 0x5821 }, + { 0xB3FA, 0x581D }, + { 0xB3FB, 0x5820 }, + { 0xB3FC, 0x58F9 }, + { 0xB3FD, 0x58FA }, + { 0xB3FE, 0x5960 }, + { 0xB440, 0x5A77 }, + { 0xB441, 0x5A9A }, + { 0xB442, 0x5A7F }, + { 0xB443, 0x5A92 }, + { 0xB444, 0x5A9B }, + { 0xB445, 0x5AA7 }, + { 0xB446, 0x5B73 }, + { 0xB447, 0x5B71 }, + { 0xB448, 0x5BD2 }, + { 0xB449, 0x5BCC }, + { 0xB44A, 0x5BD3 }, + { 0xB44B, 0x5BD0 }, + { 0xB44C, 0x5C0A }, + { 0xB44D, 0x5C0B }, + { 0xB44E, 0x5C31 }, + { 0xB44F, 0x5D4C }, + { 0xB450, 0x5D50 }, + { 0xB451, 0x5D34 }, + { 0xB452, 0x5D47 }, + { 0xB453, 0x5DFD }, + { 0xB454, 0x5E45 }, + { 0xB455, 0x5E3D }, + { 0xB456, 0x5E40 }, + { 0xB457, 0x5E43 }, + { 0xB458, 0x5E7E }, + { 0xB459, 0x5ECA }, + { 0xB45A, 0x5EC1 }, + { 0xB45B, 0x5EC2 }, + { 0xB45C, 0x5EC4 }, + { 0xB45D, 0x5F3C }, + { 0xB45E, 0x5F6D }, + { 0xB45F, 0x5FA9 }, + { 0xB460, 0x5FAA }, + { 0xB461, 0x5FA8 }, + { 0xB462, 0x60D1 }, + { 0xB463, 0x60E1 }, + { 0xB464, 0x60B2 }, + { 0xB465, 0x60B6 }, + { 0xB466, 0x60E0 }, + { 0xB467, 0x611C }, + { 0xB468, 0x6123 }, + { 0xB469, 0x60FA }, + { 0xB46A, 0x6115 }, + { 0xB46B, 0x60F0 }, + { 0xB46C, 0x60FB }, + { 0xB46D, 0x60F4 }, + { 0xB46E, 0x6168 }, + { 0xB46F, 0x60F1 }, + { 0xB470, 0x610E }, + { 0xB471, 0x60F6 }, + { 0xB472, 0x6109 }, + { 0xB473, 0x6100 }, + { 0xB474, 0x6112 }, + { 0xB475, 0x621F }, + { 0xB476, 0x6249 }, + { 0xB477, 0x63A3 }, + { 0xB478, 0x638C }, + { 0xB479, 0x63CF }, + { 0xB47A, 0x63C0 }, + { 0xB47B, 0x63E9 }, + { 0xB47C, 0x63C9 }, + { 0xB47D, 0x63C6 }, + { 0xB47E, 0x63CD }, + { 0xB4A1, 0x63D2 }, + { 0xB4A2, 0x63E3 }, + { 0xB4A3, 0x63D0 }, + { 0xB4A4, 0x63E1 }, + { 0xB4A5, 0x63D6 }, + { 0xB4A6, 0x63ED }, + { 0xB4A7, 0x63EE }, + { 0xB4A8, 0x6376 }, + { 0xB4A9, 0x63F4 }, + { 0xB4AA, 0x63EA }, + { 0xB4AB, 0x63DB }, + { 0xB4AC, 0x6452 }, + { 0xB4AD, 0x63DA }, + { 0xB4AE, 0x63F9 }, + { 0xB4AF, 0x655E }, + { 0xB4B0, 0x6566 }, + { 0xB4B1, 0x6562 }, + { 0xB4B2, 0x6563 }, + { 0xB4B3, 0x6591 }, + { 0xB4B4, 0x6590 }, + { 0xB4B5, 0x65AF }, + { 0xB4B6, 0x666E }, + { 0xB4B7, 0x6670 }, + { 0xB4B8, 0x6674 }, + { 0xB4B9, 0x6676 }, + { 0xB4BA, 0x666F }, + { 0xB4BB, 0x6691 }, + { 0xB4BC, 0x667A }, + { 0xB4BD, 0x667E }, + { 0xB4BE, 0x6677 }, + { 0xB4BF, 0x66FE }, + { 0xB4C0, 0x66FF }, + { 0xB4C1, 0x671F }, + { 0xB4C2, 0x671D }, + { 0xB4C3, 0x68FA }, + { 0xB4C4, 0x68D5 }, + { 0xB4C5, 0x68E0 }, + { 0xB4C6, 0x68D8 }, + { 0xB4C7, 0x68D7 }, + { 0xB4C8, 0x6905 }, + { 0xB4C9, 0x68DF }, + { 0xB4CA, 0x68F5 }, + { 0xB4CB, 0x68EE }, + { 0xB4CC, 0x68E7 }, + { 0xB4CD, 0x68F9 }, + { 0xB4CE, 0x68D2 }, + { 0xB4CF, 0x68F2 }, + { 0xB4D0, 0x68E3 }, + { 0xB4D1, 0x68CB }, + { 0xB4D2, 0x68CD }, + { 0xB4D3, 0x690D }, + { 0xB4D4, 0x6912 }, + { 0xB4D5, 0x690E }, + { 0xB4D6, 0x68C9 }, + { 0xB4D7, 0x68DA }, + { 0xB4D8, 0x696E }, + { 0xB4D9, 0x68FB }, + { 0xB4DA, 0x6B3E }, + { 0xB4DB, 0x6B3A }, + { 0xB4DC, 0x6B3D }, + { 0xB4DD, 0x6B98 }, + { 0xB4DE, 0x6B96 }, + { 0xB4DF, 0x6BBC }, + { 0xB4E0, 0x6BEF }, + { 0xB4E1, 0x6C2E }, + { 0xB4E2, 0x6C2F }, + { 0xB4E3, 0x6C2C }, + { 0xB4E4, 0x6E2F }, + { 0xB4E5, 0x6E38 }, + { 0xB4E6, 0x6E54 }, + { 0xB4E7, 0x6E21 }, + { 0xB4E8, 0x6E32 }, + { 0xB4E9, 0x6E67 }, + { 0xB4EA, 0x6E4A }, + { 0xB4EB, 0x6E20 }, + { 0xB4EC, 0x6E25 }, + { 0xB4ED, 0x6E23 }, + { 0xB4EE, 0x6E1B }, + { 0xB4EF, 0x6E5B }, + { 0xB4F0, 0x6E58 }, + { 0xB4F1, 0x6E24 }, + { 0xB4F2, 0x6E56 }, + { 0xB4F3, 0x6E6E }, + { 0xB4F4, 0x6E2D }, + { 0xB4F5, 0x6E26 }, + { 0xB4F6, 0x6E6F }, + { 0xB4F7, 0x6E34 }, + { 0xB4F8, 0x6E4D }, + { 0xB4F9, 0x6E3A }, + { 0xB4FA, 0x6E2C }, + { 0xB4FB, 0x6E43 }, + { 0xB4FC, 0x6E1D }, + { 0xB4FD, 0x6E3E }, + { 0xB4FE, 0x6ECB }, + { 0xB540, 0x6E89 }, + { 0xB541, 0x6E19 }, + { 0xB542, 0x6E4E }, + { 0xB543, 0x6E63 }, + { 0xB544, 0x6E44 }, + { 0xB545, 0x6E72 }, + { 0xB546, 0x6E69 }, + { 0xB547, 0x6E5F }, + { 0xB548, 0x7119 }, + { 0xB549, 0x711A }, + { 0xB54A, 0x7126 }, + { 0xB54B, 0x7130 }, + { 0xB54C, 0x7121 }, + { 0xB54D, 0x7136 }, + { 0xB54E, 0x716E }, + { 0xB54F, 0x711C }, + { 0xB550, 0x724C }, + { 0xB551, 0x7284 }, + { 0xB552, 0x7280 }, + { 0xB553, 0x7336 }, + { 0xB554, 0x7325 }, + { 0xB555, 0x7334 }, + { 0xB556, 0x7329 }, + { 0xB557, 0x743A }, + { 0xB558, 0x742A }, + { 0xB559, 0x7433 }, + { 0xB55A, 0x7422 }, + { 0xB55B, 0x7425 }, + { 0xB55C, 0x7435 }, + { 0xB55D, 0x7436 }, + { 0xB55E, 0x7434 }, + { 0xB55F, 0x742F }, + { 0xB560, 0x741B }, + { 0xB561, 0x7426 }, + { 0xB562, 0x7428 }, + { 0xB563, 0x7525 }, + { 0xB564, 0x7526 }, + { 0xB565, 0x756B }, + { 0xB566, 0x756A }, + { 0xB567, 0x75E2 }, + { 0xB568, 0x75DB }, + { 0xB569, 0x75E3 }, + { 0xB56A, 0x75D9 }, + { 0xB56B, 0x75D8 }, + { 0xB56C, 0x75DE }, + { 0xB56D, 0x75E0 }, + { 0xB56E, 0x767B }, + { 0xB56F, 0x767C }, + { 0xB570, 0x7696 }, + { 0xB571, 0x7693 }, + { 0xB572, 0x76B4 }, + { 0xB573, 0x76DC }, + { 0xB574, 0x774F }, + { 0xB575, 0x77ED }, + { 0xB576, 0x785D }, + { 0xB577, 0x786C }, + { 0xB578, 0x786F }, + { 0xB579, 0x7A0D }, + { 0xB57A, 0x7A08 }, + { 0xB57B, 0x7A0B }, + { 0xB57C, 0x7A05 }, + { 0xB57D, 0x7A00 }, + { 0xB57E, 0x7A98 }, + { 0xB5A1, 0x7A97 }, + { 0xB5A2, 0x7A96 }, + { 0xB5A3, 0x7AE5 }, + { 0xB5A4, 0x7AE3 }, + { 0xB5A5, 0x7B49 }, + { 0xB5A6, 0x7B56 }, + { 0xB5A7, 0x7B46 }, + { 0xB5A8, 0x7B50 }, + { 0xB5A9, 0x7B52 }, + { 0xB5AA, 0x7B54 }, + { 0xB5AB, 0x7B4D }, + { 0xB5AC, 0x7B4B }, + { 0xB5AD, 0x7B4F }, + { 0xB5AE, 0x7B51 }, + { 0xB5AF, 0x7C9F }, + { 0xB5B0, 0x7CA5 }, + { 0xB5B1, 0x7D5E }, + { 0xB5B2, 0x7D50 }, + { 0xB5B3, 0x7D68 }, + { 0xB5B4, 0x7D55 }, + { 0xB5B5, 0x7D2B }, + { 0xB5B6, 0x7D6E }, + { 0xB5B7, 0x7D72 }, + { 0xB5B8, 0x7D61 }, + { 0xB5B9, 0x7D66 }, + { 0xB5BA, 0x7D62 }, + { 0xB5BB, 0x7D70 }, + { 0xB5BC, 0x7D73 }, + { 0xB5BD, 0x5584 }, + { 0xB5BE, 0x7FD4 }, + { 0xB5BF, 0x7FD5 }, + { 0xB5C0, 0x800B }, + { 0xB5C1, 0x8052 }, + { 0xB5C2, 0x8085 }, + { 0xB5C3, 0x8155 }, + { 0xB5C4, 0x8154 }, + { 0xB5C5, 0x814B }, + { 0xB5C6, 0x8151 }, + { 0xB5C7, 0x814E }, + { 0xB5C8, 0x8139 }, + { 0xB5C9, 0x8146 }, + { 0xB5CA, 0x813E }, + { 0xB5CB, 0x814C }, + { 0xB5CC, 0x8153 }, + { 0xB5CD, 0x8174 }, + { 0xB5CE, 0x8212 }, + { 0xB5CF, 0x821C }, + { 0xB5D0, 0x83E9 }, + { 0xB5D1, 0x8403 }, + { 0xB5D2, 0x83F8 }, + { 0xB5D3, 0x840D }, + { 0xB5D4, 0x83E0 }, + { 0xB5D5, 0x83C5 }, + { 0xB5D6, 0x840B }, + { 0xB5D7, 0x83C1 }, + { 0xB5D8, 0x83EF }, + { 0xB5D9, 0x83F1 }, + { 0xB5DA, 0x83F4 }, + { 0xB5DB, 0x8457 }, + { 0xB5DC, 0x840A }, + { 0xB5DD, 0x83F0 }, + { 0xB5DE, 0x840C }, + { 0xB5DF, 0x83CC }, + { 0xB5E0, 0x83FD }, + { 0xB5E1, 0x83F2 }, + { 0xB5E2, 0x83CA }, + { 0xB5E3, 0x8438 }, + { 0xB5E4, 0x840E }, + { 0xB5E5, 0x8404 }, + { 0xB5E6, 0x83DC }, + { 0xB5E7, 0x8407 }, + { 0xB5E8, 0x83D4 }, + { 0xB5E9, 0x83DF }, + { 0xB5EA, 0x865B }, + { 0xB5EB, 0x86DF }, + { 0xB5EC, 0x86D9 }, + { 0xB5ED, 0x86ED }, + { 0xB5EE, 0x86D4 }, + { 0xB5EF, 0x86DB }, + { 0xB5F0, 0x86E4 }, + { 0xB5F1, 0x86D0 }, + { 0xB5F2, 0x86DE }, + { 0xB5F3, 0x8857 }, + { 0xB5F4, 0x88C1 }, + { 0xB5F5, 0x88C2 }, + { 0xB5F6, 0x88B1 }, + { 0xB5F7, 0x8983 }, + { 0xB5F8, 0x8996 }, + { 0xB5F9, 0x8A3B }, + { 0xB5FA, 0x8A60 }, + { 0xB5FB, 0x8A55 }, + { 0xB5FC, 0x8A5E }, + { 0xB5FD, 0x8A3C }, + { 0xB5FE, 0x8A41 }, + { 0xB640, 0x8A54 }, + { 0xB641, 0x8A5B }, + { 0xB642, 0x8A50 }, + { 0xB643, 0x8A46 }, + { 0xB644, 0x8A34 }, + { 0xB645, 0x8A3A }, + { 0xB646, 0x8A36 }, + { 0xB647, 0x8A56 }, + { 0xB648, 0x8C61 }, + { 0xB649, 0x8C82 }, + { 0xB64A, 0x8CAF }, + { 0xB64B, 0x8CBC }, + { 0xB64C, 0x8CB3 }, + { 0xB64D, 0x8CBD }, + { 0xB64E, 0x8CC1 }, + { 0xB64F, 0x8CBB }, + { 0xB650, 0x8CC0 }, + { 0xB651, 0x8CB4 }, + { 0xB652, 0x8CB7 }, + { 0xB653, 0x8CB6 }, + { 0xB654, 0x8CBF }, + { 0xB655, 0x8CB8 }, + { 0xB656, 0x8D8A }, + { 0xB657, 0x8D85 }, + { 0xB658, 0x8D81 }, + { 0xB659, 0x8DCE }, + { 0xB65A, 0x8DDD }, + { 0xB65B, 0x8DCB }, + { 0xB65C, 0x8DDA }, + { 0xB65D, 0x8DD1 }, + { 0xB65E, 0x8DCC }, + { 0xB65F, 0x8DDB }, + { 0xB660, 0x8DC6 }, + { 0xB661, 0x8EFB }, + { 0xB662, 0x8EF8 }, + { 0xB663, 0x8EFC }, + { 0xB664, 0x8F9C }, + { 0xB665, 0x902E }, + { 0xB666, 0x9035 }, + { 0xB667, 0x9031 }, + { 0xB668, 0x9038 }, + { 0xB669, 0x9032 }, + { 0xB66A, 0x9036 }, + { 0xB66B, 0x9102 }, + { 0xB66C, 0x90F5 }, + { 0xB66D, 0x9109 }, + { 0xB66E, 0x90FE }, + { 0xB66F, 0x9163 }, + { 0xB670, 0x9165 }, + { 0xB671, 0x91CF }, + { 0xB672, 0x9214 }, + { 0xB673, 0x9215 }, + { 0xB674, 0x9223 }, + { 0xB675, 0x9209 }, + { 0xB676, 0x921E }, + { 0xB677, 0x920D }, + { 0xB678, 0x9210 }, + { 0xB679, 0x9207 }, + { 0xB67A, 0x9211 }, + { 0xB67B, 0x9594 }, + { 0xB67C, 0x958F }, + { 0xB67D, 0x958B }, + { 0xB67E, 0x9591 }, + { 0xB6A1, 0x9593 }, + { 0xB6A2, 0x9592 }, + { 0xB6A3, 0x958E }, + { 0xB6A4, 0x968A }, + { 0xB6A5, 0x968E }, + { 0xB6A6, 0x968B }, + { 0xB6A7, 0x967D }, + { 0xB6A8, 0x9685 }, + { 0xB6A9, 0x9686 }, + { 0xB6AA, 0x968D }, + { 0xB6AB, 0x9672 }, + { 0xB6AC, 0x9684 }, + { 0xB6AD, 0x96C1 }, + { 0xB6AE, 0x96C5 }, + { 0xB6AF, 0x96C4 }, + { 0xB6B0, 0x96C6 }, + { 0xB6B1, 0x96C7 }, + { 0xB6B2, 0x96EF }, + { 0xB6B3, 0x96F2 }, + { 0xB6B4, 0x97CC }, + { 0xB6B5, 0x9805 }, + { 0xB6B6, 0x9806 }, + { 0xB6B7, 0x9808 }, + { 0xB6B8, 0x98E7 }, + { 0xB6B9, 0x98EA }, + { 0xB6BA, 0x98EF }, + { 0xB6BB, 0x98E9 }, + { 0xB6BC, 0x98F2 }, + { 0xB6BD, 0x98ED }, + { 0xB6BE, 0x99AE }, + { 0xB6BF, 0x99AD }, + { 0xB6C0, 0x9EC3 }, + { 0xB6C1, 0x9ECD }, + { 0xB6C2, 0x9ED1 }, + { 0xB6C3, 0x4E82 }, + { 0xB6C4, 0x50AD }, + { 0xB6C5, 0x50B5 }, + { 0xB6C6, 0x50B2 }, + { 0xB6C7, 0x50B3 }, + { 0xB6C8, 0x50C5 }, + { 0xB6C9, 0x50BE }, + { 0xB6CA, 0x50AC }, + { 0xB6CB, 0x50B7 }, + { 0xB6CC, 0x50BB }, + { 0xB6CD, 0x50AF }, + { 0xB6CE, 0x50C7 }, + { 0xB6CF, 0x527F }, + { 0xB6D0, 0x5277 }, + { 0xB6D1, 0x527D }, + { 0xB6D2, 0x52DF }, + { 0xB6D3, 0x52E6 }, + { 0xB6D4, 0x52E4 }, + { 0xB6D5, 0x52E2 }, + { 0xB6D6, 0x52E3 }, + { 0xB6D7, 0x532F }, + { 0xB6D8, 0x55DF }, + { 0xB6D9, 0x55E8 }, + { 0xB6DA, 0x55D3 }, + { 0xB6DB, 0x55E6 }, + { 0xB6DC, 0x55CE }, + { 0xB6DD, 0x55DC }, + { 0xB6DE, 0x55C7 }, + { 0xB6DF, 0x55D1 }, + { 0xB6E0, 0x55E3 }, + { 0xB6E1, 0x55E4 }, + { 0xB6E2, 0x55EF }, + { 0xB6E3, 0x55DA }, + { 0xB6E4, 0x55E1 }, + { 0xB6E5, 0x55C5 }, + { 0xB6E6, 0x55C6 }, + { 0xB6E7, 0x55E5 }, + { 0xB6E8, 0x55C9 }, + { 0xB6E9, 0x5712 }, + { 0xB6EA, 0x5713 }, + { 0xB6EB, 0x585E }, + { 0xB6EC, 0x5851 }, + { 0xB6ED, 0x5858 }, + { 0xB6EE, 0x5857 }, + { 0xB6EF, 0x585A }, + { 0xB6F0, 0x5854 }, + { 0xB6F1, 0x586B }, + { 0xB6F2, 0x584C }, + { 0xB6F3, 0x586D }, + { 0xB6F4, 0x584A }, + { 0xB6F5, 0x5862 }, + { 0xB6F6, 0x5852 }, + { 0xB6F7, 0x584B }, + { 0xB6F8, 0x5967 }, + { 0xB6F9, 0x5AC1 }, + { 0xB6FA, 0x5AC9 }, + { 0xB6FB, 0x5ACC }, + { 0xB6FC, 0x5ABE }, + { 0xB6FD, 0x5ABD }, + { 0xB6FE, 0x5ABC }, + { 0xB740, 0x5AB3 }, + { 0xB741, 0x5AC2 }, + { 0xB742, 0x5AB2 }, + { 0xB743, 0x5D69 }, + { 0xB744, 0x5D6F }, + { 0xB745, 0x5E4C }, + { 0xB746, 0x5E79 }, + { 0xB747, 0x5EC9 }, + { 0xB748, 0x5EC8 }, + { 0xB749, 0x5F12 }, + { 0xB74A, 0x5F59 }, + { 0xB74B, 0x5FAC }, + { 0xB74C, 0x5FAE }, + { 0xB74D, 0x611A }, + { 0xB74E, 0x610F }, + { 0xB74F, 0x6148 }, + { 0xB750, 0x611F }, + { 0xB751, 0x60F3 }, + { 0xB752, 0x611B }, + { 0xB753, 0x60F9 }, + { 0xB754, 0x6101 }, + { 0xB755, 0x6108 }, + { 0xB756, 0x614E }, + { 0xB757, 0x614C }, + { 0xB758, 0x6144 }, + { 0xB759, 0x614D }, + { 0xB75A, 0x613E }, + { 0xB75B, 0x6134 }, + { 0xB75C, 0x6127 }, + { 0xB75D, 0x610D }, + { 0xB75E, 0x6106 }, + { 0xB75F, 0x6137 }, + { 0xB760, 0x6221 }, + { 0xB761, 0x6222 }, + { 0xB762, 0x6413 }, + { 0xB763, 0x643E }, + { 0xB764, 0x641E }, + { 0xB765, 0x642A }, + { 0xB766, 0x642D }, + { 0xB767, 0x643D }, + { 0xB768, 0x642C }, + { 0xB769, 0x640F }, + { 0xB76A, 0x641C }, + { 0xB76B, 0x6414 }, + { 0xB76C, 0x640D }, + { 0xB76D, 0x6436 }, + { 0xB76E, 0x6416 }, + { 0xB76F, 0x6417 }, + { 0xB770, 0x6406 }, + { 0xB771, 0x656C }, + { 0xB772, 0x659F }, + { 0xB773, 0x65B0 }, + { 0xB774, 0x6697 }, + { 0xB775, 0x6689 }, + { 0xB776, 0x6687 }, + { 0xB777, 0x6688 }, + { 0xB778, 0x6696 }, + { 0xB779, 0x6684 }, + { 0xB77A, 0x6698 }, + { 0xB77B, 0x668D }, + { 0xB77C, 0x6703 }, + { 0xB77D, 0x6994 }, + { 0xB77E, 0x696D }, + { 0xB7A1, 0x695A }, + { 0xB7A2, 0x6977 }, + { 0xB7A3, 0x6960 }, + { 0xB7A4, 0x6954 }, + { 0xB7A5, 0x6975 }, + { 0xB7A6, 0x6930 }, + { 0xB7A7, 0x6982 }, + { 0xB7A8, 0x694A }, + { 0xB7A9, 0x6968 }, + { 0xB7AA, 0x696B }, + { 0xB7AB, 0x695E }, + { 0xB7AC, 0x6953 }, + { 0xB7AD, 0x6979 }, + { 0xB7AE, 0x6986 }, + { 0xB7AF, 0x695D }, + { 0xB7B0, 0x6963 }, + { 0xB7B1, 0x695B }, + { 0xB7B2, 0x6B47 }, + { 0xB7B3, 0x6B72 }, + { 0xB7B4, 0x6BC0 }, + { 0xB7B5, 0x6BBF }, + { 0xB7B6, 0x6BD3 }, + { 0xB7B7, 0x6BFD }, + { 0xB7B8, 0x6EA2 }, + { 0xB7B9, 0x6EAF }, + { 0xB7BA, 0x6ED3 }, + { 0xB7BB, 0x6EB6 }, + { 0xB7BC, 0x6EC2 }, + { 0xB7BD, 0x6E90 }, + { 0xB7BE, 0x6E9D }, + { 0xB7BF, 0x6EC7 }, + { 0xB7C0, 0x6EC5 }, + { 0xB7C1, 0x6EA5 }, + { 0xB7C2, 0x6E98 }, + { 0xB7C3, 0x6EBC }, + { 0xB7C4, 0x6EBA }, + { 0xB7C5, 0x6EAB }, + { 0xB7C6, 0x6ED1 }, + { 0xB7C7, 0x6E96 }, + { 0xB7C8, 0x6E9C }, + { 0xB7C9, 0x6EC4 }, + { 0xB7CA, 0x6ED4 }, + { 0xB7CB, 0x6EAA }, + { 0xB7CC, 0x6EA7 }, + { 0xB7CD, 0x6EB4 }, + { 0xB7CE, 0x714E }, + { 0xB7CF, 0x7159 }, + { 0xB7D0, 0x7169 }, + { 0xB7D1, 0x7164 }, + { 0xB7D2, 0x7149 }, + { 0xB7D3, 0x7167 }, + { 0xB7D4, 0x715C }, + { 0xB7D5, 0x716C }, + { 0xB7D6, 0x7166 }, + { 0xB7D7, 0x714C }, + { 0xB7D8, 0x7165 }, + { 0xB7D9, 0x715E }, + { 0xB7DA, 0x7146 }, + { 0xB7DB, 0x7168 }, + { 0xB7DC, 0x7156 }, + { 0xB7DD, 0x723A }, + { 0xB7DE, 0x7252 }, + { 0xB7DF, 0x7337 }, + { 0xB7E0, 0x7345 }, + { 0xB7E1, 0x733F }, + { 0xB7E2, 0x733E }, + { 0xB7E3, 0x746F }, + { 0xB7E4, 0x745A }, + { 0xB7E5, 0x7455 }, + { 0xB7E6, 0x745F }, + { 0xB7E7, 0x745E }, + { 0xB7E8, 0x7441 }, + { 0xB7E9, 0x743F }, + { 0xB7EA, 0x7459 }, + { 0xB7EB, 0x745B }, + { 0xB7EC, 0x745C }, + { 0xB7ED, 0x7576 }, + { 0xB7EE, 0x7578 }, + { 0xB7EF, 0x7600 }, + { 0xB7F0, 0x75F0 }, + { 0xB7F1, 0x7601 }, + { 0xB7F2, 0x75F2 }, + { 0xB7F3, 0x75F1 }, + { 0xB7F4, 0x75FA }, + { 0xB7F5, 0x75FF }, + { 0xB7F6, 0x75F4 }, + { 0xB7F7, 0x75F3 }, + { 0xB7F8, 0x76DE }, + { 0xB7F9, 0x76DF }, + { 0xB7FA, 0x775B }, + { 0xB7FB, 0x776B }, + { 0xB7FC, 0x7766 }, + { 0xB7FD, 0x775E }, + { 0xB7FE, 0x7763 }, + { 0xB840, 0x7779 }, + { 0xB841, 0x776A }, + { 0xB842, 0x776C }, + { 0xB843, 0x775C }, + { 0xB844, 0x7765 }, + { 0xB845, 0x7768 }, + { 0xB846, 0x7762 }, + { 0xB847, 0x77EE }, + { 0xB848, 0x788E }, + { 0xB849, 0x78B0 }, + { 0xB84A, 0x7897 }, + { 0xB84B, 0x7898 }, + { 0xB84C, 0x788C }, + { 0xB84D, 0x7889 }, + { 0xB84E, 0x787C }, + { 0xB84F, 0x7891 }, + { 0xB850, 0x7893 }, + { 0xB851, 0x787F }, + { 0xB852, 0x797A }, + { 0xB853, 0x797F }, + { 0xB854, 0x7981 }, + { 0xB855, 0x842C }, + { 0xB856, 0x79BD }, + { 0xB857, 0x7A1C }, + { 0xB858, 0x7A1A }, + { 0xB859, 0x7A20 }, + { 0xB85A, 0x7A14 }, + { 0xB85B, 0x7A1F }, + { 0xB85C, 0x7A1E }, + { 0xB85D, 0x7A9F }, + { 0xB85E, 0x7AA0 }, + { 0xB85F, 0x7B77 }, + { 0xB860, 0x7BC0 }, + { 0xB861, 0x7B60 }, + { 0xB862, 0x7B6E }, + { 0xB863, 0x7B67 }, + { 0xB864, 0x7CB1 }, + { 0xB865, 0x7CB3 }, + { 0xB866, 0x7CB5 }, + { 0xB867, 0x7D93 }, + { 0xB868, 0x7D79 }, + { 0xB869, 0x7D91 }, + { 0xB86A, 0x7D81 }, + { 0xB86B, 0x7D8F }, + { 0xB86C, 0x7D5B }, + { 0xB86D, 0x7F6E }, + { 0xB86E, 0x7F69 }, + { 0xB86F, 0x7F6A }, + { 0xB870, 0x7F72 }, + { 0xB871, 0x7FA9 }, + { 0xB872, 0x7FA8 }, + { 0xB873, 0x7FA4 }, + { 0xB874, 0x8056 }, + { 0xB875, 0x8058 }, + { 0xB876, 0x8086 }, + { 0xB877, 0x8084 }, + { 0xB878, 0x8171 }, + { 0xB879, 0x8170 }, + { 0xB87A, 0x8178 }, + { 0xB87B, 0x8165 }, + { 0xB87C, 0x816E }, + { 0xB87D, 0x8173 }, + { 0xB87E, 0x816B }, + { 0xB8A1, 0x8179 }, + { 0xB8A2, 0x817A }, + { 0xB8A3, 0x8166 }, + { 0xB8A4, 0x8205 }, + { 0xB8A5, 0x8247 }, + { 0xB8A6, 0x8482 }, + { 0xB8A7, 0x8477 }, + { 0xB8A8, 0x843D }, + { 0xB8A9, 0x8431 }, + { 0xB8AA, 0x8475 }, + { 0xB8AB, 0x8466 }, + { 0xB8AC, 0x846B }, + { 0xB8AD, 0x8449 }, + { 0xB8AE, 0x846C }, + { 0xB8AF, 0x845B }, + { 0xB8B0, 0x843C }, + { 0xB8B1, 0x8435 }, + { 0xB8B2, 0x8461 }, + { 0xB8B3, 0x8463 }, + { 0xB8B4, 0x8469 }, + { 0xB8B5, 0x846D }, + { 0xB8B6, 0x8446 }, + { 0xB8B7, 0x865E }, + { 0xB8B8, 0x865C }, + { 0xB8B9, 0x865F }, + { 0xB8BA, 0x86F9 }, + { 0xB8BB, 0x8713 }, + { 0xB8BC, 0x8708 }, + { 0xB8BD, 0x8707 }, + { 0xB8BE, 0x8700 }, + { 0xB8BF, 0x86FE }, + { 0xB8C0, 0x86FB }, + { 0xB8C1, 0x8702 }, + { 0xB8C2, 0x8703 }, + { 0xB8C3, 0x8706 }, + { 0xB8C4, 0x870A }, + { 0xB8C5, 0x8859 }, + { 0xB8C6, 0x88DF }, + { 0xB8C7, 0x88D4 }, + { 0xB8C8, 0x88D9 }, + { 0xB8C9, 0x88DC }, + { 0xB8CA, 0x88D8 }, + { 0xB8CB, 0x88DD }, + { 0xB8CC, 0x88E1 }, + { 0xB8CD, 0x88CA }, + { 0xB8CE, 0x88D5 }, + { 0xB8CF, 0x88D2 }, + { 0xB8D0, 0x899C }, + { 0xB8D1, 0x89E3 }, + { 0xB8D2, 0x8A6B }, + { 0xB8D3, 0x8A72 }, + { 0xB8D4, 0x8A73 }, + { 0xB8D5, 0x8A66 }, + { 0xB8D6, 0x8A69 }, + { 0xB8D7, 0x8A70 }, + { 0xB8D8, 0x8A87 }, + { 0xB8D9, 0x8A7C }, + { 0xB8DA, 0x8A63 }, + { 0xB8DB, 0x8AA0 }, + { 0xB8DC, 0x8A71 }, + { 0xB8DD, 0x8A85 }, + { 0xB8DE, 0x8A6D }, + { 0xB8DF, 0x8A62 }, + { 0xB8E0, 0x8A6E }, + { 0xB8E1, 0x8A6C }, + { 0xB8E2, 0x8A79 }, + { 0xB8E3, 0x8A7B }, + { 0xB8E4, 0x8A3E }, + { 0xB8E5, 0x8A68 }, + { 0xB8E6, 0x8C62 }, + { 0xB8E7, 0x8C8A }, + { 0xB8E8, 0x8C89 }, + { 0xB8E9, 0x8CCA }, + { 0xB8EA, 0x8CC7 }, + { 0xB8EB, 0x8CC8 }, + { 0xB8EC, 0x8CC4 }, + { 0xB8ED, 0x8CB2 }, + { 0xB8EE, 0x8CC3 }, + { 0xB8EF, 0x8CC2 }, + { 0xB8F0, 0x8CC5 }, + { 0xB8F1, 0x8DE1 }, + { 0xB8F2, 0x8DDF }, + { 0xB8F3, 0x8DE8 }, + { 0xB8F4, 0x8DEF }, + { 0xB8F5, 0x8DF3 }, + { 0xB8F6, 0x8DFA }, + { 0xB8F7, 0x8DEA }, + { 0xB8F8, 0x8DE4 }, + { 0xB8F9, 0x8DE6 }, + { 0xB8FA, 0x8EB2 }, + { 0xB8FB, 0x8F03 }, + { 0xB8FC, 0x8F09 }, + { 0xB8FD, 0x8EFE }, + { 0xB8FE, 0x8F0A }, + { 0xB940, 0x8F9F }, + { 0xB941, 0x8FB2 }, + { 0xB942, 0x904B }, + { 0xB943, 0x904A }, + { 0xB944, 0x9053 }, + { 0xB945, 0x9042 }, + { 0xB946, 0x9054 }, + { 0xB947, 0x903C }, + { 0xB948, 0x9055 }, + { 0xB949, 0x9050 }, + { 0xB94A, 0x9047 }, + { 0xB94B, 0x904F }, + { 0xB94C, 0x904E }, + { 0xB94D, 0x904D }, + { 0xB94E, 0x9051 }, + { 0xB94F, 0x903E }, + { 0xB950, 0x9041 }, + { 0xB951, 0x9112 }, + { 0xB952, 0x9117 }, + { 0xB953, 0x916C }, + { 0xB954, 0x916A }, + { 0xB955, 0x9169 }, + { 0xB956, 0x91C9 }, + { 0xB957, 0x9237 }, + { 0xB958, 0x9257 }, + { 0xB959, 0x9238 }, + { 0xB95A, 0x923D }, + { 0xB95B, 0x9240 }, + { 0xB95C, 0x923E }, + { 0xB95D, 0x925B }, + { 0xB95E, 0x924B }, + { 0xB95F, 0x9264 }, + { 0xB960, 0x9251 }, + { 0xB961, 0x9234 }, + { 0xB962, 0x9249 }, + { 0xB963, 0x924D }, + { 0xB964, 0x9245 }, + { 0xB965, 0x9239 }, + { 0xB966, 0x923F }, + { 0xB967, 0x925A }, + { 0xB968, 0x9598 }, + { 0xB969, 0x9698 }, + { 0xB96A, 0x9694 }, + { 0xB96B, 0x9695 }, + { 0xB96C, 0x96CD }, + { 0xB96D, 0x96CB }, + { 0xB96E, 0x96C9 }, + { 0xB96F, 0x96CA }, + { 0xB970, 0x96F7 }, + { 0xB971, 0x96FB }, + { 0xB972, 0x96F9 }, + { 0xB973, 0x96F6 }, + { 0xB974, 0x9756 }, + { 0xB975, 0x9774 }, + { 0xB976, 0x9776 }, + { 0xB977, 0x9810 }, + { 0xB978, 0x9811 }, + { 0xB979, 0x9813 }, + { 0xB97A, 0x980A }, + { 0xB97B, 0x9812 }, + { 0xB97C, 0x980C }, + { 0xB97D, 0x98FC }, + { 0xB97E, 0x98F4 }, + { 0xB9A1, 0x98FD }, + { 0xB9A2, 0x98FE }, + { 0xB9A3, 0x99B3 }, + { 0xB9A4, 0x99B1 }, + { 0xB9A5, 0x99B4 }, + { 0xB9A6, 0x9AE1 }, + { 0xB9A7, 0x9CE9 }, + { 0xB9A8, 0x9E82 }, + { 0xB9A9, 0x9F0E }, + { 0xB9AA, 0x9F13 }, + { 0xB9AB, 0x9F20 }, + { 0xB9AC, 0x50E7 }, + { 0xB9AD, 0x50EE }, + { 0xB9AE, 0x50E5 }, + { 0xB9AF, 0x50D6 }, + { 0xB9B0, 0x50ED }, + { 0xB9B1, 0x50DA }, + { 0xB9B2, 0x50D5 }, + { 0xB9B3, 0x50CF }, + { 0xB9B4, 0x50D1 }, + { 0xB9B5, 0x50F1 }, + { 0xB9B6, 0x50CE }, + { 0xB9B7, 0x50E9 }, + { 0xB9B8, 0x5162 }, + { 0xB9B9, 0x51F3 }, + { 0xB9BA, 0x5283 }, + { 0xB9BB, 0x5282 }, + { 0xB9BC, 0x5331 }, + { 0xB9BD, 0x53AD }, + { 0xB9BE, 0x55FE }, + { 0xB9BF, 0x5600 }, + { 0xB9C0, 0x561B }, + { 0xB9C1, 0x5617 }, + { 0xB9C2, 0x55FD }, + { 0xB9C3, 0x5614 }, + { 0xB9C4, 0x5606 }, + { 0xB9C5, 0x5609 }, + { 0xB9C6, 0x560D }, + { 0xB9C7, 0x560E }, + { 0xB9C8, 0x55F7 }, + { 0xB9C9, 0x5616 }, + { 0xB9CA, 0x561F }, + { 0xB9CB, 0x5608 }, + { 0xB9CC, 0x5610 }, + { 0xB9CD, 0x55F6 }, + { 0xB9CE, 0x5718 }, + { 0xB9CF, 0x5716 }, + { 0xB9D0, 0x5875 }, + { 0xB9D1, 0x587E }, + { 0xB9D2, 0x5883 }, + { 0xB9D3, 0x5893 }, + { 0xB9D4, 0x588A }, + { 0xB9D5, 0x5879 }, + { 0xB9D6, 0x5885 }, + { 0xB9D7, 0x587D }, + { 0xB9D8, 0x58FD }, + { 0xB9D9, 0x5925 }, + { 0xB9DA, 0x5922 }, + { 0xB9DB, 0x5924 }, + { 0xB9DC, 0x596A }, + { 0xB9DD, 0x5969 }, + { 0xB9DE, 0x5AE1 }, + { 0xB9DF, 0x5AE6 }, + { 0xB9E0, 0x5AE9 }, + { 0xB9E1, 0x5AD7 }, + { 0xB9E2, 0x5AD6 }, + { 0xB9E3, 0x5AD8 }, + { 0xB9E4, 0x5AE3 }, + { 0xB9E5, 0x5B75 }, + { 0xB9E6, 0x5BDE }, + { 0xB9E7, 0x5BE7 }, + { 0xB9E8, 0x5BE1 }, + { 0xB9E9, 0x5BE5 }, + { 0xB9EA, 0x5BE6 }, + { 0xB9EB, 0x5BE8 }, + { 0xB9EC, 0x5BE2 }, + { 0xB9ED, 0x5BE4 }, + { 0xB9EE, 0x5BDF }, + { 0xB9EF, 0x5C0D }, + { 0xB9F0, 0x5C62 }, + { 0xB9F1, 0x5D84 }, + { 0xB9F2, 0x5D87 }, + { 0xB9F3, 0x5E5B }, + { 0xB9F4, 0x5E63 }, + { 0xB9F5, 0x5E55 }, + { 0xB9F6, 0x5E57 }, + { 0xB9F7, 0x5E54 }, + { 0xB9F8, 0x5ED3 }, + { 0xB9F9, 0x5ED6 }, + { 0xB9FA, 0x5F0A }, + { 0xB9FB, 0x5F46 }, + { 0xB9FC, 0x5F70 }, + { 0xB9FD, 0x5FB9 }, + { 0xB9FE, 0x6147 }, + { 0xBA40, 0x613F }, + { 0xBA41, 0x614B }, + { 0xBA42, 0x6177 }, + { 0xBA43, 0x6162 }, + { 0xBA44, 0x6163 }, + { 0xBA45, 0x615F }, + { 0xBA46, 0x615A }, + { 0xBA47, 0x6158 }, + { 0xBA48, 0x6175 }, + { 0xBA49, 0x622A }, + { 0xBA4A, 0x6487 }, + { 0xBA4B, 0x6458 }, + { 0xBA4C, 0x6454 }, + { 0xBA4D, 0x64A4 }, + { 0xBA4E, 0x6478 }, + { 0xBA4F, 0x645F }, + { 0xBA50, 0x647A }, + { 0xBA51, 0x6451 }, + { 0xBA52, 0x6467 }, + { 0xBA53, 0x6434 }, + { 0xBA54, 0x646D }, + { 0xBA55, 0x647B }, + { 0xBA56, 0x6572 }, + { 0xBA57, 0x65A1 }, + { 0xBA58, 0x65D7 }, + { 0xBA59, 0x65D6 }, + { 0xBA5A, 0x66A2 }, + { 0xBA5B, 0x66A8 }, + { 0xBA5C, 0x669D }, + { 0xBA5D, 0x699C }, + { 0xBA5E, 0x69A8 }, + { 0xBA5F, 0x6995 }, + { 0xBA60, 0x69C1 }, + { 0xBA61, 0x69AE }, + { 0xBA62, 0x69D3 }, + { 0xBA63, 0x69CB }, + { 0xBA64, 0x699B }, + { 0xBA65, 0x69B7 }, + { 0xBA66, 0x69BB }, + { 0xBA67, 0x69AB }, + { 0xBA68, 0x69B4 }, + { 0xBA69, 0x69D0 }, + { 0xBA6A, 0x69CD }, + { 0xBA6B, 0x69AD }, + { 0xBA6C, 0x69CC }, + { 0xBA6D, 0x69A6 }, + { 0xBA6E, 0x69C3 }, + { 0xBA6F, 0x69A3 }, + { 0xBA70, 0x6B49 }, + { 0xBA71, 0x6B4C }, + { 0xBA72, 0x6C33 }, + { 0xBA73, 0x6F33 }, + { 0xBA74, 0x6F14 }, + { 0xBA75, 0x6EFE }, + { 0xBA76, 0x6F13 }, + { 0xBA77, 0x6EF4 }, + { 0xBA78, 0x6F29 }, + { 0xBA79, 0x6F3E }, + { 0xBA7A, 0x6F20 }, + { 0xBA7B, 0x6F2C }, + { 0xBA7C, 0x6F0F }, + { 0xBA7D, 0x6F02 }, + { 0xBA7E, 0x6F22 }, + { 0xBAA1, 0x6EFF }, + { 0xBAA2, 0x6EEF }, + { 0xBAA3, 0x6F06 }, + { 0xBAA4, 0x6F31 }, + { 0xBAA5, 0x6F38 }, + { 0xBAA6, 0x6F32 }, + { 0xBAA7, 0x6F23 }, + { 0xBAA8, 0x6F15 }, + { 0xBAA9, 0x6F2B }, + { 0xBAAA, 0x6F2F }, + { 0xBAAB, 0x6F88 }, + { 0xBAAC, 0x6F2A }, + { 0xBAAD, 0x6EEC }, + { 0xBAAE, 0x6F01 }, + { 0xBAAF, 0x6EF2 }, + { 0xBAB0, 0x6ECC }, + { 0xBAB1, 0x6EF7 }, + { 0xBAB2, 0x7194 }, + { 0xBAB3, 0x7199 }, + { 0xBAB4, 0x717D }, + { 0xBAB5, 0x718A }, + { 0xBAB6, 0x7184 }, + { 0xBAB7, 0x7192 }, + { 0xBAB8, 0x723E }, + { 0xBAB9, 0x7292 }, + { 0xBABA, 0x7296 }, + { 0xBABB, 0x7344 }, + { 0xBABC, 0x7350 }, + { 0xBABD, 0x7464 }, + { 0xBABE, 0x7463 }, + { 0xBABF, 0x746A }, + { 0xBAC0, 0x7470 }, + { 0xBAC1, 0x746D }, + { 0xBAC2, 0x7504 }, + { 0xBAC3, 0x7591 }, + { 0xBAC4, 0x7627 }, + { 0xBAC5, 0x760D }, + { 0xBAC6, 0x760B }, + { 0xBAC7, 0x7609 }, + { 0xBAC8, 0x7613 }, + { 0xBAC9, 0x76E1 }, + { 0xBACA, 0x76E3 }, + { 0xBACB, 0x7784 }, + { 0xBACC, 0x777D }, + { 0xBACD, 0x777F }, + { 0xBACE, 0x7761 }, + { 0xBACF, 0x78C1 }, + { 0xBAD0, 0x789F }, + { 0xBAD1, 0x78A7 }, + { 0xBAD2, 0x78B3 }, + { 0xBAD3, 0x78A9 }, + { 0xBAD4, 0x78A3 }, + { 0xBAD5, 0x798E }, + { 0xBAD6, 0x798F }, + { 0xBAD7, 0x798D }, + { 0xBAD8, 0x7A2E }, + { 0xBAD9, 0x7A31 }, + { 0xBADA, 0x7AAA }, + { 0xBADB, 0x7AA9 }, + { 0xBADC, 0x7AED }, + { 0xBADD, 0x7AEF }, + { 0xBADE, 0x7BA1 }, + { 0xBADF, 0x7B95 }, + { 0xBAE0, 0x7B8B }, + { 0xBAE1, 0x7B75 }, + { 0xBAE2, 0x7B97 }, + { 0xBAE3, 0x7B9D }, + { 0xBAE4, 0x7B94 }, + { 0xBAE5, 0x7B8F }, + { 0xBAE6, 0x7BB8 }, + { 0xBAE7, 0x7B87 }, + { 0xBAE8, 0x7B84 }, + { 0xBAE9, 0x7CB9 }, + { 0xBAEA, 0x7CBD }, + { 0xBAEB, 0x7CBE }, + { 0xBAEC, 0x7DBB }, + { 0xBAED, 0x7DB0 }, + { 0xBAEE, 0x7D9C }, + { 0xBAEF, 0x7DBD }, + { 0xBAF0, 0x7DBE }, + { 0xBAF1, 0x7DA0 }, + { 0xBAF2, 0x7DCA }, + { 0xBAF3, 0x7DB4 }, + { 0xBAF4, 0x7DB2 }, + { 0xBAF5, 0x7DB1 }, + { 0xBAF6, 0x7DBA }, + { 0xBAF7, 0x7DA2 }, + { 0xBAF8, 0x7DBF }, + { 0xBAF9, 0x7DB5 }, + { 0xBAFA, 0x7DB8 }, + { 0xBAFB, 0x7DAD }, + { 0xBAFC, 0x7DD2 }, + { 0xBAFD, 0x7DC7 }, + { 0xBAFE, 0x7DAC }, + { 0xBB40, 0x7F70 }, + { 0xBB41, 0x7FE0 }, + { 0xBB42, 0x7FE1 }, + { 0xBB43, 0x7FDF }, + { 0xBB44, 0x805E }, + { 0xBB45, 0x805A }, + { 0xBB46, 0x8087 }, + { 0xBB47, 0x8150 }, + { 0xBB48, 0x8180 }, + { 0xBB49, 0x818F }, + { 0xBB4A, 0x8188 }, + { 0xBB4B, 0x818A }, + { 0xBB4C, 0x817F }, + { 0xBB4D, 0x8182 }, + { 0xBB4E, 0x81E7 }, + { 0xBB4F, 0x81FA }, + { 0xBB50, 0x8207 }, + { 0xBB51, 0x8214 }, + { 0xBB52, 0x821E }, + { 0xBB53, 0x824B }, + { 0xBB54, 0x84C9 }, + { 0xBB55, 0x84BF }, + { 0xBB56, 0x84C6 }, + { 0xBB57, 0x84C4 }, + { 0xBB58, 0x8499 }, + { 0xBB59, 0x849E }, + { 0xBB5A, 0x84B2 }, + { 0xBB5B, 0x849C }, + { 0xBB5C, 0x84CB }, + { 0xBB5D, 0x84B8 }, + { 0xBB5E, 0x84C0 }, + { 0xBB5F, 0x84D3 }, + { 0xBB60, 0x8490 }, + { 0xBB61, 0x84BC }, + { 0xBB62, 0x84D1 }, + { 0xBB63, 0x84CA }, + { 0xBB64, 0x873F }, + { 0xBB65, 0x871C }, + { 0xBB66, 0x873B }, + { 0xBB67, 0x8722 }, + { 0xBB68, 0x8725 }, + { 0xBB69, 0x8734 }, + { 0xBB6A, 0x8718 }, + { 0xBB6B, 0x8755 }, + { 0xBB6C, 0x8737 }, + { 0xBB6D, 0x8729 }, + { 0xBB6E, 0x88F3 }, + { 0xBB6F, 0x8902 }, + { 0xBB70, 0x88F4 }, + { 0xBB71, 0x88F9 }, + { 0xBB72, 0x88F8 }, + { 0xBB73, 0x88FD }, + { 0xBB74, 0x88E8 }, + { 0xBB75, 0x891A }, + { 0xBB76, 0x88EF }, + { 0xBB77, 0x8AA6 }, + { 0xBB78, 0x8A8C }, + { 0xBB79, 0x8A9E }, + { 0xBB7A, 0x8AA3 }, + { 0xBB7B, 0x8A8D }, + { 0xBB7C, 0x8AA1 }, + { 0xBB7D, 0x8A93 }, + { 0xBB7E, 0x8AA4 }, + { 0xBBA1, 0x8AAA }, + { 0xBBA2, 0x8AA5 }, + { 0xBBA3, 0x8AA8 }, + { 0xBBA4, 0x8A98 }, + { 0xBBA5, 0x8A91 }, + { 0xBBA6, 0x8A9A }, + { 0xBBA7, 0x8AA7 }, + { 0xBBA8, 0x8C6A }, + { 0xBBA9, 0x8C8D }, + { 0xBBAA, 0x8C8C }, + { 0xBBAB, 0x8CD3 }, + { 0xBBAC, 0x8CD1 }, + { 0xBBAD, 0x8CD2 }, + { 0xBBAE, 0x8D6B }, + { 0xBBAF, 0x8D99 }, + { 0xBBB0, 0x8D95 }, + { 0xBBB1, 0x8DFC }, + { 0xBBB2, 0x8F14 }, + { 0xBBB3, 0x8F12 }, + { 0xBBB4, 0x8F15 }, + { 0xBBB5, 0x8F13 }, + { 0xBBB6, 0x8FA3 }, + { 0xBBB7, 0x9060 }, + { 0xBBB8, 0x9058 }, + { 0xBBB9, 0x905C }, + { 0xBBBA, 0x9063 }, + { 0xBBBB, 0x9059 }, + { 0xBBBC, 0x905E }, + { 0xBBBD, 0x9062 }, + { 0xBBBE, 0x905D }, + { 0xBBBF, 0x905B }, + { 0xBBC0, 0x9119 }, + { 0xBBC1, 0x9118 }, + { 0xBBC2, 0x911E }, + { 0xBBC3, 0x9175 }, + { 0xBBC4, 0x9178 }, + { 0xBBC5, 0x9177 }, + { 0xBBC6, 0x9174 }, + { 0xBBC7, 0x9278 }, + { 0xBBC8, 0x9280 }, + { 0xBBC9, 0x9285 }, + { 0xBBCA, 0x9298 }, + { 0xBBCB, 0x9296 }, + { 0xBBCC, 0x927B }, + { 0xBBCD, 0x9293 }, + { 0xBBCE, 0x929C }, + { 0xBBCF, 0x92A8 }, + { 0xBBD0, 0x927C }, + { 0xBBD1, 0x9291 }, + { 0xBBD2, 0x95A1 }, + { 0xBBD3, 0x95A8 }, + { 0xBBD4, 0x95A9 }, + { 0xBBD5, 0x95A3 }, + { 0xBBD6, 0x95A5 }, + { 0xBBD7, 0x95A4 }, + { 0xBBD8, 0x9699 }, + { 0xBBD9, 0x969C }, + { 0xBBDA, 0x969B }, + { 0xBBDB, 0x96CC }, + { 0xBBDC, 0x96D2 }, + { 0xBBDD, 0x9700 }, + { 0xBBDE, 0x977C }, + { 0xBBDF, 0x9785 }, + { 0xBBE0, 0x97F6 }, + { 0xBBE1, 0x9817 }, + { 0xBBE2, 0x9818 }, + { 0xBBE3, 0x98AF }, + { 0xBBE4, 0x98B1 }, + { 0xBBE5, 0x9903 }, + { 0xBBE6, 0x9905 }, + { 0xBBE7, 0x990C }, + { 0xBBE8, 0x9909 }, + { 0xBBE9, 0x99C1 }, + { 0xBBEA, 0x9AAF }, + { 0xBBEB, 0x9AB0 }, + { 0xBBEC, 0x9AE6 }, + { 0xBBED, 0x9B41 }, + { 0xBBEE, 0x9B42 }, + { 0xBBEF, 0x9CF4 }, + { 0xBBF0, 0x9CF6 }, + { 0xBBF1, 0x9CF3 }, + { 0xBBF2, 0x9EBC }, + { 0xBBF3, 0x9F3B }, + { 0xBBF4, 0x9F4A }, + { 0xBBF5, 0x5104 }, + { 0xBBF6, 0x5100 }, + { 0xBBF7, 0x50FB }, + { 0xBBF8, 0x50F5 }, + { 0xBBF9, 0x50F9 }, + { 0xBBFA, 0x5102 }, + { 0xBBFB, 0x5108 }, + { 0xBBFC, 0x5109 }, + { 0xBBFD, 0x5105 }, + { 0xBBFE, 0x51DC }, + { 0xBC40, 0x5287 }, + { 0xBC41, 0x5288 }, + { 0xBC42, 0x5289 }, + { 0xBC43, 0x528D }, + { 0xBC44, 0x528A }, + { 0xBC45, 0x52F0 }, + { 0xBC46, 0x53B2 }, + { 0xBC47, 0x562E }, + { 0xBC48, 0x563B }, + { 0xBC49, 0x5639 }, + { 0xBC4A, 0x5632 }, + { 0xBC4B, 0x563F }, + { 0xBC4C, 0x5634 }, + { 0xBC4D, 0x5629 }, + { 0xBC4E, 0x5653 }, + { 0xBC4F, 0x564E }, + { 0xBC50, 0x5657 }, + { 0xBC51, 0x5674 }, + { 0xBC52, 0x5636 }, + { 0xBC53, 0x562F }, + { 0xBC54, 0x5630 }, + { 0xBC55, 0x5880 }, + { 0xBC56, 0x589F }, + { 0xBC57, 0x589E }, + { 0xBC58, 0x58B3 }, + { 0xBC59, 0x589C }, + { 0xBC5A, 0x58AE }, + { 0xBC5B, 0x58A9 }, + { 0xBC5C, 0x58A6 }, + { 0xBC5D, 0x596D }, + { 0xBC5E, 0x5B09 }, + { 0xBC5F, 0x5AFB }, + { 0xBC60, 0x5B0B }, + { 0xBC61, 0x5AF5 }, + { 0xBC62, 0x5B0C }, + { 0xBC63, 0x5B08 }, + { 0xBC64, 0x5BEE }, + { 0xBC65, 0x5BEC }, + { 0xBC66, 0x5BE9 }, + { 0xBC67, 0x5BEB }, + { 0xBC68, 0x5C64 }, + { 0xBC69, 0x5C65 }, + { 0xBC6A, 0x5D9D }, + { 0xBC6B, 0x5D94 }, + { 0xBC6C, 0x5E62 }, + { 0xBC6D, 0x5E5F }, + { 0xBC6E, 0x5E61 }, + { 0xBC6F, 0x5EE2 }, + { 0xBC70, 0x5EDA }, + { 0xBC71, 0x5EDF }, + { 0xBC72, 0x5EDD }, + { 0xBC73, 0x5EE3 }, + { 0xBC74, 0x5EE0 }, + { 0xBC75, 0x5F48 }, + { 0xBC76, 0x5F71 }, + { 0xBC77, 0x5FB7 }, + { 0xBC78, 0x5FB5 }, + { 0xBC79, 0x6176 }, + { 0xBC7A, 0x6167 }, + { 0xBC7B, 0x616E }, + { 0xBC7C, 0x615D }, + { 0xBC7D, 0x6155 }, + { 0xBC7E, 0x6182 }, + { 0xBCA1, 0x617C }, + { 0xBCA2, 0x6170 }, + { 0xBCA3, 0x616B }, + { 0xBCA4, 0x617E }, + { 0xBCA5, 0x61A7 }, + { 0xBCA6, 0x6190 }, + { 0xBCA7, 0x61AB }, + { 0xBCA8, 0x618E }, + { 0xBCA9, 0x61AC }, + { 0xBCAA, 0x619A }, + { 0xBCAB, 0x61A4 }, + { 0xBCAC, 0x6194 }, + { 0xBCAD, 0x61AE }, + { 0xBCAE, 0x622E }, + { 0xBCAF, 0x6469 }, + { 0xBCB0, 0x646F }, + { 0xBCB1, 0x6479 }, + { 0xBCB2, 0x649E }, + { 0xBCB3, 0x64B2 }, + { 0xBCB4, 0x6488 }, + { 0xBCB5, 0x6490 }, + { 0xBCB6, 0x64B0 }, + { 0xBCB7, 0x64A5 }, + { 0xBCB8, 0x6493 }, + { 0xBCB9, 0x6495 }, + { 0xBCBA, 0x64A9 }, + { 0xBCBB, 0x6492 }, + { 0xBCBC, 0x64AE }, + { 0xBCBD, 0x64AD }, + { 0xBCBE, 0x64AB }, + { 0xBCBF, 0x649A }, + { 0xBCC0, 0x64AC }, + { 0xBCC1, 0x6499 }, + { 0xBCC2, 0x64A2 }, + { 0xBCC3, 0x64B3 }, + { 0xBCC4, 0x6575 }, + { 0xBCC5, 0x6577 }, + { 0xBCC6, 0x6578 }, + { 0xBCC7, 0x66AE }, + { 0xBCC8, 0x66AB }, + { 0xBCC9, 0x66B4 }, + { 0xBCCA, 0x66B1 }, + { 0xBCCB, 0x6A23 }, + { 0xBCCC, 0x6A1F }, + { 0xBCCD, 0x69E8 }, + { 0xBCCE, 0x6A01 }, + { 0xBCCF, 0x6A1E }, + { 0xBCD0, 0x6A19 }, + { 0xBCD1, 0x69FD }, + { 0xBCD2, 0x6A21 }, + { 0xBCD3, 0x6A13 }, + { 0xBCD4, 0x6A0A }, + { 0xBCD5, 0x69F3 }, + { 0xBCD6, 0x6A02 }, + { 0xBCD7, 0x6A05 }, + { 0xBCD8, 0x69ED }, + { 0xBCD9, 0x6A11 }, + { 0xBCDA, 0x6B50 }, + { 0xBCDB, 0x6B4E }, + { 0xBCDC, 0x6BA4 }, + { 0xBCDD, 0x6BC5 }, + { 0xBCDE, 0x6BC6 }, + { 0xBCDF, 0x6F3F }, + { 0xBCE0, 0x6F7C }, + { 0xBCE1, 0x6F84 }, + { 0xBCE2, 0x6F51 }, + { 0xBCE3, 0x6F66 }, + { 0xBCE4, 0x6F54 }, + { 0xBCE5, 0x6F86 }, + { 0xBCE6, 0x6F6D }, + { 0xBCE7, 0x6F5B }, + { 0xBCE8, 0x6F78 }, + { 0xBCE9, 0x6F6E }, + { 0xBCEA, 0x6F8E }, + { 0xBCEB, 0x6F7A }, + { 0xBCEC, 0x6F70 }, + { 0xBCED, 0x6F64 }, + { 0xBCEE, 0x6F97 }, + { 0xBCEF, 0x6F58 }, + { 0xBCF0, 0x6ED5 }, + { 0xBCF1, 0x6F6F }, + { 0xBCF2, 0x6F60 }, + { 0xBCF3, 0x6F5F }, + { 0xBCF4, 0x719F }, + { 0xBCF5, 0x71AC }, + { 0xBCF6, 0x71B1 }, + { 0xBCF7, 0x71A8 }, + { 0xBCF8, 0x7256 }, + { 0xBCF9, 0x729B }, + { 0xBCFA, 0x734E }, + { 0xBCFB, 0x7357 }, + { 0xBCFC, 0x7469 }, + { 0xBCFD, 0x748B }, + { 0xBCFE, 0x7483 }, + { 0xBD40, 0x747E }, + { 0xBD41, 0x7480 }, + { 0xBD42, 0x757F }, + { 0xBD43, 0x7620 }, + { 0xBD44, 0x7629 }, + { 0xBD45, 0x761F }, + { 0xBD46, 0x7624 }, + { 0xBD47, 0x7626 }, + { 0xBD48, 0x7621 }, + { 0xBD49, 0x7622 }, + { 0xBD4A, 0x769A }, + { 0xBD4B, 0x76BA }, + { 0xBD4C, 0x76E4 }, + { 0xBD4D, 0x778E }, + { 0xBD4E, 0x7787 }, + { 0xBD4F, 0x778C }, + { 0xBD50, 0x7791 }, + { 0xBD51, 0x778B }, + { 0xBD52, 0x78CB }, + { 0xBD53, 0x78C5 }, + { 0xBD54, 0x78BA }, + { 0xBD55, 0x78CA }, + { 0xBD56, 0x78BE }, + { 0xBD57, 0x78D5 }, + { 0xBD58, 0x78BC }, + { 0xBD59, 0x78D0 }, + { 0xBD5A, 0x7A3F }, + { 0xBD5B, 0x7A3C }, + { 0xBD5C, 0x7A40 }, + { 0xBD5D, 0x7A3D }, + { 0xBD5E, 0x7A37 }, + { 0xBD5F, 0x7A3B }, + { 0xBD60, 0x7AAF }, + { 0xBD61, 0x7AAE }, + { 0xBD62, 0x7BAD }, + { 0xBD63, 0x7BB1 }, + { 0xBD64, 0x7BC4 }, + { 0xBD65, 0x7BB4 }, + { 0xBD66, 0x7BC6 }, + { 0xBD67, 0x7BC7 }, + { 0xBD68, 0x7BC1 }, + { 0xBD69, 0x7BA0 }, + { 0xBD6A, 0x7BCC }, + { 0xBD6B, 0x7CCA }, + { 0xBD6C, 0x7DE0 }, + { 0xBD6D, 0x7DF4 }, + { 0xBD6E, 0x7DEF }, + { 0xBD6F, 0x7DFB }, + { 0xBD70, 0x7DD8 }, + { 0xBD71, 0x7DEC }, + { 0xBD72, 0x7DDD }, + { 0xBD73, 0x7DE8 }, + { 0xBD74, 0x7DE3 }, + { 0xBD75, 0x7DDA }, + { 0xBD76, 0x7DDE }, + { 0xBD77, 0x7DE9 }, + { 0xBD78, 0x7D9E }, + { 0xBD79, 0x7DD9 }, + { 0xBD7A, 0x7DF2 }, + { 0xBD7B, 0x7DF9 }, + { 0xBD7C, 0x7F75 }, + { 0xBD7D, 0x7F77 }, + { 0xBD7E, 0x7FAF }, + { 0xBDA1, 0x7FE9 }, + { 0xBDA2, 0x8026 }, + { 0xBDA3, 0x819B }, + { 0xBDA4, 0x819C }, + { 0xBDA5, 0x819D }, + { 0xBDA6, 0x81A0 }, + { 0xBDA7, 0x819A }, + { 0xBDA8, 0x8198 }, + { 0xBDA9, 0x8517 }, + { 0xBDAA, 0x853D }, + { 0xBDAB, 0x851A }, + { 0xBDAC, 0x84EE }, + { 0xBDAD, 0x852C }, + { 0xBDAE, 0x852D }, + { 0xBDAF, 0x8513 }, + { 0xBDB0, 0x8511 }, + { 0xBDB1, 0x8523 }, + { 0xBDB2, 0x8521 }, + { 0xBDB3, 0x8514 }, + { 0xBDB4, 0x84EC }, + { 0xBDB5, 0x8525 }, + { 0xBDB6, 0x84FF }, + { 0xBDB7, 0x8506 }, + { 0xBDB8, 0x8782 }, + { 0xBDB9, 0x8774 }, + { 0xBDBA, 0x8776 }, + { 0xBDBB, 0x8760 }, + { 0xBDBC, 0x8766 }, + { 0xBDBD, 0x8778 }, + { 0xBDBE, 0x8768 }, + { 0xBDBF, 0x8759 }, + { 0xBDC0, 0x8757 }, + { 0xBDC1, 0x874C }, + { 0xBDC2, 0x8753 }, + { 0xBDC3, 0x885B }, + { 0xBDC4, 0x885D }, + { 0xBDC5, 0x8910 }, + { 0xBDC6, 0x8907 }, + { 0xBDC7, 0x8912 }, + { 0xBDC8, 0x8913 }, + { 0xBDC9, 0x8915 }, + { 0xBDCA, 0x890A }, + { 0xBDCB, 0x8ABC }, + { 0xBDCC, 0x8AD2 }, + { 0xBDCD, 0x8AC7 }, + { 0xBDCE, 0x8AC4 }, + { 0xBDCF, 0x8A95 }, + { 0xBDD0, 0x8ACB }, + { 0xBDD1, 0x8AF8 }, + { 0xBDD2, 0x8AB2 }, + { 0xBDD3, 0x8AC9 }, + { 0xBDD4, 0x8AC2 }, + { 0xBDD5, 0x8ABF }, + { 0xBDD6, 0x8AB0 }, + { 0xBDD7, 0x8AD6 }, + { 0xBDD8, 0x8ACD }, + { 0xBDD9, 0x8AB6 }, + { 0xBDDA, 0x8AB9 }, + { 0xBDDB, 0x8ADB }, + { 0xBDDC, 0x8C4C }, + { 0xBDDD, 0x8C4E }, + { 0xBDDE, 0x8C6C }, + { 0xBDDF, 0x8CE0 }, + { 0xBDE0, 0x8CDE }, + { 0xBDE1, 0x8CE6 }, + { 0xBDE2, 0x8CE4 }, + { 0xBDE3, 0x8CEC }, + { 0xBDE4, 0x8CED }, + { 0xBDE5, 0x8CE2 }, + { 0xBDE6, 0x8CE3 }, + { 0xBDE7, 0x8CDC }, + { 0xBDE8, 0x8CEA }, + { 0xBDE9, 0x8CE1 }, + { 0xBDEA, 0x8D6D }, + { 0xBDEB, 0x8D9F }, + { 0xBDEC, 0x8DA3 }, + { 0xBDED, 0x8E2B }, + { 0xBDEE, 0x8E10 }, + { 0xBDEF, 0x8E1D }, + { 0xBDF0, 0x8E22 }, + { 0xBDF1, 0x8E0F }, + { 0xBDF2, 0x8E29 }, + { 0xBDF3, 0x8E1F }, + { 0xBDF4, 0x8E21 }, + { 0xBDF5, 0x8E1E }, + { 0xBDF6, 0x8EBA }, + { 0xBDF7, 0x8F1D }, + { 0xBDF8, 0x8F1B }, + { 0xBDF9, 0x8F1F }, + { 0xBDFA, 0x8F29 }, + { 0xBDFB, 0x8F26 }, + { 0xBDFC, 0x8F2A }, + { 0xBDFD, 0x8F1C }, + { 0xBDFE, 0x8F1E }, + { 0xBE40, 0x8F25 }, + { 0xBE41, 0x9069 }, + { 0xBE42, 0x906E }, + { 0xBE43, 0x9068 }, + { 0xBE44, 0x906D }, + { 0xBE45, 0x9077 }, + { 0xBE46, 0x9130 }, + { 0xBE47, 0x912D }, + { 0xBE48, 0x9127 }, + { 0xBE49, 0x9131 }, + { 0xBE4A, 0x9187 }, + { 0xBE4B, 0x9189 }, + { 0xBE4C, 0x918B }, + { 0xBE4D, 0x9183 }, + { 0xBE4E, 0x92C5 }, + { 0xBE4F, 0x92BB }, + { 0xBE50, 0x92B7 }, + { 0xBE51, 0x92EA }, + { 0xBE52, 0x92AC }, + { 0xBE53, 0x92E4 }, + { 0xBE54, 0x92C1 }, + { 0xBE55, 0x92B3 }, + { 0xBE56, 0x92BC }, + { 0xBE57, 0x92D2 }, + { 0xBE58, 0x92C7 }, + { 0xBE59, 0x92F0 }, + { 0xBE5A, 0x92B2 }, + { 0xBE5B, 0x95AD }, + { 0xBE5C, 0x95B1 }, + { 0xBE5D, 0x9704 }, + { 0xBE5E, 0x9706 }, + { 0xBE5F, 0x9707 }, + { 0xBE60, 0x9709 }, + { 0xBE61, 0x9760 }, + { 0xBE62, 0x978D }, + { 0xBE63, 0x978B }, + { 0xBE64, 0x978F }, + { 0xBE65, 0x9821 }, + { 0xBE66, 0x982B }, + { 0xBE67, 0x981C }, + { 0xBE68, 0x98B3 }, + { 0xBE69, 0x990A }, + { 0xBE6A, 0x9913 }, + { 0xBE6B, 0x9912 }, + { 0xBE6C, 0x9918 }, + { 0xBE6D, 0x99DD }, + { 0xBE6E, 0x99D0 }, + { 0xBE6F, 0x99DF }, + { 0xBE70, 0x99DB }, + { 0xBE71, 0x99D1 }, + { 0xBE72, 0x99D5 }, + { 0xBE73, 0x99D2 }, + { 0xBE74, 0x99D9 }, + { 0xBE75, 0x9AB7 }, + { 0xBE76, 0x9AEE }, + { 0xBE77, 0x9AEF }, + { 0xBE78, 0x9B27 }, + { 0xBE79, 0x9B45 }, + { 0xBE7A, 0x9B44 }, + { 0xBE7B, 0x9B77 }, + { 0xBE7C, 0x9B6F }, + { 0xBE7D, 0x9D06 }, + { 0xBE7E, 0x9D09 }, + { 0xBEA1, 0x9D03 }, + { 0xBEA2, 0x9EA9 }, + { 0xBEA3, 0x9EBE }, + { 0xBEA4, 0x9ECE }, + { 0xBEA5, 0x58A8 }, + { 0xBEA6, 0x9F52 }, + { 0xBEA7, 0x5112 }, + { 0xBEA8, 0x5118 }, + { 0xBEA9, 0x5114 }, + { 0xBEAA, 0x5110 }, + { 0xBEAB, 0x5115 }, + { 0xBEAC, 0x5180 }, + { 0xBEAD, 0x51AA }, + { 0xBEAE, 0x51DD }, + { 0xBEAF, 0x5291 }, + { 0xBEB0, 0x5293 }, + { 0xBEB1, 0x52F3 }, + { 0xBEB2, 0x5659 }, + { 0xBEB3, 0x566B }, + { 0xBEB4, 0x5679 }, + { 0xBEB5, 0x5669 }, + { 0xBEB6, 0x5664 }, + { 0xBEB7, 0x5678 }, + { 0xBEB8, 0x566A }, + { 0xBEB9, 0x5668 }, + { 0xBEBA, 0x5665 }, + { 0xBEBB, 0x5671 }, + { 0xBEBC, 0x566F }, + { 0xBEBD, 0x566C }, + { 0xBEBE, 0x5662 }, + { 0xBEBF, 0x5676 }, + { 0xBEC0, 0x58C1 }, + { 0xBEC1, 0x58BE }, + { 0xBEC2, 0x58C7 }, + { 0xBEC3, 0x58C5 }, + { 0xBEC4, 0x596E }, + { 0xBEC5, 0x5B1D }, + { 0xBEC6, 0x5B34 }, + { 0xBEC7, 0x5B78 }, + { 0xBEC8, 0x5BF0 }, + { 0xBEC9, 0x5C0E }, + { 0xBECA, 0x5F4A }, + { 0xBECB, 0x61B2 }, + { 0xBECC, 0x6191 }, + { 0xBECD, 0x61A9 }, + { 0xBECE, 0x618A }, + { 0xBECF, 0x61CD }, + { 0xBED0, 0x61B6 }, + { 0xBED1, 0x61BE }, + { 0xBED2, 0x61CA }, + { 0xBED3, 0x61C8 }, + { 0xBED4, 0x6230 }, + { 0xBED5, 0x64C5 }, + { 0xBED6, 0x64C1 }, + { 0xBED7, 0x64CB }, + { 0xBED8, 0x64BB }, + { 0xBED9, 0x64BC }, + { 0xBEDA, 0x64DA }, + { 0xBEDB, 0x64C4 }, + { 0xBEDC, 0x64C7 }, + { 0xBEDD, 0x64C2 }, + { 0xBEDE, 0x64CD }, + { 0xBEDF, 0x64BF }, + { 0xBEE0, 0x64D2 }, + { 0xBEE1, 0x64D4 }, + { 0xBEE2, 0x64BE }, + { 0xBEE3, 0x6574 }, + { 0xBEE4, 0x66C6 }, + { 0xBEE5, 0x66C9 }, + { 0xBEE6, 0x66B9 }, + { 0xBEE7, 0x66C4 }, + { 0xBEE8, 0x66C7 }, + { 0xBEE9, 0x66B8 }, + { 0xBEEA, 0x6A3D }, + { 0xBEEB, 0x6A38 }, + { 0xBEEC, 0x6A3A }, + { 0xBEED, 0x6A59 }, + { 0xBEEE, 0x6A6B }, + { 0xBEEF, 0x6A58 }, + { 0xBEF0, 0x6A39 }, + { 0xBEF1, 0x6A44 }, + { 0xBEF2, 0x6A62 }, + { 0xBEF3, 0x6A61 }, + { 0xBEF4, 0x6A4B }, + { 0xBEF5, 0x6A47 }, + { 0xBEF6, 0x6A35 }, + { 0xBEF7, 0x6A5F }, + { 0xBEF8, 0x6A48 }, + { 0xBEF9, 0x6B59 }, + { 0xBEFA, 0x6B77 }, + { 0xBEFB, 0x6C05 }, + { 0xBEFC, 0x6FC2 }, + { 0xBEFD, 0x6FB1 }, + { 0xBEFE, 0x6FA1 }, + { 0xBF40, 0x6FC3 }, + { 0xBF41, 0x6FA4 }, + { 0xBF42, 0x6FC1 }, + { 0xBF43, 0x6FA7 }, + { 0xBF44, 0x6FB3 }, + { 0xBF45, 0x6FC0 }, + { 0xBF46, 0x6FB9 }, + { 0xBF47, 0x6FB6 }, + { 0xBF48, 0x6FA6 }, + { 0xBF49, 0x6FA0 }, + { 0xBF4A, 0x6FB4 }, + { 0xBF4B, 0x71BE }, + { 0xBF4C, 0x71C9 }, + { 0xBF4D, 0x71D0 }, + { 0xBF4E, 0x71D2 }, + { 0xBF4F, 0x71C8 }, + { 0xBF50, 0x71D5 }, + { 0xBF51, 0x71B9 }, + { 0xBF52, 0x71CE }, + { 0xBF53, 0x71D9 }, + { 0xBF54, 0x71DC }, + { 0xBF55, 0x71C3 }, + { 0xBF56, 0x71C4 }, + { 0xBF57, 0x7368 }, + { 0xBF58, 0x749C }, + { 0xBF59, 0x74A3 }, + { 0xBF5A, 0x7498 }, + { 0xBF5B, 0x749F }, + { 0xBF5C, 0x749E }, + { 0xBF5D, 0x74E2 }, + { 0xBF5E, 0x750C }, + { 0xBF5F, 0x750D }, + { 0xBF60, 0x7634 }, + { 0xBF61, 0x7638 }, + { 0xBF62, 0x763A }, + { 0xBF63, 0x76E7 }, + { 0xBF64, 0x76E5 }, + { 0xBF65, 0x77A0 }, + { 0xBF66, 0x779E }, + { 0xBF67, 0x779F }, + { 0xBF68, 0x77A5 }, + { 0xBF69, 0x78E8 }, + { 0xBF6A, 0x78DA }, + { 0xBF6B, 0x78EC }, + { 0xBF6C, 0x78E7 }, + { 0xBF6D, 0x79A6 }, + { 0xBF6E, 0x7A4D }, + { 0xBF6F, 0x7A4E }, + { 0xBF70, 0x7A46 }, + { 0xBF71, 0x7A4C }, + { 0xBF72, 0x7A4B }, + { 0xBF73, 0x7ABA }, + { 0xBF74, 0x7BD9 }, + { 0xBF75, 0x7C11 }, + { 0xBF76, 0x7BC9 }, + { 0xBF77, 0x7BE4 }, + { 0xBF78, 0x7BDB }, + { 0xBF79, 0x7BE1 }, + { 0xBF7A, 0x7BE9 }, + { 0xBF7B, 0x7BE6 }, + { 0xBF7C, 0x7CD5 }, + { 0xBF7D, 0x7CD6 }, + { 0xBF7E, 0x7E0A }, + { 0xBFA1, 0x7E11 }, + { 0xBFA2, 0x7E08 }, + { 0xBFA3, 0x7E1B }, + { 0xBFA4, 0x7E23 }, + { 0xBFA5, 0x7E1E }, + { 0xBFA6, 0x7E1D }, + { 0xBFA7, 0x7E09 }, + { 0xBFA8, 0x7E10 }, + { 0xBFA9, 0x7F79 }, + { 0xBFAA, 0x7FB2 }, + { 0xBFAB, 0x7FF0 }, + { 0xBFAC, 0x7FF1 }, + { 0xBFAD, 0x7FEE }, + { 0xBFAE, 0x8028 }, + { 0xBFAF, 0x81B3 }, + { 0xBFB0, 0x81A9 }, + { 0xBFB1, 0x81A8 }, + { 0xBFB2, 0x81FB }, + { 0xBFB3, 0x8208 }, + { 0xBFB4, 0x8258 }, + { 0xBFB5, 0x8259 }, + { 0xBFB6, 0x854A }, + { 0xBFB7, 0x8559 }, + { 0xBFB8, 0x8548 }, + { 0xBFB9, 0x8568 }, + { 0xBFBA, 0x8569 }, + { 0xBFBB, 0x8543 }, + { 0xBFBC, 0x8549 }, + { 0xBFBD, 0x856D }, + { 0xBFBE, 0x856A }, + { 0xBFBF, 0x855E }, + { 0xBFC0, 0x8783 }, + { 0xBFC1, 0x879F }, + { 0xBFC2, 0x879E }, + { 0xBFC3, 0x87A2 }, + { 0xBFC4, 0x878D }, + { 0xBFC5, 0x8861 }, + { 0xBFC6, 0x892A }, + { 0xBFC7, 0x8932 }, + { 0xBFC8, 0x8925 }, + { 0xBFC9, 0x892B }, + { 0xBFCA, 0x8921 }, + { 0xBFCB, 0x89AA }, + { 0xBFCC, 0x89A6 }, + { 0xBFCD, 0x8AE6 }, + { 0xBFCE, 0x8AFA }, + { 0xBFCF, 0x8AEB }, + { 0xBFD0, 0x8AF1 }, + { 0xBFD1, 0x8B00 }, + { 0xBFD2, 0x8ADC }, + { 0xBFD3, 0x8AE7 }, + { 0xBFD4, 0x8AEE }, + { 0xBFD5, 0x8AFE }, + { 0xBFD6, 0x8B01 }, + { 0xBFD7, 0x8B02 }, + { 0xBFD8, 0x8AF7 }, + { 0xBFD9, 0x8AED }, + { 0xBFDA, 0x8AF3 }, + { 0xBFDB, 0x8AF6 }, + { 0xBFDC, 0x8AFC }, + { 0xBFDD, 0x8C6B }, + { 0xBFDE, 0x8C6D }, + { 0xBFDF, 0x8C93 }, + { 0xBFE0, 0x8CF4 }, + { 0xBFE1, 0x8E44 }, + { 0xBFE2, 0x8E31 }, + { 0xBFE3, 0x8E34 }, + { 0xBFE4, 0x8E42 }, + { 0xBFE5, 0x8E39 }, + { 0xBFE6, 0x8E35 }, + { 0xBFE7, 0x8F3B }, + { 0xBFE8, 0x8F2F }, + { 0xBFE9, 0x8F38 }, + { 0xBFEA, 0x8F33 }, + { 0xBFEB, 0x8FA8 }, + { 0xBFEC, 0x8FA6 }, + { 0xBFED, 0x9075 }, + { 0xBFEE, 0x9074 }, + { 0xBFEF, 0x9078 }, + { 0xBFF0, 0x9072 }, + { 0xBFF1, 0x907C }, + { 0xBFF2, 0x907A }, + { 0xBFF3, 0x9134 }, + { 0xBFF4, 0x9192 }, + { 0xBFF5, 0x9320 }, + { 0xBFF6, 0x9336 }, + { 0xBFF7, 0x92F8 }, + { 0xBFF8, 0x9333 }, + { 0xBFF9, 0x932F }, + { 0xBFFA, 0x9322 }, + { 0xBFFB, 0x92FC }, + { 0xBFFC, 0x932B }, + { 0xBFFD, 0x9304 }, + { 0xBFFE, 0x931A }, + { 0xC040, 0x9310 }, + { 0xC041, 0x9326 }, + { 0xC042, 0x9321 }, + { 0xC043, 0x9315 }, + { 0xC044, 0x932E }, + { 0xC045, 0x9319 }, + { 0xC046, 0x95BB }, + { 0xC047, 0x96A7 }, + { 0xC048, 0x96A8 }, + { 0xC049, 0x96AA }, + { 0xC04A, 0x96D5 }, + { 0xC04B, 0x970E }, + { 0xC04C, 0x9711 }, + { 0xC04D, 0x9716 }, + { 0xC04E, 0x970D }, + { 0xC04F, 0x9713 }, + { 0xC050, 0x970F }, + { 0xC051, 0x975B }, + { 0xC052, 0x975C }, + { 0xC053, 0x9766 }, + { 0xC054, 0x9798 }, + { 0xC055, 0x9830 }, + { 0xC056, 0x9838 }, + { 0xC057, 0x983B }, + { 0xC058, 0x9837 }, + { 0xC059, 0x982D }, + { 0xC05A, 0x9839 }, + { 0xC05B, 0x9824 }, + { 0xC05C, 0x9910 }, + { 0xC05D, 0x9928 }, + { 0xC05E, 0x991E }, + { 0xC05F, 0x991B }, + { 0xC060, 0x9921 }, + { 0xC061, 0x991A }, + { 0xC062, 0x99ED }, + { 0xC063, 0x99E2 }, + { 0xC064, 0x99F1 }, + { 0xC065, 0x9AB8 }, + { 0xC066, 0x9ABC }, + { 0xC067, 0x9AFB }, + { 0xC068, 0x9AED }, + { 0xC069, 0x9B28 }, + { 0xC06A, 0x9B91 }, + { 0xC06B, 0x9D15 }, + { 0xC06C, 0x9D23 }, + { 0xC06D, 0x9D26 }, + { 0xC06E, 0x9D28 }, + { 0xC06F, 0x9D12 }, + { 0xC070, 0x9D1B }, + { 0xC071, 0x9ED8 }, + { 0xC072, 0x9ED4 }, + { 0xC073, 0x9F8D }, + { 0xC074, 0x9F9C }, + { 0xC075, 0x512A }, + { 0xC076, 0x511F }, + { 0xC077, 0x5121 }, + { 0xC078, 0x5132 }, + { 0xC079, 0x52F5 }, + { 0xC07A, 0x568E }, + { 0xC07B, 0x5680 }, + { 0xC07C, 0x5690 }, + { 0xC07D, 0x5685 }, + { 0xC07E, 0x5687 }, + { 0xC0A1, 0x568F }, + { 0xC0A2, 0x58D5 }, + { 0xC0A3, 0x58D3 }, + { 0xC0A4, 0x58D1 }, + { 0xC0A5, 0x58CE }, + { 0xC0A6, 0x5B30 }, + { 0xC0A7, 0x5B2A }, + { 0xC0A8, 0x5B24 }, + { 0xC0A9, 0x5B7A }, + { 0xC0AA, 0x5C37 }, + { 0xC0AB, 0x5C68 }, + { 0xC0AC, 0x5DBC }, + { 0xC0AD, 0x5DBA }, + { 0xC0AE, 0x5DBD }, + { 0xC0AF, 0x5DB8 }, + { 0xC0B0, 0x5E6B }, + { 0xC0B1, 0x5F4C }, + { 0xC0B2, 0x5FBD }, + { 0xC0B3, 0x61C9 }, + { 0xC0B4, 0x61C2 }, + { 0xC0B5, 0x61C7 }, + { 0xC0B6, 0x61E6 }, + { 0xC0B7, 0x61CB }, + { 0xC0B8, 0x6232 }, + { 0xC0B9, 0x6234 }, + { 0xC0BA, 0x64CE }, + { 0xC0BB, 0x64CA }, + { 0xC0BC, 0x64D8 }, + { 0xC0BD, 0x64E0 }, + { 0xC0BE, 0x64F0 }, + { 0xC0BF, 0x64E6 }, + { 0xC0C0, 0x64EC }, + { 0xC0C1, 0x64F1 }, + { 0xC0C2, 0x64E2 }, + { 0xC0C3, 0x64ED }, + { 0xC0C4, 0x6582 }, + { 0xC0C5, 0x6583 }, + { 0xC0C6, 0x66D9 }, + { 0xC0C7, 0x66D6 }, + { 0xC0C8, 0x6A80 }, + { 0xC0C9, 0x6A94 }, + { 0xC0CA, 0x6A84 }, + { 0xC0CB, 0x6AA2 }, + { 0xC0CC, 0x6A9C }, + { 0xC0CD, 0x6ADB }, + { 0xC0CE, 0x6AA3 }, + { 0xC0CF, 0x6A7E }, + { 0xC0D0, 0x6A97 }, + { 0xC0D1, 0x6A90 }, + { 0xC0D2, 0x6AA0 }, + { 0xC0D3, 0x6B5C }, + { 0xC0D4, 0x6BAE }, + { 0xC0D5, 0x6BDA }, + { 0xC0D6, 0x6C08 }, + { 0xC0D7, 0x6FD8 }, + { 0xC0D8, 0x6FF1 }, + { 0xC0D9, 0x6FDF }, + { 0xC0DA, 0x6FE0 }, + { 0xC0DB, 0x6FDB }, + { 0xC0DC, 0x6FE4 }, + { 0xC0DD, 0x6FEB }, + { 0xC0DE, 0x6FEF }, + { 0xC0DF, 0x6F80 }, + { 0xC0E0, 0x6FEC }, + { 0xC0E1, 0x6FE1 }, + { 0xC0E2, 0x6FE9 }, + { 0xC0E3, 0x6FD5 }, + { 0xC0E4, 0x6FEE }, + { 0xC0E5, 0x6FF0 }, + { 0xC0E6, 0x71E7 }, + { 0xC0E7, 0x71DF }, + { 0xC0E8, 0x71EE }, + { 0xC0E9, 0x71E6 }, + { 0xC0EA, 0x71E5 }, + { 0xC0EB, 0x71ED }, + { 0xC0EC, 0x71EC }, + { 0xC0ED, 0x71F4 }, + { 0xC0EE, 0x71E0 }, + { 0xC0EF, 0x7235 }, + { 0xC0F0, 0x7246 }, + { 0xC0F1, 0x7370 }, + { 0xC0F2, 0x7372 }, + { 0xC0F3, 0x74A9 }, + { 0xC0F4, 0x74B0 }, + { 0xC0F5, 0x74A6 }, + { 0xC0F6, 0x74A8 }, + { 0xC0F7, 0x7646 }, + { 0xC0F8, 0x7642 }, + { 0xC0F9, 0x764C }, + { 0xC0FA, 0x76EA }, + { 0xC0FB, 0x77B3 }, + { 0xC0FC, 0x77AA }, + { 0xC0FD, 0x77B0 }, + { 0xC0FE, 0x77AC }, + { 0xC140, 0x77A7 }, + { 0xC141, 0x77AD }, + { 0xC142, 0x77EF }, + { 0xC143, 0x78F7 }, + { 0xC144, 0x78FA }, + { 0xC145, 0x78F4 }, + { 0xC146, 0x78EF }, + { 0xC147, 0x7901 }, + { 0xC148, 0x79A7 }, + { 0xC149, 0x79AA }, + { 0xC14A, 0x7A57 }, + { 0xC14B, 0x7ABF }, + { 0xC14C, 0x7C07 }, + { 0xC14D, 0x7C0D }, + { 0xC14E, 0x7BFE }, + { 0xC14F, 0x7BF7 }, + { 0xC150, 0x7C0C }, + { 0xC151, 0x7BE0 }, + { 0xC152, 0x7CE0 }, + { 0xC153, 0x7CDC }, + { 0xC154, 0x7CDE }, + { 0xC155, 0x7CE2 }, + { 0xC156, 0x7CDF }, + { 0xC157, 0x7CD9 }, + { 0xC158, 0x7CDD }, + { 0xC159, 0x7E2E }, + { 0xC15A, 0x7E3E }, + { 0xC15B, 0x7E46 }, + { 0xC15C, 0x7E37 }, + { 0xC15D, 0x7E32 }, + { 0xC15E, 0x7E43 }, + { 0xC15F, 0x7E2B }, + { 0xC160, 0x7E3D }, + { 0xC161, 0x7E31 }, + { 0xC162, 0x7E45 }, + { 0xC163, 0x7E41 }, + { 0xC164, 0x7E34 }, + { 0xC165, 0x7E39 }, + { 0xC166, 0x7E48 }, + { 0xC167, 0x7E35 }, + { 0xC168, 0x7E3F }, + { 0xC169, 0x7E2F }, + { 0xC16A, 0x7F44 }, + { 0xC16B, 0x7FF3 }, + { 0xC16C, 0x7FFC }, + { 0xC16D, 0x8071 }, + { 0xC16E, 0x8072 }, + { 0xC16F, 0x8070 }, + { 0xC170, 0x806F }, + { 0xC171, 0x8073 }, + { 0xC172, 0x81C6 }, + { 0xC173, 0x81C3 }, + { 0xC174, 0x81BA }, + { 0xC175, 0x81C2 }, + { 0xC176, 0x81C0 }, + { 0xC177, 0x81BF }, + { 0xC178, 0x81BD }, + { 0xC179, 0x81C9 }, + { 0xC17A, 0x81BE }, + { 0xC17B, 0x81E8 }, + { 0xC17C, 0x8209 }, + { 0xC17D, 0x8271 }, + { 0xC17E, 0x85AA }, + { 0xC1A1, 0x8584 }, + { 0xC1A2, 0x857E }, + { 0xC1A3, 0x859C }, + { 0xC1A4, 0x8591 }, + { 0xC1A5, 0x8594 }, + { 0xC1A6, 0x85AF }, + { 0xC1A7, 0x859B }, + { 0xC1A8, 0x8587 }, + { 0xC1A9, 0x85A8 }, + { 0xC1AA, 0x858A }, + { 0xC1AB, 0x8667 }, + { 0xC1AC, 0x87C0 }, + { 0xC1AD, 0x87D1 }, + { 0xC1AE, 0x87B3 }, + { 0xC1AF, 0x87D2 }, + { 0xC1B0, 0x87C6 }, + { 0xC1B1, 0x87AB }, + { 0xC1B2, 0x87BB }, + { 0xC1B3, 0x87BA }, + { 0xC1B4, 0x87C8 }, + { 0xC1B5, 0x87CB }, + { 0xC1B6, 0x893B }, + { 0xC1B7, 0x8936 }, + { 0xC1B8, 0x8944 }, + { 0xC1B9, 0x8938 }, + { 0xC1BA, 0x893D }, + { 0xC1BB, 0x89AC }, + { 0xC1BC, 0x8B0E }, + { 0xC1BD, 0x8B17 }, + { 0xC1BE, 0x8B19 }, + { 0xC1BF, 0x8B1B }, + { 0xC1C0, 0x8B0A }, + { 0xC1C1, 0x8B20 }, + { 0xC1C2, 0x8B1D }, + { 0xC1C3, 0x8B04 }, + { 0xC1C4, 0x8B10 }, + { 0xC1C5, 0x8C41 }, + { 0xC1C6, 0x8C3F }, + { 0xC1C7, 0x8C73 }, + { 0xC1C8, 0x8CFA }, + { 0xC1C9, 0x8CFD }, + { 0xC1CA, 0x8CFC }, + { 0xC1CB, 0x8CF8 }, + { 0xC1CC, 0x8CFB }, + { 0xC1CD, 0x8DA8 }, + { 0xC1CE, 0x8E49 }, + { 0xC1CF, 0x8E4B }, + { 0xC1D0, 0x8E48 }, + { 0xC1D1, 0x8E4A }, + { 0xC1D2, 0x8F44 }, + { 0xC1D3, 0x8F3E }, + { 0xC1D4, 0x8F42 }, + { 0xC1D5, 0x8F45 }, + { 0xC1D6, 0x8F3F }, + { 0xC1D7, 0x907F }, + { 0xC1D8, 0x907D }, + { 0xC1D9, 0x9084 }, + { 0xC1DA, 0x9081 }, + { 0xC1DB, 0x9082 }, + { 0xC1DC, 0x9080 }, + { 0xC1DD, 0x9139 }, + { 0xC1DE, 0x91A3 }, + { 0xC1DF, 0x919E }, + { 0xC1E0, 0x919C }, + { 0xC1E1, 0x934D }, + { 0xC1E2, 0x9382 }, + { 0xC1E3, 0x9328 }, + { 0xC1E4, 0x9375 }, + { 0xC1E5, 0x934A }, + { 0xC1E6, 0x9365 }, + { 0xC1E7, 0x934B }, + { 0xC1E8, 0x9318 }, + { 0xC1E9, 0x937E }, + { 0xC1EA, 0x936C }, + { 0xC1EB, 0x935B }, + { 0xC1EC, 0x9370 }, + { 0xC1ED, 0x935A }, + { 0xC1EE, 0x9354 }, + { 0xC1EF, 0x95CA }, + { 0xC1F0, 0x95CB }, + { 0xC1F1, 0x95CC }, + { 0xC1F2, 0x95C8 }, + { 0xC1F3, 0x95C6 }, + { 0xC1F4, 0x96B1 }, + { 0xC1F5, 0x96B8 }, + { 0xC1F6, 0x96D6 }, + { 0xC1F7, 0x971C }, + { 0xC1F8, 0x971E }, + { 0xC1F9, 0x97A0 }, + { 0xC1FA, 0x97D3 }, + { 0xC1FB, 0x9846 }, + { 0xC1FC, 0x98B6 }, + { 0xC1FD, 0x9935 }, + { 0xC1FE, 0x9A01 }, + { 0xC240, 0x99FF }, + { 0xC241, 0x9BAE }, + { 0xC242, 0x9BAB }, + { 0xC243, 0x9BAA }, + { 0xC244, 0x9BAD }, + { 0xC245, 0x9D3B }, + { 0xC246, 0x9D3F }, + { 0xC247, 0x9E8B }, + { 0xC248, 0x9ECF }, + { 0xC249, 0x9EDE }, + { 0xC24A, 0x9EDC }, + { 0xC24B, 0x9EDD }, + { 0xC24C, 0x9EDB }, + { 0xC24D, 0x9F3E }, + { 0xC24E, 0x9F4B }, + { 0xC24F, 0x53E2 }, + { 0xC250, 0x5695 }, + { 0xC251, 0x56AE }, + { 0xC252, 0x58D9 }, + { 0xC253, 0x58D8 }, + { 0xC254, 0x5B38 }, + { 0xC255, 0x5F5D }, + { 0xC256, 0x61E3 }, + { 0xC257, 0x6233 }, + { 0xC258, 0x64F4 }, + { 0xC259, 0x64F2 }, + { 0xC25A, 0x64FE }, + { 0xC25B, 0x6506 }, + { 0xC25C, 0x64FA }, + { 0xC25D, 0x64FB }, + { 0xC25E, 0x64F7 }, + { 0xC25F, 0x65B7 }, + { 0xC260, 0x66DC }, + { 0xC261, 0x6726 }, + { 0xC262, 0x6AB3 }, + { 0xC263, 0x6AAC }, + { 0xC264, 0x6AC3 }, + { 0xC265, 0x6ABB }, + { 0xC266, 0x6AB8 }, + { 0xC267, 0x6AC2 }, + { 0xC268, 0x6AAE }, + { 0xC269, 0x6AAF }, + { 0xC26A, 0x6B5F }, + { 0xC26B, 0x6B78 }, + { 0xC26C, 0x6BAF }, + { 0xC26D, 0x7009 }, + { 0xC26E, 0x700B }, + { 0xC26F, 0x6FFE }, + { 0xC270, 0x7006 }, + { 0xC271, 0x6FFA }, + { 0xC272, 0x7011 }, + { 0xC273, 0x700F }, + { 0xC274, 0x71FB }, + { 0xC275, 0x71FC }, + { 0xC276, 0x71FE }, + { 0xC277, 0x71F8 }, + { 0xC278, 0x7377 }, + { 0xC279, 0x7375 }, + { 0xC27A, 0x74A7 }, + { 0xC27B, 0x74BF }, + { 0xC27C, 0x7515 }, + { 0xC27D, 0x7656 }, + { 0xC27E, 0x7658 }, + { 0xC2A1, 0x7652 }, + { 0xC2A2, 0x77BD }, + { 0xC2A3, 0x77BF }, + { 0xC2A4, 0x77BB }, + { 0xC2A5, 0x77BC }, + { 0xC2A6, 0x790E }, + { 0xC2A7, 0x79AE }, + { 0xC2A8, 0x7A61 }, + { 0xC2A9, 0x7A62 }, + { 0xC2AA, 0x7A60 }, + { 0xC2AB, 0x7AC4 }, + { 0xC2AC, 0x7AC5 }, + { 0xC2AD, 0x7C2B }, + { 0xC2AE, 0x7C27 }, + { 0xC2AF, 0x7C2A }, + { 0xC2B0, 0x7C1E }, + { 0xC2B1, 0x7C23 }, + { 0xC2B2, 0x7C21 }, + { 0xC2B3, 0x7CE7 }, + { 0xC2B4, 0x7E54 }, + { 0xC2B5, 0x7E55 }, + { 0xC2B6, 0x7E5E }, + { 0xC2B7, 0x7E5A }, + { 0xC2B8, 0x7E61 }, + { 0xC2B9, 0x7E52 }, + { 0xC2BA, 0x7E59 }, + { 0xC2BB, 0x7F48 }, + { 0xC2BC, 0x7FF9 }, + { 0xC2BD, 0x7FFB }, + { 0xC2BE, 0x8077 }, + { 0xC2BF, 0x8076 }, + { 0xC2C0, 0x81CD }, + { 0xC2C1, 0x81CF }, + { 0xC2C2, 0x820A }, + { 0xC2C3, 0x85CF }, + { 0xC2C4, 0x85A9 }, + { 0xC2C5, 0x85CD }, + { 0xC2C6, 0x85D0 }, + { 0xC2C7, 0x85C9 }, + { 0xC2C8, 0x85B0 }, + { 0xC2C9, 0x85BA }, + { 0xC2CA, 0x85B9 }, + { 0xC2CB, 0x85A6 }, + { 0xC2CC, 0x87EF }, + { 0xC2CD, 0x87EC }, + { 0xC2CE, 0x87F2 }, + { 0xC2CF, 0x87E0 }, + { 0xC2D0, 0x8986 }, + { 0xC2D1, 0x89B2 }, + { 0xC2D2, 0x89F4 }, + { 0xC2D3, 0x8B28 }, + { 0xC2D4, 0x8B39 }, + { 0xC2D5, 0x8B2C }, + { 0xC2D6, 0x8B2B }, + { 0xC2D7, 0x8C50 }, + { 0xC2D8, 0x8D05 }, + { 0xC2D9, 0x8E59 }, + { 0xC2DA, 0x8E63 }, + { 0xC2DB, 0x8E66 }, + { 0xC2DC, 0x8E64 }, + { 0xC2DD, 0x8E5F }, + { 0xC2DE, 0x8E55 }, + { 0xC2DF, 0x8EC0 }, + { 0xC2E0, 0x8F49 }, + { 0xC2E1, 0x8F4D }, + { 0xC2E2, 0x9087 }, + { 0xC2E3, 0x9083 }, + { 0xC2E4, 0x9088 }, + { 0xC2E5, 0x91AB }, + { 0xC2E6, 0x91AC }, + { 0xC2E7, 0x91D0 }, + { 0xC2E8, 0x9394 }, + { 0xC2E9, 0x938A }, + { 0xC2EA, 0x9396 }, + { 0xC2EB, 0x93A2 }, + { 0xC2EC, 0x93B3 }, + { 0xC2ED, 0x93AE }, + { 0xC2EE, 0x93AC }, + { 0xC2EF, 0x93B0 }, + { 0xC2F0, 0x9398 }, + { 0xC2F1, 0x939A }, + { 0xC2F2, 0x9397 }, + { 0xC2F3, 0x95D4 }, + { 0xC2F4, 0x95D6 }, + { 0xC2F5, 0x95D0 }, + { 0xC2F6, 0x95D5 }, + { 0xC2F7, 0x96E2 }, + { 0xC2F8, 0x96DC }, + { 0xC2F9, 0x96D9 }, + { 0xC2FA, 0x96DB }, + { 0xC2FB, 0x96DE }, + { 0xC2FC, 0x9724 }, + { 0xC2FD, 0x97A3 }, + { 0xC2FE, 0x97A6 }, + { 0xC340, 0x97AD }, + { 0xC341, 0x97F9 }, + { 0xC342, 0x984D }, + { 0xC343, 0x984F }, + { 0xC344, 0x984C }, + { 0xC345, 0x984E }, + { 0xC346, 0x9853 }, + { 0xC347, 0x98BA }, + { 0xC348, 0x993E }, + { 0xC349, 0x993F }, + { 0xC34A, 0x993D }, + { 0xC34B, 0x992E }, + { 0xC34C, 0x99A5 }, + { 0xC34D, 0x9A0E }, + { 0xC34E, 0x9AC1 }, + { 0xC34F, 0x9B03 }, + { 0xC350, 0x9B06 }, + { 0xC351, 0x9B4F }, + { 0xC352, 0x9B4E }, + { 0xC353, 0x9B4D }, + { 0xC354, 0x9BCA }, + { 0xC355, 0x9BC9 }, + { 0xC356, 0x9BFD }, + { 0xC357, 0x9BC8 }, + { 0xC358, 0x9BC0 }, + { 0xC359, 0x9D51 }, + { 0xC35A, 0x9D5D }, + { 0xC35B, 0x9D60 }, + { 0xC35C, 0x9EE0 }, + { 0xC35D, 0x9F15 }, + { 0xC35E, 0x9F2C }, + { 0xC35F, 0x5133 }, + { 0xC360, 0x56A5 }, + { 0xC361, 0x58DE }, + { 0xC362, 0x58DF }, + { 0xC363, 0x58E2 }, + { 0xC364, 0x5BF5 }, + { 0xC365, 0x9F90 }, + { 0xC366, 0x5EEC }, + { 0xC367, 0x61F2 }, + { 0xC368, 0x61F7 }, + { 0xC369, 0x61F6 }, + { 0xC36A, 0x61F5 }, + { 0xC36B, 0x6500 }, + { 0xC36C, 0x650F }, + { 0xC36D, 0x66E0 }, + { 0xC36E, 0x66DD }, + { 0xC36F, 0x6AE5 }, + { 0xC370, 0x6ADD }, + { 0xC371, 0x6ADA }, + { 0xC372, 0x6AD3 }, + { 0xC373, 0x701B }, + { 0xC374, 0x701F }, + { 0xC375, 0x7028 }, + { 0xC376, 0x701A }, + { 0xC377, 0x701D }, + { 0xC378, 0x7015 }, + { 0xC379, 0x7018 }, + { 0xC37A, 0x7206 }, + { 0xC37B, 0x720D }, + { 0xC37C, 0x7258 }, + { 0xC37D, 0x72A2 }, + { 0xC37E, 0x7378 }, + { 0xC3A1, 0x737A }, + { 0xC3A2, 0x74BD }, + { 0xC3A3, 0x74CA }, + { 0xC3A4, 0x74E3 }, + { 0xC3A5, 0x7587 }, + { 0xC3A6, 0x7586 }, + { 0xC3A7, 0x765F }, + { 0xC3A8, 0x7661 }, + { 0xC3A9, 0x77C7 }, + { 0xC3AA, 0x7919 }, + { 0xC3AB, 0x79B1 }, + { 0xC3AC, 0x7A6B }, + { 0xC3AD, 0x7A69 }, + { 0xC3AE, 0x7C3E }, + { 0xC3AF, 0x7C3F }, + { 0xC3B0, 0x7C38 }, + { 0xC3B1, 0x7C3D }, + { 0xC3B2, 0x7C37 }, + { 0xC3B3, 0x7C40 }, + { 0xC3B4, 0x7E6B }, + { 0xC3B5, 0x7E6D }, + { 0xC3B6, 0x7E79 }, + { 0xC3B7, 0x7E69 }, + { 0xC3B8, 0x7E6A }, + { 0xC3B9, 0x7F85 }, + { 0xC3BA, 0x7E73 }, + { 0xC3BB, 0x7FB6 }, + { 0xC3BC, 0x7FB9 }, + { 0xC3BD, 0x7FB8 }, + { 0xC3BE, 0x81D8 }, + { 0xC3BF, 0x85E9 }, + { 0xC3C0, 0x85DD }, + { 0xC3C1, 0x85EA }, + { 0xC3C2, 0x85D5 }, + { 0xC3C3, 0x85E4 }, + { 0xC3C4, 0x85E5 }, + { 0xC3C5, 0x85F7 }, + { 0xC3C6, 0x87FB }, + { 0xC3C7, 0x8805 }, + { 0xC3C8, 0x880D }, + { 0xC3C9, 0x87F9 }, + { 0xC3CA, 0x87FE }, + { 0xC3CB, 0x8960 }, + { 0xC3CC, 0x895F }, + { 0xC3CD, 0x8956 }, + { 0xC3CE, 0x895E }, + { 0xC3CF, 0x8B41 }, + { 0xC3D0, 0x8B5C }, + { 0xC3D1, 0x8B58 }, + { 0xC3D2, 0x8B49 }, + { 0xC3D3, 0x8B5A }, + { 0xC3D4, 0x8B4E }, + { 0xC3D5, 0x8B4F }, + { 0xC3D6, 0x8B46 }, + { 0xC3D7, 0x8B59 }, + { 0xC3D8, 0x8D08 }, + { 0xC3D9, 0x8D0A }, + { 0xC3DA, 0x8E7C }, + { 0xC3DB, 0x8E72 }, + { 0xC3DC, 0x8E87 }, + { 0xC3DD, 0x8E76 }, + { 0xC3DE, 0x8E6C }, + { 0xC3DF, 0x8E7A }, + { 0xC3E0, 0x8E74 }, + { 0xC3E1, 0x8F54 }, + { 0xC3E2, 0x8F4E }, + { 0xC3E3, 0x8FAD }, + { 0xC3E4, 0x908A }, + { 0xC3E5, 0x908B }, + { 0xC3E6, 0x91B1 }, + { 0xC3E7, 0x91AE }, + { 0xC3E8, 0x93E1 }, + { 0xC3E9, 0x93D1 }, + { 0xC3EA, 0x93DF }, + { 0xC3EB, 0x93C3 }, + { 0xC3EC, 0x93C8 }, + { 0xC3ED, 0x93DC }, + { 0xC3EE, 0x93DD }, + { 0xC3EF, 0x93D6 }, + { 0xC3F0, 0x93E2 }, + { 0xC3F1, 0x93CD }, + { 0xC3F2, 0x93D8 }, + { 0xC3F3, 0x93E4 }, + { 0xC3F4, 0x93D7 }, + { 0xC3F5, 0x93E8 }, + { 0xC3F6, 0x95DC }, + { 0xC3F7, 0x96B4 }, + { 0xC3F8, 0x96E3 }, + { 0xC3F9, 0x972A }, + { 0xC3FA, 0x9727 }, + { 0xC3FB, 0x9761 }, + { 0xC3FC, 0x97DC }, + { 0xC3FD, 0x97FB }, + { 0xC3FE, 0x985E }, + { 0xC440, 0x9858 }, + { 0xC441, 0x985B }, + { 0xC442, 0x98BC }, + { 0xC443, 0x9945 }, + { 0xC444, 0x9949 }, + { 0xC445, 0x9A16 }, + { 0xC446, 0x9A19 }, + { 0xC447, 0x9B0D }, + { 0xC448, 0x9BE8 }, + { 0xC449, 0x9BE7 }, + { 0xC44A, 0x9BD6 }, + { 0xC44B, 0x9BDB }, + { 0xC44C, 0x9D89 }, + { 0xC44D, 0x9D61 }, + { 0xC44E, 0x9D72 }, + { 0xC44F, 0x9D6A }, + { 0xC450, 0x9D6C }, + { 0xC451, 0x9E92 }, + { 0xC452, 0x9E97 }, + { 0xC453, 0x9E93 }, + { 0xC454, 0x9EB4 }, + { 0xC455, 0x52F8 }, + { 0xC456, 0x56A8 }, + { 0xC457, 0x56B7 }, + { 0xC458, 0x56B6 }, + { 0xC459, 0x56B4 }, + { 0xC45A, 0x56BC }, + { 0xC45B, 0x58E4 }, + { 0xC45C, 0x5B40 }, + { 0xC45D, 0x5B43 }, + { 0xC45E, 0x5B7D }, + { 0xC45F, 0x5BF6 }, + { 0xC460, 0x5DC9 }, + { 0xC461, 0x61F8 }, + { 0xC462, 0x61FA }, + { 0xC463, 0x6518 }, + { 0xC464, 0x6514 }, + { 0xC465, 0x6519 }, + { 0xC466, 0x66E6 }, + { 0xC467, 0x6727 }, + { 0xC468, 0x6AEC }, + { 0xC469, 0x703E }, + { 0xC46A, 0x7030 }, + { 0xC46B, 0x7032 }, + { 0xC46C, 0x7210 }, + { 0xC46D, 0x737B }, + { 0xC46E, 0x74CF }, + { 0xC46F, 0x7662 }, + { 0xC470, 0x7665 }, + { 0xC471, 0x7926 }, + { 0xC472, 0x792A }, + { 0xC473, 0x792C }, + { 0xC474, 0x792B }, + { 0xC475, 0x7AC7 }, + { 0xC476, 0x7AF6 }, + { 0xC477, 0x7C4C }, + { 0xC478, 0x7C43 }, + { 0xC479, 0x7C4D }, + { 0xC47A, 0x7CEF }, + { 0xC47B, 0x7CF0 }, + { 0xC47C, 0x8FAE }, + { 0xC47D, 0x7E7D }, + { 0xC47E, 0x7E7C }, + { 0xC4A1, 0x7E82 }, + { 0xC4A2, 0x7F4C }, + { 0xC4A3, 0x8000 }, + { 0xC4A4, 0x81DA }, + { 0xC4A5, 0x8266 }, + { 0xC4A6, 0x85FB }, + { 0xC4A7, 0x85F9 }, + { 0xC4A8, 0x8611 }, + { 0xC4A9, 0x85FA }, + { 0xC4AA, 0x8606 }, + { 0xC4AB, 0x860B }, + { 0xC4AC, 0x8607 }, + { 0xC4AD, 0x860A }, + { 0xC4AE, 0x8814 }, + { 0xC4AF, 0x8815 }, + { 0xC4B0, 0x8964 }, + { 0xC4B1, 0x89BA }, + { 0xC4B2, 0x89F8 }, + { 0xC4B3, 0x8B70 }, + { 0xC4B4, 0x8B6C }, + { 0xC4B5, 0x8B66 }, + { 0xC4B6, 0x8B6F }, + { 0xC4B7, 0x8B5F }, + { 0xC4B8, 0x8B6B }, + { 0xC4B9, 0x8D0F }, + { 0xC4BA, 0x8D0D }, + { 0xC4BB, 0x8E89 }, + { 0xC4BC, 0x8E81 }, + { 0xC4BD, 0x8E85 }, + { 0xC4BE, 0x8E82 }, + { 0xC4BF, 0x91B4 }, + { 0xC4C0, 0x91CB }, + { 0xC4C1, 0x9418 }, + { 0xC4C2, 0x9403 }, + { 0xC4C3, 0x93FD }, + { 0xC4C4, 0x95E1 }, + { 0xC4C5, 0x9730 }, + { 0xC4C6, 0x98C4 }, + { 0xC4C7, 0x9952 }, + { 0xC4C8, 0x9951 }, + { 0xC4C9, 0x99A8 }, + { 0xC4CA, 0x9A2B }, + { 0xC4CB, 0x9A30 }, + { 0xC4CC, 0x9A37 }, + { 0xC4CD, 0x9A35 }, + { 0xC4CE, 0x9C13 }, + { 0xC4CF, 0x9C0D }, + { 0xC4D0, 0x9E79 }, + { 0xC4D1, 0x9EB5 }, + { 0xC4D2, 0x9EE8 }, + { 0xC4D3, 0x9F2F }, + { 0xC4D4, 0x9F5F }, + { 0xC4D5, 0x9F63 }, + { 0xC4D6, 0x9F61 }, + { 0xC4D7, 0x5137 }, + { 0xC4D8, 0x5138 }, + { 0xC4D9, 0x56C1 }, + { 0xC4DA, 0x56C0 }, + { 0xC4DB, 0x56C2 }, + { 0xC4DC, 0x5914 }, + { 0xC4DD, 0x5C6C }, + { 0xC4DE, 0x5DCD }, + { 0xC4DF, 0x61FC }, + { 0xC4E0, 0x61FE }, + { 0xC4E1, 0x651D }, + { 0xC4E2, 0x651C }, + { 0xC4E3, 0x6595 }, + { 0xC4E4, 0x66E9 }, + { 0xC4E5, 0x6AFB }, + { 0xC4E6, 0x6B04 }, + { 0xC4E7, 0x6AFA }, + { 0xC4E8, 0x6BB2 }, + { 0xC4E9, 0x704C }, + { 0xC4EA, 0x721B }, + { 0xC4EB, 0x72A7 }, + { 0xC4EC, 0x74D6 }, + { 0xC4ED, 0x74D4 }, + { 0xC4EE, 0x7669 }, + { 0xC4EF, 0x77D3 }, + { 0xC4F0, 0x7C50 }, + { 0xC4F1, 0x7E8F }, + { 0xC4F2, 0x7E8C }, + { 0xC4F3, 0x7FBC }, + { 0xC4F4, 0x8617 }, + { 0xC4F5, 0x862D }, + { 0xC4F6, 0x861A }, + { 0xC4F7, 0x8823 }, + { 0xC4F8, 0x8822 }, + { 0xC4F9, 0x8821 }, + { 0xC4FA, 0x881F }, + { 0xC4FB, 0x896A }, + { 0xC4FC, 0x896C }, + { 0xC4FD, 0x89BD }, + { 0xC4FE, 0x8B74 }, + { 0xC540, 0x8B77 }, + { 0xC541, 0x8B7D }, + { 0xC542, 0x8D13 }, + { 0xC543, 0x8E8A }, + { 0xC544, 0x8E8D }, + { 0xC545, 0x8E8B }, + { 0xC546, 0x8F5F }, + { 0xC547, 0x8FAF }, + { 0xC548, 0x91BA }, + { 0xC549, 0x942E }, + { 0xC54A, 0x9433 }, + { 0xC54B, 0x9435 }, + { 0xC54C, 0x943A }, + { 0xC54D, 0x9438 }, + { 0xC54E, 0x9432 }, + { 0xC54F, 0x942B }, + { 0xC550, 0x95E2 }, + { 0xC551, 0x9738 }, + { 0xC552, 0x9739 }, + { 0xC553, 0x9732 }, + { 0xC554, 0x97FF }, + { 0xC555, 0x9867 }, + { 0xC556, 0x9865 }, + { 0xC557, 0x9957 }, + { 0xC558, 0x9A45 }, + { 0xC559, 0x9A43 }, + { 0xC55A, 0x9A40 }, + { 0xC55B, 0x9A3E }, + { 0xC55C, 0x9ACF }, + { 0xC55D, 0x9B54 }, + { 0xC55E, 0x9B51 }, + { 0xC55F, 0x9C2D }, + { 0xC560, 0x9C25 }, + { 0xC561, 0x9DAF }, + { 0xC562, 0x9DB4 }, + { 0xC563, 0x9DC2 }, + { 0xC564, 0x9DB8 }, + { 0xC565, 0x9E9D }, + { 0xC566, 0x9EEF }, + { 0xC567, 0x9F19 }, + { 0xC568, 0x9F5C }, + { 0xC569, 0x9F66 }, + { 0xC56A, 0x9F67 }, + { 0xC56B, 0x513C }, + { 0xC56C, 0x513B }, + { 0xC56D, 0x56C8 }, + { 0xC56E, 0x56CA }, + { 0xC56F, 0x56C9 }, + { 0xC570, 0x5B7F }, + { 0xC571, 0x5DD4 }, + { 0xC572, 0x5DD2 }, + { 0xC573, 0x5F4E }, + { 0xC574, 0x61FF }, + { 0xC575, 0x6524 }, + { 0xC576, 0x6B0A }, + { 0xC577, 0x6B61 }, + { 0xC578, 0x7051 }, + { 0xC579, 0x7058 }, + { 0xC57A, 0x7380 }, + { 0xC57B, 0x74E4 }, + { 0xC57C, 0x758A }, + { 0xC57D, 0x766E }, + { 0xC57E, 0x766C }, + { 0xC5A1, 0x79B3 }, + { 0xC5A2, 0x7C60 }, + { 0xC5A3, 0x7C5F }, + { 0xC5A4, 0x807E }, + { 0xC5A5, 0x807D }, + { 0xC5A6, 0x81DF }, + { 0xC5A7, 0x8972 }, + { 0xC5A8, 0x896F }, + { 0xC5A9, 0x89FC }, + { 0xC5AA, 0x8B80 }, + { 0xC5AB, 0x8D16 }, + { 0xC5AC, 0x8D17 }, + { 0xC5AD, 0x8E91 }, + { 0xC5AE, 0x8E93 }, + { 0xC5AF, 0x8F61 }, + { 0xC5B0, 0x9148 }, + { 0xC5B1, 0x9444 }, + { 0xC5B2, 0x9451 }, + { 0xC5B3, 0x9452 }, + { 0xC5B4, 0x973D }, + { 0xC5B5, 0x973E }, + { 0xC5B6, 0x97C3 }, + { 0xC5B7, 0x97C1 }, + { 0xC5B8, 0x986B }, + { 0xC5B9, 0x9955 }, + { 0xC5BA, 0x9A55 }, + { 0xC5BB, 0x9A4D }, + { 0xC5BC, 0x9AD2 }, + { 0xC5BD, 0x9B1A }, + { 0xC5BE, 0x9C49 }, + { 0xC5BF, 0x9C31 }, + { 0xC5C0, 0x9C3E }, + { 0xC5C1, 0x9C3B }, + { 0xC5C2, 0x9DD3 }, + { 0xC5C3, 0x9DD7 }, + { 0xC5C4, 0x9F34 }, + { 0xC5C5, 0x9F6C }, + { 0xC5C6, 0x9F6A }, + { 0xC5C7, 0x9F94 }, + { 0xC5C8, 0x56CC }, + { 0xC5C9, 0x5DD6 }, + { 0xC5CA, 0x6200 }, + { 0xC5CB, 0x6523 }, + { 0xC5CC, 0x652B }, + { 0xC5CD, 0x652A }, + { 0xC5CE, 0x66EC }, + { 0xC5CF, 0x6B10 }, + { 0xC5D0, 0x74DA }, + { 0xC5D1, 0x7ACA }, + { 0xC5D2, 0x7C64 }, + { 0xC5D3, 0x7C63 }, + { 0xC5D4, 0x7C65 }, + { 0xC5D5, 0x7E93 }, + { 0xC5D6, 0x7E96 }, + { 0xC5D7, 0x7E94 }, + { 0xC5D8, 0x81E2 }, + { 0xC5D9, 0x8638 }, + { 0xC5DA, 0x863F }, + { 0xC5DB, 0x8831 }, + { 0xC5DC, 0x8B8A }, + { 0xC5DD, 0x9090 }, + { 0xC5DE, 0x908F }, + { 0xC5DF, 0x9463 }, + { 0xC5E0, 0x9460 }, + { 0xC5E1, 0x9464 }, + { 0xC5E2, 0x9768 }, + { 0xC5E3, 0x986F }, + { 0xC5E4, 0x995C }, + { 0xC5E5, 0x9A5A }, + { 0xC5E6, 0x9A5B }, + { 0xC5E7, 0x9A57 }, + { 0xC5E8, 0x9AD3 }, + { 0xC5E9, 0x9AD4 }, + { 0xC5EA, 0x9AD1 }, + { 0xC5EB, 0x9C54 }, + { 0xC5EC, 0x9C57 }, + { 0xC5ED, 0x9C56 }, + { 0xC5EE, 0x9DE5 }, + { 0xC5EF, 0x9E9F }, + { 0xC5F0, 0x9EF4 }, + { 0xC5F1, 0x56D1 }, + { 0xC5F2, 0x58E9 }, + { 0xC5F3, 0x652C }, + { 0xC5F4, 0x705E }, + { 0xC5F5, 0x7671 }, + { 0xC5F6, 0x7672 }, + { 0xC5F7, 0x77D7 }, + { 0xC5F8, 0x7F50 }, + { 0xC5F9, 0x7F88 }, + { 0xC5FA, 0x8836 }, + { 0xC5FB, 0x8839 }, + { 0xC5FC, 0x8862 }, + { 0xC5FD, 0x8B93 }, + { 0xC5FE, 0x8B92 }, + { 0xC640, 0x8B96 }, + { 0xC641, 0x8277 }, + { 0xC642, 0x8D1B }, + { 0xC643, 0x91C0 }, + { 0xC644, 0x946A }, + { 0xC645, 0x9742 }, + { 0xC646, 0x9748 }, + { 0xC647, 0x9744 }, + { 0xC648, 0x97C6 }, + { 0xC649, 0x9870 }, + { 0xC64A, 0x9A5F }, + { 0xC64B, 0x9B22 }, + { 0xC64C, 0x9B58 }, + { 0xC64D, 0x9C5F }, + { 0xC64E, 0x9DF9 }, + { 0xC64F, 0x9DFA }, + { 0xC650, 0x9E7C }, + { 0xC651, 0x9E7D }, + { 0xC652, 0x9F07 }, + { 0xC653, 0x9F77 }, + { 0xC654, 0x9F72 }, + { 0xC655, 0x5EF3 }, + { 0xC656, 0x6B16 }, + { 0xC657, 0x7063 }, + { 0xC658, 0x7C6C }, + { 0xC659, 0x7C6E }, + { 0xC65A, 0x883B }, + { 0xC65B, 0x89C0 }, + { 0xC65C, 0x8EA1 }, + { 0xC65D, 0x91C1 }, + { 0xC65E, 0x9472 }, + { 0xC65F, 0x9470 }, + { 0xC660, 0x9871 }, + { 0xC661, 0x995E }, + { 0xC662, 0x9AD6 }, + { 0xC663, 0x9B23 }, + { 0xC664, 0x9ECC }, + { 0xC665, 0x7064 }, + { 0xC666, 0x77DA }, + { 0xC667, 0x8B9A }, + { 0xC668, 0x9477 }, + { 0xC669, 0x97C9 }, + { 0xC66A, 0x9A62 }, + { 0xC66B, 0x9A65 }, + { 0xC66C, 0x7E9C }, + { 0xC66D, 0x8B9C }, + { 0xC66E, 0x8EAA }, + { 0xC66F, 0x91C5 }, + { 0xC670, 0x947D }, + { 0xC671, 0x947E }, + { 0xC672, 0x947C }, + { 0xC673, 0x9C77 }, + { 0xC674, 0x9C78 }, + { 0xC675, 0x9EF7 }, + { 0xC676, 0x8C54 }, + { 0xC677, 0x947F }, + { 0xC678, 0x9E1A }, + { 0xC679, 0x7228 }, + { 0xC67A, 0x9A6A }, + { 0xC67B, 0x9B31 }, + { 0xC67C, 0x9E1B }, + { 0xC67D, 0x9E1E }, + { 0xC67E, 0x7C72 }, + { 0xC6A1, 0x30FE }, + { 0xC6A2, 0x309D }, + { 0xC6A3, 0x309E }, + { 0xC6A4, 0x3005 }, + { 0xC6A5, 0x3041 }, + { 0xC6A6, 0x3042 }, + { 0xC6A7, 0x3043 }, + { 0xC6A8, 0x3044 }, + { 0xC6A9, 0x3045 }, + { 0xC6AA, 0x3046 }, + { 0xC6AB, 0x3047 }, + { 0xC6AC, 0x3048 }, + { 0xC6AD, 0x3049 }, + { 0xC6AE, 0x304A }, + { 0xC6AF, 0x304B }, + { 0xC6B0, 0x304C }, + { 0xC6B1, 0x304D }, + { 0xC6B2, 0x304E }, + { 0xC6B3, 0x304F }, + { 0xC6B4, 0x3050 }, + { 0xC6B5, 0x3051 }, + { 0xC6B6, 0x3052 }, + { 0xC6B7, 0x3053 }, + { 0xC6B8, 0x3054 }, + { 0xC6B9, 0x3055 }, + { 0xC6BA, 0x3056 }, + { 0xC6BB, 0x3057 }, + { 0xC6BC, 0x3058 }, + { 0xC6BD, 0x3059 }, + { 0xC6BE, 0x305A }, + { 0xC6BF, 0x305B }, + { 0xC6C0, 0x305C }, + { 0xC6C1, 0x305D }, + { 0xC6C2, 0x305E }, + { 0xC6C3, 0x305F }, + { 0xC6C4, 0x3060 }, + { 0xC6C5, 0x3061 }, + { 0xC6C6, 0x3062 }, + { 0xC6C7, 0x3063 }, + { 0xC6C8, 0x3064 }, + { 0xC6C9, 0x3065 }, + { 0xC6CA, 0x3066 }, + { 0xC6CB, 0x3067 }, + { 0xC6CC, 0x3068 }, + { 0xC6CD, 0x3069 }, + { 0xC6CE, 0x306A }, + { 0xC6CF, 0x306B }, + { 0xC6D0, 0x306C }, + { 0xC6D1, 0x306D }, + { 0xC6D2, 0x306E }, + { 0xC6D3, 0x306F }, + { 0xC6D4, 0x3070 }, + { 0xC6D5, 0x3071 }, + { 0xC6D6, 0x3072 }, + { 0xC6D7, 0x3073 }, + { 0xC6D8, 0x3074 }, + { 0xC6D9, 0x3075 }, + { 0xC6DA, 0x3076 }, + { 0xC6DB, 0x3077 }, + { 0xC6DC, 0x3078 }, + { 0xC6DD, 0x3079 }, + { 0xC6DE, 0x307A }, + { 0xC6DF, 0x307B }, + { 0xC6E0, 0x307C }, + { 0xC6E1, 0x307D }, + { 0xC6E2, 0x307E }, + { 0xC6E3, 0x307F }, + { 0xC6E4, 0x3080 }, + { 0xC6E5, 0x3081 }, + { 0xC6E6, 0x3082 }, + { 0xC6E7, 0x3083 }, + { 0xC6E8, 0x3084 }, + { 0xC6E9, 0x3085 }, + { 0xC6EA, 0x3086 }, + { 0xC6EB, 0x3087 }, + { 0xC6EC, 0x3088 }, + { 0xC6ED, 0x3089 }, + { 0xC6EE, 0x308A }, + { 0xC6EF, 0x308B }, + { 0xC6F0, 0x308C }, + { 0xC6F1, 0x308D }, + { 0xC6F2, 0x308E }, + { 0xC6F3, 0x308F }, + { 0xC6F4, 0x3090 }, + { 0xC6F5, 0x3091 }, + { 0xC6F6, 0x3092 }, + { 0xC6F7, 0x3093 }, + { 0xC6F8, 0x30A1 }, + { 0xC6F9, 0x30A2 }, + { 0xC6FA, 0x30A3 }, + { 0xC6FB, 0x30A4 }, + { 0xC6FC, 0x30A5 }, + { 0xC6FD, 0x30A6 }, + { 0xC6FE, 0x30A7 }, + { 0xC740, 0x30A8 }, + { 0xC741, 0x30A9 }, + { 0xC742, 0x30AA }, + { 0xC743, 0x30AB }, + { 0xC744, 0x30AC }, + { 0xC745, 0x30AD }, + { 0xC746, 0x30AE }, + { 0xC747, 0x30AF }, + { 0xC748, 0x30B0 }, + { 0xC749, 0x30B1 }, + { 0xC74A, 0x30B2 }, + { 0xC74B, 0x30B3 }, + { 0xC74C, 0x30B4 }, + { 0xC74D, 0x30B5 }, + { 0xC74E, 0x30B6 }, + { 0xC74F, 0x30B7 }, + { 0xC750, 0x30B8 }, + { 0xC751, 0x30B9 }, + { 0xC752, 0x30BA }, + { 0xC753, 0x30BB }, + { 0xC754, 0x30BC }, + { 0xC755, 0x30BD }, + { 0xC756, 0x30BE }, + { 0xC757, 0x30BF }, + { 0xC758, 0x30C0 }, + { 0xC759, 0x30C1 }, + { 0xC75A, 0x30C2 }, + { 0xC75B, 0x30C3 }, + { 0xC75C, 0x30C4 }, + { 0xC75D, 0x30C5 }, + { 0xC75E, 0x30C6 }, + { 0xC75F, 0x30C7 }, + { 0xC760, 0x30C8 }, + { 0xC761, 0x30C9 }, + { 0xC762, 0x30CA }, + { 0xC763, 0x30CB }, + { 0xC764, 0x30CC }, + { 0xC765, 0x30CD }, + { 0xC766, 0x30CE }, + { 0xC767, 0x30CF }, + { 0xC768, 0x30D0 }, + { 0xC769, 0x30D1 }, + { 0xC76A, 0x30D2 }, + { 0xC76B, 0x30D3 }, + { 0xC76C, 0x30D4 }, + { 0xC76D, 0x30D5 }, + { 0xC76E, 0x30D6 }, + { 0xC76F, 0x30D7 }, + { 0xC770, 0x30D8 }, + { 0xC771, 0x30D9 }, + { 0xC772, 0x30DA }, + { 0xC773, 0x30DB }, + { 0xC774, 0x30DC }, + { 0xC775, 0x30DD }, + { 0xC776, 0x30DE }, + { 0xC777, 0x30DF }, + { 0xC778, 0x30E0 }, + { 0xC779, 0x30E1 }, + { 0xC77A, 0x30E2 }, + { 0xC77B, 0x30E3 }, + { 0xC77C, 0x30E4 }, + { 0xC77D, 0x30E5 }, + { 0xC77E, 0x30E6 }, + { 0xC7A1, 0x30E7 }, + { 0xC7A2, 0x30E8 }, + { 0xC7A3, 0x30E9 }, + { 0xC7A4, 0x30EA }, + { 0xC7A5, 0x30EB }, + { 0xC7A6, 0x30EC }, + { 0xC7A7, 0x30ED }, + { 0xC7A8, 0x30EE }, + { 0xC7A9, 0x30EF }, + { 0xC7AA, 0x30F0 }, + { 0xC7AB, 0x30F1 }, + { 0xC7AC, 0x30F2 }, + { 0xC7AD, 0x30F3 }, + { 0xC7AE, 0x30F4 }, + { 0xC7AF, 0x30F5 }, + { 0xC7B0, 0x30F6 }, + { 0xC7B1, 0x0414 }, + { 0xC7B2, 0x0415 }, + { 0xC7B3, 0x0401 }, + { 0xC7B4, 0x0416 }, + { 0xC7B5, 0x0417 }, + { 0xC7B6, 0x0418 }, + { 0xC7B7, 0x0419 }, + { 0xC7B8, 0x041A }, + { 0xC7B9, 0x041B }, + { 0xC7BA, 0x041C }, + { 0xC7BB, 0x0423 }, + { 0xC7BC, 0x0424 }, + { 0xC7BD, 0x0425 }, + { 0xC7BE, 0x0426 }, + { 0xC7BF, 0x0427 }, + { 0xC7C0, 0x0428 }, + { 0xC7C1, 0x0429 }, + { 0xC7C2, 0x042A }, + { 0xC7C3, 0x042B }, + { 0xC7C4, 0x042C }, + { 0xC7C5, 0x042D },{ 0xC7C6, 0x042E }, + { 0xC7C7, 0x042F }, + { 0xC7C8, 0x0430 }, + { 0xC7C9, 0x0431 }, + { 0xC7CA, 0x0432 }, + { 0xC7CB, 0x0433 }, + { 0xC7CC, 0x0434 }, + { 0xC7CD, 0x0435 }, + { 0xC7CE, 0x0451 }, + { 0xC7CF, 0x0436 }, + { 0xC7D0, 0x0437 }, + { 0xC7D1, 0x0438 }, + { 0xC7D2, 0x0439 }, + { 0xC7D3, 0x043A }, + { 0xC7D4, 0x043B }, + { 0xC7D5, 0x043C }, + { 0xC7D6, 0x043D }, + { 0xC7D7, 0x043E }, + { 0xC7D8, 0x043F }, + { 0xC7D9, 0x0440 }, + { 0xC7DA, 0x0441 }, + { 0xC7DB, 0x0442 }, + { 0xC7DC, 0x0443 }, + { 0xC7DD, 0x0444 }, + { 0xC7DE, 0x0445 }, + { 0xC7DF, 0x0446 }, + { 0xC7E0, 0x0447 }, + { 0xC7E1, 0x0448 }, + { 0xC7E2, 0x0449 }, + { 0xC7E3, 0x044A }, + { 0xC7E4, 0x044B }, + { 0xC7E5, 0x044C }, + { 0xC7E6, 0x044D }, + { 0xC7E7, 0x044E }, + { 0xC7E8, 0x044F }, + { 0xC7E9, 0x2460 }, + { 0xC7EA, 0x2461 }, + { 0xC7EB, 0x2462 }, + { 0xC7EC, 0x2463 }, + { 0xC7ED, 0x2464 }, + { 0xC7EE, 0x2465 }, + { 0xC7EF, 0x2466 }, + { 0xC7F0, 0x2467 }, + { 0xC7F1, 0x2468 }, + { 0xC7F2, 0x2469 }, + { 0xC7F3, 0x2474 }, + { 0xC7F4, 0x2475 }, + { 0xC7F5, 0x2476 }, + { 0xC7F6, 0x2477 }, + { 0xC7F7, 0x2478 }, + { 0xC7F8, 0x2479 }, + { 0xC7F9, 0x247A }, + { 0xC7FA, 0x247B }, + { 0xC7FB, 0x247C }, + { 0xC7FC, 0x247D }, + { 0xC940, 0x4E42 }, + { 0xC941, 0x4E5C }, + { 0xC942, 0x51F5 }, + { 0xC943, 0x531A }, + { 0xC944, 0x5382 }, + { 0xC945, 0x4E07 }, + { 0xC946, 0x4E0C }, + { 0xC947, 0x4E47 }, + { 0xC948, 0x4E8D }, + { 0xC949, 0x56D7 }, + { 0xC94A, 0xFA0C }, + { 0xC94B, 0x5C6E }, + { 0xC94C, 0x5F73 }, + { 0xC94D, 0x4E0F }, + { 0xC94E, 0x5187 }, + { 0xC94F, 0x4E0E }, + { 0xC950, 0x4E2E }, + { 0xC951, 0x4E93 }, + { 0xC952, 0x4EC2 }, + { 0xC953, 0x4EC9 }, + { 0xC954, 0x4EC8 }, + { 0xC955, 0x5198 }, + { 0xC956, 0x52FC }, + { 0xC957, 0x536C }, + { 0xC958, 0x53B9 }, + { 0xC959, 0x5720 }, + { 0xC95A, 0x5903 }, + { 0xC95B, 0x592C }, + { 0xC95C, 0x5C10 }, + { 0xC95D, 0x5DFF }, + { 0xC95E, 0x65E1 }, + { 0xC95F, 0x6BB3 }, + { 0xC960, 0x6BCC }, + { 0xC961, 0x6C14 }, + { 0xC962, 0x723F }, + { 0xC963, 0x4E31 }, + { 0xC964, 0x4E3C }, + { 0xC965, 0x4EE8 }, + { 0xC966, 0x4EDC }, + { 0xC967, 0x4EE9 }, + { 0xC968, 0x4EE1 }, + { 0xC969, 0x4EDD }, + { 0xC96A, 0x4EDA }, + { 0xC96B, 0x520C }, + { 0xC96C, 0x531C }, + { 0xC96D, 0x534C }, + { 0xC96E, 0x5722 }, + { 0xC96F, 0x5723 }, + { 0xC970, 0x5917 }, + { 0xC971, 0x592F }, + { 0xC972, 0x5B81 }, + { 0xC973, 0x5B84 }, + { 0xC974, 0x5C12 }, + { 0xC975, 0x5C3B }, + { 0xC976, 0x5C74 }, + { 0xC977, 0x5C73 }, + { 0xC978, 0x5E04 }, + { 0xC979, 0x5E80 }, + { 0xC97A, 0x5E82 }, + { 0xC97B, 0x5FC9 }, + { 0xC97C, 0x6209 }, + { 0xC97D, 0x6250 }, + { 0xC97E, 0x6C15 }, + { 0xC9A1, 0x6C36 }, + { 0xC9A2, 0x6C43 }, + { 0xC9A3, 0x6C3F }, + { 0xC9A4, 0x6C3B }, + { 0xC9A5, 0x72AE }, + { 0xC9A6, 0x72B0 }, + { 0xC9A7, 0x738A }, + { 0xC9A8, 0x79B8 }, + { 0xC9A9, 0x808A }, + { 0xC9AA, 0x961E }, + { 0xC9AB, 0x4F0E }, + { 0xC9AC, 0x4F18 }, + { 0xC9AD, 0x4F2C }, + { 0xC9AE, 0x4EF5 }, + { 0xC9AF, 0x4F14 }, + { 0xC9B0, 0x4EF1 }, + { 0xC9B1, 0x4F00 }, + { 0xC9B2, 0x4EF7 }, + { 0xC9B3, 0x4F08 }, + { 0xC9B4, 0x4F1D }, + { 0xC9B5, 0x4F02 }, + { 0xC9B6, 0x4F05 }, + { 0xC9B7, 0x4F22 }, + { 0xC9B8, 0x4F13 }, + { 0xC9B9, 0x4F04 }, + { 0xC9BA, 0x4EF4 }, + { 0xC9BB, 0x4F12 }, + { 0xC9BC, 0x51B1 }, + { 0xC9BD, 0x5213 }, + { 0xC9BE, 0x5209 }, + { 0xC9BF, 0x5210 }, + { 0xC9C0, 0x52A6 }, + { 0xC9C1, 0x5322 }, + { 0xC9C2, 0x531F }, + { 0xC9C3, 0x534D }, + { 0xC9C4, 0x538A }, + { 0xC9C5, 0x5407 }, + { 0xC9C6, 0x56E1 }, + { 0xC9C7, 0x56DF }, + { 0xC9C8, 0x572E }, + { 0xC9C9, 0x572A }, + { 0xC9CA, 0x5734 }, + { 0xC9CB, 0x593C }, + { 0xC9CC, 0x5980 }, + { 0xC9CD, 0x597C }, + { 0xC9CE, 0x5985 }, + { 0xC9CF, 0x597B }, + { 0xC9D0, 0x597E }, + { 0xC9D1, 0x5977 }, + { 0xC9D2, 0x597F }, + { 0xC9D3, 0x5B56 }, + { 0xC9D4, 0x5C15 }, + { 0xC9D5, 0x5C25 }, + { 0xC9D6, 0x5C7C }, + { 0xC9D7, 0x5C7A }, + { 0xC9D8, 0x5C7B }, + { 0xC9D9, 0x5C7E }, + { 0xC9DA, 0x5DDF }, + { 0xC9DB, 0x5E75 }, + { 0xC9DC, 0x5E84 }, + { 0xC9DD, 0x5F02 }, + { 0xC9DE, 0x5F1A }, + { 0xC9DF, 0x5F74 }, + { 0xC9E0, 0x5FD5 }, + { 0xC9E1, 0x5FD4 }, + { 0xC9E2, 0x5FCF }, + { 0xC9E3, 0x625C }, + { 0xC9E4, 0x625E }, + { 0xC9E5, 0x6264 }, + { 0xC9E6, 0x6261 }, + { 0xC9E7, 0x6266 }, + { 0xC9E8, 0x6262 }, + { 0xC9E9, 0x6259 }, + { 0xC9EA, 0x6260 }, + { 0xC9EB, 0x625A }, + { 0xC9EC, 0x6265 }, + { 0xC9ED, 0x65EF }, + { 0xC9EE, 0x65EE }, + { 0xC9EF, 0x673E }, + { 0xC9F0, 0x6739 }, + { 0xC9F1, 0x6738 }, + { 0xC9F2, 0x673B }, + { 0xC9F3, 0x673A }, + { 0xC9F4, 0x673F }, + { 0xC9F5, 0x673C }, + { 0xC9F6, 0x6733 }, + { 0xC9F7, 0x6C18 }, + { 0xC9F8, 0x6C46 }, + { 0xC9F9, 0x6C52 }, + { 0xC9FA, 0x6C5C }, + { 0xC9FB, 0x6C4F }, + { 0xC9FC, 0x6C4A }, + { 0xC9FD, 0x6C54 }, + { 0xC9FE, 0x6C4B }, + { 0xCA40, 0x6C4C }, + { 0xCA41, 0x7071 }, + { 0xCA42, 0x725E }, + { 0xCA43, 0x72B4 }, + { 0xCA44, 0x72B5 }, + { 0xCA45, 0x738E }, + { 0xCA46, 0x752A }, + { 0xCA47, 0x767F }, + { 0xCA48, 0x7A75 }, + { 0xCA49, 0x7F51 }, + { 0xCA4A, 0x8278 }, + { 0xCA4B, 0x827C }, + { 0xCA4C, 0x8280 }, + { 0xCA4D, 0x827D }, + { 0xCA4E, 0x827F }, + { 0xCA4F, 0x864D }, + { 0xCA50, 0x897E }, + { 0xCA51, 0x9099 }, + { 0xCA52, 0x9097 }, + { 0xCA53, 0x9098 }, + { 0xCA54, 0x909B }, + { 0xCA55, 0x9094 }, + { 0xCA56, 0x9622 }, + { 0xCA57, 0x9624 }, + { 0xCA58, 0x9620 }, + { 0xCA59, 0x9623 }, + { 0xCA5A, 0x4F56 }, + { 0xCA5B, 0x4F3B }, + { 0xCA5C, 0x4F62 }, + { 0xCA5D, 0x4F49 }, + { 0xCA5E, 0x4F53 }, + { 0xCA5F, 0x4F64 }, + { 0xCA60, 0x4F3E }, + { 0xCA61, 0x4F67 }, + { 0xCA62, 0x4F52 }, + { 0xCA63, 0x4F5F }, + { 0xCA64, 0x4F41 }, + { 0xCA65, 0x4F58 }, + { 0xCA66, 0x4F2D }, + { 0xCA67, 0x4F33 }, + { 0xCA68, 0x4F3F }, + { 0xCA69, 0x4F61 }, + { 0xCA6A, 0x518F }, + { 0xCA6B, 0x51B9 }, + { 0xCA6C, 0x521C }, + { 0xCA6D, 0x521E }, + { 0xCA6E, 0x5221 }, + { 0xCA6F, 0x52AD }, + { 0xCA70, 0x52AE }, + { 0xCA71, 0x5309 }, + { 0xCA72, 0x5363 }, + { 0xCA73, 0x5372 }, + { 0xCA74, 0x538E }, + { 0xCA75, 0x538F }, + { 0xCA76, 0x5430 }, + { 0xCA77, 0x5437 }, + { 0xCA78, 0x542A }, + { 0xCA79, 0x5454 }, + { 0xCA7A, 0x5445 }, + { 0xCA7B, 0x5419 }, + { 0xCA7C, 0x541C }, + { 0xCA7D, 0x5425 }, + { 0xCA7E, 0x5418 }, + { 0xCAA1, 0x543D }, + { 0xCAA2, 0x544F }, + { 0xCAA3, 0x5441 }, + { 0xCAA4, 0x5428 }, + { 0xCAA5, 0x5424 }, + { 0xCAA6, 0x5447 }, + { 0xCAA7, 0x56EE }, + { 0xCAA8, 0x56E7 }, + { 0xCAA9, 0x56E5 }, + { 0xCAAA, 0x5741 }, + { 0xCAAB, 0x5745 }, + { 0xCAAC, 0x574C }, + { 0xCAAD, 0x5749 }, + { 0xCAAE, 0x574B }, + { 0xCAAF, 0x5752 }, + { 0xCAB0, 0x5906 }, + { 0xCAB1, 0x5940 }, + { 0xCAB2, 0x59A6 }, + { 0xCAB3, 0x5998 }, + { 0xCAB4, 0x59A0 }, + { 0xCAB5, 0x5997 }, + { 0xCAB6, 0x598E }, + { 0xCAB7, 0x59A2 }, + { 0xCAB8, 0x5990 }, + { 0xCAB9, 0x598F }, + { 0xCABA, 0x59A7 }, + { 0xCABB, 0x59A1 }, + { 0xCABC, 0x5B8E }, + { 0xCABD, 0x5B92 }, + { 0xCABE, 0x5C28 }, + { 0xCABF, 0x5C2A }, + { 0xCAC0, 0x5C8D }, + { 0xCAC1, 0x5C8F }, + { 0xCAC2, 0x5C88 }, + { 0xCAC3, 0x5C8B }, + { 0xCAC4, 0x5C89 }, + { 0xCAC5, 0x5C92 }, + { 0xCAC6, 0x5C8A }, + { 0xCAC7, 0x5C86 }, + { 0xCAC8, 0x5C93 }, + { 0xCAC9, 0x5C95 }, + { 0xCACA, 0x5DE0 }, + { 0xCACB, 0x5E0A }, + { 0xCACC, 0x5E0E }, + { 0xCACD, 0x5E8B }, + { 0xCACE, 0x5E89 }, + { 0xCACF, 0x5E8C }, + { 0xCAD0, 0x5E88 }, + { 0xCAD1, 0x5E8D }, + { 0xCAD2, 0x5F05 }, + { 0xCAD3, 0x5F1D }, + { 0xCAD4, 0x5F78 }, + { 0xCAD5, 0x5F76 }, + { 0xCAD6, 0x5FD2 }, + { 0xCAD7, 0x5FD1 }, + { 0xCAD8, 0x5FD0 }, + { 0xCAD9, 0x5FED }, + { 0xCADA, 0x5FE8 }, + { 0xCADB, 0x5FEE }, + { 0xCADC, 0x5FF3 }, + { 0xCADD, 0x5FE1 }, + { 0xCADE, 0x5FE4 }, + { 0xCADF, 0x5FE3 }, + { 0xCAE0, 0x5FFA }, + { 0xCAE1, 0x5FEF }, + { 0xCAE2, 0x5FF7 }, + { 0xCAE3, 0x5FFB }, + { 0xCAE4, 0x6000 }, + { 0xCAE5, 0x5FF4 }, + { 0xCAE6, 0x623A }, + { 0xCAE7, 0x6283 }, + { 0xCAE8, 0x628C }, + { 0xCAE9, 0x628E }, + { 0xCAEA, 0x628F }, + { 0xCAEB, 0x6294 }, + { 0xCAEC, 0x6287 }, + { 0xCAED, 0x6271 }, + { 0xCAEE, 0x627B }, + { 0xCAEF, 0x627A }, + { 0xCAF0, 0x6270 }, + { 0xCAF1, 0x6281 }, + { 0xCAF2, 0x6288 }, + { 0xCAF3, 0x6277 }, + { 0xCAF4, 0x627D }, + { 0xCAF5, 0x6272 }, + { 0xCAF6, 0x6274 }, + { 0xCAF7, 0x6537 }, + { 0xCAF8, 0x65F0 }, + { 0xCAF9, 0x65F4 }, + { 0xCAFA, 0x65F3 }, + { 0xCAFB, 0x65F2 }, + { 0xCAFC, 0x65F5 }, + { 0xCAFD, 0x6745 }, + { 0xCAFE, 0x6747 }, + { 0xCB40, 0x6759 }, + { 0xCB41, 0x6755 }, + { 0xCB42, 0x674C }, + { 0xCB43, 0x6748 }, + { 0xCB44, 0x675D }, + { 0xCB45, 0x674D }, + { 0xCB46, 0x675A }, + { 0xCB47, 0x674B }, + { 0xCB48, 0x6BD0 }, + { 0xCB49, 0x6C19 }, + { 0xCB4A, 0x6C1A }, + { 0xCB4B, 0x6C78 }, + { 0xCB4C, 0x6C67 }, + { 0xCB4D, 0x6C6B }, + { 0xCB4E, 0x6C84 }, + { 0xCB4F, 0x6C8B }, + { 0xCB50, 0x6C8F }, + { 0xCB51, 0x6C71 }, + { 0xCB52, 0x6C6F }, + { 0xCB53, 0x6C69 }, + { 0xCB54, 0x6C9A }, + { 0xCB55, 0x6C6D }, + { 0xCB56, 0x6C87 }, + { 0xCB57, 0x6C95 }, + { 0xCB58, 0x6C9C }, + { 0xCB59, 0x6C66 }, + { 0xCB5A, 0x6C73 }, + { 0xCB5B, 0x6C65 }, + { 0xCB5C, 0x6C7B }, + { 0xCB5D, 0x6C8E }, + { 0xCB5E, 0x7074 }, + { 0xCB5F, 0x707A }, + { 0xCB60, 0x7263 }, + { 0xCB61, 0x72BF }, + { 0xCB62, 0x72BD }, + { 0xCB63, 0x72C3 }, + { 0xCB64, 0x72C6 }, + { 0xCB65, 0x72C1 }, + { 0xCB66, 0x72BA }, + { 0xCB67, 0x72C5 }, + { 0xCB68, 0x7395 }, + { 0xCB69, 0x7397 }, + { 0xCB6A, 0x7393 }, + { 0xCB6B, 0x7394 }, + { 0xCB6C, 0x7392 }, + { 0xCB6D, 0x753A }, + { 0xCB6E, 0x7539 }, + { 0xCB6F, 0x7594 }, + { 0xCB70, 0x7595 }, + { 0xCB71, 0x7681 }, + { 0xCB72, 0x793D }, + { 0xCB73, 0x8034 }, + { 0xCB74, 0x8095 }, + { 0xCB75, 0x8099 }, + { 0xCB76, 0x8090 }, + { 0xCB77, 0x8092 }, + { 0xCB78, 0x809C }, + { 0xCB79, 0x8290 }, + { 0xCB7A, 0x828F }, + { 0xCB7B, 0x8285 }, + { 0xCB7C, 0x828E }, + { 0xCB7D, 0x8291 }, + { 0xCB7E, 0x8293 }, + { 0xCBA1, 0x828A }, + { 0xCBA2, 0x8283 }, + { 0xCBA3, 0x8284 }, + { 0xCBA4, 0x8C78 }, + { 0xCBA5, 0x8FC9 }, + { 0xCBA6, 0x8FBF }, + { 0xCBA7, 0x909F }, + { 0xCBA8, 0x90A1 }, + { 0xCBA9, 0x90A5 }, + { 0xCBAA, 0x909E }, + { 0xCBAB, 0x90A7 }, + { 0xCBAC, 0x90A0 }, + { 0xCBAD, 0x9630 }, + { 0xCBAE, 0x9628 }, + { 0xCBAF, 0x962F }, + { 0xCBB0, 0x962D }, + { 0xCBB1, 0x4E33 }, + { 0xCBB2, 0x4F98 }, + { 0xCBB3, 0x4F7C }, + { 0xCBB4, 0x4F85 }, + { 0xCBB5, 0x4F7D }, + { 0xCBB6, 0x4F80 }, + { 0xCBB7, 0x4F87 }, + { 0xCBB8, 0x4F76 }, + { 0xCBB9, 0x4F74 }, + { 0xCBBA, 0x4F89 }, + { 0xCBBB, 0x4F84 }, + { 0xCBBC, 0x4F77 }, + { 0xCBBD, 0x4F4C }, + { 0xCBBE, 0x4F97 }, + { 0xCBBF, 0x4F6A }, + { 0xCBC0, 0x4F9A }, + { 0xCBC1, 0x4F79 }, + { 0xCBC2, 0x4F81 }, + { 0xCBC3, 0x4F78 }, + { 0xCBC4, 0x4F90 }, + { 0xCBC5, 0x4F9C }, + { 0xCBC6, 0x4F94 }, + { 0xCBC7, 0x4F9E }, + { 0xCBC8, 0x4F92 }, + { 0xCBC9, 0x4F82 }, + { 0xCBCA, 0x4F95 }, + { 0xCBCB, 0x4F6B }, + { 0xCBCC, 0x4F6E }, + { 0xCBCD, 0x519E }, + { 0xCBCE, 0x51BC }, + { 0xCBCF, 0x51BE }, + { 0xCBD0, 0x5235 }, + { 0xCBD1, 0x5232 }, + { 0xCBD2, 0x5233 }, + { 0xCBD3, 0x5246 }, + { 0xCBD4, 0x5231 }, + { 0xCBD5, 0x52BC }, + { 0xCBD6, 0x530A }, + { 0xCBD7, 0x530B }, + { 0xCBD8, 0x533C }, + { 0xCBD9, 0x5392 }, + { 0xCBDA, 0x5394 }, + { 0xCBDB, 0x5487 }, + { 0xCBDC, 0x547F }, + { 0xCBDD, 0x5481 }, + { 0xCBDE, 0x5491 }, + { 0xCBDF, 0x5482 }, + { 0xCBE0, 0x5488 }, + { 0xCBE1, 0x546B }, + { 0xCBE2, 0x547A }, + { 0xCBE3, 0x547E }, + { 0xCBE4, 0x5465 }, + { 0xCBE5, 0x546C }, + { 0xCBE6, 0x5474 }, + { 0xCBE7, 0x5466 }, + { 0xCBE8, 0x548D }, + { 0xCBE9, 0x546F }, + { 0xCBEA, 0x5461 }, + { 0xCBEB, 0x5460 }, + { 0xCBEC, 0x5498 }, + { 0xCBED, 0x5463 }, + { 0xCBEE, 0x5467 }, + { 0xCBEF, 0x5464 }, + { 0xCBF0, 0x56F7 }, + { 0xCBF1, 0x56F9 }, + { 0xCBF2, 0x576F }, + { 0xCBF3, 0x5772 }, + { 0xCBF4, 0x576D }, + { 0xCBF5, 0x576B }, + { 0xCBF6, 0x5771 }, + { 0xCBF7, 0x5770 }, + { 0xCBF8, 0x5776 }, + { 0xCBF9, 0x5780 }, + { 0xCBFA, 0x5775 }, + { 0xCBFB, 0x577B }, + { 0xCBFC, 0x5773 }, + { 0xCBFD, 0x5774 }, + { 0xCBFE, 0x5762 }, + { 0xCC40, 0x5768 }, + { 0xCC41, 0x577D }, + { 0xCC42, 0x590C }, + { 0xCC43, 0x5945 }, + { 0xCC44, 0x59B5 }, + { 0xCC45, 0x59BA }, + { 0xCC46, 0x59CF }, + { 0xCC47, 0x59CE }, + { 0xCC48, 0x59B2 }, + { 0xCC49, 0x59CC }, + { 0xCC4A, 0x59C1 }, + { 0xCC4B, 0x59B6 }, + { 0xCC4C, 0x59BC }, + { 0xCC4D, 0x59C3 }, + { 0xCC4E, 0x59D6 }, + { 0xCC4F, 0x59B1 }, + { 0xCC50, 0x59BD }, + { 0xCC51, 0x59C0 }, + { 0xCC52, 0x59C8 }, + { 0xCC53, 0x59B4 }, + { 0xCC54, 0x59C7 }, + { 0xCC55, 0x5B62 }, + { 0xCC56, 0x5B65 }, + { 0xCC57, 0x5B93 }, + { 0xCC58, 0x5B95 }, + { 0xCC59, 0x5C44 }, + { 0xCC5A, 0x5C47 }, + { 0xCC5B, 0x5CAE }, + { 0xCC5C, 0x5CA4 }, + { 0xCC5D, 0x5CA0 }, + { 0xCC5E, 0x5CB5 }, + { 0xCC5F, 0x5CAF }, + { 0xCC60, 0x5CA8 }, + { 0xCC61, 0x5CAC }, + { 0xCC62, 0x5C9F }, + { 0xCC63, 0x5CA3 }, + { 0xCC64, 0x5CAD }, + { 0xCC65, 0x5CA2 }, + { 0xCC66, 0x5CAA }, + { 0xCC67, 0x5CA7 }, + { 0xCC68, 0x5C9D }, + { 0xCC69, 0x5CA5 }, + { 0xCC6A, 0x5CB6 }, + { 0xCC6B, 0x5CB0 }, + { 0xCC6C, 0x5CA6 }, + { 0xCC6D, 0x5E17 }, + { 0xCC6E, 0x5E14 }, + { 0xCC6F, 0x5E19 }, + { 0xCC70, 0x5F28 }, + { 0xCC71, 0x5F22 }, + { 0xCC72, 0x5F23 }, + { 0xCC73, 0x5F24 }, + { 0xCC74, 0x5F54 }, + { 0xCC75, 0x5F82 }, + { 0xCC76, 0x5F7E }, + { 0xCC77, 0x5F7D }, + { 0xCC78, 0x5FDE }, + { 0xCC79, 0x5FE5 }, + { 0xCC7A, 0x602D }, + { 0xCC7B, 0x6026 }, + { 0xCC7C, 0x6019 }, + { 0xCC7D, 0x6032 }, + { 0xCC7E, 0x600B }, + { 0xCCA1, 0x6034 }, + { 0xCCA2, 0x600A }, + { 0xCCA3, 0x6017 }, + { 0xCCA4, 0x6033 }, + { 0xCCA5, 0x601A }, + { 0xCCA6, 0x601E }, + { 0xCCA7, 0x602C }, + { 0xCCA8, 0x6022 }, + { 0xCCA9, 0x600D }, + { 0xCCAA, 0x6010 }, + { 0xCCAB, 0x602E }, + { 0xCCAC, 0x6013 }, + { 0xCCAD, 0x6011 }, + { 0xCCAE, 0x600C }, + { 0xCCAF, 0x6009 }, + { 0xCCB0, 0x601C }, + { 0xCCB1, 0x6214 }, + { 0xCCB2, 0x623D }, + { 0xCCB3, 0x62AD }, + { 0xCCB4, 0x62B4 }, + { 0xCCB5, 0x62D1 }, + { 0xCCB6, 0x62BE }, + { 0xCCB7, 0x62AA }, + { 0xCCB8, 0x62B6 }, + { 0xCCB9, 0x62CA }, + { 0xCCBA, 0x62AE }, + { 0xCCBB, 0x62B3 }, + { 0xCCBC, 0x62AF }, + { 0xCCBD, 0x62BB }, + { 0xCCBE, 0x62A9 }, + { 0xCCBF, 0x62B0 }, + { 0xCCC0, 0x62B8 }, + { 0xCCC1, 0x653D }, + { 0xCCC2, 0x65A8 }, + { 0xCCC3, 0x65BB }, + { 0xCCC4, 0x6609 }, + { 0xCCC5, 0x65FC }, + { 0xCCC6, 0x6604 }, + { 0xCCC7, 0x6612 }, + { 0xCCC8, 0x6608 }, + { 0xCCC9, 0x65FB }, + { 0xCCCA, 0x6603 }, + { 0xCCCB, 0x660B }, + { 0xCCCC, 0x660D }, + { 0xCCCD, 0x6605 }, + { 0xCCCE, 0x65FD }, + { 0xCCCF, 0x6611 }, + { 0xCCD0, 0x6610 }, + { 0xCCD1, 0x66F6 }, + { 0xCCD2, 0x670A }, + { 0xCCD3, 0x6785 }, + { 0xCCD4, 0x676C }, + { 0xCCD5, 0x678E }, + { 0xCCD6, 0x6792 }, + { 0xCCD7, 0x6776 }, + { 0xCCD8, 0x677B }, + { 0xCCD9, 0x6798 }, + { 0xCCDA, 0x6786 }, + { 0xCCDB, 0x6784 }, + { 0xCCDC, 0x6774 }, + { 0xCCDD, 0x678D }, + { 0xCCDE, 0x678C }, + { 0xCCDF, 0x677A }, + { 0xCCE0, 0x679F }, + { 0xCCE1, 0x6791 }, + { 0xCCE2, 0x6799 }, + { 0xCCE3, 0x6783 }, + { 0xCCE4, 0x677D }, + { 0xCCE5, 0x6781 }, + { 0xCCE6, 0x6778 }, + { 0xCCE7, 0x6779 }, + { 0xCCE8, 0x6794 }, + { 0xCCE9, 0x6B25 }, + { 0xCCEA, 0x6B80 }, + { 0xCCEB, 0x6B7E }, + { 0xCCEC, 0x6BDE }, + { 0xCCED, 0x6C1D }, + { 0xCCEE, 0x6C93 }, + { 0xCCEF, 0x6CEC }, + { 0xCCF0, 0x6CEB }, + { 0xCCF1, 0x6CEE }, + { 0xCCF2, 0x6CD9 }, + { 0xCCF3, 0x6CB6 }, + { 0xCCF4, 0x6CD4 }, + { 0xCCF5, 0x6CAD }, + { 0xCCF6, 0x6CE7 }, + { 0xCCF7, 0x6CB7 }, + { 0xCCF8, 0x6CD0 }, + { 0xCCF9, 0x6CC2 }, + { 0xCCFA, 0x6CBA }, + { 0xCCFB, 0x6CC3 }, + { 0xCCFC, 0x6CC6 }, + { 0xCCFD, 0x6CED }, + { 0xCCFE, 0x6CF2 }, + { 0xCD40, 0x6CD2 }, + { 0xCD41, 0x6CDD }, + { 0xCD42, 0x6CB4 }, + { 0xCD43, 0x6C8A }, + { 0xCD44, 0x6C9D }, + { 0xCD45, 0x6C80 }, + { 0xCD46, 0x6CDE }, + { 0xCD47, 0x6CC0 }, + { 0xCD48, 0x6D30 }, + { 0xCD49, 0x6CCD }, + { 0xCD4A, 0x6CC7 }, + { 0xCD4B, 0x6CB0 }, + { 0xCD4C, 0x6CF9 }, + { 0xCD4D, 0x6CCF }, + { 0xCD4E, 0x6CE9 }, + { 0xCD4F, 0x6CD1 }, + { 0xCD50, 0x7094 }, + { 0xCD51, 0x7098 }, + { 0xCD52, 0x7085 }, + { 0xCD53, 0x7093 }, + { 0xCD54, 0x7086 }, + { 0xCD55, 0x7084 }, + { 0xCD56, 0x7091 }, + { 0xCD57, 0x7096 }, + { 0xCD58, 0x7082 }, + { 0xCD59, 0x709A }, + { 0xCD5A, 0x7083 }, + { 0xCD5B, 0x726A }, + { 0xCD5C, 0x72D6 }, + { 0xCD5D, 0x72CB }, + { 0xCD5E, 0x72D8 }, + { 0xCD5F, 0x72C9 }, + { 0xCD60, 0x72DC }, + { 0xCD61, 0x72D2 }, + { 0xCD62, 0x72D4 }, + { 0xCD63, 0x72DA }, + { 0xCD64, 0x72CC }, + { 0xCD65, 0x72D1 }, + { 0xCD66, 0x73A4 }, + { 0xCD67, 0x73A1 }, + { 0xCD68, 0x73AD }, + { 0xCD69, 0x73A6 }, + { 0xCD6A, 0x73A2 }, + { 0xCD6B, 0x73A0 }, + { 0xCD6C, 0x73AC }, + { 0xCD6D, 0x739D }, + { 0xCD6E, 0x74DD }, + { 0xCD6F, 0x74E8 }, + { 0xCD70, 0x753F }, + { 0xCD71, 0x7540 }, + { 0xCD72, 0x753E }, + { 0xCD73, 0x758C }, + { 0xCD74, 0x7598 }, + { 0xCD75, 0x76AF }, + { 0xCD76, 0x76F3 }, + { 0xCD77, 0x76F1 }, + { 0xCD78, 0x76F0 }, + { 0xCD79, 0x76F5 }, + { 0xCD7A, 0x77F8 }, + { 0xCD7B, 0x77FC }, + { 0xCD7C, 0x77F9 }, + { 0xCD7D, 0x77FB }, + { 0xCD7E, 0x77FA }, + { 0xCDA1, 0x77F7 }, + { 0xCDA2, 0x7942 }, + { 0xCDA3, 0x793F }, + { 0xCDA4, 0x79C5 }, + { 0xCDA5, 0x7A78 }, + { 0xCDA6, 0x7A7B }, + { 0xCDA7, 0x7AFB }, + { 0xCDA8, 0x7C75 }, + { 0xCDA9, 0x7CFD }, + { 0xCDAA, 0x8035 }, + { 0xCDAB, 0x808F }, + { 0xCDAC, 0x80AE }, + { 0xCDAD, 0x80A3 }, + { 0xCDAE, 0x80B8 }, + { 0xCDAF, 0x80B5 }, + { 0xCDB0, 0x80AD }, + { 0xCDB1, 0x8220 }, + { 0xCDB2, 0x82A0 }, + { 0xCDB3, 0x82C0 }, + { 0xCDB4, 0x82AB }, + { 0xCDB5, 0x829A }, + { 0xCDB6, 0x8298 }, + { 0xCDB7, 0x829B }, + { 0xCDB8, 0x82B5 }, + { 0xCDB9, 0x82A7 }, + { 0xCDBA, 0x82AE }, + { 0xCDBB, 0x82BC }, + { 0xCDBC, 0x829E }, + { 0xCDBD, 0x82BA }, + { 0xCDBE, 0x82B4 }, + { 0xCDBF, 0x82A8 }, + { 0xCDC0, 0x82A1 }, + { 0xCDC1, 0x82A9 }, + { 0xCDC2, 0x82C2 }, + { 0xCDC3, 0x82A4 }, + { 0xCDC4, 0x82C3 }, + { 0xCDC5, 0x82B6 }, + { 0xCDC6, 0x82A2 }, + { 0xCDC7, 0x8670 }, + { 0xCDC8, 0x866F }, + { 0xCDC9, 0x866D }, + { 0xCDCA, 0x866E }, + { 0xCDCB, 0x8C56 }, + { 0xCDCC, 0x8FD2 }, + { 0xCDCD, 0x8FCB }, + { 0xCDCE, 0x8FD3 }, + { 0xCDCF, 0x8FCD }, + { 0xCDD0, 0x8FD6 }, + { 0xCDD1, 0x8FD5 }, + { 0xCDD2, 0x8FD7 }, + { 0xCDD3, 0x90B2 }, + { 0xCDD4, 0x90B4 }, + { 0xCDD5, 0x90AF }, + { 0xCDD6, 0x90B3 }, + { 0xCDD7, 0x90B0 }, + { 0xCDD8, 0x9639 }, + { 0xCDD9, 0x963D }, + { 0xCDDA, 0x963C }, + { 0xCDDB, 0x963A }, + { 0xCDDC, 0x9643 }, + { 0xCDDD, 0x4FCD }, + { 0xCDDE, 0x4FC5 }, + { 0xCDDF, 0x4FD3 }, + { 0xCDE0, 0x4FB2 }, + { 0xCDE1, 0x4FC9 }, + { 0xCDE2, 0x4FCB }, + { 0xCDE3, 0x4FC1 }, + { 0xCDE4, 0x4FD4 }, + { 0xCDE5, 0x4FDC }, + { 0xCDE6, 0x4FD9 }, + { 0xCDE7, 0x4FBB }, + { 0xCDE8, 0x4FB3 }, + { 0xCDE9, 0x4FDB }, + { 0xCDEA, 0x4FC7 }, + { 0xCDEB, 0x4FD6 }, + { 0xCDEC, 0x4FBA }, + { 0xCDED, 0x4FC0 }, + { 0xCDEE, 0x4FB9 }, + { 0xCDEF, 0x4FEC }, + { 0xCDF0, 0x5244 }, + { 0xCDF1, 0x5249 }, + { 0xCDF2, 0x52C0 }, + { 0xCDF3, 0x52C2 }, + { 0xCDF4, 0x533D }, + { 0xCDF5, 0x537C }, + { 0xCDF6, 0x5397 }, + { 0xCDF7, 0x5396 }, + { 0xCDF8, 0x5399 }, + { 0xCDF9, 0x5398 }, + { 0xCDFA, 0x54BA }, + { 0xCDFB, 0x54A1 }, + { 0xCDFC, 0x54AD }, + { 0xCDFD, 0x54A5 }, + { 0xCDFE, 0x54CF }, + { 0xCE40, 0x54C3 }, + { 0xCE41, 0x830D }, + { 0xCE42, 0x54B7 }, + { 0xCE43, 0x54AE }, + { 0xCE44, 0x54D6 }, + { 0xCE45, 0x54B6 }, + { 0xCE46, 0x54C5 }, + { 0xCE47, 0x54C6 }, + { 0xCE48, 0x54A0 }, + { 0xCE49, 0x5470 }, + { 0xCE4A, 0x54BC }, + { 0xCE4B, 0x54A2 }, + { 0xCE4C, 0x54BE }, + { 0xCE4D, 0x5472 }, + { 0xCE4E, 0x54DE }, + { 0xCE4F, 0x54B0 }, + { 0xCE50, 0x57B5 }, + { 0xCE51, 0x579E }, + { 0xCE52, 0x579F }, + { 0xCE53, 0x57A4 }, + { 0xCE54, 0x578C }, + { 0xCE55, 0x5797 }, + { 0xCE56, 0x579D }, + { 0xCE57, 0x579B }, + { 0xCE58, 0x5794 }, + { 0xCE59, 0x5798 }, + { 0xCE5A, 0x578F }, + { 0xCE5B, 0x5799 }, + { 0xCE5C, 0x57A5 }, + { 0xCE5D, 0x579A }, + { 0xCE5E, 0x5795 }, + { 0xCE5F, 0x58F4 }, + { 0xCE60, 0x590D }, + { 0xCE61, 0x5953 }, + { 0xCE62, 0x59E1 }, + { 0xCE63, 0x59DE }, + { 0xCE64, 0x59EE }, + { 0xCE65, 0x5A00 }, + { 0xCE66, 0x59F1 }, + { 0xCE67, 0x59DD }, + { 0xCE68, 0x59FA }, + { 0xCE69, 0x59FD }, + { 0xCE6A, 0x59FC }, + { 0xCE6B, 0x59F6 }, + { 0xCE6C, 0x59E4 }, + { 0xCE6D, 0x59F2 }, + { 0xCE6E, 0x59F7 }, + { 0xCE6F, 0x59DB }, + { 0xCE70, 0x59E9 }, + { 0xCE71, 0x59F3 }, + { 0xCE72, 0x59F5 }, + { 0xCE73, 0x59E0 }, + { 0xCE74, 0x59FE }, + { 0xCE75, 0x59F4 }, + { 0xCE76, 0x59ED }, + { 0xCE77, 0x5BA8 }, + { 0xCE78, 0x5C4C }, + { 0xCE79, 0x5CD0 }, + { 0xCE7A, 0x5CD8 }, + { 0xCE7B, 0x5CCC }, + { 0xCE7C, 0x5CD7 }, + { 0xCE7D, 0x5CCB }, + { 0xCE7E, 0x5CDB }, + { 0xCEA1, 0x5CDE }, + { 0xCEA2, 0x5CDA }, + { 0xCEA3, 0x5CC9 }, + { 0xCEA4, 0x5CC7 }, + { 0xCEA5, 0x5CCA }, + { 0xCEA6, 0x5CD6 }, + { 0xCEA7, 0x5CD3 }, + { 0xCEA8, 0x5CD4 }, + { 0xCEA9, 0x5CCF }, + { 0xCEAA, 0x5CC8 }, + { 0xCEAB, 0x5CC6 }, + { 0xCEAC, 0x5CCE }, + { 0xCEAD, 0x5CDF }, + { 0xCEAE, 0x5CF8 }, + { 0xCEAF, 0x5DF9 }, + { 0xCEB0, 0x5E21 }, + { 0xCEB1, 0x5E22 }, + { 0xCEB2, 0x5E23 }, + { 0xCEB3, 0x5E20 }, + { 0xCEB4, 0x5E24 }, + { 0xCEB5, 0x5EB0 }, + { 0xCEB6, 0x5EA4 }, + { 0xCEB7, 0x5EA2 }, + { 0xCEB8, 0x5E9B }, + { 0xCEB9, 0x5EA3 }, + { 0xCEBA, 0x5EA5 }, + { 0xCEBB, 0x5F07 }, + { 0xCEBC, 0x5F2E }, + { 0xCEBD, 0x5F56 }, + { 0xCEBE, 0x5F86 }, + { 0xCEBF, 0x6037 }, + { 0xCEC0, 0x6039 }, + { 0xCEC1, 0x6054 }, + { 0xCEC2, 0x6072 }, + { 0xCEC3, 0x605E }, + { 0xCEC4, 0x6045 }, + { 0xCEC5, 0x6053 }, + { 0xCEC6, 0x6047 }, + { 0xCEC7, 0x6049 }, + { 0xCEC8, 0x605B }, + { 0xCEC9, 0x604C }, + { 0xCECA, 0x6040 }, + { 0xCECB, 0x6042 }, + { 0xCECC, 0x605F }, + { 0xCECD, 0x6024 }, + { 0xCECE, 0x6044 }, + { 0xCECF, 0x6058 }, + { 0xCED0, 0x6066 }, + { 0xCED1, 0x606E }, + { 0xCED2, 0x6242 }, + { 0xCED3, 0x6243 }, + { 0xCED4, 0x62CF }, + { 0xCED5, 0x630D }, + { 0xCED6, 0x630B }, + { 0xCED7, 0x62F5 }, + { 0xCED8, 0x630E }, + { 0xCED9, 0x6303 }, + { 0xCEDA, 0x62EB }, + { 0xCEDB, 0x62F9 }, + { 0xCEDC, 0x630F }, + { 0xCEDD, 0x630C }, + { 0xCEDE, 0x62F8 }, + { 0xCEDF, 0x62F6 }, + { 0xCEE0, 0x6300 }, + { 0xCEE1, 0x6313 }, + { 0xCEE2, 0x6314 }, + { 0xCEE3, 0x62FA }, + { 0xCEE4, 0x6315 }, + { 0xCEE5, 0x62FB }, + { 0xCEE6, 0x62F0 }, + { 0xCEE7, 0x6541 }, + { 0xCEE8, 0x6543 }, + { 0xCEE9, 0x65AA }, + { 0xCEEA, 0x65BF }, + { 0xCEEB, 0x6636 }, + { 0xCEEC, 0x6621 }, + { 0xCEED, 0x6632 }, + { 0xCEEE, 0x6635 }, + { 0xCEEF, 0x661C }, + { 0xCEF0, 0x6626 }, + { 0xCEF1, 0x6622 }, + { 0xCEF2, 0x6633 }, + { 0xCEF3, 0x662B }, + { 0xCEF4, 0x663A }, + { 0xCEF5, 0x661D }, + { 0xCEF6, 0x6634 }, + { 0xCEF7, 0x6639 }, + { 0xCEF8, 0x662E }, + { 0xCEF9, 0x670F }, + { 0xCEFA, 0x6710 }, + { 0xCEFB, 0x67C1 }, + { 0xCEFC, 0x67F2 }, + { 0xCEFD, 0x67C8 }, + { 0xCEFE, 0x67BA }, + { 0xCF40, 0x67DC }, + { 0xCF41, 0x67BB }, + { 0xCF42, 0x67F8 }, + { 0xCF43, 0x67D8 }, + { 0xCF44, 0x67C0 }, + { 0xCF45, 0x67B7 }, + { 0xCF46, 0x67C5 }, + { 0xCF47, 0x67EB }, + { 0xCF48, 0x67E4 }, + { 0xCF49, 0x67DF }, + { 0xCF4A, 0x67B5 }, + { 0xCF4B, 0x67CD }, + { 0xCF4C, 0x67B3 }, + { 0xCF4D, 0x67F7 }, + { 0xCF4E, 0x67F6 }, + { 0xCF4F, 0x67EE }, + { 0xCF50, 0x67E3 }, + { 0xCF51, 0x67C2 }, + { 0xCF52, 0x67B9 }, + { 0xCF53, 0x67CE }, + { 0xCF54, 0x67E7 }, + { 0xCF55, 0x67F0 }, + { 0xCF56, 0x67B2 }, + { 0xCF57, 0x67FC }, + { 0xCF58, 0x67C6 }, + { 0xCF59, 0x67ED }, + { 0xCF5A, 0x67CC }, + { 0xCF5B, 0x67AE }, + { 0xCF5C, 0x67E6 }, + { 0xCF5D, 0x67DB }, + { 0xCF5E, 0x67FA }, + { 0xCF5F, 0x67C9 }, + { 0xCF60, 0x67CA }, + { 0xCF61, 0x67C3 }, + { 0xCF62, 0x67EA }, + { 0xCF63, 0x67CB }, + { 0xCF64, 0x6B28 }, + { 0xCF65, 0x6B82 }, + { 0xCF66, 0x6B84 }, + { 0xCF67, 0x6BB6 }, + { 0xCF68, 0x6BD6 }, + { 0xCF69, 0x6BD8 }, + { 0xCF6A, 0x6BE0 }, + { 0xCF6B, 0x6C20 }, + { 0xCF6C, 0x6C21 }, + { 0xCF6D, 0x6D28 }, + { 0xCF6E, 0x6D34 }, + { 0xCF6F, 0x6D2D }, + { 0xCF70, 0x6D1F }, + { 0xCF71, 0x6D3C }, + { 0xCF72, 0x6D3F }, + { 0xCF73, 0x6D12 }, + { 0xCF74, 0x6D0A }, + { 0xCF75, 0x6CDA }, + { 0xCF76, 0x6D33 }, + { 0xCF77, 0x6D04 }, + { 0xCF78, 0x6D19 }, + { 0xCF79, 0x6D3A }, + { 0xCF7A, 0x6D1A }, + { 0xCF7B, 0x6D11 }, + { 0xCF7C, 0x6D00 }, + { 0xCF7D, 0x6D1D }, + { 0xCF7E, 0x6D42 }, + { 0xCFA1, 0x6D01 }, + { 0xCFA2, 0x6D18 }, + { 0xCFA3, 0x6D37 }, + { 0xCFA4, 0x6D03 }, + { 0xCFA5, 0x6D0F }, + { 0xCFA6, 0x6D40 }, + { 0xCFA7, 0x6D07 }, + { 0xCFA8, 0x6D20 }, + { 0xCFA9, 0x6D2C }, + { 0xCFAA, 0x6D08 }, + { 0xCFAB, 0x6D22 }, + { 0xCFAC, 0x6D09 }, + { 0xCFAD, 0x6D10 }, + { 0xCFAE, 0x70B7 }, + { 0xCFAF, 0x709F }, + { 0xCFB0, 0x70BE }, + { 0xCFB1, 0x70B1 }, + { 0xCFB2, 0x70B0 }, + { 0xCFB3, 0x70A1 }, + { 0xCFB4, 0x70B4 }, + { 0xCFB5, 0x70B5 }, + { 0xCFB6, 0x70A9 }, + { 0xCFB7, 0x7241 }, + { 0xCFB8, 0x7249 }, + { 0xCFB9, 0x724A }, + { 0xCFBA, 0x726C }, + { 0xCFBB, 0x7270 }, + { 0xCFBC, 0x7273 }, + { 0xCFBD, 0x726E }, + { 0xCFBE, 0x72CA }, + { 0xCFBF, 0x72E4 }, + { 0xCFC0, 0x72E8 }, + { 0xCFC1, 0x72EB }, + { 0xCFC2, 0x72DF }, + { 0xCFC3, 0x72EA }, + { 0xCFC4, 0x72E6 }, + { 0xCFC5, 0x72E3 }, + { 0xCFC6, 0x7385 }, + { 0xCFC7, 0x73CC }, + { 0xCFC8, 0x73C2 }, + { 0xCFC9, 0x73C8 }, + { 0xCFCA, 0x73C5 }, + { 0xCFCB, 0x73B9 }, + { 0xCFCC, 0x73B6 }, + { 0xCFCD, 0x73B5 }, + { 0xCFCE, 0x73B4 }, + { 0xCFCF, 0x73EB }, + { 0xCFD0, 0x73BF }, + { 0xCFD1, 0x73C7 }, + { 0xCFD2, 0x73BE }, + { 0xCFD3, 0x73C3 }, + { 0xCFD4, 0x73C6 }, + { 0xCFD5, 0x73B8 }, + { 0xCFD6, 0x73CB }, + { 0xCFD7, 0x74EC }, + { 0xCFD8, 0x74EE }, + { 0xCFD9, 0x752E }, + { 0xCFDA, 0x7547 }, + { 0xCFDB, 0x7548 }, + { 0xCFDC, 0x75A7 }, + { 0xCFDD, 0x75AA }, + { 0xCFDE, 0x7679 }, + { 0xCFDF, 0x76C4 }, + { 0xCFE0, 0x7708 }, + { 0xCFE1, 0x7703 }, + { 0xCFE2, 0x7704 }, + { 0xCFE3, 0x7705 }, + { 0xCFE4, 0x770A }, + { 0xCFE5, 0x76F7 }, + { 0xCFE6, 0x76FB }, + { 0xCFE7, 0x76FA }, + { 0xCFE8, 0x77E7 }, + { 0xCFE9, 0x77E8 }, + { 0xCFEA, 0x7806 }, + { 0xCFEB, 0x7811 }, + { 0xCFEC, 0x7812 }, + { 0xCFED, 0x7805 }, + { 0xCFEE, 0x7810 }, + { 0xCFEF, 0x780F }, + { 0xCFF0, 0x780E }, + { 0xCFF1, 0x7809 }, + { 0xCFF2, 0x7803 }, + { 0xCFF3, 0x7813 }, + { 0xCFF4, 0x794A }, + { 0xCFF5, 0x794C }, + { 0xCFF6, 0x794B }, + { 0xCFF7, 0x7945 }, + { 0xCFF8, 0x7944 }, + { 0xCFF9, 0x79D5 }, + { 0xCFFA, 0x79CD }, + { 0xCFFB, 0x79CF }, + { 0xCFFC, 0x79D6 }, + { 0xCFFD, 0x79CE }, + { 0xCFFE, 0x7A80 }, + { 0xD040, 0x7A7E }, + { 0xD041, 0x7AD1 }, + { 0xD042, 0x7B00 }, + { 0xD043, 0x7B01 }, + { 0xD044, 0x7C7A }, + { 0xD045, 0x7C78 }, + { 0xD046, 0x7C79 }, + { 0xD047, 0x7C7F }, + { 0xD048, 0x7C80 }, + { 0xD049, 0x7C81 }, + { 0xD04A, 0x7D03 }, + { 0xD04B, 0x7D08 }, + { 0xD04C, 0x7D01 }, + { 0xD04D, 0x7F58 }, + { 0xD04E, 0x7F91 }, + { 0xD04F, 0x7F8D }, + { 0xD050, 0x7FBE }, + { 0xD051, 0x8007 }, + { 0xD052, 0x800E }, + { 0xD053, 0x800F }, + { 0xD054, 0x8014 }, + { 0xD055, 0x8037 }, + { 0xD056, 0x80D8 }, + { 0xD057, 0x80C7 }, + { 0xD058, 0x80E0 }, + { 0xD059, 0x80D1 }, + { 0xD05A, 0x80C8 }, + { 0xD05B, 0x80C2 }, + { 0xD05C, 0x80D0 }, + { 0xD05D, 0x80C5 }, + { 0xD05E, 0x80E3 }, + { 0xD05F, 0x80D9 }, + { 0xD060, 0x80DC }, + { 0xD061, 0x80CA }, + { 0xD062, 0x80D5 }, + { 0xD063, 0x80C9 }, + { 0xD064, 0x80CF }, + { 0xD065, 0x80D7 }, + { 0xD066, 0x80E6 }, + { 0xD067, 0x80CD }, + { 0xD068, 0x81FF }, + { 0xD069, 0x8221 }, + { 0xD06A, 0x8294 }, + { 0xD06B, 0x82D9 }, + { 0xD06C, 0x82FE }, + { 0xD06D, 0x82F9 }, + { 0xD06E, 0x8307 }, + { 0xD06F, 0x82E8 }, + { 0xD070, 0x8300 }, + { 0xD071, 0x82D5 }, + { 0xD072, 0x833A }, + { 0xD073, 0x82EB }, + { 0xD074, 0x82D6 }, + { 0xD075, 0x82F4 }, + { 0xD076, 0x82EC }, + { 0xD077, 0x82E1 }, + { 0xD078, 0x82F2 }, + { 0xD079, 0x82F5 }, + { 0xD07A, 0x830C }, + { 0xD07B, 0x82FB }, + { 0xD07C, 0x82F6 }, + { 0xD07D, 0x82F0 }, + { 0xD07E, 0x82EA }, + { 0xD0A1, 0x82E4 }, + { 0xD0A2, 0x82E0 }, + { 0xD0A3, 0x82FA }, + { 0xD0A4, 0x82F3 }, + { 0xD0A5, 0x82ED }, + { 0xD0A6, 0x8677 }, + { 0xD0A7, 0x8674 }, + { 0xD0A8, 0x867C }, + { 0xD0A9, 0x8673 }, + { 0xD0AA, 0x8841 }, + { 0xD0AB, 0x884E }, + { 0xD0AC, 0x8867 }, + { 0xD0AD, 0x886A }, + { 0xD0AE, 0x8869 }, + { 0xD0AF, 0x89D3 }, + { 0xD0B0, 0x8A04 }, + { 0xD0B1, 0x8A07 }, + { 0xD0B2, 0x8D72 }, + { 0xD0B3, 0x8FE3 }, + { 0xD0B4, 0x8FE1 }, + { 0xD0B5, 0x8FEE }, + { 0xD0B6, 0x8FE0 }, + { 0xD0B7, 0x90F1 }, + { 0xD0B8, 0x90BD }, + { 0xD0B9, 0x90BF }, + { 0xD0BA, 0x90D5 }, + { 0xD0BB, 0x90C5 }, + { 0xD0BC, 0x90BE }, + { 0xD0BD, 0x90C7 }, + { 0xD0BE, 0x90CB }, + { 0xD0BF, 0x90C8 }, + { 0xD0C0, 0x91D4 }, + { 0xD0C1, 0x91D3 }, + { 0xD0C2, 0x9654 }, + { 0xD0C3, 0x964F }, + { 0xD0C4, 0x9651 }, + { 0xD0C5, 0x9653 }, + { 0xD0C6, 0x964A }, + { 0xD0C7, 0x964E }, + { 0xD0C8, 0x501E }, + { 0xD0C9, 0x5005 }, + { 0xD0CA, 0x5007 }, + { 0xD0CB, 0x5013 }, + { 0xD0CC, 0x5022 }, + { 0xD0CD, 0x5030 }, + { 0xD0CE, 0x501B }, + { 0xD0CF, 0x4FF5 }, + { 0xD0D0, 0x4FF4 }, + { 0xD0D1, 0x5033 }, + { 0xD0D2, 0x5037 }, + { 0xD0D3, 0x502C }, + { 0xD0D4, 0x4FF6 }, + { 0xD0D5, 0x4FF7 }, + { 0xD0D6, 0x5017 }, + { 0xD0D7, 0x501C }, + { 0xD0D8, 0x5020 }, + { 0xD0D9, 0x5027 }, + { 0xD0DA, 0x5035 }, + { 0xD0DB, 0x502F }, + { 0xD0DC, 0x5031 }, + { 0xD0DD, 0x500E }, + { 0xD0DE, 0x515A }, + { 0xD0DF, 0x5194 }, + { 0xD0E0, 0x5193 }, + { 0xD0E1, 0x51CA }, + { 0xD0E2, 0x51C4 }, + { 0xD0E3, 0x51C5 }, + { 0xD0E4, 0x51C8 }, + { 0xD0E5, 0x51CE }, + { 0xD0E6, 0x5261 }, + { 0xD0E7, 0x525A }, + { 0xD0E8, 0x5252 }, + { 0xD0E9, 0x525E }, + { 0xD0EA, 0x525F }, + { 0xD0EB, 0x5255 }, + { 0xD0EC, 0x5262 }, + { 0xD0ED, 0x52CD }, + { 0xD0EE, 0x530E }, + { 0xD0EF, 0x539E }, + { 0xD0F0, 0x5526 }, + { 0xD0F1, 0x54E2 }, + { 0xD0F2, 0x5517 }, + { 0xD0F3, 0x5512 }, + { 0xD0F4, 0x54E7 }, + { 0xD0F5, 0x54F3 }, + { 0xD0F6, 0x54E4 }, + { 0xD0F7, 0x551A }, + { 0xD0F8, 0x54FF }, + { 0xD0F9, 0x5504 }, + { 0xD0FA, 0x5508 }, + { 0xD0FB, 0x54EB }, + { 0xD0FC, 0x5511 }, + { 0xD0FD, 0x5505 }, + { 0xD0FE, 0x54F1 }, + { 0xD140, 0x550A }, + { 0xD141, 0x54FB }, + { 0xD142, 0x54F7 }, + { 0xD143, 0x54F8 }, + { 0xD144, 0x54E0 }, + { 0xD145, 0x550E }, + { 0xD146, 0x5503 }, + { 0xD147, 0x550B }, + { 0xD148, 0x5701 }, + { 0xD149, 0x5702 }, + { 0xD14A, 0x57CC }, + { 0xD14B, 0x5832 }, + { 0xD14C, 0x57D5 }, + { 0xD14D, 0x57D2 }, + { 0xD14E, 0x57BA }, + { 0xD14F, 0x57C6 }, + { 0xD150, 0x57BD }, + { 0xD151, 0x57BC }, + { 0xD152, 0x57B8 }, + { 0xD153, 0x57B6 }, + { 0xD154, 0x57BF }, + { 0xD155, 0x57C7 }, + { 0xD156, 0x57D0 }, + { 0xD157, 0x57B9 }, + { 0xD158, 0x57C1 }, + { 0xD159, 0x590E }, + { 0xD15A, 0x594A }, + { 0xD15B, 0x5A19 }, + { 0xD15C, 0x5A16 }, + { 0xD15D, 0x5A2D }, + { 0xD15E, 0x5A2E }, + { 0xD15F, 0x5A15 }, + { 0xD160, 0x5A0F }, + { 0xD161, 0x5A17 }, + { 0xD162, 0x5A0A }, + { 0xD163, 0x5A1E }, + { 0xD164, 0x5A33 }, + { 0xD165, 0x5B6C }, + { 0xD166, 0x5BA7 }, + { 0xD167, 0x5BAD }, + { 0xD168, 0x5BAC }, + { 0xD169, 0x5C03 }, + { 0xD16A, 0x5C56 }, + { 0xD16B, 0x5C54 }, + { 0xD16C, 0x5CEC }, + { 0xD16D, 0x5CFF }, + { 0xD16E, 0x5CEE }, + { 0xD16F, 0x5CF1 }, + { 0xD170, 0x5CF7 }, + { 0xD171, 0x5D00 }, + { 0xD172, 0x5CF9 }, + { 0xD173, 0x5E29 }, + { 0xD174, 0x5E28 }, + { 0xD175, 0x5EA8 }, + { 0xD176, 0x5EAE }, + { 0xD177, 0x5EAA }, + { 0xD178, 0x5EAC }, + { 0xD179, 0x5F33 }, + { 0xD17A, 0x5F30 }, + { 0xD17B, 0x5F67 }, + { 0xD17C, 0x605D }, + { 0xD17D, 0x605A }, + { 0xD17E, 0x6067 }, + { 0xD1A1, 0x6041 }, + { 0xD1A2, 0x60A2 }, + { 0xD1A3, 0x6088 }, + { 0xD1A4, 0x6080 }, + { 0xD1A5, 0x6092 }, + { 0xD1A6, 0x6081 }, + { 0xD1A7, 0x609D }, + { 0xD1A8, 0x6083 }, + { 0xD1A9, 0x6095 }, + { 0xD1AA, 0x609B }, + { 0xD1AB, 0x6097 }, + { 0xD1AC, 0x6087 }, + { 0xD1AD, 0x609C }, + { 0xD1AE, 0x608E }, + { 0xD1AF, 0x6219 }, + { 0xD1B0, 0x6246 }, + { 0xD1B1, 0x62F2 }, + { 0xD1B2, 0x6310 }, + { 0xD1B3, 0x6356 }, + { 0xD1B4, 0x632C }, + { 0xD1B5, 0x6344 }, + { 0xD1B6, 0x6345 }, + { 0xD1B7, 0x6336 }, + { 0xD1B8, 0x6343 }, + { 0xD1B9, 0x63E4 }, + { 0xD1BA, 0x6339 }, + { 0xD1BB, 0x634B }, + { 0xD1BC, 0x634A }, + { 0xD1BD, 0x633C }, + { 0xD1BE, 0x6329 }, + { 0xD1BF, 0x6341 }, + { 0xD1C0, 0x6334 }, + { 0xD1C1, 0x6358 }, + { 0xD1C2, 0x6354 }, + { 0xD1C3, 0x6359 }, + { 0xD1C4, 0x632D }, + { 0xD1C5, 0x6347 }, + { 0xD1C6, 0x6333 }, + { 0xD1C7, 0x635A }, + { 0xD1C8, 0x6351 }, + { 0xD1C9, 0x6338 }, + { 0xD1CA, 0x6357 }, + { 0xD1CB, 0x6340 }, + { 0xD1CC, 0x6348 }, + { 0xD1CD, 0x654A }, + { 0xD1CE, 0x6546 }, + { 0xD1CF, 0x65C6 }, + { 0xD1D0, 0x65C3 }, + { 0xD1D1, 0x65C4 }, + { 0xD1D2, 0x65C2 }, + { 0xD1D3, 0x664A }, + { 0xD1D4, 0x665F }, + { 0xD1D5, 0x6647 }, + { 0xD1D6, 0x6651 }, + { 0xD1D7, 0x6712 }, + { 0xD1D8, 0x6713 }, + { 0xD1D9, 0x681F }, + { 0xD1DA, 0x681A }, + { 0xD1DB, 0x6849 }, + { 0xD1DC, 0x6832 }, + { 0xD1DD, 0x6833 }, + { 0xD1DE, 0x683B }, + { 0xD1DF, 0x684B }, + { 0xD1E0, 0x684F }, + { 0xD1E1, 0x6816 }, + { 0xD1E2, 0x6831 }, + { 0xD1E3, 0x681C }, + { 0xD1E4, 0x6835 }, + { 0xD1E5, 0x682B }, + { 0xD1E6, 0x682D }, + { 0xD1E7, 0x682F }, + { 0xD1E8, 0x684E }, + { 0xD1E9, 0x6844 }, + { 0xD1EA, 0x6834 }, + { 0xD1EB, 0x681D }, + { 0xD1EC, 0x6812 }, + { 0xD1ED, 0x6814 }, + { 0xD1EE, 0x6826 }, + { 0xD1EF, 0x6828 }, + { 0xD1F0, 0x682E }, + { 0xD1F1, 0x684D }, + { 0xD1F2, 0x683A }, + { 0xD1F3, 0x6825 }, + { 0xD1F4, 0x6820 }, + { 0xD1F5, 0x6B2C }, + { 0xD1F6, 0x6B2F }, + { 0xD1F7, 0x6B2D }, + { 0xD1F8, 0x6B31 }, + { 0xD1F9, 0x6B34 }, + { 0xD1FA, 0x6B6D }, + { 0xD1FB, 0x8082 }, + { 0xD1FC, 0x6B88 }, + { 0xD1FD, 0x6BE6 }, + { 0xD1FE, 0x6BE4 }, + { 0xD240, 0x6BE8 }, + { 0xD241, 0x6BE3 }, + { 0xD242, 0x6BE2 }, + { 0xD243, 0x6BE7 }, + { 0xD244, 0x6C25 }, + { 0xD245, 0x6D7A }, + { 0xD246, 0x6D63 }, + { 0xD247, 0x6D64 }, + { 0xD248, 0x6D76 }, + { 0xD249, 0x6D0D }, + { 0xD24A, 0x6D61 }, + { 0xD24B, 0x6D92 }, + { 0xD24C, 0x6D58 }, + { 0xD24D, 0x6D62 }, + { 0xD24E, 0x6D6D }, + { 0xD24F, 0x6D6F }, + { 0xD250, 0x6D91 }, + { 0xD251, 0x6D8D }, + { 0xD252, 0x6DEF }, + { 0xD253, 0x6D7F }, + { 0xD254, 0x6D86 }, + { 0xD255, 0x6D5E }, + { 0xD256, 0x6D67 }, + { 0xD257, 0x6D60 }, + { 0xD258, 0x6D97 }, + { 0xD259, 0x6D70 }, + { 0xD25A, 0x6D7C }, + { 0xD25B, 0x6D5F }, + { 0xD25C, 0x6D82 }, + { 0xD25D, 0x6D98 }, + { 0xD25E, 0x6D2F }, + { 0xD25F, 0x6D68 }, + { 0xD260, 0x6D8B }, + { 0xD261, 0x6D7E }, + { 0xD262, 0x6D80 }, + { 0xD263, 0x6D84 }, + { 0xD264, 0x6D16 }, + { 0xD265, 0x6D83 }, + { 0xD266, 0x6D7B }, + { 0xD267, 0x6D7D }, + { 0xD268, 0x6D75 }, + { 0xD269, 0x6D90 }, + { 0xD26A, 0x70DC }, + { 0xD26B, 0x70D3 }, + { 0xD26C, 0x70D1 }, + { 0xD26D, 0x70DD }, + { 0xD26E, 0x70CB }, + { 0xD26F, 0x7F39 }, + { 0xD270, 0x70E2 }, + { 0xD271, 0x70D7 }, + { 0xD272, 0x70D2 }, + { 0xD273, 0x70DE }, + { 0xD274, 0x70E0 }, + { 0xD275, 0x70D4 }, + { 0xD276, 0x70CD }, + { 0xD277, 0x70C5 }, + { 0xD278, 0x70C6 }, + { 0xD279, 0x70C7 }, + { 0xD27A, 0x70DA }, + { 0xD27B, 0x70CE }, + { 0xD27C, 0x70E1 }, + { 0xD27D, 0x7242 }, + { 0xD27E, 0x7278 }, + { 0xD2A1, 0x7277 }, + { 0xD2A2, 0x7276 }, + { 0xD2A3, 0x7300 }, + { 0xD2A4, 0x72FA }, + { 0xD2A5, 0x72F4 }, + { 0xD2A6, 0x72FE }, + { 0xD2A7, 0x72F6 }, + { 0xD2A8, 0x72F3 }, + { 0xD2A9, 0x72FB }, + { 0xD2AA, 0x7301 }, + { 0xD2AB, 0x73D3 }, + { 0xD2AC, 0x73D9 }, + { 0xD2AD, 0x73E5 }, + { 0xD2AE, 0x73D6 }, + { 0xD2AF, 0x73BC }, + { 0xD2B0, 0x73E7 }, + { 0xD2B1, 0x73E3 }, + { 0xD2B2, 0x73E9 }, + { 0xD2B3, 0x73DC }, + { 0xD2B4, 0x73D2 }, + { 0xD2B5, 0x73DB }, + { 0xD2B6, 0x73D4 }, + { 0xD2B7, 0x73DD }, + { 0xD2B8, 0x73DA }, + { 0xD2B9, 0x73D7 }, + { 0xD2BA, 0x73D8 }, + { 0xD2BB, 0x73E8 }, + { 0xD2BC, 0x74DE }, + { 0xD2BD, 0x74DF }, + { 0xD2BE, 0x74F4 }, + { 0xD2BF, 0x74F5 }, + { 0xD2C0, 0x7521 }, + { 0xD2C1, 0x755B }, + { 0xD2C2, 0x755F }, + { 0xD2C3, 0x75B0 }, + { 0xD2C4, 0x75C1 }, + { 0xD2C5, 0x75BB }, + { 0xD2C6, 0x75C4 }, + { 0xD2C7, 0x75C0 }, + { 0xD2C8, 0x75BF }, + { 0xD2C9, 0x75B6 }, + { 0xD2CA, 0x75BA }, + { 0xD2CB, 0x768A }, + { 0xD2CC, 0x76C9 }, + { 0xD2CD, 0x771D }, + { 0xD2CE, 0x771B }, + { 0xD2CF, 0x7710 }, + { 0xD2D0, 0x7713 }, + { 0xD2D1, 0x7712 }, + { 0xD2D2, 0x7723 }, + { 0xD2D3, 0x7711 }, + { 0xD2D4, 0x7715 }, + { 0xD2D5, 0x7719 }, + { 0xD2D6, 0x771A }, + { 0xD2D7, 0x7722 }, + { 0xD2D8, 0x7727 }, + { 0xD2D9, 0x7823 }, + { 0xD2DA, 0x782C }, + { 0xD2DB, 0x7822 }, + { 0xD2DC, 0x7835 }, + { 0xD2DD, 0x782F }, + { 0xD2DE, 0x7828 }, + { 0xD2DF, 0x782E }, + { 0xD2E0, 0x782B }, + { 0xD2E1, 0x7821 }, + { 0xD2E2, 0x7829 }, + { 0xD2E3, 0x7833 }, + { 0xD2E4, 0x782A }, + { 0xD2E5, 0x7831 }, + { 0xD2E6, 0x7954 }, + { 0xD2E7, 0x795B }, + { 0xD2E8, 0x794F }, + { 0xD2E9, 0x795C }, + { 0xD2EA, 0x7953 }, + { 0xD2EB, 0x7952 }, + { 0xD2EC, 0x7951 }, + { 0xD2ED, 0x79EB }, + { 0xD2EE, 0x79EC }, + { 0xD2EF, 0x79E0 }, + { 0xD2F0, 0x79EE }, + { 0xD2F1, 0x79ED }, + { 0xD2F2, 0x79EA }, + { 0xD2F3, 0x79DC }, + { 0xD2F4, 0x79DE }, + { 0xD2F5, 0x79DD }, + { 0xD2F6, 0x7A86 }, + { 0xD2F7, 0x7A89 }, + { 0xD2F8, 0x7A85 }, + { 0xD2F9, 0x7A8B }, + { 0xD2FA, 0x7A8C }, + { 0xD2FB, 0x7A8A }, + { 0xD2FC, 0x7A87 }, + { 0xD2FD, 0x7AD8 }, + { 0xD2FE, 0x7B10 }, + { 0xD340, 0x7B04 }, + { 0xD341, 0x7B13 }, + { 0xD342, 0x7B05 }, + { 0xD343, 0x7B0F }, + { 0xD344, 0x7B08 }, + { 0xD345, 0x7B0A }, + { 0xD346, 0x7B0E }, + { 0xD347, 0x7B09 }, + { 0xD348, 0x7B12 }, + { 0xD349, 0x7C84 }, + { 0xD34A, 0x7C91 }, + { 0xD34B, 0x7C8A }, + { 0xD34C, 0x7C8C }, + { 0xD34D, 0x7C88 }, + { 0xD34E, 0x7C8D }, + { 0xD34F, 0x7C85 }, + { 0xD350, 0x7D1E }, + { 0xD351, 0x7D1D }, + { 0xD352, 0x7D11 }, + { 0xD353, 0x7D0E }, + { 0xD354, 0x7D18 }, + { 0xD355, 0x7D16 }, + { 0xD356, 0x7D13 }, + { 0xD357, 0x7D1F }, + { 0xD358, 0x7D12 }, + { 0xD359, 0x7D0F }, + { 0xD35A, 0x7D0C }, + { 0xD35B, 0x7F5C }, + { 0xD35C, 0x7F61 }, + { 0xD35D, 0x7F5E }, + { 0xD35E, 0x7F60 }, + { 0xD35F, 0x7F5D }, + { 0xD360, 0x7F5B }, + { 0xD361, 0x7F96 }, + { 0xD362, 0x7F92 }, + { 0xD363, 0x7FC3 }, + { 0xD364, 0x7FC2 }, + { 0xD365, 0x7FC0 }, + { 0xD366, 0x8016 }, + { 0xD367, 0x803E }, + { 0xD368, 0x8039 }, + { 0xD369, 0x80FA }, + { 0xD36A, 0x80F2 }, + { 0xD36B, 0x80F9 }, + { 0xD36C, 0x80F5 }, + { 0xD36D, 0x8101 }, + { 0xD36E, 0x80FB }, + { 0xD36F, 0x8100 }, + { 0xD370, 0x8201 }, + { 0xD371, 0x822F }, + { 0xD372, 0x8225 }, + { 0xD373, 0x8333 }, + { 0xD374, 0x832D }, + { 0xD375, 0x8344 }, + { 0xD376, 0x8319 }, + { 0xD377, 0x8351 }, + { 0xD378, 0x8325 }, + { 0xD379, 0x8356 }, + { 0xD37A, 0x833F }, + { 0xD37B, 0x8341 }, + { 0xD37C, 0x8326 }, + { 0xD37D, 0x831C }, + { 0xD37E, 0x8322 }, + { 0xD3A1, 0x8342 }, + { 0xD3A2, 0x834E }, + { 0xD3A3, 0x831B }, + { 0xD3A4, 0x832A }, + { 0xD3A5, 0x8308 }, + { 0xD3A6, 0x833C }, + { 0xD3A7, 0x834D }, + { 0xD3A8, 0x8316 }, + { 0xD3A9, 0x8324 }, + { 0xD3AA, 0x8320 }, + { 0xD3AB, 0x8337 }, + { 0xD3AC, 0x832F }, + { 0xD3AD, 0x8329 }, + { 0xD3AE, 0x8347 }, + { 0xD3AF, 0x8345 }, + { 0xD3B0, 0x834C }, + { 0xD3B1, 0x8353 }, + { 0xD3B2, 0x831E }, + { 0xD3B3, 0x832C }, + { 0xD3B4, 0x834B }, + { 0xD3B5, 0x8327 }, + { 0xD3B6, 0x8348 }, + { 0xD3B7, 0x8653 }, + { 0xD3B8, 0x8652 }, + { 0xD3B9, 0x86A2 }, + { 0xD3BA, 0x86A8 }, + { 0xD3BB, 0x8696 }, + { 0xD3BC, 0x868D }, + { 0xD3BD, 0x8691 }, + { 0xD3BE, 0x869E }, + { 0xD3BF, 0x8687 }, + { 0xD3C0, 0x8697 }, + { 0xD3C1, 0x8686 }, + { 0xD3C2, 0x868B }, + { 0xD3C3, 0x869A }, + { 0xD3C4, 0x8685 }, + { 0xD3C5, 0x86A5 }, + { 0xD3C6, 0x8699 }, + { 0xD3C7, 0x86A1 }, + { 0xD3C8, 0x86A7 }, + { 0xD3C9, 0x8695 }, + { 0xD3CA, 0x8698 }, + { 0xD3CB, 0x868E }, + { 0xD3CC, 0x869D }, + { 0xD3CD, 0x8690 }, + { 0xD3CE, 0x8694 }, + { 0xD3CF, 0x8843 }, + { 0xD3D0, 0x8844 }, + { 0xD3D1, 0x886D }, + { 0xD3D2, 0x8875 }, + { 0xD3D3, 0x8876 }, + { 0xD3D4, 0x8872 }, + { 0xD3D5, 0x8880 }, + { 0xD3D6, 0x8871 }, + { 0xD3D7, 0x887F }, + { 0xD3D8, 0x886F }, + { 0xD3D9, 0x8883 }, + { 0xD3DA, 0x887E }, + { 0xD3DB, 0x8874 }, + { 0xD3DC, 0x887C }, + { 0xD3DD, 0x8A12 }, + { 0xD3DE, 0x8C47 }, + { 0xD3DF, 0x8C57 }, + { 0xD3E0, 0x8C7B }, + { 0xD3E1, 0x8CA4 }, + { 0xD3E2, 0x8CA3 }, + { 0xD3E3, 0x8D76 }, + { 0xD3E4, 0x8D78 }, + { 0xD3E5, 0x8DB5 }, + { 0xD3E6, 0x8DB7 }, + { 0xD3E7, 0x8DB6 }, + { 0xD3E8, 0x8ED1 }, + { 0xD3E9, 0x8ED3 }, + { 0xD3EA, 0x8FFE }, + { 0xD3EB, 0x8FF5 }, + { 0xD3EC, 0x9002 }, + { 0xD3ED, 0x8FFF }, + { 0xD3EE, 0x8FFB }, + { 0xD3EF, 0x9004 }, + { 0xD3F0, 0x8FFC }, + { 0xD3F1, 0x8FF6 }, + { 0xD3F2, 0x90D6 }, + { 0xD3F3, 0x90E0 }, + { 0xD3F4, 0x90D9 }, + { 0xD3F5, 0x90DA }, + { 0xD3F6, 0x90E3 }, + { 0xD3F7, 0x90DF }, + { 0xD3F8, 0x90E5 }, + { 0xD3F9, 0x90D8 }, + { 0xD3FA, 0x90DB }, + { 0xD3FB, 0x90D7 }, + { 0xD3FC, 0x90DC }, + { 0xD3FD, 0x90E4 }, + { 0xD3FE, 0x9150 }, + { 0xD440, 0x914E }, + { 0xD441, 0x914F }, + { 0xD442, 0x91D5 }, + { 0xD443, 0x91E2 }, + { 0xD444, 0x91DA }, + { 0xD445, 0x965C }, + { 0xD446, 0x965F }, + { 0xD447, 0x96BC }, + { 0xD448, 0x98E3 }, + { 0xD449, 0x9ADF }, + { 0xD44A, 0x9B2F }, + { 0xD44B, 0x4E7F }, + { 0xD44C, 0x5070 }, + { 0xD44D, 0x506A }, + { 0xD44E, 0x5061 }, + { 0xD44F, 0x505E }, + { 0xD450, 0x5060 }, + { 0xD451, 0x5053 }, + { 0xD452, 0x504B }, + { 0xD453, 0x505D }, + { 0xD454, 0x5072 }, + { 0xD455, 0x5048 }, + { 0xD456, 0x504D }, + { 0xD457, 0x5041 }, + { 0xD458, 0x505B }, + { 0xD459, 0x504A }, + { 0xD45A, 0x5062 }, + { 0xD45B, 0x5015 }, + { 0xD45C, 0x5045 }, + { 0xD45D, 0x505F }, + { 0xD45E, 0x5069 }, + { 0xD45F, 0x506B }, + { 0xD460, 0x5063 }, + { 0xD461, 0x5064 }, + { 0xD462, 0x5046 }, + { 0xD463, 0x5040 }, + { 0xD464, 0x506E }, + { 0xD465, 0x5073 }, + { 0xD466, 0x5057 }, + { 0xD467, 0x5051 }, + { 0xD468, 0x51D0 }, + { 0xD469, 0x526B }, + { 0xD46A, 0x526D }, + { 0xD46B, 0x526C }, + { 0xD46C, 0x526E }, + { 0xD46D, 0x52D6 }, + { 0xD46E, 0x52D3 }, + { 0xD46F, 0x532D }, + { 0xD470, 0x539C }, + { 0xD471, 0x5575 }, + { 0xD472, 0x5576 }, + { 0xD473, 0x553C }, + { 0xD474, 0x554D }, + { 0xD475, 0x5550 }, + { 0xD476, 0x5534 }, + { 0xD477, 0x552A }, + { 0xD478, 0x5551 }, + { 0xD479, 0x5562 }, + { 0xD47A, 0x5536 }, + { 0xD47B, 0x5535 }, + { 0xD47C, 0x5530 }, + { 0xD47D, 0x5552 }, + { 0xD47E, 0x5545 }, + { 0xD4A1, 0x550C }, + { 0xD4A2, 0x5532 }, + { 0xD4A3, 0x5565 }, + { 0xD4A4, 0x554E }, + { 0xD4A5, 0x5539 }, + { 0xD4A6, 0x5548 }, + { 0xD4A7, 0x552D }, + { 0xD4A8, 0x553B }, + { 0xD4A9, 0x5540 }, + { 0xD4AA, 0x554B }, + { 0xD4AB, 0x570A }, + { 0xD4AC, 0x5707 }, + { 0xD4AD, 0x57FB }, + { 0xD4AE, 0x5814 }, + { 0xD4AF, 0x57E2 }, + { 0xD4B0, 0x57F6 }, + { 0xD4B1, 0x57DC }, + { 0xD4B2, 0x57F4 }, + { 0xD4B3, 0x5800 }, + { 0xD4B4, 0x57ED }, + { 0xD4B5, 0x57FD }, + { 0xD4B6, 0x5808 }, + { 0xD4B7, 0x57F8 }, + { 0xD4B8, 0x580B }, + { 0xD4B9, 0x57F3 }, + { 0xD4BA, 0x57CF }, + { 0xD4BB, 0x5807 }, + { 0xD4BC, 0x57EE }, + { 0xD4BD, 0x57E3 }, + { 0xD4BE, 0x57F2 }, + { 0xD4BF, 0x57E5 }, + { 0xD4C0, 0x57EC }, + { 0xD4C1, 0x57E1 }, + { 0xD4C2, 0x580E }, + { 0xD4C3, 0x57FC }, + { 0xD4C4, 0x5810 }, + { 0xD4C5, 0x57E7 }, + { 0xD4C6, 0x5801 }, + { 0xD4C7, 0x580C }, + { 0xD4C8, 0x57F1 }, + { 0xD4C9, 0x57E9 }, + { 0xD4CA, 0x57F0 }, + { 0xD4CB, 0x580D }, + { 0xD4CC, 0x5804 }, + { 0xD4CD, 0x595C }, + { 0xD4CE, 0x5A60 }, + { 0xD4CF, 0x5A58 }, + { 0xD4D0, 0x5A55 }, + { 0xD4D1, 0x5A67 }, + { 0xD4D2, 0x5A5E }, + { 0xD4D3, 0x5A38 }, + { 0xD4D4, 0x5A35 }, + { 0xD4D5, 0x5A6D }, + { 0xD4D6, 0x5A50 }, + { 0xD4D7, 0x5A5F }, + { 0xD4D8, 0x5A65 }, + { 0xD4D9, 0x5A6C }, + { 0xD4DA, 0x5A53 }, + { 0xD4DB, 0x5A64 }, + { 0xD4DC, 0x5A57 }, + { 0xD4DD, 0x5A43 }, + { 0xD4DE, 0x5A5D }, + { 0xD4DF, 0x5A52 }, + { 0xD4E0, 0x5A44 }, + { 0xD4E1, 0x5A5B }, + { 0xD4E2, 0x5A48 }, + { 0xD4E3, 0x5A8E }, + { 0xD4E4, 0x5A3E }, + { 0xD4E5, 0x5A4D }, + { 0xD4E6, 0x5A39 }, + { 0xD4E7, 0x5A4C }, + { 0xD4E8, 0x5A70 }, + { 0xD4E9, 0x5A69 }, + { 0xD4EA, 0x5A47 }, + { 0xD4EB, 0x5A51 }, + { 0xD4EC, 0x5A56 }, + { 0xD4ED, 0x5A42 }, + { 0xD4EE, 0x5A5C }, + { 0xD4EF, 0x5B72 }, + { 0xD4F0, 0x5B6E }, + { 0xD4F1, 0x5BC1 }, + { 0xD4F2, 0x5BC0 }, + { 0xD4F3, 0x5C59 }, + { 0xD4F4, 0x5D1E }, + { 0xD4F5, 0x5D0B }, + { 0xD4F6, 0x5D1D }, + { 0xD4F7, 0x5D1A }, + { 0xD4F8, 0x5D20 }, + { 0xD4F9, 0x5D0C }, + { 0xD4FA, 0x5D28 }, + { 0xD4FB, 0x5D0D }, + { 0xD4FC, 0x5D26 }, + { 0xD4FD, 0x5D25 }, + { 0xD4FE, 0x5D0F }, + { 0xD540, 0x5D30 }, + { 0xD541, 0x5D12 }, + { 0xD542, 0x5D23 }, + { 0xD543, 0x5D1F }, + { 0xD544, 0x5D2E }, + { 0xD545, 0x5E3E }, + { 0xD546, 0x5E34 }, + { 0xD547, 0x5EB1 }, + { 0xD548, 0x5EB4 }, + { 0xD549, 0x5EB9 }, + { 0xD54A, 0x5EB2 }, + { 0xD54B, 0x5EB3 }, + { 0xD54C, 0x5F36 }, + { 0xD54D, 0x5F38 }, + { 0xD54E, 0x5F9B }, + { 0xD54F, 0x5F96 }, + { 0xD550, 0x5F9F }, + { 0xD551, 0x608A }, + { 0xD552, 0x6090 }, + { 0xD553, 0x6086 }, + { 0xD554, 0x60BE }, + { 0xD555, 0x60B0 }, + { 0xD556, 0x60BA }, + { 0xD557, 0x60D3 }, + { 0xD558, 0x60D4 }, + { 0xD559, 0x60CF }, + { 0xD55A, 0x60E4 }, + { 0xD55B, 0x60D9 }, + { 0xD55C, 0x60DD }, + { 0xD55D, 0x60C8 }, + { 0xD55E, 0x60B1 }, + { 0xD55F, 0x60DB }, + { 0xD560, 0x60B7 }, + { 0xD561, 0x60CA }, + { 0xD562, 0x60BF }, + { 0xD563, 0x60C3 }, + { 0xD564, 0x60CD }, + { 0xD565, 0x60C0 }, + { 0xD566, 0x6332 }, + { 0xD567, 0x6365 }, + { 0xD568, 0x638A }, + { 0xD569, 0x6382 }, + { 0xD56A, 0x637D }, + { 0xD56B, 0x63BD }, + { 0xD56C, 0x639E }, + { 0xD56D, 0x63AD }, + { 0xD56E, 0x639D }, + { 0xD56F, 0x6397 }, + { 0xD570, 0x63AB }, + { 0xD571, 0x638E }, + { 0xD572, 0x636F }, + { 0xD573, 0x6387 }, + { 0xD574, 0x6390 }, + { 0xD575, 0x636E }, + { 0xD576, 0x63AF }, + { 0xD577, 0x6375 }, + { 0xD578, 0x639C }, + { 0xD579, 0x636D }, + { 0xD57A, 0x63AE }, + { 0xD57B, 0x637C }, + { 0xD57C, 0x63A4 }, + { 0xD57D, 0x633B }, + + + { 0xD57E, 0x639F }, + { 0xD5A1, 0x6378 }, + { 0xD5A2, 0x6385 }, + { 0xD5A3, 0x6381 }, + { 0xD5A4, 0x6391 }, + { 0xD5A5, 0x638D }, + { 0xD5A6, 0x6370 }, + { 0xD5A7, 0x6553 }, + { 0xD5A8, 0x65CD }, + { 0xD5A9, 0x6665 }, + { 0xD5AA, 0x6661 }, + { 0xD5AB, 0x665B }, + { 0xD5AC, 0x6659 }, + { 0xD5AD, 0x665C }, + { 0xD5AE, 0x6662 }, + { 0xD5AF, 0x6718 }, + { 0xD5B0, 0x6879 }, + { 0xD5B1, 0x6887 }, + { 0xD5B2, 0x6890 }, + { 0xD5B3, 0x689C }, + { 0xD5B4, 0x686D }, + { 0xD5B5, 0x686E }, + { 0xD5B6, 0x68AE }, + { 0xD5B7, 0x68AB }, + { 0xD5B8, 0x6956 }, + { 0xD5B9, 0x686F }, + { 0xD5BA, 0x68A3 }, + { 0xD5BB, 0x68AC }, + { 0xD5BC, 0x68A9 }, + { 0xD5BD, 0x6875 }, + { 0xD5BE, 0x6874 }, + { 0xD5BF, 0x68B2 }, + { 0xD5C0, 0x688F }, + { 0xD5C1, 0x6877 }, + { 0xD5C2, 0x6892 }, + { 0xD5C3, 0x687C }, + { 0xD5C4, 0x686B }, + { 0xD5C5, 0x6872 }, + { 0xD5C6, 0x68AA }, + { 0xD5C7, 0x6880 }, + { 0xD5C8, 0x6871 }, + { 0xD5C9, 0x687E }, + { 0xD5CA, 0x689B }, + { 0xD5CB, 0x6896 }, + { 0xD5CC, 0x688B }, + { 0xD5CD, 0x68A0 }, + { 0xD5CE, 0x6889 }, + { 0xD5CF, 0x68A4 }, + { 0xD5D0, 0x6878 }, + { 0xD5D1, 0x687B }, + { 0xD5D2, 0x6891 }, + { 0xD5D3, 0x688C }, + { 0xD5D4, 0x688A }, + { 0xD5D5, 0x687D }, + { 0xD5D6, 0x6B36 }, + { 0xD5D7, 0x6B33 }, + { 0xD5D8, 0x6B37 }, + { 0xD5D9, 0x6B38 }, + { 0xD5DA, 0x6B91 }, + { 0xD5DB, 0x6B8F }, + { 0xD5DC, 0x6B8D }, + { 0xD5DD, 0x6B8E }, + { 0xD5DE, 0x6B8C }, + { 0xD5DF, 0x6C2A }, + { 0xD5E0, 0x6DC0 }, + { 0xD5E1, 0x6DAB }, + { 0xD5E2, 0x6DB4 }, + { 0xD5E3, 0x6DB3 }, + { 0xD5E4, 0x6E74 }, + { 0xD5E5, 0x6DAC }, + { 0xD5E6, 0x6DE9 }, + { 0xD5E7, 0x6DE2 }, + { 0xD5E8, 0x6DB7 }, + { 0xD5E9, 0x6DF6 }, + { 0xD5EA, 0x6DD4 }, + { 0xD5EB, 0x6E00 }, + { 0xD5EC, 0x6DC8 }, + { 0xD5ED, 0x6DE0 }, + { 0xD5EE, 0x6DDF }, + { 0xD5EF, 0x6DD6 }, + { 0xD5F0, 0x6DBE }, + { 0xD5F1, 0x6DE5 }, + { 0xD5F2, 0x6DDC }, + { 0xD5F3, 0x6DDD }, + { 0xD5F4, 0x6DDB }, + { 0xD5F5, 0x6DF4 }, + { 0xD5F6, 0x6DCA }, + { 0xD5F7, 0x6DBD }, + { 0xD5F8, 0x6DED }, + { 0xD5F9, 0x6DF0 }, + { 0xD5FA, 0x6DBA }, + { 0xD5FB, 0x6DD5 }, + { 0xD5FC, 0x6DC2 }, + { 0xD5FD, 0x6DCF }, + { 0xD5FE, 0x6DC9 }, + { 0xD640, 0x6DD0 }, + { 0xD641, 0x6DF2 }, + { 0xD642, 0x6DD3 }, + { 0xD643, 0x6DFD }, + { 0xD644, 0x6DD7 }, + { 0xD645, 0x6DCD }, + { 0xD646, 0x6DE3 }, + { 0xD647, 0x6DBB }, + { 0xD648, 0x70FA }, + { 0xD649, 0x710D }, + { 0xD64A, 0x70F7 }, + { 0xD64B, 0x7117 }, + { 0xD64C, 0x70F4 }, + { 0xD64D, 0x710C }, + { 0xD64E, 0x70F0 }, + { 0xD64F, 0x7104 }, + { 0xD650, 0x70F3 }, + { 0xD651, 0x7110 }, + { 0xD652, 0x70FC }, + { 0xD653, 0x70FF }, + { 0xD654, 0x7106 }, + { 0xD655, 0x7113 }, + { 0xD656, 0x7100 }, + { 0xD657, 0x70F8 }, + { 0xD658, 0x70F6 }, + { 0xD659, 0x710B }, + { 0xD65A, 0x7102 }, + { 0xD65B, 0x710E }, + { 0xD65C, 0x727E }, + { 0xD65D, 0x727B }, + { 0xD65E, 0x727C }, + { 0xD65F, 0x727F }, + { 0xD660, 0x731D }, + { 0xD661, 0x7317 }, + { 0xD662, 0x7307 }, + { 0xD663, 0x7311 }, + { 0xD664, 0x7318 }, + { 0xD665, 0x730A }, + { 0xD666, 0x7308 }, + { 0xD667, 0x72FF }, + { 0xD668, 0x730F }, + { 0xD669, 0x731E }, + { 0xD66A, 0x7388 }, + { 0xD66B, 0x73F6 }, + { 0xD66C, 0x73F8 }, + { 0xD66D, 0x73F5 }, + { 0xD66E, 0x7404 }, + { 0xD66F, 0x7401 }, + { 0xD670, 0x73FD }, + { 0xD671, 0x7407 }, + { 0xD672, 0x7400 }, + { 0xD673, 0x73FA }, + { 0xD674, 0x73FC }, + { 0xD675, 0x73FF }, + { 0xD676, 0x740C }, + { 0xD677, 0x740B }, + { 0xD678, 0x73F4 }, + { 0xD679, 0x7408 }, + { 0xD67A, 0x7564 }, + { 0xD67B, 0x7563 }, + { 0xD67C, 0x75CE }, + { 0xD67D, 0x75D2 }, + { 0xD67E, 0x75CF }, + { 0xD6A1, 0x75CB }, + { 0xD6A2, 0x75CC }, + { 0xD6A3, 0x75D1 }, + { 0xD6A4, 0x75D0 }, + { 0xD6A5, 0x768F }, + { 0xD6A6, 0x7689 }, + { 0xD6A7, 0x76D3 }, + { 0xD6A8, 0x7739 }, + { 0xD6A9, 0x772F }, + { 0xD6AA, 0x772D }, + { 0xD6AB, 0x7731 }, + { 0xD6AC, 0x7732 }, + { 0xD6AD, 0x7734 }, + { 0xD6AE, 0x7733 }, + { 0xD6AF, 0x773D }, + { 0xD6B0, 0x7725 }, + { 0xD6B1, 0x773B }, + { 0xD6B2, 0x7735 }, + { 0xD6B3, 0x7848 }, + { 0xD6B4, 0x7852 }, + { 0xD6B5, 0x7849 }, + { 0xD6B6, 0x784D }, + { 0xD6B7, 0x784A }, + { 0xD6B8, 0x784C }, + { 0xD6B9, 0x7826 }, + { 0xD6BA, 0x7845 }, + { 0xD6BB, 0x7850 }, + { 0xD6BC, 0x7964 }, + { 0xD6BD, 0x7967 }, + { 0xD6BE, 0x7969 }, + { 0xD6BF, 0x796A }, + { 0xD6C0, 0x7963 }, + { 0xD6C1, 0x796B }, + { 0xD6C2, 0x7961 }, + { 0xD6C3, 0x79BB }, + { 0xD6C4, 0x79FA }, + { 0xD6C5, 0x79F8 }, + { 0xD6C6, 0x79F6 }, + { 0xD6C7, 0x79F7 }, + { 0xD6C8, 0x7A8F }, + { 0xD6C9, 0x7A94 }, + { 0xD6CA, 0x7A90 }, + { 0xD6CB, 0x7B35 }, + { 0xD6CC, 0x7B47 }, + { 0xD6CD, 0x7B34 }, + { 0xD6CE, 0x7B25 }, + { 0xD6CF, 0x7B30 }, + { 0xD6D0, 0x7B22 }, + { 0xD6D1, 0x7B24 }, + { 0xD6D2, 0x7B33 }, + { 0xD6D3, 0x7B18 }, + { 0xD6D4, 0x7B2A }, + { 0xD6D5, 0x7B1D }, + { 0xD6D6, 0x7B31 }, + { 0xD6D7, 0x7B2B }, + { 0xD6D8, 0x7B2D }, + { 0xD6D9, 0x7B2F }, + { 0xD6DA, 0x7B32 }, + { 0xD6DB, 0x7B38 }, + { 0xD6DC, 0x7B1A }, + { 0xD6DD, 0x7B23 }, + { 0xD6DE, 0x7C94 }, + { 0xD6DF, 0x7C98 }, + { 0xD6E0, 0x7C96 }, + { 0xD6E1, 0x7CA3 }, + { 0xD6E2, 0x7D35 }, + { 0xD6E3, 0x7D3D }, + { 0xD6E4, 0x7D38 }, + { 0xD6E5, 0x7D36 }, + { 0xD6E6, 0x7D3A }, + { 0xD6E7, 0x7D45 }, + { 0xD6E8, 0x7D2C }, + { 0xD6E9, 0x7D29 }, + { 0xD6EA, 0x7D41 }, + { 0xD6EB, 0x7D47 }, + { 0xD6EC, 0x7D3E }, + { 0xD6ED, 0x7D3F }, + { 0xD6EE, 0x7D4A }, + { 0xD6EF, 0x7D3B }, + { 0xD6F0, 0x7D28 }, + { 0xD6F1, 0x7F63 }, + { 0xD6F2, 0x7F95 }, + { 0xD6F3, 0x7F9C }, + { 0xD6F4, 0x7F9D }, + { 0xD6F5, 0x7F9B }, + { 0xD6F6, 0x7FCA }, + { 0xD6F7, 0x7FCB }, + { 0xD6F8, 0x7FCD }, + { 0xD6F9, 0x7FD0 }, + { 0xD6FA, 0x7FD1 }, + { 0xD6FB, 0x7FC7 }, + { 0xD6FC, 0x7FCF }, + { 0xD6FD, 0x7FC9 }, + { 0xD6FE, 0x801F }, + { 0xD740, 0x801E }, + { 0xD741, 0x801B }, + { 0xD742, 0x8047 }, + { 0xD743, 0x8043 }, + { 0xD744, 0x8048 }, + { 0xD745, 0x8118 }, + { 0xD746, 0x8125 }, + { 0xD747, 0x8119 }, + { 0xD748, 0x811B }, + { 0xD749, 0x812D }, + { 0xD74A, 0x811F }, + { 0xD74B, 0x812C }, + { 0xD74C, 0x811E }, + { 0xD74D, 0x8121 }, + { 0xD74E, 0x8115 }, + { 0xD74F, 0x8127 }, + { 0xD750, 0x811D }, + { 0xD751, 0x8122 }, + { 0xD752, 0x8211 }, + { 0xD753, 0x8238 }, + { 0xD754, 0x8233 }, + { 0xD755, 0x823A }, + { 0xD756, 0x8234 }, + { 0xD757, 0x8232 }, + { 0xD758, 0x8274 }, + { 0xD759, 0x8390 }, + { 0xD75A, 0x83A3 }, + { 0xD75B, 0x83A8 }, + { 0xD75C, 0x838D }, + { 0xD75D, 0x837A }, + { 0xD75E, 0x8373 }, + { 0xD75F, 0x83A4 }, + { 0xD760, 0x8374 }, + { 0xD761, 0x838F }, + { 0xD762, 0x8381 }, + { 0xD763, 0x8395 }, + { 0xD764, 0x8399 }, + { 0xD765, 0x8375 }, + { 0xD766, 0x8394 }, + { 0xD767, 0x83A9 }, + { 0xD768, 0x837D }, + { 0xD769, 0x8383 }, + { 0xD76A, 0x838C }, + { 0xD76B, 0x839D }, + { 0xD76C, 0x839B }, + { 0xD76D, 0x83AA }, + { 0xD76E, 0x838B }, + { 0xD76F, 0x837E }, + { 0xD770, 0x83A5 }, + { 0xD771, 0x83AF }, + { 0xD772, 0x8388 }, + { 0xD773, 0x8397 }, + { 0xD774, 0x83B0 }, + { 0xD775, 0x837F }, + { 0xD776, 0x83A6 }, + { 0xD777, 0x8387 }, + { 0xD778, 0x83AE }, + { 0xD779, 0x8376 }, + { 0xD77A, 0x839A }, + { 0xD77B, 0x8659 }, + { 0xD77C, 0x8656 }, + { 0xD77D, 0x86BF }, + { 0xD77E, 0x86B7 }, + { 0xD7A1, 0x86C2 }, + { 0xD7A2, 0x86C1 }, + { 0xD7A3, 0x86C5 }, + { 0xD7A4, 0x86BA }, + { 0xD7A5, 0x86B0 }, + { 0xD7A6, 0x86C8 }, + { 0xD7A7, 0x86B9 }, + { 0xD7A8, 0x86B3 }, + { 0xD7A9, 0x86B8 }, + { 0xD7AA, 0x86CC }, + { 0xD7AB, 0x86B4 }, + { 0xD7AC, 0x86BB }, + { 0xD7AD, 0x86BC }, + { 0xD7AE, 0x86C3 }, + { 0xD7AF, 0x86BD }, + { 0xD7B0, 0x86BE }, + { 0xD7B1, 0x8852 }, + { 0xD7B2, 0x8889 }, + { 0xD7B3, 0x8895 }, + { 0xD7B4, 0x88A8 }, + { 0xD7B5, 0x88A2 }, + { 0xD7B6, 0x88AA }, + { 0xD7B7, 0x889A }, + { 0xD7B8, 0x8891 }, + { 0xD7B9, 0x88A1 }, + { 0xD7BA, 0x889F }, + { 0xD7BB, 0x8898 }, + { 0xD7BC, 0x88A7 }, + { 0xD7BD, 0x8899 }, + { 0xD7BE, 0x889B }, + { 0xD7BF, 0x8897 }, + { 0xD7C0, 0x88A4 }, + { 0xD7C1, 0x88AC }, + { 0xD7C2, 0x888C }, + { 0xD7C3, 0x8893 }, + { 0xD7C4, 0x888E }, + { 0xD7C5, 0x8982 }, + { 0xD7C6, 0x89D6 }, + { 0xD7C7, 0x89D9 }, + { 0xD7C8, 0x89D5 }, + { 0xD7C9, 0x8A30 }, + { 0xD7CA, 0x8A27 }, + { 0xD7CB, 0x8A2C }, + { 0xD7CC, 0x8A1E }, + { 0xD7CD, 0x8C39 }, + { 0xD7CE, 0x8C3B }, + { 0xD7CF, 0x8C5C }, + { 0xD7D0, 0x8C5D }, + { 0xD7D1, 0x8C7D }, + { 0xD7D2, 0x8CA5 }, + { 0xD7D3, 0x8D7D }, + { 0xD7D4, 0x8D7B }, + { 0xD7D5, 0x8D79 }, + { 0xD7D6, 0x8DBC }, + { 0xD7D7, 0x8DC2 }, + { 0xD7D8, 0x8DB9 }, + { 0xD7D9, 0x8DBF }, + { 0xD7DA, 0x8DC1 }, + { 0xD7DB, 0x8ED8 }, + { 0xD7DC, 0x8EDE }, + { 0xD7DD, 0x8EDD }, + { 0xD7DE, 0x8EDC }, + { 0xD7DF, 0x8ED7 }, + { 0xD7E0, 0x8EE0 }, + { 0xD7E1, 0x8EE1 }, + { 0xD7E2, 0x9024 }, + { 0xD7E3, 0x900B }, + { 0xD7E4, 0x9011 }, + { 0xD7E5, 0x901C }, + { 0xD7E6, 0x900C }, + { 0xD7E7, 0x9021 }, + { 0xD7E8, 0x90EF }, + { 0xD7E9, 0x90EA }, + { 0xD7EA, 0x90F0 }, + { 0xD7EB, 0x90F4 }, + { 0xD7EC, 0x90F2 }, + { 0xD7ED, 0x90F3 }, + { 0xD7EE, 0x90D4 }, + { 0xD7EF, 0x90EB }, + { 0xD7F0, 0x90EC }, + { 0xD7F1, 0x90E9 }, + { 0xD7F2, 0x9156 }, + { 0xD7F3, 0x9158 }, + { 0xD7F4, 0x915A }, + { 0xD7F5, 0x9153 }, + { 0xD7F6, 0x9155 }, + { 0xD7F7, 0x91EC }, + { 0xD7F8, 0x91F4 }, + { 0xD7F9, 0x91F1 }, + { 0xD7FA, 0x91F3 }, + { 0xD7FB, 0x91F8 }, + { 0xD7FC, 0x91E4 }, + { 0xD7FD, 0x91F9 }, + { 0xD7FE, 0x91EA }, + { 0xD840, 0x91EB }, + { 0xD841, 0x91F7 }, + { 0xD842, 0x91E8 }, + { 0xD843, 0x91EE }, + { 0xD844, 0x957A }, + { 0xD845, 0x9586 }, + { 0xD846, 0x9588 }, + { 0xD847, 0x967C }, + { 0xD848, 0x966D }, + { 0xD849, 0x966B }, + { 0xD84A, 0x9671 }, + { 0xD84B, 0x966F }, + { 0xD84C, 0x96BF }, + { 0xD84D, 0x976A }, + { 0xD84E, 0x9804 }, + { 0xD84F, 0x98E5 }, + { 0xD850, 0x9997 }, + { 0xD851, 0x509B }, + { 0xD852, 0x5095 }, + { 0xD853, 0x5094 }, + { 0xD854, 0x509E }, + { 0xD855, 0x508B }, + { 0xD856, 0x50A3 }, + { 0xD857, 0x5083 }, + { 0xD858, 0x508C }, + { 0xD859, 0x508E }, + { 0xD85A, 0x509D }, + { 0xD85B, 0x5068 }, + { 0xD85C, 0x509C }, + { 0xD85D, 0x5092 }, + { 0xD85E, 0x5082 }, + { 0xD85F, 0x5087 }, + { 0xD860, 0x515F }, + { 0xD861, 0x51D4 }, + { 0xD862, 0x5312 }, + { 0xD863, 0x5311 }, + { 0xD864, 0x53A4 }, + { 0xD865, 0x53A7 }, + { 0xD866, 0x5591 }, + { 0xD867, 0x55A8 }, + { 0xD868, 0x55A5 }, + { 0xD869, 0x55AD }, + { 0xD86A, 0x5577 }, + { 0xD86B, 0x5645 }, + { 0xD86C, 0x55A2 }, + { 0xD86D, 0x5593 }, + { 0xD86E, 0x5588 }, + { 0xD86F, 0x558F }, + { 0xD870, 0x55B5 }, + { 0xD871, 0x5581 }, + { 0xD872, 0x55A3 }, + { 0xD873, 0x5592 }, + { 0xD874, 0x55A4 }, + { 0xD875, 0x557D }, + { 0xD876, 0x558C }, + { 0xD877, 0x55A6 }, + { 0xD878, 0x557F }, + { 0xD879, 0x5595 }, + { 0xD87A, 0x55A1 }, + { 0xD87B, 0x558E }, + { 0xD87C, 0x570C }, + { 0xD87D, 0x5829 }, + { 0xD87E, 0x5837 }, + { 0xD8A1, 0x5819 }, + { 0xD8A2, 0x581E }, + { 0xD8A3, 0x5827 }, + { 0xD8A4, 0x5823 }, + { 0xD8A5, 0x5828 }, + { 0xD8A6, 0x57F5 }, + { 0xD8A7, 0x5848 }, + { 0xD8A8, 0x5825 }, + { 0xD8A9, 0x581C }, + { 0xD8AA, 0x581B }, + { 0xD8AB, 0x5833 }, + { 0xD8AC, 0x583F }, + { 0xD8AD, 0x5836 }, + { 0xD8AE, 0x582E }, + { 0xD8AF, 0x5839 }, + { 0xD8B0, 0x5838 }, + { 0xD8B1, 0x582D }, + { 0xD8B2, 0x582C }, + { 0xD8B3, 0x583B }, + { 0xD8B4, 0x5961 }, + { 0xD8B5, 0x5AAF }, + { 0xD8B6, 0x5A94 }, + { 0xD8B7, 0x5A9F }, + { 0xD8B8, 0x5A7A }, + { 0xD8B9, 0x5AA2 }, + { 0xD8BA, 0x5A9E }, + { 0xD8BB, 0x5A78 }, + { 0xD8BC, 0x5AA6 }, + { 0xD8BD, 0x5A7C }, + { 0xD8BE, 0x5AA5 }, + { 0xD8BF, 0x5AAC }, + { 0xD8C0, 0x5A95 }, + { 0xD8C1, 0x5AAE }, + { 0xD8C2, 0x5A37 }, + { 0xD8C3, 0x5A84 }, + { 0xD8C4, 0x5A8A }, + { 0xD8C5, 0x5A97 }, + { 0xD8C6, 0x5A83 }, + { 0xD8C7, 0x5A8B }, + { 0xD8C8, 0x5AA9 }, + { 0xD8C9, 0x5A7B }, + { 0xD8CA, 0x5A7D }, + { 0xD8CB, 0x5A8C }, + { 0xD8CC, 0x5A9C }, + { 0xD8CD, 0x5A8F }, + { 0xD8CE, 0x5A93 }, + { 0xD8CF, 0x5A9D }, + { 0xD8D0, 0x5BEA }, + { 0xD8D1, 0x5BCD }, + { 0xD8D2, 0x5BCB }, + { 0xD8D3, 0x5BD4 }, + { 0xD8D4, 0x5BD1 }, + { 0xD8D5, 0x5BCA }, + { 0xD8D6, 0x5BCE }, + { 0xD8D7, 0x5C0C }, + { 0xD8D8, 0x5C30 }, + { 0xD8D9, 0x5D37 }, + { 0xD8DA, 0x5D43 }, + { 0xD8DB, 0x5D6B }, + { 0xD8DC, 0x5D41 }, + { 0xD8DD, 0x5D4B }, + { 0xD8DE, 0x5D3F }, + { 0xD8DF, 0x5D35 }, + { 0xD8E0, 0x5D51 }, + { 0xD8E1, 0x5D4E }, + { 0xD8E2, 0x5D55 }, + { 0xD8E3, 0x5D33 }, + { 0xD8E4, 0x5D3A }, + { 0xD8E5, 0x5D52 }, + { 0xD8E6, 0x5D3D }, + { 0xD8E7, 0x5D31 }, + { 0xD8E8, 0x5D59 }, + { 0xD8E9, 0x5D42 }, + { 0xD8EA, 0x5D39 }, + { 0xD8EB, 0x5D49 }, + { 0xD8EC, 0x5D38 }, + { 0xD8ED, 0x5D3C }, + { 0xD8EE, 0x5D32 }, + { 0xD8EF, 0x5D36 }, + { 0xD8F0, 0x5D40 }, + { 0xD8F1, 0x5D45 }, + { 0xD8F2, 0x5E44 }, + { 0xD8F3, 0x5E41 }, + { 0xD8F4, 0x5F58 }, + { 0xD8F5, 0x5FA6 }, + { 0xD8F6, 0x5FA5 }, + { 0xD8F7, 0x5FAB }, + { 0xD8F8, 0x60C9 }, + { 0xD8F9, 0x60B9 }, + { 0xD8FA, 0x60CC }, + { 0xD8FB, 0x60E2 }, + { 0xD8FC, 0x60CE }, + { 0xD8FD, 0x60C4 }, + { 0xD8FE, 0x6114 }, + { 0xD940, 0x60F2 }, + { 0xD941, 0x610A }, + { 0xD942, 0x6116 }, + { 0xD943, 0x6105 }, + { 0xD944, 0x60F5 }, + { 0xD945, 0x6113 }, + { 0xD946, 0x60F8 }, + { 0xD947, 0x60FC }, + { 0xD948, 0x60FE }, + { 0xD949, 0x60C1 }, + { 0xD94A, 0x6103 }, + { 0xD94B, 0x6118 }, + { 0xD94C, 0x611D }, + { 0xD94D, 0x6110 }, + { 0xD94E, 0x60FF }, + { 0xD94F, 0x6104 }, + { 0xD950, 0x610B }, + { 0xD951, 0x624A }, + { 0xD952, 0x6394 }, + { 0xD953, 0x63B1 }, + { 0xD954, 0x63B0 }, + { 0xD955, 0x63CE }, + { 0xD956, 0x63E5 }, + { 0xD957, 0x63E8 }, + { 0xD958, 0x63EF }, + { 0xD959, 0x63C3 }, + { 0xD95A, 0x649D }, + { 0xD95B, 0x63F3 }, + { 0xD95C, 0x63CA }, + { 0xD95D, 0x63E0 }, + { 0xD95E, 0x63F6 }, + { 0xD95F, 0x63D5 }, + { 0xD960, 0x63F2 }, + { 0xD961, 0x63F5 }, + { 0xD962, 0x6461 }, + { 0xD963, 0x63DF }, + { 0xD964, 0x63BE }, + { 0xD965, 0x63DD }, + { 0xD966, 0x63DC }, + { 0xD967, 0x63C4 }, + { 0xD968, 0x63D8 }, + { 0xD969, 0x63D3 }, + { 0xD96A, 0x63C2 }, + { 0xD96B, 0x63C7 }, + { 0xD96C, 0x63CC }, + { 0xD96D, 0x63CB }, + { 0xD96E, 0x63C8 }, + { 0xD96F, 0x63F0 }, + { 0xD970, 0x63D7 }, + { 0xD971, 0x63D9 }, + { 0xD972, 0x6532 }, + { 0xD973, 0x6567 }, + { 0xD974, 0x656A }, + { 0xD975, 0x6564 }, + { 0xD976, 0x655C }, + { 0xD977, 0x6568 }, + { 0xD978, 0x6565 }, + { 0xD979, 0x658C }, + { 0xD97A, 0x659D }, + { 0xD97B, 0x659E }, + { 0xD97C, 0x65AE }, + { 0xD97D, 0x65D0 }, + { 0xD97E, 0x65D2 }, + { 0xD9A1, 0x667C }, + { 0xD9A2, 0x666C }, + { 0xD9A3, 0x667B }, + { 0xD9A4, 0x6680 }, + { 0xD9A5, 0x6671 }, + { 0xD9A6, 0x6679 }, + { 0xD9A7, 0x666A }, + { 0xD9A8, 0x6672 }, + { 0xD9A9, 0x6701 }, + { 0xD9AA, 0x690C }, + { 0xD9AB, 0x68D3 }, + { 0xD9AC, 0x6904 }, + { 0xD9AD, 0x68DC }, + { 0xD9AE, 0x692A }, + { 0xD9AF, 0x68EC }, + { 0xD9B0, 0x68EA }, + { 0xD9B1, 0x68F1 }, + { 0xD9B2, 0x690F }, + { 0xD9B3, 0x68D6 }, + { 0xD9B4, 0x68F7 }, + { 0xD9B5, 0x68EB }, + { 0xD9B6, 0x68E4 }, + { 0xD9B7, 0x68F6 }, + { 0xD9B8, 0x6913 }, + { 0xD9B9, 0x6910 }, + { 0xD9BA, 0x68F3 }, + { 0xD9BB, 0x68E1 }, + { 0xD9BC, 0x6907 }, + { 0xD9BD, 0x68CC }, + { 0xD9BE, 0x6908 }, + { 0xD9BF, 0x6970 }, + { 0xD9C0, 0x68B4 }, + { 0xD9C1, 0x6911 }, + { 0xD9C2, 0x68EF }, + { 0xD9C3, 0x68C6 }, + { 0xD9C4, 0x6914 }, + { 0xD9C5, 0x68F8 }, + { 0xD9C6, 0x68D0 }, + { 0xD9C7, 0x68FD }, + { 0xD9C8, 0x68FC }, + { 0xD9C9, 0x68E8 }, + { 0xD9CA, 0x690B }, + { 0xD9CB, 0x690A }, + { 0xD9CC, 0x6917 }, + { 0xD9CD, 0x68CE }, + { 0xD9CE, 0x68C8 }, + { 0xD9CF, 0x68DD }, + { 0xD9D0, 0x68DE }, + { 0xD9D1, 0x68E6 }, + { 0xD9D2, 0x68F4 }, + { 0xD9D3, 0x68D1 }, + { 0xD9D4, 0x6906 }, + { 0xD9D5, 0x68D4 }, + { 0xD9D6, 0x68E9 }, + { 0xD9D7, 0x6915 }, + { 0xD9D8, 0x6925 }, + { 0xD9D9, 0x68C7 }, + { 0xD9DA, 0x6B39 }, + { 0xD9DB, 0x6B3B }, + { 0xD9DC, 0x6B3F }, + { 0xD9DD, 0x6B3C }, + { 0xD9DE, 0x6B94 }, + { 0xD9DF, 0x6B97 }, + { 0xD9E0, 0x6B99 }, + { 0xD9E1, 0x6B95 }, + { 0xD9E2, 0x6BBD }, + { 0xD9E3, 0x6BF0 }, + { 0xD9E4, 0x6BF2 }, + { 0xD9E5, 0x6BF3 }, + { 0xD9E6, 0x6C30 }, + { 0xD9E7, 0x6DFC }, + { 0xD9E8, 0x6E46 }, + { 0xD9E9, 0x6E47 }, + { 0xD9EA, 0x6E1F }, + { 0xD9EB, 0x6E49 }, + { 0xD9EC, 0x6E88 }, + { 0xD9ED, 0x6E3C }, + { 0xD9EE, 0x6E3D }, + { 0xD9EF, 0x6E45 }, + { 0xD9F0, 0x6E62 }, + { 0xD9F1, 0x6E2B }, + { 0xD9F2, 0x6E3F }, + { 0xD9F3, 0x6E41 }, + { 0xD9F4, 0x6E5D }, + { 0xD9F5, 0x6E73 }, + { 0xD9F6, 0x6E1C }, + { 0xD9F7, 0x6E33 }, + { 0xD9F8, 0x6E4B }, + { 0xD9F9, 0x6E40 }, + { 0xD9FA, 0x6E51 }, + { 0xD9FB, 0x6E3B }, + { 0xD9FC, 0x6E03 }, + { 0xD9FD, 0x6E2E }, + { 0xD9FE, 0x6E5E }, + { 0xDA40, 0x6E68 }, + { 0xDA41, 0x6E5C }, + { 0xDA42, 0x6E61 }, + { 0xDA43, 0x6E31 }, + { 0xDA44, 0x6E28 }, + { 0xDA45, 0x6E60 }, + { 0xDA46, 0x6E71 }, + { 0xDA47, 0x6E6B }, + { 0xDA48, 0x6E39 }, + { 0xDA49, 0x6E22 }, + { 0xDA4A, 0x6E30 }, + { 0xDA4B, 0x6E53 }, + { 0xDA4C, 0x6E65 }, + { 0xDA4D, 0x6E27 }, + { 0xDA4E, 0x6E78 }, + { 0xDA4F, 0x6E64 }, + { 0xDA50, 0x6E77 }, + { 0xDA51, 0x6E55 }, + { 0xDA52, 0x6E79 }, + { 0xDA53, 0x6E52 }, + { 0xDA54, 0x6E66 }, + { 0xDA55, 0x6E35 }, + { 0xDA56, 0x6E36 }, + { 0xDA57, 0x6E5A }, + { 0xDA58, 0x7120 }, + { 0xDA59, 0x711E }, + { 0xDA5A, 0x712F }, + { 0xDA5B, 0x70FB }, + { 0xDA5C, 0x712E }, + { 0xDA5D, 0x7131 }, + { 0xDA5E, 0x7123 }, + { 0xDA5F, 0x7125 }, + { 0xDA60, 0x7122 }, + { 0xDA61, 0x7132 }, + { 0xDA62, 0x711F }, + { 0xDA63, 0x7128 }, + { 0xDA64, 0x713A }, + { 0xDA65, 0x711B }, + { 0xDA66, 0x724B }, + { 0xDA67, 0x725A }, + { 0xDA68, 0x7288 }, + { 0xDA69, 0x7289 }, + { 0xDA6A, 0x7286 }, + { 0xDA6B, 0x7285 }, + { 0xDA6C, 0x728B }, + { 0xDA6D, 0x7312 }, + { 0xDA6E, 0x730B }, + { 0xDA6F, 0x7330 }, + { 0xDA70, 0x7322 }, + { 0xDA71, 0x7331 }, + { 0xDA72, 0x7333 }, + { 0xDA73, 0x7327 }, + { 0xDA74, 0x7332 }, + { 0xDA75, 0x732D }, + { 0xDA76, 0x7326 }, + { 0xDA77, 0x7323 }, + { 0xDA78, 0x7335 }, + { 0xDA79, 0x730C }, + { 0xDA7A, 0x742E }, + { 0xDA7B, 0x742C }, + { 0xDA7C, 0x7430 }, + { 0xDA7D, 0x742B }, + { 0xDA7E, 0x7416 }, + { 0xDAA1, 0x741A }, + { 0xDAA2, 0x7421 }, + { 0xDAA3, 0x742D }, + { 0xDAA4, 0x7431 }, + { 0xDAA5, 0x7424 }, + { 0xDAA6, 0x7423 }, + { 0xDAA7, 0x741D }, + { 0xDAA8, 0x7429 }, + { 0xDAA9, 0x7420 }, + { 0xDAAA, 0x7432 }, + { 0xDAAB, 0x74FB }, + { 0xDAAC, 0x752F }, + { 0xDAAD, 0x756F }, + { 0xDAAE, 0x756C }, + { 0xDAAF, 0x75E7 }, + { 0xDAB0, 0x75DA }, + { 0xDAB1, 0x75E1 }, + { 0xDAB2, 0x75E6 }, + { 0xDAB3, 0x75DD }, + { 0xDAB4, 0x75DF }, + { 0xDAB5, 0x75E4 }, + { 0xDAB6, 0x75D7 }, + { 0xDAB7, 0x7695 }, + { 0xDAB8, 0x7692 }, + { 0xDAB9, 0x76DA }, + { 0xDABA, 0x7746 }, + { 0xDABB, 0x7747 }, + { 0xDABC, 0x7744 }, + { 0xDABD, 0x774D }, + { 0xDABE, 0x7745 }, + { 0xDABF, 0x774A }, + { 0xDAC0, 0x774E }, + { 0xDAC1, 0x774B }, + { 0xDAC2, 0x774C }, + { 0xDAC3, 0x77DE }, + { 0xDAC4, 0x77EC }, + { 0xDAC5, 0x7860 }, + { 0xDAC6, 0x7864 }, + { 0xDAC7, 0x7865 }, + { 0xDAC8, 0x785C }, + { 0xDAC9, 0x786D }, + { 0xDACA, 0x7871 }, + { 0xDACB, 0x786A }, + { 0xDACC, 0x786E }, + { 0xDACD, 0x7870 }, + { 0xDACE, 0x7869 }, + { 0xDACF, 0x7868 }, + { 0xDAD0, 0x785E }, + { 0xDAD1, 0x7862 }, + { 0xDAD2, 0x7974 }, + { 0xDAD3, 0x7973 }, + { 0xDAD4, 0x7972 }, + { 0xDAD5, 0x7970 }, + { 0xDAD6, 0x7A02 }, + { 0xDAD7, 0x7A0A }, + { 0xDAD8, 0x7A03 }, + { 0xDAD9, 0x7A0C }, + { 0xDADA, 0x7A04 }, + { 0xDADB, 0x7A99 }, + { 0xDADC, 0x7AE6 }, + { 0xDADD, 0x7AE4 }, + { 0xDADE, 0x7B4A }, + { 0xDADF, 0x7B3B }, + { 0xDAE0, 0x7B44 }, + { 0xDAE1, 0x7B48 }, + { 0xDAE2, 0x7B4C }, + { 0xDAE3, 0x7B4E }, + { 0xDAE4, 0x7B40 }, + { 0xDAE5, 0x7B58 }, + { 0xDAE6, 0x7B45 }, + { 0xDAE7, 0x7CA2 }, + { 0xDAE8, 0x7C9E }, + { 0xDAE9, 0x7CA8 }, + { 0xDAEA, 0x7CA1 }, + { 0xDAEB, 0x7D58 }, + { 0xDAEC, 0x7D6F }, + { 0xDAED, 0x7D63 }, + { 0xDAEE, 0x7D53 }, + { 0xDAEF, 0x7D56 }, + { 0xDAF0, 0x7D67 }, + { 0xDAF1, 0x7D6A }, + { 0xDAF2, 0x7D4F }, + { 0xDAF3, 0x7D6D }, + { 0xDAF4, 0x7D5C }, + { 0xDAF5, 0x7D6B }, + { 0xDAF6, 0x7D52 }, + { 0xDAF7, 0x7D54 }, + { 0xDAF8, 0x7D69 }, + { 0xDAF9, 0x7D51 }, + { 0xDAFA, 0x7D5F }, + { 0xDAFB, 0x7D4E }, + { 0xDAFC, 0x7F3E }, + { 0xDAFD, 0x7F3F }, + { 0xDAFE, 0x7F65 }, + { 0xDB40, 0x7F66 }, + { 0xDB41, 0x7FA2 }, + { 0xDB42, 0x7FA0 }, + { 0xDB43, 0x7FA1 }, + { 0xDB44, 0x7FD7 }, + { 0xDB45, 0x8051 }, + { 0xDB46, 0x804F }, + { 0xDB47, 0x8050 }, + { 0xDB48, 0x80FE }, + { 0xDB49, 0x80D4 }, + { 0xDB4A, 0x8143 }, + { 0xDB4B, 0x814A }, + { 0xDB4C, 0x8152 }, + { 0xDB4D, 0x814F }, + { 0xDB4E, 0x8147 }, + { 0xDB4F, 0x813D }, + { 0xDB50, 0x814D }, + { 0xDB51, 0x813A }, + { 0xDB52, 0x81E6 }, + { 0xDB53, 0x81EE }, + { 0xDB54, 0x81F7 }, + { 0xDB55, 0x81F8 }, + { 0xDB56, 0x81F9 }, + { 0xDB57, 0x8204 }, + { 0xDB58, 0x823C }, + { 0xDB59, 0x823D }, + { 0xDB5A, 0x823F }, + { 0xDB5B, 0x8275 }, + { 0xDB5C, 0x833B }, + { 0xDB5D, 0x83CF }, + { 0xDB5E, 0x83F9 }, + { 0xDB5F, 0x8423 }, + { 0xDB60, 0x83C0 }, + { 0xDB61, 0x83E8 }, + { 0xDB62, 0x8412 }, + { 0xDB63, 0x83E7 }, + { 0xDB64, 0x83E4 }, + { 0xDB65, 0x83FC }, + { 0xDB66, 0x83F6 }, + { 0xDB67, 0x8410 }, + { 0xDB68, 0x83C6 }, + { 0xDB69, 0x83C8 }, + { 0xDB6A, 0x83EB }, + { 0xDB6B, 0x83E3 }, + { 0xDB6C, 0x83BF }, + { 0xDB6D, 0x8401 }, + { 0xDB6E, 0x83DD }, + { 0xDB6F, 0x83E5 }, + { 0xDB70, 0x83D8 }, + { 0xDB71, 0x83FF }, + { 0xDB72, 0x83E1 }, + { 0xDB73, 0x83CB }, + { 0xDB74, 0x83CE }, + { 0xDB75, 0x83D6 }, + { 0xDB76, 0x83F5 }, + { 0xDB77, 0x83C9 }, + { 0xDB78, 0x8409 }, + { 0xDB79, 0x840F }, + { 0xDB7A, 0x83DE }, + { 0xDB7B, 0x8411 }, + { 0xDB7C, 0x8406 }, + { 0xDB7D, 0x83C2 }, + { 0xDB7E, 0x83F3 }, + { 0xDBA1, 0x83D5 }, + { 0xDBA2, 0x83FA }, + { 0xDBA3, 0x83C7 }, + { 0xDBA4, 0x83D1 }, + { 0xDBA5, 0x83EA }, + { 0xDBA6, 0x8413 }, + { 0xDBA7, 0x83C3 }, + { 0xDBA8, 0x83EC }, + { 0xDBA9, 0x83EE }, + { 0xDBAA, 0x83C4 }, + { 0xDBAB, 0x83FB }, + { 0xDBAC, 0x83D7 }, + { 0xDBAD, 0x83E2 }, + { 0xDBAE, 0x841B }, + { 0xDBAF, 0x83DB }, + { 0xDBB0, 0x83FE }, + { 0xDBB1, 0x86D8 }, + { 0xDBB2, 0x86E2 }, + { 0xDBB3, 0x86E6 }, + { 0xDBB4, 0x86D3 }, + { 0xDBB5, 0x86E3 }, + { 0xDBB6, 0x86DA }, + { 0xDBB7, 0x86EA }, + { 0xDBB8, 0x86DD }, + { 0xDBB9, 0x86EB }, + { 0xDBBA, 0x86DC }, + { 0xDBBB, 0x86EC }, + { 0xDBBC, 0x86E9 }, + { 0xDBBD, 0x86D7 }, + { 0xDBBE, 0x86E8 }, + { 0xDBBF, 0x86D1 }, + { 0xDBC0, 0x8848 }, + { 0xDBC1, 0x8856 }, + { 0xDBC2, 0x8855 }, + { 0xDBC3, 0x88BA }, + { 0xDBC4, 0x88D7 }, + { 0xDBC5, 0x88B9 }, + { 0xDBC6, 0x88B8 }, + { 0xDBC7, 0x88C0 }, + { 0xDBC8, 0x88BE }, + { 0xDBC9, 0x88B6 }, + { 0xDBCA, 0x88BC }, + { 0xDBCB, 0x88B7 }, + { 0xDBCC, 0x88BD }, + { 0xDBCD, 0x88B2 }, + { 0xDBCE, 0x8901 }, + { 0xDBCF, 0x88C9 }, + { 0xDBD0, 0x8995 }, + { 0xDBD1, 0x8998 }, + { 0xDBD2, 0x8997 }, + { 0xDBD3, 0x89DD }, + { 0xDBD4, 0x89DA }, + { 0xDBD5, 0x89DB }, + { 0xDBD6, 0x8A4E }, + { 0xDBD7, 0x8A4D }, + { 0xDBD8, 0x8A39 }, + { 0xDBD9, 0x8A59 }, + { 0xDBDA, 0x8A40 }, + { 0xDBDB, 0x8A57 }, + { 0xDBDC, 0x8A58 }, + { 0xDBDD, 0x8A44 }, + { 0xDBDE, 0x8A45 }, + { 0xDBDF, 0x8A52 }, + { 0xDBE0, 0x8A48 }, + { 0xDBE1, 0x8A51 }, + { 0xDBE2, 0x8A4A }, + { 0xDBE3, 0x8A4C }, + { 0xDBE4, 0x8A4F }, + { 0xDBE5, 0x8C5F }, + { 0xDBE6, 0x8C81 }, + { 0xDBE7, 0x8C80 }, + { 0xDBE8, 0x8CBA }, + { 0xDBE9, 0x8CBE }, + { 0xDBEA, 0x8CB0 }, + { 0xDBEB, 0x8CB9 }, + { 0xDBEC, 0x8CB5 }, + { 0xDBED, 0x8D84 }, + { 0xDBEE, 0x8D80 }, + { 0xDBEF, 0x8D89 }, + { 0xDBF0, 0x8DD8 }, + { 0xDBF1, 0x8DD3 }, + { 0xDBF2, 0x8DCD }, + { 0xDBF3, 0x8DC7 }, + { 0xDBF4, 0x8DD6 }, + { 0xDBF5, 0x8DDC }, + { 0xDBF6, 0x8DCF }, + { 0xDBF7, 0x8DD5 }, + { 0xDBF8, 0x8DD9 }, + { 0xDBF9, 0x8DC8 }, + { 0xDBFA, 0x8DD7 }, + { 0xDBFB, 0x8DC5 }, + { 0xDBFC, 0x8EEF }, + { 0xDBFD, 0x8EF7 }, + { 0xDBFE, 0x8EFA }, + { 0xDC40, 0x8EF9 }, + { 0xDC41, 0x8EE6 }, + { 0xDC42, 0x8EEE }, + { 0xDC43, 0x8EE5 }, + { 0xDC44, 0x8EF5 }, + { 0xDC45, 0x8EE7 }, + { 0xDC46, 0x8EE8 }, + { 0xDC47, 0x8EF6 }, + { 0xDC48, 0x8EEB }, + { 0xDC49, 0x8EF1 }, + { 0xDC4A, 0x8EEC }, + { 0xDC4B, 0x8EF4 }, + { 0xDC4C, 0x8EE9 }, + { 0xDC4D, 0x902D }, + { 0xDC4E, 0x9034 }, + { 0xDC4F, 0x902F }, + { 0xDC50, 0x9106 }, + { 0xDC51, 0x912C }, + { 0xDC52, 0x9104 }, + { 0xDC53, 0x90FF }, + { 0xDC54, 0x90FC }, + { 0xDC55, 0x9108 }, + { 0xDC56, 0x90F9 }, + { 0xDC57, 0x90FB }, + { 0xDC58, 0x9101 }, + { 0xDC59, 0x9100 }, + { 0xDC5A, 0x9107 }, + { 0xDC5B, 0x9105 }, + { 0xDC5C, 0x9103 }, + { 0xDC5D, 0x9161 }, + { 0xDC5E, 0x9164 }, + { 0xDC5F, 0x915F }, + { 0xDC60, 0x9162 }, + { 0xDC61, 0x9160 }, + { 0xDC62, 0x9201 }, + { 0xDC63, 0x920A }, + { 0xDC64, 0x9225 }, + { 0xDC65, 0x9203 }, + { 0xDC66, 0x921A }, + { 0xDC67, 0x9226 }, + { 0xDC68, 0x920F }, + { 0xDC69, 0x920C }, + { 0xDC6A, 0x9200 }, + { 0xDC6B, 0x9212 }, + { 0xDC6C, 0x91FF }, + { 0xDC6D, 0x91FD }, + { 0xDC6E, 0x9206 }, + { 0xDC6F, 0x9204 }, + { 0xDC70, 0x9227 }, + { 0xDC71, 0x9202 }, + { 0xDC72, 0x921C }, + { 0xDC73, 0x9224 }, + { 0xDC74, 0x9219 }, + { 0xDC75, 0x9217 }, + { 0xDC76, 0x9205 }, + { 0xDC77, 0x9216 }, + { 0xDC78, 0x957B }, + { 0xDC79, 0x958D }, + { 0xDC7A, 0x958C }, + { 0xDC7B, 0x9590 }, + { 0xDC7C, 0x9687 }, + { 0xDC7D, 0x967E }, + { 0xDC7E, 0x9688 }, + { 0xDCA1, 0x9689 }, + { 0xDCA2, 0x9683 }, + { 0xDCA3, 0x9680 }, + { 0xDCA4, 0x96C2 }, + { 0xDCA5, 0x96C8 }, + { 0xDCA6, 0x96C3 }, + { 0xDCA7, 0x96F1 }, + { 0xDCA8, 0x96F0 }, + { 0xDCA9, 0x976C }, + { 0xDCAA, 0x9770 }, + { 0xDCAB, 0x976E }, + { 0xDCAC, 0x9807 }, + { 0xDCAD, 0x98A9 }, + { 0xDCAE, 0x98EB }, + { 0xDCAF, 0x9CE6 }, + { 0xDCB0, 0x9EF9 }, + { 0xDCB1, 0x4E83 }, + { 0xDCB2, 0x4E84 }, + { 0xDCB3, 0x4EB6 }, + { 0xDCB4, 0x50BD }, + { 0xDCB5, 0x50BF }, + { 0xDCB6, 0x50C6 }, + { 0xDCB7, 0x50AE }, + { 0xDCB8, 0x50C4 }, + { 0xDCB9, 0x50CA }, + { 0xDCBA, 0x50B4 }, + { 0xDCBB, 0x50C8 }, + { 0xDCBC, 0x50C2 }, + { 0xDCBD, 0x50B0 }, + { 0xDCBE, 0x50C1 }, + { 0xDCBF, 0x50BA }, + { 0xDCC0, 0x50B1 }, + { 0xDCC1, 0x50CB }, + { 0xDCC2, 0x50C9 }, + { 0xDCC3, 0x50B6 }, + { 0xDCC4, 0x50B8 }, + { 0xDCC5, 0x51D7 }, + { 0xDCC6, 0x527A }, + { 0xDCC7, 0x5278 }, + { 0xDCC8, 0x527B }, + { 0xDCC9, 0x527C }, + { 0xDCCA, 0x55C3 }, + { 0xDCCB, 0x55DB }, + { 0xDCCC, 0x55CC }, + { 0xDCCD, 0x55D0 }, + { 0xDCCE, 0x55CB }, + { 0xDCCF, 0x55CA }, + { 0xDCD0, 0x55DD }, + { 0xDCD1, 0x55C0 }, + { 0xDCD2, 0x55D4 }, + { 0xDCD3, 0x55C4 }, + { 0xDCD4, 0x55E9 }, + { 0xDCD5, 0x55BF }, + { 0xDCD6, 0x55D2 }, + { 0xDCD7, 0x558D }, + { 0xDCD8, 0x55CF }, + { 0xDCD9, 0x55D5 }, + { 0xDCDA, 0x55E2 }, + { 0xDCDB, 0x55D6 }, + { 0xDCDC, 0x55C8 }, + { 0xDCDD, 0x55F2 }, + { 0xDCDE, 0x55CD }, + { 0xDCDF, 0x55D9 }, + { 0xDCE0, 0x55C2 }, + { 0xDCE1, 0x5714 }, + { 0xDCE2, 0x5853 }, + { 0xDCE3, 0x5868 }, + { 0xDCE4, 0x5864 }, + { 0xDCE5, 0x584F }, + { 0xDCE6, 0x584D }, + { 0xDCE7, 0x5849 }, + { 0xDCE8, 0x586F }, + { 0xDCE9, 0x5855 }, + { 0xDCEA, 0x584E }, + { 0xDCEB, 0x585D }, + { 0xDCEC, 0x5859 }, + { 0xDCED, 0x5865 }, + { 0xDCEE, 0x585B }, + { 0xDCEF, 0x583D }, + { 0xDCF0, 0x5863 }, + { 0xDCF1, 0x5871 }, + { 0xDCF2, 0x58FC }, + { 0xDCF3, 0x5AC7 }, + { 0xDCF4, 0x5AC4 }, + { 0xDCF5, 0x5ACB }, + { 0xDCF6, 0x5ABA }, + { 0xDCF7, 0x5AB8 }, + { 0xDCF8, 0x5AB1 }, + { 0xDCF9, 0x5AB5 }, + { 0xDCFA, 0x5AB0 }, + { 0xDCFB, 0x5ABF }, + { 0xDCFC, 0x5AC8 }, + { 0xDCFD, 0x5ABB }, + { 0xDCFE, 0x5AC6 }, + { 0xDD40, 0x5AB7 }, + { 0xDD41, 0x5AC0 }, + { 0xDD42, 0x5ACA }, + { 0xDD43, 0x5AB4 }, + { 0xDD44, 0x5AB6 }, + { 0xDD45, 0x5ACD }, + { 0xDD46, 0x5AB9 }, + { 0xDD47, 0x5A90 }, + { 0xDD48, 0x5BD6 }, + { 0xDD49, 0x5BD8 }, + { 0xDD4A, 0x5BD9 }, + { 0xDD4B, 0x5C1F }, + { 0xDD4C, 0x5C33 }, + { 0xDD4D, 0x5D71 }, + { 0xDD4E, 0x5D63 }, + { 0xDD4F, 0x5D4A }, + { 0xDD50, 0x5D65 }, + { 0xDD51, 0x5D72 }, + { 0xDD52, 0x5D6C }, + { 0xDD53, 0x5D5E }, + { 0xDD54, 0x5D68 }, + { 0xDD55, 0x5D67 }, + { 0xDD56, 0x5D62 }, + { 0xDD57, 0x5DF0 }, + { 0xDD58, 0x5E4F }, + { 0xDD59, 0x5E4E }, + { 0xDD5A, 0x5E4A }, + { 0xDD5B, 0x5E4D }, + { 0xDD5C, 0x5E4B }, + { 0xDD5D, 0x5EC5 }, + { 0xDD5E, 0x5ECC }, + { 0xDD5F, 0x5EC6 }, + { 0xDD60, 0x5ECB }, + { 0xDD61, 0x5EC7 }, + { 0xDD62, 0x5F40 }, + { 0xDD63, 0x5FAF }, + { 0xDD64, 0x5FAD }, + { 0xDD65, 0x60F7 }, + { 0xDD66, 0x6149 }, + { 0xDD67, 0x614A }, + { 0xDD68, 0x612B }, + { 0xDD69, 0x6145 }, + { 0xDD6A, 0x6136 }, + { 0xDD6B, 0x6132 }, + { 0xDD6C, 0x612E }, + { 0xDD6D, 0x6146 }, + { 0xDD6E, 0x612F }, + { 0xDD6F, 0x614F }, + { 0xDD70, 0x6129 }, + { 0xDD71, 0x6140 }, + { 0xDD72, 0x6220 }, + { 0xDD73, 0x9168 }, + { 0xDD74, 0x6223 }, + { 0xDD75, 0x6225 }, + { 0xDD76, 0x6224 }, + { 0xDD77, 0x63C5 }, + { 0xDD78, 0x63F1 }, + { 0xDD79, 0x63EB }, + { 0xDD7A, 0x6410 }, + { 0xDD7B, 0x6412 }, + { 0xDD7C, 0x6409 }, + { 0xDD7D, 0x6420 }, + { 0xDD7E, 0x6424 }, + { 0xDDA1, 0x6433 }, + { 0xDDA2, 0x6443 }, + { 0xDDA3, 0x641F }, + { 0xDDA4, 0x6415 }, + { 0xDDA5, 0x6418 }, + { 0xDDA6, 0x6439 }, + { 0xDDA7, 0x6437 }, + { 0xDDA8, 0x6422 }, + { 0xDDA9, 0x6423 }, + { 0xDDAA, 0x640C }, + { 0xDDAB, 0x6426 }, + { 0xDDAC, 0x6430 }, + { 0xDDAD, 0x6428 }, + { 0xDDAE, 0x6441 }, + { 0xDDAF, 0x6435 }, + { 0xDDB0, 0x642F }, + { 0xDDB1, 0x640A }, + { 0xDDB2, 0x641A }, + { 0xDDB3, 0x6440 }, + { 0xDDB4, 0x6425 }, + { 0xDDB5, 0x6427 }, + { 0xDDB6, 0x640B }, + { 0xDDB7, 0x63E7 }, + { 0xDDB8, 0x641B }, + { 0xDDB9, 0x642E }, + { 0xDDBA, 0x6421 }, + { 0xDDBB, 0x640E }, + { 0xDDBC, 0x656F }, + { 0xDDBD, 0x6592 }, + { 0xDDBE, 0x65D3 }, + { 0xDDBF, 0x6686 }, + { 0xDDC0, 0x668C }, + { 0xDDC1, 0x6695 }, + { 0xDDC2, 0x6690 }, + { 0xDDC3, 0x668B }, + { 0xDDC4, 0x668A }, + { 0xDDC5, 0x6699 }, + { 0xDDC6, 0x6694 }, + { 0xDDC7, 0x6678 }, + { 0xDDC8, 0x6720 }, + { 0xDDC9, 0x6966 }, + { 0xDDCA, 0x695F }, + { 0xDDCB, 0x6938 }, + { 0xDDCC, 0x694E }, + { 0xDDCD, 0x6962 }, + { 0xDDCE, 0x6971 }, + { 0xDDCF, 0x693F }, + { 0xDDD0, 0x6945 }, + { 0xDDD1, 0x696A }, + { 0xDDD2, 0x6939 }, + { 0xDDD3, 0x6942 }, + { 0xDDD4, 0x6957 }, + { 0xDDD5, 0x6959 }, + { 0xDDD6, 0x697A }, + { 0xDDD7, 0x6948 }, + { 0xDDD8, 0x6949 }, + { 0xDDD9, 0x6935 }, + { 0xDDDA, 0x696C }, + { 0xDDDB, 0x6933 }, + { 0xDDDC, 0x693D }, + { 0xDDDD, 0x6965 }, + { 0xDDDE, 0x68F0 }, + { 0xDDDF, 0x6978 }, + { 0xDDE0, 0x6934 }, + { 0xDDE1, 0x6969 }, + { 0xDDE2, 0x6940 }, + { 0xDDE3, 0x696F }, + { 0xDDE4, 0x6944 }, + { 0xDDE5, 0x6976 }, + { 0xDDE6, 0x6958 }, + { 0xDDE7, 0x6941 }, + { 0xDDE8, 0x6974 }, + { 0xDDE9, 0x694C }, + { 0xDDEA, 0x693B }, + { 0xDDEB, 0x694B }, + { 0xDDEC, 0x6937 }, + { 0xDDED, 0x695C }, + { 0xDDEE, 0x694F }, + { 0xDDEF, 0x6951 }, + { 0xDDF0, 0x6932 }, + { 0xDDF1, 0x6952 }, + { 0xDDF2, 0x692F }, + { 0xDDF3, 0x697B }, + { 0xDDF4, 0x693C }, + { 0xDDF5, 0x6B46 }, + { 0xDDF6, 0x6B45 }, + { 0xDDF7, 0x6B43 }, + { 0xDDF8, 0x6B42 }, + { 0xDDF9, 0x6B48 }, + { 0xDDFA, 0x6B41 }, + { 0xDDFB, 0x6B9B }, + { 0xDDFC, 0xFA0D }, + { 0xDDFD, 0x6BFB }, + { 0xDDFE, 0x6BFC }, + { 0xDE40, 0x6BF9 }, + { 0xDE41, 0x6BF7 }, + { 0xDE42, 0x6BF8 }, + { 0xDE43, 0x6E9B }, + { 0xDE44, 0x6ED6 }, + { 0xDE45, 0x6EC8 }, + { 0xDE46, 0x6E8F }, + { 0xDE47, 0x6EC0 }, + { 0xDE48, 0x6E9F }, + { 0xDE49, 0x6E93 }, + { 0xDE4A, 0x6E94 }, + { 0xDE4B, 0x6EA0 }, + { 0xDE4C, 0x6EB1 }, + { 0xDE4D, 0x6EB9 }, + { 0xDE4E, 0x6EC6 }, + { 0xDE4F, 0x6ED2 }, + { 0xDE50, 0x6EBD }, + { 0xDE51, 0x6EC1 }, + { 0xDE52, 0x6E9E }, + { 0xDE53, 0x6EC9 }, + { 0xDE54, 0x6EB7 }, + { 0xDE55, 0x6EB0 }, + { 0xDE56, 0x6ECD }, + { 0xDE57, 0x6EA6 }, + { 0xDE58, 0x6ECF }, + { 0xDE59, 0x6EB2 }, + { 0xDE5A, 0x6EBE }, + { 0xDE5B, 0x6EC3 }, + { 0xDE5C, 0x6EDC }, + { 0xDE5D, 0x6ED8 }, + { 0xDE5E, 0x6E99 }, + { 0xDE5F, 0x6E92 }, + { 0xDE60, 0x6E8E }, + { 0xDE61, 0x6E8D }, + { 0xDE62, 0x6EA4 }, + { 0xDE63, 0x6EA1 }, + { 0xDE64, 0x6EBF }, + { 0xDE65, 0x6EB3 }, + { 0xDE66, 0x6ED0 }, + { 0xDE67, 0x6ECA }, + { 0xDE68, 0x6E97 }, + { 0xDE69, 0x6EAE }, + { 0xDE6A, 0x6EA3 }, + { 0xDE6B, 0x7147 }, + { 0xDE6C, 0x7154 }, + { 0xDE6D, 0x7152 }, + { 0xDE6E, 0x7163 }, + { 0xDE6F, 0x7160 }, + { 0xDE70, 0x7141 }, + { 0xDE71, 0x715D }, + { 0xDE72, 0x7162 }, + { 0xDE73, 0x7172 }, + { 0xDE74, 0x7178 }, + { 0xDE75, 0x716A }, + { 0xDE76, 0x7161 }, + { 0xDE77, 0x7142 }, + { 0xDE78, 0x7158 }, + { 0xDE79, 0x7143 }, + { 0xDE7A, 0x714B }, + { 0xDE7B, 0x7170 }, + { 0xDE7C, 0x715F }, + { 0xDE7D, 0x7150 }, + { 0xDE7E, 0x7153 }, + { 0xDEA1, 0x7144 }, + { 0xDEA2, 0x714D }, + { 0xDEA3, 0x715A }, + { 0xDEA4, 0x724F }, + { 0xDEA5, 0x728D }, + { 0xDEA6, 0x728C }, + { 0xDEA7, 0x7291 }, + { 0xDEA8, 0x7290 }, + { 0xDEA9, 0x728E }, + { 0xDEAA, 0x733C }, + { 0xDEAB, 0x7342 }, + { 0xDEAC, 0x733B }, + { 0xDEAD, 0x733A }, + { 0xDEAE, 0x7340 }, + { 0xDEAF, 0x734A }, + { 0xDEB0, 0x7349 }, + { 0xDEB1, 0x7444 }, + { 0xDEB2, 0x744A }, + { 0xDEB3, 0x744B }, + { 0xDEB4, 0x7452 }, + { 0xDEB5, 0x7451 }, + { 0xDEB6, 0x7457 }, + { 0xDEB7, 0x7440 }, + { 0xDEB8, 0x744F }, + { 0xDEB9, 0x7450 }, + { 0xDEBA, 0x744E }, + { 0xDEBB, 0x7442 }, + { 0xDEBC, 0x7446 }, + { 0xDEBD, 0x744D }, + { 0xDEBE, 0x7454 }, + { 0xDEBF, 0x74E1 }, + { 0xDEC0, 0x74FF }, + { 0xDEC1, 0x74FE }, + { 0xDEC2, 0x74FD }, + { 0xDEC3, 0x751D }, + { 0xDEC4, 0x7579 }, + { 0xDEC5, 0x7577 }, + { 0xDEC6, 0x6983 }, + { 0xDEC7, 0x75EF }, + { 0xDEC8, 0x760F }, + { 0xDEC9, 0x7603 }, + { 0xDECA, 0x75F7 }, + { 0xDECB, 0x75FE }, + { 0xDECC, 0x75FC }, + { 0xDECD, 0x75F9 }, + { 0xDECE, 0x75F8 }, + { 0xDECF, 0x7610 }, + { 0xDED0, 0x75FB }, + { 0xDED1, 0x75F6 }, + { 0xDED2, 0x75ED }, + { 0xDED3, 0x75F5 }, + { 0xDED4, 0x75FD }, + { 0xDED5, 0x7699 }, + { 0xDED6, 0x76B5 }, + { 0xDED7, 0x76DD }, + { 0xDED8, 0x7755 }, + { 0xDED9, 0x775F }, + { 0xDEDA, 0x7760 }, + { 0xDEDB, 0x7752 }, + { 0xDEDC, 0x7756 }, + { 0xDEDD, 0x775A }, + { 0xDEDE, 0x7769 }, + { 0xDEDF, 0x7767 }, + { 0xDEE0, 0x7754 }, + { 0xDEE1, 0x7759 }, + { 0xDEE2, 0x776D }, + { 0xDEE3, 0x77E0 }, + { 0xDEE4, 0x7887 }, + { 0xDEE5, 0x789A }, + { 0xDEE6, 0x7894 }, + { 0xDEE7, 0x788F }, + { 0xDEE8, 0x7884 }, + { 0xDEE9, 0x7895 }, + { 0xDEEA, 0x7885 }, + { 0xDEEB, 0x7886 }, + { 0xDEEC, 0x78A1 }, + { 0xDEED, 0x7883 }, + { 0xDEEE, 0x7879 }, + { 0xDEEF, 0x7899 }, + { 0xDEF0, 0x7880 }, + { 0xDEF1, 0x7896 }, + { 0xDEF2, 0x787B }, + { 0xDEF3, 0x797C }, + { 0xDEF4, 0x7982 }, + { 0xDEF5, 0x797D }, + { 0xDEF6, 0x7979 }, + { 0xDEF7, 0x7A11 }, + { 0xDEF8, 0x7A18 }, + { 0xDEF9, 0x7A19 }, + { 0xDEFA, 0x7A12 }, + { 0xDEFB, 0x7A17 }, + { 0xDEFC, 0x7A15 }, + { 0xDEFD, 0x7A22 }, + { 0xDEFE, 0x7A13 }, + { 0xDF40, 0x7A1B }, + { 0xDF41, 0x7A10 }, + { 0xDF42, 0x7AA3 }, + { 0xDF43, 0x7AA2 }, + { 0xDF44, 0x7A9E }, + { 0xDF45, 0x7AEB }, + { 0xDF46, 0x7B66 }, + { 0xDF47, 0x7B64 }, + { 0xDF48, 0x7B6D }, + { 0xDF49, 0x7B74 }, + { 0xDF4A, 0x7B69 }, + { 0xDF4B, 0x7B72 }, + { 0xDF4C, 0x7B65 }, + { 0xDF4D, 0x7B73 }, + { 0xDF4E, 0x7B71 }, + { 0xDF4F, 0x7B70 }, + { 0xDF50, 0x7B61 }, + { 0xDF51, 0x7B78 }, + { 0xDF52, 0x7B76 }, + { 0xDF53, 0x7B63 }, + { 0xDF54, 0x7CB2 }, + { 0xDF55, 0x7CB4 }, + { 0xDF56, 0x7CAF }, + { 0xDF57, 0x7D88 }, + { 0xDF58, 0x7D86 }, + { 0xDF59, 0x7D80 }, + { 0xDF5A, 0x7D8D }, + { 0xDF5B, 0x7D7F }, + { 0xDF5C, 0x7D85 }, + { 0xDF5D, 0x7D7A }, + { 0xDF5E, 0x7D8E }, + { 0xDF5F, 0x7D7B }, + { 0xDF60, 0x7D83 }, + { 0xDF61, 0x7D7C }, + { 0xDF62, 0x7D8C }, + { 0xDF63, 0x7D94 }, + { 0xDF64, 0x7D84 }, + { 0xDF65, 0x7D7D }, + { 0xDF66, 0x7D92 }, + { 0xDF67, 0x7F6D }, + { 0xDF68, 0x7F6B }, + { 0xDF69, 0x7F67 }, + { 0xDF6A, 0x7F68 }, + { 0xDF6B, 0x7F6C }, + { 0xDF6C, 0x7FA6 }, + { 0xDF6D, 0x7FA5 }, + { 0xDF6E, 0x7FA7 }, + { 0xDF6F, 0x7FDB }, + { 0xDF70, 0x7FDC }, + { 0xDF71, 0x8021 }, + { 0xDF72, 0x8164 }, + { 0xDF73, 0x8160 }, + { 0xDF74, 0x8177 }, + { 0xDF75, 0x815C }, + { 0xDF76, 0x8169 }, + { 0xDF77, 0x815B }, + { 0xDF78, 0x8162 }, + { 0xDF79, 0x8172 }, + { 0xDF7A, 0x6721 }, + { 0xDF7B, 0x815E }, + { 0xDF7C, 0x8176 }, + { 0xDF7D, 0x8167 }, + { 0xDF7E, 0x816F }, + { 0xDFA1, 0x8144 }, + { 0xDFA2, 0x8161 }, + { 0xDFA3, 0x821D }, + { 0xDFA4, 0x8249 }, + { 0xDFA5, 0x8244 }, + { 0xDFA6, 0x8240 }, + { 0xDFA7, 0x8242 }, + { 0xDFA8, 0x8245 }, + { 0xDFA9, 0x84F1 }, + { 0xDFAA, 0x843F }, + { 0xDFAB, 0x8456 }, + { 0xDFAC, 0x8476 }, + { 0xDFAD, 0x8479 }, + { 0xDFAE, 0x848F }, + { 0xDFAF, 0x848D }, + { 0xDFB0, 0x8465 }, + { 0xDFB1, 0x8451 }, + { 0xDFB2, 0x8440 }, + { 0xDFB3, 0x8486 }, + { 0xDFB4, 0x8467 }, + { 0xDFB5, 0x8430 }, + { 0xDFB6, 0x844D }, + { 0xDFB7, 0x847D }, + { 0xDFB8, 0x845A }, + { 0xDFB9, 0x8459 }, + { 0xDFBA, 0x8474 }, + { 0xDFBB, 0x8473 }, + { 0xDFBC, 0x845D }, + { 0xDFBD, 0x8507 }, + { 0xDFBE, 0x845E }, + { 0xDFBF, 0x8437 }, + { 0xDFC0, 0x843A }, + { 0xDFC1, 0x8434 }, + { 0xDFC2, 0x847A }, + { 0xDFC3, 0x8443 }, + { 0xDFC4, 0x8478 }, + { 0xDFC5, 0x8432 }, + { 0xDFC6, 0x8445 }, + { 0xDFC7, 0x8429 }, + { 0xDFC8, 0x83D9 }, + { 0xDFC9, 0x844B }, + { 0xDFCA, 0x842F }, + { 0xDFCB, 0x8442 }, + { 0xDFCC, 0x842D }, + { 0xDFCD, 0x845F }, + { 0xDFCE, 0x8470 }, + { 0xDFCF, 0x8439 }, + { 0xDFD0, 0x844E }, + { 0xDFD1, 0x844C }, + { 0xDFD2, 0x8452 }, + { 0xDFD3, 0x846F }, + { 0xDFD4, 0x84C5 }, + { 0xDFD5, 0x848E }, + { 0xDFD6, 0x843B }, + { 0xDFD7, 0x8447 }, + { 0xDFD8, 0x8436 }, + { 0xDFD9, 0x8433 }, + { 0xDFDA, 0x8468 }, + { 0xDFDB, 0x847E }, + { 0xDFDC, 0x8444 }, + { 0xDFDD, 0x842B }, + { 0xDFDE, 0x8460 }, + { 0xDFDF, 0x8454 }, + { 0xDFE0, 0x846E }, + { 0xDFE1, 0x8450 }, + { 0xDFE2, 0x870B }, + { 0xDFE3, 0x8704 }, + { 0xDFE4, 0x86F7 }, + { 0xDFE5, 0x870C }, + { 0xDFE6, 0x86FA }, + { 0xDFE7, 0x86D6 }, + { 0xDFE8, 0x86F5 }, + { 0xDFE9, 0x874D }, + { 0xDFEA, 0x86F8 }, + { 0xDFEB, 0x870E }, + { 0xDFEC, 0x8709 }, + { 0xDFED, 0x8701 }, + { 0xDFEE, 0x86F6 }, + { 0xDFEF, 0x870D }, + { 0xDFF0, 0x8705 }, + { 0xDFF1, 0x88D6 }, + { 0xDFF2, 0x88CB }, + { 0xDFF3, 0x88CD }, + { 0xDFF4, 0x88CE }, + { 0xDFF5, 0x88DE }, + { 0xDFF6, 0x88DB }, + { 0xDFF7, 0x88DA }, + { 0xDFF8, 0x88CC }, + { 0xDFF9, 0x88D0 }, + { 0xDFFA, 0x8985 }, + { 0xDFFB, 0x899B }, + { 0xDFFC, 0x89DF }, + { 0xDFFD, 0x89E5 }, + { 0xDFFE, 0x89E4 }, + { 0xE040, 0x89E1 }, + { 0xE041, 0x89E0 }, + { 0xE042, 0x89E2 }, + { 0xE043, 0x89DC }, + { 0xE044, 0x89E6 }, + { 0xE045, 0x8A76 }, + { 0xE046, 0x8A86 }, + { 0xE047, 0x8A7F }, + { 0xE048, 0x8A61 }, + { 0xE049, 0x8A3F }, + { 0xE04A, 0x8A77 }, + { 0xE04B, 0x8A82 }, + { 0xE04C, 0x8A84 }, + { 0xE04D, 0x8A75 }, + { 0xE04E, 0x8A83 }, + { 0xE04F, 0x8A81 }, + { 0xE050, 0x8A74 }, + { 0xE051, 0x8A7A }, + { 0xE052, 0x8C3C }, + { 0xE053, 0x8C4B }, + { 0xE054, 0x8C4A }, + { 0xE055, 0x8C65 }, + { 0xE056, 0x8C64 }, + { 0xE057, 0x8C66 }, + { 0xE058, 0x8C86 }, + { 0xE059, 0x8C84 }, + { 0xE05A, 0x8C85 }, + { 0xE05B, 0x8CCC }, + { 0xE05C, 0x8D68 }, + { 0xE05D, 0x8D69 }, + { 0xE05E, 0x8D91 }, + { 0xE05F, 0x8D8C }, + { 0xE060, 0x8D8E }, + { 0xE061, 0x8D8F }, + { 0xE062, 0x8D8D }, + { 0xE063, 0x8D93 }, + { 0xE064, 0x8D94 }, + { 0xE065, 0x8D90 }, + { 0xE066, 0x8D92 }, + { 0xE067, 0x8DF0 }, + { 0xE068, 0x8DE0 }, + { 0xE069, 0x8DEC }, + { 0xE06A, 0x8DF1 }, + { 0xE06B, 0x8DEE }, + { 0xE06C, 0x8DD0 }, + { 0xE06D, 0x8DE9 }, + { 0xE06E, 0x8DE3 }, + { 0xE06F, 0x8DE2 }, + { 0xE070, 0x8DE7 }, + { 0xE071, 0x8DF2 }, + { 0xE072, 0x8DEB }, + { 0xE073, 0x8DF4 }, + { 0xE074, 0x8F06 }, + { 0xE075, 0x8EFF }, + { 0xE076, 0x8F01 }, + { 0xE077, 0x8F00 }, + { 0xE078, 0x8F05 }, + { 0xE079, 0x8F07 }, + { 0xE07A, 0x8F08 }, + { 0xE07B, 0x8F02 }, + { 0xE07C, 0x8F0B }, + { 0xE07D, 0x9052 }, + { 0xE07E, 0x903F }, + { 0xE0A1, 0x9044 }, + { 0xE0A2, 0x9049 }, + { 0xE0A3, 0x903D }, + { 0xE0A4, 0x9110 }, + { 0xE0A5, 0x910D }, + { 0xE0A6, 0x910F }, + { 0xE0A7, 0x9111 }, + { 0xE0A8, 0x9116 }, + { 0xE0A9, 0x9114 }, + { 0xE0AA, 0x910B }, + { 0xE0AB, 0x910E }, + { 0xE0AC, 0x916E }, + { 0xE0AD, 0x916F }, + { 0xE0AE, 0x9248 }, + { 0xE0AF, 0x9252 }, + { 0xE0B0, 0x9230 }, + { 0xE0B1, 0x923A }, + { 0xE0B2, 0x9266 }, + { 0xE0B3, 0x9233 }, + { 0xE0B4, 0x9265 }, + { 0xE0B5, 0x925E }, + { 0xE0B6, 0x9283 }, + { 0xE0B7, 0x922E }, + { 0xE0B8, 0x924A }, + { 0xE0B9, 0x9246 }, + { 0xE0BA, 0x926D }, + { 0xE0BB, 0x926C }, + { 0xE0BC, 0x924F }, + { 0xE0BD, 0x9260 }, + { 0xE0BE, 0x9267 }, + { 0xE0BF, 0x926F }, + { 0xE0C0, 0x9236 }, + { 0xE0C1, 0x9261 }, + { 0xE0C2, 0x9270 }, + { 0xE0C3, 0x9231 }, + { 0xE0C4, 0x9254 }, + { 0xE0C5, 0x9263 }, + { 0xE0C6, 0x9250 }, + { 0xE0C7, 0x9272 }, + { 0xE0C8, 0x924E }, + { 0xE0C9, 0x9253 }, + { 0xE0CA, 0x924C }, + { 0xE0CB, 0x9256 }, + { 0xE0CC, 0x9232 }, + { 0xE0CD, 0x959F }, + { 0xE0CE, 0x959C }, + { 0xE0CF, 0x959E }, + { 0xE0D0, 0x959B }, + { 0xE0D1, 0x9692 }, + { 0xE0D2, 0x9693 }, + { 0xE0D3, 0x9691 }, + { 0xE0D4, 0x9697 }, + { 0xE0D5, 0x96CE }, + { 0xE0D6, 0x96FA }, + { 0xE0D7, 0x96FD }, + { 0xE0D8, 0x96F8 }, + { 0xE0D9, 0x96F5 }, + { 0xE0DA, 0x9773 }, + { 0xE0DB, 0x9777 }, + { 0xE0DC, 0x9778 }, + { 0xE0DD, 0x9772 }, + { 0xE0DE, 0x980F }, + { 0xE0DF, 0x980D }, + { 0xE0E0, 0x980E }, + { 0xE0E1, 0x98AC }, + { 0xE0E2, 0x98F6 }, + { 0xE0E3, 0x98F9 }, + { 0xE0E4, 0x99AF }, + { 0xE0E5, 0x99B2 }, + { 0xE0E6, 0x99B0 }, + { 0xE0E7, 0x99B5 }, + { 0xE0E8, 0x9AAD }, + { 0xE0E9, 0x9AAB }, + { 0xE0EA, 0x9B5B }, + { 0xE0EB, 0x9CEA }, + { 0xE0EC, 0x9CED }, + { 0xE0ED, 0x9CE7 }, + { 0xE0EE, 0x9E80 }, + { 0xE0EF, 0x9EFD }, + { 0xE0F0, 0x50E6 }, + { 0xE0F1, 0x50D4 }, + { 0xE0F2, 0x50D7 }, + { 0xE0F3, 0x50E8 }, + { 0xE0F4, 0x50F3 }, + { 0xE0F5, 0x50DB }, + { 0xE0F6, 0x50EA }, + { 0xE0F7, 0x50DD }, + { 0xE0F8, 0x50E4 }, + { 0xE0F9, 0x50D3 }, + { 0xE0FA, 0x50EC }, + { 0xE0FB, 0x50F0 }, + { 0xE0FC, 0x50EF }, + { 0xE0FD, 0x50E3 }, + { 0xE0FE, 0x50E0 }, + { 0xE140, 0x51D8 }, + { 0xE141, 0x5280 }, + { 0xE142, 0x5281 }, + { 0xE143, 0x52E9 }, + { 0xE144, 0x52EB }, + { 0xE145, 0x5330 }, + { 0xE146, 0x53AC }, + { 0xE147, 0x5627 }, + { 0xE148, 0x5615 }, + { 0xE149, 0x560C }, + { 0xE14A, 0x5612 }, + { 0xE14B, 0x55FC }, + { 0xE14C, 0x560F }, + { 0xE14D, 0x561C }, + { 0xE14E, 0x5601 }, + { 0xE14F, 0x5613 }, + { 0xE150, 0x5602 }, + { 0xE151, 0x55FA }, + { 0xE152, 0x561D }, + { 0xE153, 0x5604 }, + { 0xE154, 0x55FF }, + { 0xE155, 0x55F9 }, + { 0xE156, 0x5889 }, + { 0xE157, 0x587C }, + { 0xE158, 0x5890 }, + { 0xE159, 0x5898 }, + { 0xE15A, 0x5886 }, + { 0xE15B, 0x5881 }, + { 0xE15C, 0x587F }, + { 0xE15D, 0x5874 }, + { 0xE15E, 0x588B }, + { 0xE15F, 0x587A }, + { 0xE160, 0x5887 }, + { 0xE161, 0x5891 }, + { 0xE162, 0x588E }, + { 0xE163, 0x5876 }, + { 0xE164, 0x5882 }, + { 0xE165, 0x5888 }, + { 0xE166, 0x587B }, + { 0xE167, 0x5894 }, + { 0xE168, 0x588F }, + { 0xE169, 0x58FE }, + { 0xE16A, 0x596B }, + { 0xE16B, 0x5ADC }, + { 0xE16C, 0x5AEE }, + { 0xE16D, 0x5AE5 }, + { 0xE16E, 0x5AD5 }, + { 0xE16F, 0x5AEA }, + { 0xE170, 0x5ADA }, + { 0xE171, 0x5AED }, + { 0xE172, 0x5AEB }, + { 0xE173, 0x5AF3 }, + { 0xE174, 0x5AE2 }, + { 0xE175, 0x5AE0 }, + { 0xE176, 0x5ADB }, + { 0xE177, 0x5AEC }, + { 0xE178, 0x5ADE }, + { 0xE179, 0x5ADD }, + { 0xE17A, 0x5AD9 }, + { 0xE17B, 0x5AE8 }, + { 0xE17C, 0x5ADF }, + { 0xE17D, 0x5B77 }, + { 0xE17E, 0x5BE0 }, + { 0xE1A1, 0x5BE3 }, + { 0xE1A2, 0x5C63 }, + { 0xE1A3, 0x5D82 }, + { 0xE1A4, 0x5D80 }, + { 0xE1A5, 0x5D7D }, + { 0xE1A6, 0x5D86 }, + { 0xE1A7, 0x5D7A }, + { 0xE1A8, 0x5D81 }, + { 0xE1A9, 0x5D77 }, + { 0xE1AA, 0x5D8A }, + { 0xE1AB, 0x5D89 }, + { 0xE1AC, 0x5D88 }, + { 0xE1AD, 0x5D7E }, + { 0xE1AE, 0x5D7C }, + { 0xE1AF, 0x5D8D }, + { 0xE1B0, 0x5D79 }, + { 0xE1B1, 0x5D7F }, + { 0xE1B2, 0x5E58 }, + { 0xE1B3, 0x5E59 }, + { 0xE1B4, 0x5E53 }, + { 0xE1B5, 0x5ED8 }, + { 0xE1B6, 0x5ED1 }, + { 0xE1B7, 0x5ED7 }, + { 0xE1B8, 0x5ECE }, + { 0xE1B9, 0x5EDC }, + { 0xE1BA, 0x5ED5 }, + { 0xE1BB, 0x5ED9 }, + { 0xE1BC, 0x5ED2 }, + { 0xE1BD, 0x5ED4 }, + { 0xE1BE, 0x5F44 }, + { 0xE1BF, 0x5F43 }, + { 0xE1C0, 0x5F6F }, + { 0xE1C1, 0x5FB6 }, + { 0xE1C2, 0x612C }, + { 0xE1C3, 0x6128 }, + { 0xE1C4, 0x6141 }, + { 0xE1C5, 0x615E }, + { 0xE1C6, 0x6171 }, + { 0xE1C7, 0x6173 }, + { 0xE1C8, 0x6152 }, + { 0xE1C9, 0x6153 }, + { 0xE1CA, 0x6172 }, + { 0xE1CB, 0x616C }, + { 0xE1CC, 0x6180 }, + { 0xE1CD, 0x6174 }, + { 0xE1CE, 0x6154 }, + { 0xE1CF, 0x617A }, + { 0xE1D0, 0x615B }, + { 0xE1D1, 0x6165 }, + { 0xE1D2, 0x613B }, + { 0xE1D3, 0x616A }, + { 0xE1D4, 0x6161 }, + { 0xE1D5, 0x6156 }, + { 0xE1D6, 0x6229 }, + { 0xE1D7, 0x6227 }, + { 0xE1D8, 0x622B }, + { 0xE1D9, 0x642B }, + { 0xE1DA, 0x644D }, + { 0xE1DB, 0x645B }, + { 0xE1DC, 0x645D }, + { 0xE1DD, 0x6474 }, + { 0xE1DE, 0x6476 }, + { 0xE1DF, 0x6472 }, + { 0xE1E0, 0x6473 }, + { 0xE1E1, 0x647D }, + { 0xE1E2, 0x6475 }, + { 0xE1E3, 0x6466 }, + { 0xE1E4, 0x64A6 }, + { 0xE1E5, 0x644E }, + { 0xE1E6, 0x6482 }, + { 0xE1E7, 0x645E }, + { 0xE1E8, 0x645C }, + { 0xE1E9, 0x644B }, + { 0xE1EA, 0x6453 }, + { 0xE1EB, 0x6460 }, + { 0xE1EC, 0x6450 }, + { 0xE1ED, 0x647F }, + { 0xE1EE, 0x643F }, + { 0xE1EF, 0x646C }, + { 0xE1F0, 0x646B }, + { 0xE1F1, 0x6459 }, + { 0xE1F2, 0x6465 }, + { 0xE1F3, 0x6477 }, + { 0xE1F4, 0x6573 }, + { 0xE1F5, 0x65A0 }, + { 0xE1F6, 0x66A1 }, + { 0xE1F7, 0x66A0 }, + { 0xE1F8, 0x669F }, + { 0xE1F9, 0x6705 }, + { 0xE1FA, 0x6704 }, + { 0xE1FB, 0x6722 }, + { 0xE1FC, 0x69B1 }, + { 0xE1FD, 0x69B6 }, + { 0xE1FE, 0x69C9 }, + { 0xE240, 0x69A0 }, + { 0xE241, 0x69CE }, + { 0xE242, 0x6996 }, + { 0xE243, 0x69B0 }, + { 0xE244, 0x69AC }, + { 0xE245, 0x69BC }, + { 0xE246, 0x6991 }, + { 0xE247, 0x6999 }, + { 0xE248, 0x698E }, + { 0xE249, 0x69A7 }, + { 0xE24A, 0x698D }, + { 0xE24B, 0x69A9 }, + { 0xE24C, 0x69BE }, + { 0xE24D, 0x69AF }, + { 0xE24E, 0x69BF }, + { 0xE24F, 0x69C4 }, + { 0xE250, 0x69BD }, + { 0xE251, 0x69A4 }, + { 0xE252, 0x69D4 }, + { 0xE253, 0x69B9 }, + { 0xE254, 0x69CA }, + { 0xE255, 0x699A }, + { 0xE256, 0x69CF }, + { 0xE257, 0x69B3 }, + { 0xE258, 0x6993 }, + { 0xE259, 0x69AA }, + { 0xE25A, 0x69A1 }, + { 0xE25B, 0x699E }, + { 0xE25C, 0x69D9 }, + { 0xE25D, 0x6997 }, + { 0xE25E, 0x6990 }, + { 0xE25F, 0x69C2 }, + { 0xE260, 0x69B5 }, + { 0xE261, 0x69A5 }, + { 0xE262, 0x69C6 }, + { 0xE263, 0x6B4A }, + { 0xE264, 0x6B4D }, + { 0xE265, 0x6B4B }, + { 0xE266, 0x6B9E }, + { 0xE267, 0x6B9F }, + { 0xE268, 0x6BA0 }, + { 0xE269, 0x6BC3 }, + { 0xE26A, 0x6BC4 }, + { 0xE26B, 0x6BFE }, + { 0xE26C, 0x6ECE }, + { 0xE26D, 0x6EF5 }, + { 0xE26E, 0x6EF1 }, + { 0xE26F, 0x6F03 }, + { 0xE270, 0x6F25 }, + { 0xE271, 0x6EF8 }, + { 0xE272, 0x6F37 }, + { 0xE273, 0x6EFB }, + { 0xE274, 0x6F2E }, + { 0xE275, 0x6F09 }, + { 0xE276, 0x6F4E }, + { 0xE277, 0x6F19 }, + { 0xE278, 0x6F1A }, + { 0xE279, 0x6F27 }, + { 0xE27A, 0x6F18 }, + { 0xE27B, 0x6F3B }, + { 0xE27C, 0x6F12 }, + { 0xE27D, 0x6EED }, + { 0xE27E, 0x6F0A }, + { 0xE2A1, 0x6F36 }, + { 0xE2A2, 0x6F73 }, + { 0xE2A3, 0x6EF9 }, + { 0xE2A4, 0x6EEE }, + { 0xE2A5, 0x6F2D }, + { 0xE2A6, 0x6F40 }, + { 0xE2A7, 0x6F30 }, + { 0xE2A8, 0x6F3C }, + { 0xE2A9, 0x6F35 }, + { 0xE2AA, 0x6EEB }, + { 0xE2AB, 0x6F07 }, + { 0xE2AC, 0x6F0E }, + { 0xE2AD, 0x6F43 }, + { 0xE2AE, 0x6F05 }, + { 0xE2AF, 0x6EFD }, + { 0xE2B0, 0x6EF6 }, + { 0xE2B1, 0x6F39 }, + { 0xE2B2, 0x6F1C }, + { 0xE2B3, 0x6EFC }, + { 0xE2B4, 0x6F3A }, + { 0xE2B5, 0x6F1F }, + { 0xE2B6, 0x6F0D }, + { 0xE2B7, 0x6F1E }, + { 0xE2B8, 0x6F08 }, + { 0xE2B9, 0x6F21 }, + { 0xE2BA, 0x7187 }, + { 0xE2BB, 0x7190 }, + { 0xE2BC, 0x7189 }, + { 0xE2BD, 0x7180 }, + { 0xE2BE, 0x7185 }, + { 0xE2BF, 0x7182 }, + { 0xE2C0, 0x718F }, + { 0xE2C1, 0x717B }, + { 0xE2C2, 0x7186 }, + { 0xE2C3, 0x7181 }, + { 0xE2C4, 0x7197 }, + { 0xE2C5, 0x7244 }, + { 0xE2C6, 0x7253 }, + { 0xE2C7, 0x7297 }, + { 0xE2C8, 0x7295 }, + { 0xE2C9, 0x7293 }, + { 0xE2CA, 0x7343 }, + { 0xE2CB, 0x734D }, + { 0xE2CC, 0x7351 }, + { 0xE2CD, 0x734C }, + { 0xE2CE, 0x7462 }, + { 0xE2CF, 0x7473 }, + { 0xE2D0, 0x7471 }, + { 0xE2D1, 0x7475 }, + { 0xE2D2, 0x7472 }, + { 0xE2D3, 0x7467 }, + { 0xE2D4, 0x746E }, + { 0xE2D5, 0x7500 }, + { 0xE2D6, 0x7502 }, + { 0xE2D7, 0x7503 }, + { 0xE2D8, 0x757D }, + { 0xE2D9, 0x7590 }, + { 0xE2DA, 0x7616 }, + { 0xE2DB, 0x7608 }, + { 0xE2DC, 0x760C }, + { 0xE2DD, 0x7615 }, + { 0xE2DE, 0x7611 }, + { 0xE2DF, 0x760A }, + { 0xE2E0, 0x7614 }, + { 0xE2E1, 0x76B8 }, + { 0xE2E2, 0x7781 }, + { 0xE2E3, 0x777C }, + { 0xE2E4, 0x7785 }, + { 0xE2E5, 0x7782 }, + { 0xE2E6, 0x776E }, + { 0xE2E7, 0x7780 }, + { 0xE2E8, 0x776F }, + { 0xE2E9, 0x777E }, + { 0xE2EA, 0x7783 }, + { 0xE2EB, 0x78B2 }, + { 0xE2EC, 0x78AA }, + { 0xE2ED, 0x78B4 }, + { 0xE2EE, 0x78AD }, + { 0xE2EF, 0x78A8 }, + { 0xE2F0, 0x787E }, + { 0xE2F1, 0x78AB }, + { 0xE2F2, 0x789E }, + { 0xE2F3, 0x78A5 }, + { 0xE2F4, 0x78A0 }, + { 0xE2F5, 0x78AC }, + { 0xE2F6, 0x78A2 }, + { 0xE2F7, 0x78A4 }, + { 0xE2F8, 0x7998 }, + { 0xE2F9, 0x798A }, + { 0xE2FA, 0x798B }, + { 0xE2FB, 0x7996 }, + { 0xE2FC, 0x7995 }, + { 0xE2FD, 0x7994 }, + { 0xE2FE, 0x7993 }, + { 0xE340, 0x7997 }, + { 0xE341, 0x7988 }, + { 0xE342, 0x7992 }, + { 0xE343, 0x7990 }, + { 0xE344, 0x7A2B }, + { 0xE345, 0x7A4A }, + { 0xE346, 0x7A30 }, + { 0xE347, 0x7A2F }, + { 0xE348, 0x7A28 }, + { 0xE349, 0x7A26 }, + { 0xE34A, 0x7AA8 }, + { 0xE34B, 0x7AAB }, + { 0xE34C, 0x7AAC }, + { 0xE34D, 0x7AEE }, + { 0xE34E, 0x7B88 }, + { 0xE34F, 0x7B9C }, + { 0xE350, 0x7B8A }, + { 0xE351, 0x7B91 }, + { 0xE352, 0x7B90 }, + { 0xE353, 0x7B96 }, + { 0xE354, 0x7B8D }, + { 0xE355, 0x7B8C }, + { 0xE356, 0x7B9B }, + { 0xE357, 0x7B8E }, + { 0xE358, 0x7B85 }, + { 0xE359, 0x7B98 }, + { 0xE35A, 0x5284 }, + { 0xE35B, 0x7B99 }, + { 0xE35C, 0x7BA4 }, + { 0xE35D, 0x7B82 }, + { 0xE35E, 0x7CBB }, + { 0xE35F, 0x7CBF }, + { 0xE360, 0x7CBC }, + { 0xE361, 0x7CBA }, + { 0xE362, 0x7DA7 }, + { 0xE363, 0x7DB7 }, + { 0xE364, 0x7DC2 }, + { 0xE365, 0x7DA3 }, + { 0xE366, 0x7DAA }, + { 0xE367, 0x7DC1 }, + { 0xE368, 0x7DC0 }, + { 0xE369, 0x7DC5 }, + { 0xE36A, 0x7D9D }, + { 0xE36B, 0x7DCE }, + { 0xE36C, 0x7DC4 }, + { 0xE36D, 0x7DC6 }, + { 0xE36E, 0x7DCB }, + { 0xE36F, 0x7DCC }, + { 0xE370, 0x7DAF }, + { 0xE371, 0x7DB9 }, + { 0xE372, 0x7D96 }, + { 0xE373, 0x7DBC }, + { 0xE374, 0x7D9F }, + { 0xE375, 0x7DA6 }, + { 0xE376, 0x7DAE }, + { 0xE377, 0x7DA9 }, + { 0xE378, 0x7DA1 }, + { 0xE379, 0x7DC9 }, + { 0xE37A, 0x7F73 }, + { 0xE37B, 0x7FE2 }, + { 0xE37C, 0x7FE3 }, + { 0xE37D, 0x7FE5 }, + { 0xE37E, 0x7FDE }, + { 0xE3A1, 0x8024 }, + { 0xE3A2, 0x805D }, + { 0xE3A3, 0x805C }, + { 0xE3A4, 0x8189 }, + { 0xE3A5, 0x8186 }, + { 0xE3A6, 0x8183 }, + { 0xE3A7, 0x8187 }, + { 0xE3A8, 0x818D }, + { 0xE3A9, 0x818C }, + { 0xE3AA, 0x818B }, + { 0xE3AB, 0x8215 }, + { 0xE3AC, 0x8497 }, + { 0xE3AD, 0x84A4 }, + { 0xE3AE, 0x84A1 }, + { 0xE3AF, 0x849F }, + { 0xE3B0, 0x84BA }, + { 0xE3B1, 0x84CE }, + { 0xE3B2, 0x84C2 }, + { 0xE3B3, 0x84AC }, + { 0xE3B4, 0x84AE }, + { 0xE3B5, 0x84AB }, + { 0xE3B6, 0x84B9 }, + { 0xE3B7, 0x84B4 }, + { 0xE3B8, 0x84C1 }, + { 0xE3B9, 0x84CD }, + { 0xE3BA, 0x84AA }, + { 0xE3BB, 0x849A }, + { 0xE3BC, 0x84B1 }, + { 0xE3BD, 0x84D0 }, + { 0xE3BE, 0x849D }, + { 0xE3BF, 0x84A7 }, + { 0xE3C0, 0x84BB }, + { 0xE3C1, 0x84A2 }, + { 0xE3C2, 0x8494 }, + { 0xE3C3, 0x84C7 }, + { 0xE3C4, 0x84CC }, + { 0xE3C5, 0x849B }, + { 0xE3C6, 0x84A9 }, + { 0xE3C7, 0x84AF }, + { 0xE3C8, 0x84A8 }, + { 0xE3C9, 0x84D6 }, + { 0xE3CA, 0x8498 }, + { 0xE3CB, 0x84B6 }, + { 0xE3CC, 0x84CF }, + { 0xE3CD, 0x84A0 }, + { 0xE3CE, 0x84D7 }, + { 0xE3CF, 0x84D4 }, + { 0xE3D0, 0x84D2 }, + { 0xE3D1, 0x84DB }, + { 0xE3D2, 0x84B0 }, + { 0xE3D3, 0x8491 }, + { 0xE3D4, 0x8661 }, + { 0xE3D5, 0x8733 }, + { 0xE3D6, 0x8723 }, + { 0xE3D7, 0x8728 }, + { 0xE3D8, 0x876B }, + { 0xE3D9, 0x8740 }, + { 0xE3DA, 0x872E }, + { 0xE3DB, 0x871E }, + { 0xE3DC, 0x8721 }, + { 0xE3DD, 0x8719 }, + { 0xE3DE, 0x871B }, + { 0xE3DF, 0x8743 }, + { 0xE3E0, 0x872C }, + { 0xE3E1, 0x8741 }, + { 0xE3E2, 0x873E }, + { 0xE3E3, 0x8746 }, + { 0xE3E4, 0x8720 }, + { 0xE3E5, 0x8732 }, + { 0xE3E6, 0x872A }, + { 0xE3E7, 0x872D }, + { 0xE3E8, 0x873C }, + { 0xE3E9, 0x8712 }, + { 0xE3EA, 0x873A }, + { 0xE3EB, 0x8731 }, + { 0xE3EC, 0x8735 }, + { 0xE3ED, 0x8742 }, + { 0xE3EE, 0x8726 }, + { 0xE3EF, 0x8727 }, + { 0xE3F0, 0x8738 }, + { 0xE3F1, 0x8724 }, + { 0xE3F2, 0x871A }, + { 0xE3F3, 0x8730 }, + { 0xE3F4, 0x8711 }, + { 0xE3F5, 0x88F7 }, + { 0xE3F6, 0x88E7 }, + { 0xE3F7, 0x88F1 }, + { 0xE3F8, 0x88F2 }, + { 0xE3F9, 0x88FA }, + { 0xE3FA, 0x88FE }, + { 0xE3FB, 0x88EE }, + { 0xE3FC, 0x88FC }, + { 0xE3FD, 0x88F6 }, + { 0xE3FE, 0x88FB }, + { 0xE440, 0x88F0 }, + { 0xE441, 0x88EC }, + { 0xE442, 0x88EB }, + { 0xE443, 0x899D }, + { 0xE444, 0x89A1 }, + { 0xE445, 0x899F }, + { 0xE446, 0x899E }, + { 0xE447, 0x89E9 }, + { 0xE448, 0x89EB }, + { 0xE449, 0x89E8 }, + { 0xE44A, 0x8AAB }, + { 0xE44B, 0x8A99 }, + { 0xE44C, 0x8A8B }, + { 0xE44D, 0x8A92 }, + { 0xE44E, 0x8A8F }, + { 0xE44F, 0x8A96 }, + { 0xE450, 0x8C3D }, + { 0xE451, 0x8C68 }, + { 0xE452, 0x8C69 }, + { 0xE453, 0x8CD5 }, + { 0xE454, 0x8CCF }, + { 0xE455, 0x8CD7 }, + { 0xE456, 0x8D96 }, + { 0xE457, 0x8E09 }, + { 0xE458, 0x8E02 }, + { 0xE459, 0x8DFF }, + { 0xE45A, 0x8E0D }, + { 0xE45B, 0x8DFD }, + { 0xE45C, 0x8E0A }, + { 0xE45D, 0x8E03 }, + { 0xE45E, 0x8E07 }, + { 0xE45F, 0x8E06 }, + { 0xE460, 0x8E05 }, + { 0xE461, 0x8DFE }, + { 0xE462, 0x8E00 }, + { 0xE463, 0x8E04 }, + { 0xE464, 0x8F10 }, + { 0xE465, 0x8F11 }, + { 0xE466, 0x8F0E }, + { 0xE467, 0x8F0D }, + { 0xE468, 0x9123 }, + { 0xE469, 0x911C }, + { 0xE46A, 0x9120 }, + { 0xE46B, 0x9122 }, + { 0xE46C, 0x911F }, + { 0xE46D, 0x911D }, + { 0xE46E, 0x911A }, + { 0xE46F, 0x9124 }, + { 0xE470, 0x9121 }, + { 0xE471, 0x911B }, + { 0xE472, 0x917A }, + { 0xE473, 0x9172 }, + { 0xE474, 0x9179 }, + { 0xE475, 0x9173 }, + { 0xE476, 0x92A5 }, + { 0xE477, 0x92A4 }, + { 0xE478, 0x9276 }, + { 0xE479, 0x929B }, + { 0xE47A, 0x927A }, + { 0xE47B, 0x92A0 }, + { 0xE47C, 0x9294 }, + { 0xE47D, 0x92AA }, + { 0xE47E, 0x928D }, + { 0xE4A1, 0x92A6 }, + { 0xE4A2, 0x929A }, + { 0xE4A3, 0x92AB }, + { 0xE4A4, 0x9279 }, + { 0xE4A5, 0x9297 }, + { 0xE4A6, 0x927F }, + { 0xE4A7, 0x92A3 }, + { 0xE4A8, 0x92EE }, + { 0xE4A9, 0x928E }, + { 0xE4AA, 0x9282 }, + { 0xE4AB, 0x9295 }, + { 0xE4AC, 0x92A2 }, + { 0xE4AD, 0x927D }, + { 0xE4AE, 0x9288 }, + { 0xE4AF, 0x92A1 }, + { 0xE4B0, 0x928A }, + { 0xE4B1, 0x9286 }, + { 0xE4B2, 0x928C }, + { 0xE4B3, 0x9299 }, + { 0xE4B4, 0x92A7 }, + { 0xE4B5, 0x927E }, + { 0xE4B6, 0x9287 }, + { 0xE4B7, 0x92A9 }, + { 0xE4B8, 0x929D }, + { 0xE4B9, 0x928B }, + { 0xE4BA, 0x922D }, + { 0xE4BB, 0x969E }, + { 0xE4BC, 0x96A1 }, + { 0xE4BD, 0x96FF }, + { 0xE4BE, 0x9758 }, + { 0xE4BF, 0x977D }, + { 0xE4C0, 0x977A }, + { 0xE4C1, 0x977E }, + { 0xE4C2, 0x9783 }, + { 0xE4C3, 0x9780 }, + { 0xE4C4, 0x9782 }, + { 0xE4C5, 0x977B }, + { 0xE4C6, 0x9784 }, + { 0xE4C7, 0x9781 }, + { 0xE4C8, 0x977F }, + { 0xE4C9, 0x97CE }, + { 0xE4CA, 0x97CD }, + { 0xE4CB, 0x9816 }, + { 0xE4CC, 0x98AD }, + { 0xE4CD, 0x98AE }, + { 0xE4CE, 0x9902 }, + { 0xE4CF, 0x9900 }, + { 0xE4D0, 0x9907 }, + { 0xE4D1, 0x999D }, + { 0xE4D2, 0x999C }, + { 0xE4D3, 0x99C3 }, + { 0xE4D4, 0x99B9 }, + { 0xE4D5, 0x99BB }, + { 0xE4D6, 0x99BA }, + { 0xE4D7, 0x99C2 }, + { 0xE4D8, 0x99BD }, + { 0xE4D9, 0x99C7 }, + { 0xE4DA, 0x9AB1 }, + { 0xE4DB, 0x9AE3 }, + { 0xE4DC, 0x9AE7 }, + { 0xE4DD, 0x9B3E }, + { 0xE4DE, 0x9B3F }, + { 0xE4DF, 0x9B60 }, + { 0xE4E0, 0x9B61 }, + { 0xE4E1, 0x9B5F }, + { 0xE4E2, 0x9CF1 }, + { 0xE4E3, 0x9CF2 }, + { 0xE4E4, 0x9CF5 }, + { 0xE4E5, 0x9EA7 }, + { 0xE4E6, 0x50FF }, + { 0xE4E7, 0x5103 }, + { 0xE4E8, 0x5130 }, + { 0xE4E9, 0x50F8 }, + { 0xE4EA, 0x5106 }, + { 0xE4EB, 0x5107 }, + { 0xE4EC, 0x50F6 }, + { 0xE4ED, 0x50FE }, + { 0xE4EE, 0x510B }, + { 0xE4EF, 0x510C }, + { 0xE4F0, 0x50FD }, + { 0xE4F1, 0x510A }, + { 0xE4F2, 0x528B }, + { 0xE4F3, 0x528C }, + { 0xE4F4, 0x52F1 }, + { 0xE4F5, 0x52EF }, + { 0xE4F6, 0x5648 }, + { 0xE4F7, 0x5642 }, + { 0xE4F8, 0x564C }, + { 0xE4F9, 0x5635 }, + { 0xE4FA, 0x5641 }, + { 0xE4FB, 0x564A }, + { 0xE4FC, 0x5649 }, + { 0xE4FD, 0x5646 }, + { 0xE4FE, 0x5658 }, + { 0xE540, 0x565A }, + { 0xE541, 0x5640 }, + { 0xE542, 0x5633 }, + { 0xE543, 0x563D }, + { 0xE544, 0x562C }, + { 0xE545, 0x563E }, + { 0xE546, 0x5638 }, + { 0xE547, 0x562A }, + { 0xE548, 0x563A }, + { 0xE549, 0x571A }, + { 0xE54A, 0x58AB }, + { 0xE54B, 0x589D }, + { 0xE54C, 0x58B1 }, + { 0xE54D, 0x58A0 }, + { 0xE54E, 0x58A3 }, + { 0xE54F, 0x58AF }, + { 0xE550, 0x58AC }, + { 0xE551, 0x58A5 }, + { 0xE552, 0x58A1 }, + { 0xE553, 0x58FF }, + { 0xE554, 0x5AFF }, + { 0xE555, 0x5AF4 }, + { 0xE556, 0x5AFD }, + { 0xE557, 0x5AF7 }, + { 0xE558, 0x5AF6 }, + { 0xE559, 0x5B03 }, + { 0xE55A, 0x5AF8 }, + { 0xE55B, 0x5B02 }, + { 0xE55C, 0x5AF9 }, + { 0xE55D, 0x5B01 }, + { 0xE55E, 0x5B07 }, + { 0xE55F, 0x5B05 }, + { 0xE560, 0x5B0F }, + { 0xE561, 0x5C67 }, + { 0xE562, 0x5D99 }, + { 0xE563, 0x5D97 }, + { 0xE564, 0x5D9F }, + { 0xE565, 0x5D92 }, + { 0xE566, 0x5DA2 }, + { 0xE567, 0x5D93 }, + { 0xE568, 0x5D95 }, + { 0xE569, 0x5DA0 }, + { 0xE56A, 0x5D9C }, + { 0xE56B, 0x5DA1 }, + { 0xE56C, 0x5D9A }, + { 0xE56D, 0x5D9E }, + { 0xE56E, 0x5E69 }, + { 0xE56F, 0x5E5D }, + { 0xE570, 0x5E60 }, + { 0xE571, 0x5E5C }, + { 0xE572, 0x7DF3 }, + { 0xE573, 0x5EDB }, + { 0xE574, 0x5EDE }, + { 0xE575, 0x5EE1 }, + { 0xE576, 0x5F49 }, + { 0xE577, 0x5FB2 }, + { 0xE578, 0x618B }, + { 0xE579, 0x6183 }, + { 0xE57A, 0x6179 }, + { 0xE57B, 0x61B1 }, + { 0xE57C, 0x61B0 }, + { 0xE57D, 0x61A2 }, + { 0xE57E, 0x6189 }, + { 0xE5A1, 0x619B }, + { 0xE5A2, 0x6193 }, + { 0xE5A3, 0x61AF }, + { 0xE5A4, 0x61AD }, + { 0xE5A5, 0x619F }, + { 0xE5A6, 0x6192 }, + { 0xE5A7, 0x61AA }, + { 0xE5A8, 0x61A1 }, + { 0xE5A9, 0x618D }, + { 0xE5AA, 0x6166 }, + { 0xE5AB, 0x61B3 }, + { 0xE5AC, 0x622D }, + { 0xE5AD, 0x646E }, + { 0xE5AE, 0x6470 }, + { 0xE5AF, 0x6496 }, + { 0xE5B0, 0x64A0 }, + { 0xE5B1, 0x6485 }, + { 0xE5B2, 0x6497 }, + { 0xE5B3, 0x649C }, + { 0xE5B4, 0x648F }, + { 0xE5B5, 0x648B }, + { 0xE5B6, 0x648A }, + { 0xE5B7, 0x648C }, + { 0xE5B8, 0x64A3 }, + { 0xE5B9, 0x649F }, + { 0xE5BA, 0x6468 }, + { 0xE5BB, 0x64B1 }, + { 0xE5BC, 0x6498 }, + { 0xE5BD, 0x6576 }, + { 0xE5BE, 0x657A }, + { 0xE5BF, 0x6579 }, + { 0xE5C0, 0x657B }, + { 0xE5C1, 0x65B2 }, + { 0xE5C2, 0x65B3 }, + { 0xE5C3, 0x66B5 }, + { 0xE5C4, 0x66B0 }, + { 0xE5C5, 0x66A9 }, + { 0xE5C6, 0x66B2 }, + { 0xE5C7, 0x66B7 }, + { 0xE5C8, 0x66AA }, + { 0xE5C9, 0x66AF }, + { 0xE5CA, 0x6A00 }, + { 0xE5CB, 0x6A06 }, + { 0xE5CC, 0x6A17 }, + { 0xE5CD, 0x69E5 }, + { 0xE5CE, 0x69F8 }, + { 0xE5CF, 0x6A15 }, + { 0xE5D0, 0x69F1 }, + { 0xE5D1, 0x69E4 }, + { 0xE5D2, 0x6A20 }, + { 0xE5D3, 0x69FF }, + { 0xE5D4, 0x69EC }, + { 0xE5D5, 0x69E2 }, + { 0xE5D6, 0x6A1B }, + { 0xE5D7, 0x6A1D }, + { 0xE5D8, 0x69FE }, + { 0xE5D9, 0x6A27 }, + { 0xE5DA, 0x69F2 }, + { 0xE5DB, 0x69EE }, + { 0xE5DC, 0x6A14 }, + { 0xE5DD, 0x69F7 }, + { 0xE5DE, 0x69E7 }, + { 0xE5DF, 0x6A40 }, + { 0xE5E0, 0x6A08 }, + { 0xE5E1, 0x69E6 }, + { 0xE5E2, 0x69FB }, + { 0xE5E3, 0x6A0D }, + { 0xE5E4, 0x69FC }, + { 0xE5E5, 0x69EB }, + { 0xE5E6, 0x6A09 }, + { 0xE5E7, 0x6A04 }, + { 0xE5E8, 0x6A18 }, + { 0xE5E9, 0x6A25 }, + { 0xE5EA, 0x6A0F }, + { 0xE5EB, 0x69F6 }, + { 0xE5EC, 0x6A26 }, + { 0xE5ED, 0x6A07 }, + { 0xE5EE, 0x69F4 }, + { 0xE5EF, 0x6A16 }, + { 0xE5F0, 0x6B51 }, + { 0xE5F1, 0x6BA5 }, + { 0xE5F2, 0x6BA3 }, + { 0xE5F3, 0x6BA2 }, + { 0xE5F4, 0x6BA6 }, + { 0xE5F5, 0x6C01 }, + { 0xE5F6, 0x6C00 }, + { 0xE5F7, 0x6BFF }, + { 0xE5F8, 0x6C02 }, + { 0xE5F9, 0x6F41 }, + { 0xE5FA, 0x6F26 }, + { 0xE5FB, 0x6F7E }, + { 0xE5FC, 0x6F87 }, + { 0xE5FD, 0x6FC6 }, + { 0xE5FE, 0x6F92 }, + { 0xE640, 0x6F8D }, + { 0xE641, 0x6F89 }, + { 0xE642, 0x6F8C }, + { 0xE643, 0x6F62 }, + { 0xE644, 0x6F4F }, + { 0xE645, 0x6F85 }, + { 0xE646, 0x6F5A }, + { 0xE647, 0x6F96 }, + { 0xE648, 0x6F76 }, + { 0xE649, 0x6F6C }, + { 0xE64A, 0x6F82 }, + { 0xE64B, 0x6F55 }, + { 0xE64C, 0x6F72 }, + { 0xE64D, 0x6F52 }, + { 0xE64E, 0x6F50 }, + { 0xE64F, 0x6F57 }, + { 0xE650, 0x6F94 }, + { 0xE651, 0x6F93 }, + { 0xE652, 0x6F5D }, + { 0xE653, 0x6F00 }, + { 0xE654, 0x6F61 }, + { 0xE655, 0x6F6B }, + { 0xE656, 0x6F7D }, + { 0xE657, 0x6F67 }, + { 0xE658, 0x6F90 }, + { 0xE659, 0x6F53 }, + { 0xE65A, 0x6F8B }, + { 0xE65B, 0x6F69 }, + { 0xE65C, 0x6F7F }, + { 0xE65D, 0x6F95 }, + { 0xE65E, 0x6F63 }, + { 0xE65F, 0x6F77 }, + { 0xE660, 0x6F6A }, + { 0xE661, 0x6F7B }, + { 0xE662, 0x71B2 }, + { 0xE663, 0x71AF }, + { 0xE664, 0x719B }, + { 0xE665, 0x71B0 }, + { 0xE666, 0x71A0 }, + { 0xE667, 0x719A }, + { 0xE668, 0x71A9 }, + { 0xE669, 0x71B5 }, + { 0xE66A, 0x719D }, + { 0xE66B, 0x71A5 }, + { 0xE66C, 0x719E }, + { 0xE66D, 0x71A4 }, + { 0xE66E, 0x71A1 }, + { 0xE66F, 0x71AA }, + { 0xE670, 0x719C }, + { 0xE671, 0x71A7 }, + { 0xE672, 0x71B3 }, + { 0xE673, 0x7298 }, + { 0xE674, 0x729A }, + { 0xE675, 0x7358 }, + { 0xE676, 0x7352 }, + { 0xE677, 0x735E }, + { 0xE678, 0x735F }, + { 0xE679, 0x7360 }, + { 0xE67A, 0x735D }, + { 0xE67B, 0x735B }, + { 0xE67C, 0x7361 }, + { 0xE67D, 0x735A }, + { 0xE67E, 0x7359 }, + { 0xE6A1, 0x7362 }, + { 0xE6A2, 0x7487 }, + { 0xE6A3, 0x7489 }, + { 0xE6A4, 0x748A }, + { 0xE6A5, 0x7486 }, + { 0xE6A6, 0x7481 }, + { 0xE6A7, 0x747D }, + { 0xE6A8, 0x7485 }, + { 0xE6A9, 0x7488 }, + { 0xE6AA, 0x747C }, + { 0xE6AB, 0x7479 }, + { 0xE6AC, 0x7508 }, + { 0xE6AD, 0x7507 }, + { 0xE6AE, 0x757E }, + { 0xE6AF, 0x7625 }, + { 0xE6B0, 0x761E }, + { 0xE6B1, 0x7619 }, + { 0xE6B2, 0x761D }, + { 0xE6B3, 0x761C }, + { 0xE6B4, 0x7623 }, + { 0xE6B5, 0x761A }, + { 0xE6B6, 0x7628 }, + { 0xE6B7, 0x761B }, + { 0xE6B8, 0x769C }, + { 0xE6B9, 0x769D }, + { 0xE6BA, 0x769E }, + { 0xE6BB, 0x769B }, + { 0xE6BC, 0x778D }, + { 0xE6BD, 0x778F }, + { 0xE6BE, 0x7789 }, + { 0xE6BF, 0x7788 }, + { 0xE6C0, 0x78CD }, + { 0xE6C1, 0x78BB }, + { 0xE6C2, 0x78CF }, + { 0xE6C3, 0x78CC }, + { 0xE6C4, 0x78D1 }, + { 0xE6C5, 0x78CE }, + { 0xE6C6, 0x78D4 }, + { 0xE6C7, 0x78C8 }, + { 0xE6C8, 0x78C3 }, + { 0xE6C9, 0x78C4 }, + { 0xE6CA, 0x78C9 }, + { 0xE6CB, 0x799A }, + { 0xE6CC, 0x79A1 }, + { 0xE6CD, 0x79A0 }, + { 0xE6CE, 0x799C }, + { 0xE6CF, 0x79A2 }, + { 0xE6D0, 0x799B }, + { 0xE6D1, 0x6B76 }, + { 0xE6D2, 0x7A39 }, + { 0xE6D3, 0x7AB2 }, + { 0xE6D4, 0x7AB4 }, + { 0xE6D5, 0x7AB3 }, + { 0xE6D6, 0x7BB7 }, + { 0xE6D7, 0x7BCB }, + { 0xE6D8, 0x7BBE }, + { 0xE6D9, 0x7BAC }, + { 0xE6DA, 0x7BCE }, + { 0xE6DB, 0x7BAF }, + { 0xE6DC, 0x7BB9 }, + { 0xE6DD, 0x7BCA }, + { 0xE6DE, 0x7BB5 }, + { 0xE6DF, 0x7CC5 }, + { 0xE6E0, 0x7CC8 }, + { 0xE6E1, 0x7CCC }, + { 0xE6E2, 0x7CCB }, + { 0xE6E3, 0x7DF7 }, + { 0xE6E4, 0x7DDB }, + { 0xE6E5, 0x7DEA }, + { 0xE6E6, 0x7DE7 }, + { 0xE6E7, 0x7DD7 }, + { 0xE6E8, 0x7DE1 }, + { 0xE6E9, 0x7E03 }, + { 0xE6EA, 0x7DFA }, + { 0xE6EB, 0x7DE6 }, + { 0xE6EC, 0x7DF6 }, + { 0xE6ED, 0x7DF1 }, + { 0xE6EE, 0x7DF0 }, + { 0xE6EF, 0x7DEE }, + { 0xE6F0, 0x7DDF }, + { 0xE6F1, 0x7F76 }, + { 0xE6F2, 0x7FAC }, + { 0xE6F3, 0x7FB0 }, + { 0xE6F4, 0x7FAD }, + { 0xE6F5, 0x7FED }, + { 0xE6F6, 0x7FEB }, + { 0xE6F7, 0x7FEA }, + { 0xE6F8, 0x7FEC }, + { 0xE6F9, 0x7FE6 }, + { 0xE6FA, 0x7FE8 }, + { 0xE6FB, 0x8064 }, + { 0xE6FC, 0x8067 }, + { 0xE6FD, 0x81A3 }, + { 0xE6FE, 0x819F }, + { 0xE740, 0x819E }, + { 0xE741, 0x8195 }, + { 0xE742, 0x81A2 }, + { 0xE743, 0x8199 }, + { 0xE744, 0x8197 }, + { 0xE745, 0x8216 }, + { 0xE746, 0x824F }, + { 0xE747, 0x8253 }, + { 0xE748, 0x8252 }, + { 0xE749, 0x8250 }, + { 0xE74A, 0x824E }, + { 0xE74B, 0x8251 }, + { 0xE74C, 0x8524 }, + { 0xE74D, 0x853B }, + { 0xE74E, 0x850F }, + { 0xE74F, 0x8500 }, + { 0xE750, 0x8529 }, + { 0xE751, 0x850E }, + { 0xE752, 0x8509 }, + { 0xE753, 0x850D }, + { 0xE754, 0x851F }, + { 0xE755, 0x850A }, + { 0xE756, 0x8527 }, + { 0xE757, 0x851C }, + { 0xE758, 0x84FB }, + { 0xE759, 0x852B }, + { 0xE75A, 0x84FA }, + { 0xE75B, 0x8508 }, + { 0xE75C, 0x850C }, + { 0xE75D, 0x84F4 }, + { 0xE75E, 0x852A }, + { 0xE75F, 0x84F2 }, + { 0xE760, 0x8515 }, + { 0xE761, 0x84F7 }, + { 0xE762, 0x84EB }, + { 0xE763, 0x84F3 }, + { 0xE764, 0x84FC }, + { 0xE765, 0x8512 }, + { 0xE766, 0x84EA }, + { 0xE767, 0x84E9 }, + { 0xE768, 0x8516 }, + { 0xE769, 0x84FE }, + { 0xE76A, 0x8528 }, + { 0xE76B, 0x851D }, + { 0xE76C, 0x852E }, + { 0xE76D, 0x8502 }, + { 0xE76E, 0x84FD }, + { 0xE76F, 0x851E }, + { 0xE770, 0x84F6 }, + { 0xE771, 0x8531 }, + { 0xE772, 0x8526 }, + { 0xE773, 0x84E7 }, + { 0xE774, 0x84E8 }, + { 0xE775, 0x84F0 }, + { 0xE776, 0x84EF }, + { 0xE777, 0x84F9 }, + { 0xE778, 0x8518 }, + { 0xE779, 0x8520 }, + { 0xE77A, 0x8530 }, + { 0xE77B, 0x850B }, + { 0xE77C, 0x8519 }, + { 0xE77D, 0x852F }, + { 0xE77E, 0x8662 }, + { 0xE7A1, 0x8756 }, + { 0xE7A2, 0x8763 }, + { 0xE7A3, 0x8764 }, + { 0xE7A4, 0x8777 }, + { 0xE7A5, 0x87E1 }, + { 0xE7A6, 0x8773 }, + { 0xE7A7, 0x8758 }, + { 0xE7A8, 0x8754 }, + { 0xE7A9, 0x875B }, + { 0xE7AA, 0x8752 }, + { 0xE7AB, 0x8761 }, + { 0xE7AC, 0x875A }, + { 0xE7AD, 0x8751 }, + { 0xE7AE, 0x875E }, + { 0xE7AF, 0x876D }, + { 0xE7B0, 0x876A }, + { 0xE7B1, 0x8750 }, + { 0xE7B2, 0x874E }, + { 0xE7B3, 0x875F }, + { 0xE7B4, 0x875D }, + { 0xE7B5, 0x876F }, + { 0xE7B6, 0x876C }, + { 0xE7B7, 0x877A }, + { 0xE7B8, 0x876E }, + { 0xE7B9, 0x875C }, + { 0xE7BA, 0x8765 }, + { 0xE7BB, 0x874F }, + { 0xE7BC, 0x877B }, + { 0xE7BD, 0x8775 }, + { 0xE7BE, 0x8762 }, + { 0xE7BF, 0x8767 }, + { 0xE7C0, 0x8769 }, + { 0xE7C1, 0x885A }, + { 0xE7C2, 0x8905 }, + { 0xE7C3, 0x890C }, + { 0xE7C4, 0x8914 }, + { 0xE7C5, 0x890B }, + { 0xE7C6, 0x8917 }, + { 0xE7C7, 0x8918 }, + { 0xE7C8, 0x8919 }, + { 0xE7C9, 0x8906 }, + { 0xE7CA, 0x8916 }, + { 0xE7CB, 0x8911 }, + { 0xE7CC, 0x890E }, + { 0xE7CD, 0x8909 }, + { 0xE7CE, 0x89A2 }, + { 0xE7CF, 0x89A4 }, + { 0xE7D0, 0x89A3 }, + { 0xE7D1, 0x89ED }, + { 0xE7D2, 0x89F0 }, + { 0xE7D3, 0x89EC }, + { 0xE7D4, 0x8ACF }, + { 0xE7D5, 0x8AC6 }, + { 0xE7D6, 0x8AB8 }, + { 0xE7D7, 0x8AD3 }, + { 0xE7D8, 0x8AD1 }, + { 0xE7D9, 0x8AD4 }, + { 0xE7DA, 0x8AD5 }, + { 0xE7DB, 0x8ABB }, + { 0xE7DC, 0x8AD7 }, + { 0xE7DD, 0x8ABE }, + { 0xE7DE, 0x8AC0 }, + { 0xE7DF, 0x8AC5 }, + { 0xE7E0, 0x8AD8 }, + { 0xE7E1, 0x8AC3 }, + { 0xE7E2, 0x8ABA }, + { 0xE7E3, 0x8ABD }, + { 0xE7E4, 0x8AD9 }, + { 0xE7E5, 0x8C3E }, + { 0xE7E6, 0x8C4D }, + { 0xE7E7, 0x8C8F }, + { 0xE7E8, 0x8CE5 }, + { 0xE7E9, 0x8CDF }, + { 0xE7EA, 0x8CD9 }, + { 0xE7EB, 0x8CE8 }, + { 0xE7EC, 0x8CDA }, + { 0xE7ED, 0x8CDD }, + { 0xE7EE, 0x8CE7 }, + { 0xE7EF, 0x8DA0 }, + { 0xE7F0, 0x8D9C }, + { 0xE7F1, 0x8DA1 }, + { 0xE7F2, 0x8D9B }, + { 0xE7F3, 0x8E20 }, + { 0xE7F4, 0x8E23 }, + { 0xE7F5, 0x8E25 }, + { 0xE7F6, 0x8E24 }, + { 0xE7F7, 0x8E2E }, + { 0xE7F8, 0x8E15 }, + { 0xE7F9, 0x8E1B }, + { 0xE7FA, 0x8E16 }, + { 0xE7FB, 0x8E11 }, + { 0xE7FC, 0x8E19 }, + { 0xE7FD, 0x8E26 }, + { 0xE7FE, 0x8E27 }, + { 0xE840, 0x8E14 }, + { 0xE841, 0x8E12 }, + { 0xE842, 0x8E18 }, + { 0xE843, 0x8E13 }, + { 0xE844, 0x8E1C }, + { 0xE845, 0x8E17 }, + { 0xE846, 0x8E1A }, + { 0xE847, 0x8F2C }, + { 0xE848, 0x8F24 }, + { 0xE849, 0x8F18 }, + { 0xE84A, 0x8F1A }, + { 0xE84B, 0x8F20 }, + { 0xE84C, 0x8F23 }, + { 0xE84D, 0x8F16 }, + { 0xE84E, 0x8F17 }, + { 0xE84F, 0x9073 }, + { 0xE850, 0x9070 }, + { 0xE851, 0x906F }, + { 0xE852, 0x9067 }, + { 0xE853, 0x906B }, + { 0xE854, 0x912F }, + { 0xE855, 0x912B }, + { 0xE856, 0x9129 }, + { 0xE857, 0x912A }, + { 0xE858, 0x9132 }, + { 0xE859, 0x9126 }, + { 0xE85A, 0x912E }, + { 0xE85B, 0x9185 }, + { 0xE85C, 0x9186 }, + { 0xE85D, 0x918A }, + { 0xE85E, 0x9181 }, + { 0xE85F, 0x9182 }, + { 0xE860, 0x9184 }, + { 0xE861, 0x9180 }, + { 0xE862, 0x92D0 }, + { 0xE863, 0x92C3 }, + { 0xE864, 0x92C4 }, + { 0xE865, 0x92C0 }, + { 0xE866, 0x92D9 }, + { 0xE867, 0x92B6 }, + { 0xE868, 0x92CF }, + { 0xE869, 0x92F1 }, + { 0xE86A, 0x92DF }, + { 0xE86B, 0x92D8 }, + { 0xE86C, 0x92E9 }, + { 0xE86D, 0x92D7 }, + { 0xE86E, 0x92DD }, + { 0xE86F, 0x92CC }, + { 0xE870, 0x92EF }, + { 0xE871, 0x92C2 }, + { 0xE872, 0x92E8 }, + { 0xE873, 0x92CA }, + { 0xE874, 0x92C8 }, + { 0xE875, 0x92CE }, + { 0xE876, 0x92E6 }, + { 0xE877, 0x92CD }, + { 0xE878, 0x92D5 }, + { 0xE879, 0x92C9 }, + { 0xE87A, 0x92E0 }, + { 0xE87B, 0x92DE }, + { 0xE87C, 0x92E7 }, + { 0xE87D, 0x92D1 }, + { 0xE87E, 0x92D3 }, + { 0xE8A1, 0x92B5 }, + { 0xE8A2, 0x92E1 }, + { 0xE8A3, 0x92C6 }, + { 0xE8A4, 0x92B4 }, + { 0xE8A5, 0x957C }, + { 0xE8A6, 0x95AC }, + { 0xE8A7, 0x95AB }, + { 0xE8A8, 0x95AE }, + { 0xE8A9, 0x95B0 }, + { 0xE8AA, 0x96A4 }, + { 0xE8AB, 0x96A2 }, + { 0xE8AC, 0x96D3 }, + { 0xE8AD, 0x9705 }, + { 0xE8AE, 0x9708 }, + { 0xE8AF, 0x9702 }, + { 0xE8B0, 0x975A }, + { 0xE8B1, 0x978A }, + { 0xE8B2, 0x978E }, + { 0xE8B3, 0x9788 }, + { 0xE8B4, 0x97D0 }, + { 0xE8B5, 0x97CF }, + { 0xE8B6, 0x981E }, + { 0xE8B7, 0x981D }, + { 0xE8B8, 0x9826 }, + { 0xE8B9, 0x9829 }, + { 0xE8BA, 0x9828 }, + { 0xE8BB, 0x9820 }, + { 0xE8BC, 0x981B }, + { 0xE8BD, 0x9827 }, + { 0xE8BE, 0x98B2 }, + { 0xE8BF, 0x9908 }, + { 0xE8C0, 0x98FA }, + { 0xE8C1, 0x9911 }, + { 0xE8C2, 0x9914 }, + { 0xE8C3, 0x9916 }, + { 0xE8C4, 0x9917 }, + { 0xE8C5, 0x9915 }, + { 0xE8C6, 0x99DC }, + { 0xE8C7, 0x99CD }, + { 0xE8C8, 0x99CF }, + { 0xE8C9, 0x99D3 }, + { 0xE8CA, 0x99D4 }, + { 0xE8CB, 0x99CE }, + { 0xE8CC, 0x99C9 }, + { 0xE8CD, 0x99D6 }, + { 0xE8CE, 0x99D8 }, + { 0xE8CF, 0x99CB }, + { 0xE8D0, 0x99D7 }, + { 0xE8D1, 0x99CC }, + { 0xE8D2, 0x9AB3 }, + { 0xE8D3, 0x9AEC }, + { 0xE8D4, 0x9AEB }, + { 0xE8D5, 0x9AF3 }, + { 0xE8D6, 0x9AF2 }, + { 0xE8D7, 0x9AF1 }, + { 0xE8D8, 0x9B46 }, + { 0xE8D9, 0x9B43 }, + { 0xE8DA, 0x9B67 }, + { 0xE8DB, 0x9B74 }, + { 0xE8DC, 0x9B71 }, + { 0xE8DD, 0x9B66 }, + { 0xE8DE, 0x9B76 }, + { 0xE8DF, 0x9B75 }, + { 0xE8E0, 0x9B70 }, + { 0xE8E1, 0x9B68 }, + { 0xE8E2, 0x9B64 }, + { 0xE8E3, 0x9B6C }, + { 0xE8E4, 0x9CFC }, + { 0xE8E5, 0x9CFA }, + { 0xE8E6, 0x9CFD }, + { 0xE8E7, 0x9CFF }, + { 0xE8E8, 0x9CF7 }, + { 0xE8E9, 0x9D07 }, + { 0xE8EA, 0x9D00 }, + { 0xE8EB, 0x9CF9 }, + { 0xE8EC, 0x9CFB }, + { 0xE8ED, 0x9D08 }, + { 0xE8EE, 0x9D05 }, + { 0xE8EF, 0x9D04 }, + { 0xE8F0, 0x9E83 }, + { 0xE8F1, 0x9ED3 }, + { 0xE8F2, 0x9F0F }, + { 0xE8F3, 0x9F10 }, + { 0xE8F4, 0x511C }, + { 0xE8F5, 0x5113 }, + { 0xE8F6, 0x5117 }, + { 0xE8F7, 0x511A }, + { 0xE8F8, 0x5111 }, + { 0xE8F9, 0x51DE }, + { 0xE8FA, 0x5334 }, + { 0xE8FB, 0x53E1 }, + { 0xE8FC, 0x5670 }, + { 0xE8FD, 0x5660 }, + { 0xE8FE, 0x566E }, + { 0xE940, 0x5673 }, + { 0xE941, 0x5666 }, + { 0xE942, 0x5663 }, + { 0xE943, 0x566D }, + { 0xE944, 0x5672 }, + { 0xE945, 0x565E }, + { 0xE946, 0x5677 }, + { 0xE947, 0x571C }, + { 0xE948, 0x571B }, + { 0xE949, 0x58C8 }, + { 0xE94A, 0x58BD }, + { 0xE94B, 0x58C9 }, + { 0xE94C, 0x58BF }, + { 0xE94D, 0x58BA }, + { 0xE94E, 0x58C2 }, + { 0xE94F, 0x58BC }, + { 0xE950, 0x58C6 }, + { 0xE951, 0x5B17 }, + { 0xE952, 0x5B19 }, + { 0xE953, 0x5B1B }, + { 0xE954, 0x5B21 }, + { 0xE955, 0x5B14 }, + { 0xE956, 0x5B13 }, + { 0xE957, 0x5B10 }, + { 0xE958, 0x5B16 }, + { 0xE959, 0x5B28 }, + { 0xE95A, 0x5B1A }, + { 0xE95B, 0x5B20 }, + { 0xE95C, 0x5B1E }, + { 0xE95D, 0x5BEF }, + { 0xE95E, 0x5DAC }, + { 0xE95F, 0x5DB1 }, + { 0xE960, 0x5DA9 }, + { 0xE961, 0x5DA7 }, + { 0xE962, 0x5DB5 }, + { 0xE963, 0x5DB0 }, + { 0xE964, 0x5DAE }, + { 0xE965, 0x5DAA }, + { 0xE966, 0x5DA8 }, + { 0xE967, 0x5DB2 }, + { 0xE968, 0x5DAD }, + { 0xE969, 0x5DAF }, + { 0xE96A, 0x5DB4 }, + { 0xE96B, 0x5E67 }, + { 0xE96C, 0x5E68 }, + { 0xE96D, 0x5E66 }, + { 0xE96E, 0x5E6F }, + { 0xE96F, 0x5EE9 }, + { 0xE970, 0x5EE7 }, + { 0xE971, 0x5EE6 }, + { 0xE972, 0x5EE8 }, + { 0xE973, 0x5EE5 }, + { 0xE974, 0x5F4B }, + { 0xE975, 0x5FBC }, + { 0xE976, 0x619D }, + { 0xE977, 0x61A8 }, + { 0xE978, 0x6196 }, + { 0xE979, 0x61C5 }, + { 0xE97A, 0x61B4 }, + { 0xE97B, 0x61C6 }, + { 0xE97C, 0x61C1 }, + { 0xE97D, 0x61CC }, + { 0xE97E, 0x61BA }, + { 0xE9A1, 0x61BF }, + { 0xE9A2, 0x61B8 }, + { 0xE9A3, 0x618C }, + { 0xE9A4, 0x64D7 }, + { 0xE9A5, 0x64D6 }, + { 0xE9A6, 0x64D0 }, + { 0xE9A7, 0x64CF }, + { 0xE9A8, 0x64C9 }, + { 0xE9A9, 0x64BD }, + { 0xE9AA, 0x6489 }, + { 0xE9AB, 0x64C3 }, + { 0xE9AC, 0x64DB }, + { 0xE9AD, 0x64F3 }, + { 0xE9AE, 0x64D9 }, + { 0xE9AF, 0x6533 }, + { 0xE9B0, 0x657F }, + { 0xE9B1, 0x657C }, + { 0xE9B2, 0x65A2 }, + { 0xE9B3, 0x66C8 }, + { 0xE9B4, 0x66BE }, + { 0xE9B5, 0x66C0 }, + { 0xE9B6, 0x66CA }, + { 0xE9B7, 0x66CB }, + { 0xE9B8, 0x66CF }, + { 0xE9B9, 0x66BD }, + { 0xE9BA, 0x66BB }, + { 0xE9BB, 0x66BA }, + { 0xE9BC, 0x66CC }, + { 0xE9BD, 0x6723 }, + { 0xE9BE, 0x6A34 }, + { 0xE9BF, 0x6A66 }, + { 0xE9C0, 0x6A49 }, + { 0xE9C1, 0x6A67 }, + { 0xE9C2, 0x6A32 }, + { 0xE9C3, 0x6A68 }, + { 0xE9C4, 0x6A3E }, + { 0xE9C5, 0x6A5D }, + { 0xE9C6, 0x6A6D }, + { 0xE9C7, 0x6A76 }, + { 0xE9C8, 0x6A5B }, + { 0xE9C9, 0x6A51 }, + { 0xE9CA, 0x6A28 }, + { 0xE9CB, 0x6A5A }, + { 0xE9CC, 0x6A3B }, + { 0xE9CD, 0x6A3F }, + { 0xE9CE, 0x6A41 }, + { 0xE9CF, 0x6A6A }, + { 0xE9D0, 0x6A64 }, + { 0xE9D1, 0x6A50 }, + { 0xE9D2, 0x6A4F }, + { 0xE9D3, 0x6A54 }, + { 0xE9D4, 0x6A6F }, + { 0xE9D5, 0x6A69 }, + { 0xE9D6, 0x6A60 }, + { 0xE9D7, 0x6A3C }, + { 0xE9D8, 0x6A5E }, + { 0xE9D9, 0x6A56 }, + { 0xE9DA, 0x6A55 }, + { 0xE9DB, 0x6A4D }, + { 0xE9DC, 0x6A4E }, + { 0xE9DD, 0x6A46 }, + { 0xE9DE, 0x6B55 }, + { 0xE9DF, 0x6B54 }, + { 0xE9E0, 0x6B56 }, + { 0xE9E1, 0x6BA7 }, + { 0xE9E2, 0x6BAA }, + { 0xE9E3, 0x6BAB }, + { 0xE9E4, 0x6BC8 }, + { 0xE9E5, 0x6BC7 }, + { 0xE9E6, 0x6C04 }, + { 0xE9E7, 0x6C03 }, + { 0xE9E8, 0x6C06 }, + { 0xE9E9, 0x6FAD }, + { 0xE9EA, 0x6FCB }, + { 0xE9EB, 0x6FA3 }, + { 0xE9EC, 0x6FC7 }, + { 0xE9ED, 0x6FBC }, + { 0xE9EE, 0x6FCE }, + { 0xE9EF, 0x6FC8 }, + { 0xE9F0, 0x6F5E }, + { 0xE9F1, 0x6FC4 }, + { 0xE9F2, 0x6FBD }, + { 0xE9F3, 0x6F9E }, + { 0xE9F4, 0x6FCA }, + { 0xE9F5, 0x6FA8 }, + { 0xE9F6, 0x7004 }, + { 0xE9F7, 0x6FA5 }, + { 0xE9F8, 0x6FAE }, + { 0xE9F9, 0x6FBA }, + { 0xE9FA, 0x6FAC }, + { 0xE9FB, 0x6FAA }, + { 0xE9FC, 0x6FCF }, + { 0xE9FD, 0x6FBF }, + { 0xE9FE, 0x6FB8 }, + { 0xEA40, 0x6FA2 }, + { 0xEA41, 0x6FC9 }, + { 0xEA42, 0x6FAB }, + { 0xEA43, 0x6FCD }, + { 0xEA44, 0x6FAF }, + { 0xEA45, 0x6FB2 }, + { 0xEA46, 0x6FB0 }, + { 0xEA47, 0x71C5 }, + { 0xEA48, 0x71C2 }, + { 0xEA49, 0x71BF }, + { 0xEA4A, 0x71B8 }, + { 0xEA4B, 0x71D6 }, + { 0xEA4C, 0x71C0 }, + { 0xEA4D, 0x71C1 }, + { 0xEA4E, 0x71CB }, + { 0xEA4F, 0x71D4 }, + { 0xEA50, 0x71CA }, + { 0xEA51, 0x71C7 }, + { 0xEA52, 0x71CF }, + { 0xEA53, 0x71BD }, + { 0xEA54, 0x71D8 }, + { 0xEA55, 0x71BC }, + { 0xEA56, 0x71C6 }, + { 0xEA57, 0x71DA }, + { 0xEA58, 0x71DB }, + { 0xEA59, 0x729D }, + { 0xEA5A, 0x729E }, + { 0xEA5B, 0x7369 }, + { 0xEA5C, 0x7366 }, + { 0xEA5D, 0x7367 }, + { 0xEA5E, 0x736C }, + { 0xEA5F, 0x7365 }, + { 0xEA60, 0x736B }, + { 0xEA61, 0x736A }, + { 0xEA62, 0x747F }, + { 0xEA63, 0x749A }, + { 0xEA64, 0x74A0 }, + { 0xEA65, 0x7494 }, + { 0xEA66, 0x7492 }, + { 0xEA67, 0x7495 }, + { 0xEA68, 0x74A1 }, + { 0xEA69, 0x750B }, + { 0xEA6A, 0x7580 }, + { 0xEA6B, 0x762F }, + { 0xEA6C, 0x762D }, + { 0xEA6D, 0x7631 }, + { 0xEA6E, 0x763D }, + { 0xEA6F, 0x7633 }, + { 0xEA70, 0x763C }, + { 0xEA71, 0x7635 }, + { 0xEA72, 0x7632 }, + { 0xEA73, 0x7630 }, + { 0xEA74, 0x76BB }, + { 0xEA75, 0x76E6 }, + { 0xEA76, 0x779A }, + { 0xEA77, 0x779D }, + { 0xEA78, 0x77A1 }, + { 0xEA79, 0x779C }, + { 0xEA7A, 0x779B }, + { 0xEA7B, 0x77A2 }, + { 0xEA7C, 0x77A3 }, + { 0xEA7D, 0x7795 }, + { 0xEA7E, 0x7799 }, + { 0xEAA1, 0x7797 }, + { 0xEAA2, 0x78DD }, + { 0xEAA3, 0x78E9 }, + { 0xEAA4, 0x78E5 }, + { 0xEAA5, 0x78EA }, + { 0xEAA6, 0x78DE }, + { 0xEAA7, 0x78E3 }, + { 0xEAA8, 0x78DB }, + { 0xEAA9, 0x78E1 }, + { 0xEAAA, 0x78E2 }, + { 0xEAAB, 0x78ED }, + { 0xEAAC, 0x78DF }, + { 0xEAAD, 0x78E0 }, + { 0xEAAE, 0x79A4 }, + { 0xEAAF, 0x7A44 }, + { 0xEAB0, 0x7A48 }, + { 0xEAB1, 0x7A47 }, + { 0xEAB2, 0x7AB6 }, + { 0xEAB3, 0x7AB8 }, + { 0xEAB4, 0x7AB5 }, + { 0xEAB5, 0x7AB1 }, + { 0xEAB6, 0x7AB7 }, + { 0xEAB7, 0x7BDE }, + { 0xEAB8, 0x7BE3 }, + { 0xEAB9, 0x7BE7 }, + { 0xEABA, 0x7BDD }, + { 0xEABB, 0x7BD5 }, + { 0xEABC, 0x7BE5 }, + { 0xEABD, 0x7BDA }, + { 0xEABE, 0x7BE8 }, + { 0xEABF, 0x7BF9 }, + { 0xEAC0, 0x7BD4 }, + { 0xEAC1, 0x7BEA }, + { 0xEAC2, 0x7BE2 }, + { 0xEAC3, 0x7BDC }, + { 0xEAC4, 0x7BEB }, + { 0xEAC5, 0x7BD8 }, + { 0xEAC6, 0x7BDF }, + { 0xEAC7, 0x7CD2 }, + { 0xEAC8, 0x7CD4 }, + { 0xEAC9, 0x7CD7 }, + { 0xEACA, 0x7CD0 }, + { 0xEACB, 0x7CD1 }, + { 0xEACC, 0x7E12 }, + { 0xEACD, 0x7E21 }, + { 0xEACE, 0x7E17 }, + { 0xEACF, 0x7E0C }, + { 0xEAD0, 0x7E1F }, + { 0xEAD1, 0x7E20 }, + { 0xEAD2, 0x7E13 }, + { 0xEAD3, 0x7E0E }, + { 0xEAD4, 0x7E1C }, + { 0xEAD5, 0x7E15 }, + { 0xEAD6, 0x7E1A }, + { 0xEAD7, 0x7E22 }, + { 0xEAD8, 0x7E0B }, + { 0xEAD9, 0x7E0F }, + { 0xEADA, 0x7E16 }, + { 0xEADB, 0x7E0D }, + { 0xEADC, 0x7E14 }, + { 0xEADD, 0x7E25 }, + { 0xEADE, 0x7E24 }, + { 0xEADF, 0x7F43 }, + { 0xEAE0, 0x7F7B }, + { 0xEAE1, 0x7F7C }, + { 0xEAE2, 0x7F7A }, + { 0xEAE3, 0x7FB1 }, + { 0xEAE4, 0x7FEF }, + { 0xEAE5, 0x802A }, + { 0xEAE6, 0x8029 }, + { 0xEAE7, 0x806C }, + { 0xEAE8, 0x81B1 }, + { 0xEAE9, 0x81A6 }, + { 0xEAEA, 0x81AE }, + { 0xEAEB, 0x81B9 }, + { 0xEAEC, 0x81B5 }, + { 0xEAED, 0x81AB }, + { 0xEAEE, 0x81B0 }, + { 0xEAEF, 0x81AC }, + { 0xEAF0, 0x81B4 }, + { 0xEAF1, 0x81B2 }, + { 0xEAF2, 0x81B7 }, + { 0xEAF3, 0x81A7 }, + { 0xEAF4, 0x81F2 }, + { 0xEAF5, 0x8255 }, + { 0xEAF6, 0x8256 }, + { 0xEAF7, 0x8257 }, + { 0xEAF8, 0x8556 }, + { 0xEAF9, 0x8545 }, + { 0xEAFA, 0x856B }, + { 0xEAFB, 0x854D }, + { 0xEAFC, 0x8553 }, + { 0xEAFD, 0x8561 }, + { 0xEAFE, 0x8558 }, + { 0xEB40, 0x8540 }, + { 0xEB41, 0x8546 }, + { 0xEB42, 0x8564 }, + { 0xEB43, 0x8541 }, + { 0xEB44, 0x8562 }, + { 0xEB45, 0x8544 }, + { 0xEB46, 0x8551 }, + { 0xEB47, 0x8547 }, + { 0xEB48, 0x8563 }, + { 0xEB49, 0x853E }, + { 0xEB4A, 0x855B }, + { 0xEB4B, 0x8571 }, + { 0xEB4C, 0x854E }, + { 0xEB4D, 0x856E }, + { 0xEB4E, 0x8575 }, + { 0xEB4F, 0x8555 }, + { 0xEB50, 0x8567 }, + { 0xEB51, 0x8560 }, + { 0xEB52, 0x858C }, + { 0xEB53, 0x8566 }, + { 0xEB54, 0x855D }, + { 0xEB55, 0x8554 }, + { 0xEB56, 0x8565 }, + { 0xEB57, 0x856C }, + { 0xEB58, 0x8663 }, + { 0xEB59, 0x8665 }, + { 0xEB5A, 0x8664 }, + { 0xEB5B, 0x879B }, + { 0xEB5C, 0x878F }, + { 0xEB5D, 0x8797 }, + { 0xEB5E, 0x8793 }, + { 0xEB5F, 0x8792 }, + { 0xEB60, 0x8788 }, + { 0xEB61, 0x8781 }, + { 0xEB62, 0x8796 }, + { 0xEB63, 0x8798 }, + { 0xEB64, 0x8779 }, + { 0xEB65, 0x8787 }, + { 0xEB66, 0x87A3 }, + { 0xEB67, 0x8785 }, + { 0xEB68, 0x8790 }, + { 0xEB69, 0x8791 }, + { 0xEB6A, 0x879D }, + { 0xEB6B, 0x8784 }, + { 0xEB6C, 0x8794 }, + { 0xEB6D, 0x879C }, + { 0xEB6E, 0x879A }, + { 0xEB6F, 0x8789 }, + { 0xEB70, 0x891E }, + { 0xEB71, 0x8926 }, + { 0xEB72, 0x8930 }, + { 0xEB73, 0x892D }, + { 0xEB74, 0x892E }, + { 0xEB75, 0x8927 }, + { 0xEB76, 0x8931 }, + { 0xEB77, 0x8922 }, + { 0xEB78, 0x8929 }, + { 0xEB79, 0x8923 }, + { 0xEB7A, 0x892F }, + { 0xEB7B, 0x892C }, + { 0xEB7C, 0x891F }, + { 0xEB7D, 0x89F1 }, + { 0xEB7E, 0x8AE0 }, + { 0xEBA1, 0x8AE2 }, + { 0xEBA2, 0x8AF2 }, + { 0xEBA3, 0x8AF4 }, + { 0xEBA4, 0x8AF5 }, + { 0xEBA5, 0x8ADD }, + { 0xEBA6, 0x8B14 }, + { 0xEBA7, 0x8AE4 }, + { 0xEBA8, 0x8ADF }, + { 0xEBA9, 0x8AF0 }, + { 0xEBAA, 0x8AC8 }, + { 0xEBAB, 0x8ADE }, + { 0xEBAC, 0x8AE1 }, + { 0xEBAD, 0x8AE8 }, + { 0xEBAE, 0x8AFF }, + { 0xEBAF, 0x8AEF }, + { 0xEBB0, 0x8AFB }, + { 0xEBB1, 0x8C91 }, + { 0xEBB2, 0x8C92 }, + { 0xEBB3, 0x8C90 }, + { 0xEBB4, 0x8CF5 }, + { 0xEBB5, 0x8CEE }, + { 0xEBB6, 0x8CF1 }, + { 0xEBB7, 0x8CF0 }, + { 0xEBB8, 0x8CF3 }, + { 0xEBB9, 0x8D6C }, + { 0xEBBA, 0x8D6E }, + { 0xEBBB, 0x8DA5 }, + { 0xEBBC, 0x8DA7 }, + { 0xEBBD, 0x8E33 }, + { 0xEBBE, 0x8E3E }, + { 0xEBBF, 0x8E38 }, + { 0xEBC0, 0x8E40 }, + { 0xEBC1, 0x8E45 }, + { 0xEBC2, 0x8E36 }, + { 0xEBC3, 0x8E3C }, + { 0xEBC4, 0x8E3D }, + { 0xEBC5, 0x8E41 }, + { 0xEBC6, 0x8E30 }, + { 0xEBC7, 0x8E3F }, + { 0xEBC8, 0x8EBD }, + { 0xEBC9, 0x8F36 }, + { 0xEBCA, 0x8F2E }, + { 0xEBCB, 0x8F35 }, + { 0xEBCC, 0x8F32 }, + { 0xEBCD, 0x8F39 }, + { 0xEBCE, 0x8F37 }, + { 0xEBCF, 0x8F34 }, + { 0xEBD0, 0x9076 }, + { 0xEBD1, 0x9079 }, + { 0xEBD2, 0x907B }, + { 0xEBD3, 0x9086 }, + { 0xEBD4, 0x90FA }, + { 0xEBD5, 0x9133 }, + { 0xEBD6, 0x9135 }, + { 0xEBD7, 0x9136 }, + { 0xEBD8, 0x9193 }, + { 0xEBD9, 0x9190 }, + { 0xEBDA, 0x9191 }, + { 0xEBDB, 0x918D }, + { 0xEBDC, 0x918F }, + { 0xEBDD, 0x9327 }, + { 0xEBDE, 0x931E }, + { 0xEBDF, 0x9308 }, + { 0xEBE0, 0x931F }, + { 0xEBE1, 0x9306 }, + { 0xEBE2, 0x930F }, + { 0xEBE3, 0x937A }, + { 0xEBE4, 0x9338 }, + { 0xEBE5, 0x933C }, + { 0xEBE6, 0x931B }, + { 0xEBE7, 0x9323 }, + { 0xEBE8, 0x9312 }, + { 0xEBE9, 0x9301 }, + { 0xEBEA, 0x9346 }, + { 0xEBEB, 0x932D }, + { 0xEBEC, 0x930E }, + { 0xEBED, 0x930D }, + { 0xEBEE, 0x92CB }, + { 0xEBEF, 0x931D }, + { 0xEBF0, 0x92FA }, + { 0xEBF1, 0x9325 }, + { 0xEBF2, 0x9313 }, + { 0xEBF3, 0x92F9 }, + { 0xEBF4, 0x92F7 }, + { 0xEBF5, 0x9334 }, + { 0xEBF6, 0x9302 }, + { 0xEBF7, 0x9324 }, + { 0xEBF8, 0x92FF }, + { 0xEBF9, 0x9329 }, + { 0xEBFA, 0x9339 }, + { 0xEBFB, 0x9335 }, + { 0xEBFC, 0x932A }, + { 0xEBFD, 0x9314 }, + { 0xEBFE, 0x930C }, + { 0xEC40, 0x930B }, + { 0xEC41, 0x92FE }, + { 0xEC42, 0x9309 }, + { 0xEC43, 0x9300 }, + { 0xEC44, 0x92FB }, + { 0xEC45, 0x9316 }, + { 0xEC46, 0x95BC }, + { 0xEC47, 0x95CD }, + { 0xEC48, 0x95BE }, + { 0xEC49, 0x95B9 }, + { 0xEC4A, 0x95BA }, + { 0xEC4B, 0x95B6 }, + { 0xEC4C, 0x95BF }, + { 0xEC4D, 0x95B5 }, + { 0xEC4E, 0x95BD }, + { 0xEC4F, 0x96A9 }, + { 0xEC50, 0x96D4 }, + { 0xEC51, 0x970B }, + { 0xEC52, 0x9712 }, + { 0xEC53, 0x9710 }, + { 0xEC54, 0x9799 }, + { 0xEC55, 0x9797 }, + { 0xEC56, 0x9794 }, + { 0xEC57, 0x97F0 }, + { 0xEC58, 0x97F8 }, + { 0xEC59, 0x9835 }, + { 0xEC5A, 0x982F }, + { 0xEC5B, 0x9832 }, + { 0xEC5C, 0x9924 }, + { 0xEC5D, 0x991F }, + { 0xEC5E, 0x9927 }, + { 0xEC5F, 0x9929 }, + { 0xEC60, 0x999E }, + { 0xEC61, 0x99EE }, + { 0xEC62, 0x99EC }, + { 0xEC63, 0x99E5 }, + { 0xEC64, 0x99E4 }, + { 0xEC65, 0x99F0 }, + { 0xEC66, 0x99E3 }, + { 0xEC67, 0x99EA }, + { 0xEC68, 0x99E9 }, + { 0xEC69, 0x99E7 }, + { 0xEC6A, 0x9AB9 }, + { 0xEC6B, 0x9ABF }, + { 0xEC6C, 0x9AB4 }, + { 0xEC6D, 0x9ABB }, + { 0xEC6E, 0x9AF6 }, + { 0xEC6F, 0x9AFA }, + { 0xEC70, 0x9AF9 }, + { 0xEC71, 0x9AF7 }, + { 0xEC72, 0x9B33 }, + { 0xEC73, 0x9B80 }, + { 0xEC74, 0x9B85 }, + { 0xEC75, 0x9B87 }, + { 0xEC76, 0x9B7C }, + { 0xEC77, 0x9B7E }, + { 0xEC78, 0x9B7B }, + { 0xEC79, 0x9B82 }, + { 0xEC7A, 0x9B93 }, + { 0xEC7B, 0x9B92 }, + { 0xEC7C, 0x9B90 }, + { 0xEC7D, 0x9B7A }, + { 0xEC7E, 0x9B95 }, + { 0xECA1, 0x9B7D }, + { 0xECA2, 0x9B88 }, + { 0xECA3, 0x9D25 }, + { 0xECA4, 0x9D17 }, + { 0xECA5, 0x9D20 }, + { 0xECA6, 0x9D1E }, + { 0xECA7, 0x9D14 }, + { 0xECA8, 0x9D29 }, + { 0xECA9, 0x9D1D }, + { 0xECAA, 0x9D18 }, + { 0xECAB, 0x9D22 }, + { 0xECAC, 0x9D10 }, + { 0xECAD, 0x9D19 }, + { 0xECAE, 0x9D1F }, + { 0xECAF, 0x9E88 }, + { 0xECB0, 0x9E86 }, + { 0xECB1, 0x9E87 }, + { 0xECB2, 0x9EAE }, + { 0xECB3, 0x9EAD }, + { 0xECB4, 0x9ED5 }, + { 0xECB5, 0x9ED6 }, + { 0xECB6, 0x9EFA }, + { 0xECB7, 0x9F12 }, + { 0xECB8, 0x9F3D }, + { 0xECB9, 0x5126 }, + { 0xECBA, 0x5125 }, + { 0xECBB, 0x5122 }, + { 0xECBC, 0x5124 }, + { 0xECBD, 0x5120 }, + { 0xECBE, 0x5129 }, + { 0xECBF, 0x52F4 }, + { 0xECC0, 0x5693 }, + { 0xECC1, 0x568C }, + { 0xECC2, 0x568D }, + { 0xECC3, 0x5686 }, + { 0xECC4, 0x5684 }, + { 0xECC5, 0x5683 }, + { 0xECC6, 0x567E }, + { 0xECC7, 0x5682 }, + { 0xECC8, 0x567F }, + { 0xECC9, 0x5681 }, + { 0xECCA, 0x58D6 }, + { 0xECCB, 0x58D4 }, + { 0xECCC, 0x58CF }, + { 0xECCD, 0x58D2 }, + { 0xECCE, 0x5B2D }, + { 0xECCF, 0x5B25 }, + { 0xECD0, 0x5B32 }, + { 0xECD1, 0x5B23 }, + { 0xECD2, 0x5B2C }, + { 0xECD3, 0x5B27 }, + { 0xECD4, 0x5B26 }, + { 0xECD5, 0x5B2F }, + { 0xECD6, 0x5B2E }, + { 0xECD7, 0x5B7B }, + { 0xECD8, 0x5BF1 }, + { 0xECD9, 0x5BF2 }, + { 0xECDA, 0x5DB7 }, + { 0xECDB, 0x5E6C }, + { 0xECDC, 0x5E6A }, + { 0xECDD, 0x5FBE }, + { 0xECDE, 0x5FBB }, + { 0xECDF, 0x61C3 }, + { 0xECE0, 0x61B5 }, + { 0xECE1, 0x61BC }, + { 0xECE2, 0x61E7 }, + { 0xECE3, 0x61E0 }, + { 0xECE4, 0x61E5 }, + { 0xECE5, 0x61E4 }, + { 0xECE6, 0x61E8 }, + { 0xECE7, 0x61DE }, + { 0xECE8, 0x64EF }, + { 0xECE9, 0x64E9 }, + { 0xECEA, 0x64E3 }, + { 0xECEB, 0x64EB }, + { 0xECEC, 0x64E4 }, + { 0xECED, 0x64E8 }, + { 0xECEE, 0x6581 }, + { 0xECEF, 0x6580 }, + { 0xECF0, 0x65B6 }, + { 0xECF1, 0x65DA }, + { 0xECF2, 0x66D2 }, + { 0xECF3, 0x6A8D }, + { 0xECF4, 0x6A96 }, + { 0xECF5, 0x6A81 }, + { 0xECF6, 0x6AA5 }, + { 0xECF7, 0x6A89 }, + { 0xECF8, 0x6A9F }, + { 0xECF9, 0x6A9B }, + { 0xECFA, 0x6AA1 }, + { 0xECFB, 0x6A9E }, + { 0xECFC, 0x6A87 }, + { 0xECFD, 0x6A93 }, + { 0xECFE, 0x6A8E }, + { 0xED40, 0x6A95 }, + { 0xED41, 0x6A83 }, + { 0xED42, 0x6AA8 }, + { 0xED43, 0x6AA4 }, + { 0xED44, 0x6A91 }, + { 0xED45, 0x6A7F }, + { 0xED46, 0x6AA6 }, + { 0xED47, 0x6A9A }, + { 0xED48, 0x6A85 }, + { 0xED49, 0x6A8C }, + { 0xED4A, 0x6A92 }, + { 0xED4B, 0x6B5B }, + { 0xED4C, 0x6BAD }, + { 0xED4D, 0x6C09 }, + { 0xED4E, 0x6FCC }, + { 0xED4F, 0x6FA9 }, + { 0xED50, 0x6FF4 }, + { 0xED51, 0x6FD4 }, + { 0xED52, 0x6FE3 }, + { 0xED53, 0x6FDC }, + { 0xED54, 0x6FED }, + { 0xED55, 0x6FE7 }, + { 0xED56, 0x6FE6 }, + { 0xED57, 0x6FDE }, + { 0xED58, 0x6FF2 }, + { 0xED59, 0x6FDD }, + { 0xED5A, 0x6FE2 }, + { 0xED5B, 0x6FE8 }, + { 0xED5C, 0x71E1 }, + { 0xED5D, 0x71F1 }, + { 0xED5E, 0x71E8 }, + { 0xED5F, 0x71F2 }, + { 0xED60, 0x71E4 }, + { 0xED61, 0x71F0 }, + { 0xED62, 0x71E2 }, + { 0xED63, 0x7373 }, + { 0xED64, 0x736E }, + { 0xED65, 0x736F }, + { 0xED66, 0x7497 }, + { 0xED67, 0x74B2 }, + { 0xED68, 0x74AB }, + { 0xED69, 0x7490 }, + { 0xED6A, 0x74AA }, + { 0xED6B, 0x74AD }, + { 0xED6C, 0x74B1 }, + { 0xED6D, 0x74A5 }, + { 0xED6E, 0x74AF }, + { 0xED6F, 0x7510 }, + { 0xED70, 0x7511 }, + { 0xED71, 0x7512 }, + { 0xED72, 0x750F }, + { 0xED73, 0x7584 }, + { 0xED74, 0x7643 }, + { 0xED75, 0x7648 }, + { 0xED76, 0x7649 }, + { 0xED77, 0x7647 }, + { 0xED78, 0x76A4 }, + { 0xED79, 0x76E9 }, + { 0xED7A, 0x77B5 }, + { 0xED7B, 0x77AB }, + { 0xED7C, 0x77B2 }, + { 0xED7D, 0x77B7 }, + { 0xED7E, 0x77B6 }, + { 0xEDA1, 0x77B4 }, + { 0xEDA2, 0x77B1 }, + { 0xEDA3, 0x77A8 }, + { 0xEDA4, 0x77F0 }, + { 0xEDA5, 0x78F3 }, + { 0xEDA6, 0x78FD }, + { 0xEDA7, 0x7902 }, + { 0xEDA8, 0x78FB }, + { 0xEDA9, 0x78FC }, + { 0xEDAA, 0x78F2 }, + { 0xEDAB, 0x7905 }, + { 0xEDAC, 0x78F9 }, + { 0xEDAD, 0x78FE }, + { 0xEDAE, 0x7904 }, + { 0xEDAF, 0x79AB }, + { 0xEDB0, 0x79A8 }, + { 0xEDB1, 0x7A5C }, + { 0xEDB2, 0x7A5B }, + { 0xEDB3, 0x7A56 }, + { 0xEDB4, 0x7A58 }, + { 0xEDB5, 0x7A54 }, + { 0xEDB6, 0x7A5A }, + { 0xEDB7, 0x7ABE }, + { 0xEDB8, 0x7AC0 }, + { 0xEDB9, 0x7AC1 }, + { 0xEDBA, 0x7C05 }, + { 0xEDBB, 0x7C0F }, + { 0xEDBC, 0x7BF2 }, + { 0xEDBD, 0x7C00 }, + { 0xEDBE, 0x7BFF }, + { 0xEDBF, 0x7BFB }, + { 0xEDC0, 0x7C0E }, + { 0xEDC1, 0x7BF4 }, + { 0xEDC2, 0x7C0B }, + { 0xEDC3, 0x7BF3 }, + { 0xEDC4, 0x7C02 }, + { 0xEDC5, 0x7C09 }, + { 0xEDC6, 0x7C03 }, + { 0xEDC7, 0x7C01 }, + { 0xEDC8, 0x7BF8 }, + { 0xEDC9, 0x7BFD }, + { 0xEDCA, 0x7C06 }, + { 0xEDCB, 0x7BF0 }, + { 0xEDCC, 0x7BF1 }, + { 0xEDCD, 0x7C10 }, + { 0xEDCE, 0x7C0A }, + { 0xEDCF, 0x7CE8 }, + { 0xEDD0, 0x7E2D }, + { 0xEDD1, 0x7E3C }, + { 0xEDD2, 0x7E42 }, + { 0xEDD3, 0x7E33 }, + { 0xEDD4, 0x9848 }, + { 0xEDD5, 0x7E38 }, + { 0xEDD6, 0x7E2A }, + { 0xEDD7, 0x7E49 }, + { 0xEDD8, 0x7E40 }, + { 0xEDD9, 0x7E47 }, + { 0xEDDA, 0x7E29 }, + { 0xEDDB, 0x7E4C }, + { 0xEDDC, 0x7E30 }, + { 0xEDDD, 0x7E3B }, + { 0xEDDE, 0x7E36 }, + { 0xEDDF, 0x7E44 }, + { 0xEDE0, 0x7E3A }, + { 0xEDE1, 0x7F45 }, + { 0xEDE2, 0x7F7F }, + { 0xEDE3, 0x7F7E }, + { 0xEDE4, 0x7F7D }, + { 0xEDE5, 0x7FF4 }, + { 0xEDE6, 0x7FF2 }, + { 0xEDE7, 0x802C }, + { 0xEDE8, 0x81BB }, + { 0xEDE9, 0x81C4 }, + { 0xEDEA, 0x81CC }, + { 0xEDEB, 0x81CA }, + { 0xEDEC, 0x81C5 }, + { 0xEDED, 0x81C7 }, + { 0xEDEE, 0x81BC }, + { 0xEDEF, 0x81E9 }, + { 0xEDF0, 0x825B }, + { 0xEDF1, 0x825A }, + { 0xEDF2, 0x825C }, + { 0xEDF3, 0x8583 }, + { 0xEDF4, 0x8580 }, + { 0xEDF5, 0x858F }, + { 0xEDF6, 0x85A7 }, + { 0xEDF7, 0x8595 }, + { 0xEDF8, 0x85A0 }, + { 0xEDF9, 0x858B }, + { 0xEDFA, 0x85A3 }, + { 0xEDFB, 0x857B }, + { 0xEDFC, 0x85A4 }, + { 0xEDFD, 0x859A }, + { 0xEDFE, 0x859E }, + { 0xEE40, 0x8577 }, + { 0xEE41, 0x857C }, + { 0xEE42, 0x8589 }, + { 0xEE43, 0x85A1 }, + { 0xEE44, 0x857A }, + { 0xEE45, 0x8578 }, + { 0xEE46, 0x8557 }, + { 0xEE47, 0x858E }, + { 0xEE48, 0x8596 }, + { 0xEE49, 0x8586 }, + { 0xEE4A, 0x858D }, + { 0xEE4B, 0x8599 }, + { 0xEE4C, 0x859D }, + { 0xEE4D, 0x8581 }, + { 0xEE4E, 0x85A2 }, + { 0xEE4F, 0x8582 }, + { 0xEE50, 0x8588 }, + { 0xEE51, 0x8585 }, + { 0xEE52, 0x8579 }, + { 0xEE53, 0x8576 }, + { 0xEE54, 0x8598 }, + { 0xEE55, 0x8590 }, + { 0xEE56, 0x859F }, + { 0xEE57, 0x8668 }, + { 0xEE58, 0x87BE }, + { 0xEE59, 0x87AA }, + { 0xEE5A, 0x87AD }, + { 0xEE5B, 0x87C5 }, + { 0xEE5C, 0x87B0 }, + { 0xEE5D, 0x87AC }, + { 0xEE5E, 0x87B9 }, + { 0xEE5F, 0x87B5 }, + { 0xEE60, 0x87BC }, + { 0xEE61, 0x87AE }, + { 0xEE62, 0x87C9 }, + { 0xEE63, 0x87C3 }, + { 0xEE64, 0x87C2 }, + { 0xEE65, 0x87CC }, + { 0xEE66, 0x87B7 }, + { 0xEE67, 0x87AF }, + { 0xEE68, 0x87C4 }, + { 0xEE69, 0x87CA }, + { 0xEE6A, 0x87B4 }, + { 0xEE6B, 0x87B6 }, + { 0xEE6C, 0x87BF }, + { 0xEE6D, 0x87B8 }, + { 0xEE6E, 0x87BD }, + { 0xEE6F, 0x87DE }, + { 0xEE70, 0x87B2 }, + { 0xEE71, 0x8935 }, + { 0xEE72, 0x8933 }, + { 0xEE73, 0x893C }, + { 0xEE74, 0x893E }, + { 0xEE75, 0x8941 }, + { 0xEE76, 0x8952 }, + { 0xEE77, 0x8937 }, + { 0xEE78, 0x8942 }, + { 0xEE79, 0x89AD }, + { 0xEE7A, 0x89AF }, + { 0xEE7B, 0x89AE }, + { 0xEE7C, 0x89F2 }, + { 0xEE7D, 0x89F3 }, + { 0xEE7E, 0x8B1E }, + { 0xEEA1, 0x8B18 }, + { 0xEEA2, 0x8B16 }, + { 0xEEA3, 0x8B11 }, + { 0xEEA4, 0x8B05 }, + { 0xEEA5, 0x8B0B }, + { 0xEEA6, 0x8B22 }, + { 0xEEA7, 0x8B0F }, + { 0xEEA8, 0x8B12 }, + { 0xEEA9, 0x8B15 }, + { 0xEEAA, 0x8B07 }, + { 0xEEAB, 0x8B0D }, + { 0xEEAC, 0x8B08 }, + { 0xEEAD, 0x8B06 }, + { 0xEEAE, 0x8B1C }, + { 0xEEAF, 0x8B13 }, + { 0xEEB0, 0x8B1A }, + { 0xEEB1, 0x8C4F }, + { 0xEEB2, 0x8C70 }, + { 0xEEB3, 0x8C72 }, + { 0xEEB4, 0x8C71 }, + { 0xEEB5, 0x8C6F }, + { 0xEEB6, 0x8C95 }, + { 0xEEB7, 0x8C94 }, + { 0xEEB8, 0x8CF9 }, + { 0xEEB9, 0x8D6F }, + { 0xEEBA, 0x8E4E }, + { 0xEEBB, 0x8E4D }, + { 0xEEBC, 0x8E53 }, + { 0xEEBD, 0x8E50 }, + { 0xEEBE, 0x8E4C }, + { 0xEEBF, 0x8E47 }, + { 0xEEC0, 0x8F43 }, + { 0xEEC1, 0x8F40 }, + { 0xEEC2, 0x9085 }, + { 0xEEC3, 0x907E }, + { 0xEEC4, 0x9138 }, + { 0xEEC5, 0x919A }, + { 0xEEC6, 0x91A2 }, + { 0xEEC7, 0x919B }, + { 0xEEC8, 0x9199 }, + { 0xEEC9, 0x919F }, + { 0xEECA, 0x91A1 }, + { 0xEECB, 0x919D }, + { 0xEECC, 0x91A0 }, + { 0xEECD, 0x93A1 }, + { 0xEECE, 0x9383 }, + { 0xEECF, 0x93AF }, + { 0xEED0, 0x9364 }, + { 0xEED1, 0x9356 }, + { 0xEED2, 0x9347 }, + { 0xEED3, 0x937C }, + { 0xEED4, 0x9358 }, + { 0xEED5, 0x935C }, + { 0xEED6, 0x9376 }, + { 0xEED7, 0x9349 }, + { 0xEED8, 0x9350 }, + { 0xEED9, 0x9351 }, + { 0xEEDA, 0x9360 }, + { 0xEEDB, 0x936D }, + { 0xEEDC, 0x938F }, + { 0xEEDD, 0x934C }, + { 0xEEDE, 0x936A }, + { 0xEEDF, 0x9379 }, + { 0xEEE0, 0x9357 }, + { 0xEEE1, 0x9355 }, + { 0xEEE2, 0x9352 }, + { 0xEEE3, 0x934F }, + { 0xEEE4, 0x9371 }, + { 0xEEE5, 0x9377 }, + { 0xEEE6, 0x937B }, + { 0xEEE7, 0x9361 }, + { 0xEEE8, 0x935E }, + { 0xEEE9, 0x9363 }, + { 0xEEEA, 0x9367 }, + { 0xEEEB, 0x9380 }, + { 0xEEEC, 0x934E }, + + + { 0xEEED, 0x9359 }, + { 0xEEEE, 0x95C7 }, + { 0xEEEF, 0x95C0 }, + { 0xEEF0, 0x95C9 }, + { 0xEEF1, 0x95C3 }, + { 0xEEF2, 0x95C5 }, + { 0xEEF3, 0x95B7 }, + { 0xEEF4, 0x96AE }, + { 0xEEF5, 0x96B0 }, + { 0xEEF6, 0x96AC }, + { 0xEEF7, 0x9720 }, + { 0xEEF8, 0x971F }, + { 0xEEF9, 0x9718 }, + { 0xEEFA, 0x971D }, + { 0xEEFB, 0x9719 }, + { 0xEEFC, 0x979A }, + { 0xEEFD, 0x97A1 }, + { 0xEEFE, 0x979C }, + { 0xEF40, 0x979E }, + { 0xEF41, 0x979D }, + { 0xEF42, 0x97D5 }, + { 0xEF43, 0x97D4 }, + { 0xEF44, 0x97F1 }, + { 0xEF45, 0x9841 }, + { 0xEF46, 0x9844 }, + { 0xEF47, 0x984A }, + { 0xEF48, 0x9849 }, + { 0xEF49, 0x9845 }, + { 0xEF4A, 0x9843 }, + { 0xEF4B, 0x9925 }, + { 0xEF4C, 0x992B }, + { 0xEF4D, 0x992C }, + { 0xEF4E, 0x992A }, + { 0xEF4F, 0x9933 }, + { 0xEF50, 0x9932 }, + { 0xEF51, 0x992F }, + { 0xEF52, 0x992D }, + { 0xEF53, 0x9931 }, + { 0xEF54, 0x9930 }, + { 0xEF55, 0x9998 }, + { 0xEF56, 0x99A3 }, + { 0xEF57, 0x99A1 }, + { 0xEF58, 0x9A02 }, + { 0xEF59, 0x99FA }, + { 0xEF5A, 0x99F4 }, + { 0xEF5B, 0x99F7 }, + { 0xEF5C, 0x99F9 }, + { 0xEF5D, 0x99F8 }, + { 0xEF5E, 0x99F6 }, + { 0xEF5F, 0x99FB }, + { 0xEF60, 0x99FD }, + { 0xEF61, 0x99FE }, + { 0xEF62, 0x99FC }, + { 0xEF63, 0x9A03 }, + { 0xEF64, 0x9ABE }, + { 0xEF65, 0x9AFE }, + { 0xEF66, 0x9AFD }, + { 0xEF67, 0x9B01 }, + { 0xEF68, 0x9AFC }, + { 0xEF69, 0x9B48 }, + { 0xEF6A, 0x9B9A }, + { 0xEF6B, 0x9BA8 }, + { 0xEF6C, 0x9B9E }, + { 0xEF6D, 0x9B9B }, + { 0xEF6E, 0x9BA6 }, + { 0xEF6F, 0x9BA1 }, + { 0xEF70, 0x9BA5 }, + { 0xEF71, 0x9BA4 }, + { 0xEF72, 0x9B86 }, + { 0xEF73, 0x9BA2 }, + { 0xEF74, 0x9BA0 }, + { 0xEF75, 0x9BAF }, + { 0xEF76, 0x9D33 }, + { 0xEF77, 0x9D41 }, + { 0xEF78, 0x9D67 }, + { 0xEF79, 0x9D36 }, + { 0xEF7A, 0x9D2E }, + { 0xEF7B, 0x9D2F }, + { 0xEF7C, 0x9D31 }, + { 0xEF7D, 0x9D38 }, + { 0xEF7E, 0x9D30 }, + { 0xEFA1, 0x9D45 }, + { 0xEFA2, 0x9D42 }, + { 0xEFA3, 0x9D43 }, + { 0xEFA4, 0x9D3E }, + { 0xEFA5, 0x9D37 }, + { 0xEFA6, 0x9D40 }, + { 0xEFA7, 0x9D3D }, + { 0xEFA8, 0x7FF5 }, + { 0xEFA9, 0x9D2D }, + { 0xEFAA, 0x9E8A }, + { 0xEFAB, 0x9E89 }, + { 0xEFAC, 0x9E8D }, + { 0xEFAD, 0x9EB0 }, + { 0xEFAE, 0x9EC8 }, + { 0xEFAF, 0x9EDA }, + { 0xEFB0, 0x9EFB }, + { 0xEFB1, 0x9EFF }, + { 0xEFB2, 0x9F24 }, + { 0xEFB3, 0x9F23 }, + { 0xEFB4, 0x9F22 }, + { 0xEFB5, 0x9F54 }, + { 0xEFB6, 0x9FA0 }, + { 0xEFB7, 0x5131 }, + { 0xEFB8, 0x512D }, + { 0xEFB9, 0x512E }, + { 0xEFBA, 0x5698 }, + { 0xEFBB, 0x569C }, + { 0xEFBC, 0x5697 }, + { 0xEFBD, 0x569A }, + { 0xEFBE, 0x569D }, + { 0xEFBF, 0x5699 }, + { 0xEFC0, 0x5970 }, + { 0xEFC1, 0x5B3C }, + { 0xEFC2, 0x5C69 }, + { 0xEFC3, 0x5C6A }, + { 0xEFC4, 0x5DC0 }, + { 0xEFC5, 0x5E6D }, + { 0xEFC6, 0x5E6E }, + { 0xEFC7, 0x61D8 }, + { 0xEFC8, 0x61DF }, + { 0xEFC9, 0x61ED }, + { 0xEFCA, 0x61EE }, + { 0xEFCB, 0x61F1 }, + { 0xEFCC, 0x61EA }, + { 0xEFCD, 0x61F0 }, + { 0xEFCE, 0x61EB }, + { 0xEFCF, 0x61D6 }, + { 0xEFD0, 0x61E9 }, + { 0xEFD1, 0x64FF }, + { 0xEFD2, 0x6504 }, + { 0xEFD3, 0x64FD }, + { 0xEFD4, 0x64F8 }, + { 0xEFD5, 0x6501 }, + { 0xEFD6, 0x6503 }, + { 0xEFD7, 0x64FC }, + { 0xEFD8, 0x6594 }, + { 0xEFD9, 0x65DB }, + { 0xEFDA, 0x66DA }, + { 0xEFDB, 0x66DB }, + { 0xEFDC, 0x66D8 }, + { 0xEFDD, 0x6AC5 }, + { 0xEFDE, 0x6AB9 }, + { 0xEFDF, 0x6ABD }, + { 0xEFE0, 0x6AE1 }, + { 0xEFE1, 0x6AC6 }, + { 0xEFE2, 0x6ABA }, + { 0xEFE3, 0x6AB6 }, + { 0xEFE4, 0x6AB7 }, + { 0xEFE5, 0x6AC7 }, + { 0xEFE6, 0x6AB4 }, + { 0xEFE7, 0x6AAD }, + { 0xEFE8, 0x6B5E }, + { 0xEFE9, 0x6BC9 }, + { 0xEFEA, 0x6C0B }, + { 0xEFEB, 0x7007 }, + { 0xEFEC, 0x700C }, + { 0xEFED, 0x700D }, + { 0xEFEE, 0x7001 }, + { 0xEFEF, 0x7005 }, + { 0xEFF0, 0x7014 }, + { 0xEFF1, 0x700E }, + { 0xEFF2, 0x6FFF }, + { 0xEFF3, 0x7000 }, + { 0xEFF4, 0x6FFB }, + { 0xEFF5, 0x7026 }, + { 0xEFF6, 0x6FFC }, + { 0xEFF7, 0x6FF7 }, + { 0xEFF8, 0x700A }, + { 0xEFF9, 0x7201 }, + { 0xEFFA, 0x71FF }, + { 0xEFFB, 0x71F9 }, + { 0xEFFC, 0x7203 }, + { 0xEFFD, 0x71FD }, + { 0xEFFE, 0x7376 }, + { 0xF040, 0x74B8 }, + { 0xF041, 0x74C0 }, + { 0xF042, 0x74B5 }, + { 0xF043, 0x74C1 }, + { 0xF044, 0x74BE }, + { 0xF045, 0x74B6 }, + { 0xF046, 0x74BB }, + { 0xF047, 0x74C2 }, + { 0xF048, 0x7514 }, + { 0xF049, 0x7513 }, + { 0xF04A, 0x765C }, + { 0xF04B, 0x7664 }, + { 0xF04C, 0x7659 }, + { 0xF04D, 0x7650 }, + { 0xF04E, 0x7653 }, + { 0xF04F, 0x7657 }, + { 0xF050, 0x765A }, + { 0xF051, 0x76A6 }, + { 0xF052, 0x76BD }, + { 0xF053, 0x76EC }, + { 0xF054, 0x77C2 }, + { 0xF055, 0x77BA }, + { 0xF056, 0x78FF }, + { 0xF057, 0x790C }, + { 0xF058, 0x7913 }, + { 0xF059, 0x7914 }, + { 0xF05A, 0x7909 }, + { 0xF05B, 0x7910 }, + { 0xF05C, 0x7912 }, + { 0xF05D, 0x7911 }, + { 0xF05E, 0x79AD }, + { 0xF05F, 0x79AC }, + { 0xF060, 0x7A5F }, + { 0xF061, 0x7C1C }, + { 0xF062, 0x7C29 }, + { 0xF063, 0x7C19 }, + { 0xF064, 0x7C20 }, + { 0xF065, 0x7C1F }, + { 0xF066, 0x7C2D }, + { 0xF067, 0x7C1D }, + { 0xF068, 0x7C26 }, + { 0xF069, 0x7C28 }, + { 0xF06A, 0x7C22 }, + { 0xF06B, 0x7C25 }, + { 0xF06C, 0x7C30 }, + { 0xF06D, 0x7E5C }, + { 0xF06E, 0x7E50 }, + { 0xF06F, 0x7E56 }, + { 0xF070, 0x7E63 }, + { 0xF071, 0x7E58 }, + { 0xF072, 0x7E62 }, + { 0xF073, 0x7E5F }, + { 0xF074, 0x7E51 }, + { 0xF075, 0x7E60 }, + { 0xF076, 0x7E57 }, + { 0xF077, 0x7E53 }, + { 0xF078, 0x7FB5 }, + { 0xF079, 0x7FB3 }, + { 0xF07A, 0x7FF7 }, + { 0xF07B, 0x7FF8 }, + { 0xF07C, 0x8075 }, + { 0xF07D, 0x81D1 }, + { 0xF07E, 0x81D2 }, + { 0xF0A1, 0x81D0 }, + { 0xF0A2, 0x825F }, + { 0xF0A3, 0x825E }, + { 0xF0A4, 0x85B4 }, + { 0xF0A5, 0x85C6 }, + { 0xF0A6, 0x85C0 }, + { 0xF0A7, 0x85C3 }, + { 0xF0A8, 0x85C2 }, + { 0xF0A9, 0x85B3 }, + { 0xF0AA, 0x85B5 }, + { 0xF0AB, 0x85BD }, + { 0xF0AC, 0x85C7 }, + { 0xF0AD, 0x85C4 }, + { 0xF0AE, 0x85BF }, + { 0xF0AF, 0x85CB }, + { 0xF0B0, 0x85CE }, + { 0xF0B1, 0x85C8 }, + { 0xF0B2, 0x85C5 }, + { 0xF0B3, 0x85B1 }, + { 0xF0B4, 0x85B6 }, + { 0xF0B5, 0x85D2 }, + { 0xF0B6, 0x8624 }, + { 0xF0B7, 0x85B8 }, + { 0xF0B8, 0x85B7 }, + { 0xF0B9, 0x85BE }, + { 0xF0BA, 0x8669 }, + { 0xF0BB, 0x87E7 }, + { 0xF0BC, 0x87E6 }, + { 0xF0BD, 0x87E2 }, + { 0xF0BE, 0x87DB }, + { 0xF0BF, 0x87EB }, + { 0xF0C0, 0x87EA }, + { 0xF0C1, 0x87E5 }, + { 0xF0C2, 0x87DF }, + { 0xF0C3, 0x87F3 }, + { 0xF0C4, 0x87E4 }, + { 0xF0C5, 0x87D4 }, + { 0xF0C6, 0x87DC }, + { 0xF0C7, 0x87D3 }, + { 0xF0C8, 0x87ED }, + { 0xF0C9, 0x87D8 }, + { 0xF0CA, 0x87E3 }, + { 0xF0CB, 0x87A4 }, + { 0xF0CC, 0x87D7 }, + { 0xF0CD, 0x87D9 }, + { 0xF0CE, 0x8801 }, + { 0xF0CF, 0x87F4 }, + { 0xF0D0, 0x87E8 }, + { 0xF0D1, 0x87DD }, + { 0xF0D2, 0x8953 }, + { 0xF0D3, 0x894B }, + { 0xF0D4, 0x894F }, + { 0xF0D5, 0x894C }, + { 0xF0D6, 0x8946 }, + { 0xF0D7, 0x8950 }, + { 0xF0D8, 0x8951 }, + { 0xF0D9, 0x8949 }, + { 0xF0DA, 0x8B2A }, + { 0xF0DB, 0x8B27 }, + { 0xF0DC, 0x8B23 }, + { 0xF0DD, 0x8B33 }, + { 0xF0DE, 0x8B30 }, + { 0xF0DF, 0x8B35 }, + { 0xF0E0, 0x8B47 }, + { 0xF0E1, 0x8B2F }, + { 0xF0E2, 0x8B3C }, + { 0xF0E3, 0x8B3E }, + { 0xF0E4, 0x8B31 }, + { 0xF0E5, 0x8B25 }, + { 0xF0E6, 0x8B37 }, + { 0xF0E7, 0x8B26 }, + { 0xF0E8, 0x8B36 }, + { 0xF0E9, 0x8B2E }, + { 0xF0EA, 0x8B24 }, + { 0xF0EB, 0x8B3B }, + { 0xF0EC, 0x8B3D }, + { 0xF0ED, 0x8B3A }, + { 0xF0EE, 0x8C42 }, + { 0xF0EF, 0x8C75 }, + { 0xF0F0, 0x8C99 }, + { 0xF0F1, 0x8C98 }, + { 0xF0F2, 0x8C97 }, + { 0xF0F3, 0x8CFE }, + { 0xF0F4, 0x8D04 }, + { 0xF0F5, 0x8D02 }, + { 0xF0F6, 0x8D00 }, + { 0xF0F7, 0x8E5C }, + { 0xF0F8, 0x8E62 }, + { 0xF0F9, 0x8E60 }, + { 0xF0FA, 0x8E57 }, + { 0xF0FB, 0x8E56 }, + { 0xF0FC, 0x8E5E }, + { 0xF0FD, 0x8E65 }, + { 0xF0FE, 0x8E67 }, + { 0xF140, 0x8E5B }, + { 0xF141, 0x8E5A }, + { 0xF142, 0x8E61 }, + { 0xF143, 0x8E5D }, + { 0xF144, 0x8E69 }, + { 0xF145, 0x8E54 }, + { 0xF146, 0x8F46 }, + { 0xF147, 0x8F47 }, + { 0xF148, 0x8F48 }, + { 0xF149, 0x8F4B }, + { 0xF14A, 0x9128 }, + { 0xF14B, 0x913A }, + { 0xF14C, 0x913B }, + { 0xF14D, 0x913E }, + { 0xF14E, 0x91A8 }, + { 0xF14F, 0x91A5 }, + { 0xF150, 0x91A7 }, + { 0xF151, 0x91AF }, + { 0xF152, 0x91AA }, + { 0xF153, 0x93B5 }, + { 0xF154, 0x938C }, + { 0xF155, 0x9392 }, + { 0xF156, 0x93B7 }, + { 0xF157, 0x939B }, + { 0xF158, 0x939D }, + { 0xF159, 0x9389 }, + { 0xF15A, 0x93A7 }, + { 0xF15B, 0x938E }, + { 0xF15C, 0x93AA }, + { 0xF15D, 0x939E }, + { 0xF15E, 0x93A6 }, + { 0xF15F, 0x9395 }, + { 0xF160, 0x9388 }, + { 0xF161, 0x9399 }, + { 0xF162, 0x939F }, + { 0xF163, 0x938D }, + { 0xF164, 0x93B1 }, + { 0xF165, 0x9391 }, + { 0xF166, 0x93B2 }, + { 0xF167, 0x93A4 }, + { 0xF168, 0x93A8 }, + { 0xF169, 0x93B4 }, + { 0xF16A, 0x93A3 }, + { 0xF16B, 0x93A5 }, + { 0xF16C, 0x95D2 }, + { 0xF16D, 0x95D3 }, + { 0xF16E, 0x95D1 }, + { 0xF16F, 0x96B3 }, + { 0xF170, 0x96D7 }, + { 0xF171, 0x96DA }, + { 0xF172, 0x5DC2 }, + { 0xF173, 0x96DF }, + { 0xF174, 0x96D8 }, + { 0xF175, 0x96DD }, + { 0xF176, 0x9723 }, + { 0xF177, 0x9722 }, + { 0xF178, 0x9725 }, + { 0xF179, 0x97AC }, + { 0xF17A, 0x97AE }, + { 0xF17B, 0x97A8 }, + { 0xF17C, 0x97AB }, + { 0xF17D, 0x97A4 }, + { 0xF17E, 0x97AA }, + { 0xF1A1, 0x97A2 }, + { 0xF1A2, 0x97A5 }, + { 0xF1A3, 0x97D7 }, + { 0xF1A4, 0x97D9 }, + { 0xF1A5, 0x97D6 }, + { 0xF1A6, 0x97D8 }, + { 0xF1A7, 0x97FA }, + { 0xF1A8, 0x9850 }, + { 0xF1A9, 0x9851 }, + { 0xF1AA, 0x9852 }, + { 0xF1AB, 0x98B8 }, + { 0xF1AC, 0x9941 }, + { 0xF1AD, 0x993C }, + { 0xF1AE, 0x993A }, + { 0xF1AF, 0x9A0F }, + { 0xF1B0, 0x9A0B }, + { 0xF1B1, 0x9A09 }, + { 0xF1B2, 0x9A0D }, + { 0xF1B3, 0x9A04 }, + { 0xF1B4, 0x9A11 }, + { 0xF1B5, 0x9A0A }, + { 0xF1B6, 0x9A05 }, + { 0xF1B7, 0x9A07 }, + { 0xF1B8, 0x9A06 }, + { 0xF1B9, 0x9AC0 }, + { 0xF1BA, 0x9ADC }, + { 0xF1BB, 0x9B08 }, + { 0xF1BC, 0x9B04 }, + { 0xF1BD, 0x9B05 }, + { 0xF1BE, 0x9B29 }, + { 0xF1BF, 0x9B35 }, + { 0xF1C0, 0x9B4A }, + { 0xF1C1, 0x9B4C }, + { 0xF1C2, 0x9B4B }, + { 0xF1C3, 0x9BC7 }, + { 0xF1C4, 0x9BC6 }, + { 0xF1C5, 0x9BC3 }, + { 0xF1C6, 0x9BBF }, + { 0xF1C7, 0x9BC1 }, + { 0xF1C8, 0x9BB5 }, + { 0xF1C9, 0x9BB8 }, + { 0xF1CA, 0x9BD3 }, + { 0xF1CB, 0x9BB6 }, + { 0xF1CC, 0x9BC4 }, + { 0xF1CD, 0x9BB9 }, + { 0xF1CE, 0x9BBD }, + { 0xF1CF, 0x9D5C }, + { 0xF1D0, 0x9D53 }, + { 0xF1D1, 0x9D4F }, + { 0xF1D2, 0x9D4A }, + { 0xF1D3, 0x9D5B }, + { 0xF1D4, 0x9D4B }, + { 0xF1D5, 0x9D59 }, + { 0xF1D6, 0x9D56 }, + { 0xF1D7, 0x9D4C }, + { 0xF1D8, 0x9D57 }, + { 0xF1D9, 0x9D52 }, + { 0xF1DA, 0x9D54 }, + { 0xF1DB, 0x9D5F }, + { 0xF1DC, 0x9D58 }, + { 0xF1DD, 0x9D5A }, + { 0xF1DE, 0x9E8E }, + { 0xF1DF, 0x9E8C }, + { 0xF1E0, 0x9EDF }, + { 0xF1E1, 0x9F01 }, + { 0xF1E2, 0x9F00 }, + { 0xF1E3, 0x9F16 }, + { 0xF1E4, 0x9F25 }, + { 0xF1E5, 0x9F2B }, + { 0xF1E6, 0x9F2A }, + { 0xF1E7, 0x9F29 }, + { 0xF1E8, 0x9F28 }, + { 0xF1E9, 0x9F4C }, + { 0xF1EA, 0x9F55 }, + { 0xF1EB, 0x5134 }, + { 0xF1EC, 0x5135 }, + { 0xF1ED, 0x5296 }, + { 0xF1EE, 0x52F7 }, + { 0xF1EF, 0x53B4 }, + { 0xF1F0, 0x56AB }, + { 0xF1F1, 0x56AD }, + { 0xF1F2, 0x56A6 }, + { 0xF1F3, 0x56A7 }, + { 0xF1F4, 0x56AA }, + { 0xF1F5, 0x56AC }, + { 0xF1F6, 0x58DA }, + { 0xF1F7, 0x58DD }, + { 0xF1F8, 0x58DB }, + { 0xF1F9, 0x5912 }, + { 0xF1FA, 0x5B3D }, + { 0xF1FB, 0x5B3E }, + { 0xF1FC, 0x5B3F }, + { 0xF1FD, 0x5DC3 }, + { 0xF1FE, 0x5E70 }, + { 0xF240, 0x5FBF }, + { 0xF241, 0x61FB }, + { 0xF242, 0x6507 }, + { 0xF243, 0x6510 }, + { 0xF244, 0x650D }, + { 0xF245, 0x6509 }, + { 0xF246, 0x650C }, + { 0xF247, 0x650E }, + { 0xF248, 0x6584 }, + { 0xF249, 0x65DE }, + { 0xF24A, 0x65DD }, + { 0xF24B, 0x66DE }, + { 0xF24C, 0x6AE7 }, + { 0xF24D, 0x6AE0 }, + { 0xF24E, 0x6ACC }, + { 0xF24F, 0x6AD1 }, + { 0xF250, 0x6AD9 }, + { 0xF251, 0x6ACB }, + { 0xF252, 0x6ADF }, + { 0xF253, 0x6ADC }, + { 0xF254, 0x6AD0 }, + { 0xF255, 0x6AEB }, + { 0xF256, 0x6ACF }, + { 0xF257, 0x6ACD }, + { 0xF258, 0x6ADE }, + { 0xF259, 0x6B60 }, + { 0xF25A, 0x6BB0 }, + { 0xF25B, 0x6C0C }, + { 0xF25C, 0x7019 }, + { 0xF25D, 0x7027 }, + { 0xF25E, 0x7020 }, + { 0xF25F, 0x7016 }, + { 0xF260, 0x702B }, + { 0xF261, 0x7021 }, + { 0xF262, 0x7022 }, + { 0xF263, 0x7023 }, + { 0xF264, 0x7029 }, + { 0xF265, 0x7017 }, + { 0xF266, 0x7024 }, + { 0xF267, 0x701C }, + { 0xF268, 0x702A }, + { 0xF269, 0x720C }, + { 0xF26A, 0x720A }, + { 0xF26B, 0x7207 }, + { 0xF26C, 0x7202 }, + { 0xF26D, 0x7205 }, + { 0xF26E, 0x72A5 }, + { 0xF26F, 0x72A6 }, + { 0xF270, 0x72A4 }, + { 0xF271, 0x72A3 }, + { 0xF272, 0x72A1 }, + { 0xF273, 0x74CB }, + { 0xF274, 0x74C5 }, + { 0xF275, 0x74B7 }, + { 0xF276, 0x74C3 }, + { 0xF277, 0x7516 }, + { 0xF278, 0x7660 }, + { 0xF279, 0x77C9 }, + { 0xF27A, 0x77CA }, + { 0xF27B, 0x77C4 }, + { 0xF27C, 0x77F1 }, + { 0xF27D, 0x791D }, + { 0xF27E, 0x791B }, + { 0xF2A1, 0x7921 }, + { 0xF2A2, 0x791C }, + { 0xF2A3, 0x7917 }, + { 0xF2A4, 0x791E }, + { 0xF2A5, 0x79B0 }, + { 0xF2A6, 0x7A67 }, + { 0xF2A7, 0x7A68 }, + { 0xF2A8, 0x7C33 }, + { 0xF2A9, 0x7C3C }, + { 0xF2AA, 0x7C39 }, + { 0xF2AB, 0x7C2C }, + { 0xF2AC, 0x7C3B }, + { 0xF2AD, 0x7CEC }, + { 0xF2AE, 0x7CEA }, + { 0xF2AF, 0x7E76 }, + { 0xF2B0, 0x7E75 }, + { 0xF2B1, 0x7E78 }, + { 0xF2B2, 0x7E70 }, + { 0xF2B3, 0x7E77 }, + { 0xF2B4, 0x7E6F }, + { 0xF2B5, 0x7E7A }, + { 0xF2B6, 0x7E72 }, + { 0xF2B7, 0x7E74 }, + { 0xF2B8, 0x7E68 }, + { 0xF2B9, 0x7F4B }, + { 0xF2BA, 0x7F4A }, + { 0xF2BB, 0x7F83 }, + { 0xF2BC, 0x7F86 }, + { 0xF2BD, 0x7FB7 }, + { 0xF2BE, 0x7FFD }, + { 0xF2BF, 0x7FFE }, + { 0xF2C0, 0x8078 }, + { 0xF2C1, 0x81D7 }, + { 0xF2C2, 0x81D5 }, + { 0xF2C3, 0x8264 }, + { 0xF2C4, 0x8261 }, + { 0xF2C5, 0x8263 }, + { 0xF2C6, 0x85EB }, + { 0xF2C7, 0x85F1 }, + { 0xF2C8, 0x85ED }, + { 0xF2C9, 0x85D9 }, + { 0xF2CA, 0x85E1 }, + { 0xF2CB, 0x85E8 }, + { 0xF2CC, 0x85DA }, + { 0xF2CD, 0x85D7 }, + { 0xF2CE, 0x85EC }, + { 0xF2CF, 0x85F2 }, + { 0xF2D0, 0x85F8 }, + { 0xF2D1, 0x85D8 }, + { 0xF2D2, 0x85DF }, + { 0xF2D3, 0x85E3 }, + { 0xF2D4, 0x85DC }, + { 0xF2D5, 0x85D1 }, + { 0xF2D6, 0x85F0 }, + { 0xF2D7, 0x85E6 }, + { 0xF2D8, 0x85EF }, + { 0xF2D9, 0x85DE }, + { 0xF2DA, 0x85E2 }, + { 0xF2DB, 0x8800 }, + { 0xF2DC, 0x87FA }, + { 0xF2DD, 0x8803 }, + { 0xF2DE, 0x87F6 }, + { 0xF2DF, 0x87F7 }, + { 0xF2E0, 0x8809 }, + { 0xF2E1, 0x880C }, + { 0xF2E2, 0x880B }, + { 0xF2E3, 0x8806 }, + { 0xF2E4, 0x87FC }, + { 0xF2E5, 0x8808 }, + { 0xF2E6, 0x87FF }, + { 0xF2E7, 0x880A }, + { 0xF2E8, 0x8802 }, + { 0xF2E9, 0x8962 }, + { 0xF2EA, 0x895A }, + { 0xF2EB, 0x895B }, + { 0xF2EC, 0x8957 }, + { 0xF2ED, 0x8961 }, + { 0xF2EE, 0x895C }, + { 0xF2EF, 0x8958 }, + { 0xF2F0, 0x895D }, + { 0xF2F1, 0x8959 }, + { 0xF2F2, 0x8988 }, + { 0xF2F3, 0x89B7 }, + { 0xF2F4, 0x89B6 }, + { 0xF2F5, 0x89F6 }, + { 0xF2F6, 0x8B50 }, + { 0xF2F7, 0x8B48 }, + { 0xF2F8, 0x8B4A }, + { 0xF2F9, 0x8B40 }, + { 0xF2FA, 0x8B53 }, + { 0xF2FB, 0x8B56 }, + { 0xF2FC, 0x8B54 }, + { 0xF2FD, 0x8B4B }, + { 0xF2FE, 0x8B55 }, + { 0xF340, 0x8B51 }, + { 0xF341, 0x8B42 }, + { 0xF342, 0x8B52 }, + { 0xF343, 0x8B57 }, + { 0xF344, 0x8C43 }, + { 0xF345, 0x8C77 }, + { 0xF346, 0x8C76 }, + { 0xF347, 0x8C9A }, + { 0xF348, 0x8D06 }, + { 0xF349, 0x8D07 }, + { 0xF34A, 0x8D09 }, + { 0xF34B, 0x8DAC }, + { 0xF34C, 0x8DAA }, + { 0xF34D, 0x8DAD }, + { 0xF34E, 0x8DAB }, + { 0xF34F, 0x8E6D }, + { 0xF350, 0x8E78 }, + { 0xF351, 0x8E73 }, + { 0xF352, 0x8E6A }, + { 0xF353, 0x8E6F }, + { 0xF354, 0x8E7B }, + { 0xF355, 0x8EC2 }, + { 0xF356, 0x8F52 }, + { 0xF357, 0x8F51 }, + { 0xF358, 0x8F4F }, + { 0xF359, 0x8F50 }, + { 0xF35A, 0x8F53 }, + { 0xF35B, 0x8FB4 }, + { 0xF35C, 0x9140 }, + { 0xF35D, 0x913F }, + { 0xF35E, 0x91B0 }, + { 0xF35F, 0x91AD }, + { 0xF360, 0x93DE }, + { 0xF361, 0x93C7 }, + { 0xF362, 0x93CF }, + { 0xF363, 0x93C2 }, + { 0xF364, 0x93DA }, + { 0xF365, 0x93D0 }, + { 0xF366, 0x93F9 }, + { 0xF367, 0x93EC }, + { 0xF368, 0x93CC }, + { 0xF369, 0x93D9 }, + { 0xF36A, 0x93A9 }, + { 0xF36B, 0x93E6 }, + { 0xF36C, 0x93CA }, + { 0xF36D, 0x93D4 }, + { 0xF36E, 0x93EE }, + { 0xF36F, 0x93E3 }, + { 0xF370, 0x93D5 }, + { 0xF371, 0x93C4 }, + { 0xF372, 0x93CE }, + { 0xF373, 0x93C0 }, + { 0xF374, 0x93D2 }, + { 0xF375, 0x93E7 }, + { 0xF376, 0x957D }, + { 0xF377, 0x95DA }, + { 0xF378, 0x95DB }, + { 0xF379, 0x96E1 }, + { 0xF37A, 0x9729 }, + { 0xF37B, 0x972B }, + { 0xF37C, 0x972C }, + { 0xF37D, 0x9728 }, + { 0xF37E, 0x9726 }, + { 0xF3A1, 0x97B3 }, + { 0xF3A2, 0x97B7 }, + { 0xF3A3, 0x97B6 }, + { 0xF3A4, 0x97DD }, + { 0xF3A5, 0x97DE }, + { 0xF3A6, 0x97DF }, + { 0xF3A7, 0x985C }, + { 0xF3A8, 0x9859 }, + { 0xF3A9, 0x985D }, + { 0xF3AA, 0x9857 }, + { 0xF3AB, 0x98BF }, + { 0xF3AC, 0x98BD }, + { 0xF3AD, 0x98BB }, + { 0xF3AE, 0x98BE }, + { 0xF3AF, 0x9948 }, + { 0xF3B0, 0x9947 }, + { 0xF3B1, 0x9943 }, + { 0xF3B2, 0x99A6 }, + { 0xF3B3, 0x99A7 }, + { 0xF3B4, 0x9A1A }, + { 0xF3B5, 0x9A15 }, + { 0xF3B6, 0x9A25 }, + { 0xF3B7, 0x9A1D }, + { 0xF3B8, 0x9A24 }, + { 0xF3B9, 0x9A1B }, + { 0xF3BA, 0x9A22 }, + { 0xF3BB, 0x9A20 }, + { 0xF3BC, 0x9A27 }, + { 0xF3BD, 0x9A23 }, + { 0xF3BE, 0x9A1E }, + { 0xF3BF, 0x9A1C }, + { 0xF3C0, 0x9A14 }, + { 0xF3C1, 0x9AC2 }, + { 0xF3C2, 0x9B0B }, + { 0xF3C3, 0x9B0A }, + { 0xF3C4, 0x9B0E }, + { 0xF3C5, 0x9B0C }, + { 0xF3C6, 0x9B37 }, + { 0xF3C7, 0x9BEA }, + { 0xF3C8, 0x9BEB }, + { 0xF3C9, 0x9BE0 }, + { 0xF3CA, 0x9BDE }, + { 0xF3CB, 0x9BE4 }, + { 0xF3CC, 0x9BE6 }, + { 0xF3CD, 0x9BE2 }, + { 0xF3CE, 0x9BF0 }, + { 0xF3CF, 0x9BD4 }, + { 0xF3D0, 0x9BD7 }, + { 0xF3D1, 0x9BEC }, + { 0xF3D2, 0x9BDC }, + { 0xF3D3, 0x9BD9 }, + { 0xF3D4, 0x9BE5 }, + { 0xF3D5, 0x9BD5 }, + { 0xF3D6, 0x9BE1 }, + { 0xF3D7, 0x9BDA }, + { 0xF3D8, 0x9D77 }, + { 0xF3D9, 0x9D81 }, + { 0xF3DA, 0x9D8A }, + { 0xF3DB, 0x9D84 }, + { 0xF3DC, 0x9D88 }, + { 0xF3DD, 0x9D71 }, + { 0xF3DE, 0x9D80 }, + { 0xF3DF, 0x9D78 }, + { 0xF3E0, 0x9D86 }, + { 0xF3E1, 0x9D8B }, + { 0xF3E2, 0x9D8C }, + { 0xF3E3, 0x9D7D }, + { 0xF3E4, 0x9D6B }, + { 0xF3E5, 0x9D74 }, + { 0xF3E6, 0x9D75 }, + { 0xF3E7, 0x9D70 }, + { 0xF3E8, 0x9D69 }, + { 0xF3E9, 0x9D85 }, + { 0xF3EA, 0x9D73 }, + { 0xF3EB, 0x9D7B }, + { 0xF3EC, 0x9D82 }, + { 0xF3ED, 0x9D6F }, + { 0xF3EE, 0x9D79 }, + { 0xF3EF, 0x9D7F }, + { 0xF3F0, 0x9D87 }, + { 0xF3F1, 0x9D68 }, + { 0xF3F2, 0x9E94 }, + { 0xF3F3, 0x9E91 }, + { 0xF3F4, 0x9EC0 }, + { 0xF3F5, 0x9EFC }, + { 0xF3F6, 0x9F2D }, + { 0xF3F7, 0x9F40 }, + { 0xF3F8, 0x9F41 }, + { 0xF3F9, 0x9F4D }, + { 0xF3FA, 0x9F56 }, + { 0xF3FB, 0x9F57 }, + { 0xF3FC, 0x9F58 }, + { 0xF3FD, 0x5337 }, + { 0xF3FE, 0x56B2 }, + { 0xF440, 0x56B5 }, + { 0xF441, 0x56B3 }, + { 0xF442, 0x58E3 }, + { 0xF443, 0x5B45 }, + { 0xF444, 0x5DC6 }, + { 0xF445, 0x5DC7 }, + { 0xF446, 0x5EEE }, + { 0xF447, 0x5EEF }, + { 0xF448, 0x5FC0 }, + { 0xF449, 0x5FC1 }, + { 0xF44A, 0x61F9 }, + { 0xF44B, 0x6517 }, + { 0xF44C, 0x6516 }, + { 0xF44D, 0x6515 }, + { 0xF44E, 0x6513 }, + { 0xF44F, 0x65DF }, + { 0xF450, 0x66E8 }, + { 0xF451, 0x66E3 }, + { 0xF452, 0x66E4 }, + { 0xF453, 0x6AF3 }, + { 0xF454, 0x6AF0 }, + { 0xF455, 0x6AEA }, + { 0xF456, 0x6AE8 }, + { 0xF457, 0x6AF9 }, + { 0xF458, 0x6AF1 }, + { 0xF459, 0x6AEE }, + { 0xF45A, 0x6AEF }, + { 0xF45B, 0x703C }, + { 0xF45C, 0x7035 }, + { 0xF45D, 0x702F }, + { 0xF45E, 0x7037 }, + { 0xF45F, 0x7034 }, + { 0xF460, 0x7031 }, + { 0xF461, 0x7042 }, + { 0xF462, 0x7038 }, + { 0xF463, 0x703F }, + { 0xF464, 0x703A }, + { 0xF465, 0x7039 }, + { 0xF466, 0x7040 }, + { 0xF467, 0x703B }, + { 0xF468, 0x7033 }, + { 0xF469, 0x7041 }, + { 0xF46A, 0x7213 }, + { 0xF46B, 0x7214 }, + { 0xF46C, 0x72A8 }, + { 0xF46D, 0x737D }, + { 0xF46E, 0x737C }, + { 0xF46F, 0x74BA }, + { 0xF470, 0x76AB }, + { 0xF471, 0x76AA }, + { 0xF472, 0x76BE }, + { 0xF473, 0x76ED }, + { 0xF474, 0x77CC }, + { 0xF475, 0x77CE }, + { 0xF476, 0x77CF }, + { 0xF477, 0x77CD }, + { 0xF478, 0x77F2 }, + { 0xF479, 0x7925 }, + { 0xF47A, 0x7923 }, + { 0xF47B, 0x7927 }, + { 0xF47C, 0x7928 }, + { 0xF47D, 0x7924 }, + { 0xF47E, 0x7929 }, + { 0xF4A1, 0x79B2 }, + { 0xF4A2, 0x7A6E }, + { 0xF4A3, 0x7A6C }, + { 0xF4A4, 0x7A6D }, + { 0xF4A5, 0x7AF7 }, + { 0xF4A6, 0x7C49 }, + { 0xF4A7, 0x7C48 }, + { 0xF4A8, 0x7C4A }, + { 0xF4A9, 0x7C47 }, + { 0xF4AA, 0x7C45 }, + { 0xF4AB, 0x7CEE }, + { 0xF4AC, 0x7E7B }, + { 0xF4AD, 0x7E7E }, + { 0xF4AE, 0x7E81 }, + { 0xF4AF, 0x7E80 }, + { 0xF4B0, 0x7FBA }, + { 0xF4B1, 0x7FFF }, + { 0xF4B2, 0x8079 }, + { 0xF4B3, 0x81DB }, + { 0xF4B4, 0x81D9 }, + { 0xF4B5, 0x820B }, + { 0xF4B6, 0x8268 }, + { 0xF4B7, 0x8269 }, + { 0xF4B8, 0x8622 }, + { 0xF4B9, 0x85FF }, + { 0xF4BA, 0x8601 }, + { 0xF4BB, 0x85FE }, + { 0xF4BC, 0x861B }, + { 0xF4BD, 0x8600 }, + { 0xF4BE, 0x85F6 }, + { 0xF4BF, 0x8604 }, + { 0xF4C0, 0x8609 }, + { 0xF4C1, 0x8605 }, + { 0xF4C2, 0x860C }, + { 0xF4C3, 0x85FD }, + { 0xF4C4, 0x8819 }, + { 0xF4C5, 0x8810 }, + { 0xF4C6, 0x8811 }, + { 0xF4C7, 0x8817 }, + { 0xF4C8, 0x8813 }, + { 0xF4C9, 0x8816 }, + { 0xF4CA, 0x8963 }, + { 0xF4CB, 0x8966 }, + { 0xF4CC, 0x89B9 }, + { 0xF4CD, 0x89F7 }, + { 0xF4CE, 0x8B60 }, + { 0xF4CF, 0x8B6A }, + { 0xF4D0, 0x8B5D }, + { 0xF4D1, 0x8B68 }, + { 0xF4D2, 0x8B63 }, + { 0xF4D3, 0x8B65 }, + { 0xF4D4, 0x8B67 }, + { 0xF4D5, 0x8B6D }, + { 0xF4D6, 0x8DAE }, + { 0xF4D7, 0x8E86 }, + { 0xF4D8, 0x8E88 }, + { 0xF4D9, 0x8E84 }, + { 0xF4DA, 0x8F59 }, + { 0xF4DB, 0x8F56 }, + { 0xF4DC, 0x8F57 }, + { 0xF4DD, 0x8F55 }, + { 0xF4DE, 0x8F58 }, + { 0xF4DF, 0x8F5A }, + { 0xF4E0, 0x908D }, + { 0xF4E1, 0x9143 }, + { 0xF4E2, 0x9141 }, + { 0xF4E3, 0x91B7 }, + { 0xF4E4, 0x91B5 }, + { 0xF4E5, 0x91B2 }, + { 0xF4E6, 0x91B3 }, + { 0xF4E7, 0x940B }, + { 0xF4E8, 0x9413 }, + { 0xF4E9, 0x93FB }, + { 0xF4EA, 0x9420 }, + { 0xF4EB, 0x940F }, + { 0xF4EC, 0x9414 }, + { 0xF4ED, 0x93FE }, + { 0xF4EE, 0x9415 }, + { 0xF4EF, 0x9410 }, + { 0xF4F0, 0x9428 }, + { 0xF4F1, 0x9419 }, + { 0xF4F2, 0x940D }, + { 0xF4F3, 0x93F5 }, + { 0xF4F4, 0x9400 }, + { 0xF4F5, 0x93F7 }, + { 0xF4F6, 0x9407 }, + { 0xF4F7, 0x940E }, + { 0xF4F8, 0x9416 }, + { 0xF4F9, 0x9412 }, + { 0xF4FA, 0x93FA }, + { 0xF4FB, 0x9409 }, + { 0xF4FC, 0x93F8 }, + { 0xF4FD, 0x940A }, + { 0xF4FE, 0x93FF }, + { 0xF540, 0x93FC }, + { 0xF541, 0x940C }, + { 0xF542, 0x93F6 }, + { 0xF543, 0x9411 }, + { 0xF544, 0x9406 }, + { 0xF545, 0x95DE }, + { 0xF546, 0x95E0 }, + { 0xF547, 0x95DF }, + { 0xF548, 0x972E }, + { 0xF549, 0x972F }, + { 0xF54A, 0x97B9 }, + { 0xF54B, 0x97BB }, + { 0xF54C, 0x97FD }, + { 0xF54D, 0x97FE }, + { 0xF54E, 0x9860 }, + { 0xF54F, 0x9862 }, + { 0xF550, 0x9863 }, + { 0xF551, 0x985F }, + { 0xF552, 0x98C1 }, + { 0xF553, 0x98C2 }, + { 0xF554, 0x9950 }, + { 0xF555, 0x994E }, + { 0xF556, 0x9959 }, + { 0xF557, 0x994C }, + { 0xF558, 0x994B }, + { 0xF559, 0x9953 }, + { 0xF55A, 0x9A32 }, + { 0xF55B, 0x9A34 }, + { 0xF55C, 0x9A31 }, + { 0xF55D, 0x9A2C }, + { 0xF55E, 0x9A2A }, + { 0xF55F, 0x9A36 }, + { 0xF560, 0x9A29 }, + { 0xF561, 0x9A2E }, + { 0xF562, 0x9A38 }, + { 0xF563, 0x9A2D }, + { 0xF564, 0x9AC7 }, + { 0xF565, 0x9ACA }, + { 0xF566, 0x9AC6 }, + { 0xF567, 0x9B10 }, + { 0xF568, 0x9B12 }, + { 0xF569, 0x9B11 }, + { 0xF56A, 0x9C0B }, + { 0xF56B, 0x9C08 }, + { 0xF56C, 0x9BF7 }, + { 0xF56D, 0x9C05 }, + { 0xF56E, 0x9C12 }, + { 0xF56F, 0x9BF8 }, + { 0xF570, 0x9C40 }, + { 0xF571, 0x9C07 }, + { 0xF572, 0x9C0E }, + { 0xF573, 0x9C06 }, + { 0xF574, 0x9C17 }, + { 0xF575, 0x9C14 }, + { 0xF576, 0x9C09 }, + { 0xF577, 0x9D9F }, + { 0xF578, 0x9D99 }, + { 0xF579, 0x9DA4 }, + { 0xF57A, 0x9D9D }, + { 0xF57B, 0x9D92 }, + { 0xF57C, 0x9D98 }, + { 0xF57D, 0x9D90 }, + { 0xF57E, 0x9D9B }, + { 0xF5A1, 0x9DA0 }, + { 0xF5A2, 0x9D94 }, + { 0xF5A3, 0x9D9C }, + { 0xF5A4, 0x9DAA }, + { 0xF5A5, 0x9D97 }, + { 0xF5A6, 0x9DA1 }, + { 0xF5A7, 0x9D9A }, + { 0xF5A8, 0x9DA2 }, + { 0xF5A9, 0x9DA8 }, + { 0xF5AA, 0x9D9E }, + { 0xF5AB, 0x9DA3 }, + { 0xF5AC, 0x9DBF }, + { 0xF5AD, 0x9DA9 }, + { 0xF5AE, 0x9D96 }, + { 0xF5AF, 0x9DA6 }, + { 0xF5B0, 0x9DA7 }, + { 0xF5B1, 0x9E99 }, + { 0xF5B2, 0x9E9B }, + { 0xF5B3, 0x9E9A }, + { 0xF5B4, 0x9EE5 }, + { 0xF5B5, 0x9EE4 }, + { 0xF5B6, 0x9EE7 }, + { 0xF5B7, 0x9EE6 }, + { 0xF5B8, 0x9F30 }, + { 0xF5B9, 0x9F2E }, + { 0xF5BA, 0x9F5B }, + { 0xF5BB, 0x9F60 }, + { 0xF5BC, 0x9F5E }, + { 0xF5BD, 0x9F5D }, + { 0xF5BE, 0x9F59 }, + { 0xF5BF, 0x9F91 }, + { 0xF5C0, 0x513A }, + { 0xF5C1, 0x5139 }, + { 0xF5C2, 0x5298 }, + { 0xF5C3, 0x5297 }, + { 0xF5C4, 0x56C3 }, + { 0xF5C5, 0x56BD }, + { 0xF5C6, 0x56BE }, + { 0xF5C7, 0x5B48 }, + { 0xF5C8, 0x5B47 }, + { 0xF5C9, 0x5DCB }, + { 0xF5CA, 0x5DCF }, + { 0xF5CB, 0x5EF1 }, + { 0xF5CC, 0x61FD }, + { 0xF5CD, 0x651B }, + { 0xF5CE, 0x6B02 }, + { 0xF5CF, 0x6AFC }, + { 0xF5D0, 0x6B03 }, + { 0xF5D1, 0x6AF8 }, + { 0xF5D2, 0x6B00 }, + { 0xF5D3, 0x7043 }, + { 0xF5D4, 0x7044 }, + { 0xF5D5, 0x704A }, + { 0xF5D6, 0x7048 }, + { 0xF5D7, 0x7049 }, + { 0xF5D8, 0x7045 }, + { 0xF5D9, 0x7046 }, + { 0xF5DA, 0x721D }, + { 0xF5DB, 0x721A }, + { 0xF5DC, 0x7219 }, + { 0xF5DD, 0x737E }, + { 0xF5DE, 0x7517 }, + { 0xF5DF, 0x766A }, + { 0xF5E0, 0x77D0 }, + { 0xF5E1, 0x792D }, + { 0xF5E2, 0x7931 }, + { 0xF5E3, 0x792F }, + { 0xF5E4, 0x7C54 }, + { 0xF5E5, 0x7C53 }, + { 0xF5E6, 0x7CF2 }, + { 0xF5E7, 0x7E8A }, + { 0xF5E8, 0x7E87 }, + { 0xF5E9, 0x7E88 }, + { 0xF5EA, 0x7E8B }, + { 0xF5EB, 0x7E86 }, + { 0xF5EC, 0x7E8D }, + { 0xF5ED, 0x7F4D }, + { 0xF5EE, 0x7FBB }, + { 0xF5EF, 0x8030 }, + { 0xF5F0, 0x81DD }, + { 0xF5F1, 0x8618 }, + { 0xF5F2, 0x862A }, + { 0xF5F3, 0x8626 }, + { 0xF5F4, 0x861F }, + { 0xF5F5, 0x8623 }, + { 0xF5F6, 0x861C }, + { 0xF5F7, 0x8619 }, + { 0xF5F8, 0x8627 }, + { 0xF5F9, 0x862E }, + { 0xF5FA, 0x8621 }, + { 0xF5FB, 0x8620 }, + { 0xF5FC, 0x8629 }, + { 0xF5FD, 0x861E }, + { 0xF5FE, 0x8625 }, + { 0xF640, 0x8829 }, + { 0xF641, 0x881D }, + { 0xF642, 0x881B }, + { 0xF643, 0x8820 }, + { 0xF644, 0x8824 }, + { 0xF645, 0x881C }, + { 0xF646, 0x882B }, + { 0xF647, 0x884A }, + { 0xF648, 0x896D }, + { 0xF649, 0x8969 }, + { 0xF64A, 0x896E }, + { 0xF64B, 0x896B }, + { 0xF64C, 0x89FA }, + { 0xF64D, 0x8B79 }, + { 0xF64E, 0x8B78 }, + { 0xF64F, 0x8B45 }, + { 0xF650, 0x8B7A }, + { 0xF651, 0x8B7B }, + { 0xF652, 0x8D10 }, + { 0xF653, 0x8D14 }, + { 0xF654, 0x8DAF }, + { 0xF655, 0x8E8E }, + { 0xF656, 0x8E8C }, + { 0xF657, 0x8F5E }, + { 0xF658, 0x8F5B }, + { 0xF659, 0x8F5D }, + { 0xF65A, 0x9146 }, + { 0xF65B, 0x9144 }, + { 0xF65C, 0x9145 }, + { 0xF65D, 0x91B9 }, + { 0xF65E, 0x943F }, + { 0xF65F, 0x943B }, + { 0xF660, 0x9436 }, + { 0xF661, 0x9429 }, + { 0xF662, 0x943D }, + { 0xF663, 0x943C }, + { 0xF664, 0x9430 }, + { 0xF665, 0x9439 }, + { 0xF666, 0x942A }, + { 0xF667, 0x9437 }, + { 0xF668, 0x942C }, + { 0xF669, 0x9440 }, + { 0xF66A, 0x9431 }, + { 0xF66B, 0x95E5 }, + { 0xF66C, 0x95E4 }, + { 0xF66D, 0x95E3 }, + { 0xF66E, 0x9735 }, + { 0xF66F, 0x973A }, + { 0xF670, 0x97BF }, + { 0xF671, 0x97E1 }, + { 0xF672, 0x9864 }, + { 0xF673, 0x98C9 }, + { 0xF674, 0x98C6 }, + { 0xF675, 0x98C0 }, + { 0xF676, 0x9958 }, + { 0xF677, 0x9956 }, + { 0xF678, 0x9A39 }, + { 0xF679, 0x9A3D }, + { 0xF67A, 0x9A46 }, + { 0xF67B, 0x9A44 }, + { 0xF67C, 0x9A42 }, + { 0xF67D, 0x9A41 }, + { 0xF67E, 0x9A3A }, + { 0xF6A1, 0x9A3F }, + { 0xF6A2, 0x9ACD }, + { 0xF6A3, 0x9B15 }, + { 0xF6A4, 0x9B17 }, + { 0xF6A5, 0x9B18 }, + { 0xF6A6, 0x9B16 }, + { 0xF6A7, 0x9B3A }, + { 0xF6A8, 0x9B52 }, + { 0xF6A9, 0x9C2B }, + { 0xF6AA, 0x9C1D }, + { 0xF6AB, 0x9C1C }, + { 0xF6AC, 0x9C2C }, + { 0xF6AD, 0x9C23 }, + { 0xF6AE, 0x9C28 }, + { 0xF6AF, 0x9C29 }, + { 0xF6B0, 0x9C24 }, + { 0xF6B1, 0x9C21 }, + { 0xF6B2, 0x9DB7 }, + { 0xF6B3, 0x9DB6 }, + { 0xF6B4, 0x9DBC }, + { 0xF6B5, 0x9DC1 }, + { 0xF6B6, 0x9DC7 }, + { 0xF6B7, 0x9DCA }, + { 0xF6B8, 0x9DCF }, + { 0xF6B9, 0x9DBE }, + { 0xF6BA, 0x9DC5 }, + { 0xF6BB, 0x9DC3 }, + { 0xF6BC, 0x9DBB }, + { 0xF6BD, 0x9DB5 }, + { 0xF6BE, 0x9DCE }, + { 0xF6BF, 0x9DB9 }, + { 0xF6C0, 0x9DBA }, + { 0xF6C1, 0x9DAC }, + { 0xF6C2, 0x9DC8 }, + { 0xF6C3, 0x9DB1 }, + { 0xF6C4, 0x9DAD }, + { 0xF6C5, 0x9DCC }, + { 0xF6C6, 0x9DB3 }, + { 0xF6C7, 0x9DCD }, + { 0xF6C8, 0x9DB2 }, + { 0xF6C9, 0x9E7A }, + { 0xF6CA, 0x9E9C }, + { 0xF6CB, 0x9EEB }, + { 0xF6CC, 0x9EEE }, + { 0xF6CD, 0x9EED }, + { 0xF6CE, 0x9F1B }, + { 0xF6CF, 0x9F18 }, + { 0xF6D0, 0x9F1A }, + { 0xF6D1, 0x9F31 }, + { 0xF6D2, 0x9F4E }, + { 0xF6D3, 0x9F65 }, + { 0xF6D4, 0x9F64 }, + { 0xF6D5, 0x9F92 }, + { 0xF6D6, 0x4EB9 }, + { 0xF6D7, 0x56C6 }, + { 0xF6D8, 0x56C5 }, + { 0xF6D9, 0x56CB }, + { 0xF6DA, 0x5971 }, + { 0xF6DB, 0x5B4B }, + { 0xF6DC, 0x5B4C }, + { 0xF6DD, 0x5DD5 }, + { 0xF6DE, 0x5DD1 }, + { 0xF6DF, 0x5EF2 }, + { 0xF6E0, 0x6521 }, + { 0xF6E1, 0x6520 }, + { 0xF6E2, 0x6526 }, + { 0xF6E3, 0x6522 }, + { 0xF6E4, 0x6B0B }, + { 0xF6E5, 0x6B08 }, + { 0xF6E6, 0x6B09 }, + { 0xF6E7, 0x6C0D }, + { 0xF6E8, 0x7055 }, + { 0xF6E9, 0x7056 }, + { 0xF6EA, 0x7057 }, + { 0xF6EB, 0x7052 }, + { 0xF6EC, 0x721E }, + { 0xF6ED, 0x721F }, + { 0xF6EE, 0x72A9 }, + { 0xF6EF, 0x737F }, + { 0xF6F0, 0x74D8 }, + { 0xF6F1, 0x74D5 }, + { 0xF6F2, 0x74D9 }, + { 0xF6F3, 0x74D7 }, + { 0xF6F4, 0x766D }, + { 0xF6F5, 0x76AD }, + { 0xF6F6, 0x7935 }, + { 0xF6F7, 0x79B4 }, + { 0xF6F8, 0x7A70 }, + { 0xF6F9, 0x7A71 }, + { 0xF6FA, 0x7C57 }, + { 0xF6FB, 0x7C5C }, + { 0xF6FC, 0x7C59 }, + { 0xF6FD, 0x7C5B }, + { 0xF6FE, 0x7C5A }, + { 0xF740, 0x7CF4 }, + { 0xF741, 0x7CF1 }, + { 0xF742, 0x7E91 }, + { 0xF743, 0x7F4F }, + { 0xF744, 0x7F87 }, + { 0xF745, 0x81DE }, + { 0xF746, 0x826B }, + { 0xF747, 0x8634 }, + { 0xF748, 0x8635 }, + { 0xF749, 0x8633 }, + { 0xF74A, 0x862C }, + { 0xF74B, 0x8632 }, + { 0xF74C, 0x8636 }, + { 0xF74D, 0x882C }, + { 0xF74E, 0x8828 }, + { 0xF74F, 0x8826 }, + { 0xF750, 0x882A }, + { 0xF751, 0x8825 }, + { 0xF752, 0x8971 }, + { 0xF753, 0x89BF }, + { 0xF754, 0x89BE }, + { 0xF755, 0x89FB }, + { 0xF756, 0x8B7E }, + { 0xF757, 0x8B84 }, + { 0xF758, 0x8B82 }, + { 0xF759, 0x8B86 }, + { 0xF75A, 0x8B85 }, + { 0xF75B, 0x8B7F }, + { 0xF75C, 0x8D15 }, + { 0xF75D, 0x8E95 }, + { 0xF75E, 0x8E94 }, + { 0xF75F, 0x8E9A }, + { 0xF760, 0x8E92 }, + { 0xF761, 0x8E90 }, + { 0xF762, 0x8E96 }, + { 0xF763, 0x8E97 }, + { 0xF764, 0x8F60 }, + { 0xF765, 0x8F62 }, + { 0xF766, 0x9147 }, + { 0xF767, 0x944C }, + { 0xF768, 0x9450 }, + { 0xF769, 0x944A }, + { 0xF76A, 0x944B }, + { 0xF76B, 0x944F }, + { 0xF76C, 0x9447 }, + { 0xF76D, 0x9445 }, + { 0xF76E, 0x9448 }, + { 0xF76F, 0x9449 }, + { 0xF770, 0x9446 }, + { 0xF771, 0x973F }, + { 0xF772, 0x97E3 }, + { 0xF773, 0x986A }, + { 0xF774, 0x9869 }, + { 0xF775, 0x98CB }, + { 0xF776, 0x9954 }, + { 0xF777, 0x995B }, + { 0xF778, 0x9A4E }, + { 0xF779, 0x9A53 }, + { 0xF77A, 0x9A54 }, + { 0xF77B, 0x9A4C }, + { 0xF77C, 0x9A4F }, + { 0xF77D, 0x9A48 }, + { 0xF77E, 0x9A4A }, + { 0xF7A1, 0x9A49 }, + { 0xF7A2, 0x9A52 }, + { 0xF7A3, 0x9A50 }, + { 0xF7A4, 0x9AD0 }, + { 0xF7A5, 0x9B19 }, + { 0xF7A6, 0x9B2B }, + { 0xF7A7, 0x9B3B }, + { 0xF7A8, 0x9B56 }, + { 0xF7A9, 0x9B55 }, + { 0xF7AA, 0x9C46 }, + { 0xF7AB, 0x9C48 }, + { 0xF7AC, 0x9C3F }, + { 0xF7AD, 0x9C44 }, + { 0xF7AE, 0x9C39 }, + { 0xF7AF, 0x9C33 }, + { 0xF7B0, 0x9C41 }, + { 0xF7B1, 0x9C3C }, + { 0xF7B2, 0x9C37 }, + { 0xF7B3, 0x9C34 }, + { 0xF7B4, 0x9C32 }, + { 0xF7B5, 0x9C3D }, + { 0xF7B6, 0x9C36 }, + { 0xF7B7, 0x9DDB }, + { 0xF7B8, 0x9DD2 }, + { 0xF7B9, 0x9DDE }, + { 0xF7BA, 0x9DDA }, + { 0xF7BB, 0x9DCB }, + { 0xF7BC, 0x9DD0 }, + { 0xF7BD, 0x9DDC }, + { 0xF7BE, 0x9DD1 }, + { 0xF7BF, 0x9DDF }, + { 0xF7C0, 0x9DE9 }, + { 0xF7C1, 0x9DD9 }, + { 0xF7C2, 0x9DD8 }, + { 0xF7C3, 0x9DD6 }, + { 0xF7C4, 0x9DF5 }, + { 0xF7C5, 0x9DD5 }, + { 0xF7C6, 0x9DDD }, + { 0xF7C7, 0x9EB6 }, + { 0xF7C8, 0x9EF0 }, + { 0xF7C9, 0x9F35 }, + { 0xF7CA, 0x9F33 }, + { 0xF7CB, 0x9F32 }, + { 0xF7CC, 0x9F42 }, + { 0xF7CD, 0x9F6B }, + { 0xF7CE, 0x9F95 }, + { 0xF7CF, 0x9FA2 }, + { 0xF7D0, 0x513D }, + { 0xF7D1, 0x5299 }, + { 0xF7D2, 0x58E8 }, + { 0xF7D3, 0x58E7 }, + { 0xF7D4, 0x5972 }, + { 0xF7D5, 0x5B4D }, + { 0xF7D6, 0x5DD8 }, + { 0xF7D7, 0x882F }, + { 0xF7D8, 0x5F4F }, + { 0xF7D9, 0x6201 }, + { 0xF7DA, 0x6203 }, + { 0xF7DB, 0x6204 }, + { 0xF7DC, 0x6529 }, + { 0xF7DD, 0x6525 }, + { 0xF7DE, 0x6596 }, + { 0xF7DF, 0x66EB }, + { 0xF7E0, 0x6B11 }, + { 0xF7E1, 0x6B12 }, + { 0xF7E2, 0x6B0F }, + { 0xF7E3, 0x6BCA }, + { 0xF7E4, 0x705B }, + { 0xF7E5, 0x705A }, + { 0xF7E6, 0x7222 }, + { 0xF7E7, 0x7382 }, + { 0xF7E8, 0x7381 }, + { 0xF7E9, 0x7383 }, + { 0xF7EA, 0x7670 }, + { 0xF7EB, 0x77D4 }, + { 0xF7EC, 0x7C67 }, + { 0xF7ED, 0x7C66 }, + { 0xF7EE, 0x7E95 }, + { 0xF7EF, 0x826C }, + { 0xF7F0, 0x863A }, + { 0xF7F1, 0x8640 }, + { 0xF7F2, 0x8639 }, + { 0xF7F3, 0x863C }, + { 0xF7F4, 0x8631 }, + { 0xF7F5, 0x863B }, + { 0xF7F6, 0x863E }, + { 0xF7F7, 0x8830 }, + { 0xF7F8, 0x8832 }, + { 0xF7F9, 0x882E }, + { 0xF7FA, 0x8833 }, + { 0xF7FB, 0x8976 }, + { 0xF7FC, 0x8974 }, + { 0xF7FD, 0x8973 }, + { 0xF7FE, 0x89FE }, + { 0xF840, 0x8B8C }, + { 0xF841, 0x8B8E }, + { 0xF842, 0x8B8B }, + { 0xF843, 0x8B88 }, + { 0xF844, 0x8C45 }, + { 0xF845, 0x8D19 }, + { 0xF846, 0x8E98 }, + { 0xF847, 0x8F64 }, + { 0xF848, 0x8F63 }, + { 0xF849, 0x91BC }, + { 0xF84A, 0x9462 }, + { 0xF84B, 0x9455 }, + { 0xF84C, 0x945D }, + { 0xF84D, 0x9457 }, + { 0xF84E, 0x945E }, + { 0xF84F, 0x97C4 }, + { 0xF850, 0x97C5 }, + { 0xF851, 0x9800 }, + { 0xF852, 0x9A56 }, + { 0xF853, 0x9A59 }, + { 0xF854, 0x9B1E }, + { 0xF855, 0x9B1F }, + { 0xF856, 0x9B20 }, + { 0xF857, 0x9C52 }, + { 0xF858, 0x9C58 }, + { 0xF859, 0x9C50 }, + { 0xF85A, 0x9C4A }, + { 0xF85B, 0x9C4D }, + { 0xF85C, 0x9C4B }, + { 0xF85D, 0x9C55 }, + { 0xF85E, 0x9C59 }, + { 0xF85F, 0x9C4C }, + { 0xF860, 0x9C4E }, + { 0xF861, 0x9DFB }, + { 0xF862, 0x9DF7 }, + { 0xF863, 0x9DEF }, + { 0xF864, 0x9DE3 }, + { 0xF865, 0x9DEB }, + { 0xF866, 0x9DF8 }, + { 0xF867, 0x9DE4 }, + { 0xF868, 0x9DF6 }, + { 0xF869, 0x9DE1 }, + { 0xF86A, 0x9DEE }, + { 0xF86B, 0x9DE6 }, + { 0xF86C, 0x9DF2 }, + { 0xF86D, 0x9DF0 }, + { 0xF86E, 0x9DE2 }, + { 0xF86F, 0x9DEC }, + { 0xF870, 0x9DF4 }, + { 0xF871, 0x9DF3 }, + { 0xF872, 0x9DE8 }, + { 0xF873, 0x9DED }, + { 0xF874, 0x9EC2 }, + { 0xF875, 0x9ED0 }, + { 0xF876, 0x9EF2 }, + { 0xF877, 0x9EF3 }, + { 0xF878, 0x9F06 }, + { 0xF879, 0x9F1C }, + { 0xF87A, 0x9F38 }, + { 0xF87B, 0x9F37 }, + { 0xF87C, 0x9F36 }, + { 0xF87D, 0x9F43 }, + { 0xF87E, 0x9F4F }, + { 0xF8A1, 0x9F71 }, + { 0xF8A2, 0x9F70 }, + { 0xF8A3, 0x9F6E }, + { 0xF8A4, 0x9F6F }, + { 0xF8A5, 0x56D3 }, + { 0xF8A6, 0x56CD }, + { 0xF8A7, 0x5B4E }, + { 0xF8A8, 0x5C6D }, + { 0xF8A9, 0x652D }, + { 0xF8AA, 0x66ED }, + { 0xF8AB, 0x66EE }, + { 0xF8AC, 0x6B13 }, + { 0xF8AD, 0x705F }, + { 0xF8AE, 0x7061 }, + { 0xF8AF, 0x705D }, + { 0xF8B0, 0x7060 }, + { 0xF8B1, 0x7223 }, + { 0xF8B2, 0x74DB }, + { 0xF8B3, 0x74E5 }, + { 0xF8B4, 0x77D5 }, + { 0xF8B5, 0x7938 }, + { 0xF8B6, 0x79B7 }, + { 0xF8B7, 0x79B6 }, + { 0xF8B8, 0x7C6A }, + { 0xF8B9, 0x7E97 }, + { 0xF8BA, 0x7F89 }, + { 0xF8BB, 0x826D }, + { 0xF8BC, 0x8643 }, + { 0xF8BD, 0x8838 }, + { 0xF8BE, 0x8837 }, + { 0xF8BF, 0x8835 }, + { 0xF8C0, 0x884B }, + { 0xF8C1, 0x8B94 }, + { 0xF8C2, 0x8B95 }, + { 0xF8C3, 0x8E9E }, + { 0xF8C4, 0x8E9F }, + { 0xF8C5, 0x8EA0 }, + { 0xF8C6, 0x8E9D }, + { 0xF8C7, 0x91BE }, + { 0xF8C8, 0x91BD }, + { 0xF8C9, 0x91C2 }, + { 0xF8CA, 0x946B }, + { 0xF8CB, 0x9468 }, + { 0xF8CC, 0x9469 }, + { 0xF8CD, 0x96E5 }, + { 0xF8CE, 0x9746 }, + { 0xF8CF, 0x9743 }, + { 0xF8D0, 0x9747 }, + { 0xF8D1, 0x97C7 }, + { 0xF8D2, 0x97E5 }, + { 0xF8D3, 0x9A5E }, + { 0xF8D4, 0x9AD5 }, + { 0xF8D5, 0x9B59 }, + { 0xF8D6, 0x9C63 }, + { 0xF8D7, 0x9C67 }, + { 0xF8D8, 0x9C66 }, + { 0xF8D9, 0x9C62 }, + { 0xF8DA, 0x9C5E }, + { 0xF8DB, 0x9C60 }, + { 0xF8DC, 0x9E02 }, + { 0xF8DD, 0x9DFE }, + { 0xF8DE, 0x9E07 }, + { 0xF8DF, 0x9E03 }, + { 0xF8E0, 0x9E06 }, + { 0xF8E1, 0x9E05 }, + { 0xF8E2, 0x9E00 }, + { 0xF8E3, 0x9E01 }, + { 0xF8E4, 0x9E09 }, + { 0xF8E5, 0x9DFF }, + { 0xF8E6, 0x9DFD }, + { 0xF8E7, 0x9E04 }, + { 0xF8E8, 0x9EA0 }, + { 0xF8E9, 0x9F1E }, + { 0xF8EA, 0x9F46 }, + { 0xF8EB, 0x9F74 }, + { 0xF8EC, 0x9F75 }, + { 0xF8ED, 0x9F76 }, + { 0xF8EE, 0x56D4 }, + { 0xF8EF, 0x652E }, + { 0xF8F0, 0x65B8 }, + { 0xF8F1, 0x6B18 }, + { 0xF8F2, 0x6B19 }, + { 0xF8F3, 0x6B17 }, + { 0xF8F4, 0x6B1A }, + { 0xF8F5, 0x7062 }, + { 0xF8F6, 0x7226 }, + { 0xF8F7, 0x72AA }, + { 0xF8F8, 0x77D8 }, + { 0xF8F9, 0x77D9 }, + { 0xF8FA, 0x7939 }, + { 0xF8FB, 0x7C69 }, + { 0xF8FC, 0x7C6B }, + { 0xF8FD, 0x7CF6 }, + { 0xF8FE, 0x7E9A }, + { 0xF940, 0x7E98 }, + { 0xF941, 0x7E9B }, + { 0xF942, 0x7E99 }, + { 0xF943, 0x81E0 }, + { 0xF944, 0x81E1 }, + { 0xF945, 0x8646 }, + { 0xF946, 0x8647 }, + { 0xF947, 0x8648 }, + { 0xF948, 0x8979 }, + { 0xF949, 0x897A }, + { 0xF94A, 0x897C }, + { 0xF94B, 0x897B }, + { 0xF94C, 0x89FF }, + { 0xF94D, 0x8B98 }, + { 0xF94E, 0x8B99 }, + { 0xF94F, 0x8EA5 }, + { 0xF950, 0x8EA4 }, + { 0xF951, 0x8EA3 }, + { 0xF952, 0x946E }, + { 0xF953, 0x946D }, + { 0xF954, 0x946F }, + { 0xF955, 0x9471 }, + { 0xF956, 0x9473 }, + { 0xF957, 0x9749 }, + { 0xF958, 0x9872 }, + { 0xF959, 0x995F }, + { 0xF95A, 0x9C68 }, + { 0xF95B, 0x9C6E }, + { 0xF95C, 0x9C6D }, + { 0xF95D, 0x9E0B }, + { 0xF95E, 0x9E0D }, + { 0xF95F, 0x9E10 }, + { 0xF960, 0x9E0F }, + { 0xF961, 0x9E12 }, + { 0xF962, 0x9E11 }, + { 0xF963, 0x9EA1 }, + { 0xF964, 0x9EF5 }, + { 0xF965, 0x9F09 }, + { 0xF966, 0x9F47 }, + { 0xF967, 0x9F78 }, + { 0xF968, 0x9F7B }, + { 0xF969, 0x9F7A }, + { 0xF96A, 0x9F79 }, + { 0xF96B, 0x571E }, + { 0xF96C, 0x7066 }, + { 0xF96D, 0x7C6F }, + { 0xF96E, 0x883C }, + { 0xF96F, 0x8DB2 }, + { 0xF970, 0x8EA6 }, + { 0xF971, 0x91C3 }, + { 0xF972, 0x9474 }, + { 0xF973, 0x9478 }, + { 0xF974, 0x9476 }, + { 0xF975, 0x9475 }, + { 0xF976, 0x9A60 }, + { 0xF977, 0x9C74 }, + { 0xF978, 0x9C73 }, + { 0xF979, 0x9C71 }, + { 0xF97A, 0x9C75 }, + { 0xF97B, 0x9E14 }, + { 0xF97C, 0x9E13 }, + { 0xF97D, 0x9EF6 }, + { 0xF97E, 0x9F0A }, + { 0xF9A1, 0x9FA4 }, + { 0xF9A2, 0x7068 }, + { 0xF9A3, 0x7065 }, + { 0xF9A4, 0x7CF7 }, + { 0xF9A5, 0x866A }, + { 0xF9A6, 0x883E }, + { 0xF9A7, 0x883D }, + { 0xF9A8, 0x883F }, + { 0xF9A9, 0x8B9E }, + { 0xF9AA, 0x8C9C }, + { 0xF9AB, 0x8EA9 }, + { 0xF9AC, 0x8EC9 }, + { 0xF9AD, 0x974B }, + { 0xF9AE, 0x9873 }, + { 0xF9AF, 0x9874 }, + { 0xF9B0, 0x98CC }, + { 0xF9B1, 0x9961 }, + { 0xF9B2, 0x99AB }, + { 0xF9B3, 0x9A64 }, + { 0xF9B4, 0x9A66 }, + { 0xF9B5, 0x9A67 }, + { 0xF9B6, 0x9B24 }, + { 0xF9B7, 0x9E15 }, + { 0xF9B8, 0x9E17 }, + { 0xF9B9, 0x9F48 }, + { 0xF9BA, 0x6207 }, + { 0xF9BB, 0x6B1E }, + { 0xF9BC, 0x7227 }, + { 0xF9BD, 0x864C }, + { 0xF9BE, 0x8EA8 }, + { 0xF9BF, 0x9482 }, + { 0xF9C0, 0x9480 }, + { 0xF9C1, 0x9481 }, + { 0xF9C2, 0x9A69 }, + { 0xF9C3, 0x9A68 }, + { 0xF9C4, 0x9B2E }, + { 0xF9C5, 0x9E19 }, + { 0xF9C6, 0x7229 }, + { 0xF9C7, 0x864B }, + { 0xF9C8, 0x8B9F }, + { 0xF9C9, 0x9483 }, + { 0xF9CA, 0x9C79 }, + { 0xF9CB, 0x9EB7 }, + { 0xF9CC, 0x7675 }, + { 0xF9CD, 0x9A6B }, + { 0xF9CE, 0x9C7A }, + { 0xF9CF, 0x9E1D }, + { 0xF9D0, 0x7069 }, + { 0xF9D1, 0x706A }, + { 0xF9D2, 0x9EA4 }, + { 0xF9D3, 0x9F7E }, + { 0xF9D4, 0x9F49 }, + { 0xF9D5, 0x9F98 }, +}; diff --git a/src/localisation/language.c b/src/localisation/language.c index 619021ba61..2bf1ac7847 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -44,8 +44,8 @@ enum { RCT2_LANGUAGE_ID_SWEDISH, RCT2_LANGUAGE_ID_8, RCT2_LANGUAGE_ID_KOREAN, - RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL, RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED, + RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL, RCT2_LANGUAGE_ID_12, RCT2_LANGUAGE_ID_PORTUGESE, RCT2_LANGUAGE_ID_END = 255 @@ -65,6 +65,7 @@ const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "it-IT", "Italian", "Italiano", "italian", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ITALIAN }, // LANGUAGE_ITALIAN { "pt-BR", "Portuguese (BR)", "Portug\xC3\xAAs (BR)", "portuguese_br", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_PORTUGESE }, // LANGUAGE_PORTUGUESE_BR { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", "msjh.ttc", RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL +// { "kr-KR", "Korean", "Korean", "english_uk", "malgun.ttf", RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN }; int gCurrentLanguage = LANGUAGE_UNDEFINED; @@ -376,7 +377,21 @@ void utf8_trim_string(utf8 *text) *last = 0; } -static utf8 *convert_multibyte_charset(const char *src) +static wchar_t convert_specific_language_character_to_unicode(int languageId, wchar_t codepoint) +{ + switch (languageId) { + case RCT2_LANGUAGE_ID_KOREAN: + return codepoint; + case RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL: + return encoding_convert_big5_to_unicode(codepoint); + case RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED: + return encoding_convert_gb2312_to_unicode(codepoint); + default: + return codepoint; + } +} + +static utf8 *convert_multibyte_charset(const char *src, int languageId) { int reservedLength = (strlen(src) * 4) + 1; utf8 *buffer = malloc(reservedLength); @@ -388,7 +403,7 @@ static utf8 *convert_multibyte_charset(const char *src) uint8 b = *ch++; uint16 codepoint = (a << 8) | b; - codepoint = encoding_convert_gb2312_to_unicode(codepoint - 0x8080); + codepoint = convert_specific_language_character_to_unicode(languageId, codepoint); dst = utf8_write_codepoint(dst, codepoint); } else { *dst++ = *ch++; @@ -397,6 +412,7 @@ static utf8 *convert_multibyte_charset(const char *src) *dst++ = 0; int actualLength = dst - buffer; buffer = realloc(buffer, actualLength); + return buffer; } @@ -480,7 +496,7 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ free(*cacheString); } if (rct2_language_is_multibyte_charset(chosenLanguageId)) { - *cacheString = convert_multibyte_charset(pString); + *cacheString = convert_multibyte_charset(pString, chosenLanguageId); } else { *cacheString = win1252_to_utf8_alloc(pString); } @@ -503,7 +519,7 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ free(*cacheString); } if (rct2_language_is_multibyte_charset(chosenLanguageId)) { - *cacheString = convert_multibyte_charset(pString); + *cacheString = convert_multibyte_charset(pString, chosenLanguageId); } else { *cacheString = win1252_to_utf8_alloc(pString); } diff --git a/src/localisation/language.h b/src/localisation/language.h index 2b8fcb5d1b..9dab63ffaa 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -37,6 +37,7 @@ enum { LANGUAGE_ITALIAN, LANGUAGE_PORTUGUESE_BR, LANGUAGE_CHINESE_TRADITIONAL, +// LANGUAGE_KOREAN, LANGUAGE_COUNT }; diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 7f981db1c7..4a8f966855 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -800,7 +800,7 @@ void generate_string_file() utf8 *get_string_end(utf8 *text) { int codepoint; - const utf8 *ch = text; + utf8 *ch = text; while ((codepoint = utf8_get_next(ch, &ch)) != 0) { if (utf8_is_format_code(codepoint)) { diff --git a/src/localisation/localisation.h b/src/localisation/localisation.h index 0bb6c27918..be08041066 100644 --- a/src/localisation/localisation.h +++ b/src/localisation/localisation.h @@ -47,6 +47,7 @@ utf8 *win1252_to_utf8_alloc(const char *src); int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength); wchar_t encoding_convert_gb2312_to_unicode(wchar_t gb2312); +wchar_t encoding_convert_big5_to_unicode(wchar_t big5); #define MAX_USER_STRINGS 1024 #define USER_STRING_MAX_LENGTH 32 From c6815b6eec7e27ddacc17b70df382ebef971be9f Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 27 Jul 2015 17:21:21 +0100 Subject: [PATCH 0410/1173] implement utf8, part 8 --- src/drawing/string.c | 220 +++++++++----------------------- src/localisation/format_codes.h | 7 + src/localisation/localisation.c | 50 +++++--- 3 files changed, 97 insertions(+), 180 deletions(-) diff --git a/src/drawing/string.c b/src/drawing/string.c index 81aa881a24..43bae07a32 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -105,7 +105,6 @@ void gfx_load_character_widths(){ } } - /* rct2: 0x006C23B1 */ int gfx_get_string_width_new_lined(char* buffer){ // Current font sprites @@ -177,7 +176,6 @@ int gfx_get_string_width_new_lined(char* buffer){ return max_width; } - /** * Return the width of the string in buffer * @@ -198,93 +196,43 @@ int gfx_get_string_width(char* buffer) */ int gfx_clip_string(utf8 *text, int width) { - rct_g1_element g1_element; - uint16 fontSpriteBase; - int maxWidth; + int clippedWidth; if (width < 6) { *text = 0; return 0; } - fontSpriteBase = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); - int dotCharacterWidth = _spriteFontCharacterWidths[fontSpriteBase + ('.' - ' ')]; - int elipsisCharacterWidth = dotCharacterWidth * 3; - - maxWidth = width - elipsisCharacterWidth; - - int clippedWidth = 0; - utf8 *lastCh = text; - utf8 *ch = text; - int codepoint; - while ((codepoint = utf8_get_next(ch, &ch)) != 0) { - if (utf8_is_format_code(codepoint)) { - switch (codepoint) { - case FORMAT_MOVE_X: - clippedWidth = *ch++; - break; - case FORMAT_ADJUST_PALETTE: - case 3: - case 4: - ch++; - break; - case FORMAT_NEWLINE: - case FORMAT_NEWLINE_SMALLER: - break; - case FORMAT_TINYFONT: - fontSpriteBase = 448; - break; - case FORMAT_SMALLFONT: - fontSpriteBase = 0; - break; - case FORMAT_MEDIUMFONT: - fontSpriteBase = 224; - break; - case FORMAT_BIGFONT: - fontSpriteBase = 672; - break; - case FORMAT_OUTLINE: - case FORMAT_OUTLINE_OFF: - case FORMAT_WINDOW_COLOUR_1: - case FORMAT_WINDOW_COLOUR_2: - case FORMAT_WINDOW_COLOUR_3: - case 0x10: - break; - case FORMAT_INLINE_SPRITE: - g1_element = g1Elements[*((uint32*)(ch - 1)) & 0x7FFFF]; - clippedWidth += g1_element.width; - ch += 4; - break; - default: - if (codepoint >= FORMAT_COLOUR_CODE_START || codepoint <= FORMAT_COLOUR_CODE_END) { - break; - } - if (codepoint <= 22) { //case 0x11? FORMAT_NEW_LINE_X_Y - ch += 2; - } else { - ch += 4;//never happens? - } - break; - } - - dotCharacterWidth = _spriteFontCharacterWidths[fontSpriteBase + ('.' - ' ')]; - elipsisCharacterWidth = dotCharacterWidth * 3; - maxWidth = width - elipsisCharacterWidth; - } else { - clippedWidth += _spriteFontCharacterWidths[fontSpriteBase + utf8_get_sprite_offset_for_codepoint(codepoint)]; - if (clippedWidth > width) { - strcpy(lastCh - 3, "..."); - clippedWidth = width; - return clippedWidth; - } - if (clippedWidth <= maxWidth) { - lastCh = ch + 1; - } - } + clippedWidth = gfx_get_string_width(text); + if (clippedWidth <= width) { + return clippedWidth; } - return clippedWidth; -} + utf8 backup[4]; + utf8 *ch = text; + utf8 *nextCh = text; + utf8 *clipCh = text; + int codepoint; + while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { + for (int i = 0; i < 4; i++) { backup[i] = nextCh[i]; }; + for (int i = 0; i < 3; i++) { nextCh[i] = '.'; } + nextCh[3] = 0; + + int queryWidth = gfx_get_string_width(text); + if (queryWidth < width) { + clipCh = nextCh; + clippedWidth = queryWidth; + } else { + for (int i = 0; i < 3; i++) { clipCh[i] = '.'; } + clipCh[3] = 0; + return clippedWidth; + } + + for (int i = 0; i < 4; i++) { nextCh[i] = backup[i]; }; + ch = nextCh; + } + return gfx_get_string_width(text); +} /** * Wrap the text in buffer to width, returns width of longest line. @@ -299,112 +247,62 @@ int gfx_clip_string(utf8 *text, int width) * num_lines (edi) - out * font_height (ebx) - out */ -int gfx_wrap_string(utf8 *text, int width, int *num_lines, int *font_height) +int gfx_wrap_string(utf8 *text, int width, int *outNumLines, int *outFontHeight) { int lineWidth = 0; int maxWidth = 0; - rct_g1_element g1Element; - - *num_lines = 0; - *font_height = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + *outNumLines = 0; // Pointer to the start of the current word utf8 *currentWord = NULL; + // Width of line up to current word int currentWidth; utf8 *ch = text; + utf8 *firstCh = text; utf8 *lastCh; int codepoint; while ((codepoint = utf8_get_next(ch, &lastCh)) != 0) { - // Remember start of current word and line width up to this word if (codepoint == ' ') { currentWord = ch; currentWidth = lineWidth; } - if (utf8_is_format_code(codepoint)) { - switch (codepoint) { - case FORMAT_MOVE_X: - case FORMAT_ADJUST_PALETTE: - case 3: - case 4: - ch++; - break; - case FORMAT_NEWLINE: - case FORMAT_NEWLINE_SMALLER: - *num_lines += 1; - *ch = 0; - if (lineWidth > maxWidth) { - maxWidth = lineWidth; - } - lineWidth = 0; - currentWord = 0; - break; - case FORMAT_TINYFONT: - *font_height = FONT_SPRITE_BASE_TINY; - break; - case FORMAT_SMALLFONT: - *font_height = FONT_SPRITE_BASE_SMALL; - break; - case FORMAT_MEDIUMFONT: - *font_height = FONT_SPRITE_BASE_MEDIUM; - break; - case FORMAT_BIGFONT: - *font_height = FONT_SPRITE_BASE_BIG; - break; - case FORMAT_OUTLINE: - case FORMAT_OUTLINE_OFF: - case FORMAT_WINDOW_COLOUR_1: - case FORMAT_WINDOW_COLOUR_2: - case FORMAT_WINDOW_COLOUR_3: - case 0x10: - break; - case FORMAT_INLINE_SPRITE: - g1Element = g1Elements[*((uint32*)(ch + 1)) & 0x7FFFF]; - lineWidth += g1Element.width; - lastCh += 4; - break; - default: - if (codepoint < FORMAT_COLOUR_CODE_START || codepoint > FORMAT_COLOUR_CODE_END) { - if (codepoint <= 0x16) { - lastCh += 2; - } else { - lastCh += 4; - } - } - break; - } + uint8 saveCh = *lastCh; + *lastCh = 0; + lineWidth = gfx_get_string_width(firstCh); + *lastCh = saveCh; + + if (lineWidth <= width) { ch = lastCh; + } else if (currentWord == NULL) { + // Single word is longer than line, insert null terminator + utf8 *end = get_string_end(ch); + memmove(ch + 1, ch, end - ch + 1); + *ch++ = 0; + + maxWidth = max(maxWidth, lineWidth); + (*outNumLines)++; + lineWidth = 0; + currentWord = NULL; + firstCh = ch; } else { - lineWidth += _spriteFontCharacterWidths[*font_height + utf8_get_sprite_offset_for_codepoint(codepoint)]; - if ((int)lineWidth <= width) { - ch = lastCh; - } else if (currentWord == NULL) { - // Single word is longer than line, insert null terminator - utf8 *end = get_string_end(ch); - memmove(ch + 1, ch, end - ch + 1); - *ch++ = 0; + ch = currentWord; + *ch++ = 0; - maxWidth = max(maxWidth, lineWidth); - *num_lines += 1; - lineWidth = 0; - currentWord = NULL; - } else { - ch = currentWord; - *ch++ = 0; - - maxWidth = max(maxWidth, currentWidth); - *num_lines += 1; - lineWidth = 0; - currentWord = NULL; - } + maxWidth = max(maxWidth, currentWidth); + (*outNumLines)++; + lineWidth = 0; + currentWord = NULL; + firstCh = ch; } } + + *outFontHeight = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); return maxWidth == 0 ? lineWidth : maxWidth; } - /** * Draws i formatted text string left aligned at i specified position but clips * the text with an elipsis if the text width exceeds the specified width. diff --git a/src/localisation/format_codes.h b/src/localisation/format_codes.h index ff82440447..0100520671 100644 --- a/src/localisation/format_codes.h +++ b/src/localisation/format_codes.h @@ -98,6 +98,7 @@ enum { // Extra non-ascii characters FORMAT_AMINUSCULE = 159, + FORMAT_CENT = 162, FORMAT_POUND = 163, FORMAT_YEN = 165, FORMAT_COPYRIGHT = 169, @@ -126,6 +127,12 @@ enum { FORMAT_TICK = 10003, FORMAT_CROSS = 10005, + + // Format codes that need suitable unicode allocations + FORMAT_SYMBOL_i = 20000, + FORMAT_SYMBOL_RAILWAY = 20001, + FORMAT_SYMBOL_ROAD = 20002, + FORMAT_SYMBOL_FLAG = 20003, }; #endif \ No newline at end of file diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 4a8f966855..3eb79b2e19 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -156,31 +156,43 @@ bool utf8_should_use_sprite_for_codepoint(int codepoint) int utf8_get_sprite_offset_for_codepoint(int codepoint) { switch (codepoint) { - case FORMAT_AMINUSCULE: return 159 - 32; - case FORMAT_POUND: return 163 - 32; - case FORMAT_YEN: return 165 - 32; - case FORMAT_COPYRIGHT: return 169 - 32; - case FORMAT_LEFTGUILLEMET: return 171 - 32; - case FORMAT_DEGREE: return 176 - 32; - case FORMAT_SQUARED: return 178 - 32; - case FORMAT_RIGHTGUILLEMET: return 187 - 32; - case FORMAT_INVERTEDQUESTION: return 191 - 32; - case FORMAT_OPENQUOTES: return 180 - 32; case FORMAT_ENDQUOTES: return 34 - 32; - case FORMAT_BULLET: return 186 - 32; - case FORMAT_POWERNEGATIVEONE: return 185 - 32; - case FORMAT_EURO: return 181 - 32; - case FORMAT_APPROX: return 184 - 32; + + case FORMAT_AMINUSCULE: return 159 - 32; case FORMAT_UP: return 160 - 32; - case FORMAT_RIGHT: return 175 - 32; + case FORMAT_SYMBOL_i: return 160 - 32; + case FORMAT_CENT: return 162 - 32; + case FORMAT_POUND: return 163 - 32; + + case FORMAT_YEN: return 165 - 32; + + + + case FORMAT_COPYRIGHT: return 169 - 32; case FORMAT_DOWN: return 170 - 32; - case FORMAT_LEFT: return 190 - 32; - case FORMAT_SMALLUP: return 188 - 32; - case FORMAT_SMALLDOWN: return 189 - 32; + case FORMAT_LEFTGUILLEMET: return 171 - 32; case FORMAT_TICK: return 172 - 32; case FORMAT_CROSS: return 173 - 32; + + case FORMAT_RIGHT: return 175 - 32; + case FORMAT_DEGREE: return 176 - 32; + case FORMAT_SYMBOL_RAILWAY: return 177 - 32; + case FORMAT_SQUARED: return 178 - 32; + + case FORMAT_OPENQUOTES: return 180 - 32; + case FORMAT_EURO: return 181 - 32; + case FORMAT_SYMBOL_ROAD: return 182 - 32; + case FORMAT_SYMBOL_FLAG: return 183 - 32; + case FORMAT_APPROX: return 184 - 32; + case FORMAT_POWERNEGATIVEONE: return 185 - 32; + case FORMAT_BULLET: return 186 - 32; + case FORMAT_RIGHTGUILLEMET: return 187 - 32; + case FORMAT_SMALLUP: return 188 - 32; + case FORMAT_SMALLDOWN: return 189 - 32; + case FORMAT_LEFT: return 190 - 32; + case FORMAT_INVERTEDQUESTION: return 191 - 32; default: - if (codepoint > 224) codepoint = 'W'; + if (codepoint < 32 || codepoint >= 256) codepoint = '?'; return codepoint - 32; } } From 99c7c937642b1b112907d3d1cc7d6383839665ca Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 27 Jul 2015 18:58:12 +0100 Subject: [PATCH 0411/1173] implement utf8, part 9 --- src/drawing/string.c | 148 ++++++++++++-------------------- src/interface/widget.c | 2 +- src/localisation/format_codes.h | 1 + src/localisation/language.c | 7 ++ src/localisation/language.h | 1 + src/localisation/localisation.c | 106 +++++++++++------------ src/localisation/localisation.h | 6 +- src/platform/shared.c | 68 +++++++++------ src/windows/error.c | 4 +- src/windows/text_input.c | 2 +- 10 files changed, 166 insertions(+), 179 deletions(-) diff --git a/src/drawing/string.c b/src/drawing/string.c index 43bae07a32..8c5a1f78e9 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -105,75 +105,33 @@ void gfx_load_character_widths(){ } } -/* rct2: 0x006C23B1 */ -int gfx_get_string_width_new_lined(char* buffer){ - // Current font sprites - uint16* current_font_sprite_base; - // Width of string - int width = 0, max_width = 0, no_lines = 1; - rct_g1_element g1_element; +/** + * + * rct2: 0x006C23B1 + */ +int gfx_get_string_width_new_lined(utf8 *text) +{ + utf8 *ch = text; + utf8 *firstCh = text; + utf8 *nextCh; + utf8 backup; + int codepoint; - current_font_sprite_base = RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); - - for (uint8* curr_char = (uint8*)buffer; *curr_char != (uint8)0; curr_char++) { - - if (*curr_char >= 0x20) { - width += _spriteFontCharacterWidths[*current_font_sprite_base + (*curr_char - 0x20)]; - continue; - } - switch (*curr_char) { - case FORMAT_MOVE_X: - curr_char++; - width = *curr_char; - break; - case FORMAT_ADJUST_PALETTE: - case 3: - case 4: - curr_char++; - break; - case FORMAT_NEWLINE: - case FORMAT_NEWLINE_SMALLER: - no_lines++; - max_width = max(max_width, width); - width = 0; - break; - case FORMAT_TINYFONT: - *current_font_sprite_base = 0x1C0; - break; - case FORMAT_BIGFONT: - *current_font_sprite_base = 0x2A0; - break; - case FORMAT_MEDIUMFONT: - *current_font_sprite_base = 0x0E0; - break; - case FORMAT_SMALLFONT: - *current_font_sprite_base = 0; - break; - case FORMAT_OUTLINE: - case FORMAT_OUTLINE_OFF: - case FORMAT_WINDOW_COLOUR_1: - case FORMAT_WINDOW_COLOUR_2: - case FORMAT_WINDOW_COLOUR_3: - case 0x10: - continue; - case FORMAT_INLINE_SPRITE: - g1_element = g1Elements[*((uint32*)(curr_char + 1)) & 0x7FFFF]; - width += g1_element.width; - curr_char += 4; - break; - default: - if (*curr_char <= 0x16) { //case 0x11? FORMAT_NEW_LINE_X_Y - curr_char += 2; - continue; - } - curr_char += 4;//never happens? - break; + int width = 0; + int maxWidth = 0; + while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { + if (codepoint == FORMAT_NEWLINE || codepoint == FORMAT_NEWLINE_SMALLER) { + backup = *nextCh; + *nextCh = 0; + maxWidth = max(maxWidth, gfx_get_string_width(firstCh)); + *nextCh = backup; + firstCh = nextCh; } + ch = nextCh; } + maxWidth = max(maxWidth, gfx_get_string_width(firstCh)); - if (width > max_width) - return width; - return max_width; + return maxWidth; } /** @@ -267,6 +225,14 @@ int gfx_wrap_string(utf8 *text, int width, int *outNumLines, int *outFontHeight) if (codepoint == ' ') { currentWord = ch; currentWidth = lineWidth; + } else if (codepoint == FORMAT_NEWLINE) { + *ch++ = 0; + maxWidth = max(maxWidth, lineWidth); + (*outNumLines)++; + lineWidth = 0; + currentWord = NULL; + firstCh = ch; + continue; } uint8 saveCh = *lastCh; @@ -473,8 +439,8 @@ int gfx_draw_string_centred_wrapped(rct_drawpixelinfo *dpi, void *args, int x, i int half_width = gfx_get_string_width(buffer) / 2; gfx_draw_string(dpi, buffer, 0xFE, x - half_width, line_y); - buffer += get_string_length(buffer) + 1; - line_y += line_height; + buffer = get_string_end(buffer) + 1; + line_y += line_height; } return line_y - y; @@ -494,45 +460,41 @@ int gfx_draw_string_centred_wrapped(rct_drawpixelinfo *dpi, void *args, int x, i int gfx_draw_string_left_wrapped(rct_drawpixelinfo *dpi, void *args, int x, int y, int width, int format, int colour) { // font height might actually be something else - int font_height, line_height, line_width, line_y, num_lines; + int fontSpriteBase, lineHeight, lineY, numLines; // Location of font sprites uint16* current_font_sprite_base = RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); - *current_font_sprite_base = 0xE0; + *current_font_sprite_base = FONT_SPRITE_BASE_MEDIUM; char* buffer = RCT2_ADDRESS(0x009C383D, char); - gfx_draw_string(dpi, buffer, colour, dpi->x, dpi->y); - buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); - format_string(buffer, format, args); - *current_font_sprite_base = 0xE0; - - // Line width unused here - line_width = gfx_wrap_string(buffer, width, &num_lines, &font_height); - - line_height = 0x0A; - - if (font_height > 0xE0) { - line_height = 6; - if (font_height != 0x1C0) { - line_height = 0x12; - } + *current_font_sprite_base = FONT_SPRITE_BASE_MEDIUM; + gfx_wrap_string(buffer, width, &numLines, &fontSpriteBase); + switch (fontSpriteBase) { + case FONT_SPRITE_BASE_TINY: + lineHeight = 6; + break; + default: + case FONT_SPRITE_BASE_SMALL: + case FONT_SPRITE_BASE_MEDIUM: + lineHeight = 10; + break; + case FONT_SPRITE_BASE_BIG: + lineHeight = 18; + break; } RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16) = 0; - - line_y = y; - - for (int line = 0; line <= num_lines; ++line) { - gfx_draw_string(dpi, buffer, 0xFE, x, line_y); - buffer += get_string_length(buffer) + 1; - line_y += line_height; + lineY = y; + for (int line = 0; line <= numLines; ++line) { + gfx_draw_string(dpi, buffer, 0xFE, x, lineY); + buffer = get_string_end(buffer) + 1; + lineY += lineHeight; } - - return line_y - y; + return lineY - y; } /** diff --git a/src/interface/widget.c b/src/interface/widget.c index 3a060a548a..25f7aab9d2 100644 --- a/src/interface/widget.c +++ b/src/interface/widget.c @@ -1192,7 +1192,7 @@ static void widget_text_box_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg gfx_draw_string(dpi, wrapped_string, w->colours[1], l + 2, t); - int string_length = get_string_length(wrapped_string); + int string_length = get_string_size(wrapped_string) - 1; // Make a copy of the string for measuring the width. char temp_string[512] = { 0 }; diff --git a/src/localisation/format_codes.h b/src/localisation/format_codes.h index 0100520671..7733597487 100644 --- a/src/localisation/format_codes.h +++ b/src/localisation/format_codes.h @@ -77,6 +77,7 @@ enum { FORMAT_REALTIME, FORMAT_LENGTH, FORMAT_SPRITE, + FORMAT_ARGUMENT_CODE_END = FORMAT_SPRITE, // Colour format codes FORMAT_COLOUR_CODE_START = 142, diff --git a/src/localisation/language.c b/src/localisation/language.c index 2bf1ac7847..12ed327753 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -137,6 +137,13 @@ utf8 *utf8_write_codepoint(utf8 *dst, uint32 codepoint) } } +bool utf8_is_codepoint_start(utf8 *text) +{ + if ((text[0] & 0x80) == 0) return true; + if ((text[0] & 0xC0) == 0xC0) return true; + return false; +} + const char *language_get_string(rct_string_id id) { const char *openrctString = NULL; diff --git a/src/localisation/language.h b/src/localisation/language.h index 9dab63ffaa..fbc01b32a3 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -72,5 +72,6 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ uint32 utf8_get_next(const utf8 *char_ptr, const utf8 **nextchar_ptr); utf8 *utf8_write_codepoint(utf8 *dst, uint32 codepoint); +bool utf8_is_codepoint_start(utf8 *text); #endif diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 3eb79b2e19..49a11bc1bb 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -128,7 +128,8 @@ const char *format_get_token(uint32 code) bool utf8_is_format_code(int codepoint) { if (codepoint < 32) return true; - if (codepoint >= 123 && codepoint <= 155) return true; + if (codepoint >= FORMAT_ARGUMENT_CODE_START && codepoint <= FORMAT_ARGUMENT_CODE_END) return true; + if (codepoint >= FORMAT_COLOUR_CODE_START && codepoint <= FORMAT_COLOUR_CODE_END) return true; return false; } @@ -197,6 +198,23 @@ int utf8_get_sprite_offset_for_codepoint(int codepoint) } } +int utf8_get_format_code_arg_length(int codepoint) +{ + switch (codepoint) { + case FORMAT_MOVE_X: + case FORMAT_ADJUST_PALETTE: + case 3: + case 4: + return 1; + case FORMAT_NEWLINE_X_Y: + return 2; + case FORMAT_INLINE_SPRITE: + return 4; + default: + return 0; + } +} + #pragma endregion void format_string_part_from_raw(char **dest, const char *src, char **args); @@ -809,70 +827,46 @@ void generate_string_file() fclose(f); } -utf8 *get_string_end(utf8 *text) -{ - int codepoint; - utf8 *ch = text; - - while ((codepoint = utf8_get_next(ch, &ch)) != 0) { - if (utf8_is_format_code(codepoint)) { - switch (codepoint) { - case FORMAT_MOVE_X: - case FORMAT_ADJUST_PALETTE: - case 3: - case 4: - ch++; - break; - case FORMAT_INLINE_SPRITE: - ch += 4; - break; - default: - if (codepoint <= 22) { - ch += 2; - } else { - ch += 4; - } - break; - } - } - } - return ch - 1; -} - /** -* Return the length of the string in buffer. -* note you can't use strlen as there can be inline sprites! -* -* buffer (esi) -*/ -int get_string_length(const utf8* text) + * Returns a pointer to the null terminator of the given UTF-8 string. + */ +utf8 *get_string_end(const utf8 *text) { int codepoint; const utf8 *ch = text; + while ((codepoint = utf8_get_next(ch, &ch)) != 0) { + int argLength = utf8_get_format_code_arg_length(codepoint); + ch += argLength; + } + return (utf8*)(ch - 1); +} + +/** + * Return the number of bytes (including the null terminator) in the given UTF-8 string. + */ +size_t get_string_size(const utf8 *text) +{ + return get_string_end(text) - text + 1; +} + +/** + * Return the number of visible characters (excludes format codes) in the given UTF-8 string. + */ +int get_string_length(const utf8 *text) +{ + int codepoint; + const utf8 *ch = text; + + int count = 0; while ((codepoint = utf8_get_next(ch, &ch)) != 0) { if (utf8_is_format_code(codepoint)) { - switch (codepoint) { - case FORMAT_MOVE_X: - case FORMAT_ADJUST_PALETTE: - case 3: - case 4: - ch++; - break; - case FORMAT_INLINE_SPRITE: - ch += 4; - break; - default: - if (codepoint <= 22) { - ch += 2; - } else { - ch += 4; - } - break; - } + ch += utf8_get_format_code_arg_length(codepoint); + } else { + count++; } } - return ch - text - 1; + return count; } utf8 *win1252_to_utf8_alloc(const char *src) diff --git a/src/localisation/localisation.h b/src/localisation/localisation.h index be08041066..f2025b44cd 100644 --- a/src/localisation/localisation.h +++ b/src/localisation/localisation.h @@ -29,14 +29,16 @@ bool utf8_is_format_code(int codepoint); bool utf8_should_use_sprite_for_codepoint(int codepoint); int utf8_get_sprite_offset_for_codepoint(int codepoint); +int utf8_get_format_code_arg_length(int codepoint); void format_string(char *dest, rct_string_id format, void *args); void format_string_raw(char *dest, char *src, void *args); void format_string_to_upper(char *dest, rct_string_id format, void *args); void generate_string_file(); void error_string_quit(int error, rct_string_id format); -utf8 *get_string_end(utf8 *text); -int get_string_length(const utf8* buffer); +utf8 *get_string_end(const utf8 *text); +size_t get_string_size(const utf8 *text); +int get_string_length(const utf8 *text); void user_string_clear_all(); rct_string_id user_string_allocate(int base, const char *text); diff --git a/src/platform/shared.c b/src/platform/shared.c index 0cf5d96885..9be148b275 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -39,7 +39,7 @@ openrct2_cursor gCursorState; const unsigned char *gKeysState; unsigned char *gKeysPressed; unsigned int gLastKeyPressed; -char* gTextInput; +utf8 *gTextInput; int gTextInputLength; int gTextInputMaxLength; int gTextInputCursorPosition = 0; @@ -420,14 +420,22 @@ void platform_process_messages() // Text input // If backspace and we have input text with a cursor position none zero - if (e.key.keysym.sym == SDLK_BACKSPACE && gTextInputLength > 0 && gTextInput && gTextInputCursorPosition){ + if (e.key.keysym.sym == SDLK_BACKSPACE && gTextInputLength > 0 && gTextInput != NULL && gTextInputCursorPosition) { + int dstIndex = gTextInputCursorPosition; + do { + if (dstIndex == 0) break; + dstIndex--; + } while (!utf8_is_codepoint_start(&gTextInput[dstIndex])); + int removedCodepointSize = gTextInputCursorPosition - dstIndex; + // When at max length don't shift the data left // as it would buffer overflow. - if (gTextInputCursorPosition != gTextInputMaxLength) - memmove(gTextInput + gTextInputCursorPosition - 1, gTextInput + gTextInputCursorPosition, gTextInputMaxLength - gTextInputCursorPosition - 1); - gTextInput[gTextInputLength - 1] = '\0'; - gTextInputCursorPosition--; - gTextInputLength--; + if (gTextInputCursorPosition != gTextInputMaxLength) { + memmove(gTextInput + dstIndex, gTextInput + gTextInputCursorPosition, gTextInputMaxLength - dstIndex); + } + gTextInput[gTextInputLength - removedCodepointSize] = '\0'; + gTextInputCursorPosition -= removedCodepointSize; + gTextInputLength -= removedCodepointSize; console_refresh_caret(); window_update_textbox(); } @@ -435,46 +443,58 @@ void platform_process_messages() gTextInputCursorPosition = gTextInputLength; console_refresh_caret(); } - if (e.key.keysym.sym == SDLK_HOME){ + if (e.key.keysym.sym == SDLK_HOME) { gTextInputCursorPosition = 0; console_refresh_caret(); } - if (e.key.keysym.sym == SDLK_DELETE && gTextInputLength > 0 && gTextInput && gTextInputCursorPosition != gTextInputLength){ - memmove(gTextInput + gTextInputCursorPosition, gTextInput + gTextInputCursorPosition + 1, gTextInputMaxLength - gTextInputCursorPosition - 1); - gTextInput[gTextInputMaxLength - 1] = '\0'; - gTextInputLength--; + if (e.key.keysym.sym == SDLK_DELETE && gTextInputLength > 0 && gTextInput != NULL && gTextInputCursorPosition != gTextInputLength) { + int dstIndex = gTextInputCursorPosition; + do { + if (dstIndex == gTextInputLength) break; + dstIndex++; + } while (!utf8_is_codepoint_start(&gTextInput[dstIndex])); + int removedCodepointSize = dstIndex - gTextInputCursorPosition; + + memmove(gTextInput + gTextInputCursorPosition, gTextInput + dstIndex, gTextInputMaxLength - dstIndex); + gTextInput[gTextInputMaxLength - removedCodepointSize] = '\0'; + gTextInputLength -= removedCodepointSize; console_refresh_caret(); window_update_textbox(); } - if (e.key.keysym.sym == SDLK_RETURN && gTextInput) { + if (e.key.keysym.sym == SDLK_RETURN && gTextInput != NULL) { window_cancel_textbox(); } - if (e.key.keysym.sym == SDLK_LEFT && gTextInput){ - if (gTextInputCursorPosition) gTextInputCursorPosition--; + if (e.key.keysym.sym == SDLK_LEFT && gTextInput != NULL) { + do { + if (gTextInputCursorPosition == 0) break; + gTextInputCursorPosition--; + } while (!utf8_is_codepoint_start(&gTextInput[gTextInputCursorPosition])); console_refresh_caret(); } - else if (e.key.keysym.sym == SDLK_RIGHT && gTextInput){ - if (gTextInputCursorPosition < gTextInputLength) gTextInputCursorPosition++; + else if (e.key.keysym.sym == SDLK_RIGHT && gTextInput != NULL) { + do { + if (gTextInputCursorPosition == gTextInputLength) break; + gTextInputCursorPosition++; + } while (!utf8_is_codepoint_start(&gTextInput[gTextInputCursorPosition])); console_refresh_caret(); } - // Checks GUI modifier key for Macs otherwise ctrl key + // Checks GUI modifier key for MACs otherwise CTRL key #ifdef MAC - else if (e.key.keysym.sym == SDLK_v && SDL_GetModState() & KMOD_GUI && gTextInput) { + else if (e.key.keysym.sym == SDLK_v && SDL_GetModState() & KMOD_GUI && gTextInput != NULL) { #else - else if (e.key.keysym.sym == SDLK_v && SDL_GetModState() & KMOD_CTRL && gTextInput) { + else if (e.key.keysym.sym == SDLK_v && SDL_GetModState() & KMOD_CTRL && gTextInput != NULL) { #endif if (SDL_HasClipboardText()) { - char* text = SDL_GetClipboardText(); - + utf8 *text = SDL_GetClipboardText(); for (int i = 0; text[i] != '\0' && gTextInputLength < gTextInputMaxLength; i++) { // If inserting in center of string make space for new letter if (gTextInputLength > gTextInputCursorPosition){ memmove(gTextInput + gTextInputCursorPosition + 1, gTextInput + gTextInputCursorPosition, gTextInputMaxLength - gTextInputCursorPosition - 1); gTextInput[gTextInputCursorPosition] = text[i]; gTextInputLength++; + } else { + gTextInput[gTextInputLength++] = text[i]; } - else gTextInput[gTextInputLength++] = text[i]; - gTextInputCursorPosition++; } window_update_textbox(); diff --git a/src/windows/error.c b/src/windows/error.c index 35b699a66b..3a1b232952 100644 --- a/src/windows/error.c +++ b/src/windows/error.c @@ -92,14 +92,14 @@ void window_error_open(rct_string_id title, rct_string_id message) *dst++ = FORMAT_BLACK; if (title != (rct_string_id)STR_NONE) { format_string(dst, title, args); - dst += get_string_length(dst); + dst += get_string_size(dst) - 1; } // Format the message if (message != (rct_string_id)STR_NONE) { *dst++ = FORMAT_NEWLINE; format_string(dst, message, args); - dst += get_string_length(dst); + dst += get_string_size(dst) - 1; } log_verbose("show error, %s", _window_error_text + 1); diff --git a/src/windows/text_input.c b/src/windows/text_input.c index 5f84c6aedf..b2a4388ac8 100644 --- a/src/windows/text_input.c +++ b/src/windows/text_input.c @@ -287,7 +287,7 @@ static void window_text_input_paint(rct_window *w, rct_drawpixelinfo *dpi) for (int line = 0; line <= no_lines; ++line){ gfx_draw_string(dpi, wrap_pointer, w->colours[1], w->x + 12, y); - int string_length = get_string_length(wrap_pointer); + int string_length = get_string_size(wrap_pointer) - 1; if (!cur_drawn && (gTextInputCursorPosition <= char_count + string_length)){ // Make a copy of the string for measuring the width. From 6c0efd25a05489851c909c85ac3cd46a33b29d25 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 27 Jul 2015 20:46:47 +0100 Subject: [PATCH 0412/1173] implement utf8, part 10 --- build.sh | 2 +- pre-build.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index a6bc78fb14..14ba600e14 100755 --- a/build.sh +++ b/build.sh @@ -9,7 +9,7 @@ if [[ ! -d build ]]; then mkdir -p build fi -libversion=1 +libversion=2 libVFile="./libversion" libdir="./lib" currentversion=0 diff --git a/pre-build.ps1 b/pre-build.ps1 index 938f4c7f7b..3c7f56ce94 100644 --- a/pre-build.ps1 +++ b/pre-build.ps1 @@ -1,5 +1,5 @@ #init -$libversion = 1 +$libversion = 2 $path = Split-Path $Script:MyInvocation.MyCommand.Path $zip = $path+'\orctlibs.zip' $libs = $path+'\lib' From 357111a560cd6bf6b7a40a7038256d3a1fd6ad82 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 29 Jul 2015 00:15:15 +0100 Subject: [PATCH 0413/1173] implement utf8, part 11 --- src/platform/platform.h | 5 +++++ src/platform/shared.c | 41 +++++++++++++++++++++++++++------------- src/windows/text_input.c | 29 ++++++++++++++++++++++++---- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/src/platform/platform.h b/src/platform/platform.h index b7f5e0feb7..6554170c29 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -63,6 +63,11 @@ extern unsigned int gLastKeyPressed; extern int gTextInputCursorPosition; extern int gTextInputLength; +extern bool gTextInputCompositionActive; +extern utf8 gTextInputComposition[32]; +extern int gTextInputCompositionStart; +extern int gTextInputCompositionLength; + extern int gResolutionsAllowAnyAspectRatio; extern int gNumResolutions; extern resolution *gResolutions; diff --git a/src/platform/shared.c b/src/platform/shared.c index 9be148b275..c267291d62 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -44,6 +44,11 @@ int gTextInputLength; int gTextInputMaxLength; int gTextInputCursorPosition = 0; +bool gTextInputCompositionActive; +utf8 gTextInputComposition[32]; +int gTextInputCompositionStart; +int gTextInputCompositionLength; + int gNumResolutions = 0; resolution *gResolutions = NULL; int gResolutionsAllowAnyAspectRatio = 0; @@ -402,6 +407,8 @@ void platform_process_messages() } break; case SDL_KEYDOWN: + if (gTextInputCompositionActive) break; + if (e.key.keysym.sym == SDLK_KP_ENTER){ // Map Keypad enter to regular enter. e.key.keysym.scancode = SDL_SCANCODE_RETURN; @@ -520,29 +527,33 @@ void platform_process_messages() } } break; - + case SDL_TEXTEDITING: + strcpy(gTextInputComposition, e.edit.text); + gTextInputCompositionStart = e.edit.start; + gTextInputCompositionLength = e.edit.length; + gTextInputCompositionActive = gTextInputComposition[0] != 0; + break; case SDL_TEXTINPUT: if (gTextInputLength < gTextInputMaxLength && gTextInput){ - // Convert the utf-8 code into rct ascii - char new_char; + // HACK ` will close console, so don't input any text if (e.text.text[0] == '`' && gConsoleOpen) break; - if (!(e.text.text[0] & 0x80)) - new_char = *e.text.text; - else if (!(e.text.text[0] & 0x20)) - new_char = ((e.text.text[0] & 0x1F) << 6) | (e.text.text[1] & 0x3F); + + utf8 *newText = e.text.text; + int newTextLength = strlen(newText); // If inserting in center of string make space for new letter - if (gTextInputLength > gTextInputCursorPosition){ - memmove(gTextInput + gTextInputCursorPosition + 1, gTextInput + gTextInputCursorPosition, gTextInputMaxLength - gTextInputCursorPosition - 1); - gTextInput[gTextInputCursorPosition] = new_char; - gTextInputLength++; + if (gTextInputLength > gTextInputCursorPosition) { + memmove(gTextInput + gTextInputCursorPosition + newTextLength, gTextInput + gTextInputCursorPosition, gTextInputMaxLength - gTextInputCursorPosition - newTextLength); + memcpy(&gTextInput[gTextInputCursorPosition], newText, newTextLength); + gTextInputLength += newTextLength; } else { - gTextInput[gTextInputLength++] = new_char; + memcpy(&gTextInput[gTextInputLength], newText, newTextLength); + gTextInputLength += newTextLength; gTextInput[gTextInputLength] = 0; } - gTextInputCursorPosition++; + gTextInputCursorPosition += newTextLength; console_refresh_caret(); window_update_textbox(); } @@ -645,6 +656,10 @@ void platform_free() void platform_start_text_input(char* buffer, int max_length) { + // TODO This doesn't work, and position could be improved to where text entry is + SDL_Rect rect = { 10, 10, 100, 100 }; + SDL_SetTextInputRect(&rect); + SDL_StartTextInput(); gTextInputMaxLength = max_length - 1; gTextInput = buffer; diff --git a/src/windows/text_input.c b/src/windows/text_input.c index b2a4388ac8..983f563de8 100644 --- a/src/windows/text_input.c +++ b/src/windows/text_input.c @@ -31,6 +31,7 @@ #include "../interface/window.h" #include "../interface/widget.h" #include "../localisation/localisation.h" +#include "../util/util.h" #define WW 250 #define WH 90 @@ -284,16 +285,18 @@ static void window_text_input_paint(rct_window *w, rct_drawpixelinfo *dpi) int char_count = 0; uint8 cur_drawn = 0; - for (int line = 0; line <= no_lines; ++line){ + int cursorX, cursorY; + for (int line = 0; line <= no_lines; line++) { gfx_draw_string(dpi, wrap_pointer, w->colours[1], w->x + 12, y); int string_length = get_string_size(wrap_pointer) - 1; - if (!cur_drawn && (gTextInputCursorPosition <= char_count + string_length)){ + if (!cur_drawn && (gTextInputCursorPosition <= char_count + string_length)) { // Make a copy of the string for measuring the width. char temp_string[512] = { 0 }; memcpy(temp_string, wrap_pointer, gTextInputCursorPosition - char_count); - int cur_x = w->x + 13 + gfx_get_string_width(temp_string); + cursorX = w->x + 13 + gfx_get_string_width(temp_string); + cursorY = y; int width = 6; if ((uint32)gTextInputCursorPosition < strlen(text_input)){ @@ -306,7 +309,7 @@ static void window_text_input_paint(rct_window *w, rct_drawpixelinfo *dpi) if (w->frame_no > 15){ uint8 colour = RCT2_ADDRESS(0x0141FC48, uint8)[w->colours[1] * 8]; - gfx_fill_rect(dpi, cur_x, y + 9, cur_x + width, y + 9, colour + 5); + gfx_fill_rect(dpi, cursorX, y + 9, cursorX + width, y + 9, colour + 5); } cur_drawn++; @@ -319,6 +322,24 @@ static void window_text_input_paint(rct_window *w, rct_drawpixelinfo *dpi) y += 10; } + + if (!cur_drawn) { + cursorX = gLastDrawStringX; + cursorY = y - 10; + } + + // IME composition + if (gTextInputCompositionActive) { + int compositionWidth = gfx_get_string_width(gTextInputComposition); + int x = cursorX - (compositionWidth / 2); + int y = cursorY + 13; + int w = compositionWidth; + int h = 10; + + gfx_fill_rect(dpi, x - 1, y - 1, x + w + 1, y + h + 1, 12); + gfx_fill_rect(dpi, x, y, x + w, y + h, 0); + gfx_draw_string(dpi, gTextInputComposition, 12, x, y); + } } void window_text_input_key(rct_window* w, int key) From a9e6f8c3db1e1eff5ffee3ce7efd12d5f63654ae Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 29 Jul 2015 02:03:34 +0100 Subject: [PATCH 0414/1173] implement utf8, part 12 --- projects/openrct2.vcxproj | 1 + projects/openrct2.vcxproj.filters | 3 + src/drawing/drawing.h | 4 + src/drawing/scrolling_text.c | 161 ++++++++++++++++++++++++++++++ src/drawing/string.c | 82 ++++++--------- src/interface/viewport.c | 124 ----------------------- src/ride/track.c | 24 +++-- src/ride/track.h | 2 +- src/windows/error.c | 11 +- 9 files changed, 223 insertions(+), 189 deletions(-) create mode 100644 src/drawing/scrolling_text.c diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index efe3e09bcc..495391fc30 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -36,6 +36,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 5a8f3f4179..0c74f0bb5e 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -498,6 +498,9 @@ Source\Localisation + + Source\Drawing + diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 9ed88c96f1..cf0450d3d2 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -144,4 +144,8 @@ void redraw_rain(); // unknown void sub_681DE2(rct_drawpixelinfo *dpi, int x, int y, int image1, int image2); +// scrolling text +void scrolling_text_initialise_bitmaps(); +int scrolling_text_setup(rct_string_id stringId, uint16 scroll, uint16 scrollingMode); + #endif diff --git a/src/drawing/scrolling_text.c b/src/drawing/scrolling_text.c new file mode 100644 index 0000000000..188defc574 --- /dev/null +++ b/src/drawing/scrolling_text.c @@ -0,0 +1,161 @@ +#include "../addresses.h" +#include "../config.h" +#include "../localisation/localisation.h" +#include "drawing.h" + +/* size: 0xA12 */ +typedef struct { + rct_string_id string_id; // 0x00 + uint32 string_args_0; // 0x02 + uint32 string_args_1; // 0x06 + uint16 position; // 0x0A + uint16 mode; // 0x0C + uint32 id; // 0x0E + uint8 bitmap[64 * 8 * 5]; // 0x12 +} rct_draw_scroll_text; + +rct_draw_scroll_text *gDrawScrollTextList = RCT2_ADDRESS(RCT2_ADDRESS_DRAW_SCROLL_LIST, rct_draw_scroll_text); + +void scrolling_text_initialise_bitmaps() +{ + uint8 drawingSurface[64]; + rct_drawpixelinfo dpi = { + .bits = (char*)&drawingSurface, + .x = 0, + .y = 0, + .width = 8, + .height = 8, + .pitch = 0, + .zoom_level = 0 + }; + + + for (int i = 0; i < 224; i++) { + memset(drawingSurface, 0, sizeof(drawingSurface)); + gfx_draw_sprite(&dpi, i + 0x10D5, -1, 0, 0); + + for (int x = 0; x < 8; x++) { + uint8 val = 0; + for (int y = 0; y < 8; y++) { + val >>= 1; + if (dpi.bits[x + y * 8] == 1) { + val |= 0x80; + } + } + RCT2_ADDRESS(RCT2_ADDRESS_CHARACTER_BITMAP, uint8)[i * 8 + x] = val; + } + + } +} + +/** + * + * rct2: 0x006C42D9 + */ +int scrolling_text_setup(rct_string_id stringId, uint16 scroll, uint16 scrollingMode) +{ + rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + + if (dpi->zoom_level != 0) return 0x626; + + RCT2_GLOBAL(RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID, uint32)++; + + // Find the oldest scroll for use as the newest + uint32 oldestId = 0xFFFFFFFF; + uint8 scrollIndex = 0xFF; + rct_draw_scroll_text* oldestScroll = NULL; + for (int i = 0; i < 32; i++) { + rct_draw_scroll_text *scrollText = &gDrawScrollTextList[i]; + if (oldestId >= scrollText->id) { + oldestId = scrollText->id; + scrollIndex = i; + oldestScroll = scrollText; + } + + // If exact match return the matching index + if ( + scrollText->string_id == stringId && + scrollText->string_args_0 == RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) && + scrollText->string_args_1 == RCT2_GLOBAL(0x13CE956, uint32) && + scrollText->position == scroll && + scrollText->mode == scrollingMode + ) { + scrollText->id = RCT2_GLOBAL(RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID, uint32); + return i + 0x606; + } + } + + // Setup scrolling text + rct_draw_scroll_text* scrollText = oldestScroll; + scrollText->string_id = stringId; + scrollText->string_args_0 = RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32); + scrollText->string_args_1 = RCT2_GLOBAL(0x13CE956, uint32); + scrollText->position = scroll; + scrollText->mode = scrollingMode; + scrollText->id = RCT2_GLOBAL(RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID, uint32_t); + + uint8* scrollPixelPointer = scrollText->bitmap; + memset(scrollPixelPointer, 0, 320 * 8); + + // Convert string id back into a string for processing + utf8 scrollString[MAX_PATH]; + if (gConfigGeneral.upper_case_banners) + format_string_to_upper(scrollString, stringId, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + else + format_string(scrollString, stringId, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + + // Setup character colour from ??? + uint32 character = RCT2_GLOBAL(0x13CE959, uint8); + int edi = character & 0x7F; + int offs = 0; + if (character >= 0x80) offs = 2; + uint8 characterColour = RCT2_ADDRESS(0x0141FC47, uint8)[offs + edi * 8]; + + sint16* scrollingModePositions = RCT2_ADDRESS(RCT2_ADDRESS_SCROLLING_MODE_POSITIONS, uint16_t*)[scrollingMode]; + uint8* formatResult = scrollString; + while (true) { + character = utf8_get_next(formatResult, &formatResult); + + // If at the end of the string loop back to the start + if (character == 0) { + formatResult = scrollString; + continue; + } + + // Set any change in colour + if (character <= FORMAT_COLOUR_CODE_END && character >= FORMAT_COLOUR_CODE_START){ + character -= FORMAT_COLOUR_CODE_START; + characterColour = RCT2_GLOBAL(0x009FF048, uint8*)[character * 4]; + continue; + } + + // If another type of control character ignore + if (character < 32) continue; + + // Convert to an indexable character + character = utf8_get_sprite_offset_for_codepoint(character); + + uint8 characterWidth = RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH + 448, uint8)[character]; + uint8* characterBitmap = &(RCT2_ADDRESS(RCT2_ADDRESS_CHARACTER_BITMAP, uint8)[character * 8]); + for (; characterWidth != 0; characterWidth--, characterBitmap++) { + // Skip any none displayed columns + if (scroll != 0){ + scroll--; + continue; + } + + sint16 scrollPosition = *scrollingModePositions; + if (scrollPosition == -1) return scrollIndex + 0x606; + if (scrollPosition > -1) { + uint8* dst = &scrollPixelPointer[scrollPosition]; + for (uint8 char_bitmap = *characterBitmap; char_bitmap != 0; char_bitmap >>= 1){ + if (char_bitmap & 1) *dst = characterColour; + + // Jump to next row + dst += 64; + } + } + scrollingModePositions++; + } + } +} \ No newline at end of file diff --git a/src/drawing/string.c b/src/drawing/string.c index 8c5a1f78e9..46c0e56b46 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -35,6 +35,16 @@ static int _ttfFontOffsetY = 0; static const int TTFFontSizes[] = { 7, 9, 11, 13 }; enum { + FONT_SIZE_TINY = 2, + FONT_SIZE_SMALL = 0, + FONT_SIZE_MEDIUM = 1, + FONT_SIZE_BIG = 3, + FONT_SIZE_COUNT = 4 +}; + +enum { + FONT_SPRITE_GLYPH_COUNT = 224, + FONT_SPRITE_BASE_TINY = 448, FONT_SPRITE_BASE_SMALL = 0, FONT_SPRITE_BASE_MEDIUM = 224, @@ -47,59 +57,30 @@ static uint8 *_spriteFontCharacterWidths = (uint8*)RCT2_ADDRESS_FONT_CHAR_WIDTH; * * rct2: 0x006C19AC */ -void gfx_load_character_widths(){ - - uint8* char_width_pointer = _spriteFontCharacterWidths; - for (int char_set_offset = 0; char_set_offset < 4*0xE0; char_set_offset+=0xE0){ - for (uint8 c = 0; c < 0xE0; c++, char_width_pointer++){ - rct_g1_element g1 = g1Elements[c + SPR_CHAR_START + char_set_offset]; - int width; - - if (char_set_offset == 0xE0*3) width = g1.width + 1; - else width = g1.width - 1; - - if (c >= (FORMAT_ARGUMENT_CODE_START - 0x20) && c < (FORMAT_COLOUR_CODE_END - 0x20)){ +void gfx_load_character_widths() +{ + uint8* pCharacterWidth = _spriteFontCharacterWidths; + for (int fontSize = 0; fontSize < FONT_SIZE_COUNT; fontSize++) { + int glyphOffset = fontSize * FONT_SPRITE_GLYPH_COUNT; + for (uint8 glyphIndex = 0; glyphIndex < FONT_SPRITE_GLYPH_COUNT; glyphIndex++) { + rct_g1_element g1 = g1Elements[glyphIndex + SPR_CHAR_START + glyphOffset]; + + int width = fontSize == FONT_SIZE_BIG ? g1.width + 1 : g1.width - 1; + if (glyphIndex >= (FORMAT_ARGUMENT_CODE_START - 32) && glyphIndex < (FORMAT_COLOUR_CODE_END - 32)) { width = 0; } - *char_width_pointer = (uint8)width; + *pCharacterWidth++ = (uint8)width; } - } - uint8 drawing_surface[0x40]; - rct_drawpixelinfo dpi = { - .bits = (char*)&drawing_surface, - .width = 8, - .height = 8, - .x = 0, - .y = 0, - .pitch = 0, - .zoom_level = 0}; + scrolling_text_initialise_bitmaps(); - - for (int i = 0; i < 0xE0; ++i){ - memset(drawing_surface, 0, sizeof(drawing_surface)); - gfx_draw_sprite(&dpi, i + 0x10D5, -1, 0, 0); - - for (int x = 0; x < 8; ++x){ - uint8 val = 0; - for (int y = 0; y < 8; ++y){ - val >>= 1; - if (dpi.bits[x + y * 8]==1){ - val |= 0x80; - } - } - RCT2_ADDRESS(RCT2_ADDRESS_CHARACTER_BITMAP, uint8)[i * 8 + x] = val; - } - - } - - for (int i = 0; i < 0x20; ++i){ + for (int i = 0; i < 32; i++) { rct_g1_element* g1 = &g1Elements[0x606 + i]; - uint8* unknown_pointer = RCT2_ADDRESS(0x9C3852, uint8) + 0xa12 * i; + uint8* unknown_pointer = RCT2_ADDRESS(0x009C3852, uint8) + 0xA12 * i; g1->offset = unknown_pointer; - g1->width = 0x40; - g1->height = 0x28; + g1->width = 64; + g1->height = 40; *((uint16*)unknown_pointer) = 0xFFFF; *((uint32*)(unknown_pointer + 0x0E)) = 0; } @@ -782,7 +763,7 @@ bool ttf_initialise() } _ttfFontOffsetX = 1; - _ttfFontOffsetY = -3; + _ttfFontOffsetY = -2; _ttfInitialised = true; } return true; @@ -805,6 +786,7 @@ void ttf_dispose() } enum { + TEXT_DRAW_FLAG_INSET = 1 << 0, TEXT_DRAW_FLAG_OUTLINE = 1 << 1, TEXT_DRAW_FLAG_TTF = 1 << 30, TEXT_DRAW_FLAG_NO_DRAW = 1 << 31 @@ -920,8 +902,10 @@ static void ttf_draw_string_raw_ttf(rct_drawpixelinfo *dpi, const utf8 *text, te for (int xx = 0; xx < width; xx++) { if (*src != 0) { *dst = colour; - if (info->flags & TEXT_DRAW_FLAG_OUTLINE) { - *(dst + width + dstScanSkip + 1) = 0; + if (info->flags & TEXT_DRAW_FLAG_INSET) { + *(dst + width + dstScanSkip + 1) = info->palette[3]; + } else if (info->flags & TEXT_DRAW_FLAG_OUTLINE) { + *(dst + width + dstScanSkip + 1) = info->palette[3]; } } src++; @@ -953,7 +937,7 @@ static const utf8 *ttf_process_format_code(rct_drawpixelinfo *dpi, const utf8 *t codepoint = utf8_get_next(text, &nextCh); switch (codepoint) { case FORMAT_MOVE_X: - info->x = info->startX + *nextCh++; + info->x = info->startX + (uint8)(*nextCh++); break; case FORMAT_ADJUST_PALETTE: { diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 90771a2bb2..ef6475f160 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -990,130 +990,6 @@ void sprite_paint_setup(uint16 eax, uint16 ecx){ } } -/* size: 0xA12 */ -typedef struct{ - rct_string_id string_id; // 0x00 - uint32 string_args_0; // 0x02 - uint32 string_args_1; // 0x06 - uint16 position; // 0x0A - uint16 mode; // 0x0C - uint32 id; // 0x0E - uint8 bitmap[64 * 8 * 5];// 0x12 -}rct_draw_scroll_text; - -/*rct2: 0x006C42D9*/ -int scrolling_text_setup(rct_string_id string_id, uint16 scroll, uint16 scrolling_mode) -{ - rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); - - if (dpi->zoom_level != 0) return 0x626; - - RCT2_GLOBAL(RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID, uint32)++; - - uint32 oldest_id = 0xFFFFFFFF; - uint8 scroll_index = 0xFF; - rct_draw_scroll_text* oldest_scroll = NULL; - - // Find the oldest scroll for use as the newest - for (int i = 0; i < 32; i++) - { - rct_draw_scroll_text* scroll_text = &RCT2_ADDRESS(RCT2_ADDRESS_DRAW_SCROLL_LIST, rct_draw_scroll_text)[i]; - if (oldest_id >= scroll_text->id){ - oldest_id = scroll_text->id; - scroll_index = i; - oldest_scroll = scroll_text; - } - - // If exact match return the matching index - if (scroll_text->string_id == string_id && - scroll_text->string_args_0 == RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) && - scroll_text->string_args_1 == RCT2_GLOBAL(0x13CE956, uint32) && - scroll_text->position == scroll && - scroll_text->mode == scrolling_mode){ - - scroll_text->id = RCT2_GLOBAL(RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID, uint32); - return i + 0x606; - } - } - - // Setup scrolling text - - rct_draw_scroll_text* scroll_text = oldest_scroll; - scroll_text->string_id = string_id; - scroll_text->string_args_0 = RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32); - scroll_text->string_args_1 = RCT2_GLOBAL(0x13CE956, uint32); - scroll_text->position = scroll; - scroll_text->mode = scrolling_mode; - scroll_text->id = RCT2_GLOBAL(RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID, uint32_t); - - uint8* scroll_pixel_pointer = scroll_text->bitmap; - memset(scroll_pixel_pointer, 0, 320 * 8); - - // Convert string id back into a string for processing - uint8 scroll_string[MAX_PATH]; - if(gConfigGeneral.upper_case_banners) - format_string_to_upper(scroll_string, string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); - else - format_string(scroll_string, string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); - - // Setup character colour from ??? - uint8 character = RCT2_GLOBAL(0x13CE959, uint8); - int edi = character & 0x7F; - int offs = 0; - if (character >= 0x80) offs = 2; - uint8 character_colour = RCT2_ADDRESS(0x0141FC47, uint8)[offs + edi * 8]; - - sint16* scrolling_mode_positions = RCT2_ADDRESS(RCT2_ADDRESS_SCROLLING_MODE_POSITIONS, uint16_t*)[scrolling_mode]; - uint8* format_result = scroll_string; - while (true) - { - character = *format_result++; - - // If at the end of the string loop back to the start - if (character == 0){ - format_result = scroll_string; - continue; - } - - // Set any change in colour - if (character <= FORMAT_COLOUR_CODE_END && character >= FORMAT_COLOUR_CODE_START){ - character -= FORMAT_COLOUR_CODE_START; - character_colour = RCT2_GLOBAL(0x9FF048, uint8*)[character * 4]; - continue; - } - - // If another type of control character ignore - if (character < 0x20) continue; - - // Convert to an indexable character - character -= 0x20; - - uint8 character_width = RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH + 0x1C0, uint8)[character]; - uint8* character_bitmap = &(RCT2_ADDRESS(RCT2_ADDRESS_CHARACTER_BITMAP, uint8)[character * 8]); - for (; character_width != 0;character_width--,character_bitmap++) - { - // Skip any none displayed columns - if (scroll != 0){ - scroll--; - continue; - } - - sint16 scroll_position = *scrolling_mode_positions; - if (scroll_position == -1) return scroll_index + 0x606; - if (scroll_position > -1) - { - uint8* dst = &scroll_pixel_pointer[scroll_position]; - for (uint8 char_bitmap = *character_bitmap; char_bitmap != 0; char_bitmap >>= 1){ - if (char_bitmap & 1) *dst = character_colour; - // Jump to next row - dst += 64; - } - } - scrolling_mode_positions++; - } - } -} - /* rct2: 0x006629BC * returns al * ebp : image_id diff --git a/src/ride/track.c b/src/ride/track.c index d8fe740f24..acb55157ec 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3111,20 +3111,24 @@ rct_track_design *temp_track_get_info(char* path, uint8** preview) return trackDesign; } -void window_track_list_format_name(char *dst, const char *src, char colour, char quotes) +void window_track_list_format_name(utf8 *dst, const utf8 *src, int colour, bool quotes) { - if (colour != 0) - *dst++ = colour; + const utf8 *ch; + int codepoint; - if (quotes != 0) - *dst++ = FORMAT_OPENQUOTES; - - while (*src != '.' && *src != 0) { - *dst++ = *src++; + if (colour != 0) { + dst = utf8_write_codepoint(dst, colour); } - if (quotes != 0) - *dst++ = FORMAT_ENDQUOTES; + if (quotes) dst = utf8_write_codepoint(dst, FORMAT_OPENQUOTES); + + ch = src; + while ((codepoint = utf8_get_next(ch, &ch)) != 0) { + if (codepoint == '.') break; + dst = utf8_write_codepoint(dst, codepoint); + } + + if (quotes) dst = utf8_write_codepoint(dst, FORMAT_ENDQUOTES); *dst = 0; } diff --git a/src/ride/track.h b/src/ride/track.h index 241fad4a65..622aca98b3 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -512,7 +512,7 @@ int track_is_connected_by_shape(rct_map_element *a, rct_map_element *b); int sub_6D01B3(uint8 bl, uint8 rideIndex, int x, int y, int z); int save_track_design(uint8 rideIndex); int install_track(char* source_path, char* dest_name); -void window_track_list_format_name(char *dst, const char *src, char colour, char quotes); +void window_track_list_format_name(utf8 *dst, const utf8 *src, int colour, bool quotes); void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void track_save_reset_scenery(); diff --git a/src/windows/error.c b/src/windows/error.c index 3a1b232952..90576f6b61 100644 --- a/src/windows/error.c +++ b/src/windows/error.c @@ -80,7 +80,8 @@ static uint16 _window_error_num_lines; */ void window_error_open(rct_string_id title, rct_string_id message) { - char *dst, *args; + utf8 *dst; + char *args; int numLines, fontHeight, x, y, width, height, maxY; rct_window *w; @@ -89,17 +90,17 @@ void window_error_open(rct_string_id title, rct_string_id message) args = (char*)0x0013CE952; // Format the title - *dst++ = FORMAT_BLACK; + dst = utf8_write_codepoint(dst, FORMAT_BLACK); if (title != (rct_string_id)STR_NONE) { format_string(dst, title, args); - dst += get_string_size(dst) - 1; + dst = get_string_end(dst); } // Format the message if (message != (rct_string_id)STR_NONE) { - *dst++ = FORMAT_NEWLINE; + dst = utf8_write_codepoint(dst, FORMAT_NEWLINE); format_string(dst, message, args); - dst += get_string_size(dst) - 1; + dst = get_string_end(dst); } log_verbose("show error, %s", _window_error_text + 1); From 617880e8d2c9bd9cdb398d299927bcb2433d9f75 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 29 Jul 2015 03:06:51 +0100 Subject: [PATCH 0415/1173] implement utf8, part 13 --- src/drawing/string.c | 221 +++++++++++++++++++++++++++++++++++++------ src/rct2.c | 4 + src/rct2.h | 2 + 3 files changed, 199 insertions(+), 28 deletions(-) diff --git a/src/drawing/string.c b/src/drawing/string.c index 46c0e56b46..e930480be5 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -34,6 +34,33 @@ static int _ttfFontOffsetY = 0; static const int TTFFontSizes[] = { 7, 9, 11, 13 }; +#define TTF_SURFACE_CACHE_SIZE 256 +#define TTF_GETWIDTH_CACHE_SIZE 1024 + +typedef struct { + SDL_Surface *surface; + TTF_Font *font; + utf8 *text; + uint32 lastUseTick; +} ttf_cache_entry; + +static ttf_cache_entry _ttfSurfaceCache[TTF_SURFACE_CACHE_SIZE] = { 0 }; +static int _ttfSurfaceCacheCount = 0; +static int _ttfSurfaceCacheHitCount = 0; +static int _ttfSurfaceCacheMissCount = 0; + +typedef struct { + uint32 width; + TTF_Font *font; + utf8 *text; + uint32 lastUseTick; +} ttf_getwidth_cache_entry; + +static ttf_getwidth_cache_entry _ttfGetWidthCache[TTF_GETWIDTH_CACHE_SIZE] = { 0 }; +static int _ttfGetWidthCacheCount = 0; +static int _ttfGetWidthCacheHitCount = 0; +static int _ttfGetWidthCacheMissCount = 0; + enum { FONT_SIZE_TINY = 2, FONT_SIZE_SMALL = 0, @@ -746,6 +773,144 @@ void sub_6C1F57(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct ); } +static uint32 _ttf_surface_cache_hash(TTF_Font *font, const utf8 *text) +{ + uint32 hash = ((uint32)font * 23) ^ 0xAAAAAAAA; + for (const uint8 *ch = text; *ch != 0; ch++) { + hash = ror32(hash, 3) ^ (*ch * 13); + } + return hash; +} + +static void _ttf_surface_cache_dispose(ttf_cache_entry *entry) +{ + if (entry->surface != NULL) { + SDL_FreeSurface(entry->surface); + free(entry->text); + + entry->surface = NULL; + entry->font = NULL; + entry->text = NULL; + } +} + +static void _ttf_surface_cache_dispose_all() +{ + for (int i = 0; i < TTF_SURFACE_CACHE_SIZE; i++) { + _ttf_surface_cache_dispose(&_ttfSurfaceCache[i]); + _ttfSurfaceCacheCount--; + } +} + +static SDL_Surface *_ttf_surface_cache_get_or_add(TTF_Font *font, const utf8 *text) +{ + ttf_cache_entry *entry; + + uint32 hash = _ttf_surface_cache_hash(font, text); + int index = hash % TTF_SURFACE_CACHE_SIZE; + for (int i = 0; i < TTF_SURFACE_CACHE_SIZE; i++) { + entry = &_ttfSurfaceCache[index]; + + // Check if entry is a hit + if (entry->surface == NULL) break; + if (entry->font == font && strcmp(entry->text, text) == 0) { + _ttfSurfaceCacheHitCount++; + entry->lastUseTick = gCurrentDrawCount; + return entry->surface; + } + + // If entry hasn't been used for a while, replace it + if (entry->lastUseTick < gCurrentDrawCount - 64) { + break; + } + + // Check if next entry is a hit + if (++index >= TTF_SURFACE_CACHE_SIZE) index = 0; + } + + // Cache miss, replace entry with new surface + entry = &_ttfSurfaceCache[index]; + _ttf_surface_cache_dispose(entry); + + SDL_Color c = { 0, 0, 0, 255 }; + SDL_Surface *surface = TTF_RenderUTF8_Solid(font, text, c); + if (surface == NULL) { + return NULL; + } + + _ttfSurfaceCacheMissCount++; + // printf("CACHE HITS: %d MISSES: %d)\n", _ttfSurfaceCacheHitCount, _ttfSurfaceCacheMissCount); + + _ttfSurfaceCacheCount++; + entry->surface = surface; + entry->font = font; + entry->text = _strdup(text); + entry->lastUseTick = gCurrentDrawCount; + return entry->surface; +} + +static void _ttf_getwidth_cache_dispose(ttf_getwidth_cache_entry *entry) +{ + if (entry->text != NULL) { + free(entry->text); + + entry->width = 0; + entry->font = NULL; + entry->text = NULL; + } +} + +static void _ttf_getwidth_cache_dispose_all() +{ + for (int i = 0; i < TTF_GETWIDTH_CACHE_SIZE; i++) { + _ttf_getwidth_cache_dispose(&_ttfGetWidthCache[i]); + _ttfGetWidthCacheCount--; + } +} + +static uint32 _ttf_getwidth_cache_get_or_add(TTF_Font *font, const utf8 *text) +{ + ttf_getwidth_cache_entry *entry; + + uint32 hash = _ttf_surface_cache_hash(font, text); + int index = hash % TTF_GETWIDTH_CACHE_SIZE; + for (int i = 0; i < TTF_GETWIDTH_CACHE_SIZE; i++) { + entry = &_ttfGetWidthCache[index]; + + // Check if entry is a hit + if (entry->text == NULL) break; + if (entry->font == font && strcmp(entry->text, text) == 0) { + _ttfGetWidthCacheHitCount++; + entry->lastUseTick = gCurrentDrawCount; + return entry->width; + } + + // If entry hasn't been used for a while, replace it + if (entry->lastUseTick < gCurrentDrawCount - 64) { + break; + } + + // Check if next entry is a hit + if (++index >= TTF_GETWIDTH_CACHE_SIZE) index = 0; + } + + // Cache miss, replace entry with new width + entry = &_ttfGetWidthCache[index]; + _ttf_getwidth_cache_dispose(entry); + + int width, height; + TTF_SizeUTF8(font, text, &width, &height); + + _ttfGetWidthCacheMissCount++; + + _ttfGetWidthCacheCount++; + entry->width = width; + entry->font = font; + entry->text = _strdup(text); + entry->lastUseTick = gCurrentDrawCount; + return entry->width; +} + bool ttf_initialise() { if (!_ttfInitialised) { @@ -774,6 +939,9 @@ void ttf_dispose() if (!_ttfInitialised) return; + _ttf_surface_cache_dispose_all(); + _ttf_getwidth_cache_dispose_all(); + if (_ttfFont != NULL) { for (int i = 0; i < 4; i++) { TTF_CloseFont(_ttfFont[i]); @@ -785,6 +953,21 @@ void ttf_dispose() _ttfInitialised = false; } +TTF_Font *ttf_get_font_from_sprite_base(uint16 spriteBase) +{ + switch (spriteBase) { + case FONT_SPRITE_BASE_TINY: + return _ttfFont[0]; + case FONT_SPRITE_BASE_SMALL: + return _ttfFont[1]; + default: + case FONT_SPRITE_BASE_MEDIUM: + return _ttfFont[2]; + case FONT_SPRITE_BASE_BIG: + return _ttfFont[3]; + } +} + enum { TEXT_DRAW_FLAG_INSET = 1 << 0, TEXT_DRAW_FLAG_OUTLINE = 1 << 1, @@ -831,39 +1014,20 @@ static void ttf_draw_string_raw_ttf(rct_drawpixelinfo *dpi, const utf8 *text, te if (!_ttfInitialised && !ttf_initialise()) return; - TTF_Font *font; - switch (info->font_sprite_base) { - case FONT_SPRITE_BASE_TINY: - font = _ttfFont[0]; - break; - case FONT_SPRITE_BASE_SMALL: - font = _ttfFont[1]; - break; - default: - case FONT_SPRITE_BASE_MEDIUM: - font = _ttfFont[2]; - break; - case FONT_SPRITE_BASE_BIG: - font = _ttfFont[3]; - break; - } - + TTF_Font *font = ttf_get_font_from_sprite_base(info->font_sprite_base); if (info->flags & TEXT_DRAW_FLAG_NO_DRAW) { - int width, height; - - TTF_SizeUTF8(font, text, &width, &height); - info->x += width; + info->x += _ttf_getwidth_cache_get_or_add(font, text); return; } else { uint8 colour = info->palette[1]; - SDL_Color c = { 0, 0, 0, 255 }; - SDL_Surface *surface = TTF_RenderUTF8_Solid(font, text, c); + SDL_Surface *surface = _ttf_surface_cache_get_or_add(font, text); if (surface == NULL) return; - if (SDL_LockSurface(surface) != 0) { - SDL_FreeSurface(surface); - return; + if (SDL_MUSTLOCK(surface)) { + if (SDL_LockSurface(surface) != 0) { + return; + } } int drawX = info->x + _ttfFontOffsetX; @@ -914,9 +1078,10 @@ static void ttf_draw_string_raw_ttf(rct_drawpixelinfo *dpi, const utf8 *text, te src += srcScanSkip; dst += dstScanSkip; } - SDL_UnlockSurface(surface); - SDL_FreeSurface(surface); + if (SDL_MUSTLOCK(surface)) { + SDL_UnlockSurface(surface); + } } } diff --git a/src/rct2.c b/src/rct2.c index a41de22853..1294860c2b 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -51,6 +51,8 @@ #include "world/scenery.h" #include "world/sprite.h" +uint32 gCurrentDrawCount = 0; + typedef struct tm tm_t; void print_launch_information(); @@ -236,6 +238,8 @@ void rct2_draw() } else { //game } + + gCurrentDrawCount++; } int rct2_open_file(const char *path) diff --git a/src/rct2.h b/src/rct2.h index 5e352d01e3..c1279de446 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -286,6 +286,8 @@ static const struct file_to_check { PATH_ID_END, 0 } }; +extern uint32 gCurrentDrawCount; + int rct2_init(); void rct2_update(); void rct2_draw(); From fa87d8e9997809279ba9fd6f78e3e051bdc33648 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 29 Jul 2015 14:36:21 +0100 Subject: [PATCH 0416/1173] implement utf8, part 14 --- projects/openrct2.vcxproj | 2 + projects/openrct2.vcxproj.filters | 6 + src/drawing/drawing.h | 2 +- src/drawing/font.c | 94 ++++++++++++++ src/drawing/font.h | 28 ++++ src/drawing/scrolling_text.c | 209 +++++++++++++++++++++++------- src/drawing/string.c | 68 ++-------- src/localisation/language.c | 26 ++++ src/localisation/language.h | 2 + src/localisation/localisation.c | 44 ------- src/localisation/localisation.h | 2 +- src/rct2.c | 2 +- src/windows/banner.c | 32 ++--- src/windows/text_input.c | 2 + 14 files changed, 346 insertions(+), 173 deletions(-) create mode 100644 src/drawing/font.c create mode 100644 src/drawing/font.h diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 495391fc30..3108569a3c 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -33,6 +33,7 @@ + @@ -195,6 +196,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 0c74f0bb5e..a714ad89d1 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -501,6 +501,9 @@ Source\Drawing + + Source\Drawing + @@ -731,5 +734,8 @@ Source + + Source\Drawing + \ No newline at end of file diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index cf0450d3d2..83f5fa864c 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -22,6 +22,7 @@ #define _DRAWING_H_ #include "../common.h" +#include "font.h" // Size: 0x10 typedef struct { @@ -113,7 +114,6 @@ void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint32 void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint8* palette_pointer, uint8* unknown_pointer); // string -void gfx_load_character_widths(); int clip_text(char *buffer, int width); int gfx_wrap_string(char* buffer, int width, int* num_lines, int* font_height); int gfx_get_string_width(char *buffer); diff --git a/src/drawing/font.c b/src/drawing/font.c new file mode 100644 index 0000000000..39c19f1a5d --- /dev/null +++ b/src/drawing/font.c @@ -0,0 +1,94 @@ +#include "../addresses.h" +#include "../localisation/localisation.h" +#include "../sprites.h" +#include "drawing.h" +#include "font.h" + +static uint8 *_spriteFontCharacterWidths = (uint8*)RCT2_ADDRESS_FONT_CHAR_WIDTH; + +/** + * + * rct2: 0x006C19AC + */ +void font_sprite_initialise_characters() +{ + uint8* pCharacterWidth = _spriteFontCharacterWidths; + for (int fontSize = 0; fontSize < FONT_SIZE_COUNT; fontSize++) { + int glyphOffset = fontSize * FONT_SPRITE_GLYPH_COUNT; + for (uint8 glyphIndex = 0; glyphIndex < FONT_SPRITE_GLYPH_COUNT; glyphIndex++) { + rct_g1_element g1 = g1Elements[glyphIndex + SPR_CHAR_START + glyphOffset]; + + int width = fontSize == FONT_SIZE_BIG ? g1.width + 1 : g1.width - 1; + if (glyphIndex >= (FORMAT_ARGUMENT_CODE_START - 32) && glyphIndex < (FORMAT_COLOUR_CODE_END - 32)) { + width = 0; + } + *pCharacterWidth++ = (uint8)width; + } + } + + scrolling_text_initialise_bitmaps(); + + for (int i = 0; i < 32; i++) { + rct_g1_element* g1 = &g1Elements[0x606 + i]; + uint8* unknown_pointer = RCT2_ADDRESS(0x009C3852, uint8) + 0xA12 * i; + g1->offset = unknown_pointer; + g1->width = 64; + g1->height = 40; + *((uint16*)unknown_pointer) = 0xFFFF; + *((uint32*)(unknown_pointer + 0x0E)) = 0; + } +} + +int font_sprite_get_codepoint_offset(int codepoint) +{ + switch (codepoint) { + case FORMAT_ENDQUOTES: return 34 - 32; + + case FORMAT_AMINUSCULE: return 159 - 32; + case FORMAT_UP: return 160 - 32; + case FORMAT_SYMBOL_i: return 160 - 32; + case FORMAT_CENT: return 162 - 32; + case FORMAT_POUND: return 163 - 32; + + case FORMAT_YEN: return 165 - 32; + + + + case FORMAT_COPYRIGHT: return 169 - 32; + case FORMAT_DOWN: return 170 - 32; + case FORMAT_LEFTGUILLEMET: return 171 - 32; + case FORMAT_TICK: return 172 - 32; + case FORMAT_CROSS: return 173 - 32; + + case FORMAT_RIGHT: return 175 - 32; + case FORMAT_DEGREE: return 176 - 32; + case FORMAT_SYMBOL_RAILWAY: return 177 - 32; + case FORMAT_SQUARED: return 178 - 32; + + case FORMAT_OPENQUOTES: return 180 - 32; + case FORMAT_EURO: return 181 - 32; + case FORMAT_SYMBOL_ROAD: return 182 - 32; + case FORMAT_SYMBOL_FLAG: return 183 - 32; + case FORMAT_APPROX: return 184 - 32; + case FORMAT_POWERNEGATIVEONE: return 185 - 32; + case FORMAT_BULLET: return 186 - 32; + case FORMAT_RIGHTGUILLEMET: return 187 - 32; + case FORMAT_SMALLUP: return 188 - 32; + case FORMAT_SMALLDOWN: return 189 - 32; + case FORMAT_LEFT: return 190 - 32; + case FORMAT_INVERTEDQUESTION: return 191 - 32; + default: + if (codepoint < 32 || codepoint >= 256) codepoint = '?'; + return codepoint - 32; + } +} + +int font_sprite_get_codepoint_width(int fontSpriteBase, int codepoint) +{ + return _spriteFontCharacterWidths[fontSpriteBase + font_sprite_get_codepoint_offset(codepoint)]; +} + +int font_sprite_get_codepoint_sprite(int fontSpriteBase, int codepoint) +{ + return SPR_CHAR_START + ((IMAGE_TYPE_USE_PALETTE << 28) | (fontSpriteBase + font_sprite_get_codepoint_offset(codepoint))); +} diff --git a/src/drawing/font.h b/src/drawing/font.h new file mode 100644 index 0000000000..33fd8345e8 --- /dev/null +++ b/src/drawing/font.h @@ -0,0 +1,28 @@ +#ifndef _DRAWING_FONT_H_ +#define _DRAWING_FONT_H_ + +#include "../common.h" + +enum { + FONT_SIZE_TINY = 2, + FONT_SIZE_SMALL = 0, + FONT_SIZE_MEDIUM = 1, + FONT_SIZE_BIG = 3, + FONT_SIZE_COUNT = 4 +}; + +enum { + FONT_SPRITE_GLYPH_COUNT = 224, + + FONT_SPRITE_BASE_TINY = 448, + FONT_SPRITE_BASE_SMALL = 0, + FONT_SPRITE_BASE_MEDIUM = 224, + FONT_SPRITE_BASE_BIG = 672 +}; + +void font_sprite_initialise_characters(); +int font_sprite_get_codepoint_offset(int codepoint); +int font_sprite_get_codepoint_width(int fontSpriteBase, int codepoint); +int font_sprite_get_codepoint_sprite(int fontSpriteBase, int codepoint); + +#endif \ No newline at end of file diff --git a/src/drawing/scrolling_text.c b/src/drawing/scrolling_text.c index 188defc574..4b421b9e5d 100644 --- a/src/drawing/scrolling_text.c +++ b/src/drawing/scrolling_text.c @@ -1,3 +1,4 @@ +#include #include "../addresses.h" #include "../config.h" #include "../localisation/localisation.h" @@ -15,6 +16,10 @@ typedef struct { } rct_draw_scroll_text; rct_draw_scroll_text *gDrawScrollTextList = RCT2_ADDRESS(RCT2_ADDRESS_DRAW_SCROLL_LIST, rct_draw_scroll_text); +uint8 *gCharacterBitmaps = RCT2_ADDRESS(RCT2_ADDRESS_CHARACTER_BITMAP, uint8); + +void scrolling_text_set_bitmap_for_sprite(utf8 *text, int scroll, uint8 *bitmap, sint16 *scrollPositionOffsets); +void scrolling_text_set_bitmap_for_ttf(utf8 *text, int scroll, uint8 *bitmap, sint16 *scrollPositionOffsets); void scrolling_text_initialise_bitmaps() { @@ -42,27 +47,22 @@ void scrolling_text_initialise_bitmaps() val |= 0x80; } } - RCT2_ADDRESS(RCT2_ADDRESS_CHARACTER_BITMAP, uint8)[i * 8 + x] = val; + gCharacterBitmaps[i * 8 + x] = val; } } } -/** - * - * rct2: 0x006C42D9 - */ -int scrolling_text_setup(rct_string_id stringId, uint16 scroll, uint16 scrollingMode) +static uint8 *font_sprite_get_codepoint_bitmap(int codepoint) { - rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + return &gCharacterBitmaps[font_sprite_get_codepoint_offset(codepoint) * 8]; +} - if (dpi->zoom_level != 0) return 0x626; - RCT2_GLOBAL(RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID, uint32)++; - - // Find the oldest scroll for use as the newest +static int scrolling_text_get_matching_or_oldest(rct_string_id stringId, uint16 scroll, uint16 scrollingMode) +{ uint32 oldestId = 0xFFFFFFFF; - uint8 scrollIndex = 0xFF; + int scrollIndex = -1; rct_draw_scroll_text* oldestScroll = NULL; for (int i = 0; i < 32; i++) { rct_draw_scroll_text *scrollText = &gDrawScrollTextList[i]; @@ -84,70 +84,103 @@ int scrolling_text_setup(rct_string_id stringId, uint16 scroll, uint16 scrolling return i + 0x606; } } + return scrollIndex; +} + +static uint8 scrolling_text_get_colour(uint32 character) +{ + int edi = character & 0x7F; + int offset = 0; + if (character >= 0x80) offset = 2; + return RCT2_ADDRESS(0x0141FC47, uint8)[offset + (edi * 8)]; +} + +static void scrolling_text_format(utf8 *dst, rct_draw_scroll_text *scrollText) +{ + if (gConfigGeneral.upper_case_banners) { + format_string_to_upper(dst, scrollText->string_id, &scrollText->string_args_0); + } else { + format_string(dst, scrollText->string_id, &scrollText->string_args_0); + } +} + +/** + * + * rct2: 0x006C42D9 + */ +int scrolling_text_setup(rct_string_id stringId, uint16 scroll, uint16 scrollingMode) +{ + rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + + if (dpi->zoom_level != 0) return 0x626; + + RCT2_GLOBAL(RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID, uint32)++; + + int scrollIndex = scrolling_text_get_matching_or_oldest(stringId, scroll, scrollingMode); + if (scrollIndex >= 0x606) return scrollIndex; // Setup scrolling text - rct_draw_scroll_text* scrollText = oldestScroll; + rct_draw_scroll_text* scrollText = &gDrawScrollTextList[scrollIndex]; scrollText->string_id = stringId; - scrollText->string_args_0 = RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32); - scrollText->string_args_1 = RCT2_GLOBAL(0x13CE956, uint32); + scrollText->string_args_0 = RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32); + scrollText->string_args_1 = RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 4, uint32); scrollText->position = scroll; scrollText->mode = scrollingMode; - scrollText->id = RCT2_GLOBAL(RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID, uint32_t); + scrollText->id = RCT2_GLOBAL(RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID, uint32); - uint8* scrollPixelPointer = scrollText->bitmap; - memset(scrollPixelPointer, 0, 320 * 8); + // Create the string to draw + utf8 scrollString[256]; + scrolling_text_format(scrollString, scrollText); - // Convert string id back into a string for processing - utf8 scrollString[MAX_PATH]; - if (gConfigGeneral.upper_case_banners) - format_string_to_upper(scrollString, stringId, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); - else - format_string(scrollString, stringId, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + sint16* scrollingModePositions = RCT2_ADDRESS(RCT2_ADDRESS_SCROLLING_MODE_POSITIONS, uint16*)[scrollingMode]; + + memset(scrollText->bitmap, 0, 320 * 8); + if (gUseTrueTypeFont) { + scrolling_text_set_bitmap_for_ttf(scrollString, scroll, scrollText->bitmap, scrollingModePositions); + } else { + scrolling_text_set_bitmap_for_sprite(scrollString, scroll, scrollText->bitmap, scrollingModePositions); + } - // Setup character colour from ??? - uint32 character = RCT2_GLOBAL(0x13CE959, uint8); - int edi = character & 0x7F; - int offs = 0; - if (character >= 0x80) offs = 2; - uint8 characterColour = RCT2_ADDRESS(0x0141FC47, uint8)[offs + edi * 8]; + return scrollIndex + 0x606; +} - sint16* scrollingModePositions = RCT2_ADDRESS(RCT2_ADDRESS_SCROLLING_MODE_POSITIONS, uint16_t*)[scrollingMode]; - uint8* formatResult = scrollString; +void scrolling_text_set_bitmap_for_sprite(utf8 *text, int scroll, uint8 *bitmap, sint16 *scrollPositionOffsets) +{ + uint8 characterColour = scrolling_text_get_colour(RCT2_GLOBAL(0x013CE959, uint8)); + + utf8 *ch = text; while (true) { - character = utf8_get_next(formatResult, &formatResult); + uint32 codepoint = utf8_get_next(ch, &ch); // If at the end of the string loop back to the start - if (character == 0) { - formatResult = scrollString; + if (codepoint == 0) { + ch = text; continue; } // Set any change in colour - if (character <= FORMAT_COLOUR_CODE_END && character >= FORMAT_COLOUR_CODE_START){ - character -= FORMAT_COLOUR_CODE_START; - characterColour = RCT2_GLOBAL(0x009FF048, uint8*)[character * 4]; + if (codepoint <= FORMAT_COLOUR_CODE_END && codepoint >= FORMAT_COLOUR_CODE_START){ + codepoint -= FORMAT_COLOUR_CODE_START; + characterColour = RCT2_GLOBAL(0x009FF048, uint8*)[codepoint * 4]; continue; } // If another type of control character ignore - if (character < 32) continue; + if (codepoint < 32) continue; - // Convert to an indexable character - character = utf8_get_sprite_offset_for_codepoint(character); - - uint8 characterWidth = RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH + 448, uint8)[character]; - uint8* characterBitmap = &(RCT2_ADDRESS(RCT2_ADDRESS_CHARACTER_BITMAP, uint8)[character * 8]); + int characterWidth = font_sprite_get_codepoint_width(FONT_SPRITE_BASE_TINY, codepoint); + uint8 *characterBitmap = font_sprite_get_codepoint_bitmap(codepoint); for (; characterWidth != 0; characterWidth--, characterBitmap++) { // Skip any none displayed columns - if (scroll != 0){ + if (scroll != 0) { scroll--; continue; } - sint16 scrollPosition = *scrollingModePositions; - if (scrollPosition == -1) return scrollIndex + 0x606; + sint16 scrollPosition = *scrollPositionOffsets; + if (scrollPosition == -1) return; if (scrollPosition > -1) { - uint8* dst = &scrollPixelPointer[scrollPosition]; + uint8 *dst = &bitmap[scrollPosition]; for (uint8 char_bitmap = *characterBitmap; char_bitmap != 0; char_bitmap >>= 1){ if (char_bitmap & 1) *dst = characterColour; @@ -155,7 +188,83 @@ int scrolling_text_setup(rct_string_id stringId, uint16 scroll, uint16 scrolling dst += 64; } } - scrollingModePositions++; + scrollPositionOffsets++; } } -} \ No newline at end of file +} + +TTF_Font *ttf_get_font_from_sprite_base(uint16 spriteBase); +SDL_Surface *_ttf_surface_cache_get_or_add(TTF_Font *font, const utf8 *text); + +void scrolling_text_set_bitmap_for_ttf(utf8 *text, int scroll, uint8 *bitmap, sint16 *scrollPositionOffsets) +{ + // Currently only supports one colour + uint8 colour = 0; + + utf8 *dstCh = text; + utf8 *ch = text; + int codepoint; + while ((codepoint = utf8_get_next(ch, &ch)) != 0) { + if (utf8_is_format_code(codepoint)) { + if (colour == 0 && codepoint >= FORMAT_COLOUR_CODE_START && codepoint <= FORMAT_COLOUR_CODE_END) { + colour = (uint8)codepoint; + } + } else { + dstCh = utf8_write_codepoint(dstCh, codepoint); + } + } + *dstCh = 0; + + if (colour == 0) { + colour = scrolling_text_get_colour(RCT2_GLOBAL(0x013CE959, uint8)); + } else { + colour = RCT2_GLOBAL(0x009FF048, uint8*)[(colour - FORMAT_COLOUR_CODE_START) * 4]; + } + + TTF_Font *font = ttf_get_font_from_sprite_base(FONT_SPRITE_BASE_TINY); + SDL_Surface *surface = _ttf_surface_cache_get_or_add(font, text); + if (surface == NULL) { + return; + } + + if (SDL_MUSTLOCK(surface) && SDL_LockSurface(surface) == -1) { + return; + } + + int pitch = surface->pitch; + int width = surface->w; + int height = surface->h; + uint8 *src = surface->pixels; + + // Offset + height -= 3; + src += 3 * pitch; + height = min(height, 8); + + int x = 0; + while (true) { + // Skip any none displayed columns + if (scroll == 0) { + sint16 scrollPosition = *scrollPositionOffsets; + if (scrollPosition == -1) return; + if (scrollPosition > -1) { + uint8 *dst = &bitmap[scrollPosition]; + + for (int y = 0; y < height; y++) { + if (src[y * pitch + x] != 0) *dst = colour; + + // Jump to next row + dst += 64; + } + } + scrollPositionOffsets++; + } else { + scroll--; + } + + x++; + if (x >= width) x = 0; + } + + if (SDL_MUSTLOCK(surface)) SDL_UnlockSurface(surface); +} diff --git a/src/drawing/string.c b/src/drawing/string.c index e930480be5..2422155d54 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -29,10 +29,10 @@ static void ttf_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, in static bool _ttfInitialised = false; static TTF_Font *_ttfFont[4] = { NULL }; -static int _ttfFontOffsetX = 0; -static int _ttfFontOffsetY = 0; +int _ttfFontOffsetX = 0; +int _ttfFontOffsetY = 0; -static const int TTFFontSizes[] = { 7, 9, 11, 13 }; +static const int TTFFontSizes[] = { 9, 9, 11, 13 }; #define TTF_SURFACE_CACHE_SIZE 256 #define TTF_GETWIDTH_CACHE_SIZE 1024 @@ -61,58 +61,6 @@ static int _ttfGetWidthCacheCount = 0; static int _ttfGetWidthCacheHitCount = 0; static int _ttfGetWidthCacheMissCount = 0; -enum { - FONT_SIZE_TINY = 2, - FONT_SIZE_SMALL = 0, - FONT_SIZE_MEDIUM = 1, - FONT_SIZE_BIG = 3, - FONT_SIZE_COUNT = 4 -}; - -enum { - FONT_SPRITE_GLYPH_COUNT = 224, - - FONT_SPRITE_BASE_TINY = 448, - FONT_SPRITE_BASE_SMALL = 0, - FONT_SPRITE_BASE_MEDIUM = 224, - FONT_SPRITE_BASE_BIG = 672 -}; - -static uint8 *_spriteFontCharacterWidths = (uint8*)RCT2_ADDRESS_FONT_CHAR_WIDTH; - -/** - * - * rct2: 0x006C19AC - */ -void gfx_load_character_widths() -{ - uint8* pCharacterWidth = _spriteFontCharacterWidths; - for (int fontSize = 0; fontSize < FONT_SIZE_COUNT; fontSize++) { - int glyphOffset = fontSize * FONT_SPRITE_GLYPH_COUNT; - for (uint8 glyphIndex = 0; glyphIndex < FONT_SPRITE_GLYPH_COUNT; glyphIndex++) { - rct_g1_element g1 = g1Elements[glyphIndex + SPR_CHAR_START + glyphOffset]; - - int width = fontSize == FONT_SIZE_BIG ? g1.width + 1 : g1.width - 1; - if (glyphIndex >= (FORMAT_ARGUMENT_CODE_START - 32) && glyphIndex < (FORMAT_COLOUR_CODE_END - 32)) { - width = 0; - } - *pCharacterWidth++ = (uint8)width; - } - } - - scrolling_text_initialise_bitmaps(); - - for (int i = 0; i < 32; i++) { - rct_g1_element* g1 = &g1Elements[0x606 + i]; - uint8* unknown_pointer = RCT2_ADDRESS(0x009C3852, uint8) + 0xA12 * i; - g1->offset = unknown_pointer; - g1->width = 64; - g1->height = 40; - *((uint16*)unknown_pointer) = 0xFFFF; - *((uint32*)(unknown_pointer + 0x0E)) = 0; - } -} - /** * * rct2: 0x006C23B1 @@ -802,7 +750,7 @@ static void _ttf_surface_cache_dispose_all() } } -static SDL_Surface *_ttf_surface_cache_get_or_add(TTF_Font *font, const utf8 *text) +SDL_Surface *_ttf_surface_cache_get_or_add(TTF_Font *font, const utf8 *text) { ttf_cache_entry *entry; @@ -987,16 +935,16 @@ typedef struct { static void ttf_draw_character_sprite(rct_drawpixelinfo *dpi, int codepoint, text_draw_info *info) { - uint32 charOffset = info->font_sprite_base + utf8_get_sprite_offset_for_codepoint(codepoint); - int charWidth = _spriteFontCharacterWidths[charOffset] & 0xFF; + int characterWidth = font_sprite_get_codepoint_width(info->font_sprite_base, codepoint); + int sprite = font_sprite_get_codepoint_sprite(info->font_sprite_base, codepoint); if (!(info->flags & TEXT_DRAW_FLAG_NO_DRAW)) { RCT2_GLOBAL(0x009ABDA4, uint8*) = (uint8*)&info->palette; RCT2_GLOBAL(0x00EDF81C, uint32) = (IMAGE_TYPE_USE_PALETTE << 28); - gfx_draw_sprite_palette_set(dpi, SPR_CHAR_START + ((IMAGE_TYPE_USE_PALETTE << 28) | charOffset), info->x, info->y, info->palette, NULL); + gfx_draw_sprite_palette_set(dpi, sprite, info->x, info->y, info->palette, NULL); } - info->x += charWidth; + info->x += characterWidth; } static void ttf_draw_string_raw_sprite(rct_drawpixelinfo *dpi, const utf8 *text, text_draw_info *info) diff --git a/src/localisation/language.c b/src/localisation/language.c index 12ed327753..022c93ee18 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -144,6 +144,32 @@ bool utf8_is_codepoint_start(utf8 *text) return false; } +void utf8_remove_format_codes(utf8 *text) +{ + utf8 *dstCh = text; + utf8 *ch = text; + int codepoint; + while ((codepoint = utf8_get_next(ch, &ch)) != 0) { + if (!utf8_is_format_code(codepoint)) { + dstCh = utf8_write_codepoint(dstCh, codepoint); + } + } + *dstCh = 0; +} + +int utf8_get_codepoint_length(int codepoint) +{ + if (codepoint <= 0x7F) { + return 1; + } else if (codepoint <= 0x7FF) { + return 2; + } else if (codepoint <= 0xFFFF) { + return 3; + } else { + return 4; + } +} + const char *language_get_string(rct_string_id id) { const char *openrctString = NULL; diff --git a/src/localisation/language.h b/src/localisation/language.h index fbc01b32a3..69358349bd 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -73,5 +73,7 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ uint32 utf8_get_next(const utf8 *char_ptr, const utf8 **nextchar_ptr); utf8 *utf8_write_codepoint(utf8 *dst, uint32 codepoint); bool utf8_is_codepoint_start(utf8 *text); +void utf8_remove_format_codes(utf8 *text); +int utf8_get_codepoint_length(int codepoint); #endif diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 49a11bc1bb..82ea9f0f54 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -154,50 +154,6 @@ bool utf8_should_use_sprite_for_codepoint(int codepoint) } } -int utf8_get_sprite_offset_for_codepoint(int codepoint) -{ - switch (codepoint) { - case FORMAT_ENDQUOTES: return 34 - 32; - - case FORMAT_AMINUSCULE: return 159 - 32; - case FORMAT_UP: return 160 - 32; - case FORMAT_SYMBOL_i: return 160 - 32; - case FORMAT_CENT: return 162 - 32; - case FORMAT_POUND: return 163 - 32; - - case FORMAT_YEN: return 165 - 32; - - - - case FORMAT_COPYRIGHT: return 169 - 32; - case FORMAT_DOWN: return 170 - 32; - case FORMAT_LEFTGUILLEMET: return 171 - 32; - case FORMAT_TICK: return 172 - 32; - case FORMAT_CROSS: return 173 - 32; - - case FORMAT_RIGHT: return 175 - 32; - case FORMAT_DEGREE: return 176 - 32; - case FORMAT_SYMBOL_RAILWAY: return 177 - 32; - case FORMAT_SQUARED: return 178 - 32; - - case FORMAT_OPENQUOTES: return 180 - 32; - case FORMAT_EURO: return 181 - 32; - case FORMAT_SYMBOL_ROAD: return 182 - 32; - case FORMAT_SYMBOL_FLAG: return 183 - 32; - case FORMAT_APPROX: return 184 - 32; - case FORMAT_POWERNEGATIVEONE: return 185 - 32; - case FORMAT_BULLET: return 186 - 32; - case FORMAT_RIGHTGUILLEMET: return 187 - 32; - case FORMAT_SMALLUP: return 188 - 32; - case FORMAT_SMALLDOWN: return 189 - 32; - case FORMAT_LEFT: return 190 - 32; - case FORMAT_INVERTEDQUESTION: return 191 - 32; - default: - if (codepoint < 32 || codepoint >= 256) codepoint = '?'; - return codepoint - 32; - } -} - int utf8_get_format_code_arg_length(int codepoint) { switch (codepoint) { diff --git a/src/localisation/localisation.h b/src/localisation/localisation.h index f2025b44cd..6ffbfcfef8 100644 --- a/src/localisation/localisation.h +++ b/src/localisation/localisation.h @@ -28,7 +28,7 @@ bool utf8_is_format_code(int codepoint); bool utf8_should_use_sprite_for_codepoint(int codepoint); -int utf8_get_sprite_offset_for_codepoint(int codepoint); +int font_sprite_get_codepoint_offset(int codepoint); int utf8_get_format_code_arg_length(int codepoint); void format_string(char *dest, rct_string_id format, void *args); diff --git a/src/rct2.c b/src/rct2.c index 1294860c2b..14c69eef5a 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -99,7 +99,7 @@ int rct2_init() gfx_load_g1(); gfx_load_g2(); - gfx_load_character_widths(); + font_sprite_initialise_characters(); if (!gOpenRCT2Headless) { platform_init(); audio_init1(); diff --git a/src/windows/banner.c b/src/windows/banner.c index 6116d0ac0c..251d0dd9c8 100644 --- a/src/windows/banner.c +++ b/src/windows/banner.c @@ -263,21 +263,21 @@ static void window_banner_dropdown(rct_window *w, int widgetIndex, int dropdownI banner->text_colour = dropdownIndex + 1; + int colourCodepoint = FORMAT_COLOUR_CODE_START + banner->text_colour; + // Can be replaced with a buffer 34 chars wide ( 32 character + 1 colour_format + 1 '\0') - uint8* text_buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, uint8); + uint8* buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, uint8); + format_string(buffer, banner->string_idx, 0); - format_string(text_buffer, banner->string_idx, 0); - - if (text_buffer[0] < FORMAT_COLOUR_CODE_START - || text_buffer[0] > FORMAT_COLOUR_CODE_END){ - int end_point = strlen(text_buffer) + 1; - strncpy(text_buffer + 1, text_buffer, 32); - text_buffer[end_point] = '\0'; + int firstCodepoint = utf8_get_next(buffer, NULL); + if (!(firstCodepoint >= FORMAT_COLOUR_CODE_START && firstCodepoint <= FORMAT_COLOUR_CODE_END)) { + utf8 *endPoint = get_string_end(buffer) + utf8_get_codepoint_length(colourCodepoint); + memmove(buffer + utf8_get_codepoint_length(colourCodepoint), buffer, endPoint - buffer); + *endPoint = 0; } + utf8_write_codepoint(buffer, colourCodepoint); - text_buffer[0] = banner->text_colour + FORMAT_COLOUR_CODE_START; - - rct_string_id stringId = user_string_allocate(128, text_buffer); + rct_string_id stringId = user_string_allocate(128, buffer); if (stringId != 0) { rct_string_id prev_string_id = banner->string_idx; banner->string_idx = stringId; @@ -296,12 +296,12 @@ static void window_banner_textinput(rct_window *w, int widgetIndex, char *text) if (widgetIndex == WIDX_BANNER_TEXT && text != NULL) { rct_banner* banner = &gBanners[w->number]; - uint8* text_buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, uint8); + utf8 *buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, uint8); + utf8 *dst = buffer; + dst = utf8_write_codepoint(dst, FORMAT_COLOUR_CODE_START + banner->text_colour); + strncpy(dst, text, 32); - text_buffer[0] = banner->text_colour + FORMAT_COLOUR_CODE_START; - strncpy(text_buffer + 1, text, 32); - - rct_string_id stringId = user_string_allocate(128, text_buffer); + rct_string_id stringId = user_string_allocate(128, buffer); if (stringId) { rct_string_id prev_string_id = banner->string_idx; banner->string_idx = stringId; diff --git a/src/windows/text_input.c b/src/windows/text_input.c index 983f563de8..b2df708142 100644 --- a/src/windows/text_input.c +++ b/src/windows/text_input.c @@ -118,6 +118,8 @@ void window_text_input_open(rct_window* call_w, int call_widget, rct_string_id t // from crashing the game. text_input[maxLength - 1] = '\0'; + utf8_remove_format_codes(text_input); + // This is the text displayed above the input box input_text_description = description; From 31eb758ba1f44e1c711aace014e6c5a9c8ad327a Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 29 Jul 2015 16:34:13 +0100 Subject: [PATCH 0417/1173] implement utf8, part 15 --- data/language/english_uk.txt | 1 + src/drawing/drawing.h | 2 +- src/drawing/scrolling_text.c | 4 ++ src/drawing/string.c | 67 ++++++++++++++++++++++++++----- src/hook.c | 41 +++++++++++++++++-- src/hook.h | 2 +- src/openrct2.c | 12 +++--- src/windows/game_bottom_toolbar.c | 7 ++-- 8 files changed, 111 insertions(+), 25 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index c08c63c1d7..8b2e44754b 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3821,3 +3821,4 @@ STR_5481 :Themes STR_5482 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}1 minute STR_5483 :{BLACK}({COMMA16} weeks remaining) STR_5484 :{BLACK}({COMMA16} week remaining) +STR_5485 :{SMALLFONT}{STRING} diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 83f5fa864c..11f8199a9e 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -132,7 +132,7 @@ void draw_string_centred_raw(rct_drawpixelinfo *dpi, int x, int y, int numLines, void gfx_draw_string_right(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y); void draw_string_right_underline(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y); int string_get_height_raw(char *buffer); -void sub_6C1F57(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct_string_id format, void *args, int ticks); +void gfx_draw_string_centred_wrapped_partial(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct_string_id format, void *args, int ticks); bool ttf_initialise(); void ttf_dispose(); diff --git a/src/drawing/scrolling_text.c b/src/drawing/scrolling_text.c index 4b421b9e5d..378eca1b4c 100644 --- a/src/drawing/scrolling_text.c +++ b/src/drawing/scrolling_text.c @@ -107,6 +107,10 @@ static void scrolling_text_format(utf8 *dst, rct_draw_scroll_text *scrollText) /** * * rct2: 0x006C42D9 + * @param stringId (ax) + * @param scroll (cx) + * @param scrollingMode (bp) + * @returns ebx */ int scrolling_text_setup(rct_string_id stringId, uint16 scroll, uint16 scrollingMode) { diff --git a/src/drawing/string.c b/src/drawing/string.c index 2422155d54..30770addfa 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -707,18 +707,63 @@ int string_get_height_raw(char *buffer) * width : bp * ticks : ebp >> 16 */ -void sub_6C1F57(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct_string_id format, void *args, int ticks) +void gfx_draw_string_centred_wrapped_partial(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct_string_id format, void *args, int ticks) { - RCT2_CALLPROC_X( - 0x006C1F57, - colour, - format, - x, - y, - (int)args, - (int)dpi, - (width & 0xFFFF) | (ticks << 16) - ); + int numLines, fontSpriteBase, lineHeight, lineY; + utf8 *buffer = (utf8*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER; + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = FONT_SPRITE_BASE_MEDIUM; + gfx_draw_string(dpi, (char*)0x009C383D, colour, dpi->x, dpi->y); + format_string(buffer, format, args); + + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = FONT_SPRITE_BASE_MEDIUM; + gfx_wrap_string(buffer, width, &numLines, &fontSpriteBase); + switch (fontSpriteBase) { + case FONT_SPRITE_BASE_TINY: + lineHeight = 6; + break; + default: + case FONT_SPRITE_BASE_SMALL: + case FONT_SPRITE_BASE_MEDIUM: + lineHeight = 10; + break; + case FONT_SPRITE_BASE_BIG: + lineHeight = 18; + break; + } + + int numCharactersDrawn = 0; + int numCharactersToDraw = ticks; + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16) = 0; + lineY = y; + for (int line = 0; line <= numLines; line++) { + int halfWidth = gfx_get_string_width(buffer) / 2; + + utf8 *ch = buffer; + utf8 *nextCh; + int codepoint; + while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { + if (!utf8_is_format_code(codepoint)) { + numCharactersDrawn++; + if (numCharactersDrawn > numCharactersToDraw) { + *ch = 0; + break; + } + } + ch = nextCh; + } + + gfx_draw_string(dpi, buffer, 0xFE, x - halfWidth, lineY); + + if (numCharactersDrawn > numCharactersToDraw) { + break; + } + + buffer = get_string_end(buffer) + 1; + lineY += lineHeight; + } } static uint32 _ttf_surface_cache_hash(TTF_Font *font, const utf8 *text) diff --git a/src/hook.c b/src/hook.c index 26733d6b24..185d4680b5 100644 --- a/src/hook.c +++ b/src/hook.c @@ -25,11 +25,13 @@ void* g_hooktableaddress = 0; int g_hooktableoffset = 0; int g_maxhooks = 1000; -void hookfunc(int address, int newaddress, int stacksize, int registerargs[], int registersreturned) +void hookfunc(int address, int newaddress, int stacksize, int registerargs[], int registersreturned, int eaxDestinationRegister) { int i = 0; char data[100]; + registersreturned |= eaxDestinationRegister; + int registerssaved = 7; int n = registersreturned; for (; n; registerssaved--) { @@ -146,6 +148,39 @@ void hookfunc(int address, int newaddress, int stacksize, int registerargs[], in // returnlocation: + switch (eaxDestinationRegister) { + case EBX: + // mov ebx, eax + data[i++] = 0x8B; + data[i++] = 0xD8; + break; + case ECX: + // mov ecx, eax + data[i++] = 0x8B; + data[i++] = 0xC8; + break; + case EDX: + // mov ecx, eax + data[i++] = 0x8B; + data[i++] = 0xD0; + break; + case ESI: + // mov ecx, eax + data[i++] = 0x8B; + data[i++] = 0xF0; + break; + case EDI: + // mov ecx, eax + data[i++] = 0x8B; + data[i++] = 0xF8; + break; + case EBP: + // mov ecx, eax + data[i++] = 0x8B; + data[i++] = 0xE8; + break; + } + data[i++] = 0x83; // sub esp, x data[i++] = 0xEC; data[i++] = (signed char)(stacksize * -4) - rargssize; @@ -177,7 +212,7 @@ void hookfunc(int address, int newaddress, int stacksize, int registerargs[], in WriteProcessMemory(GetCurrentProcess(), (LPVOID)address, data, i, 0); } -void addhook(int address, int newaddress, int stacksize, int registerargs[], int registersreturned) +void addhook(int address, int newaddress, int stacksize, int registerargs[], int registersreturned, int eaxDestinationRegister) { if (!g_hooktableaddress) { g_hooktableaddress = VirtualAllocEx(GetCurrentProcess(), NULL, g_maxhooks * 100, MEM_COMMIT, PAGE_EXECUTE_READWRITE); @@ -192,6 +227,6 @@ void addhook(int address, int newaddress, int stacksize, int registerargs[], int *((int *)&data[i]) = hookaddress - address - i - 4; i += 4; data[i++] = 0xC3; // retn WriteProcessMemory(GetCurrentProcess(), (LPVOID)address, data, i, 0); - hookfunc(hookaddress, newaddress, stacksize, registerargs, registersreturned); + hookfunc(hookaddress, newaddress, stacksize, registerargs, registersreturned, eaxDestinationRegister); g_hooktableoffset++; } \ No newline at end of file diff --git a/src/hook.h b/src/hook.h index fed10792f3..1e0628b95b 100644 --- a/src/hook.h +++ b/src/hook.h @@ -32,6 +32,6 @@ enum REGISTER_ARGS { END = 0 }; -void addhook(int address, int newaddress, int stacksize, int registerargs[], int registersreturned); +void addhook(int address, int newaddress, int stacksize, int registerargs[], int registersreturned, int eaxDestinationRegister); #endif \ No newline at end of file diff --git a/src/openrct2.c b/src/openrct2.c index 8177e3e830..04a2babcc9 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -188,11 +188,13 @@ bool openrct2_initialise() title_sequences_load_presets(); // Hooks to allow RCT2 to call OpenRCT2 functions instead - addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0); // remove when all callers are decompiled - addhook(0x006E7499, (int)gfx_redraw_screen_rect, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0); // remove when 0x6E7FF3 is decompiled - addhook(0x006B752C, (int)ride_crash, 0, (int[]){ EDX, EBX, END }, 0); // remove when all callers are decompiled - addhook(0x0069A42F, (int)peep_window_state_update, 0, (int[]){ ESI, END }, 0); // remove when all callers are decompiled - addhook(0x006BB76E, (int)sound_play_panned, 0, (int[]){EAX, EBX, ECX, EDX, EBP, END}, EAX); // remove when all callers are decompiled + addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0, 0); // remove when all callers are decompiled + addhook(0x006E7499, (int)gfx_redraw_screen_rect, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0, 0); // remove when 0x6E7FF3 is decompiled + addhook(0x006B752C, (int)ride_crash, 0, (int[]){ EDX, EBX, END }, 0, 0); // remove when all callers are decompiled + addhook(0x0069A42F, (int)peep_window_state_update, 0, (int[]){ ESI, END }, 0, 0); // remove when all callers are decompiled + addhook(0x006BB76E, (int)sound_play_panned, 0, (int[]){EAX, EBX, ECX, EDX, EBP, END}, EAX, 0); // remove when all callers are decompiled + addhook(0x006C42D9, (int)scrolling_text_setup, 0, (int[]){EAX, ECX, EBP, END}, 0, EBX); // remove when all callers are decompiled + addhook(0x006C2321, (int)gfx_get_string_width, 0, (int[]){ESI, END}, 0, ECX); // remove when all callers are decompiled if (!rct2_init()) return false; diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index 912af9919e..e21333a4cc 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -523,13 +523,12 @@ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rc ); // Text - stringId = 1926; - utf8 *buffer = (utf8*)0x009B5F2C; - memcpy(buffer, &newsItem->text, 256); + stringId = 5485; + utf8 *newsItemText = newsItem->text; x = w->x + (middleOutsetWidget->left + middleOutsetWidget->right) / 2; y = w->y + middleOutsetWidget->top + 11; width = middleOutsetWidget->right - middleOutsetWidget->left - 62; - sub_6C1F57(dpi, x, y, width, 14, stringId, NULL, newsItem->ticks); + gfx_draw_string_centred_wrapped_partial(dpi, x, y, width, 14, stringId, &newsItemText, newsItem->ticks); x = w->x + window_game_bottom_toolbar_widgets[WIDX_NEWS_SUBJECT].left; y = w->y + window_game_bottom_toolbar_widgets[WIDX_NEWS_SUBJECT].top; From 6bf474bd5254e814b647eac40ed0631cffbecc35 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 29 Jul 2015 18:16:15 +0100 Subject: [PATCH 0418/1173] implement utf8, part 16 --- projects/openrct2.vcxproj | 1 + projects/openrct2.vcxproj.filters | 3 ++ src/drawing/scrolling_text.c | 2 +- src/drawing/string.c | 5 +- src/localisation/language.c | 71 -------------------------- src/localisation/language.h | 1 + src/localisation/utf8.c | 85 +++++++++++++++++++++++++++++++ src/openrct2.c | 1 + src/windows/banner.c | 13 ++--- 9 files changed, 98 insertions(+), 84 deletions(-) create mode 100644 src/localisation/utf8.c diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 3108569a3c..0a6c0becc1 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -67,6 +67,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index a714ad89d1..cfc5b0b556 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -504,6 +504,9 @@ Source\Drawing + + Source\Localisation + diff --git a/src/drawing/scrolling_text.c b/src/drawing/scrolling_text.c index 378eca1b4c..e04d40fca4 100644 --- a/src/drawing/scrolling_text.c +++ b/src/drawing/scrolling_text.c @@ -210,7 +210,7 @@ void scrolling_text_set_bitmap_for_ttf(utf8 *text, int scroll, uint8 *bitmap, si int codepoint; while ((codepoint = utf8_get_next(ch, &ch)) != 0) { if (utf8_is_format_code(codepoint)) { - if (colour == 0 && codepoint >= FORMAT_COLOUR_CODE_START && codepoint <= FORMAT_COLOUR_CODE_END) { + if (codepoint >= FORMAT_COLOUR_CODE_START && codepoint <= FORMAT_COLOUR_CODE_END) { colour = (uint8)codepoint; } } else { diff --git a/src/drawing/string.c b/src/drawing/string.c index 30770addfa..fb1337b814 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -200,10 +200,7 @@ int gfx_wrap_string(utf8 *text, int width, int *outNumLines, int *outFontHeight) ch = lastCh; } else if (currentWord == NULL) { // Single word is longer than line, insert null terminator - utf8 *end = get_string_end(ch); - memmove(ch + 1, ch, end - ch + 1); - *ch++ = 0; - + ch += utf8_insert_codepoint(ch, 0); maxWidth = max(maxWidth, lineWidth); (*outNumLines)++; lineWidth = 0; diff --git a/src/localisation/language.c b/src/localisation/language.c index 022c93ee18..f933eef302 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -86,64 +86,6 @@ const utf8 CheckBoxMarkString[] = { 0xE2, 0x9C, 0x93, 0x00 }; static int language_open_file(const char *filename, language_data *language); static void language_close(language_data *language); -uint32 utf8_get_next(const utf8 *char_ptr, const utf8 **nextchar_ptr) -{ - int result; - int numBytes; - - if (!(char_ptr[0] & 0x80)) { - result = char_ptr[0]; - numBytes = 1; - } else if ((char_ptr[0] & 0xE0) == 0xC0) { - result = ((char_ptr[0] & 0x1F) << 6) | (char_ptr[1] & 0x3F); - numBytes = 2; - } else if ((char_ptr[0] & 0xF0) == 0xE0) { - result = ((char_ptr[0] & 0x0F) << 12) | ((char_ptr[1] & 0x3F) << 6) | (char_ptr[2] & 0x3F); - numBytes = 3; - } else if ((char_ptr[0] & 0xF8) == 0xF0) { - result = ((char_ptr[0] & 0x07) << 18) | ((char_ptr[1] & 0x3F) << 12) | ((char_ptr[1] & 0x3F) << 6) | (char_ptr[2] & 0x3F); - numBytes = 4; - } else { - // TODO 4 bytes - result = ' '; - numBytes = 1; - } - - if (nextchar_ptr != NULL) - *nextchar_ptr = char_ptr + numBytes; - return result; -} - -utf8 *utf8_write_codepoint(utf8 *dst, uint32 codepoint) -{ - if (codepoint <= 0x7F) { - dst[0] = (utf8)codepoint; - return dst + 1; - } else if (codepoint <= 0x7FF) { - dst[0] = 0xC0 | ((codepoint >> 6) & 0x1F); - dst[1] = 0x80 | (codepoint & 0x3F); - return dst + 2; - } else if (codepoint <= 0xFFFF) { - dst[0] = 0xE0 | ((codepoint >> 12) & 0x0F); - dst[1] = 0x80 | ((codepoint >> 6) & 0x3F); - dst[2] = 0x80 | (codepoint & 0x3F); - return dst + 3; - } else { - dst[0] = 0xF0 | ((codepoint >> 18) & 0x07); - dst[1] = 0x80 | ((codepoint >> 12) & 0x3F); - dst[2] = 0x80 | ((codepoint >> 6) & 0x3F); - dst[3] = 0x80 | (codepoint & 0x3F); - return dst + 4; - } -} - -bool utf8_is_codepoint_start(utf8 *text) -{ - if ((text[0] & 0x80) == 0) return true; - if ((text[0] & 0xC0) == 0xC0) return true; - return false; -} - void utf8_remove_format_codes(utf8 *text) { utf8 *dstCh = text; @@ -157,19 +99,6 @@ void utf8_remove_format_codes(utf8 *text) *dstCh = 0; } -int utf8_get_codepoint_length(int codepoint) -{ - if (codepoint <= 0x7F) { - return 1; - } else if (codepoint <= 0x7FF) { - return 2; - } else if (codepoint <= 0xFFFF) { - return 3; - } else { - return 4; - } -} - const char *language_get_string(rct_string_id id) { const char *openrctString = NULL; diff --git a/src/localisation/language.h b/src/localisation/language.h index 69358349bd..6f84cf6471 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -72,6 +72,7 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ uint32 utf8_get_next(const utf8 *char_ptr, const utf8 **nextchar_ptr); utf8 *utf8_write_codepoint(utf8 *dst, uint32 codepoint); +int utf8_insert_codepoint(utf8 *dst, uint32 codepoint); bool utf8_is_codepoint_start(utf8 *text); void utf8_remove_format_codes(utf8 *text); int utf8_get_codepoint_length(int codepoint); diff --git a/src/localisation/utf8.c b/src/localisation/utf8.c new file mode 100644 index 0000000000..fc9e1ce60a --- /dev/null +++ b/src/localisation/utf8.c @@ -0,0 +1,85 @@ +#include "localisation.h" + +uint32 utf8_get_next(const utf8 *char_ptr, const utf8 **nextchar_ptr) +{ + int result; + int numBytes; + + if (!(char_ptr[0] & 0x80)) { + result = char_ptr[0]; + numBytes = 1; + } else if ((char_ptr[0] & 0xE0) == 0xC0) { + result = ((char_ptr[0] & 0x1F) << 6) | (char_ptr[1] & 0x3F); + numBytes = 2; + } else if ((char_ptr[0] & 0xF0) == 0xE0) { + result = ((char_ptr[0] & 0x0F) << 12) | ((char_ptr[1] & 0x3F) << 6) | (char_ptr[2] & 0x3F); + numBytes = 3; + } else if ((char_ptr[0] & 0xF8) == 0xF0) { + result = ((char_ptr[0] & 0x07) << 18) | ((char_ptr[1] & 0x3F) << 12) | ((char_ptr[1] & 0x3F) << 6) | (char_ptr[2] & 0x3F); + numBytes = 4; + } else { + // TODO 4 bytes + result = ' '; + numBytes = 1; + } + + if (nextchar_ptr != NULL) + *nextchar_ptr = char_ptr + numBytes; + return result; +} + +utf8 *utf8_write_codepoint(utf8 *dst, uint32 codepoint) +{ + if (codepoint <= 0x7F) { + dst[0] = (utf8)codepoint; + return dst + 1; + } else if (codepoint <= 0x7FF) { + dst[0] = 0xC0 | ((codepoint >> 6) & 0x1F); + dst[1] = 0x80 | (codepoint & 0x3F); + return dst + 2; + } else if (codepoint <= 0xFFFF) { + dst[0] = 0xE0 | ((codepoint >> 12) & 0x0F); + dst[1] = 0x80 | ((codepoint >> 6) & 0x3F); + dst[2] = 0x80 | (codepoint & 0x3F); + return dst + 3; + } else { + dst[0] = 0xF0 | ((codepoint >> 18) & 0x07); + dst[1] = 0x80 | ((codepoint >> 12) & 0x3F); + dst[2] = 0x80 | ((codepoint >> 6) & 0x3F); + dst[3] = 0x80 | (codepoint & 0x3F); + return dst + 4; + } +} + +/** + * Inserts the given codepoint at the given address, shifting all characters after along. + * @returns the size of the inserted codepoint. + */ +int utf8_insert_codepoint(utf8 *dst, uint32 codepoint) +{ + int shift = utf8_get_codepoint_length(codepoint); + utf8 *endPoint = get_string_end(dst); + memmove(dst + shift, dst, endPoint - dst + 1); + utf8_write_codepoint(dst, codepoint); + return shift; +} + +bool utf8_is_codepoint_start(utf8 *text) +{ + if ((text[0] & 0x80) == 0) return true; + if ((text[0] & 0xC0) == 0xC0) return true; + return false; +} + +int utf8_get_codepoint_length(int codepoint) +{ + if (codepoint <= 0x7F) { + return 1; + } else if (codepoint <= 0x7FF) { + return 2; + } else if (codepoint <= 0xFFFF) { + return 3; + } else { + return 4; + } +} diff --git a/src/openrct2.c b/src/openrct2.c index 04a2babcc9..8b8f21ee83 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -195,6 +195,7 @@ bool openrct2_initialise() addhook(0x006BB76E, (int)sound_play_panned, 0, (int[]){EAX, EBX, ECX, EDX, EBP, END}, EAX, 0); // remove when all callers are decompiled addhook(0x006C42D9, (int)scrolling_text_setup, 0, (int[]){EAX, ECX, EBP, END}, 0, EBX); // remove when all callers are decompiled addhook(0x006C2321, (int)gfx_get_string_width, 0, (int[]){ESI, END}, 0, ECX); // remove when all callers are decompiled + addhook(0x006C2321, (int)format_string, 0, (int[]){EDI, EAX, ECX, END}, 0, 0); // remove when all callers are decompiled if (!rct2_init()) return false; diff --git a/src/windows/banner.c b/src/windows/banner.c index 251d0dd9c8..9926914055 100644 --- a/src/windows/banner.c +++ b/src/windows/banner.c @@ -265,17 +265,14 @@ static void window_banner_dropdown(rct_window *w, int widgetIndex, int dropdownI int colourCodepoint = FORMAT_COLOUR_CODE_START + banner->text_colour; - // Can be replaced with a buffer 34 chars wide ( 32 character + 1 colour_format + 1 '\0') - uint8* buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, uint8); + uint8 buffer[256]; format_string(buffer, banner->string_idx, 0); - int firstCodepoint = utf8_get_next(buffer, NULL); - if (!(firstCodepoint >= FORMAT_COLOUR_CODE_START && firstCodepoint <= FORMAT_COLOUR_CODE_END)) { - utf8 *endPoint = get_string_end(buffer) + utf8_get_codepoint_length(colourCodepoint); - memmove(buffer + utf8_get_codepoint_length(colourCodepoint), buffer, endPoint - buffer); - *endPoint = 0; + if (firstCodepoint >= FORMAT_COLOUR_CODE_START && firstCodepoint <= FORMAT_COLOUR_CODE_END) { + utf8_write_codepoint(buffer, colourCodepoint); + } else { + utf8_insert_codepoint(buffer, colourCodepoint); } - utf8_write_codepoint(buffer, colourCodepoint); rct_string_id stringId = user_string_allocate(128, buffer); if (stringId != 0) { From 4f91a9f2d08f2019dfadc1e5d856ed665ed3aa1d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 29 Jul 2015 19:56:50 +0100 Subject: [PATCH 0419/1173] implement utf8, part 17 --- src/platform/windows.c | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/src/platform/windows.c b/src/platform/windows.c index f04b8745cb..4fdd323165 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -373,43 +373,49 @@ void platform_show_messagebox(char *message) * * rct2: 0x004080EA */ -int platform_open_common_file_dialog(int type, char *title, char *filename, char *filterPattern, char *filterName) +int platform_open_common_file_dialog(int type, utf8 *title, utf8 *filename, utf8 *filterPattern, utf8 *filterName) { - char initialDirectory[MAX_PATH], *dotAddress, *slashAddress; - OPENFILENAME openFileName; + wchar_t wctitle[256], wcfilename[MAX_PATH], wcfilterPattern[256], wcfilterName[256]; + wchar_t initialDirectory[MAX_PATH], *dotAddress, *slashAddress; + OPENFILENAMEW openFileName; BOOL result; int tmp; DWORD commonFlags; + MultiByteToWideChar(CP_UTF8, 0, title, -1, wctitle, countof(wctitle)); + MultiByteToWideChar(CP_UTF8, 0, filename, -1, wcfilename, countof(wcfilename)); + MultiByteToWideChar(CP_UTF8, 0, filterPattern, -1, wcfilterPattern, countof(wcfilterPattern)); + MultiByteToWideChar(CP_UTF8, 0, filterName, -1, wcfilterName, countof(wcfilterName)); + // Get directory path from given filename - strcpy(initialDirectory, filename); - dotAddress = strrchr(initialDirectory, '.'); + lstrcpyW(initialDirectory, wcfilename); + dotAddress = wcsrchr(initialDirectory, '.'); if (dotAddress != NULL) { - slashAddress = strrchr(initialDirectory, '\\'); + slashAddress = wcsrchr(initialDirectory, '\\'); if (slashAddress < dotAddress) *(slashAddress + 1) = 0; } // Clear filename if (type != 0) - *filename = 0; + wcfilename[0] = 0; // Set open file name options - memset(&openFileName, 0, sizeof(OPENFILENAME)); - openFileName.lStructSize = sizeof(OPENFILENAME); + memset(&openFileName, 0, sizeof(OPENFILENAMEW)); + openFileName.lStructSize = sizeof(OPENFILENAMEW); openFileName.hwndOwner = windows_get_window_handle(); - openFileName.lpstrFile = filename; + openFileName.lpstrFile = wcfilename; openFileName.nMaxFile = MAX_PATH; openFileName.lpstrInitialDir = initialDirectory; - openFileName.lpstrTitle = title; + openFileName.lpstrTitle = wctitle; // Copy filter name - strcpy((char*)0x01423800, filterName); + lstrcpyW((wchar_t*)0x01423800, wcfilterName); // Copy filter pattern - strcpy((char*)0x01423800 + strlen(filterName) + 1, filterPattern); - *((char*)(0x01423800 + strlen(filterName) + 1 + strlen(filterPattern) + 1)) = 0; - openFileName.lpstrFilter = (char*)0x01423800; + lstrcpyW((wchar_t*)0x01423800 + lstrlenW(wcfilterName) + 1, wcfilterPattern); + *((wchar_t*)(0x01423800 + lstrlenW(wcfilterName) + 1 + lstrlenW(wcfilterPattern) + 1)) = 0; + openFileName.lpstrFilter = (wchar_t*)0x01423800; // tmp = RCT2_GLOBAL(0x009E2C74, uint32); @@ -420,15 +426,17 @@ int platform_open_common_file_dialog(int type, char *title, char *filename, char commonFlags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR; if (type == 0) { openFileName.Flags = commonFlags | OFN_CREATEPROMPT | OFN_OVERWRITEPROMPT; - result = GetSaveFileName(&openFileName); + result = GetSaveFileNameW(&openFileName); } else if (type == 1) { openFileName.Flags = commonFlags | OFN_NONETWORKBUTTON | OFN_FILEMUSTEXIST; - result = GetOpenFileName(&openFileName); + result = GetOpenFileNameW(&openFileName); } // RCT2_GLOBAL(0x009E2C74, uint32) = tmp; + WideCharToMultiByte(CP_UTF8, 0, wcfilename, countof(wcfilename), filename, MAX_PATH, NULL, NULL); + return result; } From 799cb53ec749ebefe2a937ef45c9e54b9a18c4ff Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 29 Jul 2015 23:57:43 +0100 Subject: [PATCH 0420/1173] implement utf8, part 18 --- src/editor.c | 1 + src/game.c | 61 ++++++ src/game.h | 3 + src/localisation/convert.c | 318 ++++++++++++++++++++++++++++++++ src/localisation/localisation.h | 8 +- src/localisation/user.c | 6 +- src/management/news_item.c | 83 ++++----- src/management/news_item.h | 8 +- src/scenario.c | 2 + 9 files changed, 438 insertions(+), 52 deletions(-) diff --git a/src/editor.c b/src/editor.c index b3960732ce..43fe400d3e 100644 --- a/src/editor.c +++ b/src/editor.c @@ -499,6 +499,7 @@ static int editor_read_s6(const char *path) news_item_init_queue(); window_editor_main_open(); editor_finalise_main_view(); + game_convert_strings_to_utf8(); return 1; } diff --git a/src/game.c b/src/game.c index 3c0c753dae..db23454383 100644 --- a/src/game.c +++ b/src/game.c @@ -589,6 +589,66 @@ static void load_landscape() } } +/** + * Converts all the user strings and news item strings to UTF-8. + */ +void game_convert_strings_to_utf8() +{ + utf8 buffer[512]; + + // User strings + for (int i = 0; i < MAX_USER_STRINGS; i++) { + utf8 *userString = &gUserStrings[i * USER_STRING_MAX_LENGTH]; + + if (!str_is_null_or_empty(userString)) { + rct2_to_utf8(buffer, userString); + memcpy(userString, buffer, 31); + userString[31] = 0; + } + } + + // News items + for (int i = 0; i < MAX_NEWS_ITEMS; i++) { + rct_news_item *newsItem = news_item_get(i); + + if (!str_is_null_or_empty(newsItem->text)) { + rct2_to_utf8(buffer, newsItem->text); + memcpy(newsItem->text, buffer, 255); + newsItem->text[255] = 0; + } + } +} + +/** + * Converts all the user strings and news item strings to RCT2 encoding. + */ +void game_convert_strings_to_rct2(rct_s6_data *s6) +{ + char buffer[512]; + + // User strings + for (int i = 0; i < MAX_USER_STRINGS; i++) { + char *userString = &s6->custom_strings[i * USER_STRING_MAX_LENGTH]; + + if (!str_is_null_or_empty(userString)) { + utf8_to_rct2(buffer, userString); + memcpy(userString, buffer, 31); + userString[31] = 0; + } + } + + // News items + for (int i = 0; i < MAX_NEWS_ITEMS; i++) { + rct_news_item *newsItem = &s6->news_items[i]; + + if (!str_is_null_or_empty(newsItem->text)) { + utf8_to_rct2(buffer, newsItem->text); + memcpy(newsItem->text, buffer, 255); + newsItem->text[255] = 0; + } + } +} + /** * * rct2: 0x00675E1B @@ -650,6 +710,7 @@ int game_load_sv6(SDL_RWops* rw) map_update_tile_pointers(); reset_0x69EBE4(); openrct2_reset_object_tween_locations(); + game_convert_strings_to_utf8(); return 1; } diff --git a/src/game.h b/src/game.h index 55e48051e9..fa9dbf8120 100644 --- a/src/game.h +++ b/src/game.h @@ -23,6 +23,7 @@ #include "common.h" #include "platform/platform.h" +#include "scenario.h" enum GAME_COMMAND { GAME_COMMAND_SET_RIDE_APPEARANCE, @@ -117,5 +118,7 @@ int save_game(); void rct2_exit(); void rct2_exit_reason(rct_string_id title, rct_string_id body); void game_autosave(); +void game_convert_strings_to_utf8(); +void game_convert_strings_to_rct2(rct_s6_data *s6); #endif diff --git a/src/localisation/convert.c b/src/localisation/convert.c index fe77e039d9..fb4963bb82 100644 --- a/src/localisation/convert.c +++ b/src/localisation/convert.c @@ -7,6 +7,51 @@ typedef struct { static const encoding_convert_entry GB2312ToUnicodeTable[7445]; static const encoding_convert_entry Big5ToUnicodeTable[13710]; +static const encoding_convert_entry RCT2ToUnicodeTable[256]; + +int rct2_to_utf8(utf8 *dst, const char *src) +{ + int codepoint; + + utf8 *start = dst; + const char *ch = src; + while (*ch != 0) { + if (*ch == (char)0xFF) { + ch++; + + // Read wide char + uint8 a = *ch++; + uint8 b = *ch++; + codepoint = (a << 8) | b; + } else { + codepoint = (uint8)(*ch++); + codepoint = encoding_convert_rct2_to_unicode(codepoint); + } + + dst = utf8_write_codepoint(dst, codepoint); + } + dst = utf8_write_codepoint(dst, 0); + return dst - start; +} + +int utf8_to_rct2(char *dst, const utf8 *src) +{ + char *start = dst; + const utf8 *ch = src; + int codepoint; + while ((codepoint = utf8_get_next(ch, &ch)) != 0) { + codepoint = encoding_convert_unicode_to_rct2(codepoint); + if (codepoint < 256) { + *dst++ = (char)codepoint; + } else if (codepoint <= 0xFFFF) { + *dst++ = (char)0xFF; + *dst++ = (codepoint >> 8) & 0xFF; + *dst++ = codepoint & 0xFF; + } + } + *dst++ = 0; + return dst - start; +} static int encoding_search_compare(const void *pKey, const void *pEntry) { @@ -24,6 +69,20 @@ static wchar_t encoding_convert_x_to_unicode(wchar_t code, const encoding_conver else return entry->unicode; } +wchar_t encoding_convert_unicode_to_rct2(wchar_t unicode) +{ + // Can't do a binary search as its sorted by RCT2 code, not unicode + for (int i = 0; i < countof(RCT2ToUnicodeTable); i++) { + if (RCT2ToUnicodeTable[i].unicode == unicode) return RCT2ToUnicodeTable[i].code; + } + return unicode; +} + +wchar_t encoding_convert_rct2_to_unicode(wchar_t rct2str) +{ + return encoding_convert_x_to_unicode(rct2str, RCT2ToUnicodeTable, countof(RCT2ToUnicodeTable)); +} + wchar_t encoding_convert_gb2312_to_unicode(wchar_t gb2312) { return encoding_convert_x_to_unicode(gb2312 - 0x8080, GB2312ToUnicodeTable, countof(GB2312ToUnicodeTable)); @@ -34,6 +93,265 @@ wchar_t encoding_convert_big5_to_unicode(wchar_t big5) return encoding_convert_x_to_unicode(big5, Big5ToUnicodeTable, countof(Big5ToUnicodeTable)); } +static const encoding_convert_entry RCT2ToUnicodeTable[256] = { + { 0, 0 }, + { 1, FORMAT_MOVE_X }, + { 2, FORMAT_ADJUST_PALETTE }, + { 3, 3 }, + { 4, 4 }, + { 5, FORMAT_NEWLINE }, + { 6, FORMAT_NEWLINE_SMALLER }, + { 7, FORMAT_TINYFONT }, + { 8, FORMAT_BIGFONT }, + { 9, FORMAT_MEDIUMFONT }, + { 10, FORMAT_SMALLFONT }, + { 11, FORMAT_OUTLINE }, + { 12, FORMAT_OUTLINE_OFF }, + { 13, FORMAT_WINDOW_COLOUR_1 }, + { 14, FORMAT_WINDOW_COLOUR_2 }, + { 15, FORMAT_WINDOW_COLOUR_3 }, + { 16, 16 }, + { 17, FORMAT_NEWLINE_X_Y }, + { 18, 18 }, + { 19, 19 }, + { 20, 20 }, + { 21, 21 }, + { 22, 22 }, + { 23, FORMAT_INLINE_SPRITE }, + { 24, 24 }, + { 25, 25 }, + { 26, 26 }, + { 27, 27 }, + { 28, 28 }, + { 29, 29 }, + { 30, 30 }, + { 31, 31 }, + { 32, 32 }, + { 33, 33 }, + { 34, 34 }, + { 35, 35 }, + { 36, 36 }, + { 37, 37 }, + { 38, 38 }, + { 39, 39 }, + { 40, 40 }, + { 41, 41 }, + { 42, 42 }, + { 43, 43 }, + { 44, 44 }, + { 45, 45 }, + { 46, 46 }, + { 47, 47 }, + { 48, 48 }, + { 49, 49 }, + { 50, 50 }, + { 51, 51 }, + { 52, 52 }, + { 53, 53 }, + { 54, 54 }, + { 55, 55 }, + { 56, 56 }, + { 57, 57 }, + { 58, 58 }, + { 59, 59 }, + { 60, 60 }, + { 61, 61 }, + { 62, 62 }, + { 63, 63 }, + { 64, 64 }, + { 65, 65 }, + { 66, 66 }, + { 67, 67 }, + { 68, 68 }, + { 69, 69 }, + { 70, 70 }, + { 71, 71 }, + { 72, 72 }, + { 73, 73 }, + { 74, 74 }, + { 75, 75 }, + { 76, 76 }, + { 77, 77 }, + { 78, 78 }, + { 79, 79 }, + { 80, 80 }, + { 81, 81 }, + { 82, 82 }, + { 83, 83 }, + { 84, 84 }, + { 85, 85 }, + { 86, 86 }, + { 87, 87 }, + { 88, 88 }, + { 89, 89 }, + { 90, 90 }, + { 91, 91 }, + { 92, 92 }, + { 93, 93 }, + { 94, 94 }, + { 95, 95 }, + { 96, 96 }, + { 97, 97 }, + { 98, 98 }, + { 99, 99 }, + { 100, 100 }, + { 101, 101 }, + { 102, 102 }, + { 103, 103 }, + { 104, 104 }, + { 105, 105 }, + { 106, 106 }, + { 107, 107 }, + { 108, 108 }, + { 109, 109 }, + { 110, 110 }, + { 111, 111 }, + { 112, 112 }, + { 113, 113 }, + { 114, 114 }, + { 115, 115 }, + { 116, 116 }, + { 117, 117 }, + { 118, 118 }, + { 119, 119 }, + { 120, 120 }, + { 121, 121 }, + { 122, 122 }, + { 123, FORMAT_COMMA32 }, + { 124, FORMAT_INT32 }, + { 125, FORMAT_COMMA2DP32 }, + { 126, FORMAT_COMMA16 }, + { 127, FORMAT_UINT16 }, + { 128, FORMAT_CURRENCY2DP }, + { 129, FORMAT_CURRENCY }, + { 130, FORMAT_STRINGID }, + { 131, FORMAT_STRINGID2 }, + { 132, FORMAT_STRING }, + { 133, FORMAT_MONTHYEAR }, + { 134, FORMAT_MONTH }, + { 135, FORMAT_VELOCITY }, + { 136, FORMAT_POP16 }, + { 137, FORMAT_PUSH16 }, + { 138, FORMAT_DURATION }, + { 139, FORMAT_REALTIME }, + { 140, FORMAT_LENGTH }, + { 141, FORMAT_SPRITE }, + { 142, FORMAT_BLACK }, + { 143, FORMAT_GREY }, + { 144, FORMAT_WHITE }, + { 145, FORMAT_RED }, + { 146, FORMAT_GREEN }, + { 147, FORMAT_YELLOW }, + { 148, FORMAT_TOPAZ }, + { 149, FORMAT_CELADON }, + { 150, FORMAT_BABYBLUE }, + { 151, FORMAT_PALELAVENDER }, + { 152, FORMAT_PALEGOLD }, + { 153, FORMAT_LIGHTPINK }, + { 154, FORMAT_PEARLAQUA }, + { 155, FORMAT_PALESILVER }, + { 156, 156 }, + { 157, 157 }, + { 158, 158 }, + { 159, FORMAT_AMINUSCULE }, + { 160, FORMAT_UP }, + { 161, FORMAT_SYMBOL_i }, + { 162, 162 }, + { 163, FORMAT_POUND }, + { 164, 164 }, + { 165, FORMAT_YEN }, + { 166, 166 }, + { 167, 167 }, + { 168, 168 }, + { 169, FORMAT_COPYRIGHT }, + { 170, FORMAT_DOWN }, + { 171, FORMAT_LEFTGUILLEMET }, + { 172, FORMAT_TICK }, + { 173, FORMAT_CROSS }, + { 174, 174 }, + { 175, FORMAT_RIGHT }, + { 176, FORMAT_DEGREE }, + { 177, FORMAT_SYMBOL_RAILWAY }, + { 178, FORMAT_SQUARED }, + { 179, 179 }, + { 180, FORMAT_OPENQUOTES }, + { 181, FORMAT_EURO }, + { 182, FORMAT_SYMBOL_ROAD }, + { 183, FORMAT_SYMBOL_FLAG }, + { 184, FORMAT_APPROX }, + { 185, FORMAT_POWERNEGATIVEONE }, + { 186, FORMAT_BULLET }, + { 187, FORMAT_RIGHTGUILLEMET }, + { 188, FORMAT_SMALLUP }, + { 189, FORMAT_SMALLDOWN }, + { 190, FORMAT_LEFT }, + { 191, FORMAT_INVERTEDQUESTION }, + { 192, 192 }, + { 193, 193 }, + { 194, 194 }, + { 195, 195 }, + { 196, 196 }, + { 197, 197 }, + { 198, 198 }, + { 199, 199 }, + { 200, 200 }, + { 201, 201 }, + { 202, 202 }, + { 203, 203 }, + { 204, 204 }, + { 205, 205 }, + { 206, 206 }, + { 207, 207 }, + { 208, 208 }, + { 209, 209 }, + { 210, 210 }, + { 211, 211 }, + { 212, 212 }, + { 213, 213 }, + { 214, 214 }, + { 215, 215 }, + { 216, 216 }, + { 217, 217 }, + { 218, 218 }, + { 219, 219 }, + { 220, 220 }, + { 221, 221 }, + { 222, 222 }, + { 223, 223 }, + { 224, 224 }, + { 225, 225 }, + { 226, 226 }, + { 227, 227 }, + { 228, 228 }, + { 229, 229 }, + { 230, 230 }, + { 231, 231 }, + { 232, 232 }, + { 233, 233 }, + { 234, 234 }, + { 235, 235 }, + { 236, 236 }, + { 237, 237 }, + { 238, 238 }, + { 239, 239 }, + { 240, 240 }, + { 241, 241 }, + { 242, 242 }, + { 243, 243 }, + { 244, 244 }, + { 245, 245 }, + { 246, 246 }, + { 247, 247 }, + { 248, 248 }, + { 249, 249 }, + { 250, 250 }, + { 251, 251 }, + { 252, 252 }, + { 253, 253 }, + { 254, 254 }, + { 255, 255 } +}; + static const encoding_convert_entry GB2312ToUnicodeTable[7445] = { { 8481, 12288 }, { 8482, 12289 }, diff --git a/src/localisation/localisation.h b/src/localisation/localisation.h index 6ffbfcfef8..51a9fe7b9c 100644 --- a/src/localisation/localisation.h +++ b/src/localisation/localisation.h @@ -41,13 +41,17 @@ size_t get_string_size(const utf8 *text); int get_string_length(const utf8 *text); void user_string_clear_all(); -rct_string_id user_string_allocate(int base, const char *text); +rct_string_id user_string_allocate(int base, const utf8 *text); void user_string_free(rct_string_id id); bool is_user_string_id(rct_string_id stringId); utf8 *win1252_to_utf8_alloc(const char *src); int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength); +int rct2_to_utf8(utf8 *dst, const char *src); +int utf8_to_rct2(char *dst, const utf8 *src); +wchar_t encoding_convert_rct2_to_unicode(wchar_t rct2str); +wchar_t encoding_convert_unicode_to_rct2(wchar_t unicode); wchar_t encoding_convert_gb2312_to_unicode(wchar_t gb2312); wchar_t encoding_convert_big5_to_unicode(wchar_t big5); @@ -58,4 +62,6 @@ wchar_t encoding_convert_big5_to_unicode(wchar_t big5); extern const char real_name_initials[16]; extern const char *real_names[1024]; +extern utf8 *gUserStrings; + #endif diff --git a/src/localisation/user.c b/src/localisation/user.c index 57358e4c65..e481edf0d1 100644 --- a/src/localisation/user.c +++ b/src/localisation/user.c @@ -21,7 +21,7 @@ #include "../addresses.h" #include "localisation.h" -char *gUserStrings = (char*)0x0135A8F4; +utf8 *gUserStrings = (char*)0x0135A8F4; static bool user_string_exists(const char *text); @@ -38,7 +38,7 @@ void user_string_clear_all() * * rct2: 0x006C421D */ -rct_string_id user_string_allocate(int base, const char *text) +rct_string_id user_string_allocate(int base, const utf8 *text) { int highBits = (base & 0x7F) << 9; bool allowDuplicates = base & 0x80; @@ -73,7 +73,7 @@ void user_string_free(rct_string_id id) gUserStrings[id * USER_STRING_MAX_LENGTH] = 0; } -static bool user_string_exists(const char *text) +static bool user_string_exists(const utf8 *text) { char *userString = gUserStrings; for (int i = 0; i < MAX_USER_STRINGS; i++, userString += USER_STRING_MAX_LENGTH) { diff --git a/src/management/news_item.c b/src/management/news_item.c index 74d0eeb8ae..7ab8e76c10 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -32,31 +32,27 @@ rct_news_item *gNewsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_i void window_game_bottom_toolbar_invalidate_news_item(); static int news_item_get_new_history_slot(); -#define MAX_NEWS 60 - -bool news_item_is_valid_idx(const uint8 idx) +bool news_item_is_valid_idx(int index) { - if (idx > MAX_NEWS) - { + if (index > MAX_NEWS_ITEMS) { log_error("Tried to get news item past MAX_NEWS."); return false; } return true; } -rct_news_item *news_item_get(const uint8 idx) +rct_news_item *news_item_get(int index) { - if (news_item_is_valid_idx(idx)) - { - return &gNewsItems[idx]; + if (news_item_is_valid_idx(index)) { + return &gNewsItems[index]; } else { return NULL; } } -bool news_item_is_empty(const uint8 idx) +bool news_item_is_empty(int index) { - return news_item_get(idx)->type == NEWS_ITEM_NULL; + return news_item_get(index)->type == NEWS_ITEM_NULL; } bool news_item_is_queue_empty() @@ -179,7 +175,7 @@ void news_item_close_current() newsItems[i] = newsItems[0]; // Set the end of the end of the history list - if (i < MAX_NEWS) + if (i < MAX_NEWS_ITEMS) newsItems[i + 1].type = NEWS_ITEM_NULL; // Invalidate the news window @@ -198,7 +194,7 @@ static void news_item_shift_history_up() { const int history_idx = 11; rct_news_item *history_start = news_item_get(history_idx); - const size_t count = sizeof(rct_news_item) * (MAX_NEWS - 1 - history_idx); + const size_t count = sizeof(rct_news_item) * (MAX_NEWS_ITEMS - 1 - history_idx); memmove(history_start, history_start + 1, count); } @@ -212,13 +208,13 @@ static int news_item_get_new_history_slot() int i; // Find an available history news item slot - for (i = 11; i <= MAX_NEWS; i++) + for (i = 11; i <= MAX_NEWS_ITEMS; i++) if (news_item_is_empty(i)) return i; // Dequeue the first history news item, shift history up news_item_shift_history_up(); - return MAX_NEWS; + return MAX_NEWS_ITEMS; } /** @@ -405,39 +401,36 @@ void news_item_open_subject(int type, int subject) } /** - * rct2: 0x0066E407 + * + * rct2: 0x0066E407 */ -void news_item_disable_news(uint8 type, uint32 assoc) { - // TODO: write test invalidating windows - int i; - for (i = 0; i < 11; i++) - { - if (!news_item_is_empty(i)) - { - rct_news_item * const newsItem = news_item_get(i); - if (type == newsItem->type && assoc == newsItem->assoc) { - newsItem->flags |= 0x1; - if (i == 0) { - window_game_bottom_toolbar_invalidate_news_item(); - } - } - } else { - break; +void news_item_disable_news(uint8 type, uint32 assoc) +{ + // TODO: write test invalidating windows + for (int i = 0; i < 11; i++) { + if (!news_item_is_empty(i)) { + rct_news_item * const newsItem = news_item_get(i); + if (type == newsItem->type && assoc == newsItem->assoc) { + newsItem->flags |= 0x1; + if (i == 0) { + window_game_bottom_toolbar_invalidate_news_item(); + } } - } + } else { + break; + } + } - for (i = 11; i <= MAX_NEWS; i++) - { - if (!news_item_is_empty(i)) - { - rct_news_item * const newsItem = news_item_get(i); - if (type == newsItem->type && assoc == newsItem->assoc) { - newsItem->flags |= 0x1; - window_invalidate_by_class(WC_RECENT_NEWS); - } - } else { - break; + for (int i = 11; i <= MAX_NEWS_ITEMS; i++) { + if (!news_item_is_empty(i)) { + rct_news_item * const newsItem = news_item_get(i); + if (type == newsItem->type && assoc == newsItem->assoc) { + newsItem->flags |= 0x1; + window_invalidate_by_class(WC_RECENT_NEWS); } - } + } else { + break; + } + } } diff --git a/src/management/news_item.h b/src/management/news_item.h index d4512aea9b..e1ed3b2f87 100644 --- a/src/management/news_item.h +++ b/src/management/news_item.h @@ -51,6 +51,8 @@ typedef struct { utf8 text[256]; // 0x0C } rct_news_item; +#define MAX_NEWS_ITEMS 60 + void news_item_init_queue(); void news_item_update_current(); void news_item_close_current(); @@ -59,9 +61,9 @@ void news_item_add_to_queue(uint8 type, rct_string_id string_id, uint32 assoc); void news_item_add_to_queue_raw(uint8 type, const char *text, uint32 assoc); void news_item_open_subject(int type, int subject); void news_item_disable_news(uint8 type, uint32 assoc); -rct_news_item *news_item_get(const uint8 idx); -bool news_item_is_empty(const uint8 idx); +rct_news_item *news_item_get(int index); +bool news_item_is_empty(int index); bool news_item_is_queue_empty(); -bool news_item_is_valid_idx(const uint8 idx); +bool news_item_is_valid_idx(int index); #endif diff --git a/src/scenario.c b/src/scenario.c index f1dd4f0e30..9d00389e92 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -180,6 +180,7 @@ int scenario_load(const char *path) map_update_tile_pointers(); reset_0x69EBE4(); openrct2_reset_object_tween_locations(); + game_convert_strings_to_utf8(); return 1; } @@ -965,6 +966,7 @@ int scenario_save(SDL_RWops* rw, int flags) memcpy(&s6->dword_010E63B8, (void*)0x010E63B8, 0x2E8570); scenario_fix_ghosts(s6); + game_convert_strings_to_rct2(s6); scenario_save_s6(rw, s6); free(s6); From 52d57328260db6a9d8731634640481dff25ea39d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 30 Jul 2015 01:09:23 +0100 Subject: [PATCH 0421/1173] implement utf8, part 19 --- src/drawing/string.c | 22 ++++++++++++++++------ src/input.c | 2 +- src/windows/map_tooltip.c | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/drawing/string.c b/src/drawing/string.c index fb1337b814..0321f3454a 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -128,6 +128,12 @@ int gfx_clip_string(utf8 *text, int width) utf8 *clipCh = text; int codepoint; while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { + if (utf8_is_format_code(codepoint)) { + ch = nextCh; + ch += utf8_get_format_code_arg_length(codepoint); + continue; + } + for (int i = 0; i < 4; i++) { backup[i] = nextCh[i]; }; for (int i = 0; i < 3; i++) { nextCh[i] = '.'; } nextCh[3] = 0; @@ -175,9 +181,9 @@ int gfx_wrap_string(utf8 *text, int width, int *outNumLines, int *outFontHeight) utf8 *ch = text; utf8 *firstCh = text; - utf8 *lastCh; + utf8 *nextCh; int codepoint; - while ((codepoint = utf8_get_next(ch, &lastCh)) != 0) { + while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { if (codepoint == ' ') { currentWord = ch; currentWidth = lineWidth; @@ -189,15 +195,19 @@ int gfx_wrap_string(utf8 *text, int width, int *outNumLines, int *outFontHeight) currentWord = NULL; firstCh = ch; continue; + } else if (utf8_is_format_code(codepoint)) { + ch = nextCh; + ch += utf8_get_format_code_arg_length(codepoint); + continue; } - uint8 saveCh = *lastCh; - *lastCh = 0; + uint8 saveCh = *nextCh; + *nextCh = 0; lineWidth = gfx_get_string_width(firstCh); - *lastCh = saveCh; + *nextCh = saveCh; if (lineWidth <= width) { - ch = lastCh; + ch = nextCh; } else if (currentWord == NULL) { // Single word is longer than line, insert null terminator ch += utf8_insert_codepoint(ch, 0); diff --git a/src/input.c b/src/input.c index c5f49fb870..7a816fe9a3 100644 --- a/src/input.c +++ b/src/input.c @@ -959,7 +959,7 @@ void process_mouse_over(int x, int y) int ebx, esi, edi, ebp; cursorId = CURSOR_ARROW; - RCT2_GLOBAL(0x9A9808, sint16) = -1; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS, sint16) = -1; window = window_find_from_point(x, y); if (window != NULL) { diff --git a/src/windows/map_tooltip.c b/src/windows/map_tooltip.c index a4dc5695c2..a7fc768074 100644 --- a/src/windows/map_tooltip.c +++ b/src/windows/map_tooltip.c @@ -151,5 +151,5 @@ static void window_map_tooltip_paint(rct_window *w, rct_drawpixelinfo *dpi) if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS, rct_string_id) == (rct_string_id)STR_NONE) return; - gfx_draw_string_centred_wrapped(dpi, (void*)0x009A9808, w->x + (w->width / 2), w->y + (w->height / 2), w->width, 1162, 0); + gfx_draw_string_centred_wrapped(dpi, (void*)RCT2_ADDRESS_MAP_TOOLTIP_ARGS, w->x + (w->width / 2), w->y + (w->height / 2), w->width, 1162, 0); } \ No newline at end of file From 4d003ad00a340809d74a48452ee05e53adc35a1d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 30 Jul 2015 08:20:27 +0100 Subject: [PATCH 0422/1173] implement utf8, part 20 (improve font sizes and offsets) --- src/drawing/string.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/drawing/string.c b/src/drawing/string.c index 0321f3454a..b4459939b5 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -22,6 +22,7 @@ #include "../addresses.h" #include "../localisation/localisation.h" #include "../sprites.h" +#include "../world/map.h" #include "drawing.h" static int ttf_get_string_width(const utf8 *text); @@ -29,10 +30,9 @@ static void ttf_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, in static bool _ttfInitialised = false; static TTF_Font *_ttfFont[4] = { NULL }; -int _ttfFontOffsetX = 0; -int _ttfFontOffsetY = 0; -static const int TTFFontSizes[] = { 9, 9, 11, 13 }; +static const int TTFFontSizes[] = { 9, 11, 12, 13 }; +static const rct_xy16 TTFFontOffsets[] = { { -1, -2 }, { -1, -2 }, { -1, -3 }, { -1, -3 } }; #define TTF_SURFACE_CACHE_SIZE 256 #define TTF_GETWIDTH_CACHE_SIZE 1024 @@ -927,8 +927,6 @@ bool ttf_initialise() } } - _ttfFontOffsetX = 1; - _ttfFontOffsetY = -2; _ttfInitialised = true; } return true; @@ -953,21 +951,26 @@ void ttf_dispose() _ttfInitialised = false; } -TTF_Font *ttf_get_font_from_sprite_base(uint16 spriteBase) +int ttf_get_font_size_from_sprite_base(uint16 spriteBase) { switch (spriteBase) { case FONT_SPRITE_BASE_TINY: - return _ttfFont[0]; + return 0; case FONT_SPRITE_BASE_SMALL: - return _ttfFont[1]; + return 1; default: case FONT_SPRITE_BASE_MEDIUM: - return _ttfFont[2]; + return 2; case FONT_SPRITE_BASE_BIG: - return _ttfFont[3]; + return 3; } } +TTF_Font *ttf_get_font_from_sprite_base(uint16 spriteBase) +{ + return _ttfFont[ttf_get_font_size_from_sprite_base(spriteBase)]; +} + enum { TEXT_DRAW_FLAG_INSET = 1 << 0, TEXT_DRAW_FLAG_OUTLINE = 1 << 1, @@ -1029,9 +1032,10 @@ static void ttf_draw_string_raw_ttf(rct_drawpixelinfo *dpi, const utf8 *text, te return; } } - - int drawX = info->x + _ttfFontOffsetX; - int drawY = info->y + _ttfFontOffsetY; + + int fontSize = ttf_get_font_size_from_sprite_base(info->font_sprite_base); + int drawX = info->x + TTFFontOffsets[fontSize].x; + int drawY = info->y + TTFFontOffsets[fontSize].y; int width = surface->w; int height = surface->h; From 7fe54661b9f6976f7c075e9cd0b779841fb5bc4f Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 31 Jul 2015 01:15:35 +0100 Subject: [PATCH 0423/1173] implement utf8, part 21 (more font specific customisation and bug fixes) --- src/drawing/font.c | 34 ++++++++++++ src/drawing/font.h | 19 +++++++ src/drawing/scrolling_text.c | 6 +- src/drawing/string.c | 104 ++++++++++------------------------- src/localisation/language.c | 17 ++++-- src/localisation/language.h | 4 +- src/windows/loadsave.c | 9 ++- 7 files changed, 106 insertions(+), 87 deletions(-) diff --git a/src/drawing/font.c b/src/drawing/font.c index 39c19f1a5d..cde247dc04 100644 --- a/src/drawing/font.c +++ b/src/drawing/font.c @@ -4,8 +4,12 @@ #include "drawing.h" #include "font.h" +static const int SpriteFontLineHeight[] = { 6, 10, 10, 18 }; + static uint8 *_spriteFontCharacterWidths = (uint8*)RCT2_ADDRESS_FONT_CHAR_WIDTH; +TTFFontSetDescriptor *gCurrentTTFFontSet; + /** * * rct2: 0x006C19AC @@ -92,3 +96,33 @@ int font_sprite_get_codepoint_sprite(int fontSpriteBase, int codepoint) { return SPR_CHAR_START + ((IMAGE_TYPE_USE_PALETTE << 28) | (fontSpriteBase + font_sprite_get_codepoint_offset(codepoint))); } + +int font_get_size_from_sprite_base(uint16 spriteBase) +{ + switch (spriteBase) { + case FONT_SPRITE_BASE_TINY: + return 0; + case FONT_SPRITE_BASE_SMALL: + return 1; + default: + case FONT_SPRITE_BASE_MEDIUM: + return 2; + case FONT_SPRITE_BASE_BIG: + return 3; + } +} + +int font_get_line_height(int fontSpriteBase) +{ + int fontSize = font_get_size_from_sprite_base(fontSpriteBase); + if (gUseTrueTypeFont) { + return gCurrentTTFFontSet->size[fontSize].line_height; + } else { + return SpriteFontLineHeight[fontSize]; + } +} + +int font_get_line_height_small(int fontSpriteBase) +{ + return font_get_line_height(fontSpriteBase) / 2; +} diff --git a/src/drawing/font.h b/src/drawing/font.h index 33fd8345e8..48a9f33540 100644 --- a/src/drawing/font.h +++ b/src/drawing/font.h @@ -1,6 +1,7 @@ #ifndef _DRAWING_FONT_H_ #define _DRAWING_FONT_H_ +#include #include "../common.h" enum { @@ -20,9 +21,27 @@ enum { FONT_SPRITE_BASE_BIG = 672 }; +typedef struct { + utf8 *filename; + int ptSize; + int offset_x; + int offset_y; + int line_height; + TTF_Font *font; +} TTFFontDescriptor; + +typedef struct { + TTFFontDescriptor size[FONT_SIZE_COUNT]; +} TTFFontSetDescriptor; + +extern TTFFontSetDescriptor *gCurrentTTFFontSet; + void font_sprite_initialise_characters(); int font_sprite_get_codepoint_offset(int codepoint); int font_sprite_get_codepoint_width(int fontSpriteBase, int codepoint); int font_sprite_get_codepoint_sprite(int fontSpriteBase, int codepoint); +int font_get_size_from_sprite_base(uint16 spriteBase); +int font_get_line_height(int fontSpriteBase); +int font_get_line_height_small(int fontSpriteBase); #endif \ No newline at end of file diff --git a/src/drawing/scrolling_text.c b/src/drawing/scrolling_text.c index e04d40fca4..1958cc1f8a 100644 --- a/src/drawing/scrolling_text.c +++ b/src/drawing/scrolling_text.c @@ -197,7 +197,7 @@ void scrolling_text_set_bitmap_for_sprite(utf8 *text, int scroll, uint8 *bitmap, } } -TTF_Font *ttf_get_font_from_sprite_base(uint16 spriteBase); +TTFFontDescriptor *ttf_get_font_from_sprite_base(uint16 spriteBase); SDL_Surface *_ttf_surface_cache_get_or_add(TTF_Font *font, const utf8 *text); void scrolling_text_set_bitmap_for_ttf(utf8 *text, int scroll, uint8 *bitmap, sint16 *scrollPositionOffsets) @@ -225,8 +225,8 @@ void scrolling_text_set_bitmap_for_ttf(utf8 *text, int scroll, uint8 *bitmap, si colour = RCT2_GLOBAL(0x009FF048, uint8*)[(colour - FORMAT_COLOUR_CODE_START) * 4]; } - TTF_Font *font = ttf_get_font_from_sprite_base(FONT_SPRITE_BASE_TINY); - SDL_Surface *surface = _ttf_surface_cache_get_or_add(font, text); + TTFFontDescriptor *fontDesc = ttf_get_font_from_sprite_base(FONT_SPRITE_BASE_TINY); + SDL_Surface *surface = _ttf_surface_cache_get_or_add(fontDesc->font, text); if (surface == NULL) { return; } diff --git a/src/drawing/string.c b/src/drawing/string.c index b4459939b5..3f5625f39c 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -29,10 +29,6 @@ static int ttf_get_string_width(const utf8 *text); static void ttf_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, int y); static bool _ttfInitialised = false; -static TTF_Font *_ttfFont[4] = { NULL }; - -static const int TTFFontSizes[] = { 9, 11, 12, 13 }; -static const rct_xy16 TTFFontOffsets[] = { { -1, -2 }, { -1, -2 }, { -1, -3 }, { -1, -3 } }; #define TTF_SURFACE_CACHE_SIZE 256 #define TTF_GETWIDTH_CACHE_SIZE 1024 @@ -379,17 +375,9 @@ int gfx_draw_string_centred_wrapped(rct_drawpixelinfo *dpi, void *args, int x, i // line_width unused here line_width = gfx_wrap_string(buffer, width, &num_lines, &font_height); + line_height = font_get_line_height(font_height); - line_height = 0x0A; - - if (font_height > 0xE0) { - line_height = 6; - if (font_height != 0x1C0) { - line_height = 0x12; - } - } - - if (*buffer == 0x0B) { + if (*buffer == FORMAT_OUTLINE) { line_height = line_height + 1; } @@ -436,19 +424,7 @@ int gfx_draw_string_left_wrapped(rct_drawpixelinfo *dpi, void *args, int x, int *current_font_sprite_base = FONT_SPRITE_BASE_MEDIUM; gfx_wrap_string(buffer, width, &numLines, &fontSpriteBase); - switch (fontSpriteBase) { - case FONT_SPRITE_BASE_TINY: - lineHeight = 6; - break; - default: - case FONT_SPRITE_BASE_SMALL: - case FONT_SPRITE_BASE_MEDIUM: - lineHeight = 10; - break; - case FONT_SPRITE_BASE_BIG: - lineHeight = 18; - break; - } + lineHeight = font_get_line_height(fontSpriteBase); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16) = 0; lineY = y; @@ -726,25 +702,13 @@ void gfx_draw_string_centred_wrapped_partial(rct_drawpixelinfo *dpi, int x, int RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = FONT_SPRITE_BASE_MEDIUM; gfx_wrap_string(buffer, width, &numLines, &fontSpriteBase); - switch (fontSpriteBase) { - case FONT_SPRITE_BASE_TINY: - lineHeight = 6; - break; - default: - case FONT_SPRITE_BASE_SMALL: - case FONT_SPRITE_BASE_MEDIUM: - lineHeight = 10; - break; - case FONT_SPRITE_BASE_BIG: - lineHeight = 18; - break; - } + lineHeight = font_get_line_height(fontSpriteBase); int numCharactersDrawn = 0; int numCharactersToDraw = ticks; RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16) = 0; - lineY = y; + lineY = y - ((numLines * lineHeight) / 2); for (int line = 0; line <= numLines; line++) { int halfWidth = gfx_get_string_width(buffer) / 2; @@ -917,11 +881,14 @@ bool ttf_initialise() if (TTF_Init() != 0) return false; - utf8 fontPath[MAX_PATH] = "C:\\Windows\\Fonts\\"; - strcat(fontPath, gTrueTypeFontPath); for (int i = 0; i < 4; i++) { - _ttfFont[i] = TTF_OpenFont(fontPath, TTFFontSizes[i]); - if (_ttfFont[i] == NULL) { + TTFFontDescriptor *fontDesc = &(gCurrentTTFFontSet->size[i]); + + utf8 fontPath[MAX_PATH] = "C:\\Windows\\Fonts\\"; + strcat(fontPath, fontDesc->filename); + + fontDesc->font = TTF_OpenFont(fontPath, fontDesc->ptSize); + if (fontDesc->font == NULL) { TTF_Quit(); return false; } @@ -940,10 +907,11 @@ void ttf_dispose() _ttf_surface_cache_dispose_all(); _ttf_getwidth_cache_dispose_all(); - if (_ttfFont != NULL) { - for (int i = 0; i < 4; i++) { - TTF_CloseFont(_ttfFont[i]); - _ttfFont[i] = NULL; + for (int i = 0; i < 4; i++) { + TTFFontDescriptor *fontDesc = &(gCurrentTTFFontSet->size[i]); + if (fontDesc->font != NULL) { + TTF_CloseFont(fontDesc->font); + fontDesc->font = NULL; } } @@ -951,24 +919,9 @@ void ttf_dispose() _ttfInitialised = false; } -int ttf_get_font_size_from_sprite_base(uint16 spriteBase) +TTFFontDescriptor *ttf_get_font_from_sprite_base(uint16 spriteBase) { - switch (spriteBase) { - case FONT_SPRITE_BASE_TINY: - return 0; - case FONT_SPRITE_BASE_SMALL: - return 1; - default: - case FONT_SPRITE_BASE_MEDIUM: - return 2; - case FONT_SPRITE_BASE_BIG: - return 3; - } -} - -TTF_Font *ttf_get_font_from_sprite_base(uint16 spriteBase) -{ - return _ttfFont[ttf_get_font_size_from_sprite_base(spriteBase)]; + return &gCurrentTTFFontSet->size[font_get_size_from_sprite_base(spriteBase)]; } enum { @@ -1017,13 +970,13 @@ static void ttf_draw_string_raw_ttf(rct_drawpixelinfo *dpi, const utf8 *text, te if (!_ttfInitialised && !ttf_initialise()) return; - TTF_Font *font = ttf_get_font_from_sprite_base(info->font_sprite_base); + TTFFontDescriptor *fontDesc = ttf_get_font_from_sprite_base(info->font_sprite_base); if (info->flags & TEXT_DRAW_FLAG_NO_DRAW) { - info->x += _ttf_getwidth_cache_get_or_add(font, text); + info->x += _ttf_getwidth_cache_get_or_add(fontDesc->font, text); return; } else { uint8 colour = info->palette[1]; - SDL_Surface *surface = _ttf_surface_cache_get_or_add(font, text); + SDL_Surface *surface = _ttf_surface_cache_get_or_add(fontDesc->font, text); if (surface == NULL) return; @@ -1033,9 +986,9 @@ static void ttf_draw_string_raw_ttf(rct_drawpixelinfo *dpi, const utf8 *text, te } } - int fontSize = ttf_get_font_size_from_sprite_base(info->font_sprite_base); - int drawX = info->x + TTFFontOffsets[fontSize].x; - int drawY = info->y + TTFFontOffsets[fontSize].y; + int fontSize = font_get_size_from_sprite_base(info->font_sprite_base); + int drawX = info->x + fontDesc->offset_x; + int drawY = info->y + fontDesc->offset_y; int width = surface->w; int height = surface->h; @@ -1132,11 +1085,12 @@ static const utf8 *ttf_process_format_code(rct_drawpixelinfo *dpi, const utf8 *t nextCh++; break; case FORMAT_NEWLINE: - if (info->font_sprite_base <= 224) { info->y += 28; } - else if (info->font_sprite_base <= 448) { info->y += 24; } - else { info->y += 18; } + info->x = info->startX; + info->y += font_get_line_height(info->font_sprite_base); break; case FORMAT_NEWLINE_SMALLER: + info->x = info->startX; + info->y += font_get_line_height_small(info->font_sprite_base); break; case FORMAT_TINYFONT: info->font_sprite_base = 448; diff --git a/src/localisation/language.c b/src/localisation/language.c index f933eef302..fd0deb5070 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -51,6 +51,13 @@ enum { RCT2_LANGUAGE_ID_END = 255 }; +static TTFFontSetDescriptor TTFFontMingliu = {{ + { "msjh.ttc", 9, -1, -3, 6, NULL }, + { "mingliu.ttc", 11, 1, 0, 12, NULL }, + { "mingliu.ttc", 12, 1, 0, 12, NULL }, + { "mingliu.ttc", 13, 1, 0, 20, NULL }, +}}; + const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "", "", "", "", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_UNDEFINED { "en-GB", "English (UK)", "English (UK)", "english_uk", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_ENGLISH_UK @@ -64,13 +71,12 @@ const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "sv-SE", "Swedish", "Svenska", "swedish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_SWEDISH }, // LANGUAGE_SWEDISH { "it-IT", "Italian", "Italiano", "italian", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ITALIAN }, // LANGUAGE_ITALIAN { "pt-BR", "Portuguese (BR)", "Portug\xC3\xAAs (BR)", "portuguese_br", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_PORTUGESE }, // LANGUAGE_PORTUGUESE_BR - { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", "msjh.ttc", RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL + { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", &TTFFontMingliu, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL // { "kr-KR", "Korean", "Korean", "english_uk", "malgun.ttf", RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN }; int gCurrentLanguage = LANGUAGE_UNDEFINED; bool gUseTrueTypeFont = false; -const utf8 *gTrueTypeFontPath; language_data _languageFallback = { 0 }; language_data _languageCurrent = { 0 }; @@ -142,12 +148,13 @@ int language_open(int id) gCurrentLanguage = id; if (LanguagesDescriptors[id].font == FONT_OPENRCT2_SPRITE) { - gUseTrueTypeFont = false; - gTrueTypeFontPath = NULL; ttf_dispose(); + gUseTrueTypeFont = false; + gCurrentTTFFontSet = NULL; } else { + ttf_dispose(); gUseTrueTypeFont = true; - gTrueTypeFontPath = LanguagesDescriptors[id].font; + gCurrentTTFFontSet = LanguagesDescriptors[id].font; if (!ttf_initialise()) { log_warning("Unable to initialise TrueType fonts."); } diff --git a/src/localisation/language.h b/src/localisation/language.h index 6f84cf6471..03dc6d5524 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -22,6 +22,7 @@ #define _LANGUAGE_H_ #include "../common.h" +#include "../drawing/font.h" enum { LANGUAGE_UNDEFINED, @@ -48,7 +49,7 @@ typedef struct { const utf8 *english_name; const utf8 *native_name; const utf8 *path; - const utf8 *font; + TTFFontSetDescriptor *font; uint8 rct2_original_id; } language_descriptor; @@ -56,7 +57,6 @@ extern const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT]; extern int gCurrentLanguage; extern bool gUseTrueTypeFont; -extern const utf8 *gTrueTypeFontPath; extern const utf8 BlackUpArrowString[]; extern const utf8 BlackDownArrowString[]; diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 286caeca65..f5f3bcb00a 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -462,9 +462,14 @@ static void window_loadsave_paint(rct_window *w, rct_drawpixelinfo *dpi) if (_shortenedDirectory[0] == '\0') shorten_path(_directory, _shortenedDirectory, w->width - 8); - char buffer[256]; + utf8 buffer[256]; + // Format text - sprintf(buffer, "%c%c%s", FORMAT_MEDIUMFONT, FORMAT_BLACK, _shortenedDirectory); + utf8 *ch = buffer; + ch = utf8_write_codepoint(ch, FORMAT_MEDIUMFONT); + ch = utf8_write_codepoint(ch, FORMAT_BLACK); + strcpy(ch, _shortenedDirectory); + // Draw shadow gfx_draw_string(dpi, buffer, 0, w->x + 4, w->y + 20); rct_string_id id = STR_NONE; From de7088cb25fc8714e97a4ecd404b48fa1a23fd17 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 31 Jul 2015 19:05:00 +0100 Subject: [PATCH 0424/1173] implement utf8, part 22 (bug fixes) --- src/drawing/scrolling_text.c | 7 ++++++- src/drawing/string.c | 23 +++++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/drawing/scrolling_text.c b/src/drawing/scrolling_text.c index 1958cc1f8a..8932a9e8f3 100644 --- a/src/drawing/scrolling_text.c +++ b/src/drawing/scrolling_text.c @@ -202,6 +202,12 @@ SDL_Surface *_ttf_surface_cache_get_or_add(TTF_Font *font, const utf8 *text); void scrolling_text_set_bitmap_for_ttf(utf8 *text, int scroll, uint8 *bitmap, sint16 *scrollPositionOffsets) { + TTFFontDescriptor *fontDesc = ttf_get_font_from_sprite_base(FONT_SPRITE_BASE_TINY); + if (fontDesc->font == NULL) { + scrolling_text_set_bitmap_for_sprite(text, scroll, bitmap, scrollPositionOffsets); + return; + } + // Currently only supports one colour uint8 colour = 0; @@ -225,7 +231,6 @@ void scrolling_text_set_bitmap_for_ttf(utf8 *text, int scroll, uint8 *bitmap, si colour = RCT2_GLOBAL(0x009FF048, uint8*)[(colour - FORMAT_COLOUR_CODE_START) * 4]; } - TTFFontDescriptor *fontDesc = ttf_get_font_from_sprite_base(FONT_SPRITE_BASE_TINY); SDL_Surface *surface = _ttf_surface_cache_get_or_add(fontDesc->font, text); if (surface == NULL) { return; diff --git a/src/drawing/string.c b/src/drawing/string.c index 3f5625f39c..eafed0fa68 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -179,10 +179,12 @@ int gfx_wrap_string(utf8 *text, int width, int *outNumLines, int *outFontHeight) utf8 *firstCh = text; utf8 *nextCh; int codepoint; + int numCharactersOnLine = 0; while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { if (codepoint == ' ') { currentWord = ch; currentWidth = lineWidth; + numCharactersOnLine++; } else if (codepoint == FORMAT_NEWLINE) { *ch++ = 0; maxWidth = max(maxWidth, lineWidth); @@ -190,6 +192,7 @@ int gfx_wrap_string(utf8 *text, int width, int *outNumLines, int *outFontHeight) lineWidth = 0; currentWord = NULL; firstCh = ch; + numCharactersOnLine = 0; continue; } else if (utf8_is_format_code(codepoint)) { ch = nextCh; @@ -202,8 +205,9 @@ int gfx_wrap_string(utf8 *text, int width, int *outNumLines, int *outFontHeight) lineWidth = gfx_get_string_width(firstCh); *nextCh = saveCh; - if (lineWidth <= width) { + if (lineWidth <= width || numCharactersOnLine == 0) { ch = nextCh; + numCharactersOnLine++; } else if (currentWord == NULL) { // Single word is longer than line, insert null terminator ch += utf8_insert_codepoint(ch, 0); @@ -212,6 +216,7 @@ int gfx_wrap_string(utf8 *text, int width, int *outNumLines, int *outFontHeight) lineWidth = 0; currentWord = NULL; firstCh = ch; + numCharactersOnLine = 0; } else { ch = currentWord; *ch++ = 0; @@ -221,6 +226,7 @@ int gfx_wrap_string(utf8 *text, int width, int *outNumLines, int *outFontHeight) lineWidth = 0; currentWord = NULL; firstCh = ch; + numCharactersOnLine = 0; } } @@ -889,8 +895,7 @@ bool ttf_initialise() fontDesc->font = TTF_OpenFont(fontPath, fontDesc->ptSize); if (fontDesc->font == NULL) { - TTF_Quit(); - return false; + log_error("Unable to load '%s'", fontPath); } } @@ -936,6 +941,8 @@ typedef struct { int startY; int x; int y; + int maxX; + int maxY; int flags; uint8 palette[8]; uint16 font_sprite_base; @@ -971,6 +978,10 @@ static void ttf_draw_string_raw_ttf(rct_drawpixelinfo *dpi, const utf8 *text, te return; TTFFontDescriptor *fontDesc = ttf_get_font_from_sprite_base(info->font_sprite_base); + if (fontDesc->font == NULL) { + return ttf_draw_string_raw_sprite(dpi, text, info); + } + if (info->flags & TEXT_DRAW_FLAG_NO_DRAW) { info->x += _ttf_getwidth_cache_get_or_add(fontDesc->font, text); return; @@ -1198,6 +1209,8 @@ static void ttf_process_string(rct_drawpixelinfo *dpi, const utf8 *text, text_dr } else { ch = ttf_process_glyph_run(dpi, ch, info); } + info->maxX = max(info->maxX, info->x); + info->maxY = max(info->maxY, info->y); } } @@ -1286,11 +1299,13 @@ static int ttf_get_string_width(const utf8 *text) info.startY = 0; info.x = 0; info.y = 0; + info.maxX = 0; + info.maxY = 0; info.flags |= TEXT_DRAW_FLAG_NO_DRAW; if (gUseTrueTypeFont) info.flags |= TEXT_DRAW_FLAG_TTF; ttf_process_string(NULL, text, &info); - return info.x; + return info.maxX; } From d228d1391801d59456b6aadab15d115fdbccf1f2 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 1 Aug 2015 16:40:15 +0100 Subject: [PATCH 0425/1173] implement utf8, part 23 (bug fixes) --- data/language/english_uk.txt | 1 + src/config.c | 8 ++++---- src/drawing/string.c | 12 ++---------- src/localisation/string_ids.h | 2 ++ src/openrct2.c | 23 +++++++++++------------ src/platform/platform.h | 2 +- src/platform/windows.c | 28 +++++++++++++++++----------- src/windows/editor_inventions_list.c | 7 ++++--- src/windows/land.c | 6 +----- src/windows/map.c | 6 +----- src/windows/tooltip.c | 21 +++++++++------------ src/windows/water.c | 6 +----- 12 files changed, 54 insertions(+), 68 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 8b2e44754b..4f323a14c7 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3822,3 +3822,4 @@ STR_5482 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}1 minute STR_5483 :{BLACK}({COMMA16} weeks remaining) STR_5484 :{BLACK}({COMMA16} week remaining) STR_5485 :{SMALLFONT}{STRING} +STR_5486 :{BLACK}{COMMA16} diff --git a/src/config.c b/src/config.c index a2de18bdfb..6ad85f1ee4 100644 --- a/src/config.c +++ b/src/config.c @@ -705,13 +705,13 @@ static config_line *_configLines = NULL; * @param resultPath Pointer to where the absolute path of the RCT2 installation directory will be copied to. * @returns 1 if successful, otherwise 0. */ -static bool config_find_rct2_path(char *resultPath) +static bool config_find_rct2_path(utf8 *resultPath) { int i; log_verbose("searching common installation locations."); - const char *searchLocations[] = { + const utf8 *searchLocations[] = { "C:\\Program Files\\Infogrames\\RollerCoaster Tycoon 2", "C:\\Program Files (x86)\\Infogrames\\RollerCoaster Tycoon 2", "C:\\Program Files\\Infogrames Interactive\\RollerCoaster Tycoon 2", @@ -734,8 +734,8 @@ static bool config_find_rct2_path(char *resultPath) bool config_find_or_browse_install_directory() { - char path[MAX_PATH]; - char *installPath; + utf8 path[MAX_PATH]; + utf8 *installPath; if (config_find_rct2_path(path)) { SafeFree(gConfigGeneral.game_path); diff --git a/src/drawing/string.c b/src/drawing/string.c index eafed0fa68..e9d04a01e1 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -229,7 +229,7 @@ int gfx_wrap_string(utf8 *text, int width, int *outNumLines, int *outFontHeight) numCharactersOnLine = 0; } } - + maxWidth = max(maxWidth, lineWidth); *outFontHeight = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); return maxWidth == 0 ? lineWidth : maxWidth; } @@ -608,15 +608,7 @@ void draw_string_centred_raw(rct_drawpixelinfo *dpi, int x, int y, int numLines, text += 2; } - y += 10; - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) <= 224) - continue; - - y -= 4; - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) <= 448) - continue; - - y += 12; + y += font_get_line_height(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16)); } } diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 1e9cf1b16d..cf642ed4b1 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1825,6 +1825,8 @@ enum { STR_X_WEEKS_REMAINING = 5483, STR_1_WEEK_REMAINING = 5484, + STR_LAND_TOOL_SIZE_VALUE = 5486, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/openrct2.c b/src/openrct2.c index 8b8f21ee83..c6f10dbabe 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -39,8 +39,8 @@ #include "world/mapgen.h" int gOpenRCT2StartupAction = STARTUP_ACTION_TITLE; -char gOpenRCT2StartupActionPath[512] = { 0 }; -char gExePath[MAX_PATH]; +utf8 gOpenRCT2StartupActionPath[512] = { 0 }; +utf8 gExePath[MAX_PATH]; // This should probably be changed later and allow a custom selection of things to initialise like SDL_INIT bool gOpenRCT2Headless = false; @@ -112,19 +112,18 @@ static void openrct2_copy_files_over(const char *originalDirectory, const char * static void openrct2_set_exe_path() { - char exePath[MAX_PATH]; - char tempPath[MAX_PATH]; - char *exeDelimiter; - int pathEnd; + wchar_t exePath[MAX_PATH]; + wchar_t tempPath[MAX_PATH]; + wchar_t *exeDelimiter; int exeDelimiterIndex; - GetModuleFileName(NULL, exePath, MAX_PATH); - exeDelimiter = strrchr(exePath, platform_get_path_separator()); + GetModuleFileNameW(NULL, exePath, MAX_PATH); + exeDelimiter = wcsrchr(exePath, platform_get_path_separator()); exeDelimiterIndex = (int)(exeDelimiter - exePath); - pathEnd = strlen(exePath) - (strlen(exePath) - exeDelimiterIndex); - strncpy(tempPath, exePath, pathEnd); - tempPath[pathEnd] = '\0'; - _fullpath(gExePath, tempPath, MAX_PATH); + lstrcpynW(tempPath, exePath, exeDelimiterIndex + 1); + tempPath[exeDelimiterIndex] = L'\0'; + _wfullpath(exePath, tempPath, MAX_PATH); + WideCharToMultiByte(CP_UTF8, 0, exePath, countof(exePath), gExePath, countof(gExePath), NULL, NULL); } /** diff --git a/src/platform/platform.h b/src/platform/platform.h index 6554170c29..685e057af3 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -119,7 +119,7 @@ unsigned int platform_get_ticks(); void platform_get_user_directory(char *outPath, const char *subDirectory); void platform_show_messagebox(char *message); int platform_open_common_file_dialog(int type, char *title, char *filename, char *filterPattern, char *filterName); -char *platform_open_directory_browser(char *title); +utf8 *platform_open_directory_browser(utf8 *title); uint8 platform_get_locale_currency(); uint16 platform_get_locale_language(); uint8 platform_get_locale_measurement_format(); diff --git a/src/platform/windows.c b/src/platform/windows.c index 4fdd323165..5577cacb0e 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -413,8 +413,11 @@ int platform_open_common_file_dialog(int type, utf8 *title, utf8 *filename, utf8 lstrcpyW((wchar_t*)0x01423800, wcfilterName); // Copy filter pattern - lstrcpyW((wchar_t*)0x01423800 + lstrlenW(wcfilterName) + 1, wcfilterPattern); - *((wchar_t*)(0x01423800 + lstrlenW(wcfilterName) + 1 + lstrlenW(wcfilterPattern) + 1)) = 0; + int wcfilterNameLength = lstrlenW(wcfilterName); + int wcfilterPatternLength = lstrlenW(wcfilterPattern); + + lstrcpyW((wchar_t*)0x01423800 + wcfilterNameLength + 1, wcfilterPattern); + *((wchar_t*)((wchar_t*)0x01423800 + wcfilterNameLength + 1 + wcfilterPatternLength + 1)) = 0; openFileName.lpstrFilter = (wchar_t*)0x01423800; // @@ -440,13 +443,15 @@ int platform_open_common_file_dialog(int type, utf8 *title, utf8 *filename, utf8 return result; } -char *platform_open_directory_browser(char *title) +utf8 *platform_open_directory_browser(utf8 *title) { - BROWSEINFO bi; - char pszBuffer[MAX_PATH]; + BROWSEINFOW bi; + wchar_t pszBuffer[MAX_PATH], wctitle[256]; LPITEMIDLIST pidl; LPMALLOC lpMalloc; + MultiByteToWideChar(CP_UTF8, 0, title, -1, wctitle, countof(wctitle)); + // Initialize COM if (FAILED(CoInitializeEx(0, COINIT_APARTMENTTHREADED))) { CoUninitialize(); @@ -466,19 +471,20 @@ char *platform_open_directory_browser(char *title) bi.hwndOwner = NULL; bi.pidlRoot = NULL; bi.pszDisplayName = pszBuffer; - bi.lpszTitle = title; + bi.lpszTitle = wctitle; bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; bi.lpfn = NULL; bi.lParam = 0; - char *outPath = NULL; + utf8 *outPath = NULL; - if (pidl = SHBrowseForFolder(&bi)) { + if (pidl = SHBrowseForFolderW(&bi)) { // Copy the path directory to the buffer - if (SHGetPathFromIDList(pidl, pszBuffer)) { + if (SHGetPathFromIDListW(pidl, pszBuffer)) { // Store pszBuffer (and the path) in the outPath - outPath = (char*) malloc(strlen(pszBuffer)+1); - strcpy(outPath, pszBuffer); + int outPathCapacity = lstrlenW(pszBuffer) * 4 + 1; + outPath = (utf8*)malloc(outPathCapacity); + WideCharToMultiByte(CP_UTF8, 0, pszBuffer, countof(pszBuffer), outPath, outPathCapacity, NULL, NULL); } } CoUninitialize(); diff --git a/src/windows/editor_inventions_list.c b/src/windows/editor_inventions_list.c index cd5c30fb66..06ca44417d 100644 --- a/src/windows/editor_inventions_list.c +++ b/src/windows/editor_inventions_list.c @@ -804,7 +804,7 @@ static void window_editor_inventions_list_scrollpaint(rct_window *w, rct_drawpix int left, top, bottom, itemY, disableItemMovement; sint32 researchItemEndMarker; rct_string_id stringId; - char buffer[256], *ptr; + utf8 buffer[256], *ptr; // Draw background colour = RCT2_GLOBAL(0x0141FC48 + (w->colours[1] * 8), uint8); @@ -856,8 +856,9 @@ static void window_editor_inventions_list_scrollpaint(rct_window *w, rct_drawpix stringId = research_item_get_name(researchItem->entryIndex & 0xFFFFFF); ptr = buffer; - if (!disableItemMovement) - *ptr++ = colour & 0xFF; + if (!disableItemMovement) { + ptr = utf8_write_codepoint(ptr, colour & 0xFF); + } format_string(ptr, stringId, NULL); diff --git a/src/windows/land.c b/src/windows/land.c index 7e8c0e385b..f69fe7e1ce 100644 --- a/src/windows/land.c +++ b/src/windows/land.c @@ -375,11 +375,7 @@ static void window_land_paint(rct_window *w, rct_drawpixelinfo *dpi) // FEATURE larger land tool size support if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > 7) { - RCT2_GLOBAL(0x009BC677, char) = FORMAT_BLACK; - RCT2_GLOBAL(0x009BC678, char) = FORMAT_COMMA16; - RCT2_GLOBAL(0x009BC679, char) = 0; - RCT2_GLOBAL(0x013CE952, sint16) = RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16); - gfx_draw_string_centred(dpi, 3165, x, y - 2, 0, (void*)0x013CE952); + gfx_draw_string_centred(dpi, STR_LAND_TOOL_SIZE_VALUE, x, y - 2, 0, &RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)); } x = w->x + (window_land_widgets[WIDX_PREVIEW].left + window_land_widgets[WIDX_PREVIEW].right) / 2 + 17; diff --git a/src/windows/map.c b/src/windows/map.c index d8d39826bd..6741fecca2 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -798,11 +798,7 @@ static void window_map_paint(rct_window *w, rct_drawpixelinfo *dpi) // Draw land tool size if (widget_is_active_tool(w, WIDX_SET_LAND_RIGHTS) && RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > 7) { - RCT2_GLOBAL(0x009BC677, char) = FORMAT_BLACK; - RCT2_GLOBAL(0x009BC678, char) = FORMAT_COMMA16; - RCT2_GLOBAL(0x009BC679, char) = 0; - RCT2_GLOBAL(0x013CE952, sint16) = RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16); - gfx_draw_string_centred(dpi, 3165, x, y - 2, 0, (void*)0x013CE952); + gfx_draw_string_centred(dpi, STR_LAND_TOOL_SIZE_VALUE, x, y - 2, 0, &RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)); } y = w->y + window_map_widgets[WIDX_LAND_TOOL].bottom + 5; diff --git a/src/windows/tooltip.c b/src/windows/tooltip.c index 6f836cc1a0..c474aaab7e 100644 --- a/src/windows/tooltip.c +++ b/src/windows/tooltip.c @@ -112,24 +112,21 @@ void window_tooltip_open(rct_window *widgetWindow, int widgetIndex, int x, int y char* buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); format_string(buffer, widget->tooltip, (void*)0x013CE952); - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; - - int tooltip_text_width = 0, tooltip_text_height = 0; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = FONT_SPRITE_BASE_MEDIUM; + int tooltip_text_width; tooltip_text_width = gfx_get_string_width_new_lined(buffer); buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); - tooltip_text_width &= 0xFFFF; - if (tooltip_text_width > 196) - tooltip_text_width = 196; + tooltip_text_width = min(tooltip_text_width, 196); - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = FONT_SPRITE_BASE_MEDIUM; - int fontHeight; - tooltip_text_width = gfx_wrap_string(buffer, tooltip_text_width + 1, &tooltip_text_height, &fontHeight); + int numLines, fontSpriteBase; + tooltip_text_width = gfx_wrap_string(buffer, tooltip_text_width + 1, &numLines, &fontSpriteBase); - RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TEXT_HEIGHT, sint16) = tooltip_text_height; + RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TEXT_HEIGHT, sint16) = numLines; width = tooltip_text_width + 3; - height = ((tooltip_text_height + 1) * 10) + 4; + height = ((numLines + 1) * font_get_line_height(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16))) + 4; window_tooltip_widgets[WIDX_BACKGROUND].right = width; window_tooltip_widgets[WIDX_BACKGROUND].bottom = height; @@ -220,6 +217,6 @@ static void window_tooltip_paint(rct_window *w, rct_drawpixelinfo *dpi) // Text left = w->x + ((w->width + 1) / 2) - 1; - top = w->y + 1; + top = w->y + 2; draw_string_centred_raw(dpi, left, top, RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TEXT_HEIGHT, uint16), gTooltip_text_buffer); } \ No newline at end of file diff --git a/src/windows/water.c b/src/windows/water.c index 5b2e4c2a5e..c3e2b7e81d 100644 --- a/src/windows/water.c +++ b/src/windows/water.c @@ -240,11 +240,7 @@ static void window_water_paint(rct_window *w, rct_drawpixelinfo *dpi) window_draw_widgets(w, dpi); // FEATURE larger land tool size support if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > 7) { - RCT2_GLOBAL(0x009BC677, char) = FORMAT_BLACK; - RCT2_GLOBAL(0x009BC678, char) = FORMAT_COMMA16; - RCT2_GLOBAL(0x009BC679, char) = 0; - RCT2_GLOBAL(0x013CE952, sint16) = RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16); - gfx_draw_string_centred(dpi, 3165, x, y - 2, 0, (void*)0x013CE952); + gfx_draw_string_centred(dpi, STR_LAND_TOOL_SIZE_VALUE, x, y - 2, 0, &RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)); } y = w->y + window_water_widgets[WIDX_PREVIEW].bottom + 5; From 7bcb12503a753b316066dc56116185a95ae1c552 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 2 Aug 2015 11:25:26 +0100 Subject: [PATCH 0426/1173] implement utf8, part 24 (bug fixes) --- src/drawing/string.c | 2 +- src/interface/console.c | 162 +++++++++++++++++++------------------ src/interface/console.h | 14 ++-- src/management/news_item.c | 4 +- src/management/news_item.h | 2 +- src/windows/land_rights.c | 6 +- 6 files changed, 95 insertions(+), 95 deletions(-) diff --git a/src/drawing/string.c b/src/drawing/string.c index e9d04a01e1..2c076fef00 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -971,7 +971,7 @@ static void ttf_draw_string_raw_ttf(rct_drawpixelinfo *dpi, const utf8 *text, te TTFFontDescriptor *fontDesc = ttf_get_font_from_sprite_base(info->font_sprite_base); if (fontDesc->font == NULL) { - return ttf_draw_string_raw_sprite(dpi, text, info); + ttf_draw_string_raw_sprite(dpi, text, info); } if (info->flags & TEXT_DRAW_FLAG_NO_DRAW) { diff --git a/src/interface/console.c b/src/interface/console.c index 3c3aaf02af..30107c5762 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -29,17 +29,17 @@ bool gConsoleOpen = false; static bool _consoleInitialised = false; static int _consoleLeft, _consoleTop, _consoleRight, _consoleBottom; static int _lastMainViewportX, _lastMainViewportY; -static char _consoleBuffer[CONSOLE_BUFFER_SIZE] = { 0 }; -static char *_consoleBufferPointer = _consoleBuffer; -static char *_consoleViewBufferStart = _consoleBuffer; -static char _consoleCurrentLine[CONSOLE_INPUT_SIZE]; -static char *_consoleCurrentLinePointer = _consoleCurrentLine; +static utf8 _consoleBuffer[CONSOLE_BUFFER_SIZE] = { 0 }; +static utf8 *_consoleBufferPointer = _consoleBuffer; +static utf8 *_consoleViewBufferStart = _consoleBuffer; +static utf8 _consoleCurrentLine[CONSOLE_INPUT_SIZE]; +static utf8 *_consoleCurrentLinePointer = _consoleCurrentLine; static int _consoleCaretTicks; -static char _consolePrintfBuffer[CONSOLE_BUFFER_2_SIZE]; -static char _consoleErrorBuffer[CONSOLE_BUFFER_2_SIZE]; +static utf8 _consolePrintfBuffer[CONSOLE_BUFFER_2_SIZE]; +static utf8 _consoleErrorBuffer[CONSOLE_BUFFER_2_SIZE]; static int _consoleScrollPos = 0; -static char _consoleHistory[CONSOLE_HISTORY_SIZE][CONSOLE_INPUT_SIZE]; +static utf8 _consoleHistory[CONSOLE_HISTORY_SIZE][CONSOLE_INPUT_SIZE]; static int _consoleHistoryIndex = 0; static int _consoleHistoryCount = 0; @@ -47,14 +47,14 @@ static void console_invalidate(); static void console_write_prompt(); static void console_update_scroll(); static void console_clear_input(); -static void console_history_add(const char *src); +static void console_history_add(const utf8 *src); static void console_write_all_commands(); -static int console_parse_int(const char *src, bool *valid); -static double console_parse_double(const char *src, bool *valid); +static int console_parse_int(const utf8 *src, bool *valid); +static double console_parse_double(const utf8 *src, bool *valid); -static int cc_variables(const char **argv, int argc); -static int cc_windows(const char **argv, int argc); -static int cc_help(const char **argv, int argc); +static int cc_variables(const utf8 **argv, int argc); +static int cc_windows(const utf8 **argv, int argc); +static int cc_help(const utf8 **argv, int argc); static bool invalidArguments(bool *invalid, bool arguments); @@ -121,12 +121,7 @@ void console_update() } // Remove unwated characters in console input - unsigned char *ch = (unsigned char*)_consoleCurrentLine; - while (*ch != 0) { - if (*ch < 32 || *ch > 126) - *ch = ' '; - ch++; - } + utf8_remove_format_codes(_consoleCurrentLine); } // Flash the caret @@ -137,19 +132,21 @@ void console_draw(rct_drawpixelinfo *dpi) { if (!gConsoleOpen) return; + + // Set font + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = (gConfigInterface.console_small_font ? FONT_SPRITE_BASE_SMALL : FONT_SPRITE_BASE_MEDIUM); + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16) = 0; + int lineHeight = font_get_line_height(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16)); + int lines = 0; - int maxLines = ((_consoleBottom - 22 - _consoleTop) / 10) - 1; - char *ch = strchr(_consoleBuffer, 0); + int maxLines = ((_consoleBottom - 22 - _consoleTop) / lineHeight) - 1; + utf8 *ch = strchr(_consoleBuffer, 0); while (ch > _consoleBuffer) { ch--; if (*ch == '\n') lines++; } - // Set font - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = (gConfigInterface.console_small_font ? 0 : 224); - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16) = 0; - // Background gfx_fill_rect(dpi, _consoleLeft, _consoleTop, _consoleRight, _consoleBottom, 10); @@ -157,13 +154,13 @@ void console_draw(rct_drawpixelinfo *dpi) int y = _consoleTop + 4; // Draw previous lines - char lineBuffer[1 + 256]; + utf8 lineBuffer[2 + 256], *lineCh; ch = _consoleViewBufferStart; int currentLine = 0; int drawLines = 0; while (*ch != 0) { // Find line break or null terminator - char *nextLine = ch; + utf8 *nextLine = ch; while (*nextLine != 0 && *nextLine != '\n') { nextLine++; } @@ -173,7 +170,7 @@ void console_draw(rct_drawpixelinfo *dpi) if (*nextLine == '\n') { ch = nextLine + 1; x = _consoleLeft + 4; - //y += 10; + // y += lineHeight; } else { break; @@ -185,10 +182,11 @@ void console_draw(rct_drawpixelinfo *dpi) break; drawLines++; - int lineLength = min(sizeof(lineBuffer) - 1, nextLine - ch); - strncpy(lineBuffer + 1, ch, lineLength); - lineBuffer[0] = FORMAT_GREEN; - lineBuffer[1 + lineLength] = 0; + int lineLength = min(sizeof(lineBuffer) - (size_t)utf8_get_codepoint_length(FORMAT_GREEN), (size_t)(nextLine - ch)); + lineCh = lineBuffer; + lineCh = utf8_write_codepoint(lineCh, FORMAT_GREEN); + strncpy(lineCh, ch, lineLength); + lineCh[lineLength] = 0; gfx_draw_string(dpi, lineBuffer, 255, x, y); @@ -197,16 +195,18 @@ void console_draw(rct_drawpixelinfo *dpi) if (*nextLine == '\n') { ch = nextLine + 1; x = _consoleLeft + 4; - y += 10; + y += lineHeight; } else { break; } } x = _consoleLeft + 4; y = _consoleBottom - 15; + // Draw current line - strcpy(lineBuffer + 1, _consoleCurrentLine); - lineBuffer[0] = FORMAT_GREEN; + lineCh = lineBuffer; + lineCh = utf8_write_codepoint(lineCh, FORMAT_GREEN); + strcpy(lineCh, _consoleCurrentLine); gfx_draw_string(dpi, lineBuffer, 255, x, y); // Draw caret @@ -214,7 +214,7 @@ void console_draw(rct_drawpixelinfo *dpi) memcpy(lineBuffer, _consoleCurrentLine, gTextInputCursorPosition); lineBuffer[gTextInputCursorPosition] = 0; int caretX = x + gfx_get_string_width(lineBuffer); - int caretY = y + 10; + int caretY = y + lineHeight; gfx_fill_rect(dpi, caretX, caretY, caretX + 6, caretY + 1, FORMAT_GREEN); } @@ -273,7 +273,7 @@ static void console_write_prompt() console_write("> "); } -void console_write(const char *src) +void console_write(const utf8 *src) { int charactersRemainingInBuffer = CONSOLE_BUFFER_SIZE - (_consoleBufferPointer - _consoleBuffer) - 1; int charactersToWrite = strlen(src); @@ -287,27 +287,27 @@ void console_write(const char *src) console_update_scroll(); } -void console_writeline(const char *src) +void console_writeline(const utf8 *src) { console_write(src); console_write("\n"); } -void console_writeline_error(const char *src) +void console_writeline_error(const utf8 *src) { strcpy(_consoleErrorBuffer + 1, src); _consoleErrorBuffer[0] = FORMAT_RED; console_writeline(_consoleErrorBuffer); } -void console_writeline_warning(const char *src) +void console_writeline_warning(const utf8 *src) { strcpy(_consoleErrorBuffer + 1, src); _consoleErrorBuffer[0] = FORMAT_YELLOW; console_writeline(_consoleErrorBuffer); } -void console_printf(const char *format, ...) +void console_printf(const utf8 *format, ...) { va_list list; va_start(list, format); @@ -316,15 +316,15 @@ void console_printf(const char *format, ...) console_writeline(_consolePrintfBuffer); } -int console_parse_int(const char *src, bool *valid) { - char *end; +int console_parse_int(const utf8 *src, bool *valid) { + utf8 *end; int value; value = strtol(src, &end, 10); *valid = (*end == '\0'); return value; } -double console_parse_double(const char *src, bool *valid) { - char *end; +double console_parse_double(const utf8 *src, bool *valid) { + utf8 *end; double value; value = strtod(src, &end); *valid = (*end == '\0'); return value; @@ -351,7 +351,7 @@ void console_scroll(int delta) int speed = 3; int lines = 0; int maxLines = ((_consoleBottom - 22 - _consoleTop) / 10) - 1; - char *ch = strchr(_consoleBuffer, 0); + utf8 *ch = strchr(_consoleBuffer, 0); while (ch > _consoleBuffer) { ch--; if (*ch == '\n') @@ -390,7 +390,7 @@ static void console_clear_input() gTextInputLength = 0; } -static void console_history_add(const char *src) +static void console_history_add(const utf8 *src) { if (_consoleHistoryCount >= CONSOLE_HISTORY_SIZE) { for (int i = 0; i < _consoleHistoryCount - 1; i++) @@ -401,26 +401,26 @@ static void console_history_add(const char *src) _consoleHistoryIndex = _consoleHistoryCount; } -static int cc_clear(const char **argv, int argc) +static int cc_clear(const utf8 **argv, int argc) { console_clear(); return 0; } -static int cc_hide(const char **argv, int argc) +static int cc_hide(const utf8 **argv, int argc) { console_close(); return 0; } -static int cc_echo(const char **argv, int argc) +static int cc_echo(const utf8 **argv, int argc) { if (argc > 0) console_writeline(argv[0]); return 0; } -static int cc_get(const char **argv, int argc) +static int cc_get(const utf8 **argv, int argc) { if (argc > 0) { if (strcmp(argv[0], "park_rating") == 0) { @@ -496,7 +496,7 @@ static int cc_get(const char **argv, int argc) console_printf("construction_rights_cost %d.%d0", RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCTION_RIGHTS_COST, money32) / 10, RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCTION_RIGHTS_COST, money32) % 10); } else if (strcmp(argv[0], "climate") == 0) { - const char* climate_names[] = { "cool_and_wet", "warm", "hot_and_dry", "cold" }; + const utf8* climate_names[] = { "cool_and_wet", "warm", "hot_and_dry", "cold" }; console_printf("climate %s (%d)", climate_names[RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, sint8)], RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, sint8)); } else if (strcmp(argv[0], "game_speed") == 0) { @@ -533,7 +533,7 @@ static int cc_get(const char **argv, int argc) } return 0; } -static int cc_set(const char **argv, int argc) +static int cc_set(const utf8 **argv, int argc) { int i; if (argc > 1) { @@ -639,7 +639,7 @@ static int cc_set(const char **argv, int argc) RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, sint8) = clamp(int_val[0], 0, 3); } else { - char* climate_names[] = { "cool_and_wet", "warm", "hot_and_dry", "cold" }; + utf8* climate_names[] = { "cool_and_wet", "warm", "hot_and_dry", "cold" }; for (i = 0; i < 4; i++) { if (strcmp(argv[1], climate_names[i]) == 0) { RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, sint8) = i; @@ -697,7 +697,7 @@ static int cc_set(const char **argv, int argc) } return 0; } -static int cc_twitch(const char **argv, int argc) +static int cc_twitch(const utf8 **argv, int argc) { #ifdef DISABLE_TWITCH console_writeline_error("OpenRCT2 build not compiled with Twitch integeration."); @@ -706,6 +706,7 @@ static int cc_twitch(const char **argv, int argc) #endif return 0; } + static void editor_load_selected_objects_console() { uint8 *selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); @@ -729,13 +730,13 @@ static void editor_load_selected_objects_console() } } -static int cc_load_object(const char **argv, int argc) { +static int cc_load_object(const utf8 **argv, int argc) { if (argc > 0) { - char path[260]; + utf8 path[260]; subsitute_path(path, RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), argv[0]); // Require pointer to start of filename - char* last_char = path + strlen(path); + utf8* last_char = path + strlen(path); strcat(path, ".DAT\0"); rct_object_entry entry; @@ -815,8 +816,8 @@ static int cc_load_object(const char **argv, int argc) { return 0; } -static int cc_object_count(const char **argv, int argc) { - const char* object_type_names[] = { "Rides", "Small scenery", "Large scenery", "Walls", "Banners", "Paths", "Path Additions", "Scenery groups", "Park entrances", "Water" }; +static int cc_object_count(const utf8 **argv, int argc) { + const utf8* object_type_names[] = { "Rides", "Small scenery", "Large scenery", "Walls", "Banners", "Paths", "Path Additions", "Scenery groups", "Park entrances", "Water" }; for (int i = 0; i < 10; i++) { int entryGroupIndex = 0; @@ -830,7 +831,7 @@ static int cc_object_count(const char **argv, int argc) { return 0; } -static int cc_open(const char **argv, int argc) { +static int cc_open(const utf8 **argv, int argc) { if (argc > 0) { bool title = (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) != 0; bool invalidTitle = false; @@ -858,15 +859,15 @@ static int cc_open(const char **argv, int argc) { } -typedef int (*console_command_func)(const char **argv, int argc); +typedef int (*console_command_func)(const utf8 **argv, int argc); typedef struct { - char *command; + utf8 *command; console_command_func func; - char *help; - char *usage; + utf8 *help; + utf8 *usage; } console_command; -char* console_variable_table[] = { +utf8* console_variable_table[] = { "park_rating", "money", "current_loan", @@ -895,7 +896,7 @@ char* console_variable_table[] = { "no_test_crashes", "location" }; -char* console_window_table[] = { +utf8* console_window_table[] = { "object_selection", "inventions_list", "scenario_options", @@ -922,19 +923,19 @@ console_command console_command_table[] = { { "twitch", cc_twitch, "Twitch API" } }; -static int cc_windows(const char **argv, int argc) { +static int cc_windows(const utf8 **argv, int argc) { for (int i = 0; i < countof(console_window_table); i++) console_writeline(console_window_table[i]); return 0; } -static int cc_variables(const char **argv, int argc) +static int cc_variables(const utf8 **argv, int argc) { for (int i = 0; i < countof(console_variable_table); i++) console_writeline(console_variable_table[i]); return 0; } -static int cc_help(const char **argv, int argc) +static int cc_help(const utf8 **argv, int argc) { if (argc > 0) { for (int i = 0; i < countof(console_command_table); i++) { @@ -956,20 +957,20 @@ static void console_write_all_commands() console_writeline(console_command_table[i].command); } -void console_execute(const char *src) +void console_execute(const utf8 *src) { console_writeline(src); console_execute_silent(src); } -void console_execute_silent(const char *src) +void console_execute_silent(const utf8 *src) { int argc = 0; int argvCapacity = 8; - char **argv = malloc(argvCapacity * sizeof(char*)); - const char *start = src; - const char *end; + utf8 **argv = malloc(argvCapacity * sizeof(utf8*)); + const utf8 *start = src; + const utf8 *end; bool inQuotes = false; do { while (*start == ' ') @@ -994,13 +995,13 @@ void console_execute_silent(const char *src) int length = end - start; if (length > 0) { - char *arg = malloc(length + 1); + utf8 *arg = malloc(length + 1); memcpy(arg, start, length); arg[length] = 0; if (argc >= argvCapacity) { argvCapacity *= 2; - argv = realloc(argv, argvCapacity * sizeof(char*)); + argv = realloc(argv, argvCapacity * sizeof(utf8*)); } argv[argc] = arg; argc++; @@ -1030,7 +1031,10 @@ void console_execute_silent(const char *src) free(argv); if (!validCommand) { - char output[] = { FORMAT_RED, "Unknown command. Type help to list available commands." }; + utf8 output[128]; + utf8 *dst = output; + dst = utf8_write_codepoint(dst, FORMAT_RED); + strcpy(dst, "Unknown command. Type help to list available commands."); console_writeline(output); } } diff --git a/src/interface/console.h b/src/interface/console.h index 3c11077edb..82c7870eac 100644 --- a/src/interface/console.h +++ b/src/interface/console.h @@ -14,13 +14,13 @@ void console_update(); void console_draw(rct_drawpixelinfo *dpi); void console_input(int c); -void console_write(const char *src); -void console_writeline(const char *src); -void console_writeline_error(const char *src); -void console_writeline_warning(const char *src); -void console_printf(const char *format, ...); -void console_execute(const char *src); -void console_execute_silent(const char *src); +void console_write(const utf8 *src); +void console_writeline(const utf8 *src); +void console_writeline_error(const utf8 *src); +void console_writeline_warning(const utf8 *src); +void console_printf(const utf8 *format, ...); +void console_execute(const utf8 *src); +void console_execute_silent(const utf8 *src); void console_clear(); void console_clear_line(); void console_refresh_caret(); diff --git a/src/management/news_item.c b/src/management/news_item.c index 7ab8e76c10..d077920471 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -297,14 +297,14 @@ void news_item_get_subject_location(int type, int subject, int *x, int *y, int * **/ void news_item_add_to_queue(uint8 type, rct_string_id string_id, uint32 assoc) { - char *buffer = (char*)0x0141EF68; + utf8 *buffer = (char*)0x0141EF68; void *args = (void*)0x013CE952; format_string(buffer, string_id, args); // overflows possible? news_item_add_to_queue_raw(type, buffer, assoc); } -void news_item_add_to_queue_raw(uint8 type, const char *text, uint32 assoc) +void news_item_add_to_queue_raw(uint8 type, const utf8 *text, uint32 assoc) { int i = 0; rct_news_item *newsItem = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); diff --git a/src/management/news_item.h b/src/management/news_item.h index e1ed3b2f87..1b37077606 100644 --- a/src/management/news_item.h +++ b/src/management/news_item.h @@ -58,7 +58,7 @@ void news_item_update_current(); void news_item_close_current(); void news_item_get_subject_location(int type, int subject, int *x, int *y, int *z); void news_item_add_to_queue(uint8 type, rct_string_id string_id, uint32 assoc); -void news_item_add_to_queue_raw(uint8 type, const char *text, uint32 assoc); +void news_item_add_to_queue_raw(uint8 type, const utf8 *text, uint32 assoc); void news_item_open_subject(int type, int subject); void news_item_disable_news(uint8 type, uint32 assoc); rct_news_item *news_item_get(int index); diff --git a/src/windows/land_rights.c b/src/windows/land_rights.c index 4585068c18..186502a332 100644 --- a/src/windows/land_rights.c +++ b/src/windows/land_rights.c @@ -237,11 +237,7 @@ static void window_land_rights_paint(rct_window *w, rct_drawpixelinfo *dpi) window_draw_widgets(w, dpi); // FEATURE larger land tool size support if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > 7) { - RCT2_GLOBAL(0x009BC677, char) = FORMAT_BLACK; - RCT2_GLOBAL(0x009BC678, char) = FORMAT_COMMA16; - RCT2_GLOBAL(0x009BC679, char) = 0; - RCT2_GLOBAL(0x013CE952, sint16) = RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16); - gfx_draw_string_centred(dpi, 3165, x, y - 2, 0, (void*)0x013CE952); + gfx_draw_string_centred(dpi, STR_LAND_TOOL_SIZE_VALUE, x, y - 2, 0, &RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)); } y = w->y + window_land_rights_widgets[WIDX_PREVIEW].bottom + 5; From 33929d3ac440ead484e9bc8f6b435bae808149aa Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 3 Aug 2015 14:29:05 +0100 Subject: [PATCH 0427/1173] implement utf8, part 25 (bug fixes) --- src/localisation/language.c | 2 +- src/openrct2.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/localisation/language.c b/src/localisation/language.c index fd0deb5070..edb8538eda 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -375,7 +375,7 @@ static utf8 *convert_multibyte_charset(const char *src, int languageId) codepoint = convert_specific_language_character_to_unicode(languageId, codepoint); dst = utf8_write_codepoint(dst, codepoint); } else { - *dst++ = *ch++; + dst = utf8_write_codepoint(dst, *ch++); } } *dst++ = 0; diff --git a/src/openrct2.c b/src/openrct2.c index c6f10dbabe..da1f3cad48 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -194,7 +194,7 @@ bool openrct2_initialise() addhook(0x006BB76E, (int)sound_play_panned, 0, (int[]){EAX, EBX, ECX, EDX, EBP, END}, EAX, 0); // remove when all callers are decompiled addhook(0x006C42D9, (int)scrolling_text_setup, 0, (int[]){EAX, ECX, EBP, END}, 0, EBX); // remove when all callers are decompiled addhook(0x006C2321, (int)gfx_get_string_width, 0, (int[]){ESI, END}, 0, ECX); // remove when all callers are decompiled - addhook(0x006C2321, (int)format_string, 0, (int[]){EDI, EAX, ECX, END}, 0, 0); // remove when all callers are decompiled + addhook(0x006C2555, (int)format_string, 0, (int[]){EDI, EAX, ECX, END}, 0, 0); // remove when all callers are decompiled if (!rct2_init()) return false; From 3c1190e11fa09836fb6431fa171dbaaf17238f6d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 3 Aug 2015 18:06:54 +0100 Subject: [PATCH 0428/1173] implement utf8, part 26 (bug fixes) --- src/drawing/drawing.h | 1 + src/drawing/string.c | 42 +++++++++++++++++++++++++++++++++++++- src/interface/viewport.c | 44 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 85 insertions(+), 2 deletions(-) diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 11f8199a9e..280f48073f 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -133,6 +133,7 @@ void gfx_draw_string_right(rct_drawpixelinfo *dpi, int format, void *args, int c void draw_string_right_underline(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y); int string_get_height_raw(char *buffer); void gfx_draw_string_centred_wrapped_partial(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct_string_id format, void *args, int ticks); +void gfx_draw_string_with_y_offsets(rct_drawpixelinfo *dpi, utf8 *text, int colour, int x, int y, const sint8 *yOffsets); bool ttf_initialise(); void ttf_dispose(); diff --git a/src/drawing/string.c b/src/drawing/string.c index 2c076fef00..79474eab7e 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -924,6 +924,7 @@ TTFFontDescriptor *ttf_get_font_from_sprite_base(uint16 spriteBase) enum { TEXT_DRAW_FLAG_INSET = 1 << 0, TEXT_DRAW_FLAG_OUTLINE = 1 << 1, + TEXT_DRAW_FLAG_Y_OFFSET_EFFECT = 1 << 29, TEXT_DRAW_FLAG_TTF = 1 << 30, TEXT_DRAW_FLAG_NO_DRAW = 1 << 31 }; @@ -938,6 +939,7 @@ typedef struct { int flags; uint8 palette[8]; uint16 font_sprite_base; + const sint8 *y_offset; } text_draw_info; static void ttf_draw_character_sprite(rct_drawpixelinfo *dpi, int codepoint, text_draw_info *info) @@ -948,7 +950,13 @@ static void ttf_draw_character_sprite(rct_drawpixelinfo *dpi, int codepoint, tex if (!(info->flags & TEXT_DRAW_FLAG_NO_DRAW)) { RCT2_GLOBAL(0x009ABDA4, uint8*) = (uint8*)&info->palette; RCT2_GLOBAL(0x00EDF81C, uint32) = (IMAGE_TYPE_USE_PALETTE << 28); - gfx_draw_sprite_palette_set(dpi, sprite, info->x, info->y, info->palette, NULL); + + int x = info->x; + int y = info->y; + if (info->flags & TEXT_DRAW_FLAG_Y_OFFSET_EFFECT) { + y += *info->y_offset++; + } + gfx_draw_sprite_palette_set(dpi, sprite, x, y, info->palette, NULL); } info->x += characterWidth; @@ -972,6 +980,7 @@ static void ttf_draw_string_raw_ttf(rct_drawpixelinfo *dpi, const utf8 *text, te TTFFontDescriptor *fontDesc = ttf_get_font_from_sprite_base(info->font_sprite_base); if (fontDesc->font == NULL) { ttf_draw_string_raw_sprite(dpi, text, info); + return; } if (info->flags & TEXT_DRAW_FLAG_NO_DRAW) { @@ -1301,3 +1310,34 @@ static int ttf_get_string_width(const utf8 *text) return info.maxX; } + +/** + * + * rct2: 0x00682F28 + */ +void gfx_draw_string_with_y_offsets(rct_drawpixelinfo *dpi, utf8 *text, int colour, int x, int y, const sint8 *yOffsets) +{ + text_draw_info info; + info.font_sprite_base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + info.flags = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); + info.startX = x; + info.startY = x; + info.x = x; + info.y = y; + info.y_offset = yOffsets; + + info.flags |= TEXT_DRAW_FLAG_Y_OFFSET_EFFECT; + + // if (gUseTrueTypeFont) info.flags |= TEXT_DRAW_FLAG_TTF; + + memcpy(info.palette, text_palette, sizeof(info.palette)); + ttf_process_initial_colour(colour, &info); + ttf_process_string(dpi, text, &info); + memcpy(text_palette, info.palette, sizeof(info.palette)); + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = info.font_sprite_base; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16) = info.flags; + + gLastDrawStringX = info.x; + gLastDrawStringY = info.y; +} diff --git a/src/interface/viewport.c b/src/interface/viewport.c index ef6475f160..184f41ed4c 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1990,6 +1990,48 @@ void sub_688217() sub_688217_helper(eax & 0xFFFF, 0); } +typedef struct paint_string_struct paint_string_struct; +struct paint_string_struct { + rct_string_id string_id; // 0x00 + paint_string_struct *next; // 0x02 + uint16 x; // 0x06 + uint16 y; // 0x08 + uint8 args[16]; // 0x0A + uint8 *y_offsets; // 0x1A +}; + +static void draw_pixel_info_crop_by_zoom(rct_drawpixelinfo *dpi) +{ + int zoom = dpi->zoom_level; + dpi->zoom_level = 0; + dpi->x >>= zoom; + dpi->y >>= zoom; + dpi->width >>= zoom; + dpi->height >>= zoom; +} + +/** + * + * rct2:0x006860C3 + */ +static void viewport_draw_money_effects() +{ + utf8 buffer[256]; + + paint_string_struct *ps = RCT2_GLOBAL(0x00F1AD20, paint_string_struct*); + if (ps == NULL) + return; + + rct_drawpixelinfo dpi = *(RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*)); + draw_pixel_info_crop_by_zoom(&dpi); + + do { + format_string(buffer, ps->string_id, &ps->args); + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = FONT_SPRITE_BASE_MEDIUM; + gfx_draw_string_with_y_offsets(&dpi, buffer, 0, ps->x, ps->y, ps->y_offsets); + } while ((ps = ps->next) != NULL); +} + /** * * rct2:0x00685CBF @@ -2087,7 +2129,7 @@ void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, in if ((weather_colour != -1) && (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & 0x4000)) && (!(RCT2_GLOBAL(0x9DEA6F, uint8) & 1))){ gfx_fill_rect(dpi2, dpi2->x, dpi2->y, dpi2->width + dpi2->x - 1, dpi2->height + dpi2->y - 1, weather_colour); } - RCT2_CALLPROC_EBPSAFE(0x6860C3); //string related + viewport_draw_money_effects(); } } From 36c5179b3981aa138616ccbe5205fd81e45ba5ca Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 3 Aug 2015 18:40:16 +0100 Subject: [PATCH 0429/1173] implement utf8, part 27 (tweak tooltips) --- src/localisation/language.c | 2 +- src/windows/tooltip.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/localisation/language.c b/src/localisation/language.c index edb8538eda..a4751f09e9 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -53,7 +53,7 @@ enum { static TTFFontSetDescriptor TTFFontMingliu = {{ { "msjh.ttc", 9, -1, -3, 6, NULL }, - { "mingliu.ttc", 11, 1, 0, 12, NULL }, + { "mingliu.ttc", 11, 1, 1, 12, NULL }, { "mingliu.ttc", 12, 1, 0, 12, NULL }, { "mingliu.ttc", 13, 1, 0, 20, NULL }, }}; diff --git a/src/windows/tooltip.c b/src/windows/tooltip.c index c474aaab7e..378f6b6e20 100644 --- a/src/windows/tooltip.c +++ b/src/windows/tooltip.c @@ -217,6 +217,6 @@ static void window_tooltip_paint(rct_window *w, rct_drawpixelinfo *dpi) // Text left = w->x + ((w->width + 1) / 2) - 1; - top = w->y + 2; + top = w->y + 1; draw_string_centred_raw(dpi, left, top, RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TEXT_HEIGHT, uint16), gTooltip_text_buffer); } \ No newline at end of file From cac0f2ab52ef8657a4859aa4a05ff25e18df2a0a Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 3 Aug 2015 23:16:30 +0100 Subject: [PATCH 0430/1173] upgrade to VS2015 compiler --- projects/language/language.vcxproj | 6 +++--- projects/libs/libs.vcxproj | 6 +++--- projects/openrct2.vcxproj | 6 +++--- src/audio/audio.c | 1 - src/audio/mixer.cpp | 5 +---- src/cmdline_sprite.c | 5 ++--- src/drawing/scrolling_text.c | 1 - src/drawing/string.c | 1 - src/openrct2.c | 14 ++++++++++++++ src/platform/platform.h | 2 ++ src/platform/shared.c | 14 -------------- src/rct2.h | 6 ++++++ src/windows/options.c | 1 - src/world/mapgen.c | 4 ---- 14 files changed, 34 insertions(+), 38 deletions(-) diff --git a/projects/language/language.vcxproj b/projects/language/language.vcxproj index 232d4f6509..fe2b874ec2 100644 --- a/projects/language/language.vcxproj +++ b/projects/language/language.vcxproj @@ -22,20 +22,20 @@ Utility true - v120 + v140 MultiByte Utility false - v120 + v140 true MultiByte Utility false - v120 + v140 true MultiByte diff --git a/projects/libs/libs.vcxproj b/projects/libs/libs.vcxproj index 5a518056a2..3229d76be9 100644 --- a/projects/libs/libs.vcxproj +++ b/projects/libs/libs.vcxproj @@ -22,20 +22,20 @@ StaticLibrary true - v120 + v140 MultiByte StaticLibrary false - v120 + v140 true MultiByte StaticLibrary false - v120 + v140 true MultiByte diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 0a6c0becc1..156eefd8f4 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -284,20 +284,20 @@ DynamicLibrary true - v120 + v140 MultiByte DynamicLibrary false - v120 + v140 true MultiByte DynamicLibrary false - v120 + v140 true MultiByte diff --git a/src/audio/audio.c b/src/audio/audio.c index 8dc38f7744..1c8779ad40 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -18,7 +18,6 @@ * along with this program. If not, see . *****************************************************************************/ -#include #include "../addresses.h" #include "../config.h" #include "../interface/viewport.h" diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index 17dc692d4f..4927d5ea9e 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -18,14 +18,11 @@ * along with this program. If not, see . *****************************************************************************/ -#include -#include - extern "C" { #include "../config.h" #include "../platform/platform.h" - #include "audio.h" #include "../localisation/localisation.h" + #include "audio.h" } #include "mixer.h" diff --git a/src/cmdline_sprite.c b/src/cmdline_sprite.c index 12691d8709..01990e7b9f 100644 --- a/src/cmdline_sprite.c +++ b/src/cmdline_sprite.c @@ -1,5 +1,4 @@ #include -#include #include "cmdline.h" #include "drawing/drawing.h" #include "platform/platform.h" @@ -433,7 +432,7 @@ int cmdline_for_sprite(const char **argv, int argc) printf("height: %d\n", g1->height); printf("x offset: %d\n", g1->x_offset); printf("y offset: %d\n", g1->y_offset); - printf("data offset: 0x%X\n", g1->offset); + printf("data offset: 0x%X\n", (uint32)g1->offset); sprite_file_close(); return 1; @@ -648,7 +647,7 @@ int cmdline_for_sprite(const char **argv, int argc) } while (file != NULL); - fprintf(stderr, "Finished\n", imagePath); + fprintf(stderr, "Finished\n"); return 1; } else { fprintf(stderr, "Unknown sprite command."); diff --git a/src/drawing/scrolling_text.c b/src/drawing/scrolling_text.c index 8932a9e8f3..ec2a71ba75 100644 --- a/src/drawing/scrolling_text.c +++ b/src/drawing/scrolling_text.c @@ -1,4 +1,3 @@ -#include #include "../addresses.h" #include "../config.h" #include "../localisation/localisation.h" diff --git a/src/drawing/string.c b/src/drawing/string.c index 79474eab7e..d42b7a6a00 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -18,7 +18,6 @@ * along with this program. If not, see . *****************************************************************************/ -#include #include "../addresses.h" #include "../localisation/localisation.h" #include "../sprites.h" diff --git a/src/openrct2.c b/src/openrct2.c index da1f3cad48..d0142abcfe 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -392,3 +392,17 @@ void openrct2_reset_object_tween_locations() _spritelocations1[i].z = _spritelocations2[i].z = g_sprite_list[i].unknown.z; } } + +#if _MSC_VER >= 1900 +/** + * Temporary fix for libraries not compiled with VS2015 + */ +FILE **__iob_func() +{ + static FILE* streams[3]; + streams[0] = stdin; + streams[1] = stdout; + streams[2] = stderr; + return streams; +} +#endif diff --git a/src/platform/platform.h b/src/platform/platform.h index 685e057af3..9cb61afb41 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -21,6 +21,8 @@ #ifndef _PLATFORM_H_ #define _PLATFORM_H_ +#define HAVE_MATH_H + #include #include "../common.h" diff --git a/src/platform/shared.c b/src/platform/shared.c index c267291d62..053dc00040 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -18,8 +18,6 @@ * along with this program. If not, see . *****************************************************************************/ -#include -#include #include "../addresses.h" #include "../config.h" #include "../cursors.h" @@ -791,18 +789,6 @@ static void platform_load_cursors() RCT2_GLOBAL(0x14241BC, uint32) = 0; } -/** - * - * rct2: 0x00407D80 - */ -int platform_get_cursor_pos(int* x, int* y) -{ - POINT point; - GetCursorPos(&point); - *x = point.x; - *y = point.y; -} - void platform_refresh_video() { int width = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); diff --git a/src/rct2.h b/src/rct2.h index c1279de446..3fed27792a 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -21,8 +21,14 @@ #ifndef _RCT2_H_ #define _RCT2_H_ +#ifndef _USE_MATH_DEFINES + #define _USE_MATH_DEFINES +#endif +#undef M_PI + #include #include +#include #include #include #include diff --git a/src/windows/options.c b/src/windows/options.c index 31c6ce51a4..e2f1229606 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -26,7 +26,6 @@ * Padding between the widgets and the window needs reducing, an artifact from originally being inside group boxes. */ -#include #include "../addresses.h" #include "../audio/audio.h" #include "../audio/mixer.h" diff --git a/src/world/mapgen.c b/src/world/mapgen.c index b71fd3c6ca..d6364dfd0c 100644 --- a/src/world/mapgen.c +++ b/src/world/mapgen.c @@ -18,10 +18,6 @@ * along with this program. If not, see . *****************************************************************************/ -#ifndef _USE_MATH_DEFINES - #define _USE_MATH_DEFINES -#endif -#include #include #include "../addresses.h" #include "../object.h" From 59e710f806b34f9b9085b996920f2e80cc9e3c6b Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 4 Aug 2015 02:08:39 +0100 Subject: [PATCH 0431/1173] fix #1709 --- src/ride/ride.c | 14 ++++++----- src/ride/ride.h | 54 +++++++++++++++++++++++++++++++++++++++ src/ride/ride_data.c | 60 ++++++++++++++++++++++++++++++++++++++++++++ src/ride/ride_data.h | 2 ++ 4 files changed, 124 insertions(+), 6 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 87ec7617ce..ddfc76a9bd 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4961,15 +4961,17 @@ foundRideEntry: ride->price = RCT2_GLOBAL(0x0097D4F0 + 0 + (ride->type * 8), uint8); ride->price_secondary = RCT2_GLOBAL(0x0097D4F0 + 1 + (ride->type * 8), uint8); - if (rideEntry->shop_item != 255) { - ride->price = RCT2_ADDRESS(0x00982358, money8)[rideEntry->shop_item]; + if (rideEntry->shop_item == 255) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY)) { + ride->price = 0; + } + } else { + ride->price = DefaultShopItemPrice[rideEntry->shop_item]; } if (rideEntry->shop_item_secondary != 255) { - ride->price = RCT2_ADDRESS(0x00982358, money8)[rideEntry->shop_item_secondary]; - } - if (rideEntry->shop_item == 255 && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY)) { - ride->price = 0; + ride->price_secondary = DefaultShopItemPrice[rideEntry->shop_item_secondary]; } + if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) == OBJECTIVE_BUILD_THE_BEST) { ride->price = 0; } diff --git a/src/ride/ride.h b/src/ride/ride.h index 7f2d567faa..14c20dc0b6 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -791,6 +791,60 @@ enum { RIDE_SET_VEHICLES_COMMAND_TYPE_RIDE_ENTRY }; +enum { + SHOP_ITEM_BALLOON, + SHOP_ITEM_TOY, + SHOP_ITEM_MAP, + SHOP_ITEM_PHOTO, + SHOP_ITEM_UMBRELLA, + SHOP_ITEM_DRINK, + SHOP_ITEM_BURGER, + SHOP_ITEM_FRIES, + SHOP_ITEM_ICE_CREAM, + SHOP_ITEM_COTTON_CANDY, + SHOP_ITEM_EMPTY_CAN, + SHOP_ITEM_RUBBISH, + SHOP_ITEM_EMPTY_BURGER_BOX, + SHOP_ITEM_PIZZA, + SHOP_ITEM_VOUCHER, + SHOP_ITEM_POPCORN, + SHOP_ITEM_HOT_DOG, + SHOP_ITEM_TENTACLE, + SHOP_ITEM_HAT, + SHOP_ITEM_CANDY_APPLE, + SHOP_ITEM_TSHIRT, + SHOP_ITEM_DONUT, + SHOP_ITEM_COFFEE, + SHOP_ITEM_EMPTY_CUP, + SHOP_ITEM_CHICKEN, + SHOP_ITEM_LEMONADE, + SHOP_ITEM_EMPTY_BOX, + SHOP_ITEM_EMPTY_BOTTLE, + SHOP_ITEM_PHOTO2 = 32, + SHOP_ITEM_PHOTO3, + SHOP_ITEM_PHOTO4, + SHOP_ITEM_PRETZEL, + SHOP_ITEM_CHOCOLATE, + SHOP_ITEM_ICED_TEA, + SHOP_ITEM_FUNNEL_CAKE, + SHOP_ITEM_SUNGLASSES, + SHOP_ITEM_BEEF_NOODLES, + SHOP_ITEM_FRIED_RICE_NOODLES, + SHOP_ITEM_WONTON_SOUP, + SHOP_ITEM_MEATBALL_SOUP, + SHOP_ITEM_FRUIT_JUICE, + SHOP_ITEM_SOYBEAN_MILK, + SHOP_ITEM_SU_JONGKWA, + SHOP_ITEM_SUB_SANDWICH, + SHOP_ITEM_COOKIE, + SHOP_ITEM_EMPTY_BOWL_RED, + SHOP_ITEM_EMPTY_DRINK_CARTON, + SHOP_ITEM_EMPTY_JUICE_CUP, + SHOP_ITEM_ROAST_SAUSAGE, + SHOP_ITEM_EMPTY_BOWL_BLUE, + SHOP_ITEM_COUNT = 56 +}; + #define MAX_RIDES 255 #define MAX_RIDE_MEASUREMENTS 8 diff --git a/src/ride/ride_data.c b/src/ride/ride_data.c index 6a4962793b..abfdeb6ce6 100644 --- a/src/ride/ride_data.c +++ b/src/ride/ride_data.c @@ -975,3 +975,63 @@ const uint8 RideLiftHillAdjustments[0x60] = { 5, // Mine Ride 4 // LIM Launched Roller Coaster }; + +// rct2: 0x00982358 +const money8 DefaultShopItemPrice[SHOP_ITEM_COUNT] = { + MONEY(0,90), // SHOP_ITEM_BALLOON + MONEY(2,50), // SHOP_ITEM_TOY + MONEY(0,60), // SHOP_ITEM_MAP + MONEY(0,00), // SHOP_ITEM_PHOTO + MONEY(2,50), // SHOP_ITEM_UMBRELLA + MONEY(1,20), // SHOP_ITEM_DRINK + MONEY(1,50), // SHOP_ITEM_BURGER + MONEY(1,50), // SHOP_ITEM_FRIES + MONEY(0,90), // SHOP_ITEM_ICE_CREAM + MONEY(0,80), // SHOP_ITEM_COTTON_CANDY + MONEY(0,00), // SHOP_ITEM_EMPTY_CAN + MONEY(0,00), // SHOP_ITEM_RUBBISH + MONEY(0,00), // SHOP_ITEM_EMPTY_BURGER_BOX + MONEY(1,60), // SHOP_ITEM_PIZZA + MONEY(0,00), // SHOP_ITEM_VOUCHER + MONEY(1,20), // SHOP_ITEM_POPCORN + MONEY(1,00), // SHOP_ITEM_HOT_DOG + MONEY(1,50), // SHOP_ITEM_TENTACLE + MONEY(1,50), // SHOP_ITEM_HAT + MONEY(0,70), // SHOP_ITEM_CANDY_APPLE + MONEY(3,00), // SHOP_ITEM_TSHIRT + MONEY(0,70), // SHOP_ITEM_DONUT + MONEY(1,20), // SHOP_ITEM_COFFEE + MONEY(0,00), // SHOP_ITEM_EMPTY_CUP + MONEY(1,50), // SHOP_ITEM_CHICKEN + MONEY(1,20), // SHOP_ITEM_LEMONADE + MONEY(0,00), // SHOP_ITEM_EMPTY_BOX + MONEY(0,00), // SHOP_ITEM_EMPTY_BOTTLE + MONEY(0,00), // 28 + MONEY(0,00), // 29 + MONEY(0,00), // 30 + MONEY(0,00), // 31 + MONEY(0,00), // SHOP_ITEM_PHOTO2 + MONEY(0,00), // SHOP_ITEM_PHOTO3 + MONEY(0,00), // SHOP_ITEM_PHOTO4 + MONEY(1,10), // SHOP_ITEM_PRETZEL + MONEY(1,20), // SHOP_ITEM_CHOCOLATE + MONEY(1,10), // SHOP_ITEM_ICED_TEA + MONEY(1,20), // SHOP_ITEM_FUNNEL_CAKE + MONEY(1,50), // SHOP_ITEM_SUNGLASSES + MONEY(1,50), // SHOP_ITEM_BEEF_NOODLES + MONEY(1,50), // SHOP_ITEM_FRIED_RICE_NOODLES + MONEY(1,50), // SHOP_ITEM_WONTON_SOUP + MONEY(1,50), // SHOP_ITEM_MEATBALL_SOUP + MONEY(1,20), // SHOP_ITEM_FRUIT_JUICE + MONEY(1,20), // SHOP_ITEM_SOYBEAN_MILK + MONEY(1,20), // SHOP_ITEM_SU_JONGKWA + MONEY(1,50), // SHOP_ITEM_SUB_SANDWICH + MONEY(0,70), // SHOP_ITEM_COOKIE + MONEY(0,00), // SHOP_ITEM_EMPTY_BOWL_RED + MONEY(0,00), // SHOP_ITEM_EMPTY_DRINK_CARTON + MONEY(0,00), // SHOP_ITEM_EMPTY_JUICE_CUP + MONEY(1,50), // SHOP_ITEM_ROAST_SAUSAGE + MONEY(0,00), // SHOP_ITEM_EMPTY_BOWL_BLUE + MONEY(0,00), // 54 + MONEY(0,00), // 55 +}; diff --git a/src/ride/ride_data.h b/src/ride/ride_data.h index f4173d6547..4a9076faaf 100644 --- a/src/ride/ride_data.h +++ b/src/ride/ride_data.h @@ -51,4 +51,6 @@ extern const uint8 RideAvailableBreakdowns[]; extern const rct_ride_entrance_definition RideEntranceDefinitions[12]; extern const uint8 RideLiftHillAdjustments[0x60]; +extern const money8 DefaultShopItemPrice[SHOP_ITEM_COUNT]; + #endif From f25ab8e9f3f4326725cba4768a64c30f798a486e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 4 Aug 2015 02:12:17 +0100 Subject: [PATCH 0432/1173] fix #1715 --- src/windows/track_list.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/windows/track_list.c b/src/windows/track_list.c index 3288317456..f6135bd588 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -264,7 +264,13 @@ static void window_track_list_mouseup(rct_window *w, int widgetIndex) break; case WIDX_BACK: window_close(w); - window_new_ride_open(); + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { + window_close_by_number(WC_MANAGE_TRACK_DESIGN, w->number); + window_close_by_number(WC_TRACK_DELETE_PROMPT, w->number); + trackmanager_load(); + } else { + window_new_ride_open(); + } break; } } From ca0e63f1a152aae07f1ac055c246dba82600e804 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 4 Aug 2015 02:28:05 +0100 Subject: [PATCH 0433/1173] fix #1598 --- src/ride/track.c | 2 +- src/windows/ride_construction.c | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index acb55157ec..eaf7daf3e2 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3638,7 +3638,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in RCT2_GLOBAL(0x00F44060, void*) = &clearance_struct; - if (!gCheatsDisableClearanceChecks || flags & (1 << 6)){ + if (!gCheatsDisableClearanceChecks) { if (!map_can_construct_with_clear_at(x, y, baseZ, clearanceZ, (void*)0x006C5A5F, bl)) return MONEY32_UNDEFINED; } diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 1a112ae70e..f5934a231c 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -20,6 +20,7 @@ #include "../addresses.h" #include "../audio/audio.h" +#include "../cheats.h" #include "../drawing/drawing.h" #include "../game.h" #include "../input.h" @@ -3449,7 +3450,11 @@ void ride_construction_tooldown_construct(int screenX, int screenY) trackBlock++; } while (trackBlock->index != 255); z -= bx; - z -= 16; + + // FIX not sure exactly why it starts trial and error place from a lower Z, but it causes issues with disable clearance + if (!gCheatsDisableClearanceChecks) { + z -= 16; + } } else { z = RCT2_GLOBAL(0x00F44163, uint16); } From b5237e24ec30318c422eecf8355efd01d2511bfc Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 4 Aug 2015 15:21:12 +0100 Subject: [PATCH 0434/1173] improve #1703 --- projects/libs/libs.vcxproj | 1 + src/addresses.h | 58 +++++++++++ src/peep/peep.c | 206 ++++++++++++++++++------------------- src/peep/peep.h | 9 +- src/util/util.c | 11 ++ src/util/util.h | 1 + 6 files changed, 177 insertions(+), 109 deletions(-) diff --git a/projects/libs/libs.vcxproj b/projects/libs/libs.vcxproj index 3229d76be9..e39d321bdf 100644 --- a/projects/libs/libs.vcxproj +++ b/projects/libs/libs.vcxproj @@ -84,6 +84,7 @@ libcurl.lib;Ws2_32.lib;SDL2_ttf.lib;%(AdditionalDependencies) + true Powershell -NonInteractive -ExecutionPolicy "ByPass" -File "$(ProjectDir)../../pre-build.ps1" diff --git a/src/addresses.h b/src/addresses.h index 4e108201ba..7254456cc2 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -830,4 +830,62 @@ static int RCT2_CALLFUNC_X(int address, int *_eax, int *_ebx, int *_ecx, int *_e #endif } +typedef struct { + union { + int eax; + short ax; + struct { + char al; + char ah; + }; + }; + union { + int ebx; + short bx; + struct { + char bl; + char bh; + }; + }; + union { + int ecx; + short cx; + struct { + char cl; + char ch; + }; + }; + union { + int edx; + short dx; + struct { + char dl; + char dh; + }; + }; + union { + int esi; + short si; + }; + union { + int edi; + short di; + }; + union { + int ebp; + short bp; + }; +} registers; + +static int RCT2_CALLFUNC_Y(int address, registers *inOut) +{ + return RCT2_CALLFUNC_X(address, &inOut->eax, &inOut->ebx, &inOut->ecx, &inOut->edx, &inOut->esi, &inOut->edi, &inOut->ebp); +} + +static int RCT2_CALLFUNC_Z(int address, const registers *in, registers *out) +{ + *out = *in; + return RCT2_CALLFUNC_Y(address, out); +} + #endif diff --git a/src/peep/peep.c b/src/peep/peep.c index bad060091f..3d52effbcf 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -38,6 +38,16 @@ #include "peep.h" #include "staff.h" +enum { + PATH_SEARCH_DEAD_END, + PATH_SEARCH_RIDE_EXIT, + PATH_SEARCH_RIDE_ENTRANCE, + PATH_SEARCH_3, + PATH_SEARCH_PARK_EXIT, + PATH_SEARCH_LIMIT_REACHED, + PATH_SEARCH_WIDE, +}; + static void sub_68F41A(rct_peep *peep, int index); static void peep_update(rct_peep *peep); static int peep_has_empty_container(rct_peep* peep); @@ -68,6 +78,8 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType); static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFlags); static void peep_give_real_name(rct_peep *peep); static int guest_surface_path_finding(rct_peep* peep); +static void peep_read_map(rct_peep *peep); +static bool peep_heading_for_ride_or_park_exit(rct_peep *peep); const char *gPeepEasterEggNames[] = { "MICHAEL SCHUMACHER", @@ -6724,7 +6736,7 @@ static uint8 loc_6949B9( rct_map_element *mapElement; int direction; - if (level > 25) return 5; + if (level > 25) return PATH_SEARCH_LIMIT_REACHED; x += TileDirectionDelta[chosenDirection].x; y += TileDirectionDelta[chosenDirection].y; @@ -6739,7 +6751,7 @@ static uint8 loc_6949B9( rct_ride *ride = GET_RIDE(rideIndex); if (RCT2_GLOBAL(0x0097CF40 + (ride->type * 8), uint32) & 0x20000) { *outRideIndex = rideIndex; - return 2; + return PATH_SEARCH_RIDE_ENTRANCE; } break; case MAP_ELEMENT_TYPE_ENTRANCE: @@ -6749,23 +6761,23 @@ static uint8 loc_6949B9( direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; if (direction == chosenDirection) { *outRideIndex = mapElement->properties.entrance.ride_index; - return 2; + return PATH_SEARCH_RIDE_ENTRANCE; } break; case ENTRANCE_TYPE_RIDE_EXIT: direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; if (direction == chosenDirection) { *outRideIndex = mapElement->properties.entrance.ride_index; - return 1; + return PATH_SEARCH_RIDE_EXIT; } break; case ENTRANCE_TYPE_PARK_ENTRANCE: - return 4; + return PATH_SEARCH_PARK_EXIT; } break; case MAP_ELEMENT_TYPE_PATH: if (!is_valid_path_z_and_direction(mapElement, z, chosenDirection)) continue; - if (!(mapElement->type & 2)) return 6; + if (footpath_element_is_wide(mapElement)) return PATH_SEARCH_WIDE; uint8 edges = mapElement->properties.path.edges; rct_map_element *bannerElement = get_banner_on_path(mapElement); @@ -6782,7 +6794,7 @@ static uint8 loc_6949B9( if (!(edges & (1 << direction))) continue; edges &= ~(1 << direction); - if (edges != 0) return 3; + if (edges != 0) return PATH_SEARCH_3; if (footpath_element_is_sloped(mapElement)) { if (footpath_element_get_slope_direction(mapElement) == direction) { @@ -6794,7 +6806,7 @@ static uint8 loc_6949B9( } } while (!map_element_is_last_for_tile(mapElement++)); - return 0; + return PATH_SEARCH_DEAD_END; } /** @@ -6804,7 +6816,7 @@ static uint8 loc_6949B9( * 2 - ride entrance * 4 - park entrance / exit * 5 - search limit reached - * 6 - (path->type & 2)? + * 6 - wide path * rct2: 0x006949A4 */ static uint8 sub_6949A4(sint16 x, sint16 y, sint16 z, rct_map_element *inputMapElement, uint8 chosenDirection, uint8 *outRideIndex) @@ -7174,55 +7186,40 @@ static void get_ride_queue_end(sint16 *x, sint16 *y, sint16 *z, sint16 dist){ } /* rct2: 0x00694C35 */ -static int guest_path_finding(rct_peep* peep){ +static int guest_path_finding(rct_peep* peep) +{ sint16 x, y, z; - if (peep->next_var_29 & 0x18){ + + if (peep->next_var_29 & 0x18) { return guest_surface_path_finding(peep); } - x = peep->next_x; y = peep->next_y; z = peep->next_z; - bool found = false; - rct_map_element *mapElement = map_get_first_element_at(x / 32, y / 32); - do{ - if (z != mapElement->base_height) - continue; - - if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) - continue; - - found = true; - break; - } while (!map_element_is_last_for_tile(mapElement++)); - - if (!found){ + rct_map_element *mapElement = map_get_path_element_at(x / 32, y / 32, z); + if (mapElement == NULL) { return 1; } uint8 edges = mapElement->properties.path.edges; rct_map_element *bannerElement = get_banner_on_path(mapElement); - if (bannerElement != NULL){ - do{ + if (bannerElement != NULL) { + do { edges &= bannerElement->properties.banner.flags; } while ((bannerElement = get_banner_on_path(bannerElement)) != NULL); } - edges &= 0xF; - - if (peep->var_2A == 0 && - (peep->guest_heading_to_ride_id == 0xFF || - peep->flags & PEEP_FLAGS_LEAVING_PARK)){ + edges &= 0x0F; + if (peep->var_2A == 0 && peep_heading_for_ride_or_park_exit(peep)) { uint8 adjustedEdges = edges; - uint8 chosenDirection = 0; - for (; chosenDirection < 4; ++chosenDirection){ + for (int chosenDirection = 0; chosenDirection < 4; chosenDirection++) { // If there is no path in that direction try another if (!(adjustedEdges & (1 << chosenDirection))) continue; - if (sub_694BAE(peep->next_x, peep->next_y, peep->next_z, mapElement, chosenDirection) == 6){ + if (sub_694BAE(peep->next_x, peep->next_y, peep->next_z, mapElement, chosenDirection) == 6) { adjustedEdges &= ~(1 << chosenDirection); } } @@ -7230,79 +7227,68 @@ static int guest_path_finding(rct_peep* peep){ edges = adjustedEdges; } - if (edges == 0) + if (edges == 0) { return guest_surface_path_finding(peep); + } sint8 direction = peep->var_78 ^ (1 << 1); - if (!(edges & ~(1 << direction))){ + if (!(edges & ~(1 << direction))) { peep_check_if_lost(peep); peep_check_cant_find_ride(peep); peep_check_cant_find_exit(peep); - } - else{ + } else { edges &= ~(1 << direction); } direction = bitscanforward(edges); // IF only one edge to choose from - if ((edges & ~(1 << direction)) == 0){ + if ((edges & ~(1 << direction)) == 0) { return peep_move_one_tile(direction, peep); } - //694F19 + // loc_694F19: if (peep->var_2A != 0){ - if (peep->state == PEEP_STATE_ENTERING_PARK){ + switch (peep->state) { + case PEEP_STATE_ENTERING_PARK: return guest_path_find_entering_park(peep, mapElement, edges); - } - else if (peep->state == PEEP_STATE_LEAVING_PARK){ + case PEEP_STATE_LEAVING_PARK: return guest_path_find_leaving_park(peep, mapElement, edges); + default: + return guest_path_find_aimless(peep, edges); } - return guest_path_find_aimless(peep, edges); } - if (!peep_has_food(peep) && - (scenario_rand()&0xFFFF) >= 2184){ - + if (!peep_has_food(peep) && (scenario_rand() & 0xFFFF) >= 2184) { uint8 adjustedEdges = edges; - uint8 chosenDirection = 0; - for (; chosenDirection < 4; ++chosenDirection){ + for (int chosenDirection = 0; chosenDirection < 4; chosenDirection++) { // If there is no path in that direction try another if (!(adjustedEdges & (1 << chosenDirection))) continue; - uint8 rideIndex; - uint8 al = sub_6949A4(peep->next_x, peep->next_y, peep->next_z, mapElement, chosenDirection, &rideIndex); - if (al == 6 || al <= 1){ + uint8 rideIndex, pathSearchResult; + pathSearchResult = sub_6949A4(peep->next_x, peep->next_y, peep->next_z, mapElement, chosenDirection, &rideIndex); + switch (pathSearchResult) { + case PATH_SEARCH_DEAD_END: + case PATH_SEARCH_RIDE_EXIT: + case PATH_SEARCH_WIDE: adjustedEdges &= ~(1 << chosenDirection); + break; } } if (adjustedEdges != 0) edges = adjustedEdges; } - if (peep->item_standard_flags & PEEP_ITEM_MAP){ + if (peep->item_standard_flags & PEEP_ITEM_MAP) { // If at least 2 directions consult map - direction = bitscanforward(edges); - if (direction != -1){ - uint8 edges2 = edges & ~(1 << direction); - if (bitscanforward(edges2) != -1){ - - uint16 probability = 1638; - if ((peep->flags & PEEP_FLAGS_LEAVING_PARK) || - peep->guest_heading_to_ride_id == 0xFF){ - probability = 9362; - } - - if ((scenario_rand() & 0xFFFF) < probability){ - if (peep->action >= PEEP_ACTION_NONE_1){ - peep->action = PEEP_ACTION_READ_MAP; - peep->action_frame = 0; - peep->action_sprite_image_offset = 0; - sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); - } - } + if (bitcount(edges) >= 2) { + uint16 probability = 1638; + if (peep_heading_for_ride_or_park_exit(peep)) { + probability = 9362; + } + if ((scenario_rand() & 0xFFFF) < probability) { + peep_read_map(peep); } } } @@ -7349,11 +7335,13 @@ static int guest_path_finding(rct_peep* peep){ if (closestStationNum == 4) closestStationNum = 0; - if (RCT2_GLOBAL(0x00F1AEBC, uint32) != 4){ - if (ride->depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS && + if (RCT2_GLOBAL(0x00F1AEBC, uint32) != 4) { + if ( + (ride->depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS) && ride->num_stations == 2 && ride->entrances[0] != 0xFFFF && - ride->entrances[1] != 0xFFFF){ + ride->entrances[1] != 0xFFFF + ) { closestStationNum = 0; if (peep->no_of_rides & 1) closestStationNum++; @@ -7378,8 +7366,8 @@ static int guest_path_finding(rct_peep* peep){ get_ride_queue_end(&x, &y, &z, closestDist); RCT2_GLOBAL(0x00F1AECE, sint16) = x; - RCT2_GLOBAL(0x00F1AECE, sint16) = y; - RCT2_GLOBAL(0x00F1AECE, uint8) = (uint8)z; + RCT2_GLOBAL(0x00F1AED0, sint16) = y; + RCT2_GLOBAL(0x00F1AED2, uint8) = (uint8)z; RCT2_GLOBAL(0x00F1AEE0, uint8) = 1; direction = sub_69A5F0(peep->next_x, peep->next_y, peep->next_z, peep, mapElement); @@ -8135,7 +8123,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) { rct_ride *ride; - if (peep->state == PEEP_STATE_WALKING) return; + if (peep->state != PEEP_STATE_WALKING) return; if (peep->guest_heading_to_ride_id != 255) return; if (peep->flags & PEEP_FLAGS_LEAVING_PARK) return; if (peep_has_food(peep)) return; @@ -8150,15 +8138,15 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) RCT2_GLOBAL(0x00F1ADB0, uint32) = 0; RCT2_GLOBAL(0x00F1ADB4, uint32) = 0; - // TODO Check for a toy is likely a mistake and should be a map, + // FIX Originally checked for a toy, likely a mistake and should be a map, // but then again this seems to only allow the peep to go on // rides they haven't been on before. - if (peep->item_standard_flags & PEEP_ITEM_TOY) { + if (peep->item_standard_flags & PEEP_ITEM_MAP) { // Consider rides that peep hasn't been on yet int i; FOR_ALL_RIDES(i, ride) { if (!peep_has_ridden(peep, i)) { - RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= i & 0x1F; + RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= (1 << (i & 0x1F)); } } } else { @@ -8173,7 +8161,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; int rideIndex = mapElement->properties.track.ride_index; - RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (rideIndex & 0x1F); + RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (1 << (rideIndex & 0x1F)); } while (!map_element_is_last_for_tile(mapElement++)); } } @@ -8186,7 +8174,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) if (ride->excitement == (ride_rating)0xFFFF) continue; if (ride->highest_drop_height <= 66 && ride->excitement < RIDE_RATING(8,00)) continue; - RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= i & 0x1F; + RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= (1 << (i & 0x1F)); } } @@ -8195,7 +8183,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) uint8 *nextPotentialRide = potentialRides; int numPotentialRides = 0; for (int i = 0; i < MAX_RIDES; i++) { - if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (i & 0x1F))) + if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (1 << (i & 0x1F)))) continue; rct_ride *ride = GET_RIDE(i); @@ -8235,13 +8223,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) // Make peep look at their map if they have one if (peep->item_standard_flags & PEEP_ITEM_MAP) { - if (peep->action == PEEP_ACTION_NONE_1 || peep->action == PEEP_ACTION_NONE_2) { - peep->action = PEEP_ACTION_READ_MAP; - peep->action_frame = 0; - peep->action_sprite_image_offset = 0; - sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); - } + peep_read_map(peep); } } @@ -8274,13 +8256,13 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) RCT2_GLOBAL(0x00F1ADB0, uint32) = 0; RCT2_GLOBAL(0x00F1ADB4, uint32) = 0; - // TODO Check for a toy is likely a mistake and should be a map - if ((peep->item_standard_flags & PEEP_ITEM_TOY) && rideType != RIDE_TYPE_FIRST_AID) { + // FIX Originally checked for a toy,.likely a mistake and should be a map + if ((peep->item_standard_flags & PEEP_ITEM_MAP) && rideType != RIDE_TYPE_FIRST_AID) { // Consider all rides in the park int i; FOR_ALL_RIDES(i, ride) { if (ride->type == rideType) { - RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= i & 0x1F; + RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= (1 << (i & 0x1F)); } } } else { @@ -8297,7 +8279,7 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) int rideIndex = mapElement->properties.track.ride_index; ride = GET_RIDE(rideIndex); if (ride->type == rideType) { - RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (rideIndex & 0x1F); + RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (1 << (rideIndex & 0x1F)); } } while (!map_element_is_last_for_tile(mapElement++)); } @@ -8310,7 +8292,7 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) uint8 *nextPotentialRide = potentialRides; int numPotentialRides = 0; for (int i = 0; i < MAX_RIDES; i++) { - if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (i & 0x1F))) + if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (1 << (i & 0x1F)))) continue; rct_ride *ride = GET_RIDE(i); @@ -8386,13 +8368,13 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl RCT2_GLOBAL(0x00F1ADB0, uint32) = 0; RCT2_GLOBAL(0x00F1ADB4, uint32) = 0; - // TODO Check for a toy is likely a mistake and should be a map - if (peep->item_standard_flags & PEEP_ITEM_TOY) { + // FIX Originally checked for a toy,.likely a mistake and should be a map + if (peep->item_standard_flags & PEEP_ITEM_MAP) { // Consider all rides in the park int i; FOR_ALL_RIDES(i, ride) { if (RCT2_ADDRESS(0x0097CF40, uint32)[ride->type * 2] & rideTypeFlags) { - RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= i & 0x1F; + RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= (1 << (i & 0x1F)); } } } else { @@ -8409,7 +8391,7 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl int rideIndex = mapElement->properties.track.ride_index; ride = GET_RIDE(rideIndex); if (RCT2_ADDRESS(0x0097CF40, uint32)[ride->type * 2] & rideTypeFlags) { - RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (rideIndex & 0x1F); + RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (1 << (rideIndex & 0x1F)); } } while (!map_element_is_last_for_tile(mapElement++)); } @@ -8422,7 +8404,7 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl uint8 *nextPotentialRide = potentialRides; int numPotentialRides = 0; for (int i = 0; i < MAX_RIDES; i++) { - if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (i & 0x1F))) + if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (1 << (i & 0x1F)))) continue; rct_ride *ride = GET_RIDE(i); @@ -8527,3 +8509,19 @@ void peep_update_names(bool realNames) gfx_invalidate_screen(); } } + +static void peep_read_map(rct_peep *peep) +{ + if (peep->action == PEEP_ACTION_NONE_1 || peep->action == PEEP_ACTION_NONE_2) { + peep->action = PEEP_ACTION_READ_MAP; + peep->action_frame = 0; + peep->action_sprite_image_offset = 0; + sub_693B58(peep); + invalidate_sprite((rct_sprite*)peep); + } +} + +static bool peep_heading_for_ride_or_park_exit(rct_peep *peep) +{ + return (peep->flags & PEEP_FLAGS_LEAVING_PARK) || peep->guest_heading_to_ride_id != 0xFF; +} diff --git a/src/peep/peep.h b/src/peep/peep.h index 2eea21800e..d06e802d81 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -468,12 +468,11 @@ typedef struct { uint16 previous_ride_time_out; // 0xAE rct_peep_thought thoughts[PEEP_MAX_THOUGHTS]; // 0xB0 uint8 var_C4; // 0xC4 - union // 0xC5 - { - uint8 staff_id; - uint8 guest_heading_to_ride_id; + union { + uint8 staff_id; // 0xC5 + uint8 guest_heading_to_ride_id; // 0xC5 }; - union{ + union { uint8 staff_orders; // 0xC6 uint8 var_C6; }; diff --git a/src/util/util.c b/src/util/util.c index b015c1c98f..72420b55b2 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -160,6 +160,17 @@ int bitscanforward(int source) return -1; } +int bitcount(int source) +{ + int result = 0; + for (int i = 0; i < 32; i++) { + if (source & (1 << i)) { + result++; + } + } + return result; +} + bool strequals(const char *a, const char *b, int length, bool caseInsensitive) { return caseInsensitive ? diff --git a/src/util/util.h b/src/util/util.h index 18e594d741..2723404a2a 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -37,6 +37,7 @@ long fsize(FILE *fp); bool readentirefile(const char *path, void **outBuffer, long *outLength); int bitscanforward(int source); +int bitcount(int source); bool strequals(const char *a, const char *b, int length, bool caseInsensitive); int strcicmp(char const *a, char const *b); From 2419c6629e4d8cf277416ea5f406aee754cf3186 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 4 Aug 2015 16:01:31 +0100 Subject: [PATCH 0435/1173] improve clear scenery tool --- src/localisation/string_ids.h | 2 ++ src/world/map.c | 34 ++++++++++++++++++++++++++-------- src/world/map.h | 1 + 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index cf642ed4b1..be7173a251 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -661,6 +661,8 @@ enum { STR_CANT_OPEN_PARK = 1723, STR_CANT_CLOSE_PARK = 1724, + STR_LAND_NOT_OWNED_BY_PARK = 1729, + STR_BANNER_TEXT = 1731, STR_RIDE_CONSTRUCTION_BUILD = 1732, diff --git a/src/world/map.c b/src/world/map.c index 1fe979725a..3a19955f70 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -822,7 +822,7 @@ int map_is_location_owned(int x, int y, int z) } } - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 1729; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_LAND_NOT_OWNED_BY_PARK; return 0; } @@ -840,10 +840,22 @@ int map_is_location_in_park(int x, int y) return 1; } - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 1729; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_LAND_NOT_OWNED_BY_PARK; return 0; } +bool map_is_location_owned_or_has_rights(int x, int y) +{ + rct_map_element *mapElement; + + if (x < (256 * 32) && y < (256 * 32)) { + mapElement = map_get_surface_element_at(x / 32, y / 32); + if (mapElement->properties.surface.ownership & OWNERSHIP_OWNED) return true; + if (mapElement->properties.surface.ownership & OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED) return true; + } + return false; +} + /** * * rct2: 0x006E0E01 @@ -1446,6 +1458,7 @@ money32 map_clear_scenery(int x0, int y0, int x1, int y1, int flags) { int x, y, z; money32 totalCost, cost; + bool noValidTiles; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; @@ -1461,18 +1474,23 @@ money32 map_clear_scenery(int x0, int y0, int x1, int y1, int flags) x1 = min(x1, RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16)); y1 = min(y1, RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16)); + noValidTiles = true; totalCost = 0; for (y = y0; y <= y1; y += 32) { for (x = x0; x <= x1; x += 32) { - cost = map_clear_scenery_from_tile(x / 32, y / 32, flags); - if (cost == MONEY32_UNDEFINED) - return MONEY32_UNDEFINED; - - totalCost += cost; + if (gCheatsSandboxMode || map_is_location_owned_or_has_rights(x, y)) { + cost = map_clear_scenery_from_tile(x / 32, y / 32, flags); + if (cost != MONEY32_UNDEFINED) { + noValidTiles = false; + totalCost += cost; + } + } else { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_LAND_NOT_OWNED_BY_PARK; + } } } - return totalCost; + return noValidTiles ? MONEY32_UNDEFINED : totalCost; } /** diff --git a/src/world/map.h b/src/world/map.h index 790306c521..f163b82969 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -287,6 +287,7 @@ int map_coord_is_connected(int x, int y, int z, uint8 faceDirection); void sub_6A876D(); int map_is_location_owned(int x, int y, int z); int map_is_location_in_park(int x, int y); +bool map_is_location_owned_or_has_rights(int x, int y); bool map_surface_is_blocked(sint16 x, sint16 y); int map_get_station(rct_map_element *mapElement); void map_element_remove(rct_map_element *mapElement); From 1fc7c0ecacf38eac6fffc6703ade69385a0ec161 Mon Sep 17 00:00:00 2001 From: danidoedel Date: Tue, 4 Aug 2015 17:56:12 +0200 Subject: [PATCH 0436/1173] fix recent messages toolbar tooltip --- data/language/english_uk.txt | 1 + src/localisation/string_ids.h | 2 ++ src/windows/top_toolbar.c | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 4f323a14c7..5916143e27 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3823,3 +3823,4 @@ STR_5483 :{BLACK}({COMMA16} weeks remaining) STR_5484 :{BLACK}({COMMA16} week remaining) STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} +STR_5487 :{SMALLFONT}{BLACK}Show recent messages diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index be7173a251..1e7b21fd80 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1829,6 +1829,8 @@ enum { STR_LAND_TOOL_SIZE_VALUE = 5486, + STR_SHOW_RECENT_MESSAGES_TIP = 5487, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index b7c2b493d3..ed1e58b86b 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -176,7 +176,7 @@ static rct_widget window_top_toolbar_widgets[] = { { WWT_TRNBTN, 0, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_DEBUG_TIP }, // Debug { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 3235 }, // Finances { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 2275 }, // Research - { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 2522 }, // News + { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_SHOW_RECENT_MESSAGES_TIP }, // News { WWT_EMPTY, 0, 0, 10-1, 0, 0, 0xFFFFFFFF, STR_NONE }, // Artificial widget separator { WIDGETS_END }, From 9ec701345f7f35b008f59d4f8ffaf4d23ac28377 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 4 Aug 2015 17:40:02 +0100 Subject: [PATCH 0437/1173] fix #1724 --- src/windows/tile_inspector.c | 18 ++++++++---- src/world/footpath.c | 55 ++++++++++++++++++++++++++++++------ 2 files changed, 59 insertions(+), 14 deletions(-) diff --git a/src/windows/tile_inspector.c b/src/windows/tile_inspector.c index 54fac90b7a..c04026e863 100644 --- a/src/windows/tile_inspector.c +++ b/src/windows/tile_inspector.c @@ -313,12 +313,20 @@ static void window_tile_inspector_scrollpaint(rct_window *w, rct_drawpixelinfo * uint8 pathType, pathDirection; pathType = element->properties.path.type >> 2; pathDirection = element->properties.path.type & 3; + if (footpath_element_is_queue(element)) { + sprintf( + buffer, + "Queue for (%d)", + element->properties.path.ride_index + ); + } else { + sprintf( + buffer, + "Path (%s)", + "" // TODO: queue? has bins? has benches? e.t.c. + ); + } } - sprintf( - buffer, - "Path (%s)", - "" // TODO: queue? has bins? has benches? e.t.c. - ); type_name = buffer; break; case MAP_ELEMENT_TYPE_TRACK: diff --git a/src/world/footpath.c b/src/world/footpath.c index 5523cb401b..0fd76eeddb 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -814,6 +814,7 @@ static void footpath_connect_corners(int initialX, int initialY, rct_map_element typedef struct { uint8 order; uint8 direction; + uint8 ride_index; } rct_neighbour; typedef struct { @@ -841,10 +842,11 @@ static void neighbour_list_init(rct_neighbour_list *neighbourList) neighbourList->count = 0; } -static void neighbour_list_push(rct_neighbour_list *neighbourList, int order, int direction) +static void neighbour_list_push(rct_neighbour_list *neighbourList, int order, int direction, uint8 rideIndex) { neighbourList->items[neighbourList->count].order = order; neighbourList->items[neighbourList->count].direction = direction; + neighbourList->items[neighbourList->count].ride_index = rideIndex; neighbourList->count++; } @@ -860,6 +862,15 @@ static bool neighbour_list_pop(rct_neighbour_list *neighbourList, rct_neighbour return true; } +static void neighbour_list_remove(rct_neighbour_list *neighbourList, int index) +{ + int itemsRemaining = neighbourList->count - index - 1; + if (itemsRemaining > 0) { + memmove(&neighbourList->items[index], &neighbourList->items[index + 1], sizeof(rct_neighbour) * itemsRemaining); + } + neighbourList->count--; +} + static void neighbour_list_sort(rct_neighbour_list *neighbourList) { qsort(neighbourList->items, neighbourList->count, sizeof(rct_neighbour), rct_neighbour_compare); @@ -946,6 +957,20 @@ static bool footpath_disconnect_queue_from_path(int x, int y, rct_map_element *m return false; } +static bool footpath_is_queue_connected_to_path(int x, int y, rct_map_element *mapElement, int direction) +{ + if (!footpath_element_is_queue(mapElement)) return false; + if (!(mapElement->properties.path.edges & (1 << direction))) return false; + + x += TileDirectionDelta[direction].x; + y += TileDirectionDelta[direction].y; + mapElement = map_get_path_element_at(x / 32, y / 32, mapElement->base_height); + if (mapElement == NULL) return false; + if (footpath_element_is_queue(mapElement)) return false; + if (mapElement->properties.path.edges & ((1 << direction) ^ 2)) return true; + return false; +} + /** * * rct2: 0x006A6D7E @@ -958,7 +983,7 @@ static void loc_6A6D7E( int y = initialY + TileDirectionDelta[direction].y; if (((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gCheatsSandboxMode) && map_is_edge(x, y)) { if (query) { - neighbour_list_push(neighbourList, 7, direction); + neighbour_list_push(neighbourList, 7, direction, 255); } } else { rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); @@ -994,7 +1019,7 @@ static void loc_6A6D7E( return; } if (query) { - neighbour_list_push(neighbourList, 1, direction); + neighbour_list_push(neighbourList, 1, direction, mapElement->properties.track.ride_index); } goto loc_6A6FD2; } @@ -1003,7 +1028,7 @@ static void loc_6A6D7E( if (z == mapElement->base_height) { if (entrance_has_direction(mapElement, ((direction - mapElement->type) & 3) ^ 2)) { if (query) { - neighbour_list_push(neighbourList, 8, direction); + neighbour_list_push(neighbourList, 8, direction, mapElement->properties.entrance.ride_index); } else { if (mapElement->properties.entrance.type != ENTRANCE_TYPE_PARK_ENTRANCE) { sub_6A76E9(mapElement->properties.entrance.ride_index); @@ -1024,17 +1049,17 @@ static void loc_6A6D7E( } if (footpath_element_is_queue(mapElement)) { if (RCT2_ADDRESS(0x0098D7F0, uint8)[mapElement->properties.path.edges & 0x0F] < 2) { - neighbour_list_push(neighbourList, 3, direction); + neighbour_list_push(neighbourList, 4, direction, mapElement->properties.path.ride_index); } else { if (map_element_get_type(initialMapElement) == MAP_ELEMENT_TYPE_PATH && footpath_element_is_queue(initialMapElement)) { if (footpath_disconnect_queue_from_path(x, y, mapElement, 0)) { - neighbour_list_push(neighbourList, 3, direction); + neighbour_list_push(neighbourList, 3, direction, mapElement->properties.path.ride_index); } } } } else { - neighbour_list_push(neighbourList, 2, direction); + neighbour_list_push(neighbourList, 2, direction, 255); } } else { footpath_disconnect_queue_from_path(x, y, mapElement, 1 + ((flags >> 6) & 1)); @@ -1110,6 +1135,8 @@ void footpath_connect_edges(int x, int y, rct_map_element *mapElement, int flags rct_neighbour_list neighbourList; rct_neighbour neighbour; + sub_6A759F(); + neighbour_list_init(&neighbourList); sub_6A7642(x, y, mapElement); @@ -1119,8 +1146,18 @@ void footpath_connect_edges(int x, int y, rct_map_element *mapElement, int flags neighbour_list_sort(&neighbourList); - if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH - && footpath_element_is_queue(mapElement)) { + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH && footpath_element_is_queue(mapElement)) { + int rideIndex = -1; + for (int i = 0; i < neighbourList.count; i++) { + if (neighbourList.items[i].ride_index != 255) { + if (rideIndex == -1) { + rideIndex = neighbourList.items[i].ride_index; + } else if (rideIndex != neighbourList.items[i].ride_index) { + neighbour_list_remove(&neighbourList, i); + } + } + } + neighbourList.count = min(neighbourList.count, 2); } From 7afb7e2dfd1ae8a62499e371e6b0eda8b27fa429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 4 Aug 2015 00:57:51 +0200 Subject: [PATCH 0438/1173] Portability fixes --- src/cmdline_sprite.c | 8 ++++---- src/platform/shared.c | 2 +- src/rct1.c | 25 ++++++++++--------------- src/ride/track.c | 12 ++++++------ src/windows/loadsave.c | 10 +++++----- src/world/mapgen.c | 8 +------- 6 files changed, 27 insertions(+), 38 deletions(-) diff --git a/src/cmdline_sprite.c b/src/cmdline_sprite.c index 01990e7b9f..3d1c8497dd 100644 --- a/src/cmdline_sprite.c +++ b/src/cmdline_sprite.c @@ -472,7 +472,7 @@ int cmdline_for_sprite(const char **argv, int argc) } const char *spriteFilePath = argv[1]; - char outputPath[_MAX_PATH]; + char outputPath[MAX_PATH]; if (!sprite_file_open(spriteFilePath)) { fprintf(stderr, "Unable to open input sprite file.\n"); @@ -488,10 +488,10 @@ int cmdline_for_sprite(const char **argv, int argc) int maxIndex = (int)spriteFileHeader.num_entries; int numbers = (int)floor(log(maxIndex)); - strncpy(outputPath, argv[2], _MAX_PATH); + strncpy(outputPath, argv[2], MAX_PATH); int pathLen = strlen(outputPath); - if (pathLen >= _MAX_PATH - numbers - 5){ + if (pathLen >= MAX_PATH - numbers - 5){ fprintf(stderr, "Path too long.\n"); return -1; } @@ -499,7 +499,7 @@ int cmdline_for_sprite(const char **argv, int argc) for (int x = 0; x < numbers; x++){ outputPath[pathLen + x] = '0'; } - strncpy(outputPath + pathLen + numbers, ".png", _MAX_PATH); + strncpy(outputPath + pathLen + numbers, ".png", MAX_PATH); for (int spriteIndex = 0; spriteIndex < maxIndex; spriteIndex++){ diff --git a/src/platform/shared.c b/src/platform/shared.c index 053dc00040..cb5dadf239 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -895,4 +895,4 @@ static void platform_refresh_screenbuffer(int width, int height, int pitch) RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_HEIGHT, uint16) = 8; RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, uint32) = (width >> 6) + 1; RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_ROWS, uint32) = (height >> 3) + 1; -} \ No newline at end of file +} diff --git a/src/rct1.c b/src/rct1.c index 2b3eb628a3..21d30629db 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -64,11 +64,6 @@ static void rct1_fix_paths(); static void rct1_fix_walls(); static void sub_69E891(); -static void read(void *dst, void *src, int length) -{ - memcpy(dst, src, length); -} - bool rct1_read_sc4(const char *path, rct1_s4 *s4) { char *buffer, *decodedBuffer; @@ -134,15 +129,15 @@ void rct1_import_s4(rct1_s4 *s4) int i; rct_banner *banner; - read((void*)RCT2_ADDRESS_CURRENT_MONTH_YEAR, &s4->month, 16); + memcpy((void*)RCT2_ADDRESS_CURRENT_MONTH_YEAR, &s4->month, 16); memset((void*)RCT2_ADDRESS_MAP_ELEMENTS, 0, 0x30000 * sizeof(rct_map_element)); - read((void*)RCT2_ADDRESS_MAP_ELEMENTS, s4->map_elements, sizeof(s4->map_elements)); - read((void*)0x010E63B8, &s4->unk_counter, 4 + sizeof(s4->sprites)); + memcpy((void*)RCT2_ADDRESS_MAP_ELEMENTS, s4->map_elements, sizeof(s4->map_elements)); + memcpy((void*)0x010E63B8, &s4->unk_counter, 4 + sizeof(s4->sprites)); for (i = 0; i < MAX_BANNERS; i++) gBanners[i].type = 255; - read((void*)0x013573BC, &s4->next_sprite_index, 12424); + memcpy((void*)0x013573BC, &s4->next_sprite_index, 12424); for (i = 0; i < MAX_BANNERS; i++) { banner = &gBanners[i]; @@ -150,10 +145,10 @@ void rct1_import_s4(rct1_s4 *s4) banner->string_idx = 778; } - read((void*)0x0135A8F4, &s4->string_table, 0x2F51C); + memcpy((void*)0x0135A8F4, &s4->string_table, 0x2F51C); memset((void*)0x013CA672, 0, 204); - read((void*)0x0138B580, &s4->map_animations, 0x258F2); - read((void*)0x013C6A72, &s4->patrol_areas, sizeof(s4->patrol_areas)); + memcpy((void*)0x0138B580, &s4->map_animations, 0x258F2); + memcpy((void*)0x013C6A72, &s4->patrol_areas, sizeof(s4->patrol_areas)); char *esi = (char*)0x13C6A72; char *edi = (char*)0x13B0E72; @@ -178,9 +173,9 @@ void rct1_import_s4(rct1_s4 *s4) memset(edi, 0, 64); edi += 64; } while (--edx); - read((void*)0x013CA672, &s4->unk_1F42AA, 116); - read((void*)0x013CA73A, &s4->unk_1F431E, 4); - read((void*)0x013CA73E, &s4->unk_1F4322, 0x41EA); + memcpy((void*)0x013CA672, &s4->unk_1F42AA, 116); + memcpy((void*)0x013CA73A, &s4->unk_1F431E, 4); + memcpy((void*)0x013CA73E, &s4->unk_1F4322, 0x41EA); } /** diff --git a/src/ride/track.c b/src/ride/track.c index eaf7daf3e2..2bf1419714 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -470,7 +470,7 @@ void track_load_list(ride_list_item item) free(track_list_cache); } -static void read(void *dst, char **src, int length) +static void copy(void *dst, char **src, int length) { memcpy(dst, *src, length); *src += length; @@ -545,7 +545,7 @@ rct_track_td6* load_track_design(const char *path) // Clear top of track_design as this is not loaded from the td4 files memset(&track_design->track_spine_colour, 0, 67); // Read start of track_design - read(track_design, &src, 32); + copy(track_design, &src, 32); uint8 version = track_design->version_and_colour_scheme >> 2; @@ -557,17 +557,17 @@ rct_track_td6* load_track_design(const char *path) // In td6 there are 32 sets of two byte vehicle colour specifiers // In td4 there are 12 sets so the remaining 20 need to be read. if (version == 2) - read(&track_design->vehicle_colours[12], &src, 40); + copy(&track_design->vehicle_colours[12], &src, 40); - read(&track_design->pad_48, &src, 24); + copy(&track_design->pad_48, &src, 24); // In td4 (version AA/CF) and td6 both start actual track data at 0xA3 if (version > 0) - read(&track_design->track_spine_colour, &src, version == 1 ? 140 : 67); + copy(&track_design->track_spine_colour, &src, version == 1 ? 140 : 67); uint8* track_elements = RCT2_ADDRESS(0x9D821B, uint8); // Read the actual track data. - read(track_elements, &src, 24572); + copy(track_elements, &src, 24572); uint8* final_track_element_location = track_elements + 24572; free(decoded); diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index f5f3bcb00a..ca0ccc0315 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -196,7 +196,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) return NULL; } - window_loadsave_populate_list(includeNewItem, TRUE, path, ".sv6"); + window_loadsave_populate_list(includeNewItem, true, path, ".sv6"); break; case LOADSAVETYPE_LANDSCAPE: platform_get_user_directory(path, "landscape"); @@ -206,7 +206,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) return NULL; } - window_loadsave_populate_list(includeNewItem, TRUE, path, ".sc6"); + window_loadsave_populate_list(includeNewItem, true, path, ".sc6"); break; case LOADSAVETYPE_SCENARIO: /* @@ -225,7 +225,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) if (ch != NULL) *ch = 0; - window_loadsave_populate_list(includeNewItem, TRUE, path, ".sc6"); + window_loadsave_populate_list(includeNewItem, true, path, ".sc6"); break; case LOADSAVETYPE_TRACK: /* @@ -244,7 +244,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) if (ch != NULL) *ch = 0; - window_loadsave_populate_list(includeNewItem, TRUE, path, ".td?"); + window_loadsave_populate_list(includeNewItem, true, path, ".td?"); break; } w->no_list_items = _listItemsCount; @@ -376,7 +376,7 @@ static void window_loadsave_scrollmousedown(rct_window *w, int scrollIndex, int char directory[MAX_PATH]; strncpy(directory, _listItems[selectedItem].path, sizeof(directory)); - window_loadsave_populate_list(includeNewItem, TRUE, directory, _extension); + window_loadsave_populate_list(includeNewItem, true, directory, _extension); window_init_scroll_widgets(w); w->no_list_items = _listItemsCount; diff --git a/src/world/mapgen.c b/src/world/mapgen.c index d6364dfd0c..ece85d5509 100644 --- a/src/world/mapgen.c +++ b/src/world/mapgen.c @@ -737,12 +737,6 @@ static int fast_floor(float x) return (x > 0) ? ((int)x) : (((int)x) - 1); } -static int mod(int x, int m) -{ - int a = x % m; - return a < 0 ? a + m : a; -} - static float grad(int hash, float x, float y) { int h = hash & 7; // Convert low 3 bits of hash code @@ -772,4 +766,4 @@ static void mapgen_simplex(mapgen_settings *settings) } } -#pragma endregion \ No newline at end of file +#pragma endregion From e0769800e7fbd1cb37b5866e8c6ef4a8a6fe99b6 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 4 Aug 2015 20:25:24 +0100 Subject: [PATCH 0439/1173] remove old zero clearance tool --- src/windows/cheats.c | 66 ++------------------------------------------ 1 file changed, 3 insertions(+), 63 deletions(-) diff --git a/src/windows/cheats.c b/src/windows/cheats.c index d48374eeb9..93710be4c6 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -89,7 +89,6 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_OPEN_CLOSE_PARK, WIDX_PARK_PARAMETERS, WIDX_SANDBOX_MODE, - WIDX_ZERO_CLEARANCE, WIDX_UNLOCK_ALL_PRICES, WIDX_FORCE_PARK_RATING, WIDX_PARK_RATING_SPINNER, @@ -221,7 +220,6 @@ static rct_widget window_cheats_misc_widgets[] = { { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_OPEN_PARK, STR_NONE}, // open / close park { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_PARK_PARAMETERS, STR_CHEAT_TIP_PARK_PARAMETERS}, // Park parameters { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_SANDBOX_MODE, STR_CHEAT_SANDBOX_MODE_TIP}, // Sandbox mode (edit land ownership in-game) - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(2), HPL(2), STR_CHEAT_ZERO_CLEARANCE, STR_NONE}, // Zero Clearance { WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(3), OHPL(3), STR_CHEAT_UNLOCK_PRICES, STR_NONE}, // Unlock all prices { WWT_CHECKBOX, 1, XPL(0), WPL(0), YPL(4), HPL(4), STR_FORCE_PARK_RATING, STR_NONE}, // Force park rating { WWT_SPINNER, 1, XPL(1), WPL(1) - 10, YPL(4) + 2, HPL(4) - 3, STR_NONE, STR_NONE }, // park rating @@ -269,8 +267,6 @@ static void window_cheats_money_mouseup(rct_window *w, int widgetIndex); static void window_cheats_guests_mouseup(rct_window *w, int widgetIndex); static void window_cheats_misc_mouseup(rct_window *w, int widgetIndex); static void window_cheats_rides_mouseup(rct_window *w, int widgetIndex); -static void window_cheats_misc_tool_update(rct_window* w, int widgetIndex, int x, int y); -static void window_cheats_misc_tool_down(rct_window* w, int widgetIndex, int x, int y); static void window_cheats_update(rct_window *w); static void window_cheats_invalidate(rct_window *w); static void window_cheats_paint(rct_window *w, rct_drawpixelinfo *dpi); @@ -348,8 +344,8 @@ static rct_window_event_list window_cheats_misc_events = { window_cheats_update, NULL, NULL, - window_cheats_misc_tool_update, - window_cheats_misc_tool_down, + NULL, + NULL, NULL, NULL, NULL, @@ -411,7 +407,7 @@ static rct_window_event_list *window_cheats_page_events[] = { 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_HIGH_MONEY) | (1ULL << WIDX_CLEAR_LOAN), (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_GUEST_PARAMETERS_GROUP) | (1ULL << WIDX_GUEST_HAPPINESS_MAX) | (1ULL << WIDX_GUEST_HAPPINESS_MIN) | (1ULL << WIDX_GUEST_ENERGY_MAX) | (1ULL << WIDX_GUEST_ENERGY_MIN) | (1ULL << WIDX_GUEST_HUNGER_MAX) | (1ULL << WIDX_GUEST_HUNGER_MIN) | (1ULL << WIDX_GUEST_THIRST_MAX) | (1ULL << WIDX_GUEST_THIRST_MIN) | (1ULL << WIDX_GUEST_NAUSEA_MAX) | (1ULL << WIDX_GUEST_NAUSEA_MIN) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1ULL << WIDX_GUEST_BATHROOM_MAX) | (1ULL << WIDX_GUEST_BATHROOM_MIN) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1ULL << WIDX_GIVE_ALL_GUESTS_GROUP) | (1ULL << WIDX_GIVE_GUESTS_MONEY) | (1ULL << WIDX_GIVE_GUESTS_PARK_MAPS) | (1ULL << WIDX_GIVE_GUESTS_BALLOONS) | (1ULL << WIDX_GIVE_GUESTS_UMBRELLAS) | (1ULL << WIDX_TRAM_GUESTS) | (1ULL << WIDX_REMOVE_ALL_GUESTS) | (1ULL << WIDX_EXPLODE_GUESTS), - (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_FREEZE_CLIMATE) | (1ULL << WIDX_OPEN_CLOSE_PARK) | (1ULL << WIDX_ZERO_CLEARANCE) | (1ULL << WIDX_WEATHER_SUN) | (1ULL << WIDX_WEATHER_THUNDER) | (1ULL << WIDX_CLEAR_GRASS) | (1ULL << WIDX_MOWED_GRASS) | (1ULL << WIDX_WATER_PLANTS) | (1ULL << WIDX_FIX_VANDALISM) | (1ULL << WIDX_REMOVE_LITTER) | (1ULL << WIDX_WIN_SCENARIO) | (1ULL << WIDX_HAVE_FUN) | (1ULL << WIDX_UNLOCK_ALL_PRICES) | (1ULL << WIDX_SANDBOX_MODE) | (1ULL << WIDX_FAST_STAFF) | (1ULL << WIDX_NORMAL_STAFF) | (1ULL << WIDX_PARK_PARAMETERS) | (1ULL << WIDX_FORCE_PARK_RATING) | (1ULL << WIDX_INCREASE_PARK_RATING) | (1ULL << WIDX_DECREASE_PARK_RATING), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_FREEZE_CLIMATE) | (1ULL << WIDX_OPEN_CLOSE_PARK) | (1ULL << WIDX_WEATHER_SUN) | (1ULL << WIDX_WEATHER_THUNDER) | (1ULL << WIDX_CLEAR_GRASS) | (1ULL << WIDX_MOWED_GRASS) | (1ULL << WIDX_WATER_PLANTS) | (1ULL << WIDX_FIX_VANDALISM) | (1ULL << WIDX_REMOVE_LITTER) | (1ULL << WIDX_WIN_SCENARIO) | (1ULL << WIDX_HAVE_FUN) | (1ULL << WIDX_UNLOCK_ALL_PRICES) | (1ULL << WIDX_SANDBOX_MODE) | (1ULL << WIDX_FAST_STAFF) | (1ULL << WIDX_NORMAL_STAFF) | (1ULL << WIDX_PARK_PARAMETERS) | (1ULL << WIDX_FORCE_PARK_RATING) | (1ULL << WIDX_INCREASE_PARK_RATING) | (1ULL << WIDX_DECREASE_PARK_RATING), (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) }; @@ -879,11 +875,6 @@ static void window_cheats_misc_mouseup(rct_window *w, int widgetIndex) case WIDX_OPEN_CLOSE_PARK: park_set_open(park_is_open() ? 0 : 1); break; - case WIDX_ZERO_CLEARANCE: - if (tool_set(w, widgetIndex, 7)) { - return; - } - break; case WIDX_WEATHER_SUN: climate_force_weather(WEATHER_SUNNY); break; @@ -1161,54 +1152,3 @@ static void window_cheats_set_page(rct_window *w, int page) w->widgets[WIDX_PAGE_BACKGROUND].bottom = maxY - 1; window_invalidate(w); } - -static void window_cheats_misc_tool_update(rct_window* w, int widgetIndex, int x, int y) -{ - if (widgetIndex != WIDX_ZERO_CLEARANCE) - return; - - map_invalidate_selection_rect(); - - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 0); - - int map_x, map_y; - footpath_get_coordinates_from_pos(x, y + 16, &map_x, &map_y, NULL, NULL); - if (map_x != (sint16)0x8000){ - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 1; - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16) = 4; - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16) = map_x; - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, sint16) = map_x; - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16) = map_y; - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16) = map_y; - map_invalidate_selection_rect(); - } - - RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_SPRITE, sint32) = -1; -} - -static void window_cheats_misc_tool_down(rct_window* w, int widgetIndex, int x, int y) -{ - if (widgetIndex != WIDX_ZERO_CLEARANCE) - return; - - int dest_x, dest_y; - footpath_get_coordinates_from_pos(x, y + 16, &dest_x, &dest_y, NULL, NULL); - - if (dest_x == (sint16)0x8000)return; - - // Set the coordinate of destination to be exactly - // in the middle of a tile. - dest_x += 16; - dest_y += 16; - - // Set the tile coordinate to top left of tile - int tile_x = (dest_x & 0xFFE0) >> 5; - int tile_y = (dest_y & 0xFFE0) >> 5; - - rct_map_element *mapElement = map_get_first_element_at(tile_x, tile_y); - do { - if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SURFACE) { - mapElement->clearance_height = 0; - } - } while (!map_element_is_last_for_tile(mapElement++)); -} From be4ee45d66b786c2c458dad3f8828b57c6edd14a Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 4 Aug 2015 21:41:45 +0100 Subject: [PATCH 0440/1173] convert more platform functions over to utf8 and close #1713 --- src/game.c | 10 +- src/interface/title_sequences.c | 4 +- src/localisation/language.h | 3 + src/localisation/utf8.c | 49 +++++++ src/openrct2.c | 15 ++- src/platform/platform.h | 40 +++--- src/platform/windows.c | 222 +++++++++++++++++++++----------- src/ride/track.c | 2 +- 8 files changed, 236 insertions(+), 109 deletions(-) diff --git a/src/game.c b/src/game.c index db23454383..76737a8c10 100644 --- a/src/game.c +++ b/src/game.c @@ -890,10 +890,18 @@ int save_game() void game_autosave() { - char path[MAX_PATH]; + utf8 path[MAX_PATH]; + utf8 backupPath[MAX_PATH]; platform_get_user_directory(path, "save"); + strcpy(backupPath, path); + strcat(path, "autosave.sv6"); + strcat(backupPath, "autosave.sv6.bak"); + + if (platform_file_exists(path)) { + platform_file_copy(path, backupPath, true); + } SDL_RWops* rw = platform_sdl_rwfromfile(path, "wb+"); if (rw != NULL) { diff --git a/src/interface/title_sequences.c b/src/interface/title_sequences.c index 9cc2d57a01..e1753a4971 100644 --- a/src/interface/title_sequences.c +++ b/src/interface/title_sequences.c @@ -158,7 +158,7 @@ void title_sequence_duplicate_preset(int duplicate, const char *name) strncat(path, &separator, 1); strcat(path, gConfigTitleSequences.presets[preset].saves[i]); - platform_file_copy(srcPath, path); + platform_file_copy(srcPath, path, false); } if (loadmm) { @@ -237,7 +237,7 @@ void title_sequence_add_save(int preset, const char *path, const char *newName) // Add the appropriate extension if needed if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) strcat(newPath, ".sv6"); - platform_file_copy(path, newPath); + platform_file_copy(path, newPath, false); gConfigTitleSequences.presets[preset].num_saves++; gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); diff --git a/src/localisation/language.h b/src/localisation/language.h index 03dc6d5524..9e05cd4a2a 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -76,5 +76,8 @@ int utf8_insert_codepoint(utf8 *dst, uint32 codepoint); bool utf8_is_codepoint_start(utf8 *text); void utf8_remove_format_codes(utf8 *text); int utf8_get_codepoint_length(int codepoint); +int utf8_length(const utf8 *text); +wchar_t *utf8_to_widechar(const utf8 *src); +utf8 *widechar_to_utf8(const wchar_t *src); #endif diff --git a/src/localisation/utf8.c b/src/localisation/utf8.c index fc9e1ce60a..9f6763e01e 100644 --- a/src/localisation/utf8.c +++ b/src/localisation/utf8.c @@ -83,3 +83,52 @@ int utf8_get_codepoint_length(int codepoint) return 4; } } + +/** + * Gets the number of characters / codepoints in a UTF-8 string (not necessarily 1:1 with bytes and not including null + * terminator). + */ +int utf8_length(const utf8 *text) +{ + int codepoint; + const utf8 *ch = text; + + int count = 0; + while ((codepoint = utf8_get_next(ch, &ch)) != 0) { + count++; + } + return count; +} + +wchar_t *utf8_to_widechar(const utf8 *src) +{ + wchar_t *result = malloc((utf8_length(src) + 1) * sizeof(wchar_t)); + wchar_t *dst = result; + + const utf8 *ch = src; + int codepoint; + while ((codepoint = utf8_get_next(ch, &ch)) != 0) { + if ((uint32)codepoint > 0xFFFF) { + *dst++ = '?'; + } else { + *dst++ = codepoint; + } + } + *dst = 0; + + return result; +} + +utf8 *widechar_to_utf8(const wchar_t *src) +{ + utf8 *result = malloc((wcslen(src) * 4) + 1); + utf8 *dst = result; + + for (; *src != 0; src++) { + dst = utf8_write_codepoint(dst, *src); + } + *dst++ = 0; + + int size = dst - result; + return realloc(result, size); +} diff --git a/src/openrct2.c b/src/openrct2.c index d0142abcfe..4fbbca5d6f 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -55,9 +55,9 @@ static struct { sint16 x, y, z; } _spritelocations1[MAX_SPRITES], _spritelocatio static void openrct2_loop(); -static void openrct2_copy_files_over(const char *originalDirectory, const char *newDirectory, const char *extension) +static void openrct2_copy_files_over(const utf8 *originalDirectory, const utf8 *newDirectory, const utf8 *extension) { - char *ch, filter[MAX_PATH], oldPath[MAX_PATH], newPath[MAX_PATH]; + utf8 *ch, filter[MAX_PATH], oldPath[MAX_PATH], newPath[MAX_PATH]; int fileEnumHandle; file_info fileInfo; @@ -86,7 +86,7 @@ static void openrct2_copy_files_over(const char *originalDirectory, const char * strcat(oldPath, fileInfo.path); if (!platform_file_exists(newPath)) - platform_file_copy(oldPath, newPath); + platform_file_copy(oldPath, newPath, false); } platform_enumerate_files_end(fileEnumHandle); @@ -110,6 +110,7 @@ static void openrct2_copy_files_over(const char *originalDirectory, const char * platform_enumerate_directories_end(fileEnumHandle); } +// TODO move to platform static void openrct2_set_exe_path() { wchar_t exePath[MAX_PATH]; @@ -131,18 +132,18 @@ static void openrct2_set_exe_path() */ static void openrct2_copy_original_user_files_over() { - char path[MAX_PATH]; + utf8 path[MAX_PATH]; platform_get_user_directory(path, "save"); - openrct2_copy_files_over((char*)RCT2_ADDRESS_SAVED_GAMES_PATH, path, ".sv6"); + openrct2_copy_files_over((utf8*)RCT2_ADDRESS_SAVED_GAMES_PATH, path, ".sv6"); platform_get_user_directory(path, "landscape"); - openrct2_copy_files_over((char*)RCT2_ADDRESS_LANDSCAPES_PATH, path, ".sc6"); + openrct2_copy_files_over((utf8*)RCT2_ADDRESS_LANDSCAPES_PATH, path, ".sc6"); } bool openrct2_initialise() { - char userPath[MAX_PATH]; + utf8 userPath[MAX_PATH]; platform_get_user_directory(userPath, NULL); if (!platform_ensure_directory_exists(userPath)) { diff --git a/src/platform/platform.h b/src/platform/platform.h index 9cb61afb41..7b51a15f72 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -81,46 +81,46 @@ void platform_get_closest_resolution(int inWidth, int inHeight, int *outWidth, i void platform_init(); void platform_draw(); void platform_free(); -void platform_update_palette(char* colours, int start_index, int num_colours); +void platform_update_palette(char *colours, int start_index, int num_colours); void platform_set_fullscreen_mode(int mode); void platform_set_cursor(char cursor); void platform_refresh_video(); void platform_process_messages(); int platform_scancode_to_rct_keycode(int sdl_key); -void platform_start_text_input(char* buffer, int max_length); +void platform_start_text_input(utf8 *buffer, int max_length); void platform_stop_text_input(); -SDL_RWops* platform_sdl_rwfromfile(const char* filename, const char* mode); +SDL_RWops* platform_sdl_rwfromfile(const utf8* filename, const char* mode); // Platform specific definitions char platform_get_path_separator(); -int platform_file_exists(const char *path); -int platform_directory_exists(const char *path); -int platform_original_game_data_exists(const char *path); -time_t platform_file_get_modified_time(char* path); -int platform_ensure_directory_exists(const char *path); -int platform_directory_delete(const char *path); -int platform_lock_single_instance(); -int platform_enumerate_files_begin(const char *pattern); -int platform_enumerate_files_next(int handle, file_info *outFileInfo); +bool platform_file_exists(const utf8 *path); +bool platform_directory_exists(const utf8 *path); +bool platform_original_game_data_exists(const utf8 *path); +time_t platform_file_get_modified_time(const utf8* path); +bool platform_ensure_directory_exists(const utf8 *path); +bool platform_directory_delete(const utf8 *path); +bool platform_lock_single_instance(); +int platform_enumerate_files_begin(const utf8 *pattern); +bool platform_enumerate_files_next(int handle, file_info *outFileInfo); void platform_enumerate_files_end(int handle); -int platform_enumerate_directories_begin(const char *directory); -int platform_enumerate_directories_next(int handle, char *path); +int platform_enumerate_directories_begin(const utf8 *directory); +bool platform_enumerate_directories_next(int handle, utf8 *path); void platform_enumerate_directories_end(int handle); // Returns the bitmask of the GetLogicalDrives function for windows, 0 for other systems int platform_get_drives(); -int platform_file_copy(const char *srcPath, const char *dstPath); -int platform_file_move(const char *srcPath, const char *dstPath); -int platform_file_delete(const char *path); +bool platform_file_copy(const utf8 *srcPath, const utf8 *dstPath, bool overwrite); +bool platform_file_move(const utf8 *srcPath, const utf8 *dstPath); +bool platform_file_delete(const utf8 *path); void platform_hide_cursor(); void platform_show_cursor(); void platform_get_cursor_position(int *x, int *y); void platform_set_cursor_position(int x, int y); unsigned int platform_get_ticks(); -void platform_get_user_directory(char *outPath, const char *subDirectory); -void platform_show_messagebox(char *message); -int platform_open_common_file_dialog(int type, char *title, char *filename, char *filterPattern, char *filterName); +void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory); +void platform_show_messagebox(utf8 *message); +int platform_open_common_file_dialog(int type, utf8 *title, utf8 *filename, utf8 *filterPattern, utf8 *filterName); utf8 *platform_open_directory_browser(utf8 *title); uint8 platform_get_locale_currency(); uint16 platform_get_locale_language(); diff --git a/src/platform/windows.c b/src/platform/windows.c index 5577cacb0e..0b8b70657e 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -90,55 +90,68 @@ char platform_get_path_separator() return '\\'; } -int platform_file_exists(const char *path) +bool platform_file_exists(const utf8 *path) { - return !(GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES && (GetLastError() == ERROR_FILE_NOT_FOUND || GetLastError() == ERROR_PATH_NOT_FOUND)); + wchar_t *wPath = utf8_to_widechar(path); + DWORD result = GetFileAttributesW(wPath); + DWORD error = GetLastError(); + free(wPath); + return !(result == INVALID_FILE_ATTRIBUTES && (error == ERROR_FILE_NOT_FOUND || error == ERROR_PATH_NOT_FOUND)); } -int platform_directory_exists(const char *path) +bool platform_directory_exists(const utf8 *path) { - DWORD dwAttrib = GetFileAttributes(path); + wchar_t *wPath = utf8_to_widechar(path); + DWORD dwAttrib = GetFileAttributesW(wPath); + free(wPath); return dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY); } -int platform_original_game_data_exists(const char *path) +bool platform_original_game_data_exists(const utf8 *path) { - char checkPath[MAX_PATH]; + utf8 checkPath[MAX_PATH]; sprintf(checkPath, "%s%c%s%c%s", path, platform_get_path_separator(), "data", platform_get_path_separator(), "g1.dat"); return platform_file_exists(checkPath); } -int platform_ensure_directory_exists(const char *path) +bool platform_ensure_directory_exists(const utf8 *path) { if (platform_directory_exists(path)) return 1; - return CreateDirectory(path, NULL); + wchar_t *wPath = utf8_to_widechar(path); + BOOL success = CreateDirectoryW(wPath, NULL); + free(wPath); + return success == TRUE; } -int platform_directory_delete(const char *path) +bool platform_directory_delete(const utf8 *path) { - char pszFrom[MAX_PATH]; - strcpy(pszFrom, path); + wchar_t pszFrom[MAX_PATH]; + + wchar_t *wPath = utf8_to_widechar(path); + wcsncpy(pszFrom, wPath, MAX_PATH); + free(wPath); + // Needs to be double-null terminated for some weird reason - pszFrom[strlen(path) + 1] = 0; - - SHFILEOPSTRUCTA fileop; + pszFrom[wcslen(wPath) + 1] = 0; + + SHFILEOPSTRUCTW fileop; fileop.hwnd = NULL; // no status display fileop.wFunc = FO_DELETE; // delete operation fileop.pFrom = pszFrom; // source file name as double null terminated string fileop.pTo = NULL; // no destination needed - fileop.fFlags = FOF_NOCONFIRMATION|FOF_SILENT; // do not prompt the user + fileop.fFlags = FOF_NOCONFIRMATION | FOF_SILENT; // do not prompt the user fileop.fAnyOperationsAborted = FALSE; fileop.lpszProgressTitle = NULL; fileop.hNameMappings = NULL; - int ret = SHFileOperationA(&fileop); + int ret = SHFileOperationW(&fileop); return (ret == 0); } -int platform_lock_single_instance() +bool platform_lock_single_instance() { HANDLE mutex, status; @@ -150,67 +163,74 @@ int platform_lock_single_instance() if (status == NULL) log_error("unable to create mutex\n"); - return 1; + return true; } else { // Already running CloseHandle(mutex); - return 0; + return false; } } typedef struct { - char active; - char pattern[MAX_PATH]; + bool active; + wchar_t pattern[MAX_PATH]; HANDLE handle; - WIN32_FIND_DATAA data; + WIN32_FIND_DATAW data; + utf8 *outFilename; } enumerate_file_info; static enumerate_file_info _enumerateFileInfoList[8] = { 0 }; -int platform_enumerate_files_begin(const char *pattern) +int platform_enumerate_files_begin(const utf8 *pattern) { int i; enumerate_file_info *enumFileInfo; + wchar_t *wPattern = utf8_to_widechar(pattern); + for (i = 0; i < countof(_enumerateFileInfoList); i++) { enumFileInfo = &_enumerateFileInfoList[i]; if (!enumFileInfo->active) { - strncpy(enumFileInfo->pattern, pattern, MAX_PATH); + wcsncpy(enumFileInfo->pattern, wPattern, MAX_PATH); enumFileInfo->handle = NULL; - enumFileInfo->active = 1; + enumFileInfo->active = true; + enumFileInfo->outFilename = NULL; + + free(wPattern); return i; } } + free(wPattern); return INVALID_HANDLE; } -int platform_enumerate_files_next(int handle, file_info *outFileInfo) +bool platform_enumerate_files_next(int handle, file_info *outFileInfo) { - int result; + bool result; enumerate_file_info *enumFileInfo; HANDLE findFileHandle; enumFileInfo = &_enumerateFileInfoList[handle]; if (enumFileInfo->handle == NULL) { - findFileHandle = FindFirstFile(enumFileInfo->pattern, &enumFileInfo->data); + findFileHandle = FindFirstFileW(enumFileInfo->pattern, &enumFileInfo->data); if (findFileHandle != INVALID_HANDLE_VALUE) { enumFileInfo->handle = findFileHandle; - result = 1; + result = true; } else { - result = 0; + result = false; } } else { - result = FindNextFile(enumFileInfo->handle, &enumFileInfo->data); + result = FindNextFileW(enumFileInfo->handle, &enumFileInfo->data); } if (result) { - outFileInfo->path = enumFileInfo->data.cFileName; + outFileInfo->path = enumFileInfo->outFilename = widechar_to_utf8(enumFileInfo->data.cFileName); outFileInfo->size = ((uint64)enumFileInfo->data.nFileSizeHigh << 32ULL) | (uint64)enumFileInfo->data.nFileSizeLow; outFileInfo->last_modified = ((uint64)enumFileInfo->data.ftLastWriteTime.dwHighDateTime << 32ULL) | (uint64)enumFileInfo->data.ftLastWriteTime.dwLowDateTime; - return 1; + return true; } else { - return 0; + return false; } } @@ -223,32 +243,39 @@ void platform_enumerate_files_end(int handle) FindClose(enumFileInfo->handle); enumFileInfo->handle = NULL; } - enumFileInfo->active = 0; + enumFileInfo->active = false; + SafeFree(enumFileInfo->outFilename); } -int platform_enumerate_directories_begin(const char *directory) +int platform_enumerate_directories_begin(const utf8 *directory) { int i; enumerate_file_info *enumFileInfo; - if (strlen(directory) + 3 >= MAX_PATH) + wchar_t *wDirectory = utf8_to_widechar(directory); + + if (wcslen(wDirectory) + 3 >= MAX_PATH) return INVALID_HANDLE; for (i = 0; i < countof(_enumerateFileInfoList); i++) { enumFileInfo = &_enumerateFileInfoList[i]; if (!enumFileInfo->active) { - strncpy(enumFileInfo->pattern, directory, MAX_PATH); - strncat(enumFileInfo->pattern, "*", MAX_PATH); + wcsncpy(enumFileInfo->pattern, wDirectory, MAX_PATH); + wcsncat(enumFileInfo->pattern, L"*", MAX_PATH); enumFileInfo->handle = NULL; - enumFileInfo->active = 1; + enumFileInfo->active = true; + enumFileInfo->outFilename = NULL; + + free(wDirectory); return i; } } + free(wDirectory); return INVALID_HANDLE; } -int platform_enumerate_directories_next(int handle, char *path) +bool platform_enumerate_directories_next(int handle, utf8 *path) { enumerate_file_info *enumFileInfo; HANDLE fileHandle; @@ -256,31 +283,32 @@ int platform_enumerate_directories_next(int handle, char *path) enumFileInfo = &_enumerateFileInfoList[handle]; if (enumFileInfo->handle == NULL) { - fileHandle = FindFirstFile(enumFileInfo->pattern, &enumFileInfo->data); + fileHandle = FindFirstFileW(enumFileInfo->pattern, &enumFileInfo->data); if (fileHandle != 0) { enumFileInfo->handle = fileHandle; } else { - return 0; + return false; } } else { - if (!FindNextFile(enumFileInfo->handle, &enumFileInfo->data)) { - return 0; + if (!FindNextFileW(enumFileInfo->handle, &enumFileInfo->data)) { + return false; } } while ( - (enumFileInfo->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0 - || strchr(enumFileInfo->data.cFileName, '.') != NULL + (enumFileInfo->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0 || + wcschr(enumFileInfo->data.cFileName, '.') != NULL ) { - if (!FindNextFile(enumFileInfo->handle, &enumFileInfo->data)) { - return 0; + if (!FindNextFileW(enumFileInfo->handle, &enumFileInfo->data)) { + return false; } } - - memset(path, '\0', MAX_PATH); - strncpy(path, enumFileInfo->data.cFileName, MAX_PATH); + + utf8 *filename = widechar_to_utf8(enumFileInfo->data.cFileName); + strncpy(path, filename, MAX_PATH); strncat(path, "\\", MAX_PATH); - return 1; + free(filename); + return true; } void platform_enumerate_directories_end(int handle) @@ -292,26 +320,40 @@ void platform_enumerate_directories_end(int handle) FindClose(enumFileInfo->handle); enumFileInfo->handle = NULL; } - enumFileInfo->active = 0; + enumFileInfo->active = false; } -int platform_get_drives(){ +int platform_get_drives() +{ return GetLogicalDrives(); } -int platform_file_copy(const char *srcPath, const char *dstPath) +bool platform_file_copy(const utf8 *srcPath, const utf8 *dstPath, bool overwrite) { - return CopyFileA(srcPath, dstPath, TRUE); + wchar_t *wSrcPath = utf8_to_widechar(srcPath); + wchar_t *wDstPath = utf8_to_widechar(dstPath); + BOOL success = CopyFileW(wSrcPath, wDstPath, overwrite ? FALSE : TRUE); + free(wSrcPath); + free(wDstPath); + return success == TRUE; } -int platform_file_move(const char *srcPath, const char *dstPath) +bool platform_file_move(const utf8 *srcPath, const utf8 *dstPath) { - return MoveFileA(srcPath, dstPath); + wchar_t *wSrcPath = utf8_to_widechar(srcPath); + wchar_t *wDstPath = utf8_to_widechar(dstPath); + BOOL success = MoveFileW(wSrcPath, wDstPath); + free(wSrcPath); + free(wDstPath); + return success == TRUE; } -int platform_file_delete(const char *path) +bool platform_file_delete(const utf8 *path) { - return DeleteFileA(path); + wchar_t *wPath = utf8_to_widechar(path); + BOOL success = DeleteFileW(wPath); + free(wPath); + return success == TRUE; } void platform_hide_cursor() @@ -347,11 +389,16 @@ unsigned int platform_get_ticks() return GetTickCount(); } -void platform_get_user_directory(char *outPath, const char *subDirectory) +void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) { + wchar_t wOutPath[MAX_PATH]; char separator[2] = { platform_get_path_separator(), 0 }; - if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, NULL, 0, outPath))) { + if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, NULL, 0, wOutPath))) { + utf8 *outPathTemp = widechar_to_utf8(wOutPath); + strcpy(outPath, outPathTemp); + free(outPathTemp); + strcat(outPath, separator); strcat(outPath, "OpenRCT2"); strcat(outPath, separator); @@ -362,6 +409,8 @@ void platform_get_user_directory(char *outPath, const char *subDirectory) } else { outPath[0] = 0; } + + free(wOutPath); } void platform_show_messagebox(char *message) @@ -643,7 +692,8 @@ PCHAR *CommandLineToArgvA(PCHAR CmdLine, int *_argc) return argv; } -uint16 platform_get_locale_language(){ +uint16 platform_get_locale_language() +{ CHAR langCode[4]; if (GetLocaleInfo(LOCALE_USER_DEFAULT, @@ -689,23 +739,33 @@ uint16 platform_get_locale_language(){ return LANGUAGE_UNDEFINED; } -time_t platform_file_get_modified_time(char* path){ +time_t platform_file_get_modified_time(const utf8* path) +{ WIN32_FILE_ATTRIBUTE_DATA data; - if (!GetFileAttributesEx(path, GetFileExInfoStandard, &data)) + + wchar_t *wPath = utf8_to_widechar(path); + BOOL result = GetFileAttributesExW(wPath, GetFileExInfoStandard, &data); + free(wPath); + + if (result) { + ULARGE_INTEGER ull; + ull.LowPart = data.ftLastWriteTime.dwLowDateTime; + ull.HighPart = data.ftLastWriteTime.dwHighDateTime; + return ull.QuadPart / 10000000ULL - 11644473600ULL; + } else { return 0; - ULARGE_INTEGER ull; - ull.LowPart = data.ftLastWriteTime.dwLowDateTime; - ull.HighPart = data.ftLastWriteTime.dwHighDateTime; - return ull.QuadPart / 10000000ULL - 11644473600ULL; + } } -uint8 platform_get_locale_currency(){ +uint8 platform_get_locale_currency() +{ CHAR currCode[4]; if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SINTLSYMBOL, (LPSTR)&currCode, - sizeof(currCode)) == 0){ + sizeof(currCode)) == 0 + ) { return CURRENCY_POUNDS; } if (strcmp(currCode, "GBP") == 0){ @@ -741,15 +801,18 @@ uint8 platform_get_locale_currency(){ return CURRENCY_POUNDS; } -uint8 platform_get_locale_measurement_format(){ +uint8 platform_get_locale_measurement_format() +{ UINT measurement_system; if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IMEASURE | LOCALE_RETURN_NUMBER, (LPSTR)&measurement_system, - sizeof(measurement_system)) == 0){ + sizeof(measurement_system)) == 0 + ) { return MEASUREMENT_FORMAT_IMPERIAL; } - switch (measurement_system){ + + switch (measurement_system) { case 0: return MEASUREMENT_FORMAT_METRIC; case 1: @@ -758,16 +821,19 @@ uint8 platform_get_locale_measurement_format(){ } } -uint8 platform_get_locale_temperature_format(){ +uint8 platform_get_locale_temperature_format() +{ // There does not seem to be a function to obtain this, just check the countries UINT country; if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IMEASURE | LOCALE_RETURN_NUMBER, (LPSTR)&country, - sizeof(country)) == 0){ + sizeof(country)) == 0 + ) { return TEMPERATURE_FORMAT_C; } - switch (country){ + + switch (country) { case CTRY_UNITED_STATES: case CTRY_BELIZE: return TEMPERATURE_FORMAT_F; diff --git a/src/ride/track.c b/src/ride/track.c index 2bf1419714..605003d554 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3171,7 +3171,7 @@ int install_track(char* source_path, char* dest_name){ // Set path for actual copy subsitute_path(dest_path, RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), dest_name); - return platform_file_copy(source_path, dest_path); + return platform_file_copy(source_path, dest_path, false); } /* rct2: 0x006D13FE */ From 413805f675e220bbe690bdc7ba4beb0236d3f550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 4 Aug 2015 22:26:21 +0200 Subject: [PATCH 0441/1173] portability fixes --- src/windows/title_command_editor.c | 33 +++++++++++++++--------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/windows/title_command_editor.c b/src/windows/title_command_editor.c index 7350a129f9..54e74ce8ee 100644 --- a/src/windows/title_command_editor.c +++ b/src/windows/title_command_editor.c @@ -76,8 +76,9 @@ enum WINDOW_WATER_WIDGET_IDX { static bool _window_title_command_editor_insert; static int _window_title_command_editor_index; -static char textbox1Buffer[50]; -static char textbox2Buffer[50]; +#define BUF_SIZE 50 +static char textbox1Buffer[BUF_SIZE]; +static char textbox2Buffer[BUF_SIZE]; static title_command command = { 6, 0, 0 }; static rct_widget window_title_command_editor_widgets[] = { @@ -235,13 +236,13 @@ void window_title_command_editor_open(int index, bool insert) command.saveIndex = 0xFF; break; case TITLE_SCRIPT_LOCATION: - _itoa(command.x, textbox1Buffer, 10); - _itoa(command.y, textbox2Buffer, 10); + snprintf(textbox1Buffer, BUF_SIZE, "%d", command.x); + snprintf(textbox2Buffer, BUF_SIZE, "%d", command.y); break; case TITLE_SCRIPT_ROTATE: case TITLE_SCRIPT_ZOOM: case TITLE_SCRIPT_WAIT: - _itoa(command.rotations, textbox1Buffer, 10); + snprintf(textbox1Buffer, BUF_SIZE, "%d", command.rotations); break; } } @@ -271,13 +272,13 @@ static void window_title_command_editor_mouseup(rct_window *w, int widgetIndex) mapCoord = get_location(); command.x = (uint8)mapCoord.x; command.y = (uint8)mapCoord.y; - _itoa(command.x, textbox1Buffer, 10); - _itoa(command.y, textbox2Buffer, 10); + snprintf(textbox1Buffer, BUF_SIZE, "%d", command.x); + snprintf(textbox2Buffer, BUF_SIZE, "%d", command.y); } else if (command.command == TITLE_SCRIPT_ZOOM) { zoom = get_zoom(); command.zoom = zoom; - _itoa(command.zoom, textbox1Buffer, 10); + snprintf(textbox1Buffer, BUF_SIZE, "%d", command.zoom); } window_invalidate(w); break; @@ -383,23 +384,23 @@ static void window_title_command_editor_dropdown(rct_window *w, int widgetIndex, mapCoord = get_location(); command.x = (uint8)mapCoord.x; command.y = (uint8)mapCoord.y; - _itoa(command.x, textbox1Buffer, 10); - _itoa(command.y, textbox2Buffer, 10); + snprintf(textbox1Buffer, BUF_SIZE, "%d", command.x); + snprintf(textbox2Buffer, BUF_SIZE, "%d", command.y); break; case TITLE_SCRIPT_ROTATE: command.rotations = 1; - _itoa(command.rotations, textbox1Buffer, 10); + snprintf(textbox1Buffer, BUF_SIZE, "%d", command.rotations); break; case TITLE_SCRIPT_ZOOM: command.zoom = 0; - _itoa(command.zoom, textbox1Buffer, 10); + snprintf(textbox1Buffer, BUF_SIZE, "%d", command.zoom); break; case TITLE_SCRIPT_SPEED: command.speed = 1; break; case TITLE_SCRIPT_WAIT: command.seconds = 10; - _itoa(command.seconds, textbox1Buffer, 10); + snprintf(textbox1Buffer, BUF_SIZE, "%d", command.seconds); break; case TITLE_SCRIPT_LOAD: command.saveIndex = 0; @@ -445,7 +446,7 @@ static void window_title_command_editor_textinput(rct_window *w, int widgetIndex } command.rotations = (uint8)value; } - _itoa(command.rotations, textbox1Buffer, 10); + snprintf(textbox1Buffer, BUF_SIZE, "%d", command.rotations); window_invalidate(w); } else { @@ -456,7 +457,7 @@ static void window_title_command_editor_textinput(rct_window *w, int widgetIndex if (text == NULL) { if (*end == '\0') command.x = (uint8)value; - _itoa(command.x, textbox1Buffer, 10); + snprintf(textbox1Buffer, BUF_SIZE, "%d", command.x); window_invalidate(w); } else { @@ -467,7 +468,7 @@ static void window_title_command_editor_textinput(rct_window *w, int widgetIndex if (text == NULL) { if (*end == '\0') command.y = (uint8)value; - _itoa(command.y, textbox2Buffer, 10); + snprintf(textbox2Buffer, BUF_SIZE, "%d", command.y); window_invalidate(w); } else { From 84f76d81e8edb70e60b3950578be5f7748c4bc84 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 5 Aug 2015 00:14:07 +0100 Subject: [PATCH 0442/1173] refactor peep --- src/peep/peep.c | 50 ++++++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 3d52effbcf..5421144618 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -6656,7 +6656,8 @@ static int guest_surface_path_finding(rct_peep* peep){ return peep_move_one_tile(randDirection, peep); } -rct_map_element* get_banner_on_path(rct_map_element *path_element){ +rct_map_element* get_banner_on_path(rct_map_element *path_element) +{ // This is an improved version of original. // That only checked for one fence in the way. if (map_element_is_last_for_tile(path_element)) @@ -6679,6 +6680,25 @@ rct_map_element* get_banner_on_path(rct_map_element *path_element){ return NULL; } +static int banner_clear_path_edges(rct_map_element *mapElement, int edges) +{ + rct_map_element *bannerElement = get_banner_on_path(mapElement); + if (bannerElement != NULL) { + do { + edges &= bannerElement->properties.banner.flags; + } while ((bannerElement = get_banner_on_path(bannerElement)) != NULL); + } + return edges; +} + +/** + * Gets the connected edges of a path that are permitted (i.e. no 'no entry' signs) + */ +static int path_get_permitted_edges(rct_map_element *mapElement) +{ + return banner_clear_path_edges(mapElement, mapElement->properties.path.edges) & 0x0F; +} + static bool is_valid_path_z_and_direction(rct_map_element *mapElement, int currentZ, int currentDirection) { if (footpath_element_is_sloped(mapElement)) { @@ -6779,14 +6799,7 @@ static uint8 loc_6949B9( if (!is_valid_path_z_and_direction(mapElement, z, chosenDirection)) continue; if (footpath_element_is_wide(mapElement)) return PATH_SEARCH_WIDE; - uint8 edges = mapElement->properties.path.edges; - rct_map_element *bannerElement = get_banner_on_path(mapElement); - if (bannerElement != NULL) { - do { - edges &= bannerElement->properties.banner.flags; - } while ((bannerElement = get_banner_on_path(bannerElement)) != NULL); - } - edges &= 0x0F; + uint8 edges = path_get_permitted_edges(mapElement); edges &= ~(1 << (chosenDirection ^ 2)); z = mapElement->base_height; @@ -6922,14 +6935,7 @@ static int sub_69A5F0(sint16 x, sint16 y, sint16 z, rct_peep *peep, rct_map_elem // //goto 69A89C //} - //edges &= destMapElement->properties.path.edges & 0xF; - //rct_map_element *bannerElement = get_banner_on_path(destMapElement); - //if (bannerElement != NULL) { - // do { - // edges &= bannerElement->properties.banner.flags; - // } while ((bannerElement = get_banner_on_path(bannerElement)) != NULL); - //} - + //edges &= path_get_permitted_edges(destMapElement); //if (edges == 0){ // chosenDirection = 0xF; // // goto 69A89C @@ -7203,15 +7209,7 @@ static int guest_path_finding(rct_peep* peep) return 1; } - uint8 edges = mapElement->properties.path.edges; - rct_map_element *bannerElement = get_banner_on_path(mapElement); - if (bannerElement != NULL) { - do { - edges &= bannerElement->properties.banner.flags; - } while ((bannerElement = get_banner_on_path(bannerElement)) != NULL); - } - edges &= 0x0F; - + uint8 edges = path_get_permitted_edges(mapElement); if (peep->var_2A == 0 && peep_heading_for_ride_or_park_exit(peep)) { uint8 adjustedEdges = edges; for (int chosenDirection = 0; chosenDirection < 4; chosenDirection++) { From cec486839cb50460b829e5a61ff126b7aae01682 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 5 Aug 2015 01:24:18 +0100 Subject: [PATCH 0443/1173] add 'no entrance' style and refactor a few things --- data/language/english_uk.txt | 1 + src/interface/viewport.c | 43 ++++++++++++++++++++-------------- src/localisation/string_ids.h | 2 ++ src/management/award.c | 6 ++--- src/management/award.h | 2 +- src/management/marketing.c | 16 ++++++------- src/ride/ride.h | 5 +++- src/ride/ride_data.c | 29 ++++++++++++----------- src/ride/ride_data.h | 10 +++++--- src/windows/ride.c | 44 ++++++++++++++++++++--------------- 10 files changed, 92 insertions(+), 66 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 5916143e27..784a3f16ec 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3824,3 +3824,4 @@ STR_5484 :{BLACK}({COMMA16} week remaining) STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}Show recent messages +STR_5488 :No entrance diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 184f41ed4c..8f13405a09 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -22,6 +22,7 @@ #include "../config.h" #include "../drawing/drawing.h" #include "../localisation/localisation.h" +#include "../ride/ride_data.h" #include "../ride/track_data.h" #include "../sprites.h" #include "../world/map.h" @@ -1005,14 +1006,9 @@ int sub_6629BC(int height, uint16 ax, uint32 image_id, int edi){ return eax & 0xFF; } -typedef struct{ - uint32 image_id; - sint16 height; - sint16 scrolling_mode; -}rct_entrance_style; - /* rct2: 0x0066508C & 0x00665540 */ -void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_map_element* map_element){ +void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_map_element* map_element) +{ rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); uint8 is_exit = map_element->properties.entrance.type == ENTRANCE_TYPE_RIDE_EXIT; @@ -1022,12 +1018,13 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma } rct_ride* ride = GET_RIDE(map_element->properties.entrance.ride_index); + if (ride->entrance_style == RIDE_ENTRANCE_STYLE_NONE) return; - rct_entrance_style* style = &RCT2_ADDRESS(0x00993E7C,rct_entrance_style)[ride->entrance_style]; + const rct_ride_entrance_definition *style = &RideEntranceDefinitions[ride->entrance_style]; uint8 colour_1, colour_2; uint32 transparant_image_id = 0, image_id = 0; - if (RCT2_ADDRESS(0x00993E1C, uint32)[ride->entrance_style * 2] & (1 << 30)){ + if (style->flags & (1 << 30)) { colour_1 = ride->track_colour_main[0] + 0x70; transparant_image_id = (colour_1 << 19) | 0x40000000; } @@ -1048,10 +1045,10 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma } if (is_exit){ - image_id |= style->image_id + direction + 8; + image_id |= style->sprite_index + direction + 8; } else{ - image_id |= style->image_id + direction; + image_id |= style->sprite_index + direction; } // Format modifed to stop repeated code @@ -1068,10 +1065,10 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma if (transparant_image_id){ if (is_exit){ - transparant_image_id |= style->image_id + direction + 24; + transparant_image_id |= style->sprite_index + direction + 24; } else{ - transparant_image_id |= style->image_id + direction + 16; + transparant_image_id |= style->sprite_index + direction + 16; } RCT2_GLOBAL(0x009DEA52, uint16) = 2; RCT2_GLOBAL(0x009DEA54, uint16) = 2; @@ -1296,9 +1293,17 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma rct_ride *ride; int rideIndex, trackType, trackColourScheme, trackSequence; - if (!(RCT2_GLOBAL(0x009DEA6F, uint8) & 1) || mapElement->properties.track.ride_index == RCT2_GLOBAL(0x00F64DE8, uint8)) { - rideIndex = mapElement->properties.track.ride_index; - ride = GET_RIDE(rideIndex); + rideIndex = mapElement->properties.track.ride_index; + ride = GET_RIDE(rideIndex); + + // HACK Set entrance style to plain if none to stop glitch until entrance track piece is implemented + bool isEntranceStyleNone = false; + if (ride->entrance_style == RIDE_ENTRANCE_STYLE_NONE) { + isEntranceStyleNone = true; + ride->entrance_style = RIDE_ENTRANCE_STYLE_PLAIN; + } + + if (!(RCT2_GLOBAL(0x009DEA6F, uint8) & 1) || rideIndex == RCT2_GLOBAL(0x00F64DE8, uint8)) { trackType = mapElement->properties.track.type; trackSequence = mapElement->properties.track.sequence & 0x0F; trackColourScheme = mapElement->properties.track.colour & 3; @@ -1361,6 +1366,10 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma trackSequence ); } + + if (isEntranceStyleNone) { + ride->entrance_style = RIDE_ENTRANCE_STYLE_NONE; + } } /* rct2: 0x00664FD4 */ @@ -1396,8 +1405,6 @@ void viewport_entrance_paint_setup(uint8 direction, int height, rct_map_element* switch (map_element->properties.entrance.type){ case ENTRANCE_TYPE_RIDE_ENTRANCE: - viewport_ride_entrance_exit_paint_setup(direction, height, map_element); - break; case ENTRANCE_TYPE_RIDE_EXIT: viewport_ride_entrance_exit_paint_setup(direction, height, map_element); break; diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 1e7b21fd80..f7c898bde1 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1831,6 +1831,8 @@ enum { STR_SHOW_RECENT_MESSAGES_TIP = 5487, + STR_ENTRANCE_NONE = 5488, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/management/award.c b/src/management/award.c index 6448725c79..4c025f28aa 100644 --- a/src/management/award.c +++ b/src/management/award.c @@ -31,7 +31,7 @@ #define NEGATIVE 0 #define POSITIVE 1 -int _awardPositiveMap[] = { +static const uint8 AwardPositiveMap[] = { NEGATIVE, // PARK_AWARD_MOST_UNTIDY POSITIVE, // PARK_AWARD_MOST_TIDY POSITIVE, // PARK_AWARD_BEST_ROLLERCOASTERS @@ -53,9 +53,9 @@ int _awardPositiveMap[] = { rct_award *gCurrentAwards = (rct_award*)RCT2_ADDRESS_AWARD_LIST; -int award_is_positive(int type) +bool award_is_positive(int type) { - return _awardPositiveMap[type]; + return AwardPositiveMap[type]; } #pragma region Award checks diff --git a/src/management/award.h b/src/management/award.h index faab09d43c..1fb14d5843 100644 --- a/src/management/award.h +++ b/src/management/award.h @@ -53,7 +53,7 @@ enum { extern rct_award *gCurrentAwards; -int award_is_positive(int type); +bool award_is_positive(int type); void award_reset(); void award_update_all(); diff --git a/src/management/marketing.c b/src/management/marketing.c index d60a351c73..dce781492b 100644 --- a/src/management/marketing.c +++ b/src/management/marketing.c @@ -28,22 +28,22 @@ #include "news_item.h" const money16 AdvertisingCampaignPricePerWeek[] = { - MONEY(50,00), // PARK_ENTRY_FREE, - MONEY(50,00), // RIDE_FREE, - MONEY(50,00), // PARK_ENTRY_HALF_PRICE, - MONEY(50,00), // FOOD_OR_DRINK_FREE, - MONEY(350,00), // PARK, - MONEY(200,00) // RIDE, + MONEY(50,00), // PARK_ENTRY_FREE + MONEY(50,00), // RIDE_FREE + MONEY(50,00), // PARK_ENTRY_HALF_PRICE + MONEY(50,00), // FOOD_OR_DRINK_FREE + MONEY(350,00), // PARK + MONEY(200,00) // RIDE }; -const int advertisingCampaignGuestGenerationProbabilities[] = { 400, 300, 200, 200, 250, 200 }; +static const int AdvertisingCampaignGuestGenerationProbabilities[] = { 400, 300, 200, 200, 250, 200 }; uint8 *gMarketingCampaignDaysLeft = RCT2_ADDRESS(0x01358102, uint8); uint8 *gMarketingCampaignRideIndex = RCT2_ADDRESS(0x01358116, uint8); int marketing_get_campaign_guest_generation_probability(int campaign) { - int probability = advertisingCampaignGuestGenerationProbabilities[campaign]; + int probability = AdvertisingCampaignGuestGenerationProbabilities[campaign]; rct_ride *ride; // Lower probability of guest generation if price was already low diff --git a/src/ride/ride.h b/src/ride/ride.h index 14c20dc0b6..51661acb11 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -679,7 +679,10 @@ enum { RIDE_ENTRANCE_STYLE_ABSTRACT, RIDE_ENTRANCE_STYLE_SNOW_ICE, RIDE_ENTRANCE_STYLE_PAGODA, - RIDE_ENTRANCE_STYLE_SPACE + RIDE_ENTRANCE_STYLE_SPACE, + RIDE_ENTRANCE_STYLE_NONE, + + RIDE_ENTRANCE_STYLE_COUNT }; enum { diff --git a/src/ride/ride_data.c b/src/ride/ride_data.c index abfdeb6ce6..1970f9c96d 100644 --- a/src/ride/ride_data.c +++ b/src/ride/ride_data.c @@ -8,6 +8,7 @@ * https://gist.github.com/kevinburke/eaeb1d8149a6eef0dcc1 */ +#include "../localisation/localisation.h" #include "ride.h" #include "ride_data.h" @@ -867,19 +868,21 @@ const uint8 RideAvailableBreakdowns[] = { (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE) // 60 LIM Launched Roller Coaster }; -const rct_ride_entrance_definition RideEntranceDefinitions[12] = { - { 22664, 32, 2 }, // RIDE_ENTRANCE_STYLE_PLAIN - { 22760, 31, 21 }, // RIDE_ENTRANCE_STYLE_WOODEN - { 22680, 43, 2 }, // RIDE_ENTRANCE_STYLE_CANVAS_TENT - { 22728, 43, 19 }, // RIDE_ENTRANCE_STYLE_CASTLE_GREY - { 22712, 33, 19 }, // RIDE_ENTRANCE_STYLE_CASTLE_BROWN - { 22776, 32, 19 }, // RIDE_ENTRANCE_STYLE_JUNGLE - { 22744, 32, 20 }, // RIDE_ENTRANCE_STYLE_LOG_CABIN - { 22696, 34, 19 }, // RIDE_ENTRANCE_STYLE_CLASSICAL_ROMAN - { 22792, 40, 22 }, // RIDE_ENTRANCE_STYLE_ABSTRACT - { 22824, 35, 23 }, // RIDE_ENTRANCE_STYLE_SNOW_ICE - { 22840, 33, 19 }, // RIDE_ENTRANCE_STYLE_PAGODA - { 22856, 33, 2 } // RIDE_ENTRANCE_STYLE_SPACE +// rct2: 0x00993E7C and 0x00993E1C +const rct_ride_entrance_definition RideEntranceDefinitions[RIDE_ENTRANCE_STYLE_COUNT] = { + { 22664, 32, 2, STR_PLAIN_ENTRANCE, 0x00000000, 0, }, // RIDE_ENTRANCE_STYLE_PLAIN + { 22760, 31, 21, STR_WOODEN_ENTRANCE, 0x000057A1, 0, }, // RIDE_ENTRANCE_STYLE_WOODEN + { 22680, 43, 2, STR_CANVAS_TENT_ENTRANCE, 0x800057AD, 3, }, // RIDE_ENTRANCE_STYLE_CANVAS_TENT + { 22728, 43, 19, STR_CASTLE_ENTRANCE_GREY, 0x000057B9, 0, }, // RIDE_ENTRANCE_STYLE_CASTLE_GREY + { 22712, 43, 19, STR_CASTLE_ENTRANCE_BROWN, 0x000057C5, 0, }, // RIDE_ENTRANCE_STYLE_CASTLE_BROWN + { 22776, 33, 19, STR_JUNGLE_ENTRANCE, 0x000057D1, 0, }, // RIDE_ENTRANCE_STYLE_JUNGLE + { 22744, 32, 20, STR_LOG_CABIN_ENTRANCE, 0x000057DD, 0, }, // RIDE_ENTRANCE_STYLE_LOG_CABIN + { 22696, 34, 19, STR_CLASSICAL_ROMAN_ENTRANCE, 0x000057E9, 0, }, // RIDE_ENTRANCE_STYLE_CLASSICAL_ROMAN + { 22792, 40, 22, STR_ABSTRACT_ENTRANCE, 0x400057F5, 1, }, // RIDE_ENTRANCE_STYLE_ABSTRACT + { 22824, 35, 23, STR_SNOW_ICE_ENTRANCE, 0x0000580D, 0, }, // RIDE_ENTRANCE_STYLE_SNOW_ICE + { 22840, 33, 19, STR_PAGODA_ENTRANCE, 0x00005819, 0, }, // RIDE_ENTRANCE_STYLE_PAGODA + { 22856, 33, 2, STR_SPACE_ENTRANCE, 0x00005825, 0, }, // RIDE_ENTRANCE_STYLE_SPACE + { 0, 0, 2, STR_ENTRANCE_NONE, 0x00000000, 0, } // RIDE_ENTRANCE_STYLE_NONE }; // Data read from 0x0097D7C9 4 bytes at a time diff --git a/src/ride/ride_data.h b/src/ride/ride_data.h index 4a9076faaf..ad559340d9 100644 --- a/src/ride/ride_data.h +++ b/src/ride/ride_data.h @@ -22,6 +22,7 @@ #define _RIDE_DATA_H_ #include "../common.h" +#include "ride.h" typedef struct { rct_string_id vehicle_name; @@ -31,9 +32,12 @@ typedef struct { } rct_ride_name_convention; typedef struct { - uint32 spriteIndex; + uint32 sprite_index; uint16 height; - uint16 var_06; + uint16 scrolling_mode; + rct_string_id string_id; + uint32 flags; + uint16 colour_use_flags; } rct_ride_entrance_definition; extern const bool hasRunningTrack[0x60]; @@ -48,7 +52,7 @@ extern const rct_ride_name_convention RideNameConvention[96]; extern const uint8 RideAvailableModes[]; extern const uint8 RideAvailableBreakdowns[]; -extern const rct_ride_entrance_definition RideEntranceDefinitions[12]; +extern const rct_ride_entrance_definition RideEntranceDefinitions[RIDE_ENTRANCE_STYLE_COUNT]; extern const uint8 RideLiftHillAdjustments[0x60]; extern const money8 DefaultShopItemPrice[SHOP_ITEM_COUNT]; diff --git a/src/windows/ride.c b/src/windows/ride.c index 9debc78f25..26da8bd135 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -3654,7 +3654,8 @@ const uint8 window_ride_entrance_style_list[] = { RIDE_ENTRANCE_STYLE_ABSTRACT, RIDE_ENTRANCE_STYLE_SNOW_ICE, RIDE_ENTRANCE_STYLE_PAGODA, - RIDE_ENTRANCE_STYLE_SPACE + RIDE_ENTRANCE_STYLE_SPACE, + RIDE_ENTRANCE_STYLE_NONE }; static uint32 window_ride_get_colour_button_image(int colour) @@ -3664,11 +3665,11 @@ static uint32 window_ride_get_colour_button_image(int colour) static int window_ride_has_track_colour(rct_ride *ride, int trackColour) { - uint16 unk_1 = RCT2_GLOBAL(0x00993E20 + (ride->entrance_style * 8), uint16); + uint16 colourUse = RideEntranceDefinitions[ride->entrance_style].colour_use_flags; switch (trackColour) { - case 0: return ((unk_1 & 1) && !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) || ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN); - case 1: return ((unk_1 & 2) && !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) || ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL); + case 0: return ((colourUse & 1) && !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) || ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN); + case 1: return ((colourUse & 2) && !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) || ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL); case 2: return ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS); default: return 0; } @@ -3822,7 +3823,7 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid case WIDX_ENTRANCE_STYLE_DROPDOWN: for (i = 0; i < countof(window_ride_entrance_style_list); i++) { gDropdownItemsFormat[i] = 1142; - gDropdownItemsArgs[i] = STR_PLAIN_ENTRANCE + window_ride_entrance_style_list[i]; + gDropdownItemsArgs[i] = RideEntranceDefinitions[window_ride_entrance_style_list[i]].string_id; if (ride->entrance_style == window_ride_entrance_style_list[i]) gDropdownItemsChecked = 1 << i; @@ -4068,7 +4069,7 @@ static void window_ride_colour_invalidate(rct_window *w) window_ride_colour_widgets[WIDX_ENTRANCE_STYLE].type = WWT_DROPDOWN; window_ride_colour_widgets[WIDX_ENTRANCE_STYLE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; - window_ride_colour_widgets[WIDX_ENTRANCE_STYLE].image = STR_PLAIN_ENTRANCE + ride->entrance_style; + window_ride_colour_widgets[WIDX_ENTRANCE_STYLE].image = RideEntranceDefinitions[ride->entrance_style].string_id; } else { window_ride_colour_widgets[WIDX_ENTRANCE_PREVIEW].type = WWT_EMPTY; window_ride_colour_widgets[WIDX_ENTRANCE_STYLE].type = WWT_EMPTY; @@ -4222,23 +4223,28 @@ static void window_ride_colour_paint(rct_window *w, rct_drawpixelinfo *dpi) if (clippedDpi != NULL) { gfx_clear(clippedDpi, 0x0C0C0C0C); - terniaryColour = 0; - if (RCT2_GLOBAL(0x00993E1C + (ride->entrance_style * 8), uint32) & 0x40000000) - terniaryColour = 0x40000000 | ((trackColour.main + 112) << 19); + if (ride->entrance_style != RIDE_ENTRANCE_STYLE_NONE) { + const rct_ride_entrance_definition *entranceStyle = &RideEntranceDefinitions[ride->entrance_style]; - spriteIndex = (trackColour.additional << 24) | (trackColour.main << 19); - spriteIndex |= 0xA0000000; - spriteIndex += RideEntranceDefinitions[ride->entrance_style].spriteIndex; + terniaryColour = 0; + if (entranceStyle->flags & 0x40000000) { + terniaryColour = 0x40000000 | ((trackColour.main + 112) << 19); + } - // Back - gfx_draw_sprite(clippedDpi, spriteIndex, 34, 20, terniaryColour); + spriteIndex = (trackColour.additional << 24) | (trackColour.main << 19); + spriteIndex |= 0xA0000000; + spriteIndex += RideEntranceDefinitions[ride->entrance_style].sprite_index; - // Front - gfx_draw_sprite(clippedDpi, spriteIndex + 4, 34, 20, terniaryColour); + // Back + gfx_draw_sprite(clippedDpi, spriteIndex, 34, 20, terniaryColour); - // ? - if (terniaryColour != 0) - gfx_draw_sprite(clippedDpi, ((spriteIndex + 20) & 0x7FFFF) + terniaryColour, 34, 20, terniaryColour); + // Front + gfx_draw_sprite(clippedDpi, spriteIndex + 4, 34, 20, terniaryColour); + + // ? + if (terniaryColour != 0) + gfx_draw_sprite(clippedDpi, ((spriteIndex + 20) & 0x7FFFF) + terniaryColour, 34, 20, terniaryColour); + } rct2_free(clippedDpi); } From 36aacdf455755f202feb8b2bb9742f72d7bec03e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 5 Aug 2015 02:22:17 +0100 Subject: [PATCH 0444/1173] fix freeing of stack memory --- src/platform/windows.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/platform/windows.c b/src/platform/windows.c index 0b8b70657e..ca8491f7b8 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -409,8 +409,6 @@ void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) } else { outPath[0] = 0; } - - free(wOutPath); } void platform_show_messagebox(char *message) From 4a2731092a737dab55d88fd70b727ba417aef2a0 Mon Sep 17 00:00:00 2001 From: Krutonium Date: Wed, 5 Aug 2015 03:36:17 -0400 Subject: [PATCH 0445/1173] Updated VS Version And also updated the link to the community edition. As of 2015, Express no longer exists and has been replaced with Community. --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 94c14977a0..be3dc7ac0a 100644 --- a/readme.md +++ b/readme.md @@ -71,7 +71,7 @@ OpenRCT2 requires original files of Rollercoaster Tycoon 2 to play. It can be bo ### Windows: - Windows XP / Vista / 7 / 8 / 10 -- Visual Studio 2013 (Professional / [Community](http://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx) / [Express for Windows Desktop](http://www.visualstudio.com/downloads/download-visual-studio-vs#d-express-windows-desktop)) +- Visual Studio 2015 (Enterprise / Professional / [Community (Free)](https://www.visualstudio.com/products/visual-studio-community-vs) - [Powershell 4.0](http://social.technet.microsoft.com/wiki/contents/articles/21016.how-to-install-windows-powershell-4-0.aspx). ### Mac OS X: From 2d770093e9232e97a153bd8bf058bb85fc8ee13e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 5 Aug 2015 13:01:25 +0100 Subject: [PATCH 0446/1173] fix #1630 --- src/openrct2.c | 5 +++++ src/ride/ride_ratings.c | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/openrct2.c b/src/openrct2.c index 4fbbca5d6f..1a83f95a91 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -301,6 +301,11 @@ static void openrct2_loop() openrct2_reset_object_tween_locations(); } + // Limit number of updates per loop (any long pauses or debugging can make this update for a very long time) + if (currentTick - uncapTick > 25 * 60) { + uncapTick = currentTick - 25 - 1; + } + while (uncapTick <= currentTick && currentTick - uncapTick > 25) { // Get the original position of each sprite for (uint16 i = 0; i < MAX_SPRITES; i++) { diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 67de73fa2c..3120eaac56 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -299,6 +299,7 @@ static void ride_ratings_update_state_5() x = trackBeginEnd.begin_x; y = trackBeginEnd.begin_y; + z = trackBeginEnd.begin_z; if (x == _rideRatingsProximityStartX && y == _rideRatingsProximityStartY && z == _rideRatingsProximityStartZ) { _rideRatingsState = RIDE_RATINGS_STATE_CALCULATE; return; @@ -306,7 +307,7 @@ static void ride_ratings_update_state_5() _rideRatingsProximityX = x; _rideRatingsProximityY = y; _rideRatingsProximityZ = z; - _rideRatingsProximityTrackType = mapElement->properties.track.type; + _rideRatingsProximityTrackType = trackBeginEnd.begin_element->properties.track.type; return; } } while (!map_element_is_last_for_tile(mapElement++)); From a3ff453f402b0d8fa8f9bd68fc59621894ecf1b0 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 5 Aug 2015 13:36:46 +0100 Subject: [PATCH 0447/1173] fix #1667 --- src/ride/ride.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index ddfc76a9bd..3a639759b1 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1364,7 +1364,7 @@ void ride_construction_set_default_next_piece() // Set track slope and lift hill _currentTrackSlopeEnd = slope; _previousTrackSlopeEnd = slope; - _currentTrackLiftHill = ((mapElement->type & 0x80) && slope != TRACK_SLOPE_DOWN_25 && slope != TRACK_SLOPE_DOWN_60); + _currentTrackLiftHill = ((mapElement->type & 0x80) && slope != TRACK_SLOPE_DOWN_25 && slope != TRACK_SLOPE_DOWN_60) != 0; break; case RIDE_CONSTRUCTION_STATE_BACK: rideIndex = _currentRideIndex; @@ -1416,7 +1416,7 @@ void ride_construction_set_default_next_piece() // Set track slope and lift hill _currentTrackSlopeEnd = slope; _previousTrackSlopeEnd = slope; - _currentTrackLiftHill = (mapElement->type & 0x80); + _currentTrackLiftHill = (mapElement->type & 0x80) != 0; break; } } From 19f94b54e12aaa0c14632e894887f94729741d86 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 5 Aug 2015 13:44:47 +0100 Subject: [PATCH 0448/1173] fix #1669 --- data/language/english_uk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 784a3f16ec..7379bdb088 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2788,7 +2788,7 @@ STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} STR_2779 :Viewport #{COMMA16} STR_2780 :Extra viewport # End of new strings -STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :Change keyboard shortcut From 6b72f9a555460d9be3b65c4858e3d43d65a98ead Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 5 Aug 2015 19:17:37 +0100 Subject: [PATCH 0449/1173] refactor shop item strings --- src/localisation/language.c | 2 +- src/localisation/string_ids.h | 200 +++++++++++++++++++++++++++++++- src/management/marketing.c | 6 +- src/peep/peep.c | 43 ++++--- src/peep/peep.h | 1 + src/ride/ride_data.c | 114 +++++++++++++++++++ src/ride/ride_data.h | 9 ++ src/windows/finances.c | 6 +- src/windows/guest.c | 208 ++++++++++++++++------------------ src/windows/new_campaign.c | 33 +++--- src/windows/ride.c | 12 +- 11 files changed, 459 insertions(+), 175 deletions(-) diff --git a/src/localisation/language.c b/src/localisation/language.c index a4751f09e9..f9dd9495c7 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -114,7 +114,7 @@ const char *language_get_string(rct_string_id id) if (_languageCurrent.num_strings > id) openrctString = _languageCurrent.strings[id]; - else if (_languageFallback.num_strings > id) + if (openrctString == NULL && _languageFallback.num_strings > id) openrctString = _languageFallback.strings[id]; if (id >= STR_OPENRCT2_BEGIN_STRING_ID) { diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index f7c898bde1..7b3e0f9b0b 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -731,6 +731,7 @@ enum { STR_LAST_BREAKDOWN = 1808, STR_CURRENT_BREAKDOWN = 1809, + STR_CARRYING = 1810, STR_CANT_BUILD_PARK_ENTRANCE_HERE = 1811, STR_ACTIONS = 1814, @@ -795,7 +796,7 @@ enum { STR_INCOME_PER_HOUR = 1873, STR_PROFIT_PER_HOUR = 1874, - + STR_GUEST_ITEM_FORMAT = 1875, STR_INSPECT_RIDES = 1876, STR_FIX_RIDES = 1877, STR_INSPECTION = 1878, @@ -877,10 +878,198 @@ enum { STR_ALTERNATIVE_COLOUR_SCHEME_2 = 2973, STR_ALTERNATIVE_COLOUR_SCHEME_3 = 2974, - STR_ITEM_START = 1988, - STR_ITEM_SINGULAR_START = 2044, - STR_ITEM2_START = 2090, - STR_ITEM2_SINGULAR_START = 2134, + STR_SHOP_ITEM_SINGULAR_BALLOON = 1988, + STR_SHOP_ITEM_SINGULAR_CUDDLY_TOY = 1989, + STR_SHOP_ITEM_SINGULAR_PARK_MAP = 1990, + STR_SHOP_ITEM_SINGULAR_ON_RIDE_PHOTO = 1991, + STR_SHOP_ITEM_SINGULAR_UMBRELLA = 1992, + STR_SHOP_ITEM_SINGULAR_DRINK = 1993, + STR_SHOP_ITEM_SINGULAR_BURGER = 1994, + STR_SHOP_ITEM_SINGULAR_CHIPS = 1995, + STR_SHOP_ITEM_SINGULAR_ICE_CREAM = 1996, + STR_SHOP_ITEM_SINGULAR_CANDYFLOSS = 1997, + STR_SHOP_ITEM_SINGULAR_EMPTY_CAN = 1998, + STR_SHOP_ITEM_SINGULAR_RUBBISH = 1999, + STR_SHOP_ITEM_SINGULAR_EMPTY_BURGER_BOX = 2000, + STR_SHOP_ITEM_SINGULAR_PIZZA = 2001, + STR_SHOP_ITEM_SINGULAR_VOUCHER = 2002, + STR_SHOP_ITEM_SINGULAR_POPCORN = 2003, + STR_SHOP_ITEM_SINGULAR_HOT_DOG = 2004, + STR_SHOP_ITEM_SINGULAR_TENTACLE = 2005, + STR_SHOP_ITEM_SINGULAR_HAT = 2006, + STR_SHOP_ITEM_SINGULAR_TOFFEE_APPLE = 2007, + STR_SHOP_ITEM_SINGULAR_T_SHIRT = 2008, + STR_SHOP_ITEM_SINGULAR_DOUGHNUT = 2009, + STR_SHOP_ITEM_SINGULAR_COFFEE = 2010, + STR_SHOP_ITEM_SINGULAR_EMPTY_CUP = 2011, + STR_SHOP_ITEM_SINGULAR_FRIED_CHICKEN = 2012, + STR_SHOP_ITEM_SINGULAR_LEMONADE = 2013, + STR_SHOP_ITEM_SINGULAR_EMPTY_BOX = 2014, + STR_SHOP_ITEM_SINGULAR_EMPTY_BOTTLE = 2015, + STR_SHOP_ITEM_SINGULAR_PRETZEL = 2125, + STR_SHOP_ITEM_SINGULAR_HOT_CHOCOLATE = 2126, + STR_SHOP_ITEM_SINGULAR_ICED_TEA = 2127, + STR_SHOP_ITEM_SINGULAR_FUNNEL_CAKE = 2128, + STR_SHOP_ITEM_SINGULAR_SUNGLASSES = 2129, + STR_SHOP_ITEM_SINGULAR_BEEF_NOODLES = 2130, + STR_SHOP_ITEM_SINGULAR_FRIED_RICE_NOODLES = 2131, + STR_SHOP_ITEM_SINGULAR_WONTON_SOUP = 2132, + STR_SHOP_ITEM_SINGULAR_MEATBALL_SOUP = 2133, + STR_SHOP_ITEM_SINGULAR_FRUIT_JUICE = 2134, + STR_SHOP_ITEM_SINGULAR_SOYBEAN_MILK = 2135, + STR_SHOP_ITEM_SINGULAR_SUJONGKWA = 2136, + STR_SHOP_ITEM_SINGULAR_SUB_SANDWICH = 2137, + STR_SHOP_ITEM_SINGULAR_COOKIE = 2138, + STR_SHOP_ITEM_SINGULAR_EMPTY_BOWL_RED = 2139, + STR_SHOP_ITEM_SINGULAR_EMPTY_DRINK_CARTON = 2140, + STR_SHOP_ITEM_SINGULAR_EMPTY_JUICE_CUP = 2141, + STR_SHOP_ITEM_SINGULAR_ROAST_SAUSAGE = 2142, + STR_SHOP_ITEM_SINGULAR_EMPTY_BOWL_BLUE = 2143, + + STR_SHOP_ITEM_PLURAL_BALLOON = 2016, + STR_SHOP_ITEM_PLURAL_CUDDLY_TOY = 2017, + STR_SHOP_ITEM_PLURAL_PARK_MAP = 2018, + STR_SHOP_ITEM_PLURAL_ON_RIDE_PHOTO = 2019, + STR_SHOP_ITEM_PLURAL_UMBRELLA = 2020, + STR_SHOP_ITEM_PLURAL_DRINK = 2021, + STR_SHOP_ITEM_PLURAL_BURGER = 2022, + STR_SHOP_ITEM_PLURAL_CHIPS = 2023, + STR_SHOP_ITEM_PLURAL_ICE_CREAM = 2024, + STR_SHOP_ITEM_PLURAL_CANDYFLOSS = 2025, + STR_SHOP_ITEM_PLURAL_EMPTY_CAN = 2026, + STR_SHOP_ITEM_PLURAL_RUBBISH = 2027, + STR_SHOP_ITEM_PLURAL_EMPTY_BURGER_BOX = 2028, + STR_SHOP_ITEM_PLURAL_PIZZA = 2029, + STR_SHOP_ITEM_PLURAL_VOUCHER = 2030, + STR_SHOP_ITEM_PLURAL_POPCORN = 2031, + STR_SHOP_ITEM_PLURAL_HOT_DOG = 2032, + STR_SHOP_ITEM_PLURAL_TENTACLE = 2033, + STR_SHOP_ITEM_PLURAL_HAT = 2034, + STR_SHOP_ITEM_PLURAL_TOFFEE_APPLE = 2035, + STR_SHOP_ITEM_PLURAL_T_SHIRT = 2036, + STR_SHOP_ITEM_PLURAL_DOUGHNUT = 2037, + STR_SHOP_ITEM_PLURAL_COFFEE = 2038, + STR_SHOP_ITEM_PLURAL_EMPTY_CUP = 2039, + STR_SHOP_ITEM_PLURAL_FRIED_CHICKEN = 2040, + STR_SHOP_ITEM_PLURAL_LEMONADE = 2041, + STR_SHOP_ITEM_PLURAL_EMPTY_BOX = 2042, + STR_SHOP_ITEM_PLURAL_EMPTY_BOTTLE = 2043, + STR_SHOP_ITEM_PLURAL_PRETZEL = 2147, + STR_SHOP_ITEM_PLURAL_HOT_CHOCOLATE = 2148, + STR_SHOP_ITEM_PLURAL_ICED_TEA = 2149, + STR_SHOP_ITEM_PLURAL_FUNNEL_CAKE = 2150, + STR_SHOP_ITEM_PLURAL_SUNGLASSES = 2151, + STR_SHOP_ITEM_PLURAL_BEEF_NOODLES = 2152, + STR_SHOP_ITEM_PLURAL_FRIED_RICE_NOODLES = 2153, + STR_SHOP_ITEM_PLURAL_WONTON_SOUP = 2154, + STR_SHOP_ITEM_PLURAL_MEATBALL_SOUP = 2155, + STR_SHOP_ITEM_PLURAL_FRUIT_JUICE = 2156, + STR_SHOP_ITEM_PLURAL_SOYBEAN_MILK = 2157, + STR_SHOP_ITEM_PLURAL_SUJONGKWA = 2158, + STR_SHOP_ITEM_PLURAL_SUB_SANDWICH = 2159, + STR_SHOP_ITEM_PLURAL_COOKIE = 2160, + STR_SHOP_ITEM_PLURAL_EMPTY_BOWL_RED = 2161, + STR_SHOP_ITEM_PLURAL_EMPTY_DRINK_CARTON = 2162, + STR_SHOP_ITEM_PLURAL_EMPTY_JUICE_CUP = 2163, + STR_SHOP_ITEM_PLURAL_ROAST_SAUSAGE = 2164, + STR_SHOP_ITEM_PLURAL_EMPTY_BOWL_BLUE = 2165, + + STR_SHOP_ITEM_INDEFINITE_BALLOON = 2044, + STR_SHOP_ITEM_INDEFINITE_CUDDLY_TOY = 2045, + STR_SHOP_ITEM_INDEFINITE_PARK_MAP = 2046, + STR_SHOP_ITEM_INDEFINITE_ON_RIDE_PHOTO = 2047, + STR_SHOP_ITEM_INDEFINITE_UMBRELLA = 2048, + STR_SHOP_ITEM_INDEFINITE_DRINK = 2049, + STR_SHOP_ITEM_INDEFINITE_BURGER = 2050, + STR_SHOP_ITEM_INDEFINITE_CHIPS = 2051, + STR_SHOP_ITEM_INDEFINITE_ICE_CREAM = 2052, + STR_SHOP_ITEM_INDEFINITE_CANDYFLOSS = 2053, + STR_SHOP_ITEM_INDEFINITE_EMPTY_CAN = 2054, + STR_SHOP_ITEM_INDEFINITE_RUBBISH = 2055, + STR_SHOP_ITEM_INDEFINITE_EMPTY_BURGER_BOX = 2056, + STR_SHOP_ITEM_INDEFINITE_PIZZA = 2057, + STR_SHOP_ITEM_INDEFINITE_VOUCHER = 2058, + STR_SHOP_ITEM_INDEFINITE_POPCORN = 2059, + STR_SHOP_ITEM_INDEFINITE_HOT_DOG = 2060, + STR_SHOP_ITEM_INDEFINITE_TENTACLE = 2061, + STR_SHOP_ITEM_INDEFINITE_HAT = 2062, + STR_SHOP_ITEM_INDEFINITE_TOFFEE_APPLE = 2063, + STR_SHOP_ITEM_INDEFINITE_T_SHIRT = 2064, + STR_SHOP_ITEM_INDEFINITE_DOUGHNUT = 2065, + STR_SHOP_ITEM_INDEFINITE_COFFEE = 2066, + STR_SHOP_ITEM_INDEFINITE_EMPTY_CUP = 2067, + STR_SHOP_ITEM_INDEFINITE_FRIED_CHICKEN = 2068, + STR_SHOP_ITEM_INDEFINITE_LEMONADE = 2069, + STR_SHOP_ITEM_INDEFINITE_EMPTY_BOX = 2070, + STR_SHOP_ITEM_INDEFINITE_EMPTY_BOTTLE = 2071, + STR_SHOP_ITEM_INDEFINITE_PRETZEL = 2169, + STR_SHOP_ITEM_INDEFINITE_HOT_CHOCOLATE = 2170, + STR_SHOP_ITEM_INDEFINITE_ICED_TEA = 2171, + STR_SHOP_ITEM_INDEFINITE_FUNNEL_CAKE = 2172, + STR_SHOP_ITEM_INDEFINITE_SUNGLASSES = 2173, + STR_SHOP_ITEM_INDEFINITE_BEEF_NOODLES = 2174, + STR_SHOP_ITEM_INDEFINITE_FRIED_RICE_NOODLES = 2175, + STR_SHOP_ITEM_INDEFINITE_WONTON_SOUP = 2176, + STR_SHOP_ITEM_INDEFINITE_MEATBALL_SOUP = 2177, + STR_SHOP_ITEM_INDEFINITE_FRUIT_JUICE = 2178, + STR_SHOP_ITEM_INDEFINITE_SOYBEAN_MILK = 2179, + STR_SHOP_ITEM_INDEFINITE_SUJONGKWA = 2180, + STR_SHOP_ITEM_INDEFINITE_SUB_SANDWICH = 2181, + STR_SHOP_ITEM_INDEFINITE_COOKIE = 2182, + STR_SHOP_ITEM_INDEFINITE_EMPTY_BOWL_RED = 2183, + STR_SHOP_ITEM_INDEFINITE_EMPTY_DRINK_CARTON = 2184, + STR_SHOP_ITEM_INDEFINITE_EMPTY_JUICE_CUP = 2185, + STR_SHOP_ITEM_INDEFINITE_ROAST_SAUSAGE = 2186, + STR_SHOP_ITEM_INDEFINITE_EMPTY_BOWL_BLUE = 2187, + + STR_SHOP_ITEM_DISPLAY_BALLOON = 2072, + STR_SHOP_ITEM_DISPLAY_CUDDLY_TOY = 2073, + STR_SHOP_ITEM_DISPLAY_PARK_MAP = 2074, + STR_SHOP_ITEM_DISPLAY_ON_RIDE_PHOTO = 2075, + STR_SHOP_ITEM_DISPLAY_UMBRELLA = 2076, + STR_SHOP_ITEM_DISPLAY_DRINK = 2077, + STR_SHOP_ITEM_DISPLAY_BURGER = 2078, + STR_SHOP_ITEM_DISPLAY_CHIPS = 2079, + STR_SHOP_ITEM_DISPLAY_ICE_CREAM = 2080, + STR_SHOP_ITEM_DISPLAY_CANDYFLOSS = 2081, + STR_SHOP_ITEM_DISPLAY_EMPTY_CAN = 2082, + STR_SHOP_ITEM_DISPLAY_RUBBISH = 2083, + STR_SHOP_ITEM_DISPLAY_EMPTY_BURGER_BOX = 2084, + STR_SHOP_ITEM_DISPLAY_PIZZA = 2085, + STR_SHOP_ITEM_DISPLAY_VOUCHER = 2086, + STR_SHOP_ITEM_DISPLAY_POPCORN = 2087, + STR_SHOP_ITEM_DISPLAY_HOT_DOG = 2088, + STR_SHOP_ITEM_DISPLAY_TENTACLE = 2089, + STR_SHOP_ITEM_DISPLAY_HAT = 2090, + STR_SHOP_ITEM_DISPLAY_TOFFEE_APPLE = 2091, + STR_SHOP_ITEM_DISPLAY_T_SHIRT = 2092, + STR_SHOP_ITEM_DISPLAY_DOUGHNUT = 2093, + STR_SHOP_ITEM_DISPLAY_COFFEE = 2094, + STR_SHOP_ITEM_DISPLAY_EMPTY_CUP = 2095, + STR_SHOP_ITEM_DISPLAY_FRIED_CHICKEN = 2096, + STR_SHOP_ITEM_DISPLAY_LEMONADE = 2097, + STR_SHOP_ITEM_DISPLAY_EMPTY_BOX = 2098, + STR_SHOP_ITEM_DISPLAY_EMPTY_BOTTLE = 2099, + STR_SHOP_ITEM_DISPLAY_PRETZEL = 2191, + STR_SHOP_ITEM_DISPLAY_HOT_CHOCOLATE = 2192, + STR_SHOP_ITEM_DISPLAY_ICED_TEA = 2193, + STR_SHOP_ITEM_DISPLAY_FUNNEL_CAKE = 2194, + STR_SHOP_ITEM_DISPLAY_SUNGLASSES = 2195, + STR_SHOP_ITEM_DISPLAY_BEEF_NOODLES = 2196, + STR_SHOP_ITEM_DISPLAY_FRIED_RICE_NOODLES = 2197, + STR_SHOP_ITEM_DISPLAY_WONTON_SOUP = 2198, + STR_SHOP_ITEM_DISPLAY_MEATBALL_SOUP = 2199, + STR_SHOP_ITEM_DISPLAY_FRUIT_JUICE = 2200, + STR_SHOP_ITEM_DISPLAY_SOYBEAN_MILK = 2201, + STR_SHOP_ITEM_DISPLAY_SUJONGKWA = 2202, + STR_SHOP_ITEM_DISPLAY_SUB_SANDWICH = 2203, + STR_SHOP_ITEM_DISPLAY_COOKIE = 2204, + STR_SHOP_ITEM_DISPLAY_EMPTY_BOWL_RED = 2205, + STR_SHOP_ITEM_DISPLAY_EMPTY_DRINK_CARTON = 2206, + STR_SHOP_ITEM_DISPLAY_EMPTY_JUICE_CUP = 2207, + STR_SHOP_ITEM_DISPLAY_ROAST_SAUSAGE = 2208, + STR_SHOP_ITEM_DISPLAY_EMPTY_BOWL_BLUE = 2209, + STR_STAFF_HANDYMEN_TAB_TIP = 2210, STR_STAFF_MECHANICS_TAB_TIP = 2211, @@ -971,6 +1160,7 @@ enum { STR_SELECT_SCENARIO = 2291, + STR_NOTHING = 2293, STR_CHANGE_BASE_LAND_TIP = 2294, STR_CHANGE_VERTICAL_LAND_TIP = 2295, diff --git a/src/management/marketing.c b/src/management/marketing.c index dce781492b..31cb07951f 100644 --- a/src/management/marketing.c +++ b/src/management/marketing.c @@ -24,6 +24,7 @@ #include "../localisation/localisation.h" #include "../management/finance.h" #include "../ride/ride.h" +#include "../ride/ride_data.h" #include "marketing.h" #include "news_item.h" @@ -96,10 +97,7 @@ void marketing_update() RCT2_GLOBAL(0x013CE952, uint16) = ride->name; RCT2_GLOBAL(0x013CE954, uint32) = ride->name_arguments; } else if (campaign == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) { - campaignItem += 2016; - if (campaignItem >= 2048) - campaignItem += 96; - RCT2_GLOBAL(0x013CE952, uint16) = campaignItem; + RCT2_GLOBAL(0x013CE952, uint16) = ShopItemStringIds[campaignItem].plural; } news_item_add_to_queue(NEWS_ITEM_MONEY, STR_MARKETING_FINISHED_BASE + campaign, 0); diff --git a/src/peep/peep.c b/src/peep/peep.c index 5421144618..01469693f3 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -29,6 +29,7 @@ #include "../config.h" #include "../openrct2.h" #include "../ride/ride.h" +#include "../ride/ride_data.h" #include "../scenario.h" #include "../sprites.h" #include "../world/sprite.h" @@ -5567,32 +5568,19 @@ void get_arguments_from_action(rct_peep* peep, uint32 *argument_1, uint32* argum * argument_1 (esi & ebx) * argument_2 (esi+2) */ -void get_arguments_from_thought(rct_peep_thought thought, uint32* argument_1, uint32* argument_2){ - int esi = 0x9AC86C; +void get_arguments_from_thought(rct_peep_thought thought, uint32* argument_1, uint32* argument_2) +{ + int esi = 0x009AC86C; - if ((RCT2_ADDRESS(0x981DB1, uint16)[thought.type] & 0xFF) & 1){ + if ((RCT2_ADDRESS(0x00981DB1, uint16)[thought.type] & 0xFF) & 1) { rct_ride* ride = &g_ride_list[thought.item]; esi = (int)(&(ride->name)); - } - else if ((RCT2_ADDRESS(0x981DB1, uint16)[thought.type] & 0xFF) & 2){ - if (thought.item < 0x20){ - RCT2_GLOBAL(0x9AC86C, uint16) = thought.item + STR_ITEM_START; - } - else{ - RCT2_GLOBAL(0x9AC86C, uint16) = thought.item + STR_ITEM2_START; - } - } - else if ((RCT2_ADDRESS(0x981DB1, uint16)[thought.type] & 0xFF) & 4){ - if (thought.item < 0x20){ - RCT2_GLOBAL(0x9AC86C, uint16) = thought.item + STR_ITEM_SINGULAR_START; - } - else - { - RCT2_GLOBAL(0x9AC86C, uint16) = thought.item + STR_ITEM2_SINGULAR_START; - } - } - else{ - esi = 0x9AC864; //No thought? + } else if ((RCT2_ADDRESS(0x00981DB1, uint16)[thought.type] & 0xFF) & 2) { + RCT2_GLOBAL(0x009AC86C, uint16) = ShopItemStringIds[thought.item].singular; + } else if ((RCT2_ADDRESS(0x00981DB1, uint16)[thought.type] & 0xFF) & 4) { + RCT2_GLOBAL(0x009AC86C, uint16) = ShopItemStringIds[thought.item].indefinite; + } else { + esi = 0x009AC864; //No thought? } *argument_1 = ((thought.type + STR_THOUGHT_START) & 0xFFFF) | (*((uint16*)esi) << 16); *argument_2 = *((uint32*)(esi + 2)); //Always 0 apart from on rides? @@ -5739,6 +5727,15 @@ int peep_is_mechanic(rct_peep *peep) ); } +bool peep_has_item(rct_peep *peep, int peepItem) +{ + if (peepItem < 32) { + return peep->item_standard_flags & (1 << peepItem); + } else { + return peep->item_extra_flags & (1 << peepItem); + } +} + static int peep_has_food_standard_flag(rct_peep* peep){ return peep->item_standard_flags &( PEEP_ITEM_DRINK | diff --git a/src/peep/peep.h b/src/peep/peep.h index d06e802d81..e50be6e520 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -589,6 +589,7 @@ int get_peep_face_sprite_large(rct_peep *peep); int peep_check_easteregg_name(int index, rct_peep *peep); int peep_get_easteregg_name_id(rct_peep *peep); int peep_is_mechanic(rct_peep *peep); +bool peep_has_item(rct_peep *peep, int peepItem); int peep_has_food(rct_peep* peep); void peep_sprite_remove(rct_peep* peep); void peep_remove(rct_peep* peep); diff --git a/src/ride/ride_data.c b/src/ride/ride_data.c index 1970f9c96d..75c7b5d019 100644 --- a/src/ride/ride_data.c +++ b/src/ride/ride_data.c @@ -1038,3 +1038,117 @@ const money8 DefaultShopItemPrice[SHOP_ITEM_COUNT] = { MONEY(0,00), // 54 MONEY(0,00), // 55 }; + +const rct_shop_item_string_types ShopItemStringIds[SHOP_ITEM_COUNT] = { + { STR_SHOP_ITEM_SINGULAR_BALLOON, STR_SHOP_ITEM_PLURAL_BALLOON, STR_SHOP_ITEM_INDEFINITE_BALLOON, STR_SHOP_ITEM_DISPLAY_BALLOON }, + { STR_SHOP_ITEM_SINGULAR_CUDDLY_TOY, STR_SHOP_ITEM_PLURAL_CUDDLY_TOY, STR_SHOP_ITEM_INDEFINITE_CUDDLY_TOY, STR_SHOP_ITEM_DISPLAY_CUDDLY_TOY }, + { STR_SHOP_ITEM_SINGULAR_PARK_MAP, STR_SHOP_ITEM_PLURAL_PARK_MAP, STR_SHOP_ITEM_INDEFINITE_PARK_MAP, STR_SHOP_ITEM_DISPLAY_PARK_MAP }, + { STR_SHOP_ITEM_SINGULAR_ON_RIDE_PHOTO, STR_SHOP_ITEM_PLURAL_ON_RIDE_PHOTO, STR_SHOP_ITEM_INDEFINITE_ON_RIDE_PHOTO, STR_SHOP_ITEM_DISPLAY_ON_RIDE_PHOTO }, + { STR_SHOP_ITEM_SINGULAR_UMBRELLA, STR_SHOP_ITEM_PLURAL_UMBRELLA, STR_SHOP_ITEM_INDEFINITE_UMBRELLA, STR_SHOP_ITEM_DISPLAY_UMBRELLA }, + { STR_SHOP_ITEM_SINGULAR_DRINK, STR_SHOP_ITEM_PLURAL_DRINK, STR_SHOP_ITEM_INDEFINITE_DRINK, STR_SHOP_ITEM_DISPLAY_DRINK }, + { STR_SHOP_ITEM_SINGULAR_BURGER, STR_SHOP_ITEM_PLURAL_BURGER, STR_SHOP_ITEM_INDEFINITE_BURGER, STR_SHOP_ITEM_DISPLAY_BURGER }, + { STR_SHOP_ITEM_SINGULAR_CHIPS, STR_SHOP_ITEM_PLURAL_CHIPS, STR_SHOP_ITEM_INDEFINITE_CHIPS, STR_SHOP_ITEM_DISPLAY_CHIPS }, + { STR_SHOP_ITEM_SINGULAR_ICE_CREAM, STR_SHOP_ITEM_PLURAL_ICE_CREAM, STR_SHOP_ITEM_INDEFINITE_ICE_CREAM, STR_SHOP_ITEM_DISPLAY_ICE_CREAM }, + { STR_SHOP_ITEM_SINGULAR_CANDYFLOSS, STR_SHOP_ITEM_PLURAL_CANDYFLOSS, STR_SHOP_ITEM_INDEFINITE_CANDYFLOSS, STR_SHOP_ITEM_DISPLAY_CANDYFLOSS }, + { STR_SHOP_ITEM_SINGULAR_EMPTY_CAN, STR_SHOP_ITEM_PLURAL_EMPTY_CAN, STR_SHOP_ITEM_INDEFINITE_EMPTY_CAN, STR_SHOP_ITEM_DISPLAY_EMPTY_CAN }, + { STR_SHOP_ITEM_SINGULAR_RUBBISH, STR_SHOP_ITEM_PLURAL_RUBBISH, STR_SHOP_ITEM_INDEFINITE_RUBBISH, STR_SHOP_ITEM_DISPLAY_RUBBISH }, + { STR_SHOP_ITEM_SINGULAR_EMPTY_BURGER_BOX, STR_SHOP_ITEM_PLURAL_EMPTY_BURGER_BOX, STR_SHOP_ITEM_INDEFINITE_EMPTY_BURGER_BOX, STR_SHOP_ITEM_DISPLAY_EMPTY_BURGER_BOX }, + { STR_SHOP_ITEM_SINGULAR_PIZZA, STR_SHOP_ITEM_PLURAL_PIZZA, STR_SHOP_ITEM_INDEFINITE_PIZZA, STR_SHOP_ITEM_DISPLAY_PIZZA }, + { STR_SHOP_ITEM_SINGULAR_VOUCHER, STR_SHOP_ITEM_PLURAL_VOUCHER, STR_SHOP_ITEM_INDEFINITE_VOUCHER, STR_SHOP_ITEM_DISPLAY_VOUCHER }, + { STR_SHOP_ITEM_SINGULAR_POPCORN, STR_SHOP_ITEM_PLURAL_POPCORN, STR_SHOP_ITEM_INDEFINITE_POPCORN, STR_SHOP_ITEM_DISPLAY_POPCORN }, + { STR_SHOP_ITEM_SINGULAR_HOT_DOG, STR_SHOP_ITEM_PLURAL_HOT_DOG, STR_SHOP_ITEM_INDEFINITE_HOT_DOG, STR_SHOP_ITEM_DISPLAY_HOT_DOG }, + { STR_SHOP_ITEM_SINGULAR_TENTACLE, STR_SHOP_ITEM_PLURAL_TENTACLE, STR_SHOP_ITEM_INDEFINITE_TENTACLE, STR_SHOP_ITEM_DISPLAY_TENTACLE }, + { STR_SHOP_ITEM_SINGULAR_HAT, STR_SHOP_ITEM_PLURAL_HAT, STR_SHOP_ITEM_INDEFINITE_HAT, STR_SHOP_ITEM_DISPLAY_HAT }, + { STR_SHOP_ITEM_SINGULAR_TOFFEE_APPLE, STR_SHOP_ITEM_PLURAL_TOFFEE_APPLE, STR_SHOP_ITEM_INDEFINITE_TOFFEE_APPLE, STR_SHOP_ITEM_DISPLAY_TOFFEE_APPLE }, + { STR_SHOP_ITEM_SINGULAR_T_SHIRT, STR_SHOP_ITEM_PLURAL_T_SHIRT, STR_SHOP_ITEM_INDEFINITE_T_SHIRT, STR_SHOP_ITEM_DISPLAY_T_SHIRT }, + { STR_SHOP_ITEM_SINGULAR_DOUGHNUT, STR_SHOP_ITEM_PLURAL_DOUGHNUT, STR_SHOP_ITEM_INDEFINITE_DOUGHNUT, STR_SHOP_ITEM_DISPLAY_DOUGHNUT }, + { STR_SHOP_ITEM_SINGULAR_COFFEE, STR_SHOP_ITEM_PLURAL_COFFEE, STR_SHOP_ITEM_INDEFINITE_COFFEE, STR_SHOP_ITEM_DISPLAY_COFFEE }, + { STR_SHOP_ITEM_SINGULAR_EMPTY_CUP, STR_SHOP_ITEM_PLURAL_EMPTY_CUP, STR_SHOP_ITEM_INDEFINITE_EMPTY_CUP, STR_SHOP_ITEM_DISPLAY_EMPTY_CUP }, + { STR_SHOP_ITEM_SINGULAR_FRIED_CHICKEN, STR_SHOP_ITEM_PLURAL_FRIED_CHICKEN, STR_SHOP_ITEM_INDEFINITE_FRIED_CHICKEN, STR_SHOP_ITEM_DISPLAY_FRIED_CHICKEN }, + { STR_SHOP_ITEM_SINGULAR_LEMONADE, STR_SHOP_ITEM_PLURAL_LEMONADE, STR_SHOP_ITEM_INDEFINITE_LEMONADE, STR_SHOP_ITEM_DISPLAY_LEMONADE }, + { STR_SHOP_ITEM_SINGULAR_EMPTY_BOX, STR_SHOP_ITEM_PLURAL_EMPTY_BOX, STR_SHOP_ITEM_INDEFINITE_EMPTY_BOX, STR_SHOP_ITEM_DISPLAY_EMPTY_BOX }, + { STR_SHOP_ITEM_SINGULAR_EMPTY_BOTTLE, STR_SHOP_ITEM_PLURAL_EMPTY_BOTTLE, STR_SHOP_ITEM_INDEFINITE_EMPTY_BOTTLE, STR_SHOP_ITEM_DISPLAY_EMPTY_BOTTLE }, + { STR_NONE, STR_NONE, STR_NONE, STR_NONE }, + { STR_NONE, STR_NONE, STR_NONE, STR_NONE }, + { STR_NONE, STR_NONE, STR_NONE, STR_NONE }, + { STR_NONE, STR_NONE, STR_NONE, STR_NONE }, + { STR_SHOP_ITEM_SINGULAR_ON_RIDE_PHOTO, STR_SHOP_ITEM_PLURAL_ON_RIDE_PHOTO, STR_SHOP_ITEM_INDEFINITE_ON_RIDE_PHOTO, STR_SHOP_ITEM_DISPLAY_ON_RIDE_PHOTO }, + { STR_SHOP_ITEM_SINGULAR_ON_RIDE_PHOTO, STR_SHOP_ITEM_PLURAL_ON_RIDE_PHOTO, STR_SHOP_ITEM_INDEFINITE_ON_RIDE_PHOTO, STR_SHOP_ITEM_DISPLAY_ON_RIDE_PHOTO }, + { STR_SHOP_ITEM_SINGULAR_ON_RIDE_PHOTO, STR_SHOP_ITEM_PLURAL_ON_RIDE_PHOTO, STR_SHOP_ITEM_INDEFINITE_ON_RIDE_PHOTO, STR_SHOP_ITEM_DISPLAY_ON_RIDE_PHOTO }, + { STR_SHOP_ITEM_SINGULAR_PRETZEL, STR_SHOP_ITEM_PLURAL_PRETZEL, STR_SHOP_ITEM_INDEFINITE_PRETZEL, STR_SHOP_ITEM_DISPLAY_PRETZEL }, + { STR_SHOP_ITEM_SINGULAR_HOT_CHOCOLATE, STR_SHOP_ITEM_PLURAL_HOT_CHOCOLATE, STR_SHOP_ITEM_INDEFINITE_HOT_CHOCOLATE, STR_SHOP_ITEM_DISPLAY_HOT_CHOCOLATE }, + { STR_SHOP_ITEM_SINGULAR_ICED_TEA, STR_SHOP_ITEM_PLURAL_ICED_TEA, STR_SHOP_ITEM_INDEFINITE_ICED_TEA, STR_SHOP_ITEM_DISPLAY_ICED_TEA }, + { STR_SHOP_ITEM_SINGULAR_FUNNEL_CAKE, STR_SHOP_ITEM_PLURAL_FUNNEL_CAKE, STR_SHOP_ITEM_INDEFINITE_FUNNEL_CAKE, STR_SHOP_ITEM_DISPLAY_FUNNEL_CAKE }, + { STR_SHOP_ITEM_SINGULAR_SUNGLASSES, STR_SHOP_ITEM_PLURAL_SUNGLASSES, STR_SHOP_ITEM_INDEFINITE_SUNGLASSES, STR_SHOP_ITEM_DISPLAY_SUNGLASSES }, + { STR_SHOP_ITEM_SINGULAR_BEEF_NOODLES, STR_SHOP_ITEM_PLURAL_BEEF_NOODLES, STR_SHOP_ITEM_INDEFINITE_BEEF_NOODLES, STR_SHOP_ITEM_DISPLAY_BEEF_NOODLES }, + { STR_SHOP_ITEM_SINGULAR_FRIED_RICE_NOODLES, STR_SHOP_ITEM_PLURAL_FRIED_RICE_NOODLES, STR_SHOP_ITEM_INDEFINITE_FRIED_RICE_NOODLES, STR_SHOP_ITEM_DISPLAY_FRIED_RICE_NOODLES }, + { STR_SHOP_ITEM_SINGULAR_WONTON_SOUP, STR_SHOP_ITEM_PLURAL_WONTON_SOUP, STR_SHOP_ITEM_INDEFINITE_WONTON_SOUP, STR_SHOP_ITEM_DISPLAY_WONTON_SOUP }, + { STR_SHOP_ITEM_SINGULAR_MEATBALL_SOUP, STR_SHOP_ITEM_PLURAL_MEATBALL_SOUP, STR_SHOP_ITEM_INDEFINITE_MEATBALL_SOUP, STR_SHOP_ITEM_DISPLAY_MEATBALL_SOUP }, + { STR_SHOP_ITEM_SINGULAR_FRUIT_JUICE, STR_SHOP_ITEM_PLURAL_FRUIT_JUICE, STR_SHOP_ITEM_INDEFINITE_FRUIT_JUICE, STR_SHOP_ITEM_DISPLAY_FRUIT_JUICE }, + { STR_SHOP_ITEM_SINGULAR_SOYBEAN_MILK, STR_SHOP_ITEM_PLURAL_SOYBEAN_MILK, STR_SHOP_ITEM_INDEFINITE_SOYBEAN_MILK, STR_SHOP_ITEM_DISPLAY_SOYBEAN_MILK }, + { STR_SHOP_ITEM_SINGULAR_SUJONGKWA, STR_SHOP_ITEM_PLURAL_SUJONGKWA, STR_SHOP_ITEM_INDEFINITE_SUJONGKWA, STR_SHOP_ITEM_DISPLAY_SUJONGKWA }, + { STR_SHOP_ITEM_SINGULAR_SUB_SANDWICH, STR_SHOP_ITEM_PLURAL_SUB_SANDWICH, STR_SHOP_ITEM_INDEFINITE_SUB_SANDWICH, STR_SHOP_ITEM_DISPLAY_SUB_SANDWICH }, + { STR_SHOP_ITEM_SINGULAR_COOKIE, STR_SHOP_ITEM_PLURAL_COOKIE, STR_SHOP_ITEM_INDEFINITE_COOKIE, STR_SHOP_ITEM_DISPLAY_COOKIE }, + { STR_SHOP_ITEM_SINGULAR_EMPTY_BOWL_RED, STR_SHOP_ITEM_PLURAL_EMPTY_BOWL_RED, STR_SHOP_ITEM_INDEFINITE_EMPTY_BOWL_RED, STR_SHOP_ITEM_DISPLAY_EMPTY_BOWL_RED }, + { STR_SHOP_ITEM_SINGULAR_EMPTY_DRINK_CARTON, STR_SHOP_ITEM_PLURAL_EMPTY_DRINK_CARTON, STR_SHOP_ITEM_INDEFINITE_EMPTY_DRINK_CARTON, STR_SHOP_ITEM_DISPLAY_EMPTY_DRINK_CARTON }, + { STR_SHOP_ITEM_SINGULAR_EMPTY_JUICE_CUP, STR_SHOP_ITEM_PLURAL_EMPTY_JUICE_CUP, STR_SHOP_ITEM_INDEFINITE_EMPTY_JUICE_CUP, STR_SHOP_ITEM_DISPLAY_EMPTY_JUICE_CUP }, + { STR_SHOP_ITEM_SINGULAR_ROAST_SAUSAGE, STR_SHOP_ITEM_PLURAL_ROAST_SAUSAGE, STR_SHOP_ITEM_INDEFINITE_ROAST_SAUSAGE, STR_SHOP_ITEM_DISPLAY_ROAST_SAUSAGE }, + { STR_SHOP_ITEM_SINGULAR_EMPTY_BOWL_BLUE, STR_SHOP_ITEM_PLURAL_EMPTY_BOWL_BLUE, STR_SHOP_ITEM_INDEFINITE_EMPTY_BOWL_BLUE, STR_SHOP_ITEM_DISPLAY_EMPTY_BOWL_BLUE }, +}; + +const uint32 ShopItemImage[SHOP_ITEM_COUNT] = { + 5061, // SHOP_ITEM_BALLOON + 5062, // SHOP_ITEM_TOY + 5063, // SHOP_ITEM_MAP + 5064, // SHOP_ITEM_PHOTO + 5065, // SHOP_ITEM_UMBRELLA + 5066, // SHOP_ITEM_DRINK + 5067, // SHOP_ITEM_BURGER + 5068, // SHOP_ITEM_FRIES + 5069, // SHOP_ITEM_ICE_CREAM + 5070, // SHOP_ITEM_COTTON_CANDY + 5071, // SHOP_ITEM_EMPTY_CAN + 5072, // SHOP_ITEM_RUBBISH + 5073, // SHOP_ITEM_EMPTY_BURGER_BOX + 5074, // SHOP_ITEM_PIZZA + 5075, // SHOP_ITEM_VOUCHER + 5076, // SHOP_ITEM_POPCORN + 5077, // SHOP_ITEM_HOT_DOG + 5078, // SHOP_ITEM_TENTACLE + 5079, // SHOP_ITEM_HAT + 5080, // SHOP_ITEM_CANDY_APPLE + 5081, // SHOP_ITEM_TSHIRT + 5082, // SHOP_ITEM_DONUT + 5083, // SHOP_ITEM_COFFEE + 5084, // SHOP_ITEM_EMPTY_CUP + 5085, // SHOP_ITEM_CHICKEN + 5086, // SHOP_ITEM_LEMONADE + 5087, // SHOP_ITEM_EMPTY_BOX + 5088, // SHOP_ITEM_EMPTY_BOTTLE + 0, // 28 + 0, // 29 + 0, // 30 + 0, // 31 + 5089, // SHOP_ITEM_PHOTO2 + 5090, // SHOP_ITEM_PHOTO3 + 5091, // SHOP_ITEM_PHOTO4 + 5092, // SHOP_ITEM_PRETZEL + 5093, // SHOP_ITEM_CHOCOLATE + 5094, // SHOP_ITEM_ICED_TEA + 5095, // SHOP_ITEM_FUNNEL_CAKE + 5096, // SHOP_ITEM_SUNGLASSES + 5097, // SHOP_ITEM_BEEF_NOODLES + 5098, // SHOP_ITEM_FRIED_RICE_NOODLES + 5099, // SHOP_ITEM_WONTON_SOUP + 5100, // SHOP_ITEM_MEATBALL_SOUP + 5101, // SHOP_ITEM_FRUIT_JUICE + 5102, // SHOP_ITEM_SOYBEAN_MILK + 5103, // SHOP_ITEM_SU_JONGKWA + 5104, // SHOP_ITEM_SUB_SANDWICH + 5105, // SHOP_ITEM_COOKIE + 5106, // SHOP_ITEM_EMPTY_BOWL_RED + 5107, // SHOP_ITEM_EMPTY_DRINK_CARTON + 5108, // SHOP_ITEM_EMPTY_JUICE_CUP + 5109, // SHOP_ITEM_ROAST_SAUSAGE + 5110, // SHOP_ITEM_EMPTY_BOWL_BLUE +}; diff --git a/src/ride/ride_data.h b/src/ride/ride_data.h index ad559340d9..62cbb6b8f7 100644 --- a/src/ride/ride_data.h +++ b/src/ride/ride_data.h @@ -40,6 +40,13 @@ typedef struct { uint16 colour_use_flags; } rct_ride_entrance_definition; +typedef struct { + rct_string_id singular; // Balloon + rct_string_id plural; // Balloons + rct_string_id indefinite; // a Balloon + rct_string_id display; // "Diamond Heights" Balloon +} rct_shop_item_string_types; + extern const bool hasRunningTrack[0x60]; extern const uint8 initialUpkeepCosts[0x60]; extern const uint8 costPerTrackPiece[0x60]; @@ -56,5 +63,7 @@ extern const rct_ride_entrance_definition RideEntranceDefinitions[RIDE_ENTRANCE_ extern const uint8 RideLiftHillAdjustments[0x60]; extern const money8 DefaultShopItemPrice[SHOP_ITEM_COUNT]; +extern const rct_shop_item_string_types ShopItemStringIds[SHOP_ITEM_COUNT]; +extern const uint32 ShopItemImage[SHOP_ITEM_COUNT]; #endif diff --git a/src/windows/finances.c b/src/windows/finances.c index 6a39d27690..220f80058a 100644 --- a/src/windows/finances.c +++ b/src/windows/finances.c @@ -30,6 +30,7 @@ #include "../management/marketing.h" #include "../management/research.h" #include "../ride/ride.h" +#include "../ride/ride_data.h" #include "../scenario.h" #include "../sprites.h" #include "dropdown.h" @@ -1201,10 +1202,7 @@ static void window_finances_marketing_paint(rct_window *w, rct_drawpixelinfo *dp RCT2_GLOBAL(0x013CE952 + 2, uint32) = ride->name_arguments; break; case ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE: - shopString = gMarketingCampaignRideIndex[i] + 2016; // STR_BALLOONS+ - if (shopString >= 2048) // STR_AN_UMBRELLA - shopString += 96; // STR_ON_RIDE_PHOTOS+ - RCT2_GLOBAL(0x013CE952, uint16) = shopString; + RCT2_GLOBAL(0x013CE952, uint16) = ShopItemStringIds[gMarketingCampaignRideIndex[i]].plural; break; } diff --git a/src/windows/guest.c b/src/windows/guest.c index bd068b719d..935b4cc28f 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -21,23 +21,24 @@ #include "../addresses.h" #include "../config.h" #include "../game.h" -#include "../world/map.h" +#include "../input.h" #include "../management/marketing.h" #include "../peep/peep.h" #include "../peep/staff.h" #include "../ride/ride.h" +#include "../ride/ride_data.h" #include "../scenario.h" #include "../localisation/localisation.h" -#include "../world/sprite.h" #include "../sprites.h" +#include "../interface/themes.h" #include "../interface/viewport.h" #include "../interface/widget.h" #include "../interface/window.h" #include "../world/footpath.h" -#include "../input.h" +#include "../world/map.h" +#include "../world/sprite.h" #include "dropdown.h" #include "error.h" -#include "../interface/themes.h" enum WINDOW_GUEST_PAGE { WINDOW_GUEST_OVERVIEW, @@ -1949,6 +1950,79 @@ void window_guest_inventory_invalidate(rct_window *w) window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_6); } +static rct_string_id window_guest_inventory_format_item(rct_peep *peep, int item, uint8 *args) +{ + rct_ride *ride; + + // Default arguments + RCT2_GLOBAL(args + 0, uint32) = ShopItemImage[item]; + RCT2_GLOBAL(args + 4, uint16) = ShopItemStringIds[item].display; + RCT2_GLOBAL(args + 6, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, uint16); + RCT2_GLOBAL(args + 8, uint32) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, uint32); + + // Special overrides + switch (item) { + case SHOP_ITEM_BALLOON: + RCT2_GLOBAL(args + 0, uint32) |= 0x20000000 | peep->balloon_colour << 19; + break; + case SHOP_ITEM_PHOTO: + ride = GET_RIDE(peep->photo1_ride_ref); + RCT2_GLOBAL(args + 6, uint16) = ride->name; + RCT2_GLOBAL(args + 8, uint32) = ride->name_arguments; + break; + case SHOP_ITEM_UMBRELLA: + RCT2_GLOBAL(args + 0, uint32) |= 0x20000000 | peep->umbrella_colour << 19; + break; + case SHOP_ITEM_VOUCHER: + switch (peep->voucher_type) { + case VOUCHER_TYPE_PARK_ENTRY_FREE: + RCT2_GLOBAL(args + 6, uint16) = 2418; + RCT2_GLOBAL(args + 8, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, uint16); + RCT2_GLOBAL(args + 10, uint32) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, uint32); + break; + case VOUCHER_TYPE_RIDE_FREE: + ride = GET_RIDE(peep->voucher_arguments); + RCT2_GLOBAL(args + 6, uint16) = 2419; + RCT2_GLOBAL(args + 8, uint16) = ride->name; + RCT2_GLOBAL(args + 10, uint32) = ride->name_arguments; + break; + case VOUCHER_TYPE_PARK_ENTRY_HALF_PRICE: + RCT2_GLOBAL(args + 6, uint16) = 2420; + RCT2_GLOBAL(args + 8, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, uint16); + RCT2_GLOBAL(args + 10, uint32) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, uint32); + break; + case VOUCHER_TYPE_FOOD_OR_DRINK_FREE: + RCT2_GLOBAL(args + 6, uint16) = 2421; + RCT2_GLOBAL(args + 8, uint16) = ShopItemStringIds[peep->voucher_arguments].singular; + break; + } + break; + case SHOP_ITEM_HAT: + RCT2_GLOBAL(args + 0, uint32) |= 0x20000000 | peep->hat_colour << 19; + break; + case SHOP_ITEM_TSHIRT: + RCT2_GLOBAL(args + 0, uint32) |= 0x20000000 | peep->tshirt_colour << 19; + break; + case SHOP_ITEM_PHOTO2: + ride = GET_RIDE(peep->photo2_ride_ref); + RCT2_GLOBAL(args + 6, uint16) = ride->name; + RCT2_GLOBAL(args + 8, uint32) = ride->name_arguments; + break; + case SHOP_ITEM_PHOTO3: + ride = GET_RIDE(peep->photo3_ride_ref); + RCT2_GLOBAL(args + 6, uint16) = ride->name; + RCT2_GLOBAL(args + 8, uint32) = ride->name_arguments; + break; + case SHOP_ITEM_PHOTO4: + ride = GET_RIDE(peep->photo4_ride_ref); + RCT2_GLOBAL(args + 6, uint16) = ride->name; + RCT2_GLOBAL(args + 8, uint32) = ride->name_arguments; + break; + } + + return STR_GUEST_ITEM_FORMAT; +} + /* rct2: 0x00697F81 */ void window_guest_inventory_paint(rct_window *w, rct_drawpixelinfo *dpi) { @@ -1960,120 +2034,30 @@ void window_guest_inventory_paint(rct_window *w, rct_drawpixelinfo *dpi) window_guest_thoughts_tab_paint(w, dpi); window_guest_inventory_tab_paint(w, dpi); - rct_peep* peep = GET_PEEP(w->number); + rct_peep *peep = GET_PEEP(w->number); - //cx - int x = w->x + window_guest_inventory_widgets[WIDX_PAGE_BACKGROUND].left + 4; - //dx - int y = w->y + window_guest_inventory_widgets[WIDX_PAGE_BACKGROUND].top + 2; + rct_widget *pageBackgroundWidget = &window_guest_inventory_widgets[WIDX_PAGE_BACKGROUND]; + int x = w->x + pageBackgroundWidget->left + 4; + int y = w->y + pageBackgroundWidget->top + 2; + int itemNameWidth = pageBackgroundWidget->right - pageBackgroundWidget->left - 8; - int max_y = w->y + w->height - 22; - int no_items = 0; - - gfx_draw_string_left(dpi, 1810, (void*)0, 0, x, y); + int maxY = w->y + w->height - 22; + int numItems = 0; + gfx_draw_string_left(dpi, STR_CARRYING, NULL, 0, x, y); y += 10; - for (int i = 0; y < max_y && i < 28; ++i){ - int item_flag = 1 << i; - if (!(peep->item_standard_flags & item_flag))continue; - no_items++; - - RCT2_GLOBAL(0x13CE952, uint32) = 5061 + i; - - switch (item_flag){ - case PEEP_ITEM_TSHIRT: - RCT2_GLOBAL(0x13CE952, uint32) |= 0x20000000 | peep->tshirt_colour << 19; - break; - case PEEP_ITEM_HAT: - RCT2_GLOBAL(0x13CE952, uint32) |= 0x20000000 | peep->hat_colour << 19; - break; - case PEEP_ITEM_BALLOON: - RCT2_GLOBAL(0x13CE952, uint32) |= 0x20000000 | peep->balloon_colour << 19; - break; - case PEEP_ITEM_UMBRELLA: - RCT2_GLOBAL(0x13CE952, uint32) |= 0x20000000 | peep->umbrella_colour << 19; - break; - } - - int string_format = 2072 + i; - if (string_format >= 2104) string_format += 84; //??? i is never 32 - - RCT2_GLOBAL(0x13CE956, uint16) = string_format; - RCT2_GLOBAL(0x13CE958, uint16) = RCT2_GLOBAL(0x13573D4, uint16); - RCT2_GLOBAL(0x13CE95A, uint32) = RCT2_GLOBAL(0x13573D8, uint32); - rct_ride* ride; - - switch (item_flag){ - case PEEP_ITEM_PHOTO: - ride = GET_RIDE(peep->photo1_ride_ref); - RCT2_GLOBAL(0x13CE958, uint16) = ride->name; - RCT2_GLOBAL(0x13CE95A, uint32) = ride->name_arguments; - break; - case PEEP_ITEM_VOUCHER: - RCT2_GLOBAL(0x13CE958, uint16) = peep->voucher_type + 2418; - RCT2_GLOBAL(0x13CE95A, uint16) = RCT2_GLOBAL(0x13573D4, uint16); - RCT2_GLOBAL(0x13CE95C, uint32) = RCT2_GLOBAL(0x13573D8, uint32); - - if (peep->voucher_type == VOUCHER_TYPE_PARK_ENTRY_FREE || peep->voucher_type == VOUCHER_TYPE_PARK_ENTRY_HALF_PRICE)break; - - int voucher_id = peep->voucher_arguments + 1988; - if (voucher_id >= 2020) voucher_id += 102; - - RCT2_GLOBAL(0x13CE95A, uint16) = voucher_id; - - if (peep->voucher_type == VOUCHER_TYPE_FOOD_OR_DRINK_FREE)break; - ride = GET_RIDE(peep->voucher_arguments); - RCT2_GLOBAL(0x13CE95A, uint16) = ride->name; - RCT2_GLOBAL(0x13CE95C, uint32) = ride->name_arguments; - break; - } - - int width = window_guest_inventory_widgets[WIDX_PAGE_BACKGROUND].right - - window_guest_inventory_widgets[WIDX_PAGE_BACKGROUND].left - - 8; - - y += gfx_draw_string_left_wrapped(dpi, (void*)0x13CE952, x, y, width, 1875, 0); + for (int item = 0; item < SHOP_ITEM_COUNT; item++) { + if (y >= maxY) break; + if (!peep_has_item(peep, item)) continue; + + void *args = (void*)0x013CE952; + rct_string_id stringId = window_guest_inventory_format_item(peep, item, (uint8*)args); + y += gfx_draw_string_left_wrapped(dpi, args, x, y, itemNameWidth, stringId, 0); + numItems++; } - for (int i = 0; y < max_y && i < 22; ++i){ - int item_flag = 1 << i; - - if (!(peep->item_extra_flags & item_flag))continue; - no_items++; - - RCT2_GLOBAL(0x13CE952, uint32) = 5089 + i; - RCT2_GLOBAL(0x13CE956, uint16) = 2188 + i; - RCT2_GLOBAL(0x13CE958, uint16) = RCT2_GLOBAL(0x13573D4, uint16); - RCT2_GLOBAL(0x13CE95A, uint32) = RCT2_GLOBAL(0x13573D8, uint32); - - if (i < 3){ - int ride_id = 0; - switch (item_flag){ - case PEEP_ITEM_PHOTO2: - ride_id = peep->photo2_ride_ref; - break; - case PEEP_ITEM_PHOTO3: - ride_id = peep->photo3_ride_ref; - break; - case PEEP_ITEM_PHOTO4: - ride_id = peep->photo4_ride_ref; - break; - } - - rct_ride* ride = GET_RIDE(ride_id); - RCT2_GLOBAL(0x13CE958, uint16) = ride->name; - RCT2_GLOBAL(0x13CE95A, uint32) = ride->name_arguments; - } - - int width = window_guest_inventory_widgets[WIDX_PAGE_BACKGROUND].right - - window_guest_inventory_widgets[WIDX_PAGE_BACKGROUND].left - - 8; - - y += gfx_draw_string_left_wrapped(dpi, (void*)0x13CE952, x, y, width, 1875, 0); - } - - if (!no_items){ - gfx_draw_string_left(dpi, 2293, (void*)0, 0, x, y); + if (numItems == 0) { + gfx_draw_string_left(dpi, STR_NOTHING, (void*)0, 0, x, y); } } diff --git a/src/windows/new_campaign.c b/src/windows/new_campaign.c index 7e2877bc4e..7d87a96f86 100644 --- a/src/windows/new_campaign.c +++ b/src/windows/new_campaign.c @@ -26,6 +26,7 @@ #include "../interface/window.h" #include "../management/marketing.h" #include "../ride/ride.h" +#include "../ride/ride_data.h" #include "dropdown.h" #include "../interface/themes.h" @@ -252,12 +253,8 @@ static void window_new_campaign_mousedown(int widgetIndex, rct_window *w, rct_wi if (window_new_campaign_shop_items[i] == 255) break; - rct_string_id itemStringId = window_new_campaign_shop_items[i] + 2016; - if (itemStringId >= 2048) - itemStringId += 96; - gDropdownItemsFormat[i] = 1142; - gDropdownItemsArgs[i] = itemStringId; + gDropdownItemsArgs[i] = ShopItemStringIds[window_new_campaign_shop_items[i]].plural; numItems++; } @@ -316,10 +313,7 @@ static void window_new_campaign_dropdown(rct_window *w, int widgetIndex, int dro return; if (w->campaign.campaign_type == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) { - rct_string_id itemStringId = (uint16)gDropdownItemsArgs[dropdownIndex] - 2016; - if (itemStringId >= 32) - itemStringId -= 96; - w->campaign.ride_id = itemStringId; + w->campaign.ride_id = window_new_campaign_shop_items[dropdownIndex]; } else { w->campaign.ride_id = window_new_campaign_rides[dropdownIndex]; } @@ -358,17 +352,13 @@ static void window_new_campaign_invalidate(rct_window *w) window_new_campaign_widgets[WIDX_RIDE_DROPDOWN_BUTTON].type = WWT_DROPDOWN_BUTTON; window_new_campaign_widgets[WIDX_RIDE_LABEL].image = STR_MARKETING_ITEM; if (w->campaign.ride_id != SELECTED_RIDE_UNDEFINED) { - rct_string_id itemStringId = w->campaign.ride_id + 2016; - if (itemStringId >= 2048) - itemStringId += 96; - window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].image = itemStringId; + window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].image = ShopItemStringIds[w->campaign.ride_id].plural; } break; } - // Set current number of weeks spinner - RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = w->campaign.no_weeks; - window_new_campaign_widgets[WIDX_WEEKS_SPINNER].image = w->campaign.no_weeks == 1 ? STR_MARKETING_1_WEEK : STR_X_WEEKS; + // Set current number of weeks spinner (moved to paint due to required parameter) + window_new_campaign_widgets[WIDX_WEEKS_SPINNER].image = STR_NONE; // Enable / disable start button based on ride dropdown w->disabled_widgets &= ~(1 << WIDX_START_BUTTON); @@ -386,6 +376,17 @@ static void window_new_campaign_paint(rct_window *w, rct_drawpixelinfo *dpi) window_draw_widgets(w, dpi); + // Number of weeks + rct_widget *spinnerWidget = &window_new_campaign_widgets[WIDX_WEEKS_SPINNER]; + gfx_draw_string_left( + dpi, + w->campaign.no_weeks == 1 ? STR_MARKETING_1_WEEK : STR_X_WEEKS, + &w->campaign.no_weeks, + w->colours[0], + w->x + spinnerWidget->left + 1, + w->y + spinnerWidget->top + ); + x = w->x + 14; y = w->y + 60; diff --git a/src/windows/ride.c b/src/windows/ride.c index 26da8bd135..93d2cd5585 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -5966,11 +5966,7 @@ static void window_ride_customer_paint(rct_window *w, rct_drawpixelinfo *dpi) // Primary shop items sold shopItem = ride_get_entry(ride)->shop_item; if (shopItem != 0xFF) { - stringId = 2016 + shopItem; - if (stringId >= 2048) - stringId += 96; - - RCT2_GLOBAL(0x013CE952 + 0, uint16) = stringId; + RCT2_GLOBAL(0x013CE952 + 0, uint16) = ShopItemStringIds[shopItem].plural; RCT2_GLOBAL(0x013CE952 + 2, uint32) = ride->no_primary_items_sold; gfx_draw_string_left(dpi, STR_ITEMS_SOLD, (void*)0x013CE952, 0, x, y); y += 10; @@ -5981,11 +5977,7 @@ static void window_ride_customer_paint(rct_window *w, rct_drawpixelinfo *dpi) RCT2_GLOBAL(0x0097D7CB + (ride->type * 4), uint8) : ride_get_entry(ride)->shop_item_secondary; if (shopItem != 0xFF) { - stringId = 2016 + shopItem; - if (stringId >= 2048) - stringId += 96; - - RCT2_GLOBAL(0x013CE952 + 0, uint16) = stringId; + RCT2_GLOBAL(0x013CE952 + 0, uint16) = ShopItemStringIds[shopItem].plural; RCT2_GLOBAL(0x013CE952 + 2, uint32) = ride->no_secondary_items_sold; gfx_draw_string_left(dpi, STR_ITEMS_SOLD, (void*)0x013CE952, 0, x, y); y += 10; From d12b75acc2887975ea9af022763ba022c45a9f47 Mon Sep 17 00:00:00 2001 From: Maikel Stuivenberg Date: Wed, 5 Aug 2015 21:18:56 +0100 Subject: [PATCH 0450/1173] hide non-applicable marketing campaigns, closes #1516, closes #1454, fixes #1510 --- src/management/marketing.c | 47 +++++++++++++++++++++++++++++++++++++- src/management/marketing.h | 1 + src/ride/ride.c | 38 ++++++++++++++++++++++++++++++ src/ride/ride.h | 2 ++ src/windows/finances.c | 28 ++++------------------- 5 files changed, 91 insertions(+), 25 deletions(-) diff --git a/src/management/marketing.c b/src/management/marketing.c index 31cb07951f..e7bcf36095 100644 --- a/src/management/marketing.c +++ b/src/management/marketing.c @@ -167,4 +167,49 @@ void game_command_start_campaign(int* eax, int* ebx, int* ecx, int* edx, int* es } *ebx = numWeeks * AdvertisingCampaignPricePerWeek[type]; -} \ No newline at end of file +} + +bool marketing_is_campaign_type_applicable(int campaignType) +{ + int i; + rct_ride *ride; + rct_ride_type *rideEntry; + + switch (campaignType) { + case ADVERTISING_CAMPAIGN_PARK_ENTRY_FREE: + case ADVERTISING_CAMPAIGN_PARK_ENTRY_HALF_PRICE: + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) + return false; + return true; + + case ADVERTISING_CAMPAIGN_RIDE_FREE: + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY)) + return false; + + // fall-through + case ADVERTISING_CAMPAIGN_RIDE: + // Check if any rides exist + FOR_ALL_RIDES(i, ride) { + if (gRideClassifications[ride->type] == RIDE_CLASS_RIDE) { + return true; + } + } + return false; + + case ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE: + // Check if any food or drink stalls exist + FOR_ALL_RIDES(i, ride) { + rideEntry = GET_RIDE_ENTRY(ride->subtype); + if ( + shop_item_is_food_or_drink(rideEntry->shop_item) || + shop_item_is_food_or_drink(rideEntry->shop_item_secondary) + ) { + return true; + } + } + return false; + + default: + return true; + } +} diff --git a/src/management/marketing.h b/src/management/marketing.h index 33abb47560..67a35ed651 100644 --- a/src/management/marketing.h +++ b/src/management/marketing.h @@ -52,5 +52,6 @@ void marketing_update(); void marketing_set_guest_campaign(rct_peep *peep, int campaign); void marketing_start_campaign(int type, int rideOrItem, int numWeeks); void game_command_start_campaign(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); +bool marketing_is_campaign_type_applicable(int campaignType); #endif \ No newline at end of file diff --git a/src/ride/ride.c b/src/ride/ride.c index 3a639759b1..9180760cc7 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -6594,3 +6594,41 @@ bool ride_type_is_intamin(int rideType) rideType == RIDE_TYPE_GIGA_COASTER || rideType == RIDE_TYPE_INVERTED_IMPULSE_COASTER; } + +bool shop_item_is_food_or_drink(int shopItem) +{ + switch (shopItem) { + case SHOP_ITEM_DRINK: + case SHOP_ITEM_BURGER: + case SHOP_ITEM_FRIES: + case SHOP_ITEM_ICE_CREAM: + case SHOP_ITEM_COTTON_CANDY: + case SHOP_ITEM_PIZZA: + case SHOP_ITEM_POPCORN: + case SHOP_ITEM_HOT_DOG: + case SHOP_ITEM_TENTACLE: + case SHOP_ITEM_CANDY_APPLE: + case SHOP_ITEM_DONUT: + case SHOP_ITEM_COFFEE: + case SHOP_ITEM_CHICKEN: + case SHOP_ITEM_LEMONADE: + case SHOP_ITEM_PRETZEL: + case SHOP_ITEM_CHOCOLATE: + case SHOP_ITEM_ICED_TEA: + case SHOP_ITEM_FUNNEL_CAKE: + case SHOP_ITEM_SUNGLASSES: + case SHOP_ITEM_BEEF_NOODLES: + case SHOP_ITEM_FRIED_RICE_NOODLES: + case SHOP_ITEM_WONTON_SOUP: + case SHOP_ITEM_MEATBALL_SOUP: + case SHOP_ITEM_FRUIT_JUICE: + case SHOP_ITEM_SOYBEAN_MILK: + case SHOP_ITEM_SU_JONGKWA: + case SHOP_ITEM_SUB_SANDWICH: + case SHOP_ITEM_COOKIE: + case SHOP_ITEM_ROAST_SAUSAGE: + return true; + default: + return false; + } +} diff --git a/src/ride/ride.h b/src/ride/ride.h index 51661acb11..d99221f299 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -1032,4 +1032,6 @@ void ride_crash(int rideIndex, int vehicleIndex); bool ride_type_is_intamin(int rideType); void sub_6C94D8(); +bool shop_item_is_food_or_drink(int shopItem); + #endif diff --git a/src/windows/finances.c b/src/windows/finances.c index 220f80058a..14621678c1 100644 --- a/src/windows/finances.c +++ b/src/windows/finances.c @@ -1148,19 +1148,12 @@ static void window_finances_marketing_invalidate(rct_window *w) campaginButton->type = 0; - // Do not allow park entry campaigns if park entry is free - if ( - (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) && ( - i == ADVERTISING_CAMPAIGN_PARK_ENTRY_FREE || - i == ADVERTISING_CAMPAIGN_PARK_ENTRY_HALF_PRICE - ) - ) { - continue; - } - if (gMarketingCampaignDaysLeft[i] != 0) continue; + if (!marketing_is_campaign_type_applicable(i)) + continue; + campaginButton->type = WWT_DROPDOWN_BUTTON; campaginButton->top = y; campaginButton->bottom = y + 11; @@ -1176,7 +1169,6 @@ static void window_finances_marketing_paint(rct_window *w, rct_drawpixelinfo *dp { int i, x, y, weeksRemaining; rct_ride *ride; - rct_string_id shopString; window_draw_widgets(w, dpi); window_finances_draw_tab_images(dpi, w); @@ -1226,19 +1218,7 @@ static void window_finances_marketing_paint(rct_window *w, rct_drawpixelinfo *dp for (i = 0; i < ADVERTISING_CAMPAIGN_COUNT; i++) { rct_widget *campaginButton = &window_finances_marketing_widgets[WIDX_CAMPAIGN_1 + i]; - campaginButton->type = 0; - - // Do not allow park entry campaigns if park entry is free - if ( - (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) && ( - i == ADVERTISING_CAMPAIGN_PARK_ENTRY_FREE || - i == ADVERTISING_CAMPAIGN_PARK_ENTRY_HALF_PRICE - ) - ) { - continue; - } - - if (gMarketingCampaignDaysLeft[i] != 0) + if (campaginButton->type == WWT_EMPTY) continue; money32 pricePerWeek = AdvertisingCampaignPricePerWeek[i]; From 1496f2404d45b147dd396317b1b4b2ace2c0feee Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 5 Aug 2015 21:36:58 +0100 Subject: [PATCH 0451/1173] fix #1736 --- src/ride/track.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index 605003d554..2ff3307319 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3920,7 +3920,9 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in mapElement = surfaceElement; } - footpath_connect_edges(x, y, mapElement, flags); + if (!gCheatsDisableClearanceChecks || !(flags & (1 << 6))) { + footpath_connect_edges(x, y, mapElement, flags); + } map_invalidate_tile_full(x, y); } @@ -4152,7 +4154,9 @@ money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, invalidate_test_results(rideIndex); sub_6A7594(); - footpath_remove_edges_at(x, y, mapElement); + if (!gCheatsDisableClearanceChecks || !(mapElement->flags & MAP_ELEMENT_FLAG_GHOST)) { + footpath_remove_edges_at(x, y, mapElement); + } map_element_remove(mapElement); sub_6CB945(rideIndex); if (!(flags & (1 << 6))){ From cb3abcb0ca3d49ebb0b2e970d76c8637857cf499 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 5 Aug 2015 21:49:44 +0100 Subject: [PATCH 0452/1173] fix #1612 --- src/world/map.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 3a19955f70..8149fc7c8d 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2302,7 +2302,7 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi } if(*ebx & GAME_COMMAND_FLAG_APPLY && !(*ebx & 0x40)){ footpath_remove_litter(x, y, F64EC8); - if(scenery_entry->small_scenery.flags & SMALL_SCENERY_FLAG19){ + if(!gCheatsDisableClearanceChecks && (scenery_entry->small_scenery.flags & SMALL_SCENERY_FLAG19)) { map_remove_walls_at(x, y, F64EC8, F64EC8 + scenery_entry->small_scenery.height); } } @@ -2860,7 +2860,9 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in if(*ebx & GAME_COMMAND_FLAG_APPLY){ if(!(*ebx & 0x40)){ footpath_remove_litter(x2, y2, zLow * 8); - map_remove_walls_at(x2, y2, zLow * 8, zHigh * 8); + if (!gCheatsDisableClearanceChecks) { + map_remove_walls_at(x2, y2, zLow * 8, zHigh * 8); + } } rct_map_element *new_map_element = map_element_insert(x2 / 32, y2 / 32, zLow, F43887); map_animation_create(0xB, x2, y2, zLow); From 189c6bb0eec810594c2a021631e98bb5583c70b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Wed, 5 Aug 2015 22:17:31 +0200 Subject: [PATCH 0453/1173] travis fixes --- .travis.yml | 2 ++ CMakeLists.txt | 2 +- CMakeLists_mingw.txt | 2 +- install.sh | 34 ++++++++++++++++++++++------------ 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index 067ef67593..863be8d7cd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,3 +15,5 @@ cache: directories: - cache apt: true + +sudo: required diff --git a/CMakeLists.txt b/CMakeLists.txt index d3d7289ca5..61c3331c74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,7 +48,7 @@ if (UNIX) # find and include SDL2 INCLUDE(FindPkgConfig) - PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2) + PKG_CHECK_MODULES(SDL2 REQUIRED sdl2 SDL2_ttf) INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS}) endif (UNIX) diff --git a/CMakeLists_mingw.txt b/CMakeLists_mingw.txt index 538bdecf4e..580a84235f 100644 --- a/CMakeLists_mingw.txt +++ b/CMakeLists_mingw.txt @@ -20,7 +20,7 @@ endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") # find and include SDL2 INCLUDE(FindPkgConfig) -PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2) +PKG_CHECK_MODULES(SDL2 REQUIRED sdl2 SDL2_ttf) INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS}) if(APPLE) diff --git a/install.sh b/install.sh index 22fd15a6a3..7a3588113a 100755 --- a/install.sh +++ b/install.sh @@ -1,6 +1,7 @@ #!/bin/bash SDL2_PV=2.0.3 +SDL2_TTF_PV=2.0.12 cachedir=.cache mkdir -p $cachedir @@ -76,33 +77,41 @@ elif [[ `uname` == "Linux" ]]; then sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake fi -if [[ ! -f $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz ]]; then - wget http://libsdl.org/release/SDL2-devel-${SDL2_PV}-mingw.tar.gz --output-document $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz; +if [[ ! -f $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz ]]; then + wget http://libsdl.org/release/SDL2-devel-${SDL2_PV}-mingw.tar.gz --output-document $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz; +fi +if [[ ! -f $cachedir/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz ]]; then + wget https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz --output-document $cachedir/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz; fi if [[ ! -d $cachedir/SDL2-${SDL2_PV} ]]; then - pushd $cachedir - tar -xzf SDL2-devel-${SDL2_PV}-mingw.tar.gz + pushd $cachedir + tar -xzf SDL2-devel-${SDL2_PV}-mingw.tar.gz popd fi -if [[ ! -f $cachedir/orctlibs.zip ]]; then - curl https://download.openrct2.website/dev/lib/mingw -o $cachedir/orctlibs.zip; +if [[ ! -d $cachedir/SDL2_ttf-${SDL2_TTF_PV} ]]; then + pushd $cachedir + tar -xzf SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz + popd +fi +if [[ ! -f $cachedir/orctlibs.zip ]]; then + curl https://download.openrct2.website/dev/lib/mingw -o $cachedir/orctlibs.zip; fi if [[ ! -d $cachedir/orctlibs ]]; then mkdir -p $cachedir/orctlibs pushd $cachedir/orctlibs - unzip -uaq ../orctlibs.zip + unzip -uaq ../orctlibs.zip popd fi # Apply platform patch mingw_patch=libsdl2-mingw-2.0.3-fix-platform-detection-for-mingw.patch -if [[ ! -f $cachedir/$mingw_patch ]]; then - wget "https://github.com/anyc/anyc-overlay/raw/master/media-libs/libsdl2-mingw/files/$mingw_patch" --output-document $cachedir/$mingw_patch; +if [[ ! -f $cachedir/$mingw_patch ]]; then + wget "https://github.com/anyc/anyc-overlay/raw/master/media-libs/libsdl2-mingw/files/$mingw_patch" --output-document $cachedir/$mingw_patch; # XXX not sure how to make this idempotent. - pushd $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32/include/SDL2/ + pushd $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32/include/SDL2/ echo "Applying patch." - patch -p2 < ../../../../$mingw_patch + patch -p2 < ../../../../$mingw_patch popd fi @@ -111,12 +120,13 @@ if [[ ! -d /usr/local/cross-tools ]]; then fi if [[ ! -d /usr/local/cross-tools/i686-w64-mingw32 ]]; then sudo cp -r $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32 /usr/local/cross-tools/ + sudo cp -r $cachedir/SDL2_ttf-${SDL2_TTF_PV}/i686-w64-mingw32 /usr/local/cross-tools/ fi if [[ ! -d /usr/local/cross-tools/orctlibs ]]; then sudo mkdir -p /usr/local/cross-tools/orctlibs mkdir -p lib sudo cp -rf $cachedir/orctlibs/glob/* /usr/local/cross-tools/orctlibs/. - cp -rf $cachedir/orctlibs/local/* ./lib/. + cp -rf $cachedir/orctlibs/local/* ./lib/. fi if [[ ! -f $cachedir/i686-w64-mingw32-pkg-config ]]; then From 4f77cc8df3cd9af35848d21a1234039ca0c02732 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 6 Aug 2015 01:00:03 +0100 Subject: [PATCH 0454/1173] implement gfx_draw_sprite_raw_masked --- src/drawing/drawing.c | 66 +++++++++++++++++++++++++++++++++++++--- src/drawing/drawing.h | 4 +-- src/interface/viewport.c | 4 +-- src/windows/new_ride.c | 4 +-- 4 files changed, 66 insertions(+), 12 deletions(-) diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index 85a41e0f9c..cc323848b6 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -308,9 +308,6 @@ void gfx_redraw_screen_rect(short left, short top, short right, short bottom) rct_drawpixelinfo *screenDPI = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo); rct_drawpixelinfo *windowDPI = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_DPI, rct_drawpixelinfo); - // Unsure what this does - RCT2_CALLPROC_X(0x00683326, left, top, right - 1, bottom - 1, 0, 0, 0); - windowDPI->bits = screenDPI->bits + left + ((screenDPI->width + screenDPI->pitch) * top); windowDPI->x = left; windowDPI->y = top; @@ -516,7 +513,66 @@ void gfx_draw_pickedup_peep() } } -void sub_681DE2(rct_drawpixelinfo *dpi, int x, int y, int image1, int image2) +/** + * Draws the given colour image masked out by the given mask image. This can currently only cope with bitmap formatted mask and + * colour images. Presumebly the original game never used RLE images for masking. Colour 0 represents transparent. + * + * rct2: 0x00681DE2 + */ +void gfx_draw_sprite_raw_masked(rct_drawpixelinfo *dpi, int x, int y, int maskImage, int colourImage) { - RCT2_CALLPROC_X(0x00681DE2, 0, image1, x, y, 0, (int)dpi, image2); + int left, top, right, bottom, width, height; + rct_g1_element *imgMask = &g1Elements[maskImage & 0x7FFFF]; + rct_g1_element *imgColour = &g1Elements[colourImage & 0x7FFFF]; + + assert(imgMask->flags & 1); + assert(imgColour->flags & 1); + + if (dpi->zoom_level != 0) { + // TODO implement other zoom levels (probably not used though) + assert(false); + return; + } + + width = min(imgMask->width, imgColour->width); + height = min(imgMask->height, imgColour->height); + + x += imgMask->x_offset; + y += imgMask->y_offset; + + left = max(dpi->x, x); + top = max(dpi->y, y); + right = min(dpi->x + dpi->width, x + width); + bottom = min(dpi->y + dpi->height, y + height); + + width = right - left; + height = bottom - top; + if (width < 0 || height < 0) + return; + + int skipX = left - x; + int skipY = top - y; + + uint8 *maskSrc = imgMask->offset + (skipY * imgMask->width) + skipX; + uint8 *colourSrc = imgColour->offset + (skipY * imgColour->width) + skipX; + uint8 *dst = dpi->bits + (left - dpi->x) + ((top - dpi->y) * (dpi->width + dpi->pitch)); + + int maskWrap = imgMask->width - width; + int colourWrap = imgColour->width - width; + int dstWrap = ((dpi->width + dpi->pitch) - width); + for (int y = top; y < bottom; y++) { + for (int x = left; x < right; x++) { + uint8 colour = (*colourSrc) & (*maskSrc); + if (colour != 0) { + *dst = colour; + } + + maskSrc++; + colourSrc++; + dst++; + } + maskSrc += maskWrap; + colourSrc += colourWrap; + dst += dstWrap; + } } diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 280f48073f..49b36f6c57 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -112,6 +112,7 @@ void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, ui void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_pointer, uint8* palette_pointer, rct_drawpixelinfo *dpi, int image_type, int source_y_start, int height, int source_x_start, int width); void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint32 tertiary_colour); void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint8* palette_pointer, uint8* unknown_pointer); +void gfx_draw_sprite_raw_masked(rct_drawpixelinfo *dpi, int x, int y, int maskImage, int colourImage); // string int clip_text(char *buffer, int width); @@ -142,9 +143,6 @@ void ttf_dispose(); void update_rain_animation(); void redraw_rain(); -// unknown -void sub_681DE2(rct_drawpixelinfo *dpi, int x, int y, int image1, int image2); - // scrolling text void scrolling_text_initialise_bitmaps(); int scrolling_text_setup(rct_string_id stringId, uint16 scroll, uint16 scrollingMode); diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 8f13405a09..8a1dc70934 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -652,7 +652,7 @@ void paint_attached_ps(paint_struct* ps, paint_struct* attached_ps, rct_drawpixe } if (attached_ps->var_0C & 1) { - sub_681DE2(dpi, x, y, image_id, attached_ps->var_04); + gfx_draw_sprite_raw_masked(dpi, x, y, image_id, attached_ps->var_04); } else { gfx_draw_sprite(dpi, image_id, x, y, ps->var_04); } @@ -704,7 +704,7 @@ void sub_688485(){ } if (ps->var_1A & 1) - sub_681DE2(dpi, x, y, image_id, ps->var_04); + gfx_draw_sprite_raw_masked(dpi, x, y, image_id, ps->var_04); else gfx_draw_sprite(dpi, image_id, x, y, ps->var_04); diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index c035581e4a..0e1acc21eb 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -790,7 +790,7 @@ static void window_new_ride_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, i if (w->new_ride.highlighted_ride_id == *((sint16*)listItem) || flags != 0) gfx_fill_rect_inset(dpi, x, y, x + 115, y + 115, w->colours[1], 0x80 | flags); - // Draw ride image + // Draw ride image with feathered border rideEntry = rideEntries[listItem->entry_index]; int image_id = rideEntry->images_offset; if (listItem->type != rideEntry->ride_type[0]) { @@ -798,7 +798,7 @@ static void window_new_ride_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, i if (listItem->type != rideEntry->ride_type[1]) image_id++; } - sub_681DE2(dpi, x + 2, y + 2, 29013, image_id); + gfx_draw_sprite_raw_masked(dpi, x + 2, y + 2, 29013, image_id); // Next position x += 116; From d0827bd9d838d01a6d65587871f2d2b61b15b680 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 6 Aug 2015 02:12:36 +0100 Subject: [PATCH 0455/1173] implement window_maze_construction_resize and window_maze_construction_construct --- src/windows/maze_construction.c | 86 +++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 3 deletions(-) diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index dda47e957c..40256e37dd 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -135,6 +135,8 @@ static rct_window_event_list window_maze_construction_events = { #pragma endregion +static void window_maze_construction_construct(int direction); + /** * * rct2: 0x006CB481 @@ -222,7 +224,9 @@ static void window_maze_construction_mouseup(rct_window *w, int widgetIndex) case WIDX_MAZE_DIRECTION_NE: case WIDX_MAZE_DIRECTION_SE: case WIDX_MAZE_DIRECTION_SW: - RCT2_CALLPROC_X(0x006CD4AB, 0, 0, 0, widgetIndex, (int)w, 0, 0); + window_maze_construction_construct( + ((widgetIndex - WIDX_MAZE_DIRECTION_NW) - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) & 3 + ); break; } } @@ -233,7 +237,30 @@ static void window_maze_construction_mouseup(rct_window *w, int widgetIndex) */ static void window_maze_construction_resize(rct_window *w) { - RCT2_CALLPROC_X(0x006CD623, 0, 0, 0, 0, (int)w, 0, 0); + uint64 disabledWidgets = 0; + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_PLACE) { + disabledWidgets |= ( + (1ULL << WIDX_MAZE_BUILD_MODE) | + (1ULL << WIDX_MAZE_MOVE_MODE) | + (1ULL << WIDX_MAZE_FILL_MODE) | + (1ULL << WIDX_MAZE_DIRECTION_NW) | + (1ULL << WIDX_MAZE_DIRECTION_NE) | + (1ULL << WIDX_MAZE_DIRECTION_SW) | + (1ULL << WIDX_MAZE_DIRECTION_SE) + ); + } + + // Set and invalidate the changed widgets + uint64 currentDisabledWidgets = w->disabled_widgets; + if (currentDisabledWidgets == disabledWidgets) + return; + + for (int i = 0; i < 64; i++) { + if ((disabledWidgets & (1ULL << i)) != (currentDisabledWidgets & (1ULL << i))) { + widget_invalidate(w, i); + } + } + w->disabled_widgets = disabledWidgets; } /** @@ -311,7 +338,10 @@ static void window_maze_construction_toolupdate(rct_window* w, int widgetIndex, } } -/* rct2: 0x006C825F */ +/** + * + * rct2: 0x006C825F + */ static void window_maze_construction_entrance_tooldown(int x, int y, rct_window* w){ sub_6C9627(); @@ -432,3 +462,53 @@ void window_maze_construction_update_pressed_widgets() w->pressed_widgets = pressedWidgets; window_invalidate(w); } + +/** + * + * rct2: 0x006CD4AB + */ +static void window_maze_construction_construct(int direction) +{ + int x, y, z, flags, mode; + + sub_6C9627(); + + x = _currentTrackBeginX + (TileDirectionDelta[direction].x / 2); + y = _currentTrackBeginY + (TileDirectionDelta[direction].y / 2); + z = _currentTrackBeginZ; + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_MAZE_BUILD: + mode = 0; + flags = 1; + break; + case RIDE_CONSTRUCTION_STATE_MAZE_MOVE: + mode = 1; + flags = 1 | 8; + break; + default: + case RIDE_CONSTRUCTION_STATE_MAZE_FILL: + mode = 2; + flags = 1 | 8; + break; + } + + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + money32 cost = game_do_command( + x, + flags | (direction << 8), + y, + _currentRideIndex | (mode << 8), + GAME_COMMAND_SET_MAZE_TRACK, + z, + 0 + ); + if (cost == MONEY32_UNDEFINED) { + return; + } + + _currentTrackBeginX = x; + _currentTrackBeginY = y; + if (_rideConstructionState != 7) { + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + } +} From b081f27a92e5587c5b453267c0f707d2e931a91e Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 6 Aug 2015 04:00:15 +0100 Subject: [PATCH 0456/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_simplified.txt | 362 +++++++++++++------------- data/language/chinese_traditional.txt | 200 +++++++------- data/language/german.txt | 24 +- 3 files changed, 296 insertions(+), 290 deletions(-) diff --git a/data/language/chinese_simplified.txt b/data/language/chinese_simplified.txt index 78c2668896..369d60c084 100644 --- a/data/language/chinese_simplified.txt +++ b/data/language/chinese_simplified.txt @@ -4,7 +4,7 @@ STR_0000 : STR_0001 :{STRINGID} {COMMA16} STR_0002 :螺旋过山车 -STR_0003 :站立式过山车 +STR_0003 :站立过山车 STR_0004 :悬挂摇摆过山车 STR_0005 :回转过山车 STR_0006 :儿童过山车 @@ -53,7 +53,7 @@ STR_0044 :反向自由落体过山车 STR_0045 :升降观景台 STR_0046 :垂直坠落过山车 STR_0047 :自动取款机 -STR_0048 :Twist +STR_0048 :龙卷风 STR_0049 :鬼屋 STR_0050 :急救室 STR_0051 :马戏表演 @@ -69,7 +69,7 @@ STR_0060 :Unknown Ride (3A) STR_0061 :弗吉尼亚卷轴 STR_0062 :Splash Boats STR_0063 :迷你直升机 -STR_0064 :躺卧式过山车 +STR_0064 :躺卧过山车 STR_0065 :悬挂式单轨电车 STR_0066 :Unknown Ride (40) STR_0067 :反转过山车 @@ -77,12 +77,12 @@ STR_0068 :Heartline Twister Coaster STR_0069 :迷你高尔夫 STR_0070 :巨型过山车 STR_0071 :Roto-Drop -STR_0072 :飞一般的碟子 +STR_0072 :转转飞碟 STR_0073 :鬼怪屋 STR_0074 :单轨自行车 STR_0075 :紧凑回转过山车 STR_0076 :Water Coaster -STR_0077 :喷射弹射过山车 +STR_0077 :喷气弹射过山车 STR_0078 :回转发卡过山车 STR_0079 :魔毯 STR_0080 :迷你潜艇 @@ -518,7 +518,7 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0512 :一种紧凑的过山车,有着螺旋状的爬升和平滑盘旋的下坠 STR_0513 :A looping roller coaster where the riders ride in a standing position STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements @@ -609,181 +609,181 @@ STR_0599 :A compact roller coaster with individual cars and smooth twisting d STR_0600 :Powered mine trains career along a smooth and twisted track layout STR_0601 : STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions -STR_0603 :Guest {INT32} -STR_0604 :Guest {INT32} -STR_0605 :Guest {INT32} -STR_0606 :Guest {INT32} -STR_0607 :Guest {INT32} -STR_0608 :Guest {INT32} -STR_0609 :Guest {INT32} -STR_0610 :Guest {INT32} -STR_0611 :Guest {INT32} -STR_0612 :Guest {INT32} -STR_0613 :Guest {INT32} -STR_0614 :Guest {INT32} -STR_0615 :Guest {INT32} -STR_0616 :Guest {INT32} -STR_0617 :Guest {INT32} -STR_0618 :Guest {INT32} -STR_0619 :Guest {INT32} -STR_0620 :Guest {INT32} -STR_0621 :Guest {INT32} -STR_0622 :Guest {INT32} -STR_0623 :Guest {INT32} -STR_0624 :Guest {INT32} -STR_0625 :Guest {INT32} -STR_0626 :Guest {INT32} -STR_0627 :Guest {INT32} -STR_0628 :Guest {INT32} -STR_0629 :Guest {INT32} -STR_0630 :Guest {INT32} -STR_0631 :Guest {INT32} -STR_0632 :Guest {INT32} -STR_0633 :Guest {INT32} -STR_0634 :Guest {INT32} -STR_0635 :Guest {INT32} -STR_0636 :Guest {INT32} -STR_0637 :Guest {INT32} -STR_0638 :Guest {INT32} -STR_0639 :Guest {INT32} -STR_0640 :Guest {INT32} -STR_0641 :Guest {INT32} -STR_0642 :Guest {INT32} -STR_0643 :Guest {INT32} -STR_0644 :Guest {INT32} -STR_0645 :Guest {INT32} -STR_0646 :Guest {INT32} -STR_0647 :Guest {INT32} -STR_0648 :Guest {INT32} -STR_0649 :Guest {INT32} -STR_0650 :Guest {INT32} -STR_0651 :Guest {INT32} -STR_0652 :Guest {INT32} -STR_0653 :Guest {INT32} -STR_0654 :Guest {INT32} -STR_0655 :Guest {INT32} -STR_0656 :Guest {INT32} -STR_0657 :Guest {INT32} -STR_0658 :Guest {INT32} -STR_0659 :Guest {INT32} -STR_0660 :Guest {INT32} -STR_0661 :Guest {INT32} -STR_0662 :Guest {INT32} -STR_0663 :Guest {INT32} -STR_0664 :Guest {INT32} -STR_0665 :Guest {INT32} -STR_0666 :Guest {INT32} -STR_0667 :Guest {INT32} -STR_0668 :Guest {INT32} -STR_0669 :Guest {INT32} -STR_0670 :Guest {INT32} -STR_0671 :Guest {INT32} -STR_0672 :Guest {INT32} -STR_0673 :Guest {INT32} -STR_0674 :Guest {INT32} -STR_0675 :Guest {INT32} -STR_0676 :Guest {INT32} -STR_0677 :Guest {INT32} -STR_0678 :Guest {INT32} -STR_0679 :Guest {INT32} -STR_0680 :Guest {INT32} -STR_0681 :Guest {INT32} -STR_0682 :Guest {INT32} -STR_0683 :Guest {INT32} -STR_0684 :Guest {INT32} -STR_0685 :Guest {INT32} -STR_0686 :Guest {INT32} -STR_0687 :Guest {INT32} -STR_0688 :Guest {INT32} -STR_0689 :Guest {INT32} -STR_0690 :Guest {INT32} -STR_0691 :Guest {INT32} -STR_0692 :Guest {INT32} -STR_0693 :Guest {INT32} -STR_0694 :Guest {INT32} -STR_0695 :Guest {INT32} -STR_0696 :Guest {INT32} -STR_0697 :Guest {INT32} -STR_0698 :Guest {INT32} -STR_0699 :Guest {INT32} -STR_0700 :Guest {INT32} -STR_0701 :Guest {INT32} -STR_0702 :Guest {INT32} -STR_0703 :Guest {INT32} -STR_0704 :Guest {INT32} -STR_0705 :Guest {INT32} -STR_0706 :Guest {INT32} -STR_0707 :Guest {INT32} -STR_0708 :Guest {INT32} -STR_0709 :Guest {INT32} -STR_0710 :Guest {INT32} -STR_0711 :Guest {INT32} -STR_0712 :Guest {INT32} -STR_0713 :Guest {INT32} -STR_0714 :Guest {INT32} -STR_0715 :Guest {INT32} -STR_0716 :Guest {INT32} -STR_0717 :Guest {INT32} -STR_0718 :Guest {INT32} -STR_0719 :Guest {INT32} -STR_0720 :Guest {INT32} -STR_0721 :Guest {INT32} -STR_0722 :Guest {INT32} -STR_0723 :Guest {INT32} -STR_0724 :Guest {INT32} -STR_0725 :Guest {INT32} -STR_0726 :Guest {INT32} -STR_0727 :Guest {INT32} -STR_0728 :Guest {INT32} -STR_0729 :Guest {INT32} -STR_0730 :Guest {INT32} -STR_0731 :Guest {INT32} -STR_0732 :Guest {INT32} -STR_0733 :Guest {INT32} -STR_0734 :Guest {INT32} -STR_0735 :Guest {INT32} -STR_0736 :Guest {INT32} -STR_0737 :Guest {INT32} -STR_0738 :Guest {INT32} -STR_0739 :Guest {INT32} -STR_0740 :Guest {INT32} -STR_0741 :Guest {INT32} -STR_0742 :Guest {INT32} -STR_0743 :Guest {INT32} -STR_0744 :Guest {INT32} -STR_0745 :Guest {INT32} -STR_0746 :Guest {INT32} -STR_0747 :Guest {INT32} -STR_0748 :Guest {INT32} -STR_0749 :Guest {INT32} -STR_0750 :Guest {INT32} -STR_0751 :Guest {INT32} -STR_0752 :Guest {INT32} -STR_0753 :Guest {INT32} -STR_0754 :Guest {INT32} -STR_0755 :Guest {INT32} -STR_0756 :Guest {INT32} -STR_0757 :Guest {INT32} -STR_0758 :Guest {INT32} -STR_0759 :Guest {INT32} -STR_0760 :Guest {INT32} -STR_0761 :Guest {INT32} -STR_0762 :Guest {INT32} -STR_0763 :Guest {INT32} -STR_0764 :Guest {INT32} -STR_0765 :Guest {INT32} -STR_0766 :Guest {INT32} -STR_0767 :Guest {INT32} -STR_0768 :Handyman {INT32} -STR_0769 :Mechanic {INT32} -STR_0770 :Security Guard {INT32} -STR_0771 :Entertainer {INT32} -STR_0772 :Unnamed park{POP16}{POP16} -STR_0773 :Unnamed park{POP16}{POP16} -STR_0774 :Unnamed park{POP16}{POP16} -STR_0775 :Unnamed park{POP16}{POP16} -STR_0776 :Unnamed park{POP16}{POP16} -STR_0777 :Unnamed park{POP16}{POP16} +STR_0603 :游客 {INT32} +STR_0604 :游客 {INT32} +STR_0605 :游客 {INT32} +STR_0606 :游客 {INT32} +STR_0607 :游客 {INT32} +STR_0608 :游客 {INT32} +STR_0609 :游客 {INT32} +STR_0610 :游客 {INT32} +STR_0611 :游客 {INT32} +STR_0612 :游客 {INT32} +STR_0613 :游客 {INT32} +STR_0614 :游客 {INT32} +STR_0615 :游客 {INT32} +STR_0616 :游客 {INT32} +STR_0617 :游客 {INT32} +STR_0618 :游客 {INT32} +STR_0619 :游客 {INT32} +STR_0620 :游客 {INT32} +STR_0621 :游客 {INT32} +STR_0622 :游客 {INT32} +STR_0623 :游客 {INT32} +STR_0624 :游客 {INT32} +STR_0625 :游客 {INT32} +STR_0626 :游客 {INT32} +STR_0627 :游客 {INT32} +STR_0628 :游客 {INT32} +STR_0629 :游客 {INT32} +STR_0630 :游客 {INT32} +STR_0631 :游客 {INT32} +STR_0632 :游客 {INT32} +STR_0633 :游客 {INT32} +STR_0634 :游客 {INT32} +STR_0635 :游客 {INT32} +STR_0636 :游客 {INT32} +STR_0637 :游客 {INT32} +STR_0638 :游客 {INT32} +STR_0639 :游客 {INT32} +STR_0640 :游客 {INT32} +STR_0641 :游客 {INT32} +STR_0642 :游客 {INT32} +STR_0643 :游客 {INT32} +STR_0644 :游客 {INT32} +STR_0645 :游客 {INT32} +STR_0646 :游客 {INT32} +STR_0647 :游客 {INT32} +STR_0648 :游客 {INT32} +STR_0649 :游客 {INT32} +STR_0650 :游客 {INT32} +STR_0651 :游客 {INT32} +STR_0652 :游客 {INT32} +STR_0653 :游客 {INT32} +STR_0654 :游客 {INT32} +STR_0655 :游客 {INT32} +STR_0656 :游客 {INT32} +STR_0657 :游客 {INT32} +STR_0658 :游客 {INT32} +STR_0659 :游客 {INT32} +STR_0660 :游客 {INT32} +STR_0661 :游客 {INT32} +STR_0662 :游客 {INT32} +STR_0663 :游客 {INT32} +STR_0664 :游客 {INT32} +STR_0665 :游客 {INT32} +STR_0666 :游客 {INT32} +STR_0667 :游客 {INT32} +STR_0668 :游客 {INT32} +STR_0669 :游客 {INT32} +STR_0670 :游客 {INT32} +STR_0671 :游客 {INT32} +STR_0672 :游客 {INT32} +STR_0673 :游客 {INT32} +STR_0674 :游客 {INT32} +STR_0675 :游客 {INT32} +STR_0676 :游客 {INT32} +STR_0677 :游客 {INT32} +STR_0678 :游客 {INT32} +STR_0679 :游客 {INT32} +STR_0680 :游客 {INT32} +STR_0681 :游客 {INT32} +STR_0682 :游客 {INT32} +STR_0683 :游客 {INT32} +STR_0684 :游客 {INT32} +STR_0685 :游客 {INT32} +STR_0686 :游客 {INT32} +STR_0687 :游客 {INT32} +STR_0688 :游客 {INT32} +STR_0689 :游客 {INT32} +STR_0690 :游客 {INT32} +STR_0691 :游客 {INT32} +STR_0692 :游客 {INT32} +STR_0693 :游客 {INT32} +STR_0694 :游客 {INT32} +STR_0695 :游客 {INT32} +STR_0696 :游客 {INT32} +STR_0697 :游客 {INT32} +STR_0698 :游客 {INT32} +STR_0699 :游客 {INT32} +STR_0700 :游客 {INT32} +STR_0701 :游客 {INT32} +STR_0702 :游客 {INT32} +STR_0703 :游客 {INT32} +STR_0704 :游客 {INT32} +STR_0705 :游客 {INT32} +STR_0706 :游客 {INT32} +STR_0707 :游客 {INT32} +STR_0708 :游客 {INT32} +STR_0709 :游客 {INT32} +STR_0710 :游客 {INT32} +STR_0711 :游客 {INT32} +STR_0712 :游客 {INT32} +STR_0713 :游客 {INT32} +STR_0714 :游客 {INT32} +STR_0715 :游客 {INT32} +STR_0716 :游客 {INT32} +STR_0717 :游客 {INT32} +STR_0718 :游客 {INT32} +STR_0719 :游客 {INT32} +STR_0720 :游客 {INT32} +STR_0721 :游客 {INT32} +STR_0722 :游客 {INT32} +STR_0723 :游客 {INT32} +STR_0724 :游客 {INT32} +STR_0725 :游客 {INT32} +STR_0726 :游客 {INT32} +STR_0727 :游客 {INT32} +STR_0728 :游客 {INT32} +STR_0729 :游客 {INT32} +STR_0730 :游客 {INT32} +STR_0731 :游客 {INT32} +STR_0732 :游客 {INT32} +STR_0733 :游客 {INT32} +STR_0734 :游客 {INT32} +STR_0735 :游客 {INT32} +STR_0736 :游客 {INT32} +STR_0737 :游客 {INT32} +STR_0738 :游客 {INT32} +STR_0739 :游客 {INT32} +STR_0740 :游客 {INT32} +STR_0741 :游客 {INT32} +STR_0742 :游客 {INT32} +STR_0743 :游客 {INT32} +STR_0744 :游客 {INT32} +STR_0745 :游客 {INT32} +STR_0746 :游客 {INT32} +STR_0747 :游客 {INT32} +STR_0748 :游客 {INT32} +STR_0749 :游客 {INT32} +STR_0750 :游客 {INT32} +STR_0751 :游客 {INT32} +STR_0752 :游客 {INT32} +STR_0753 :游客 {INT32} +STR_0754 :游客 {INT32} +STR_0755 :游客 {INT32} +STR_0756 :游客 {INT32} +STR_0757 :游客 {INT32} +STR_0758 :游客 {INT32} +STR_0759 :游客 {INT32} +STR_0760 :游客 {INT32} +STR_0761 :游客 {INT32} +STR_0762 :游客 {INT32} +STR_0763 :游客 {INT32} +STR_0764 :游客 {INT32} +STR_0765 :游客 {INT32} +STR_0766 :游客 {INT32} +STR_0767 :游客 {INT32} +STR_0768 :勤杂工 {INT32} +STR_0769 :维修员 {INT32} +STR_0770 :警卫 {INT32} +STR_0771 :表演人员 {INT32} +STR_0772 :未命名游乐园{POP16}{POP16} +STR_0773 :未命名游乐园{POP16}{POP16} +STR_0774 :未命名游乐园{POP16}{POP16} +STR_0775 :未命名游乐园{POP16}{POP16} +STR_0776 :未命名游乐园{POP16}{POP16} +STR_0777 :未命名游乐园{POP16}{POP16} STR_0778 :Sign STR_0779 :1st STR_0780 :2nd diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 8f3657b2a0..eac5621bee 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -43,7 +43,7 @@ STR_0038 :廁所 STR_0039 :摩天輪 STR_0040 :動感模擬器 STR_0041 :3D戲院 -STR_0042 :Top Spin +STR_0042 :上旋搖擺 STR_0043 :太空飛輪 STR_0044 :向後自由落體式雲霄飛車 STR_0045 :升降機 @@ -60,19 +60,19 @@ STR_0055 :木製軌道阻力式雲霄飛車 STR_0056 :飛鼠式雲霄飛車 STR_0057 :多維度雲霄飛車 STR_0058 :Unknown Ride (38) -STR_0059 :Flying Roller Coaster +STR_0059 :飛行式雲霄飛車 STR_0060 :Unknown Ride (3A) -STR_0061 :Virginia Reel +STR_0061 :木製旋轉杯式雲霄飛車 STR_0062 :濺水船 STR_0063 :迷你直升機 STR_0064 :躺身式雲霄飛車 STR_0065 :懸吊式單軌電車 STR_0066 :Unknown Ride (40) -STR_0067 :Reverser Roller Coaster -STR_0068 :Heartline Twister Coaster +STR_0067 :木製倒轉車式雲霄飛車 +STR_0068 :管道旋轉式雲霄飛車 STR_0069 :迷你高爾夫 -STR_0070 :Giga Coaster -STR_0071 :Roto-Drop +STR_0070 :巨型雲霄飛車 +STR_0071 :旋轉落體 STR_0072 :碰碰飛碟 STR_0073 :古怪屋 STR_0074 :單軌單車 @@ -89,7 +89,7 @@ STR_0084 :Unknown Ride (52) STR_0085 :Unknown Ride (53) STR_0086 :Unknown Ride (54) STR_0087 :Unknown Ride (55) -STR_0088 :Inverted Impulse Coaster +STR_0088 :反轉極速式雲霄飛車 STR_0089 :迷你雲霄飛車 STR_0090 :礦遊式雲霄飛車 STR_0091 :Unknown Ride (59) @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. -STR_0513 :A looping roller coaster where the riders ride in a standing position -STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners -STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements -STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides +STR_0512 :一款帶有螺旋式鏈條坡道, 以及順滑又彎曲的下坡的雲霄飛車 +STR_0513 :一款乘客需要以站立乘坐的迴環式雲霄飛車 +STR_0514 :列車懸吊在雲霄飛車的軌道下, 並會在拐彎的時候搖擺乘客到旁邊 +STR_0515 :一款鐵架式雲霄飛車但列車於軌道下方行駛, 附帶很多複雜及扭曲的軌道配置 +STR_0516 :一款較溫和的雲霄飛車, 設計給不敢乘坐雲霄飛車的乘客壯膽 STR_0517 :乘客乘坐於小型火車延著窄軌鐵道行走 STR_0518 :乘客乘坐於電氣化列車延著單軌鐵路行走 -STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners -STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water -STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. -STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them -STR_0523 :Riders travel slowly in powered vehicles along a track-based route -STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down -STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track -STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower -STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops -STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track -STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track -STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again -STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops +STR_0519 :乘客乘坐於單軌軌道下的小型車廂裡, 然後在途中被不斷搖擺到一旁 +STR_0520 :一個遊客可以駕駛/划駛個人小船的船用月台 +STR_0521 :一款極快而有複雜軌道配置的雲霄飛車, 附有緊接的彎道及陡斜的落坡. 這款雲霄飛車刺激度注定會偏高. +STR_0522 :一款較小型的雲霄飛車, 乘客坐在軌道上而並沒有其他車卡包圍他們 +STR_0523 :乘客會坐在有動力的車輛內, 慢慢地依照軌道路線遊覽 +STR_0524 :自由落體的車輛會被氣體噴射到高塔頂, 並隨後自由落下 +STR_0525 :乘客飛馳在扭曲的軌道上, 只靠彎道及半月型的軌道引領他們 +STR_0526 :乘客會在不斷旋轉並上升到最頂的座艙內觀看樂園景色 +STR_0527 :一款以順滑軌道為特徵的雲霄飛車, 並附有垂直迴環可供使用 +STR_0528 :乘客坐在充氣小艇中於半月型或完全封閉的軌道上滑翔 +STR_0529 :以採礦列車為主題的雲霄飛車沿著鐵架軌道行駛, 令它很像在古老的軌道行駛上 +STR_0530 :列車懸掛在鋼纜下並不斷於車站與車站之間遊走 +STR_0531 :一款列車會穿過螺旋及迴環的較小型雲霄飛車 STR_0532 : STR_0533 : STR_0534 :自駕式, 並以氣油驅動的小型賽車(卡丁車) -STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders -STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids +STR_0535 :以運木為形狀的小船穿梭於有水的軌道, 並會於下滑時濺濕遊客 +STR_0536 :圓形的小船穿梭於比較廣闊的水道, 於水道中被瀑布濺濕, 並有激流使乘客的緊張感大增 STR_0537 : STR_0538 : STR_0539 : @@ -565,7 +565,7 @@ STR_0560 : STR_0561 : STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills -STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' +STR_0564 :一款在木製軌道運行的雲霄飛車, 這個雲霄飛車會嘈吵地飛馳過高低不平的軌道, 給乘客充足的'空中時間'之餘, 同時會給人一種'失去控制'的乘坐體驗 STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity STR_0566 :Individual roller coaster cars zip around a tight zig-zag layout of track with sharp corners and short sharp drops STR_0567 :Sitting in seats suspended either side of the track, riders are pitched head-over-heels while they plunge down steep drops and travel through various inversions @@ -601,9 +601,9 @@ STR_0596 : STR_0597 : STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track STR_0599 :A compact roller coaster with individual cars and smooth twisting drops -STR_0600 :Powered mine trains career along a smooth and twisted track layout +STR_0600 :有動車的採礦列車遊走在順滑但又曲折的軌道配置中 STR_0601 : -STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions +STR_0602 :雲霄飛車列車由直線發動機加速離開車站, 穿過盤繞的倒轉軌道後回到車站 STR_0603 :遊客{INT32} STR_0604 :遊客{INT32} STR_0605 :遊客{INT32} @@ -886,8 +886,8 @@ STR_0880 :不能升高此地... STR_0881 :物件擋於此地 STR_0882 :載入遊戲 STR_0883 :儲存遊戲 -STR_0884 :儲存劇情 -STR_0885 :儲存劇情 +STR_0884 :載入地型 +STR_0885 :儲存地型 STR_0886 :離開遊戲 STR_0887 :離開劇情編輯工具 STR_0888 :離開雲霄飛車設計工具 @@ -1322,13 +1322,13 @@ STR_1316 :玩家 STR_1317 :{COMMA16}位玩家 STR_1318 :{COMMA16}位玩家 STR_1319 :玩家{COMMA16} -STR_1320 :course -STR_1321 :courses -STR_1322 :Course -STR_1323 :Courses -STR_1324 :{COMMA16} course -STR_1325 :{COMMA16} courses -STR_1326 :Course {COMMA16} +STR_1320 :場地 +STR_1321 :場地 +STR_1322 :場地 +STR_1323 :場地 +STR_1324 :{COMMA16}個場地 +STR_1325 :{COMMA16}個場地 +STR_1326 :場地{COMMA16} STR_1327 :{SMALLFONT}{BLACK}將物件旋轉90{DEGREE} STR_1328 :需要升高或降低土地 STR_1329 :{WINDOW_COLOUR_2}發車速度: @@ -1407,8 +1407,8 @@ STR_1401 :出口 STR_1402 :{SMALLFONT}{BLACK}建造或移動遊樂設施的入口 STR_1403 :{SMALLFONT}{BLACK}建造或移動遊樂設施的出口 STR_1404 :{SMALLFONT}{BLACK}90{DEGREE}旋轉 -STR_1405 :{SMALLFONT}{BLACK}Mirror image -STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) +STR_1405 :{SMALLFONT}{BLACK}反轉鬼影 +STR_1406 :{SMALLFONT}{BLACK}使用/棄用景物 (如果這個軌道設計擁有景物) STR_1407 :{WINDOW_COLOUR_2}建造此軌道... STR_1408 :{WINDOW_COLOUR_2}費用: {BLACK}{CURRENCY} STR_1409 :入口/出口平台 @@ -1775,8 +1775,8 @@ STR_1769 :{WINDOW_COLOUR_2}搖擺次數: STR_1770 :{SMALLFONT}{BLACK}完全搖擺的次數 STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1772 :{COMMA16} -STR_1773 :Only one on-ride photo section allowed per ride -STR_1774 :Only one cable lift hill allowed per ride +STR_1773 :每個遊樂設施只可建造一個即時照相區域 +STR_1774 :每個遊樂設施只可建造一個纜索坡道 STR_1775 :關閉 STR_1776 :開啟 STR_1777 :{WINDOW_COLOUR_2}音樂 @@ -1858,8 +1858,8 @@ STR_1852 :{WINDOW_COLOUR_2}運作成本: {BLACK}未知 STR_1853 :{WINDOW_COLOUR_2}落成年份: {BLACK}今年 STR_1854 :{WINDOW_COLOUR_2}落成年份: {BLACK}去年 STR_1855 :{WINDOW_COLOUR_2}落成年份: {BLACK}{COMMA16}年前 -STR_1856 :{WINDOW_COLOUR_2}每件售出產品的利潤: {BLACK}{CURRENCY2DP} -STR_1857 :{WINDOW_COLOUR_2}每件售出產品的虧損: {BLACK}{CURRENCY2DP} +STR_1856 :{WINDOW_COLOUR_2}每件產品售出的利潤: {BLACK}{CURRENCY2DP} +STR_1857 :{WINDOW_COLOUR_2}每件產品售出的虧損: {BLACK}{CURRENCY2DP} STR_1858 :{WINDOW_COLOUR_2}成本: {BLACK}每個月{CURRENCY2DP} STR_1859 :清潔工人 STR_1860 :維修人員 @@ -2361,9 +2361,9 @@ STR_2353 :{WINDOW_COLOUR_2}掃地次數: {BLACK}{COMMA16} STR_2354 :{WINDOW_COLOUR_2}清空拉坡筒次數: {BLACK}{COMMA16} STR_2355 :{WINDOW_COLOUR_2}修理遊樂設施次數: {BLACK}{COMMA16} STR_2356 :{WINDOW_COLOUR_2}檢驗遊樂設施次數: {BLACK}{COMMA16} -STR_2357 :House +STR_2357 :房屋 STR_2358 :單位 -STR_2359 :Real Values +STR_2359 :真實數值 STR_2360 :{WINDOW_COLOUR_2}屏幕解析度: STR_2361 :土地邊緣平滑化 STR_2362 :{SMALLFONT}{BLACK}開啟/關閉土地邊緣平滑化 @@ -2390,8 +2390,8 @@ STR_2382 :土地 STR_2383 :水塘 STR_2384 :{WINDOW_COLOUR_2}你的目標: STR_2385 :{BLACK}無 -STR_2386 :{BLACK}在{MONTHYEAR}尾之前, 樂園裡至少有{COMMA16}個遊客, 而且樂園評價並不低於600 -STR_2387 :{BLACK}在{PUSH16}{PUSH16}{PUSH16}{MONTHYEAR}尾之前, 樂園價值必需達到{POP16}{POP16}{CURRENCY} +STR_2386 :{BLACK}在{POP16}{MONTHYEAR}尾之前, 樂園裡至少有{PUSH16}{PUSH16}{COMMA16}個遊客, 而且樂園評價並不低於600 +STR_2387 :{BLACK}在{POP16}{MONTHYEAR}尾之前, 樂園價值必需達到{CURRENCY} STR_2388 :{BLACK}盡情玩吧! STR_2389 :{BLACK}建造你的最佳{STRINGID}吧! STR_2390 :{BLACK}樂園必需建造十種不同種類的雲霄飛車, 而且每座的興奮度不低於6.00 @@ -2741,7 +2741,7 @@ STR_2732 :{COMMA16}ft STR_2733 :{COMMA16}m STR_2734 :{COMMA16}mph STR_2735 :{COMMA16}km/h -STR_2736 :{MONTH}, 第{COMMA16}年 +STR_2736 :第{POP16}{COMMA16}年, {PUSH16}{PUSH16}{MONTH} STR_2737 :{STRINGID} {MONTH}, 第{COMMA16}年 STR_2738 :主選單音樂: STR_2739 :無 @@ -2869,52 +2869,52 @@ STR_2858 :不能開始實行營銷計劃... STR_2859 :另外一個OpenRCT2程序已在運行中 STR_2860 :Infogrames Interactive credits... STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. -STR_2862 :Music acknowledgements... -STR_2863 :Music acknowledgements -STR_2864 :{WINDOW_COLOUR_2}March - Children of the Regiment: (Fucik) non copyright +STR_2862 :音樂鳴謝列表... +STR_2863 :音樂鳴謝列表 +STR_2864 :{WINDOW_COLOUR_2}March - Children of the Regiment: (Fucik) 無版權 STR_2865 :{WINDOW_COLOUR_2}Heyken's Serenade: (J.Heyken) British Standard Music Coy; GEMA, BRITICO -STR_2866 :{WINDOW_COLOUR_2}In Continental Mood: (Composer unknown) Copyright Control +STR_2866 :{WINDOW_COLOUR_2}In Continental Mood: (Composer unknown) 版權被受控制 STR_2867 :{WINDOW_COLOUR_2}Wedding Journey: (Traditional) -STR_2868 :{WINDOW_COLOUR_2}Tales from the Vienna Woods: (Johann Strauss) non copyright +STR_2868 :{WINDOW_COLOUR_2}Tales from the Vienna Woods: (Johann Strauss) 無版權 STR_2869 :{WINDOW_COLOUR_2}Slavonic Dance: (Traditional) STR_2870 :{WINDOW_COLOUR_2}Das Alpenhorn: (Traditional) STR_2871 :{WINDOW_COLOUR_2}The Blond Sailor: (Traditional) -STR_2872 :{WINDOW_COLOUR_2}Overture - Poet and Peasant: (Suppe) non copyright -STR_2873 :{WINDOW_COLOUR_2}Waltz Medley: (Johann Strauss) non copyright +STR_2872 :{WINDOW_COLOUR_2}Overture - Poet and Peasant: (Suppe) 無版權 +STR_2873 :{WINDOW_COLOUR_2}Waltz Medley: (Johann Strauss) 無版權 STR_2874 :{WINDOW_COLOUR_2}Bella Bella Bimba: (Traditional) STR_2875 :{WINDOW_COLOUR_2}Original recordings (P) 1976 C.J.Mears Organization, used with consent -STR_2876 :{WINDOW_COLOUR_2}RollerCoaster Tycoon 2 Title Music: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2877 :{WINDOW_COLOUR_2}Dodgems Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2878 :{WINDOW_COLOUR_2}Mid Summer's Heat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2879 :{WINDOW_COLOUR_2}Pharaoh's Tomb: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2880 :{WINDOW_COLOUR_2}Caesar's March: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2881 :{WINDOW_COLOUR_2}Drifting To Heaven: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2882 :{WINDOW_COLOUR_2}Invaders: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2883 :{WINDOW_COLOUR_2}Eternal Toybox: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2884 :{WINDOW_COLOUR_2}Jungle Juice: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2885 :{WINDOW_COLOUR_2}Ninja's Noodles: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2886 :{WINDOW_COLOUR_2}Voyage to Andromeda: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2887 :{WINDOW_COLOUR_2}Brimble's Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2888 :{WINDOW_COLOUR_2}Atlantis: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2889 :{WINDOW_COLOUR_2}Wild West Kid: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2890 :{WINDOW_COLOUR_2}Vampire's Lair: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2891 :{WINDOW_COLOUR_2}Blockbuster: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2892 :{WINDOW_COLOUR_2}Airtime Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2893 :{WINDOW_COLOUR_2}Searchlight Rag: (Scott Joplin/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2894 :{WINDOW_COLOUR_2}Flight of Fantasy: (Steve Blenkinsopp) copyright {COPYRIGHT} Chris Sawyer -STR_2895 :{WINDOW_COLOUR_2}Big Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2896 :{WINDOW_COLOUR_2}Hypothermia: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2897 :{WINDOW_COLOUR_2}Last Sleigh Ride: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2898 :{WINDOW_COLOUR_2}Pipes of Glencairn: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2899 :{WINDOW_COLOUR_2}Traffic Jam: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2876 :{WINDOW_COLOUR_2}RollerCoaster Tycoon 2 Title Music: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2877 :{WINDOW_COLOUR_2}Dodgems Beat: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2878 :{WINDOW_COLOUR_2}Mid Summer's Heat: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2879 :{WINDOW_COLOUR_2}Pharaoh's Tomb: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2880 :{WINDOW_COLOUR_2}Caesar's March: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2881 :{WINDOW_COLOUR_2}Drifting To Heaven: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2882 :{WINDOW_COLOUR_2}Invaders: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2883 :{WINDOW_COLOUR_2}Eternal Toybox: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2884 :{WINDOW_COLOUR_2}Jungle Juice: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2885 :{WINDOW_COLOUR_2}Ninja's Noodles: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2886 :{WINDOW_COLOUR_2}Voyage to Andromeda: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2887 :{WINDOW_COLOUR_2}Brimble's Beat: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2888 :{WINDOW_COLOUR_2}Atlantis: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2889 :{WINDOW_COLOUR_2}Wild West Kid: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2890 :{WINDOW_COLOUR_2}Vampire's Lair: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2891 :{WINDOW_COLOUR_2}Blockbuster: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2892 :{WINDOW_COLOUR_2}Airtime Rock: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2893 :{WINDOW_COLOUR_2}Searchlight Rag: (Scott Joplin/Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2894 :{WINDOW_COLOUR_2}Flight of Fantasy: (Steve Blenkinsopp) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2895 :{WINDOW_COLOUR_2}Big Rock: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2896 :{WINDOW_COLOUR_2}Hypothermia: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2897 :{WINDOW_COLOUR_2}Last Sleigh Ride: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2898 :{WINDOW_COLOUR_2}Pipes of Glencairn: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2899 :{WINDOW_COLOUR_2}Traffic Jam: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 STR_2900 :{WINDOW_COLOUR_2} -STR_2901 :{WINDOW_COLOUR_2}(Samples courtesy of Spectrasonics {ENDQUOTES}Liquid Grooves{ENDQUOTES}) -STR_2902 :{WINDOW_COLOUR_2}Toccata: (C.M.Widor, played by Peter James Adcock) recording {COPYRIGHT} Chris Sawyer -STR_2903 :{WINDOW_COLOUR_2}Space Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2904 :{WINDOW_COLOUR_2}Manic Mechanic: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2905 :{WINDOW_COLOUR_2}Techno Torture: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2906 :{WINDOW_COLOUR_2}Sweat Dreams: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2907 :{WINDOW_COLOUR_2}What shall we do with the Drunken Sailor: (Anon/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2901 :{WINDOW_COLOUR_2}(音樂採樣承蒙Spectrasonics {ENDQUOTES}Liquid Grooves{ENDQUOTES}) +STR_2902 :{WINDOW_COLOUR_2}Toccata: (C.M.Widor, played by Peter James Adcock) recording {COPYRIGHT} Chris Sawyer 版權所有 +STR_2903 :{WINDOW_COLOUR_2}Space Rock: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2904 :{WINDOW_COLOUR_2}Manic Mechanic: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2905 :{WINDOW_COLOUR_2}Techno Torture: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2906 :{WINDOW_COLOUR_2}Sweat Dreams: (Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 +STR_2907 :{WINDOW_COLOUR_2}What shall we do with the Drunken Sailor: (Anon/Allister Brimble) {COPYRIGHT} Chris Sawyer 版權所有 STR_2908 :{WINDOW_COLOUR_2}Infogrames Interactive STR_2909 :{WINDOW_COLOUR_2}Senior Producer: Thomas J. Zahorik STR_2910 :{WINDOW_COLOUR_2}Executive Producer: Bill Levay @@ -3338,7 +3338,7 @@ STR_3327 :尚未設定遊客的開始步行位置 STR_3328 :不能進行下一步編輯... STR_3329 :尚未建造樂園入口 STR_3330 :樂園必需有一些己擁有的土地 -STR_3331 :由地圖邊緣到樂園入口的道路尚未連接好, 或者太覆雜 - 這些道路必需是一格寬度, 並以越少交界及彎位越好 +STR_3331 :由地圖邊緣到樂園入口的道路尚未連接好, 或者太複雜 - 這些道路必需是一格寬度, 並以越少交界及彎位越好 STR_3332 :樂園入口倒轉了, 或沒有道路連接至地圖邊緣 STR_3333 :在存檔中導出附加物件 STR_3334 :{SMALLFONT}{BLACK}選擇是否儲存附加物件(額外加入的附加物件)到存檔, 以便存檔給沒有那些附加物件的人載入 @@ -3473,7 +3473,7 @@ STR_5133 :{SMALLFONT}{BLACK}選擇較小的土地範圍 STR_5134 :{SMALLFONT}{BLACK}選擇較大的土地範圍 STR_5135 :{SMALLFONT}{BLACK}購買土地擁有權或建造權 STR_5136 :土地擁有權 -STR_5137 :允許鏈條上拉及發車速度{NEWLINE}高至{VELOCITY} +STR_5137 :允許鏈條上拉及發車速度高至{VELOCITY} STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} STR_5139 :{WHITE}{STRINGID} STR_5140 :去除煞車組件故障 @@ -3675,11 +3675,11 @@ STR_5334 :雪地 STR_5335 :遊樂設施入口 STR_5336 :遊樂設施出口 STR_5337 :樂園入口 -STR_5338 :Element type -STR_5339 :Base height -STR_5340 :Clearance height -STR_5341 :Flags -STR_5342 :Choose a map tile +STR_5338 :元素類別 +STR_5339 :地面高度 +STR_5340 :清理高度 +STR_5341 :標記 +STR_5342 :請選擇地圖網格 STR_5343 :自動放置員工 STR_5344 :更新日誌 STR_5345 :用於財政的密技 @@ -3778,14 +3778,14 @@ STR_5437 :暫無存檔被選中 STR_5438 :當命令編輯工具開啟不能作出改變 STR_5439 :4秒以上的等待(Wait)命令需要加上重新開始(Restart)命令 STR_5440 :當焦點失去時最小化全螢幕的遊戲 -STR_5441 :{SMALLFONT}{BLACK}以軌道類別分別遊樂設施,{NEWLINE}令到車輔風格可以在建造後更改,(RCT1){NEWLINE}就像夢幻遊樂園1一樣. +STR_5441 :{SMALLFONT}{BLACK}以軌道類別分別遊樂設施,{NEWLINE}令到車輔風格可以在建造後更改,{NEWLINE}就像夢幻遊樂園1(RCT1)一樣. STR_5442 :固定樂園評價: STR_5443 :速度{MOVE_X}{87}{STRINGID} STR_5444 :速度: STR_5445 :速度 STR_5446 :獲取 -STR_5447 :Type {STRINGID} -STR_5448 :Ride / Vehicle {STRINGID} +STR_5447 :類別 {STRINGID} +STR_5448 :遊樂設施/車輛 {STRINGID} STR_5449 :減慢遊戲速度 STR_5450 :增快遊戲速度 STR_5451 :開啟密技視窗 @@ -3822,3 +3822,5 @@ STR_5481 :主題 STR_5482 :{WINDOW_COLOUR_2}上次檢查時間: {BLACK} 1分鐘前 STR_5483 :{BLACK}(還剩{COMMA16}週結束) STR_5484 :{BLACK}(還剩{COMMA16}週結束) +STR_5485 :{SMALLFONT}{STRING} +STR_5486 :{BLACK}{COMMA16} diff --git a/data/language/german.txt b/data/language/german.txt index 942259e496..ab5475bd2c 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -1172,8 +1172,8 @@ STR_1167 :Wasserspiegel kann hier nicht erhöht werden... STR_1168 :Optionen STR_1169 :(Keine) STR_1170 :{STRING} -STR_1171 :{RED}Geschlossen - - -STR_1172 :{YELLOW}{STRINGID} - - +STR_1171 :{RED}Geschlossen - - +STR_1172 :{YELLOW}{STRINGID} - - STR_1173 :{SMALLFONT}{BLACK}Fußwege und Warteschlangenreihen anlegen STR_1174 :Banner im Weg STR_1175 :Kann nicht auf Fußweg mit Neigung angelegt werden @@ -1731,8 +1731,8 @@ STR_1726 :Land nicht zum Verkauf! STR_1727 :Baurechte nicht zum Verkauf! STR_1728 :Erwerb von Baurechten hier nicht möglich... STR_1729 :Land gehört nicht dem Park! -STR_1730 :{RED}Geschlossen - - -STR_1731 :{WHITE}{STRINGID} - - +STR_1730 :{RED}Geschlossen - - +STR_1731 :{WHITE}{STRINGID} - - STR_1732 :Bauen STR_1733 :Modus STR_1734 :{WINDOW_COLOUR_2}Anzahl der Runden: @@ -1779,7 +1779,7 @@ STR_1774 :Nur ein Kabellifthügel pro Bahn erlaubt STR_1775 :Aus STR_1776 :Ein STR_1777 :{WINDOW_COLOUR_2}Musik -STR_1778 :{STRINGID} - - +STR_1778 :{STRINGID} - - STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Pandakostüm STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tigerkostüm STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elefantenkostüm @@ -1938,7 +1938,7 @@ STR_1933 :{STRINGID} ist in {STRINGID} STR_1934 :{STRINGID} hat {STRINGID} verlassen STR_1935 :{STRINGID} hat den Park verlassen STR_1936 :{STRINGID} hat {STRINGID} gekauft -STR_1937 :{SMALLFONT}{BLACK}Informationen zum Thema dieser Nachricht anzeigen +STR_1937 :{SMALLFONT}{BLACK}Informationen zum Thema dieser{NEWLINE}Nachricht anzeigen STR_1938 :{SMALLFONT}{BLACK}Ansicht des Besuchers anzeigen STR_1939 :{SMALLFONT}{BLACK}Ansicht des Mitarbeiters anzeigen STR_1940 :{SMALLFONT}{BLACK}Vergnügen, Energie, Hunger, usw.{NEWLINE}dieses Besuchers anzeigen @@ -2986,7 +2986,7 @@ STR_2977 :Mitarbeitername STR_2978 :Neuen Namen für diesen Mitarbeiter eingeben: STR_2979 :Dieser Mitarbeiter kann nicht benannt werden... STR_2980 :Zu viele Banner im Spiel -STR_2981 :{RED}Kein Zutritt - - +STR_2981 :{RED}Kein Zutritt - - STR_2982 :Bannertext STR_2983 :Neuen Text für dieses Banner eingeben: STR_2984 :Neuer Text für das Banner kann nicht erstellt werden... @@ -3310,14 +3310,14 @@ STR_3301 :{WINDOW_COLOUR_2}Zieldatum: STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR} STR_3303 :{WINDOW_COLOUR_2}Besucheranzahl: STR_3304 :{WINDOW_COLOUR_2}Verkehrswert: -STR_3305 :{WINDOW_COLOUR_2}Mon. Einkünfte: +STR_3305 :{WINDOW_COLOUR_2}Monatliche Einkünfte: STR_3306 :{WINDOW_COLOUR_2}Monatlicher Gewinn: STR_3307 :{WINDOW_COLOUR_2}Mindestlänge: STR_3308 :{WINDOW_COLOUR_2}Nervenkitzelwert: STR_3309 :{WINDOW_COLOUR_2}{COMMA16} STR_3310 :{WINDOW_COLOUR_2}{LENGTH} STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32} -STR_3312 :{WINDOW_COLOUR_2}Attraktionen unter Beibehaltungsauftrag: +STR_3312 :{WINDOW_COLOUR_2}Attraktionen unter Beibehaltungsauftrag: STR_3313 :Szenarioname STR_3314 :Namen für Szenario eingeben: STR_3315 :Park-/Szenariodetails @@ -3356,7 +3356,7 @@ STR_3347 :Bahn ist zu lang, enthält zu viele Elemente oder Szenerie ist zu z STR_3348 :Umbenennen STR_3349 :Löschen STR_3350 :Streckenentwurfsname -STR_3351 :Neuen Namen für diesen Streckenentwurf eingeben: +STR_3351 :Neuen Namen für Streckenentwurf eingeben: STR_3352 :Streckenentwurf kann nicht umbenannt werden... STR_3353 :Neuer Name enthält ungültige Zeichen STR_3354 :Entweder besteht bereits eine Datei mit diesem Namen oder die Datei ist schreibgeschützt @@ -3818,3 +3818,7 @@ STR_5481 :Themen STR_5482 :{WINDOW_COLOUR_2}Letzte Inspektion vor: {BLACK}1 Minute STR_5483 :{BLACK}({COMMA16} Wochen verbleibend) STR_5484 :{BLACK}({COMMA16} Woche verbleibend) +STR_5485 :{SMALLFONT}{STRING} +STR_5486 :{BLACK}{COMMA16} +STR_5487 :{SMALLFONT}{BLACK}Aktuelle Nachrichten anzeigen +STR_5488 :Kein Eingang From fd6ddb7120506b508870dc37402f47ffbcb5fb2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 7 Aug 2015 00:38:35 +0200 Subject: [PATCH 0457/1173] Prevent accessing memory we don't own In case where strlen(propertyName) < strlen(name) we are accessing memory from stack mapping possibly outside our ownership. Prevent such behaviour by clamping the check to valid range only. --- src/config.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 6ad85f1ee4..0d98282e60 100644 --- a/src/config.c +++ b/src/config.c @@ -522,7 +522,8 @@ config_section_definition *config_get_section_def(const utf8 *name, int size) for (i = 0; i < countof(_sectionDefinitions); i++) { const_utf8string sectionName = _sectionDefinitions[i].section_name; - if (sectionName[size] == 0 && _strnicmp(sectionName, name, size) == 0) + const int sectionNameSize = strnlen(sectionName, size); + if (sectionNameSize == size && sectionName[size] == 0 && _strnicmp(sectionName, name, size) == 0) return &_sectionDefinitions[i]; } @@ -535,8 +536,11 @@ config_property_definition *config_get_property_def(config_section_definition *s for (i = 0; i < section->property_definitions_count; i++) { const_utf8string propertyName = section->property_definitions[i].property_name; - if (propertyName[size] == 0 && _strnicmp(propertyName, name, size) == 0) + const int propertyNameSize = strnlen(propertyName, size); + if (propertyNameSize == size && propertyName[size] == 0 && _strnicmp(propertyName, name, size) == 0) + { return §ion->property_definitions[i]; + } } return NULL; From 5e804463c8b1ef9bbea059b9fb28196cc80311a8 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 7 Aug 2015 02:04:32 +0100 Subject: [PATCH 0458/1173] fix #1740 --- src/config.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 0d98282e60..d5b49afef9 100644 --- a/src/config.c +++ b/src/config.c @@ -266,9 +266,9 @@ void config_set_defaults() config_section_definition *section = &_sectionDefinitions[i]; for (j = 0; j < section->property_definitions_count; j++) { config_property_definition *property = §ion->property_definitions[j]; - value_union *destValue = (value_union*)((size_t)section->base_address + (size_t)property->offset); + // Special dynamic defaults if (strcmp(property->property_name, "language") == 0){ destValue->value_uint16 = platform_get_locale_language(); if (destValue->value_uint16 == LANGUAGE_UNDEFINED) @@ -284,7 +284,17 @@ void config_set_defaults() destValue->value_uint8 = platform_get_locale_temperature_format(); } else { - memcpy(destValue, &property->default_value, _configValueTypeSize[property->type]); + // Use static default + if (property->type == CONFIG_VALUE_TYPE_STRING) { + // Copy the string to new memory + const utf8 *src = property->default_value.value_string; + const utf8 **dst = &(destValue->value_string); + if (src != NULL) { + *dst = _strdup(property->default_value.value_string); + } + } else { + memcpy(destValue, &property->default_value, _configValueTypeSize[property->type]); + } } } } From f43c7f6ac1bec522d63f4bd6856e5a9121d72f2f Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 7 Aug 2015 02:47:57 +0100 Subject: [PATCH 0459/1173] implement viewport_vehicle_paint_setup --- src/interface/viewport.c | 53 +++++++++++++++++++++++++++++++++++++++- src/ride/vehicle.h | 6 +++-- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 8a1dc70934..1eb1ce114e 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -877,7 +877,58 @@ int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int edx, sint16 si, s */ void viewport_vehicle_paint_setup(rct_vehicle *vehicle, int imageDirection) { - RCT2_CALLPROC_X(0x006D4244, vehicle->x, imageDirection, vehicle->y, vehicle->z, (int)vehicle, 0, 0); + rct_ride_type *rideEntry; + rct_ride_type_vehicle *vehicleEntry; + + int x = vehicle->x; + int y = vehicle->y; + int z = vehicle->z; + + if (vehicle->var_0C & 0x80) { + uint32 ebx = 22965 + vehicle->var_C5; + RCT2_GLOBAL(0x9DEA52, uint16) = 0; + RCT2_GLOBAL(0x9DEA54, uint16) = 0; + RCT2_GLOBAL(0x9DEA56, uint16) = z + 2; + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) { + case 0: RCT2_CALLPROC_X(0x00686806, 0, ebx, 0, z, 1, 1, 0); break; + case 1: RCT2_CALLPROC_X(0x006869B2, 0, ebx, 0, z, 1, 1, 0); break; + case 2: RCT2_CALLPROC_X(0x00686B6F, 0, ebx, 0, z, 1, 1, 0); break; + case 3: RCT2_CALLPROC_X(0x00686D31, 0, ebx, 0, z, 1, 1, 0); break; + } + } + + if (vehicle->ride_subtype == 0xFF) { + vehicleEntry = (rct_ride_type_vehicle*)0x009DE232; + } else { + rideEntry = GET_RIDE_ENTRY(vehicle->ride_subtype); + vehicleEntry = &rideEntry->vehicles[vehicle->vehicle_type]; + + if (vehicle->var_48 & 0x800) { + vehicleEntry++; + z += 16; + } + } + + uint32 rct2VehiclePtrFormat = ((uint32)vehicleEntry) - offsetof(rct_ride_type, vehicles); + RCT2_GLOBAL(0x00F64DFC, uint32) = rct2VehiclePtrFormat; + switch (vehicleEntry->var_5D) { + case 0: RCT2_CALLPROC_X(0x006D45F8, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 2: RCT2_CALLPROC_X(0x006D5FAB, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 3: RCT2_CALLPROC_X(0x006D6258, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 4: RCT2_CALLPROC_X(0x006D5889, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 5: RCT2_CALLPROC_X(0x006D42F0, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 6: RCT2_CALLPROC_X(0x006D43C6, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 7: RCT2_CALLPROC_X(0x006D4453, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 8: RCT2_CALLPROC_X(0x006D4295, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 9: RCT2_CALLPROC_X(0x006D5DA9, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 10: RCT2_CALLPROC_X(0x006D5600, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 11: RCT2_CALLPROC_X(0x006D5696, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 12: RCT2_CALLPROC_X(0x006D57EE, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 13: RCT2_CALLPROC_X(0x006D5783, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 14: RCT2_CALLPROC_X(0x006D5701, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 15: RCT2_CALLPROC_X(0x006D5B48, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 16: RCT2_CALLPROC_X(0x006D44D5, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + } } /** diff --git a/src/ride/vehicle.h b/src/ride/vehicle.h index 8c5b270101..b2c95e4f7d 100644 --- a/src/ride/vehicle.h +++ b/src/ride/vehicle.h @@ -39,7 +39,7 @@ typedef struct { // Height from center of sprite to bottom uint8 sprite_height_negative; // 0x09 uint16 sprite_index; // 0x0A - uint8 pad_0C[2]; + uint16 var_0C; sint16 x; // 0x0E sint16 y; // 0x10 sint16 z; // 0x12 @@ -91,7 +91,9 @@ typedef struct { sint8 var_BF; uint8 pad_C0[0x02]; uint8 speed; // 0xC2 - uint8 pad_C3[0x09]; + uint8 pad_C3[2]; + uint8 var_C5; + uint8 pad_C6[6]; uint8 var_CC; uint8 var_CD; union { From 2a9698c7c22941fb3444cfc13474d2de6c3c0ebb Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 7 Aug 2015 04:00:14 +0100 Subject: [PATCH 0460/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 36 ++++++++++++++------------- data/language/english_us.txt | 10 +++++++- data/language/german.txt | 2 +- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index eac5621bee..d37de1174d 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -555,16 +555,16 @@ STR_0550 : STR_0551 : STR_0552 : STR_0553 : -STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station -STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another -STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience +STR_0554 :列車會被又長又直的軌道上的直線發動機加速, 然後衝上垂直軌道, 自由落體後回到車站 +STR_0555 :遊客乘搭升降機上下穿梭於垂直的管道中, 並借此訪問另一層 +STR_0556 :加闊的列車於垂直下坡上完全滑落, 給予人終極的雲霄飛車自由落體體驗 STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects -STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills +STR_0562 :有動力的車輛將會穿梭於有著恐怖景物及特效的多層軌道中 +STR_0563 :乘客坐在舒適並只有簡單安全裝備的列車上享受巨大而順滑的下滑, 扭曲的軌道和充足的'空中'時間 STR_0564 :一款在木製軌道運行的雲霄飛車, 這個雲霄飛車會嘈吵地飛馳過高低不平的軌道, 給乘客充足的'空中時間'之餘, 同時會給人一種'失去控制'的乘坐體驗 STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity STR_0566 :Individual roller coaster cars zip around a tight zig-zag layout of track with sharp corners and short sharp drops @@ -591,7 +591,7 @@ STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curv STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops STR_0589 : -STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0590 :乘客在潛艇中觀賞水底的景觀 STR_0591 :木筏造型船於河道上慢慢地遊覽著 STR_0592 : STR_0593 : @@ -599,8 +599,8 @@ STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track -STR_0599 :A compact roller coaster with individual cars and smooth twisting drops +STR_0598 :反轉式雲霄飛車加速離開車站, 穿過到垂直軌道的尖端, 然後倒轉返回到車站, 再穿越到另一邊垂直軌道的尖端 +STR_0599 :一款擁有獨立車輛及順滑又彎曲的下坡的緊湊式雲霄飛車 STR_0600 :有動車的採礦列車遊走在順滑但又曲折的軌道配置中 STR_0601 : STR_0602 :雲霄飛車列車由直線發動機加速離開車站, 穿過盤繞的倒轉軌道後回到車站 @@ -1861,14 +1861,14 @@ STR_1855 :{WINDOW_COLOUR_2}落成年份: {BLACK}{COMMA16}年前 STR_1856 :{WINDOW_COLOUR_2}每件產品售出的利潤: {BLACK}{CURRENCY2DP} STR_1857 :{WINDOW_COLOUR_2}每件產品售出的虧損: {BLACK}{CURRENCY2DP} STR_1858 :{WINDOW_COLOUR_2}成本: {BLACK}每個月{CURRENCY2DP} -STR_1859 :清潔工人 -STR_1860 :維修人員 -STR_1861 :安全警衛 -STR_1862 :表演人員 -STR_1863 :清潔工人 -STR_1864 :維修人員 -STR_1865 :安全警衛 -STR_1866 :表演人員 +STR_1859 :個清潔工人 +STR_1860 :個維修人員 +STR_1861 :個安全警衛 +STR_1862 :個表演人員 +STR_1863 :個清潔工人 +STR_1864 :個維修人員 +STR_1865 :個安全警衛 +STR_1866 :個表演人員 STR_1867 :{BLACK}{COMMA16} {STRINGID} STR_1868 :不能改變旋轉次數... STR_1869 :{WINDOW_COLOUR_2}旋轉次數: @@ -2788,7 +2788,7 @@ STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} STR_2779 :額外檢視視窗#{COMMA16} STR_2780 :新的額外檢視視窗 # End of new strings -STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :更改鍵盤快捷鍵 @@ -3824,3 +3824,5 @@ STR_5483 :{BLACK}(還剩{COMMA16}週結束) STR_5484 :{BLACK}(還剩{COMMA16}週結束) STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} +STR_5487 :{SMALLFONT}{BLACK}顯示最近消息 +STR_5488 :隱藏入口 diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 1d44d5fa75..1d2ceb24f3 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -2791,7 +2791,7 @@ STR_2780 :Extra viewport # End of new strings -STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :Change keyboard shortcut @@ -3816,9 +3816,17 @@ STR_5471 :Scroll map down STR_5472 :Scroll map right STR_5473 :Cycle day / night STR_5474 :Display text on banners in upper case +STR_5475 :{COMMA16} weeks STR_5476 :Hardware STR_5477 :Map rendering STR_5478 :Controls STR_5479 :Toolbar STR_5480 :Show toolbar buttons for: STR_5481 :Themes +STR_5482 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}1 minute +STR_5483 :{BLACK}({COMMA16} weeks remaining) +STR_5484 :{BLACK}({COMMA16} week remaining) +STR_5485 :{SMALLFONT}{STRING} +STR_5486 :{BLACK}{COMMA16} +STR_5487 :{SMALLFONT}{BLACK}Show recent messages +STR_5488 :No entrance diff --git a/data/language/german.txt b/data/language/german.txt index ab5475bd2c..56ae6e57a8 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -2786,7 +2786,7 @@ STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} STR_2779 :Ansichtsfenster {COMMA16} STR_2780 :Extra Ansichtsfenster # End of new strings -STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :UMSCHALT + STR_2783 :STRG + STR_2784 :Tastaturkürzel ändern From 46a0529f40995ce536c35f7117fb11b6abd19005 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 7 Aug 2015 22:34:15 +0200 Subject: [PATCH 0461/1173] Add comment to clarify that non-inventioned rides are skipped --- src/windows/new_ride.c | 1 + src/windows/ride.c | 1 + 2 files changed, 2 insertions(+) diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index 0e1acc21eb..032df21a2c 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -320,6 +320,7 @@ static void window_new_ride_populate_list() quadIndex = rideEntryIndex >> 5; bitIndex = rideEntryIndex & 0x1F; + // Skip if vehicle type is not invented yet if (!(RCT2_ADDRESS(0x01357424, uint32)[quadIndex] & (1 << bitIndex))) continue; diff --git a/src/windows/ride.c b/src/windows/ride.c index 93d2cd5585..96b1a2d869 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -2330,6 +2330,7 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi quadIndex = rideEntryIndex >> 5; bitIndex = rideEntryIndex & 0x1F; + // Skip if vehicle type is not invented yet if (!(RCT2_ADDRESS(0x01357424, uint32)[quadIndex] & (1 << bitIndex))) continue; From 5ae099c062f4f36e9f05491b8ce38c64ac3707a0 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 8 Aug 2015 04:00:15 +0100 Subject: [PATCH 0462/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index b5bf36ce2b..adfa8db8c1 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -2294,7 +2294,7 @@ STR_2289 :{STRINGID} {STRINGID} STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} STR_2291 :Selecteer een scenario voor een nieuw spel STR_2292 :{WINDOW_COLOUR_2}Bezochte attracties: -STR_2293 :{BLACK} Geen +STR_2293 :{BLACK} Niets STR_2294 :{SMALLFONT}{BLACK}Bovenkant land aanpassen STR_2295 :{SMALLFONT}{BLACK}Zijkant land aanpassen STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} betaald voor entree @@ -2782,7 +2782,7 @@ STR_2777 :{MOVE_X}{SMALLFONT}{STRING} STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} STR_2779 :Kijkvenster {COMMA16} STR_2780 :Extra kijkvenster -STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :Sneltoets wijzigen @@ -3817,3 +3817,7 @@ STR_5481 :Thema's STR_5482 :{WINDOW_COLOUR_2}Tijd sinds laatste inspectie: {BLACK}1 minuut STR_5483 :{BLACK}({COMMA16} weken resterend) STR_5484 :{BLACK}({COMMA16} week resterend) +STR_5485 :{SMALLFONT}{STRING} +STR_5486 :{BLACK}{COMMA16} +STR_5487 :{SMALLFONT}{BLACK}Recente berichten tonen +STR_5488 :Geen ingang From 959b49233054ab7911d79e6205564f911bcb448c Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 9 Aug 2015 21:29:42 +0200 Subject: [PATCH 0463/1173] Add Simplified Chinese and Finnish as selectable languages --- src/config.c | 2 ++ src/localisation/language.c | 2 ++ src/localisation/language.h | 2 ++ src/platform/windows.c | 3 +++ 4 files changed, 9 insertions(+) diff --git a/src/config.c b/src/config.c index d5b49afef9..78cfd15c70 100644 --- a/src/config.c +++ b/src/config.c @@ -139,6 +139,8 @@ config_enum_definition _languageEnum[] = { { "it-IT", LANGUAGE_ITALIAN }, { "pt-BR", LANGUAGE_PORTUGUESE_BR }, { "zh-Hant", LANGUAGE_CHINESE_TRADITIONAL }, + { "zh-Hans", LANGUAGE_CHINESE_SIMPLIFIED }, + { "fi-FI", LANGUAGE_FINNISH }, END_OF_ENUM }; diff --git a/src/localisation/language.c b/src/localisation/language.c index f9dd9495c7..c3a45bb528 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -72,6 +72,8 @@ const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "it-IT", "Italian", "Italiano", "italian", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ITALIAN }, // LANGUAGE_ITALIAN { "pt-BR", "Portuguese (BR)", "Portug\xC3\xAAs (BR)", "portuguese_br", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_PORTUGESE }, // LANGUAGE_PORTUGUESE_BR { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", &TTFFontMingliu, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL + { "zh-Hans", "Chinese (Simplified)", "Chinese (Simplified)", "chinese_simplified", &TTFFontMingliu, RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED }, // LANGUAGE_CHINESE_SIMPLIFIED + { "fi-FI", "Finnish", "Suomi", "finnish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_FINNISH // { "kr-KR", "Korean", "Korean", "english_uk", "malgun.ttf", RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN }; diff --git a/src/localisation/language.h b/src/localisation/language.h index 9e05cd4a2a..f97fe44801 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -38,6 +38,8 @@ enum { LANGUAGE_ITALIAN, LANGUAGE_PORTUGUESE_BR, LANGUAGE_CHINESE_TRADITIONAL, + LANGUAGE_CHINESE_SIMPLIFIED, + LANGUAGE_FINNISH, // LANGUAGE_KOREAN, LANGUAGE_COUNT }; diff --git a/src/platform/windows.c b/src/platform/windows.c index ca8491f7b8..f9f6ae7efd 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -734,6 +734,9 @@ uint16 platform_get_locale_language() else if (strcmp(langCode, "POR") == 0){ return LANGUAGE_PORTUGUESE_BR; } + else if (strcmp(langCode, "FIN") == 0){ + return LANGUAGE_FINNISH; + } return LANGUAGE_UNDEFINED; } From 7395752ddf3ec52459fa4cbf0dedb28b38dc4d93 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 10 Aug 2015 04:00:15 +0100 Subject: [PATCH 0464/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 38 +- data/language/finnish.txt | 3823 +++++++++++++++++++++++++ data/language/italian.txt | 2 +- 3 files changed, 3843 insertions(+), 20 deletions(-) create mode 100644 data/language/finnish.txt diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index d37de1174d..0995f81408 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -566,30 +566,30 @@ STR_0561 : STR_0562 :有動力的車輛將會穿梭於有著恐怖景物及特效的多層軌道中 STR_0563 :乘客坐在舒適並只有簡單安全裝備的列車上享受巨大而順滑的下滑, 扭曲的軌道和充足的'空中'時間 STR_0564 :一款在木製軌道運行的雲霄飛車, 這個雲霄飛車會嘈吵地飛馳過高低不平的軌道, 給乘客充足的'空中時間'之餘, 同時會給人一種'失去控制'的乘坐體驗 -STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity -STR_0566 :Individual roller coaster cars zip around a tight zig-zag layout of track with sharp corners and short sharp drops -STR_0567 :Sitting in seats suspended either side of the track, riders are pitched head-over-heels while they plunge down steep drops and travel through various inversions +STR_0565 :一款只能使用普通下坡及彎道的簡單木製雲霄飛車, 車輛只靠產生軌道阻力的車輪及重力滑翔於軌道上 +STR_0566 :每輛單獨的雲霄飛車都會遊走在附有急彎及急短下坡的Z型軌道上 +STR_0567 :乘客坐在懸掛在軌道的不同位置下, 衝下陡下坡及各種倒轉軌道時, 會被翻騰得四腳朝天 STR_0568 : -STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air +STR_0569 :乘客將會乘坐在軌道下的特別繫帶, 在空中盤旋時體驗飛一般的感受 STR_0570 : -STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track -STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash -STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders -STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground -STR_0575 :Powered trains hanging from a single rail transport people around the park +STR_0571 :圓型的車輛於他們行走在Z型軌道上被不停的轉動 +STR_0572 :載客量大的小船遊走於寬敞的水道上, 由輸送帶送他們上坡, 並於下坡中加速, 務求濺出巨型的水花令到乘客全身濕透 +STR_0573 :有動力的直升機型車輔於鋼軌上遊走, 他們由乘客的腳踏所控制 +STR_0574 :乘客躺臥在特別繫帶中, 以他們面向的背或頭遊走於曲折的軌道及翻轉 +STR_0575 :有動力的列車懸掛在單軌下運送乘客到樂園內的不同地方 STR_0576 : -STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections -STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists +STR_0577 :擁有轉向架的車輔於木製軌道上, 被特別的倒轉裝置轉向 +STR_0578 :車輛運行於O型的軌道中, 並會穿過陡下坡及橫滾軌道 STR_0579 : -STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft -STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes +STR_0580 :一款可建造順滑下坡及高達300英尺坡道的巨型鐵製雲霄飛車 +STR_0581 :圍繞著塔的座位會在不斷慢慢旋轉中被拉至塔頂, 然後便自由落體, 再被有磁力的煞車裝置慢慢煞停於站台 STR_0582 : STR_0583 : -STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders -STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions -STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections -STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station -STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops +STR_0584 :運行在鐵製單軌上的特別單車, 像一般單車一樣, 會被乘客踏行 +STR_0585 :乘客坐在軌道懸掛下的一對對的座位經歷被緊密的軌道上旋轉及迴轉 +STR_0586 :船型的車輛行駛於雲霄飛車的軌道上, 允許他們能夠擁有扭曲式的彎道陡下坡等軌道配置, 更會被普通的水道所濺濕 +STR_0587 :雲霄飛車列車被令人膽跳心驚的氣動發車加速衝上垂直軌道後, 穿過最頂, 然後垂直下落到另一邊回到車站 +STR_0588 :每輛單獨的雲霄飛車遊走在附有髮夾彎及急下坡的Z型軌道上 STR_0589 : STR_0590 :乘客在潛艇中觀賞水底的景觀 STR_0591 :木筏造型船於河道上慢慢地遊覽著 @@ -2988,7 +2988,7 @@ STR_2977 :員工命名 STR_2978 :請輸入這位員工的新姓名: STR_2979 :不能命名這位員工... STR_2980 :遊戲中太多橫額 -STR_2981 :{RED}No entry - - +STR_2981 :{RED}閒人止步 - - STR_2982 :橫額文字 STR_2983 :請輸入橫額中的文字: STR_2984 :不能設定橫額中的文字... diff --git a/data/language/finnish.txt b/data/language/finnish.txt new file mode 100644 index 0000000000..cd9decd9e4 --- /dev/null +++ b/data/language/finnish.txt @@ -0,0 +1,3823 @@ +# STR_XXXX part is read and XXXX becomes the string id number. +# Everything after the colon and before the new line will be saved as the string. +# Use # at the beginning of a line to leave a comment. +STR_0000 : +STR_0001 :{STRINGID} {COMMA16} +STR_0002 :Spiral Roller Coaster +STR_0003 :Stand-up Roller Coaster +STR_0004 :Suspended Swinging Coaster +STR_0005 :Inverted Roller Coaster +STR_0006 :Junior Roller Coaster +STR_0007 :Miniature Railway +STR_0008 :Monorail +STR_0009 :Mini Suspended Coaster +STR_0010 :Boat Ride +STR_0011 :Wooden Wild Mouse +STR_0012 :Steeplechase +STR_0013 :Car Ride +STR_0014 :Launched Freefall +STR_0015 :Bobsleigh Coaster +STR_0016 :Observation Tower +STR_0017 :Looping Roller Coaster +STR_0018 :Dinghy Slide +STR_0019 :Mine Train Coaster +STR_0020 :Chairlift +STR_0021 :Corkscrew Roller Coaster +STR_0022 :Maze +STR_0023 :Spiral Slide +STR_0024 :Go Karts +STR_0025 :Log Flume +STR_0026 :River Rapids +STR_0027 :Dodgems +STR_0028 :Pirate Ship +STR_0029 :Swinging Inverter Ship +STR_0030 :Food Stall +STR_0031 :Unknown Stall (1D) +STR_0032 :Drink Stall +STR_0033 :Unknown Stall (1F) +STR_0034 :Kauppa +STR_0035 :Merry-Go-Round +STR_0036 :Unknown Stall (22) +STR_0037 :Information Kiosk +STR_0038 :Toilets +STR_0039 :Ferris Wheel +STR_0040 :Motion Simulator +STR_0041 :3D Cinema +STR_0042 :Top Spin +STR_0043 :Space Rings +STR_0044 :Reverse Freefall Coaster +STR_0045 :Hissi +STR_0046 :Vertical Drop Roller Coaster +STR_0047 :Cash Machine +STR_0048 :Twist +STR_0049 :Haunted House +STR_0050 :First Aid Room +STR_0051 :Circus Show +STR_0052 :Ghost Train +STR_0053 :Steel Twister Roller Coaster +STR_0054 :Wooden Roller Coaster +STR_0055 :Side-Friction Roller Coaster +STR_0056 :Wild Mouse +STR_0057 :Multi-Dimension Roller Coaster +STR_0058 :Unknown Ride (38) +STR_0059 :Flying Roller Coaster +STR_0060 :Unknown Ride (3A) +STR_0061 :Virginia Reel +STR_0062 :Splash Boats +STR_0063 :Mini Helicopters +STR_0064 :Lay-down Roller Coaster +STR_0065 :Suspended Monorail +STR_0066 :Unknown Ride (40) +STR_0067 :Reverser Roller Coaster +STR_0068 :Heartline Twister Coaster +STR_0069 :Mini Golf +STR_0070 :Giga Coaster +STR_0071 :Roto-Drop +STR_0072 :Flying Saucers +STR_0073 :Crooked House +STR_0074 :Monorail Cycles +STR_0075 :Compact Inverted Coaster +STR_0076 :Water Coaster +STR_0077 :Air Powered Vertical Coaster +STR_0078 :Inverted Hairpin Coaster +STR_0079 :Magic Carpet +STR_0080 :Submarine Ride +STR_0081 :River Rafts +STR_0082 :Unknown Ride (50) +STR_0083 :Enterprise +STR_0084 :Unknown Ride (52) +STR_0085 :Unknown Ride (53) +STR_0086 :Unknown Ride (54) +STR_0087 :Unknown Ride (55) +STR_0088 :Inverted Impulse Coaster +STR_0089 :Mini Roller Coaster +STR_0090 :Mine Ride +STR_0091 :Unknown Ride (59) +STR_0092 :LIM Launched Roller Coaster +STR_0093 : +STR_0094 : +STR_0095 : +STR_0096 : +STR_0097 : +STR_0098 : +STR_0099 : +STR_0100 : +STR_0101 : +STR_0102 : +STR_0103 : +STR_0104 : +STR_0105 : +STR_0106 : +STR_0107 : +STR_0108 : +STR_0109 : +STR_0110 : +STR_0111 : +STR_0112 : +STR_0113 : +STR_0114 : +STR_0115 : +STR_0116 : +STR_0117 : +STR_0118 : +STR_0119 : +STR_0120 : +STR_0121 : +STR_0122 : +STR_0123 : +STR_0124 : +STR_0125 : +STR_0126 : +STR_0127 : +STR_0128 : +STR_0129 : +STR_0130 : +STR_0131 : +STR_0132 : +STR_0133 : +STR_0134 : +STR_0135 : +STR_0136 : +STR_0137 : +STR_0138 : +STR_0139 : +STR_0140 : +STR_0141 : +STR_0142 : +STR_0143 : +STR_0144 : +STR_0145 : +STR_0146 : +STR_0147 : +STR_0148 : +STR_0149 : +STR_0150 : +STR_0151 : +STR_0152 : +STR_0153 : +STR_0154 : +STR_0155 : +STR_0156 : +STR_0157 : +STR_0158 : +STR_0159 : +STR_0160 : +STR_0161 : +STR_0162 : +STR_0163 : +STR_0164 : +STR_0165 : +STR_0166 : +STR_0167 : +STR_0168 : +STR_0169 : +STR_0170 : +STR_0171 : +STR_0172 : +STR_0173 : +STR_0174 : +STR_0175 : +STR_0176 : +STR_0177 : +STR_0178 : +STR_0179 : +STR_0180 : +STR_0181 : +STR_0182 : +STR_0183 : +STR_0184 : +STR_0185 : +STR_0186 : +STR_0187 : +STR_0188 : +STR_0189 : +STR_0190 : +STR_0191 : +STR_0192 : +STR_0193 : +STR_0194 : +STR_0195 : +STR_0196 : +STR_0197 : +STR_0198 : +STR_0199 : +STR_0200 : +STR_0201 : +STR_0202 : +STR_0203 : +STR_0204 : +STR_0205 : +STR_0206 : +STR_0207 : +STR_0208 : +STR_0209 : +STR_0210 : +STR_0211 : +STR_0212 : +STR_0213 : +STR_0214 : +STR_0215 : +STR_0216 : +STR_0217 : +STR_0218 : +STR_0219 : +STR_0220 : +STR_0221 : +STR_0222 : +STR_0223 : +STR_0224 : +STR_0225 : +STR_0226 : +STR_0227 : +STR_0228 : +STR_0229 : +STR_0230 : +STR_0231 : +STR_0232 : +STR_0233 : +STR_0234 : +STR_0235 : +STR_0236 : +STR_0237 : +STR_0238 : +STR_0239 : +STR_0240 : +STR_0241 : +STR_0242 : +STR_0243 : +STR_0244 : +STR_0245 : +STR_0246 : +STR_0247 : +STR_0248 : +STR_0249 : +STR_0250 : +STR_0251 : +STR_0252 : +STR_0253 : +STR_0254 : +STR_0255 : +STR_0256 : +STR_0257 : +STR_0258 : +STR_0259 : +STR_0260 : +STR_0261 : +STR_0262 : +STR_0263 : +STR_0264 : +STR_0265 : +STR_0266 : +STR_0267 : +STR_0268 : +STR_0269 : +STR_0270 : +STR_0271 : +STR_0272 : +STR_0273 : +STR_0274 : +STR_0275 : +STR_0276 : +STR_0277 : +STR_0278 : +STR_0279 : +STR_0280 : +STR_0281 : +STR_0282 : +STR_0283 : +STR_0284 : +STR_0285 : +STR_0286 : +STR_0287 : +STR_0288 : +STR_0289 : +STR_0290 : +STR_0291 : +STR_0292 : +STR_0293 : +STR_0294 : +STR_0295 : +STR_0296 : +STR_0297 : +STR_0298 : +STR_0299 : +STR_0300 : +STR_0301 : +STR_0302 : +STR_0303 : +STR_0304 : +STR_0305 : +STR_0306 : +STR_0307 : +STR_0308 : +STR_0309 : +STR_0310 : +STR_0311 : +STR_0312 : +STR_0313 : +STR_0314 : +STR_0315 : +STR_0316 : +STR_0317 : +STR_0318 : +STR_0319 : +STR_0320 : +STR_0321 : +STR_0322 : +STR_0323 : +STR_0324 : +STR_0325 : +STR_0326 : +STR_0327 : +STR_0328 : +STR_0329 : +STR_0330 : +STR_0331 : +STR_0332 : +STR_0333 : +STR_0334 : +STR_0335 : +STR_0336 : +STR_0337 : +STR_0338 : +STR_0339 : +STR_0340 : +STR_0341 : +STR_0342 : +STR_0343 : +STR_0344 : +STR_0345 : +STR_0346 : +STR_0347 : +STR_0348 : +STR_0349 : +STR_0350 : +STR_0351 : +STR_0352 : +STR_0353 : +STR_0354 : +STR_0355 : +STR_0356 : +STR_0357 : +STR_0358 : +STR_0359 : +STR_0360 : +STR_0361 : +STR_0362 : +STR_0363 : +STR_0364 : +STR_0365 : +STR_0366 : +STR_0367 : +STR_0368 : +STR_0369 : +STR_0370 : +STR_0371 : +STR_0372 : +STR_0373 : +STR_0374 : +STR_0375 : +STR_0376 : +STR_0377 : +STR_0378 : +STR_0379 : +STR_0380 : +STR_0381 : +STR_0382 : +STR_0383 : +STR_0384 : +STR_0385 : +STR_0386 : +STR_0387 : +STR_0388 : +STR_0389 : +STR_0390 : +STR_0391 : +STR_0392 : +STR_0393 : +STR_0394 : +STR_0395 : +STR_0396 : +STR_0397 : +STR_0398 : +STR_0399 : +STR_0400 : +STR_0401 : +STR_0402 : +STR_0403 : +STR_0404 : +STR_0405 : +STR_0406 : +STR_0407 : +STR_0408 : +STR_0409 : +STR_0410 : +STR_0411 : +STR_0412 : +STR_0413 : +STR_0414 : +STR_0415 : +STR_0416 : +STR_0417 : +STR_0418 : +STR_0419 : +STR_0420 : +STR_0421 : +STR_0422 : +STR_0423 : +STR_0424 : +STR_0425 : +STR_0426 : +STR_0427 : +STR_0428 : +STR_0429 : +STR_0430 : +STR_0431 : +STR_0432 : +STR_0433 : +STR_0434 : +STR_0435 : +STR_0436 : +STR_0437 : +STR_0438 : +STR_0439 : +STR_0440 : +STR_0441 : +STR_0442 : +STR_0443 : +STR_0444 : +STR_0445 : +STR_0446 : +STR_0447 : +STR_0448 : +STR_0449 : +STR_0450 : +STR_0451 : +STR_0452 : +STR_0453 : +STR_0454 : +STR_0455 : +STR_0456 : +STR_0457 : +STR_0458 : +STR_0459 : +STR_0460 : +STR_0461 : +STR_0462 : +STR_0463 : +STR_0464 : +STR_0465 : +STR_0466 : +STR_0467 : +STR_0468 : +STR_0469 : +STR_0470 : +STR_0471 : +STR_0472 : +STR_0473 : +STR_0474 : +STR_0475 : +STR_0476 : +STR_0477 : +STR_0478 : +STR_0479 : +STR_0480 : +STR_0481 : +STR_0482 : +STR_0483 : +STR_0484 : +STR_0485 : +STR_0486 : +STR_0487 : +STR_0488 : +STR_0489 : +STR_0490 : +STR_0491 : +STR_0492 : +STR_0493 : +STR_0494 : +STR_0495 : +STR_0496 : +STR_0497 : +STR_0498 : +STR_0499 : +STR_0500 : +STR_0501 : +STR_0502 : +STR_0503 : +STR_0504 : +STR_0505 : +STR_0506 : +STR_0507 : +STR_0508 : +STR_0509 : +STR_0510 : +STR_0511 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :A looping roller coaster where the riders ride in a standing position +STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements +STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides +STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track +STR_0518 :Passengers travel in electric trains along a monorail track +STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them +STR_0523 :Riders travel slowly in powered vehicles along a track-based route +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower +STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops +STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track +STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops +STR_0532 : +STR_0533 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids +STR_0537 : +STR_0538 : +STR_0539 : +STR_0540 : +STR_0541 : +STR_0542 : +STR_0543 : +STR_0544 : +STR_0545 : +STR_0546 : +STR_0547 : +STR_0548 : +STR_0549 : +STR_0550 : +STR_0551 : +STR_0552 : +STR_0553 : +STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience +STR_0557 : +STR_0558 : +STR_0559 : +STR_0560 : +STR_0561 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects +STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills +STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' +STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity +STR_0566 :Individual roller coaster cars zip around a tight zig-zag layout of track with sharp corners and short sharp drops +STR_0567 :Sitting in seats suspended either side of the track, riders are pitched head-over-heels while they plunge down steep drops and travel through various inversions +STR_0568 : +STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air +STR_0570 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground +STR_0575 :Powered trains hanging from a single rail transport people around the park +STR_0576 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections +STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists +STR_0579 : +STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes +STR_0582 : +STR_0583 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions +STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops +STR_0589 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track +STR_0592 : +STR_0593 : +STR_0594 : +STR_0595 : +STR_0596 : +STR_0597 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track +STR_0599 :A compact roller coaster with individual cars and smooth twisting drops +STR_0600 :Powered mine trains career along a smooth and twisted track layout +STR_0601 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions +STR_0603 :Vieras {INT32} +STR_0604 :Vieras {INT32} +STR_0605 :Vieras {INT32} +STR_0606 :Vieras {INT32} +STR_0607 :Vieras {INT32} +STR_0608 :Vieras {INT32} +STR_0609 :Vieras {INT32} +STR_0610 :Vieras {INT32} +STR_0611 :Vieras {INT32} +STR_0612 :Vieras {INT32} +STR_0613 :Vieras {INT32} +STR_0614 :Vieras {INT32} +STR_0615 :Vieras {INT32} +STR_0616 :Vieras {INT32} +STR_0617 :Vieras {INT32} +STR_0618 :Vieras {INT32} +STR_0619 :Vieras {INT32} +STR_0620 :Vieras {INT32} +STR_0621 :Vieras {INT32} +STR_0622 :Vieras {INT32} +STR_0623 :Vieras {INT32} +STR_0624 :Vieras {INT32} +STR_0625 :Vieras {INT32} +STR_0626 :Vieras {INT32} +STR_0627 :Vieras {INT32} +STR_0628 :Vieras {INT32} +STR_0629 :Vieras {INT32} +STR_0630 :Vieras {INT32} +STR_0631 :Vieras {INT32} +STR_0632 :Vieras {INT32} +STR_0633 :Vieras {INT32} +STR_0634 :Vieras {INT32} +STR_0635 :Vieras {INT32} +STR_0636 :Vieras {INT32} +STR_0637 :Vieras {INT32} +STR_0638 :Vieras {INT32} +STR_0639 :Vieras {INT32} +STR_0640 :Vieras {INT32} +STR_0641 :Vieras {INT32} +STR_0642 :Vieras {INT32} +STR_0643 :Vieras {INT32} +STR_0644 :Vieras {INT32} +STR_0645 :Vieras {INT32} +STR_0646 :Vieras {INT32} +STR_0647 :Vieras {INT32} +STR_0648 :Vieras {INT32} +STR_0649 :Vieras {INT32} +STR_0650 :Vieras {INT32} +STR_0651 :Vieras {INT32} +STR_0652 :Vieras {INT32} +STR_0653 :Vieras {INT32} +STR_0654 :Vieras {INT32} +STR_0655 :Vieras {INT32} +STR_0656 :Vieras {INT32} +STR_0657 :Vieras {INT32} +STR_0658 :Vieras {INT32} +STR_0659 :Vieras {INT32} +STR_0660 :Vieras {INT32} +STR_0661 :Vieras {INT32} +STR_0662 :Vieras {INT32} +STR_0663 :Vieras {INT32} +STR_0664 :Vieras {INT32} +STR_0665 :Vieras {INT32} +STR_0666 :Vieras {INT32} +STR_0667 :Vieras {INT32} +STR_0668 :Vieras {INT32} +STR_0669 :Vieras {INT32} +STR_0670 :Vieras {INT32} +STR_0671 :Vieras {INT32} +STR_0672 :Vieras {INT32} +STR_0673 :Vieras {INT32} +STR_0674 :Vieras {INT32} +STR_0675 :Vieras {INT32} +STR_0676 :Vieras {INT32} +STR_0677 :Vieras {INT32} +STR_0678 :Vieras {INT32} +STR_0679 :Vieras {INT32} +STR_0680 :Vieras {INT32} +STR_0681 :Vieras {INT32} +STR_0682 :Vieras {INT32} +STR_0683 :Vieras {INT32} +STR_0684 :Vieras {INT32} +STR_0685 :Vieras {INT32} +STR_0686 :Vieras {INT32} +STR_0687 :Vieras {INT32} +STR_0688 :Vieras {INT32} +STR_0689 :Vieras {INT32} +STR_0690 :Vieras {INT32} +STR_0691 :Vieras {INT32} +STR_0692 :Vieras {INT32} +STR_0693 :Vieras {INT32} +STR_0694 :Vieras {INT32} +STR_0695 :Vieras {INT32} +STR_0696 :Vieras {INT32} +STR_0697 :Vieras {INT32} +STR_0698 :Vieras {INT32} +STR_0699 :Vieras {INT32} +STR_0700 :Vieras {INT32} +STR_0701 :Vieras {INT32} +STR_0702 :Vieras {INT32} +STR_0703 :Vieras {INT32} +STR_0704 :Vieras {INT32} +STR_0705 :Vieras {INT32} +STR_0706 :Vieras {INT32} +STR_0707 :Vieras {INT32} +STR_0708 :Vieras {INT32} +STR_0709 :Vieras {INT32} +STR_0710 :Vieras {INT32} +STR_0711 :Vieras {INT32} +STR_0712 :Vieras {INT32} +STR_0713 :Vieras {INT32} +STR_0714 :Vieras {INT32} +STR_0715 :Vieras {INT32} +STR_0716 :Vieras {INT32} +STR_0717 :Vieras {INT32} +STR_0718 :Vieras {INT32} +STR_0719 :Vieras {INT32} +STR_0720 :Vieras {INT32} +STR_0721 :Vieras {INT32} +STR_0722 :Vieras {INT32} +STR_0723 :Vieras {INT32} +STR_0724 :Vieras {INT32} +STR_0725 :Vieras {INT32} +STR_0726 :Vieras {INT32} +STR_0727 :Vieras {INT32} +STR_0728 :Vieras {INT32} +STR_0729 :Vieras {INT32} +STR_0730 :Vieras {INT32} +STR_0731 :Vieras {INT32} +STR_0732 :Vieras {INT32} +STR_0733 :Vieras {INT32} +STR_0734 :Vieras {INT32} +STR_0735 :Vieras {INT32} +STR_0736 :Vieras {INT32} +STR_0737 :Vieras {INT32} +STR_0738 :Vieras {INT32} +STR_0739 :Vieras {INT32} +STR_0740 :Vieras {INT32} +STR_0741 :Vieras {INT32} +STR_0742 :Vieras {INT32} +STR_0743 :Vieras {INT32} +STR_0744 :Vieras {INT32} +STR_0745 :Vieras {INT32} +STR_0746 :Vieras {INT32} +STR_0747 :Vieras {INT32} +STR_0748 :Vieras {INT32} +STR_0749 :Vieras {INT32} +STR_0750 :Vieras {INT32} +STR_0751 :Vieras {INT32} +STR_0752 :Vieras {INT32} +STR_0753 :Vieras {INT32} +STR_0754 :Vieras {INT32} +STR_0755 :Vieras {INT32} +STR_0756 :Vieras {INT32} +STR_0757 :Vieras {INT32} +STR_0758 :Vieras {INT32} +STR_0759 :Vieras {INT32} +STR_0760 :Vieras {INT32} +STR_0761 :Vieras {INT32} +STR_0762 :Vieras {INT32} +STR_0763 :Vieras {INT32} +STR_0764 :Vieras {INT32} +STR_0765 :Vieras {INT32} +STR_0766 :Vieras {INT32} +STR_0767 :Vieras {INT32} +STR_0768 :Yleismies {INT32} +STR_0769 :Mekaanikko {INT32} +STR_0770 :Vartija {INT32} +STR_0771 :Viihdyttjäjä {INT32} +STR_0772 :Unnamed park{POP16}{POP16} +STR_0773 :Unnamed park{POP16}{POP16} +STR_0774 :Unnamed park{POP16}{POP16} +STR_0775 :Unnamed park{POP16}{POP16} +STR_0776 :Unnamed park{POP16}{POP16} +STR_0777 :Unnamed park{POP16}{POP16} +STR_0778 :Kyltti +STR_0779 :1st +STR_0780 :2nd +STR_0781 :3rd +STR_0782 :4th +STR_0783 :5th +STR_0784 :6th +STR_0785 :7th +STR_0786 :8th +STR_0787 :9th +STR_0788 :10th +STR_0789 :11th +STR_0790 :12th +STR_0791 :13th +STR_0792 :14th +STR_0793 :15th +STR_0794 :16th +STR_0795 :17th +STR_0796 :18th +STR_0797 :19th +STR_0798 :20th +STR_0799 :21st +STR_0800 :22nd +STR_0801 :23rd +STR_0802 :24th +STR_0803 :25th +STR_0804 :26th +STR_0805 :27th +STR_0806 :28th +STR_0807 :29th +STR_0808 :30th +STR_0809 :31st +STR_0810 :Tammi +STR_0811 :Helmi +STR_0812 :Maalis +STR_0813 :Huhti +STR_0814 :Touko +STR_0815 :Kesä +STR_0816 :Heinä +STR_0817 :Elo +STR_0818 :Syys +STR_0819 :Loka +STR_0820 :Marras +STR_0821 :Joulu +STR_0822 :Unable to access graphic data file +STR_0823 :Missing or inaccessible data file +STR_0824 :{BLACK}{CROSS} +STR_0825 :Nimi on jo käytössä +STR_0826 :Liian monta nimeä määritetty +STR_0827 :Not enough cash - requires {CURRENCY2DP} +STR_0828 :{SMALLFONT}{BLACK}Sulje ikkuna +STR_0829 :{SMALLFONT}{BLACK}Window title - Drag this to move window +STR_0830 :{SMALLFONT}{BLACK}Zoom view in +STR_0831 :{SMALLFONT}{BLACK}Zoom view out +STR_0832 :{SMALLFONT}{BLACK}Rotate view 90{DEGREE} clockwise +STR_0833 :{SMALLFONT}{BLACK}Pysäytä peli +STR_0834 :{SMALLFONT}{BLACK}Disk and game options +STR_0835 :Game initialisation failed +STR_0836 :Unable to start game in a minimised state +STR_0837 :Unable to initialise graphics system +STR_0838 : +STR_0839 :{UINT16} x {UINT16} +STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} +# The following six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :Lisätietoja 'OpenRCT2' +STR_0848 :RollerCoaster Tycoon 2 +STR_0849 :{WINDOW_COLOUR_2}Versio 2.01.028 +STR_0850 :{WINDOW_COLOUR_2}Tekijänoikeus {COPYRIGHT} 2002 Chris Sawyer, kaikki oikeudet pidetään +STR_0851 :{WINDOW_COLOUR_2}Suunnitellut ja ohjelmoinnut Chris Sawyer +STR_0852 :{WINDOW_COLOUR_2}Graphics by Simon Foster +STR_0853 :{WINDOW_COLOUR_2}Äänet ja musiikki Allister Brimble +STR_0854 :{WINDOW_COLOUR_2}Lisä-äänet nauhoittanut David Ellis +STR_0855 :{WINDOW_COLOUR_2}Representation by Jacqui Lyons at Marjacq Ltd. +STR_0856 :{WINDOW_COLOUR_2}Thanks to: +STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth, ja John Wardley +STR_0858 :{WINDOW_COLOUR_2} +STR_0859 :{WINDOW_COLOUR_2} +STR_0860 :{WINDOW_COLOUR_2} +STR_0861 : +STR_0862 : +STR_0863 : +STR_0864 : +STR_0865 :{STRINGID} +STR_0866 :{POP16}{STRINGID} +STR_0867 :{POP16}{POP16}{STRINGID} +STR_0868 :{POP16}{POP16}{POP16}{STRINGID} +STR_0869 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0870 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0872 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0873 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0874 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0875 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0876 :{BLACK}{DOWN} +STR_0877 :Liian matala ! +STR_0878 :Liian korkea ! +STR_0879 :Can't lower land here... +STR_0880 :Can't raise land here... +STR_0881 :Object in the way +STR_0882 :Lataa peli +STR_0883 :Tallenna peli +STR_0884 :Lataa maisema +STR_0885 :Tallenna maisema +STR_0886 :Lopeta peli +STR_0887 :Quit Scenario Editor +STR_0888 :Quit Roller Coaster Designer +STR_0889 :Quit Track Designs Manager +STR_0890 :Kuva{COMMA16}.BMP +STR_0891 :Kuvankaappaus +STR_0892 :Kuvankaappaus tallennettu levylle nimellä '{STRINGID}' +STR_0893 :Kuvankaappaus epäonnistui ! +STR_0894 :Landscape data area full ! +STR_0895 :Can't build partly above and partly below ground +STR_0896 :{POP16}{POP16}{STRINGID} Construction +STR_0897 :Suunta +STR_0898 :{SMALLFONT}{BLACK}Left-hand curve +STR_0899 :{SMALLFONT}{BLACK}Right-hand curve +STR_0900 :{SMALLFONT}{BLACK}Left-hand curve (small radius) +STR_0901 :{SMALLFONT}{BLACK}Right-hand curve (small radius) +STR_0902 :{SMALLFONT}{BLACK}Left-hand curve (very small radius) +STR_0903 :{SMALLFONT}{BLACK}Right-hand curve (very small radius) +STR_0904 :{SMALLFONT}{BLACK}Left-hand curve (large radius) +STR_0905 :{SMALLFONT}{BLACK}Right-hand curve (large radius) +STR_0906 :{SMALLFONT}{BLACK}Straight +STR_0907 :Slope +STR_0908 :Roll/Banking +STR_0909 :Seat Rot. +STR_0910 :{SMALLFONT}{BLACK}Roll for left-hand curve +STR_0911 :{SMALLFONT}{BLACK}Roll for right-hand curve +STR_0912 :{SMALLFONT}{BLACK}No roll +STR_0913 :{SMALLFONT}{BLACK}Move to previous section +STR_0914 :{SMALLFONT}{BLACK}Move to next section +STR_0915 :{SMALLFONT}{BLACK}Construct the selected section +STR_0916 :{SMALLFONT}{BLACK}Remove the highlighted section +STR_0917 :{SMALLFONT}{BLACK}Vertical drop +STR_0918 :{SMALLFONT}{BLACK}Steep slope down +STR_0919 :{SMALLFONT}{BLACK}Slope down +STR_0920 :{SMALLFONT}{BLACK}Taso +STR_0921 :{SMALLFONT}{BLACK}Slope up +STR_0922 :{SMALLFONT}{BLACK}Steep slope up +STR_0923 :{SMALLFONT}{BLACK}Vertical rise +STR_0924 :{SMALLFONT}{BLACK}Helix down +STR_0925 :{SMALLFONT}{BLACK}Helix up +STR_0926 :Can't remove this... +STR_0927 :Can't construct this here... +STR_0928 :{SMALLFONT}{BLACK}Chain lift, to pull cars up slopes +STR_0929 :'S' Bend (left) +STR_0930 :'S' Bend (right) +STR_0931 :Vertical Loop (left) +STR_0932 :Vertical Loop (right) +STR_0933 :Raise or lower land first +STR_0934 :Ride entrance in the way +STR_0935 :Ride exit in the way +STR_0936 :Park entrance in the way +STR_0937 :{SMALLFONT}{BLACK}View options +STR_0938 :{SMALLFONT}{BLACK}Adjust land height and slope +STR_0939 :Underground/Inside View +STR_0940 :Remove Base Land +STR_0941 :Remove Vertical Faces +STR_0942 :See-Through Rides +STR_0943 :See-Through Scenery +STR_0944 :Tallenna +STR_0945 :Älä tallenna +STR_0946 :Peruuta +STR_0947 :Tallenna ennen lataamista ? +STR_0948 :Tallenna ennen lopettamista ? +STR_0949 :Tallenna ennen lopettamista ? +STR_0950 :Lataa peli +STR_0951 :Lopeta peli +STR_0952 :Lopeta peli +STR_0953 :Lataa maisema +STR_0954 : +STR_0955 :{SMALLFONT}{BLACK}Select seat rotation angle for this track section +STR_0956 :-180{DEGREE} +STR_0957 :-135{DEGREE} +STR_0958 :-90{DEGREE} +STR_0959 :-45{DEGREE} +STR_0960 :0{DEGREE} +STR_0961 :+45{DEGREE} +STR_0962 :+90{DEGREE} +STR_0963 :+135{DEGREE} +STR_0964 :+180{DEGREE} +STR_0965 :+225{DEGREE} +STR_0966 :+270{DEGREE} +STR_0967 :+315{DEGREE} +STR_0968 :+360{DEGREE} +STR_0969 :+405{DEGREE} +STR_0970 :+450{DEGREE} +STR_0971 :+495{DEGREE} +STR_0972 :Peruuta +STR_0973 :OK +STR_0974 :Laitteet +STR_0975 :Kaupat ja kojut +STR_0976 :Toilets and Information Kiosks +STR_0977 :Uusi kuljetuslaite +STR_0978 :New Gentle Rides +STR_0979 :New Roller Coasters +STR_0980 :New Thrill Rides +STR_0981 :Uusi vesilaite +STR_0982 :New Shops & Stalls +STR_0983 :Research & Development +STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} +STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP} +STR_0986 :{BLACK}{CURRENCY2DP} +STR_0987 :Too many rides/attractions +STR_0988 :Can't create new ride/attraction... +STR_0989 :{STRINGID} +STR_0990 :{SMALLFONT}{BLACK}Construction +STR_0991 :Station platform +STR_0992 :{SMALLFONT}{BLACK}Demolish entire ride/attraction +STR_0993 :Romuta laite/nähtävyys +STR_0994 :Romuta +STR_0995 :{WINDOW_COLOUR_1}Are you sure you want to completely demolish {STRINGID}? +STR_0996 :Overall view +STR_0997 :{SMALLFONT}{BLACK}View selection +STR_0998 :No more stations allowed on this ride +STR_0999 :Requires a station platform +STR_1000 :Track is not a complete circuit +STR_1001 :Track unsuitable for type of train +STR_1002 :Can't open {POP16}{POP16}{POP16}{STRINGID}... +STR_1003 :Can't test {POP16}{POP16}{POP16}{STRINGID}... +STR_1004 :Can't close {POP16}{POP16}{POP16}{STRINGID}... +STR_1005 :Can't start construction on {POP16}{POP16}{POP16}{STRINGID}... +STR_1006 :Must be closed first +STR_1007 :Unable to create enough vehicles +STR_1008 :{SMALLFONT}{BLACK}Open, close, or test ride/attraction +STR_1009 :{SMALLFONT}{BLACK}Open or close all rides/attractions +STR_1010 :{SMALLFONT}{BLACK}Open or close park +STR_1011 :Sulje kaikki +STR_1012 :Avaa kaikki +STR_1013 :Sulje puisto +STR_1014 :Avaa puisto +STR_1015 :Unable to operate with more than one station platform in this mode +STR_1016 :Unable to operate with less than two stations in this mode +STR_1017 :Can't change operating mode... +STR_1018 :Can't make changes... +STR_1019 :Can't make changes... +STR_1020 :Can't make changes... +STR_1021 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_1022 :{POP16}{POP16}{POP16}{COMMA16} car per train +STR_1023 :{POP16}{POP16}{POP16}{COMMA16} cars per train +STR_1024 :{COMMA16} car per train +STR_1025 :{COMMA16} cars per train +STR_1026 :Station platform too long! +STR_1027 :{SMALLFONT}{BLACK}Locate this on Main View +STR_1028 :Off edge of map! +STR_1029 :Cannot build partly above and partly below water! +STR_1030 :Can only build this underwater! +STR_1031 :Can't build this underwater! +STR_1032 :Can only build this on water! +STR_1033 :Can only build this above ground! +STR_1034 :Can only build this on land! +STR_1035 :Local authority won't allow construction above tree-height! +STR_1036 :Lataa peli +STR_1037 :Lataa maisema +STR_1038 :Convert saved game to scenario +STR_1039 :Install new track design +STR_1040 :Tallenna peli +STR_1041 :Save Scenario +STR_1042 :Tallenna maisema +STR_1043 :OpenRCT2 Tallennettu peli +STR_1044 :OpenRCT2 Scenario File +STR_1045 :OpenRCT2 Maisematiedosto +STR_1046 :OpenRCT2 Track Design File +STR_1047 :Pelin tallennus epäonnistui! +STR_1048 :Scenario save failed! +STR_1049 :Maisematiedoston tallennus epäonnistui! +STR_1050 :Failed to load...{NEWLINE}File contains invalid data! +STR_1051 :Invisible Supports +STR_1052 :Invisible People +STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park +STR_1054 :{SMALLFONT}{BLACK}Name ride/attraction +STR_1055 :{SMALLFONT}{BLACK}Name person +STR_1056 :{SMALLFONT}{BLACK}Name staff member +STR_1057 :Ride/attraction name +STR_1058 :Enter new name for this ride/attraction: +STR_1059 :Can't rename ride/attraction... +STR_1060 :Invalid ride/attraction name +STR_1061 :Normal mode +STR_1062 :Continuous circuit mode +STR_1063 :Reverse-Incline launched shuttle mode +STR_1064 :Powered launch (passing station) +STR_1065 :Shuttle mode +STR_1066 :Boat hire mode +STR_1067 :Upward launch +STR_1068 :Rotating lift mode +STR_1069 :Station to station mode +STR_1070 :Single ride per admission +STR_1071 :Unlimited rides per admission +STR_1072 :Maze mode +STR_1073 :Race mode +STR_1074 :Bumper-car mode +STR_1075 :Swing mode +STR_1076 :Shop stall mode +STR_1077 :Rotation mode +STR_1078 :Forward rotation +STR_1079 :Backward rotation +STR_1080 :Film: {ENDQUOTES}Avenging aviators{ENDQUOTES} +STR_1081 :3D film: {ENDQUOTES}Mouse tails{ENDQUOTES} +STR_1082 :Space rings mode +STR_1083 :Beginners mode +STR_1084 :LIM-powered launch +STR_1085 :Film: {ENDQUOTES}Thrill riders{ENDQUOTES} +STR_1086 :3D-elokuva: {ENDQUOTES}Myrskun jahtaajat{ENDQUOTES} +STR_1087 :3D-elokuva: {ENDQUOTES}Avaruuskaapparit{ENDQUOTES} +STR_1088 :Intense mode +STR_1089 :Berserk mode +STR_1090 :Haunted house mode +STR_1091 :Circus show mode +STR_1092 :Downward launch +STR_1093 :Crooked house mode +STR_1094 :Freefall drop mode +STR_1095 :Continuous circuit block sectioned mode +STR_1096 :Powered launch (without passing station) +STR_1097 :Powered launch block sectioned mode +STR_1098 :Moving to end of {POP16}{STRINGID} +STR_1099 :Waiting for passengers at {POP16}{STRINGID} +STR_1100 :Waiting to depart {POP16}{STRINGID} +STR_1101 :Departing {POP16}{STRINGID} +STR_1102 :Travelling at {VELOCITY} +STR_1103 :Arriving at {POP16}{STRINGID} +STR_1104 :Unloading passengers at {POP16}{STRINGID} +STR_1105 :Travelling at {VELOCITY} +STR_1106 :Sortunut! +STR_1107 :Sortunut! +STR_1108 :Travelling at {VELOCITY} +STR_1109 :Swinging +STR_1110 :Rotating +STR_1111 :Rotating +STR_1112 :Operating +STR_1113 :Showing film +STR_1114 :Rotating +STR_1115 :Operating +STR_1116 :Operating +STR_1117 :Doing circus show +STR_1118 :Operating +STR_1119 :Waiting for cable lift +STR_1120 :Travelling at {VELOCITY} +STR_1121 :Stopping +STR_1122 :Waiting for passengers +STR_1123 :Waiting to start +STR_1124 :Käynnistetään +STR_1125 :Operating +STR_1126 :Pysäytetään +STR_1127 :Unloading passengers +STR_1128 :Stopped by block brakes +STR_1129 :All vehicles in same colours +STR_1130 :Different colours per {STRINGID} +STR_1131 :Different colours per vehicle +STR_1132 :Vehicle {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1133 :Vehicle {POP16}{COMMA16} +STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} +STR_1135 :{STRINGID} {COMMA16} +STR_1136 :{SMALLFONT}{BLACK}Valitse pääväri +STR_1137 :{SMALLFONT}{BLACK}Select additional colour 1 +STR_1138 :{SMALLFONT}{BLACK}Select additional colour 2 +STR_1139 :{SMALLFONT}{BLACK}Select support structure colour +STR_1140 :{SMALLFONT}{BLACK}Select vehicle colour scheme option +STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify +STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} +STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} +STR_1144 :Can't build/move entrance for this ride/attraction... +STR_1145 :Can't build/move exit for this ride/attraction... +STR_1146 :Entrance not yet built +STR_1147 :Exit not yet built +STR_1148 :Quarter load +STR_1149 :Half load +STR_1150 :Three-quarter load +STR_1151 :Full load +STR_1152 :Any load +STR_1153 :Height Marks on Ride Tracks +STR_1154 :Height Marks on Land +STR_1155 :Height Marks on Paths +STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} +STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} +STR_1158 :Can't remove this... +STR_1159 :{SMALLFONT}{BLACK}Place scenery, gardens, and other accessories +STR_1160 :{SMALLFONT}{BLACK}Create/adjust lakes & water +STR_1161 :Can't position this here... +STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} +STR_1163 :{STRINGID}{NEWLINE}(Right-Click to Modify) +STR_1164 :{STRINGID}{NEWLINE}(Right-Click to Remove) +STR_1165 :{STRINGID} - {STRINGID} {COMMA16} +STR_1166 :Can't lower water level here... +STR_1167 :Can't raise water level here... +STR_1168 :Options +STR_1169 :(None) +STR_1170 :{STRING} +STR_1171 :{RED}Suljettu - - +STR_1172 :{YELLOW}{STRINGID} - - +STR_1173 :{SMALLFONT}{BLACK}Build footpaths and queue lines +STR_1174 :Banner sign in the way +STR_1175 :Can't build this on sloped footpath +STR_1176 :Can't build footpath here... +STR_1177 :Can't remove footpath from here... +STR_1178 :Land slope unsuitable +STR_1179 :Footpath in the way +STR_1180 :Can't build this underwater! +STR_1181 :Jalkakäytävät +STR_1182 :Tyyppi +STR_1183 :Suunta +STR_1184 :Slope +STR_1185 :{SMALLFONT}{BLACK}Direction +STR_1186 :{SMALLFONT}{BLACK}Slope down +STR_1187 :{SMALLFONT}{BLACK}Taso +STR_1188 :{SMALLFONT}{BLACK}Slope up +STR_1189 :{SMALLFONT}{BLACK}Construct the selected footpath section +STR_1190 :{SMALLFONT}{BLACK}Remove previous footpath section +STR_1191 :{BLACK}{STRINGID} +STR_1192 :{OUTLINE}{RED}{STRINGID} +STR_1193 :{WINDOW_COLOUR_2}{STRINGID} +STR_1194 :Suljettu +STR_1195 :Testiajo +STR_1196 :Avoin +STR_1197 :Rikki +STR_1198 :Sortunut! +STR_1199 :{COMMA16} person on ride +STR_1200 :{COMMA16} people on ride +STR_1201 :Nobody in queue line +STR_1202 :1 person in queue line +STR_1203 :{COMMA16} people in queue line +STR_1204 :{COMMA16} minute queue time +STR_1205 :{COMMA16} minutes queue time +STR_1206 :{WINDOW_COLOUR_2}Odota: +STR_1207 :{WINDOW_COLOUR_2}Leave if another train arrives at station +STR_1208 :{WINDOW_COLOUR_2}Leave if another boat arrives at station +STR_1209 :{SMALLFONT}{BLACK}Select whether should wait for passengers before departing +STR_1210 :{SMALLFONT}{BLACK}Select whether should leave if another vehicle arrives at the same station +STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time: +STR_1212 :{WINDOW_COLOUR_2}Maximum waiting time: +STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing +STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing +STR_1215 :{WINDOW_COLOUR_2}Synchronise with adjacent stations +STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronise departure with all adjacent stations (for 'racing') +STR_1217 :{COMMA16} sekuntia +STR_1218 :{BLACK}{SMALLUP} +STR_1219 :{BLACK}{SMALLDOWN} +STR_1220 :Exit only +STR_1221 :No entrance +STR_1222 :No exit +STR_1223 :{SMALLFONT}{BLACK}Transport rides +STR_1224 :{SMALLFONT}{BLACK}Gentle rides +STR_1225 :{SMALLFONT}{BLACK}Roller coasters +STR_1226 :{SMALLFONT}{BLACK}Thrill rides +STR_1227 :{SMALLFONT}{BLACK}Water rides +STR_1228 :{SMALLFONT}{BLACK}Shops & stalls +STR_1229 :juna +STR_1230 :junaa +STR_1231 :Juna +STR_1232 :junaa +STR_1233 :{COMMA16} juna +STR_1234 :{COMMA16} junaa +STR_1235 :Juna {COMMA16} +STR_1236 :vene +STR_1237 :venettä +STR_1238 :Vene +STR_1239 :Vene +STR_1240 :{COMMA16} vene +STR_1241 :{COMMA16} venettä +STR_1242 :Vene {COMMA16} +STR_1243 :rata +STR_1244 :rataa +STR_1245 :Rata +STR_1246 :Rataa +STR_1247 :{COMMA16} rata +STR_1248 :{COMMA16} rataa +STR_1249 :Rata {COMMA16} +STR_1250 :docking platform +STR_1251 :docking platforms +STR_1252 :Docking platform +STR_1253 :Docking platforms +STR_1254 :{COMMA16} docking platform +STR_1255 :{COMMA16} docking platforms +STR_1256 :Docking platform {COMMA16} +STR_1257 :asema +STR_1258 :asemaa +STR_1259 :Asema +STR_1260 :Asemaa +STR_1261 :{COMMA16} asema +STR_1262 :{COMMA16} asemaa +STR_1263 :Asema {COMMA16} +STR_1264 :auto +STR_1265 :autoja +STR_1266 :Auto +STR_1267 :Autoa +STR_1268 :{COMMA16} auto +STR_1269 :{COMMA16} autoa +STR_1270 :Auto {COMMA16} +STR_1271 :rakennus +STR_1272 :rakennusta +STR_1273 :Rakennus +STR_1274 :Rakennusta +STR_1275 :{COMMA16} rakennus +STR_1276 :{COMMA16} rakennusta +STR_1277 :Rakennus {COMMA16} +STR_1278 :structure +STR_1279 :structures +STR_1280 :Structure +STR_1281 :Structures +STR_1282 :{COMMA16} structure +STR_1283 :{COMMA16} structures +STR_1284 :Structure {COMMA16} +STR_1285 :laiva +STR_1286 :laivaa +STR_1287 :Laiva +STR_1288 :Laivaa +STR_1289 :{COMMA16} laiva +STR_1290 :{COMMA16} laivaa +STR_1291 :Laiva {COMMA16} +STR_1292 :koju +STR_1293 :kojua +STR_1294 :Koju +STR_1295 :Kojua +STR_1296 :{COMMA16} koju +STR_1297 :{COMMA16} kojua +STR_1298 :Koju {COMMA16} +STR_1299 :pyörä +STR_1300 :pyörää +STR_1301 :Pyörä +STR_1302 :Pyörää +STR_1303 :{COMMA16} pyörä +STR_1304 :{COMMA16} pyörää +STR_1305 :Pyörä {COMMA16} +STR_1306 :rengas +STR_1307 :rengasta +STR_1308 :Rengas +STR_1309 :Rengasta +STR_1310 :{COMMA16} rengas +STR_1311 :{COMMA16} rengasta +STR_1312 :Rengas {COMMA16} +STR_1313 :pelaaja +STR_1314 :pelaajaa +STR_1315 :Pelaaja +STR_1316 :Pelaajaa +STR_1317 :{COMMA16} pelaaja +STR_1318 :{COMMA16} pelaajaa +STR_1319 :Pelaaja {COMMA16} +STR_1320 :rata +STR_1321 :rataa +STR_1322 :Rata +STR_1323 :Rataa +STR_1324 :{COMMA16} rata +STR_1325 :{COMMA16} rataa +STR_1326 :Rata {COMMA16} +STR_1327 :{SMALLFONT}{BLACK}Rotate objects by 90{DEGREE} +STR_1328 :Level land required +STR_1329 :{WINDOW_COLOUR_2}Launch speed: +STR_1330 :{SMALLFONT}{BLACK}Maximum speed when leaving station +STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_1332 :{VELOCITY} +STR_1333 :{STRINGID} - {STRINGID}{POP16} +STR_1334 :{STRINGID} - {STRINGID} {COMMA16} +STR_1335 :{STRINGID} - Entrance{POP16}{POP16} +STR_1336 :{STRINGID} - Station {POP16}{COMMA16} Entrance +STR_1337 :{STRINGID} - Exit{POP16}{POP16} +STR_1338 :{STRINGID} - Station {POP16}{COMMA16} Exit +STR_1339 :{BLACK}No test results yet... +STR_1340 :{WINDOW_COLOUR_2}Max. speed: {BLACK}{VELOCITY} +STR_1341 :{WINDOW_COLOUR_2}Ride time: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1342 :{DURATION} +STR_1343 :{DURATION} / +STR_1344 :{WINDOW_COLOUR_2}Radan pituus: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1345 :{LENGTH} +STR_1346 :{LENGTH} / +STR_1347 :{WINDOW_COLOUR_2}Keskinopeus: {BLACK}{VELOCITY} +STR_1348 :{WINDOW_COLOUR_2}Max. positive vertical G's: {BLACK}{COMMA2DP32}g +STR_1349 :{WINDOW_COLOUR_2}Max. positive vertical G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1350 :{WINDOW_COLOUR_2}Max. negative vertical G's: {BLACK}{COMMA2DP32}g +STR_1351 :{WINDOW_COLOUR_2}Max. negative vertical G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1352 :{WINDOW_COLOUR_2}Max. lateral G's: {BLACK}{COMMA2DP32}g +STR_1353 :{WINDOW_COLOUR_2}Max. lateral G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1354 :{WINDOW_COLOUR_2}Highest drop height: {BLACK}{LENGTH} +STR_1355 :{WINDOW_COLOUR_2}Pudotusta: {BLACK}{COMMA16} +STR_1356 :{WINDOW_COLOUR_2}Inversions: {BLACK}{COMMA16} +STR_1357 :{WINDOW_COLOUR_2}Reikää: {BLACK}{COMMA16} +STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs +STR_1359 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minute +STR_1360 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minutes +STR_1361 :Can't change speed... +STR_1362 :Can't change launch speed... +STR_1363 :Too high for supports! +STR_1364 :Supports for track above can't be extended any further! +STR_1365 :In-line Twist (left) +STR_1366 :In-line Twist (right) +STR_1367 :Half Loop +STR_1368 :Half Corkscrew (left) +STR_1369 :Half Corkscrew (right) +STR_1370 :Barrel Roll (left) +STR_1371 :Barrel Roll (right) +STR_1372 :Launched Lift Hill +STR_1373 :Large Half Loop (left) +STR_1374 :Large Half Loop (right) +STR_1375 :Upper Transfer +STR_1376 :Lower Transfer +STR_1377 :Heartline Roll (left) +STR_1378 :Heartline Roll (right) +STR_1379 :Reverser (left) +STR_1380 :Reverser (right) +STR_1381 :Curved Lift Hill (left) +STR_1382 :Curved Lift Hill (right) +STR_1383 :Quarter Loop +STR_1384 :{YELLOW}{STRINGID} +STR_1385 :{SMALLFONT}{BLACK}Other track configurations +STR_1386 :Erikoinen... +STR_1387 :Can't change land type... +STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} +STR_1389 :{OUTLINE}{RED}- {CURRENCY} +STR_1390 :{CURRENCY2DP} +STR_1391 :{RED}{CURRENCY2DP} +STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction +STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options +STR_1394 :{SMALLFONT}{BLACK}Operating options +STR_1395 :{SMALLFONT}{BLACK}Maintenance options +STR_1396 :{SMALLFONT}{BLACK}Colour scheme options +STR_1397 :{SMALLFONT}{BLACK}Sound & music options +STR_1398 :{SMALLFONT}{BLACK}Measurements and test data +STR_1399 :{SMALLFONT}{BLACK}Graphs +STR_1400 :Sisäänkäynti +STR_1401 :Uloskäynti +STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction +STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction +STR_1404 :{SMALLFONT}{BLACK}Rotate 90{DEGREE} +STR_1405 :{SMALLFONT}{BLACK}Mirror image +STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) +STR_1407 :{WINDOW_COLOUR_2}Build this... +STR_1408 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} +STR_1409 :Entry/Exit Platform +STR_1410 :Vertical Tower +STR_1411 :{STRINGID} in the way +STR_1412 :{WINDOW_COLOUR_3}Data logging not available for this type of ride +STR_1413 :{WINDOW_COLOUR_3}Data logging will start when next {STRINGID} leaves {STRINGID} +STR_1414 :{SMALLFONT}{BLACK}{DURATION} +STR_1415 :{WINDOW_COLOUR_2}Velocity +STR_1416 :{WINDOW_COLOUR_2}Altitude +STR_1417 :{WINDOW_COLOUR_2}Vert.G's +STR_1418 :{WINDOW_COLOUR_2}Lat.G's +STR_1419 :{SMALLFONT}{BLACK}{VELOCITY} +STR_1420 :{SMALLFONT}{BLACK}{LENGTH} +STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g +STR_1422 :{SMALLFONT}{BLACK}Logging data from {POP16}{STRINGID} +STR_1423 :{SMALLFONT}{BLACK}Queue line path +STR_1424 :{SMALLFONT}{BLACK}Footpath +STR_1425 :Jalkakäytävä +STR_1426 :Queue Line +STR_1427 :{WINDOW_COLOUR_2}Customers: {BLACK}{COMMA32} per hour +STR_1428 :{WINDOW_COLOUR_2}Admission price: +STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1430 :Ilmainen +STR_1431 :Kävelee +STR_1432 :Heading for {STRINGID} +STR_1433 :Queuing for {STRINGID} +STR_1434 :Drowning +STR_1435 :On {STRINGID} +STR_1436 :In {STRINGID} +STR_1437 :At {STRINGID} +STR_1438 :Istuu +STR_1439 :(select location) +STR_1440 :Mowing grass +STR_1441 :Sweeping footpath +STR_1442 :Emptying litter bin +STR_1443 :Watering gardens +STR_1444 :Watching {STRINGID} +STR_1445 :Watching construction of {STRINGID} +STR_1446 :Looking at scenery +STR_1447 :Leaving the park +STR_1448 :Watching new ride being constructed +STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) +STR_1452 :Vieraan nimi +STR_1453 :Enter name for this guest: +STR_1454 :Can't name guest... +STR_1455 :Invalid name for guest +STR_1456 :{WINDOW_COLOUR_2}Cash spent: {BLACK}{CURRENCY2DP} +STR_1457 :{WINDOW_COLOUR_2}Cash in pocket: {BLACK}{CURRENCY2DP} +STR_1458 :{WINDOW_COLOUR_2}Time in park: {BLACK}{REALTIME} +STR_1459 :Radan tyyli +STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track +STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track +STR_1462 :Too steep for lift hill +STR_1463 :Vieraat +STR_1464 :Helix up (small) +STR_1465 :Helix up (large) +STR_1466 :Helix down (small) +STR_1467 :Helix down (large) +STR_1468 :Henkilökunta +STR_1469 :Ride must start and end with stations +STR_1470 :Station not long enough +STR_1471 :{WINDOW_COLOUR_2}Nopeus: +STR_1472 :{SMALLFONT}{BLACK}Speed of this ride +STR_1473 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1474 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}Not yet available +STR_1475 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1476 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}Not yet available +STR_1477 :{WINDOW_COLOUR_2}Intensity rating: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) +STR_1478 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1479 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}Not yet available +STR_1480 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} +STR_1481 :{SMALLFONT}{OPENQUOTES}I've spent all my money{ENDQUOTES} +STR_1482 :{SMALLFONT}{OPENQUOTES}I feel sick{ENDQUOTES} +STR_1483 :{SMALLFONT}{OPENQUOTES}I feel very sick{ENDQUOTES} +STR_1484 :{SMALLFONT}{OPENQUOTES}I want to go on something more thrilling than {STRINGID}{ENDQUOTES} +STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} looks too intense for me{ENDQUOTES} +STR_1486 :{SMALLFONT}{OPENQUOTES}I haven't finished my {STRINGID} yet{ENDQUOTES} +STR_1487 :{SMALLFONT}{OPENQUOTES}Just looking at {STRINGID} makes me feel sick{ENDQUOTES} +STR_1488 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to go on {STRINGID}{ENDQUOTES} +STR_1489 :{SMALLFONT}{OPENQUOTES}I want to go home{ENDQUOTES} +STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} is really good value{ENDQUOTES} +STR_1491 :{SMALLFONT}{OPENQUOTES}I've already got {STRINGID}{ENDQUOTES} +STR_1492 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} +STR_1493 :{SMALLFONT}{OPENQUOTES}I'm not hungry{ENDQUOTES} +STR_1494 :{SMALLFONT}{OPENQUOTES}I'm not thirsty{ENDQUOTES} +STR_1495 :{SMALLFONT}{OPENQUOTES}Help! I'm drowning!{ENDQUOTES} +STR_1496 :{SMALLFONT}{OPENQUOTES}I'm lost!{ENDQUOTES} +STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} was great{ENDQUOTES} +STR_1498 :{SMALLFONT}{OPENQUOTES}I've been queuing for {STRINGID} for ages{ENDQUOTES} +STR_1499 :{SMALLFONT}{OPENQUOTES}I'm tired{ENDQUOTES} +STR_1500 :{SMALLFONT}{OPENQUOTES}I'm hungry{ENDQUOTES} +STR_1501 :{SMALLFONT}{OPENQUOTES}I'm thirsty{ENDQUOTES} +STR_1502 :{SMALLFONT}{OPENQUOTES}I need to go to the bathroom{ENDQUOTES} +STR_1503 :{SMALLFONT}{OPENQUOTES}I can't find {STRINGID}{ENDQUOTES} +STR_1504 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to use {STRINGID}{ENDQUOTES} +STR_1505 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} while it's raining{ENDQUOTES} +STR_1506 :{SMALLFONT}{OPENQUOTES}The litter here is really bad{ENDQUOTES} +STR_1507 :{SMALLFONT}{OPENQUOTES}I can't find the park exit{ENDQUOTES} +STR_1508 :{SMALLFONT}{OPENQUOTES}I want to get off {STRINGID}{ENDQUOTES} +STR_1509 :{SMALLFONT}{OPENQUOTES}I want to get out of {STRINGID}{ENDQUOTES} +STR_1510 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} - It isn't safe{ENDQUOTES} +STR_1511 :{SMALLFONT}{OPENQUOTES}This path is disgusting{ENDQUOTES} +STR_1512 :{SMALLFONT}{OPENQUOTES}It's too crowded here{ENDQUOTES} +STR_1513 :{SMALLFONT}{OPENQUOTES}The vandalism here is really bad{ENDQUOTES} +STR_1514 :{SMALLFONT}{OPENQUOTES}Great scenery!{ENDQUOTES} +STR_1515 :{SMALLFONT}{OPENQUOTES}This park is really clean and tidy{ENDQUOTES} +STR_1516 :{SMALLFONT}{OPENQUOTES}The jumping fountains are great{ENDQUOTES} +STR_1517 :{SMALLFONT}{OPENQUOTES}The music is nice here{ENDQUOTES} +STR_1518 :{SMALLFONT}{OPENQUOTES}This balloon from {STRINGID} is really good value{ENDQUOTES} +STR_1519 :{SMALLFONT}{OPENQUOTES}This cuddly toy from {STRINGID} is really good value{ENDQUOTES} +STR_1520 :{SMALLFONT}{OPENQUOTES}This park map from {STRINGID} is really good value{ENDQUOTES} +STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} +STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} +STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} +STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} +STR_1528 : +STR_1529 : +STR_1530 : +STR_1531 :{SMALLFONT}{OPENQUOTES}This pizza from {STRINGID} is really good value{ENDQUOTES} +STR_1532 : +STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good value{ENDQUOTES} +STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} +STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} +STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}This toffee apple from {STRINGID} is really good value{ENDQUOTES} +STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}This doughnut from {STRINGID} is really good value{ENDQUOTES} +STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} +STR_1541 : +STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} +STR_1543 :{SMALLFONT}{OPENQUOTES}This lemonade from {STRINGID} is really good value{ENDQUOTES} +STR_1544 : +STR_1545 : +STR_1546 : +STR_1547 : +STR_1548 : +STR_1549 : +STR_1550 :{SMALLFONT}{OPENQUOTES}Vau!{ENDQUOTES} +STR_1551 :{SMALLFONT}{OPENQUOTES}I have the strangest feeling someone is watching me{ENDQUOTES} +STR_1552 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a balloon from {STRINGID}{ENDQUOTES} +STR_1553 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cuddly toy from {STRINGID}{ENDQUOTES} +STR_1554 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a park map from {STRINGID}{ENDQUOTES} +STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} +STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} +STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} +STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} +STR_1562 : +STR_1563 : +STR_1564 : +STR_1565 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for pizza from {STRINGID}{ENDQUOTES} +STR_1566 : +STR_1567 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for popcorn from {STRINGID}{ENDQUOTES} +STR_1568 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hot dog from {STRINGID}{ENDQUOTES} +STR_1569 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for tentacle from {STRINGID}{ENDQUOTES} +STR_1570 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hat from {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a toffee apple from {STRINGID}{ENDQUOTES} +STR_1572 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a T-shirt from {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a doughnut from {STRINGID}{ENDQUOTES} +STR_1574 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for coffee from {STRINGID}{ENDQUOTES} +STR_1575 : +STR_1576 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried chicken from {STRINGID}{ENDQUOTES} +STR_1577 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for lemonade from {STRINGID}{ENDQUOTES} +STR_1578 : +STR_1579 : +STR_1580 : +STR_1581 : +STR_1582 : +STR_1583 : +STR_1584 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1585 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1586 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1587 :{SMALLFONT}{OPENQUOTES}This pretzel from {STRINGID} is really good value{ENDQUOTES} +STR_1588 :{SMALLFONT}{OPENQUOTES}This hot chocolate from {STRINGID} is really good value{ENDQUOTES} +STR_1589 :{SMALLFONT}{OPENQUOTES}This iced tea from {STRINGID} is really good value{ENDQUOTES} +STR_1590 :{SMALLFONT}{OPENQUOTES}This funnel cake from {STRINGID} is really good value{ENDQUOTES} +STR_1591 :{SMALLFONT}{OPENQUOTES}These sunglasses from {STRINGID} are really good value{ENDQUOTES} +STR_1592 :{SMALLFONT}{OPENQUOTES}These beef noodles from {STRINGID} are really good value{ENDQUOTES} +STR_1593 :{SMALLFONT}{OPENQUOTES}These fried rice noodles from {STRINGID} are really good value{ENDQUOTES} +STR_1594 :{SMALLFONT}{OPENQUOTES}This wonton soup from {STRINGID} is really good value{ENDQUOTES} +STR_1595 :{SMALLFONT}{OPENQUOTES}This meatball soup from {STRINGID} is really good value{ENDQUOTES} +STR_1596 :{SMALLFONT}{OPENQUOTES}This fruit juice from {STRINGID} is really good value{ENDQUOTES} +STR_1597 :{SMALLFONT}{OPENQUOTES}This soybean milk from {STRINGID} is really good value{ENDQUOTES} +STR_1598 :{SMALLFONT}{OPENQUOTES}This sujongkwa from {STRINGID} is really good value{ENDQUOTES} +STR_1599 :{SMALLFONT}{OPENQUOTES}This sub sandwich from {STRINGID} is really good value{ENDQUOTES} +STR_1600 :{SMALLFONT}{OPENQUOTES}This cookie from {STRINGID} is really good value{ENDQUOTES} +STR_1601 : +STR_1602 : +STR_1603 : +STR_1604 :{SMALLFONT}{OPENQUOTES}This roast sausage from {STRINGID} are really good value{ENDQUOTES} +STR_1605 : +STR_1606 : +STR_1607 : +STR_1608 : +STR_1609 : +STR_1610 : +STR_1611 : +STR_1612 : +STR_1613 : +STR_1614 : +STR_1615 : +STR_1616 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1617 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1618 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1619 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a pretzel from {STRINGID}{ENDQUOTES} +STR_1620 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for hot chocolate from {STRINGID}{ENDQUOTES} +STR_1621 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for iced tea from {STRINGID}{ENDQUOTES} +STR_1622 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a funnel cake from {STRINGID}{ENDQUOTES} +STR_1623 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sunglasses from {STRINGID}{ENDQUOTES} +STR_1624 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for beef noodles from {STRINGID}{ENDQUOTES} +STR_1625 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried rice noodles from {STRINGID}{ENDQUOTES} +STR_1626 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for wonton soup from {STRINGID}{ENDQUOTES} +STR_1627 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for meatball soup from {STRINGID}{ENDQUOTES} +STR_1628 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fruit juice from {STRINGID}{ENDQUOTES} +STR_1629 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for soybean milk from {STRINGID}{ENDQUOTES} +STR_1630 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sujongkwa from {STRINGID}{ENDQUOTES} +STR_1631 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a sub sandwich from {STRINGID}{ENDQUOTES} +STR_1632 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cookie from {STRINGID}{ENDQUOTES} +STR_1633 : +STR_1634 : +STR_1635 : +STR_1636 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a roast sausage from {STRINGID}{ENDQUOTES} +STR_1637 : +STR_1638 : +STR_1639 : +STR_1640 : +STR_1641 : +STR_1642 : +STR_1643 : +STR_1644 : +STR_1645 : +STR_1646 : +STR_1647 : +STR_1648 :{SMALLFONT}{OPENQUOTES}Help! Put me down!{ENDQUOTES} +STR_1649 :{SMALLFONT}{OPENQUOTES}I'm running out of cash!{ENDQUOTES} +STR_1650 :{SMALLFONT}{OPENQUOTES}Wow! A new ride being built!{ENDQUOTES} +STR_1651 :{SMALLFONT}{OPENQUOTES}Nice ride! But not as good as the Phoenix...{ENDQUOTES} +STR_1652 :{SMALLFONT}{OPENQUOTES}I'm so excited - It's an Intamin ride!{ENDQUOTES} +STR_1653 :{SMALLFONT}{OPENQUOTES}...and here we are on {STRINGID}!{ENDQUOTES} +STR_1654 :{WINDOW_COLOUR_2}Recent thoughts: +STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land +STR_1656 :{SMALLFONT}{BLACK}Construct bridge or tunnel footpath +STR_1657 :{WINDOW_COLOUR_2}Preferred ride +STR_1658 :{WINDOW_COLOUR_2}intensity: {BLACK}less than {COMMA16} +STR_1659 :{WINDOW_COLOUR_2}intensity: {BLACK}between {COMMA16} and {COMMA16} +STR_1660 :{WINDOW_COLOUR_2}intensity: {BLACK}more than {COMMA16} +STR_1661 :{WINDOW_COLOUR_2}Nausea tolerance: {BLACK}{STRINGID} +STR_1662 :{WINDOW_COLOUR_2}Onnellisuus: +STR_1663 :{WINDOW_COLOUR_2}Nausea: +STR_1664 :{WINDOW_COLOUR_2}Energia: +STR_1665 :{WINDOW_COLOUR_2}Nälkä: +STR_1666 :{WINDOW_COLOUR_2}Jano: +STR_1667 :{WINDOW_COLOUR_2}Bathroom: +STR_1668 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}Unknown +STR_1669 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}{COMMA16}% +STR_1670 :{WINDOW_COLOUR_2}Total customers: {BLACK}{COMMA32} +STR_1671 :{WINDOW_COLOUR_2}Total profit: {BLACK}{CURRENCY2DP} +STR_1672 :Jarrut +STR_1673 :Spinning Control Toggle Track +STR_1674 :Jarrutusnopeus +STR_1675 :{POP16}{VELOCITY} +STR_1676 :{SMALLFONT}{BLACK}Set speed limit for brakes +STR_1677 :{WINDOW_COLOUR_2}Popularity: {BLACK}Unknown +STR_1678 :{WINDOW_COLOUR_2}Popularity: {BLACK}{COMMA16}% +STR_1679 :Helix up (left) +STR_1680 :Helix up (right) +STR_1681 :Helix down (left) +STR_1682 :Helix down (right) +STR_1683 :Base size 2 x 2 +STR_1684 :Base size 4 x 4 +STR_1685 :Base size 2 x 4 +STR_1686 :Base size 5 x 1 +STR_1687 :Water splash +STR_1688 :Base size 4 x 1 +STR_1689 :Block brakes +STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} +STR_1691 :{WINDOW_COLOUR_2} Hinta: {BLACK}{CURRENCY} +STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY} +STR_1693 :{SMALLFONT}{BLACK}Vieraat +STR_1694 :{SMALLFONT}{BLACK}Henkilökunta +STR_1695 :{SMALLFONT}{BLACK}Income and costs +STR_1696 :{SMALLFONT}{BLACK}Customer information +STR_1697 :Cannot place these on queue line area +STR_1698 :Can only place these on queue area +STR_1699 :Too many people in game +STR_1700 :Hire new Handyman +STR_1701 :Hire new Mechanic +STR_1702 :Hire new Security Guard +STR_1703 :Hire new Entertainer +STR_1704 :Can't hire new staff... +STR_1705 :{SMALLFONT}{BLACK}Sack this staff member +STR_1706 :{SMALLFONT}{BLACK}Move this person to a new location +STR_1707 :Too many staff in game +STR_1708 :{SMALLFONT}{BLACK}Set patrol area for this staff member +STR_1709 :Sack staff +STR_1710 :Kyllä +STR_1711 :{WINDOW_COLOUR_1}Are you sure you want to sack {STRINGID}? +STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Sweep footpaths +STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Water gardens +STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Empty litter bins +STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Mow grass +STR_1716 :Invalid name for park +STR_1717 :Can't rename park... +STR_1718 :Puiston nimi +STR_1719 :Enter name for park: +STR_1720 :{SMALLFONT}{BLACK}Name park +STR_1721 :Puisto suljettu +STR_1722 :Puisto auki +STR_1723 :Can't open park... +STR_1724 :Can't close park... +STR_1725 :Can't buy land... +STR_1726 :Land not for sale! +STR_1727 :Construction rights not for sale! +STR_1728 :Can't buy construction rights here... +STR_1729 :Land not owned by park! +STR_1730 :{RED}Suljettu - - +STR_1731 :{WHITE}{STRINGID} - - +STR_1732 :Build +STR_1733 :Mode +STR_1734 :{WINDOW_COLOUR_2}Kierroston määrä: +STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit +STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1737 :{COMMA16} +STR_1738 :Can't change number of laps... +STR_1739 :Race won by guest {INT32} +STR_1740 :Race won by {STRINGID} +STR_1741 :Not yet constructed ! +STR_1742 :{WINDOW_COLOUR_2}Max. people on ride: +STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this ride at one time +STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1745 :{COMMA16} +STR_1746 :Can't change this... +STR_1747 :{WINDOW_COLOUR_2}Time limit: +STR_1748 :{SMALLFONT}{BLACK}Time limit for ride +STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} +STR_1750 :{DURATION} +STR_1751 :Can't change time limit for ride... +STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park +STR_1753 :{SMALLFONT}{BLACK}Show summarised list of guests in park +STR_1754 :{BLACK}{COMMA16} vieraat +STR_1755 :{BLACK}{COMMA16} vieras +STR_1756 :{WINDOW_COLOUR_2}Admission price: +STR_1757 :{WINDOW_COLOUR_2}Reliability: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1758 :{SMALLFONT}{BLACK}Build mode +STR_1759 :{SMALLFONT}{BLACK}Move mode +STR_1760 :{SMALLFONT}{BLACK}Fill-in mode +STR_1761 :{SMALLFONT}{BLACK}Build maze in this direction +STR_1762 :Vesiputoukset +STR_1763 :Rapids +STR_1764 :Log Bumps +STR_1765 :On-ride photo section +STR_1766 :Reverser turntable +STR_1767 :Spinning tunnel +STR_1768 :Can't change number of swings... +STR_1769 :{WINDOW_COLOUR_2}Number of swings: +STR_1770 :{SMALLFONT}{BLACK}Number of complete swings +STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1772 :{COMMA16} +STR_1773 :Only one on-ride photo section allowed per ride +STR_1774 :Only one cable lift hill allowed per ride +STR_1775 :Off +STR_1776 :On +STR_1777 :{WINDOW_COLOUR_2}Musiikki +STR_1778 :{STRINGID} - - +STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Pandapuku +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiikeripuku +STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Norsupuku +STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roomalainenpuku +STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorillapuku +STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Lumimiespuku +STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Ritaripuku +STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronauttipuku +STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Rosvopuku +STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Seriffipuku +STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Merirosvopuku +STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff +STR_1791 :{WINDOW_COLOUR_2}Uniform colour: +STR_1792 :Responding to {STRINGID} breakdown call +STR_1793 :Heading to {STRINGID} for an inspection +STR_1794 :Korjataan {STRINGID} +STR_1795 :Answering radio call +STR_1796 :Has broken down and requires fixing +STR_1797 :This option cannot be changed for this ride +STR_1798 :Whirlpool +STR_1799 :{POP16}{POP16}{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1800 :Safety cut-out +STR_1801 :Restraints stuck closed +STR_1802 :Restraints stuck open +STR_1803 :Doors stuck closed +STR_1804 :Doors stuck open +STR_1805 :Vehicle malfunction +STR_1806 :Brakes failure +STR_1807 :Control failure +STR_1808 :{WINDOW_COLOUR_2}Last breakdown: {BLACK}{STRINGID} +STR_1809 :{WINDOW_COLOUR_2}Current breakdown: {OUTLINE}{RED}{STRINGID} +STR_1810 :{WINDOW_COLOUR_2}Carrying: +STR_1811 :Can't build this here... +STR_1812 :{SMALLFONT}{BLACK}{STRINGID} +STR_1813 :Miscellaneous Objects +STR_1814 :Actions +STR_1815 :Thoughts +STR_1816 :{SMALLFONT}{BLACK}Select information type to show in guest list +STR_1817 :({COMMA16}) +STR_1818 :{WINDOW_COLOUR_2}All guests +STR_1819 :{WINDOW_COLOUR_2}All guests (summarised) +STR_1820 :{WINDOW_COLOUR_2}Guests {STRINGID} +STR_1821 :{WINDOW_COLOUR_2}Guests thinking {STRINGID} +STR_1822 :{WINDOW_COLOUR_2}Guests thinking about {POP16}{STRINGID} +STR_1823 :{SMALLFONT}{BLACK}Show guests' thoughts about this ride/attraction +STR_1824 :{SMALLFONT}{BLACK}Show guests on this ride/attraction +STR_1825 :{SMALLFONT}{BLACK}Show guests queuing for this ride/attraction +STR_1826 :Tilanne +STR_1827 :Suosio +STR_1828 :Tyytyväisyys +STR_1829 :Tuotto +STR_1830 :Queue length +STR_1831 :Queue time +STR_1832 :Reliability +STR_1833 :Down-time +STR_1834 :Vieraiden suosikki +STR_1835 :Popularity: Unknown +STR_1836 :Popularity: {COMMA16}% +STR_1837 :Satisfaction: Unknown +STR_1838 :Satisfaction: {COMMA16}% +STR_1839 :Reliability: {COMMA16}% +STR_1840 :Down-time: {COMMA16}% +STR_1841 :Profit: {CURRENCY2DP} per hour +STR_1842 :Favourite of: {COMMA16} guest +STR_1843 :Favourite of: {COMMA16} guests +STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list +STR_1845 :{MONTHYEAR} +STR_1846 :{COMMA16} vierasta +STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} guests +STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} guests +STR_1849 :{WINDOW_COLOUR_2}Play music +STR_1850 :{SMALLFONT}{BLACK}Select whether music should be played for this ride +STR_1851 :{WINDOW_COLOUR_2}Running cost: {BLACK}{CURRENCY2DP} per hour +STR_1852 :{WINDOW_COLOUR_2}Running cost: {BLACK}Unknown +STR_1853 :{WINDOW_COLOUR_2}Built: {BLACK}This Year +STR_1854 :{WINDOW_COLOUR_2}Built: {BLACK}Last Year +STR_1855 :{WINDOW_COLOUR_2}Built: {BLACK}{COMMA16} Years Ago +STR_1856 :{WINDOW_COLOUR_2}Profit per item sold: {BLACK}{CURRENCY2DP} +STR_1857 :{WINDOW_COLOUR_2}Loss per item sold: {BLACK}{CURRENCY2DP} +STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY2DP} per month +STR_1859 :Yleismies +STR_1860 :Mekaanikko +STR_1861 :Vartija +STR_1862 :Viihdyttäjä +STR_1863 :Yleismies +STR_1864 :Mekaanikko +STR_1865 :Vartija +STR_1866 :Viihdyttäjä +STR_1867 :{BLACK}{COMMA16} {STRINGID} +STR_1868 :Can't change number of rotations... +STR_1869 :{WINDOW_COLOUR_2}Number of rotations: +STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations +STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1872 :{COMMA16} +STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY2DP} per hour +STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour +STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} +STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides +STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides +STR_1878 :{WINDOW_COLOUR_2}Inspection: +STR_1879 :Every 10 minutes +STR_1880 :Every 20 minutes +STR_1881 :Every 30 minutes +STR_1882 :Every 45 minutes +STR_1883 :Every hour +STR_1884 :Every 2 hours +STR_1885 :Never +STR_1886 :Inspecting {STRINGID} +STR_1887 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}{COMMA16} minutes +STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hours +STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride +STR_1891 :No {STRINGID} in park yet! +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : +STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} +STR_1895 :{SMALLFONT}{BLACK}Build new ride/attraction +STR_1896 :{WINDOW_COLOUR_2}Expenditure/Income +STR_1897 :{WINDOW_COLOUR_2}Ride construction +STR_1898 :{WINDOW_COLOUR_2}Ride running costs +STR_1899 :{WINDOW_COLOUR_2}Land purchase +STR_1900 :{WINDOW_COLOUR_2}Landscaping +STR_1901 :{WINDOW_COLOUR_2}Park entrance tickets +STR_1902 :{WINDOW_COLOUR_2}Ride tickets +STR_1903 :{WINDOW_COLOUR_2}Shop sales +STR_1904 :{WINDOW_COLOUR_2}Shop stock +STR_1905 :{WINDOW_COLOUR_2}Food/drink sales +STR_1906 :{WINDOW_COLOUR_2}Food/drink stock +STR_1907 :{WINDOW_COLOUR_2}Staff wages +STR_1908 :{WINDOW_COLOUR_2}Marketing +STR_1909 :{WINDOW_COLOUR_2}Research +STR_1910 :{WINDOW_COLOUR_2}Loan interest +STR_1911 :{BLACK} at {COMMA16}% per year +STR_1912 :{MONTH} +STR_1913 :{BLACK}+{CURRENCY2DP} +STR_1914 :{BLACK}{CURRENCY2DP} +STR_1915 :{RED}{CURRENCY2DP} +STR_1916 :{WINDOW_COLOUR_2}Loan: +STR_1917 :{POP16}{POP16}{POP16}{CURRENCY} +STR_1918 :Can't borrow any more money! +STR_1919 :Not enough cash available! +STR_1920 :Can't pay back loan! +STR_1921 :{SMALLFONT}{BLACK}Start a new game +STR_1922 :{SMALLFONT}{BLACK}Continue playing a saved game +STR_1923 :{SMALLFONT}{BLACK}Show tutorial +STR_1924 :{SMALLFONT}{BLACK}Exit +STR_1925 :Can't place person here... +STR_1926 :{SMALLFONT} +STR_1927 :{YELLOW}{STRINGID} has broken down +STR_1928 :{RED}{STRINGID} has crashed! +STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better +STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this guest - (If tracking is on, guest's movements will be reported in the message area) +STR_1931 :{STRINGID} has joined the queue line for {STRINGID} +STR_1932 :{STRINGID} is on {STRINGID} +STR_1933 :{STRINGID} is in {STRINGID} +STR_1934 :{STRINGID} has left {STRINGID} +STR_1935 :{STRINGID} has left the park +STR_1936 :{STRINGID} has bought {STRINGID} +STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message +STR_1938 :{SMALLFONT}{BLACK}Show view of guest +STR_1939 :{SMALLFONT}{BLACK}Show view of staff member +STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this guest +STR_1941 :{SMALLFONT}{BLACK}Show which rides this guest has been on +STR_1942 :{SMALLFONT}{BLACK}Show financial information about this guest +STR_1943 :{SMALLFONT}{BLACK}Show guest's recent thoughts +STR_1944 :{SMALLFONT}{BLACK}Show items guest is carrying +STR_1945 :{SMALLFONT}{BLACK}Show orders and options for this staff member +STR_1946 :{SMALLFONT}{BLACK}Select costume for this entertainer +STR_1947 :{SMALLFONT}{BLACK}Show areas patrolled by selected staff type, and locate the nearest staff member +STR_1948 :{SMALLFONT}{BLACK}Hire a new staff member of the selected type +STR_1949 :Financial Summary +STR_1950 :Financial Graph +STR_1951 :Park Value Graph +STR_1952 :Profit Graph +STR_1953 :Marketing +STR_1954 :Research Funding +STR_1955 :{WINDOW_COLOUR_2}Number of circuits: +STR_1956 :{SMALLFONT}{BLACK}Number of circuits of track per ride +STR_1957 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1958 :{COMMA16} +STR_1959 :Can't change number of circuits... +STR_1960 :{WINDOW_COLOUR_2}Balloon price: +STR_1961 :{WINDOW_COLOUR_2}Cuddly Toy price: +STR_1962 :{WINDOW_COLOUR_2}Park Map price: +STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_1964 :{WINDOW_COLOUR_2}Umbrella price: +STR_1965 :{WINDOW_COLOUR_2}Drink price: +STR_1966 :{WINDOW_COLOUR_2}Burger price: +STR_1967 :{WINDOW_COLOUR_2}Chips price: +STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: +STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: +STR_1970 :{WINDOW_COLOUR_2} +STR_1971 :{WINDOW_COLOUR_2} +STR_1972 :{WINDOW_COLOUR_2} +STR_1973 :{WINDOW_COLOUR_2}Pizza price: +STR_1974 :{WINDOW_COLOUR_2} +STR_1975 :{WINDOW_COLOUR_2}Popcorn price: +STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: +STR_1977 :{WINDOW_COLOUR_2}Tentacle price: +STR_1978 :{WINDOW_COLOUR_2}Hat price: +STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: +STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: +STR_1981 :{WINDOW_COLOUR_2}Doughnut price: +STR_1982 :{WINDOW_COLOUR_2}Coffee price: +STR_1983 :{WINDOW_COLOUR_2} +STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: +STR_1985 :{WINDOW_COLOUR_2}Lemonade price: +STR_1986 :{WINDOW_COLOUR_2} +STR_1987 :{WINDOW_COLOUR_2} +STR_1988 :Ilmapallo +STR_1989 :Pehmolelu +STR_1990 :Puiston kartta +STR_1991 :On-Ride Photo +STR_1992 :Sateenvarjo +STR_1993 :Juoma +STR_1994 :Hampurilainen +STR_1995 :Sipsit +STR_1996 :Jäätelö +STR_1997 :Hattara +STR_1998 :Tyhjä tölkki +STR_1999 :Roska +STR_2000 :Tyhjä hampurilaisrasia +STR_2001 :Pizza +STR_2002 :Etuseteli +STR_2003 :Popcorn +STR_2004 :Hot Dog +STR_2005 :Lonkero +STR_2006 :Hattu +STR_2007 :Toffeeomena +STR_2008 :T-paita +STR_2009 :Donitsi +STR_2010 :Kahvi +STR_2011 :Tyhjä kuppi +STR_2012 :Paistettu kana +STR_2013 :Limonaadi +STR_2014 :Tyhjä rasia +STR_2015 :Tyhjä pullo +STR_2016 :Ilmapalloja +STR_2017 :Pehmoleluja +STR_2018 :Puistokarttoja +STR_2019 :On-Ride Photos +STR_2020 :Sateenvarjoja +STR_2021 :Juomia +STR_2022 :Hampurilaisia +STR_2023 :Sipsejä +STR_2024 :Jäätelöä +STR_2025 :Hattara +STR_2026 :Tyhjiä tölkkejä +STR_2027 :Rubbish +STR_2028 :Tyhjiä hampurilaisrasioita +STR_2029 :Pizzoja +STR_2030 :Etuseteleitä +STR_2031 :Popcorn +STR_2032 :Hot Dogeja +STR_2033 :Lonkeroita +STR_2034 :Hattuja +STR_2035 :Toffeeomenoita +STR_2036 :T-paitoja +STR_2037 :Donitseja +STR_2038 :Kahvia +STR_2039 :Tyhjiä tölkkejä +STR_2040 :Paistettu kana +STR_2041 :Limonaadi +STR_2042 :Tyhjiä rasiota +STR_2043 :Tyhjiä pulloja +STR_2044 :Ilmapallo +STR_2045 :Pehmolelu +STR_2046 :Puiston kartta +STR_2047 :an On-Ride Photo +STR_2048 :Sateenvarjo +STR_2049 :Juoma +STR_2050 :Hampurilainen +STR_2051 :Sipsejä +STR_2052 :Jäätelö +STR_2053 :Hattaraa +STR_2054 :Tyhjä tölkki +STR_2055 :Roskaa +STR_2056 :Tyhjä hampurilaisrasia +STR_2057 :Pizza +STR_2058 :Etuseteli +STR_2059 :Popcornia +STR_2060 :Hot Dog +STR_2061 :Lonkero +STR_2062 :Hattu +STR_2063 :Toffeeomena +STR_2064 :T-paita +STR_2065 :Donitsi +STR_2066 :Kahvi +STR_2067 :Tyhjä tölkki +STR_2068 :Paistettua kanaa +STR_2069 :Limonaadia +STR_2070 :Tyhjä rasia +STR_2071 :Tyhjä pullo +STR_2072 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Ilmapallo +STR_2073 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Pehmolelu +STR_2074 :Map of {STRINGID} +STR_2075 :On-Ride Photo of {STRINGID} +STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Sateenvarjo +STR_2077 :Juoma +STR_2078 :Hampurilainen +STR_2079 :Sipsejä +STR_2080 :Jäätelö +STR_2081 :Hattara +STR_2082 :Tyhjä tölkki +STR_2083 :Roska +STR_2084 :Tyhjä hampurilaisrasia +STR_2085 :Pizza +STR_2086 :Voucher for {STRINGID} +STR_2087 :Popcorn +STR_2088 :Hot Dog +STR_2089 :Lonkero +STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hattu +STR_2091 :Toffeeomena +STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-paita +STR_2093 :Donitsi +STR_2094 :Kahvi +STR_2095 :Tyhjä tölkki +STR_2096 :Paistettu kana +STR_2097 :Limonaadi +STR_2098 :Tyhjä tölkki +STR_2099 :Tyhjä pullo +STR_2100 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2101 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2102 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2103 :{WINDOW_COLOUR_2}Rinkelin hinta: +STR_2104 :{WINDOW_COLOUR_2}Kaakaon hinta: +STR_2105 :{WINDOW_COLOUR_2}Jääteen hinta: +STR_2106 :{WINDOW_COLOUR_2}Tippaleivän hinta: +STR_2107 :{WINDOW_COLOUR_2}Aurinkolasien hinta: +STR_2108 :{WINDOW_COLOUR_2}Häränlihanuudelien hinta: +STR_2109 :{WINDOW_COLOUR_2}Paistettu riisinuudelien hinta: +STR_2110 :{WINDOW_COLOUR_2}Wontonkeiton hinta: +STR_2111 :{WINDOW_COLOUR_2}Lihapullakeiton hinta: +STR_2112 :{WINDOW_COLOUR_2}Hedelmämehun hinta: +STR_2113 :{WINDOW_COLOUR_2}Soijapapumaidon hinta: +STR_2114 :{WINDOW_COLOUR_2}Sujongkwan hinta: +STR_2115 :{WINDOW_COLOUR_2}Patongin hinta: +STR_2116 :{WINDOW_COLOUR_2}Piparin hinta: +STR_2117 :{WINDOW_COLOUR_2} +STR_2118 :{WINDOW_COLOUR_2} +STR_2119 :{WINDOW_COLOUR_2} +STR_2120 :{WINDOW_COLOUR_2}Paahdetun makkaran hinta: +STR_2121 :{WINDOW_COLOUR_2} +STR_2122 :On-Ride Photo +STR_2123 :On-Ride Photo +STR_2124 :On-Ride Photo +STR_2125 :Rinkeli +STR_2126 :Kaakao +STR_2127 :Jäätee +STR_2128 :Tippaleipä +STR_2129 :Aurinkolasit +STR_2130 :Häränlihanuudelit +STR_2131 :Paistettu riisinuudelit +STR_2132 :Wontonkeitto +STR_2133 :Lihapullakeitto +STR_2134 :Hedelmämehu +STR_2135 :Soijapapumaito +STR_2136 :Sujongkwa +STR_2137 :Patonki +STR_2138 :Pipari +STR_2139 :Tyhjä kulho +STR_2140 :Tyhjä juomatölkki +STR_2141 :Tyhjä mehukuppi +STR_2142 :Paahdettu makkara +STR_2143 :Tyhjä kulho +STR_2144 :On-Ride Photos +STR_2145 :On-Ride Photos +STR_2146 :On-Ride Photos +STR_2147 :Rinkelit +STR_2148 :Kaakaot +STR_2149 :Jääteet +STR_2150 :Tippaleivät +STR_2151 :Aurinkolasit +STR_2152 :Häränlihanuudelit +STR_2153 :Paistettu riisinuudelit +STR_2154 :Wontonkeitot +STR_2155 :Lihapullokeitot +STR_2156 :Hedelmämehut +STR_2157 :Soijapapumaidot +STR_2158 :Sujongkwa +STR_2159 :Patongit +STR_2160 :Piparit +STR_2161 :Tyhjiä kulhoja +STR_2162 :Tyhjiä juomatölkkejä +STR_2163 :Tyhjiä mehukuppeja +STR_2164 :Paahdetut makkarat +STR_2165 :Tyhjiä kulhoja +STR_2166 :an On-Ride Photo +STR_2167 :an On-Ride Photo +STR_2168 :an On-Ride Photo +STR_2169 :Rinkeli +STR_2170 :Kaakao +STR_2171 :Jäätee +STR_2172 :Tippaleipä +STR_2173 :Aurinkolasipari +STR_2174 :Häränlihanuudeleita +STR_2175 :Paistettuja riisinuudeleita +STR_2176 :Wontonkeittoa +STR_2177 :Lihapullakeittoa +STR_2178 :Hedelmämehua +STR_2179 :Soijapapumaitoa +STR_2180 :Sujongkwaa +STR_2181 :Patonki +STR_2182 :Pipari +STR_2183 :Tyhjä kulho +STR_2184 :Tyhjä juomatölkki +STR_2185 :Tyhjä mehukuppi +STR_2186 :Paahdettu makkara +STR_2187 :Tyhjä kulho +STR_2188 :On-Ride Photo of {STRINGID} +STR_2189 :On-Ride Photo of {STRINGID} +STR_2190 :On-Ride Photo of {STRINGID} +STR_2191 :Rinkeli +STR_2192 :Kaakao +STR_2193 :Jäätee +STR_2194 :Tippaleipä +STR_2195 :Aurinkolasit +STR_2196 :Häränlihanuudelit +STR_2197 :Paistettuja riisinuudeleita +STR_2198 :Wontonkeitto +STR_2199 :Lihapullakeitto +STR_2200 :Hedelmämehu +STR_2201 :Soijapapumaito +STR_2202 :Sujongkwa +STR_2203 :Patonki +STR_2204 :Pipari +STR_2205 :Tyhjä kulho +STR_2206 :Tyhjä juomatölkki +STR_2207 :Tyhjä mehukuppi +STR_2208 :Paahdettu makkara +STR_2209 :Tyhjä kulho +STR_2210 :{SMALLFONT}{BLACK}Show list of handymen in park +STR_2211 :{SMALLFONT}{BLACK}Show list of mechanics in park +STR_2212 :{SMALLFONT}{BLACK}Show list of security guards in park +STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park +STR_2214 :Construction not possible while game is paused! +STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) +STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled +STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} +STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} +STR_2221 :{SMALLFONT}{BLACK}Park Rating: {COMMA16} +STR_2222 :{SMALLFONT}{BLACK}{STRINGID} +STR_2223 :{WINDOW_COLOUR_2}Vieraiden määrä: {BLACK}{COMMA16} +STR_2224 :{WINDOW_COLOUR_2}Cash: {BLACK}{CURRENCY2DP} +STR_2225 :{WINDOW_COLOUR_2}Cash: {RED}{CURRENCY2DP} +STR_2226 :{WINDOW_COLOUR_2}Puiston arvo: {BLACK}{CURRENCY} +STR_2227 :{WINDOW_COLOUR_2}Yrityksen arvo: {BLACK}{CURRENCY} +STR_2228 :{WINDOW_COLOUR_2}Last month's profit from food/drink and{NEWLINE}merchandise sales: {BLACK}{CURRENCY} +STR_2229 :Slope up to vertical +STR_2230 :Vertical track +STR_2231 :Holding brake for drop +STR_2232 :Cable lift hill +STR_2233 :{SMALLFONT}{BLACK}Park information +STR_2234 :Recent Messages +STR_2235 :{SMALLFONT}{STRINGID} {STRINGID} +STR_2236 :Tammikuu +STR_2237 :Helmikuu +STR_2238 :Maaliskuu +STR_2239 :Huhtikuu +STR_2240 :Toukokuu +STR_2241 :Kesäkuu +STR_2242 :Heinäkuu +STR_2243 :Elokuu +STR_2244 :Syyskuu +STR_2245 :Lokakuu +STR_2246 :Marraskuu +STR_2247 :Joulukuu +STR_2248 :Can't demolish ride/attraction... +STR_2249 :{BABYBLUE}New ride/attraction now available:{NEWLINE}{STRINGID} +STR_2250 :{BABYBLUE}New scenery/themeing now available:{NEWLINE}{STRINGID} +STR_2251 :Can only be built on paths! +STR_2252 :Can only be built across paths! +STR_2253 :Transport Rides +STR_2254 :Gentle Rides +STR_2255 :Roller Coasters +STR_2256 :Thrill Rides +STR_2257 :Water Rides +STR_2258 :Shops & Stalls +STR_2259 :Scenery & Themeing +STR_2260 :No funding +STR_2261 :Minimum funding +STR_2262 :Normal funding +STR_2263 :Maximum funding +STR_2264 :Research funding +STR_2265 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} per month +STR_2266 :Research priorities +STR_2267 :Currently in development +STR_2268 :Last development +STR_2269 :{WINDOW_COLOUR_2}Type: {BLACK}{STRINGID} +STR_2270 :{WINDOW_COLOUR_2}Progress: {BLACK}{STRINGID} +STR_2271 :{WINDOW_COLOUR_2}Expected: {BLACK}{STRINGID} +STR_2272 :{WINDOW_COLOUR_2}Ride/attraction:{NEWLINE}{BLACK}{STRINGID} +STR_2273 :{WINDOW_COLOUR_2}Scenery/themeing:{NEWLINE}{BLACK}{STRINGID} +STR_2274 :{SMALLFONT}{BLACK}Show details of this invention or development +STR_2275 :{SMALLFONT}{BLACK}Show funding and options for research & development +STR_2276 :{SMALLFONT}{BLACK}Show research & development status +STR_2277 :Tuntematon +STR_2278 :Transport Ride +STR_2279 :Gentle Ride +STR_2280 :Roller Coaster +STR_2281 :Thrill Ride +STR_2282 :Water Ride +STR_2283 :Shop/Stall +STR_2284 :Scenery/Themeing +STR_2285 :Initial research +STR_2286 :Designing +STR_2287 :Completing design +STR_2288 :Tuntematon +STR_2289 :{STRINGID} {STRINGID} +STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} +STR_2291 :Select scenario for new game +STR_2292 :{WINDOW_COLOUR_2}Rides been on: +STR_2293 :{BLACK} Ei mitään +STR_2294 :{SMALLFONT}{BLACK}Change base land style +STR_2295 :{SMALLFONT}{BLACK}Change vertical edges of land +STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} paid to enter park +STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} ride +STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} rides +STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} item of food +STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} items of food +STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drink +STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drinks +STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenir +STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenirs +STR_2305 :Track design files +STR_2306 :Save track design +STR_2307 :Select {STRINGID} design +STR_2308 :{STRINGID} Track Designs +STR_2309 :Install New Track Design +STR_2310 :Build custom design +STR_2311 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} (approx.) +STR_2312 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} (approx.) +STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) +STR_2314 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID} +STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} +STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : +STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} +STR_2322 :{WINDOW_COLOUR_2}Henkilökunta: {BLACK}{COMMA16} +STR_2323 :{WINDOW_COLOUR_2}Puiston koko: {BLACK}{COMMA32}m{SQUARED} +STR_2324 :{WINDOW_COLOUR_2}Puiston koko: {BLACK}{COMMA32}sq.ft. +STR_2325 :{SMALLFONT}{BLACK}Buy land to extend park +STR_2326 :{SMALLFONT}{BLACK}Buy construction rights to allow construction above or below land outside the park +STR_2327 :Options +STR_2328 :{WINDOW_COLOUR_2}Valuutta: +STR_2329 :{WINDOW_COLOUR_2}Distance and Speed: +STR_2330 :{WINDOW_COLOUR_2}Lämpötila: +STR_2331 :{WINDOW_COLOUR_2}Height Labels: +STR_2332 :Yksikköä +STR_2333 :Ääni +STR_2334 :Puntaa ({POUND}) +STR_2335 :Dollaria ($) +STR_2336 :Franc (F) +STR_2337 :Saksanmarkkaa (DM) +STR_2338 :Jeniä ({YEN}) +STR_2339 :Pesetaa (Pts) +STR_2340 :Liiraa (L) +STR_2341 :Guilders (fl.) +STR_2342 :Krona (kr) +STR_2343 :Euroa ({EURO}) +STR_2344 :Imperial +STR_2345 :Metric +STR_2346 :Display +STR_2347 :{RED}{STRINGID} has drowned! +STR_2348 :{SMALLFONT}{BLACK}Show statistics for this staff member +STR_2349 :{WINDOW_COLOUR_2}Wages: {BLACK}{CURRENCY} per month +STR_2350 :{WINDOW_COLOUR_2}Employed: {BLACK}{MONTHYEAR} +STR_2351 :{WINDOW_COLOUR_2}Lawns mown: {BLACK}{COMMA16} +STR_2352 :{WINDOW_COLOUR_2}Gardens watered: {BLACK}{COMMA16} +STR_2353 :{WINDOW_COLOUR_2}Litter swept: {BLACK}{COMMA16} +STR_2354 :{WINDOW_COLOUR_2}Bins emptied: {BLACK}{COMMA16} +STR_2355 :{WINDOW_COLOUR_2}Rides fixed: {BLACK}{COMMA16} +STR_2356 :{WINDOW_COLOUR_2}Rides inspected: {BLACK}{COMMA16} +STR_2357 :House +STR_2358 :Units +STR_2359 :Real Values +STR_2360 :{WINDOW_COLOUR_2}Display Resolution: +STR_2361 :Landscape Smoothing +STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off +STR_2363 :Gridlines on Landscape +STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off +STR_2365 :The bank refuses to increase your loan! +STR_2366 :Celsius ({DEGREE}C) +STR_2367 :Fahrenheit (F) +STR_2368 :None +STR_2369 :Low +STR_2370 :Average +STR_2371 :High +STR_2372 :Low +STR_2373 :Medium +STR_2374 :High +STR_2375 :Very high +STR_2376 :Extreme +STR_2377 :Ultra-Extreme +STR_2378 :{SMALLFONT}{BLACK}Adjust smaller area of land +STR_2379 :{SMALLFONT}{BLACK}Adjust larger area of land +STR_2380 :{SMALLFONT}{BLACK}Adjust smaller area of water +STR_2381 :{SMALLFONT}{BLACK}Adjust larger area of water +STR_2382 :Land +STR_2383 :Water +STR_2384 :{WINDOW_COLOUR_2}Your objective: +STR_2385 :{BLACK}None +STR_2386 :{BLACK}To have at least {COMMA16} guests in your park at the end of {MONTHYEAR}, with a park rating of at least 600 +STR_2387 :{BLACK}To achieve a park value of at least {POP16}{POP16}{CURRENCY} at the end of {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} +STR_2388 :{BLACK}Have Fun! +STR_2389 :{BLACK}Build the best {STRINGID} you can! +STR_2390 :{BLACK}To have 10 different types of roller coasters operating in your park, each with an excitement value of at least 6.00 +STR_2391 :{BLACK}To have at least {COMMA16} guests in your park. You must not let the park rating drop below 700 at any time! +STR_2392 :{BLACK}To achieve a monthly income from ride tickets of at least {POP16}{POP16}{CURRENCY} +STR_2393 :{BLACK}To have 10 different types of roller coasters operating in your park, each with a minimum length of {LENGTH}, and an excitement rating of at least 7.00 +STR_2394 :{BLACK}To finish building all 5 of the partially built roller coasters in this park, designing them to achieve excitement ratings of at least {POP16}{POP16}{COMMA2DP32} each +STR_2395 :{BLACK}To repay your loan and achieve a park value of at least {POP16}{POP16}{CURRENCY} +STR_2396 :{BLACK}To achieve a monthly profit from food, drink and merchandise sales of at least {POP16}{POP16}{CURRENCY} +STR_2397 :None +STR_2398 :Number of guests at a given date +STR_2399 :Park value at a given date +STR_2400 :Have fun +STR_2401 :Build the best ride you can +STR_2402 :Build 10 roller coasters +STR_2403 :Number of guests in park +STR_2404 :Monthly income from ride tickets +STR_2405 :Build 10 roller coasters of a given length +STR_2406 :Finish building 5 roller coasters +STR_2407 :Repay loan and achieve a given park value +STR_2408 :Monthly profit from food/merchandise +STR_2409 :{WINDOW_COLOUR_2}Marketing campaigns in operation +STR_2410 :{BLACK}None +STR_2411 :{WINDOW_COLOUR_2}Marketing campaigns available +STR_2412 :{SMALLFONT}{BLACK}Start this marketing campaign +STR_2413 :{BLACK}({CURRENCY2DP} per week) +STR_2414 :(Not Selected) +STR_2415 :{WINDOW_COLOUR_2}Ride: +STR_2416 :{WINDOW_COLOUR_2}Item: +STR_2417 :{WINDOW_COLOUR_2}Length of time: +STR_2418 :Free entry to {STRINGID} +STR_2419 :Free ride on {STRINGID} +STR_2420 :Half-price entry to {STRINGID} +STR_2421 :Free {STRINGID} +STR_2422 :Advertising campaign for {STRINGID} +STR_2423 :Advertising campaign for {STRINGID} +STR_2424 :{WINDOW_COLOUR_2}Vouchers for free entry to the park +STR_2425 :{WINDOW_COLOUR_2}Vouchers for free rides on a particular ride +STR_2426 :{WINDOW_COLOUR_2}Vouchers for half-price entry to the park +STR_2427 :{WINDOW_COLOUR_2}Vouchers for free food or drink +STR_2428 :{WINDOW_COLOUR_2}Advertising campaign for the park +STR_2429 :{WINDOW_COLOUR_2}Advertising campaign for a particular ride +STR_2430 :{BLACK}Vouchers for free entry to {STRINGID} +STR_2431 :{BLACK}Vouchers for free ride on {STRINGID} +STR_2432 :{BLACK}Vouchers for half-price entry to {STRINGID} +STR_2433 :{BLACK}Vouchers for free {STRINGID} +STR_2434 :{BLACK}Advertising campaign for {STRINGID} +STR_2435 :{BLACK}Advertising campaign for {STRINGID} +STR_2436 :1 week +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : +STR_2442 : +STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} +STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} +STR_2445 :Start this marketing campaign +STR_2446 :{YELLOW}Your marketing campaign for free entry to the park has finished +STR_2447 :{YELLOW}Your marketing campaign for free rides on {STRINGID} has finished +STR_2448 :{YELLOW}Your marketing campaign for half-price entry to the park has finished +STR_2449 :{YELLOW}Your marketing campaign for free {STRINGID} has finished +STR_2450 :{YELLOW}Your advertising campaign for the park has finished +STR_2451 :{YELLOW}Your advertising campaign for {STRINGID} has finished +STR_2452 :{WINDOW_COLOUR_2}Cash (less loan): {BLACK}{CURRENCY2DP} +STR_2453 :{WINDOW_COLOUR_2}Cash (less loan): {RED}{CURRENCY2DP} +STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} - +STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} - +STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} - +STR_2457 :{SMALLFONT}{BLACK}Show financial accounts +STR_2458 :{SMALLFONT}{BLACK}Show graph of cash (less loan) over time +STR_2459 :{SMALLFONT}{BLACK}Show graph of park value over time +STR_2460 :{SMALLFONT}{BLACK}Show graph of weekly profit +STR_2461 :{SMALLFONT}{BLACK}Show marketing campaigns +STR_2462 :{SMALLFONT}{BLACK}Show view of park entrance +STR_2463 :{SMALLFONT}{BLACK}Show graph of park ratings over time +STR_2464 :{SMALLFONT}{BLACK}Show graph of guest numbers over time +STR_2465 :{SMALLFONT}{BLACK}Show park entrance price and information +STR_2466 :{SMALLFONT}{BLACK}Show park statistics +STR_2467 :{SMALLFONT}{BLACK}Show objectives for this game +STR_2468 :{SMALLFONT}{BLACK}Show recent awards this park has received +STR_2469 :{SMALLFONT}{BLACK}Select level of research & development +STR_2470 :{SMALLFONT}{BLACK}Research new transport rides +STR_2471 :{SMALLFONT}{BLACK}Research new gentle rides +STR_2472 :{SMALLFONT}{BLACK}Research new roller coasters +STR_2473 :{SMALLFONT}{BLACK}Research new thrill rides +STR_2474 :{SMALLFONT}{BLACK}Research new water rides +STR_2475 :{SMALLFONT}{BLACK}Research new shops and stalls +STR_2476 :{SMALLFONT}{BLACK}Research new scenery and themeing +STR_2477 :{SMALLFONT}{BLACK}Select operating mode for this ride/attraction +STR_2478 :{SMALLFONT}{BLACK}Show graph of velocity against time +STR_2479 :{SMALLFONT}{BLACK}Show graph of altitude against time +STR_2480 :{SMALLFONT}{BLACK}Show graph of vertical acceleration against time +STR_2481 :{SMALLFONT}{BLACK}Show graph of lateral acceleration against time +STR_2482 :{SMALLFONT}{BLACK}Profit: {CURRENCY} per week, Park Value: {CURRENCY} +STR_2483 :{WINDOW_COLOUR_2}Weekly profit: {BLACK}+{CURRENCY2DP} +STR_2484 :{WINDOW_COLOUR_2}Weekly profit: {RED}{CURRENCY2DP} +STR_2485 :Controls +STR_2486 :General +STR_2487 :Show 'real' names of guests +STR_2488 :{SMALLFONT}{BLACK}Toggle between showing 'real' names of guests and guest numbers +STR_2489 :Shortcut keys... +STR_2490 :Keyboard shortcuts +STR_2491 :Reset keys +STR_2492 :{SMALLFONT}{BLACK}Set all keyboard shortcuts back to default settings +STR_2493 :Close top-most window +STR_2494 :Close all floating windows +STR_2495 :Cancel construction mode +STR_2496 :Pause game +STR_2497 :Zoom view out +STR_2498 :Zoom view in +STR_2499 :Rotate view clockwise +STR_2500 :Rotate construction object +STR_2501 :Underground view toggle +STR_2502 :Remove base land toggle +STR_2503 :Remove vertical land toggle +STR_2504 :See-through rides toggle +STR_2505 :See-through scenery toggle +STR_2506 :Invisible supports toggle +STR_2507 :Invisible people toggle +STR_2508 :Height marks on land toggle +STR_2509 :Height marks on ride tracks toggle +STR_2510 :Height marks on paths toggle +STR_2511 :Adjust land +STR_2512 :Adjust water +STR_2513 :Build scenery +STR_2514 :Build paths +STR_2515 :Build new ride +STR_2516 :Show financial information +STR_2517 :Show research information +STR_2518 :Show rides list +STR_2519 :Show park information +STR_2520 :Show guest list +STR_2521 :Show staff list +STR_2522 :Show recent messages +STR_2523 :Show map +STR_2524 :Screenshot +### The following need to be reordered to match SDL_keycode layout. +STR_2525 :??? +STR_2526 :??? +STR_2527 :??? +STR_2528 :??? +STR_2529 :??? +STR_2530 :??? +STR_2531 :??? +STR_2532 :??? +STR_2533 :Backspace +STR_2534 :Tab +STR_2535 :??? +STR_2536 :??? +STR_2537 :Clear +STR_2538 :Return +STR_2539 :??? +STR_2540 :??? +STR_2541 :??? +STR_2542 :??? +STR_2543 :Alt/Menu +STR_2544 :Pause +STR_2545 :Caps +STR_2546 :??? +STR_2547 :??? +STR_2548 :??? +STR_2549 :??? +STR_2550 :??? +STR_2551 :??? +STR_2552 :Escape +STR_2553 :??? +STR_2554 :??? +STR_2555 :??? +STR_2556 :??? +STR_2557 :Spacebar +STR_2558 :PgUp +STR_2559 :PgDn +STR_2560 :End +STR_2561 :Home +STR_2562 :Left +STR_2563 :Up +STR_2564 :Right +STR_2565 :Down +STR_2566 :Select +STR_2567 :Print +STR_2568 :Execute +STR_2569 :Snapshot +STR_2570 :Insert +STR_2571 :Delete +STR_2572 :Help +STR_2573 :0 +STR_2574 :1 +STR_2575 :2 +STR_2576 :3 +STR_2577 :4 +STR_2578 :5 +STR_2579 :6 +STR_2580 :7 +STR_2581 :8 +STR_2582 :9 +STR_2583 :??? +STR_2584 :??? +STR_2585 :??? +STR_2586 :??? +STR_2587 :??? +STR_2588 :??? +STR_2589 :??? +STR_2590 :A +STR_2591 :B +STR_2592 :C +STR_2593 :D +STR_2594 :E +STR_2595 :F +STR_2596 :G +STR_2597 :H +STR_2598 :I +STR_2599 :J +STR_2600 :K +STR_2601 :L +STR_2602 :M +STR_2603 :N +STR_2604 :O +STR_2605 :P +STR_2606 :Q +STR_2607 :R +STR_2608 :S +STR_2609 :T +STR_2610 :U +STR_2611 :V +STR_2612 :W +STR_2613 :X +STR_2614 :Y +STR_2615 :Z +STR_2616 :??? +STR_2617 :??? +STR_2618 :Menu +STR_2619 :??? +STR_2620 :??? +STR_2621 :NumPad 0 +STR_2622 :NumPad 1 +STR_2623 :NumPad 2 +STR_2624 :NumPad 3 +STR_2625 :NumPad 4 +STR_2626 :NumPad 5 +STR_2627 :NumPad 6 +STR_2628 :NumPad 7 +STR_2629 :NumPad 8 +STR_2630 :NumPad 9 +STR_2631 :NumPad * +STR_2632 :NumPad + +STR_2633 :??? +STR_2634 :NumPad - +STR_2635 :NumPad . +STR_2636 :NumPad / +STR_2637 :F1 +STR_2638 :F2 +STR_2639 :F3 +STR_2640 :F4 +STR_2641 :F5 +STR_2642 :F6 +STR_2643 :F7 +STR_2644 :F8 +STR_2645 :F9 +STR_2646 :F10 +STR_2647 :F11 +STR_2648 :F12 +STR_2649 :F13 +STR_2650 :F14 +STR_2651 :F15 +STR_2652 :F16 +STR_2653 :F17 +STR_2654 :F18 +STR_2655 :F19 +STR_2656 :F20 +STR_2657 :F21 +STR_2658 :F22 +STR_2659 :F23 +STR_2660 :F24 +STR_2661 :??? +STR_2662 :??? +STR_2663 :??? +STR_2664 :??? +STR_2665 :??? +STR_2666 :??? +STR_2667 :??? +STR_2668 :??? +STR_2669 :NumLock +STR_2670 :Scroll +STR_2671 :??? +STR_2672 :??? +STR_2673 :??? +STR_2674 :??? +STR_2675 :??? +STR_2676 :??? +STR_2677 :??? +STR_2678 :??? +STR_2679 :??? +STR_2680 :All research complete +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2682 : +STR_2683 : +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive +STR_2685 :Simplex Noise Parameters +STR_2686 :{WINDOW_COLOUR_2}Low: +STR_2687 :{WINDOW_COLOUR_2}High: +STR_2688 :{WINDOW_COLOUR_2}Base Frequency: +STR_2689 :{WINDOW_COLOUR_2}Octaves: +STR_2690 :Map Generation +STR_2691 :{WINDOW_COLOUR_2}Base height: +STR_2692 :{WINDOW_COLOUR_2}Water level: +STR_2693 :{WINDOW_COLOUR_2}Terrain: +STR_2694 :Generate +STR_2695 :Random terrain +STR_2696 :Place trees +STR_2697 :??? +STR_2698 :??? +STR_2699 :??? +STR_2700 :Autosave frequency: +STR_2701 :Every week +STR_2702 :Every 2 weeks +STR_2703 :Every month +STR_2704 :Every 4 months +STR_2705 :Every year +STR_2706 :Never +STR_2707 :Open new window +STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? +STR_2709 :Overwrite +STR_2710 :Type the name of the file. +STR_2711 :; +STR_2712 := +STR_2713 :, +STR_2714 :- +STR_2715 :. +STR_2716 :/ +STR_2717 :' +STR_2718 :(up) +STR_2719 :(new file) +STR_2720 :{UINT16}sec +STR_2721 :{UINT16}secs +STR_2722 :{UINT16}min:{UINT16}sec +STR_2723 :{UINT16}min:{UINT16}secs +STR_2724 :{UINT16}mins:{UINT16}sec +STR_2725 :{UINT16}mins:{UINT16}secs +STR_2726 :{UINT16}min +STR_2727 :{UINT16}mins +STR_2728 :{UINT16}hour:{UINT16}min +STR_2729 :{UINT16}hour:{UINT16}mins +STR_2730 :{UINT16}hours:{UINT16}min +STR_2731 :{UINT16}hours:{UINT16}mins +STR_2732 :{COMMA16}ft +STR_2733 :{COMMA16}m +STR_2734 :{COMMA16}mph +STR_2735 :{COMMA16}km/h +STR_2736 :{MONTH}, Year {COMMA16} +STR_2737 :{STRINGID} {MONTH}, Year {COMMA16} +STR_2738 :Title screen music: +STR_2739 :None +STR_2740 :RollerCoaster Tycoon 1 +STR_2741 :RollerCoaster Tycoon 2 +STR_2742 :css50.dat not found +STR_2743 :Copy data\css17.dat from your RCT1 installation to data\css50.dat in your RCT2 installation. +STR_2744 :[ +STR_2745 :\ +STR_2746 :] +STR_2747 :{ENDQUOTES} +STR_2748 :Bar +STR_2749 :My new scenario +# New strings used in the cheats window previously these were ??? +STR_2750 :Move all items to top +STR_2751 :Move all items to bottom +STR_2752 :Clear grass +STR_2753 :Mowed grass +STR_2754 :Water plants +STR_2755 :Fix vandalism +STR_2756 :Remove litter +STR_2757 :Force Sun +STR_2758 :Force Thunder +STR_2759 :Zero Clearance +STR_2760 :+{CURRENCY} +STR_2761 : +STR_2762 : +STR_2763 :??? +STR_2764 : +STR_2765 :Large Tram +STR_2766 :Win scenario +STR_2767 :Freeze Climate +STR_2768 :Unfreeze Climate +STR_2769 :Open Park +STR_2770 :Close Park +STR_2771 :Slower Gamespeed +STR_2772 :Faster Gamespeed +STR_2773 :Windowed +STR_2774 :Fullscreen +STR_2775 :Fullscreen (desktop) +STR_2776 :Language: +STR_2777 :{MOVE_X}{SMALLFONT}{STRING} +STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} +STR_2779 :Viewport #{COMMA16} +STR_2780 :Extra viewport +# End of new strings +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2782 :SHIFT + +STR_2783 :CTRL + +STR_2784 :Change keyboard shortcut +STR_2785 :{WINDOW_COLOUR_2}Press new shortcut key for:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} +STR_2786 :{SMALLFONT}{BLACK}Click on shortcut description to select new key +STR_2787 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} +STR_2788 :{WINDOW_COLOUR_2}Congratulations !{NEWLINE}{BLACK}You achieved your objective with a company value of {CURRENCY} ! +STR_2789 :{WINDOW_COLOUR_2}You have failed your objective ! +STR_2790 :Enter name into scenario chart +STR_2791 :Enter name +STR_2792 :Please enter your name for the scenario chart: +STR_2793 :{SMALLFONT}(Completed by {STRINGID}) +STR_2794 :{WINDOW_COLOUR_2}Completed by: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} with a company value of: {BLACK}{CURRENCY} +STR_2795 :Sort +STR_2796 :{SMALLFONT}{BLACK}Sort the ride list into order using the information type displayed +STR_2797 :Scroll view when pointer at screen edge +STR_2798 :{SMALLFONT}{BLACK}Select whether to scroll the view when the mouse pointer is at the screen edge +STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments +STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32} +STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP} +STR_2802 :Map +STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map +STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map +STR_2805 :{SMALLFONT}{BLACK}Show map of park +STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organising them better +STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food +STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks +STR_2811 :{RED}Guests are complaining because they can't find the toilets in your park +STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around +STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests +STR_2814 :{WINDOW_COLOUR_2}Most untidy park award +STR_2815 :{WINDOW_COLOUR_2}Tidiest park award +STR_2816 :{WINDOW_COLOUR_2}Award for the park with the best roller coasters +STR_2817 :{WINDOW_COLOUR_2}Best value park award +STR_2818 :{WINDOW_COLOUR_2}Most beautiful park award +STR_2819 :{WINDOW_COLOUR_2}Worst value park award +STR_2820 :{WINDOW_COLOUR_2}Safest park award +STR_2821 :{WINDOW_COLOUR_2}Best staff award +STR_2822 :{WINDOW_COLOUR_2}Best park food award +STR_2823 :{WINDOW_COLOUR_2}Worst park food award +STR_2824 :{WINDOW_COLOUR_2}Best park toilets award +STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award +STR_2826 :{WINDOW_COLOUR_2}Best water rides award +STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award +STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride colour schemes award +STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award +STR_2830 :{WINDOW_COLOUR_2}Best gentle ride award +STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'! +STR_2832 :{TOPAZ}Your park has received an award for being 'The tidiest park in the country'! +STR_2833 :{TOPAZ}Your park has received an award for being 'The park with the best roller coasters'! +STR_2834 :{TOPAZ}Your park has received an award for being 'The best value park in the country'! +STR_2835 :{TOPAZ}Your park has received an award for being 'The most beautiful park in the country'! +STR_2836 :{TOPAZ}Your park has received an award for being 'The worst value park in the country'! +STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park in the country'! +STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! +STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! +STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! +STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best toilet facilities in the country'! +STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! +STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water rides in the country'! +STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed rides'! +STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of colour schemes'! +STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! +STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle rides'! +STR_2848 :{WINDOW_COLOUR_2}No recent awards +STR_2849 :New scenario installed successfully +STR_2850 :New track design installed successfully +STR_2851 :Scenario already installed +STR_2852 :Track design already installed +STR_2853 :Forbidden by the local authority! +STR_2854 :{RED}Guests can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance +STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the ride exit +STR_2856 :{WINDOW_COLOUR_2}Tutorial +STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) +STR_2858 :Can't start marketing campaign... +STR_2859 :Another instance of OpenRCT2 is already running +STR_2860 :Infogrames Interactive credits... +STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. +STR_2862 :Music acknowledgements... +STR_2863 :Music acknowledgements +STR_2864 :{WINDOW_COLOUR_2}March - Children of the Regiment: (Fucik) non copyright +STR_2865 :{WINDOW_COLOUR_2}Heyken's Serenade: (J.Heyken) British Standard Music Coy; GEMA, BRITICO +STR_2866 :{WINDOW_COLOUR_2}In Continental Mood: (Composer unknown) Copyright Control +STR_2867 :{WINDOW_COLOUR_2}Wedding Journey: (Traditional) +STR_2868 :{WINDOW_COLOUR_2}Tales from the Vienna Woods: (Johann Strauss) non copyright +STR_2869 :{WINDOW_COLOUR_2}Slavonic Dance: (Traditional) +STR_2870 :{WINDOW_COLOUR_2}Das Alpenhorn: (Traditional) +STR_2871 :{WINDOW_COLOUR_2}The Blond Sailor: (Traditional) +STR_2872 :{WINDOW_COLOUR_2}Overture - Poet and Peasant: (Suppe) non copyright +STR_2873 :{WINDOW_COLOUR_2}Waltz Medley: (Johann Strauss) non copyright +STR_2874 :{WINDOW_COLOUR_2}Bella Bella Bimba: (Traditional) +STR_2875 :{WINDOW_COLOUR_2}Original recordings (P) 1976 C.J.Mears Organization, used with consent +STR_2876 :{WINDOW_COLOUR_2}RollerCoaster Tycoon 2 Title Music: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2877 :{WINDOW_COLOUR_2}Dodgems Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2878 :{WINDOW_COLOUR_2}Mid Summer's Heat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2879 :{WINDOW_COLOUR_2}Pharaoh's Tomb: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2880 :{WINDOW_COLOUR_2}Caesar's March: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2881 :{WINDOW_COLOUR_2}Drifting To Heaven: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2882 :{WINDOW_COLOUR_2}Invaders: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2883 :{WINDOW_COLOUR_2}Eternal Toybox: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2884 :{WINDOW_COLOUR_2}Jungle Juice: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2885 :{WINDOW_COLOUR_2}Ninja's Noodles: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2886 :{WINDOW_COLOUR_2}Voyage to Andromeda: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2887 :{WINDOW_COLOUR_2}Brimble's Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2888 :{WINDOW_COLOUR_2}Atlantis: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2889 :{WINDOW_COLOUR_2}Wild West Kid: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2890 :{WINDOW_COLOUR_2}Vampire's Lair: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2891 :{WINDOW_COLOUR_2}Blockbuster: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2892 :{WINDOW_COLOUR_2}Airtime Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2893 :{WINDOW_COLOUR_2}Searchlight Rag: (Scott Joplin/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2894 :{WINDOW_COLOUR_2}Flight of Fantasy: (Steve Blenkinsopp) copyright {COPYRIGHT} Chris Sawyer +STR_2895 :{WINDOW_COLOUR_2}Big Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2896 :{WINDOW_COLOUR_2}Hypothermia: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2897 :{WINDOW_COLOUR_2}Last Sleigh Ride: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2898 :{WINDOW_COLOUR_2}Pipes of Glencairn: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2899 :{WINDOW_COLOUR_2}Traffic Jam: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2900 :{WINDOW_COLOUR_2} +STR_2901 :{WINDOW_COLOUR_2}(Samples courtesy of Spectrasonics {ENDQUOTES}Liquid Grooves{ENDQUOTES}) +STR_2902 :{WINDOW_COLOUR_2}Toccata: (C.M.Widor, played by Peter James Adcock) recording {COPYRIGHT} Chris Sawyer +STR_2903 :{WINDOW_COLOUR_2}Space Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2904 :{WINDOW_COLOUR_2}Manic Mechanic: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2905 :{WINDOW_COLOUR_2}Techno Torture: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2906 :{WINDOW_COLOUR_2}Sweat Dreams: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2907 :{WINDOW_COLOUR_2}What shall we do with the Drunken Sailor: (Anon/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2908 :{WINDOW_COLOUR_2}Infogrames Interactive +STR_2909 :{WINDOW_COLOUR_2}Senior Producer: Thomas J. Zahorik +STR_2910 :{WINDOW_COLOUR_2}Executive Producer: Bill Levay +STR_2911 :{WINDOW_COLOUR_2}Senior Marketing Product Manager: Scott Triola +STR_2912 :{WINDOW_COLOUR_2}V.P. of Product Development: Scott Walker +STR_2913 :{WINDOW_COLOUR_2}General Manager: John Hurlbut +STR_2914 :{WINDOW_COLOUR_2}Director of Quality Assurance: Michael Craighead +STR_2915 :{WINDOW_COLOUR_2}Q.A. Certification Manager: Kurt Boutin +STR_2916 :{WINDOW_COLOUR_2}Q.A. Certification Lead: Mark Huggins +STR_2917 :{WINDOW_COLOUR_2}Testers: Dena Irene Fitzgerald, Scott Rollins, Christopher McPhail +STR_2918 :{WINDOW_COLOUR_2}Clif McClure, Erik Maramaldi, Erik Jeffery +STR_2919 :{WINDOW_COLOUR_2}Director of Marketing: Ann Marie Bland +STR_2920 :{WINDOW_COLOUR_2}Manager of Creative Services: Steve Martin +STR_2921 :{WINDOW_COLOUR_2}Manager of Editorial & Documentation Services: Elizabeth Mackney +STR_2922 :{WINDOW_COLOUR_2}Graphic Designer: Paul Anselmi +STR_2923 :{WINDOW_COLOUR_2}Copywriter: Kurt Carlson +STR_2924 :{WINDOW_COLOUR_2}Special Thanks to: Peter Matiss +STR_2925 :{WINDOW_COLOUR_2}Engineering Specialist: Ken Edwards +STR_2926 :{WINDOW_COLOUR_2}Engineering Services Manager: Luis Rivas +STR_2927 :{WINDOW_COLOUR_2}Lead Compatibility Analyst: Geoffrey Smith +STR_2928 :{WINDOW_COLOUR_2}Compatibility Analysts: Jason Cordero, Burke McQuinn, Kim Jardin +STR_2929 :{WINDOW_COLOUR_2}Lead Tester: Daniel Frisoli +STR_2930 :{WINDOW_COLOUR_2}Senior Tester: Matt Pantaleoni +STR_2931 :{WINDOW_COLOUR_2} +STR_2932 :{WINDOW_COLOUR_2} +STR_2933 :{WINDOW_COLOUR_2} +STR_2934 :{WINDOW_COLOUR_2} +STR_2935 :{WINDOW_COLOUR_2} +STR_2936 :{WINDOW_COLOUR_2} +STR_2937 :{WINDOW_COLOUR_2} +STR_2938 :{WINDOW_COLOUR_2} +STR_2939 :{WINDOW_COLOUR_2} +STR_2940 :{WINDOW_COLOUR_2} +STR_2941 :{WINDOW_COLOUR_2} +STR_2942 :{WINDOW_COLOUR_2} +STR_2943 :{WINDOW_COLOUR_2} +STR_2944 :{WINDOW_COLOUR_2} +STR_2945 :{WINDOW_COLOUR_2} +STR_2946 :{WINDOW_COLOUR_2} +STR_2947 :{WINDOW_COLOUR_2} +STR_2948 :{WINDOW_COLOUR_2} +STR_2949 :{WINDOW_COLOUR_2} +STR_2950 :{WINDOW_COLOUR_2} +STR_2951 :{WINDOW_COLOUR_2} +STR_2952 :{WINDOW_COLOUR_2} +STR_2953 :{WINDOW_COLOUR_2} +STR_2954 :{WINDOW_COLOUR_2} +STR_2955 :{WINDOW_COLOUR_2} +STR_2956 :{WINDOW_COLOUR_2} +STR_2957 :{WINDOW_COLOUR_2} +STR_2958 :{WINDOW_COLOUR_2} +STR_2959 :{WINDOW_COLOUR_2} +STR_2960 :{WINDOW_COLOUR_2} +STR_2961 :{WINDOW_COLOUR_2} +STR_2962 :{WINDOW_COLOUR_2} +STR_2963 :{WINDOW_COLOUR_2} +STR_2964 :{WINDOW_COLOUR_2} +STR_2965 :{WINDOW_COLOUR_2} +STR_2966 : +STR_2967 : +STR_2968 : +STR_2969 : +STR_2970 : +STR_2971 :Main colour scheme +STR_2972 :Alternative colour scheme 1 +STR_2973 :Alternative colour scheme 2 +STR_2974 :Alternative colour scheme 3 +STR_2975 :{SMALLFONT}{BLACK}Select which colour scheme to change, or paint ride with +STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected colour scheme +STR_2977 :Staff member name +STR_2978 :Enter new name for this member of staff: +STR_2979 :Can't name staff member... +STR_2980 :Too many banners in game +STR_2981 :{RED}No entry - - +STR_2982 :Banner text +STR_2983 :Enter new text for this banner: +STR_2984 :Can't set new text for banner... +STR_2985 :Banner +STR_2986 :{SMALLFONT}{BLACK}Change text on banner +STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for guests +STR_2988 :{SMALLFONT}{BLACK}Demolish this banner +STR_2989 :{SMALLFONT}{BLACK}Select main colour +STR_2990 :{SMALLFONT}{BLACK}Select text colour +STR_2991 :Sign +STR_2992 :Sign text +STR_2993 :Enter new text for this sign: +STR_2994 :{SMALLFONT}{BLACK}Change text on sign +STR_2995 :{SMALLFONT}{BLACK}Demolish this sign +STR_2996 :{BLACK}ABC +STR_2997 :{GREY}ABC +STR_2998 :{WHITE}ABC +STR_2999 :{RED}ABC +STR_3000 :{GREEN}ABC +STR_3001 :{YELLOW}ABC +STR_3002 :{TOPAZ}ABC +STR_3003 :{CELADON}ABC +STR_3004 :{BABYBLUE}ABC +STR_3005 :{PALELAVENDER}ABC +STR_3006 :{PALEGOLD}ABC +STR_3007 :{LIGHTPINK}ABC +STR_3008 :{PEARLAQUA}ABC +STR_3009 :{PALESILVER}ABC +STR_3010 :Unable to load file... +STR_3011 :File contains invalid data +STR_3012 :Dodgems beat style +STR_3013 :Fairground organ style +STR_3014 :Roman fanfare style +STR_3015 :Oriental style +STR_3016 :Martian style +STR_3017 :Jungle drums style +STR_3018 :Egyptian style +STR_3019 :Toyland style +STR_3020 : +STR_3021 :Space style +STR_3022 :Horror style +STR_3023 :Techno style +STR_3024 :Gentle style +STR_3025 :Summer style +STR_3026 :Water style +STR_3027 :Wild west style +STR_3028 :Jurassic style +STR_3029 :Rock style +STR_3030 :Ragtime style +STR_3031 :Fantasy style +STR_3032 :Rock style 2 +STR_3033 :Ice style +STR_3034 :Snow style +STR_3035 :Custom music 1 +STR_3036 :Custom music 2 +STR_3037 :Medieval style +STR_3038 :Urban style +STR_3039 :Organ style +STR_3040 :Mechanical style +STR_3041 :Modern style +STR_3042 :Pirates style +STR_3043 :Rock style 3 +STR_3044 :Candy style +STR_3045 :{SMALLFONT}{BLACK}Select style of music to play +STR_3046 :This ride cannot be modified +STR_3047 :Local authority forbids demolition or modifications to this ride +STR_3048 :Marketing campaigns forbidden by local authority +STR_3049 :Golf hole A +STR_3050 :Golf hole B +STR_3051 :Golf hole C +STR_3052 :Golf hole D +STR_3053 :Golf hole E +STR_3054 :Loading... +STR_3055 :White +STR_3056 :Translucent +STR_3057 :{WINDOW_COLOUR_2}Construction Marker: +STR_3058 :Brick walls +STR_3059 :Hedges +STR_3060 :Ice blocks +STR_3061 :Wooden fences +STR_3062 :{SMALLFONT}{BLACK}Standard roller coaster track +STR_3063 :{SMALLFONT}{BLACK}Water channel (track submerged) +STR_3064 :Beginner Parks +STR_3065 :Challenging Parks +STR_3066 :Expert Parks +STR_3067 :{OPENQUOTES}Real{ENDQUOTES} Parks +STR_3068 :Other Parks +STR_3069 :Top Section +STR_3070 :Slope to Level +STR_3071 :{WINDOW_COLOUR_2}Same price throughout park +STR_3072 :{SMALLFONT}{BLACK}Select whether this price is used throughout the entire park +STR_3073 :{RED}WARNING: Your park rating has dropped below 700 !{NEWLINE}If you haven't raised the park rating in 4 weeks, your park will be closed down +STR_3074 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have 3 weeks to raise the park rating +STR_3075 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have only 2 weeks to raise the park rating, or your park will be closed down +STR_3076 :{RED}FINAL WARNING: Your park rating is still below 700 !{NEWLINE}In just 7 days your park will be closed down unless you can raise the rating +STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! +STR_3078 :Plain entrance +STR_3079 :Wooden entrance +STR_3080 :Canvas tent entrance +STR_3081 :Castle entrance (grey) +STR_3082 :Castle entrance (brown) +STR_3083 :Jungle entrance +STR_3084 :Log cabin entrance +STR_3085 :Classical/Roman entrance +STR_3086 :Abstract entrance +STR_3087 :Snow/Ice entrance +STR_3088 :Pagoda entrance +STR_3089 :Space entrance +STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station +STR_3091 :You are not allowed to remove this section! +STR_3092 :You are not allowed to move or modify the station for this ride! +STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} +STR_3094 :N/A +STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: +STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed +STR_3098 :Can't change lift hill speed... +STR_3099 :{SMALLFONT}{BLACK}Select colour +STR_3100 :{SMALLFONT}{BLACK}Select second colour +STR_3101 :{SMALLFONT}{BLACK}Select third colour +STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape +STR_3103 :Can't re-paint this... +STR_3104 :{SMALLFONT}{BLACK}List rides +STR_3105 :{SMALLFONT}{BLACK}List shops and stalls +STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other guest facilities +STR_3107 :Close +STR_3108 :Test +STR_3109 :Open +STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16} +STR_3111 :{SMALLFONT}{BLACK}Click on design to build it +STR_3112 :{SMALLFONT}{BLACK}Click on design to rename or delete it +STR_3113 :Select a different design +STR_3114 :{SMALLFONT}{BLACK}Go back to design selection window +STR_3115 :{SMALLFONT}{BLACK}Save track design +STR_3116 :{SMALLFONT}{BLACK}Save track design (Not possible until ride has been tested and statistics have been generated) +STR_3117 :{BLACK}Calling mechanic... +STR_3118 :{BLACK}{STRINGID} is heading for the ride +STR_3119 :{BLACK}{STRINGID} is fixing the ride +STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride +STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy +STR_3122 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guest +STR_3123 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guests +STR_3124 :Broken {STRINGID} +STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% +STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% +STR_3127 :{WINDOW_COLOUR_2}Nausea Factor: {BLACK}+{COMMA16}% +STR_3128 :Save Track Design +STR_3129 :Save Track Design with Scenery +STR_3130 :Save +STR_3131 :Cancel +STR_3132 :{BLACK}Click items of scenery to select them to be saved with track design... +STR_3133 :Unable to build this on a slope +STR_3134 :{RED}(Design includes scenery which is unavailable) +STR_3135 :{RED}(Vehicle design unavailable - Ride performance may be affected) +STR_3136 :Warning: This design will be built with an alternative vehicle type and may not perform as expected +STR_3137 :Select Nearby Scenery +STR_3138 :Reset Selection +STR_3139 :Cable lift unable to work in this operating mode +STR_3140 :Cable lift hill must start immediately after station +STR_3141 :Multi-circuit per ride not possible with cable lift hill +STR_3142 :{WINDOW_COLOUR_2}Capacity: {BLACK}{STRINGID} +STR_3143 :{SMALLFONT}{BLACK}Show people on map +STR_3144 :{SMALLFONT}{BLACK}Show rides and stalls on map +STR_3145 :{SMALLFONT}{BLACK}Scroll {STRINGID} left +STR_3146 :{SMALLFONT}{BLACK}Scroll {STRINGID} right +STR_3147 :{SMALLFONT}{BLACK}Scroll {STRINGID} left fast +STR_3148 :{SMALLFONT}{BLACK}Scroll {STRINGID} right fast +STR_3149 :{SMALLFONT}{BLACK}Scroll {STRINGID} left/right +STR_3150 :{SMALLFONT}{BLACK}Scroll {STRINGID} up +STR_3151 :{SMALLFONT}{BLACK}Scroll {STRINGID} down +STR_3152 :{SMALLFONT}{BLACK}Scroll {STRINGID} up fast +STR_3153 :{SMALLFONT}{BLACK}Scroll {STRINGID} down fast +STR_3154 :{SMALLFONT}{BLACK}Scroll {STRINGID} up/down +STR_3155 : +STR_3156 : +STR_3157 :map +STR_3158 :graph +STR_3159 :list +STR_3160 : +STR_3161 : +STR_3162 :Unable to allocate enough memory +STR_3163 :Installing new data: +STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) +STR_3165 : +STR_3166 :{BLACK}(ID: +STR_3167 :{WINDOW_COLOUR_2}Includes: {BLACK}{COMMA16} objects +STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} +STR_3169 :Data for the following object not found: +STR_3170 :Not enough space for graphics +STR_3171 :Too many objects of this type selected +STR_3172 :The following object must be selected first: {STRING} +STR_3173 :This object is currently in use +STR_3174 :This object is required by another object +STR_3175 :This object is always required +STR_3176 :Unable to select this object +STR_3177 :Unable to de-select this object +STR_3178 :At least one path object must be selected +STR_3179 :At least one ride vehicle/attraction object must be selected +STR_3180 :Invalid selection of objects +STR_3181 :Object Selection - {STRINGID} +STR_3182 :Park entrance type must be selected +STR_3183 :Water type must be selected +STR_3184 :Ride Vehicles/Attractions +STR_3185 :Small Scenery +STR_3186 :Large Scenery +STR_3187 :Walls/Fences +STR_3188 :Path Signs +STR_3189 :Footpaths +STR_3190 :Path Extras +STR_3191 :Scenery Groups +STR_3192 :Park Entrance +STR_3193 :Water +STR_3194 :Scenario Description +STR_3195 :Invention List +STR_3196 :{WINDOW_COLOUR_2}Research Group: {BLACK}{STRINGID} +STR_3197 :{WINDOW_COLOUR_2}Items pre-invented at start of game: +STR_3198 :{WINDOW_COLOUR_2}Items to invent during game: +STR_3199 :Random Shuffle +STR_3200 :{SMALLFONT}{BLACK}Randomly shuffle the list of items to invent during the game +STR_3201 :Object Selection +STR_3202 :Landscape Editor +STR_3203 :Invention List Set Up +STR_3204 :Options Selection +STR_3205 :Objective Selection +STR_3206 :Save Scenario +STR_3207 :Roller Coaster Designer +STR_3208 :Track Designs Manager +STR_3209 :Back to Previous Step: +STR_3210 :Forward to Next Step: +STR_3211 :{WINDOW_COLOUR_2}Map size: +STR_3212 :{POP16}{COMMA16} x {PUSH16}{COMMA16} +STR_3213 :Can't decrease map size any further +STR_3214 :Can't increase map size any further +STR_3215 :Too close to edge of map +STR_3216 :{SMALLFONT}{BLACK}Select park-owned land etc. +STR_3217 :Land Owned +STR_3218 :Construction Rights Owned +STR_3219 :Land For Sale +STR_3220 :Construction Rights For Sale +STR_3221 :{SMALLFONT}{BLACK}Set land to be owned by the park +STR_3222 :{SMALLFONT}{BLACK}Set construction rights only to be owned by the park +STR_3223 :{SMALLFONT}{BLACK}Set land to be available to purchase by the park +STR_3224 :{SMALLFONT}{BLACK}Set construction rights to be available to purchase by the park +STR_3225 :{SMALLFONT}{BLACK}Toggle on/off building a random cluster of objects around the selected position +STR_3226 :{SMALLFONT}{BLACK}Build park entrance +STR_3227 :Too many park entrances! +STR_3228 :{SMALLFONT}{BLACK}Set starting positions for people +STR_3229 :Block Brakes cannot be used directly after station +STR_3230 :Block Brakes cannot be used directly after each other +STR_3231 :Block Brakes cannot be used directly after the top of this lift hill +STR_3232 :Options - Financial +STR_3233 :Options - Guests +STR_3234 :Options - Park +STR_3235 :{SMALLFONT}{BLACK}Show financial options +STR_3236 :{SMALLFONT}{BLACK}Show guest options +STR_3237 :{SMALLFONT}{BLACK}Show park options +STR_3238 :No Money +STR_3239 :{SMALLFONT}{BLACK}Make this park a 'no money' park with no financial restrictions +STR_3240 :{WINDOW_COLOUR_2}Initial cash: +STR_3241 :{WINDOW_COLOUR_2}Initial loan: +STR_3242 :{WINDOW_COLOUR_2}Maximum loan size: +STR_3243 :{WINDOW_COLOUR_2}Annual interest rate: +STR_3244 :Forbid marketing campaigns +STR_3245 :{SMALLFONT}{BLACK}Forbid advertising, promotional schemes, and other marketing campaigns +STR_3246 :{WINDOW_COLOUR_2}{CURRENCY} +STR_3247 :{WINDOW_COLOUR_2}{COMMA16}% +STR_3248 :Can't increase initial cash any further! +STR_3249 :Can't reduce initial cash any further! +STR_3250 :Can't increase initial loan any further! +STR_3251 :Can't reduce initial loan any further! +STR_3252 :Can't increase maximum loan size any further! +STR_3253 :Can't reduce maximum loan size any further! +STR_3254 :Can't increase interest rate any further! +STR_3255 :Can't reduce interest rate any further! +STR_3256 :Guests prefer less intense rides +STR_3257 :{SMALLFONT}{BLACK}Select whether guests should generally prefer less intense rides only +STR_3258 :Guests prefer more intense rides +STR_3259 :{SMALLFONT}{BLACK}Select whether guests should generally prefer more intense rides only +STR_3260 :{WINDOW_COLOUR_2}Cash per guest (average): +STR_3261 :{WINDOW_COLOUR_2}Guests initial happiness: +STR_3262 :{WINDOW_COLOUR_2}Guests initial hunger: +STR_3263 :{WINDOW_COLOUR_2}Guests initial thirst: +STR_3264 :Can't increase this any further! +STR_3265 :Can't reduce this any further! +STR_3266 :{SMALLFONT}{BLACK}Select how this park charges for entrance and rides +STR_3267 :Forbid tree removal +STR_3268 :{SMALLFONT}{BLACK}Forbid tall trees being removed +STR_3269 :Forbid landscape changes +STR_3270 :{SMALLFONT}{BLACK}Forbid any changes to the landscape +STR_3271 :Forbid high construction +STR_3272 :{SMALLFONT}{BLACK}Forbid any tall construction +STR_3273 :Park rating higher difficult level +STR_3274 :{SMALLFONT}{BLACK}Make the park rating value more challenging +STR_3275 :Guest generation higher difficult level +STR_3276 :{SMALLFONT}{BLACK}Make it more difficult to attract guests to the park +STR_3277 :{WINDOW_COLOUR_2}Cost to buy land: +STR_3278 :{WINDOW_COLOUR_2}Cost to buy construction rights: +STR_3279 :Free park entry / Pay per ride +STR_3280 :Pay to enter park / Free rides +STR_3281 :{WINDOW_COLOUR_2}Entry price: +STR_3282 :{SMALLFONT}{BLACK}Select objective and park name +STR_3283 :{SMALLFONT}{BLACK}Select rides to be preserved +STR_3284 :Objective Selection +STR_3285 :Preserved Rides +STR_3286 :{SMALLFONT}{BLACK}Select objective for this scenario +STR_3287 :{WINDOW_COLOUR_2}Objective: +STR_3288 :{SMALLFONT}{BLACK}Select climate +STR_3289 :{WINDOW_COLOUR_2}Climate: +STR_3290 :Cool and wet +STR_3291 :Warm +STR_3292 :Hot and dry +STR_3293 :Cold +STR_3294 :Change... +STR_3295 :{SMALLFONT}{BLACK}Change name of park +STR_3296 :{SMALLFONT}{BLACK}Change name of scenario +STR_3297 :{SMALLFONT}{BLACK}Change detail notes about park / scenario +STR_3298 :{WINDOW_COLOUR_2}Park Name: {BLACK}{STRINGID} +STR_3299 :{WINDOW_COLOUR_2}Park/Scenario Details: +STR_3300 :{WINDOW_COLOUR_2}Scenario Name: {BLACK}{STRINGID} +STR_3301 :{WINDOW_COLOUR_2}Objective Date: +STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR} +STR_3303 :{WINDOW_COLOUR_2}Number of guests: +STR_3304 :{WINDOW_COLOUR_2}Park value: +STR_3305 :{WINDOW_COLOUR_2}Monthly income: +STR_3306 :{WINDOW_COLOUR_2}Monthly profit: +STR_3307 :{WINDOW_COLOUR_2}Minimum length: +STR_3308 :{WINDOW_COLOUR_2}Excitement rating: +STR_3309 :{WINDOW_COLOUR_2}{COMMA16} +STR_3310 :{WINDOW_COLOUR_2}{LENGTH} +STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32} +STR_3312 :{WINDOW_COLOUR_2}Rides/attractions under a preservation order: +STR_3313 :Scenario Name +STR_3314 :Enter name for scenario: +STR_3315 :Park/Scenario Details +STR_3316 :Enter description of this scenario: +STR_3317 :No details yet +STR_3318 :{SMALLFONT}{BLACK}Select which group this scenario appears in +STR_3319 :{WINDOW_COLOUR_2}Scenario Group: +STR_3320 :Unable to save scenario file... +STR_3321 :New objects installed successfully +STR_3322 :{WINDOW_COLOUR_2}Objective: {BLACK}{STRINGID} +STR_3323 :Missing object data, ID: +STR_3324 :Requires Add-On Pack: +STR_3325 :Requires an Add-On Pack +STR_3326 :{WINDOW_COLOUR_2}(no image) +STR_3327 :Starting positions for people not set +STR_3328 :Can't advance to next editor stage... +STR_3329 :Park entrance not yet built +STR_3330 :Park must own some land +STR_3331 :Path from park entrance to map edge either not complete or too complex - Path must be single-width with as few junctions and corners as possible +STR_3332 :Park entrance is the wrong way round or has no path leading to the map edge +STR_3333 :Export plug-in objects with saved games +STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data +STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles +STR_3336 :Track Designs Manager - Select Ride Type +STR_3337 : +STR_3338 :{BLACK}Custom-designed layout +STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout +STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout +STR_3341 :{SMALLFONT}{BLACK}Game tools +STR_3342 :Scenario Editor +STR_3343 :Convert Saved Game to Scenario +STR_3344 :Roller Coaster Designer +STR_3345 :Track Designs Manager +STR_3346 :Can't save track design... +STR_3347 :Ride is too large, contains too many elements, or scenery is too spread out +STR_3348 :Rename +STR_3349 :Delete +STR_3350 :Track design name +STR_3351 :Enter new name for this track design: +STR_3352 :Can't rename track design... +STR_3353 :New name contains invalid characters +STR_3354 :Another file exists with this name, or file is write-protected +STR_3355 :File is write-protected or locked +STR_3356 :Delete File +STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ? +STR_3358 :Can't delete track design... +STR_3359 :{BLACK}No track designs of this type +STR_3360 :Warning! +STR_3361 :Too many track designs of this type - Some will not be listed. +STR_3362 : +STR_3363 : +STR_3364 :Advanced +STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups +STR_3366 :{BLACK}= Ride +STR_3367 :{BLACK}= Food Stall +STR_3368 :{BLACK}= Drink Stall +STR_3369 :{BLACK}= Souvenir Stall +STR_3370 :{BLACK}= Info. Kiosk +STR_3371 :{BLACK}= First Aid +STR_3372 :{BLACK}= Cash Machine +STR_3373 :{BLACK}= Toilet +STR_3374 :Warning: Too many objects selected! +STR_3375 :Not all objects in this scenery group could be selected +STR_3376 :Install new track design... +STR_3377 :{SMALLFONT}{BLACK}Install a new track design file +STR_3378 :Install +STR_3379 :Cancel +STR_3380 :Unable to install this track design... +STR_3381 :File is not compatible or contains invalid data +STR_3382 :File copy failed +STR_3383 :Select new name for track design +STR_3384 :An existing track design already has this name - Please select a new name for this design: +STR_3385 :Beginners Tutorial +STR_3386 :Custom Rides Tutorial +STR_3387 :Roller Coaster Building Tutorial +STR_3388 :Unable to switch to selected mode +STR_3389 :Unable to select additional item of scenery... +STR_3390 :Too many items selected +STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... +STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... +STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... +STR_3394 :{SMALLFONT}{BLACK}You can also rotate the view in 90 degree steps... +STR_3395 :{SMALLFONT}{BLACK}Building anything at this scale is a bit difficult, so let's zoom the view back in again... +STR_3396 :{SMALLFONT}{BLACK}Let's build a simple ride to get the park started... +STR_3397 :{SMALLFONT}{BLACK}The white 'ghost' image shows where the ride will be built. We'll move the pointer to select the position then click to build it... +STR_3398 :{SMALLFONT}{BLACK}Rides need an entrance and an exit. We'll move the pointer to a square on the edge of the ride and then click to build first the entrance and then the exit... +STR_3399 :{SMALLFONT}{BLACK}We need to build footpaths to allow guests to reach our new ride... +STR_3400 :{SMALLFONT}{BLACK}For the path to the ride entrance we'll use a special 'queue line' path... +STR_3401 :{SMALLFONT}{BLACK}For the exit path, just an 'ordinary' path will do... +STR_3402 :{SMALLFONT}{BLACK}Right, lets open the ride! To open the ride we click the flag icon on the ride window and select 'open'... +STR_3403 :{SMALLFONT}{BLACK}But where are the guests? +STR_3404 :{SMALLFONT}{BLACK}Oh - The park is still closed! Right - Let's open it... +STR_3405 :{SMALLFONT}{BLACK}While we're waiting for our first guests, let's build some scenery... +STR_3406 :{SMALLFONT}{BLACK}Here's our empty park. We're going to build a simple custom-designed ride... +STR_3407 :{SMALLFONT}{BLACK}First we need to choose a starting position... +STR_3408 :{SMALLFONT}{BLACK}The section of track we've just built is a 'station platform', to allow guests to get on and off the ride... +STR_3409 :{SMALLFONT}{BLACK}We'll extend the platform a bit by adding a couple more station platform sections... +STR_3410 :{SMALLFONT}{BLACK}The icons at the top of the construction window let you choose different track pieces to add... +STR_3411 :{SMALLFONT}{BLACK}We'll select a left-hand curve... +STR_3412 :{SMALLFONT}{BLACK}The curve hasn't been built yet, but the white ghost image shows where it will be built. Clicking the large 'build this' icon actually builds the track... +STR_3413 :{SMALLFONT}{BLACK}Now we want to build straight track, so we click the straight track icon... +STR_3414 :{SMALLFONT}{BLACK}Now that the circuit is complete, we need to build the ride entrance and exit... +STR_3415 :{SMALLFONT}{BLACK}Let's test our ride to check it works... +STR_3416 :{SMALLFONT}{BLACK}White it's being tested, we'll build the queue line and exit path... +STR_3417 :{SMALLFONT}{BLACK}OK - Let's open the park and the ride... +STR_3418 :{SMALLFONT}{BLACK}Our new ride isn't very exciting - Perhaps we should add some scenery? +STR_3419 :{SMALLFONT}{BLACK}To build scenery above other scenery or in mid-air, hold down the SHIFT key and move the mouse to select the height... +STR_3420 :{SMALLFONT}{BLACK}Some types of scenery can be re-painted after it's built... +STR_3421 :{SMALLFONT}{BLACK}Let's add some music to the ride... +STR_3422 :{SMALLFONT}{BLACK}Let's build a roller coaster ! +STR_3423 :{SMALLFONT}{BLACK}There are loads of pre-designed coasters, but we're going to build our own custom design... +STR_3424 :{SMALLFONT}{BLACK}That's the station platform built. Now we need a lift hill... +STR_3425 :{SMALLFONT}{BLACK}Roller coaster trains aren't powered, so a 'chain lift' is needed to pull the train up the first hill... +STR_3426 :{SMALLFONT}{BLACK}That's the lift hill complete - Now for the first drop... +STR_3427 :{SMALLFONT}{BLACK}Those curves are a bad idea - The riders will be flung to the sides by the lateral G forces as the train hurtles around... +STR_3428 :{SMALLFONT}{BLACK}Banking the curves will improve the ride - Riders will be pushed down into their seats instead of flung to the sides... +STR_3429 :{SMALLFONT}{BLACK}No - That won't work! Look at the height marks - The second hill is taller than the lift hill... +STR_3430 :{SMALLFONT}{BLACK}To ensure the train makes it around, each hill should be slightly smaller than the previous one... +STR_3431 :{SMALLFONT}{BLACK}That's better - Our train should make it up that hill now! Let's try some more twisted track... +STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve and station, so let's add some brakes... +STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow two trains to operate more safely on the circuit... +STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! +STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... +STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... +STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape +STR_3438 :Unable to remove all scenery from here... +STR_3439 :Clear Scenery +STR_3440 :Page 1 +STR_3441 :Page 2 +STR_3442 :Page 3 +STR_3443 :Page 4 +STR_3444 :Page 5 +STR_3445 :Set Patrol Area +STR_3446 :Cancel Patrol Area + +# New strings, cleaner +STR_5120 :Finances +STR_5121 :Research +STR_5122 :Select rides by track type (like in RCT1) +STR_5123 :Renew rides +STR_5124 : +STR_5125 :All destructable +STR_5126 :Random title music +STR_5127 :{SMALLFONT}{BLACK}Disable land elevation +STR_5128 :Selection size +STR_5129 :Enter selection size between {COMMA16} and {COMMA16} +STR_5130 :Map size +STR_5131 :Enter map size between {COMMA16} and {COMMA16} +STR_5132 :Fix all rides +STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights +STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights +STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights +STR_5136 :Land rights +STR_5137 :Allow lift hill and launch speeds{NEWLINE}up to {VELOCITY} +STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} +STR_5139 :{WHITE}{STRINGID} +STR_5140 :Disable brakes failure +STR_5141 :Disable all breakdowns +STR_5142 :Normal Speed +STR_5143 :Quick Speed +STR_5144 :Fast Speed +STR_5145 :Turbo Speed +STR_5146 :Hyper Speed +STR_5147 :Cheats +STR_5148 :{SMALLFONT}{BLACK}Change the game speed +STR_5149 :{SMALLFONT}{BLACK}Open the cheats window +STR_5150 :Enable debugging tools +STR_5151 :, +STR_5152 :. +STR_5153 :Edit Themes... +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 +STR_5157 :Unlock all prices +STR_5158 :Quit to menu +STR_5159 :Exit OpenRCT2 +STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} +STR_5161 :Date Format: +STR_5162 :Day/Month/Year +STR_5163 :Month/Day/Year +STR_5164 :Twitch Channel name +STR_5165 :Name peeps after followers +STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers +STR_5167 :Track follower peeps +STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after channel's Twitch followers +STR_5169 :Name peeps after people in Twitch chat +STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat +STR_5171 :Track chat peeps +STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after Twitch chat participants +STR_5173 :Pull Twitch chat as news +STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications +STR_5175 :Input the name of your Twitch channel +STR_5176 :Enable Twitch integration +STR_5177 :Fullscreen mode: +STR_5178 :{SMALLFONT}{BLACK}Show financial cheats +STR_5179 :{SMALLFONT}{BLACK}Show guest cheats +STR_5180 :{SMALLFONT}{BLACK}Show park cheats +STR_5181 :{SMALLFONT}{BLACK}Show ride cheats +STR_5182 :{INT32} +STR_5183 :Base height +STR_5184 :Enter base height between {COMMA16} and {COMMA16} +STR_5185 :Water level +STR_5186 :Enter water level between {COMMA16} and {COMMA16} +STR_5187 :Finances +STR_5188 :New Campaign +STR_5189 :Research +STR_5190 :Map +STR_5191 :Viewport +STR_5192 :Recent News +STR_5193 :Land +STR_5194 :Water +STR_5195 :Clear Scenery +STR_5196 :Land Rights +STR_5197 :Scenery +STR_5198 :Footpath +STR_5199 :Ride Construction +STR_5200 :Track Design Place +STR_5201 :New Ride +STR_5202 :Track Design Selection +STR_5203 :Ride +STR_5204 :Ride List +STR_5205 :Guest +STR_5206 :Guest List +STR_5207 :Staff +STR_5208 :Staff List +STR_5209 :Banner +STR_5210 :Object Selection +STR_5211 :Invention List +STR_5212 :Scenario Options +STR_5213 :Objective Options +STR_5214 :Map Generation +STR_5215 :Track Design Manager +STR_5216 :Track Design Manager List +STR_5217 :Cheats +STR_5218 :Themes +STR_5219 :Options +STR_5220 :Keyboard Shortcuts +STR_5221 :Change Keyboard Shortcut +STR_5222 :Load/Save +STR_5223 :Save Prompt +STR_5224 :Demolish Ride Prompt +STR_5225 :Fire Staff Prompt +STR_5226 :Track Delete Prompt +STR_5227 :Save Overwrite Prompt +STR_5228 :{SMALLFONT}{BLACK}Main UI +STR_5229 :{SMALLFONT}{BLACK}Park +STR_5230 :{SMALLFONT}{BLACK}Tools +STR_5231 :{SMALLFONT}{BLACK}Rides and Peeps +STR_5232 :{SMALLFONT}{BLACK}Editors +STR_5233 :{SMALLFONT}{BLACK}Miscellaneous +STR_5234 :{SMALLFONT}{BLACK}Prompts +STR_5235 :{SMALLFONT}{BLACK}Settings +STR_5236 :Window: +STR_5237 :Palette: +STR_5238 :Current Theme: +STR_5239 :Duplicate +STR_5240 :Enter a name for the theme +STR_5241 :Can't change this theme +STR_5242 :Theme name already exists +STR_5243 :Invalid characters used +STR_5244 :Themes +STR_5245 :Top Toolbar +STR_5246 :Bottom Toolbar +STR_5247 :Track Editor Bottom Toolbar +STR_5248 :Scenario Editor Bottom Toolbar +STR_5249 :Title Menu Buttons +STR_5250 :Title Exit Button +STR_5251 :Title Options Button +STR_5252 :Title Scenario Selection +STR_5253 :Park Information +STR_5254 :Create +STR_5255 :{SMALLFONT}{BLACK}Create a new title sequence from scratch +STR_5256 :Create a new theme to make changes to +STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one +STR_5258 :{SMALLFONT}{BLACK}Delete the current theme +STR_5259 :{SMALLFONT}{BLACK}Rename the current theme +STR_5260 :Giant Screenshot +STR_5261 :Filter +STR_5262 :Wacky Worlds +STR_5263 :Time Twister +STR_5264 :Custom +STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible +STR_5266 :{SMALLFONT}{BLACK}Display +STR_5267 :{SMALLFONT}{BLACK}Culture and Units +STR_5268 :{SMALLFONT}{BLACK}Audio +STR_5269 :{SMALLFONT}{BLACK}Controls and interface +STR_5270 :{SMALLFONT}{BLACK}Miscellaneous +STR_5271 :{SMALLFONT}{BLACK}Twitch +STR_5272 :{SMALLFONT}{BLACK}Small Scenery +STR_5273 :{SMALLFONT}{BLACK}Large Scenery +STR_5274 :{SMALLFONT}{BLACK}Footpath +STR_5275 :Search for Objects +STR_5276 :Enter the name of an object to search for +STR_5277 :Clear +STR_5278 :Sandbox mode +STR_5279 :Sandbox mode off +STR_5280 :{SMALLFONT}{BLACK}Allow editing land ownership settings through the Map window and other options that are normally restricted to the Scenario Editor +STR_5281 :{SMALLFONT}{BLACK}Features +STR_5282 :RCT1 Ride Open/Close Lights +STR_5283 :RCT1 Park Open/Close Lights +STR_5284 :RCT1 Scenario Selection Font +STR_5285 :EXPLODE!!! +STR_5286 :{SMALLFONT}{BLACK}Makes some guests explode +STR_5287 :Ride is already broken down +STR_5288 :Ride is closed +STR_5289 :No breakdowns available for this ride +STR_5290 :Fix ride +STR_5291 :Can't force breakdown +STR_5292 :{SMALLFONT}{BLACK}Force a breakdown +STR_5293 :{SMALLFONT}{BLACK}Close ride/attraction +STR_5294 :{SMALLFONT}{BLACK}Test ride/attraction +STR_5295 :{SMALLFONT}{BLACK}Open ride/attraction +STR_5296 :{SMALLFONT}{BLACK}Close park +STR_5297 :{SMALLFONT}{BLACK}Open park +STR_5298 :{RED}{STRINGID} +STR_5299 :{LIGHTPINK}{STRINGID} +STR_5300 :{SMALLFONT}{BLACK}Quick fire staff +STR_5301 :{MEDIUMFONT}{BLACK}Clear your loan +STR_5302 :Clear loan +STR_5303 :Allow building in pause mode +STR_5304 :Title Sequence: +STR_5305 :RollerCoaster Tycoon 1 +STR_5306 :RollerCoaster Tycoon 1 (AA) +STR_5307 :RollerCoaster Tycoon 1 (AA + LL) +STR_5308 :RollerCoaster Tycoon 2 +STR_5309 :OpenRCT2 +STR_5310 :Random +STR_5311 :{SMALLFONT}{BLACK}Debug tools +STR_5312 :Show console +STR_5313 :Show tile inspector +STR_5314 :Tile inspector +STR_5315 :Grass +STR_5316 :Sand +STR_5317 :Dirt +STR_5318 :Rock +STR_5319 :Martian +STR_5320 :Checkerboard +STR_5321 :Grass clumps +STR_5322 :Ice +STR_5323 :Grid (red) +STR_5324 :Grid (yellow) +STR_5325 :Grid (blue) +STR_5326 :Grid (green) +STR_5327 :Sand (dark) +STR_5328 :Sand (light) +STR_5329 :Checkerboard (inverted) +STR_5330 :Underground view +STR_5331 :Rock +STR_5332 :Wood (red) +STR_5333 :Wood (black) +STR_5334 :Ice +STR_5335 :Ride entrance +STR_5336 :Ride exit +STR_5337 :Park entrance +STR_5338 :Element type +STR_5339 :Base height +STR_5340 :Clearance height +STR_5341 :Flags +STR_5342 :Choose a map tile +STR_5343 :Automatically place staff +STR_5344 :Changelog +STR_5345 :Financial cheats +STR_5346 :Guest cheats +STR_5347 :Park cheats +STR_5348 :Ride cheats +STR_5349 :{SMALLFONT}{BLACK}All Rides +STR_5350 :Max +STR_5351 :Min +STR_5352 :{BLACK}Happiness: +STR_5353 :{BLACK}Energy: +STR_5354 :{BLACK}Hunger: +STR_5355 :{BLACK}Thirst: +STR_5356 :{BLACK}Nausea: +STR_5357 :{BLACK}Nausea tolerance: +STR_5358 :{BLACK}Bathroom: +STR_5359 :Remove guests +STR_5360 :{SMALLFONT}{BLACK}Removes all guests from the map +STR_5361 :Give all guests: +STR_5362 :{BLACK}Set all guests' preferred ride intensity to: +STR_5363 :More than 1 +STR_5364 :Less than 15 +STR_5365 :{BLACK}Staff speed: +STR_5366 :Normal +STR_5367 :Fast +STR_5368 :Reset crash status +STR_5369 :Park parameters... +STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. +STR_5371 :Object Selection +STR_5372 :Invert right mouse dragging +STR_5373 :Name {STRINGID} +STR_5374 :Date {STRINGID} +STR_5375 :{UP} +STR_5376 :{DOWN} +STR_5377 :{SMALLFONT}{BLACK}Saves +STR_5378 :{SMALLFONT}{BLACK}Script +STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command +STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence +STR_5381 :{SMALLFONT}{BLACK}Stop playing title sequence +STR_5382 :{SMALLFONT}{BLACK}Restart title sequence +STR_5383 :{SMALLFONT}{BLACK}Create a new title sequence based on the current one +STR_5384 :{SMALLFONT}{BLACK}Delete the current title sequence +STR_5385 :{SMALLFONT}{BLACK}Rename the current title sequence +STR_5386 :{SMALLFONT}{BLACK}Insert a new command +STR_5387 :{SMALLFONT}{BLACK}Edit the selected command +STR_5388 :{SMALLFONT}{BLACK}Delete the selected command +STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence +STR_5390 :{SMALLFONT}{BLACK}Move the selected command down +STR_5391 :{SMALLFONT}{BLACK}Move the selected command up +STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence +STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence +STR_5394 :{SMALLFONT}{BLACK}Rename the selected save +STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game +STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game +STR_5397 :Can only be used on the title screen +STR_5398 :Cannot edit title sequence while it's playing +STR_5399 :Press the stop button to continue editing +STR_5400 :Can't change this title sequence +STR_5401 :Create a new title sequence to make changes to +STR_5402 :Failed to load title sequence +STR_5403 :There may be no Load or Wait command or a save may be invalid +STR_5404 :Name already exists +STR_5405 :Enter a name for the save +STR_5406 :Enter a name for the title sequence +STR_5407 :Add +STR_5408 :Remove +STR_5409 :Insert +STR_5410 :Edit +STR_5411 :Reload +STR_5412 :Skip to +STR_5413 :Load +STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :Load{MOVE_X}{87}{STRING} +STR_5416 :Load{MOVE_X}{87}No save selected +STR_5417 :Location +STR_5418 :Location{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :Rotate +STR_5420 :Rotate{MOVE_X}{87}{COMMA16} +STR_5421 :Zoom +STR_5422 :Zoom{MOVE_X}{87}{COMMA16} +STR_5423 :Wait +STR_5424 :Wait{MOVE_X}{87}{COMMA16} +STR_5425 :Restart +STR_5426 :End +STR_5427 :Coordinates: +STR_5428 :Anticlockwise rotations: +STR_5429 :Zoom level: +STR_5430 :Seconds to wait: +STR_5431 :Save to load: +STR_5432 :Command: +STR_5433 :Title Sequences +STR_5434 :Command Editor +STR_5435 :Rename save +STR_5436 :Edit Title Sequences... +STR_5437 :No save selected +STR_5438 :Can't make changes while command editor is open +STR_5439 :A wait command with at least 4 seconds is required with a restart command +STR_5440 :Minimise fullscreen on focus loss +STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. +STR_5442 :Force park rating: +STR_5443 :Speed{MOVE_X}{87}{STRINGID} +STR_5444 :Speed: +STR_5445 :Speed +STR_5446 :Get +STR_5447 :Type {STRINGID} +STR_5448 :Ride / Vehicle {STRINGID} +STR_5449 :Reduce game speed +STR_5450 :Increase game speed +STR_5451 :Open cheats window +STR_5452 :Toggle visibility of toolbars +STR_5453 :Select another ride +STR_5454 :Uncap FPS +STR_5455 :Enable sandbox mode +STR_5456 :Disable clearance checks +STR_5457 :Disable support limits +STR_5458 :Rotate clockwise +STR_5459 :Rotate anti-clockwise +STR_5460 :Rotate view anti-clockwise +STR_5461 :Set guests' parameters +STR_5462 :{CURRENCY} +STR_5463 :Goal: Have fun! +STR_5464 :General +STR_5465 :Climate +STR_5466 :Staff +STR_5467 :ALT + +STR_5468 :Recent messages +STR_5469 :Scroll map up +STR_5470 :Scroll map left +STR_5471 :Scroll map down +STR_5472 :Scroll map right +STR_5473 :Cycle day / night +STR_5474 :Display text on banners in upper case +STR_5475 :{COMMA16} weeks +STR_5476 :Hardware +STR_5477 :Map rendering +STR_5478 :Controls +STR_5479 :Toolbar +STR_5480 :Show toolbar buttons for: +STR_5481 :Themes +STR_5482 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}1 minute +STR_5483 :{BLACK}({COMMA16} weeks remaining) +STR_5484 :{BLACK}({COMMA16} week remaining) diff --git a/data/language/italian.txt b/data/language/italian.txt index f35da40480..fe4a176845 100644 --- a/data/language/italian.txt +++ b/data/language/italian.txt @@ -2783,7 +2783,7 @@ STR_2777 :{MOVE_X}{SMALLFONT}{STRING} STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} STR_2779 :Viewport #{COMMA16} STR_2780 :Extra viewport -STR_2781 :{STRINGID}:{MOVE_X}Ã{STRINGID}{STRINGID} +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :Modifica la scorciatoia From d10f5c8f0645315aef8c7590b78eda4c708a7886 Mon Sep 17 00:00:00 2001 From: LRFLEW Date: Sun, 9 Aug 2015 18:41:57 -0500 Subject: [PATCH 0465/1173] Added tracked guests filter --- data/language/english_uk.txt | 1 + src/localisation/string_ids.h | 2 ++ src/windows/guest_list.c | 25 +++++++++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 7379bdb088..05125c5d16 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3825,3 +3825,4 @@ STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}Show recent messages STR_5488 :No entrance +STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 7b3e0f9b0b..f1351da221 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2023,6 +2023,8 @@ enum { STR_ENTRANCE_NONE = 5488, + STR_TRACKED_GUESTS_ONLY_TIP = 5489, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/guest_list.c b/src/windows/guest_list.c index 8c40b24962..0dabce2b8e 100644 --- a/src/windows/guest_list.c +++ b/src/windows/guest_list.c @@ -46,6 +46,7 @@ enum WINDOW_GUEST_LIST_WIDGET_IDX { WIDX_INFO_TYPE_DROPDOWN, WIDX_INFO_TYPE_DROPDOWN_BUTTON, WIDX_MAP, + WIDX_TRACKING, WIDX_TAB_1, WIDX_TAB_2, WIDX_GUEST_LIST @@ -66,6 +67,7 @@ static rct_widget window_guest_list_widgets[] = { { WWT_DROPDOWN, 1, 126, 301, 59, 70, 0x0FFFFFFFF, STR_INFORMATION_TYPE_TIP }, // information type dropdown { WWT_DROPDOWN_BUTTON, 1, 290, 300, 60, 69, 876, STR_INFORMATION_TYPE_TIP }, // information type dropdown button { WWT_FLATBTN, 1, 321, 344, 46, 69, 5192, STR_SHOW_GUESTS_ON_MAP_TIP }, // map + { WWT_FLATBTN, 1, 321, 344, 46, 69, SPR_TRACK_PEEP, STR_TRACKED_GUESTS_ONLY_TIP }, // tracking { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, STR_INDIVIDUAL_GUESTS_TIP }, // tab 1 { WWT_TAB, 1, 34, 64, 17, 43, 0x02000144E, STR_SUMMARISED_GUESTS_TIP }, // tab 2 { WWT_SCROLL, 1, 3, 346, 72, 326, 3, STR_NONE }, // guest list @@ -123,6 +125,7 @@ static int _window_guest_list_selected_page; // 0x00F1EE07 static int _window_guest_list_selected_view; // 0x00F1EE13 static int _window_guest_list_num_pages; // 0x00F1EE08 static int _window_guest_list_num_groups; // 0x00F1AF22 +static bool _window_guest_list_tracking_only; static uint16 _window_guest_list_groups_num_guests[240]; static uint32 _window_guest_list_groups_argument_1[240]; @@ -156,6 +159,7 @@ void window_guest_list_open() (1 << WIDX_INFO_TYPE_DROPDOWN) | (1 << WIDX_INFO_TYPE_DROPDOWN_BUTTON) | (1 << WIDX_MAP) | + (1 << WIDX_TRACKING) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2); @@ -166,6 +170,7 @@ void window_guest_list_open() _window_guest_list_selected_filter = -1; _window_guest_list_selected_page = 0; _window_guest_list_num_pages = 1; + _window_guest_list_tracking_only = false; window_guest_list_widgets[WIDX_PAGE_DROPDOWN].type = WWT_EMPTY; window_guest_list_widgets[WIDX_PAGE_DROPDOWN_BUTTON].type = WWT_EMPTY; window->var_492 = 0; @@ -193,6 +198,7 @@ void window_guest_list_open_with_filter(int type, int index) _window_guest_list_selected_page = 0; _window_guest_list_num_pages = 1; + _window_guest_list_tracking_only = false; RCT2_GLOBAL(0x009AC7E0, uint8) = 0; RCT2_GLOBAL(0x009AC7F0, uint8) = 0; @@ -273,6 +279,15 @@ static void window_guest_list_mouseup(rct_window *w, int widgetIndex) case WIDX_MAP: window_map_open(); break; + case WIDX_TRACKING: + _window_guest_list_tracking_only = !_window_guest_list_tracking_only; + if (_window_guest_list_tracking_only) + w->pressed_widgets |= (1 << WIDX_TRACKING); + else + w->pressed_widgets &= ~(1 << WIDX_TRACKING); + window_invalidate(w); + w->scrolls[0].v_top = 0; + break; } } @@ -310,6 +325,9 @@ static void window_guest_list_mousedown(int widgetIndex, rct_window*w, rct_widge _window_guest_list_selected_tab = widgetIndex - WIDX_TAB_1; _window_guest_list_selected_page = 0; _window_guest_list_num_pages = 1; + window_guest_list_widgets[WIDX_TRACKING].type = WWT_EMPTY; + if (_window_guest_list_selected_tab == PAGE_INDIVIDUAL) + window_guest_list_widgets[WIDX_TRACKING].type = WWT_FLATBTN; window_guest_list_widgets[WIDX_PAGE_DROPDOWN].type = WWT_EMPTY; window_guest_list_widgets[WIDX_PAGE_DROPDOWN_BUTTON].type = WWT_EMPTY; w->list_information_type = 0; @@ -415,6 +433,8 @@ static void window_guest_list_scrollgetsize(rct_window *w, int scrollIndex, int if (_window_guest_list_selected_filter != -1) if (window_guest_list_is_peep_in_filter(peep)) continue; + if (_window_guest_list_tracking_only && !(peep->flags & PEEP_FLAGS_TRACKING)) + continue; numGuests++; } w->var_492 = numGuests; @@ -472,6 +492,8 @@ static void window_guest_list_scrollmousedown(rct_window *w, int scrollIndex, in if (_window_guest_list_selected_filter != -1) if (window_guest_list_is_peep_in_filter(peep)) continue; + if (_window_guest_list_tracking_only && !(peep->flags & PEEP_FLAGS_TRACKING)) + continue; if (i == 0) { // Open guest window @@ -490,6 +512,7 @@ static void window_guest_list_scrollmousedown(rct_window *w, int scrollIndex, in RCT2_GLOBAL(0x00F1EDFA, uint32) = _window_guest_list_groups_argument_2[i]; _window_guest_list_selected_filter = _window_guest_list_selected_view; _window_guest_list_selected_tab = PAGE_INDIVIDUAL; + window_guest_list_widgets[WIDX_TRACKING].type = WWT_FLATBTN; window_invalidate(w); w->scrolls[0].v_top = 0; } @@ -638,6 +661,8 @@ static void window_guest_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) |= (1 << 0); peep->var_0C |= 0x200; } + if (_window_guest_list_tracking_only && !(peep->flags & PEEP_FLAGS_TRACKING)) + continue; // if (y + 11 >= -0x7FFF && y + 11 > dpi->y && y < 0x7FFF) { From de3f558f495e488fe1061867066ee137dc42982a Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 10 Aug 2015 13:25:26 +0200 Subject: [PATCH 0466/1173] Enable optimisations in Linux build --- CMakeLists_mingw.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists_mingw.txt b/CMakeLists_mingw.txt index 580a84235f..b694795580 100644 --- a/CMakeLists_mingw.txt +++ b/CMakeLists_mingw.txt @@ -13,7 +13,7 @@ SET(PKG_CONFIG_EXECUTABLE ${COMPILER_PREFIX}-pkg-config) set(CMAKE_C_FLAGS "-masm=intel -std=gnu99 -fpack-struct=1" CACHE STRING "" FORCE) set(CMAKE_CXX_FLAGS "-masm=intel -std=c++0x -std=gnu++0x -fpack-struct=1" CACHE STRING "" FORCE) if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") - set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static -lpthread" CACHE STRING "" FORCE) + set(CMAKE_SHARED_LINKER_FLAGS "-O3 -static-libgcc -static-libstdc++ -static -lpthread" CACHE STRING "" FORCE) else() set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++" CACHE STRING "" FORCE) endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") From b7f037fe60d368de3925bf3bde8563353ee26487 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 10 Aug 2015 12:31:39 +0100 Subject: [PATCH 0467/1173] use TTFFontSimSun for Chinese (Simplified) and fix config value reading --- src/config.c | 5 +++-- src/localisation/language.c | 13 ++++++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/config.c b/src/config.c index 78cfd15c70..5ae5a27555 100644 --- a/src/config.c +++ b/src/config.c @@ -524,7 +524,8 @@ bool config_get_property_name_value(const utf8string line, utf8 **propertyName, } lastC = c; } - *valueSize = ch - *value - 1; + *valueSize = ch - *value; + if (quotes) (*valueSize)--; return true; } @@ -632,7 +633,7 @@ static void config_read_properties(config_section_definition **currentSection, c static bool config_read_enum(void *dest, int destSize, const utf8 *key, int keySize, config_enum_definition *enumDefinitions) { while (enumDefinitions->key != NULL) { - if (_strnicmp(enumDefinitions->key, key, keySize) == 0) { + if (strlen(enumDefinitions->key) == keySize && _strnicmp(enumDefinitions->key, key, keySize) == 0) { memcpy(dest, &enumDefinitions->value.value_uint32, destSize); return true; } diff --git a/src/localisation/language.c b/src/localisation/language.c index c3a45bb528..eec31cb815 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -51,13 +51,20 @@ enum { RCT2_LANGUAGE_ID_END = 255 }; -static TTFFontSetDescriptor TTFFontMingliu = {{ +static TTFFontSetDescriptor TTFFontMingLiu = {{ { "msjh.ttc", 9, -1, -3, 6, NULL }, { "mingliu.ttc", 11, 1, 1, 12, NULL }, { "mingliu.ttc", 12, 1, 0, 12, NULL }, { "mingliu.ttc", 13, 1, 0, 20, NULL }, }}; +static TTFFontSetDescriptor TTFFontSimSun = {{ + { "msyh.ttc", 9, -1, -3, 6, NULL }, + { "simsun.ttc", 11, 1, -1, 14, NULL }, + { "simsun.ttc", 12, 1, -2, 14, NULL }, + { "simsun.ttc", 13, 1, 0, 20, NULL }, +}}; + const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "", "", "", "", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_UNDEFINED { "en-GB", "English (UK)", "English (UK)", "english_uk", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_ENGLISH_UK @@ -71,8 +78,8 @@ const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "sv-SE", "Swedish", "Svenska", "swedish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_SWEDISH }, // LANGUAGE_SWEDISH { "it-IT", "Italian", "Italiano", "italian", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ITALIAN }, // LANGUAGE_ITALIAN { "pt-BR", "Portuguese (BR)", "Portug\xC3\xAAs (BR)", "portuguese_br", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_PORTUGESE }, // LANGUAGE_PORTUGUESE_BR - { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", &TTFFontMingliu, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL - { "zh-Hans", "Chinese (Simplified)", "Chinese (Simplified)", "chinese_simplified", &TTFFontMingliu, RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED }, // LANGUAGE_CHINESE_SIMPLIFIED + { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", &TTFFontMingLiu, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL + { "zh-Hans", "Chinese (Simplified)", "Chinese (Simplified)", "chinese_simplified", &TTFFontSimSun, RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED }, // LANGUAGE_CHINESE_SIMPLIFIED { "fi-FI", "Finnish", "Suomi", "finnish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_FINNISH // { "kr-KR", "Korean", "Korean", "english_uk", "malgun.ttf", RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN }; From b2bb862f75920c24d7c6a67ba3f56928eb11f651 Mon Sep 17 00:00:00 2001 From: LRFLEW Date: Mon, 10 Aug 2015 11:01:35 -0500 Subject: [PATCH 0468/1173] Fix #1756 --- src/windows/guest_list.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/windows/guest_list.c b/src/windows/guest_list.c index 0dabce2b8e..63cb9d2a97 100644 --- a/src/windows/guest_list.c +++ b/src/windows/guest_list.c @@ -64,9 +64,9 @@ static rct_widget window_guest_list_widgets[] = { { WWT_RESIZE, 1, 0, 349, 43, 329, 0x0FFFFFFFF, STR_NONE }, // tab content panel { WWT_DROPDOWN, 1, 5, 84, 59, 70, STR_PAGE_1, STR_NONE }, // page dropdown { WWT_DROPDOWN_BUTTON, 1, 73, 83, 60, 69, 876, STR_NONE }, // page dropdown button - { WWT_DROPDOWN, 1, 126, 301, 59, 70, 0x0FFFFFFFF, STR_INFORMATION_TYPE_TIP }, // information type dropdown - { WWT_DROPDOWN_BUTTON, 1, 290, 300, 60, 69, 876, STR_INFORMATION_TYPE_TIP }, // information type dropdown button - { WWT_FLATBTN, 1, 321, 344, 46, 69, 5192, STR_SHOW_GUESTS_ON_MAP_TIP }, // map + { WWT_DROPDOWN, 1, 120, 295, 59, 70, 0x0FFFFFFFF, STR_INFORMATION_TYPE_TIP }, // information type dropdown + { WWT_DROPDOWN_BUTTON, 1, 284, 294, 60, 69, 876, STR_INFORMATION_TYPE_TIP }, // information type dropdown button + { WWT_FLATBTN, 1, 297, 320, 46, 69, 5192, STR_SHOW_GUESTS_ON_MAP_TIP }, // map { WWT_FLATBTN, 1, 321, 344, 46, 69, SPR_TRACK_PEEP, STR_TRACKED_GUESTS_ONLY_TIP }, // tracking { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, STR_INDIVIDUAL_GUESTS_TIP }, // tab 1 { WWT_TAB, 1, 34, 64, 17, 43, 0x02000144E, STR_SUMMARISED_GUESTS_TIP }, // tab 2 From 72f3d1ace3d8c07d84d46df750bd79fd9d448aab Mon Sep 17 00:00:00 2001 From: medsouz Date: Mon, 10 Aug 2015 18:15:31 -0400 Subject: [PATCH 0469/1173] Fix scrollbar integer overflow Fixes #1752 --- src/input.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/input.c b/src/input.c index 7a816fe9a3..792ccbbab7 100644 --- a/src/input.c +++ b/src/input.c @@ -693,9 +693,10 @@ static void input_scroll_part_update_hleft(rct_window *w, int widgetIndex, int s { if (window_find_by_number(w->classification, w->number)) { w->scrolls[scroll_id].flags |= HSCROLLBAR_LEFT_PRESSED; - w->scrolls[scroll_id].h_left -= 3; if (w->scrolls[scroll_id].h_left < 0) w->scrolls[scroll_id].h_left = 0; + else if (w->scrolls[scroll_id].h_left >= 3) + w->scrolls[scroll_id].h_left -= 3; widget_scroll_update_thumbs(w, widgetIndex); widget_invalidate_by_number(w->classification, w->number, widgetIndex); } @@ -733,9 +734,10 @@ static void input_scroll_part_update_vtop(rct_window *w, int widgetIndex, int sc {; if (window_find_by_number(w->classification, w->number)) { w->scrolls[scroll_id].flags |= VSCROLLBAR_UP_PRESSED; - w->scrolls[scroll_id].v_top -= 3; if (w->scrolls[scroll_id].v_top < 0) w->scrolls[scroll_id].v_top = 0; + else if (w->scrolls[scroll_id].v_top >= 3) + w->scrolls[scroll_id].v_top -= 3; widget_scroll_update_thumbs(w, widgetIndex); widget_invalidate_by_number(w->classification, w->number, widgetIndex); } From 3ce6d7020bc054d440e40dd0eccc795fa6babcb2 Mon Sep 17 00:00:00 2001 From: medsouz Date: Tue, 11 Aug 2015 00:42:18 -0400 Subject: [PATCH 0470/1173] Pause audio when tabbing out TODO: Figure out why title music and toilet sounds are still playing Add an option to disable this feature so that people can jam out to the carousel music while tabbed out. --- src/platform/shared.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/platform/shared.c b/src/platform/shared.c index cb5dadf239..3ccc5c0825 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "../addresses.h" +#include "../audio/audio.h" #include "../config.h" #include "../cursors.h" #include "../drawing/drawing.h" @@ -351,6 +352,16 @@ void platform_process_messages() case SDL_WINDOWEVENT: if (e.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) platform_resize(e.window.data1, e.window.data2); + if (e.window.event == SDL_WINDOWEVENT_FOCUS_GAINED) { + if (gConfigSound.sound) { + unpause_sounds(); + } + } + if (e.window.event == SDL_WINDOWEVENT_FOCUS_LOST) { + if (gConfigSound.sound) { + pause_sounds(); + } + } break; case SDL_MOUSEMOTION: RCT2_GLOBAL(0x0142406C, int) = e.motion.x; From 6caa48d3c3a9d26bf2a8216050bcb844b6373102 Mon Sep 17 00:00:00 2001 From: medsouz Date: Tue, 11 Aug 2015 06:29:21 -0400 Subject: [PATCH 0471/1173] Make all game sounds respect gGameSoundsOff --- src/audio/audio.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 1c8779ad40..6b265acedf 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -1423,7 +1423,7 @@ int get_dsound_devices() int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z) { int result = 0; - if (gConfigSound.sound) { + if (!gGameSoundsOff) { RCT2_GLOBAL(0x00F438AD, uint8) = 0; int volume = 0; if (ebx == 0x8001) { @@ -1557,7 +1557,7 @@ void start_title_music() break; } - if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0)) && gConfigSound.sound + if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0)) && !gGameSoundsOff && RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) { if (!RCT2_GLOBAL(0x009AF600, uint8)) { #ifdef USE_MIXER From db9ea4cdf3b11b2a2447d58b86fa9bd45eca9642 Mon Sep 17 00:00:00 2001 From: medsouz Date: Tue, 11 Aug 2015 07:06:00 -0400 Subject: [PATCH 0472/1173] Added toggle for audio disable on focus lost This closes #1758 --- data/language/english_us.txt | 1 + src/config.c | 3 ++- src/config.h | 1 + src/localisation/string_ids.h | 2 ++ src/platform/shared.c | 8 +++----- src/windows/options.c | 26 ++++++++++++++++++-------- 6 files changed, 27 insertions(+), 14 deletions(-) diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 1d2ceb24f3..81cc076e75 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3830,3 +3830,4 @@ STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}Show recent messages STR_5488 :No entrance +STR_5490 :Disable audio on focus loss diff --git a/src/config.c b/src/config.c index 5ae5a27555..f5186b7d30 100644 --- a/src/config.c +++ b/src/config.c @@ -206,7 +206,8 @@ config_property_definition _interfaceDefinitions[] = { config_property_definition _soundDefinitions[] = { { offsetof(sound_configuration, title_music), "title_music", CONFIG_VALUE_TYPE_UINT8, 2, NULL }, { offsetof(sound_configuration, sound), "sound", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, - { offsetof(sound_configuration, ride_music), "ride_music", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, + { offsetof(sound_configuration, ride_music), "ride_music", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(sound_configuration, audio_focus), "audio_focus", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, { offsetof(sound_configuration, master_volume), "master_volume", CONFIG_VALUE_TYPE_UINT8, 100, NULL }, { offsetof(sound_configuration, music_volume), "music_volume", CONFIG_VALUE_TYPE_UINT8, 100, NULL }, { offsetof(sound_configuration, device), "audio_device", CONFIG_VALUE_TYPE_STRING, { .value_string = NULL }, NULL }, diff --git a/src/config.h b/src/config.h index a4c5993f67..5678b3f444 100644 --- a/src/config.h +++ b/src/config.h @@ -180,6 +180,7 @@ typedef struct { uint8 title_music; uint8 sound; uint8 ride_music; + uint8 audio_focus; uint8 master_volume; uint8 music_volume; utf8string device; diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index f1351da221..942ccc6b97 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2025,6 +2025,8 @@ enum { STR_TRACKED_GUESTS_ONLY_TIP = 5489, + STR_AUDIO_FOCUS = 5490, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/platform/shared.c b/src/platform/shared.c index 3ccc5c0825..75e9efe81c 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -352,13 +352,11 @@ void platform_process_messages() case SDL_WINDOWEVENT: if (e.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) platform_resize(e.window.data1, e.window.data2); - if (e.window.event == SDL_WINDOWEVENT_FOCUS_GAINED) { - if (gConfigSound.sound) { + if (gConfigSound.audio_focus && gConfigSound.sound) { + if (e.window.event == SDL_WINDOWEVENT_FOCUS_GAINED) { unpause_sounds(); } - } - if (e.window.event == SDL_WINDOWEVENT_FOCUS_LOST) { - if (gConfigSound.sound) { + if (e.window.event == SDL_WINDOWEVENT_FOCUS_LOST) { pause_sounds(); } } diff --git a/src/windows/options.c b/src/windows/options.c index e2f1229606..fc62925905 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -105,6 +105,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_SOUND_DROPDOWN, WIDX_SOUND_CHECKBOX, WIDX_MUSIC_CHECKBOX, + WIDX_AUDIO_FOCUS_CHECKBOX, WIDX_TITLE_MUSIC, WIDX_TITLE_MUSIC_DROPDOWN, WIDX_MASTER_VOLUME, @@ -202,14 +203,15 @@ static rct_widget window_options_culture_widgets[] = { static rct_widget window_options_audio_widgets[] = { MAIN_OPTIONS_WIDGETS, - { WWT_DROPDOWN, 1, 10, 299, 53, 64, 865, STR_NONE }, // audio device - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 54, 63, 876, STR_NONE }, - { WWT_CHECKBOX, 1, 10, 229, 69, 80, STR_SOUND, STR_NONE }, // enable / disable sound - { WWT_CHECKBOX, 1, 10, 229, 84, 95, STR_MUSIC, STR_NONE }, // enable / disable music - { WWT_DROPDOWN, 1, 155, 299, 98, 109, STR_NONE, STR_NONE }, // title music - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 99, 108, 876, STR_NONE }, - { WWT_SCROLL, 1, 155, 299, 68, 80, 1, STR_NONE }, // master volume - { WWT_SCROLL, 1, 155, 299, 83, 95, 1, STR_NONE }, // music volume + { WWT_DROPDOWN, 1, 10, 299, 53, 64, 865, STR_NONE }, // audio device + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 54, 63, 876, STR_NONE }, + { WWT_CHECKBOX, 1, 10, 229, 69, 80, STR_SOUND, STR_NONE }, // enable / disable sound + { WWT_CHECKBOX, 1, 10, 229, 84, 95, STR_MUSIC, STR_NONE }, // enable / disable music + { WWT_CHECKBOX, 1, 10, 229, 98, 110, STR_AUDIO_FOCUS, STR_NONE }, // enable / disable audio disabled on focus lost + { WWT_DROPDOWN, 1, 155, 299, 112, 124, STR_NONE, STR_NONE }, // title music + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 113, 123, 876, STR_NONE }, + { WWT_SCROLL, 1, 155, 299, 68, 80, 1, STR_NONE }, // master volume + { WWT_SCROLL, 1, 155, 299, 83, 95, 1, STR_NONE }, // music volume { WIDGETS_END }, }; @@ -372,6 +374,7 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_SOUND_DROPDOWN) | (1 << WIDX_SOUND_CHECKBOX) | (1 << WIDX_MUSIC_CHECKBOX) | + (1 << WIDX_AUDIO_FOCUS_CHECKBOX) | (1 << WIDX_TITLE_MUSIC) | (1 << WIDX_TITLE_MUSIC_DROPDOWN), @@ -523,6 +526,11 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) config_save_default(); window_invalidate(w); break; + case WIDX_AUDIO_FOCUS_CHECKBOX: + gConfigSound.audio_focus = !gConfigSound.audio_focus; + config_save_default(); + window_invalidate(w); + break; } break; @@ -1154,6 +1162,7 @@ static void window_options_invalidate(rct_window *w) widget_set_checkbox_value(w, WIDX_SOUND_CHECKBOX, gConfigSound.sound); widget_set_checkbox_value(w, WIDX_MUSIC_CHECKBOX, gConfigSound.ride_music); + widget_set_checkbox_value(w, WIDX_AUDIO_FOCUS_CHECKBOX, gConfigSound.audio_focus); if(w->frame_no == 0){ // initialize only on first frame, otherwise the scrollbars wont be able to be modified widget = &window_options_audio_widgets[WIDX_MASTER_VOLUME]; @@ -1169,6 +1178,7 @@ static void window_options_invalidate(rct_window *w) window_options_audio_widgets[WIDX_SOUND_DROPDOWN].type = WWT_DROPDOWN_BUTTON; window_options_audio_widgets[WIDX_SOUND_CHECKBOX].type = WWT_CHECKBOX; window_options_audio_widgets[WIDX_MUSIC_CHECKBOX].type = WWT_CHECKBOX; + window_options_audio_widgets[WIDX_AUDIO_FOCUS_CHECKBOX].type = WWT_CHECKBOX; window_options_audio_widgets[WIDX_TITLE_MUSIC].type = WWT_DROPDOWN; window_options_audio_widgets[WIDX_TITLE_MUSIC_DROPDOWN].type = WWT_DROPDOWN_BUTTON; window_options_audio_widgets[WIDX_MASTER_VOLUME].type = WWT_SCROLL; From 58aeb6c911e014000b08c62d4496cf4a455fa201 Mon Sep 17 00:00:00 2001 From: medsouz Date: Tue, 11 Aug 2015 07:17:06 -0400 Subject: [PATCH 0473/1173] Changed the wrong boolean I should probably sleep more... --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index f5186b7d30..459eba5c33 100644 --- a/src/config.c +++ b/src/config.c @@ -206,8 +206,8 @@ config_property_definition _interfaceDefinitions[] = { config_property_definition _soundDefinitions[] = { { offsetof(sound_configuration, title_music), "title_music", CONFIG_VALUE_TYPE_UINT8, 2, NULL }, { offsetof(sound_configuration, sound), "sound", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, - { offsetof(sound_configuration, ride_music), "ride_music", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, - { offsetof(sound_configuration, audio_focus), "audio_focus", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, + { offsetof(sound_configuration, ride_music), "ride_music", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, + { offsetof(sound_configuration, audio_focus), "audio_focus", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(sound_configuration, master_volume), "master_volume", CONFIG_VALUE_TYPE_UINT8, 100, NULL }, { offsetof(sound_configuration, music_volume), "music_volume", CONFIG_VALUE_TYPE_UINT8, 100, NULL }, { offsetof(sound_configuration, device), "audio_device", CONFIG_VALUE_TYPE_STRING, { .value_string = NULL }, NULL }, From e0e9dedb8b517524cb439e499d1cadec6fcb3dc0 Mon Sep 17 00:00:00 2001 From: medsouz Date: Tue, 11 Aug 2015 07:30:29 -0400 Subject: [PATCH 0474/1173] Moved strings to english_uk.txt --- data/language/english_uk.txt | 1 + data/language/english_us.txt | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 05125c5d16..00b93db9bc 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3826,3 +3826,4 @@ STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}Show recent messages STR_5488 :No entrance STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests +STR_5490 :Disable audio on focus loss diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 81cc076e75..1d2ceb24f3 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3830,4 +3830,3 @@ STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}Show recent messages STR_5488 :No entrance -STR_5490 :Disable audio on focus loss From 9fd791c89d1d3a3bf7ba0f224e9450d2050b4fa2 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 11 Aug 2015 13:57:31 +0100 Subject: [PATCH 0475/1173] Create CONTRIBUTING.md --- CONTRIBUTING.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..156ec5a1f7 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,42 @@ +# Contributing to OpenRCT2 +Any contribution to OpenRCT2 is welcome and valued. Contributions can be in the form of bug reports, translation or code +additions / changes. Please read this document to learn how to contribute as effectively as possible. If you have any +questions or concerns, please ask in the [gitter](https://gitter.im/OpenRCT2/OpenRCT2) chat room. + +# Reporting bugs +To report a bug, ensure you have a GitHub account. Search the issues page to see if the bug has already been reported. +If not, create a new issue and write the steps to reproduce. Upload a saved game if possible and this is very helpful +for users to replicate the bug. + +# Translation +Translation is managed in a separate repository, [OpenRCT2/Localisation](https://github.com/OpenRCT2/Localisation). +You will find more information there. + +# Contributing code +## Steps +1. First, ensure you have a GitHub account and [fork](https://help.github.com/articles/fork-a-repo/) the OpenRCT2 repository. +2. Create a new branch from develop (unless you are contributing to another) and commit your changes to that. +3. Submit a new [pull request](https://help.github.com/articles/using-pull-requests/). +4. Wait for other users to test and review your changes. + +## Credits +If you are contributing to OpenRCT2, please add your name to ```./contributors.md``` so that you can be credited for your +work outside and inside the game. + +## Code hints +### Adding new strings +If you need to add a new localisable string to OpenRCT2, please add your new string entry to ```./data/language/english_uk.txt```. +It is important that you only edit English (UK) in the OpenRCT2 repository as this is the base language that is used for +translation to other languages. A separate repository OpenRCT2/Localisation is used for translation pull requests, and changes +to that repository are merged with the OpenRCT2 main repository every night. When your pull request is merged, it is helpful +to create a new issue in the OpenRCT2/Localisation repository about the new strings you have added. This notifies translators +so that they can translate the new strings as quick as possible. Similarly if you change any existing string, it is more +important that you create an issue as this can be more easily overlooked. + +When coding, please also add a string constant for your strings to ```./src/localisation/string_ids.h```. + +### Coding style / language +OpenRCT2 currently does not have a strict coding style. This will be implemented after the entire game is implemented and +undergoes heavy refactoring. For now, it is recommended that you only write C files as the majority of the game is currenlty in +C. Exceptions are to modules that have no direct relationship to original code such as the new software audio mixer, the +HTTP integration and the Twitch integration. From 810bd0620afcb8f8a2edbe15e5ba5335d35d2d94 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 11 Aug 2015 17:54:21 +0200 Subject: [PATCH 0476/1173] Fix Clear Scenery tool in Scenario Editor --- src/world/map.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/map.c b/src/world/map.c index 8149fc7c8d..3004e105fa 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1478,7 +1478,7 @@ money32 map_clear_scenery(int x0, int y0, int x1, int y1, int flags) totalCost = 0; for (y = y0; y <= y1; y += 32) { for (x = x0; x <= x1; x += 32) { - if (gCheatsSandboxMode || map_is_location_owned_or_has_rights(x, y)) { + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gCheatsSandboxMode || map_is_location_owned_or_has_rights(x, y)) { cost = map_clear_scenery_from_tile(x / 32, y / 32, flags); if (cost != MONEY32_UNDEFINED) { noValidTiles = false; From 77994a80d9dd44a7113cc6821477f529671c5024 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 11 Aug 2015 17:01:52 +0100 Subject: [PATCH 0477/1173] Add rd3k to contributors --- contributors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contributors.md b/contributors.md index d26dadee44..a32678191f 100644 --- a/contributors.md +++ b/contributors.md @@ -41,6 +41,7 @@ Includes all git commit authors. Aliases are GitHub user names. * Alexander Overvoorde (Overv) - Misc. * (eezstreet) - Misc. * Thomas den Hollander (ThomasdenH) - Misc. +* James Robertson (rd3k) - Misc. ## Bug fixes * (halfbro) From 23d4084332747747c24f812a69de97e8c8ebf25d Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 11 Aug 2015 18:26:39 +0200 Subject: [PATCH 0478/1173] Refactor Clear Scenery window and raise size limit to 64 --- src/windows/clear_scenery.c | 42 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/windows/clear_scenery.c b/src/windows/clear_scenery.c index 090ddefda7..bd7fbb9ead 100644 --- a/src/windows/clear_scenery.c +++ b/src/windows/clear_scenery.c @@ -63,6 +63,9 @@ static void window_clear_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_clear_scenery_textinput(rct_window *w, int widgetIndex, char *text); static void window_clear_scenery_inputsize(rct_window *w); +static int _minimumSize = 1; +static int _maximumSize = 64; + static rct_window_event_list window_clear_scenery_events = { window_clear_scenery_close, window_clear_scenery_mouseup, @@ -144,26 +147,15 @@ static void window_clear_scenery_mouseup(rct_window *w, int widgetIndex) window_close(w); break; case WIDX_DECREMENT: - // Decrement land tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)--; - limit = 1; - - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) < limit) - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = limit; + // Decrement land tool size, if it stays within the limit + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = max(_minimumSize,RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)-1); // Invalidate the window window_invalidate(w); break; case WIDX_INCREMENT: - // Increment land tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)++; - - // FEATURE: maximum size is always 7 - limit = 7; - // limit = (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2 ? 7 : 5); - - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > limit) - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = limit; + // Increment land tool size, if it stays within the limit + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = min(_maximumSize,RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)+1); // Invalidate the window window_invalidate(w); @@ -196,8 +188,8 @@ static void window_clear_scenery_textinput(rct_window *w, int widgetIndex, char size = strtol(text, &end, 10); if (*end == '\0') { - if (size < 1) size = 1; - if (size > 7) size = 7; + size=max(_minimumSize,size); + size=min(_maximumSize,size); RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = size; window_invalidate(w); } @@ -205,8 +197,8 @@ static void window_clear_scenery_textinput(rct_window *w, int widgetIndex, char static void window_clear_scenery_inputsize(rct_window *w) { - ((uint16*)TextInputDescriptionArgs)[0] = 1; - ((uint16*)TextInputDescriptionArgs)[1] = 7; + ((uint16*)TextInputDescriptionArgs)[0] = _minimumSize; + ((uint16*)TextInputDescriptionArgs)[1] = _maximumSize; window_text_input_open(w, WIDX_PREVIEW, 5128, 5129, STR_NONE, STR_NONE, 3); } @@ -235,8 +227,9 @@ static void window_clear_scenery_invalidate(rct_window *w) (gClearLargeScenery ? (1 << WIDX_LARGE_SCENERY) : 0) | (gClearFootpath ? (1 << WIDX_FOOTPATH) : 0); - // Update the preview image - window_clear_scenery_widgets[WIDX_PREVIEW].image = SPR_LAND_TOOL_SIZE_0 + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16); + // Update the preview image (for tool sizes up to 7) + window_clear_scenery_widgets[WIDX_PREVIEW].image = RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) <= 7 ? + SPR_LAND_TOOL_SIZE_0 + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) : 0xFFFFFFFF; } /** @@ -249,6 +242,13 @@ static void window_clear_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi) window_draw_widgets(w, dpi); + // Draw number for tool sizes bigger than 7 + x = w->x + (window_clear_scenery_widgets[WIDX_PREVIEW].left + window_clear_scenery_widgets[WIDX_PREVIEW].right) / 2; + y = w->y + (window_clear_scenery_widgets[WIDX_PREVIEW].top + window_clear_scenery_widgets[WIDX_PREVIEW].bottom) / 2; + if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > 7) { + gfx_draw_string_centred(dpi, STR_LAND_TOOL_SIZE_VALUE, x, y - 2, 0, &RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)); + } + // Draw cost amount x = (window_clear_scenery_widgets[WIDX_PREVIEW].left + window_clear_scenery_widgets[WIDX_PREVIEW].right) / 2 + w->x; y = window_clear_scenery_widgets[WIDX_PREVIEW].bottom + w->y + 5 + 27; From 7fe02849178019b38785ecd3ac7e89946a814986 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 11 Aug 2015 23:09:39 +0200 Subject: [PATCH 0479/1173] Refactor land, water and land rights windows --- src/windows/land.c | 34 +++++++++++----------------------- src/windows/land_rights.c | 35 +++++++++++------------------------ src/windows/water.c | 31 +++++++++++-------------------- 3 files changed, 33 insertions(+), 67 deletions(-) diff --git a/src/windows/land.c b/src/windows/land.c index f69fe7e1ce..b23022e65d 100644 --- a/src/windows/land.c +++ b/src/windows/land.c @@ -63,6 +63,8 @@ static void window_land_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_land_textinput(rct_window *w, int widgetIndex, char *text); static void window_land_inputsize(rct_window *w); +static int _minimumSize = 0; +static int _maximumSize = 64; static rct_window_event_list window_land_events = { window_land_close, @@ -165,36 +167,20 @@ static void window_land_close(rct_window *w) */ static void window_land_mouseup(rct_window *w, int widgetIndex) { - int limit; - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); break; case WIDX_DECREMENT: // Decrement land tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)--; - - // FEATURE: minimum size is always 0 - limit = 0; - // limit = (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2 ? 0 : 1); - - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) < limit) - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = limit; + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = max(_minimumSize, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)-1); // Invalidate the window window_invalidate(w); break; case WIDX_INCREMENT: // Increment land tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)++; - - // FEATURE: maximum size is 64 - limit = 64; - // limit = (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2 ? 7 : 5); - - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > limit) - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = limit; + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = min(_maximumSize, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)+1); // Invalidate the window window_invalidate(w); @@ -312,17 +298,18 @@ static void window_land_textinput(rct_window *w, int widgetIndex, char *text) size = strtol(text, &end, 10); if (*end == '\0') { - if (size < 0) size = 0; - if (size > 64) size = 64; + size = max(_minimumSize,size); + size = min(_maximumSize,size); RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = size; + window_invalidate(w); } } static void window_land_inputsize(rct_window *w) { - ((uint16*)TextInputDescriptionArgs)[0] = 0; - ((uint16*)TextInputDescriptionArgs)[1] = 64; + ((uint16*)TextInputDescriptionArgs)[0] = _minimumSize; + ((uint16*)TextInputDescriptionArgs)[1] = _maximumSize; window_text_input_open(w, WIDX_PREVIEW, 5128, 5129, STR_NONE, STR_NONE, 3); } @@ -354,6 +341,7 @@ static void window_land_invalidate(rct_window *w) window_land_widgets[WIDX_FLOOR].image = SPR_FLOOR_TEXTURE_GRASS + _selectedFloorTexture; window_land_widgets[WIDX_WALL].image = SPR_WALL_TEXTURE_ROCK + _selectedWallTexture; + // Update the preview image (for tool sizes up to 7) window_land_widgets[WIDX_PREVIEW].image = RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) <= 7 ? SPR_LAND_TOOL_SIZE_0 + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) : 0xFFFFFFFF; @@ -373,7 +361,7 @@ static void window_land_paint(rct_window *w, rct_drawpixelinfo *dpi) x = w->x + (window_land_widgets[WIDX_PREVIEW].left + window_land_widgets[WIDX_PREVIEW].right) / 2; y = w->y + (window_land_widgets[WIDX_PREVIEW].top + window_land_widgets[WIDX_PREVIEW].bottom) / 2; - // FEATURE larger land tool size support + // Draw number for tool sizes bigger than 7 if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > 7) { gfx_draw_string_centred(dpi, STR_LAND_TOOL_SIZE_VALUE, x, y - 2, 0, &RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)); } diff --git a/src/windows/land_rights.c b/src/windows/land_rights.c index 186502a332..3e4563085f 100644 --- a/src/windows/land_rights.c +++ b/src/windows/land_rights.c @@ -29,7 +29,8 @@ #include "../game.h" #include "../interface/themes.h" -const int MAX_LAND_RIGHTS_SIZE = 64; +static int _minimumSize = 1; +static int _maximumSize = 64; enum WINDOW_WATER_WIDGET_IDX { WIDX_BACKGROUND, @@ -121,10 +122,6 @@ void window_land_rights_open() static void window_land_rights_close(rct_window *w) { - //if (LandRightsMode) - // hide_land_rights(); - //else - // hide_construction_rights(); // If the tool wasn't changed, turn tool off if (!window_land_rights_should_close()) tool_cancel(); @@ -132,30 +129,20 @@ static void window_land_rights_close(rct_window *w) static void window_land_rights_mouseup(rct_window *w, int widgetIndex) { - int limit; - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); break; case WIDX_DECREMENT: - // Decrement land tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)--; - limit = 1; - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) < limit) - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = limit; + // Decrement land rights tool size + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = max(_minimumSize, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)-1); // Invalidate the window window_invalidate(w); break; case WIDX_INCREMENT: - // Increment land tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)++; - - limit = MAX_LAND_RIGHTS_SIZE; - - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > limit) - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = limit; + // Decrement land rights tool size + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = min(_maximumSize, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)+1); // Invalidate the window window_invalidate(w); @@ -192,8 +179,8 @@ static void window_land_rights_textinput(rct_window *w, int widgetIndex, char *t size = strtol(text, &end, 10); if (*end == '\0') { - if (size < 1) size = 1; - if (size > MAX_LAND_RIGHTS_SIZE) size = MAX_LAND_RIGHTS_SIZE; + size = max(_minimumSize,size); + size = min(_maximumSize,size); RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = size; window_invalidate(w); } @@ -201,8 +188,8 @@ static void window_land_rights_textinput(rct_window *w, int widgetIndex, char *t static void window_land_rights_inputsize(rct_window *w) { - ((uint16*)TextInputDescriptionArgs)[0] = 1; - ((uint16*)TextInputDescriptionArgs)[1] = MAX_LAND_RIGHTS_SIZE; + ((uint16*)TextInputDescriptionArgs)[0] = _minimumSize; + ((uint16*)TextInputDescriptionArgs)[1] = _maximumSize; window_text_input_open(w, WIDX_PREVIEW, 5128, 5129, STR_NONE, STR_NONE, 3); } @@ -235,7 +222,7 @@ static void window_land_rights_paint(rct_window *w, rct_drawpixelinfo *dpi) y = w->y + (window_land_rights_widgets[WIDX_PREVIEW].top + window_land_rights_widgets[WIDX_PREVIEW].bottom) / 2; window_draw_widgets(w, dpi); - // FEATURE larger land tool size support + // Draw number for tool sizes bigger than 7 if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > 7) { gfx_draw_string_centred(dpi, STR_LAND_TOOL_SIZE_VALUE, x, y - 2, 0, &RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)); } diff --git a/src/windows/water.c b/src/windows/water.c index c3e2b7e81d..0ccd77294f 100644 --- a/src/windows/water.c +++ b/src/windows/water.c @@ -56,6 +56,9 @@ static void window_water_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_water_textinput(rct_window *w, int widgetIndex, char *text); static void window_water_inputsize(rct_window *w); +static int _minimumSize = 1; +static int _maximumSize = 64; + static rct_window_event_list window_water_events = { window_water_close, window_water_mouseup, @@ -134,33 +137,20 @@ static void window_water_close(rct_window *w) */ static void window_water_mouseup(rct_window *w, int widgetIndex) { - int limit; - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); break; case WIDX_DECREMENT: // Decrement land tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)--; - limit = 1; - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) < limit) - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = limit; + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = max(_minimumSize, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)-1); // Invalidate the window window_invalidate(w); break; case WIDX_INCREMENT: // Increment land tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)++; - - // FEATURE: maximum size is always 7 - //limit = 7; - limit = 64; - // limit = (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2 ? 7 : 5); - - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > limit) - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = limit; + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = min(_maximumSize, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)+1); // Invalidate the window window_invalidate(w); @@ -181,17 +171,18 @@ static void window_water_textinput(rct_window *w, int widgetIndex, char *text) size = strtol(text, &end, 10); if (*end == '\0') { - if (size < 1) size = 1; - if (size > 64) size = 64; + size = max(_minimumSize,size); + size = min(_maximumSize,size); RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = size; + window_invalidate(w); } } static void window_water_inputsize(rct_window *w) { - ((uint16*)TextInputDescriptionArgs)[0] = 1; - ((uint16*)TextInputDescriptionArgs)[1] = 64; + ((uint16*)TextInputDescriptionArgs)[0] = _minimumSize; + ((uint16*)TextInputDescriptionArgs)[1] = _maximumSize; window_text_input_open(w, WIDX_PREVIEW, 5128, 5129, STR_NONE, STR_NONE, 3); } @@ -238,7 +229,7 @@ static void window_water_paint(rct_window *w, rct_drawpixelinfo *dpi) y = w->y + (window_water_widgets[WIDX_PREVIEW].top + window_water_widgets[WIDX_PREVIEW].bottom) / 2; window_draw_widgets(w, dpi); - // FEATURE larger land tool size support + // Draw number for tool sizes bigger than 7 if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > 7) { gfx_draw_string_centred(dpi, STR_LAND_TOOL_SIZE_VALUE, x, y - 2, 0, &RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)); } From fd715c7c5d17cf099656a250919b77fb82545985 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 12 Aug 2015 00:21:53 +0200 Subject: [PATCH 0480/1173] Name RIDE_TYPE_FLAG_8 and _12 --- src/ride/ride.c | 2 +- src/ride/ride.h | 4 ++-- src/windows/ride_construction.c | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 9180760cc7..4ebe33d133 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1641,7 +1641,7 @@ int ride_modify(rct_xy_element *input) if (ride->type == RIDE_TYPE_MAZE) return ride_modify_maze(mapElement.element, mapElement.x, mapElement.y); - if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_8)) { + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS)) { if (ride_find_track_gap(&mapElement, &endOfTrackElement)) mapElement = endOfTrackElement; } diff --git a/src/ride/ride.h b/src/ride/ride.h index d99221f299..1ce610aea4 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -744,11 +744,11 @@ enum { RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS = 1 << 5, RIDE_TYPE_FLAG_6 = 1 << 6, // used only by boat ride and submarine ride RIDE_TYPE_FLAG_HAS_G_FORCES = 1 << 7, - RIDE_TYPE_FLAG_8 = 1 << 8, // something to do with track, maybe whether it can have gaps + RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS = 1 << 8, // used by rides that can't have gaps, like those with a vertical tower, such as the observation tower RIDE_TYPE_FLAG_HAS_DATA_LOGGING = 1 << 9, RIDE_TYPE_FLAG_HAS_DROPS = 1 << 10, RIDE_TYPE_FLAG_NO_TEST_MODE = 1 << 11, - RIDE_TYPE_FLAG_12 = 1 << 12, // used only by dinghy slide and water coaster + RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIATIES = 1 << 12, // used by rides with two variaties, like the u and o shapes of the dinghy slide and the dry and submerged track of the water coaster RIDE_TYPE_FLAG_13 = 1 << 13, // used only by maze, spiral slide and shops RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS = 1 << 14, RIDE_TYPE_FLAG_15 = 1 << 15, // something to do with station, price and viewport zoom diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index f5934a231c..d19f090627 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1139,7 +1139,7 @@ static void window_ride_construction_resize(rct_window *w) disabledWidgets |= (1ULL << WIDX_CONSTRUCT); } } - if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_12)) { + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIATIES)) { disabledWidgets &= ~(1ULL << WIDX_BANKING_GROUPBOX); } if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT || _rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { @@ -2879,7 +2879,7 @@ static void window_ride_construction_update_widgets(rct_window *w) window_ride_construction_widgets[WIDX_BANK_STRAIGHT].type = WWT_FLATBTN; window_ride_construction_widgets[WIDX_BANK_RIGHT].type = WWT_FLATBTN; } - if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_12)) { + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIATIES)) { if (rideType == RIDE_TYPE_WATER_COASTER) { window_ride_construction_widgets[WIDX_U_TRACK].image = 5158; window_ride_construction_widgets[WIDX_O_TRACK].image = 5159; @@ -2969,7 +2969,7 @@ static void window_ride_construction_update_widgets(rct_window *w) window_ride_construction_widgets[WIDX_CONSTRUCT].type = WWT_EMPTY; window_ride_construction_widgets[WIDX_DEMOLISH].type = WWT_FLATBTN; window_ride_construction_widgets[WIDX_ROTATE].type = WWT_EMPTY; - if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_8)) { + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS)) { window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_EMPTY; window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_EMPTY; } else { @@ -3061,7 +3061,7 @@ static void window_ride_construction_update_widgets(rct_window *w) pressedWidgets |= (1ULL << widgetIndex); if (RCT2_GLOBAL(0x00F440D3, uint8) == 0) { - if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_12)) { + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIATIES)) { if (_currentTrackCovered & 1) { w->pressed_widgets |= (1ULL << WIDX_O_TRACK); } else { From f0054c7307628d5ed54a4fc6c9e456bfc73e195e Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 12 Aug 2015 00:23:40 +0200 Subject: [PATCH 0481/1173] Fix typo --- src/ride/ride.h | 2 +- src/windows/ride_construction.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ride/ride.h b/src/ride/ride.h index 1ce610aea4..2166b8a37a 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -748,7 +748,7 @@ enum { RIDE_TYPE_FLAG_HAS_DATA_LOGGING = 1 << 9, RIDE_TYPE_FLAG_HAS_DROPS = 1 << 10, RIDE_TYPE_FLAG_NO_TEST_MODE = 1 << 11, - RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIATIES = 1 << 12, // used by rides with two variaties, like the u and o shapes of the dinghy slide and the dry and submerged track of the water coaster + RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIETIES = 1 << 12, // used by rides with two variaties, like the u and o shapes of the dinghy slide and the dry and submerged track of the water coaster RIDE_TYPE_FLAG_13 = 1 << 13, // used only by maze, spiral slide and shops RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS = 1 << 14, RIDE_TYPE_FLAG_15 = 1 << 15, // something to do with station, price and viewport zoom diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index d19f090627..7cc2652964 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1139,7 +1139,7 @@ static void window_ride_construction_resize(rct_window *w) disabledWidgets |= (1ULL << WIDX_CONSTRUCT); } } - if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIATIES)) { + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIETIES)) { disabledWidgets &= ~(1ULL << WIDX_BANKING_GROUPBOX); } if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT || _rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { @@ -2879,7 +2879,7 @@ static void window_ride_construction_update_widgets(rct_window *w) window_ride_construction_widgets[WIDX_BANK_STRAIGHT].type = WWT_FLATBTN; window_ride_construction_widgets[WIDX_BANK_RIGHT].type = WWT_FLATBTN; } - if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIATIES)) { + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIETIES)) { if (rideType == RIDE_TYPE_WATER_COASTER) { window_ride_construction_widgets[WIDX_U_TRACK].image = 5158; window_ride_construction_widgets[WIDX_O_TRACK].image = 5159; @@ -3061,7 +3061,7 @@ static void window_ride_construction_update_widgets(rct_window *w) pressedWidgets |= (1ULL << widgetIndex); if (RCT2_GLOBAL(0x00F440D3, uint8) == 0) { - if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIATIES)) { + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIETIES)) { if (_currentTrackCovered & 1) { w->pressed_widgets |= (1ULL << WIDX_O_TRACK); } else { From 16653b6f9fc2ff9d757635dfd48f5197c955cefc Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 12 Aug 2015 04:00:14 +0100 Subject: [PATCH 0482/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/english_us.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 1d2ceb24f3..e8acc0ae07 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -2790,7 +2790,6 @@ STR_2779 :Viewport #{COMMA16} STR_2780 :Extra viewport # End of new strings - STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + @@ -3830,3 +3829,5 @@ STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}Show recent messages STR_5488 :No entrance +STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests +STR_5490 :Disable audio on focus loss From a0f75fbda26213cf1d869219a45b807e25281cc1 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 12 Aug 2015 14:07:16 +0200 Subject: [PATCH 0483/1173] Turn minimum and maximum tool sizes into defines --- src/windows/clear_scenery.c | 19 +++++++++---------- src/windows/land.c | 18 +++++++++--------- src/windows/land_rights.c | 16 ++++++++-------- src/windows/water.c | 18 +++++++++--------- 4 files changed, 35 insertions(+), 36 deletions(-) diff --git a/src/windows/clear_scenery.c b/src/windows/clear_scenery.c index bd7fbb9ead..7b3fb34120 100644 --- a/src/windows/clear_scenery.c +++ b/src/windows/clear_scenery.c @@ -27,6 +27,9 @@ #include "../interface/window.h" #include "../interface/themes.h" +#define MINIMUM_TOOL_SIZE 0 +#define MAXIMUM_TOOL_SIZE 64 + enum WINDOW_CLEAR_SCENERY_WIDGET_IDX { WIDX_BACKGROUND, WIDX_TITLE, @@ -52,7 +55,6 @@ rct_widget window_clear_scenery_widgets[] = { { WIDGETS_END }, }; - static int window_clear_scenery_should_close(); static void window_clear_scenery_close(rct_window *w); @@ -63,9 +65,6 @@ static void window_clear_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_clear_scenery_textinput(rct_window *w, int widgetIndex, char *text); static void window_clear_scenery_inputsize(rct_window *w); -static int _minimumSize = 1; -static int _maximumSize = 64; - static rct_window_event_list window_clear_scenery_events = { window_clear_scenery_close, window_clear_scenery_mouseup, @@ -148,14 +147,14 @@ static void window_clear_scenery_mouseup(rct_window *w, int widgetIndex) break; case WIDX_DECREMENT: // Decrement land tool size, if it stays within the limit - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = max(_minimumSize,RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)-1); + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = max(MINIMUM_TOOL_SIZE,RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)-1); // Invalidate the window window_invalidate(w); break; case WIDX_INCREMENT: // Increment land tool size, if it stays within the limit - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = min(_maximumSize,RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)+1); + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = min(MAXIMUM_TOOL_SIZE,RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)+1); // Invalidate the window window_invalidate(w); @@ -188,8 +187,8 @@ static void window_clear_scenery_textinput(rct_window *w, int widgetIndex, char size = strtol(text, &end, 10); if (*end == '\0') { - size=max(_minimumSize,size); - size=min(_maximumSize,size); + size=max(MINIMUM_TOOL_SIZE,size); + size=min(MAXIMUM_TOOL_SIZE,size); RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = size; window_invalidate(w); } @@ -197,8 +196,8 @@ static void window_clear_scenery_textinput(rct_window *w, int widgetIndex, char static void window_clear_scenery_inputsize(rct_window *w) { - ((uint16*)TextInputDescriptionArgs)[0] = _minimumSize; - ((uint16*)TextInputDescriptionArgs)[1] = _maximumSize; + ((uint16*)TextInputDescriptionArgs)[0] = MINIMUM_TOOL_SIZE; + ((uint16*)TextInputDescriptionArgs)[1] = MAXIMUM_TOOL_SIZE; window_text_input_open(w, WIDX_PREVIEW, 5128, 5129, STR_NONE, STR_NONE, 3); } diff --git a/src/windows/land.c b/src/windows/land.c index b23022e65d..1a68a7884c 100644 --- a/src/windows/land.c +++ b/src/windows/land.c @@ -28,6 +28,9 @@ #include "dropdown.h" #include "../interface/themes.h" +#define MINIMUM_TOOL_SIZE 0 +#define MAXIMUM_TOOL_SIZE 64 + enum WINDOW_LAND_WIDGET_IDX { WIDX_BACKGROUND, WIDX_TITLE, @@ -63,9 +66,6 @@ static void window_land_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_land_textinput(rct_window *w, int widgetIndex, char *text); static void window_land_inputsize(rct_window *w); -static int _minimumSize = 0; -static int _maximumSize = 64; - static rct_window_event_list window_land_events = { window_land_close, window_land_mouseup, @@ -173,14 +173,14 @@ static void window_land_mouseup(rct_window *w, int widgetIndex) break; case WIDX_DECREMENT: // Decrement land tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = max(_minimumSize, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)-1); + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = max(MINIMUM_TOOL_SIZE, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)-1); // Invalidate the window window_invalidate(w); break; case WIDX_INCREMENT: // Increment land tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = min(_maximumSize, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)+1); + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = min(MAXIMUM_TOOL_SIZE, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)+1); // Invalidate the window window_invalidate(w); @@ -298,8 +298,8 @@ static void window_land_textinput(rct_window *w, int widgetIndex, char *text) size = strtol(text, &end, 10); if (*end == '\0') { - size = max(_minimumSize,size); - size = min(_maximumSize,size); + size = max(MINIMUM_TOOL_SIZE,size); + size = min(MAXIMUM_TOOL_SIZE,size); RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = size; window_invalidate(w); @@ -308,8 +308,8 @@ static void window_land_textinput(rct_window *w, int widgetIndex, char *text) static void window_land_inputsize(rct_window *w) { - ((uint16*)TextInputDescriptionArgs)[0] = _minimumSize; - ((uint16*)TextInputDescriptionArgs)[1] = _maximumSize; + ((uint16*)TextInputDescriptionArgs)[0] = MINIMUM_TOOL_SIZE; + ((uint16*)TextInputDescriptionArgs)[1] = MAXIMUM_TOOL_SIZE; window_text_input_open(w, WIDX_PREVIEW, 5128, 5129, STR_NONE, STR_NONE, 3); } diff --git a/src/windows/land_rights.c b/src/windows/land_rights.c index 3e4563085f..6b6b533045 100644 --- a/src/windows/land_rights.c +++ b/src/windows/land_rights.c @@ -29,8 +29,8 @@ #include "../game.h" #include "../interface/themes.h" -static int _minimumSize = 1; -static int _maximumSize = 64; +#define MINIMUM_TOOL_SIZE 0 +#define MAXIMUM_TOOL_SIZE 64 enum WINDOW_WATER_WIDGET_IDX { WIDX_BACKGROUND, @@ -135,14 +135,14 @@ static void window_land_rights_mouseup(rct_window *w, int widgetIndex) break; case WIDX_DECREMENT: // Decrement land rights tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = max(_minimumSize, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)-1); + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = max(MINIMUM_TOOL_SIZE, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)-1); // Invalidate the window window_invalidate(w); break; case WIDX_INCREMENT: // Decrement land rights tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = min(_maximumSize, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)+1); + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = min(MAXIMUM_TOOL_SIZE, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)+1); // Invalidate the window window_invalidate(w); @@ -179,8 +179,8 @@ static void window_land_rights_textinput(rct_window *w, int widgetIndex, char *t size = strtol(text, &end, 10); if (*end == '\0') { - size = max(_minimumSize,size); - size = min(_maximumSize,size); + size = max(MINIMUM_TOOL_SIZE,size); + size = min(MAXIMUM_TOOL_SIZE,size); RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = size; window_invalidate(w); } @@ -188,8 +188,8 @@ static void window_land_rights_textinput(rct_window *w, int widgetIndex, char *t static void window_land_rights_inputsize(rct_window *w) { - ((uint16*)TextInputDescriptionArgs)[0] = _minimumSize; - ((uint16*)TextInputDescriptionArgs)[1] = _maximumSize; + ((uint16*)TextInputDescriptionArgs)[0] = MINIMUM_TOOL_SIZE; + ((uint16*)TextInputDescriptionArgs)[1] = MAXIMUM_TOOL_SIZE; window_text_input_open(w, WIDX_PREVIEW, 5128, 5129, STR_NONE, STR_NONE, 3); } diff --git a/src/windows/water.c b/src/windows/water.c index 0ccd77294f..cbe2803606 100644 --- a/src/windows/water.c +++ b/src/windows/water.c @@ -27,6 +27,9 @@ #include "../world/map.h" #include "../interface/themes.h" +#define MINIMUM_TOOL_SIZE 0 +#define MAXIMUM_TOOL_SIZE 64 + enum WINDOW_WATER_WIDGET_IDX { WIDX_BACKGROUND, WIDX_TITLE, @@ -56,9 +59,6 @@ static void window_water_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_water_textinput(rct_window *w, int widgetIndex, char *text); static void window_water_inputsize(rct_window *w); -static int _minimumSize = 1; -static int _maximumSize = 64; - static rct_window_event_list window_water_events = { window_water_close, window_water_mouseup, @@ -143,14 +143,14 @@ static void window_water_mouseup(rct_window *w, int widgetIndex) break; case WIDX_DECREMENT: // Decrement land tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = max(_minimumSize, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)-1); + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = max(MINIMUM_TOOL_SIZE, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)-1); // Invalidate the window window_invalidate(w); break; case WIDX_INCREMENT: // Increment land tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = min(_maximumSize, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)+1); + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = min(MAXIMUM_TOOL_SIZE, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)+1); // Invalidate the window window_invalidate(w); @@ -171,8 +171,8 @@ static void window_water_textinput(rct_window *w, int widgetIndex, char *text) size = strtol(text, &end, 10); if (*end == '\0') { - size = max(_minimumSize,size); - size = min(_maximumSize,size); + size = max(MINIMUM_TOOL_SIZE,size); + size = min(MAXIMUM_TOOL_SIZE,size); RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = size; window_invalidate(w); @@ -181,8 +181,8 @@ static void window_water_textinput(rct_window *w, int widgetIndex, char *text) static void window_water_inputsize(rct_window *w) { - ((uint16*)TextInputDescriptionArgs)[0] = _minimumSize; - ((uint16*)TextInputDescriptionArgs)[1] = _maximumSize; + ((uint16*)TextInputDescriptionArgs)[0] = MINIMUM_TOOL_SIZE; + ((uint16*)TextInputDescriptionArgs)[1] = MAXIMUM_TOOL_SIZE; window_text_input_open(w, WIDX_PREVIEW, 5128, 5129, STR_NONE, STR_NONE, 3); } From 6ec3838b0b44eb0311bde1d7fa12603a72133bf6 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 12 Aug 2015 14:23:13 +0200 Subject: [PATCH 0484/1173] Refactor map window --- src/windows/map.c | 41 ++++++++++++++--------------------------- 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/src/windows/map.c b/src/windows/map.c index 6741fecca2..eeaddaa0bf 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -33,6 +33,9 @@ #include "../world/scenery.h" #include "error.h" +#define MINIMUM_TOOL_SIZE 1 +#define MAXIMUM_TOOL_SIZE 64 + enum { PAGE_PEEPS, PAGE_RIDES @@ -221,6 +224,9 @@ void window_map_open() window_map_init_map(); RCT2_GLOBAL(0x00F64F05, uint8) = 0; window_map_center_on_view_point(); + + // Reset land tool size + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = 1; } /** @@ -235,9 +241,6 @@ static void window_map_close(rct_window *w) RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, uint16) == w->number) { tool_cancel(); } - - // Reset land tool size - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = 0; } /** @@ -246,9 +249,6 @@ static void window_map_close(rct_window *w) */ static void window_map_mouseup(rct_window *w, int widgetIndex) { - // Maximum land ownership tool size - int landToolSizeLimit; - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); @@ -257,8 +257,6 @@ static void window_map_mouseup(rct_window *w, int widgetIndex) window_invalidate(w); if (tool_set(w, widgetIndex, 2)) break; - - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = 1; RCT2_GLOBAL(0xF1AD61, sint8) = 2; show_gridlines(); show_land_rights(); @@ -297,20 +295,14 @@ static void window_map_mouseup(rct_window *w, int widgetIndex) window_invalidate(w); break; case WIDX_LAND_TOOL_SMALLER: - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)--; - landToolSizeLimit = 1; - - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) < landToolSizeLimit) - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = landToolSizeLimit; + // Decrement land ownership tool size + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = max(MINIMUM_TOOL_SIZE, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)-1); window_invalidate(w); break; case WIDX_LAND_TOOL_LARGER: - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)++; - landToolSizeLimit = 64; - - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > landToolSizeLimit) - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = landToolSizeLimit; + // Increment land ownership tool size + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = min(MAXIMUM_TOOL_SIZE, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)+1); window_invalidate(w); break; @@ -386,11 +378,6 @@ static void window_map_mousedown(int widgetIndex, rct_window *w, rct_widget *wid case WIDX_MAP_SIZE_SPINNER_DOWN: map_window_decrease_map_size(); break; - case WIDX_SET_LAND_RIGHTS: - // When unselecting the land rights tool, reset the size so the number doesn't - // stay in the map window. - RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = 1; - break; } } @@ -615,8 +602,8 @@ static void window_map_textinput(rct_window *w, int widgetIndex, char *text) case WIDX_LAND_TOOL: size = strtol(text, &end, 10); if (*end == '\0') { - if (size < 1) size = 1; - if (size > 64) size = 64; + size = max(MINIMUM_TOOL_SIZE,size); + size = min(MAXIMUM_TOOL_SIZE,size); RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = size; window_invalidate(w); } @@ -940,8 +927,8 @@ static void window_map_show_default_scenario_editor_buttons(rct_window *w) { static void window_map_inputsize_land(rct_window *w) { - ((uint16*)TextInputDescriptionArgs)[0] = 1; - ((uint16*)TextInputDescriptionArgs)[1] = 64; + ((uint16*)TextInputDescriptionArgs)[0] = MINIMUM_TOOL_SIZE; + ((uint16*)TextInputDescriptionArgs)[1] = MAXIMUM_TOOL_SIZE; window_text_input_open(w, WIDX_LAND_TOOL, 5128, 5129, STR_NONE, STR_NONE, 3); } From 7db2008472cbeec39cefcda80575a6784bcb7b5f Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 12 Aug 2015 14:24:20 +0200 Subject: [PATCH 0485/1173] Fix minimum tool sizes --- src/windows/clear_scenery.c | 2 +- src/windows/land_rights.c | 2 +- src/windows/water.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/windows/clear_scenery.c b/src/windows/clear_scenery.c index 7b3fb34120..819340bc07 100644 --- a/src/windows/clear_scenery.c +++ b/src/windows/clear_scenery.c @@ -27,7 +27,7 @@ #include "../interface/window.h" #include "../interface/themes.h" -#define MINIMUM_TOOL_SIZE 0 +#define MINIMUM_TOOL_SIZE 1 #define MAXIMUM_TOOL_SIZE 64 enum WINDOW_CLEAR_SCENERY_WIDGET_IDX { diff --git a/src/windows/land_rights.c b/src/windows/land_rights.c index 6b6b533045..ce0ea3cf89 100644 --- a/src/windows/land_rights.c +++ b/src/windows/land_rights.c @@ -29,7 +29,7 @@ #include "../game.h" #include "../interface/themes.h" -#define MINIMUM_TOOL_SIZE 0 +#define MINIMUM_TOOL_SIZE 1 #define MAXIMUM_TOOL_SIZE 64 enum WINDOW_WATER_WIDGET_IDX { diff --git a/src/windows/water.c b/src/windows/water.c index cbe2803606..ea3de071c3 100644 --- a/src/windows/water.c +++ b/src/windows/water.c @@ -27,7 +27,7 @@ #include "../world/map.h" #include "../interface/themes.h" -#define MINIMUM_TOOL_SIZE 0 +#define MINIMUM_TOOL_SIZE 1 #define MAXIMUM_TOOL_SIZE 64 enum WINDOW_WATER_WIDGET_IDX { From d01a53bd160b7d80ab048bd3108dc475885955f7 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 12 Aug 2015 15:31:52 +0200 Subject: [PATCH 0486/1173] Add Inventions List and Scenario Options to the Debug menu --- data/language/english_uk.txt | 2 ++ src/localisation/string_ids.h | 3 +++ src/windows/top_toolbar.c | 14 ++++++++++++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 00b93db9bc..13c0d8236b 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3827,3 +3827,5 @@ STR_5487 :{SMALLFONT}{BLACK}Show recent messages STR_5488 :No entrance STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests STR_5490 :Disable audio on focus loss +STR_5491 :Inventions list +STR_5492 :Scenario options diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 942ccc6b97..5ae91dcca2 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2027,6 +2027,9 @@ enum { STR_AUDIO_FOCUS = 5490, + STR_DEBUG_DROPDOWN_INVENTIONS_LIST = 5491, + STR_DEBUG_DROPDOWN_SCENARIO_OPTIONS = 5492, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index ed1e58b86b..c55bad4f31 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -100,7 +100,9 @@ typedef enum { typedef enum { DDIDX_CONSOLE = 0, DDIDX_TILE_INSPECTOR = 1, - DDIDX_OBJECT_SELECTION = 2 + DDIDX_OBJECT_SELECTION = 2, + DDIDX_INVENTIONS_LIST = 3, + DDIDX_SCENARIO_OPTIONS = 4 } TOP_TOOLBAR_DEBUG_DDIDX; enum { @@ -2845,6 +2847,8 @@ void top_toolbar_init_debug_menu(rct_window* w, rct_widget* widget) { gDropdownItemsFormat[0] = STR_DEBUG_DROPDOWN_CONSOLE; gDropdownItemsFormat[1] = STR_DEBUG_DROPDOWN_TILE_INSPECTOR; gDropdownItemsFormat[2] = STR_DEBUG_DROPDOWN_OBJECT_SELECTION; + gDropdownItemsFormat[3] = STR_DEBUG_DROPDOWN_INVENTIONS_LIST; + gDropdownItemsFormat[4] = STR_DEBUG_DROPDOWN_SCENARIO_OPTIONS; window_dropdown_show_text( w->x + widget->left, @@ -2852,7 +2856,7 @@ void top_toolbar_init_debug_menu(rct_window* w, rct_widget* widget) { widget->bottom - widget->top + 1, w->colours[1] | 0x80, 0, - 3 + 5 ); RCT2_GLOBAL(0x9DEBA2, uint16) = 0; @@ -2873,6 +2877,12 @@ void top_toolbar_debug_menu_dropdown(short dropdownIndex) { window_close_all(); window_editor_object_selection_open(); break; + case DDIDX_INVENTIONS_LIST: + window_editor_inventions_list_open(); + break; + case DDIDX_SCENARIO_OPTIONS: + window_editor_scenario_options_open(); + break; } } } From e9637978a18e93a7cbc6b9510f3d4b4100cf7a6d Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 12 Aug 2015 16:12:34 +0200 Subject: [PATCH 0487/1173] Fix cheat detection when using Scenario Options in-game, rename sub_69E869() --- src/editor.c | 2 +- src/game.c | 2 +- src/management/finance.c | 8 ++++---- src/management/finance.h | 4 ++-- src/rct1.c | 2 +- src/scenario.c | 4 ++-- src/windows/editor_scenario_options.c | 8 ++++++-- 7 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/editor.c b/src/editor.c index 43fe400d3e..921b30afb0 100644 --- a/src/editor.c +++ b/src/editor.c @@ -462,7 +462,7 @@ static int editor_read_s6(const char *path) RCT2_GLOBAL(0x013573DC, uint32) = min(RCT2_GLOBAL(0x013573DC, uint32), 100000); finance_reset_cash_to_initial(); - sub_69E869(); + finance_mark_loan_settings_as_legitimate(); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = clamp( MONEY(0,00), diff --git a/src/game.c b/src/game.c index 76737a8c10..e6cb1f9c78 100644 --- a/src/game.c +++ b/src/game.c @@ -776,7 +776,7 @@ int game_load_save(const char *path) window_new_ride_init_vars(); RCT2_GLOBAL(0x009DEB7C, uint16) = 0; if (RCT2_GLOBAL(0x0013587C4, uint32) == 0) // this check is not in scenario play - sub_69E869(); + finance_mark_loan_settings_as_legitimate(); load_palette(); gfx_invalidate_screen(); diff --git a/src/management/finance.c b/src/management/finance.c index 8762949036..49f3db2970 100644 --- a/src/management/finance.c +++ b/src/management/finance.c @@ -188,7 +188,7 @@ void finance_init() { RCT2_GLOBAL(0x013587D8, uint16) = 0x3F; - sub_69E869(); + finance_mark_loan_settings_as_legitimate(); } /** @@ -243,9 +243,9 @@ void finance_update_daily_profit() window_invalidate_by_class(WC_FINANCES); } -void sub_69E869() +// This subroutine is used to mark loan changes as 'legitimate', to prevent cheat detection from incorrectly interfering +void finance_mark_loan_settings_as_legitimate() { - // This subroutine is loan related and is used for cheat detection sint32 value = 0x70093A; value -= RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32); value = ror32(value, 5); @@ -314,7 +314,7 @@ void game_command_set_current_loan(int* eax, int* ebx, int* ecx, int* edx, int* RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = newLoan; RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) = money; RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32) = ENCRYPT_MONEY(money); - sub_69E869(); + finance_mark_loan_settings_as_legitimate(); window_invalidate_by_class(WC_FINANCES); RCT2_GLOBAL(0x009A9804, uint16) |= 1; diff --git a/src/management/finance.h b/src/management/finance.h index fb4755a0cc..0650d31e6d 100644 --- a/src/management/finance.h +++ b/src/management/finance.h @@ -61,7 +61,7 @@ void finance_reset_history(); void finance_init(); void finance_update_daily_profit(); void finance_shift_expenditure_table(); -void sub_69E869(); +void finance_mark_loan_settings_as_legitimate(); void finance_reset_cash_to_initial(); void finance_set_loan(money32 loan); @@ -71,4 +71,4 @@ money32 finance_get_maximum_loan(); money32 finance_get_current_cash(); void game_command_set_current_loan(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); -#endif \ No newline at end of file +#endif diff --git a/src/rct1.c b/src/rct1.c index 21d30629db..50e3287eff 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -259,7 +259,7 @@ void rct1_fix_landscape() RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) ); finance_reset_cash_to_initial(); - sub_69E869(); + finance_mark_loan_settings_as_legitimate(); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = clamp( MONEY(0,00), diff --git a/src/scenario.c b/src/scenario.c index 9d00389e92..270d877eef 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -276,7 +276,7 @@ void scenario_begin() RCT2_GLOBAL(0x013587D0, money32) = RCT2_GLOBAL(0x013573DC, money32) - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint32) = ENCRYPT_MONEY(RCT2_GLOBAL(0x013573DC, sint32)); - sub_69E869(); // (loan related) + finance_mark_loan_settings_as_legitimate(); // (loan related) strcpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, s6Info->details); strcpy((char*)RCT2_ADDRESS_SCENARIO_NAME, s6Info->name); @@ -315,7 +315,7 @@ void scenario_begin() RCT2_GLOBAL(RCT2_ADDRESS_TOTAL_ADMISSIONS, uint32) = 0; RCT2_GLOBAL(RCT2_ADDRESS_INCOME_FROM_ADMISSIONS, uint32) = 0; RCT2_GLOBAL(0x013587D8, uint16) = 63; - sub_69E869(); // (loan related, called above already) + finance_mark_loan_settings_as_legitimate(); // (loan related, called above already) park_reset_history(); finance_reset_history(); award_reset(); diff --git a/src/windows/editor_scenario_options.c b/src/windows/editor_scenario_options.c index b6cf6abc0f..bae5cb49be 100644 --- a/src/windows/editor_scenario_options.c +++ b/src/windows/editor_scenario_options.c @@ -485,7 +485,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, if (RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) < MONEY(1000000,00)) { RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) += MONEY(500,00); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32) = ENCRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32)); - sub_69E869(); + finance_mark_loan_settings_as_legitimate(); } else { window_error_open(3248, STR_NONE); } @@ -495,7 +495,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, if (RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) > MONEY(0,00)) { RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) -= MONEY(500,00); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32) = ENCRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32)); - sub_69E869(); + finance_mark_loan_settings_as_legitimate(); } else { window_error_open(3249, STR_NONE); } @@ -505,6 +505,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) < MONEY(5000000,00)) { RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) += MONEY(1000,00); RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) = max(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32), RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32)); + finance_mark_loan_settings_as_legitimate(); } else { window_error_open(3250, STR_NONE); } @@ -514,6 +515,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) > MONEY(0,00)) { RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) -= MONEY(1000,00); RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) = max(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32), RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32)); + finance_mark_loan_settings_as_legitimate(); } else { window_error_open(3251, STR_NONE); } @@ -523,6 +525,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, if (RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) < MONEY(5000000,00)) { RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) += MONEY(1000,00); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = min(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32), RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32)); + finance_mark_loan_settings_as_legitimate(); } else { window_error_open(3252, STR_NONE); } @@ -532,6 +535,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, if (RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) > MONEY(0,00)) { RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) -= MONEY(1000,00); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = min(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32), RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32)); + finance_mark_loan_settings_as_legitimate(); } else { window_error_open(3253, STR_NONE); } From d04d2f5069c837c0cd34c740d51ba823a3d95e21 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 12 Aug 2015 16:21:16 +0200 Subject: [PATCH 0488/1173] Silently update invented items when using Inventions List in-game --- src/windows/editor_inventions_list.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/windows/editor_inventions_list.c b/src/windows/editor_inventions_list.c index 06ca44417d..8819a0632e 100644 --- a/src/windows/editor_inventions_list.c +++ b/src/windows/editor_inventions_list.c @@ -554,6 +554,13 @@ void window_editor_inventions_list_open() */ static void window_editor_inventions_list_close(rct_window *w) { + // When used in-game (as a cheat) + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_EDITOR)) { + gSilentResearch = true; + sub_684AC3(); + gSilentResearch = false; + } + sub_685A79(); } From 76df9b156a3e00ddd9d0585c828cb53a637640a8 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 13 Aug 2015 04:00:15 +0100 Subject: [PATCH 0489/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_simplified.txt | 2 +- data/language/chinese_traditional.txt | 6 +- data/language/dutch.txt | 2 + data/language/english_us.txt | 2 + data/language/korean.txt | 3829 +++++++++++++++++++++++++ 5 files changed, 3839 insertions(+), 2 deletions(-) create mode 100644 data/language/korean.txt diff --git a/data/language/chinese_simplified.txt b/data/language/chinese_simplified.txt index 369d60c084..518747faee 100644 --- a/data/language/chinese_simplified.txt +++ b/data/language/chinese_simplified.txt @@ -2796,7 +2796,7 @@ STR_2780 :Extra viewport # End of new strings -STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :Change keyboard shortcut diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 0995f81408..dace62d7dd 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -1732,7 +1732,7 @@ STR_1726 :土地不供購買! STR_1727 :建造權不供購買! STR_1728 :不能在此購買建造權... STR_1729 :土地不是由樂園所擁有! -STR_1730 :{RED}Closed - - +STR_1730 :{RED}已關閉 - - STR_1731 :{WHITE}{STRINGID} - - STR_1732 :建造 STR_1733 :模式 @@ -3826,3 +3826,7 @@ STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}顯示最近消息 STR_5488 :隱藏入口 +STR_5489 :{SMALLFONT}{BLACK}只顯示追蹤中的遊客 +STR_5490 :失去焦點時靜音 +STR_5491 :研發列表 +STR_5492 :劇情選項 diff --git a/data/language/dutch.txt b/data/language/dutch.txt index adfa8db8c1..aac719254a 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3821,3 +3821,5 @@ STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}Recente berichten tonen STR_5488 :Geen ingang +STR_5489 :{SMALLFONT}{BLACK}Enkel bezoekers die gevolgd worden weergeven +STR_5490 :Geluid dempen bij focusverlies diff --git a/data/language/english_us.txt b/data/language/english_us.txt index e8acc0ae07..147eaac8dd 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3831,3 +3831,5 @@ STR_5487 :{SMALLFONT}{BLACK}Show recent messages STR_5488 :No entrance STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests STR_5490 :Disable audio on focus loss +STR_5491 :Inventions list +STR_5492 :Scenario options diff --git a/data/language/korean.txt b/data/language/korean.txt new file mode 100644 index 0000000000..f80bfcc2f8 --- /dev/null +++ b/data/language/korean.txt @@ -0,0 +1,3829 @@ +# STR_XXXX part is read and XXXX becomes the string id number. +# Everything after the colon and before the new line will be saved as the string. +# Use # at the beginning of a line to leave a comment. +STR_0000 : +STR_0001 :{STRINGID} {COMMA16} +STR_0002 :스파이럴 롤러코스터 +STR_0003 :스탠드업 롤러코스터 +STR_0004 :서스펜디드 스윙잉 코스터 +STR_0005 :인버티드 롤러코스터 +STR_0006 :주니어 롤러코스터 +STR_0007 :미니어처 레일웨이 +STR_0008 :모노레일 +STR_0009 :미니 서스펜디드 롤러코스터 +STR_0010 :보트 라이드 +STR_0011 :우든 와일드 마우스 +STR_0012 :스티플체이스 +STR_0013 :카 라이드 +STR_0014 :런치드 프리폴 +STR_0015 :봅슬레이 코스터 +STR_0016 :전망탑 +STR_0017 :루핑 롤러코스터 +STR_0018 :디니 슬라이드 +STR_0019 :마인 트레인 코스터 +STR_0020 :체어리프트 +STR_0021 :코르크스크류 롤러코스터 +STR_0022 :미로 +STR_0023 :나선 미끄럼틀 +STR_0024 :고 카트 +STR_0025 :통나무 수로 +STR_0026 :리버 래피드 +STR_0027 :범퍼카 +STR_0028 :바이킹 +STR_0029 :360도 바이킹 +STR_0030 :음식 상점 +STR_0031 :알 수 없는 상점 (1D) +STR_0032 :음료수 상점 +STR_0033 :알 수 없는 상점 (1F) +STR_0034 :상점 +STR_0035 :회전목마 +STR_0036 :알 수 없는 상점 (22) +STR_0037 :안내소 +STR_0038 :화장실 +STR_0039 :관람차 +STR_0040 :모션 시뮬레이터 +STR_0041 :3D 영화관 +STR_0042 :톱 스핀 +STR_0043 :스페이스 링 +STR_0044 :리버스 프리폴 코스터 +STR_0045 :리프트 +STR_0046 :버티컬 드롭 롤러코스터 +STR_0047 :현금 지급기 +STR_0048 :트위스트 +STR_0049 :귀신의 집 +STR_0050 :응급 치료소 +STR_0051 :서커스 쇼 +STR_0052 :고스트 트레인 +STR_0053 :스틸 트위스터 롤러코스터 +STR_0054 :우든 롤러코스터 +STR_0055 :사이드 프릭션 롤러코스터 +STR_0056 :와일드 마우스 +STR_0057 :멀티 디멘션 롤러코스터 +STR_0058 :알 수 없는 놀이기구 (38) +STR_0059 :플라잉 롤러코스터 +STR_0060 :알 수 없는 놀이기구 (3A) +STR_0061 :버지니아 릴 +STR_0062 :스플래시 보트 +STR_0063 :미니 헬리콥터 +STR_0064 :레이 다운 롤러코스터 +STR_0065 :서스펜디드 모노레일 +STR_0066 :알 수 없는 놀이기구 (40) +STR_0067 :리버서 롤러코스터 +STR_0068 :하트라인 트위스터 코스터 +STR_0069 :미니 골프 +STR_0070 :기가 코스터 +STR_0071 :자이로드롭 +STR_0072 :플라잉 사우서 +STR_0073 :이상한 집 +STR_0074 :모노레일 사이클 +STR_0075 :컴팩트 인버티드 코스터 +STR_0076 :워터 코스터 +STR_0077 :에어 파워드 버티컬 코스터 +STR_0078 :인버티드 헤어핀 코스터 +STR_0079 :마술 양탄자 +STR_0080 :서브마린 라이드 +STR_0081 :리버 래프트 +STR_0082 :알 수 없는 놀이기구 (50) +STR_0083 :엔터프라이즈 +STR_0084 :알 수 없는 놀이기구 (52) +STR_0085 :알 수 없는 놀이기구 (53) +STR_0086 :알 수 없는 놀이기구 (54) +STR_0087 :알 수 없는 놀이기구 (55) +STR_0088 :인버티트 임펄스 코스터 +STR_0089 :미니 롤러코스터 +STR_0090 :마인 라이드 +STR_0091 :알 수 없는 놀이기구 (59) +STR_0092 :LIM 런치드 롤러코스터 +STR_0093 : +STR_0094 : +STR_0095 : +STR_0096 : +STR_0097 : +STR_0098 : +STR_0099 : +STR_0100 : +STR_0101 : +STR_0102 : +STR_0103 : +STR_0104 : +STR_0105 : +STR_0106 : +STR_0107 : +STR_0108 : +STR_0109 : +STR_0110 : +STR_0111 : +STR_0112 : +STR_0113 : +STR_0114 : +STR_0115 : +STR_0116 : +STR_0117 : +STR_0118 : +STR_0119 : +STR_0120 : +STR_0121 : +STR_0122 : +STR_0123 : +STR_0124 : +STR_0125 : +STR_0126 : +STR_0127 : +STR_0128 : +STR_0129 : +STR_0130 : +STR_0131 : +STR_0132 : +STR_0133 : +STR_0134 : +STR_0135 : +STR_0136 : +STR_0137 : +STR_0138 : +STR_0139 : +STR_0140 : +STR_0141 : +STR_0142 : +STR_0143 : +STR_0144 : +STR_0145 : +STR_0146 : +STR_0147 : +STR_0148 : +STR_0149 : +STR_0150 : +STR_0151 : +STR_0152 : +STR_0153 : +STR_0154 : +STR_0155 : +STR_0156 : +STR_0157 : +STR_0158 : +STR_0159 : +STR_0160 : +STR_0161 : +STR_0162 : +STR_0163 : +STR_0164 : +STR_0165 : +STR_0166 : +STR_0167 : +STR_0168 : +STR_0169 : +STR_0170 : +STR_0171 : +STR_0172 : +STR_0173 : +STR_0174 : +STR_0175 : +STR_0176 : +STR_0177 : +STR_0178 : +STR_0179 : +STR_0180 : +STR_0181 : +STR_0182 : +STR_0183 : +STR_0184 : +STR_0185 : +STR_0186 : +STR_0187 : +STR_0188 : +STR_0189 : +STR_0190 : +STR_0191 : +STR_0192 : +STR_0193 : +STR_0194 : +STR_0195 : +STR_0196 : +STR_0197 : +STR_0198 : +STR_0199 : +STR_0200 : +STR_0201 : +STR_0202 : +STR_0203 : +STR_0204 : +STR_0205 : +STR_0206 : +STR_0207 : +STR_0208 : +STR_0209 : +STR_0210 : +STR_0211 : +STR_0212 : +STR_0213 : +STR_0214 : +STR_0215 : +STR_0216 : +STR_0217 : +STR_0218 : +STR_0219 : +STR_0220 : +STR_0221 : +STR_0222 : +STR_0223 : +STR_0224 : +STR_0225 : +STR_0226 : +STR_0227 : +STR_0228 : +STR_0229 : +STR_0230 : +STR_0231 : +STR_0232 : +STR_0233 : +STR_0234 : +STR_0235 : +STR_0236 : +STR_0237 : +STR_0238 : +STR_0239 : +STR_0240 : +STR_0241 : +STR_0242 : +STR_0243 : +STR_0244 : +STR_0245 : +STR_0246 : +STR_0247 : +STR_0248 : +STR_0249 : +STR_0250 : +STR_0251 : +STR_0252 : +STR_0253 : +STR_0254 : +STR_0255 : +STR_0256 : +STR_0257 : +STR_0258 : +STR_0259 : +STR_0260 : +STR_0261 : +STR_0262 : +STR_0263 : +STR_0264 : +STR_0265 : +STR_0266 : +STR_0267 : +STR_0268 : +STR_0269 : +STR_0270 : +STR_0271 : +STR_0272 : +STR_0273 : +STR_0274 : +STR_0275 : +STR_0276 : +STR_0277 : +STR_0278 : +STR_0279 : +STR_0280 : +STR_0281 : +STR_0282 : +STR_0283 : +STR_0284 : +STR_0285 : +STR_0286 : +STR_0287 : +STR_0288 : +STR_0289 : +STR_0290 : +STR_0291 : +STR_0292 : +STR_0293 : +STR_0294 : +STR_0295 : +STR_0296 : +STR_0297 : +STR_0298 : +STR_0299 : +STR_0300 : +STR_0301 : +STR_0302 : +STR_0303 : +STR_0304 : +STR_0305 : +STR_0306 : +STR_0307 : +STR_0308 : +STR_0309 : +STR_0310 : +STR_0311 : +STR_0312 : +STR_0313 : +STR_0314 : +STR_0315 : +STR_0316 : +STR_0317 : +STR_0318 : +STR_0319 : +STR_0320 : +STR_0321 : +STR_0322 : +STR_0323 : +STR_0324 : +STR_0325 : +STR_0326 : +STR_0327 : +STR_0328 : +STR_0329 : +STR_0330 : +STR_0331 : +STR_0332 : +STR_0333 : +STR_0334 : +STR_0335 : +STR_0336 : +STR_0337 : +STR_0338 : +STR_0339 : +STR_0340 : +STR_0341 : +STR_0342 : +STR_0343 : +STR_0344 : +STR_0345 : +STR_0346 : +STR_0347 : +STR_0348 : +STR_0349 : +STR_0350 : +STR_0351 : +STR_0352 : +STR_0353 : +STR_0354 : +STR_0355 : +STR_0356 : +STR_0357 : +STR_0358 : +STR_0359 : +STR_0360 : +STR_0361 : +STR_0362 : +STR_0363 : +STR_0364 : +STR_0365 : +STR_0366 : +STR_0367 : +STR_0368 : +STR_0369 : +STR_0370 : +STR_0371 : +STR_0372 : +STR_0373 : +STR_0374 : +STR_0375 : +STR_0376 : +STR_0377 : +STR_0378 : +STR_0379 : +STR_0380 : +STR_0381 : +STR_0382 : +STR_0383 : +STR_0384 : +STR_0385 : +STR_0386 : +STR_0387 : +STR_0388 : +STR_0389 : +STR_0390 : +STR_0391 : +STR_0392 : +STR_0393 : +STR_0394 : +STR_0395 : +STR_0396 : +STR_0397 : +STR_0398 : +STR_0399 : +STR_0400 : +STR_0401 : +STR_0402 : +STR_0403 : +STR_0404 : +STR_0405 : +STR_0406 : +STR_0407 : +STR_0408 : +STR_0409 : +STR_0410 : +STR_0411 : +STR_0412 : +STR_0413 : +STR_0414 : +STR_0415 : +STR_0416 : +STR_0417 : +STR_0418 : +STR_0419 : +STR_0420 : +STR_0421 : +STR_0422 : +STR_0423 : +STR_0424 : +STR_0425 : +STR_0426 : +STR_0427 : +STR_0428 : +STR_0429 : +STR_0430 : +STR_0431 : +STR_0432 : +STR_0433 : +STR_0434 : +STR_0435 : +STR_0436 : +STR_0437 : +STR_0438 : +STR_0439 : +STR_0440 : +STR_0441 : +STR_0442 : +STR_0443 : +STR_0444 : +STR_0445 : +STR_0446 : +STR_0447 : +STR_0448 : +STR_0449 : +STR_0450 : +STR_0451 : +STR_0452 : +STR_0453 : +STR_0454 : +STR_0455 : +STR_0456 : +STR_0457 : +STR_0458 : +STR_0459 : +STR_0460 : +STR_0461 : +STR_0462 : +STR_0463 : +STR_0464 : +STR_0465 : +STR_0466 : +STR_0467 : +STR_0468 : +STR_0469 : +STR_0470 : +STR_0471 : +STR_0472 : +STR_0473 : +STR_0474 : +STR_0475 : +STR_0476 : +STR_0477 : +STR_0478 : +STR_0479 : +STR_0480 : +STR_0481 : +STR_0482 : +STR_0483 : +STR_0484 : +STR_0485 : +STR_0486 : +STR_0487 : +STR_0488 : +STR_0489 : +STR_0490 : +STR_0491 : +STR_0492 : +STR_0493 : +STR_0494 : +STR_0495 : +STR_0496 : +STR_0497 : +STR_0498 : +STR_0499 : +STR_0500 : +STR_0501 : +STR_0502 : +STR_0503 : +STR_0504 : +STR_0505 : +STR_0506 : +STR_0507 : +STR_0508 : +STR_0509 : +STR_0510 : +STR_0511 : +STR_0512 :컴팩트 롤러코스터 with a spiral lift hill and smooth, twisting drops. +STR_0513 :루핑 롤러코스터 where the 라이더 라이드 in a standing position +STR_0514 :Trains 서스펜디드 beneath the 롤러코스터 track swing out to the side around corners +STR_0515 :A steel 롤러코스터 with trains that are held beneath the track, with many complex and twisting track elements +STR_0516 :A gentle 롤러코스터 for people who haven't yet got the courage to face the larger 라이드s +STR_0517 :Passengers 라이드 in 미니ature trains along a narrow-gauge railway track +STR_0518 :Passengers travel in electric trains along a monorail track +STR_0519 :Passengers 라이드 in small cars hanging beneath the single-rail track, swinging freely from side to side around corners +STR_0520 :A dock platform where 손님s can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting 롤러코스터 with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller 롤러코스터 where the 라이더 sit above the track with no car around them +STR_0523 :라이더 travel slowly in powered vehicles along a track-based route +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0525 :라이더 career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower +STR_0527 :A smooth steel-tracked 롤러코스터 capable of vertical loops +STR_0528 :라이더 travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themed 롤러코스터 trains career along steel 롤러코스터 track made to look like old railway track +STR_0530 :Cars hang from a steel cable which runs continuously from one end of the 라이드 to the other and back again +STR_0531 :A compact steel-tracked 롤러코스터 where the train travels through corkscrews and loops +STR_0532 : +STR_0533 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the 라이더 +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling 라이더 through foaming rapids +STR_0537 : +STR_0538 : +STR_0539 : +STR_0540 : +STR_0541 : +STR_0542 : +STR_0543 : +STR_0544 : +STR_0545 : +STR_0546 : +STR_0547 : +STR_0548 : +STR_0549 : +STR_0550 : +STR_0551 : +STR_0552 : +STR_0553 : +STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station +STR_0555 :손님s 라이드 in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall 롤러코스터 experience +STR_0557 : +STR_0558 : +STR_0559 : +STR_0560 : +STR_0561 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects +STR_0563 :Sitting in comfortable trains with only simple lap restraints 라이더 enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills +STR_0564 :Running on 우든 track, this 코스터 is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' +STR_0565 :A simple 우든 롤러코스터 capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity +STR_0566 :Individual 롤러코스터 cars zip around a tight zig-zag layout of track with sharp corners and short sharp drops +STR_0567 :Sitting in seats 서스펜디드 either side of the track, 라이더 are pitched head-over-heels while they plunge down steep drops and travel through various inversions +STR_0568 : +STR_0569 :Riding in special harnesses below the track, 라이더 experience the feeling of flight as they swoop through the air +STR_0570 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging 우든 track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the 라이더 with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the 라이더 +STR_0574 :라이더 are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground +STR_0575 :Powered trains hanging from a single rail transport people around the park +STR_0576 : +STR_0577 :Bogied cars run on 우든 tracks, turning around on special reversing sections +STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists +STR_0579 : +STR_0580 :A giant steel 롤러코스터 capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes +STR_0582 : +STR_0583 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the 라이더 +STR_0585 :라이더 sit in pairs of seats 서스펜디드 beneath the track as they loop and twist through tight inversions +STR_0586 :Boat shaped cars run on 롤러코스터 track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops +STR_0589 : +STR_0590 :라이더 라이드 in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track +STR_0592 : +STR_0593 : +STR_0594 : +STR_0595 : +STR_0596 : +STR_0597 : +STR_0598 :인버티드 롤러코스터 trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track +STR_0599 :A compact 롤러코스터 with individual cars and smooth twisting drops +STR_0600 :Powered mine trains career along a smooth and twisted track layout +STR_0601 : +STR_0602 :롤러코스터 trains are accelerated out of the station by linear induction motors to speed through twisting inversions +STR_0603 :손님 {INT32} +STR_0604 :손님 {INT32} +STR_0605 :손님 {INT32} +STR_0606 :손님 {INT32} +STR_0607 :손님 {INT32} +STR_0608 :손님 {INT32} +STR_0609 :손님 {INT32} +STR_0610 :손님 {INT32} +STR_0611 :손님 {INT32} +STR_0612 :손님 {INT32} +STR_0613 :손님 {INT32} +STR_0614 :손님 {INT32} +STR_0615 :손님 {INT32} +STR_0616 :손님 {INT32} +STR_0617 :손님 {INT32} +STR_0618 :손님 {INT32} +STR_0619 :손님 {INT32} +STR_0620 :손님 {INT32} +STR_0621 :손님 {INT32} +STR_0622 :손님 {INT32} +STR_0623 :손님 {INT32} +STR_0624 :손님 {INT32} +STR_0625 :손님 {INT32} +STR_0626 :손님 {INT32} +STR_0627 :손님 {INT32} +STR_0628 :손님 {INT32} +STR_0629 :손님 {INT32} +STR_0630 :손님 {INT32} +STR_0631 :손님 {INT32} +STR_0632 :손님 {INT32} +STR_0633 :손님 {INT32} +STR_0634 :손님 {INT32} +STR_0635 :손님 {INT32} +STR_0636 :손님 {INT32} +STR_0637 :손님 {INT32} +STR_0638 :손님 {INT32} +STR_0639 :손님 {INT32} +STR_0640 :손님 {INT32} +STR_0641 :손님 {INT32} +STR_0642 :손님 {INT32} +STR_0643 :손님 {INT32} +STR_0644 :손님 {INT32} +STR_0645 :손님 {INT32} +STR_0646 :손님 {INT32} +STR_0647 :손님 {INT32} +STR_0648 :손님 {INT32} +STR_0649 :손님 {INT32} +STR_0650 :손님 {INT32} +STR_0651 :손님 {INT32} +STR_0652 :손님 {INT32} +STR_0653 :손님 {INT32} +STR_0654 :손님 {INT32} +STR_0655 :손님 {INT32} +STR_0656 :손님 {INT32} +STR_0657 :손님 {INT32} +STR_0658 :손님 {INT32} +STR_0659 :손님 {INT32} +STR_0660 :손님 {INT32} +STR_0661 :손님 {INT32} +STR_0662 :손님 {INT32} +STR_0663 :손님 {INT32} +STR_0664 :손님 {INT32} +STR_0665 :손님 {INT32} +STR_0666 :손님 {INT32} +STR_0667 :손님 {INT32} +STR_0668 :손님 {INT32} +STR_0669 :손님 {INT32} +STR_0670 :손님 {INT32} +STR_0671 :손님 {INT32} +STR_0672 :손님 {INT32} +STR_0673 :손님 {INT32} +STR_0674 :손님 {INT32} +STR_0675 :손님 {INT32} +STR_0676 :손님 {INT32} +STR_0677 :손님 {INT32} +STR_0678 :손님 {INT32} +STR_0679 :손님 {INT32} +STR_0680 :손님 {INT32} +STR_0681 :손님 {INT32} +STR_0682 :손님 {INT32} +STR_0683 :손님 {INT32} +STR_0684 :손님 {INT32} +STR_0685 :손님 {INT32} +STR_0686 :손님 {INT32} +STR_0687 :손님 {INT32} +STR_0688 :손님 {INT32} +STR_0689 :손님 {INT32} +STR_0690 :손님 {INT32} +STR_0691 :손님 {INT32} +STR_0692 :손님 {INT32} +STR_0693 :손님 {INT32} +STR_0694 :손님 {INT32} +STR_0695 :손님 {INT32} +STR_0696 :손님 {INT32} +STR_0697 :손님 {INT32} +STR_0698 :손님 {INT32} +STR_0699 :손님 {INT32} +STR_0700 :손님 {INT32} +STR_0701 :손님 {INT32} +STR_0702 :손님 {INT32} +STR_0703 :손님 {INT32} +STR_0704 :손님 {INT32} +STR_0705 :손님 {INT32} +STR_0706 :손님 {INT32} +STR_0707 :손님 {INT32} +STR_0708 :손님 {INT32} +STR_0709 :손님 {INT32} +STR_0710 :손님 {INT32} +STR_0711 :손님 {INT32} +STR_0712 :손님 {INT32} +STR_0713 :손님 {INT32} +STR_0714 :손님 {INT32} +STR_0715 :손님 {INT32} +STR_0716 :손님 {INT32} +STR_0717 :손님 {INT32} +STR_0718 :손님 {INT32} +STR_0719 :손님 {INT32} +STR_0720 :손님 {INT32} +STR_0721 :손님 {INT32} +STR_0722 :손님 {INT32} +STR_0723 :손님 {INT32} +STR_0724 :손님 {INT32} +STR_0725 :손님 {INT32} +STR_0726 :손님 {INT32} +STR_0727 :손님 {INT32} +STR_0728 :손님 {INT32} +STR_0729 :손님 {INT32} +STR_0730 :손님 {INT32} +STR_0731 :손님 {INT32} +STR_0732 :손님 {INT32} +STR_0733 :손님 {INT32} +STR_0734 :손님 {INT32} +STR_0735 :손님 {INT32} +STR_0736 :손님 {INT32} +STR_0737 :손님 {INT32} +STR_0738 :손님 {INT32} +STR_0739 :손님 {INT32} +STR_0740 :손님 {INT32} +STR_0741 :손님 {INT32} +STR_0742 :손님 {INT32} +STR_0743 :손님 {INT32} +STR_0744 :손님 {INT32} +STR_0745 :손님 {INT32} +STR_0746 :손님 {INT32} +STR_0747 :손님 {INT32} +STR_0748 :손님 {INT32} +STR_0749 :손님 {INT32} +STR_0750 :손님 {INT32} +STR_0751 :손님 {INT32} +STR_0752 :손님 {INT32} +STR_0753 :손님 {INT32} +STR_0754 :손님 {INT32} +STR_0755 :손님 {INT32} +STR_0756 :손님 {INT32} +STR_0757 :손님 {INT32} +STR_0758 :손님 {INT32} +STR_0759 :손님 {INT32} +STR_0760 :손님 {INT32} +STR_0761 :손님 {INT32} +STR_0762 :손님 {INT32} +STR_0763 :손님 {INT32} +STR_0764 :손님 {INT32} +STR_0765 :손님 {INT32} +STR_0766 :손님 {INT32} +STR_0767 :손님 {INT32} +STR_0768 :미화원 {INT32} +STR_0769 :정비기술자 {INT32} +STR_0770 :경비원 {INT32} +STR_0771 :엔터테이너 {INT32} +STR_0772 :이름 없는 공원{POP16}{POP16} +STR_0773 :이름 없는 공원{POP16}{POP16} +STR_0774 :이름 없는 공원{POP16}{POP16} +STR_0775 :이름 없는 공원{POP16}{POP16} +STR_0776 :이름 없는 공원{POP16}{POP16} +STR_0777 :이름 없는 공원{POP16}{POP16} +STR_0778 :팻말 +STR_0779 :1일 +STR_0780 :2일 +STR_0781 :3일 +STR_0782 :4일 +STR_0783 :5일 +STR_0784 :6일 +STR_0785 :7일 +STR_0786 :8일 +STR_0787 :9일 +STR_0788 :10일 +STR_0789 :11일 +STR_0790 :12일 +STR_0791 :13일 +STR_0792 :14일 +STR_0793 :15일 +STR_0794 :16일 +STR_0795 :17일 +STR_0796 :18일 +STR_0797 :19일 +STR_0798 :20일 +STR_0799 :21일 +STR_0800 :22일 +STR_0801 :23일 +STR_0802 :24일 +STR_0803 :25일 +STR_0804 :26일 +STR_0805 :27일 +STR_0806 :28일 +STR_0807 :29일 +STR_0808 :30일 +STR_0809 :31일 +STR_0810 :1월 +STR_0811 :2월 +STR_0812 :3월 +STR_0813 :4월 +STR_0814 :5월 +STR_0815 :6월 +STR_0816 :7월 +STR_0817 :8월 +STR_0818 :9월 +STR_0819 :10월 +STR_0820 :11월 +STR_0821 :12월 +STR_0822 :그래픽 데이터 파일에 접근할 수 없습니다 +STR_0823 :데이터 파일이 존재하지 않거나 접근할 수 없습니다 +STR_0824 :{BLACK}{CROSS} +STR_0825 :이미 사용 중인 이름입니다 +STR_0826 :이름이 너무 많이 지정되었습니다 +STR_0827 :돈이 부족합니다 - {CURRENCY2DP} 만큼의 돈이 더 필요합니다 +STR_0828 :{SMALLFONT}{BLACK}창 닫기 +STR_0829 :{SMALLFONT}{BLACK}창 제목 - 창을 움직이려면 여기를 드래그하세요 +STR_0830 :{SMALLFONT}{BLACK}화면 확대하기 +STR_0831 :{SMALLFONT}{BLACK}화면 축소하기 +STR_0832 :{SMALLFONT}{BLACK}화면을 시계 방향으로 90{DEGREE}도 회전하기 +STR_0833 :{SMALLFONT}{BLACK}게임 일시정지 +STR_0834 :{SMALLFONT}{BLACK}디스크 및 게임 옵션 +STR_0835 :게임 초기화 실패 +STR_0836 :게임을 최소화 상태에서 실행할 수 없습니다 +STR_0837 :그래픽 시스템을 초기화할 수 없습니다 +STR_0838 : +STR_0839 :{UINT16} x {UINT16} +STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} +# The following six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :'OpenRCT2'에 대해서 +STR_0848 :롤러코스터 타이쿤 2 +STR_0849 :{WINDOW_COLOUR_2}버전 2.01.028 +STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, all rights reserved +STR_0851 :{WINDOW_COLOUR_2}디자인 및 프로그래밍: Chris Sawyer +STR_0852 :{WINDOW_COLOUR_2}그래픽: Simon Foster +STR_0853 :{WINDOW_COLOUR_2}효과음 및 배경음악: Allister Brimble +STR_0854 :{WINDOW_COLOUR_2}추가 효과음 녹음: David Ellis +STR_0855 :{WINDOW_COLOUR_2}리프리젠테이션: Marjacq Ltd사의 Jacqui Lyons +STR_0856 :{WINDOW_COLOUR_2}감사드릴 분들: +STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth 그리고 John Wardley +STR_0858 :{WINDOW_COLOUR_2} +STR_0859 :{WINDOW_COLOUR_2} +STR_0860 :{WINDOW_COLOUR_2} +STR_0861 : +STR_0862 : +STR_0863 : +STR_0864 : +STR_0865 :{STRINGID} +STR_0866 :{POP16}{STRINGID} +STR_0867 :{POP16}{POP16}{STRINGID} +STR_0868 :{POP16}{POP16}{POP16}{STRINGID} +STR_0869 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0870 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0872 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0873 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0874 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0875 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0876 :{BLACK}{DOWN} +STR_0877 :너무 낮습니다! +STR_0878 :너무 높습니다! +STR_0879 :여기를 더 이상 내릴 수 없습니다... +STR_0880 :여기를 더 이상 올릴 수 없습니다... +STR_0881 :오브젝트가 있습니다 +STR_0882 :게임 불러오기 +STR_0883 :게임 저장하기 +STR_0884 :풍경 불러오기 +STR_0885 :풍경 저장하기 +STR_0886 :게임 종료하기 +STR_0887 :시나리오 에디터 종료하기 +STR_0888 :롤러코스터 디자이너 종료하기 +STR_0889 :트랙 디자인 매니저 종료하기 +STR_0890 :SCR{COMMA16}.BMP +STR_0891 :스크린 샷 +STR_0892 :스크린 샷이 디스크에 다음 이름으로 저장되었습니다: {STRINGID} +STR_0893 :스크린 샷 찍기 실패! +STR_0894 :풍경 데이터 영역이 가득 찼습니다! +STR_0895 :일부분만 땅의 위/아래로 건설할 수 없습니다 +STR_0896 :{POP16}{POP16}{STRINGID} 건설 +STR_0897 :방향 +STR_0898 :{SMALLFONT}{BLACK}왼쪽 커브 +STR_0899 :{SMALLFONT}{BLACK}오른쪽 커브 +STR_0900 :{SMALLFONT}{BLACK}왼쪽 커브 (작은 반경) +STR_0901 :{SMALLFONT}{BLACK}오른쪽 커브 (작은 반경) +STR_0902 :{SMALLFONT}{BLACK}왼쪽 커브 (아주 작은 반경) +STR_0903 :{SMALLFONT}{BLACK}오른쪽 커브 (아주 작은 반경) +STR_0904 :{SMALLFONT}{BLACK}왼쪽 커브 (큰 반경) +STR_0905 :{SMALLFONT}{BLACK}오른쪽 커브 (큰 반경) +STR_0906 :{SMALLFONT}{BLACK}직선 +STR_0907 :경사 +STR_0908 :회전/뱅킹 +STR_0909 :좌석 회전각 +STR_0910 :{SMALLFONT}{BLACK}왼쪽으로 회전 +STR_0911 :{SMALLFONT}{BLACK}오른쪽으로 회전 +STR_0912 :{SMALLFONT}{BLACK}회전 없음 +STR_0913 :{SMALLFONT}{BLACK}이전 조각으로 이동 +STR_0914 :{SMALLFONT}{BLACK}다음 조각으로 이동 +STR_0915 :{SMALLFONT}{BLACK}선택한 조각을 건설 +STR_0916 :{SMALLFONT}{BLACK}선택한 조각을 제거 +STR_0917 :{SMALLFONT}{BLACK}수직 낙하 +STR_0918 :{SMALLFONT}{BLACK}급 하강 +STR_0919 :{SMALLFONT}{BLACK}하강 +STR_0920 :{SMALLFONT}{BLACK}평탄 +STR_0921 :{SMALLFONT}{BLACK}상승 +STR_0922 :{SMALLFONT}{BLACK}급상승 +STR_0923 :{SMALLFONT}{BLACK}수직 상승 +STR_0924 :{SMALLFONT}{BLACK}나선 하강 +STR_0925 :{SMALLFONT}{BLACK}나선 상승 +STR_0926 :여기를 제거할 수 없습니다... +STR_0927 :여기에 건설할 수 없습니다... +STR_0928 :{SMALLFONT}{BLACK}경사를 오르기 위한 체인 리프트 +STR_0929 :S자 트랙 (왼쪽) +STR_0930 :S자 트랙 (오른쪽) +STR_0931 :버티컬 루프 (왼쪽) +STR_0932 :버티컬 루프 (오른쪽) +STR_0933 :땅을 먼저 올리거나 내리세요 +STR_0934 :놀이기구 입구가 있습니다 +STR_0935 :놀이기구 출구가 있습니다 +STR_0936 :공원 입구가 있습니다 +STR_0937 :{SMALLFONT}{BLACK}보기 설정 +STR_0938 :{SMALLFONT}{BLACK}지형 높이와 경사를 보여줌 +STR_0939 :지하/내부 시야 +STR_0940 :땅 안 보이기 +STR_0941 :절벽 안 보이기 +STR_0942 :놀이기구 안 보이기 +STR_0943 :풍경 안 보이기 +STR_0944 :저장 +STR_0945 :저장하지 않음 +STR_0946 :취소 +STR_0947 :불러오기 전에 저장하시겠습니까? +STR_0948 :종료하기 전에 저장하시겠습니까? +STR_0949 :종료하기 전에 저장하시겠습니까? +STR_0950 :게임 불러오기 +STR_0951 :게임 종료하기 +STR_0952 :게임 종료하기 +STR_0953 :풍경 불러오기 +STR_0954 : +STR_0955 :{SMALLFONT}{BLACK}이 트랙 조각에서의 좌석 회전 각도를 선택하세요 +STR_0956 :-180{DEGREE} +STR_0957 :-135{DEGREE} +STR_0958 :-90{DEGREE} +STR_0959 :-45{DEGREE} +STR_0960 :0{DEGREE} +STR_0961 :+45{DEGREE} +STR_0962 :+90{DEGREE} +STR_0963 :+135{DEGREE} +STR_0964 :+180{DEGREE} +STR_0965 :+225{DEGREE} +STR_0966 :+270{DEGREE} +STR_0967 :+315{DEGREE} +STR_0968 :+360{DEGREE} +STR_0969 :+405{DEGREE} +STR_0970 :+450{DEGREE} +STR_0971 :+495{DEGREE} +STR_0972 :취소 +STR_0973 :확인 +STR_0974 :놀이기구 +STR_0975 :상점·매점 +STR_0976 :화장실 및 안내소 +STR_0977 :새로운 운송용 놀이기구 +STR_0978 :새로운 얌전한 놀이기구 +STR_0979 :새로운 롤러코스터 +STR_0980 :새로운 스릴있는 놀이기구 +STR_0981 :새로운 물 놀이기구 +STR_0982 :새로운 상점·매점 +STR_0983 :연구 & 개발 +STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} +STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP} +STR_0986 :{BLACK}{CURRENCY2DP} +STR_0987 :놀이기구나 시설이 너무 많습니다 +STR_0988 :새 놀이기구나 시설을 만들 수 없습니다... +STR_0989 :{STRINGID} +STR_0990 :{SMALLFONT}{BLACK}건설 +STR_0991 :탑승장 선택 +STR_0992 :{SMALLFONT}{BLACK}전체 놀이기구나 시설을 파괴합니다 +STR_0993 :놀이기구/시설 파괴 +STR_0994 :파괴 +STR_0995 :{WINDOW_COLOUR_1}정말 이 놀이기구/시설을 완전히 파괴하시겠습니까? : {STRINGID} +STR_0996 :전경 +STR_0997 :{SMALLFONT}{BLACK}시야 선택 +STR_0998 :탑승장이 너무 많습니다 +STR_0999 :탑승장이 필요합니다 +STR_1000 :트랙이 완성되지 않았습니다 +STR_1001 :트랙이 열차 종류와 맞지 않습니다 +STR_1002 :{POP16}{POP16}{POP16}{STRINGID}(을)를 운행할 수 없습니다... +STR_1003 :Can't test {POP16}{POP16}{POP16}{STRINGID}(을)를 테스트할 수 없습니다... +STR_1004 :{POP16}{POP16}{POP16}{STRINGID}(을)를 닫을 수 없습니다... +STR_1005 :{POP16}{POP16}{POP16}{STRINGID}의 건설을 시작할 수 없습니다... +STR_1006 :먼저 닫아야 합니다 +STR_1007 :차량을 충분히 만들 수 없습니다 +STR_1008 :{SMALLFONT}{BLACK}놀이기구나 시설을 열거나, 닫거나 테스트합니다 +STR_1009 :{SMALLFONT}{BLACK}모든 놀이기구나 시설을 열거나 닫습니다 +STR_1010 :{SMALLFONT}{BLACK}공원을 열거나 닫습니다 +STR_1011 :모두 닫기 +STR_1012 :모두 열기 +STR_1013 :공원 닫기 +STR_1014 :공원 열기 +STR_1015 :Unable to operate with more than one station platform in this mode +STR_1016 :Unable to operate with less than two stations in this mode +STR_1017 :Can't change operating mode... +STR_1018 :Can't make changes... +STR_1019 :Can't make changes... +STR_1020 :Can't make changes... +STR_1021 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_1022 :1대당 {POP16}{POP16}{POP16}{COMMA16}량의 차량 +STR_1023 :1대당 {POP16}{POP16}{POP16}{COMMA16}량의 차량 +STR_1024 :1대당 {COMMA16}량의 차량 +STR_1025 :1대당 {COMMA16}량의 차량 +STR_1026 :탑승장이 너무 깁니다! +STR_1027 :{SMALLFONT}{BLACK}Locate this on Main View +STR_1028 :지도 끝을 벗어납니다! +STR_1029 :Cannot build partly above and partly below water! +STR_1030 :Can only build this underwater! +STR_1031 :Can't build this underwater! +STR_1032 :Can only build this on water! +STR_1033 :Can only build this above ground! +STR_1034 :Can only build this on land! +STR_1035 :Local authority won't allow construction above tree-height! +STR_1036 :게임 불러오기 +STR_1037 :풍경 불러오기 +STR_1038 :저장된 게임을 시나리오로 변환 +STR_1039 :새 트랙 디자인을 설치 +STR_1040 :게임 저장하기 +STR_1041 :시나리오 저장하기 +STR_1042 :풍경 저장하기 +STR_1043 :OpenRCT2 저장된 게임 파일 +STR_1044 :OpenRCT2 시나리오 파일 +STR_1045 :OpenRCT2 풍경 파일 +STR_1046 :OpenRCT2 트랙 디자인 파일 +STR_1047 :게임 저장 실패! +STR_1048 :시나리오 저장 실패 +STR_1049 :풍경 저장 실패! +STR_1050 :불러오기 실패...{NEWLINE}파일에 유효하지 않은 데이터가 있습니다! +STR_1051 :트랙 지지대 감추기 +STR_1052 :손님 감추기 +STR_1053 :{SMALLFONT}{BLACK}공원의 놀이기구나 시설 +STR_1054 :{SMALLFONT}{BLACK}놀이기구/시설 이름 +STR_1055 :{SMALLFONT}{BLACK}손님 이름 +STR_1056 :{SMALLFONT}{BLACK}직원 이름 +STR_1057 :놀이기구/시설 이름 +STR_1058 :이 놀이기구/시설의 새 이름을 입력하세요: +STR_1059 :놀이기구/시설의 이름을 바꿀 수 없습니다... +STR_1060 :유효하지 않은 놀이기구/시설의 이름입니다 +STR_1061 :일반 모드 +STR_1062 :연속 순환 모드 +STR_1063 :역방향 인클라인 발진 셔틀 모드 +STR_1064 :급발진 출발 (역 통과) +STR_1065 :셔틀 모드 +STR_1066 :보트 대여 모드 +STR_1067 :상승 발진 +STR_1068 :리프트 회전 모드 +STR_1069 :역 대 역 모드 +STR_1070 :1회 탑승 모드 +STR_1071 :무한 탑승 모드 +STR_1072 :미로 모드 +STR_1073 :레이스 모드 +STR_1074 :범퍼카 모드 +STR_1075 :스윙 모드 +STR_1076 :상점 매점 모드 +STR_1077 :회전 모드 +STR_1078 :전진 회전 +STR_1079 :후진 회전 +STR_1080 :영화: {ENDQUOTES}비행사의 복수사{ENDQUOTES} +STR_1081 :3D 영화: {ENDQUOTES}생쥐의 꼬리{ENDQUOTES} +STR_1082 :스페이스 링 모드 +STR_1083 :초급 모드 +STR_1084 :LIM-파워 발진 +STR_1085 :영화: {ENDQUOTES}스릴 라이더{ENDQUOTES} +STR_1086 :3D 영화: {ENDQUOTES}폭풍의 추적자{ENDQUOTES} +STR_1087 :3D 영화: {ENDQUOTES}스페이스 라이더{ENDQUOTES} +STR_1088 :격렬 모드 +STR_1089 :난폭 모드 +STR_1090 :귀신의 집 모드 +STR_1091 :서커스 쇼 모드 +STR_1092 :하향 발진 +STR_1093 :이상한 집 모드 +STR_1094 :자유낙하 모드 +STR_1095 :연속 순환 블록 섹션 모드 +STR_1096 :급발진 출발 (역을 지나치지 않음) +STR_1097 :급발진 출발 블록 섹션 모드 +STR_1098 :{POP16}{STRINGID}의 끝으로 이동 +STR_1099 :{POP16}{STRINGID}에서 승객 탑승 대기 중 +STR_1100 :{POP16}{STRINGID}에서 출발 대기중 +STR_1101 :{POP16}{STRINGID} 출발 중 +STR_1102 :운행 중 : {VELOCITY} +STR_1103 :{POP16}{STRINGID}에 도착 중 +STR_1104 :{POP16}{STRINGID}에서 승객 하차 중 +STR_1105 :운행 중 : {VELOCITY} +STR_1106 :충돌 중! +STR_1107 :충돌! +STR_1108 :운행 중 : {VELOCITY} +STR_1109 :스윙 중 +STR_1110 :회전 중 +STR_1111 :회전 중 +STR_1112 :운행 중 +STR_1113 :영화 상영 중 +STR_1114 :회전 중 +STR_1115 :운행 중 +STR_1116 :운행 중 +STR_1117 :서커스 쇼 진행 중 +STR_1118 :운행 중 +STR_1119 :케이블 리프트를 기다리는 중 +STR_1120 :운행 중 : {VELOCITY} +STR_1121 :정지하는 중 +STR_1122 :승객 대기 중 +STR_1123 :출발 대기 중 +STR_1124 :출발 중 +STR_1125 :운행 중 +STR_1126 :정지하는 중 +STR_1127 :승객 하차 중 +STR_1128 :블록 브레이크에 의해 정지함 +STR_1129 :모든 차량을 같은 색으로 +STR_1130 :{STRINGID} 마다 다른 색 +STR_1131 :차량 마다 다른 색 +STR_1132 :차량 {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1133 :차량 {POP16}{COMMA16} +STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} +STR_1135 :{STRINGID} {COMMA16} +STR_1136 :{SMALLFONT}{BLACK}주요 색상 선택하세요 +STR_1137 :{SMALLFONT}{BLACK}1번 추가 색상 선택하세요 +STR_1138 :{SMALLFONT}{BLACK}2번 추가 색상 선택하세요 +STR_1139 :{SMALLFONT}{BLACK}트랙 지지대 색상 선택하세요 +STR_1140 :{SMALLFONT}{BLACK}차량 색상을 선택하세요 +STR_1141 :{SMALLFONT}{BLACK}어떤 차량/열차를 수정할 지 선택하세요 +STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} +STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} +STR_1144 :이 놀이기구/시설의 입구를 건설/파괴할 수 없습니다... +STR_1145 :이 놀이기구/시설의 출구를 건설/파괴할 수 없습니다... +STR_1146 :입구가 아직 설치되지 않았습니다 +STR_1147 :출구가 아직 설치되지 않았습니다 +STR_1148 :1/4을 태우면 +STR_1149 :1/2을 태우면 +STR_1150 :3/4을 태우면 +STR_1151 :모두 태우면 +STR_1152 :한 사람이라도 태우면 +STR_1153 :놀이기구 트랙 높이 표시 +STR_1154 :지형 높이 표시 +STR_1155 :보도 높이 표시 +STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} +STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} +STR_1158 :제거할 수 없습니다... +STR_1159 :{SMALLFONT}{BLACK}풍경, 정원, 기타 시설을 설치합니다 +STR_1160 :{SMALLFONT}{BLACK}호수나 물을 만듭니다 +STR_1161 :여기에 위치시킬 수 없습니다... +STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} +STR_1163 :{STRINGID}{NEWLINE}(수정하려면 오른쪽 클릭하세요) +STR_1164 :{STRINGID}{NEWLINE}(제거하려면 오른쪽 클릭하세요) +STR_1165 :{STRINGID} - {STRINGID} {COMMA16} +STR_1166 :이곳의 물을 내릴 수 없습니다... +STR_1167 :이곳의 물을 올릴 수 없습니다... +STR_1168 :옵션 +STR_1169 :(없음) +STR_1170 :{STRING} +STR_1171 :{RED}닫음 - - +STR_1172 :{YELLOW}{STRINGID} - - +STR_1173 :{SMALLFONT}{BLACK}보도와 대기줄을 만듭니다 +STR_1174 :배너 사인이 있습니다 +STR_1175 :경사진 보도 위에 건설할 수 없습니다 +STR_1176 :보도를 여기에 건설할 수 없습니다... +STR_1177 :보도를 제거할 수 없습니다... +STR_1178 :땅의 경사가 적절하지 않습니다 +STR_1179 :중간에 보도가 있습니다 +STR_1180 :수중에 건설할 수 없습니다! +STR_1181 :보도 +STR_1182 :종류 +STR_1183 :방향 +STR_1184 :경사 +STR_1185 :{SMALLFONT}{BLACK}방향 +STR_1186 :{SMALLFONT}{BLACK}아래로 +STR_1187 :{SMALLFONT}{BLACK}평탄 +STR_1188 :{SMALLFONT}{BLACK}위로 +STR_1189 :{SMALLFONT}{BLACK}선택한 보도 조각을 건설 +STR_1190 :{SMALLFONT}{BLACK}이전 보도 조각을 제거 +STR_1191 :{BLACK}{STRINGID} +STR_1192 :{OUTLINE}{RED}{STRINGID} +STR_1193 :{WINDOW_COLOUR_2}{STRINGID} +STR_1194 :닫힘 +STR_1195 :테스트 운행 +STR_1196 :열림 +STR_1197 :고장 +STR_1198 :충돌! +STR_1199 :놀이기구에 {COMMA16}명 있음 +STR_1200 :놀이기구에 {COMMA16}명 있음 +STR_1201 :대기 중인 손님: 없음 +STR_1202 :대기 중인 손님: 1명 +STR_1203 :대기 중인 손님: {COMMA16}명 +STR_1204 :대기 시간: {COMMA16}분 +STR_1205 :대기 시간: {COMMA16}분 +STR_1206 :{WINDOW_COLOUR_2}출발 대기: +STR_1207 :{WINDOW_COLOUR_2}다른 열차가 탑승장에 도착하면 열차를 출발시킴 +STR_1208 :{WINDOW_COLOUR_2}다른 보트가 탑승장에 도착하면 보트를 출발시킴 +STR_1209 :{SMALLFONT}{BLACK}출발하기 전에 승객을 기다릴지 여부를 선택하세요 +STR_1210 :{SMALLFONT}{BLACK}다른 차량이 같은 탑승장에 도착하면 열차를 출발시킬지 여부를 선택하세요 +STR_1211 :{WINDOW_COLOUR_2}최소 대기 시간: +STR_1212 :{WINDOW_COLOUR_2}최대 대기 시간: +STR_1213 :{SMALLFONT}{BLACK}출발하기 전에 최소한으로 기다릴 시간 길이를 선택하세요 +STR_1214 :{SMALLFONT}{BLACK}출발하기 전에 최대한으로 기다릴 시간 길이를 선택하세요 +STR_1215 :{WINDOW_COLOUR_2}인접한 탑승장과 같이 출발시킴 +STR_1216 :{SMALLFONT}{BLACK}모든 인접한 탑승장과 차량을 동시에 출발시킬지 여부를 선택하세요 +STR_1217 :{COMMA16}초 +STR_1218 :{BLACK}{SMALLUP} +STR_1219 :{BLACK}{SMALLDOWN} +STR_1220 :출구만 있음 +STR_1221 :입구 없음 +STR_1222 :출구 없음 +STR_1223 :{SMALLFONT}{BLACK}운송용 놀이기구 +STR_1224 :{SMALLFONT}{BLACK}얌전한 놀이기구 +STR_1225 :{SMALLFONT}{BLACK}롤러코스터 +STR_1226 :{SMALLFONT}{BLACK}스릴있는 놀이기구 +STR_1227 :{SMALLFONT}{BLACK}물 놀이기구 +STR_1228 :{SMALLFONT}{BLACK}상점 & 매점 +STR_1229 :열차 +STR_1230 :열차 +STR_1231 :열차 +STR_1232 :열차 +STR_1233 :{COMMA16} 열차 +STR_1234 :{COMMA16} 열차 +STR_1235 :열차 {COMMA16} +STR_1236 :보트 +STR_1237 :보트 +STR_1238 :보트 +STR_1239 :보트 +STR_1240 :{COMMA16} 보트 +STR_1241 :{COMMA16} 보트 +STR_1242 :보트 {COMMA16} +STR_1243 :트랙 +STR_1244 :트랙 +STR_1245 :트랙 +STR_1246 :트랙 +STR_1247 :{COMMA16} 트랙 +STR_1248 :{COMMA16} 트랙 +STR_1249 :트랙 {COMMA16} +STR_1250 :도킹 승강장 +STR_1251 :도킹 승강장 +STR_1252 :도킹 승강장 +STR_1253 :도킹 승강장 +STR_1254 :{COMMA16} 도킹 승강장 +STR_1255 :{COMMA16} 도킹 승강장 +STR_1256 :도킹 승강장 {COMMA16} +STR_1257 :탑승장 +STR_1258 :탑승장 +STR_1259 :탑승장 +STR_1260 :탑승장 +STR_1261 :{COMMA16} 탑승장 +STR_1262 :{COMMA16} 탑승장 +STR_1263 :탑승장 {COMMA16} +STR_1264 :차 +STR_1265 :차 +STR_1266 :차 +STR_1267 :차 +STR_1268 :{COMMA16} 차 +STR_1269 :{COMMA16} 차 +STR_1270 :차 {COMMA16} +STR_1271 :건물 +STR_1272 :건물 +STR_1273 :건물 +STR_1274 :건물 +STR_1275 :{COMMA16} 건물 +STR_1276 :{COMMA16} 건물 +STR_1277 :건물 {COMMA16} +STR_1278 :구조물 +STR_1279 :구조물 +STR_1280 :구조물 +STR_1281 :구조물 +STR_1282 :{COMMA16} 구조물 +STR_1283 :{COMMA16} 구조물 +STR_1284 :구조물 {COMMA16} +STR_1285 :배 +STR_1286 :배 +STR_1287 :배 +STR_1288 :배 +STR_1289 :{COMMA16} 배 +STR_1290 :{COMMA16} 배 +STR_1291 :배 {COMMA16} +STR_1292 :객실 +STR_1293 :객실 +STR_1294 :객실 +STR_1295 :객실 +STR_1296 :{COMMA16} 객실 +STR_1297 :{COMMA16} 객실 +STR_1298 :객실 {COMMA16} +STR_1299 :휠 +STR_1300 :휠 +STR_1301 :휠 +STR_1302 :휠 +STR_1303 :{COMMA16} 휠 +STR_1304 :{COMMA16} 휠 +STR_1305 :휠 {COMMA16} +STR_1306 :링 +STR_1307 :링 +STR_1308 :링 +STR_1309 :링 +STR_1310 :{COMMA16} 링 +STR_1311 :{COMMA16} 링 +STR_1312 :링 {COMMA16} +STR_1313 :플레이어 +STR_1314 :플레이어 +STR_1315 :플레이어 +STR_1316 :플레이어 +STR_1317 :{COMMA16} 플레이어 +STR_1318 :{COMMA16} 플레이어 +STR_1319 :플레이어 {COMMA16} +STR_1320 :코스 +STR_1321 :코스 +STR_1322 :코스 +STR_1323 :코스 +STR_1324 :{COMMA16} 코스 +STR_1325 :{COMMA16} 코스 +STR_1326 :코스 {COMMA16} +STR_1327 :{SMALLFONT}{BLACK}오브젝트를 90{DEGREE} 회전시킵니다 +STR_1328 :평지가 필요합니다 +STR_1329 :{WINDOW_COLOUR_2}발진 속도: +STR_1330 :{SMALLFONT}{BLACK}탑승장 출발 최대 속도 +STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_1332 :{VELOCITY} +STR_1333 :{STRINGID} - {STRINGID}{POP16} +STR_1334 :{STRINGID} - {STRINGID} {COMMA16} +STR_1335 :{STRINGID} - 입구{POP16}{POP16} +STR_1336 :{STRINGID} - 탑승장 {POP16}{COMMA16} 입구 +STR_1337 :{STRINGID} - 출구{POP16}{POP16} +STR_1338 :{STRINGID} - 탑승장 {POP16}{COMMA16} 출구 +STR_1339 :{BLACK}테스트 결과가 아직 나오지 않았습니다... +STR_1340 :{WINDOW_COLOUR_2}최대 속력: {BLACK}{VELOCITY} +STR_1341 :{WINDOW_COLOUR_2}탑승 시간: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1342 :{DURATION} +STR_1343 :{DURATION} / +STR_1344 :{WINDOW_COLOUR_2}탑승 길이: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1345 :{LENGTH} +STR_1346 :{LENGTH} / +STR_1347 :{WINDOW_COLOUR_2}평균 속력: {BLACK}{VELOCITY} +STR_1348 :{WINDOW_COLOUR_2}최대 양수 수직 중력값: {BLACK}{COMMA2DP32}g +STR_1349 :{WINDOW_COLOUR_2}최대 양수 수직 중력값: {OUTLINE}{RED}{COMMA2DP32}g +STR_1350 :{WINDOW_COLOUR_2}최대 음수 수직 중력값: {BLACK}{COMMA2DP32}g +STR_1351 :{WINDOW_COLOUR_2}최대 음수 수직 중력값: {OUTLINE}{RED}{COMMA2DP32}g +STR_1352 :{WINDOW_COLOUR_2}최대 측면 중력값: {BLACK}{COMMA2DP32}g +STR_1353 :{WINDOW_COLOUR_2}최대 측면 중력값: {OUTLINE}{RED}{COMMA2DP32}g +STR_1354 :{WINDOW_COLOUR_2}최고 낙하 높이: {BLACK}{LENGTH} +STR_1355 :{WINDOW_COLOUR_2}낙하 회수: {BLACK}{COMMA16} +STR_1356 :{WINDOW_COLOUR_2}뒤집어진 회수: {BLACK}{COMMA16} +STR_1357 :{WINDOW_COLOUR_2}홀 개수: {BLACK}{COMMA16} +STR_1358 :{WINDOW_COLOUR_2}총 '무중력' 시간: {BLACK}{COMMA2DP32}초 +STR_1359 :{WINDOW_COLOUR_2}대기 시간: {BLACK}{COMMA16}분 +STR_1360 :{WINDOW_COLOUR_2}대기 시간: {BLACK}{COMMA16}분 +STR_1361 :속력을 바꿀 수 없습니다... +STR_1362 :발진 속도를 바꿀 수 없습니다... +STR_1363 :지지대가 버틸 수 있는 최대 높이입니다! +STR_1364 :위 트랙의 지지대를 더 이상 늘릴 수 없습니다! +STR_1365 :인라인 트위스트 (왼쪽) +STR_1366 :인라인 트위스트 (오른쪽) +STR_1367 :하프 루프 +STR_1368 :하프 코르크스크류 (왼쪽) +STR_1369 :하프 코르크스크류 (오른쪽) +STR_1370 :바렐 롤 (왼쪽) +STR_1371 :바렐 롤 (오른쪽) +STR_1372 :런치드 리프트 힐 +STR_1373 :대형 하프 루프 (왼쪽) +STR_1374 :대형 하프 루프 (오른쪽) +STR_1375 :위쪽 전송기 +STR_1376 :아래쪽 전송기 +STR_1377 :하트라인 롤 (왼쪽) +STR_1378 :하트라인 롤 (오른쪽) +STR_1379 :리버서 (왼쪽) +STR_1380 :리버서 (오른쪽) +STR_1381 :커브드 리프트 힐 (왼쪽) +STR_1382 :커브드 리프트 힐 (오른쪽) +STR_1383 :1/4 루프 +STR_1384 :{YELLOW}{STRINGID} +STR_1385 :{SMALLFONT}{BLACK}기타 트랙 설정 +STR_1386 :특수 트랙... +STR_1387 :지형 종류를 바꿀 수 없습니다... +STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} +STR_1389 :{OUTLINE}{RED}- {CURRENCY} +STR_1390 :{CURRENCY2DP} +STR_1391 :{RED}{CURRENCY2DP} +STR_1392 :{SMALLFONT}{BLACK}놀이기구/시설 전경 +STR_1393 :{SMALLFONT}{BLACK}차량 상세 설정 +STR_1394 :{SMALLFONT}{BLACK}운행 설정 +STR_1395 :{SMALLFONT}{BLACK}유지 설정 +STR_1396 :{SMALLFONT}{BLACK}색상 설정 +STR_1397 :{SMALLFONT}{BLACK}효과음 & 배경음악 설정 +STR_1398 :{SMALLFONT}{BLACK}측정 및 테스트 데이터 +STR_1399 :{SMALLFONT}{BLACK}그래프 +STR_1400 :입구 +STR_1401 :출구 +STR_1402 :{SMALLFONT}{BLACK}놀이기구/시설의 입구를 건설하거나 이동합니다 +STR_1403 :{SMALLFONT}{BLACK}놀이기구/시설의 출구를 건설하거나 이동합니다 +STR_1404 :{SMALLFONT}{BLACK}90{DEGREE} 회전 +STR_1405 :{SMALLFONT}{BLACK}반전 +STR_1406 :{SMALLFONT}{BLACK}풍경을 켜거나 끕니다 (단 사용할 수 있는 경우에만 켜짐) +STR_1407 :{WINDOW_COLOUR_2}건설하기... +STR_1408 :{WINDOW_COLOUR_2}예상 가격: {BLACK}{CURRENCY} +STR_1409 :탑승장 출입구 +STR_1410 :버티컬 타워 +STR_1411 :{STRINGID}(이)가 중간에 있습니다 +STR_1412 :{WINDOW_COLOUR_3}이 종류의 놀이기구는 데이터를 기록할 수 없습니다 +STR_1413 :{WINDOW_COLOUR_3}다음 {STRINGID}(이)가 {STRINGID}(을)를 출발할 때 데이터를 기록합니다 +STR_1414 :{SMALLFONT}{BLACK}{DURATION} +STR_1415 :{WINDOW_COLOUR_2}속력 +STR_1416 :{WINDOW_COLOUR_2}고도 +STR_1417 :{WINDOW_COLOUR_2}수직 중력 +STR_1418 :{WINDOW_COLOUR_2}측면 중력 +STR_1419 :{SMALLFONT}{BLACK}{VELOCITY} +STR_1420 :{SMALLFONT}{BLACK}{LENGTH} +STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g +STR_1422 :{SMALLFONT}{BLACK}{POP16}{STRINGID}로부터 데이터 기록 중 +STR_1423 :{SMALLFONT}{BLACK}대기줄 +STR_1424 :{SMALLFONT}{BLACK}보도 +STR_1425 :보도 +STR_1426 :대기줄 +STR_1427 :{WINDOW_COLOUR_2}손님: {BLACK}{COMMA32}명/시간 +STR_1428 :{WINDOW_COLOUR_2}입장료: +STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1430 :Free +STR_1431 :걷는 중 +STR_1432 :{STRINGID}(으)로 향하는 중 +STR_1433 :{STRINGID}(에)서 대기 중 +STR_1434 :물에 빠짐 +STR_1435 :{STRINGID} 위에 +STR_1436 :{STRINGID} 안에 +STR_1437 :{STRINGID}에 +STR_1438 :앉음 +STR_1439 :(위치를 선택하세요) +STR_1440 :잔디 깎는 중 +STR_1441 :보도 청소 중 +STR_1442 :쓰레기통 비우는 중 +STR_1443 :정원에 물을 주는 중 +STR_1444 :{STRINGID}(을)를 보는 중 +STR_1445 :{STRINGID}의 건설 장면을 보는 중 +STR_1446 :풍경을 보는 중 +STR_1447 :공원을 떠나는 중 +STR_1448 :새 놀이기구가 건설되는 장면을 보는 중 +STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) +STR_1452 :손님의 이름 +STR_1453 :이 손님의 이름을 입력하세요: +STR_1454 :손님의 이름을 바꿀 수 없습니다... +STR_1455 :손님 이름으로 적합하지 않습니다 +STR_1456 :{WINDOW_COLOUR_2}사용한 돈: {BLACK}{CURRENCY2DP} +STR_1457 :{WINDOW_COLOUR_2}보유한 돈: {BLACK}{CURRENCY2DP} +STR_1458 :{WINDOW_COLOUR_2}공원에 머무른 시간: {BLACK}{REALTIME} +STR_1459 :트랙 스타일 +STR_1460 :{SMALLFONT}{BLACK}'U' 모양의 천장이 없는 트랙 +STR_1461 :{SMALLFONT}{BLACK}'O' 모양의 천장이 있는 트랙 +STR_1462 :리프트 힐을 쓰기엔 너무 경사가 급합니다 +STR_1463 :손님 +STR_1464 :나선 상승 (작음) +STR_1465 :나선 상승 (큼) +STR_1466 :나선 하강 (작음) +STR_1467 :나선 하강 (큼) +STR_1468 :직원 +STR_1469 :놀이기구는 탑승장에서 시작하고 끝나야 합니다 +STR_1470 :탑승장이 충분히 길지 않습니다 +STR_1471 :{WINDOW_COLOUR_2}속력: +STR_1472 :{SMALLFONT}{BLACK}이 놀이기구의 속력 +STR_1473 :{WINDOW_COLOUR_2}흥미도: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1474 :{WINDOW_COLOUR_2}흥미도: {BLACK}아직 조회할 수 없음 +STR_1475 :{WINDOW_COLOUR_2}격렬도: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1476 :{WINDOW_COLOUR_2}격렬도: {BLACK}아직 조회할 수 없음 +STR_1477 :{WINDOW_COLOUR_2}격렬도: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) +STR_1478 :{WINDOW_COLOUR_2}멀미도: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1479 :{WINDOW_COLOUR_2}멀미도: {BLACK}아직 조회할 수 없음 +STR_1480 :{SMALLFONT}{OPENQUOTES}{STRINGID}에 쓸 돈은 없어{ENDQUOTES} +STR_1481 :{SMALLFONT}{OPENQUOTES}내 돈을 전부 다 써버렸어{ENDQUOTES} +STR_1482 :{SMALLFONT}{OPENQUOTES}속이 메스꺼워{ENDQUOTES} +STR_1483 :{SMALLFONT}{OPENQUOTES}속이 정말 메스꺼워{ENDQUOTES} +STR_1484 :{SMALLFONT}{OPENQUOTES}{STRINGID}보다 더 스릴있는 걸 타고 싶어{ENDQUOTES} +STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID}(은)는 내가 타기엔 너무 격렬해 보여{ENDQUOTES} +STR_1486 :{SMALLFONT}{OPENQUOTES}아직 {STRINGID}(을)를 다 먹지 않았어{ENDQUOTES} +STR_1487 :{SMALLFONT}{OPENQUOTES}{STRINGID}(은)는 바라만 봐도 속이 메스꺼워{ENDQUOTES} +STR_1488 :{SMALLFONT}{OPENQUOTES}{STRINGID}에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1489 :{SMALLFONT}{OPENQUOTES}집에 가고 싶어{ENDQUOTES} +STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID}(은)는 정말 가격이 좋아{ENDQUOTES} +STR_1491 :{SMALLFONT}{OPENQUOTES}{STRINGID}(을)를 이미 갖고 있어{ENDQUOTES} +STR_1492 :{SMALLFONT}{OPENQUOTES}{STRINGID}에 쓸 돈은 없어{ENDQUOTES} +STR_1493 :{SMALLFONT}{OPENQUOTES}배고프지 않아{ENDQUOTES} +STR_1494 :{SMALLFONT}{OPENQUOTES}목마르지 않아{ENDQUOTES} +STR_1495 :{SMALLFONT}{OPENQUOTES}살려주세요! 물에 빠졌어요!{ENDQUOTES} +STR_1496 :{SMALLFONT}{OPENQUOTES}길을 잃어버렸어!{ENDQUOTES} +STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID}(은)는 정말 훌륭했어{ENDQUOTES} +STR_1498 :{SMALLFONT}{OPENQUOTES}{STRINGID}(을)를 타려고 한참동안이나 기다렸어{ENDQUOTES} +STR_1499 :{SMALLFONT}{OPENQUOTES}피곤해{ENDQUOTES} +STR_1500 :{SMALLFONT}{OPENQUOTES}배고파{ENDQUOTES} +STR_1501 :{SMALLFONT}{OPENQUOTES}목말라{ENDQUOTES} +STR_1502 :{SMALLFONT}{OPENQUOTES}화장실에 가야겠어{ENDQUOTES} +STR_1503 :{SMALLFONT}{OPENQUOTES}{STRINGID}(을)를 못 찾겠어{ENDQUOTES} +STR_1504 :{SMALLFONT}{OPENQUOTES}{STRINGID}(을)를 이용하는데 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1505 :{SMALLFONT}{OPENQUOTES}비가 오는 동안에는 {STRINGID}에 가지 않을래{ENDQUOTES} +STR_1506 :{SMALLFONT}{OPENQUOTES}여기는 쓰레기가 여기 저기 널려있어{ENDQUOTES} +STR_1507 :{SMALLFONT}{OPENQUOTES}공원 출구를 찾을 수 없어{ENDQUOTES} +STR_1508 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 내리고 싶어{ENDQUOTES} +STR_1509 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 나가고 싶어{ENDQUOTES} +STR_1510 :{SMALLFONT}{OPENQUOTES}{STRINGID}(은)는 안전하지 않아서 가지 않을래{ENDQUOTES} +STR_1511 :{SMALLFONT}{OPENQUOTES}이 길은 역겨워{ENDQUOTES} +STR_1512 :{SMALLFONT}{OPENQUOTES}여긴 사람이 너무 많아{ENDQUOTES} +STR_1513 :{SMALLFONT}{OPENQUOTES}여기는 시설이 막 파괴되어 있어{ENDQUOTES} +STR_1514 :{SMALLFONT}{OPENQUOTES}풍경이 참 좋다!{ENDQUOTES} +STR_1515 :{SMALLFONT}{OPENQUOTES}이 공원은 정말 깨끗하고 깔끔한 것 같아{ENDQUOTES} +STR_1516 :{SMALLFONT}{OPENQUOTES}분수대가 참 훌륭해{ENDQUOTES} +STR_1517 :{SMALLFONT}{OPENQUOTES}여기 음악 좋다{ENDQUOTES} +STR_1518 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 풍선은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1519 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 캐릭터 인형은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1520 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 공원 지도는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1521 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 탑승 사진은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1522 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 우산은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1523 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 음료수는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1524 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 햄버거는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 감자칩은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1526 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 아이스크림은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 솜사탕은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1528 : +STR_1529 : +STR_1530 : +STR_1531 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 피자는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1532 : +STR_1533 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 팝콘은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1534 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 핫도그는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1535 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 문어발은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1536 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 모자는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 사과 토피 사탕은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1538 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 티셔츠는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 도넛은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1540 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 커피는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1541 : +STR_1542 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 프라이드 치킨은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1543 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 레모네이드는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1544 : +STR_1545 : +STR_1546 : +STR_1547 : +STR_1548 : +STR_1549 : +STR_1550 :{SMALLFONT}{OPENQUOTES}와우!{ENDQUOTES} +STR_1551 :{SMALLFONT}{OPENQUOTES}누가 지켜보는 것 같은 이상한 기분이 들어{ENDQUOTES} +STR_1552 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 풍선에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1553 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 캐릭터 인형에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1554 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 공원 지도에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1555 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 탑승 사진에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1556 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 우산에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1557 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 음료수에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1558 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 햄버거에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 감자칩에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1560 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 아이스크립에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 솜사탕에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1562 : +STR_1563 : +STR_1564 : +STR_1565 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 피자에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1566 : +STR_1567 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 팝콘에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1568 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 핫도그에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1569 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 문어발에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1570 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 모자에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 사과 토피 사탕에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1572 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 티셔츠에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 도넛에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1574 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 커피에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1575 : +STR_1576 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 프라이드 치킨에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1577 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 레모네이드에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1578 : +STR_1579 : +STR_1580 : +STR_1581 : +STR_1582 : +STR_1583 : +STR_1584 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 탑승 사진은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1585 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 탑승 사진은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1586 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 탑승 사진은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1587 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 프레첼은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1588 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 핫 초코는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1589 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 아이스 티는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1590 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 휜넬 케이크는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1591 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 선글라스는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1592 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 고기 국수는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1593 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 볶음밥은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1594 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 만둣국은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1595 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 미트볼 스프는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1596 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 과일 주스는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1597 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 두유는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1598 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 수정과는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1599 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 샌드위치는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1600 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 쿠키는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1601 : +STR_1602 : +STR_1603 : +STR_1604 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 구운 소시지는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1605 : +STR_1606 : +STR_1607 : +STR_1608 : +STR_1609 : +STR_1610 : +STR_1611 : +STR_1612 : +STR_1613 : +STR_1614 : +STR_1615 : +STR_1616 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 탑승 사진에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1617 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 탑승 사진에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1618 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 탑승 사진에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1619 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 프레첼에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1620 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 핫 초코에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1621 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 아이스 티에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1622 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 휜넬 케이크에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1623 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 선글라스에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1624 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 고기 국수에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1625 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 볶음밥에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1626 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 만둣국에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1627 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 미트볼 스프에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1628 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 과일 주스에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1629 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 두유에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1630 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 수정과에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1631 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 샌드위치에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1632 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 쿠키에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1633 : +STR_1634 : +STR_1635 : +STR_1636 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 구운 소시지에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1637 : +STR_1638 : +STR_1639 : +STR_1640 : +STR_1641 : +STR_1642 : +STR_1643 : +STR_1644 : +STR_1645 : +STR_1646 : +STR_1647 : +STR_1648 :{SMALLFONT}{OPENQUOTES}살려주세요! 절 내려주세요!{ENDQUOTES} +STR_1649 :{SMALLFONT}{OPENQUOTES}돈이 다 떨어져가고 있어요!{ENDQUOTES} +STR_1650 :{SMALLFONT}{OPENQUOTES}와우! 새 놀이기구가 지어지고 있어요!{ENDQUOTES} +STR_1651 :{SMALLFONT}{OPENQUOTES}멋진 놀이기구에요! 하지만 피닉스만큼 멋지진 않네요...{ENDQUOTES} +STR_1652 :{SMALLFONT}{OPENQUOTES}정말 흥분돼요! 인타민 공원의 놀이기구에요!{ENDQUOTES} +STR_1653 :{SMALLFONT}{OPENQUOTES}...그리고 드디어 {STRINGID}에 왔어요!{ENDQUOTES} +STR_1654 :{WINDOW_COLOUR_2}최근 생각: +STR_1655 :{SMALLFONT}{BLACK}땅 위에 보도 건설 +STR_1656 :{SMALLFONT}{BLACK}다리나 터널 보도를 건설 +STR_1657 :{WINDOW_COLOUR_2}좋아하는 놀이기구 +STR_1658 :{WINDOW_COLOUR_2}격렬도: {BLACK}{COMMA16} 이하 +STR_1659 :{WINDOW_COLOUR_2}격렬도: {BLACK}{COMMA16}에서 {COMMA16} 사이 +STR_1660 :{WINDOW_COLOUR_2}격렬도: {BLACK}{COMMA16} 이상 +STR_1661 :{WINDOW_COLOUR_2}멀미 참을성: {BLACK}{STRINGID} +STR_1662 :{WINDOW_COLOUR_2}행복도: +STR_1663 :{WINDOW_COLOUR_2}멀미도: +STR_1664 :{WINDOW_COLOUR_2}에너지: +STR_1665 :{WINDOW_COLOUR_2}배고픔: +STR_1666 :{WINDOW_COLOUR_2}목마름: +STR_1667 :{WINDOW_COLOUR_2}화장실: +STR_1668 :{WINDOW_COLOUR_2}만족도: {BLACK}알 수 없음 +STR_1669 :{WINDOW_COLOUR_2}만족도: {BLACK}{COMMA16}% +STR_1670 :{WINDOW_COLOUR_2}총 고객: {BLACK}{COMMA32} +STR_1671 :{WINDOW_COLOUR_2}총 수익: {BLACK}{CURRENCY2DP} +STR_1672 :브레이크 +STR_1673 :회전 컨트롤 토글 트랙 +STR_1674 :브레이크 속력 +STR_1675 :{POP16}{VELOCITY} +STR_1676 :{SMALLFONT}{BLACK}브레이크의 제한 속도를 설정하세요 +STR_1677 :{WINDOW_COLOUR_2}인기도: {BLACK}알 수 없음 +STR_1678 :{WINDOW_COLOUR_2}인기도: {BLACK}{COMMA16}% +STR_1679 :나선 상승 (왼쪽) +STR_1680 :나선 상승 (오른쪽) +STR_1681 :나선 하강 (왼쪽) +STR_1682 :나선 하강 (오른쪽) +STR_1683 :기본 크기 2 x 2 +STR_1684 :기본 크기 4 x 4 +STR_1685 :기본 크기 2 x 4 +STR_1686 :기본 크기 5 x 1 +STR_1687 :물 튀김 +STR_1688 :기본 크기 4 x 1 +STR_1689 :블록 브레이크 +STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} +STR_1691 :{WINDOW_COLOUR_2} 비용: {BLACK}{CURRENCY} +STR_1692 :{WINDOW_COLOUR_2} 비용: {BLACK}{CURRENCY}으로부터 +STR_1693 :{SMALLFONT}{BLACK}손님 +STR_1694 :{SMALLFONT}{BLACK}직원 +STR_1695 :{SMALLFONT}{BLACK}수익 및 지출 +STR_1696 :{SMALLFONT}{BLACK}고객 정보 +STR_1697 :Cannot place these on queue line area +STR_1698 :Can only place these on queue area +STR_1699 :게임에 사람이 너무 많습니다 +STR_1700 :새 미화원 고용 +STR_1701 :새 정비기술자 고용 +STR_1702 :새 경비원 고용 +STR_1703 :새 엔터테이너 고용 +STR_1704 :새 직원을 고용할 수 없습니다... +STR_1705 :{SMALLFONT}{BLACK}Sack this staff member +STR_1706 :{SMALLFONT}{BLACK}Move this person to a new location +STR_1707 :Too many staff in game +STR_1708 :{SMALLFONT}{BLACK}Set patrol area for this staff member +STR_1709 :Sack staff +STR_1710 :예 +STR_1711 :{WINDOW_COLOUR_1}Are you sure you want to sack {STRINGID}? +STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Sweep 보도s +STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Water gardens +STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Empty litter bins +STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Mow grass +STR_1716 :Invalid name for park +STR_1717 :Can't rename park... +STR_1718 :Park Name +STR_1719 :Enter name for park: +STR_1720 :{SMALLFONT}{BLACK}Name park +STR_1721 :Park closed +STR_1722 :Park open +STR_1723 :Can't open park... +STR_1724 :Can't close park... +STR_1725 :Can't buy land... +STR_1726 :Land not for sale! +STR_1727 :Construction rights not for sale! +STR_1728 :Can't buy construction rights here... +STR_1729 :Land not owned by park! +STR_1730 :{RED}Closed - - +STR_1731 :{WHITE}{STRINGID} - - +STR_1732 :Build +STR_1733 :Mode +STR_1734 :{WINDOW_COLOUR_2}Number of laps: +STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit +STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1737 :{COMMA16} +STR_1738 :Can't change number of laps... +STR_1739 :Race won by 손님 {INT32} +STR_1740 :Race won by {STRINGID} +STR_1741 :Not yet constructed ! +STR_1742 :{WINDOW_COLOUR_2}Max. people on 라이드: +STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this 라이드 at one time +STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1745 :{COMMA16} +STR_1746 :Can't change this... +STR_1747 :{WINDOW_COLOUR_2}Time limit: +STR_1748 :{SMALLFONT}{BLACK}Time limit for 라이드 +STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} +STR_1750 :{DURATION} +STR_1751 :Can't change time limit for 라이드... +STR_1752 :{SMALLFONT}{BLACK}Show list of individual 손님s in park +STR_1753 :{SMALLFONT}{BLACK}Show summarised list of 손님s in park +STR_1754 :{BLACK}{COMMA16} 손님s +STR_1755 :{BLACK}{COMMA16} 손님 +STR_1756 :{WINDOW_COLOUR_2}Admission price: +STR_1757 :{WINDOW_COLOUR_2}Reliability: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1758 :{SMALLFONT}{BLACK}Build mode +STR_1759 :{SMALLFONT}{BLACK}Move mode +STR_1760 :{SMALLFONT}{BLACK}Fill-in mode +STR_1761 :{SMALLFONT}{BLACK}Build maze in this direction +STR_1762 :Waterfalls +STR_1763 :Rapids +STR_1764 :Log Bumps +STR_1765 :On-라이드 photo section +STR_1766 :Reverser turntable +STR_1767 :Spinning tunnel +STR_1768 :Can't change number of swings... +STR_1769 :{WINDOW_COLOUR_2}Number of swings: +STR_1770 :{SMALLFONT}{BLACK}Number of complete swings +STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1772 :{COMMA16} +STR_1773 :Only one on-라이드 photo section allowed per 라이드 +STR_1774 :Only one cable lift hill allowed per 라이드 +STR_1775 :Off +STR_1776 :On +STR_1777 :{WINDOW_COLOUR_2}Music +STR_1778 :{STRINGID} - - +STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume +STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume +STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume +STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume +STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snowman costume +STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Knight costume +STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume +STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume +STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume +STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume +STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff +STR_1791 :{WINDOW_COLOUR_2}Uniform colour: +STR_1792 :Responding to {STRINGID} breakdown call +STR_1793 :Heading to {STRINGID} for an inspection +STR_1794 :Fixing {STRINGID} +STR_1795 :Answering radio call +STR_1796 :Has broken down and requires fixing +STR_1797 :This option cannot be changed for this 라이드 +STR_1798 :Whirlpool +STR_1799 :{POP16}{POP16}{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1800 :Safety cut-out +STR_1801 :Restraints stuck closed +STR_1802 :Restraints stuck open +STR_1803 :Doors stuck closed +STR_1804 :Doors stuck open +STR_1805 :Vehicle malfunction +STR_1806 :Brakes failure +STR_1807 :Control failure +STR_1808 :{WINDOW_COLOUR_2}Last breakdown: {BLACK}{STRINGID} +STR_1809 :{WINDOW_COLOUR_2}Current breakdown: {OUTLINE}{RED}{STRINGID} +STR_1810 :{WINDOW_COLOUR_2}Carrying: +STR_1811 :Can't build this here... +STR_1812 :{SMALLFONT}{BLACK}{STRINGID} +STR_1813 :Miscellaneous Objects +STR_1814 :Actions +STR_1815 :Thoughts +STR_1816 :{SMALLFONT}{BLACK}Select information type to show in 손님 list +STR_1817 :({COMMA16}) +STR_1818 :{WINDOW_COLOUR_2}All 손님s +STR_1819 :{WINDOW_COLOUR_2}All 손님s (summarised) +STR_1820 :{WINDOW_COLOUR_2}손님s {STRINGID} +STR_1821 :{WINDOW_COLOUR_2}손님s thinking {STRINGID} +STR_1822 :{WINDOW_COLOUR_2}손님s thinking about {POP16}{STRINGID} +STR_1823 :{SMALLFONT}{BLACK}Show 손님s' thoughts about this 라이드/attraction +STR_1824 :{SMALLFONT}{BLACK}Show 손님s on this 라이드/attraction +STR_1825 :{SMALLFONT}{BLACK}Show 손님s queuing for this 라이드/attraction +STR_1826 :Status +STR_1827 :Popularity +STR_1828 :Satisfaction +STR_1829 :Profit +STR_1830 :Queue length +STR_1831 :Queue time +STR_1832 :Reliability +STR_1833 :Down-time +STR_1834 :손님s favourite +STR_1835 :Popularity: 알 수 없는 +STR_1836 :Popularity: {COMMA16}% +STR_1837 :Satisfaction: 알 수 없는 +STR_1838 :Satisfaction: {COMMA16}% +STR_1839 :Reliability: {COMMA16}% +STR_1840 :Down-time: {COMMA16}% +STR_1841 :Profit: {CURRENCY2DP} per hour +STR_1842 :Favourite of: {COMMA16} 손님 +STR_1843 :Favourite of: {COMMA16} 손님s +STR_1844 :{SMALLFONT}{BLACK}Select information type to show in 라이드/attraction list +STR_1845 :{MONTHYEAR} +STR_1846 :{COMMA16} 손님s +STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} 손님s +STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} 손님s +STR_1849 :{WINDOW_COLOUR_2}Play music +STR_1850 :{SMALLFONT}{BLACK}Select whether music should be played for this 라이드 +STR_1851 :{WINDOW_COLOUR_2}Running cost: {BLACK}{CURRENCY2DP} per hour +STR_1852 :{WINDOW_COLOUR_2}Running cost: {BLACK}알 수 없는 +STR_1853 :{WINDOW_COLOUR_2}Built: {BLACK}This Year +STR_1854 :{WINDOW_COLOUR_2}Built: {BLACK}Last Year +STR_1855 :{WINDOW_COLOUR_2}Built: {BLACK}{COMMA16} Years Ago +STR_1856 :{WINDOW_COLOUR_2}Profit per item sold: {BLACK}{CURRENCY2DP} +STR_1857 :{WINDOW_COLOUR_2}Loss per item sold: {BLACK}{CURRENCY2DP} +STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY2DP} per month +STR_1859 :Handymen +STR_1860 :Mechanics +STR_1861 :Security Guards +STR_1862 :Entertainers +STR_1863 :Handyman +STR_1864 :Mechanic +STR_1865 :Security Guard +STR_1866 :Entertainer +STR_1867 :{BLACK}{COMMA16} {STRINGID} +STR_1868 :Can't change number of rotations... +STR_1869 :{WINDOW_COLOUR_2}Number of rotations: +STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations +STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1872 :{COMMA16} +STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY2DP} per hour +STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour +STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} +STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect 라이드s +STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix 라이드s +STR_1878 :{WINDOW_COLOUR_2}Inspection: +STR_1879 :Every 10 minutes +STR_1880 :Every 20 minutes +STR_1881 :Every 30 minutes +STR_1882 :Every 45 minutes +STR_1883 :Every hour +STR_1884 :Every 2 hours +STR_1885 :Never +STR_1886 :Inspecting {STRINGID} +STR_1887 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}{COMMA16} minutes +STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hours +STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this 라이드 +STR_1891 :No {STRINGID} in park yet! +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : +STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} +STR_1895 :{SMALLFONT}{BLACK}Build new 라이드/attraction +STR_1896 :{WINDOW_COLOUR_2}Expenditure/Income +STR_1897 :{WINDOW_COLOUR_2}라이드 construction +STR_1898 :{WINDOW_COLOUR_2}라이드 running costs +STR_1899 :{WINDOW_COLOUR_2}Land purchase +STR_1900 :{WINDOW_COLOUR_2}Landscaping +STR_1901 :{WINDOW_COLOUR_2}Park entrance tickets +STR_1902 :{WINDOW_COLOUR_2}라이드 tickets +STR_1903 :{WINDOW_COLOUR_2}Shop sales +STR_1904 :{WINDOW_COLOUR_2}Shop stock +STR_1905 :{WINDOW_COLOUR_2}Food/drink sales +STR_1906 :{WINDOW_COLOUR_2}Food/drink stock +STR_1907 :{WINDOW_COLOUR_2}Staff wages +STR_1908 :{WINDOW_COLOUR_2}Marketing +STR_1909 :{WINDOW_COLOUR_2}Research +STR_1910 :{WINDOW_COLOUR_2}Loan interest +STR_1911 :{BLACK} at {COMMA16}% per year +STR_1912 :{MONTH} +STR_1913 :{BLACK}+{CURRENCY2DP} +STR_1914 :{BLACK}{CURRENCY2DP} +STR_1915 :{RED}{CURRENCY2DP} +STR_1916 :{WINDOW_COLOUR_2}Loan: +STR_1917 :{POP16}{POP16}{POP16}{CURRENCY} +STR_1918 :Can't borrow any more money! +STR_1919 :Not enough cash available! +STR_1920 :Can't pay back loan! +STR_1921 :{SMALLFONT}{BLACK}Start a new game +STR_1922 :{SMALLFONT}{BLACK}Continue playing a saved game +STR_1923 :{SMALLFONT}{BLACK}Show tutorial +STR_1924 :{SMALLFONT}{BLACK}Exit +STR_1925 :Can't place person here... +STR_1926 :{SMALLFONT} +STR_1927 :{YELLOW}{STRINGID} has broken down +STR_1928 :{RED}{STRINGID} has crashed! +STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better +STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this 손님 - (If tracking is on, 손님's movements will be reported in the message area) +STR_1931 :{STRINGID} has joined the queue line for {STRINGID} +STR_1932 :{STRINGID} is on {STRINGID} +STR_1933 :{STRINGID} is in {STRINGID} +STR_1934 :{STRINGID} has left {STRINGID} +STR_1935 :{STRINGID} has left the park +STR_1936 :{STRINGID} has bought {STRINGID} +STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message +STR_1938 :{SMALLFONT}{BLACK}Show view of 손님 +STR_1939 :{SMALLFONT}{BLACK}Show view of staff member +STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this 손님 +STR_1941 :{SMALLFONT}{BLACK}Show which 라이드s this 손님 has been on +STR_1942 :{SMALLFONT}{BLACK}Show financial information about this 손님 +STR_1943 :{SMALLFONT}{BLACK}Show 손님's recent thoughts +STR_1944 :{SMALLFONT}{BLACK}Show items 손님 is carrying +STR_1945 :{SMALLFONT}{BLACK}Show orders and options for this staff member +STR_1946 :{SMALLFONT}{BLACK}Select costume for this entertainer +STR_1947 :{SMALLFONT}{BLACK}Show areas patrolled by selected staff type, and locate the nearest staff member +STR_1948 :{SMALLFONT}{BLACK}Hire a new staff member of the selected type +STR_1949 :Financial Summary +STR_1950 :Financial Graph +STR_1951 :Park Value Graph +STR_1952 :Profit Graph +STR_1953 :Marketing +STR_1954 :Research Funding +STR_1955 :{WINDOW_COLOUR_2}Number of circuits: +STR_1956 :{SMALLFONT}{BLACK}Number of circuits of track per 라이드 +STR_1957 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1958 :{COMMA16} +STR_1959 :Can't change number of circuits... +STR_1960 :{WINDOW_COLOUR_2}Balloon price: +STR_1961 :{WINDOW_COLOUR_2}Cuddly Toy price: +STR_1962 :{WINDOW_COLOUR_2}Park Map price: +STR_1963 :{WINDOW_COLOUR_2}On-라이드 Photo price: +STR_1964 :{WINDOW_COLOUR_2}Umbrella price: +STR_1965 :{WINDOW_COLOUR_2}Drink price: +STR_1966 :{WINDOW_COLOUR_2}Burger price: +STR_1967 :{WINDOW_COLOUR_2}Chips price: +STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: +STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: +STR_1970 :{WINDOW_COLOUR_2} +STR_1971 :{WINDOW_COLOUR_2} +STR_1972 :{WINDOW_COLOUR_2} +STR_1973 :{WINDOW_COLOUR_2}Pizza price: +STR_1974 :{WINDOW_COLOUR_2} +STR_1975 :{WINDOW_COLOUR_2}Popcorn price: +STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: +STR_1977 :{WINDOW_COLOUR_2}Tentacle price: +STR_1978 :{WINDOW_COLOUR_2}Hat price: +STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: +STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: +STR_1981 :{WINDOW_COLOUR_2}Doughnut price: +STR_1982 :{WINDOW_COLOUR_2}Coffee price: +STR_1983 :{WINDOW_COLOUR_2} +STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: +STR_1985 :{WINDOW_COLOUR_2}Lemonade price: +STR_1986 :{WINDOW_COLOUR_2} +STR_1987 :{WINDOW_COLOUR_2} +STR_1988 :Balloon +STR_1989 :Cuddly Toy +STR_1990 :Park Map +STR_1991 :On-라이드 Photo +STR_1992 :Umbrella +STR_1993 :Drink +STR_1994 :Burger +STR_1995 :Chips +STR_1996 :Ice Cream +STR_1997 :Candyfloss +STR_1998 :Empty Can +STR_1999 :Rubbish +STR_2000 :Empty Burger Box +STR_2001 :Pizza +STR_2002 :Voucher +STR_2003 :Popcorn +STR_2004 :Hot Dog +STR_2005 :Tentacle +STR_2006 :Hat +STR_2007 :Toffee Apple +STR_2008 :T-Shirt +STR_2009 :Doughnut +STR_2010 :Coffee +STR_2011 :Empty Cup +STR_2012 :Fried Chicken +STR_2013 :Lemonade +STR_2014 :Empty Box +STR_2015 :Empty Bottle +STR_2016 :Balloons +STR_2017 :Cuddly Toys +STR_2018 :Park Maps +STR_2019 :On-라이드 Photos +STR_2020 :Umbrellas +STR_2021 :Drinks +STR_2022 :Burgers +STR_2023 :Chips +STR_2024 :Ice Creams +STR_2025 :Candyfloss +STR_2026 :Empty Cans +STR_2027 :Rubbish +STR_2028 :Empty Burger Boxes +STR_2029 :Pizzas +STR_2030 :Vouchers +STR_2031 :Popcorn +STR_2032 :Hot Dogs +STR_2033 :Tentacles +STR_2034 :Hats +STR_2035 :Toffee Apples +STR_2036 :T-Shirts +STR_2037 :Doughnuts +STR_2038 :Coffees +STR_2039 :Empty Cups +STR_2040 :Fried Chicken +STR_2041 :Lemonade +STR_2042 :Empty Boxes +STR_2043 :Empty Bottles +STR_2044 :a Balloon +STR_2045 :a Cuddly Toy +STR_2046 :a Park Map +STR_2047 :an On-라이드 Photo +STR_2048 :an Umbrella +STR_2049 :a Drink +STR_2050 :a Burger +STR_2051 :some Chips +STR_2052 :an Ice Cream +STR_2053 :some Candyfloss +STR_2054 :an Empty Can +STR_2055 :some Rubbish +STR_2056 :an Empty Burger Box +STR_2057 :a Pizza +STR_2058 :a Voucher +STR_2059 :some Popcorn +STR_2060 :a Hot Dog +STR_2061 :a Tentacle +STR_2062 :a Hat +STR_2063 :a Toffee Apple +STR_2064 :a T-Shirt +STR_2065 :a Doughnut +STR_2066 :a Coffee +STR_2067 :an Empty Cup +STR_2068 :some Fried Chicken +STR_2069 :some Lemonade +STR_2070 :an Empty Box +STR_2071 :an Empty Bottle +STR_2072 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Balloon +STR_2073 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Cuddly Toy +STR_2074 :Map of {STRINGID} +STR_2075 :On-라이드 Photo of {STRINGID} +STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Umbrella +STR_2077 :Drink +STR_2078 :Burger +STR_2079 :Chips +STR_2080 :Ice Cream +STR_2081 :Candyfloss +STR_2082 :Empty Can +STR_2083 :Rubbish +STR_2084 :Empty Burger Box +STR_2085 :Pizza +STR_2086 :Voucher for {STRINGID} +STR_2087 :Popcorn +STR_2088 :Hot Dog +STR_2089 :Tentacle +STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hat +STR_2091 :Toffee Apple +STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-Shirt +STR_2093 :Doughnut +STR_2094 :Coffee +STR_2095 :Empty Cup +STR_2096 :Fried Chicken +STR_2097 :Lemonade +STR_2098 :Empty Box +STR_2099 :Empty Bottle +STR_2100 :{WINDOW_COLOUR_2}On-라이드 Photo price: +STR_2101 :{WINDOW_COLOUR_2}On-라이드 Photo price: +STR_2102 :{WINDOW_COLOUR_2}On-라이드 Photo price: +STR_2103 :{WINDOW_COLOUR_2}프레첼 price: +STR_2104 :{WINDOW_COLOUR_2}Hot Chocolate price: +STR_2105 :{WINDOW_COLOUR_2}아이스 티 price: +STR_2106 :{WINDOW_COLOUR_2}휜넬 케이크 price: +STR_2107 :{WINDOW_COLOUR_2}선글라스 price: +STR_2108 :{WINDOW_COLOUR_2}고기 국수 price: +STR_2109 :{WINDOW_COLOUR_2}Fried Rice Noodles price: +STR_2110 :{WINDOW_COLOUR_2}만둣국 price: +STR_2111 :{WINDOW_COLOUR_2}미트볼 스프 price: +STR_2112 :{WINDOW_COLOUR_2}과일 주스 price: +STR_2113 :{WINDOW_COLOUR_2}두유 price: +STR_2114 :{WINDOW_COLOUR_2}수정과 price: +STR_2115 :{WINDOW_COLOUR_2}Sub Sandwich price: +STR_2116 :{WINDOW_COLOUR_2}쿠키 price: +STR_2117 :{WINDOW_COLOUR_2} +STR_2118 :{WINDOW_COLOUR_2} +STR_2119 :{WINDOW_COLOUR_2} +STR_2120 :{WINDOW_COLOUR_2}구운 소시지 price: +STR_2121 :{WINDOW_COLOUR_2} +STR_2122 :On-라이드 Photo +STR_2123 :On-라이드 Photo +STR_2124 :On-라이드 Photo +STR_2125 :프레첼 +STR_2126 :Hot Chocolate +STR_2127 :아이스 티 +STR_2128 :휜넬 케이크 +STR_2129 :선글라스 +STR_2130 :고기 국수 +STR_2131 :Fried Rice Noodles +STR_2132 :만둣국 +STR_2133 :미트볼 스프 +STR_2134 :과일 주스 +STR_2135 :두유 +STR_2136 :수정과 +STR_2137 :Sub Sandwich +STR_2138 :쿠키 +STR_2139 :Empty Bowl +STR_2140 :Empty Drink Carton +STR_2141 :Empty Juice Cup +STR_2142 :구운 소시지 +STR_2143 :Empty Bowl +STR_2144 :On-라이드 Photos +STR_2145 :On-라이드 Photos +STR_2146 :On-라이드 Photos +STR_2147 :프레첼s +STR_2148 :Hot Chocolates +STR_2149 :아이스 티s +STR_2150 :휜넬 케이크s +STR_2151 :선글라스 +STR_2152 :고기 국수 +STR_2153 :Fried Rice Noodles +STR_2154 :만둣국s +STR_2155 :미트볼 스프s +STR_2156 :과일 주스s +STR_2157 :두유s +STR_2158 :수정과 +STR_2159 :Sub Sandwiches +STR_2160 :쿠키s +STR_2161 :Empty Bowls +STR_2162 :Empty Drink Cartons +STR_2163 :Empty Juice cups +STR_2164 :구운 소시지s +STR_2165 :Empty Bowls +STR_2166 :an On-라이드 Photo +STR_2167 :an On-라이드 Photo +STR_2168 :an On-라이드 Photo +STR_2169 :a 프레첼 +STR_2170 :a Hot Chocolate +STR_2171 :an 아이스 티 +STR_2172 :a 휜넬 케이크 +STR_2173 :a pair of 선글라스 +STR_2174 :some 고기 국수 +STR_2175 :some Fried Rice Noodles +STR_2176 :some 만둣국 +STR_2177 :some 미트볼 스프 +STR_2178 :a 과일 주스 +STR_2179 :some 두유 +STR_2180 :some 수정과 +STR_2181 :샌드위치 +STR_2182 :쿠키 +STR_2183 :an Empty Bowl +STR_2184 :an Empty Drink Carton +STR_2185 :an Empty Juice Cup +STR_2186 :구운 소시지 +STR_2187 :an Empty Bowl +STR_2188 :On-라이드 Photo of {STRINGID} +STR_2189 :On-라이드 Photo of {STRINGID} +STR_2190 :On-라이드 Photo of {STRINGID} +STR_2191 :프레첼 +STR_2192 :Hot Chocolate +STR_2193 :아이스 티 +STR_2194 :휜넬 케이크 +STR_2195 :선글라스 +STR_2196 :고기 국수 +STR_2197 :Fried Rice Noodles +STR_2198 :만둣국 +STR_2199 :미트볼 스프 +STR_2200 :과일 주스 +STR_2201 :두유 +STR_2202 :수정과 +STR_2203 :Sub Sandwich +STR_2204 :쿠키 +STR_2205 :Empty Bowl +STR_2206 :Empty Drink Carton +STR_2207 :Empty Juice Cup +STR_2208 :구운 소시지 +STR_2209 :Empty Bowl +STR_2210 :{SMALLFONT}{BLACK}Show list of handymen in park +STR_2211 :{SMALLFONT}{BLACK}Show list of mechanics in park +STR_2212 :{SMALLFONT}{BLACK}Show list of security guards in park +STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park +STR_2214 :Construction not possible while game is paused! +STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) +STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has 상점ed +STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} +STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} +STR_2221 :{SMALLFONT}{BLACK}Park Rating: {COMMA16} +STR_2222 :{SMALLFONT}{BLACK}{STRINGID} +STR_2223 :{WINDOW_COLOUR_2}손님s in park: {BLACK}{COMMA16} +STR_2224 :{WINDOW_COLOUR_2}Cash: {BLACK}{CURRENCY2DP} +STR_2225 :{WINDOW_COLOUR_2}Cash: {RED}{CURRENCY2DP} +STR_2226 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} +STR_2227 :{WINDOW_COLOUR_2}Company value: {BLACK}{CURRENCY} +STR_2228 :{WINDOW_COLOUR_2}Last month's profit from food/drink and{NEWLINE}merchandise sales: {BLACK}{CURRENCY} +STR_2229 :Slope up to vertical +STR_2230 :Vertical track +STR_2231 :Holding brake for drop +STR_2232 :Cable lift hill +STR_2233 :{SMALLFONT}{BLACK}Park information +STR_2234 :Recent Messages +STR_2235 :{SMALLFONT}{STRINGID} {STRINGID} +STR_2236 :January +STR_2237 :February +STR_2238 :March +STR_2239 :April +STR_2240 :May +STR_2241 :June +STR_2242 :July +STR_2243 :August +STR_2244 :September +STR_2245 :October +STR_2246 :November +STR_2247 :December +STR_2248 :Can't demolish 라이드/attraction... +STR_2249 :{BABYBLUE}New 라이드/attraction now available:{NEWLINE}{STRINGID} +STR_2250 :{BABYBLUE}New scenery/themeing now available:{NEWLINE}{STRINGID} +STR_2251 :Can only be built on paths! +STR_2252 :Can only be built across paths! +STR_2253 :Transport 라이드s +STR_2254 :Gentle 라이드s +STR_2255 :롤러코스터s +STR_2256 :Thrill 라이드s +STR_2257 :Water 라이드s +STR_2258 :Shops & 상점s +STR_2259 :Scenery & Themeing +STR_2260 :No funding +STR_2261 :미니mum funding +STR_2262 :Normal funding +STR_2263 :Maximum funding +STR_2264 :Research funding +STR_2265 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} per month +STR_2266 :Research priorities +STR_2267 :Currently in development +STR_2268 :Last development +STR_2269 :{WINDOW_COLOUR_2}Type: {BLACK}{STRINGID} +STR_2270 :{WINDOW_COLOUR_2}Progress: {BLACK}{STRINGID} +STR_2271 :{WINDOW_COLOUR_2}Expected: {BLACK}{STRINGID} +STR_2272 :{WINDOW_COLOUR_2}라이드/attraction:{NEWLINE}{BLACK}{STRINGID} +STR_2273 :{WINDOW_COLOUR_2}Scenery/themeing:{NEWLINE}{BLACK}{STRINGID} +STR_2274 :{SMALLFONT}{BLACK}Show details of this invention or development +STR_2275 :{SMALLFONT}{BLACK}Show funding and options for research & development +STR_2276 :{SMALLFONT}{BLACK}Show research & development status +STR_2277 :알 수 없는 +STR_2278 :Transport 라이드 +STR_2279 :Gentle 라이드 +STR_2280 :롤러코스터 +STR_2281 :Thrill 라이드 +STR_2282 :Water 라이드 +STR_2283 :Shop/상점 +STR_2284 :Scenery/Themeing +STR_2285 :Initial research +STR_2286 :Designing +STR_2287 :Completing design +STR_2288 :알 수 없는 +STR_2289 :{STRINGID} {STRINGID} +STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} +STR_2291 :Select scenario for new game +STR_2292 :{WINDOW_COLOUR_2}라이드s been on: +STR_2293 :{BLACK} Nothing +STR_2294 :{SMALLFONT}{BLACK}Change base land style +STR_2295 :{SMALLFONT}{BLACK}Change vertical edges of land +STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} paid to enter park +STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} 라이드 +STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} 라이드s +STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} item of food +STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} items of food +STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drink +STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drinks +STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenir +STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenirs +STR_2305 :Track design files +STR_2306 :Save track design +STR_2307 :Select {STRINGID} design +STR_2308 :{STRINGID} Track Designs +STR_2309 :설치 New Track Design +STR_2310 :Build custom design +STR_2311 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} (approx.) +STR_2312 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} (approx.) +STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) +STR_2314 :{WINDOW_COLOUR_2}라이드 length: {BLACK}{STRINGID} +STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} +STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : +STR_2321 :{WINDOW_COLOUR_2}Number of 라이드s/attractions: {BLACK}{COMMA16} +STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} +STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} +STR_2324 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}sq.ft. +STR_2325 :{SMALLFONT}{BLACK}Buy land to extend park +STR_2326 :{SMALLFONT}{BLACK}Buy construction rights to allow construction above or below land outside the park +STR_2327 :Options +STR_2328 :{WINDOW_COLOUR_2}Currency: +STR_2329 :{WINDOW_COLOUR_2}Distance and Speed: +STR_2330 :{WINDOW_COLOUR_2}Temperature: +STR_2331 :{WINDOW_COLOUR_2}Height Labels: +STR_2332 :Units +STR_2333 :Sound +STR_2334 :Pounds ({POUND}) +STR_2335 :Dollars ($) +STR_2336 :Franc (F) +STR_2337 :Deutschmark (DM) +STR_2338 :Yen ({YEN}) +STR_2339 :Peseta (Pts) +STR_2340 :Lira (L) +STR_2341 :Guilders (fl.) +STR_2342 :Krona (kr) +STR_2343 :Euros ({EURO}) +STR_2344 :Imperial +STR_2345 :Metric +STR_2346 :Display +STR_2347 :{RED}{STRINGID} has drowned! +STR_2348 :{SMALLFONT}{BLACK}Show statistics for this staff member +STR_2349 :{WINDOW_COLOUR_2}Wages: {BLACK}{CURRENCY} per month +STR_2350 :{WINDOW_COLOUR_2}Employed: {BLACK}{MONTHYEAR} +STR_2351 :{WINDOW_COLOUR_2}Lawns mown: {BLACK}{COMMA16} +STR_2352 :{WINDOW_COLOUR_2}Gardens watered: {BLACK}{COMMA16} +STR_2353 :{WINDOW_COLOUR_2}Litter swept: {BLACK}{COMMA16} +STR_2354 :{WINDOW_COLOUR_2}Bins emptied: {BLACK}{COMMA16} +STR_2355 :{WINDOW_COLOUR_2}라이드s fixed: {BLACK}{COMMA16} +STR_2356 :{WINDOW_COLOUR_2}라이드s inspected: {BLACK}{COMMA16} +STR_2357 :House +STR_2358 :Units +STR_2359 :Real Values +STR_2360 :{WINDOW_COLOUR_2}Display Resolution: +STR_2361 :Landscape Smoothing +STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off +STR_2363 :Gridlines on Landscape +STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off +STR_2365 :The bank refuses to increase your loan! +STR_2366 :Celsius ({DEGREE}C) +STR_2367 :Fahrenheit (F) +STR_2368 :None +STR_2369 :Low +STR_2370 :Average +STR_2371 :High +STR_2372 :Low +STR_2373 :Medium +STR_2374 :High +STR_2375 :Very high +STR_2376 :Extreme +STR_2377 :Ultra-Extreme +STR_2378 :{SMALLFONT}{BLACK}Adjust smaller area of land +STR_2379 :{SMALLFONT}{BLACK}Adjust larger area of land +STR_2380 :{SMALLFONT}{BLACK}Adjust smaller area of water +STR_2381 :{SMALLFONT}{BLACK}Adjust larger area of water +STR_2382 :Land +STR_2383 :Water +STR_2384 :{WINDOW_COLOUR_2}Your objective: +STR_2385 :{BLACK}None +STR_2386 :{BLACK}To have at least {COMMA16} 손님s in your park at the end of {MONTHYEAR}, with a park rating of at least 600 +STR_2387 :{BLACK}To achieve a park value of at least {POP16}{POP16}{CURRENCY} at the end of {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} +STR_2388 :{BLACK}Have Fun! +STR_2389 :{BLACK}Build the best {STRINGID} you can! +STR_2390 :{BLACK}To have 10 different types of 롤러코스터s operating in your park, each with an excitement value of at least 6.00 +STR_2391 :{BLACK}To have at least {COMMA16} 손님s in your park. You must not let the park rating drop below 700 at any time! +STR_2392 :{BLACK}To achieve a monthly income from 라이드 tickets of at least {POP16}{POP16}{CURRENCY} +STR_2393 :{BLACK}To have 10 different types of 롤러코스터s operating in your park, each with a 미니mum length of {LENGTH}, and an excitement rating of at least 7.00 +STR_2394 :{BLACK}To finish building all 5 of the partially built 롤러코스터s in this park, designing them to achieve excitement ratings of at least {POP16}{POP16}{COMMA2DP32} each +STR_2395 :{BLACK}To repay your loan and achieve a park value of at least {POP16}{POP16}{CURRENCY} +STR_2396 :{BLACK}To achieve a monthly profit from food, drink and merchandise sales of at least {POP16}{POP16}{CURRENCY} +STR_2397 :None +STR_2398 :Number of 손님s at a given date +STR_2399 :Park value at a given date +STR_2400 :Have fun +STR_2401 :Build the best 라이드 you can +STR_2402 :Build 10 롤러코스터s +STR_2403 :Number of 손님s in park +STR_2404 :Monthly income from 라이드 tickets +STR_2405 :Build 10 롤러코스터s of a given length +STR_2406 :Finish building 5 롤러코스터s +STR_2407 :Repay loan and achieve a given park value +STR_2408 :Monthly profit from food/merchandise +STR_2409 :{WINDOW_COLOUR_2}Marketing campaigns in operation +STR_2410 :{BLACK}None +STR_2411 :{WINDOW_COLOUR_2}Marketing campaigns available +STR_2412 :{SMALLFONT}{BLACK}Start this marketing campaign +STR_2413 :{BLACK}({CURRENCY2DP} per week) +STR_2414 :(Not Selected) +STR_2415 :{WINDOW_COLOUR_2}라이드: +STR_2416 :{WINDOW_COLOUR_2}Item: +STR_2417 :{WINDOW_COLOUR_2}Length of time: +STR_2418 :Free entry to {STRINGID} +STR_2419 :Free 라이드 on {STRINGID} +STR_2420 :Half-price entry to {STRINGID} +STR_2421 :Free {STRINGID} +STR_2422 :Advertising campaign for {STRINGID} +STR_2423 :Advertising campaign for {STRINGID} +STR_2424 :{WINDOW_COLOUR_2}Vouchers for free entry to the park +STR_2425 :{WINDOW_COLOUR_2}Vouchers for free 라이드s on a particular 라이드 +STR_2426 :{WINDOW_COLOUR_2}Vouchers for half-price entry to the park +STR_2427 :{WINDOW_COLOUR_2}Vouchers for free food or drink +STR_2428 :{WINDOW_COLOUR_2}Advertising campaign for the park +STR_2429 :{WINDOW_COLOUR_2}Advertising campaign for a particular 라이드 +STR_2430 :{BLACK}Vouchers for free entry to {STRINGID} +STR_2431 :{BLACK}Vouchers for free 라이드 on {STRINGID} +STR_2432 :{BLACK}Vouchers for half-price entry to {STRINGID} +STR_2433 :{BLACK}Vouchers for free {STRINGID} +STR_2434 :{BLACK}Advertising campaign for {STRINGID} +STR_2435 :{BLACK}Advertising campaign for {STRINGID} +STR_2436 :1 week +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : +STR_2442 : +STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} +STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} +STR_2445 :Start this marketing campaign +STR_2446 :{YELLOW}Your marketing campaign for free entry to the park has finished +STR_2447 :{YELLOW}Your marketing campaign for free 라이드s on {STRINGID} has finished +STR_2448 :{YELLOW}Your marketing campaign for half-price entry to the park has finished +STR_2449 :{YELLOW}Your marketing campaign for free {STRINGID} has finished +STR_2450 :{YELLOW}Your advertising campaign for the park has finished +STR_2451 :{YELLOW}Your advertising campaign for {STRINGID} has finished +STR_2452 :{WINDOW_COLOUR_2}Cash (less loan): {BLACK}{CURRENCY2DP} +STR_2453 :{WINDOW_COLOUR_2}Cash (less loan): {RED}{CURRENCY2DP} +STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} - +STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} - +STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} - +STR_2457 :{SMALLFONT}{BLACK}Show financial accounts +STR_2458 :{SMALLFONT}{BLACK}Show graph of cash (less loan) over time +STR_2459 :{SMALLFONT}{BLACK}Show graph of park value over time +STR_2460 :{SMALLFONT}{BLACK}Show graph of weekly profit +STR_2461 :{SMALLFONT}{BLACK}Show marketing campaigns +STR_2462 :{SMALLFONT}{BLACK}Show view of park entrance +STR_2463 :{SMALLFONT}{BLACK}Show graph of park ratings over time +STR_2464 :{SMALLFONT}{BLACK}Show graph of 손님 numbers over time +STR_2465 :{SMALLFONT}{BLACK}Show park entrance price and information +STR_2466 :{SMALLFONT}{BLACK}Show park statistics +STR_2467 :{SMALLFONT}{BLACK}Show objectives for this game +STR_2468 :{SMALLFONT}{BLACK}Show recent awards this park has received +STR_2469 :{SMALLFONT}{BLACK}Select level of research & development +STR_2470 :{SMALLFONT}{BLACK}Research new transport 라이드s +STR_2471 :{SMALLFONT}{BLACK}Research new gentle 라이드s +STR_2472 :{SMALLFONT}{BLACK}Research new 롤러코스터s +STR_2473 :{SMALLFONT}{BLACK}Research new thrill 라이드s +STR_2474 :{SMALLFONT}{BLACK}Research new water 라이드s +STR_2475 :{SMALLFONT}{BLACK}Research new shops and 상점s +STR_2476 :{SMALLFONT}{BLACK}Research new scenery and themeing +STR_2477 :{SMALLFONT}{BLACK}Select operating mode for this 라이드/attraction +STR_2478 :{SMALLFONT}{BLACK}Show graph of velocity against time +STR_2479 :{SMALLFONT}{BLACK}Show graph of altitude against time +STR_2480 :{SMALLFONT}{BLACK}Show graph of vertical acceleration against time +STR_2481 :{SMALLFONT}{BLACK}Show graph of lateral acceleration against time +STR_2482 :{SMALLFONT}{BLACK}Profit: {CURRENCY} per week, Park Value: {CURRENCY} +STR_2483 :{WINDOW_COLOUR_2}Weekly profit: {BLACK}+{CURRENCY2DP} +STR_2484 :{WINDOW_COLOUR_2}Weekly profit: {RED}{CURRENCY2DP} +STR_2485 :Controls +STR_2486 :General +STR_2487 :Show 'real' names of 손님s +STR_2488 :{SMALLFONT}{BLACK}Toggle between showing 'real' names of 손님s and 손님 numbers +STR_2489 :Shortcut keys... +STR_2490 :Keyboard shortcuts +STR_2491 :Reset keys +STR_2492 :{SMALLFONT}{BLACK}Set all keyboard shortcuts back to default settings +STR_2493 :Close top-most window +STR_2494 :Close all floating windows +STR_2495 :Cancel construction mode +STR_2496 :Pause game +STR_2497 :Zoom view out +STR_2498 :Zoom view in +STR_2499 :Rotate view clockwise +STR_2500 :Rotate construction object +STR_2501 :Underground view toggle +STR_2502 :Remove base land toggle +STR_2503 :Remove vertical land toggle +STR_2504 :See-through 라이드s toggle +STR_2505 :See-through scenery toggle +STR_2506 :Invisible supports toggle +STR_2507 :Invisible people toggle +STR_2508 :Height marks on land toggle +STR_2509 :Height marks on 라이드 tracks toggle +STR_2510 :Height marks on paths toggle +STR_2511 :Adjust land +STR_2512 :Adjust water +STR_2513 :Build scenery +STR_2514 :Build paths +STR_2515 :Build new 라이드 +STR_2516 :Show financial information +STR_2517 :Show research information +STR_2518 :Show 라이드s list +STR_2519 :Show park information +STR_2520 :Show 손님 list +STR_2521 :Show staff list +STR_2522 :Show recent messages +STR_2523 :Show map +STR_2524 :Screenshot +### The following need to be reordered to match SDL_keycode layout. +STR_2525 :??? +STR_2526 :??? +STR_2527 :??? +STR_2528 :??? +STR_2529 :??? +STR_2530 :??? +STR_2531 :??? +STR_2532 :??? +STR_2533 :Backspace +STR_2534 :Tab +STR_2535 :??? +STR_2536 :??? +STR_2537 :Clear +STR_2538 :Return +STR_2539 :??? +STR_2540 :??? +STR_2541 :??? +STR_2542 :??? +STR_2543 :Alt/Menu +STR_2544 :Pause +STR_2545 :Caps +STR_2546 :??? +STR_2547 :??? +STR_2548 :??? +STR_2549 :??? +STR_2550 :??? +STR_2551 :??? +STR_2552 :Escape +STR_2553 :??? +STR_2554 :??? +STR_2555 :??? +STR_2556 :??? +STR_2557 :Spacebar +STR_2558 :PgUp +STR_2559 :PgDn +STR_2560 :End +STR_2561 :Home +STR_2562 :Left +STR_2563 :Up +STR_2564 :Right +STR_2565 :Down +STR_2566 :Select +STR_2567 :Print +STR_2568 :Execute +STR_2569 :Snapshot +STR_2570 :Insert +STR_2571 :Delete +STR_2572 :Help +STR_2573 :0 +STR_2574 :1 +STR_2575 :2 +STR_2576 :3 +STR_2577 :4 +STR_2578 :5 +STR_2579 :6 +STR_2580 :7 +STR_2581 :8 +STR_2582 :9 +STR_2583 :??? +STR_2584 :??? +STR_2585 :??? +STR_2586 :??? +STR_2587 :??? +STR_2588 :??? +STR_2589 :??? +STR_2590 :A +STR_2591 :B +STR_2592 :C +STR_2593 :D +STR_2594 :E +STR_2595 :F +STR_2596 :G +STR_2597 :H +STR_2598 :I +STR_2599 :J +STR_2600 :K +STR_2601 :L +STR_2602 :M +STR_2603 :N +STR_2604 :O +STR_2605 :P +STR_2606 :Q +STR_2607 :R +STR_2608 :S +STR_2609 :T +STR_2610 :U +STR_2611 :V +STR_2612 :W +STR_2613 :X +STR_2614 :Y +STR_2615 :Z +STR_2616 :??? +STR_2617 :??? +STR_2618 :Menu +STR_2619 :??? +STR_2620 :??? +STR_2621 :NumPad 0 +STR_2622 :NumPad 1 +STR_2623 :NumPad 2 +STR_2624 :NumPad 3 +STR_2625 :NumPad 4 +STR_2626 :NumPad 5 +STR_2627 :NumPad 6 +STR_2628 :NumPad 7 +STR_2629 :NumPad 8 +STR_2630 :NumPad 9 +STR_2631 :NumPad * +STR_2632 :NumPad + +STR_2633 :??? +STR_2634 :NumPad - +STR_2635 :NumPad . +STR_2636 :NumPad / +STR_2637 :F1 +STR_2638 :F2 +STR_2639 :F3 +STR_2640 :F4 +STR_2641 :F5 +STR_2642 :F6 +STR_2643 :F7 +STR_2644 :F8 +STR_2645 :F9 +STR_2646 :F10 +STR_2647 :F11 +STR_2648 :F12 +STR_2649 :F13 +STR_2650 :F14 +STR_2651 :F15 +STR_2652 :F16 +STR_2653 :F17 +STR_2654 :F18 +STR_2655 :F19 +STR_2656 :F20 +STR_2657 :F21 +STR_2658 :F22 +STR_2659 :F23 +STR_2660 :F24 +STR_2661 :??? +STR_2662 :??? +STR_2663 :??? +STR_2664 :??? +STR_2665 :??? +STR_2666 :??? +STR_2667 :??? +STR_2668 :??? +STR_2669 :NumLock +STR_2670 :Scroll +STR_2671 :??? +STR_2672 :??? +STR_2673 :??? +STR_2674 :??? +STR_2675 :??? +STR_2676 :??? +STR_2677 :??? +STR_2678 :??? +STR_2679 :??? +STR_2680 :All research complete +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2682 : +STR_2683 : +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive +STR_2685 :Simplex Noise Parameters +STR_2686 :{WINDOW_COLOUR_2}Low: +STR_2687 :{WINDOW_COLOUR_2}High: +STR_2688 :{WINDOW_COLOUR_2}Base Frequency: +STR_2689 :{WINDOW_COLOUR_2}Octaves: +STR_2690 :Map Generation +STR_2691 :{WINDOW_COLOUR_2}Base height: +STR_2692 :{WINDOW_COLOUR_2}Water level: +STR_2693 :{WINDOW_COLOUR_2}Terrain: +STR_2694 :Generate +STR_2695 :Random terrain +STR_2696 :Place trees +STR_2697 :??? +STR_2698 :??? +STR_2699 :??? +STR_2700 :Autosave frequency: +STR_2701 :Every week +STR_2702 :Every 2 weeks +STR_2703 :Every month +STR_2704 :Every 4 months +STR_2705 :Every year +STR_2706 :Never +STR_2707 :Open new window +STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? +STR_2709 :Overwrite +STR_2710 :Type the name of the file. +STR_2711 :; +STR_2712 := +STR_2713 :, +STR_2714 :- +STR_2715 :. +STR_2716 :/ +STR_2717 :' +STR_2718 :(up) +STR_2719 :(new file) +STR_2720 :{UINT16}sec +STR_2721 :{UINT16}secs +STR_2722 :{UINT16}min:{UINT16}sec +STR_2723 :{UINT16}min:{UINT16}secs +STR_2724 :{UINT16}mins:{UINT16}sec +STR_2725 :{UINT16}mins:{UINT16}secs +STR_2726 :{UINT16}min +STR_2727 :{UINT16}mins +STR_2728 :{UINT16}hour:{UINT16}min +STR_2729 :{UINT16}hour:{UINT16}mins +STR_2730 :{UINT16}hours:{UINT16}min +STR_2731 :{UINT16}hours:{UINT16}mins +STR_2732 :{COMMA16}ft +STR_2733 :{COMMA16}m +STR_2734 :{COMMA16}mph +STR_2735 :{COMMA16}km/h +STR_2736 :{MONTH}, Year {COMMA16} +STR_2737 :{STRINGID} {MONTH}, Year {COMMA16} +STR_2738 :Title screen music: +STR_2739 :None +STR_2740 :Roller코스터 Tycoon 1 +STR_2741 :Roller코스터 Tycoon 2 +STR_2742 :css50.dat not found +STR_2743 :Copy data\css17.dat from your RCT1 설치ation to data\css50.dat in your RCT2 설치ation. +STR_2744 :[ +STR_2745 :\ +STR_2746 :] +STR_2747 :{ENDQUOTES} +STR_2748 :Bar +STR_2749 :My new scenario +# New strings used in the cheats window previously these were ??? +STR_2750 :Move all items to top +STR_2751 :Move all items to bottom +STR_2752 :Clear grass +STR_2753 :Mowed grass +STR_2754 :Water plants +STR_2755 :Fix vandalism +STR_2756 :Remove litter +STR_2757 :Force Sun +STR_2758 :Force Thunder +STR_2759 :Zero Clearance +STR_2760 :+{CURRENCY} +STR_2761 : +STR_2762 : +STR_2763 :??? +STR_2764 : +STR_2765 :Large Tram +STR_2766 :Win scenario +STR_2767 :Freeze Climate +STR_2768 :Unfreeze Climate +STR_2769 :Open Park +STR_2770 :Close Park +STR_2771 :Slower Gamespeed +STR_2772 :Faster Gamespeed +STR_2773 :Windowed +STR_2774 :Fullscreen +STR_2775 :Fullscreen (desktop) +STR_2776 :Language: +STR_2777 :{MOVE_X}{SMALLFONT}{STRING} +STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} +STR_2779 :Viewport #{COMMA16} +STR_2780 :Extra viewport +# End of new strings +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} +STR_2782 :SHIFT + +STR_2783 :CTRL + +STR_2784 :Change keyboard shortcut +STR_2785 :{WINDOW_COLOUR_2}Press new shortcut key for:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} +STR_2786 :{SMALLFONT}{BLACK}Click on shortcut description to select new key +STR_2787 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} +STR_2788 :{WINDOW_COLOUR_2}Congratulations !{NEWLINE}{BLACK}You achieved your objective with a company value of {CURRENCY} ! +STR_2789 :{WINDOW_COLOUR_2}You have failed your objective ! +STR_2790 :Enter name into scenario chart +STR_2791 :Enter name +STR_2792 :Please enter your name for the scenario chart: +STR_2793 :{SMALLFONT}(Completed by {STRINGID}) +STR_2794 :{WINDOW_COLOUR_2}Completed by: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} with a company value of: {BLACK}{CURRENCY} +STR_2795 :Sort +STR_2796 :{SMALLFONT}{BLACK}Sort the 라이드 list into order using the information type displayed +STR_2797 :Scroll view when pointer at screen edge +STR_2798 :{SMALLFONT}{BLACK}Select whether to scroll the view when the mouse pointer is at the screen edge +STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments +STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32} +STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP} +STR_2802 :Map +STR_2803 :{SMALLFONT}{BLACK}Show these 손님s highlighted on map +STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map +STR_2805 :{SMALLFONT}{BLACK}Show map of park +STR_2806 :{RED}손님s are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2807 :{RED}손님s are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2808 :{RED}손님s are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organising them better +STR_2809 :{RED}손님s are hungry and can't find anywhere to buy food +STR_2810 :{RED}손님s are thirsty and can't find anywhere to buy drinks +STR_2811 :{RED}손님s are complaining because they can't find the toilets in your park +STR_2812 :{RED}손님s are getting lost or stuck{NEWLINE}Check whether the layout of your 보도s needs improving to help the 손님s find their way around +STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more 손님s +STR_2814 :{WINDOW_COLOUR_2}Most untidy park award +STR_2815 :{WINDOW_COLOUR_2}Tidiest park award +STR_2816 :{WINDOW_COLOUR_2}Award for the park with the best 롤러코스터s +STR_2817 :{WINDOW_COLOUR_2}Best value park award +STR_2818 :{WINDOW_COLOUR_2}Most beautiful park award +STR_2819 :{WINDOW_COLOUR_2}Worst value park award +STR_2820 :{WINDOW_COLOUR_2}Safest park award +STR_2821 :{WINDOW_COLOUR_2}Best staff award +STR_2822 :{WINDOW_COLOUR_2}Best park food award +STR_2823 :{WINDOW_COLOUR_2}Worst park food award +STR_2824 :{WINDOW_COLOUR_2}Best park toilets award +STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award +STR_2826 :{WINDOW_COLOUR_2}Best water 라이드s award +STR_2827 :{WINDOW_COLOUR_2}Best custom-designed 라이드s award +STR_2828 :{WINDOW_COLOUR_2}Most dazzling 라이드 colour schemes award +STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award +STR_2830 :{WINDOW_COLOUR_2}Best gentle 라이드 award +STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'! +STR_2832 :{TOPAZ}Your park has received an award for being 'The tidiest park in the country'! +STR_2833 :{TOPAZ}Your park has received an award for being 'The park with the best 롤러코스터s'! +STR_2834 :{TOPAZ}Your park has received an award for being 'The best value park in the country'! +STR_2835 :{TOPAZ}Your park has received an award for being 'The most beautiful park in the country'! +STR_2836 :{TOPAZ}Your park has received an award for being 'The worst value park in the country'! +STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park in the country'! +STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! +STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! +STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! +STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best toilet facilities in the country'! +STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! +STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water 라이드s in the country'! +STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed 라이드s'! +STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of colour schemes'! +STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! +STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle 라이드s'! +STR_2848 :{WINDOW_COLOUR_2}No recent awards +STR_2849 :New scenario 설치ed successfully +STR_2850 :New track design 설치ed successfully +STR_2851 :Scenario already 설치ed +STR_2852 :Track design already 설치ed +STR_2853 :Forbidden by the local authority! +STR_2854 :{RED}손님s can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance +STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the 라이드 exit +STR_2856 :{WINDOW_COLOUR_2}Tutorial +STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) +STR_2858 :Can't start marketing campaign... +STR_2859 :Another instance of OpenRCT2 is already running +STR_2860 :Infogrames Interactive credits... +STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. +STR_2862 :Music acknowledgements... +STR_2863 :Music acknowledgements +STR_2864 :{WINDOW_COLOUR_2}March - Children of the Regiment: (Fucik) non copyright +STR_2865 :{WINDOW_COLOUR_2}Heyken's Serenade: (J.Heyken) British Standard Music Coy; GEMA, BRITICO +STR_2866 :{WINDOW_COLOUR_2}In Continental Mood: (Composer 알 수 없는) Copyright Control +STR_2867 :{WINDOW_COLOUR_2}Wedding Journey: (Traditional) +STR_2868 :{WINDOW_COLOUR_2}Tales from the Vienna Woods: (Johann Strauss) non copyright +STR_2869 :{WINDOW_COLOUR_2}Slavonic Dance: (Traditional) +STR_2870 :{WINDOW_COLOUR_2}Das Alpenhorn: (Traditional) +STR_2871 :{WINDOW_COLOUR_2}The Blond Sailor: (Traditional) +STR_2872 :{WINDOW_COLOUR_2}Overture - Poet and Peasant: (Suppe) non copyright +STR_2873 :{WINDOW_COLOUR_2}Waltz Medley: (Johann Strauss) non copyright +STR_2874 :{WINDOW_COLOUR_2}Bella Bella Bimba: (Traditional) +STR_2875 :{WINDOW_COLOUR_2}Original recordings (P) 1976 C.J.Mears Organization, used with consent +STR_2876 :{WINDOW_COLOUR_2}Roller코스터 Tycoon 2 Title Music: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2877 :{WINDOW_COLOUR_2}Dodgems Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2878 :{WINDOW_COLOUR_2}Mid Summer's Heat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2879 :{WINDOW_COLOUR_2}Pharaoh's Tomb: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2880 :{WINDOW_COLOUR_2}Caesar's March: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2881 :{WINDOW_COLOUR_2}Drifting To Heaven: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2882 :{WINDOW_COLOUR_2}Invaders: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2883 :{WINDOW_COLOUR_2}Eternal Toybox: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2884 :{WINDOW_COLOUR_2}Jungle Juice: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2885 :{WINDOW_COLOUR_2}Ninja's Noodles: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2886 :{WINDOW_COLOUR_2}Voyage to Andromeda: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2887 :{WINDOW_COLOUR_2}Brimble's Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2888 :{WINDOW_COLOUR_2}Atlantis: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2889 :{WINDOW_COLOUR_2}Wild West Kid: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2890 :{WINDOW_COLOUR_2}Vampire's Lair: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2891 :{WINDOW_COLOUR_2}Blockbuster: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2892 :{WINDOW_COLOUR_2}Airtime Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2893 :{WINDOW_COLOUR_2}Searchlight Rag: (Scott Joplin/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2894 :{WINDOW_COLOUR_2}Flight of Fantasy: (Steve Blenkinsopp) copyright {COPYRIGHT} Chris Sawyer +STR_2895 :{WINDOW_COLOUR_2}Big Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2896 :{WINDOW_COLOUR_2}Hypothermia: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2897 :{WINDOW_COLOUR_2}Last Sleigh 라이드: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2898 :{WINDOW_COLOUR_2}Pipes of Glencairn: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2899 :{WINDOW_COLOUR_2}Traffic Jam: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2900 :{WINDOW_COLOUR_2} +STR_2901 :{WINDOW_COLOUR_2}(Samples courtesy of Spectrasonics {ENDQUOTES}Liquid Grooves{ENDQUOTES}) +STR_2902 :{WINDOW_COLOUR_2}Toccata: (C.M.Widor, played by Peter James Adcock) recording {COPYRIGHT} Chris Sawyer +STR_2903 :{WINDOW_COLOUR_2}Space Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2904 :{WINDOW_COLOUR_2}Manic Mechanic: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2905 :{WINDOW_COLOUR_2}Techno Torture: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2906 :{WINDOW_COLOUR_2}Sweat Dreams: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2907 :{WINDOW_COLOUR_2}What shall we do with the Drunken Sailor: (Anon/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2908 :{WINDOW_COLOUR_2}Infogrames Interactive +STR_2909 :{WINDOW_COLOUR_2}Senior Producer: Thomas J. Zahorik +STR_2910 :{WINDOW_COLOUR_2}Executive Producer: Bill Levay +STR_2911 :{WINDOW_COLOUR_2}Senior Marketing Product Manager: Scott Triola +STR_2912 :{WINDOW_COLOUR_2}V.P. of Product Development: Scott Walker +STR_2913 :{WINDOW_COLOUR_2}General Manager: John Hurlbut +STR_2914 :{WINDOW_COLOUR_2}Director of Quality Assurance: Michael Craighead +STR_2915 :{WINDOW_COLOUR_2}Q.A. Certification Manager: Kurt Boutin +STR_2916 :{WINDOW_COLOUR_2}Q.A. Certification Lead: Mark Huggins +STR_2917 :{WINDOW_COLOUR_2}Testers: Dena Irene Fitzgerald, Scott Rollins, Christopher McPhail +STR_2918 :{WINDOW_COLOUR_2}Clif McClure, Erik Maramaldi, Erik Jeffery +STR_2919 :{WINDOW_COLOUR_2}Director of Marketing: Ann Marie Bland +STR_2920 :{WINDOW_COLOUR_2}Manager of Creative Services: Steve Martin +STR_2921 :{WINDOW_COLOUR_2}Manager of Editorial & Documentation Services: Elizabeth Mackney +STR_2922 :{WINDOW_COLOUR_2}Graphic Designer: Paul Anselmi +STR_2923 :{WINDOW_COLOUR_2}Copywriter: Kurt Carlson +STR_2924 :{WINDOW_COLOUR_2}Special Thanks to: Peter Matiss +STR_2925 :{WINDOW_COLOUR_2}Engineering Specialist: Ken Edwards +STR_2926 :{WINDOW_COLOUR_2}Engineering Services Manager: Luis Rivas +STR_2927 :{WINDOW_COLOUR_2}Lead Compatibility Analyst: Geoffrey Smith +STR_2928 :{WINDOW_COLOUR_2}Compatibility Analysts: Jason Cordero, Burke McQuinn, Kim Jardin +STR_2929 :{WINDOW_COLOUR_2}Lead Tester: Daniel Frisoli +STR_2930 :{WINDOW_COLOUR_2}Senior Tester: Matt Pantaleoni +STR_2931 :{WINDOW_COLOUR_2} +STR_2932 :{WINDOW_COLOUR_2} +STR_2933 :{WINDOW_COLOUR_2} +STR_2934 :{WINDOW_COLOUR_2} +STR_2935 :{WINDOW_COLOUR_2} +STR_2936 :{WINDOW_COLOUR_2} +STR_2937 :{WINDOW_COLOUR_2} +STR_2938 :{WINDOW_COLOUR_2} +STR_2939 :{WINDOW_COLOUR_2} +STR_2940 :{WINDOW_COLOUR_2} +STR_2941 :{WINDOW_COLOUR_2} +STR_2942 :{WINDOW_COLOUR_2} +STR_2943 :{WINDOW_COLOUR_2} +STR_2944 :{WINDOW_COLOUR_2} +STR_2945 :{WINDOW_COLOUR_2} +STR_2946 :{WINDOW_COLOUR_2} +STR_2947 :{WINDOW_COLOUR_2} +STR_2948 :{WINDOW_COLOUR_2} +STR_2949 :{WINDOW_COLOUR_2} +STR_2950 :{WINDOW_COLOUR_2} +STR_2951 :{WINDOW_COLOUR_2} +STR_2952 :{WINDOW_COLOUR_2} +STR_2953 :{WINDOW_COLOUR_2} +STR_2954 :{WINDOW_COLOUR_2} +STR_2955 :{WINDOW_COLOUR_2} +STR_2956 :{WINDOW_COLOUR_2} +STR_2957 :{WINDOW_COLOUR_2} +STR_2958 :{WINDOW_COLOUR_2} +STR_2959 :{WINDOW_COLOUR_2} +STR_2960 :{WINDOW_COLOUR_2} +STR_2961 :{WINDOW_COLOUR_2} +STR_2962 :{WINDOW_COLOUR_2} +STR_2963 :{WINDOW_COLOUR_2} +STR_2964 :{WINDOW_COLOUR_2} +STR_2965 :{WINDOW_COLOUR_2} +STR_2966 : +STR_2967 : +STR_2968 : +STR_2969 : +STR_2970 : +STR_2971 :Main colour scheme +STR_2972 :Alternative colour scheme 1 +STR_2973 :Alternative colour scheme 2 +STR_2974 :Alternative colour scheme 3 +STR_2975 :{SMALLFONT}{BLACK}Select which colour scheme to change, or paint 라이드 with +STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this 라이드 using the selected colour scheme +STR_2977 :Staff member name +STR_2978 :Enter new name for this member of staff: +STR_2979 :Can't name staff member... +STR_2980 :Too many banners in game +STR_2981 :{RED}No entry - - +STR_2982 :Banner text +STR_2983 :Enter new text for this banner: +STR_2984 :Can't set new text for banner... +STR_2985 :Banner +STR_2986 :{SMALLFONT}{BLACK}Change text on banner +STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for 손님s +STR_2988 :{SMALLFONT}{BLACK}Demolish this banner +STR_2989 :{SMALLFONT}{BLACK}Select main colour +STR_2990 :{SMALLFONT}{BLACK}Select text colour +STR_2991 :Sign +STR_2992 :Sign text +STR_2993 :Enter new text for this sign: +STR_2994 :{SMALLFONT}{BLACK}Change text on sign +STR_2995 :{SMALLFONT}{BLACK}Demolish this sign +STR_2996 :{BLACK}ABC +STR_2997 :{GREY}ABC +STR_2998 :{WHITE}ABC +STR_2999 :{RED}ABC +STR_3000 :{GREEN}ABC +STR_3001 :{YELLOW}ABC +STR_3002 :{TOPAZ}ABC +STR_3003 :{CELADON}ABC +STR_3004 :{BABYBLUE}ABC +STR_3005 :{PALELAVENDER}ABC +STR_3006 :{PALEGOLD}ABC +STR_3007 :{LIGHTPINK}ABC +STR_3008 :{PEARLAQUA}ABC +STR_3009 :{PALESILVER}ABC +STR_3010 :Unable to load file... +STR_3011 :File contains invalid data +STR_3012 :Dodgems beat style +STR_3013 :Fairground organ style +STR_3014 :Roman fanfare style +STR_3015 :Oriental style +STR_3016 :Martian style +STR_3017 :Jungle drums style +STR_3018 :Egyptian style +STR_3019 :Toyland style +STR_3020 : +STR_3021 :Space style +STR_3022 :Horror style +STR_3023 :Techno style +STR_3024 :Gentle style +STR_3025 :Summer style +STR_3026 :Water style +STR_3027 :Wild west style +STR_3028 :Jurassic style +STR_3029 :Rock style +STR_3030 :Ragtime style +STR_3031 :Fantasy style +STR_3032 :Rock style 2 +STR_3033 :Ice style +STR_3034 :Snow style +STR_3035 :Custom music 1 +STR_3036 :Custom music 2 +STR_3037 :Medieval style +STR_3038 :Urban style +STR_3039 :Organ style +STR_3040 :Mechanical style +STR_3041 :Modern style +STR_3042 :Pirates style +STR_3043 :Rock style 3 +STR_3044 :Candy style +STR_3045 :{SMALLFONT}{BLACK}Select style of music to play +STR_3046 :This 라이드 cannot be modified +STR_3047 :Local authority forbids demolition or modifications to this 라이드 +STR_3048 :Marketing campaigns forbidden by local authority +STR_3049 :Golf hole A +STR_3050 :Golf hole B +STR_3051 :Golf hole C +STR_3052 :Golf hole D +STR_3053 :Golf hole E +STR_3054 :Loading... +STR_3055 :White +STR_3056 :Translucent +STR_3057 :{WINDOW_COLOUR_2}Construction Marker: +STR_3058 :Brick walls +STR_3059 :Hedges +STR_3060 :Ice blocks +STR_3061 :우든 fences +STR_3062 :{SMALLFONT}{BLACK}Standard 롤러코스터 track +STR_3063 :{SMALLFONT}{BLACK}Water channel (track submerged) +STR_3064 :Beginner Parks +STR_3065 :Challenging Parks +STR_3066 :Expert Parks +STR_3067 :{OPENQUOTES}Real{ENDQUOTES} Parks +STR_3068 :Other Parks +STR_3069 :Top Section +STR_3070 :Slope to Level +STR_3071 :{WINDOW_COLOUR_2}Same price throughout park +STR_3072 :{SMALLFONT}{BLACK}Select whether this price is used throughout the entire park +STR_3073 :{RED}WARNING: Your park rating has dropped below 700 !{NEWLINE}If you haven't raised the park rating in 4 weeks, your park will be closed down +STR_3074 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have 3 weeks to raise the park rating +STR_3075 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have only 2 weeks to raise the park rating, or your park will be closed down +STR_3076 :{RED}FINAL WARNING: Your park rating is still below 700 !{NEWLINE}In just 7 days your park will be closed down unless you can raise the rating +STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! +STR_3078 :Plain entrance +STR_3079 :우든 entrance +STR_3080 :Canvas tent entrance +STR_3081 :Castle entrance (grey) +STR_3082 :Castle entrance (brown) +STR_3083 :Jungle entrance +STR_3084 :Log cabin entrance +STR_3085 :Classical/Roman entrance +STR_3086 :Abstract entrance +STR_3087 :Snow/Ice entrance +STR_3088 :Pagoda entrance +STR_3089 :Space entrance +STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station +STR_3091 :You are not allowed to remove this section! +STR_3092 :You are not allowed to move or modify the station for this 라이드! +STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} +STR_3094 :N/A +STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: +STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed +STR_3098 :Can't change lift hill speed... +STR_3099 :{SMALLFONT}{BLACK}Select colour +STR_3100 :{SMALLFONT}{BLACK}Select second colour +STR_3101 :{SMALLFONT}{BLACK}Select third colour +STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape +STR_3103 :Can't re-paint this... +STR_3104 :{SMALLFONT}{BLACK}List 라이드s +STR_3105 :{SMALLFONT}{BLACK}List shops and 상점s +STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other 손님 facilities +STR_3107 :Close +STR_3108 :Test +STR_3109 :Open +STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16} +STR_3111 :{SMALLFONT}{BLACK}Click on design to build it +STR_3112 :{SMALLFONT}{BLACK}Click on design to rename or delete it +STR_3113 :Select a different design +STR_3114 :{SMALLFONT}{BLACK}Go back to design selection window +STR_3115 :{SMALLFONT}{BLACK}Save track design +STR_3116 :{SMALLFONT}{BLACK}Save track design (Not possible until 라이드 has been tested and statistics have been generated) +STR_3117 :{BLACK}Calling mechanic... +STR_3118 :{BLACK}{STRINGID} is heading for the 라이드 +STR_3119 :{BLACK}{STRINGID} is fixing the 라이드 +STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing 라이드 +STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy +STR_3122 :{WINDOW_COLOUR_2}Favourite 라이드 of: {BLACK}{COMMA16} 손님 +STR_3123 :{WINDOW_COLOUR_2}Favourite 라이드 of: {BLACK}{COMMA16} 손님s +STR_3124 :Broken {STRINGID} +STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% +STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% +STR_3127 :{WINDOW_COLOUR_2}Nausea Factor: {BLACK}+{COMMA16}% +STR_3128 :Save Track Design +STR_3129 :Save Track Design with Scenery +STR_3130 :Save +STR_3131 :Cancel +STR_3132 :{BLACK}Click items of scenery to select them to be saved with track design... +STR_3133 :Unable to build this on a slope +STR_3134 :{RED}(Design includes scenery which is unavailable) +STR_3135 :{RED}(Vehicle design unavailable - 라이드 performance may be affected) +STR_3136 :Warning: This design will be built with an alternative vehicle type and may not perform as expected +STR_3137 :Select Nearby Scenery +STR_3138 :Reset Selection +STR_3139 :Cable lift unable to work in this operating mode +STR_3140 :Cable lift hill must start immediately after station +STR_3141 :Multi-circuit per 라이드 not possible with cable lift hill +STR_3142 :{WINDOW_COLOUR_2}Capacity: {BLACK}{STRINGID} +STR_3143 :{SMALLFONT}{BLACK}Show people on map +STR_3144 :{SMALLFONT}{BLACK}Show 라이드s and 상점s on map +STR_3145 :{SMALLFONT}{BLACK}Scroll {STRINGID} left +STR_3146 :{SMALLFONT}{BLACK}Scroll {STRINGID} right +STR_3147 :{SMALLFONT}{BLACK}Scroll {STRINGID} left fast +STR_3148 :{SMALLFONT}{BLACK}Scroll {STRINGID} right fast +STR_3149 :{SMALLFONT}{BLACK}Scroll {STRINGID} left/right +STR_3150 :{SMALLFONT}{BLACK}Scroll {STRINGID} up +STR_3151 :{SMALLFONT}{BLACK}Scroll {STRINGID} down +STR_3152 :{SMALLFONT}{BLACK}Scroll {STRINGID} up fast +STR_3153 :{SMALLFONT}{BLACK}Scroll {STRINGID} down fast +STR_3154 :{SMALLFONT}{BLACK}Scroll {STRINGID} up/down +STR_3155 : +STR_3156 : +STR_3157 :map +STR_3158 :graph +STR_3159 :list +STR_3160 : +STR_3161 : +STR_3162 :Unable to allocate enough memory +STR_3163 :설치ing new data: +STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) +STR_3165 : +STR_3166 :{BLACK}(ID: +STR_3167 :{WINDOW_COLOUR_2}Includes: {BLACK}{COMMA16} objects +STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} +STR_3169 :Data for the following object not found: +STR_3170 :Not enough space for graphics +STR_3171 :Too many objects of this type selected +STR_3172 :The following object must be selected first: {STRING} +STR_3173 :This object is currently in use +STR_3174 :This object is required by another object +STR_3175 :This object is always required +STR_3176 :Unable to select this object +STR_3177 :Unable to de-select this object +STR_3178 :At least one path object must be selected +STR_3179 :At least one 라이드 vehicle/attraction object must be selected +STR_3180 :Invalid selection of objects +STR_3181 :Object Selection - {STRINGID} +STR_3182 :Park entrance type must be selected +STR_3183 :Water type must be selected +STR_3184 :라이드 Vehicles/Attractions +STR_3185 :Small Scenery +STR_3186 :Large Scenery +STR_3187 :Walls/Fences +STR_3188 :Path Signs +STR_3189 :보도s +STR_3190 :Path Extras +STR_3191 :Scenery Groups +STR_3192 :Park Entrance +STR_3193 :Water +STR_3194 :Scenario Description +STR_3195 :Invention List +STR_3196 :{WINDOW_COLOUR_2}Research Group: {BLACK}{STRINGID} +STR_3197 :{WINDOW_COLOUR_2}Items pre-invented at start of game: +STR_3198 :{WINDOW_COLOUR_2}Items to invent during game: +STR_3199 :Random Shuffle +STR_3200 :{SMALLFONT}{BLACK}Randomly shuffle the list of items to invent during the game +STR_3201 :Object Selection +STR_3202 :Landscape Editor +STR_3203 :Invention List Set Up +STR_3204 :Options Selection +STR_3205 :Objective Selection +STR_3206 :Save Scenario +STR_3207 :롤러코스터 Designer +STR_3208 :Track Designs Manager +STR_3209 :Back to Previous Step: +STR_3210 :Forward to Next Step: +STR_3211 :{WINDOW_COLOUR_2}Map size: +STR_3212 :{POP16}{COMMA16} x {PUSH16}{COMMA16} +STR_3213 :Can't decrease map size any further +STR_3214 :Can't increase map size any further +STR_3215 :Too close to edge of map +STR_3216 :{SMALLFONT}{BLACK}Select park-owned land etc. +STR_3217 :Land Owned +STR_3218 :Construction Rights Owned +STR_3219 :Land For Sale +STR_3220 :Construction Rights For Sale +STR_3221 :{SMALLFONT}{BLACK}Set land to be owned by the park +STR_3222 :{SMALLFONT}{BLACK}Set construction rights only to be owned by the park +STR_3223 :{SMALLFONT}{BLACK}Set land to be available to purchase by the park +STR_3224 :{SMALLFONT}{BLACK}Set construction rights to be available to purchase by the park +STR_3225 :{SMALLFONT}{BLACK}Toggle on/off building a random cluster of objects around the selected position +STR_3226 :{SMALLFONT}{BLACK}Build park entrance +STR_3227 :Too many park entrances! +STR_3228 :{SMALLFONT}{BLACK}Set starting positions for people +STR_3229 :블록 브레이크 cannot be used directly after station +STR_3230 :블록 브레이크 cannot be used directly after each other +STR_3231 :블록 브레이크 cannot be used directly after the top of this lift hill +STR_3232 :Options - Financial +STR_3233 :Options - 손님s +STR_3234 :Options - Park +STR_3235 :{SMALLFONT}{BLACK}Show financial options +STR_3236 :{SMALLFONT}{BLACK}Show 손님 options +STR_3237 :{SMALLFONT}{BLACK}Show park options +STR_3238 :No Money +STR_3239 :{SMALLFONT}{BLACK}Make this park a 'no money' park with no financial restrictions +STR_3240 :{WINDOW_COLOUR_2}Initial cash: +STR_3241 :{WINDOW_COLOUR_2}Initial loan: +STR_3242 :{WINDOW_COLOUR_2}Maximum loan size: +STR_3243 :{WINDOW_COLOUR_2}Annual interest rate: +STR_3244 :Forbid marketing campaigns +STR_3245 :{SMALLFONT}{BLACK}Forbid advertising, promotional schemes, and other marketing campaigns +STR_3246 :{WINDOW_COLOUR_2}{CURRENCY} +STR_3247 :{WINDOW_COLOUR_2}{COMMA16}% +STR_3248 :Can't increase initial cash any further! +STR_3249 :Can't reduce initial cash any further! +STR_3250 :Can't increase initial loan any further! +STR_3251 :Can't reduce initial loan any further! +STR_3252 :Can't increase maximum loan size any further! +STR_3253 :Can't reduce maximum loan size any further! +STR_3254 :Can't increase interest rate any further! +STR_3255 :Can't reduce interest rate any further! +STR_3256 :손님s prefer less intense 라이드s +STR_3257 :{SMALLFONT}{BLACK}Select whether 손님s should generally prefer less intense 라이드s only +STR_3258 :손님s prefer more intense 라이드s +STR_3259 :{SMALLFONT}{BLACK}Select whether 손님s should generally prefer more intense 라이드s only +STR_3260 :{WINDOW_COLOUR_2}Cash per 손님 (average): +STR_3261 :{WINDOW_COLOUR_2}손님s initial happiness: +STR_3262 :{WINDOW_COLOUR_2}손님s initial hunger: +STR_3263 :{WINDOW_COLOUR_2}손님s initial thirst: +STR_3264 :Can't increase this any further! +STR_3265 :Can't reduce this any further! +STR_3266 :{SMALLFONT}{BLACK}Select how this park charges for entrance and 라이드s +STR_3267 :Forbid tree removal +STR_3268 :{SMALLFONT}{BLACK}Forbid tall trees being removed +STR_3269 :Forbid landscape changes +STR_3270 :{SMALLFONT}{BLACK}Forbid any changes to the landscape +STR_3271 :Forbid high construction +STR_3272 :{SMALLFONT}{BLACK}Forbid any tall construction +STR_3273 :Park rating higher difficult level +STR_3274 :{SMALLFONT}{BLACK}Make the park rating value more challenging +STR_3275 :손님 generation higher difficult level +STR_3276 :{SMALLFONT}{BLACK}Make it more difficult to attract 손님s to the park +STR_3277 :{WINDOW_COLOUR_2}Cost to buy land: +STR_3278 :{WINDOW_COLOUR_2}Cost to buy construction rights: +STR_3279 :Free park entry / Pay per 라이드 +STR_3280 :Pay to enter park / Free 라이드s +STR_3281 :{WINDOW_COLOUR_2}Entry price: +STR_3282 :{SMALLFONT}{BLACK}Select objective and park name +STR_3283 :{SMALLFONT}{BLACK}Select 라이드s to be preserved +STR_3284 :Objective Selection +STR_3285 :Preserved 라이드s +STR_3286 :{SMALLFONT}{BLACK}Select objective for this scenario +STR_3287 :{WINDOW_COLOUR_2}Objective: +STR_3288 :{SMALLFONT}{BLACK}Select climate +STR_3289 :{WINDOW_COLOUR_2}Climate: +STR_3290 :Cool and wet +STR_3291 :Warm +STR_3292 :Hot and dry +STR_3293 :Cold +STR_3294 :Change... +STR_3295 :{SMALLFONT}{BLACK}Change name of park +STR_3296 :{SMALLFONT}{BLACK}Change name of scenario +STR_3297 :{SMALLFONT}{BLACK}Change detail notes about park / scenario +STR_3298 :{WINDOW_COLOUR_2}Park Name: {BLACK}{STRINGID} +STR_3299 :{WINDOW_COLOUR_2}Park/Scenario Details: +STR_3300 :{WINDOW_COLOUR_2}Scenario Name: {BLACK}{STRINGID} +STR_3301 :{WINDOW_COLOUR_2}Objective Date: +STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR} +STR_3303 :{WINDOW_COLOUR_2}Number of 손님s: +STR_3304 :{WINDOW_COLOUR_2}Park value: +STR_3305 :{WINDOW_COLOUR_2}Monthly income: +STR_3306 :{WINDOW_COLOUR_2}Monthly profit: +STR_3307 :{WINDOW_COLOUR_2}미니mum length: +STR_3308 :{WINDOW_COLOUR_2}Excitement rating: +STR_3309 :{WINDOW_COLOUR_2}{COMMA16} +STR_3310 :{WINDOW_COLOUR_2}{LENGTH} +STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32} +STR_3312 :{WINDOW_COLOUR_2}라이드s/attractions under a preservation order: +STR_3313 :Scenario Name +STR_3314 :Enter name for scenario: +STR_3315 :Park/Scenario Details +STR_3316 :Enter description of this scenario: +STR_3317 :No details yet +STR_3318 :{SMALLFONT}{BLACK}Select which group this scenario appears in +STR_3319 :{WINDOW_COLOUR_2}Scenario Group: +STR_3320 :Unable to save scenario file... +STR_3321 :New objects 설치ed successfully +STR_3322 :{WINDOW_COLOUR_2}Objective: {BLACK}{STRINGID} +STR_3323 :Missing object data, ID: +STR_3324 :Requires Add-On Pack: +STR_3325 :Requires an Add-On Pack +STR_3326 :{WINDOW_COLOUR_2}(no image) +STR_3327 :Starting positions for people not set +STR_3328 :Can't advance to next editor stage... +STR_3329 :Park entrance not yet built +STR_3330 :Park must own some land +STR_3331 :Path from park entrance to map edge either not complete or too complex - Path must be single-width with as few junctions and corners as possible +STR_3332 :Park entrance is the wrong way round or has no path leading to the map edge +STR_3333 :Export plug-in objects with saved games +STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data +STR_3335 :롤러코스터 Designer - Select 라이드 Types & Vehicles +STR_3336 :Track Designs Manager - Select 라이드 Type +STR_3337 : +STR_3338 :{BLACK}Custom-designed layout +STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout +STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout +STR_3341 :{SMALLFONT}{BLACK}Game tools +STR_3342 :Scenario Editor +STR_3343 :Convert Saved Game to Scenario +STR_3344 :롤러코스터 Designer +STR_3345 :Track Designs Manager +STR_3346 :Can't save track design... +STR_3347 :라이드 is too large, contains too many elements, or scenery is too spread out +STR_3348 :Rename +STR_3349 :Delete +STR_3350 :Track design name +STR_3351 :Enter new name for this track design: +STR_3352 :Can't rename track design... +STR_3353 :New name contains invalid characters +STR_3354 :Another file exists with this name, or file is write-protected +STR_3355 :File is write-protected or locked +STR_3356 :Delete File +STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ? +STR_3358 :Can't delete track design... +STR_3359 :{BLACK}No track designs of this type +STR_3360 :Warning! +STR_3361 :Too many track designs of this type - Some will not be listed. +STR_3362 : +STR_3363 : +STR_3364 :Advanced +STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups +STR_3366 :{BLACK}= 라이드 +STR_3367 :{BLACK}= Food 상점 +STR_3368 :{BLACK}= Drink 상점 +STR_3369 :{BLACK}= Souvenir 상점 +STR_3370 :{BLACK}= Info. Kiosk +STR_3371 :{BLACK}= First Aid +STR_3372 :{BLACK}= Cash Machine +STR_3373 :{BLACK}= Toilet +STR_3374 :Warning: Too many objects selected! +STR_3375 :Not all objects in this scenery group could be selected +STR_3376 :설치 new track design... +STR_3377 :{SMALLFONT}{BLACK}설치 a new track design file +STR_3378 :설치 +STR_3379 :Cancel +STR_3380 :Unable to 설치 this track design... +STR_3381 :File is not compatible or contains invalid data +STR_3382 :File copy failed +STR_3383 :Select new name for track design +STR_3384 :An existing track design already has this name - Please select a new name for this design: +STR_3385 :Beginners Tutorial +STR_3386 :Custom 라이드s Tutorial +STR_3387 :롤러코스터 Building Tutorial +STR_3388 :Unable to switch to selected mode +STR_3389 :Unable to select additional item of scenery... +STR_3390 :Too many items selected +STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... +STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... +STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... +STR_3394 :{SMALLFONT}{BLACK}You can also rotate the view in 90 degree steps... +STR_3395 :{SMALLFONT}{BLACK}Building anything at this scale is a bit difficult, so let's zoom the view back in again... +STR_3396 :{SMALLFONT}{BLACK}Let's build a simple 라이드 to get the park started... +STR_3397 :{SMALLFONT}{BLACK}The white 'ghost' image shows where the 라이드 will be built. We'll move the pointer to select the position then click to build it... +STR_3398 :{SMALLFONT}{BLACK}라이드s need an entrance and an exit. We'll move the pointer to a square on the edge of the 라이드 and then click to build first the entrance and then the exit... +STR_3399 :{SMALLFONT}{BLACK}We need to build 보도s to allow 손님s to reach our new 라이드... +STR_3400 :{SMALLFONT}{BLACK}For the path to the 라이드 entrance we'll use a special 'queue line' path... +STR_3401 :{SMALLFONT}{BLACK}For the exit path, just an 'ordinary' path will do... +STR_3402 :{SMALLFONT}{BLACK}Right, lets open the 라이드! To open the 라이드 we click the flag icon on the 라이드 window and select 'open'... +STR_3403 :{SMALLFONT}{BLACK}But where are the 손님s? +STR_3404 :{SMALLFONT}{BLACK}Oh - The park is still closed! Right - Let's open it... +STR_3405 :{SMALLFONT}{BLACK}While we're waiting for our first 손님s, let's build some scenery... +STR_3406 :{SMALLFONT}{BLACK}Here's our empty park. We're going to build a simple custom-designed 라이드... +STR_3407 :{SMALLFONT}{BLACK}First we need to choose a starting position... +STR_3408 :{SMALLFONT}{BLACK}The section of track we've just built is a 'station platform', to allow 손님s to get on and off the 라이드... +STR_3409 :{SMALLFONT}{BLACK}We'll extend the platform a bit by adding a couple more station platform sections... +STR_3410 :{SMALLFONT}{BLACK}The icons at the top of the construction window let you choose different track pieces to add... +STR_3411 :{SMALLFONT}{BLACK}We'll select a 왼쪽 커브... +STR_3412 :{SMALLFONT}{BLACK}The curve hasn't been built yet, but the white ghost image shows where it will be built. Clicking the large 'build this' icon actually builds the track... +STR_3413 :{SMALLFONT}{BLACK}Now we want to build straight track, so we click the straight track icon... +STR_3414 :{SMALLFONT}{BLACK}Now that the circuit is complete, we need to build the 라이드 entrance and exit... +STR_3415 :{SMALLFONT}{BLACK}Let's test our 라이드 to check it works... +STR_3416 :{SMALLFONT}{BLACK}White it's being tested, we'll build the queue line and exit path... +STR_3417 :{SMALLFONT}{BLACK}OK - Let's open the park and the 라이드... +STR_3418 :{SMALLFONT}{BLACK}Our new 라이드 isn't very exciting - Perhaps we should add some scenery? +STR_3419 :{SMALLFONT}{BLACK}To build scenery above other scenery or in mid-air, hold down the SHIFT key and move the mouse to select the height... +STR_3420 :{SMALLFONT}{BLACK}Some types of scenery can be re-painted after it's built... +STR_3421 :{SMALLFONT}{BLACK}Let's add some music to the 라이드... +STR_3422 :{SMALLFONT}{BLACK}Let's build a 롤러코스터 ! +STR_3423 :{SMALLFONT}{BLACK}There are loads of pre-designed 코스터s, but we're going to build our own custom design... +STR_3424 :{SMALLFONT}{BLACK}That's the station platform built. Now we need a lift hill... +STR_3425 :{SMALLFONT}{BLACK}롤러코스터 trains aren't powered, so a 'chain lift' is needed to pull the train up the first hill... +STR_3426 :{SMALLFONT}{BLACK}That's the lift hill complete - Now for the first drop... +STR_3427 :{SMALLFONT}{BLACK}Those curves are a bad idea - The 라이더 will be flung to the sides by the lateral G forces as the train hurtles around... +STR_3428 :{SMALLFONT}{BLACK}Banking the curves will improve the 라이드 - 라이더 will be pushed down into their seats instead of flung to the sides... +STR_3429 :{SMALLFONT}{BLACK}No - That won't work! Look at the height marks - The second hill is taller than the lift hill... +STR_3430 :{SMALLFONT}{BLACK}To ensure the train makes it around, each hill should be slightly smaller than the previous one... +STR_3431 :{SMALLFONT}{BLACK}That's better - Our train should make it up that hill now! Let's try some more twisted track... +STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve and station, so let's add some brakes... +STR_3433 :{SMALLFONT}{BLACK}And finally we'll add '블록 브레이크', which allow two trains to operate more safely on the circuit... +STR_3434 :{SMALLFONT}{BLACK}Let's test the 라이드 and see if it works! +STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the 보도s and let 손님s onto our new 롤러코스터... +STR_3436 :{SMALLFONT}{BLACK}While waiting for our first 라이더, we could customise the 라이드 a bit... +STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape +STR_3438 :Unable to remove all scenery from here... +STR_3439 :Clear Scenery +STR_3440 :Page 1 +STR_3441 :Page 2 +STR_3442 :Page 3 +STR_3443 :Page 4 +STR_3444 :Page 5 +STR_3445 :Set Patrol Area +STR_3446 :Cancel Patrol Area + +# New strings, cleaner +STR_5120 :Finances +STR_5121 :Research +STR_5122 :Select 라이드s by track type (like in RCT1) +STR_5123 :Renew 라이드s +STR_5124 : +STR_5125 :All destructable +STR_5126 :Random title music +STR_5127 :{SMALLFONT}{BLACK}Disable land elevation +STR_5128 :Selection size +STR_5129 :Enter selection size between {COMMA16} and {COMMA16} +STR_5130 :Map size +STR_5131 :Enter map size between {COMMA16} and {COMMA16} +STR_5132 :Fix all 라이드s +STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights +STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights +STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights +STR_5136 :Land rights +STR_5137 :Allow lift hill and launch speeds{NEWLINE}up to {VELOCITY} +STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} +STR_5139 :{WHITE}{STRINGID} +STR_5140 :Disable brakes failure +STR_5141 :Disable all breakdowns +STR_5142 :Normal Speed +STR_5143 :Quick Speed +STR_5144 :Fast Speed +STR_5145 :Turbo Speed +STR_5146 :Hyper Speed +STR_5147 :Cheats +STR_5148 :{SMALLFONT}{BLACK}Change the game speed +STR_5149 :{SMALLFONT}{BLACK}Open the cheats window +STR_5150 :Enable debugging tools +STR_5151 :, +STR_5152 :. +STR_5153 :Edit Themes... +STR_5154 :Hardware display +STR_5155 :Allow testing of unfinished tracks +STR_5156 :{SMALLFONT}{BLACK}Allows testing of most 라이드 types even when the track is unfinished, does not apply to block sectioned modes +STR_5157 :Unlock all prices +STR_5158 :Quit to menu +STR_5159 :Exit OpenRCT2 +STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} +STR_5161 :Date Format: +STR_5162 :Day/Month/Year +STR_5163 :Month/Day/Year +STR_5164 :Twitch Channel name +STR_5165 :Name peeps after followers +STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers +STR_5167 :Track follower peeps +STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for 손님s named after channel's Twitch followers +STR_5169 :Name peeps after people in Twitch chat +STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat +STR_5171 :Track chat peeps +STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for 손님s named after Twitch chat participants +STR_5173 :Pull Twitch chat as news +STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications +STR_5175 :Input the name of your Twitch channel +STR_5176 :Enable Twitch integration +STR_5177 :Fullscreen mode: +STR_5178 :{SMALLFONT}{BLACK}Show financial cheats +STR_5179 :{SMALLFONT}{BLACK}Show 손님 cheats +STR_5180 :{SMALLFONT}{BLACK}Show park cheats +STR_5181 :{SMALLFONT}{BLACK}Show 라이드 cheats +STR_5182 :{INT32} +STR_5183 :Base height +STR_5184 :Enter base height between {COMMA16} and {COMMA16} +STR_5185 :Water level +STR_5186 :Enter water level between {COMMA16} and {COMMA16} +STR_5187 :Finances +STR_5188 :New Campaign +STR_5189 :Research +STR_5190 :Map +STR_5191 :Viewport +STR_5192 :Recent News +STR_5193 :Land +STR_5194 :Water +STR_5195 :Clear Scenery +STR_5196 :Land Rights +STR_5197 :Scenery +STR_5198 :보도 +STR_5199 :라이드 Construction +STR_5200 :Track Design Place +STR_5201 :New 라이드 +STR_5202 :Track Design Selection +STR_5203 :라이드 +STR_5204 :라이드 List +STR_5205 :손님 +STR_5206 :손님 List +STR_5207 :Staff +STR_5208 :Staff List +STR_5209 :Banner +STR_5210 :Object Selection +STR_5211 :Invention List +STR_5212 :Scenario Options +STR_5213 :Objective Options +STR_5214 :Map Generation +STR_5215 :Track Design Manager +STR_5216 :Track Design Manager List +STR_5217 :Cheats +STR_5218 :Themes +STR_5219 :Options +STR_5220 :Keyboard Shortcuts +STR_5221 :Change Keyboard Shortcut +STR_5222 :Load/Save +STR_5223 :Save Prompt +STR_5224 :Demolish 라이드 Prompt +STR_5225 :Fire Staff Prompt +STR_5226 :Track Delete Prompt +STR_5227 :Save Overwrite Prompt +STR_5228 :{SMALLFONT}{BLACK}Main UI +STR_5229 :{SMALLFONT}{BLACK}Park +STR_5230 :{SMALLFONT}{BLACK}Tools +STR_5231 :{SMALLFONT}{BLACK}라이드s and Peeps +STR_5232 :{SMALLFONT}{BLACK}Editors +STR_5233 :{SMALLFONT}{BLACK}Miscellaneous +STR_5234 :{SMALLFONT}{BLACK}Prompts +STR_5235 :{SMALLFONT}{BLACK}Settings +STR_5236 :Window: +STR_5237 :Palette: +STR_5238 :Current Theme: +STR_5239 :Duplicate +STR_5240 :Enter a name for the theme +STR_5241 :Can't change this theme +STR_5242 :Theme name already exists +STR_5243 :Invalid characters used +STR_5244 :Themes +STR_5245 :Top Toolbar +STR_5246 :Bottom Toolbar +STR_5247 :Track Editor Bottom Toolbar +STR_5248 :Scenario Editor Bottom Toolbar +STR_5249 :Title Menu Buttons +STR_5250 :Title Exit Button +STR_5251 :Title Options Button +STR_5252 :Title Scenario Selection +STR_5253 :Park Information +STR_5254 :Create +STR_5255 :{SMALLFONT}{BLACK}Create a new title sequence from scratch +STR_5256 :Create a new theme to make changes to +STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one +STR_5258 :{SMALLFONT}{BLACK}Delete the current theme +STR_5259 :{SMALLFONT}{BLACK}Rename the current theme +STR_5260 :Giant Screenshot +STR_5261 :Filter +STR_5262 :Wacky Worlds +STR_5263 :Time Twister +STR_5264 :Custom +STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible +STR_5266 :{SMALLFONT}{BLACK}Display +STR_5267 :{SMALLFONT}{BLACK}Culture and Units +STR_5268 :{SMALLFONT}{BLACK}Audio +STR_5269 :{SMALLFONT}{BLACK}Controls and interface +STR_5270 :{SMALLFONT}{BLACK}Miscellaneous +STR_5271 :{SMALLFONT}{BLACK}Twitch +STR_5272 :{SMALLFONT}{BLACK}Small Scenery +STR_5273 :{SMALLFONT}{BLACK}Large Scenery +STR_5274 :{SMALLFONT}{BLACK}보도 +STR_5275 :Search for Objects +STR_5276 :Enter the name of an object to search for +STR_5277 :Clear +STR_5278 :Sandbox mode +STR_5279 :Sandbox mode off +STR_5280 :{SMALLFONT}{BLACK}Allow editing land ownership settings through the Map window and other options that are normally restricted to the Scenario Editor +STR_5281 :{SMALLFONT}{BLACK}Features +STR_5282 :RCT1 라이드 Open/Close Lights +STR_5283 :RCT1 Park Open/Close Lights +STR_5284 :RCT1 Scenario Selection Font +STR_5285 :EXPLODE!!! +STR_5286 :{SMALLFONT}{BLACK}Makes some 손님s explode +STR_5287 :라이드 is already broken down +STR_5288 :라이드 is closed +STR_5289 :No breakdowns available for this 라이드 +STR_5290 :Fix 라이드 +STR_5291 :Can't force breakdown +STR_5292 :{SMALLFONT}{BLACK}Force a breakdown +STR_5293 :{SMALLFONT}{BLACK}Close 라이드/attraction +STR_5294 :{SMALLFONT}{BLACK}Test 라이드/attraction +STR_5295 :{SMALLFONT}{BLACK}Open 라이드/attraction +STR_5296 :{SMALLFONT}{BLACK}Close park +STR_5297 :{SMALLFONT}{BLACK}Open park +STR_5298 :{RED}{STRINGID} +STR_5299 :{LIGHTPINK}{STRINGID} +STR_5300 :{SMALLFONT}{BLACK}Quick fire staff +STR_5301 :{MEDIUMFONT}{BLACK}Clear your loan +STR_5302 :Clear loan +STR_5303 :Allow building in pause mode +STR_5304 :Title Sequence: +STR_5305 :Roller코스터 Tycoon 1 +STR_5306 :Roller코스터 Tycoon 1 (AA) +STR_5307 :Roller코스터 Tycoon 1 (AA + LL) +STR_5308 :Roller코스터 Tycoon 2 +STR_5309 :OpenRCT2 +STR_5310 :Random +STR_5311 :{SMALLFONT}{BLACK}Debug tools +STR_5312 :Show console +STR_5313 :Show tile inspector +STR_5314 :Tile inspector +STR_5315 :Grass +STR_5316 :Sand +STR_5317 :Dirt +STR_5318 :Rock +STR_5319 :Martian +STR_5320 :Checkerboard +STR_5321 :Grass clumps +STR_5322 :Ice +STR_5323 :Grid (red) +STR_5324 :Grid (yellow) +STR_5325 :Grid (blue) +STR_5326 :Grid (green) +STR_5327 :Sand (dark) +STR_5328 :Sand (light) +STR_5329 :Checkerboard (인버티드) +STR_5330 :Underground view +STR_5331 :Rock +STR_5332 :Wood (red) +STR_5333 :Wood (black) +STR_5334 :Ice +STR_5335 :라이드 entrance +STR_5336 :라이드 exit +STR_5337 :Park entrance +STR_5338 :Element type +STR_5339 :Base height +STR_5340 :Clearance height +STR_5341 :Flags +STR_5342 :Choose a map tile +STR_5343 :Automatically place staff +STR_5344 :Changelog +STR_5345 :Financial cheats +STR_5346 :손님 cheats +STR_5347 :Park cheats +STR_5348 :라이드 cheats +STR_5349 :{SMALLFONT}{BLACK}All 라이드s +STR_5350 :Max +STR_5351 :Min +STR_5352 :{BLACK}Happiness: +STR_5353 :{BLACK}Energy: +STR_5354 :{BLACK}Hunger: +STR_5355 :{BLACK}Thirst: +STR_5356 :{BLACK}Nausea: +STR_5357 :{BLACK}Nausea tolerance: +STR_5358 :{BLACK}Bathroom: +STR_5359 :Remove 손님s +STR_5360 :{SMALLFONT}{BLACK}Removes all 손님s from the map +STR_5361 :Give all 손님s: +STR_5362 :{BLACK}Set all 손님s' preferred 라이드 intensity to: +STR_5363 :More than 1 +STR_5364 :Less than 15 +STR_5365 :{BLACK}Staff speed: +STR_5366 :Normal +STR_5367 :Fast +STR_5368 :Reset crash status +STR_5369 :Park parameters... +STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}손님 generation and money. +STR_5371 :Object Selection +STR_5372 :Invert right mouse dragging +STR_5373 :Name {STRINGID} +STR_5374 :Date {STRINGID} +STR_5375 :{UP} +STR_5376 :{DOWN} +STR_5377 :{SMALLFONT}{BLACK}Saves +STR_5378 :{SMALLFONT}{BLACK}Script +STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command +STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence +STR_5381 :{SMALLFONT}{BLACK}Stop playing title sequence +STR_5382 :{SMALLFONT}{BLACK}Restart title sequence +STR_5383 :{SMALLFONT}{BLACK}Create a new title sequence based on the current one +STR_5384 :{SMALLFONT}{BLACK}Delete the current title sequence +STR_5385 :{SMALLFONT}{BLACK}Rename the current title sequence +STR_5386 :{SMALLFONT}{BLACK}Insert a new command +STR_5387 :{SMALLFONT}{BLACK}Edit the selected command +STR_5388 :{SMALLFONT}{BLACK}Delete the selected command +STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence +STR_5390 :{SMALLFONT}{BLACK}Move the selected command down +STR_5391 :{SMALLFONT}{BLACK}Move the selected command up +STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence +STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence +STR_5394 :{SMALLFONT}{BLACK}Rename the selected save +STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game +STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game +STR_5397 :Can only be used on the title screen +STR_5398 :Cannot edit title sequence while it's playing +STR_5399 :Press the stop button to continue editing +STR_5400 :Can't change this title sequence +STR_5401 :Create a new title sequence to make changes to +STR_5402 :Failed to load title sequence +STR_5403 :There may be no Load or Wait command or a save may be invalid +STR_5404 :Name already exists +STR_5405 :Enter a name for the save +STR_5406 :Enter a name for the title sequence +STR_5407 :Add +STR_5408 :Remove +STR_5409 :Insert +STR_5410 :Edit +STR_5411 :Reload +STR_5412 :Skip to +STR_5413 :Load +STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :Load{MOVE_X}{87}{STRING} +STR_5416 :Load{MOVE_X}{87}No save selected +STR_5417 :Location +STR_5418 :Location{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :Rotate +STR_5420 :Rotate{MOVE_X}{87}{COMMA16} +STR_5421 :Zoom +STR_5422 :Zoom{MOVE_X}{87}{COMMA16} +STR_5423 :Wait +STR_5424 :Wait{MOVE_X}{87}{COMMA16} +STR_5425 :Restart +STR_5426 :End +STR_5427 :Coordinates: +STR_5428 :Anticlockwise rotations: +STR_5429 :Zoom level: +STR_5430 :Seconds to wait: +STR_5431 :Save to load: +STR_5432 :Command: +STR_5433 :Title Sequences +STR_5434 :Command Editor +STR_5435 :Rename save +STR_5436 :Edit Title Sequences... +STR_5437 :No save selected +STR_5438 :Can't make changes while command editor is open +STR_5439 :A wait command with at least 4 seconds is required with a restart command +STR_5440 :미니mise fullscreen on focus loss +STR_5441 :{SMALLFONT}{BLACK}Identifies 라이드s by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. +STR_5442 :Force park rating: +STR_5443 :Speed{MOVE_X}{87}{STRINGID} +STR_5444 :Speed: +STR_5445 :Speed +STR_5446 :Get +STR_5447 :Type {STRINGID} +STR_5448 :라이드 / Vehicle {STRINGID} +STR_5449 :Reduce game speed +STR_5450 :Increase game speed +STR_5451 :Open cheats window +STR_5452 :Toggle visibility of toolbars +STR_5453 :Select another 라이드 +STR_5454 :Uncap FPS +STR_5455 :Enable sandbox mode +STR_5456 :Disable clearance checks +STR_5457 :Disable support limits +STR_5458 :Rotate clockwise +STR_5459 :Rotate anti-clockwise +STR_5460 :Rotate view anti-clockwise +STR_5461 :Set 손님s' parameters +STR_5462 :{CURRENCY} +STR_5463 :Goal: Have fun! +STR_5464 :General +STR_5465 :Climate +STR_5466 :Staff +STR_5467 :ALT + +STR_5468 :Recent messages +STR_5469 :Scroll map up +STR_5470 :Scroll map left +STR_5471 :Scroll map down +STR_5472 :Scroll map right +STR_5473 :Cycle day / night +STR_5474 :Display text on banners in upper case +STR_5475 :{COMMA16} weeks +STR_5476 :Hardware +STR_5477 :Map rendering +STR_5478 :Controls +STR_5479 :Toolbar +STR_5480 :Show toolbar buttons for: +STR_5481 :Themes +STR_5482 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}1 minute +STR_5483 :{BLACK}({COMMA16} weeks remaining) +STR_5484 :{BLACK}({COMMA16} week remaining) +STR_5485 :{SMALLFONT}{STRING} +STR_5486 :{BLACK}{COMMA16} +STR_5487 :{SMALLFONT}{BLACK}Show recent messages +STR_5488 :No entrance +STR_5489 :{SMALLFONT}{BLACK}Show only tracked 손님s +STR_5490 :Disable audio on focus loss From 86bcbafc019c0902d276d0efdb46a842a418c6a5 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 13 Aug 2015 09:00:49 +0200 Subject: [PATCH 0490/1173] Rename finance_mark_loan_settings_as_legitimate() to finance_update_loan_hash() --- src/editor.c | 2 +- src/game.c | 2 +- src/management/finance.c | 6 +++--- src/management/finance.h | 2 +- src/rct1.c | 2 +- src/scenario.c | 4 ++-- src/windows/editor_scenario_options.c | 12 ++++++------ 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/editor.c b/src/editor.c index 921b30afb0..193f393900 100644 --- a/src/editor.c +++ b/src/editor.c @@ -462,7 +462,7 @@ static int editor_read_s6(const char *path) RCT2_GLOBAL(0x013573DC, uint32) = min(RCT2_GLOBAL(0x013573DC, uint32), 100000); finance_reset_cash_to_initial(); - finance_mark_loan_settings_as_legitimate(); + finance_update_loan_hash(); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = clamp( MONEY(0,00), diff --git a/src/game.c b/src/game.c index e6cb1f9c78..a5eab478be 100644 --- a/src/game.c +++ b/src/game.c @@ -776,7 +776,7 @@ int game_load_save(const char *path) window_new_ride_init_vars(); RCT2_GLOBAL(0x009DEB7C, uint16) = 0; if (RCT2_GLOBAL(0x0013587C4, uint32) == 0) // this check is not in scenario play - finance_mark_loan_settings_as_legitimate(); + finance_update_loan_hash(); load_palette(); gfx_invalidate_screen(); diff --git a/src/management/finance.c b/src/management/finance.c index 49f3db2970..d17415ced0 100644 --- a/src/management/finance.c +++ b/src/management/finance.c @@ -188,7 +188,7 @@ void finance_init() { RCT2_GLOBAL(0x013587D8, uint16) = 0x3F; - finance_mark_loan_settings_as_legitimate(); + finance_update_loan_hash(); } /** @@ -244,7 +244,7 @@ void finance_update_daily_profit() } // This subroutine is used to mark loan changes as 'legitimate', to prevent cheat detection from incorrectly interfering -void finance_mark_loan_settings_as_legitimate() +void finance_update_loan_hash() { sint32 value = 0x70093A; value -= RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32); @@ -314,7 +314,7 @@ void game_command_set_current_loan(int* eax, int* ebx, int* ecx, int* edx, int* RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = newLoan; RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) = money; RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32) = ENCRYPT_MONEY(money); - finance_mark_loan_settings_as_legitimate(); + finance_update_loan_hash(); window_invalidate_by_class(WC_FINANCES); RCT2_GLOBAL(0x009A9804, uint16) |= 1; diff --git a/src/management/finance.h b/src/management/finance.h index 0650d31e6d..f0bb67fe90 100644 --- a/src/management/finance.h +++ b/src/management/finance.h @@ -61,7 +61,7 @@ void finance_reset_history(); void finance_init(); void finance_update_daily_profit(); void finance_shift_expenditure_table(); -void finance_mark_loan_settings_as_legitimate(); +void finance_update_loan_hash(); void finance_reset_cash_to_initial(); void finance_set_loan(money32 loan); diff --git a/src/rct1.c b/src/rct1.c index 50e3287eff..5e9c698ef3 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -259,7 +259,7 @@ void rct1_fix_landscape() RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) ); finance_reset_cash_to_initial(); - finance_mark_loan_settings_as_legitimate(); + finance_update_loan_hash(); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = clamp( MONEY(0,00), diff --git a/src/scenario.c b/src/scenario.c index 270d877eef..9ecb98e4a3 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -276,7 +276,7 @@ void scenario_begin() RCT2_GLOBAL(0x013587D0, money32) = RCT2_GLOBAL(0x013573DC, money32) - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint32) = ENCRYPT_MONEY(RCT2_GLOBAL(0x013573DC, sint32)); - finance_mark_loan_settings_as_legitimate(); // (loan related) + finance_update_loan_hash(); strcpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, s6Info->details); strcpy((char*)RCT2_ADDRESS_SCENARIO_NAME, s6Info->name); @@ -315,7 +315,7 @@ void scenario_begin() RCT2_GLOBAL(RCT2_ADDRESS_TOTAL_ADMISSIONS, uint32) = 0; RCT2_GLOBAL(RCT2_ADDRESS_INCOME_FROM_ADMISSIONS, uint32) = 0; RCT2_GLOBAL(0x013587D8, uint16) = 63; - finance_mark_loan_settings_as_legitimate(); // (loan related, called above already) + finance_update_loan_hash(); park_reset_history(); finance_reset_history(); award_reset(); diff --git a/src/windows/editor_scenario_options.c b/src/windows/editor_scenario_options.c index bae5cb49be..fc81d86aae 100644 --- a/src/windows/editor_scenario_options.c +++ b/src/windows/editor_scenario_options.c @@ -485,7 +485,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, if (RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) < MONEY(1000000,00)) { RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) += MONEY(500,00); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32) = ENCRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32)); - finance_mark_loan_settings_as_legitimate(); + finance_update_loan_hash(); } else { window_error_open(3248, STR_NONE); } @@ -495,7 +495,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, if (RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) > MONEY(0,00)) { RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) -= MONEY(500,00); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32) = ENCRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32)); - finance_mark_loan_settings_as_legitimate(); + finance_update_loan_hash(); } else { window_error_open(3249, STR_NONE); } @@ -505,7 +505,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) < MONEY(5000000,00)) { RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) += MONEY(1000,00); RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) = max(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32), RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32)); - finance_mark_loan_settings_as_legitimate(); + finance_update_loan_hash(); } else { window_error_open(3250, STR_NONE); } @@ -515,7 +515,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) > MONEY(0,00)) { RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) -= MONEY(1000,00); RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) = max(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32), RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32)); - finance_mark_loan_settings_as_legitimate(); + finance_update_loan_hash(); } else { window_error_open(3251, STR_NONE); } @@ -525,7 +525,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, if (RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) < MONEY(5000000,00)) { RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) += MONEY(1000,00); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = min(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32), RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32)); - finance_mark_loan_settings_as_legitimate(); + finance_update_loan_hash(); } else { window_error_open(3252, STR_NONE); } @@ -535,7 +535,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, if (RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) > MONEY(0,00)) { RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32) -= MONEY(1000,00); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = min(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32), RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32)); - finance_mark_loan_settings_as_legitimate(); + finance_update_loan_hash(); } else { window_error_open(3253, STR_NONE); } From 5ee6d563d093034e3457177a36c07dd7ef772432 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Thu, 13 Aug 2015 10:40:37 +0200 Subject: [PATCH 0491/1173] Mark former tutorial strings as unused --- data/language/english_uk.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 13c0d8236b..3e57a568c3 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3398,6 +3398,7 @@ STR_3387 :Roller Coaster Building Tutorial STR_3388 :Unable to switch to selected mode STR_3389 :Unable to select additional item of scenery... STR_3390 :Too many items selected +# Start of tutorial strings. Not used at the moment, so not necessary to translate. STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... @@ -3444,6 +3445,7 @@ STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... +# End of tutorial strings STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape STR_3438 :Unable to remove all scenery from here... STR_3439 :Clear Scenery From e9c8d03bd95debfbe1b572af6465adb00fbe3edd Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 14 Aug 2015 04:00:15 +0100 Subject: [PATCH 0492/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_simplified.txt | 164 +++--- data/language/chinese_traditional.txt | 34 +- data/language/dutch.txt | 2 + data/language/finnish.txt | 710 +++++++++++++------------- data/language/french.txt | 70 +-- data/language/hungarian.txt | 625 +++++++++-------------- data/language/italian.txt | 518 +++++++------------ data/language/polish.txt | 601 ++++++++-------------- data/language/portuguese_br.txt | 398 ++++++++------- data/language/spanish_sp.txt | 532 +++++++------------ data/language/swedish.txt | 457 ++++++----------- 11 files changed, 1698 insertions(+), 2413 deletions(-) diff --git a/data/language/chinese_simplified.txt b/data/language/chinese_simplified.txt index 518747faee..9cddf0fca4 100644 --- a/data/language/chinese_simplified.txt +++ b/data/language/chinese_simplified.txt @@ -785,65 +785,65 @@ STR_0775 :未命名游乐园{POP16}{POP16} STR_0776 :未命名游乐园{POP16}{POP16} STR_0777 :未命名游乐园{POP16}{POP16} STR_0778 :Sign -STR_0779 :1st -STR_0780 :2nd -STR_0781 :3rd -STR_0782 :4th -STR_0783 :5th -STR_0784 :6th -STR_0785 :7th -STR_0786 :8th -STR_0787 :9th -STR_0788 :10th -STR_0789 :11th -STR_0790 :12th -STR_0791 :13th -STR_0792 :14th -STR_0793 :15th -STR_0794 :16th -STR_0795 :17th -STR_0796 :18th -STR_0797 :19th -STR_0798 :20th -STR_0799 :21st -STR_0800 :22nd -STR_0801 :23rd -STR_0802 :24th -STR_0803 :25th -STR_0804 :26th -STR_0805 :27th -STR_0806 :28th -STR_0807 :29th -STR_0808 :30th -STR_0809 :31st -STR_0810 :Jan -STR_0811 :Feb -STR_0812 :Mar -STR_0813 :Apr -STR_0814 :May -STR_0815 :Jun -STR_0816 :Jul -STR_0817 :Aug -STR_0818 :Sep -STR_0819 :Oct -STR_0820 :Nov -STR_0821 :Dec -STR_0822 :Unable to access graphic data file -STR_0823 :Missing or inaccessible data file +STR_0779 :1日 +STR_0780 :2日 +STR_0781 :3日 +STR_0782 :4日 +STR_0783 :5日 +STR_0784 :6日 +STR_0785 :7日 +STR_0786 :8日 +STR_0787 :9日 +STR_0788 :10日 +STR_0789 :11日 +STR_0790 :12日 +STR_0791 :13日 +STR_0792 :14日 +STR_0793 :15日 +STR_0794 :16日 +STR_0795 :17日 +STR_0796 :18日 +STR_0797 :19日 +STR_0798 :20日 +STR_0799 :21日 +STR_0800 :22日 +STR_0801 :23日 +STR_0802 :24日 +STR_0803 :25日 +STR_0804 :26日 +STR_0805 :27日 +STR_0806 :28日 +STR_0807 :29日 +STR_0808 :30日 +STR_0809 :31日 +STR_0810 :1月 +STR_0811 :2月 +STR_0812 :3月 +STR_0813 :4月 +STR_0814 :5月 +STR_0815 :6月 +STR_0816 :7月 +STR_0817 :8月 +STR_0818 :9月 +STR_0819 :10月 +STR_0820 :11月 +STR_0821 :12月 +STR_0822 :无法访问图形数据 +STR_0823 :数据文件丢失或不可访问 STR_0824 :{BLACK}{CROSS} -STR_0825 :Chosen name in use already -STR_0826 :Too many names defined -STR_0827 :Not enough cash - requires {CURRENCY2DP} -STR_0828 :{SMALLFONT}{BLACK}Close window -STR_0829 :{SMALLFONT}{BLACK}Window title - Drag this to move window -STR_0830 :{SMALLFONT}{BLACK}Zoom view in -STR_0831 :{SMALLFONT}{BLACK}Zoom view out -STR_0832 :{SMALLFONT}{BLACK}Rotate view 90{DEGREE} clockwise -STR_0833 :{SMALLFONT}{BLACK}Pause game -STR_0834 :{SMALLFONT}{BLACK}Disk and game options -STR_0835 :Game initialization failed -STR_0836 :Unable to start game in a minimized state -STR_0837 :Unable to initialize graphics system +STR_0825 :该名称已被使用 +STR_0826 :过多名称被定义 +STR_0827 :现金不足 - 需要 {CURRENCY2DP} +STR_0828 :{SMALLFONT}{BLACK}关闭窗口 +STR_0829 :{SMALLFONT}{BLACK}窗口标题 - 拖拽来移动窗口 +STR_0830 :{SMALLFONT}{BLACK}放大 +STR_0831 :{SMALLFONT}{BLACK}缩小 +STR_0832 :{SMALLFONT}{BLACK}顺时针旋转90{DEGREE} +STR_0833 :{SMALLFONT}{BLACK}暂停游戏 +STR_0834 :{SMALLFONT}{BLACK}磁盘和游戏选项 +STR_0835 :游戏初始化失败 +STR_0836 :最小化状态下无法启动游戏 +STR_0837 :无法初始化图形系统 STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} @@ -854,16 +854,16 @@ STR_0843 : STR_0844 : STR_0845 : STR_0846 : -STR_0847 :About 'OpenRCT2' +STR_0847 :关于'OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 -STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028 +STR_0849 :{WINDOW_COLOUR_2}版本 2.01.028 STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, all rights reserved STR_0851 :{WINDOW_COLOUR_2}Designed and programmed by Chris Sawyer STR_0852 :{WINDOW_COLOUR_2}Graphics by Simon Foster STR_0853 :{WINDOW_COLOUR_2}Sound and music by Allister Brimble STR_0854 :{WINDOW_COLOUR_2}Additional sounds recorded by David Ellis STR_0855 :{WINDOW_COLOUR_2}Representation by Jacqui Lyons at Marjacq Ltd. -STR_0856 :{WINDOW_COLOUR_2}Thanks to: +STR_0856 :{WINDOW_COLOUR_2}致谢: STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth, and John Wardley STR_0858 :{WINDOW_COLOUR_2} STR_0859 :{WINDOW_COLOUR_2} @@ -884,31 +884,31 @@ STR_0873 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_0874 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_0875 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_0876 :{BLACK}{DOWN} -STR_0877 :Too low ! -STR_0878 :Too high ! -STR_0879 :Can't lower land here... -STR_0880 :Can't raise land here... -STR_0881 :Object in the way -STR_0882 :Load Game -STR_0883 :Save Game -STR_0884 :Load Landscape -STR_0885 :Save Landscape -STR_0886 :Quit Game -STR_0887 :Quit Scenario Editor -STR_0888 :Quit Roller Coaster Designer -STR_0889 :Quit Track Designs Manager +STR_0877 :太低! +STR_0878 :太高! +STR_0879 :不能降低土地... +STR_0880 :不能抬升土地... +STR_0881 :有物体挡住去路 +STR_0882 :载入游戏 +STR_0883 :保存游戏 +STR_0884 :载入地形 +STR_0885 :保存地形 +STR_0886 :退出游戏 +STR_0887 :退出场景编辑器 +STR_0888 :退出过山车设计工具 +STR_0889 :退出轨道设计管理工具 STR_0890 :SCR{COMMA16}.BMP -STR_0891 :Screenshot -STR_0892 :Screenshot saved to disk as '{STRINGID}' -STR_0893 :Screenshot failed ! +STR_0891 :截图 +STR_0892 :截图 '{STRINGID}' 已保存 +STR_0893 :截图失败! STR_0894 :Landscape data area full ! STR_0895 :Can't build partly above and partly below ground STR_0896 :{POP16}{POP16}{STRINGID} Construction -STR_0897 :Direction -STR_0898 :{SMALLFONT}{BLACK}Left-hand curve -STR_0899 :{SMALLFONT}{BLACK}Right-hand curve -STR_0900 :{SMALLFONT}{BLACK}Left-hand curve (small radius) -STR_0901 :{SMALLFONT}{BLACK}Right-hand curve (small radius) +STR_0897 :方向 +STR_0898 :{SMALLFONT}{BLACK}左转 +STR_0899 :{SMALLFONT}{BLACK}右转 +STR_0900 :{SMALLFONT}{BLACK}左转 (小弧度) +STR_0901 :{SMALLFONT}{BLACK}右转 (小弧度) STR_0902 :{SMALLFONT}{BLACK}Left-hand curve (very small radius) STR_0903 :{SMALLFONT}{BLACK}Right-hand curve (very small radius) STR_0904 :{SMALLFONT}{BLACK}Left-hand curve (large radius) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index dace62d7dd..c60b921ab9 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -886,8 +886,8 @@ STR_0880 :不能升高此地... STR_0881 :物件擋於此地 STR_0882 :載入遊戲 STR_0883 :儲存遊戲 -STR_0884 :載入地型 -STR_0885 :儲存地型 +STR_0884 :載入地形 +STR_0885 :儲存地形 STR_0886 :離開遊戲 STR_0887 :離開劇情編輯工具 STR_0888 :離開雲霄飛車設計工具 @@ -896,7 +896,7 @@ STR_0890 :SCR{COMMA16}.BMP STR_0891 :截圖 STR_0892 :截圖'{STRINGID}'已儲存到硬碟中 STR_0893 :截圖失敗! -STR_0894 :地型資料的範圍已滿! +STR_0894 :地形資料的範圍已滿! STR_0895 :不能建造在一半露天一半地底的地勢中 STR_0896 :{POP16}{POP16}{STRINGID} 建造 STR_0897 :方向 @@ -955,7 +955,7 @@ STR_0949 :離開遊戲之前儲存此遊戲? STR_0950 :載入遊戲 STR_0951 :離開遊戲 STR_0952 :離開遊戲 -STR_0953 :載入地型 +STR_0953 :載入地形 STR_0954 : STR_0955 :{SMALLFONT}{BLACK}選擇此軌道的座位旋轉角度 STR_0956 :-180{DEGREE} @@ -1039,19 +1039,19 @@ STR_1033 :只能建造此於地上! STR_1034 :只能建造此於地面! STR_1035 :當地政府不允許建造高於樹木的物件! STR_1036 :載入遊戲 -STR_1037 :載入地型 +STR_1037 :載入地形 STR_1038 :將存檔轉換成劇情 STR_1039 :安裝新軌道設計 STR_1040 :儲存遊戲 STR_1041 :儲存劇情 -STR_1042 :儲存地型 -STR_1043 :RollerCoaster Tycoon 2 遊戲存檔 -STR_1044 :RollerCoaster Tycoon 2 劇情檔案 -STR_1045 :RollerCoaster Tycoon 2 地型檔案 -STR_1046 :RollerCoaster Tycoon 2 軌道設計檔案 +STR_1042 :儲存地形 +STR_1043 :OpenRCT2 遊戲存檔 +STR_1044 :OpenRCT2 劇情檔案 +STR_1045 :OpenRCT2 地形檔案 +STR_1046 :OpenRCT2 軌道設計檔案 STR_1047 :儲存遊戲失敗! STR_1048 :儲存劇情失敗! -STR_1049 :儲存地型失敗! +STR_1049 :儲存地形失敗! STR_1050 :載入失敗...{NEWLINE}檔案中含有非法資料! STR_1051 :透明化支撐 STR_1052 :透明化遊客 @@ -3109,7 +3109,7 @@ STR_3098 :不能更改鏈條坡道的鏈條速度... STR_3099 :{SMALLFONT}{BLACK}選擇顏色 STR_3100 :{SMALLFONT}{BLACK}選擇第二顏色 STR_3101 :{SMALLFONT}{BLACK}選擇第三顏色 -STR_3102 :{SMALLFONT}{BLACK}將地型的景物重新上色 +STR_3102 :{SMALLFONT}{BLACK}將地形的景物重新上色 STR_3103 :不能重新上色這個物件... STR_3104 :{SMALLFONT}{BLACK}列出遊樂設施 STR_3105 :{SMALLFONT}{BLACK}列出商店及攤販 @@ -3276,8 +3276,8 @@ STR_3265 :不能再減少這個選項! STR_3266 :{SMALLFONT}{BLACK}選擇這個樂園的收費策略 STR_3267 :禁止移除樹木 STR_3268 :{SMALLFONT}{BLACK}禁止移除高壯的樹木 -STR_3269 :禁止調整地型 -STR_3270 :{SMALLFONT}{BLACK}禁止對地型作任何調整 +STR_3269 :禁止調整地形 +STR_3270 :{SMALLFONT}{BLACK}禁止對地形作任何調整 STR_3271 :禁止高空建造 STR_3272 :{SMALLFONT}{BLACK}禁止任何高空發展 STR_3273 :較高難度的樂園評價公式 @@ -3398,6 +3398,7 @@ STR_3387 :雲霄飛車建造教學 STR_3388 :無法切換至已選擇的模式 STR_3389 :無法選擇額外的景觀物件... STR_3390 :選取了太多物件 +# Start of tutorial strings. Not used at the moment, so not necessary to translate. STR_3391 :{SMALLFONT}{BLACK}這個就是我們的樂園 - 先瞧瞧周邊的環境吧... STR_3392 :{SMALLFONT}{BLACK}最簡單的方法就是按住滑鼠右鍵, 然後拖曳來移動檢視範圍... STR_3393 :{SMALLFONT}{BLACK}如果要觀看更多樂園的部份, 你可以按最上工具列中的縮小檢視圖標來縮小檢視... @@ -3444,7 +3445,8 @@ STR_3433 :{SMALLFONT}{BLACK}最後, 我們要建造一些'區間制動器', STR_3434 :{SMALLFONT}{BLACK}我們測試一下新的雲霄飛車, 看看它能不能運作吧! STR_3435 :{SMALLFONT}{BLACK}太好了 - 一切順利! 現在又要做一些熟悉的動作: 建造道路, 然後讓遊客乘坐這座嶄新的雲霄飛車... STR_3436 :{SMALLFONT}{BLACK}在它迎來第一個乘客的途中, 我們可以自訂化一下這座雲霄飛車... -STR_3437 :{SMALLFONT}{BLACK}在地型中清理某些大範圍內的景物 +# End of tutorial strings +STR_3437 :{SMALLFONT}{BLACK}在地形中清理某些大範圍內的景物 STR_3438 :無法移除這裡所有的景物... STR_3439 :移除景物 STR_3440 :頁1 @@ -3490,7 +3492,7 @@ STR_5150 :啟用除錯工具 STR_5151 :, STR_5152 :. STR_5153 :編輯配色主題... -STR_5154 :使用硬體顯示 +STR_5154 :使用硬體渲染 STR_5155 :容許測試未建造好的軌道設計 STR_5156 :{SMALLFONT}{BLACK}容許測試大部份軌道設計, 即使未建造好的也可以. 但不能適用於區域煞車模式 STR_5157 :允許設置進入樂園及乘坐遊樂設施的價格 diff --git a/data/language/dutch.txt b/data/language/dutch.txt index aac719254a..3b68762b2c 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3823,3 +3823,5 @@ STR_5487 :{SMALLFONT}{BLACK}Recente berichten tonen STR_5488 :Geen ingang STR_5489 :{SMALLFONT}{BLACK}Enkel bezoekers die gevolgd worden weergeven STR_5490 :Geluid dempen bij focusverlies +STR_5491 :Uitvindingenlijst +STR_5492 :Scenario-opties diff --git a/data/language/finnish.txt b/data/language/finnish.txt index cd9decd9e4..240f9201c5 100644 --- a/data/language/finnish.txt +++ b/data/language/finnish.txt @@ -11,63 +11,63 @@ STR_0006 :Junior Roller Coaster STR_0007 :Miniature Railway STR_0008 :Monorail STR_0009 :Mini Suspended Coaster -STR_0010 :Boat Ride +STR_0010 :Veneajelu STR_0011 :Wooden Wild Mouse STR_0012 :Steeplechase -STR_0013 :Car Ride +STR_0013 :Autoajelu STR_0014 :Launched Freefall STR_0015 :Bobsleigh Coaster STR_0016 :Observation Tower STR_0017 :Looping Roller Coaster STR_0018 :Dinghy Slide STR_0019 :Mine Train Coaster -STR_0020 :Chairlift +STR_0020 :Tuolihissi STR_0021 :Corkscrew Roller Coaster -STR_0022 :Maze +STR_0022 :Labyrintti STR_0023 :Spiral Slide STR_0024 :Go Karts STR_0025 :Log Flume STR_0026 :River Rapids -STR_0027 :Dodgems -STR_0028 :Pirate Ship +STR_0027 :Törmäysautot +STR_0028 :Merirosvolaiva STR_0029 :Swinging Inverter Ship -STR_0030 :Food Stall -STR_0031 :Unknown Stall (1D) -STR_0032 :Drink Stall -STR_0033 :Unknown Stall (1F) +STR_0030 :Ruokakoju +STR_0031 :Tuntematon koju (1D) +STR_0032 :Juomakoju +STR_0033 :Tuntematon koju (1F) STR_0034 :Kauppa -STR_0035 :Merry-Go-Round -STR_0036 :Unknown Stall (22) +STR_0035 :Karuselli +STR_0036 :Tuntematon koju (22) STR_0037 :Information Kiosk STR_0038 :Toilets -STR_0039 :Ferris Wheel +STR_0039 :Maailmanpyörä STR_0040 :Motion Simulator -STR_0041 :3D Cinema +STR_0041 :3D-teatteri STR_0042 :Top Spin STR_0043 :Space Rings STR_0044 :Reverse Freefall Coaster STR_0045 :Hissi STR_0046 :Vertical Drop Roller Coaster -STR_0047 :Cash Machine +STR_0047 :Kassakone STR_0048 :Twist -STR_0049 :Haunted House +STR_0049 :Kummitustalo STR_0050 :First Aid Room -STR_0051 :Circus Show -STR_0052 :Ghost Train +STR_0051 :Sirkusesitys +STR_0052 :Kummitusjuna STR_0053 :Steel Twister Roller Coaster STR_0054 :Wooden Roller Coaster STR_0055 :Side-Friction Roller Coaster -STR_0056 :Wild Mouse +STR_0056 :Villihiiri STR_0057 :Multi-Dimension Roller Coaster -STR_0058 :Unknown Ride (38) +STR_0058 :Tuntematon laite (38) STR_0059 :Flying Roller Coaster -STR_0060 :Unknown Ride (3A) +STR_0060 :Tuntematon laite (3A) STR_0061 :Virginia Reel STR_0062 :Splash Boats STR_0063 :Mini Helicopters STR_0064 :Lay-down Roller Coaster STR_0065 :Suspended Monorail -STR_0066 :Unknown Ride (40) +STR_0066 :Tuntematon laite (40) STR_0067 :Reverser Roller Coaster STR_0068 :Heartline Twister Coaster STR_0069 :Mini Golf @@ -80,19 +80,19 @@ STR_0075 :Compact Inverted Coaster STR_0076 :Water Coaster STR_0077 :Air Powered Vertical Coaster STR_0078 :Inverted Hairpin Coaster -STR_0079 :Magic Carpet +STR_0079 :Taikamatto STR_0080 :Submarine Ride STR_0081 :River Rafts -STR_0082 :Unknown Ride (50) -STR_0083 :Enterprise -STR_0084 :Unknown Ride (52) -STR_0085 :Unknown Ride (53) -STR_0086 :Unknown Ride (54) -STR_0087 :Unknown Ride (55) +STR_0082 :Tuntematon laite (50) +STR_0083 :Yhtiö +STR_0084 :Tuntematon laite (52) +STR_0085 :Tuntematon laite (53) +STR_0086 :Tuntematon laite (54) +STR_0087 :Tuntematon laite (55) STR_0088 :Inverted Impulse Coaster STR_0089 :Mini Roller Coaster -STR_0090 :Mine Ride -STR_0091 :Unknown Ride (59) +STR_0090 :Kaivosajelu +STR_0091 :Tuntematon laite (59) STR_0092 :LIM Launched Roller Coaster STR_0093 : STR_0094 : @@ -773,12 +773,12 @@ STR_0768 :Yleismies {INT32} STR_0769 :Mekaanikko {INT32} STR_0770 :Vartija {INT32} STR_0771 :Viihdyttjäjä {INT32} -STR_0772 :Unnamed park{POP16}{POP16} -STR_0773 :Unnamed park{POP16}{POP16} -STR_0774 :Unnamed park{POP16}{POP16} -STR_0775 :Unnamed park{POP16}{POP16} -STR_0776 :Unnamed park{POP16}{POP16} -STR_0777 :Unnamed park{POP16}{POP16} +STR_0772 :Nimetön puisto{POP16}{POP16} +STR_0773 :Nimetön puisto{POP16}{POP16} +STR_0774 :Nimetön puisto{POP16}{POP16} +STR_0775 :Nimetön puisto{POP16}{POP16} +STR_0776 :Nimetön puisto{POP16}{POP16} +STR_0777 :Nimetön puisto{POP16}{POP16} STR_0778 :Kyltti STR_0779 :1st STR_0780 :2nd @@ -831,9 +831,9 @@ STR_0826 :Liian monta nimeä määritetty STR_0827 :Not enough cash - requires {CURRENCY2DP} STR_0828 :{SMALLFONT}{BLACK}Sulje ikkuna STR_0829 :{SMALLFONT}{BLACK}Window title - Drag this to move window -STR_0830 :{SMALLFONT}{BLACK}Zoom view in -STR_0831 :{SMALLFONT}{BLACK}Zoom view out -STR_0832 :{SMALLFONT}{BLACK}Rotate view 90{DEGREE} clockwise +STR_0830 :{SMALLFONT}{BLACK}Suurenna +STR_0831 :{SMALLFONT}{BLACK}Pienennä +STR_0832 :{SMALLFONT}{BLACK}Käännä 90{DEGREE} myötäpäivään STR_0833 :{SMALLFONT}{BLACK}Pysäytä peli STR_0834 :{SMALLFONT}{BLACK}Disk and game options STR_0835 :Game initialisation failed @@ -854,11 +854,11 @@ STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}Versio 2.01.028 STR_0850 :{WINDOW_COLOUR_2}Tekijänoikeus {COPYRIGHT} 2002 Chris Sawyer, kaikki oikeudet pidetään STR_0851 :{WINDOW_COLOUR_2}Suunnitellut ja ohjelmoinnut Chris Sawyer -STR_0852 :{WINDOW_COLOUR_2}Graphics by Simon Foster +STR_0852 :{WINDOW_COLOUR_2}Grafiikka Simon Foster STR_0853 :{WINDOW_COLOUR_2}Äänet ja musiikki Allister Brimble STR_0854 :{WINDOW_COLOUR_2}Lisä-äänet nauhoittanut David Ellis STR_0855 :{WINDOW_COLOUR_2}Representation by Jacqui Lyons at Marjacq Ltd. -STR_0856 :{WINDOW_COLOUR_2}Thanks to: +STR_0856 :{WINDOW_COLOUR_2}Kiitoksia: STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth, ja John Wardley STR_0858 :{WINDOW_COLOUR_2} STR_0859 :{WINDOW_COLOUR_2} @@ -883,7 +883,7 @@ STR_0877 :Liian matala ! STR_0878 :Liian korkea ! STR_0879 :Can't lower land here... STR_0880 :Can't raise land here... -STR_0881 :Object in the way +STR_0881 :Esine on tiellä STR_0882 :Lataa peli STR_0883 :Tallenna peli STR_0884 :Lataa maisema @@ -909,7 +909,7 @@ STR_0903 :{SMALLFONT}{BLACK}Right-hand curve (very small radius) STR_0904 :{SMALLFONT}{BLACK}Left-hand curve (large radius) STR_0905 :{SMALLFONT}{BLACK}Right-hand curve (large radius) STR_0906 :{SMALLFONT}{BLACK}Straight -STR_0907 :Slope +STR_0907 :Liukumäki STR_0908 :Roll/Banking STR_0909 :Seat Rot. STR_0910 :{SMALLFONT}{BLACK}Roll for left-hand curve @@ -917,8 +917,8 @@ STR_0911 :{SMALLFONT}{BLACK}Roll for right-hand curve STR_0912 :{SMALLFONT}{BLACK}No roll STR_0913 :{SMALLFONT}{BLACK}Move to previous section STR_0914 :{SMALLFONT}{BLACK}Move to next section -STR_0915 :{SMALLFONT}{BLACK}Construct the selected section -STR_0916 :{SMALLFONT}{BLACK}Remove the highlighted section +STR_0915 :{SMALLFONT}{BLACK}Rakenna valittu osio +STR_0916 :{SMALLFONT}{BLACK}Poista valittu osio STR_0917 :{SMALLFONT}{BLACK}Vertical drop STR_0918 :{SMALLFONT}{BLACK}Steep slope down STR_0919 :{SMALLFONT}{BLACK}Slope down @@ -928,11 +928,11 @@ STR_0922 :{SMALLFONT}{BLACK}Steep slope up STR_0923 :{SMALLFONT}{BLACK}Vertical rise STR_0924 :{SMALLFONT}{BLACK}Helix down STR_0925 :{SMALLFONT}{BLACK}Helix up -STR_0926 :Can't remove this... -STR_0927 :Can't construct this here... +STR_0926 :Tämän poistaminen ei onnistu... +STR_0927 :Tämän rakentaminen tähän ei onnistu... STR_0928 :{SMALLFONT}{BLACK}Chain lift, to pull cars up slopes -STR_0929 :'S' Bend (left) -STR_0930 :'S' Bend (right) +STR_0929 :'S' kaarre (vasen) +STR_0930 :'S' kaarre (oikea) STR_0931 :Vertical Loop (left) STR_0932 :Vertical Loop (right) STR_0933 :Raise or lower land first @@ -984,7 +984,7 @@ STR_0978 :New Gentle Rides STR_0979 :New Roller Coasters STR_0980 :New Thrill Rides STR_0981 :Uusi vesilaite -STR_0982 :New Shops & Stalls +STR_0982 :Uusia kauppoja ja kojuja STR_0983 :Research & Development STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP} @@ -997,22 +997,22 @@ STR_0991 :Station platform STR_0992 :{SMALLFONT}{BLACK}Demolish entire ride/attraction STR_0993 :Romuta laite/nähtävyys STR_0994 :Romuta -STR_0995 :{WINDOW_COLOUR_1}Are you sure you want to completely demolish {STRINGID}? -STR_0996 :Overall view +STR_0995 :{WINDOW_COLOUR_1}Oletko varma että haluat tuhota {STRINGID}:n? +STR_0996 :Kokonaisnäkymä STR_0997 :{SMALLFONT}{BLACK}View selection -STR_0998 :No more stations allowed on this ride +STR_0998 :Enempää asemia ei sallittu tälle laitteelle STR_0999 :Requires a station platform STR_1000 :Track is not a complete circuit STR_1001 :Track unsuitable for type of train -STR_1002 :Can't open {POP16}{POP16}{POP16}{STRINGID}... -STR_1003 :Can't test {POP16}{POP16}{POP16}{STRINGID}... -STR_1004 :Can't close {POP16}{POP16}{POP16}{STRINGID}... -STR_1005 :Can't start construction on {POP16}{POP16}{POP16}{STRINGID}... -STR_1006 :Must be closed first +STR_1002 :Avaaminen ei onnistu laitteessa {POP16}{POP16}{POP16}{STRINGID}... +STR_1003 :Testiajo ei onnistu laitteessa {POP16}{POP16}{POP16}{STRINGID}... +STR_1004 :Sulkeminen ei onnistu laitteessa {POP16}{POP16}{POP16}{STRINGID}... +STR_1005 :Rakentaminen ei onnistu laitteessa {POP16}{POP16}{POP16}{STRINGID}... +STR_1006 :Täytyy ensin sulkea STR_1007 :Unable to create enough vehicles STR_1008 :{SMALLFONT}{BLACK}Open, close, or test ride/attraction STR_1009 :{SMALLFONT}{BLACK}Open or close all rides/attractions -STR_1010 :{SMALLFONT}{BLACK}Open or close park +STR_1010 :{SMALLFONT}{BLACK}Avaa tai sulje puisto STR_1011 :Sulje kaikki STR_1012 :Avaa kaikki STR_1013 :Sulje puisto @@ -1020,24 +1020,24 @@ STR_1014 :Avaa puisto STR_1015 :Unable to operate with more than one station platform in this mode STR_1016 :Unable to operate with less than two stations in this mode STR_1017 :Can't change operating mode... -STR_1018 :Can't make changes... -STR_1019 :Can't make changes... -STR_1020 :Can't make changes... +STR_1018 :Muutoksien teko ei onnistu... +STR_1019 :Muutoksien teko ei onnistu... +STR_1020 :Muutoksien teko ei onnistu... STR_1021 :{POP16}{POP16}{POP16}{POP16}{STRINGID} -STR_1022 :{POP16}{POP16}{POP16}{COMMA16} car per train -STR_1023 :{POP16}{POP16}{POP16}{COMMA16} cars per train -STR_1024 :{COMMA16} car per train -STR_1025 :{COMMA16} cars per train +STR_1022 :{POP16}{POP16}{POP16}{COMMA16} auto per juna +STR_1023 :{POP16}{POP16}{POP16}{COMMA16} autoa per juna +STR_1024 :{COMMA16} auto per juna +STR_1025 :{COMMA16} autoa per juna STR_1026 :Station platform too long! STR_1027 :{SMALLFONT}{BLACK}Locate this on Main View STR_1028 :Off edge of map! -STR_1029 :Cannot build partly above and partly below water! -STR_1030 :Can only build this underwater! -STR_1031 :Can't build this underwater! -STR_1032 :Can only build this on water! -STR_1033 :Can only build this above ground! -STR_1034 :Can only build this on land! -STR_1035 :Local authority won't allow construction above tree-height! +STR_1029 :Ei voi rakentaa osittain veden pinnan ylle ja alle! +STR_1030 :Tämän voi ainoastaan rakentaa veden alle! +STR_1031 :Tätä ei voi rakentaa veden alle! +STR_1032 :Tämän voi ainoastaan rakentaa veteen! +STR_1033 :Tämän voi ainoastaan rakentaa maanpinnan ylle! +STR_1034 :Tämän voi ainoastaan rakentaa maanpinnalle! +STR_1035 :Paikallinen virkavalta ei salli rakentaa puiden latvoja korkeammalle! STR_1036 :Lataa peli STR_1037 :Lataa maisema STR_1038 :Convert saved game to scenario @@ -1082,12 +1082,12 @@ STR_1076 :Shop stall mode STR_1077 :Rotation mode STR_1078 :Forward rotation STR_1079 :Backward rotation -STR_1080 :Film: {ENDQUOTES}Avenging aviators{ENDQUOTES} -STR_1081 :3D film: {ENDQUOTES}Mouse tails{ENDQUOTES} +STR_1080 :Elokuva: {ENDQUOTES}Kostavat lentäjät{ENDQUOTES} +STR_1081 :3D-elokuva: {ENDQUOTES}Hiiren hännät{ENDQUOTES} STR_1082 :Space rings mode STR_1083 :Beginners mode STR_1084 :LIM-powered launch -STR_1085 :Film: {ENDQUOTES}Thrill riders{ENDQUOTES} +STR_1085 :Elokuva: {ENDQUOTES}Jännityksen ajajat{ENDQUOTES} STR_1086 :3D-elokuva: {ENDQUOTES}Myrskun jahtaajat{ENDQUOTES} STR_1087 :3D-elokuva: {ENDQUOTES}Avaruuskaapparit{ENDQUOTES} STR_1088 :Intense mode @@ -1111,31 +1111,31 @@ STR_1105 :Travelling at {VELOCITY} STR_1106 :Sortunut! STR_1107 :Sortunut! STR_1108 :Travelling at {VELOCITY} -STR_1109 :Swinging -STR_1110 :Rotating -STR_1111 :Rotating -STR_1112 :Operating -STR_1113 :Showing film -STR_1114 :Rotating -STR_1115 :Operating -STR_1116 :Operating -STR_1117 :Doing circus show -STR_1118 :Operating +STR_1109 :Keinuu +STR_1110 :Pyörii +STR_1111 :Pyörii +STR_1112 :Käynnissä +STR_1113 :Ohjelma pyörii +STR_1114 :Pyörii +STR_1115 :Käynnissä +STR_1116 :Käynnissä +STR_1117 :Sirkusesitys menossa +STR_1118 :Käynnissä STR_1119 :Waiting for cable lift STR_1120 :Travelling at {VELOCITY} -STR_1121 :Stopping -STR_1122 :Waiting for passengers -STR_1123 :Waiting to start +STR_1121 :Pysäytetään +STR_1122 :Odotetaan matkustajia +STR_1123 :Odotetaan käynnistämistä STR_1124 :Käynnistetään -STR_1125 :Operating +STR_1125 :Käynnissä STR_1126 :Pysäytetään -STR_1127 :Unloading passengers +STR_1127 :Matkustajia puretaan STR_1128 :Stopped by block brakes -STR_1129 :All vehicles in same colours +STR_1129 :Kaikki ajoneuvot saman värisiä STR_1130 :Different colours per {STRINGID} STR_1131 :Different colours per vehicle -STR_1132 :Vehicle {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} -STR_1133 :Vehicle {POP16}{COMMA16} +STR_1132 :Ajoneuvo {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1133 :Ajoneuvo {POP16}{COMMA16} STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} STR_1135 :{STRINGID} {COMMA16} STR_1136 :{SMALLFONT}{BLACK}Valitse pääväri @@ -1150,20 +1150,20 @@ STR_1144 :Can't build/move entrance for this ride/attraction... STR_1145 :Can't build/move exit for this ride/attraction... STR_1146 :Entrance not yet built STR_1147 :Exit not yet built -STR_1148 :Quarter load -STR_1149 :Half load -STR_1150 :Three-quarter load -STR_1151 :Full load -STR_1152 :Any load +STR_1148 :Neljännes kuorma +STR_1149 :Puolikas kuorma +STR_1150 :Kolmeneljäsosaa kuorma +STR_1151 :Täysi kuorma +STR_1152 :Mikä tahansa kuorma STR_1153 :Height Marks on Ride Tracks STR_1154 :Height Marks on Land STR_1155 :Height Marks on Paths STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} -STR_1158 :Can't remove this... +STR_1158 :Tämän poistaminen ei onnistu... STR_1159 :{SMALLFONT}{BLACK}Place scenery, gardens, and other accessories STR_1160 :{SMALLFONT}{BLACK}Create/adjust lakes & water -STR_1161 :Can't position this here... +STR_1161 :Tätä ei voi asettaa tähän... STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} STR_1163 :{STRINGID}{NEWLINE}(Right-Click to Modify) STR_1164 :{STRINGID}{NEWLINE}(Right-Click to Remove) @@ -1171,23 +1171,23 @@ STR_1165 :{STRINGID} - {STRINGID} {COMMA16} STR_1166 :Can't lower water level here... STR_1167 :Can't raise water level here... STR_1168 :Options -STR_1169 :(None) +STR_1169 :(Ei mitään) STR_1170 :{STRING} STR_1171 :{RED}Suljettu - - STR_1172 :{YELLOW}{STRINGID} - - STR_1173 :{SMALLFONT}{BLACK}Build footpaths and queue lines -STR_1174 :Banner sign in the way -STR_1175 :Can't build this on sloped footpath -STR_1176 :Can't build footpath here... -STR_1177 :Can't remove footpath from here... +STR_1174 :Mainoskyltti on tiellä +STR_1175 :Tätä ei voi rakentaa kaltevalle jalkakäytävälle +STR_1176 :Jalkakäytävää ei voi rakentaa tähän... +STR_1177 :Jalkakäytävää ei voi poistaa tästä... STR_1178 :Land slope unsuitable -STR_1179 :Footpath in the way -STR_1180 :Can't build this underwater! +STR_1179 :Jalkakäytävä on tiellä +STR_1180 :Tätä ei voi rakentaa veden alle! STR_1181 :Jalkakäytävät STR_1182 :Tyyppi STR_1183 :Suunta -STR_1184 :Slope -STR_1185 :{SMALLFONT}{BLACK}Direction +STR_1184 :Mäki +STR_1185 :{SMALLFONT}{BLACK}Suunta STR_1186 :{SMALLFONT}{BLACK}Slope down STR_1187 :{SMALLFONT}{BLACK}Taso STR_1188 :{SMALLFONT}{BLACK}Slope up @@ -1201,16 +1201,16 @@ STR_1195 :Testiajo STR_1196 :Avoin STR_1197 :Rikki STR_1198 :Sortunut! -STR_1199 :{COMMA16} person on ride -STR_1200 :{COMMA16} people on ride -STR_1201 :Nobody in queue line -STR_1202 :1 person in queue line -STR_1203 :{COMMA16} people in queue line -STR_1204 :{COMMA16} minute queue time -STR_1205 :{COMMA16} minutes queue time +STR_1199 :{COMMA16} henkilö laitteessa +STR_1200 :{COMMA16} henkilöä laitteessa +STR_1201 :Ei ketään jonossa +STR_1202 :1 henkilö jonossa +STR_1203 :{COMMA16} henkilöä jonossa +STR_1204 :{COMMA16} minuutin jonotusaika +STR_1205 :{COMMA16} minuutin jonotusaika STR_1206 :{WINDOW_COLOUR_2}Odota: -STR_1207 :{WINDOW_COLOUR_2}Leave if another train arrives at station -STR_1208 :{WINDOW_COLOUR_2}Leave if another boat arrives at station +STR_1207 :{WINDOW_COLOUR_2}Lähde jos toinen juna saapuu asemalle +STR_1208 :{WINDOW_COLOUR_2}Lähde jos toinen vene saapuu asemalle STR_1209 :{SMALLFONT}{BLACK}Select whether should wait for passengers before departing STR_1210 :{SMALLFONT}{BLACK}Select whether should leave if another vehicle arrives at the same station STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time: @@ -1222,9 +1222,9 @@ STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronise departure with all STR_1217 :{COMMA16} sekuntia STR_1218 :{BLACK}{SMALLUP} STR_1219 :{BLACK}{SMALLDOWN} -STR_1220 :Exit only -STR_1221 :No entrance -STR_1222 :No exit +STR_1220 :Vain uloskäynti +STR_1221 :Ei sisäänkäyntiä +STR_1222 :Ei uloskäyntiä STR_1223 :{SMALLFONT}{BLACK}Transport rides STR_1224 :{SMALLFONT}{BLACK}Gentle rides STR_1225 :{SMALLFONT}{BLACK}Roller coasters @@ -1280,13 +1280,13 @@ STR_1274 :Rakennusta STR_1275 :{COMMA16} rakennus STR_1276 :{COMMA16} rakennusta STR_1277 :Rakennus {COMMA16} -STR_1278 :structure -STR_1279 :structures -STR_1280 :Structure -STR_1281 :Structures -STR_1282 :{COMMA16} structure -STR_1283 :{COMMA16} structures -STR_1284 :Structure {COMMA16} +STR_1278 :rakennelma +STR_1279 :rakennelmia +STR_1280 :Rakennelma +STR_1281 :Rakennelmia +STR_1282 :{COMMA16} rakennelma +STR_1283 :{COMMA16} rakennelmaa +STR_1284 :Rakennelma {COMMA16} STR_1285 :laiva STR_1286 :laivaa STR_1287 :Laiva @@ -1331,19 +1331,19 @@ STR_1325 :{COMMA16} rataa STR_1326 :Rata {COMMA16} STR_1327 :{SMALLFONT}{BLACK}Rotate objects by 90{DEGREE} STR_1328 :Level land required -STR_1329 :{WINDOW_COLOUR_2}Launch speed: +STR_1329 :{WINDOW_COLOUR_2}Lähtönopeus: STR_1330 :{SMALLFONT}{BLACK}Maximum speed when leaving station STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} STR_1332 :{VELOCITY} STR_1333 :{STRINGID} - {STRINGID}{POP16} STR_1334 :{STRINGID} - {STRINGID} {COMMA16} -STR_1335 :{STRINGID} - Entrance{POP16}{POP16} -STR_1336 :{STRINGID} - Station {POP16}{COMMA16} Entrance -STR_1337 :{STRINGID} - Exit{POP16}{POP16} -STR_1338 :{STRINGID} - Station {POP16}{COMMA16} Exit +STR_1335 :{STRINGID} - Sisäänkäynti{POP16}{POP16} +STR_1336 :{STRINGID} - Asema {POP16}{COMMA16} Sisäänkäynti +STR_1337 :{STRINGID} - Uloskäynti{POP16}{POP16} +STR_1338 :{STRINGID} - Asema {POP16}{COMMA16} Uloskäynti STR_1339 :{BLACK}No test results yet... STR_1340 :{WINDOW_COLOUR_2}Max. speed: {BLACK}{VELOCITY} -STR_1341 :{WINDOW_COLOUR_2}Ride time: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1341 :{WINDOW_COLOUR_2}Ajelun kesto: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} STR_1342 :{DURATION} STR_1343 :{DURATION} / STR_1344 :{WINDOW_COLOUR_2}Radan pituus: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} @@ -1361,10 +1361,10 @@ STR_1355 :{WINDOW_COLOUR_2}Pudotusta: {BLACK}{COMMA16} STR_1356 :{WINDOW_COLOUR_2}Inversions: {BLACK}{COMMA16} STR_1357 :{WINDOW_COLOUR_2}Reikää: {BLACK}{COMMA16} STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs -STR_1359 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minute -STR_1360 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minutes -STR_1361 :Can't change speed... -STR_1362 :Can't change launch speed... +STR_1359 :{WINDOW_COLOUR_2}Jonotusaika: {BLACK}{COMMA16} minuutti +STR_1360 :{WINDOW_COLOUR_2}Jonotusaika: {BLACK}{COMMA16} minuuttia +STR_1361 :Nopeuden muuttaminen ei onnistu... +STR_1362 :Lähtönopeuden muuttaminen ei onnistu... STR_1363 :Too high for supports! STR_1364 :Supports for track above can't be extended any further! STR_1365 :In-line Twist (left) @@ -1389,7 +1389,7 @@ STR_1383 :Quarter Loop STR_1384 :{YELLOW}{STRINGID} STR_1385 :{SMALLFONT}{BLACK}Other track configurations STR_1386 :Erikoinen... -STR_1387 :Can't change land type... +STR_1387 :Maan tyyppiä ei voida muuttaa... STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} STR_1389 :{OUTLINE}{RED}- {CURRENCY} STR_1390 :{CURRENCY2DP} @@ -1399,9 +1399,9 @@ STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options STR_1394 :{SMALLFONT}{BLACK}Operating options STR_1395 :{SMALLFONT}{BLACK}Maintenance options STR_1396 :{SMALLFONT}{BLACK}Colour scheme options -STR_1397 :{SMALLFONT}{BLACK}Sound & music options +STR_1397 :{SMALLFONT}{BLACK}Ääni- ja musiikkiasetukset STR_1398 :{SMALLFONT}{BLACK}Measurements and test data -STR_1399 :{SMALLFONT}{BLACK}Graphs +STR_1399 :{SMALLFONT}{BLACK}Kuvastot STR_1400 :Sisäänkäynti STR_1401 :Uloskäynti STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction @@ -1426,41 +1426,41 @@ STR_1420 :{SMALLFONT}{BLACK}{LENGTH} STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g STR_1422 :{SMALLFONT}{BLACK}Logging data from {POP16}{STRINGID} STR_1423 :{SMALLFONT}{BLACK}Queue line path -STR_1424 :{SMALLFONT}{BLACK}Footpath +STR_1424 :{SMALLFONT}{BLACK}Jalkakäytävä STR_1425 :Jalkakäytävä -STR_1426 :Queue Line -STR_1427 :{WINDOW_COLOUR_2}Customers: {BLACK}{COMMA32} per hour -STR_1428 :{WINDOW_COLOUR_2}Admission price: +STR_1426 :Jono +STR_1427 :{WINDOW_COLOUR_2}Asiakkaita: {BLACK}{COMMA32} per tunti +STR_1428 :{WINDOW_COLOUR_2}Sisäänpääsy maksu: STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} STR_1430 :Ilmainen -STR_1431 :Kävelee -STR_1432 :Heading for {STRINGID} -STR_1433 :Queuing for {STRINGID} -STR_1434 :Drowning +STR_1431 :Kävelen +STR_1432 :Menossa kohti {STRINGID} +STR_1433 :Jonotan {STRINGID} +STR_1434 :Hukun STR_1435 :On {STRINGID} STR_1436 :In {STRINGID} STR_1437 :At {STRINGID} -STR_1438 :Istuu -STR_1439 :(select location) -STR_1440 :Mowing grass -STR_1441 :Sweeping footpath -STR_1442 :Emptying litter bin -STR_1443 :Watering gardens -STR_1444 :Watching {STRINGID} +STR_1438 :Istun +STR_1439 :(valitse sijainti) +STR_1440 :Leikkaan ruohoa +STR_1441 :Harjaan jalkakäytävää +STR_1442 :Tyhjennän roskakoria +STR_1443 :Kastelen kasveja +STR_1444 :Katselen {STRINGID} STR_1445 :Watching construction of {STRINGID} STR_1446 :Looking at scenery -STR_1447 :Leaving the park +STR_1447 :Lähden puistosta STR_1448 :Watching new ride being constructed STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) STR_1452 :Vieraan nimi -STR_1453 :Enter name for this guest: -STR_1454 :Can't name guest... -STR_1455 :Invalid name for guest -STR_1456 :{WINDOW_COLOUR_2}Cash spent: {BLACK}{CURRENCY2DP} -STR_1457 :{WINDOW_COLOUR_2}Cash in pocket: {BLACK}{CURRENCY2DP} -STR_1458 :{WINDOW_COLOUR_2}Time in park: {BLACK}{REALTIME} +STR_1453 :Anna nimi vieraalle: +STR_1454 :Vieraan nimeäminen ei onnistu... +STR_1455 :Virheellinen nimi vieraalle +STR_1456 :{WINDOW_COLOUR_2}Rahaa kulutettu: {BLACK}{CURRENCY2DP} +STR_1457 :{WINDOW_COLOUR_2}Rahaa taskussa: {BLACK}{CURRENCY2DP} +STR_1458 :{WINDOW_COLOUR_2}Puistossa olemisaika: {BLACK}{REALTIME} STR_1459 :Radan tyyli STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track @@ -1482,28 +1482,28 @@ STR_1476 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}Not yet available STR_1477 :{WINDOW_COLOUR_2}Intensity rating: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) STR_1478 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} ({STRINGID}) STR_1479 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}Not yet available -STR_1480 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} -STR_1481 :{SMALLFONT}{OPENQUOTES}I've spent all my money{ENDQUOTES} -STR_1482 :{SMALLFONT}{OPENQUOTES}I feel sick{ENDQUOTES} -STR_1483 :{SMALLFONT}{OPENQUOTES}I feel very sick{ENDQUOTES} +STR_1480 :{SMALLFONT}{OPENQUOTES}Ei ole varaa {STRINGID}{ENDQUOTES} +STR_1481 :{SMALLFONT}{OPENQUOTES}Kulutin kaikki rahani{ENDQUOTES} +STR_1482 :{SMALLFONT}{OPENQUOTES}Tunnen oloni sairaaksi{ENDQUOTES} +STR_1483 :{SMALLFONT}{OPENQUOTES}Tunnen oloni todella sairaaksi{ENDQUOTES} STR_1484 :{SMALLFONT}{OPENQUOTES}I want to go on something more thrilling than {STRINGID}{ENDQUOTES} STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} looks too intense for me{ENDQUOTES} STR_1486 :{SMALLFONT}{OPENQUOTES}I haven't finished my {STRINGID} yet{ENDQUOTES} STR_1487 :{SMALLFONT}{OPENQUOTES}Just looking at {STRINGID} makes me feel sick{ENDQUOTES} STR_1488 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to go on {STRINGID}{ENDQUOTES} -STR_1489 :{SMALLFONT}{OPENQUOTES}I want to go home{ENDQUOTES} +STR_1489 :{SMALLFONT}{OPENQUOTES}Haluan kotiin{ENDQUOTES} STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} is really good value{ENDQUOTES} -STR_1491 :{SMALLFONT}{OPENQUOTES}I've already got {STRINGID}{ENDQUOTES} -STR_1492 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} -STR_1493 :{SMALLFONT}{OPENQUOTES}I'm not hungry{ENDQUOTES} -STR_1494 :{SMALLFONT}{OPENQUOTES}I'm not thirsty{ENDQUOTES} -STR_1495 :{SMALLFONT}{OPENQUOTES}Help! I'm drowning!{ENDQUOTES} -STR_1496 :{SMALLFONT}{OPENQUOTES}I'm lost!{ENDQUOTES} +STR_1491 :{SMALLFONT}{OPENQUOTES}Minulla on jo {STRINGID}{ENDQUOTES} +STR_1492 :{SMALLFONT}{OPENQUOTES}Minulla ei ole varaa {STRINGID}{ENDQUOTES} +STR_1493 :{SMALLFONT}{OPENQUOTES}Minulla ei ole nälkä{ENDQUOTES} +STR_1494 :{SMALLFONT}{OPENQUOTES}Minulla ei ole jano{ENDQUOTES} +STR_1495 :{SMALLFONT}{OPENQUOTES}Apua! Hukun!{ENDQUOTES} +STR_1496 :{SMALLFONT}{OPENQUOTES}Olen eksynyt!{ENDQUOTES} STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} was great{ENDQUOTES} STR_1498 :{SMALLFONT}{OPENQUOTES}I've been queuing for {STRINGID} for ages{ENDQUOTES} -STR_1499 :{SMALLFONT}{OPENQUOTES}I'm tired{ENDQUOTES} -STR_1500 :{SMALLFONT}{OPENQUOTES}I'm hungry{ENDQUOTES} -STR_1501 :{SMALLFONT}{OPENQUOTES}I'm thirsty{ENDQUOTES} +STR_1499 :{SMALLFONT}{OPENQUOTES}Olen väsynyt{ENDQUOTES} +STR_1500 :{SMALLFONT}{OPENQUOTES}Minulla on nälkä{ENDQUOTES} +STR_1501 :{SMALLFONT}{OPENQUOTES}Minulla on jano{ENDQUOTES} STR_1502 :{SMALLFONT}{OPENQUOTES}I need to go to the bathroom{ENDQUOTES} STR_1503 :{SMALLFONT}{OPENQUOTES}I can't find {STRINGID}{ENDQUOTES} STR_1504 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to use {STRINGID}{ENDQUOTES} @@ -1513,10 +1513,10 @@ STR_1507 :{SMALLFONT}{OPENQUOTES}I can't find the park exit{ENDQUOTES} STR_1508 :{SMALLFONT}{OPENQUOTES}I want to get off {STRINGID}{ENDQUOTES} STR_1509 :{SMALLFONT}{OPENQUOTES}I want to get out of {STRINGID}{ENDQUOTES} STR_1510 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} - It isn't safe{ENDQUOTES} -STR_1511 :{SMALLFONT}{OPENQUOTES}This path is disgusting{ENDQUOTES} +STR_1511 :{SMALLFONT}{OPENQUOTES}Tämä tie on kuvottava{ENDQUOTES} STR_1512 :{SMALLFONT}{OPENQUOTES}It's too crowded here{ENDQUOTES} STR_1513 :{SMALLFONT}{OPENQUOTES}The vandalism here is really bad{ENDQUOTES} -STR_1514 :{SMALLFONT}{OPENQUOTES}Great scenery!{ENDQUOTES} +STR_1514 :{SMALLFONT}{OPENQUOTES}Mahtava maisema!{ENDQUOTES} STR_1515 :{SMALLFONT}{OPENQUOTES}This park is really clean and tidy{ENDQUOTES} STR_1516 :{SMALLFONT}{OPENQUOTES}The jumping fountains are great{ENDQUOTES} STR_1517 :{SMALLFONT}{OPENQUOTES}The music is nice here{ENDQUOTES} @@ -2361,9 +2361,9 @@ STR_2353 :{WINDOW_COLOUR_2}Litter swept: {BLACK}{COMMA16} STR_2354 :{WINDOW_COLOUR_2}Bins emptied: {BLACK}{COMMA16} STR_2355 :{WINDOW_COLOUR_2}Rides fixed: {BLACK}{COMMA16} STR_2356 :{WINDOW_COLOUR_2}Rides inspected: {BLACK}{COMMA16} -STR_2357 :House -STR_2358 :Units -STR_2359 :Real Values +STR_2357 :Talo +STR_2358 :Yksiköt +STR_2359 :Oikeat arvot STR_2360 :{WINDOW_COLOUR_2}Display Resolution: STR_2361 :Landscape Smoothing STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off @@ -2373,26 +2373,26 @@ STR_2365 :The bank refuses to increase your loan! STR_2366 :Celsius ({DEGREE}C) STR_2367 :Fahrenheit (F) STR_2368 :None -STR_2369 :Low +STR_2369 :Matala STR_2370 :Average -STR_2371 :High -STR_2372 :Low +STR_2371 :Korkea +STR_2372 :Matala STR_2373 :Medium -STR_2374 :High -STR_2375 :Very high +STR_2374 :Korkea +STR_2375 :Todella korkea STR_2376 :Extreme STR_2377 :Ultra-Extreme STR_2378 :{SMALLFONT}{BLACK}Adjust smaller area of land STR_2379 :{SMALLFONT}{BLACK}Adjust larger area of land STR_2380 :{SMALLFONT}{BLACK}Adjust smaller area of water STR_2381 :{SMALLFONT}{BLACK}Adjust larger area of water -STR_2382 :Land -STR_2383 :Water +STR_2382 :Maa +STR_2383 :Vesi STR_2384 :{WINDOW_COLOUR_2}Your objective: -STR_2385 :{BLACK}None +STR_2385 :{BLACK}Ei mitään STR_2386 :{BLACK}To have at least {COMMA16} guests in your park at the end of {MONTHYEAR}, with a park rating of at least 600 STR_2387 :{BLACK}To achieve a park value of at least {POP16}{POP16}{CURRENCY} at the end of {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} -STR_2388 :{BLACK}Have Fun! +STR_2388 :{BLACK}Pidä hauskaa! STR_2389 :{BLACK}Build the best {STRINGID} you can! STR_2390 :{BLACK}To have 10 different types of roller coasters operating in your park, each with an excitement value of at least 6.00 STR_2391 :{BLACK}To have at least {COMMA16} guests in your park. You must not let the park rating drop below 700 at any time! @@ -2401,10 +2401,10 @@ STR_2393 :{BLACK}To have 10 different types of roller coasters operating in y STR_2394 :{BLACK}To finish building all 5 of the partially built roller coasters in this park, designing them to achieve excitement ratings of at least {POP16}{POP16}{COMMA2DP32} each STR_2395 :{BLACK}To repay your loan and achieve a park value of at least {POP16}{POP16}{CURRENCY} STR_2396 :{BLACK}To achieve a monthly profit from food, drink and merchandise sales of at least {POP16}{POP16}{CURRENCY} -STR_2397 :None +STR_2397 :Ei mitään STR_2398 :Number of guests at a given date STR_2399 :Park value at a given date -STR_2400 :Have fun +STR_2400 :Pidä hauskaa STR_2401 :Build the best ride you can STR_2402 :Build 10 roller coasters STR_2403 :Number of guests in park @@ -2414,18 +2414,18 @@ STR_2406 :Finish building 5 roller coasters STR_2407 :Repay loan and achieve a given park value STR_2408 :Monthly profit from food/merchandise STR_2409 :{WINDOW_COLOUR_2}Marketing campaigns in operation -STR_2410 :{BLACK}None +STR_2410 :{BLACK}Ei mitään STR_2411 :{WINDOW_COLOUR_2}Marketing campaigns available STR_2412 :{SMALLFONT}{BLACK}Start this marketing campaign STR_2413 :{BLACK}({CURRENCY2DP} per week) -STR_2414 :(Not Selected) +STR_2414 :(Ei valittu) STR_2415 :{WINDOW_COLOUR_2}Ride: -STR_2416 :{WINDOW_COLOUR_2}Item: +STR_2416 :{WINDOW_COLOUR_2}Esine: STR_2417 :{WINDOW_COLOUR_2}Length of time: STR_2418 :Free entry to {STRINGID} STR_2419 :Free ride on {STRINGID} STR_2420 :Half-price entry to {STRINGID} -STR_2421 :Free {STRINGID} +STR_2421 :Ilmainen {STRINGID} STR_2422 :Advertising campaign for {STRINGID} STR_2423 :Advertising campaign for {STRINGID} STR_2424 :{WINDOW_COLOUR_2}Vouchers for free entry to the park @@ -2440,7 +2440,7 @@ STR_2432 :{BLACK}Vouchers for half-price entry to {STRINGID} STR_2433 :{BLACK}Vouchers for free {STRINGID} STR_2434 :{BLACK}Advertising campaign for {STRINGID} STR_2435 :{BLACK}Advertising campaign for {STRINGID} -STR_2436 :1 week +STR_2436 :1 viikko STR_2437 : STR_2438 : STR_2439 : @@ -2490,17 +2490,17 @@ STR_2482 :{SMALLFONT}{BLACK}Profit: {CURRENCY} per week, Park Value: {CURREN STR_2483 :{WINDOW_COLOUR_2}Weekly profit: {BLACK}+{CURRENCY2DP} STR_2484 :{WINDOW_COLOUR_2}Weekly profit: {RED}{CURRENCY2DP} STR_2485 :Controls -STR_2486 :General +STR_2486 :Yleiset STR_2487 :Show 'real' names of guests STR_2488 :{SMALLFONT}{BLACK}Toggle between showing 'real' names of guests and guest numbers -STR_2489 :Shortcut keys... -STR_2490 :Keyboard shortcuts +STR_2489 :Pikanäppäimet... +STR_2490 :Näppäimistön pikanäppäimet STR_2491 :Reset keys STR_2492 :{SMALLFONT}{BLACK}Set all keyboard shortcuts back to default settings STR_2493 :Close top-most window STR_2494 :Close all floating windows STR_2495 :Cancel construction mode -STR_2496 :Pause game +STR_2496 :Pysäytä peli STR_2497 :Zoom view out STR_2498 :Zoom view in STR_2499 :Rotate view clockwise @@ -2528,7 +2528,7 @@ STR_2520 :Show guest list STR_2521 :Show staff list STR_2522 :Show recent messages STR_2523 :Show map -STR_2524 :Screenshot +STR_2524 :Kuvankaappaus ### The following need to be reordered to match SDL_keycode layout. STR_2525 :??? STR_2526 :??? @@ -2549,7 +2549,7 @@ STR_2540 :??? STR_2541 :??? STR_2542 :??? STR_2543 :Alt/Menu -STR_2544 :Pause +STR_2544 :Pysäytä STR_2545 :Caps STR_2546 :??? STR_2547 :??? @@ -2567,17 +2567,17 @@ STR_2558 :PgUp STR_2559 :PgDn STR_2560 :End STR_2561 :Home -STR_2562 :Left -STR_2563 :Up -STR_2564 :Right -STR_2565 :Down +STR_2562 :Vasen +STR_2563 :Ylös +STR_2564 :Oikea +STR_2565 :Alas STR_2566 :Select STR_2567 :Print STR_2568 :Execute -STR_2569 :Snapshot +STR_2569 :Ruudunkaappaus STR_2570 :Insert STR_2571 :Delete -STR_2572 :Help +STR_2572 :Ohje STR_2573 :0 STR_2574 :1 STR_2575 :2 @@ -2623,7 +2623,7 @@ STR_2614 :Y STR_2615 :Z STR_2616 :??? STR_2617 :??? -STR_2618 :Menu +STR_2618 :Valikko STR_2619 :??? STR_2620 :??? STR_2621 :NumPad 0 @@ -2706,12 +2706,12 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Autosave frequency: -STR_2701 :Every week -STR_2702 :Every 2 weeks -STR_2703 :Every month -STR_2704 :Every 4 months -STR_2705 :Every year -STR_2706 :Never +STR_2701 :Joka viikko +STR_2702 :Joka toinen viikko +STR_2703 :Joka kuukausi +STR_2704 :Joka neljäs kuukausi +STR_2705 :Joka vuosi +STR_2706 :Ei koskaan STR_2707 :Open new window STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? STR_2709 :Overwrite @@ -2724,25 +2724,25 @@ STR_2715 :. STR_2716 :/ STR_2717 :' STR_2718 :(up) -STR_2719 :(new file) -STR_2720 :{UINT16}sec -STR_2721 :{UINT16}secs -STR_2722 :{UINT16}min:{UINT16}sec -STR_2723 :{UINT16}min:{UINT16}secs -STR_2724 :{UINT16}mins:{UINT16}sec -STR_2725 :{UINT16}mins:{UINT16}secs +STR_2719 :(uusi tiedosto) +STR_2720 :{UINT16}sek +STR_2721 :{UINT16}sekuntia +STR_2722 :{UINT16}min:{UINT16}sek +STR_2723 :{UINT16}min:{UINT16}sekuntia +STR_2724 :{UINT16}minuuttia:{UINT16}sek +STR_2725 :{UINT16}minuuttia:{UINT16}sekuntia STR_2726 :{UINT16}min -STR_2727 :{UINT16}mins -STR_2728 :{UINT16}hour:{UINT16}min -STR_2729 :{UINT16}hour:{UINT16}mins -STR_2730 :{UINT16}hours:{UINT16}min -STR_2731 :{UINT16}hours:{UINT16}mins -STR_2732 :{COMMA16}ft +STR_2727 :{UINT16}minuuttia +STR_2728 :{UINT16}tunti:{UINT16}min +STR_2729 :{UINT16}tunti:{UINT16}minuuttia +STR_2730 :{UINT16}tuntia:{UINT16}min +STR_2731 :{UINT16}tuntia:{UINT16}minuuttias +STR_2732 :{COMMA16}jalka STR_2733 :{COMMA16}m STR_2734 :{COMMA16}mph STR_2735 :{COMMA16}km/h -STR_2736 :{MONTH}, Year {COMMA16} -STR_2737 :{STRINGID} {MONTH}, Year {COMMA16} +STR_2736 :{MONTH}, Vuosi {COMMA16} +STR_2737 :{STRINGID} {MONTH}, Vuosi {COMMA16} STR_2738 :Title screen music: STR_2739 :None STR_2740 :RollerCoaster Tycoon 1 @@ -2775,20 +2775,20 @@ STR_2765 :Large Tram STR_2766 :Win scenario STR_2767 :Freeze Climate STR_2768 :Unfreeze Climate -STR_2769 :Open Park -STR_2770 :Close Park +STR_2769 :Avaa puisto +STR_2770 :Sulje puisto STR_2771 :Slower Gamespeed STR_2772 :Faster Gamespeed STR_2773 :Windowed STR_2774 :Fullscreen STR_2775 :Fullscreen (desktop) -STR_2776 :Language: +STR_2776 :Kieli: STR_2777 :{MOVE_X}{SMALLFONT}{STRING} STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} STR_2779 :Viewport #{COMMA16} STR_2780 :Extra viewport # End of new strings -STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :Change keyboard shortcut @@ -2802,14 +2802,14 @@ STR_2791 :Enter name STR_2792 :Please enter your name for the scenario chart: STR_2793 :{SMALLFONT}(Completed by {STRINGID}) STR_2794 :{WINDOW_COLOUR_2}Completed by: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} with a company value of: {BLACK}{CURRENCY} -STR_2795 :Sort +STR_2795 :Järjestä STR_2796 :{SMALLFONT}{BLACK}Sort the ride list into order using the information type displayed STR_2797 :Scroll view when pointer at screen edge STR_2798 :{SMALLFONT}{BLACK}Select whether to scroll the view when the mouse pointer is at the screen edge STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32} STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP} -STR_2802 :Map +STR_2802 :Kartta STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map STR_2805 :{SMALLFONT}{BLACK}Show map of park @@ -2998,7 +2998,7 @@ STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for guests STR_2988 :{SMALLFONT}{BLACK}Demolish this banner STR_2989 :{SMALLFONT}{BLACK}Select main colour STR_2990 :{SMALLFONT}{BLACK}Select text colour -STR_2991 :Sign +STR_2991 :Kyltti STR_2992 :Sign text STR_2993 :Enter new text for this sign: STR_2994 :{SMALLFONT}{BLACK}Change text on sign @@ -3114,9 +3114,9 @@ STR_3103 :Can't re-paint this... STR_3104 :{SMALLFONT}{BLACK}List rides STR_3105 :{SMALLFONT}{BLACK}List shops and stalls STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other guest facilities -STR_3107 :Close +STR_3107 :Sulje STR_3108 :Test -STR_3109 :Open +STR_3109 :Avaa STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16} STR_3111 :{SMALLFONT}{BLACK}Click on design to build it STR_3112 :{SMALLFONT}{BLACK}Click on design to rename or delete it @@ -3137,8 +3137,8 @@ STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% STR_3127 :{WINDOW_COLOUR_2}Nausea Factor: {BLACK}+{COMMA16}% STR_3128 :Save Track Design STR_3129 :Save Track Design with Scenery -STR_3130 :Save -STR_3131 :Cancel +STR_3130 :Tallenna +STR_3131 :Peruuta STR_3132 :{BLACK}Click items of scenery to select them to be saved with track design... STR_3133 :Unable to build this on a slope STR_3134 :{RED}(Design includes scenery which is unavailable) @@ -3164,7 +3164,7 @@ STR_3153 :{SMALLFONT}{BLACK}Scroll {STRINGID} down fast STR_3154 :{SMALLFONT}{BLACK}Scroll {STRINGID} up/down STR_3155 : STR_3156 : -STR_3157 :map +STR_3157 :kartta STR_3158 :graph STR_3159 :list STR_3160 : @@ -3200,7 +3200,7 @@ STR_3189 :Footpaths STR_3190 :Path Extras STR_3191 :Scenery Groups STR_3192 :Park Entrance -STR_3193 :Water +STR_3193 :Vesi STR_3194 :Scenario Description STR_3195 :Invention List STR_3196 :{WINDOW_COLOUR_2}Research Group: {BLACK}{STRINGID} @@ -3297,11 +3297,11 @@ STR_3286 :{SMALLFONT}{BLACK}Select objective for this scenario STR_3287 :{WINDOW_COLOUR_2}Objective: STR_3288 :{SMALLFONT}{BLACK}Select climate STR_3289 :{WINDOW_COLOUR_2}Climate: -STR_3290 :Cool and wet -STR_3291 :Warm -STR_3292 :Hot and dry -STR_3293 :Cold -STR_3294 :Change... +STR_3290 :Kylmä ja märkä +STR_3291 :Lämmin +STR_3292 :Kuuma ja kuiva +STR_3293 :Kylmä +STR_3294 :Muuta... STR_3295 :{SMALLFONT}{BLACK}Change name of park STR_3296 :{SMALLFONT}{BLACK}Change name of scenario STR_3297 :{SMALLFONT}{BLACK}Change detail notes about park / scenario @@ -3356,18 +3356,18 @@ STR_3345 :Track Designs Manager STR_3346 :Can't save track design... STR_3347 :Ride is too large, contains too many elements, or scenery is too spread out STR_3348 :Rename -STR_3349 :Delete +STR_3349 :Poista STR_3350 :Track design name STR_3351 :Enter new name for this track design: STR_3352 :Can't rename track design... STR_3353 :New name contains invalid characters STR_3354 :Another file exists with this name, or file is write-protected STR_3355 :File is write-protected or locked -STR_3356 :Delete File +STR_3356 :Poista tiedosto STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ? STR_3358 :Can't delete track design... STR_3359 :{BLACK}No track designs of this type -STR_3360 :Warning! +STR_3360 :Varoitus! STR_3361 :Too many track designs of this type - Some will not be listed. STR_3362 : STR_3363 : @@ -3385,8 +3385,8 @@ STR_3374 :Warning: Too many objects selected! STR_3375 :Not all objects in this scenery group could be selected STR_3376 :Install new track design... STR_3377 :{SMALLFONT}{BLACK}Install a new track design file -STR_3378 :Install -STR_3379 :Cancel +STR_3378 :Asenna +STR_3379 :Peruuta STR_3380 :Unable to install this track design... STR_3381 :File is not compatible or contains invalid data STR_3382 :File copy failed @@ -3447,11 +3447,11 @@ STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could cust STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape STR_3438 :Unable to remove all scenery from here... STR_3439 :Clear Scenery -STR_3440 :Page 1 -STR_3441 :Page 2 -STR_3442 :Page 3 -STR_3443 :Page 4 -STR_3444 :Page 5 +STR_3440 :Sivu 1 +STR_3441 :Sivu 2 +STR_3442 :Sivu 3 +STR_3443 :Sivu 4 +STR_3444 :Sivu 5 STR_3445 :Set Patrol Area STR_3446 :Cancel Patrol Area @@ -3478,28 +3478,28 @@ STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} STR_5139 :{WHITE}{STRINGID} STR_5140 :Disable brakes failure STR_5141 :Disable all breakdowns -STR_5142 :Normal Speed -STR_5143 :Quick Speed -STR_5144 :Fast Speed -STR_5145 :Turbo Speed -STR_5146 :Hyper Speed -STR_5147 :Cheats -STR_5148 :{SMALLFONT}{BLACK}Change the game speed +STR_5142 :Normaalinopeus +STR_5143 :Pikanopeus +STR_5144 :Nopeanopeus +STR_5145 :Turbonopeus +STR_5146 :Hypernopeus +STR_5147 :Huijaukset +STR_5148 :{SMALLFONT}{BLACK}Muuta pelin nopeus STR_5149 :{SMALLFONT}{BLACK}Open the cheats window STR_5150 :Enable debugging tools STR_5151 :, STR_5152 :. -STR_5153 :Edit Themes... +STR_5153 :Muuta teemoja... 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 STR_5157 :Unlock all prices STR_5158 :Quit to menu -STR_5159 :Exit OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} -STR_5161 :Date Format: -STR_5162 :Day/Month/Year -STR_5163 :Month/Day/Year +STR_5159 :Lopeta OpenRCT2 +STR_5160 :{MONTH} {STRINGID}, vuosi {COMMA16} +STR_5161 :Päiväyksen tyyli: +STR_5162 :Päivä/Kuukausi/Vuosi +STR_5163 :Kuukausi/Päivä/Vuosi STR_5164 :Twitch Channel name STR_5165 :Name peeps after followers STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers @@ -3521,30 +3521,30 @@ STR_5181 :{SMALLFONT}{BLACK}Show ride cheats STR_5182 :{INT32} STR_5183 :Base height STR_5184 :Enter base height between {COMMA16} and {COMMA16} -STR_5185 :Water level +STR_5185 :Veden taso STR_5186 :Enter water level between {COMMA16} and {COMMA16} STR_5187 :Finances STR_5188 :New Campaign STR_5189 :Research -STR_5190 :Map +STR_5190 :Kartta STR_5191 :Viewport STR_5192 :Recent News -STR_5193 :Land -STR_5194 :Water +STR_5193 :Maa +STR_5194 :Vesi STR_5195 :Clear Scenery STR_5196 :Land Rights STR_5197 :Scenery -STR_5198 :Footpath +STR_5198 :Jalkakäytävä STR_5199 :Ride Construction STR_5200 :Track Design Place STR_5201 :New Ride STR_5202 :Track Design Selection STR_5203 :Ride STR_5204 :Ride List -STR_5205 :Guest -STR_5206 :Guest List -STR_5207 :Staff -STR_5208 :Staff List +STR_5205 :Vieras +STR_5206 :Vieraslista +STR_5207 :Henkilöstö +STR_5208 :Henkilöstölista STR_5209 :Banner STR_5210 :Object Selection STR_5211 :Invention List @@ -3553,26 +3553,26 @@ STR_5213 :Objective Options STR_5214 :Map Generation STR_5215 :Track Design Manager STR_5216 :Track Design Manager List -STR_5217 :Cheats -STR_5218 :Themes +STR_5217 :Huijaukset +STR_5218 :Teemat STR_5219 :Options -STR_5220 :Keyboard Shortcuts -STR_5221 :Change Keyboard Shortcut -STR_5222 :Load/Save +STR_5220 :Näppäimistön pikanäppäimet +STR_5221 :Muuta näppäimistön pikanäppäimiä +STR_5222 :Lataa/Tallenna STR_5223 :Save Prompt STR_5224 :Demolish Ride Prompt STR_5225 :Fire Staff Prompt STR_5226 :Track Delete Prompt STR_5227 :Save Overwrite Prompt STR_5228 :{SMALLFONT}{BLACK}Main UI -STR_5229 :{SMALLFONT}{BLACK}Park -STR_5230 :{SMALLFONT}{BLACK}Tools +STR_5229 :{SMALLFONT}{BLACK}Puisto +STR_5230 :{SMALLFONT}{BLACK}Työkalut STR_5231 :{SMALLFONT}{BLACK}Rides and Peeps STR_5232 :{SMALLFONT}{BLACK}Editors STR_5233 :{SMALLFONT}{BLACK}Miscellaneous STR_5234 :{SMALLFONT}{BLACK}Prompts -STR_5235 :{SMALLFONT}{BLACK}Settings -STR_5236 :Window: +STR_5235 :{SMALLFONT}{BLACK}Asetukset +STR_5236 :Ikkuna: STR_5237 :Palette: STR_5238 :Current Theme: STR_5239 :Duplicate @@ -3580,7 +3580,7 @@ STR_5240 :Enter a name for the theme STR_5241 :Can't change this theme STR_5242 :Theme name already exists STR_5243 :Invalid characters used -STR_5244 :Themes +STR_5244 :Teemat STR_5245 :Top Toolbar STR_5246 :Bottom Toolbar STR_5247 :Track Editor Bottom Toolbar @@ -3590,14 +3590,14 @@ STR_5250 :Title Exit Button STR_5251 :Title Options Button STR_5252 :Title Scenario Selection STR_5253 :Park Information -STR_5254 :Create +STR_5254 :Luo STR_5255 :{SMALLFONT}{BLACK}Create a new title sequence from scratch STR_5256 :Create a new theme to make changes to STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one STR_5258 :{SMALLFONT}{BLACK}Delete the current theme STR_5259 :{SMALLFONT}{BLACK}Rename the current theme STR_5260 :Giant Screenshot -STR_5261 :Filter +STR_5261 :Suodatin STR_5262 :Wacky Worlds STR_5263 :Time Twister STR_5264 :Custom @@ -3610,10 +3610,10 @@ STR_5270 :{SMALLFONT}{BLACK}Miscellaneous STR_5271 :{SMALLFONT}{BLACK}Twitch STR_5272 :{SMALLFONT}{BLACK}Small Scenery STR_5273 :{SMALLFONT}{BLACK}Large Scenery -STR_5274 :{SMALLFONT}{BLACK}Footpath +STR_5274 :{SMALLFONT}{BLACK}Jalkakäytävä STR_5275 :Search for Objects STR_5276 :Enter the name of an object to search for -STR_5277 :Clear +STR_5277 :Tyhjennä STR_5278 :Sandbox mode STR_5279 :Sandbox mode off STR_5280 :{SMALLFONT}{BLACK}Allow editing land ownership settings through the Map window and other options that are normally restricted to the Scenario Editor @@ -3632,8 +3632,8 @@ STR_5292 :{SMALLFONT}{BLACK}Force a breakdown STR_5293 :{SMALLFONT}{BLACK}Close ride/attraction STR_5294 :{SMALLFONT}{BLACK}Test ride/attraction STR_5295 :{SMALLFONT}{BLACK}Open ride/attraction -STR_5296 :{SMALLFONT}{BLACK}Close park -STR_5297 :{SMALLFONT}{BLACK}Open park +STR_5296 :{SMALLFONT}{BLACK}Sulje puisto +STR_5297 :{SMALLFONT}{BLACK}Avaa puisto STR_5298 :{RED}{STRINGID} STR_5299 :{LIGHTPINK}{STRINGID} STR_5300 :{SMALLFONT}{BLACK}Quick fire staff @@ -3646,31 +3646,31 @@ STR_5306 :RollerCoaster Tycoon 1 (AA) STR_5307 :RollerCoaster Tycoon 1 (AA + LL) STR_5308 :RollerCoaster Tycoon 2 STR_5309 :OpenRCT2 -STR_5310 :Random +STR_5310 :Satunnainen STR_5311 :{SMALLFONT}{BLACK}Debug tools STR_5312 :Show console STR_5313 :Show tile inspector STR_5314 :Tile inspector -STR_5315 :Grass -STR_5316 :Sand -STR_5317 :Dirt -STR_5318 :Rock +STR_5315 :Nurmikko +STR_5316 :Hiekka +STR_5317 :Pöly +STR_5318 :Kallio STR_5319 :Martian STR_5320 :Checkerboard STR_5321 :Grass clumps -STR_5322 :Ice -STR_5323 :Grid (red) -STR_5324 :Grid (yellow) -STR_5325 :Grid (blue) -STR_5326 :Grid (green) -STR_5327 :Sand (dark) -STR_5328 :Sand (light) +STR_5322 :Jää +STR_5323 :Ruudukko (punainen) +STR_5324 :Ruudukko (keltainen) +STR_5325 :Ruudukko (sininen) +STR_5326 :Ruudukko (vihreä) +STR_5327 :Hiekka (tumma) +STR_5328 :Hiekka (vaalea) STR_5329 :Checkerboard (inverted) STR_5330 :Underground view -STR_5331 :Rock +STR_5331 :Kallio STR_5332 :Wood (red) STR_5333 :Wood (black) -STR_5334 :Ice +STR_5334 :Jää STR_5335 :Ride entrance STR_5336 :Ride exit STR_5337 :Park entrance @@ -3688,32 +3688,32 @@ STR_5348 :Ride cheats STR_5349 :{SMALLFONT}{BLACK}All Rides STR_5350 :Max STR_5351 :Min -STR_5352 :{BLACK}Happiness: -STR_5353 :{BLACK}Energy: -STR_5354 :{BLACK}Hunger: -STR_5355 :{BLACK}Thirst: +STR_5352 :{BLACK}Onnellisuus: +STR_5353 :{BLACK}Energia: +STR_5354 :{BLACK}Nälkä: +STR_5355 :{BLACK}Jano: STR_5356 :{BLACK}Nausea: STR_5357 :{BLACK}Nausea tolerance: STR_5358 :{BLACK}Bathroom: -STR_5359 :Remove guests -STR_5360 :{SMALLFONT}{BLACK}Removes all guests from the map -STR_5361 :Give all guests: +STR_5359 :Poista vieraat +STR_5360 :{SMALLFONT}{BLACK}Poista kaikki vieraat kartalta +STR_5361 :Anna kaikille vieraille: STR_5362 :{BLACK}Set all guests' preferred ride intensity to: -STR_5363 :More than 1 -STR_5364 :Less than 15 -STR_5365 :{BLACK}Staff speed: -STR_5366 :Normal -STR_5367 :Fast +STR_5363 :Enemmän kuin 1 +STR_5364 :Vähemmän kuin 15 +STR_5365 :{BLACK}Henkilöstön nopeus: +STR_5366 :Normaali +STR_5367 :Nopea STR_5368 :Reset crash status STR_5369 :Park parameters... STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. STR_5371 :Object Selection STR_5372 :Invert right mouse dragging -STR_5373 :Name {STRINGID} -STR_5374 :Date {STRINGID} +STR_5373 :Nimi {STRINGID} +STR_5374 :Päiväys {STRINGID} STR_5375 :{UP} STR_5376 :{DOWN} -STR_5377 :{SMALLFONT}{BLACK}Saves +STR_5377 :{SMALLFONT}{BLACK}Tallenteet STR_5378 :{SMALLFONT}{BLACK}Script STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence @@ -3740,27 +3740,27 @@ STR_5400 :Can't change this title sequence STR_5401 :Create a new title sequence to make changes to STR_5402 :Failed to load title sequence STR_5403 :There may be no Load or Wait command or a save may be invalid -STR_5404 :Name already exists +STR_5404 :Nimi on jo olemassa STR_5405 :Enter a name for the save STR_5406 :Enter a name for the title sequence -STR_5407 :Add -STR_5408 :Remove +STR_5407 :Lisää +STR_5408 :Poista STR_5409 :Insert -STR_5410 :Edit +STR_5410 :Muokkaa STR_5411 :Reload STR_5412 :Skip to -STR_5413 :Load +STR_5413 :Lataa STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6 STR_5415 :Load{MOVE_X}{87}{STRING} STR_5416 :Load{MOVE_X}{87}No save selected -STR_5417 :Location -STR_5418 :Location{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5417 :Sijainti +STR_5418 :Sijainti{MOVE_X}{87}{COMMA16} {COMMA16} STR_5419 :Rotate STR_5420 :Rotate{MOVE_X}{87}{COMMA16} STR_5421 :Zoom STR_5422 :Zoom{MOVE_X}{87}{COMMA16} -STR_5423 :Wait -STR_5424 :Wait{MOVE_X}{87}{COMMA16} +STR_5423 :Odota +STR_5424 :Odota{MOVE_X}{87}{COMMA16} STR_5425 :Restart STR_5426 :End STR_5427 :Coordinates: @@ -3768,7 +3768,7 @@ STR_5428 :Anticlockwise rotations: STR_5429 :Zoom level: STR_5430 :Seconds to wait: STR_5431 :Save to load: -STR_5432 :Command: +STR_5432 :Komento: STR_5433 :Title Sequences STR_5434 :Command Editor STR_5435 :Rename save @@ -3779,14 +3779,14 @@ STR_5439 :A wait command with at least 4 seconds is required with a restart c STR_5440 :Minimise fullscreen on focus loss STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. STR_5442 :Force park rating: -STR_5443 :Speed{MOVE_X}{87}{STRINGID} -STR_5444 :Speed: -STR_5445 :Speed +STR_5443 :Nopeus{MOVE_X}{87}{STRINGID} +STR_5444 :Nopeus: +STR_5445 :Nopeus STR_5446 :Get -STR_5447 :Type {STRINGID} +STR_5447 :Tyyppi {STRINGID} STR_5448 :Ride / Vehicle {STRINGID} -STR_5449 :Reduce game speed -STR_5450 :Increase game speed +STR_5449 :Vähennä pelin nopeutta +STR_5450 :Lisää pelin nopeutta STR_5451 :Open cheats window STR_5452 :Toggle visibility of toolbars STR_5453 :Select another ride @@ -3800,9 +3800,9 @@ STR_5460 :Rotate view anti-clockwise STR_5461 :Set guests' parameters STR_5462 :{CURRENCY} STR_5463 :Goal: Have fun! -STR_5464 :General -STR_5465 :Climate -STR_5466 :Staff +STR_5464 :Yleiset +STR_5465 :Ilmasto +STR_5466 :Henkilöstö STR_5467 :ALT + STR_5468 :Recent messages STR_5469 :Scroll map up @@ -3811,13 +3811,19 @@ STR_5471 :Scroll map down STR_5472 :Scroll map right STR_5473 :Cycle day / night STR_5474 :Display text on banners in upper case -STR_5475 :{COMMA16} weeks -STR_5476 :Hardware +STR_5475 :{COMMA16} viikkoa +STR_5476 :Laitteisto STR_5477 :Map rendering STR_5478 :Controls -STR_5479 :Toolbar +STR_5479 :Työkalupalkki STR_5480 :Show toolbar buttons for: -STR_5481 :Themes +STR_5481 :Teemat STR_5482 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}1 minute STR_5483 :{BLACK}({COMMA16} weeks remaining) STR_5484 :{BLACK}({COMMA16} week remaining) +STR_5485 :{SMALLFONT}{STRING} +STR_5486 :{BLACK}{COMMA16} +STR_5487 :{SMALLFONT}{BLACK}Näytä viimeiset viestit +STR_5488 :No entrance +STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests +STR_5490 :Disable audio on focus loss diff --git a/data/language/french.txt b/data/language/french.txt index 6d0530e147..d4ea9d51f9 100644 --- a/data/language/french.txt +++ b/data/language/french.txt @@ -842,7 +842,7 @@ STR_0837 :Unable to initialise graphics system STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -# The follwing six strings were used for display resolutions, but have been replaced. +# The following six strings were used for display resolutions, but have been replaced. STR_0841 : STR_0842 : STR_0843 : @@ -1696,7 +1696,7 @@ STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} STR_1691 :{WINDOW_COLOUR_2} Cost: {BLACK}{CURRENCY} STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY} STR_1693 :{SMALLFONT}{BLACK}Visiteurs -STR_1694 :{SMALLFONT}{BLACK}Staff +STR_1694 :{SMALLFONT}{BLACK}Personnel STR_1695 :{SMALLFONT}{BLACK}Income and costs STR_1696 :{SMALLFONT}{BLACK}Customer information STR_1697 :Cannot place these on queue line area @@ -2321,12 +2321,12 @@ STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) STR_2314 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks -STR_2317 :{WINDOW_COLOUR_2}Sound Quality: -STR_2318 :Low -STR_2319 :Medium -STR_2320 :High -STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} -STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : +STR_2321 :{WINDOW_COLOUR_2}Nombre d'attractions: {BLACK}{COMMA16} +STR_2322 :{WINDOW_COLOUR_2}Personnel: {BLACK}{COMMA16} STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} STR_2324 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}sq.ft. STR_2325 :{SMALLFONT}{BLACK}Buy land to extend park @@ -2441,12 +2441,12 @@ STR_2433 :{BLACK}Vouchers for free {STRINGID} STR_2434 :{BLACK}Advertising campaign for {STRINGID} STR_2435 :{BLACK}Advertising campaign for {STRINGID} STR_2436 :1 semaine -STR_2437 :2 semaines -STR_2438 :3 semaines -STR_2439 :4 semaines -STR_2440 :5 semaines -STR_2441 :6 semaines -STR_2442 :{BLACK}({STRINGID} remaining) +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : +STR_2442 : STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} STR_2445 :Commencer campagne marketing @@ -2787,7 +2787,7 @@ STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} # End of new strings STR_2779 :Viewport #{COMMA16} STR_2780 :Extra viewport -STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :Change keyboard shortcut @@ -2975,8 +2975,8 @@ STR_2965 :{WINDOW_COLOUR_2} STR_2966 : STR_2967 : STR_2968 : -STR_2969 :Use of this product is subject to the terms of a license agreement -STR_2970 :found in the product's {OPENQUOTES}ReadMe{ENDQUOTES} file and in the manual +STR_2969 : +STR_2970 : STR_2971 :Main colour scheme STR_2972 :Alternative colour scheme 1 STR_2973 :Alternative colour scheme 2 @@ -3343,7 +3343,7 @@ STR_3333 :Export plug-in objects with saved games STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles STR_3336 :Track Designs Manager - Select Ride Type -STR_3337 :Parc Six Flags +STR_3337 : STR_3338 :{BLACK}Dispositions personnalisées STR_3339 :{BLACK}{COMMA16} design disponible, ou disposition personnalisée STR_3340 :{BLACK}{COMMA16} designs disponibles, ou dispositions personnalisées @@ -3368,8 +3368,8 @@ STR_3358 :Impossible de supprimer le modèle du circuit... STR_3359 :{BLACK}Pas de modèle de circuit pour ce type STR_3360 :Attention ! STR_3361 :Trop de modèles de circuit pour ce type - Certains ne seront pas listés. -STR_3362 :Forcé mixage tampon logiciel -STR_3363 :{SMALLFONT}{BLACK}Selectionnez cette option pour améliorer les performances si le jeu se met légèrement en pause slightly quand les sons démarrent ou de l'interférence est entendue +STR_3362 : +STR_3363 : STR_3364 :Avancé STR_3365 :{SMALLFONT}{BLACK}Autorise la sélection d'objets individuels du décor en plus des groupes de décor STR_3366 :{BLACK}= Attraction @@ -3459,7 +3459,7 @@ STR_5120 :Finances STR_5121 :Research STR_5122 :Select rides by track type (like in RCT1) STR_5123 :Renouveler attr. -STR_5124 :Pas de Six Flags +STR_5124 : STR_5125 :All destructable STR_5126 :Random title music STR_5127 :{SMALLFONT}{BLACK}Disable land elevation @@ -3544,8 +3544,8 @@ STR_5203 :Attraction STR_5204 :Liste des attractions STR_5205 :Visiteur STR_5206 :Liste des visiteurs -STR_5207 :Staff -STR_5208 :Staff List +STR_5207 :Personnel +STR_5208 :Liste personnel STR_5209 :Banner STR_5210 :Object Selection STR_5211 :Invention List @@ -3702,9 +3702,9 @@ STR_5361 :Give all guests: STR_5362 :{BLACK}Set all guests' preferred ride intensity to: STR_5363 :More than 1 STR_5364 :Less than 15 -STR_5365 :{BLACK}Staff speed: +STR_5365 :{BLACK}Vit. de personnel: STR_5366 :Normal -STR_5367 :Fast +STR_5367 :Rapide STR_5368 :Reset crash status STR_5369 :Park parameters... STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. @@ -3780,9 +3780,9 @@ STR_5439 :A wait command with at least 4 seconds is required with a restart c STR_5440 :Minimise fullscreen on focus loss STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. STR_5442 :Force park rating: -STR_5443 :Speed{MOVE_X}{87}{STRINGID} -STR_5444 :Speed: -STR_5445 :Speed +STR_5443 :Vitesse{MOVE_X}{87}{STRINGID} +STR_5444 :Vitesse: +STR_5445 :Vitesse STR_5446 :Get STR_5447 :Type {STRINGID} STR_5448 :Ride / Vehicle {STRINGID} @@ -3803,7 +3803,7 @@ STR_5462 :{CURRENCY} STR_5463 :Goal: Have fun! STR_5464 :General STR_5465 :Climate -STR_5466 :Staff +STR_5466 :Personnel STR_5467 :ALT + STR_5468 :Recent messages STR_5469 :Scroll map up @@ -3812,9 +3812,21 @@ STR_5471 :Scroll map down STR_5472 :Scroll map right STR_5473 :Cycle day / night STR_5474 :Display text on banners in upper case +STR_5475 :{COMMA16} semaines STR_5476 :Hardware STR_5477 :Map rendering STR_5478 :Controls STR_5479 :Toolbar STR_5480 :Show toolbar buttons for: STR_5481 :Thèmes +STR_5482 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}1 minute +STR_5483 :{BLACK}({COMMA16} weeks remaining) +STR_5484 :{BLACK}({COMMA16} week remaining) +STR_5485 :{SMALLFONT}{STRING} +STR_5486 :{BLACK}{COMMA16} +STR_5487 :{SMALLFONT}{BLACK}Show recent messages +STR_5488 :No entrance +STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests +STR_5490 :Disable audio on focus loss +STR_5491 :Inventions list +STR_5492 :Options scénario diff --git a/data/language/hungarian.txt b/data/language/hungarian.txt index 90ddd747cc..587306f420 100644 --- a/data/language/hungarian.txt +++ b/data/language/hungarian.txt @@ -3,97 +3,97 @@ # Use # at the beginning of a line to leave a comment. STR_0000 : STR_0001 :{STRINGID} {COMMA16} -STR_0002 :Ride -STR_0003 :Ride +STR_0002 :Spiral Roller Coaster +STR_0003 :Stand-up Roller Coaster STR_0004 :Suspended Swinging Coaster -STR_0005 :Ride +STR_0005 :Inverted Roller Coaster STR_0006 :Junior Roller Coaster STR_0007 :Miniature Railway STR_0008 :Monorail STR_0009 :Mini Suspended Coaster -STR_0010 :Ride -STR_0011 :Ride -STR_0012 :Ride +STR_0010 :Boat Ride +STR_0011 :Wooden Wild Mouse +STR_0012 :Steeplechase STR_0013 :Car Ride -STR_0014 :Ride -STR_0015 :Ride -STR_0016 :Ride +STR_0014 :Launched Freefall +STR_0015 :Bobsleigh Coaster +STR_0016 :Observation Tower STR_0017 :Looping Roller Coaster -STR_0018 :Ride -STR_0019 :Ride +STR_0018 :Dinghy Slide +STR_0019 :Mine Train Coaster STR_0020 :Libegő -STR_0021 :Ride -STR_0022 :Ride -STR_0023 :Ride -STR_0024 :Ride -STR_0025 :Ride -STR_0026 :Ride -STR_0027 :Ride -STR_0028 :Ride -STR_0029 :Ride -STR_0030 :Stall -STR_0031 :Stall -STR_0032 :Stall -STR_0033 :Stall -STR_0034 :Stall -STR_0035 :Ride -STR_0036 :Stall -STR_0037 :Kiosk -STR_0038 :Restroom -STR_0039 :Ride -STR_0040 :Ride -STR_0041 :Ride -STR_0042 :Ride -STR_0043 :Ride +STR_0021 :Corkscrew Roller Coaster +STR_0022 :Maze +STR_0023 :Spiral Slide +STR_0024 :Go Karts +STR_0025 :Log Flume +STR_0026 :River Rapids +STR_0027 :Dodgems +STR_0028 :Pirate Ship +STR_0029 :Swinging Inverter Ship +STR_0030 :Food Stall +STR_0031 :Unknown Stall (1D) +STR_0032 :Drink Stall +STR_0033 :Unknown Stall (1F) +STR_0034 :Shop +STR_0035 :Merry-Go-Round +STR_0036 :Unknown Stall (22) +STR_0037 :Information Kiosk +STR_0038 :Toilets +STR_0039 :Ferris Wheel +STR_0040 :Motion Simulator +STR_0041 :3D Cinema +STR_0042 :Top Spin +STR_0043 :Space Rings STR_0044 :Reverse Freefall Coaster STR_0045 :Lift -STR_0046 :Ride -STR_0047 :Ride -STR_0048 :Ride -STR_0049 :Ride -STR_0050 :Ride -STR_0051 :Ride -STR_0052 :Ride -STR_0053 :Hyper-Twister Roller Coaster +STR_0046 :Vertical Drop Roller Coaster +STR_0047 :Cash Machine +STR_0048 :Twist +STR_0049 :Haunted House +STR_0050 :First Aid Room +STR_0051 :Circus Show +STR_0052 :Ghost Train +STR_0053 :Steel Twister Roller Coaster STR_0054 :Fa hullámvasút STR_0055 :Side-Friction Roller Coaster STR_0056 :Vad egér STR_0057 :Multi-Dimension Roller Coaster -STR_0058 :Ride -STR_0059 :Aerial Inverted Roller Coaster -STR_0060 :Ride -STR_0061 :Ride -STR_0062 :Ride -STR_0063 :Ride -STR_0064 :Ride +STR_0058 :Unknown Ride (38) +STR_0059 :Flying Roller Coaster +STR_0060 :Unknown Ride (3A) +STR_0061 :Virginia Reel +STR_0062 :Splash Boats +STR_0063 :Mini Helicopters +STR_0064 :Lay-down Roller Coaster STR_0065 :Felfüggesztett egysínű -STR_0066 :Ride -STR_0067 :Ride +STR_0066 :Unknown Ride (40) +STR_0067 :Reverser Roller Coaster STR_0068 :Heartline Twister Coaster -STR_0069 :Ride -STR_0070 :Ride -STR_0071 :Ride -STR_0072 :Ride -STR_0073 :Ride -STR_0074 :Ride -STR_0075 :Ride +STR_0069 :Mini Golf +STR_0070 :Giga Coaster +STR_0071 :Roto-Drop +STR_0072 :Flying Saucers +STR_0073 :Crooked House +STR_0074 :Monorail Cycles +STR_0075 :Compact Inverted Coaster STR_0076 :Water Coaster -STR_0077 :Ride -STR_0078 :Ride -STR_0079 :Ride -STR_0080 :Ride -STR_0081 :Ride -STR_0082 :Ride -STR_0083 :Ride -STR_0084 :Ride -STR_0085 :Ride -STR_0086 :Ride -STR_0087 :Ride -STR_0088 :Ride +STR_0077 :Air Powered Vertical Coaster +STR_0078 :Inverted Hairpin Coaster +STR_0079 :Magic Carpet +STR_0080 :Submarine Ride +STR_0081 :River Rafts +STR_0082 :Unknown Ride (50) +STR_0083 :Enterprise +STR_0084 :Unknown Ride (52) +STR_0085 :Unknown Ride (53) +STR_0086 :Unknown Ride (54) +STR_0087 :Unknown Ride (55) +STR_0088 :Inverted Impulse Coaster STR_0089 :Mini hullámvasút -STR_0090 :Ride -STR_0091 :Ride -STR_0092 :Ride +STR_0090 :Mine Ride +STR_0091 :Unknown Ride (59) +STR_0092 :LIM Launched Roller Coaster STR_0093 : STR_0094 : STR_0095 : @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 : -STR_0513 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :A looping roller coaster where the riders ride in a standing position STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners -STR_0515 : +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track STR_0518 :Passengers travel in electric trains along a monorail track STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners -STR_0520 : -STR_0521 : -STR_0522 : +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them STR_0523 :Riders travel slowly in powered vehicles along a track-based route -STR_0524 : -STR_0525 : -STR_0526 : +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops -STR_0528 : -STR_0529 : +STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again -STR_0531 : +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_0532 : STR_0533 : -STR_0534 : -STR_0535 : -STR_0536 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids STR_0537 : STR_0538 : STR_0539 : @@ -556,14 +556,14 @@ STR_0551 : STR_0552 : STR_0553 : STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station -STR_0555 : -STR_0556 : +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity @@ -572,38 +572,38 @@ STR_0567 :Sitting in seats suspended either side of the track, riders are pit STR_0568 : STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air STR_0570 : -STR_0571 : -STR_0572 : -STR_0573 : -STR_0574 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground STR_0575 :Powered trains hanging from a single rail transport people around the park STR_0576 : -STR_0577 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists STR_0579 : -STR_0580 : -STR_0581 : +STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes STR_0582 : STR_0583 : -STR_0584 : -STR_0585 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections -STR_0587 : -STR_0588 : +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops STR_0589 : -STR_0590 : -STR_0591 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track STR_0599 :A compact roller coaster with individual cars and smooth twisting drops -STR_0600 : +STR_0600 :Powered mine trains career along a smooth and twisted track layout STR_0601 : -STR_0602 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions STR_0603 :{INT32}. vendég STR_0604 :{INT32}. vendég STR_0605 :{INT32}. vendég @@ -839,16 +839,17 @@ STR_0834 :{SMALLFONT}{BLACK}Disk and game options STR_0835 :Nem sikerült inicializálni a játékot STR_0836 :Unable to start game in a minimized state STR_0837 :Unable to initialize graphics system -STR_0838 :CD key code {INT32} is not valid for your RollerCoaster Tycoon 2 CD !{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Please un-install RollerCoaster Tycoon 2% and re-install with the correct CD Key Code +STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -STR_0841 :Ablakban -STR_0842 :Teljes képernyő, 640x480 -STR_0843 :Teljes képernyő, 800x600 -STR_0844 :Teljes képernyő, 1024x768 -STR_0845 :Teljes képernyő, 1152x864 -STR_0846 :Teljes képernyő, 1280x1024 -STR_0847 :About 'RollerCoaster Tycoon 2' +# The following six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :About 'OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028 STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, all rights reserved @@ -977,7 +978,7 @@ STR_0972 :Mégse STR_0973 :OK STR_0974 :Rides STR_0975 :Shops and Stalls -STR_0976 :Restrooms and Information Kiosks +STR_0976 :Toilets and Information Kiosks STR_0977 :New Transport Rides STR_0978 :New Gentle Rides STR_0979 :New Roller Coasters @@ -1044,10 +1045,10 @@ STR_1039 :Install new track design STR_1040 :Játék mentése STR_1041 :Save Scenario STR_1042 :Save Landscape -STR_1043 :RollerCoaster Tycoon 2 mentett játék -STR_1044 :RollerCoaster Tycoon 2 Scenario File -STR_1045 :RollerCoaster Tycoon 2 Landscape File -STR_1046 :RollerCoaster Tycoon 2 Track Design File +STR_1043 :OpenRCT2 mentett játék +STR_1044 :OpenRCT2 Scenario File +STR_1045 :OpenRCT2 Landscape File +STR_1046 :OpenRCT2 Track Design File STR_1047 :Játék mentése sikertelen! STR_1048 :Scenario save failed! STR_1049 :Landscape save failed! @@ -1103,13 +1104,13 @@ STR_1098 :Moving to end of {POP16}{STRINGID} STR_1099 :Waiting for passengers at {POP16}{STRINGID} STR_1100 :Waiting to depart {POP16}{STRINGID} STR_1101 :Departing {POP16}{STRINGID} -STR_1102 :Traveling at {VELOCITY} +STR_1102 :Travelling at {VELOCITY} STR_1103 :Arriving at {POP16}{STRINGID} STR_1104 :Unloading passengers at {POP16}{STRINGID} -STR_1105 :Traveling at {VELOCITY} +STR_1105 :Travelling at {VELOCITY} STR_1106 :Crashing! STR_1107 :Crashed! -STR_1108 :Traveling at {VELOCITY} +STR_1108 :Travelling at {VELOCITY} STR_1109 :Swinging STR_1110 :Rotating STR_1111 :Rotating @@ -1121,7 +1122,7 @@ STR_1116 :Operating STR_1117 :Doing circus show STR_1118 :Operating STR_1119 :Waiting for cable lift -STR_1120 :Traveling at {VELOCITY} +STR_1120 :Travelling at {VELOCITY} STR_1121 :Stopping STR_1122 :Waiting for passengers STR_1123 :Waiting to start @@ -1130,18 +1131,18 @@ STR_1125 :Operating STR_1126 :Stopping STR_1127 :Unloading passengers STR_1128 :Stopped by block brakes -STR_1129 :All vehicles in same colors -STR_1130 :Different colors per {STRINGID} -STR_1131 :Different colors per vehicle +STR_1129 :All vehicles in same colours +STR_1130 :Different colours per {STRINGID} +STR_1131 :Different colours per vehicle STR_1132 :Vehicle {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1133 :Vehicle {POP16}{COMMA16} STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} STR_1135 :{STRINGID} {COMMA16} -STR_1136 :{SMALLFONT}{BLACK}Select main color -STR_1137 :{SMALLFONT}{BLACK}Select additional color 1 -STR_1138 :{SMALLFONT}{BLACK}Select additional color 2 -STR_1139 :{SMALLFONT}{BLACK}Select support structure color -STR_1140 :{SMALLFONT}{BLACK}Select vehicle color scheme option +STR_1136 :{SMALLFONT}{BLACK}Select main colour +STR_1137 :{SMALLFONT}{BLACK}Select additional colour 1 +STR_1138 :{SMALLFONT}{BLACK}Select additional colour 2 +STR_1139 :{SMALLFONT}{BLACK}Select support structure colour +STR_1140 :{SMALLFONT}{BLACK}Select vehicle colour scheme option STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} @@ -1216,8 +1217,8 @@ STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time: STR_1212 :{WINDOW_COLOUR_2}Maximum waiting time: STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing -STR_1215 :{WINDOW_COLOUR_2}Synchronize with adjacent stations -STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronize departure with all adjacent stations (for 'racing') +STR_1215 :{WINDOW_COLOUR_2}Synchonise with adjacent stations +STR_1216 :{SMALLFONT}{BLACK}Select whether to synchonise departure with all adjacent stations (for 'racing') STR_1217 :{COMMA16} seconds STR_1218 :{BLACK}{SMALLUP} STR_1219 :{BLACK}{SMALLDOWN} @@ -1397,7 +1398,7 @@ STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options STR_1394 :{SMALLFONT}{BLACK}Operating options STR_1395 :{SMALLFONT}{BLACK}Maintenance options -STR_1396 :{SMALLFONT}{BLACK}Color scheme options +STR_1396 :{SMALLFONT}{BLACK}Colour scheme options STR_1397 :{SMALLFONT}{BLACK}Sound & music options STR_1398 :{SMALLFONT}{BLACK}Measurements and test data STR_1399 :{SMALLFONT}{BLACK}Graphs @@ -1526,9 +1527,9 @@ STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} -STR_1525 :{SMALLFONT}{OPENQUOTES}These fries from {STRINGID} are really good value{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} -STR_1527 :{SMALLFONT}{OPENQUOTES}This cotton candy from {STRINGID} is really good value{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} STR_1528 : STR_1529 : STR_1530 : @@ -1538,9 +1539,9 @@ STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} -STR_1537 :{SMALLFONT}{OPENQUOTES}This candy apple from {STRINGID} is really good value{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}This toffee apple from {STRINGID} is really good value{ENDQUOTES} STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} -STR_1539 :{SMALLFONT}{OPENQUOTES}This donut from {STRINGID} is really good value{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}This doughnut from {STRINGID} is really good value{ENDQUOTES} STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} STR_1541 : STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} @@ -1560,9 +1561,9 @@ STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride phot STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} -STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fries from {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} -STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for cotton candy from {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} STR_1562 : STR_1563 : STR_1564 : @@ -1572,9 +1573,9 @@ STR_1567 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for popcorn from {S STR_1568 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hot dog from {STRINGID}{ENDQUOTES} STR_1569 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for tentacle from {STRINGID}{ENDQUOTES} STR_1570 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hat from {STRINGID}{ENDQUOTES} -STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a candy apple from {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a toffee apple from {STRINGID}{ENDQUOTES} STR_1572 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a T-shirt from {STRINGID}{ENDQUOTES} -STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a donut from {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a doughnut from {STRINGID}{ENDQUOTES} STR_1574 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for coffee from {STRINGID}{ENDQUOTES} STR_1575 : STR_1576 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried chicken from {STRINGID}{ENDQUOTES} @@ -1754,7 +1755,7 @@ STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DUR STR_1750 :{DURATION} STR_1751 :Can't change time limit for ride... STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park -STR_1753 :{SMALLFONT}{BLACK}Show summarized list of guests in park +STR_1753 :{SMALLFONT}{BLACK}Show summarised list of guests in park STR_1754 :{BLACK}{COMMA16} guests STR_1755 :{BLACK}{COMMA16} guest STR_1756 :{WINDOW_COLOUR_2}Admission price: @@ -1791,7 +1792,7 @@ STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Űrhajóskosztüm STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Banditakosztüm STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Seriffkosztüm STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Kalózkosztüm -STR_1790 :{SMALLFONT}{BLACK}Select uniform color for this type of staff +STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff STR_1791 :{WINDOW_COLOUR_2}Egyenruha színe: STR_1792 :Responding to {STRINGID} breakdown call STR_1793 :Heading to {STRINGID} for an inspection @@ -1820,7 +1821,7 @@ STR_1815 :Thoughts STR_1816 :{SMALLFONT}{BLACK}Select information type to show in guest list STR_1817 :({COMMA16}) STR_1818 :{WINDOW_COLOUR_2}All guests -STR_1819 :{WINDOW_COLOUR_2}All guests (summarized) +STR_1819 :{WINDOW_COLOUR_2}All guests (summarised) STR_1820 :{WINDOW_COLOUR_2}Guests {STRINGID} STR_1821 :{WINDOW_COLOUR_2}Guests thinking {STRINGID} STR_1822 :{WINDOW_COLOUR_2}Guests thinking about {POP16}{STRINGID} @@ -1835,16 +1836,16 @@ STR_1830 :Queue length STR_1831 :Queue time STR_1832 :Reliability STR_1833 :Down-time -STR_1834 :Guests favorite +STR_1834 :Guests favourite STR_1835 :Popularity: Unknown STR_1836 :Popularity: {COMMA16}% STR_1837 :Satisfaction: Unknown STR_1838 :Satisfaction: {COMMA16}% STR_1839 :Reliability: {COMMA16}% STR_1840 :Down-time: {COMMA16}% -STR_1841 :Profit: {CURRENCY} per hour -STR_1842 :Favorite of: {COMMA16} guest -STR_1843 :Favorite of: {COMMA16} guests +STR_1841 :Profit: {CURRENCY2DP} per hour +STR_1842 :Favourite of: {COMMA16} guest +STR_1843 :Favourite of: {COMMA16} guests STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list STR_1845 :{MONTHYEAR} STR_1846 :{COMMA16} guests @@ -1874,8 +1875,8 @@ STR_1869 :{WINDOW_COLOUR_2}Number of rotations: STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1872 :{COMMA16} -STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY} per hour -STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY} per hour +STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY2DP} per hour +STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides @@ -1893,8 +1894,10 @@ STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hou STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride STR_1891 :No {STRINGID} in park yet! -STR_1892 :RollerCoaster Tycoon 2 -STR_1893 :Please insert your RollerCoaster Tycoon 2 CD in the following drive: +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}Build new ride/attraction STR_1896 :{WINDOW_COLOUR_2}Expenditure/Income @@ -1930,7 +1933,7 @@ STR_1925 :Can't place person here... STR_1926 :{SMALLFONT} STR_1927 :{YELLOW}{STRINGID} has broken down STR_1928 :{RED}{STRINGID} has crashed! -STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better +STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organising them better STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this guest - (If tracking is on, guest's movements will be reported in the message area) STR_1931 :{STRINGID} has joined the queue line for {STRINGID} STR_1932 :{STRINGID} is on {STRINGID} @@ -1968,9 +1971,9 @@ STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: STR_1964 :{WINDOW_COLOUR_2}Umbrella price: STR_1965 :{WINDOW_COLOUR_2}Drink price: STR_1966 :{WINDOW_COLOUR_2}Burger price: -STR_1967 :{WINDOW_COLOUR_2}Fries price: +STR_1967 :{WINDOW_COLOUR_2}Chips price: STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: -STR_1969 :{WINDOW_COLOUR_2}Cotton Candy price: +STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: STR_1970 :{WINDOW_COLOUR_2} STR_1971 :{WINDOW_COLOUR_2} STR_1972 :{WINDOW_COLOUR_2} @@ -1980,9 +1983,9 @@ STR_1975 :{WINDOW_COLOUR_2}Popcorn price: STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: STR_1977 :{WINDOW_COLOUR_2}Tentacle price: STR_1978 :{WINDOW_COLOUR_2}Hat price: -STR_1979 :{WINDOW_COLOUR_2}Candy Apple price: +STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: -STR_1981 :{WINDOW_COLOUR_2}Donut price: +STR_1981 :{WINDOW_COLOUR_2}Doughnut price: STR_1982 :{WINDOW_COLOUR_2}Coffee price: STR_1983 :{WINDOW_COLOUR_2} STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: @@ -1998,7 +2001,7 @@ STR_1993 :Innivaló STR_1994 :Hamburger STR_1995 :Sült krumpli STR_1996 :Jégkrém -STR_1997 :Cotton Candy +STR_1997 :Candyfloss STR_1998 :Üres doboz STR_1999 :Szemét STR_2000 :Üres hamburgerdoboz @@ -2008,9 +2011,9 @@ STR_2003 :Popcorn STR_2004 :Hotdog STR_2005 :Tentacle STR_2006 :Kalap -STR_2007 :Candy Apple +STR_2007 :Toffee Apple STR_2008 :Póló -STR_2009 :Donut +STR_2009 :Doughnut STR_2010 :Kávé STR_2011 :Üres pohár STR_2012 :Sült csirke @@ -2024,9 +2027,9 @@ STR_2019 :On-Ride Photos STR_2020 :Umbrellas STR_2021 :Drinks STR_2022 :Burgers -STR_2023 :Fries +STR_2023 :Chips STR_2024 :Ice Creams -STR_2025 :Cotton Candy +STR_2025 :Candyfloss STR_2026 :Empty Cans STR_2027 :Rubbish STR_2028 :Empty Burger Boxes @@ -2036,9 +2039,9 @@ STR_2031 :Popcorn STR_2032 :Hot Dogs STR_2033 :Tentacles STR_2034 :Hats -STR_2035 :Candy Apples +STR_2035 :Toffee Apples STR_2036 :T-Shirts -STR_2037 :Donuts +STR_2037 :Doughnuts STR_2038 :Coffees STR_2039 :Empty Cups STR_2040 :Fried Chicken @@ -2052,9 +2055,9 @@ STR_2047 :an On-Ride Photo STR_2048 :an Umbrella STR_2049 :a Drink STR_2050 :a Burger -STR_2051 :some Fries +STR_2051 :some Chips STR_2052 :an Ice Cream -STR_2053 :some Cotton Candy +STR_2053 :some Candyfloss STR_2054 :an Empty Can STR_2055 :some Rubbish STR_2056 :an Empty Burger Box @@ -2064,9 +2067,9 @@ STR_2059 :some Popcorn STR_2060 :a Hot Dog STR_2061 :a Tentacle STR_2062 :a Hat -STR_2063 :a Candy Apple +STR_2063 :a Toffee Apple STR_2064 :a T-Shirt -STR_2065 :a Donut +STR_2065 :a Doughnut STR_2066 :a Coffee STR_2067 :an Empty Cup STR_2068 :some Fried Chicken @@ -2080,9 +2083,9 @@ STR_2075 :On-Ride Photo of {STRINGID} STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Umbrella STR_2077 :Drink STR_2078 :Burger -STR_2079 :Fries +STR_2079 :Chips STR_2080 :Ice Cream -STR_2081 :Cotton Candy +STR_2081 :Candyfloss STR_2082 :Empty Can STR_2083 :Rubbish STR_2084 :Empty Burger Box @@ -2092,9 +2095,9 @@ STR_2087 :Popcorn STR_2088 :Hot Dog STR_2089 :Tentacle STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hat -STR_2091 :Candy Apple +STR_2091 :Toffee Apple STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-Shirt -STR_2093 :Donut +STR_2093 :Doughnut STR_2094 :Coffee STR_2095 :Empty Cup STR_2096 :Fried Chicken @@ -2318,10 +2321,10 @@ STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) STR_2314 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks -STR_2317 :{WINDOW_COLOUR_2}Sound Quality: -STR_2318 :Low -STR_2319 :Medium -STR_2320 :High +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} @@ -2438,12 +2441,12 @@ STR_2433 :{BLACK}Vouchers for free {STRINGID} STR_2434 :{BLACK}Advertising campaign for {STRINGID} STR_2435 :{BLACK}Advertising campaign for {STRINGID} STR_2436 :1 hét -STR_2437 :2 hét -STR_2438 :3 hét -STR_2439 :4 hét -STR_2440 :5 hét -STR_2441 :6 hét -STR_2442 :{BLACK}({STRINGID} van hátra) +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : +STR_2442 : STR_2443 :{WINDOW_COLOUR_2}Költség hetente: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Teljes költség: {BLACK}{CURRENCY2DP} STR_2445 :Reklámkampány indítása @@ -2500,7 +2503,7 @@ STR_2495 :Cancel construction mode STR_2496 :Játék megállítása STR_2497 :Zoom view out STR_2498 :Zoom view in -STR_2499 :Rotate view +STR_2499 :Rotate view clockwise STR_2500 :Rotate construction object STR_2501 :Underground view toggle STR_2502 :Remove base land toggle @@ -2682,10 +2685,10 @@ STR_2677 :??? STR_2678 :??? STR_2679 :??? STR_2680 :All research complete -STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 -STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry -STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max -STR_2684 :{MEDIUMFONT}{BLACK}Large group of peeps arrive +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2682 : +STR_2683 : +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive STR_2685 :Simplex Noise Parameters STR_2686 :{WINDOW_COLOUR_2}Low: STR_2687 :{WINDOW_COLOUR_2}High: @@ -2762,11 +2765,11 @@ STR_2757 :Force Sun STR_2758 :Force Thunder STR_2759 :Zero Clearance # New strings used in the cheats window previously these were ??? -STR_2760 :+5K Money -STR_2761 :Pay For Entrance -STR_2762 :Pay For Rides +STR_2760 :+{CURRENCY} +STR_2761 : +STR_2762 : STR_2763 :??? -STR_2764 :Happy Guests +STR_2764 : STR_2765 :Large Tram STR_2766 :Win scenario STR_2767 :Freeze Climate @@ -2784,7 +2787,7 @@ STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} # End of new strings STR_2779 :Viewport #{COMMA16} STR_2780 :Extra viewport -STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :Change keyboard shortcut @@ -2809,12 +2812,12 @@ STR_2802 :Map STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map STR_2805 :{SMALLFONT}{BLACK}Show map of park -STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organizing them better -STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organizing them better -STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better +STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organising them better STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks -STR_2811 :{RED}Guests are complaining because they can't find the restrooms in your park +STR_2811 :{RED}Guests are complaining because they can't find the toilets in your park STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests STR_2814 :{WINDOW_COLOUR_2}Most untidy park award @@ -2827,11 +2830,11 @@ STR_2820 :{WINDOW_COLOUR_2}Safest park award STR_2821 :{WINDOW_COLOUR_2}Best staff award STR_2822 :{WINDOW_COLOUR_2}Best park food award STR_2823 :{WINDOW_COLOUR_2}Worst park food award -STR_2824 :{WINDOW_COLOUR_2}Best park restrooms award +STR_2824 :{WINDOW_COLOUR_2}Best park toilets award STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award STR_2826 :{WINDOW_COLOUR_2}Best water rides award STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award -STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride color schemes award +STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride colour schemes award STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award STR_2830 :{WINDOW_COLOUR_2}Best gentle ride award STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'! @@ -2844,11 +2847,11 @@ STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park i STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! -STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best restroom facilities in the country'! +STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best toilet facilities in the country'! STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water rides in the country'! STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed rides'! -STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of color schemes'! +STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of colour schemes'! STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle rides'! STR_2848 :{WINDOW_COLOUR_2}No recent awards @@ -2862,7 +2865,7 @@ STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Constru STR_2856 :{WINDOW_COLOUR_2}Tutorial STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) STR_2858 :Can't start marketing campaign... -STR_2859 :Another instance of RollerCoaster Tycoon 2 is already running +STR_2859 :Another instance of OpenRCT2 is already running STR_2860 :Infogrames Interactive credits... STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. STR_2862 :Music acknowledgements... @@ -2972,14 +2975,14 @@ STR_2965 :{WINDOW_COLOUR_2} STR_2966 : STR_2967 : STR_2968 : -STR_2969 :Use of this product is subject to the terms of a license agreement -STR_2970 :found in the product's {OPENQUOTES}ReadMe{ENDQUOTES} file and in the manual -STR_2971 :Main color scheme -STR_2972 :Alternative color scheme 1 -STR_2973 :Alternative color scheme 2 -STR_2974 :Alternative color scheme 3 -STR_2975 :{SMALLFONT}{BLACK}Select which color scheme to change, or paint ride with -STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected color scheme +STR_2969 : +STR_2970 : +STR_2971 :Main colour scheme +STR_2972 :Alternative colour scheme 1 +STR_2973 :Alternative colour scheme 2 +STR_2974 :Alternative colour scheme 3 +STR_2975 :{SMALLFONT}{BLACK}Select which colour scheme to change, or paint ride with +STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected colour scheme STR_2977 :Staff member name STR_2978 :Enter new name for this member of staff: STR_2979 :Can't name staff member... @@ -2992,8 +2995,8 @@ STR_2985 :Banner STR_2986 :{SMALLFONT}{BLACK}Change text on banner STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for guests STR_2988 :{SMALLFONT}{BLACK}Demolish this banner -STR_2989 :{SMALLFONT}{BLACK}Select main color -STR_2990 :{SMALLFONT}{BLACK}Select text color +STR_2989 :{SMALLFONT}{BLACK}Select main colour +STR_2990 :{SMALLFONT}{BLACK}Select text colour STR_2991 :Sign STR_2992 :Sign text STR_2993 :Enter new text for this sign: @@ -3084,7 +3087,7 @@ STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! STR_3078 :Plain entrance STR_3079 :Wooden entrance STR_3080 :Canvas tent entrance -STR_3081 :Castle entrance (gray) +STR_3081 :Castle entrance (grey) STR_3082 :Castle entrance (brown) STR_3083 :Jungle entrance STR_3084 :Log cabin entrance @@ -3096,16 +3099,16 @@ STR_3089 :Space entrance STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station STR_3091 :You are not allowed to remove this section! STR_3092 :You are not allowed to move or modify the station for this ride! -STR_3093 :{WINDOW_COLOUR_2}Favorite: {BLACK}{STRINGID} +STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} STR_3094 :N/A STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed STR_3098 :Can't change lift hill speed... -STR_3099 :{SMALLFONT}{BLACK}Select color -STR_3100 :{SMALLFONT}{BLACK}Select second color -STR_3101 :{SMALLFONT}{BLACK}Select third color -STR_3102 :{SMALLFONT}{BLACK}Re-paint colored scenery on landscape +STR_3099 :{SMALLFONT}{BLACK}Select colour +STR_3100 :{SMALLFONT}{BLACK}Select second colour +STR_3101 :{SMALLFONT}{BLACK}Select third colour +STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape STR_3103 :Can't re-paint this... STR_3104 :{SMALLFONT}{BLACK}List rides STR_3105 :{SMALLFONT}{BLACK}List shops and stalls @@ -3125,8 +3128,8 @@ STR_3118 :{BLACK}{STRINGID} is heading for the ride STR_3119 :{BLACK}{STRINGID} is fixing the ride STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy -STR_3122 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guest -STR_3123 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guests +STR_3122 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guest +STR_3123 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guests STR_3124 :Broken {STRINGID} STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% @@ -3163,8 +3166,8 @@ STR_3156 : STR_3157 :map STR_3158 :graph STR_3159 :list -STR_3160 :RollerCoaster Tycoon 2: Starting for the first time... -STR_3161 :RollerCoaster Tycoon 2: Checking object files... +STR_3160 : +STR_3161 : STR_3162 :Unable to allocate enough memory STR_3163 :Installing new data: STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) @@ -3175,7 +3178,7 @@ STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} STR_3169 :Data for the following object not found: STR_3170 :Not enough space for graphics STR_3171 :Too many objects of this type selected -STR_3172 :The following object must be selected first: +STR_3172 :The following object must be selected first: {STRING} STR_3173 :This object is currently in use STR_3174 :This object is required by another object STR_3175 :This object is always required @@ -3340,7 +3343,7 @@ STR_3333 :Export plug-in objects with saved games STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles STR_3336 :Track Designs Manager - Select Ride Type -STR_3337 :Six Flags Park +STR_3337 : STR_3338 :{BLACK}Custom-designed layout STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout @@ -3365,8 +3368,8 @@ STR_3358 :Can't delete track design... STR_3359 :{BLACK}No track designs of this type STR_3360 :Warning! STR_3361 :Too many track designs of this type - Some will not be listed. -STR_3362 :Forced Software Buffer Mixing -STR_3363 :{SMALLFONT}{BLACK}Select this option to improve performance if the game pauses slightly when sounds start or interference is heard +STR_3362 : +STR_3363 : STR_3364 :Advanced STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups STR_3366 :{BLACK}= Ride @@ -3375,8 +3378,8 @@ STR_3368 :{BLACK}= Drink Stall STR_3369 :{BLACK}= Souvenir Stall STR_3370 :{BLACK}= Info. Kiosk STR_3371 :{BLACK}= First Aid -STR_3372 :{BLACK}= A.T.M. -STR_3373 :{BLACK}= Restroom +STR_3372 :{BLACK}= Cash Machine +STR_3373 :{BLACK}= Toilet STR_3374 :Warning: Too many objects selected! STR_3375 :Not all objects in this scenery group could be selected STR_3376 :Install new track design... @@ -3394,6 +3397,7 @@ STR_3387 :Roller Coaster Building Tutorial STR_3388 :Unable to switch to selected mode STR_3389 :Unable to select additional item of scenery... STR_3390 :Too many items selected +# Start of tutorial strings. Not used at the moment, so not necessary to translate. STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... @@ -3439,7 +3443,8 @@ STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow two trains to operate more safely on the circuit... STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... -STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customize the ride a bit... +STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... +# End of tutorial strings STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape STR_3438 :Unable to remove all scenery from here... STR_3439 :Clear Scenery @@ -3450,164 +3455,10 @@ STR_3443 :Page 4 STR_3444 :Page 5 STR_3445 :Set Patrol Area STR_3446 :Cancel Patrol Area -# New strings, cleaner -STR_5120 :Show finances button on toolbar -STR_5121 :Show research button on toolbar -STR_5122 :Show all vehicles sharing a track/ride type -STR_5123 :Renew rides -STR_5124 :No Six Flags -STR_5125 :All destructable -STR_5126 :Random title music -STR_5127 :{SMALLFONT}{BLACK}Disable land elevation -STR_5128 :Selection size -STR_5129 :Enter selection size between {COMMA16} and {COMMA16} -STR_5130 :Map size -STR_5131 :Enter map size between {COMMA16} and {COMMA16} -STR_5132 :Fix all rides -STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights -STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights -STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights -STR_5136 :Land rights -STR_5137 :Allow lift hill and launch speeds{NEWLINE}up to {VELOCITY} -STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} -STR_5139 :{WHITE}{STRINGID} -STR_5140 :Disable brakes failure -STR_5141 :Disable all breakdowns -STR_5142 :Normal Speed -STR_5143 :Quick Speed -STR_5144 :Fast Speed -STR_5145 :Turbo Speed -STR_5146 :Hyper Speed -STR_5147 :Show cheats button on toolbar -STR_5148 :{SMALLFONT}{BLACK}Change the game speed -STR_5149 :{SMALLFONT}{BLACK}Open the cheats window -STR_5150 :Enable debugging tools + #Thousands separator STR_5151 :. #Decimal separator STR_5152 :, -STR_5153 :Colour schemes... -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 -STR_5157 :Unlock all prices -STR_5158 :Quit to menu -STR_5159 :Exit OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} -STR_5161 :Date Format: -STR_5162 :Day/Month/Year -STR_5163 :Month/Day/Year -STR_5164 :Twitch Channel name -STR_5165 :Name peeps after followers -STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers -STR_5167 :Track follower peeps -STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after channel's Twitch followers -STR_5169 :Name peeps after people in Twitch chat -STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat -STR_5171 :Track chat peeps -STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after Twitch chat participants -STR_5173 :Pull Twitch chat as news -STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications -STR_5175 :Input the name of your Twitch channel -STR_5176 :Enable Twitch integration -STR_5177 :Fullscreen mode: -STR_5178 :{SMALLFONT}{BLACK}Show financial cheats -STR_5179 :{SMALLFONT}{BLACK}Show guest cheats -STR_5180 :{SMALLFONT}{BLACK}Show park cheats -STR_5181 :{SMALLFONT}{BLACK}Show ride cheats -STR_5182 :{INT32} -STR_5183 :Base height -STR_5184 :Enter base height between {COMMA16} and {COMMA16} -STR_5185 :Water level -STR_5186 :Enter water level between {COMMA16} and {COMMA16} -STR_5187 :Finances -STR_5188 :New Campaign -STR_5189 :Research -STR_5190 :Map -STR_5191 :Viewport -STR_5192 :Recent News -STR_5193 :Land -STR_5194 :Water -STR_5195 :Clear Scenery -STR_5196 :Land Rights -STR_5197 :Scenery -STR_5198 :Footpath -STR_5199 :Ride Construction -STR_5200 :Track Design Place -STR_5201 :New Ride -STR_5202 :Track Design Selection -STR_5203 :Ride -STR_5204 :Ride List -STR_5205 :Guest -STR_5206 :Guest List -STR_5207 :Staff -STR_5208 :Staff List -STR_5209 :Banner -STR_5210 :Object Selection -STR_5211 :Invention List -STR_5212 :Scenario Options -STR_5213 :Objective Options -STR_5214 :Map Generation -STR_5215 :Track Design Manager -STR_5216 :Track Design Manager List -STR_5217 :Cheats -STR_5218 :Themes -STR_5219 :Options -STR_5220 :Keyboard Shortcuts -STR_5221 :Change Keyboard Shortcut -STR_5222 :Load/Save -STR_5223 :Save Prompt -STR_5224 :Demolish Ride Prompt -STR_5225 :Fire Staff Prompt -STR_5226 :Track Delete Prompt -STR_5227 :Save Overwrite Prompt -STR_5228 :{SMALLFONT}{BLACK}Main UI -STR_5229 :{SMALLFONT}{BLACK}Park -STR_5230 :{SMALLFONT}{BLACK}Tools -STR_5231 :{SMALLFONT}{BLACK}Rides and Peeps -STR_5232 :{SMALLFONT}{BLACK}Editors -STR_5233 :{SMALLFONT}{BLACK}Miscellaneous -STR_5234 :{SMALLFONT}{BLACK}Prompts -STR_5235 :{SMALLFONT}{BLACK}Settings -STR_5236 :Window: -STR_5237 :Palette: -STR_5238 :Current Theme: -STR_5239 :Duplicate -STR_5240 :Enter a name for the theme -STR_5241 :Can't change this theme -STR_5242 :Theme name already exists -STR_5243 :Invalid characters used -STR_5244 :Themes -STR_5245 :Top Toolbar -STR_5246 :Bottom Toolbar -STR_5247 :Track Editor Bottom Toolbar -STR_5248 :Scenario Editor Bottom Toolbar -STR_5249 :Title Menu Buttons -STR_5250 :Title Exit Button -STR_5251 :Title Options Button -STR_5252 :Title Scenario Selection -STR_5253 :Park Information -STR_5254 :Add nausea -STR_5255 :{MEDIUMFONT}{BLACK}All peeps become nauseous -STR_5256 :Create a new theme to make changes to -STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one -STR_5258 :{SMALLFONT}{BLACK}Delete the current theme -STR_5259 :{SMALLFONT}{BLACK}Rename the current theme -STR_5260 :Giant Screenshot -STR_5261 :Filter -STR_5262 :Wacky Worlds -STR_5263 :Time Twister -STR_5264 :Custom -STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible -STR_5266 :{SMALLFONT}{BLACK}Display -STR_5267 :{SMALLFONT}{BLACK}Culture and Units -STR_5268 :{SMALLFONT}{BLACK}Audio -STR_5269 :{SMALLFONT}{BLACK}Controls -STR_5270 :{SMALLFONT}{BLACK}Miscellaneous -STR_5271 :{SMALLFONT}{BLACK}Twitch -STR_5272 :{SMALLFONT}{BLACK}Small Scenery -STR_5273 :{SMALLFONT}{BLACK}Large Scenery -STR_5274 :{SMALLFONT}{BLACK}Footpaths -STR_5275 :Search for Objects -STR_5276 :Enter the name of an object to search for -STR_5277 :Clear + +# Note: as this is an unmaintained language, don't add new strings unless you intend to become the mainainer. diff --git a/data/language/italian.txt b/data/language/italian.txt index fe4a176845..fffd5261fc 100644 --- a/data/language/italian.txt +++ b/data/language/italian.txt @@ -3,97 +3,97 @@ # Use # at the beginning of a line to leave a comment. STR_0000 : STR_0001 :{STRINGID} {COMMA16} -STR_0002 :Attrazione -STR_0003 :Attrazione +STR_0002 :Spiral Roller Coaster +STR_0003 :Stand-up Roller Coaster STR_0004 :Attrazione oscillante -STR_0005 :Attrazione +STR_0005 :Inverted Roller Coaster STR_0006 :Ottovolante per giovanissimi STR_0007 :Ferrovia in miniatura STR_0008 :Monorotaia STR_0009 :Mini-attrazione sospesa -STR_0010 :Attrazione -STR_0011 :Attrazione -STR_0012 :Attrazione +STR_0010 :Boat Ride +STR_0011 :Wooden Wild Mouse +STR_0012 :Steeplechase STR_0013 :Attrazione su carrozza -STR_0014 :Attrazione -STR_0015 :Attrazione -STR_0016 :Attrazione +STR_0014 :Launched Freefall +STR_0015 :Bobsleigh Coaster +STR_0016 :Observation Tower STR_0017 :Ottovolante con giro d. morte -STR_0018 :Attrazione -STR_0019 :Attrazione +STR_0018 :Dinghy Slide +STR_0019 :Mine Train Coaster STR_0020 :Seggiovia -STR_0021 :Attrazione -STR_0022 :Attrazione -STR_0023 :Attrazione -STR_0024 :Attrazione -STR_0025 :Attrazione -STR_0026 :Attrazione -STR_0027 :Attrazione -STR_0028 :Attrazione -STR_0029 :Attrazione -STR_0030 :Chiosco -STR_0031 :Chiosco -STR_0032 :Chiosco -STR_0033 :Chiosco +STR_0021 :Corkscrew Roller Coaster +STR_0022 :Maze +STR_0023 :Spiral Slide +STR_0024 :Go Karts +STR_0025 :Log Flume +STR_0026 :River Rapids +STR_0027 :Dodgems +STR_0028 :Pirate Ship +STR_0029 :Swinging Inverter Ship +STR_0030 :Food Stall +STR_0031 :Unknown Stall (1D) +STR_0032 :Drink Stall +STR_0033 :Unknown Stall (1F) STR_0034 :Chiosco -STR_0035 :Attrazione -STR_0036 :Chiosco +STR_0035 :Merry-Go-Round +STR_0036 :Unknown Stall (22) STR_0037 :Chiosco STR_0038 :Servizi igienici -STR_0039 :Attrazione -STR_0040 :Attrazione -STR_0041 :Attrazione -STR_0042 :Attrazione -STR_0043 :Attrazione +STR_0039 :Ferris Wheel +STR_0040 :Motion Simulator +STR_0041 :3D Cinema +STR_0042 :Top Spin +STR_0043 :Space Rings STR_0044 :Attraz. a caduta libera rov. STR_0045 :Traino -STR_0046 :Attrazione -STR_0047 :Attrazione -STR_0048 :Attrazione -STR_0049 :Attrazione -STR_0050 :Attrazione -STR_0051 :Attrazione -STR_0052 :Attrazione +STR_0046 :Vertical Drop Roller Coaster +STR_0047 :Cash Machine +STR_0048 :Twist +STR_0049 :Haunted House +STR_0050 :First Aid Room +STR_0051 :Circus Show +STR_0052 :Ghost Train STR_0053 :Ottov. super-serpentina STR_0054 :Ottovolante di legno STR_0055 :Ottov. a frizione laterale STR_0056 :Topo tutto matto STR_0057 :Ottov. multi-dimensionale -STR_0058 :Attrazione +STR_0058 :Unknown Ride (38) STR_0059 :Ottovolante aereo invertito -STR_0060 :Attrazione -STR_0061 :Attrazione -STR_0062 :Attrazione -STR_0063 :Attrazione -STR_0064 :Attrazione +STR_0060 :Unknown Ride (3A) +STR_0061 :Virginia Reel +STR_0062 :Splash Boats +STR_0063 :Mini Helicopters +STR_0064 :Lay-down Roller Coaster STR_0065 :Monorotaia sospesa -STR_0066 :Attrazione -STR_0067 :Attrazione +STR_0066 :Unknown Ride (40) +STR_0067 :Reverser Roller Coaster STR_0068 :Serpentone volante -STR_0069 :Attrazione -STR_0070 :Attrazione -STR_0071 :Attrazione -STR_0072 :Attrazione -STR_0073 :Attrazione -STR_0074 :Attrazione -STR_0075 :Attrazione +STR_0069 :Mini Golf +STR_0070 :Giga Coaster +STR_0071 :Roto-Drop +STR_0072 :Flying Saucers +STR_0073 :Crooked House +STR_0074 :Monorail Cycles +STR_0075 :Compact Inverted Coaster STR_0076 :Attrazione acquatica -STR_0077 :Attrazione -STR_0078 :Attrazione -STR_0079 :Attrazione -STR_0080 :Attrazione -STR_0081 :Attrazione -STR_0082 :Attrazione -STR_0083 :Attrazione -STR_0084 :Attrazione -STR_0085 :Attrazione -STR_0086 :Attrazione -STR_0087 :Attrazione -STR_0088 :Attrazione +STR_0077 :Air Powered Vertical Coaster +STR_0078 :Inverted Hairpin Coaster +STR_0079 :Magic Carpet +STR_0080 :Submarine Ride +STR_0081 :River Rafts +STR_0082 :Unknown Ride (50) +STR_0083 :Enterprise +STR_0084 :Unknown Ride (52) +STR_0085 :Unknown Ride (53) +STR_0086 :Unknown Ride (54) +STR_0087 :Unknown Ride (55) +STR_0088 :Inverted Impulse Coaster STR_0089 :Mini-ottovolante -STR_0090 :Attrazione -STR_0091 :Attrazione -STR_0092 :Attrazione +STR_0090 :Mine Ride +STR_0091 :Unknown Ride (59) +STR_0092 :LIM Launched Roller Coaster STR_0093 : STR_0094 : STR_0095 : @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 : -STR_0513 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :A looping roller coaster where the riders ride in a standing position STR_0514 :I treni, sospesi sotto l'ottovolante, durante le curve oscillano lateralmente -STR_0515 : +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements STR_0516 :Un ottovolante tranquillo, per chi non ha ancora il coraggio di affrontare le attrazioni più impegnative STR_0517 :I passeggeri viaggiano su treni in miniatura su una strada ferrata di dimensioni ridotte STR_0518 :I passeggeri viaggiano su treni elettrici lungo un tracciato monorotaia STR_0519 :I passeggeri viaggiano a bordo di piccole carrozze appese al circuito, oscillando liberamente da lato a lato a ogni curva -STR_0520 : -STR_0521 : -STR_0522 : +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them STR_0523 :I passeggeri viaggiano lentamente su veicoli elettrici lungo un percorso basato su un circuito -STR_0524 : -STR_0525 : -STR_0526 : +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower STR_0527 :Un rapido ottovolante d'acciaio caratterizzato da cadute verticali -STR_0528 : -STR_0529 : +STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track STR_0530 :Le carrozze pendono da un cavo d'acciaio che fa avanti e indietro per tutto il tracciato -STR_0531 : +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_0532 : STR_0533 : -STR_0534 : -STR_0535 : -STR_0536 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids STR_0537 : STR_0538 : STR_0539 : @@ -556,14 +556,14 @@ STR_0551 : STR_0552 : STR_0553 : STR_0554 :La carrozza acquista accelerazione a partire dalla stazione attraverso un lungo tratto pianeggiante grazie a dei motori a induzione lineare, quindi percorre una ripida salita per poi scendere in caduta libera e tornare alla stazione -STR_0555 : -STR_0556 : +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects STR_0563 :Seduti comodamente - il solo limite è che si può effettuare un solo giro alla volta - i passeggeri sperimentano dolci discese e numerose curve, sperimentando una piacevole sensazione di assenza di peso STR_0564 :Quest'attrazione, in cui si viaggia lungo un tracciato di legno, è veloce, ricca di imprevisti, rumorosa e dà al passeggero la sensazione di essere senza controllo, oltre che quella di una grande libertà STR_0565 :Un semplice ottovolante di legno, adatto solo a curve e declivi lenti, in cui le carrozze sono tenute in pista solo dalla frizione delle ruote sui i bordi della pista e dalla gravità @@ -572,38 +572,38 @@ STR_0567 :Seduti su sedili sospesi a entrambi i lati del tracciato, i passegg STR_0568 : STR_0569 :I passeggeri, cinti da speciali imbracature al di sotto il tracciato, sperimentano la sensazione del volo quando vengono fatti oscillare nell'aria STR_0570 : -STR_0571 : -STR_0572 : -STR_0573 : -STR_0574 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground STR_0575 :Dei treni elettrici sospesi sotto una singola rotaia trasportano i passeggeri per tutto il parco STR_0576 : -STR_0577 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections STR_0578 :Le carrozze corrono per il tracciato caratterizzato da vari giri, ripide discese e curve ondulanti STR_0579 : -STR_0580 : -STR_0581 : +STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes STR_0582 : STR_0583 : -STR_0584 : -STR_0585 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions STR_0586 :Carrozze a forma di barca viaggiano lungo l'ottovolante, caratterizzato da ripide discese, curve avvitate e tuffi in sezioni acquatiche più tranquille. -STR_0587 : -STR_0588 : +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops STR_0589 : -STR_0590 : -STR_0591 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track STR_0599 :Un ottovolante compatto con carrozze individuali e rapide curve in discesa -STR_0600 : +STR_0600 :Powered mine trains career along a smooth and twisted track layout STR_0601 : -STR_0602 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions STR_0603 :Visitatore {INT32} STR_0604 :Visitatore {INT32} STR_0605 :Visitatore {INT32} @@ -839,16 +839,17 @@ STR_0834 :{SMALLFONT}{BLACK}Opzioni di gioco e del disco STR_0835 :Inizializzazione del gioco fallita STR_0836 :Impossibile iniziare la partita se la finestra è ridotta a icona STR_0837 :Impossibile inizializzare il sistema grafico -STR_0838 :Il codice CD {INT32} del CD del tuo RollerCoaster Tycoon 2 è errato!{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Disinstalla RollerCoaster Tycoon 2% e installalo di nuovo digitando il codice CD corretto +STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -STR_0841 :Finestra sul desktop -STR_0842 :640x480 schermo intero -STR_0843 :800x600 schermo intero -STR_0844 :1024x768 schermo intero -STR_0845 :1152x864 schermo intero -STR_0846 :1280x1024 schermo intero -STR_0847 :Informazioni su 'RollerCoaster Tycoon 2' +# The following six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :Informazioni su 'OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}Versione 2.01.032 STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, tutti i diritti riservati @@ -1044,10 +1045,10 @@ STR_1039 :Installa un nuovo design del tracciato STR_1040 :Salva la partita STR_1041 :Salva lo scenario STR_1042 :Salva il paesaggio -STR_1043 :Partita di RollerCoaster Tycoon 2 salvata -STR_1044 :File di scenario per RollerCoaster Tycoon 2 -STR_1045 :File di paesaggi per RollerCoaster Tycoon 2 -STR_1046 :File di design dei tracciati per RollerCoaster Tycoon 2 +STR_1043 :Partita di OpenRCT2 salvata +STR_1044 :File di scenario per OpenRCT2 +STR_1045 :File di paesaggi per OpenRCT2 +STR_1046 :File di design dei tracciati per OpenRCT2 STR_1047 :Salvataggio partita fallito! STR_1048 :Salvataggio scenario fallito! STR_1049 :Salvataggio terreno fallito! @@ -1059,13 +1060,13 @@ STR_1054 :{SMALLFONT}{BLACK}Battezza attrazioni STR_1055 :{SMALLFONT}{BLACK}Battezza persone STR_1056 :{SMALLFONT}{BLACK}Battezza membri del personale STR_1057 :Nome dell'attrazione -STR_1058 :Digita il nuovo nome di quest'attrazione:- +STR_1058 :Digita il nuovo nome di quest'attrazione: STR_1059 :Impossibile ribattezzare l'attrazione... STR_1060 :Nome dell'attrazione non valido STR_1061 :Modalità normale STR_1062 :Modalità a circuito continuo STR_1063 :Mod. navetta a lancio rovesc. inclinato -STR_1064 :Lancio a motore +STR_1064 :Lancio a motore (passing station) STR_1065 :Modalità navetta STR_1066 :Modalità affitto barche STR_1067 :Lancio in salita @@ -1097,7 +1098,7 @@ STR_1092 :Lancio in discesa STR_1093 :Modalità casa distorta STR_1094 :Modalità caduta libera STR_1095 :Mod. circuito continuo sezi. a blocchi -STR_1096 :Lancio a motore +STR_1096 :Lancio a motore (without passing station) STR_1097 :Mod. lancio a motore sez. a blocchi STR_1098 :In viaggio verso la fine della {POP16}{STRINGID} STR_1099 :In attesa di passeggeri a {POP16}{STRINGID} @@ -1451,10 +1452,10 @@ STR_1446 :Sta guardando lo scenario STR_1447 :Sta lasciando il parco STR_1448 :Sta osservando la nuova attrazione in costruzione STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) -STR_1450 :{INLINE_SPRITE}{MEDIUMFONT}□ +STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) STR_1452 :Nome del visitatore -STR_1453 :Digita il nome di questo visitatore:- +STR_1453 :Digita il nome di questo visitatore: STR_1454 :Impossibile battezzare il visitatore... STR_1455 :Il nome del visitatore non è valido STR_1456 :{WINDOW_COLOUR_2}Denaro speso: {BLACK}{CURRENCY2DP} @@ -1713,14 +1714,14 @@ STR_1708 :{SMALLFONT}{BLACK}Fissa la zona che questo dipendente deve controll STR_1709 :Licenzia il personale STR_1710 :Sì STR_1711 :{WINDOW_COLOUR_1}Sei sicuro di voler licenziare{NEWLINE}{STRINGID}? -STR_1712 :{INLINE_SPRITE}÷□ -STR_1713 :{INLINE_SPRITE}ø□ -STR_1714 :{INLINE_SPRITE}ù□ -STR_1715 :{INLINE_SPRITE}ú□ +STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Sweep footpaths +STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Water gardens +STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Empty litter bins +STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Mow grass STR_1716 :Non è un nome valido per il parco STR_1717 :Impossibile ribattezzare il parco... STR_1718 :Nome del parco -STR_1719 :Digita il nome del parco:- +STR_1719 :Digita il nome del parco: STR_1720 :{SMALLFONT}{BLACK}Battezza il parco STR_1721 :Parco chiuso STR_1722 :Parco aperto @@ -1758,7 +1759,7 @@ STR_1753 :{SMALLFONT}{BLACK}Mostra il riassunto dei visitatori del parco STR_1754 :{BLACK}{COMMA16} visitatori STR_1755 :{BLACK}{COMMA16} visitatore STR_1756 :{WINDOW_COLOUR_2}Prezzo biglietto: -STR_1757 :{WINDOW_COLOUR_2}Affidabilità: {MOVE_X}ÿ{BLACK}{COMMA16}% +STR_1757 :{WINDOW_COLOUR_2}Affidabilità: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1758 :{SMALLFONT}{BLACK}Modalità costruzione STR_1759 :{SMALLFONT}{BLACK}Modalità spostamento STR_1760 :{SMALLFONT}{BLACK}Modalità riempimento @@ -1780,17 +1781,17 @@ STR_1775 :Off STR_1776 :On STR_1777 :{WINDOW_COLOUR_2}Musica STR_1778 :{STRINGID} - - -STR_1779 :{INLINE_SPRITE}þ□ -STR_1780 :{INLINE_SPRITE}ÿ□ -STR_1781 :{INLINE_SPRITE} -STR_1782 :{INLINE_SPRITE}{MOVE_X}□ -STR_1783 :{INLINE_SPRITE}{ADJUST_PALETTE}□ -STR_1784 :{INLINE_SPRITE}□□ -STR_1785 :{INLINE_SPRITE}□□ -STR_1786 :{INLINE_SPRITE}{NEWLINE}□ -STR_1787 :{INLINE_SPRITE}{NEWLINE_SMALLER}□ -STR_1788 :{INLINE_SPRITE}{TINYFONT}□ -STR_1789 :{INLINE_SPRITE}{BIGFONT}□ +STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume +STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume +STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume +STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume +STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snowman costume +STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Knight costume +STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume +STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume +STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume +STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume STR_1790 :{SMALLFONT}{BLACK}Scegli il colore dell'uniforme per questo tipo di dipendente STR_1791 :{WINDOW_COLOUR_2}Colore dell'uniforme: STR_1792 :Sta accorrendo alla chiamata d'emergenza venuta da: {STRINGID} @@ -1848,8 +1849,8 @@ STR_1843 :La preferita da: {COMMA16} visitatori STR_1844 :{SMALLFONT}{BLACK}Scegli il tipo di informazione da mostrare nella lista delle attrazioni STR_1845 :{MONTHYEAR} STR_1846 :{COMMA16} visitatori -STR_1847 :{INLINE_SPRITE}{OUTLINE}□ -STR_1848 :{INLINE_SPRITE}{SMALLFONT}□ +STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} guests +STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} guests STR_1849 :{WINDOW_COLOUR_2}Suona la musica STR_1850 :{SMALLFONT}{BLACK}Scegli quale musica dev'essere suonata in quest'attrazione STR_1851 :{WINDOW_COLOUR_2}Costo mantenim.: {BLACK}{CURRENCY2DP} l'ora @@ -1877,8 +1878,8 @@ STR_1872 :{COMMA16} STR_1873 :{WINDOW_COLOUR_2}Entrate: {BLACK}{CURRENCY} all'ora STR_1874 :{WINDOW_COLOUR_2}Profitto: {BLACK}{CURRENCY} all'ora STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} -STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}û□ -STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}ü□ +STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides +STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides STR_1878 :{WINDOW_COLOUR_2}Ispezione: STR_1879 :Ogni 10 minuti STR_1880 :Ogni 20 minuti @@ -1890,11 +1891,13 @@ STR_1885 :Mai STR_1886 :Sta effettuando un'ispezione {STRINGID} STR_1887 :{WINDOW_COLOUR_2}Tempo dall'ultima ispezione: {BLACK}{COMMA16} minuti STR_1888 :{WINDOW_COLOUR_2}Tempo dall'ultima ispezione: {BLACK}più di 4 ore -STR_1889 :{WINDOW_COLOUR_2}Tempi morti: {MOVE_X}ÿ{BLACK}{COMMA16}% +STR_1889 :{WINDOW_COLOUR_2}Tempi morti: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1890 :{SMALLFONT}{BLACK}Scegli la frequenza con cui un meccanico deve controllare quest'attrazione STR_1891 :Ancora non ci sono {STRINGID} nel parco!! -STR_1892 :RollerCoaster Tycoon 2 -STR_1893 :Inserisci il tuo CD di RollerCoaster Tycoon 2 nella seguente unità:- +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : STR_1894 :{WINDOW_COLOUR_2}{STRINGID} venduti/e: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}Costruisci una nuova attrazione STR_1896 :{WINDOW_COLOUR_2}Uscite/entrate @@ -2318,10 +2321,10 @@ STR_2313 :{WINDOW_COLOUR_2}Livello di nausea: {BLACK}{COMMA2DP32} (circa) STR_2314 :{WINDOW_COLOUR_2}Lunghezza: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}Costo: {BLACK}circa {CURRENCY} STR_2316 :{WINDOW_COLOUR_2}Spazio richiesto: {BLACK}{COMMA16} x {COMMA16} blocchi -STR_2317 :{WINDOW_COLOUR_2}Qualità audio: -STR_2318 :Bassa -STR_2319 :Media -STR_2320 :Alta +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : STR_2321 :{WINDOW_COLOUR_2}Numero di attrazioni: {BLACK}{COMMA16} STR_2322 :{WINDOW_COLOUR_2}Personale: {BLACK}{COMMA16} STR_2323 :{WINDOW_COLOUR_2}Dimensioni del parco: {BLACK}{COMMA32}m{SQUARED} @@ -2438,12 +2441,12 @@ STR_2433 :{BLACK}Buoni sconto gratis per: {STRINGID} STR_2434 :{BLACK}Campagna pubblicitaria per {STRINGID} STR_2435 :{BLACK}Campagna pubblicitaria per {STRINGID} STR_2436 :1 sett. -STR_2437 :2 sett. -STR_2438 :3 sett. -STR_2439 :4 sett. -STR_2440 :5 sett. -STR_2441 :6 sett. -STR_2442 :{BLACK}({STRINGID} rimanenti) +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : +STR_2442 : STR_2443 :{WINDOW_COLOUR_2}Costo settimanale: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Costo totale: {BLACK}{CURRENCY2DP} STR_2445 :Comincia la campagna di marketing @@ -2682,10 +2685,10 @@ STR_2677 :??? STR_2678 :??? STR_2679 :??? STR_2680 :All research complete -STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 -STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry -STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max -STR_2684 :{MEDIUMFONT}{BLACK}Large group of peeps arrive +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2682 : +STR_2683 : +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive STR_2685 :Simplex Noise Parameters STR_2686 :{WINDOW_COLOUR_2}Low: STR_2687 :{WINDOW_COLOUR_2}High: @@ -2748,7 +2751,7 @@ STR_2743 :Copy data\css17.dat from your RCT1 installation to data\css50.dat i STR_2744 :[ STR_2745 :\ STR_2746 :] -STR_2747 :# +STR_2747 :{ENDQUOTES} STR_2748 :Barra STR_2749 :My new scenario # New strings used in the cheats window previously these were ??? @@ -2762,11 +2765,11 @@ STR_2756 :Remove litter STR_2757 :Force Sun STR_2758 :Force Thunder STR_2759 :Zero Clearance -STR_2760 :+5K Money -STR_2761 :Pay For Entrance -STR_2762 :Pay For Rides +STR_2760 :+{CURRENCY} +STR_2761 : +STR_2762 : STR_2763 :??? -STR_2764 :Happy Guests +STR_2764 : STR_2765 :Large Tram STR_2766 :Win scenario STR_2767 :Freeze Climate @@ -2794,7 +2797,7 @@ STR_2788 :{WINDOW_COLOUR_2}Congratulazioni!!{NEWLINE}{BLACK}Hai raggiunto il STR_2789 :{WINDOW_COLOUR_2}Non hai raggiunto il tuo obiettivo!! STR_2790 :Digita il tuo nome in classifica STR_2791 :Digita il tuo nome -STR_2792 :Digita il tuo nome per la classifica degli scenari:- +STR_2792 :Digita il tuo nome per la classifica degli scenari: STR_2793 :{SMALLFONT}(Completato da {STRINGID}) STR_2794 :{WINDOW_COLOUR_2}Completato da: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} con una società del valore di: {BLACK}{CURRENCY} STR_2795 :Ordina @@ -2861,7 +2864,7 @@ STR_2855 :{RED}{STRINGID} non è dotato di un percorso alla sua uscita!!{NEWL STR_2856 :{WINDOW_COLOUR_2}Esercitazione STR_2857 :{WINDOW_COLOUR_2}(Premi un tasto o un pulsante del mouse per assumere il controllo) STR_2858 :Impossibile avviare la campagna di marketing... -STR_2859 :Al momento è in corso un'altra sezione di RollerCoaster Tycoon 2 +STR_2859 :Al momento è in corso un'altra sezione di OpenRCT2 STR_2860 :Riconoscimenti Infogrames... STR_2861 :{WINDOW_COLOUR_2}Concesso in licenza a Infogrames Interactive STR_2862 :Riconoscimenti dei brani musicali... @@ -2971,8 +2974,8 @@ STR_2965 :{WINDOW_COLOUR_2} STR_2966 : STR_2967 : STR_2968 : -STR_2969 :L'utilizzo di questo prodotto è soggetto alle condizioni della licenza -STR_2970 :che si trova nel file {OPENQUOTES}ReadMe{ENDQUOTES} del prodotto e nel manuale +STR_2969 : +STR_2970 : STR_2971 :Modello decorativo principale STR_2972 :Modello decorativo alternativo 1 STR_2973 :Modello decorativo alternativo 2 @@ -2980,12 +2983,12 @@ STR_2974 :Modello decorativo alternativo 3 STR_2975 :{SMALLFONT}{BLACK}Seleziona il modello decorativo da cambiare o da utilizzare STR_2976 :{SMALLFONT}{BLACK}Dipingi una determinata area di quest'attrazione secondo il modello decorativo selezionato STR_2977 :Nome del dipendente -STR_2978 :Digita il nome di questo dipendente:- +STR_2978 :Digita il nome di questo dipendente: STR_2979 :Impossibile battezzare il dipendente... STR_2980 :Troppe insegne nella partita STR_2981 :{RED}Vietato l'ingresso - - STR_2982 :Testo dell'insegna -STR_2983 :Digita il testo di questa insegna:- +STR_2983 :Digita il testo di questa insegna: STR_2984 :Impossibile fissare il testo dell'insegna... STR_2985 :Insegna STR_2986 :{SMALLFONT}{BLACK}Modifica il testo dell'insegna @@ -2995,7 +2998,7 @@ STR_2989 :{SMALLFONT}{BLACK}Scegli il colore principale STR_2990 :{SMALLFONT}{BLACK}Scegli il colore del testo STR_2991 :Cartello STR_2992 :Testo del cartello -STR_2993 :Digita il testo del cartello:- +STR_2993 :Digita il testo del cartello: STR_2994 :{SMALLFONT}{BLACK}Modifica il testo del cartello STR_2995 :{SMALLFONT}{BLACK}Demolisci il cartello STR_2996 :{BLACK}ABC @@ -3162,8 +3165,8 @@ STR_3156 : STR_3157 :mappa STR_3158 :grafico STR_3159 :lista -STR_3160 :RollerCoaster Tycoon 2: si sta avviando per la prima volta... -STR_3161 :RollerCoaster Tycoon 2: sta cercando i file degli oggetti... +STR_3160 : +STR_3161 : STR_3162 :Impossibile assegnare abbastanza memoria STR_3163 :Installazione dei nuovi dati: STR_3164 :{BLACK}{COMMA16} selezionati (massimo {COMMA16}) @@ -3316,9 +3319,9 @@ STR_3310 :{WINDOW_COLOUR_2}{LENGTH} STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32} STR_3312 :{WINDOW_COLOUR_2}Attrazioni sotto ordine di protezione: STR_3313 :Nome scenario -STR_3314 :Digita il nome dello scenario:- +STR_3314 :Digita il nome dello scenario: STR_3315 :Informazioni sul parco/scenario -STR_3316 :Scrivi una descrizione dello scenario:- +STR_3316 :Scrivi una descrizione dello scenario: STR_3317 :Ancora nessuna informazione STR_3318 :{SMALLFONT}{BLACK}Scegli in quale gruppo sarà incluso questo scenario STR_3319 :{WINDOW_COLOUR_2}Gruppo scenari: @@ -3339,7 +3342,7 @@ STR_3333 :Esporta oggetti di plug-in insieme alle partite salvate STR_3334 :{SMALLFONT}{BLACK}Scegli se salvare gli eventuali dati necessari degli oggetti di plug-in (dati non forniti con il prodotto principale) all'interno dei file di scenario o delle partite salvate, permettendone così l'accesso anche a chi non possiede questi dati addizionali STR_3335 :Progettista degli ottovolanti - Seleziona il tipo di veicoli e attrazione STR_3336 :Responsabile dei progetti di tracciato - Seleziona il tipo di attrazione -STR_3337 :Parco Six Flags +STR_3337 : STR_3338 :{BLACK}Disposizione personalizzata STR_3339 :{BLACK}{COMMA16} progetto disponibile o progetto personalizzato STR_3340 :{BLACK}{COMMA16} progetti disponibili o disposizioni personalizzate @@ -3353,7 +3356,7 @@ STR_3347 :L{GREEN}attrazione è troppo grande, contiene troppi elementi o lo STR_3348 :Ribattezza STR_3349 :Cancella STR_3350 :Battezza il progetto di tracciato -STR_3351 :Digita il nome di questo progetto di tracciato:- +STR_3351 :Digita il nome di questo progetto di tracciato: STR_3352 :Impossibile ribattezzare il progetto di tracciato... STR_3353 :Il nuovo nome contiene dei caratteri non validi STR_3354 :Esiste già un altro file con quel nome, o il file è protetto dalla scrittura @@ -3364,8 +3367,8 @@ STR_3358 :Impossibile cancellare il progetto di tracciato... STR_3359 :{BLACK}Non ci sono progetti di tracciato di questi tipo STR_3360 :Attenzione! STR_3361 :Troppi progetti di tracciato di questo tipo - qualcuno non verrà elencato. -STR_3362 :Mixaggio software del buffer forzato -STR_3363 :{SMALLFONT}{BLACK}Seleziona questa opzione per migliorare le prestazioni se quando viene avviato il sonoro il gioco rallenta leggermente o si sentono dei disturbi +STR_3362 : +STR_3363 : STR_3364 :Avanzato STR_3365 :{SMALLFONT}{BLACK}Permetti la selezione di oggetti singoli di uno scenario in aggiunta ai gruppi di scenario STR_3366 :{BLACK}= Attrazione @@ -3393,6 +3396,7 @@ STR_3387 :Esercitazione per la costruzione di ottovolanti STR_3388 :Impossibile passare alla modalità selezionata: DirectX ha causato un errore STR_3389 :Impossibile selezionare l'oggetto aggiuntivo dello scenario... STR_3390 :Troppi oggetti selezionati +# Start of tutorial strings. Not used at the moment, so not necessary to translate. STR_3391 :{SMALLFONT}{BLACK}Ecco il nostro parco - andiamo a dare un'occhiata in giro... STR_3392 :{SMALLFONT}{BLACK}Tenere premuto il pulsante DESTRO del mouse e muovere il mouse stesso è il modo più veloce per spostare la visuale... STR_3393 :{SMALLFONT}{BLACK}Per allargare la prospettiva, puoi zoomare in avanti tramite l'icona in cima allo schermo... @@ -3439,6 +3443,7 @@ STR_3433 :{SMALLFONT}{BLACK}E infine aggiungeremo i 'freni di blocco', che pe STR_3434 :{SMALLFONT}{BLACK}Ora proviamo l'attrazione e vediamo se funziona!! STR_3435 :{SMALLFONT}{BLACK}Fantastico - ha funzionato! Ora aggiungiamo i sentieri e facciamo accomodare i visitatori sul nostro nuovo ottovolante... STR_3436 :{SMALLFONT}{BLACK}Mentre aspettiamo i nostri primi passeggeri, potremmo personalizzare un po' l'attrazione... +# End of tutorial strings STR_3437 :{SMALLFONT}{BLACK}Elimina gli alberi, i muri e i piccoli oggetti di scenario dal terreno STR_3438 :Impossibile rimuovere tutto lo scenario da qui... STR_3439 :Elimina scen. @@ -3450,164 +3455,9 @@ STR_3444 :Pagina 5 STR_3445 :Imposta l'area da pattugliare STR_3446 :Annulla l'area da pattugliare -# New strings, cleaner -STR_5120 :Show finances button on toolbar -STR_5121 :Show research button on toolbar -STR_5122 :Show all vehicles sharing a track/ride type -STR_5123 :Renew rides -STR_5124 :No Six Flags -STR_5125 :All destructable -STR_5126 :Random title music -STR_5127 :{SMALLFONT}{BLACK}Disable land elevation -STR_5128 :Selection size -STR_5129 :Enter selection size between {COMMA16} and {COMMA16} -STR_5130 :Map size -STR_5131 :Enter map size between {COMMA16} and {COMMA16} -STR_5132 :Fix all rides -STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights -STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights -STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights -STR_5136 :Land rights -STR_5137 :Allow lift hill and launch speeds{NEWLINE}up to {VELOCITY} -STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} -STR_5139 :{WHITE}{STRINGID} -STR_5140 :Disable brakes failure -STR_5141 :Disable all breakdowns -STR_5142 :Normal Speed -STR_5143 :Quick Speed -STR_5144 :Fast Speed -STR_5145 :Turbo Speed -STR_5146 :Hyper Speed -STR_5147 :Show cheats button on toolbar -STR_5148 :{SMALLFONT}{BLACK}Change the game speed -STR_5149 :{SMALLFONT}{BLACK}Open the cheats window -STR_5150 :Enable debugging tools #Thousands separator STR_5151 :. #Decimal separator STR_5152 :, -STR_5153 :Colour schemes... -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 -STR_5157 :Unlock all prices -STR_5158 :Quit to menu -STR_5159 :Exit OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} -STR_5161 :Date Format: -STR_5162 :Day/Month/Year -STR_5163 :Month/Day/Year -STR_5164 :Twitch Channel name -STR_5165 :Name peeps after followers -STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers -STR_5167 :Track follower peeps -STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after channel's Twitch followers -STR_5169 :Name peeps after people in Twitch chat -STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat -STR_5171 :Track chat peeps -STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after Twitch chat participants -STR_5173 :Pull Twitch chat as news -STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications -STR_5175 :Input the name of your Twitch channel -STR_5176 :Enable Twitch integration -STR_5177 :Fullscreen mode: -STR_5178 :{SMALLFONT}{BLACK}Show financial cheats -STR_5179 :{SMALLFONT}{BLACK}Show guest cheats -STR_5180 :{SMALLFONT}{BLACK}Show park cheats -STR_5181 :{SMALLFONT}{BLACK}Show ride cheats -STR_5182 :{INT32} -STR_5183 :Base height -STR_5184 :Enter base height between {COMMA16} and {COMMA16} -STR_5185 :Water level -STR_5186 :Enter water level between {COMMA16} and {COMMA16} -STR_5187 :Finances -STR_5188 :New Campaign -STR_5189 :Research -STR_5190 :Map -STR_5191 :Viewport -STR_5192 :Recent News -STR_5193 :Land -STR_5194 :Water -STR_5195 :Clear Scenery -STR_5196 :Land Rights -STR_5197 :Scenery -STR_5198 :Footpath -STR_5199 :Ride Construction -STR_5200 :Track Design Place -STR_5201 :New Ride -STR_5202 :Track Design Selection -STR_5203 :Ride -STR_5204 :Ride List -STR_5205 :Guest -STR_5206 :Guest List -STR_5207 :Staff -STR_5208 :Staff List -STR_5209 :Banner -STR_5210 :Object Selection -STR_5211 :Invention List -STR_5212 :Scenario Options -STR_5213 :Objective Options -STR_5214 :Map Generation -STR_5215 :Track Design Manager -STR_5216 :Track Design Manager List -STR_5217 :Cheats -STR_5218 :Themes -STR_5219 :Options -STR_5220 :Keyboard Shortcuts -STR_5221 :Change Keyboard Shortcut -STR_5222 :Load/Save -STR_5223 :Save Prompt -STR_5224 :Demolish Ride Prompt -STR_5225 :Fire Staff Prompt -STR_5226 :Track Delete Prompt -STR_5227 :Save Overwrite Prompt -STR_5228 :{SMALLFONT}{BLACK}Main UI -STR_5229 :{SMALLFONT}{BLACK}Park -STR_5230 :{SMALLFONT}{BLACK}Tools -STR_5231 :{SMALLFONT}{BLACK}Rides and Peeps -STR_5232 :{SMALLFONT}{BLACK}Editors -STR_5233 :{SMALLFONT}{BLACK}Miscellaneous -STR_5234 :{SMALLFONT}{BLACK}Prompts -STR_5235 :{SMALLFONT}{BLACK}Settings -STR_5236 :Window: -STR_5237 :Palette: -STR_5238 :Current Theme: -STR_5239 :Duplicate -STR_5240 :Enter a name for the theme -STR_5241 :Can't change this theme -STR_5242 :Theme name already exists -STR_5243 :Invalid characters used -STR_5244 :Themes -STR_5245 :Top Toolbar -STR_5246 :Bottom Toolbar -STR_5247 :Track Editor Bottom Toolbar -STR_5248 :Scenario Editor Bottom Toolbar -STR_5249 :Title Menu Buttons -STR_5250 :Title Exit Button -STR_5251 :Title Options Button -STR_5252 :Title Scenario Selection -STR_5253 :Park Information -STR_5254 :Add nausea -STR_5255 :{MEDIUMFONT}{BLACK}All peeps become nauseous -STR_5256 :Create a new theme to make changes to -STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one -STR_5258 :{SMALLFONT}{BLACK}Delete the current theme -STR_5259 :{SMALLFONT}{BLACK}Rename the current theme -STR_5260 :Giant Screenshot -STR_5261 :Filter -STR_5262 :Wacky Worlds -STR_5263 :Time Twister -STR_5264 :Custom -STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible -STR_5266 :{SMALLFONT}{BLACK}Display -STR_5267 :{SMALLFONT}{BLACK}Culture and Units -STR_5268 :{SMALLFONT}{BLACK}Audio -STR_5269 :{SMALLFONT}{BLACK}Controls -STR_5270 :{SMALLFONT}{BLACK}Miscellaneous -STR_5271 :{SMALLFONT}{BLACK}Twitch -STR_5272 :{SMALLFONT}{BLACK}Small Scenery -STR_5273 :{SMALLFONT}{BLACK}Large Scenery -STR_5274 :{SMALLFONT}{BLACK}Footpaths -STR_5275 :Search for Objects -STR_5276 :Enter the name of an object to search for -STR_5277 :Clear + +# Note: as this is an unmaintained language, don't add new strings unless you intend to become the mainainer. diff --git a/data/language/polish.txt b/data/language/polish.txt index ca5ed8af91..5ccda5c790 100644 --- a/data/language/polish.txt +++ b/data/language/polish.txt @@ -3,97 +3,97 @@ # Use # at the beginning of a line to leave a comment. STR_0000 : STR_0001 :{STRINGID} {COMMA16} -STR_0002 :Ride -STR_0003 :Ride +STR_0002 :Spiral Roller Coaster +STR_0003 :Stand-up Roller Coaster STR_0004 :Suspended Swinging Coaster -STR_0005 :Ride +STR_0005 :Inverted Roller Coaster STR_0006 :Junior Roller Coaster STR_0007 :Miniature Railway STR_0008 :Monorail STR_0009 :Mini Suspended Coaster -STR_0010 :Ride -STR_0011 :Ride -STR_0012 :Ride +STR_0010 :Boat Ride +STR_0011 :Wooden Wild Mouse +STR_0012 :Steeplechase STR_0013 :Car Ride -STR_0014 :Ride -STR_0015 :Ride -STR_0016 :Ride +STR_0014 :Launched Freefall +STR_0015 :Bobsleigh Coaster +STR_0016 :Observation Tower STR_0017 :Looping Roller Coaster -STR_0018 :Ride -STR_0019 :Ride +STR_0018 :Dinghy Slide +STR_0019 :Mine Train Coaster STR_0020 :Chairlift -STR_0021 :Ride -STR_0022 :Ride -STR_0023 :Ride -STR_0024 :Ride -STR_0025 :Ride -STR_0026 :Ride -STR_0027 :Ride -STR_0028 :Ride -STR_0029 :Ride -STR_0030 :Stall -STR_0031 :Stall -STR_0032 :Stall -STR_0033 :Stall -STR_0034 :Stall -STR_0035 :Ride -STR_0036 :Stall -STR_0037 :Kiosk -STR_0038 :Restroom -STR_0039 :Ride -STR_0040 :Ride -STR_0041 :Ride -STR_0042 :Ride -STR_0043 :Ride +STR_0021 :Corkscrew Roller Coaster +STR_0022 :Maze +STR_0023 :Spiral Slide +STR_0024 :Go Karts +STR_0025 :Log Flume +STR_0026 :River Rapids +STR_0027 :Dodgems +STR_0028 :Pirate Ship +STR_0029 :Swinging Inverter Ship +STR_0030 :Food Stall +STR_0031 :Unknown Stall (1D) +STR_0032 :Drink Stall +STR_0033 :Unknown Stall (1F) +STR_0034 :Shop +STR_0035 :Merry-Go-Round +STR_0036 :Unknown Stall (22) +STR_0037 :Information Kiosk +STR_0038 :Toilets +STR_0039 :Ferris Wheel +STR_0040 :Motion Simulator +STR_0041 :3D Cinema +STR_0042 :Top Spin +STR_0043 :Space Rings STR_0044 :Reverse Freefall Coaster STR_0045 :Lift -STR_0046 :Ride -STR_0047 :Ride -STR_0048 :Ride -STR_0049 :Ride -STR_0050 :Ride -STR_0051 :Ride -STR_0052 :Ride -STR_0053 :Hyper-Twister Roller Coaster +STR_0046 :Vertical Drop Roller Coaster +STR_0047 :Cash Machine +STR_0048 :Twist +STR_0049 :Haunted House +STR_0050 :First Aid Room +STR_0051 :Circus Show +STR_0052 :Ghost Train +STR_0053 :Steel Twister Roller Coaster STR_0054 :Wooden Roller Coaster STR_0055 :Side-Friction Roller Coaster STR_0056 :Wild Mouse STR_0057 :Multi-Dimension Roller Coaster -STR_0058 :Ride -STR_0059 :Aerial Inverted Roller Coaster -STR_0060 :Ride -STR_0061 :Ride -STR_0062 :Ride -STR_0063 :Ride -STR_0064 :Ride +STR_0058 :Unknown Ride (38) +STR_0059 :Flying Roller Coaster +STR_0060 :Unknown Ride (3A) +STR_0061 :Virginia Reel +STR_0062 :Splash Boats +STR_0063 :Mini Helicopters +STR_0064 :Lay-down Roller Coaster STR_0065 :Suspended Monorail -STR_0066 :Ride -STR_0067 :Ride +STR_0066 :Unknown Ride (40) +STR_0067 :Reverser Roller Coaster STR_0068 :Heartline Twister Coaster -STR_0069 :Ride -STR_0070 :Ride -STR_0071 :Ride -STR_0072 :Ride -STR_0073 :Ride -STR_0074 :Ride -STR_0075 :Ride +STR_0069 :Mini Golf +STR_0070 :Giga Coaster +STR_0071 :Roto-Drop +STR_0072 :Flying Saucers +STR_0073 :Crooked House +STR_0074 :Monorail Cycles +STR_0075 :Compact Inverted Coaster STR_0076 :Water Coaster -STR_0077 :Ride -STR_0078 :Ride -STR_0079 :Ride -STR_0080 :Ride -STR_0081 :Ride -STR_0082 :Ride -STR_0083 :Ride -STR_0084 :Ride -STR_0085 :Ride -STR_0086 :Ride -STR_0087 :Ride -STR_0088 :Ride +STR_0077 :Air Powered Vertical Coaster +STR_0078 :Inverted Hairpin Coaster +STR_0079 :Magic Carpet +STR_0080 :Submarine Ride +STR_0081 :River Rafts +STR_0082 :Unknown Ride (50) +STR_0083 :Enterprise +STR_0084 :Unknown Ride (52) +STR_0085 :Unknown Ride (53) +STR_0086 :Unknown Ride (54) +STR_0087 :Unknown Ride (55) +STR_0088 :Inverted Impulse Coaster STR_0089 :Mini Roller Coaster -STR_0090 :Ride -STR_0091 :Ride -STR_0092 :Ride +STR_0090 :Mine Ride +STR_0091 :Unknown Ride (59) +STR_0092 :LIM Launched Roller Coaster STR_0093 : STR_0094 : STR_0095 : @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 : -STR_0513 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :A looping roller coaster where the riders ride in a standing position STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners -STR_0515 : +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track STR_0518 :Passengers travel in electric trains along a monorail track STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners -STR_0520 : -STR_0521 : -STR_0522 : +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them STR_0523 :Riders travel slowly in powered vehicles along a track-based route -STR_0524 : -STR_0525 : -STR_0526 : +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops -STR_0528 : -STR_0529 : +STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again -STR_0531 : +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_0532 : STR_0533 : -STR_0534 : -STR_0535 : -STR_0536 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids STR_0537 : STR_0538 : STR_0539 : @@ -556,14 +556,14 @@ STR_0551 : STR_0552 : STR_0553 : STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station -STR_0555 : -STR_0556 : +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity @@ -572,38 +572,38 @@ STR_0567 :Sitting in seats suspended either side of the track, riders are pit STR_0568 : STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air STR_0570 : -STR_0571 : -STR_0572 : -STR_0573 : -STR_0574 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground STR_0575 :Powered trains hanging from a single rail transport people around the park STR_0576 : -STR_0577 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists STR_0579 : -STR_0580 : -STR_0581 : +STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes STR_0582 : STR_0583 : -STR_0584 : -STR_0585 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections -STR_0587 : -STR_0588 : +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops STR_0589 : -STR_0590 : -STR_0591 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track STR_0599 :A compact roller coaster with individual cars and smooth twisting drops -STR_0600 : +STR_0600 :Powered mine trains career along a smooth and twisted track layout STR_0601 : -STR_0602 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions # ------------------------------------------ Polish start STR_0603 :Gość {INT32} STR_0604 :Gość {INT32} @@ -841,16 +841,17 @@ STR_0834 :{SMALLFONT}{BLACK}Menu zapisu i opcji STR_0835 :Game initialization failed STR_0836 :Unable to start game in a minimized state STR_0837 :Unable to initialize graphics system -STR_0838 :CD key code {INT32} is not valid for your RollerCoaster Tycoon 2 CD !{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Please un-install RollerCoaster Tycoon 2% and re-install with the correct CD Key Code +STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -STR_0841 :Desktop window -STR_0842 :640x480 full screen -STR_0843 :800x600 full screen -STR_0844 :1024x768 full screen -STR_0845 :1152x864 full screen -STR_0846 :1280x1024 full screen -STR_0847 :About 'RollerCoaster Tycoon 2' +# The following six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :About 'OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028 STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, all rights reserved @@ -1055,10 +1056,10 @@ STR_1039 :Dodaj nowy projekt trasy STR_1040 :Zapisz grę STR_1041 :Zapisz scenariusz STR_1042 :Zapisz krajobraz -STR_1043 :Zapis gry RollerCoaster Tycoon 2 -STR_1044 :Scenariusz RollerCoaster Tycoon 2 -STR_1045 :Krajobrazu RollerCoaster Tycoon 2 -STR_1046 :Projekt trasy RollerCoaster Tycoon 2 +STR_1043 :Zapis gry OpenRCT2 +STR_1044 :Scenariusz OpenRCT2 +STR_1045 :Krajobrazu OpenRCT2 +STR_1046 :Projekt trasy OpenRCT2 STR_1047 :Zapis gry nieudany! STR_1048 :Zapis scenariusza nieudany! STR_1049 :Zapis krajobrazu nieudany! @@ -1115,13 +1116,13 @@ STR_1098 :Moving to end of {POP16}{STRINGID} STR_1099 :Waiting for passengers at {POP16}{STRINGID} STR_1100 :Waiting to depart {POP16}{STRINGID} STR_1101 :Departing {POP16}{STRINGID} -STR_1102 :Traveling at {VELOCITY} +STR_1102 :Travelling at {VELOCITY} STR_1103 :Arriving at {POP16}{STRINGID} STR_1104 :Unloading passengers at {POP16}{STRINGID} -STR_1105 :Traveling at {VELOCITY} +STR_1105 :Travelling at {VELOCITY} STR_1106 :Crashing! STR_1107 :Crashed! -STR_1108 :Traveling at {VELOCITY} +STR_1108 :Travelling at {VELOCITY} STR_1109 :Swinging STR_1110 :Rotating STR_1111 :Rotating @@ -1133,7 +1134,7 @@ STR_1116 :Operating STR_1117 :Doing circus show STR_1118 :Operating STR_1119 :Waiting for cable lift -STR_1120 :Traveling at {VELOCITY} +STR_1120 :Travelling at {VELOCITY} STR_1121 :Stopping STR_1122 :Waiting for passengers STR_1123 :Waiting to start @@ -1142,18 +1143,18 @@ STR_1125 :Operating STR_1126 :Stopping STR_1127 :Unloading passengers STR_1128 :Stopped by block brakes -STR_1129 :All vehicles in same colors -STR_1130 :Different colors per {STRINGID} -STR_1131 :Different colors per vehicle +STR_1129 :All vehicles in same colours +STR_1130 :Different colours per {STRINGID} +STR_1131 :Different colours per vehicle STR_1132 :Vehicle {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1133 :Vehicle {POP16}{COMMA16} STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} STR_1135 :{STRINGID} {COMMA16} -STR_1136 :{SMALLFONT}{BLACK}Select main color -STR_1137 :{SMALLFONT}{BLACK}Select additional color 1 -STR_1138 :{SMALLFONT}{BLACK}Select additional color 2 -STR_1139 :{SMALLFONT}{BLACK}Select support structure color -STR_1140 :{SMALLFONT}{BLACK}Select vehicle color scheme option +STR_1136 :{SMALLFONT}{BLACK}Select main colour +STR_1137 :{SMALLFONT}{BLACK}Select additional colour 1 +STR_1138 :{SMALLFONT}{BLACK}Select additional colour 2 +STR_1139 :{SMALLFONT}{BLACK}Select support structure colour +STR_1140 :{SMALLFONT}{BLACK}Select vehicle colour scheme option STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} @@ -1411,7 +1412,7 @@ STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options STR_1394 :{SMALLFONT}{BLACK}Operating options STR_1395 :{SMALLFONT}{BLACK}Maintenance options -STR_1396 :{SMALLFONT}{BLACK}Color scheme options +STR_1396 :{SMALLFONT}{BLACK}Colour scheme options STR_1397 :{SMALLFONT}{BLACK}Sound & music options STR_1398 :{SMALLFONT}{BLACK}Measurements and test data STR_1399 :{SMALLFONT}{BLACK}Graphs @@ -1543,9 +1544,9 @@ STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} -STR_1525 :{SMALLFONT}{OPENQUOTES}These fries from {STRINGID} are really good value{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} -STR_1527 :{SMALLFONT}{OPENQUOTES}This cotton candy from {STRINGID} is really good value{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} STR_1528 : STR_1529 : STR_1530 : @@ -1555,9 +1556,9 @@ STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} -STR_1537 :{SMALLFONT}{OPENQUOTES}This candy apple from {STRINGID} is really good value{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}This toffee apple from {STRINGID} is really good value{ENDQUOTES} STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} -STR_1539 :{SMALLFONT}{OPENQUOTES}This donut from {STRINGID} is really good value{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}This doughnut from {STRINGID} is really good value{ENDQUOTES} STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} STR_1541 : STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} @@ -1577,9 +1578,9 @@ STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride phot STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} -STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fries from {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} -STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for cotton candy from {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} STR_1562 : STR_1563 : STR_1564 : @@ -1589,9 +1590,9 @@ STR_1567 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for popcorn from {S STR_1568 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hot dog from {STRINGID}{ENDQUOTES} STR_1569 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for tentacle from {STRINGID}{ENDQUOTES} STR_1570 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hat from {STRINGID}{ENDQUOTES} -STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a candy apple from {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a toffee apple from {STRINGID}{ENDQUOTES} STR_1572 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a T-shirt from {STRINGID}{ENDQUOTES} -STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a donut from {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a doughnut from {STRINGID}{ENDQUOTES} STR_1574 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for coffee from {STRINGID}{ENDQUOTES} STR_1575 : STR_1576 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried chicken from {STRINGID}{ENDQUOTES} @@ -1775,7 +1776,7 @@ STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DUR STR_1750 :{DURATION} STR_1751 :Can't change time limit for ride... STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park -STR_1753 :{SMALLFONT}{BLACK}Show summarized list of guests in park +STR_1753 :{SMALLFONT}{BLACK}Show summarised list of guests in park STR_1754 :{BLACK}{COMMA16} guests STR_1755 :{BLACK}{COMMA16} guest STR_1756 :{WINDOW_COLOUR_2}Admission price: @@ -1802,7 +1803,7 @@ STR_1776 :On STR_1777 :{WINDOW_COLOUR_2}Music STR_1778 :{STRINGID} - - STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume -STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tigre costume +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume @@ -1812,8 +1813,8 @@ STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume -STR_1790 :{SMALLFONT}{BLACK}Select uniform color for this type of staff -STR_1791 :{WINDOW_COLOUR_2}Uniform color: +STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff +STR_1791 :{WINDOW_COLOUR_2}Uniform colour: STR_1792 :Responding to {STRINGID} breakdown call STR_1793 :Heading to {STRINGID} for an inspection STR_1794 :Fixing {STRINGID} @@ -1841,7 +1842,7 @@ STR_1815 :Thoughts STR_1816 :{SMALLFONT}{BLACK}Select information type to show in guest list STR_1817 :({COMMA16}) STR_1818 :{WINDOW_COLOUR_2}All guests -STR_1819 :{WINDOW_COLOUR_2}All guests (summarized) +STR_1819 :{WINDOW_COLOUR_2}All guests (summarised) STR_1820 :{WINDOW_COLOUR_2}Guests {STRINGID} STR_1821 :{WINDOW_COLOUR_2}Guests thinking {STRINGID} STR_1822 :{WINDOW_COLOUR_2}Guests thinking about {POP16}{STRINGID} @@ -1898,8 +1899,8 @@ STR_1869 :{WINDOW_COLOUR_2}Number of rotations: STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1872 :{COMMA16} -STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY} per hour -STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY} per hour +STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY2DP} per hour +STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides @@ -1917,8 +1918,10 @@ STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hou STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride STR_1891 :No {STRINGID} in park yet! -STR_1892 :RollerCoaster Tycoon 2 -STR_1893 :Please insert your RollerCoaster Tycoon 2 CD in the following drive: +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}Build new ride/attraction # ------------------------------------------ Polish start @@ -1994,9 +1997,9 @@ STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: STR_1964 :{WINDOW_COLOUR_2}Umbrella price: STR_1965 :{WINDOW_COLOUR_2}Drink price: STR_1966 :{WINDOW_COLOUR_2}Burger price: -STR_1967 :{WINDOW_COLOUR_2}Fries price: +STR_1967 :{WINDOW_COLOUR_2}Chips price: STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: -STR_1969 :{WINDOW_COLOUR_2}Cotton Candy price: +STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: STR_1970 :{WINDOW_COLOUR_2} STR_1971 :{WINDOW_COLOUR_2} STR_1972 :{WINDOW_COLOUR_2} @@ -2006,9 +2009,9 @@ STR_1975 :{WINDOW_COLOUR_2}Popcorn price: STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: STR_1977 :{WINDOW_COLOUR_2}Tentacle price: STR_1978 :{WINDOW_COLOUR_2}Hat price: -STR_1979 :{WINDOW_COLOUR_2}Candy Apple price: +STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: -STR_1981 :{WINDOW_COLOUR_2}Donut price: +STR_1981 :{WINDOW_COLOUR_2}Doughnut price: STR_1982 :{WINDOW_COLOUR_2}Coffee price: STR_1983 :{WINDOW_COLOUR_2} STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: @@ -2022,9 +2025,9 @@ STR_1991 :On-Ride Photo STR_1992 :Umbrella STR_1993 :Drink STR_1994 :Burger -STR_1995 :Fries +STR_1995 :Chips STR_1996 :Ice Cream -STR_1997 :Cotton Candy +STR_1997 :Candyfloss STR_1998 :Empty Can STR_1999 :Rubbish STR_2000 :Empty Burger Box @@ -2034,9 +2037,9 @@ STR_2003 :Popcorn STR_2004 :Hot Dog STR_2005 :Tentacle STR_2006 :Hat -STR_2007 :Candy Apple +STR_2007 :Toffee Apple STR_2008 :T-Shirt -STR_2009 :Donut +STR_2009 :Doughnut STR_2010 :Coffee STR_2011 :Empty Cup STR_2012 :Fried Chicken @@ -2050,9 +2053,9 @@ STR_2019 :On-Ride Photos STR_2020 :Umbrellas STR_2021 :Drinks STR_2022 :Burgers -STR_2023 :Fries +STR_2023 :Chips STR_2024 :Ice Creams -STR_2025 :Cotton Candy +STR_2025 :Candyfloss STR_2026 :Empty Cans STR_2027 :Rubbish STR_2028 :Empty Burger Boxes @@ -2062,9 +2065,9 @@ STR_2031 :Popcorn STR_2032 :Hot Dogs STR_2033 :Tentacles STR_2034 :Hats -STR_2035 :Candy Apples +STR_2035 :Toffee Apples STR_2036 :T-Shirts -STR_2037 :Donuts +STR_2037 :Doughnuts STR_2038 :Coffees STR_2039 :Empty Cups STR_2040 :Fried Chicken @@ -2078,9 +2081,9 @@ STR_2047 :an On-Ride Photo STR_2048 :an Umbrella STR_2049 :a Drink STR_2050 :a Burger -STR_2051 :some Fries +STR_2051 :some Chips STR_2052 :an Ice Cream -STR_2053 :some Cotton Candy +STR_2053 :some Candyfloss STR_2054 :an Empty Can STR_2055 :some Rubbish STR_2056 :an Empty Burger Box @@ -2090,9 +2093,9 @@ STR_2059 :some Popcorn STR_2060 :a Hot Dog STR_2061 :a Tentacle STR_2062 :a Hat -STR_2063 :a Candy Apple +STR_2063 :a Toffee Apple STR_2064 :a T-Shirt -STR_2065 :a Donut +STR_2065 :a Doughnut STR_2066 :a Coffee STR_2067 :an Empty Cup STR_2068 :some Fried Chicken @@ -2106,9 +2109,9 @@ STR_2075 :On-Ride Photo of {STRINGID} STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Umbrella STR_2077 :Drink STR_2078 :Burger -STR_2079 :Fries +STR_2079 :Chips STR_2080 :Ice Cream -STR_2081 :Cotton Candy +STR_2081 :Candyfloss STR_2082 :Empty Can STR_2083 :Rubbish STR_2084 :Empty Burger Box @@ -2118,9 +2121,9 @@ STR_2087 :Popcorn STR_2088 :Hot Dog STR_2089 :Tentacle STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hat -STR_2091 :Candy Apple +STR_2091 :Toffee Apple STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-Shirt -STR_2093 :Donut +STR_2093 :Doughnut STR_2094 :Coffee STR_2095 :Empty Cup STR_2096 :Fried Chicken @@ -2472,12 +2475,12 @@ STR_2433 :{BLACK}Kupony na darmowe {STRINGID} STR_2434 :{BLACK}Kampania reklamowa dla {STRINGID} STR_2435 :{BLACK}Kampania reklamowa dla {STRINGID} STR_2436 :1 tydzień -STR_2437 :2 tygodnie -STR_2438 :3 tygodnie -STR_2439 :4 tygodnie -STR_2440 :5 tygodnie -STR_2441 :6 tygodnie -STR_2442 :{BLACK}(został/y {STRINGID}) +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : +STR_2442 : STR_2443 :{WINDOW_COLOUR_2}Koszt tygodniowy: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Koszt łączny: {BLACK}{CURRENCY2DP} STR_2445 :Rozpocznij kampanię @@ -2537,7 +2540,7 @@ STR_2495 :Cancel construction mode STR_2496 :Pause game STR_2497 :Zoom view out STR_2498 :Zoom view in -STR_2499 :Rotate view +STR_2499 :Rotate view clockwise STR_2500 :Rotate construction object STR_2501 :Underground view toggle STR_2502 :Remove base land toggle @@ -2719,10 +2722,10 @@ STR_2677 :??? STR_2678 :??? STR_2679 :??? STR_2680 :All research complete -STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 -STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry -STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max -STR_2684 :{MEDIUMFONT}{BLACK}Large group of peeps arrive +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2682 : +STR_2683 : +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive STR_2685 :Simplex Noise Parameters STR_2686 :{WINDOW_COLOUR_2}Low: STR_2687 :{WINDOW_COLOUR_2}High: @@ -2805,11 +2808,11 @@ STR_2756 :Usuń śmieci STR_2757 :Wymuś słońce STR_2758 :Wymuś burzę STR_2759 :Mniejsze odstępy -STR_2760 :+5K Pieniędzy -STR_2761 :Płatne Wejście -STR_2762 :Płatne Atrakcje +STR_2760 :+{CURRENCY} +STR_2761 : +STR_2762 : STR_2763 :??? -STR_2764 :Szczęśliwi Goście +STR_2764 : STR_2765 :Przypływ Gości STR_2766 :Wygraj scenariusz STR_2767 :Zablokuj Klimat @@ -2827,7 +2830,7 @@ STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} STR_2779 :Podgląd #{COMMA16} STR_2780 :Dodatkowe okno podglądu # End of new strings -STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :Change keyboard shortcut @@ -2859,7 +2862,7 @@ STR_2807 :{RED}Guests are complaining about the amount of litter in your park STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks -STR_2811 :{RED}Guests are complaining because they can't find the restrooms in your park +STR_2811 :{RED}Guests are complaining because they can't find the toilets in your park STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests STR_2814 :{WINDOW_COLOUR_2}Most untidy park award @@ -2872,11 +2875,11 @@ STR_2820 :{WINDOW_COLOUR_2}Safest park award STR_2821 :{WINDOW_COLOUR_2}Best staff award STR_2822 :{WINDOW_COLOUR_2}Best park food award STR_2823 :{WINDOW_COLOUR_2}Worst park food award -STR_2824 :{WINDOW_COLOUR_2}Best park restrooms award +STR_2824 :{WINDOW_COLOUR_2}Best park toilets award STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award STR_2826 :{WINDOW_COLOUR_2}Best water rides award STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award -STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride color schemes award +STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride colour schemes award STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award STR_2830 :{WINDOW_COLOUR_2}Best gentle ride award STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'! @@ -2889,11 +2892,11 @@ STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park i STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! -STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best restroom facilities in the country'! +STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best toilet facilities in the country'! STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water rides in the country'! STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed rides'! -STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of color schemes'! +STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of colour schemes'! STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle rides'! STR_2848 :{WINDOW_COLOUR_2}No recent awards @@ -2907,7 +2910,7 @@ STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Constru STR_2856 :{WINDOW_COLOUR_2}Tutorial STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) STR_2858 :Can't start marketing campaign... -STR_2859 :Another instance of RollerCoaster Tycoon 2 is already running +STR_2859 :Another instance of OpenRCT2 is already running STR_2860 :Infogrames Interactive credits... STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. STR_2862 :Music acknowledgements... @@ -3017,14 +3020,14 @@ STR_2965 :{WINDOW_COLOUR_2} STR_2966 : STR_2967 : STR_2968 : -STR_2969 :Use of this product is subject to the terms of a license agreement -STR_2970 :found in the product's {OPENQUOTES}ReadMe{ENDQUOTES} file and in the manual -STR_2971 :Main color scheme -STR_2972 :Alternative color scheme 1 -STR_2973 :Alternative color scheme 2 -STR_2974 :Alternative color scheme 3 -STR_2975 :{SMALLFONT}{BLACK}Select which color scheme to change, or paint ride with -STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected color scheme +STR_2969 : +STR_2970 : +STR_2971 :Main colour scheme +STR_2972 :Alternative colour scheme 1 +STR_2973 :Alternative colour scheme 2 +STR_2974 :Alternative colour scheme 3 +STR_2975 :{SMALLFONT}{BLACK}Select which colour scheme to change, or paint ride with +STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected colour scheme STR_2977 :Staff member name STR_2978 :Enter new name for this member of staff: STR_2979 :Can't name staff member... @@ -3037,8 +3040,8 @@ STR_2985 :Banner STR_2986 :{SMALLFONT}{BLACK}Change text on banner STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for guests STR_2988 :{SMALLFONT}{BLACK}Demolish this banner -STR_2989 :{SMALLFONT}{BLACK}Select main color -STR_2990 :{SMALLFONT}{BLACK}Select text color +STR_2989 :{SMALLFONT}{BLACK}Select main colour +STR_2990 :{SMALLFONT}{BLACK}Select text colour STR_2991 :Sign STR_2992 :Sign text STR_2993 :Enter new text for this sign: @@ -3131,7 +3134,7 @@ STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! STR_3078 :Plain entrance STR_3079 :Wooden entrance STR_3080 :Canvas tent entrance -STR_3081 :Castle entrance (gray) +STR_3081 :Castle entrance (grey) STR_3082 :Castle entrance (brown) STR_3083 :Jungle entrance STR_3084 :Log cabin entrance @@ -3143,16 +3146,16 @@ STR_3089 :Space entrance STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station STR_3091 :You are not allowed to remove this section! STR_3092 :You are not allowed to move or modify the station for this ride! -STR_3093 :{WINDOW_COLOUR_2}Favorite: {BLACK}{STRINGID} +STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} STR_3094 :N/A STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed STR_3098 :Can't change lift hill speed... -STR_3099 :{SMALLFONT}{BLACK}Select color -STR_3100 :{SMALLFONT}{BLACK}Select second color -STR_3101 :{SMALLFONT}{BLACK}Select third color -STR_3102 :{SMALLFONT}{BLACK}Re-paint colored scenery on landscape +STR_3099 :{SMALLFONT}{BLACK}Select colour +STR_3100 :{SMALLFONT}{BLACK}Select second colour +STR_3101 :{SMALLFONT}{BLACK}Select third colour +STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape STR_3103 :Can't re-paint this... STR_3104 :{SMALLFONT}{BLACK}List rides STR_3105 :{SMALLFONT}{BLACK}List shops and stalls @@ -3174,8 +3177,8 @@ STR_3118 :{BLACK}{STRINGID} is heading for the ride STR_3119 :{BLACK}{STRINGID} is fixing the ride STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy -STR_3122 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guest -STR_3123 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guests +STR_3122 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guest +STR_3123 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guests STR_3124 :Broken {STRINGID} STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% @@ -3214,8 +3217,8 @@ STR_3156 : STR_3157 :map STR_3158 :graph STR_3159 :list -STR_3160 :RollerCoaster Tycoon 2: Starting for the first time... -STR_3161 :RollerCoaster Tycoon 2: Checking object files... +STR_3160 : +STR_3161 : STR_3162 :Unable to allocate enough memory STR_3163 :Installing new data: STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) @@ -3226,7 +3229,7 @@ STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} STR_3169 :Data for the following object not found: STR_3170 :Not enough space for graphics STR_3171 :Too many objects of this type selected -STR_3172 :The following object must be selected first: +STR_3172 :The following object must be selected first: {STRING} STR_3173 :This object is currently in use STR_3174 :This object is required by another object STR_3175 :This object is always required @@ -3391,7 +3394,7 @@ STR_3333 :Export plug-in objects with saved games STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles STR_3336 :Track Designs Manager - Select Ride Type -STR_3337 :Six Flags Park +STR_3337 : STR_3338 :{BLACK}Custom-designed layout STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout @@ -3418,8 +3421,8 @@ STR_3358 :Can't delete track design... STR_3359 :{BLACK}No track designs of this type STR_3360 :Warning! STR_3361 :Too many track designs of this type - Some will not be listed. -STR_3362 :Forced Software Buffer Mixing -STR_3363 :{SMALLFONT}{BLACK}Select this option to improve performance if the game pauses slightly when sounds start or interference is heard +STR_3362 : +STR_3363 : STR_3364 :Advanced STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups STR_3366 :{BLACK}= Ride @@ -3428,8 +3431,8 @@ STR_3368 :{BLACK}= Drink Stall STR_3369 :{BLACK}= Souvenir Stall STR_3370 :{BLACK}= Info. Kiosk STR_3371 :{BLACK}= First Aid -STR_3372 :{BLACK}= A.T.M. -STR_3373 :{BLACK}= Restroom +STR_3372 :{BLACK}= Cash Machine +STR_3373 :{BLACK}= Toilet STR_3374 :Warning: Too many objects selected! STR_3375 :Not all objects in this scenery group could be selected STR_3376 :Install new track design... @@ -3449,6 +3452,7 @@ STR_3387 :Budowanie Kolejek Górskich STR_3388 :Unable to switch to selected mode STR_3389 :Unable to select additional item of scenery... STR_3390 :Too many items selected +# Start of tutorial strings. Not used at the moment, so not necessary to translate. STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... @@ -3494,7 +3498,8 @@ STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow two trains to operate more safely on the circuit... STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... -STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customize the ride a bit... +STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... +# End of tutorial strings # ------------------------------------------ Polish start STR_3437 :{SMALLFONT}{BLACK}Usuwanie scenerii z terenu STR_3438 :Nie można stąd usunąć całej scenerii... @@ -3506,164 +3511,10 @@ STR_3443 :Strona 4 STR_3444 :Strona 5 STR_3445 :Ustaw obszar do patrolowania STR_3446 :Wyłącz patrolowanie -# New strings, cleaner -STR_5120 :Show finances button on toolbar -STR_5121 :Show research button on toolbar -STR_5122 :Show all vehicles sharing a track/ride type -STR_5123 :Renew rides -STR_5124 :No Six Flags -STR_5125 :All destructable -STR_5126 :Random title music -STR_5127 :{SMALLFONT}{BLACK}Disable land elevation -STR_5128 :Selection size -STR_5129 :Enter selection size between {COMMA16} and {COMMA16} -STR_5130 :Map size -STR_5131 :Enter map size between {COMMA16} and {COMMA16} -STR_5132 :Fix all rides -STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights -STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights -STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights -STR_5136 :Land rights -STR_5137 :Allow lift hill and launch speeds{NEWLINE}up to {VELOCITY} -STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} -STR_5139 :{WHITE}{STRINGID} -STR_5140 :Disable brakes failure -STR_5141 :Disable all breakdowns -STR_5142 :Normal Speed -STR_5143 :Quick Speed -STR_5144 :Fast Speed -STR_5145 :Turbo Speed -STR_5146 :Hyper Speed -STR_5147 :Show cheats button on toolbar -STR_5148 :{SMALLFONT}{BLACK}Change the game speed -STR_5149 :{SMALLFONT}{BLACK}Open the cheats window -STR_5150 :Enable debugging tools + #Thousands separator STR_5151 :. #Decimal separator STR_5152 :, -STR_5153 :Colour schemes... -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 -STR_5157 :Unlock all prices -STR_5158 :Quit to menu -STR_5159 :Exit OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} -STR_5161 :Date Format: -STR_5162 :Day/Month/Year -STR_5163 :Month/Day/Year -STR_5164 :Twitch Channel name -STR_5165 :Name peeps after followers -STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers -STR_5167 :Track follower peeps -STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after channel's Twitch followers -STR_5169 :Name peeps after people in Twitch chat -STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat -STR_5171 :Track chat peeps -STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after Twitch chat participants -STR_5173 :Pull Twitch chat as news -STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications -STR_5175 :Input the name of your Twitch channel -STR_5176 :Enable Twitch integration -STR_5177 :Fullscreen mode: -STR_5178 :{SMALLFONT}{BLACK}Show financial cheats -STR_5179 :{SMALLFONT}{BLACK}Show guest cheats -STR_5180 :{SMALLFONT}{BLACK}Show park cheats -STR_5181 :{SMALLFONT}{BLACK}Show ride cheats -STR_5182 :{INT32} -STR_5183 :Base height -STR_5184 :Enter base height between {COMMA16} and {COMMA16} -STR_5185 :Water level -STR_5186 :Enter water level between {COMMA16} and {COMMA16} -STR_5187 :Finances -STR_5188 :New Campaign -STR_5189 :Research -STR_5190 :Map -STR_5191 :Viewport -STR_5192 :Recent News -STR_5193 :Land -STR_5194 :Water -STR_5195 :Clear Scenery -STR_5196 :Land Rights -STR_5197 :Scenery -STR_5198 :Footpath -STR_5199 :Ride Construction -STR_5200 :Track Design Place -STR_5201 :New Ride -STR_5202 :Track Design Selection -STR_5203 :Ride -STR_5204 :Ride List -STR_5205 :Guest -STR_5206 :Guest List -STR_5207 :Staff -STR_5208 :Staff List -STR_5209 :Banner -STR_5210 :Object Selection -STR_5211 :Invention List -STR_5212 :Scenario Options -STR_5213 :Objective Options -STR_5214 :Map Generation -STR_5215 :Track Design Manager -STR_5216 :Track Design Manager List -STR_5217 :Cheats -STR_5218 :Themes -STR_5219 :Options -STR_5220 :Keyboard Shortcuts -STR_5221 :Change Keyboard Shortcut -STR_5222 :Load/Save -STR_5223 :Save Prompt -STR_5224 :Demolish Ride Prompt -STR_5225 :Fire Staff Prompt -STR_5226 :Track Delete Prompt -STR_5227 :Save Overwrite Prompt -STR_5228 :{SMALLFONT}{BLACK}Main UI -STR_5229 :{SMALLFONT}{BLACK}Park -STR_5230 :{SMALLFONT}{BLACK}Tools -STR_5231 :{SMALLFONT}{BLACK}Rides and Peeps -STR_5232 :{SMALLFONT}{BLACK}Editors -STR_5233 :{SMALLFONT}{BLACK}Miscellaneous -STR_5234 :{SMALLFONT}{BLACK}Prompts -STR_5235 :{SMALLFONT}{BLACK}Settings -STR_5236 :Window: -STR_5237 :Palette: -STR_5238 :Current Theme: -STR_5239 :Duplicate -STR_5240 :Enter a name for the theme -STR_5241 :Can't change this theme -STR_5242 :Theme name already exists -STR_5243 :Invalid characters used -STR_5244 :Themes -STR_5245 :Top Toolbar -STR_5246 :Bottom Toolbar -STR_5247 :Track Editor Bottom Toolbar -STR_5248 :Scenario Editor Bottom Toolbar -STR_5249 :Title Menu Buttons -STR_5250 :Title Exit Button -STR_5251 :Title Options Button -STR_5252 :Title Scenario Selection -STR_5253 :Park Information -STR_5254 :Add nausea -STR_5255 :{MEDIUMFONT}{BLACK}All peeps become nauseous -STR_5256 :Create a new theme to make changes to -STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one -STR_5258 :{SMALLFONT}{BLACK}Delete the current theme -STR_5259 :{SMALLFONT}{BLACK}Rename the current theme -STR_5260 :Giant Screenshot -STR_5261 :Filter -STR_5262 :Wacky Worlds -STR_5263 :Time Twister -STR_5264 :Custom -STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible -STR_5266 :{SMALLFONT}{BLACK}Display -STR_5267 :{SMALLFONT}{BLACK}Culture and Units -STR_5268 :{SMALLFONT}{BLACK}Audio -STR_5269 :{SMALLFONT}{BLACK}Controls -STR_5270 :{SMALLFONT}{BLACK}Miscellaneous -STR_5271 :{SMALLFONT}{BLACK}Twitch -STR_5272 :{SMALLFONT}{BLACK}Small Scenery -STR_5273 :{SMALLFONT}{BLACK}Large Scenery -STR_5274 :{SMALLFONT}{BLACK}Footpaths -STR_5275 :Search for Objects -STR_5276 :Enter the name of an object to search for -STR_5277 :Clear + +# Note: as this is an unmaintained language, don't add new strings unless you intend to become the mainainer. diff --git a/data/language/portuguese_br.txt b/data/language/portuguese_br.txt index 9faf34b983..0020fba54b 100644 --- a/data/language/portuguese_br.txt +++ b/data/language/portuguese_br.txt @@ -3,97 +3,97 @@ # Use # at the beginning of a line to leave a comment. STR_0000 : STR_0001 :{STRINGID} {COMMA16} -STR_0002 :Atração -STR_0003 :Atração +STR_0002 :Spiral Roller Coaster +STR_0003 :Stand-up Roller Coaster STR_0004 :Suspended Swinging Coaster -STR_0005 :Atração +STR_0005 :Inverted Roller Coaster STR_0006 :Montanha-Russa Junior STR_0007 :Miniature Railway STR_0008 :Monotrilho STR_0009 :Mini Suspended Coaster -STR_0010 :Atração -STR_0011 :Atração -STR_0012 :Atração +STR_0010 :Boat Ride +STR_0011 :Wooden Wild Mouse +STR_0012 :Steeplechase STR_0013 :Passeio de carro* -STR_0014 :Atração -STR_0015 :Atração -STR_0016 :Atração +STR_0014 :Launched Freefall +STR_0015 :Bobsleigh Coaster +STR_0016 :Observation Tower STR_0017 :Looping Roller Coaster -STR_0018 :Atração -STR_0019 :Atração +STR_0018 :Dinghy Slide +STR_0019 :Mine Train Coaster STR_0020 :Teleférico -STR_0021 :Atração -STR_0022 :Atração -STR_0023 :Atração -STR_0024 :Atração -STR_0025 :Atração -STR_0026 :Atração -STR_0027 :Atração -STR_0028 :Atração -STR_0029 :Atração -STR_0030 :Barraca -STR_0031 :Barraca -STR_0032 :Barraca -STR_0033 :Barraca -STR_0034 :Barraca -STR_0035 :Atração -STR_0036 :Barraca +STR_0021 :Corkscrew Roller Coaster +STR_0022 :Maze +STR_0023 :Spiral Slide +STR_0024 :Go Karts +STR_0025 :Log Flume +STR_0026 :River Rapids +STR_0027 :Dodgems +STR_0028 :Pirate Ship +STR_0029 :Swinging Inverter Ship +STR_0030 :Food Stall +STR_0031 :Unknown Stall (1D) +STR_0032 :Drink Stall +STR_0033 :Unknown Stall (1F) +STR_0034 :Shop +STR_0035 :Merry-Go-Round +STR_0036 :Unknown Stall (22) STR_0037 :Quiosque STR_0038 :Banheiro -STR_0039 :Atração -STR_0040 :Atração -STR_0041 :Atração -STR_0042 :Atração -STR_0043 :Atração +STR_0039 :Ferris Wheel +STR_0040 :Motion Simulator +STR_0041 :3D Cinema +STR_0042 :Top Spin +STR_0043 :Space Rings STR_0044 :Reverse Freefall Coaster STR_0045 :Elevador -STR_0046 :Atração -STR_0047 :Atração -STR_0048 :Atração -STR_0049 :Atração -STR_0050 :Atração -STR_0051 :Atração -STR_0052 :Atração +STR_0046 :Vertical Drop Roller Coaster +STR_0047 :Cash Machine +STR_0048 :Twist +STR_0049 :Haunted House +STR_0050 :First Aid Room +STR_0051 :Circus Show +STR_0052 :Ghost Train STR_0053 :Hyper-Twister Roller Coaster STR_0054 :Wooden Roller Coaster STR_0055 :Side-Friction Roller Coaster STR_0056 :Wild Mouse STR_0057 :Multi-Dimension Roller Coaster -STR_0058 :Atração +STR_0058 :Unknown Ride (38) STR_0059 :Aerial Inverted Roller Coaster -STR_0060 :Atração -STR_0061 :Atração -STR_0062 :Atração -STR_0063 :Atração -STR_0064 :Atração +STR_0060 :Unknown Ride (3A) +STR_0061 :Virginia Reel +STR_0062 :Splash Boats +STR_0063 :Mini Helicopters +STR_0064 :Lay-down Roller Coaster STR_0065 :Monotrilho Suspenso -STR_0066 :Atração -STR_0067 :Atração +STR_0066 :Unknown Ride (40) +STR_0067 :Reverser Roller Coaster STR_0068 :Heartline Twister Coaster -STR_0069 :Atração -STR_0070 :Atração -STR_0071 :Atração -STR_0072 :Atração -STR_0073 :Atração -STR_0074 :Atração -STR_0075 :Atração +STR_0069 :Mini Golf +STR_0070 :Giga Coaster +STR_0071 :Roto-Drop +STR_0072 :Flying Saucers +STR_0073 :Crooked House +STR_0074 :Monorail Cycles +STR_0075 :Compact Inverted Coaster STR_0076 :Montanha-Russa D'água -STR_0077 :Atração -STR_0078 :Atração -STR_0079 :Atração -STR_0080 :Atração -STR_0081 :Atração -STR_0082 :Atração -STR_0083 :Atração -STR_0084 :Atração -STR_0085 :Atração -STR_0086 :Atração -STR_0087 :Atração -STR_0088 :Atração +STR_0077 :Air Powered Vertical Coaster +STR_0078 :Inverted Hairpin Coaster +STR_0079 :Magic Carpet +STR_0080 :Submarine Ride +STR_0081 :River Rafts +STR_0082 :Unknown Ride (50) +STR_0083 :Enterprise +STR_0084 :Unknown Ride (52) +STR_0085 :Unknown Ride (53) +STR_0086 :Unknown Ride (54) +STR_0087 :Unknown Ride (55) +STR_0088 :Inverted Impulse Coaster STR_0089 :Mini Montanha-Russa -STR_0090 :Atração -STR_0091 :Atração -STR_0092 :Atração +STR_0090 :Mine Ride +STR_0091 :Unknown Ride (59) +STR_0092 :LIM Launched Roller Coaster STR_0093 : STR_0094 : STR_0095 : @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 : -STR_0513 : -STR_0514 :Montanha-Russa com trens suspensos que balançam para os lados nas curvas -STR_0515 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :A looping roller coaster where the riders ride in a standing position +STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track STR_0518 :Passengers travel in electric trains along a monorail track STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners -STR_0520 : -STR_0521 : -STR_0522 : +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them STR_0523 :Riders travel slowly in powered vehicles along a track-based route -STR_0524 : -STR_0525 : -STR_0526 : +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops -STR_0528 : -STR_0529 : +STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again -STR_0531 : +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_0532 : STR_0533 : -STR_0534 : -STR_0535 : -STR_0536 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids STR_0537 : STR_0538 : STR_0539 : @@ -556,14 +556,14 @@ STR_0551 : STR_0552 : STR_0553 : STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station -STR_0555 : -STR_0556 : +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity @@ -572,38 +572,38 @@ STR_0567 :Sitting in seats suspended either side of the track, riders are pit STR_0568 : STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air STR_0570 : -STR_0571 : -STR_0572 : -STR_0573 : -STR_0574 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground STR_0575 :Powered trains hanging from a single rail transport people around the park STR_0576 : -STR_0577 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists STR_0579 : -STR_0580 : -STR_0581 : +STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes STR_0582 : STR_0583 : -STR_0584 : -STR_0585 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections -STR_0587 : -STR_0588 : +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops STR_0589 : -STR_0590 : -STR_0591 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 : -STR_0599 :Montanha-russa compacta com os carros individuais e suaves quedas inclinadas* -STR_0600 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track +STR_0599 :A compact roller coaster with individual cars and smooth twisting drops +STR_0600 :Powered mine trains career along a smooth and twisted track layout STR_0601 : -STR_0602 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions STR_0603 :Visitante {INT32} STR_0604 :Visitante {INT32} STR_0605 :Visitante {INT32} @@ -839,16 +839,17 @@ STR_0834 :{SMALLFONT}{BLACK}Opções de disco e jogo STR_0835 :Inicialização do jogo falhou STR_0836 :Impossível iniciar o jogo minimizado STR_0837 :Impossível inicializar o sistema de gráficos -STR_0838 :Código da chave {INT32} não é válido para o seu CD do RollerCoaster Tycoon 2!{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Por favor, desinstalar o RollerCoaster Tycoon 2% e reinstalar com o código da chave correta. +STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -STR_0841 :Janela da área de trabalho -STR_0842 :640x480 tela cheia -STR_0843 :800x600 tela cheia -STR_0844 :1024x768 tela cheia -STR_0845 :1152x864 tela cheia -STR_0846 :1280x1024 tela cheia -STR_0847 :Sobre 'RollerCoaster Tycoon 2' +# The following six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :Sobre 'OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}Versão 2.01.028 STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, Todos os Direitos Reservados @@ -1044,10 +1045,10 @@ STR_1039 :Install new track design STR_1040 :Salvar Jogo STR_1041 :Salvar Cenário STR_1042 :Save Landscape -STR_1043 :RollerCoaster Tycoon 2 Jogo Salvo -STR_1044 :RollerCoaster Tycoon 2 Arquivo de Cenário -STR_1045 :RollerCoaster Tycoon 2 Landscape File -STR_1046 :RollerCoaster Tycoon 2 Arquivo de Projeto da Pista +STR_1043 :OpenRCT2 Jogo Salvo +STR_1044 :OpenRCT2 Arquivo de Cenário +STR_1045 :OpenRCT2 Landscape File +STR_1046 :OpenRCT2 Arquivo de Projeto da Pista STR_1047 :Salvar o jogo falhou! STR_1048 :Salvar o cenário falhou! STR_1049 :Landscape save failed! @@ -1065,7 +1066,7 @@ STR_1060 :Inválido nome para a atração STR_1061 :Modo normal STR_1062 :Modo de circuito contínuo STR_1063 :Reverse-Incline launched shuttle mode -STR_1064 :Lançamento alimentado* +STR_1064 :Lançamento alimentado* (passing station) STR_1065 :Shuttle mode STR_1066 :Boat hire mode STR_1067 :Upward launch @@ -1097,19 +1098,19 @@ STR_1092 :Downward launch STR_1093 :Crooked house mode STR_1094 :Freefall drop mode STR_1095 :Continuous circuit block sectioned mode -STR_1096 :Powered launch +STR_1096 :Powered launch (without passing station) STR_1097 :Powered launch block sectioned mode STR_1098 :Moving to end of {POP16}{STRINGID} STR_1099 :Waiting for passengers at {POP16}{STRINGID} STR_1100 :Waiting to depart {POP16}{STRINGID} STR_1101 :Departing {POP16}{STRINGID} -STR_1102 :Traveling at {VELOCITY} +STR_1102 :Travelling at {VELOCITY} STR_1103 :Arriving at {POP16}{STRINGID} STR_1104 :Unloading passengers at {POP16}{STRINGID} -STR_1105 :Traveling at {VELOCITY} +STR_1105 :Travelling at {VELOCITY} STR_1106 :Falhando! STR_1107 :Quebrado! -STR_1108 :Traveling at {VELOCITY} +STR_1108 :Travelling at {VELOCITY} STR_1109 :Balançando STR_1110 :Rotacionando STR_1111 :Rotacionando @@ -1121,7 +1122,7 @@ STR_1116 :Operando STR_1117 :Doing circus show STR_1118 :Operando STR_1119 :Waiting for cable lift -STR_1120 :Traveling at {VELOCITY} +STR_1120 :Travelling at {VELOCITY} STR_1121 :Terminando STR_1122 :Aguardando passageiros STR_1123 :Aguardando para iniciar @@ -1216,8 +1217,8 @@ STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time: STR_1212 :{WINDOW_COLOUR_2}Maximum waiting time: STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing -STR_1215 :{WINDOW_COLOUR_2}Synchronize with adjacent stations -STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronize departure with all adjacent stations (for 'racing') +STR_1215 :{WINDOW_COLOUR_2}Synchronise with adjacent stations +STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronise departure with all adjacent stations (for 'racing') STR_1217 :{COMMA16} seconds STR_1218 :{BLACK}{SMALLUP} STR_1219 :{BLACK}{SMALLDOWN} @@ -1397,7 +1398,7 @@ STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options STR_1394 :{SMALLFONT}{BLACK}Operating options STR_1395 :{SMALLFONT}{BLACK}Maintenance options -STR_1396 :{SMALLFONT}{BLACK}Color scheme options +STR_1396 :{SMALLFONT}{BLACK}Colour scheme options STR_1397 :{SMALLFONT}{BLACK}Sound & music options STR_1398 :{SMALLFONT}{BLACK}Measurements and test data STR_1399 :{SMALLFONT}{BLACK}Graphs @@ -1526,9 +1527,9 @@ STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} -STR_1525 :{SMALLFONT}{OPENQUOTES}These fries from {STRINGID} are really good value{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} -STR_1527 :{SMALLFONT}{OPENQUOTES}This cotton candy from {STRINGID} is really good value{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} STR_1528 : STR_1529 : STR_1530 : @@ -1538,9 +1539,9 @@ STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} -STR_1537 :{SMALLFONT}{OPENQUOTES}This candy apple from {STRINGID} is really good value{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}This toffee apple from {STRINGID} is really good value{ENDQUOTES} STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} -STR_1539 :{SMALLFONT}{OPENQUOTES}This donut from {STRINGID} is really good value{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}This doughnut from {STRINGID} is really good value{ENDQUOTES} STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} STR_1541 : STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} @@ -1560,9 +1561,9 @@ STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride phot STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} -STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fries from {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} -STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for cotton candy from {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} STR_1562 : STR_1563 : STR_1564 : @@ -1572,9 +1573,9 @@ STR_1567 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for popcorn from {S STR_1568 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hot dog from {STRINGID}{ENDQUOTES} STR_1569 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for tentacle from {STRINGID}{ENDQUOTES} STR_1570 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hat from {STRINGID}{ENDQUOTES} -STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a candy apple from {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a toffee apple from {STRINGID}{ENDQUOTES} STR_1572 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a T-shirt from {STRINGID}{ENDQUOTES} -STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a donut from {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a doughnut from {STRINGID}{ENDQUOTES} STR_1574 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for coffee from {STRINGID}{ENDQUOTES} STR_1575 : STR_1576 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried chicken from {STRINGID}{ENDQUOTES} @@ -1754,7 +1755,7 @@ STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DUR STR_1750 :{DURATION} STR_1751 :Can't change time limit for ride... STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park -STR_1753 :{SMALLFONT}{BLACK}Show summarized list of guests in park +STR_1753 :{SMALLFONT}{BLACK}Show summarised list of guests in park STR_1754 :{BLACK}{COMMA16} visitantes STR_1755 :{BLACK}{COMMA16} visitante STR_1756 :{WINDOW_COLOUR_2}Preço de entrada: @@ -1778,7 +1779,7 @@ STR_1773 :Only one on-ride photo section allowed per ride STR_1774 :Only one cable lift hill allowed per ride STR_1775 :Desligado STR_1776 :Ligado -STR_1777 :{WINDOW_COLOUR_2}Música: +STR_1777 :{WINDOW_COLOUR_2}Música STR_1778 :{STRINGID} - - STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Fantasia de panda STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Fantasia de tigre @@ -1874,8 +1875,8 @@ STR_1869 :{WINDOW_COLOUR_2}Número de rotações: STR_1870 :{SMALLFONT}{BLACK}Número de rotações completas STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1872 :{COMMA16} -STR_1873 :{WINDOW_COLOUR_2}Rendimento: {BLACK}{CURRENCY} por hora -STR_1874 :{WINDOW_COLOUR_2}Lucro: {BLACK}{CURRENCY} por hora +STR_1873 :{WINDOW_COLOUR_2}Rendimento: {BLACK}{CURRENCY2DP} por hora +STR_1874 :{WINDOW_COLOUR_2}Lucro: {BLACK}{CURRENCY2DP} por hora STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspecionar Atrações STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Consertar Atrações @@ -1968,9 +1969,9 @@ STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: STR_1964 :{WINDOW_COLOUR_2}Umbrella price: STR_1965 :{WINDOW_COLOUR_2}Drink price: STR_1966 :{WINDOW_COLOUR_2}Burger price: -STR_1967 :{WINDOW_COLOUR_2}Fries price: +STR_1967 :{WINDOW_COLOUR_2}Chips price: STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: -STR_1969 :{WINDOW_COLOUR_2}Cotton Candy price: +STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: STR_1970 :{WINDOW_COLOUR_2} STR_1971 :{WINDOW_COLOUR_2} STR_1972 :{WINDOW_COLOUR_2} @@ -1980,9 +1981,9 @@ STR_1975 :{WINDOW_COLOUR_2}Popcorn price: STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: STR_1977 :{WINDOW_COLOUR_2}Tentacle price: STR_1978 :{WINDOW_COLOUR_2}Hat price: -STR_1979 :{WINDOW_COLOUR_2}Candy Apple price: +STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: -STR_1981 :{WINDOW_COLOUR_2}Donut price: +STR_1981 :{WINDOW_COLOUR_2}Doughnut price: STR_1982 :{WINDOW_COLOUR_2}Coffee price: STR_1983 :{WINDOW_COLOUR_2} STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: @@ -2318,10 +2319,10 @@ STR_2313 :{WINDOW_COLOUR_2}Classificação de náuseas: {BLACK}{COMMA2DP32} ( STR_2314 :{WINDOW_COLOUR_2}Comprimento da atração: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}Custo: {BLACK}em torno de {CURRENCY} STR_2316 :{WINDOW_COLOUR_2}Espaço necessário: {BLACK}{COMMA16} x {COMMA16} blocos -STR_2317 :{WINDOW_COLOUR_2}Qualidade do Som: -STR_2318 :Baixo -STR_2319 :Médio -STR_2320 :Alto +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} @@ -2342,7 +2343,7 @@ STR_2337 :Deutschmark (DM) STR_2338 :Yen ({YEN}) STR_2339 :Peseta (Pts) STR_2340 :Lira (L) -STR_2341 :Guilders (Dfl.) +STR_2341 :Guilders (fl.) STR_2342 :Krona (kr) STR_2343 :Euros ({EURO}) STR_2344 :Imperial @@ -2438,12 +2439,12 @@ STR_2433 :{BLACK}Cupões de graça{STRINGID} STR_2434 :{BLACK}Campanha publicitária para {STRINGID} STR_2435 :{BLACK}Campanha publicitária para {STRINGID} STR_2436 :1 semana -STR_2437 :2 semanas -STR_2438 :3 semanas -STR_2439 :4 semanas -STR_2440 :5 semanas -STR_2441 :6 semanas -STR_2442 :{BLACK}({STRINGID} restante*) +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : +STR_2442 : STR_2443 :{WINDOW_COLOUR_2}Custo por semana: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Custo total: {BLACK}{CURRENCY2DP} STR_2445 :Comece esta campanha de marketing @@ -2500,7 +2501,7 @@ STR_2495 :Cancel construction mode STR_2496 :Pause game STR_2497 :Zoom view out STR_2498 :Zoom view in -STR_2499 :Rotate view +STR_2499 :Rotate view clockwise STR_2500 :Rotate construction object STR_2501 :Underground view toggle STR_2502 :Remove base land toggle @@ -2681,11 +2682,11 @@ STR_2676 :??? STR_2677 :??? STR_2678 :??? STR_2679 :??? -STR_2680 :??? -STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 -STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry -STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max -STR_2684 :{MEDIUMFONT}{BLACK}Large group of peeps arrive +STR_2680 :All research complete +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2682 : +STR_2683 : +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive STR_2685 :Parâmetros de ruído simples STR_2686 :{WINDOW_COLOUR_2}Baixo: STR_2687 :{WINDOW_COLOUR_2}Alto: @@ -2762,11 +2763,11 @@ STR_2756 :Remover vomitos STR_2757 :Forçar Sol STR_2758 :Forçar Chuva STR_2759 :Zero Clearance -STR_2760 :+5K de Dinheiro -STR_2761 :Pagar por Entrada -STR_2762 :Pagar por Atração +STR_2760 :+{CURRENCY} +STR_2761 : +STR_2762 : STR_2763 :??? -STR_2764 :Visitantes Felizes +STR_2764 : STR_2765 :Leva de Visitantes* STR_2766 :??? STR_2767 :Congelar Clima @@ -2784,7 +2785,7 @@ STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} STR_2779 :Viewport #{COMMA16} STR_2780 :Extra viewport # End of new strings -STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :Change keyboard shortcut @@ -2809,12 +2810,12 @@ STR_2802 :Map STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map STR_2805 :{SMALLFONT}{BLACK}Show map of park -STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your Faz-Tudo are and consider organizing them better -STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your Faz-Tudo are and consider organizing them better -STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better +STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your Faz-Tudo are and consider organising them better +STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your Faz-Tudo are and consider organising them better +STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organising them better STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks -STR_2811 :{RED}Guests are complaining because they can't find the restrooms in your park +STR_2811 :{RED}Guests are complaining because they can't find the toilets in your park STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests STR_2814 :{WINDOW_COLOUR_2}O maior prêmio de parque desarrumado @@ -2862,7 +2863,7 @@ STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Constru STR_2856 :{WINDOW_COLOUR_2}Tutorial STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) STR_2858 :Can't start marketing campaign... -STR_2859 :Another instance of RollerCoaster Tycoon 2 is already running +STR_2859 :Another instance of OpenRCT2 is already running STR_2860 :Infogrames Interactive credits... STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. STR_2862 :Music acknowledgements... @@ -2972,14 +2973,14 @@ STR_2965 :{WINDOW_COLOUR_2} STR_2966 : STR_2967 : STR_2968 : -STR_2969 :Use of this product is subject to the terms of a license agreement -STR_2970 :found in the product's {OPENQUOTES}ReadMe{ENDQUOTES} file and in the manual -STR_2971 :Main color scheme -STR_2972 :Alternative color scheme 1 -STR_2973 :Alternative color scheme 2 -STR_2974 :Alternative color scheme 3 -STR_2975 :{SMALLFONT}{BLACK}Select which color scheme to change, or paint ride with -STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected color scheme +STR_2969 : +STR_2970 : +STR_2971 :Main colour scheme +STR_2972 :Alternative colour scheme 1 +STR_2973 :Alternative colour scheme 2 +STR_2974 :Alternative colour scheme 3 +STR_2975 :{SMALLFONT}{BLACK}Select which colour scheme to change, or paint ride with +STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected colour scheme STR_2977 :Staff member name STR_2978 :Enter new name for this member of staff: STR_2979 :Can't name staff member... @@ -2992,8 +2993,8 @@ STR_2985 :Banner STR_2986 :{SMALLFONT}{BLACK}Change text on banner STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for guests STR_2988 :{SMALLFONT}{BLACK}Demolish this banner -STR_2989 :{SMALLFONT}{BLACK}Select main color -STR_2990 :{SMALLFONT}{BLACK}Select text color +STR_2989 :{SMALLFONT}{BLACK}Select main colour +STR_2990 :{SMALLFONT}{BLACK}Select text colour STR_2991 :Sign STR_2992 :Sign text STR_2993 :Enter new text for this sign: @@ -3084,7 +3085,7 @@ STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! STR_3078 :Plain entrance STR_3079 :Wooden entrance STR_3080 :Canvas tent entrance -STR_3081 :Castle entrance (gray) +STR_3081 :Castle entrance (grey) STR_3082 :Castle entrance (brown) STR_3083 :Jungle entrance STR_3084 :Log cabin entrance @@ -3096,16 +3097,16 @@ STR_3089 :Space entrance STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station STR_3091 :You are not allowed to remove this section! STR_3092 :You are not allowed to move or modify the station for this ride! -STR_3093 :{WINDOW_COLOUR_2}Favorite: {BLACK}{STRINGID} +STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} STR_3094 :N/A STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed STR_3098 :Can't change lift hill speed... -STR_3099 :{SMALLFONT}{BLACK}Select color -STR_3100 :{SMALLFONT}{BLACK}Select second color -STR_3101 :{SMALLFONT}{BLACK}Select third color -STR_3102 :{SMALLFONT}{BLACK}Re-paint colored scenery on landscape +STR_3099 :{SMALLFONT}{BLACK}Select colour +STR_3100 :{SMALLFONT}{BLACK}Select second colour +STR_3101 :{SMALLFONT}{BLACK}Select third coluor +STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape STR_3103 :Can't re-paint this... STR_3104 :{SMALLFONT}{BLACK}List rides STR_3105 :{SMALLFONT}{BLACK}List shops and stalls @@ -3125,8 +3126,8 @@ STR_3118 :{BLACK}{STRINGID} is heading for the ride STR_3119 :{BLACK}{STRINGID} is fixing the ride STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy -STR_3122 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guest -STR_3123 :{WINDOW_COLOUR_2}Favorite ride of: {BLACK}{COMMA16} guests +STR_3122 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guest +STR_3123 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guests STR_3124 :Broken {STRINGID} STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% @@ -3163,8 +3164,8 @@ STR_3156 : STR_3157 :mapa STR_3158 :gráfico STR_3159 :lista -STR_3160 :RollerCoaster Tycoon 2: Starting for the first time... -STR_3161 :RollerCoaster Tycoon 2: Checking object files... +STR_3160 : +STR_3161 : STR_3162 :Unable to allocate enough memory STR_3163 :Installing new data: STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) @@ -3175,7 +3176,7 @@ STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} STR_3169 :Data for the following object not found: STR_3170 :Not enough space for graphics STR_3171 :Too many objects of this type selected -STR_3172 :The following object must be selected first: +STR_3172 :The following object must be selected first: {STRING} STR_3173 :This object is currently in use STR_3174 :This object is required by another object STR_3175 :This object is always required @@ -3340,7 +3341,7 @@ STR_3333 :Export plug-in objects with saved games STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles STR_3336 :Track Designs Manager - Select Ride Type -STR_3337 :Parque Six Flags +STR_3337 : STR_3338 :{BLACK}Custom-designed layout STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout @@ -3365,8 +3366,8 @@ STR_3358 :Can't delete track design... STR_3359 :{BLACK}No track designs of this type STR_3360 :Warning! STR_3361 :Too many track designs of this type - Some will not be listed. -STR_3362 :Forced Software Buffer Mixing -STR_3363 :{SMALLFONT}{BLACK}Select this option to improve performance if the game pauses slightly when sounds start or interference is heard +STR_3362 : +STR_3363 : STR_3364 :Advanced STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups STR_3366 :{BLACK}= Ride @@ -3394,6 +3395,7 @@ STR_3387 :Tutorial de construção de Montanha-Russas STR_3388 :Impossível alterar para o modo selecionado STR_3389 :Impossível selecionar o item adicional de cenário... STR_3390 :Muitos itens selecionados +# Start of tutorial strings. Not used at the moment, so not necessary to translate. STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... @@ -3439,7 +3441,8 @@ STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow two trains to operate more safely on the circuit... STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... -STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customize the ride a bit... +STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... +# End of tutorial strings STR_3437 :{SMALLFONT}{BLACK}Limpar grandes áreas de cenário no terreno* STR_3438 :Impossível remover todos os cenários a partir daqui... STR_3439 :Limpar Cenário @@ -3450,3 +3453,10 @@ STR_3443 :Página 4 STR_3444 :Página 5 STR_3445 :Definir a Área de Patrulha STR_3446 :Cancelar a Área de Patrulha + +#Thousands separator +STR_5151 :. +#Decimal separator +STR_5152 :, + +# Note: as this is an unmaintained language, don't add new strings unless you intend to become the mainainer. diff --git a/data/language/spanish_sp.txt b/data/language/spanish_sp.txt index 9e3b0cbb9c..7905e4f702 100644 --- a/data/language/spanish_sp.txt +++ b/data/language/spanish_sp.txt @@ -3,97 +3,97 @@ # Use # at the beginning of a line to leave a comment. STR_0000 : STR_0001 :{STRINGID} {COMMA16} -STR_0002 :Ride -STR_0003 :Ride +STR_0002 :Spiral Roller Coaster +STR_0003 :Stand-up Roller Coaster STR_0004 :Suspended Swinging Coaster -STR_0005 :Ride +STR_0005 :Inverted Roller Coaster STR_0006 :Junior Roller Coaster STR_0007 :Miniature Railway STR_0008 :Monorail STR_0009 :Mini Suspended Coaster -STR_0010 :Ride -STR_0011 :Ride -STR_0012 :Ride +STR_0010 :Boat Ride +STR_0011 :Wooden Wild Mouse +STR_0012 :Steeplechase STR_0013 :Car Ride -STR_0014 :Ride -STR_0015 :Ride -STR_0016 :Ride +STR_0014 :Launched Freefall +STR_0015 :Bobsleigh Coaster +STR_0016 :Observation Tower STR_0017 :Looping Roller Coaster -STR_0018 :Ride -STR_0019 :Ride +STR_0018 :Dinghy Slide +STR_0019 :Mine Train Coaster STR_0020 :Chairlift -STR_0021 :Ride -STR_0022 :Ride -STR_0023 :Ride -STR_0024 :Ride -STR_0025 :Ride -STR_0026 :Ride -STR_0027 :Ride -STR_0028 :Ride -STR_0029 :Ride -STR_0030 :Stall -STR_0031 :Stall -STR_0032 :Stall -STR_0033 :Stall -STR_0034 :Stall -STR_0035 :Ride -STR_0036 :Stall -STR_0037 :Kiosk -STR_0038 :Restroom -STR_0039 :Ride -STR_0040 :Ride -STR_0041 :Ride -STR_0042 :Ride -STR_0043 :Ride +STR_0021 :Corkscrew Roller Coaster +STR_0022 :Maze +STR_0023 :Spiral Slide +STR_0024 :Go Karts +STR_0025 :Log Flume +STR_0026 :River Rapids +STR_0027 :Dodgems +STR_0028 :Pirate Ship +STR_0029 :Swinging Inverter Ship +STR_0030 :Food Stall +STR_0031 :Unknown Stall (1D) +STR_0032 :Drink Stall +STR_0033 :Unknown Stall (1F) +STR_0034 :Shop +STR_0035 :Merry-Go-Round +STR_0036 :Unknown Stall (22) +STR_0037 :Information Kiosk +STR_0038 :Toilets +STR_0039 :Ferris Wheel +STR_0040 :Motion Simulator +STR_0041 :3D Cinema +STR_0042 :Top Spin +STR_0043 :Space Rings STR_0044 :Reverse Freefall Coaster STR_0045 :Lift -STR_0046 :Ride -STR_0047 :Ride -STR_0048 :Ride -STR_0049 :Ride -STR_0050 :Ride -STR_0051 :Ride -STR_0052 :Ride -STR_0053 :Hyper-Twister Roller Coaster +STR_0046 :Vertical Drop Roller Coaster +STR_0047 :Cash Machine +STR_0048 :Twist +STR_0049 :Haunted House +STR_0050 :First Aid Room +STR_0051 :Circus Show +STR_0052 :Ghost Train +STR_0053 :Steel Twister Roller Coaster STR_0054 :Wooden Roller Coaster STR_0055 :Side-Friction Roller Coaster STR_0056 :Wild Mouse STR_0057 :Multi-Dimension Roller Coaster -STR_0058 :Ride -STR_0059 :Aerial Inverted Roller Coaster -STR_0060 :Ride -STR_0061 :Ride -STR_0062 :Ride -STR_0063 :Ride -STR_0064 :Ride +STR_0058 :Unknown Ride (38) +STR_0059 :Flying Roller Coaster +STR_0060 :Unknown Ride (3A) +STR_0061 :Virginia Reel +STR_0062 :Splash Boats +STR_0063 :Mini Helicopters +STR_0064 :Lay-down Roller Coaster STR_0065 :Suspended Monorail -STR_0066 :Ride -STR_0067 :Ride +STR_0066 :Unknown Ride (40) +STR_0067 :Reverser Roller Coaster STR_0068 :Heartline Twister Coaster -STR_0069 :Ride -STR_0070 :Ride -STR_0071 :Ride -STR_0072 :Ride -STR_0073 :Ride -STR_0074 :Ride -STR_0075 :Ride +STR_0069 :Mini Golf +STR_0070 :Giga Coaster +STR_0071 :Roto-Drop +STR_0072 :Flying Saucers +STR_0073 :Crooked House +STR_0074 :Monorail Cycles +STR_0075 :Compact Inverted Coaster STR_0076 :Water Coaster -STR_0077 :Ride -STR_0078 :Ride -STR_0079 :Ride -STR_0080 :Ride -STR_0081 :Ride -STR_0082 :Ride -STR_0083 :Ride -STR_0084 :Ride -STR_0085 :Ride -STR_0086 :Ride -STR_0087 :Ride -STR_0088 :Ride +STR_0077 :Air Powered Vertical Coaster +STR_0078 :Inverted Hairpin Coaster +STR_0079 :Magic Carpet +STR_0080 :Submarine Ride +STR_0081 :River Rafts +STR_0082 :Unknown Ride (50) +STR_0083 :Enterprise +STR_0084 :Unknown Ride (52) +STR_0085 :Unknown Ride (53) +STR_0086 :Unknown Ride (54) +STR_0087 :Unknown Ride (55) +STR_0088 :Inverted Impulse Coaster STR_0089 :Mini Roller Coaster -STR_0090 :Ride -STR_0091 :Ride -STR_0092 :Ride +STR_0090 :Mine Ride +STR_0091 :Unknown Ride (59) +STR_0092 :LIM Launched Roller Coaster STR_0093 : STR_0094 : STR_0095 : @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 : -STR_0513 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :A looping roller coaster where the riders ride in a standing position STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners -STR_0515 : +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track STR_0518 :Passengers travel in electric trains along a monorail track STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners -STR_0520 : -STR_0521 : -STR_0522 : +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them STR_0523 :Riders travel slowly in powered vehicles along a track-based route -STR_0524 : -STR_0525 : -STR_0526 : +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops -STR_0528 : -STR_0529 : +STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again -STR_0531 : +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_0532 : STR_0533 : -STR_0534 : -STR_0535 : -STR_0536 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids STR_0537 : STR_0538 : STR_0539 : @@ -556,14 +556,14 @@ STR_0551 : STR_0552 : STR_0553 : STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station -STR_0555 : -STR_0556 : +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity @@ -572,38 +572,38 @@ STR_0567 :Sitting in seats suspended either side of the track, riders are pit STR_0568 : STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air STR_0570 : -STR_0571 : -STR_0572 : -STR_0573 : -STR_0574 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground STR_0575 :Powered trains hanging from a single rail transport people around the park STR_0576 : -STR_0577 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists STR_0579 : -STR_0580 : -STR_0581 : +STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes STR_0582 : STR_0583 : -STR_0584 : -STR_0585 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections -STR_0587 : -STR_0588 : +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops STR_0589 : -STR_0590 : -STR_0591 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track STR_0599 :A compact roller coaster with individual cars and smooth twisting drops -STR_0600 : +STR_0600 :Powered mine trains career along a smooth and twisted track layout STR_0601 : -STR_0602 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions STR_0603 :Visitante {INT32} STR_0604 :Visitante {INT32} STR_0605 :Visitante {INT32} @@ -836,19 +836,20 @@ STR_0831 :{SMALLFONT}{BLACK}Zoom view out STR_0832 :{SMALLFONT}{BLACK}Rotate view 90{DEGREE} clockwise STR_0833 :{SMALLFONT}{BLACK}Pause game STR_0834 :{SMALLFONT}{BLACK}Disk and game options -STR_0835 :Game initialization failed +STR_0835 :Game initialisation failed STR_0836 :Unable to start game in a minimised state STR_0837 :Unable to initialise graphics system -STR_0838 :CD key code {INT32} is not valid for your RollerCoaster Tycoon 2 CD !{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Please un-install RollerCoaster Tycoon 2% and re-install with the correct CD Key Code +STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -STR_0841 :Desktop window -STR_0842 :640x480 full screen -STR_0843 :800x600 full screen -STR_0844 :1024x768 full screen -STR_0845 :1152x864 full screen -STR_0846 :1280x1024 full screen -STR_0847 :About 'RollerCoaster Tycoon 2' +# The following six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :About 'OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028 STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, all rights reserved @@ -977,7 +978,7 @@ STR_0972 :Cancelar STR_0973 :OK STR_0974 :Rides STR_0975 :Shops and Stalls -STR_0976 :Restrooms and Information Kiosks +STR_0976 :Toilets and Information Kiosks STR_0977 :New Transport Rides STR_0978 :New Gentle Rides STR_0979 :New Roller Coasters @@ -1044,10 +1045,10 @@ STR_1039 :Install new track design STR_1040 :Save Game STR_1041 :Save Scenario STR_1042 :Save Landscape -STR_1043 :RollerCoaster Tycoon 2 Saved Game -STR_1044 :RollerCoaster Tycoon 2 Scenario File -STR_1045 :RollerCoaster Tycoon 2 Landscape File -STR_1046 :RollerCoaster Tycoon 2 Track Design File +STR_1043 :OpenRCT2 Saved Game +STR_1044 :OpenRCT2 Scenario File +STR_1045 :OpenRCT2 Landscape File +STR_1046 :OpenRCT2 Track Design File STR_1047 :Game save failed! STR_1048 :Scenario save failed! STR_1049 :Landscape save failed! @@ -1526,9 +1527,9 @@ STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} -STR_1525 :{SMALLFONT}{OPENQUOTES}These fries from {STRINGID} are really good value{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} -STR_1527 :{SMALLFONT}{OPENQUOTES}This cotton candy from {STRINGID} is really good value{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} STR_1528 : STR_1529 : STR_1530 : @@ -1560,9 +1561,9 @@ STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride phot STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} -STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fries from {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} -STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for cotton candy from {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} STR_1562 : STR_1563 : STR_1564 : @@ -1781,7 +1782,7 @@ STR_1776 :On STR_1777 :{WINDOW_COLOUR_2}Music STR_1778 :{STRINGID} - - STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume -STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tigre costume +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume @@ -1842,7 +1843,7 @@ STR_1837 :Satisfaction: Unknown STR_1838 :Satisfaction: {COMMA16}% STR_1839 :Reliability: {COMMA16}% STR_1840 :Down-time: {COMMA16}% -STR_1841 :Profit: {CURRENCY} per hour +STR_1841 :Profit: {CURRENCY2DP} per hour STR_1842 :Favourite of: {COMMA16} guest STR_1843 :Favourite of: {COMMA16} guests STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list @@ -1874,8 +1875,8 @@ STR_1869 :{WINDOW_COLOUR_2}Number of rotations: STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1872 :{COMMA16} -STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY} per hour -STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY} per hour +STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY2DP} per hour +STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides @@ -1893,8 +1894,10 @@ STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hou STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride STR_1891 :No {STRINGID} in park yet! -STR_1892 :RollerCoaster Tycoon 2 -STR_1893 :Please insert your RollerCoaster Tycoon 2 CD in the following drive: +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}Build new ride/attraction STR_1896 :{WINDOW_COLOUR_2}Expenditure/Income @@ -1930,7 +1933,7 @@ STR_1925 :Can't place person here... STR_1926 :{SMALLFONT} STR_1927 :{YELLOW}{STRINGID} has broken down STR_1928 :{RED}{STRINGID} has crashed! -STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better +STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organising them better STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this guest - (If tracking is on, guest's movements will be reported in the message area) STR_1931 :{STRINGID} has joined the queue line for {STRINGID} STR_1932 :{STRINGID} is on {STRINGID} @@ -1968,9 +1971,9 @@ STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: STR_1964 :{WINDOW_COLOUR_2}Umbrella price: STR_1965 :{WINDOW_COLOUR_2}Drink price: STR_1966 :{WINDOW_COLOUR_2}Burger price: -STR_1967 :{WINDOW_COLOUR_2}Fries price: +STR_1967 :{WINDOW_COLOUR_2}Chips price: STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: -STR_1969 :{WINDOW_COLOUR_2}Cotton Candy price: +STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: STR_1970 :{WINDOW_COLOUR_2} STR_1971 :{WINDOW_COLOUR_2} STR_1972 :{WINDOW_COLOUR_2} @@ -1980,7 +1983,7 @@ STR_1975 :{WINDOW_COLOUR_2}Popcorn price: STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: STR_1977 :{WINDOW_COLOUR_2}Tentacle price: STR_1978 :{WINDOW_COLOUR_2}Hat price: -STR_1979 :{WINDOW_COLOUR_2}Candy Apple price: +STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: STR_1981 :{WINDOW_COLOUR_2}Doughnut price: STR_1982 :{WINDOW_COLOUR_2}Coffee price: @@ -1996,9 +1999,9 @@ STR_1991 :On-Ride Photo STR_1992 :Umbrella STR_1993 :Drink STR_1994 :Burger -STR_1995 :Fries +STR_1995 :Chips STR_1996 :Ice Cream -STR_1997 :Cotton Candy +STR_1997 :Candyfloss STR_1998 :Empty Can STR_1999 :Rubbish STR_2000 :Empty Burger Box @@ -2008,7 +2011,7 @@ STR_2003 :Popcorn STR_2004 :Hot Dog STR_2005 :Tentacle STR_2006 :Hat -STR_2007 :Candy Apple +STR_2007 :Toffee Apple STR_2008 :T-Shirt STR_2009 :Doughnut STR_2010 :Coffee @@ -2024,9 +2027,9 @@ STR_2019 :On-Ride Photos STR_2020 :Umbrellas STR_2021 :Drinks STR_2022 :Burgers -STR_2023 :Fries +STR_2023 :Chips STR_2024 :Ice Creams -STR_2025 :Cotton Candy +STR_2025 :Candyfloss STR_2026 :Empty Cans STR_2027 :Rubbish STR_2028 :Empty Burger Boxes @@ -2036,7 +2039,7 @@ STR_2031 :Popcorn STR_2032 :Hot Dogs STR_2033 :Tentacles STR_2034 :Hats -STR_2035 :Candy Apples +STR_2035 :Toffee Apples STR_2036 :T-Shirts STR_2037 :Doughnuts STR_2038 :Coffees @@ -2052,9 +2055,9 @@ STR_2047 :an On-Ride Photo STR_2048 :an Umbrella STR_2049 :a Drink STR_2050 :a Burger -STR_2051 :some Fries +STR_2051 :some Chips STR_2052 :an Ice Cream -STR_2053 :some Cotton Candy +STR_2053 :some Candyfloss STR_2054 :an Empty Can STR_2055 :some Rubbish STR_2056 :an Empty Burger Box @@ -2064,7 +2067,7 @@ STR_2059 :some Popcorn STR_2060 :a Hot Dog STR_2061 :a Tentacle STR_2062 :a Hat -STR_2063 :a Candy Apple +STR_2063 :a Toffee Apple STR_2064 :a T-Shirt STR_2065 :a Doughnut STR_2066 :a Coffee @@ -2080,9 +2083,9 @@ STR_2075 :On-Ride Photo of {STRINGID} STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Umbrella STR_2077 :Drink STR_2078 :Burger -STR_2079 :Fries +STR_2079 :Chips STR_2080 :Ice Cream -STR_2081 :Cotton Candy +STR_2081 :Candyfloss STR_2082 :Empty Can STR_2083 :Rubbish STR_2084 :Empty Burger Box @@ -2092,7 +2095,7 @@ STR_2087 :Popcorn STR_2088 :Hot Dog STR_2089 :Tentacle STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hat -STR_2091 :Candy Apple +STR_2091 :Toffee Apple STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-Shirt STR_2093 :Doughnut STR_2094 :Coffee @@ -2318,10 +2321,10 @@ STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) STR_2314 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks -STR_2317 :{WINDOW_COLOUR_2}Sound Quality: -STR_2318 :Low -STR_2319 :Medium -STR_2320 :High +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} @@ -2438,12 +2441,12 @@ STR_2433 :{BLACK}Vouchers for free {STRINGID} STR_2434 :{BLACK}Advertising campaign for {STRINGID} STR_2435 :{BLACK}Advertising campaign for {STRINGID} STR_2436 :1 week -STR_2437 :2 weeks -STR_2438 :3 weeks -STR_2439 :4 weeks -STR_2440 :5 weeks -STR_2441 :6 weeks -STR_2442 :{BLACK}({STRINGID} remaining) +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : +STR_2442 : STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} STR_2445 :Start this marketing campaign @@ -2500,7 +2503,7 @@ STR_2495 :Cancelar construction mode STR_2496 :Pause game STR_2497 :Zoom view out STR_2498 :Zoom view in -STR_2499 :Rotate view +STR_2499 :Rotate view clockwise STR_2500 :Rotate construction object STR_2501 :Underground view toggle STR_2502 :Remove base land toggle @@ -2682,10 +2685,10 @@ STR_2677 :??? STR_2678 :??? STR_2679 :??? STR_2680 :All research complete -STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 -STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry -STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max -STR_2684 :{MEDIUMFONT}{BLACK}Large group of peeps arrive +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2682 : +STR_2683 : +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive STR_2685 :Simplex Noise Parameters STR_2686 :{WINDOW_COLOUR_2}Low: STR_2687 :{WINDOW_COLOUR_2}High: @@ -2762,11 +2765,11 @@ STR_2757 :Force Sun STR_2758 :Force Thunder STR_2759 :Zero Clearance # New strings used in the cheats window previously these were ??? -STR_2760 :+5K Money -STR_2761 :Pay For Entrance -STR_2762 :Pay For Rides +STR_2760 :+{CURRENCY} +STR_2761 : +STR_2762 : STR_2763 :??? -STR_2764 :Happy Guests +STR_2764 : STR_2765 :Large Tram STR_2766 :Win scenario STR_2767 :Freeze Climate @@ -2784,7 +2787,7 @@ STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} # End of new strings STR_2779 :Viewport #{COMMA16} STR_2780 :Extra viewport -STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :Change keyboard shortcut @@ -2809,12 +2812,12 @@ STR_2802 :Map STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map STR_2805 :{SMALLFONT}{BLACK}Show map of park -STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organizing them better -STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organizing them better -STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organizing them better +STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organising them better STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks -STR_2811 :{RED}Guests are complaining because they can't find the restrooms in your park +STR_2811 :{RED}Guests are complaining because they can't find the toilets in your park STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests STR_2814 :{WINDOW_COLOUR_2}Most untidy park award @@ -2827,7 +2830,7 @@ STR_2820 :{WINDOW_COLOUR_2}Safest park award STR_2821 :{WINDOW_COLOUR_2}Best staff award STR_2822 :{WINDOW_COLOUR_2}Best park food award STR_2823 :{WINDOW_COLOUR_2}Worst park food award -STR_2824 :{WINDOW_COLOUR_2}Best park restrooms award +STR_2824 :{WINDOW_COLOUR_2}Best park toilets award STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award STR_2826 :{WINDOW_COLOUR_2}Best water rides award STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award @@ -2844,7 +2847,7 @@ STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park i STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! -STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best restroom facilities in the country'! +STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best toilet facilities in the country'! STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water rides in the country'! STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed rides'! @@ -2862,7 +2865,7 @@ STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Constru STR_2856 :{WINDOW_COLOUR_2}Tutorial STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) STR_2858 :Can't start marketing campaign... -STR_2859 :Another instance of RollerCoaster Tycoon 2 is already running +STR_2859 :Another instance of OpenRCT is already running STR_2860 :Infogrames Interactive credits... STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. STR_2862 :Music acknowledgements... @@ -2972,8 +2975,8 @@ STR_2965 :{WINDOW_COLOUR_2} STR_2966 : STR_2967 : STR_2968 : -STR_2969 :Use of this product is subject to the terms of a licence agreement -STR_2970 :found in the product's {OPENQUOTES}ReadMe{ENDQUOTES} file and in the manual +STR_2969 : +STR_2970 : STR_2971 :Main colour scheme STR_2972 :Alternative colour scheme 1 STR_2973 :Alternative colour scheme 2 @@ -3163,8 +3166,8 @@ STR_3156 : STR_3157 :map STR_3158 :graph STR_3159 :list -STR_3160 :RollerCoaster Tycoon 2: Starting for the first time... -STR_3161 :RollerCoaster Tycoon 2: Checking object files... +STR_3160 : +STR_3161 : STR_3162 :Unable to allocate enough memory STR_3163 :Installing new data: STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) @@ -3175,7 +3178,7 @@ STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} STR_3169 :Data for the following object not found: STR_3170 :Not enough space for graphics STR_3171 :Too many objects of this type selected -STR_3172 :The following object must be selected first: +STR_3172 :The following object must be selected first: {STRING} STR_3173 :This object is currently in use STR_3174 :This object is required by another object STR_3175 :This object is always required @@ -3340,7 +3343,7 @@ STR_3333 :Export plug-in objects with saved games STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles STR_3336 :Track Designs Manager - Select Ride Type -STR_3337 :Six Flags Park +STR_3337 : STR_3338 :{BLACK}Custom-designed layout STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout @@ -3365,8 +3368,8 @@ STR_3358 :Can't delete track design... STR_3359 :{BLACK}No track designs of this type STR_3360 :Warning! STR_3361 :Too many track designs of this type - Some will not be listed. -STR_3362 :Forced Software Buffer Mixing -STR_3363 :{SMALLFONT}{BLACK}Select this option to improve performance if the game pauses slightly when sounds start or interference is heard +STR_3362 : +STR_3363 : STR_3364 :Advanced STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups STR_3366 :{BLACK}= Ride @@ -3375,8 +3378,8 @@ STR_3368 :{BLACK}= Drink Stall STR_3369 :{BLACK}= Souvenir Stall STR_3370 :{BLACK}= Info. Kiosk STR_3371 :{BLACK}= First Aid -STR_3372 :{BLACK}= A.T.M. -STR_3373 :{BLACK}= Restroom +STR_3372 :{BLACK}= Cash Machine +STR_3373 :{BLACK}= Toilet STR_3374 :Warning: Too many objects selected! STR_3375 :Not all objects in this scenery group could be selected STR_3376 :Install new track design... @@ -3394,6 +3397,7 @@ STR_3387 :Roller Coaster Building Tutorial STR_3388 :Unable to switch to selected mode STR_3389 :Unable to select additional item of scenery... STR_3390 :Too many items selected +# Start of tutorial strings. Not used at the moment, so not necessary to translate. STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... @@ -3440,6 +3444,7 @@ STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... +# End of tutorial strings STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape STR_3438 :Unable to remove all scenery from here... STR_3439 :Clear Scenery @@ -3451,164 +3456,9 @@ STR_3444 :Page 5 STR_3445 :Set Patrol Area STR_3446 :Cancelar Patrol Area -# New strings, cleaner -STR_5120 :Show finances button on toolbar -STR_5121 :Show research button on toolbar -STR_5122 :Show all vehicles sharing a track/ride type -STR_5123 :Renew rides -STR_5124 :No Six Flags -STR_5125 :All destructable -STR_5126 :Random title music -STR_5127 :{SMALLFONT}{BLACK}Disable land elevation -STR_5128 :Selection size -STR_5129 :Enter selection size between {COMMA16} and {COMMA16} -STR_5130 :Map size -STR_5131 :Enter map size between {COMMA16} and {COMMA16} -STR_5132 :Fix all rides -STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights -STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights -STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights -STR_5136 :Land rights -STR_5137 :Allow lift hill and launch speeds{NEWLINE}up to {VELOCITY} -STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} -STR_5139 :{WHITE}{STRINGID} -STR_5140 :Disable brakes failure -STR_5141 :Disable all breakdowns -STR_5142 :Normal Speed -STR_5143 :Quick Speed -STR_5144 :Fast Speed -STR_5145 :Turbo Speed -STR_5146 :Hyper Speed -STR_5147 :Show cheats button on toolbar -STR_5148 :{SMALLFONT}{BLACK}Change the game speed -STR_5149 :{SMALLFONT}{BLACK}Open the cheats window -STR_5150 :Enable debugging tools #Thousands separator STR_5151 :. #Decimal separator STR_5152 :, -STR_5153 :Colour schemes... -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 -STR_5157 :Unlock all prices -STR_5158 :Quit to menu -STR_5159 :Exit OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} -STR_5161 :Date Format: -STR_5162 :Day/Month/Year -STR_5163 :Month/Day/Year -STR_5164 :Twitch Channel name -STR_5165 :Name peeps after followers -STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers -STR_5167 :Track follower peeps -STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after channel's Twitch followers -STR_5169 :Name peeps after people in Twitch chat -STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat -STR_5171 :Track chat peeps -STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after Twitch chat participants -STR_5173 :Pull Twitch chat as news -STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications -STR_5175 :Input the name of your Twitch channel -STR_5176 :Enable Twitch integration -STR_5177 :Fullscreen mode: -STR_5178 :{SMALLFONT}{BLACK}Show financial cheats -STR_5179 :{SMALLFONT}{BLACK}Show guest cheats -STR_5180 :{SMALLFONT}{BLACK}Show park cheats -STR_5181 :{SMALLFONT}{BLACK}Show ride cheats -STR_5182 :{INT32} -STR_5183 :Base height -STR_5184 :Enter base height between {COMMA16} and {COMMA16} -STR_5185 :Water level -STR_5186 :Enter water level between {COMMA16} and {COMMA16} -STR_5187 :Finances -STR_5188 :New Campaign -STR_5189 :Research -STR_5190 :Map -STR_5191 :Viewport -STR_5192 :Recent News -STR_5193 :Land -STR_5194 :Water -STR_5195 :Clear Scenery -STR_5196 :Land Rights -STR_5197 :Scenery -STR_5198 :Footpath -STR_5199 :Ride Construction -STR_5200 :Track Design Place -STR_5201 :New Ride -STR_5202 :Track Design Selection -STR_5203 :Ride -STR_5204 :Ride List -STR_5205 :Guest -STR_5206 :Guest List -STR_5207 :Staff -STR_5208 :Staff List -STR_5209 :Banner -STR_5210 :Object Selection -STR_5211 :Invention List -STR_5212 :Scenario Options -STR_5213 :Objective Options -STR_5214 :Map Generation -STR_5215 :Track Design Manager -STR_5216 :Track Design Manager List -STR_5217 :Cheats -STR_5218 :Themes -STR_5219 :Options -STR_5220 :Keyboard Shortcuts -STR_5221 :Change Keyboard Shortcut -STR_5222 :Load/Save -STR_5223 :Save Prompt -STR_5224 :Demolish Ride Prompt -STR_5225 :Fire Staff Prompt -STR_5226 :Track Delete Prompt -STR_5227 :Save Overwrite Prompt -STR_5228 :{SMALLFONT}{BLACK}Main UI -STR_5229 :{SMALLFONT}{BLACK}Park -STR_5230 :{SMALLFONT}{BLACK}Tools -STR_5231 :{SMALLFONT}{BLACK}Rides and Peeps -STR_5232 :{SMALLFONT}{BLACK}Editors -STR_5233 :{SMALLFONT}{BLACK}Miscellaneous -STR_5234 :{SMALLFONT}{BLACK}Prompts -STR_5235 :{SMALLFONT}{BLACK}Settings -STR_5236 :Window: -STR_5237 :Palette: -STR_5238 :Current Theme: -STR_5239 :Duplicate -STR_5240 :Enter a name for the theme -STR_5241 :Can't change this theme -STR_5242 :Theme name already exists -STR_5243 :Invalid characters used -STR_5244 :Themes -STR_5245 :Top Toolbar -STR_5246 :Bottom Toolbar -STR_5247 :Track Editor Bottom Toolbar -STR_5248 :Scenario Editor Bottom Toolbar -STR_5249 :Title Menu Buttons -STR_5250 :Title Exit Button -STR_5251 :Title Options Button -STR_5252 :Title Scenario Selection -STR_5253 :Park Information -STR_5254 :Add nausea -STR_5255 :{MEDIUMFONT}{BLACK}All peeps become nauseous -STR_5256 :Create a new theme to make changes to -STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one -STR_5258 :{SMALLFONT}{BLACK}Delete the current theme -STR_5259 :{SMALLFONT}{BLACK}Rename the current theme -STR_5260 :Giant Screenshot -STR_5261 :Filter -STR_5262 :Wacky Worlds -STR_5263 :Time Twister -STR_5264 :Custom -STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible -STR_5266 :{SMALLFONT}{BLACK}Display -STR_5267 :{SMALLFONT}{BLACK}Culture and Units -STR_5268 :{SMALLFONT}{BLACK}Audio -STR_5269 :{SMALLFONT}{BLACK}Controls -STR_5270 :{SMALLFONT}{BLACK}Miscellaneous -STR_5271 :{SMALLFONT}{BLACK}Twitch -STR_5272 :{SMALLFONT}{BLACK}Small Scenery -STR_5273 :{SMALLFONT}{BLACK}Large Scenery -STR_5274 :{SMALLFONT}{BLACK}Footpaths -STR_5275 :Search for Objects -STR_5276 :Enter the name of an object to search for -STR_5277 :Clear + +# Note: as this is an unmaintained language, don't add new strings unless you intend to become the mainainer. diff --git a/data/language/swedish.txt b/data/language/swedish.txt index 8d581fbd6c..49ff7c287b 100644 --- a/data/language/swedish.txt +++ b/data/language/swedish.txt @@ -3,97 +3,97 @@ # Use # at the beginning of a line to leave a comment. STR_0000 : STR_0001 :{STRINGID} {COMMA16} -STR_0002 :Åktur -STR_0003 :Åktur +STR_0002 :Spiral Roller Coaster +STR_0003 :Stand-up Roller Coaster STR_0004 :Hängande svängande bana -STR_0005 :Åktur +STR_0005 :Inverted Roller Coaster STR_0006 :Junior berg- och dalbana STR_0007 :Miniatyr-tåg STR_0008 :Balkbana STR_0009 :Liten hängande bana -STR_0010 :Åktur -STR_0011 :Åktur -STR_0012 :Åktur +STR_0010 :Boat Ride +STR_0011 :Wooden Wild Mouse +STR_0012 :Steeplechase STR_0013 :Bilåktur -STR_0014 :Åktur -STR_0015 :Åktur -STR_0016 :Åktur +STR_0014 :Launched Freefall +STR_0015 :Bobsleigh Coaster +STR_0016 :Observation Tower STR_0017 :Loopande berg- och dalbana -STR_0018 :Åktur -STR_0019 :Åktur +STR_0018 :Dinghy Slide +STR_0019 :Mine Train Coaster STR_0020 :Stolslift -STR_0021 :Åktur -STR_0022 :Åktur -STR_0023 :Åktur -STR_0024 :Åktur -STR_0025 :Åktur -STR_0026 :Åktur -STR_0027 :Åktur -STR_0028 :Åktur -STR_0029 :Åktur -STR_0030 :Stånd -STR_0031 :Stånd -STR_0032 :Stånd -STR_0033 :Stånd +STR_0021 :Corkscrew Roller Coaster +STR_0022 :Maze +STR_0023 :Spiral Slide +STR_0024 :Go Karts +STR_0025 :Log Flume +STR_0026 :River Rapids +STR_0027 :Dodgems +STR_0028 :Pirate Ship +STR_0029 :Swinging Inverter Ship +STR_0030 :Food Stall +STR_0031 :Unknown Stall (1D) +STR_0032 :Drink Stall +STR_0033 :Unknown Stall (1F) STR_0034 :Stånd -STR_0035 :Åktur -STR_0036 :Stånd +STR_0035 :Merry-Go-Round +STR_0036 :Unknown Stall (22) STR_0037 :Kiosk STR_0038 :Toalett -STR_0039 :Åktur -STR_0040 :Åktur -STR_0041 :Åktur -STR_0042 :Åktur -STR_0043 :Åktur +STR_0039 :Ferris Wheel +STR_0040 :Motion Simulator +STR_0041 :3D Cinema +STR_0042 :Top Spin +STR_0043 :Space Rings STR_0044 :Bakvänd fritt fall-bana STR_0045 :Lift -STR_0046 :Åktur -STR_0047 :Åktur -STR_0048 :Åktur -STR_0049 :Åktur -STR_0050 :Åktur -STR_0051 :Åktur -STR_0052 :Åktur +STR_0046 :Vertical Drop Roller Coaster +STR_0047 :Cash Machine +STR_0048 :Twist +STR_0049 :Haunted House +STR_0050 :First Aid Room +STR_0051 :Circus Show +STR_0052 :Ghost Train STR_0053 :Hyper-snurr berg- och dalbana STR_0054 :Berg- och dalbana i trä STR_0055 :Sidofriktion berg- och dalbana STR_0056 :Vilda Musen STR_0057 :Flerdimensionell berg- och dalbana -STR_0058 :Åktur +STR_0058 :Unknown Ride (38) STR_0059 :Inverterad berg- och dalbana -STR_0060 :Åktur -STR_0061 :Åktur -STR_0062 :Åktur -STR_0063 :Åktur -STR_0064 :Åktur +STR_0060 :Unknown Ride (3A) +STR_0061 :Virginia Reel +STR_0062 :Splash Boats +STR_0063 :Mini Helicopters +STR_0064 :Lay-down Roller Coaster STR_0065 :Hängande balkbana -STR_0066 :Åktur -STR_0067 :Åktur +STR_0066 :Unknown Ride (40) +STR_0067 :Reverser Roller Coaster STR_0068 :Skruvbana -STR_0069 :Åktur -STR_0070 :Åktur -STR_0071 :Åktur -STR_0072 :Åktur -STR_0073 :Åktur -STR_0074 :Åktur -STR_0075 :Åktur +STR_0069 :Mini Golf +STR_0070 :Giga Coaster +STR_0071 :Roto-Drop +STR_0072 :Flying Saucers +STR_0073 :Crooked House +STR_0074 :Monorail Cycles +STR_0075 :Compact Inverted Coaster STR_0076 :Vattenbana -STR_0077 :Åktur -STR_0078 :Åktur -STR_0079 :Åktur -STR_0080 :Åktur -STR_0081 :Åktur -STR_0082 :Åktur -STR_0083 :Åktur -STR_0084 :Åktur -STR_0085 :Åktur -STR_0086 :Åktur -STR_0087 :Åktur -STR_0088 :Åktur +STR_0077 :Air Powered Vertical Coaster +STR_0078 :Inverted Hairpin Coaster +STR_0079 :Magic Carpet +STR_0080 :Submarine Ride +STR_0081 :River Rafts +STR_0082 :Unknown Ride (50) +STR_0083 :Enterprise +STR_0084 :Unknown Ride (52) +STR_0085 :Unknown Ride (53) +STR_0086 :Unknown Ride (54) +STR_0087 :Unknown Ride (55) +STR_0088 :Inverted Impulse Coaster STR_0089 :Mini berg- och dalbana -STR_0090 :Åktur -STR_0091 :Åktur -STR_0092 :Åktur +STR_0090 :Mine Ride +STR_0091 :Unknown Ride (59) +STR_0092 :LIM Launched Roller Coaster STR_0093 : STR_0094 : STR_0095 : @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 : -STR_0513 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :A looping roller coaster where the riders ride in a standing position STR_0514 :Hängande tåg under banan svingar ut åt sidan i svängar -STR_0515 : +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements STR_0516 :En snäll berg- och dalbana för de som inte har mod nog att utmana större åkturer STR_0517 :Passagerare åker i miniatyrtåg på en smal tågräls STR_0518 :Passagerare åker i elektriska tåg på en balkbana STR_0519 :Passagerare åker i små vagnar som hänger under en enkelspårig bana, fritt svingande från sida till sida i svängar -STR_0520 : -STR_0521 : -STR_0522 : +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them STR_0523 :Passagerare åker sakta i motoriserade fordon på en spår-baserad väg -STR_0524 : -STR_0525 : -STR_0526 : +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower STR_0527 :En mjuk berg- och dalbana byggd av stål som kan göra vertikala loopar -STR_0528 : -STR_0529 : +STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track STR_0530 :Vagnar hänger från en stålkabel som kör kontinuerligt från ena sidan åkturen till den andra, och sedan tillbaka igen -STR_0531 : +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_0532 : STR_0533 : -STR_0534 : -STR_0535 : -STR_0536 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids STR_0537 : STR_0538 : STR_0539 : @@ -556,14 +556,14 @@ STR_0551 : STR_0552 : STR_0553 : STR_0554 :Vagnen accelereras ut ur stationen på en platt bana med hjälp av linjärmotorer, sen åker den vertikalt uppåt tills gravitationen tar över och vagnen åker tillbaka till stationen -STR_0555 : -STR_0556 : +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects STR_0563 :Sittandes i bekväma vagnar njuter passagerare av enorma nedförsbackar och spännande svängar, samt mycket tid flygandes över topparna STR_0564 :Den här berg- och dalbanan i trä är snabb, tuff, högljudd, och ger en känsla av att tappa kontrollen. Dessutom spenderar man mycket tid flygandes över topparna STR_0565 :En enkel berg- och dalbana i trä som bara har snälla backar och svängar. Vagnarna hålls på banan med sidofriktion på hjulen och gravitation @@ -572,38 +572,38 @@ STR_0567 :Passagerare sitter i säten på varsin sida av banan och vänds upp STR_0568 : STR_0569 :Hängandes i speciella selar får passagerare känna på känslan av att flyga runt i luften STR_0570 : -STR_0571 : -STR_0572 : -STR_0573 : -STR_0574 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground STR_0575 :Motoriserade tåg som hänger från en enkelspårig bana transporterar folk runt om i parken STR_0576 : -STR_0577 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections STR_0578 :Vagnar åker runt en bana omgiven av ringar utför branta nedförsbackar och skruvar STR_0579 : -STR_0580 : -STR_0581 : +STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes STR_0582 : STR_0583 : -STR_0584 : -STR_0585 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions STR_0586 :Båtformade vagnar åker på berg- och dalbanespår med snurriga svängar och branta nedförsbackar, men plumsar då och då ner i lugna vattensektioner -STR_0587 : -STR_0588 : +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops STR_0589 : -STR_0590 : -STR_0591 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track STR_0599 :En kompakt berg- och dalbana med individuella vagnar och mjuka snurrade nedförsbackar -STR_0600 : +STR_0600 :Powered mine trains career along a smooth and twisted track layout STR_0601 : -STR_0602 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions STR_0603 :Gäst {INT32} STR_0604 :Gäst {INT32} STR_0605 :Gäst {INT32} @@ -839,16 +839,17 @@ STR_0834 :{SMALLFONT}{BLACK}Inställningar STR_0835 :Spelet kunde inte starta STR_0836 :Kan inte starta spelet minimerat STR_0837 :Kan inte initiera grafiksystemet -STR_0838 :CD-nyckeln {INT32} är inte giltig för RollerCoaster Tycoon 2!{WINDOW_COLOUR_1}{WINDOW_COLOUR_1}Var god avinstallera RollerCoaster Tycoon 2% och återinstallera med rätt CD-nyckel +STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} -STR_0841 :Skrivbordsfönster -STR_0842 :640x480 helskärm -STR_0843 :800x600 helskärm -STR_0844 :1024x768 helskärm -STR_0845 :1152x864 helskärm -STR_0846 :1280x1024 helskärm -STR_0847 :Om 'RollerCoaster Tycoon 2' +# The following six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :Om 'OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028 STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, alla rättigheter förbehålls @@ -1044,10 +1045,10 @@ STR_1039 :Installera ny bandesign STR_1040 :Spara Spel STR_1041 :Spara Scenario STR_1042 :Spara Landskap -STR_1043 :RollerCoaster Tycoon 2 Sparat Spel -STR_1044 :RollerCoaster Tycoon 2 Sparat Scenario -STR_1045 :RollerCoaster Tycoon 2 Sparat Landskap -STR_1046 :RollerCoaster Tycoon 2 Sparad Bandesign +STR_1043 :OpenRCT2 Sparat Spel +STR_1044 :OpenRCT2 Sparat Scenario +STR_1045 :OpenRCT2 Sparat Landskap +STR_1046 :OpenRCT2 Sparad Bandesign STR_1047 :Misslyckades med att spara spelet! STR_1048 :Misslyckades med att spara scenario! STR_1049 :Misslyckades med att spara landskap! @@ -1066,7 +1067,7 @@ STR_1061 :Normalt läge STR_1062 :Kontinuerligt banläge #TODO STR_1063 :Reverse-Incline launched shuttle mode -STR_1064 :Accelererad start +STR_1064 :Accelererad start (passing station) STR_1065 :Pendlarläge STR_1066 :Uthyrning STR_1067 :Uppskjut @@ -1098,7 +1099,7 @@ STR_1092 :Nedåtriktad start STR_1093 :Snea huset STR_1094 :Fritt fall STR_1095 :Blockavdelat kontinuerligt banläge -STR_1096 :Motoriserad start +STR_1096 :Motoriserad start (without passing station) STR_1097 :Blockavdelad motoriserad start STR_1098 :Rör sig mot slutet av {POP16}{STRINGID} STR_1099 :Väntar på passagerare vid {POP16}{STRINGID} @@ -1876,8 +1877,8 @@ STR_1869 :{WINDOW_COLOUR_2}Antal rotationer: STR_1870 :{SMALLFONT}{BLACK}Antal hela rotationer STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1872 :{COMMA16} -STR_1873 :{WINDOW_COLOUR_2}Inkomst: {BLACK}{CURRENCY} per timme -STR_1874 :{WINDOW_COLOUR_2}Vinst: {BLACK}{CURRENCY} per timme +STR_1873 :{WINDOW_COLOUR_2}Inkomst: {BLACK}{CURRENCY2DP} per timme +STR_1874 :{WINDOW_COLOUR_2}Vinst: {BLACK}{CURRENCY2DP} per timme STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspektera åkturer STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fixa åkturer @@ -1895,8 +1896,10 @@ STR_1888 :{WINDOW_COLOUR_2}Tid sen senaste inspektion: {BLACK}mer än 4 timma STR_1889 :{WINDOW_COLOUR_2}Dötid: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1890 :{SMALLFONT}{BLACK}Välj hur ofta en mekaniker ska göra underhåll på den här åkturen STR_1891 :Ingen {STRINGID} i parken än! -STR_1892 :RollerCoaster Tycoon 2 -STR_1893 :Var god sätt in din RollerCoaster Tycoon 2-skiva i följande CD-läsare: +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sålde: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}Bygg ny Åktur/attraktion STR_1896 :{WINDOW_COLOUR_2}Utgifter/Inkomster @@ -2320,10 +2323,10 @@ STR_2313 :{WINDOW_COLOUR_2}Illamåendenivå: {BLACK}{COMMA2DP32} (approx.) STR_2314 :{WINDOW_COLOUR_2}Åkturslängd: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}Kostnad: {BLACK}ca {CURRENCY} STR_2316 :{WINDOW_COLOUR_2}Storlek: {BLACK}{COMMA16} x {COMMA16} blocks -STR_2317 :{WINDOW_COLOUR_2}Ljudkvalitet: -STR_2318 :Låg -STR_2319 :Mellan -STR_2320 :Hög +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : STR_2321 :{WINDOW_COLOUR_2}Antal åkturer/attraktioner: {BLACK}{COMMA16} STR_2322 :{WINDOW_COLOUR_2}Personal: {BLACK}{COMMA16} STR_2323 :{WINDOW_COLOUR_2}Parkstorlek: {BLACK}{COMMA32}m{SQUARED} @@ -2440,12 +2443,12 @@ STR_2433 :{BLACK}Kuponger för gratis {STRINGID} STR_2434 :{BLACK}Kampanj för {STRINGID} STR_2435 :{BLACK}Kampanj för {STRINGID} STR_2436 :1 vecka -STR_2437 :2 veckor -STR_2438 :3 veckor -STR_2439 :4 veckor -STR_2440 :5 veckor -STR_2441 :6 veckor -STR_2442 :{BLACK}({STRINGID} återstår) +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : +STR_2442 : STR_2443 :{WINDOW_COLOUR_2}Kostnad per vecka: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Totalkostnad: {BLACK}{CURRENCY2DP} STR_2445 :Starta kampanjen @@ -2684,10 +2687,10 @@ STR_2677 :??? STR_2678 :??? STR_2679 :??? STR_2680 :All research complete -STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by 5,000 -STR_2682 :{MEDIUMFONT}{BLACK}Toggle between Free and Paid Entry -STR_2683 :{MEDIUMFONT}{BLACK}Increases every peeps happiness to max -STR_2684 :{MEDIUMFONT}{BLACK}Large group of peeps arrive +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2682 : +STR_2683 : +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive STR_2685 :Simplex Noise Parameters STR_2686 :{WINDOW_COLOUR_2}Low: STR_2687 :{WINDOW_COLOUR_2}High: @@ -2765,11 +2768,11 @@ STR_2757 :Force Sun STR_2758 :Force Thunder STR_2759 :Zero Clearance # New strings used in the cheats window previously these were ??? -STR_2760 :+5K Pengar -STR_2761 :Betala För Entré -STR_2762 :Betala För Åkturer +STR_2760 :+{CURRENCY} +STR_2761 : +STR_2762 : STR_2763 :??? -STR_2764 :Glada Gäster +STR_2764 : STR_2765 :Stort Tåg STR_2766 :Win scenario STR_2767 :Frys Klimat @@ -2787,7 +2790,7 @@ STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} # End of new strings STR_2779 :Viewport #{COMMA16} STR_2780 :Extra viewport -STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :Ändra snabbtangenter @@ -2867,7 +2870,7 @@ STR_2855 :{RED}{STRINGID} har ingen gångväg från sin utgång !{NEWLINE}Byg STR_2856 :{WINDOW_COLOUR_2}Handledning STR_2857 :{WINDOW_COLOUR_2}(Tryck ner en tangent eller musknapp för att ta kontroll) STR_2858 :Kan inte påbörja kampanj... -STR_2859 :En annan instans av RollerCoaster Tycoon 2 körs redan +STR_2859 :En annan instans av OpenRCT2 körs redan STR_2860 :Om Infogrames Interactive... STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. STR_2862 :Om Musik... @@ -2905,7 +2908,7 @@ STR_2893 :{WINDOW_COLOUR_2}Searchlight Rag: (Scott Joplin/Allister Brimble) STR_2894 :{WINDOW_COLOUR_2}Flight of Fantasy: (Steve Blenkinsopp) copyright {COPYRIGHT} Chris Sawyer STR_2895 :{WINDOW_COLOUR_2}Big Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer STR_2896 :{WINDOW_COLOUR_2}Hypothermia: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2897 :{WINDOW_COLOUR_2}Last Sleigh Åktur: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2897 :{WINDOW_COLOUR_2}Last Sleigh Ride: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer STR_2898 :{WINDOW_COLOUR_2}Pipes of Glencairn: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer STR_2899 :{WINDOW_COLOUR_2}Traffic Jam: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer STR_2900 :{WINDOW_COLOUR_2} @@ -2977,8 +2980,8 @@ STR_2965 :{WINDOW_COLOUR_2} STR_2966 : STR_2967 : STR_2968 : -STR_2969 :Use of this product is subject to the terms of a license agreement -STR_2970 :found in the product's {OPENQUOTES}ReadMe{ENDQUOTES} file and in the manual +STR_2969 : +STR_2970 : STR_2971 :Huvudfärg STR_2972 :Andra färg STR_2973 :Tredje färg @@ -3168,8 +3171,8 @@ STR_3156 : STR_3157 :karta STR_3158 :graf STR_3159 :lista -STR_3160 :RollerCoaster Tycoon 2: Startar för första gången... -STR_3161 :RollerCoaster Tycoon 2: Kollar objektfiler... +STR_3160 : +STR_3161 : STR_3162 :Kan inte allokera nog minne STR_3163 :Installerar ny data: STR_3164 :{BLACK}{COMMA16} valda (av max {COMMA16}) @@ -3345,7 +3348,7 @@ STR_3333 :Exportera plug-in-objekt med sparade spel STR_3334 :{SMALLFONT}{BLACK}Välj om plug-in objekt (extra objekt som inte följer med basspelet) ska sparas i sparade spel och scenarion, vilket låter spelare importera denna data STR_3335 :Berg- och dalbane-designer - Välj Åkturstyp & Fordon STR_3336 :Bandesign-hanterare - Välj Åkturstype -STR_3337 :Six Flags Park +STR_3337 : STR_3338 :{BLACK}Egendesignad layout STR_3339 :{BLACK}{COMMA16} design tillgängliga, eller egendesignad layout STR_3340 :{BLACK}{COMMA16} designer tillgängliga, eller egendesignad layout @@ -3399,6 +3402,7 @@ STR_3387 :Handledning för byggande av Berg- och dalbanor STR_3388 :Kan inte byta till det valda läget STR_3389 :Kan inte markera fler dekorationer... STR_3390 :För många saker markerade +# Start of tutorial strings. Not used at the moment, so not necessary to translate. STR_3391 :{SMALLFONT}{BLACK}Här är vår park - Låt oss titta runt en snabbis... STR_3392 :{SMALLFONT}{BLACK}Det snabbaste sättet att flytta kameran är att hålla ner den HÖGRA musknappen samtidigt som du flyttar musen... STR_3393 :{SMALLFONT}{BLACK}För att se mer av parken kan du zooma ut genom att klicka på ikonen på toppen av skärmen... @@ -3445,6 +3449,7 @@ STR_3433 :{SMALLFONT}{BLACK}Till sist lägger vi till 'blockbromsar', som lå STR_3434 :{SMALLFONT}{BLACK}Nu testar vi åkturen och se om den fungerar! STR_3435 :{SMALLFONT}{BLACK}Fantastiskt - Den fungerade! Dags att lägga till gångväger för att släppa in våra gäster till vår nya berg- och dalbana... STR_3436 :{SMALLFONT}{BLACK}Medans vi väntar på våra första passagerare kan vi modifiera åkturen lite grann... +# End of tutorial strings STR_3437 :{SMALLFONT}{BLACK}Rensa stora områden av dekorationer från terrängen STR_3438 :Kan inte ta bort alla dekorationer härifrån... STR_3439 :Rensa Dekorationer @@ -3455,164 +3460,10 @@ STR_3443 :Sida 4 STR_3444 :Sida 5 STR_3445 :Sätt Patrullområde STR_3446 :Avbryt Patrullområde -# New strings, cleaner -STR_5120 :Show finances button on toolbar -STR_5121 :Show research button on toolbar -STR_5122 :Show all vehicles sharing a track/ride type -STR_5123 :Renew rides -STR_5124 :No Six Flags -STR_5125 :All destructable -STR_5126 :Random title music -STR_5127 :{SMALLFONT}{BLACK}Disable land elevation -STR_5128 :Selection size -STR_5129 :Enter selection size between {COMMA16} and {COMMA16} -STR_5130 :Map size -STR_5131 :Enter map size between {COMMA16} and {COMMA16} -STR_5132 :Fix all rides -STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights -STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights -STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights -STR_5136 :Land rights -STR_5137 :Allow lift hill and launch speeds{NEWLINE}up to {VELOCITY} -STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} -STR_5139 :{WHITE}{STRINGID} -STR_5140 :Disable brakes failure -STR_5141 :Disable all breakdowns -STR_5142 :Normal Speed -STR_5143 :Quick Speed -STR_5144 :Fast Speed -STR_5145 :Turbo Speed -STR_5146 :Hyper Speed -STR_5147 :Show cheats button on toolbar -STR_5148 :{SMALLFONT}{BLACK}Change the game speed -STR_5149 :{SMALLFONT}{BLACK}Open the cheats window -STR_5150 :Enable debugging tools + #Thousands separator STR_5151 : #Decimal separator STR_5152 :, -STR_5153 :Colour schemes... -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 -STR_5157 :Unlock all prices -STR_5158 :Quit to menu -STR_5159 :Exit OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} -STR_5161 :Date Format: -STR_5162 :Day/Month/Year -STR_5163 :Month/Day/Year -STR_5164 :Twitch Channel name -STR_5165 :Name peeps after followers -STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers -STR_5167 :Track follower peeps -STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after channel's Twitch followers -STR_5169 :Name peeps after people in Twitch chat -STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat -STR_5171 :Track chat peeps -STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after Twitch chat participants -STR_5173 :Pull Twitch chat as news -STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications -STR_5175 :Input the name of your Twitch channel -STR_5176 :Enable Twitch integration -STR_5177 :Fullscreen mode: -STR_5178 :{SMALLFONT}{BLACK}Show financial cheats -STR_5179 :{SMALLFONT}{BLACK}Show guest cheats -STR_5180 :{SMALLFONT}{BLACK}Show park cheats -STR_5181 :{SMALLFONT}{BLACK}Show ride cheats -STR_5182 :{INT32} -STR_5183 :Base height -STR_5184 :Enter base height between {COMMA16} and {COMMA16} -STR_5185 :Water level -STR_5186 :Enter water level between {COMMA16} and {COMMA16} -STR_5187 :Finances -STR_5188 :New Campaign -STR_5189 :Research -STR_5190 :Map -STR_5191 :Viewport -STR_5192 :Recent News -STR_5193 :Land -STR_5194 :Water -STR_5195 :Clear Scenery -STR_5196 :Land Rights -STR_5197 :Scenery -STR_5198 :Footpath -STR_5199 :Ride Construction -STR_5200 :Track Design Place -STR_5201 :New Ride -STR_5202 :Track Design Selection -STR_5203 :Ride -STR_5204 :Ride List -STR_5205 :Guest -STR_5206 :Guest List -STR_5207 :Staff -STR_5208 :Staff List -STR_5209 :Banner -STR_5210 :Object Selection -STR_5211 :Invention List -STR_5212 :Scenario Options -STR_5213 :Objective Options -STR_5214 :Map Generation -STR_5215 :Track Design Manager -STR_5216 :Track Design Manager List -STR_5217 :Cheats -STR_5218 :Themes -STR_5219 :Options -STR_5220 :Keyboard Shortcuts -STR_5221 :Change Keyboard Shortcut -STR_5222 :Load/Save -STR_5223 :Save Prompt -STR_5224 :Demolish Ride Prompt -STR_5225 :Fire Staff Prompt -STR_5226 :Track Delete Prompt -STR_5227 :Save Overwrite Prompt -STR_5228 :{SMALLFONT}{BLACK}Main UI -STR_5229 :{SMALLFONT}{BLACK}Park -STR_5230 :{SMALLFONT}{BLACK}Tools -STR_5231 :{SMALLFONT}{BLACK}Rides and Peeps -STR_5232 :{SMALLFONT}{BLACK}Editors -STR_5233 :{SMALLFONT}{BLACK}Miscellaneous -STR_5234 :{SMALLFONT}{BLACK}Prompts -STR_5235 :{SMALLFONT}{BLACK}Settings -STR_5236 :Window: -STR_5237 :Palette: -STR_5238 :Current Theme: -STR_5239 :Duplicate -STR_5240 :Enter a name for the theme -STR_5241 :Can't change this theme -STR_5242 :Theme name already exists -STR_5243 :Invalid characters used -STR_5244 :Themes -STR_5245 :Top Toolbar -STR_5246 :Bottom Toolbar -STR_5247 :Track Editor Bottom Toolbar -STR_5248 :Scenario Editor Bottom Toolbar -STR_5249 :Title Menu Buttons -STR_5250 :Title Exit Button -STR_5251 :Title Options Button -STR_5252 :Title Scenario Selection -STR_5253 :Park Information -STR_5254 :Add nausea -STR_5255 :{MEDIUMFONT}{BLACK}All peeps become nauseous -STR_5256 :Create a new theme to make changes to -STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one -STR_5258 :{SMALLFONT}{BLACK}Delete the current theme -STR_5259 :{SMALLFONT}{BLACK}Rename the current theme -STR_5260 :Giant Screenshot -STR_5261 :Filter -STR_5262 :Wacky Worlds -STR_5263 :Time Twister -STR_5264 :Custom -STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible -STR_5266 :{SMALLFONT}{BLACK}Display -STR_5267 :{SMALLFONT}{BLACK}Culture and Units -STR_5268 :{SMALLFONT}{BLACK}Audio -STR_5269 :{SMALLFONT}{BLACK}Controls -STR_5270 :{SMALLFONT}{BLACK}Miscellaneous -STR_5271 :{SMALLFONT}{BLACK}Twitch -STR_5272 :{SMALLFONT}{BLACK}Small Scenery -STR_5273 :{SMALLFONT}{BLACK}Large Scenery -STR_5274 :{SMALLFONT}{BLACK}Footpaths -STR_5275 :Search for Objects -STR_5276 :Enter the name of an object to search for -STR_5277 :Clear + +# Note: as this is an unmaintained language, don't add new strings unless you intend to become the mainainer. From 5a6b011d24066a4604cc3f49d65ca7b6c77baa23 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 14 Aug 2015 14:33:45 +0200 Subject: [PATCH 0493/1173] Remove anti-cheat code that slashes reliability for hacked rides, fixes #1780 --- src/ride/ride_ratings.c | 48 ----------------------------------------- 1 file changed, 48 deletions(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 3120eaac56..e7f9efd8fc 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -93,7 +93,6 @@ static void ride_ratings_begin_proximity_loop(); static void ride_ratings_calculate(rct_ride *ride); static void ride_ratings_calculate_value(rct_ride *ride); static void ride_ratings_score_close_proximity(rct_map_element *mapElement); -static void ride_ratings_check_valid_configuration(int rideIndex); /** * @@ -241,7 +240,6 @@ static void ride_ratings_update_state_3() } ride_ratings_calculate(ride); - ride_ratings_check_valid_configuration(_rideRatingsCurrentRide); ride_ratings_calculate_value(ride); window_invalidate_by_number(WC_RIDE, _rideRatingsCurrentRide); @@ -617,52 +615,6 @@ static void ride_ratings_score_close_proximity(rct_map_element *inputMapElement) } } -/** - * - * rct2: 0x00655F64 - */ -static void ride_ratings_check_valid_configuration(int rideIndex) -{ - rct_ride *ride = GET_RIDE(rideIndex); - - // Check if launch speed is valid - switch (ride->mode) { - case RIDE_MODE_POWERED_LAUNCH_PASSTROUGH: - case RIDE_MODE_UPWARD_LAUNCH: - case RIDE_MODE_LIM_POWERED_LAUNCH: - case RIDE_MODE_POWERED_LAUNCH: - case RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED: - if (ride->launch_speed > RCT2_GLOBAL(0x0097CF40 + (ride->type * 8) + 5, uint8)) { - ride->unreliability_factor = 255; - ride->reliability /= 8; - } - break; - } - - // Check if number of vehicles is valid - ride_update_max_vehicles(rideIndex); - if (ride->num_vehicles > ride->max_trains) { - ride->unreliability_factor = 255; - ride->reliability /= 8; - } - - // Check if ride entry is valid - uint8 *availableRideEntries = (uint8*)0x009E32F8; - for (int i = 0; i < ride->type; i++) { - while (*availableRideEntries != 255) availableRideEntries++; - *availableRideEntries++; - } - - do { - if (ride->subtype == *availableRideEntries) { - return; - } - } while (*++availableRideEntries != 255); - - ride->unreliability_factor = 255; - ride->reliability /= 8; -} - static void ride_ratings_calculate(rct_ride *ride) { ride_ratings_calculation calcFunc; From 7e23d2d01382f8595b01e4aa57aab2954c8e7079 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 12 Feb 2015 02:01:02 +0000 Subject: [PATCH 0494/1173] add basic server connection functions --- projects/openrct2.vcxproj | 2 + projects/openrct2.vcxproj.filters | 6 ++ src/network/network.c | 111 ++++++++++++++++++++++++++++++ src/network/network.h | 42 +++++++++++ 4 files changed, 161 insertions(+) create mode 100644 src/network/network.c create mode 100644 src/network/network.h diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 156eefd8f4..baa73155fe 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -75,6 +75,7 @@ + @@ -230,6 +231,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index cfc5b0b556..b851bb9a90 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -498,6 +498,9 @@ Source\Localisation + + Source\Network + Source\Drawing @@ -740,5 +743,8 @@ Source\Drawing + + Source\Network + \ No newline at end of file diff --git a/src/network/network.c b/src/network/network.c new file mode 100644 index 0000000000..8ecbc3310b --- /dev/null +++ b/src/network/network.c @@ -0,0 +1,111 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#ifndef DISABLE_NETWORK + +#include "network.h" + +#pragma comment(lib, "Ws2_32.lib") + +static int _wsaInitialised = 0; +static WSADATA _wsaData; +static SOCKET _clientSocket; + +int network_init() +{ + if (!_wsaInitialised) { + log_verbose("Initialising WSA"); + if (WSAStartup(MAKEWORD(2, 2), &_wsaData) != 0) { + log_error("Unable to initialise winsock."); + return 0; + } + _wsaInitialised = 1; + } + + return 1; +} + +void network_close() +{ + log_verbose("Closing WSA"); + WSACleanup(); + _wsaInitialised = 0; +} + +int network_begin_server(int port) +{ + SOCKET listeningSocket; + SOCKADDR_IN localAddress; + + if (!network_init()) + return 0; + + log_verbose("Begin listening for clients"); + listeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (listeningSocket == INVALID_SOCKET) { + log_error("Unable to create socket."); + return 0; + } + + localAddress.sin_family = AF_INET; + localAddress.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); + localAddress.sin_port = htons(port); + + if (bind(listeningSocket, (SOCKADDR*)&localAddress, sizeof(SOCKADDR_IN)) != 0) { + closesocket(listeningSocket); + log_error("Unable to bind to socket."); + return 0; + } + + if (listen(listeningSocket, SOMAXCONN) != 0) { + closesocket(listeningSocket); + log_error("Unable to listen on socket."); + return 0; + } + + printf("Waiting for client...\n"); + _clientSocket = accept(listeningSocket, NULL, NULL); + if (_clientSocket == INVALID_SOCKET) { + closesocket(listeningSocket); + log_error("Failed to accept client."); + return 0; + } + + closesocket(listeningSocket); + printf("Connected to client!"); + return 1; +} + +void network_end_server() +{ + closesocket(_clientSocket); +} + +int network_send_data(uint8 *data, int length) +{ + return send(_clientSocket, data, length, 0); +} + +int network_receive_data(uint8 *data, int maxLength) +{ + return recv(_clientSocket, data, maxLength, 0); +} + +#endif /* DISABLE_NETWORK */ \ No newline at end of file diff --git a/src/network/network.h b/src/network/network.h new file mode 100644 index 0000000000..e0d6d25583 --- /dev/null +++ b/src/network/network.h @@ -0,0 +1,42 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#ifndef _NETWORK_H_ +#define _NETWORK_H_ + +#ifndef DISABLE_NETWORK + +#include + +#include "../common.h" + +#define NETWORK_DEFAULT_PORT 11753 + +int network_init(); +void network_close(); +int network_begin_server(int port); +void network_end_server(); + +int network_send_data(uint8 *data, int length); +int network_receive_data(uint8 *data, int maxLength); + +#endif /* DISABLE_NETWORK */ + +#endif \ No newline at end of file From 196e6eb675db59f6806673b9785f989d61ad4e30 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 12 Feb 2015 11:30:57 +0000 Subject: [PATCH 0495/1173] get basic network game working --- projects/openrct2.vcxproj.user | 16 ++-- src/cmdline.c | 16 +++- src/game.c | 30 +++++++ src/network/network.c | 153 +++++++++++++++++++++++++++++++-- src/network/network.h | 30 ++++++- src/openrct2.c | 21 +++-- 6 files changed, 245 insertions(+), 21 deletions(-) diff --git a/projects/openrct2.vcxproj.user b/projects/openrct2.vcxproj.user index 093ce205e6..6e0ad43592 100644 --- a/projects/openrct2.vcxproj.user +++ b/projects/openrct2.vcxproj.user @@ -1,21 +1,23 @@  + + false + + + $(TargetDir)\openrct2.exe + WindowsLocalDebugger + $(TargetDir) + $(TargetDir) WindowsLocalDebugger $(TargetDir)\openrct2.exe - - + "C:\Program Files (x86)\Infogrames\RollerCoaster Tycoon 2\Scenarios\Crazy Castle.SC6" --port 5552 --server 127.0.0.1 $(TargetDir) WindowsLocalDebugger $(TargetDir)\openrct2.exe - - - - - false $(TargetDir)\openrct2.exe diff --git a/src/cmdline.c b/src/cmdline.c index c964e26e20..b15160ffb4 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -23,6 +23,7 @@ #include "addresses.h" #include "cmdline.h" #include "interface/screenshot.h" +#include "network/network.h" #include "openrct2.h" #include "platform/platform.h" #include "util/util.h" @@ -64,13 +65,16 @@ static const char *const usage[] = { int cmdline_run(const char **argv, int argc) { // - int version = 0, verbose = 0, width = 0, height = 0; + int version = 0, verbose = 0, width = 0, height = 0, port = 0; + char *server = NULL; argparse_option_t options[] = { OPT_HELP(), OPT_BOOLEAN('v', "version", &version, "show version information and exit"), OPT_BOOLEAN(0, "verbose", &verbose, "log verbose messages"), OPT_INTEGER('m', "mode", &sprite_mode, "the type of sprite conversion. 0 = default, 1 = simple closest pixel match, 2 = dithering"), + OPT_STRING(0, "server", &server, "server to connect to"), + OPT_INTEGER(0, "port", &port, "port"), OPT_END() }; @@ -88,6 +92,16 @@ int cmdline_run(const char **argv, int argc) if (verbose) _log_levels[DIAGNOSTIC_LEVEL_VERBOSE] = 1; + if (port != 0) { + gNetworkStart = NETWORK_SERVER; + gNetworkStartPort = port; + } + + if (server != NULL) { + gNetworkStart = NETWORK_CLIENT; + strncpy(gNetworkStartHost, server, sizeof(gNetworkStartHost)); + } + if (argc != 0) { gExitCode = cmdline_call_action(argv, argc); if (gExitCode != 0) diff --git a/src/game.c b/src/game.c index a5eab478be..ec55efbb4d 100644 --- a/src/game.c +++ b/src/game.c @@ -34,6 +34,7 @@ #include "management/marketing.h" #include "management/news_item.h" #include "management/research.h" +#include "network/network.h" #include "object.h" #include "openrct2.h" #include "peep/peep.h" @@ -389,6 +390,35 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * int cost, flags, insufficientFunds; int original_ebx, original_edx, original_esi, original_edi, original_ebp; + int sendPacket = 0; + if (gNetworkStatus == NETWORK_CLIENT) { + if (command & (1 << 31)) { + command &= ~(1 << 31); + } else { + sendPacket = 1; + } + } else if (gNetworkStatus == NETWORK_SERVER) { + sendPacket = 1; + } + + if (sendPacket) { + network_packet packet; + packet.size = 8 * 4; + uint32 *args = (uint32*)&packet.data; + args[0] = command; + args[1] = *eax; + args[2] = *ebx; + args[3] = *ecx; + args[4] = *edx; + args[5] = *esi; + args[6] = *edi; + args[7] = *ebp; + network_send_packet(&packet); + + if (gNetworkStatus == NETWORK_CLIENT) + return MONEY32_UNDEFINED; + } + *esi = command; original_ebx = *ebx; original_edx = *edx; diff --git a/src/network/network.c b/src/network/network.c index 8ecbc3310b..683d5ba03b 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -20,14 +20,24 @@ #ifndef DISABLE_NETWORK +#include "../game.h" #include "network.h" #pragma comment(lib, "Ws2_32.lib") +int gNetworkStart = NETWORK_NONE; +char gNetworkStartHost[128]; +int gNetworkStartPort = NETWORK_DEFAULT_PORT; +int gNetworkStatus = NETWORK_NONE; + static int _wsaInitialised = 0; static WSADATA _wsaData; +static SOCKET _serverSocket; static SOCKET _clientSocket; +static int network_get_next_packet(network_packet *outPacket); +static void network_process_packet(network_packet *packet); + int network_init() { if (!_wsaInitialised) { @@ -44,15 +54,63 @@ int network_init() void network_close() { + if (!_wsaInitialised) + return; + + if (gNetworkStatus == NETWORK_CLIENT) + network_end_client(); + else if (gNetworkStatus == NETWORK_SERVER) + network_end_server(); + log_verbose("Closing WSA"); WSACleanup(); _wsaInitialised = 0; } +int network_begin_client(const char *host, int port) +{ + SOCKADDR_IN serverAddress; + u_long iMode; + + if (!network_init()) + return 0; + + _serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (_serverSocket == INVALID_SOCKET) { + log_error("Unable to create socket."); + return 0; + } + + serverAddress.sin_family = AF_INET; + serverAddress.sin_addr.S_un.S_addr = inet_addr(host); + serverAddress.sin_port = htons(port); + + if (connect(_serverSocket, (SOCKADDR*)&serverAddress, sizeof(SOCKADDR_IN)) != 0) { + log_error("Unable to connect to host."); + return 0; + } + + iMode = 1; + if (ioctlsocket(_serverSocket, FIONBIO, &iMode) != NO_ERROR) { + closesocket(_serverSocket); + log_error("Failed to set non-blocking mode."); + } + + gNetworkStatus = NETWORK_CLIENT; + return 1; +} + +void network_end_client() +{ + gNetworkStatus = NETWORK_NONE; + closesocket(_serverSocket); +} + int network_begin_server(int port) { SOCKET listeningSocket; SOCKADDR_IN localAddress; + u_long iMode; if (!network_init()) return 0; @@ -65,7 +123,7 @@ int network_begin_server(int port) } localAddress.sin_family = AF_INET; - localAddress.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); + localAddress.sin_addr.S_un.S_addr = INADDR_ANY; localAddress.sin_port = htons(port); if (bind(listeningSocket, (SOCKADDR*)&localAddress, sizeof(SOCKADDR_IN)) != 0) { @@ -89,23 +147,106 @@ int network_begin_server(int port) } closesocket(listeningSocket); - printf("Connected to client!"); + + iMode = 1; + if (ioctlsocket(_clientSocket, FIONBIO, &iMode) != NO_ERROR) { + closesocket(_clientSocket); + log_error("Failed to set non-blocking mode."); + } + + printf("Connected to client!\n"); + gNetworkStatus = NETWORK_SERVER; return 1; } void network_end_server() { + gNetworkStatus = NETWORK_NONE; closesocket(_clientSocket); } -int network_send_data(uint8 *data, int length) +void network_update() { - return send(_clientSocket, data, length, 0); + SOCKET socket; + int packetStatus; + network_packet packet; + + if (gNetworkStatus == NETWORK_NONE) + return; + + socket = gNetworkStatus == NETWORK_CLIENT ? _serverSocket : _clientSocket; + + do { + packetStatus = network_get_next_packet(&packet); + if (packetStatus == NETWORK_DISCONNECTED) { + network_print_error(); + if (gNetworkStatus == NETWORK_CLIENT) { + network_end_client(); + printf("Server disconnected...\n"); + return; + } else if (gNetworkStatus == NETWORK_SERVER) { + network_end_server(); + printf("client disconnected...\n"); + return; + } + } else if (packetStatus == NETWORK_SUCCESS) { + network_process_packet(&packet); + } + } while (packetStatus == NETWORK_SUCCESS); } -int network_receive_data(uint8 *data, int maxLength) +static int network_get_next_packet(network_packet *outPacket) { - return recv(_clientSocket, data, maxLength, 0); + SOCKET socket; + int readBytes; + + socket = gNetworkStatus == NETWORK_CLIENT ? _serverSocket : _clientSocket; + + readBytes = recv(socket, (char*)&outPacket->size, sizeof(outPacket->size), 0); + if (readBytes == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) + return NETWORK_DISCONNECTED; + + if (readBytes != sizeof(outPacket->size)) + return NETWORK_NO_DATA; + + readBytes = recv(socket, (char*)&outPacket->data, outPacket->size, 0); + if (readBytes != outPacket->size) + return NETWORK_NO_DATA; + + return NETWORK_SUCCESS; +} + +static void network_process_packet(network_packet *packet) +{ + uint32 *args; + int command; + + args = (uint32*)&packet->data; + command = args[0]; + + if (gNetworkStatus == NETWORK_CLIENT) + command |= (1 << 31); + + game_do_command_p(command, &args[1], &args[2], &args[3], &args[4], &args[5], &args[6], &args[7]); +} + +void network_send_packet(network_packet *packet) +{ + SOCKET socket; + + if (gNetworkStatus == NETWORK_NONE) + return; + + socket = gNetworkStatus == NETWORK_CLIENT ? _serverSocket : _clientSocket; + send(socket, (char*)packet, 2 + packet->size, 0); +} + +void network_print_error() +{ + wchar_t *s = NULL; + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&s, 0, NULL); + fprintf(stderr, "%S\n", s); + LocalFree(s); } #endif /* DISABLE_NETWORK */ \ No newline at end of file diff --git a/src/network/network.h b/src/network/network.h index e0d6d25583..e9e1b5c6ff 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -27,15 +27,41 @@ #include "../common.h" +typedef struct { + uint16 size; + uint8 data[128]; +} network_packet; + #define NETWORK_DEFAULT_PORT 11753 +enum { + NETWORK_NONE, + NETWORK_CLIENT, + NETWORK_SERVER +}; + +enum { + NETWORK_SUCCESS, + NETWORK_NO_DATA, + NETWORK_DISCONNECTED +}; + +extern int gNetworkStart; +extern char gNetworkStartHost[128]; +extern int gNetworkStartPort; +extern int gNetworkStatus; + int network_init(); void network_close(); +int network_begin_client(const char *host, int port); +void network_end_client(); int network_begin_server(int port); void network_end_server(); -int network_send_data(uint8 *data, int length); -int network_receive_data(uint8 *data, int maxLength); +void network_update(); +void network_send_packet(network_packet *packet); + +void network_print_error(); #endif /* DISABLE_NETWORK */ diff --git a/src/openrct2.c b/src/openrct2.c index 1a83f95a91..29bcbb28e8 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -30,6 +30,7 @@ #include "interface/viewport.h" #include "localisation/localisation.h" #include "network/http.h" +#include "network/network.h" #include "openrct2.h" #include "platform/platform.h" #include "ride/ride.h" @@ -168,10 +169,10 @@ bool openrct2_initialise() config_save_default(); // TODO add configuration option to allow multiple instances - if (!gOpenRCT2Headless && !platform_lock_single_instance()) { - log_fatal("OpenRCT2 is already running."); - return false; - } + // if (!gOpenRCT2Headless && !platform_lock_single_instance()) { + // log_fatal("OpenRCT2 is already running."); + // return false; + // } get_system_info(); if (!gOpenRCT2Headless) { @@ -248,7 +249,14 @@ void openrct2_launch() editor_load_landscape(gOpenRCT2StartupActionPath); } break; - } + } + + if (gNetworkStart == NETWORK_CLIENT) { + network_begin_client(gNetworkStartHost, gNetworkStartPort); + } else if (gNetworkStart == NETWORK_SERVER) { + network_begin_server(gNetworkStartPort); + } + openrct2_loop(); } openrct2_dispose(); @@ -259,6 +267,7 @@ void openrct2_launch() void openrct2_dispose() { + network_close(); http_dispose(); language_close_all(); platform_free(); @@ -344,6 +353,7 @@ static void openrct2_loop() } platform_process_messages(); + network_update(); rct2_draw(); platform_draw(); fps++; @@ -373,6 +383,7 @@ static void openrct2_loop() lastTick = currentTick; platform_process_messages(); + network_update(); rct2_update(); From 99f2b870430f3bc37a7b51319401e7c82093c2c8 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 12 Feb 2015 16:23:49 +0000 Subject: [PATCH 0496/1173] add chat feature --- data/language/english_uk.txt | 3 + src/config.c | 1 + src/config.h | 1 + src/interface/keyboard_shortcut.c | 7 +++ src/interface/window.h | 2 +- src/management/news_item.c | 17 ++++++ src/management/news_item.h | 2 + src/network/network.c | 93 ++++++++++++++++++++++++++++++- src/network/network.h | 2 + 9 files changed, 124 insertions(+), 4 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 3e57a568c3..757823577f 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3831,3 +3831,6 @@ STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests STR_5490 :Disable audio on focus loss STR_5491 :Inventions list STR_5492 :Scenario options + +STR_6000 :Send Message +STR_6001 :Type the message you would like to send. diff --git a/src/config.c b/src/config.c index 459eba5c33..a7aa49aa16 100644 --- a/src/config.c +++ b/src/config.c @@ -986,6 +986,7 @@ static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = { SDL_SCANCODE_EQUALS, // SHORTCUT_INCREASE_GAME_SPEED, CTRL | ALT | SDL_SCANCODE_C, // SHORTCUT_OPEN_CHEAT_WINDOW, SDL_SCANCODE_T, // SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, + SDL_SCANCODE_C // SHORTCUT_OPEN_CHAT_WINDOW SDL_SCANCODE_UP, // SHORTCUT_SCROLL_MAP_UP SDL_SCANCODE_LEFT, // SHORTCUT_SCROLL_MAP_LEFT SDL_SCANCODE_DOWN, // SHORTCUT_SCROLL_MAP_DOWN diff --git a/src/config.h b/src/config.h index 5678b3f444..e8410ac7f2 100644 --- a/src/config.h +++ b/src/config.h @@ -72,6 +72,7 @@ enum { SHORTCUT_INCREASE_GAME_SPEED, SHORTCUT_OPEN_CHEAT_WINDOW, SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, + SHORTCUT_OPEN_CHAT_WINDOW, SHORTCUT_SCROLL_MAP_UP, SHORTCUT_SCROLL_MAP_LEFT, SHORTCUT_SCROLL_MAP_DOWN, diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index a810083713..8ee523a996 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -23,6 +23,7 @@ #include "../game.h" #include "../input.h" #include "../localisation/localisation.h" +#include "../network/network.h" #include "keyboard_shortcut.h" #include "viewport.h" #include "window.h" @@ -493,6 +494,11 @@ static void shortcut_open_cheat_window() window_cheats_open(); } +static void shortcut_open_chat_window() +{ + network_open_chat_box(); +} + static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { shortcut_close_top_most_window, shortcut_close_all_floating_windows, @@ -533,6 +539,7 @@ static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { shortcut_increase_game_speed, shortcut_open_cheat_window, shortcut_remove_top_bottom_toolbar_toggle, + shortcut_open_chat_window NULL, NULL, NULL, diff --git a/src/interface/window.h b/src/interface/window.h index a942bc1b7c..cefafd28df 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -446,12 +446,12 @@ enum { WC_CHANGELOG = 121, WC_TITLE_EDITOR = 122, WC_TITLE_COMMAND_EDITOR = 123, + WC_CHAT_HOST = 124, // Only used for colour schemes WC_STAFF = 220, WC_EDITOR_TRACK_BOTTOM_TOOLBAR = 221, WC_EDITOR_SCENARIO_BOTTOM_TOOLBAR = 222, - } WINDOW_CLASS; enum PROMPT_MODE { diff --git a/src/management/news_item.c b/src/management/news_item.c index d077920471..ee8bb0c151 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -434,3 +434,20 @@ void news_item_disable_news(uint8 type, uint32 assoc) } } +void news_item_add_to_queue_custom(rct_news_item *newNewsItem) +{ + int i = 0; + rct_news_item *newsItem = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); + + // Find first open slot + while (newsItem->type != NEWS_ITEM_NULL) { + if (newsItem + 1 >= (rct_news_item*)0x013CB1CC) + news_item_close_current(); + else + newsItem++; + } + + *newsItem = *newNewsItem; + newsItem++; + newsItem->type = 0; +} diff --git a/src/management/news_item.h b/src/management/news_item.h index 1b37077606..a23be1c19e 100644 --- a/src/management/news_item.h +++ b/src/management/news_item.h @@ -66,4 +66,6 @@ bool news_item_is_empty(int index); bool news_item_is_queue_empty(); bool news_item_is_valid_idx(int index); +void news_item_add_to_queue_custom(rct_news_item *newNewsItem); + #endif diff --git a/src/network/network.c b/src/network/network.c index 683d5ba03b..2077a39f71 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -20,7 +20,12 @@ #ifndef DISABLE_NETWORK +#include "../addresses.h" #include "../game.h" +#include "../interface/window.h" +#include "../localisation/date.h" +#include "../localisation/localisation.h" +#include "../management/news_item.h" #include "network.h" #pragma comment(lib, "Ws2_32.lib") @@ -220,14 +225,30 @@ static void network_process_packet(network_packet *packet) { uint32 *args; int command; + rct_news_item newsItem; args = (uint32*)&packet->data; command = args[0]; - if (gNetworkStatus == NETWORK_CLIENT) - command |= (1 << 31); + switch (command) { + case 700: + newsItem.type = NEWS_ITEM_BLANK; + newsItem.flags = 1; + newsItem.assoc = 0; + newsItem.ticks = 0; + newsItem.month_year = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); + newsItem.day = ((days_in_month[(newsItem.month_year & 7)] * RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16)) >> 16) + 1; + newsItem.colour = FORMAT_TOPAZ; + strcpy(newsItem.text, packet->data + 4); + news_item_add_to_queue_custom(&newsItem); + break; + default: + if (gNetworkStatus == NETWORK_CLIENT) + command |= (1 << 31); - game_do_command_p(command, &args[1], &args[2], &args[3], &args[4], &args[5], &args[6], &args[7]); + game_do_command_p(command, &args[1], &args[2], &args[3], &args[4], &args[5], &args[6], &args[7]); + break; + } } void network_send_packet(network_packet *packet) @@ -249,4 +270,70 @@ void network_print_error() LocalFree(s); } +static void window_chat_host_emptysub() { } + +static void window_chat_host_textinput() +{ + rct_window *w; + short widgetIndex; + uint8 result; + char *text; + + window_textinput_get_registers(w, widgetIndex, result, text); + + if (!result) + return; + + network_packet packet; + packet.size = 4 + strlen(text) + 1; + *((uint32*)packet.data) = 700; + strcpy(packet.data + 4, text); + + network_send_packet(&packet); + + window_close(w); +} + +static void* window_chat_host_events[] = { + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_textinput, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub +}; + +void network_open_chat_box() +{ + rct_window *w; + w = window_create(0, 0, 0, 0, (uint32*)window_chat_host_events, WC_CHAT_HOST, 0); + w->colours[0] = 1; + w->colours[1] = 1; + w->colours[2] = 0; + w->number = 0; + window_text_input_open(w, 0, 6000, 6001, STR_NONE, 0, 64); +} + #endif /* DISABLE_NETWORK */ \ No newline at end of file diff --git a/src/network/network.h b/src/network/network.h index e9e1b5c6ff..388d03eaf2 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -61,6 +61,8 @@ void network_end_server(); void network_update(); void network_send_packet(network_packet *packet); +void network_open_chat_box(); + void network_print_error(); #endif /* DISABLE_NETWORK */ From df7f576e05c76f1b5767e00abac09fa5eed35518 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sun, 5 Jul 2015 09:19:01 -0600 Subject: [PATCH 0497/1173] map loading over network --- src/drawing/rain.c | 24 +-- src/game.c | 57 ++++-- src/game.h | 1 + src/localisation/date.c | 2 +- src/network/network.c | 276 ++++++++++++++++++++++++------ src/network/network.h | 24 ++- src/peep/peep.c | 2 +- src/rct2.c | 2 +- src/windows/game_bottom_toolbar.c | 2 +- src/world/climate.c | 2 +- src/world/park.c | 2 +- 11 files changed, 307 insertions(+), 87 deletions(-) diff --git a/src/drawing/rain.c b/src/drawing/rain.c index cfae4449f2..2357ef7069 100644 --- a/src/drawing/rain.c +++ b/src/drawing/rain.c @@ -167,8 +167,8 @@ void update_rain_animation() */ static void draw_light_rain(int left, int top, int width, int height) { - int x_start = -RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, int) + 8; - int y_start = (RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, int) * 3) + 7; + int x_start = -(int)RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) + 8; + int y_start = (RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) * 3) + 7; y_start = -y_start; x_start += left; @@ -176,8 +176,8 @@ static void draw_light_rain(int left, int top, int width, int height) gfx_draw_rain(left, top, width, height, x_start, y_start); - x_start = -RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, int) + 0x18; - y_start = (RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, int) * 4) + 0x0D; + x_start = -(int)RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) + 0x18; + y_start = (RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) * 4) + 0x0D; y_start = -y_start; x_start += left; @@ -191,8 +191,8 @@ static void draw_light_rain(int left, int top, int width, int height) */ static void draw_heavy_rain(int left, int top, int width, int height) { - int x_start = -RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, int); - int y_start = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, int) * 5; + int x_start = -(int)RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32); + int y_start = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) * 5; y_start = -y_start; x_start += left; @@ -200,8 +200,8 @@ static void draw_heavy_rain(int left, int top, int width, int height) gfx_draw_rain(left, top, width, height, x_start, y_start); - x_start = -RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, int) + 0x10; - y_start = (RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, int) * 6) + 5; + x_start = -(int)RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) + 0x10; + y_start = (RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) * 6) + 5; y_start = -y_start; x_start += left; @@ -209,8 +209,8 @@ static void draw_heavy_rain(int left, int top, int width, int height) gfx_draw_rain(left, top, width, height, x_start, y_start); - x_start = -RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, int) + 8; - y_start = (RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, int) * 3) + 7; + x_start = -(int)RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) + 8; + y_start = (RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) * 3) + 7; y_start = -y_start; x_start += left; @@ -218,8 +218,8 @@ static void draw_heavy_rain(int left, int top, int width, int height) gfx_draw_rain(left, top, width, height, x_start, y_start); - x_start = -RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, int) + 0x18; - y_start = (RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, int) * 4) + 0x0D; + x_start = -(int)RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) + 0x18; + y_start = (RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) * 4) + 0x0D; y_start = -y_start; x_start += left; diff --git a/src/game.c b/src/game.c index ec55efbb4d..650f0f8e02 100644 --- a/src/game.c +++ b/src/game.c @@ -233,6 +233,13 @@ void game_update() numUpdates = clamp(1, numUpdates, 4); } + if (gNetworkStatus == NETWORK_CLIENT) { + if (gNetworkServerTick - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) >= 10) { + // make sure client doesn't fall behind the server too much + numUpdates += 10; + } + } + // Update the game one or more times if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0) { for (i = 0; i < numUpdates; i++) { @@ -271,7 +278,7 @@ void game_update() // the flickering frequency is reduced by 4, compared to the original // it was done due to inability to reproduce original frequency // and decision that the original one looks too fast - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, sint32) % 4 == 0) + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) % 4 == 0) RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_MAP_FLASHING_FLAGS, uint16) ^= (1 << 15); // Handle guest map flashing @@ -303,8 +310,14 @@ void game_update() void game_logic_update() { - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, sint32)++; - RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, sint32)++; + if (gNetworkStatus == NETWORK_CLIENT) { + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) == gNetworkServerTick) { + return; + } + } + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)++; + RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32)++; RCT2_GLOBAL(0x009DEA66, sint16)++; if (RCT2_GLOBAL(0x009DEA66, sint16) == 0) RCT2_GLOBAL(0x009DEA66, sint16)--; @@ -402,18 +415,18 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * } if (sendPacket) { - network_packet packet; - packet.size = 8 * 4; - uint32 *args = (uint32*)&packet.data; - args[0] = command; - args[1] = *eax; - args[2] = *ebx; - args[3] = *ecx; - args[4] = *edx; - args[5] = *esi; - args[6] = *edi; - args[7] = *ebp; - network_send_packet(&packet); + network_packet* packet = network_alloc_packet(9 * 4); + uint32 *args = (uint32*)packet->data; + args[0] = NETWORK_COMMAND_GAMECMD; + args[1] = command; + args[2] = *eax; + args[3] = *ebx; + args[4] = *ecx; + args[5] = *edx; + args[6] = *esi; + args[7] = *edi; + args[8] = *ebp; + network_queue_packet(packet); if (gNetworkStatus == NETWORK_CLIENT) return MONEY32_UNDEFINED; @@ -741,6 +754,9 @@ int game_load_sv6(SDL_RWops* rw) reset_0x69EBE4(); openrct2_reset_object_tween_locations(); game_convert_strings_to_utf8(); + if (gNetworkStatus == NETWORK_SERVER) { + network_send_map(); + } return 1; } @@ -750,8 +766,6 @@ int game_load_sv6(SDL_RWops* rw) */ int game_load_save(const char *path) { - rct_window *mainWindow; - log_verbose("loading saved game, %s", path); strcpy((char*)0x0141EF68, path); @@ -776,6 +790,14 @@ int game_load_save(const char *path) } SDL_RWclose(rw); + game_load_init(); + return 1; +} + +void game_load_init() +{ + rct_window *mainWindow; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_PLAYING; viewport_init_all(); game_create_windows(); @@ -814,7 +836,6 @@ int game_load_save(const char *path) gGameSpeed = 1; scenario_set_filename((char*)0x0135936C); - return 1; } /* diff --git a/src/game.h b/src/game.h index fa9dbf8120..ae0ebf5880 100644 --- a/src/game.h +++ b/src/game.h @@ -112,6 +112,7 @@ void game_reduce_game_speed(); void game_load_or_quit_no_save_prompt(); int game_load_sv6(SDL_RWops* rw); int game_load_save(const char *path); +void game_load_init(); void game_pause_toggle(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void pause_toggle(); int save_game(); diff --git a/src/localisation/date.c b/src/localisation/date.c index 8312f5d798..d0af9956b0 100644 --- a/src/localisation/date.c +++ b/src/localisation/date.c @@ -48,5 +48,5 @@ void date_reset() { RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16) = MONTH_MARCH; RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, sint16) = 0; - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, sint32) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) = 0; } diff --git a/src/network/network.c b/src/network/network.c index 2077a39f71..d9f87918cd 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -26,6 +26,7 @@ #include "../localisation/date.h" #include "../localisation/localisation.h" #include "../management/news_item.h" +#include "../scenario.h" #include "network.h" #pragma comment(lib, "Ws2_32.lib") @@ -34,14 +35,22 @@ int gNetworkStart = NETWORK_NONE; char gNetworkStartHost[128]; int gNetworkStartPort = NETWORK_DEFAULT_PORT; int gNetworkStatus = NETWORK_NONE; +uint32 gNetworkServerTick = 0; +static network_packet* _packetQueue = NULL; static int _wsaInitialised = 0; static WSADATA _wsaData; static SOCKET _serverSocket; static SOCKET _clientSocket; +static network_packet _inboundPacket; +static char* _chunkBuffer = NULL; -static int network_get_next_packet(network_packet *outPacket); +static int network_read_next_packet(network_packet *outPacket); static void network_process_packet(network_packet *packet); +static void network_init_packet(network_packet* packet, int size); +static void network_close_packet(network_packet *packet); +static int network_send_packet(network_packet *packet); +static void network_send_queued_packets(); int network_init() { @@ -54,6 +63,8 @@ int network_init() _wsaInitialised = 1; } + network_init_packet(&_inboundPacket, 0); + return 1; } @@ -93,6 +104,8 @@ int network_begin_client(const char *host, int port) if (connect(_serverSocket, (SOCKADDR*)&serverAddress, sizeof(SOCKADDR_IN)) != 0) { log_error("Unable to connect to host."); return 0; + } else { + printf("Connected to server!\n"); } iMode = 1; @@ -174,7 +187,7 @@ void network_update() { SOCKET socket; int packetStatus; - network_packet packet; + static uint32 lastTickUpdate = 0; if (gNetworkStatus == NETWORK_NONE) return; @@ -182,8 +195,9 @@ void network_update() socket = gNetworkStatus == NETWORK_CLIENT ? _serverSocket : _clientSocket; do { - packetStatus = network_get_next_packet(&packet); - if (packetStatus == NETWORK_DISCONNECTED) { + packetStatus = network_read_next_packet(&_inboundPacket); + switch(packetStatus) { + case NETWORK_DISCONNECTED: network_print_error(); if (gNetworkStatus == NETWORK_CLIENT) { network_end_client(); @@ -194,31 +208,69 @@ void network_update() printf("client disconnected...\n"); return; } - } else if (packetStatus == NETWORK_SUCCESS) { - network_process_packet(&packet); + break; + case NETWORK_SUCCESS: + // done reading in packet + network_process_packet(&_inboundPacket); + network_close_packet(&_inboundPacket); + network_init_packet(&_inboundPacket, 0); // initialize the packet struct to be used again + break; + case NETWORK_MORE_DATA: + // more data required to be read + break; + case NETWORK_NO_DATA: + break; } - } while (packetStatus == NETWORK_SUCCESS); + } while (packetStatus == NETWORK_MORE_DATA || packetStatus == NETWORK_SUCCESS); + + if (gNetworkStatus == NETWORK_SERVER) { + if (SDL_GetTicks() - lastTickUpdate >= 100) { + lastTickUpdate = SDL_GetTicks(); + network_send_tick(); + } + } + + network_send_queued_packets(); } -static int network_get_next_packet(network_packet *outPacket) +static int network_read_next_packet(network_packet *packet) { SOCKET socket; - int readBytes; socket = gNetworkStatus == NETWORK_CLIENT ? _serverSocket : _clientSocket; - readBytes = recv(socket, (char*)&outPacket->size, sizeof(outPacket->size), 0); - if (readBytes == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) - return NETWORK_DISCONNECTED; - - if (readBytes != sizeof(outPacket->size)) - return NETWORK_NO_DATA; - - readBytes = recv(socket, (char*)&outPacket->data, outPacket->size, 0); - if (readBytes != outPacket->size) - return NETWORK_NO_DATA; - - return NETWORK_SUCCESS; + if (packet->read < sizeof(packet->size)) { + // read packet size + int readBytes = recv(socket, &((char*)&packet->size)[packet->read], sizeof(packet->size) - packet->read, 0); + if (readBytes == SOCKET_ERROR || readBytes == 0) { + if (WSAGetLastError() != WSAEWOULDBLOCK) { + return NETWORK_DISCONNECTED; + } else { + return NETWORK_NO_DATA; + } + } + packet->read += readBytes; + } else { + // read packet data + if (!packet->data) { + packet->size = ntohs(packet->size); + packet->data = malloc(packet->size); + } + int dataread = packet->read - sizeof(packet->size); + int readBytes = recv(socket, &packet->data[dataread], packet->size - dataread, 0); + if (readBytes == SOCKET_ERROR || readBytes == 0) { + if (WSAGetLastError() != WSAEWOULDBLOCK) { + return NETWORK_DISCONNECTED; + } else { + return NETWORK_NO_DATA; + } + } + packet->read += readBytes; + if (packet->read == packet->size + sizeof(packet->size)) { + return NETWORK_SUCCESS; + } + } + return NETWORK_MORE_DATA; } static void network_process_packet(network_packet *packet) @@ -227,39 +279,169 @@ static void network_process_packet(network_packet *packet) int command; rct_news_item newsItem; - args = (uint32*)&packet->data; + args = (uint32*)packet->data; command = args[0]; - switch (command) { - case 700: - newsItem.type = NEWS_ITEM_BLANK; - newsItem.flags = 1; - newsItem.assoc = 0; - newsItem.ticks = 0; - newsItem.month_year = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); - newsItem.day = ((days_in_month[(newsItem.month_year & 7)] * RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16)) >> 16) + 1; - newsItem.colour = FORMAT_TOPAZ; - strcpy(newsItem.text, packet->data + 4); - news_item_add_to_queue_custom(&newsItem); - break; - default: - if (gNetworkStatus == NETWORK_CLIENT) - command |= (1 << 31); + case NETWORK_COMMAND_AUTH:{ - game_do_command_p(command, &args[1], &args[2], &args[3], &args[4], &args[5], &args[6], &args[7]); - break; + }break; + case NETWORK_COMMAND_MAP:{ + uint32 size = args[1]; + uint32 offset = args[2]; + if (!_chunkBuffer) { + _chunkBuffer = malloc(0x600000); + } + if (_chunkBuffer) { + int chunksize = packet->size - 4 - 4 - 4; + if (offset + chunksize <= 0x600000) { + memcpy(&_chunkBuffer[offset], packet->data + 4 + 4 + 4, chunksize); + } + if (offset + chunksize == size) { + SDL_RWops* rw = SDL_RWFromMem(_chunkBuffer, size); + if (game_load_sv6(rw)) { + game_load_init(); + } + SDL_RWclose(rw); + } + } + }break; + case NETWORK_COMMAND_CHAT:{ + newsItem.type = NEWS_ITEM_BLANK; + newsItem.flags = 1; + newsItem.assoc = 0; + newsItem.ticks = 0; + newsItem.month_year = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); + newsItem.day = ((days_in_month[(newsItem.month_year & 7)] * RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16)) >> 16) + 1; + newsItem.colour = FORMAT_TOPAZ; + strcpy(newsItem.text, packet->data + 4); + news_item_add_to_queue_custom(&newsItem); + }break; + case NETWORK_COMMAND_GAMECMD:{ + if (gNetworkStatus == NETWORK_CLIENT) + args[1] |= (1 << 31); + + game_do_command_p(args[1], &args[2], &args[3], &args[4], &args[5], &args[6], &args[7], &args[8]); + }break; + case NETWORK_COMMAND_TICK:{ + gNetworkServerTick = args[1]; + }break; } } -void network_send_packet(network_packet *packet) +network_packet* network_alloc_packet(int size) { + network_packet* packet = malloc(sizeof(network_packet)); + network_init_packet(packet, size); + return packet; +} + +void network_init_packet(network_packet* packet, int size) +{ + packet->read = 0; + packet->size = size; + packet->data = NULL; + packet->next = NULL; + if (size) { + packet->data = malloc(size); + } +} + +void network_queue_packet(network_packet *packet) +{ + if (!_packetQueue) { + _packetQueue = packet; + return; + } + network_packet* end_packet = _packetQueue; + while (end_packet->next) { + end_packet = end_packet->next; + } + end_packet->next = packet; +} + +void network_send_queued_packets() +{ + while (network_send_packet(_packetQueue)) { + network_packet* sentPacket = _packetQueue; + _packetQueue = _packetQueue->next; + network_close_packet(sentPacket); + free(sentPacket); + } +} + +void network_close_packet(network_packet *packet) +{ + free(packet->data); +} + +int network_send_packet(network_packet *packet) +{ + if (!packet) { + return 0; + } + SOCKET socket; if (gNetworkStatus == NETWORK_NONE) - return; + return 0; socket = gNetworkStatus == NETWORK_CLIENT ? _serverSocket : _clientSocket; - send(socket, (char*)packet, 2 + packet->size, 0); + + while (1) { + if (packet->read < sizeof(packet->size)) { + // send packet size + uint16 size = htons(packet->size); + int sentBytes = send(socket, &((char*)&size)[packet->read], sizeof(size) - packet->read, 0); + if (sentBytes == SOCKET_ERROR) { + return 0; + } + packet->read += sentBytes; + } else { + // send packet data + int datasent = packet->read - sizeof(packet->size); + int sentBytes = send(socket, &packet->data[datasent], packet->size - datasent, 0); + if (sentBytes == SOCKET_ERROR) { + return 0; + } + packet->read += sentBytes; + if (packet->read == packet->size + sizeof(packet->size)) { + return 1; + } + } + } + return 0; +} + +void network_send_tick() +{ + network_packet* packet = network_alloc_packet(4 + sizeof(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32))); + *((uint32*)packet->data) = NETWORK_COMMAND_TICK; + memcpy(packet->data + 4, (char*)&RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), sizeof(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32))); + network_queue_packet(packet); +} + +void network_send_map() +{ + int buffersize = 0x600000; + char* buffer = malloc(buffersize); + if (!buffer) { + return; + } + SDL_RWops* rw = SDL_RWFromMem(buffer, buffersize); + scenario_save(rw, 0); + int size = (int)SDL_RWtell(rw); + int chunksize = 1000; + for (int i = 0; i < size; i += chunksize) { + int datasize = min(chunksize, size - i); + network_packet* packet = network_alloc_packet(4 + 4 + 4 + datasize); + *((uint32*)packet->data) = NETWORK_COMMAND_MAP; + *((uint32*)packet->data + 1) = size; + *((uint32*)packet->data + 1 + 1) = i; + memcpy(packet->data + 4 + 4 + 4, &buffer[i], datasize); + network_queue_packet(packet); + } + SDL_RWclose(rw); + free(buffer); } void network_print_error() @@ -284,12 +466,10 @@ static void window_chat_host_textinput() if (!result) return; - network_packet packet; - packet.size = 4 + strlen(text) + 1; - *((uint32*)packet.data) = 700; - strcpy(packet.data + 4, text); - - network_send_packet(&packet); + network_packet* packet = network_alloc_packet(4 + strlen(text) + 1); + *((uint32*)packet->data) = NETWORK_COMMAND_CHAT; + strcpy(packet->data + 4, text); + network_queue_packet(packet); window_close(w); } diff --git a/src/network/network.h b/src/network/network.h index 388d03eaf2..c6235992a1 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -27,9 +27,13 @@ #include "../common.h" -typedef struct { +typedef struct network_packet network_packet; + +typedef struct network_packet { uint16 size; - uint8 data[128]; + uint8* data; + int read; + network_packet* next; } network_packet; #define NETWORK_DEFAULT_PORT 11753 @@ -43,13 +47,23 @@ enum { enum { NETWORK_SUCCESS, NETWORK_NO_DATA, + NETWORK_MORE_DATA, NETWORK_DISCONNECTED }; +enum { + NETWORK_COMMAND_AUTH, + NETWORK_COMMAND_MAP, + NETWORK_COMMAND_CHAT, + NETWORK_COMMAND_GAMECMD, + NETWORK_COMMAND_TICK +}; + extern int gNetworkStart; extern char gNetworkStartHost[128]; extern int gNetworkStartPort; extern int gNetworkStatus; +extern uint32 gNetworkServerTick; int network_init(); void network_close(); @@ -59,7 +73,11 @@ int network_begin_server(int port); void network_end_server(); void network_update(); -void network_send_packet(network_packet *packet); +network_packet* network_alloc_packet(int size); +void network_queue_packet(network_packet *packet); + +void network_send_tick(); +void network_send_map(); void network_open_chat_box(); diff --git a/src/peep/peep.c b/src/peep/peep.c index 01469693f3..8fac10960e 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -3739,7 +3739,7 @@ static void peep_update_entering_park(rct_peep* peep){ peep_window_state_update(peep); peep->var_2A = 0; - peep->time_in_park = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, sint32); + peep->time_in_park = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32); RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16)++; RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16)--; RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint16) |= BTM_TB_DIRTY_FLAG_PEEP_COUNT; diff --git a/src/rct2.c b/src/rct2.c index 14c69eef5a..a765fe888a 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -74,7 +74,7 @@ int rct2_init() { log_verbose("initialising game"); - RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, int) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) = 0; RCT2_GLOBAL(0x009AC310, char*) = RCT2_GLOBAL(RCT2_ADDRESS_CMDLINE, char*); get_system_time(); srand((unsigned int)time(0)); diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index e21333a4cc..0b27eb209d 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -420,7 +420,7 @@ static void window_game_bottom_toolbar_draw_park_rating(rct_drawpixelinfo *dpi, bar_width = (factor * (90 + WIDTH_MOD)) / 256; gfx_fill_rect_inset(dpi, x, y + 1, x + (93 + WIDTH_MOD), y + 9, w->colours[1], 48); - if (!(colour & 0x80000000) || RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 || (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint8) & 8)) { + if (!(colour & 0x80000000) || RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 || (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 8)) { if (bar_width > 2) gfx_fill_rect_inset(dpi, x + 2, y + 2, x + bar_width - 1, y + 8, colour & 0x7FFFFFFF, 0); } diff --git a/src/world/climate.c b/src/world/climate.c index 60347f3d10..f72319fd3b 100644 --- a/src/world/climate.c +++ b/src/world/climate.c @@ -168,7 +168,7 @@ void climate_update() RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE_UPDATE_TIMER, sint16)--; - } else if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, sint32) & 0x7F)) { + } else if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x7F)) { if (temperature == target_temperature) { if (cur_gloom == next_gloom) { diff --git a/src/world/park.c b/src/world/park.c index 2cb4a1e96d..c0ebba6acc 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -539,7 +539,7 @@ void park_update() return; // Every 5 seconds approximately - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint8) % 512 == 0) { + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) % 512 == 0) { RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, uint16) = calculate_park_rating(); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_VALUE, money32) = calculate_park_value(); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_COMPANY_VALUE, money32) = calculate_company_value(); From 6c571bab006104b89f570b8dfd4deb31e230611a Mon Sep 17 00:00:00 2001 From: zsilencer Date: Tue, 7 Jul 2015 08:09:21 -0600 Subject: [PATCH 0498/1173] convert network to c++ --- src/game.c | 13 +- src/localisation/localisation.c | 1 - src/network/{network.c => network.cpp} | 332 ++++++++++++------------- src/network/network.h | 48 +++- src/ride/ride.h | 2 +- 5 files changed, 207 insertions(+), 189 deletions(-) rename src/network/{network.c => network.cpp} (63%) diff --git a/src/game.c b/src/game.c index 650f0f8e02..f0fb5946fa 100644 --- a/src/game.c +++ b/src/game.c @@ -415,18 +415,7 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * } if (sendPacket) { - network_packet* packet = network_alloc_packet(9 * 4); - uint32 *args = (uint32*)packet->data; - args[0] = NETWORK_COMMAND_GAMECMD; - args[1] = command; - args[2] = *eax; - args[3] = *ebx; - args[4] = *ecx; - args[5] = *edx; - args[6] = *esi; - args[7] = *edi; - args[8] = *ebp; - network_queue_packet(packet); + network_send_gamecmd((uint32)command, (uint32)*eax, (uint32)*ebx, (uint32)*ecx, (uint32)*edx, (uint32)*esi, (uint32)*edi, (uint32)*ebp); if (gNetworkStatus == NETWORK_CLIENT) return MONEY32_UNDEFINED; diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 82ea9f0f54..141ce8805d 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -18,7 +18,6 @@ * along with this program. If not, see . *****************************************************************************/ -#include #include "../addresses.h" #include "../config.h" #include "../game.h" diff --git a/src/network/network.c b/src/network/network.cpp similarity index 63% rename from src/network/network.c rename to src/network/network.cpp index d9f87918cd..578530ec69 100644 --- a/src/network/network.c +++ b/src/network/network.cpp @@ -20,6 +20,8 @@ #ifndef DISABLE_NETWORK +#include +extern "C" { #include "../addresses.h" #include "../game.h" #include "../interface/window.h" @@ -27,6 +29,7 @@ #include "../localisation/localisation.h" #include "../management/news_item.h" #include "../scenario.h" +} #include "network.h" #pragma comment(lib, "Ws2_32.lib") @@ -43,15 +46,111 @@ static WSADATA _wsaData; static SOCKET _serverSocket; static SOCKET _clientSocket; static network_packet _inboundPacket; -static char* _chunkBuffer = NULL; +static std::vector _chunkBuffer; +static NetworkConnection _serverConnection; +static NetworkConnection _clientConnection; -static int network_read_next_packet(network_packet *outPacket); -static void network_process_packet(network_packet *packet); -static void network_init_packet(network_packet* packet, int size); -static void network_close_packet(network_packet *packet); +static void network_process_packet(NetworkPacket& packet); static int network_send_packet(network_packet *packet); static void network_send_queued_packets(); +NetworkPacket::NetworkPacket() +{ + read = 0; + size = 0; + data = std::make_shared>(); +} + +uint8* NetworkPacket::GetData() +{ + return &(*data)[0]; +} + +int NetworkConnection::ReadPacket() +{ + if (inboundpacket.read < sizeof(inboundpacket.size)) { + // read packet size + int readBytes = recv(socket, &((char*)&inboundpacket.size)[inboundpacket.read], sizeof(inboundpacket.size) - inboundpacket.read, 0); + if (readBytes == SOCKET_ERROR || readBytes == 0) { + if (WSAGetLastError() != WSAEWOULDBLOCK) { + return NETWORK_DISCONNECTED; + } else { + return NETWORK_NO_DATA; + } + } + inboundpacket.read += readBytes; + if (inboundpacket.read == sizeof(inboundpacket.size)) { + inboundpacket.size = ntohs(inboundpacket.size); + inboundpacket.data->resize(inboundpacket.size); + } + } else { + // read packet data + if (inboundpacket.data->capacity() > 0) { + int readBytes = recv(socket, (char*)&inboundpacket.GetData()[inboundpacket.read - sizeof(inboundpacket.size)], sizeof(inboundpacket.size) + inboundpacket.size - inboundpacket.read, 0); + if (readBytes == SOCKET_ERROR || readBytes == 0) { + if (WSAGetLastError() != WSAEWOULDBLOCK) { + return NETWORK_DISCONNECTED; + } else { + return NETWORK_NO_DATA; + } + } + inboundpacket.read += readBytes; + } + if (inboundpacket.read == sizeof(inboundpacket.size) + inboundpacket.size) { + return NETWORK_SUCCESS; + } + } + return NETWORK_MORE_DATA; +} + +int NetworkConnection::SendPacket(NetworkPacket& packet) +{ + if (gNetworkStatus == NETWORK_NONE) { + return 0; + } + + while (1) { + if (packet.read < sizeof(packet.size)) { + // send packet size + uint16 size = htons(packet.size); + int sentBytes = send(socket, &((char*)&size)[packet.read], sizeof(size) - packet.read, 0); + if (sentBytes == SOCKET_ERROR) { + return 0; + } + packet.read += sentBytes; + } else { + // send packet data + int sentBytes = send(socket, (const char*)&packet.GetData()[packet.read - sizeof(packet.size)], packet.data->size(), 0); + if (sentBytes == SOCKET_ERROR) { + return 0; + } + packet.read += sentBytes; + if (packet.read == sizeof(packet.size) + packet.data->size()) { + return 1; + } + } + } + return 0; +} + +void NetworkConnection::QueuePacket(std::unique_ptr packet) +{ + packet->size = packet->data->size(); + outboundpackets.push_back(std::move(packet)); +} + +std::unique_ptr NetworkConnection::AllocatePacket() +{ + return std::move(std::unique_ptr(new NetworkPacket)); // can be converted to make_unique in C++14 +} + +void NetworkConnection::SendQueuedPackets() +{ + while (outboundpackets.size() > 0 && SendPacket(*(outboundpackets.front()).get())) { + outboundpackets.remove(outboundpackets.front()); + } +} + int network_init() { if (!_wsaInitialised) { @@ -63,8 +162,6 @@ int network_init() _wsaInitialised = 1; } - network_init_packet(&_inboundPacket, 0); - return 1; } @@ -114,6 +211,8 @@ int network_begin_client(const char *host, int port) log_error("Failed to set non-blocking mode."); } + _serverConnection.socket = _serverSocket; + gNetworkStatus = NETWORK_CLIENT; return 1; } @@ -173,6 +272,9 @@ int network_begin_server(int port) } printf("Connected to client!\n"); + + _clientConnection.socket = _clientSocket; + gNetworkStatus = NETWORK_SERVER; return 1; } @@ -185,17 +287,16 @@ void network_end_server() void network_update() { - SOCKET socket; int packetStatus; static uint32 lastTickUpdate = 0; if (gNetworkStatus == NETWORK_NONE) return; - socket = gNetworkStatus == NETWORK_CLIENT ? _serverSocket : _clientSocket; + NetworkConnection& networkconnection = gNetworkStatus == NETWORK_CLIENT ? _serverConnection : _clientConnection; do { - packetStatus = network_read_next_packet(&_inboundPacket); + packetStatus = networkconnection.ReadPacket(); switch(packetStatus) { case NETWORK_DISCONNECTED: network_print_error(); @@ -205,15 +306,13 @@ void network_update() return; } else if (gNetworkStatus == NETWORK_SERVER) { network_end_server(); - printf("client disconnected...\n"); + printf("Client disconnected...\n"); return; } break; case NETWORK_SUCCESS: // done reading in packet - network_process_packet(&_inboundPacket); - network_close_packet(&_inboundPacket); - network_init_packet(&_inboundPacket, 0); // initialize the packet struct to be used again + network_process_packet(networkconnection.inboundpacket); break; case NETWORK_MORE_DATA: // more data required to be read @@ -230,56 +329,16 @@ void network_update() } } - network_send_queued_packets(); + networkconnection.SendQueuedPackets(); } -static int network_read_next_packet(network_packet *packet) -{ - SOCKET socket; - - socket = gNetworkStatus == NETWORK_CLIENT ? _serverSocket : _clientSocket; - - if (packet->read < sizeof(packet->size)) { - // read packet size - int readBytes = recv(socket, &((char*)&packet->size)[packet->read], sizeof(packet->size) - packet->read, 0); - if (readBytes == SOCKET_ERROR || readBytes == 0) { - if (WSAGetLastError() != WSAEWOULDBLOCK) { - return NETWORK_DISCONNECTED; - } else { - return NETWORK_NO_DATA; - } - } - packet->read += readBytes; - } else { - // read packet data - if (!packet->data) { - packet->size = ntohs(packet->size); - packet->data = malloc(packet->size); - } - int dataread = packet->read - sizeof(packet->size); - int readBytes = recv(socket, &packet->data[dataread], packet->size - dataread, 0); - if (readBytes == SOCKET_ERROR || readBytes == 0) { - if (WSAGetLastError() != WSAEWOULDBLOCK) { - return NETWORK_DISCONNECTED; - } else { - return NETWORK_NO_DATA; - } - } - packet->read += readBytes; - if (packet->read == packet->size + sizeof(packet->size)) { - return NETWORK_SUCCESS; - } - } - return NETWORK_MORE_DATA; -} - -static void network_process_packet(network_packet *packet) +static void network_process_packet(NetworkPacket& packet) { uint32 *args; int command; rct_news_item newsItem; - args = (uint32*)packet->data; + args = (uint32*)packet.GetData(); command = args[0]; switch (command) { case NETWORK_COMMAND_AUTH:{ @@ -288,16 +347,17 @@ static void network_process_packet(network_packet *packet) case NETWORK_COMMAND_MAP:{ uint32 size = args[1]; uint32 offset = args[2]; - if (!_chunkBuffer) { - _chunkBuffer = malloc(0x600000); - } - if (_chunkBuffer) { - int chunksize = packet->size - 4 - 4 - 4; - if (offset + chunksize <= 0x600000) { - memcpy(&_chunkBuffer[offset], packet->data + 4 + 4 + 4, chunksize); + if (offset > 0x600000) { + // too big + } else { + int chunksize = packet.size - 4 - 4 - 4; + if (offset + chunksize > _chunkBuffer.size()) { + _chunkBuffer.resize(offset + chunksize); } + memcpy(&_chunkBuffer[offset], (void*)&packet.GetData()[4 + 4 + 4], chunksize); if (offset + chunksize == size) { - SDL_RWops* rw = SDL_RWFromMem(_chunkBuffer, size); + printf("Loading new map from network...\n"); + SDL_RWops* rw = SDL_RWFromMem(&_chunkBuffer[0], size); if (game_load_sv6(rw)) { game_load_init(); } @@ -313,135 +373,65 @@ static void network_process_packet(network_packet *packet) newsItem.month_year = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); newsItem.day = ((days_in_month[(newsItem.month_year & 7)] * RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16)) >> 16) + 1; newsItem.colour = FORMAT_TOPAZ; - strcpy(newsItem.text, packet->data + 4); + strcpy(newsItem.text, (char*)&packet.GetData()[4]); news_item_add_to_queue_custom(&newsItem); }break; case NETWORK_COMMAND_GAMECMD:{ if (gNetworkStatus == NETWORK_CLIENT) args[1] |= (1 << 31); - game_do_command_p(args[1], &args[2], &args[3], &args[4], &args[5], &args[6], &args[7], &args[8]); + game_do_command_p(args[1], (int*)&args[2], (int*)&args[3], (int*)&args[4], (int*)&args[5], (int*)&args[6], (int*)&args[7], (int*)&args[8]); }break; case NETWORK_COMMAND_TICK:{ gNetworkServerTick = args[1]; }break; } -} - -network_packet* network_alloc_packet(int size) -{ - network_packet* packet = malloc(sizeof(network_packet)); - network_init_packet(packet, size); - return packet; -} - -void network_init_packet(network_packet* packet, int size) -{ - packet->read = 0; - packet->size = size; - packet->data = NULL; - packet->next = NULL; - if (size) { - packet->data = malloc(size); - } -} - -void network_queue_packet(network_packet *packet) -{ - if (!_packetQueue) { - _packetQueue = packet; - return; - } - network_packet* end_packet = _packetQueue; - while (end_packet->next) { - end_packet = end_packet->next; - } - end_packet->next = packet; -} - -void network_send_queued_packets() -{ - while (network_send_packet(_packetQueue)) { - network_packet* sentPacket = _packetQueue; - _packetQueue = _packetQueue->next; - network_close_packet(sentPacket); - free(sentPacket); - } -} - -void network_close_packet(network_packet *packet) -{ - free(packet->data); -} - -int network_send_packet(network_packet *packet) -{ - if (!packet) { - return 0; - } - - SOCKET socket; - - if (gNetworkStatus == NETWORK_NONE) - return 0; - - socket = gNetworkStatus == NETWORK_CLIENT ? _serverSocket : _clientSocket; - - while (1) { - if (packet->read < sizeof(packet->size)) { - // send packet size - uint16 size = htons(packet->size); - int sentBytes = send(socket, &((char*)&size)[packet->read], sizeof(size) - packet->read, 0); - if (sentBytes == SOCKET_ERROR) { - return 0; - } - packet->read += sentBytes; - } else { - // send packet data - int datasent = packet->read - sizeof(packet->size); - int sentBytes = send(socket, &packet->data[datasent], packet->size - datasent, 0); - if (sentBytes == SOCKET_ERROR) { - return 0; - } - packet->read += sentBytes; - if (packet->read == packet->size + sizeof(packet->size)) { - return 1; - } - } - } - return 0; + packet.read = 0; + packet.data->clear(); } void network_send_tick() { - network_packet* packet = network_alloc_packet(4 + sizeof(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32))); - *((uint32*)packet->data) = NETWORK_COMMAND_TICK; - memcpy(packet->data + 4, (char*)&RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), sizeof(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32))); - network_queue_packet(packet); + std::unique_ptr packet = _clientConnection.AllocatePacket(); + packet->Write((uint32)NETWORK_COMMAND_TICK); + packet->Write((uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)); + _clientConnection.QueuePacket(std::move(packet)); } void network_send_map() { int buffersize = 0x600000; - char* buffer = malloc(buffersize); - if (!buffer) { - return; - } - SDL_RWops* rw = SDL_RWFromMem(buffer, buffersize); + std::vector buffer(buffersize); + SDL_RWops* rw = SDL_RWFromMem(&buffer[0], buffersize); scenario_save(rw, 0); int size = (int)SDL_RWtell(rw); int chunksize = 1000; for (int i = 0; i < size; i += chunksize) { int datasize = min(chunksize, size - i); - network_packet* packet = network_alloc_packet(4 + 4 + 4 + datasize); - *((uint32*)packet->data) = NETWORK_COMMAND_MAP; - *((uint32*)packet->data + 1) = size; - *((uint32*)packet->data + 1 + 1) = i; - memcpy(packet->data + 4 + 4 + 4, &buffer[i], datasize); - network_queue_packet(packet); + std::unique_ptr packet = _clientConnection.AllocatePacket(); + packet->Write((uint32)NETWORK_COMMAND_MAP); + packet->Write((uint32)size); + packet->Write((uint32)i); + packet->Write(&buffer[i], datasize); + _clientConnection.QueuePacket(std::move(packet)); } SDL_RWclose(rw); - free(buffer); +} + +void network_send_gamecmd(uint32 command, uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) +{ + NetworkConnection& networkconnection = gNetworkStatus == NETWORK_CLIENT ? _serverConnection : _clientConnection; + std::unique_ptr packet = networkconnection.AllocatePacket(); + packet->Write((uint32)NETWORK_COMMAND_GAMECMD); + packet->Write((uint32)command); + packet->Write((uint32)eax); + packet->Write((uint32)ebx); + packet->Write((uint32)ecx); + packet->Write((uint32)edx); + packet->Write((uint32)esi); + packet->Write((uint32)edi); + packet->Write((uint32)ebp); + networkconnection.QueuePacket(std::move(packet)); } void network_print_error() @@ -466,10 +456,10 @@ static void window_chat_host_textinput() if (!result) return; - network_packet* packet = network_alloc_packet(4 + strlen(text) + 1); - *((uint32*)packet->data) = NETWORK_COMMAND_CHAT; - strcpy(packet->data + 4, text); - network_queue_packet(packet); + std::unique_ptr packet = _clientConnection.AllocatePacket(); + packet->Write((uint32)NETWORK_COMMAND_CHAT); + packet->Write((uint8*)text, strlen(text) + 1); + _clientConnection.QueuePacket(std::move(packet)); window_close(w); } diff --git a/src/network/network.h b/src/network/network.h index c6235992a1..f2e758f8ae 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -23,10 +23,47 @@ #ifndef DISABLE_NETWORK -#include - #include "../common.h" +#ifdef __cplusplus + +#include +#include +#include + +class NetworkPacket +{ +public: + NetworkPacket(); + uint8* GetData(); + template + void Write(T value) { uint8* bytes = (uint8*)&value; data->insert(data->end(), bytes, bytes + sizeof(value)); } + void Write(uint8* bytes, unsigned int size) { data->insert(data->end(), bytes, bytes + size); } + + uint16 size; + std::shared_ptr> data; + int read; +}; + +class NetworkConnection +{ +public: + int ReadPacket(); + void QueuePacket(std::unique_ptr packet); + std::unique_ptr AllocatePacket(); + void SendQueuedPackets(); + + SOCKET socket; + NetworkPacket inboundpacket; + +private: + int SendPacket(NetworkPacket& packet); + std::list> outboundpackets; +}; + +extern "C" { +#endif + typedef struct network_packet network_packet; typedef struct network_packet { @@ -73,16 +110,19 @@ int network_begin_server(int port); void network_end_server(); void network_update(); -network_packet* network_alloc_packet(int size); -void network_queue_packet(network_packet *packet); void network_send_tick(); void network_send_map(); +void network_send_gamecmd(uint32 command, uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); void network_open_chat_box(); void network_print_error(); +#ifdef __cplusplus +} +#endif + #endif /* DISABLE_NETWORK */ #endif \ No newline at end of file diff --git a/src/ride/ride.h b/src/ride/ride.h index 2166b8a37a..1d060c9409 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -858,7 +858,7 @@ enum { #define STATION_DEPART_MASK (~STATION_DEPART_FLAG) // rct2: 0x009ACFA4 -rct_ride_type **gRideTypeList; +extern rct_ride_type **gRideTypeList; // rct2: 0x013628F8 extern rct_ride* g_ride_list; From 21334e307c6e28ff81a0c4d3569186dc0f63b0cc Mon Sep 17 00:00:00 2001 From: zsilencer Date: Tue, 7 Jul 2015 14:52:41 -0600 Subject: [PATCH 0499/1173] move chat window to separate file --- projects/openrct2.vcxproj | 3 +- projects/openrct2.vcxproj.filters | 4 ++ src/interface/keyboard_shortcut.c | 2 +- src/interface/window.h | 1 + src/network/network.cpp | 75 ++++----------------------- src/network/network.h | 3 +- src/windows/network.c | 84 +++++++++++++++++++++++++++++++ 7 files changed, 103 insertions(+), 69 deletions(-) create mode 100644 src/windows/network.c diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index baa73155fe..090335e301 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -74,8 +74,8 @@ + - @@ -97,6 +97,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index b851bb9a90..a1068acb6d 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -499,8 +499,12 @@ Source\Localisation + Source\Network + + Source\Windows + Source\Drawing diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index 8ee523a996..c9b21da0e5 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -496,7 +496,7 @@ static void shortcut_open_cheat_window() static void shortcut_open_chat_window() { - network_open_chat_box(); + window_chat_open(); } static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { diff --git a/src/interface/window.h b/src/interface/window.h index cefafd28df..cd99df869c 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -611,6 +611,7 @@ void window_banner_open(rct_windownumber number); void window_sign_open(rct_windownumber number); void window_sign_small_open(rct_windownumber number); void window_cheats_open(); +void window_chat_open(); void window_research_open(); void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dpi, int baseWidgetIndex); diff --git a/src/network/network.cpp b/src/network/network.cpp index 578530ec69..5198e846c6 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -23,8 +23,8 @@ #include extern "C" { #include "../addresses.h" +#include "../common.h" #include "../game.h" -#include "../interface/window.h" #include "../localisation/date.h" #include "../localisation/localisation.h" #include "../management/news_item.h" @@ -418,6 +418,15 @@ void network_send_map() SDL_RWclose(rw); } +void network_send_chat(const char* text) +{ + NetworkConnection& networkconnection = gNetworkStatus == NETWORK_CLIENT ? _serverConnection : _clientConnection; + std::unique_ptr packet = networkconnection.AllocatePacket(); + packet->Write((uint32)NETWORK_COMMAND_CHAT); + packet->Write((uint8*)text, strlen(text) + 1); + networkconnection.QueuePacket(std::move(packet)); +} + void network_send_gamecmd(uint32 command, uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) { NetworkConnection& networkconnection = gNetworkStatus == NETWORK_CLIENT ? _serverConnection : _clientConnection; @@ -442,68 +451,4 @@ void network_print_error() LocalFree(s); } -static void window_chat_host_emptysub() { } - -static void window_chat_host_textinput() -{ - rct_window *w; - short widgetIndex; - uint8 result; - char *text; - - window_textinput_get_registers(w, widgetIndex, result, text); - - if (!result) - return; - - std::unique_ptr packet = _clientConnection.AllocatePacket(); - packet->Write((uint32)NETWORK_COMMAND_CHAT); - packet->Write((uint8*)text, strlen(text) + 1); - _clientConnection.QueuePacket(std::move(packet)); - - window_close(w); -} - -static void* window_chat_host_events[] = { - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_textinput, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub -}; - -void network_open_chat_box() -{ - rct_window *w; - w = window_create(0, 0, 0, 0, (uint32*)window_chat_host_events, WC_CHAT_HOST, 0); - w->colours[0] = 1; - w->colours[1] = 1; - w->colours[2] = 0; - w->number = 0; - window_text_input_open(w, 0, 6000, 6001, STR_NONE, 0, 64); -} - #endif /* DISABLE_NETWORK */ \ No newline at end of file diff --git a/src/network/network.h b/src/network/network.h index f2e758f8ae..e969b38501 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -113,10 +113,9 @@ void network_update(); void network_send_tick(); void network_send_map(); +void network_send_chat(const char* text); void network_send_gamecmd(uint32 command, uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); -void network_open_chat_box(); - void network_print_error(); #ifdef __cplusplus diff --git a/src/windows/network.c b/src/windows/network.c new file mode 100644 index 0000000000..00ff064b3b --- /dev/null +++ b/src/windows/network.c @@ -0,0 +1,84 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#include "../interface/window.h" +#include "../localisation/localisation.h" +#include "../network/network.h" + +static void window_chat_host_emptysub() { } + +static void window_chat_host_textinput() +{ + rct_window *w; + short widgetIndex; + uint8 result; + char *text; + + window_textinput_get_registers(w, widgetIndex, result, text); + + if (!result) + return; + + network_send_chat(text); + + window_close(w); +} + +static void* window_chat_host_events[] = { + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_textinput, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub, + window_chat_host_emptysub +}; + +void window_chat_open() +{ + rct_window *w; + w = window_create(0, 0, 0, 0, (uint32*)window_chat_host_events, WC_CHAT_HOST, 0); + w->colours[0] = 1; + w->colours[1] = 1; + w->colours[2] = 0; + w->number = 0; + window_text_input_open(w, 0, 6000, 6001, STR_NONE, 0, 64); +} \ No newline at end of file From 802ccfd98e429d2e96268291f75cb3d0a6608de3 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Tue, 7 Jul 2015 19:21:05 -0600 Subject: [PATCH 0500/1173] allow multiple client connections --- src/network/network.cpp | 188 +++++++++++++++++++++++++--------------- src/network/network.h | 3 +- 2 files changed, 121 insertions(+), 70 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 5198e846c6..2c9add27e3 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -43,12 +43,13 @@ uint32 gNetworkServerTick = 0; static network_packet* _packetQueue = NULL; static int _wsaInitialised = 0; static WSADATA _wsaData; -static SOCKET _serverSocket; -static SOCKET _clientSocket; +static SOCKET _listeningSocket = INVALID_SOCKET; +static SOCKET _serverSocket = INVALID_SOCKET; +static SOCKET _clientSocket = INVALID_SOCKET; static network_packet _inboundPacket; static std::vector _chunkBuffer; static NetworkConnection _serverConnection; -static NetworkConnection _clientConnection; +static std::list> _clientConnectionList; static void network_process_packet(NetworkPacket& packet); static int network_send_packet(network_packet *packet); @@ -61,6 +62,16 @@ NetworkPacket::NetworkPacket() data = std::make_shared>(); } +std::unique_ptr NetworkPacket::AllocatePacket() +{ + return std::move(std::make_unique()); +} + +std::unique_ptr NetworkPacket::DuplicatePacket(NetworkPacket& packet) +{ + return std::move(std::make_unique(packet)); +} + uint8* NetworkPacket::GetData() { return &(*data)[0]; @@ -139,11 +150,6 @@ void NetworkConnection::QueuePacket(std::unique_ptr packet) outboundpackets.push_back(std::move(packet)); } -std::unique_ptr NetworkConnection::AllocatePacket() -{ - return std::move(std::unique_ptr(new NetworkPacket)); // can be converted to make_unique in C++14 -} - void NetworkConnection::SendQueuedPackets() { while (outboundpackets.size() > 0 && SendPacket(*(outboundpackets.front()).get())) { @@ -225,7 +231,6 @@ void network_end_client() int network_begin_server(int port) { - SOCKET listeningSocket; SOCKADDR_IN localAddress; u_long iMode; @@ -233,47 +238,36 @@ int network_begin_server(int port) return 0; log_verbose("Begin listening for clients"); - listeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (listeningSocket == INVALID_SOCKET) { + _listeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (_listeningSocket == INVALID_SOCKET) { log_error("Unable to create socket."); return 0; } - + localAddress.sin_family = AF_INET; localAddress.sin_addr.S_un.S_addr = INADDR_ANY; localAddress.sin_port = htons(port); - if (bind(listeningSocket, (SOCKADDR*)&localAddress, sizeof(SOCKADDR_IN)) != 0) { - closesocket(listeningSocket); + if (bind(_listeningSocket, (SOCKADDR*)&localAddress, sizeof(SOCKADDR_IN)) != 0) { + closesocket(_listeningSocket); log_error("Unable to bind to socket."); return 0; } - if (listen(listeningSocket, SOMAXCONN) != 0) { - closesocket(listeningSocket); + if (listen(_listeningSocket, SOMAXCONN) != 0) { + closesocket(_listeningSocket); log_error("Unable to listen on socket."); return 0; } - printf("Waiting for client...\n"); - _clientSocket = accept(listeningSocket, NULL, NULL); - if (_clientSocket == INVALID_SOCKET) { - closesocket(listeningSocket); - log_error("Failed to accept client."); + iMode = 1; + if (ioctlsocket(_listeningSocket, FIONBIO, &iMode) != NO_ERROR) { + closesocket(_listeningSocket); + log_error("Failed to set non-blocking mode."); return 0; } - closesocket(listeningSocket); - - iMode = 1; - if (ioctlsocket(_clientSocket, FIONBIO, &iMode) != NO_ERROR) { - closesocket(_clientSocket); - log_error("Failed to set non-blocking mode."); - } - - printf("Connected to client!\n"); - - _clientConnection.socket = _clientSocket; + printf("Ready for clients...\n"); gNetworkStatus = NETWORK_SERVER; return 1; @@ -285,16 +279,23 @@ void network_end_server() closesocket(_clientSocket); } -void network_update() +void network_add_client(SOCKET socket) +{ + printf("New client connection\n"); + auto networkconnection = std::make_unique(); + networkconnection->socket = socket; + _clientConnectionList.push_back(std::move(networkconnection)); +} + +void network_remove_client(std::unique_ptr& networkconnection) +{ + printf("Client removed\n"); + _clientConnectionList.remove(networkconnection); +} + +int network_process_connection(NetworkConnection& networkconnection) { int packetStatus; - static uint32 lastTickUpdate = 0; - - if (gNetworkStatus == NETWORK_NONE) - return; - - NetworkConnection& networkconnection = gNetworkStatus == NETWORK_CLIENT ? _serverConnection : _clientConnection; - do { packetStatus = networkconnection.ReadPacket(); switch(packetStatus) { @@ -303,11 +304,10 @@ void network_update() if (gNetworkStatus == NETWORK_CLIENT) { network_end_client(); printf("Server disconnected...\n"); - return; + return 0; } else if (gNetworkStatus == NETWORK_SERVER) { - network_end_server(); printf("Client disconnected...\n"); - return; + return 0; } break; case NETWORK_SUCCESS: @@ -321,15 +321,48 @@ void network_update() break; } } while (packetStatus == NETWORK_MORE_DATA || packetStatus == NETWORK_SUCCESS); + networkconnection.SendQueuedPackets(); + return 1; +} - if (gNetworkStatus == NETWORK_SERVER) { +void network_update() +{ + static uint32 lastTickUpdate = 0; + u_long iMode; + + if (gNetworkStatus == NETWORK_NONE) + return; + + if (gNetworkStatus == NETWORK_CLIENT) { + network_process_connection(_serverConnection); + } else { + for(auto it = _clientConnectionList.begin(); it != _clientConnectionList.end(); it++) { + if (!network_process_connection(*(*it))) { + network_remove_client((*it)); + it = _clientConnectionList.begin(); + } + } if (SDL_GetTicks() - lastTickUpdate >= 100) { lastTickUpdate = SDL_GetTicks(); network_send_tick(); } + SOCKET socket = accept(_listeningSocket, NULL, NULL); + if (socket == INVALID_SOCKET) { + if (WSAGetLastError() != WSAEWOULDBLOCK) { + network_print_error(); + closesocket(_listeningSocket); + log_error("Failed to accept client."); + } + } else { + iMode = 1; + if (ioctlsocket(socket, FIONBIO, &iMode) != NO_ERROR) { + closesocket(socket); + log_error("Failed to set non-blocking mode."); + } else { + network_add_client(socket); + } + } } - - networkconnection.SendQueuedPackets(); } static void network_process_packet(NetworkPacket& packet) @@ -392,45 +425,56 @@ static void network_process_packet(NetworkPacket& packet) void network_send_tick() { - std::unique_ptr packet = _clientConnection.AllocatePacket(); + std::unique_ptr packet = NetworkPacket::AllocatePacket(); packet->Write((uint32)NETWORK_COMMAND_TICK); packet->Write((uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)); - _clientConnection.QueuePacket(std::move(packet)); + for(auto it = _clientConnectionList.begin(); it != _clientConnectionList.end(); it++) { + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); + } + } void network_send_map() { - int buffersize = 0x600000; - std::vector buffer(buffersize); - SDL_RWops* rw = SDL_RWFromMem(&buffer[0], buffersize); - scenario_save(rw, 0); - int size = (int)SDL_RWtell(rw); - int chunksize = 1000; - for (int i = 0; i < size; i += chunksize) { - int datasize = min(chunksize, size - i); - std::unique_ptr packet = _clientConnection.AllocatePacket(); - packet->Write((uint32)NETWORK_COMMAND_MAP); - packet->Write((uint32)size); - packet->Write((uint32)i); - packet->Write(&buffer[i], datasize); - _clientConnection.QueuePacket(std::move(packet)); + if (gNetworkStatus == NETWORK_SERVER) { + int buffersize = 0x600000; + std::vector buffer(buffersize); + SDL_RWops* rw = SDL_RWFromMem(&buffer[0], buffersize); + scenario_save(rw, 0); + int size = (int)SDL_RWtell(rw); + int chunksize = 1000; + for (int i = 0; i < size; i += chunksize) { + int datasize = min(chunksize, size - i); + std::unique_ptr packet = NetworkPacket::AllocatePacket(); + packet->Write((uint32)NETWORK_COMMAND_MAP); + packet->Write((uint32)size); + packet->Write((uint32)i); + packet->Write(&buffer[i], datasize); + for(auto it = _clientConnectionList.begin(); it != _clientConnectionList.end(); it++) { + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); + } + } + SDL_RWclose(rw); } - SDL_RWclose(rw); } void network_send_chat(const char* text) { - NetworkConnection& networkconnection = gNetworkStatus == NETWORK_CLIENT ? _serverConnection : _clientConnection; - std::unique_ptr packet = networkconnection.AllocatePacket(); + std::unique_ptr packet = NetworkPacket::AllocatePacket(); packet->Write((uint32)NETWORK_COMMAND_CHAT); packet->Write((uint8*)text, strlen(text) + 1); - networkconnection.QueuePacket(std::move(packet)); + if (gNetworkStatus == NETWORK_SERVER) { + for(auto it = _clientConnectionList.begin(); it != _clientConnectionList.end(); it++) { + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); + } + } else { + _serverConnection.QueuePacket(std::move(packet)); + } } void network_send_gamecmd(uint32 command, uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) { - NetworkConnection& networkconnection = gNetworkStatus == NETWORK_CLIENT ? _serverConnection : _clientConnection; - std::unique_ptr packet = networkconnection.AllocatePacket(); + std::unique_ptr packet = NetworkPacket::AllocatePacket(); packet->Write((uint32)NETWORK_COMMAND_GAMECMD); packet->Write((uint32)command); packet->Write((uint32)eax); @@ -440,7 +484,13 @@ void network_send_gamecmd(uint32 command, uint32 eax, uint32 ebx, uint32 ecx, ui packet->Write((uint32)esi); packet->Write((uint32)edi); packet->Write((uint32)ebp); - networkconnection.QueuePacket(std::move(packet)); + if (gNetworkStatus == NETWORK_SERVER) { + for(auto it = _clientConnectionList.begin(); it != _clientConnectionList.end(); it++) { + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); + } + } else { + _serverConnection.QueuePacket(std::move(packet)); + } } void network_print_error() diff --git a/src/network/network.h b/src/network/network.h index e969b38501..05c12a7cd2 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -35,6 +35,8 @@ class NetworkPacket { public: NetworkPacket(); + static std::unique_ptr AllocatePacket(); + static std::unique_ptr DuplicatePacket(NetworkPacket& packet); uint8* GetData(); template void Write(T value) { uint8* bytes = (uint8*)&value; data->insert(data->end(), bytes, bytes + sizeof(value)); } @@ -50,7 +52,6 @@ class NetworkConnection public: int ReadPacket(); void QueuePacket(std::unique_ptr packet); - std::unique_ptr AllocatePacket(); void SendQueuedPackets(); SOCKET socket; From f883e7a8dac1395b7f06db8cc5f8b450dde78b0a Mon Sep 17 00:00:00 2001 From: zsilencer Date: Wed, 8 Jul 2015 20:19:12 -0600 Subject: [PATCH 0501/1173] get game commands working a bit better --- src/game.c | 30 ++++++++------------- src/network/network.cpp | 58 +++++++++++++++++++++++++++++++++-------- src/network/network.h | 3 ++- src/openrct2.c | 1 - 4 files changed, 60 insertions(+), 32 deletions(-) diff --git a/src/game.c b/src/game.c index f0fb5946fa..c291516456 100644 --- a/src/game.c +++ b/src/game.c @@ -310,6 +310,7 @@ void game_update() void game_logic_update() { + network_update(); if (gNetworkStatus == NETWORK_CLIENT) { if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) == gNetworkServerTick) { return; @@ -403,24 +404,6 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * int cost, flags, insufficientFunds; int original_ebx, original_edx, original_esi, original_edi, original_ebp; - int sendPacket = 0; - if (gNetworkStatus == NETWORK_CLIENT) { - if (command & (1 << 31)) { - command &= ~(1 << 31); - } else { - sendPacket = 1; - } - } else if (gNetworkStatus == NETWORK_SERVER) { - sendPacket = 1; - } - - if (sendPacket) { - network_send_gamecmd((uint32)command, (uint32)*eax, (uint32)*ebx, (uint32)*ecx, (uint32)*edx, (uint32)*esi, (uint32)*edi, (uint32)*ebp); - - if (gNetworkStatus == NETWORK_CLIENT) - return MONEY32_UNDEFINED; - } - *esi = command; original_ebx = *ebx; original_edx = *edx; @@ -457,12 +440,21 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * *edi = original_edi; *ebp = original_ebp; - if (!(flags & 1)) { + if (!(flags & GAME_COMMAND_FLAG_APPLY)) { // Decrement nest count RCT2_GLOBAL(0x009A8C28, uint8)--; return cost; } + if (gNetworkStatus != NETWORK_NONE && !(flags & (1 << 31)) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { + network_send_gamecmd(*eax, *ebx, *ecx, *edx, *esi, *edi, *ebp); + if (gNetworkStatus == NETWORK_CLIENT) { + // Decrement nest count + RCT2_GLOBAL(0x009A8C28, uint8)--; + return cost; + } + } + // Secondary command if (game_do_command_table[command] == 0) { new_game_command_table[command](eax, ebx, ecx, edx, esi, edi, ebp); diff --git a/src/network/network.cpp b/src/network/network.cpp index 2c9add27e3..f3db7eaab8 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -21,6 +21,7 @@ #ifndef DISABLE_NETWORK #include +#include extern "C" { #include "../addresses.h" #include "../common.h" @@ -40,6 +41,16 @@ int gNetworkStartPort = NETWORK_DEFAULT_PORT; int gNetworkStatus = NETWORK_NONE; uint32 gNetworkServerTick = 0; +struct GameCommand +{ + GameCommand(uint32 args[8]) { tick = args[0], eax = args[1], ebx = args[2], ecx = args[3], edx = args[4], esi = args[5], edi = args[6], ebp = args[7]; }; + uint32 tick; + uint32 eax, ebx, ecx, edx, esi, edi, ebp; + bool operator<(const GameCommand& comp) const { + return tick < comp.tick; + } +}; + static network_packet* _packetQueue = NULL; static int _wsaInitialised = 0; static WSADATA _wsaData; @@ -50,6 +61,7 @@ static network_packet _inboundPacket; static std::vector _chunkBuffer; static NetworkConnection _serverConnection; static std::list> _clientConnectionList; +static std::multiset _gameCommandQueue; static void network_process_packet(NetworkPacket& packet); static int network_send_packet(network_packet *packet); @@ -77,6 +89,12 @@ uint8* NetworkPacket::GetData() return &(*data)[0]; } +void NetworkPacket::Clear() +{ + read = 0; + data->clear(); +} + int NetworkConnection::ReadPacket() { if (inboundpacket.read < sizeof(inboundpacket.size)) { @@ -325,6 +343,18 @@ int network_process_connection(NetworkConnection& networkconnection) return 1; } +void network_process_gamecmdqueue() +{ + while (_gameCommandQueue.begin() != _gameCommandQueue.end() && _gameCommandQueue.begin()->tick < RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)) { + _gameCommandQueue.erase(_gameCommandQueue.begin()); + } + while (_gameCommandQueue.begin() != _gameCommandQueue.end() && _gameCommandQueue.begin()->tick == RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)) { + const GameCommand& gc = (*_gameCommandQueue.begin()); + game_do_command(gc.eax, gc.ebx, gc.ecx, gc.edx, gc.esi, gc.edi, gc.ebp); + _gameCommandQueue.erase(_gameCommandQueue.begin()); + } +} + void network_update() { static uint32 lastTickUpdate = 0; @@ -335,14 +365,18 @@ void network_update() if (gNetworkStatus == NETWORK_CLIENT) { network_process_connection(_serverConnection); + network_process_gamecmdqueue(); } else { - for(auto it = _clientConnectionList.begin(); it != _clientConnectionList.end(); it++) { + auto it = _clientConnectionList.begin(); + while(it != _clientConnectionList.end()) { if (!network_process_connection(*(*it))) { network_remove_client((*it)); it = _clientConnectionList.begin(); + } else { + it++; } } - if (SDL_GetTicks() - lastTickUpdate >= 100) { + if (SDL_GetTicks() - lastTickUpdate >= 25) { lastTickUpdate = SDL_GetTicks(); network_send_tick(); } @@ -410,17 +444,19 @@ static void network_process_packet(NetworkPacket& packet) news_item_add_to_queue_custom(&newsItem); }break; case NETWORK_COMMAND_GAMECMD:{ - if (gNetworkStatus == NETWORK_CLIENT) - args[1] |= (1 << 31); - - game_do_command_p(args[1], (int*)&args[2], (int*)&args[3], (int*)&args[4], (int*)&args[5], (int*)&args[6], (int*)&args[7], (int*)&args[8]); + if (gNetworkStatus == NETWORK_SERVER) { + network_send_gamecmd(args[2], args[3], args[4], args[5], args[6], args[7], args[8]); + game_do_command(args[2], args[3], args[4], args[5], args[6], args[7], args[8]); + } else { + GameCommand gc = GameCommand(&args[1]); + _gameCommandQueue.insert(gc); + } }break; case NETWORK_COMMAND_TICK:{ gNetworkServerTick = args[1]; }break; } - packet.read = 0; - packet.data->clear(); + packet.Clear(); } void network_send_tick() @@ -472,13 +508,13 @@ void network_send_chat(const char* text) } } -void network_send_gamecmd(uint32 command, uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) +void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) { std::unique_ptr packet = NetworkPacket::AllocatePacket(); packet->Write((uint32)NETWORK_COMMAND_GAMECMD); - packet->Write((uint32)command); + packet->Write((uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)); packet->Write((uint32)eax); - packet->Write((uint32)ebx); + packet->Write((uint32)ebx | (1 << 31)); packet->Write((uint32)ecx); packet->Write((uint32)edx); packet->Write((uint32)esi); diff --git a/src/network/network.h b/src/network/network.h index 05c12a7cd2..d2f1d67837 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -41,6 +41,7 @@ public: template void Write(T value) { uint8* bytes = (uint8*)&value; data->insert(data->end(), bytes, bytes + sizeof(value)); } void Write(uint8* bytes, unsigned int size) { data->insert(data->end(), bytes, bytes + size); } + void Clear(); uint16 size; std::shared_ptr> data; @@ -115,7 +116,7 @@ void network_update(); void network_send_tick(); void network_send_map(); void network_send_chat(const char* text); -void network_send_gamecmd(uint32 command, uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); +void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); void network_print_error(); diff --git a/src/openrct2.c b/src/openrct2.c index 29bcbb28e8..1a6f283797 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -383,7 +383,6 @@ static void openrct2_loop() lastTick = currentTick; platform_process_messages(); - network_update(); rct2_update(); From f7be55eb9d38e2e65b133277bc80ccb116d7acd6 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Wed, 8 Jul 2015 21:35:37 -0600 Subject: [PATCH 0502/1173] fix cmake compile errors fix cmake compile errors --- projects/openrct2.vcxproj | 6 +++--- src/network/network.cpp | 13 ++++--------- src/network/network.h | 16 +++++----------- 3 files changed, 12 insertions(+), 23 deletions(-) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 090335e301..4aa7770319 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -344,7 +344,7 @@ Disabled true 1Byte - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_CURL_STATICLIB;%(PreprocessorDefinitions) MultiThreaded true $(IntDir)fake\%(RelativeDir) @@ -375,7 +375,7 @@ xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" false - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;CURL_STATICLIB;%(PreprocessorDefinitions) $(IntDir)fake\%(RelativeDir) true Speed @@ -415,7 +415,7 @@ xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" false - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;ENABLE_TESTS;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;CURL_STATICLIB;ENABLE_TESTS;%(PreprocessorDefinitions) $(IntDir)fake\%(RelativeDir) true diff --git a/src/network/network.cpp b/src/network/network.cpp index f3db7eaab8..e935e4513f 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -22,16 +22,15 @@ #include #include +#include "network.h" extern "C" { #include "../addresses.h" -#include "../common.h" #include "../game.h" #include "../localisation/date.h" #include "../localisation/localisation.h" #include "../management/news_item.h" #include "../scenario.h" } -#include "network.h" #pragma comment(lib, "Ws2_32.lib") @@ -51,21 +50,17 @@ struct GameCommand } }; -static network_packet* _packetQueue = NULL; static int _wsaInitialised = 0; static WSADATA _wsaData; static SOCKET _listeningSocket = INVALID_SOCKET; static SOCKET _serverSocket = INVALID_SOCKET; static SOCKET _clientSocket = INVALID_SOCKET; -static network_packet _inboundPacket; static std::vector _chunkBuffer; static NetworkConnection _serverConnection; static std::list> _clientConnectionList; static std::multiset _gameCommandQueue; static void network_process_packet(NetworkPacket& packet); -static int network_send_packet(network_packet *packet); -static void network_send_queued_packets(); NetworkPacket::NetworkPacket() { @@ -76,12 +71,12 @@ NetworkPacket::NetworkPacket() std::unique_ptr NetworkPacket::AllocatePacket() { - return std::move(std::make_unique()); + return std::move(std::unique_ptr(new NetworkPacket)); // change to make_unique in c++14 } std::unique_ptr NetworkPacket::DuplicatePacket(NetworkPacket& packet) { - return std::move(std::make_unique(packet)); + return std::move(std::unique_ptr(new NetworkPacket(packet))); // change to make_unique in c++14 } uint8* NetworkPacket::GetData() @@ -300,7 +295,7 @@ void network_end_server() void network_add_client(SOCKET socket) { printf("New client connection\n"); - auto networkconnection = std::make_unique(); + auto networkconnection = std::unique_ptr(new NetworkConnection); // change to make_unique in c++14 networkconnection->socket = socket; _clientConnectionList.push_back(std::move(networkconnection)); } diff --git a/src/network/network.h b/src/network/network.h index d2f1d67837..09f96dbbda 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -23,13 +23,16 @@ #ifndef DISABLE_NETWORK -#include "../common.h" - #ifdef __cplusplus #include #include #include +#include +extern "C" { +#include "../common.h" +#include "../platform/platform.h" +} class NetworkPacket { @@ -66,15 +69,6 @@ private: extern "C" { #endif -typedef struct network_packet network_packet; - -typedef struct network_packet { - uint16 size; - uint8* data; - int read; - network_packet* next; -} network_packet; - #define NETWORK_DEFAULT_PORT 11753 enum { From 73211b4215224441b5492887fe33f037ff5ee6d9 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Fri, 10 Jul 2015 12:21:49 -0600 Subject: [PATCH 0503/1173] fix chat window for new window code --- src/windows/network.c | 70 +++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 40 deletions(-) diff --git a/src/windows/network.c b/src/windows/network.c index 00ff064b3b..edd07219d2 100644 --- a/src/windows/network.c +++ b/src/windows/network.c @@ -24,58 +24,48 @@ static void window_chat_host_emptysub() { } -static void window_chat_host_textinput() +static void window_chat_host_textinput(rct_window *w, int widgetIndex, char *text) { - rct_window *w; - short widgetIndex; - uint8 result; - char *text; - - window_textinput_get_registers(w, widgetIndex, result, text); - - if (!result) - return; - network_send_chat(text); window_close(w); } -static void* window_chat_host_events[] = { - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, +static rct_window_event_list window_chat_host_events = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, window_chat_host_textinput, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub, - window_chat_host_emptysub + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL }; void window_chat_open() { rct_window *w; - w = window_create(0, 0, 0, 0, (uint32*)window_chat_host_events, WC_CHAT_HOST, 0); + w = window_create(0, 0, 0, 0, &window_chat_host_events, WC_CHAT_HOST, 0); w->colours[0] = 1; w->colours[1] = 1; w->colours[2] = 0; From 149b3d86af8cfba81839cbbde44705a6d4963953 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Fri, 10 Jul 2015 13:53:41 -0600 Subject: [PATCH 0504/1173] network refactoring --- src/cmdline.c | 8 +- src/cmdline.h | 4 + src/game.c | 15 +- src/network/network.cpp | 543 ++++++++++++++++++++++------------------ src/network/network.h | 97 ++++--- src/openrct2.c | 4 +- 6 files changed, 381 insertions(+), 290 deletions(-) diff --git a/src/cmdline.c b/src/cmdline.c index b15160ffb4..10d0b78169 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -46,6 +46,10 @@ typedef int (*cmdline_action)(const char **argv, int argc); int gExitCode = 0; +int gNetworkStart = NETWORK_MODE_NONE; +char gNetworkStartHost[128]; +int gNetworkStartPort = NETWORK_DEFAULT_PORT; + static void print_launch_information(); static int cmdline_call_action(const char **argv, int argc); @@ -93,12 +97,12 @@ int cmdline_run(const char **argv, int argc) _log_levels[DIAGNOSTIC_LEVEL_VERBOSE] = 1; if (port != 0) { - gNetworkStart = NETWORK_SERVER; + gNetworkStart = NETWORK_MODE_SERVER; gNetworkStartPort = port; } if (server != NULL) { - gNetworkStart = NETWORK_CLIENT; + gNetworkStart = NETWORK_MODE_CLIENT; strncpy(gNetworkStartHost, server, sizeof(gNetworkStartHost)); } diff --git a/src/cmdline.h b/src/cmdline.h index b86393f047..f8e99229d1 100644 --- a/src/cmdline.h +++ b/src/cmdline.h @@ -28,6 +28,10 @@ extern int gExitCode; int sprite_mode; +extern int gNetworkStart; +extern char gNetworkStartHost[128]; +extern int gNetworkStartPort; + int cmdline_run(const char **argv, int argc); int cmdline_for_sprite(const char **argv, int argc); diff --git a/src/game.c b/src/game.c index c291516456..8bfadc4d32 100644 --- a/src/game.c +++ b/src/game.c @@ -233,8 +233,8 @@ void game_update() numUpdates = clamp(1, numUpdates, 4); } - if (gNetworkStatus == NETWORK_CLIENT) { - if (gNetworkServerTick - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) >= 10) { + if (network_get_mode() == NETWORK_MODE_CLIENT) { + if (network_get_server_tick() - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) >= 10) { // make sure client doesn't fall behind the server too much numUpdates += 10; } @@ -311,8 +311,9 @@ void game_update() void game_logic_update() { network_update(); - if (gNetworkStatus == NETWORK_CLIENT) { - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) == gNetworkServerTick) { + if (network_get_mode() == NETWORK_MODE_CLIENT) { + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) == network_get_server_tick()) { + // dont run past the server return; } } @@ -446,9 +447,9 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * return cost; } - if (gNetworkStatus != NETWORK_NONE && !(flags & (1 << 31)) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { + if (network_get_mode() != NETWORK_MODE_NONE && !(flags & (1 << 31)) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { network_send_gamecmd(*eax, *ebx, *ecx, *edx, *esi, *edi, *ebp); - if (gNetworkStatus == NETWORK_CLIENT) { + if (network_get_mode() == NETWORK_MODE_CLIENT) { // Decrement nest count RCT2_GLOBAL(0x009A8C28, uint8)--; return cost; @@ -735,7 +736,7 @@ int game_load_sv6(SDL_RWops* rw) reset_0x69EBE4(); openrct2_reset_object_tween_locations(); game_convert_strings_to_utf8(); - if (gNetworkStatus == NETWORK_SERVER) { + if (network_get_mode() == NETWORK_MODE_SERVER) { network_send_map(); } return 1; diff --git a/src/network/network.cpp b/src/network/network.cpp index e935e4513f..387fcbad10 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -34,33 +34,24 @@ extern "C" { #pragma comment(lib, "Ws2_32.lib") -int gNetworkStart = NETWORK_NONE; -char gNetworkStartHost[128]; -int gNetworkStartPort = NETWORK_DEFAULT_PORT; -int gNetworkStatus = NETWORK_NONE; -uint32 gNetworkServerTick = 0; +Network gNetwork; -struct GameCommand -{ - GameCommand(uint32 args[8]) { tick = args[0], eax = args[1], ebx = args[2], ecx = args[3], edx = args[4], esi = args[5], edi = args[6], ebp = args[7]; }; - uint32 tick; - uint32 eax, ebx, ecx, edx, esi, edi, ebp; - bool operator<(const GameCommand& comp) const { - return tick < comp.tick; - } +enum { + NETWORK_SUCCESS, + NETWORK_NO_DATA, + NETWORK_MORE_DATA, + NETWORK_DISCONNECTED }; -static int _wsaInitialised = 0; -static WSADATA _wsaData; -static SOCKET _listeningSocket = INVALID_SOCKET; -static SOCKET _serverSocket = INVALID_SOCKET; -static SOCKET _clientSocket = INVALID_SOCKET; -static std::vector _chunkBuffer; -static NetworkConnection _serverConnection; -static std::list> _clientConnectionList; -static std::multiset _gameCommandQueue; - -static void network_process_packet(NetworkPacket& packet); +enum { + NETWORK_COMMAND_AUTH, + NETWORK_COMMAND_MAP, + NETWORK_COMMAND_CHAT, + NETWORK_COMMAND_GAMECMD, + NETWORK_COMMAND_TICK, + NETWORK_COMMAND_PLAYER, + NETWORK_COMMAND_MAX +}; NetworkPacket::NetworkPacket() { @@ -129,10 +120,6 @@ int NetworkConnection::ReadPacket() int NetworkConnection::SendPacket(NetworkPacket& packet) { - if (gNetworkStatus == NETWORK_NONE) { - return 0; - } - while (1) { if (packet.read < sizeof(packet.size)) { // send packet size @@ -170,231 +157,289 @@ void NetworkConnection::SendQueuedPackets() } } -int network_init() +Network::Network() { - if (!_wsaInitialised) { + wsa_initialized = false; + mode = NETWORK_MODE_NONE; + last_tick_sent_time = 0; +} + +Network::~Network() +{ + Close(); +} + +bool Network::Init() +{ + if (!wsa_initialized) { log_verbose("Initialising WSA"); - if (WSAStartup(MAKEWORD(2, 2), &_wsaData) != 0) { + WSADATA wsa_data; + if (WSAStartup(MAKEWORD(2, 2), &wsa_data) != 0) { log_error("Unable to initialise winsock."); - return 0; + return false; } - _wsaInitialised = 1; + wsa_initialized = true; + } + return true; +} + +void Network::Close() +{ + if (mode == NETWORK_MODE_CLIENT) { + mode = NETWORK_MODE_NONE; + closesocket(server_socket); + } else + if (mode == NETWORK_MODE_SERVER) { + mode = NETWORK_MODE_NONE; + closesocket(listening_socket); + for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + closesocket((*it)->socket); + } + client_connection_list.clear(); } - return 1; + if (wsa_initialized) { + WSACleanup(); + wsa_initialized = false; + } } -void network_close() +bool Network::BeginClient(const char* host, unsigned short port) { - if (!_wsaInitialised) - return; + if (!Init()) + return false; - if (gNetworkStatus == NETWORK_CLIENT) - network_end_client(); - else if (gNetworkStatus == NETWORK_SERVER) - network_end_server(); - - log_verbose("Closing WSA"); - WSACleanup(); - _wsaInitialised = 0; -} - -int network_begin_client(const char *host, int port) -{ - SOCKADDR_IN serverAddress; - u_long iMode; - - if (!network_init()) - return 0; - - _serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (_serverSocket == INVALID_SOCKET) { + server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (server_socket == INVALID_SOCKET) { log_error("Unable to create socket."); return 0; } - serverAddress.sin_family = AF_INET; - serverAddress.sin_addr.S_un.S_addr = inet_addr(host); - serverAddress.sin_port = htons(port); + SOCKADDR_IN server_address; + server_address.sin_family = AF_INET; + server_address.sin_addr.S_un.S_addr = inet_addr(host); + server_address.sin_port = htons(port); - if (connect(_serverSocket, (SOCKADDR*)&serverAddress, sizeof(SOCKADDR_IN)) != 0) { + if (connect(server_socket, (SOCKADDR*)&server_address, sizeof(SOCKADDR_IN)) != 0) { log_error("Unable to connect to host."); - return 0; + return false; } else { printf("Connected to server!\n"); } - iMode = 1; - if (ioctlsocket(_serverSocket, FIONBIO, &iMode) != NO_ERROR) { - closesocket(_serverSocket); + u_long nonblocking = 1; + if (ioctlsocket(server_socket, FIONBIO, &nonblocking) != NO_ERROR) { + closesocket(server_socket); log_error("Failed to set non-blocking mode."); } - _serverConnection.socket = _serverSocket; + server_connection.socket = server_socket; - gNetworkStatus = NETWORK_CLIENT; - return 1; + mode = NETWORK_MODE_CLIENT; + return true; } -void network_end_client() +bool Network::BeginServer(unsigned short port) { - gNetworkStatus = NETWORK_NONE; - closesocket(_serverSocket); -} - -int network_begin_server(int port) -{ - SOCKADDR_IN localAddress; - u_long iMode; - - if (!network_init()) - return 0; + if (!Init()) + return false; log_verbose("Begin listening for clients"); - _listeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (_listeningSocket == INVALID_SOCKET) { + listening_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (listening_socket == INVALID_SOCKET) { log_error("Unable to create socket."); - return 0; + return false; } - - localAddress.sin_family = AF_INET; - localAddress.sin_addr.S_un.S_addr = INADDR_ANY; - localAddress.sin_port = htons(port); - if (bind(_listeningSocket, (SOCKADDR*)&localAddress, sizeof(SOCKADDR_IN)) != 0) { - closesocket(_listeningSocket); + SOCKADDR_IN local_address; + local_address.sin_family = AF_INET; + local_address.sin_addr.S_un.S_addr = INADDR_ANY; + local_address.sin_port = htons(port); + + if (bind(listening_socket, (SOCKADDR*)&local_address, sizeof(SOCKADDR_IN)) != 0) { + closesocket(listening_socket); log_error("Unable to bind to socket."); - return 0; + return false; } - if (listen(_listeningSocket, SOMAXCONN) != 0) { - closesocket(_listeningSocket); + if (listen(listening_socket, SOMAXCONN) != 0) { + closesocket(listening_socket); log_error("Unable to listen on socket."); - return 0; + return false; } - iMode = 1; - if (ioctlsocket(_listeningSocket, FIONBIO, &iMode) != NO_ERROR) { - closesocket(_listeningSocket); + u_long nonblocking = 1; + if (ioctlsocket(listening_socket, FIONBIO, &nonblocking) != NO_ERROR) { + closesocket(listening_socket); log_error("Failed to set non-blocking mode."); - return 0; + return false; } printf("Ready for clients...\n"); - gNetworkStatus = NETWORK_SERVER; - return 1; + mode = NETWORK_MODE_SERVER; + return true; } -void network_end_server() +int Network::GetMode() { - gNetworkStatus = NETWORK_NONE; - closesocket(_clientSocket); + return mode; } -void network_add_client(SOCKET socket) +uint32 Network::GetServerTick() { - printf("New client connection\n"); - auto networkconnection = std::unique_ptr(new NetworkConnection); // change to make_unique in c++14 - networkconnection->socket = socket; - _clientConnectionList.push_back(std::move(networkconnection)); + return server_tick; } -void network_remove_client(std::unique_ptr& networkconnection) +void Network::Update() { - printf("Client removed\n"); - _clientConnectionList.remove(networkconnection); + if (GetMode() == NETWORK_MODE_NONE) + return; + + if (GetMode() == NETWORK_MODE_CLIENT) { + if (!ProcessConnection(server_connection)) { + Close(); + } else { + ProcessGameCommandQueue(); + } + } else + if (GetMode() == NETWORK_MODE_SERVER) { + auto it = client_connection_list.begin(); + while(it != client_connection_list.end()) { + if (!ProcessConnection(*(*it))) { + RemoveClient((*it)); + it = client_connection_list.begin(); + } else { + it++; + } + } + if (SDL_GetTicks() - last_tick_sent_time >= 25) { + last_tick_sent_time = SDL_GetTicks(); + Send_TICK(); + } + SOCKET socket = accept(listening_socket, NULL, NULL); + if (socket == INVALID_SOCKET) { + if (WSAGetLastError() != WSAEWOULDBLOCK) { + PrintError(); + log_error("Failed to accept client."); + } + } else { + u_long nonblocking = 1; + if (ioctlsocket(socket, FIONBIO, &nonblocking) != NO_ERROR) { + closesocket(socket); + log_error("Failed to set non-blocking mode."); + } else { + AddClient(socket); + } + } + } } -int network_process_connection(NetworkConnection& networkconnection) +void Network::Send_TICK() +{ + std::unique_ptr packet = NetworkPacket::AllocatePacket(); + packet->Write((uint32)NETWORK_COMMAND_TICK); + packet->Write((uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)); + for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); + } + +} + +void Network::Send_MAP() +{ + if (GetMode() == NETWORK_MODE_SERVER) { + int buffersize = 0x600000; + std::vector buffer(buffersize); + SDL_RWops* rw = SDL_RWFromMem(&buffer[0], buffersize); + scenario_save(rw, 0); + int size = (int)SDL_RWtell(rw); + int chunksize = 1000; + for (int i = 0; i < size; i += chunksize) { + int datasize = min(chunksize, size - i); + std::unique_ptr packet = NetworkPacket::AllocatePacket(); + packet->Write((uint32)NETWORK_COMMAND_MAP); + packet->Write((uint32)size); + packet->Write((uint32)i); + packet->Write(&buffer[i], datasize); + for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); + } + } + SDL_RWclose(rw); + } +} + +void Network::Send_CHAT(const char* text) +{ + std::unique_ptr packet = NetworkPacket::AllocatePacket(); + packet->Write((uint32)NETWORK_COMMAND_CHAT); + packet->Write((uint8*)text, strlen(text) + 1); + if (GetMode() == NETWORK_MODE_SERVER) { + for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); + } + } else { + server_connection.QueuePacket(std::move(packet)); + } +} + +void Network::Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) +{ + std::unique_ptr packet = NetworkPacket::AllocatePacket(); + packet->Write((uint32)NETWORK_COMMAND_GAMECMD); + packet->Write((uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)); + packet->Write((uint32)eax); + packet->Write((uint32)ebx | (1 << 31)); + packet->Write((uint32)ecx); + packet->Write((uint32)edx); + packet->Write((uint32)esi); + packet->Write((uint32)edi); + packet->Write((uint32)ebp); + if (GetMode() == NETWORK_MODE_SERVER) { + for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); + } + } else { + server_connection.QueuePacket(std::move(packet)); + } +} + +bool Network::ProcessConnection(NetworkConnection& connection) { int packetStatus; do { - packetStatus = networkconnection.ReadPacket(); + packetStatus = connection.ReadPacket(); switch(packetStatus) { case NETWORK_DISCONNECTED: - network_print_error(); - if (gNetworkStatus == NETWORK_CLIENT) { - network_end_client(); + // closed connection or network error + PrintError(); + if (GetMode() == NETWORK_MODE_CLIENT) { printf("Server disconnected...\n"); - return 0; - } else if (gNetworkStatus == NETWORK_SERVER) { + return false; + } else + if (GetMode() == NETWORK_MODE_SERVER) { printf("Client disconnected...\n"); - return 0; + return false; } break; case NETWORK_SUCCESS: // done reading in packet - network_process_packet(networkconnection.inboundpacket); + ProcessPacket(connection.inboundpacket); break; case NETWORK_MORE_DATA: // more data required to be read break; case NETWORK_NO_DATA: + // could not read anything from socket break; } } while (packetStatus == NETWORK_MORE_DATA || packetStatus == NETWORK_SUCCESS); - networkconnection.SendQueuedPackets(); - return 1; + connection.SendQueuedPackets(); + return true; } -void network_process_gamecmdqueue() -{ - while (_gameCommandQueue.begin() != _gameCommandQueue.end() && _gameCommandQueue.begin()->tick < RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)) { - _gameCommandQueue.erase(_gameCommandQueue.begin()); - } - while (_gameCommandQueue.begin() != _gameCommandQueue.end() && _gameCommandQueue.begin()->tick == RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)) { - const GameCommand& gc = (*_gameCommandQueue.begin()); - game_do_command(gc.eax, gc.ebx, gc.ecx, gc.edx, gc.esi, gc.edi, gc.ebp); - _gameCommandQueue.erase(_gameCommandQueue.begin()); - } -} - -void network_update() -{ - static uint32 lastTickUpdate = 0; - u_long iMode; - - if (gNetworkStatus == NETWORK_NONE) - return; - - if (gNetworkStatus == NETWORK_CLIENT) { - network_process_connection(_serverConnection); - network_process_gamecmdqueue(); - } else { - auto it = _clientConnectionList.begin(); - while(it != _clientConnectionList.end()) { - if (!network_process_connection(*(*it))) { - network_remove_client((*it)); - it = _clientConnectionList.begin(); - } else { - it++; - } - } - if (SDL_GetTicks() - lastTickUpdate >= 25) { - lastTickUpdate = SDL_GetTicks(); - network_send_tick(); - } - SOCKET socket = accept(_listeningSocket, NULL, NULL); - if (socket == INVALID_SOCKET) { - if (WSAGetLastError() != WSAEWOULDBLOCK) { - network_print_error(); - closesocket(_listeningSocket); - log_error("Failed to accept client."); - } - } else { - iMode = 1; - if (ioctlsocket(socket, FIONBIO, &iMode) != NO_ERROR) { - closesocket(socket); - log_error("Failed to set non-blocking mode."); - } else { - network_add_client(socket); - } - } - } -} - -static void network_process_packet(NetworkPacket& packet) +void Network::ProcessPacket(NetworkPacket& packet) { uint32 *args; int command; @@ -413,13 +458,13 @@ static void network_process_packet(NetworkPacket& packet) // too big } else { int chunksize = packet.size - 4 - 4 - 4; - if (offset + chunksize > _chunkBuffer.size()) { - _chunkBuffer.resize(offset + chunksize); + if (offset + chunksize > chunk_buffer.size()) { + chunk_buffer.resize(offset + chunksize); } - memcpy(&_chunkBuffer[offset], (void*)&packet.GetData()[4 + 4 + 4], chunksize); + memcpy(&chunk_buffer[offset], (void*)&packet.GetData()[4 + 4 + 4], chunksize); if (offset + chunksize == size) { printf("Loading new map from network...\n"); - SDL_RWops* rw = SDL_RWFromMem(&_chunkBuffer[0], size); + SDL_RWops* rw = SDL_RWFromMem(&chunk_buffer[0], size); if (game_load_sv6(rw)) { game_load_init(); } @@ -439,92 +484,46 @@ static void network_process_packet(NetworkPacket& packet) news_item_add_to_queue_custom(&newsItem); }break; case NETWORK_COMMAND_GAMECMD:{ - if (gNetworkStatus == NETWORK_SERVER) { - network_send_gamecmd(args[2], args[3], args[4], args[5], args[6], args[7], args[8]); + if (GetMode() == NETWORK_MODE_SERVER) { + Send_GAMECMD(args[2], args[3], args[4], args[5], args[6], args[7], args[8]); game_do_command(args[2], args[3], args[4], args[5], args[6], args[7], args[8]); } else { GameCommand gc = GameCommand(&args[1]); - _gameCommandQueue.insert(gc); + game_command_queue.insert(gc); } }break; case NETWORK_COMMAND_TICK:{ - gNetworkServerTick = args[1]; + server_tick = args[1]; }break; } packet.Clear(); } -void network_send_tick() +void Network::ProcessGameCommandQueue() { - std::unique_ptr packet = NetworkPacket::AllocatePacket(); - packet->Write((uint32)NETWORK_COMMAND_TICK); - packet->Write((uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)); - for(auto it = _clientConnectionList.begin(); it != _clientConnectionList.end(); it++) { - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); - } - -} - -void network_send_map() -{ - if (gNetworkStatus == NETWORK_SERVER) { - int buffersize = 0x600000; - std::vector buffer(buffersize); - SDL_RWops* rw = SDL_RWFromMem(&buffer[0], buffersize); - scenario_save(rw, 0); - int size = (int)SDL_RWtell(rw); - int chunksize = 1000; - for (int i = 0; i < size; i += chunksize) { - int datasize = min(chunksize, size - i); - std::unique_ptr packet = NetworkPacket::AllocatePacket(); - packet->Write((uint32)NETWORK_COMMAND_MAP); - packet->Write((uint32)size); - packet->Write((uint32)i); - packet->Write(&buffer[i], datasize); - for(auto it = _clientConnectionList.begin(); it != _clientConnectionList.end(); it++) { - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); - } - } - SDL_RWclose(rw); + while (game_command_queue.begin() != game_command_queue.end() && game_command_queue.begin()->tick == RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)) { + // run all the game commands at the current tick + const GameCommand& gc = (*game_command_queue.begin()); + game_do_command(gc.eax, gc.ebx, gc.ecx, gc.edx, gc.esi, gc.edi, gc.ebp); + game_command_queue.erase(game_command_queue.begin()); } } -void network_send_chat(const char* text) +void Network::AddClient(SOCKET socket) { - std::unique_ptr packet = NetworkPacket::AllocatePacket(); - packet->Write((uint32)NETWORK_COMMAND_CHAT); - packet->Write((uint8*)text, strlen(text) + 1); - if (gNetworkStatus == NETWORK_SERVER) { - for(auto it = _clientConnectionList.begin(); it != _clientConnectionList.end(); it++) { - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); - } - } else { - _serverConnection.QueuePacket(std::move(packet)); - } + printf("New client connection\n"); + auto networkconnection = std::unique_ptr(new NetworkConnection); // change to make_unique in c++14 + networkconnection->socket = socket; + client_connection_list.push_back(std::move(networkconnection)); } -void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) +void Network::RemoveClient(std::unique_ptr& networkconnection) { - std::unique_ptr packet = NetworkPacket::AllocatePacket(); - packet->Write((uint32)NETWORK_COMMAND_GAMECMD); - packet->Write((uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)); - packet->Write((uint32)eax); - packet->Write((uint32)ebx | (1 << 31)); - packet->Write((uint32)ecx); - packet->Write((uint32)edx); - packet->Write((uint32)esi); - packet->Write((uint32)edi); - packet->Write((uint32)ebp); - if (gNetworkStatus == NETWORK_SERVER) { - for(auto it = _clientConnectionList.begin(); it != _clientConnectionList.end(); it++) { - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); - } - } else { - _serverConnection.QueuePacket(std::move(packet)); - } + printf("Client removed\n"); + client_connection_list.remove(networkconnection); } -void network_print_error() +void Network::PrintError() { wchar_t *s = NULL; FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&s, 0, NULL); @@ -532,4 +531,54 @@ void network_print_error() LocalFree(s); } +int network_init() +{ + return gNetwork.Init(); +} + +void network_close() +{ + gNetwork.Close(); +} + +int network_begin_client(const char *host, int port) +{ + return gNetwork.BeginClient(host, port); +} + +int network_begin_server(int port) +{ + return gNetwork.BeginServer(port); +} + +void network_update() +{ + gNetwork.Update(); +} + +int network_get_mode() +{ + return gNetwork.GetMode(); +} + +uint32 network_get_server_tick() +{ + return gNetwork.GetServerTick(); +} + +void network_send_map() +{ + gNetwork.Send_MAP(); +} + +void network_send_chat(const char* text) +{ + gNetwork.Send_CHAT(text); +} + +void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) +{ + gNetwork.Send_GAMECMD(eax, ebx, ecx, edx, esi, edi, ebp); +} + #endif /* DISABLE_NETWORK */ \ No newline at end of file diff --git a/src/network/network.h b/src/network/network.h index 09f96dbbda..379897aa7b 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -23,6 +23,14 @@ #ifndef DISABLE_NETWORK +#define NETWORK_DEFAULT_PORT 11753 + +enum { + NETWORK_MODE_NONE, + NETWORK_MODE_CLIENT, + NETWORK_MODE_SERVER +}; + #ifdef __cplusplus #include @@ -66,48 +74,73 @@ private: std::list> outboundpackets; }; +class NetworkPlayer +{ +public: + uint8 name[16 + 1]; + uint16 ping; +}; + +class Network +{ +public: + Network(); + ~Network(); + bool Init(); + void Close(); + bool BeginClient(const char* host, unsigned short port); + bool BeginServer(unsigned short port); + int GetMode(); + uint32 GetServerTick(); + void Update(); + + void Send_TICK(); + void Send_MAP(); + void Send_CHAT(const char* text); + void Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); + +private: + bool ProcessConnection(NetworkConnection& connection); + void ProcessPacket(NetworkPacket& packet); + void ProcessGameCommandQueue(); + void AddClient(SOCKET socket); + void RemoveClient(std::unique_ptr& connection); + void PrintError(); + + struct GameCommand + { + GameCommand(uint32 args[8]) { tick = args[0], eax = args[1], ebx = args[2], ecx = args[3], edx = args[4], esi = args[5], edi = args[6], ebp = args[7]; }; + uint32 tick; + uint32 eax, ebx, ecx, edx, esi, edi, ebp; + bool operator<(const GameCommand& comp) const { + return tick < comp.tick; + } + }; + + int mode; + bool wsa_initialized; + SOCKET server_socket; + SOCKET listening_socket; + NetworkConnection server_connection; + uint32 last_tick_sent_time; + uint32 server_tick; + std::list> client_connection_list; + std::multiset game_command_queue; + std::vector chunk_buffer; +}; + extern "C" { #endif -#define NETWORK_DEFAULT_PORT 11753 - -enum { - NETWORK_NONE, - NETWORK_CLIENT, - NETWORK_SERVER -}; - -enum { - NETWORK_SUCCESS, - NETWORK_NO_DATA, - NETWORK_MORE_DATA, - NETWORK_DISCONNECTED -}; - -enum { - NETWORK_COMMAND_AUTH, - NETWORK_COMMAND_MAP, - NETWORK_COMMAND_CHAT, - NETWORK_COMMAND_GAMECMD, - NETWORK_COMMAND_TICK -}; - -extern int gNetworkStart; -extern char gNetworkStartHost[128]; -extern int gNetworkStartPort; -extern int gNetworkStatus; -extern uint32 gNetworkServerTick; - int network_init(); void network_close(); int network_begin_client(const char *host, int port); -void network_end_client(); int network_begin_server(int port); -void network_end_server(); void network_update(); +int network_get_mode(); +uint32 network_get_server_tick(); -void network_send_tick(); void network_send_map(); void network_send_chat(const char* text); void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); diff --git a/src/openrct2.c b/src/openrct2.c index 1a6f283797..fd4e04928c 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -251,9 +251,9 @@ void openrct2_launch() break; } - if (gNetworkStart == NETWORK_CLIENT) { + if (gNetworkStart == NETWORK_MODE_CLIENT) { network_begin_client(gNetworkStartHost, gNetworkStartPort); - } else if (gNetworkStart == NETWORK_SERVER) { + } else if (gNetworkStart == NETWORK_MODE_SERVER) { network_begin_server(gNetworkStartPort); } From 71f20b44aa6c72f37fe71644b3fa6e10be8c2ed5 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Tue, 14 Jul 2015 22:40:22 -0600 Subject: [PATCH 0505/1173] endian-safe packet streams --- src/network/network.cpp | 201 ++++++++++++++++++++++------------------ src/network/network.h | 30 +++++- 2 files changed, 136 insertions(+), 95 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 387fcbad10..df9e6150a1 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -55,6 +55,7 @@ enum { NetworkPacket::NetworkPacket() { + transferred = 0; read = 0; size = 0; data = std::make_shared>(); @@ -77,15 +78,16 @@ uint8* NetworkPacket::GetData() void NetworkPacket::Clear() { + transferred = 0; read = 0; data->clear(); } int NetworkConnection::ReadPacket() { - if (inboundpacket.read < sizeof(inboundpacket.size)) { + if (inboundpacket.transferred < sizeof(inboundpacket.size)) { // read packet size - int readBytes = recv(socket, &((char*)&inboundpacket.size)[inboundpacket.read], sizeof(inboundpacket.size) - inboundpacket.read, 0); + int readBytes = recv(socket, &((char*)&inboundpacket.size)[inboundpacket.transferred], sizeof(inboundpacket.size) - inboundpacket.transferred, 0); if (readBytes == SOCKET_ERROR || readBytes == 0) { if (WSAGetLastError() != WSAEWOULDBLOCK) { return NETWORK_DISCONNECTED; @@ -93,15 +95,15 @@ int NetworkConnection::ReadPacket() return NETWORK_NO_DATA; } } - inboundpacket.read += readBytes; - if (inboundpacket.read == sizeof(inboundpacket.size)) { + inboundpacket.transferred += readBytes; + if (inboundpacket.transferred == sizeof(inboundpacket.size)) { inboundpacket.size = ntohs(inboundpacket.size); inboundpacket.data->resize(inboundpacket.size); } } else { // read packet data if (inboundpacket.data->capacity() > 0) { - int readBytes = recv(socket, (char*)&inboundpacket.GetData()[inboundpacket.read - sizeof(inboundpacket.size)], sizeof(inboundpacket.size) + inboundpacket.size - inboundpacket.read, 0); + int readBytes = recv(socket, (char*)&inboundpacket.GetData()[inboundpacket.transferred - sizeof(inboundpacket.size)], sizeof(inboundpacket.size) + inboundpacket.size - inboundpacket.transferred, 0); if (readBytes == SOCKET_ERROR || readBytes == 0) { if (WSAGetLastError() != WSAEWOULDBLOCK) { return NETWORK_DISCONNECTED; @@ -109,9 +111,9 @@ int NetworkConnection::ReadPacket() return NETWORK_NO_DATA; } } - inboundpacket.read += readBytes; + inboundpacket.transferred += readBytes; } - if (inboundpacket.read == sizeof(inboundpacket.size) + inboundpacket.size) { + if (inboundpacket.transferred == sizeof(inboundpacket.size) + inboundpacket.size) { return NETWORK_SUCCESS; } } @@ -121,22 +123,22 @@ int NetworkConnection::ReadPacket() int NetworkConnection::SendPacket(NetworkPacket& packet) { while (1) { - if (packet.read < sizeof(packet.size)) { + if (packet.transferred < sizeof(packet.size)) { // send packet size uint16 size = htons(packet.size); - int sentBytes = send(socket, &((char*)&size)[packet.read], sizeof(size) - packet.read, 0); + int sentBytes = send(socket, &((char*)&size)[packet.transferred], sizeof(size) - packet.transferred, 0); if (sentBytes == SOCKET_ERROR) { return 0; } - packet.read += sentBytes; + packet.transferred += sentBytes; } else { // send packet data - int sentBytes = send(socket, (const char*)&packet.GetData()[packet.read - sizeof(packet.size)], packet.data->size(), 0); + int sentBytes = send(socket, (const char*)&packet.GetData()[packet.transferred - sizeof(packet.size)], packet.data->size(), 0); if (sentBytes == SOCKET_ERROR) { return 0; } - packet.read += sentBytes; - if (packet.read == sizeof(packet.size) + packet.data->size()) { + packet.transferred += sentBytes; + if (packet.transferred == sizeof(packet.size) + packet.data->size()) { return 1; } } @@ -162,6 +164,13 @@ Network::Network() wsa_initialized = false; mode = NETWORK_MODE_NONE; last_tick_sent_time = 0; + command_handlers.resize(NETWORK_COMMAND_MAX, 0); + command_handlers[NETWORK_COMMAND_AUTH] = &Network::CommandHandler_AUTH; + command_handlers[NETWORK_COMMAND_MAP] = &Network::CommandHandler_MAP; + command_handlers[NETWORK_COMMAND_CHAT] = &Network::CommandHandler_CHAT; + command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::CommandHandler_GAMECMD; + command_handlers[NETWORK_COMMAND_TICK] = &Network::CommandHandler_TICK; + command_handlers[NETWORK_COMMAND_PLAYER] = &Network::CommandHandler_PLAYER; } Network::~Network() @@ -335,17 +344,6 @@ void Network::Update() } } -void Network::Send_TICK() -{ - std::unique_ptr packet = NetworkPacket::AllocatePacket(); - packet->Write((uint32)NETWORK_COMMAND_TICK); - packet->Write((uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)); - for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); - } - -} - void Network::Send_MAP() { if (GetMode() == NETWORK_MODE_SERVER) { @@ -358,9 +356,7 @@ void Network::Send_MAP() for (int i = 0; i < size; i += chunksize) { int datasize = min(chunksize, size - i); std::unique_ptr packet = NetworkPacket::AllocatePacket(); - packet->Write((uint32)NETWORK_COMMAND_MAP); - packet->Write((uint32)size); - packet->Write((uint32)i); + *packet << (uint32)NETWORK_COMMAND_MAP << (uint32)size << (uint32)i; packet->Write(&buffer[i], datasize); for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); @@ -373,7 +369,7 @@ void Network::Send_MAP() void Network::Send_CHAT(const char* text) { std::unique_ptr packet = NetworkPacket::AllocatePacket(); - packet->Write((uint32)NETWORK_COMMAND_CHAT); + *packet << (uint32)NETWORK_COMMAND_CHAT; packet->Write((uint8*)text, strlen(text) + 1); if (GetMode() == NETWORK_MODE_SERVER) { for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { @@ -387,15 +383,7 @@ void Network::Send_CHAT(const char* text) void Network::Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) { std::unique_ptr packet = NetworkPacket::AllocatePacket(); - packet->Write((uint32)NETWORK_COMMAND_GAMECMD); - packet->Write((uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)); - packet->Write((uint32)eax); - packet->Write((uint32)ebx | (1 << 31)); - packet->Write((uint32)ecx); - packet->Write((uint32)edx); - packet->Write((uint32)esi); - packet->Write((uint32)edi); - packet->Write((uint32)ebp); + *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | (1 << 31)) << ecx << edx << esi << edi << ebp; if (GetMode() == NETWORK_MODE_SERVER) { for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); @@ -405,6 +393,16 @@ void Network::Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint3 } } +void Network::Send_TICK() +{ + std::unique_ptr packet = NetworkPacket::AllocatePacket(); + *packet << (uint32)NETWORK_COMMAND_TICK << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); + for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); + } + +} + bool Network::ProcessConnection(NetworkConnection& connection) { int packetStatus; @@ -441,60 +439,10 @@ bool Network::ProcessConnection(NetworkConnection& connection) void Network::ProcessPacket(NetworkPacket& packet) { - uint32 *args; - int command; - rct_news_item newsItem; - - args = (uint32*)packet.GetData(); - command = args[0]; - switch (command) { - case NETWORK_COMMAND_AUTH:{ - - }break; - case NETWORK_COMMAND_MAP:{ - uint32 size = args[1]; - uint32 offset = args[2]; - if (offset > 0x600000) { - // too big - } else { - int chunksize = packet.size - 4 - 4 - 4; - if (offset + chunksize > chunk_buffer.size()) { - chunk_buffer.resize(offset + chunksize); - } - memcpy(&chunk_buffer[offset], (void*)&packet.GetData()[4 + 4 + 4], chunksize); - if (offset + chunksize == size) { - printf("Loading new map from network...\n"); - SDL_RWops* rw = SDL_RWFromMem(&chunk_buffer[0], size); - if (game_load_sv6(rw)) { - game_load_init(); - } - SDL_RWclose(rw); - } - } - }break; - case NETWORK_COMMAND_CHAT:{ - newsItem.type = NEWS_ITEM_BLANK; - newsItem.flags = 1; - newsItem.assoc = 0; - newsItem.ticks = 0; - newsItem.month_year = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); - newsItem.day = ((days_in_month[(newsItem.month_year & 7)] * RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16)) >> 16) + 1; - newsItem.colour = FORMAT_TOPAZ; - strcpy(newsItem.text, (char*)&packet.GetData()[4]); - news_item_add_to_queue_custom(&newsItem); - }break; - case NETWORK_COMMAND_GAMECMD:{ - if (GetMode() == NETWORK_MODE_SERVER) { - Send_GAMECMD(args[2], args[3], args[4], args[5], args[6], args[7], args[8]); - game_do_command(args[2], args[3], args[4], args[5], args[6], args[7], args[8]); - } else { - GameCommand gc = GameCommand(&args[1]); - game_command_queue.insert(gc); - } - }break; - case NETWORK_COMMAND_TICK:{ - server_tick = args[1]; - }break; + uint32 command; + packet >> command; + if (command < NETWORK_COMMAND_MAX && command_handlers[command]) { + (this->*command_handlers[command])(packet); } packet.Clear(); } @@ -531,6 +479,77 @@ void Network::PrintError() LocalFree(s); } +int Network::CommandHandler_AUTH(NetworkPacket& packet) +{ + return 1; +} + +int Network::CommandHandler_MAP(NetworkPacket& packet) +{ + uint32 size, offset; + packet >> size >> offset; + if (offset > 0x600000) { + // too big + return 0; + } else { + int chunksize = packet.size - packet.read; + if (offset + chunksize > chunk_buffer.size()) { + chunk_buffer.resize(offset + chunksize); + } + memcpy(&chunk_buffer[offset], (void*)packet.Read(chunksize), chunksize); + if (offset + chunksize == size) { + printf("Loading new map from network...\n"); + SDL_RWops* rw = SDL_RWFromMem(&chunk_buffer[0], size); + if (game_load_sv6(rw)) { + game_load_init(); + } + SDL_RWclose(rw); + } + } + return 1; +} + +int Network::CommandHandler_CHAT(NetworkPacket& packet) +{ + rct_news_item newsItem; + newsItem.type = NEWS_ITEM_BLANK; + newsItem.flags = 1; + newsItem.assoc = 0; + newsItem.ticks = 0; + newsItem.month_year = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); + newsItem.day = ((days_in_month[(newsItem.month_year & 7)] * RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16)) >> 16) + 1; + newsItem.colour = FORMAT_TOPAZ; + strcpy(newsItem.text, (char*)packet.Read(packet.size - packet.read)); + news_item_add_to_queue_custom(&newsItem); + return 1; +} + +int Network::CommandHandler_GAMECMD(NetworkPacket& packet) +{ + uint32 tick; + uint32 args[7]; + packet >> tick >> args[0] >> args[1] >> args[2] >> args[3] >> args[4] >> args[5] >> args[6]; + if (GetMode() == NETWORK_MODE_SERVER) { + Send_GAMECMD(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + game_do_command(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } else { + GameCommand gc = GameCommand(tick, args); + game_command_queue.insert(gc); + } + return 1; +} + +int Network::CommandHandler_TICK(NetworkPacket& packet) +{ + packet >> server_tick; + return 1; +} + +int Network::CommandHandler_PLAYER(NetworkPacket& packet) +{ + return 1; +} + int network_init() { return gNetwork.Init(); diff --git a/src/network/network.h b/src/network/network.h index 379897aa7b..9422705174 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -42,6 +42,15 @@ extern "C" { #include "../platform/platform.h" } +template +struct ByteSwapT { }; +template <> +struct ByteSwapT<2> { static uint16 SwapBE(uint16 value) { return SDL_SwapBE16(value); } }; +template <> +struct ByteSwapT<4> { static uint32 SwapBE(uint32 value) { return SDL_SwapBE32(value); } }; +template +T ByteSwapBE(const T& value) { return ByteSwapT::SwapBE(value); } + class NetworkPacket { public: @@ -49,13 +58,17 @@ public: static std::unique_ptr AllocatePacket(); static std::unique_ptr DuplicatePacket(NetworkPacket& packet); uint8* GetData(); - template - void Write(T value) { uint8* bytes = (uint8*)&value; data->insert(data->end(), bytes, bytes + sizeof(value)); } + template + NetworkPacket& operator<<(T value) { T swapped = ByteSwapBE(value); uint8* bytes = (uint8*)&swapped; data->insert(data->end(), bytes, bytes + sizeof(value)); return *this; } void Write(uint8* bytes, unsigned int size) { data->insert(data->end(), bytes, bytes + size); } + template + NetworkPacket& operator>>(T& value) { value = ByteSwapBE(*((T*)&GetData()[read])); read += sizeof(value); return *this; }; + uint8* Read(unsigned int size) { uint8* data = &GetData()[read]; read += size; return data; }; void Clear(); uint16 size; std::shared_ptr> data; + int transferred; int read; }; @@ -94,10 +107,10 @@ public: uint32 GetServerTick(); void Update(); - void Send_TICK(); void Send_MAP(); void Send_CHAT(const char* text); void Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); + void Send_TICK(); private: bool ProcessConnection(NetworkConnection& connection); @@ -109,7 +122,7 @@ private: struct GameCommand { - GameCommand(uint32 args[8]) { tick = args[0], eax = args[1], ebx = args[2], ecx = args[3], edx = args[4], esi = args[5], edi = args[6], ebp = args[7]; }; + GameCommand(uint32 t, uint32* args) { tick = t, eax = args[0], ebx = args[1], ecx = args[2], edx = args[3], esi = args[4], edi = args[5], ebp = args[6]; }; uint32 tick; uint32 eax, ebx, ecx, edx, esi, edi, ebp; bool operator<(const GameCommand& comp) const { @@ -127,6 +140,15 @@ private: std::list> client_connection_list; std::multiset game_command_queue; std::vector chunk_buffer; + +private: + std::vector command_handlers; + int CommandHandler_AUTH(NetworkPacket& packet); + int CommandHandler_MAP(NetworkPacket& packet); + int CommandHandler_CHAT(NetworkPacket& packet); + int CommandHandler_GAMECMD(NetworkPacket& packet); + int CommandHandler_TICK(NetworkPacket& packet); + int CommandHandler_PLAYER(NetworkPacket& packet); }; extern "C" { From c0dc5911524fd4f4ff7b44fc466ae125023643fc Mon Sep 17 00:00:00 2001 From: zsilencer Date: Wed, 15 Jul 2015 00:23:04 -0600 Subject: [PATCH 0506/1173] refactor and add network authorization --- src/network/network.cpp | 259 +++++++++++++++++++++++++++++----------- src/network/network.h | 50 +++++--- 2 files changed, 225 insertions(+), 84 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index df9e6150a1..5c5c35aedd 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -76,6 +76,41 @@ uint8* NetworkPacket::GetData() return &(*data)[0]; } +void NetworkPacket::Write(uint8* bytes, unsigned int size) +{ + data->insert(data->end(), bytes, bytes + size); +} + +void NetworkPacket::WriteString(const char* string) +{ + Write((uint8*)string, strlen(string) + 1); +} + +const uint8* NetworkPacket::Read(unsigned int size) +{ + if (read + size > NetworkPacket::size) { + return 0; + } else { + uint8* data = &GetData()[read]; + read += size; + return data; + } +} + +const char* NetworkPacket::ReadString() +{ + char* str = (char*)&GetData()[read]; + char* strend = str; + while (read < size && *strend != 0) { + read++; + strend++; + } + if (*strend != 0) { + return 0; + } + return str; +} + void NetworkPacket::Clear() { transferred = 0; @@ -83,6 +118,11 @@ void NetworkPacket::Clear() data->clear(); } +NetworkConnection::NetworkConnection() +{ + authstatus = NETWORK_AUTH_NONE; +} + int NetworkConnection::ReadPacket() { if (inboundpacket.transferred < sizeof(inboundpacket.size)) { @@ -148,8 +188,10 @@ int NetworkConnection::SendPacket(NetworkPacket& packet) void NetworkConnection::QueuePacket(std::unique_ptr packet) { - packet->size = packet->data->size(); - outboundpackets.push_back(std::move(packet)); + if (authstatus == NETWORK_AUTH_OK || authstatus == NETWORK_AUTH_REQUESTED) { + packet->size = packet->data->size(); + outboundpackets.push_back(std::move(packet)); + } } void NetworkConnection::SendQueuedPackets() @@ -164,13 +206,17 @@ Network::Network() wsa_initialized = false; mode = NETWORK_MODE_NONE; last_tick_sent_time = 0; - command_handlers.resize(NETWORK_COMMAND_MAX, 0); - command_handlers[NETWORK_COMMAND_AUTH] = &Network::CommandHandler_AUTH; - command_handlers[NETWORK_COMMAND_MAP] = &Network::CommandHandler_MAP; - command_handlers[NETWORK_COMMAND_CHAT] = &Network::CommandHandler_CHAT; - command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::CommandHandler_GAMECMD; - command_handlers[NETWORK_COMMAND_TICK] = &Network::CommandHandler_TICK; - command_handlers[NETWORK_COMMAND_PLAYER] = &Network::CommandHandler_PLAYER; + strcpy(password, ""); + client_command_handlers.resize(NETWORK_COMMAND_MAX, 0); + client_command_handlers[NETWORK_COMMAND_AUTH] = &Network::Client_Handle_AUTH; + client_command_handlers[NETWORK_COMMAND_MAP] = &Network::Client_Handle_MAP; + client_command_handlers[NETWORK_COMMAND_CHAT] = &Network::Client_Handle_CHAT; + client_command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::Client_Handle_GAMECMD; + client_command_handlers[NETWORK_COMMAND_TICK] = &Network::Client_Handle_TICK; + server_command_handlers.resize(NETWORK_COMMAND_MAX, 0); + server_command_handlers[NETWORK_COMMAND_AUTH] = &Network::Server_Handle_AUTH; + server_command_handlers[NETWORK_COMMAND_CHAT] = &Network::Server_Handle_CHAT; + server_command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::Server_Handle_GAMECMD; } Network::~Network() @@ -245,6 +291,8 @@ bool Network::BeginClient(const char* host, unsigned short port) server_connection.socket = server_socket; mode = NETWORK_MODE_CLIENT; + + Client_Send_AUTH(OPENRCT2_VERSION, "Player", ""); return true; } @@ -324,7 +372,7 @@ void Network::Update() } if (SDL_GetTicks() - last_tick_sent_time >= 25) { last_tick_sent_time = SDL_GetTicks(); - Send_TICK(); + Server_Send_TICK(); } SOCKET socket = accept(listening_socket, NULL, NULL); if (socket == INVALID_SOCKET) { @@ -344,63 +392,78 @@ void Network::Update() } } -void Network::Send_MAP() +void Network::Client_Send_AUTH(const char* gameversion, const char* name, const char* password) { - if (GetMode() == NETWORK_MODE_SERVER) { - int buffersize = 0x600000; - std::vector buffer(buffersize); - SDL_RWops* rw = SDL_RWFromMem(&buffer[0], buffersize); - scenario_save(rw, 0); - int size = (int)SDL_RWtell(rw); - int chunksize = 1000; - for (int i = 0; i < size; i += chunksize) { - int datasize = min(chunksize, size - i); - std::unique_ptr packet = NetworkPacket::AllocatePacket(); - *packet << (uint32)NETWORK_COMMAND_MAP << (uint32)size << (uint32)i; - packet->Write(&buffer[i], datasize); - for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); - } - } - SDL_RWclose(rw); - } + std::unique_ptr packet = NetworkPacket::AllocatePacket(); + *packet << (uint32)NETWORK_COMMAND_AUTH; + packet->WriteString(gameversion); + packet->WriteString(name); + packet->WriteString(password); + server_connection.authstatus = NETWORK_AUTH_REQUESTED; + server_connection.QueuePacket(std::move(packet)); } -void Network::Send_CHAT(const char* text) +void Network::Server_Send_MAP() +{ + int buffersize = 0x600000; + std::vector buffer(buffersize); + SDL_RWops* rw = SDL_RWFromMem(&buffer[0], buffersize); + scenario_save(rw, 0); + int size = (int)SDL_RWtell(rw); + int chunksize = 1000; + for (int i = 0; i < size; i += chunksize) { + int datasize = min(chunksize, size - i); + std::unique_ptr packet = NetworkPacket::AllocatePacket(); + *packet << (uint32)NETWORK_COMMAND_MAP << (uint32)size << (uint32)i; + packet->Write(&buffer[i], datasize); + for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); + } + } + SDL_RWclose(rw); +} + +void Network::Client_Send_CHAT(const char* text) { std::unique_ptr packet = NetworkPacket::AllocatePacket(); *packet << (uint32)NETWORK_COMMAND_CHAT; packet->Write((uint8*)text, strlen(text) + 1); - if (GetMode() == NETWORK_MODE_SERVER) { - for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); - } - } else { - server_connection.QueuePacket(std::move(packet)); + server_connection.QueuePacket(std::move(packet)); +} + +void Network::Server_Send_CHAT(const char* text) +{ + std::unique_ptr packet = NetworkPacket::AllocatePacket(); + *packet << (uint32)NETWORK_COMMAND_CHAT; + packet->Write((uint8*)text, strlen(text) + 1); + for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); } } -void Network::Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) +void Network::Client_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) { std::unique_ptr packet = NetworkPacket::AllocatePacket(); *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | (1 << 31)) << ecx << edx << esi << edi << ebp; - if (GetMode() == NETWORK_MODE_SERVER) { - for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); - } - } else { - server_connection.QueuePacket(std::move(packet)); + server_connection.QueuePacket(std::move(packet)); +} + +void Network::Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) +{ + std::unique_ptr packet = NetworkPacket::AllocatePacket(); + *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | (1 << 31)) << ecx << edx << esi << edi << ebp; + for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); } } -void Network::Send_TICK() +void Network::Server_Send_TICK() { std::unique_ptr packet = NetworkPacket::AllocatePacket(); *packet << (uint32)NETWORK_COMMAND_TICK << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); } - } bool Network::ProcessConnection(NetworkConnection& connection) @@ -423,7 +486,7 @@ bool Network::ProcessConnection(NetworkConnection& connection) break; case NETWORK_SUCCESS: // done reading in packet - ProcessPacket(connection.inboundpacket); + ProcessPacket(connection, connection.inboundpacket); break; case NETWORK_MORE_DATA: // more data required to be read @@ -437,12 +500,23 @@ bool Network::ProcessConnection(NetworkConnection& connection) return true; } -void Network::ProcessPacket(NetworkPacket& packet) +void Network::ProcessPacket(NetworkConnection& connection, NetworkPacket& packet) { uint32 command; packet >> command; - if (command < NETWORK_COMMAND_MAX && command_handlers[command]) { - (this->*command_handlers[command])(packet); + if (command < NETWORK_COMMAND_MAX) { + if (GetMode() == NETWORK_MODE_CLIENT) { + if (client_command_handlers[command]) { + (this->*client_command_handlers[command])(connection, packet); + } + } else + if (GetMode() == NETWORK_MODE_SERVER) { + if (server_command_handlers[command]) { + if (connection.authstatus == NETWORK_AUTH_OK || command == NETWORK_COMMAND_AUTH) { + (this->*server_command_handlers[command])(connection, packet); + } + } + } } packet.Clear(); } @@ -479,12 +553,34 @@ void Network::PrintError() LocalFree(s); } -int Network::CommandHandler_AUTH(NetworkPacket& packet) +int Network::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacket& packet) { + packet >> (uint32&)connection.authstatus; return 1; } -int Network::CommandHandler_MAP(NetworkPacket& packet) +int Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& packet) +{ + const char* gameversion = packet.ReadString(); + const char* name = packet.ReadString(); + const char* password = packet.ReadString(); + connection.authstatus = NETWORK_AUTH_OK; + if (!gameversion || strcmp(gameversion, OPENRCT2_VERSION) != 0) { + connection.authstatus = NETWORK_AUTH_BADVERSION; + } else + if (!name) { + connection.authstatus = NETWORK_AUTH_BADNAME; + } else + if (!password || strcmp(password, Network::password) != 0) { + connection.authstatus = NETWORK_AUTH_BADPASSWORD; + } + std::unique_ptr responsepacket = NetworkPacket::AllocatePacket(); + *responsepacket << (uint32)NETWORK_COMMAND_AUTH << (uint32)connection.authstatus; + connection.QueuePacket(std::move(responsepacket)); + return 1; +} + +int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& packet) { uint32 size, offset; packet >> size >> offset; @@ -509,7 +605,7 @@ int Network::CommandHandler_MAP(NetworkPacket& packet) return 1; } -int Network::CommandHandler_CHAT(NetworkPacket& packet) +int Network::Client_Handle_CHAT(NetworkConnection& connection, NetworkPacket& packet) { rct_news_item newsItem; newsItem.type = NEWS_ITEM_BLANK; @@ -524,32 +620,47 @@ int Network::CommandHandler_CHAT(NetworkPacket& packet) return 1; } -int Network::CommandHandler_GAMECMD(NetworkPacket& packet) +int Network::Server_Handle_CHAT(NetworkConnection& connection, NetworkPacket& packet) +{ + rct_news_item newsItem; + newsItem.type = NEWS_ITEM_BLANK; + newsItem.flags = 1; + newsItem.assoc = 0; + newsItem.ticks = 0; + newsItem.month_year = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); + newsItem.day = ((days_in_month[(newsItem.month_year & 7)] * RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16)) >> 16) + 1; + newsItem.colour = FORMAT_TOPAZ; + strcpy(newsItem.text, (char*)packet.Read(packet.size - packet.read)); + news_item_add_to_queue_custom(&newsItem); + return 1; +} + +int Network::Client_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& packet) { uint32 tick; uint32 args[7]; packet >> tick >> args[0] >> args[1] >> args[2] >> args[3] >> args[4] >> args[5] >> args[6]; - if (GetMode() == NETWORK_MODE_SERVER) { - Send_GAMECMD(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); - game_do_command(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); - } else { - GameCommand gc = GameCommand(tick, args); - game_command_queue.insert(gc); - } + GameCommand gc = GameCommand(tick, args); + game_command_queue.insert(gc); return 1; } -int Network::CommandHandler_TICK(NetworkPacket& packet) +int Network::Server_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& packet) +{ + uint32 tick; + uint32 args[7]; + packet >> tick >> args[0] >> args[1] >> args[2] >> args[3] >> args[4] >> args[5] >> args[6]; + Server_Send_GAMECMD(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + game_do_command(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + return 1; +} + +int Network::Client_Handle_TICK(NetworkConnection& connection, NetworkPacket& packet) { packet >> server_tick; return 1; } -int Network::CommandHandler_PLAYER(NetworkPacket& packet) -{ - return 1; -} - int network_init() { return gNetwork.Init(); @@ -587,17 +698,27 @@ uint32 network_get_server_tick() void network_send_map() { - gNetwork.Send_MAP(); + gNetwork.Server_Send_MAP(); } void network_send_chat(const char* text) { - gNetwork.Send_CHAT(text); + if (gNetwork.GetMode() == NETWORK_MODE_CLIENT) { + gNetwork.Client_Send_CHAT(text); + } else + if (gNetwork.GetMode() == NETWORK_MODE_SERVER) { + gNetwork.Server_Send_CHAT(text); + } } void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) { - gNetwork.Send_GAMECMD(eax, ebx, ecx, edx, esi, edi, ebp); + if (gNetwork.GetMode() == NETWORK_MODE_CLIENT) { + gNetwork.Client_Send_GAMECMD(eax, ebx, ecx, edx, esi, edi, ebp); + } else + if (gNetwork.GetMode() == NETWORK_MODE_SERVER) { + gNetwork.Server_Send_GAMECMD(eax, ebx, ecx, edx, esi, edi, ebp); + } } #endif /* DISABLE_NETWORK */ \ No newline at end of file diff --git a/src/network/network.h b/src/network/network.h index 9422705174..758792eb6e 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -31,6 +31,15 @@ enum { NETWORK_MODE_SERVER }; +enum { + NETWORK_AUTH_NONE, + NETWORK_AUTH_REQUESTED, + NETWORK_AUTH_OK, + NETWORK_AUTH_BADVERSION, + NETWORK_AUTH_BADNAME, + NETWORK_AUTH_BADPASSWORD +}; + #ifdef __cplusplus #include @@ -60,10 +69,12 @@ public: uint8* GetData(); template NetworkPacket& operator<<(T value) { T swapped = ByteSwapBE(value); uint8* bytes = (uint8*)&swapped; data->insert(data->end(), bytes, bytes + sizeof(value)); return *this; } - void Write(uint8* bytes, unsigned int size) { data->insert(data->end(), bytes, bytes + size); } + void Write(uint8* bytes, unsigned int size); + void WriteString(const char* string); template - NetworkPacket& operator>>(T& value) { value = ByteSwapBE(*((T*)&GetData()[read])); read += sizeof(value); return *this; }; - uint8* Read(unsigned int size) { uint8* data = &GetData()[read]; read += size; return data; }; + NetworkPacket& operator>>(T& value) { if (read + sizeof(value) > size) { value = 0; } else { value = ByteSwapBE(*((T*)&GetData()[read])); read += sizeof(value); } return *this; }; + const uint8* Read(unsigned int size); + const char* ReadString(); void Clear(); uint16 size; @@ -75,12 +86,14 @@ public: class NetworkConnection { public: + NetworkConnection(); int ReadPacket(); void QueuePacket(std::unique_ptr packet); void SendQueuedPackets(); SOCKET socket; NetworkPacket inboundpacket; + int authstatus; private: int SendPacket(NetworkPacket& packet); @@ -107,14 +120,17 @@ public: uint32 GetServerTick(); void Update(); - void Send_MAP(); - void Send_CHAT(const char* text); - void Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); - void Send_TICK(); + void Client_Send_AUTH(const char* gameversion, const char* name, const char* password); + void Server_Send_MAP(); + void Client_Send_CHAT(const char* text); + void Server_Send_CHAT(const char* text); + void Client_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); + void Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); + void Server_Send_TICK(); private: bool ProcessConnection(NetworkConnection& connection); - void ProcessPacket(NetworkPacket& packet); + void ProcessPacket(NetworkConnection& connection, NetworkPacket& packet); void ProcessGameCommandQueue(); void AddClient(SOCKET socket); void RemoveClient(std::unique_ptr& connection); @@ -140,15 +156,19 @@ private: std::list> client_connection_list; std::multiset game_command_queue; std::vector chunk_buffer; + char password[33]; private: - std::vector command_handlers; - int CommandHandler_AUTH(NetworkPacket& packet); - int CommandHandler_MAP(NetworkPacket& packet); - int CommandHandler_CHAT(NetworkPacket& packet); - int CommandHandler_GAMECMD(NetworkPacket& packet); - int CommandHandler_TICK(NetworkPacket& packet); - int CommandHandler_PLAYER(NetworkPacket& packet); + std::vector client_command_handlers; + std::vector server_command_handlers; + int Client_Handle_AUTH(NetworkConnection& connection, NetworkPacket& packet); + int Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& packet); + int Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& packet); + int Client_Handle_CHAT(NetworkConnection& connection, NetworkPacket& packet); + int Server_Handle_CHAT(NetworkConnection& connection, NetworkPacket& packet); + int Client_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& packet); + int Server_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& packet); + int Client_Handle_TICK(NetworkConnection& connection, NetworkPacket& packet); }; extern "C" { From 7ccb0eb655978bd7223a924736e9bf588e4cfb0d Mon Sep 17 00:00:00 2001 From: zsilencer Date: Thu, 16 Jul 2015 11:32:43 -0600 Subject: [PATCH 0507/1173] basic player list --- data/language/english_uk.txt | 1 + src/interface/window.h | 2 + src/localisation/string_ids.h | 2 + src/network/network.cpp | 148 ++++++++++++++++++----- src/network/network.h | 32 +++-- src/windows/network.c | 213 +++++++++++++++++++++++++++++++++- src/windows/top_toolbar.c | 45 ++++++- 7 files changed, 404 insertions(+), 39 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 757823577f..fe8db463bd 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3834,3 +3834,4 @@ STR_5492 :Scenario options STR_6000 :Send Message STR_6001 :Type the message you would like to send. +STR_6002 :Player List diff --git a/src/interface/window.h b/src/interface/window.h index cd99df869c..105d268db3 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -447,6 +447,7 @@ enum { WC_TITLE_EDITOR = 122, WC_TITLE_COMMAND_EDITOR = 123, WC_CHAT_HOST = 124, + WC_PLAYER_LIST = 125, // Only used for colour schemes WC_STAFF = 220, @@ -612,6 +613,7 @@ void window_sign_open(rct_windownumber number); void window_sign_small_open(rct_windownumber number); void window_cheats_open(); void window_chat_open(); +void window_player_list_open(); void window_research_open(); void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dpi, int baseWidgetIndex); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 5ae91dcca2..d28473e43d 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2030,6 +2030,8 @@ enum { STR_DEBUG_DROPDOWN_INVENTIONS_LIST = 5491, STR_DEBUG_DROPDOWN_SCENARIO_OPTIONS = 5492, + STR_PLAYER_LIST = 6002, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/network/network.cpp b/src/network/network.cpp index 5c5c35aedd..3e0a04cde1 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -21,6 +21,7 @@ #ifndef DISABLE_NETWORK #include +#include #include #include "network.h" extern "C" { @@ -49,7 +50,7 @@ enum { NETWORK_COMMAND_CHAT, NETWORK_COMMAND_GAMECMD, NETWORK_COMMAND_TICK, - NETWORK_COMMAND_PLAYER, + NETWORK_COMMAND_PLAYERLIST, NETWORK_COMMAND_MAX }; @@ -108,6 +109,7 @@ const char* NetworkPacket::ReadString() if (*strend != 0) { return 0; } + read++; return str; } @@ -118,9 +120,17 @@ void NetworkPacket::Clear() data->clear(); } +NetworkPlayer::NetworkPlayer(const char* name) +{ + strncpy((char*)NetworkPlayer::name, name, sizeof(NetworkPlayer::name)); + NetworkPlayer::name[sizeof(NetworkPlayer::name) - 1] = 0; + ping = 0; +} + NetworkConnection::NetworkConnection() { authstatus = NETWORK_AUTH_NONE; + player = 0; } int NetworkConnection::ReadPacket() @@ -213,6 +223,7 @@ Network::Network() client_command_handlers[NETWORK_COMMAND_CHAT] = &Network::Client_Handle_CHAT; client_command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::Client_Handle_GAMECMD; client_command_handlers[NETWORK_COMMAND_TICK] = &Network::Client_Handle_TICK; + client_command_handlers[NETWORK_COMMAND_PLAYERLIST] = &Network::Client_Handle_PLAYERLIST; server_command_handlers.resize(NETWORK_COMMAND_MAX, 0); server_command_handlers[NETWORK_COMMAND_AUTH] = &Network::Server_Handle_AUTH; server_command_handlers[NETWORK_COMMAND_CHAT] = &Network::Server_Handle_CHAT; @@ -241,18 +252,21 @@ bool Network::Init() void Network::Close() { if (mode == NETWORK_MODE_CLIENT) { - mode = NETWORK_MODE_NONE; closesocket(server_socket); } else if (mode == NETWORK_MODE_SERVER) { - mode = NETWORK_MODE_NONE; closesocket(listening_socket); for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { closesocket((*it)->socket); } - client_connection_list.clear(); } + mode = NETWORK_MODE_NONE; + + client_connection_list.clear(); + game_command_queue.clear(); + player_list.clear(); + if (wsa_initialized) { WSACleanup(); wsa_initialized = false; @@ -261,6 +275,7 @@ void Network::Close() bool Network::BeginClient(const char* host, unsigned short port) { + Close(); if (!Init()) return false; @@ -298,6 +313,7 @@ bool Network::BeginClient(const char* host, unsigned short port) bool Network::BeginServer(unsigned short port) { + Close(); if (!Init()) return false; @@ -332,6 +348,10 @@ bool Network::BeginServer(unsigned short port) return false; } + std::unique_ptr player(new NetworkPlayer("Server Player")); // change to make_unique in c++14 + player->flags |= NETWORK_PLAYER_FLAG_ISSERVER; + player_list.push_back(std::move(player)); + printf("Ready for clients...\n"); mode = NETWORK_MODE_SERVER; @@ -343,6 +363,17 @@ int Network::GetMode() return mode; } +int Network::GetAuthStatus() +{ + if (GetMode() == NETWORK_MODE_CLIENT) { + return server_connection.authstatus; + } else + if (GetMode() == NETWORK_MODE_SERVER) { + return NETWORK_AUTH_OK; + } + return NETWORK_AUTH_NONE; +} + uint32 Network::GetServerTick() { return server_tick; @@ -362,7 +393,7 @@ void Network::Update() } else if (GetMode() == NETWORK_MODE_SERVER) { auto it = client_connection_list.begin(); - while(it != client_connection_list.end()) { + while (it != client_connection_list.end()) { if (!ProcessConnection(*(*it))) { RemoveClient((*it)); it = client_connection_list.begin(); @@ -416,7 +447,7 @@ void Network::Server_Send_MAP() std::unique_ptr packet = NetworkPacket::AllocatePacket(); *packet << (uint32)NETWORK_COMMAND_MAP << (uint32)size << (uint32)i; packet->Write(&buffer[i], datasize); - for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); } } @@ -436,7 +467,7 @@ void Network::Server_Send_CHAT(const char* text) std::unique_ptr packet = NetworkPacket::AllocatePacket(); *packet << (uint32)NETWORK_COMMAND_CHAT; packet->Write((uint8*)text, strlen(text) + 1); - for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); } } @@ -452,7 +483,7 @@ void Network::Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx { std::unique_ptr packet = NetworkPacket::AllocatePacket(); *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | (1 << 31)) << ecx << edx << esi << edi << ebp; - for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); } } @@ -461,7 +492,20 @@ void Network::Server_Send_TICK() { std::unique_ptr packet = NetworkPacket::AllocatePacket(); *packet << (uint32)NETWORK_COMMAND_TICK << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); - for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); + } +} + +void Network::Server_Send_PLAYERLIST() +{ + std::unique_ptr packet = NetworkPacket::AllocatePacket(); + *packet << (uint32)NETWORK_COMMAND_PLAYERLIST << (uint32)player_list.size(); + for (unsigned int i = 0; i < player_list.size(); i++) { + packet->WriteString((const char*)player_list[i]->name); + *packet << player_list[i]->id << player_list[i]->flags; + } + for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); } } @@ -534,15 +578,18 @@ void Network::ProcessGameCommandQueue() void Network::AddClient(SOCKET socket) { printf("New client connection\n"); - auto networkconnection = std::unique_ptr(new NetworkConnection); // change to make_unique in c++14 - networkconnection->socket = socket; - client_connection_list.push_back(std::move(networkconnection)); + auto connection = std::unique_ptr(new NetworkConnection); // change to make_unique in c++14 + connection->socket = socket; + client_connection_list.push_back(std::move(connection)); } -void Network::RemoveClient(std::unique_ptr& networkconnection) +void Network::RemoveClient(std::unique_ptr& connection) { printf("Client removed\n"); - client_connection_list.remove(networkconnection); + NetworkPlayer* connection_player = connection->player; + player_list.erase(std::remove_if(player_list.begin(), player_list.end(), [connection_player](std::unique_ptr& player){ return player.get() == connection_player; }), player_list.end()); + client_connection_list.remove(connection); + Server_Send_PLAYERLIST(); } void Network::PrintError() @@ -561,22 +608,30 @@ int Network::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacket& pa int Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& packet) { - const char* gameversion = packet.ReadString(); - const char* name = packet.ReadString(); - const char* password = packet.ReadString(); - connection.authstatus = NETWORK_AUTH_OK; - if (!gameversion || strcmp(gameversion, OPENRCT2_VERSION) != 0) { - connection.authstatus = NETWORK_AUTH_BADVERSION; - } else - if (!name) { - connection.authstatus = NETWORK_AUTH_BADNAME; - } else - if (!password || strcmp(password, Network::password) != 0) { - connection.authstatus = NETWORK_AUTH_BADPASSWORD; + if (connection.authstatus != NETWORK_AUTH_OK) { + const char* gameversion = packet.ReadString(); + const char* name = packet.ReadString(); + const char* password = packet.ReadString(); + if (!gameversion || strcmp(gameversion, OPENRCT2_VERSION) != 0) { + connection.authstatus = NETWORK_AUTH_BADVERSION; + } else + if (!name) { + connection.authstatus = NETWORK_AUTH_BADNAME; + } else + if (!password || strcmp(password, Network::password) != 0) { + connection.authstatus = NETWORK_AUTH_BADPASSWORD; + } else { + connection.authstatus = NETWORK_AUTH_OK; + std::unique_ptr player(new NetworkPlayer(name)); // change to make_unique in c++14 + printf("New player: %s\n", player->name); + connection.player = player.get(); + player_list.push_back(std::move(player)); + Server_Send_PLAYERLIST(); + } + std::unique_ptr responsepacket = NetworkPacket::AllocatePacket(); + *responsepacket << (uint32)NETWORK_COMMAND_AUTH << (uint32)connection.authstatus; + connection.QueuePacket(std::move(responsepacket)); } - std::unique_ptr responsepacket = NetworkPacket::AllocatePacket(); - *responsepacket << (uint32)NETWORK_COMMAND_AUTH << (uint32)connection.authstatus; - connection.QueuePacket(std::move(responsepacket)); return 1; } @@ -598,6 +653,9 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac SDL_RWops* rw = SDL_RWFromMem(&chunk_buffer[0], size); if (game_load_sv6(rw)) { game_load_init(); + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) & 1) + pause_toggle(); + game_command_queue.clear(); } SDL_RWclose(rw); } @@ -661,6 +719,23 @@ int Network::Client_Handle_TICK(NetworkConnection& connection, NetworkPacket& pa return 1; } +int Network::Client_Handle_PLAYERLIST(NetworkConnection& connection, NetworkPacket& packet) +{ + player_list.clear(); + uint32 size; + packet >> size; + for (unsigned int i = 0; i < size; i++) { + const char* name = packet.ReadString(); + std::unique_ptr player(new NetworkPlayer(name)); // change to make_unique in c++14 + packet >> player->id >> player->flags; + if (player->flags & NETWORK_PLAYER_FLAG_ISSERVER) { + server_connection.player = player.get(); + } + player_list.push_back(std::move(player)); + } + return 1; +} + int network_init() { return gNetwork.Init(); @@ -691,11 +766,26 @@ int network_get_mode() return gNetwork.GetMode(); } +int network_get_authstatus() +{ + return gNetwork.GetAuthStatus(); +} + uint32 network_get_server_tick() { return gNetwork.GetServerTick(); } +int network_get_num_players() +{ + return gNetwork.player_list.size(); +} + +const char* network_get_player_name(unsigned int index) +{ + return (const char*)gNetwork.player_list[index]->name; +} + void network_send_map() { gNetwork.Server_Send_MAP(); diff --git a/src/network/network.h b/src/network/network.h index 758792eb6e..2713d91f80 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -40,6 +40,10 @@ enum { NETWORK_AUTH_BADPASSWORD }; +enum { + NETWORK_PLAYER_FLAG_ISSERVER = 1 << 0, +}; + #ifdef __cplusplus #include @@ -54,6 +58,8 @@ extern "C" { template struct ByteSwapT { }; template <> +struct ByteSwapT<1> { static uint8 SwapBE(uint8 value) { return value; } }; +template <> struct ByteSwapT<2> { static uint16 SwapBE(uint16 value) { return SDL_SwapBE16(value); } }; template <> struct ByteSwapT<4> { static uint32 SwapBE(uint32 value) { return SDL_SwapBE32(value); } }; @@ -83,6 +89,16 @@ public: int read; }; +class NetworkPlayer +{ +public: + NetworkPlayer(const char* name); + uint8 id; + uint8 name[32 + 1]; + uint16 ping; + uint32 flags; +}; + class NetworkConnection { public: @@ -94,19 +110,13 @@ public: SOCKET socket; NetworkPacket inboundpacket; int authstatus; + NetworkPlayer* player; private: int SendPacket(NetworkPacket& packet); std::list> outboundpackets; }; -class NetworkPlayer -{ -public: - uint8 name[16 + 1]; - uint16 ping; -}; - class Network { public: @@ -117,6 +127,7 @@ public: bool BeginClient(const char* host, unsigned short port); bool BeginServer(unsigned short port); int GetMode(); + int GetAuthStatus(); uint32 GetServerTick(); void Update(); @@ -127,6 +138,9 @@ public: void Client_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); void Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); void Server_Send_TICK(); + void Server_Send_PLAYERLIST(); + + std::vector> player_list; private: bool ProcessConnection(NetworkConnection& connection); @@ -169,6 +183,7 @@ private: int Client_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& packet); int Server_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& packet); int Client_Handle_TICK(NetworkConnection& connection, NetworkPacket& packet); + int Client_Handle_PLAYERLIST(NetworkConnection& connection, NetworkPacket& packet); }; extern "C" { @@ -181,7 +196,10 @@ int network_begin_server(int port); void network_update(); int network_get_mode(); +int network_get_authstatus(); uint32 network_get_server_tick(); +int network_get_num_players(); +const char* network_get_player_name(unsigned int index); void network_send_map(); void network_send_chat(const char* text); diff --git a/src/windows/network.c b/src/windows/network.c index edd07219d2..19019acd3e 100644 --- a/src/windows/network.c +++ b/src/windows/network.c @@ -18,12 +18,12 @@ * along with this program. If not, see . *****************************************************************************/ +#include "../interface/themes.h" +#include "../interface/widget.h" #include "../interface/window.h" #include "../localisation/localisation.h" #include "../network/network.h" -static void window_chat_host_emptysub() { } - static void window_chat_host_textinput(rct_window *w, int widgetIndex, char *text) { network_send_chat(text); @@ -71,4 +71,213 @@ void window_chat_open() w->colours[2] = 0; w->number = 0; window_text_input_open(w, 0, 6000, 6001, STR_NONE, 0, 64); +} + +enum WINDOW_PLAYER_LIST_WIDGET_IDX { + WIDX_BACKGROUND, + WIDX_TITLE, + WIDX_CLOSE, + WIDX_CONTENT_PANEL, + WIDX_TAB1, + WIDX_LIST, +}; + +static rct_widget window_player_list_widgets[] = { + { WWT_FRAME, 0, 0, 319, 0, 269, 0x0FFFFFFFF, 65535 }, // panel / background + { WWT_CAPTION, 0, 1, 318, 1, 14, STR_PLAYER_LIST, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 307, 317, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_RESIZE, 1, 0, 319, 43, 269, 0x0FFFFFFFF, STR_NONE }, // content panel + { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, STR_NONE }, // tab + { WWT_SCROLL, 1, 3, 316, 72, 266, 3, 65535 }, // list + { WIDGETS_END }, +}; + +static void window_player_list_mouseup(rct_window *w, int widgetIndex); +static void window_player_list_resize(rct_window *w); +static void window_player_list_mousedown(int widgetIndex, rct_window* w, rct_widget* widget); +static void window_player_list_update(rct_window *w); +static void window_player_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_player_list_invalidate(rct_window *w); +static void window_player_list_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_player_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); + +static rct_window_event_list window_player_list_events = { + NULL, + window_player_list_mouseup, + window_player_list_resize, + window_player_list_mousedown, + NULL, + NULL, + window_player_list_update, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_player_list_scrollgetsize, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_player_list_invalidate, + window_player_list_paint, + window_player_list_scrollpaint +}; + +static void window_player_list_refresh_list(rct_window *w); + +void window_player_list_open() +{ + rct_window* window; + + // Check if window is already open + window = window_bring_to_front_by_class(WC_PLAYER_LIST); + if (window != NULL) + return; + + window = window_create_auto_pos(320, 270, &window_player_list_events, WC_PLAYER_LIST, WF_10 | WF_RESIZABLE); + + window->widgets = window_player_list_widgets; + window->enabled_widgets = 1 << WIDX_CLOSE; + window->no_list_items = 0; + window->selected_list_item = -1; + window->frame_no = 0; + window->min_width = 320; + window->min_height = 270; + window->max_width = 500; + window->max_height = 450; + + window_init_scroll_widgets(window); + window->page = 0; + window->list_information_type = 0; + window->colours[0] = 7; + window->colours[1] = 7; + window->colours[2] = 7; +} + +static void window_player_list_mouseup(rct_window *w, int widgetIndex) +{ + switch (widgetIndex) { + case WIDX_CLOSE: + window_close(w); + break; + } +} + +static void window_player_list_resize(rct_window *w) +{ + if (w->width < w->min_width) { + window_invalidate(w); + w->width = w->min_width; + } + if (w->height < w->min_height) { + window_invalidate(w); + w->height = w->min_height; + } + + window_player_list_refresh_list(w); +} + +static void window_player_list_mousedown(int widgetIndex, rct_window* w, rct_widget* widget) +{ + switch (widgetIndex) { + case WIDX_TAB1: + if (w->page != widgetIndex - WIDX_TAB1) { + w->page = widgetIndex - WIDX_TAB1; + w->no_list_items = 0; + w->frame_no = 0; + w->selected_list_item = -1; + window_invalidate(w); + } + break; + } +} + +static void window_player_list_update(rct_window *w) +{ + widget_invalidate(w, WIDX_TAB1 + w->page); +} + +static void window_player_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) +{ + int i; + + uint16 playerCount = 0; + + if (RCT2_GLOBAL(RCT2_ADDRESS_STAFF_HIGHLIGHTED_INDEX, short) != -1) { + RCT2_GLOBAL(RCT2_ADDRESS_STAFF_HIGHLIGHTED_INDEX, short) = -1; + window_invalidate(w); + } + + *height = playerCount * 10; + i = *height - window_player_list_widgets[WIDX_LIST].bottom + window_player_list_widgets[WIDX_LIST].top + 21; + if (i < 0) + i = 0; + if (i < w->scrolls[0].v_top) { + w->scrolls[0].v_top = i; + window_invalidate(w); + } + + *width = 420; +} + +static void window_player_list_invalidate(rct_window *w) +{ + for (int i = 0; i < 1; i++) + w->pressed_widgets &= ~(1 << (WIDX_TAB1 + i)); + w->pressed_widgets |= 1LL << (WIDX_TAB1 + w->page); + window_player_list_widgets[WIDX_BACKGROUND].right = w->width - 1; + window_player_list_widgets[WIDX_BACKGROUND].bottom = w->height - 1; + window_player_list_widgets[WIDX_CONTENT_PANEL].right = w->width - 1; + window_player_list_widgets[WIDX_CONTENT_PANEL].bottom = w->height - 1; + window_player_list_widgets[WIDX_TITLE].right = w->width - 2; + window_player_list_widgets[WIDX_CLOSE].left = w->width - 2 - 0x0B; + window_player_list_widgets[WIDX_CLOSE].right = w->width - 2 - 0x0B + 0x0A; + window_player_list_widgets[WIDX_LIST].right = w->width - 4; + window_player_list_widgets[WIDX_LIST].bottom = w->height - 0x0F; +} + +static void window_player_list_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ + window_draw_widgets(w, dpi); +} + +static void window_player_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) +{ + int y; + + gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ((char*)0x0141FC48)[w->colours[1] * 8]); + + y = 0; + for (int i = 0; i < network_get_num_players(); i++) { + if (y > dpi->y + dpi->height) { + break; + } + + int format = 1191; + + if (y + 11 >= dpi->y) { + gfx_draw_string(dpi, (char*)network_get_player_name(i), 255, 0, y - 1); + } + y += 10; + } +} + +static void window_player_list_refresh_list(rct_window *w) +{ + window_invalidate(w); + + w->no_list_items = 1; + w->list_item_positions[0] = 0; + + w->selected_list_item = -1; + window_invalidate(w); } \ No newline at end of file diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index c55bad4f31..f15b59265d 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -65,6 +65,7 @@ enum { WIDX_FINANCES, WIDX_RESEARCH, WIDX_NEWS, + WIDX_NETWORK, WIDX_SEPARATOR, }; @@ -105,6 +106,10 @@ typedef enum { DDIDX_SCENARIO_OPTIONS = 4 } TOP_TOOLBAR_DEBUG_DDIDX; +typedef enum { + DDIDX_PLAYER_LIST = 0 +} TOP_TOOLBAR_NETWORK_DDIDX; + enum { DDIDX_CHEATS, DDIDX_ENABLE_SANDBOX_MODE = 2, @@ -129,6 +134,7 @@ static const int left_aligned_widgets_order[] = { WIDX_ROTATE, WIDX_VIEW_MENU, WIDX_MAP, + WIDX_NETWORK, }; // from right to left @@ -179,6 +185,7 @@ static rct_widget window_top_toolbar_widgets[] = { { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 3235 }, // Finances { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 2275 }, // Research { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_SHOW_RECENT_MESSAGES_TIP }, // News + { WWT_TRNBTN, 1, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 2276 }, // Network { WWT_EMPTY, 0, 0, 10-1, 0, 0, 0xFFFFFFFF, STR_NONE }, // Artificial widget separator { WIDGETS_END }, @@ -234,6 +241,8 @@ void top_toolbar_init_rotate_menu(rct_window *window, rct_widget *widget); void top_toolbar_rotate_menu_dropdown(short dropdownIndex); void top_toolbar_init_debug_menu(rct_window *window, rct_widget *widget); void top_toolbar_debug_menu_dropdown(short dropdownIndex); +void top_toolbar_init_network_menu(rct_window *window, rct_widget *widget); +void top_toolbar_network_menu_dropdown(short dropdownIndex); void toggle_footpath_window(); void toggle_land_window(rct_window *topToolbar, int widgetIndex); @@ -461,6 +470,9 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg case WIDX_DEBUG: top_toolbar_init_debug_menu(w, widget); break; + case WIDX_NETWORK: + top_toolbar_init_network_menu(w, widget); + break; } } @@ -560,6 +572,9 @@ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int drop case WIDX_DEBUG: top_toolbar_debug_menu_dropdown(dropdownIndex); break; + case WIDX_NETWORK: + top_toolbar_network_menu_dropdown(dropdownIndex); + break; } } @@ -598,6 +613,7 @@ static void window_top_toolbar_invalidate(rct_window *w) window_top_toolbar_widgets[WIDX_CHEATS].type = WWT_TRNBTN; window_top_toolbar_widgets[WIDX_DEBUG].type = gConfigGeneral.debugging_tools ? WWT_TRNBTN : WWT_EMPTY; window_top_toolbar_widgets[WIDX_NEWS].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_NETWORK].type = WWT_TRNBTN; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_SCENARIO_EDITOR | SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) { window_top_toolbar_widgets[WIDX_PAUSE].type = WWT_EMPTY; @@ -645,7 +661,7 @@ static void window_top_toolbar_invalidate(rct_window *w) } enabledWidgets = 0; - for (i = WIDX_PAUSE; i <= WIDX_NEWS; i++) + for (i = WIDX_PAUSE; i <= WIDX_NETWORK; i++) if (window_top_toolbar_widgets[i].type != WWT_EMPTY) enabledWidgets |= (1 << i); w->enabled_widgets = enabledWidgets; @@ -2862,6 +2878,21 @@ void top_toolbar_init_debug_menu(rct_window* w, rct_widget* widget) { RCT2_GLOBAL(0x9DEBA2, uint16) = 0; } +void top_toolbar_init_network_menu(rct_window* w, rct_widget* widget) { + gDropdownItemsFormat[0] = STR_PLAYER_LIST; + + window_dropdown_show_text( + w->x + widget->left, + w->y + widget->top, + widget->bottom - widget->top + 1, + w->colours[1] | 0x80, + 0, + 1 + ); + + RCT2_GLOBAL(0x9DEBA2, uint16) = 0; +} + void top_toolbar_debug_menu_dropdown(short dropdownIndex) { if (dropdownIndex == -1) dropdownIndex = RCT2_GLOBAL(0x9DEBA2, uint16); rct_window* w = window_get_main(); @@ -2887,6 +2918,18 @@ void top_toolbar_debug_menu_dropdown(short dropdownIndex) { } } +void top_toolbar_network_menu_dropdown(short dropdownIndex) { + if (dropdownIndex == -1) dropdownIndex = RCT2_GLOBAL(0x9DEBA2, uint16); + rct_window* w = window_get_main(); + if (w) { + switch (dropdownIndex) { + case DDIDX_PLAYER_LIST: + window_player_list_open(); + break; + } + } +} + /** * * rct2: 0x0066CDE4 From d772f8b5fbac8b533d91894466b968328c236cce Mon Sep 17 00:00:00 2001 From: zsilencer Date: Thu, 16 Jul 2015 18:24:39 -0600 Subject: [PATCH 0508/1173] measure and display ping --- data/language/english_uk.txt | 4 +- src/drawing/drawing.h | 1 + src/localisation/string_ids.h | 2 + src/network/network.cpp | 141 +++++++++++++++++++++++++++++++--- src/network/network.h | 12 +++ src/windows/network.c | 61 ++++++++++++--- 6 files changed, 196 insertions(+), 25 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index fe8db463bd..6c49fdf65b 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3834,4 +3834,6 @@ STR_5492 :Scenario options STR_6000 :Send Message STR_6001 :Type the message you would like to send. -STR_6002 :Player List +STR_6002 :Player List +STR_6003 :Player: +STR_6004 :Ping: diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 49b36f6c57..64ce9c6018 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -135,6 +135,7 @@ void draw_string_right_underline(rct_drawpixelinfo *dpi, int format, void *args, int string_get_height_raw(char *buffer); void gfx_draw_string_centred_wrapped_partial(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct_string_id format, void *args, int ticks); void gfx_draw_string_with_y_offsets(rct_drawpixelinfo *dpi, utf8 *text, int colour, int x, int y, const sint8 *yOffsets); +int gfx_clip_string(char* buffer, int width); bool ttf_initialise(); void ttf_dispose(); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index d28473e43d..1ec59b969b 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2031,6 +2031,8 @@ enum { STR_DEBUG_DROPDOWN_SCENARIO_OPTIONS = 5492, STR_PLAYER_LIST = 6002, + STR_PLAYER = 6003, + STR_PING = 6004, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/network/network.cpp b/src/network/network.cpp index 3e0a04cde1..c1c17a36e2 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -51,6 +51,8 @@ enum { NETWORK_COMMAND_GAMECMD, NETWORK_COMMAND_TICK, NETWORK_COMMAND_PLAYERLIST, + NETWORK_COMMAND_PING, + NETWORK_COMMAND_PINGLIST, NETWORK_COMMAND_MAX }; @@ -125,6 +127,7 @@ NetworkPlayer::NetworkPlayer(const char* name) strncpy((char*)NetworkPlayer::name, name, sizeof(NetworkPlayer::name)); NetworkPlayer::name[sizeof(NetworkPlayer::name) - 1] = 0; ping = 0; + flags = 0; } NetworkConnection::NetworkConnection() @@ -216,6 +219,7 @@ Network::Network() wsa_initialized = false; mode = NETWORK_MODE_NONE; last_tick_sent_time = 0; + last_ping_sent_time = 0; strcpy(password, ""); client_command_handlers.resize(NETWORK_COMMAND_MAX, 0); client_command_handlers[NETWORK_COMMAND_AUTH] = &Network::Client_Handle_AUTH; @@ -224,10 +228,13 @@ Network::Network() client_command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::Client_Handle_GAMECMD; client_command_handlers[NETWORK_COMMAND_TICK] = &Network::Client_Handle_TICK; client_command_handlers[NETWORK_COMMAND_PLAYERLIST] = &Network::Client_Handle_PLAYERLIST; + client_command_handlers[NETWORK_COMMAND_PING] = &Network::Client_Handle_PING; + client_command_handlers[NETWORK_COMMAND_PINGLIST] = &Network::Client_Handle_PINGLIST; server_command_handlers.resize(NETWORK_COMMAND_MAX, 0); server_command_handlers[NETWORK_COMMAND_AUTH] = &Network::Server_Handle_AUTH; server_command_handlers[NETWORK_COMMAND_CHAT] = &Network::Server_Handle_CHAT; server_command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::Server_Handle_GAMECMD; + server_command_handlers[NETWORK_COMMAND_PING] = &Network::Server_Handle_PING; } Network::~Network() @@ -348,9 +355,8 @@ bool Network::BeginServer(unsigned short port) return false; } - std::unique_ptr player(new NetworkPlayer("Server Player")); // change to make_unique in c++14 + NetworkPlayer* player = AddPlayer("Server Player"); player->flags |= NETWORK_PLAYER_FLAG_ISSERVER; - player_list.push_back(std::move(player)); printf("Ready for clients...\n"); @@ -405,6 +411,11 @@ void Network::Update() last_tick_sent_time = SDL_GetTicks(); Server_Send_TICK(); } + if (SDL_GetTicks() - last_ping_sent_time >= 3000) { + last_ping_sent_time = SDL_GetTicks(); + Server_Send_PING(); + Server_Send_PINGLIST(); + } SOCKET socket = accept(listening_socket, NULL, NULL); if (socket == INVALID_SOCKET) { if (WSAGetLastError() != WSAEWOULDBLOCK) { @@ -423,6 +434,14 @@ void Network::Update() } } +NetworkPlayer* Network::GetPlayerByID(int id) { + auto it = std::find_if(player_list.begin(), player_list.end(), [&id](std::unique_ptr const& player) { return player->id == id; }); + if (it != player_list.end()) { + return (*it).get(); + } + return 0; +} + void Network::Client_Send_AUTH(const char* gameversion, const char* name, const char* password) { std::unique_ptr packet = NetworkPacket::AllocatePacket(); @@ -510,6 +529,35 @@ void Network::Server_Send_PLAYERLIST() } } +void Network::Client_Send_PING() +{ + std::unique_ptr packet = NetworkPacket::AllocatePacket(); + *packet << (uint32)NETWORK_COMMAND_PING; + server_connection.QueuePacket(std::move(packet)); +} + +void Network::Server_Send_PING() +{ + std::unique_ptr packet = NetworkPacket::AllocatePacket(); + *packet << (uint32)NETWORK_COMMAND_PING; + for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + (*it)->ping_time = SDL_GetTicks(); + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); + } +} + +void Network::Server_Send_PINGLIST() +{ + std::unique_ptr packet = NetworkPacket::AllocatePacket(); + *packet << (uint32)NETWORK_COMMAND_PINGLIST << (uint32)player_list.size(); + for (unsigned int i = 0; i < player_list.size(); i++) { + *packet << player_list[i]->id << player_list[i]->ping; + } + for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); + } +} + bool Network::ProcessConnection(NetworkConnection& connection) { int packetStatus; @@ -592,6 +640,33 @@ void Network::RemoveClient(std::unique_ptr& connection) Server_Send_PLAYERLIST(); } +NetworkPlayer* Network::AddPlayer(const char* name) +{ + NetworkPlayer* addedplayer = 0; + int newid = -1; + if (GetMode() == NETWORK_MODE_SERVER) { + // Find first unused player id + for (int id = 0; id < 255; id++) { + if (std::find_if(player_list.begin(), player_list.end(), [&id](std::unique_ptr const& player) { return player->id == id; }) == player_list.end()) { + newid = id; + break; + } + } + } else { + newid = 0; + } + if (newid != -1) { + std::unique_ptr player(new NetworkPlayer(name)); // change to make_unique in c++14 + player->id = newid; + addedplayer = player.get(); + player_list.push_back(std::move(player)); + if (GetMode() == NETWORK_MODE_SERVER) { + Server_Send_PLAYERLIST(); + } + } + return addedplayer; +} + void Network::PrintError() { wchar_t *s = NULL; @@ -622,11 +697,8 @@ int Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& pa connection.authstatus = NETWORK_AUTH_BADPASSWORD; } else { connection.authstatus = NETWORK_AUTH_OK; - std::unique_ptr player(new NetworkPlayer(name)); // change to make_unique in c++14 - printf("New player: %s\n", player->name); - connection.player = player.get(); - player_list.push_back(std::move(player)); - Server_Send_PLAYERLIST(); + NetworkPlayer* player = AddPlayer(name); + connection.player = player; } std::unique_ptr responsepacket = NetworkPacket::AllocatePacket(); *responsepacket << (uint32)NETWORK_COMMAND_AUTH << (uint32)connection.authstatus; @@ -726,12 +798,47 @@ int Network::Client_Handle_PLAYERLIST(NetworkConnection& connection, NetworkPack packet >> size; for (unsigned int i = 0; i < size; i++) { const char* name = packet.ReadString(); - std::unique_ptr player(new NetworkPlayer(name)); // change to make_unique in c++14 - packet >> player->id >> player->flags; - if (player->flags & NETWORK_PLAYER_FLAG_ISSERVER) { - server_connection.player = player.get(); + NetworkPlayer* player = AddPlayer(name); + if (player) { + packet >> player->id >> player->flags; + if (player->flags & NETWORK_PLAYER_FLAG_ISSERVER) { + server_connection.player = player; + } + } + } + return 1; +} + +int Network::Client_Handle_PING(NetworkConnection& connection, NetworkPacket& packet) +{ + Client_Send_PING(); + return 1; +} + +int Network::Server_Handle_PING(NetworkConnection& connection, NetworkPacket& packet) +{ + int ping = SDL_GetTicks() - connection.ping_time; + if (ping < 0) { + ping = 0; + } + if (connection.player) { + connection.player->ping = ping; + } + return 1; +} + +int Network::Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket& packet) +{ + uint32 size; + packet >> size; + for (unsigned int i = 0; i < size; i++) { + uint8 id; + uint16 ping; + packet >> id >> ping; + NetworkPlayer* player = GetPlayerByID(id); + if (player) { + player->ping = ping; } - player_list.push_back(std::move(player)); } return 1; } @@ -786,6 +893,16 @@ const char* network_get_player_name(unsigned int index) return (const char*)gNetwork.player_list[index]->name; } +uint32 network_get_player_flags(unsigned int index) +{ + return gNetwork.player_list[index]->flags; +} + +int network_get_player_ping(unsigned int index) +{ + return gNetwork.player_list[index]->ping; +} + void network_send_map() { gNetwork.Server_Send_MAP(); diff --git a/src/network/network.h b/src/network/network.h index 2713d91f80..483496c588 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -111,6 +111,7 @@ public: NetworkPacket inboundpacket; int authstatus; NetworkPlayer* player; + uint32 ping_time; private: int SendPacket(NetworkPacket& packet); @@ -130,6 +131,7 @@ public: int GetAuthStatus(); uint32 GetServerTick(); void Update(); + NetworkPlayer* GetPlayerByID(int id); void Client_Send_AUTH(const char* gameversion, const char* name, const char* password); void Server_Send_MAP(); @@ -139,6 +141,9 @@ public: void Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); void Server_Send_TICK(); void Server_Send_PLAYERLIST(); + void Client_Send_PING(); + void Server_Send_PING(); + void Server_Send_PINGLIST(); std::vector> player_list; @@ -148,6 +153,7 @@ private: void ProcessGameCommandQueue(); void AddClient(SOCKET socket); void RemoveClient(std::unique_ptr& connection); + NetworkPlayer* AddPlayer(const char* name); void PrintError(); struct GameCommand @@ -166,6 +172,7 @@ private: SOCKET listening_socket; NetworkConnection server_connection; uint32 last_tick_sent_time; + uint32 last_ping_sent_time; uint32 server_tick; std::list> client_connection_list; std::multiset game_command_queue; @@ -184,6 +191,9 @@ private: int Server_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& packet); int Client_Handle_TICK(NetworkConnection& connection, NetworkPacket& packet); int Client_Handle_PLAYERLIST(NetworkConnection& connection, NetworkPacket& packet); + int Client_Handle_PING(NetworkConnection& connection, NetworkPacket& packet); + int Server_Handle_PING(NetworkConnection& connection, NetworkPacket& packet); + int Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket& packet); }; extern "C" { @@ -200,6 +210,8 @@ int network_get_authstatus(); uint32 network_get_server_tick(); int network_get_num_players(); const char* network_get_player_name(unsigned int index); +uint32 network_get_player_flags(unsigned int index); +int network_get_player_ping(unsigned int index); void network_send_map(); void network_send_chat(const char* text); diff --git a/src/windows/network.c b/src/windows/network.c index 19019acd3e..0b12f00b3c 100644 --- a/src/windows/network.c +++ b/src/windows/network.c @@ -83,12 +83,12 @@ enum WINDOW_PLAYER_LIST_WIDGET_IDX { }; static rct_widget window_player_list_widgets[] = { - { WWT_FRAME, 0, 0, 319, 0, 269, 0x0FFFFFFFF, 65535 }, // panel / background - { WWT_CAPTION, 0, 1, 318, 1, 14, STR_PLAYER_LIST, STR_WINDOW_TITLE_TIP }, // title bar - { WWT_CLOSEBOX, 0, 307, 317, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button - { WWT_RESIZE, 1, 0, 319, 43, 269, 0x0FFFFFFFF, STR_NONE }, // content panel + { WWT_FRAME, 0, 0, 339, 0, 239, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 338, 1, 14, STR_PLAYER_LIST, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 327, 337, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_RESIZE, 1, 0, 339, 43, 239, 0x0FFFFFFFF, STR_NONE }, // content panel { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, STR_NONE }, // tab - { WWT_SCROLL, 1, 3, 316, 72, 266, 3, 65535 }, // list + { WWT_SCROLL, 1, 3, 336, 60, 236, 2, STR_NONE }, // list { WIDGETS_END }, }; @@ -97,6 +97,7 @@ static void window_player_list_resize(rct_window *w); static void window_player_list_mousedown(int widgetIndex, rct_window* w, rct_widget* widget); static void window_player_list_update(rct_window *w); static void window_player_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_player_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); static void window_player_list_invalidate(rct_window *w); static void window_player_list_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_player_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); @@ -120,7 +121,7 @@ static rct_window_event_list window_player_list_events = { window_player_list_scrollgetsize, NULL, NULL, - NULL, + window_player_list_scrollmouseover, NULL, NULL, NULL, @@ -143,7 +144,7 @@ void window_player_list_open() if (window != NULL) return; - window = window_create_auto_pos(320, 270, &window_player_list_events, WC_PLAYER_LIST, WF_10 | WF_RESIZABLE); + window = window_create_auto_pos(320, 144, &window_player_list_events, WC_PLAYER_LIST, WF_10 | WF_RESIZABLE); window->widgets = window_player_list_widgets; window->enabled_widgets = 1 << WIDX_CLOSE; @@ -151,7 +152,7 @@ void window_player_list_open() window->selected_list_item = -1; window->frame_no = 0; window->min_width = 320; - window->min_height = 270; + window->min_height = 124; window->max_width = 500; window->max_height = 450; @@ -229,6 +230,18 @@ static void window_player_list_scrollgetsize(rct_window *w, int scrollIndex, int *width = 420; } +static void window_player_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) +{ + int index; + + index = y / 10; + if (index >= w->no_list_items) + return; + + w->selected_list_item = index; + window_invalidate(w); +} + static void window_player_list_invalidate(rct_window *w) { for (int i = 0; i < 1; i++) @@ -248,6 +261,8 @@ static void window_player_list_invalidate(rct_window *w) static void window_player_list_paint(rct_window *w, rct_drawpixelinfo *dpi) { window_draw_widgets(w, dpi); + gfx_draw_string_left(dpi, STR_PLAYER, w, w->colours[2], w->x + 6, 58 - 12 + w->y + 1); + gfx_draw_string_left(dpi, STR_PING, w, w->colours[2], w->x + 246, 58 - 12 + w->y + 1); } static void window_player_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) @@ -262,10 +277,32 @@ static void window_player_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi break; } - int format = 1191; - if (y + 11 >= dpi->y) { - gfx_draw_string(dpi, (char*)network_get_player_name(i), 255, 0, y - 1); + char buffer[300]; + int colour = 0; + if (i == w->selected_list_item) { + gfx_fill_rect(dpi, 0, y, 800, y + 9, 0x02000031); + strcpy(&buffer[0], network_get_player_name(i)); + colour = w->colours[2]; + } else { + buffer[0] = FORMAT_BLACK; + if (network_get_player_flags(i) & NETWORK_PLAYER_FLAG_ISSERVER) { + buffer[0] = FORMAT_BABYBLUE; + } + strcpy(&buffer[1], network_get_player_name(i)); + } + gfx_clip_string(buffer, 230); + gfx_draw_string(dpi, buffer, colour, 0, y - 1); + buffer[0] = FORMAT_RED; + int ping = network_get_player_ping(i); + if (ping <= 250) { + buffer[0] = FORMAT_YELLOW; + } + if (ping <= 100) { + buffer[0] = FORMAT_GREEN; + } + sprintf(&buffer[1], "%d ms", ping); + gfx_draw_string(dpi, buffer, colour, 240, y - 1); } y += 10; } @@ -275,7 +312,7 @@ static void window_player_list_refresh_list(rct_window *w) { window_invalidate(w); - w->no_list_items = 1; + w->no_list_items = network_get_num_players(); w->list_item_positions[0] = 0; w->selected_list_item = -1; From 04dedbcec46aa30e225edbe00d95653092026b48 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sat, 18 Jul 2015 10:49:08 -0600 Subject: [PATCH 0509/1173] fix scenery placement issue over network --- src/game.c | 12 +++++++++++- src/game.h | 3 +++ src/network/network.cpp | 4 ++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/game.c b/src/game.c index 8bfadc4d32..4fb5541386 100644 --- a/src/game.c +++ b/src/game.c @@ -418,6 +418,16 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * // Increment nest count RCT2_GLOBAL(0x009A8C28, uint8)++; + // Remove ghost scenery so it doesn't interfere with incoming network command + if ((flags & GAME_COMMAND_FLAG_NETWORKED) && !(flags & 0x40) && + (command == GAME_COMMAND_PLACE_FENCE || + command == GAME_COMMAND_PLACE_SCENERY || + command == GAME_COMMAND_PLACE_LARGE_SCENERY || + command == GAME_COMMAND_PLACE_BANNER || + command == GAME_COMMAND_PLACE_PATH)) { + scenery_remove_ghost_tool_placement(); + } + *ebx &= ~GAME_COMMAND_FLAG_APPLY; // Primary command @@ -447,7 +457,7 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * return cost; } - if (network_get_mode() != NETWORK_MODE_NONE && !(flags & (1 << 31)) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { + if (network_get_mode() != NETWORK_MODE_NONE && !(flags & GAME_COMMAND_FLAG_NETWORKED) && !(flags & 0x40) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { network_send_gamecmd(*eax, *ebx, *ecx, *edx, *esi, *edi, *ebp); if (network_get_mode() == NETWORK_MODE_CLIENT) { // Decrement nest count diff --git a/src/game.h b/src/game.h index ae0ebf5880..5900a57c40 100644 --- a/src/game.h +++ b/src/game.h @@ -89,6 +89,9 @@ enum GAME_COMMAND { // If this flag is set, the command is applied, otherwise only the cost is retrieved #define GAME_COMMAND_FLAG_APPLY (1 << 0) +// Game command is coming from network +#define GAME_COMMAND_FLAG_NETWORKED (1 << 31) + typedef void (GAME_COMMAND_POINTER)(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); extern int gGameSpeed; diff --git a/src/network/network.cpp b/src/network/network.cpp index c1c17a36e2..54f3fa7015 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -494,14 +494,14 @@ void Network::Server_Send_CHAT(const char* text) void Network::Client_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) { std::unique_ptr packet = NetworkPacket::AllocatePacket(); - *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | (1 << 31)) << ecx << edx << esi << edi << ebp; + *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | GAME_COMMAND_FLAG_NETWORKED) << ecx << edx << esi << edi << ebp; server_connection.QueuePacket(std::move(packet)); } void Network::Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) { std::unique_ptr packet = NetworkPacket::AllocatePacket(); - *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | (1 << 31)) << ecx << edx << esi << edi << ebp; + *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | GAME_COMMAND_FLAG_NETWORKED) << ecx << edx << esi << edi << ebp; for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); } From 56f8954e27fec5123bad0727eaa57fe858b60757 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sat, 18 Jul 2015 11:22:59 -0600 Subject: [PATCH 0510/1173] fix clear scenery for network --- src/windows/top_toolbar.c | 16 +++++++--------- src/world/map.c | 36 ++++++++++++++++++++---------------- src/world/map.h | 2 +- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index f15b59265d..4c873ddb82 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -1653,13 +1653,11 @@ void top_toolbar_tool_update_scenery_clear(sint16 x, sint16 y){ if (!state_changed) return; - money32 cost = map_clear_scenery( - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16), - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16), - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, sint16), - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16), - 0 - ); + int eax = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16); + int ecx = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16); + int edi = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, sint16); + int ebp = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16); + money32 cost = game_do_command(eax, 0, ecx, 0, GAME_COMMAND_CLEAR_SCENERY, edi, ebp); if (RCT2_GLOBAL(0x00F1AD62, money32) != cost){ RCT2_GLOBAL(0x00F1AD62, money32) = cost; @@ -2488,7 +2486,7 @@ static void window_top_toolbar_tool_down(rct_window* w, int widgetIndex, int x, RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16), 1, RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16), - 0, + (gClearSmallScenery | gClearLargeScenery << 1 | gClearFootpath << 2), GAME_COMMAND_CLEAR_SCENERY, RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, sint16), RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16) @@ -2697,7 +2695,7 @@ static void window_top_toolbar_tool_drag(rct_window* w, int widgetIndex, int x, RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16), 1, RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16), - 0, + (gClearSmallScenery | gClearLargeScenery << 1 | gClearFootpath << 2), GAME_COMMAND_CLEAR_SCENERY, RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, sint16), RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16) diff --git a/src/world/map.c b/src/world/map.c index 3004e105fa..e310fa3da5 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1370,7 +1370,7 @@ void game_command_set_banner_colour(int* eax, int* ebx, int* ecx, int* edx, int* * * rct2: 0x0068DFE4 */ -money32 map_clear_scenery_from_tile(int x, int y, int flags) +money32 map_clear_scenery_from_tile(int x, int y, int clear, int flags) { int type; money32 cost, totalCost; @@ -1384,8 +1384,14 @@ restart_from_beginning: type = map_element_get_type(mapElement); switch (type) { case MAP_ELEMENT_TYPE_PATH: - if (gClearFootpath) { - cost = footpath_remove_real(x * 32, y * 32, mapElement->base_height, flags); + if (clear & (1 << 2)) { + int eax = x * 32; + int ebx = flags; + int ecx = y * 32; + int edx = mapElement->base_height; + int edi, ebp; + cost = game_do_command(eax, ebx, ecx, edx, GAME_COMMAND_REMOVE_PATH, edi, ebp); + if (cost == MONEY32_UNDEFINED) return MONEY32_UNDEFINED; @@ -1394,14 +1400,13 @@ restart_from_beginning: goto restart_from_beginning; } break; case MAP_ELEMENT_TYPE_SCENERY: - if (gClearSmallScenery) { + if (clear & (1 << 0)) { int eax = x * 32; int ebx = (mapElement->type << 8) | flags; int ecx = y * 32; int edx = (mapElement->properties.scenery.type << 8) | (mapElement->base_height); - int esi, edi, ebp; - game_command_remove_scenery(&eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - cost = ebx; + int edi, ebp; + cost = game_do_command(eax, ebx, ecx, edx, GAME_COMMAND_REMOVE_SCENERY, edi, ebp); if (cost == MONEY32_UNDEFINED) return MONEY32_UNDEFINED; @@ -1412,14 +1417,13 @@ restart_from_beginning: } break; case MAP_ELEMENT_TYPE_FENCE: - if (gClearSmallScenery) { + if (clear & (1 << 0)) { int eax = x * 32; int ebx = flags; int ecx = y * 32; int edx = (mapElement->base_height << 8) | (mapElement->type & MAP_ELEMENT_DIRECTION_MASK); - int esi, edi, ebp; - game_command_remove_fence(&eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - cost = ebx; + int edi, ebp; + cost = game_do_command(eax, ebx, ecx, edx, GAME_COMMAND_REMOVE_FENCE, edi, ebp); if (cost == MONEY32_UNDEFINED) return MONEY32_UNDEFINED; @@ -1430,14 +1434,13 @@ restart_from_beginning: } break; case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: - if (gClearLargeScenery) { + if (clear & (1 << 1)) { int eax = x * 32; int ebx = flags | ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) << 8); int ecx = y * 32; int edx = mapElement->base_height | ((mapElement->properties.scenerymultiple.type >> 10) << 8); - int esi, edi, ebp; - game_command_remove_large_scenery(&eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - cost = ebx; + int edi, ebp; + cost = game_do_command(eax, ebx, ecx, edx, GAME_COMMAND_REMOVE_LARGE_SCENERY, edi, ebp); if (cost == MONEY32_UNDEFINED) return MONEY32_UNDEFINED; @@ -1454,7 +1457,7 @@ restart_from_beginning: return totalCost; } -money32 map_clear_scenery(int x0, int y0, int x1, int y1, int flags) +money32 map_clear_scenery(int x0, int y0, int x1, int y1, int clear, int flags) { int x, y, z; money32 totalCost, cost; @@ -1504,6 +1507,7 @@ void game_command_clear_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi (sint16)(*ecx & 0xFFFF), (sint16)(*edi & 0xFFFF), (sint16)(*ebp & 0xFFFF), + *edx, *ebx & 0xFF ); } diff --git a/src/world/map.h b/src/world/map.h index f163b82969..3f71c14227 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -301,7 +301,7 @@ int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *cle int map_can_construct_at(int x, int y, int zLow, int zHigh, uint8 bl); void rotate_map_coordinates(sint16 *x, sint16 *y, int rotation); rct_xy16 coordinate_3d_to_2d(const rct_xyz16* coordinate_3d, int rotation); -money32 map_clear_scenery(int x0, int y0, int x1, int y1, int flags); +money32 map_clear_scenery(int x0, int y0, int x1, int y1, int clear, int flags); money32 lower_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags); money32 raise_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags); money32 map_place_fence(int type, int x, int y, int z, int edge, int primaryColour, int secondaryColour, int tertiaryColour, int flags); From 1d811a56929869c23ed7a9a00131793b4cb730fd Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sat, 18 Jul 2015 17:57:42 -0600 Subject: [PATCH 0511/1173] improve chat feature --- projects/openrct2.vcxproj | 2 + src/audio/mixer.cpp | 6 ++ src/input.c | 4 + src/interface/chat.c | 133 +++++++++++++++++++++++++++++ src/interface/chat.h | 21 +++++ src/interface/keyboard_shortcut.c | 3 +- src/interface/window.h | 1 - src/network/network.cpp | 134 +++++++++++++++++------------- src/network/network.h | 6 +- src/openrct2.c | 3 + src/rct2.c | 3 + src/windows/network.c | 65 ++------------- 12 files changed, 258 insertions(+), 123 deletions(-) create mode 100644 src/interface/chat.c create mode 100644 src/interface/chat.h diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 4aa7770319..d2fdb6d9c2 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -44,6 +44,7 @@ + @@ -204,6 +205,7 @@ + diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index 4927d5ea9e..0ba7743bee 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -780,6 +780,9 @@ void Mixer_Init(const char* device) void* Mixer_Play_Effect(int id, int loop, int volume, float pan, double rate, int deleteondone) { + if (!gConfigSound.sound) { + return 0; + } if (id >= countof(gMixer.css1sources)) { return 0; } @@ -842,6 +845,9 @@ void Mixer_Channel_SetGroup(void* channel, int group) void* Mixer_Play_Music(int pathid, int loop, int streaming) { + if (!gConfigSound.sound) { + return 0; + } if (streaming) { const char* filename = get_file_path(pathid); diff --git a/src/input.c b/src/input.c index 792ccbbab7..fd7c50010b 100644 --- a/src/input.c +++ b/src/input.c @@ -25,6 +25,7 @@ #include "cursors.h" #include "game.h" #include "input.h" +#include "interface/chat.h" #include "interface/console.h" #include "interface/keyboard_shortcut.h" #include "interface/viewport.h" @@ -1344,6 +1345,9 @@ void game_handle_keyboard_input() } else if (gConsoleOpen) { console_input(key); continue; + } else if (gChatOpen) { + chat_input(key); + continue; } key |= RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) << 8; diff --git a/src/interface/chat.c b/src/interface/chat.c new file mode 100644 index 0000000000..57d852520d --- /dev/null +++ b/src/interface/chat.c @@ -0,0 +1,133 @@ +#include "../addresses.h" +#include "../audio/audio.h" +#include "../audio/mixer.h" +#include "../localisation/localisation.h" +#include "../network/network.h" +#include "../platform/platform.h" +#include "chat.h" + +#define CHAT_HISTORY_SIZE 10 +#define CHAT_INPUT_SIZE 256 + +bool gChatOpen = false; +char _chatCurrentLine[CHAT_INPUT_SIZE]; +char _chatHistory[CHAT_HISTORY_SIZE][CHAT_INPUT_SIZE]; +uint32 _chatHistoryTime[CHAT_HISTORY_SIZE]; +unsigned int _chatHistoryIndex = 0; +uint32 _chatCaretTicks = 0; +int _chatLeft; +int _chatTop; +int _chatRight; +int _chatBottom; + +static const char* chat_history_get(unsigned int index); +static uint32 chat_history_get_time(unsigned int index); +static void chat_clear_input(); + +void chat_open() +{ + gChatOpen = true; + platform_start_text_input(_chatCurrentLine, sizeof(_chatCurrentLine)); +} + +void chat_close() +{ + gChatOpen = false; + platform_stop_text_input(); +} + +void chat_toggle() +{ + if (gChatOpen) { + chat_close(); + } else { + chat_open(); + } +} + +void chat_init() +{ + memset(_chatHistory, 0, sizeof(_chatHistory)); + memset(_chatHistoryTime, 0, sizeof(_chatHistoryTime)); +} + +void chat_update() +{ + // Flash the caret + _chatCaretTicks = (_chatCaretTicks + 1) % 30; +} + +void chat_draw() +{ + rct_drawpixelinfo *dpi = (rct_drawpixelinfo*)RCT2_ADDRESS_SCREEN_DPI; + _chatLeft = 10; + _chatTop = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 40 - ((CHAT_HISTORY_SIZE + 1) * 10); + _chatRight = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 10; + _chatBottom = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 40; + char lineBuffer[CHAT_INPUT_SIZE + 3]; + int x = _chatLeft; + int y = _chatBottom - (10 * 2); + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16) = 0; + for (int i = 0; i < CHAT_HISTORY_SIZE; i++, y -= 10) { + if (!gChatOpen && SDL_TICKS_PASSED(SDL_GetTicks(), chat_history_get_time(i) + 10000)) { + break; + } + strcpy(lineBuffer, chat_history_get(i)); + gfx_set_dirty_blocks(x, y, x + gfx_get_string_width(lineBuffer), y + 12); + gfx_draw_string(dpi, lineBuffer, 255, x, y); + } + if (gChatOpen) { + lineBuffer[0] = FORMAT_OUTLINE; + lineBuffer[1] = FORMAT_CELADON; + strcpy(lineBuffer + 2, _chatCurrentLine); + y = _chatBottom - 10; + gfx_set_dirty_blocks(x, y, x + gfx_get_string_width(lineBuffer) + 7, y + 12); + if (_chatCaretTicks < 15) { + int caretX = x + gfx_get_string_width(lineBuffer); + int caretY = y + 10; + + gfx_fill_rect(dpi, caretX, caretY, caretX + 6, caretY + 1, 0x38); + } + gfx_draw_string(dpi, lineBuffer, 255, x, y); + } +} + +void chat_history_add(const char *src) +{ + int index = _chatHistoryIndex % CHAT_HISTORY_SIZE; + memset(_chatHistory[index], 0, CHAT_INPUT_SIZE); + memcpy(_chatHistory[index], src, min(strlen(src), CHAT_INPUT_SIZE)); + _chatHistoryTime[index] = SDL_GetTicks(); + _chatHistoryIndex++; + Mixer_Play_Effect(SOUND_NEWS_ITEM, 0, SDL_MIX_MAXVOLUME, 0, 1.5f, true); +} + +void chat_input(int c) +{ + switch (c) { + case SDL_SCANCODE_RETURN: + network_send_chat(_chatCurrentLine); + chat_clear_input(); + chat_close(); + break; + case SDL_SCANCODE_ESCAPE: + chat_close(); + break; + } +} + +static const char* chat_history_get(unsigned int index) +{ + return _chatHistory[(_chatHistoryIndex + CHAT_HISTORY_SIZE - index - 1) % CHAT_HISTORY_SIZE]; +} + +static uint32 chat_history_get_time(unsigned int index) +{ + return _chatHistoryTime[(_chatHistoryIndex + CHAT_HISTORY_SIZE - index - 1) % CHAT_HISTORY_SIZE]; +} + +static void chat_clear_input() +{ + _chatCurrentLine[0] = 0; +} \ No newline at end of file diff --git a/src/interface/chat.h b/src/interface/chat.h new file mode 100644 index 0000000000..b288558b00 --- /dev/null +++ b/src/interface/chat.h @@ -0,0 +1,21 @@ +#ifndef _CHAT_H_ +#define _CHAT_H_ + +#include "../common.h" +#include "../drawing/drawing.h" + +extern bool gChatOpen; + +void chat_open(); +void chat_close(); +void chat_toggle(); + +void chat_init(); +void chat_update(); +void chat_draw(); + +void chat_history_add(const char *src); +void chat_input(int c); + + +#endif \ No newline at end of file diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index c9b21da0e5..ee10a02fd5 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -21,6 +21,7 @@ #include "../addresses.h" #include "../config.h" #include "../game.h" +#include "../interface/chat.h" #include "../input.h" #include "../localisation/localisation.h" #include "../network/network.h" @@ -496,7 +497,7 @@ static void shortcut_open_cheat_window() static void shortcut_open_chat_window() { - window_chat_open(); + chat_toggle(); } static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { diff --git a/src/interface/window.h b/src/interface/window.h index 105d268db3..7eae6f277b 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -612,7 +612,6 @@ void window_banner_open(rct_windownumber number); void window_sign_open(rct_windownumber number); void window_sign_small_open(rct_windownumber number); void window_cheats_open(); -void window_chat_open(); void window_player_list_open(); void window_research_open(); diff --git a/src/network/network.cpp b/src/network/network.cpp index 54f3fa7015..b9ecde35e1 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -27,9 +27,9 @@ extern "C" { #include "../addresses.h" #include "../game.h" +#include "../interface/chat.h" #include "../localisation/date.h" #include "../localisation/localisation.h" -#include "../management/news_item.h" #include "../scenario.h" } @@ -64,14 +64,14 @@ NetworkPacket::NetworkPacket() data = std::make_shared>(); } -std::unique_ptr NetworkPacket::AllocatePacket() +std::unique_ptr NetworkPacket::Allocate() { - return std::move(std::unique_ptr(new NetworkPacket)); // change to make_unique in c++14 + return std::unique_ptr(new NetworkPacket); // change to make_unique in c++14 } -std::unique_ptr NetworkPacket::DuplicatePacket(NetworkPacket& packet) +std::unique_ptr NetworkPacket::Duplicate(NetworkPacket& packet) { - return std::move(std::unique_ptr(new NetworkPacket(packet))); // change to make_unique in c++14 + return std::unique_ptr(new NetworkPacket(packet)); // change to make_unique in c++14 } uint8* NetworkPacket::GetData() @@ -442,9 +442,29 @@ NetworkPlayer* Network::GetPlayerByID(int id) { return 0; } +const char* Network::FormatChat(NetworkPlayer* fromplayer, const char* text) +{ + static char formatted[1024]; + formatted[0] = (char)FORMAT_OUTLINE; + formatted[1] = (char)FORMAT_BABYBLUE; + if (fromplayer) { + strcpy(&formatted[2], (const char*)fromplayer->name); + } + strcat(formatted, ": "); + strcat(formatted, text); + return formatted; +} + +void Network::SendPacketToClients(NetworkPacket& packet) +{ + for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + (*it)->QueuePacket(std::move(NetworkPacket::Duplicate(packet))); + } +} + void Network::Client_Send_AUTH(const char* gameversion, const char* name, const char* password) { - std::unique_ptr packet = NetworkPacket::AllocatePacket(); + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_AUTH; packet->WriteString(gameversion); packet->WriteString(name); @@ -463,19 +483,17 @@ void Network::Server_Send_MAP() int chunksize = 1000; for (int i = 0; i < size; i += chunksize) { int datasize = min(chunksize, size - i); - std::unique_ptr packet = NetworkPacket::AllocatePacket(); + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_MAP << (uint32)size << (uint32)i; packet->Write(&buffer[i], datasize); - for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); - } + SendPacketToClients(*packet); } SDL_RWclose(rw); } void Network::Client_Send_CHAT(const char* text) { - std::unique_ptr packet = NetworkPacket::AllocatePacket(); + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_CHAT; packet->Write((uint8*)text, strlen(text) + 1); server_connection.QueuePacket(std::move(packet)); @@ -483,79 +501,69 @@ void Network::Client_Send_CHAT(const char* text) void Network::Server_Send_CHAT(const char* text) { - std::unique_ptr packet = NetworkPacket::AllocatePacket(); + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_CHAT; packet->Write((uint8*)text, strlen(text) + 1); - for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); - } + SendPacketToClients(*packet); } void Network::Client_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) { - std::unique_ptr packet = NetworkPacket::AllocatePacket(); + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | GAME_COMMAND_FLAG_NETWORKED) << ecx << edx << esi << edi << ebp; server_connection.QueuePacket(std::move(packet)); } void Network::Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) { - std::unique_ptr packet = NetworkPacket::AllocatePacket(); + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | GAME_COMMAND_FLAG_NETWORKED) << ecx << edx << esi << edi << ebp; - for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); - } + SendPacketToClients(*packet); } void Network::Server_Send_TICK() { - std::unique_ptr packet = NetworkPacket::AllocatePacket(); + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_TICK << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); - for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); - } + SendPacketToClients(*packet); } void Network::Server_Send_PLAYERLIST() { - std::unique_ptr packet = NetworkPacket::AllocatePacket(); + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_PLAYERLIST << (uint32)player_list.size(); for (unsigned int i = 0; i < player_list.size(); i++) { packet->WriteString((const char*)player_list[i]->name); *packet << player_list[i]->id << player_list[i]->flags; } - for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); - } + SendPacketToClients(*packet); } void Network::Client_Send_PING() { - std::unique_ptr packet = NetworkPacket::AllocatePacket(); + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_PING; server_connection.QueuePacket(std::move(packet)); } void Network::Server_Send_PING() { - std::unique_ptr packet = NetworkPacket::AllocatePacket(); + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_PING; for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { (*it)->ping_time = SDL_GetTicks(); - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); } + SendPacketToClients(*packet); } void Network::Server_Send_PINGLIST() { - std::unique_ptr packet = NetworkPacket::AllocatePacket(); + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_PINGLIST << (uint32)player_list.size(); for (unsigned int i = 0; i < player_list.size(); i++) { *packet << player_list[i]->id << player_list[i]->ping; } - for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { - (*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet)); - } + SendPacketToClients(*packet); } bool Network::ProcessConnection(NetworkConnection& connection) @@ -625,7 +633,6 @@ void Network::ProcessGameCommandQueue() void Network::AddClient(SOCKET socket) { - printf("New client connection\n"); auto connection = std::unique_ptr(new NetworkConnection); // change to make_unique in c++14 connection->socket = socket; client_connection_list.push_back(std::move(connection)); @@ -633,8 +640,15 @@ void Network::AddClient(SOCKET socket) void Network::RemoveClient(std::unique_ptr& connection) { - printf("Client removed\n"); NetworkPlayer* connection_player = connection->player; + if (connection_player) { + char text[256]; + text[0] = (char)FORMAT_OUTLINE; + text[1] = (char)FORMAT_RED; + sprintf(&text[2], "%s has disconnected", connection_player->name); + chat_history_add(text); + gNetwork.Server_Send_CHAT(text); + } player_list.erase(std::remove_if(player_list.begin(), player_list.end(), [connection_player](std::unique_ptr& player){ return player.get() == connection_player; }), player_list.end()); client_connection_list.remove(connection); Server_Send_PLAYERLIST(); @@ -699,8 +713,14 @@ int Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& pa connection.authstatus = NETWORK_AUTH_OK; NetworkPlayer* player = AddPlayer(name); connection.player = player; + char text[256]; + text[0] = (char)FORMAT_OUTLINE; + text[1] = (char)FORMAT_GREEN; + sprintf(&text[2], "%s has joined the game", player->name); + chat_history_add(text); + gNetwork.Server_Send_CHAT(text); } - std::unique_ptr responsepacket = NetworkPacket::AllocatePacket(); + std::unique_ptr responsepacket = std::move(NetworkPacket::Allocate()); *responsepacket << (uint32)NETWORK_COMMAND_AUTH << (uint32)connection.authstatus; connection.QueuePacket(std::move(responsepacket)); } @@ -716,6 +736,9 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac return 0; } else { int chunksize = packet.size - packet.read; + if (chunksize <= 0) { + return 0; + } if (offset + chunksize > chunk_buffer.size()) { chunk_buffer.resize(offset + chunksize); } @@ -737,31 +760,21 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac int Network::Client_Handle_CHAT(NetworkConnection& connection, NetworkPacket& packet) { - rct_news_item newsItem; - newsItem.type = NEWS_ITEM_BLANK; - newsItem.flags = 1; - newsItem.assoc = 0; - newsItem.ticks = 0; - newsItem.month_year = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); - newsItem.day = ((days_in_month[(newsItem.month_year & 7)] * RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16)) >> 16) + 1; - newsItem.colour = FORMAT_TOPAZ; - strcpy(newsItem.text, (char*)packet.Read(packet.size - packet.read)); - news_item_add_to_queue_custom(&newsItem); + const char* text = (char*)packet.Read(packet.size - packet.read); + if (text) { + chat_history_add(text); + } return 1; } int Network::Server_Handle_CHAT(NetworkConnection& connection, NetworkPacket& packet) { - rct_news_item newsItem; - newsItem.type = NEWS_ITEM_BLANK; - newsItem.flags = 1; - newsItem.assoc = 0; - newsItem.ticks = 0; - newsItem.month_year = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); - newsItem.day = ((days_in_month[(newsItem.month_year & 7)] * RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16)) >> 16) + 1; - newsItem.colour = FORMAT_TOPAZ; - strcpy(newsItem.text, (char*)packet.Read(packet.size - packet.read)); - news_item_add_to_queue_custom(&newsItem); + const char* text = (const char*)packet.Read(packet.size - packet.read); + if (text) { + const char* formatted = FormatChat(connection.player, text); + chat_history_add(formatted); + Server_Send_CHAT(formatted); + } return 1; } @@ -914,7 +927,10 @@ void network_send_chat(const char* text) gNetwork.Client_Send_CHAT(text); } else if (gNetwork.GetMode() == NETWORK_MODE_SERVER) { - gNetwork.Server_Send_CHAT(text); + NetworkPlayer* player = gNetwork.GetPlayerByID(0); + const char* formatted = gNetwork.FormatChat(player, text); + chat_history_add(formatted); + gNetwork.Server_Send_CHAT(formatted); } } diff --git a/src/network/network.h b/src/network/network.h index 483496c588..8254f05c36 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -70,8 +70,8 @@ class NetworkPacket { public: NetworkPacket(); - static std::unique_ptr AllocatePacket(); - static std::unique_ptr DuplicatePacket(NetworkPacket& packet); + static std::unique_ptr Allocate(); + static std::unique_ptr Duplicate(NetworkPacket& packet); uint8* GetData(); template NetworkPacket& operator<<(T value) { T swapped = ByteSwapBE(value); uint8* bytes = (uint8*)&swapped; data->insert(data->end(), bytes, bytes + sizeof(value)); return *this; } @@ -132,6 +132,8 @@ public: uint32 GetServerTick(); void Update(); NetworkPlayer* GetPlayerByID(int id); + const char* FormatChat(NetworkPlayer* fromplayer, const char* text); + void SendPacketToClients(NetworkPacket& packet); void Client_Send_AUTH(const char* gameversion, const char* name, const char* password); void Server_Send_MAP(); diff --git a/src/openrct2.c b/src/openrct2.c index fd4e04928c..373416d349 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -26,6 +26,7 @@ #include "editor.h" #include "game.h" #include "hook.h" +#include "interface/chat.h" #include "interface/window.h" #include "interface/viewport.h" #include "localisation/localisation.h" @@ -201,6 +202,8 @@ bool openrct2_initialise() if (!rct2_init()) return false; + chat_init(); + openrct2_copy_original_user_files_over(); // TODO move to audio initialise function diff --git a/src/rct2.c b/src/rct2.c index a765fe888a..24f00a2c45 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -29,6 +29,7 @@ #include "drawing/drawing.h" #include "editor.h" #include "game.h" +#include "interface/chat.h" #include "interface/console.h" #include "interface/viewport.h" #include "intro.h" @@ -228,6 +229,7 @@ void rct2_draw() update_rain_animation(); update_palette_effects(); + chat_draw(); console_draw(RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo)); if (RCT2_GLOBAL(RCT2_ADDRESS_RUN_INTRO_TICK_PART, uint8) != 0) { @@ -381,6 +383,7 @@ void rct2_update_2() stop_completed_sounds(); // removes other sounds that are no longer playing in directsound twitch_update(); + chat_update(); console_update(); } diff --git a/src/windows/network.c b/src/windows/network.c index 0b12f00b3c..f40367c248 100644 --- a/src/windows/network.c +++ b/src/windows/network.c @@ -24,55 +24,6 @@ #include "../localisation/localisation.h" #include "../network/network.h" -static void window_chat_host_textinput(rct_window *w, int widgetIndex, char *text) -{ - network_send_chat(text); - - window_close(w); -} - -static rct_window_event_list window_chat_host_events = { - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - window_chat_host_textinput, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL -}; - -void window_chat_open() -{ - rct_window *w; - w = window_create(0, 0, 0, 0, &window_chat_host_events, WC_CHAT_HOST, 0); - w->colours[0] = 1; - w->colours[1] = 1; - w->colours[2] = 0; - w->number = 0; - window_text_input_open(w, 0, 6000, 6001, STR_NONE, 0, 64); -} - enum WINDOW_PLAYER_LIST_WIDGET_IDX { WIDX_BACKGROUND, WIDX_TITLE, @@ -148,6 +99,7 @@ void window_player_list_open() window->widgets = window_player_list_widgets; window->enabled_widgets = 1 << WIDX_CLOSE; + window_init_scroll_widgets(window); window->no_list_items = 0; window->selected_list_item = -1; window->frame_no = 0; @@ -156,7 +108,6 @@ void window_player_list_open() window->max_width = 500; window->max_height = 450; - window_init_scroll_widgets(window); window->page = 0; window->list_information_type = 0; window->colours[0] = 7; @@ -211,14 +162,12 @@ static void window_player_list_scrollgetsize(rct_window *w, int scrollIndex, int { int i; - uint16 playerCount = 0; - - if (RCT2_GLOBAL(RCT2_ADDRESS_STAFF_HIGHLIGHTED_INDEX, short) != -1) { - RCT2_GLOBAL(RCT2_ADDRESS_STAFF_HIGHLIGHTED_INDEX, short) = -1; + if (w->selected_list_item != -1) { + w->selected_list_item = -1; window_invalidate(w); } - - *height = playerCount * 10; + + *height = network_get_num_players() * 10; i = *height - window_player_list_widgets[WIDX_LIST].bottom + window_player_list_widgets[WIDX_LIST].top + 21; if (i < 0) i = 0; @@ -226,8 +175,6 @@ static void window_player_list_scrollgetsize(rct_window *w, int scrollIndex, int w->scrolls[0].v_top = i; window_invalidate(w); } - - *width = 420; } static void window_player_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) @@ -310,8 +257,6 @@ static void window_player_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi static void window_player_list_refresh_list(rct_window *w) { - window_invalidate(w); - w->no_list_items = network_get_num_players(); w->list_item_positions[0] = 0; From 3b4a4fcdaca68a5246265905c1e300137d80df62 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Wed, 22 Jul 2015 16:55:43 -0600 Subject: [PATCH 0512/1173] network status window --- projects/openrct2.vcxproj | 3 +- src/interface/window.h | 2 + src/network/network.cpp | 6 +- src/windows/network_status.c | 144 +++++++++++++++++++++++ src/windows/{network.c => player_list.c} | 2 +- 5 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 src/windows/network_status.c rename src/windows/{network.c => player_list.c} (99%) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index d2fdb6d9c2..a6886387b4 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -98,7 +98,8 @@ - + + diff --git a/src/interface/window.h b/src/interface/window.h index 7eae6f277b..080c6c201a 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -448,6 +448,7 @@ enum { WC_TITLE_COMMAND_EDITOR = 123, WC_CHAT_HOST = 124, WC_PLAYER_LIST = 125, + WC_NETWORK_STATUS = 126, // Only used for colour schemes WC_STAFF = 220, @@ -613,6 +614,7 @@ void window_sign_open(rct_windownumber number); void window_sign_small_open(rct_windownumber number); void window_cheats_open(); void window_player_list_open(); +void window_network_status_open(const char* text); void window_research_open(); void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dpi, int baseWidgetIndex); diff --git a/src/network/network.cpp b/src/network/network.cpp index b9ecde35e1..259b6fae90 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -28,6 +28,7 @@ extern "C" { #include "../addresses.h" #include "../game.h" #include "../interface/chat.h" +#include "../interface/window.h" #include "../localisation/date.h" #include "../localisation/localisation.h" #include "../scenario.h" @@ -742,15 +743,18 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac if (offset + chunksize > chunk_buffer.size()) { chunk_buffer.resize(offset + chunksize); } + char status[256]; + sprintf(status, "Downloading map ... (%d / %d)", (offset + chunksize) / 1000, size / 1000); + window_network_status_open(status); memcpy(&chunk_buffer[offset], (void*)packet.Read(chunksize), chunksize); if (offset + chunksize == size) { - printf("Loading new map from network...\n"); SDL_RWops* rw = SDL_RWFromMem(&chunk_buffer[0], size); if (game_load_sv6(rw)) { game_load_init(); if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) & 1) pause_toggle(); game_command_queue.clear(); + window_network_status_open("Loaded new map from network"); } SDL_RWclose(rw); } diff --git a/src/windows/network_status.c b/src/windows/network_status.c new file mode 100644 index 0000000000..441d93ebce --- /dev/null +++ b/src/windows/network_status.c @@ -0,0 +1,144 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#include "../interface/themes.h" +#include "../interface/widget.h" +#include "../interface/window.h" +#include "../localisation/localisation.h" +#include "../network/network.h" + +enum WINDOW_NETWORK_STATUS_WIDGET_IDX { + WIDX_BACKGROUND, + WIDX_TITLE, + WIDX_CLOSE, +}; + +static rct_widget window_network_status_widgets[] = { + { WWT_FRAME, 0, 0, 340, 0, 90, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 338, 1, 14, STR_NONE, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 327, 337, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WIDGETS_END }, +}; + +static char window_network_status_text[1024]; + +static void window_network_status_mouseup(rct_window *w, int widgetIndex); +static void window_network_status_update(rct_window *w); +static void window_network_status_invalidate(rct_window *w); +static void window_network_status_paint(rct_window *w, rct_drawpixelinfo *dpi); + +static rct_window_event_list window_network_status_events = { + NULL, + window_network_status_mouseup, + NULL, + NULL, + NULL, + NULL, + window_network_status_update, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_network_status_invalidate, + window_network_status_paint, + NULL +}; + +void window_network_status_open(const char* text) +{ + rct_window* window; + + // Check if window is already open + window = window_bring_to_front_by_class(WC_NETWORK_STATUS); + if (window != NULL) + return; + + window = window_create_centred(320, 90, &window_network_status_events, WC_NETWORK_STATUS, WF_10 | WF_TRANSPARENT); + + strncpy(window_network_status_text, text, sizeof(window_network_status_text)); + + window->widgets = window_network_status_widgets; + window->enabled_widgets = 1 << WIDX_CLOSE; + window_init_scroll_widgets(window); + window->no_list_items = 0; + window->selected_list_item = -1; + window->frame_no = 0; + window->min_width = 320; + window->min_height = 90; + window->max_width = window->min_width; + window->max_height = window->min_height; + + window->page = 0; + window->list_information_type = 0; + window->colours[0] = 7; + window->colours[1] = 7; + window->colours[2] = 7; +} + +static void window_network_status_mouseup(rct_window *w, int widgetIndex) +{ + switch (widgetIndex) { + case WIDX_CLOSE: + window_close(w); + break; + } +} + +static void window_network_status_update(rct_window *w) +{ + widget_invalidate(w, WIDX_BACKGROUND); +} + +static void window_network_status_invalidate(rct_window *w) +{ + window_network_status_widgets[WIDX_BACKGROUND].right = w->width - 1; + window_network_status_widgets[WIDX_BACKGROUND].bottom = w->height - 1; + window_network_status_widgets[WIDX_TITLE].right = w->width - 2; + window_network_status_widgets[WIDX_CLOSE].left = w->width - 2 - 0x0B; + window_network_status_widgets[WIDX_CLOSE].right = w->width - 2 - 0x0B + 0x0A; +} + +static void window_network_status_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ + window_draw_widgets(w, dpi); + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; + char buffer[sizeof(window_network_status_text) + 1]; + buffer[0] = FORMAT_BLACK; + strcpy(&buffer[1], window_network_status_text); + gfx_clip_string(buffer, 230); + int x = w->x + (w->width / 2); + int y = w->y + (w->height / 2); + x -= gfx_get_string_width(buffer) / 2; + gfx_draw_string(dpi, buffer, 0, x, y); +} diff --git a/src/windows/network.c b/src/windows/player_list.c similarity index 99% rename from src/windows/network.c rename to src/windows/player_list.c index f40367c248..f095e3df58 100644 --- a/src/windows/network.c +++ b/src/windows/player_list.c @@ -262,4 +262,4 @@ static void window_player_list_refresh_list(rct_window *w) w->selected_list_item = -1; window_invalidate(w); -} \ No newline at end of file +} From 584b34e6d5c5b4ec371c58c85beeb437b9ed2e6e Mon Sep 17 00:00:00 2001 From: zsilencer Date: Thu, 23 Jul 2015 17:22:03 -0600 Subject: [PATCH 0513/1173] fix game_command_create_ride for network --- src/game.c | 41 +++++++++++++++--- src/game.h | 20 +++++++-- src/network/network.cpp | 74 ++++++++++++++++++++++----------- src/network/network.h | 13 ++++-- src/ride/ride.c | 17 ++++++-- src/ride/ride.h | 1 + src/ride/track.c | 18 ++++---- src/windows/ride_construction.c | 3 +- 8 files changed, 137 insertions(+), 50 deletions(-) diff --git a/src/game.c b/src/game.c index 4fb5541386..e543cfa2d4 100644 --- a/src/game.c +++ b/src/game.c @@ -61,6 +61,30 @@ int gGameSpeed = 1; float gDayNightCycle = 0; +GAME_COMMAND_CALLBACK_POINTER* game_command_callback = 0; +GAME_COMMAND_CALLBACK_POINTER* game_command_callback_table[] = { + 0, + game_command_callback_ride_construct_new, +}; + +int game_command_callback_get_index(GAME_COMMAND_CALLBACK_POINTER* callback) +{ + for (int i = 0; i < countof(game_command_callback_table); i++ ) { + if (game_command_callback_table[i] == callback) { + return i; + } + } + return 0; +} + +GAME_COMMAND_CALLBACK_POINTER* game_command_callback_get_callback(int index) +{ + if (index < countof(game_command_callback_table)) { + return game_command_callback_table[index]; + } + return 0; +} + void game_increase_game_speed() { gGameSpeed = min(gConfigGeneral.debugging_tools ? 5 : 4, gGameSpeed + 1); @@ -419,7 +443,7 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * RCT2_GLOBAL(0x009A8C28, uint8)++; // Remove ghost scenery so it doesn't interfere with incoming network command - if ((flags & GAME_COMMAND_FLAG_NETWORKED) && !(flags & 0x40) && + if ((flags & GAME_COMMAND_FLAG_NETWORKED) && !(flags & GAME_COMMAND_FLAG_GHOST) && (command == GAME_COMMAND_PLACE_FENCE || command == GAME_COMMAND_PLACE_SCENERY || command == GAME_COMMAND_PLACE_LARGE_SCENERY || @@ -441,7 +465,7 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * if (cost != MONEY32_UNDEFINED) { // Check funds insufficientFunds = 0; - if (RCT2_GLOBAL(0x009A8C28, uint8) == 1 && !(flags & 4) && !(flags & 0x20) && cost != 0) + if (RCT2_GLOBAL(0x009A8C28, uint8) == 1 && !(flags & GAME_COMMAND_FLAG_2) && !(flags & GAME_COMMAND_FLAG_5) && cost != 0) insufficientFunds = game_check_affordability(cost); if (insufficientFunds != MONEY32_UNDEFINED) { @@ -457,9 +481,10 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * return cost; } - if (network_get_mode() != NETWORK_MODE_NONE && !(flags & GAME_COMMAND_FLAG_NETWORKED) && !(flags & 0x40) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { - network_send_gamecmd(*eax, *ebx, *ecx, *edx, *esi, *edi, *ebp); + if (network_get_mode() != NETWORK_MODE_NONE && !(flags & GAME_COMMAND_FLAG_NETWORKED) && !(flags & GAME_COMMAND_FLAG_GHOST) && !(flags & GAME_COMMAND_FLAG_5) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { + network_send_gamecmd(*eax, *ebx, *ecx, *edx, *esi, *edi, *ebp, game_command_callback_get_index(game_command_callback)); if (network_get_mode() == NETWORK_MODE_CLIENT) { + game_command_callback = 0; // Decrement nest count RCT2_GLOBAL(0x009A8C28, uint8)--; return cost; @@ -472,6 +497,12 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * } else { RCT2_CALLFUNC_X(game_do_command_table[command], eax, ebx, ecx, edx, esi, edi, ebp); } + + if (game_command_callback) { + game_command_callback(*eax, *ebx, *ecx, *edx, *esi, *edi, *ebp); + game_command_callback = 0; + } + *edx = *ebx; if (*edx != MONEY32_UNDEFINED && *edx < cost) @@ -503,7 +534,7 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * RCT2_GLOBAL(0x009A8C28, uint8)--; // Show error window - if (RCT2_GLOBAL(0x009A8C28, uint8) == 0 && (flags & 1) && RCT2_GLOBAL(0x0141F568, uint8) == RCT2_GLOBAL(0x013CA740, uint8) && !(flags & 8)) + if (RCT2_GLOBAL(0x009A8C28, uint8) == 0 && (flags & GAME_COMMAND_FLAG_APPLY) && RCT2_GLOBAL(0x0141F568, uint8) == RCT2_GLOBAL(0x013CA740, uint8) && !(flags & GAME_COMMAND_FLAG_3)) window_error_open(RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16), RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16)); return MONEY32_UNDEFINED; diff --git a/src/game.h b/src/game.h index 5900a57c40..8ce6a1ef24 100644 --- a/src/game.h +++ b/src/game.h @@ -86,14 +86,26 @@ enum GAME_COMMAND { GAME_COMMAND_CLEAR_SCENERY }; -// If this flag is set, the command is applied, otherwise only the cost is retrieved -#define GAME_COMMAND_FLAG_APPLY (1 << 0) +enum { + GAME_COMMAND_FLAG_APPLY = (1 << 0), // If this flag is set, the command is applied, otherwise only the cost is retrieved + GAME_COMMAND_FLAG_2 = (1 << 2), + GAME_COMMAND_FLAG_3 = (1 << 3), + GAME_COMMAND_FLAG_5 = (1 << 5), + GAME_COMMAND_FLAG_GHOST = (1 << 6), + GAME_COMMAND_FLAG_NETWORKED = (1 << 31) // Game command is coming from network +}; + + -// Game command is coming from network -#define GAME_COMMAND_FLAG_NETWORKED (1 << 31) typedef void (GAME_COMMAND_POINTER)(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); +typedef void (GAME_COMMAND_CALLBACK_POINTER)(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); + +extern GAME_COMMAND_CALLBACK_POINTER* game_command_callback; +int game_command_callback_get_index(GAME_COMMAND_CALLBACK_POINTER* callback); +GAME_COMMAND_CALLBACK_POINTER* game_command_callback_get_callback(int index); + extern int gGameSpeed; extern float gDayNightCycle; diff --git a/src/network/network.cpp b/src/network/network.cpp index 259b6fae90..940989e74a 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -358,6 +358,7 @@ bool Network::BeginServer(unsigned short port) NetworkPlayer* player = AddPlayer("Server Player"); player->flags |= NETWORK_PLAYER_FLAG_ISSERVER; + player_id = player->id; printf("Ready for clients...\n"); @@ -386,6 +387,11 @@ uint32 Network::GetServerTick() return server_tick; } +uint8 Network::GetPlayerID() +{ + return player_id; +} + void Network::Update() { if (GetMode() == NETWORK_MODE_NONE) @@ -446,12 +452,13 @@ NetworkPlayer* Network::GetPlayerByID(int id) { const char* Network::FormatChat(NetworkPlayer* fromplayer, const char* text) { static char formatted[1024]; - formatted[0] = (char)FORMAT_OUTLINE; - formatted[1] = (char)FORMAT_BABYBLUE; + formatted[0] = 0; if (fromplayer) { + formatted[0] = (char)FORMAT_OUTLINE; + formatted[1] = (char)FORMAT_BABYBLUE; strcpy(&formatted[2], (const char*)fromplayer->name); + strcat(formatted, ": "); } - strcat(formatted, ": "); strcat(formatted, text); return formatted; } @@ -508,17 +515,17 @@ void Network::Server_Send_CHAT(const char* text) SendPacketToClients(*packet); } -void Network::Client_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) +void Network::Client_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback) { std::unique_ptr packet = std::move(NetworkPacket::Allocate()); - *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | GAME_COMMAND_FLAG_NETWORKED) << ecx << edx << esi << edi << ebp; + *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | GAME_COMMAND_FLAG_NETWORKED) << ecx << edx << esi << edi << ebp << callback; server_connection.QueuePacket(std::move(packet)); } -void Network::Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) +void Network::Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 playerid, uint8 callback) { std::unique_ptr packet = std::move(NetworkPacket::Allocate()); - *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | GAME_COMMAND_FLAG_NETWORKED) << ecx << edx << esi << edi << ebp; + *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | GAME_COMMAND_FLAG_NETWORKED) << ecx << edx << esi << edi << ebp << playerid << callback; SendPacketToClients(*packet); } @@ -627,7 +634,10 @@ void Network::ProcessGameCommandQueue() while (game_command_queue.begin() != game_command_queue.end() && game_command_queue.begin()->tick == RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)) { // run all the game commands at the current tick const GameCommand& gc = (*game_command_queue.begin()); - game_do_command(gc.eax, gc.ebx, gc.ecx, gc.edx, gc.esi, gc.edi, gc.ebp); + if (GetPlayerID() == gc.playerid) { + game_command_callback = game_command_callback_get_callback(gc.callback); + } + game_do_command_p(gc.esi, (int*)&gc.eax, (int*)&gc.ebx, (int*)&gc.ecx, (int*)&gc.edx, (int*)&gc.esi, (int*)&gc.edi, (int*)&gc.ebp); game_command_queue.erase(game_command_queue.begin()); } } @@ -692,7 +702,7 @@ void Network::PrintError() int Network::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacket& packet) { - packet >> (uint32&)connection.authstatus; + packet >> (uint32&)connection.authstatus >> (uint8&)player_id; return 1; } @@ -702,6 +712,7 @@ int Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& pa const char* gameversion = packet.ReadString(); const char* name = packet.ReadString(); const char* password = packet.ReadString(); + uint8 playerid = 0; if (!gameversion || strcmp(gameversion, OPENRCT2_VERSION) != 0) { connection.authstatus = NETWORK_AUTH_BADVERSION; } else @@ -714,15 +725,18 @@ int Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& pa connection.authstatus = NETWORK_AUTH_OK; NetworkPlayer* player = AddPlayer(name); connection.player = player; - char text[256]; - text[0] = (char)FORMAT_OUTLINE; - text[1] = (char)FORMAT_GREEN; - sprintf(&text[2], "%s has joined the game", player->name); - chat_history_add(text); - gNetwork.Server_Send_CHAT(text); + if (player) { + playerid = player->id; + char text[256]; + text[0] = (char)FORMAT_OUTLINE; + text[1] = (char)FORMAT_GREEN; + sprintf(&text[2], "%s has joined the game", player->name); + chat_history_add(text); + gNetwork.Server_Send_CHAT(text); + } } std::unique_ptr responsepacket = std::move(NetworkPacket::Allocate()); - *responsepacket << (uint32)NETWORK_COMMAND_AUTH << (uint32)connection.authstatus; + *responsepacket << (uint32)NETWORK_COMMAND_AUTH << (uint32)connection.authstatus << (uint8)playerid; connection.QueuePacket(std::move(responsepacket)); } return 1; @@ -786,8 +800,10 @@ int Network::Client_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& { uint32 tick; uint32 args[7]; - packet >> tick >> args[0] >> args[1] >> args[2] >> args[3] >> args[4] >> args[5] >> args[6]; - GameCommand gc = GameCommand(tick, args); + uint8 playerid; + uint8 callback; + packet >> tick >> args[0] >> args[1] >> args[2] >> args[3] >> args[4] >> args[5] >> args[6] >> playerid >> callback; + GameCommand gc = GameCommand(tick, args, playerid, callback); game_command_queue.insert(gc); return 1; } @@ -796,8 +812,13 @@ int Network::Server_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& { uint32 tick; uint32 args[7]; - packet >> tick >> args[0] >> args[1] >> args[2] >> args[3] >> args[4] >> args[5] >> args[6]; - Server_Send_GAMECMD(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + uint8 playerid; + uint8 callback; + if (connection.player) { + playerid = connection.player->id; + } + packet >> tick >> args[0] >> args[1] >> args[2] >> args[3] >> args[4] >> args[5] >> args[6] >> callback; + Server_Send_GAMECMD(args[0], args[1], args[2], args[3], args[4], args[5], args[6], playerid, callback); game_do_command(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); return 1; } @@ -900,6 +921,11 @@ uint32 network_get_server_tick() return gNetwork.GetServerTick(); } +uint8 network_get_player_id() +{ + return gNetwork.GetPlayerID(); +} + int network_get_num_players() { return gNetwork.player_list.size(); @@ -931,20 +957,20 @@ void network_send_chat(const char* text) gNetwork.Client_Send_CHAT(text); } else if (gNetwork.GetMode() == NETWORK_MODE_SERVER) { - NetworkPlayer* player = gNetwork.GetPlayerByID(0); + NetworkPlayer* player = gNetwork.GetPlayerByID(gNetwork.GetPlayerID()); const char* formatted = gNetwork.FormatChat(player, text); chat_history_add(formatted); gNetwork.Server_Send_CHAT(formatted); } } -void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp) +void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback) { if (gNetwork.GetMode() == NETWORK_MODE_CLIENT) { - gNetwork.Client_Send_GAMECMD(eax, ebx, ecx, edx, esi, edi, ebp); + gNetwork.Client_Send_GAMECMD(eax, ebx, ecx, edx, esi, edi, ebp, callback); } else if (gNetwork.GetMode() == NETWORK_MODE_SERVER) { - gNetwork.Server_Send_GAMECMD(eax, ebx, ecx, edx, esi, edi, ebp); + gNetwork.Server_Send_GAMECMD(eax, ebx, ecx, edx, esi, edi, ebp, gNetwork.GetPlayerID(), callback); } } diff --git a/src/network/network.h b/src/network/network.h index 8254f05c36..286d725b39 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -130,6 +130,7 @@ public: int GetMode(); int GetAuthStatus(); uint32 GetServerTick(); + uint8 GetPlayerID(); void Update(); NetworkPlayer* GetPlayerByID(int id); const char* FormatChat(NetworkPlayer* fromplayer, const char* text); @@ -139,8 +140,8 @@ public: void Server_Send_MAP(); void Client_Send_CHAT(const char* text); void Server_Send_CHAT(const char* text); - void Client_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); - void Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); + void Client_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback); + void Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 playerid, uint8 callback); void Server_Send_TICK(); void Server_Send_PLAYERLIST(); void Client_Send_PING(); @@ -160,9 +161,11 @@ private: struct GameCommand { - GameCommand(uint32 t, uint32* args) { tick = t, eax = args[0], ebx = args[1], ecx = args[2], edx = args[3], esi = args[4], edi = args[5], ebp = args[6]; }; + GameCommand(uint32 t, uint32* args, uint8 p, uint8 cb) { tick = t, eax = args[0], ebx = args[1], ecx = args[2], edx = args[3], esi = args[4], edi = args[5], ebp = args[6]; playerid = p; callback = cb; }; uint32 tick; uint32 eax, ebx, ecx, edx, esi, edi, ebp; + uint8 playerid; + uint8 callback; bool operator<(const GameCommand& comp) const { return tick < comp.tick; } @@ -176,6 +179,7 @@ private: uint32 last_tick_sent_time; uint32 last_ping_sent_time; uint32 server_tick; + uint8 player_id; std::list> client_connection_list; std::multiset game_command_queue; std::vector chunk_buffer; @@ -210,6 +214,7 @@ void network_update(); int network_get_mode(); int network_get_authstatus(); uint32 network_get_server_tick(); +uint8 network_get_player_id(); int network_get_num_players(); const char* network_get_player_name(unsigned int index); uint32 network_get_player_flags(unsigned int index); @@ -217,7 +222,7 @@ int network_get_player_ping(unsigned int index); void network_send_map(); void network_send_chat(const char* text); -void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp); +void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback); void network_print_error(); diff --git a/src/ride/ride.c b/src/ride/ride.c index 4ebe33d133..df2c889005 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -32,6 +32,7 @@ #include "../management/finance.h" #include "../management/marketing.h" #include "../management/news_item.h" +#include "../network/network.h" #include "../peep/peep.h" #include "../peep/staff.h" #include "../rct1.h" @@ -812,7 +813,7 @@ int ride_create_ride(ride_list_item listItem) edx = *((uint16*)&listItem); eax = 0; ecx = 0; - ebx = 1; + ebx = GAME_COMMAND_FLAG_APPLY; edi = 0; esi = 0; @@ -831,9 +832,12 @@ void ride_construct_new(ride_list_item listItem) { int rideIndex; + game_command_callback = game_command_callback_ride_construct_new; rideIndex = ride_create_ride(listItem); - if (rideIndex != -1) - ride_construct(rideIndex); + + // moved to game_command_callback_ride_construct_new: + /*if (rideIndex != -1) + ride_construct(rideIndex);*/ } /** @@ -5072,6 +5076,13 @@ void game_command_create_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, *ebx = ride_create(*edx & 0xFF, (*edx >> 8) & 0xFF, *ebx & 0xFF, edi); } +void game_command_callback_ride_construct_new(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp) +{ + int rideIndex = edi; + if (rideIndex != -1) + ride_construct(rideIndex); +} + /** * * rct2: 0x006B49D9 diff --git a/src/ride/ride.h b/src/ride/ride.h index 1d060c9409..4539de5f40 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -960,6 +960,7 @@ void game_command_set_ride_name(int *eax, int *ebx, int *ecx, int *edx, int *esi void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); int ride_get_refund_price(int ride_id); void game_command_create_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +void game_command_callback_ride_construct_new(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); diff --git a/src/ride/track.c b/src/ride/track.c index 2ff3307319..acf615d50a 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1963,7 +1963,7 @@ int sub_6D2189(int* cost, uint8* ride_id){ entry_index = 0xFF; int eax = 0, ebx, ecx = 0, edx, esi, edi = 0, ebp = 0; - ebx = 41; + ebx = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_3 | GAME_COMMAND_FLAG_5; edx = track_design->type | (entry_index << 8); esi = GAME_COMMAND_CREATE_RIDE; @@ -3185,7 +3185,7 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int RCT2_GLOBAL(0x009DEA60, sint16) = y + 16; RCT2_GLOBAL(0x009DEA62, sint16) = z; - if (!(flags & (1 << 3))){ + if (!(flags & GAME_COMMAND_FLAG_3)){ if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ RCT2_GLOBAL(0x00141E9AC, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; *ebx = MONEY32_UNDEFINED; @@ -3232,7 +3232,7 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int } else{ uint8 bl = 0; - if (flags & (1 << 6)){ + if (flags & GAME_COMMAND_FLAG_GHOST){ bl = 4; } else{ @@ -3506,7 +3506,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in if (!sub_68B044()) { return MONEY32_UNDEFINED; } - if (!(flags & (1 << 3))) { + if (!(flags & GAME_COMMAND_FLAG_3)) { if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; return MONEY32_UNDEFINED; @@ -3638,7 +3638,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in RCT2_GLOBAL(0x00F44060, void*) = &clearance_struct; - if (!gCheatsDisableClearanceChecks) { + if (!gCheatsDisableClearanceChecks || flags & GAME_COMMAND_FLAG_GHOST){ if (!map_can_construct_with_clear_at(x, y, baseZ, clearanceZ, (void*)0x006C5A5F, bl)) return MONEY32_UNDEFINED; } @@ -3649,7 +3649,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in // push baseZ and clearanceZ int cur_z = baseZ * 8; - if ((flags & GAME_COMMAND_FLAG_APPLY) && !(flags & (1 << 3))) { + if ((flags & GAME_COMMAND_FLAG_APPLY) && !(flags & GAME_COMMAND_FLAG_3)) { footpath_remove_litter(x, y, z); // push bl bh?? if (rideTypeFlags & RIDE_TYPE_FLAG_18) { @@ -3755,7 +3755,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in if (entranceDirections & 0x20) { entranceDirections &= 0x0F; if (entranceDirections != 0) { - if (!(flags & GAME_COMMAND_FLAG_APPLY) && !(flags & 0x40)) { + if (!(flags & GAME_COMMAND_FLAG_APPLY) && !(flags & GAME_COMMAND_FLAG_GHOST)) { uint8 _bl = entranceDirections; for (int dl = bitscanforward(_bl); dl != -1; dl = bitscanforward(_bl)){ _bl &= ~(1 << dl); @@ -3836,7 +3836,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in entranceDirections = 0; if (ride->overall_view != 0xFFFF){ - if (!(flags & (1 << 5))){ + if (!(flags & GAME_COMMAND_FLAG_5)){ if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { entranceDirections = RCT2_ADDRESS(0x0099CA64, uint8)[type * 16]; } @@ -3863,7 +3863,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in mapElement->properties.track.ride_index = rideIndex; mapElement->properties.track.type = type; mapElement->properties.track.colour = 0; - if (flags & (1 << 6)){ + if (flags & GAME_COMMAND_FLAG_GHOST){ mapElement->flags |= MAP_ELEMENT_FLAG_GHOST; } diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 7cc2652964..228e9b6e5c 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -29,6 +29,7 @@ #include "../interface/widget.h" #include "../interface/window.h" #include "../localisation/localisation.h" +#include "../network/network.h" #include "../ride/track.h" #include "dropdown.h" @@ -579,7 +580,7 @@ static void window_ride_construction_close(rct_window *w) hide_gridlines(); uint8 rideIndex = _currentRideIndex; - if (sub_6CAF80(rideIndex, &mapElement)) { + if (sub_6CAF80(rideIndex, &mapElement) || network_get_mode() == NETWORK_MODE_CLIENT) { window_ride_main_open(rideIndex); } else { int eax = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8); From 3a26f56000518d0b183c836e27ea41c697367c24 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sun, 26 Jul 2015 20:15:02 -0600 Subject: [PATCH 0514/1173] fix path placement for network --- src/config.c | 2 +- src/game.c | 2 +- src/game.h | 3 ++- src/interface/keyboard_shortcut.c | 2 +- src/ride/track.c | 8 ++++---- src/world/footpath.c | 23 +++++++++++------------ 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/config.c b/src/config.c index a7aa49aa16..32246efe8f 100644 --- a/src/config.c +++ b/src/config.c @@ -986,7 +986,7 @@ static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = { SDL_SCANCODE_EQUALS, // SHORTCUT_INCREASE_GAME_SPEED, CTRL | ALT | SDL_SCANCODE_C, // SHORTCUT_OPEN_CHEAT_WINDOW, SDL_SCANCODE_T, // SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, - SDL_SCANCODE_C // SHORTCUT_OPEN_CHAT_WINDOW + SDL_SCANCODE_C, // SHORTCUT_OPEN_CHAT_WINDOW SDL_SCANCODE_UP, // SHORTCUT_SCROLL_MAP_UP SDL_SCANCODE_LEFT, // SHORTCUT_SCROLL_MAP_LEFT SDL_SCANCODE_DOWN, // SHORTCUT_SCROLL_MAP_DOWN diff --git a/src/game.c b/src/game.c index e543cfa2d4..6cb4bc931b 100644 --- a/src/game.c +++ b/src/game.c @@ -534,7 +534,7 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * RCT2_GLOBAL(0x009A8C28, uint8)--; // Show error window - if (RCT2_GLOBAL(0x009A8C28, uint8) == 0 && (flags & GAME_COMMAND_FLAG_APPLY) && RCT2_GLOBAL(0x0141F568, uint8) == RCT2_GLOBAL(0x013CA740, uint8) && !(flags & GAME_COMMAND_FLAG_3)) + if (RCT2_GLOBAL(0x009A8C28, uint8) == 0 && (flags & GAME_COMMAND_FLAG_APPLY) && RCT2_GLOBAL(0x0141F568, uint8) == RCT2_GLOBAL(0x013CA740, uint8) && !(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED)) window_error_open(RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16), RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16)); return MONEY32_UNDEFINED; diff --git a/src/game.h b/src/game.h index 8ce6a1ef24..dd0d2d9bc3 100644 --- a/src/game.h +++ b/src/game.h @@ -89,7 +89,8 @@ enum GAME_COMMAND { enum { GAME_COMMAND_FLAG_APPLY = (1 << 0), // If this flag is set, the command is applied, otherwise only the cost is retrieved GAME_COMMAND_FLAG_2 = (1 << 2), - GAME_COMMAND_FLAG_3 = (1 << 3), + GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED = (1 << 3), // Allow while paused + GAME_COMMAND_FLAG_4 = (1 << 4), GAME_COMMAND_FLAG_5 = (1 << 5), GAME_COMMAND_FLAG_GHOST = (1 << 6), GAME_COMMAND_FLAG_NETWORKED = (1 << 31) // Game command is coming from network diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index ee10a02fd5..cd5e50903b 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -540,7 +540,7 @@ static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { shortcut_increase_game_speed, shortcut_open_cheat_window, shortcut_remove_top_bottom_toolbar_toggle, - shortcut_open_chat_window + shortcut_open_chat_window, NULL, NULL, NULL, diff --git a/src/ride/track.c b/src/ride/track.c index acf615d50a..c3eba159ff 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1963,7 +1963,7 @@ int sub_6D2189(int* cost, uint8* ride_id){ entry_index = 0xFF; int eax = 0, ebx, ecx = 0, edx, esi, edi = 0, ebp = 0; - ebx = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_3 | GAME_COMMAND_FLAG_5; + ebx = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_5; edx = track_design->type | (entry_index << 8); esi = GAME_COMMAND_CREATE_RIDE; @@ -3185,7 +3185,7 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int RCT2_GLOBAL(0x009DEA60, sint16) = y + 16; RCT2_GLOBAL(0x009DEA62, sint16) = z; - if (!(flags & GAME_COMMAND_FLAG_3)){ + if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED)){ if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ RCT2_GLOBAL(0x00141E9AC, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; *ebx = MONEY32_UNDEFINED; @@ -3506,7 +3506,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in if (!sub_68B044()) { return MONEY32_UNDEFINED; } - if (!(flags & GAME_COMMAND_FLAG_3)) { + if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED)) { if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; return MONEY32_UNDEFINED; @@ -3649,7 +3649,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in // push baseZ and clearanceZ int cur_z = baseZ * 8; - if ((flags & GAME_COMMAND_FLAG_APPLY) && !(flags & GAME_COMMAND_FLAG_3)) { + if ((flags & GAME_COMMAND_FLAG_APPLY) && !(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED)) { footpath_remove_litter(x, y, z); // push bl bh?? if (rideTypeFlags & RIDE_TYPE_FLAG_18) { diff --git a/src/world/footpath.c b/src/world/footpath.c index 0fd76eeddb..1bfd7e83d0 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -34,10 +34,6 @@ void footpath_interrupt_peeps(int x, int y, int z); void sub_6A7642(int x, int y, rct_map_element *mapElement); void sub_6A76E9(int rideIndex); -enum { - FOOTPATH_CONSTRUCTION_FLAG_ALLOW_DURING_PAUSED = 1 << 3 -}; - const rct_xy16 word_981D6C[4] = { { -1, 0 }, { 0, 1 }, @@ -148,7 +144,7 @@ static money32 footpath_element_insert(int type, int x, int y, int z, int slope, if (!sub_68B044()) return MONEY32_UNDEFINED; - if ((flags & GAME_COMMAND_FLAG_APPLY) && !(flags & (FOOTPATH_CONSTRUCTION_FLAG_ALLOW_DURING_PAUSED | (1 << 6)))) + if ((flags & GAME_COMMAND_FLAG_APPLY) && !(flags & (GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_GHOST))) footpath_remove_litter(x, y, RCT2_GLOBAL(0x009DEA62, uint16)); // loc_6A649D: @@ -320,7 +316,7 @@ static money32 footpath_place_real(int type, int x, int y, int z, int slope, int RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; RCT2_GLOBAL(0x009DEA62, uint16) = z * 8; - if (!(flags & FOOTPATH_CONSTRUCTION_FLAG_ALLOW_DURING_PAUSED) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { + if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; return MONEY32_UNDEFINED; } @@ -355,10 +351,13 @@ static money32 footpath_place_real(int type, int x, int y, int z, int slope, int return MONEY32_UNDEFINED; } + footpath_provisional_remove(); mapElement = map_get_footpath_element_slope((x / 32), (y / 32), z, slope); - return mapElement == NULL ? - footpath_element_insert(type, x, y, z, slope, flags) : - footpath_element_update(x, y, mapElement, type, flags); + if (mapElement == NULL) { + return footpath_element_insert(type, x, y, z, slope, flags); + } else { + return footpath_element_update(x, y, mapElement, type, flags); + } } /* rct2: 0x006BA23E */ @@ -381,7 +380,7 @@ money32 footpath_remove_real(int x, int y, int z, int flags) RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; RCT2_GLOBAL(0x009DEA62, uint16) = z * 8; - if (!(flags & FOOTPATH_CONSTRUCTION_FLAG_ALLOW_DURING_PAUSED) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { + if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; return MONEY32_UNDEFINED; } @@ -453,7 +452,7 @@ money32 footpath_provisional_set(int type, int x, int y, int z, int slope) footpath_provisional_remove(); - cost = footpath_place(type, x, y, z, slope, (1 << 6) | (1 << 5) | (1 << 4) | FOOTPATH_CONSTRUCTION_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_APPLY); + cost = footpath_place(type, x, y, z, slope, GAME_COMMAND_FLAG_GHOST | GAME_COMMAND_FLAG_5 | GAME_COMMAND_FLAG_4 | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_APPLY); if (cost != MONEY32_UNDEFINED) { RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_X, uint16) = x; RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_Y, uint16) = y; @@ -479,7 +478,7 @@ void footpath_provisional_remove() RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_Z, uint16), - (1 << 0) | FOOTPATH_CONSTRUCTION_FLAG_ALLOW_DURING_PAUSED | (1 << 5) + GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_5 ); } } From 5dab3be1d7a3e1b4bfdc271abeee006c9061be61 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Wed, 29 Jul 2015 16:30:05 -0600 Subject: [PATCH 0515/1173] fix view position when loading map over network --- src/game.c | 7 ++++--- src/network/network.cpp | 1 + src/openrct2.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/game.c b/src/game.c index 6cb4bc931b..f791bce993 100644 --- a/src/game.c +++ b/src/game.c @@ -777,9 +777,6 @@ int game_load_sv6(SDL_RWops* rw) reset_0x69EBE4(); openrct2_reset_object_tween_locations(); game_convert_strings_to_utf8(); - if (network_get_mode() == NETWORK_MODE_SERVER) { - network_send_map(); - } return 1; } @@ -814,6 +811,9 @@ int game_load_save(const char *path) SDL_RWclose(rw); game_load_init(); + if (network_get_mode() == NETWORK_MODE_SERVER) { + network_send_map(); + } return 1; } @@ -855,6 +855,7 @@ void game_load_init() load_palette(); gfx_invalidate_screen(); + window_update_all(); gGameSpeed = 1; diff --git a/src/network/network.cpp b/src/network/network.cpp index 940989e74a..9770721cba 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -768,6 +768,7 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) & 1) pause_toggle(); game_command_queue.clear(); + server_tick = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); window_network_status_open("Loaded new map from network"); } SDL_RWclose(rw); diff --git a/src/openrct2.c b/src/openrct2.c index 373416d349..02d96a5f1e 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -356,7 +356,6 @@ static void openrct2_loop() } platform_process_messages(); - network_update(); rct2_draw(); platform_draw(); fps++; @@ -373,6 +372,7 @@ static void openrct2_loop() invalidate_sprite(&g_sprite_list[i]); sprite_move(_spritelocations2[i].x, _spritelocations2[i].y, _spritelocations2[i].z, &g_sprite_list[i]); } + network_update(); } else { uncapTick = 0; currentTick = SDL_GetTicks(); From 111a2e819874513cd8c3cac8a699e39a33b65bed Mon Sep 17 00:00:00 2001 From: zsilencer Date: Thu, 30 Jul 2015 08:09:39 -0600 Subject: [PATCH 0516/1173] fix another source of nondeterminism --- src/game.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/game.c b/src/game.c index f791bce993..ded5d1dc6d 100644 --- a/src/game.c +++ b/src/game.c @@ -319,8 +319,6 @@ void game_update() window_map_tooltip_update_visibility(); - RCT2_GLOBAL(0x01388698, uint16)++; - // Input RCT2_GLOBAL(0x0141F568, uint8) = RCT2_GLOBAL(0x0013CA740, uint8); game_handle_input(); @@ -367,6 +365,8 @@ void game_logic_update() climate_update_sound(); editor_open_windows_for_current_step(); + RCT2_GLOBAL(0x01388698, uint16)++; + // Update windows //window_dispatch_update_all(); @@ -860,6 +860,8 @@ void game_load_init() gGameSpeed = 1; scenario_set_filename((char*)0x0135936C); + + RCT2_GLOBAL(0x01388698, uint16) = 0; } /* From a4267990b868b2a15865361371c66bd5814aa42a Mon Sep 17 00:00:00 2001 From: zsilencer Date: Thu, 30 Jul 2015 08:34:17 -0600 Subject: [PATCH 0517/1173] detect desyncs --- src/network/network.cpp | 25 +++++++++++++++++++++++-- src/network/network.h | 3 +++ src/windows/network_status.c | 4 ++-- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 9770721cba..1df19ad80b 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -470,6 +470,17 @@ void Network::SendPacketToClients(NetworkPacket& packet) } } +bool Network::CheckSRAND(uint32 tick, uint32 srand0) +{ + if (tick == server_srand0_tick) { + server_srand0_tick = 0; + if (srand0 != server_srand0) { + return false; + } + } + return true; +} + void Network::Client_Send_AUTH(const char* gameversion, const char* name, const char* password) { std::unique_ptr packet = std::move(NetworkPacket::Allocate()); @@ -532,7 +543,7 @@ void Network::Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx void Network::Server_Send_TICK() { std::unique_ptr packet = std::move(NetworkPacket::Allocate()); - *packet << (uint32)NETWORK_COMMAND_TICK << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); + *packet << (uint32)NETWORK_COMMAND_TICK << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32); SendPacketToClients(*packet); } @@ -769,6 +780,7 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac pause_toggle(); game_command_queue.clear(); server_tick = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); + server_srand0_tick = 0; window_network_status_open("Loaded new map from network"); } SDL_RWclose(rw); @@ -826,7 +838,12 @@ int Network::Server_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& int Network::Client_Handle_TICK(NetworkConnection& connection, NetworkPacket& packet) { - packet >> server_tick; + uint32 srand0; + packet >> server_tick >> srand0; + if (server_srand0_tick == 0) { + server_srand0 = srand0; + server_srand0_tick = server_tick; + } return 1; } @@ -905,6 +922,10 @@ int network_begin_server(int port) void network_update() { gNetwork.Update(); + if (!gNetwork.CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { + window_network_status_open("Network desync detected"); + gNetwork.Close(); + } } int network_get_mode() diff --git a/src/network/network.h b/src/network/network.h index 286d725b39..392e8ecff1 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -135,6 +135,7 @@ public: NetworkPlayer* GetPlayerByID(int id); const char* FormatChat(NetworkPlayer* fromplayer, const char* text); void SendPacketToClients(NetworkPacket& packet); + bool CheckSRAND(uint32 tick, uint32 srand0); void Client_Send_AUTH(const char* gameversion, const char* name, const char* password); void Server_Send_MAP(); @@ -179,6 +180,8 @@ private: uint32 last_tick_sent_time; uint32 last_ping_sent_time; uint32 server_tick; + uint32 server_srand0; + uint32 server_srand0_tick; uint8 player_id; std::list> client_connection_list; std::multiset game_command_queue; diff --git a/src/windows/network_status.c b/src/windows/network_status.c index 441d93ebce..e0c5af29a0 100644 --- a/src/windows/network_status.c +++ b/src/windows/network_status.c @@ -79,6 +79,8 @@ void window_network_status_open(const char* text) { rct_window* window; + strncpy(window_network_status_text, text, sizeof(window_network_status_text)); + // Check if window is already open window = window_bring_to_front_by_class(WC_NETWORK_STATUS); if (window != NULL) @@ -86,8 +88,6 @@ void window_network_status_open(const char* text) window = window_create_centred(320, 90, &window_network_status_events, WC_NETWORK_STATUS, WF_10 | WF_TRANSPARENT); - strncpy(window_network_status_text, text, sizeof(window_network_status_text)); - window->widgets = window_network_status_widgets; window->enabled_widgets = 1 << WIDX_CLOSE; window_init_scroll_widgets(window); From ad70dbb84cc356165478f2467342c52ce9ffd382 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Fri, 31 Jul 2015 08:14:44 -0600 Subject: [PATCH 0518/1173] map load on join --- src/game.c | 59 ++++++++++++++++++++++++++++++++++-- src/game.h | 1 + src/network/network.cpp | 13 +++++--- src/network/network.h | 2 +- src/scenario.c | 66 +++++++++++++++++++++++++++++++++++++++++ src/scenario.h | 1 + 6 files changed, 135 insertions(+), 7 deletions(-) diff --git a/src/game.c b/src/game.c index ded5d1dc6d..6a497edfa9 100644 --- a/src/game.c +++ b/src/game.c @@ -780,6 +780,63 @@ int game_load_sv6(SDL_RWops* rw) return 1; } +// Load game state for multiplayer +int game_load_network(SDL_RWops* rw) +{ + int i, j; + + rct_s6_header *s6Header = (rct_s6_header*)0x009E34E4; + rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; + + // Read first chunk + sawyercoding_read_chunk(rw, (uint8*)s6Header); + if (s6Header->type == S6_TYPE_SAVEDGAME) { + // Read packed objects + if (s6Header->num_packed_objects > 0) { + j = 0; + for (i = 0; i < s6Header->num_packed_objects; i++) + j += object_load_packed(rw); + if (j > 0) + object_list_load(); + } + } + + uint8 load_success = object_read_and_load_entries(rw); + + // Read flags (16 bytes) + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_CURRENT_MONTH_YEAR); + + // Read map elements + memset((void*)RCT2_ADDRESS_MAP_ELEMENTS, 0, MAX_MAP_ELEMENTS * sizeof(rct_map_element)); + sawyercoding_read_chunk(rw, (uint8*)RCT2_ADDRESS_MAP_ELEMENTS); + + // Read game data, including sprites + sawyercoding_read_chunk(rw, (uint8*)0x010E63B8); + + // Read checksum + uint32 checksum; + SDL_RWread(rw, &checksum, sizeof(uint32), 1); + + if (!load_success){ + set_load_objects_fail_reason(); + if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_5){ + RCT2_GLOBAL(0x14241BC, uint32) = 2; + //call 0x0040705E Sets cursor position and something else. Calls maybe wind func 8 probably pointless + RCT2_GLOBAL(0x14241BC, uint32) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) &= ~INPUT_FLAG_5; + } + + return 0;//This never gets called + } + + // The rest is the same as in scenario load and play + reset_loaded_objects(); + map_update_tile_pointers(); + reset_0x69EBE4(); + openrct2_reset_object_tween_locations(); + return 1; +} + /** * * rct2: 0x00675E1B @@ -860,8 +917,6 @@ void game_load_init() gGameSpeed = 1; scenario_set_filename((char*)0x0135936C); - - RCT2_GLOBAL(0x01388698, uint16) = 0; } /* diff --git a/src/game.h b/src/game.h index dd0d2d9bc3..be95fcd879 100644 --- a/src/game.h +++ b/src/game.h @@ -127,6 +127,7 @@ void game_reduce_game_speed(); void game_load_or_quit_no_save_prompt(); int game_load_sv6(SDL_RWops* rw); +int game_load_network(SDL_RWops* rw); int game_load_save(const char *path); void game_load_init(); void game_pause_toggle(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); diff --git a/src/network/network.cpp b/src/network/network.cpp index 1df19ad80b..25eea2fcc8 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -492,12 +492,12 @@ void Network::Client_Send_AUTH(const char* gameversion, const char* name, const server_connection.QueuePacket(std::move(packet)); } -void Network::Server_Send_MAP() +void Network::Server_Send_MAP(NetworkConnection* connection) { int buffersize = 0x600000; std::vector buffer(buffersize); SDL_RWops* rw = SDL_RWFromMem(&buffer[0], buffersize); - scenario_save(rw, 0); + scenario_save_network(rw); int size = (int)SDL_RWtell(rw); int chunksize = 1000; for (int i = 0; i < size; i += chunksize) { @@ -505,7 +505,11 @@ void Network::Server_Send_MAP() std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_MAP << (uint32)size << (uint32)i; packet->Write(&buffer[i], datasize); - SendPacketToClients(*packet); + if (connection) { + connection->QueuePacket(std::move(packet)); + } else { + SendPacketToClients(*packet); + } } SDL_RWclose(rw); } @@ -744,6 +748,7 @@ int Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& pa sprintf(&text[2], "%s has joined the game", player->name); chat_history_add(text); gNetwork.Server_Send_CHAT(text); + Server_Send_MAP(&connection); } } std::unique_ptr responsepacket = std::move(NetworkPacket::Allocate()); @@ -774,7 +779,7 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac memcpy(&chunk_buffer[offset], (void*)packet.Read(chunksize), chunksize); if (offset + chunksize == size) { SDL_RWops* rw = SDL_RWFromMem(&chunk_buffer[0], size); - if (game_load_sv6(rw)) { + if (game_load_network(rw)) { game_load_init(); if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) & 1) pause_toggle(); diff --git a/src/network/network.h b/src/network/network.h index 392e8ecff1..121ddf5b24 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -138,7 +138,7 @@ public: bool CheckSRAND(uint32 tick, uint32 srand0); void Client_Send_AUTH(const char* gameversion, const char* name, const char* password); - void Server_Send_MAP(); + void Server_Send_MAP(NetworkConnection* connection = nullptr); void Client_Send_CHAT(const char* text); void Server_Send_CHAT(const char* text); void Client_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback); diff --git a/src/scenario.c b/src/scenario.c index 9ecb98e4a3..52c072b186 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -979,6 +979,72 @@ int scenario_save(SDL_RWops* rw, int flags) return 1; } +// Save game state without modifying any of the state for multiplayer +int scenario_save_network(SDL_RWops* rw) +{ + rct_window *w; + rct_viewport *viewport; + int viewX, viewY, viewZoom, viewRotation; + + /*map_reorganise_elements(); + reset_0x69EBE4(); + sprite_clear_all_unused(); + sub_677552(); + sub_674BCF();*/ + + // Set saved view + w = window_get_main(); + if (w != NULL) { + viewport = w->viewport; + + viewX = viewport->view_width / 2 + viewport->view_x; + viewY = viewport->view_height / 2 + viewport->view_y; + viewZoom = viewport->zoom; + viewRotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + } else { + viewX = 0; + viewY = 0; + viewZoom = 0; + viewRotation = 0; + } + + RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_X, uint16) = viewX; + RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_Y, uint16) = viewY; + RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, uint16) = viewZoom | (viewRotation << 8); + + // Prepare S6 + rct_s6_data *s6 = malloc(sizeof(rct_s6_data)); + s6->header.type = S6_TYPE_SAVEDGAME; + s6->header.num_packed_objects = scenario_get_num_packed_objects_to_write(); + s6->header.version = S6_RCT2_VERSION; + s6->header.magic_number = S6_MAGIC_NUMBER; + + memcpy(&s6->info, (rct_s6_info*)0x0141F570, sizeof(rct_s6_info)); + + for (int i = 0; i < 721; i++) { + uint32 chunkPtr = RCT2_ADDRESS(0x009ACFA4, uint32)[i]; + rct_object_entry_extended *entry = &(RCT2_ADDRESS(0x00F3F03C, rct_object_entry_extended)[i]); + + if (RCT2_ADDRESS(0x009ACFA4, uint32)[i] == 0xFFFFFFFF) { + memset(&s6->objects[i], 0xFF, sizeof(rct_object_entry)); + } else { + s6->objects[i] = *((rct_object_entry*)entry); + } + } + + memcpy(&s6->elapsed_months, (void*)0x00F663A8, 16); + memcpy(s6->map_elements, (void*)0x00F663B8, 0x180000); + memcpy(&s6->dword_010E63B8, (void*)0x010E63B8, 0x2E8570); + + scenario_fix_ghosts(s6); + scenario_save_s6(rw, s6); + + free(s6); + + gfx_invalidate_screen(); + return 1; +} + bool scenario_save_s6(SDL_RWops* rw, rct_s6_data *s6) { char *buffer; diff --git a/src/scenario.h b/src/scenario.h index d2cdd74b98..80df725b6f 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -427,6 +427,7 @@ unsigned int scenario_rand(); unsigned int scenario_rand_max(unsigned int max); int scenario_prepare_for_save(); int scenario_save(SDL_RWops* rw, int flags); +int scenario_save_network(SDL_RWops* rw); bool scenario_save_s6(SDL_RWops* rw, rct_s6_data *s6); void scenario_set_filename(const char *value); void scenario_failure(); From c1e802e361fde3ee802c1b19a4c8311c5816c6eb Mon Sep 17 00:00:00 2001 From: zsilencer Date: Fri, 7 Aug 2015 09:11:10 -0600 Subject: [PATCH 0519/1173] fix text for utf8 --- src/interface/chat.c | 9 +++++---- src/network/network.cpp | 25 ++++++++++++++----------- src/windows/network_status.c | 7 ++++--- src/windows/player_list.c | 22 +++++++++++++--------- src/world/map.c | 2 +- 5 files changed, 37 insertions(+), 28 deletions(-) diff --git a/src/interface/chat.c b/src/interface/chat.c index 57d852520d..863327ddcc 100644 --- a/src/interface/chat.c +++ b/src/interface/chat.c @@ -64,7 +64,8 @@ void chat_draw() _chatTop = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 40 - ((CHAT_HISTORY_SIZE + 1) * 10); _chatRight = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 10; _chatBottom = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 40; - char lineBuffer[CHAT_INPUT_SIZE + 3]; + char lineBuffer[CHAT_INPUT_SIZE + 10]; + char* lineCh = lineBuffer; int x = _chatLeft; int y = _chatBottom - (10 * 2); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; @@ -78,9 +79,9 @@ void chat_draw() gfx_draw_string(dpi, lineBuffer, 255, x, y); } if (gChatOpen) { - lineBuffer[0] = FORMAT_OUTLINE; - lineBuffer[1] = FORMAT_CELADON; - strcpy(lineBuffer + 2, _chatCurrentLine); + lineCh = utf8_write_codepoint(lineCh, FORMAT_OUTLINE); + lineCh = utf8_write_codepoint(lineCh, FORMAT_CELADON); + strcpy(lineCh, _chatCurrentLine); y = _chatBottom - 10; gfx_set_dirty_blocks(x, y, x + gfx_get_string_width(lineBuffer) + 7, y + 12); if (_chatCaretTicks < 15) { diff --git a/src/network/network.cpp b/src/network/network.cpp index 25eea2fcc8..68b7e13772 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -203,7 +203,7 @@ int NetworkConnection::SendPacket(NetworkPacket& packet) void NetworkConnection::QueuePacket(std::unique_ptr packet) { if (authstatus == NETWORK_AUTH_OK || authstatus == NETWORK_AUTH_REQUESTED) { - packet->size = packet->data->size(); + packet->size = (uint16)packet->data->size(); outboundpackets.push_back(std::move(packet)); } } @@ -452,12 +452,13 @@ NetworkPlayer* Network::GetPlayerByID(int id) { const char* Network::FormatChat(NetworkPlayer* fromplayer, const char* text) { static char formatted[1024]; + char* lineCh = formatted; formatted[0] = 0; if (fromplayer) { - formatted[0] = (char)FORMAT_OUTLINE; - formatted[1] = (char)FORMAT_BABYBLUE; - strcpy(&formatted[2], (const char*)fromplayer->name); - strcat(formatted, ": "); + lineCh = utf8_write_codepoint(lineCh, FORMAT_OUTLINE); + lineCh = utf8_write_codepoint(lineCh, FORMAT_BABYBLUE); + strcpy(lineCh, (const char*)fromplayer->name); + strcat(lineCh, ": "); } strcat(formatted, text); return formatted; @@ -669,9 +670,10 @@ void Network::RemoveClient(std::unique_ptr& connection) NetworkPlayer* connection_player = connection->player; if (connection_player) { char text[256]; - text[0] = (char)FORMAT_OUTLINE; - text[1] = (char)FORMAT_RED; - sprintf(&text[2], "%s has disconnected", connection_player->name); + char* lineCh = text; + lineCh = utf8_write_codepoint(lineCh, FORMAT_OUTLINE); + lineCh = utf8_write_codepoint(lineCh, FORMAT_RED); + sprintf(lineCh, "%s has disconnected", connection_player->name); chat_history_add(text); gNetwork.Server_Send_CHAT(text); } @@ -743,9 +745,10 @@ int Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& pa if (player) { playerid = player->id; char text[256]; - text[0] = (char)FORMAT_OUTLINE; - text[1] = (char)FORMAT_GREEN; - sprintf(&text[2], "%s has joined the game", player->name); + char* lineCh = text; + lineCh = utf8_write_codepoint(lineCh, FORMAT_OUTLINE); + lineCh = utf8_write_codepoint(lineCh, FORMAT_GREEN); + sprintf(lineCh, "%s has joined the game", player->name); chat_history_add(text); gNetwork.Server_Send_CHAT(text); Server_Send_MAP(&connection); diff --git a/src/windows/network_status.c b/src/windows/network_status.c index e0c5af29a0..d2f49888a1 100644 --- a/src/windows/network_status.c +++ b/src/windows/network_status.c @@ -133,9 +133,10 @@ static void window_network_status_paint(rct_window *w, rct_drawpixelinfo *dpi) { window_draw_widgets(w, dpi); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; - char buffer[sizeof(window_network_status_text) + 1]; - buffer[0] = FORMAT_BLACK; - strcpy(&buffer[1], window_network_status_text); + char buffer[sizeof(window_network_status_text) + 10]; + char* lineCh = buffer; + lineCh = utf8_write_codepoint(lineCh, FORMAT_BLACK); + strcpy(lineCh, window_network_status_text); gfx_clip_string(buffer, 230); int x = w->x + (w->width / 2); int y = w->y + (w->height / 2); diff --git a/src/windows/player_list.c b/src/windows/player_list.c index f095e3df58..538887d547 100644 --- a/src/windows/player_list.c +++ b/src/windows/player_list.c @@ -226,29 +226,33 @@ static void window_player_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi if (y + 11 >= dpi->y) { char buffer[300]; + char* lineCh = buffer; int colour = 0; if (i == w->selected_list_item) { gfx_fill_rect(dpi, 0, y, 800, y + 9, 0x02000031); strcpy(&buffer[0], network_get_player_name(i)); colour = w->colours[2]; } else { - buffer[0] = FORMAT_BLACK; if (network_get_player_flags(i) & NETWORK_PLAYER_FLAG_ISSERVER) { - buffer[0] = FORMAT_BABYBLUE; + lineCh = utf8_write_codepoint(lineCh, FORMAT_BABYBLUE); + } else { + lineCh = utf8_write_codepoint(lineCh, FORMAT_BLACK); } - strcpy(&buffer[1], network_get_player_name(i)); + strcpy(lineCh, network_get_player_name(i)); } gfx_clip_string(buffer, 230); gfx_draw_string(dpi, buffer, colour, 0, y - 1); - buffer[0] = FORMAT_RED; + lineCh = buffer; int ping = network_get_player_ping(i); - if (ping <= 250) { - buffer[0] = FORMAT_YELLOW; - } if (ping <= 100) { - buffer[0] = FORMAT_GREEN; + lineCh = utf8_write_codepoint(lineCh, FORMAT_GREEN); + } else + if (ping <= 250) { + lineCh = utf8_write_codepoint(lineCh, FORMAT_YELLOW); + } else { + lineCh = utf8_write_codepoint(lineCh, FORMAT_RED); } - sprintf(&buffer[1], "%d ms", ping); + sprintf(lineCh, "%d ms", ping); gfx_draw_string(dpi, buffer, colour, 240, y - 1); } y += 10; diff --git a/src/world/map.c b/src/world/map.c index e310fa3da5..d57bf00797 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1482,7 +1482,7 @@ money32 map_clear_scenery(int x0, int y0, int x1, int y1, int clear, int flags) for (y = y0; y <= y1; y += 32) { for (x = x0; x <= x1; x += 32) { if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gCheatsSandboxMode || map_is_location_owned_or_has_rights(x, y)) { - cost = map_clear_scenery_from_tile(x / 32, y / 32, flags); + cost = map_clear_scenery_from_tile(x / 32, y / 32, clear, flags); if (cost != MONEY32_UNDEFINED) { noValidTiles = false; totalCost += cost; From 90fcc6f18e757e9147daaae1b92ba6826f702006 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 14 Aug 2015 16:59:27 +0100 Subject: [PATCH 0520/1173] only show desync on network games --- src/network/network.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 68b7e13772..f0baba10d9 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -439,6 +439,11 @@ void Network::Update() } } } + + if (!CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { + window_network_status_open("Network desync detected"); + Close(); + } } NetworkPlayer* Network::GetPlayerByID(int id) { @@ -930,10 +935,6 @@ int network_begin_server(int port) void network_update() { gNetwork.Update(); - if (!gNetwork.CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { - window_network_status_open("Network desync detected"); - gNetwork.Close(); - } } int network_get_mode() From 3f31221973744eaa7117448f8492f0adb24ee479 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 14 Aug 2015 22:06:15 +0100 Subject: [PATCH 0521/1173] fix network merge issues, fix #1785 --- data/language/english_uk.txt | 11 +++++------ projects/openrct2.vcxproj | 6 +++--- projects/openrct2.vcxproj.filters | 22 +++++++++++++++------- src/config.c | 2 +- src/config.h | 4 ++-- src/interface/keyboard_shortcut.c | 8 ++++---- src/localisation/string_ids.h | 8 +++++--- src/windows/shortcut_keys.c | 3 ++- src/world/map.c | 8 ++++---- 9 files changed, 41 insertions(+), 31 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 6c49fdf65b..144bf8a857 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3831,9 +3831,8 @@ STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests STR_5490 :Disable audio on focus loss STR_5491 :Inventions list STR_5492 :Scenario options - -STR_6000 :Send Message -STR_6001 :Type the message you would like to send. -STR_6002 :Player List -STR_6003 :Player: -STR_6004 :Ping: +STR_5493 :Send Message +STR_5494 :Type the message you would like to send. +STR_5495 :Player List +STR_5496 :Player: +STR_5497 :Ping: diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index a6886387b4..84ea401ec4 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -347,7 +347,7 @@ Disabled true 1Byte - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_CURL_STATICLIB;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;%(PreprocessorDefinitions) MultiThreaded true $(IntDir)fake\%(RelativeDir) @@ -378,7 +378,7 @@ xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" false - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;CURL_STATICLIB;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;%(PreprocessorDefinitions) $(IntDir)fake\%(RelativeDir) true Speed @@ -418,7 +418,7 @@ xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" false - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;CURL_STATICLIB;ENABLE_TESTS;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;ENABLE_TESTS;%(PreprocessorDefinitions) $(IntDir)fake\%(RelativeDir) true diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index a1068acb6d..49d011038e 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -498,13 +498,6 @@ Source\Localisation - - - Source\Network - - - Source\Windows - Source\Drawing @@ -514,6 +507,18 @@ Source\Localisation + + Source\Network + + + Source\Windows + + + Source\Windows + + + Source\Interface + @@ -750,5 +755,8 @@ Source\Network + + Source\Interface + \ No newline at end of file diff --git a/src/config.c b/src/config.c index 32246efe8f..ea8dfefc7e 100644 --- a/src/config.c +++ b/src/config.c @@ -986,11 +986,11 @@ static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = { SDL_SCANCODE_EQUALS, // SHORTCUT_INCREASE_GAME_SPEED, CTRL | ALT | SDL_SCANCODE_C, // SHORTCUT_OPEN_CHEAT_WINDOW, SDL_SCANCODE_T, // SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, - SDL_SCANCODE_C, // SHORTCUT_OPEN_CHAT_WINDOW SDL_SCANCODE_UP, // SHORTCUT_SCROLL_MAP_UP SDL_SCANCODE_LEFT, // SHORTCUT_SCROLL_MAP_LEFT SDL_SCANCODE_DOWN, // SHORTCUT_SCROLL_MAP_DOWN SDL_SCANCODE_RIGHT, // SHORTCUT_SCROLL_MAP_RIGHT + SDL_SCANCODE_C, // SHORTCUT_OPEN_CHAT_WINDOW }; #define SHORTCUT_FILE_VERSION 1 diff --git a/src/config.h b/src/config.h index e8410ac7f2..46a23acb30 100644 --- a/src/config.h +++ b/src/config.h @@ -72,11 +72,11 @@ enum { SHORTCUT_INCREASE_GAME_SPEED, SHORTCUT_OPEN_CHEAT_WINDOW, SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, - SHORTCUT_OPEN_CHAT_WINDOW, SHORTCUT_SCROLL_MAP_UP, SHORTCUT_SCROLL_MAP_LEFT, SHORTCUT_SCROLL_MAP_DOWN, - SHORTCUT_SCROLL_MAP_RIGHT, + SHORTCUT_SCROLL_MAP_RIGHT, + SHORTCUT_OPEN_CHAT_WINDOW, SHORTCUT_COUNT }; diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index cd5e50903b..f45998020c 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -540,11 +540,11 @@ static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { shortcut_increase_game_speed, shortcut_open_cheat_window, shortcut_remove_top_bottom_toolbar_toggle, + NULL, + NULL, + NULL, + NULL, shortcut_open_chat_window, - NULL, - NULL, - NULL, - NULL, }; #pragma endregion diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 1ec59b969b..8fbbc0d93e 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2030,9 +2030,11 @@ enum { STR_DEBUG_DROPDOWN_INVENTIONS_LIST = 5491, STR_DEBUG_DROPDOWN_SCENARIO_OPTIONS = 5492, - STR_PLAYER_LIST = 6002, - STR_PLAYER = 6003, - STR_PING = 6004, + STR_SEND_MESSAGE = 5493, + STR_TYPE_THE_MESSAGE_YOU_WOULD_LIKE_TO_SEND = 5494, + STR_PLAYER_LIST = 5495, + STR_PLAYER = 5496, + STR_PING = 5497, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/windows/shortcut_keys.c b/src/windows/shortcut_keys.c index 956c9410e3..0499330cea 100644 --- a/src/windows/shortcut_keys.c +++ b/src/windows/shortcut_keys.c @@ -129,7 +129,8 @@ const rct_string_id ShortcutStringIds[] = { STR_SHORTCUT_SCROLL_MAP_UP, STR_SHORTCUT_SCROLL_MAP_LEFT, STR_SHORTCUT_SCROLL_MAP_DOWN, - STR_SHORTCUT_SCROLL_MAP_RIGHT + STR_SHORTCUT_SCROLL_MAP_RIGHT, + STR_SEND_MESSAGE, }; /** diff --git a/src/world/map.c b/src/world/map.c index d57bf00797..9a6d56043d 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1389,7 +1389,7 @@ restart_from_beginning: int ebx = flags; int ecx = y * 32; int edx = mapElement->base_height; - int edi, ebp; + int edi = 0, ebp = 0; cost = game_do_command(eax, ebx, ecx, edx, GAME_COMMAND_REMOVE_PATH, edi, ebp); if (cost == MONEY32_UNDEFINED) @@ -1405,7 +1405,7 @@ restart_from_beginning: int ebx = (mapElement->type << 8) | flags; int ecx = y * 32; int edx = (mapElement->properties.scenery.type << 8) | (mapElement->base_height); - int edi, ebp; + int edi = 0, ebp = 0; cost = game_do_command(eax, ebx, ecx, edx, GAME_COMMAND_REMOVE_SCENERY, edi, ebp); if (cost == MONEY32_UNDEFINED) @@ -1422,7 +1422,7 @@ restart_from_beginning: int ebx = flags; int ecx = y * 32; int edx = (mapElement->base_height << 8) | (mapElement->type & MAP_ELEMENT_DIRECTION_MASK); - int edi, ebp; + int edi = 0, ebp = 0; cost = game_do_command(eax, ebx, ecx, edx, GAME_COMMAND_REMOVE_FENCE, edi, ebp); if (cost == MONEY32_UNDEFINED) @@ -1439,7 +1439,7 @@ restart_from_beginning: int ebx = flags | ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) << 8); int ecx = y * 32; int edx = mapElement->base_height | ((mapElement->properties.scenerymultiple.type >> 10) << 8); - int edi, ebp; + int edi = 0, ebp = 0; cost = game_do_command(eax, ebx, ecx, edx, GAME_COMMAND_REMOVE_LARGE_SCENERY, edi, ebp); if (cost == MONEY32_UNDEFINED) From a18dc9dc61cdf0d063900640c3e108083d31913b Mon Sep 17 00:00:00 2001 From: xperia64 Date: Sat, 15 Aug 2015 14:42:53 -0400 Subject: [PATCH 0522/1173] Add a cheat so guests ignore intensity and nausea ratings --- data/language/english_us.txt | 1 + src/config.c | 1 + src/config.h | 1 + src/localisation/string_ids.h | 2 +- src/peep/peep.c | 22 +++++++++++----------- src/windows/cheats.c | 28 ++++++++++++++++++---------- 6 files changed, 33 insertions(+), 22 deletions(-) diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 147eaac8dd..d7770a5fd7 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3833,3 +3833,4 @@ STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests STR_5490 :Disable audio on focus loss STR_5491 :Inventions list STR_5492 :Scenario options +STR_5493 :Guests ignore intensities diff --git a/src/config.c b/src/config.c index ea8dfefc7e..6d37e1da0d 100644 --- a/src/config.c +++ b/src/config.c @@ -219,6 +219,7 @@ config_property_definition _cheatDefinitions[] = { { offsetof(cheat_configuration, disable_all_breakdowns), "disable_all_breakdowns", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(cheat_configuration, unlock_all_prices), "unlock_all_prices", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(cheat_configuration, build_in_pause_mode), "build_in_pause_mode", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(cheat_configuration, ignore_ride_intensity), "ignore_ride_intensity", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, }; config_property_definition _twitchDefinitions[] = { diff --git a/src/config.h b/src/config.h index 46a23acb30..083ba9861a 100644 --- a/src/config.h +++ b/src/config.h @@ -193,6 +193,7 @@ typedef struct { uint8 disable_all_breakdowns; uint8 unlock_all_prices; uint8 build_in_pause_mode; + uint8 ignore_ride_intensity; } cheat_configuration; typedef struct { diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 8fbbc0d93e..de9436ff44 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1414,7 +1414,7 @@ enum { STR_CHEAT_GUEST_PREFERRED_INTENSITY = 5362, STR_CHEAT_MORE_THAN_1 = 5363, STR_CHEAT_LESS_THAN_15 = 5364, - + STR_CHEAT_IGNORE_INTENSITY = 5493, // Misc. STR_CHEAT_FREEZE_CLIMATE = 2767, STR_CHEAT_UNFREEZE_CLIMATE = 2768, diff --git a/src/peep/peep.c b/src/peep/peep.c index 8fac10960e..08cfbf1149 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7665,7 +7665,7 @@ static bool peep_should_go_on_ride_again(rct_peep *peep, rct_ride *ride) { if (!(RCT2_GLOBAL(0x0097CF40 + (ride->type * 8), uint32) & 0x100000)) return false; if (ride->excitement == (ride_rating)0xFFFF) return false; - if (ride->intensity > RIDE_RATING(10,00)) return false; + if (ride->intensity > RIDE_RATING(10,00) && !gConfigCheat.ignore_ride_intensity) return false; if (peep->happiness < 180) return false; if (peep->energy < 100) return false; if (peep->nausea > 160) return false; @@ -7694,9 +7694,9 @@ static bool peep_really_liked_ride(rct_peep *peep, rct_ride *ride) { return peep->happiness >= 215 && - peep->nausea <= 120 && + ((peep->nausea <= 120 && ride->excitement != (ride_rating)0xFFFF && - ride->intensity <= RIDE_RATING(10,00); + ride->intensity <= RIDE_RATING(10,00))||gConfigCheat.ignore_ride_intensity); } /** @@ -7992,7 +7992,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) } if (ride->excitement != 0xFFFF) { if (rideIndex == peep->guest_heading_to_ride_id) { - if (ride->intensity > RIDE_RATING(10, 00)) goto loc_6965F1; + if (ride->intensity > RIDE_RATING(10, 00) && !gConfigCheat.ignore_ride_intensity) goto loc_6965F1; goto loc_696387; } if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8) != 0) { @@ -8008,7 +8008,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) } ride_rating maxIntensity = min((peep->intensity >> 4) * 100, 1000) + peep->happiness; ride_rating minIntensity = ((peep->intensity & 0x0F) * 100) - peep->happiness; - if (ride->intensity < minIntensity) { + if (ride->intensity < minIntensity && !gConfigCheat.ignore_ride_intensity) { if (!(bp & 4)) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_MORE_THRILLING, rideIndex); if (peep->happiness_growth_rate >= 64) { @@ -8018,11 +8018,11 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) } goto loc_696658; } - if (ride->intensity > maxIntensity) goto loc_6965F1; + if (ride->intensity > maxIntensity && !gConfigCheat.ignore_ride_intensity) goto loc_6965F1; ride_rating minNausea = RCT2_ADDRESS(0x00982390, uint16)[(peep->nausea_tolerance & 3) * 2] - peep->happiness; ride_rating maxNausea = RCT2_ADDRESS(0x00982392, uint16)[(peep->nausea_tolerance & 3) * 2] + peep->happiness; - if (ride->nausea > maxNausea) { + if (ride->nausea > maxNausea && !gConfigCheat.ignore_ride_intensity) { if (!(bp & 4)) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SICKENING, rideIndex); if (peep->happiness_growth_rate >= 64) { @@ -8032,15 +8032,15 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) } goto loc_696658; } - if (ride->nausea >= 140 && peep->nausea > 160) goto loc_69666E; + if (ride->nausea >= 140 && peep->nausea > 160 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; goto loc_696387; } if (RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 8] & 0x10) { if (scenario_rand() > 0x1999U) goto loc_69666E; - if (ride->max_positive_vertical_g > 500) goto loc_69666E; - if (ride->max_negative_vertical_g < -400) goto loc_69666E; - if (ride->max_lateral_g > 400) goto loc_69666E; + if (ride->max_positive_vertical_g > 500 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; + if (ride->max_negative_vertical_g < -400 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; + if (ride->max_lateral_g > 400 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; } loc_696387:; diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 93710be4c6..c1385b4ca1 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -77,6 +77,7 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_GUEST_BATHROOM_MIN, WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1, WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15, + WIDX_GUEST_IGNORE_RIDE_INTENSITY, WIDX_GIVE_ALL_GUESTS_GROUP, WIDX_GIVE_GUESTS_MONEY, WIDX_GIVE_GUESTS_PARK_MAPS, @@ -185,7 +186,7 @@ static rct_widget window_cheats_money_widgets[] = { static rct_widget window_cheats_guests_widgets[] = { MAIN_CHEATS_WIDGETS, - { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(0), HPL(9.5), STR_CHEAT_SET_GUESTS_PARAMETERS, STR_NONE }, // Guests parameters group frame + { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(0), HPL(10.5), STR_CHEAT_SET_GUESTS_PARAMETERS, STR_NONE }, // Guests parameters group frame { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(1), HPL(1), STR_MAX, STR_NONE }, // happiness max { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(1), HPL(1), STR_MIN, STR_NONE }, // happiness min { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(2), HPL(2), STR_MAX, STR_NONE }, // energy max @@ -202,14 +203,15 @@ static rct_widget window_cheats_guests_widgets[] = { { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(7), HPL(7), STR_MIN, STR_NONE }, // bathroom min { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(9), HPL(9), STR_CHEAT_MORE_THAN_1, STR_NONE }, // ride intensity > 1 { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(9), HPL(9), STR_CHEAT_LESS_THAN_15, STR_NONE }, // ride intensity < 15 - { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(11), HPL(13.5), STR_CHEAT_GIVE_ALL_GUESTS, STR_NONE }, // Guests parameters group frame - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(12), HPL(12), STR_CHEAT_CURRENCY_FORMAT, STR_NONE }, // give guests money - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(12), HPL(12), 2018, STR_NONE }, // give guests park maps - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(13), HPL(13), 2016, STR_NONE }, // give guests balloons - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(13), HPL(13), 2020, STR_NONE }, // give guests umbrellas - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(15), HPL(15), STR_CHEAT_LARGE_TRAM_GUESTS, STR_CHEAT_TIP_LARGE_TRAM_GUESTS }, // large tram - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(15), HPL(15), STR_CHEAT_REMOVE_ALL_GUESTS, STR_CHEAT_TIP_REMOVE_ALL_GUESTS }, // remove all guests - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(16), HPL(16), STR_CHEAT_EXPLODE, STR_CHEAT_TIP_EXPLODE }, // explode guests + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(10), OHPL(10), STR_CHEAT_IGNORE_INTENSITY, STR_NONE }, // don't care about intensity + { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(12), HPL(14.5), STR_CHEAT_GIVE_ALL_GUESTS, STR_NONE }, // Guests parameters group frame + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(13), HPL(13), STR_CHEAT_CURRENCY_FORMAT, STR_NONE }, // give guests money + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(13), HPL(13), 2018, STR_NONE }, // give guests park maps + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(14), HPL(14), 2016, STR_NONE }, // give guests balloons + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(14), HPL(14), 2020, STR_NONE }, // give guests umbrellas + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(16), HPL(16), STR_CHEAT_LARGE_TRAM_GUESTS, STR_CHEAT_TIP_LARGE_TRAM_GUESTS }, // large tram + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(16), HPL(16), STR_CHEAT_REMOVE_ALL_GUESTS, STR_CHEAT_TIP_REMOVE_ALL_GUESTS }, // remove all guests + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(17), HPL(17), STR_CHEAT_EXPLODE, STR_CHEAT_TIP_EXPLODE }, // explode guests { WIDGETS_END }, }; @@ -406,7 +408,7 @@ static rct_window_event_list *window_cheats_page_events[] = { 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_HIGH_MONEY) | (1ULL << WIDX_CLEAR_LOAN), - (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_GUEST_PARAMETERS_GROUP) | (1ULL << WIDX_GUEST_HAPPINESS_MAX) | (1ULL << WIDX_GUEST_HAPPINESS_MIN) | (1ULL << WIDX_GUEST_ENERGY_MAX) | (1ULL << WIDX_GUEST_ENERGY_MIN) | (1ULL << WIDX_GUEST_HUNGER_MAX) | (1ULL << WIDX_GUEST_HUNGER_MIN) | (1ULL << WIDX_GUEST_THIRST_MAX) | (1ULL << WIDX_GUEST_THIRST_MIN) | (1ULL << WIDX_GUEST_NAUSEA_MAX) | (1ULL << WIDX_GUEST_NAUSEA_MIN) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1ULL << WIDX_GUEST_BATHROOM_MAX) | (1ULL << WIDX_GUEST_BATHROOM_MIN) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1ULL << WIDX_GIVE_ALL_GUESTS_GROUP) | (1ULL << WIDX_GIVE_GUESTS_MONEY) | (1ULL << WIDX_GIVE_GUESTS_PARK_MAPS) | (1ULL << WIDX_GIVE_GUESTS_BALLOONS) | (1ULL << WIDX_GIVE_GUESTS_UMBRELLAS) | (1ULL << WIDX_TRAM_GUESTS) | (1ULL << WIDX_REMOVE_ALL_GUESTS) | (1ULL << WIDX_EXPLODE_GUESTS), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_GUEST_PARAMETERS_GROUP) | (1ULL << WIDX_GUEST_HAPPINESS_MAX) | (1ULL << WIDX_GUEST_HAPPINESS_MIN) | (1ULL << WIDX_GUEST_ENERGY_MAX) | (1ULL << WIDX_GUEST_ENERGY_MIN) | (1ULL << WIDX_GUEST_HUNGER_MAX) | (1ULL << WIDX_GUEST_HUNGER_MIN) | (1ULL << WIDX_GUEST_THIRST_MAX) | (1ULL << WIDX_GUEST_THIRST_MIN) | (1ULL << WIDX_GUEST_NAUSEA_MAX) | (1ULL << WIDX_GUEST_NAUSEA_MIN) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1ULL << WIDX_GUEST_BATHROOM_MAX) | (1ULL << WIDX_GUEST_BATHROOM_MIN) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1ULL << WIDX_GUEST_IGNORE_RIDE_INTENSITY) | (1ULL << WIDX_GIVE_ALL_GUESTS_GROUP) | (1ULL << WIDX_GIVE_GUESTS_MONEY) | (1ULL << WIDX_GIVE_GUESTS_PARK_MAPS) | (1ULL << WIDX_GIVE_GUESTS_BALLOONS) | (1ULL << WIDX_GIVE_GUESTS_UMBRELLAS) | (1ULL << WIDX_TRAM_GUESTS) | (1ULL << WIDX_REMOVE_ALL_GUESTS) | (1ULL << WIDX_EXPLODE_GUESTS), (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_FREEZE_CLIMATE) | (1ULL << WIDX_OPEN_CLOSE_PARK) | (1ULL << WIDX_WEATHER_SUN) | (1ULL << WIDX_WEATHER_THUNDER) | (1ULL << WIDX_CLEAR_GRASS) | (1ULL << WIDX_MOWED_GRASS) | (1ULL << WIDX_WATER_PLANTS) | (1ULL << WIDX_FIX_VANDALISM) | (1ULL << WIDX_REMOVE_LITTER) | (1ULL << WIDX_WIN_SCENARIO) | (1ULL << WIDX_HAVE_FUN) | (1ULL << WIDX_UNLOCK_ALL_PRICES) | (1ULL << WIDX_SANDBOX_MODE) | (1ULL << WIDX_FAST_STAFF) | (1ULL << WIDX_NORMAL_STAFF) | (1ULL << WIDX_PARK_PARAMETERS) | (1ULL << WIDX_FORCE_PARK_RATING) | (1ULL << WIDX_INCREASE_PARK_RATING) | (1ULL << WIDX_DECREASE_PARK_RATING), (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) }; @@ -853,6 +855,11 @@ static void window_cheats_guests_mouseup(rct_window *w, int widgetIndex) case WIDX_GIVE_GUESTS_UMBRELLAS: cheat_give_all_guests(OBJECT_UMBRELLA); break; + case WIDX_GUEST_IGNORE_RIDE_INTENSITY: + gConfigCheat.ignore_ride_intensity ^= 1; + config_save_default(); + window_invalidate(w); + break; } } @@ -1040,6 +1047,7 @@ static void window_cheats_invalidate(rct_window *w) break; case WINDOW_CHEATS_PAGE_GUESTS: RCT2_GLOBAL(0x013CE952, int) = 10000; + widget_set_checkbox_value(w, WIDX_GUEST_IGNORE_RIDE_INTENSITY, gConfigCheat.ignore_ride_intensity); break; case WINDOW_CHEATS_PAGE_MISC: w->widgets[WIDX_OPEN_CLOSE_PARK].image = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_OPEN ? From 9746bccbf6bd4650fd4d162d07bd2592de34afdd Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 15 Aug 2015 23:19:15 +0100 Subject: [PATCH 0523/1173] improve multiplayer --- projects/openrct2.vcxproj.user | 6 +- src/game.c | 53 ++++++------- src/network/network.cpp | 139 ++++++++++++++++++++++----------- src/network/network.h | 5 ++ src/rct2.c | 3 + 5 files changed, 129 insertions(+), 77 deletions(-) diff --git a/projects/openrct2.vcxproj.user b/projects/openrct2.vcxproj.user index 6e0ad43592..96c90432a6 100644 --- a/projects/openrct2.vcxproj.user +++ b/projects/openrct2.vcxproj.user @@ -12,7 +12,8 @@ $(TargetDir) WindowsLocalDebugger $(TargetDir)\openrct2.exe - "C:\Program Files (x86)\Infogrames\RollerCoaster Tycoon 2\Scenarios\Crazy Castle.SC6" --port 5552 --server 127.0.0.1 + + $(TargetDir) @@ -23,7 +24,6 @@ $(TargetDir)\openrct2.exe WindowsLocalDebugger $(TargetDir) - - + --server 127.0.0.1 --port 12345 \ No newline at end of file diff --git a/src/game.c b/src/game.c index 6a497edfa9..af06998e03 100644 --- a/src/game.c +++ b/src/game.c @@ -262,32 +262,39 @@ void game_update() // make sure client doesn't fall behind the server too much numUpdates += 10; } + + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) >= network_get_server_tick()) { + // dont run past the server + numUpdates = 0; + } + } else { + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0) { + numUpdates = 0; + } } // Update the game one or more times - if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0) { - for (i = 0; i < numUpdates; i++) { - game_logic_update(); - start_title_music(); + for (i = 0; i < numUpdates; i++) { + game_logic_update(); + start_title_music(); - if (gGameSpeed > 1) - continue; + if (gGameSpeed > 1) + continue; - // Possibly smooths viewport scrolling, I don't see a difference though - if (RCT2_GLOBAL(0x009E2D74, uint32) == 1) { - RCT2_GLOBAL(0x009E2D74, uint32) = 0; - break; - } else { - if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) == INPUT_STATE_RESET || - RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) == INPUT_STATE_NORMAL - ) { - if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_VIEWPORT_SCROLLING) { - RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) &= ~INPUT_FLAG_VIEWPORT_SCROLLING; - break; - } - } else { + // Possibly smooths viewport scrolling, I don't see a difference though + if (RCT2_GLOBAL(0x009E2D74, uint32) == 1) { + RCT2_GLOBAL(0x009E2D74, uint32) = 0; + break; + } else { + if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) == INPUT_STATE_RESET || + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) == INPUT_STATE_NORMAL + ) { + if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_VIEWPORT_SCROLLING) { + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) &= ~INPUT_FLAG_VIEWPORT_SCROLLING; break; } + } else { + break; } } } @@ -332,14 +339,6 @@ void game_update() void game_logic_update() { - network_update(); - if (network_get_mode() == NETWORK_MODE_CLIENT) { - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) == network_get_server_tick()) { - // dont run past the server - return; - } - } - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)++; RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32)++; RCT2_GLOBAL(0x009DEA66, sint16)++; diff --git a/src/network/network.cpp b/src/network/network.cpp index f0baba10d9..ab3696eca8 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -57,6 +57,17 @@ enum { NETWORK_COMMAND_MAX }; +const char *NetworkCommandNames[] = { + "NETWORK_COMMAND_AUTH", + "NETWORK_COMMAND_MAP", + "NETWORK_COMMAND_CHAT", + "NETWORK_COMMAND_GAMECMD", + "NETWORK_COMMAND_TICK", + "NETWORK_COMMAND_PLAYERLIST", + "NETWORK_COMMAND_PING", + "NETWORK_COMMAND_PINGLIST", +}; + NetworkPacket::NetworkPacket() { transferred = 0; @@ -397,52 +408,73 @@ void Network::Update() if (GetMode() == NETWORK_MODE_NONE) return; - if (GetMode() == NETWORK_MODE_CLIENT) { - if (!ProcessConnection(server_connection)) { - Close(); + switch (GetMode()) { + case NETWORK_MODE_NONE: + return; + case NETWORK_MODE_SERVER: + UpdateServer(); + break; + case NETWORK_MODE_CLIENT: + UpdateClient(); + break; + } +} + +void Network::UpdateServer() +{ + auto it = client_connection_list.begin(); + while (it != client_connection_list.end()) { + if (!ProcessConnection(*(*it))) { + RemoveClient((*it)); + it = client_connection_list.begin(); } else { - ProcessGameCommandQueue(); + it++; } - } else - if (GetMode() == NETWORK_MODE_SERVER) { - auto it = client_connection_list.begin(); - while (it != client_connection_list.end()) { - if (!ProcessConnection(*(*it))) { - RemoveClient((*it)); - it = client_connection_list.begin(); - } else { - it++; - } + } + if (SDL_GetTicks() - last_tick_sent_time >= 25) { + last_tick_sent_time = SDL_GetTicks(); + Server_Send_TICK(); + } + if (SDL_GetTicks() - last_ping_sent_time >= 3000) { + last_ping_sent_time = SDL_GetTicks(); + Server_Send_PING(); + Server_Send_PINGLIST(); + } + SOCKET socket = accept(listening_socket, NULL, NULL); + if (socket == INVALID_SOCKET) { + if (WSAGetLastError() != WSAEWOULDBLOCK) { + PrintError(); + log_error("Failed to accept client."); } - if (SDL_GetTicks() - last_tick_sent_time >= 25) { - last_tick_sent_time = SDL_GetTicks(); - Server_Send_TICK(); - } - if (SDL_GetTicks() - last_ping_sent_time >= 3000) { - last_ping_sent_time = SDL_GetTicks(); - Server_Send_PING(); - Server_Send_PINGLIST(); - } - SOCKET socket = accept(listening_socket, NULL, NULL); - if (socket == INVALID_SOCKET) { - if (WSAGetLastError() != WSAEWOULDBLOCK) { - PrintError(); - log_error("Failed to accept client."); - } + } else { + u_long nonblocking = 1; + if (ioctlsocket(socket, FIONBIO, &nonblocking) != NO_ERROR) { + closesocket(socket); + log_error("Failed to set non-blocking mode."); } else { - u_long nonblocking = 1; - if (ioctlsocket(socket, FIONBIO, &nonblocking) != NO_ERROR) { - closesocket(socket); - log_error("Failed to set non-blocking mode."); - } else { - AddClient(socket); + AddClient(socket); + was_paused_before_client_connected = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) != 0; + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) == 0) { + pause_toggle(); } } } +} - if (!CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { - window_network_status_open("Network desync detected"); +void Network::UpdateClient() +{ + if (!ProcessConnection(server_connection)) { Close(); + } else { + ProcessGameCommandQueue(); + if (CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { + if (server_srand0_tick == 0) { + // printf("SRAND OK!\n"); + } + } else { + window_network_status_open("Network desync detected"); + Close(); + } } } @@ -478,6 +510,14 @@ void Network::SendPacketToClients(NetworkPacket& packet) bool Network::CheckSRAND(uint32 tick, uint32 srand0) { + if (server_srand0_tick == 0) + return true; + + if (tick >= server_srand0_tick) { + server_srand0_tick = 0; + return true; + } + if (tick == server_srand0_tick) { server_srand0_tick = 0; if (srand0 != server_srand0) { @@ -634,17 +674,20 @@ void Network::ProcessPacket(NetworkConnection& connection, NetworkPacket& packet uint32 command; packet >> command; if (command < NETWORK_COMMAND_MAX) { - if (GetMode() == NETWORK_MODE_CLIENT) { - if (client_command_handlers[command]) { - (this->*client_command_handlers[command])(connection, packet); - } - } else - if (GetMode() == NETWORK_MODE_SERVER) { + // printf("RECV %s\n", NetworkCommandNames[command]); + switch (gNetwork.GetMode()) { + case NETWORK_MODE_SERVER: if (server_command_handlers[command]) { if (connection.authstatus == NETWORK_AUTH_OK || command == NETWORK_COMMAND_AUTH) { (this->*server_command_handlers[command])(connection, packet); } } + break; + case NETWORK_MODE_CLIENT: + if (client_command_handlers[command]) { + (this->*client_command_handlers[command])(connection, packet); + } + break; } } packet.Clear(); @@ -997,11 +1040,13 @@ void network_send_chat(const char* text) void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback) { - if (gNetwork.GetMode() == NETWORK_MODE_CLIENT) { - gNetwork.Client_Send_GAMECMD(eax, ebx, ecx, edx, esi, edi, ebp, callback); - } else - if (gNetwork.GetMode() == NETWORK_MODE_SERVER) { + switch (gNetwork.GetMode()) { + case NETWORK_MODE_SERVER: gNetwork.Server_Send_GAMECMD(eax, ebx, ecx, edx, esi, edi, ebp, gNetwork.GetPlayerID(), callback); + break; + case NETWORK_MODE_CLIENT: + gNetwork.Client_Send_GAMECMD(eax, ebx, ecx, edx, esi, edi, ebp, callback); + break; } } diff --git a/src/network/network.h b/src/network/network.h index 121ddf5b24..17dc74a497 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -188,6 +188,11 @@ private: std::vector chunk_buffer; char password[33]; + bool was_paused_before_client_connected; + + void UpdateServer(); + void UpdateClient(); + private: std::vector client_command_handlers; std::vector server_command_handlers; diff --git a/src/rct2.c b/src/rct2.c index 24f00a2c45..61af055adf 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -36,6 +36,7 @@ #include "localisation/date.h" #include "localisation/localisation.h" #include "management/news_item.h" +#include "network/network.h" #include "network/twitch.h" #include "object.h" #include "openrct2.h" @@ -371,6 +372,8 @@ void rct2_update_2() // TODO: screenshot countdown process + network_update(); + // check_cmdline_arg(); // Screens if (RCT2_GLOBAL(RCT2_ADDRESS_RUN_INTRO_TICK_PART, uint8) != 0) From f072440d186dbe94e9ef40a9644a59e753e24953 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 16 Aug 2015 03:07:00 +0100 Subject: [PATCH 0524/1173] add server list window (WIP) --- data/language/english_uk.txt | 6 + projects/openrct2.vcxproj | 1 + projects/openrct2.vcxproj.filters | 3 + src/interface/window.h | 2 + src/localisation/string_ids.h | 6 + src/windows/clear_scenery.c | 2 - src/windows/editor_object_selection.c | 1 + src/windows/server_list.c | 338 ++++++++++++++++++++++++++ src/windows/title_menu.c | 31 ++- 9 files changed, 384 insertions(+), 6 deletions(-) create mode 100644 src/windows/server_list.c diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 144bf8a857..361b08dea1 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3836,3 +3836,9 @@ STR_5494 :Type the message you would like to send. STR_5495 :Player List STR_5496 :Player: STR_5497 :Ping: +STR_5498 :Server List +STR_5499 :Player Name: +STR_5500 :Add Server +STR_5501 :Start Server +STR_5502 :Multiplayer +STR_5503 :Enter hostname or IP address: diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 84ea401ec4..956fd8efe2 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -100,6 +100,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 49d011038e..8321dae4a5 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -519,6 +519,9 @@ Source\Interface + + Source\Windows + diff --git a/src/interface/window.h b/src/interface/window.h index 080c6c201a..a60cace19f 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -449,6 +449,7 @@ enum { WC_CHAT_HOST = 124, WC_PLAYER_LIST = 125, WC_NETWORK_STATUS = 126, + WC_SERVER_LIST = 127, // Only used for colour schemes WC_STAFF = 220, @@ -615,6 +616,7 @@ void window_sign_small_open(rct_windownumber number); void window_cheats_open(); void window_player_list_open(); void window_network_status_open(const char* text); +void window_server_list_open(); void window_research_open(); void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dpi, int baseWidgetIndex); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 8fbbc0d93e..f9cc1abcfb 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2035,6 +2035,12 @@ enum { STR_PLAYER_LIST = 5495, STR_PLAYER = 5496, STR_PING = 5497, + STR_SERVER_LIST = 5498, + STR_PLAYER_NAME = 5499, + STR_ADD_SERVER = 5500, + STR_START_SERVER = 5501, + STR_MULTIPLAYER = 5502, + STR_ENTER_HOSTNAME_OR_IP_ADDRESS = 5503, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/windows/clear_scenery.c b/src/windows/clear_scenery.c index 819340bc07..fcbb6a50c5 100644 --- a/src/windows/clear_scenery.c +++ b/src/windows/clear_scenery.c @@ -139,8 +139,6 @@ static void window_clear_scenery_close(rct_window *w) */ static void window_clear_scenery_mouseup(rct_window *w, int widgetIndex) { - int limit; - switch (widgetIndex) { case WIDX_CLOSE: window_close(w); diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 26e05f526e..054b3918a2 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -1,3 +1,4 @@ + /***************************************************************************** * Copyright (c) 2014 Dániel Tar * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. diff --git a/src/windows/server_list.c b/src/windows/server_list.c new file mode 100644 index 0000000000..c9716da512 --- /dev/null +++ b/src/windows/server_list.c @@ -0,0 +1,338 @@ +/***************************************************************************** +* Copyright (c) 2014 Ted John +* OpenRCT2, an open source clone of Roller Coaster Tycoon 2. +* +* This file is part of OpenRCT2. +* +* OpenRCT2 is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. + +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. + +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*****************************************************************************/ + +#include "../interface/themes.h" +#include "../interface/widget.h" +#include "../interface/window.h" +#include "../localisation/localisation.h" +#include "../network/network.h" +#include "../sprites.h" + +#define WWIDTH_MIN 500 +#define WHEIGHT_MIN 300 +#define WWIDTH_MAX 1200 +#define WHEIGHT_MAX 800 +#define ITEM_HEIGHT (3 + 11 + 1 + 11 + 3) + +typedef struct { + char *address; + utf8 *name; + utf8 *description; +} saved_server; + +char _playerName[64] = "Player"; +saved_server *_savedServers = NULL; +int _numSavedServers = 0; + +enum { + WIDX_BACKGROUND, + WIDX_TITLE, + WIDX_CLOSE, + WIDX_PLAYER_NAME_INPUT, + WIDX_LIST, + WIDX_ADD_SERVER, + WIDX_START_SERVER +}; + +enum { + WIDX_LIST_REMOVE, + WIDX_LIST_SPECTATE +}; + +static rct_widget window_server_list_widgets[] = { + { WWT_FRAME, 0, 0, 340, 0, 90, 0xFFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 338, 1, 14, STR_SERVER_LIST, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 327, 337, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_TEXT_BOX, 1, 100, 344, 20, 31, (uint32)_playerName, STR_NONE }, // player name text box + { WWT_SCROLL, 1, 6, 337, 37, 50, STR_NONE, STR_NONE }, // server list + { WWT_DROPDOWN_BUTTON, 1, 6, 106, 53, 64, STR_ADD_SERVER, STR_NONE }, // add server button + { WWT_DROPDOWN_BUTTON, 1, 112, 212, 53, 64, STR_START_SERVER, STR_NONE }, // start server button + { WIDGETS_END }, +}; + +static void window_server_list_mouseup(rct_window *w, int widgetIndex); +static void window_server_list_resize(rct_window *w); +static void window_server_list_update(rct_window *w); +static void window_server_list_scroll_getsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_server_list_scroll_mousedown(rct_window *w, int scrollIndex, int x, int y); +static void window_server_list_scroll_mouseover(rct_window *w, int scrollIndex, int x, int y); +static void window_server_list_textinput(rct_window *w, int widgetIndex, char *text); +static void window_server_list_invalidate(rct_window *w); +static void window_server_list_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_server_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); + +static void server_list_get_item_button(int buttonIndex, int x, int y, int width, int *outX, int *outY); + +static rct_window_event_list window_server_list_events = { + NULL, + window_server_list_mouseup, + window_server_list_resize, + NULL, + NULL, + NULL, + window_server_list_update, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_server_list_scroll_getsize, + window_server_list_scroll_mousedown, + NULL, + window_server_list_scroll_mouseover, + window_server_list_textinput, + NULL, + NULL, + NULL, + NULL, + NULL, + window_server_list_invalidate, + window_server_list_paint, + window_server_list_scrollpaint +}; + +static int _hoverButtonIndex = -1; + +void window_server_list_open() +{ + rct_window* window; + + // Check if window is already open + window = window_bring_to_front_by_class(WC_SERVER_LIST); + if (window != NULL) + return; + + window = window_create_centred(WWIDTH_MIN, WHEIGHT_MIN, &window_server_list_events, WC_SERVER_LIST, WF_10 | WF_RESIZABLE); + + window->widgets = window_server_list_widgets; + window->enabled_widgets = ( + (1 << WIDX_CLOSE) | + (1 << WIDX_PLAYER_NAME_INPUT) | + (1 << WIDX_ADD_SERVER) | + (1 << WIDX_START_SERVER) + ); + window_init_scroll_widgets(window); + window->no_list_items = 0; + window->selected_list_item = -1; + window->frame_no = 0; + window->min_width = 320; + window->min_height = 90; + window->max_width = window->min_width; + window->max_height = window->min_height; + + window->page = 0; + window->list_information_type = 0; + window->colours[0] = 1; + window->colours[1] = 26; + window->colours[2] = 26; + + window_set_resize(window, WWIDTH_MIN, WHEIGHT_MIN, WWIDTH_MAX, WHEIGHT_MAX); + + _numSavedServers = 2; + _savedServers = malloc(_numSavedServers * sizeof(saved_server)); + _savedServers[0].address = "127.0.0.1"; + _savedServers[0].name = "localhost"; + _savedServers[0].description = "Home sweet home."; + _savedServers[1].address = "81.124.111.146:12428"; + _savedServers[1].name = "Another server, #1"; + _savedServers[1].description = "Another server..."; + window->no_list_items = _numSavedServers; +} + +static void window_server_list_mouseup(rct_window *w, int widgetIndex) +{ + switch (widgetIndex) { + case WIDX_CLOSE: + window_close(w); + break; + case WIDX_PLAYER_NAME_INPUT: + window_start_textbox(w, widgetIndex, 1170, (uint32)_playerName, 63); + break; + case WIDX_ADD_SERVER: + window_text_input_open(w, widgetIndex, STR_ADD_SERVER, STR_ENTER_HOSTNAME_OR_IP_ADDRESS, STR_NONE, 0, 128); + break; + } +} + +static void window_server_list_resize(rct_window *w) +{ + window_set_resize(w, WWIDTH_MIN, WHEIGHT_MIN, WWIDTH_MAX, WHEIGHT_MAX); +} + +static void window_server_list_update(rct_window *w) +{ + if (gCurrentTextBox.window.classification == w->classification && gCurrentTextBox.window.number == w->number) { + window_update_textbox_caret(); + widget_invalidate(w, WIDX_PLAYER_NAME_INPUT); + } +} + +static void window_server_list_scroll_getsize(rct_window *w, int scrollIndex, int *width, int *height) +{ + *width = 0; + *height = w->no_list_items * ITEM_HEIGHT; +} + +static void window_server_list_scroll_mousedown(rct_window *w, int scrollIndex, int x, int y) +{ + if (w->selected_list_item == -1) return; + + switch (_hoverButtonIndex) { + case WIDX_LIST_REMOVE: + break; + case WIDX_LIST_SPECTATE: + break; + default: + // Join + break; + } +} + +static void window_server_list_scroll_mouseover(rct_window *w, int scrollIndex, int x, int y) +{ + // Item + int index = y / ITEM_HEIGHT; + if (index < 0 || index >= w->no_list_items) { + index = -1; + } + + int hoverButtonIndex = -1; + if (index != -1) { + int width = w->widgets[WIDX_LIST].right - w->widgets[WIDX_LIST].left; + int sy = index * ITEM_HEIGHT; + for (int i = 0; i < 2; i++) { + int bx, by; + + server_list_get_item_button(i, 0, sy, width, &bx, &by); + if (x >= bx && y >= by && x < bx + 24 && y < by + 24) { + hoverButtonIndex = i; + break; + } + } + } + + if (w->selected_list_item != index || _hoverButtonIndex != hoverButtonIndex) { + w->selected_list_item = index; + _hoverButtonIndex = hoverButtonIndex; + window_invalidate(w); + } +} + +static void window_server_list_textinput(rct_window *w, int widgetIndex, char *text) +{ + if (widgetIndex != WIDX_PLAYER_NAME_INPUT || text == NULL) + return; + + if (strcmp(_playerName, text) == 0) + return; + + if (strlen(text) == 0) { + memset(_playerName, 0, sizeof(_playerName)); + } else { + memset(_playerName, 0, sizeof(_playerName)); + strcpy(_playerName, text); + } + + widget_invalidate(w, WIDX_PLAYER_NAME_INPUT); +} + +static void window_server_list_invalidate(rct_window *w) +{ + window_server_list_widgets[WIDX_BACKGROUND].right = w->width - 1; + window_server_list_widgets[WIDX_BACKGROUND].bottom = w->height - 1; + window_server_list_widgets[WIDX_TITLE].right = w->width - 2; + window_server_list_widgets[WIDX_CLOSE].left = w->width - 2 - 11; + window_server_list_widgets[WIDX_CLOSE].right = w->width - 2 - 11 + 10; + + window_server_list_widgets[WIDX_PLAYER_NAME_INPUT].right = w->width - 6; + window_server_list_widgets[WIDX_LIST].left = 6; + window_server_list_widgets[WIDX_LIST].right = w->width - 6; + window_server_list_widgets[WIDX_LIST].bottom = w->height - 6 - 11 - 6; + window_server_list_widgets[WIDX_ADD_SERVER].top = w->height - 6 - 11; + window_server_list_widgets[WIDX_ADD_SERVER].bottom = w->height - 6; + window_server_list_widgets[WIDX_START_SERVER].top = w->height - 6 - 11; + window_server_list_widgets[WIDX_START_SERVER].bottom = w->height - 6; +} + +static void window_server_list_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ + window_draw_widgets(w, dpi); + + gfx_draw_string_left(dpi, STR_PLAYER_NAME, NULL, w->colours[1], w->x + 6, w->y + w->widgets[WIDX_PLAYER_NAME_INPUT].top); +} + +static void window_server_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) +{ + uint32 colour; + int bx, by; + + colour = ((char*)0x0141FC48)[w->colours[1] * 8]; + colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; + gfx_clear(dpi, colour); + + int width = w->widgets[WIDX_LIST].right - w->widgets[WIDX_LIST].left; + + int y = 0; + for (int i = 0; i < w->no_list_items; i++) { + if (y >= dpi->y + dpi->height) continue; + // if (y + ITEM_HEIGHT < dpi->y) continue; + + saved_server *serverDetails = &_savedServers[i]; + bool highlighted = i == w->selected_list_item; + + // Draw hover highlight + if (highlighted) { + gfx_fill_rect(dpi, 0, y, width, y + ITEM_HEIGHT, 0x02000031); + } + + // Draw server information + if (highlighted) { + gfx_draw_string(dpi, serverDetails->address, w->colours[1], 3, y + 3); + } else { + gfx_draw_string(dpi, serverDetails->name, w->colours[1], 3, y + 3); + } + gfx_draw_string(dpi, serverDetails->description, w->colours[1], 3, y + 14); + + // Draw delete server button + server_list_get_item_button(0, 0, y, width, &bx, &by); + if (highlighted && _hoverButtonIndex == WIDX_LIST_REMOVE) { + gfx_fill_rect_inset(dpi, bx, by, bx + 24, by + 24, w->colours[1], 0); + } + gfx_draw_sprite(dpi, SPR_DEMOLISH, bx, by, 0); + + // Draw spectate server button + server_list_get_item_button(1, 0, y, width, &bx, &by); + if (highlighted && _hoverButtonIndex == WIDX_LIST_SPECTATE) { + gfx_fill_rect_inset(dpi, bx, by, bx + 24, by + 24, w->colours[1], 0); + } + gfx_draw_sprite(dpi, SPR_LOCATE, bx, by, 0); + + y += ITEM_HEIGHT; + } +} + +static void server_list_get_item_button(int buttonIndex, int x, int y, int width, int *outX, int *outY) +{ + *outX = width - 3 - 36 - (30 * buttonIndex); + *outY = y + 2; +} diff --git a/src/windows/title_menu.c b/src/windows/title_menu.c index 9ef748705d..2bb2c004f1 100644 --- a/src/windows/title_menu.c +++ b/src/windows/title_menu.c @@ -35,6 +35,7 @@ enum { WIDX_CONTINUE_SAVED_GAME, WIDX_SHOW_TUTORIAL, WIDX_GAME_TOOLS, + WIDX_MULTIPLAYER }; static rct_widget window_title_menu_widgets[] = { @@ -42,6 +43,7 @@ static rct_widget window_title_menu_widgets[] = { { WWT_IMGBTN, 2, 82, 163, 0, 81, SPR_MENU_LOAD_GAME, STR_CONTINUE_SAVED_GAME_TIP }, { WWT_IMGBTN, 2, 164, 245, 0, 81, SPR_MENU_TUTORIAL, STR_SHOW_TUTORIAL_TIP }, { WWT_IMGBTN, 2, 246, 327, 0, 81, SPR_MENU_TOOLBOX, STR_GAME_TOOLS }, + { WWT_DROPDOWN_BUTTON, 2, 82, 245, 88, 99, STR_MULTIPLAYER, STR_NONE }, { WIDGETS_END }, }; @@ -93,14 +95,23 @@ void window_title_menu_open() window = window_create( (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 328) / 2, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 142, - 328, 82, + 328, 100, &window_title_menu_events, WC_TITLE_MENU, - WF_STICK_TO_BACK | WF_TRANSPARENT + WF_STICK_TO_BACK | WF_TRANSPARENT | WF_5 ); window->widgets = window_title_menu_widgets; - window->enabled_widgets |= (8 | 2 | 1); - window->disabled_widgets |= (4); // Disable tutorial button + window->enabled_widgets = ( + (1 << WIDX_START_NEW_GAME) | + (1 << WIDX_CONTINUE_SAVED_GAME) | + (1 << WIDX_SHOW_TUTORIAL) | + (1 << WIDX_GAME_TOOLS) | + (1 << WIDX_MULTIPLAYER) + ); + + // Disable tutorial button + window->disabled_widgets = (1 << WIDX_SHOW_TUTORIAL); + window_init_scroll_widgets(window); } @@ -113,6 +124,9 @@ static void window_title_menu_mouseup(rct_window *w, int widgetIndex) case WIDX_CONTINUE_SAVED_GAME: game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 0, 0); break; + case WIDX_MULTIPLAYER: + window_server_list_open(); + break; } } @@ -175,6 +189,15 @@ static void window_title_menu_cursor(rct_window *w, int widgetIndex, int x, int static void window_title_menu_paint(rct_window *w, rct_drawpixelinfo *dpi) { + gfx_fill_rect(dpi, w->x, w->y, w->x + w->width - 1, w->y + 82 - 1, 0x2000000 | 51); + gfx_fill_rect( + dpi, + w->x + window_title_menu_widgets[WIDX_MULTIPLAYER].left, + w->y + window_title_menu_widgets[WIDX_MULTIPLAYER].top, + w->x + window_title_menu_widgets[WIDX_MULTIPLAYER].right, + w->y + window_title_menu_widgets[WIDX_MULTIPLAYER].bottom, + 0x2000000 | 51 + ); window_draw_widgets(w, dpi); } From 905efcd412f9b7e9cba555b0c19a79a7708ddd9b Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 16 Aug 2015 04:00:15 +0100 Subject: [PATCH 0525/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 5 +++++ data/language/english_us.txt | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index c60b921ab9..acbadadf68 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3832,3 +3832,8 @@ STR_5489 :{SMALLFONT}{BLACK}只顯示追蹤中的遊客 STR_5490 :失去焦點時靜音 STR_5491 :研發列表 STR_5492 :劇情選項 +STR_5493 :發送訊息 +STR_5494 :請輸入你要發送的訊息. +STR_5495 :玩家列表 +STR_5496 :玩家: +STR_5497 :延遲值 (Ping): diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 147eaac8dd..3c8b97e02d 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3833,3 +3833,8 @@ STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests STR_5490 :Disable audio on focus loss STR_5491 :Inventions list STR_5492 :Scenario options +STR_5493 :Send Message +STR_5494 :Enter the message you would like to send. +STR_5495 :Player List +STR_5496 :Player: +STR_5497 :Ping: From c00e044b6c415d9feccd6b57dff2acac2fbaefaa Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 16 Aug 2015 13:14:04 +0200 Subject: [PATCH 0526/1173] Multiplayer interface improvements, cleanup --- data/language/english_uk.txt | 5 +++-- src/localisation/string_ids.h | 7 +++++-- src/sprites.h | 4 ++++ src/windows/finances.c | 12 ++++++------ src/windows/new_ride.c | 2 +- src/windows/player_list.c | 3 +++ src/windows/research.c | 4 ++-- src/windows/ride.c | 6 +++--- src/windows/top_toolbar.c | 24 +++++++++++++++++++----- 9 files changed, 46 insertions(+), 21 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 361b08dea1..54cb8589d4 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3487,7 +3487,7 @@ STR_5145 :Turbo Speed STR_5146 :Hyper Speed STR_5147 :Cheats STR_5148 :{SMALLFONT}{BLACK}Change the game speed -STR_5149 :{SMALLFONT}{BLACK}Open the cheats window +STR_5149 :{SMALLFONT}{BLACK}Show cheat options STR_5150 :Enable debugging tools STR_5151 :, STR_5152 :. @@ -3832,7 +3832,7 @@ STR_5490 :Disable audio on focus loss STR_5491 :Inventions list STR_5492 :Scenario options STR_5493 :Send Message -STR_5494 :Type the message you would like to send. +STR_5494 : STR_5495 :Player List STR_5496 :Player: STR_5497 :Ping: @@ -3842,3 +3842,4 @@ STR_5500 :Add Server STR_5501 :Start Server STR_5502 :Multiplayer STR_5503 :Enter hostname or IP address: +STR_5504 :{SMALLFONT}{BLACK}Show multiplayer status diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index f9cc1abcfb..352b9ef238 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1141,7 +1141,7 @@ enum { STR_RESEARCH_SCENERY_LABEL = 2273, STR_RESEARCH_SHOW_DETAILS_TIP = 2274, - STR_FINANCES_RESEARCH = 2275, + STR_FINANCES_RESEARCH_TIP = 2275, STR_RESEARCH_AND_DEVELOPMENT_TIP = 2276, STR_RESEARCH_UNKNOWN = 2277, @@ -1890,6 +1890,8 @@ enum { STR_RESEARCH_BUTTON_ON_TOOLBAR = 5121, STR_SELECT_BY_TRACK_TYPE = 5122, STR_CHEATS_BUTTON_ON_TOOLBAR = 5147, + STR_GAME_SPEED_TIP = 5148, + STR_CHEATS_TIP = 5149, STR_HARDWARE_DISPLAY = 5154, @@ -2031,7 +2033,6 @@ enum { STR_DEBUG_DROPDOWN_SCENARIO_OPTIONS = 5492, STR_SEND_MESSAGE = 5493, - STR_TYPE_THE_MESSAGE_YOU_WOULD_LIKE_TO_SEND = 5494, STR_PLAYER_LIST = 5495, STR_PLAYER = 5496, STR_PING = 5497, @@ -2042,6 +2043,8 @@ enum { STR_MULTIPLAYER = 5502, STR_ENTER_HOSTNAME_OR_IP_ADDRESS = 5503, + STR_SHOW_MULTIPLAYER_STATUS_TIP = 5504, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/sprites.h b/src/sprites.h index 67c8d71a4f..df08a21df1 100644 --- a/src/sprites.h +++ b/src/sprites.h @@ -64,6 +64,10 @@ enum { SPR_TESTING = 5181, SPR_TOGGLE_OPEN_CLOSE = 5182, + SPR_SHOW_GUESTS_THOUGHTS_ABOUT_THIS_RIDE_ATTRACTION = 5184, + SPR_SHOW_GUESTS_QUEUING_FOR_THIS_RIDE_ATTRACTION = 5185, + SPR_SHOW_GUESTS_ON_THIS_RIDE_ATTRACTION = 5186, + SPR_RIDE = 5187, SPR_TRACK_PEEP = 5188, SPR_SCENERY = 5189, diff --git a/src/windows/finances.c b/src/windows/finances.c index 14621678c1..b61e436346 100644 --- a/src/windows/finances.c +++ b/src/windows/finances.c @@ -94,7 +94,7 @@ static rct_widget window_finances_summary_widgets[] = { { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_FINANCES_SHOW_PARK_VALUE_TAB_TIP }, { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_FINANCES_SHOW_WEEKLY_PROFIT_TAB_TIP }, { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_FINANCES_SHOW_MARKETING_TAB_TIP }, - { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH }, + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH_TIP }, { WWT_SPINNER, 1, 64, 153, 229, 240, 1917, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 142, 152, 230, 234, STR_NUMERIC_UP, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 142, 152, 235, 239, STR_NUMERIC_DOWN, STR_NONE }, @@ -111,7 +111,7 @@ static rct_widget window_finances_cash_widgets[] = { { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_FINANCES_SHOW_PARK_VALUE_TAB_TIP }, { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_FINANCES_SHOW_WEEKLY_PROFIT_TAB_TIP }, { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_FINANCES_SHOW_MARKETING_TAB_TIP }, - { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH }, + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH_TIP }, { WIDGETS_END }, }; @@ -125,7 +125,7 @@ static rct_widget window_finances_park_value_widgets[] = { { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_FINANCES_SHOW_PARK_VALUE_TAB_TIP }, { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_FINANCES_SHOW_WEEKLY_PROFIT_TAB_TIP }, { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_FINANCES_SHOW_MARKETING_TAB_TIP }, - { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH }, + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH_TIP }, { WIDGETS_END }, }; @@ -139,7 +139,7 @@ static rct_widget window_finances_profit_widgets[] = { { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_FINANCES_SHOW_PARK_VALUE_TAB_TIP }, { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_FINANCES_SHOW_WEEKLY_PROFIT_TAB_TIP }, { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_FINANCES_SHOW_MARKETING_TAB_TIP }, - { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH }, + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH_TIP }, { WIDGETS_END }, }; @@ -153,7 +153,7 @@ static rct_widget window_finances_marketing_widgets[] = { { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_FINANCES_SHOW_PARK_VALUE_TAB_TIP }, { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_FINANCES_SHOW_WEEKLY_PROFIT_TAB_TIP }, { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_FINANCES_SHOW_MARKETING_TAB_TIP }, - { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH }, + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH_TIP }, { WWT_GROUPBOX, 2, 3, 526, 47, 91, STR_MARKETING_CAMPAIGNS_IN_OPERATION, STR_NONE }, { WWT_GROUPBOX, 2, 3, 526, 47, 252, STR_MARKETING_CAMPAIGNS_AVAILABLE, STR_NONE }, { WWT_IMGBTN, 1, 8, 521, 0, 11, 0xFFFFFFFF, STR_START_THIS_MARKETING_CAMPAIGN }, @@ -175,7 +175,7 @@ static rct_widget window_finances_research_widgets[] = { { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_FINANCES_SHOW_PARK_VALUE_TAB_TIP }, { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_FINANCES_SHOW_WEEKLY_PROFIT_TAB_TIP }, { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_FINANCES_SHOW_MARKETING_TAB_TIP }, - { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH }, + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH_TIP }, { WWT_GROUPBOX, 2, 3, 316, 47, 91, STR_RESEARCH_FUNDING_, STR_NONE }, { WWT_DROPDOWN, 2, 8, 167, 59, 70, 0xFFFFFFFF, STR_SELECT_LEVEL_OF_RESEARCH_AND_DEVELOPMENT }, { WWT_DROPDOWN_BUTTON, 2, 156, 166, 60, 69, 876, STR_SELECT_LEVEL_OF_RESEARCH_AND_DEVELOPMENT }, diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index 032df21a2c..c4fd258652 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -189,7 +189,7 @@ static rct_widget window_new_ride_widgets[] = { { WWT_GROUPBOX, 2, 3, 292, 47, 116, STR_CURRENTLY_IN_DEVELOPMENT, STR_NONE }, { WWT_GROUPBOX, 2, 3, 292, 124, 188, STR_LAST_DEVELOPMENT, STR_NONE }, { WWT_FLATBTN, 2, 265, 288, 161, 184, 0xFFFFFFFF, STR_RESEARCH_SHOW_DETAILS_TIP }, - { WWT_FLATBTN, 2, 265, 288, 68, 91, 5190, STR_FINANCES_RESEARCH }, + { WWT_FLATBTN, 2, 265, 288, 68, 91, 5190, STR_FINANCES_RESEARCH_TIP }, { WIDGETS_END }, }; diff --git a/src/windows/player_list.c b/src/windows/player_list.c index 538887d547..0556f55e53 100644 --- a/src/windows/player_list.c +++ b/src/windows/player_list.c @@ -23,6 +23,7 @@ #include "../interface/window.h" #include "../localisation/localisation.h" #include "../network/network.h" +#include "../sprites.h" enum WINDOW_PLAYER_LIST_WIDGET_IDX { WIDX_BACKGROUND, @@ -210,6 +211,8 @@ static void window_player_list_paint(rct_window *w, rct_drawpixelinfo *dpi) window_draw_widgets(w, dpi); gfx_draw_string_left(dpi, STR_PLAYER, w, w->colours[2], w->x + 6, 58 - 12 + w->y + 1); gfx_draw_string_left(dpi, STR_PING, w, w->colours[2], w->x + 246, 58 - 12 + w->y + 1); + + gfx_draw_sprite(dpi, SPR_TAB_GUESTS_0, w->x + w->widgets[WIDX_TAB1].left, w->y + w->widgets[WIDX_TAB1].top, 0); } static void window_player_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) diff --git a/src/windows/research.c b/src/windows/research.c index 5c4292e3b6..b888096b81 100644 --- a/src/windows/research.c +++ b/src/windows/research.c @@ -72,7 +72,7 @@ static rct_widget window_research_development_widgets[] = { { WWT_CLOSEBOX, 0, 287, 297, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, { WWT_RESIZE, 1, 0, 299, 43, 195, 0xFFFFFFFF, STR_NONE }, { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_RESEARCH_AND_DEVELOPMENT_TIP }, - { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH }, + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH_TIP }, { WWT_GROUPBOX, 2, 3, 292, 47, 116, STR_CURRENTLY_IN_DEVELOPMENT, STR_NONE }, { WWT_GROUPBOX, 2, 3, 292, 124, 188, STR_LAST_DEVELOPMENT, STR_NONE }, { WWT_FLATBTN, 2, 265, 288, 161, 184, 0xFFFFFFFF, STR_RESEARCH_SHOW_DETAILS_TIP }, @@ -85,7 +85,7 @@ static rct_widget window_research_funding_widgets[] = { { WWT_CLOSEBOX, 0, 307, 317, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, { WWT_RESIZE, 1, 0, 319, 43, 206, 0xFFFFFFFF, STR_NONE }, { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_RESEARCH_AND_DEVELOPMENT_TIP }, - { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH }, + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_FINANCES_RESEARCH_TIP }, { WWT_GROUPBOX, 2, 3, 316, 47, 91, STR_RESEARCH_FUNDING_, STR_NONE }, { WWT_DROPDOWN, 2, 8, 167, 59, 70, 0xFFFFFFFF, STR_SELECT_LEVEL_OF_RESEARCH_AND_DEVELOPMENT }, { WWT_DROPDOWN_BUTTON, 2, 156, 166, 60, 69, 876, STR_SELECT_LEVEL_OF_RESEARCH_AND_DEVELOPMENT }, diff --git a/src/windows/ride.c b/src/windows/ride.c index 96b1a2d869..008e4a7f3f 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -472,9 +472,9 @@ static rct_widget window_ride_customer_widgets[] = { { WWT_TAB, 1, 251, 281, 17, 43, 0x2000144E, STR_INCOME_AND_COSTS_TIP }, { WWT_TAB, 1, 282, 312, 17, 43, 0x2000144E, STR_CUSTOMER_INFORMATION_TIP }, - { WWT_FLATBTN, 1, 289, 312, 54, 77, 5184, STR_SHOW_GUESTS_THOUGHTS_ABOUT_THIS_RIDE_ATTRACTION_TIP }, - { WWT_FLATBTN, 1, 289, 312, 78, 101, 5186, STR_SHOW_GUESTS_ON_THIS_RIDE_ATTRACTION_TIP }, - { WWT_FLATBTN, 1, 289, 312, 102, 125, 5185, STR_SHOW_GUESTS_QUEUING_FOR_THIS_RIDE_ATTRACTION_TIP }, + { WWT_FLATBTN, 1, 289, 312, 54, 77, SPR_SHOW_GUESTS_THOUGHTS_ABOUT_THIS_RIDE_ATTRACTION, STR_SHOW_GUESTS_THOUGHTS_ABOUT_THIS_RIDE_ATTRACTION_TIP }, + { WWT_FLATBTN, 1, 289, 312, 78, 101, SPR_SHOW_GUESTS_ON_THIS_RIDE_ATTRACTION, STR_SHOW_GUESTS_ON_THIS_RIDE_ATTRACTION_TIP }, + { WWT_FLATBTN, 1, 289, 312, 102, 125, SPR_SHOW_GUESTS_QUEUING_FOR_THIS_RIDE_ATTRACTION, STR_SHOW_GUESTS_QUEUING_FOR_THIS_RIDE_ATTRACTION_TIP }, { WIDGETS_END }, }; diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 4c873ddb82..c3e726a280 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -31,6 +31,7 @@ #include "../interface/window.h" #include "../interface/viewport.h" #include "../localisation/localisation.h" +#include "../network/network.h" #include "../network/twitch.h" #include "../scenario.h" #include "../world/scenery.h" @@ -179,13 +180,13 @@ static rct_widget window_top_toolbar_widgets[] = { { WWT_TRNBTN, 3, 0x0230, 0x024D, 0, 27, 0x20000000 | SPR_TOOLBAR_GUESTS, STR_GUESTS_TIP }, // Guests { WWT_TRNBTN, 2, 0x0230, 0x024D, 0, 27, 0x20000000 | SPR_TOOLBAR_CLEAR_SCENERY, STR_CLEAR_SCENERY_TIP }, // Clear scenery - { WWT_TRNBTN, 0, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 5148 }, // Fast forward - { WWT_TRNBTN, 0, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 5149 }, // Cheats + { WWT_TRNBTN, 0, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_GAME_SPEED_TIP }, // Fast forward + { WWT_TRNBTN, 0, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_CHEATS_TIP }, // Cheats { WWT_TRNBTN, 0, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_DEBUG_TIP }, // Debug - { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 3235 }, // Finances - { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 2275 }, // Research + { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_SCENARIO_OPTIONS_FINANCIAL_TIP },// Finances + { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_FINANCES_RESEARCH_TIP }, // Research { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_SHOW_RECENT_MESSAGES_TIP }, // News - { WWT_TRNBTN, 1, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, 2276 }, // Network + { WWT_TRNBTN, 1, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_SHOW_MULTIPLAYER_STATUS_TIP }, // Network { WWT_EMPTY, 0, 0, 10-1, 0, 0, 0xFFFFFFFF, STR_NONE }, // Artificial widget separator { WIDGETS_END }, @@ -658,6 +659,9 @@ static void window_top_toolbar_invalidate(rct_window *w) if (!gConfigInterface.toolbar_show_news) window_top_toolbar_widgets[WIDX_NEWS].type = WWT_EMPTY; + + if (network_get_mode() == NETWORK_MODE_NONE) + window_top_toolbar_widgets[WIDX_NETWORK].type = WWT_EMPTY; } enabledWidgets = 0; @@ -824,6 +828,16 @@ static void window_top_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi) imgId = SPR_G2_TAB_NEWS; gfx_draw_sprite(dpi, imgId, x, y, 0); } + + // Draw network button + if (window_top_toolbar_widgets[WIDX_NETWORK].type != WWT_EMPTY) { + x = w->x + window_top_toolbar_widgets[WIDX_NETWORK].left + 3; + y = w->y + window_top_toolbar_widgets[WIDX_NETWORK].top + 0; + if (widget_is_pressed(w, WIDX_NETWORK)) + y++; + imgId = SPR_SHOW_GUESTS_ON_THIS_RIDE_ATTRACTION; + gfx_draw_sprite(dpi, imgId, x, y, 0); + } } /* rct2: 0x006E3158 */ From 7449deeffe36cfdb696616e59f038561e5581a1c Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 16 Aug 2015 15:31:59 +0200 Subject: [PATCH 0527/1173] Add console option to reset all user strings --- src/interface/console.c | 12 +++++++++++- src/localisation/user.c | 10 +++++++++- src/localisation/user.h | 21 +++++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 src/localisation/user.h diff --git a/src/interface/console.c b/src/interface/console.c index 30107c5762..4c6529ef03 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -4,6 +4,7 @@ #include "../addresses.h" #include "../drawing/drawing.h" #include "../localisation/localisation.h" +#include "../localisation/user.h" #include "../platform/platform.h" #include "../world/park.h" #include "../util/sawyercoding.h" @@ -816,6 +817,7 @@ static int cc_load_object(const utf8 **argv, int argc) { return 0; } + static int cc_object_count(const utf8 **argv, int argc) { const utf8* object_type_names[] = { "Rides", "Small scenery", "Large scenery", "Walls", "Banners", "Paths", "Path Additions", "Scenery groups", "Park entrances", "Water" }; for (int i = 0; i < 10; i++) { @@ -831,6 +833,13 @@ static int cc_object_count(const utf8 **argv, int argc) { return 0; } + +static int cc_reset_user_strings(const utf8 **argv, int argc) +{ + reset_user_strings(); + return 0; +} + static int cc_open(const utf8 **argv, int argc) { if (argc > 0) { bool title = (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) != 0; @@ -920,7 +929,8 @@ console_command console_command_table[] = { "This is a safer method opposed to \"open object_selection\".", "load_object " }, { "object_count", cc_object_count, "Shows the number of objects of each type in the scenario.", "object_count" }, - { "twitch", cc_twitch, "Twitch API" } + { "twitch", cc_twitch, "Twitch API" }, + { "reset_user_strings", cc_reset_user_strings, "Resets all user-defined strings, to fix incorrectly occurring 'Chosen name in use already' errors.", "reset_user_strings" } }; static int cc_windows(const utf8 **argv, int argc) { diff --git a/src/localisation/user.c b/src/localisation/user.c index e481edf0d1..08f9ac474f 100644 --- a/src/localisation/user.c +++ b/src/localisation/user.c @@ -89,4 +89,12 @@ static bool user_string_exists(const utf8 *text) bool is_user_string_id(rct_string_id stringId) { return stringId >= 0x8000 && stringId < 0x9000; -} \ No newline at end of file +} + +void reset_user_strings() +{ + char *userString = gUserStrings; + for (int i = 0; i < MAX_USER_STRINGS; i++, userString += USER_STRING_MAX_LENGTH) { + userString[0] = 0; + } +} diff --git a/src/localisation/user.h b/src/localisation/user.h new file mode 100644 index 0000000000..879c09ad49 --- /dev/null +++ b/src/localisation/user.h @@ -0,0 +1,21 @@ +/***************************************************************************** + * Copyright (c) 2015 Michael Steenbeek + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +void reset_user_strings(); From a3450a4bf8c31b7ff31023811d043004369f9da8 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 16 Aug 2015 11:42:41 +0100 Subject: [PATCH 0528/1173] add loading / saving of servers --- src/config.c | 9 ++- src/config.h | 6 ++ src/windows/server_list.c | 135 +++++++++++++++++++++++++++++++++++--- 3 files changed, 139 insertions(+), 11 deletions(-) diff --git a/src/config.c b/src/config.c index ea8dfefc7e..9e52f68dea 100644 --- a/src/config.c +++ b/src/config.c @@ -230,12 +230,18 @@ config_property_definition _twitchDefinitions[] = { { offsetof(twitch_configuration, enable_news), "news", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL } }; +config_property_definition _networkDefinitions[] = { + { offsetof(network_configuration, player_name), "player_name", CONFIG_VALUE_TYPE_STRING, {.value_string = "Player" }, NULL }, + { offsetof(network_configuration, default_port), "default_port", CONFIG_VALUE_TYPE_UINT32, true, NULL }, +}; + config_section_definition _sectionDefinitions[] = { { &gConfigGeneral, "general", _generalDefinitions, countof(_generalDefinitions) }, { &gConfigInterface, "interface", _interfaceDefinitions, countof(_interfaceDefinitions) }, { &gConfigSound, "sound", _soundDefinitions, countof(_soundDefinitions) }, { &gConfigCheat, "cheat", _cheatDefinitions, countof(_cheatDefinitions) }, - { &gConfigTwitch, "twitch", _twitchDefinitions, countof(_twitchDefinitions) } + { &gConfigTwitch, "twitch", _twitchDefinitions, countof(_twitchDefinitions) }, + { &gConfigNetwork, "network", _networkDefinitions, countof(_networkDefinitions) } }; #pragma endregion @@ -245,6 +251,7 @@ interface_configuration gConfigInterface; sound_configuration gConfigSound; cheat_configuration gConfigCheat; twitch_configuration gConfigTwitch; +network_configuration gConfigNetwork; themes_configuration gConfigThemes; title_sequences_configuration gConfigTitleSequences; diff --git a/src/config.h b/src/config.h index 46a23acb30..4ea4b14b03 100644 --- a/src/config.h +++ b/src/config.h @@ -204,6 +204,11 @@ typedef struct { uint8 enable_news; } twitch_configuration; +typedef struct { + utf8string player_name; + uint32 default_port; +} network_configuration; + typedef struct theme_window { uint8 colours[6]; @@ -274,6 +279,7 @@ extern interface_configuration gConfigInterface; extern sound_configuration gConfigSound; extern cheat_configuration gConfigCheat; extern twitch_configuration gConfigTwitch; +extern network_configuration gConfigNetwork; extern themes_configuration gConfigThemes; extern title_sequences_configuration gConfigTitleSequences; diff --git a/src/windows/server_list.c b/src/windows/server_list.c index c9716da512..e3215acac0 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -37,7 +37,7 @@ typedef struct { utf8 *description; } saved_server; -char _playerName[64] = "Player"; +char _playerName[64]; saved_server *_savedServers = NULL; int _numSavedServers = 0; @@ -67,6 +67,7 @@ static rct_widget window_server_list_widgets[] = { { WIDGETS_END }, }; +static void window_server_list_close(rct_window *w); static void window_server_list_mouseup(rct_window *w, int widgetIndex); static void window_server_list_resize(rct_window *w); static void window_server_list_update(rct_window *w); @@ -81,7 +82,7 @@ static void window_server_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi static void server_list_get_item_button(int buttonIndex, int x, int y, int width, int *outX, int *outY); static rct_window_event_list window_server_list_events = { - NULL, + window_server_list_close, window_server_list_mouseup, window_server_list_resize, NULL, @@ -113,6 +114,11 @@ static rct_window_event_list window_server_list_events = { static int _hoverButtonIndex = -1; +static void server_list_load_saved_servers(); +static void server_list_save_saved_servers(); +static void dispose_saved_server_list(); +static void dispose_saved_server(saved_server *serverInfo); + void window_server_list_open() { rct_window* window; @@ -148,17 +154,22 @@ void window_server_list_open() window_set_resize(window, WWIDTH_MIN, WHEIGHT_MIN, WWIDTH_MAX, WHEIGHT_MAX); - _numSavedServers = 2; - _savedServers = malloc(_numSavedServers * sizeof(saved_server)); - _savedServers[0].address = "127.0.0.1"; - _savedServers[0].name = "localhost"; - _savedServers[0].description = "Home sweet home."; - _savedServers[1].address = "81.124.111.146:12428"; - _savedServers[1].name = "Another server, #1"; - _savedServers[1].description = "Another server..."; + strncpy(_playerName, gConfigNetwork.player_name, sizeof(_playerName)); + + server_list_load_saved_servers(); window->no_list_items = _numSavedServers; } +static void window_server_list_close(rct_window *w) +{ + if (strlen(_playerName) > 0) { + SafeFree(gConfigNetwork.player_name); + gConfigNetwork.player_name = _strdup(_playerName); + config_save_default(); + } + dispose_saved_server_list(); +} + static void window_server_list_mouseup(rct_window *w, int widgetIndex) { switch (widgetIndex) { @@ -336,3 +347,107 @@ static void server_list_get_item_button(int buttonIndex, int x, int y, int width *outX = width - 3 - 36 - (30 * buttonIndex); *outY = y + 2; } + +static char *freadstralloc(FILE *file) +{ + int capacity = 64; + char *buffer = malloc(capacity); + + int length = 0; + int c; + for (;;) { + c = fgetc(file); + if (c == EOF) break; + if (c == 0) break; + + if (length > capacity) { + capacity *= 2; + buffer = realloc(buffer, capacity); + } + buffer[length] = c; + length++; + } + + buffer = realloc(buffer, length + 1); + buffer[length] = 0; + return buffer; +} + +static void server_list_load_saved_servers() +{ + utf8 path[MAX_PATH]; + FILE *file; + + platform_get_user_directory(path, NULL); + strcat(path, "servers.cfg"); + + file = fopen(path, "rb"); + if (file == NULL) { + return; + } + + dispose_saved_server_list(); + + // Read number of saved servers + fread(&_numSavedServers, sizeof(uint32), 1, file); + _savedServers = malloc(_numSavedServers * sizeof(saved_server)); + + // Load each saved server + for (int i = 0; i < _numSavedServers; i++) { + saved_server *serverInfo = &_savedServers[i]; + + serverInfo->address = freadstralloc(file); + serverInfo->name = freadstralloc(file); + serverInfo->description = freadstralloc(file); + } + + fclose(file); +} + +static void server_list_save_saved_servers() +{ + utf8 path[MAX_PATH]; + FILE *file; + + platform_get_user_directory(path, NULL); + strcat(path, "servers.cfg"); + + file = fopen(path, "wb"); + if (file == NULL) { + log_error("Unable to save servers."); + return; + } + + // Write number of saved servers + fwrite(&_numSavedServers, sizeof(uint32), 1, file); + + // Write each saved server + for (int i = 0; i < _numSavedServers; i++) { + saved_server *serverInfo = &_savedServers[i]; + + fwrite(serverInfo->address, strlen(serverInfo->address) + 1, 1, file); + fwrite(serverInfo->name, strlen(serverInfo->name) + 1, 1, file); + fwrite(serverInfo->description, strlen(serverInfo->description) + 1, 1, file); + } + + fclose(file); +} + +static void dispose_saved_server_list() +{ + if (_savedServers != NULL) { + for (int i = 0; i < _numSavedServers; i++) { + dispose_saved_server(&_savedServers[i]); + } + free(_savedServers); + _savedServers = NULL; + } + _numSavedServers = 0; +} + +static void dispose_saved_server(saved_server *serverInfo) +{ + SafeFree(serverInfo->address); + SafeFree(serverInfo->name); + SafeFree(serverInfo->description); +} From eeeb7927eb6355a2a9f89dd842d8676b9e180dad Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 16 Aug 2015 17:16:16 +0200 Subject: [PATCH 0529/1173] Reset ride names to their defaults when using reset_user_strings --- src/localisation/user.c | 4 ++++ src/ride/ride.c | 27 +++++++++++++++++++++++++++ src/ride/ride.h | 1 + 3 files changed, 32 insertions(+) diff --git a/src/localisation/user.c b/src/localisation/user.c index 08f9ac474f..0a61ccd1de 100644 --- a/src/localisation/user.c +++ b/src/localisation/user.c @@ -20,6 +20,7 @@ #include "../addresses.h" #include "localisation.h" +#include "../ride/ride.h" utf8 *gUserStrings = (char*)0x0135A8F4; @@ -94,7 +95,10 @@ bool is_user_string_id(rct_string_id stringId) void reset_user_strings() { char *userString = gUserStrings; + for (int i = 0; i < MAX_USER_STRINGS; i++, userString += USER_STRING_MAX_LENGTH) { userString[0] = 0; } + + ride_reset_all_names(); } diff --git a/src/ride/ride.c b/src/ride/ride.c index df2c889005..7f37e4be6b 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -6643,3 +6643,30 @@ bool shop_item_is_food_or_drink(int shopItem) return false; } } + +void ride_reset_all_names() +{ + int i; + rct_ride *ride; + char rideNameBuffer[256]; + + FOR_ALL_RIDES(i, ride) + { + ride->name = STR_NONE; + + struct { + uint16 type_name; + uint16 number; + } name_args; + name_args.type_name = 2 + ride->type; + name_args.number = 0; + do { + name_args.number++; + format_string(rideNameBuffer, 1, &name_args); + } while (ride_name_exists(rideNameBuffer)); + + ride->name = 1; + ride->name_arguments_type_name = name_args.type_name; + ride->name_arguments_number = name_args.number; + } +} diff --git a/src/ride/ride.h b/src/ride/ride.h index 4539de5f40..0bdc574eb6 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -1034,5 +1034,6 @@ bool ride_type_is_intamin(int rideType); void sub_6C94D8(); bool shop_item_is_food_or_drink(int shopItem); +void ride_reset_all_names(); #endif From 094cc194113ed5ca2037c0d76f7c8f424987bb75 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 16 Aug 2015 16:36:57 +0100 Subject: [PATCH 0530/1173] allow joining of servers in server list window --- data/language/english_uk.txt | 1 + src/config.c | 9 +- src/drawing/string.c | 2 + src/interface/window.h | 5 +- src/localisation/string_ids.h | 1 + src/network/network.cpp | 5 +- src/windows/loadsave.c | 174 +++++++++++++++++----------------- src/windows/server_list.c | 122 ++++++++++++++++++++---- 8 files changed, 205 insertions(+), 114 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 54cb8589d4..975d04a36f 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3843,3 +3843,4 @@ STR_5501 :Start Server STR_5502 :Multiplayer STR_5503 :Enter hostname or IP address: STR_5504 :{SMALLFONT}{BLACK}Show multiplayer status +STR_5505 :Unable to connect to server. diff --git a/src/config.c b/src/config.c index 9e52f68dea..26f9f401a6 100644 --- a/src/config.c +++ b/src/config.c @@ -20,12 +20,13 @@ #include "addresses.h" #include "config.h" +#include "interface/themes.h" +#include "interface/title_sequences.h" #include "localisation/language.h" #include "localisation/localisation.h" -#include "util/util.h" -#include "interface/themes.h" +#include "network/network.h" #include "openrct2.h" -#include "interface/title_sequences.h" +#include "util/util.h" // Magic number for original game cfg file static const int MagicNumber = 0x0003113A; @@ -232,7 +233,7 @@ config_property_definition _twitchDefinitions[] = { config_property_definition _networkDefinitions[] = { { offsetof(network_configuration, player_name), "player_name", CONFIG_VALUE_TYPE_STRING, {.value_string = "Player" }, NULL }, - { offsetof(network_configuration, default_port), "default_port", CONFIG_VALUE_TYPE_UINT32, true, NULL }, + { offsetof(network_configuration, default_port), "default_port", CONFIG_VALUE_TYPE_UINT32, NETWORK_DEFAULT_PORT, NULL }, }; config_section_definition _sectionDefinitions[] = { diff --git a/src/drawing/string.c b/src/drawing/string.c index d42b7a6a00..e495959634 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -1268,6 +1268,8 @@ static void ttf_process_initial_colour(int colour, text_draw_info *info) static void ttf_draw_string(rct_drawpixelinfo *dpi, char *text, int colour, int x, int y) { + if (text == NULL) return; + text_draw_info info; info.font_sprite_base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); info.flags = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); diff --git a/src/interface/window.h b/src/interface/window.h index a60cace19f..b856ae8611 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -472,6 +472,7 @@ typedef enum { BTM_TB_DIRTY_FLAG_PARK_RATING = (1 << 4) } BTM_TOOLBAR_DIRTY_FLAGS; +// 000N_TTTL enum { LOADSAVETYPE_LOAD = 0 << 0, LOADSAVETYPE_SAVE = 1 << 0, @@ -479,7 +480,9 @@ enum { LOADSAVETYPE_GAME = 0 << 1, LOADSAVETYPE_LANDSCAPE = 1 << 1, LOADSAVETYPE_SCENARIO = 2 << 1, - LOADSAVETYPE_TRACK = 3 << 1 + LOADSAVETYPE_TRACK = 3 << 1, + + LOADSAVETYPE_NETWORK = 1 << 4, }; extern bool gLoadSaveTitleSequenceSave; diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 352b9ef238..c2d0b7e7fb 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2044,6 +2044,7 @@ enum { STR_ENTER_HOSTNAME_OR_IP_ADDRESS = 5503, STR_SHOW_MULTIPLAYER_STATUS_TIP = 5504, + STR_UNABLE_TO_CONNECT_TO_SERVER = 5505, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/network/network.cpp b/src/network/network.cpp index ab3696eca8..b1cc1e0606 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -26,6 +26,7 @@ #include "network.h" extern "C" { #include "../addresses.h" +#include "../config.h" #include "../game.h" #include "../interface/chat.h" #include "../interface/window.h" @@ -301,7 +302,7 @@ bool Network::BeginClient(const char* host, unsigned short port) server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (server_socket == INVALID_SOCKET) { log_error("Unable to create socket."); - return 0; + return false; } SOCKADDR_IN server_address; @@ -326,7 +327,7 @@ bool Network::BeginClient(const char* host, unsigned short port) mode = NETWORK_MODE_CLIENT; - Client_Send_AUTH(OPENRCT2_VERSION, "Player", ""); + Client_Send_AUTH(OPENRCT2_VERSION, gConfigNetwork.player_name, ""); return true; } diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index ca0ccc0315..504306ff34 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -162,7 +162,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) } _loadsaveType = type; - switch (type) { + switch (type & 0x0F) { case (LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME): w->widgets[WIDX_TITLE].image = STR_LOAD_GAME; break; @@ -186,8 +186,8 @@ rct_window *window_loadsave_open(int type, char *defaultName) w->no_list_items = 0; w->selected_list_item = -1; - includeNewItem = (type & 1) == LOADSAVETYPE_SAVE; - switch (type & 6) { + includeNewItem = (type & 0x01) == LOADSAVETYPE_SAVE; + switch (type & 0x0E) { case LOADSAVETYPE_GAME: platform_get_user_directory(path, "save"); if (!platform_ensure_directory_exists(path)) { @@ -383,7 +383,7 @@ static void window_loadsave_scrollmousedown(rct_window *w, int scrollIndex, int } else { // TYPE_FILE // Load or overwrite - if ((_loadsaveType & 1) == LOADSAVETYPE_SAVE) + if ((_loadsaveType & 0x01) == LOADSAVETYPE_SAVE) window_overwrite_prompt_open(_listItems[selectedItem].name, _listItems[selectedItem].path); else window_loadsave_select(w, _listItems[selectedItem].path); @@ -730,103 +730,103 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co static void window_loadsave_select(rct_window *w, const char *path) { SDL_RWops* rw; - switch (_loadsaveType) { + switch (_loadsaveType & 0x0E) { case (LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME) : - if (gLoadSaveTitleSequenceSave) { - utf8 newName[MAX_PATH]; - char *extension = (char*)path_get_extension(path_get_filename(path)); - strcpy(newName, path_get_filename(path)); - if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) - strcat(newName, ".sv6"); - if (title_sequence_save_exists(gCurrentTitleSequence, newName)) { - RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&_listItems[w->selected_list_item].name; - window_text_input_open(w, WIDX_SCROLL, 5435, 5404, 1170, (uint32)_listItems[w->selected_list_item].name, TITLE_SEQUENCE_MAX_SAVE_LENGTH - 1); - } - else { - title_sequence_add_save(gCurrentTitleSequence, path, newName); - window_close(w); - } - } - else if (game_load_save(path)) { - window_close(w); - gfx_invalidate_screen(); - rct2_endupdate(); + if (gLoadSaveTitleSequenceSave) { + utf8 newName[MAX_PATH]; + char *extension = (char*)path_get_extension(path_get_filename(path)); + strcpy(newName, path_get_filename(path)); + if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) + strcat(newName, ".sv6"); + if (title_sequence_save_exists(gCurrentTitleSequence, newName)) { + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&_listItems[w->selected_list_item].name; + window_text_input_open(w, WIDX_SCROLL, 5435, 5404, 1170, (uint32)_listItems[w->selected_list_item].name, TITLE_SEQUENCE_MAX_SAVE_LENGTH - 1); } else { - // 1050, not the best message... - window_error_open(STR_LOAD_GAME, 1050); + title_sequence_add_save(gCurrentTitleSequence, path, newName); + window_close(w); } - break; - case (LOADSAVETYPE_SAVE | LOADSAVETYPE_GAME) : - rw = platform_sdl_rwfromfile(path, "wb+"); - if (rw != NULL) { - int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 1 : 0); - SDL_RWclose(rw); - if (success) { - window_close_by_class(WC_LOADSAVE); - game_do_command(0, 1047, 0, -1, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); - gfx_invalidate_screen(); - } else { - window_error_open(STR_SAVE_GAME, 1047); - } + } + else if (game_load_save(path)) { + window_close(w); + gfx_invalidate_screen(); + rct2_endupdate(); + } + else { + // 1050, not the best message... + window_error_open(STR_LOAD_GAME, 1050); + } + break; + case (LOADSAVETYPE_SAVE | LOADSAVETYPE_GAME) : + rw = platform_sdl_rwfromfile(path, "wb+"); + if (rw != NULL) { + int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 1 : 0); + SDL_RWclose(rw); + if (success) { + window_close_by_class(WC_LOADSAVE); + game_do_command(0, 1047, 0, -1, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); + gfx_invalidate_screen(); } else { window_error_open(STR_SAVE_GAME, 1047); } - break; - case (LOADSAVETYPE_LOAD | LOADSAVETYPE_LANDSCAPE) : - editor_load_landscape(path); - if (1) { + } else { + window_error_open(STR_SAVE_GAME, 1047); + } + break; + case (LOADSAVETYPE_LOAD | LOADSAVETYPE_LANDSCAPE) : + editor_load_landscape(path); + if (1) { + gfx_invalidate_screen(); + rct2_endupdate(); + } + else { + // 1050, not the best message... + window_error_open(STR_LOAD_LANDSCAPE, 1050); + } + break; + case (LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE) : + rw = platform_sdl_rwfromfile(path, "wb+"); + if (rw != NULL) { + int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); + SDL_RWclose(rw); + if (success) { + window_close_by_class(WC_LOADSAVE); gfx_invalidate_screen(); - rct2_endupdate(); - } - else { - // 1050, not the best message... - window_error_open(STR_LOAD_LANDSCAPE, 1050); - } - break; - case (LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE) : - rw = platform_sdl_rwfromfile(path, "wb+"); - if (rw != NULL) { - int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); - SDL_RWclose(rw); - if (success) { - window_close_by_class(WC_LOADSAVE); - gfx_invalidate_screen(); - } else { - window_error_open(STR_SAVE_LANDSCAPE, 1049); - } } else { window_error_open(STR_SAVE_LANDSCAPE, 1049); } - break; - case (LOADSAVETYPE_SAVE | LOADSAVETYPE_SCENARIO) : - { - rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; - int parkFlagsBackup = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32); - RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_18; - s6Info->var_000 = 255; - rw = platform_sdl_rwfromfile(path, "wb+"); - int success = 0; - if (rw != NULL) { - success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); - SDL_RWclose(rw); - } - RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) = parkFlagsBackup; - - if (success) { - window_close_by_class(WC_LOADSAVE); - title_load(); - } else { - window_error_open(STR_SAVE_SCENARIO, STR_SCENARIO_SAVE_FAILED); - s6Info->var_000 = 4; - } + } else { + window_error_open(STR_SAVE_LANDSCAPE, 1049); } break; - case (LOADSAVETYPE_LOAD | LOADSAVETYPE_TRACK) : - window_install_track_open(path); - window_close_by_class(WC_LOADSAVE); - break; + case (LOADSAVETYPE_SAVE | LOADSAVETYPE_SCENARIO) : + { + rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; + int parkFlagsBackup = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32); + RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_18; + s6Info->var_000 = 255; + rw = platform_sdl_rwfromfile(path, "wb+"); + int success = 0; + if (rw != NULL) { + success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); + SDL_RWclose(rw); } + RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) = parkFlagsBackup; + + if (success) { + window_close_by_class(WC_LOADSAVE); + title_load(); + } else { + window_error_open(STR_SAVE_SCENARIO, STR_SCENARIO_SAVE_FAILED); + s6Info->var_000 = 4; + } + break; + } + case (LOADSAVETYPE_LOAD | LOADSAVETYPE_TRACK) : + window_install_track_open(path); + window_close_by_class(WC_LOADSAVE); + break; + } } #pragma region Overwrite prompt diff --git a/src/windows/server_list.c b/src/windows/server_list.c index e3215acac0..bfb5b3465c 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -24,6 +24,7 @@ #include "../localisation/localisation.h" #include "../network/network.h" #include "../sprites.h" +#include "error.h" #define WWIDTH_MIN 500 #define WHEIGHT_MIN 300 @@ -79,8 +80,6 @@ static void window_server_list_invalidate(rct_window *w); static void window_server_list_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_server_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); -static void server_list_get_item_button(int buttonIndex, int x, int y, int width, int *outX, int *outY); - static rct_window_event_list window_server_list_events = { window_server_list_close, window_server_list_mouseup, @@ -114,10 +113,15 @@ static rct_window_event_list window_server_list_events = { static int _hoverButtonIndex = -1; +static void server_list_get_item_button(int buttonIndex, int x, int y, int width, int *outX, int *outY); +static void server_list_update_player_name(rct_window *w); static void server_list_load_saved_servers(); static void server_list_save_saved_servers(); static void dispose_saved_server_list(); static void dispose_saved_server(saved_server *serverInfo); +static void add_saved_server(char *address); +static void remove_saved_server(int index); +static void join_server(char *address, bool spectate); void window_server_list_open() { @@ -162,11 +166,7 @@ void window_server_list_open() static void window_server_list_close(rct_window *w) { - if (strlen(_playerName) > 0) { - SafeFree(gConfigNetwork.player_name); - gConfigNetwork.player_name = _strdup(_playerName); - config_save_default(); - } + server_list_update_player_name(w); dispose_saved_server_list(); } @@ -182,6 +182,9 @@ static void window_server_list_mouseup(rct_window *w, int widgetIndex) case WIDX_ADD_SERVER: window_text_input_open(w, widgetIndex, STR_ADD_SERVER, STR_ENTER_HOSTNAME_OR_IP_ADDRESS, STR_NONE, 0, 128); break; + case WIDX_START_SERVER: + window_loadsave_open(LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME | LOADSAVETYPE_NETWORK, NULL); + break; } } @@ -206,15 +209,23 @@ static void window_server_list_scroll_getsize(rct_window *w, int scrollIndex, in static void window_server_list_scroll_mousedown(rct_window *w, int scrollIndex, int x, int y) { - if (w->selected_list_item == -1) return; + int serverIndex = w->selected_list_item; + if (serverIndex < 0) return; + if (serverIndex >= _numSavedServers) return; + + char *serverAddress = _savedServers[serverIndex].address; switch (_hoverButtonIndex) { case WIDX_LIST_REMOVE: + remove_saved_server(serverIndex); + w->no_list_items = _numSavedServers; + window_invalidate(w); break; case WIDX_LIST_SPECTATE: + join_server(serverAddress, true); break; default: - // Join + join_server(serverAddress, false); break; } } @@ -251,20 +262,29 @@ static void window_server_list_scroll_mouseover(rct_window *w, int scrollIndex, static void window_server_list_textinput(rct_window *w, int widgetIndex, char *text) { - if (widgetIndex != WIDX_PLAYER_NAME_INPUT || text == NULL) - return; + if (text == NULL || text[0] == 0) return; - if (strcmp(_playerName, text) == 0) - return; + switch (widgetIndex) { + case WIDX_PLAYER_NAME_INPUT: + if (strcmp(_playerName, text) == 0) + return; - if (strlen(text) == 0) { - memset(_playerName, 0, sizeof(_playerName)); - } else { - memset(_playerName, 0, sizeof(_playerName)); - strcpy(_playerName, text); + if (strlen(text) == 0) { + memset(_playerName, 0, sizeof(_playerName)); + } else { + memset(_playerName, 0, sizeof(_playerName)); + strcpy(_playerName, text); + } + + widget_invalidate(w, WIDX_PLAYER_NAME_INPUT); + break; + + case WIDX_ADD_SERVER: + add_saved_server(text); + w->no_list_items = _numSavedServers; + window_invalidate(w); + break; } - - widget_invalidate(w, WIDX_PLAYER_NAME_INPUT); } static void window_server_list_invalidate(rct_window *w) @@ -348,6 +368,15 @@ static void server_list_get_item_button(int buttonIndex, int x, int y, int width *outY = y + 2; } +static void server_list_update_player_name(rct_window *w) +{ + if (strlen(_playerName) > 0) { + SafeFree(gConfigNetwork.player_name); + gConfigNetwork.player_name = _strdup(_playerName); + config_save_default(); + } +} + static char *freadstralloc(FILE *file) { int capacity = 64; @@ -451,3 +480,56 @@ static void dispose_saved_server(saved_server *serverInfo) SafeFree(serverInfo->name); SafeFree(serverInfo->description); } + +static void add_saved_server(char *address) +{ + _numSavedServers++; + if (_savedServers == NULL) { + _savedServers = malloc(_numSavedServers * sizeof(saved_server)); + } else { + _savedServers = realloc(_savedServers, _numSavedServers * sizeof(saved_server)); + } + + int index = _numSavedServers - 1; + _savedServers[index].address = _strdup(address); + _savedServers[index].name = _strdup(address); + _savedServers[index].description = NULL; +} + +static void remove_saved_server(int index) +{ + if (_numSavedServers <= index) return; + + int serversToMove = _numSavedServers - index - 1; + memmove(&_savedServers[index], &_savedServers[index + 1], serversToMove * sizeof(saved_server)); + + _numSavedServers--; + _savedServers = realloc(_savedServers, _numSavedServers * sizeof(saved_server)); +} + +static char *substr(char *start, int length) +{ + char *result = malloc(length + 1); + memcpy(result, start, length); + result[length] = 0; + return result; +} + +static void join_server(char *address, bool spectate) +{ + int port = gConfigNetwork.default_port; + + char *colon = strchr(address, ':'); + if (colon != NULL) { + address = substr(address, colon - address); + sscanf(colon + 1, "%d", &port); + } + + if (!network_begin_client(address, port)) { + window_error_open(STR_UNABLE_TO_CONNECT_TO_SERVER, STR_NONE); + } + + if (colon != NULL) { + free(address); + } +} From 4f8e289e795b9ce88b47e4e1fc761270fd4b9466 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 16 Aug 2015 17:29:47 +0100 Subject: [PATCH 0531/1173] finish server list and fix a couple of multiplayer issues --- projects/openrct2.vcxproj.user | 3 +- src/game.c | 2 + src/interface/window.h | 1 + src/network/network.cpp | 84 ++++++++++++++++++++++++++-------- src/network/network.h | 6 +++ src/openrct2.c | 6 ++- src/windows/loadsave.c | 5 ++ src/windows/network_status.c | 5 ++ src/windows/top_toolbar.c | 11 ++++- 9 files changed, 101 insertions(+), 22 deletions(-) diff --git a/projects/openrct2.vcxproj.user b/projects/openrct2.vcxproj.user index 96c90432a6..60b61f231a 100644 --- a/projects/openrct2.vcxproj.user +++ b/projects/openrct2.vcxproj.user @@ -24,6 +24,7 @@ $(TargetDir)\openrct2.exe WindowsLocalDebugger $(TargetDir) - --server 127.0.0.1 --port 12345 + + \ No newline at end of file diff --git a/src/game.c b/src/game.c index af06998e03..f4167d48d4 100644 --- a/src/game.c +++ b/src/game.c @@ -380,6 +380,8 @@ void game_logic_update() window_error_open(title_text, body_text); } + + network_tick(); } /** diff --git a/src/interface/window.h b/src/interface/window.h index b856ae8611..5b5af29019 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -619,6 +619,7 @@ void window_sign_small_open(rct_windownumber number); void window_cheats_open(); void window_player_list_open(); void window_network_status_open(const char* text); +void window_network_status_close(); void window_server_list_open(); void window_research_open(); diff --git a/src/network/network.cpp b/src/network/network.cpp index b1cc1e0606..4645a0caae 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -55,6 +55,7 @@ enum { NETWORK_COMMAND_PLAYERLIST, NETWORK_COMMAND_PING, NETWORK_COMMAND_PINGLIST, + NETWORK_COMMAND_READY, NETWORK_COMMAND_MAX }; @@ -67,6 +68,7 @@ const char *NetworkCommandNames[] = { "NETWORK_COMMAND_PLAYERLIST", "NETWORK_COMMAND_PING", "NETWORK_COMMAND_PINGLIST", + "NETWORK_COMMAND_READY", }; NetworkPacket::NetworkPacket() @@ -248,6 +250,7 @@ Network::Network() server_command_handlers[NETWORK_COMMAND_CHAT] = &Network::Server_Handle_CHAT; server_command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::Server_Handle_GAMECMD; server_command_handlers[NETWORK_COMMAND_PING] = &Network::Server_Handle_PING; + server_command_handlers[NETWORK_COMMAND_READY] = &Network::Server_Handle_READY; } Network::~Network() @@ -406,12 +409,7 @@ uint8 Network::GetPlayerID() void Network::Update() { - if (GetMode() == NETWORK_MODE_NONE) - return; - switch (GetMode()) { - case NETWORK_MODE_NONE: - return; case NETWORK_MODE_SERVER: UpdateServer(); break; @@ -466,16 +464,36 @@ void Network::UpdateClient() { if (!ProcessConnection(server_connection)) { Close(); - } else { - ProcessGameCommandQueue(); - if (CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { - if (server_srand0_tick == 0) { - // printf("SRAND OK!\n"); - } - } else { - window_network_status_open("Network desync detected"); - Close(); + } +} + +void Network::UpdateTick() +{ + switch (GetMode()) { + case NETWORK_MODE_SERVER: + UpdateServerTick(); + break; + case NETWORK_MODE_CLIENT: + UpdateClientTick(); + break; + } +} + +void Network::UpdateServerTick() +{ + +} + +void Network::UpdateClientTick() +{ + ProcessGameCommandQueue(); + if (CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { + if (server_srand0_tick == 0) { + // printf("SRAND OK!\n"); } + } else { + window_network_status_open("Network desync detected"); + Close(); } } @@ -636,6 +654,13 @@ void Network::Server_Send_PINGLIST() SendPacketToClients(*packet); } +void Network::Client_Send_READY() +{ + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); + *packet << (uint32)NETWORK_COMMAND_READY; + server_connection.QueuePacket(std::move(packet)); +} + bool Network::ProcessConnection(NetworkConnection& connection) { int packetStatus; @@ -830,15 +855,20 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac window_network_status_open(status); memcpy(&chunk_buffer[offset], (void*)packet.Read(chunksize), chunksize); if (offset + chunksize == size) { + window_network_status_close(); + SDL_RWops* rw = SDL_RWFromMem(&chunk_buffer[0], size); if (game_load_network(rw)) { game_load_init(); - if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) & 1) + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0) { pause_toggle(); + } game_command_queue.clear(); server_tick = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); server_srand0_tick = 0; - window_network_status_open("Loaded new map from network"); + + Client_Send_READY(); + // window_network_status_open("Loaded new map from network"); } SDL_RWclose(rw); } @@ -873,8 +903,13 @@ int Network::Client_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& uint8 playerid; uint8 callback; packet >> tick >> args[0] >> args[1] >> args[2] >> args[3] >> args[4] >> args[5] >> args[6] >> playerid >> callback; - GameCommand gc = GameCommand(tick, args, playerid, callback); - game_command_queue.insert(gc); + + if (args[4] == GAME_COMMAND_TOGGLE_PAUSE) { + pause_toggle(); + } else { + GameCommand gc = GameCommand(tick, args, playerid, callback); + game_command_queue.insert(gc); + } return 1; } @@ -956,6 +991,14 @@ int Network::Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket return 1; } +int Network::Server_Handle_READY(NetworkConnection& connection, NetworkPacket& packet) +{ + if (!was_paused_before_client_connected) { + game_do_command(0, 1, 0, 0, GAME_COMMAND_TOGGLE_PAUSE, 0, 0); + } + return 1; +} + int network_init() { return gNetwork.Init(); @@ -981,6 +1024,11 @@ void network_update() gNetwork.Update(); } +void network_tick() +{ + gNetwork.UpdateTick(); +} + int network_get_mode() { return gNetwork.GetMode(); diff --git a/src/network/network.h b/src/network/network.h index 17dc74a497..d3fb166cac 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -132,6 +132,7 @@ public: uint32 GetServerTick(); uint8 GetPlayerID(); void Update(); + void UpdateTick(); NetworkPlayer* GetPlayerByID(int id); const char* FormatChat(NetworkPlayer* fromplayer, const char* text); void SendPacketToClients(NetworkPacket& packet); @@ -148,6 +149,7 @@ public: void Client_Send_PING(); void Server_Send_PING(); void Server_Send_PINGLIST(); + void Client_Send_READY(); std::vector> player_list; @@ -192,6 +194,8 @@ private: void UpdateServer(); void UpdateClient(); + void UpdateServerTick(); + void UpdateClientTick(); private: std::vector client_command_handlers; @@ -208,6 +212,7 @@ private: int Client_Handle_PING(NetworkConnection& connection, NetworkPacket& packet); int Server_Handle_PING(NetworkConnection& connection, NetworkPacket& packet); int Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket& packet); + int Server_Handle_READY(NetworkConnection& connection, NetworkPacket& packet); }; extern "C" { @@ -219,6 +224,7 @@ int network_begin_client(const char *host, int port); int network_begin_server(int port); void network_update(); +void network_tick(); int network_get_mode(); int network_get_authstatus(); uint32 network_get_server_tick(); diff --git a/src/openrct2.c b/src/openrct2.c index 02d96a5f1e..14e8aae5d3 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -244,6 +244,10 @@ void openrct2_launch() rct2_open_file(gOpenRCT2StartupActionPath); RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_PLAYING; + + if (gNetworkStart == NETWORK_MODE_SERVER) { + network_begin_server(gNetworkStartPort); + } break; case STARTUP_ACTION_EDIT: if (strlen(gOpenRCT2StartupActionPath) == 0) { @@ -256,8 +260,6 @@ void openrct2_launch() if (gNetworkStart == NETWORK_MODE_CLIENT) { network_begin_client(gNetworkStartHost, gNetworkStartPort); - } else if (gNetworkStart == NETWORK_MODE_SERVER) { - network_begin_server(gNetworkStartPort); } openrct2_loop(); diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 504306ff34..368a4fbfe4 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -26,6 +26,7 @@ #include "../interface/widget.h" #include "../interface/window.h" #include "../localisation/localisation.h" +#include "../network/network.h" #include "../scenario.h" #include "../title.h" #include "../windows/error.h" @@ -748,6 +749,10 @@ static void window_loadsave_select(rct_window *w, const char *path) } } else if (game_load_save(path)) { + if (_loadsaveType & LOADSAVETYPE_NETWORK) { + network_begin_server(gConfigNetwork.default_port); + } + window_close(w); gfx_invalidate_screen(); rct2_endupdate(); diff --git a/src/windows/network_status.c b/src/windows/network_status.c index d2f49888a1..813e7e9620 100644 --- a/src/windows/network_status.c +++ b/src/windows/network_status.c @@ -106,6 +106,11 @@ void window_network_status_open(const char* text) window->colours[2] = 7; } +void window_network_status_close() +{ + window_close_by_class(WC_NETWORK_STATUS); +} + static void window_network_status_mouseup(rct_window *w, int widgetIndex) { switch (widgetIndex) { diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index c3e726a280..6c93cb0e0f 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -660,8 +660,17 @@ static void window_top_toolbar_invalidate(rct_window *w) if (!gConfigInterface.toolbar_show_news) window_top_toolbar_widgets[WIDX_NEWS].type = WWT_EMPTY; - if (network_get_mode() == NETWORK_MODE_NONE) + switch (network_get_mode()) { + case NETWORK_MODE_SERVER: + window_top_toolbar_widgets[WIDX_FASTFORWARD].type = WWT_EMPTY; + break; + case NETWORK_MODE_CLIENT: + window_top_toolbar_widgets[WIDX_PAUSE].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_FASTFORWARD].type = WWT_EMPTY; + break; + default: window_top_toolbar_widgets[WIDX_NETWORK].type = WWT_EMPTY; + } } enabledWidgets = 0; From ca1a1e0ddd31e212e834ae558e294e475092d0cb Mon Sep 17 00:00:00 2001 From: medsouz Date: Sun, 16 Aug 2015 13:05:49 -0400 Subject: [PATCH 0532/1173] Document various memory addresses --- src/addresses.h | 9 +++++++++ src/editor.c | 12 ++++++------ src/game.c | 23 ++++++++++++----------- src/scenario.c | 4 ++-- src/title.c | 18 +++++++++--------- src/windows/map.c | 2 +- src/windows/save_prompt.c | 4 ++-- 7 files changed, 41 insertions(+), 31 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 7254456cc2..1cc739446e 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -75,6 +75,10 @@ // When all sounds reversed replace with gConfigSound.ride_music #define RCT2_ADDRESS_CONFIG_MUSIC 0x009AAC72 +// Is supposed to be set to 0 whenever the screen resolution is changed +// it will then count up 255 ticks before saving the config +// In OpenRCT2 this value is only set to 0 on startup +#define RCT2_ADDRESS_CONFIG_SAVE_TIMER 0x009AAC73 #define RCT2_ADDRESS_CONFIG_FLAGS 0x009AAC74 // MAX vehicle sounds not used anymore @@ -228,6 +232,8 @@ #define RCT2_ADDRESS_MAP_ARROW_Z 0x009DEA4C #define RCT2_ADDRESS_MAP_ARROW_DIRECTION 0x009DEA4E +//Counts how many ticks the current screen has been open for +#define RCT2_ADDRESS_SCREEN_AGE 0x009DEA66 #define RCT2_ADDRESS_SCREEN_FLAGS 0x009DEA68 #define RCT2_ADDRESS_SCREENSHOT_COUNTDOWN 0x009DEA6D // Note: not only the zeroth bit can be set to control pause @@ -456,6 +462,9 @@ #define RCT2_ADDRESS_RIDE_LIST 0x013628F8 #define RCT2_ADDRESS_RIDE_COUNT 0x013587C8 #define RCT2_ADDRESS_RIDE_FLAGS 0x0097CF40 + +//How many ticks the scenario has existed for +#define RCT2_ADDRESS_SAVED_AGE 0x01388698 #define RCT2_ADDRESS_SAVED_VIEW_X 0x0138869A #define RCT2_ADDRESS_SAVED_VIEW_Y 0x0138869C #define RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION 0x0138869E diff --git a/src/editor.c b/src/editor.c index 193f393900..d13386693c 100644 --- a/src/editor.c +++ b/src/editor.c @@ -88,7 +88,7 @@ void editor_load() mainWindow->flags &= ~WF_SCROLLING_TO_LOCATION; load_palette(); gfx_invalidate_screen(); - RCT2_GLOBAL(0x009DEA66, sint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, sint16) = 0; strcpy((char*)RCT2_ADDRESS_SCENARIO_NAME, language_get_string(2749)); } @@ -166,7 +166,7 @@ void editor_convert_save_to_scenario() news_item_init_queue(); window_editor_main_open(); editor_finalise_main_view(); - RCT2_GLOBAL(0x009DEA66, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) = 0; } /** @@ -203,7 +203,7 @@ void trackdesigner_load() mainWindow->flags &= ~WF_SCROLLING_TO_LOCATION; load_palette(); gfx_invalidate_screen(); - RCT2_GLOBAL(0x009DEA66, sint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, sint16) = 0; } /** @@ -240,7 +240,7 @@ void trackmanager_load() mainWindow->flags &= ~WF_SCROLLING_TO_LOCATION; load_palette(); gfx_invalidate_screen(); - RCT2_GLOBAL(0x009DEA66, sint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, sint16) = 0; } /** @@ -295,7 +295,7 @@ static int editor_load_landscape_from_sv4(const char *path) rct1_fix_landscape(); editor_finalise_main_view(); - RCT2_GLOBAL(0x009DEA66, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) = 0; return 1; } @@ -313,7 +313,7 @@ static int editor_load_landscape_from_sc4(const char *path) rct1_fix_landscape(); editor_finalise_main_view(); - RCT2_GLOBAL(0x009DEA66, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) = 0; return 1; } diff --git a/src/game.c b/src/game.c index af06998e03..4af68c767c 100644 --- a/src/game.c +++ b/src/game.c @@ -330,9 +330,9 @@ void game_update() RCT2_GLOBAL(0x0141F568, uint8) = RCT2_GLOBAL(0x0013CA740, uint8); game_handle_input(); - if (RCT2_GLOBAL(0x009AAC73, uint8) != 255) { - RCT2_GLOBAL(0x009AAC73, uint8)++; - if (RCT2_GLOBAL(0x009AAC73, uint8) == 255) + if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SAVE_TIMER, uint8) != 255) { + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SAVE_TIMER, uint8)++; + if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SAVE_TIMER, uint8) == 255) config_save_default(); } } @@ -341,9 +341,9 @@ void game_logic_update() { RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)++; RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32)++; - RCT2_GLOBAL(0x009DEA66, sint16)++; - if (RCT2_GLOBAL(0x009DEA66, sint16) == 0) - RCT2_GLOBAL(0x009DEA66, sint16)--; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, sint16)++; + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, sint16) == 0) + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, sint16)--; sub_68B089(); scenario_update(); @@ -364,7 +364,7 @@ void game_logic_update() climate_update_sound(); editor_open_windows_for_current_step(); - RCT2_GLOBAL(0x01388698, uint16)++; + RCT2_GLOBAL(RCT2_ADDRESS_SAVED_AGE, uint16)++; // Update windows //window_dispatch_update_all(); @@ -392,11 +392,12 @@ static int game_check_affordability(int cost) { if (cost <= 0)return cost; if (RCT2_GLOBAL(0x141F568, uint8) & 0xF0)return cost; - + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32)&(1 << 8))){ if (cost <= (sint32)(DECRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint32))))return cost; } - RCT2_GLOBAL(0x13CE952, uint32) = cost; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = cost; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 827; return MONEY32_UNDEFINED; } @@ -648,7 +649,7 @@ static void load_landscape() gfx_invalidate_screen(); rct2_endupdate(); } else { - RCT2_GLOBAL(0x009DEA66, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) = 0; rct2_endupdate(); } } @@ -959,7 +960,7 @@ static void load_game() gfx_invalidate_screen(); rct2_endupdate(); } else { - RCT2_GLOBAL(0x009DEA66, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) = 0; rct2_endupdate(); } } diff --git a/src/scenario.c b/src/scenario.c index 52c072b186..f8f772bf9c 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -339,7 +339,7 @@ void scenario_begin() load_palette(); gfx_invalidate_screen(); - RCT2_GLOBAL(0x009DEA66, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) = 0; RCT2_GLOBAL(0x009DEA5C, uint16) = 62000; // (doesn't appear to ever be read) gGameSpeed = 1; } @@ -975,7 +975,7 @@ int scenario_save(SDL_RWops* rw, int flags) reset_loaded_objects(); gfx_invalidate_screen(); - RCT2_GLOBAL(0x009DEA66, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) = 0; return 1; } diff --git a/src/title.c b/src/title.c index e875ecfd19..7e2cc7be4a 100644 --- a/src/title.c +++ b/src/title.c @@ -130,7 +130,7 @@ void title_load() title_create_windows(); title_init_showcase(); gfx_invalidate_screen(); - RCT2_GLOBAL(0x009DEA66, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) = 0; if (gOpenRCT2ShowChangelog) { gOpenRCT2ShowChangelog = false; @@ -188,9 +188,9 @@ static int title_load_park(const char *path) w->saved_view_y = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_Y, sint16); { - char _cl = (RCT2_GLOBAL(0x0138869E, sint16) & 0xFF) - w->viewport->zoom; - w->viewport->zoom = RCT2_GLOBAL(0x0138869E, sint16) & 0xFF; - *((char*)(&RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, sint32))) = RCT2_GLOBAL(0x0138869E, sint16) >> 8; + char _cl = (RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, sint16) & 0xFF) - w->viewport->zoom; + w->viewport->zoom = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, sint16) & 0xFF; + *((char*)(&RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, sint32))) = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, sint16) >> 8; if (_cl != 0) { if (_cl < 0) { _cl = -_cl; @@ -213,7 +213,7 @@ static int title_load_park(const char *path) scenery_set_default_placement_configuration(); news_item_init_queue(); gfx_invalidate_screen(); - RCT2_GLOBAL(0x009DEA66, sint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, sint16) = 0; RCT2_GLOBAL(0x009DEA5C, sint16) = 0x0D6D8; gGameSpeed = 1; return 1; @@ -486,14 +486,14 @@ void title_update() window_map_tooltip_update_visibility(); window_dispatch_update_all(); - RCT2_GLOBAL(0x01388698, uint16)++; + RCT2_GLOBAL(RCT2_ADDRESS_SAVED_AGE, uint16)++; // Input game_handle_input(); - if (RCT2_GLOBAL(0x009AAC73, uint8) != 255) { - RCT2_GLOBAL(0x009AAC73, uint8)++; - if (RCT2_GLOBAL(0x009AAC73, uint8) == 255) + if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SAVE_TIMER, uint8) != 255) { + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SAVE_TIMER, uint8)++; + if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SAVE_TIMER, uint8) == 255) config_save_default(); } } diff --git a/src/windows/map.c b/src/windows/map.c index eeaddaa0bf..165093cd99 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -1286,7 +1286,7 @@ static void window_map_place_park_entrance_tool_down(int x, int y) 0x8001, RCT2_GLOBAL(0x009DEA62, uint16), RCT2_GLOBAL(0x009DEA64, uint16), - RCT2_GLOBAL(0x009DEA66, uint16) + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) ); } diff --git a/src/windows/save_prompt.c b/src/windows/save_prompt.c index 3bd10840cc..8abd3a72e8 100644 --- a/src/windows/save_prompt.c +++ b/src/windows/save_prompt.c @@ -146,7 +146,7 @@ void window_save_prompt_open() } } - if (RCT2_GLOBAL(0x009DEA66, uint16) < 3840) { + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) < 3840) { game_load_or_quit_no_save_prompt(); return; } @@ -263,7 +263,7 @@ static void window_save_prompt_mouseup(rct_window *w, int widgetIndex) } } - if (RCT2_GLOBAL(0x009DEA66, uint16) < 3840) { + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) < 3840) { game_load_or_quit_no_save_prompt(); return; } From 90bf4c6836d547d7d54f9805859c3e2270722d4d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 16 Aug 2015 18:42:30 +0100 Subject: [PATCH 0533/1173] fix #1797 --- src/windows/loadsave.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 368a4fbfe4..c11303cb1e 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -731,7 +731,7 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co static void window_loadsave_select(rct_window *w, const char *path) { SDL_RWops* rw; - switch (_loadsaveType & 0x0E) { + switch (_loadsaveType & 0x0F) { case (LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME) : if (gLoadSaveTitleSequenceSave) { utf8 newName[MAX_PATH]; From 7a30f614a142519404616c187cbc71693afd74b3 Mon Sep 17 00:00:00 2001 From: xperia64 Date: Sun, 16 Aug 2015 14:16:45 -0400 Subject: [PATCH 0534/1173] Correct String IDs --- data/language/english_uk.txt | 1 + data/language/english_us.txt | 1 - src/localisation/string_ids.h | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 144bf8a857..aea71e1df9 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3836,3 +3836,4 @@ STR_5494 :Type the message you would like to send. STR_5495 :Player List STR_5496 :Player: STR_5497 :Ping: +STR_5498 :Guests ignore intensities diff --git a/data/language/english_us.txt b/data/language/english_us.txt index d7770a5fd7..147eaac8dd 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3833,4 +3833,3 @@ STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests STR_5490 :Disable audio on focus loss STR_5491 :Inventions list STR_5492 :Scenario options -STR_5493 :Guests ignore intensities diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index de9436ff44..b967849bcf 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1414,7 +1414,7 @@ enum { STR_CHEAT_GUEST_PREFERRED_INTENSITY = 5362, STR_CHEAT_MORE_THAN_1 = 5363, STR_CHEAT_LESS_THAN_15 = 5364, - STR_CHEAT_IGNORE_INTENSITY = 5493, + STR_CHEAT_IGNORE_INTENSITY = 5498, // Misc. STR_CHEAT_FREEZE_CLIMATE = 2767, STR_CHEAT_UNFREEZE_CLIMATE = 2768, From 4d81eb578edd2ec8001960cc876663bc09b9caf5 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 12 Aug 2015 20:25:21 +0200 Subject: [PATCH 0535/1173] Remove long-disabled config code --- src/config.c | 32 ++------------------------------ 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/src/config.c b/src/config.c index 26f9f401a6..4070555e04 100644 --- a/src/config.c +++ b/src/config.c @@ -879,47 +879,19 @@ void config_dat_load() RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, sint8) = 2; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, sint8) = 1; - // Line below is temporaraly disabled until all config is in the new format. + // Line below is temporarily disabled until all config is in the new format. //if (RCT2_GLOBAL(0x009AB4C6, sint8) == 1) // return; - - + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_CONFIG, sint8) = 1; // Marks config as first time loaded RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) + 2) * 256; if (!(RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS)) RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) + 1) * 256; - // No longer used (controls first time object load) - //RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS, sint8) = 0; } } - /* TODO: CLEANUP - - if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_CONFIG, sint8) == 1) - return; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_CONFIG, sint8) = 1; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) = 0; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_TEMPERATURE, sint8) = 1; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CURRENCY, sint8) = 1; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = 0; - if (!(RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS)) - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) + 1) * 256; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS, sint8) = 1; - } - - } - - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, sint8) = 0; - if (RCT2_GLOBAL(RCT2_ADDRESS_MEM_TOTAL_PHYSICAL, uint32) > 0x4000000) { - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, sint8) = 1; - if (RCT2_GLOBAL(RCT2_ADDRESS_MEM_TOTAL_PHYSICAL, uint32) > 0x8000000) - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, sint8) = 2; - } - */ - - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MAX_VEHICLE_SOUNDS, sint8) = RCT2_ADDRESS(0x009AF601, sint8)[RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, sint8)]; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MAX_NO_SOUNDS, sint8) = RCT2_ADDRESS(0x009AF604, sint8)[RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, sint8)]; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = 0; From fcb74d13b2f1a79b5091fd27898ebc0a693f385a Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 12 Aug 2015 22:05:13 +0200 Subject: [PATCH 0536/1173] Get rid of unused file references, comment out unused obsolete config file code --- src/audio/audio.c | 3 ++- src/config.c | 8 ++++---- src/rct2.h | 22 ---------------------- src/ride/ride.c | 4 ++-- 4 files changed, 8 insertions(+), 29 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 6b265acedf..b01894cc30 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -1714,7 +1714,8 @@ void audio_init1() } } m++; - } while(m + 1 < 0x2E); + // 46 is the number of files in ride_music_info_list + } while(m + 1 < 46); } /** diff --git a/src/config.c b/src/config.c index 4070555e04..507556313d 100644 --- a/src/config.c +++ b/src/config.c @@ -820,7 +820,7 @@ void config_apply_to_old_addresses() * Reads the config file data/config.cfg * rct2: 0x006752D5 */ -void config_dat_load() +/*void config_dat_load() { FILE *fp=NULL; @@ -898,13 +898,13 @@ void config_dat_load() if (!(RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS)) RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) + 1) * 256; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS, sint8) = 1; -} +}*/ /** * Save configuration to the data/config.cfg file * rct2: 0x00675487 */ -void config_dat_save() +/*void config_dat_save() { FILE *fp = fopen(get_file_path(PATH_ID_GAMECFG), "wb"); if (fp != NULL){ @@ -912,7 +912,7 @@ void config_dat_save() fwrite((void*)0x009AAC5C, 2155, 1, fp); fclose(fp); } -} +}*/ #pragma endregion diff --git a/src/rct2.h b/src/rct2.h index 3fed27792a..d391e0d239 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -150,7 +150,6 @@ enum { enum { PATH_ID_G1, - PATH_ID_PLUGIN, PATH_ID_CSS1, PATH_ID_CSS2, PATH_ID_CSS4, @@ -159,22 +158,12 @@ enum { PATH_ID_CSS7, PATH_ID_CSS8, PATH_ID_CSS9, - PATH_ID_CSS10, PATH_ID_CSS11, PATH_ID_CSS12, PATH_ID_CSS13, PATH_ID_CSS14, PATH_ID_CSS15, - PATH_ID_CSS16, PATH_ID_CSS3, - PATH_ID_GAMECFG, - PATH_ID_TUT640A, - PATH_ID_TUT640B, - PATH_ID_TUT640C, - PATH_ID_TUT800A, - PATH_ID_TUT800B, - PATH_ID_TUT800C, - PATH_ID_KANJI, PATH_ID_CSS17, PATH_ID_CSS18, PATH_ID_CSS19, @@ -219,7 +208,6 @@ enum { static const char * const file_paths[] = { "Data\\G1.DAT", - "Data\\PLUGIN.DAT", "Data\\CSS1.DAT", "Data\\CSS2.DAT", "Data\\CSS4.DAT", @@ -228,22 +216,12 @@ static const char * const file_paths[] = "Data\\CSS7.DAT", "Data\\CSS8.DAT", "Data\\CSS9.DAT", - "Data\\CSS10.DAT", "Data\\CSS11.DAT", "Data\\CSS12.DAT", "Data\\CSS13.DAT", "Data\\CSS14.DAT", "Data\\CSS15.DAT", - "Data\\CSS16.DAT", "Data\\CSS3.DAT", - "Data\\GAME.CFG", - "Data\\TUT640A.DAT", - "Data\\TUT640B.DAT", - "Data\\TUT640C.DAT", - "Data\\TUT800A.DAT", - "Data\\TUT800B.DAT", - "Data\\TUT800C.DAT", - "Data\\KANJI.DAT", "Data\\CSS17.DAT", "Data\\CSS18.DAT", "Data\\CSS19.DAT", diff --git a/src/ride/ride.c b/src/ride/ride.c index 7f37e4be6b..0ab877bd53 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3320,13 +3320,13 @@ rct_ride_music_info* ride_music_info_list[] = { INIT_MUSIC_INFO(PATH_ID_CSS7, 1378, 15331658, 0), INIT_MUSIC_INFO(PATH_ID_CSS8, 1378, 17503414, 0), INIT_MUSIC_INFO(PATH_ID_CSS9, 1378, 7005802, 0), - INIT_MUSIC_INFO(PATH_ID_CSS10, 1378, 0, 0), + INIT_MUSIC_INFO(0, 1378, 0, 0), // Referred to the nearly empty CSS10.DAT file INIT_MUSIC_INFO(PATH_ID_CSS11, 1378, 7023288, 0), INIT_MUSIC_INFO(PATH_ID_CSS12, 1378, 2767948, 0), INIT_MUSIC_INFO(PATH_ID_CSS13, 1378, 3373390, 0), INIT_MUSIC_INFO(PATH_ID_CSS14, 1378, 20783042, 0), INIT_MUSIC_INFO(PATH_ID_CSS15, 1378, 10009312, 0), - INIT_MUSIC_INFO(PATH_ID_CSS16, 1378, 0, 0), + INIT_MUSIC_INFO(0, 1378, 0, 0), // Referred to the nearly empty CSS16.DAT file INIT_MUSIC_INFO(PATH_ID_CSS3, 689, 1244886, 1), INIT_MUSIC_INFO(PATH_ID_CSS17, 2756, -1, 0), INIT_MUSIC_INFO(PATH_ID_CSS18, 2756, 8429568, 1), From 6a23e28670e1dcf73f036cdeb6d1bd88b357dc32 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 16 Aug 2015 21:29:10 +0200 Subject: [PATCH 0537/1173] Refactored music file list, removed some extra unused code, clear up some comments --- src/audio/audio.c | 8 +++----- src/audio/audio.h | 2 +- src/rct2.c | 2 +- src/rct2.h | 4 ---- src/ride/ride.c | 4 ++-- src/ride/ride.h | 2 +- 6 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index b01894cc30..803ffd5fcb 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -1700,8 +1700,8 @@ void audio_init1() } } audio_init2(devicenum); - int m = 0; - do { + + for(int m = 0; m < countof(ride_music_info_list); m++) { rct_ride_music_info* ride_music_info = ride_music_info_list[m]; const char* path = get_file_path(ride_music_info->pathid); FILE *file = fopen(path, "rb"); @@ -1713,9 +1713,7 @@ void audio_init1() ride_music_info->length = 0; } } - m++; - // 46 is the number of files in ride_music_info_list - } while(m + 1 < 46); + } } /** diff --git a/src/audio/audio.h b/src/audio/audio.h index ef41f56601..d7205407a6 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -147,7 +147,7 @@ typedef struct { uint8 var_9; } rct_ride_music_info; -extern rct_ride_music_info* ride_music_info_list[]; +extern rct_ride_music_info* ride_music_info_list[46]; extern rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS]; extern rct_vehicle_sound_params gVehicleSoundParamsList[AUDIO_MAX_VEHICLE_SOUNDS]; extern rct_vehicle_sound_params *gVehicleSoundParamsListEnd; diff --git a/src/rct2.c b/src/rct2.c index 61af055adf..8fdf68811a 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -299,7 +299,7 @@ int check_file_path(int pathId) // A data file is missing from the installation directory. The original implementation // asks for a CD-ROM path at this point and stores it in cdrom_path @ 0x9AA318. // The file_on_cdrom[pathId] @ 0x009AA0B flag is set to 1 as well. - // For PATH_ID_SIXFLAGS_MAGICMOUNTAIN and PATH_ID_SIXFLAGS_BUILDYOUROWN, + // For PATH_ID_SIXFLAGS_MAGICMOUNTAIN (and the now removed PATH_ID_SIXFLAGS_BUILDYOUROWN), // the original implementation always assumes they are stored on CD-ROM. // This has been removed for now for the sake of simplicity and could be added // later in a more convenient way using the INI file. diff --git a/src/rct2.h b/src/rct2.h index d391e0d239..f6a6533dac 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -191,10 +191,8 @@ enum { PATH_ID_CUSTOM2, PATH_ID_CSS39, PATH_ID_CSS40, - PATH_ID_TRACKSIDX, PATH_ID_CSS41, PATH_ID_SIXFLAGS_MAGICMOUNTAIN, - PATH_ID_SIXFLAGS_BUILDYOUROWN, PATH_ID_CSS42, PATH_ID_CSS43, PATH_ID_CSS44, @@ -249,10 +247,8 @@ static const char * const file_paths[] = "Data\\CUSTOM2.WAV", "Data\\CSS39.DAT", "Data\\CSS40.DAT", - "Tracks\\Tracks.IDX", "Data\\CSS41.DAT", "Scenarios\\Six Flags Magic Mountain.SC6", - "Scenarios\\Build your own Six Flags Park.SC6", "Data\\CSS42.DAT", "Data\\CSS43.DAT", "Data\\CSS44.DAT", diff --git a/src/ride/ride.c b/src/ride/ride.c index 0ab877bd53..8f11aad916 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -2509,7 +2509,7 @@ uint8 *ride_music_style_tuneids[] = { MAKE_TUNEID_LIST(18), // MUSIC_STYLE_JUNGLE_DRUMS MAKE_TUNEID_LIST(19), // MUSIC_STYLE_EGYPTIAN MAKE_TUNEID_LIST(20), // MUSIC_STYLE_TOYLAND - MAKE_TUNEID_LIST(21), // MUSIC_STYLE_8 + MAKE_TUNEID_LIST(21), // MUSIC_STYLE_CIRCUS_SHOW MAKE_TUNEID_LIST(22), // MUSIC_STYLE_SPACE MAKE_TUNEID_LIST(23), // MUSIC_STYLE_HORROR MAKE_TUNEID_LIST(24), // MUSIC_STYLE_TECHNO @@ -3313,7 +3313,7 @@ int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint #define INIT_MUSIC_INFO(pathid, offset, length, unknown) (rct_ride_music_info[]){length, offset, pathid, unknown} //0x009AF1C8 -rct_ride_music_info* ride_music_info_list[] = { +rct_ride_music_info* ride_music_info_list[46] = { INIT_MUSIC_INFO(PATH_ID_CSS4, 1378, 8139054, 0), INIT_MUSIC_INFO(PATH_ID_CSS5, 1378, 7796656, 0), INIT_MUSIC_INFO(PATH_ID_CSS6, 1378, 15787850, 0), diff --git a/src/ride/ride.h b/src/ride/ride.h index 0bdc574eb6..a87a168d64 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -598,7 +598,7 @@ enum { MUSIC_STYLE_JUNGLE_DRUMS, MUSIC_STYLE_EGYPTIAN, MUSIC_STYLE_TOYLAND, - MUSIC_STYLE_8, + MUSIC_STYLE_CIRCUS_SHOW, MUSIC_STYLE_SPACE, MUSIC_STYLE_HORROR, MUSIC_STYLE_TECHNO, From 150fe74e4effef4ab875eafc32ea9e8048c776a0 Mon Sep 17 00:00:00 2001 From: medsouz Date: Sun, 16 Aug 2015 15:30:37 -0400 Subject: [PATCH 0538/1173] Remove unused code 0x009DEA5C is set but never read 0x009AAC73 is normally set to 0 when the screen resolution is changed to delay saving the config. This is no longer neccesary in OpenRCT2 --- src/addresses.h | 4 ---- src/game.c | 6 ------ src/scenario.c | 1 - src/title.c | 7 ------- 4 files changed, 18 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 1cc739446e..c61bc673a1 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -75,10 +75,6 @@ // When all sounds reversed replace with gConfigSound.ride_music #define RCT2_ADDRESS_CONFIG_MUSIC 0x009AAC72 -// Is supposed to be set to 0 whenever the screen resolution is changed -// it will then count up 255 ticks before saving the config -// In OpenRCT2 this value is only set to 0 on startup -#define RCT2_ADDRESS_CONFIG_SAVE_TIMER 0x009AAC73 #define RCT2_ADDRESS_CONFIG_FLAGS 0x009AAC74 // MAX vehicle sounds not used anymore diff --git a/src/game.c b/src/game.c index 4735abc6f0..e41de01196 100644 --- a/src/game.c +++ b/src/game.c @@ -329,12 +329,6 @@ void game_update() // Input RCT2_GLOBAL(0x0141F568, uint8) = RCT2_GLOBAL(0x0013CA740, uint8); game_handle_input(); - - if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SAVE_TIMER, uint8) != 255) { - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SAVE_TIMER, uint8)++; - if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SAVE_TIMER, uint8) == 255) - config_save_default(); - } } void game_logic_update() diff --git a/src/scenario.c b/src/scenario.c index f8f772bf9c..3eed3a5182 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -340,7 +340,6 @@ void scenario_begin() gfx_invalidate_screen(); RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) = 0; - RCT2_GLOBAL(0x009DEA5C, uint16) = 62000; // (doesn't appear to ever be read) gGameSpeed = 1; } diff --git a/src/title.c b/src/title.c index 7e2cc7be4a..0fc0201a72 100644 --- a/src/title.c +++ b/src/title.c @@ -214,7 +214,6 @@ static int title_load_park(const char *path) news_item_init_queue(); gfx_invalidate_screen(); RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, sint16) = 0; - RCT2_GLOBAL(0x009DEA5C, sint16) = 0x0D6D8; gGameSpeed = 1; return 1; } @@ -490,12 +489,6 @@ void title_update() // Input game_handle_input(); - - if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SAVE_TIMER, uint8) != 255) { - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SAVE_TIMER, uint8)++; - if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SAVE_TIMER, uint8) == 255) - config_save_default(); - } } static uint8 *generate_random_script() From 4733ea28c0139ab0791ee040c1fe61fc802fc081 Mon Sep 17 00:00:00 2001 From: xperia64 Date: Sat, 15 Aug 2015 14:42:53 -0400 Subject: [PATCH 0539/1173] Add a cheat so guests ignore intensity and nausea ratings --- data/language/english_us.txt | 2 +- src/config.c | 1 + src/config.h | 1 + src/localisation/string_ids.h | 2 +- src/peep/peep.c | 22 +++++++++++----------- src/windows/cheats.c | 28 ++++++++++++++++++---------- 6 files changed, 33 insertions(+), 23 deletions(-) diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 3c8b97e02d..dd3b1924fa 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3837,4 +3837,4 @@ STR_5493 :Send Message STR_5494 :Enter the message you would like to send. STR_5495 :Player List STR_5496 :Player: -STR_5497 :Ping: +STR_5497 :Ping: \ No newline at end of file diff --git a/src/config.c b/src/config.c index 26f9f401a6..45ad23d82d 100644 --- a/src/config.c +++ b/src/config.c @@ -220,6 +220,7 @@ config_property_definition _cheatDefinitions[] = { { offsetof(cheat_configuration, disable_all_breakdowns), "disable_all_breakdowns", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(cheat_configuration, unlock_all_prices), "unlock_all_prices", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(cheat_configuration, build_in_pause_mode), "build_in_pause_mode", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(cheat_configuration, ignore_ride_intensity), "ignore_ride_intensity", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, }; config_property_definition _twitchDefinitions[] = { diff --git a/src/config.h b/src/config.h index 4ea4b14b03..1367427c61 100644 --- a/src/config.h +++ b/src/config.h @@ -193,6 +193,7 @@ typedef struct { uint8 disable_all_breakdowns; uint8 unlock_all_prices; uint8 build_in_pause_mode; + uint8 ignore_ride_intensity; } cheat_configuration; typedef struct { diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index c2d0b7e7fb..c4d8b1f1fc 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1414,7 +1414,7 @@ enum { STR_CHEAT_GUEST_PREFERRED_INTENSITY = 5362, STR_CHEAT_MORE_THAN_1 = 5363, STR_CHEAT_LESS_THAN_15 = 5364, - + STR_CHEAT_IGNORE_INTENSITY = 5493, // Misc. STR_CHEAT_FREEZE_CLIMATE = 2767, STR_CHEAT_UNFREEZE_CLIMATE = 2768, diff --git a/src/peep/peep.c b/src/peep/peep.c index 8fac10960e..08cfbf1149 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7665,7 +7665,7 @@ static bool peep_should_go_on_ride_again(rct_peep *peep, rct_ride *ride) { if (!(RCT2_GLOBAL(0x0097CF40 + (ride->type * 8), uint32) & 0x100000)) return false; if (ride->excitement == (ride_rating)0xFFFF) return false; - if (ride->intensity > RIDE_RATING(10,00)) return false; + if (ride->intensity > RIDE_RATING(10,00) && !gConfigCheat.ignore_ride_intensity) return false; if (peep->happiness < 180) return false; if (peep->energy < 100) return false; if (peep->nausea > 160) return false; @@ -7694,9 +7694,9 @@ static bool peep_really_liked_ride(rct_peep *peep, rct_ride *ride) { return peep->happiness >= 215 && - peep->nausea <= 120 && + ((peep->nausea <= 120 && ride->excitement != (ride_rating)0xFFFF && - ride->intensity <= RIDE_RATING(10,00); + ride->intensity <= RIDE_RATING(10,00))||gConfigCheat.ignore_ride_intensity); } /** @@ -7992,7 +7992,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) } if (ride->excitement != 0xFFFF) { if (rideIndex == peep->guest_heading_to_ride_id) { - if (ride->intensity > RIDE_RATING(10, 00)) goto loc_6965F1; + if (ride->intensity > RIDE_RATING(10, 00) && !gConfigCheat.ignore_ride_intensity) goto loc_6965F1; goto loc_696387; } if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8) != 0) { @@ -8008,7 +8008,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) } ride_rating maxIntensity = min((peep->intensity >> 4) * 100, 1000) + peep->happiness; ride_rating minIntensity = ((peep->intensity & 0x0F) * 100) - peep->happiness; - if (ride->intensity < minIntensity) { + if (ride->intensity < minIntensity && !gConfigCheat.ignore_ride_intensity) { if (!(bp & 4)) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_MORE_THRILLING, rideIndex); if (peep->happiness_growth_rate >= 64) { @@ -8018,11 +8018,11 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) } goto loc_696658; } - if (ride->intensity > maxIntensity) goto loc_6965F1; + if (ride->intensity > maxIntensity && !gConfigCheat.ignore_ride_intensity) goto loc_6965F1; ride_rating minNausea = RCT2_ADDRESS(0x00982390, uint16)[(peep->nausea_tolerance & 3) * 2] - peep->happiness; ride_rating maxNausea = RCT2_ADDRESS(0x00982392, uint16)[(peep->nausea_tolerance & 3) * 2] + peep->happiness; - if (ride->nausea > maxNausea) { + if (ride->nausea > maxNausea && !gConfigCheat.ignore_ride_intensity) { if (!(bp & 4)) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SICKENING, rideIndex); if (peep->happiness_growth_rate >= 64) { @@ -8032,15 +8032,15 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) } goto loc_696658; } - if (ride->nausea >= 140 && peep->nausea > 160) goto loc_69666E; + if (ride->nausea >= 140 && peep->nausea > 160 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; goto loc_696387; } if (RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 8] & 0x10) { if (scenario_rand() > 0x1999U) goto loc_69666E; - if (ride->max_positive_vertical_g > 500) goto loc_69666E; - if (ride->max_negative_vertical_g < -400) goto loc_69666E; - if (ride->max_lateral_g > 400) goto loc_69666E; + if (ride->max_positive_vertical_g > 500 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; + if (ride->max_negative_vertical_g < -400 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; + if (ride->max_lateral_g > 400 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; } loc_696387:; diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 93710be4c6..c1385b4ca1 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -77,6 +77,7 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_GUEST_BATHROOM_MIN, WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1, WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15, + WIDX_GUEST_IGNORE_RIDE_INTENSITY, WIDX_GIVE_ALL_GUESTS_GROUP, WIDX_GIVE_GUESTS_MONEY, WIDX_GIVE_GUESTS_PARK_MAPS, @@ -185,7 +186,7 @@ static rct_widget window_cheats_money_widgets[] = { static rct_widget window_cheats_guests_widgets[] = { MAIN_CHEATS_WIDGETS, - { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(0), HPL(9.5), STR_CHEAT_SET_GUESTS_PARAMETERS, STR_NONE }, // Guests parameters group frame + { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(0), HPL(10.5), STR_CHEAT_SET_GUESTS_PARAMETERS, STR_NONE }, // Guests parameters group frame { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(1), HPL(1), STR_MAX, STR_NONE }, // happiness max { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(1), HPL(1), STR_MIN, STR_NONE }, // happiness min { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(2), HPL(2), STR_MAX, STR_NONE }, // energy max @@ -202,14 +203,15 @@ static rct_widget window_cheats_guests_widgets[] = { { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(7), HPL(7), STR_MIN, STR_NONE }, // bathroom min { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(9), HPL(9), STR_CHEAT_MORE_THAN_1, STR_NONE }, // ride intensity > 1 { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(9), HPL(9), STR_CHEAT_LESS_THAN_15, STR_NONE }, // ride intensity < 15 - { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(11), HPL(13.5), STR_CHEAT_GIVE_ALL_GUESTS, STR_NONE }, // Guests parameters group frame - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(12), HPL(12), STR_CHEAT_CURRENCY_FORMAT, STR_NONE }, // give guests money - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(12), HPL(12), 2018, STR_NONE }, // give guests park maps - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(13), HPL(13), 2016, STR_NONE }, // give guests balloons - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(13), HPL(13), 2020, STR_NONE }, // give guests umbrellas - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(15), HPL(15), STR_CHEAT_LARGE_TRAM_GUESTS, STR_CHEAT_TIP_LARGE_TRAM_GUESTS }, // large tram - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(15), HPL(15), STR_CHEAT_REMOVE_ALL_GUESTS, STR_CHEAT_TIP_REMOVE_ALL_GUESTS }, // remove all guests - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(16), HPL(16), STR_CHEAT_EXPLODE, STR_CHEAT_TIP_EXPLODE }, // explode guests + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(10), OHPL(10), STR_CHEAT_IGNORE_INTENSITY, STR_NONE }, // don't care about intensity + { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(12), HPL(14.5), STR_CHEAT_GIVE_ALL_GUESTS, STR_NONE }, // Guests parameters group frame + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(13), HPL(13), STR_CHEAT_CURRENCY_FORMAT, STR_NONE }, // give guests money + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(13), HPL(13), 2018, STR_NONE }, // give guests park maps + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(14), HPL(14), 2016, STR_NONE }, // give guests balloons + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(14), HPL(14), 2020, STR_NONE }, // give guests umbrellas + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(16), HPL(16), STR_CHEAT_LARGE_TRAM_GUESTS, STR_CHEAT_TIP_LARGE_TRAM_GUESTS }, // large tram + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(16), HPL(16), STR_CHEAT_REMOVE_ALL_GUESTS, STR_CHEAT_TIP_REMOVE_ALL_GUESTS }, // remove all guests + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(17), HPL(17), STR_CHEAT_EXPLODE, STR_CHEAT_TIP_EXPLODE }, // explode guests { WIDGETS_END }, }; @@ -406,7 +408,7 @@ static rct_window_event_list *window_cheats_page_events[] = { 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_HIGH_MONEY) | (1ULL << WIDX_CLEAR_LOAN), - (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_GUEST_PARAMETERS_GROUP) | (1ULL << WIDX_GUEST_HAPPINESS_MAX) | (1ULL << WIDX_GUEST_HAPPINESS_MIN) | (1ULL << WIDX_GUEST_ENERGY_MAX) | (1ULL << WIDX_GUEST_ENERGY_MIN) | (1ULL << WIDX_GUEST_HUNGER_MAX) | (1ULL << WIDX_GUEST_HUNGER_MIN) | (1ULL << WIDX_GUEST_THIRST_MAX) | (1ULL << WIDX_GUEST_THIRST_MIN) | (1ULL << WIDX_GUEST_NAUSEA_MAX) | (1ULL << WIDX_GUEST_NAUSEA_MIN) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1ULL << WIDX_GUEST_BATHROOM_MAX) | (1ULL << WIDX_GUEST_BATHROOM_MIN) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1ULL << WIDX_GIVE_ALL_GUESTS_GROUP) | (1ULL << WIDX_GIVE_GUESTS_MONEY) | (1ULL << WIDX_GIVE_GUESTS_PARK_MAPS) | (1ULL << WIDX_GIVE_GUESTS_BALLOONS) | (1ULL << WIDX_GIVE_GUESTS_UMBRELLAS) | (1ULL << WIDX_TRAM_GUESTS) | (1ULL << WIDX_REMOVE_ALL_GUESTS) | (1ULL << WIDX_EXPLODE_GUESTS), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_GUEST_PARAMETERS_GROUP) | (1ULL << WIDX_GUEST_HAPPINESS_MAX) | (1ULL << WIDX_GUEST_HAPPINESS_MIN) | (1ULL << WIDX_GUEST_ENERGY_MAX) | (1ULL << WIDX_GUEST_ENERGY_MIN) | (1ULL << WIDX_GUEST_HUNGER_MAX) | (1ULL << WIDX_GUEST_HUNGER_MIN) | (1ULL << WIDX_GUEST_THIRST_MAX) | (1ULL << WIDX_GUEST_THIRST_MIN) | (1ULL << WIDX_GUEST_NAUSEA_MAX) | (1ULL << WIDX_GUEST_NAUSEA_MIN) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1ULL << WIDX_GUEST_BATHROOM_MAX) | (1ULL << WIDX_GUEST_BATHROOM_MIN) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1ULL << WIDX_GUEST_IGNORE_RIDE_INTENSITY) | (1ULL << WIDX_GIVE_ALL_GUESTS_GROUP) | (1ULL << WIDX_GIVE_GUESTS_MONEY) | (1ULL << WIDX_GIVE_GUESTS_PARK_MAPS) | (1ULL << WIDX_GIVE_GUESTS_BALLOONS) | (1ULL << WIDX_GIVE_GUESTS_UMBRELLAS) | (1ULL << WIDX_TRAM_GUESTS) | (1ULL << WIDX_REMOVE_ALL_GUESTS) | (1ULL << WIDX_EXPLODE_GUESTS), (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_FREEZE_CLIMATE) | (1ULL << WIDX_OPEN_CLOSE_PARK) | (1ULL << WIDX_WEATHER_SUN) | (1ULL << WIDX_WEATHER_THUNDER) | (1ULL << WIDX_CLEAR_GRASS) | (1ULL << WIDX_MOWED_GRASS) | (1ULL << WIDX_WATER_PLANTS) | (1ULL << WIDX_FIX_VANDALISM) | (1ULL << WIDX_REMOVE_LITTER) | (1ULL << WIDX_WIN_SCENARIO) | (1ULL << WIDX_HAVE_FUN) | (1ULL << WIDX_UNLOCK_ALL_PRICES) | (1ULL << WIDX_SANDBOX_MODE) | (1ULL << WIDX_FAST_STAFF) | (1ULL << WIDX_NORMAL_STAFF) | (1ULL << WIDX_PARK_PARAMETERS) | (1ULL << WIDX_FORCE_PARK_RATING) | (1ULL << WIDX_INCREASE_PARK_RATING) | (1ULL << WIDX_DECREASE_PARK_RATING), (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) }; @@ -853,6 +855,11 @@ static void window_cheats_guests_mouseup(rct_window *w, int widgetIndex) case WIDX_GIVE_GUESTS_UMBRELLAS: cheat_give_all_guests(OBJECT_UMBRELLA); break; + case WIDX_GUEST_IGNORE_RIDE_INTENSITY: + gConfigCheat.ignore_ride_intensity ^= 1; + config_save_default(); + window_invalidate(w); + break; } } @@ -1040,6 +1047,7 @@ static void window_cheats_invalidate(rct_window *w) break; case WINDOW_CHEATS_PAGE_GUESTS: RCT2_GLOBAL(0x013CE952, int) = 10000; + widget_set_checkbox_value(w, WIDX_GUEST_IGNORE_RIDE_INTENSITY, gConfigCheat.ignore_ride_intensity); break; case WINDOW_CHEATS_PAGE_MISC: w->widgets[WIDX_OPEN_CLOSE_PARK].image = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_OPEN ? From a629de46660c76c18df23147b174574fc5fdb3e0 Mon Sep 17 00:00:00 2001 From: xperia64 Date: Sun, 16 Aug 2015 14:16:45 -0400 Subject: [PATCH 0540/1173] Correct String IDs --- data/language/english_uk.txt | 1 + src/localisation/string_ids.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 975d04a36f..50f8fe9e33 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3844,3 +3844,4 @@ STR_5502 :Multiplayer STR_5503 :Enter hostname or IP address: STR_5504 :{SMALLFONT}{BLACK}Show multiplayer status STR_5505 :Unable to connect to server. +STR_5506 :Guests ignore intensities \ No newline at end of file diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index c4d8b1f1fc..be9ba1665b 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1414,7 +1414,7 @@ enum { STR_CHEAT_GUEST_PREFERRED_INTENSITY = 5362, STR_CHEAT_MORE_THAN_1 = 5363, STR_CHEAT_LESS_THAN_15 = 5364, - STR_CHEAT_IGNORE_INTENSITY = 5493, + STR_CHEAT_IGNORE_INTENSITY = 5498, // Misc. STR_CHEAT_FREEZE_CLIMATE = 2767, STR_CHEAT_UNFREEZE_CLIMATE = 2768, From 9af5f029aa61ebb4cf727d781737c882854195b3 Mon Sep 17 00:00:00 2001 From: xperia64 Date: Sun, 16 Aug 2015 16:04:21 -0400 Subject: [PATCH 0541/1173] Rebase --- src/localisation/string_ids.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index be9ba1665b..079a784e93 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1414,7 +1414,8 @@ enum { STR_CHEAT_GUEST_PREFERRED_INTENSITY = 5362, STR_CHEAT_MORE_THAN_1 = 5363, STR_CHEAT_LESS_THAN_15 = 5364, - STR_CHEAT_IGNORE_INTENSITY = 5498, + STR_CHEAT_IGNORE_INTENSITY = 5506, + // Misc. STR_CHEAT_FREEZE_CLIMATE = 2767, STR_CHEAT_UNFREEZE_CLIMATE = 2768, From 99dd05176f7c93bd4ee5579b137b3df415b16d8f Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 16 Aug 2015 22:26:17 +0200 Subject: [PATCH 0542/1173] Use a define the number of default music tracks --- src/audio/audio.c | 1 + src/audio/audio.h | 3 ++- src/ride/ride.c | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 803ffd5fcb..e16613cf7e 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -23,6 +23,7 @@ #include "../interface/viewport.h" #include "../interface/window.h" #include "../platform/platform.h" +#include "../ride/ride.h" #include "../world/map.h" #include "../world/sprite.h" #include "audio.h" diff --git a/src/audio/audio.h b/src/audio/audio.h index d7205407a6..aee7f80f00 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -147,7 +147,8 @@ typedef struct { uint8 var_9; } rct_ride_music_info; -extern rct_ride_music_info* ride_music_info_list[46]; +#define NUM_DEFAULT_MUSIC_TRACKS 46 +extern rct_ride_music_info* ride_music_info_list[NUM_DEFAULT_MUSIC_TRACKS]; extern rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS]; extern rct_vehicle_sound_params gVehicleSoundParamsList[AUDIO_MAX_VEHICLE_SOUNDS]; extern rct_vehicle_sound_params *gVehicleSoundParamsListEnd; diff --git a/src/ride/ride.c b/src/ride/ride.c index 8f11aad916..2cd47c25a6 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3313,7 +3313,7 @@ int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint #define INIT_MUSIC_INFO(pathid, offset, length, unknown) (rct_ride_music_info[]){length, offset, pathid, unknown} //0x009AF1C8 -rct_ride_music_info* ride_music_info_list[46] = { +rct_ride_music_info* ride_music_info_list[NUM_DEFAULT_MUSIC_TRACKS] = { INIT_MUSIC_INFO(PATH_ID_CSS4, 1378, 8139054, 0), INIT_MUSIC_INFO(PATH_ID_CSS5, 1378, 7796656, 0), INIT_MUSIC_INFO(PATH_ID_CSS6, 1378, 15787850, 0), From 7071bd935344e66d3f0723f6cae624ac530c6a0c Mon Sep 17 00:00:00 2001 From: medsouz Date: Sun, 16 Aug 2015 18:25:17 -0400 Subject: [PATCH 0543/1173] Document more addresses Created defines for all the memory addresses I could find in peep/staff.c and updated everywhere they're being used. --- src/addresses.h | 5 ++ src/peep/staff.c | 23 +++--- src/peep/staff.h | 3 - src/rct1.c | 6 +- src/ride/ride.c | 28 ++++---- src/ride/track.c | 24 +++---- src/windows/footpath.c | 8 +-- src/windows/map.c | 2 +- src/windows/maze_construction.c | 6 +- src/windows/ride_construction.c | 6 +- src/windows/staff.c | 2 +- src/windows/staff_list.c | 2 +- src/windows/top_toolbar.c | 16 ++--- src/world/footpath.c | 14 ++-- src/world/map.c | 120 ++++++++++++++++---------------- src/world/park.c | 12 ++-- src/world/sprite.c | 6 +- 17 files changed, 141 insertions(+), 142 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index c61bc673a1..f1dc347c96 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -228,6 +228,10 @@ #define RCT2_ADDRESS_MAP_ARROW_Z 0x009DEA4C #define RCT2_ADDRESS_MAP_ARROW_DIRECTION 0x009DEA4E +#define RCT2_ADDRESS_COMMAND_MAP_X 0x009DEA5E +#define RCT2_ADDRESS_COMMAND_MAP_Y 0x009DEA60 +#define RCT2_ADDRESS_COMMAND_MAP_Z 0x009DEA62 + //Counts how many ticks the current screen has been open for #define RCT2_ADDRESS_SCREEN_AGE 0x009DEA66 #define RCT2_ADDRESS_SCREEN_FLAGS 0x009DEA68 @@ -467,6 +471,7 @@ #define RCT2_ADDRESS_RIDE_MEASUREMENTS 0x0138B60C #define RCT2_ADDRESS_GRASS_SCENERY_TILEPOS 0x013B0E70 +#define RCT2_ADDRESS_STAFF_PATROL_AREAS 0x013B0E72 #define RCT2_ADDRESS_CLIMATE 0x013CA746 #define RCT2_ADDRESS_CURRENT_WEATHER 0x013CA74A diff --git a/src/peep/staff.c b/src/peep/staff.c index 019f072113..28807aa125 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -29,9 +29,6 @@ #include "peep.h" #include "staff.h" -uint32 *gStaffPatrolAreas = (uint32*)0x013B0E72; -uint8 *gStaffModes = (uint8*)0x013CA672; - /** * * rct2: 0x006BD3A4 @@ -85,9 +82,9 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, uint16 _ax = *eax & 0xFFFF, _cx = *ecx & 0xFFFF, _dx = *edx & 0xFFFF; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_WAGES * 4; - RCT2_GLOBAL(0x009DEA5E, uint16) = _ax; - RCT2_GLOBAL(0x009DEA60, uint16) = _cx; - RCT2_GLOBAL(0x009DEA62, uint16) = _dx; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = _ax; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = _cx; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = _dx; if (RCT2_GLOBAL(0x13573C8, uint16) < 0x190) { *ebx = MONEY32_UNDEFINED; @@ -269,7 +266,7 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[newStaffId] = STAFF_MODE_WALK; for (int edi = 0; edi < 0x80; edi++) { - int addr = 0x013B0E72 + (newStaffId << 9) + edi * 4; + int addr = RCT2_ADDRESS_STAFF_PATROL_AREAS + (newStaffId << 9) + edi * 4; RCT2_GLOBAL(addr, uint32) = 0; } } @@ -327,12 +324,12 @@ void game_command_set_staff_patrol(int *eax, int *ebx, int *ecx, int *edx, int * int mask = 1 << (patrolIndex & 0x1F); int base = patrolIndex >> 5; - uint32 *patrolBits = (uint32*)(0x013B0E72 + patrolOffset + (base * 4)); + uint32 *patrolBits = (uint32*)(RCT2_ADDRESS_STAFF_PATROL_AREAS + patrolOffset + (base * 4)); *patrolBits ^= mask; int ispatrolling = 0; for(int i = 0; i < 128; i++){ - ispatrolling |= *(uint32*)(0x013B0E72 + patrolOffset + (i * 4)); + ispatrolling |= *(uint32*)(RCT2_ADDRESS_STAFF_PATROL_AREAS + patrolOffset + (i * 4)); } RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[peep->staff_id] &= ~2; @@ -406,7 +403,7 @@ void staff_update_greyed_patrol_areas() for (int staff_type = 0; staff_type < STAFF_TYPE_COUNT; ++staff_type) { for (int i = 0; i < 128; ++i) - RCT2_ADDRESS(0x13B0E72 + ((staff_type + STAFF_MAX_COUNT) * 512), uint32)[i] = 0; + RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS + ((staff_type + STAFF_MAX_COUNT) * 512), uint32)[i] = 0; for (uint16 sprite_index = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_PEEP, uint16); sprite_index != SPRITE_INDEX_NULL; sprite_index = peep->next) { @@ -415,7 +412,7 @@ void staff_update_greyed_patrol_areas() if (peep->type == PEEP_TYPE_STAFF && staff_type == peep->staff_type) { for (int i = 0; i < 128; ++i) - RCT2_ADDRESS(0x13B0E72 + ((staff_type + STAFF_MAX_COUNT) * 512), uint32)[i] |= RCT2_ADDRESS(0x13B0E72 + (peep->staff_id * 512), uint32)[i]; + RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS + ((staff_type + STAFF_MAX_COUNT) * 512), uint32)[i] |= RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS + (peep->staff_id * 512), uint32)[i]; } } @@ -432,7 +429,7 @@ int staff_is_location_in_patrol_area(rct_peep *peep, int x, int y) int mask = 1 << (patrolIndex & 0x1F); int base = patrolIndex >> 5; - uint32 *patrolBits = (uint32*)(0x013B0E72 + patrolOffset + (base * 4)); + uint32 *patrolBits = (uint32*)(RCT2_ADDRESS_STAFF_PATROL_AREAS + patrolOffset + (base * 4)); return (*patrolBits & mask) != 0; } @@ -481,5 +478,5 @@ bool staff_is_patrol_area_set(int staffIndex, int x, int y) int peepOffset = staffIndex * 128; int offset = (x | y) >> 5; int bitIndex = (x | y) & 0x1F; - return gStaffPatrolAreas[peepOffset + offset] & (1 << bitIndex); + return RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS, uint32)[peepOffset + offset] & (1 << bitIndex); } diff --git a/src/peep/staff.h b/src/peep/staff.h index 68b2b32321..85d4813f2d 100644 --- a/src/peep/staff.h +++ b/src/peep/staff.h @@ -49,9 +49,6 @@ enum STAFF_ORDERS{ STAFF_ORDERS_FIX_RIDES = (1 << 1) }; -extern uint32 *gStaffPatrolAreas; -extern uint8 *gStaffModes; - void game_command_update_staff_colour(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_hire_new_staff_member(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_staff_order(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); diff --git a/src/rct1.c b/src/rct1.c index 5e9c698ef3..efa4d619ce 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -146,12 +146,12 @@ void rct1_import_s4(rct1_s4 *s4) } memcpy((void*)0x0135A8F4, &s4->string_table, 0x2F51C); - memset((void*)0x013CA672, 0, 204); + memset((void*)RCT2_ADDRESS_STAFF_MODE_ARRAY, 0, 204); memcpy((void*)0x0138B580, &s4->map_animations, 0x258F2); memcpy((void*)0x013C6A72, &s4->patrol_areas, sizeof(s4->patrol_areas)); char *esi = (char*)0x13C6A72; - char *edi = (char*)0x13B0E72; + char *edi = (char*)RCT2_ADDRESS_STAFF_PATROL_AREAS; int ebx, edx = 116; do { ebx = 32; @@ -173,7 +173,7 @@ void rct1_import_s4(rct1_s4 *s4) memset(edi, 0, 64); edi += 64; } while (--edx); - memcpy((void*)0x013CA672, &s4->unk_1F42AA, 116); + memcpy((void*)RCT2_ADDRESS_STAFF_MODE_ARRAY, &s4->unk_1F42AA, 116); memcpy((void*)0x013CA73A, &s4->unk_1F431E, 4); memcpy((void*)0x013CA73E, &s4->unk_1F4322, 0x41EA); } diff --git a/src/ride/ride.c b/src/ride/ride.c index 7f37e4be6b..cf9e61188a 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4862,7 +4862,7 @@ foundRideEntry: if (!(flags & GAME_COMMAND_FLAG_APPLY)) { RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION; - RCT2_GLOBAL(0x009DEA5E, uint16) = 0x8000; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = 0x8000; return 0; } @@ -5063,7 +5063,7 @@ foundRideEntry: window_invalidate_by_class(WC_RIDE_LIST); RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION; - RCT2_GLOBAL(0x009DEA5E, uint16) = 0x8000; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = 0x8000; return 0; } @@ -5091,18 +5091,18 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi { uint8 ride_id = *(uint8*)edx; - RCT2_GLOBAL(0x009DEA5E, uint16) = 0; - RCT2_GLOBAL(0x009DEA60, uint16) = 0; - RCT2_GLOBAL(0x009DEA62, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = 0; rct_ride *ride = &g_ride_list[ride_id]; int x = 0, y = 0, z = 0; if(ride->overall_view != (uint16)-1){ x = ((ride->overall_view & 0xFF) * 32) + 16; y = ((ride->overall_view >> 8) * 32) + 16; z = map_element_height(x, y); - RCT2_GLOBAL(0x009DEA5E, uint16) = x; - RCT2_GLOBAL(0x009DEA60, uint16) = y; - RCT2_GLOBAL(0x009DEA62, uint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; } if(!(*ebx & 0x40) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) && !gConfigCheat.build_in_pause_mode){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; @@ -5198,9 +5198,9 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi ride->type = RIDE_TYPE_NULL; window_invalidate_by_class(WC_RIDE_LIST); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_VALUE, money32) = calculate_park_value(); - RCT2_GLOBAL(0x009DEA5E, uint16) = x; - RCT2_GLOBAL(0x009DEA60, uint16) = y; - RCT2_GLOBAL(0x009DEA62, uint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION * 4; return; }else{ @@ -6307,8 +6307,8 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio // When in known station num mode rideIndex is known and z is unknown RCT2_GLOBAL(0x009E32B8, uint32) = 0; - RCT2_GLOBAL(0x009DEA5E, sint16) = x; - RCT2_GLOBAL(0x009DEA60, sint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, sint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, sint16) = y; if (!sub_68B044()) { return MONEY32_UNDEFINED; @@ -6411,7 +6411,7 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio } z = ride->station_heights[station_num] * 8; - RCT2_GLOBAL(0x009DEA62, sint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, sint16) = z; if (flags & GAME_COMMAND_FLAG_APPLY && !(flags & 0x48)){ footpath_remove_litter(x, y, z); diff --git a/src/ride/track.c b/src/ride/track.c index c3eba159ff..d0d55b0fd0 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3181,9 +3181,9 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int int z = *edi; uint8 flags = *ebx; - RCT2_GLOBAL(0x009DEA5E, sint16) = x + 16; - RCT2_GLOBAL(0x009DEA60, sint16) = y + 16; - RCT2_GLOBAL(0x009DEA62, sint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, sint16) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, sint16) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, sint16) = z; if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED)){ if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ @@ -3483,9 +3483,9 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in rct_map_element *mapElement; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION * 4; - RCT2_GLOBAL(0x009DEA5E, uint16) = originX + 16; - RCT2_GLOBAL(0x009DEA60, uint16) = originY + 16; - RCT2_GLOBAL(0x009DEA62, uint16) = originZ; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = originX + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = originY + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = originZ; direction &= 3; RCT2_GLOBAL(0x00F441D5, uint32) = properties_1; RCT2_GLOBAL(0x00F441D9, uint32) = properties_2; @@ -3965,9 +3965,9 @@ void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, sint16 originZ, uint8 rotation, uint8 flags){ RCT2_GLOBAL(0x00141F56C, uint8) = 0; - RCT2_GLOBAL(0x009DEA5E, sint16) = originX + 16; - RCT2_GLOBAL(0x009DEA60, sint16) = originY + 16; - RCT2_GLOBAL(0x009DEA62, sint16) = originZ; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, sint16) = originX + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, sint16) = originY + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, sint16) = originZ; RCT2_GLOBAL(0x00F440E1, uint8) = sequence; switch (type){ @@ -4252,9 +4252,9 @@ void game_command_set_brakes_speed(int *eax, int *ebx, int *ecx, int *edx, int * brakesSpeed = ((*ebx >> 8) & 0xFF); RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION * 4; - RCT2_GLOBAL(0x009DEA5E, uint8) = x + 16; - RCT2_GLOBAL(0x009DEA60, uint8) = y + 16; - RCT2_GLOBAL(0x009DEA62, uint8) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint8) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint8) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint8) = z; if (*ebx & GAME_COMMAND_FLAG_APPLY) { *ebx = 0; diff --git a/src/windows/footpath.c b/src/windows/footpath.c index ed6fdaf397..e5bb79141c 100644 --- a/src/windows/footpath.c +++ b/src/windows/footpath.c @@ -759,10 +759,10 @@ static void window_footpath_place_path_at_point(int x, int y) if (cost == MONEY32_UNDEFINED) { RCT2_GLOBAL(RCT2_ADDRESS_PATH_ERROR_OCCURED, uint8) = 1; } else if (RCT2_GLOBAL(0x00F3EFD9, uint32) != 0) { - // bp = 0x009DEA62 - // dx = 0x009DEA60 - // cx = 0x009DEA5E - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(0x009DEA5E, uint16), RCT2_GLOBAL(0x009DEA60, uint16), RCT2_GLOBAL(0x009DEA62, uint16)); + // bp = RCT2_ADDRESS_COMMAND_MAP_Z + // dx = RCT2_ADDRESS_COMMAND_MAP_Y + // cx = RCT2_ADDRESS_COMMAND_MAP_X + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); } } diff --git a/src/windows/map.c b/src/windows/map.c index 165093cd99..dc3007b265 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -1284,7 +1284,7 @@ static void window_map_place_park_entrance_tool_down(int x, int y) sound_play_panned( SOUND_PLACE_ITEM, 0x8001, - RCT2_GLOBAL(0x009DEA62, uint16), + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16), RCT2_GLOBAL(0x009DEA64, uint16), RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) ); diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index 40256e37dd..b3f29fa920 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -374,9 +374,9 @@ static void window_maze_construction_entrance_tooldown(int x, int y, rct_window* sound_play_panned( SOUND_PLACE_ITEM, 0x8001, - RCT2_GLOBAL(0x009DEA5E, sint16), - RCT2_GLOBAL(0x009DEA60, sint16), - RCT2_GLOBAL(0x009DEA62, uint16)); + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, sint16), + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, sint16), + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); rct_ride* ride = GET_RIDE(rideIndex); if (ride_are_all_possible_entrances_and_exits_built(ride)){ diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 228e9b6e5c..3137441211 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -3629,9 +3629,9 @@ static void ride_construction_tooldown_entrance_exit(int screenX, int screenY) sound_play_panned( SOUND_PLACE_ITEM, 0x8001, - RCT2_GLOBAL(0x009DEA5E, uint16), - RCT2_GLOBAL(0x009DEA60, uint16), - RCT2_GLOBAL(0x009DEA62, uint16) + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) ); rct_ride *ride = GET_RIDE(RCT2_GLOBAL(0x00F44192, uint8)); diff --git a/src/windows/staff.c b/src/windows/staff.c index fd2d4bc17c..c6d8281479 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -557,7 +557,7 @@ void window_staff_overview_dropdown(rct_window *w, int widgetIndex, int dropdown for (int i = 0; i < 128; i++) { - RCT2_ADDRESS(0x13B0E72 + (peep->staff_id * 512), uint32)[i] = 0; + RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS + (peep->staff_id * 512), uint32)[i] = 0; } RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[peep->staff_id] &= ~2; diff --git a/src/windows/staff_list.c b/src/windows/staff_list.c index 68c3b8134a..dd84e3799e 100644 --- a/src/windows/staff_list.c +++ b/src/windows/staff_list.c @@ -347,7 +347,7 @@ static void window_staff_list_tooldown(rct_window *w, int widgetIndex, int x, in continue; if (isPatrolAreaSet) { - if (!(gStaffModes[peep->staff_id] & 2)) { + if (!(RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[peep->staff_id] & 2)) { continue; } if (!mechanic_is_location_in_patrol(peep, x, y)) { diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 6c93cb0e0f..f1b94142f5 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -1467,7 +1467,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w if (cost != MONEY32_UNDEFINED){ window_close_by_class(WC_ERROR); - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(0x009DEA5E, uint16), RCT2_GLOBAL(0x009DEA60, uint16), RCT2_GLOBAL(0x009DEA62, uint16)); + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); success = 1; break; } @@ -1481,7 +1481,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w } if (!success && !window_scenery_is_build_cluster_tool_on){ - sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(0x009DEA5E, uint16), RCT2_GLOBAL(0x009DEA60, uint16), RCT2_GLOBAL(0x009DEA62, uint16)); + sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); return; } @@ -1504,7 +1504,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w return; } - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(0x009DEA5E, uint16), RCT2_GLOBAL(0x009DEA60, uint16), RCT2_GLOBAL(0x009DEA62, uint16)); + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); break; } case 2: @@ -1529,7 +1529,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w if (cost != MONEY32_UNDEFINED){ window_close_by_class(WC_ERROR); - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(0x009DEA5E, uint16), RCT2_GLOBAL(0x009DEA60, uint16), RCT2_GLOBAL(0x009DEA62, uint16)); + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); return; } @@ -1541,7 +1541,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) += 8; } - sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(0x009DEA5E, uint16), RCT2_GLOBAL(0x009DEA60, uint16), RCT2_GLOBAL(0x009DEA62, uint16)); + sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); break; } case 3: @@ -1567,7 +1567,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w if (cost != MONEY32_UNDEFINED){ window_close_by_class(WC_ERROR); - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(0x009DEA5E, uint16), RCT2_GLOBAL(0x009DEA60, uint16), RCT2_GLOBAL(0x009DEA62, uint16)); + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); return; } @@ -1579,7 +1579,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) += 8; } - sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(0x009DEA5E, uint16), RCT2_GLOBAL(0x009DEA60, uint16), RCT2_GLOBAL(0x009DEA62, uint16)); + sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); } break; case 4: @@ -1598,7 +1598,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w if (cost == MONEY32_UNDEFINED)return; - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(0x009DEA5E, uint16), RCT2_GLOBAL(0x009DEA60, uint16), RCT2_GLOBAL(0x009DEA62, uint16)); + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); window_banner_open(banner_id); break; diff --git a/src/world/footpath.c b/src/world/footpath.c index 1bfd7e83d0..585897a0f1 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -145,7 +145,7 @@ static money32 footpath_element_insert(int type, int x, int y, int z, int slope, return MONEY32_UNDEFINED; if ((flags & GAME_COMMAND_FLAG_APPLY) && !(flags & (GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_GHOST))) - footpath_remove_litter(x, y, RCT2_GLOBAL(0x009DEA62, uint16)); + footpath_remove_litter(x, y, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); // loc_6A649D: RCT2_GLOBAL(0x00F3EFD9, money32) += MONEY(12, 00); @@ -312,9 +312,9 @@ static money32 footpath_place_real(int type, int x, int y, int z, int slope, int rct_map_element *mapElement; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; - RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; - RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; - RCT2_GLOBAL(0x009DEA62, uint16) = z * 8; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z * 8; if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; @@ -376,9 +376,9 @@ money32 footpath_remove_real(int x, int y, int z, int flags) rct_map_element *mapElement; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; - RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; - RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; - RCT2_GLOBAL(0x009DEA62, uint16) = z * 8; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z * 8; if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; diff --git a/src/world/map.c b/src/world/map.c index 9a6d56043d..f144dda8d7 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -873,9 +873,9 @@ void game_command_remove_scenery(int* eax, int* ebx, int* ecx, int* edx, int* es cost = entry->small_scenery.removal_price * 10; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; - RCT2_GLOBAL(0x009DEA5E, uint32) = x + 16; - RCT2_GLOBAL(0x009DEA60, uint32) = y + 16; - RCT2_GLOBAL(0x009DEA62, uint32) = base_height * 8; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = base_height * 8; if (!(*ebx & 0x40) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; @@ -894,7 +894,7 @@ void game_command_remove_scenery(int* eax, int* ebx, int* ecx, int* edx, int* es } // Check if the land is owned - if (!map_is_location_owned(x, y, RCT2_GLOBAL(0x009DEA62, uint32))){ + if (!map_is_location_owned(x, y, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32))){ *ebx = MONEY32_UNDEFINED; return; } @@ -932,9 +932,9 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i int x = *eax; int y = *ecx; int z = map_element_height(x, y); - RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; - RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; - RCT2_GLOBAL(0x009DEA62, uint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; if (!(*ebx & 0x40) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { @@ -1061,9 +1061,9 @@ void game_command_remove_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi uint8 banner_position = *edx >> 8; int z = base_height * 8; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; - RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; - RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; - RCT2_GLOBAL(0x009DEA62, uint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; if(!(*ebx & 0x40) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; *ebx = MONEY32_UNDEFINED; @@ -1111,9 +1111,9 @@ void game_command_set_scenery_colour(int* eax, int* ebx, int* ecx, int* edx, int uint8 color1 = *ebp; uint8 color2 = *ebp >> 8; int z = base_height * 8; - RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; - RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; - RCT2_GLOBAL(0x009DEA62, uint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode){ if (!map_is_location_owned(x, y, z)){ *ebx = MONEY32_UNDEFINED; @@ -1162,9 +1162,9 @@ void game_command_set_fence_colour(int* eax, int* ebx, int* ecx, int* edx, int* uint8 color2 = *ebp; uint8 color3 = *ebp >> 8; int z = base_height * 8; - RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; - RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; - RCT2_GLOBAL(0x009DEA62, uint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; if((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || map_is_location_in_park(x, y) || gCheatsSandboxMode){ rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); while(map_element_get_type(map_element) != MAP_ELEMENT_TYPE_FENCE || @@ -1215,9 +1215,9 @@ void game_command_set_large_scenery_colour(int* eax, int* ebx, int* ecx, int* ed uint8 color1 = *ebp; uint8 color2 = *ebp >> 8; int z = map_element_height(x, y); - RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; - RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; - RCT2_GLOBAL(0x009DEA62, uint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); @@ -1330,9 +1330,9 @@ void game_command_set_banner_colour(int* eax, int* ebx, int* ecx, int* edx, int* uint8 banner_position = *edx >> 8; uint8 color = *ebp; int z = (base_height * 8); - RCT2_GLOBAL(0x009DEA5E, uint16) = x + 16; - RCT2_GLOBAL(0x009DEA60, uint16) = y + 16; - RCT2_GLOBAL(0x009DEA62, uint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode){ if (!map_is_location_owned(x, y, z - 16)){ @@ -1468,9 +1468,9 @@ money32 map_clear_scenery(int x0, int y0, int x1, int y1, int clear, int flags) x = (x0 + x1) / 2 + 16; y = (y0 + y1) / 2 + 16; z = map_element_height(x, y); - RCT2_GLOBAL(0x009DEA5E, uint16) = x; - RCT2_GLOBAL(0x009DEA60, uint16) = y; - RCT2_GLOBAL(0x009DEA62, uint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; x0 = max(x0, 32); y0 = max(y0, 32); @@ -1529,9 +1529,9 @@ money32 map_change_surface_style(int x0, int y0, int x1, int y1, uint8 surfaceSt int heightMid = map_element_height(xMid, yMid); - RCT2_GLOBAL(0x009DEA5E, uint16) = xMid; - RCT2_GLOBAL(0x009DEA60, uint16) = yMid; - RCT2_GLOBAL(0x009DEA62, uint16) = heightMid; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = xMid; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = yMid; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = heightMid; RCT2_GLOBAL(0x009E32B4, uint32) = 0; money32 cost = 0; @@ -1759,9 +1759,9 @@ money32 raise_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b } RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; - RCT2_GLOBAL(0x009DEA5E, uint32) = x; - RCT2_GLOBAL(0x009DEA60, uint32) = y; - RCT2_GLOBAL(0x009DEA62, uint32) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = x; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = z; return cost; } @@ -1823,9 +1823,9 @@ money32 lower_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b } RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; - RCT2_GLOBAL(0x009DEA5E, uint32) = x; - RCT2_GLOBAL(0x009DEA60, uint32) = y; - RCT2_GLOBAL(0x009DEA62, uint32) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = x; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = z; return cost; } @@ -1887,9 +1887,9 @@ money32 raise_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags) z = water_height_z; if (z != 0) z = base_height_z; - RCT2_GLOBAL(0x009DEA5E, uint32) = x; - RCT2_GLOBAL(0x009DEA60, uint32) = y; - RCT2_GLOBAL(0x009DEA62, uint32) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = x; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = z; sound_play_panned(SOUND_LAYING_OUT_WATER, 0x8001, x, y, z); } @@ -1949,9 +1949,9 @@ money32 lower_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags) z = water_height_z; if (z == 0) z = base_height_z; - RCT2_GLOBAL(0x009DEA5E, uint32) = x; - RCT2_GLOBAL(0x009DEA60, uint32) = y; - RCT2_GLOBAL(0x009DEA62, uint32) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = x; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = z; sound_play_panned(SOUND_LAYING_OUT_WATER, 0x8001, x, y, z); } @@ -2036,9 +2036,9 @@ void game_command_set_water_height(int* eax, int* ebx, int* ecx, int* edx, int* int y = *ecx; uint8 base_height = *edx; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; - RCT2_GLOBAL(0x009DEA5E, sint16) = x + 16; - RCT2_GLOBAL(0x009DEA60, sint16) = y + 16; - RCT2_GLOBAL(0x009DEA62, uint32) = base_height * 8; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, sint16) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, sint16) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = base_height * 8; if(RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; *ebx = MONEY32_UNDEFINED; @@ -2170,9 +2170,9 @@ void game_command_place_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi, uint8 edge = *edx >> 8; uint8 colour = *edi; uint8 type = *ebx >> 8; - RCT2_GLOBAL(0x009DEA5E, uint32) = x + 16; - RCT2_GLOBAL(0x009DEA60, uint32) = y + 16; - RCT2_GLOBAL(0x009DEA62, uint32) = base_height * 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = base_height * 16; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; if(RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0 || gConfigCheat.build_in_pause_mode){ if(sub_68B044() && x < 8192 && y < 8192){ @@ -2263,15 +2263,15 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi if(base_height & 0xFFFF0000){ base_height >>= 16; } - RCT2_GLOBAL(0x009DEA5E, uint16) = x; - RCT2_GLOBAL(0x009DEA60, uint16) = y; - RCT2_GLOBAL(0x009DEA62, uint16) = base_height; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = base_height; if(F64EC8){ base_height = F64EC8; - RCT2_GLOBAL(0x009DEA62, uint16) = base_height; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = base_height; } - RCT2_GLOBAL(0x009DEA5E, uint16) += 16; - RCT2_GLOBAL(0x009DEA60, uint16) += 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) += 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) += 16; if(RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0 || gConfigCheat.build_in_pause_mode){ if(sub_68B044()){ if(RCT2_GLOBAL(0x009D8150, uint8) & 1 || (x <= RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16) && y <= RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16))){ @@ -2474,12 +2474,12 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; // Banner index *not used* RCT2_GLOBAL(0x00141F728, uint8) = 0xFF; - RCT2_GLOBAL(0x009DEA5E, sint16) = position.x + 16; - RCT2_GLOBAL(0x009DEA60, sint16) = position.y + 16; - RCT2_GLOBAL(0x009DEA62, sint16) = position.z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, sint16) = position.x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, sint16) = position.y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, sint16) = position.z; if (position.z == 0){ - RCT2_GLOBAL(0x009DEA62, sint16) = map_element_height(position.x, position.y) & 0xFFFF; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, sint16) = map_element_height(position.x, position.y) & 0xFFFF; } if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ @@ -2724,9 +2724,9 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in uint8 rotation = *ebx >> 8; uint8 entry_index = *edi; int base_height = map_element_height(x, y); - RCT2_GLOBAL(0x009DEA5E, sint16) = x + 16; - RCT2_GLOBAL(0x009DEA60, sint16) = y + 16; - RCT2_GLOBAL(0x009DEA62, sint16) = base_height; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, sint16) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, sint16) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, sint16) = base_height; RCT2_GLOBAL(0x00F64F14, uint8) = 0; uint8 banner_id = 0xFF; RCT2_GLOBAL(0x00F4389A, uint32) = 0; @@ -2803,7 +2803,7 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in if(z != 0){ F43884 = z; } - RCT2_GLOBAL(0x009DEA62, sint16) = F43884; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, sint16) = F43884; tile = scenery_entry->large_scenery.tiles; uint8 tile_num = 0; do{ diff --git a/src/world/park.c b/src/world/park.c index c0ebba6acc..27f3fb5cfd 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -812,9 +812,9 @@ void game_command_remove_park_entrance(int *eax, int *ebx, int *ecx, int *edx, i z = *edx * 16; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LAND_PURCHASE * 4; - RCT2_GLOBAL(0x009DEA5E, uint16) = x; - RCT2_GLOBAL(0x009DEA60, uint16) = y; - RCT2_GLOBAL(0x009DEA62, uint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; if (!(*ebx & GAME_COMMAND_FLAG_APPLY)) { *ebx = 0; @@ -1103,9 +1103,9 @@ int map_buy_land_rights(int x0, int y0, int x1, int y1, int setting, int flags) x = (x0 + x1) / 2 + 16; y = (y0 + y1) / 2 + 16; z = map_element_height(x, y); - RCT2_GLOBAL(0x009DEA5E, uint16) = x; - RCT2_GLOBAL(0x009DEA60, uint16) = y; - RCT2_GLOBAL(0x009DEA62, uint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; // Game command modified to accept selection size totalCost = 0; diff --git a/src/world/sprite.c b/src/world/sprite.c index 2d676fbe3a..5256b817bf 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -467,9 +467,9 @@ void money_effect_create(money32 value) rct_viewport *mainViewport; rct_xyz16 mapPosition; - mapPosition.x = RCT2_GLOBAL(0x009DEA5E, uint16); - mapPosition.y = RCT2_GLOBAL(0x009DEA60, uint16); - mapPosition.z = RCT2_GLOBAL(0x009DEA62, uint16); + mapPosition.x = RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16); + mapPosition.y = RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16); + mapPosition.z = RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16); if (mapPosition.x == (sint16)0x8000) { mainWindow = window_get_main(); if (mainWindow == NULL) From 02e2ebec9aca252cb93a09efc72dce03881aaa04 Mon Sep 17 00:00:00 2001 From: medsouz Date: Sun, 16 Aug 2015 18:35:47 -0400 Subject: [PATCH 0544/1173] Restore globals --- src/peep/staff.c | 5 ++++- src/peep/staff.h | 3 +++ src/windows/staff_list.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/peep/staff.c b/src/peep/staff.c index 28807aa125..6758a86d8d 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -29,6 +29,9 @@ #include "peep.h" #include "staff.h" +uint32 *gStaffPatrolAreas = (uint32*)0x013B0E72; +uint8 *gStaffModes = (uint8*)0x013CA672; + /** * * rct2: 0x006BD3A4 @@ -478,5 +481,5 @@ bool staff_is_patrol_area_set(int staffIndex, int x, int y) int peepOffset = staffIndex * 128; int offset = (x | y) >> 5; int bitIndex = (x | y) & 0x1F; - return RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS, uint32)[peepOffset + offset] & (1 << bitIndex); + return gStaffPatrolAreas[peepOffset + offset] & (1 << bitIndex); } diff --git a/src/peep/staff.h b/src/peep/staff.h index 85d4813f2d..68b2b32321 100644 --- a/src/peep/staff.h +++ b/src/peep/staff.h @@ -49,6 +49,9 @@ enum STAFF_ORDERS{ STAFF_ORDERS_FIX_RIDES = (1 << 1) }; +extern uint32 *gStaffPatrolAreas; +extern uint8 *gStaffModes; + void game_command_update_staff_colour(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_hire_new_staff_member(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_staff_order(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); diff --git a/src/windows/staff_list.c b/src/windows/staff_list.c index dd84e3799e..68c3b8134a 100644 --- a/src/windows/staff_list.c +++ b/src/windows/staff_list.c @@ -347,7 +347,7 @@ static void window_staff_list_tooldown(rct_window *w, int widgetIndex, int x, in continue; if (isPatrolAreaSet) { - if (!(RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[peep->staff_id] & 2)) { + if (!(gStaffModes[peep->staff_id] & 2)) { continue; } if (!mechanic_is_location_in_patrol(peep, x, y)) { From 719b897936fb41279b1dba10f9a48ea914ab609a Mon Sep 17 00:00:00 2001 From: medsouz Date: Sun, 16 Aug 2015 18:37:57 -0400 Subject: [PATCH 0545/1173] Named addresses in staff.c globals --- src/peep/staff.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/peep/staff.c b/src/peep/staff.c index 6758a86d8d..5eea938e27 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -29,8 +29,8 @@ #include "peep.h" #include "staff.h" -uint32 *gStaffPatrolAreas = (uint32*)0x013B0E72; -uint8 *gStaffModes = (uint8*)0x013CA672; +uint32 *gStaffPatrolAreas = (uint32*)RCT2_ADDRESS_STAFF_PATROL_AREAS; +uint8 *gStaffModes = (uint8*)RCT2_ADDRESS_STAFF_MODE_ARRAY; /** * From 3b845a67edbf823f618ce167039a56ca73427eba Mon Sep 17 00:00:00 2001 From: medsouz Date: Sun, 16 Aug 2015 19:26:42 -0400 Subject: [PATCH 0546/1173] Add option for handymen to mow grass by default --- data/language/english_uk.txt | 3 ++- src/config.c | 1 + src/config.h | 1 + src/peep/staff.c | 5 +++++ src/windows/options.c | 18 ++++++++++++++---- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 50f8fe9e33..e609ee119b 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3844,4 +3844,5 @@ STR_5502 :Multiplayer STR_5503 :Enter hostname or IP address: STR_5504 :{SMALLFONT}{BLACK}Show multiplayer status STR_5505 :Unable to connect to server. -STR_5506 :Guests ignore intensities \ No newline at end of file +STR_5506 :Guests ignore intensities +STR_5507 :Handymen mow grass by default \ No newline at end of file diff --git a/src/config.c b/src/config.c index 45ad23d82d..e671d59033 100644 --- a/src/config.c +++ b/src/config.c @@ -184,6 +184,7 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, no_test_crashes), "no_test_crashes", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, date_format), "date_format", CONFIG_VALUE_TYPE_UINT8, DATE_FORMAT_DMY, _dateFormatEnum }, { offsetof(general_configuration, auto_staff_placement), "auto_staff", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(general_configuration, handymen_mow_default), "handymen_mow_default", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, last_run_version), "last_run_version", CONFIG_VALUE_TYPE_STRING, { .value_string = NULL }, NULL }, { offsetof(general_configuration, invert_viewport_drag), "invert_viewport_drag", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, load_save_sort), "load_save_sort", CONFIG_VALUE_TYPE_UINT8, SORT_NAME_ASCENDING, NULL }, diff --git a/src/config.h b/src/config.h index 1367427c61..35ed2e74c5 100644 --- a/src/config.h +++ b/src/config.h @@ -157,6 +157,7 @@ typedef struct { uint8 no_test_crashes; uint8 date_format; uint8 auto_staff_placement; + uint8 handymen_mow_default; utf8string last_run_version; uint8 invert_viewport_drag; uint8 load_save_sort; diff --git a/src/peep/staff.c b/src/peep/staff.c index 5eea938e27..325f801300 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -274,6 +274,11 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, } } + if(staff_type == STAFF_TYPE_HANDYMAN && gConfigGeneral.handymen_mow_default) { + int flags = ((newPeep->staff_orders ^ (1 << 3)) << 8) | 1; + game_do_command(newPeep->x, flags, newPeep->y, newPeep->sprite_index, GAME_COMMAND_SET_STAFF_ORDER, (int)newPeep, 0); + } + *ebx = 0; *edi = newPeep->sprite_index; } diff --git a/src/windows/options.c b/src/windows/options.c index fc62925905..62acfdb030 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -134,6 +134,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_AUTOSAVE_DROPDOWN, WIDX_TEST_UNFINISHED_TRACKS, WIDX_AUTO_STAFF_PLACEMENT, + WIDX_HANDYMEN_MOW_DEFAULT, WIDX_DEBUGGING_TOOLS, WIDX_TITLE_SEQUENCE, WIDX_TITLE_SEQUENCE_DROPDOWN, @@ -245,10 +246,11 @@ static rct_widget window_options_misc_widgets[] = { { WWT_DROPDOWN_BUTTON, 1, 288, 298, 84, 93, 876, STR_NONE }, { WWT_CHECKBOX, 2, 10, 299, 114, 125, 5155, 5156 }, // test unfinished tracks { WWT_CHECKBOX, 2, 10, 299, 129, 140, 5343, STR_NONE }, // auto staff placement - { WWT_CHECKBOX, 2, 10, 299, 144, 155, 5150, STR_NONE }, // enabled debugging tools - { WWT_DROPDOWN, 1, 155, 299, 158, 169, STR_NONE, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 159, 168, 876, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 26, 185, 174, 185, 5436, STR_NONE }, // Title sequences button + { WWT_CHECKBOX, 2, 10, 299, 144, 155, 5507, STR_NONE }, // handymen mow by default + { WWT_CHECKBOX, 2, 10, 299, 159, 170, 5150, STR_NONE }, // enabled debugging tools + { WWT_DROPDOWN, 1, 155, 299, 173, 184, STR_NONE, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 174, 183, 876, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 26, 185, 189, 200, 5436, STR_NONE }, // Title sequences button { WIDGETS_END }, }; @@ -398,6 +400,7 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_AUTOSAVE_DROPDOWN) | (1 << WIDX_TEST_UNFINISHED_TRACKS) | (1 << WIDX_AUTO_STAFF_PLACEMENT) | + (1 << WIDX_HANDYMEN_MOW_DEFAULT) | (1 << WIDX_DEBUGGING_TOOLS) | (1 << WIDX_TITLE_SEQUENCE) | (1 << WIDX_TITLE_SEQUENCE_DROPDOWN) | @@ -615,6 +618,11 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) config_save_default(); window_invalidate(w); break; + case WIDX_HANDYMEN_MOW_DEFAULT: + gConfigGeneral.handymen_mow_default = !gConfigGeneral.handymen_mow_default; + config_save_default(); + window_invalidate(w); + break; case WIDX_TITLE_SEQUENCE_BUTTON: window_title_editor_open(0); } @@ -1221,6 +1229,7 @@ static void window_options_invalidate(rct_window *w) widget_set_checkbox_value(w, WIDX_SAVE_PLUGIN_DATA_CHECKBOX, gConfigGeneral.save_plugin_data); widget_set_checkbox_value(w, WIDX_TEST_UNFINISHED_TRACKS, gConfigGeneral.test_unfinished_tracks); widget_set_checkbox_value(w, WIDX_AUTO_STAFF_PLACEMENT, gConfigGeneral.auto_staff_placement); + widget_set_checkbox_value(w, WIDX_HANDYMEN_MOW_DEFAULT, gConfigGeneral.handymen_mow_default); widget_set_checkbox_value(w, WIDX_DEBUGGING_TOOLS, gConfigGeneral.debugging_tools); window_options_misc_widgets[WIDX_REAL_NAME_CHECKBOX].type = WWT_CHECKBOX; @@ -1229,6 +1238,7 @@ static void window_options_invalidate(rct_window *w) window_options_misc_widgets[WIDX_AUTOSAVE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; window_options_misc_widgets[WIDX_TEST_UNFINISHED_TRACKS].type = WWT_CHECKBOX; window_options_misc_widgets[WIDX_AUTO_STAFF_PLACEMENT].type = WWT_CHECKBOX; + window_options_misc_widgets[WIDX_HANDYMEN_MOW_DEFAULT].type = WWT_CHECKBOX; window_options_misc_widgets[WIDX_DEBUGGING_TOOLS].type = WWT_CHECKBOX; window_options_misc_widgets[WIDX_TITLE_SEQUENCE].type = WWT_DROPDOWN; window_options_misc_widgets[WIDX_TITLE_SEQUENCE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; From 00ab8be6af143678c65678ac3fee51780d86c9a2 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 17 Aug 2015 04:00:16 +0100 Subject: [PATCH 0547/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 11 +- data/language/dutch.txt | 13 + data/language/english_us.txt | 44 +- data/language/german.txt | 15 + data/language/korean.txt | 3486 ++++++++++++------------- data/language/russian.txt | 3463 ++++++++++++++++++++++++ 6 files changed, 5269 insertions(+), 1763 deletions(-) create mode 100644 data/language/russian.txt diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index acbadadf68..31b3a99d94 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3487,7 +3487,7 @@ STR_5145 :更快速度 STR_5146 :超快速度 STR_5147 :密技 STR_5148 :{SMALLFONT}{BLACK}改變遊戲速度 -STR_5149 :{SMALLFONT}{BLACK}開啟密技視窗 +STR_5149 :{SMALLFONT}{BLACK}顯示密技選項 STR_5150 :啟用除錯工具 STR_5151 :, STR_5152 :. @@ -3833,7 +3833,14 @@ STR_5490 :失去焦點時靜音 STR_5491 :研發列表 STR_5492 :劇情選項 STR_5493 :發送訊息 -STR_5494 :請輸入你要發送的訊息. +STR_5494 : STR_5495 :玩家列表 STR_5496 :玩家: STR_5497 :延遲值 (Ping): +STR_5498 :伺服器列表 +STR_5499 :玩家名稱: +STR_5500 :新增伺服器 +STR_5501 :開始伺服器 +STR_5502 :多人連線模式 +STR_5503 :請輸入主機名稱或IP地址: +STR_5504 :{SMALLFONT}{BLACK}顯示多人連線狀態 diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 3b68762b2c..5625dfccd8 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3825,3 +3825,16 @@ STR_5489 :{SMALLFONT}{BLACK}Enkel bezoekers die gevolgd worden weergeven STR_5490 :Geluid dempen bij focusverlies STR_5491 :Uitvindingenlijst STR_5492 :Scenario-opties +STR_5493 :Bericht verzenden +STR_5494 : +STR_5495 :Spelerslijst +STR_5496 :Speler: +STR_5497 :Ping: +STR_5498 :Serverlijst +STR_5499 :Spelersnaam: +STR_5500 :Server toevoegen +STR_5501 :Server starten +STR_5502 :Multiplayer +STR_5503 :Hostnaam of IP-adres invoeren: +STR_5504 :{SMALLFONT}{BLACK}Status multiplayer tonen +STR_5505 :Kan niet met de server verbinden. diff --git a/data/language/english_us.txt b/data/language/english_us.txt index dd3b1924fa..933b0c2af6 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -2321,10 +2321,10 @@ STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) STR_2314 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks -STR_2317 :{WINDOW_COLOUR_2}Sound Quality: -STR_2318 :Low -STR_2319 :Medium -STR_2320 :High +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} @@ -2441,12 +2441,12 @@ STR_2433 :{BLACK}Vouchers for free {STRINGID} STR_2434 :{BLACK}Advertising campaign for {STRINGID} STR_2435 :{BLACK}Advertising campaign for {STRINGID} STR_2436 :1 week -STR_2437 :2 weeks -STR_2438 :3 weeks -STR_2439 :4 weeks -STR_2440 :5 weeks -STR_2441 :6 weeks -STR_2442 :{BLACK}({STRINGID} remaining) +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : +STR_2442 : STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} STR_2445 :Start this marketing campaign @@ -2978,8 +2978,8 @@ STR_2965 :{WINDOW_COLOUR_2} STR_2966 : STR_2967 : STR_2968 : -STR_2969 :Use of this product is subject to the terms of a license agreement -STR_2970 :found in the product's {OPENQUOTES}ReadMe{ENDQUOTES} file and in the manual +STR_2969 : +STR_2970 : STR_2971 :Main color scheme STR_2972 :Alternative color scheme 1 STR_2973 :Alternative color scheme 2 @@ -3346,7 +3346,7 @@ STR_3333 :Export plug-in objects with saved games STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles STR_3336 :Track Designs Manager - Select Ride Type -STR_3337 :Six Flags Park +STR_3337 : STR_3338 :{BLACK}Custom-designed layout STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout @@ -3371,8 +3371,8 @@ STR_3358 :Can't delete track design... STR_3359 :{BLACK}No track designs of this type STR_3360 :Warning! STR_3361 :Too many track designs of this type - Some will not be listed. -STR_3362 :Forced Software Buffer Mixing -STR_3363 :{SMALLFONT}{BLACK}Select this option to improve performance if the game pauses slightly when sounds start or interference is heard +STR_3362 : +STR_3363 : STR_3364 :Advanced STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups STR_3366 :{BLACK}= Ride @@ -3462,7 +3462,7 @@ STR_5120 :Finances STR_5121 :Research STR_5122 :Select rides by track type (like in RCT1) STR_5123 :Renew rides -STR_5124 :No Six Flags +STR_5124 : STR_5125 :All destructable STR_5126 :Random title music STR_5127 :{SMALLFONT}{BLACK}Disable land elevation @@ -3834,7 +3834,15 @@ STR_5490 :Disable audio on focus loss STR_5491 :Inventions list STR_5492 :Scenario options STR_5493 :Send Message -STR_5494 :Enter the message you would like to send. +STR_5494 : STR_5495 :Player List STR_5496 :Player: -STR_5497 :Ping: \ No newline at end of file +STR_5497 :Ping: +STR_5498 :Server List +STR_5499 :Player Name: +STR_5500 :Add Server +STR_5501 :Start Server +STR_5502 :Multiplayer +STR_5503 :Enter hostname or IP address: +STR_5504 :{SMALLFONT}{BLACK}Show multiplayer status +STR_5505 :Unable to connect to server. diff --git a/data/language/german.txt b/data/language/german.txt index 56ae6e57a8..eb2027c0c7 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3822,3 +3822,18 @@ STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}Aktuelle Nachrichten anzeigen STR_5488 :Kein Eingang +STR_5489 :{SMALLFONT}{BLACK}Nur überwachte Gäste anzeigen +STR_5490 :Audio deaktivieren, wenn Spiel nicht im Vordergrund +STR_5491 :Erfindungsliste +STR_5492 :Szenario-Optionen +STR_5493 :Nachricht senden +STR_5494 :Zu versendende Nachricht eingeben. +STR_5495 :Spielerliste +STR_5496 :Spieler: +STR_5497 :Ping: +STR_5498 :Serverliste +STR_5499 :Spielername: +STR_5500 :Server hinzufügen +STR_5501 :Server starten +STR_5502 :Multiplayer +STR_5503 :Hostnamen oder IP-Adresse eingeben: diff --git a/data/language/korean.txt b/data/language/korean.txt index f80bfcc2f8..be89d7c594 100644 --- a/data/language/korean.txt +++ b/data/language/korean.txt @@ -521,7 +521,7 @@ STR_0516 :A gentle 롤러코스터 for people who haven't yet got the courage STR_0517 :Passengers 라이드 in 미니ature trains along a narrow-gauge railway track STR_0518 :Passengers travel in electric trains along a monorail track STR_0519 :Passengers 라이드 in small cars hanging beneath the single-rail track, swinging freely from side to side around corners -STR_0520 :A dock platform where 손님s can drive/row personal watercraft on a body of water +STR_0520 :A dock platform where 손님 can drive/row personal watercraft on a body of water STR_0521 :A fast and twisting 롤러코스터 with tight turns and steep drops. Intensity is bound to be high. STR_0522 :A smaller 롤러코스터 where the 라이더 sit above the track with no car around them STR_0523 :라이더 travel slowly in powered vehicles along a track-based route @@ -555,9 +555,9 @@ STR_0550 : STR_0551 : STR_0552 : STR_0553 : -STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station -STR_0555 :손님s 라이드 in an elevator up or down a vertical tower to get from one level to another -STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall 롤러코스터 experience +STR_0554 :차량이 선형 유도 모터에 의해 긴 평지 트랙을 따라 가속된 뒤, 수직 상승 트랙에 의해 위로 상승한 뒤 다시 뒤로 자유낙하여 탑승장에 돌아옵니다 +STR_0555 :손님은 엘리베이터에 탑승하여 한쪽에서 다른쪽으로 이동할 수 있습니다 +STR_0556 :폭이 넓은 차량이 수직으로 기울어진 트랙을 따라 내려오면서 극강의 자유 낙하 롤러코스터를 경험하게 해줍니다 STR_0557 : STR_0558 : STR_0559 : @@ -839,16 +839,16 @@ STR_0834 :{SMALLFONT}{BLACK}디스크 및 게임 옵션 STR_0835 :게임 초기화 실패 STR_0836 :게임을 최소화 상태에서 실행할 수 없습니다 STR_0837 :그래픽 시스템을 초기화할 수 없습니다 -STR_0838 : +STR_0838 :<더 이상 사용하지 않음> STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} # The following six strings were used for display resolutions, but have been replaced. -STR_0841 : -STR_0842 : -STR_0843 : -STR_0844 : -STR_0845 : -STR_0846 : +STR_0841 :<더 이상 사용하지 않음> +STR_0842 :<더 이상 사용하지 않음> +STR_0843 :<더 이상 사용하지 않음> +STR_0844 :<더 이상 사용하지 않음> +STR_0845 :<더 이상 사용하지 않음> +STR_0846 :<더 이상 사용하지 않음> STR_0847 :'OpenRCT2'에 대해서 STR_0848 :롤러코스터 타이쿤 2 STR_0849 :{WINDOW_COLOUR_2}버전 2.01.028 @@ -1176,7 +1176,7 @@ STR_1170 :{STRING} STR_1171 :{RED}닫음 - - STR_1172 :{YELLOW}{STRINGID} - - STR_1173 :{SMALLFONT}{BLACK}보도와 대기줄을 만듭니다 -STR_1174 :배너 사인이 있습니다 +STR_1174 :전광판 사인이 있습니다 STR_1175 :경사진 보도 위에 건설할 수 없습니다 STR_1176 :보도를 여기에 건설할 수 없습니다... STR_1177 :보도를 제거할 수 없습니다... @@ -1594,8 +1594,8 @@ STR_1588 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 핫 초코는 가격이 STR_1589 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 아이스 티는 가격이 참 적당한 것 같아{ENDQUOTES} STR_1590 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 휜넬 케이크는 가격이 참 적당한 것 같아{ENDQUOTES} STR_1591 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 선글라스는 가격이 참 적당한 것 같아{ENDQUOTES} -STR_1592 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 고기 국수는 가격이 참 적당한 것 같아{ENDQUOTES} -STR_1593 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 볶음밥은 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1592 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 고기국수는 가격이 참 적당한 것 같아{ENDQUOTES} +STR_1593 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 볶음쌀국수은 가격이 참 적당한 것 같아{ENDQUOTES} STR_1594 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 만둣국은 가격이 참 적당한 것 같아{ENDQUOTES} STR_1595 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 미트볼 스프는 가격이 참 적당한 것 같아{ENDQUOTES} STR_1596 :{SMALLFONT}{OPENQUOTES}{STRINGID}에서 산 과일 주스는 가격이 참 적당한 것 같아{ENDQUOTES} @@ -1627,7 +1627,7 @@ STR_1621 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 아이스 티에 돈을 쓰고 STR_1622 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 휜넬 케이크에 돈을 쓰고 싶지 않아{ENDQUOTES} STR_1623 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 선글라스에 돈을 쓰고 싶지 않아{ENDQUOTES} STR_1624 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 고기 국수에 돈을 쓰고 싶지 않아{ENDQUOTES} -STR_1625 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 볶음밥에 돈을 쓰고 싶지 않아{ENDQUOTES} +STR_1625 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 볶음쌀국수에 돈을 쓰고 싶지 않아{ENDQUOTES} STR_1626 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 만둣국에 돈을 쓰고 싶지 않아{ENDQUOTES} STR_1627 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 미트볼 스프에 돈을 쓰고 싶지 않아{ENDQUOTES} STR_1628 :{SMALLFONT}{OPENQUOTES}{STRINGID}의 과일 주스에 돈을 쓰고 싶지 않아{ENDQUOTES} @@ -1699,836 +1699,836 @@ STR_1693 :{SMALLFONT}{BLACK}손님 STR_1694 :{SMALLFONT}{BLACK}직원 STR_1695 :{SMALLFONT}{BLACK}수익 및 지출 STR_1696 :{SMALLFONT}{BLACK}고객 정보 -STR_1697 :Cannot place these on queue line area -STR_1698 :Can only place these on queue area +STR_1697 :대기줄에 놓을 수 없습니다 +STR_1698 :대기줄에만 놓을 수 있습니다 STR_1699 :게임에 사람이 너무 많습니다 STR_1700 :새 미화원 고용 STR_1701 :새 정비기술자 고용 STR_1702 :새 경비원 고용 STR_1703 :새 엔터테이너 고용 STR_1704 :새 직원을 고용할 수 없습니다... -STR_1705 :{SMALLFONT}{BLACK}Sack this staff member -STR_1706 :{SMALLFONT}{BLACK}Move this person to a new location -STR_1707 :Too many staff in game -STR_1708 :{SMALLFONT}{BLACK}Set patrol area for this staff member -STR_1709 :Sack staff +STR_1705 :{SMALLFONT}{BLACK}이 직원을 해고합니다 +STR_1706 :{SMALLFONT}{BLACK}이 사람을 새 장소에 옮깁니다 +STR_1707 :게임에 직원이 너무 많습니다 +STR_1708 :{SMALLFONT}{BLACK}이 직원이 순찰할 영역을 지정합니다 +STR_1709 :직원 해고 STR_1710 :예 -STR_1711 :{WINDOW_COLOUR_1}Are you sure you want to sack {STRINGID}? -STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Sweep 보도s -STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Water gardens -STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Empty litter bins -STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Mow grass -STR_1716 :Invalid name for park -STR_1717 :Can't rename park... -STR_1718 :Park Name -STR_1719 :Enter name for park: -STR_1720 :{SMALLFONT}{BLACK}Name park -STR_1721 :Park closed -STR_1722 :Park open -STR_1723 :Can't open park... -STR_1724 :Can't close park... -STR_1725 :Can't buy land... -STR_1726 :Land not for sale! -STR_1727 :Construction rights not for sale! -STR_1728 :Can't buy construction rights here... -STR_1729 :Land not owned by park! -STR_1730 :{RED}Closed - - +STR_1711 :{WINDOW_COLOUR_1}{STRINGID}(을)를 정말 해고하시겠습니까? +STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}보도 청소 +STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}정원에 물 주기 +STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}쓰레기통 비우기 +STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}잔디 깎기 +STR_1716 :적합하지 않은 공원 이름입니다 +STR_1717 :공원 이름을 바꿀 수 없습니다... +STR_1718 :공원 이름 +STR_1719 :공원 이름을 입력하세요: +STR_1720 :{SMALLFONT}{BLACK}공원 이름 바꾸기 +STR_1721 :공원 닫힘 +STR_1722 :공원 열림 +STR_1723 :공원을 열 수 없습니다... +STR_1724 :공원을 닫을 수 없습니다... +STR_1725 :땅을 구입할 수 없습니다... +STR_1726 :판매 중인 땅이 아닙니다! +STR_1727 :판매 중인 건설권이 아닙니다! +STR_1728 :이 곳의 건설권을 구입할 수 없습니다... +STR_1729 :공원 소유의 땅이 아닙니다! +STR_1730 :{RED}닫힘 - - STR_1731 :{WHITE}{STRINGID} - - -STR_1732 :Build -STR_1733 :Mode -STR_1734 :{WINDOW_COLOUR_2}Number of laps: -STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit +STR_1732 :건설 +STR_1733 :모드 +STR_1734 :{WINDOW_COLOUR_2}바퀴 수: +STR_1735 :{SMALLFONT}{BLACK}서킷을 돌 바퀴 수를 설정합니다 STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1737 :{COMMA16} -STR_1738 :Can't change number of laps... -STR_1739 :Race won by 손님 {INT32} -STR_1740 :Race won by {STRINGID} -STR_1741 :Not yet constructed ! -STR_1742 :{WINDOW_COLOUR_2}Max. people on 라이드: -STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this 라이드 at one time +STR_1738 :바퀴 수를 변경할 수 없습니다... +STR_1739 :레이스 우승자 : 손님 {INT32} +STR_1740 :레이스 우승자 : {STRINGID} +STR_1741 :아직 건설되지 않았습니다! +STR_1742 :{WINDOW_COLOUR_2}최대 놀이기구 탑승 인원: +STR_1743 :{SMALLFONT}{BLACK}이 놀이기구에 한 번에 탑승할 수 있는 최대 인원 수를 설정합니다 STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1745 :{COMMA16} -STR_1746 :Can't change this... -STR_1747 :{WINDOW_COLOUR_2}Time limit: -STR_1748 :{SMALLFONT}{BLACK}Time limit for 라이드 +STR_1746 :변경할 수 없습니다... +STR_1747 :{WINDOW_COLOUR_2}탑승 시간 제한: +STR_1748 :{SMALLFONT}{BLACK}놀이기구 탑승 시간 제한 STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} STR_1750 :{DURATION} -STR_1751 :Can't change time limit for 라이드... -STR_1752 :{SMALLFONT}{BLACK}Show list of individual 손님s in park -STR_1753 :{SMALLFONT}{BLACK}Show summarised list of 손님s in park -STR_1754 :{BLACK}{COMMA16} 손님s +STR_1751 :놀이기구의 탑승 시간을 변경할 수 없습니다... +STR_1752 :{SMALLFONT}{BLACK}공원에 있는 손님의 모든 명단을 보여줍니다 +STR_1753 :{SMALLFONT}{BLACK}공원에 있는 손님을 항목별로 묶어서 보여줍니다 +STR_1754 :{BLACK}{COMMA16} 손님 STR_1755 :{BLACK}{COMMA16} 손님 -STR_1756 :{WINDOW_COLOUR_2}Admission price: -STR_1757 :{WINDOW_COLOUR_2}Reliability: {MOVE_X}{255}{BLACK}{COMMA16}% -STR_1758 :{SMALLFONT}{BLACK}Build mode -STR_1759 :{SMALLFONT}{BLACK}Move mode -STR_1760 :{SMALLFONT}{BLACK}Fill-in mode -STR_1761 :{SMALLFONT}{BLACK}Build maze in this direction -STR_1762 :Waterfalls -STR_1763 :Rapids +STR_1756 :{WINDOW_COLOUR_2}입장료: +STR_1757 :{WINDOW_COLOUR_2}신뢰도: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1758 :{SMALLFONT}{BLACK}건설 모드 +STR_1759 :{SMALLFONT}{BLACK}이동 모드 +STR_1760 :{SMALLFONT}{BLACK}채우기 모드 +STR_1761 :{SMALLFONT}{BLACK}이 방향으로 미로 건설 +STR_1762 :폭포 +STR_1763 :급류 STR_1764 :Log Bumps -STR_1765 :On-라이드 photo section -STR_1766 :Reverser turntable -STR_1767 :Spinning tunnel -STR_1768 :Can't change number of swings... -STR_1769 :{WINDOW_COLOUR_2}Number of swings: -STR_1770 :{SMALLFONT}{BLACK}Number of complete swings +STR_1765 :탑승 사진 섹션 +STR_1766 :역방향 턴테이블 +STR_1767 :회전 터널 +STR_1768 :스윙 회수를 변경할 수 없습니다... +STR_1769 :{WINDOW_COLOUR_2}스윙 회수: +STR_1770 :{SMALLFONT}{BLACK}가장 높은 스윙의 회수를 지정합니다 STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1772 :{COMMA16} -STR_1773 :Only one on-라이드 photo section allowed per 라이드 -STR_1774 :Only one cable lift hill allowed per 라이드 -STR_1775 :Off -STR_1776 :On -STR_1777 :{WINDOW_COLOUR_2}Music +STR_1773 :한 놀이기구에는 하나의 탑승 사진 섹션만 만들 수 있습니다 +STR_1774 :한 놀이기구에는 하나의 케이블 리프트만 만들 수 있습니다 +STR_1775 :끄기 +STR_1776 :켜기 +STR_1777 :{WINDOW_COLOUR_2}음악 STR_1778 :{STRINGID} - - -STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume -STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume -STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume -STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume -STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume -STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snowman costume -STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Knight costume -STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume -STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume -STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume -STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume -STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff -STR_1791 :{WINDOW_COLOUR_2}Uniform colour: -STR_1792 :Responding to {STRINGID} breakdown call -STR_1793 :Heading to {STRINGID} for an inspection -STR_1794 :Fixing {STRINGID} -STR_1795 :Answering radio call -STR_1796 :Has broken down and requires fixing -STR_1797 :This option cannot be changed for this 라이드 -STR_1798 :Whirlpool +STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} 팬더 복장 +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} 호랑이 복장 +STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} 코끼리 복장 +STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} 로마 전사 복장 +STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} 고릴라 복장 +STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} 눈사람 복장 +STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} 기사 복장 +STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} 우주비행사 복장 +STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} 산적 복장 +STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} 보안관 복장 +STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} 해적 복장 +STR_1790 :{SMALLFONT}{BLACK}이 직종의 유니폼 색상을 선택하세요 +STR_1791 :{WINDOW_COLOUR_2}유니폼 색상: +STR_1792 :{STRINGID} 고장 연락을 받음 +STR_1793 :점검을 위해 {STRINGID}(으)로 이동 중 +STR_1794 :{STRINGID} 수리 중 +STR_1795 :라디오 연락에 응답 중 +STR_1796 :고장이 나서 수리가 필요함 +STR_1797 :이 놀이기구에서는 변경할 수 없는 설정입니다 +STR_1798 :쇼용돌이 STR_1799 :{POP16}{POP16}{POP16}{POP16}{POP16}{CURRENCY2DP} -STR_1800 :Safety cut-out -STR_1801 :Restraints stuck closed -STR_1802 :Restraints stuck open -STR_1803 :Doors stuck closed -STR_1804 :Doors stuck open -STR_1805 :Vehicle malfunction -STR_1806 :Brakes failure -STR_1807 :Control failure -STR_1808 :{WINDOW_COLOUR_2}Last breakdown: {BLACK}{STRINGID} -STR_1809 :{WINDOW_COLOUR_2}Current breakdown: {OUTLINE}{RED}{STRINGID} -STR_1810 :{WINDOW_COLOUR_2}Carrying: -STR_1811 :Can't build this here... +STR_1800 :안전 차단 +STR_1801 :안전 벨트가 닫힌 채로 안 열림 +STR_1802 :안전 벨트가 열린 채로 안 닫힘 +STR_1803 :문이 닫힌 채로 안 열림 +STR_1804 :문이 열린 채로 안 닫힘 +STR_1805 :차량 고장 +STR_1806 :브레이크 고장 +STR_1807 :제어 불능 +STR_1808 :{WINDOW_COLOUR_2}최근 고장: {BLACK}{STRINGID} +STR_1809 :{WINDOW_COLOUR_2}현재 고장: {OUTLINE}{RED}{STRINGID} +STR_1810 :{WINDOW_COLOUR_2}보유 중: +STR_1811 :여기에 건설할 수 없습니다... STR_1812 :{SMALLFONT}{BLACK}{STRINGID} -STR_1813 :Miscellaneous Objects -STR_1814 :Actions -STR_1815 :Thoughts -STR_1816 :{SMALLFONT}{BLACK}Select information type to show in 손님 list +STR_1813 :기타 오브젝트 +STR_1814 :행동 +STR_1815 :생각 +STR_1816 :{SMALLFONT}{BLACK}손님 목록에서 보여줄 정보의 종류를 선택하세요 STR_1817 :({COMMA16}) -STR_1818 :{WINDOW_COLOUR_2}All 손님s -STR_1819 :{WINDOW_COLOUR_2}All 손님s (summarised) -STR_1820 :{WINDOW_COLOUR_2}손님s {STRINGID} -STR_1821 :{WINDOW_COLOUR_2}손님s thinking {STRINGID} -STR_1822 :{WINDOW_COLOUR_2}손님s thinking about {POP16}{STRINGID} -STR_1823 :{SMALLFONT}{BLACK}Show 손님s' thoughts about this 라이드/attraction -STR_1824 :{SMALLFONT}{BLACK}Show 손님s on this 라이드/attraction -STR_1825 :{SMALLFONT}{BLACK}Show 손님s queuing for this 라이드/attraction -STR_1826 :Status -STR_1827 :Popularity -STR_1828 :Satisfaction -STR_1829 :Profit -STR_1830 :Queue length -STR_1831 :Queue time -STR_1832 :Reliability -STR_1833 :Down-time -STR_1834 :손님s favourite -STR_1835 :Popularity: 알 수 없는 -STR_1836 :Popularity: {COMMA16}% -STR_1837 :Satisfaction: 알 수 없는 -STR_1838 :Satisfaction: {COMMA16}% -STR_1839 :Reliability: {COMMA16}% -STR_1840 :Down-time: {COMMA16}% -STR_1841 :Profit: {CURRENCY2DP} per hour -STR_1842 :Favourite of: {COMMA16} 손님 -STR_1843 :Favourite of: {COMMA16} 손님s -STR_1844 :{SMALLFONT}{BLACK}Select information type to show in 라이드/attraction list +STR_1818 :{WINDOW_COLOUR_2}모든 손님 +STR_1819 :{WINDOW_COLOUR_2}모든 손님 (항목별 분류) +STR_1820 :{WINDOW_COLOUR_2}{STRINGID} 손님 +STR_1821 :{WINDOW_COLOUR_2}{STRINGID} 손님 생각 +STR_1822 :{WINDOW_COLOUR_2}{POP16}{STRINGID}에 대한 손님 생각 +STR_1823 :{SMALLFONT}{BLACK}이 놀이기구/시설에 대한 손님들의 생각을 보여줍니다 +STR_1824 :{SMALLFONT}{BLACK}이 놀이기구/시설에 있는 손님을 보여줍니다 +STR_1825 :{SMALLFONT}{BLACK}이 놀이기구/시설에서 기다리고 있는 손님을 보여줍니다 +STR_1826 :상태 +STR_1827 :인기도 +STR_1828 :만족도 +STR_1829 :수익 +STR_1830 :대기 길이 +STR_1831 :대기 시간 +STR_1832 :신뢰도 +STR_1833 :고장률 +STR_1834 :이 놀이기구를 좋아하는 손님 수 +STR_1835 :인기도 : 알 수 없음 +STR_1836 :인기도: {COMMA16}% +STR_1837 :만족도: 알 수 없움 +STR_1838 :만족도: {COMMA16}% +STR_1839 :신뢰도: {COMMA16}% +STR_1840 :고장률: {COMMA16}% +STR_1841 :수익: 시간당 {CURRENCY2DP} +STR_1842 :좋아하는 손님 수: {COMMA16}명 +STR_1843 :좋아하는 손님 수: {COMMA16}명 +STR_1844 :{SMALLFONT}{BLACK}놀이기구/시설 목록에서 보여줄 정보의 종류를 선택하세요 STR_1845 :{MONTHYEAR} -STR_1846 :{COMMA16} 손님s -STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} 손님s -STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} 손님s -STR_1849 :{WINDOW_COLOUR_2}Play music -STR_1850 :{SMALLFONT}{BLACK}Select whether music should be played for this 라이드 -STR_1851 :{WINDOW_COLOUR_2}Running cost: {BLACK}{CURRENCY2DP} per hour -STR_1852 :{WINDOW_COLOUR_2}Running cost: {BLACK}알 수 없는 -STR_1853 :{WINDOW_COLOUR_2}Built: {BLACK}This Year -STR_1854 :{WINDOW_COLOUR_2}Built: {BLACK}Last Year -STR_1855 :{WINDOW_COLOUR_2}Built: {BLACK}{COMMA16} Years Ago -STR_1856 :{WINDOW_COLOUR_2}Profit per item sold: {BLACK}{CURRENCY2DP} -STR_1857 :{WINDOW_COLOUR_2}Loss per item sold: {BLACK}{CURRENCY2DP} -STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY2DP} per month -STR_1859 :Handymen -STR_1860 :Mechanics -STR_1861 :Security Guards -STR_1862 :Entertainers -STR_1863 :Handyman -STR_1864 :Mechanic -STR_1865 :Security Guard -STR_1866 :Entertainer +STR_1846 :{COMMA16} 손님 +STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} 손님 +STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} 손님 +STR_1849 :{WINDOW_COLOUR_2}음악 재생 +STR_1850 :{SMALLFONT}{BLACK}이 놀이기구에 배경음악을 재생할지를 선택합니다 +STR_1851 :{WINDOW_COLOUR_2}유지비: {BLACK}시간당 {CURRENCY2DP} +STR_1852 :{WINDOW_COLOUR_2}유지비: {BLACK}알 수 없음 +STR_1853 :{WINDOW_COLOUR_2}건설 시점: {BLACK}올해 +STR_1854 :{WINDOW_COLOUR_2}건설 시점: {BLACK}작년 +STR_1855 :{WINDOW_COLOUR_2}건설 시점: {BLACK}{COMMA16}년 전 +STR_1856 :{WINDOW_COLOUR_2}항목당 판매 이익: {BLACK}{CURRENCY2DP} +STR_1857 :{WINDOW_COLOUR_2}항목당 손실: {BLACK}{CURRENCY2DP} +STR_1858 :{WINDOW_COLOUR_2}가격: {BLACK}{CURRENCY2DP}/월 +STR_1859 :미화원 +STR_1860 :정비기술자 +STR_1861 :경비원 +STR_1862 :엔터테이너 +STR_1863 :미화원 +STR_1864 :정비기술자 +STR_1865 :경비원 +STR_1866 :엔터테이너 STR_1867 :{BLACK}{COMMA16} {STRINGID} -STR_1868 :Can't change number of rotations... -STR_1869 :{WINDOW_COLOUR_2}Number of rotations: -STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations +STR_1868 :회전 수를 변경할 수 없습니다... +STR_1869 :{WINDOW_COLOUR_2}회전 수: +STR_1870 :{SMALLFONT}{BLACK}회전 수를 설정합니다 STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1872 :{COMMA16} -STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY2DP} per hour -STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour +STR_1873 :{WINDOW_COLOUR_2}수익: 시간당 {BLACK}{CURRENCY2DP} +STR_1874 :{WINDOW_COLOUR_2}순익: 시간당 {BLACK}{CURRENCY2DP} STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} -STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect 라이드s -STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix 라이드s -STR_1878 :{WINDOW_COLOUR_2}Inspection: -STR_1879 :Every 10 minutes -STR_1880 :Every 20 minutes -STR_1881 :Every 30 minutes -STR_1882 :Every 45 minutes -STR_1883 :Every hour -STR_1884 :Every 2 hours -STR_1885 :Never -STR_1886 :Inspecting {STRINGID} -STR_1887 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}{COMMA16} minutes -STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hours -STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% -STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this 라이드 -STR_1891 :No {STRINGID} in park yet! +STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}놀이기구 점검 +STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}놀이기구 수리 +STR_1878 :{WINDOW_COLOUR_2}점검: +STR_1879 :매 10분마다 +STR_1880 :매 20분마다 +STR_1881 :매 30분마다 +STR_1882 :매 45분마다 +STR_1883 :매 시간마다 +STR_1884 :매 2시간마다 +STR_1885 :점검 안 함 +STR_1886 :{STRINGID} 점검 중 +STR_1887 :{WINDOW_COLOUR_2}지난 점검 이후 지난 시간: {BLACK}{COMMA16}분 +STR_1888 :{WINDOW_COLOUR_2}지난 점검 이후 지난 시간: {BLACK}4시간 이상 +STR_1889 :{WINDOW_COLOUR_2}고장률: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1890 :{SMALLFONT}{BLACK}정비기술자가 이 놀이기구를 얼마나 자주 점검할 지 선택합니다 +STR_1891 :공원에 아직 {STRINGID}(이)가 없습니다! # The following two strings were used to display an error when the disc was missing. # This has been replaced in OpenRCT2. -STR_1892 : -STR_1893 : -STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} -STR_1895 :{SMALLFONT}{BLACK}Build new 라이드/attraction -STR_1896 :{WINDOW_COLOUR_2}Expenditure/Income -STR_1897 :{WINDOW_COLOUR_2}라이드 construction -STR_1898 :{WINDOW_COLOUR_2}라이드 running costs -STR_1899 :{WINDOW_COLOUR_2}Land purchase -STR_1900 :{WINDOW_COLOUR_2}Landscaping -STR_1901 :{WINDOW_COLOUR_2}Park entrance tickets -STR_1902 :{WINDOW_COLOUR_2}라이드 tickets -STR_1903 :{WINDOW_COLOUR_2}Shop sales -STR_1904 :{WINDOW_COLOUR_2}Shop stock -STR_1905 :{WINDOW_COLOUR_2}Food/drink sales -STR_1906 :{WINDOW_COLOUR_2}Food/drink stock -STR_1907 :{WINDOW_COLOUR_2}Staff wages -STR_1908 :{WINDOW_COLOUR_2}Marketing -STR_1909 :{WINDOW_COLOUR_2}Research -STR_1910 :{WINDOW_COLOUR_2}Loan interest -STR_1911 :{BLACK} at {COMMA16}% per year +STR_1892 :<더 이상 사용하지 않음> +STR_1893 :<더 이상 사용하지 않음> +STR_1894 :{WINDOW_COLOUR_2}{STRINGID} 판매: {BLACK}{COMMA32} +STR_1895 :{SMALLFONT}{BLACK}새 놀이기구/시설 건설 +STR_1896 :{WINDOW_COLOUR_2}수익/지출 +STR_1897 :{WINDOW_COLOUR_2}놀이기구 건설비 +STR_1898 :{WINDOW_COLOUR_2}놀이기구 유지비 +STR_1899 :{WINDOW_COLOUR_2}땅 구입 +STR_1900 :{WINDOW_COLOUR_2}지형 편집 +STR_1901 :{WINDOW_COLOUR_2}공원 입장료 +STR_1902 :{WINDOW_COLOUR_2}놀이기구 탑승료 +STR_1903 :{WINDOW_COLOUR_2}상점 판매 +STR_1904 :{WINDOW_COLOUR_2}상점 재고 +STR_1905 :{WINDOW_COLOUR_2}음식/음료 판매 +STR_1906 :{WINDOW_COLOUR_2}음식/음료 재고 +STR_1907 :{WINDOW_COLOUR_2}직원 급여 +STR_1908 :{WINDOW_COLOUR_2}광고 +STR_1909 :{WINDOW_COLOUR_2}연구 +STR_1910 :{WINDOW_COLOUR_2}대출 이자 +STR_1911 :{BLACK} 금리: {COMMA16}%/년 STR_1912 :{MONTH} STR_1913 :{BLACK}+{CURRENCY2DP} STR_1914 :{BLACK}{CURRENCY2DP} STR_1915 :{RED}{CURRENCY2DP} -STR_1916 :{WINDOW_COLOUR_2}Loan: +STR_1916 :{WINDOW_COLOUR_2}대출: STR_1917 :{POP16}{POP16}{POP16}{CURRENCY} -STR_1918 :Can't borrow any more money! -STR_1919 :Not enough cash available! -STR_1920 :Can't pay back loan! -STR_1921 :{SMALLFONT}{BLACK}Start a new game -STR_1922 :{SMALLFONT}{BLACK}Continue playing a saved game -STR_1923 :{SMALLFONT}{BLACK}Show tutorial -STR_1924 :{SMALLFONT}{BLACK}Exit -STR_1925 :Can't place person here... +STR_1918 :더 이상 돈을 빌릴 수 없습니다! +STR_1919 :돈이 충분하지 않습니다! +STR_1920 :대출을 갚을 수 없습니다! +STR_1921 :{SMALLFONT}{BLACK}새로운 게임을 시작합니다 +STR_1922 :{SMALLFONT}{BLACK}저장된 게임을 계속해서 플레이합니다 +STR_1923 :{SMALLFONT}{BLACK}튜토리얼을 봅니다 +STR_1924 :{SMALLFONT}{BLACK}게임을 종료합니다 +STR_1925 :사람을 여기에 놓을 수 없습니다... STR_1926 :{SMALLFONT} -STR_1927 :{YELLOW}{STRINGID} has broken down -STR_1928 :{RED}{STRINGID} has crashed! -STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better -STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this 손님 - (If tracking is on, 손님's movements will be reported in the message area) -STR_1931 :{STRINGID} has joined the queue line for {STRINGID} -STR_1932 :{STRINGID} is on {STRINGID} -STR_1933 :{STRINGID} is in {STRINGID} -STR_1934 :{STRINGID} has left {STRINGID} -STR_1935 :{STRINGID} has left the park -STR_1936 :{STRINGID} has bought {STRINGID} -STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message -STR_1938 :{SMALLFONT}{BLACK}Show view of 손님 -STR_1939 :{SMALLFONT}{BLACK}Show view of staff member -STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this 손님 -STR_1941 :{SMALLFONT}{BLACK}Show which 라이드s this 손님 has been on -STR_1942 :{SMALLFONT}{BLACK}Show financial information about this 손님 -STR_1943 :{SMALLFONT}{BLACK}Show 손님's recent thoughts -STR_1944 :{SMALLFONT}{BLACK}Show items 손님 is carrying -STR_1945 :{SMALLFONT}{BLACK}Show orders and options for this staff member -STR_1946 :{SMALLFONT}{BLACK}Select costume for this entertainer -STR_1947 :{SMALLFONT}{BLACK}Show areas patrolled by selected staff type, and locate the nearest staff member -STR_1948 :{SMALLFONT}{BLACK}Hire a new staff member of the selected type -STR_1949 :Financial Summary -STR_1950 :Financial Graph -STR_1951 :Park Value Graph -STR_1952 :Profit Graph -STR_1953 :Marketing -STR_1954 :Research Funding -STR_1955 :{WINDOW_COLOUR_2}Number of circuits: -STR_1956 :{SMALLFONT}{BLACK}Number of circuits of track per 라이드 +STR_1927 :{YELLOW}{STRINGID} 고장 발생 +STR_1928 :{RED}{STRINGID} 충돌! +STR_1929 :{RED}{STRINGID} - 아직 수리되지 않음{NEWLINE}정비기술자의 위치와 업무 효율을 점검하세요 +STR_1930 :{SMALLFONT}{BLACK}이 손님의 행동을 추적합니다. (이 설정을 켜면 이 손님의 모든 행동을 메시지 창으로 알려줍니다) +STR_1931 :{STRINGID} - {STRINGID}(을)를 타기 위해 대기줄에 섰습니다 +STR_1932 :{STRINGID} - {STRINGID}(을)를 탔습니다 +STR_1933 :{STRINGID} - {STRINGID} 안에 있습니다 +STR_1934 :{STRINGID} - {STRINGID}(을)를 떠났습니다 +STR_1935 :{STRINGID} - 공원을 떠났습니다 +STR_1936 :{STRINGID} - {STRINGID}(을)를 샀습니다 +STR_1937 :{SMALLFONT}{BLACK}이 메시지의 주제에 대한 정보를 보여줍니다 +STR_1938 :{SMALLFONT}{BLACK}손님 주변으로 화면을 이동합니다 +STR_1939 :{SMALLFONT}{BLACK}직원 주변으로 화면을 이동합니다 +STR_1940 :{SMALLFONT}{BLACK}이 손님의 행복도, 에너지, 배고픔 등의 수치를 보여줍니다 +STR_1941 :{SMALLFONT}{BLACK}이 손님이 이용한 놀이기구를 보여줍니다 +STR_1942 :{SMALLFONT}{BLACK}이 손님의 재정 상황을 보여줍니다 +STR_1943 :{SMALLFONT}{BLACK}손님의 최근 생각을 보여줍니다 +STR_1944 :{SMALLFONT}{BLACK}손님이 가지고 있는 물건을 보여줍니다 +STR_1945 :{SMALLFONT}{BLACK}이 직원이 할 일이나 설정을 보여줍니다 +STR_1946 :{SMALLFONT}{BLACK}이 엔터테이너의 복장을 선택합니다 +STR_1947 :{SMALLFONT}{BLACK}선택한 직원의 행동 영역을 보여주고 가까운 직원을 거기로 이동시킵니다 +STR_1948 :{SMALLFONT}{BLACK}선택한 종류의 직원을 새로 고용합니다 +STR_1949 :재정 요약 +STR_1950 :재정 그래프 +STR_1951 :공원 가치 그래프 +STR_1952 :수익 그래프 +STR_1953 :광고 +STR_1954 :연구 자금 +STR_1955 :{WINDOW_COLOUR_2}바퀴 수: +STR_1956 :{SMALLFONT}{BLACK}탑승 당 바퀴 수 STR_1957 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1958 :{COMMA16} -STR_1959 :Can't change number of circuits... -STR_1960 :{WINDOW_COLOUR_2}Balloon price: -STR_1961 :{WINDOW_COLOUR_2}Cuddly Toy price: -STR_1962 :{WINDOW_COLOUR_2}Park Map price: -STR_1963 :{WINDOW_COLOUR_2}On-라이드 Photo price: -STR_1964 :{WINDOW_COLOUR_2}Umbrella price: -STR_1965 :{WINDOW_COLOUR_2}Drink price: -STR_1966 :{WINDOW_COLOUR_2}Burger price: -STR_1967 :{WINDOW_COLOUR_2}Chips price: -STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: -STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: +STR_1959 :바퀴 수를 변경할 수 없습니다... +STR_1960 :{WINDOW_COLOUR_2}풍선 가격: +STR_1961 :{WINDOW_COLOUR_2}캐릭터 인형 가격: +STR_1962 :{WINDOW_COLOUR_2}공원 지도 가격: +STR_1963 :{WINDOW_COLOUR_2}탑승 사진 가격: +STR_1964 :{WINDOW_COLOUR_2}우산 가격: +STR_1965 :{WINDOW_COLOUR_2}음료수 가격: +STR_1966 :{WINDOW_COLOUR_2}햄버거 가격: +STR_1967 :{WINDOW_COLOUR_2}감자칩 가격: +STR_1968 :{WINDOW_COLOUR_2}아이스크림 가격: +STR_1969 :{WINDOW_COLOUR_2}솜사탕 가격: STR_1970 :{WINDOW_COLOUR_2} STR_1971 :{WINDOW_COLOUR_2} STR_1972 :{WINDOW_COLOUR_2} -STR_1973 :{WINDOW_COLOUR_2}Pizza price: +STR_1973 :{WINDOW_COLOUR_2}피자 가격: STR_1974 :{WINDOW_COLOUR_2} -STR_1975 :{WINDOW_COLOUR_2}Popcorn price: -STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: -STR_1977 :{WINDOW_COLOUR_2}Tentacle price: -STR_1978 :{WINDOW_COLOUR_2}Hat price: -STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: -STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: -STR_1981 :{WINDOW_COLOUR_2}Doughnut price: -STR_1982 :{WINDOW_COLOUR_2}Coffee price: +STR_1975 :{WINDOW_COLOUR_2}팝콘 가격: +STR_1976 :{WINDOW_COLOUR_2}핫도그 가격: +STR_1977 :{WINDOW_COLOUR_2}문어발 가격: +STR_1978 :{WINDOW_COLOUR_2}모자 가격: +STR_1979 :{WINDOW_COLOUR_2}사과 토피 사탕 가격: +STR_1980 :{WINDOW_COLOUR_2}티셔츠 가격: +STR_1981 :{WINDOW_COLOUR_2}도넛 가격: +STR_1982 :{WINDOW_COLOUR_2}커피 가격: STR_1983 :{WINDOW_COLOUR_2} -STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: -STR_1985 :{WINDOW_COLOUR_2}Lemonade price: +STR_1984 :{WINDOW_COLOUR_2}치킨 가격: +STR_1985 :{WINDOW_COLOUR_2}레모네이드 가격: STR_1986 :{WINDOW_COLOUR_2} STR_1987 :{WINDOW_COLOUR_2} -STR_1988 :Balloon -STR_1989 :Cuddly Toy -STR_1990 :Park Map -STR_1991 :On-라이드 Photo -STR_1992 :Umbrella -STR_1993 :Drink -STR_1994 :Burger -STR_1995 :Chips -STR_1996 :Ice Cream -STR_1997 :Candyfloss -STR_1998 :Empty Can -STR_1999 :Rubbish -STR_2000 :Empty Burger Box -STR_2001 :Pizza -STR_2002 :Voucher -STR_2003 :Popcorn -STR_2004 :Hot Dog -STR_2005 :Tentacle -STR_2006 :Hat -STR_2007 :Toffee Apple -STR_2008 :T-Shirt -STR_2009 :Doughnut -STR_2010 :Coffee -STR_2011 :Empty Cup -STR_2012 :Fried Chicken -STR_2013 :Lemonade -STR_2014 :Empty Box -STR_2015 :Empty Bottle -STR_2016 :Balloons -STR_2017 :Cuddly Toys -STR_2018 :Park Maps -STR_2019 :On-라이드 Photos -STR_2020 :Umbrellas -STR_2021 :Drinks -STR_2022 :Burgers -STR_2023 :Chips -STR_2024 :Ice Creams -STR_2025 :Candyfloss -STR_2026 :Empty Cans -STR_2027 :Rubbish -STR_2028 :Empty Burger Boxes -STR_2029 :Pizzas -STR_2030 :Vouchers -STR_2031 :Popcorn -STR_2032 :Hot Dogs -STR_2033 :Tentacles -STR_2034 :Hats -STR_2035 :Toffee Apples -STR_2036 :T-Shirts -STR_2037 :Doughnuts -STR_2038 :Coffees -STR_2039 :Empty Cups -STR_2040 :Fried Chicken -STR_2041 :Lemonade -STR_2042 :Empty Boxes -STR_2043 :Empty Bottles -STR_2044 :a Balloon -STR_2045 :a Cuddly Toy -STR_2046 :a Park Map -STR_2047 :an On-라이드 Photo -STR_2048 :an Umbrella -STR_2049 :a Drink -STR_2050 :a Burger -STR_2051 :some Chips -STR_2052 :an Ice Cream -STR_2053 :some Candyfloss -STR_2054 :an Empty Can -STR_2055 :some Rubbish -STR_2056 :an Empty Burger Box -STR_2057 :a Pizza -STR_2058 :a Voucher -STR_2059 :some Popcorn -STR_2060 :a Hot Dog -STR_2061 :a Tentacle -STR_2062 :a Hat -STR_2063 :a Toffee Apple -STR_2064 :a T-Shirt -STR_2065 :a Doughnut -STR_2066 :a Coffee -STR_2067 :an Empty Cup -STR_2068 :some Fried Chicken -STR_2069 :some Lemonade -STR_2070 :an Empty Box -STR_2071 :an Empty Bottle -STR_2072 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Balloon -STR_2073 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Cuddly Toy -STR_2074 :Map of {STRINGID} -STR_2075 :On-라이드 Photo of {STRINGID} -STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Umbrella -STR_2077 :Drink -STR_2078 :Burger -STR_2079 :Chips -STR_2080 :Ice Cream -STR_2081 :Candyfloss -STR_2082 :Empty Can -STR_2083 :Rubbish -STR_2084 :Empty Burger Box -STR_2085 :Pizza -STR_2086 :Voucher for {STRINGID} -STR_2087 :Popcorn -STR_2088 :Hot Dog -STR_2089 :Tentacle -STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hat -STR_2091 :Toffee Apple -STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-Shirt -STR_2093 :Doughnut -STR_2094 :Coffee -STR_2095 :Empty Cup -STR_2096 :Fried Chicken -STR_2097 :Lemonade -STR_2098 :Empty Box -STR_2099 :Empty Bottle -STR_2100 :{WINDOW_COLOUR_2}On-라이드 Photo price: -STR_2101 :{WINDOW_COLOUR_2}On-라이드 Photo price: -STR_2102 :{WINDOW_COLOUR_2}On-라이드 Photo price: -STR_2103 :{WINDOW_COLOUR_2}프레첼 price: -STR_2104 :{WINDOW_COLOUR_2}Hot Chocolate price: -STR_2105 :{WINDOW_COLOUR_2}아이스 티 price: -STR_2106 :{WINDOW_COLOUR_2}휜넬 케이크 price: -STR_2107 :{WINDOW_COLOUR_2}선글라스 price: -STR_2108 :{WINDOW_COLOUR_2}고기 국수 price: -STR_2109 :{WINDOW_COLOUR_2}Fried Rice Noodles price: -STR_2110 :{WINDOW_COLOUR_2}만둣국 price: -STR_2111 :{WINDOW_COLOUR_2}미트볼 스프 price: -STR_2112 :{WINDOW_COLOUR_2}과일 주스 price: -STR_2113 :{WINDOW_COLOUR_2}두유 price: -STR_2114 :{WINDOW_COLOUR_2}수정과 price: -STR_2115 :{WINDOW_COLOUR_2}Sub Sandwich price: -STR_2116 :{WINDOW_COLOUR_2}쿠키 price: +STR_1988 :풍선 +STR_1989 :캐릭터 인형 +STR_1990 :공원 지도 +STR_1991 :탑승 사진 +STR_1992 :우산 +STR_1993 :음료수 +STR_1994 :햄버거 +STR_1995 :감자칩 +STR_1996 :아이스크림 +STR_1997 :솜사탕 +STR_1998 :빈 캔 +STR_1999 :쓰레기 +STR_2000 :빈 햄버거 박스 +STR_2001 :피자 +STR_2002 :쿠폰 +STR_2003 :팝콘 +STR_2004 :핫도그 +STR_2005 :문어발 +STR_2006 :모자 +STR_2007 :사과 토피 사탕 +STR_2008 :티셔츠 +STR_2009 :도넛 +STR_2010 :커피 +STR_2011 :빈 컵 +STR_2012 :치킨 +STR_2013 :레모네이드 +STR_2014 :빈 박스 +STR_2015 :빈 병 +STR_2016 :풍선 +STR_2017 :캐릭터 인형 +STR_2018 :공원 지도 +STR_2019 :탑승 사진 +STR_2020 :우산 +STR_2021 :음료수 +STR_2022 :햄버거 +STR_2023 :감자칩 +STR_2024 :아이스크림 +STR_2025 :솜사탕 +STR_2026 :빈 캔 +STR_2027 :쓰레기 +STR_2028 :빈 햄버거 박스 +STR_2029 :피자 +STR_2030 :쿠폰 +STR_2031 :팝콘 +STR_2032 :핫도그 +STR_2033 :문어발 +STR_2034 :모자 +STR_2035 :사과 토피 사탕 +STR_2036 :티셔츠 +STR_2037 :도넛 +STR_2038 :커피 +STR_2039 :빈 컵 +STR_2040 :치킨 +STR_2041 :레모네이드 +STR_2042 :빈 박스 +STR_2043 :빈 병 +STR_2044 :풍선 +STR_2045 :캐릭터 인형 +STR_2046 :공원 지도 +STR_2047 :탑승 사진 +STR_2048 :우산 +STR_2049 :음료수 +STR_2050 :햄버거 +STR_2051 :감자칩 +STR_2052 :아이스크림 +STR_2053 :솜사탕 +STR_2054 :빈 캔 +STR_2055 :쓰레기 +STR_2056 :빈 햄버거 박스 +STR_2057 :피자 +STR_2058 :쿠폰 +STR_2059 :팝콘 +STR_2060 :핫도그 +STR_2061 :문어발 +STR_2062 :모자 +STR_2063 :사과 토피 사탕 +STR_2064 :티셔츠 +STR_2065 :도넛 +STR_2066 :커피 +STR_2067 :빈 컵 +STR_2068 :치킨 +STR_2069 :레모네이드 +STR_2070 :빈 박스 +STR_2071 :빈 병 +STR_2072 :{OPENQUOTES}{STRINGID}{ENDQUOTES} 풍선 +STR_2073 :{OPENQUOTES}{STRINGID}{ENDQUOTES} 캐릭터 인형 +STR_2074 :{STRINGID} 지도 +STR_2075 :{STRINGID} 탑승 사진 +STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} 우산 +STR_2077 :음료수 +STR_2078 :햄버거 +STR_2079 :감자칩 +STR_2080 :아이스크림 +STR_2081 :솜사탕 +STR_2082 :빈 캔 +STR_2083 :쓰레기 +STR_2084 :빈 햄버거 박스 +STR_2085 :피자 +STR_2086 :{STRINGID} 쿠폰 +STR_2087 :팝콘 +STR_2088 :핫도그 +STR_2089 :문어발 +STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} 모자 +STR_2091 :사과 토피 사탕 +STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} 티셔츠 +STR_2093 :도넛 +STR_2094 :커피 +STR_2095 :빈 컵 +STR_2096 :치킨 +STR_2097 :레모네이드 +STR_2098 :빈 박스 +STR_2099 :빈 병 +STR_2100 :{WINDOW_COLOUR_2}탑승 사진 가격: +STR_2101 :{WINDOW_COLOUR_2}탑승 사진 가격: +STR_2102 :{WINDOW_COLOUR_2}탑승 사진 가격: +STR_2103 :{WINDOW_COLOUR_2}프레첼 가격: +STR_2104 :{WINDOW_COLOUR_2}핫초코 가격: +STR_2105 :{WINDOW_COLOUR_2}아이스 티 가격: +STR_2106 :{WINDOW_COLOUR_2}휜넬 케이크 가격: +STR_2107 :{WINDOW_COLOUR_2}선글라스 가격: +STR_2108 :{WINDOW_COLOUR_2}고기 국수 가격: +STR_2109 :{WINDOW_COLOUR_2}볶음쌀국수 가격: +STR_2110 :{WINDOW_COLOUR_2}만둣국 가격: +STR_2111 :{WINDOW_COLOUR_2}미트볼 스프 가격: +STR_2112 :{WINDOW_COLOUR_2}과일 주스 가격: +STR_2113 :{WINDOW_COLOUR_2}두유 가격: +STR_2114 :{WINDOW_COLOUR_2}수정과 가격: +STR_2115 :{WINDOW_COLOUR_2}샌드위치 가격: +STR_2116 :{WINDOW_COLOUR_2}쿠키 가격: STR_2117 :{WINDOW_COLOUR_2} STR_2118 :{WINDOW_COLOUR_2} STR_2119 :{WINDOW_COLOUR_2} -STR_2120 :{WINDOW_COLOUR_2}구운 소시지 price: +STR_2120 :{WINDOW_COLOUR_2}구운 소시지 가격: STR_2121 :{WINDOW_COLOUR_2} -STR_2122 :On-라이드 Photo -STR_2123 :On-라이드 Photo -STR_2124 :On-라이드 Photo +STR_2122 :탑승 사진 +STR_2123 :탑승 사진 +STR_2124 :탑승 사진 STR_2125 :프레첼 -STR_2126 :Hot Chocolate +STR_2126 :핫초코 STR_2127 :아이스 티 STR_2128 :휜넬 케이크 STR_2129 :선글라스 STR_2130 :고기 국수 -STR_2131 :Fried Rice Noodles +STR_2131 :볶음쌀국수 STR_2132 :만둣국 STR_2133 :미트볼 스프 STR_2134 :과일 주스 STR_2135 :두유 STR_2136 :수정과 -STR_2137 :Sub Sandwich +STR_2137 :샌드위치 STR_2138 :쿠키 -STR_2139 :Empty Bowl -STR_2140 :Empty Drink Carton -STR_2141 :Empty Juice Cup +STR_2139 :빈 사발 +STR_2140 :빈 음료수 통 +STR_2141 :빈 주스 컵 STR_2142 :구운 소시지 -STR_2143 :Empty Bowl -STR_2144 :On-라이드 Photos -STR_2145 :On-라이드 Photos -STR_2146 :On-라이드 Photos -STR_2147 :프레첼s -STR_2148 :Hot Chocolates -STR_2149 :아이스 티s -STR_2150 :휜넬 케이크s +STR_2143 :빈 사발 +STR_2144 :탑승 사진 +STR_2145 :탑승 사진 +STR_2146 :탑승 사진 +STR_2147 :프레첼 +STR_2148 :핫초코 +STR_2149 :아이스 티 +STR_2150 :휜넬 케이크 STR_2151 :선글라스 STR_2152 :고기 국수 -STR_2153 :Fried Rice Noodles -STR_2154 :만둣국s -STR_2155 :미트볼 스프s -STR_2156 :과일 주스s -STR_2157 :두유s +STR_2153 :볶음쌀국수 +STR_2154 :만둣국 +STR_2155 :미트볼 스프 +STR_2156 :과일 주스 +STR_2157 :두유 STR_2158 :수정과 -STR_2159 :Sub Sandwiches -STR_2160 :쿠키s -STR_2161 :Empty Bowls -STR_2162 :Empty Drink Cartons -STR_2163 :Empty Juice cups -STR_2164 :구운 소시지s -STR_2165 :Empty Bowls -STR_2166 :an On-라이드 Photo -STR_2167 :an On-라이드 Photo -STR_2168 :an On-라이드 Photo -STR_2169 :a 프레첼 -STR_2170 :a Hot Chocolate -STR_2171 :an 아이스 티 -STR_2172 :a 휜넬 케이크 -STR_2173 :a pair of 선글라스 -STR_2174 :some 고기 국수 -STR_2175 :some Fried Rice Noodles -STR_2176 :some 만둣국 -STR_2177 :some 미트볼 스프 -STR_2178 :a 과일 주스 -STR_2179 :some 두유 -STR_2180 :some 수정과 +STR_2159 :샌드위치 +STR_2160 :쿠키 +STR_2161 :빈 사발 +STR_2162 :빈 음료수 통 +STR_2163 :빈 주스 컵 +STR_2164 :구운 소시지 +STR_2165 :빈 사발 +STR_2166 :탑승 사진 +STR_2167 :탑승 사진 +STR_2168 :탑승 사진 +STR_2169 :프레첼 +STR_2170 :핫초코 +STR_2171 :아이스 티 +STR_2172 :휜넬 케이크 +STR_2173 :선글라스 +STR_2174 :고기 국수 +STR_2175 :볶음쌀국수 +STR_2176 :만둣국 +STR_2177 :미트볼 스프 +STR_2178 :과일 주스 +STR_2179 :두유 +STR_2180 :수정과 STR_2181 :샌드위치 STR_2182 :쿠키 -STR_2183 :an Empty Bowl -STR_2184 :an Empty Drink Carton -STR_2185 :an Empty Juice Cup +STR_2183 :빈 사발 +STR_2184 :빈 음료수 통 +STR_2185 :빈 주스 컵 STR_2186 :구운 소시지 -STR_2187 :an Empty Bowl -STR_2188 :On-라이드 Photo of {STRINGID} -STR_2189 :On-라이드 Photo of {STRINGID} -STR_2190 :On-라이드 Photo of {STRINGID} +STR_2187 :빈 사발 +STR_2188 :{STRINGID}의 탑승 사진 +STR_2189 :{STRINGID}의 탑승 사진 +STR_2190 :{STRINGID}의 탑승 사진 STR_2191 :프레첼 -STR_2192 :Hot Chocolate +STR_2192 :핫초코 STR_2193 :아이스 티 STR_2194 :휜넬 케이크 STR_2195 :선글라스 STR_2196 :고기 국수 -STR_2197 :Fried Rice Noodles +STR_2197 :볶음쌀국수 STR_2198 :만둣국 STR_2199 :미트볼 스프 STR_2200 :과일 주스 STR_2201 :두유 STR_2202 :수정과 -STR_2203 :Sub Sandwich +STR_2203 :샌드위치 STR_2204 :쿠키 -STR_2205 :Empty Bowl -STR_2206 :Empty Drink Carton -STR_2207 :Empty Juice Cup +STR_2205 :빈 사발 +STR_2206 :빈 음료수 통 +STR_2207 :빈 주스 컵 STR_2208 :구운 소시지 -STR_2209 :Empty Bowl -STR_2210 :{SMALLFONT}{BLACK}Show list of handymen in park -STR_2211 :{SMALLFONT}{BLACK}Show list of mechanics in park -STR_2212 :{SMALLFONT}{BLACK}Show list of security guards in park -STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park -STR_2214 :Construction not possible while game is paused! +STR_2209 :빈 사발 +STR_2210 :{SMALLFONT}{BLACK}공원의 미화원 목록을 보여줍니다 +STR_2211 :{SMALLFONT}{BLACK}공원의 정비기술자 목록을 보여줍니다 +STR_2212 :{SMALLFONT}{BLACK}공원의 경비원 목록을 보여줍니다 +STR_2213 :{SMALLFONT}{BLACK}공원의 엔터테이너 목록을 보여줍니다 +STR_2214 :게임 일시정지 중에는 건설할 수 없습니다! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F -STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has 상점ed -STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} -STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} -STR_2221 :{SMALLFONT}{BLACK}Park Rating: {COMMA16} +STR_2218 :{RED}{STRINGID}(놀이기구: {STRINGID})(이)가 {STRINGID}(으)로 아직 돌아오지 않았습니다!{NEWLINE}놀이기구가 멈춰있거나 Check whether it is stuck or has 상점ed +STR_2219 :{RED}{COMMA16}명의 손님이 {STRINGID} 사고로 사망하였습니다! +STR_2220 :{WINDOW_COLOUR_2}공원 등급: {BLACK}{COMMA16} +STR_2221 :{SMALLFONT}{BLACK}공원 등급: {COMMA16} STR_2222 :{SMALLFONT}{BLACK}{STRINGID} -STR_2223 :{WINDOW_COLOUR_2}손님s in park: {BLACK}{COMMA16} -STR_2224 :{WINDOW_COLOUR_2}Cash: {BLACK}{CURRENCY2DP} -STR_2225 :{WINDOW_COLOUR_2}Cash: {RED}{CURRENCY2DP} -STR_2226 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} -STR_2227 :{WINDOW_COLOUR_2}Company value: {BLACK}{CURRENCY} -STR_2228 :{WINDOW_COLOUR_2}Last month's profit from food/drink and{NEWLINE}merchandise sales: {BLACK}{CURRENCY} -STR_2229 :Slope up to vertical -STR_2230 :Vertical track -STR_2231 :Holding brake for drop -STR_2232 :Cable lift hill -STR_2233 :{SMALLFONT}{BLACK}Park information -STR_2234 :Recent Messages +STR_2223 :{WINDOW_COLOUR_2}공원에 있는 손님 수: {BLACK}{COMMA16} +STR_2224 :{WINDOW_COLOUR_2}재정: {BLACK}{CURRENCY2DP} +STR_2225 :{WINDOW_COLOUR_2}재정: {RED}{CURRENCY2DP} +STR_2226 :{WINDOW_COLOUR_2}공원 가치: {BLACK}{CURRENCY} +STR_2227 :{WINDOW_COLOUR_2}회사 가치: {BLACK}{CURRENCY} +STR_2228 :{WINDOW_COLOUR_2}음식/음료수 또는 물건으로 벌어들인{NEWLINE}지난달 수익: {BLACK}{CURRENCY} +STR_2229 :수직으로 상승 +STR_2230 :수직 트랙 +STR_2231 :낙하 브레이크 +STR_2232 :케이블 리프트 힐 +STR_2233 :{SMALLFONT}{BLACK}공원 정보 +STR_2234 :최근 메시지 STR_2235 :{SMALLFONT}{STRINGID} {STRINGID} -STR_2236 :January -STR_2237 :February -STR_2238 :March -STR_2239 :April -STR_2240 :May -STR_2241 :June -STR_2242 :July -STR_2243 :August -STR_2244 :September -STR_2245 :October -STR_2246 :November -STR_2247 :December -STR_2248 :Can't demolish 라이드/attraction... -STR_2249 :{BABYBLUE}New 라이드/attraction now available:{NEWLINE}{STRINGID} -STR_2250 :{BABYBLUE}New scenery/themeing now available:{NEWLINE}{STRINGID} -STR_2251 :Can only be built on paths! -STR_2252 :Can only be built across paths! -STR_2253 :Transport 라이드s -STR_2254 :Gentle 라이드s -STR_2255 :롤러코스터s -STR_2256 :Thrill 라이드s -STR_2257 :Water 라이드s -STR_2258 :Shops & 상점s -STR_2259 :Scenery & Themeing -STR_2260 :No funding -STR_2261 :미니mum funding -STR_2262 :Normal funding -STR_2263 :Maximum funding -STR_2264 :Research funding -STR_2265 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} per month -STR_2266 :Research priorities -STR_2267 :Currently in development -STR_2268 :Last development -STR_2269 :{WINDOW_COLOUR_2}Type: {BLACK}{STRINGID} -STR_2270 :{WINDOW_COLOUR_2}Progress: {BLACK}{STRINGID} -STR_2271 :{WINDOW_COLOUR_2}Expected: {BLACK}{STRINGID} -STR_2272 :{WINDOW_COLOUR_2}라이드/attraction:{NEWLINE}{BLACK}{STRINGID} -STR_2273 :{WINDOW_COLOUR_2}Scenery/themeing:{NEWLINE}{BLACK}{STRINGID} +STR_2236 :1월 +STR_2237 :2월 +STR_2238 :3월 +STR_2239 :4월 +STR_2240 :5월 +STR_2241 :6월 +STR_2242 :7월 +STR_2243 :8월 +STR_2244 :9월 +STR_2245 :10월 +STR_2246 :11월 +STR_2247 :12월 +STR_2248 :놀이기구/시설을 파괴할 수 없습니다... +STR_2249 :{BABYBLUE}새 놀이기구/시설을 사용할 수 있습니다:{NEWLINE}{STRINGID} +STR_2250 :{BABYBLUE}새 풍경/테마를 사용할 수 있습니다:{NEWLINE}{STRINGID} +STR_2251 :보도 위에만 지을 수 있습니다! +STR_2252 :보도를 가로질러야만 설치할 수 있습니다! +STR_2253 :운송용 놀이기구 +STR_2254 :얌전한 놀이기구 +STR_2255 :롤러코스터 +STR_2256 :스릴있는 놀이기구 +STR_2257 :물 놀이기구 +STR_2258 :상점 & 매점 +STR_2259 :풍경 & 테마 +STR_2260 :기금 없음 +STR_2261 :최소 기금 +STR_2262 :정상 기금 +STR_2263 :최대 기금 +STR_2264 :연구 기금 +STR_2265 :{WINDOW_COLOUR_2}비용: {BLACK}{CURRENCY}/월 +STR_2266 :연구 우선순위 +STR_2267 :현재 개발 중인 항목 +STR_2268 :최근에 개발한 항목 +STR_2269 :{WINDOW_COLOUR_2}유형: {BLACK}{STRINGID} +STR_2270 :{WINDOW_COLOUR_2}진행: {BLACK}{STRINGID} +STR_2271 :{WINDOW_COLOUR_2}예상: {BLACK}{STRINGID} +STR_2272 :{WINDOW_COLOUR_2}놀이기구/시술:{NEWLINE}{BLACK}{STRINGID} +STR_2273 :{WINDOW_COLOUR_2}풍경/테마:{NEWLINE}{BLACK}{STRINGID} STR_2274 :{SMALLFONT}{BLACK}Show details of this invention or development STR_2275 :{SMALLFONT}{BLACK}Show funding and options for research & development STR_2276 :{SMALLFONT}{BLACK}Show research & development status STR_2277 :알 수 없는 -STR_2278 :Transport 라이드 -STR_2279 :Gentle 라이드 +STR_2278 :운송용 놀이기구 +STR_2279 :얌전한 놀이기구 STR_2280 :롤러코스터 -STR_2281 :Thrill 라이드 -STR_2282 :Water 라이드 -STR_2283 :Shop/상점 -STR_2284 :Scenery/Themeing -STR_2285 :Initial research -STR_2286 :Designing -STR_2287 :Completing design -STR_2288 :알 수 없는 +STR_2281 :스릴있는 놀이기구 +STR_2282 :물 놀이기구 +STR_2283 :상점/매점 +STR_2284 :풍경/테마 +STR_2285 :초기 연구 +STR_2286 :디자인 중 +STR_2287 :디자인 완성 +STR_2288 :알 수 없음 STR_2289 :{STRINGID} {STRINGID} STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} -STR_2291 :Select scenario for new game -STR_2292 :{WINDOW_COLOUR_2}라이드s been on: -STR_2293 :{BLACK} Nothing -STR_2294 :{SMALLFONT}{BLACK}Change base land style -STR_2295 :{SMALLFONT}{BLACK}Change vertical edges of land -STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} paid to enter park -STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} 라이드 -STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} 라이드s -STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} item of food -STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} items of food -STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drink -STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drinks -STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenir -STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenirs -STR_2305 :Track design files -STR_2306 :Save track design -STR_2307 :Select {STRINGID} design -STR_2308 :{STRINGID} Track Designs -STR_2309 :설치 New Track Design -STR_2310 :Build custom design -STR_2311 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} (approx.) -STR_2312 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} (approx.) -STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) -STR_2314 :{WINDOW_COLOUR_2}라이드 length: {BLACK}{STRINGID} -STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} -STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks -STR_2317 : -STR_2318 : -STR_2319 : -STR_2320 : -STR_2321 :{WINDOW_COLOUR_2}Number of 라이드s/attractions: {BLACK}{COMMA16} -STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} -STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} -STR_2324 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}sq.ft. -STR_2325 :{SMALLFONT}{BLACK}Buy land to extend park -STR_2326 :{SMALLFONT}{BLACK}Buy construction rights to allow construction above or below land outside the park -STR_2327 :Options -STR_2328 :{WINDOW_COLOUR_2}Currency: -STR_2329 :{WINDOW_COLOUR_2}Distance and Speed: -STR_2330 :{WINDOW_COLOUR_2}Temperature: -STR_2331 :{WINDOW_COLOUR_2}Height Labels: -STR_2332 :Units -STR_2333 :Sound -STR_2334 :Pounds ({POUND}) -STR_2335 :Dollars ($) -STR_2336 :Franc (F) -STR_2337 :Deutschmark (DM) -STR_2338 :Yen ({YEN}) -STR_2339 :Peseta (Pts) -STR_2340 :Lira (L) -STR_2341 :Guilders (fl.) -STR_2342 :Krona (kr) -STR_2343 :Euros ({EURO}) -STR_2344 :Imperial -STR_2345 :Metric -STR_2346 :Display -STR_2347 :{RED}{STRINGID} has drowned! -STR_2348 :{SMALLFONT}{BLACK}Show statistics for this staff member -STR_2349 :{WINDOW_COLOUR_2}Wages: {BLACK}{CURRENCY} per month -STR_2350 :{WINDOW_COLOUR_2}Employed: {BLACK}{MONTHYEAR} -STR_2351 :{WINDOW_COLOUR_2}Lawns mown: {BLACK}{COMMA16} -STR_2352 :{WINDOW_COLOUR_2}Gardens watered: {BLACK}{COMMA16} -STR_2353 :{WINDOW_COLOUR_2}Litter swept: {BLACK}{COMMA16} -STR_2354 :{WINDOW_COLOUR_2}Bins emptied: {BLACK}{COMMA16} -STR_2355 :{WINDOW_COLOUR_2}라이드s fixed: {BLACK}{COMMA16} -STR_2356 :{WINDOW_COLOUR_2}라이드s inspected: {BLACK}{COMMA16} -STR_2357 :House -STR_2358 :Units -STR_2359 :Real Values -STR_2360 :{WINDOW_COLOUR_2}Display Resolution: -STR_2361 :Landscape Smoothing -STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off -STR_2363 :Gridlines on Landscape -STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off -STR_2365 :The bank refuses to increase your loan! -STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) -STR_2368 :None -STR_2369 :Low -STR_2370 :Average -STR_2371 :High -STR_2372 :Low -STR_2373 :Medium -STR_2374 :High -STR_2375 :Very high -STR_2376 :Extreme -STR_2377 :Ultra-Extreme -STR_2378 :{SMALLFONT}{BLACK}Adjust smaller area of land -STR_2379 :{SMALLFONT}{BLACK}Adjust larger area of land -STR_2380 :{SMALLFONT}{BLACK}Adjust smaller area of water -STR_2381 :{SMALLFONT}{BLACK}Adjust larger area of water -STR_2382 :Land -STR_2383 :Water -STR_2384 :{WINDOW_COLOUR_2}Your objective: -STR_2385 :{BLACK}None -STR_2386 :{BLACK}To have at least {COMMA16} 손님s in your park at the end of {MONTHYEAR}, with a park rating of at least 600 -STR_2387 :{BLACK}To achieve a park value of at least {POP16}{POP16}{CURRENCY} at the end of {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} -STR_2388 :{BLACK}Have Fun! -STR_2389 :{BLACK}Build the best {STRINGID} you can! -STR_2390 :{BLACK}To have 10 different types of 롤러코스터s operating in your park, each with an excitement value of at least 6.00 -STR_2391 :{BLACK}To have at least {COMMA16} 손님s in your park. You must not let the park rating drop below 700 at any time! -STR_2392 :{BLACK}To achieve a monthly income from 라이드 tickets of at least {POP16}{POP16}{CURRENCY} -STR_2393 :{BLACK}To have 10 different types of 롤러코스터s operating in your park, each with a 미니mum length of {LENGTH}, and an excitement rating of at least 7.00 -STR_2394 :{BLACK}To finish building all 5 of the partially built 롤러코스터s in this park, designing them to achieve excitement ratings of at least {POP16}{POP16}{COMMA2DP32} each -STR_2395 :{BLACK}To repay your loan and achieve a park value of at least {POP16}{POP16}{CURRENCY} -STR_2396 :{BLACK}To achieve a monthly profit from food, drink and merchandise sales of at least {POP16}{POP16}{CURRENCY} -STR_2397 :None -STR_2398 :Number of 손님s at a given date -STR_2399 :Park value at a given date -STR_2400 :Have fun -STR_2401 :Build the best 라이드 you can -STR_2402 :Build 10 롤러코스터s -STR_2403 :Number of 손님s in park -STR_2404 :Monthly income from 라이드 tickets -STR_2405 :Build 10 롤러코스터s of a given length -STR_2406 :Finish building 5 롤러코스터s -STR_2407 :Repay loan and achieve a given park value -STR_2408 :Monthly profit from food/merchandise -STR_2409 :{WINDOW_COLOUR_2}Marketing campaigns in operation -STR_2410 :{BLACK}None -STR_2411 :{WINDOW_COLOUR_2}Marketing campaigns available -STR_2412 :{SMALLFONT}{BLACK}Start this marketing campaign -STR_2413 :{BLACK}({CURRENCY2DP} per week) -STR_2414 :(Not Selected) -STR_2415 :{WINDOW_COLOUR_2}라이드: -STR_2416 :{WINDOW_COLOUR_2}Item: -STR_2417 :{WINDOW_COLOUR_2}Length of time: -STR_2418 :Free entry to {STRINGID} -STR_2419 :Free 라이드 on {STRINGID} -STR_2420 :Half-price entry to {STRINGID} -STR_2421 :Free {STRINGID} -STR_2422 :Advertising campaign for {STRINGID} -STR_2423 :Advertising campaign for {STRINGID} -STR_2424 :{WINDOW_COLOUR_2}Vouchers for free entry to the park -STR_2425 :{WINDOW_COLOUR_2}Vouchers for free 라이드s on a particular 라이드 -STR_2426 :{WINDOW_COLOUR_2}Vouchers for half-price entry to the park -STR_2427 :{WINDOW_COLOUR_2}Vouchers for free food or drink -STR_2428 :{WINDOW_COLOUR_2}Advertising campaign for the park -STR_2429 :{WINDOW_COLOUR_2}Advertising campaign for a particular 라이드 -STR_2430 :{BLACK}Vouchers for free entry to {STRINGID} -STR_2431 :{BLACK}Vouchers for free 라이드 on {STRINGID} -STR_2432 :{BLACK}Vouchers for half-price entry to {STRINGID} -STR_2433 :{BLACK}Vouchers for free {STRINGID} -STR_2434 :{BLACK}Advertising campaign for {STRINGID} -STR_2435 :{BLACK}Advertising campaign for {STRINGID} -STR_2436 :1 week -STR_2437 : -STR_2438 : -STR_2439 : -STR_2440 : -STR_2441 : -STR_2442 : -STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} -STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} -STR_2445 :Start this marketing campaign -STR_2446 :{YELLOW}Your marketing campaign for free entry to the park has finished -STR_2447 :{YELLOW}Your marketing campaign for free 라이드s on {STRINGID} has finished -STR_2448 :{YELLOW}Your marketing campaign for half-price entry to the park has finished -STR_2449 :{YELLOW}Your marketing campaign for free {STRINGID} has finished -STR_2450 :{YELLOW}Your advertising campaign for the park has finished -STR_2451 :{YELLOW}Your advertising campaign for {STRINGID} has finished -STR_2452 :{WINDOW_COLOUR_2}Cash (less loan): {BLACK}{CURRENCY2DP} -STR_2453 :{WINDOW_COLOUR_2}Cash (less loan): {RED}{CURRENCY2DP} +STR_2291 :새 게임을 시작할 시나리오를 선택하세요 +STR_2292 :{WINDOW_COLOUR_2}Rides been on: +STR_2293 :{BLACK} 없음 +STR_2294 :{SMALLFONT}{BLACK}땅 표면 모양을 변경합니다 +STR_2295 :{SMALLFONT}{BLACK}땅의 벽 모양을 변경합니다 +STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}(을)를 공원 입장료로 썼습니다 +STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}(을)를 {BLACK}{COMMA16} 놀이기구에 썼습니다 +STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}(을)를 {BLACK}{COMMA16} 놀이기구에 썼습니다 +STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}(을)를 음식 {BLACK}{COMMA16}종류에 썼습니다 +STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}(을)를 음식 {BLACK}{COMMA16}종류에 썼습니다 +STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}(을)를 음료수 {BLACK}{COMMA16}종류에 썼습니다 +STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}(을)를 음료수 {BLACK}{COMMA16}종류에 썼습니다 +STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}(을)를 기념품 {BLACK}{COMMA16}종류에 썼습니다 +STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2}(을)를 기념품 {BLACK}{COMMA16}종류에 썼습니다 +STR_2305 :트랙 디자인 파일 +STR_2306 :트랙 디자인 저장 +STR_2307 :{STRINGID} 디자인 선택 +STR_2308 :{STRINGID} 트랙 디자인 +STR_2309 :새 트랙 디자인 설치 +STR_2310 :직접 설치 +STR_2311 :{WINDOW_COLOUR_2}흥미도: {BLACK}{COMMA2DP32} (근사치) +STR_2312 :{WINDOW_COLOUR_2}격렬도: {BLACK}{COMMA2DP32} (근사치) +STR_2313 :{WINDOW_COLOUR_2}멀미도: {BLACK}{COMMA2DP32} (근사치) +STR_2314 :{WINDOW_COLOUR_2}놀이기구 길이: {BLACK}{STRINGID} +STR_2315 :{WINDOW_COLOUR_2}비용: {BLACK}약 {CURRENCY} +STR_2316 :{WINDOW_COLOUR_2}필요한 공간: {BLACK}{COMMA16} x {COMMA16}칸 +STR_2317 :<더 이상 사용하지 않음> +STR_2318 :<더 이상 사용하지 않음> +STR_2319 :<더 이상 사용하지 않음> +STR_2320 :<더 이상 사용하지 않음> +STR_2321 :{WINDOW_COLOUR_2}놀이기구/시설 수: {BLACK}{COMMA16} +STR_2322 :{WINDOW_COLOUR_2}직원: {BLACK}{COMMA16} +STR_2323 :{WINDOW_COLOUR_2}공원 크기: {BLACK}{COMMA32}m{SQUARED} +STR_2324 :{WINDOW_COLOUR_2}공원 크기: {BLACK}{COMMA32}sq.ft +STR_2325 :{SMALLFONT}{BLACK}공원을 확장하기 위해 땅을 구입합니다 +STR_2326 :{SMALLFONT}{BLACK}공원 바깥에 있는 땅의 고공 혹은 지하에 건설을 허용해주는 건설권을 구입합니다 +STR_2327 :설정 +STR_2328 :{WINDOW_COLOUR_2}화폐 단위: +STR_2329 :{WINDOW_COLOUR_2}거리 및 속력: +STR_2330 :{WINDOW_COLOUR_2}온도: +STR_2331 :{WINDOW_COLOUR_2}높이 단위: +STR_2332 :유닛 +STR_2333 :효과음 +STR_2334 :파운드 ({POUND}) +STR_2335 :달러 ($) +STR_2336 :프랑 (F) +STR_2337 :독일 마르크 (DM) +STR_2338 :엔 ({YEN}) +STR_2339 :페세타 (Pts) +STR_2340 :리라 (L) +STR_2341 :길더 (fl.) +STR_2342 :크로나 (kr) +STR_2343 :유로 ({EURO}) +STR_2344 :임페리얼법 +STR_2345 :미터법 +STR_2346 :화면 +STR_2347 :{RED}{STRINGID}(이)가 물에 빠졌습니다! +STR_2348 :{SMALLFONT}{BLACK}이 직원에 대한 통계를 보여줍니다 +STR_2349 :{WINDOW_COLOUR_2}급여: {BLACK}{CURRENCY}/월 +STR_2350 :{WINDOW_COLOUR_2}고용: {BLACK}{MONTHYEAR} +STR_2351 :{WINDOW_COLOUR_2}깎은 잔디: {BLACK}{COMMA16}칸 +STR_2352 :{WINDOW_COLOUR_2}물 준 정원: {BLACK}{COMMA16}개 +STR_2353 :{WINDOW_COLOUR_2}치운 토사물: {BLACK}{COMMA16}개 +STR_2354 :{WINDOW_COLOUR_2}비운 쓰레기통: {BLACK}{COMMA16}개 +STR_2355 :{WINDOW_COLOUR_2}수리한 놀이기구: {BLACK}{COMMA16}개 +STR_2356 :{WINDOW_COLOUR_2}점검한 놀이기구: {BLACK}{COMMA16}개 +STR_2357 :집 +STR_2358 :유닛 +STR_2359 :실제 값 +STR_2360 :{WINDOW_COLOUR_2}해상도: +STR_2361 :땅 테두리를 부드럽게 +STR_2362 :{SMALLFONT}{BLACK}땅의 테두리를 부드럽게 보입니다 +STR_2363 :땅에 격자선 보이기 +STR_2364 :{SMALLFONT}{BLACK}땅에 격자선을 보여줍니다 +STR_2365 :은행이 대출을 증가시키는 것을 거절했습니다! +STR_2366 :섭씨 ({DEGREE}C) +STR_2367 :화씨 (F) +STR_2368 :없음 +STR_2369 :낮음 +STR_2370 :평균 +STR_2371 :높음 +STR_2372 :낮음 +STR_2373 :보통 +STR_2374 :높음 +STR_2375 :매우 높음 +STR_2376 :극한 +STR_2377 :초극한 +STR_2378 :{SMALLFONT}{BLACK}땅 편집 크기 줄이기 +STR_2379 :{SMALLFONT}{BLACK}땅 편집 크기 늘이기 +STR_2380 :{SMALLFONT}{BLACK}물 편집 크기 줄이기 +STR_2381 :{SMALLFONT}{BLACK}물 편집 크기 늘이기 +STR_2382 :땅 +STR_2383 :물 +STR_2384 :{WINDOW_COLOUR_2}대상: +STR_2385 :{BLACK}없음 +STR_2386 :{BLACK}공원에 최소 {COMMA16}명 이상의 손님을 {MONTHYEAR}까지 유치하고, 공원 등급을 600 이상으로 유지하세요 +STR_2387 :{BLACK}최소 {POP16}{POP16}{CURRENCY} 이상의 공원 가치를 {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR}까지 달성하세요 +STR_2388 :{BLACK}즐기세요! +STR_2389 :{BLACK}최고의 {STRINGID}(을)를 건설하세요! +STR_2390 :{BLACK}흥미도가 최소 6.00을 넘는 10개의 다른 종류의 롤러코스터를 공원에 운용하세요 +STR_2391 :{BLACK}공원에 최소 {COMMA16}명 이상의 손님을 유치하세요. 단 한 순간이라도 공원 등급을 700 아래로 떨어뜨려서는 안 됩니다! +STR_2392 :{BLACK}놀이기구 탑승 수익만으로 월 수익을 최소 {POP16}{POP16}{CURRENCY} 이상 달성하세요 +STR_2393 :{BLACK}최소 길이가 {LENGTH} 이상이고 흥미도가 최소 7.00을 넘는 10개의 다른 종류의 롤러코스터를 공원에 운용하세요 +STR_2394 :{BLACK}이 공원에 미완성된 5대의 롤러코스터를 각각의 흥미도가 최소 {POP16}{POP16}{COMMA2DP32} 이상이 되도록 완성하세요 +STR_2395 :{BLACK}대출금을 모두 갚고 공원 가치를 최소 {POP16}{POP16}{CURRENCY} 이상 달성하세요 +STR_2396 :{BLACK}음식, 음료수, 기념품 판매 수익만으로 월 수익을 최소 {POP16}{POP16}{CURRENCY} 이상 달성하세요 +STR_2397 :없음 +STR_2398 :주어진 기간 내에 손님 수 달성 +STR_2399 :주어진 기간 내에 공원 가치 달성 +STR_2400 :즐기기 +STR_2401 :최고의 놀이기구 건설하기 +STR_2402 :10대의 롤러코스터 건설 +STR_2403 :손님 수 달성 (공원 등급 700 이상) +STR_2404 :월 놀이기구 탑승 수익 +STR_2405 :주어진 길이의 롤러코스터 10대 건설 +STR_2406 :롤러코스터 5대 완성 +STR_2407 :대출금을 모두 갚고 주어진 공원 가치 달성 +STR_2408 :월 음식/기념품 판매 수익 +STR_2409 :{WINDOW_COLOUR_2}진행 중인 광고 행사 +STR_2410 :{BLACK}없음 +STR_2411 :{WINDOW_COLOUR_2}시작할 수 있는 광고 행사 +STR_2412 :{SMALLFONT}{BLACK}이 광고 행사를 시작합니다 +STR_2413 :{BLACK}({CURRENCY2DP}/주) +STR_2414 :(선택되지 않음) +STR_2415 :{WINDOW_COLOUR_2}놀이기구: +STR_2416 :{WINDOW_COLOUR_2}항목: +STR_2417 :{WINDOW_COLOUR_2}시간: +STR_2418 :{STRINGID} 무료 입장권 +STR_2419 :{STRINGID} 놀이기구 무료 탑승권 +STR_2420 :{STRINGID} 반값 할인권 +STR_2421 :{STRINGID} 무료 이용권 +STR_2422 :{STRINGID} 광고 +STR_2423 :{STRINGID} 광고 +STR_2424 :{WINDOW_COLOUR_2}공원 무료 입장 쿠폰입니다 +STR_2425 :{WINDOW_COLOUR_2}특정 놀이기구의 무료 탑승 쿠폰입니다 +STR_2426 :{WINDOW_COLOUR_2}공원 입장료 반값 할인 쿠폰입니다 +STR_2427 :{WINDOW_COLOUR_2}음식이나 음료수 무료 이용 쿠폰입니다 +STR_2428 :{WINDOW_COLOUR_2}공원을 광고합니다 +STR_2429 :{WINDOW_COLOUR_2}특정 놀이기구를 광고합니다 +STR_2430 :{BLACK}{STRINGID} 무료 입장권 +STR_2431 :{BLACK}{STRINGID} 무료 탑승 쿠폰 +STR_2432 :{BLACK}{STRINGID} 반값 할인 쿠폰 +STR_2433 :{BLACK}{STRINGID} 무료 이용권 +STR_2434 :{BLACK}{STRINGID} 광고 +STR_2435 :{BLACK}{STRINGID} 광고 +STR_2436 :1주 +STR_2437 :<더 이상 사용하지 않음> +STR_2438 :<더 이상 사용하지 않음> +STR_2439 :<더 이상 사용하지 않음> +STR_2440 :<더 이상 사용하지 않음> +STR_2441 :<더 이상 사용하지 않음> +STR_2442 :<더 이상 사용하지 않음> +STR_2443 :{WINDOW_COLOUR_2}1주당 비용: {BLACK}{CURRENCY2DP} +STR_2444 :{WINDOW_COLOUR_2}총 비용: {BLACK}{CURRENCY2DP} +STR_2445 :이 광고 행사를 시작합니다 +STR_2446 :{YELLOW}공원 무료 입장 이벤트가 종료되었습니다 +STR_2447 :{YELLOW}{STRINGID} 무료 탑승 이벤트가 종료되었습니다 +STR_2448 :{YELLOW}공원 입장료 반값 할인 이벤트가 종료되었습니다 +STR_2449 :{YELLOW}{STRINGID} 무료 이용 이벤트가 종료되었습니다 +STR_2450 :{YELLOW}공원 광고가 종료되었습니다 +STR_2451 :{YELLOW}{STRINGID} 광고가 종료되었습니다 +STR_2452 :{WINDOW_COLOUR_2}재정 (대출 제외): {BLACK}{CURRENCY2DP} +STR_2453 :{WINDOW_COLOUR_2}재정 (대출 제외): {RED}{CURRENCY2DP} STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} - STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} - STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} - -STR_2457 :{SMALLFONT}{BLACK}Show financial accounts -STR_2458 :{SMALLFONT}{BLACK}Show graph of cash (less loan) over time -STR_2459 :{SMALLFONT}{BLACK}Show graph of park value over time -STR_2460 :{SMALLFONT}{BLACK}Show graph of weekly profit -STR_2461 :{SMALLFONT}{BLACK}Show marketing campaigns -STR_2462 :{SMALLFONT}{BLACK}Show view of park entrance -STR_2463 :{SMALLFONT}{BLACK}Show graph of park ratings over time -STR_2464 :{SMALLFONT}{BLACK}Show graph of 손님 numbers over time -STR_2465 :{SMALLFONT}{BLACK}Show park entrance price and information -STR_2466 :{SMALLFONT}{BLACK}Show park statistics -STR_2467 :{SMALLFONT}{BLACK}Show objectives for this game -STR_2468 :{SMALLFONT}{BLACK}Show recent awards this park has received -STR_2469 :{SMALLFONT}{BLACK}Select level of research & development -STR_2470 :{SMALLFONT}{BLACK}Research new transport 라이드s -STR_2471 :{SMALLFONT}{BLACK}Research new gentle 라이드s -STR_2472 :{SMALLFONT}{BLACK}Research new 롤러코스터s -STR_2473 :{SMALLFONT}{BLACK}Research new thrill 라이드s -STR_2474 :{SMALLFONT}{BLACK}Research new water 라이드s -STR_2475 :{SMALLFONT}{BLACK}Research new shops and 상점s -STR_2476 :{SMALLFONT}{BLACK}Research new scenery and themeing -STR_2477 :{SMALLFONT}{BLACK}Select operating mode for this 라이드/attraction -STR_2478 :{SMALLFONT}{BLACK}Show graph of velocity against time -STR_2479 :{SMALLFONT}{BLACK}Show graph of altitude against time -STR_2480 :{SMALLFONT}{BLACK}Show graph of vertical acceleration against time -STR_2481 :{SMALLFONT}{BLACK}Show graph of lateral acceleration against time -STR_2482 :{SMALLFONT}{BLACK}Profit: {CURRENCY} per week, Park Value: {CURRENCY} -STR_2483 :{WINDOW_COLOUR_2}Weekly profit: {BLACK}+{CURRENCY2DP} -STR_2484 :{WINDOW_COLOUR_2}Weekly profit: {RED}{CURRENCY2DP} -STR_2485 :Controls -STR_2486 :General -STR_2487 :Show 'real' names of 손님s -STR_2488 :{SMALLFONT}{BLACK}Toggle between showing 'real' names of 손님s and 손님 numbers -STR_2489 :Shortcut keys... -STR_2490 :Keyboard shortcuts -STR_2491 :Reset keys -STR_2492 :{SMALLFONT}{BLACK}Set all keyboard shortcuts back to default settings -STR_2493 :Close top-most window -STR_2494 :Close all floating windows -STR_2495 :Cancel construction mode -STR_2496 :Pause game -STR_2497 :Zoom view out -STR_2498 :Zoom view in -STR_2499 :Rotate view clockwise -STR_2500 :Rotate construction object -STR_2501 :Underground view toggle -STR_2502 :Remove base land toggle -STR_2503 :Remove vertical land toggle -STR_2504 :See-through 라이드s toggle -STR_2505 :See-through scenery toggle -STR_2506 :Invisible supports toggle -STR_2507 :Invisible people toggle -STR_2508 :Height marks on land toggle -STR_2509 :Height marks on 라이드 tracks toggle -STR_2510 :Height marks on paths toggle -STR_2511 :Adjust land -STR_2512 :Adjust water -STR_2513 :Build scenery -STR_2514 :Build paths -STR_2515 :Build new 라이드 -STR_2516 :Show financial information -STR_2517 :Show research information -STR_2518 :Show 라이드s list -STR_2519 :Show park information -STR_2520 :Show 손님 list -STR_2521 :Show staff list -STR_2522 :Show recent messages -STR_2523 :Show map -STR_2524 :Screenshot +STR_2457 :{SMALLFONT}{BLACK}재정 요약을 보여줍니다 +STR_2458 :{SMALLFONT}{BLACK}시간에 따른 재정 보유 그래프(대출 제외)를 보여줍니다 +STR_2459 :{SMALLFONT}{BLACK}시간에 따른 공원 가치 그래프를 보여줍니다 +STR_2460 :{SMALLFONT}{BLACK}주간 수익 그래프를 보여줍니다 +STR_2461 :{SMALLFONT}{BLACK}광고 이벤트를 보여줍니다 +STR_2462 :{SMALLFONT}{BLACK}공원 입구 위치로 이동합니다 +STR_2463 :{SMALLFONT}{BLACK}시간에 따른 공원 등급 그래프를 보여줍니다 +STR_2464 :{SMALLFONT}{BLACK}시간에 따른 손님 수 그래프를 보여줍니다 +STR_2465 :{SMALLFONT}{BLACK}공원 입장료와 정보를 보여줍니다 +STR_2466 :{SMALLFONT}{BLACK}공원 통계를 보여줍니다 +STR_2467 :{SMALLFONT}{BLACK}이 게임의 목표를 보여줍니다 +STR_2468 :{SMALLFONT}{BLACK}이 공원이 최근에 받은 상을 보여줍니다 +STR_2469 :{SMALLFONT}{BLACK}연구 & 개발 수준을 선택합니다 +STR_2470 :{SMALLFONT}{BLACK}새 운송용 놀이기구를 개발합니다 +STR_2471 :{SMALLFONT}{BLACK}새 얌전한 놀이기구를 개발합니다 +STR_2472 :{SMALLFONT}{BLACK}새 롤러코스터를 개발합니다 +STR_2473 :{SMALLFONT}{BLACK}새 스릴있는 놀이기구를 개발합니다 +STR_2474 :{SMALLFONT}{BLACK}새 물 놀이기구를 개발합니다 +STR_2475 :{SMALLFONT}{BLACK}새 상점/매점을 개발합니다 +STR_2476 :{SMALLFONT}{BLACK}새 풍경/테마를 개발합니다 +STR_2477 :{SMALLFONT}{BLACK}이 놀이기구/시설의 운영 모드를 선택합니다 +STR_2478 :{SMALLFONT}{BLACK}시간에 따른 속력 그래프를 보여줍니다 +STR_2479 :{SMALLFONT}{BLACK}시간에 따른 고도 그래프를 보여줍니다 +STR_2480 :{SMALLFONT}{BLACK}시간에 따른 수직 가속도 그래프를 보여줍니다 +STR_2481 :{SMALLFONT}{BLACK}시간에 따른 측면 가속도 그래프를 보여줍니다 +STR_2482 :{SMALLFONT}{BLACK}수익: {CURRENCY}/주, 공원 가치: {CURRENCY} +STR_2483 :{WINDOW_COLOUR_2}주간 수익: {BLACK}+{CURRENCY2DP} +STR_2484 :{WINDOW_COLOUR_2}주간 수익: {RED}{CURRENCY2DP} +STR_2485 :조작 +STR_2486 :일반 +STR_2487 :손님들의 '실제' 이름을 표시 +STR_2488 :{SMALLFONT}{BLACK}손님들의 이름을 '실제' 이름으로 보여줄지 번호로 보여줄지를 선택합니다 +STR_2489 :단축키 설정... +STR_2490 :키보드 단축키 +STR_2491 :단축키 초기화 +STR_2492 :{SMALLFONT}{BLACK}모든 키보드 단축키를 기본 설정으로 되돌립니다 +STR_2493 :가장 위에 있는 창 닫기 +STR_2494 :모든 창 닫기 +STR_2495 :건설 모드 취소 +STR_2496 :게임 일시정지 +STR_2497 :화면 축소 +STR_2498 :화면 확대 +STR_2499 :게임 화면 시계 방향으로 회전 +STR_2500 :건설 대상 회전 +STR_2501 :지하 시야 토글 +STR_2502 :땅 표면 제거 +STR_2503 :벽면 제거 +STR_2504 :놀이기구 투명화 +STR_2505 :풍경 투명화 +STR_2506 :지지대 투명화 +STR_2507 :사람 투명화 +STR_2508 :지형 고도 표시 +STR_2509 :놀이기구 트랙 고도 표시 +STR_2510 :보도 고도 표시 +STR_2511 :땅 편집 +STR_2512 :물 편집 +STR_2513 :풍경 제작 +STR_2514 :보도 건설 +STR_2515 :새 놀이기구 건설 +STR_2516 :재정 정보를 보여줍니다 +STR_2517 :개발 정보를 보여줍니다 +STR_2518 :놀이기구 목록을 보여줍니다 +STR_2519 :공원 정보를 보여줍니다 +STR_2520 :손님 목록을 보여줍니다 +STR_2521 :직원 목록을 보여줍니다 +STR_2522 :최근 메시지를 보여줍니다 +STR_2523 :지도를 봅니다 +STR_2524 :스크린 샷 ### The following need to be reordered to match SDL_keycode layout. STR_2525 :??? STR_2526 :??? @@ -2685,37 +2685,37 @@ STR_2676 :??? STR_2677 :??? STR_2678 :??? STR_2679 :??? -STR_2680 :All research complete -STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} -STR_2682 : -STR_2683 : -STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive -STR_2685 :Simplex Noise Parameters -STR_2686 :{WINDOW_COLOUR_2}Low: -STR_2687 :{WINDOW_COLOUR_2}High: -STR_2688 :{WINDOW_COLOUR_2}Base Frequency: -STR_2689 :{WINDOW_COLOUR_2}Octaves: -STR_2690 :Map Generation -STR_2691 :{WINDOW_COLOUR_2}Base height: -STR_2692 :{WINDOW_COLOUR_2}Water level: -STR_2693 :{WINDOW_COLOUR_2}Terrain: -STR_2694 :Generate -STR_2695 :Random terrain -STR_2696 :Place trees +STR_2680 :모든 연구가 완료되었습니다 +STR_2681 :{MEDIUMFONT}{BLACK}돈 {CURRENCY} 늘리기 +STR_2682 :<더 이상 사용하지 않음> +STR_2683 :<더 이상 사용하지 않음> +STR_2684 :{SMALLFONT}{BLACK}손님 대규모로 불러오기 +STR_2685 :단일 노이즈 매개 변수 +STR_2686 :{WINDOW_COLOUR_2}저: +STR_2687 :{WINDOW_COLOUR_2}고: +STR_2688 :{WINDOW_COLOUR_2}기본 주파수: +STR_2689 :{WINDOW_COLOUR_2}옥타브: +STR_2690 :지도 생성 +STR_2691 :{WINDOW_COLOUR_2}기본 높이: +STR_2692 :{WINDOW_COLOUR_2}수면 높이: +STR_2693 :{WINDOW_COLOUR_2}지형: +STR_2694 :생성 +STR_2695 :무작위 지형 +STR_2696 :나무 심기 STR_2697 :??? STR_2698 :??? STR_2699 :??? -STR_2700 :Autosave frequency: -STR_2701 :Every week -STR_2702 :Every 2 weeks -STR_2703 :Every month -STR_2704 :Every 4 months -STR_2705 :Every year -STR_2706 :Never -STR_2707 :Open new window -STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? -STR_2709 :Overwrite -STR_2710 :Type the name of the file. +STR_2700 :자동 저장 주기: +STR_2701 :매 1주마다 +STR_2702 :매 2주마다 +STR_2703 :매 1개월마다 +STR_2704 :매 4개월마다 +STR_2705 :매 1년마다 +STR_2706 :안 함 +STR_2707 :새 창 열기 +STR_2708 :{WINDOW_COLOUR_1}정말 {STRINGID}에 덮어씌우시겠습니까? +STR_2709 :덮어쓰기 +STR_2710 :파일 이름을 입력하세요. STR_2711 :; STR_2712 := STR_2713 :, @@ -2723,167 +2723,167 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(up) -STR_2719 :(new file) -STR_2720 :{UINT16}sec -STR_2721 :{UINT16}secs -STR_2722 :{UINT16}min:{UINT16}sec -STR_2723 :{UINT16}min:{UINT16}secs -STR_2724 :{UINT16}mins:{UINT16}sec -STR_2725 :{UINT16}mins:{UINT16}secs -STR_2726 :{UINT16}min -STR_2727 :{UINT16}mins -STR_2728 :{UINT16}hour:{UINT16}min -STR_2729 :{UINT16}hour:{UINT16}mins -STR_2730 :{UINT16}hours:{UINT16}min -STR_2731 :{UINT16}hours:{UINT16}mins +STR_2718 :(상위 폴더) +STR_2719 :(새 파일) +STR_2720 :{UINT16}초 +STR_2721 :{UINT16}초 +STR_2722 :{UINT16}분 {UINT16}초 +STR_2723 :{UINT16}분 {UINT16}초 +STR_2724 :{UINT16}분 {UINT16}초 +STR_2725 :{UINT16}분 {UINT16}초 +STR_2726 :{UINT16}분 +STR_2727 :{UINT16}분 +STR_2728 :{UINT16}시간 {UINT16}분 +STR_2729 :{UINT16}시간 {UINT16}분 +STR_2730 :{UINT16}시간 {UINT16}분 +STR_2731 :{UINT16}시간 {UINT16}분 STR_2732 :{COMMA16}ft STR_2733 :{COMMA16}m STR_2734 :{COMMA16}mph STR_2735 :{COMMA16}km/h -STR_2736 :{MONTH}, Year {COMMA16} -STR_2737 :{STRINGID} {MONTH}, Year {COMMA16} -STR_2738 :Title screen music: -STR_2739 :None -STR_2740 :Roller코스터 Tycoon 1 -STR_2741 :Roller코스터 Tycoon 2 -STR_2742 :css50.dat not found -STR_2743 :Copy data\css17.dat from your RCT1 설치ation to data\css50.dat in your RCT2 설치ation. +STR_2736 :{COMMA16}년 {MONTH} +STR_2737 :{COMMA16}년 {MONTH} {STRINGID} +STR_2738 :타이틀 스크린 음악: +STR_2739 :없음 +STR_2740 :롤러코스터 타이쿤 1 +STR_2741 :롤러코스터 타이쿤 2 +STR_2742 :css50.dat 파일을 찾을 수 없습니다 +STR_2743 :data\css17.dat 파일을 RCT1 설치 폴더에서 복사하여 RCT2가 설치된 폴더 안에 data\css50.dat 이름으로 바꾸어 넣으십시오. STR_2744 :[ STR_2745 :\ STR_2746 :] STR_2747 :{ENDQUOTES} -STR_2748 :Bar -STR_2749 :My new scenario +STR_2748 :바 +STR_2749 :내 새 시나리오 # New strings used in the cheats window previously these were ??? -STR_2750 :Move all items to top -STR_2751 :Move all items to bottom -STR_2752 :Clear grass -STR_2753 :Mowed grass -STR_2754 :Water plants -STR_2755 :Fix vandalism -STR_2756 :Remove litter -STR_2757 :Force Sun -STR_2758 :Force Thunder -STR_2759 :Zero Clearance +STR_2750 :모든 항목을 위로 +STR_2751 :모든 항목을 아래로 +STR_2752 :잔디 청소 +STR_2753 :잔디 깎기 +STR_2754 :물 주기 +STR_2755 :파괴된 시설물 수리 +STR_2756 :쓰레기통 비우기 +STR_2757 :항상 맑음 +STR_2758 :항상 비 +STR_2759 :보도 청소 STR_2760 :+{CURRENCY} -STR_2761 : -STR_2762 : +STR_2761 :<더 이상 사용하지 않음> +STR_2762 :<더 이상 사용하지 않음> STR_2763 :??? -STR_2764 : -STR_2765 :Large Tram -STR_2766 :Win scenario -STR_2767 :Freeze Climate -STR_2768 :Unfreeze Climate -STR_2769 :Open Park -STR_2770 :Close Park -STR_2771 :Slower Gamespeed -STR_2772 :Faster Gamespeed -STR_2773 :Windowed -STR_2774 :Fullscreen -STR_2775 :Fullscreen (desktop) -STR_2776 :Language: +STR_2764 :<더 이상 사용하지 않음> +STR_2765 :손님 많이 부르기 +STR_2766 :시나리오 클리어 +STR_2767 :기후 고정 +STR_2768 :기후 고정 해제 +STR_2769 :공원 열기 +STR_2770 :공원 닫기 +STR_2771 :게임 속도 느리게 +STR_2772 :게임 속도 빠르게 +STR_2773 :창 모드 +STR_2774 :풀 스크린 +STR_2775 :풀 스크린 (데스크탑) +STR_2776 :언어: STR_2777 :{MOVE_X}{SMALLFONT}{STRING} STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} -STR_2779 :Viewport #{COMMA16} -STR_2780 :Extra viewport +STR_2779 :외부화면 #{COMMA16} +STR_2780 :추가 외부화면 # End of new strings STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + -STR_2784 :Change keyboard shortcut -STR_2785 :{WINDOW_COLOUR_2}Press new shortcut key for:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} -STR_2786 :{SMALLFONT}{BLACK}Click on shortcut description to select new key -STR_2787 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} -STR_2788 :{WINDOW_COLOUR_2}Congratulations !{NEWLINE}{BLACK}You achieved your objective with a company value of {CURRENCY} ! -STR_2789 :{WINDOW_COLOUR_2}You have failed your objective ! -STR_2790 :Enter name into scenario chart -STR_2791 :Enter name -STR_2792 :Please enter your name for the scenario chart: -STR_2793 :{SMALLFONT}(Completed by {STRINGID}) -STR_2794 :{WINDOW_COLOUR_2}Completed by: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} with a company value of: {BLACK}{CURRENCY} -STR_2795 :Sort -STR_2796 :{SMALLFONT}{BLACK}Sort the 라이드 list into order using the information type displayed -STR_2797 :Scroll view when pointer at screen edge -STR_2798 :{SMALLFONT}{BLACK}Select whether to scroll the view when the mouse pointer is at the screen edge -STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments -STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32} -STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP} -STR_2802 :Map -STR_2803 :{SMALLFONT}{BLACK}Show these 손님s highlighted on map -STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map -STR_2805 :{SMALLFONT}{BLACK}Show map of park -STR_2806 :{RED}손님s are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organising them better -STR_2807 :{RED}손님s are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organising them better -STR_2808 :{RED}손님s are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organising them better -STR_2809 :{RED}손님s are hungry and can't find anywhere to buy food -STR_2810 :{RED}손님s are thirsty and can't find anywhere to buy drinks -STR_2811 :{RED}손님s are complaining because they can't find the toilets in your park -STR_2812 :{RED}손님s are getting lost or stuck{NEWLINE}Check whether the layout of your 보도s needs improving to help the 손님s find their way around -STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more 손님s -STR_2814 :{WINDOW_COLOUR_2}Most untidy park award -STR_2815 :{WINDOW_COLOUR_2}Tidiest park award -STR_2816 :{WINDOW_COLOUR_2}Award for the park with the best 롤러코스터s -STR_2817 :{WINDOW_COLOUR_2}Best value park award -STR_2818 :{WINDOW_COLOUR_2}Most beautiful park award -STR_2819 :{WINDOW_COLOUR_2}Worst value park award -STR_2820 :{WINDOW_COLOUR_2}Safest park award -STR_2821 :{WINDOW_COLOUR_2}Best staff award -STR_2822 :{WINDOW_COLOUR_2}Best park food award -STR_2823 :{WINDOW_COLOUR_2}Worst park food award -STR_2824 :{WINDOW_COLOUR_2}Best park toilets award -STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award -STR_2826 :{WINDOW_COLOUR_2}Best water 라이드s award -STR_2827 :{WINDOW_COLOUR_2}Best custom-designed 라이드s award -STR_2828 :{WINDOW_COLOUR_2}Most dazzling 라이드 colour schemes award -STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award -STR_2830 :{WINDOW_COLOUR_2}Best gentle 라이드 award -STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'! -STR_2832 :{TOPAZ}Your park has received an award for being 'The tidiest park in the country'! -STR_2833 :{TOPAZ}Your park has received an award for being 'The park with the best 롤러코스터s'! -STR_2834 :{TOPAZ}Your park has received an award for being 'The best value park in the country'! -STR_2835 :{TOPAZ}Your park has received an award for being 'The most beautiful park in the country'! -STR_2836 :{TOPAZ}Your park has received an award for being 'The worst value park in the country'! -STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park in the country'! -STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! -STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! -STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! -STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best toilet facilities in the country'! -STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! -STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water 라이드s in the country'! -STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed 라이드s'! -STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of colour schemes'! -STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! -STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle 라이드s'! -STR_2848 :{WINDOW_COLOUR_2}No recent awards -STR_2849 :New scenario 설치ed successfully -STR_2850 :New track design 설치ed successfully -STR_2851 :Scenario already 설치ed -STR_2852 :Track design already 설치ed -STR_2853 :Forbidden by the local authority! -STR_2854 :{RED}손님s can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance -STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the 라이드 exit -STR_2856 :{WINDOW_COLOUR_2}Tutorial -STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) -STR_2858 :Can't start marketing campaign... -STR_2859 :Another instance of OpenRCT2 is already running -STR_2860 :Infogrames Interactive credits... +STR_2784 :키보드 단축키 변경 +STR_2785 :{WINDOW_COLOUR_2}새 단축키를 누르세요:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} +STR_2786 :{SMALLFONT}{BLACK}새 단축키를 설정하려면 단축키 설명을 클릭하세요 +STR_2787 :{WINDOW_COLOUR_2}공원 가치: {BLACK}{CURRENCY} +STR_2788 :{WINDOW_COLOUR_2}축하합니다 !{NEWLINE}{BLACK}시나리오 목표를 {CURRENCY}의 회사 가치로 달성하였습니다 ! +STR_2789 :{WINDOW_COLOUR_2}목표 달성에 실패하였습니다 ! +STR_2790 :시나리오 차트에 이름을 기록하세요 +STR_2791 :이름을 입력하세요 +STR_2792 :시나리오 차트에 이름을 기록하세요: +STR_2793 :{SMALLFONT}(달성: {STRINGID}) +STR_2794 :{WINDOW_COLOUR_2}달성: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2}회사 가치: {BLACK}{CURRENCY} +STR_2795 :정렬 +STR_2796 :{SMALLFONT}{BLACK}놀이기구 목록을 정보 종류에 따라 정렬하여 표시합니다. +STR_2797 :화면 가장자리에 커서를 가져가면 화면을 스크롤 +STR_2798 :{SMALLFONT}{BLACK}화면 가장자리에 마우스 커서를 가까이 대면 게임 화면을 스크롤할지를 선택합니다 +STR_2799 :{SMALLFONT}{BLACK}지정되어 있는 조작 키를 확인하거나 변경합니다 +STR_2800 :{WINDOW_COLOUR_2}총 입장료: {BLACK}{COMMA32} +STR_2801 :{WINDOW_COLOUR_2}입장료로 벌어들인 수익: {BLACK}{CURRENCY2DP} +STR_2802 :지도 +STR_2803 :{SMALLFONT}{BLACK}이 손님들을 지도에 하이라이트하여 표시합니다 +STR_2804 :{SMALLFONT}{BLACK}이 직원들을 지도에 하이라이트하여 표시합니다 +STR_2805 :{SMALLFONT}{BLACK}공원의 지도를 표시합니다 +STR_2806 :{RED}손님들이 공원의 더러운 보도 청소 상태에 대해 불평하고 있습니다{NEWLINE}미화원을 더 고용하거나 미화원의 업무 효율성을 점검하세요 +STR_2807 :{RED}손님들이 공원에 널린 쓰레기에 대해 불평하고 있습니다{NEWLINE}미화원을 더 고용하거나 미화원의 업무 효율성을 점검하세요 +STR_2808 :{RED}손님들이 공원에서 일어난 시설물 파괴에 대해 불평하고 있습니다{NEWLINE}경비원을 더 고용하거나 경비원의 업무 효율성을 점검하세요 +STR_2809 :{RED}손님들이 배가 고프지만 음식을 살 곳을 찾지 못하고 있습니다 +STR_2810 :{RED}손님들이 목이 마르지만 음료수를 살 곳을 찾지 못하고 있습니다 +STR_2811 :{RED}손님들이 공원에서 화장실을 찾을 수 없다고 불평하고 있습니다 +STR_2812 :{RED}손님들이 길을 잃었거나 갇혔습니다{NEWLINE}보도의 구조를 손님들이 길을 더 쉽게 찾을 수 있도록 개선하세요 +STR_2813 :{RED}공원 입장료가 너무 비쌉니다!{NEWLINE}손님을 더 유치하려면 공원 입장료를 내리거나 공원 가치를 올리세요 +STR_2814 :{WINDOW_COLOUR_2}가장 지저분한 공원 상 +STR_2815 :{WINDOW_COLOUR_2}가장 깔끔한 공원 상 +STR_2816 :{WINDOW_COLOUR_2}최고의 롤러코스터가 있는 공원 상 +STR_2817 :{WINDOW_COLOUR_2}최고의 공원 이용료 상 +STR_2818 :{WINDOW_COLOUR_2}가장 아름다운 공원 상 +STR_2819 :{WINDOW_COLOUR_2}최악의 공원 이용료 상 +STR_2820 :{WINDOW_COLOUR_2}가장 안전한 공원 상 +STR_2821 :{WINDOW_COLOUR_2}최고의 직원 상 +STR_2822 :{WINDOW_COLOUR_2}최고의 공원 음식 상 +STR_2823 :{WINDOW_COLOUR_2}최악의 공원 음식 상 +STR_2824 :{WINDOW_COLOUR_2}최고의 공원 화장실 상 +STR_2825 :{WINDOW_COLOUR_2}가장 실망스러운 공원 상 +STR_2826 :{WINDOW_COLOUR_2}최고의 물 놀이기구 상 +STR_2827 :{WINDOW_COLOUR_2}최고의 커스텀 디자인 놀이기구 상 +STR_2828 :{WINDOW_COLOUR_2}최고의 눈부신 놀이기구 색상 조합 상 +STR_2829 :{WINDOW_COLOUR_2}가장 복잡한 공원 구조 상 +STR_2830 :{WINDOW_COLOUR_2}최고의 얌전한 놀이기구 상 +STR_2831 :{TOPAZ}공원이 '우리나라에서 가장 지저분한 공원 상'을 받았습니다... +STR_2832 :{TOPAZ}공원이 '우리나라에서 가장 깔끔한 공원 상'을 받았습니다! +STR_2833 :{TOPAZ}공원이 '우리나라 최고의 롤러코스터가 있는 공원 상'을 받았습니다! +STR_2834 :{TOPAZ}공원이 '우리나라 최고의 공원 이용료 상'을 받았습니다! +STR_2835 :{TOPAZ}공원이 '우리나라에서 가장 아름다운 공원 상'을 받았습니다! +STR_2836 :{TOPAZ}공원이 '우리나라 최악의 공원 이용료 상'을 받았습니다... +STR_2837 :{TOPAZ}공원이 '우리나라에서 가장 안전한 공원 상'을 받았습니다! +STR_2838 :{TOPAZ}공원이 '우리나라 최고의 직원 상'을 받았습니다! +STR_2839 :{TOPAZ}공원이 '우리나라 최고의 공원 음식 상'을 받았습니다! +STR_2840 :{TOPAZ}공원이 '우리나라 최악의 공원 음식 상'을 받았습니다... +STR_2841 :{TOPAZ}공원이 '우리나라 최고의 공원 화장실 상'을 받았습니다! +STR_2842 :{TOPAZ}공원이 '우리나라에서 가장 실망스러운 공원 상'을 받았습니다... +STR_2843 :{TOPAZ}공원이 '우리나라 최고의 물 놀이기구 상'을 받았습니다! +STR_2844 :{TOPAZ}공원이 '우리나라 최고의 커스텀 디자인 놀이기구 상'을 받았습니다! +STR_2845 :{TOPAZ}공원이 '우리나라 최고의 눈부신 놀이기구 색상 조합 상'을 받았습니다! +STR_2846 :{TOPAZ}공원이 '우리나라에서 가장 복잡한 공원 구조 상'을 받았습니다... +STR_2847 :{TOPAZ}공원이 '우리나라 최고의 얌전한 놀이기구 상'을 받았습니다! +STR_2848 :{WINDOW_COLOUR_2}최근에 받은 상 없음 +STR_2849 :새 시나리오 설치가 성공적으로 완료되었습니다 +STR_2850 :새 트랙 디자인 설치가 성공적으로 완료되었습니다 +STR_2851 :시나리오가 이미 설치되어 있습니다 +STR_2852 :트랙 디자인이 이미 설치되어 있습니다 +STR_2853 :지역 당국에 의해 금지된 행위입니다! +STR_2854 :{RED}손님들이 {STRINGID}의 입구로 갈 수 없습니다 !{NEWLINE}입구로 가는 길을 만드세요 +STR_2855 :{RED}{STRINGID}의 출구에서 나오는 길이 없습니다 !{NEWLINE}출구로 가는 길을 만드세요 +STR_2856 :{WINDOW_COLOUR_2}튜토리얼 +STR_2857 :{WINDOW_COLOUR_2}(조작하려면 마우스나 키보드 키를 누르세요) +STR_2858 :광고 이벤트를 시작할 수 없습니다... +STR_2859 :OpenRCT2 프로그램이 이미 실행 중입니다 +STR_2860 :Infogrames Interactive 제공... STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. -STR_2862 :Music acknowledgements... -STR_2863 :Music acknowledgements -STR_2864 :{WINDOW_COLOUR_2}March - Children of the Regiment: (Fucik) non copyright +STR_2862 :음악 저작권... +STR_2863 :음악 저작권 +STR_2864 :{WINDOW_COLOUR_2}March - Children of the Regiment: (푸치크) 저작권 없음 STR_2865 :{WINDOW_COLOUR_2}Heyken's Serenade: (J.Heyken) British Standard Music Coy; GEMA, BRITICO -STR_2866 :{WINDOW_COLOUR_2}In Continental Mood: (Composer 알 수 없는) Copyright Control -STR_2867 :{WINDOW_COLOUR_2}Wedding Journey: (Traditional) -STR_2868 :{WINDOW_COLOUR_2}Tales from the Vienna Woods: (Johann Strauss) non copyright -STR_2869 :{WINDOW_COLOUR_2}Slavonic Dance: (Traditional) -STR_2870 :{WINDOW_COLOUR_2}Das Alpenhorn: (Traditional) -STR_2871 :{WINDOW_COLOUR_2}The Blond Sailor: (Traditional) -STR_2872 :{WINDOW_COLOUR_2}Overture - Poet and Peasant: (Suppe) non copyright -STR_2873 :{WINDOW_COLOUR_2}Waltz Medley: (Johann Strauss) non copyright -STR_2874 :{WINDOW_COLOUR_2}Bella Bella Bimba: (Traditional) +STR_2866 :{WINDOW_COLOUR_2}In Continental Mood: (작곡가 미상) Copyright Control +STR_2867 :{WINDOW_COLOUR_2}Wedding Journey: (민요) +STR_2868 :{WINDOW_COLOUR_2}Tales from the Vienna Woods: (요한 스트라우스) 저작권 없음 +STR_2869 :{WINDOW_COLOUR_2}Slavonic Dance: (민요) +STR_2870 :{WINDOW_COLOUR_2}Das Alpenhorn: (민요) +STR_2871 :{WINDOW_COLOUR_2}The Blond Sailor: (민요) +STR_2872 :{WINDOW_COLOUR_2}Overture - Poet and Peasant: (주페) 저작권 없음 +STR_2873 :{WINDOW_COLOUR_2}Waltz Medley: (요한 스트라우스) 저작권 없음 +STR_2874 :{WINDOW_COLOUR_2}Bella Bella Bimba: (민요) STR_2875 :{WINDOW_COLOUR_2}Original recordings (P) 1976 C.J.Mears Organization, used with consent -STR_2876 :{WINDOW_COLOUR_2}Roller코스터 Tycoon 2 Title Music: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2876 :{WINDOW_COLOUR_2}RollerCoaster Tycoon 2 타이틀 음악: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer STR_2877 :{WINDOW_COLOUR_2}Dodgems Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer STR_2878 :{WINDOW_COLOUR_2}Mid Summer's Heat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer STR_2879 :{WINDOW_COLOUR_2}Pharaoh's Tomb: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer @@ -2904,7 +2904,7 @@ STR_2893 :{WINDOW_COLOUR_2}Searchlight Rag: (Scott Joplin/Allister Brimble) STR_2894 :{WINDOW_COLOUR_2}Flight of Fantasy: (Steve Blenkinsopp) copyright {COPYRIGHT} Chris Sawyer STR_2895 :{WINDOW_COLOUR_2}Big Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer STR_2896 :{WINDOW_COLOUR_2}Hypothermia: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2897 :{WINDOW_COLOUR_2}Last Sleigh 라이드: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2897 :{WINDOW_COLOUR_2}Last Sleigh Ride: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer STR_2898 :{WINDOW_COLOUR_2}Pipes of Glencairn: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer STR_2899 :{WINDOW_COLOUR_2}Traffic Jam: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer STR_2900 :{WINDOW_COLOUR_2} @@ -2916,28 +2916,28 @@ STR_2905 :{WINDOW_COLOUR_2}Techno Torture: (Allister Brimble) copyright {CO STR_2906 :{WINDOW_COLOUR_2}Sweat Dreams: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer STR_2907 :{WINDOW_COLOUR_2}What shall we do with the Drunken Sailor: (Anon/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer STR_2908 :{WINDOW_COLOUR_2}Infogrames Interactive -STR_2909 :{WINDOW_COLOUR_2}Senior Producer: Thomas J. Zahorik -STR_2910 :{WINDOW_COLOUR_2}Executive Producer: Bill Levay -STR_2911 :{WINDOW_COLOUR_2}Senior Marketing Product Manager: Scott Triola -STR_2912 :{WINDOW_COLOUR_2}V.P. of Product Development: Scott Walker -STR_2913 :{WINDOW_COLOUR_2}General Manager: John Hurlbut -STR_2914 :{WINDOW_COLOUR_2}Director of Quality Assurance: Michael Craighead -STR_2915 :{WINDOW_COLOUR_2}Q.A. Certification Manager: Kurt Boutin -STR_2916 :{WINDOW_COLOUR_2}Q.A. Certification Lead: Mark Huggins -STR_2917 :{WINDOW_COLOUR_2}Testers: Dena Irene Fitzgerald, Scott Rollins, Christopher McPhail +STR_2909 :{WINDOW_COLOUR_2}수석 프로듀서: Thomas J. Zahorik +STR_2910 :{WINDOW_COLOUR_2}제작 책임자: Bill Levay +STR_2911 :{WINDOW_COLOUR_2}수석 마케팅 프로덕트 매니저: Scott Triola +STR_2912 :{WINDOW_COLOUR_2}프로덕트 개발 V.P.: Scott Walker +STR_2913 :{WINDOW_COLOUR_2}일반 매니저: John Hurlbut +STR_2914 :{WINDOW_COLOUR_2}품질 보증 감독: Michael Craighead +STR_2915 :{WINDOW_COLOUR_2}Q.A. 인증 매니저: Kurt Boutin +STR_2916 :{WINDOW_COLOUR_2}Q.A. 인증 리드: Mark Huggins +STR_2917 :{WINDOW_COLOUR_2}테스터: Dena Irene Fitzgerald, Scott Rollins, Christopher McPhail STR_2918 :{WINDOW_COLOUR_2}Clif McClure, Erik Maramaldi, Erik Jeffery -STR_2919 :{WINDOW_COLOUR_2}Director of Marketing: Ann Marie Bland -STR_2920 :{WINDOW_COLOUR_2}Manager of Creative Services: Steve Martin -STR_2921 :{WINDOW_COLOUR_2}Manager of Editorial & Documentation Services: Elizabeth Mackney -STR_2922 :{WINDOW_COLOUR_2}Graphic Designer: Paul Anselmi -STR_2923 :{WINDOW_COLOUR_2}Copywriter: Kurt Carlson -STR_2924 :{WINDOW_COLOUR_2}Special Thanks to: Peter Matiss -STR_2925 :{WINDOW_COLOUR_2}Engineering Specialist: Ken Edwards -STR_2926 :{WINDOW_COLOUR_2}Engineering Services Manager: Luis Rivas -STR_2927 :{WINDOW_COLOUR_2}Lead Compatibility Analyst: Geoffrey Smith -STR_2928 :{WINDOW_COLOUR_2}Compatibility Analysts: Jason Cordero, Burke McQuinn, Kim Jardin -STR_2929 :{WINDOW_COLOUR_2}Lead Tester: Daniel Frisoli -STR_2930 :{WINDOW_COLOUR_2}Senior Tester: Matt Pantaleoni +STR_2919 :{WINDOW_COLOUR_2}마케팅 감독: Ann Marie Bland +STR_2920 :{WINDOW_COLOUR_2}창조형 서비스 매니저: Steve Martin +STR_2921 :{WINDOW_COLOUR_2}편집 & 문서 서비스 매니저: Elizabeth Mackney +STR_2922 :{WINDOW_COLOUR_2}그래픽 디자이너: Paul Anselmi +STR_2923 :{WINDOW_COLOUR_2}카피라이터: Kurt Carlson +STR_2924 :{WINDOW_COLOUR_2}감사 인사: Peter Matiss +STR_2925 :{WINDOW_COLOUR_2}엔지니어링 스페셜리스트: Ken Edwards +STR_2926 :{WINDOW_COLOUR_2}엔지니어링 서비스 매니저: Luis Rivas +STR_2927 :{WINDOW_COLOUR_2}리드 적합성 분석: Geoffrey Smith +STR_2928 :{WINDOW_COLOUR_2}적합성 분석: Jason Cordero, Burke McQuinn, Kim Jardin +STR_2929 :{WINDOW_COLOUR_2}리드 테스터: Daniel Frisoli +STR_2930 :{WINDOW_COLOUR_2}수석 테스터: Matt Pantaleoni STR_2931 :{WINDOW_COLOUR_2} STR_2932 :{WINDOW_COLOUR_2} STR_2933 :{WINDOW_COLOUR_2} @@ -2976,33 +2976,33 @@ STR_2965 :{WINDOW_COLOUR_2} STR_2966 : STR_2967 : STR_2968 : -STR_2969 : -STR_2970 : -STR_2971 :Main colour scheme -STR_2972 :Alternative colour scheme 1 -STR_2973 :Alternative colour scheme 2 -STR_2974 :Alternative colour scheme 3 -STR_2975 :{SMALLFONT}{BLACK}Select which colour scheme to change, or paint 라이드 with -STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this 라이드 using the selected colour scheme -STR_2977 :Staff member name -STR_2978 :Enter new name for this member of staff: -STR_2979 :Can't name staff member... -STR_2980 :Too many banners in game -STR_2981 :{RED}No entry - - -STR_2982 :Banner text -STR_2983 :Enter new text for this banner: -STR_2984 :Can't set new text for banner... -STR_2985 :Banner -STR_2986 :{SMALLFONT}{BLACK}Change text on banner -STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for 손님s -STR_2988 :{SMALLFONT}{BLACK}Demolish this banner -STR_2989 :{SMALLFONT}{BLACK}Select main colour -STR_2990 :{SMALLFONT}{BLACK}Select text colour -STR_2991 :Sign -STR_2992 :Sign text -STR_2993 :Enter new text for this sign: -STR_2994 :{SMALLFONT}{BLACK}Change text on sign -STR_2995 :{SMALLFONT}{BLACK}Demolish this sign +STR_2969 :<더 이상 사용하지 않음> +STR_2970 :<더 이상 사용하지 않음> +STR_2971 :주 색상 조합 +STR_2972 :부 색상 조합 1 +STR_2973 :부 색상 조합 2 +STR_2974 :부 색상 조합 3 +STR_2975 :{SMALLFONT}{BLACK}바꾸거나 칠할 놀이기구의 색상 조합을 선택하세요 +STR_2976 :{SMALLFONT}{BLACK}선택한 색상 조합을 사용하여 이 놀이기구의 특정 부분을 칠합니다 +STR_2977 :직원 이름 +STR_2978 :새 직원 이름을 입력하세요: +STR_2979 :직원 이름을 바꿀 수 없습니다... +STR_2980 :게임에 전광판이 너무 많습니다 +STR_2981 :{RED}출입 금지 - - +STR_2982 :전광판 내용 +STR_2983 :이 전광판의 문구를 입력하세요: +STR_2984 :전광판의 내용을 바꿀 수 없습니다... +STR_2985 :전광판 +STR_2986 :{SMALLFONT}{BLACK}전광판의 내용을 바꿉니다 +STR_2987 :{SMALLFONT}{BLACK}이 전광판을 '손님 출입 금지'로 설정합니다 +STR_2988 :{SMALLFONT}{BLACK}이 전광판을 제거합니다 +STR_2989 :{SMALLFONT}{BLACK}주 색상 선택 +STR_2990 :{SMALLFONT}{BLACK}문구 색상 선택 +STR_2991 :팻말 +STR_2992 :팻말 내용 +STR_2993 :이 팻말의 문구를 입력하세요: +STR_2994 :{SMALLFONT}{BLACK}팻말의 내용을 바꿉니다 +STR_2995 :{SMALLFONT}{BLACK}이 팻말을 제거합니다 STR_2996 :{BLACK}ABC STR_2997 :{GREY}ABC STR_2998 :{WHITE}ABC @@ -3017,813 +3017,813 @@ STR_3006 :{PALEGOLD}ABC STR_3007 :{LIGHTPINK}ABC STR_3008 :{PEARLAQUA}ABC STR_3009 :{PALESILVER}ABC -STR_3010 :Unable to load file... -STR_3011 :File contains invalid data -STR_3012 :Dodgems beat style -STR_3013 :Fairground organ style -STR_3014 :Roman fanfare style -STR_3015 :Oriental style -STR_3016 :Martian style -STR_3017 :Jungle drums style -STR_3018 :Egyptian style -STR_3019 :Toyland style +STR_3010 :파일을 불러올 수 없습니다... +STR_3011 :파일이 올바르지 않은 데이터를 포함하고 있습니다 +STR_3012 :범버카 비트 스타일 +STR_3013 :축제 오르간 스타일 +STR_3014 :로마 팡파르 스타일 +STR_3015 :동양 스타일 +STR_3016 :화상 스타일 +STR_3017 :정글 북 스타일 +STR_3018 :이집트 스타일 +STR_3019 :장난감나라 스타일 STR_3020 : -STR_3021 :Space style -STR_3022 :Horror style -STR_3023 :Techno style -STR_3024 :Gentle style -STR_3025 :Summer style -STR_3026 :Water style -STR_3027 :Wild west style -STR_3028 :Jurassic style -STR_3029 :Rock style -STR_3030 :Ragtime style -STR_3031 :Fantasy style -STR_3032 :Rock style 2 -STR_3033 :Ice style -STR_3034 :Snow style -STR_3035 :Custom music 1 -STR_3036 :Custom music 2 -STR_3037 :Medieval style -STR_3038 :Urban style -STR_3039 :Organ style -STR_3040 :Mechanical style -STR_3041 :Modern style -STR_3042 :Pirates style -STR_3043 :Rock style 3 -STR_3044 :Candy style -STR_3045 :{SMALLFONT}{BLACK}Select style of music to play -STR_3046 :This 라이드 cannot be modified -STR_3047 :Local authority forbids demolition or modifications to this 라이드 -STR_3048 :Marketing campaigns forbidden by local authority -STR_3049 :Golf hole A -STR_3050 :Golf hole B -STR_3051 :Golf hole C -STR_3052 :Golf hole D -STR_3053 :Golf hole E -STR_3054 :Loading... -STR_3055 :White -STR_3056 :Translucent -STR_3057 :{WINDOW_COLOUR_2}Construction Marker: -STR_3058 :Brick walls -STR_3059 :Hedges -STR_3060 :Ice blocks -STR_3061 :우든 fences -STR_3062 :{SMALLFONT}{BLACK}Standard 롤러코스터 track -STR_3063 :{SMALLFONT}{BLACK}Water channel (track submerged) -STR_3064 :Beginner Parks -STR_3065 :Challenging Parks -STR_3066 :Expert Parks -STR_3067 :{OPENQUOTES}Real{ENDQUOTES} Parks -STR_3068 :Other Parks -STR_3069 :Top Section -STR_3070 :Slope to Level -STR_3071 :{WINDOW_COLOUR_2}Same price throughout park -STR_3072 :{SMALLFONT}{BLACK}Select whether this price is used throughout the entire park -STR_3073 :{RED}WARNING: Your park rating has dropped below 700 !{NEWLINE}If you haven't raised the park rating in 4 weeks, your park will be closed down -STR_3074 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have 3 weeks to raise the park rating -STR_3075 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have only 2 weeks to raise the park rating, or your park will be closed down -STR_3076 :{RED}FINAL WARNING: Your park rating is still below 700 !{NEWLINE}In just 7 days your park will be closed down unless you can raise the rating -STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! -STR_3078 :Plain entrance -STR_3079 :우든 entrance -STR_3080 :Canvas tent entrance -STR_3081 :Castle entrance (grey) -STR_3082 :Castle entrance (brown) -STR_3083 :Jungle entrance -STR_3084 :Log cabin entrance -STR_3085 :Classical/Roman entrance -STR_3086 :Abstract entrance -STR_3087 :Snow/Ice entrance -STR_3088 :Pagoda entrance -STR_3089 :Space entrance -STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station -STR_3091 :You are not allowed to remove this section! -STR_3092 :You are not allowed to move or modify the station for this 라이드! -STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} -STR_3094 :N/A -STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: +STR_3021 :우주 스타일 +STR_3022 :호러 스타일 +STR_3023 :테크노 스타일 +STR_3024 :젠틀 스타일 +STR_3025 :여름 스타일 +STR_3026 :수중 스타일 +STR_3027 :서부 스타일 +STR_3028 :쥐라기 스타일 +STR_3029 :록 스타일 +STR_3030 :래그타임 스타일 +STR_3031 :판타지 스타일 +STR_3032 :록 스타일 2 +STR_3033 :얼음 스타일 +STR_3034 :눈 스타일 +STR_3035 :사용자 음악 1 +STR_3036 :사용자 음악 2 +STR_3037 :중세 스타일 +STR_3038 :도시 스타일 +STR_3039 :오르간 스타일 +STR_3040 :기계적인 스타일 +STR_3041 :현대적인 스타일 +STR_3042 :해적 스타일 +STR_3043 :록 스타일 3 +STR_3044 :사탕 스타일 +STR_3045 :{SMALLFONT}{BLACK}재생할 음악 스타일을 선택하세요 +STR_3046 :이 놀이기구를 수정할 수 없습니다 +STR_3047 :지역 당국이 이 놀이기구를 파괴하거나 수정하는 것을 금지했습니다 +STR_3048 :지역 당국이 광고 이벤트를 금지했습니다 +STR_3049 :골프 홀 A +STR_3050 :골프 홀 B +STR_3051 :골프 홀 C +STR_3052 :골프 홀 D +STR_3053 :골프 홀 E +STR_3054 :불러오는 중... +STR_3055 :하얗게 +STR_3056 :반투명으로 +STR_3057 :{WINDOW_COLOUR_2}건설 예정지 표시: +STR_3058 :벽돌 벽 +STR_3059 :생울타리 벽 +STR_3060 :얼음 벽돌 벽 +STR_3061 :나무 벽 +STR_3062 :{SMALLFONT}{BLACK}표준 롤러코스터 트랙 +STR_3063 :{SMALLFONT}{BLACK}물 튀김 (트랙 일부 잠김) +STR_3064 :초심자 공원 +STR_3065 :도전자 공원 +STR_3066 :전문가 공원 +STR_3067 :{OPENQUOTES}실제{ENDQUOTES} 공원 +STR_3068 :기타 공원 +STR_3069 :탑 섹션 +STR_3070 :평지로 +STR_3071 :{WINDOW_COLOUR_2}공원 내 어디서나 같은 가격으로 +STR_3072 :{SMALLFONT}{BLACK}이 가격을 공원 내에서 모두 통일할지 여부를 선택하세요 +STR_3073 :{RED}경고: 공원 등급이 700 아래로 내려갔습니다 !{NEWLINE}4주 이내에 다시 공원 등급을 올리지 않으면, 공원이 폐쇄될 것입니다 +STR_3074 :{RED}경고: 공원 등급이 아직도 700 아래로 떨어져 있습니다 !{NEWLINE}공원 등급을 올릴 수 있는 시간이 3주 남았습니다 +STR_3075 :{RED}경고: 공원 등급이 아직도 700 아래로 떨어져 있습니다 !{NEWLINE}2주 이내에 다시 공원 등급을 올리지 않으면, 공원이 폐쇄될 것입니다 +STR_3076 :{RED}마지막 경고: 공원 등급이 아직도 700 아래로 떨어져 있습니다 !{NEWLINE}공원 등급을 올리지 않으면 7일 뒤에 공원이 폐쇄될 것입니다 +STR_3077 :{RED}폐쇄 알림 : 공원이 폐쇄되었습니다 ! +STR_3078 :평범한 스타일의 출입구/역 +STR_3079 :나무 스타일의 출입구/역 +STR_3080 :캔버스 텐트 스타일의 출입구/역 +STR_3081 :성 스타일의 출입구/역 (회색) +STR_3082 :성 스타일의 출입구/역 (갈색) +STR_3083 :정글 스타일의 출입구/역 +STR_3084 :통나무 오두막집 스타일의 출입구/역 +STR_3085 :고대/로마 스타일의 출입구/역 +STR_3086 :추상적인 스타일의 출입구/역 +STR_3087 :눈/얼음 스타일의 출입구/역 +STR_3088 :탑 스타일의 출입구/역 +STR_3089 :우주 스타일의 출입구/역 +STR_3090 :{SMALLFONT}{BLACK}출입구와 역의 스타일을 선택하세요 +STR_3091 :이 섹션을 제거할 수 없습니다! +STR_3092 :이 놀이기구의 탑승장을 옮기거나 편집할 수 없습니다! +STR_3093 :{WINDOW_COLOUR_2}가장 좋아하는 것: {BLACK}{STRINGID} +STR_3094 :없음 +STR_3095 :{WINDOW_COLOUR_2}리프트 힐 체인 속도: STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} -STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed -STR_3098 :Can't change lift hill speed... -STR_3099 :{SMALLFONT}{BLACK}Select colour -STR_3100 :{SMALLFONT}{BLACK}Select second colour -STR_3101 :{SMALLFONT}{BLACK}Select third colour -STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape -STR_3103 :Can't re-paint this... -STR_3104 :{SMALLFONT}{BLACK}List 라이드s -STR_3105 :{SMALLFONT}{BLACK}List shops and 상점s -STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other 손님 facilities -STR_3107 :Close -STR_3108 :Test -STR_3109 :Open -STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16} -STR_3111 :{SMALLFONT}{BLACK}Click on design to build it -STR_3112 :{SMALLFONT}{BLACK}Click on design to rename or delete it -STR_3113 :Select a different design -STR_3114 :{SMALLFONT}{BLACK}Go back to design selection window -STR_3115 :{SMALLFONT}{BLACK}Save track design -STR_3116 :{SMALLFONT}{BLACK}Save track design (Not possible until 라이드 has been tested and statistics have been generated) -STR_3117 :{BLACK}Calling mechanic... -STR_3118 :{BLACK}{STRINGID} is heading for the 라이드 -STR_3119 :{BLACK}{STRINGID} is fixing the 라이드 -STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing 라이드 -STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy -STR_3122 :{WINDOW_COLOUR_2}Favourite 라이드 of: {BLACK}{COMMA16} 손님 -STR_3123 :{WINDOW_COLOUR_2}Favourite 라이드 of: {BLACK}{COMMA16} 손님s -STR_3124 :Broken {STRINGID} -STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% -STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% -STR_3127 :{WINDOW_COLOUR_2}Nausea Factor: {BLACK}+{COMMA16}% -STR_3128 :Save Track Design -STR_3129 :Save Track Design with Scenery -STR_3130 :Save -STR_3131 :Cancel -STR_3132 :{BLACK}Click items of scenery to select them to be saved with track design... -STR_3133 :Unable to build this on a slope -STR_3134 :{RED}(Design includes scenery which is unavailable) -STR_3135 :{RED}(Vehicle design unavailable - 라이드 performance may be affected) -STR_3136 :Warning: This design will be built with an alternative vehicle type and may not perform as expected -STR_3137 :Select Nearby Scenery -STR_3138 :Reset Selection -STR_3139 :Cable lift unable to work in this operating mode -STR_3140 :Cable lift hill must start immediately after station -STR_3141 :Multi-circuit per 라이드 not possible with cable lift hill -STR_3142 :{WINDOW_COLOUR_2}Capacity: {BLACK}{STRINGID} -STR_3143 :{SMALLFONT}{BLACK}Show people on map -STR_3144 :{SMALLFONT}{BLACK}Show 라이드s and 상점s on map -STR_3145 :{SMALLFONT}{BLACK}Scroll {STRINGID} left -STR_3146 :{SMALLFONT}{BLACK}Scroll {STRINGID} right -STR_3147 :{SMALLFONT}{BLACK}Scroll {STRINGID} left fast -STR_3148 :{SMALLFONT}{BLACK}Scroll {STRINGID} right fast -STR_3149 :{SMALLFONT}{BLACK}Scroll {STRINGID} left/right -STR_3150 :{SMALLFONT}{BLACK}Scroll {STRINGID} up -STR_3151 :{SMALLFONT}{BLACK}Scroll {STRINGID} down -STR_3152 :{SMALLFONT}{BLACK}Scroll {STRINGID} up fast -STR_3153 :{SMALLFONT}{BLACK}Scroll {STRINGID} down fast -STR_3154 :{SMALLFONT}{BLACK}Scroll {STRINGID} up/down +STR_3097 :{SMALLFONT}{BLACK}리프트 힐 체인 속력을 선택하세요 +STR_3098 :리프트 힐 체인 속력을 변경할 수 없습니다... +STR_3099 :{SMALLFONT}{BLACK}색을 선택하세요 +STR_3100 :{SMALLFONT}{BLACK}두 번째 색을 선택하세요 +STR_3101 :{SMALLFONT}{BLACK}세 번째 색을 선택하세요 +STR_3102 :{SMALLFONT}{BLACK}이미 설치된 조경물의 색을 다시 칠합니다 +STR_3103 :이 조형물의 색을 다시 칠할 수 없습니다... +STR_3104 :{SMALLFONT}{BLACK}놀이기구 목록 +STR_3105 :{SMALLFONT}{BLACK}상점 & 매점 목록 +STR_3106 :{SMALLFONT}{BLACK}안내소 및 기타 손님 소유물 목록 +STR_3107 :닫기 +STR_3108 :테스트 +STR_3109 :열기 +STR_3110 :{WINDOW_COLOUR_2}블록 섹션: {BLACK}{COMMA16} +STR_3111 :{SMALLFONT}{BLACK}만들고 싶은 디자인을 클릭하세요 +STR_3112 :{SMALLFONT}{BLACK}이름을 바꾸거나 제거할 디자인을 클릭하세요 +STR_3113 :다른 디자인을 선택 +STR_3114 :{SMALLFONT}{BLACK}디자인 선택 창으로 되돌아갑니다 +STR_3115 :{SMALLFONT}{BLACK}트랙 디자인을 저장합니다 +STR_3116 :{SMALLFONT}{BLACK}트랙 디자인을 저장합니다 (놀이기구를 테스트하여 수치가 나와야 저장할 수 있습니다) +STR_3117 :{BLACK}정비기술자에게 연락 중... +STR_3118 :{BLACK}{STRINGID}(이)가 놀이기구로 향하고 있음 +STR_3119 :{BLACK}{STRINGID}(이)가 놀이기구를 수리하고 있음 +STR_3120 :{SMALLFONT}{BLACK}가장 가까운 정비기술자를 찾거나 정비기술자가 놀이기구를 수리하게 합니다 +STR_3121 :정비기술자를 찾을 수 없거나 근방에 있는 모든 정비기술자가 바쁩니다 +STR_3122 :{WINDOW_COLOUR_2}이 놀이기구를 좋아하는 손님: {BLACK}{COMMA16}명 +STR_3123 :{WINDOW_COLOUR_2}이 놀이기구를 좋아하는 손님: {BLACK}{COMMA16}명 +STR_3124 :고장난 {STRINGID} +STR_3125 :{WINDOW_COLOUR_2}흥미도 인수: {BLACK}+{COMMA16}% +STR_3126 :{WINDOW_COLOUR_2}격렬도 인수: {BLACK}+{COMMA16}% +STR_3127 :{WINDOW_COLOUR_2}멀미도 인수: {BLACK}+{COMMA16}% +STR_3128 :트랙 디자인 저장 +STR_3129 :트랙 디자인을 조형물과 함께 저장 +STR_3130 :저장 +STR_3131 :취소 +STR_3132 :{BLACK}트랙 디자인과 함께 저장할 조형물을 선택하세요... +STR_3133 :경사 위에 지을 수 없습니다 +STR_3134 :{RED}(사용 불가능한 조형물 포함) +STR_3135 :{RED}(차량 디자인 사용 불가 - 놀이기구 수치에 영향이 있을 수 있음) +STR_3136 :경고: 다른 차량 종류로 대체되어 지어질 것이며 기대했던 것과는 다르게 작동할 수 있습니다 +STR_3137 :근처 조형물 선택 +STR_3138 :선택 초기화 +STR_3139 :이 운행 모드에서는 케이블 리프트 힐을 작동할 수 없습니다 +STR_3140 :케이블 리프트 힐은 탑승장 바로 다음에 건설해야 합니다 +STR_3141 :케이블 리프트 힐을 사용하면 2바퀴 이상 차량을 운용할 수 없습니다 +STR_3142 :{WINDOW_COLOUR_2}수용량: {BLACK}{STRINGID} +STR_3143 :{SMALLFONT}{BLACK}손님을 지도에 표시합니다 +STR_3144 :{SMALLFONT}{BLACK}놀이기구와 시설을 지도에 표시합니다 +STR_3145 :{SMALLFONT}{BLACK}왼쪽으로 {STRINGID} 스크롤 +STR_3146 :{SMALLFONT}{BLACK}오른쪽으로 {STRINGID} 스크롤 +STR_3147 :{SMALLFONT}{BLACK}왼쪽으로 {STRINGID} 빠르게 스크롤 +STR_3148 :{SMALLFONT}{BLACK}오른쪽으로 {STRINGID} 빠르게 스크롤 +STR_3149 :{SMALLFONT}{BLACK}왼쪽/오른쪽으로 {STRINGID} 스크롤 +STR_3150 :{SMALLFONT}{BLACK}위로 {STRINGID} 스크롤 +STR_3151 :{SMALLFONT}{BLACK}아래로 {STRINGID} 스크롤 +STR_3152 :{SMALLFONT}{BLACK}위로 {STRINGID} 빠르게 스크롤 +STR_3153 :{SMALLFONT}{BLACK}아래로 {STRINGID} 빠르게 스크롤 +STR_3154 :{SMALLFONT}{BLACK}위/아래로 {STRINGID} 스크롤 STR_3155 : STR_3156 : -STR_3157 :map -STR_3158 :graph -STR_3159 :list -STR_3160 : -STR_3161 : -STR_3162 :Unable to allocate enough memory -STR_3163 :설치ing new data: -STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) +STR_3157 :지도 +STR_3158 :그래프 +STR_3159 :목록 +STR_3160 :<더 이상 사용하지 않음> +STR_3161 :<더 이상 사용하지 않음> +STR_3162 :충분한 메모리를 할당할 수 없습니다 +STR_3163 :새 데이터 설치중: +STR_3164 :{BLACK}{COMMA16}개 선택 됨 (최대 {COMMA16}개) STR_3165 : STR_3166 :{BLACK}(ID: -STR_3167 :{WINDOW_COLOUR_2}Includes: {BLACK}{COMMA16} objects -STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} -STR_3169 :Data for the following object not found: -STR_3170 :Not enough space for graphics -STR_3171 :Too many objects of this type selected -STR_3172 :The following object must be selected first: {STRING} -STR_3173 :This object is currently in use -STR_3174 :This object is required by another object -STR_3175 :This object is always required -STR_3176 :Unable to select this object -STR_3177 :Unable to de-select this object -STR_3178 :At least one path object must be selected -STR_3179 :At least one 라이드 vehicle/attraction object must be selected -STR_3180 :Invalid selection of objects -STR_3181 :Object Selection - {STRINGID} -STR_3182 :Park entrance type must be selected -STR_3183 :Water type must be selected -STR_3184 :라이드 Vehicles/Attractions -STR_3185 :Small Scenery -STR_3186 :Large Scenery -STR_3187 :Walls/Fences -STR_3188 :Path Signs -STR_3189 :보도s -STR_3190 :Path Extras -STR_3191 :Scenery Groups -STR_3192 :Park Entrance -STR_3193 :Water -STR_3194 :Scenario Description -STR_3195 :Invention List -STR_3196 :{WINDOW_COLOUR_2}Research Group: {BLACK}{STRINGID} -STR_3197 :{WINDOW_COLOUR_2}Items pre-invented at start of game: -STR_3198 :{WINDOW_COLOUR_2}Items to invent during game: -STR_3199 :Random Shuffle -STR_3200 :{SMALLFONT}{BLACK}Randomly shuffle the list of items to invent during the game -STR_3201 :Object Selection -STR_3202 :Landscape Editor -STR_3203 :Invention List Set Up -STR_3204 :Options Selection -STR_3205 :Objective Selection -STR_3206 :Save Scenario -STR_3207 :롤러코스터 Designer -STR_3208 :Track Designs Manager -STR_3209 :Back to Previous Step: -STR_3210 :Forward to Next Step: -STR_3211 :{WINDOW_COLOUR_2}Map size: +STR_3167 :{WINDOW_COLOUR_2}{BLACK}{COMMA16}개의 오브젝트 포함 +STR_3168 :{WINDOW_COLOUR_2}텍스트: {BLACK}{STRINGID} +STR_3169 :다음 오브젝트에 대한 데이터를 찾을 수 없습니다: +STR_3170 :그래픽을 저장할 공간이 충분하지 않습니다 +STR_3171 :이 종류의 오브젝트를 너무 많이 선택하였습니다 +STR_3172 :다음 오브젝트를 가장 먼저 선택해야 합니다: {STRING} +STR_3173 :이 오브젝트는 현재 사용 중입니다 +STR_3174 :이 오브젝트는 다른 오브젝트가 필요합니다 +STR_3175 :이 오브젝트는 이미 포함되어 있습니다 +STR_3176 :이 오브젝트를 선택할 수 없습니다 +STR_3177 :이 오브젝트를 선택 해제할 수 없습니다 +STR_3178 :최소한 하나 이상의 보도 오브젝트를 선택해야 합니다 +STR_3179 :최소한 하나 이상의 놀이기구/시설 오브젝트를 선택해야 합니다 +STR_3180 :올바르지 않은 오브젝트 선택 +STR_3181 :오브젝트 선택 - {STRINGID} +STR_3182 :공원 입구 종류를 반드시 선택해야 합니다 +STR_3183 :물 종류를 반드시 선택해야 합니다 +STR_3184 :놀이기구 차량/시설 +STR_3185 :소형 조형물 +STR_3186 :대형 조형물 +STR_3187 :벽/울타리 +STR_3188 :보도 팻말 +STR_3189 :보도 +STR_3190 :공원 기타 +STR_3191 :조형물 분류 +STR_3192 :공원 입구 +STR_3193 :물 +STR_3194 :시나리오 설명 +STR_3195 :연구 목록 +STR_3196 :{WINDOW_COLOUR_2}개발 그룹: {BLACK}{STRINGID} +STR_3197 :{WINDOW_COLOUR_2}게임 시작시 바로 사용할 수 있는 항목: +STR_3198 :{WINDOW_COLOUR_2}게임 중에 연구해야 하는 항목: +STR_3199 :무작위로 섞기 +STR_3200 :{SMALLFONT}{BLACK}게임 중에 연구해야 하는 항목 목록을 무작위로 섞습니다 +STR_3201 :오브젝트 선택 +STR_3202 :풍경 에디터 +STR_3203 :개발 목록 설정 화면 +STR_3204 :설정 선택 +STR_3205 :목표 선택 +STR_3206 :시나리오 저장 +STR_3207 :롤러코스터 디자이너 +STR_3208 :트랙 디자인 매니저 +STR_3209 :이전 단계로: +STR_3210 :다음 단계로: +STR_3211 :{WINDOW_COLOUR_2}지도 크기: STR_3212 :{POP16}{COMMA16} x {PUSH16}{COMMA16} -STR_3213 :Can't decrease map size any further -STR_3214 :Can't increase map size any further -STR_3215 :Too close to edge of map -STR_3216 :{SMALLFONT}{BLACK}Select park-owned land etc. -STR_3217 :Land Owned -STR_3218 :Construction Rights Owned -STR_3219 :Land For Sale -STR_3220 :Construction Rights For Sale -STR_3221 :{SMALLFONT}{BLACK}Set land to be owned by the park -STR_3222 :{SMALLFONT}{BLACK}Set construction rights only to be owned by the park -STR_3223 :{SMALLFONT}{BLACK}Set land to be available to purchase by the park -STR_3224 :{SMALLFONT}{BLACK}Set construction rights to be available to purchase by the park -STR_3225 :{SMALLFONT}{BLACK}Toggle on/off building a random cluster of objects around the selected position -STR_3226 :{SMALLFONT}{BLACK}Build park entrance -STR_3227 :Too many park entrances! -STR_3228 :{SMALLFONT}{BLACK}Set starting positions for people -STR_3229 :블록 브레이크 cannot be used directly after station -STR_3230 :블록 브레이크 cannot be used directly after each other -STR_3231 :블록 브레이크 cannot be used directly after the top of this lift hill -STR_3232 :Options - Financial -STR_3233 :Options - 손님s -STR_3234 :Options - Park -STR_3235 :{SMALLFONT}{BLACK}Show financial options -STR_3236 :{SMALLFONT}{BLACK}Show 손님 options -STR_3237 :{SMALLFONT}{BLACK}Show park options -STR_3238 :No Money -STR_3239 :{SMALLFONT}{BLACK}Make this park a 'no money' park with no financial restrictions -STR_3240 :{WINDOW_COLOUR_2}Initial cash: -STR_3241 :{WINDOW_COLOUR_2}Initial loan: -STR_3242 :{WINDOW_COLOUR_2}Maximum loan size: -STR_3243 :{WINDOW_COLOUR_2}Annual interest rate: -STR_3244 :Forbid marketing campaigns -STR_3245 :{SMALLFONT}{BLACK}Forbid advertising, promotional schemes, and other marketing campaigns +STR_3213 :더 이상 맵 크기를 줄일 수 없습니다 +STR_3214 :더 이상 맵 크기를 늘일 수 없습니다 +STR_3215 :지도 가장자리와 너무 가깝습니다 +STR_3216 :{SMALLFONT}{BLACK}공원 소유지 등을 선택합니다 +STR_3217 :소유한 땅 +STR_3218 :소유한 건설권 +STR_3219 :판매 중인 땅 +STR_3220 :판매 중인 건설권 +STR_3221 :{SMALLFONT}{BLACK}공원이 이미 소유하고 있는 땅을 선택합니다 +STR_3222 :{SMALLFONT}{BLACK}공원이 이미 소유하고 있는 건설권을 선택합니다 +STR_3223 :{SMALLFONT}{BLACK}공원이 향후 구입할 수 있는 땅을 선택합니다 +STR_3224 :{SMALLFONT}{BLACK}공원이 향후 구입할 수 있는 건설권을 선택합니다 +STR_3225 :{SMALLFONT}{BLACK}선택한 위치에 오브젝트 숲 건설(무작위 건설) 모드를 켜거나 끕니다 +STR_3226 :{SMALLFONT}{BLACK}공원 입구 건설 +STR_3227 :공원 입구가 너무 많습니다! +STR_3228 :{SMALLFONT}{BLACK}손님이 나타나는 장소를 선택합니다 +STR_3229 :블록 브레이크는 탑승장 바로 다음에 사용할 수 없습니다 +STR_3230 :블록 브레이크는 블록 브레이크 바로 다음에 사용할 수 없습니다 +STR_3231 :블록 브레이크는 이 리프트 힐의 꼭대기 바로 다음에 사용할 수 없습니다 +STR_3232 :설정 - 재정 +STR_3233 :설정 - 손님 +STR_3234 :설정 - 공원 +STR_3235 :{SMALLFONT}{BLACK}재정 관련 설정을 보여줍니다 +STR_3236 :{SMALLFONT}{BLACK}손님 관련 설정을 보여줍니다 +STR_3237 :{SMALLFONT}{BLACK}공원 관련 설정을 보여줍니다 +STR_3238 :돈 무제한 +STR_3239 :{SMALLFONT}{BLACK}재정적 제한이 없도록 이 공원의 돈을 '무제한'으로 만듭니다 +STR_3240 :{WINDOW_COLOUR_2}초기 재정: +STR_3241 :{WINDOW_COLOUR_2}초기 대출: +STR_3242 :{WINDOW_COLOUR_2}최대 대출금: +STR_3243 :{WINDOW_COLOUR_2}연 이자율: +STR_3244 :광고 이벤트를 금지 +STR_3245 :{SMALLFONT}{BLACK}광고나 이벤트를 진행할 수 없도록 금지합니다 STR_3246 :{WINDOW_COLOUR_2}{CURRENCY} STR_3247 :{WINDOW_COLOUR_2}{COMMA16}% -STR_3248 :Can't increase initial cash any further! -STR_3249 :Can't reduce initial cash any further! -STR_3250 :Can't increase initial loan any further! -STR_3251 :Can't reduce initial loan any further! -STR_3252 :Can't increase maximum loan size any further! -STR_3253 :Can't reduce maximum loan size any further! -STR_3254 :Can't increase interest rate any further! -STR_3255 :Can't reduce interest rate any further! -STR_3256 :손님s prefer less intense 라이드s -STR_3257 :{SMALLFONT}{BLACK}Select whether 손님s should generally prefer less intense 라이드s only -STR_3258 :손님s prefer more intense 라이드s -STR_3259 :{SMALLFONT}{BLACK}Select whether 손님s should generally prefer more intense 라이드s only -STR_3260 :{WINDOW_COLOUR_2}Cash per 손님 (average): -STR_3261 :{WINDOW_COLOUR_2}손님s initial happiness: -STR_3262 :{WINDOW_COLOUR_2}손님s initial hunger: -STR_3263 :{WINDOW_COLOUR_2}손님s initial thirst: -STR_3264 :Can't increase this any further! -STR_3265 :Can't reduce this any further! -STR_3266 :{SMALLFONT}{BLACK}Select how this park charges for entrance and 라이드s -STR_3267 :Forbid tree removal -STR_3268 :{SMALLFONT}{BLACK}Forbid tall trees being removed -STR_3269 :Forbid landscape changes -STR_3270 :{SMALLFONT}{BLACK}Forbid any changes to the landscape -STR_3271 :Forbid high construction -STR_3272 :{SMALLFONT}{BLACK}Forbid any tall construction -STR_3273 :Park rating higher difficult level -STR_3274 :{SMALLFONT}{BLACK}Make the park rating value more challenging -STR_3275 :손님 generation higher difficult level -STR_3276 :{SMALLFONT}{BLACK}Make it more difficult to attract 손님s to the park -STR_3277 :{WINDOW_COLOUR_2}Cost to buy land: -STR_3278 :{WINDOW_COLOUR_2}Cost to buy construction rights: -STR_3279 :Free park entry / Pay per 라이드 -STR_3280 :Pay to enter park / Free 라이드s -STR_3281 :{WINDOW_COLOUR_2}Entry price: -STR_3282 :{SMALLFONT}{BLACK}Select objective and park name -STR_3283 :{SMALLFONT}{BLACK}Select 라이드s to be preserved -STR_3284 :Objective Selection -STR_3285 :Preserved 라이드s -STR_3286 :{SMALLFONT}{BLACK}Select objective for this scenario -STR_3287 :{WINDOW_COLOUR_2}Objective: -STR_3288 :{SMALLFONT}{BLACK}Select climate -STR_3289 :{WINDOW_COLOUR_2}Climate: -STR_3290 :Cool and wet -STR_3291 :Warm -STR_3292 :Hot and dry -STR_3293 :Cold -STR_3294 :Change... -STR_3295 :{SMALLFONT}{BLACK}Change name of park -STR_3296 :{SMALLFONT}{BLACK}Change name of scenario -STR_3297 :{SMALLFONT}{BLACK}Change detail notes about park / scenario -STR_3298 :{WINDOW_COLOUR_2}Park Name: {BLACK}{STRINGID} -STR_3299 :{WINDOW_COLOUR_2}Park/Scenario Details: -STR_3300 :{WINDOW_COLOUR_2}Scenario Name: {BLACK}{STRINGID} -STR_3301 :{WINDOW_COLOUR_2}Objective Date: +STR_3248 :초기 보유 자금을 더 이상 늘릴 수 없습니다! +STR_3249 :초기 보유 자금을 더 이상 줄일 수 없습니다! +STR_3250 :초기 대출금을 더 이상 늘릴 수 없습니다! +STR_3251 :초기 대출금을 더 이상 줄일 수 없습니다! +STR_3252 :최대 대출금을 더 이상 늘릴 수 없습니다! +STR_3253 :최대 대출금을 더 이상 줄일 수 없습니다! +STR_3254 :이자율을 더 이상 늘릴 수 없습니다! +STR_3255 :이자율을 더 이상 줄일 수 없습니다! +STR_3256 :손님들이 격렬하지 않은 놀이기구를 선호함 +STR_3257 :{SMALLFONT}{BLACK}손님들이 일반적으로 덜 격렬한 놀이기구를 선호하게 만들지를 선택합니다 +STR_3258 :손님들이 격렬한 놀이기구를 선호함 +STR_3259 :{SMALLFONT}{BLACK}손님들이 일반적으로 더욱 격렬한 놀이기구를 선호하게 만들지를 선택합니다 +STR_3260 :{WINDOW_COLOUR_2}각 손님의 보유금 (평균): +STR_3261 :{WINDOW_COLOUR_2}손님의 초기 행복도: +STR_3262 :{WINDOW_COLOUR_2}손님의 초기 배고픔: +STR_3263 :{WINDOW_COLOUR_2}손님의 초기 목마름: +STR_3264 :더 이상 늘릴 수 없습니다! +STR_3265 :더 이상 줄일 수 없습니다! +STR_3266 :{SMALLFONT}{BLACK}공원 수익을 입장료로 낼지 놀이기구 탑승료로 낼지를 선택하세요 +STR_3267 :나무 제거 금지 +STR_3268 :{SMALLFONT}{BLACK}키 큰 나무의 제거를 금지합니다 +STR_3269 :지형 편집 금지 +STR_3270 :{SMALLFONT}{BLACK}지형을 편집할 수 없도록 금지합니다 +STR_3271 :나무 높이 이상 건설 금지 +STR_3272 :{SMALLFONT}{BLACK}높은 건축물의 건설을 금지합니다 +STR_3273 :공원 등급 난이도 상승 +STR_3274 :{SMALLFONT}{BLACK}공원 등급값이 더 급변하게 만듭니다 +STR_3275 :손님 생성 난이도 상승 +STR_3276 :{SMALLFONT}{BLACK}공원에 손님을 유치하기 더 어렵게 만듭니다 +STR_3277 :{WINDOW_COLOUR_2}땅 구입 비용: +STR_3278 :{WINDOW_COLOUR_2}건설권 구입 비용: +STR_3279 :공원 입장 무료 / 놀이기구 탑승료 받음 +STR_3280 :공원 입장료 받음 / 놀이기구 탑승료 무료 +STR_3281 :{WINDOW_COLOUR_2}입장료: +STR_3282 :{SMALLFONT}{BLACK}목표와 공원 이름을 선택하세요 +STR_3283 :{SMALLFONT}{BLACK}보호할 놀이기구를 선택하세요 +STR_3284 :목표 선택 +STR_3285 :놀이기구 보호 +STR_3286 :{SMALLFONT}{BLACK}이 시나리오의 목표를 선택하세요 +STR_3287 :{WINDOW_COLOUR_2}목표: +STR_3288 :{SMALLFONT}{BLACK}기후 선택 +STR_3289 :{WINDOW_COLOUR_2}기후: +STR_3290 :춥고 습함 +STR_3291 :따뜻함 +STR_3292 :덥고 건조함 +STR_3293 :추움 +STR_3294 :바꾸기... +STR_3295 :{SMALLFONT}{BLACK}공원 이름을 바꿉니다 +STR_3296 :{SMALLFONT}{BLACK}시나리오 이름을 바꿉니다 +STR_3297 :{SMALLFONT}{BLACK}공원/시나리오의 상세 설명을 변경합니다 +STR_3298 :{WINDOW_COLOUR_2}공원 이름: {BLACK}{STRINGID} +STR_3299 :{WINDOW_COLOUR_2}공원/시나리오 상세 설명: +STR_3300 :{WINDOW_COLOUR_2}시나리오 이름: {BLACK}{STRINGID} +STR_3301 :{WINDOW_COLOUR_2}목표 날짜: STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR} -STR_3303 :{WINDOW_COLOUR_2}Number of 손님s: -STR_3304 :{WINDOW_COLOUR_2}Park value: -STR_3305 :{WINDOW_COLOUR_2}Monthly income: -STR_3306 :{WINDOW_COLOUR_2}Monthly profit: -STR_3307 :{WINDOW_COLOUR_2}미니mum length: -STR_3308 :{WINDOW_COLOUR_2}Excitement rating: +STR_3303 :{WINDOW_COLOUR_2}손님 수: +STR_3304 :{WINDOW_COLOUR_2}공원 가치: +STR_3305 :{WINDOW_COLOUR_2}월 수익: +STR_3306 :{WINDOW_COLOUR_2}월 순이익: +STR_3307 :{WINDOW_COLOUR_2}최소 길이: +STR_3308 :{WINDOW_COLOUR_2}흥미도: STR_3309 :{WINDOW_COLOUR_2}{COMMA16} STR_3310 :{WINDOW_COLOUR_2}{LENGTH} STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32} -STR_3312 :{WINDOW_COLOUR_2}라이드s/attractions under a preservation order: -STR_3313 :Scenario Name -STR_3314 :Enter name for scenario: -STR_3315 :Park/Scenario Details -STR_3316 :Enter description of this scenario: -STR_3317 :No details yet -STR_3318 :{SMALLFONT}{BLACK}Select which group this scenario appears in -STR_3319 :{WINDOW_COLOUR_2}Scenario Group: -STR_3320 :Unable to save scenario file... -STR_3321 :New objects 설치ed successfully -STR_3322 :{WINDOW_COLOUR_2}Objective: {BLACK}{STRINGID} -STR_3323 :Missing object data, ID: -STR_3324 :Requires Add-On Pack: -STR_3325 :Requires an Add-On Pack -STR_3326 :{WINDOW_COLOUR_2}(no image) -STR_3327 :Starting positions for people not set -STR_3328 :Can't advance to next editor stage... -STR_3329 :Park entrance not yet built -STR_3330 :Park must own some land -STR_3331 :Path from park entrance to map edge either not complete or too complex - Path must be single-width with as few junctions and corners as possible -STR_3332 :Park entrance is the wrong way round or has no path leading to the map edge -STR_3333 :Export plug-in objects with saved games -STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data -STR_3335 :롤러코스터 Designer - Select 라이드 Types & Vehicles -STR_3336 :Track Designs Manager - Select 라이드 Type -STR_3337 : -STR_3338 :{BLACK}Custom-designed layout -STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout -STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout -STR_3341 :{SMALLFONT}{BLACK}Game tools -STR_3342 :Scenario Editor -STR_3343 :Convert Saved Game to Scenario -STR_3344 :롤러코스터 Designer -STR_3345 :Track Designs Manager -STR_3346 :Can't save track design... -STR_3347 :라이드 is too large, contains too many elements, or scenery is too spread out -STR_3348 :Rename -STR_3349 :Delete -STR_3350 :Track design name -STR_3351 :Enter new name for this track design: -STR_3352 :Can't rename track design... -STR_3353 :New name contains invalid characters -STR_3354 :Another file exists with this name, or file is write-protected -STR_3355 :File is write-protected or locked -STR_3356 :Delete File -STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ? -STR_3358 :Can't delete track design... -STR_3359 :{BLACK}No track designs of this type -STR_3360 :Warning! -STR_3361 :Too many track designs of this type - Some will not be listed. -STR_3362 : -STR_3363 : -STR_3364 :Advanced -STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups +STR_3312 :{WINDOW_COLOUR_2}보호되고 있는 놀이기구/시설 순서: +STR_3313 :시나리오 이름 +STR_3314 :시나리오 이름을 입력하세요: +STR_3315 :공원/시나리오 상세 설명 +STR_3316 :이 시나리오의 설명을 입력하세요: +STR_3317 :상세 설명 없음 +STR_3318 :{SMALLFONT}{BLACK}이 시나리오가 나타날 시나리오 분류를 선택하세요 +STR_3319 :{WINDOW_COLOUR_2}시나리오 분류: +STR_3320 :시나리오 파일을 저장할 수 없습니다... +STR_3321 :새 오브젝트가 성공적으로 설치되었습니다 +STR_3322 :{WINDOW_COLOUR_2}목표: {BLACK}{STRINGID} +STR_3323 :오브젝트 데이터가 존재하지 않음, ID: +STR_3324 :확장팩이 필요합니다: +STR_3325 :확장팩이 필요합니다 +STR_3326 :{WINDOW_COLOUR_2}(이미지 없음) +STR_3327 :손님이 나타나는 위치가 지정되지 않았습니다 +STR_3328 :다음 데이터 단계로 진행할 수 없습니다... +STR_3329 :공원 입구가 아직 지어지지 않았습니다 +STR_3330 :공원이 소유한 땅이 하나도 없습니다 +STR_3331 :공원 입구에서 지도 가장자리로 이어지는 길이 이어지지 않았거나 너무 복잡합니다. 1칸 너비의 길을 코너나 교차로가 최대한 없도록 하여 만들어야 합니다. +STR_3332 :공원 입구가 잘못된 방향을 향하고 있거나 지도 가장자리로 가는 길이 없습니다 +STR_3333 :게임 저장시 사용한 오브젝트를 같이 포함하여 저장 +STR_3334 :{SMALLFONT}{BLACK}필요한 경우 플러그 인 오브젝트(기본적으로 지원하지 않고 사용자가 추가된 오브젝트)를 저장된 게임 파일이나 시나리오 파일과 함께 저장합니다. 이러면 그 추가 오브젝트를 갖고 있지 않은 다른 사람이 이 파일을 불러올 때 자동으로 그 오브젝트를 설치하게 되지만 파일 용량이 늘어납니다 +STR_3335 :롤러코스터 디자이너 - 놀이기구 종류 & 차량을 선택하세요 +STR_3336 :트랙 디자인 매니저 - 놀이기구 종류를 선택하세요 +STR_3337 :<더 이상 사용하지 않음> +STR_3338 :{BLACK}커스텀 디자인 구조 +STR_3339 :{BLACK}{COMMA16}개의 디자인, 커스텀 디자인 구조 사용 가능 +STR_3340 :{BLACK}{COMMA16}개의 디자인, 커스텀 디자인 구조 사용 가능 +STR_3341 :{SMALLFONT}{BLACK}게임 도구 +STR_3342 :시나리오 에디터 +STR_3343 :저장된 게임을 시나리오로 변환 +STR_3344 :롤러코스터 디자이너 +STR_3345 :트랙 디자인 매니저 +STR_3346 :트랙 디자인을 저장할 수 없습니다... +STR_3347 :놀이기구가 너무 큽니다 - 너무 많은 요소를 포함하고 있거나 조형물이 너무 넓게 퍼져 있습니다 +STR_3348 :이름 바꾸기 +STR_3349 :삭제 +STR_3350 :트랙 디자인 이름 +STR_3351 :이 트랙 디자인의 새 이름을 입력하세요: +STR_3352 :트랙 디자인 이름을 바꿀 수 없습니다... +STR_3353 :새 이름에 유효하지 않은 문자가 있습니다 +STR_3354 :이 이름으로 된 파일이 이미 존재하거나 파일이 쓰기 불가능한 상태입니다 +STR_3355 :파일이 쓰기 불가능한 상태이거나 잠겨있습니다 +STR_3356 :파일 삭제 +STR_3357 :{WINDOW_COLOUR_2}{STRINGID} 파일을 영구적으로 삭제하시겠습니까 ? +STR_3358 :트랙 디자인을 삭제할 수 없습니다... +STR_3359 :{BLACK}이 종류의 트랙 디자인 없음 +STR_3360 :경고! +STR_3361 :트랙 디자인이 너무 많습니다. 일부가 표시되지 않을 것입니다. +STR_3362 :<더 이상 사용하지 않음> +STR_3363 :<더 이상 사용하지 않음> +STR_3364 :고급 +STR_3365 :{SMALLFONT}{BLACK}조형물 그룹과 함께 조형물 각각을 따로 선택할 수 있게 허용합니다 STR_3366 :{BLACK}= 라이드 -STR_3367 :{BLACK}= Food 상점 -STR_3368 :{BLACK}= Drink 상점 -STR_3369 :{BLACK}= Souvenir 상점 -STR_3370 :{BLACK}= Info. Kiosk -STR_3371 :{BLACK}= First Aid -STR_3372 :{BLACK}= Cash Machine -STR_3373 :{BLACK}= Toilet -STR_3374 :Warning: Too many objects selected! -STR_3375 :Not all objects in this scenery group could be selected -STR_3376 :설치 new track design... -STR_3377 :{SMALLFONT}{BLACK}설치 a new track design file +STR_3367 :{BLACK}= 음식 상점 +STR_3368 :{BLACK}= 음료수 상점 +STR_3369 :{BLACK}= 기념품 가게 +STR_3370 :{BLACK}= 안내소 +STR_3371 :{BLACK}= 응급치료소 +STR_3372 :{BLACK}= 현금지급기 +STR_3373 :{BLACK}= 화장실 +STR_3374 :경고: 오브젝트를 너무 많이 선택하였습니다 +STR_3375 :이 조형물 그룹의 모든 오브젝트가 선택되지는 않았습니다 +STR_3376 :새 트랙 디자인 설치... +STR_3377 :{SMALLFONT}{BLACK}새 트랙 디자인 파일 설치 STR_3378 :설치 -STR_3379 :Cancel -STR_3380 :Unable to 설치 this track design... -STR_3381 :File is not compatible or contains invalid data -STR_3382 :File copy failed -STR_3383 :Select new name for track design -STR_3384 :An existing track design already has this name - Please select a new name for this design: -STR_3385 :Beginners Tutorial -STR_3386 :Custom 라이드s Tutorial -STR_3387 :롤러코스터 Building Tutorial -STR_3388 :Unable to switch to selected mode -STR_3389 :Unable to select additional item of scenery... -STR_3390 :Too many items selected -STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... -STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... -STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... -STR_3394 :{SMALLFONT}{BLACK}You can also rotate the view in 90 degree steps... -STR_3395 :{SMALLFONT}{BLACK}Building anything at this scale is a bit difficult, so let's zoom the view back in again... -STR_3396 :{SMALLFONT}{BLACK}Let's build a simple 라이드 to get the park started... -STR_3397 :{SMALLFONT}{BLACK}The white 'ghost' image shows where the 라이드 will be built. We'll move the pointer to select the position then click to build it... -STR_3398 :{SMALLFONT}{BLACK}라이드s need an entrance and an exit. We'll move the pointer to a square on the edge of the 라이드 and then click to build first the entrance and then the exit... -STR_3399 :{SMALLFONT}{BLACK}We need to build 보도s to allow 손님s to reach our new 라이드... -STR_3400 :{SMALLFONT}{BLACK}For the path to the 라이드 entrance we'll use a special 'queue line' path... -STR_3401 :{SMALLFONT}{BLACK}For the exit path, just an 'ordinary' path will do... -STR_3402 :{SMALLFONT}{BLACK}Right, lets open the 라이드! To open the 라이드 we click the flag icon on the 라이드 window and select 'open'... -STR_3403 :{SMALLFONT}{BLACK}But where are the 손님s? -STR_3404 :{SMALLFONT}{BLACK}Oh - The park is still closed! Right - Let's open it... -STR_3405 :{SMALLFONT}{BLACK}While we're waiting for our first 손님s, let's build some scenery... -STR_3406 :{SMALLFONT}{BLACK}Here's our empty park. We're going to build a simple custom-designed 라이드... -STR_3407 :{SMALLFONT}{BLACK}First we need to choose a starting position... -STR_3408 :{SMALLFONT}{BLACK}The section of track we've just built is a 'station platform', to allow 손님s to get on and off the 라이드... -STR_3409 :{SMALLFONT}{BLACK}We'll extend the platform a bit by adding a couple more station platform sections... -STR_3410 :{SMALLFONT}{BLACK}The icons at the top of the construction window let you choose different track pieces to add... -STR_3411 :{SMALLFONT}{BLACK}We'll select a 왼쪽 커브... -STR_3412 :{SMALLFONT}{BLACK}The curve hasn't been built yet, but the white ghost image shows where it will be built. Clicking the large 'build this' icon actually builds the track... -STR_3413 :{SMALLFONT}{BLACK}Now we want to build straight track, so we click the straight track icon... -STR_3414 :{SMALLFONT}{BLACK}Now that the circuit is complete, we need to build the 라이드 entrance and exit... -STR_3415 :{SMALLFONT}{BLACK}Let's test our 라이드 to check it works... -STR_3416 :{SMALLFONT}{BLACK}White it's being tested, we'll build the queue line and exit path... -STR_3417 :{SMALLFONT}{BLACK}OK - Let's open the park and the 라이드... -STR_3418 :{SMALLFONT}{BLACK}Our new 라이드 isn't very exciting - Perhaps we should add some scenery? -STR_3419 :{SMALLFONT}{BLACK}To build scenery above other scenery or in mid-air, hold down the SHIFT key and move the mouse to select the height... -STR_3420 :{SMALLFONT}{BLACK}Some types of scenery can be re-painted after it's built... -STR_3421 :{SMALLFONT}{BLACK}Let's add some music to the 라이드... -STR_3422 :{SMALLFONT}{BLACK}Let's build a 롤러코스터 ! -STR_3423 :{SMALLFONT}{BLACK}There are loads of pre-designed 코스터s, but we're going to build our own custom design... -STR_3424 :{SMALLFONT}{BLACK}That's the station platform built. Now we need a lift hill... -STR_3425 :{SMALLFONT}{BLACK}롤러코스터 trains aren't powered, so a 'chain lift' is needed to pull the train up the first hill... -STR_3426 :{SMALLFONT}{BLACK}That's the lift hill complete - Now for the first drop... -STR_3427 :{SMALLFONT}{BLACK}Those curves are a bad idea - The 라이더 will be flung to the sides by the lateral G forces as the train hurtles around... -STR_3428 :{SMALLFONT}{BLACK}Banking the curves will improve the 라이드 - 라이더 will be pushed down into their seats instead of flung to the sides... -STR_3429 :{SMALLFONT}{BLACK}No - That won't work! Look at the height marks - The second hill is taller than the lift hill... -STR_3430 :{SMALLFONT}{BLACK}To ensure the train makes it around, each hill should be slightly smaller than the previous one... -STR_3431 :{SMALLFONT}{BLACK}That's better - Our train should make it up that hill now! Let's try some more twisted track... -STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve and station, so let's add some brakes... -STR_3433 :{SMALLFONT}{BLACK}And finally we'll add '블록 브레이크', which allow two trains to operate more safely on the circuit... -STR_3434 :{SMALLFONT}{BLACK}Let's test the 라이드 and see if it works! -STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the 보도s and let 손님s onto our new 롤러코스터... -STR_3436 :{SMALLFONT}{BLACK}While waiting for our first 라이더, we could customise the 라이드 a bit... -STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape -STR_3438 :Unable to remove all scenery from here... -STR_3439 :Clear Scenery -STR_3440 :Page 1 -STR_3441 :Page 2 -STR_3442 :Page 3 -STR_3443 :Page 4 -STR_3444 :Page 5 -STR_3445 :Set Patrol Area -STR_3446 :Cancel Patrol Area +STR_3379 :취소 +STR_3380 :U이 트랙 디자인 파일을 설치할 수 없습니다... +STR_3381 :파일이 적합하지 않거나 유효하지 않은 데이터를 포함하고 있습니다 +STR_3382 :파일 복사에 실패하였습니다 +STR_3383 :트랙 디자인에 지정할 새 이름을 선택하세요 +STR_3384 :같은 이름의 트랙 디자인이 이미 존재합니다 이 디자인에 지정할 다른 이름을 입력하세요: +STR_3385 :초심자 튜토리얼 +STR_3386 :놀이기구 직접 만들기 튜토리얼 +STR_3387 :롤러코스터 만들기 튜토리얼 +STR_3388 :선택한 모드로 바꿀 수 없습니다 +STR_3389 :추가 조형물 항목을 선택할 수 없습니다... +STR_3390 :항목을 너무 많이 선택하였습니다 +STR_3391 :{SMALLFONT}{BLACK}여기 우리 공원이 있습니다. 한 번 둘러보죠... +STR_3392 :{SMALLFONT}{BLACK}마우스 오른쪽 버튼을 누른 채로 움직이면 화면을 빠르게 움직일 수 있습니다... +STR_3393 :{SMALLFONT}{BLACK}공원을 더 많이 보고 싶다면 화면 위쪽에 있는 축소 버튼을 이용하여 화면을 축소할 수 있습니다... +STR_3394 :{SMALLFONT}{BLACK}또 90도씩 화면을 회전시킬 수도 있습니다... +STR_3395 :{SMALLFONT}{BLACK}하지만 이 스케일에서 뭔가를 건설하는 건 조금 힘듭니다. 다시 화면을 확대하여 원래대로 돌려놓읍시다... +STR_3396 :{SMALLFONT}{BLACK}공원의 첫 놀이기구로 간단한 놀이기구를 만들어보죠... +STR_3397 :{SMALLFONT}{BLACK}'유령'처럼 생긴 하얀 이미지는 놀이기구가 지어질 위치를 나타내는 것입니다. 마우스 커서를 움직여서 설치할 위치를 잡고 클릭하여 건설합니다... +STR_3398 :{SMALLFONT}{BLACK}놀이기구는 입구와 출구가 필요합니다. 마우스 커서를 놀이기구의 가장자리에 두고 클릭해서 입구를 먼저 만들고, 그 다음으로 출구도 만듭니다... +STR_3399 :{SMALLFONT}{BLACK}우리가 방금 만든 새 놀이기구에 손님이 접근하기 위해서는 길을 만들어야 합니다... +STR_3400 :{SMALLFONT}{BLACK}놀이기구 입구에 연결하는 길은 '대기줄' 보도라는 특별한 길을 사용할 것입니다... +STR_3401 :{SMALLFONT}{BLACK}출구에 연결하는 길은 그냥 '평범한' 보도면 됩니다... +STR_3402 :{SMALLFONT}{BLACK}좋아요, 놀이기구를 개장해보죠! 놀이기구를 열기 위해서는 놀이기구 창에서 깃발 모양의 아이콘을 클릭하고 '열기'를 선택하세요... +STR_3403 :{SMALLFONT}{BLACK}그런데 손님은 어디있을까요? +STR_3404 :{SMALLFONT}{BLACK}이런, 공원이 아직 닫혀있네요! 공원의 문을 활짝 열어보죠... +STR_3405 :{SMALLFONT}{BLACK}첫 손님이 올 때까지 약간의 조형물을 만들어보죠... +STR_3406 :{SMALLFONT}{BLACK}여기 빈 공원이 있습니다. 이제 여기에 간단한 커스텀 디자인 놀이기구를 만들어보겠습니다... +STR_3407 :{SMALLFONT}{BLACK}먼저 시작할 위치를 골라야 합니다... +STR_3408 :{SMALLFONT}{BLACK}방금 우리가 만든 트랙 섹션은 놀이기구에 손님을 태우고 내리는 '탑승장'입니다... +STR_3409 :{SMALLFONT}{BLACK}이제 탑증상 섹션을 조금 더 추가하여 승강장을 확장해보죠... +STR_3410 :{SMALLFONT}{BLACK}건설 창의 가장 위에 있는 아이콘을 보시면 알겠지만 추가할 수 있는 트랙 조각이 여러 가지 있습니다... +STR_3411 :{SMALLFONT}{BLACK}왼쪽 커브를 선택해보겠습니다... +STR_3412 :{SMALLFONT}{BLACK}커브는 아직 건설되지 않았지만 하얀 유령 이미지가 어디에 지어질지를 보여주고 있습니다. 커다랗게 생긴 '건설하기' 버튼을 클릭해서 실제로 트랙을 건설합시다... +STR_3413 :{SMALLFONT}{BLACK}이제 직진 트랙을 만들고 싶습니다. 직진 트랙 아이콘을 클릭합시다... +STR_3414 :{SMALLFONT}{BLACK}이제 트랙을 완성합시다. 그리고 놀이기구의 입구와 출구를 만들어야 합니다. +STR_3415 :{SMALLFONT}{BLACK}이제 놀이기구가 제대로 돌아가는지 테스트해보죠... +STR_3416 :{SMALLFONT}{BLACK}테스트가 진행되는 동안, 대기줄과 출구 보도를 만들도록 하죠... +STR_3417 :{SMALLFONT}{BLACK}됐습니다. 이제 공원과 놀이기구를 열어보죠... +STR_3418 :{SMALLFONT}{BLACK}우리가 방금 새로 만든 놀이기구가 별로 재미가 없나봅니다. 조형물을 조금 추가해야할 것 같군요? +STR_3419 :{SMALLFONT}{BLACK}조형물 위에 조형물을 얹거나 공중에 띄워 설치하려면, SHIFT 키를 누른 채로 마우스를 움직여 원하는 높이에서 클릭하시면 됩니다... +STR_3420 :{SMALLFONT}{BLACK}일부 조형물은 설치하고 나면 다시 색을 칠할 수 없으니 유의하세요... +STR_3421 :{SMALLFONT}{BLACK}놀이기구에 음악을 흐르게 만들어봅시다.... +STR_3422 :{SMALLFONT}{BLACK}롤러코스터를 만들어보죠 ! +STR_3423 :{SMALLFONT}{BLACK}미리 디자인된 롤러코스터가 있습니다만, 우리는 스스로 트랙을 디자인해서 만들 것입니다... +STR_3424 :{SMALLFONT}{BLACK}탑승장이 만들어졌습니다. 이제 리프트 힐이 필요합니다... +STR_3425 :{SMALLFONT}{BLACK}롤러코스터의 열차에는 동력이 없어서 열차가 첫 번째 언덕을 통과하기 위해서는 '체인 리프트'가 필요합니다... +STR_3426 :{SMALLFONT}{BLACK}리프트 힐이 완성되었습니다. 이제 첫 번째 낙하 구간을 만들죠... +STR_3427 :{SMALLFONT}{BLACK}이런 커브는 좋은 생각이 아닙니다. 탑승자는 열차가 달리면서 측면 중력때문에 측면으로 쏠리기 때문입니다... +STR_3428 :{SMALLFONT}{BLACK}트랙의 커브에 기울임을 주면 탑승자들이 측면으로 쏠리는 대신에 좌석 아래쪽으로 당겨지게 되어 안정적인 탑승감을 선사할 수 있습니다... +STR_3429 :{SMALLFONT}{BLACK}저런, 그렇게 하면 제대로 굴러가질 않습니다! 높이 고도 표시를 보시면 알겠지만 두 번째 언덕이 첫 번째 언덕보다 높습니다... +STR_3430 :{SMALLFONT}{BLACK}열차가 제대로 굴러가게 만드려면, 각 언덕은 이전 언덕보다 조금 낮아야 함을 잊지 마세요... +STR_3431 :{SMALLFONT}{BLACK}훨씬 낫네요. 이제 열차가 언덕을 오를 수 있게 되었습니다! 이제는 몇 개의 특수 트랙을 설치해보겠습니다... +STR_3432 :{SMALLFONT}{BLACK}마지막 커브를 돌아서 탑승장에 돌아가기 전에 열차의 속력을 늦춰야 합니다. 그러니까 브레이크를 걸어보도록 하죠... +STR_3433 :{SMALLFONT}{BLACK}이제 마지막으로 두 대의 여열차가 안전하게 서킷을 돌 수 있도록 만들어주는 '블록 브레이크'를 추가해보죠. +STR_3434 :{SMALLFONT}{BLACK}놀이기구를 테스트하고 제대로 굴러가는 모습을 감상해보도록 하죠! +STR_3435 :{SMALLFONT}{BLACK}훌륭합니다, 잘 작동하네요! 보도를 추가해서 손님들이 새로 만든 롤러코스터에 접근할 수 있게 만들어 주세요... +STR_3436 :{SMALLFONT}{BLACK}첫 번째 탑승자를 기다리는 동안, 놀이기구를 조금만 커스터마이징해보죠... +STR_3437 :{SMALLFONT}{BLACK}조형물을 한꺼번에 제거 +STR_3438 :여기에 있는 모든 조형물을 다 제거하지 못 하였습니다... +STR_3439 :조형물 제거 +STR_3440 :1쪽 +STR_3441 :2쪽 +STR_3442 :3쪽 +STR_3443 :4쪽 +STR_3444 :5쪽 +STR_3445 :순찰 영역 설정 +STR_3446 :순찰 영역 해제 # New strings, cleaner -STR_5120 :Finances -STR_5121 :Research -STR_5122 :Select 라이드s by track type (like in RCT1) -STR_5123 :Renew 라이드s -STR_5124 : -STR_5125 :All destructable -STR_5126 :Random title music -STR_5127 :{SMALLFONT}{BLACK}Disable land elevation -STR_5128 :Selection size -STR_5129 :Enter selection size between {COMMA16} and {COMMA16} -STR_5130 :Map size -STR_5131 :Enter map size between {COMMA16} and {COMMA16} -STR_5132 :Fix all 라이드s -STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights -STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights -STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights -STR_5136 :Land rights -STR_5137 :Allow lift hill and launch speeds{NEWLINE}up to {VELOCITY} +STR_5120 :재정 +STR_5121 :연구 +STR_5122 :놀이기구를 (RCT1처럼) 트랙 종류 별로 선택 +STR_5123 :놀이기구 갱신 +STR_5124 :<더 이상 사용하지 않음> +STR_5125 :모두 파괴 가능 +STR_5126 :무작위 타이틀 음악 +STR_5127 :{SMALLFONT}{BLACK}땅을 올리거나 내리지 않음 +STR_5128 :선택 도구 크기 +STR_5129 :선택 도구 크기를 {COMMA16}에서 {COMMA16} 사이의 값으로 입력하세요 +STR_5130 :지도 크기 +STR_5131 :지도 크기를 {COMMA16}에서 {COMMA16} 사이의 값으로 입력하세요 +STR_5132 :모든 놀이기구 수리 +STR_5133 :{SMALLFONT}{BLACK}땅 구입 도구 크기 줄이기 +STR_5134 :{SMALLFONT}{BLACK}땅 구입 도구 크기 늘이기 +STR_5135 :{SMALLFONT}{BLACK}땅 소유권과 건설권 구입하기 +STR_5136 :땅 소유권 +STR_5137 :체인 리프트 힐과 발사 속력을{NEWLINE}다음 속도까지 허용: {VELOCITY} STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} STR_5139 :{WHITE}{STRINGID} -STR_5140 :Disable brakes failure -STR_5141 :Disable all breakdowns -STR_5142 :Normal Speed -STR_5143 :Quick Speed -STR_5144 :Fast Speed -STR_5145 :Turbo Speed -STR_5146 :Hyper Speed -STR_5147 :Cheats -STR_5148 :{SMALLFONT}{BLACK}Change the game speed -STR_5149 :{SMALLFONT}{BLACK}Open the cheats window -STR_5150 :Enable debugging tools +STR_5140 :브레이크 고장 안 나게 +STR_5141 :고장 안 나게 +STR_5142 :보통 속도 +STR_5143 :조금 빠른 속도 +STR_5144 :빠른 속도 +STR_5145 :매우 빠른 속도 +STR_5146 :엄청 빠른 속도 +STR_5147 :치트 +STR_5148 :{SMALLFONT}{BLACK}게임 속도를 변경합니다 +STR_5149 :{SMALLFONT}{BLACK}치트 창을 엽니다 +STR_5150 :디버킹 도구를 사용합니다 STR_5151 :, STR_5152 :. -STR_5153 :Edit Themes... -STR_5154 :Hardware display -STR_5155 :Allow testing of unfinished tracks -STR_5156 :{SMALLFONT}{BLACK}Allows testing of most 라이드 types even when the track is unfinished, does not apply to block sectioned modes -STR_5157 :Unlock all prices -STR_5158 :Quit to menu -STR_5159 :Exit OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} -STR_5161 :Date Format: -STR_5162 :Day/Month/Year -STR_5163 :Month/Day/Year -STR_5164 :Twitch Channel name -STR_5165 :Name peeps after followers -STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers -STR_5167 :Track follower peeps -STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for 손님s named after channel's Twitch followers -STR_5169 :Name peeps after people in Twitch chat +STR_5153 :테마 수정... +STR_5154 :하드웨어 디스플레이 +STR_5155 :완성되지 않은 트랙의 테스트 허용 +STR_5156 :{SMALLFONT}{BLACK}대부분의 놀이기구 종류에서 트랙이 완성되지 않아도 테스트를 할 수 있도록 허용합니다. 블록 섹션 모드에는 적용되지 않습니다 +STR_5157 :모든 가격 잠금 해제 +STR_5158 :종료하고 메뉴로 +STR_5159 :OpenRCT2 종료 +STR_5160 :{COMMA16}년 {MONTH} {STRINGID} +STR_5161 :날짜 형식: +STR_5162 :일/월/년 +STR_5163 :년/월/일 +STR_5164 :Twitch 채널 이름 +STR_5165 :팔로워 이후에 사람들 이름 붙이기 +STR_5166 :{SMALLFONT}{BLACK}Twitch 채널의 팔로워 다음으로 사람들의 이름을 붙입니다 +STR_5167 :팔로워 사람 추적 +STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for 손님 named after channel's Twitch followers +STR_5169 :Twitch 채팅의 손님 이후에 사람들 이름 붙이기 STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat -STR_5171 :Track chat peeps -STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for 손님s named after Twitch chat participants -STR_5173 :Pull Twitch chat as news -STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications -STR_5175 :Input the name of your Twitch channel -STR_5176 :Enable Twitch integration -STR_5177 :Fullscreen mode: -STR_5178 :{SMALLFONT}{BLACK}Show financial cheats -STR_5179 :{SMALLFONT}{BLACK}Show 손님 cheats -STR_5180 :{SMALLFONT}{BLACK}Show park cheats -STR_5181 :{SMALLFONT}{BLACK}Show 라이드 cheats +STR_5171 :채팅 인원 추적 +STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for 손님 named after Twitch chat participants +STR_5173 :Twitch 채팅 내용을 뉴스로 전송 +STR_5174 :{SMALLFONT}{BLACK}Twitch의 채팅 메시지를 !news를 이용하여 게임 메시지로 알려줍니다 +STR_5175 :Twitch 채널 이름 입력 +STR_5176 :Twitch 통합 허용 +STR_5177 :풀 스크린 모드: +STR_5178 :{SMALLFONT}{BLACK}재정 치트를 보여줍니다 +STR_5179 :{SMALLFONT}{BLACK}손님 치트를 보여줍니다 +STR_5180 :{SMALLFONT}{BLACK}공원 치트를 보여줍니다 +STR_5181 :{SMALLFONT}{BLACK}놀이기구 치트를 보여줍니다 STR_5182 :{INT32} -STR_5183 :Base height -STR_5184 :Enter base height between {COMMA16} and {COMMA16} -STR_5185 :Water level -STR_5186 :Enter water level between {COMMA16} and {COMMA16} -STR_5187 :Finances -STR_5188 :New Campaign -STR_5189 :Research -STR_5190 :Map -STR_5191 :Viewport -STR_5192 :Recent News -STR_5193 :Land -STR_5194 :Water -STR_5195 :Clear Scenery -STR_5196 :Land Rights -STR_5197 :Scenery +STR_5183 :기본 땅 높이 +STR_5184 :기본 땅 높이를 {COMMA16} 사이의 {COMMA16} 사이의 값으로 입력하세요 +STR_5185 :물 높이 +STR_5186 :물 높이를 {COMMA16}에서 {COMMA16} 사이의 값으로 입력하세요 +STR_5187 :재정 +STR_5188 :새 광고 +STR_5189 :연구 +STR_5190 :지도 +STR_5191 :외부화면 +STR_5192 :최근 뉴스 +STR_5193 :땅 +STR_5194 :물 +STR_5195 :조형물 제거 +STR_5196 :땅 권리 +STR_5197 :조형물 STR_5198 :보도 -STR_5199 :라이드 Construction -STR_5200 :Track Design Place -STR_5201 :New 라이드 -STR_5202 :Track Design Selection -STR_5203 :라이드 -STR_5204 :라이드 List +STR_5199 :놀이기구 건설 +STR_5200 :트랙 디자인 건설 +STR_5201 :새 놀이기구 +STR_5202 :트랙 디자인 선택 +STR_5203 :놀이기구 +STR_5204 :놀이기구 목록 STR_5205 :손님 -STR_5206 :손님 List -STR_5207 :Staff -STR_5208 :Staff List -STR_5209 :Banner -STR_5210 :Object Selection -STR_5211 :Invention List -STR_5212 :Scenario Options -STR_5213 :Objective Options -STR_5214 :Map Generation -STR_5215 :Track Design Manager -STR_5216 :Track Design Manager List -STR_5217 :Cheats -STR_5218 :Themes -STR_5219 :Options -STR_5220 :Keyboard Shortcuts -STR_5221 :Change Keyboard Shortcut -STR_5222 :Load/Save -STR_5223 :Save Prompt -STR_5224 :Demolish 라이드 Prompt -STR_5225 :Fire Staff Prompt -STR_5226 :Track Delete Prompt -STR_5227 :Save Overwrite Prompt -STR_5228 :{SMALLFONT}{BLACK}Main UI -STR_5229 :{SMALLFONT}{BLACK}Park -STR_5230 :{SMALLFONT}{BLACK}Tools -STR_5231 :{SMALLFONT}{BLACK}라이드s and Peeps -STR_5232 :{SMALLFONT}{BLACK}Editors -STR_5233 :{SMALLFONT}{BLACK}Miscellaneous -STR_5234 :{SMALLFONT}{BLACK}Prompts -STR_5235 :{SMALLFONT}{BLACK}Settings -STR_5236 :Window: -STR_5237 :Palette: -STR_5238 :Current Theme: -STR_5239 :Duplicate -STR_5240 :Enter a name for the theme -STR_5241 :Can't change this theme -STR_5242 :Theme name already exists -STR_5243 :Invalid characters used -STR_5244 :Themes -STR_5245 :Top Toolbar -STR_5246 :Bottom Toolbar -STR_5247 :Track Editor Bottom Toolbar -STR_5248 :Scenario Editor Bottom Toolbar -STR_5249 :Title Menu Buttons -STR_5250 :Title Exit Button -STR_5251 :Title Options Button -STR_5252 :Title Scenario Selection -STR_5253 :Park Information -STR_5254 :Create -STR_5255 :{SMALLFONT}{BLACK}Create a new title sequence from scratch -STR_5256 :Create a new theme to make changes to -STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one -STR_5258 :{SMALLFONT}{BLACK}Delete the current theme -STR_5259 :{SMALLFONT}{BLACK}Rename the current theme -STR_5260 :Giant Screenshot -STR_5261 :Filter -STR_5262 :Wacky Worlds -STR_5263 :Time Twister -STR_5264 :Custom -STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible -STR_5266 :{SMALLFONT}{BLACK}Display -STR_5267 :{SMALLFONT}{BLACK}Culture and Units -STR_5268 :{SMALLFONT}{BLACK}Audio -STR_5269 :{SMALLFONT}{BLACK}Controls and interface -STR_5270 :{SMALLFONT}{BLACK}Miscellaneous +STR_5206 :손님 목록 +STR_5207 :직원 +STR_5208 :직원 목록 +STR_5209 :전광판 +STR_5210 :오브젝트 선택 +STR_5211 :개발 목록 +STR_5212 :시나리오 옵션 +STR_5213 :목표 설정 +STR_5214 :지도 생성 +STR_5215 :트랙 디자인 매니저 +STR_5216 :트랙 디자인 매니저 목록 +STR_5217 :치트 +STR_5218 :테마 +STR_5219 :설정 +STR_5220 :키보드 단축키 +STR_5221 :키보드 단축키 변경 +STR_5222 :불러오기/저장 +STR_5223 :저장 입력 +STR_5224 :놀이기구 파괴 확인 +STR_5225 :직원 해고 확인 +STR_5226 :트랙 삭제 확인 +STR_5227 :저장 덮어쓰기 확인 +STR_5228 :{SMALLFONT}{BLACK}주 UI +STR_5229 :{SMALLFONT}{BLACK}공원 +STR_5230 :{SMALLFONT}{BLACK}도구 +STR_5231 :{SMALLFONT}{BLACK}놀이기구 및 손님 +STR_5232 :{SMALLFONT}{BLACK}에디터 +STR_5233 :{SMALLFONT}{BLACK}기타 +STR_5234 :{SMALLFONT}{BLACK}확인창 +STR_5235 :{SMALLFONT}{BLACK}설정 +STR_5236 :창: +STR_5237 :색상표: +STR_5238 :현재 테마: +STR_5239 :중복 +STR_5240 :테마 이름을 입력하세요 +STR_5241 :테마를 변경할 수 없습니다 +STR_5242 :테마 이름이 이미 존재합니다 +STR_5243 :사용할 수 없는 문자가 있습니다 +STR_5244 :테마 +STR_5245 :상단 툴바 +STR_5246 :하단 툴바 +STR_5247 :트랙 에디터 하단 툴바 +STR_5248 :시나리오 에디터 하단 툴바 +STR_5249 :타이틀 메뉴 버튼 +STR_5250 :타이틀 종료 버튼 +STR_5251 :타이틀 설정 버튼 +STR_5252 :타이틀 시나리오 선택 +STR_5253 :공원 정보 +STR_5254 :생성 +STR_5255 :{SMALLFONT}{BLACK}새 타이틀 시퀀스를 스크래치로부터 생성합니다 +STR_5256 :새 테마를 생성하여 다음으로 바꿉니다 +STR_5257 :{SMALLFONT}{BLACK}현재 테마를 기반으로 하여 새 테마를 생성합니다 +STR_5258 :{SMALLFONT}{BLACK}현재 테마를 삭제합니다 +STR_5259 :{SMALLFONT}{BLACK}현재 테마의 이름을 바꿉니다 +STR_5260 :초대형 스크린 샷 +STR_5261 :필터 +STR_5262 :와키 월드 +STR_5263 :타임 트위스터 +STR_5264 :사용자 추가 +STR_5265 :{SMALLFONT}{BLACK}어떤 콘텐츠 내용을 볼지 선택하세요 +STR_5266 :{SMALLFONT}{BLACK}표시 +STR_5267 :{SMALLFONT}{BLACK}문화와 단위 +STR_5268 :{SMALLFONT}{BLACK}오디오 +STR_5269 :{SMALLFONT}{BLACK}제어 및 인터페이스 +STR_5270 :{SMALLFONT}{BLACK}기타 STR_5271 :{SMALLFONT}{BLACK}Twitch -STR_5272 :{SMALLFONT}{BLACK}Small Scenery -STR_5273 :{SMALLFONT}{BLACK}Large Scenery +STR_5272 :{SMALLFONT}{BLACK}소형 조형물 +STR_5273 :{SMALLFONT}{BLACK}대형 조형물 STR_5274 :{SMALLFONT}{BLACK}보도 -STR_5275 :Search for Objects -STR_5276 :Enter the name of an object to search for -STR_5277 :Clear -STR_5278 :Sandbox mode -STR_5279 :Sandbox mode off -STR_5280 :{SMALLFONT}{BLACK}Allow editing land ownership settings through the Map window and other options that are normally restricted to the Scenario Editor -STR_5281 :{SMALLFONT}{BLACK}Features -STR_5282 :RCT1 라이드 Open/Close Lights -STR_5283 :RCT1 Park Open/Close Lights -STR_5284 :RCT1 Scenario Selection Font -STR_5285 :EXPLODE!!! -STR_5286 :{SMALLFONT}{BLACK}Makes some 손님s explode -STR_5287 :라이드 is already broken down -STR_5288 :라이드 is closed -STR_5289 :No breakdowns available for this 라이드 -STR_5290 :Fix 라이드 -STR_5291 :Can't force breakdown -STR_5292 :{SMALLFONT}{BLACK}Force a breakdown -STR_5293 :{SMALLFONT}{BLACK}Close 라이드/attraction -STR_5294 :{SMALLFONT}{BLACK}Test 라이드/attraction -STR_5295 :{SMALLFONT}{BLACK}Open 라이드/attraction -STR_5296 :{SMALLFONT}{BLACK}Close park -STR_5297 :{SMALLFONT}{BLACK}Open park +STR_5275 :오브젝트 검색 +STR_5276 :검색할 오브젝트 이름을 입력하세요 +STR_5277 :초기화 +STR_5278 :모래상자 모드 +STR_5279 :모래상자 모드 끄기 +STR_5280 :{SMALLFONT}{BLACK}지도 창에서 땅 소유권 설정이 가능하도록 바꾸고 시나리오 에디터에서만 쓸 수 있던 기능을 사용할 수 있게 만듭니다 +STR_5281 :{SMALLFONT}{BLACK}기능 +STR_5282 :RCT1 놀이기구 열기/닫기 아이콘 +STR_5283 :RCT1 공원 열기/닫기 아이콘 +STR_5284 :RCT1 시나리오 선택 폰트 +STR_5285 :손님 폭탄!!! +STR_5286 :{SMALLFONT}{BLACK}일부 손님을 터뜨립니다 +STR_5287 :놀이기구가 이미 고장난 상태입니다 +STR_5288 :놀이기구가 닫혔습니다 +STR_5289 :이 놀이기구는 고장이 나지 않습니다 +STR_5290 :놀이기구 수리 +STR_5291 :강제로 고장낼 수 없습니다 +STR_5292 :{SMALLFONT}{BLACK}강제로 고장을 냅니다 +STR_5293 :{SMALLFONT}{BLACK}놀이기구/시설을 닫습니다 +STR_5294 :{SMALLFONT}{BLACK}놀이기구/시설을 테스트합니다 +STR_5295 :{SMALLFONT}{BLACK}놀이기구/시설을 엽니다 +STR_5296 :{SMALLFONT}{BLACK}공원을 닫습니다 +STR_5297 :{SMALLFONT}{BLACK}공원을 엽니다 STR_5298 :{RED}{STRINGID} STR_5299 :{LIGHTPINK}{STRINGID} -STR_5300 :{SMALLFONT}{BLACK}Quick fire staff -STR_5301 :{MEDIUMFONT}{BLACK}Clear your loan -STR_5302 :Clear loan -STR_5303 :Allow building in pause mode -STR_5304 :Title Sequence: -STR_5305 :Roller코스터 Tycoon 1 -STR_5306 :Roller코스터 Tycoon 1 (AA) -STR_5307 :Roller코스터 Tycoon 1 (AA + LL) -STR_5308 :Roller코스터 Tycoon 2 +STR_5300 :{SMALLFONT}{BLACK}빠른 직원 해고 +STR_5301 :{MEDIUMFONT}{BLACK}대출금을 모두 갚습니다 +STR_5302 :대출금 모두 갚기 +STR_5303 :일시정지 모드에서 건설 허용 +STR_5304 :타이틀 시퀀스: +STR_5305 :롤러코스터 타이쿤 1 +STR_5306 :롤러코스터 타이쿤 1 (AA) +STR_5307 :롤러코스터 타이쿤 1 (AA + LL) +STR_5308 :롤러코스터 타이쿤 2 STR_5309 :OpenRCT2 -STR_5310 :Random -STR_5311 :{SMALLFONT}{BLACK}Debug tools -STR_5312 :Show console -STR_5313 :Show tile inspector -STR_5314 :Tile inspector -STR_5315 :Grass -STR_5316 :Sand -STR_5317 :Dirt -STR_5318 :Rock -STR_5319 :Martian -STR_5320 :Checkerboard -STR_5321 :Grass clumps -STR_5322 :Ice -STR_5323 :Grid (red) -STR_5324 :Grid (yellow) -STR_5325 :Grid (blue) -STR_5326 :Grid (green) -STR_5327 :Sand (dark) -STR_5328 :Sand (light) -STR_5329 :Checkerboard (인버티드) -STR_5330 :Underground view -STR_5331 :Rock -STR_5332 :Wood (red) -STR_5333 :Wood (black) -STR_5334 :Ice -STR_5335 :라이드 entrance -STR_5336 :라이드 exit -STR_5337 :Park entrance -STR_5338 :Element type -STR_5339 :Base height -STR_5340 :Clearance height -STR_5341 :Flags -STR_5342 :Choose a map tile -STR_5343 :Automatically place staff -STR_5344 :Changelog -STR_5345 :Financial cheats -STR_5346 :손님 cheats -STR_5347 :Park cheats -STR_5348 :라이드 cheats -STR_5349 :{SMALLFONT}{BLACK}All 라이드s -STR_5350 :Max -STR_5351 :Min -STR_5352 :{BLACK}Happiness: -STR_5353 :{BLACK}Energy: -STR_5354 :{BLACK}Hunger: -STR_5355 :{BLACK}Thirst: -STR_5356 :{BLACK}Nausea: -STR_5357 :{BLACK}Nausea tolerance: -STR_5358 :{BLACK}Bathroom: -STR_5359 :Remove 손님s -STR_5360 :{SMALLFONT}{BLACK}Removes all 손님s from the map -STR_5361 :Give all 손님s: -STR_5362 :{BLACK}Set all 손님s' preferred 라이드 intensity to: -STR_5363 :More than 1 -STR_5364 :Less than 15 -STR_5365 :{BLACK}Staff speed: -STR_5366 :Normal -STR_5367 :Fast -STR_5368 :Reset crash status -STR_5369 :Park parameters... -STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}손님 generation and money. -STR_5371 :Object Selection -STR_5372 :Invert right mouse dragging -STR_5373 :Name {STRINGID} -STR_5374 :Date {STRINGID} +STR_5310 :무작위 +STR_5311 :{SMALLFONT}{BLACK}디버그 도구 +STR_5312 :콘솔 보이기 +STR_5313 :칸 검색기 보이기 +STR_5314 :칸 검색기 +STR_5315 :잔디 +STR_5316 :모래 +STR_5317 :진흙 +STR_5318 :바위 +STR_5319 :화성 +STR_5320 :체스판 +STR_5321 :자란 잔디 +STR_5322 :눈 +STR_5323 :격자 (빨강) +STR_5324 :격자 (노랑) +STR_5325 :격자 (파랑) +STR_5326 :격자 (처럭) +STR_5327 :모래 (어두움) +STR_5328 :모래 (밝음) +STR_5329 :체스판 (반전) +STR_5330 :지하 시야 +STR_5331 :바위 +STR_5332 :나무 (빨강) +STR_5333 :나무 (검정) +STR_5334 :눈 +STR_5335 :놀이기구 입구 +STR_5336 :놀이기구 출구 +STR_5337 :공원 입구 +STR_5338 :요소 종류 +STR_5339 :기본 높이 +STR_5340 :높이 제한 제거 +STR_5341 :깃발 +STR_5342 :지도 칸 선택 +STR_5343 :직원 자동 배치 +STR_5344 :변경기록 +STR_5345 :재정 치트 +STR_5346 :손님 치트 +STR_5347 :공원 치트 +STR_5348 :놀이기구 치트 +STR_5349 :{SMALLFONT}{BLACK}모든 놀이기구 +STR_5350 :최대 +STR_5351 :최소 +STR_5352 :{BLACK}행복도: +STR_5353 :{BLACK}에너지: +STR_5354 :{BLACK}배고픔: +STR_5355 :{BLACK}목마름: +STR_5356 :{BLACK}멀미도: +STR_5357 :{BLACK}멀미 참을성: +STR_5358 :{BLACK}화장실: +STR_5359 :손님 없애기 +STR_5360 :{SMALLFONT}{BLACK}지도 상의 모든 손님을 없앱니다 +STR_5361 :모든 손님에게: +STR_5362 :{BLACK}모든 손님들이 선호하는 놀이기구 격렬도를 설정합니다 +STR_5363 :1 이상 +STR_5364 :15 이하 +STR_5365 :{BLACK}직원 속도: +STR_5366 :보통 +STR_5367 :빠름 +STR_5368 :충돌 이력 제거 +STR_5369 :공원 설정... +STR_5370 :{SMALLFONT}{BLACK}제한, 손님 생성, 돈 등의{NEWLINE}공원과 관련된 설정을 수정하려면{NEWLINE}이 버튼을 클릭하세요. +STR_5371 :오브젝트 선택 +STR_5372 :마우스 오른쪽으로 드래그하는 것을 왼쪽으로 변경 +STR_5373 :이름 {STRINGID} +STR_5374 :날짜 {STRINGID} STR_5375 :{UP} STR_5376 :{DOWN} -STR_5377 :{SMALLFONT}{BLACK}Saves -STR_5378 :{SMALLFONT}{BLACK}Script -STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command -STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence -STR_5381 :{SMALLFONT}{BLACK}Stop playing title sequence -STR_5382 :{SMALLFONT}{BLACK}Restart title sequence -STR_5383 :{SMALLFONT}{BLACK}Create a new title sequence based on the current one -STR_5384 :{SMALLFONT}{BLACK}Delete the current title sequence -STR_5385 :{SMALLFONT}{BLACK}Rename the current title sequence -STR_5386 :{SMALLFONT}{BLACK}Insert a new command -STR_5387 :{SMALLFONT}{BLACK}Edit the selected command -STR_5388 :{SMALLFONT}{BLACK}Delete the selected command -STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence -STR_5390 :{SMALLFONT}{BLACK}Move the selected command down -STR_5391 :{SMALLFONT}{BLACK}Move the selected command up -STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence -STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence -STR_5394 :{SMALLFONT}{BLACK}Rename the selected save -STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game -STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game -STR_5397 :Can only be used on the title screen -STR_5398 :Cannot edit title sequence while it's playing -STR_5399 :Press the stop button to continue editing -STR_5400 :Can't change this title sequence -STR_5401 :Create a new title sequence to make changes to -STR_5402 :Failed to load title sequence -STR_5403 :There may be no Load or Wait command or a save may be invalid -STR_5404 :Name already exists -STR_5405 :Enter a name for the save -STR_5406 :Enter a name for the title sequence -STR_5407 :Add -STR_5408 :Remove -STR_5409 :Insert -STR_5410 :Edit -STR_5411 :Reload -STR_5412 :Skip to -STR_5413 :Load -STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6 -STR_5415 :Load{MOVE_X}{87}{STRING} -STR_5416 :Load{MOVE_X}{87}No save selected -STR_5417 :Location -STR_5418 :Location{MOVE_X}{87}{COMMA16} {COMMA16} -STR_5419 :Rotate -STR_5420 :Rotate{MOVE_X}{87}{COMMA16} -STR_5421 :Zoom -STR_5422 :Zoom{MOVE_X}{87}{COMMA16} -STR_5423 :Wait -STR_5424 :Wait{MOVE_X}{87}{COMMA16} -STR_5425 :Restart -STR_5426 :End -STR_5427 :Coordinates: -STR_5428 :Anticlockwise rotations: -STR_5429 :Zoom level: -STR_5430 :Seconds to wait: -STR_5431 :Save to load: -STR_5432 :Command: -STR_5433 :Title Sequences -STR_5434 :Command Editor -STR_5435 :Rename save -STR_5436 :Edit Title Sequences... -STR_5437 :No save selected -STR_5438 :Can't make changes while command editor is open -STR_5439 :A wait command with at least 4 seconds is required with a restart command -STR_5440 :미니mise fullscreen on focus loss -STR_5441 :{SMALLFONT}{BLACK}Identifies 라이드s by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. -STR_5442 :Force park rating: -STR_5443 :Speed{MOVE_X}{87}{STRINGID} -STR_5444 :Speed: -STR_5445 :Speed +STR_5377 :{SMALLFONT}{BLACK}저장 +STR_5378 :{SMALLFONT}{BLACK}스크립트 +STR_5379 :{SMALLFONT}{BLACK}다음 기다리기 명령으로 건너뜁니다 +STR_5380 :{SMALLFONT}{BLACK}타이틀 시퀀스의 재생을 시작합니다 +STR_5381 :{SMALLFONT}{BLACK}타이틀 시퀀스의 재생을 중지합니다 +STR_5382 :{SMALLFONT}{BLACK}타이틀 시퀀스를 재시작합니다 +STR_5383 :{SMALLFONT}{BLACK}현재 타이클 시퀀스를 기반으로 새 타이틀 시퀀스를 생성합니다 +STR_5384 :{SMALLFONT}{BLACK}현재 타이틀 시퀀스를 삭제합니다 +STR_5385 :{SMALLFONT}{BLACK}현재 타이틀 시퀀스를 이름을 바꿉니다 +STR_5386 :{SMALLFONT}{BLACK}새 명령을 삽입합니다 +STR_5387 :{SMALLFONT}{BLACK}선택한 명령을 수정합니다 +STR_5388 :{SMALLFONT}{BLACK}선택한 명령을 삭제합니다 +STR_5389 :{SMALLFONT}{BLACK}타이틀 시퀀스에서 선택한 명령을 건너뜁니다 +STR_5390 :{SMALLFONT}{BLACK}선택한 명령을 아래로 이동합니다 +STR_5391 :{SMALLFONT}{BLACK}선택한 명령을 위로 이동합니다 +STR_5392 :{SMALLFONT}{BLACK}타이틀 시퀀스에 게임 저장 파일을 추가합니다 +STR_5393 :{SMALLFONT}{BLACK}타이틀 시퀀스에서 선택한 게임 저장 파일을 제거합니다 +STR_5394 :{SMALLFONT}{BLACK}선택한 게임 저장 파일 이름을 바꿉니다 +STR_5395 :{SMALLFONT}{BLACK}선택한 게임 저장 파일을 게임에서 불러옵니다 +STR_5396 :{SMALLFONT}{BLACK}게임 바깥에서 뭔가 변화가 생기면 타이틀 시퀀스를 다시 불러옵니다 +STR_5397 :타이틀 화면에서만 사용할 수 있습니다 +STR_5398 :타이틀 시퀀스가 재생 중일 때에는 수정할 수 없습니다 +STR_5399 :계속 수정하려면 중지 버튼을 누르세요 +STR_5400 :타이틀 시퀀스를 변경할 수 없습니다 +STR_5401 :다음으로 바꾸기 위해 타이틀 시퀀스를 생성합니다: +STR_5402 :타이틀 시퀀스를 불러오는데 실패하였습니다 +STR_5403 :불러오기나 기다리기 명령이 없거나 유효하지 않은 게임 저장 파일이 포함되었을 수 있습니다 +STR_5404 :이미 존재하는 이름입니다 +STR_5405 :세이브 파일의 이름을 입력하세요 +STR_5406 :타이틀 시퀀스 이름을 입력하세요 +STR_5407 :추가 +STR_5408 :제거 +STR_5409 :삽입 +STR_5410 :편집 +STR_5411 :다시 불러오기 +STR_5412 :건너뛰기 +STR_5413 :불러오기 +STR_5414 :불러오기 - {MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :불러오기 - {MOVE_X}{87}{STRING} +STR_5416 :불러오기 - {MOVE_X}{87}세이브 선택되지 않음 +STR_5417 :위치 +STR_5418 :위치 - {MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :회전 +STR_5420 :{MOVE_X}{87}{COMMA16} 회전 +STR_5421 :확대 +STR_5422 :{MOVE_X}{87}{COMMA16} 확대 +STR_5423 :기다림 +STR_5424 :{MOVE_X}{87}{COMMA16} 동안 기다림 +STR_5425 :재시작 +STR_5426 :끝 +STR_5427 :좌표: +STR_5428 :반시계 방향 회전: +STR_5429 :확대 수준: +STR_5430 :기다릴 시간: +STR_5431 :불러올 세이브 파일: +STR_5432 :명령: +STR_5433 :타이틀 시퀀스 +STR_5434 :명령 에디터 +STR_5435 :세이브 이름 바꾸기 +STR_5436 :타이틀 시퀀스 편집하기... +STR_5437 :선택된 세이브 없음 +STR_5438 :명령 에디터가 열려있을 때 변경할 수 없습니다 +STR_5439 :4초 이상의 기다림 명령은 재시작 명령이 필요합니다. +STR_5440 :커서가 게임 밖으로 나가면 풀스크린을 최소화 +STR_5441 :{SMALLFONT}{BLACK}놀이기구를 RCT1처럼 종류별로 구분합니다. +STR_5442 :공원 등급 고정하기: +STR_5443 :속도{MOVE_X}{87}{STRINGID} +STR_5444 :속도: +STR_5445 :속도 STR_5446 :Get -STR_5447 :Type {STRINGID} -STR_5448 :라이드 / Vehicle {STRINGID} -STR_5449 :Reduce game speed -STR_5450 :Increase game speed -STR_5451 :Open cheats window -STR_5452 :Toggle visibility of toolbars -STR_5453 :Select another 라이드 -STR_5454 :Uncap FPS -STR_5455 :Enable sandbox mode -STR_5456 :Disable clearance checks -STR_5457 :Disable support limits -STR_5458 :Rotate clockwise -STR_5459 :Rotate anti-clockwise -STR_5460 :Rotate view anti-clockwise -STR_5461 :Set 손님s' parameters +STR_5447 :종류 {STRINGID} +STR_5448 :놀이기구 / 차량 {STRINGID} +STR_5449 :게임 속도 느리게 +STR_5450 :게임 속도 빠르게 +STR_5451 :치트 창 열기 +STR_5452 :메뉴 표시 설정 변경 +STR_5453 :다른 놀이기구 선택 +STR_5454 :FPS 제한 해제 +STR_5455 :모래상자 모드 사용 +STR_5456 :재고(?) 확인 안 하기 +STR_5457 :지지대 제한 없애기 +STR_5458 :시계방향으로 회전 +STR_5459 :반시계방향으로 회전 +STR_5460 :화면을 반시계방향으로 회전 +STR_5461 :손님 매개변수 설정 STR_5462 :{CURRENCY} -STR_5463 :Goal: Have fun! -STR_5464 :General -STR_5465 :Climate -STR_5466 :Staff +STR_5463 :목표: 즐기세요! +STR_5464 :일반 +STR_5465 :기후 +STR_5466 :직원 STR_5467 :ALT + -STR_5468 :Recent messages -STR_5469 :Scroll map up -STR_5470 :Scroll map left -STR_5471 :Scroll map down -STR_5472 :Scroll map right -STR_5473 :Cycle day / night -STR_5474 :Display text on banners in upper case -STR_5475 :{COMMA16} weeks -STR_5476 :Hardware -STR_5477 :Map rendering -STR_5478 :Controls -STR_5479 :Toolbar -STR_5480 :Show toolbar buttons for: -STR_5481 :Themes -STR_5482 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}1 minute -STR_5483 :{BLACK}({COMMA16} weeks remaining) -STR_5484 :{BLACK}({COMMA16} week remaining) +STR_5468 :최근 메시지 +STR_5469 :맵을 위로 스크롤 +STR_5470 :맵을 왼쪽으로 스크롤 +STR_5471 :맵을 아래로 스크롤 +STR_5472 :맵을 오른쪽으로 스크롤 +STR_5473 :밤낮을 순환 +STR_5474 :전광판의 영문자를 대문자로 표시 +STR_5475 :{COMMA16}주 +STR_5476 :하드웨어 +STR_5477 :지도 렌더링 +STR_5478 :컨트롤 +STR_5479 :메뉴 +STR_5480 :메뉴 버튼 보이기: +STR_5481 :테마 +STR_5482 :{WINDOW_COLOUR_2}최근 점검 시간: {BLACK}1분 +STR_5483 :{BLACK}({COMMA16}주 남음) +STR_5484 :{BLACK}({COMMA16}주 남음) STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} -STR_5487 :{SMALLFONT}{BLACK}Show recent messages -STR_5488 :No entrance -STR_5489 :{SMALLFONT}{BLACK}Show only tracked 손님s -STR_5490 :Disable audio on focus loss +STR_5487 :{SMALLFONT}{BLACK}최근 메시지 보이기 +STR_5488 :입구 없음 +STR_5489 :{SMALLFONT}{BLACK}추적 중인 손님만 보기 +STR_5490 :게임 밖으로 커서가 나가면 효과음 끄기 diff --git a/data/language/russian.txt b/data/language/russian.txt new file mode 100644 index 0000000000..e883082a54 --- /dev/null +++ b/data/language/russian.txt @@ -0,0 +1,3463 @@ +# STR_XXXX part is read and XXXX becomes the string id number. +# Everything after the colon and before the new line will be saved as the string. +# Use # at the beginning of a line to leave a comment. +STR_0000 : +STR_0001 :{STRINGID} {COMMA16} +STR_0002 :Спиральные горки +STR_0003 :Стоячие горки +STR_0004 :Подвесные раскачивающиеся горки +STR_0005 :Обратные горки +STR_0006 :Детские горки +STR_0007 :Миниатюрная железная дорога +STR_0008 :Монорельс +STR_0009 :Мини стоячие горки +STR_0010 :Заезд на лодках +STR_0011 :Деревянная дикая мышь +STR_0012 :Steeplechase +STR_0013 :Заезд на машиинах +STR_0014 :Запуск в свободное подение +STR_0015 :Бобслей +STR_0016 :Смотровая башня +STR_0017 :Петляющие горки +STR_0018 :Скольжение в шлюпке +STR_0019 :Горки в шахте +STR_0020 :Кресельный лифт +STR_0021 :Штопорные горки +STR_0022 :Лабиринт +STR_0023 :Спуск по спирали +STR_0024 :Гонки +STR_0025 :Сплав на бревне +STR_0026 :Речные пороги +STR_0027 :Автодром +STR_0028 :Пиратский корабль +STR_0029 :Раскачивающийся инвертированный корабль +STR_0030 :Киоск с едой +STR_0031 :Неизвестный киоск (1D) +STR_0032 :Киоск с питьём +STR_0033 :Неизвестный киоск (1F) +STR_0034 :Магазинчик +STR_0035 :Карусель +STR_0036 :Неизвестный киоск (22) +STR_0037 :Информационный стенд +STR_0038 :Туалеты +STR_0039 :Колесо обозрения +STR_0040 :Симулятор движения +STR_0041 :3D Кинотеатр +STR_0042 :Top Spin +STR_0043 :Космические кольца +STR_0044 :Обратное подение +STR_0045 :Лифт +STR_0046 :Vertical Drop Roller Coaster +STR_0047 :Банкомат +STR_0048 :Раскрутка +STR_0049 :Дом с привидениями +STR_0050 :Палатка первой помощи +STR_0051 :Цирковое представление +STR_0052 :Призрачный поезд +STR_0053 :Стальные извивающиеся горки +STR_0054 :Деревянные горки +STR_0055 :Side-Friction Roller Coaster +STR_0056 :Дикая мышь +STR_0057 :Мультипространственные горки +STR_0058 :Неизвестный атракцион (38) +STR_0059 :Парящие горки +STR_0060 :Неизвестный атракцион (3A) +STR_0061 :Virginia Reel +STR_0062 :Лодки с брызгами +STR_0063 :Мини-вертолётики +STR_0064 :Лежачие горки +STR_0065 :Подвесной монорельс +STR_0066 :Неизвестный атракцион (40) +STR_0067 :Обратные горки +STR_0068 :Кардиограмные переплетёные горки +STR_0069 :Мини-гольф +STR_0070 :Огромные горки +STR_0071 :Roto-Drop +STR_0072 :Летающие блюдца +STR_0073 :Дом кривых зеркал +STR_0074 :Монорельсовые велосипеды +STR_0075 :Компактные инвертированые горки +STR_0076 :Водные горки +STR_0077 :Вертикальные горки на воздушной тяги +STR_0078 :Inverted Hairpin Coaster +STR_0079 :Ковёр-самолёт +STR_0080 :Заплыв на подводной лодке +STR_0081 :Речной рафтинг +STR_0082 :Неизвесный атракцион (50) +STR_0083 :Цинтрефуга +STR_0084 :Неизвестный атракцион (52) +STR_0085 :Неизвестный атракцион (53) +STR_0086 :Неизвестный атракцион (54) +STR_0087 :Неизвестный атракцион (55) +STR_0088 :Инвертированые импульсовые горки +STR_0089 :Мини-горки +STR_0090 :Шахтёрская поездка +STR_0091 :Неизвестный атракцион (59) +STR_0092 :ЛИМ запускающие горки +STR_0093 : +STR_0094 : +STR_0095 : +STR_0096 : +STR_0097 : +STR_0098 : +STR_0099 : +STR_0100 : +STR_0101 : +STR_0102 : +STR_0103 : +STR_0104 : +STR_0105 : +STR_0106 : +STR_0107 : +STR_0108 : +STR_0109 : +STR_0110 : +STR_0111 : +STR_0112 : +STR_0113 : +STR_0114 : +STR_0115 : +STR_0116 : +STR_0117 : +STR_0118 : +STR_0119 : +STR_0120 : +STR_0121 : +STR_0122 : +STR_0123 : +STR_0124 : +STR_0125 : +STR_0126 : +STR_0127 : +STR_0128 : +STR_0129 : +STR_0130 : +STR_0131 : +STR_0132 : +STR_0133 : +STR_0134 : +STR_0135 : +STR_0136 : +STR_0137 : +STR_0138 : +STR_0139 : +STR_0140 : +STR_0141 : +STR_0142 : +STR_0143 : +STR_0144 : +STR_0145 : +STR_0146 : +STR_0147 : +STR_0148 : +STR_0149 : +STR_0150 : +STR_0151 : +STR_0152 : +STR_0153 : +STR_0154 : +STR_0155 : +STR_0156 : +STR_0157 : +STR_0158 : +STR_0159 : +STR_0160 : +STR_0161 : +STR_0162 : +STR_0163 : +STR_0164 : +STR_0165 : +STR_0166 : +STR_0167 : +STR_0168 : +STR_0169 : +STR_0170 : +STR_0171 : +STR_0172 : +STR_0173 : +STR_0174 : +STR_0175 : +STR_0176 : +STR_0177 : +STR_0178 : +STR_0179 : +STR_0180 : +STR_0181 : +STR_0182 : +STR_0183 : +STR_0184 : +STR_0185 : +STR_0186 : +STR_0187 : +STR_0188 : +STR_0189 : +STR_0190 : +STR_0191 : +STR_0192 : +STR_0193 : +STR_0194 : +STR_0195 : +STR_0196 : +STR_0197 : +STR_0198 : +STR_0199 : +STR_0200 : +STR_0201 : +STR_0202 : +STR_0203 : +STR_0204 : +STR_0205 : +STR_0206 : +STR_0207 : +STR_0208 : +STR_0209 : +STR_0210 : +STR_0211 : +STR_0212 : +STR_0213 : +STR_0214 : +STR_0215 : +STR_0216 : +STR_0217 : +STR_0218 : +STR_0219 : +STR_0220 : +STR_0221 : +STR_0222 : +STR_0223 : +STR_0224 : +STR_0225 : +STR_0226 : +STR_0227 : +STR_0228 : +STR_0229 : +STR_0230 : +STR_0231 : +STR_0232 : +STR_0233 : +STR_0234 : +STR_0235 : +STR_0236 : +STR_0237 : +STR_0238 : +STR_0239 : +STR_0240 : +STR_0241 : +STR_0242 : +STR_0243 : +STR_0244 : +STR_0245 : +STR_0246 : +STR_0247 : +STR_0248 : +STR_0249 : +STR_0250 : +STR_0251 : +STR_0252 : +STR_0253 : +STR_0254 : +STR_0255 : +STR_0256 : +STR_0257 : +STR_0258 : +STR_0259 : +STR_0260 : +STR_0261 : +STR_0262 : +STR_0263 : +STR_0264 : +STR_0265 : +STR_0266 : +STR_0267 : +STR_0268 : +STR_0269 : +STR_0270 : +STR_0271 : +STR_0272 : +STR_0273 : +STR_0274 : +STR_0275 : +STR_0276 : +STR_0277 : +STR_0278 : +STR_0279 : +STR_0280 : +STR_0281 : +STR_0282 : +STR_0283 : +STR_0284 : +STR_0285 : +STR_0286 : +STR_0287 : +STR_0288 : +STR_0289 : +STR_0290 : +STR_0291 : +STR_0292 : +STR_0293 : +STR_0294 : +STR_0295 : +STR_0296 : +STR_0297 : +STR_0298 : +STR_0299 : +STR_0300 : +STR_0301 : +STR_0302 : +STR_0303 : +STR_0304 : +STR_0305 : +STR_0306 : +STR_0307 : +STR_0308 : +STR_0309 : +STR_0310 : +STR_0311 : +STR_0312 : +STR_0313 : +STR_0314 : +STR_0315 : +STR_0316 : +STR_0317 : +STR_0318 : +STR_0319 : +STR_0320 : +STR_0321 : +STR_0322 : +STR_0323 : +STR_0324 : +STR_0325 : +STR_0326 : +STR_0327 : +STR_0328 : +STR_0329 : +STR_0330 : +STR_0331 : +STR_0332 : +STR_0333 : +STR_0334 : +STR_0335 : +STR_0336 : +STR_0337 : +STR_0338 : +STR_0339 : +STR_0340 : +STR_0341 : +STR_0342 : +STR_0343 : +STR_0344 : +STR_0345 : +STR_0346 : +STR_0347 : +STR_0348 : +STR_0349 : +STR_0350 : +STR_0351 : +STR_0352 : +STR_0353 : +STR_0354 : +STR_0355 : +STR_0356 : +STR_0357 : +STR_0358 : +STR_0359 : +STR_0360 : +STR_0361 : +STR_0362 : +STR_0363 : +STR_0364 : +STR_0365 : +STR_0366 : +STR_0367 : +STR_0368 : +STR_0369 : +STR_0370 : +STR_0371 : +STR_0372 : +STR_0373 : +STR_0374 : +STR_0375 : +STR_0376 : +STR_0377 : +STR_0378 : +STR_0379 : +STR_0380 : +STR_0381 : +STR_0382 : +STR_0383 : +STR_0384 : +STR_0385 : +STR_0386 : +STR_0387 : +STR_0388 : +STR_0389 : +STR_0390 : +STR_0391 : +STR_0392 : +STR_0393 : +STR_0394 : +STR_0395 : +STR_0396 : +STR_0397 : +STR_0398 : +STR_0399 : +STR_0400 : +STR_0401 : +STR_0402 : +STR_0403 : +STR_0404 : +STR_0405 : +STR_0406 : +STR_0407 : +STR_0408 : +STR_0409 : +STR_0410 : +STR_0411 : +STR_0412 : +STR_0413 : +STR_0414 : +STR_0415 : +STR_0416 : +STR_0417 : +STR_0418 : +STR_0419 : +STR_0420 : +STR_0421 : +STR_0422 : +STR_0423 : +STR_0424 : +STR_0425 : +STR_0426 : +STR_0427 : +STR_0428 : +STR_0429 : +STR_0430 : +STR_0431 : +STR_0432 : +STR_0433 : +STR_0434 : +STR_0435 : +STR_0436 : +STR_0437 : +STR_0438 : +STR_0439 : +STR_0440 : +STR_0441 : +STR_0442 : +STR_0443 : +STR_0444 : +STR_0445 : +STR_0446 : +STR_0447 : +STR_0448 : +STR_0449 : +STR_0450 : +STR_0451 : +STR_0452 : +STR_0453 : +STR_0454 : +STR_0455 : +STR_0456 : +STR_0457 : +STR_0458 : +STR_0459 : +STR_0460 : +STR_0461 : +STR_0462 : +STR_0463 : +STR_0464 : +STR_0465 : +STR_0466 : +STR_0467 : +STR_0468 : +STR_0469 : +STR_0470 : +STR_0471 : +STR_0472 : +STR_0473 : +STR_0474 : +STR_0475 : +STR_0476 : +STR_0477 : +STR_0478 : +STR_0479 : +STR_0480 : +STR_0481 : +STR_0482 : +STR_0483 : +STR_0484 : +STR_0485 : +STR_0486 : +STR_0487 : +STR_0488 : +STR_0489 : +STR_0490 : +STR_0491 : +STR_0492 : +STR_0493 : +STR_0494 : +STR_0495 : +STR_0496 : +STR_0497 : +STR_0498 : +STR_0499 : +STR_0500 : +STR_0501 : +STR_0502 : +STR_0503 : +STR_0504 : +STR_0505 : +STR_0506 : +STR_0507 : +STR_0508 : +STR_0509 : +STR_0510 : +STR_0511 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :A looping roller coaster where the riders ride in a standing position +STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements +STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides +STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track +STR_0518 :Passengers travel in electric trains along a monorail track +STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them +STR_0523 :Riders travel slowly in powered vehicles along a track-based route +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower +STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops +STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track +STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops +STR_0532 : +STR_0533 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids +STR_0537 : +STR_0538 : +STR_0539 : +STR_0540 : +STR_0541 : +STR_0542 : +STR_0543 : +STR_0544 : +STR_0545 : +STR_0546 : +STR_0547 : +STR_0548 : +STR_0549 : +STR_0550 : +STR_0551 : +STR_0552 : +STR_0553 : +STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience +STR_0557 : +STR_0558 : +STR_0559 : +STR_0560 : +STR_0561 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects +STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills +STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' +STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity +STR_0566 :Individual roller coaster cars zip around a tight zig-zag layout of track with sharp corners and short sharp drops +STR_0567 :Sitting in seats suspended either side of the track, riders are pitched head-over-heels while they plunge down steep drops and travel through various inversions +STR_0568 : +STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air +STR_0570 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground +STR_0575 :Powered trains hanging from a single rail transport people around the park +STR_0576 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections +STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists +STR_0579 : +STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes +STR_0582 : +STR_0583 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions +STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops +STR_0589 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track +STR_0592 : +STR_0593 : +STR_0594 : +STR_0595 : +STR_0596 : +STR_0597 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track +STR_0599 :A compact roller coaster with individual cars and smooth twisting drops +STR_0600 :Powered mine trains career along a smooth and twisted track layout +STR_0601 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions +STR_0603 :Guest {INT32} +STR_0604 :Guest {INT32} +STR_0605 :Guest {INT32} +STR_0606 :Guest {INT32} +STR_0607 :Guest {INT32} +STR_0608 :Guest {INT32} +STR_0609 :Guest {INT32} +STR_0610 :Guest {INT32} +STR_0611 :Guest {INT32} +STR_0612 :Guest {INT32} +STR_0613 :Guest {INT32} +STR_0614 :Guest {INT32} +STR_0615 :Guest {INT32} +STR_0616 :Guest {INT32} +STR_0617 :Guest {INT32} +STR_0618 :Guest {INT32} +STR_0619 :Guest {INT32} +STR_0620 :Guest {INT32} +STR_0621 :Guest {INT32} +STR_0622 :Guest {INT32} +STR_0623 :Guest {INT32} +STR_0624 :Guest {INT32} +STR_0625 :Guest {INT32} +STR_0626 :Guest {INT32} +STR_0627 :Guest {INT32} +STR_0628 :Guest {INT32} +STR_0629 :Guest {INT32} +STR_0630 :Guest {INT32} +STR_0631 :Guest {INT32} +STR_0632 :Guest {INT32} +STR_0633 :Guest {INT32} +STR_0634 :Guest {INT32} +STR_0635 :Guest {INT32} +STR_0636 :Guest {INT32} +STR_0637 :Guest {INT32} +STR_0638 :Guest {INT32} +STR_0639 :Guest {INT32} +STR_0640 :Guest {INT32} +STR_0641 :Guest {INT32} +STR_0642 :Guest {INT32} +STR_0643 :Guest {INT32} +STR_0644 :Guest {INT32} +STR_0645 :Guest {INT32} +STR_0646 :Guest {INT32} +STR_0647 :Guest {INT32} +STR_0648 :Guest {INT32} +STR_0649 :Guest {INT32} +STR_0650 :Guest {INT32} +STR_0651 :Guest {INT32} +STR_0652 :Guest {INT32} +STR_0653 :Guest {INT32} +STR_0654 :Guest {INT32} +STR_0655 :Guest {INT32} +STR_0656 :Guest {INT32} +STR_0657 :Guest {INT32} +STR_0658 :Guest {INT32} +STR_0659 :Guest {INT32} +STR_0660 :Guest {INT32} +STR_0661 :Guest {INT32} +STR_0662 :Guest {INT32} +STR_0663 :Guest {INT32} +STR_0664 :Guest {INT32} +STR_0665 :Guest {INT32} +STR_0666 :Guest {INT32} +STR_0667 :Guest {INT32} +STR_0668 :Guest {INT32} +STR_0669 :Guest {INT32} +STR_0670 :Guest {INT32} +STR_0671 :Guest {INT32} +STR_0672 :Guest {INT32} +STR_0673 :Guest {INT32} +STR_0674 :Guest {INT32} +STR_0675 :Guest {INT32} +STR_0676 :Guest {INT32} +STR_0677 :Guest {INT32} +STR_0678 :Guest {INT32} +STR_0679 :Guest {INT32} +STR_0680 :Guest {INT32} +STR_0681 :Guest {INT32} +STR_0682 :Guest {INT32} +STR_0683 :Guest {INT32} +STR_0684 :Guest {INT32} +STR_0685 :Guest {INT32} +STR_0686 :Guest {INT32} +STR_0687 :Guest {INT32} +STR_0688 :Guest {INT32} +STR_0689 :Guest {INT32} +STR_0690 :Guest {INT32} +STR_0691 :Guest {INT32} +STR_0692 :Guest {INT32} +STR_0693 :Guest {INT32} +STR_0694 :Guest {INT32} +STR_0695 :Guest {INT32} +STR_0696 :Guest {INT32} +STR_0697 :Guest {INT32} +STR_0698 :Guest {INT32} +STR_0699 :Guest {INT32} +STR_0700 :Guest {INT32} +STR_0701 :Guest {INT32} +STR_0702 :Guest {INT32} +STR_0703 :Guest {INT32} +STR_0704 :Guest {INT32} +STR_0705 :Guest {INT32} +STR_0706 :Guest {INT32} +STR_0707 :Guest {INT32} +STR_0708 :Guest {INT32} +STR_0709 :Guest {INT32} +STR_0710 :Guest {INT32} +STR_0711 :Guest {INT32} +STR_0712 :Guest {INT32} +STR_0713 :Guest {INT32} +STR_0714 :Guest {INT32} +STR_0715 :Guest {INT32} +STR_0716 :Guest {INT32} +STR_0717 :Guest {INT32} +STR_0718 :Guest {INT32} +STR_0719 :Guest {INT32} +STR_0720 :Guest {INT32} +STR_0721 :Guest {INT32} +STR_0722 :Guest {INT32} +STR_0723 :Guest {INT32} +STR_0724 :Guest {INT32} +STR_0725 :Guest {INT32} +STR_0726 :Guest {INT32} +STR_0727 :Guest {INT32} +STR_0728 :Guest {INT32} +STR_0729 :Guest {INT32} +STR_0730 :Guest {INT32} +STR_0731 :Guest {INT32} +STR_0732 :Guest {INT32} +STR_0733 :Guest {INT32} +STR_0734 :Guest {INT32} +STR_0735 :Guest {INT32} +STR_0736 :Guest {INT32} +STR_0737 :Guest {INT32} +STR_0738 :Guest {INT32} +STR_0739 :Guest {INT32} +STR_0740 :Guest {INT32} +STR_0741 :Guest {INT32} +STR_0742 :Guest {INT32} +STR_0743 :Guest {INT32} +STR_0744 :Guest {INT32} +STR_0745 :Guest {INT32} +STR_0746 :Guest {INT32} +STR_0747 :Guest {INT32} +STR_0748 :Guest {INT32} +STR_0749 :Guest {INT32} +STR_0750 :Guest {INT32} +STR_0751 :Guest {INT32} +STR_0752 :Guest {INT32} +STR_0753 :Guest {INT32} +STR_0754 :Guest {INT32} +STR_0755 :Guest {INT32} +STR_0756 :Guest {INT32} +STR_0757 :Guest {INT32} +STR_0758 :Guest {INT32} +STR_0759 :Guest {INT32} +STR_0760 :Guest {INT32} +STR_0761 :Guest {INT32} +STR_0762 :Guest {INT32} +STR_0763 :Guest {INT32} +STR_0764 :Guest {INT32} +STR_0765 :Guest {INT32} +STR_0766 :Guest {INT32} +STR_0767 :Guest {INT32} +STR_0768 :Handyman {INT32} +STR_0769 :Mechanic {INT32} +STR_0770 :Security Guard {INT32} +STR_0771 :Entertainer {INT32} +STR_0772 :Unnamed park{POP16}{POP16} +STR_0773 :Unnamed park{POP16}{POP16} +STR_0774 :Unnamed park{POP16}{POP16} +STR_0775 :Unnamed park{POP16}{POP16} +STR_0776 :Unnamed park{POP16}{POP16} +STR_0777 :Unnamed park{POP16}{POP16} +STR_0778 :Sign +STR_0779 :1st +STR_0780 :2nd +STR_0781 :3rd +STR_0782 :4th +STR_0783 :5th +STR_0784 :6th +STR_0785 :7th +STR_0786 :8th +STR_0787 :9th +STR_0788 :10th +STR_0789 :11th +STR_0790 :12th +STR_0791 :13th +STR_0792 :14th +STR_0793 :15th +STR_0794 :16th +STR_0795 :17th +STR_0796 :18th +STR_0797 :19th +STR_0798 :20th +STR_0799 :21st +STR_0800 :22nd +STR_0801 :23rd +STR_0802 :24th +STR_0803 :25th +STR_0804 :26th +STR_0805 :27th +STR_0806 :28th +STR_0807 :29th +STR_0808 :30th +STR_0809 :31st +STR_0810 :Jan +STR_0811 :Feb +STR_0812 :Mar +STR_0813 :Apr +STR_0814 :May +STR_0815 :Jun +STR_0816 :Jul +STR_0817 :Aug +STR_0818 :Sep +STR_0819 :Oct +STR_0820 :Nov +STR_0821 :Dec +STR_0822 :Unable to access graphic data file +STR_0823 :Missing or inaccessible data file +STR_0824 :{BLACK}{CROSS} +STR_0825 :Chosen name in use already +STR_0826 :Too many names defined +STR_0827 :Not enough cash - requires {CURRENCY2DP} +STR_0828 :{SMALLFONT}{BLACK}Close window +STR_0829 :{SMALLFONT}{BLACK}Window title - Drag this to move window +STR_0830 :{SMALLFONT}{BLACK}Zoom view in +STR_0831 :{SMALLFONT}{BLACK}Zoom view out +STR_0832 :{SMALLFONT}{BLACK}Rotate view 90{DEGREE} clockwise +STR_0833 :{SMALLFONT}{BLACK}Pause game +STR_0834 :{SMALLFONT}{BLACK}Disk and game options +STR_0835 :Game initialisation failed +STR_0836 :Unable to start game in a minimised state +STR_0837 :Unable to initialise graphics system +STR_0838 : +STR_0839 :{UINT16} x {UINT16} +STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} +# The following six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :About 'OpenRCT2' +STR_0848 :RollerCoaster Tycoon 2 +STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028 +STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, all rights reserved +STR_0851 :{WINDOW_COLOUR_2}Designed and programmed by Chris Sawyer +STR_0852 :{WINDOW_COLOUR_2}Graphics by Simon Foster +STR_0853 :{WINDOW_COLOUR_2}Sound and music by Allister Brimble +STR_0854 :{WINDOW_COLOUR_2}Additional sounds recorded by David Ellis +STR_0855 :{WINDOW_COLOUR_2}Representation by Jacqui Lyons at Marjacq Ltd. +STR_0856 :{WINDOW_COLOUR_2}Thanks to: +STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth, and John Wardley +STR_0858 :{WINDOW_COLOUR_2} +STR_0859 :{WINDOW_COLOUR_2} +STR_0860 :{WINDOW_COLOUR_2} +STR_0861 : +STR_0862 : +STR_0863 : +STR_0864 : +STR_0865 :{STRINGID} +STR_0866 :{POP16}{STRINGID} +STR_0867 :{POP16}{POP16}{STRINGID} +STR_0868 :{POP16}{POP16}{POP16}{STRINGID} +STR_0869 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0870 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0872 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0873 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0874 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0875 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0876 :{BLACK}{DOWN} +STR_0877 :Too low ! +STR_0878 :Too high ! +STR_0879 :Can't lower land here... +STR_0880 :Can't raise land here... +STR_0881 :Object in the way +STR_0882 :Load Game +STR_0883 :Save Game +STR_0884 :Load Landscape +STR_0885 :Save Landscape +STR_0886 :Quit Game +STR_0887 :Quit Scenario Editor +STR_0888 :Quit Roller Coaster Designer +STR_0889 :Quit Track Designs Manager +STR_0890 :SCR{COMMA16}.BMP +STR_0891 :Screenshot +STR_0892 :Screenshot saved to disk as '{STRINGID}' +STR_0893 :Screenshot failed ! +STR_0894 :Landscape data area full ! +STR_0895 :Can't build partly above and partly below ground +STR_0896 :{POP16}{POP16}{STRINGID} Construction +STR_0897 :Direction +STR_0898 :{SMALLFONT}{BLACK}Left-hand curve +STR_0899 :{SMALLFONT}{BLACK}Right-hand curve +STR_0900 :{SMALLFONT}{BLACK}Left-hand curve (small radius) +STR_0901 :{SMALLFONT}{BLACK}Right-hand curve (small radius) +STR_0902 :{SMALLFONT}{BLACK}Left-hand curve (very small radius) +STR_0903 :{SMALLFONT}{BLACK}Right-hand curve (very small radius) +STR_0904 :{SMALLFONT}{BLACK}Left-hand curve (large radius) +STR_0905 :{SMALLFONT}{BLACK}Right-hand curve (large radius) +STR_0906 :{SMALLFONT}{BLACK}Straight +STR_0907 :Slope +STR_0908 :Roll/Banking +STR_0909 :Seat Rot. +STR_0910 :{SMALLFONT}{BLACK}Roll for left-hand curve +STR_0911 :{SMALLFONT}{BLACK}Roll for right-hand curve +STR_0912 :{SMALLFONT}{BLACK}No roll +STR_0913 :{SMALLFONT}{BLACK}Move to previous section +STR_0914 :{SMALLFONT}{BLACK}Move to next section +STR_0915 :{SMALLFONT}{BLACK}Construct the selected section +STR_0916 :{SMALLFONT}{BLACK}Remove the highlighted section +STR_0917 :{SMALLFONT}{BLACK}Vertical drop +STR_0918 :{SMALLFONT}{BLACK}Steep slope down +STR_0919 :{SMALLFONT}{BLACK}Slope down +STR_0920 :{SMALLFONT}{BLACK}Level +STR_0921 :{SMALLFONT}{BLACK}Slope up +STR_0922 :{SMALLFONT}{BLACK}Steep slope up +STR_0923 :{SMALLFONT}{BLACK}Vertical rise +STR_0924 :{SMALLFONT}{BLACK}Helix down +STR_0925 :{SMALLFONT}{BLACK}Helix up +STR_0926 :Can't remove this... +STR_0927 :Can't construct this here... +STR_0928 :{SMALLFONT}{BLACK}Chain lift, to pull cars up slopes +STR_0929 :'S' Bend (left) +STR_0930 :'S' Bend (right) +STR_0931 :Vertical Loop (left) +STR_0932 :Vertical Loop (right) +STR_0933 :Raise or lower land first +STR_0934 :Ride entrance in the way +STR_0935 :Ride exit in the way +STR_0936 :Park entrance in the way +STR_0937 :{SMALLFONT}{BLACK}View options +STR_0938 :{SMALLFONT}{BLACK}Adjust land height and slope +STR_0939 :Underground/Inside View +STR_0940 :Remove Base Land +STR_0941 :Remove Vertical Faces +STR_0942 :See-Through Rides +STR_0943 :See-Through Scenery +STR_0944 :Save +STR_0945 :Don't Save +STR_0946 :Cancel +STR_0947 :Save this before loading ? +STR_0948 :Save this before quitting ? +STR_0949 :Save this before quitting ? +STR_0950 :Load Game +STR_0951 :Quit Game +STR_0952 :Quit Game +STR_0953 :Load Landscape +STR_0954 : +STR_0955 :{SMALLFONT}{BLACK}Select seat rotation angle for this track section +STR_0956 :-180{DEGREE} +STR_0957 :-135{DEGREE} +STR_0958 :-90{DEGREE} +STR_0959 :-45{DEGREE} +STR_0960 :0{DEGREE} +STR_0961 :+45{DEGREE} +STR_0962 :+90{DEGREE} +STR_0963 :+135{DEGREE} +STR_0964 :+180{DEGREE} +STR_0965 :+225{DEGREE} +STR_0966 :+270{DEGREE} +STR_0967 :+315{DEGREE} +STR_0968 :+360{DEGREE} +STR_0969 :+405{DEGREE} +STR_0970 :+450{DEGREE} +STR_0971 :+495{DEGREE} +STR_0972 :Cancel +STR_0973 :OK +STR_0974 :Rides +STR_0975 :Shops and Stalls +STR_0976 :Toilets and Information Kiosks +STR_0977 :New Transport Rides +STR_0978 :New Gentle Rides +STR_0979 :New Roller Coasters +STR_0980 :New Thrill Rides +STR_0981 :New Water Rides +STR_0982 :New Shops & Stalls +STR_0983 :Research & Development +STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} +STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP} +STR_0986 :{BLACK}{CURRENCY2DP} +STR_0987 :Too many rides/attractions +STR_0988 :Can't create new ride/attraction... +STR_0989 :{STRINGID} +STR_0990 :{SMALLFONT}{BLACK}Construction +STR_0991 :Station platform +STR_0992 :{SMALLFONT}{BLACK}Demolish entire ride/attraction +STR_0993 :Demolish ride/attraction +STR_0994 :Demolish +STR_0995 :{WINDOW_COLOUR_1}Are you sure you want to completely demolish {STRINGID}? +STR_0996 :Overall view +STR_0997 :{SMALLFONT}{BLACK}View selection +STR_0998 :No more stations allowed on this ride +STR_0999 :Requires a station platform +STR_1000 :Track is not a complete circuit +STR_1001 :Track unsuitable for type of train +STR_1002 :Can't open {POP16}{POP16}{POP16}{STRINGID}... +STR_1003 :Can't test {POP16}{POP16}{POP16}{STRINGID}... +STR_1004 :Can't close {POP16}{POP16}{POP16}{STRINGID}... +STR_1005 :Can't start construction on {POP16}{POP16}{POP16}{STRINGID}... +STR_1006 :Must be closed first +STR_1007 :Unable to create enough vehicles +STR_1008 :{SMALLFONT}{BLACK}Open, close, or test ride/attraction +STR_1009 :{SMALLFONT}{BLACK}Open or close all rides/attractions +STR_1010 :{SMALLFONT}{BLACK}Open or close park +STR_1011 :Close all +STR_1012 :Open all +STR_1013 :Close park +STR_1014 :Open park +STR_1015 :Unable to operate with more than one station platform in this mode +STR_1016 :Unable to operate with less than two stations in this mode +STR_1017 :Can't change operating mode... +STR_1018 :Can't make changes... +STR_1019 :Can't make changes... +STR_1020 :Can't make changes... +STR_1021 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_1022 :{POP16}{POP16}{POP16}{COMMA16} car per train +STR_1023 :{POP16}{POP16}{POP16}{COMMA16} cars per train +STR_1024 :{COMMA16} car per train +STR_1025 :{COMMA16} cars per train +STR_1026 :Station platform too long! +STR_1027 :{SMALLFONT}{BLACK}Locate this on Main View +STR_1028 :Off edge of map! +STR_1029 :Cannot build partly above and partly below water! +STR_1030 :Can only build this underwater! +STR_1031 :Can't build this underwater! +STR_1032 :Can only build this on water! +STR_1033 :Can only build this above ground! +STR_1034 :Can only build this on land! +STR_1035 :Local authority won't allow construction above tree-height! +STR_1036 :Load Game +STR_1037 :Load Landscape +STR_1038 :Convert saved game to scenario +STR_1039 :Install new track design +STR_1040 :Save Game +STR_1041 :Save Scenario +STR_1042 :Save Landscape +STR_1043 :OpenRCT2 Saved Game +STR_1044 :OpenRCT2 Scenario File +STR_1045 :OpenRCT2 Landscape File +STR_1046 :OpenRCT2 Track Design File +STR_1047 :Game save failed! +STR_1048 :Scenario save failed! +STR_1049 :Landscape save failed! +STR_1050 :Failed to load...{NEWLINE}File contains invalid data! +STR_1051 :Invisible Supports +STR_1052 :Invisible People +STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park +STR_1054 :{SMALLFONT}{BLACK}Name ride/attraction +STR_1055 :{SMALLFONT}{BLACK}Name person +STR_1056 :{SMALLFONT}{BLACK}Name staff member +STR_1057 :Ride/attraction name +STR_1058 :Enter new name for this ride/attraction: +STR_1059 :Can't rename ride/attraction... +STR_1060 :Invalid ride/attraction name +STR_1061 :Normal mode +STR_1062 :Continuous circuit mode +STR_1063 :Reverse-Incline launched shuttle mode +STR_1064 :Powered launch (passing station) +STR_1065 :Shuttle mode +STR_1066 :Boat hire mode +STR_1067 :Upward launch +STR_1068 :Rotating lift mode +STR_1069 :Station to station mode +STR_1070 :Single ride per admission +STR_1071 :Unlimited rides per admission +STR_1072 :Maze mode +STR_1073 :Race mode +STR_1074 :Bumper-car mode +STR_1075 :Swing mode +STR_1076 :Shop stall mode +STR_1077 :Rotation mode +STR_1078 :Forward rotation +STR_1079 :Backward rotation +STR_1080 :Film: {ENDQUOTES}Avenging aviators{ENDQUOTES} +STR_1081 :3D film: {ENDQUOTES}Mouse tails{ENDQUOTES} +STR_1082 :Space rings mode +STR_1083 :Beginners mode +STR_1084 :LIM-powered launch +STR_1085 :Film: {ENDQUOTES}Thrill riders{ENDQUOTES} +STR_1086 :3D film: {ENDQUOTES}Storm chasers{ENDQUOTES} +STR_1087 :3D film: {ENDQUOTES}Space raiders{ENDQUOTES} +STR_1088 :Intense mode +STR_1089 :Berserk mode +STR_1090 :Haunted house mode +STR_1091 :Circus show mode +STR_1092 :Downward launch +STR_1093 :Crooked house mode +STR_1094 :Freefall drop mode +STR_1095 :Continuous circuit block sectioned mode +STR_1096 :Powered launch (without passing station) +STR_1097 :Powered launch block sectioned mode +STR_1098 :Moving to end of {POP16}{STRINGID} +STR_1099 :Waiting for passengers at {POP16}{STRINGID} +STR_1100 :Waiting to depart {POP16}{STRINGID} +STR_1101 :Departing {POP16}{STRINGID} +STR_1102 :Travelling at {VELOCITY} +STR_1103 :Arriving at {POP16}{STRINGID} +STR_1104 :Unloading passengers at {POP16}{STRINGID} +STR_1105 :Travelling at {VELOCITY} +STR_1106 :Crashing! +STR_1107 :Crashed! +STR_1108 :Travelling at {VELOCITY} +STR_1109 :Swinging +STR_1110 :Rotating +STR_1111 :Rotating +STR_1112 :Operating +STR_1113 :Showing film +STR_1114 :Rotating +STR_1115 :Operating +STR_1116 :Operating +STR_1117 :Doing circus show +STR_1118 :Operating +STR_1119 :Waiting for cable lift +STR_1120 :Travelling at {VELOCITY} +STR_1121 :Stopping +STR_1122 :Waiting for passengers +STR_1123 :Waiting to start +STR_1124 :Starting +STR_1125 :Operating +STR_1126 :Stopping +STR_1127 :Unloading passengers +STR_1128 :Stopped by block brakes +STR_1129 :All vehicles in same colours +STR_1130 :Different colours per {STRINGID} +STR_1131 :Different colours per vehicle +STR_1132 :Vehicle {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1133 :Vehicle {POP16}{COMMA16} +STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} +STR_1135 :{STRINGID} {COMMA16} +STR_1136 :{SMALLFONT}{BLACK}Select main colour +STR_1137 :{SMALLFONT}{BLACK}Select additional colour 1 +STR_1138 :{SMALLFONT}{BLACK}Select additional colour 2 +STR_1139 :{SMALLFONT}{BLACK}Select support structure colour +STR_1140 :{SMALLFONT}{BLACK}Select vehicle colour scheme option +STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify +STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} +STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} +STR_1144 :Can't build/move entrance for this ride/attraction... +STR_1145 :Can't build/move exit for this ride/attraction... +STR_1146 :Entrance not yet built +STR_1147 :Exit not yet built +STR_1148 :Quarter load +STR_1149 :Half load +STR_1150 :Three-quarter load +STR_1151 :Full load +STR_1152 :Any load +STR_1153 :Height Marks on Ride Tracks +STR_1154 :Height Marks on Land +STR_1155 :Height Marks on Paths +STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} +STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} +STR_1158 :Can't remove this... +STR_1159 :{SMALLFONT}{BLACK}Place scenery, gardens, and other accessories +STR_1160 :{SMALLFONT}{BLACK}Create/adjust lakes & water +STR_1161 :Can't position this here... +STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} +STR_1163 :{STRINGID}{NEWLINE}(Right-Click to Modify) +STR_1164 :{STRINGID}{NEWLINE}(Right-Click to Remove) +STR_1165 :{STRINGID} - {STRINGID} {COMMA16} +STR_1166 :Can't lower water level here... +STR_1167 :Can't raise water level here... +STR_1168 :Options +STR_1169 :(None) +STR_1170 :{STRING} +STR_1171 :{RED}Closed - - +STR_1172 :{YELLOW}{STRINGID} - - +STR_1173 :{SMALLFONT}{BLACK}Build footpaths and queue lines +STR_1174 :Banner sign in the way +STR_1175 :Can't build this on sloped footpath +STR_1176 :Can't build footpath here... +STR_1177 :Can't remove footpath from here... +STR_1178 :Land slope unsuitable +STR_1179 :Footpath in the way +STR_1180 :Can't build this underwater! +STR_1181 :Footpaths +STR_1182 :Type +STR_1183 :Direction +STR_1184 :Slope +STR_1185 :{SMALLFONT}{BLACK}Direction +STR_1186 :{SMALLFONT}{BLACK}Slope down +STR_1187 :{SMALLFONT}{BLACK}Level +STR_1188 :{SMALLFONT}{BLACK}Slope up +STR_1189 :{SMALLFONT}{BLACK}Construct the selected footpath section +STR_1190 :{SMALLFONT}{BLACK}Remove previous footpath section +STR_1191 :{BLACK}{STRINGID} +STR_1192 :{OUTLINE}{RED}{STRINGID} +STR_1193 :{WINDOW_COLOUR_2}{STRINGID} +STR_1194 :Closed +STR_1195 :Test Run +STR_1196 :Open +STR_1197 :Broken Down +STR_1198 :Crashed! +STR_1199 :{COMMA16} person on ride +STR_1200 :{COMMA16} people on ride +STR_1201 :Nobody in queue line +STR_1202 :1 person in queue line +STR_1203 :{COMMA16} people in queue line +STR_1204 :{COMMA16} minute queue time +STR_1205 :{COMMA16} minutes queue time +STR_1206 :{WINDOW_COLOUR_2}Wait for: +STR_1207 :{WINDOW_COLOUR_2}Leave if another train arrives at station +STR_1208 :{WINDOW_COLOUR_2}Leave if another boat arrives at station +STR_1209 :{SMALLFONT}{BLACK}Select whether should wait for passengers before departing +STR_1210 :{SMALLFONT}{BLACK}Select whether should leave if another vehicle arrives at the same station +STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time: +STR_1212 :{WINDOW_COLOUR_2}Maximum waiting time: +STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing +STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing +STR_1215 :{WINDOW_COLOUR_2}Synchronise with adjacent stations +STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronise departure with all adjacent stations (for 'racing') +STR_1217 :{COMMA16} seconds +STR_1218 :{BLACK}{SMALLUP} +STR_1219 :{BLACK}{SMALLDOWN} +STR_1220 :Exit only +STR_1221 :No entrance +STR_1222 :No exit +STR_1223 :{SMALLFONT}{BLACK}Transport rides +STR_1224 :{SMALLFONT}{BLACK}Gentle rides +STR_1225 :{SMALLFONT}{BLACK}Roller coasters +STR_1226 :{SMALLFONT}{BLACK}Thrill rides +STR_1227 :{SMALLFONT}{BLACK}Water rides +STR_1228 :{SMALLFONT}{BLACK}Shops & stalls +STR_1229 :train +STR_1230 :trains +STR_1231 :Train +STR_1232 :Trains +STR_1233 :{COMMA16} train +STR_1234 :{COMMA16} trains +STR_1235 :Train {COMMA16} +STR_1236 :boat +STR_1237 :boats +STR_1238 :Boat +STR_1239 :Boats +STR_1240 :{COMMA16} boat +STR_1241 :{COMMA16} boats +STR_1242 :Boat {COMMA16} +STR_1243 :track +STR_1244 :tracks +STR_1245 :Track +STR_1246 :Tracks +STR_1247 :{COMMA16} track +STR_1248 :{COMMA16} tracks +STR_1249 :Track {COMMA16} +STR_1250 :docking platform +STR_1251 :docking platforms +STR_1252 :Docking platform +STR_1253 :Docking platforms +STR_1254 :{COMMA16} docking platform +STR_1255 :{COMMA16} docking platforms +STR_1256 :Docking platform {COMMA16} +STR_1257 :station +STR_1258 :stations +STR_1259 :Station +STR_1260 :Stations +STR_1261 :{COMMA16} station +STR_1262 :{COMMA16} stations +STR_1263 :Station {COMMA16} +STR_1264 :car +STR_1265 :cars +STR_1266 :Car +STR_1267 :Cars +STR_1268 :{COMMA16} car +STR_1269 :{COMMA16} cars +STR_1270 :Car {COMMA16} +STR_1271 :building +STR_1272 :buildings +STR_1273 :Building +STR_1274 :Buildings +STR_1275 :{COMMA16} building +STR_1276 :{COMMA16} buildings +STR_1277 :Building {COMMA16} +STR_1278 :structure +STR_1279 :structures +STR_1280 :Structure +STR_1281 :Structures +STR_1282 :{COMMA16} structure +STR_1283 :{COMMA16} structures +STR_1284 :Structure {COMMA16} +STR_1285 :ship +STR_1286 :ships +STR_1287 :Ship +STR_1288 :Ships +STR_1289 :{COMMA16} ship +STR_1290 :{COMMA16} ships +STR_1291 :Ship {COMMA16} +STR_1292 :cabin +STR_1293 :cabins +STR_1294 :Cabin +STR_1295 :Cabins +STR_1296 :{COMMA16} cabin +STR_1297 :{COMMA16} cabins +STR_1298 :Cabin {COMMA16} +STR_1299 :wheel +STR_1300 :wheels +STR_1301 :Wheel +STR_1302 :Wheels +STR_1303 :{COMMA16} wheel +STR_1304 :{COMMA16} wheels +STR_1305 :Wheel {COMMA16} +STR_1306 :ring +STR_1307 :rings +STR_1308 :Ring +STR_1309 :Rings +STR_1310 :{COMMA16} ring +STR_1311 :{COMMA16} rings +STR_1312 :Ring {COMMA16} +STR_1313 :player +STR_1314 :players +STR_1315 :Player +STR_1316 :Players +STR_1317 :{COMMA16} player +STR_1318 :{COMMA16} players +STR_1319 :Player {COMMA16} +STR_1320 :course +STR_1321 :courses +STR_1322 :Course +STR_1323 :Courses +STR_1324 :{COMMA16} course +STR_1325 :{COMMA16} courses +STR_1326 :Course {COMMA16} +STR_1327 :{SMALLFONT}{BLACK}Rotate objects by 90{DEGREE} +STR_1328 :Level land required +STR_1329 :{WINDOW_COLOUR_2}Launch speed: +STR_1330 :{SMALLFONT}{BLACK}Maximum speed when leaving station +STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_1332 :{VELOCITY} +STR_1333 :{STRINGID} - {STRINGID}{POP16} +STR_1334 :{STRINGID} - {STRINGID} {COMMA16} +STR_1335 :{STRINGID} - Entrance{POP16}{POP16} +STR_1336 :{STRINGID} - Station {POP16}{COMMA16} Entrance +STR_1337 :{STRINGID} - Exit{POP16}{POP16} +STR_1338 :{STRINGID} - Station {POP16}{COMMA16} Exit +STR_1339 :{BLACK}No test results yet... +STR_1340 :{WINDOW_COLOUR_2}Max. speed: {BLACK}{VELOCITY} +STR_1341 :{WINDOW_COLOUR_2}Ride time: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1342 :{DURATION} +STR_1343 :{DURATION} / +STR_1344 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1345 :{LENGTH} +STR_1346 :{LENGTH} / +STR_1347 :{WINDOW_COLOUR_2}Average speed: {BLACK}{VELOCITY} +STR_1348 :{WINDOW_COLOUR_2}Max. positive vertical G's: {BLACK}{COMMA2DP32}g +STR_1349 :{WINDOW_COLOUR_2}Max. positive vertical G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1350 :{WINDOW_COLOUR_2}Max. negative vertical G's: {BLACK}{COMMA2DP32}g +STR_1351 :{WINDOW_COLOUR_2}Max. negative vertical G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1352 :{WINDOW_COLOUR_2}Max. lateral G's: {BLACK}{COMMA2DP32}g +STR_1353 :{WINDOW_COLOUR_2}Max. lateral G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1354 :{WINDOW_COLOUR_2}Highest drop height: {BLACK}{LENGTH} +STR_1355 :{WINDOW_COLOUR_2}Drops: {BLACK}{COMMA16} +STR_1356 :{WINDOW_COLOUR_2}Inversions: {BLACK}{COMMA16} +STR_1357 :{WINDOW_COLOUR_2}Holes: {BLACK}{COMMA16} +STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs +STR_1359 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minute +STR_1360 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minutes +STR_1361 :Can't change speed... +STR_1362 :Can't change launch speed... +STR_1363 :Too high for supports! +STR_1364 :Supports for track above can't be extended any further! +STR_1365 :In-line Twist (left) +STR_1366 :In-line Twist (right) +STR_1367 :Half Loop +STR_1368 :Half Corkscrew (left) +STR_1369 :Half Corkscrew (right) +STR_1370 :Barrel Roll (left) +STR_1371 :Barrel Roll (right) +STR_1372 :Launched Lift Hill +STR_1373 :Large Half Loop (left) +STR_1374 :Large Half Loop (right) +STR_1375 :Upper Transfer +STR_1376 :Lower Transfer +STR_1377 :Heartline Roll (left) +STR_1378 :Heartline Roll (right) +STR_1379 :Reverser (left) +STR_1380 :Reverser (right) +STR_1381 :Curved Lift Hill (left) +STR_1382 :Curved Lift Hill (right) +STR_1383 :Quarter Loop +STR_1384 :{YELLOW}{STRINGID} +STR_1385 :{SMALLFONT}{BLACK}Other track configurations +STR_1386 :Special... +STR_1387 :Can't change land type... +STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} +STR_1389 :{OUTLINE}{RED}- {CURRENCY} +STR_1390 :{CURRENCY2DP} +STR_1391 :{RED}{CURRENCY2DP} +STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction +STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options +STR_1394 :{SMALLFONT}{BLACK}Operating options +STR_1395 :{SMALLFONT}{BLACK}Maintenance options +STR_1396 :{SMALLFONT}{BLACK}Colour scheme options +STR_1397 :{SMALLFONT}{BLACK}Sound & music options +STR_1398 :{SMALLFONT}{BLACK}Measurements and test data +STR_1399 :{SMALLFONT}{BLACK}Graphs +STR_1400 :Entrance +STR_1401 :Exit +STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction +STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction +STR_1404 :{SMALLFONT}{BLACK}Rotate 90{DEGREE} +STR_1405 :{SMALLFONT}{BLACK}Mirror image +STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) +STR_1407 :{WINDOW_COLOUR_2}Build this... +STR_1408 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} +STR_1409 :Entry/Exit Platform +STR_1410 :Vertical Tower +STR_1411 :{STRINGID} in the way +STR_1412 :{WINDOW_COLOUR_3}Data logging not available for this type of ride +STR_1413 :{WINDOW_COLOUR_3}Data logging will start when next {STRINGID} leaves {STRINGID} +STR_1414 :{SMALLFONT}{BLACK}{DURATION} +STR_1415 :{WINDOW_COLOUR_2}Velocity +STR_1416 :{WINDOW_COLOUR_2}Altitude +STR_1417 :{WINDOW_COLOUR_2}Vert.G's +STR_1418 :{WINDOW_COLOUR_2}Lat.G's +STR_1419 :{SMALLFONT}{BLACK}{VELOCITY} +STR_1420 :{SMALLFONT}{BLACK}{LENGTH} +STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g +STR_1422 :{SMALLFONT}{BLACK}Logging data from {POP16}{STRINGID} +STR_1423 :{SMALLFONT}{BLACK}Queue line path +STR_1424 :{SMALLFONT}{BLACK}Footpath +STR_1425 :Footpath +STR_1426 :Queue Line +STR_1427 :{WINDOW_COLOUR_2}Customers: {BLACK}{COMMA32} per hour +STR_1428 :{WINDOW_COLOUR_2}Admission price: +STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1430 :Free +STR_1431 :Walking +STR_1432 :Heading for {STRINGID} +STR_1433 :Queuing for {STRINGID} +STR_1434 :Drowning +STR_1435 :On {STRINGID} +STR_1436 :In {STRINGID} +STR_1437 :At {STRINGID} +STR_1438 :Sitting +STR_1439 :(select location) +STR_1440 :Mowing grass +STR_1441 :Sweeping footpath +STR_1442 :Emptying litter bin +STR_1443 :Watering gardens +STR_1444 :Watching {STRINGID} +STR_1445 :Watching construction of {STRINGID} +STR_1446 :Looking at scenery +STR_1447 :Leaving the park +STR_1448 :Watching new ride being constructed +STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) +STR_1452 :Guest's name +STR_1453 :Enter name for this guest: +STR_1454 :Can't name guest... +STR_1455 :Invalid name for guest +STR_1456 :{WINDOW_COLOUR_2}Cash spent: {BLACK}{CURRENCY2DP} +STR_1457 :{WINDOW_COLOUR_2}Cash in pocket: {BLACK}{CURRENCY2DP} +STR_1458 :{WINDOW_COLOUR_2}Time in park: {BLACK}{REALTIME} +STR_1459 :Track style +STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track +STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track +STR_1462 :Too steep for lift hill +STR_1463 :Guests +STR_1464 :Helix up (small) +STR_1465 :Helix up (large) +STR_1466 :Helix down (small) +STR_1467 :Helix down (large) +STR_1468 :Staff +STR_1469 :Ride must start and end with stations +STR_1470 :Station not long enough +STR_1471 :{WINDOW_COLOUR_2}Speed: +STR_1472 :{SMALLFONT}{BLACK}Speed of this ride +STR_1473 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1474 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}Not yet available +STR_1475 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1476 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}Not yet available +STR_1477 :{WINDOW_COLOUR_2}Intensity rating: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) +STR_1478 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1479 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}Not yet available +STR_1480 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} +STR_1481 :{SMALLFONT}{OPENQUOTES}I've spent all my money{ENDQUOTES} +STR_1482 :{SMALLFONT}{OPENQUOTES}I feel sick{ENDQUOTES} +STR_1483 :{SMALLFONT}{OPENQUOTES}I feel very sick{ENDQUOTES} +STR_1484 :{SMALLFONT}{OPENQUOTES}I want to go on something more thrilling than {STRINGID}{ENDQUOTES} +STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} looks too intense for me{ENDQUOTES} +STR_1486 :{SMALLFONT}{OPENQUOTES}I haven't finished my {STRINGID} yet{ENDQUOTES} +STR_1487 :{SMALLFONT}{OPENQUOTES}Just looking at {STRINGID} makes me feel sick{ENDQUOTES} +STR_1488 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to go on {STRINGID}{ENDQUOTES} +STR_1489 :{SMALLFONT}{OPENQUOTES}I want to go home{ENDQUOTES} +STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} is really good value{ENDQUOTES} +STR_1491 :{SMALLFONT}{OPENQUOTES}I've already got {STRINGID}{ENDQUOTES} +STR_1492 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} +STR_1493 :{SMALLFONT}{OPENQUOTES}I'm not hungry{ENDQUOTES} +STR_1494 :{SMALLFONT}{OPENQUOTES}I'm not thirsty{ENDQUOTES} +STR_1495 :{SMALLFONT}{OPENQUOTES}Help! I'm drowning!{ENDQUOTES} +STR_1496 :{SMALLFONT}{OPENQUOTES}I'm lost!{ENDQUOTES} +STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} was great{ENDQUOTES} +STR_1498 :{SMALLFONT}{OPENQUOTES}I've been queuing for {STRINGID} for ages{ENDQUOTES} +STR_1499 :{SMALLFONT}{OPENQUOTES}I'm tired{ENDQUOTES} +STR_1500 :{SMALLFONT}{OPENQUOTES}I'm hungry{ENDQUOTES} +STR_1501 :{SMALLFONT}{OPENQUOTES}I'm thirsty{ENDQUOTES} +STR_1502 :{SMALLFONT}{OPENQUOTES}I need to go to the bathroom{ENDQUOTES} +STR_1503 :{SMALLFONT}{OPENQUOTES}I can't find {STRINGID}{ENDQUOTES} +STR_1504 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to use {STRINGID}{ENDQUOTES} +STR_1505 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} while it's raining{ENDQUOTES} +STR_1506 :{SMALLFONT}{OPENQUOTES}The litter here is really bad{ENDQUOTES} +STR_1507 :{SMALLFONT}{OPENQUOTES}I can't find the park exit{ENDQUOTES} +STR_1508 :{SMALLFONT}{OPENQUOTES}I want to get off {STRINGID}{ENDQUOTES} +STR_1509 :{SMALLFONT}{OPENQUOTES}I want to get out of {STRINGID}{ENDQUOTES} +STR_1510 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} - It isn't safe{ENDQUOTES} +STR_1511 :{SMALLFONT}{OPENQUOTES}This path is disgusting{ENDQUOTES} +STR_1512 :{SMALLFONT}{OPENQUOTES}It's too crowded here{ENDQUOTES} +STR_1513 :{SMALLFONT}{OPENQUOTES}The vandalism here is really bad{ENDQUOTES} +STR_1514 :{SMALLFONT}{OPENQUOTES}Great scenery!{ENDQUOTES} +STR_1515 :{SMALLFONT}{OPENQUOTES}This park is really clean and tidy{ENDQUOTES} +STR_1516 :{SMALLFONT}{OPENQUOTES}The jumping fountains are great{ENDQUOTES} +STR_1517 :{SMALLFONT}{OPENQUOTES}The music is nice here{ENDQUOTES} +STR_1518 :{SMALLFONT}{OPENQUOTES}This balloon from {STRINGID} is really good value{ENDQUOTES} +STR_1519 :{SMALLFONT}{OPENQUOTES}This cuddly toy from {STRINGID} is really good value{ENDQUOTES} +STR_1520 :{SMALLFONT}{OPENQUOTES}This park map from {STRINGID} is really good value{ENDQUOTES} +STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} +STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} +STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} +STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} +STR_1528 : +STR_1529 : +STR_1530 : +STR_1531 :{SMALLFONT}{OPENQUOTES}This pizza from {STRINGID} is really good value{ENDQUOTES} +STR_1532 : +STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good value{ENDQUOTES} +STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} +STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} +STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}This toffee apple from {STRINGID} is really good value{ENDQUOTES} +STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}This doughnut from {STRINGID} is really good value{ENDQUOTES} +STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} +STR_1541 : +STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} +STR_1543 :{SMALLFONT}{OPENQUOTES}This lemonade from {STRINGID} is really good value{ENDQUOTES} +STR_1544 : +STR_1545 : +STR_1546 : +STR_1547 : +STR_1548 : +STR_1549 : +STR_1550 :{SMALLFONT}{OPENQUOTES}Wow!{ENDQUOTES} +STR_1551 :{SMALLFONT}{OPENQUOTES}I have the strangest feeling someone is watching me{ENDQUOTES} +STR_1552 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a balloon from {STRINGID}{ENDQUOTES} +STR_1553 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cuddly toy from {STRINGID}{ENDQUOTES} +STR_1554 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a park map from {STRINGID}{ENDQUOTES} +STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} +STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} +STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} +STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} +STR_1562 : +STR_1563 : +STR_1564 : +STR_1565 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for pizza from {STRINGID}{ENDQUOTES} +STR_1566 : +STR_1567 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for popcorn from {STRINGID}{ENDQUOTES} +STR_1568 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hot dog from {STRINGID}{ENDQUOTES} +STR_1569 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for tentacle from {STRINGID}{ENDQUOTES} +STR_1570 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hat from {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a toffee apple from {STRINGID}{ENDQUOTES} +STR_1572 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a T-shirt from {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a doughnut from {STRINGID}{ENDQUOTES} +STR_1574 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for coffee from {STRINGID}{ENDQUOTES} +STR_1575 : +STR_1576 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried chicken from {STRINGID}{ENDQUOTES} +STR_1577 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for lemonade from {STRINGID}{ENDQUOTES} +STR_1578 : +STR_1579 : +STR_1580 : +STR_1581 : +STR_1582 : +STR_1583 : +STR_1584 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1585 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1586 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1587 :{SMALLFONT}{OPENQUOTES}This pretzel from {STRINGID} is really good value{ENDQUOTES} +STR_1588 :{SMALLFONT}{OPENQUOTES}This hot chocolate from {STRINGID} is really good value{ENDQUOTES} +STR_1589 :{SMALLFONT}{OPENQUOTES}This iced tea from {STRINGID} is really good value{ENDQUOTES} +STR_1590 :{SMALLFONT}{OPENQUOTES}This funnel cake from {STRINGID} is really good value{ENDQUOTES} +STR_1591 :{SMALLFONT}{OPENQUOTES}These sunglasses from {STRINGID} are really good value{ENDQUOTES} +STR_1592 :{SMALLFONT}{OPENQUOTES}These beef noodles from {STRINGID} are really good value{ENDQUOTES} +STR_1593 :{SMALLFONT}{OPENQUOTES}These fried rice noodles from {STRINGID} are really good value{ENDQUOTES} +STR_1594 :{SMALLFONT}{OPENQUOTES}This wonton soup from {STRINGID} is really good value{ENDQUOTES} +STR_1595 :{SMALLFONT}{OPENQUOTES}This meatball soup from {STRINGID} is really good value{ENDQUOTES} +STR_1596 :{SMALLFONT}{OPENQUOTES}This fruit juice from {STRINGID} is really good value{ENDQUOTES} +STR_1597 :{SMALLFONT}{OPENQUOTES}This soybean milk from {STRINGID} is really good value{ENDQUOTES} +STR_1598 :{SMALLFONT}{OPENQUOTES}This sujongkwa from {STRINGID} is really good value{ENDQUOTES} +STR_1599 :{SMALLFONT}{OPENQUOTES}This sub sandwich from {STRINGID} is really good value{ENDQUOTES} +STR_1600 :{SMALLFONT}{OPENQUOTES}This cookie from {STRINGID} is really good value{ENDQUOTES} +STR_1601 : +STR_1602 : +STR_1603 : +STR_1604 :{SMALLFONT}{OPENQUOTES}This roast sausage from {STRINGID} are really good value{ENDQUOTES} +STR_1605 : +STR_1606 : +STR_1607 : +STR_1608 : +STR_1609 : +STR_1610 : +STR_1611 : +STR_1612 : +STR_1613 : +STR_1614 : +STR_1615 : +STR_1616 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1617 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1618 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1619 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a pretzel from {STRINGID}{ENDQUOTES} +STR_1620 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for hot chocolate from {STRINGID}{ENDQUOTES} +STR_1621 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for iced tea from {STRINGID}{ENDQUOTES} +STR_1622 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a funnel cake from {STRINGID}{ENDQUOTES} +STR_1623 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sunglasses from {STRINGID}{ENDQUOTES} +STR_1624 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for beef noodles from {STRINGID}{ENDQUOTES} +STR_1625 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried rice noodles from {STRINGID}{ENDQUOTES} +STR_1626 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for wonton soup from {STRINGID}{ENDQUOTES} +STR_1627 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for meatball soup from {STRINGID}{ENDQUOTES} +STR_1628 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fruit juice from {STRINGID}{ENDQUOTES} +STR_1629 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for soybean milk from {STRINGID}{ENDQUOTES} +STR_1630 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sujongkwa from {STRINGID}{ENDQUOTES} +STR_1631 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a sub sandwich from {STRINGID}{ENDQUOTES} +STR_1632 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cookie from {STRINGID}{ENDQUOTES} +STR_1633 : +STR_1634 : +STR_1635 : +STR_1636 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a roast sausage from {STRINGID}{ENDQUOTES} +STR_1637 : +STR_1638 : +STR_1639 : +STR_1640 : +STR_1641 : +STR_1642 : +STR_1643 : +STR_1644 : +STR_1645 : +STR_1646 : +STR_1647 : +STR_1648 :{SMALLFONT}{OPENQUOTES}Help! Put me down!{ENDQUOTES} +STR_1649 :{SMALLFONT}{OPENQUOTES}I'm running out of cash!{ENDQUOTES} +STR_1650 :{SMALLFONT}{OPENQUOTES}Wow! A new ride being built!{ENDQUOTES} +STR_1651 :{SMALLFONT}{OPENQUOTES}Nice ride! But not as good as the Phoenix...{ENDQUOTES} +STR_1652 :{SMALLFONT}{OPENQUOTES}I'm so excited - It's an Intamin ride!{ENDQUOTES} +STR_1653 :{SMALLFONT}{OPENQUOTES}...and here we are on {STRINGID}!{ENDQUOTES} +STR_1654 :{WINDOW_COLOUR_2}Recent thoughts: +STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land +STR_1656 :{SMALLFONT}{BLACK}Construct bridge or tunnel footpath +STR_1657 :{WINDOW_COLOUR_2}Preferred ride +STR_1658 :{WINDOW_COLOUR_2}intensity: {BLACK}less than {COMMA16} +STR_1659 :{WINDOW_COLOUR_2}intensity: {BLACK}between {COMMA16} and {COMMA16} +STR_1660 :{WINDOW_COLOUR_2}intensity: {BLACK}more than {COMMA16} +STR_1661 :{WINDOW_COLOUR_2}Nausea tolerance: {BLACK}{STRINGID} +STR_1662 :{WINDOW_COLOUR_2}Happiness: +STR_1663 :{WINDOW_COLOUR_2}Nausea: +STR_1664 :{WINDOW_COLOUR_2}Energy: +STR_1665 :{WINDOW_COLOUR_2}Hunger: +STR_1666 :{WINDOW_COLOUR_2}Thirst: +STR_1667 :{WINDOW_COLOUR_2}Bathroom: +STR_1668 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}Unknown +STR_1669 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}{COMMA16}% +STR_1670 :{WINDOW_COLOUR_2}Total customers: {BLACK}{COMMA32} +STR_1671 :{WINDOW_COLOUR_2}Total profit: {BLACK}{CURRENCY2DP} +STR_1672 :Brakes +STR_1673 :Spinning Control Toggle Track +STR_1674 :Brake speed +STR_1675 :{POP16}{VELOCITY} +STR_1676 :{SMALLFONT}{BLACK}Set speed limit for brakes +STR_1677 :{WINDOW_COLOUR_2}Popularity: {BLACK}Unknown +STR_1678 :{WINDOW_COLOUR_2}Popularity: {BLACK}{COMMA16}% +STR_1679 :Helix up (left) +STR_1680 :Helix up (right) +STR_1681 :Helix down (left) +STR_1682 :Helix down (right) +STR_1683 :Base size 2 x 2 +STR_1684 :Base size 4 x 4 +STR_1685 :Base size 2 x 4 +STR_1686 :Base size 5 x 1 +STR_1687 :Water splash +STR_1688 :Base size 4 x 1 +STR_1689 :Block brakes +STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} +STR_1691 :{WINDOW_COLOUR_2} Cost: {BLACK}{CURRENCY} +STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY} +STR_1693 :{SMALLFONT}{BLACK}Guests +STR_1694 :{SMALLFONT}{BLACK}Staff +STR_1695 :{SMALLFONT}{BLACK}Income and costs +STR_1696 :{SMALLFONT}{BLACK}Customer information +STR_1697 :Cannot place these on queue line area +STR_1698 :Can only place these on queue area +STR_1699 :Too many people in game +STR_1700 :Hire new Handyman +STR_1701 :Hire new Mechanic +STR_1702 :Hire new Security Guard +STR_1703 :Hire new Entertainer +STR_1704 :Can't hire new staff... +STR_1705 :{SMALLFONT}{BLACK}Sack this staff member +STR_1706 :{SMALLFONT}{BLACK}Move this person to a new location +STR_1707 :Too many staff in game +STR_1708 :{SMALLFONT}{BLACK}Set patrol area for this staff member +STR_1709 :Sack staff +STR_1710 :Yes +STR_1711 :{WINDOW_COLOUR_1}Are you sure you want to sack {STRINGID}? +STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Sweep footpaths +STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Water gardens +STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Empty litter bins +STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Mow grass +STR_1716 :Invalid name for park +STR_1717 :Can't rename park... +STR_1718 :Park Name +STR_1719 :Enter name for park: +STR_1720 :{SMALLFONT}{BLACK}Name park +STR_1721 :Park closed +STR_1722 :Park open +STR_1723 :Can't open park... +STR_1724 :Can't close park... +STR_1725 :Can't buy land... +STR_1726 :Land not for sale! +STR_1727 :Construction rights not for sale! +STR_1728 :Can't buy construction rights here... +STR_1729 :Land not owned by park! +STR_1730 :{RED}Closed - - +STR_1731 :{WHITE}{STRINGID} - - +STR_1732 :Build +STR_1733 :Mode +STR_1734 :{WINDOW_COLOUR_2}Number of laps: +STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit +STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1737 :{COMMA16} +STR_1738 :Can't change number of laps... +STR_1739 :Race won by guest {INT32} +STR_1740 :Race won by {STRINGID} +STR_1741 :Not yet constructed ! +STR_1742 :{WINDOW_COLOUR_2}Max. people on ride: +STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this ride at one time +STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1745 :{COMMA16} +STR_1746 :Can't change this... +STR_1747 :{WINDOW_COLOUR_2}Time limit: +STR_1748 :{SMALLFONT}{BLACK}Time limit for ride +STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} +STR_1750 :{DURATION} +STR_1751 :Can't change time limit for ride... +STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park +STR_1753 :{SMALLFONT}{BLACK}Show summarised list of guests in park +STR_1754 :{BLACK}{COMMA16} guests +STR_1755 :{BLACK}{COMMA16} guest +STR_1756 :{WINDOW_COLOUR_2}Admission price: +STR_1757 :{WINDOW_COLOUR_2}Reliability: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1758 :{SMALLFONT}{BLACK}Build mode +STR_1759 :{SMALLFONT}{BLACK}Move mode +STR_1760 :{SMALLFONT}{BLACK}Fill-in mode +STR_1761 :{SMALLFONT}{BLACK}Build maze in this direction +STR_1762 :Waterfalls +STR_1763 :Rapids +STR_1764 :Log Bumps +STR_1765 :On-ride photo section +STR_1766 :Reverser turntable +STR_1767 :Spinning tunnel +STR_1768 :Can't change number of swings... +STR_1769 :{WINDOW_COLOUR_2}Number of swings: +STR_1770 :{SMALLFONT}{BLACK}Number of complete swings +STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1772 :{COMMA16} +STR_1773 :Only one on-ride photo section allowed per ride +STR_1774 :Only one cable lift hill allowed per ride +STR_1775 :Off +STR_1776 :On +STR_1777 :{WINDOW_COLOUR_2}Music +STR_1778 :{STRINGID} - - +STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume +STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume +STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume +STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume +STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snowman costume +STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Knight costume +STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume +STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume +STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume +STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume +STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff +STR_1791 :{WINDOW_COLOUR_2}Uniform colour: +STR_1792 :Responding to {STRINGID} breakdown call +STR_1793 :Heading to {STRINGID} for an inspection +STR_1794 :Fixing {STRINGID} +STR_1795 :Answering radio call +STR_1796 :Has broken down and requires fixing +STR_1797 :This option cannot be changed for this ride +STR_1798 :Whirlpool +STR_1799 :{POP16}{POP16}{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1800 :Safety cut-out +STR_1801 :Restraints stuck closed +STR_1802 :Restraints stuck open +STR_1803 :Doors stuck closed +STR_1804 :Doors stuck open +STR_1805 :Vehicle malfunction +STR_1806 :Brakes failure +STR_1807 :Control failure +STR_1808 :{WINDOW_COLOUR_2}Last breakdown: {BLACK}{STRINGID} +STR_1809 :{WINDOW_COLOUR_2}Current breakdown: {OUTLINE}{RED}{STRINGID} +STR_1810 :{WINDOW_COLOUR_2}Carrying: +STR_1811 :Can't build this here... +STR_1812 :{SMALLFONT}{BLACK}{STRINGID} +STR_1813 :Miscellaneous Objects +STR_1814 :Actions +STR_1815 :Thoughts +STR_1816 :{SMALLFONT}{BLACK}Select information type to show in guest list +STR_1817 :({COMMA16}) +STR_1818 :{WINDOW_COLOUR_2}All guests +STR_1819 :{WINDOW_COLOUR_2}All guests (summarised) +STR_1820 :{WINDOW_COLOUR_2}Guests {STRINGID} +STR_1821 :{WINDOW_COLOUR_2}Guests thinking {STRINGID} +STR_1822 :{WINDOW_COLOUR_2}Guests thinking about {POP16}{STRINGID} +STR_1823 :{SMALLFONT}{BLACK}Show guests' thoughts about this ride/attraction +STR_1824 :{SMALLFONT}{BLACK}Show guests on this ride/attraction +STR_1825 :{SMALLFONT}{BLACK}Show guests queuing for this ride/attraction +STR_1826 :Status +STR_1827 :Popularity +STR_1828 :Satisfaction +STR_1829 :Profit +STR_1830 :Queue length +STR_1831 :Queue time +STR_1832 :Reliability +STR_1833 :Down-time +STR_1834 :Guests favourite +STR_1835 :Popularity: Unknown +STR_1836 :Popularity: {COMMA16}% +STR_1837 :Satisfaction: Unknown +STR_1838 :Satisfaction: {COMMA16}% +STR_1839 :Reliability: {COMMA16}% +STR_1840 :Down-time: {COMMA16}% +STR_1841 :Profit: {CURRENCY2DP} per hour +STR_1842 :Favourite of: {COMMA16} guest +STR_1843 :Favourite of: {COMMA16} guests +STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list +STR_1845 :{MONTHYEAR} +STR_1846 :{COMMA16} guests +STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} guests +STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} guests +STR_1849 :{WINDOW_COLOUR_2}Play music +STR_1850 :{SMALLFONT}{BLACK}Select whether music should be played for this ride +STR_1851 :{WINDOW_COLOUR_2}Running cost: {BLACK}{CURRENCY2DP} per hour +STR_1852 :{WINDOW_COLOUR_2}Running cost: {BLACK}Unknown +STR_1853 :{WINDOW_COLOUR_2}Built: {BLACK}This Year +STR_1854 :{WINDOW_COLOUR_2}Built: {BLACK}Last Year +STR_1855 :{WINDOW_COLOUR_2}Built: {BLACK}{COMMA16} Years Ago +STR_1856 :{WINDOW_COLOUR_2}Profit per item sold: {BLACK}{CURRENCY2DP} +STR_1857 :{WINDOW_COLOUR_2}Loss per item sold: {BLACK}{CURRENCY2DP} +STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY2DP} per month +STR_1859 :Handymen +STR_1860 :Mechanics +STR_1861 :Security Guards +STR_1862 :Entertainers +STR_1863 :Handyman +STR_1864 :Mechanic +STR_1865 :Security Guard +STR_1866 :Entertainer +STR_1867 :{BLACK}{COMMA16} {STRINGID} +STR_1868 :Can't change number of rotations... +STR_1869 :{WINDOW_COLOUR_2}Number of rotations: +STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations +STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1872 :{COMMA16} +STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY2DP} per hour +STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour +STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} +STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides +STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides +STR_1878 :{WINDOW_COLOUR_2}Inspection: +STR_1879 :Every 10 minutes +STR_1880 :Every 20 minutes +STR_1881 :Every 30 minutes +STR_1882 :Every 45 minutes +STR_1883 :Every hour +STR_1884 :Every 2 hours +STR_1885 :Never +STR_1886 :Inspecting {STRINGID} +STR_1887 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}{COMMA16} minutes +STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hours +STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride +STR_1891 :No {STRINGID} in park yet! +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : +STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} +STR_1895 :{SMALLFONT}{BLACK}Build new ride/attraction +STR_1896 :{WINDOW_COLOUR_2}Expenditure/Income +STR_1897 :{WINDOW_COLOUR_2}Ride construction +STR_1898 :{WINDOW_COLOUR_2}Ride running costs +STR_1899 :{WINDOW_COLOUR_2}Land purchase +STR_1900 :{WINDOW_COLOUR_2}Landscaping +STR_1901 :{WINDOW_COLOUR_2}Park entrance tickets +STR_1902 :{WINDOW_COLOUR_2}Ride tickets +STR_1903 :{WINDOW_COLOUR_2}Shop sales +STR_1904 :{WINDOW_COLOUR_2}Shop stock +STR_1905 :{WINDOW_COLOUR_2}Food/drink sales +STR_1906 :{WINDOW_COLOUR_2}Food/drink stock +STR_1907 :{WINDOW_COLOUR_2}Staff wages +STR_1908 :{WINDOW_COLOUR_2}Marketing +STR_1909 :{WINDOW_COLOUR_2}Research +STR_1910 :{WINDOW_COLOUR_2}Loan interest +STR_1911 :{BLACK} at {COMMA16}% per year +STR_1912 :{MONTH} +STR_1913 :{BLACK}+{CURRENCY2DP} +STR_1914 :{BLACK}{CURRENCY2DP} +STR_1915 :{RED}{CURRENCY2DP} +STR_1916 :{WINDOW_COLOUR_2}Loan: +STR_1917 :{POP16}{POP16}{POP16}{CURRENCY} +STR_1918 :Can't borrow any more money! +STR_1919 :Not enough cash available! +STR_1920 :Can't pay back loan! +STR_1921 :{SMALLFONT}{BLACK}Start a new game +STR_1922 :{SMALLFONT}{BLACK}Continue playing a saved game +STR_1923 :{SMALLFONT}{BLACK}Show tutorial +STR_1924 :{SMALLFONT}{BLACK}Exit +STR_1925 :Can't place person here... +STR_1926 :{SMALLFONT} +STR_1927 :{YELLOW}{STRINGID} has broken down +STR_1928 :{RED}{STRINGID} has crashed! +STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better +STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this guest - (If tracking is on, guest's movements will be reported in the message area) +STR_1931 :{STRINGID} has joined the queue line for {STRINGID} +STR_1932 :{STRINGID} is on {STRINGID} +STR_1933 :{STRINGID} is in {STRINGID} +STR_1934 :{STRINGID} has left {STRINGID} +STR_1935 :{STRINGID} has left the park +STR_1936 :{STRINGID} has bought {STRINGID} +STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message +STR_1938 :{SMALLFONT}{BLACK}Show view of guest +STR_1939 :{SMALLFONT}{BLACK}Show view of staff member +STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this guest +STR_1941 :{SMALLFONT}{BLACK}Show which rides this guest has been on +STR_1942 :{SMALLFONT}{BLACK}Show financial information about this guest +STR_1943 :{SMALLFONT}{BLACK}Show guest's recent thoughts +STR_1944 :{SMALLFONT}{BLACK}Show items guest is carrying +STR_1945 :{SMALLFONT}{BLACK}Show orders and options for this staff member +STR_1946 :{SMALLFONT}{BLACK}Select costume for this entertainer +STR_1947 :{SMALLFONT}{BLACK}Show areas patrolled by selected staff type, and locate the nearest staff member +STR_1948 :{SMALLFONT}{BLACK}Hire a new staff member of the selected type +STR_1949 :Financial Summary +STR_1950 :Financial Graph +STR_1951 :Park Value Graph +STR_1952 :Profit Graph +STR_1953 :Marketing +STR_1954 :Research Funding +STR_1955 :{WINDOW_COLOUR_2}Number of circuits: +STR_1956 :{SMALLFONT}{BLACK}Number of circuits of track per ride +STR_1957 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1958 :{COMMA16} +STR_1959 :Can't change number of circuits... +STR_1960 :{WINDOW_COLOUR_2}Balloon price: +STR_1961 :{WINDOW_COLOUR_2}Cuddly Toy price: +STR_1962 :{WINDOW_COLOUR_2}Park Map price: +STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_1964 :{WINDOW_COLOUR_2}Umbrella price: +STR_1965 :{WINDOW_COLOUR_2}Drink price: +STR_1966 :{WINDOW_COLOUR_2}Burger price: +STR_1967 :{WINDOW_COLOUR_2}Chips price: +STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: +STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: +STR_1970 :{WINDOW_COLOUR_2} +STR_1971 :{WINDOW_COLOUR_2} +STR_1972 :{WINDOW_COLOUR_2} +STR_1973 :{WINDOW_COLOUR_2}Pizza price: +STR_1974 :{WINDOW_COLOUR_2} +STR_1975 :{WINDOW_COLOUR_2}Popcorn price: +STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: +STR_1977 :{WINDOW_COLOUR_2}Tentacle price: +STR_1978 :{WINDOW_COLOUR_2}Hat price: +STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: +STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: +STR_1981 :{WINDOW_COLOUR_2}Doughnut price: +STR_1982 :{WINDOW_COLOUR_2}Coffee price: +STR_1983 :{WINDOW_COLOUR_2} +STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: +STR_1985 :{WINDOW_COLOUR_2}Lemonade price: +STR_1986 :{WINDOW_COLOUR_2} +STR_1987 :{WINDOW_COLOUR_2} +STR_1988 :Balloon +STR_1989 :Cuddly Toy +STR_1990 :Park Map +STR_1991 :On-Ride Photo +STR_1992 :Umbrella +STR_1993 :Drink +STR_1994 :Burger +STR_1995 :Chips +STR_1996 :Ice Cream +STR_1997 :Candyfloss +STR_1998 :Empty Can +STR_1999 :Rubbish +STR_2000 :Empty Burger Box +STR_2001 :Pizza +STR_2002 :Voucher +STR_2003 :Popcorn +STR_2004 :Hot Dog +STR_2005 :Tentacle +STR_2006 :Hat +STR_2007 :Toffee Apple +STR_2008 :T-Shirt +STR_2009 :Doughnut +STR_2010 :Coffee +STR_2011 :Empty Cup +STR_2012 :Fried Chicken +STR_2013 :Lemonade +STR_2014 :Empty Box +STR_2015 :Empty Bottle +STR_2016 :Balloons +STR_2017 :Cuddly Toys +STR_2018 :Park Maps +STR_2019 :On-Ride Photos +STR_2020 :Umbrellas +STR_2021 :Drinks +STR_2022 :Burgers +STR_2023 :Chips +STR_2024 :Ice Creams +STR_2025 :Candyfloss +STR_2026 :Empty Cans +STR_2027 :Rubbish +STR_2028 :Empty Burger Boxes +STR_2029 :Pizzas +STR_2030 :Vouchers +STR_2031 :Popcorn +STR_2032 :Hot Dogs +STR_2033 :Tentacles +STR_2034 :Hats +STR_2035 :Toffee Apples +STR_2036 :T-Shirts +STR_2037 :Doughnuts +STR_2038 :Coffees +STR_2039 :Empty Cups +STR_2040 :Fried Chicken +STR_2041 :Lemonade +STR_2042 :Empty Boxes +STR_2043 :Empty Bottles +STR_2044 :a Balloon +STR_2045 :a Cuddly Toy +STR_2046 :a Park Map +STR_2047 :an On-Ride Photo +STR_2048 :an Umbrella +STR_2049 :a Drink +STR_2050 :a Burger +STR_2051 :some Chips +STR_2052 :an Ice Cream +STR_2053 :some Candyfloss +STR_2054 :an Empty Can +STR_2055 :some Rubbish +STR_2056 :an Empty Burger Box +STR_2057 :a Pizza +STR_2058 :a Voucher +STR_2059 :some Popcorn +STR_2060 :a Hot Dog +STR_2061 :a Tentacle +STR_2062 :a Hat +STR_2063 :a Toffee Apple +STR_2064 :a T-Shirt +STR_2065 :a Doughnut +STR_2066 :a Coffee +STR_2067 :an Empty Cup +STR_2068 :some Fried Chicken +STR_2069 :some Lemonade +STR_2070 :an Empty Box +STR_2071 :an Empty Bottle +STR_2072 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Balloon +STR_2073 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Cuddly Toy +STR_2074 :Map of {STRINGID} +STR_2075 :On-Ride Photo of {STRINGID} +STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Umbrella +STR_2077 :Drink +STR_2078 :Burger +STR_2079 :Chips +STR_2080 :Ice Cream +STR_2081 :Candyfloss +STR_2082 :Empty Can +STR_2083 :Rubbish +STR_2084 :Empty Burger Box +STR_2085 :Pizza +STR_2086 :Voucher for {STRINGID} +STR_2087 :Popcorn +STR_2088 :Hot Dog +STR_2089 :Tentacle +STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hat +STR_2091 :Toffee Apple +STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-Shirt +STR_2093 :Doughnut +STR_2094 :Coffee +STR_2095 :Empty Cup +STR_2096 :Fried Chicken +STR_2097 :Lemonade +STR_2098 :Empty Box +STR_2099 :Empty Bottle +STR_2100 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2101 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2102 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2103 :{WINDOW_COLOUR_2}Pretzel price: +STR_2104 :{WINDOW_COLOUR_2}Hot Chocolate price: +STR_2105 :{WINDOW_COLOUR_2}Iced Tea price: +STR_2106 :{WINDOW_COLOUR_2}Funnel Cake price: +STR_2107 :{WINDOW_COLOUR_2}Sunglasses price: +STR_2108 :{WINDOW_COLOUR_2}Beef Noodles price: +STR_2109 :{WINDOW_COLOUR_2}Fried Rice Noodles price: +STR_2110 :{WINDOW_COLOUR_2}Wonton Soup price: +STR_2111 :{WINDOW_COLOUR_2}Meatball Soup price: +STR_2112 :{WINDOW_COLOUR_2}Fruit Juice price: +STR_2113 :{WINDOW_COLOUR_2}Soybean Milk price: +STR_2114 :{WINDOW_COLOUR_2}Sujongkwa price: +STR_2115 :{WINDOW_COLOUR_2}Sub Sandwich price: +STR_2116 :{WINDOW_COLOUR_2}Cookie price: +STR_2117 :{WINDOW_COLOUR_2} +STR_2118 :{WINDOW_COLOUR_2} +STR_2119 :{WINDOW_COLOUR_2} +STR_2120 :{WINDOW_COLOUR_2}Roast Sausage price: +STR_2121 :{WINDOW_COLOUR_2} +STR_2122 :On-Ride Photo +STR_2123 :On-Ride Photo +STR_2124 :On-Ride Photo +STR_2125 :Pretzel +STR_2126 :Hot Chocolate +STR_2127 :Iced Tea +STR_2128 :Funnel Cake +STR_2129 :Sunglasses +STR_2130 :Beef Noodles +STR_2131 :Fried Rice Noodles +STR_2132 :Wonton Soup +STR_2133 :Meatball Soup +STR_2134 :Fruit Juice +STR_2135 :Soybean Milk +STR_2136 :Sujongkwa +STR_2137 :Sub Sandwich +STR_2138 :Cookie +STR_2139 :Empty Bowl +STR_2140 :Empty Drink Carton +STR_2141 :Empty Juice Cup +STR_2142 :Roast Sausage +STR_2143 :Empty Bowl +STR_2144 :On-Ride Photos +STR_2145 :On-Ride Photos +STR_2146 :On-Ride Photos +STR_2147 :Pretzels +STR_2148 :Hot Chocolates +STR_2149 :Iced Teas +STR_2150 :Funnel Cakes +STR_2151 :Sunglasses +STR_2152 :Beef Noodles +STR_2153 :Fried Rice Noodles +STR_2154 :Wonton Soups +STR_2155 :Meatball Soups +STR_2156 :Fruit Juices +STR_2157 :Soybean Milks +STR_2158 :Sujongkwa +STR_2159 :Sub Sandwiches +STR_2160 :Cookies +STR_2161 :Empty Bowls +STR_2162 :Empty Drink Cartons +STR_2163 :Empty Juice cups +STR_2164 :Roast Sausages +STR_2165 :Empty Bowls +STR_2166 :an On-Ride Photo +STR_2167 :an On-Ride Photo +STR_2168 :an On-Ride Photo +STR_2169 :a Pretzel +STR_2170 :a Hot Chocolate +STR_2171 :an Iced Tea +STR_2172 :a Funnel Cake +STR_2173 :a pair of Sunglasses +STR_2174 :some Beef Noodles +STR_2175 :some Fried Rice Noodles +STR_2176 :some Wonton Soup +STR_2177 :some Meatball Soup +STR_2178 :a Fruit Juice +STR_2179 :some Soybean Milk +STR_2180 :some Sujongkwa +STR_2181 :a Sub Sandwich +STR_2182 :a Cookie +STR_2183 :an Empty Bowl +STR_2184 :an Empty Drink Carton +STR_2185 :an Empty Juice Cup +STR_2186 :a Roast Sausage +STR_2187 :an Empty Bowl +STR_2188 :On-Ride Photo of {STRINGID} +STR_2189 :On-Ride Photo of {STRINGID} +STR_2190 :On-Ride Photo of {STRINGID} +STR_2191 :Pretzel +STR_2192 :Hot Chocolate +STR_2193 :Iced Tea +STR_2194 :Funnel Cake +STR_2195 :Sunglasses +STR_2196 :Beef Noodles +STR_2197 :Fried Rice Noodles +STR_2198 :Wonton Soup +STR_2199 :Meatball Soup +STR_2200 :Fruit Juice +STR_2201 :Soybean Milk +STR_2202 :Sujongkwa +STR_2203 :Sub Sandwich +STR_2204 :Cookie +STR_2205 :Empty Bowl +STR_2206 :Empty Drink Carton +STR_2207 :Empty Juice Cup +STR_2208 :Roast Sausage +STR_2209 :Empty Bowl +STR_2210 :{SMALLFONT}{BLACK}Show list of handymen in park +STR_2211 :{SMALLFONT}{BLACK}Show list of mechanics in park +STR_2212 :{SMALLFONT}{BLACK}Show list of security guards in park +STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park +STR_2214 :Construction not possible while game is paused! +STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) +STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled +STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} +STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} +STR_2221 :{SMALLFONT}{BLACK}Park Rating: {COMMA16} +STR_2222 :{SMALLFONT}{BLACK}{STRINGID} +STR_2223 :{WINDOW_COLOUR_2}Guests in park: {BLACK}{COMMA16} +STR_2224 :{WINDOW_COLOUR_2}Cash: {BLACK}{CURRENCY2DP} +STR_2225 :{WINDOW_COLOUR_2}Cash: {RED}{CURRENCY2DP} +STR_2226 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} +STR_2227 :{WINDOW_COLOUR_2}Company value: {BLACK}{CURRENCY} +STR_2228 :{WINDOW_COLOUR_2}Last month's profit from food/drink and{NEWLINE}merchandise sales: {BLACK}{CURRENCY} +STR_2229 :Slope up to vertical +STR_2230 :Vertical track +STR_2231 :Holding brake for drop +STR_2232 :Cable lift hill +STR_2233 :{SMALLFONT}{BLACK}Park information +STR_2234 :Recent Messages +STR_2235 :{SMALLFONT}{STRINGID} {STRINGID} +STR_2236 :January +STR_2237 :February +STR_2238 :March +STR_2239 :April +STR_2240 :May +STR_2241 :June +STR_2242 :July +STR_2243 :August +STR_2244 :September +STR_2245 :October +STR_2246 :November +STR_2247 :December +STR_2248 :Can't demolish ride/attraction... +STR_2249 :{BABYBLUE}New ride/attraction now available:{NEWLINE}{STRINGID} +STR_2250 :{BABYBLUE}New scenery/themeing now available:{NEWLINE}{STRINGID} +STR_2251 :Can only be built on paths! +STR_2252 :Can only be built across paths! +STR_2253 :Transport Rides +STR_2254 :Gentle Rides +STR_2255 :Roller Coasters +STR_2256 :Thrill Rides +STR_2257 :Water Rides +STR_2258 :Shops & Stalls +STR_2259 :Scenery & Themeing +STR_2260 :No funding +STR_2261 :Minimum funding +STR_2262 :Normal funding +STR_2263 :Maximum funding +STR_2264 :Research funding +STR_2265 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} per month +STR_2266 :Research priorities +STR_2267 :Currently in development +STR_2268 :Last development +STR_2269 :{WINDOW_COLOUR_2}Type: {BLACK}{STRINGID} +STR_2270 :{WINDOW_COLOUR_2}Progress: {BLACK}{STRINGID} +STR_2271 :{WINDOW_COLOUR_2}Expected: {BLACK}{STRINGID} +STR_2272 :{WINDOW_COLOUR_2}Ride/attraction:{NEWLINE}{BLACK}{STRINGID} +STR_2273 :{WINDOW_COLOUR_2}Scenery/themeing:{NEWLINE}{BLACK}{STRINGID} +STR_2274 :{SMALLFONT}{BLACK}Show details of this invention or development +STR_2275 :{SMALLFONT}{BLACK}Show funding and options for research & development +STR_2276 :{SMALLFONT}{BLACK}Show research & development status +STR_2277 :Unknown +STR_2278 :Transport Ride +STR_2279 :Gentle Ride +STR_2280 :Roller Coaster +STR_2281 :Thrill Ride +STR_2282 :Water Ride +STR_2283 :Shop/Stall +STR_2284 :Scenery/Themeing +STR_2285 :Initial research +STR_2286 :Designing +STR_2287 :Completing design +STR_2288 :Unknown +STR_2289 :{STRINGID} {STRINGID} +STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} +STR_2291 :Select scenario for new game +STR_2292 :{WINDOW_COLOUR_2}Rides been on: +STR_2293 :{BLACK} Nothing +STR_2294 :{SMALLFONT}{BLACK}Change base land style +STR_2295 :{SMALLFONT}{BLACK}Change vertical edges of land +STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} paid to enter park +STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} ride +STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} rides +STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} item of food +STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} items of food +STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drink +STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drinks +STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenir +STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenirs +STR_2305 :Track design files +STR_2306 :Save track design +STR_2307 :Select {STRINGID} design +STR_2308 :{STRINGID} Track Designs +STR_2309 :Install New Track Design +STR_2310 :Build custom design +STR_2311 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} (approx.) +STR_2312 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} (approx.) +STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) +STR_2314 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID} +STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} +STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : +STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} +STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} +STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} +STR_2324 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}sq.ft. +STR_2325 :{SMALLFONT}{BLACK}Buy land to extend park +STR_2326 :{SMALLFONT}{BLACK}Buy construction rights to allow construction above or below land outside the park +STR_2327 :Options +STR_2328 :{WINDOW_COLOUR_2}Currency: +STR_2329 :{WINDOW_COLOUR_2}Distance and Speed: +STR_2330 :{WINDOW_COLOUR_2}Temperature: +STR_2331 :{WINDOW_COLOUR_2}Height Labels: +STR_2332 :Units +STR_2333 :Sound +STR_2334 :Pounds ({POUND}) +STR_2335 :Dollars ($) +STR_2336 :Franc (F) +STR_2337 :Deutschmark (DM) +STR_2338 :Yen ({YEN}) +STR_2339 :Peseta (Pts) +STR_2340 :Lira (L) +STR_2341 :Guilders (fl.) +STR_2342 :Krona (kr) +STR_2343 :Euros ({EURO}) +STR_2344 :Imperial +STR_2345 :Metric +STR_2346 :Display +STR_2347 :{RED}{STRINGID} has drowned! +STR_2348 :{SMALLFONT}{BLACK}Show statistics for this staff member +STR_2349 :{WINDOW_COLOUR_2}Wages: {BLACK}{CURRENCY} per month +STR_2350 :{WINDOW_COLOUR_2}Employed: {BLACK}{MONTHYEAR} +STR_2351 :{WINDOW_COLOUR_2}Lawns mown: {BLACK}{COMMA16} +STR_2352 :{WINDOW_COLOUR_2}Gardens watered: {BLACK}{COMMA16} +STR_2353 :{WINDOW_COLOUR_2}Litter swept: {BLACK}{COMMA16} +STR_2354 :{WINDOW_COLOUR_2}Bins emptied: {BLACK}{COMMA16} +STR_2355 :{WINDOW_COLOUR_2}Rides fixed: {BLACK}{COMMA16} +STR_2356 :{WINDOW_COLOUR_2}Rides inspected: {BLACK}{COMMA16} +STR_2357 :House +STR_2358 :Units +STR_2359 :Real Values +STR_2360 :{WINDOW_COLOUR_2}Display Resolution: +STR_2361 :Landscape Smoothing +STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off +STR_2363 :Gridlines on Landscape +STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off +STR_2365 :The bank refuses to increase your loan! +STR_2366 :Celsius ({DEGREE}C) +STR_2367 :Fahrenheit (F) +STR_2368 :None +STR_2369 :Low +STR_2370 :Average +STR_2371 :High +STR_2372 :Low +STR_2373 :Medium +STR_2374 :High +STR_2375 :Very high +STR_2376 :Extreme +STR_2377 :Ultra-Extreme +STR_2378 :{SMALLFONT}{BLACK}Adjust smaller area of land +STR_2379 :{SMALLFONT}{BLACK}Adjust larger area of land +STR_2380 :{SMALLFONT}{BLACK}Adjust smaller area of water +STR_2381 :{SMALLFONT}{BLACK}Adjust larger area of water +STR_2382 :Land +STR_2383 :Water +STR_2384 :{WINDOW_COLOUR_2}Your objective: +STR_2385 :{BLACK}None +STR_2386 :{BLACK}To have at least {COMMA16} guests in your park at the end of {MONTHYEAR}, with a park rating of at least 600 +STR_2387 :{BLACK}To achieve a park value of at least {POP16}{POP16}{CURRENCY} at the end of {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} +STR_2388 :{BLACK}Have Fun! +STR_2389 :{BLACK}Build the best {STRINGID} you can! +STR_2390 :{BLACK}To have 10 different types of roller coasters operating in your park, each with an excitement value of at least 6.00 +STR_2391 :{BLACK}To have at least {COMMA16} guests in your park. You must not let the park rating drop below 700 at any time! +STR_2392 :{BLACK}To achieve a monthly income from ride tickets of at least {POP16}{POP16}{CURRENCY} +STR_2393 :{BLACK}To have 10 different types of roller coasters operating in your park, each with a minimum length of {LENGTH}, and an excitement rating of at least 7.00 +STR_2394 :{BLACK}To finish building all 5 of the partially built roller coasters in this park, designing them to achieve excitement ratings of at least {POP16}{POP16}{COMMA2DP32} each +STR_2395 :{BLACK}To repay your loan and achieve a park value of at least {POP16}{POP16}{CURRENCY} +STR_2396 :{BLACK}To achieve a monthly profit from food, drink and merchandise sales of at least {POP16}{POP16}{CURRENCY} +STR_2397 :None +STR_2398 :Number of guests at a given date +STR_2399 :Park value at a given date +STR_2400 :Have fun +STR_2401 :Build the best ride you can +STR_2402 :Build 10 roller coasters +STR_2403 :Number of guests in park +STR_2404 :Monthly income from ride tickets +STR_2405 :Build 10 roller coasters of a given length +STR_2406 :Finish building 5 roller coasters +STR_2407 :Repay loan and achieve a given park value +STR_2408 :Monthly profit from food/merchandise +STR_2409 :{WINDOW_COLOUR_2}Marketing campaigns in operation +STR_2410 :{BLACK}None +STR_2411 :{WINDOW_COLOUR_2}Marketing campaigns available +STR_2412 :{SMALLFONT}{BLACK}Start this marketing campaign +STR_2413 :{BLACK}({CURRENCY2DP} per week) +STR_2414 :(Not Selected) +STR_2415 :{WINDOW_COLOUR_2}Ride: +STR_2416 :{WINDOW_COLOUR_2}Item: +STR_2417 :{WINDOW_COLOUR_2}Length of time: +STR_2418 :Free entry to {STRINGID} +STR_2419 :Free ride on {STRINGID} +STR_2420 :Half-price entry to {STRINGID} +STR_2421 :Free {STRINGID} +STR_2422 :Advertising campaign for {STRINGID} +STR_2423 :Advertising campaign for {STRINGID} +STR_2424 :{WINDOW_COLOUR_2}Vouchers for free entry to the park +STR_2425 :{WINDOW_COLOUR_2}Vouchers for free rides on a particular ride +STR_2426 :{WINDOW_COLOUR_2}Vouchers for half-price entry to the park +STR_2427 :{WINDOW_COLOUR_2}Vouchers for free food or drink +STR_2428 :{WINDOW_COLOUR_2}Advertising campaign for the park +STR_2429 :{WINDOW_COLOUR_2}Advertising campaign for a particular ride +STR_2430 :{BLACK}Vouchers for free entry to {STRINGID} +STR_2431 :{BLACK}Vouchers for free ride on {STRINGID} +STR_2432 :{BLACK}Vouchers for half-price entry to {STRINGID} +STR_2433 :{BLACK}Vouchers for free {STRINGID} +STR_2434 :{BLACK}Advertising campaign for {STRINGID} +STR_2435 :{BLACK}Advertising campaign for {STRINGID} +STR_2436 :1 week +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : +STR_2442 : +STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} +STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} +STR_2445 :Start this marketing campaign +STR_2446 :{YELLOW}Your marketing campaign for free entry to the park has finished +STR_2447 :{YELLOW}Your marketing campaign for free rides on {STRINGID} has finished +STR_2448 :{YELLOW}Your marketing campaign for half-price entry to the park has finished +STR_2449 :{YELLOW}Your marketing campaign for free {STRINGID} has finished +STR_2450 :{YELLOW}Your advertising campaign for the park has finished +STR_2451 :{YELLOW}Your advertising campaign for {STRINGID} has finished +STR_2452 :{WINDOW_COLOUR_2}Cash (less loan): {BLACK}{CURRENCY2DP} +STR_2453 :{WINDOW_COLOUR_2}Cash (less loan): {RED}{CURRENCY2DP} +STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} - +STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} - +STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} - +STR_2457 :{SMALLFONT}{BLACK}Show financial accounts +STR_2458 :{SMALLFONT}{BLACK}Show graph of cash (less loan) over time +STR_2459 :{SMALLFONT}{BLACK}Show graph of park value over time +STR_2460 :{SMALLFONT}{BLACK}Show graph of weekly profit +STR_2461 :{SMALLFONT}{BLACK}Show marketing campaigns +STR_2462 :{SMALLFONT}{BLACK}Show view of park entrance +STR_2463 :{SMALLFONT}{BLACK}Show graph of park ratings over time +STR_2464 :{SMALLFONT}{BLACK}Show graph of guest numbers over time +STR_2465 :{SMALLFONT}{BLACK}Show park entrance price and information +STR_2466 :{SMALLFONT}{BLACK}Show park statistics +STR_2467 :{SMALLFONT}{BLACK}Show objectives for this game +STR_2468 :{SMALLFONT}{BLACK}Show recent awards this park has received +STR_2469 :{SMALLFONT}{BLACK}Select level of research & development +STR_2470 :{SMALLFONT}{BLACK}Research new transport rides +STR_2471 :{SMALLFONT}{BLACK}Research new gentle rides +STR_2472 :{SMALLFONT}{BLACK}Research new roller coasters +STR_2473 :{SMALLFONT}{BLACK}Research new thrill rides +STR_2474 :{SMALLFONT}{BLACK}Research new water rides +STR_2475 :{SMALLFONT}{BLACK}Research new shops and stalls +STR_2476 :{SMALLFONT}{BLACK}Research new scenery and themeing +STR_2477 :{SMALLFONT}{BLACK}Select operating mode for this ride/attraction +STR_2478 :{SMALLFONT}{BLACK}Show graph of velocity against time +STR_2479 :{SMALLFONT}{BLACK}Show graph of altitude against time +STR_2480 :{SMALLFONT}{BLACK}Show graph of vertical acceleration against time +STR_2481 :{SMALLFONT}{BLACK}Show graph of lateral acceleration against time +STR_2482 :{SMALLFONT}{BLACK}Profit: {CURRENCY} per week, Park Value: {CURRENCY} +STR_2483 :{WINDOW_COLOUR_2}Weekly profit: {BLACK}+{CURRENCY2DP} +STR_2484 :{WINDOW_COLOUR_2}Weekly profit: {RED}{CURRENCY2DP} +STR_2485 :Controls +STR_2486 :General +STR_2487 :Show 'real' names of guests +STR_2488 :{SMALLFONT}{BLACK}Toggle between showing 'real' names of guests and guest numbers +STR_2489 :Shortcut keys... +STR_2490 :Keyboard shortcuts +STR_2491 :Reset keys +STR_2492 :{SMALLFONT}{BLACK}Set all keyboard shortcuts back to default settings +STR_2493 :Close top-most window +STR_2494 :Close all floating windows +STR_2495 :Cancel construction mode +STR_2496 :Pause game +STR_2497 :Zoom view out +STR_2498 :Zoom view in +STR_2499 :Rotate view clockwise +STR_2500 :Rotate construction object +STR_2501 :Underground view toggle +STR_2502 :Remove base land toggle +STR_2503 :Remove vertical land toggle +STR_2504 :See-through rides toggle +STR_2505 :See-through scenery toggle +STR_2506 :Invisible supports toggle +STR_2507 :Invisible people toggle +STR_2508 :Height marks on land toggle +STR_2509 :Height marks on ride tracks toggle +STR_2510 :Height marks on paths toggle +STR_2511 :Adjust land +STR_2512 :Adjust water +STR_2513 :Build scenery +STR_2514 :Build paths +STR_2515 :Build new ride +STR_2516 :Show financial information +STR_2517 :Show research information +STR_2518 :Show rides list +STR_2519 :Show park information +STR_2520 :Show guest list +STR_2521 :Show staff list +STR_2522 :Show recent messages +STR_2523 :Show map +STR_2524 :Screenshot +### The following need to be reordered to match SDL_keycode layout. +STR_2525 :??? +STR_2526 :??? +STR_2527 :??? +STR_2528 :??? +STR_2529 :??? +STR_2530 :??? +STR_2531 :??? +STR_2532 :??? +STR_2533 :Backspace +STR_2534 :Tab +STR_2535 :??? +STR_2536 :??? +STR_2537 :Clear +STR_2538 :Return +STR_2539 :??? +STR_2540 :??? +STR_2541 :??? +STR_2542 :??? +STR_2543 :Alt/Menu +STR_2544 :Pause +STR_2545 :Caps +STR_2546 :??? +STR_2547 :??? +STR_2548 :??? +STR_2549 :??? +STR_2550 :??? +STR_2551 :??? +STR_2552 :Escape +STR_2553 :??? +STR_2554 :??? +STR_2555 :??? +STR_2556 :??? +STR_2557 :Spacebar +STR_2558 :PgUp +STR_2559 :PgDn +STR_2560 :End +STR_2561 :Home +STR_2562 :Left +STR_2563 :Up +STR_2564 :Right +STR_2565 :Down +STR_2566 :Select +STR_2567 :Print +STR_2568 :Execute +STR_2569 :Snapshot +STR_2570 :Insert +STR_2571 :Delete +STR_2572 :Help +STR_2573 :0 +STR_2574 :1 +STR_2575 :2 +STR_2576 :3 +STR_2577 :4 +STR_2578 :5 +STR_2579 :6 +STR_2580 :7 +STR_2581 :8 +STR_2582 :9 +STR_2583 :??? +STR_2584 :??? +STR_2585 :??? +STR_2586 :??? +STR_2587 :??? +STR_2588 :??? +STR_2589 :??? +STR_2590 :A +STR_2591 :B +STR_2592 :C +STR_2593 :D +STR_2594 :E +STR_2595 :F +STR_2596 :G +STR_2597 :H +STR_2598 :I +STR_2599 :J +STR_2600 :K +STR_2601 :L +STR_2602 :M +STR_2603 :N +STR_2604 :O +STR_2605 :P +STR_2606 :Q +STR_2607 :R +STR_2608 :S +STR_2609 :T +STR_2610 :U +STR_2611 :V +STR_2612 :W +STR_2613 :X +STR_2614 :Y +STR_2615 :Z +STR_2616 :??? +STR_2617 :??? +STR_2618 :Menu +STR_2619 :??? +STR_2620 :??? +STR_2621 :NumPad 0 +STR_2622 :NumPad 1 +STR_2623 :NumPad 2 +STR_2624 :NumPad 3 +STR_2625 :NumPad 4 +STR_2626 :NumPad 5 +STR_2627 :NumPad 6 +STR_2628 :NumPad 7 +STR_2629 :NumPad 8 +STR_2630 :NumPad 9 +STR_2631 :NumPad * +STR_2632 :NumPad + +STR_2633 :??? +STR_2634 :NumPad - +STR_2635 :NumPad . +STR_2636 :NumPad / +STR_2637 :F1 +STR_2638 :F2 +STR_2639 :F3 +STR_2640 :F4 +STR_2641 :F5 +STR_2642 :F6 +STR_2643 :F7 +STR_2644 :F8 +STR_2645 :F9 +STR_2646 :F10 +STR_2647 :F11 +STR_2648 :F12 +STR_2649 :F13 +STR_2650 :F14 +STR_2651 :F15 +STR_2652 :F16 +STR_2653 :F17 +STR_2654 :F18 +STR_2655 :F19 +STR_2656 :F20 +STR_2657 :F21 +STR_2658 :F22 +STR_2659 :F23 +STR_2660 :F24 +STR_2661 :??? +STR_2662 :??? +STR_2663 :??? +STR_2664 :??? +STR_2665 :??? +STR_2666 :??? +STR_2667 :??? +STR_2668 :??? +STR_2669 :NumLock +STR_2670 :Scroll +STR_2671 :??? +STR_2672 :??? +STR_2673 :??? +STR_2674 :??? +STR_2675 :??? +STR_2676 :??? +STR_2677 :??? +STR_2678 :??? +STR_2679 :??? +STR_2680 :All research complete +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2682 : +STR_2683 : +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive +STR_2685 :Simplex Noise Parameters +STR_2686 :{WINDOW_COLOUR_2}Low: +STR_2687 :{WINDOW_COLOUR_2}High: +STR_2688 :{WINDOW_COLOUR_2}Base Frequency: +STR_2689 :{WINDOW_COLOUR_2}Octaves: +STR_2690 :Map Generation +STR_2691 :{WINDOW_COLOUR_2}Base height: +STR_2692 :{WINDOW_COLOUR_2}Water level: +STR_2693 :{WINDOW_COLOUR_2}Terrain: +STR_2694 :Generate +STR_2695 :Random terrain +STR_2696 :Place trees +STR_2697 :??? +STR_2698 :??? +STR_2699 :??? +STR_2700 :Autosave frequency: +STR_2701 :Every week +STR_2702 :Every 2 weeks +STR_2703 :Every month +STR_2704 :Every 4 months +STR_2705 :Every year +STR_2706 :Never +STR_2707 :Open new window +STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? +STR_2709 :Overwrite +STR_2710 :Type the name of the file. +STR_2711 :; +STR_2712 := +STR_2713 :, +STR_2714 :- +STR_2715 :. +STR_2716 :/ +STR_2717 :' +STR_2718 :(up) +STR_2719 :(new file) +STR_2720 :{UINT16}sec +STR_2721 :{UINT16}secs +STR_2722 :{UINT16}min:{UINT16}sec +STR_2723 :{UINT16}min:{UINT16}secs +STR_2724 :{UINT16}mins:{UINT16}sec +STR_2725 :{UINT16}mins:{UINT16}secs +STR_2726 :{UINT16}min +STR_2727 :{UINT16}mins +STR_2728 :{UINT16}hour:{UINT16}min +STR_2729 :{UINT16}hour:{UINT16}mins +STR_2730 :{UINT16}hours:{UINT16}min +STR_2731 :{UINT16}hours:{UINT16}mins +STR_2732 :{COMMA16}ft +STR_2733 :{COMMA16}m +STR_2734 :{COMMA16}mph +STR_2735 :{COMMA16}km/h +STR_2736 :{MONTH}, Year {COMMA16} +STR_2737 :{STRINGID} {MONTH}, Year {COMMA16} +STR_2738 :Title screen music: +STR_2739 :None +STR_2740 :RollerCoaster Tycoon 1 +STR_2741 :RollerCoaster Tycoon 2 +STR_2742 :css50.dat not found +STR_2743 :Copy data\css17.dat from your RCT1 installation to data\css50.dat in your RCT2 installation. +STR_2744 :[ +STR_2745 :\ +STR_2746 :] +STR_2747 :{ENDQUOTES} +STR_2748 :Bar +STR_2749 :My new scenario +# New strings used in the cheats window previously these were ??? +STR_2750 :Move all items to top +STR_2751 :Move all items to bottom +STR_2752 :Clear grass +STR_2753 :Mowed grass +STR_2754 :Water plants +STR_2755 :Fix vandalism +STR_2756 :Remove litter +STR_2757 :Force Sun +STR_2758 :Force Thunder +STR_2759 :Zero Clearance +STR_2760 :+{CURRENCY} +STR_2761 : +STR_2762 : +STR_2763 :??? +STR_2764 : +STR_2765 :Large Tram +STR_2766 :Win scenario +STR_2767 :Freeze Climate +STR_2768 :Unfreeze Climate +STR_2769 :Open Park +STR_2770 :Close Park +STR_2771 :Slower Gamespeed +STR_2772 :Faster Gamespeed +STR_2773 :Windowed +STR_2774 :Fullscreen +STR_2775 :Fullscreen (desktop) +STR_2776 :Language: +STR_2777 :{MOVE_X}{SMALLFONT}{STRING} +STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} +STR_2779 :Viewport #{COMMA16} +STR_2780 :Extra viewport +# End of new strings +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} +STR_2782 :SHIFT + +STR_2783 :CTRL + +STR_2784 :Change keyboard shortcut +STR_2785 :{WINDOW_COLOUR_2}Press new shortcut key for:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} +STR_2786 :{SMALLFONT}{BLACK}Click on shortcut description to select new key +STR_2787 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} +STR_2788 :{WINDOW_COLOUR_2}Congratulations !{NEWLINE}{BLACK}You achieved your objective with a company value of {CURRENCY} ! +STR_2789 :{WINDOW_COLOUR_2}You have failed your objective ! +STR_2790 :Enter name into scenario chart +STR_2791 :Enter name +STR_2792 :Please enter your name for the scenario chart: +STR_2793 :{SMALLFONT}(Completed by {STRINGID}) +STR_2794 :{WINDOW_COLOUR_2}Completed by: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} with a company value of: {BLACK}{CURRENCY} +STR_2795 :Sort +STR_2796 :{SMALLFONT}{BLACK}Sort the ride list into order using the information type displayed +STR_2797 :Scroll view when pointer at screen edge +STR_2798 :{SMALLFONT}{BLACK}Select whether to scroll the view when the mouse pointer is at the screen edge +STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments +STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32} +STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP} +STR_2802 :Map +STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map +STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map +STR_2805 :{SMALLFONT}{BLACK}Show map of park +STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organising them better +STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food +STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks +STR_2811 :{RED}Guests are complaining because they can't find the toilets in your park +STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around +STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests +STR_2814 :{WINDOW_COLOUR_2}Most untidy park award +STR_2815 :{WINDOW_COLOUR_2}Tidiest park award +STR_2816 :{WINDOW_COLOUR_2}Award for the park with the best roller coasters +STR_2817 :{WINDOW_COLOUR_2}Best value park award +STR_2818 :{WINDOW_COLOUR_2}Most beautiful park award +STR_2819 :{WINDOW_COLOUR_2}Worst value park award +STR_2820 :{WINDOW_COLOUR_2}Safest park award +STR_2821 :{WINDOW_COLOUR_2}Best staff award +STR_2822 :{WINDOW_COLOUR_2}Best park food award +STR_2823 :{WINDOW_COLOUR_2}Worst park food award +STR_2824 :{WINDOW_COLOUR_2}Best park toilets award +STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award +STR_2826 :{WINDOW_COLOUR_2}Best water rides award +STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award +STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride colour schemes award +STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award +STR_2830 :{WINDOW_COLOUR_2}Best gentle ride award +STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'! +STR_2832 :{TOPAZ}Your park has received an award for being 'The tidiest park in the country'! +STR_2833 :{TOPAZ}Your park has received an award for being 'The park with the best roller coasters'! +STR_2834 :{TOPAZ}Your park has received an award for being 'The best value park in the country'! +STR_2835 :{TOPAZ}Your park has received an award for being 'The most beautiful park in the country'! +STR_2836 :{TOPAZ}Your park has received an award for being 'The worst value park in the country'! +STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park in the country'! +STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! +STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! +STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! +STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best toilet facilities in the country'! +STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! +STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water rides in the country'! +STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed rides'! +STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of colour schemes'! +STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! +STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle rides'! +STR_2848 :{WINDOW_COLOUR_2}No recent awards +STR_2849 :New scenario installed successfully +STR_2850 :New track design installed successfully +STR_2851 :Scenario already installed +STR_2852 :Track design already installed +STR_2853 :Forbidden by the local authority! +STR_2854 :{RED}Guests can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance +STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the ride exit +STR_2856 :{WINDOW_COLOUR_2}Tutorial +STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) +STR_2858 :Can't start marketing campaign... +STR_2859 :Another instance of OpenRCT2 is already running +STR_2860 :Infogrames Interactive credits... +STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. +STR_2862 :Music acknowledgements... +STR_2863 :Music acknowledgements +STR_2864 :{WINDOW_COLOUR_2}March - Children of the Regiment: (Fucik) non copyright +STR_2865 :{WINDOW_COLOUR_2}Heyken's Serenade: (J.Heyken) British Standard Music Coy; GEMA, BRITICO +STR_2866 :{WINDOW_COLOUR_2}In Continental Mood: (Composer unknown) Copyright Control +STR_2867 :{WINDOW_COLOUR_2}Wedding Journey: (Traditional) +STR_2868 :{WINDOW_COLOUR_2}Tales from the Vienna Woods: (Johann Strauss) non copyright +STR_2869 :{WINDOW_COLOUR_2}Slavonic Dance: (Traditional) +STR_2870 :{WINDOW_COLOUR_2}Das Alpenhorn: (Traditional) +STR_2871 :{WINDOW_COLOUR_2}The Blond Sailor: (Traditional) +STR_2872 :{WINDOW_COLOUR_2}Overture - Poet and Peasant: (Suppe) non copyright +STR_2873 :{WINDOW_COLOUR_2}Waltz Medley: (Johann Strauss) non copyright +STR_2874 :{WINDOW_COLOUR_2}Bella Bella Bimba: (Traditional) +STR_2875 :{WINDOW_COLOUR_2}Original recordings (P) 1976 C.J.Mears Organization, used with consent +STR_2876 :{WINDOW_COLOUR_2}RollerCoaster Tycoon 2 Title Music: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2877 :{WINDOW_COLOUR_2}Dodgems Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2878 :{WINDOW_COLOUR_2}Mid Summer's Heat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2879 :{WINDOW_COLOUR_2}Pharaoh's Tomb: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2880 :{WINDOW_COLOUR_2}Caesar's March: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2881 :{WINDOW_COLOUR_2}Drifting To Heaven: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2882 :{WINDOW_COLOUR_2}Invaders: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2883 :{WINDOW_COLOUR_2}Eternal Toybox: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2884 :{WINDOW_COLOUR_2}Jungle Juice: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2885 :{WINDOW_COLOUR_2}Ninja's Noodles: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2886 :{WINDOW_COLOUR_2}Voyage to Andromeda: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2887 :{WINDOW_COLOUR_2}Brimble's Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2888 :{WINDOW_COLOUR_2}Atlantis: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2889 :{WINDOW_COLOUR_2}Wild West Kid: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2890 :{WINDOW_COLOUR_2}Vampire's Lair: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2891 :{WINDOW_COLOUR_2}Blockbuster: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2892 :{WINDOW_COLOUR_2}Airtime Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2893 :{WINDOW_COLOUR_2}Searchlight Rag: (Scott Joplin/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2894 :{WINDOW_COLOUR_2}Flight of Fantasy: (Steve Blenkinsopp) copyright {COPYRIGHT} Chris Sawyer +STR_2895 :{WINDOW_COLOUR_2}Big Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2896 :{WINDOW_COLOUR_2}Hypothermia: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2897 :{WINDOW_COLOUR_2}Last Sleigh Ride: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2898 :{WINDOW_COLOUR_2}Pipes of Glencairn: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2899 :{WINDOW_COLOUR_2}Traffic Jam: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2900 :{WINDOW_COLOUR_2} +STR_2901 :{WINDOW_COLOUR_2}(Samples courtesy of Spectrasonics {ENDQUOTES}Liquid Grooves{ENDQUOTES}) +STR_2902 :{WINDOW_COLOUR_2}Toccata: (C.M.Widor, played by Peter James Adcock) recording {COPYRIGHT} Chris Sawyer +STR_2903 :{WINDOW_COLOUR_2}Space Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2904 :{WINDOW_COLOUR_2}Manic Mechanic: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2905 :{WINDOW_COLOUR_2}Techno Torture: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2906 :{WINDOW_COLOUR_2}Sweat Dreams: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2907 :{WINDOW_COLOUR_2}What shall we do with the Drunken Sailor: (Anon/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2908 :{WINDOW_COLOUR_2}Infogrames Interactive +STR_2909 :{WINDOW_COLOUR_2}Senior Producer: Thomas J. Zahorik +STR_2910 :{WINDOW_COLOUR_2}Executive Producer: Bill Levay +STR_2911 :{WINDOW_COLOUR_2}Senior Marketing Product Manager: Scott Triola +STR_2912 :{WINDOW_COLOUR_2}V.P. of Product Development: Scott Walker +STR_2913 :{WINDOW_COLOUR_2}General Manager: John Hurlbut +STR_2914 :{WINDOW_COLOUR_2}Director of Quality Assurance: Michael Craighead +STR_2915 :{WINDOW_COLOUR_2}Q.A. Certification Manager: Kurt Boutin +STR_2916 :{WINDOW_COLOUR_2}Q.A. Certification Lead: Mark Huggins +STR_2917 :{WINDOW_COLOUR_2}Testers: Dena Irene Fitzgerald, Scott Rollins, Christopher McPhail +STR_2918 :{WINDOW_COLOUR_2}Clif McClure, Erik Maramaldi, Erik Jeffery +STR_2919 :{WINDOW_COLOUR_2}Director of Marketing: Ann Marie Bland +STR_2920 :{WINDOW_COLOUR_2}Manager of Creative Services: Steve Martin +STR_2921 :{WINDOW_COLOUR_2}Manager of Editorial & Documentation Services: Elizabeth Mackney +STR_2922 :{WINDOW_COLOUR_2}Graphic Designer: Paul Anselmi +STR_2923 :{WINDOW_COLOUR_2}Copywriter: Kurt Carlson +STR_2924 :{WINDOW_COLOUR_2}Special Thanks to: Peter Matiss +STR_2925 :{WINDOW_COLOUR_2}Engineering Specialist: Ken Edwards +STR_2926 :{WINDOW_COLOUR_2}Engineering Services Manager: Luis Rivas +STR_2927 :{WINDOW_COLOUR_2}Lead Compatibility Analyst: Geoffrey Smith +STR_2928 :{WINDOW_COLOUR_2}Compatibility Analysts: Jason Cordero, Burke McQuinn, Kim Jardin +STR_2929 :{WINDOW_COLOUR_2}Lead Tester: Daniel Frisoli +STR_2930 :{WINDOW_COLOUR_2}Senior Tester: Matt Pantaleoni +STR_2931 :{WINDOW_COLOUR_2} +STR_2932 :{WINDOW_COLOUR_2} +STR_2933 :{WINDOW_COLOUR_2} +STR_2934 :{WINDOW_COLOUR_2} +STR_2935 :{WINDOW_COLOUR_2} +STR_2936 :{WINDOW_COLOUR_2} +STR_2937 :{WINDOW_COLOUR_2} +STR_2938 :{WINDOW_COLOUR_2} +STR_2939 :{WINDOW_COLOUR_2} +STR_2940 :{WINDOW_COLOUR_2} +STR_2941 :{WINDOW_COLOUR_2} +STR_2942 :{WINDOW_COLOUR_2} +STR_2943 :{WINDOW_COLOUR_2} +STR_2944 :{WINDOW_COLOUR_2} +STR_2945 :{WINDOW_COLOUR_2} +STR_2946 :{WINDOW_COLOUR_2} +STR_2947 :{WINDOW_COLOUR_2} +STR_2948 :{WINDOW_COLOUR_2} +STR_2949 :{WINDOW_COLOUR_2} +STR_2950 :{WINDOW_COLOUR_2} +STR_2951 :{WINDOW_COLOUR_2} +STR_2952 :{WINDOW_COLOUR_2} +STR_2953 :{WINDOW_COLOUR_2} +STR_2954 :{WINDOW_COLOUR_2} +STR_2955 :{WINDOW_COLOUR_2} +STR_2956 :{WINDOW_COLOUR_2} +STR_2957 :{WINDOW_COLOUR_2} +STR_2958 :{WINDOW_COLOUR_2} +STR_2959 :{WINDOW_COLOUR_2} +STR_2960 :{WINDOW_COLOUR_2} +STR_2961 :{WINDOW_COLOUR_2} +STR_2962 :{WINDOW_COLOUR_2} +STR_2963 :{WINDOW_COLOUR_2} +STR_2964 :{WINDOW_COLOUR_2} +STR_2965 :{WINDOW_COLOUR_2} +STR_2966 : +STR_2967 : +STR_2968 : +STR_2969 : +STR_2970 : +STR_2971 :Main colour scheme +STR_2972 :Alternative colour scheme 1 +STR_2973 :Alternative colour scheme 2 +STR_2974 :Alternative colour scheme 3 +STR_2975 :{SMALLFONT}{BLACK}Select which colour scheme to change, or paint ride with +STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected colour scheme +STR_2977 :Staff member name +STR_2978 :Enter new name for this member of staff: +STR_2979 :Can't name staff member... +STR_2980 :Too many banners in game +STR_2981 :{RED}No entry - - +STR_2982 :Banner text +STR_2983 :Enter new text for this banner: +STR_2984 :Can't set new text for banner... +STR_2985 :Banner +STR_2986 :{SMALLFONT}{BLACK}Change text on banner +STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for guests +STR_2988 :{SMALLFONT}{BLACK}Demolish this banner +STR_2989 :{SMALLFONT}{BLACK}Select main colour +STR_2990 :{SMALLFONT}{BLACK}Select text colour +STR_2991 :Sign +STR_2992 :Sign text +STR_2993 :Enter new text for this sign: +STR_2994 :{SMALLFONT}{BLACK}Change text on sign +STR_2995 :{SMALLFONT}{BLACK}Demolish this sign +STR_2996 :{BLACK}ABC +STR_2997 :{GREY}ABC +STR_2998 :{WHITE}ABC +STR_2999 :{RED}ABC +STR_3000 :{GREEN}ABC +STR_3001 :{YELLOW}ABC +STR_3002 :{TOPAZ}ABC +STR_3003 :{CELADON}ABC +STR_3004 :{BABYBLUE}ABC +STR_3005 :{PALELAVENDER}ABC +STR_3006 :{PALEGOLD}ABC +STR_3007 :{LIGHTPINK}ABC +STR_3008 :{PEARLAQUA}ABC +STR_3009 :{PALESILVER}ABC +STR_3010 :Unable to load file... +STR_3011 :File contains invalid data +STR_3012 :Dodgems beat style +STR_3013 :Fairground organ style +STR_3014 :Roman fanfare style +STR_3015 :Oriental style +STR_3016 :Martian style +STR_3017 :Jungle drums style +STR_3018 :Egyptian style +STR_3019 :Toyland style +STR_3020 : +STR_3021 :Space style +STR_3022 :Horror style +STR_3023 :Techno style +STR_3024 :Gentle style +STR_3025 :Summer style +STR_3026 :Water style +STR_3027 :Wild west style +STR_3028 :Jurassic style +STR_3029 :Rock style +STR_3030 :Ragtime style +STR_3031 :Fantasy style +STR_3032 :Rock style 2 +STR_3033 :Ice style +STR_3034 :Snow style +STR_3035 :Custom music 1 +STR_3036 :Custom music 2 +STR_3037 :Medieval style +STR_3038 :Urban style +STR_3039 :Organ style +STR_3040 :Mechanical style +STR_3041 :Modern style +STR_3042 :Pirates style +STR_3043 :Rock style 3 +STR_3044 :Candy style +STR_3045 :{SMALLFONT}{BLACK}Select style of music to play +STR_3046 :This ride cannot be modified +STR_3047 :Local authority forbids demolition or modifications to this ride +STR_3048 :Marketing campaigns forbidden by local authority +STR_3049 :Golf hole A +STR_3050 :Golf hole B +STR_3051 :Golf hole C +STR_3052 :Golf hole D +STR_3053 :Golf hole E +STR_3054 :Loading... +STR_3055 :White +STR_3056 :Translucent +STR_3057 :{WINDOW_COLOUR_2}Construction Marker: +STR_3058 :Brick walls +STR_3059 :Hedges +STR_3060 :Ice blocks +STR_3061 :Wooden fences +STR_3062 :{SMALLFONT}{BLACK}Standard roller coaster track +STR_3063 :{SMALLFONT}{BLACK}Water channel (track submerged) +STR_3064 :Beginner Parks +STR_3065 :Challenging Parks +STR_3066 :Expert Parks +STR_3067 :{OPENQUOTES}Real{ENDQUOTES} Parks +STR_3068 :Other Parks +STR_3069 :Top Section +STR_3070 :Slope to Level +STR_3071 :{WINDOW_COLOUR_2}Same price throughout park +STR_3072 :{SMALLFONT}{BLACK}Select whether this price is used throughout the entire park +STR_3073 :{RED}WARNING: Your park rating has dropped below 700 !{NEWLINE}If you haven't raised the park rating in 4 weeks, your park will be closed down +STR_3074 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have 3 weeks to raise the park rating +STR_3075 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have only 2 weeks to raise the park rating, or your park will be closed down +STR_3076 :{RED}FINAL WARNING: Your park rating is still below 700 !{NEWLINE}In just 7 days your park will be closed down unless you can raise the rating +STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! +STR_3078 :Plain entrance +STR_3079 :Wooden entrance +STR_3080 :Canvas tent entrance +STR_3081 :Castle entrance (grey) +STR_3082 :Castle entrance (brown) +STR_3083 :Jungle entrance +STR_3084 :Log cabin entrance +STR_3085 :Classical/Roman entrance +STR_3086 :Abstract entrance +STR_3087 :Snow/Ice entrance +STR_3088 :Pagoda entrance +STR_3089 :Space entrance +STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station +STR_3091 :You are not allowed to remove this section! +STR_3092 :You are not allowed to move or modify the station for this ride! +STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} +STR_3094 :N/A +STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: +STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed +STR_3098 :Can't change lift hill speed... +STR_3099 :{SMALLFONT}{BLACK}Select colour +STR_3100 :{SMALLFONT}{BLACK}Select second colour +STR_3101 :{SMALLFONT}{BLACK}Select third colour +STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape +STR_3103 :Can't re-paint this... +STR_3104 :{SMALLFONT}{BLACK}List rides +STR_3105 :{SMALLFONT}{BLACK}List shops and stalls +STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other guest facilities +STR_3107 :Close +STR_3108 :Test +STR_3109 :Open +STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16} +STR_3111 :{SMALLFONT}{BLACK}Click on design to build it +STR_3112 :{SMALLFONT}{BLACK}Click on design to rename or delete it +STR_3113 :Select a different design +STR_3114 :{SMALLFONT}{BLACK}Go back to design selection window +STR_3115 :{SMALLFONT}{BLACK}Save track design +STR_3116 :{SMALLFONT}{BLACK}Save track design (Not possible until ride has been tested and statistics have been generated) +STR_3117 :{BLACK}Calling mechanic... +STR_3118 :{BLACK}{STRINGID} is heading for the ride +STR_3119 :{BLACK}{STRINGID} is fixing the ride +STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride +STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy +STR_3122 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guest +STR_3123 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guests +STR_3124 :Broken {STRINGID} +STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% +STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% +STR_3127 :{WINDOW_COLOUR_2}Nausea Factor: {BLACK}+{COMMA16}% +STR_3128 :Save Track Design +STR_3129 :Save Track Design with Scenery +STR_3130 :Save +STR_3131 :Cancel +STR_3132 :{BLACK}Click items of scenery to select them to be saved with track design... +STR_3133 :Unable to build this on a slope +STR_3134 :{RED}(Design includes scenery which is unavailable) +STR_3135 :{RED}(Vehicle design unavailable - Ride performance may be affected) +STR_3136 :Warning: This design will be built with an alternative vehicle type and may not perform as expected +STR_3137 :Select Nearby Scenery +STR_3138 :Reset Selection +STR_3139 :Cable lift unable to work in this operating mode +STR_3140 :Cable lift hill must start immediately after station +STR_3141 :Multi-circuit per ride not possible with cable lift hill +STR_3142 :{WINDOW_COLOUR_2}Capacity: {BLACK}{STRINGID} +STR_3143 :{SMALLFONT}{BLACK}Show people on map +STR_3144 :{SMALLFONT}{BLACK}Show rides and stalls on map +STR_3145 :{SMALLFONT}{BLACK}Scroll {STRINGID} left +STR_3146 :{SMALLFONT}{BLACK}Scroll {STRINGID} right +STR_3147 :{SMALLFONT}{BLACK}Scroll {STRINGID} left fast +STR_3148 :{SMALLFONT}{BLACK}Scroll {STRINGID} right fast +STR_3149 :{SMALLFONT}{BLACK}Scroll {STRINGID} left/right +STR_3150 :{SMALLFONT}{BLACK}Scroll {STRINGID} up +STR_3151 :{SMALLFONT}{BLACK}Scroll {STRINGID} down +STR_3152 :{SMALLFONT}{BLACK}Scroll {STRINGID} up fast +STR_3153 :{SMALLFONT}{BLACK}Scroll {STRINGID} down fast +STR_3154 :{SMALLFONT}{BLACK}Scroll {STRINGID} up/down +STR_3155 : +STR_3156 : +STR_3157 :map +STR_3158 :graph +STR_3159 :list +STR_3160 : +STR_3161 : +STR_3162 :Unable to allocate enough memory +STR_3163 :Installing new data: +STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) +STR_3165 : +STR_3166 :{BLACK}(ID: +STR_3167 :{WINDOW_COLOUR_2}Includes: {BLACK}{COMMA16} objects +STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} +STR_3169 :Data for the following object not found: +STR_3170 :Not enough space for graphics +STR_3171 :Too many objects of this type selected +STR_3172 :The following object must be selected first: {STRING} +STR_3173 :This object is currently in use +STR_3174 :This object is required by another object +STR_3175 :This object is always required +STR_3176 :Unable to select this object +STR_3177 :Unable to de-select this object +STR_3178 :At least one path object must be selected +STR_3179 :At least one ride vehicle/attraction object must be selected +STR_3180 :Invalid selection of objects +STR_3181 :Object Selection - {STRINGID} +STR_3182 :Park entrance type must be selected +STR_3183 :Water type must be selected +STR_3184 :Ride Vehicles/Attractions +STR_3185 :Small Scenery +STR_3186 :Large Scenery +STR_3187 :Walls/Fences +STR_3188 :Path Signs +STR_3189 :Footpaths +STR_3190 :Path Extras +STR_3191 :Scenery Groups +STR_3192 :Park Entrance +STR_3193 :Water +STR_3194 :Scenario Description +STR_3195 :Invention List +STR_3196 :{WINDOW_COLOUR_2}Research Group: {BLACK}{STRINGID} +STR_3197 :{WINDOW_COLOUR_2}Items pre-invented at start of game: +STR_3198 :{WINDOW_COLOUR_2}Items to invent during game: +STR_3199 :Random Shuffle +STR_3200 :{SMALLFONT}{BLACK}Randomly shuffle the list of items to invent during the game +STR_3201 :Object Selection +STR_3202 :Landscape Editor +STR_3203 :Invention List Set Up +STR_3204 :Options Selection +STR_3205 :Objective Selection +STR_3206 :Save Scenario +STR_3207 :Roller Coaster Designer +STR_3208 :Track Designs Manager +STR_3209 :Back to Previous Step: +STR_3210 :Forward to Next Step: +STR_3211 :{WINDOW_COLOUR_2}Map size: +STR_3212 :{POP16}{COMMA16} x {PUSH16}{COMMA16} +STR_3213 :Can't decrease map size any further +STR_3214 :Can't increase map size any further +STR_3215 :Too close to edge of map +STR_3216 :{SMALLFONT}{BLACK}Select park-owned land etc. +STR_3217 :Land Owned +STR_3218 :Construction Rights Owned +STR_3219 :Land For Sale +STR_3220 :Construction Rights For Sale +STR_3221 :{SMALLFONT}{BLACK}Set land to be owned by the park +STR_3222 :{SMALLFONT}{BLACK}Set construction rights only to be owned by the park +STR_3223 :{SMALLFONT}{BLACK}Set land to be available to purchase by the park +STR_3224 :{SMALLFONT}{BLACK}Set construction rights to be available to purchase by the park +STR_3225 :{SMALLFONT}{BLACK}Toggle on/off building a random cluster of objects around the selected position +STR_3226 :{SMALLFONT}{BLACK}Build park entrance +STR_3227 :Too many park entrances! +STR_3228 :{SMALLFONT}{BLACK}Set starting positions for people +STR_3229 :Block Brakes cannot be used directly after station +STR_3230 :Block Brakes cannot be used directly after each other +STR_3231 :Block Brakes cannot be used directly after the top of this lift hill +STR_3232 :Options - Financial +STR_3233 :Options - Guests +STR_3234 :Options - Park +STR_3235 :{SMALLFONT}{BLACK}Show financial options +STR_3236 :{SMALLFONT}{BLACK}Show guest options +STR_3237 :{SMALLFONT}{BLACK}Show park options +STR_3238 :No Money +STR_3239 :{SMALLFONT}{BLACK}Make this park a 'no money' park with no financial restrictions +STR_3240 :{WINDOW_COLOUR_2}Initial cash: +STR_3241 :{WINDOW_COLOUR_2}Initial loan: +STR_3242 :{WINDOW_COLOUR_2}Maximum loan size: +STR_3243 :{WINDOW_COLOUR_2}Annual interest rate: +STR_3244 :Forbid marketing campaigns +STR_3245 :{SMALLFONT}{BLACK}Forbid advertising, promotional schemes, and other marketing campaigns +STR_3246 :{WINDOW_COLOUR_2}{CURRENCY} +STR_3247 :{WINDOW_COLOUR_2}{COMMA16}% +STR_3248 :Can't increase initial cash any further! +STR_3249 :Can't reduce initial cash any further! +STR_3250 :Can't increase initial loan any further! +STR_3251 :Can't reduce initial loan any further! +STR_3252 :Can't increase maximum loan size any further! +STR_3253 :Can't reduce maximum loan size any further! +STR_3254 :Can't increase interest rate any further! +STR_3255 :Can't reduce interest rate any further! +STR_3256 :Guests prefer less intense rides +STR_3257 :{SMALLFONT}{BLACK}Select whether guests should generally prefer less intense rides only +STR_3258 :Guests prefer more intense rides +STR_3259 :{SMALLFONT}{BLACK}Select whether guests should generally prefer more intense rides only +STR_3260 :{WINDOW_COLOUR_2}Cash per guest (average): +STR_3261 :{WINDOW_COLOUR_2}Guests initial happiness: +STR_3262 :{WINDOW_COLOUR_2}Guests initial hunger: +STR_3263 :{WINDOW_COLOUR_2}Guests initial thirst: +STR_3264 :Can't increase this any further! +STR_3265 :Can't reduce this any further! +STR_3266 :{SMALLFONT}{BLACK}Select how this park charges for entrance and rides +STR_3267 :Forbid tree removal +STR_3268 :{SMALLFONT}{BLACK}Forbid tall trees being removed +STR_3269 :Forbid landscape changes +STR_3270 :{SMALLFONT}{BLACK}Forbid any changes to the landscape +STR_3271 :Forbid high construction +STR_3272 :{SMALLFONT}{BLACK}Forbid any tall construction +STR_3273 :Park rating higher difficult level +STR_3274 :{SMALLFONT}{BLACK}Make the park rating value more challenging +STR_3275 :Guest generation higher difficult level +STR_3276 :{SMALLFONT}{BLACK}Make it more difficult to attract guests to the park +STR_3277 :{WINDOW_COLOUR_2}Cost to buy land: +STR_3278 :{WINDOW_COLOUR_2}Cost to buy construction rights: +STR_3279 :Free park entry / Pay per ride +STR_3280 :Pay to enter park / Free rides +STR_3281 :{WINDOW_COLOUR_2}Entry price: +STR_3282 :{SMALLFONT}{BLACK}Select objective and park name +STR_3283 :{SMALLFONT}{BLACK}Select rides to be preserved +STR_3284 :Objective Selection +STR_3285 :Preserved Rides +STR_3286 :{SMALLFONT}{BLACK}Select objective for this scenario +STR_3287 :{WINDOW_COLOUR_2}Objective: +STR_3288 :{SMALLFONT}{BLACK}Select climate +STR_3289 :{WINDOW_COLOUR_2}Climate: +STR_3290 :Cool and wet +STR_3291 :Warm +STR_3292 :Hot and dry +STR_3293 :Cold +STR_3294 :Change... +STR_3295 :{SMALLFONT}{BLACK}Change name of park +STR_3296 :{SMALLFONT}{BLACK}Change name of scenario +STR_3297 :{SMALLFONT}{BLACK}Change detail notes about park / scenario +STR_3298 :{WINDOW_COLOUR_2}Park Name: {BLACK}{STRINGID} +STR_3299 :{WINDOW_COLOUR_2}Park/Scenario Details: +STR_3300 :{WINDOW_COLOUR_2}Scenario Name: {BLACK}{STRINGID} +STR_3301 :{WINDOW_COLOUR_2}Objective Date: +STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR} +STR_3303 :{WINDOW_COLOUR_2}Number of guests: +STR_3304 :{WINDOW_COLOUR_2}Park value: +STR_3305 :{WINDOW_COLOUR_2}Monthly income: +STR_3306 :{WINDOW_COLOUR_2}Monthly profit: +STR_3307 :{WINDOW_COLOUR_2}Minimum length: +STR_3308 :{WINDOW_COLOUR_2}Excitement rating: +STR_3309 :{WINDOW_COLOUR_2}{COMMA16} +STR_3310 :{WINDOW_COLOUR_2}{LENGTH} +STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32} +STR_3312 :{WINDOW_COLOUR_2}Rides/attractions under a preservation order: +STR_3313 :Scenario Name +STR_3314 :Enter name for scenario: +STR_3315 :Park/Scenario Details +STR_3316 :Enter description of this scenario: +STR_3317 :No details yet +STR_3318 :{SMALLFONT}{BLACK}Select which group this scenario appears in +STR_3319 :{WINDOW_COLOUR_2}Scenario Group: +STR_3320 :Unable to save scenario file... +STR_3321 :New objects installed successfully +STR_3322 :{WINDOW_COLOUR_2}Objective: {BLACK}{STRINGID} +STR_3323 :Missing object data, ID: +STR_3324 :Requires Add-On Pack: +STR_3325 :Requires an Add-On Pack +STR_3326 :{WINDOW_COLOUR_2}(no image) +STR_3327 :Starting positions for people not set +STR_3328 :Can't advance to next editor stage... +STR_3329 :Park entrance not yet built +STR_3330 :Park must own some land +STR_3331 :Path from park entrance to map edge either not complete or too complex - Path must be single-width with as few junctions and corners as possible +STR_3332 :Park entrance is the wrong way round or has no path leading to the map edge +STR_3333 :Export plug-in objects with saved games +STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data +STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles +STR_3336 :Track Designs Manager - Select Ride Type +STR_3337 : +STR_3338 :{BLACK}Custom-designed layout +STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout +STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout +STR_3341 :{SMALLFONT}{BLACK}Game tools +STR_3342 :Scenario Editor +STR_3343 :Convert Saved Game to Scenario +STR_3344 :Roller Coaster Designer +STR_3345 :Track Designs Manager +STR_3346 :Can't save track design... +STR_3347 :Ride is too large, contains too many elements, or scenery is too spread out +STR_3348 :Rename +STR_3349 :Delete +STR_3350 :Track design name +STR_3351 :Enter new name for this track design: +STR_3352 :Can't rename track design... +STR_3353 :New name contains invalid characters +STR_3354 :Another file exists with this name, or file is write-protected +STR_3355 :File is write-protected or locked +STR_3356 :Delete File +STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ? +STR_3358 :Can't delete track design... +STR_3359 :{BLACK}No track designs of this type +STR_3360 :Warning! +STR_3361 :Too many track designs of this type - Some will not be listed. +STR_3362 : +STR_3363 : +STR_3364 :Advanced +STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups +STR_3366 :{BLACK}= Ride +STR_3367 :{BLACK}= Food Stall +STR_3368 :{BLACK}= Drink Stall +STR_3369 :{BLACK}= Souvenir Stall +STR_3370 :{BLACK}= Info. Kiosk +STR_3371 :{BLACK}= First Aid +STR_3372 :{BLACK}= Cash Machine +STR_3373 :{BLACK}= Toilet +STR_3374 :Warning: Too many objects selected! +STR_3375 :Not all objects in this scenery group could be selected +STR_3376 :Install new track design... +STR_3377 :{SMALLFONT}{BLACK}Install a new track design file +STR_3378 :Install +STR_3379 :Cancel +STR_3380 :Unable to install this track design... +STR_3381 :File is not compatible or contains invalid data +STR_3382 :File copy failed +STR_3383 :Select new name for track design +STR_3384 :An existing track design already has this name - Please select a new name for this design: +STR_3385 :Beginners Tutorial +STR_3386 :Custom Rides Tutorial +STR_3387 :Roller Coaster Building Tutorial +STR_3388 :Unable to switch to selected mode +STR_3389 :Unable to select additional item of scenery... +STR_3390 :Too many items selected +# Start of tutorial strings. Not used at the moment, so not necessary to translate. +STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... +STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... +STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... +STR_3394 :{SMALLFONT}{BLACK}You can also rotate the view in 90 degree steps... +STR_3395 :{SMALLFONT}{BLACK}Building anything at this scale is a bit difficult, so let's zoom the view back in again... +STR_3396 :{SMALLFONT}{BLACK}Let's build a simple ride to get the park started... +STR_3397 :{SMALLFONT}{BLACK}The white 'ghost' image shows where the ride will be built. We'll move the pointer to select the position then click to build it... +STR_3398 :{SMALLFONT}{BLACK}Rides need an entrance and an exit. We'll move the pointer to a square on the edge of the ride and then click to build first the entrance and then the exit... +STR_3399 :{SMALLFONT}{BLACK}We need to build footpaths to allow guests to reach our new ride... +STR_3400 :{SMALLFONT}{BLACK}For the path to the ride entrance we'll use a special 'queue line' path... +STR_3401 :{SMALLFONT}{BLACK}For the exit path, just an 'ordinary' path will do... +STR_3402 :{SMALLFONT}{BLACK}Right, lets open the ride! To open the ride we click the flag icon on the ride window and select 'open'... +STR_3403 :{SMALLFONT}{BLACK}But where are the guests? +STR_3404 :{SMALLFONT}{BLACK}Oh - The park is still closed! Right - Let's open it... +STR_3405 :{SMALLFONT}{BLACK}While we're waiting for our first guests, let's build some scenery... +STR_3406 :{SMALLFONT}{BLACK}Here's our empty park. We're going to build a simple custom-designed ride... +STR_3407 :{SMALLFONT}{BLACK}First we need to choose a starting position... +STR_3408 :{SMALLFONT}{BLACK}The section of track we've just built is a 'station platform', to allow guests to get on and off the ride... +STR_3409 :{SMALLFONT}{BLACK}We'll extend the platform a bit by adding a couple more station platform sections... +STR_3410 :{SMALLFONT}{BLACK}The icons at the top of the construction window let you choose different track pieces to add... +STR_3411 :{SMALLFONT}{BLACK}We'll select a left-hand curve... +STR_3412 :{SMALLFONT}{BLACK}The curve hasn't been built yet, but the white ghost image shows where it will be built. Clicking the large 'build this' icon actually builds the track... +STR_3413 :{SMALLFONT}{BLACK}Now we want to build straight track, so we click the straight track icon... +STR_3414 :{SMALLFONT}{BLACK}Now that the circuit is complete, we need to build the ride entrance and exit... +STR_3415 :{SMALLFONT}{BLACK}Let's test our ride to check it works... +STR_3416 :{SMALLFONT}{BLACK}White it's being tested, we'll build the queue line and exit path... +STR_3417 :{SMALLFONT}{BLACK}OK - Let's open the park and the ride... +STR_3418 :{SMALLFONT}{BLACK}Our new ride isn't very exciting - Perhaps we should add some scenery? +STR_3419 :{SMALLFONT}{BLACK}To build scenery above other scenery or in mid-air, hold down the SHIFT key and move the mouse to select the height... +STR_3420 :{SMALLFONT}{BLACK}Some types of scenery can be re-painted after it's built... +STR_3421 :{SMALLFONT}{BLACK}Let's add some music to the ride... +STR_3422 :{SMALLFONT}{BLACK}Let's build a roller coaster ! +STR_3423 :{SMALLFONT}{BLACK}There are loads of pre-designed coasters, but we're going to build our own custom design... +STR_3424 :{SMALLFONT}{BLACK}That's the station platform built. Now we need a lift hill... +STR_3425 :{SMALLFONT}{BLACK}Roller coaster trains aren't powered, so a 'chain lift' is needed to pull the train up the first hill... +STR_3426 :{SMALLFONT}{BLACK}That's the lift hill complete - Now for the first drop... +STR_3427 :{SMALLFONT}{BLACK}Those curves are a bad idea - The riders will be flung to the sides by the lateral G forces as the train hurtles around... +STR_3428 :{SMALLFONT}{BLACK}Banking the curves will improve the ride - Riders will be pushed down into their seats instead of flung to the sides... +STR_3429 :{SMALLFONT}{BLACK}No - That won't work! Look at the height marks - The second hill is taller than the lift hill... +STR_3430 :{SMALLFONT}{BLACK}To ensure the train makes it around, each hill should be slightly smaller than the previous one... +STR_3431 :{SMALLFONT}{BLACK}That's better - Our train should make it up that hill now! Let's try some more twisted track... +STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve and station, so let's add some brakes... +STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow two trains to operate more safely on the circuit... +STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! +STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... +STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... +# End of tutorial strings +STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape +STR_3438 :Unable to remove all scenery from here... +STR_3439 :Clear Scenery +STR_3440 :Page 1 +STR_3441 :Page 2 +STR_3442 :Page 3 +STR_3443 :Page 4 +STR_3444 :Page 5 +STR_3445 :Set Patrol Area +STR_3446 :Cancel Patrol Area + +# Thousands separator +STR_5151 :. +# Decimal separator +STR_5152 :, From 23fcefd7eb9d64a8d9ba43ed3527f1ff862aab48 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 17 Aug 2015 08:13:22 +0100 Subject: [PATCH 0548/1173] fix saving of servers --- src/windows/server_list.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/windows/server_list.c b/src/windows/server_list.c index bfb5b3465c..49fcdafd20 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -218,6 +218,7 @@ static void window_server_list_scroll_mousedown(rct_window *w, int scrollIndex, switch (_hoverButtonIndex) { case WIDX_LIST_REMOVE: remove_saved_server(serverIndex); + server_list_save_saved_servers(); w->no_list_items = _numSavedServers; window_invalidate(w); break; @@ -281,6 +282,7 @@ static void window_server_list_textinput(rct_window *w, int widgetIndex, char *t case WIDX_ADD_SERVER: add_saved_server(text); + server_list_save_saved_servers(); w->no_list_items = _numSavedServers; window_invalidate(w); break; From a6043c6f78bf816bf2a2386f371ebab598d4c1b5 Mon Sep 17 00:00:00 2001 From: xperia64 Date: Mon, 17 Aug 2015 20:48:18 -0400 Subject: [PATCH 0549/1173] Re-add PLUGIN.DAT --- src/rct2.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/rct2.h b/src/rct2.h index f6a6533dac..5749e3a133 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -150,6 +150,7 @@ enum { enum { PATH_ID_G1, + PATH_ID_PLUGIN, PATH_ID_CSS1, PATH_ID_CSS2, PATH_ID_CSS4, @@ -206,6 +207,7 @@ enum { static const char * const file_paths[] = { "Data\\G1.DAT", + "Data\\PLUGIN.DAT", "Data\\CSS1.DAT", "Data\\CSS2.DAT", "Data\\CSS4.DAT", From 3a8dd2502053b74ae0e3a2f4d509152038a3e012 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 18 Aug 2015 04:00:15 +0100 Subject: [PATCH 0550/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 15 +++++++++------ data/language/german.txt | 10 +++++++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 31b3a99d94..7961b6d7a5 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -1173,7 +1173,7 @@ STR_1167 :不能在此升高水位... STR_1168 :選項 STR_1169 :(無) STR_1170 :{STRING} -STR_1171 :{RED}Closed - - +STR_1171 :{RED}已關閉 - - STR_1172 :{YELLOW}{STRINGID} - - STR_1173 :{SMALLFONT}{BLACK}建造道路及'輪候區'道路 STR_1174 :橫額擋在路上 @@ -1408,13 +1408,13 @@ STR_1402 :{SMALLFONT}{BLACK}建造或移動遊樂設施的入口 STR_1403 :{SMALLFONT}{BLACK}建造或移動遊樂設施的出口 STR_1404 :{SMALLFONT}{BLACK}90{DEGREE}旋轉 STR_1405 :{SMALLFONT}{BLACK}反轉鬼影 -STR_1406 :{SMALLFONT}{BLACK}使用/棄用景物 (如果這個軌道設計擁有景物) +STR_1406 :{SMALLFONT}{BLACK}使用/棄用景物 (如果這個軌道設計附帶景物) STR_1407 :{WINDOW_COLOUR_2}建造此軌道... STR_1408 :{WINDOW_COLOUR_2}費用: {BLACK}{CURRENCY} STR_1409 :入口/出口平台 STR_1410 :垂直高塔 STR_1411 :{STRINGID}擋在路中 -STR_1412 :{WINDOW_COLOUR_3}這類型的遊樂設施並不適合數據記錄 +STR_1412 :{WINDOW_COLOUR_3}數據記錄並不適合這類型的遊樂設施 STR_1413 :{WINDOW_COLOUR_3}數據會於{STRINGID}離開{STRINGID}後記錄 STR_1414 :{SMALLFONT}{BLACK}{DURATION} STR_1415 :{WINDOW_COLOUR_2}速度 @@ -1454,7 +1454,7 @@ STR_1448 :觀看新遊樂設施的建造過程中 STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) -STR_1452 :遊客的名字 +STR_1452 :遊客命名 STR_1453 :請輸入這位遊客的新姓名: STR_1454 :不能命名這位遊客... STR_1455 :不適合的遊客姓名 @@ -1471,7 +1471,7 @@ STR_1465 :向上盤旋 (大型) STR_1466 :向下盤旋 (小型) STR_1467 :向下盤旋 (大型) STR_1468 :員工 -STR_1469 :遊樂設施必需要由車站發車以及到達車站卸客 +STR_1469 :遊樂設施必需要由車站發車後到達車站卸客 STR_1470 :車站不夠長 STR_1471 :{WINDOW_COLOUR_2}速度: STR_1472 :{SMALLFONT}{BLACK}此遊樂設施的速度 @@ -1723,7 +1723,7 @@ STR_1717 :不能重命名樂園... STR_1718 :樂園名稱 STR_1719 :請輸入樂園名稱: STR_1720 :{SMALLFONT}{BLACK}命名樂園 -STR_1721 :樂園關閉中 +STR_1721 :樂園已關閉 STR_1722 :樂園開放中 STR_1723 :不能開放樂園... STR_1724 :不能關閉樂園... @@ -3844,3 +3844,6 @@ STR_5501 :開始伺服器 STR_5502 :多人連線模式 STR_5503 :請輸入主機名稱或IP地址: STR_5504 :{SMALLFONT}{BLACK}顯示多人連線狀態 +STR_5505 :無法連接至伺服器. +STR_5506 :遊客無視設施的刺激度 +STR_5507 :預設清潔工人會修剪草皮 diff --git a/data/language/german.txt b/data/language/german.txt index eb2027c0c7..6af40d496f 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3822,12 +3822,12 @@ STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}Aktuelle Nachrichten anzeigen STR_5488 :Kein Eingang -STR_5489 :{SMALLFONT}{BLACK}Nur überwachte Gäste anzeigen +STR_5489 :{SMALLFONT}{BLACK}Nur überwachte Besucher anzeigen STR_5490 :Audio deaktivieren, wenn Spiel nicht im Vordergrund STR_5491 :Erfindungsliste STR_5492 :Szenario-Optionen STR_5493 :Nachricht senden -STR_5494 :Zu versendende Nachricht eingeben. +STR_5494 : STR_5495 :Spielerliste STR_5496 :Spieler: STR_5497 :Ping: @@ -3835,5 +3835,9 @@ STR_5498 :Serverliste STR_5499 :Spielername: STR_5500 :Server hinzufügen STR_5501 :Server starten -STR_5502 :Multiplayer +STR_5502 :Mehrspieler STR_5503 :Hostnamen oder IP-Adresse eingeben: +STR_5504 :{SMALLFONT}{BLACK}Mehrspielerstatus anzeigen +STR_5505 :Verbindung zum Server konnte nicht hergestellt werden +STR_5506 :Besucher ignorieren Bahnintensität +STR_5507 :Parkpfleger mähen standardmäßig Gras From 958f2fb2968e4f1a0520e719cd43a5f21a796215 Mon Sep 17 00:00:00 2001 From: medsouz Date: Mon, 17 Aug 2015 23:05:46 -0400 Subject: [PATCH 0551/1173] Document some scenery memory addresses --- src/addresses.h | 7 +++ src/windows/scenery.c | 12 +++--- src/windows/top_toolbar.c | 90 +++++++++++++++++++-------------------- src/world/scenery.c | 37 ++++++++-------- 4 files changed, 75 insertions(+), 71 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index f1dc347c96..8421dce109 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -349,6 +349,13 @@ #define RCT2_ADDRESS_TRACK_LIST 0x00F441EC +#define RCT2_ADDRESS_SCENERY_COST 0x00F64EB4 + +#define RCT2_ADDRESS_GHOST_SCENERY_X 0x00F64EC4 +#define RCT2_ADDRESS_GHOST_SCENERY_Y 0x00F64EC6 +#define RCT2_ADDRESS_GHOST_SCENERY_Z 0x00F64F09 +#define RCT2_ADDRESS_GHOST_SCENERY_TYPE 0x00F64F0D + #define RCT2_ADDRESS_CTRL_PRESS_Z_COORDINATE 0x00F64ECC #define RCT2_ADDRESS_SHIFT_PRESS_X_COORDINATE 0x00F64ECE #define RCT2_ADDRESS_SHIFT_PRESS_Y_COORDINATE 0x00F64ED0 diff --git a/src/windows/scenery.c b/src/windows/scenery.c index 3deb35e692..ea6a4388a2 100644 --- a/src/windows/scenery.c +++ b/src/windows/scenery.c @@ -470,8 +470,8 @@ void window_scenery_open() window->scenery.selected_scenery_id = -1; window->scenery.hover_counter = 0; window_push_others_below(window); - RCT2_GLOBAL(0x00F64F0D, uint8) = 0; - RCT2_GLOBAL(0x00F64EB4, uint32) = MONEY32_UNDEFINED; + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_COST, uint32) = MONEY32_UNDEFINED; RCT2_GLOBAL(0x00F64EC0, uint16) = 0; window_scenery_is_repaint_scenery_tool_on = 0; // repaint colored scenery tool state window_scenery_is_build_cluster_tool_on = 0; // build cluster tool state @@ -639,7 +639,7 @@ static void window_scenery_mousedown(int widgetIndex, rct_window* w, rct_widget* if (widgetIndex >= WIDX_SCENERY_TAB_1 && widgetIndex <= WIDX_SCENERY_TAB_20) { window_scenery_active_tab_index = widgetIndex - WIDX_SCENERY_TAB_1; window_invalidate(w); - RCT2_GLOBAL(0x00F64EB4, uint32) = MONEY32_UNDEFINED; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_COST, uint32) = MONEY32_UNDEFINED; window_scenery_update_scroll(w); } } @@ -797,7 +797,7 @@ void window_scenery_scrollmousedown(rct_window *w, int scrollIndex, int x, int y window_scenery_is_repaint_scenery_tool_on &= 0xFE; sound_play_panned(4, (w->width >> 1) + w->x, 0, 0, 0); w->scenery.hover_counter = -16; - RCT2_GLOBAL(0x00F64EB4, uint32) = MONEY32_UNDEFINED; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_COST, uint32) = MONEY32_UNDEFINED; window_invalidate(w); } @@ -1021,8 +1021,8 @@ void window_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi) price = sceneryEntry->small_scenery.price * 10; } - if (w->scenery.selected_scenery_id == -1 && RCT2_GLOBAL(0x00F64EB4, uint32) != MONEY32_UNDEFINED) { - price = RCT2_GLOBAL(0x00F64EB4, uint32); + if (w->scenery.selected_scenery_id == -1 && RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_COST, uint32) != MONEY32_UNDEFINED) { + price = RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_COST, uint32); } RCT2_GLOBAL(0x013CE952, uint32) = price; diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index f1b94142f5..b4c634c9ba 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -2083,18 +2083,18 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa parameter_2, GAME_COMMAND_PLACE_SCENERY, parameter_3, - RCT2_GLOBAL(0x00F64ED4, sint16)); + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16)); if (cost == MONEY32_UNDEFINED) return cost; - RCT2_GLOBAL(0x00F64EC4, sint16) = map_tile.x; - RCT2_GLOBAL(0x00F64EC6, sint16) = map_tile.y; + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) = map_tile.x; + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; RCT2_GLOBAL(0x00F64EC0, uint16) = (uint16)(parameter_3 & 0xFFFF); RCT2_GLOBAL(0x00F64EDA, sint16) = selected_tab; mapElement = RCT2_GLOBAL(0x00F64EBC, rct_map_element*); - RCT2_GLOBAL(0x00F64F09, uint8) = mapElement->base_height; + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = mapElement->base_height; RCT2_GLOBAL(0x00F64F0C, uint8) = mapElement->type; if (RCT2_GLOBAL(0x00F64F14, uint8) & (1 << 1)){ viewport_set_visibility(4); @@ -2103,7 +2103,7 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa viewport_set_visibility(5); } - RCT2_GLOBAL(0x00F64F0D, uint8) |= (1 << 0); + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) |= (1 << 0); break; case 1: // Path Bits @@ -2120,14 +2120,14 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa if (cost == MONEY32_UNDEFINED) return cost; - RCT2_GLOBAL(0x00F64EC4, sint16) = map_tile.x; - RCT2_GLOBAL(0x00F64EC6, sint16) = map_tile.y; - RCT2_GLOBAL(0x00F64F09, uint8) = (parameter_2 & 0xFF); + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) = map_tile.x; + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = (parameter_2 & 0xFF); RCT2_GLOBAL(0x00F64F0F, uint8) = ((parameter_1 >> 8) & 0xFF); RCT2_GLOBAL(0x00F64F10, uint8) = ((parameter_2 >> 8) & 0xFF); RCT2_GLOBAL(0x00F64EAC, uint32) = parameter_3; - RCT2_GLOBAL(0x00F64F0D, uint8) |= (1 << 1); + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) |= (1 << 1); break; case 2: // Walls @@ -2138,20 +2138,20 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa map_tile.y, parameter_2, GAME_COMMAND_PLACE_FENCE, - RCT2_GLOBAL(0x00F64ED4, uint16), + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, uint16), RCT2_GLOBAL(0x00F64F15, uint16)); if (cost == MONEY32_UNDEFINED) return cost; - RCT2_GLOBAL(0x00F64EC4, sint16) = map_tile.x; - RCT2_GLOBAL(0x00F64EC6, sint16) = map_tile.y; + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) = map_tile.x; + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; RCT2_GLOBAL(0x00F64F11, uint8) = (parameter_2 & 0xFF); mapElement = RCT2_GLOBAL(0x00F64EBC, rct_map_element*); - RCT2_GLOBAL(0x00F64F09, uint8) = mapElement->base_height; + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = mapElement->base_height; - RCT2_GLOBAL(0x00F64F0D, uint8) |= (1 << 2); + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) |= (1 << 2); break; case 3: // Large Scenery @@ -2163,17 +2163,17 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa parameter_2, GAME_COMMAND_PLACE_LARGE_SCENERY, parameter_3, - RCT2_GLOBAL(0x00F64ED4, uint16)); + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, uint16)); if (cost == MONEY32_UNDEFINED) return cost; - RCT2_GLOBAL(0x00F64EC4, sint16) = map_tile.x; - RCT2_GLOBAL(0x00F64EC6, sint16) = map_tile.y; + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) = map_tile.x; + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; RCT2_GLOBAL(0x00F64EC0, uint8) = ((parameter_1 >> 8) & 0xFF); mapElement = RCT2_GLOBAL(0x00F64EBC, rct_map_element*); - RCT2_GLOBAL(0x00F64F09, uint8) = mapElement->base_height; + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = mapElement->base_height; if (RCT2_GLOBAL(0x00F64F14, uint8) & (1 << 1)){ viewport_set_visibility(4); @@ -2182,7 +2182,7 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa viewport_set_visibility(5); } - RCT2_GLOBAL(0x00F64F0D, uint8) |= (1 << 3); + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) |= (1 << 3); break; case 4: // Banners @@ -2199,11 +2199,11 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa if (cost == MONEY32_UNDEFINED) return cost; - RCT2_GLOBAL(0x00F64EC4, sint16) = map_tile.x; - RCT2_GLOBAL(0x00F64EC6, sint16) = map_tile.y; - RCT2_GLOBAL(0x00F64F09, uint8) = (parameter_2 & 0xFF); + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) = map_tile.x; + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = (parameter_2 & 0xFF); RCT2_GLOBAL(0x00F64EC0, uint8) = ((parameter_2 >> 8) & 0xFF); - RCT2_GLOBAL(0x00F64F0D, uint8) |= (1 << 4); + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) |= (1 << 4); break; } @@ -2264,9 +2264,9 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ map_invalidate_selection_rect(); // If no change in ghost placement - if ((RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 0)) && - mapTile.x == RCT2_GLOBAL(0x00F64EC4, sint16) && - mapTile.y == RCT2_GLOBAL(0x00F64EC6, sint16) && + if ((RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 0)) && + mapTile.x == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) && + mapTile.y == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) && (parameter2 & 0xFF) == RCT2_GLOBAL(0x00F64F0E, uint8)&& RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) == RCT2_GLOBAL(0x00F64F0A, sint16) && RCT2_GLOBAL(0x00F64EDA, uint16) == selected_tab){ @@ -2297,7 +2297,7 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) += 8; } - RCT2_GLOBAL(0x00F64EB4, money32) = cost; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_COST, money32) = cost; break; case 1: RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= (1 << 0); @@ -2310,10 +2310,10 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ map_invalidate_selection_rect(); // If no change in ghost placement - if ((RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 1)) && - mapTile.x == RCT2_GLOBAL(0x00F64EC4, sint16) && - mapTile.y == RCT2_GLOBAL(0x00F64EC6, sint16) && - (parameter2 & 0xFF) == RCT2_GLOBAL(0x00F64F09, uint8)){ + if ((RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 1)) && + mapTile.x == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) && + mapTile.y == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) && + (parameter2 & 0xFF) == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8)){ return; } @@ -2326,7 +2326,7 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ parameter3, selected_tab); - RCT2_GLOBAL(0x00F64EB4, money32) = cost; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_COST, money32) = cost; break; case 2: RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= (1 << 0); @@ -2339,9 +2339,9 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ map_invalidate_selection_rect(); // If no change in ghost placement - if ((RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 2)) && - mapTile.x == RCT2_GLOBAL(0x00F64EC4, sint16) && - mapTile.y == RCT2_GLOBAL(0x00F64EC6, sint16) && + if ((RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 2)) && + mapTile.x == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) && + mapTile.y == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) && (parameter2 & 0xFF) == RCT2_GLOBAL(0x00F64F11, uint8) && RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) == RCT2_GLOBAL(0x00F64F0A, sint16) ){ @@ -2373,7 +2373,7 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) += 8; } - RCT2_GLOBAL(0x00F64EB4, money32) = cost; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_COST, money32) = cost; break; case 3: scenery = g_largeSceneryEntries[selected_scenery]; @@ -2400,9 +2400,9 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ map_invalidate_map_selection_tiles(); // If no change in ghost placement - if ((RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 3)) && - mapTile.x == RCT2_GLOBAL(0x00F64EC4, sint16) && - mapTile.y == RCT2_GLOBAL(0x00F64EC6, sint16) && + if ((RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 3)) && + mapTile.x == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) && + mapTile.y == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) && RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) == RCT2_GLOBAL(0x00F64F0A, sint16) && (parameter3 & 0xFFFF) == RCT2_GLOBAL(0x00F64EDA, uint16)){ return; @@ -2433,7 +2433,7 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) += 8; } - RCT2_GLOBAL(0x00F64EB4, money32) = cost; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_COST, money32) = cost; break; case 4: RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= (1 << 0); @@ -2446,10 +2446,10 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ map_invalidate_selection_rect(); // If no change in ghost placement - if ((RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 4)) && - mapTile.x == RCT2_GLOBAL(0x00F64EC4, sint16) && - mapTile.y == RCT2_GLOBAL(0x00F64EC6, sint16) && - (parameter2 & 0xFF) == RCT2_GLOBAL(0x00F64F09, uint8) && + if ((RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 4)) && + mapTile.x == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) && + mapTile.y == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) && + (parameter2 & 0xFF) == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) && ((parameter2 >> 8) & 0xFF) == RCT2_GLOBAL(0x00F64EC0, uint8)){ return; } @@ -2463,7 +2463,7 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ parameter3, selected_tab); - RCT2_GLOBAL(0x00F64EB4, money32) = cost; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_COST, money32) = cost; break; } } diff --git a/src/world/scenery.c b/src/world/scenery.c index cbf9bf3ca3..fabf42ff24 100644 --- a/src/world/scenery.c +++ b/src/world/scenery.c @@ -111,18 +111,19 @@ void scenery_increase_age(int x, int y, rct_map_element *mapElement) } } - -/* 0x006E2712 */ +/* + * + * rct2: 0x006E2712 + */ void scenery_remove_ghost_tool_placement(){ sint16 x, y, z; - x = RCT2_GLOBAL(0x00F64EC4, sint16); - y = RCT2_GLOBAL(0x00F64EC6, sint16); - z = RCT2_GLOBAL(0x00F64F09, uint8); - - if (RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 0)){ - RCT2_GLOBAL(0x00F64F0D, uint8) &= ~(1 << 0); + x = RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16); + y = RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16); + z = RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8); + if (RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 0)){ + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 0); game_do_command( x, 105 | (RCT2_GLOBAL(0x00F64F0C, uint8) << 8), @@ -133,9 +134,8 @@ void scenery_remove_ghost_tool_placement(){ 0); } - if (RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 1)){ - RCT2_GLOBAL(0x00F64F0D, uint8) &= ~(1 << 1); - + if (RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 1)){ + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 1); rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); do{ @@ -157,9 +157,8 @@ void scenery_remove_ghost_tool_placement(){ } while (!map_element_is_last_for_tile(map_element++)); } - if (RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 2)){ - RCT2_GLOBAL(0x00F64F0D, uint8) &= ~(1 << 2); - + if (RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 2)){ + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 2); game_do_command( x, 105 | (RCT2_GLOBAL(0x00F64F0C, uint8) << 8), @@ -170,9 +169,8 @@ void scenery_remove_ghost_tool_placement(){ 0); } - if (RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 3)){ - RCT2_GLOBAL(0x00F64F0D, uint8) &= ~(1 << 3); - + if (RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 3)){ + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 3); game_do_command( x, 105 | (RCT2_GLOBAL(0x00F64EC0, uint8) << 8), @@ -183,9 +181,8 @@ void scenery_remove_ghost_tool_placement(){ 0); } - if (RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 4)){ - RCT2_GLOBAL(0x00F64F0D, uint8) &= ~(1 << 4); - + if (RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 4)){ + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 4); game_do_command( x, 105, From 4fa571a041da3083747d17acf653c0b66e04b2a9 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 18 Aug 2015 10:04:10 +0200 Subject: [PATCH 0552/1173] Add option to allow loading scenarios with an incorrect checksum --- data/language/english_uk.txt | 4 +++- src/config.c | 1 + src/config.h | 1 + src/localisation/string_ids.h | 3 +++ src/scenario.c | 2 +- 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index e609ee119b..f39d020b6a 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3845,4 +3845,6 @@ STR_5503 :Enter hostname or IP address: STR_5504 :{SMALLFONT}{BLACK}Show multiplayer status STR_5505 :Unable to connect to server. STR_5506 :Guests ignore intensities -STR_5507 :Handymen mow grass by default \ No newline at end of file +STR_5507 :Handymen mow grass by default +STR_5508 :Allow loading files with incorrect checksums +STR_5509 :{SMALLFONT}{BLACK}Allows loading scenarios and saves that have an incorrect checksum, like the scenarios from the demo or damaged saves. diff --git a/src/config.c b/src/config.c index 41ef33dccb..304bb22e98 100644 --- a/src/config.c +++ b/src/config.c @@ -191,6 +191,7 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, minimize_fullscreen_focus_loss), "minimize_fullscreen_focus_loss",CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, { offsetof(general_configuration, day_night_cycle), "day_night_cycle", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, upper_case_banners), "upper_case_banners", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(general_configuration, allow_loading_with_incorrect_checksum),"allow_loading_with_incorrect_checksum", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, }; config_property_definition _interfaceDefinitions[] = { diff --git a/src/config.h b/src/config.h index 35ed2e74c5..b472fb7e3e 100644 --- a/src/config.h +++ b/src/config.h @@ -164,6 +164,7 @@ typedef struct { uint8 minimize_fullscreen_focus_loss; uint8 day_night_cycle; uint8 upper_case_banners; + uint8 allow_loading_with_incorrect_checksum; } general_configuration; typedef struct { diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index b03c6b3c28..4dcb4c42f4 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2047,6 +2047,9 @@ enum { STR_SHOW_MULTIPLAYER_STATUS_TIP = 5504, STR_UNABLE_TO_CONNECT_TO_SERVER = 5505, + STR_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM = 5508, + STR_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM_TIP = 5509, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/scenario.c b/src/scenario.c index 3eed3a5182..925071bb7f 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -109,7 +109,7 @@ int scenario_load(const char *path) rw = platform_sdl_rwfromfile(path, "rb"); if (rw != NULL) { - if (!sawyercoding_validate_checksum(rw)) { + if (!sawyercoding_validate_checksum(rw) && !gConfigGeneral.allow_loading_with_incorrect_checksum) { SDL_RWclose(rw); RCT2_GLOBAL(RCT2_ADDRESS_ERROR_TYPE, uint8) = 255; RCT2_GLOBAL(RCT2_ADDRESS_ERROR_STRING_ID, uint16) = STR_FILE_CONTAINS_INVALID_DATA; From 8cf34ca662f1b1e48f37319647e8c47f0a14d41f Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 18 Aug 2015 11:58:47 +0200 Subject: [PATCH 0553/1173] Add option the Options window, clean up some string ids in that window --- src/localisation/string_ids.h | 30 +++++++++------ src/windows/options.c | 71 ++++++++++++++++++++--------------- 2 files changed, 59 insertions(+), 42 deletions(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 4dcb4c42f4..9dc99a6756 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1894,7 +1894,11 @@ enum { STR_GAME_SPEED_TIP = 5148, STR_CHEATS_TIP = 5149, + STR_ENABLE_DEBUGGING_TOOLS = 5150, + STR_EDIT_THEMES_BUTTON = 5153, STR_HARDWARE_DISPLAY = 5154, + STR_TEST_UNFINISHED_TRACKS = 5155, + STR_TEST_UNFINISHED_TRACKS_TIP = 5156, STR_TWITCH_NAME = 5164, STR_TWITCH_PEEP_FOLLOWERS = 5165, @@ -1920,12 +1924,17 @@ enum { STR_OPTIONS_CONTROLS_AND_INTERFACE_TIP = 5269, STR_OPTIONS_MISCELLANEOUS_TIP = 5270, STR_OPTIONS_TWITCH_TIP = 5271, - STR_CHEAT_SANDBOX_MODE = 5278, STR_CHEAT_SANDBOX_MODE_DISABLE = 5279, STR_CHEAT_SANDBOX_MODE_TIP = 5280, - STR_CHEAT_STAFF_SPEED = 5365, - STR_CHEAT_RESET_CRASH_STATUS = 5368, + + STR_TITLE_SEQUENCE = 5304, + STR_TITLE_SEQUENCE_RCT1 = 5305, + STR_TITLE_SEQUENCE_RCT1_AA = 5306, + STR_TITLE_SEQUENCE_RCT1_AA_LL = 5307, + STR_TITLE_SEQUENCE_RCT2 = 5308, + STR_TITLE_SEQUENCE_OPENRCT2 = 5309, + STR_TITLE_SEQUENCE_RANDOM = 5310, STR_DEBUG_TIP = 5311, STR_DEBUG_DROPDOWN_CONSOLE = 5312, @@ -1942,20 +1951,16 @@ enum { STR_TILE_INSPECTOR_FLAGS = 5341, STR_TILE_INSPECTOR_CHOOSE_MSG = 5342, - STR_CHANGELOG_TITLE = 5344, + STR_AUTO_STAFF_PLACEMENT = 5343, - STR_TITLE_SEQUENCE = 5304, - STR_TITLE_SEQUENCE_RCT1 = 5305, - STR_TITLE_SEQUENCE_RCT1_AA = 5306, - STR_TITLE_SEQUENCE_RCT1_AA_LL = 5307, - STR_TITLE_SEQUENCE_RCT2 = 5308, - STR_TITLE_SEQUENCE_OPENRCT2 = 5309, - STR_TITLE_SEQUENCE_RANDOM = 5310, + STR_CHANGELOG_TITLE = 5344, STR_MAX = 5350, STR_MIN = 5351, + STR_CHEAT_STAFF_SPEED = 5365, STR_NORMAL = 5366, STR_FAST = 5367, + STR_CHEAT_RESET_CRASH_STATUS = 5368, STR_INVERT_RIGHT_MOUSE_DRAG = 5372, @@ -1964,6 +1969,8 @@ enum { STR_UP = 5375, STR_DOWN = 5376, + STR_EDIT_TITLE_SEQUENCES_BUTTON = 5436, + STR_MININISE_FULL_SCREEN_ON_FOCUS_LOSS = 5440, STR_SELECT_BY_TRACK_TYPE_TIP = 5441, @@ -2047,6 +2054,7 @@ enum { STR_SHOW_MULTIPLAYER_STATUS_TIP = 5504, STR_UNABLE_TO_CONNECT_TO_SERVER = 5505, + STR_HANDYMEN_MOW_BY_DEFAULT = 5507, STR_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM = 5508, STR_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM_TIP = 5509, diff --git a/src/windows/options.c b/src/windows/options.c index 62acfdb030..a03519e94f 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -139,6 +139,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_TITLE_SEQUENCE, WIDX_TITLE_SEQUENCE_DROPDOWN, WIDX_TITLE_SEQUENCE_BUTTON, + WIDX_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM, // Twitch WIDX_CHANNEL_BUTTON = WIDX_PAGE_START, @@ -168,9 +169,9 @@ static rct_widget window_options_display_widgets[] = { MAIN_OPTIONS_WIDGETS, { WWT_GROUPBOX, 1, 5, 304, 53, 145, STR_HARDWARE_GROUP, STR_NONE }, // Hardware group { WWT_DROPDOWN, 1, 155, 299, 68, 79, STR_RESOLUTION_X_BY_Y, STR_NONE }, // resolution - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 69, 78, 876, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 69, 78, STR_DROPDOWN_GLYPH, STR_NONE }, { WWT_DROPDOWN, 1, 155, 299, 83, 94, 871, STR_NONE }, // fullscreen - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 84, 93, 876, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 84, 93, STR_DROPDOWN_GLYPH, STR_NONE }, { WWT_CHECKBOX, 1, 10, 290, 99, 110, STR_HARDWARE_DISPLAY, STR_NONE }, // hardware display { WWT_CHECKBOX, 1, 10, 290, 114, 125, STR_UNCAP_FPS, STR_NONE }, // uncap fps { WWT_CHECKBOX, 1, 10, 290, 129, 140, STR_MININISE_FULL_SCREEN_ON_FOCUS_LOSS, STR_NONE }, // minimise fullscreen focus loss @@ -179,7 +180,7 @@ static rct_widget window_options_display_widgets[] = { { WWT_CHECKBOX, 1, 10, 290, 164, 175, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, // landscape smoothing { WWT_CHECKBOX, 1, 10, 290, 179, 190, STR_GRIDLINES, STR_GRIDLINES_TIP }, // gridlines { WWT_DROPDOWN, 1, 155, 299, 193, 204, STR_NONE, STR_NONE }, // construction marker - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 194, 203, 876, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 194, 203, STR_DROPDOWN_GLYPH, STR_NONE }, { WWT_CHECKBOX, 1, 10, 290, 209, 220, STR_CYCLE_DAY_NIGHT, STR_NONE }, // cycle day-night { WWT_CHECKBOX, 1, 10, 290, 224, 235, STR_UPPER_CASE_BANNERS, STR_NONE }, // upper case banners { WIDGETS_END }, @@ -187,30 +188,30 @@ static rct_widget window_options_display_widgets[] = { static rct_widget window_options_culture_widgets[] = { MAIN_OPTIONS_WIDGETS, - { WWT_DROPDOWN, 1, 155, 299, 53, 64, STR_NONE, STR_NONE }, // language - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 54, 63, 876, STR_NONE }, - { WWT_DROPDOWN, 1, 155, 299, 68, 79, 871, STR_NONE }, // currency - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 69, 78, 876, STR_NONE }, // - { WWT_DROPDOWN, 1, 155, 299, 83, 94, 872, STR_NONE }, // distance - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 84, 93, 876, STR_NONE }, - { WWT_DROPDOWN, 1, 155, 299, 98, 110, 875, STR_NONE }, // temperature - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 99, 108, 876, STR_NONE }, - { WWT_DROPDOWN, 1, 155, 299, 113, 124, 868, STR_NONE }, // height labels - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 114, 123, 876, STR_NONE }, - { WWT_DROPDOWN, 1, 155, 299, 128, 139, STR_NONE, STR_NONE }, // date format - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 129, 138, 876, STR_NONE }, + { WWT_DROPDOWN, 1, 155, 299, 53, 64, STR_NONE, STR_NONE }, // language + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 54, 63, STR_DROPDOWN_GLYPH, STR_NONE }, + { WWT_DROPDOWN, 1, 155, 299, 68, 79, 871, STR_NONE }, // currency + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 69, 78, STR_DROPDOWN_GLYPH, STR_NONE }, // + { WWT_DROPDOWN, 1, 155, 299, 83, 94, 872, STR_NONE }, // distance + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 84, 93, STR_DROPDOWN_GLYPH, STR_NONE }, + { WWT_DROPDOWN, 1, 155, 299, 98, 110, 875, STR_NONE }, // temperature + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 99, 108, STR_DROPDOWN_GLYPH, STR_NONE }, + { WWT_DROPDOWN, 1, 155, 299, 113, 124, 868, STR_NONE }, // height labels + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 114, 123, STR_DROPDOWN_GLYPH, STR_NONE }, + { WWT_DROPDOWN, 1, 155, 299, 128, 139, STR_NONE, STR_NONE }, // date format + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 129, 138, STR_DROPDOWN_GLYPH, STR_NONE }, { WIDGETS_END }, }; static rct_widget window_options_audio_widgets[] = { MAIN_OPTIONS_WIDGETS, { WWT_DROPDOWN, 1, 10, 299, 53, 64, 865, STR_NONE }, // audio device - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 54, 63, 876, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 54, 63, STR_DROPDOWN_GLYPH, STR_NONE }, { WWT_CHECKBOX, 1, 10, 229, 69, 80, STR_SOUND, STR_NONE }, // enable / disable sound { WWT_CHECKBOX, 1, 10, 229, 84, 95, STR_MUSIC, STR_NONE }, // enable / disable music { WWT_CHECKBOX, 1, 10, 229, 98, 110, STR_AUDIO_FOCUS, STR_NONE }, // enable / disable audio disabled on focus lost { WWT_DROPDOWN, 1, 155, 299, 112, 124, STR_NONE, STR_NONE }, // title music - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 113, 123, 876, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 113, 123, STR_DROPDOWN_GLYPH, STR_NONE }, { WWT_SCROLL, 1, 155, 299, 68, 80, 1, STR_NONE }, // master volume { WWT_SCROLL, 1, 155, 299, 83, 95, 1, STR_NONE }, // music volume { WIDGETS_END }, @@ -225,8 +226,8 @@ static rct_widget window_options_controls_and_interface_widgets[] = { { WWT_GROUPBOX, 1, 5, 304, 118, 164, STR_THEMES_GROUP, STR_NONE }, // Toolbar buttons group { WWT_DROPDOWN, 1, 155, 299, 132, 143, STR_NONE, STR_NONE }, // Themes - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 133, 142, 876, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 10, 145, 148, 159, 5153, STR_NONE }, // Themes button + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 133, 142, STR_DROPDOWN_GLYPH, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 10, 145, 148, 159, STR_EDIT_THEMES_BUTTON, STR_NONE }, // Themes button { WWT_GROUPBOX, 1, 5, 304, 168, 230, STR_TOOLBAR_BUTTONS_GROUP, STR_NONE }, // Toolbar buttons group { WWT_CHECKBOX, 2, 10, 145, 199, 210, STR_FINANCES_BUTTON_ON_TOOLBAR, STR_NONE }, // Finances @@ -240,17 +241,18 @@ static rct_widget window_options_controls_and_interface_widgets[] = { static rct_widget window_options_misc_widgets[] = { MAIN_OPTIONS_WIDGETS, - { WWT_CHECKBOX, 2, 10, 299, 54, 65, STR_REAL_NAME, STR_REAL_NAME_TIP }, - { WWT_CHECKBOX, 2, 10, 299, 69, 80, STR_SAVE_PLUGIN_DATA, STR_SAVE_PLUGIN_DATA_TIP }, - { WWT_DROPDOWN, 1, 155, 299, 83, 94, STR_NONE, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 84, 93, 876, STR_NONE }, - { WWT_CHECKBOX, 2, 10, 299, 114, 125, 5155, 5156 }, // test unfinished tracks - { WWT_CHECKBOX, 2, 10, 299, 129, 140, 5343, STR_NONE }, // auto staff placement - { WWT_CHECKBOX, 2, 10, 299, 144, 155, 5507, STR_NONE }, // handymen mow by default - { WWT_CHECKBOX, 2, 10, 299, 159, 170, 5150, STR_NONE }, // enabled debugging tools - { WWT_DROPDOWN, 1, 155, 299, 173, 184, STR_NONE, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 174, 183, 876, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 26, 185, 189, 200, 5436, STR_NONE }, // Title sequences button + { WWT_CHECKBOX, 2, 10, 299, 54, 65, STR_REAL_NAME, STR_REAL_NAME_TIP }, + { WWT_CHECKBOX, 2, 10, 299, 69, 80, STR_SAVE_PLUGIN_DATA, STR_SAVE_PLUGIN_DATA_TIP }, + { WWT_DROPDOWN, 1, 155, 299, 83, 94, STR_NONE, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 84, 93, STR_DROPDOWN_GLYPH, STR_NONE }, + { WWT_CHECKBOX, 2, 10, 299, 114, 125, STR_TEST_UNFINISHED_TRACKS, STR_TEST_UNFINISHED_TRACKS_TIP }, // test unfinished tracks + { WWT_CHECKBOX, 2, 10, 299, 129, 140, STR_AUTO_STAFF_PLACEMENT, STR_NONE }, // auto staff placement + { WWT_CHECKBOX, 2, 10, 299, 144, 155, STR_HANDYMEN_MOW_BY_DEFAULT, STR_NONE }, // handymen mow by default + { WWT_CHECKBOX, 2, 10, 299, 159, 170, STR_ENABLE_DEBUGGING_TOOLS, STR_NONE }, // enable debugging tools + { WWT_DROPDOWN, 1, 155, 299, 173, 184, STR_NONE, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 174, 183, STR_DROPDOWN_GLYPH, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 26, 185, 189, 200, STR_EDIT_TITLE_SEQUENCES_BUTTON, STR_NONE }, // Title sequences button + { WWT_CHECKBOX, 2, 10, 299, 204, 215, STR_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM, STR_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM_TIP }, // Allow loading with incorrect checksum { WIDGETS_END }, }; @@ -404,7 +406,8 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_DEBUGGING_TOOLS) | (1 << WIDX_TITLE_SEQUENCE) | (1 << WIDX_TITLE_SEQUENCE_DROPDOWN) | - (1 << WIDX_TITLE_SEQUENCE_BUTTON), + (1 << WIDX_TITLE_SEQUENCE_BUTTON) | + (1 << WIDX_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM), MAIN_OPTIONS_ENABLED_WIDGETS | (1 << WIDX_CHANNEL_BUTTON) | @@ -625,6 +628,10 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) break; case WIDX_TITLE_SEQUENCE_BUTTON: window_title_editor_open(0); + break; + case WIDX_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM: + gConfigGeneral.allow_loading_with_incorrect_checksum = !gConfigGeneral.allow_loading_with_incorrect_checksum; + break; } break; @@ -1231,6 +1238,7 @@ static void window_options_invalidate(rct_window *w) widget_set_checkbox_value(w, WIDX_AUTO_STAFF_PLACEMENT, gConfigGeneral.auto_staff_placement); widget_set_checkbox_value(w, WIDX_HANDYMEN_MOW_DEFAULT, gConfigGeneral.handymen_mow_default); widget_set_checkbox_value(w, WIDX_DEBUGGING_TOOLS, gConfigGeneral.debugging_tools); + widget_set_checkbox_value(w, WIDX_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM, gConfigGeneral.allow_loading_with_incorrect_checksum); window_options_misc_widgets[WIDX_REAL_NAME_CHECKBOX].type = WWT_CHECKBOX; window_options_misc_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_CHECKBOX; @@ -1243,6 +1251,7 @@ static void window_options_invalidate(rct_window *w) window_options_misc_widgets[WIDX_TITLE_SEQUENCE].type = WWT_DROPDOWN; window_options_misc_widgets[WIDX_TITLE_SEQUENCE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; window_options_misc_widgets[WIDX_TITLE_SEQUENCE_BUTTON].type = WWT_DROPDOWN_BUTTON; + window_options_misc_widgets[WIDX_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM].type = WWT_CHECKBOX; break; case WINDOW_OPTIONS_PAGE_TWITCH: From e8cc1738cad251adb8f054414edadc89f853a762 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 18 Aug 2015 15:49:16 +0200 Subject: [PATCH 0554/1173] Fix saving of feature --- src/windows/options.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/windows/options.c b/src/windows/options.c index a03519e94f..8659a794eb 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -631,6 +631,8 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) break; case WIDX_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM: gConfigGeneral.allow_loading_with_incorrect_checksum = !gConfigGeneral.allow_loading_with_incorrect_checksum; + config_save_default(); + window_invalidate(w); break; } break; From 9c23414fbec2f171f8b702193695eb34b52225d5 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 18 Aug 2015 18:22:23 +0200 Subject: [PATCH 0555/1173] Keep the same orientation as in the preview when placing track, fixes #1817 --- src/windows/track_place.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/track_place.c b/src/windows/track_place.c index 22933ca5fc..4d61006534 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -393,7 +393,7 @@ void window_track_place_open() show_gridlines(); _window_track_place_last_cost = MONEY32_UNDEFINED; _window_track_place_last_x = 0xFFFF; - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = (-RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) & 3; + RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = (-RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8) + 2) & 3; window_track_place_draw_mini_preview(); } From 59202f97f86e7a9810f942b82efb244f28b936e6 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 18 Aug 2015 18:11:50 +0200 Subject: [PATCH 0556/1173] Make the string for 'Default audio device' translatable, fix comment --- data/language/english_uk.txt | 2 ++ src/audio/audio.c | 5 +++-- src/windows/options.c | 8 ++++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index f39d020b6a..bdeb3e3aa8 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3848,3 +3848,5 @@ STR_5506 :Guests ignore intensities STR_5507 :Handymen mow grass by default STR_5508 :Allow loading files with incorrect checksums STR_5509 :{SMALLFONT}{BLACK}Allows loading scenarios and saves that have an incorrect checksum, like the scenarios from the demo or damaged saves. +STR_5510 :Default sound device +STR_5511 :(UNKNOWN) diff --git a/src/audio/audio.c b/src/audio/audio.c index e16613cf7e..75e4be97d8 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -22,6 +22,7 @@ #include "../config.h" #include "../interface/viewport.h" #include "../interface/window.h" +#include "../localisation/language.h" #include "../platform/platform.h" #include "../ride/ride.h" #include "../world/map.h" @@ -69,11 +70,11 @@ void audio_get_devices() gAudioDeviceCount++; gAudioDevices = malloc(gAudioDeviceCount * sizeof(audio_device)); - strcpy(gAudioDevices[0].name, "Default sound device"); + strcpy(gAudioDevices[0].name, language_get_string(5510)); for (i = 1; i < gAudioDeviceCount; i++) { const char *utf8_name = SDL_GetAudioDeviceName(i - 1, SDL_FALSE); if (utf8_name == NULL) - utf8_name = "(UNKNOWN)"; + utf8_name = language_get_string(5511); strcpy(gAudioDevices[i].name, utf8_name); } diff --git a/src/windows/options.c b/src/windows/options.c index 8659a794eb..abdccf5799 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -1117,7 +1117,7 @@ static void window_options_invalidate(rct_window *w) widget_set_checkbox_value(w, WIDX_DAY_NIGHT_CHECKBOX, gConfigGeneral.day_night_cycle); widget_set_checkbox_value(w, WIDX_UPPER_CASE_BANNERS_CHECKBOX, gConfigGeneral.upper_case_banners); - // construction marker: celsius/fahrenheit + // construction marker: white/translucent window_options_display_widgets[WIDX_CONSTRUCTION_MARKER].image = STR_WHITE + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CONSTRUCTION_MARKER, uint8); window_options_display_widgets[WIDX_RESOLUTION].type = WWT_DROPDOWN; @@ -1170,7 +1170,11 @@ static void window_options_invalidate(rct_window *w) RCT2_GLOBAL(0x013CE952, uint16) = STR_SOUND_NONE; } else { - RCT2_GLOBAL(0x013CE952, uint16) = 1170; + if (currentSoundDevice == 0) + RCT2_GLOBAL(0x013CE952, uint16) = 5510; + else + RCT2_GLOBAL(0x013CE952, uint16) = 1170; + RCT2_GLOBAL(0x013CE952 + 2, uint32) = (uint32)gAudioDevices[currentSoundDevice].name; } From d9fdb0950a42de501dfff67fe34799791d0e37b4 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 18 Aug 2015 21:32:21 +0100 Subject: [PATCH 0557/1173] patch exe to remove DirectDraw, DirectInput and DirectPlay dependencies. --- openrct2.exe | Bin 6750208 -> 6750208 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/openrct2.exe b/openrct2.exe index 05cc265b46e3085a7fbac3287eb1c0f3b8c6e0c8..e5cfa10d401b432b02b9c3b7fcf596a8329552d7 100644 GIT binary patch delta 303 zcmXxYNiqXr96<3VArizCVjf~@^E@X+j0rjjjZe(<87zD8svO}fRTepfs=iE)V8PzP z-y*N-w|TDn;dB2{MmawGR8UEPDuRTlriNO=)KO0ZjWiLVnHHk7(ndQSbkapPJ@nE? zjD7|fWQbu*Mi^y`aVD5#ifLw;WsZ3kSY(N1R#;_?I0@F-Aju{vw%BHeUG~@~O@;#w zIl>~#F(;go(+ixDbiW+M1;H8dwd^F%EKqE~w6QqS!+GwYPPPzyYrkfsm>7$uj*e7Td(xVV6Br66~XKz#&H*ljMX` zQk1ECtkF|ZbCP|d;u+;QuDd$J}ZVP3Zf`V k;zrzxJ8>@_#G@#SCs#47?^ov~X?{BIKbGQpf33gZKPB5~R{#J2 From fc533c92c4d676ac60b959e37b1f16080a6f41f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 18 Aug 2015 09:30:55 +0200 Subject: [PATCH 0558/1173] Add switch to disable network at compile-time --- CMakeLists.txt | 10 ++++++++- build.sh | 7 +++++++ src/cmdline.c | 6 +++++- src/network/network.cpp | 27 +++++++++++++++++++++---- src/network/network.h | 45 ++++++++++++++++++++++++----------------- src/openrct2.c | 4 ++++ 6 files changed, 74 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 61c3331c74..104931660c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,11 @@ add_definitions(-DCURL_STATICLIB) #uncomment the line bellow if you don't want to build openrct2 with twitch integration #add_definitions(-DDISABLE_HTTP -DDISABLE_TWITCH) +option(DISABLE_NETWORK "Disable multiplayer functionality. Mainly for testing.") +if (DISABLE_NETWORK) + add_definitions(-DDISABLE_NETWORK) +endif (DISABLE_NETWORK) + set(ORCTLIBS_INCLUDE /usr/local/cross-tools/orctlibs/include) set(JANSSON_INCLUDE /usr/local/cross-tools/orctlibs/include/jansson) set(ORCTLIBS_LIB_DIR /usr/local/cross-tools/orctlibs/lib) @@ -44,7 +49,10 @@ file(GLOB_RECURSE ORCT2_SOURCES "src/*.c" "src/*.cpp" "lib/*.c") if (UNIX) # force 32bit build for now and set necessary flags to compile code as is set(CMAKE_C_FLAGS "-m32 -masm=intel -std=gnu99") - set(CMAKE_LDFLAGS_FLAGS "-m32") + set(CMAKE_CXX_FLAGS "-m32 -std=gnu++11 -masm=intel") + set(LIB32 /usr/lib32) + set(CMAKE_SHARED_LINKER_FLAGS "-m32 -Wl,-melf_i386 -L${LIB32} -lSDL2_ttf") + set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}) # find and include SDL2 INCLUDE(FindPkgConfig) diff --git a/build.sh b/build.sh index 14ba600e14..baea40c003 100755 --- a/build.sh +++ b/build.sh @@ -8,6 +8,9 @@ mkdir -p $cachedir if [[ ! -d build ]]; then mkdir -p build fi +if [[ ! -d build_nonet ]]; then + mkdir -p build_nonet +fi libversion=2 libVFile="./libversion" @@ -58,6 +61,10 @@ pushd build cmake -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt -DCMAKE_BUILD_TYPE=Debug .. make popd +pushd build_nonet + cmake -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt -DCMAKE_BUILD_TYPE=Debug -DDISABLE_NETWORK=ON .. + make +popd if [[ ! -h openrct2.dll ]]; then ln -s build/openrct2.dll openrct2.dll diff --git a/src/cmdline.c b/src/cmdline.c index 10d0b78169..a5678a896a 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -46,9 +46,11 @@ typedef int (*cmdline_action)(const char **argv, int argc); int gExitCode = 0; +#ifndef DISABLE_NETWORK int gNetworkStart = NETWORK_MODE_NONE; char gNetworkStartHost[128]; int gNetworkStartPort = NETWORK_DEFAULT_PORT; +#endif // DISABLE_NETWORK static void print_launch_information(); static int cmdline_call_action(const char **argv, int argc); @@ -96,6 +98,7 @@ int cmdline_run(const char **argv, int argc) if (verbose) _log_levels[DIAGNOSTIC_LEVEL_VERBOSE] = 1; +#ifndef DISABLE_NETWORK if (port != 0) { gNetworkStart = NETWORK_MODE_SERVER; gNetworkStartPort = port; @@ -105,6 +108,7 @@ int cmdline_run(const char **argv, int argc) gNetworkStart = NETWORK_MODE_CLIENT; strncpy(gNetworkStartHost, server, sizeof(gNetworkStartHost)); } +#endif // DISABLE_NETWORK if (argc != 0) { gExitCode = cmdline_call_action(argv, argc); @@ -188,4 +192,4 @@ static int cmdline_call_action(const char **argv, int argc) } return cmdline_for_none(argv, argc); -} \ No newline at end of file +} diff --git a/src/network/network.cpp b/src/network/network.cpp index 4645a0caae..f72cf1478f 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -18,14 +18,18 @@ * along with this program. If not, see . *****************************************************************************/ +#include "network.h" + +extern "C" { +#include "../addresses.h" +} + #ifndef DISABLE_NETWORK #include #include #include -#include "network.h" extern "C" { -#include "../addresses.h" #include "../config.h" #include "../game.h" #include "../interface/chat.h" @@ -566,7 +570,7 @@ void Network::Server_Send_MAP(NetworkConnection* connection) int size = (int)SDL_RWtell(rw); int chunksize = 1000; for (int i = 0; i < size; i += chunksize) { - int datasize = min(chunksize, size - i); + int datasize = std::min(chunksize, size - i); std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_MAP << (uint32)size << (uint32)i; packet->Write(&buffer[i], datasize); @@ -1099,4 +1103,19 @@ void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 } } -#endif /* DISABLE_NETWORK */ \ No newline at end of file +#else +int network_get_mode() { return NETWORK_MODE_NONE; } +void network_tick() {} +uint32 network_get_server_tick() { return RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); } +void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback) {} +void network_send_map() {} +void network_update() {} +int network_begin_client(const char *host, int port) { return 1; } +int network_begin_server(int port) { return 1; } +int network_get_num_players() { return 1; } +const char* network_get_player_name(unsigned int index) { return "local (OpenRCT2 compiled without MP)"; } +uint32 network_get_player_flags(unsigned int index) { return 0; } +int network_get_player_ping(unsigned int index) { return 0; } +void network_send_chat(const char* text) {} +void network_close() {} +#endif /* DISABLE_NETWORK */ diff --git a/src/network/network.h b/src/network/network.h index d3fb166cac..8fbb0092fc 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -21,16 +21,29 @@ #ifndef _NETWORK_H_ #define _NETWORK_H_ -#ifndef DISABLE_NETWORK - -#define NETWORK_DEFAULT_PORT 11753 - enum { NETWORK_MODE_NONE, NETWORK_MODE_CLIENT, NETWORK_MODE_SERVER }; +enum { + NETWORK_PLAYER_FLAG_ISSERVER = 1 << 0, +}; + +#define NETWORK_DEFAULT_PORT 11753 + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus +#include "../common.h" +#include "../platform/platform.h" +#ifdef __cplusplus +} +#endif // __cplusplus + +#ifndef DISABLE_NETWORK + enum { NETWORK_AUTH_NONE, NETWORK_AUTH_REQUESTED, @@ -40,20 +53,13 @@ enum { NETWORK_AUTH_BADPASSWORD }; -enum { - NETWORK_PLAYER_FLAG_ISSERVER = 1 << 0, -}; - #ifdef __cplusplus #include +#include #include #include #include -extern "C" { -#include "../common.h" -#include "../platform/platform.h" -} template struct ByteSwapT { }; @@ -215,17 +221,20 @@ private: int Server_Handle_READY(NetworkConnection& connection, NetworkPacket& packet); }; -extern "C" { -#endif +#endif // __cplusplus +#endif /* DISABLE_NETWORK */ +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus int network_init(); void network_close(); int network_begin_client(const char *host, int port); int network_begin_server(int port); +int network_get_mode(); void network_update(); void network_tick(); -int network_get_mode(); int network_get_authstatus(); uint32 network_get_server_tick(); uint8 network_get_player_id(); @@ -242,8 +251,6 @@ void network_print_error(); #ifdef __cplusplus } +#endif // __cplusplus + #endif - -#endif /* DISABLE_NETWORK */ - -#endif \ No newline at end of file diff --git a/src/openrct2.c b/src/openrct2.c index 14e8aae5d3..e0b5ade765 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -245,9 +245,11 @@ void openrct2_launch() RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_PLAYING; +#ifndef DISABLE_NETWORK if (gNetworkStart == NETWORK_MODE_SERVER) { network_begin_server(gNetworkStartPort); } +#endif // DISABLE_NETWORK break; case STARTUP_ACTION_EDIT: if (strlen(gOpenRCT2StartupActionPath) == 0) { @@ -258,9 +260,11 @@ void openrct2_launch() break; } +#ifndef DISABLE_NETWORK if (gNetworkStart == NETWORK_MODE_CLIENT) { network_begin_client(gNetworkStartHost, gNetworkStartPort); } +#endif // DISABLE_NETWORK openrct2_loop(); } From f836590a1803cab9e532571b63e8c00286a50ce9 Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 19 Aug 2015 04:00:15 +0100 Subject: [PATCH 0559/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/russian.txt | 48 +++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/data/language/russian.txt b/data/language/russian.txt index e883082a54..393a9746b7 100644 --- a/data/language/russian.txt +++ b/data/language/russian.txt @@ -84,7 +84,7 @@ STR_0079 :Ковёр-самолёт STR_0080 :Заплыв на подводной лодке STR_0081 :Речной рафтинг STR_0082 :Неизвесный атракцион (50) -STR_0083 :Цинтрефуга +STR_0083 :Центрефуга STR_0084 :Неизвестный атракцион (52) STR_0085 :Неизвестный атракцион (53) STR_0086 :Неизвестный атракцион (54) @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. -STR_0513 :A looping roller coaster where the riders ride in a standing position -STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners -STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements -STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides -STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track -STR_0518 :Passengers travel in electric trains along a monorail track -STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners -STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water -STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. -STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them -STR_0523 :Riders travel slowly in powered vehicles along a track-based route -STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down -STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track -STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower -STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops -STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track -STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track -STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again -STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops +STR_0512 :Компактные горки со спиральными подъёмом и плавными, кручёными выпадами. +STR_0513 :Петляющие горки, на которых люди едут в стоячем положении. +STR_0514 :Дно вагонеток раскачивается по пути, прыжимаясь к сторонам на поворотах. +STR_0515 :Стальные горки с вагонетками, которые прикриплены к треку, с множеством сложных и закрученых элементов. +STR_0516 :Мягкие горки для людей, которых ещё не хватает духа, чтобы столкнутся с большими заездами. +STR_0517 :Пассажиры едут в поездах по узко-калиберной железной дороге. +STR_0518 :Пассажиры путишествуют в электрических поездах по морельсовой дороге. +STR_0519 :Пассажиры едут в меленьких машинках, удерживающихся за одно-рельсовую дорогу, свободно раскачиваясь из стороны в сторону около поворотов. +STR_0520 :Причал, где гости могут кататься/грести на личных водных судах по водному пространству. +STR_0521 :Быстрые и закрученые горки, с жёсткими поворотами и крутыми выпадами. Обязательно высокая интенсивновсть. +STR_0522 :Небольшие горки, где посетители сидят над путями без вагонетонетки около них. +STR_0523 :Пассажири неспеша путишествуют в электро-мобилях по маршруту, основаному на треке. +STR_0524 :Капсула свободного падения пневматически запускается вверх по высокой стальной башне и потом переходит в свободное подение. +STR_0525 :Пассажиры быстро движутся вниз по закрученому пути, направляемые только кривизной и виражами полу-круглого трека. +STR_0526 :Пассажиры поднимаются во вращающейся кабине для обозрения, которая поднимается по высокой башне. +STR_0527 :Плавные стальные горки с мёртвыми петлями. +STR_0528 :Пассажири сплавляются на надувныъ шлюпках по извилистому полу-круглому треку, или по полностью закрытой трубе. +STR_0529 :Стилизованые под шахтёрские вагонетки вогончики быстро едут по стальным горкам, который выглядит, как старая железная дорога. +STR_0530 :Прикреплённые вагонетки к стальному кабелю, которые едут из одного конца трассы к другому, и обратно. +STR_0531 :Компактные горки со стальными путями, по которым вагончики едут через штопоры и мёртвые петли. STR_0532 : STR_0533 : -STR_0534 :Self-drive petrol-engined go karts -STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders -STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids +STR_0534 :Само-управляемые моторные машинки. +STR_0535 :Бревнообразные лодки плывут по водному каналу, создавая брызги на крутых склонах, чтобы намочить пассажиров. +STR_0536 :Круглые лодочки извилисто плывут по широкому водному каналу, обрызгивая через водопады и тряся пассажиров на пенящимся порогам. STR_0537 : STR_0538 : STR_0539 : From 4207b41855a13d2f099a5d13cab16121dbaa7b87 Mon Sep 17 00:00:00 2001 From: medsouz Date: Tue, 18 Aug 2015 23:53:24 -0400 Subject: [PATCH 0560/1173] Name more addresses --- src/addresses.h | 4 +++- src/windows/top_toolbar.c | 18 +++++++++--------- src/world/map.c | 6 +++--- src/world/scenery.c | 8 ++++---- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 8421dce109..3c96cec4e4 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -350,10 +350,11 @@ #define RCT2_ADDRESS_TRACK_LIST 0x00F441EC #define RCT2_ADDRESS_SCENERY_COST 0x00F64EB4 - +#define RCT2_ADDRESS_SCENERY_MAP_ELEMENT 0x00F64EBC #define RCT2_ADDRESS_GHOST_SCENERY_X 0x00F64EC4 #define RCT2_ADDRESS_GHOST_SCENERY_Y 0x00F64EC6 #define RCT2_ADDRESS_GHOST_SCENERY_Z 0x00F64F09 +#define RCT2_ADDRESS_SCENERY_MAP_ELEMENT_TYPE 0x00F64F0C #define RCT2_ADDRESS_GHOST_SCENERY_TYPE 0x00F64F0D #define RCT2_ADDRESS_CTRL_PRESS_Z_COORDINATE 0x00F64ECC @@ -361,6 +362,7 @@ #define RCT2_ADDRESS_SHIFT_PRESS_Y_COORDINATE 0x00F64ED0 #define RCT2_ADDRESS_SHIFT_PRESS_Z_VECTOR 0x00F64ED2 #define RCT2_ADDRESS_SCENERY_Z_COORDINATE 0x00F64ED4 +#define RCT2_ADDRESS_SCENERY_SELECTED_OBJECT 0x00F64EDA #define RCT2_ADDRESS_SCENERY_TOOL_CTRL_PRESSED 0x00F64F12 #define RCT2_ADDRESS_SCENERY_TOOL_SHIFT_PRESSED 0x00F64F13 diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index b4c634c9ba..9aa804c3b6 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -2091,11 +2091,11 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) = map_tile.x; RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; RCT2_GLOBAL(0x00F64EC0, uint16) = (uint16)(parameter_3 & 0xFFFF); - RCT2_GLOBAL(0x00F64EDA, sint16) = selected_tab; - - mapElement = RCT2_GLOBAL(0x00F64EBC, rct_map_element*); + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_SELECTED_OBJECT, sint16) = selected_tab; + + mapElement = RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT, rct_map_element*); RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = mapElement->base_height; - RCT2_GLOBAL(0x00F64F0C, uint8) = mapElement->type; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT_TYPE, uint8) = mapElement->type; if (RCT2_GLOBAL(0x00F64F14, uint8) & (1 << 1)){ viewport_set_visibility(4); } @@ -2148,7 +2148,7 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; RCT2_GLOBAL(0x00F64F11, uint8) = (parameter_2 & 0xFF); - mapElement = RCT2_GLOBAL(0x00F64EBC, rct_map_element*); + mapElement = RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT, rct_map_element*); RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = mapElement->base_height; RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) |= (1 << 2); @@ -2172,7 +2172,7 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; RCT2_GLOBAL(0x00F64EC0, uint8) = ((parameter_1 >> 8) & 0xFF); - mapElement = RCT2_GLOBAL(0x00F64EBC, rct_map_element*); + mapElement = RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT, rct_map_element*); RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = mapElement->base_height; if (RCT2_GLOBAL(0x00F64F14, uint8) & (1 << 1)){ @@ -2269,7 +2269,7 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ mapTile.y == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) && (parameter2 & 0xFF) == RCT2_GLOBAL(0x00F64F0E, uint8)&& RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) == RCT2_GLOBAL(0x00F64F0A, sint16) && - RCT2_GLOBAL(0x00F64EDA, uint16) == selected_tab){ + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_SELECTED_OBJECT, uint16) == selected_tab){ return; } @@ -2404,13 +2404,13 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ mapTile.x == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) && mapTile.y == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) && RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) == RCT2_GLOBAL(0x00F64F0A, sint16) && - (parameter3 & 0xFFFF) == RCT2_GLOBAL(0x00F64EDA, uint16)){ + (parameter3 & 0xFFFF) == RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_SELECTED_OBJECT, uint16)){ return; } scenery_remove_ghost_tool_placement(); - RCT2_GLOBAL(0x00F64EDA, uint16) = (parameter3 & 0xFFFF); + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_SELECTED_OBJECT, uint16) = (parameter3 & 0xFFFF); RCT2_GLOBAL(0x00F64F0A, sint16) = RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16); bl = 1; diff --git a/src/world/map.c b/src/world/map.c index f144dda8d7..ad481c3e00 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2383,7 +2383,7 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi if(*ebx & GAME_COMMAND_FLAG_APPLY){ int flags = (bl & 0xf); rct_map_element* new_map_element = map_element_insert(x / 32, y / 32, zLow, flags); - RCT2_GLOBAL(0x00F64EBC, rct_map_element*) = new_map_element; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT, rct_map_element*) = new_map_element; uint8 type = quadrant << 6; type |= MAP_ELEMENT_TYPE_SCENERY; type |= rotation; @@ -2681,7 +2681,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, map_element->flags |= MAP_ELEMENT_FLAG_GHOST; } - RCT2_GLOBAL(0x00F64EBC, rct_map_element*) = map_element; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT, rct_map_element*) = map_element; map_invalidate_tile_zoom1(position.x, position.y, map_element->base_height * 8, map_element->base_height * 8 + 72); } @@ -2897,7 +2897,7 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in new_map_element->flags |= MAP_ELEMENT_FLAG_GHOST; } if(tile_num == 0){ - RCT2_GLOBAL(0x00F64EBC, rct_map_element*) = new_map_element; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT, rct_map_element*) = new_map_element; } map_invalidate_tile_full(x2, y2); } diff --git a/src/world/scenery.c b/src/world/scenery.c index fabf42ff24..dae85db385 100644 --- a/src/world/scenery.c +++ b/src/world/scenery.c @@ -126,9 +126,9 @@ void scenery_remove_ghost_tool_placement(){ RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 0); game_do_command( x, - 105 | (RCT2_GLOBAL(0x00F64F0C, uint8) << 8), + 105 | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT_TYPE, uint8) << 8), y, - z | (RCT2_GLOBAL(0x00F64EDA, uint8) << 8), + z | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_SELECTED_OBJECT, uint8) << 8), GAME_COMMAND_REMOVE_SCENERY, 0, 0); @@ -161,7 +161,7 @@ void scenery_remove_ghost_tool_placement(){ RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 2); game_do_command( x, - 105 | (RCT2_GLOBAL(0x00F64F0C, uint8) << 8), + 105 | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT_TYPE, uint8) << 8), y, RCT2_GLOBAL(0x00F64F11, uint8) |(z << 8), GAME_COMMAND_REMOVE_FENCE, @@ -173,7 +173,7 @@ void scenery_remove_ghost_tool_placement(){ RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 3); game_do_command( x, - 105 | (RCT2_GLOBAL(0x00F64EC0, uint8) << 8), + 105 | (RCT2_GLOBAL(0x00F64EC0 /* rotation? */, uint8) << 8), y, z, GAME_COMMAND_REMOVE_LARGE_SCENERY, From 408628c80caa17159291e359c0bbdf7928752a2b Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 19 Aug 2015 07:47:21 +0100 Subject: [PATCH 0561/1173] fix building on VS --- src/network/network.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index f72cf1478f..2f9ab7a07d 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -570,7 +570,7 @@ void Network::Server_Send_MAP(NetworkConnection* connection) int size = (int)SDL_RWtell(rw); int chunksize = 1000; for (int i = 0; i < size; i += chunksize) { - int datasize = std::min(chunksize, size - i); + int datasize = min(chunksize, size - i); std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_MAP << (uint32)size << (uint32)i; packet->Write(&buffer[i], datasize); From fb5921db6db2abdf355bd718f1b215a36a513bf2 Mon Sep 17 00:00:00 2001 From: Runelaenen Date: Wed, 19 Aug 2015 18:07:04 +0200 Subject: [PATCH 0562/1173] First headless version --- projects/openrct2.vcxproj.user | 3 +- src/audio/audio.c | 3 +- src/cmdline.c | 6 +- src/input.c | 3 +- src/platform/shared.c | 101 +++++++++++++++++---------------- src/ride/vehicle.c | 3 +- src/world/map.c | 3 +- 7 files changed, 67 insertions(+), 55 deletions(-) diff --git a/projects/openrct2.vcxproj.user b/projects/openrct2.vcxproj.user index 60b61f231a..4a59b98e42 100644 --- a/projects/openrct2.vcxproj.user +++ b/projects/openrct2.vcxproj.user @@ -12,8 +12,7 @@ $(TargetDir) WindowsLocalDebugger $(TargetDir)\openrct2.exe - - + "D:\Users\Rune\Documents\OpenRCT2\save\New York City - Liberty Island.sv6" --headless --verbose --port=5555 $(TargetDir) diff --git a/src/audio/audio.c b/src/audio/audio.c index 75e4be97d8..4418a6e017 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -29,6 +29,7 @@ #include "../world/sprite.h" #include "audio.h" #include "mixer.h" +#include "../openrct2.h" int gAudioDeviceCount; audio_device *gAudioDevices = NULL; @@ -1835,7 +1836,7 @@ void unpause_sounds() */ void stop_vehicle_sounds() { - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) != -1) { + if (!gOpenRCT2Headless && RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) != -1) { for (int i = 0; i < countof(gVehicleSoundList)/*7*/; i++) { rct_vehicle_sound* vehicle_sound = &gVehicleSoundList[i]; //rct_vehicle_sound* vehicle_sound = &RCT2_ADDRESS(RCT2_ADDRESS_VEHICLE_SOUND_LIST, rct_vehicle_sound)[i]; diff --git a/src/cmdline.c b/src/cmdline.c index a5678a896a..70c5a48996 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -71,12 +71,13 @@ static const char *const usage[] = { int cmdline_run(const char **argv, int argc) { // - int version = 0, verbose = 0, width = 0, height = 0, port = 0; + int version = 0, headless = 0, verbose = 0, width = 0, height = 0, port = 0; char *server = NULL; argparse_option_t options[] = { OPT_HELP(), OPT_BOOLEAN('v', "version", &version, "show version information and exit"), + OPT_BOOLEAN(0, "headless", &headless, "run OpenRCT2 headless"), OPT_BOOLEAN(0, "verbose", &verbose, "log verbose messages"), OPT_INTEGER('m', "mode", &sprite_mode, "the type of sprite conversion. 0 = default, 1 = simple closest pixel match, 2 = dithering"), OPT_STRING(0, "server", &server, "server to connect to"), @@ -95,6 +96,9 @@ int cmdline_run(const char **argv, int argc) return 0; } + if (headless) + gOpenRCT2Headless = true; + if (verbose) _log_levels[DIAGNOSTIC_LEVEL_VERBOSE] = 1; diff --git a/src/input.c b/src/input.c index fd7c50010b..04b0db3b39 100644 --- a/src/input.c +++ b/src/input.c @@ -42,6 +42,7 @@ #include "world/map.h" #include "world/sprite.h" #include "world/scenery.h" +#include "openrct2.h" static int _dragX, _dragY; static rct_windowclass _dragWindowClass; @@ -1331,7 +1332,7 @@ void game_handle_keyboard_input() // Handle key input - while ((key = get_next_key()) != 0) { + while (!gOpenRCT2Headless && (key = get_next_key()) != 0) { if (key == 255) continue; diff --git a/src/platform/shared.c b/src/platform/shared.c index 75e9efe81c..4e6572e199 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -184,59 +184,64 @@ void platform_draw() int width = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); int height = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16); - if (gConfigGeneral.hardware_display) { - void *pixels; - int pitch; - if (SDL_LockTexture(gBufferTexture, NULL, &pixels, &pitch) == 0) { - uint8 *src = (uint8*)_screenBuffer; - int padding = pitch - (width * 4); - if (pitch == width * 4) { - uint32 *dst = pixels; - for (int i = width * height; i > 0; i--) { *dst++ = *(uint32 *)(&gPaletteHWMapped[*src++]); } - } else - if (pitch == (width * 2) + padding) { - uint16 *dst = pixels; - for (int y = height; y > 0; y++) { - for (int x = width; x > 0; x--) { *dst++ = *(uint16 *)(&gPaletteHWMapped[*src++]); } - dst = (uint16*)(((uint8 *)dst) + padding); + if (!gOpenRCT2Headless) { + if (gConfigGeneral.hardware_display) { + void *pixels; + int pitch; + if (SDL_LockTexture(gBufferTexture, NULL, &pixels, &pitch) == 0) { + uint8 *src = (uint8*)_screenBuffer; + int padding = pitch - (width * 4); + if (pitch == width * 4) { + uint32 *dst = pixels; + for (int i = width * height; i > 0; i--) { *dst++ = *(uint32 *)(&gPaletteHWMapped[*src++]); } } - } else - if (pitch == width + padding) { - uint8 *dst = pixels; - for (int y = height; y > 0; y++) { - for (int x = width; x > 0; x--) { *dst++ = *(uint8 *)(&gPaletteHWMapped[*src++]); } - dst += padding; + else + if (pitch == (width * 2) + padding) { + uint16 *dst = pixels; + for (int y = height; y > 0; y++) { + for (int x = width; x > 0; x--) { *dst++ = *(uint16 *)(&gPaletteHWMapped[*src++]); } + dst = (uint16*)(((uint8 *)dst) + padding); + } + } + else + if (pitch == width + padding) { + uint8 *dst = pixels; + for (int y = height; y > 0; y++) { + for (int x = width; x > 0; x--) { *dst++ = *(uint8 *)(&gPaletteHWMapped[*src++]); } + dst += padding; + } + } + SDL_UnlockTexture(gBufferTexture); + } + + SDL_RenderCopy(gRenderer, gBufferTexture, NULL, NULL); + SDL_RenderPresent(gRenderer); + } + else { + // Lock the surface before setting its pixels + if (SDL_MUSTLOCK(_surface)) { + if (SDL_LockSurface(_surface) < 0) { + log_error("locking failed %s", SDL_GetError()); + return; } } - SDL_UnlockTexture(gBufferTexture); - } - SDL_RenderCopy(gRenderer, gBufferTexture, NULL, NULL); - SDL_RenderPresent(gRenderer); - } else { - // Lock the surface before setting its pixels - if (SDL_MUSTLOCK(_surface)) { - if (SDL_LockSurface(_surface) < 0) { - log_error("locking failed %s", SDL_GetError()); - return; + // Copy pixels from the virtual screen buffer to the surface + memcpy(_surface->pixels, _screenBuffer, _surface->pitch * _surface->h); + + // Unlock the surface + if (SDL_MUSTLOCK(_surface)) + SDL_UnlockSurface(_surface); + + // Copy the surface to the window + if (SDL_BlitSurface(_surface, NULL, SDL_GetWindowSurface(gWindow), NULL)) { + log_fatal("SDL_BlitSurface %s", SDL_GetError()); + exit(1); + } + if (SDL_UpdateWindowSurface(gWindow)) { + log_fatal("SDL_UpdateWindowSurface %s", SDL_GetError()); + exit(1); } - } - - // Copy pixels from the virtual screen buffer to the surface - memcpy(_surface->pixels, _screenBuffer, _surface->pitch * _surface->h); - - // Unlock the surface - if (SDL_MUSTLOCK(_surface)) - SDL_UnlockSurface(_surface); - - // Copy the surface to the window - if (SDL_BlitSurface(_surface, NULL, SDL_GetWindowSurface(gWindow), NULL)) { - log_fatal("SDL_BlitSurface %s", SDL_GetError()); - exit(1); - } - if (SDL_UpdateWindowSurface(gWindow)) { - log_fatal("SDL_UpdateWindowSurface %s", SDL_GetError()); - exit(1); } } } diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index 6b8dcfa672..f3647fe600 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -27,6 +27,7 @@ #include "ride.h" #include "ride_data.h" #include "vehicle.h" +#include "../openrct2.h" static void vehicle_update(rct_vehicle *vehicle); @@ -167,7 +168,7 @@ int sub_6BC2F3(rct_vehicle* vehicle) */ void vehicle_sounds_update() { - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) != -1 && !gGameSoundsOff && gConfigSound.sound) { + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) != -1 && !gGameSoundsOff && gConfigSound.sound && !gOpenRCT2Headless) { RCT2_GLOBAL(0x00F438A4, rct_viewport*) = (rct_viewport*)-1; rct_viewport* viewport = (rct_viewport*)-1; rct_window* window = RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); diff --git a/src/world/map.c b/src/world/map.c index f144dda8d7..1342e3a536 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -36,6 +36,7 @@ #include "map_animation.h" #include "park.h" #include "scenery.h" +#include "../openrct2.h" /* Replaces 0x00993CCC & 0x00993CCE */ const rct_xy16 TileDirectionDelta[] = { @@ -3847,7 +3848,7 @@ void map_invalidate_tile_under_zoom(int x, int y, int z0, int z1, int maxZoom) y2 = y + 32 - z0; viewport = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); - while (viewport->width != 0) { + while (!gOpenRCT2Headless && viewport->width != 0) { if (maxZoom == -1 || viewport->zoom <= maxZoom) { viewport_invalidate(viewport, x1, y1, x2, y2); } From fe0e1d1207b7efcfb2897794dde36f4c17f5c9aa Mon Sep 17 00:00:00 2001 From: Runelaenen Date: Wed, 19 Aug 2015 18:10:08 +0200 Subject: [PATCH 0563/1173] arguments --- projects/openrct2.vcxproj.user | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/openrct2.vcxproj.user b/projects/openrct2.vcxproj.user index 4a59b98e42..e10da7a3ba 100644 --- a/projects/openrct2.vcxproj.user +++ b/projects/openrct2.vcxproj.user @@ -12,7 +12,7 @@ $(TargetDir) WindowsLocalDebugger $(TargetDir)\openrct2.exe - "D:\Users\Rune\Documents\OpenRCT2\save\New York City - Liberty Island.sv6" --headless --verbose --port=5555 + $(TargetDir) From d34a446d6105727fc0a21c0dac6447fa964e9520 Mon Sep 17 00:00:00 2001 From: Runelaenen Date: Wed, 19 Aug 2015 21:54:25 +0200 Subject: [PATCH 0564/1173] Easier saving Replace Save game functionality and add 'save game as' function --- data/language/english_uk.txt | 3 +- src/game.c | 41 +++++++++++++---------- src/game.h | 1 + src/localisation/string_ids.h | 3 +- src/scenario.c | 5 +-- src/scenario.h | 1 + src/windows/loadsave.c | 9 +++++ src/windows/save_prompt.c | 2 +- src/windows/top_toolbar.c | 63 +++++++++++++++++++++-------------- 9 files changed, 80 insertions(+), 48 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index bdeb3e3aa8..eaddffc88d 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -885,7 +885,7 @@ STR_0879 :Can't lower land here... STR_0880 :Can't raise land here... STR_0881 :Object in the way STR_0882 :Load Game -STR_0883 :Save Game +STR_0883 :Save Game as STR_0884 :Load Landscape STR_0885 :Save Landscape STR_0886 :Quit Game @@ -3850,3 +3850,4 @@ STR_5508 :Allow loading files with incorrect checksums STR_5509 :{SMALLFONT}{BLACK}Allows loading scenarios and saves that have an incorrect checksum, like the scenarios from the demo or damaged saves. STR_5510 :Default sound device STR_5511 :(UNKNOWN) +STR_5512 :Save game diff --git a/src/game.c b/src/game.c index e41de01196..60dddf34f5 100644 --- a/src/game.c +++ b/src/game.c @@ -990,32 +990,37 @@ static int show_save_game_dialog(char *resultPath) int save_game() { - window_loadsave_open(LOADSAVETYPE_SAVE | LOADSAVETYPE_GAME, gScenarioSaveName); - return 0; + if (!gFirstTimeSave) { + utf8 path[MAX_PATH]; - char path[256]; + log_error("Saving to %s", gScenarioSaveName); + + platform_get_user_directory(path, "save"); + + strcat(path, gScenarioSaveName); + strcat(path, ".sv6"); + + SDL_RWops* rw = platform_sdl_rwfromfile(path, "wb+"); + if (rw != NULL) { + scenario_save(rw, 0x80000000); + log_error("Saved to %s", gScenarioSaveName); + SDL_RWclose(rw); + } - if (!show_save_game_dialog(path)) { - gfx_invalidate_screen(); return 0; } - - // Ensure path has .SV6 extension - path_set_extension(path, ".SV6"); - - SDL_RWops* rw = platform_sdl_rwfromfile(path, "wb+"); - if (rw != NULL) { - int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 1 : 0); - SDL_RWclose(rw); - if (success) { - game_do_command(0, 1047, 0, -1, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); - gfx_invalidate_screen(); - return 1; - } + else { + save_game_as(); } + +} +int save_game_as() +{ + window_loadsave_open(LOADSAVETYPE_SAVE | LOADSAVETYPE_GAME, gScenarioSaveName); return 0; } + void game_autosave() { utf8 path[MAX_PATH]; diff --git a/src/game.h b/src/game.h index be95fcd879..7516ea50b6 100644 --- a/src/game.h +++ b/src/game.h @@ -133,6 +133,7 @@ void game_load_init(); void game_pause_toggle(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void pause_toggle(); int save_game(); +int save_game_as(); void rct2_exit(); void rct2_exit_reason(rct_string_id title, rct_string_id body); void game_autosave(); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 9dc99a6756..f1ab68af8f 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -114,7 +114,8 @@ enum { STR_CANT_RAISE_LAND_HERE = 880, STR_LOAD_GAME = 882, - STR_SAVE_GAME = 883, + STR_SAVE_GAME_AS = 883, + STR_SAVE_GAME = 5512, STR_LOAD_LANDSCAPE = 884, STR_SAVE_LANDSCAPE = 885, STR_QUIT_GAME = 886, diff --git a/src/scenario.c b/src/scenario.c index 925071bb7f..39e15eeb22 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -48,6 +48,7 @@ static char _scenarioPath[MAX_PATH]; static const char *_scenarioFileName; char gScenarioSaveName[MAX_PATH]; +int gFirstTimeSave = 1; static int scenario_create_ducks(); static void scenario_objective_check(); @@ -906,9 +907,9 @@ int scenario_save(SDL_RWops* rw, int flags) int viewX, viewY, viewZoom, viewRotation; if (flags & 2) - log_verbose("saving scenario"); + log_error("saving scenario"); else - log_verbose("saving game"); + log_error("saving game"); if (!(flags & 0x80000000)) diff --git a/src/scenario.h b/src/scenario.h index 80df725b6f..a11a2cf9dc 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -413,6 +413,7 @@ extern int gScenarioListCapacity; extern rct_scenario_basic *gScenarioList; extern char gScenarioSaveName[MAX_PATH]; +extern int gFirstTimeSave; int scenario_scores_save(); void scenario_load_list(); diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index c11303cb1e..786cb694ef 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -753,6 +753,10 @@ static void window_loadsave_select(rct_window *w, const char *path) network_begin_server(gConfigNetwork.default_port); } + strcpy(gScenarioSaveName, path_get_filename(path)); + path_remove_extension(gScenarioSaveName); + gFirstTimeSave = 0; + window_close(w); gfx_invalidate_screen(); rct2_endupdate(); @@ -768,6 +772,11 @@ static void window_loadsave_select(rct_window *w, const char *path) int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 1 : 0); SDL_RWclose(rw); if (success) { + + strcpy(gScenarioSaveName, path_get_filename(path)); + path_remove_extension(gScenarioSaveName); + gFirstTimeSave = 0; + window_close_by_class(WC_LOADSAVE); game_do_command(0, 1047, 0, -1, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); gfx_invalidate_screen(); diff --git a/src/windows/save_prompt.c b/src/windows/save_prompt.c index 8abd3a72e8..cca05c7420 100644 --- a/src/windows/save_prompt.c +++ b/src/windows/save_prompt.c @@ -235,7 +235,7 @@ static void window_save_prompt_mouseup(rct_window *w, int widgetIndex) } else { switch (widgetIndex) { case WIDX_SAVE: - if (!save_game()) { + if (!save_game_as()) { // user pressed cancel window_close(w); return; diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index f1b94142f5..b7035a4a73 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -72,18 +72,19 @@ enum { }; typedef enum { - DDIDX_LOAD_GAME = 0, - DDIDX_SAVE_GAME = 1, + DDIDX_SAVE_GAME = 0, + DDIDX_SAVE_GAME_AS = 1, + DDIDX_LOAD_GAME = 2, // separator - DDIDX_ABOUT = 3, - DDIDX_OPTIONS = 4, - DDIDX_SCREENSHOT = 5, - DDIDX_GIANT_SCREENSHOT = 6, + DDIDX_ABOUT = 4, + DDIDX_OPTIONS = 5, + DDIDX_SCREENSHOT = 6, + DDIDX_GIANT_SCREENSHOT = 7, // separator - DDIDX_QUIT_TO_MENU = 8, - DDIDX_EXIT_OPENRCT2 = 9, + DDIDX_QUIT_TO_MENU = 9, + DDIDX_EXIT_OPENRCT2 = 10, // separator - DDIDX_ENABLE_TWITCH = 11 + DDIDX_ENABLE_TWITCH = 12 } FILE_MENU_DDIDX; typedef enum { @@ -377,25 +378,26 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg gDropdownItemsFormat[9] = STR_EXIT_OPENRCT2; numItems = 10; } else { - gDropdownItemsFormat[0] = STR_LOAD_GAME; - gDropdownItemsFormat[1] = STR_SAVE_GAME; - gDropdownItemsFormat[2] = 0; - gDropdownItemsFormat[3] = STR_ABOUT; - gDropdownItemsFormat[4] = STR_OPTIONS; - gDropdownItemsFormat[5] = STR_SCREENSHOT; - gDropdownItemsFormat[6] = STR_GIANT_SCREENSHOT; - gDropdownItemsFormat[7] = 0; - gDropdownItemsFormat[8] = STR_QUIT_TO_MENU; - gDropdownItemsFormat[9] = STR_EXIT_OPENRCT2; - numItems = 10; + gDropdownItemsFormat[0] = STR_SAVE_GAME; + gDropdownItemsFormat[1] = STR_SAVE_GAME_AS; + gDropdownItemsFormat[2] = STR_LOAD_GAME; + gDropdownItemsFormat[3] = 0; + gDropdownItemsFormat[4] = STR_ABOUT; + gDropdownItemsFormat[5] = STR_OPTIONS; + gDropdownItemsFormat[6] = STR_SCREENSHOT; + gDropdownItemsFormat[7] = STR_GIANT_SCREENSHOT; + gDropdownItemsFormat[8] = 0; + gDropdownItemsFormat[9] = STR_QUIT_TO_MENU; + gDropdownItemsFormat[10] = STR_EXIT_OPENRCT2; + numItems = 11; #ifndef DISABLE_TWITCH if (gConfigTwitch.channel != NULL && gConfigTwitch.channel[0] != 0) { _menuDropdownIncludesTwitch = true; - gDropdownItemsFormat[10] = 0; - gDropdownItemsFormat[11] = 1156; - gDropdownItemsArgs[11] = STR_TWITCH_ENABLE; - numItems = 12; + gDropdownItemsFormat[11] = 0; + gDropdownItemsFormat[12] = 1156; + gDropdownItemsArgs[12] = STR_TWITCH_ENABLE; + numItems = 13; } #endif } @@ -492,11 +494,22 @@ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int drop case DDIDX_LOAD_GAME: game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 0, 0); break; + case DDIDX_SAVE_GAME_AS: + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) { + rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; + window_loadsave_open(LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE, s6Info->name); + } + else { + tool_cancel(); + save_game_as(); + } + break; case DDIDX_SAVE_GAME: if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) { rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; window_loadsave_open(LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE, s6Info->name); - } else { + } + else { tool_cancel(); save_game(); } From 6ec01c6d6557c484288b61cda0b2fb5bca2ba57b Mon Sep 17 00:00:00 2001 From: Runelaenen Date: Wed, 19 Aug 2015 22:35:20 +0200 Subject: [PATCH 0565/1173] Changed localisation strings --- data/language/english_uk.txt | 4 ++-- src/localisation/string_ids.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index eaddffc88d..216f95d53c 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -885,7 +885,7 @@ STR_0879 :Can't lower land here... STR_0880 :Can't raise land here... STR_0881 :Object in the way STR_0882 :Load Game -STR_0883 :Save Game as +STR_0883 :Save Game STR_0884 :Load Landscape STR_0885 :Save Landscape STR_0886 :Quit Game @@ -3850,4 +3850,4 @@ STR_5508 :Allow loading files with incorrect checksums STR_5509 :{SMALLFONT}{BLACK}Allows loading scenarios and saves that have an incorrect checksum, like the scenarios from the demo or damaged saves. STR_5510 :Default sound device STR_5511 :(UNKNOWN) -STR_5512 :Save game +STR_5512 :Save game as diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index f1ab68af8f..40c7dead82 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -114,8 +114,8 @@ enum { STR_CANT_RAISE_LAND_HERE = 880, STR_LOAD_GAME = 882, - STR_SAVE_GAME_AS = 883, - STR_SAVE_GAME = 5512, + STR_SAVE_GAME_AS = 5512, + STR_SAVE_GAME = 883, STR_LOAD_LANDSCAPE = 884, STR_SAVE_LANDSCAPE = 885, STR_QUIT_GAME = 886, From 3b1708f1be97908707889ff2ac4b16965f72eb9c Mon Sep 17 00:00:00 2001 From: Runelaenen Date: Wed, 19 Aug 2015 23:09:54 +0200 Subject: [PATCH 0566/1173] Wrong logging fixed --- src/game.c | 4 ++-- src/scenario.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/game.c b/src/game.c index 60dddf34f5..e080552abf 100644 --- a/src/game.c +++ b/src/game.c @@ -993,7 +993,7 @@ int save_game() if (!gFirstTimeSave) { utf8 path[MAX_PATH]; - log_error("Saving to %s", gScenarioSaveName); + log_verbose("Saving to %s", gScenarioSaveName); platform_get_user_directory(path, "save"); @@ -1003,7 +1003,7 @@ int save_game() SDL_RWops* rw = platform_sdl_rwfromfile(path, "wb+"); if (rw != NULL) { scenario_save(rw, 0x80000000); - log_error("Saved to %s", gScenarioSaveName); + log_verbose("Saved to %s", gScenarioSaveName); SDL_RWclose(rw); } diff --git a/src/scenario.c b/src/scenario.c index 39e15eeb22..1ea9937d98 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -907,9 +907,9 @@ int scenario_save(SDL_RWops* rw, int flags) int viewX, viewY, viewZoom, viewRotation; if (flags & 2) - log_error("saving scenario"); + log_verbose("saving scenario"); else - log_error("saving game"); + log_verbose("saving game"); if (!(flags & 0x80000000)) From 2830cdd3a3d6494748f143cd748bfde469d3000b Mon Sep 17 00:00:00 2001 From: Runelaenen Date: Wed, 19 Aug 2015 23:16:07 +0200 Subject: [PATCH 0567/1173] Capitalisation of 5512 --- data/language/english_uk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 216f95d53c..01ac55132a 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3850,4 +3850,4 @@ STR_5508 :Allow loading files with incorrect checksums STR_5509 :{SMALLFONT}{BLACK}Allows loading scenarios and saves that have an incorrect checksum, like the scenarios from the demo or damaged saves. STR_5510 :Default sound device STR_5511 :(UNKNOWN) -STR_5512 :Save game as +STR_5512 :Save Game As From be42f10d7a06fcd453e0a0e4c5493cb7afdd9664 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Wed, 19 Aug 2015 18:13:38 -0600 Subject: [PATCH 0568/1173] fix crash in server_list_save_saved_servers --- src/windows/server_list.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/server_list.c b/src/windows/server_list.c index 49fcdafd20..c10d7a23ae 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -495,7 +495,7 @@ static void add_saved_server(char *address) int index = _numSavedServers - 1; _savedServers[index].address = _strdup(address); _savedServers[index].name = _strdup(address); - _savedServers[index].description = NULL; + _savedServers[index].description = _strdup(""); } static void remove_saved_server(int index) From abcd0afa9a21ed9c595e5659f24f8c90bc1b6a9f Mon Sep 17 00:00:00 2001 From: zsilencer Date: Wed, 19 Aug 2015 18:26:42 -0600 Subject: [PATCH 0569/1173] make setting player name actually work --- src/network/network.cpp | 2 +- src/windows/server_list.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 2f9ab7a07d..522b81fafd 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -375,7 +375,7 @@ bool Network::BeginServer(unsigned short port) return false; } - NetworkPlayer* player = AddPlayer("Server Player"); + NetworkPlayer* player = AddPlayer(gConfigNetwork.player_name); player->flags |= NETWORK_PLAYER_FLAG_ISSERVER; player_id = player->id; diff --git a/src/windows/server_list.c b/src/windows/server_list.c index c10d7a23ae..113992677a 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -114,7 +114,7 @@ static rct_window_event_list window_server_list_events = { static int _hoverButtonIndex = -1; static void server_list_get_item_button(int buttonIndex, int x, int y, int width, int *outX, int *outY); -static void server_list_update_player_name(rct_window *w); +static void server_list_update_player_name(); static void server_list_load_saved_servers(); static void server_list_save_saved_servers(); static void dispose_saved_server_list(); @@ -166,7 +166,7 @@ void window_server_list_open() static void window_server_list_close(rct_window *w) { - server_list_update_player_name(w); + server_list_update_player_name(); dispose_saved_server_list(); } @@ -183,6 +183,7 @@ static void window_server_list_mouseup(rct_window *w, int widgetIndex) window_text_input_open(w, widgetIndex, STR_ADD_SERVER, STR_ENTER_HOSTNAME_OR_IP_ADDRESS, STR_NONE, 0, 128); break; case WIDX_START_SERVER: + server_list_update_player_name(); window_loadsave_open(LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME | LOADSAVETYPE_NETWORK, NULL); break; } @@ -223,9 +224,11 @@ static void window_server_list_scroll_mousedown(rct_window *w, int scrollIndex, window_invalidate(w); break; case WIDX_LIST_SPECTATE: + server_list_update_player_name(); join_server(serverAddress, true); break; default: + server_list_update_player_name(); join_server(serverAddress, false); break; } @@ -370,7 +373,7 @@ static void server_list_get_item_button(int buttonIndex, int x, int y, int width *outY = y + 2; } -static void server_list_update_player_name(rct_window *w) +static void server_list_update_player_name() { if (strlen(_playerName) > 0) { SafeFree(gConfigNetwork.player_name); From 5bb3218d4cebaa551c5b0578dc97054d4ffdb368 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Wed, 19 Aug 2015 19:07:11 -0600 Subject: [PATCH 0570/1173] make desync detection work again --- src/game.c | 11 ++++++----- src/network/network.cpp | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/game.c b/src/game.c index e080552abf..1ad3fbadee 100644 --- a/src/game.c +++ b/src/game.c @@ -262,11 +262,6 @@ void game_update() // make sure client doesn't fall behind the server too much numUpdates += 10; } - - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) >= network_get_server_tick()) { - // dont run past the server - numUpdates = 0; - } } else { if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0) { numUpdates = 0; @@ -333,6 +328,12 @@ void game_update() void game_logic_update() { + if (network_get_mode() == NETWORK_MODE_CLIENT) { + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) >= network_get_server_tick()) { + // dont run past the server + return; + } + } RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32)++; RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32)++; RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, sint16)++; diff --git a/src/network/network.cpp b/src/network/network.cpp index 522b81fafd..8424c067a7 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -536,7 +536,7 @@ bool Network::CheckSRAND(uint32 tick, uint32 srand0) if (server_srand0_tick == 0) return true; - if (tick >= server_srand0_tick) { + if (tick > server_srand0_tick) { // this should not happen server_srand0_tick = 0; return true; } From 7322307a0447b73348a861138191de41f6bea909 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Wed, 19 Aug 2015 20:34:52 -0600 Subject: [PATCH 0571/1173] fix issues with pausing in multiplayer --- src/game.c | 23 ++++++++------ src/network/network.cpp | 70 +++-------------------------------------- src/network/network.h | 8 ----- src/scenario.c | 3 ++ 4 files changed, 21 insertions(+), 83 deletions(-) diff --git a/src/game.c b/src/game.c index 1ad3fbadee..ca0e321728 100644 --- a/src/game.c +++ b/src/game.c @@ -294,6 +294,7 @@ void game_update() } } + network_update(); news_item_update_current(); window_dispatch_update_all(); @@ -328,6 +329,7 @@ void game_update() void game_logic_update() { + network_update(); if (network_get_mode() == NETWORK_MODE_CLIENT) { if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) >= network_get_server_tick()) { // dont run past the server @@ -375,8 +377,6 @@ void game_logic_update() window_error_open(title_text, body_text); } - - network_tick(); } /** @@ -478,13 +478,15 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * return cost; } - if (network_get_mode() != NETWORK_MODE_NONE && !(flags & GAME_COMMAND_FLAG_NETWORKED) && !(flags & GAME_COMMAND_FLAG_GHOST) && !(flags & GAME_COMMAND_FLAG_5) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { - network_send_gamecmd(*eax, *ebx, *ecx, *edx, *esi, *edi, *ebp, game_command_callback_get_index(game_command_callback)); - if (network_get_mode() == NETWORK_MODE_CLIENT) { - game_command_callback = 0; - // Decrement nest count - RCT2_GLOBAL(0x009A8C28, uint8)--; - return cost; + if (network_get_mode() != NETWORK_MODE_NONE && !(flags & GAME_COMMAND_FLAG_NETWORKED) && !(flags & GAME_COMMAND_FLAG_GHOST) && !(flags & GAME_COMMAND_FLAG_5) && RCT2_GLOBAL(0x009A8C28, uint8) == 1 /* Send only top-level commands */) { + if (command != GAME_COMMAND_LOAD_OR_QUIT) { // Disable these commands over the network + network_send_gamecmd(*eax, *ebx, *ecx, *edx, *esi, *edi, *ebp, game_command_callback_get_index(game_command_callback)); + if (network_get_mode() == NETWORK_MODE_CLIENT) { // Client sent the command to the server, do not run it locally, just return. It will run when server sends it + game_command_callback = 0; + // Decrement nest count + RCT2_GLOBAL(0x009A8C28, uint8)--; + return cost; + } } } @@ -814,6 +816,9 @@ int game_load_network(SDL_RWops* rw) uint32 checksum; SDL_RWread(rw, &checksum, sizeof(uint32), 1); + // Read other data not in normal save files + RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) = SDL_ReadLE32(rw); + if (!load_success){ set_load_objects_fail_reason(); if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_5){ diff --git a/src/network/network.cpp b/src/network/network.cpp index 8424c067a7..5642318301 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -59,7 +59,6 @@ enum { NETWORK_COMMAND_PLAYERLIST, NETWORK_COMMAND_PING, NETWORK_COMMAND_PINGLIST, - NETWORK_COMMAND_READY, NETWORK_COMMAND_MAX }; @@ -72,7 +71,6 @@ const char *NetworkCommandNames[] = { "NETWORK_COMMAND_PLAYERLIST", "NETWORK_COMMAND_PING", "NETWORK_COMMAND_PINGLIST", - "NETWORK_COMMAND_READY", }; NetworkPacket::NetworkPacket() @@ -254,7 +252,6 @@ Network::Network() server_command_handlers[NETWORK_COMMAND_CHAT] = &Network::Server_Handle_CHAT; server_command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::Server_Handle_GAMECMD; server_command_handlers[NETWORK_COMMAND_PING] = &Network::Server_Handle_PING; - server_command_handlers[NETWORK_COMMAND_READY] = &Network::Server_Handle_READY; } Network::~Network() @@ -456,10 +453,6 @@ void Network::UpdateServer() log_error("Failed to set non-blocking mode."); } else { AddClient(socket); - was_paused_before_client_connected = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) != 0; - if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) == 0) { - pause_toggle(); - } } } } @@ -469,33 +462,8 @@ void Network::UpdateClient() if (!ProcessConnection(server_connection)) { Close(); } -} - -void Network::UpdateTick() -{ - switch (GetMode()) { - case NETWORK_MODE_SERVER: - UpdateServerTick(); - break; - case NETWORK_MODE_CLIENT: - UpdateClientTick(); - break; - } -} - -void Network::UpdateServerTick() -{ - -} - -void Network::UpdateClientTick() -{ ProcessGameCommandQueue(); - if (CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { - if (server_srand0_tick == 0) { - // printf("SRAND OK!\n"); - } - } else { + if (!CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { window_network_status_open("Network desync detected"); Close(); } @@ -536,7 +504,7 @@ bool Network::CheckSRAND(uint32 tick, uint32 srand0) if (server_srand0_tick == 0) return true; - if (tick > server_srand0_tick) { // this should not happen + if (tick > server_srand0_tick) { server_srand0_tick = 0; return true; } @@ -658,13 +626,6 @@ void Network::Server_Send_PINGLIST() SendPacketToClients(*packet); } -void Network::Client_Send_READY() -{ - std::unique_ptr packet = std::move(NetworkPacket::Allocate()); - *packet << (uint32)NETWORK_COMMAND_READY; - server_connection.QueuePacket(std::move(packet)); -} - bool Network::ProcessConnection(NetworkConnection& connection) { int packetStatus; @@ -864,14 +825,9 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac SDL_RWops* rw = SDL_RWFromMem(&chunk_buffer[0], size); if (game_load_network(rw)) { game_load_init(); - if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0) { - pause_toggle(); - } game_command_queue.clear(); server_tick = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); server_srand0_tick = 0; - - Client_Send_READY(); // window_network_status_open("Loaded new map from network"); } SDL_RWclose(rw); @@ -908,12 +864,8 @@ int Network::Client_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& uint8 callback; packet >> tick >> args[0] >> args[1] >> args[2] >> args[3] >> args[4] >> args[5] >> args[6] >> playerid >> callback; - if (args[4] == GAME_COMMAND_TOGGLE_PAUSE) { - pause_toggle(); - } else { - GameCommand gc = GameCommand(tick, args, playerid, callback); - game_command_queue.insert(gc); - } + GameCommand gc = GameCommand(tick, args, playerid, callback); + game_command_queue.insert(gc); return 1; } @@ -995,14 +947,6 @@ int Network::Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket return 1; } -int Network::Server_Handle_READY(NetworkConnection& connection, NetworkPacket& packet) -{ - if (!was_paused_before_client_connected) { - game_do_command(0, 1, 0, 0, GAME_COMMAND_TOGGLE_PAUSE, 0, 0); - } - return 1; -} - int network_init() { return gNetwork.Init(); @@ -1028,11 +972,6 @@ void network_update() gNetwork.Update(); } -void network_tick() -{ - gNetwork.UpdateTick(); -} - int network_get_mode() { return gNetwork.GetMode(); @@ -1105,7 +1044,6 @@ void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 #else int network_get_mode() { return NETWORK_MODE_NONE; } -void network_tick() {} uint32 network_get_server_tick() { return RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); } void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback) {} void network_send_map() {} diff --git a/src/network/network.h b/src/network/network.h index 8fbb0092fc..55826d0668 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -138,7 +138,6 @@ public: uint32 GetServerTick(); uint8 GetPlayerID(); void Update(); - void UpdateTick(); NetworkPlayer* GetPlayerByID(int id); const char* FormatChat(NetworkPlayer* fromplayer, const char* text); void SendPacketToClients(NetworkPacket& packet); @@ -155,7 +154,6 @@ public: void Client_Send_PING(); void Server_Send_PING(); void Server_Send_PINGLIST(); - void Client_Send_READY(); std::vector> player_list; @@ -196,12 +194,8 @@ private: std::vector chunk_buffer; char password[33]; - bool was_paused_before_client_connected; - void UpdateServer(); void UpdateClient(); - void UpdateServerTick(); - void UpdateClientTick(); private: std::vector client_command_handlers; @@ -218,7 +212,6 @@ private: int Client_Handle_PING(NetworkConnection& connection, NetworkPacket& packet); int Server_Handle_PING(NetworkConnection& connection, NetworkPacket& packet); int Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket& packet); - int Server_Handle_READY(NetworkConnection& connection, NetworkPacket& packet); }; #endif // __cplusplus @@ -234,7 +227,6 @@ int network_begin_server(int port); int network_get_mode(); void network_update(); -void network_tick(); int network_get_authstatus(); uint32 network_get_server_tick(); uint8 network_get_player_id(); diff --git a/src/scenario.c b/src/scenario.c index 1ea9937d98..9f5293d7b7 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -1041,6 +1041,9 @@ int scenario_save_network(SDL_RWops* rw) free(s6); + // Write other data not in normal save files + SDL_WriteLE32(rw, RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32)); + gfx_invalidate_screen(); return 1; } From 2500ee452e1c65dfeff8c271cc92f65e6c17a3c7 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 20 Aug 2015 04:00:15 +0100 Subject: [PATCH 0572/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 4 + data/language/dutch.txt | 6 ++ data/language/english_us.txt | 6 ++ data/language/swedish.txt | 146 +++++++++++++------------- 4 files changed, 89 insertions(+), 73 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 7961b6d7a5..92c000bac6 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3847,3 +3847,7 @@ STR_5504 :{SMALLFONT}{BLACK}顯示多人連線狀態 STR_5505 :無法連接至伺服器. STR_5506 :遊客無視設施的刺激度 STR_5507 :預設清潔工人會修剪草皮 +STR_5508 :允許載入校驗失敗的檔案 +STR_5509 :{SMALLFONT}{BLACK}允許載入校驗失敗的劇情及存檔, 例如試玩版的劇情或已損壞的存檔. +STR_5510 :預設聲效裝置 +STR_5511 :(未知) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 5625dfccd8..3e3e888a66 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3838,3 +3838,9 @@ STR_5502 :Multiplayer STR_5503 :Hostnaam of IP-adres invoeren: STR_5504 :{SMALLFONT}{BLACK}Status multiplayer tonen STR_5505 :Kan niet met de server verbinden. +STR_5506 :Bezoekers negeren intensiteit +STR_5507 :Klusjesmannen standaard gras laten maaien +STR_5508 :Laden van bestanden met incorrecte checksum toestaan +STR_5509 :{SMALLFONT}{BLACK}Maakt het mogelijk om scenario's en opgeslagen spellen met een incorrecte checksum te laden, zoals scenario's uit de demo of beschadigde opgeslagen parken. +STR_5510 :Standaard geluidsapparaat +STR_5511 :(ONBEKEND) diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 933b0c2af6..0cacce825f 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3846,3 +3846,9 @@ STR_5502 :Multiplayer STR_5503 :Enter hostname or IP address: STR_5504 :{SMALLFONT}{BLACK}Show multiplayer status STR_5505 :Unable to connect to server. +STR_5506 :Guests ignore intensities +STR_5507 :Handymen mow grass by default +STR_5508 :Allow loading files with incorrect checksums +STR_5509 :{SMALLFONT}{BLACK}Allows loading scenarios and saves that have an incorrect checksum, like the scenarios from the demo or damaged saves. +STR_5510 :Default sound device +STR_5511 :(UNKNOWN) diff --git a/data/language/swedish.txt b/data/language/swedish.txt index 49ff7c287b..bd80b4b490 100644 --- a/data/language/swedish.txt +++ b/data/language/swedish.txt @@ -3,76 +3,76 @@ # Use # at the beginning of a line to leave a comment. STR_0000 : STR_0001 :{STRINGID} {COMMA16} -STR_0002 :Spiral Roller Coaster -STR_0003 :Stand-up Roller Coaster +STR_0002 :Spiral berg- och dalbana +STR_0003 :Stående berg- och dalbana STR_0004 :Hängande svängande bana -STR_0005 :Inverted Roller Coaster +STR_0005 :Inverterad berg- och dalbana STR_0006 :Junior berg- och dalbana STR_0007 :Miniatyr-tåg STR_0008 :Balkbana STR_0009 :Liten hängande bana -STR_0010 :Boat Ride -STR_0011 :Wooden Wild Mouse -STR_0012 :Steeplechase +STR_0010 :Båttur +STR_0011 :Vildmus i trä +STR_0012 :Hinderbana STR_0013 :Bilåktur STR_0014 :Launched Freefall STR_0015 :Bobsleigh Coaster -STR_0016 :Observation Tower +STR_0016 :Observationstorn STR_0017 :Loopande berg- och dalbana STR_0018 :Dinghy Slide -STR_0019 :Mine Train Coaster +STR_0019 :Gruvtåg STR_0020 :Stolslift -STR_0021 :Corkscrew Roller Coaster -STR_0022 :Maze +STR_0021 :Korkskruvs berg- och dalbana +STR_0022 :Labyrint STR_0023 :Spiral Slide STR_0024 :Go Karts STR_0025 :Log Flume STR_0026 :River Rapids STR_0027 :Dodgems -STR_0028 :Pirate Ship -STR_0029 :Swinging Inverter Ship -STR_0030 :Food Stall -STR_0031 :Unknown Stall (1D) -STR_0032 :Drink Stall -STR_0033 :Unknown Stall (1F) +STR_0028 :Piratskepp +STR_0029 :Svängande omvänt Piratskepp +STR_0030 :Matstånd +STR_0031 :Okänt Stånd (1D) +STR_0032 :Dryckesstånd +STR_0033 :Okänt Stånd (1F) STR_0034 :Stånd -STR_0035 :Merry-Go-Round -STR_0036 :Unknown Stall (22) +STR_0035 :Karusell +STR_0036 :Okänt Stånd (22) STR_0037 :Kiosk STR_0038 :Toalett -STR_0039 :Ferris Wheel -STR_0040 :Motion Simulator -STR_0041 :3D Cinema +STR_0039 :Pariserhjul +STR_0040 :Rörelsesimulator +STR_0041 :3D Bio STR_0042 :Top Spin -STR_0043 :Space Rings +STR_0043 :Rymdringar STR_0044 :Bakvänd fritt fall-bana STR_0045 :Lift STR_0046 :Vertical Drop Roller Coaster -STR_0047 :Cash Machine +STR_0047 :Bankomat STR_0048 :Twist -STR_0049 :Haunted House -STR_0050 :First Aid Room -STR_0051 :Circus Show -STR_0052 :Ghost Train +STR_0049 :Spökhuset +STR_0050 :Första Hjälpen +STR_0051 :Cirkusföreställning +STR_0052 :Spöktåget STR_0053 :Hyper-snurr berg- och dalbana STR_0054 :Berg- och dalbana i trä STR_0055 :Sidofriktion berg- och dalbana STR_0056 :Vilda Musen STR_0057 :Flerdimensionell berg- och dalbana -STR_0058 :Unknown Ride (38) +STR_0058 :Okänd Åktur (38) STR_0059 :Inverterad berg- och dalbana -STR_0060 :Unknown Ride (3A) +STR_0060 :Okänd Åktur (3A) STR_0061 :Virginia Reel STR_0062 :Splash Boats STR_0063 :Mini Helicopters -STR_0064 :Lay-down Roller Coaster +STR_0064 :Liggande berg- och dalbana STR_0065 :Hängande balkbana -STR_0066 :Unknown Ride (40) +STR_0066 :Okänd Åktur (40) STR_0067 :Reverser Roller Coaster STR_0068 :Skruvbana STR_0069 :Mini Golf STR_0070 :Giga Coaster -STR_0071 :Roto-Drop +STR_0071 :Roto-Fall STR_0072 :Flying Saucers STR_0073 :Crooked House STR_0074 :Monorail Cycles @@ -80,19 +80,19 @@ STR_0075 :Compact Inverted Coaster STR_0076 :Vattenbana STR_0077 :Air Powered Vertical Coaster STR_0078 :Inverted Hairpin Coaster -STR_0079 :Magic Carpet +STR_0079 :Magisk matta STR_0080 :Submarine Ride STR_0081 :River Rafts -STR_0082 :Unknown Ride (50) +STR_0082 :Okänd Åktur (50) STR_0083 :Enterprise -STR_0084 :Unknown Ride (52) -STR_0085 :Unknown Ride (53) -STR_0086 :Unknown Ride (54) -STR_0087 :Unknown Ride (55) +STR_0084 :Okänd Åktur (52) +STR_0085 :Okänd Åktur (53) +STR_0086 :Okänd Åktur (54) +STR_0087 :Okänd Åktur (55) STR_0088 :Inverted Impulse Coaster STR_0089 :Mini berg- och dalbana STR_0090 :Mine Ride -STR_0091 :Unknown Ride (59) +STR_0091 :Okänd Åktur (59) STR_0092 :LIM Launched Roller Coaster STR_0093 : STR_0094 : @@ -1094,12 +1094,12 @@ STR_1087 :3D film: {ENDQUOTES}Rymdrädarna{ENDQUOTES} STR_1088 :Intensivt läge STR_1089 :Berserkläge STR_1090 :Spökhuset -STR_1091 :Circusvisning +STR_1091 :Cirkusvisning STR_1092 :Nedåtriktad start STR_1093 :Snea huset STR_1094 :Fritt fall STR_1095 :Blockavdelat kontinuerligt banläge -STR_1096 :Motoriserad start (without passing station) +STR_1096 :Motoriserad start (utan att passera station) STR_1097 :Blockavdelad motoriserad start STR_1098 :Rör sig mot slutet av {POP16}{STRINGID} STR_1099 :Väntar på passagerare vid {POP16}{STRINGID} @@ -1116,11 +1116,11 @@ STR_1109 :Svingar STR_1110 :Roterar STR_1111 :Roterar STR_1112 :Pågår -STR_1113 :Showing film +STR_1113 :Visar film STR_1114 :Rotating STR_1115 :Pågår STR_1116 :Pågår -STR_1117 :Circusshow pågår +STR_1117 :Cirkusshow pågår STR_1118 :Pågår STR_1119 :Väntar på linbanevagn STR_1120 :Åker i {VELOCITY} @@ -1750,7 +1750,7 @@ STR_1742 :{WINDOW_COLOUR_2}Max. people on Åktur: STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this Åktur at one time STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1745 :{COMMA16} -STR_1746 :Can't change this... +STR_1746 :Kan inte ändra detta... STR_1747 :{WINDOW_COLOUR_2}Tidsgräns: STR_1748 :{SMALLFONT}{BLACK}Tidsgräns för åkturen STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} @@ -2686,11 +2686,11 @@ STR_2676 :??? STR_2677 :??? STR_2678 :??? STR_2679 :??? -STR_2680 :All research complete -STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2680 :All forskning färdig +STR_2681 :{MEDIUMFONT}{BLACK}Ökar pengarna med {CURRENCY} STR_2682 : STR_2683 : -STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive +STR_2684 :{SMALLFONT}{BLACK}En stor grupp anländer STR_2685 :Simplex Noise Parameters STR_2686 :{WINDOW_COLOUR_2}Low: STR_2687 :{WINDOW_COLOUR_2}High: @@ -2700,23 +2700,23 @@ STR_2690 :Map Generation STR_2691 :{WINDOW_COLOUR_2}Base height: STR_2692 :{WINDOW_COLOUR_2}Water level: STR_2693 :{WINDOW_COLOUR_2}Terrain: -STR_2694 :Generate -STR_2695 :Random terrain -STR_2696 :Place trees +STR_2694 :Generera +STR_2695 :Slumpvis terräng +STR_2696 :Placera trä STR_2697 :??? STR_2698 :??? STR_2699 :??? -STR_2700 :Autosave frequency: -STR_2701 :Every week -STR_2702 :Every 2 weeks -STR_2703 :Every month -STR_2704 :Every 4 months -STR_2705 :Every year -STR_2706 :Never -STR_2707 :Open new window -STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? -STR_2709 :Overwrite -STR_2710 :Type the name of the file. +STR_2700 :Autospar frekvens: +STR_2701 :Varje vecka +STR_2702 :Varannan vecka +STR_2703 :Varje månad +STR_2704 :Var 4:e månad +STR_2705 :Varje år +STR_2706 :Aldrig +STR_2707 :Öppna ett nytt fönster +STR_2708 :{WINDOW_COLOUR_1}Är du säker på att du vill skriva över {STRINGID}? +STR_2709 :Skriv över +STR_2710 :Skriv namnet på filen. STR_2711 :; STR_2712 := STR_2713 :, @@ -2726,24 +2726,24 @@ STR_2716 :/ STR_2717 :' STR_2718 :(up) STR_2719 :(new file) -STR_2720 :{UINT16}sec -STR_2721 :{UINT16}secs -STR_2722 :{UINT16}min:{UINT16}sec -STR_2723 :{UINT16}min:{UINT16}secs -STR_2724 :{UINT16}mins:{UINT16}sec -STR_2725 :{UINT16}mins:{UINT16}secs +STR_2720 :{UINT16}sek +STR_2721 :{UINT16}sek +STR_2722 :{UINT16}min:{UINT16}sek +STR_2723 :{UINT16}min:{UINT16}sek +STR_2724 :{UINT16}mins:{UINT16}sek +STR_2725 :{UINT16}mins:{UINT16}sek STR_2726 :{UINT16}min STR_2727 :{UINT16}mins -STR_2728 :{UINT16}hour:{UINT16}min -STR_2729 :{UINT16}hour:{UINT16}mins -STR_2730 :{UINT16}hours:{UINT16}min -STR_2731 :{UINT16}hours:{UINT16}mins +STR_2728 :{UINT16}tim:{UINT16}min +STR_2729 :{UINT16}tim:{UINT16}mins +STR_2730 :{UINT16}tim:{UINT16}min +STR_2731 :{UINT16}tim:{UINT16}mins STR_2732 :{COMMA16}ft STR_2733 :{COMMA16}m STR_2734 :{COMMA16}mph STR_2735 :{COMMA16}km/h -STR_2736 :{MONTH}, Year {COMMA16} -STR_2737 :{STRINGID} {MONTH}, Year {COMMA16} +STR_2736 :{MONTH}, År {COMMA16} +STR_2737 :{STRINGID} {MONTH}, År {COMMA16} STR_2738 :Title screen music: STR_2739 :None STR_2740 :RollerCoaster Tycoon 1 From 720076acb56c1f99aa61998695b22153c510728e Mon Sep 17 00:00:00 2001 From: zsilencer Date: Wed, 19 Aug 2015 22:59:55 -0600 Subject: [PATCH 0573/1173] fix cmake error --- src/network/network.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 5642318301..dd5797c34c 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -538,7 +538,7 @@ void Network::Server_Send_MAP(NetworkConnection* connection) int size = (int)SDL_RWtell(rw); int chunksize = 1000; for (int i = 0; i < size; i += chunksize) { - int datasize = min(chunksize, size - i); + int datasize = (std::min)(chunksize, size - i); std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_MAP << (uint32)size << (uint32)i; packet->Write(&buffer[i], datasize); From 93d49e314ed181d2bb5611fcb56bfda7b1be5dce Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 20 Aug 2015 12:13:08 +0200 Subject: [PATCH 0574/1173] Fix file menu for editor, restore menu order, add shortcut for quick saving --- data/language/english_uk.txt | 1 + src/config.c | 1 + src/config.h | 1 + src/interface/keyboard_shortcut.c | 16 ++++++++++++++++ src/localisation/string_ids.h | 4 +++- src/windows/shortcut_keys.c | 3 ++- src/windows/top_toolbar.c | 32 +++++++++++++++---------------- 7 files changed, 40 insertions(+), 18 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 01ac55132a..180217eb18 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3851,3 +3851,4 @@ STR_5509 :{SMALLFONT}{BLACK}Allows loading scenarios and saves that have an i STR_5510 :Default sound device STR_5511 :(UNKNOWN) STR_5512 :Save Game As +STR_5513 :(Quick) save game diff --git a/src/config.c b/src/config.c index 304bb22e98..0a95bb5679 100644 --- a/src/config.c +++ b/src/config.c @@ -974,6 +974,7 @@ static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = { SDL_SCANCODE_DOWN, // SHORTCUT_SCROLL_MAP_DOWN SDL_SCANCODE_RIGHT, // SHORTCUT_SCROLL_MAP_RIGHT SDL_SCANCODE_C, // SHORTCUT_OPEN_CHAT_WINDOW + CTRL | SDL_SCANCODE_F10, // SHORTCUT_QUICK_SAVE_GAME }; #define SHORTCUT_FILE_VERSION 1 diff --git a/src/config.h b/src/config.h index b472fb7e3e..8cbe69fd83 100644 --- a/src/config.h +++ b/src/config.h @@ -77,6 +77,7 @@ enum { SHORTCUT_SCROLL_MAP_DOWN, SHORTCUT_SCROLL_MAP_RIGHT, SHORTCUT_OPEN_CHAT_WINDOW, + SHORTCUT_QUICK_SAVE_GAME, SHORTCUT_COUNT }; diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index f45998020c..0d5e71df6b 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -500,6 +500,21 @@ static void shortcut_open_chat_window() chat_toggle(); } +static void shortcut_quick_save_game() +{ + log_error("quicksave"); + // Do a quick save in playing mode and a regular save in Scenario Editor mode. In other cases, don't do anything. + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) == SCREEN_FLAGS_PLAYING) { + log_error("quicksave2"); + tool_cancel(); + save_game(); + } + else if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) { + rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; + window_loadsave_open(LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE, s6Info->name); + } +} + static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { shortcut_close_top_most_window, shortcut_close_all_floating_windows, @@ -545,6 +560,7 @@ static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { NULL, NULL, shortcut_open_chat_window, + shortcut_quick_save_game, }; #pragma endregion diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 40c7dead82..80ec47ade7 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -114,7 +114,6 @@ enum { STR_CANT_RAISE_LAND_HERE = 880, STR_LOAD_GAME = 882, - STR_SAVE_GAME_AS = 5512, STR_SAVE_GAME = 883, STR_LOAD_LANDSCAPE = 884, STR_SAVE_LANDSCAPE = 885, @@ -2059,6 +2058,9 @@ enum { STR_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM = 5508, STR_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM_TIP = 5509, + STR_SAVE_GAME_AS = 5512, + STR_SHORTCUT_QUICK_SAVE_GAME = 5513, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/shortcut_keys.c b/src/windows/shortcut_keys.c index 0499330cea..02d2cd295d 100644 --- a/src/windows/shortcut_keys.c +++ b/src/windows/shortcut_keys.c @@ -131,6 +131,7 @@ const rct_string_id ShortcutStringIds[] = { STR_SHORTCUT_SCROLL_MAP_DOWN, STR_SHORTCUT_SCROLL_MAP_RIGHT, STR_SEND_MESSAGE, + STR_SHORTCUT_QUICK_SAVE_GAME, }; /** @@ -262,4 +263,4 @@ static void window_shortcut_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, i RCT2_GLOBAL(0x13CE956, uint16) = templateStringId; gfx_draw_string_left(dpi, format, (void*)0x13CE952, 0, 0, y - 1); } -} \ No newline at end of file +} diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index b7035a4a73..bf0127ced1 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -72,9 +72,9 @@ enum { }; typedef enum { - DDIDX_SAVE_GAME = 0, - DDIDX_SAVE_GAME_AS = 1, - DDIDX_LOAD_GAME = 2, + DDIDX_LOAD_GAME = 0, + DDIDX_SAVE_GAME = 1, + DDIDX_SAVE_GAME_AS = 2, // separator DDIDX_ABOUT = 4, DDIDX_OPTIONS = 5, @@ -378,9 +378,9 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg gDropdownItemsFormat[9] = STR_EXIT_OPENRCT2; numItems = 10; } else { - gDropdownItemsFormat[0] = STR_SAVE_GAME; - gDropdownItemsFormat[1] = STR_SAVE_GAME_AS; - gDropdownItemsFormat[2] = STR_LOAD_GAME; + gDropdownItemsFormat[0] = STR_LOAD_GAME; + gDropdownItemsFormat[1] = STR_SAVE_GAME; + gDropdownItemsFormat[2] = STR_SAVE_GAME_AS; gDropdownItemsFormat[3] = 0; gDropdownItemsFormat[4] = STR_ABOUT; gDropdownItemsFormat[5] = STR_OPTIONS; @@ -487,6 +487,12 @@ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int drop { switch (widgetIndex) { case WIDX_FILE_MENU: + + // Quicksave is only available in the normal game. Skip one position to avoid incorrect mappings in the menus of the other modes. + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_SCENARIO_EDITOR) && dropdownIndex > DDIDX_LOAD_GAME) + dropdownIndex += 1; + + // Track designer and track designs manager start with About, not Load/save if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) dropdownIndex += DDIDX_ABOUT; @@ -494,6 +500,10 @@ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int drop case DDIDX_LOAD_GAME: game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 0, 0); break; + case DDIDX_SAVE_GAME: + tool_cancel(); + save_game(); + break; case DDIDX_SAVE_GAME_AS: if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) { rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; @@ -504,16 +514,6 @@ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int drop save_game_as(); } break; - case DDIDX_SAVE_GAME: - if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) { - rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; - window_loadsave_open(LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE, s6Info->name); - } - else { - tool_cancel(); - save_game(); - } - break; case DDIDX_ABOUT: window_about_open(); break; From f384a9cbf8b2d609ec9dbb92a54b7d6462fd29ac Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 20 Aug 2015 13:23:07 +0200 Subject: [PATCH 0575/1173] Remove test code --- src/interface/keyboard_shortcut.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index 0d5e71df6b..b8d919dde5 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -502,10 +502,8 @@ static void shortcut_open_chat_window() static void shortcut_quick_save_game() { - log_error("quicksave"); // Do a quick save in playing mode and a regular save in Scenario Editor mode. In other cases, don't do anything. if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) == SCREEN_FLAGS_PLAYING) { - log_error("quicksave2"); tool_cancel(); save_game(); } From 51b278c58a57a4a5b6b4f55281d8f07ad54b2921 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 20 Aug 2015 13:49:33 +0200 Subject: [PATCH 0576/1173] Add build_nonet to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9a83493328..9ec4db8c1b 100644 --- a/.gitignore +++ b/.gitignore @@ -64,6 +64,7 @@ local.properties [Rr]elease/ x64/ build/ +build_nonet/ [Bb]in/ [Oo]bj/ From 27df5375591cbecda6d8b38554cf36668cc5ae49 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 20 Aug 2015 20:05:18 +0200 Subject: [PATCH 0577/1173] Use wildcard to include all differing build configurations --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9ec4db8c1b..5899e73e20 100644 --- a/.gitignore +++ b/.gitignore @@ -64,7 +64,7 @@ local.properties [Rr]elease/ x64/ build/ -build_nonet/ +build_*/ [Bb]in/ [Oo]bj/ From 903fba2747cf0ddf6bab0c622d2d301d16b7c38b Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 20 Aug 2015 20:48:22 +0200 Subject: [PATCH 0578/1173] Only build the nonet version if specified --- build.sh | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/build.sh b/build.sh index baea40c003..8ad2585903 100755 --- a/build.sh +++ b/build.sh @@ -2,14 +2,22 @@ set -e +nonet=false; + +if [[ "$1" = "--include-nonet" ]]; then + nonet=true +fi + cachedir=.cache mkdir -p $cachedir if [[ ! -d build ]]; then mkdir -p build fi -if [[ ! -d build_nonet ]]; then - mkdir -p build_nonet +if [[ $nonet = true ]]; then + if [[ ! -d build_nonet ]]; then + mkdir -p build_nonet + fi fi libversion=2 @@ -61,10 +69,12 @@ pushd build cmake -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt -DCMAKE_BUILD_TYPE=Debug .. make popd -pushd build_nonet - cmake -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt -DCMAKE_BUILD_TYPE=Debug -DDISABLE_NETWORK=ON .. - make -popd +if [[ $nonet = true ]]; then + pushd build_nonet + cmake -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt -DCMAKE_BUILD_TYPE=Debug -DDISABLE_NETWORK=ON .. + make + popd +fi if [[ ! -h openrct2.dll ]]; then ln -s build/openrct2.dll openrct2.dll From 5d19c44e463d1335dc51063f7ed424b114821e83 Mon Sep 17 00:00:00 2001 From: LRFLEW Date: Thu, 20 Aug 2015 20:57:09 -0500 Subject: [PATCH 0579/1173] Fixed autosaves preventing saving before quitting dialog from appearing --- src/scenario.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scenario.c b/src/scenario.c index 9f5293d7b7..2b3a515032 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -975,7 +975,8 @@ int scenario_save(SDL_RWops* rw, int flags) reset_loaded_objects(); gfx_invalidate_screen(); - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) = 0; + if (!(flags & 0x80000000)) + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) = 0; return 1; } From 3bfeddbee778693fcf574c6644b8d351d0e96c0d Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 21 Aug 2015 04:00:16 +0100 Subject: [PATCH 0580/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 23 ++++++++++++----------- data/language/dutch.txt | 1 + data/language/english_us.txt | 1 + data/language/german.txt | 5 +++++ 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 92c000bac6..2a32b34f3e 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -930,14 +930,14 @@ STR_0924 :{SMALLFONT}{BLACK}向下盤旋 STR_0925 :{SMALLFONT}{BLACK}向上盤旋 STR_0926 :不能移除... STR_0927 :不能在此建造... -STR_0928 :{SMALLFONT}{BLACK}帶有鏈條的坡道, 將車卡拉上坡 +STR_0928 :{SMALLFONT}{BLACK}帶有鏈條的坡道, 會將車卡拉上坡 STR_0929 :'S'型彎道 (向左) STR_0930 :'S'型彎道 (向右) STR_0931 :垂直回環 (向左) STR_0932 :垂直回環 (向右) STR_0933 :先把地面降低或升高 -STR_0934 :遊樂設施的入口擋於此地 -STR_0935 :遊樂設施的出口擋於此地 +STR_0934 :遊樂設施的入口擋在路上 +STR_0935 :遊樂設施的出口擋在路上 STR_0936 :樂園入口擋於此地 STR_0937 :{SMALLFONT}{BLACK}檢視選項 STR_0938 :{SMALLFONT}{BLACK}調整地勢高低及陡峭 @@ -1181,7 +1181,7 @@ STR_1175 :不能在斜路上建造此物件 STR_1176 :不能在此建造道路... STR_1177 :不能移除此處道路... STR_1178 :不適合的土地斜度 -STR_1179 :道路擋在路中 +STR_1179 :道路擋在路上 STR_1180 :不能建造此於水底! STR_1181 :道路 STR_1182 :類別 @@ -1413,7 +1413,7 @@ STR_1407 :{WINDOW_COLOUR_2}建造此軌道... STR_1408 :{WINDOW_COLOUR_2}費用: {BLACK}{CURRENCY} STR_1409 :入口/出口平台 STR_1410 :垂直高塔 -STR_1411 :{STRINGID}擋在路中 +STR_1411 :{STRINGID}擋在路上 STR_1412 :{WINDOW_COLOUR_3}數據記錄並不適合這類型的遊樂設施 STR_1413 :{WINDOW_COLOUR_3}數據會於{STRINGID}離開{STRINGID}後記錄 STR_1414 :{SMALLFONT}{BLACK}{DURATION} @@ -1875,8 +1875,8 @@ STR_1869 :{WINDOW_COLOUR_2}旋轉次數: STR_1870 :{SMALLFONT}{BLACK}完整旋轉次數 STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1872 :{COMMA16} -STR_1873 :{WINDOW_COLOUR_2}收入: {BLACK}{CURRENCY2DP}/每小時 -STR_1874 :{WINDOW_COLOUR_2}營利: {BLACK}{CURRENCY2DP}/每小時 +STR_1873 :{WINDOW_COLOUR_2}收入: {BLACK}每小時{CURRENCY2DP} +STR_1874 :{WINDOW_COLOUR_2}營利: {BLACK}每小時{CURRENCY2DP} STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}檢查遊樂設施 STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}修理遊樂設施 @@ -1891,14 +1891,14 @@ STR_1885 :從不 STR_1886 :檢查{STRINGID}中 STR_1887 :{WINDOW_COLOUR_2}上次檢查時間: {BLACK}{COMMA16}分鐘前 STR_1888 :{WINDOW_COLOUR_2}上次檢查時間: {BLACK}多於4小時 -STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1889 :{WINDOW_COLOUR_2}故障度: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1890 :{SMALLFONT}{BLACK}選擇維修人員檢查此遊樂設施的時距 STR_1891 :在樂園裡暫未有{STRINGID}! # The following two strings were used to display an error when the disc was missing. # This has been replaced in OpenRCT2. STR_1892 : STR_1893 : -STR_1894 :{WINDOW_COLOUR_2}賣出{STRINGID}: {BLACK}{COMMA32} +STR_1894 :{WINDOW_COLOUR_2}售出{STRINGID}: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}建造新的遊樂設施/店鋪 STR_1896 :{WINDOW_COLOUR_2}支出/收入 STR_1897 :{WINDOW_COLOUR_2}建造遊樂設施 @@ -1915,7 +1915,7 @@ STR_1907 :{WINDOW_COLOUR_2}員工薪金 STR_1908 :{WINDOW_COLOUR_2}營銷費用 STR_1909 :{WINDOW_COLOUR_2}研發費用 STR_1910 :{WINDOW_COLOUR_2}貸款利息 -STR_1911 :{BLACK} 每年 {COMMA16}% +STR_1911 :{BLACK} 每年{COMMA16}% STR_1912 :{MONTH} STR_1913 :{BLACK}+{CURRENCY2DP} STR_1914 :{BLACK}{CURRENCY2DP} @@ -2765,7 +2765,7 @@ STR_2755 :修復被毀壞的物件 STR_2756 :移除垃圾 STR_2757 :強制晴天 STR_2758 :強制雷暴 -STR_2759 :無'擋在路中'檢查 +STR_2759 :無'擋在路上'檢查 STR_2760 :+{CURRENCY} STR_2761 : STR_2762 : @@ -3851,3 +3851,4 @@ STR_5508 :允許載入校驗失敗的檔案 STR_5509 :{SMALLFONT}{BLACK}允許載入校驗失敗的劇情及存檔, 例如試玩版的劇情或已損壞的存檔. STR_5510 :預設聲效裝置 STR_5511 :(未知) +STR_5512 :另存遊戲 diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 3e3e888a66..0d7e0c000e 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3844,3 +3844,4 @@ STR_5508 :Laden van bestanden met incorrecte checksum toestaan STR_5509 :{SMALLFONT}{BLACK}Maakt het mogelijk om scenario's en opgeslagen spellen met een incorrecte checksum te laden, zoals scenario's uit de demo of beschadigde opgeslagen parken. STR_5510 :Standaard geluidsapparaat STR_5511 :(ONBEKEND) +STR_5512 :Spel opslaan als... diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 0cacce825f..fd111c8b17 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3852,3 +3852,4 @@ STR_5508 :Allow loading files with incorrect checksums STR_5509 :{SMALLFONT}{BLACK}Allows loading scenarios and saves that have an incorrect checksum, like the scenarios from the demo or damaged saves. STR_5510 :Default sound device STR_5511 :(UNKNOWN) +STR_5512 :Save Game As diff --git a/data/language/german.txt b/data/language/german.txt index 6af40d496f..5f62a55eec 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3841,3 +3841,8 @@ STR_5504 :{SMALLFONT}{BLACK}Mehrspielerstatus anzeigen STR_5505 :Verbindung zum Server konnte nicht hergestellt werden STR_5506 :Besucher ignorieren Bahnintensität STR_5507 :Parkpfleger mähen standardmäßig Gras +STR_5508 :Laden von Dateien mit unzul. Prüfsummen erlauben +STR_5509 :{SMALLFONT}{BLACK}Erlaubt das Laden von Szenarios und gespeicherten Spielständen, die eine unzulässige Prüfsumme haben, wie Szenarios aus der Demo oder fehlerhafte Spielstände +STR_5510 :Standard Audiogerät +STR_5511 :(UNBEKANNT) +STR_5512 :Spiel speichern unter From 11fa6bbab7e9256f776053b7e4535a8302b196cf Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 21 Aug 2015 09:34:58 +0200 Subject: [PATCH 0581/1173] Fill ride construction dropdown properly before drawing it, fixes #1793 --- src/windows/ride_construction.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 3137441211..ff66d9fbef 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -3132,16 +3132,6 @@ static void window_ride_construction_select_map_tiles(rct_ride *ride, int trackT */ static void window_ride_construction_show_special_track_dropdown(rct_window *w, rct_widget *widget) { - window_dropdown_show_text_custom_width( - w->x + widget->left, - w->y + widget->top, - widget->bottom - widget->top + 1, - w->colours[1], - 0, - _numCurrentPossibleRideConfigurations, - widget->right - widget->left - ); - for (int i = 0; i < _numCurrentPossibleRideConfigurations; i++) { uint8 trackPiece = _currentPossibleRideConfigurations[i]; rct_string_id trackPieceStringId = RideConfigurationStringIds[trackPiece]; @@ -3156,6 +3146,16 @@ static void window_ride_construction_show_special_track_dropdown(rct_window *w, } } *gDropdownItemsDisabled = RCT2_GLOBAL(0x00F4409C, uint32); + + window_dropdown_show_text_custom_width( + w->x + widget->left, + w->y + widget->top, + widget->bottom - widget->top + 1, + w->colours[1], + 0, + _numCurrentPossibleRideConfigurations, + widget->right - widget->left + ); } /** From 1a877e637d7d6a3dbe651f0d235323ff27ee1456 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 22 Aug 2015 11:56:32 +0100 Subject: [PATCH 0582/1173] refactor sprite_invalidate --- src/game.c | 10 +- src/game.h | 4 +- src/openrct2.c | 4 +- src/peep/peep.c | 222 +++++++++++++++++++------------------- src/peep/staff.c | 6 +- src/ride/ride.c | 10 +- src/windows/guest.c | 6 +- src/windows/save_prompt.c | 7 +- src/windows/staff.c | 6 +- src/world/footpath.c | 2 +- src/world/fountain.c | 2 +- src/world/map_animation.c | 2 +- src/world/sprite.c | 96 +++++++---------- src/world/sprite.h | 6 +- 14 files changed, 179 insertions(+), 204 deletions(-) diff --git a/src/game.c b/src/game.c index ca0e321728..5bbe338ad7 100644 --- a/src/game.c +++ b/src/game.c @@ -994,7 +994,7 @@ static int show_save_game_dialog(char *resultPath) return result; } -int save_game() +void save_game() { if (!gFirstTimeSave) { utf8 path[MAX_PATH]; @@ -1012,18 +1012,14 @@ int save_game() log_verbose("Saved to %s", gScenarioSaveName); SDL_RWclose(rw); } - - return 0; - } - else { + } else { save_game_as(); } } -int save_game_as() +void save_game_as() { window_loadsave_open(LOADSAVETYPE_SAVE | LOADSAVETYPE_GAME, gScenarioSaveName); - return 0; } diff --git a/src/game.h b/src/game.h index 7516ea50b6..d067b6dc5b 100644 --- a/src/game.h +++ b/src/game.h @@ -132,8 +132,8 @@ int game_load_save(const char *path); void game_load_init(); void game_pause_toggle(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void pause_toggle(); -int save_game(); -int save_game_as(); +void save_game(); +void save_game_as(); void rct2_exit(); void rct2_exit_reason(rct_string_id title, rct_string_id body); void game_autosave(); diff --git a/src/openrct2.c b/src/openrct2.c index e0b5ade765..2778948fef 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -358,7 +358,7 @@ static void openrct2_loop() _spritelocations2[i].z + (sint16)((_spritelocations1[i].z - _spritelocations2[i].z) * nudge), &g_sprite_list[i] ); - invalidate_sprite(&g_sprite_list[i]); + invalidate_sprite_2(&g_sprite_list[i]); } platform_process_messages(); @@ -375,7 +375,7 @@ static void openrct2_loop() if (!sprite_should_tween(&g_sprite_list[i])) continue; - invalidate_sprite(&g_sprite_list[i]); + invalidate_sprite_2(&g_sprite_list[i]); sprite_move(_spritelocations2[i].x, _spritelocations2[i].y, _spritelocations2[i].z, &g_sprite_list[i]); } network_update(); diff --git a/src/peep/peep.c b/src/peep/peep.c index 08cfbf1149..5e99ed6eb7 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -654,7 +654,7 @@ static void sub_68F41A(rct_peep *peep, int index) peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } } } @@ -808,7 +808,7 @@ void sub_693B58(rct_peep* peep){ } if (ebx == peep->action_sprite_type)return; - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep->action_sprite_type = ebx; uint8* edx = RCT2_ADDRESS(0x98270C, uint8*)[peep->sprite_type * 2]; @@ -816,7 +816,7 @@ void sub_693B58(rct_peep* peep){ peep->sprite_height_negative = edx[ebx * 4 + 1]; peep->sprite_height_positive = edx[ebx * 4 + 2]; // This is pointless as nothing will have changed. - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } /* 0x00693BE5 */ @@ -974,7 +974,7 @@ int peep_update_action(sint16* x, sint16* y, sint16* xy_distance, rct_peep* peep peep->action_sprite_image_offset = 0; peep->action = 0xFF; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); *x = peep->x; *y = peep->y; return 1; @@ -983,7 +983,7 @@ int peep_update_action(sint16* x, sint16* y, sint16* xy_distance, rct_peep* peep // If not throwing up and not at the frame where sick appears. if (peep->action != PEEP_ACTION_THROW_UP || peep->action_frame != 15){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); *x = peep->x; *y = peep->y; return 1; @@ -1006,7 +1006,7 @@ int peep_update_action(sint16* x, sint16* y, sint16* xy_distance, rct_peep* peep int sound_id = SOUND_COUGH_1 + (scenario_rand() & 3); sound_play_panned(sound_id, 0x8001, peep->x, peep->y, peep->z); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); *x = peep->x; *y = peep->y; return 1; @@ -1225,7 +1225,7 @@ void peep_window_state_update(rct_peep* peep){ /* rct2: 0x0069A535*/ void peep_sprite_remove(rct_peep* peep){ remove_peep_from_ride(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); window_close_by_number(WC_PEEP, peep->sprite_index); @@ -1313,7 +1313,7 @@ void peep_update_falling(rct_peep* peep){ if (height - 4 >= peep->z && height < peep->z + 20){ // Looks like we are drowning! - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(peep->x, peep->y, height, (rct_sprite*)peep); // Drop balloon if held if (peep->item_standard_flags & PEEP_ITEM_BALLOON){ @@ -1333,7 +1333,7 @@ void peep_update_falling(rct_peep* peep){ peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep_window_state_update(peep); return; } @@ -1348,20 +1348,20 @@ void peep_update_falling(rct_peep* peep){ // This will be null if peep is falling if (saved_map == NULL){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); if (peep->z <= 1){ // Remove peep if it has gone to the void peep_remove(peep); return; } sprite_move(peep->x, peep->y, peep->z - 2, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(peep->x, peep->y, saved_height, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep->next_x = peep->x & 0xFFE0; peep->next_y = peep->y & 0xFFE0; @@ -1414,11 +1414,11 @@ void peep_update_sitting(rct_peep* peep){ int y = (peep->y & 0xFFE0) + RCT2_ADDRESS(0x981F2E, uint16)[ebx * 2]; int z = peep->z; - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, z, (rct_sprite*)peep); peep->sprite_direction = ((peep->var_37 + 2) & 3) * 8; - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep->action = 254; peep->var_6F = 7; sub_693BAB(peep); @@ -1466,7 +1466,7 @@ void peep_update_sitting(rct_peep* peep){ peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -1491,7 +1491,7 @@ void peep_update_sitting(rct_peep* peep){ peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } } @@ -1613,7 +1613,7 @@ static void peep_update_ride_sub_state_0(rct_peep* peep){ rct_ride* ride = GET_RIDE(peep->current_ride); if (peep->destination_tolerence != 0){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sint16 x, y, xy_distance; @@ -1623,7 +1623,7 @@ static void peep_update_ride_sub_state_0(rct_peep* peep){ z = ride->station_heights[peep->current_ride_station] * 8 + 2; } sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } else{ peep->destination_tolerence = 0; @@ -1791,7 +1791,7 @@ void peep_update_ride_sub_state_1(rct_peep* peep){ xy_distance < RCT2_GLOBAL(0xF1AECA, uint16)) peep->sub_state = 2; - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sint16 z = ride->station_heights[peep->current_ride_station] * 8; @@ -1802,7 +1802,7 @@ void peep_update_ride_sub_state_1(rct_peep* peep){ } sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -1974,7 +1974,7 @@ static void peep_go_to_ride_exit(rct_peep* peep, rct_ride* ride, sint16 x, sint1 z += RCT2_ADDRESS(0x0097D21C, uint8)[ride->type * 8]; sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); x = ride->exits[peep->current_ride_station] & 0xFF; y = ride->exits[peep->current_ride_station] >> 8; @@ -2215,7 +2215,7 @@ static void peep_update_ride_sub_state_5(rct_peep* peep){ ride->var_120++; vehicle->var_46 += seated_peep->var_41; - invalidate_sprite((rct_sprite*)seated_peep); + invalidate_sprite_2((rct_sprite*)seated_peep); sprite_move(0x8000, 0, 0, (rct_sprite*)seated_peep); peep_decrement_num_riders(seated_peep); @@ -2230,9 +2230,9 @@ static void peep_update_ride_sub_state_5(rct_peep* peep){ ride->var_120++; vehicle->var_46 += peep->var_41; - invalidate_sprite((rct_sprite*)vehicle); + invalidate_sprite_2((rct_sprite*)vehicle); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(0x8000, 0, 0, (rct_sprite*)peep); peep_decrement_num_riders(peep); @@ -2270,7 +2270,7 @@ void peep_update_ride_sub_state_7(rct_peep* peep){ vehicle->num_peeps--; vehicle->var_46 -= peep->var_41; - invalidate_sprite((rct_sprite*)vehicle); + invalidate_sprite_2((rct_sprite*)vehicle); peep->current_ride_station = ride_station; @@ -2420,7 +2420,7 @@ void peep_update_ride_sub_state_7(rct_peep* peep){ z += 15; sprite_move(exit_x, exit_y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); x += vehicle_type->peep_loading_positions[peep->var_37 * 2 + 1]; y += vehicle_type->peep_loading_positions[peep->var_37 * 2 + 2]; @@ -2475,9 +2475,9 @@ static void peep_update_ride_prepare_for_state_9(rct_peep* peep){ static void peep_update_ride_sub_state_8(rct_peep* peep){ sint16 x, y, xy_distance; if (peep_update_action(&x, &y, &xy_distance, peep)){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -2490,20 +2490,20 @@ static void peep_update_ride_sub_state_9(rct_peep* peep){ rct_ride* ride = GET_RIDE(peep->current_ride); if (peep_update_action(&x, &y, &xy_distance, peep)){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); if (xy_distance >= 16){ sint16 z = ride->station_heights[peep->current_ride_station] * 8; z += RCT2_ADDRESS(0x97D21C, uint8)[ride->type * 8]; sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } sub_693BE5(peep, 0); sprite_move(x, y, peep->z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO){ @@ -2538,9 +2538,9 @@ static void peep_update_ride_sub_state_12(rct_peep* peep){ else{ z = peep->z; } - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -2597,9 +2597,9 @@ static void peep_udpate_ride_sub_state_13(rct_peep* peep){ else{ z = peep->z; } - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -2678,9 +2678,9 @@ static void peep_update_ride_sub_state_14(rct_peep* peep){ rct_ride* ride = GET_RIDE(peep->current_ride); if (peep_update_action(&x, &y, &xy_distance, peep)){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -2793,7 +2793,7 @@ static void peep_update_ride_sub_state_15(rct_peep* peep){ peep->sprite_direction = (peep->var_37 & 0xC) * 2; - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep->var_37++; return; @@ -2806,9 +2806,9 @@ static void peep_update_ride_sub_state_15(rct_peep* peep){ sint16 x, y, xy_distance; if (peep_update_action(&x, &y, &xy_distance, peep)){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -2834,9 +2834,9 @@ static void peep_update_ride_sub_state_16(rct_peep* peep){ sint16 x, y, xy_distance; if (peep_update_action(&x, &y, &xy_distance, peep)){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -2900,9 +2900,9 @@ static void peep_update_ride_sub_state_17(rct_peep* peep){ sint16 x, y, xy_distance; if (peep_update_action(&x, &y, &xy_distance, peep)){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -2920,7 +2920,7 @@ static void peep_update_ride_sub_state_17(rct_peep* peep){ peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } } @@ -3026,9 +3026,9 @@ static void peep_update_ride_sub_state_17(rct_peep* peep){ } if (peep_update_action(&x, &y, &xy_distance, peep)){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } } @@ -3039,9 +3039,9 @@ static void peep_update_ride_sub_state_18(rct_peep* peep){ rct_ride* ride = GET_RIDE(peep->current_ride); if (peep_update_action(&x, &y, &xy_distance, peep)){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, ride->station_heights[peep->current_ride_station] * 8, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -3078,7 +3078,7 @@ static void peep_update_ride_sub_state_18(rct_peep* peep){ continue; sprite_move(peep->x, peep->y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } while (!map_element_is_last_for_tile(mapElement++)); } @@ -3088,9 +3088,9 @@ static void peep_update_ride_sub_state_19(rct_peep* peep){ sint16 x, y, xy_distance; if (peep_update_action(&x, &y, &xy_distance, peep)){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -3147,9 +3147,9 @@ static void peep_update_ride_sub_state_21(rct_peep* peep){ sint16 x, y, xy_distance; if (peep_update_action(&x, &y, &xy_distance, peep)){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); x = peep->x & 0xFFE0; y = peep->y & 0xFFE0; @@ -3195,9 +3195,9 @@ static void peep_update_ride(rct_peep* peep){ break; } - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); break; } case 5: @@ -3300,7 +3300,7 @@ static void peep_update_queuing(rct_peep* peep){ } //Give up queueing for the ride peep->sprite_direction ^= (1 << 4); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); remove_peep_from_queue(peep); peep_decrement_num_riders(peep); peep->state = PEEP_STATE_1; @@ -3317,7 +3317,7 @@ static void peep_update_queuing(rct_peep* peep){ peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } if (peep->time_in_queue >= 3500 && (0xFFFF & scenario_rand()) <= 93) { @@ -3355,7 +3355,7 @@ static void peep_update_queuing(rct_peep* peep){ peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); break; } } @@ -3365,7 +3365,7 @@ static void peep_update_queuing(rct_peep* peep){ if (peep->happiness <= 65 && (0xFFFF & scenario_rand()) < 2184){ //Give up queueing for the ride peep->sprite_direction ^= (1 << 4); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); remove_peep_from_queue(peep); peep_decrement_num_riders(peep); peep->state = PEEP_STATE_1; @@ -3378,13 +3378,13 @@ static void peep_update_mowing(rct_peep* peep){ peep->var_E2 = 0; if (!sub_68F3AE(peep))return; - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); while (1){ sint16 x = 0, y = 0, z, xy_distance; if (peep_update_action(&x, &y, &xy_distance, peep)){ z = map_element_height(x, y) & 0xFFFF; sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -3431,7 +3431,7 @@ static void peep_update_watering(rct_peep* peep){ peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep->sub_state = 1; } @@ -3484,7 +3484,7 @@ static void peep_update_emptying_bin(rct_peep* peep){ peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep->sub_state = 1; } @@ -3542,7 +3542,7 @@ static void peep_update_sweeping(rct_peep* peep){ peep->var_E2 = 0; if (!sub_68F3AE(peep))return; - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); if (peep->action == PEEP_ACTION_STAFF_SWEEP && peep->action_frame == 8){ // Remove sick at this location @@ -3554,7 +3554,7 @@ static void peep_update_sweeping(rct_peep* peep){ if (peep_update_action(&x, &y, &xy_distance, peep)){ z = peep_get_height_on_slope(peep, x, y); sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -3564,7 +3564,7 @@ static void peep_update_sweeping(rct_peep* peep){ peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } peep_state_reset(peep); @@ -3612,9 +3612,9 @@ static void peep_update_leaving_park(rct_peep* peep){ sint16 x = 0, y = 0, xy_distance; if (peep_update_action(&x, &y, &xy_distance, peep)){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -3643,7 +3643,7 @@ static void peep_update_watching(rct_peep* peep){ peep->destination_y = peep->y; peep->sprite_direction = (peep->var_37 & 3) * 8; - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep->action = 0xFE; peep->var_6F = 2; @@ -3671,7 +3671,7 @@ static void peep_update_watching(rct_peep* peep){ peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } } @@ -3681,7 +3681,7 @@ static void peep_update_watching(rct_peep* peep){ peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } @@ -3691,7 +3691,7 @@ static void peep_update_watching(rct_peep* peep){ peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } } @@ -3729,9 +3729,9 @@ static void peep_update_entering_park(rct_peep* peep){ } sint16 x = 0, y = 0, xy_distance; if (peep_update_action(&x, &y, &xy_distance, peep)){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return; } peep_decrement_num_riders(peep); @@ -4007,7 +4007,7 @@ static void peep_update_buying(rct_peep* peep) peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); ride->no_primary_items_sold++; } @@ -4258,7 +4258,7 @@ static void peep_update_heading_to_inspect(rct_peep* peep){ // Falls through into sub_state 4 } - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sint16 delta_y = abs(peep->y - peep->destination_y); @@ -4278,7 +4278,7 @@ static void peep_update_heading_to_inspect(rct_peep* peep){ } sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } /* rct2: 0x006C0CB8 */ @@ -4300,7 +4300,7 @@ static void peep_update_answering(rct_peep* peep){ peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep->sub_state = 1; peep_window_state_update(peep); @@ -4368,7 +4368,7 @@ static void peep_update_answering(rct_peep* peep){ // Falls through into sub_state 4 } - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sint16 delta_y = abs(peep->y - peep->destination_y); @@ -4388,7 +4388,7 @@ static void peep_update_answering(rct_peep* peep){ } sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } /* rct2: 0x006BF483 */ @@ -4582,10 +4582,10 @@ static void peep_update_patrolling(rct_peep* peep){ if (map_element != NULL){ int water_height = map_element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK; if (water_height){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); water_height *= 16; sprite_move(peep->x, peep->y, water_height, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep_decrement_num_riders(peep); peep->state = PEEP_STATE_FALLING; @@ -4613,14 +4613,14 @@ static void peep_update_walking(rct_peep* peep){ if (peep->flags & PEEP_FLAGS_WAVING){ if (peep->action >= PEEP_ACTION_NONE_1){ if ((0xFFFF & scenario_rand()) < 936){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep->action = PEEP_ACTION_WAVE_2; peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } } } @@ -4628,14 +4628,14 @@ static void peep_update_walking(rct_peep* peep){ if (peep->flags & PEEP_FLAGS_PHOTO){ if (peep->action >= PEEP_ACTION_NONE_1){ if ((0xFFFF & scenario_rand()) < 936){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep->action = PEEP_ACTION_TAKE_PHOTO; peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } } } @@ -4643,14 +4643,14 @@ static void peep_update_walking(rct_peep* peep){ if (peep->flags & PEEP_FLAGS_PAINTING){ if (peep->action >= PEEP_ACTION_NONE_1){ if ((0xFFFF & scenario_rand()) < 936){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep->action = PEEP_ACTION_DRAW_PICTURE; peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } } } @@ -4707,10 +4707,10 @@ static void peep_update_walking(rct_peep* peep){ int water_height = map_element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK; if (water_height){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); water_height *= 16; sprite_move(peep->x, peep->y, water_height, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep_decrement_num_riders(peep); peep->state = PEEP_STATE_FALLING; @@ -5249,7 +5249,7 @@ void peep_applause() peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } } @@ -5309,7 +5309,7 @@ rct_peep *peep_generate(int x, int y, int z) peep->sprite_direction = 0; sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep->var_41 = (scenario_rand() & 0x1F) + 45; peep->var_C4 = 0; @@ -5866,7 +5866,7 @@ void peep_insert_new_thought(rct_peep *peep, uint8 thought_type, uint8 thought_a peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } for (int i = 0; i < PEEP_MAX_THOUGHTS; ++i){ @@ -5960,13 +5960,13 @@ void peep_set_map_tooltip(rct_peep *peep) void sub_693BAB(rct_peep* peep) { uint8 bl = peep->var_6F; if (bl != peep->action_sprite_type) { - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep->action_sprite_type = bl; uint8* edx = RCT2_ADDRESS(0x98270C, uint8*)[peep->sprite_type * 2]; peep->sprite_width = edx[bl * 4]; peep->sprite_height_negative = edx[bl * 4 + 1]; peep->sprite_height_positive = edx[bl * 4 + 2]; - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } } @@ -6035,7 +6035,7 @@ static int peep_update_queue_position(rct_peep* peep){ peep->action = PEEP_ACTION_NONE_1; peep->var_6F = 2; if (RCT2_GLOBAL(0x00F1AEF1, uint8) != 0xFE) - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return 1; } @@ -6141,9 +6141,9 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m peep->destination_x += TileDirectionDelta[peep->var_78].x; peep->destination_y += TileDirectionDelta[peep->var_78].y; peep->destination_tolerence = 9; - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep_decrement_num_riders(peep); peep->state = PEEP_STATE_LEAVING_PARK; @@ -6265,9 +6265,9 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m peep->destination_y += TileDirectionDelta[peep->var_78].y; peep->destination_tolerence = 7; - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return 1; } @@ -6283,9 +6283,9 @@ static int peep_footpath_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_ma sint16 z = peep_get_height_on_slope(peep, x, y); if (peep->type == PEEP_TYPE_STAFF){ - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return 1; } @@ -6400,9 +6400,9 @@ static int peep_footpath_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_ma } } - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return 1; } @@ -7409,9 +7409,9 @@ static int sub_693C9E(rct_peep *peep) if ((x & 0xFFE0) == peep->next_x && (y & 0xFFE0) == peep->next_y){ sint16 z = peep_get_height_on_slope(peep, x, y); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return 1; } @@ -7478,9 +7478,9 @@ static int sub_693C9E(rct_peep *peep) peep->next_var_29 = 8; sint16 z = peep_get_height_on_slope(peep, x, y); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); return 1; } } @@ -8512,7 +8512,7 @@ static void peep_read_map(rct_peep *peep) peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); } } diff --git a/src/peep/staff.c b/src/peep/staff.c index 325f801300..c28dd35e0e 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -239,12 +239,12 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, } sprite_move(x, y, z + 16, (rct_sprite*)newPeep); - invalidate_sprite((rct_sprite*)newPeep); + invalidate_sprite_2((rct_sprite*)newPeep); } else { newPeep->state = PEEP_STATE_PICKED; sprite_move(newPeep->x, newPeep->y, newPeep->z, (rct_sprite*)newPeep); - invalidate_sprite((rct_sprite*)newPeep); + invalidate_sprite_2((rct_sprite*)newPeep); } newPeep->time_in_park = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); @@ -304,7 +304,7 @@ void game_command_set_staff_order(int *eax, int *ebx, int *ecx, int *edx, int *e } peep->action_frame = 0; sub_693B58(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); window_invalidate_by_number(WC_PEEP, sprite_id); window_invalidate_by_class(WC_STAFF_LIST); }else{ diff --git a/src/ride/ride.c b/src/ride/ride.c index cef114c29c..4645bd30a4 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -874,7 +874,7 @@ static void ride_remove_cable_lift(rct_ride *ride) spriteIndex = ride->cable_lift; do { vehicle = &(g_sprite_list[spriteIndex].vehicle); - invalidate_sprite((rct_sprite*)vehicle); + invalidate_sprite_2((rct_sprite*)vehicle); sprite_remove((rct_sprite*)vehicle); spriteIndex = vehicle->next_vehicle_on_train; } while (spriteIndex != SPRITE_INDEX_NULL); @@ -899,7 +899,7 @@ static void ride_remove_vehicles(rct_ride *ride) spriteIndex = ride->vehicles[i]; while (spriteIndex != SPRITE_INDEX_NULL) { vehicle = &(g_sprite_list[spriteIndex].vehicle); - invalidate_sprite((rct_sprite*)vehicle); + invalidate_sprite_2((rct_sprite*)vehicle); sprite_remove((rct_sprite*)vehicle); spriteIndex = vehicle->next_vehicle_on_train; } @@ -996,7 +996,7 @@ void ride_remove_peeps(int rideIndex) if (peep->state == PEEP_STATE_QUEUING_FRONT && peep->sub_state == 0) remove_peep_from_queue(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); if (exitDirection == 255) { x = peep->next_x + 16; @@ -1011,7 +1011,7 @@ void ride_remove_peeps(int rideIndex) peep->sprite_direction = exitDirection; } - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep->state = PEEP_STATE_FALLING; sub_693BE5(peep, 0); @@ -5947,7 +5947,7 @@ static void ride_update_vehicle_colours(int rideIndex) vehicle->colours = colours; vehicle->colours_extended = coloursExtended; - invalidate_sprite((rct_sprite*)vehicle); + invalidate_sprite_2((rct_sprite*)vehicle); spriteIndex = vehicle->next_vehicle_on_train; carIndex++; } diff --git a/src/windows/guest.c b/src/windows/guest.c index 935b4cc28f..fdcf4e1d2c 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -615,7 +615,7 @@ void window_guest_overview_mouse_up(rct_window *w, int widgetIndex) w->var_48C = peep->x; remove_peep_from_ride(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(0x8000, peep->y, peep->z, (rct_sprite*)peep); peep_decrement_num_riders(peep); @@ -1194,7 +1194,7 @@ void window_guest_overview_tool_down(rct_window* w, int widgetIndex, int x, int rct_peep* peep = GET_PEEP(w->number); sprite_move(dest_x, dest_y, dest_z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep_decrement_num_riders(peep); peep->state = 0; peep_window_state_update(peep); @@ -1222,7 +1222,7 @@ void window_guest_overview_tool_abort(rct_window *w, int widgetIndex) return; sprite_move( w->var_48C, peep->y, peep->z + 8, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); if (peep->x != (sint16)0x8000){ peep_decrement_num_riders(peep); diff --git a/src/windows/save_prompt.c b/src/windows/save_prompt.c index cca05c7420..03e0b42ce8 100644 --- a/src/windows/save_prompt.c +++ b/src/windows/save_prompt.c @@ -235,11 +235,8 @@ static void window_save_prompt_mouseup(rct_window *w, int widgetIndex) } else { switch (widgetIndex) { case WIDX_SAVE: - if (!save_game_as()) { - // user pressed cancel - window_close(w); - return; - } + save_game_as(); + window_close(w); break; case WIDX_DONT_SAVE: game_load_or_quit_no_save_prompt(); diff --git a/src/windows/staff.c b/src/windows/staff.c index c6d8281479..2eb8a4fb87 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -450,7 +450,7 @@ void window_staff_overview_mouseup(rct_window *w, int widgetIndex) w->var_48C = peep->x; remove_peep_from_ride(peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move( 0x8000, peep->y, peep->z, (rct_sprite*)peep); peep_decrement_num_riders(peep); @@ -1099,7 +1099,7 @@ void window_staff_overview_tool_down(rct_window* w, int widgetIndex, int x, int rct_peep* peep = GET_PEEP(w->number); sprite_move(dest_x, dest_y, dest_z, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); peep_decrement_num_riders(peep); peep->state = PEEP_STATE_FALLING; peep_window_state_update(peep); @@ -1130,7 +1130,7 @@ void window_staff_overview_tool_abort(rct_window *w, int widgetIndex) if (peep->state != PEEP_STATE_PICKED) return; sprite_move(w->var_48C, peep->y, peep->z + 8, (rct_sprite*)peep); - invalidate_sprite((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); if (peep->x != (sint16)0x8000){ peep_decrement_num_riders(peep); diff --git a/src/world/footpath.c b/src/world/footpath.c index 585897a0f1..eab90654f9 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -657,7 +657,7 @@ void footpath_remove_litter(int x, int y, int z) if (sprite->linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_LITTER) { int distanceZ = abs(sprite->z - z); if (distanceZ <= 32) { - sub_6EC60B((rct_sprite*)sprite); + invalidate_sprite_0((rct_sprite*)sprite); sprite_remove((rct_sprite*)sprite); } } diff --git a/src/world/fountain.c b/src/world/fountain.c index c034d2fc46..7f4d1b738e 100644 --- a/src/world/fountain.c +++ b/src/world/fountain.c @@ -216,7 +216,7 @@ void jumping_fountain_update(rct_jumping_fountain *jumpingFountain) if (original_var_26a <= 255 - 160) return; - sub_6EC60B((rct_sprite*)jumpingFountain); + invalidate_sprite_0((rct_sprite*)jumpingFountain); jumpingFountain->var_26b++; switch (jumpingFountain->misc_identifier) { diff --git a/src/world/map_animation.c b/src/world/map_animation.c index e612e07ed8..2d3241d20f 100644 --- a/src/world/map_animation.c +++ b/src/world/map_animation.c @@ -212,7 +212,7 @@ static bool map_animation_invalidate_small_scenery(int x, int y, int baseZ) peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - sub_6EC53F((rct_sprite*)peep); + invalidate_sprite_1((rct_sprite*)peep); break; } } diff --git a/src/world/sprite.c b/src/world/sprite.c index 5256b817bf..0b8570e5bb 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -77,7 +77,7 @@ void balloon_pop(rct_balloon *balloon) */ void balloon_update(rct_balloon *balloon) { - invalidate_sprite((rct_sprite*)balloon); + invalidate_sprite_2((rct_sprite*)balloon); if (balloon->popped == 1) { balloon->var_26 += 256; if (balloon->var_26 >= 1280) @@ -211,7 +211,7 @@ void duck_update(rct_duck *duck) static void duck_invalidate(rct_duck *duck) { - sub_6EC60B((rct_sprite*)duck); + invalidate_sprite_0((rct_sprite*)duck); } /** @@ -498,7 +498,7 @@ void money_effect_create(money32 value) */ void money_effect_update(rct_money_effect *moneyEffect) { - invalidate_sprite((rct_sprite*)moneyEffect); + invalidate_sprite_2((rct_sprite*)moneyEffect); moneyEffect->wiggle++; if (moneyEffect->wiggle >= 22) moneyEffect->wiggle = 0; @@ -520,58 +520,49 @@ void money_effect_update(rct_money_effect *moneyEffect) sprite_remove((rct_sprite*)moneyEffect); } -/* - * - * rct2: 0x006EC473 - */ -void invalidate_sprite(rct_sprite* sprite){ +void invalidate_sprite_max_zoom(rct_sprite *sprite, int maxZoom) +{ if (sprite->unknown.sprite_left == (sint16)0x8000) return; - for (rct_viewport** viewport_p = RCT2_ADDRESS(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); *viewport_p != NULL; viewport_p++){ + for (rct_viewport** viewport_p = RCT2_ADDRESS(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); *viewport_p != NULL; viewport_p++) { rct_viewport* viewport = *viewport_p; - int left, right, top, bottom; - left = sprite->unknown.sprite_left; - right = sprite->unknown.sprite_right; - top = sprite->unknown.sprite_top; - bottom = sprite->unknown.sprite_bottom; - - if (viewport->zoom >= 3)continue; - if (right <= viewport->view_x)continue; - if (bottom <= viewport->view_y) continue; - - int viewport_right = viewport->view_x + viewport->view_width; - int viewport_bottom = viewport->view_y + viewport->view_height; - - if (left >= viewport_right)continue; - if (top >= viewport_bottom)continue; - - left = max(left, viewport->view_x); - right = min(right, viewport_right); - top = max(top, viewport->view_y); - bottom = min(bottom, viewport_bottom); - - left -= viewport->view_x; - top -= viewport->view_y; - right -= viewport->view_x; - bottom -= viewport->view_y; - - int zoom = 1 << viewport->zoom; - left /= zoom; - top /= zoom; - right /= zoom; - bottom /= zoom; - - gfx_set_dirty_blocks(left + viewport->x, top + viewport->y, right + viewport->x, bottom + viewport->y); + if (viewport->zoom <= maxZoom) { + viewport_invalidate( + viewport, + sprite->unknown.sprite_left, + sprite->unknown.sprite_top, + sprite->unknown.sprite_right, + sprite->unknown.sprite_bottom + ); + } } } /** - * Similar to invalidate sprite... - * rct2: 0x006EC60B + * Invalidate the sprite if at closest zoom. + * rct2: 0x006EC60B */ -void sub_6EC60B(rct_sprite* sprite) +void invalidate_sprite_0(rct_sprite* sprite) { - RCT2_CALLPROC_X(0x006EC60B, 0, 0, 0, 0, (int)sprite, 0, 0); + invalidate_sprite_max_zoom(sprite, 0); +} + +/** + * Invalidate sprite if at closest zoom or next zoom up from closest. + * rct2: 0x006EC53F + */ +void invalidate_sprite_1(rct_sprite *sprite) +{ + invalidate_sprite_max_zoom(sprite, 1); +} + +/** +* Invalidate sprite if not at furthest zoom. +* rct2: 0x006EC473 +*/ +void invalidate_sprite_2(rct_sprite *sprite) +{ + invalidate_sprite_max_zoom(sprite, 2); } /* @@ -999,7 +990,7 @@ void litter_create(int x, int y, int z, int direction, int type) } if (newestLitter != NULL) { - sub_6EC60B((rct_sprite*)newestLitter); + invalidate_sprite_0((rct_sprite*)newestLitter); sprite_remove((rct_sprite*)newestLitter); } } @@ -1016,19 +1007,10 @@ void litter_create(int x, int y, int z, int direction, int type) litter->sprite_identifier = SPRITE_IDENTIFIER_LITTER; litter->type = type; sprite_move(x, y, z, (rct_sprite*)litter); - sub_6EC60B((rct_sprite*)litter); + invalidate_sprite_0((rct_sprite*)litter); litter->creationTick = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32); } -/** - * - * rct2: 0x006EC53F - */ -void sub_6EC53F(rct_sprite *sprite) -{ - RCT2_CALLPROC_X(0x006EC53F, 0, 0, 0, 0, (int)sprite, 0, 0); -} - /** * * rct2: 0x006738E1 diff --git a/src/world/sprite.h b/src/world/sprite.h index 2b1ef468ea..2ba74fe34f 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -256,11 +256,11 @@ void sprite_clear_all_unused(); void move_sprite_to_list(rct_sprite *sprite, uint8 cl); void sprite_misc_update_all(); void sprite_move(sint16 x, sint16 y, sint16 z, rct_sprite* sprite); -void invalidate_sprite(rct_sprite *sprite); -void sub_6EC60B(rct_sprite* sprite); +void invalidate_sprite_0(rct_sprite* sprite); +void invalidate_sprite_1(rct_sprite *sprite); +void invalidate_sprite_2(rct_sprite *sprite); void sprite_remove(rct_sprite *sprite); void litter_create(int x, int y, int z, int direction, int type); -void sub_6EC53F(rct_sprite *sprite); void sub_6738E1(int x, int y, int z); void sprite_misc_3_create(int x, int y, int z); void sprite_misc_5_create(int x, int y, int z); From 3062bbf3b67e124650fca3882c2513140147d73f Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 22 Aug 2015 12:11:20 +0100 Subject: [PATCH 0583/1173] refactor balloon, duck and money effect --- projects/openrct2.vcxproj | 3 + projects/openrct2.vcxproj.filters | 9 + src/world/balloon.c | 83 +++++ src/world/duck.c | 309 +++++++++++++++++++ src/world/money_effect.c | 109 +++++++ src/world/sprite.c | 493 +----------------------------- src/world/sprite.h | 27 +- 7 files changed, 535 insertions(+), 498 deletions(-) create mode 100644 src/world/balloon.c create mode 100644 src/world/duck.c create mode 100644 src/world/money_effect.c diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 956fd8efe2..47362b5448 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -107,6 +107,9 @@ + + + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 8321dae4a5..262a0ef02b 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -522,6 +522,15 @@ Source\Windows + + Source\World + + + Source\World + + + Source\World + diff --git a/src/world/balloon.c b/src/world/balloon.c new file mode 100644 index 0000000000..62de010dfe --- /dev/null +++ b/src/world/balloon.c @@ -0,0 +1,83 @@ +#include "../audio/audio.h" +#include "../scenario.h" +#include "sprite.h" + +/** + * + * rct2: 0x006736C7 + */ +void create_balloon(int x, int y, int z, int colour, uint8 bl) +{ + rct_sprite* sprite = create_sprite(2); + if (sprite != NULL) { + sprite->balloon.var_14 = 13; + sprite->balloon.var_09 = 22; + sprite->balloon.var_15 = 11; + sprite->balloon.sprite_identifier = SPRITE_IDENTIFIER_MISC; + sprite_move(x, y, z, sprite); + sprite->balloon.misc_identifier = SPRITE_MISC_BALLOON; + sprite->balloon.var_26 = 0; + sprite->balloon.colour = colour; + sprite->balloon.popped = bl; + } +} + +void balloon_pop(rct_balloon *balloon) +{ + balloon->popped = 1; + balloon->var_26 = 0; + sound_play_panned(SOUND_BALLOON_POP, 0x8001, balloon->x, balloon->y, balloon->z); +} + +/** + * + * rct: 0x0067342C + */ +void balloon_update(rct_balloon *balloon) +{ + invalidate_sprite_2((rct_sprite*)balloon); + if (balloon->popped == 1) { + balloon->var_26 += 256; + if (balloon->var_26 >= 1280) + sprite_remove((rct_sprite*)balloon); + + return; + } + + int original_var26a = balloon->var_26a; + balloon->var_26a += 85; + if (original_var26a < 255 - 85) + return; + + balloon->var_26b++; + sprite_move(balloon->x, balloon->y, balloon->z + 1, (rct_sprite*)balloon); + + int maxZ = 1967 - ((balloon->x ^ balloon->y) & 31); + if (balloon->z < maxZ) + return; + + balloon_pop(balloon); +} + +/** + * + * rct2: 0x006E88ED + */ +void balloon_press(rct_balloon *balloon) +{ + if (balloon->popped == 1) + return; + + uint32 random = rand(); + if ((balloon->var_0A & 7) || (random & 0xFFFF) < 0x2000) { + balloon_pop(balloon); + return; + } + + sprite_move( + balloon->x + ((random & 0x80000000) ? -6 : 6), + balloon->y, + balloon->z, + (rct_sprite*)balloon + ); +} diff --git a/src/world/duck.c b/src/world/duck.c new file mode 100644 index 0000000000..9f75a65ac5 --- /dev/null +++ b/src/world/duck.c @@ -0,0 +1,309 @@ +#include "../addresses.h" +#include "../audio/audio.h" +#include "../localisation/date.h" +#include "../scenario.h" +#include "sprite.h" + +enum { + DUCK_STATE_FLY_TO_WATER, + DUCK_STATE_SWIM, + DUCK_STATE_DRINK, + DUCK_STATE_DOUBLE_DRINK, + DUCK_STATE_FLY_AWAY +}; + +static void duck_update_fly_to_water(rct_duck *duck); +static void duck_update_swim(rct_duck *duck); +static void duck_update_drink(rct_duck *duck); +static void duck_update_double_drink(rct_duck *duck); +static void duck_update_fly_away(rct_duck *duck); + +// rct2: 0x009A3B04 +static const rct_xy16 duck_move_offset[] = { + { -1, 0 }, + { 0, 1 }, + { 1, 0 }, + { 0, -1 } +}; + +// rct2: 0x0097F073 +static const uint8 duck_drink_animation[] = { + 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 255 +}; + +// rct2: 0x0097F08C +static const uint8 duck_double_drink_animation[] = { + 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, + 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 0, 0, 0, 0, 255 +}; + +/** + * + * rct2: 0x0067440F + */ +void create_duck(int targetX, int targetY) +{ + rct_sprite* sprite = create_sprite(2); + if (sprite != NULL) { + sprite->duck.sprite_identifier = SPRITE_IDENTIFIER_MISC; + sprite->duck.misc_identifier = SPRITE_MISC_DUCK; + sprite->duck.var_14 = 9; + sprite->duck.var_09 = 0xC; + sprite->duck.var_15 = 9; + int offset_xy = scenario_rand() & 0x1E; + targetX += offset_xy; + targetY += offset_xy; + sprite->duck.target_x = targetX; + sprite->duck.target_y = targetY; + uint8 direction = scenario_rand() & 3; + switch (direction) { + case 0: + targetX = 8191 - (scenario_rand() & 0x3F); + break; + case 1: + targetY = scenario_rand() & 0x3F; + break; + case 2: + targetX = scenario_rand() & 0x3F; + break; + case 3: + targetY = 8191 - (scenario_rand() & 0x3F); + break; + } + sprite->duck.sprite_direction = direction << 3; + sprite_move(targetX, targetY, 496, sprite); + sprite->duck.state = DUCK_STATE_FLY_TO_WATER; + sprite->duck.var_26 = 0; + } +} + +/** + * + * rct: 0x006740E8 + */ +void duck_update(rct_duck *duck) +{ + switch (duck->state) { + case DUCK_STATE_FLY_TO_WATER: + duck_update_fly_to_water(duck); + break; + case DUCK_STATE_SWIM: + duck_update_swim(duck); + break; + case DUCK_STATE_DRINK: + duck_update_drink(duck); + break; + case DUCK_STATE_DOUBLE_DRINK: + duck_update_double_drink(duck); + break; + case DUCK_STATE_FLY_AWAY: + duck_update_fly_away(duck); + break; + } +} + +static void duck_invalidate(rct_duck *duck) +{ + invalidate_sprite_0((rct_sprite*)duck); +} + +/** + * + * rct: 0x00674108 + */ +static void duck_update_fly_to_water(rct_duck *duck) +{ + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 3) + return; + + duck->var_26++; + if (duck->var_26 >= 6) + duck->var_26 = 0; + + duck_invalidate(duck); + int manhattanDistance = abs(duck->target_x - duck->x) + abs(duck->target_y - duck->y); + int direction = duck->sprite_direction >> 3; + int x = duck->x + duck_move_offset[direction].x; + int y = duck->y + duck_move_offset[direction].y; + int manhattanDistanceN = abs(duck->target_x - x) + abs(duck->target_y - y); + + rct_map_element *mapElement = map_get_surface_element_at(duck->target_x >> 5, duck->target_y >> 5); + int waterHeight = mapElement->properties.surface.terrain & 0x1F; + if (waterHeight == 0) { + duck->state = DUCK_STATE_FLY_AWAY; + duck_update_fly_away(duck); + return; + } + waterHeight <<= 4; + int z = abs(duck->z - waterHeight); + + if (manhattanDistanceN <= manhattanDistance) { + if (z > manhattanDistanceN) { + z = duck->z - 2; + if (waterHeight >= duck->z) + z += 4; + + duck->var_26 = 1; + } else { + z = duck->z; + } + sprite_move(x, y, z, (rct_sprite*)duck); + duck_invalidate(duck); + } else { + if (z > 4) { + duck->state = DUCK_STATE_FLY_AWAY; + duck_update_fly_away(duck); + } else { + duck->state = DUCK_STATE_SWIM; + duck->var_26 = 0; + duck_update_swim(duck); + } + } +} + +/** + * + * rct: 0x00674282 + */ +static void duck_update_swim(rct_duck *duck) +{ + if ((RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) + duck->var_0A) & 3) + return; + + uint32 randomNumber = scenario_rand(); + if ((randomNumber & 0xFFFF) < 0x666) { + if (randomNumber & 0x80000000) { + duck->state = DUCK_STATE_DOUBLE_DRINK; + duck->var_26 = -1; + duck_update_double_drink(duck); + } else { + duck->state = DUCK_STATE_DRINK; + duck->var_26 = -1; + duck_update_drink(duck); + } + return; + } + + int currentMonth = date_get_month(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16)); + if (currentMonth >= MONTH_SEPTEMBER && (randomNumber >> 16) < 218) { + duck->state = DUCK_STATE_FLY_AWAY; + duck_update_fly_away(duck); + return; + } + + duck_invalidate(duck); + int landZ = map_element_height(duck->x, duck->y); + int waterZ = (landZ >> 16) & 0xFFFF; + landZ &= 0xFFFF; + + if (duck->z < landZ || waterZ == 0) { + duck->state = DUCK_STATE_FLY_AWAY; + duck_update_fly_away(duck); + return; + } + + duck->z = waterZ; + randomNumber = scenario_rand(); + if ((randomNumber & 0xFFFF) <= 0xAAA) { + randomNumber >>= 16; + duck->sprite_direction = randomNumber & 0x18; + } + + int direction = duck->sprite_direction >> 3; + int x = duck->x + duck_move_offset[direction].x; + int y = duck->y + duck_move_offset[direction].y; + landZ = map_element_height(x, y); + waterZ = (landZ >> 16) & 0xFFFF; + landZ &= 0xFFFF; + + if (duck->z < landZ || duck->z != waterZ) + return; + + sprite_move(x, y, waterZ, (rct_sprite*)duck); + duck_invalidate(duck); +} + +/** + * + * rct: 0x00674357 + */ +static void duck_update_drink(rct_duck *duck) +{ + duck->var_26++; + if (duck_drink_animation[duck->var_26] == 255) { + duck->state = DUCK_STATE_SWIM; + duck->var_26 = 0; + duck_update_swim(duck); + } else { + duck_invalidate(duck); + } +} + +/** + * + * rct: 0x00674372 + */ +static void duck_update_double_drink(rct_duck *duck) +{ + duck->var_26++; + if (duck_double_drink_animation[duck->var_26] == 255) { + duck->state = DUCK_STATE_SWIM; + duck->var_26 = 0; + duck_update_swim(duck); + } else { + duck_invalidate(duck); + } +} + +/** + * + * rct: 0x0067438D + */ +static void duck_update_fly_away(rct_duck *duck) +{ + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 3) + return; + + duck->var_26++; + if (duck->var_26 >= 6) + duck->var_26 = 0; + + duck_invalidate(duck); + int direction = duck->sprite_direction >> 3; + int x = duck->x + (duck_move_offset[direction].x * 2); + int y = duck->y + (duck_move_offset[direction].y * 2); + if (x < 0 || y < 0 || x >= (32 * 256) || y >= (32 * 256)) { + sprite_remove((rct_sprite*)duck); + return; + } + + int z = z = min(duck->z + 2, 496); + sprite_move(x, y, z, (rct_sprite*)duck); + duck_invalidate(duck); +} + +/** + * + * rct: 0x006E895D + */ +void duck_press(rct_duck *duck) +{ + sound_play_panned(SOUND_QUACK, 0x8001, duck->x, duck->y, duck->z); +} + +/** + * + * rct: 0x00674576 + */ +void duck_remove_all() +{ + rct_unk_sprite* sprite; + uint16 spriteIndex, nextSpriteIndex; + + for (spriteIndex = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_MISC, uint16); spriteIndex != SPRITE_INDEX_NULL; spriteIndex = nextSpriteIndex) { + sprite = &(g_sprite_list[spriteIndex].unknown); + nextSpriteIndex = sprite->next; + if (sprite->misc_identifier == SPRITE_MISC_DUCK) + sprite_remove((rct_sprite*)sprite); + } +} diff --git a/src/world/money_effect.c b/src/world/money_effect.c new file mode 100644 index 0000000000..132d6293a3 --- /dev/null +++ b/src/world/money_effect.c @@ -0,0 +1,109 @@ +#include "../localisation/localisation.h" +#include "../interface/viewport.h" +#include "../interface/window.h" +#include "sprite.h" + +static const rct_xy16 _moneyEffectMoveOffset[] = { + { 1, -1 }, + { 1, 1 }, + { -1, 1 }, + { -1, -1 } +}; + +/** + * + * rct: 0x0067351F + */ +void money_effect_create_at(money32 value, int x, int y, int z) +{ + rct_money_effect *moneyEffect; + rct_string_id stringId; + char buffer[128]; + + moneyEffect = (rct_money_effect*)create_sprite(2); + if (moneyEffect == NULL) + return; + + moneyEffect->value = value; + moneyEffect->var_14 = 64; + moneyEffect->var_09 = 20; + moneyEffect->var_15 = 30; + moneyEffect->sprite_identifier = SPRITE_IDENTIFIER_MISC; + sprite_move(x, y, z, (rct_sprite*)moneyEffect); + moneyEffect->misc_identifier = SPRITE_MISC_MONEY_EFFECT; + moneyEffect->num_movements = 0; + moneyEffect->move_delay = 0; + + stringId = 1388; + if (value < 0) { + value *= -1; + stringId = 1399; + } + format_string(buffer, stringId, &value); + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; + moneyEffect->offset_x = -(gfx_get_string_width(buffer) / 2); + moneyEffect->wiggle = 0; +} + +/** + * + * rct: 0x0069C5D0 + */ +void money_effect_create(money32 value) +{ + rct_window *mainWindow; + rct_viewport *mainViewport; + rct_xyz16 mapPosition; + + mapPosition.x = RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16); + mapPosition.y = RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16); + mapPosition.z = RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16); + if (mapPosition.x == (sint16)0x8000) { + mainWindow = window_get_main(); + if (mainWindow == NULL) + return; + + mainViewport = mainWindow->viewport; + screen_get_map_xy( + mainViewport->x + (mainViewport->width / 2), + mainViewport->y + (mainViewport->height / 2), + &mapPosition.x, + &mapPosition.y, + NULL + ); + if (mapPosition.x == (sint16)0x8000) + return; + + mapPosition.z = map_element_height(mapPosition.x, mapPosition.y) & 0xFFFF; + } + mapPosition.z += 10; + money_effect_create_at(-value, mapPosition.x, mapPosition.y, mapPosition.z); +} + +/** + * + * rct: 0x00673232 + */ +void money_effect_update(rct_money_effect *moneyEffect) +{ + invalidate_sprite_2((rct_sprite*)moneyEffect); + moneyEffect->wiggle++; + if (moneyEffect->wiggle >= 22) + moneyEffect->wiggle = 0; + + moneyEffect->move_delay++; + if (moneyEffect->move_delay < 2) + return; + + moneyEffect->move_delay = 0; + int x = moneyEffect->x + _moneyEffectMoveOffset[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)].x; + int y = moneyEffect->y + _moneyEffectMoveOffset[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)].y; + int z = moneyEffect->z; + sprite_move(x, y, z, (rct_sprite*)moneyEffect); + + moneyEffect->num_movements++; + if (moneyEffect->num_movements < 55) + return; + + sprite_remove((rct_sprite*)moneyEffect); +} diff --git a/src/world/sprite.c b/src/world/sprite.c index 0b8570e5bb..de0cb76716 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -27,500 +27,9 @@ #include "fountain.h" #include "sprite.h" -enum { - DUCK_STATE_FLY_TO_WATER, - DUCK_STATE_SWIM, - DUCK_STATE_DRINK, - DUCK_STATE_DOUBLE_DRINK, - DUCK_STATE_FLY_AWAY -}; - rct_sprite* g_sprite_list = RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite); -static void duck_update_fly_to_water(rct_duck *duck); -static void duck_update_swim(rct_duck *duck); -static void duck_update_drink(rct_duck *duck); -static void duck_update_double_drink(rct_duck *duck); -static void duck_update_fly_away(rct_duck *duck); - -/** - * - * rct2: 0x006736C7 - */ -void create_balloon(int x, int y, int z, int colour, uint8 bl) -{ - rct_sprite* sprite = create_sprite(2); - if (sprite != NULL) - { - sprite->balloon.var_14 = 13; - sprite->balloon.var_09 = 22; - sprite->balloon.var_15 = 11; - sprite->balloon.sprite_identifier = SPRITE_IDENTIFIER_MISC; - sprite_move(x, y, z, sprite); - sprite->balloon.misc_identifier = SPRITE_MISC_BALLOON; - sprite->balloon.var_26 = 0; - sprite->balloon.colour = colour; - sprite->balloon.popped = bl; - } -} - -void balloon_pop(rct_balloon *balloon) -{ - balloon->popped = 1; - balloon->var_26 = 0; - sound_play_panned(SOUND_BALLOON_POP, 0x8001, balloon->x, balloon->y, balloon->z); -} - -/** - * - * rct: 0x0067342C - */ -void balloon_update(rct_balloon *balloon) -{ - invalidate_sprite_2((rct_sprite*)balloon); - if (balloon->popped == 1) { - balloon->var_26 += 256; - if (balloon->var_26 >= 1280) - sprite_remove((rct_sprite*)balloon); - - return; - } - - int original_var26a = balloon->var_26a; - balloon->var_26a += 85; - if (original_var26a < 255 - 85) - return; - - balloon->var_26b++; - sprite_move(balloon->x, balloon->y, balloon->z + 1, (rct_sprite*)balloon); - - int maxZ = 1967 - ((balloon->x ^ balloon->y) & 31); - if (balloon->z < maxZ) - return; - - balloon_pop(balloon); -} - -/** - * - * rct2: 0x006E88ED - */ -void balloon_press(rct_balloon *balloon) -{ - if (balloon->popped == 1) - return; - - uint32 random = scenario_rand(); - if ((balloon->var_0A & 7) || (random & 0xFFFF) < 0x2000) { - balloon_pop(balloon); - return; - } - - sprite_move( - balloon->x + ((random & 0x80000000) ? -6 : 6), - balloon->y, - balloon->z, - (rct_sprite*)balloon - ); -} - -// rct2: 0x009A3B04 -static const rct_xy16 duck_move_offset[] = { - { -1, 0 }, - { 0, 1 }, - { 1, 0 }, - { 0, -1 } -}; - -// rct2: 0x0097F073 -static const uint8 duck_drink_animation[] = { - 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 255 -}; - -// rct2: 0x0097F08C -static const uint8 duck_double_drink_animation[] = { - 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, - 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 0, 0, 0, 0, 255 -}; - -/** - * - * rct2: 0x0067440F - */ -void create_duck(int targetX, int targetY) -{ - rct_sprite* sprite = create_sprite(2); - if (sprite != NULL) { - sprite->duck.sprite_identifier = SPRITE_IDENTIFIER_MISC; - sprite->duck.misc_identifier = SPRITE_MISC_DUCK; - sprite->duck.var_14 = 9; - sprite->duck.var_09 = 0xC; - sprite->duck.var_15 = 9; - int offset_xy = scenario_rand() & 0x1E; - targetX += offset_xy; - targetY += offset_xy; - sprite->duck.target_x = targetX; - sprite->duck.target_y = targetY; - uint8 direction = scenario_rand() & 3; - switch (direction) - { - case 0: - targetX = 8191 - (scenario_rand() & 0x3F); - break; - case 1: - targetY = scenario_rand() & 0x3F; - break; - case 2: - targetX = scenario_rand() & 0x3F; - break; - case 3: - targetY = 8191 - (scenario_rand() & 0x3F); - break; - } - sprite->duck.sprite_direction = direction << 3; - sprite_move(targetX, targetY, 496, sprite); - sprite->duck.state = DUCK_STATE_FLY_TO_WATER; - sprite->duck.var_26 = 0; - } -} - -/** - * - * rct: 0x006740E8 - */ -void duck_update(rct_duck *duck) -{ - switch (duck->state) { - case DUCK_STATE_FLY_TO_WATER: - duck_update_fly_to_water(duck); - break; - case DUCK_STATE_SWIM: - duck_update_swim(duck); - break; - case DUCK_STATE_DRINK: - duck_update_drink(duck); - break; - case DUCK_STATE_DOUBLE_DRINK: - duck_update_double_drink(duck); - break; - case DUCK_STATE_FLY_AWAY: - duck_update_fly_away(duck); - break; - } -} - -static void duck_invalidate(rct_duck *duck) -{ - invalidate_sprite_0((rct_sprite*)duck); -} - -/** - * - * rct: 0x00674108 - */ -static void duck_update_fly_to_water(rct_duck *duck) -{ - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 3) - return; - - duck->var_26++; - if (duck->var_26 >= 6) - duck->var_26 = 0; - - duck_invalidate(duck); - int manhattanDistance = abs(duck->target_x - duck->x) + abs(duck->target_y - duck->y); - int direction = duck->sprite_direction >> 3; - int x = duck->x + duck_move_offset[direction].x; - int y = duck->y + duck_move_offset[direction].y; - int manhattanDistanceN = abs(duck->target_x - x) + abs(duck->target_y - y); - - rct_map_element *mapElement = map_get_surface_element_at(duck->target_x >> 5, duck->target_y >> 5); - int waterHeight = mapElement->properties.surface.terrain & 0x1F; - if (waterHeight == 0) { - duck->state = DUCK_STATE_FLY_AWAY; - duck_update_fly_away(duck); - return; - } - waterHeight <<= 4; - int z = abs(duck->z - waterHeight); - - if (manhattanDistanceN <= manhattanDistance) { - if (z > manhattanDistanceN) { - z = duck->z - 2; - if (waterHeight >= duck->z) - z += 4; - - duck->var_26 = 1; - } else { - z = duck->z; - } - sprite_move(x, y, z, (rct_sprite*)duck); - duck_invalidate(duck); - } else { - if (z > 4) { - duck->state = DUCK_STATE_FLY_AWAY; - duck_update_fly_away(duck); - } else { - duck->state = DUCK_STATE_SWIM; - duck->var_26 = 0; - duck_update_swim(duck); - } - } -} - -/** - * - * rct: 0x00674282 - */ -static void duck_update_swim(rct_duck *duck) -{ - if ((RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) + duck->var_0A) & 3) - return; - - uint32 randomNumber = scenario_rand(); - if ((randomNumber & 0xFFFF) < 0x666) { - if (randomNumber & 0x80000000) { - duck->state = DUCK_STATE_DOUBLE_DRINK; - duck->var_26 = -1; - duck_update_double_drink(duck); - } else { - duck->state = DUCK_STATE_DRINK; - duck->var_26 = -1; - duck_update_drink(duck); - } - return; - } - - int currentMonth = date_get_month(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16)); - if (currentMonth >= MONTH_SEPTEMBER && (randomNumber >> 16) < 218) { - duck->state = DUCK_STATE_FLY_AWAY; - duck_update_fly_away(duck); - return; - } - - duck_invalidate(duck); - int landZ = map_element_height(duck->x, duck->y); - int waterZ = (landZ >> 16) & 0xFFFF; - landZ &= 0xFFFF; - - if (duck->z < landZ || waterZ == 0) { - duck->state = DUCK_STATE_FLY_AWAY; - duck_update_fly_away(duck); - return; - } - - duck->z = waterZ; - randomNumber = scenario_rand(); - if ((randomNumber & 0xFFFF) <= 0xAAA) { - randomNumber >>= 16; - duck->sprite_direction = randomNumber & 0x18; - } - - int direction = duck->sprite_direction >> 3; - int x = duck->x + duck_move_offset[direction].x; - int y = duck->y + duck_move_offset[direction].y; - landZ = map_element_height(x, y); - waterZ = (landZ >> 16) & 0xFFFF; - landZ &= 0xFFFF; - - if (duck->z < landZ || duck->z != waterZ) - return; - - sprite_move(x, y, waterZ, (rct_sprite*)duck); - duck_invalidate(duck); -} - -/** - * - * rct: 0x00674357 - */ -static void duck_update_drink(rct_duck *duck) -{ - duck->var_26++; - if (duck_drink_animation[duck->var_26] == 255) { - duck->state = DUCK_STATE_SWIM; - duck->var_26 = 0; - duck_update_swim(duck); - } else { - duck_invalidate(duck); - } -} - -/** - * - * rct: 0x00674372 - */ -static void duck_update_double_drink(rct_duck *duck) -{ - duck->var_26++; - if (duck_double_drink_animation[duck->var_26] == 255) { - duck->state = DUCK_STATE_SWIM; - duck->var_26 = 0; - duck_update_swim(duck); - } else { - duck_invalidate(duck); - } -} - -/** - * - * rct: 0x0067438D - */ -static void duck_update_fly_away(rct_duck *duck) -{ - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 3) - return; - - duck->var_26++; - if (duck->var_26 >= 6) - duck->var_26 = 0; - - duck_invalidate(duck); - int direction = duck->sprite_direction >> 3; - int x = duck->x + (duck_move_offset[direction].x * 2); - int y = duck->y + (duck_move_offset[direction].y * 2); - if (x < 0 || y < 0 || x >= (32 * 256) || y >= (32 * 256)) { - sprite_remove((rct_sprite*)duck); - return; - } - - int z = z = min(duck->z + 2, 496); - sprite_move(x, y, z, (rct_sprite*)duck); - duck_invalidate(duck); -} - -/** - * - * rct: 0x006E895D - */ -void duck_press(rct_duck *duck) -{ - sound_play_panned(SOUND_QUACK, 0x8001, duck->x, duck->y, duck->z); -} - -/** - * - * rct: 0x00674576 - */ -void duck_remove_all() -{ - rct_unk_sprite* sprite; - uint16 spriteIndex, nextSpriteIndex; - - for (spriteIndex = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_MISC, uint16); spriteIndex != SPRITE_INDEX_NULL; spriteIndex = nextSpriteIndex) { - sprite = &(g_sprite_list[spriteIndex].unknown); - nextSpriteIndex = sprite->next; - if (sprite->misc_identifier == SPRITE_MISC_DUCK) - sprite_remove((rct_sprite*)sprite); - } -} - -static const rct_xy16 _moneyEffectMoveOffset[] = { - { 1, -1 }, - { 1, 1 }, - { -1, 1 }, - { -1, -1 } -}; - -/** - * - * rct: 0x0067351F - */ -void money_effect_create_at(money32 value, int x, int y, int z) -{ - rct_money_effect *moneyEffect; - rct_string_id stringId; - char buffer[128]; - - moneyEffect = (rct_money_effect*)create_sprite(2); - if (moneyEffect == NULL) - return; - - moneyEffect->value = value; - moneyEffect->var_14 = 64; - moneyEffect->var_09 = 20; - moneyEffect->var_15 = 30; - moneyEffect->sprite_identifier = SPRITE_IDENTIFIER_MISC; - sprite_move(x, y, z, (rct_sprite*)moneyEffect); - moneyEffect->misc_identifier = SPRITE_MISC_MONEY_EFFECT; - moneyEffect->num_movements = 0; - moneyEffect->move_delay = 0; - - stringId = 1388; - if (value < 0) { - value *= -1; - stringId = 1399; - } - format_string(buffer, stringId, &value); - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; - moneyEffect->offset_x = -(gfx_get_string_width(buffer) / 2); - moneyEffect->wiggle = 0; -} - -/** - * - * rct: 0x0069C5D0 - */ -void money_effect_create(money32 value) -{ - rct_window *mainWindow; - rct_viewport *mainViewport; - rct_xyz16 mapPosition; - - mapPosition.x = RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16); - mapPosition.y = RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16); - mapPosition.z = RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16); - if (mapPosition.x == (sint16)0x8000) { - mainWindow = window_get_main(); - if (mainWindow == NULL) - return; - - mainViewport = mainWindow->viewport; - screen_get_map_xy( - mainViewport->x + (mainViewport->width / 2), - mainViewport->y + (mainViewport->height / 2), - &mapPosition.x, - &mapPosition.y, - NULL - ); - if (mapPosition.x == (sint16)0x8000) - return; - - mapPosition.z = map_element_height(mapPosition.x, mapPosition.y) & 0xFFFF; - } - mapPosition.z += 10; - money_effect_create_at(-value, mapPosition.x, mapPosition.y, mapPosition.z); -} - -/** - * - * rct: 0x00673232 - */ -void money_effect_update(rct_money_effect *moneyEffect) -{ - invalidate_sprite_2((rct_sprite*)moneyEffect); - moneyEffect->wiggle++; - if (moneyEffect->wiggle >= 22) - moneyEffect->wiggle = 0; - - moneyEffect->move_delay++; - if (moneyEffect->move_delay < 2) - return; - - moneyEffect->move_delay = 0; - int x = moneyEffect->x + _moneyEffectMoveOffset[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)].x; - int y = moneyEffect->y + _moneyEffectMoveOffset[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)].y; - int z = moneyEffect->z; - sprite_move(x, y, z, (rct_sprite*)moneyEffect); - - moneyEffect->num_movements++; - if (moneyEffect->num_movements < 55) - return; - - sprite_remove((rct_sprite*)moneyEffect); -} - -void invalidate_sprite_max_zoom(rct_sprite *sprite, int maxZoom) +static void invalidate_sprite_max_zoom(rct_sprite *sprite, int maxZoom) { if (sprite->unknown.sprite_left == (sint16)0x8000) return; diff --git a/src/world/sprite.h b/src/world/sprite.h index 2ba74fe34f..0e829b2922 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -243,12 +243,6 @@ enum { // rct2: 0x010E63BC extern rct_sprite* g_sprite_list; -void create_balloon(int x, int y, int z, int colour, uint8 bl); -void balloon_press(rct_balloon *balloon); -void create_duck(int targetX, int targetY); -void duck_press(rct_duck *duck); -void duck_remove_all(); -void money_effect_create(money32 value); rct_sprite *create_sprite(uint8 bl); void reset_sprite_list(); void reset_0x69EBE4(); @@ -265,4 +259,25 @@ void sub_6738E1(int x, int y, int z); void sprite_misc_3_create(int x, int y, int z); void sprite_misc_5_create(int x, int y, int z); +/////////////////////////////////////////////////////////////// +// Balloon +/////////////////////////////////////////////////////////////// +void create_balloon(int x, int y, int z, int colour, uint8 bl); +void balloon_update(rct_balloon *balloon); +void balloon_press(rct_balloon *balloon); + +/////////////////////////////////////////////////////////////// +// Duck +/////////////////////////////////////////////////////////////// +void create_duck(int targetX, int targetY); +void duck_update(rct_duck *duck); +void duck_press(rct_duck *duck); +void duck_remove_all(); + +/////////////////////////////////////////////////////////////// +// Money effect +/////////////////////////////////////////////////////////////// +void money_effect_create(money32 value); +void money_effect_update(rct_money_effect *moneyEffect); + #endif From 745365ca69c338a7d20bf003c31456a342f07e36 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 22 Aug 2015 16:39:24 +0100 Subject: [PATCH 0584/1173] implement crash particles --- projects/openrct2.vcxproj | 1 + projects/openrct2.vcxproj.filters | 3 + src/world/particle.c | 123 ++++++++++++++++++++++++++++++ src/world/sprite.c | 110 +++++++++++++------------- src/world/sprite.h | 87 ++++++++++++++++++++- 5 files changed, 266 insertions(+), 58 deletions(-) create mode 100644 src/world/particle.c diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 47362b5448..36bb81c361 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -110,6 +110,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 262a0ef02b..9c13072575 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -531,6 +531,9 @@ Source\World + + Source\World + diff --git a/src/world/particle.c b/src/world/particle.c new file mode 100644 index 0000000000..1636b3ac42 --- /dev/null +++ b/src/world/particle.c @@ -0,0 +1,123 @@ +#include "../audio/audio.h" +#include "sprite.h" + +/** + * + * rct2: 0x006735A1 + */ +void crashed_vehicle_particle_create(rct_vehicle_colour colours, int x, int y, int z) +{ + rct_crashed_vehicle_particle *sprite = (rct_crashed_vehicle_particle*)create_sprite(2); + if (sprite != NULL) { + sprite->colour[0] = colours.body_colour; + sprite->colour[1] = colours.trim_colour; + sprite->sprite_width = 8; + sprite->sprite_height_negative = 8; + sprite->sprite_height_positive = 8; + sprite->sprite_identifier = SPRITE_IDENTIFIER_MISC; + sprite_move(x, y, z + 4, (rct_sprite*)sprite); + sprite->misc_identifier = SPRITE_MISC_CRASHED_VEHICLE_PARTICLE; + + sprite->var_26 = (rand() & 0xFF) * 12; + sprite->var_24 = (rand() & 0x7F) + 140; + sprite->var_2E = ((rand() & 0xFF) * 5) >> 8; + sprite->acceleration_x = (rand() & 0xFFFF) * 4; + sprite->acceleration_y = (rand() & 0xFFFF) * 4; + sprite->acceleration_z = (rand() & 0xFFFF) * 4 + 0x10000; + sprite->velocity_x = 0; + sprite->velocity_y = 0; + sprite->velocity_z = 0; + } +} + +/** + * + * rct: 0x00673298 + */ +void crashed_vehicle_particle_update(rct_crashed_vehicle_particle *particle) +{ + invalidate_sprite_0((rct_sprite*)particle); + particle->var_24--; + if (particle->var_24 == 0) { + sprite_remove((rct_sprite*)particle); + return; + } + + // Apply gravity + particle->acceleration_z -= 5041; + + // Apply air resistance + particle->acceleration_x -= (particle->acceleration_x / 256); + particle->acceleration_y -= (particle->acceleration_y / 256); + particle->acceleration_z -= (particle->acceleration_z / 256); + + // Update velocity and position + sint32 vx = particle->velocity_x + particle->acceleration_x; + sint32 vy = particle->velocity_y + particle->acceleration_y; + sint32 vz = particle->velocity_z + particle->acceleration_z; + + sint16 x = particle->x + (vx >> 16); + sint16 y = particle->y + (vy >> 16); + sint16 z = particle->z + (vz >> 16); + + particle->velocity_x = vx & 0xFFFF; + particle->velocity_y = vy & 0xFFFF; + particle->velocity_z = vz & 0xFFFF; + + // Check collision with land / water + uint32 waterLand = map_element_height(x, y); + sint16 landZ = (waterLand & 0xFFFF); + sint16 waterZ = (waterLand >> 16); + + if (waterZ != 0 && particle->z >= waterZ && z <= waterZ) { + // Splash + sound_play_panned(SOUND_WATER_2, 0x8001, particle->x, particle->y, waterZ); + crash_splash_create(particle->x, particle->y, waterZ); + sprite_remove((rct_sprite*)particle); + return; + } + + if (particle->z >= landZ && z <= landZ) { + // Bounce + particle->acceleration_z *= -1; + z = landZ; + } + sprite_move(x, y, z, (rct_sprite*)particle); + invalidate_sprite_0((rct_sprite*)particle); + + particle->var_26 += 85; + if (particle->var_26 >= 3072) { + particle->var_26 = 0; + } +} + +/** + * + * rct2: 0x00673699 + */ +void crash_splash_create(int x, int y, int z) +{ + rct_unk_sprite *sprite = (rct_unk_sprite*)create_sprite(2); + if (sprite != NULL) { + sprite->sprite_width = 33; + sprite->sprite_height_negative = 51; + sprite->sprite_height_positive = 16; + sprite->sprite_identifier = SPRITE_IDENTIFIER_MISC; + sprite_move(x, y, z + 3, (rct_sprite*)sprite); + sprite->misc_identifier = SPRITE_MISC_CRASH_SPLASH; + sprite->var_26 = 0; + } +} + +/** + * + * rct: 0x0067339D + */ +void crash_splash_update(rct_crash_splash *splash) +{ + invalidate_sprite_2((rct_sprite*)splash); + splash->var_26 += 85; + if (splash->var_26 >= 7168) { + sprite_remove((rct_sprite*)splash); + } +} diff --git a/src/world/sprite.c b/src/world/sprite.c index de0cb76716..cc93929c27 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -266,45 +266,81 @@ void move_sprite_to_list(rct_sprite *sprite, uint8 cl) * * rct: 0x00673200 */ -static void sub_673200(rct_sprite *sprite) +static void sprite_misc_0_update(rct_sprite *sprite) { - RCT2_CALLPROC_X(0x00673200, 0, 0, 0, 0, (int)sprite, 0, 0); + invalidate_sprite_2(sprite); + + int original_var24 = sprite->unknown.var_24; + sprite->unknown.var_24 += 0x5555; + if (sprite->unknown.var_24 < 0x5555) { + sprite_move(sprite->unknown.x, sprite->unknown.y, sprite->unknown.z + 1, sprite); + } + sprite->unknown.var_26 += 64; + if (sprite->unknown.var_26 >= (56 * 64)) { + sprite_remove(sprite); + } } /** * - * rct: 0x00673298 + * rct2: 0x0067363D */ -static void sub_673298(rct_sprite *sprite) +void sprite_misc_3_create(int x, int y, int z) { - RCT2_CALLPROC_X(0x00673298, 0, 0, 0, 0, (int)sprite, 0, 0); + rct_unk_sprite *sprite = (rct_unk_sprite*)create_sprite(2); + if (sprite != NULL) { + sprite->sprite_width = 44; + sprite->sprite_height_negative = 32; + sprite->sprite_height_positive = 34; + sprite->sprite_identifier = SPRITE_IDENTIFIER_MISC; + sprite_move(x, y, z + 4, (rct_sprite*)sprite); + sprite->misc_identifier = SPRITE_MISC_3; + sprite->var_26 = 0; + } } /** * * rct: 0x00673385 */ -static void sub_673385(rct_sprite *sprite) +static void sprite_misc_3_update(rct_sprite *sprite) { - RCT2_CALLPROC_X(0x00673385, 0, 0, 0, 0, (int)sprite, 0, 0); + invalidate_sprite_2(sprite); + sprite->unknown.var_26 += 128; + if (sprite->unknown.var_26 >= (36 * 128)) { + sprite_remove(sprite); + } } /** * - * rct: 0x0067339D + * rct2: 0x0067366B */ -static void sub_67339D(rct_sprite *sprite) +void sprite_misc_5_create(int x, int y, int z) { - RCT2_CALLPROC_X(0x0067339D, 0, 0, 0, 0, (int)sprite, 0, 0); + rct_unk_sprite *sprite = (rct_unk_sprite*)create_sprite(2); + if (sprite != NULL) { + sprite->sprite_width = 25; + sprite->sprite_height_negative = 85; + sprite->sprite_height_positive = 8; + sprite->sprite_identifier = SPRITE_IDENTIFIER_MISC; + sprite_move(x, y, z + 4, (rct_sprite*)sprite); + sprite->misc_identifier = SPRITE_MISC_5; + sprite->var_26 = 0; + } } /** * * rct: 0x006733B4 */ -static void sub_6733B4(rct_sprite *sprite) +static void sprite_misc_5_update(rct_sprite *sprite) { - RCT2_CALLPROC_X(0x006733B4, 0, 0, 0, 0, (int)sprite, 0, 0); + invalidate_sprite_2(sprite); + sprite->unknown.var_26 += 64; + if (sprite->unknown.var_26 >= (124 * 64)) { + sprite_remove(sprite); + } } /** @@ -315,22 +351,22 @@ void sprite_misc_update(rct_sprite *sprite) { switch (sprite->unknown.misc_identifier) { case SPRITE_MISC_0: - sub_673200(sprite); + sprite_misc_0_update(sprite); break; case SPRITE_MISC_MONEY_EFFECT: money_effect_update(&sprite->money_effect); break; - case SPRITE_MISC_2: - sub_673298(sprite); + case SPRITE_MISC_CRASHED_VEHICLE_PARTICLE: + crashed_vehicle_particle_update((rct_crashed_vehicle_particle*)sprite); break; case SPRITE_MISC_3: - sub_673385(sprite); + sprite_misc_3_update(sprite); break; - case SPRITE_MISC_4: - sub_67339D(sprite); + case SPRITE_MISC_CRASH_SPLASH: + crash_splash_update((rct_crash_splash*)sprite); break; case SPRITE_MISC_5: - sub_6733B4(sprite); + sprite_misc_5_update(sprite); break; case SPRITE_MISC_JUMPING_FOUNTAIN_WATER: case SPRITE_MISC_JUMPING_FOUNTAIN_SNOW: @@ -528,39 +564,3 @@ void sub_6738E1(int x, int y, int z) { RCT2_CALLPROC_X(0x006738E1, x, 0, y, z, 0, 0, 0); } - -/** - * - * rct2: 0x0067363D - */ -void sprite_misc_3_create(int x, int y, int z) -{ - rct_unk_sprite *sprite = (rct_unk_sprite*)create_sprite(2); - if (sprite != NULL) { - sprite->sprite_width = 44; - sprite->sprite_height_negative = 32; - sprite->sprite_height_positive = 34; - sprite->sprite_identifier = SPRITE_IDENTIFIER_MISC; - sprite_move(x, y, z + 4, (rct_sprite*)sprite); - sprite->misc_identifier = SPRITE_MISC_3; - sprite->var_26 = 0; - } -} - -/** - * - * rct2: 0x0067366B - */ -void sprite_misc_5_create(int x, int y, int z) -{ - rct_unk_sprite *sprite = (rct_unk_sprite*)create_sprite(2); - if (sprite != NULL) { - sprite->sprite_width = 25; - sprite->sprite_height_negative = 85; - sprite->sprite_height_positive = 8; - sprite->sprite_identifier = SPRITE_IDENTIFIER_MISC; - sprite_move(x, y, z + 4, (rct_sprite*)sprite); - sprite->misc_identifier = SPRITE_MISC_5; - sprite->var_26 = 0; - } -} diff --git a/src/world/sprite.h b/src/world/sprite.h index 0e829b2922..b3eb9051de 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -71,7 +71,7 @@ typedef struct { uint8 sprite_direction; //direction of sprite? 0x1e uint8 pad_1F[3]; // 0x1f uint16 name_string_idx; // 0x22 - uint8 pad_24[2]; + uint16 var_24; uint16 var_26; uint8 var_28[3]; uint8 var_2B; @@ -211,6 +211,77 @@ typedef struct { uint16 wiggle; // 0x46 } rct_money_effect; +typedef struct { + uint8 sprite_identifier; // 0x00 + uint8 misc_identifier; // 0x01 + uint16 next_in_quadrant; // 0x02 + uint16 next; // 0x04 + uint16 previous; // 0x06 + uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_... + // Height from center of sprite to bottom + uint8 sprite_height_negative; // 0x09 + uint16 sprite_index; // 0x0A + uint16 var_0C; + sint16 x; // 0x0E + sint16 y; // 0x10 + sint16 z; // 0x12 + // Width from center of sprite to edge + uint8 sprite_width; // 0x14 + // Height from center of sprite to top + uint8 sprite_height_positive; // 0x15 + sint16 sprite_left; // 0x16 + sint16 sprite_top; // 0x18 + sint16 sprite_right; // 0x1A + sint16 sprite_bottom; // 0x1C + uint8 sprite_direction; //direction of sprite? 0x1e + uint8 pad_1F[3]; // 0x1f + uint16 name_string_idx; // 0x22 + uint16 var_24; + uint16 var_26; + uint8 var_28[3]; + uint8 var_2B; + uint8 colour[2]; + uint16 var_2E; + sint16 velocity_x; // 0x30 + sint16 velocity_y; // 0x32 + sint16 velocity_z; // 0x34 + uint16 pad_36; + sint32 acceleration_x; // 0x38 + sint32 acceleration_y; // 0x3C + sint32 acceleration_z; // 0x40 + uint8 pad_44[0x2D]; + uint8 var_71; +} rct_crashed_vehicle_particle; + +typedef struct { + uint8 sprite_identifier; // 0x00 + uint8 misc_identifier; // 0x01 + uint16 next_in_quadrant; // 0x02 + uint16 next; // 0x04 + uint16 previous; // 0x06 + uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_... + // Height from center of sprite to bottom + uint8 sprite_height_negative; // 0x09 + uint16 sprite_index; // 0x0A + uint16 var_0C; + sint16 x; // 0x0E + sint16 y; // 0x10 + sint16 z; // 0x12 + // Width from center of sprite to edge + uint8 sprite_width; // 0x14 + // Height from center of sprite to top + uint8 sprite_height_positive; // 0x15 + sint16 sprite_left; // 0x16 + sint16 sprite_top; // 0x18 + sint16 sprite_right; // 0x1A + sint16 sprite_bottom; // 0x1C + uint8 sprite_direction; //direction of sprite? 0x1e + uint8 pad_1F[3]; // 0x1f + uint16 name_string_idx; // 0x22 + uint16 var_24; + uint16 var_26; +} rct_crash_splash; + /** * Sprite structure. * size: 0x0100 @@ -225,14 +296,16 @@ typedef union { rct_duck duck; rct_jumping_fountain jumping_fountain; rct_money_effect money_effect; + rct_crashed_vehicle_particle crashed_vehicle_particle; + rct_crash_splash crash_splash; } rct_sprite; enum { SPRITE_MISC_0, SPRITE_MISC_MONEY_EFFECT, - SPRITE_MISC_2, // (related to vehicle crash, probably crash particles) + SPRITE_MISC_CRASHED_VEHICLE_PARTICLE, SPRITE_MISC_3, // (related to vehicle crash, probably crash particles) - SPRITE_MISC_4, // (related to vehicle crash, probably crash particles) + SPRITE_MISC_CRASH_SPLASH, SPRITE_MISC_5, // (related to vehicle crash, probably crash particles) SPRITE_MISC_JUMPING_FOUNTAIN_WATER, SPRITE_MISC_BALLOON, @@ -280,4 +353,12 @@ void duck_remove_all(); void money_effect_create(money32 value); void money_effect_update(rct_money_effect *moneyEffect); +/////////////////////////////////////////////////////////////// +// Crash particles +/////////////////////////////////////////////////////////////// +void crashed_vehicle_particle_create(rct_vehicle_colour colours, int x, int y, int z); +void crashed_vehicle_particle_update(rct_crashed_vehicle_particle *particle); +void crash_splash_create(int x, int y, int z); +void crash_splash_update(rct_crash_splash *splash); + #endif From e9269cb882cb864baf250a14f21fe8ffe7ec8b48 Mon Sep 17 00:00:00 2001 From: medsouz Date: Sat, 22 Aug 2015 12:03:40 -0400 Subject: [PATCH 0585/1173] Finish naming scenery.c addresses --- src/addresses.h | 7 +++++-- src/windows/scenery.c | 2 +- src/windows/top_toolbar.c | 26 +++++++++++++------------- src/world/scenery.c | 12 ++++++------ 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 3c96cec4e4..5533ef5ce3 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -351,19 +351,22 @@ #define RCT2_ADDRESS_SCENERY_COST 0x00F64EB4 #define RCT2_ADDRESS_SCENERY_MAP_ELEMENT 0x00F64EBC +#define RCT2_ADDRESS_SCENERY_ROTATION 0x00F64EC0 #define RCT2_ADDRESS_GHOST_SCENERY_X 0x00F64EC4 #define RCT2_ADDRESS_GHOST_SCENERY_Y 0x00F64EC6 #define RCT2_ADDRESS_GHOST_SCENERY_Z 0x00F64F09 #define RCT2_ADDRESS_SCENERY_MAP_ELEMENT_TYPE 0x00F64F0C #define RCT2_ADDRESS_GHOST_SCENERY_TYPE 0x00F64F0D - +#define RCT2_ADDRESS_SCENERY_TARGET_PATH_INCLINE 0x00F64F0F +#define RCT2_ADDRESS_GHOST_SCENERY_PATH_OBJECT_TYPE 0x00F64EAC #define RCT2_ADDRESS_CTRL_PRESS_Z_COORDINATE 0x00F64ECC #define RCT2_ADDRESS_SHIFT_PRESS_X_COORDINATE 0x00F64ECE #define RCT2_ADDRESS_SHIFT_PRESS_Y_COORDINATE 0x00F64ED0 #define RCT2_ADDRESS_SHIFT_PRESS_Z_VECTOR 0x00F64ED2 #define RCT2_ADDRESS_SCENERY_Z_COORDINATE 0x00F64ED4 #define RCT2_ADDRESS_SCENERY_SELECTED_OBJECT 0x00F64EDA - +#define RCT2_ADDRESS_SCENERY_TARGET_PATH_TYPE 0x00F64F10 +#define RCT2_ADDRESS_GHOST_SCENERY_WALL_ROTATION 0x00F64F11 #define RCT2_ADDRESS_SCENERY_TOOL_CTRL_PRESSED 0x00F64F12 #define RCT2_ADDRESS_SCENERY_TOOL_SHIFT_PRESSED 0x00F64F13 diff --git a/src/windows/scenery.c b/src/windows/scenery.c index ea6a4388a2..b7c132a489 100644 --- a/src/windows/scenery.c +++ b/src/windows/scenery.c @@ -472,7 +472,7 @@ void window_scenery_open() window_push_others_below(window); RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) = 0; RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_COST, uint32) = MONEY32_UNDEFINED; - RCT2_GLOBAL(0x00F64EC0, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint16) = 0; window_scenery_is_repaint_scenery_tool_on = 0; // repaint colored scenery tool state window_scenery_is_build_cluster_tool_on = 0; // build cluster tool state diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 9aa804c3b6..16d838b2c2 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -1434,8 +1434,8 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w cur_grid_y += ((scenario_rand() % 16) - 8) * 32; if (!(scenery->small_scenery.flags & SMALL_SCENERY_FLAG4)){ - RCT2_GLOBAL(0x00F64EC0, uint16)++; - RCT2_GLOBAL(0x00F64EC0, uint16) &= 3; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint16)++; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint16) &= 3; } } @@ -1460,7 +1460,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1161; - int cost = game_do_command(cur_grid_x, ebx, cur_grid_y, parameter_2, GAME_COMMAND_PLACE_SCENERY, RCT2_GLOBAL(0x00F64EC0, uint8) | (parameter_3 & 0xFFFF0000), RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16)); + int cost = game_do_command(cur_grid_x, ebx, cur_grid_y, parameter_2, GAME_COMMAND_PLACE_SCENERY, RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint8) | (parameter_3 & 0xFFFF0000), RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16)); RCT2_GLOBAL(0x009A8C29, uint8) &= ~1; @@ -2090,7 +2090,7 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) = map_tile.x; RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; - RCT2_GLOBAL(0x00F64EC0, uint16) = (uint16)(parameter_3 & 0xFFFF); + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint16) = (uint16)(parameter_3 & 0xFFFF); RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_SELECTED_OBJECT, sint16) = selected_tab; mapElement = RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT, rct_map_element*); @@ -2123,9 +2123,9 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) = map_tile.x; RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = (parameter_2 & 0xFF); - RCT2_GLOBAL(0x00F64F0F, uint8) = ((parameter_1 >> 8) & 0xFF); - RCT2_GLOBAL(0x00F64F10, uint8) = ((parameter_2 >> 8) & 0xFF); - RCT2_GLOBAL(0x00F64EAC, uint32) = parameter_3; + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TARGET_PATH_INCLINE, uint8) = ((parameter_1 >> 8) & 0xFF); + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TARGET_PATH_TYPE, uint8) = ((parameter_2 >> 8) & 0xFF); + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_PATH_OBJECT_TYPE, uint32) = parameter_3; RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) |= (1 << 1); break; @@ -2146,7 +2146,7 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) = map_tile.x; RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; - RCT2_GLOBAL(0x00F64F11, uint8) = (parameter_2 & 0xFF); + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_WALL_ROTATION, uint8) = (parameter_2 & 0xFF); mapElement = RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT, rct_map_element*); RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = mapElement->base_height; @@ -2170,7 +2170,7 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) = map_tile.x; RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; - RCT2_GLOBAL(0x00F64EC0, uint8) = ((parameter_1 >> 8) & 0xFF); + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint8) = ((parameter_1 >> 8) & 0xFF); mapElement = RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT, rct_map_element*); RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = mapElement->base_height; @@ -2202,7 +2202,7 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) = map_tile.x; RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = (parameter_2 & 0xFF); - RCT2_GLOBAL(0x00F64EC0, uint8) = ((parameter_2 >> 8) & 0xFF); + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint8) = ((parameter_2 >> 8) & 0xFF); RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) |= (1 << 4); break; } @@ -2342,7 +2342,7 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ if ((RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 2)) && mapTile.x == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) && mapTile.y == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) && - (parameter2 & 0xFF) == RCT2_GLOBAL(0x00F64F11, uint8) && + (parameter2 & 0xFF) == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_WALL_ROTATION, uint8) && RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) == RCT2_GLOBAL(0x00F64F0A, sint16) ){ return; @@ -2350,7 +2350,7 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ scenery_remove_ghost_tool_placement(); - RCT2_GLOBAL(0x00F64F11, uint8) = (parameter2 & 0xFF); + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_WALL_ROTATION, uint8) = (parameter2 & 0xFF); RCT2_GLOBAL(0x00F64F0A, sint16) = RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16); bl = 1; @@ -2450,7 +2450,7 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ mapTile.x == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) && mapTile.y == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) && (parameter2 & 0xFF) == RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) && - ((parameter2 >> 8) & 0xFF) == RCT2_GLOBAL(0x00F64EC0, uint8)){ + ((parameter2 >> 8) & 0xFF) == RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint8)){ return; } diff --git a/src/world/scenery.c b/src/world/scenery.c index dae85db385..5075173d7f 100644 --- a/src/world/scenery.c +++ b/src/world/scenery.c @@ -147,11 +147,11 @@ void scenery_remove_ghost_tool_placement(){ game_do_command( x, - 233 | (RCT2_GLOBAL(0x00F64F0F, uint8) << 8), + 233 | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TARGET_PATH_INCLINE, uint8) << 8), y, - z | (RCT2_GLOBAL(0x00F64F10, uint8) << 8), + z | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TARGET_PATH_TYPE, uint8) << 8), GAME_COMMAND_PLACE_PATH, - RCT2_GLOBAL(0x00F64EAC, uint32) & 0xFFFF0000, + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_PATH_OBJECT_TYPE, uint32) & 0xFFFF0000, 0); break; } while (!map_element_is_last_for_tile(map_element++)); @@ -163,7 +163,7 @@ void scenery_remove_ghost_tool_placement(){ x, 105 | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT_TYPE, uint8) << 8), y, - RCT2_GLOBAL(0x00F64F11, uint8) |(z << 8), + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_WALL_ROTATION, uint8) |(z << 8), GAME_COMMAND_REMOVE_FENCE, 0, 0); @@ -173,7 +173,7 @@ void scenery_remove_ghost_tool_placement(){ RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 3); game_do_command( x, - 105 | (RCT2_GLOBAL(0x00F64EC0 /* rotation? */, uint8) << 8), + 105 | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint8) << 8), y, z, GAME_COMMAND_REMOVE_LARGE_SCENERY, @@ -187,7 +187,7 @@ void scenery_remove_ghost_tool_placement(){ x, 105, y, - z | (RCT2_GLOBAL(0x00F64EC0, uint8) << 8), + z | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint8) << 8), GAME_COMMAND_REMOVE_BANNER, 0, 0); From 972ae72d876b06892ad90ad58c35a44e55ab1892 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 23 Aug 2015 04:00:15 +0100 Subject: [PATCH 0586/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 2a32b34f3e..3594e47460 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -30,7 +30,7 @@ STR_0025 :運木水道 STR_0026 :激流船 STR_0027 :碰碰車 STR_0028 :海盜船 -STR_0029 :迴旋海盜船 +STR_0029 :垂直迴轉海盜船 STR_0030 :食物店鋪 STR_0031 :Unknown Stall (1D) STR_0032 :飲料店鋪 @@ -1472,7 +1472,7 @@ STR_1466 :向下盤旋 (小型) STR_1467 :向下盤旋 (大型) STR_1468 :員工 STR_1469 :遊樂設施必需要由車站發車後到達車站卸客 -STR_1470 :車站不夠長 +STR_1470 :車站長度不足 STR_1471 :{WINDOW_COLOUR_2}速度: STR_1472 :{SMALLFONT}{BLACK}此遊樂設施的速度 STR_1473 :{WINDOW_COLOUR_2}興奮度: {BLACK}{COMMA2DP32} ({STRINGID}) @@ -1482,7 +1482,7 @@ STR_1476 :{WINDOW_COLOUR_2}刺激度: {BLACK}暫無 STR_1477 :{WINDOW_COLOUR_2}刺激度: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) STR_1478 :{WINDOW_COLOUR_2}噁心度: {BLACK}{COMMA2DP32} ({STRINGID}) STR_1479 :{WINDOW_COLOUR_2}噁心度: {BLACK}暫無 -STR_1480 :{SMALLFONT}{OPENQUOTES}我已經不夠錢去乘坐{STRINGID}了{ENDQUOTES} +STR_1480 :{SMALLFONT}{OPENQUOTES}我已經沒錢去乘坐{STRINGID}了{ENDQUOTES} STR_1481 :{SMALLFONT}{OPENQUOTES}我已經花光我的錢了{ENDQUOTES} STR_1482 :{SMALLFONT}{OPENQUOTES}我感到不適{ENDQUOTES} STR_1483 :{SMALLFONT}{OPENQUOTES}我感到非常不適{ENDQUOTES} @@ -1514,7 +1514,7 @@ STR_1508 :{SMALLFONT}{OPENQUOTES}我想從{STRINGID}中下來{ENDQUOTES} STR_1509 :{SMALLFONT}{OPENQUOTES}我想從{STRINGID}中出來{ENDQUOTES} STR_1510 :{SMALLFONT}{OPENQUOTES}我不會乘坐{STRINGID} - 它一點都不安全{ENDQUOTES} STR_1511 :{SMALLFONT}{OPENQUOTES}這道路真是令人噁心{ENDQUOTES} -STR_1512 :{SMALLFONT}{OPENQUOTES}這裡太擠逼了{ENDQUOTES} +STR_1512 :{SMALLFONT}{OPENQUOTES}這裡實在太擠迫了{ENDQUOTES} STR_1513 :{SMALLFONT}{OPENQUOTES}這裡真多被刻意毀壞的設施{ENDQUOTES} STR_1514 :{SMALLFONT}{OPENQUOTES}這裡的景色真是美不勝收!{ENDQUOTES} STR_1515 :{SMALLFONT}{OPENQUOTES}這樂園真是又整齊又乾淨{ENDQUOTES} @@ -1553,7 +1553,7 @@ STR_1547 : STR_1548 : STR_1549 : STR_1550 :{SMALLFONT}{OPENQUOTES}嘩!{ENDQUOTES} -STR_1551 :{SMALLFONT}{OPENQUOTES}奇怪, 我覺得有人在偷窺我{ENDQUOTES} +STR_1551 :{SMALLFONT}{OPENQUOTES}奇怪, 我覺得有人在悄悄地監視我{ENDQUOTES} STR_1552 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一個氣球{ENDQUOTES} STR_1553 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一隻毛公仔{ENDQUOTES} STR_1554 :{SMALLFONT}{OPENQUOTES}我不會花這麼多錢在{STRINGID}購買一份樂園地圖{ENDQUOTES} @@ -1731,7 +1731,7 @@ STR_1725 :不能購買土地... STR_1726 :土地不供購買! STR_1727 :建造權不供購買! STR_1728 :不能在此購買建造權... -STR_1729 :土地不是由樂園所擁有! +STR_1729 :土地並非由樂園所擁有! STR_1730 :{RED}已關閉 - - STR_1731 :{WHITE}{STRINGID} - - STR_1732 :建造 @@ -3521,8 +3521,8 @@ STR_5179 :{SMALLFONT}{BLACK}顯示用於遊客的密技 STR_5180 :{SMALLFONT}{BLACK}顯示用於樂園的密技 STR_5181 :{SMALLFONT}{BLACK}顯示用於設施的密技 STR_5182 :{INT32} -STR_5183 :土地地面高度 -STR_5184 :靖輸入介乎{COMMA16}及{COMMA16}的土地地面高度 +STR_5183 :地面高度 +STR_5184 :靖輸入介乎{COMMA16}及{COMMA16}的地面高度 STR_5185 :水面高度 STR_5186 :靖輸入介乎{COMMA16}及{COMMA16}的水面高度 STR_5187 :財政 @@ -3709,7 +3709,7 @@ STR_5366 :正常 STR_5367 :快速 STR_5368 :重設毀壞狀態 STR_5369 :樂園參數... -STR_5370 :{SMALLFONT}{BLACK}按此來修改樂園參數{NEWLINE}例如有關限制, 生成遊客{NEWLINE}及金錢的選項 +STR_5370 :{SMALLFONT}{BLACK}按此來修改樂園參數{NEWLINE}例如關於限制, 生成遊客{NEWLINE}及金錢的選項 STR_5371 :選取物件 STR_5372 :滑鼠左鍵拖拉 STR_5373 :名稱 {STRINGID} @@ -3852,3 +3852,4 @@ STR_5509 :{SMALLFONT}{BLACK}允許載入校驗失敗的劇情及存檔, 例 STR_5510 :預設聲效裝置 STR_5511 :(未知) STR_5512 :另存遊戲 +STR_5513 :(快速)儲存遊戲 From 2afd9b8a6150d44976949f31db4151228ba0bc1f Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 24 Aug 2015 04:00:17 +0100 Subject: [PATCH 0587/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 1 + data/language/english_us.txt | 1 + data/language/finnish.txt | 1163 +++++++++++++++++----------------- 3 files changed, 595 insertions(+), 570 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 0d7e0c000e..e5a0671099 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3845,3 +3845,4 @@ STR_5509 :{SMALLFONT}{BLACK}Maakt het mogelijk om scenario's en opgeslagen sp STR_5510 :Standaard geluidsapparaat STR_5511 :(ONBEKEND) STR_5512 :Spel opslaan als... +STR_5513 :Spel (snel) opslaan diff --git a/data/language/english_us.txt b/data/language/english_us.txt index fd111c8b17..3d3eb55920 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3853,3 +3853,4 @@ STR_5509 :{SMALLFONT}{BLACK}Allows loading scenarios and saves that have an i STR_5510 :Default sound device STR_5511 :(UNKNOWN) STR_5512 :Save Game As +STR_5513 :(Quick) save game diff --git a/data/language/finnish.txt b/data/language/finnish.txt index 240f9201c5..737da779a2 100644 --- a/data/language/finnish.txt +++ b/data/language/finnish.txt @@ -3,31 +3,31 @@ # Use # at the beginning of a line to leave a comment. STR_0000 : STR_0001 :{STRINGID} {COMMA16} -STR_0002 :Spiral Roller Coaster +STR_0002 :Kierrevuoristorata STR_0003 :Stand-up Roller Coaster STR_0004 :Suspended Swinging Coaster -STR_0005 :Inverted Roller Coaster -STR_0006 :Junior Roller Coaster -STR_0007 :Miniature Railway -STR_0008 :Monorail +STR_0005 :Käänteinen vuoristorata +STR_0006 :Juniorivuoristorata +STR_0007 :Pienoisrautatie +STR_0008 :Yksiraiteinen STR_0009 :Mini Suspended Coaster STR_0010 :Veneajelu -STR_0011 :Wooden Wild Mouse +STR_0011 :Puinen villihiiri STR_0012 :Steeplechase STR_0013 :Autoajelu STR_0014 :Launched Freefall -STR_0015 :Bobsleigh Coaster -STR_0016 :Observation Tower +STR_0015 :Rattikelkkavuoristorata +STR_0016 :Näköalatorni STR_0017 :Looping Roller Coaster STR_0018 :Dinghy Slide STR_0019 :Mine Train Coaster STR_0020 :Tuolihissi -STR_0021 :Corkscrew Roller Coaster +STR_0021 :Korkkiruuvivuoristorata STR_0022 :Labyrintti -STR_0023 :Spiral Slide +STR_0023 :Kierreliukumäki STR_0024 :Go Karts -STR_0025 :Log Flume -STR_0026 :River Rapids +STR_0025 :Tukkijoki +STR_0026 :Koskiseikkailu STR_0027 :Törmäysautot STR_0028 :Merirosvolaiva STR_0029 :Swinging Inverter Ship @@ -39,9 +39,9 @@ STR_0034 :Kauppa STR_0035 :Karuselli STR_0036 :Tuntematon koju (22) STR_0037 :Information Kiosk -STR_0038 :Toilets +STR_0038 :WC STR_0039 :Maailmanpyörä -STR_0040 :Motion Simulator +STR_0040 :Liikesimulaattori STR_0041 :3D-teatteri STR_0042 :Top Spin STR_0043 :Space Rings @@ -51,20 +51,20 @@ STR_0046 :Vertical Drop Roller Coaster STR_0047 :Kassakone STR_0048 :Twist STR_0049 :Kummitustalo -STR_0050 :First Aid Room +STR_0050 :Ensiapuhuone STR_0051 :Sirkusesitys STR_0052 :Kummitusjuna STR_0053 :Steel Twister Roller Coaster -STR_0054 :Wooden Roller Coaster +STR_0054 :Puinen vuoristorata STR_0055 :Side-Friction Roller Coaster STR_0056 :Villihiiri STR_0057 :Multi-Dimension Roller Coaster STR_0058 :Tuntematon laite (38) -STR_0059 :Flying Roller Coaster +STR_0059 :Lentävä vuoristorata STR_0060 :Tuntematon laite (3A) STR_0061 :Virginia Reel STR_0062 :Splash Boats -STR_0063 :Mini Helicopters +STR_0063 :Minihelikopterit STR_0064 :Lay-down Roller Coaster STR_0065 :Suspended Monorail STR_0066 :Tuntematon laite (40) @@ -73,7 +73,7 @@ STR_0068 :Heartline Twister Coaster STR_0069 :Mini Golf STR_0070 :Giga Coaster STR_0071 :Roto-Drop -STR_0072 :Flying Saucers +STR_0072 :Lentävät lautaset STR_0073 :Crooked House STR_0074 :Monorail Cycles STR_0075 :Compact Inverted Coaster @@ -81,8 +81,8 @@ STR_0076 :Water Coaster STR_0077 :Air Powered Vertical Coaster STR_0078 :Inverted Hairpin Coaster STR_0079 :Taikamatto -STR_0080 :Submarine Ride -STR_0081 :River Rafts +STR_0080 :Sukellusveneajelu +STR_0081 :Jokilautat STR_0082 :Tuntematon laite (50) STR_0083 :Yhtiö STR_0084 :Tuntematon laite (52) @@ -90,7 +90,7 @@ STR_0085 :Tuntematon laite (53) STR_0086 :Tuntematon laite (54) STR_0087 :Tuntematon laite (55) STR_0088 :Inverted Impulse Coaster -STR_0089 :Mini Roller Coaster +STR_0089 :Minivuoristorata STR_0090 :Kaivosajelu STR_0091 :Tuntematon laite (59) STR_0092 :LIM Launched Roller Coaster @@ -780,37 +780,37 @@ STR_0775 :Nimetön puisto{POP16}{POP16} STR_0776 :Nimetön puisto{POP16}{POP16} STR_0777 :Nimetön puisto{POP16}{POP16} STR_0778 :Kyltti -STR_0779 :1st -STR_0780 :2nd -STR_0781 :3rd -STR_0782 :4th -STR_0783 :5th -STR_0784 :6th -STR_0785 :7th -STR_0786 :8th -STR_0787 :9th -STR_0788 :10th -STR_0789 :11th -STR_0790 :12th -STR_0791 :13th -STR_0792 :14th -STR_0793 :15th -STR_0794 :16th -STR_0795 :17th -STR_0796 :18th -STR_0797 :19th -STR_0798 :20th -STR_0799 :21st -STR_0800 :22nd -STR_0801 :23rd -STR_0802 :24th -STR_0803 :25th -STR_0804 :26th -STR_0805 :27th -STR_0806 :28th -STR_0807 :29th -STR_0808 :30th -STR_0809 :31st +STR_0779 :1. +STR_0780 :2. +STR_0781 :3. +STR_0782 :4. +STR_0783 :5. +STR_0784 :6. +STR_0785 :7. +STR_0786 :8. +STR_0787 :9. +STR_0788 :10. +STR_0789 :11. +STR_0790 :12. +STR_0791 :13. +STR_0792 :14. +STR_0793 :15. +STR_0794 :16. +STR_0795 :17. +STR_0796 :18. +STR_0797 :19. +STR_0798 :20. +STR_0799 :21. +STR_0800 :22. +STR_0801 :23. +STR_0802 :24. +STR_0803 :25. +STR_0804 :26. +STR_0805 :27. +STR_0806 :28. +STR_0807 :29. +STR_0808 :30. +STR_0809 :31. STR_0810 :Tammi STR_0811 :Helmi STR_0812 :Maalis @@ -824,13 +824,13 @@ STR_0819 :Loka STR_0820 :Marras STR_0821 :Joulu STR_0822 :Unable to access graphic data file -STR_0823 :Missing or inaccessible data file +STR_0823 :Puuttuva tai käyttökelvoton datatiedosto STR_0824 :{BLACK}{CROSS} STR_0825 :Nimi on jo käytössä STR_0826 :Liian monta nimeä määritetty -STR_0827 :Not enough cash - requires {CURRENCY2DP} +STR_0827 :Rahaa ei ole tarpeeksi - tarvitaan {CURRENCY2DP} STR_0828 :{SMALLFONT}{BLACK}Sulje ikkuna -STR_0829 :{SMALLFONT}{BLACK}Window title - Drag this to move window +STR_0829 :{SMALLFONT}{BLACK}Ikkunan otsikko - Vedä tätä liikuttaakseen ikkunaa STR_0830 :{SMALLFONT}{BLACK}Suurenna STR_0831 :{SMALLFONT}{BLACK}Pienennä STR_0832 :{SMALLFONT}{BLACK}Käännä 90{DEGREE} myötäpäivään @@ -1053,8 +1053,8 @@ STR_1047 :Pelin tallennus epäonnistui! STR_1048 :Scenario save failed! STR_1049 :Maisematiedoston tallennus epäonnistui! STR_1050 :Failed to load...{NEWLINE}File contains invalid data! -STR_1051 :Invisible Supports -STR_1052 :Invisible People +STR_1051 :Näkymättömiä tukia +STR_1052 :Näkymättömiä henkilöitä STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park STR_1054 :{SMALLFONT}{BLACK}Name ride/attraction STR_1055 :{SMALLFONT}{BLACK}Name person @@ -1103,14 +1103,14 @@ STR_1097 :Powered launch block sectioned mode STR_1098 :Moving to end of {POP16}{STRINGID} STR_1099 :Waiting for passengers at {POP16}{STRINGID} STR_1100 :Waiting to depart {POP16}{STRINGID} -STR_1101 :Departing {POP16}{STRINGID} -STR_1102 :Travelling at {VELOCITY} -STR_1103 :Arriving at {POP16}{STRINGID} -STR_1104 :Unloading passengers at {POP16}{STRINGID} -STR_1105 :Travelling at {VELOCITY} +STR_1101 :Lähtemässä {POP16}{STRINGID} +STR_1102 :Liikkuen {VELOCITY} +STR_1103 :Saapumassa {POP16}{STRINGID} +STR_1104 :Matkustajia puretaan {POP16}{STRINGID} +STR_1105 :Liikkuen {VELOCITY} STR_1106 :Sortunut! STR_1107 :Sortunut! -STR_1108 :Travelling at {VELOCITY} +STR_1108 :Liikkuen {VELOCITY} STR_1109 :Keinuu STR_1110 :Pyörii STR_1111 :Pyörii @@ -1122,7 +1122,7 @@ STR_1116 :Käynnissä STR_1117 :Sirkusesitys menossa STR_1118 :Käynnissä STR_1119 :Waiting for cable lift -STR_1120 :Travelling at {VELOCITY} +STR_1120 :Liikkuen {VELOCITY} STR_1121 :Pysäytetään STR_1122 :Odotetaan matkustajia STR_1123 :Odotetaan käynnistämistä @@ -1148,8 +1148,8 @@ STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} STR_1144 :Can't build/move entrance for this ride/attraction... STR_1145 :Can't build/move exit for this ride/attraction... -STR_1146 :Entrance not yet built -STR_1147 :Exit not yet built +STR_1146 :Sisäänkäyntiä ei ole vielä rakennettu +STR_1147 :Uloskäyntiä ei ole vielä rakennettu STR_1148 :Neljännes kuorma STR_1149 :Puolikas kuorma STR_1150 :Kolmeneljäsosaa kuorma @@ -1165,12 +1165,12 @@ STR_1159 :{SMALLFONT}{BLACK}Place scenery, gardens, and other accessories STR_1160 :{SMALLFONT}{BLACK}Create/adjust lakes & water STR_1161 :Tätä ei voi asettaa tähän... STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} -STR_1163 :{STRINGID}{NEWLINE}(Right-Click to Modify) -STR_1164 :{STRINGID}{NEWLINE}(Right-Click to Remove) +STR_1163 :{STRINGID}{NEWLINE}(Oikea klikkaus muokkaa) +STR_1164 :{STRINGID}{NEWLINE}(Oikea klikkaus poistaa) STR_1165 :{STRINGID} - {STRINGID} {COMMA16} STR_1166 :Can't lower water level here... STR_1167 :Can't raise water level here... -STR_1168 :Options +STR_1168 :Asetukset STR_1169 :(Ei mitään) STR_1170 :{STRING} STR_1171 :{RED}Suljettu - - @@ -1229,7 +1229,7 @@ STR_1223 :{SMALLFONT}{BLACK}Transport rides STR_1224 :{SMALLFONT}{BLACK}Gentle rides STR_1225 :{SMALLFONT}{BLACK}Roller coasters STR_1226 :{SMALLFONT}{BLACK}Thrill rides -STR_1227 :{SMALLFONT}{BLACK}Water rides +STR_1227 :{SMALLFONT}{BLACK}Vesiajelut STR_1228 :{SMALLFONT}{BLACK}Shops & stalls STR_1229 :juna STR_1230 :junaa @@ -1341,7 +1341,7 @@ STR_1335 :{STRINGID} - Sisäänkäynti{POP16}{POP16} STR_1336 :{STRINGID} - Asema {POP16}{COMMA16} Sisäänkäynti STR_1337 :{STRINGID} - Uloskäynti{POP16}{POP16} STR_1338 :{STRINGID} - Asema {POP16}{COMMA16} Uloskäynti -STR_1339 :{BLACK}No test results yet... +STR_1339 :{BLACK}Testituloksia ei ole vielä saatavilla... STR_1340 :{WINDOW_COLOUR_2}Max. speed: {BLACK}{VELOCITY} STR_1341 :{WINDOW_COLOUR_2}Ajelun kesto: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} STR_1342 :{DURATION} @@ -1356,7 +1356,7 @@ STR_1350 :{WINDOW_COLOUR_2}Max. negative vertical G's: {BLACK}{COMMA2DP32}g STR_1351 :{WINDOW_COLOUR_2}Max. negative vertical G's: {OUTLINE}{RED}{COMMA2DP32}g STR_1352 :{WINDOW_COLOUR_2}Max. lateral G's: {BLACK}{COMMA2DP32}g STR_1353 :{WINDOW_COLOUR_2}Max. lateral G's: {OUTLINE}{RED}{COMMA2DP32}g -STR_1354 :{WINDOW_COLOUR_2}Highest drop height: {BLACK}{LENGTH} +STR_1354 :{WINDOW_COLOUR_2}Korkein pudotuskorkeus: {BLACK}{LENGTH} STR_1355 :{WINDOW_COLOUR_2}Pudotusta: {BLACK}{COMMA16} STR_1356 :{WINDOW_COLOUR_2}Inversions: {BLACK}{COMMA16} STR_1357 :{WINDOW_COLOUR_2}Reikää: {BLACK}{COMMA16} @@ -1398,19 +1398,19 @@ STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options STR_1394 :{SMALLFONT}{BLACK}Operating options STR_1395 :{SMALLFONT}{BLACK}Maintenance options -STR_1396 :{SMALLFONT}{BLACK}Colour scheme options +STR_1396 :{SMALLFONT}{BLACK}Värityylin asetukset STR_1397 :{SMALLFONT}{BLACK}Ääni- ja musiikkiasetukset -STR_1398 :{SMALLFONT}{BLACK}Measurements and test data +STR_1398 :{SMALLFONT}{BLACK}Mitat ja testitiedot STR_1399 :{SMALLFONT}{BLACK}Kuvastot STR_1400 :Sisäänkäynti STR_1401 :Uloskäynti STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction STR_1404 :{SMALLFONT}{BLACK}Rotate 90{DEGREE} -STR_1405 :{SMALLFONT}{BLACK}Mirror image +STR_1405 :{SMALLFONT}{BLACK}Peilaa kuva STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) -STR_1407 :{WINDOW_COLOUR_2}Build this... -STR_1408 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} +STR_1407 :{WINDOW_COLOUR_2}Rakenna tämä... +STR_1408 :{WINDOW_COLOUR_2}Kustannus: {BLACK}{CURRENCY} STR_1409 :Entry/Exit Platform STR_1410 :Vertical Tower STR_1411 :{STRINGID} in the way @@ -1430,7 +1430,7 @@ STR_1424 :{SMALLFONT}{BLACK}Jalkakäytävä STR_1425 :Jalkakäytävä STR_1426 :Jono STR_1427 :{WINDOW_COLOUR_2}Asiakkaita: {BLACK}{COMMA32} per tunti -STR_1428 :{WINDOW_COLOUR_2}Sisäänpääsy maksu: +STR_1428 :{WINDOW_COLOUR_2}Sisäänpääsymaksu: STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} STR_1430 :Ilmainen STR_1431 :Kävelen @@ -1445,12 +1445,12 @@ STR_1439 :(valitse sijainti) STR_1440 :Leikkaan ruohoa STR_1441 :Harjaan jalkakäytävää STR_1442 :Tyhjennän roskakoria -STR_1443 :Kastelen kasveja +STR_1443 :Kastelen puutarhoja STR_1444 :Katselen {STRINGID} STR_1445 :Watching construction of {STRINGID} STR_1446 :Looking at scenery STR_1447 :Lähden puistosta -STR_1448 :Watching new ride being constructed +STR_1448 :Katson uuden ajelun rakentelua STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) @@ -1474,7 +1474,7 @@ STR_1468 :Henkilökunta STR_1469 :Ride must start and end with stations STR_1470 :Station not long enough STR_1471 :{WINDOW_COLOUR_2}Nopeus: -STR_1472 :{SMALLFONT}{BLACK}Speed of this ride +STR_1472 :{SMALLFONT}{BLACK}Tämän ajelun nopeus STR_1473 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} ({STRINGID}) STR_1474 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}Not yet available STR_1475 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} ({STRINGID}) @@ -1519,7 +1519,7 @@ STR_1513 :{SMALLFONT}{OPENQUOTES}The vandalism here is really bad{ENDQUOTES} STR_1514 :{SMALLFONT}{OPENQUOTES}Mahtava maisema!{ENDQUOTES} STR_1515 :{SMALLFONT}{OPENQUOTES}This park is really clean and tidy{ENDQUOTES} STR_1516 :{SMALLFONT}{OPENQUOTES}The jumping fountains are great{ENDQUOTES} -STR_1517 :{SMALLFONT}{OPENQUOTES}The music is nice here{ENDQUOTES} +STR_1517 :{SMALLFONT}{OPENQUOTES}Täällä oleva musiikki on hienoa{ENDQUOTES} STR_1518 :{SMALLFONT}{OPENQUOTES}This balloon from {STRINGID} is really good value{ENDQUOTES} STR_1519 :{SMALLFONT}{OPENQUOTES}This cuddly toy from {STRINGID} is really good value{ENDQUOTES} STR_1520 :{SMALLFONT}{OPENQUOTES}This park map from {STRINGID} is really good value{ENDQUOTES} @@ -1650,13 +1650,13 @@ STR_1644 : STR_1645 : STR_1646 : STR_1647 : -STR_1648 :{SMALLFONT}{OPENQUOTES}Help! Put me down!{ENDQUOTES} -STR_1649 :{SMALLFONT}{OPENQUOTES}I'm running out of cash!{ENDQUOTES} -STR_1650 :{SMALLFONT}{OPENQUOTES}Wow! A new ride being built!{ENDQUOTES} +STR_1648 :{SMALLFONT}{OPENQUOTES}Auta! Laske minut alas!{ENDQUOTES} +STR_1649 :{SMALLFONT}{OPENQUOTES}Rahat ovat loppumassa!{ENDQUOTES} +STR_1650 :{SMALLFONT}{OPENQUOTES}Vau! Uusi ajelu on rakennettu!{ENDQUOTES} STR_1651 :{SMALLFONT}{OPENQUOTES}Nice ride! But not as good as the Phoenix...{ENDQUOTES} STR_1652 :{SMALLFONT}{OPENQUOTES}I'm so excited - It's an Intamin ride!{ENDQUOTES} STR_1653 :{SMALLFONT}{OPENQUOTES}...and here we are on {STRINGID}!{ENDQUOTES} -STR_1654 :{WINDOW_COLOUR_2}Recent thoughts: +STR_1654 :{WINDOW_COLOUR_2}Viimeiset ajatukset: STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land STR_1656 :{SMALLFONT}{BLACK}Construct bridge or tunnel footpath STR_1657 :{WINDOW_COLOUR_2}Preferred ride @@ -1669,9 +1669,9 @@ STR_1663 :{WINDOW_COLOUR_2}Nausea: STR_1664 :{WINDOW_COLOUR_2}Energia: STR_1665 :{WINDOW_COLOUR_2}Nälkä: STR_1666 :{WINDOW_COLOUR_2}Jano: -STR_1667 :{WINDOW_COLOUR_2}Bathroom: -STR_1668 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}Unknown -STR_1669 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}{COMMA16}% +STR_1667 :{WINDOW_COLOUR_2}WC: +STR_1668 :{WINDOW_COLOUR_2}Tyytyväisyys: {BLACK}Tuntematon +STR_1669 :{WINDOW_COLOUR_2}Tyytyväisyys: {BLACK}{COMMA16}% STR_1670 :{WINDOW_COLOUR_2}Total customers: {BLACK}{COMMA32} STR_1671 :{WINDOW_COLOUR_2}Total profit: {BLACK}{CURRENCY2DP} STR_1672 :Jarrut @@ -1697,88 +1697,88 @@ STR_1691 :{WINDOW_COLOUR_2} Hinta: {BLACK}{CURRENCY} STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY} STR_1693 :{SMALLFONT}{BLACK}Vieraat STR_1694 :{SMALLFONT}{BLACK}Henkilökunta -STR_1695 :{SMALLFONT}{BLACK}Income and costs -STR_1696 :{SMALLFONT}{BLACK}Customer information +STR_1695 :{SMALLFONT}{BLACK}Tulot ja kulut +STR_1696 :{SMALLFONT}{BLACK}Asiakkaan tiedot STR_1697 :Cannot place these on queue line area STR_1698 :Can only place these on queue area -STR_1699 :Too many people in game -STR_1700 :Hire new Handyman -STR_1701 :Hire new Mechanic -STR_1702 :Hire new Security Guard -STR_1703 :Hire new Entertainer -STR_1704 :Can't hire new staff... -STR_1705 :{SMALLFONT}{BLACK}Sack this staff member -STR_1706 :{SMALLFONT}{BLACK}Move this person to a new location -STR_1707 :Too many staff in game +STR_1699 :Liikaa henkilöitä pelissä +STR_1700 :Palkkaa uusi yleismies +STR_1701 :Palkkaa uusi mekaanikko +STR_1702 :Palkkaa uusi vartija +STR_1703 :Palkkaa uusi viihdyttäjä +STR_1704 :Henkilökunnan palkkaaminen ei onnistu... +STR_1705 :{SMALLFONT}{BLACK}Irtisano tämä henkilökunnan jäsen +STR_1706 :{SMALLFONT}{BLACK}Siirrä tämä henkilö uuteen sijaintiin +STR_1707 :Liikaa henkilökuntaa pelissä STR_1708 :{SMALLFONT}{BLACK}Set patrol area for this staff member -STR_1709 :Sack staff +STR_1709 :Irtisano henkilökunta STR_1710 :Kyllä STR_1711 :{WINDOW_COLOUR_1}Are you sure you want to sack {STRINGID}? -STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Sweep footpaths -STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Water gardens -STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Empty litter bins -STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Mow grass -STR_1716 :Invalid name for park -STR_1717 :Can't rename park... +STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Harjaa jalkakäytävät +STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Kastele puutarhat +STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Tyhjennä roskakorit +STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Leikkaa ruohoa +STR_1716 :Virheellinen nimi puistolle +STR_1717 :Puiston nimeäminen ei onnistunut... STR_1718 :Puiston nimi -STR_1719 :Enter name for park: -STR_1720 :{SMALLFONT}{BLACK}Name park +STR_1719 :Anna nimi puistolle: +STR_1720 :{SMALLFONT}{BLACK}Nimeä puisto STR_1721 :Puisto suljettu STR_1722 :Puisto auki -STR_1723 :Can't open park... -STR_1724 :Can't close park... -STR_1725 :Can't buy land... -STR_1726 :Land not for sale! -STR_1727 :Construction rights not for sale! -STR_1728 :Can't buy construction rights here... -STR_1729 :Land not owned by park! +STR_1723 :Puiston avaus ei onnistunut... +STR_1724 :Puiston sulkeminen ei onnistunut... +STR_1725 :Maan ostaminen ei onnistunut... +STR_1726 :Maa ei ole myytävänä! +STR_1727 :Rakennusoikeudet eivät ole myytävänä! +STR_1728 :Rakennusoikeuksia ei voi ostaa tähän... +STR_1729 :Maa ei ole puiston omistuksessa! STR_1730 :{RED}Suljettu - - STR_1731 :{WHITE}{STRINGID} - - STR_1732 :Build STR_1733 :Mode STR_1734 :{WINDOW_COLOUR_2}Kierroston määrä: -STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit +STR_1735 :{SMALLFONT}{BLACK}Kierrosten määrä radalla STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1737 :{COMMA16} -STR_1738 :Can't change number of laps... -STR_1739 :Race won by guest {INT32} -STR_1740 :Race won by {STRINGID} -STR_1741 :Not yet constructed ! +STR_1738 :Kierrosten määrää ei voitu muuttaa... +STR_1739 :Kisan voitti vieras {INT32} +STR_1740 :Kisan voitti {STRINGID} +STR_1741 :Ei ole vielä rakennettu ! STR_1742 :{WINDOW_COLOUR_2}Max. people on ride: STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this ride at one time STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1745 :{COMMA16} -STR_1746 :Can't change this... -STR_1747 :{WINDOW_COLOUR_2}Time limit: -STR_1748 :{SMALLFONT}{BLACK}Time limit for ride +STR_1746 :Tätä ei voitu muuttaa... +STR_1747 :{WINDOW_COLOUR_2}Aikarajoitus: +STR_1748 :{SMALLFONT}{BLACK}Aikarajoitus ajelulle STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} STR_1750 :{DURATION} -STR_1751 :Can't change time limit for ride... -STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park -STR_1753 :{SMALLFONT}{BLACK}Show summarised list of guests in park +STR_1751 :Aikarajoitusta ajelulle ei voitu muuttaa... +STR_1752 :{SMALLFONT}{BLACK}Näytä puiston yksittäiset vieraat +STR_1753 :{SMALLFONT}{BLACK}Näytä puiston vieraat yhteenvetona STR_1754 :{BLACK}{COMMA16} vieraat STR_1755 :{BLACK}{COMMA16} vieras -STR_1756 :{WINDOW_COLOUR_2}Admission price: -STR_1757 :{WINDOW_COLOUR_2}Reliability: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1756 :{WINDOW_COLOUR_2}Sisäänpääsymaksu: +STR_1757 :{WINDOW_COLOUR_2}Luotettavuus: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1758 :{SMALLFONT}{BLACK}Build mode STR_1759 :{SMALLFONT}{BLACK}Move mode STR_1760 :{SMALLFONT}{BLACK}Fill-in mode -STR_1761 :{SMALLFONT}{BLACK}Build maze in this direction +STR_1761 :{SMALLFONT}{BLACK}Rakenna labyrinttia tähän suuntaan STR_1762 :Vesiputoukset -STR_1763 :Rapids +STR_1763 :Kosket STR_1764 :Log Bumps STR_1765 :On-ride photo section STR_1766 :Reverser turntable -STR_1767 :Spinning tunnel -STR_1768 :Can't change number of swings... -STR_1769 :{WINDOW_COLOUR_2}Number of swings: -STR_1770 :{SMALLFONT}{BLACK}Number of complete swings +STR_1767 :Pyörivä tunneli +STR_1768 :Heilahdusten määrää ei voitu muuttaa... +STR_1769 :{WINDOW_COLOUR_2}Heilahdusten määrä: +STR_1770 :{SMALLFONT}{BLACK}Kokonaisten heilahdusten määrä STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1772 :{COMMA16} STR_1773 :Only one on-ride photo section allowed per ride STR_1774 :Only one cable lift hill allowed per ride -STR_1775 :Off -STR_1776 :On +STR_1775 :Pois päältä +STR_1776 :Päällä STR_1777 :{WINDOW_COLOUR_2}Musiikki STR_1778 :{STRINGID} - - STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Pandapuku @@ -1792,12 +1792,12 @@ STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronauttipuku STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Rosvopuku STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Seriffipuku STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Merirosvopuku -STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff -STR_1791 :{WINDOW_COLOUR_2}Uniform colour: +STR_1790 :{SMALLFONT}{BLACK}Valitse virka-asun väri tämän tyyppisille henkilökunnille +STR_1791 :{WINDOW_COLOUR_2}Virka-asun väri: STR_1792 :Responding to {STRINGID} breakdown call STR_1793 :Heading to {STRINGID} for an inspection STR_1794 :Korjataan {STRINGID} -STR_1795 :Answering radio call +STR_1795 :Vastataan radiopuheluun STR_1796 :Has broken down and requires fixing STR_1797 :This option cannot be changed for this ride STR_1798 :Whirlpool @@ -1807,24 +1807,24 @@ STR_1801 :Restraints stuck closed STR_1802 :Restraints stuck open STR_1803 :Doors stuck closed STR_1804 :Doors stuck open -STR_1805 :Vehicle malfunction -STR_1806 :Brakes failure -STR_1807 :Control failure +STR_1805 :Ajoneuvotoimintahäiriö +STR_1806 :Jarruvirhe +STR_1807 :Ohjausvirhe STR_1808 :{WINDOW_COLOUR_2}Last breakdown: {BLACK}{STRINGID} STR_1809 :{WINDOW_COLOUR_2}Current breakdown: {OUTLINE}{RED}{STRINGID} STR_1810 :{WINDOW_COLOUR_2}Carrying: -STR_1811 :Can't build this here... +STR_1811 :Tätä ei voi rakentaa tähän... STR_1812 :{SMALLFONT}{BLACK}{STRINGID} STR_1813 :Miscellaneous Objects -STR_1814 :Actions -STR_1815 :Thoughts -STR_1816 :{SMALLFONT}{BLACK}Select information type to show in guest list +STR_1814 :Toiminnat +STR_1815 :Ajatukset +STR_1816 :{SMALLFONT}{BLACK}Valitse näytettävä tietotyyppi vieras listalle STR_1817 :({COMMA16}) -STR_1818 :{WINDOW_COLOUR_2}All guests -STR_1819 :{WINDOW_COLOUR_2}All guests (summarised) -STR_1820 :{WINDOW_COLOUR_2}Guests {STRINGID} -STR_1821 :{WINDOW_COLOUR_2}Guests thinking {STRINGID} -STR_1822 :{WINDOW_COLOUR_2}Guests thinking about {POP16}{STRINGID} +STR_1818 :{WINDOW_COLOUR_2}Kaikki vieraat +STR_1819 :{WINDOW_COLOUR_2}Kaikki vieraat (yhteenvetona) +STR_1820 :{WINDOW_COLOUR_2}Vieraat {STRINGID} +STR_1821 :{WINDOW_COLOUR_2}Vieraat ajattelevat {STRINGID} +STR_1822 :{WINDOW_COLOUR_2}Vieraat ajattelevat {POP16}{STRINGID} STR_1823 :{SMALLFONT}{BLACK}Show guests' thoughts about this ride/attraction STR_1824 :{SMALLFONT}{BLACK}Show guests on this ride/attraction STR_1825 :{SMALLFONT}{BLACK}Show guests queuing for this ride/attraction @@ -1832,35 +1832,35 @@ STR_1826 :Tilanne STR_1827 :Suosio STR_1828 :Tyytyväisyys STR_1829 :Tuotto -STR_1830 :Queue length -STR_1831 :Queue time -STR_1832 :Reliability -STR_1833 :Down-time +STR_1830 :Jonon pituus +STR_1831 :Jonotusaika +STR_1832 :Luotettavuus +STR_1833 :Keskeytysaika STR_1834 :Vieraiden suosikki -STR_1835 :Popularity: Unknown -STR_1836 :Popularity: {COMMA16}% -STR_1837 :Satisfaction: Unknown -STR_1838 :Satisfaction: {COMMA16}% -STR_1839 :Reliability: {COMMA16}% -STR_1840 :Down-time: {COMMA16}% -STR_1841 :Profit: {CURRENCY2DP} per hour +STR_1835 :Suosio: Tuntematon +STR_1836 :Suosio: {COMMA16}% +STR_1837 :Tyytyväisyys: Tuntematon +STR_1838 :Tyytyväisyys: {COMMA16}% +STR_1839 :Luotettavuus: {COMMA16}% +STR_1840 :Keskeytysaika: {COMMA16}% +STR_1841 :Tuotto: {CURRENCY2DP} per tunti STR_1842 :Favourite of: {COMMA16} guest STR_1843 :Favourite of: {COMMA16} guests STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list STR_1845 :{MONTHYEAR} STR_1846 :{COMMA16} vierasta -STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} guests -STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} guests -STR_1849 :{WINDOW_COLOUR_2}Play music -STR_1850 :{SMALLFONT}{BLACK}Select whether music should be played for this ride -STR_1851 :{WINDOW_COLOUR_2}Running cost: {BLACK}{CURRENCY2DP} per hour -STR_1852 :{WINDOW_COLOUR_2}Running cost: {BLACK}Unknown -STR_1853 :{WINDOW_COLOUR_2}Built: {BLACK}This Year -STR_1854 :{WINDOW_COLOUR_2}Built: {BLACK}Last Year -STR_1855 :{WINDOW_COLOUR_2}Built: {BLACK}{COMMA16} Years Ago -STR_1856 :{WINDOW_COLOUR_2}Profit per item sold: {BLACK}{CURRENCY2DP} -STR_1857 :{WINDOW_COLOUR_2}Loss per item sold: {BLACK}{CURRENCY2DP} -STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY2DP} per month +STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} vierasta +STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} vierasta +STR_1849 :{WINDOW_COLOUR_2}Toista musiikkia +STR_1850 :{SMALLFONT}{BLACK}Valitse mitä musiikkia toistetaan tälle ajelulle +STR_1851 :{WINDOW_COLOUR_2}Käyttökustannus: {BLACK}{CURRENCY2DP} per tunti +STR_1852 :{WINDOW_COLOUR_2}Käyttökustannus: {BLACK}Tuntematon +STR_1853 :{WINDOW_COLOUR_2}Rakennettu: {BLACK}Tämä vuosi +STR_1854 :{WINDOW_COLOUR_2}Rakennettu: {BLACK}Viime vuonna +STR_1855 :{WINDOW_COLOUR_2}Rakennettu: {BLACK}{COMMA16} vuotta sitten +STR_1856 :{WINDOW_COLOUR_2}Tuottoa per myyty esine: {BLACK}{CURRENCY2DP} +STR_1857 :{WINDOW_COLOUR_2}Tappiota per myyty esine: {BLACK}{CURRENCY2DP} +STR_1858 :{WINDOW_COLOUR_2}Kustannus: {BLACK}{CURRENCY2DP} per kuukausi STR_1859 :Yleismies STR_1860 :Mekaanikko STR_1861 :Vartija @@ -1875,121 +1875,121 @@ STR_1869 :{WINDOW_COLOUR_2}Number of rotations: STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1872 :{COMMA16} -STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY2DP} per hour -STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour +STR_1873 :{WINDOW_COLOUR_2}Tulo: {BLACK}{CURRENCY2DP} per tunti +STR_1874 :{WINDOW_COLOUR_2}Tuotto: {BLACK}{CURRENCY2DP} per tunti STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} -STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides -STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides -STR_1878 :{WINDOW_COLOUR_2}Inspection: -STR_1879 :Every 10 minutes -STR_1880 :Every 20 minutes -STR_1881 :Every 30 minutes -STR_1882 :Every 45 minutes -STR_1883 :Every hour -STR_1884 :Every 2 hours -STR_1885 :Never -STR_1886 :Inspecting {STRINGID} -STR_1887 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}{COMMA16} minutes -STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hours -STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% -STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride +STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Tarkista ajelut +STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Korjaa ajelut +STR_1878 :{WINDOW_COLOUR_2}Tarkistus: +STR_1879 :10 min välein +STR_1880 :20 min välein +STR_1881 :30 min välein +STR_1882 :45 min välein +STR_1883 :Tunnin välein +STR_1884 :2 tunnin välein +STR_1885 :Ei koskaan +STR_1886 :Tarkistetaan {STRINGID} +STR_1887 :{WINDOW_COLOUR_2}Viimeinen tarkastus: {BLACK}{COMMA16} minuuttia sitten +STR_1888 :{WINDOW_COLOUR_2}Viimeinen tarkistus: {BLACK}yli 4 tuntia sitten +STR_1889 :{WINDOW_COLOUR_2}Keskeytysaika: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1890 :{SMALLFONT}{BLACK}Valitse kuinka usein mekaanikko tarkistaa tämän ajelun STR_1891 :No {STRINGID} in park yet! # The following two strings were used to display an error when the disc was missing. # This has been replaced in OpenRCT2. STR_1892 : STR_1893 : -STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} +STR_1894 :{WINDOW_COLOUR_2}{STRINGID} myyty: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}Build new ride/attraction STR_1896 :{WINDOW_COLOUR_2}Expenditure/Income STR_1897 :{WINDOW_COLOUR_2}Ride construction -STR_1898 :{WINDOW_COLOUR_2}Ride running costs -STR_1899 :{WINDOW_COLOUR_2}Land purchase -STR_1900 :{WINDOW_COLOUR_2}Landscaping -STR_1901 :{WINDOW_COLOUR_2}Park entrance tickets -STR_1902 :{WINDOW_COLOUR_2}Ride tickets -STR_1903 :{WINDOW_COLOUR_2}Shop sales +STR_1898 :{WINDOW_COLOUR_2}Ajelun käyttökulut +STR_1899 :{WINDOW_COLOUR_2}Maahankinnat +STR_1900 :{WINDOW_COLOUR_2}Maisemointi +STR_1901 :{WINDOW_COLOUR_2}Puiston sisäänpääsyliput +STR_1902 :{WINDOW_COLOUR_2}Ajeluliput +STR_1903 :{WINDOW_COLOUR_2}Kojujen myynnit STR_1904 :{WINDOW_COLOUR_2}Shop stock -STR_1905 :{WINDOW_COLOUR_2}Food/drink sales +STR_1905 :{WINDOW_COLOUR_2}Ruoka-/juomamyynnit STR_1906 :{WINDOW_COLOUR_2}Food/drink stock -STR_1907 :{WINDOW_COLOUR_2}Staff wages +STR_1907 :{WINDOW_COLOUR_2}Henkilökunnan palkat STR_1908 :{WINDOW_COLOUR_2}Marketing -STR_1909 :{WINDOW_COLOUR_2}Research -STR_1910 :{WINDOW_COLOUR_2}Loan interest +STR_1909 :{WINDOW_COLOUR_2}Tutkimustyö +STR_1910 :{WINDOW_COLOUR_2}Lainan korko STR_1911 :{BLACK} at {COMMA16}% per year STR_1912 :{MONTH} STR_1913 :{BLACK}+{CURRENCY2DP} STR_1914 :{BLACK}{CURRENCY2DP} STR_1915 :{RED}{CURRENCY2DP} -STR_1916 :{WINDOW_COLOUR_2}Loan: +STR_1916 :{WINDOW_COLOUR_2}Laina: STR_1917 :{POP16}{POP16}{POP16}{CURRENCY} -STR_1918 :Can't borrow any more money! -STR_1919 :Not enough cash available! -STR_1920 :Can't pay back loan! -STR_1921 :{SMALLFONT}{BLACK}Start a new game -STR_1922 :{SMALLFONT}{BLACK}Continue playing a saved game +STR_1918 :Ei voi enempää lainata rahaa! +STR_1919 :Rahaa ei ole tarpeeksi! +STR_1920 :Lainan takaisin maksaminen ei onnistunut! +STR_1921 :{SMALLFONT}{BLACK}Aloita uusi peli +STR_1922 :{SMALLFONT}{BLACK}Jatka tallennetun pelin pelaamista STR_1923 :{SMALLFONT}{BLACK}Show tutorial -STR_1924 :{SMALLFONT}{BLACK}Exit -STR_1925 :Can't place person here... +STR_1924 :{SMALLFONT}{BLACK}Lopeta +STR_1925 :Henkilöä ei voi sijoittaa tähän... STR_1926 :{SMALLFONT} -STR_1927 :{YELLOW}{STRINGID} has broken down -STR_1928 :{RED}{STRINGID} has crashed! +STR_1927 :{YELLOW}{STRINGID} on hajonnut +STR_1928 :{RED}{STRINGID} on hajonnut! STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this guest - (If tracking is on, guest's movements will be reported in the message area) STR_1931 :{STRINGID} has joined the queue line for {STRINGID} STR_1932 :{STRINGID} is on {STRINGID} STR_1933 :{STRINGID} is in {STRINGID} STR_1934 :{STRINGID} has left {STRINGID} -STR_1935 :{STRINGID} has left the park +STR_1935 :{STRINGID} on lähtenyt puistosta STR_1936 :{STRINGID} has bought {STRINGID} STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message -STR_1938 :{SMALLFONT}{BLACK}Show view of guest -STR_1939 :{SMALLFONT}{BLACK}Show view of staff member +STR_1938 :{SMALLFONT}{BLACK}Näytä vierasnäkymä +STR_1939 :{SMALLFONT}{BLACK}Näytä henkilöstönäkymä STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this guest STR_1941 :{SMALLFONT}{BLACK}Show which rides this guest has been on STR_1942 :{SMALLFONT}{BLACK}Show financial information about this guest -STR_1943 :{SMALLFONT}{BLACK}Show guest's recent thoughts +STR_1943 :{SMALLFONT}{BLACK}Näytä vieraan viimeiset ajatukset STR_1944 :{SMALLFONT}{BLACK}Show items guest is carrying STR_1945 :{SMALLFONT}{BLACK}Show orders and options for this staff member STR_1946 :{SMALLFONT}{BLACK}Select costume for this entertainer STR_1947 :{SMALLFONT}{BLACK}Show areas patrolled by selected staff type, and locate the nearest staff member STR_1948 :{SMALLFONT}{BLACK}Hire a new staff member of the selected type -STR_1949 :Financial Summary +STR_1949 :Taloudellinen yhteenveto STR_1950 :Financial Graph STR_1951 :Park Value Graph STR_1952 :Profit Graph -STR_1953 :Marketing -STR_1954 :Research Funding +STR_1953 :Markkinointi +STR_1954 :Tutkimustyön rahoitus STR_1955 :{WINDOW_COLOUR_2}Number of circuits: STR_1956 :{SMALLFONT}{BLACK}Number of circuits of track per ride STR_1957 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1958 :{COMMA16} STR_1959 :Can't change number of circuits... -STR_1960 :{WINDOW_COLOUR_2}Balloon price: -STR_1961 :{WINDOW_COLOUR_2}Cuddly Toy price: -STR_1962 :{WINDOW_COLOUR_2}Park Map price: +STR_1960 :{WINDOW_COLOUR_2}Ilmapallon hinta: +STR_1961 :{WINDOW_COLOUR_2}Pehmolelun hinta: +STR_1962 :{WINDOW_COLOUR_2}Puiston kartan hinta: STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: -STR_1964 :{WINDOW_COLOUR_2}Umbrella price: -STR_1965 :{WINDOW_COLOUR_2}Drink price: -STR_1966 :{WINDOW_COLOUR_2}Burger price: -STR_1967 :{WINDOW_COLOUR_2}Chips price: -STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: -STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: +STR_1964 :{WINDOW_COLOUR_2}Sateenvarjon hinta: +STR_1965 :{WINDOW_COLOUR_2}Juoman hinta: +STR_1966 :{WINDOW_COLOUR_2}Hampurilaisen hinta: +STR_1967 :{WINDOW_COLOUR_2}Sipsien hinta: +STR_1968 :{WINDOW_COLOUR_2}Jäätelön hinta: +STR_1969 :{WINDOW_COLOUR_2}Hattaran hinta: STR_1970 :{WINDOW_COLOUR_2} STR_1971 :{WINDOW_COLOUR_2} STR_1972 :{WINDOW_COLOUR_2} -STR_1973 :{WINDOW_COLOUR_2}Pizza price: +STR_1973 :{WINDOW_COLOUR_2}Pizzan hinta: STR_1974 :{WINDOW_COLOUR_2} -STR_1975 :{WINDOW_COLOUR_2}Popcorn price: -STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: -STR_1977 :{WINDOW_COLOUR_2}Tentacle price: -STR_1978 :{WINDOW_COLOUR_2}Hat price: -STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: -STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: -STR_1981 :{WINDOW_COLOUR_2}Doughnut price: -STR_1982 :{WINDOW_COLOUR_2}Coffee price: +STR_1975 :{WINDOW_COLOUR_2}Popcornin hinta: +STR_1976 :{WINDOW_COLOUR_2}Hot Dogin hinta: +STR_1977 :{WINDOW_COLOUR_2}Lonkeron hinta: +STR_1978 :{WINDOW_COLOUR_2}Hatun hinta: +STR_1979 :{WINDOW_COLOUR_2}Toffeeomenan hinta: +STR_1980 :{WINDOW_COLOUR_2}T-paidan hinta: +STR_1981 :{WINDOW_COLOUR_2}Donitsin hinta: +STR_1982 :{WINDOW_COLOUR_2}Kahvin hinta: STR_1983 :{WINDOW_COLOUR_2} -STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: -STR_1985 :{WINDOW_COLOUR_2}Lemonade price: +STR_1984 :{WINDOW_COLOUR_2}Paistetun kanan hinta: +STR_1985 :{WINDOW_COLOUR_2}Limonaadin hinta: STR_1986 :{WINDOW_COLOUR_2} STR_1987 :{WINDOW_COLOUR_2} STR_1988 :Ilmapallo @@ -2031,7 +2031,7 @@ STR_2023 :Sipsejä STR_2024 :Jäätelöä STR_2025 :Hattara STR_2026 :Tyhjiä tölkkejä -STR_2027 :Rubbish +STR_2027 :Roska STR_2028 :Tyhjiä hampurilaisrasioita STR_2029 :Pizzoja STR_2030 :Etuseteleitä @@ -2214,22 +2214,22 @@ STR_2206 :Tyhjä juomatölkki STR_2207 :Tyhjä mehukuppi STR_2208 :Paahdettu makkara STR_2209 :Tyhjä kulho -STR_2210 :{SMALLFONT}{BLACK}Show list of handymen in park -STR_2211 :{SMALLFONT}{BLACK}Show list of mechanics in park -STR_2212 :{SMALLFONT}{BLACK}Show list of security guards in park -STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park -STR_2214 :Construction not possible while game is paused! +STR_2210 :{SMALLFONT}{BLACK}Näytä puiston yleismiehet +STR_2211 :{SMALLFONT}{BLACK}Näytä puiston mekaanikot +STR_2212 :{SMALLFONT}{BLACK}Näytä puiston vartijat +STR_2213 :{SMALLFONT}{BLACK}Näytä puiston viihdyttäjät +STR_2214 :Rakentaminen ei ole mahdollista pelin ollessa pysäytettynä! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} -STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} -STR_2221 :{SMALLFONT}{BLACK}Park Rating: {COMMA16} +STR_2220 :{WINDOW_COLOUR_2}Puiston luokitus: {BLACK}{COMMA16} +STR_2221 :{SMALLFONT}{BLACK}Puiston luokitus: {COMMA16} STR_2222 :{SMALLFONT}{BLACK}{STRINGID} STR_2223 :{WINDOW_COLOUR_2}Vieraiden määrä: {BLACK}{COMMA16} -STR_2224 :{WINDOW_COLOUR_2}Cash: {BLACK}{CURRENCY2DP} -STR_2225 :{WINDOW_COLOUR_2}Cash: {RED}{CURRENCY2DP} +STR_2224 :{WINDOW_COLOUR_2}Kassa: {BLACK}{CURRENCY2DP} +STR_2225 :{WINDOW_COLOUR_2}Kassa: {RED}{CURRENCY2DP} STR_2226 :{WINDOW_COLOUR_2}Puiston arvo: {BLACK}{CURRENCY} STR_2227 :{WINDOW_COLOUR_2}Yrityksen arvo: {BLACK}{CURRENCY} STR_2228 :{WINDOW_COLOUR_2}Last month's profit from food/drink and{NEWLINE}merchandise sales: {BLACK}{CURRENCY} @@ -2237,8 +2237,8 @@ STR_2229 :Slope up to vertical STR_2230 :Vertical track STR_2231 :Holding brake for drop STR_2232 :Cable lift hill -STR_2233 :{SMALLFONT}{BLACK}Park information -STR_2234 :Recent Messages +STR_2233 :{SMALLFONT}{BLACK}Puiston tiedot +STR_2234 :Viimeiset viestit STR_2235 :{SMALLFONT}{STRINGID} {STRINGID} STR_2236 :Tammikuu STR_2237 :Helmikuu @@ -2261,21 +2261,21 @@ STR_2253 :Transport Rides STR_2254 :Gentle Rides STR_2255 :Roller Coasters STR_2256 :Thrill Rides -STR_2257 :Water Rides +STR_2257 :Vesiajelut STR_2258 :Shops & Stalls STR_2259 :Scenery & Themeing -STR_2260 :No funding +STR_2260 :Ei rahoitusta STR_2261 :Minimum funding STR_2262 :Normal funding STR_2263 :Maximum funding -STR_2264 :Research funding +STR_2264 :Tutkimustyön rahoitus STR_2265 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} per month STR_2266 :Research priorities -STR_2267 :Currently in development +STR_2267 :Paraikaa suunnitteilla STR_2268 :Last development -STR_2269 :{WINDOW_COLOUR_2}Type: {BLACK}{STRINGID} -STR_2270 :{WINDOW_COLOUR_2}Progress: {BLACK}{STRINGID} -STR_2271 :{WINDOW_COLOUR_2}Expected: {BLACK}{STRINGID} +STR_2269 :{WINDOW_COLOUR_2}Tyyppi: {BLACK}{STRINGID} +STR_2270 :{WINDOW_COLOUR_2}Edistys: {BLACK}{STRINGID} +STR_2271 :{WINDOW_COLOUR_2}Odotettavista: {BLACK}{STRINGID} STR_2272 :{WINDOW_COLOUR_2}Ride/attraction:{NEWLINE}{BLACK}{STRINGID} STR_2273 :{WINDOW_COLOUR_2}Scenery/themeing:{NEWLINE}{BLACK}{STRINGID} STR_2274 :{SMALLFONT}{BLACK}Show details of this invention or development @@ -2286,11 +2286,11 @@ STR_2278 :Transport Ride STR_2279 :Gentle Ride STR_2280 :Roller Coaster STR_2281 :Thrill Ride -STR_2282 :Water Ride +STR_2282 :Vesiajelu STR_2283 :Shop/Stall STR_2284 :Scenery/Themeing STR_2285 :Initial research -STR_2286 :Designing +STR_2286 :Suunnitellaan STR_2287 :Completing design STR_2288 :Tuntematon STR_2289 :{STRINGID} {STRINGID} @@ -2318,7 +2318,7 @@ STR_2310 :Build custom design STR_2311 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} (approx.) STR_2312 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} (approx.) STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) -STR_2314 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID} +STR_2314 :{WINDOW_COLOUR_2}Ahelun pituus: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks STR_2317 : @@ -2329,11 +2329,11 @@ STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} STR_2322 :{WINDOW_COLOUR_2}Henkilökunta: {BLACK}{COMMA16} STR_2323 :{WINDOW_COLOUR_2}Puiston koko: {BLACK}{COMMA32}m{SQUARED} STR_2324 :{WINDOW_COLOUR_2}Puiston koko: {BLACK}{COMMA32}sq.ft. -STR_2325 :{SMALLFONT}{BLACK}Buy land to extend park +STR_2325 :{SMALLFONT}{BLACK}Osta maata laajentaakseen puistoa STR_2326 :{SMALLFONT}{BLACK}Buy construction rights to allow construction above or below land outside the park -STR_2327 :Options +STR_2327 :Asetukset STR_2328 :{WINDOW_COLOUR_2}Valuutta: -STR_2329 :{WINDOW_COLOUR_2}Distance and Speed: +STR_2329 :{WINDOW_COLOUR_2}Etäisyys ja nopeus: STR_2330 :{WINDOW_COLOUR_2}Lämpötila: STR_2331 :{WINDOW_COLOUR_2}Height Labels: STR_2332 :Yksikköä @@ -2348,23 +2348,23 @@ STR_2340 :Liiraa (L) STR_2341 :Guilders (fl.) STR_2342 :Krona (kr) STR_2343 :Euroa ({EURO}) -STR_2344 :Imperial -STR_2345 :Metric -STR_2346 :Display -STR_2347 :{RED}{STRINGID} has drowned! +STR_2344 :Brittiläinen +STR_2345 :Metrinen +STR_2346 :Näytä +STR_2347 :{RED}{STRINGID} on hukkunut! STR_2348 :{SMALLFONT}{BLACK}Show statistics for this staff member -STR_2349 :{WINDOW_COLOUR_2}Wages: {BLACK}{CURRENCY} per month -STR_2350 :{WINDOW_COLOUR_2}Employed: {BLACK}{MONTHYEAR} -STR_2351 :{WINDOW_COLOUR_2}Lawns mown: {BLACK}{COMMA16} -STR_2352 :{WINDOW_COLOUR_2}Gardens watered: {BLACK}{COMMA16} -STR_2353 :{WINDOW_COLOUR_2}Litter swept: {BLACK}{COMMA16} -STR_2354 :{WINDOW_COLOUR_2}Bins emptied: {BLACK}{COMMA16} -STR_2355 :{WINDOW_COLOUR_2}Rides fixed: {BLACK}{COMMA16} -STR_2356 :{WINDOW_COLOUR_2}Rides inspected: {BLACK}{COMMA16} +STR_2349 :{WINDOW_COLOUR_2}Palkat: {BLACK}{CURRENCY} per kuukausi +STR_2350 :{WINDOW_COLOUR_2}Työllistetty: {BLACK}{MONTHYEAR} +STR_2351 :{WINDOW_COLOUR_2}Nurmikkoa ajettu: {BLACK}{COMMA16} +STR_2352 :{WINDOW_COLOUR_2}Puutarhaa kasteltu: {BLACK}{COMMA16} +STR_2353 :{WINDOW_COLOUR_2}Törkyä harjattu: {BLACK}{COMMA16} +STR_2354 :{WINDOW_COLOUR_2}Roskakoria tyhjennetty: {BLACK}{COMMA16} +STR_2355 :{WINDOW_COLOUR_2}Ajelua korjattu: {BLACK}{COMMA16} +STR_2356 :{WINDOW_COLOUR_2}Ajelua tarkistettu: {BLACK}{COMMA16} STR_2357 :Talo STR_2358 :Yksiköt STR_2359 :Oikeat arvot -STR_2360 :{WINDOW_COLOUR_2}Display Resolution: +STR_2360 :{WINDOW_COLOUR_2}Näytön tarkkuus STR_2361 :Landscape Smoothing STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off STR_2363 :Gridlines on Landscape @@ -2372,9 +2372,9 @@ STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off STR_2365 :The bank refuses to increase your loan! STR_2366 :Celsius ({DEGREE}C) STR_2367 :Fahrenheit (F) -STR_2368 :None +STR_2368 :Ei mitään STR_2369 :Matala -STR_2370 :Average +STR_2370 :Tyydyttävä STR_2371 :Korkea STR_2372 :Matala STR_2373 :Medium @@ -2388,12 +2388,12 @@ STR_2380 :{SMALLFONT}{BLACK}Adjust smaller area of water STR_2381 :{SMALLFONT}{BLACK}Adjust larger area of water STR_2382 :Maa STR_2383 :Vesi -STR_2384 :{WINDOW_COLOUR_2}Your objective: +STR_2384 :{WINDOW_COLOUR_2}Tavoitteesi: STR_2385 :{BLACK}Ei mitään STR_2386 :{BLACK}To have at least {COMMA16} guests in your park at the end of {MONTHYEAR}, with a park rating of at least 600 STR_2387 :{BLACK}To achieve a park value of at least {POP16}{POP16}{CURRENCY} at the end of {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} STR_2388 :{BLACK}Pidä hauskaa! -STR_2389 :{BLACK}Build the best {STRINGID} you can! +STR_2389 :{BLACK}Rakenna paras {STRINGID} kuin voit! STR_2390 :{BLACK}To have 10 different types of roller coasters operating in your park, each with an excitement value of at least 6.00 STR_2391 :{BLACK}To have at least {COMMA16} guests in your park. You must not let the park rating drop below 700 at any time! STR_2392 :{BLACK}To achieve a monthly income from ride tickets of at least {POP16}{POP16}{CURRENCY} @@ -2405,9 +2405,9 @@ STR_2397 :Ei mitään STR_2398 :Number of guests at a given date STR_2399 :Park value at a given date STR_2400 :Pidä hauskaa -STR_2401 :Build the best ride you can -STR_2402 :Build 10 roller coasters -STR_2403 :Number of guests in park +STR_2401 :Rakenna parhaat ajelut joita voit +STR_2402 :Rakenna 10 vuoristorataa +STR_2403 :Vieraiden määrä puistossa STR_2404 :Monthly income from ride tickets STR_2405 :Build 10 roller coasters of a given length STR_2406 :Finish building 5 roller coasters @@ -2478,7 +2478,7 @@ STR_2470 :{SMALLFONT}{BLACK}Research new transport rides STR_2471 :{SMALLFONT}{BLACK}Research new gentle rides STR_2472 :{SMALLFONT}{BLACK}Research new roller coasters STR_2473 :{SMALLFONT}{BLACK}Research new thrill rides -STR_2474 :{SMALLFONT}{BLACK}Research new water rides +STR_2474 :{SMALLFONT}{BLACK}Tutki uusia vesiajeluja STR_2475 :{SMALLFONT}{BLACK}Research new shops and stalls STR_2476 :{SMALLFONT}{BLACK}Research new scenery and themeing STR_2477 :{SMALLFONT}{BLACK}Select operating mode for this ride/attraction @@ -2818,49 +2818,49 @@ STR_2807 :{RED}Guests are complaining about the amount of litter in your park STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organising them better STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks -STR_2811 :{RED}Guests are complaining because they can't find the toilets in your park +STR_2811 :{RED}Vieraat valittavat etteivät löydä wc:tä puistostasi STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests -STR_2814 :{WINDOW_COLOUR_2}Most untidy park award -STR_2815 :{WINDOW_COLOUR_2}Tidiest park award +STR_2814 :{WINDOW_COLOUR_2}Sotkuisin puisto -palkinto +STR_2815 :{WINDOW_COLOUR_2}Siistein puisto -palkinto STR_2816 :{WINDOW_COLOUR_2}Award for the park with the best roller coasters STR_2817 :{WINDOW_COLOUR_2}Best value park award -STR_2818 :{WINDOW_COLOUR_2}Most beautiful park award +STR_2818 :{WINDOW_COLOUR_2}Kaunein puisto -palkinto STR_2819 :{WINDOW_COLOUR_2}Worst value park award -STR_2820 :{WINDOW_COLOUR_2}Safest park award -STR_2821 :{WINDOW_COLOUR_2}Best staff award -STR_2822 :{WINDOW_COLOUR_2}Best park food award -STR_2823 :{WINDOW_COLOUR_2}Worst park food award -STR_2824 :{WINDOW_COLOUR_2}Best park toilets award +STR_2820 :{WINDOW_COLOUR_2}Turvallisin puisto -palkinto +STR_2821 :{WINDOW_COLOUR_2}Paras henkilöstö -palkinto +STR_2822 :{WINDOW_COLOUR_2}Parhaat puistoruuat -palkinto +STR_2823 :{WINDOW_COLOUR_2}Huonoimmat puistoruuat -palkinto +STR_2824 :{WINDOW_COLOUR_2}Parhaat puistowc:t -palkinto STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award -STR_2826 :{WINDOW_COLOUR_2}Best water rides award +STR_2826 :{WINDOW_COLOUR_2}Parhaat vesiajelut -palkinto STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride colour schemes award STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award STR_2830 :{WINDOW_COLOUR_2}Best gentle ride award -STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'! -STR_2832 :{TOPAZ}Your park has received an award for being 'The tidiest park in the country'! -STR_2833 :{TOPAZ}Your park has received an award for being 'The park with the best roller coasters'! +STR_2831 :{TOPAZ}Puistosi sai 'Sotkuisin puisto maassa' -palkinnon! +STR_2832 :{TOPAZ}Puistosi sai 'Siistein puisto maassa' -palkinnon! +STR_2833 :{TOPAZ}Puistosi sai 'Puisto parhaimmilla vuoristoradoilla' -palkinnon! STR_2834 :{TOPAZ}Your park has received an award for being 'The best value park in the country'! -STR_2835 :{TOPAZ}Your park has received an award for being 'The most beautiful park in the country'! +STR_2835 :{TOPAZ}Puistosi sai 'Kaunein puisto maassa' -palkinnon! STR_2836 :{TOPAZ}Your park has received an award for being 'The worst value park in the country'! -STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park in the country'! -STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! -STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! -STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! -STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best toilet facilities in the country'! +STR_2837 :{TOPAZ}Puistosi sai 'Turvallisin puisto maassa' -palkinnon! +STR_2838 :{TOPAZ}Puistosi sai 'Puisto parhaimmalla henkilöstöllä' -palkinnon! +STR_2839 :{TOPAZ}Puistosi sai 'Puisto parhaimmalla ruualla maassa' -palkinnon! +STR_2840 :{TOPAZ}Puisto sai 'Puisto huonoimmalla ruualla maassa' -palkinnon! +STR_2841 :{TOPAZ}Puistosi sai 'Puisto parhaimmilla wc-tiloilla maassa' -palkinnon! STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water rides in the country'! STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed rides'! STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of colour schemes'! STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle rides'! -STR_2848 :{WINDOW_COLOUR_2}No recent awards +STR_2848 :{WINDOW_COLOUR_2}Ei tuoreita palkintoja STR_2849 :New scenario installed successfully STR_2850 :New track design installed successfully STR_2851 :Scenario already installed STR_2852 :Track design already installed -STR_2853 :Forbidden by the local authority! +STR_2853 :Kiellettyä paikallisten viranomaisten mukaan! STR_2854 :{RED}Guests can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the ride exit STR_2856 :{WINDOW_COLOUR_2}Tutorial @@ -2874,47 +2874,47 @@ STR_2863 :Music acknowledgements STR_2864 :{WINDOW_COLOUR_2}March - Children of the Regiment: (Fucik) non copyright STR_2865 :{WINDOW_COLOUR_2}Heyken's Serenade: (J.Heyken) British Standard Music Coy; GEMA, BRITICO STR_2866 :{WINDOW_COLOUR_2}In Continental Mood: (Composer unknown) Copyright Control -STR_2867 :{WINDOW_COLOUR_2}Wedding Journey: (Traditional) +STR_2867 :{WINDOW_COLOUR_2}Wedding Journey: (Perinteinen) STR_2868 :{WINDOW_COLOUR_2}Tales from the Vienna Woods: (Johann Strauss) non copyright -STR_2869 :{WINDOW_COLOUR_2}Slavonic Dance: (Traditional) -STR_2870 :{WINDOW_COLOUR_2}Das Alpenhorn: (Traditional) -STR_2871 :{WINDOW_COLOUR_2}The Blond Sailor: (Traditional) +STR_2869 :{WINDOW_COLOUR_2}Slavonic Dance: (Perinteinen) +STR_2870 :{WINDOW_COLOUR_2}Das Alpenhorn: (Perinteinen) +STR_2871 :{WINDOW_COLOUR_2}The Blond Sailor: (Perinteinen) STR_2872 :{WINDOW_COLOUR_2}Overture - Poet and Peasant: (Suppe) non copyright STR_2873 :{WINDOW_COLOUR_2}Waltz Medley: (Johann Strauss) non copyright -STR_2874 :{WINDOW_COLOUR_2}Bella Bella Bimba: (Traditional) +STR_2874 :{WINDOW_COLOUR_2}Bella Bella Bimba: (Perinteinen) STR_2875 :{WINDOW_COLOUR_2}Original recordings (P) 1976 C.J.Mears Organization, used with consent STR_2876 :{WINDOW_COLOUR_2}RollerCoaster Tycoon 2 Title Music: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2877 :{WINDOW_COLOUR_2}Dodgems Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2878 :{WINDOW_COLOUR_2}Mid Summer's Heat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2879 :{WINDOW_COLOUR_2}Pharaoh's Tomb: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2880 :{WINDOW_COLOUR_2}Caesar's March: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2881 :{WINDOW_COLOUR_2}Drifting To Heaven: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2882 :{WINDOW_COLOUR_2}Invaders: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2883 :{WINDOW_COLOUR_2}Eternal Toybox: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2884 :{WINDOW_COLOUR_2}Jungle Juice: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2885 :{WINDOW_COLOUR_2}Ninja's Noodles: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2886 :{WINDOW_COLOUR_2}Voyage to Andromeda: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2887 :{WINDOW_COLOUR_2}Brimble's Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2888 :{WINDOW_COLOUR_2}Atlantis: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2889 :{WINDOW_COLOUR_2}Wild West Kid: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2890 :{WINDOW_COLOUR_2}Vampire's Lair: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2891 :{WINDOW_COLOUR_2}Blockbuster: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2892 :{WINDOW_COLOUR_2}Airtime Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2893 :{WINDOW_COLOUR_2}Searchlight Rag: (Scott Joplin/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2894 :{WINDOW_COLOUR_2}Flight of Fantasy: (Steve Blenkinsopp) copyright {COPYRIGHT} Chris Sawyer -STR_2895 :{WINDOW_COLOUR_2}Big Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2896 :{WINDOW_COLOUR_2}Hypothermia: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2897 :{WINDOW_COLOUR_2}Last Sleigh Ride: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2898 :{WINDOW_COLOUR_2}Pipes of Glencairn: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2899 :{WINDOW_COLOUR_2}Traffic Jam: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2877 :{WINDOW_COLOUR_2}Dodgems Beat: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2878 :{WINDOW_COLOUR_2}Mid Summer's Heat: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2879 :{WINDOW_COLOUR_2}Pharaoh's Tomb: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2880 :{WINDOW_COLOUR_2}Caesar's March: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2881 :{WINDOW_COLOUR_2}Drifting To Heaven: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2882 :{WINDOW_COLOUR_2}Invaders: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2883 :{WINDOW_COLOUR_2}Eternal Toybox: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2884 :{WINDOW_COLOUR_2}Jungle Juice: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2885 :{WINDOW_COLOUR_2}Ninja's Noodles: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2886 :{WINDOW_COLOUR_2}Voyage to Andromeda: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2887 :{WINDOW_COLOUR_2}Brimble's Beat: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2888 :{WINDOW_COLOUR_2}Atlantis: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2889 :{WINDOW_COLOUR_2}Wild West Kid: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2890 :{WINDOW_COLOUR_2}Vampire's Lair: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2891 :{WINDOW_COLOUR_2}Blockbuster: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2892 :{WINDOW_COLOUR_2}Airtime Rock: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2893 :{WINDOW_COLOUR_2}Searchlight Rag: (Scott Joplin/Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2894 :{WINDOW_COLOUR_2}Flight of Fantasy: (Steve Blenkinsopp) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2895 :{WINDOW_COLOUR_2}Big Rock: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2896 :{WINDOW_COLOUR_2}Hypothermia: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2897 :{WINDOW_COLOUR_2}Last Sleigh Ride: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2898 :{WINDOW_COLOUR_2}Pipes of Glencairn: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2899 :{WINDOW_COLOUR_2}Traffic Jam: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer STR_2900 :{WINDOW_COLOUR_2} STR_2901 :{WINDOW_COLOUR_2}(Samples courtesy of Spectrasonics {ENDQUOTES}Liquid Grooves{ENDQUOTES}) STR_2902 :{WINDOW_COLOUR_2}Toccata: (C.M.Widor, played by Peter James Adcock) recording {COPYRIGHT} Chris Sawyer -STR_2903 :{WINDOW_COLOUR_2}Space Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2904 :{WINDOW_COLOUR_2}Manic Mechanic: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2905 :{WINDOW_COLOUR_2}Techno Torture: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2906 :{WINDOW_COLOUR_2}Sweat Dreams: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer -STR_2907 :{WINDOW_COLOUR_2}What shall we do with the Drunken Sailor: (Anon/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2903 :{WINDOW_COLOUR_2}Space Rock: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2904 :{WINDOW_COLOUR_2}Manic Mechanic: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2905 :{WINDOW_COLOUR_2}Techno Torture: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2906 :{WINDOW_COLOUR_2}Sweat Dreams: (Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer +STR_2907 :{WINDOW_COLOUR_2}What shall we do with the Drunken Sailor: (Anon/Allister Brimble) tekijänoikeus {COPYRIGHT} Chris Sawyer STR_2908 :{WINDOW_COLOUR_2}Infogrames Interactive STR_2909 :{WINDOW_COLOUR_2}Senior Producer: Thomas J. Zahorik STR_2910 :{WINDOW_COLOUR_2}Executive Producer: Bill Levay @@ -2924,19 +2924,19 @@ STR_2913 :{WINDOW_COLOUR_2}General Manager: John Hurlbut STR_2914 :{WINDOW_COLOUR_2}Director of Quality Assurance: Michael Craighead STR_2915 :{WINDOW_COLOUR_2}Q.A. Certification Manager: Kurt Boutin STR_2916 :{WINDOW_COLOUR_2}Q.A. Certification Lead: Mark Huggins -STR_2917 :{WINDOW_COLOUR_2}Testers: Dena Irene Fitzgerald, Scott Rollins, Christopher McPhail +STR_2917 :{WINDOW_COLOUR_2}Testaajat: Dena Irene Fitzgerald, Scott Rollins, Christopher McPhail STR_2918 :{WINDOW_COLOUR_2}Clif McClure, Erik Maramaldi, Erik Jeffery STR_2919 :{WINDOW_COLOUR_2}Director of Marketing: Ann Marie Bland STR_2920 :{WINDOW_COLOUR_2}Manager of Creative Services: Steve Martin STR_2921 :{WINDOW_COLOUR_2}Manager of Editorial & Documentation Services: Elizabeth Mackney STR_2922 :{WINDOW_COLOUR_2}Graphic Designer: Paul Anselmi STR_2923 :{WINDOW_COLOUR_2}Copywriter: Kurt Carlson -STR_2924 :{WINDOW_COLOUR_2}Special Thanks to: Peter Matiss +STR_2924 :{WINDOW_COLOUR_2}Erikoiskiitokset: Peter Matiss STR_2925 :{WINDOW_COLOUR_2}Engineering Specialist: Ken Edwards STR_2926 :{WINDOW_COLOUR_2}Engineering Services Manager: Luis Rivas STR_2927 :{WINDOW_COLOUR_2}Lead Compatibility Analyst: Geoffrey Smith STR_2928 :{WINDOW_COLOUR_2}Compatibility Analysts: Jason Cordero, Burke McQuinn, Kim Jardin -STR_2929 :{WINDOW_COLOUR_2}Lead Tester: Daniel Frisoli +STR_2929 :{WINDOW_COLOUR_2}Päätestaaja: Daniel Frisoli STR_2930 :{WINDOW_COLOUR_2}Senior Tester: Matt Pantaleoni STR_2931 :{WINDOW_COLOUR_2} STR_2932 :{WINDOW_COLOUR_2} @@ -2984,11 +2984,11 @@ STR_2973 :Alternative colour scheme 2 STR_2974 :Alternative colour scheme 3 STR_2975 :{SMALLFONT}{BLACK}Select which colour scheme to change, or paint ride with STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected colour scheme -STR_2977 :Staff member name -STR_2978 :Enter new name for this member of staff: -STR_2979 :Can't name staff member... +STR_2977 :Henkilöstön jäsenen nimi +STR_2978 :Anna tälle henkilöstön jäsenelle nimi: +STR_2979 :Henkilöstön nimeäminen ei onnistu... STR_2980 :Too many banners in game -STR_2981 :{RED}No entry - - +STR_2981 :{RED}Ei sisäänkäyntiä - - STR_2982 :Banner text STR_2983 :Enter new text for this banner: STR_2984 :Can't set new text for banner... @@ -2999,10 +2999,10 @@ STR_2988 :{SMALLFONT}{BLACK}Demolish this banner STR_2989 :{SMALLFONT}{BLACK}Select main colour STR_2990 :{SMALLFONT}{BLACK}Select text colour STR_2991 :Kyltti -STR_2992 :Sign text -STR_2993 :Enter new text for this sign: -STR_2994 :{SMALLFONT}{BLACK}Change text on sign -STR_2995 :{SMALLFONT}{BLACK}Demolish this sign +STR_2992 :Tekstikyltti +STR_2993 :Anna teksti tälle kyltille: +STR_2994 :{SMALLFONT}{BLACK}Muuta teksti kyltille +STR_2995 :{SMALLFONT}{BLACK}Romuta tämä kyltti STR_2996 :{BLACK}ABC STR_2997 :{GREY}ABC STR_2998 :{WHITE}ABC @@ -3017,65 +3017,65 @@ STR_3006 :{PALEGOLD}ABC STR_3007 :{LIGHTPINK}ABC STR_3008 :{PEARLAQUA}ABC STR_3009 :{PALESILVER}ABC -STR_3010 :Unable to load file... +STR_3010 :Tiedoston lataus ei onnistunut... STR_3011 :File contains invalid data STR_3012 :Dodgems beat style STR_3013 :Fairground organ style STR_3014 :Roman fanfare style STR_3015 :Oriental style -STR_3016 :Martian style -STR_3017 :Jungle drums style -STR_3018 :Egyptian style +STR_3016 :Marssilainen tyyli +STR_3017 :Viidakkorummut-tyyli +STR_3018 :Egyptiläinen tyyli STR_3019 :Toyland style STR_3020 : -STR_3021 :Space style -STR_3022 :Horror style -STR_3023 :Techno style +STR_3021 :Avaruustyyli +STR_3022 :Kauhutyyli +STR_3023 :Teknotyyli STR_3024 :Gentle style -STR_3025 :Summer style -STR_3026 :Water style -STR_3027 :Wild west style +STR_3025 :Kesätyyli +STR_3026 :Vesityyli +STR_3027 :Villilänsityyli STR_3028 :Jurassic style -STR_3029 :Rock style +STR_3029 :Kivityyli STR_3030 :Ragtime style STR_3031 :Fantasy style -STR_3032 :Rock style 2 -STR_3033 :Ice style -STR_3034 :Snow style +STR_3032 :Kivityyli 2 +STR_3033 :Jäätyyli +STR_3034 :Lumityyli STR_3035 :Custom music 1 STR_3036 :Custom music 2 -STR_3037 :Medieval style +STR_3037 :Keskiaikainen tyyli STR_3038 :Urban style STR_3039 :Organ style -STR_3040 :Mechanical style +STR_3040 :Mekaaninen tyyli STR_3041 :Modern style -STR_3042 :Pirates style -STR_3043 :Rock style 3 -STR_3044 :Candy style +STR_3042 :Merirosvotyyli +STR_3043 :Kivityyli 3 +STR_3044 :Karkkityyli STR_3045 :{SMALLFONT}{BLACK}Select style of music to play STR_3046 :This ride cannot be modified STR_3047 :Local authority forbids demolition or modifications to this ride STR_3048 :Marketing campaigns forbidden by local authority -STR_3049 :Golf hole A -STR_3050 :Golf hole B -STR_3051 :Golf hole C -STR_3052 :Golf hole D -STR_3053 :Golf hole E -STR_3054 :Loading... -STR_3055 :White -STR_3056 :Translucent +STR_3049 :Golf reikä A +STR_3050 :Golf reikä B +STR_3051 :Golf reikä C +STR_3052 :Golf reikä D +STR_3053 :Golf reikä E +STR_3054 :Ladataan... +STR_3055 :Valkoinen +STR_3056 :Läpikuultava STR_3057 :{WINDOW_COLOUR_2}Construction Marker: -STR_3058 :Brick walls -STR_3059 :Hedges -STR_3060 :Ice blocks -STR_3061 :Wooden fences +STR_3058 :Tiiliseinät +STR_3059 :Pensasaidat +STR_3060 :Jääpalat +STR_3061 :Puiset aidat STR_3062 :{SMALLFONT}{BLACK}Standard roller coaster track STR_3063 :{SMALLFONT}{BLACK}Water channel (track submerged) STR_3064 :Beginner Parks STR_3065 :Challenging Parks STR_3066 :Expert Parks -STR_3067 :{OPENQUOTES}Real{ENDQUOTES} Parks -STR_3068 :Other Parks +STR_3067 :{OPENQUOTES}Oikeat{ENDQUOTES} puistot +STR_3068 :Muut puistot STR_3069 :Top Section STR_3070 :Slope to Level STR_3071 :{WINDOW_COLOUR_2}Same price throughout park @@ -3085,30 +3085,30 @@ STR_3074 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You hav STR_3075 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have only 2 weeks to raise the park rating, or your park will be closed down STR_3076 :{RED}FINAL WARNING: Your park rating is still below 700 !{NEWLINE}In just 7 days your park will be closed down unless you can raise the rating STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! -STR_3078 :Plain entrance -STR_3079 :Wooden entrance +STR_3078 :Tavallinen sisäänkäynti +STR_3079 :Puinen sisäänkäynti STR_3080 :Canvas tent entrance -STR_3081 :Castle entrance (grey) -STR_3082 :Castle entrance (brown) -STR_3083 :Jungle entrance +STR_3081 :Linnan sisäänkäynti (harmaa) +STR_3082 :Linnan sisäänkäynti (ruskea) +STR_3083 :Viidakkosisäänkäynti STR_3084 :Log cabin entrance -STR_3085 :Classical/Roman entrance +STR_3085 :Klassinen/Roomalainen sisäänkäynti STR_3086 :Abstract entrance -STR_3087 :Snow/Ice entrance +STR_3087 :Lumi-/Jääsisäänkäynti STR_3088 :Pagoda entrance -STR_3089 :Space entrance +STR_3089 :Avaruussisäänkäynti STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station -STR_3091 :You are not allowed to remove this section! +STR_3091 :Ei ole sallittua poistaa tätä aluetta! STR_3092 :You are not allowed to move or modify the station for this ride! -STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} -STR_3094 :N/A +STR_3093 :{WINDOW_COLOUR_2}Suosikki: {BLACK}{STRINGID} +STR_3094 :Ei saatavilla STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed STR_3098 :Can't change lift hill speed... -STR_3099 :{SMALLFONT}{BLACK}Select colour -STR_3100 :{SMALLFONT}{BLACK}Select second colour -STR_3101 :{SMALLFONT}{BLACK}Select third colour +STR_3099 :{SMALLFONT}{BLACK}Valitse väri +STR_3100 :{SMALLFONT}{BLACK}Valitse toinen väri +STR_3101 :{SMALLFONT}{BLACK}Valitse kolmas väri STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape STR_3103 :Can't re-paint this... STR_3104 :{SMALLFONT}{BLACK}List rides @@ -3124,14 +3124,14 @@ STR_3113 :Select a different design STR_3114 :{SMALLFONT}{BLACK}Go back to design selection window STR_3115 :{SMALLFONT}{BLACK}Save track design STR_3116 :{SMALLFONT}{BLACK}Save track design (Not possible until ride has been tested and statistics have been generated) -STR_3117 :{BLACK}Calling mechanic... -STR_3118 :{BLACK}{STRINGID} is heading for the ride -STR_3119 :{BLACK}{STRINGID} is fixing the ride +STR_3117 :{BLACK}Kutsutaan mekaanikkoa... +STR_3118 :{BLACK}{STRINGID} menossa kohti ajelua +STR_3119 :{BLACK}{STRINGID} korjaamassa ajelua STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy STR_3122 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guest STR_3123 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guests -STR_3124 :Broken {STRINGID} +STR_3124 :Hajonnut {STRINGID} STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% STR_3127 :{WINDOW_COLOUR_2}Nausea Factor: {BLACK}+{COMMA16}% @@ -3150,23 +3150,23 @@ STR_3139 :Cable lift unable to work in this operating mode STR_3140 :Cable lift hill must start immediately after station STR_3141 :Multi-circuit per ride not possible with cable lift hill STR_3142 :{WINDOW_COLOUR_2}Capacity: {BLACK}{STRINGID} -STR_3143 :{SMALLFONT}{BLACK}Show people on map +STR_3143 :{SMALLFONT}{BLACK}Näytä ihmiset kartalla STR_3144 :{SMALLFONT}{BLACK}Show rides and stalls on map -STR_3145 :{SMALLFONT}{BLACK}Scroll {STRINGID} left -STR_3146 :{SMALLFONT}{BLACK}Scroll {STRINGID} right -STR_3147 :{SMALLFONT}{BLACK}Scroll {STRINGID} left fast -STR_3148 :{SMALLFONT}{BLACK}Scroll {STRINGID} right fast -STR_3149 :{SMALLFONT}{BLACK}Scroll {STRINGID} left/right -STR_3150 :{SMALLFONT}{BLACK}Scroll {STRINGID} up -STR_3151 :{SMALLFONT}{BLACK}Scroll {STRINGID} down -STR_3152 :{SMALLFONT}{BLACK}Scroll {STRINGID} up fast -STR_3153 :{SMALLFONT}{BLACK}Scroll {STRINGID} down fast -STR_3154 :{SMALLFONT}{BLACK}Scroll {STRINGID} up/down +STR_3145 :{SMALLFONT}{BLACK}Vieritä {STRINGID} vasemmalle +STR_3146 :{SMALLFONT}{BLACK}Vieritä {STRINGID} oikealle +STR_3147 :{SMALLFONT}{BLACK}Vieritä {STRINGID} vasemmalle nopeasti +STR_3148 :{SMALLFONT}{BLACK}Vieritä {STRINGID} oikealle nopeasti +STR_3149 :{SMALLFONT}{BLACK}Vieritä {STRINGID} vasemmalle/oikealle +STR_3150 :{SMALLFONT}{BLACK}Vieritä {STRINGID} ylös +STR_3151 :{SMALLFONT}{BLACK}Vieritä {STRINGID} alas +STR_3152 :{SMALLFONT}{BLACK}Vieritä {STRINGID} ylös nopeasti +STR_3153 :{SMALLFONT}{BLACK}Vieritä {STRINGID} alas nopeasti +STR_3154 :{SMALLFONT}{BLACK}Vieritä {STRINGID} ylös/alas STR_3155 : STR_3156 : STR_3157 :kartta STR_3158 :graph -STR_3159 :list +STR_3159 :lista STR_3160 : STR_3161 : STR_3162 :Unable to allocate enough memory @@ -3175,7 +3175,7 @@ STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) STR_3165 : STR_3166 :{BLACK}(ID: STR_3167 :{WINDOW_COLOUR_2}Includes: {BLACK}{COMMA16} objects -STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} +STR_3168 :{WINDOW_COLOUR_2}Teksti: {BLACK}{STRINGID} STR_3169 :Data for the following object not found: STR_3170 :Not enough space for graphics STR_3171 :Too many objects of this type selected @@ -3189,21 +3189,21 @@ STR_3178 :At least one path object must be selected STR_3179 :At least one ride vehicle/attraction object must be selected STR_3180 :Invalid selection of objects STR_3181 :Object Selection - {STRINGID} -STR_3182 :Park entrance type must be selected -STR_3183 :Water type must be selected +STR_3182 :Puiston sisäänkäynnintyyli on valittava +STR_3183 :Veden tyyppi on valittava STR_3184 :Ride Vehicles/Attractions STR_3185 :Small Scenery STR_3186 :Large Scenery STR_3187 :Walls/Fences STR_3188 :Path Signs -STR_3189 :Footpaths +STR_3189 :Jalkakäytävät STR_3190 :Path Extras STR_3191 :Scenery Groups -STR_3192 :Park Entrance +STR_3192 :Puiston sisäänkäynti STR_3193 :Vesi STR_3194 :Scenario Description -STR_3195 :Invention List -STR_3196 :{WINDOW_COLOUR_2}Research Group: {BLACK}{STRINGID} +STR_3195 :Keksintölista +STR_3196 :{WINDOW_COLOUR_2}RTutkimusryhmä: {BLACK}{STRINGID} STR_3197 :{WINDOW_COLOUR_2}Items pre-invented at start of game: STR_3198 :{WINDOW_COLOUR_2}Items to invent during game: STR_3199 :Random Shuffle @@ -3224,34 +3224,34 @@ STR_3213 :Can't decrease map size any further STR_3214 :Can't increase map size any further STR_3215 :Too close to edge of map STR_3216 :{SMALLFONT}{BLACK}Select park-owned land etc. -STR_3217 :Land Owned -STR_3218 :Construction Rights Owned -STR_3219 :Land For Sale -STR_3220 :Construction Rights For Sale +STR_3217 :Maan omistaa +STR_3218 :Rakennusoikeudet omistaa +STR_3219 :Maata myytävänä +STR_3220 :Rakennusoikeudet myytävänä STR_3221 :{SMALLFONT}{BLACK}Set land to be owned by the park STR_3222 :{SMALLFONT}{BLACK}Set construction rights only to be owned by the park STR_3223 :{SMALLFONT}{BLACK}Set land to be available to purchase by the park STR_3224 :{SMALLFONT}{BLACK}Set construction rights to be available to purchase by the park STR_3225 :{SMALLFONT}{BLACK}Toggle on/off building a random cluster of objects around the selected position -STR_3226 :{SMALLFONT}{BLACK}Build park entrance -STR_3227 :Too many park entrances! +STR_3226 :{SMALLFONT}{BLACK}Rakenna puistolle sisäänkäynti +STR_3227 :Liikaa sisäänkäyntejä puistolla! STR_3228 :{SMALLFONT}{BLACK}Set starting positions for people STR_3229 :Block Brakes cannot be used directly after station STR_3230 :Block Brakes cannot be used directly after each other STR_3231 :Block Brakes cannot be used directly after the top of this lift hill -STR_3232 :Options - Financial -STR_3233 :Options - Guests -STR_3234 :Options - Park +STR_3232 :Asetukset - Talous +STR_3233 :Asetukset - Vieraat +STR_3234 :Asetukset - Puisto STR_3235 :{SMALLFONT}{BLACK}Show financial options STR_3236 :{SMALLFONT}{BLACK}Show guest options STR_3237 :{SMALLFONT}{BLACK}Show park options STR_3238 :No Money STR_3239 :{SMALLFONT}{BLACK}Make this park a 'no money' park with no financial restrictions -STR_3240 :{WINDOW_COLOUR_2}Initial cash: -STR_3241 :{WINDOW_COLOUR_2}Initial loan: +STR_3240 :{WINDOW_COLOUR_2}Aloitusrahamäärä: +STR_3241 :{WINDOW_COLOUR_2}Aloituslaina: STR_3242 :{WINDOW_COLOUR_2}Maximum loan size: STR_3243 :{WINDOW_COLOUR_2}Annual interest rate: -STR_3244 :Forbid marketing campaigns +STR_3244 :Kiellä markkinointikampanjat STR_3245 :{SMALLFONT}{BLACK}Forbid advertising, promotional schemes, and other marketing campaigns STR_3246 :{WINDOW_COLOUR_2}{CURRENCY} STR_3247 :{WINDOW_COLOUR_2}{COMMA16}% @@ -3294,26 +3294,26 @@ STR_3283 :{SMALLFONT}{BLACK}Select rides to be preserved STR_3284 :Objective Selection STR_3285 :Preserved Rides STR_3286 :{SMALLFONT}{BLACK}Select objective for this scenario -STR_3287 :{WINDOW_COLOUR_2}Objective: -STR_3288 :{SMALLFONT}{BLACK}Select climate -STR_3289 :{WINDOW_COLOUR_2}Climate: +STR_3287 :{WINDOW_COLOUR_2}Tavoite: +STR_3288 :{SMALLFONT}{BLACK}Valitse ilmasto +STR_3289 :{WINDOW_COLOUR_2}Ilmasto: STR_3290 :Kylmä ja märkä STR_3291 :Lämmin STR_3292 :Kuuma ja kuiva STR_3293 :Kylmä STR_3294 :Muuta... -STR_3295 :{SMALLFONT}{BLACK}Change name of park +STR_3295 :{SMALLFONT}{BLACK}Vaihda puiston nimi STR_3296 :{SMALLFONT}{BLACK}Change name of scenario STR_3297 :{SMALLFONT}{BLACK}Change detail notes about park / scenario -STR_3298 :{WINDOW_COLOUR_2}Park Name: {BLACK}{STRINGID} +STR_3298 :{WINDOW_COLOUR_2}Puiston nimi: {BLACK}{STRINGID} STR_3299 :{WINDOW_COLOUR_2}Park/Scenario Details: STR_3300 :{WINDOW_COLOUR_2}Scenario Name: {BLACK}{STRINGID} -STR_3301 :{WINDOW_COLOUR_2}Objective Date: +STR_3301 :{WINDOW_COLOUR_2}Tavoitepäivä: STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR} -STR_3303 :{WINDOW_COLOUR_2}Number of guests: -STR_3304 :{WINDOW_COLOUR_2}Park value: -STR_3305 :{WINDOW_COLOUR_2}Monthly income: -STR_3306 :{WINDOW_COLOUR_2}Monthly profit: +STR_3303 :{WINDOW_COLOUR_2}Vieraiden määrä: +STR_3304 :{WINDOW_COLOUR_2}Puiston arvo: +STR_3305 :{WINDOW_COLOUR_2}Kuukausittainen tulo: +STR_3306 :{WINDOW_COLOUR_2}Kuukausittainen tuotto: STR_3307 :{WINDOW_COLOUR_2}Minimum length: STR_3308 :{WINDOW_COLOUR_2}Excitement rating: STR_3309 :{WINDOW_COLOUR_2}{COMMA16} @@ -3331,13 +3331,13 @@ STR_3320 :Unable to save scenario file... STR_3321 :New objects installed successfully STR_3322 :{WINDOW_COLOUR_2}Objective: {BLACK}{STRINGID} STR_3323 :Missing object data, ID: -STR_3324 :Requires Add-On Pack: -STR_3325 :Requires an Add-On Pack +STR_3324 :Tarvitsee lisäosapaketin: +STR_3325 :Tarvitsee lisäosapaketin STR_3326 :{WINDOW_COLOUR_2}(no image) STR_3327 :Starting positions for people not set STR_3328 :Can't advance to next editor stage... -STR_3329 :Park entrance not yet built -STR_3330 :Park must own some land +STR_3329 :Puiston sisäänkäyntiä ei ole vielä rakennettu +STR_3330 :Puiston pitää omistaa edes jonkin verran maata STR_3331 :Path from park entrance to map edge either not complete or too complex - Path must be single-width with as few junctions and corners as possible STR_3332 :Park entrance is the wrong way round or has no path leading to the map edge STR_3333 :Export plug-in objects with saved games @@ -3348,21 +3348,21 @@ STR_3337 : STR_3338 :{BLACK}Custom-designed layout STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout -STR_3341 :{SMALLFONT}{BLACK}Game tools +STR_3341 :{SMALLFONT}{BLACK}Pelityökalut STR_3342 :Scenario Editor STR_3343 :Convert Saved Game to Scenario STR_3344 :Roller Coaster Designer STR_3345 :Track Designs Manager STR_3346 :Can't save track design... STR_3347 :Ride is too large, contains too many elements, or scenery is too spread out -STR_3348 :Rename +STR_3348 :Uudelleennimeä STR_3349 :Poista STR_3350 :Track design name STR_3351 :Enter new name for this track design: STR_3352 :Can't rename track design... STR_3353 :New name contains invalid characters STR_3354 :Another file exists with this name, or file is write-protected -STR_3355 :File is write-protected or locked +STR_3355 :Tiedosto on kirjoitussuojattu tai lukittu STR_3356 :Poista tiedosto STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ? STR_3358 :Can't delete track design... @@ -3373,14 +3373,14 @@ STR_3362 : STR_3363 : STR_3364 :Advanced STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups -STR_3366 :{BLACK}= Ride -STR_3367 :{BLACK}= Food Stall -STR_3368 :{BLACK}= Drink Stall -STR_3369 :{BLACK}= Souvenir Stall +STR_3366 :{BLACK}= Ajelu +STR_3367 :{BLACK}= Ruokakoju +STR_3368 :{BLACK}= Juomakoju +STR_3369 :{BLACK}= Matkamuistokoju STR_3370 :{BLACK}= Info. Kiosk -STR_3371 :{BLACK}= First Aid -STR_3372 :{BLACK}= Cash Machine -STR_3373 :{BLACK}= Toilet +STR_3371 :{BLACK}= Ensiapu +STR_3372 :{BLACK}= Kassakone +STR_3373 :{BLACK}= WC STR_3374 :Warning: Too many objects selected! STR_3375 :Not all objects in this scenery group could be selected STR_3376 :Install new track design... @@ -3389,7 +3389,7 @@ STR_3378 :Asenna STR_3379 :Peruuta STR_3380 :Unable to install this track design... STR_3381 :File is not compatible or contains invalid data -STR_3382 :File copy failed +STR_3382 :Tiedoston kopio epäonnistui STR_3383 :Select new name for track design STR_3384 :An existing track design already has this name - Please select a new name for this design: STR_3385 :Beginners Tutorial @@ -3397,7 +3397,7 @@ STR_3386 :Custom Rides Tutorial STR_3387 :Roller Coaster Building Tutorial STR_3388 :Unable to switch to selected mode STR_3389 :Unable to select additional item of scenery... -STR_3390 :Too many items selected +STR_3390 :Liian monta esinettä valittuna STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... @@ -3410,7 +3410,7 @@ STR_3399 :{SMALLFONT}{BLACK}We need to build footpaths to allow guests to rea STR_3400 :{SMALLFONT}{BLACK}For the path to the ride entrance we'll use a special 'queue line' path... STR_3401 :{SMALLFONT}{BLACK}For the exit path, just an 'ordinary' path will do... STR_3402 :{SMALLFONT}{BLACK}Right, lets open the ride! To open the ride we click the flag icon on the ride window and select 'open'... -STR_3403 :{SMALLFONT}{BLACK}But where are the guests? +STR_3403 :{SMALLFONT}{BLACK}Mutta missä ovat vieraat? STR_3404 :{SMALLFONT}{BLACK}Oh - The park is still closed! Right - Let's open it... STR_3405 :{SMALLFONT}{BLACK}While we're waiting for our first guests, let's build some scenery... STR_3406 :{SMALLFONT}{BLACK}Here's our empty park. We're going to build a simple custom-designed ride... @@ -3428,8 +3428,8 @@ STR_3417 :{SMALLFONT}{BLACK}OK - Let's open the park and the ride... STR_3418 :{SMALLFONT}{BLACK}Our new ride isn't very exciting - Perhaps we should add some scenery? STR_3419 :{SMALLFONT}{BLACK}To build scenery above other scenery or in mid-air, hold down the SHIFT key and move the mouse to select the height... STR_3420 :{SMALLFONT}{BLACK}Some types of scenery can be re-painted after it's built... -STR_3421 :{SMALLFONT}{BLACK}Let's add some music to the ride... -STR_3422 :{SMALLFONT}{BLACK}Let's build a roller coaster ! +STR_3421 :{SMALLFONT}{BLACK}Lisätään jotain musiikkia ajeluun... +STR_3422 :{SMALLFONT}{BLACK}Rakennetaan vuoristorata! STR_3423 :{SMALLFONT}{BLACK}There are loads of pre-designed coasters, but we're going to build our own custom design... STR_3424 :{SMALLFONT}{BLACK}That's the station platform built. Now we need a lift hill... STR_3425 :{SMALLFONT}{BLACK}Roller coaster trains aren't powered, so a 'chain lift' is needed to pull the train up the first hill... @@ -3456,23 +3456,23 @@ STR_3445 :Set Patrol Area STR_3446 :Cancel Patrol Area # New strings, cleaner -STR_5120 :Finances -STR_5121 :Research +STR_5120 :Talous +STR_5121 :Tutkimustyö STR_5122 :Select rides by track type (like in RCT1) -STR_5123 :Renew rides +STR_5123 :Uusi ajelut STR_5124 : STR_5125 :All destructable STR_5126 :Random title music STR_5127 :{SMALLFONT}{BLACK}Disable land elevation -STR_5128 :Selection size +STR_5128 :Valinnan koko STR_5129 :Enter selection size between {COMMA16} and {COMMA16} -STR_5130 :Map size +STR_5130 :Kartan koko STR_5131 :Enter map size between {COMMA16} and {COMMA16} -STR_5132 :Fix all rides +STR_5132 :Korjaa kaikki ajelut STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights -STR_5136 :Land rights +STR_5136 :Maaoikeudet STR_5137 :Allow lift hill and launch speeds{NEWLINE}up to {VELOCITY} STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} STR_5139 :{WHITE}{STRINGID} @@ -3514,40 +3514,40 @@ STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news f STR_5175 :Input the name of your Twitch channel STR_5176 :Enable Twitch integration STR_5177 :Fullscreen mode: -STR_5178 :{SMALLFONT}{BLACK}Show financial cheats -STR_5179 :{SMALLFONT}{BLACK}Show guest cheats -STR_5180 :{SMALLFONT}{BLACK}Show park cheats -STR_5181 :{SMALLFONT}{BLACK}Show ride cheats +STR_5178 :{SMALLFONT}{BLACK}Näytä taloushuijaukset +STR_5179 :{SMALLFONT}{BLACK}Näytä vierashuijaukset +STR_5180 :{SMALLFONT}{BLACK}Näytä puistohuijaukset +STR_5181 :{SMALLFONT}{BLACK}Näytä ajeluhuijaukset STR_5182 :{INT32} STR_5183 :Base height STR_5184 :Enter base height between {COMMA16} and {COMMA16} STR_5185 :Veden taso STR_5186 :Enter water level between {COMMA16} and {COMMA16} -STR_5187 :Finances -STR_5188 :New Campaign -STR_5189 :Research +STR_5187 :Talous +STR_5188 :Uusi kampanja +STR_5189 :Tutkimustyö STR_5190 :Kartta STR_5191 :Viewport -STR_5192 :Recent News +STR_5192 :Viimeiset uutiset STR_5193 :Maa STR_5194 :Vesi STR_5195 :Clear Scenery -STR_5196 :Land Rights +STR_5196 :Maaoikeudet STR_5197 :Scenery STR_5198 :Jalkakäytävä STR_5199 :Ride Construction STR_5200 :Track Design Place -STR_5201 :New Ride +STR_5201 :Uusi ajelu STR_5202 :Track Design Selection -STR_5203 :Ride -STR_5204 :Ride List +STR_5203 :Ajelu +STR_5204 :Ajelulista STR_5205 :Vieras STR_5206 :Vieraslista -STR_5207 :Henkilöstö -STR_5208 :Henkilöstölista +STR_5207 :Henkilökunta +STR_5208 :Henkilökuntalista STR_5209 :Banner STR_5210 :Object Selection -STR_5211 :Invention List +STR_5211 :Keksintölista STR_5212 :Scenario Options STR_5213 :Objective Options STR_5214 :Map Generation @@ -3555,11 +3555,11 @@ STR_5215 :Track Design Manager STR_5216 :Track Design Manager List STR_5217 :Huijaukset STR_5218 :Teemat -STR_5219 :Options +STR_5219 :Asetukset STR_5220 :Näppäimistön pikanäppäimet STR_5221 :Muuta näppäimistön pikanäppäimiä STR_5222 :Lataa/Tallenna -STR_5223 :Save Prompt +STR_5223 :Tallennuskehote STR_5224 :Demolish Ride Prompt STR_5225 :Fire Staff Prompt STR_5226 :Track Delete Prompt @@ -3570,41 +3570,41 @@ STR_5230 :{SMALLFONT}{BLACK}Työkalut STR_5231 :{SMALLFONT}{BLACK}Rides and Peeps STR_5232 :{SMALLFONT}{BLACK}Editors STR_5233 :{SMALLFONT}{BLACK}Miscellaneous -STR_5234 :{SMALLFONT}{BLACK}Prompts +STR_5234 :{SMALLFONT}{BLACK}Kehotteet STR_5235 :{SMALLFONT}{BLACK}Asetukset STR_5236 :Ikkuna: STR_5237 :Palette: -STR_5238 :Current Theme: +STR_5238 :Nykyinen teema: STR_5239 :Duplicate -STR_5240 :Enter a name for the theme -STR_5241 :Can't change this theme -STR_5242 :Theme name already exists -STR_5243 :Invalid characters used +STR_5240 :Anna nimi teemalle +STR_5241 :Nimen muuttaminen ei onnistunut +STR_5242 :Teeman nimi on jo olemassa +STR_5243 :Virheellisiä merkkejä käytetty STR_5244 :Teemat -STR_5245 :Top Toolbar -STR_5246 :Bottom Toolbar +STR_5245 :Ylhäällä työkalupalkki +STR_5246 :Alhaalla työkalupalkki STR_5247 :Track Editor Bottom Toolbar STR_5248 :Scenario Editor Bottom Toolbar STR_5249 :Title Menu Buttons STR_5250 :Title Exit Button STR_5251 :Title Options Button STR_5252 :Title Scenario Selection -STR_5253 :Park Information +STR_5253 :Puiston tiedot STR_5254 :Luo STR_5255 :{SMALLFONT}{BLACK}Create a new title sequence from scratch STR_5256 :Create a new theme to make changes to STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one -STR_5258 :{SMALLFONT}{BLACK}Delete the current theme -STR_5259 :{SMALLFONT}{BLACK}Rename the current theme -STR_5260 :Giant Screenshot +STR_5258 :{SMALLFONT}{BLACK}Poista nykyinen teema +STR_5259 :{SMALLFONT}{BLACK}Uudelleennimeä nykyinen teema +STR_5260 :Jättimäinen ruudunkaappaus STR_5261 :Suodatin STR_5262 :Wacky Worlds STR_5263 :Time Twister STR_5264 :Custom STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible -STR_5266 :{SMALLFONT}{BLACK}Display -STR_5267 :{SMALLFONT}{BLACK}Culture and Units -STR_5268 :{SMALLFONT}{BLACK}Audio +STR_5266 :{SMALLFONT}{BLACK}Näyttö +STR_5267 :{SMALLFONT}{BLACK}Kulttuuri ja yksiköt +STR_5268 :{SMALLFONT}{BLACK}Ääni STR_5269 :{SMALLFONT}{BLACK}Controls and interface STR_5270 :{SMALLFONT}{BLACK}Miscellaneous STR_5271 :{SMALLFONT}{BLACK}Twitch @@ -3617,16 +3617,16 @@ STR_5277 :Tyhjennä STR_5278 :Sandbox mode STR_5279 :Sandbox mode off STR_5280 :{SMALLFONT}{BLACK}Allow editing land ownership settings through the Map window and other options that are normally restricted to the Scenario Editor -STR_5281 :{SMALLFONT}{BLACK}Features -STR_5282 :RCT1 Ride Open/Close Lights -STR_5283 :RCT1 Park Open/Close Lights +STR_5281 :{SMALLFONT}{BLACK}Ominaisuuksia +STR_5282 :RCT1 Ajelu auki/suljettu -valot +STR_5283 :RCT1 Puisto auki/kiinni -valot STR_5284 :RCT1 Scenario Selection Font -STR_5285 :EXPLODE!!! -STR_5286 :{SMALLFONT}{BLACK}Makes some guests explode -STR_5287 :Ride is already broken down -STR_5288 :Ride is closed +STR_5285 :RÄJÄHTÄÄ!!! +STR_5286 :{SMALLFONT}{BLACK}Saa jotkut vieraat räjähtämään +STR_5287 :Ajelu on jo hajonnut +STR_5288 :Ajelu on suljettu STR_5289 :No breakdowns available for this ride -STR_5290 :Fix ride +STR_5290 :Korjaa ajelu STR_5291 :Can't force breakdown STR_5292 :{SMALLFONT}{BLACK}Force a breakdown STR_5293 :{SMALLFONT}{BLACK}Close ride/attraction @@ -3638,8 +3638,8 @@ STR_5298 :{RED}{STRINGID} STR_5299 :{LIGHTPINK}{STRINGID} STR_5300 :{SMALLFONT}{BLACK}Quick fire staff STR_5301 :{MEDIUMFONT}{BLACK}Clear your loan -STR_5302 :Clear loan -STR_5303 :Allow building in pause mode +STR_5302 :Poista laina +STR_5303 :Salli rakentelu pelin ollessa pysäytetty STR_5304 :Title Sequence: STR_5305 :RollerCoaster Tycoon 1 STR_5306 :RollerCoaster Tycoon 1 (AA) @@ -3648,16 +3648,16 @@ STR_5308 :RollerCoaster Tycoon 2 STR_5309 :OpenRCT2 STR_5310 :Satunnainen STR_5311 :{SMALLFONT}{BLACK}Debug tools -STR_5312 :Show console +STR_5312 :Näytä komentokehote STR_5313 :Show tile inspector STR_5314 :Tile inspector STR_5315 :Nurmikko STR_5316 :Hiekka STR_5317 :Pöly STR_5318 :Kallio -STR_5319 :Martian -STR_5320 :Checkerboard -STR_5321 :Grass clumps +STR_5319 :Marssilainen +STR_5320 :Shakkilauta +STR_5321 :Ruohokasoja STR_5322 :Jää STR_5323 :Ruudukko (punainen) STR_5324 :Ruudukko (keltainen) @@ -3665,43 +3665,43 @@ STR_5325 :Ruudukko (sininen) STR_5326 :Ruudukko (vihreä) STR_5327 :Hiekka (tumma) STR_5328 :Hiekka (vaalea) -STR_5329 :Checkerboard (inverted) -STR_5330 :Underground view +STR_5329 :Shakkilauta (käänteinen) +STR_5330 :Maanalainen näkymä STR_5331 :Kallio -STR_5332 :Wood (red) -STR_5333 :Wood (black) +STR_5332 :Puu (punainen) +STR_5333 :Puu (musta) STR_5334 :Jää -STR_5335 :Ride entrance -STR_5336 :Ride exit -STR_5337 :Park entrance +STR_5335 :Ajelun sisäänkäynti +STR_5336 :Ajelun uloskäynti +STR_5337 :Puiston sisäänkäynti STR_5338 :Element type STR_5339 :Base height STR_5340 :Clearance height STR_5341 :Flags STR_5342 :Choose a map tile STR_5343 :Automatically place staff -STR_5344 :Changelog -STR_5345 :Financial cheats -STR_5346 :Guest cheats -STR_5347 :Park cheats -STR_5348 :Ride cheats -STR_5349 :{SMALLFONT}{BLACK}All Rides +STR_5344 :Muutosloki +STR_5345 :Taloushuijaukset +STR_5346 :Vierashuijaukset +STR_5347 :Puiston huijaukset +STR_5348 :Ajelun huijaukset +STR_5349 :{SMALLFONT}{BLACK}Kaikki ajelut STR_5350 :Max STR_5351 :Min STR_5352 :{BLACK}Onnellisuus: STR_5353 :{BLACK}Energia: STR_5354 :{BLACK}Nälkä: STR_5355 :{BLACK}Jano: -STR_5356 :{BLACK}Nausea: -STR_5357 :{BLACK}Nausea tolerance: -STR_5358 :{BLACK}Bathroom: +STR_5356 :{BLACK}Pahoinvointi: +STR_5357 :{BLACK}Pahoinvoinnin sietoraja: +STR_5358 :{BLACK}WC: STR_5359 :Poista vieraat STR_5360 :{SMALLFONT}{BLACK}Poista kaikki vieraat kartalta STR_5361 :Anna kaikille vieraille: STR_5362 :{BLACK}Set all guests' preferred ride intensity to: STR_5363 :Enemmän kuin 1 STR_5364 :Vähemmän kuin 15 -STR_5365 :{BLACK}Henkilöstön nopeus: +STR_5365 :{BLACK}Henkilökunnan nopeus: STR_5366 :Normaali STR_5367 :Nopea STR_5368 :Reset crash status @@ -3722,15 +3722,15 @@ STR_5382 :{SMALLFONT}{BLACK}Restart title sequence STR_5383 :{SMALLFONT}{BLACK}Create a new title sequence based on the current one STR_5384 :{SMALLFONT}{BLACK}Delete the current title sequence STR_5385 :{SMALLFONT}{BLACK}Rename the current title sequence -STR_5386 :{SMALLFONT}{BLACK}Insert a new command -STR_5387 :{SMALLFONT}{BLACK}Edit the selected command -STR_5388 :{SMALLFONT}{BLACK}Delete the selected command +STR_5386 :{SMALLFONT}{BLACK}Lisää uusi komento +STR_5387 :{SMALLFONT}{BLACK}Muokkaa uusi komento +STR_5388 :{SMALLFONT}{BLACK}Poista valittu komento STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence STR_5390 :{SMALLFONT}{BLACK}Move the selected command down STR_5391 :{SMALLFONT}{BLACK}Move the selected command up STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence -STR_5394 :{SMALLFONT}{BLACK}Rename the selected save +STR_5394 :{SMALLFONT}{BLACK}Uudelleennimeä valittu tallenne STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game STR_5397 :Can only be used on the title screen @@ -3739,76 +3739,77 @@ STR_5399 :Press the stop button to continue editing STR_5400 :Can't change this title sequence STR_5401 :Create a new title sequence to make changes to STR_5402 :Failed to load title sequence -STR_5403 :There may be no Load or Wait command or a save may be invalid +STR_5403 :Tuolla +may be no Load or Wait command or a save may be invalid STR_5404 :Nimi on jo olemassa -STR_5405 :Enter a name for the save +STR_5405 :Anna nimi tallenteelle STR_5406 :Enter a name for the title sequence STR_5407 :Lisää STR_5408 :Poista STR_5409 :Insert STR_5410 :Muokkaa -STR_5411 :Reload +STR_5411 :Lataa uudelleen STR_5412 :Skip to STR_5413 :Lataa STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6 -STR_5415 :Load{MOVE_X}{87}{STRING} -STR_5416 :Load{MOVE_X}{87}No save selected +STR_5415 :Lataa{MOVE_X}{87}{STRING} +STR_5416 :Lataa{MOVE_X}{87}Tallennetta ei ole valittu STR_5417 :Sijainti STR_5418 :Sijainti{MOVE_X}{87}{COMMA16} {COMMA16} -STR_5419 :Rotate -STR_5420 :Rotate{MOVE_X}{87}{COMMA16} +STR_5419 :Käännä +STR_5420 :Käännä{MOVE_X}{87}{COMMA16} STR_5421 :Zoom STR_5422 :Zoom{MOVE_X}{87}{COMMA16} STR_5423 :Odota STR_5424 :Odota{MOVE_X}{87}{COMMA16} -STR_5425 :Restart -STR_5426 :End -STR_5427 :Coordinates: -STR_5428 :Anticlockwise rotations: +STR_5425 :Uudelleen käynnistä +STR_5426 :Lopeta +STR_5427 :Koordinaatit: +STR_5428 :Vastapäivään käännökset: STR_5429 :Zoom level: -STR_5430 :Seconds to wait: -STR_5431 :Save to load: +STR_5430 :Sekuntia odottaa: +STR_5431 :Tallenna lataakseen: STR_5432 :Komento: STR_5433 :Title Sequences STR_5434 :Command Editor -STR_5435 :Rename save +STR_5435 :Uudelleen nimeä tallenne STR_5436 :Edit Title Sequences... -STR_5437 :No save selected +STR_5437 :Tallennusta ei valittuna STR_5438 :Can't make changes while command editor is open STR_5439 :A wait command with at least 4 seconds is required with a restart command STR_5440 :Minimise fullscreen on focus loss STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. -STR_5442 :Force park rating: +STR_5442 :Pakota puiston luokitus: STR_5443 :Nopeus{MOVE_X}{87}{STRINGID} STR_5444 :Nopeus: STR_5445 :Nopeus -STR_5446 :Get +STR_5446 :Hanki STR_5447 :Tyyppi {STRINGID} -STR_5448 :Ride / Vehicle {STRINGID} +STR_5448 :Ajelu / Ajoneuvo {STRINGID} STR_5449 :Vähennä pelin nopeutta STR_5450 :Lisää pelin nopeutta -STR_5451 :Open cheats window +STR_5451 :Avaa huijausikkuna STR_5452 :Toggle visibility of toolbars -STR_5453 :Select another ride +STR_5453 :Valitse toinen ajelu STR_5454 :Uncap FPS STR_5455 :Enable sandbox mode STR_5456 :Disable clearance checks STR_5457 :Disable support limits -STR_5458 :Rotate clockwise -STR_5459 :Rotate anti-clockwise +STR_5458 :Käännä myötäpäivään +STR_5459 :Käännä vastapäivään STR_5460 :Rotate view anti-clockwise STR_5461 :Set guests' parameters STR_5462 :{CURRENCY} -STR_5463 :Goal: Have fun! +STR_5463 :Tavoite: Pidä hauskaa! STR_5464 :Yleiset STR_5465 :Ilmasto -STR_5466 :Henkilöstö +STR_5466 :Henkilökunta STR_5467 :ALT + -STR_5468 :Recent messages -STR_5469 :Scroll map up -STR_5470 :Scroll map left -STR_5471 :Scroll map down -STR_5472 :Scroll map right +STR_5468 :Viimeiset viestit +STR_5469 :Vieritä karttaa ylös +STR_5470 :Vieritä karttaa vasemmalle +STR_5471 :Vieritä karttaa alas +STR_5472 :Vieritä karttaa oikealle STR_5473 :Cycle day / night STR_5474 :Display text on banners in upper case STR_5475 :{COMMA16} viikkoa @@ -3818,12 +3819,34 @@ STR_5478 :Controls STR_5479 :Työkalupalkki STR_5480 :Show toolbar buttons for: STR_5481 :Teemat -STR_5482 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}1 minute -STR_5483 :{BLACK}({COMMA16} weeks remaining) -STR_5484 :{BLACK}({COMMA16} week remaining) +STR_5482 :{WINDOW_COLOUR_2}Aikaa viime tarkistuksesta: {BLACK}1 minuutti +STR_5483 :{BLACK}({COMMA16} viikkoa jäljellä) +STR_5484 :{BLACK}({COMMA16} viikko jäljellä) STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}Näytä viimeiset viestit -STR_5488 :No entrance +STR_5488 :Ei sisäänkäyntiä STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests STR_5490 :Disable audio on focus loss +STR_5491 :Keksinnötlista +STR_5492 :Scenario options +STR_5493 :Lähetä viesti +STR_5494 : +STR_5495 :Pelaajalista +STR_5496 :Pelaaja: +STR_5497 :Ping: +STR_5498 :Palvelinlista +STR_5499 :Pelaajan nimi: +STR_5500 :Lisää palvelin +STR_5501 :Käynistä palvelin +STR_5502 :Moninpeli +STR_5503 :Enter hostname or IP address: +STR_5504 :{SMALLFONT}{BLACK}Näytä moninpelin tilanne +STR_5505 :Yhdistäminen ei onnistunut. +STR_5506 :Guests ignore intensities +STR_5507 :Handymen mow grass by default +STR_5508 :Allow loading files with incorrect checksums +STR_5509 :{SMALLFONT}{BLACK}Allows loading scenarios and saves that have an incorrect checksum, like the scenarios from the demo or damaged saves. +STR_5510 :Oletus äänilaite +STR_5511 :(TUNTEMATON) +STR_5512 :Tallenna peli nimellä From d20af1444cec47e389fbc26ebd811ef58363e9a1 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 24 Aug 2015 11:38:27 +0200 Subject: [PATCH 0588/1173] Update translators in contributors file --- contributors.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/contributors.md b/contributors.md index a32678191f..e030dc480a 100644 --- a/contributors.md +++ b/contributors.md @@ -65,14 +65,24 @@ Includes all git commit authors. Aliases are GitHub user names. * (RollingStar) ## Translation +* Extracting from original files: Ted John (IntelOrca) +* Reviewing and merging: Rune Laenen (runelaenen), Michael Steenbeek (Gymnasiast) +* Fixing unmaintained languages: Michael Steenbeek (Gymnasiast) + * English (UK) - Ted John (IntelOrca), (Tinytimrob) * English (US) - Ted John (IntelOrca), Michael Steenbeek (Gymnasiast) -* French - (fbourigault), Michael Steenbeek (Gymnasiast) -* German - (danidoedel), (atmaxinger), (Yepoleb) -* Dutch - Michael Steenbeek (Gymnasiast), (hostbrute), (mrtnptrs), (xzbobzx) +* Dutch - Michael Steenbeek (Gymnasiast), (xzbobzx), (mrtnptrs), Thomas den Hollander (ThomasdenH), (hostbrute); reviewing and discussion: Aaron van Geffen (AaronVanGeffen), (Balletie) and Sijmen Schoon (Vijfhoek). +* Finnish - (DJHasis) +* French - (fbourigault), Joël Troch (JoelTroch), Michael Steenbeek (Gymnasiast) +* German - (danidoedel), (atmaxinger), (Yepoleb), Daniël Kessel (dkessel), Leon (AllGoodNamesAreTaken) +* Korean - "TELK" (telk5093) +* Polish - Adrian Wielgosik (adrian17) * Portuguese (BR) - (kaudy) +* Russian - (Soosisya) +* Simplified Chinese - (naijim) * Spanish - (mdtrooper) -* Swedish - (Jinxit), (mharrys) +* Swedish - (Jinxit), (mharrys), (Slimeyo) +* Traditional Chinese - Harry Lam (daihakken) ## Graphics * OpenRCT2 Logo - xzbobzx From 43e2a88742f884e277f0b0150bf1de5de445dfbf Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 24 Aug 2015 12:21:01 +0100 Subject: [PATCH 0589/1173] Update contributors.md --- contributors.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/contributors.md b/contributors.md index e030dc480a..1977c48651 100644 --- a/contributors.md +++ b/contributors.md @@ -2,11 +2,17 @@ Includes all git commit authors. Aliases are GitHub user names. ## Project team -* Ted John (IntelOrca) - Owner +* Ted John (IntelOrca) - Owner, merger, issue management +* Duncan Frost (duncanspumpkin) - Merger, issue management +* Michael Steenbeek (Gymnasiast) - Translation management +* Rune Laenen (runelaenen) - Translation management +* Miso Zmiric (mzmiric5) - Dependency / library management ## Long term developers * Ted John (IntelOrca) * Duncan Frost (duncanspumpkin) +* Michael Steenbeek (Gymnasiast) +* (zsilencer) ## Implementation (RCT2) * Ted John (IntelOrca) @@ -14,12 +20,11 @@ Includes all git commit authors. Aliases are GitHub user names. * Peter Hill (ZedThree) - String handling, misc. * (qcz) - Scenery window, misc. * Matthias Lanzinger (lnz) - Climate, finance, scenario, ride reachability -* (zsilencer) - Audio, misc. +* (zsilencer) - Audio, multiplayer, misc. * Adrian Wielgosik (adrian17) - Misc. * (hexdec) - Misc. * Dennis Devriendt (ddevrien) - Misc. * Maciek Baron (MaciekBaron) - Misc. -* Michael Steenbeek (Gymnasiast) - Cheats and misc. features * (AngeloG) - Scrollbar input, misc. * (jcdavis) - Misc. * (marcotc) - Rain drawing, misc. @@ -29,11 +34,11 @@ Includes all git commit authors. Aliases are GitHub user names. * (Vijfhoek) - Misc. * (wolfreak99) - Misc. * Inseok Lee (dlunch) - Original command line -* Robert Jordan (trigger-death) - New UI features, misc. ## Additional implementation (OpenRCT2) * (atmaxinger) - User configuration * (anyc) - Housecleaning, cross-platform fixes +* Michael Steenbeek (Gymnasiast) - Cheats, RCT1 ride style, misc. * Miso Zmiric (mzmiric5) - Misc. * (DutchRPW) - Housecleaning, initialisation * Jørn Lomax (jvlomax) - User configuration @@ -42,6 +47,7 @@ Includes all git commit authors. Aliases are GitHub user names. * (eezstreet) - Misc. * Thomas den Hollander (ThomasdenH) - Misc. * James Robertson (rd3k) - Misc. +* Robert Jordan (trigger-death) - UI theming, misc. ## Bug fixes * (halfbro) From 306b9427ccf2a595c4cae7e3cd462bb63492998c Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 24 Aug 2015 12:21:48 +0100 Subject: [PATCH 0590/1173] Update contributors.md --- contributors.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributors.md b/contributors.md index 1977c48651..3a87699bf2 100644 --- a/contributors.md +++ b/contributors.md @@ -47,7 +47,7 @@ Includes all git commit authors. Aliases are GitHub user names. * (eezstreet) - Misc. * Thomas den Hollander (ThomasdenH) - Misc. * James Robertson (rd3k) - Misc. -* Robert Jordan (trigger-death) - UI theming, misc. +* Robert Jordan (trigger-death) - UI theming, title sequence editor, misc. ## Bug fixes * (halfbro) From 83d87fceb8db9a1974b578ae2f6b20eee23c70b7 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Mon, 24 Aug 2015 13:36:14 +0200 Subject: [PATCH 0591/1173] Fix spacing and typo --- contributors.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contributors.md b/contributors.md index 3a87699bf2..8c1dff8df4 100644 --- a/contributors.md +++ b/contributors.md @@ -74,13 +74,12 @@ Includes all git commit authors. Aliases are GitHub user names. * Extracting from original files: Ted John (IntelOrca) * Reviewing and merging: Rune Laenen (runelaenen), Michael Steenbeek (Gymnasiast) * Fixing unmaintained languages: Michael Steenbeek (Gymnasiast) - * English (UK) - Ted John (IntelOrca), (Tinytimrob) * English (US) - Ted John (IntelOrca), Michael Steenbeek (Gymnasiast) * Dutch - Michael Steenbeek (Gymnasiast), (xzbobzx), (mrtnptrs), Thomas den Hollander (ThomasdenH), (hostbrute); reviewing and discussion: Aaron van Geffen (AaronVanGeffen), (Balletie) and Sijmen Schoon (Vijfhoek). * Finnish - (DJHasis) * French - (fbourigault), Joël Troch (JoelTroch), Michael Steenbeek (Gymnasiast) -* German - (danidoedel), (atmaxinger), (Yepoleb), Daniël Kessel (dkessel), Leon (AllGoodNamesAreTaken) +* German - (danidoedel), (atmaxinger), (Yepoleb), Daniel Kessel (dkessel), Leon (AllGoodNamesAreTaken) * Korean - "TELK" (telk5093) * Polish - Adrian Wielgosik (adrian17) * Portuguese (BR) - (kaudy) From 5a03da5f6f1a6d410318d7b1b9586ddcecc5c386 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Mon, 24 Aug 2015 19:55:50 +0200 Subject: [PATCH 0592/1173] Include naijim's real name --- contributors.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributors.md b/contributors.md index 8c1dff8df4..89b4be1d90 100644 --- a/contributors.md +++ b/contributors.md @@ -84,7 +84,7 @@ Includes all git commit authors. Aliases are GitHub user names. * Polish - Adrian Wielgosik (adrian17) * Portuguese (BR) - (kaudy) * Russian - (Soosisya) -* Simplified Chinese - (naijim) +* Simplified Chinese - Naiji Ma (naijim) * Spanish - (mdtrooper) * Swedish - (Jinxit), (mharrys), (Slimeyo) * Traditional Chinese - Harry Lam (daihakken) From 580a6c7388cc242ee3d624960d6e16f7cf938f3b Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 25 Aug 2015 04:00:15 +0100 Subject: [PATCH 0593/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 3594e47460..d73e1e9b34 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -1651,7 +1651,7 @@ STR_1645 : STR_1646 : STR_1647 : STR_1648 :{SMALLFONT}{OPENQUOTES}救命! 放我下去!{ENDQUOTES} -STR_1649 :{SMALLFONT}{OPENQUOTES}我花光了我身上所有的錢了!{ENDQUOTES} +STR_1649 :{SMALLFONT}{OPENQUOTES}我花光了我身上的錢了!{ENDQUOTES} STR_1650 :{SMALLFONT}{OPENQUOTES}嘩! 嶄新的遊樂設施在建造中呢!{ENDQUOTES} STR_1651 :{SMALLFONT}{OPENQUOTES}這個遊樂設施不錯喔! 只是比起Phoneix還是差一截呢...{ENDQUOTES} STR_1652 :{SMALLFONT}{OPENQUOTES}我好興奮 - 因為這是Intamin創造的遊樂設施!{ENDQUOTES} From 4733979df5c85880d9d06e6b7a8362f955e16d6c Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 25 Aug 2015 19:08:17 +0200 Subject: [PATCH 0594/1173] Fix crash when attempting to build a new ride when having the Ride construction window open, fixes #1844 --- src/windows/new_ride.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index c4fd258652..a1b35e7b8c 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -931,6 +931,7 @@ static void window_new_ride_select(rct_window *w) return; window_close(w); + window_close_construction_windows(); if (ride_type_has_flag(item.type, RIDE_TYPE_FLAG_HAS_TRACK)) { track_load_list(item); From cc705d9a1fa84fb703ec4f5e371c81aae83f4cd0 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 27 Aug 2015 13:27:46 +0200 Subject: [PATCH 0595/1173] Move network button to first group and adjust colours, fix debug menu colours --- src/windows/top_toolbar.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index ea22803649..892477f972 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -126,6 +126,7 @@ static const int left_aligned_widgets_order[] = { WIDX_PAUSE, WIDX_FASTFORWARD, WIDX_FILE_MENU, + WIDX_NETWORK, WIDX_CHEATS, WIDX_DEBUG, @@ -136,7 +137,6 @@ static const int left_aligned_widgets_order[] = { WIDX_ROTATE, WIDX_VIEW_MENU, WIDX_MAP, - WIDX_NETWORK, }; // from right to left @@ -187,7 +187,7 @@ static rct_widget window_top_toolbar_widgets[] = { { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_SCENARIO_OPTIONS_FINANCIAL_TIP },// Finances { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_FINANCES_RESEARCH_TIP }, // Research { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_SHOW_RECENT_MESSAGES_TIP }, // News - { WWT_TRNBTN, 1, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_SHOW_MULTIPLAYER_STATUS_TIP }, // Network + { WWT_TRNBTN, 0, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_SHOW_MULTIPLAYER_STATUS_TIP }, // Network { WWT_EMPTY, 0, 0, 10-1, 0, 0, 0xFFFFFFFF, STR_NONE }, // Artificial widget separator { WIDGETS_END }, @@ -2904,7 +2904,7 @@ void top_toolbar_init_debug_menu(rct_window* w, rct_widget* widget) { w->x + widget->left, w->y + widget->top, widget->bottom - widget->top + 1, - w->colours[1] | 0x80, + w->colours[0] | 0x80, 0, 5 ); @@ -2919,7 +2919,7 @@ void top_toolbar_init_network_menu(rct_window* w, rct_widget* widget) { w->x + widget->left, w->y + widget->top, widget->bottom - widget->top + 1, - w->colours[1] | 0x80, + w->colours[0] | 0x80, 0, 1 ); From 308b086c55b4914c4dd9e7f1fe2cf3beb985a87c Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 27 Aug 2015 16:19:17 +0200 Subject: [PATCH 0596/1173] Name some addresses, clean up strings ids and usage --- src/addresses.h | 3 + src/localisation/string_ids.h | 311 +++++++++++++------------ src/ride/ride.c | 42 ++-- src/ride/track.c | 60 ++--- src/ride/track.h | 4 + src/windows/editor_object_selection.c | 4 +- src/windows/editor_objective_options.c | 2 +- src/windows/ride_construction.c | 6 +- src/windows/top_toolbar.c | 24 +- src/world/footpath.c | 4 +- src/world/map.c | 32 +-- src/world/map.h | 4 + 12 files changed, 257 insertions(+), 239 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 5533ef5ce3..09e92b50b5 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -287,6 +287,8 @@ #define RCT2_ADDRESS_UNCOMPLETED_RESEARCH_TYPES 0x00EE787C +#define RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER 0x00F1AD60 + #define RCT2_ADDRESS_MAP_IMAGE_DATA 0x00F1AD68 // No longer used @@ -347,6 +349,7 @@ #define RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE 0x00F44152 +#define RCT2_ADDRESS_ABOVE_GROUND_FLAGS 0x00F441D4 #define RCT2_ADDRESS_TRACK_LIST 0x00F441EC #define RCT2_ADDRESS_SCENERY_COST 0x00F64EB4 diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 80ec47ade7..255c907cb0 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -85,9 +85,6 @@ enum { STR_RESOLUTION_X_BY_Y = 840, - STR_ROTATE_CLOCKWISE = 5458, - STR_ROTATE_ANTI_CLOCKWISE = 5459, - STR_ABOUT = 847, STR_ROLLERCOASTER_TYCOON_2 = 848, STR_VERSION_X = 849, @@ -258,6 +255,8 @@ enum { STR_CLOSE_PARK = 1013, STR_OPEN_PARK = 1014, + STR_UNABLE_TO_OPERATE_WITH_MORE_THAN_ONE_STATION_IN_THIS_MODE = 1015, + STR_UNABLE_TO_OPERATE_WITH_LESS_THAN_TWO_STATIONS_IN_THIS_MODE = 1016, STR_CANT_CHANGE_OPERATING_MODE = 1017, STR_RIDE_SET_VEHICLE_TYPE_FAIL = 1018, STR_RIDE_SET_VEHICLE_SET_NUM_CARS_PER_TRAIN_FAIL = 1019, @@ -283,6 +282,7 @@ enum { STR_RCT2_SAVED_GAME = 1043, STR_RCT2_SCENARIO_FILE = 1044, STR_RCT2_LANDSCAPE_FILE = 1045, + STR_SCENARIO_SAVE_FAILED = 1048, STR_INVISIBLE_SUPPORTS = 1051, @@ -397,6 +397,7 @@ enum { STR_PLACE_SCENERY_TIP = 1159, STR_ADJUST_WATER_TIP = 1160, + STR_CANT_POSITION_THIS_HERE = 1161, STR_CANT_LOWER_WATER_LEVEL_HERE = 1166, STR_CANT_RAISE_WATER_LEVEL_HERE = 1167, @@ -906,25 +907,6 @@ enum { STR_SHOP_ITEM_SINGULAR_LEMONADE = 2013, STR_SHOP_ITEM_SINGULAR_EMPTY_BOX = 2014, STR_SHOP_ITEM_SINGULAR_EMPTY_BOTTLE = 2015, - STR_SHOP_ITEM_SINGULAR_PRETZEL = 2125, - STR_SHOP_ITEM_SINGULAR_HOT_CHOCOLATE = 2126, - STR_SHOP_ITEM_SINGULAR_ICED_TEA = 2127, - STR_SHOP_ITEM_SINGULAR_FUNNEL_CAKE = 2128, - STR_SHOP_ITEM_SINGULAR_SUNGLASSES = 2129, - STR_SHOP_ITEM_SINGULAR_BEEF_NOODLES = 2130, - STR_SHOP_ITEM_SINGULAR_FRIED_RICE_NOODLES = 2131, - STR_SHOP_ITEM_SINGULAR_WONTON_SOUP = 2132, - STR_SHOP_ITEM_SINGULAR_MEATBALL_SOUP = 2133, - STR_SHOP_ITEM_SINGULAR_FRUIT_JUICE = 2134, - STR_SHOP_ITEM_SINGULAR_SOYBEAN_MILK = 2135, - STR_SHOP_ITEM_SINGULAR_SUJONGKWA = 2136, - STR_SHOP_ITEM_SINGULAR_SUB_SANDWICH = 2137, - STR_SHOP_ITEM_SINGULAR_COOKIE = 2138, - STR_SHOP_ITEM_SINGULAR_EMPTY_BOWL_RED = 2139, - STR_SHOP_ITEM_SINGULAR_EMPTY_DRINK_CARTON = 2140, - STR_SHOP_ITEM_SINGULAR_EMPTY_JUICE_CUP = 2141, - STR_SHOP_ITEM_SINGULAR_ROAST_SAUSAGE = 2142, - STR_SHOP_ITEM_SINGULAR_EMPTY_BOWL_BLUE = 2143, STR_SHOP_ITEM_PLURAL_BALLOON = 2016, STR_SHOP_ITEM_PLURAL_CUDDLY_TOY = 2017, @@ -954,25 +936,6 @@ enum { STR_SHOP_ITEM_PLURAL_LEMONADE = 2041, STR_SHOP_ITEM_PLURAL_EMPTY_BOX = 2042, STR_SHOP_ITEM_PLURAL_EMPTY_BOTTLE = 2043, - STR_SHOP_ITEM_PLURAL_PRETZEL = 2147, - STR_SHOP_ITEM_PLURAL_HOT_CHOCOLATE = 2148, - STR_SHOP_ITEM_PLURAL_ICED_TEA = 2149, - STR_SHOP_ITEM_PLURAL_FUNNEL_CAKE = 2150, - STR_SHOP_ITEM_PLURAL_SUNGLASSES = 2151, - STR_SHOP_ITEM_PLURAL_BEEF_NOODLES = 2152, - STR_SHOP_ITEM_PLURAL_FRIED_RICE_NOODLES = 2153, - STR_SHOP_ITEM_PLURAL_WONTON_SOUP = 2154, - STR_SHOP_ITEM_PLURAL_MEATBALL_SOUP = 2155, - STR_SHOP_ITEM_PLURAL_FRUIT_JUICE = 2156, - STR_SHOP_ITEM_PLURAL_SOYBEAN_MILK = 2157, - STR_SHOP_ITEM_PLURAL_SUJONGKWA = 2158, - STR_SHOP_ITEM_PLURAL_SUB_SANDWICH = 2159, - STR_SHOP_ITEM_PLURAL_COOKIE = 2160, - STR_SHOP_ITEM_PLURAL_EMPTY_BOWL_RED = 2161, - STR_SHOP_ITEM_PLURAL_EMPTY_DRINK_CARTON = 2162, - STR_SHOP_ITEM_PLURAL_EMPTY_JUICE_CUP = 2163, - STR_SHOP_ITEM_PLURAL_ROAST_SAUSAGE = 2164, - STR_SHOP_ITEM_PLURAL_EMPTY_BOWL_BLUE = 2165, STR_SHOP_ITEM_INDEFINITE_BALLOON = 2044, STR_SHOP_ITEM_INDEFINITE_CUDDLY_TOY = 2045, @@ -1002,25 +965,6 @@ enum { STR_SHOP_ITEM_INDEFINITE_LEMONADE = 2069, STR_SHOP_ITEM_INDEFINITE_EMPTY_BOX = 2070, STR_SHOP_ITEM_INDEFINITE_EMPTY_BOTTLE = 2071, - STR_SHOP_ITEM_INDEFINITE_PRETZEL = 2169, - STR_SHOP_ITEM_INDEFINITE_HOT_CHOCOLATE = 2170, - STR_SHOP_ITEM_INDEFINITE_ICED_TEA = 2171, - STR_SHOP_ITEM_INDEFINITE_FUNNEL_CAKE = 2172, - STR_SHOP_ITEM_INDEFINITE_SUNGLASSES = 2173, - STR_SHOP_ITEM_INDEFINITE_BEEF_NOODLES = 2174, - STR_SHOP_ITEM_INDEFINITE_FRIED_RICE_NOODLES = 2175, - STR_SHOP_ITEM_INDEFINITE_WONTON_SOUP = 2176, - STR_SHOP_ITEM_INDEFINITE_MEATBALL_SOUP = 2177, - STR_SHOP_ITEM_INDEFINITE_FRUIT_JUICE = 2178, - STR_SHOP_ITEM_INDEFINITE_SOYBEAN_MILK = 2179, - STR_SHOP_ITEM_INDEFINITE_SUJONGKWA = 2180, - STR_SHOP_ITEM_INDEFINITE_SUB_SANDWICH = 2181, - STR_SHOP_ITEM_INDEFINITE_COOKIE = 2182, - STR_SHOP_ITEM_INDEFINITE_EMPTY_BOWL_RED = 2183, - STR_SHOP_ITEM_INDEFINITE_EMPTY_DRINK_CARTON = 2184, - STR_SHOP_ITEM_INDEFINITE_EMPTY_JUICE_CUP = 2185, - STR_SHOP_ITEM_INDEFINITE_ROAST_SAUSAGE = 2186, - STR_SHOP_ITEM_INDEFINITE_EMPTY_BOWL_BLUE = 2187, STR_SHOP_ITEM_DISPLAY_BALLOON = 2072, STR_SHOP_ITEM_DISPLAY_CUDDLY_TOY = 2073, @@ -1050,6 +994,67 @@ enum { STR_SHOP_ITEM_DISPLAY_LEMONADE = 2097, STR_SHOP_ITEM_DISPLAY_EMPTY_BOX = 2098, STR_SHOP_ITEM_DISPLAY_EMPTY_BOTTLE = 2099, + + STR_SHOP_ITEM_SINGULAR_PRETZEL = 2125, + STR_SHOP_ITEM_SINGULAR_HOT_CHOCOLATE = 2126, + STR_SHOP_ITEM_SINGULAR_ICED_TEA = 2127, + STR_SHOP_ITEM_SINGULAR_FUNNEL_CAKE = 2128, + STR_SHOP_ITEM_SINGULAR_SUNGLASSES = 2129, + STR_SHOP_ITEM_SINGULAR_BEEF_NOODLES = 2130, + STR_SHOP_ITEM_SINGULAR_FRIED_RICE_NOODLES = 2131, + STR_SHOP_ITEM_SINGULAR_WONTON_SOUP = 2132, + STR_SHOP_ITEM_SINGULAR_MEATBALL_SOUP = 2133, + STR_SHOP_ITEM_SINGULAR_FRUIT_JUICE = 2134, + STR_SHOP_ITEM_SINGULAR_SOYBEAN_MILK = 2135, + STR_SHOP_ITEM_SINGULAR_SUJONGKWA = 2136, + STR_SHOP_ITEM_SINGULAR_SUB_SANDWICH = 2137, + STR_SHOP_ITEM_SINGULAR_COOKIE = 2138, + STR_SHOP_ITEM_SINGULAR_EMPTY_BOWL_RED = 2139, + STR_SHOP_ITEM_SINGULAR_EMPTY_DRINK_CARTON = 2140, + STR_SHOP_ITEM_SINGULAR_EMPTY_JUICE_CUP = 2141, + STR_SHOP_ITEM_SINGULAR_ROAST_SAUSAGE = 2142, + STR_SHOP_ITEM_SINGULAR_EMPTY_BOWL_BLUE = 2143, + + STR_SHOP_ITEM_PLURAL_PRETZEL = 2147, + STR_SHOP_ITEM_PLURAL_HOT_CHOCOLATE = 2148, + STR_SHOP_ITEM_PLURAL_ICED_TEA = 2149, + STR_SHOP_ITEM_PLURAL_FUNNEL_CAKE = 2150, + STR_SHOP_ITEM_PLURAL_SUNGLASSES = 2151, + STR_SHOP_ITEM_PLURAL_BEEF_NOODLES = 2152, + STR_SHOP_ITEM_PLURAL_FRIED_RICE_NOODLES = 2153, + STR_SHOP_ITEM_PLURAL_WONTON_SOUP = 2154, + STR_SHOP_ITEM_PLURAL_MEATBALL_SOUP = 2155, + STR_SHOP_ITEM_PLURAL_FRUIT_JUICE = 2156, + STR_SHOP_ITEM_PLURAL_SOYBEAN_MILK = 2157, + STR_SHOP_ITEM_PLURAL_SUJONGKWA = 2158, + STR_SHOP_ITEM_PLURAL_SUB_SANDWICH = 2159, + STR_SHOP_ITEM_PLURAL_COOKIE = 2160, + STR_SHOP_ITEM_PLURAL_EMPTY_BOWL_RED = 2161, + STR_SHOP_ITEM_PLURAL_EMPTY_DRINK_CARTON = 2162, + STR_SHOP_ITEM_PLURAL_EMPTY_JUICE_CUP = 2163, + STR_SHOP_ITEM_PLURAL_ROAST_SAUSAGE = 2164, + STR_SHOP_ITEM_PLURAL_EMPTY_BOWL_BLUE = 2165, + + STR_SHOP_ITEM_INDEFINITE_PRETZEL = 2169, + STR_SHOP_ITEM_INDEFINITE_HOT_CHOCOLATE = 2170, + STR_SHOP_ITEM_INDEFINITE_ICED_TEA = 2171, + STR_SHOP_ITEM_INDEFINITE_FUNNEL_CAKE = 2172, + STR_SHOP_ITEM_INDEFINITE_SUNGLASSES = 2173, + STR_SHOP_ITEM_INDEFINITE_BEEF_NOODLES = 2174, + STR_SHOP_ITEM_INDEFINITE_FRIED_RICE_NOODLES = 2175, + STR_SHOP_ITEM_INDEFINITE_WONTON_SOUP = 2176, + STR_SHOP_ITEM_INDEFINITE_MEATBALL_SOUP = 2177, + STR_SHOP_ITEM_INDEFINITE_FRUIT_JUICE = 2178, + STR_SHOP_ITEM_INDEFINITE_SOYBEAN_MILK = 2179, + STR_SHOP_ITEM_INDEFINITE_SUJONGKWA = 2180, + STR_SHOP_ITEM_INDEFINITE_SUB_SANDWICH = 2181, + STR_SHOP_ITEM_INDEFINITE_COOKIE = 2182, + STR_SHOP_ITEM_INDEFINITE_EMPTY_BOWL_RED = 2183, + STR_SHOP_ITEM_INDEFINITE_EMPTY_DRINK_CARTON = 2184, + STR_SHOP_ITEM_INDEFINITE_EMPTY_JUICE_CUP = 2185, + STR_SHOP_ITEM_INDEFINITE_ROAST_SAUSAGE = 2186, + STR_SHOP_ITEM_INDEFINITE_EMPTY_BOWL_BLUE = 2187, + STR_SHOP_ITEM_DISPLAY_PRETZEL = 2191, STR_SHOP_ITEM_DISPLAY_HOT_CHOCOLATE = 2192, STR_SHOP_ITEM_DISPLAY_ICED_TEA = 2193, @@ -1070,7 +1075,6 @@ enum { STR_SHOP_ITEM_DISPLAY_ROAST_SAUSAGE = 2208, STR_SHOP_ITEM_DISPLAY_EMPTY_BOWL_BLUE = 2209, - STR_STAFF_HANDYMEN_TAB_TIP = 2210, STR_STAFF_MECHANICS_TAB_TIP = 2211, STR_STAFF_SECURITY_TAB_TIP = 2212, @@ -1374,87 +1378,27 @@ enum { STR_SHORTCUT_SHOW_RECENT_MESSAGES = 2522, STR_SHORTCUT_SHOW_MAP = 2523, STR_SHORTCUT_SCREENSHOT = 2524, - STR_INDIVIDUAL_KEYS_BASE = 2525, - STR_GOLF_HOLE_A = 3049, - STR_GOLF_HOLE_B = 3050, - STR_GOLF_HOLE_C = 3051, - STR_GOLF_HOLE_D = 3052, - STR_GOLF_HOLE_E = 3053, + STR_CHEAT_TIP_5K_MONEY = 2681, - STR_TOP_SECTION = 3069, - STR_SLOPE_TO_LEVEL = 3070, + STR_CHEAT_TIP_LARGE_TRAM_GUESTS = 2684, - STR_NOT_ALLOWED_TO_MODIFY_STATION = 3092, - - // Cheats - STR_CHEAT_TITLE = 5217, - STR_CHEAT_TITLE_FINANCIAL = 5345, - STR_CHEAT_TITLE_GUEST = 5346, - STR_CHEAT_TITLE_RIDE = 5347, - STR_CHEAT_TITLE_PARK = 5348, - - // Money - STR_CHEAT_5K_MONEY = 2760, - STR_CHEAT_CLEAR_LOAN = 5302, - - // Guests - STR_CHEAT_LARGE_TRAM_GUESTS = 2765, - STR_CHEAT_EXPLODE = 5285, - STR_CHEAT_REMOVE_ALL_GUESTS = 5359, - STR_CHEAT_GUEST_HAPPINESS = 5352, - STR_CHEAT_GUEST_ENERGY = 5353, - STR_CHEAT_GUEST_HUNGER = 5354, - STR_CHEAT_GUEST_THIRST = 5355, - STR_CHEAT_GUEST_NAUSEA = 5356, - STR_CHEAT_GUEST_NAUSEA_TOLERANCE = 5357, - STR_CHEAT_GUEST_BATHROOM = 5358, - STR_CHEAT_GIVE_ALL_GUESTS = 5361, - STR_CHEAT_GUEST_PREFERRED_INTENSITY = 5362, - STR_CHEAT_MORE_THAN_1 = 5363, - STR_CHEAT_LESS_THAN_15 = 5364, - STR_CHEAT_IGNORE_INTENSITY = 5506, - - // Misc. - STR_CHEAT_FREEZE_CLIMATE = 2767, - STR_CHEAT_UNFREEZE_CLIMATE = 2768, - STR_CHEAT_OPEN_PARK = 2769, - STR_CHEAT_CLOSE_PARK = 2770, - STR_CHEAT_ZERO_CLEARANCE = 2759, - STR_CHEAT_FORCE_SUN = 2757, - STR_CHEAT_FORCE_THUNDER = 2758, STR_CHEAT_CLEAR_GRASS = 2752, STR_CHEAT_MOWED_GRASS = 2753, STR_CHEAT_WATER_PLANTS = 2754, STR_CHEAT_FIX_VANDALISM = 2755, STR_CHEAT_REMOVE_LITTER = 2756, + STR_CHEAT_FORCE_SUN = 2757, + STR_CHEAT_FORCE_THUNDER = 2758, + STR_CHEAT_ZERO_CLEARANCE = 2759, + STR_CHEAT_5K_MONEY = 2760, + STR_CHEAT_LARGE_TRAM_GUESTS = 2765, STR_CHEAT_WIN_SCENARIO = 2766, - STR_CHEAT_UNLOCK_PRICES = 5157, - STR_CHEAT_BUILD_IN_PAUSE_MODE = 5303, - STR_CHEAT_PARK_PARAMETERS = 5369, - - // Rides - STR_CHEAT_RENEW_RIDES = 5123, - STR_CHEAT_MAKE_DESTRUCTABLE = 5125, - STR_CHEAT_FIX_ALL_RIDES = 5132, - STR_CHEAT_410_HILL_LIFT = 5137, - STR_CHEAT_DISABLE_BRAKES_FAILURE = 5140, - STR_CHEAT_DISABLE_BREAKDOWNS = 5141, - - // Cheat tips - STR_CHEAT_TIP_5K_MONEY = 2681, - STR_CHEAT_TIP_CLEAR_LOAN = 5301, - STR_CHEAT_TIP_LARGE_TRAM_GUESTS = 2684, - STR_CHEAT_TIP_EXPLODE = 5286, - STR_CHEAT_TIP_REMOVE_ALL_GUESTS = 5360, - STR_CHEAT_TIP_PARK_PARAMETERS = 5370, - - // Cheat tab tips - STR_FINANCIAL_CHEATS_TIP = 5178, - STR_GUEST_CHEATS_TIP = 5179, - STR_PARK_CHEATS_TIP = 5180, - STR_RIDE_CHEATS_TIP = 5181, + STR_CHEAT_FREEZE_CLIMATE = 2767, + STR_CHEAT_UNFREEZE_CLIMATE = 2768, + STR_CHEAT_OPEN_PARK = 2769, + STR_CHEAT_CLOSE_PARK = 2770, STR_SHORTCUT_ENTRY_FORMAT = 2781, STR_SHIFT_PLUS = 2782, @@ -1571,7 +1515,7 @@ enum { STR_JUNGLE_DRUMS_STYLE = STR_MUSIC_STYLE_START + 5, STR_EGYPTIAN_STYLE = STR_MUSIC_STYLE_START + 6, STR_TOYLAND_STYLE = STR_MUSIC_STYLE_START + 7, - // STR_??? = STR_MUSIC_STYLE_START + 8, + // STR_??? = STR_MUSIC_STYLE_START + 8, // Circus show; never displayed as a string STR_SPACE_STYLE = STR_MUSIC_STYLE_START + 9, STR_HORROR_STYLE = STR_MUSIC_STYLE_START + 10, STR_TECHNO_STYLE = STR_MUSIC_STYLE_START + 11, @@ -1602,6 +1546,12 @@ enum { STR_THIS_RIDE_CANNOT_BE_MODIFIED = 3046, STR_LOCAL_AUTHORITY_FORBIDS_DEMOLITION_OR_MODIFICATIONS_TO_THIS_RIDE = 3047, + STR_GOLF_HOLE_A = 3049, + STR_GOLF_HOLE_B = 3050, + STR_GOLF_HOLE_C = 3051, + STR_GOLF_HOLE_D = 3052, + STR_GOLF_HOLE_E = 3053, + STR_WHITE = 3055, STR_TRANSLUCENT = 3056, STR_CONSTRUCTION_MARKER = 3057, @@ -1614,11 +1564,8 @@ enum { STR_RIDE_CONSTRUCTION_STANDARD_RC_TRACK_TIP = 3062, STR_RIDE_CONSTRUCTION_WATER_CHANNEL_TIP = 3063, - STR_BEGINNER_PARKS = 3064, - STR_CHALLENGING_PARKS = STR_BEGINNER_PARKS + 1, - STR_EXPERT_PARKS = STR_BEGINNER_PARKS + 2, - STR_REAL_PARKS = STR_BEGINNER_PARKS + 3, - STR_OTHER_PARKS = STR_BEGINNER_PARKS + 4, + STR_TOP_SECTION = 3069, + STR_SLOPE_TO_LEVEL = 3070, STR_SAME_PRICE_THROUGHOUT_PARK = 3071, STR_SAME_PRICE_THROUGHOUT_PARK_TIP = 3072, @@ -1643,12 +1590,23 @@ enum { STR_SPACE_ENTRANCE = 3089, STR_SELECT_STYLE_OF_ENTRANCE_EXIT_STATION_TIP = 3090, + + STR_YOU_ARE_NOT_ALLOWED_TO_REMOVE_THIS_SECTION = 3091, + STR_SELECT_LIFT_HILL_CHAIN_SPEED_TIP = 3097, STR_SELECT_COLOUR = 3099, STR_SELECT_SECONDARY_COLOUR = 3100, STR_SELECT_TERNARY_COLOUR = 3101, + STR_BEGINNER_PARKS = 3064, + STR_CHALLENGING_PARKS = STR_BEGINNER_PARKS + 1, + STR_EXPERT_PARKS = STR_BEGINNER_PARKS + 2, + STR_REAL_PARKS = STR_BEGINNER_PARKS + 3, + STR_OTHER_PARKS = STR_BEGINNER_PARKS + 4, + + STR_NOT_ALLOWED_TO_MODIFY_STATION = 3092, + STR_LIST_RIDES_TIP = 3104, STR_LIST_SHOPS_AND_STALLS_TIP = 3105, STR_LIST_KIOSKS_AND_FACILITIES_TIP = 3106, @@ -1685,6 +1643,8 @@ enum { STR_SELECT_NEARBY_SCENERY = 3137, STR_RESET_SELECTION = 3138, + STR_MULTICIRCUIT_NOT_POSSIBLE_WITH_CABLE_LIFT_HILL = 3141, + STR_SHOW_PEOPLE_ON_MAP_TIP = 3143, STR_SHOW_RIDES_STALLS_ON_MAP_TIP = 3144, @@ -1807,7 +1767,6 @@ enum { STR_CHANGE_NAME_OF_SCENARIO_TIP = 3296, STR_CHANGE_DETAIL_NOTES_ABOUT_PARK_SCENARIO_TIP = 3297, - STR_NO_DETAILS_YET = 3317, STR_SELECT_WHICH_GROUP_THIS_SCENARIO_APPEARS_IN = 3318, @@ -1832,10 +1791,15 @@ enum { STR_ROLLER_COASTER_DESIGNER = 3344, STR_TRACK_DESIGNS_MANAGER = 3345, + STR_CANT_SAVE_TRACK_DESIGN = 3346, + STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY = 3347, STR_TRACK_MANAGE_RENAME = 3348, STR_TRACK_MANAGE_DELETE = 3349, STR_CANT_RENAME_TRACK_DESIGN = 3352, + STR_NEW_NAME_CONTAINS_INVALID_CHARACTERS = 3353, + STR_ANOTHER_FILE_EXISTS_WITH_NAME_OR_FILE_IS_WRITE_PROTECTED = 3354, + STR_FILE_IS_WRITE_PROTECTED_OR_LOCKED = 3355, STR_ARE_YOU_SURE_YOU_WANT_TO_PERMANENTLY_DELETE_TRACK = 3357, STR_CANT_DELETE_TRACK_DESIGN = 3358, @@ -1860,19 +1824,6 @@ enum { STR_SAVE_TRACK_SCENERY_UNABLE_TO_SELECT_ADDITIONAL_ITEM_OF_SCENERY = 3389, STR_SAVE_TRACK_SCENERY_TOO_MANY_ITEMS_SELECTED = 3390, - STR_OBJECTIVE_2_NONE = 2397, - STR_OBJECTIVE_2_NUMBER_OF_GUESTS_AT_A_GIVEN_DATE = STR_OBJECTIVE_2_NONE + 1, - STR_OBJECTIVE_2_PARK_VALUE_AT_A_GIVEN_DATE = STR_OBJECTIVE_2_NONE + 2, - STR_OBJECTIVE_2_HAVE_FUN = STR_OBJECTIVE_2_NONE + 3, - STR_OBJECTIVE_2_BUILD_THE_BEST_RIDE_YOU_CAN = STR_OBJECTIVE_2_NONE + 4, - STR_OBJECTIVE_2_BUILD_10_ROLLER_COASTERS = STR_OBJECTIVE_2_NONE + 5, - STR_OBJECTIVE_2_NUMBER_OF_GUESTS_IN_PARK = STR_OBJECTIVE_2_NONE + 6, - STR_OBJECTIVE_2_MONTHLY_INCOME_FROM_RIDE_TICKETS = STR_OBJECTIVE_2_NONE + 7, - STR_OBJECTIVE_2_BUILD_10_ROLLER_COASTERS_OF_A_GIVEN_LENGTH = STR_OBJECTIVE_2_NONE + 8, - STR_OBJECTIVE_2_FINISH_BUILDING_5_ROLLER_COASTERS = STR_OBJECTIVE_2_NONE + 9, - STR_OBJECTIVE_2_REPAY_LOAN_AND_ACHIEVE_A_GIVEN_PARK_VALUE = STR_OBJECTIVE_2_NONE + 10, - STR_OBJECTIVE_2_MONTHLY_PROFIT_FROM_FOOD_MERCHANDISE = STR_OBJECTIVE_2_NONE + 11, - STR_CLEAR_SCENERY_TIP = 3437, STR_CLEAR_SCENERY = 3439, @@ -1890,6 +1841,13 @@ enum { STR_FINANCES_BUTTON_ON_TOOLBAR = 5120, STR_RESEARCH_BUTTON_ON_TOOLBAR = 5121, STR_SELECT_BY_TRACK_TYPE = 5122, + + STR_CHEAT_RENEW_RIDES = 5123, + STR_CHEAT_MAKE_DESTRUCTABLE = 5125, + STR_CHEAT_FIX_ALL_RIDES = 5132, + STR_CHEAT_410_HILL_LIFT = 5137, + STR_CHEAT_DISABLE_BRAKES_FAILURE = 5140, + STR_CHEAT_DISABLE_BREAKDOWNS = 5141, STR_CHEATS_BUTTON_ON_TOOLBAR = 5147, STR_GAME_SPEED_TIP = 5148, STR_CHEATS_TIP = 5149, @@ -1900,6 +1858,8 @@ enum { STR_TEST_UNFINISHED_TRACKS = 5155, STR_TEST_UNFINISHED_TRACKS_TIP = 5156, + STR_CHEAT_UNLOCK_PRICES = 5157, + STR_TWITCH_NAME = 5164, STR_TWITCH_PEEP_FOLLOWERS = 5165, STR_TWITCH_PEEP_FOLLOWERS_TIP = 5166, @@ -1916,6 +1876,14 @@ enum { STR_FULLSCREEN_MODE = 5177, + // Cheat tab tips + STR_FINANCIAL_CHEATS_TIP = 5178, + STR_GUEST_CHEATS_TIP = 5179, + STR_PARK_CHEATS_TIP = 5180, + STR_RIDE_CHEATS_TIP = 5181, + + STR_CHEAT_TITLE = 5217, + STR_GIANT_SCREENSHOT = 5260, STR_OPTIONS_DISPLAY_TIP = 5266, @@ -1927,6 +1895,13 @@ enum { STR_CHEAT_SANDBOX_MODE = 5278, STR_CHEAT_SANDBOX_MODE_DISABLE = 5279, STR_CHEAT_SANDBOX_MODE_TIP = 5280, + STR_CHEAT_TIP_EXPLODE = 5286, + + STR_CHEAT_EXPLODE = 5285, + + STR_CHEAT_TIP_CLEAR_LOAN = 5301, + STR_CHEAT_CLEAR_LOAN = 5302, + STR_CHEAT_BUILD_IN_PAUSE_MODE = 5303, STR_TITLE_SEQUENCE = 5304, STR_TITLE_SEQUENCE_RCT1 = 5305, @@ -1939,10 +1914,10 @@ enum { STR_DEBUG_TIP = 5311, STR_DEBUG_DROPDOWN_CONSOLE = 5312, STR_DEBUG_DROPDOWN_TILE_INSPECTOR = 5313, - STR_DEBUG_DROPDOWN_OBJECT_SELECTION = 5371, STR_TILE_INSPECTOR_TITLE = 5314, STR_TILE_INSPECTOR_TERRAIN_START = 5315, + STR_TILE_INSPECTOR_TERRAIN_EDGE_START = 5331, STR_TILE_INSPECTOR_ENTRANCE_START = 5335, STR_TILE_INSPECTOR_ELEMENT_TYPE = 5338, @@ -1955,12 +1930,35 @@ enum { STR_CHANGELOG_TITLE = 5344, + STR_CHEAT_TITLE_FINANCIAL = 5345, + STR_CHEAT_TITLE_GUEST = 5346, + STR_CHEAT_TITLE_RIDE = 5347, + STR_CHEAT_TITLE_PARK = 5348, + STR_MAX = 5350, STR_MIN = 5351, + + STR_CHEAT_GUEST_HAPPINESS = 5352, + STR_CHEAT_GUEST_ENERGY = 5353, + STR_CHEAT_GUEST_HUNGER = 5354, + STR_CHEAT_GUEST_THIRST = 5355, + STR_CHEAT_GUEST_NAUSEA = 5356, + STR_CHEAT_GUEST_NAUSEA_TOLERANCE = 5357, + STR_CHEAT_GUEST_BATHROOM = 5358, + STR_CHEAT_REMOVE_ALL_GUESTS = 5359, + STR_CHEAT_TIP_REMOVE_ALL_GUESTS = 5360, + STR_CHEAT_GIVE_ALL_GUESTS = 5361, + STR_CHEAT_GUEST_PREFERRED_INTENSITY = 5362, + STR_CHEAT_MORE_THAN_1 = 5363, + STR_CHEAT_LESS_THAN_15 = 5364, STR_CHEAT_STAFF_SPEED = 5365, STR_NORMAL = 5366, STR_FAST = 5367, STR_CHEAT_RESET_CRASH_STATUS = 5368, + STR_CHEAT_PARK_PARAMETERS = 5369, + STR_CHEAT_TIP_PARK_PARAMETERS = 5370, + + STR_DEBUG_DROPDOWN_OBJECT_SELECTION = 5371, STR_INVERT_RIGHT_MOUSE_DRAG = 5372, @@ -1969,6 +1967,7 @@ enum { STR_UP = 5375, STR_DOWN = 5376, + STR_EDIT_TITLE_SEQUENCES_BUTTON = 5436, STR_MININISE_FULL_SCREEN_ON_FOCUS_LOSS = 5440, @@ -1993,6 +1992,8 @@ enum { STR_DISABLE_CLEARANCE_CHECKS = 5456, STR_DISABLE_SUPPORT_LIMITS = 5457, + STR_ROTATE_CLOCKWISE = 5458, + STR_ROTATE_ANTI_CLOCKWISE = 5459, STR_SHORTCUT_ROTATE_VIEW_ANTICLOCKWISE = 5460, STR_CHEAT_SET_GUESTS_PARAMETERS = 5461, @@ -2050,11 +2051,13 @@ enum { STR_START_SERVER = 5501, STR_MULTIPLAYER = 5502, STR_ENTER_HOSTNAME_OR_IP_ADDRESS = 5503, - STR_SHOW_MULTIPLAYER_STATUS_TIP = 5504, STR_UNABLE_TO_CONNECT_TO_SERVER = 5505, + STR_CHEAT_IGNORE_INTENSITY = 5506, + STR_HANDYMEN_MOW_BY_DEFAULT = 5507, + STR_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM = 5508, STR_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM_TIP = 5509, diff --git a/src/ride/ride.c b/src/ride/ride.c index 4645bd30a4..43a432f84e 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3586,13 +3586,13 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * if (setting == 0){ if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN){ - RCT2_GLOBAL(0x141E9AC, uint16) = 1796; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_HAS_BROKEN_DOWN_AND_REQUIRES_FIXING; *ebx = MONEY32_UNDEFINED; return; } if (ride->status != RIDE_STATUS_CLOSED){ - RCT2_GLOBAL(0x141E9AC, uint16) = 1006; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_MUST_BE_CLOSED_FIRST; *ebx = MONEY32_UNDEFINED; return; } @@ -3601,7 +3601,7 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * if (setting == 9 && ride->lifecycle_flags & RIDE_LIFECYCLE_CABLE_LIFT && new_value > 1){ - RCT2_GLOBAL(0x141E9AC, uint16) = 3141; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_MULTICIRCUIT_NOT_POSSIBLE_WITH_CABLE_LIFT_HILL; *ebx = MONEY32_UNDEFINED; return; } @@ -3708,17 +3708,17 @@ int ride_mode_check_valid_station_numbers(rct_ride *ride) case RIDE_MODE_POWERED_LAUNCH: case RIDE_MODE_LIM_POWERED_LAUNCH: if (no_stations <= 1) return 1; - RCT2_GLOBAL(0x141E9AC, uint16) = 1015; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_UNABLE_TO_OPERATE_WITH_MORE_THAN_ONE_STATION_IN_THIS_MODE; return 0; case RIDE_MODE_SHUTTLE: if (no_stations >= 2) return 1; - RCT2_GLOBAL(0x141E9AC, uint16) = 1016; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_UNABLE_TO_OPERATE_WITH_LESS_THAN_TWO_STATIONS_IN_THIS_MODE; return 0; } if (ride->type == RIDE_TYPE_GO_KARTS || ride->type == RIDE_TYPE_MINI_GOLF){ if (no_stations <= 1) return 1; - RCT2_GLOBAL(0x141E9AC, uint16) = 1015; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_UNABLE_TO_OPERATE_WITH_MORE_THAN_ONE_STATION_IN_THIS_MODE; return 0; } @@ -3787,12 +3787,12 @@ int ride_check_for_entrance_exit(int rideIndex) } if (entrance == 0){ - RCT2_GLOBAL(0x141E9AC, uint16) = 1146; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_ENTRANCE_NOT_YET_BUILT; return 0; } if (exit == 0){ - RCT2_GLOBAL(0x141E9AC, uint16) = 1147; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_EXIT_NOT_YET_BUILT; return 0; } @@ -6315,7 +6315,7 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio } if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 2214; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; return MONEY32_UNDEFINED; } @@ -6339,13 +6339,13 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio return MONEY32_UNDEFINED; } - if (RCT2_GLOBAL(0x00F1AD60, uint8) & (1 << 2)){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1031; + if (RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & (1 << 2)){ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_RIDE_CANT_BUILD_THIS_UNDERWATER; return MONEY32_UNDEFINED; } if (z > 1952){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 878; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_HIGH; return MONEY32_UNDEFINED; } @@ -6353,12 +6353,12 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio else{ rct_ride* ride = GET_RIDE(rideIndex); if (ride->status != RIDE_STATUS_CLOSED){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1006; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_MUST_BE_CLOSED_FIRST; return MONEY32_UNDEFINED; } if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 3092; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_NOT_ALLOWED_TO_MODIFY_STATION; return MONEY32_UNDEFINED; } @@ -6372,7 +6372,7 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio if (is_exit){ if (ride->exits[station_num] != 0xFFFF){ if (flags & (1 << 6)){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 0; return MONEY32_UNDEFINED; } @@ -6384,7 +6384,7 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio else{ if (ride->entrances[station_num] != 0xFFFF){ if (flags & (1 << 6)){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 0; return MONEY32_UNDEFINED; } @@ -6433,13 +6433,13 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio return MONEY32_UNDEFINED; } - if (RCT2_GLOBAL(0x00F1AD60, uint8) & (1 << 2)){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1031; + if (RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & ELEMENT_IS_UNDERWATER){ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_RIDE_CANT_BUILD_THIS_UNDERWATER; return MONEY32_UNDEFINED; } if (z / 8 > 244){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 878; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_HIGH; return MONEY32_UNDEFINED; } @@ -6501,13 +6501,13 @@ money32 remove_ride_entrance_or_exit(sint16 x, sint16 y, uint8 rideIndex, uint8 if (!(flags & (1 << 6))){ if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 2214; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; return MONEY32_UNDEFINED; } } if (ride->status != RIDE_STATUS_CLOSED){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1006; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_MUST_BE_CLOSED_FIRST; return MONEY32_UNDEFINED; } diff --git a/src/ride/track.c b/src/ride/track.c index d0d55b0fd0..da08a9d92e 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -2256,7 +2256,7 @@ int track_rename(const char *text) case '*': case '?': // Invalid characters - RCT2_GLOBAL(0x141E9AC, uint16) = 3353; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_NEW_NAME_CONTAINS_INVALID_CHARACTERS; return 0; } txt_chr++; @@ -2272,7 +2272,7 @@ int track_rename(const char *text) subsitute_path(old_path, RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), &RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, char)[128 * w->track_list.var_482]); if (!platform_file_move(old_path, new_path)) { - RCT2_GLOBAL(0x141E9AC, uint16) = 3354; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_ANOTHER_FILE_EXISTS_WITH_NAME_OR_FILE_IS_WRITE_PROTECTED; return 0; } @@ -2301,7 +2301,7 @@ int track_delete() subsitute_path(path, RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), &RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, char)[128 * w->track_list.var_482]); if (!platform_file_delete(path)) { - RCT2_GLOBAL(0x141E9AC, uint16) = 3355; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_FILE_IS_WRITE_PROTECTED_OR_LOCKED; return 0; } @@ -2431,7 +2431,7 @@ int copy_scenery_to_track(uint8** track_pointer){ y /= 32; if (x > 127 || y > 127 || x < -126 || y < -126){ - window_error_open(3346, 3347); + window_error_open(3346, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY); return 0; } @@ -2443,7 +2443,7 @@ int copy_scenery_to_track(uint8** track_pointer){ z /= 8; if (z > 127 || z < -126){ - window_error_open(3346, 3347); + window_error_open(3346, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY); return 0; } @@ -2487,7 +2487,7 @@ int maze_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_ } if (map_found == 0){ - RCT2_GLOBAL(0x00141E9AC, uint16) = 3347; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; return 0; } @@ -2516,7 +2516,7 @@ int maze_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_ maze++; if (maze >= RCT2_ADDRESS(0x009DA151, rct_maze_element)){ - RCT2_GLOBAL(0x00141E9AC, uint16) = 3347; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; return 0; } } while (!map_element_is_last_for_tile(map_element++)); @@ -2529,7 +2529,7 @@ int maze_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_ uint16 location = ride->entrances[0]; if (location == 0xFFFF){ - RCT2_GLOBAL(0x00141E9AC, uint16) = 3347; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; return 0; } @@ -2560,7 +2560,7 @@ int maze_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_ location = ride->exits[0]; if (location == 0xFFFF){ - RCT2_GLOBAL(0x00141E9AC, uint16) = 3347; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; return 0; } @@ -2628,7 +2628,7 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra track_begin_end trackBeginEnd; if (sub_6CAF80(rideIndex, &trackElement) == 0){ - RCT2_GLOBAL(0x00141E9AC, uint16) = 3347; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; return 0; } @@ -2649,7 +2649,7 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra RCT2_GLOBAL(0x00F4414D, uint8) = direction; if (sub_6C683D(&trackElement.x, &trackElement.y, &z, direction, track_type, 0, &trackElement.element, 0)){ - RCT2_GLOBAL(0x00141E9AC, uint16) = 3347; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; return 0; } @@ -2818,7 +2818,7 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra z /= 8; if (z > 127 || z < -126){ - RCT2_GLOBAL(0x00141E9AC, uint16) = 3347; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY; return 0; } @@ -2973,22 +2973,22 @@ int save_track_design(uint8 rideIndex){ rct_ride* ride = GET_RIDE(rideIndex); if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)){ - window_error_open(3346, RCT2_GLOBAL(0x141E9AC, rct_string_id)); + window_error_open(STR_CANT_SAVE_TRACK_DESIGN, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id)); return 0; } if (ride->ratings.excitement == 0xFFFF){ - window_error_open(3346, RCT2_GLOBAL(0x141E9AC, rct_string_id)); + window_error_open(STR_CANT_SAVE_TRACK_DESIGN, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id)); return 0; } if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_TRACK)) { - window_error_open(3346, RCT2_GLOBAL(0x141E9AC, rct_string_id)); + window_error_open(STR_CANT_SAVE_TRACK_DESIGN, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id)); return 0; } if (!ride_to_td6(rideIndex)){ - window_error_open(3346, RCT2_GLOBAL(0x141E9AC, rct_string_id)); + window_error_open(STR_CANT_SAVE_TRACK_DESIGN, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id)); return 0; } @@ -3187,7 +3187,7 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED)){ if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; *ebx = MONEY32_UNDEFINED; return; } @@ -3244,10 +3244,10 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int if (cost == MONEY32_UNDEFINED || !(flags & GAME_COMMAND_FLAG_APPLY)){ - rct_string_id error_reason = RCT2_GLOBAL(0x00141E9AC, rct_string_id); + rct_string_id error_reason = RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id); game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); *ebx = cost; - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = error_reason; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = error_reason; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION * 4; RCT2_GLOBAL(0x00F44121, money32) = cost; return; @@ -3490,7 +3490,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in RCT2_GLOBAL(0x00F441D5, uint32) = properties_1; RCT2_GLOBAL(0x00F441D9, uint32) = properties_2; RCT2_GLOBAL(0x00F441DD, uint32) = properties_3; - RCT2_GLOBAL(0x00F441D4, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_ABOVE_GROUND_FLAGS, uint8) = 0; uint64 enabledTrackPieces = 0; enabledTrackPieces |= rideEntry->enabledTrackPiecesB & RCT2_ADDRESS(0x01357644, uint32)[ride->type]; @@ -3670,16 +3670,16 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in return MONEY32_UNDEFINED; } - bh = RCT2_GLOBAL(0x00F1AD60, uint8) & 3; - if (RCT2_GLOBAL(0x00F441D4, uint8) != 0 && (RCT2_GLOBAL(0x00F441D4, uint8) & bh) == 0) { + bh = RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & 3; + if (RCT2_GLOBAL(RCT2_ADDRESS_ABOVE_GROUND_FLAGS, uint8) != 0 && (RCT2_GLOBAL(RCT2_ADDRESS_ABOVE_GROUND_FLAGS, uint8) & bh) == 0) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND; return MONEY32_UNDEFINED; } - RCT2_GLOBAL(0x00F441D4, uint8) = bh; + RCT2_GLOBAL(RCT2_ADDRESS_ABOVE_GROUND_FLAGS, uint8) = bh; if (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE) { if (RCT2_ADDRESS(0x0099443C, uint16)[type] & 0x200) { - if (RCT2_GLOBAL(0x00F441D4, uint8) & 2) { + if (RCT2_GLOBAL(RCT2_ADDRESS_ABOVE_GROUND_FLAGS, uint8) & TRACK_ELEMENT_LOCATION_IS_UNDERGROUND) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; return MONEY32_UNDEFINED; } @@ -3687,7 +3687,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in } else { if (RCT2_ADDRESS(0x0099423C, uint16)[type] & 0x200) { - if (RCT2_GLOBAL(0x00F441D4, uint8) & 2) { + if (RCT2_GLOBAL(RCT2_ADDRESS_ABOVE_GROUND_FLAGS, uint8) & TRACK_ELEMENT_LOCATION_IS_UNDERGROUND) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; return MONEY32_UNDEFINED; } @@ -3696,7 +3696,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in if (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE) { if (RCT2_ADDRESS(0x0099443C, uint16)[type] & 1) { - if (!(RCT2_GLOBAL(0x00F1AD60, uint8) & 4)) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & ELEMENT_IS_UNDERWATER)) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_UNDERWATER; return MONEY32_UNDEFINED; } @@ -3704,14 +3704,14 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in } else { if (RCT2_ADDRESS(0x0099423C, uint16)[type] & 1) { - if (RCT2_GLOBAL(0x00F1AD60, uint8) & 4) { + if (RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & ELEMENT_IS_UNDERWATER) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_UNDERWATER; return MONEY32_UNDEFINED; } } } - if (RCT2_GLOBAL(0x00F1AD60, uint8) & 4) { + if (RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & ELEMENT_IS_UNDERWATER) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_RIDE_CANT_BUILD_THIS_UNDERWATER; return MONEY32_UNDEFINED; } @@ -3978,7 +3978,7 @@ money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, } if (!(flags & (1 << 3)) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 2214; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; return MONEY32_UNDEFINED; } @@ -4019,7 +4019,7 @@ money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, } if (mapElement->flags & (1 << 6)){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 3091; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_YOU_ARE_NOT_ALLOWED_TO_REMOVE_THIS_SECTION; return MONEY32_UNDEFINED; } diff --git a/src/ride/track.h b/src/ride/track.h index 622aca98b3..219fd974d5 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -484,6 +484,10 @@ enum { TRACK_ELEM_LEFT_LARGE_HALF_LOOP_DOWN }; +enum { + TRACK_ELEMENT_LOCATION_IS_UNDERGROUND = 2, +}; + typedef struct { rct_xy_element last; rct_xy_element current; diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 054b3918a2..c0bea4d0ee 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -986,7 +986,7 @@ static void window_editor_object_selection_scroll_mousedown(rct_window *w, int s STR_UNABLE_TO_SELECT_THIS_OBJECT : STR_UNABLE_TO_DE_SELECT_THIS_OBJECT; - window_error_open(error_title, RCT2_GLOBAL(0x141E9AC, uint16)); + window_error_open(error_title, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16)); return; } @@ -1664,7 +1664,7 @@ void reset_required_object_flags(){ * object. */ void set_object_selection_error(uint8 is_master_object, rct_string_id error_msg){ - RCT2_GLOBAL(0x141E9AC, rct_string_id) = error_msg; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = error_msg; if (!is_master_object){ reset_selected_object_count_and_size(); } diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index 480ba6b44d..fd67695778 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -888,7 +888,7 @@ static void window_editor_objective_options_main_paint(rct_window *w, rct_drawpi // Objective value x = w->x + w->widgets[WIDX_OBJECTIVE].left + 1; y = w->y + w->widgets[WIDX_OBJECTIVE].top; - stringId = STR_OBJECTIVE_2_NONE + RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8); + stringId = STR_OBJECTIVE_DROPDOWN_NONE + RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8); gfx_draw_string_left(dpi, 1193, &stringId, 0, x, y); if (w->widgets[WIDX_OBJECTIVE_ARG_1].type != WWT_EMPTY) { diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index ff66d9fbef..78f7379f6f 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1579,7 +1579,7 @@ static void window_ride_construction_construct(rct_window *w) sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); - if (RCT2_GLOBAL(0x00F441D4, uint8) & 2) { + if (RCT2_GLOBAL(RCT2_ADDRESS_ABOVE_GROUND_FLAGS, uint8) & TRACK_ELEMENT_LOCATION_IS_UNDERGROUND) { viewport_set_visibility(1); } @@ -2382,7 +2382,7 @@ money32 sub_6CA162(int rideIndex, int trackType, int trackDirection, int edxRS16 RCT2_GLOBAL(0x00F440C9, uint16) = z; RCT2_GLOBAL(0x00F440CB, uint8) = trackDirection; _currentTrackSelectionFlags |= 2; - viewport_set_visibility(RCT2_GLOBAL(0x00F441D4, uint8) & 2 ? 1 : 3); + viewport_set_visibility(RCT2_GLOBAL(RCT2_ADDRESS_ABOVE_GROUND_FLAGS, uint8) & TRACK_ELEMENT_LOCATION_IS_UNDERGROUND ? 1 : 3); if (_currentTrackSlopeEnd != 0) viewport_set_visibility(2); @@ -2401,7 +2401,7 @@ money32 sub_6CA162(int rideIndex, int trackType, int trackDirection, int edxRS16 RCT2_GLOBAL(0x00F440C9, uint16) = z; RCT2_GLOBAL(0x00F440CB, uint8) = trackDirection; _currentTrackSelectionFlags |= 2; - viewport_set_visibility(RCT2_GLOBAL(0x00F441D4, uint8) & 2 ? 1 : 3); + viewport_set_visibility(RCT2_GLOBAL(RCT2_ADDRESS_ABOVE_GROUND_FLAGS, uint8) & TRACK_ELEMENT_LOCATION_IS_UNDERGROUND ? 1 : 3); if (_currentTrackSlopeEnd != 0) viewport_set_visibility(2); diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index ea22803649..43a9e9ba8c 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -1471,7 +1471,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w ebx |= GAME_COMMAND_FLAG_APPLY; } - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1161; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_POSITION_THIS_HERE; int cost = game_do_command(cur_grid_x, ebx, cur_grid_y, parameter_2, GAME_COMMAND_PLACE_SCENERY, RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint8) | (parameter_3 & 0xFFFF0000), RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16)); @@ -1485,8 +1485,8 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w break; } - if (RCT2_GLOBAL(0x00141E9AC, rct_string_id) == 827 || - RCT2_GLOBAL(0x00141E9AC, rct_string_id) == 1032){ + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_NOT_ENOUGH_CASH_REQUIRES || + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_CAN_ONLY_BUILD_THIS_ON_WATER){ break; } @@ -1509,7 +1509,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w ebx &= 0xFF00; ebx |= 0x81; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1161; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_POSITION_THIS_HERE; int cost = game_do_command(grid_x, ebx, grid_y, parameter_2, GAME_COMMAND_PLACE_PATH, parameter_3, 0); @@ -1546,8 +1546,8 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w return; } - if (RCT2_GLOBAL(0x00141E9AC, rct_string_id) == 827 || - RCT2_GLOBAL(0x00141E9AC, rct_string_id) == 1032){ + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_NOT_ENOUGH_CASH_REQUIRES || + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_CAN_ONLY_BUILD_THIS_ON_WATER){ break; } @@ -1569,7 +1569,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w for (; bl != 0; bl--){ RCT2_GLOBAL(0x009A8C29, uint8) |= 1; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1161; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_POSITION_THIS_HERE; int ebx = (parameter_1 & 0xFF00) | 1; @@ -1584,8 +1584,8 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w return; } - if (RCT2_GLOBAL(0x00141E9AC, rct_string_id) == 827 || - RCT2_GLOBAL(0x00141E9AC, rct_string_id) == 1032){ + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_NOT_ENOUGH_CASH_REQUIRES || + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_CAN_ONLY_BUILD_THIS_ON_WATER){ break; } @@ -1598,7 +1598,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w case 4: { // Banners - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1161; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_POSITION_THIS_HERE; // The return value will be banner id but the input is colour (param 3) int banner_id = parameter_3; @@ -2110,9 +2110,11 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = mapElement->base_height; RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT_TYPE, uint8) = mapElement->type; if (RCT2_GLOBAL(0x00F64F14, uint8) & (1 << 1)){ + //Set underground on viewport_set_visibility(4); } else{ + //Set underground off viewport_set_visibility(5); } @@ -2189,9 +2191,11 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = mapElement->base_height; if (RCT2_GLOBAL(0x00F64F14, uint8) & (1 << 1)){ + //Set underground on viewport_set_visibility(4); } else{ + //Set underground off viewport_set_visibility(5); } diff --git a/src/world/footpath.c b/src/world/footpath.c index eab90654f9..8f8b762e9c 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -167,8 +167,8 @@ static money32 footpath_element_insert(int type, int x, int y, int z, int slope, if (!gCheatsDisableClearanceChecks && !map_can_construct_with_clear_at(x, y, z, zHigh, (void*)0x006A6733, bl)) return MONEY32_UNDEFINED; - RCT2_GLOBAL(0x00F3EFA4, uint8) = RCT2_GLOBAL(0x00F1AD60, uint8); - if (!gCheatsDisableClearanceChecks && (RCT2_GLOBAL(0x00F1AD60, uint8) & 4)) { + RCT2_GLOBAL(0x00F3EFA4, uint8) = RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8); + if (!gCheatsDisableClearanceChecks && (RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & ELEMENT_IS_UNDERWATER)) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CANT_BUILD_THIS_UNDERWATER; return MONEY32_UNDEFINED; } diff --git a/src/world/map.c b/src/world/map.c index 1665ecc167..75bb3795b2 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2380,7 +2380,7 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi RCT2_GLOBAL(0x00F64F24, uint16) = y; RCT2_GLOBAL(0x00F64F1E, uint32) = (uint32)(ebx - 1); //0x006E0D6E uses [F64F1E+4] to read ebx value if(gCheatsDisableClearanceChecks || map_can_construct_with_clear_at(x, y, zLow, zHigh, (void*)0x006E0D6E, bl)){ - RCT2_GLOBAL(0x00F64F14, uint8) = RCT2_GLOBAL(0x00F1AD60, uint8) & 0x3; + RCT2_GLOBAL(0x00F64F14, uint8) = RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & 0x3; if(*ebx & GAME_COMMAND_FLAG_APPLY){ int flags = (bl & 0xf); rct_map_element* new_map_element = map_element_insert(x / 32, y / 32, zLow, flags); @@ -2484,7 +2484,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, } if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 2214; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; *ebx = MONEY32_UNDEFINED; return; } @@ -2536,14 +2536,14 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, water_height *= 16; if (position.z < water_height){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1180; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CANT_BUILD_THIS_UNDERWATER; *ebx = MONEY32_UNDEFINED; return; } } if (position.z / 8 < map_element->base_height){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1033; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; *ebx = MONEY32_UNDEFINED; return; } @@ -2553,7 +2553,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, bp += 2; if (map_element->properties.surface.slope & (1 << new_edge)){ if (position.z / 8 < bp){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1033; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; *ebx = MONEY32_UNDEFINED; return; } @@ -2566,7 +2566,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, if (map_element->properties.surface.slope & (1 << new_edge)){ bp += 2; if (position.z / 8 < bp){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1033; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; *ebx = MONEY32_UNDEFINED; return; } @@ -2579,7 +2579,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, new_edge = (edge + 3) & 3; if (map_element->properties.surface.slope & (1 << new_edge)){ if (position.z / 8 < bp){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1033; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; *ebx = MONEY32_UNDEFINED; return; } @@ -2592,7 +2592,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, if (map_element->properties.surface.slope & (1 << new_edge)){ bp += 2; if (position.z / 8 < bp){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1033; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; *ebx = MONEY32_UNDEFINED; return; } @@ -2632,7 +2632,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, RCT2_GLOBAL(0x00141F722, uint8) = position.z / 8; if (bp & 0xC0){ if (fence->wall.flags & WALL_SCENERY_FLAG3){ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 3133; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 3133; *ebx = MONEY32_UNDEFINED; return; } @@ -2846,8 +2846,8 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in RCT2_GLOBAL(0x00F43894, sint16) = y2; RCT2_GLOBAL(0x00F43896, uint32) = (uint32)(ebx - 3); // this is how ebx flags var is passed to 0x006B8D88 if(gCheatsDisableClearanceChecks || map_can_construct_with_clear_at(x2, y2, zLow, zHigh, (void*)0x006B8D88, bl)){ - if(!(RCT2_GLOBAL(0x00F1AD60, uint8) & 4) && !(RCT2_GLOBAL(0x00F1AD60, uint8) & 2)){ - int b = RCT2_GLOBAL(0x00F1AD60, uint8) & 0x3; + if(!(RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & ELEMENT_IS_UNDERWATER) && !(RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & 2)){ + int b = RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & 0x3; if (!gCheatsDisableClearanceChecks) { if (RCT2_GLOBAL(0x00F64F14, uint8) && !(RCT2_GLOBAL(0x00F64F14, uint8) & b)){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND; @@ -3121,7 +3121,7 @@ int sub_68B044() if (RCT2_GLOBAL(0x00140E9A4, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element)) return 1; else{ - RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 894; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 894; return 0; } } @@ -3189,7 +3189,7 @@ int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *cle { //return (RCT2_CALLPROC_X(0x0068B932, x, bl, y, (zHigh << 8) | zLow, 0, 0, (int)clearFunc) & 0x100) == 0; RCT2_GLOBAL(0x00F1AD40, void*) = clearFunc; - RCT2_GLOBAL(0x00F1AD60, uint8) = 1; + RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) = 1; if (x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16) || y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16) || x < 32 || y < 32) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_OFF_EDGE_OF_MAP; return false; @@ -3206,7 +3206,7 @@ int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *cle } int water_height = ((map_element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) * 2); if (water_height && water_height > zLow && map_element->base_height < zHigh) { - RCT2_GLOBAL(0x00F1AD60, uint8) |= 4; + RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) |= 4; if (water_height < zHigh) { goto loc_68BAE6; } @@ -3224,8 +3224,8 @@ int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *cle if ((bl & 0xF0) != 0xF0) { if (map_element->base_height >= zHigh) { // loc_68BA81 - RCT2_GLOBAL(0x00F1AD60, uint8) |= 2; - RCT2_GLOBAL(0x00F1AD60, uint8) &= 0xFE; + RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) |= 2; + RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) &= 0xFE; } else { int al = map_element->base_height; int ah = al; diff --git a/src/world/map.h b/src/world/map.h index 3f71c14227..5f26f71ed7 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -203,6 +203,10 @@ enum { ENTRANCE_TYPE_PARK_ENTRANCE }; +enum { + ELEMENT_IS_UNDERWATER = 4, +}; + #define MAP_ELEMENT_QUADRANT_MASK 0xC0 #define MAP_ELEMENT_TYPE_MASK 0x3C #define MAP_ELEMENT_DIRECTION_MASK 0x03 From 592b6f578d9e723d56645842bca5cd003c3b549c Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 27 Aug 2015 16:27:05 +0200 Subject: [PATCH 0597/1173] Fix oversight in string order --- src/localisation/string_ids.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 255c907cb0..9483dca591 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1895,9 +1895,9 @@ enum { STR_CHEAT_SANDBOX_MODE = 5278, STR_CHEAT_SANDBOX_MODE_DISABLE = 5279, STR_CHEAT_SANDBOX_MODE_TIP = 5280, - STR_CHEAT_TIP_EXPLODE = 5286, STR_CHEAT_EXPLODE = 5285, + STR_CHEAT_TIP_EXPLODE = 5286, STR_CHEAT_TIP_CLEAR_LOAN = 5301, STR_CHEAT_CLEAR_LOAN = 5302, From 4d7a81bfe0fd11e628ac3cc5e29b20a64f48c48f Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 27 Aug 2015 16:44:18 +0200 Subject: [PATCH 0598/1173] Remove unnecessary duplicate address, use more string constants --- src/addresses.h | 1 - src/game.c | 4 ++-- src/interface/viewport_interaction.c | 4 ++-- src/localisation/string_ids.h | 33 +++++++++++++++++---------- src/peep/staff.c | 2 +- src/windows/demolish_ride_prompt.c | 2 +- src/windows/footpath.c | 4 ++-- src/windows/guest.c | 2 +- src/windows/map.c | 2 +- src/windows/sign.c | 4 ++-- src/windows/staff.c | 2 +- src/windows/top_toolbar.c | 34 ++++++++++++++-------------- 12 files changed, 51 insertions(+), 43 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 09e92b50b5..63d03c17a3 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -510,7 +510,6 @@ #define RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT 0x0141E9AC #define RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE 0x0141E9AE -#define RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID 0x0141E9AE #define RCT2_ADDRESS_CURRENT_ROTATION 0x0141E9E0 #define RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS 0x0141E9E4 diff --git a/src/game.c b/src/game.c index 5bbe338ad7..ba6c818676 100644 --- a/src/game.c +++ b/src/game.c @@ -726,7 +726,7 @@ int game_load_sv6(SDL_RWops* rw) log_error("invalid checksum"); RCT2_GLOBAL(RCT2_ADDRESS_ERROR_TYPE, uint8) = 255; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = STR_FILE_CONTAINS_INVALID_DATA; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_FILE_CONTAINS_INVALID_DATA; return 0; } @@ -857,7 +857,7 @@ int game_load_save(const char *path) if (rw == NULL) { log_error("unable to open %s", path); RCT2_GLOBAL(RCT2_ADDRESS_ERROR_TYPE, uint8) = 255; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = STR_FILE_CONTAINS_INVALID_DATA; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_FILE_CONTAINS_INVALID_DATA; return 0; } diff --git a/src/interface/viewport_interaction.c b/src/interface/viewport_interaction.c index b3c7897a56..8d570cacec 100644 --- a/src/interface/viewport_interaction.c +++ b/src/interface/viewport_interaction.c @@ -484,7 +484,7 @@ static void viewport_interaction_remove_park_wall(rct_map_element *mapElement, i if (sceneryEntry->wall.var_0D != 0xFF){ window_sign_small_open(mapElement->properties.fence.item[0]); } else { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_REMOVE_THIS; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_REMOVE_THIS; game_do_command( x, GAME_COMMAND_FLAG_APPLY, @@ -513,7 +513,7 @@ static void viewport_interaction_remove_large_scenery(rct_map_element *mapElemen ((mapElement->properties.scenerymultiple.colour[1] & 0xE0) >> 5); window_sign_open(id); } else { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1158; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_REMOVE_THIS; game_do_command( x, 1 | ((mapElement->type & 0x3) << 8), diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 9483dca591..f0f09cf83b 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -516,6 +516,8 @@ enum { STR_RIDE_CONSTRUCTION_OTHER_TRACK_CONFIGURATIONS_TIP = 1385, STR_RIDE_CONSTRUCTION_SPECIAL = 1386, + STR_CANT_CHANGE_LAND_TYPE = 1387, + STR_VIEW_OF_RIDE_ATTRACTION_TIP = 1392, STR_VEHICLE_DETAILS_AND_OPTIONS_TIP = 1393, STR_OPERATING_OPTIONS_TIP = 1394, @@ -568,6 +570,8 @@ enum { STR_LEAVING_PARK = 1447, STR_WATCHING_NEW_RIDE_BEING_CONSTRUCTED = 1448, + STR_CANT_NAME_GUEST = 1454, + STR_RIDE_CONSTRUCTION_TRACK_STYLE = 1459, STR_RIDE_CONSTRUCTION_U_SHAPED_OPEN_TRACK_TIP = 1460, STR_RIDE_CONSTRUCTION_O_SHAPED_ENCLOSED_TRACK_TIP = 1461, @@ -874,11 +878,6 @@ enum { STR_ON_RIDE_PHOTO_PRICE = 1963, - STR_MAIN_COLOUR_SCHEME = 2971, - STR_ALTERNATIVE_COLOUR_SCHEME_1 = 2972, - STR_ALTERNATIVE_COLOUR_SCHEME_2 = 2973, - STR_ALTERNATIVE_COLOUR_SCHEME_3 = 2974, - STR_SHOP_ITEM_SINGULAR_BALLOON = 1988, STR_SHOP_ITEM_SINGULAR_CUDDLY_TOY = 1989, STR_SHOP_ITEM_SINGULAR_PARK_MAP = 1990, @@ -1487,6 +1486,13 @@ enum { STR_MUSIC_ACKNOWLEDGEMENTS_ELLIPSIS = 2862, STR_MUSIC_ACKNOWLEDGEMENTS = 2863, + STR_MAIN_COLOUR_SCHEME = 2971, + STR_ALTERNATIVE_COLOUR_SCHEME_1 = 2972, + STR_ALTERNATIVE_COLOUR_SCHEME_2 = 2973, + STR_ALTERNATIVE_COLOUR_SCHEME_3 = 2974, + + STR_CANT_NAME_STAFF_MEMBER = 2979, + STR_TOO_MANY_BANNERS_IN_GAME = 2980, STR_NO_ENTRY = 2981, @@ -1564,6 +1570,12 @@ enum { STR_RIDE_CONSTRUCTION_STANDARD_RC_TRACK_TIP = 3062, STR_RIDE_CONSTRUCTION_WATER_CHANNEL_TIP = 3063, + STR_BEGINNER_PARKS = 3064, + STR_CHALLENGING_PARKS = STR_BEGINNER_PARKS + 1, + STR_EXPERT_PARKS = STR_BEGINNER_PARKS + 2, + STR_REAL_PARKS = STR_BEGINNER_PARKS + 3, + STR_OTHER_PARKS = STR_BEGINNER_PARKS + 4, + STR_TOP_SECTION = 3069, STR_SLOPE_TO_LEVEL = 3070, @@ -1592,6 +1604,7 @@ enum { STR_SELECT_STYLE_OF_ENTRANCE_EXIT_STATION_TIP = 3090, STR_YOU_ARE_NOT_ALLOWED_TO_REMOVE_THIS_SECTION = 3091, + STR_NOT_ALLOWED_TO_MODIFY_STATION = 3092, STR_SELECT_LIFT_HILL_CHAIN_SPEED_TIP = 3097, @@ -1599,13 +1612,7 @@ enum { STR_SELECT_SECONDARY_COLOUR = 3100, STR_SELECT_TERNARY_COLOUR = 3101, - STR_BEGINNER_PARKS = 3064, - STR_CHALLENGING_PARKS = STR_BEGINNER_PARKS + 1, - STR_EXPERT_PARKS = STR_BEGINNER_PARKS + 2, - STR_REAL_PARKS = STR_BEGINNER_PARKS + 3, - STR_OTHER_PARKS = STR_BEGINNER_PARKS + 4, - - STR_NOT_ALLOWED_TO_MODIFY_STATION = 3092, + STR_CANT_REPAINT_THIS = 3103, STR_LIST_RIDES_TIP = 3104, STR_LIST_SHOPS_AND_STALLS_TIP = 3105, @@ -1836,6 +1843,8 @@ enum { STR_SET_PATROL_AREA = 3445, STR_CLEAR_PATROL_AREA = 3446, + STR_UNABLE_TO_REMOVE_ALL_SCENERY_FROM_HERE = 3438, + STR_OPENRCT2_BEGIN_STRING_ID = 5120, STR_FINANCES_BUTTON_ON_TOOLBAR = 5120, diff --git a/src/peep/staff.c b/src/peep/staff.c index c28dd35e0e..270d6c5e62 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -386,7 +386,7 @@ void update_staff_colour(uint8 staffType, uint16 colour) */ uint16 hire_new_staff_member(uint8 staffType) { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = STR_CANT_HIRE_NEW_STAFF; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_HIRE_NEW_STAFF; int eax, ebx, ecx, edx, esi, edi, ebp; eax = 0x8000; diff --git a/src/windows/demolish_ride_prompt.c b/src/windows/demolish_ride_prompt.c index 2361ee46e1..0f95dd8269 100644 --- a/src/windows/demolish_ride_prompt.c +++ b/src/windows/demolish_ride_prompt.c @@ -111,7 +111,7 @@ static void window_ride_demolish_mouseup(rct_window *w, int widgetIndex) { switch (widgetIndex) { case WIDX_DEMOLISH: - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_DEMOLISH_RIDE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_DEMOLISH_RIDE; game_do_command(0, 1, 0, w->number, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); break; case WIDX_CANCEL: diff --git a/src/windows/footpath.c b/src/windows/footpath.c index e5bb79141c..2dcbfe94e0 100644 --- a/src/windows/footpath.c +++ b/src/windows/footpath.c @@ -753,7 +753,7 @@ static void window_footpath_place_path_at_point(int x, int y) selectedType = (RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_PATH_TYPE, uint8) << 7) + RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_PATH_ID, uint8); // Try and place path - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = STR_CANT_BUILD_FOOTPATH_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_BUILD_FOOTPATH_HERE; cost = footpath_place(selectedType, x, y, z, presentType, GAME_COMMAND_FLAG_APPLY); if (cost == MONEY32_UNDEFINED) { @@ -909,7 +909,7 @@ static void footpath_remove_map_element(rct_map_element *mapElement) } // Remove path - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = STR_CANT_REMOVE_FOOTPATH_FROM_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_REMOVE_FOOTPATH_FROM_HERE; footpath_remove( RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_Y, uint16), diff --git a/src/windows/guest.c b/src/windows/guest.c index fdcf4e1d2c..846a8a9d3d 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -1102,7 +1102,7 @@ void window_guest_overview_text_input(rct_window *w, int widgetIndex, char *text if (text == NULL) return; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = 1454; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_NAME_GUEST; game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 0)), GAME_COMMAND_SET_PEEP_NAME, *((int*)(text + 8)), *((int*)(text + 4))); game_do_command(2, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 12)), GAME_COMMAND_SET_PEEP_NAME, *((int*)(text + 20)), *((int*)(text + 16))); game_do_command(0, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 24)), GAME_COMMAND_SET_PEEP_NAME, *((int*)(text + 32)), *((int*)(text + 28))); diff --git a/src/windows/map.c b/src/windows/map.c index dc3007b265..7f69195056 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -550,7 +550,7 @@ static void window_map_scrollmousedown(rct_window *w, int scrollIndex, int x, in RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16) = mapY + size; map_invalidate_selection_rect(); - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1387; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_CHANGE_LAND_TYPE; game_do_command( RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16), GAME_COMMAND_FLAG_APPLY, diff --git a/src/windows/sign.c b/src/windows/sign.c index 29aac407f2..aae51c5078 100644 --- a/src/windows/sign.c +++ b/src/windows/sign.c @@ -522,7 +522,7 @@ static void window_sign_small_mouseup(rct_window *w, int widgetIndex) } map_element++; } - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1158; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_REMOVE_THIS; game_do_command( x, 1 | ((map_element->type & 0x3) << 8), @@ -612,4 +612,4 @@ static void window_sign_small_invalidate(rct_window *w) main_colour_btn->image = (w->list_information_type << 19) | 0x600013C3; text_colour_btn->image = (w->var_492 << 19) | 0x600013C3; -} \ No newline at end of file +} diff --git a/src/windows/staff.c b/src/windows/staff.c index 2eb8a4fb87..29aa3b50e2 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -1161,7 +1161,7 @@ void window_staff_overview_text_input(rct_window *w, int widgetIndex, char *text if (text == NULL) return; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, uint16) = 2979; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_NAME_STAFF_MEMBER; game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 0)), GAME_COMMAND_SET_PEEP_NAME, *((int*)(text + 8)), *((int*)(text + 4))); game_do_command(2, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 12)), GAME_COMMAND_SET_PEEP_NAME, *((int*)(text + 20)), *((int*)(text + 16))); game_do_command(0, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 24)), GAME_COMMAND_SET_PEEP_NAME, *((int*)(text + 32)), *((int*)(text + 28))); diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 43a9e9ba8c..720c485ce0 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -891,7 +891,7 @@ static void repaint_scenery_tool_down(sint16 x, sint16 y, sint16 widgetIndex){ SMALL_SCENERY_FLAG10))) return; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 3103; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_REPAINT_THIS; game_do_command( grid_x, 1 | (map_element->type << 8), @@ -912,7 +912,7 @@ static void repaint_scenery_tool_down(sint16 x, sint16 y, sint16 widgetIndex){ WALL_SCENERY_FLAG2))) return; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 3103; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_REPAINT_THIS; game_do_command( grid_x, 1 | (window_scenery_primary_colour << 8), @@ -932,7 +932,7 @@ static void repaint_scenery_tool_down(sint16 x, sint16 y, sint16 widgetIndex){ (1 << 0))) return; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 3103; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_REPAINT_THIS; game_do_command( grid_x, 1 | ((map_element->type & MAP_ELEMENT_DIRECTION_MASK) << 8), @@ -953,7 +953,7 @@ static void repaint_scenery_tool_down(sint16 x, sint16 y, sint16 widgetIndex){ (1 << 0))) return; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 3103; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_REPAINT_THIS; game_do_command( grid_x, 1, @@ -1471,7 +1471,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w ebx |= GAME_COMMAND_FLAG_APPLY; } - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_POSITION_THIS_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_POSITION_THIS_HERE; int cost = game_do_command(cur_grid_x, ebx, cur_grid_y, parameter_2, GAME_COMMAND_PLACE_SCENERY, RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint8) | (parameter_3 & 0xFFFF0000), RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16)); @@ -1509,7 +1509,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w ebx &= 0xFF00; ebx |= 0x81; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_POSITION_THIS_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_POSITION_THIS_HERE; int cost = game_do_command(grid_x, ebx, grid_y, parameter_2, GAME_COMMAND_PLACE_PATH, parameter_3, 0); @@ -1532,7 +1532,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w for (; bl != 0; bl--){ RCT2_GLOBAL(0x009A8C29, uint8) |= 1; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1811; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_BUILD_PARK_ENTRANCE_HERE; int ebx = (parameter_1 & 0xFF00) | 1; @@ -1569,7 +1569,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w for (; bl != 0; bl--){ RCT2_GLOBAL(0x009A8C29, uint8) |= 1; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_POSITION_THIS_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_POSITION_THIS_HERE; int ebx = (parameter_1 & 0xFF00) | 1; @@ -1598,7 +1598,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w case 4: { // Banners - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_POSITION_THIS_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_POSITION_THIS_HERE; // The return value will be banner id but the input is colour (param 3) int banner_id = parameter_3; @@ -2520,7 +2520,7 @@ static void window_top_toolbar_tool_down(rct_window* w, int widgetIndex, int x, if (!RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & (1 << 0)) break; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 3438; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_UNABLE_TO_REMOVE_ALL_SCENERY_FROM_HERE; game_do_command( RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16), @@ -2535,7 +2535,7 @@ static void window_top_toolbar_tool_down(rct_window* w, int widgetIndex, int x, break; case WIDX_LAND: if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16)&(1 << 0)){ - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1387; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_CHANGE_LAND_TYPE; game_do_command( RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16), 1, @@ -2573,7 +2573,7 @@ money32 selection_raise_land(uint8 flags) uint32 xBounds = (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16) & 0xFFFF) | (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, sint16) << 16); uint32 yBounds = (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16) & 0xFFFF) | (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16) << 16); - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_RAISE_LAND_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_RAISE_LAND_HERE; if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) == 0) { return game_do_command(centreX, flags, centreY, xBounds, GAME_COMMAND_EDIT_LAND_SMOOTH, 1, yBounds); } else { @@ -2595,7 +2595,7 @@ money32 selection_lower_land(uint8 flags) uint32 xBounds = (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16) & 0xFFFF) | (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, sint16) << 16); uint32 yBounds = (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16) & 0xFFFF) | (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16) << 16); - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_LOWER_LAND_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_LOWER_LAND_HERE; if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) == 0) { return game_do_command(centreX, flags, centreY, xBounds, GAME_COMMAND_EDIT_LAND_SMOOTH, 0xFFFF, yBounds); } else { @@ -2675,7 +2675,7 @@ void window_top_toolbar_water_tool_drag(short x, short y) if (y <= dx) { RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DRAG_LAST_Y, uint16) += dx; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_RAISE_WATER_LEVEL_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_RAISE_WATER_LEVEL_HERE; game_do_command( RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16), @@ -2697,7 +2697,7 @@ void window_top_toolbar_water_tool_drag(short x, short y) if (y >= dx) { RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DRAG_LAST_Y, uint16) += dx; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_LOWER_WATER_LEVEL_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_LOWER_WATER_LEVEL_HERE; game_do_command( RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16), @@ -2729,7 +2729,7 @@ static void window_top_toolbar_tool_drag(rct_window* w, int widgetIndex, int x, if (!RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & (1 << 0)) break; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 3438; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_UNABLE_TO_REMOVE_ALL_SCENERY_FROM_HERE; game_do_command( RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16), @@ -2746,7 +2746,7 @@ static void window_top_toolbar_tool_drag(rct_window* w, int widgetIndex, int x, // Custom setting to only change land style instead of raising or lowering land if (LandPaintMode) { if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16)&(1 << 0)){ - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = 1387; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_CHANGE_LAND_TYPE; game_do_command( RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16), 1, From e9b528248671e82f7c4fc9e967c59fa1353a25e4 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 27 Aug 2015 17:24:23 +0200 Subject: [PATCH 0599/1173] Add a console option to fix the banner count, fixes #667 --- src/interface/console.c | 10 +++++++++- src/world/banner.c | 9 +++++++++ src/world/banner.h | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/interface/console.c b/src/interface/console.c index 4c6529ef03..029a44ad9e 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -14,6 +14,7 @@ #include "../input.h" #include "../network/twitch.h" #include "../object.h" +#include "../world/banner.h" #include "../world/scenery.h" #include "../management/research.h" #include "console.h" @@ -840,6 +841,12 @@ static int cc_reset_user_strings(const utf8 **argv, int argc) return 0; } +static int cc_fix_banner_count(const utf8 **argv, int argc) +{ + fix_banner_count(); + return 0; +} + static int cc_open(const utf8 **argv, int argc) { if (argc > 0) { bool title = (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) != 0; @@ -930,7 +937,8 @@ console_command console_command_table[] = { "load_object " }, { "object_count", cc_object_count, "Shows the number of objects of each type in the scenario.", "object_count" }, { "twitch", cc_twitch, "Twitch API" }, - { "reset_user_strings", cc_reset_user_strings, "Resets all user-defined strings, to fix incorrectly occurring 'Chosen name in use already' errors.", "reset_user_strings" } + { "reset_user_strings", cc_reset_user_strings, "Resets all user-defined strings, to fix incorrectly occurring 'Chosen name in use already' errors.", "reset_user_strings" }, + { "fix_banner_count", cc_fix_banner_count, "Fixes incorrectly appearing 'Too many banners' error by marking every banner entry without a map element as null..", "fix_banner_count" } }; static int cc_windows(const utf8 **argv, int argc) { diff --git a/src/world/banner.c b/src/world/banner.c index 61a9a61d63..64b1bbeaeb 100644 --- a/src/world/banner.c +++ b/src/world/banner.c @@ -163,3 +163,12 @@ int banner_get_closest_ride_index(int x, int y, int z) return rideIndex; } + +void fix_banner_count() +{ + for (int banner_index = 0; banner_index < MAX_BANNERS; banner_index++){ + rct_map_element *map_element = banner_get_map_element(banner_index); + if(map_element==NULL) + gBanners[banner_index].type = BANNER_NULL; + } +} diff --git a/src/world/banner.h b/src/world/banner.h index e38176d029..131fc1d9c4 100644 --- a/src/world/banner.h +++ b/src/world/banner.h @@ -49,5 +49,6 @@ void banner_init(); int create_new_banner(uint8 flags); rct_map_element *banner_get_map_element(int bannerIndex); int banner_get_closest_ride_index(int x, int y, int z); +void fix_banner_count(); #endif From 7a4c418d9e5a8c45a41ef1a61360b784123c25c0 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 28 Aug 2015 17:55:50 +0100 Subject: [PATCH 0600/1173] fix #1487 --- src/scenario.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/scenario.c b/src/scenario.c index 2b3a515032..5671b7cb90 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -965,6 +965,8 @@ int scenario_save(SDL_RWops* rw, int flags) memcpy(s6->map_elements, (void*)0x00F663B8, 0x180000); memcpy(&s6->dword_010E63B8, (void*)0x010E63B8, 0x2E8570); + strncpy(s6->scenario_filename, _scenarioFileName, sizeof(s6->scenario_filename)); + scenario_fix_ghosts(s6); game_convert_strings_to_rct2(s6); scenario_save_s6(rw, s6); From 20c7267b5395fd3061923412a45efe92de08e9fd Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 28 Aug 2015 23:27:31 +0200 Subject: [PATCH 0601/1173] Don't show the Network status toolbar button in the Editors --- src/windows/top_toolbar.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 5e5797a3a6..7a46c18738 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -639,6 +639,7 @@ static void window_top_toolbar_invalidate(rct_window *w) window_top_toolbar_widgets[WIDX_RESEARCH].type = WWT_EMPTY; window_top_toolbar_widgets[WIDX_CHEATS].type = WWT_EMPTY; window_top_toolbar_widgets[WIDX_NEWS].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_NETWORK].type = WWT_EMPTY; if (g_editor_step != EDITOR_STEP_LANDSCAPE_EDITOR) { window_top_toolbar_widgets[WIDX_MAP].type = WWT_EMPTY; From f0100a71a711ea6879c3dd3d7b572a986623ab26 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 29 Aug 2015 02:04:54 +0100 Subject: [PATCH 0602/1173] use windows lean and mean to reduce definition conflicts --- src/audio/audio.c | 54 ++++++++++++++++++++++++++++++++++++---- src/audio/audio.h | 55 ++++++----------------------------------- src/audio/mixer.cpp | 2 ++ src/audio/mixer.h | 7 ++++++ src/network/network.cpp | 2 ++ src/platform/platform.h | 6 ++--- src/rct2.c | 2 +- 7 files changed, 72 insertions(+), 56 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 4418a6e017..d94dea542a 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -18,6 +18,8 @@ * along with this program. If not, see . *****************************************************************************/ +#include + #include "../addresses.h" #include "../config.h" #include "../interface/viewport.h" @@ -31,6 +33,34 @@ #include "mixer.h" #include "../openrct2.h" +typedef struct { + uint32 playing; // 0x000 + uint32 var_4; + char filename[MAX_PATH]; // 0x008 + uint32 var_10C; + uint32 var_110; + uint32 var_114; + uint32 var_118; + HGLOBAL hmem; // 0x11C + HMMIO hmmio; // 0x120 + MMCKINFO mmckinfo1; // 0x124 + MMCKINFO mmckinfo2; // 0x138 + LPDIRECTSOUNDBUFFER dsbuffer; // 0x14C + uint32 bufsize; // 0x150 + uint32 playpos; // 0x154 + uint32 var_158; + uint32 var_15C; + uint32 stopped; // 0x160 + uint32 var_164; + uint32 var_168; +} rct_sound_channel; + +struct rct_sound_effect { + uint32 size; + WAVEFORMATEX format; + uint8* data; +}; + int gAudioDeviceCount; audio_device *gAudioDevices = NULL; rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS]; @@ -43,6 +73,20 @@ void *gCrowdSoundChannel = 0; void *gTitleMusicChannel = 0; bool gGameSoundsOff = false; +void audio_timefunc(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2, int channel); +int sound_effect_loadvars(struct rct_sound_effect* sound_effect, LPWAVEFORMATEX* waveformat, char** data, DWORD* buffersize); +MMRESULT mmio_open(const char* filename, HMMIO* hmmio, HGLOBAL* hmem, LPMMCKINFO mmckinfo); +MMRESULT mmio_read(HMMIO hmmio, uint32 size, char* buffer, LPMMCKINFO mmckinfo, int* read); +MMRESULT mmio_seek(HMMIO* hmmio, LPMMCKINFO mmckinfo1, LPMMCKINFO mmckinfo2, int offset); +int mmio_open_channel(int channel, char* filename, LONG offset); +BOOL CALLBACK dsound_enum_callback_count(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext); +BOOL CALLBACK dsound_enum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext); +int CALLBACK audio_timer_callback(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2); +int sound_fill_buffer(LPDIRECTSOUNDBUFFER dsbuffer, char* src, DWORD size); +void sound_channel_free(HMMIO* hmmio, HGLOBAL* hmem); +LPVOID map_file(LPCSTR lpFileName, DWORD dwCreationDisposition, DWORD dwNumberOfBytesToMap); +int unmap_file(LPCVOID base); + void audio_init(int i) { if (SDL_Init(SDL_INIT_AUDIO) < 0) { @@ -693,7 +737,7 @@ int sound_prepare(int sound_id, rct_sound *sound, int channels, int software) return 1; } } - rct_sound_effect* sound_effect = sound_get_effect(sound_id); + struct rct_sound_effect* sound_effect = sound_get_effect(sound_id); if (sound_effect) { if (sound_effect_loadvars(sound_effect, &bufferdesc.lpwfxFormat, &buffer, &bufferdesc.dwBufferBytes)) { if (channels == 0){ @@ -943,7 +987,7 @@ BOOL CALLBACK dsound_enum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCS * * rct2: 0x00405054 */ -int sound_effect_loadvars(rct_sound_effect* sound_effect, LPWAVEFORMATEX* waveformat, char** data, DWORD* buffersize) +int sound_effect_loadvars(struct rct_sound_effect* sound_effect, LPWAVEFORMATEX* waveformat, char** data, DWORD* buffersize) { *buffersize = sound_effect->size; *waveformat = &sound_effect->format; @@ -1050,7 +1094,7 @@ int sound_bufferlost_restore(rct_sound* sound) char* data = 0; if (sound) { if (SUCCEEDED(sound->dsbuffer->lpVtbl->Restore(sound->dsbuffer))) { - rct_sound_effect* sound_effect = sound_get_effect(sound->id); + struct rct_sound_effect* sound_effect = sound_get_effect(sound->id); if (sound_effect != 0) { return sound_effect_loadvars(sound_effect, &waveformat, &data, &buffersize) && sound_fill_buffer(sound->dsbuffer, data, buffersize); } @@ -1063,10 +1107,10 @@ int sound_bufferlost_restore(rct_sound* sound) * * rct2: 0x00405206 */ -rct_sound_effect* sound_get_effect(uint16 sound_id) +struct rct_sound_effect* sound_get_effect(uint16 sound_id) { if (RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID) && sound_id < RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, uint32*)[0]) { - return (rct_sound_effect*)(RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, int) + RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, uint32*)[sound_id + 1]); + return (struct rct_sound_effect*)(RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, int) + RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, uint32*)[sound_id + 1]); } return 0; } diff --git a/src/audio/audio.h b/src/audio/audio.h index aee7f80f00..648d937ac7 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -21,6 +21,8 @@ #ifndef _AUDIO_H_ #define _AUDIO_H_ +#include + #include "../common.h" #include "../world/sprite.h" @@ -38,22 +40,20 @@ void audio_init(); void audio_quit(); void audio_get_devices(); -#include - /** * Represents a single directsound device. */ typedef struct { GUID guid; - CHAR desc[256]; - CHAR drvname[256]; + char desc[256]; + char drvname[256]; } rct_dsdevice; /** * Represents a prepared sound. */ typedef struct rct_sound { - LPDIRECTSOUNDBUFFER dsbuffer; + struct IDirectSoundBuffer *dsbuffer; uint16 id; uint16 var_8; int has_caps; @@ -61,34 +61,6 @@ typedef struct rct_sound { struct rct_sound* next; } rct_sound; -typedef struct { - uint32 playing; // 0x000 - uint32 var_4; - char filename[MAX_PATH]; // 0x008 - uint32 var_10C; - uint32 var_110; - uint32 var_114; - uint32 var_118; - HGLOBAL hmem; // 0x11C - HMMIO hmmio; // 0x120 - MMCKINFO mmckinfo1; // 0x124 - MMCKINFO mmckinfo2; // 0x138 - LPDIRECTSOUNDBUFFER dsbuffer; // 0x14C - uint32 bufsize; // 0x150 - uint32 playpos; // 0x154 - uint32 var_158; - uint32 var_15C; - uint32 stopped; // 0x160 - uint32 var_164; - uint32 var_168; -} rct_sound_channel; - -typedef struct { - uint32 size; - WAVEFORMATEX format; - uint8* data; -} rct_sound_effect; - typedef struct { uint16 id; sint16 volume; // 0x02 @@ -147,6 +119,8 @@ typedef struct { uint8 var_9; } rct_ride_music_info; +struct rct_sound_effect; + #define NUM_DEFAULT_MUSIC_TRACKS 46 extern rct_ride_music_info* ride_music_info_list[NUM_DEFAULT_MUSIC_TRACKS]; extern rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS]; @@ -159,12 +133,9 @@ extern void *gCrowdSoundChannel; extern void *gTitleMusicChannel; extern bool gGameSoundsOff; -void audio_timefunc(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2, int channel); -int CALLBACK audio_timer_callback(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2); int sub_40153B(int channel); int sub_4015E7(int channel); int sound_channel_load_file(int channel, const char* filename, int offset); -int mmio_open_channel(int channel, char* filename, LONG offset); int audio_create_timer(); int audio_remove_timer(); int sound_channel_load_file2(int channel, const char* filename, int offset); @@ -191,23 +162,13 @@ int sound_set_pan(rct_sound* sound, int pan); int sound_set_volume(rct_sound* sound, int volume); int sound_load3dparameters(); int sound_load3dposition(); -BOOL CALLBACK dsound_enum_callback_count(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext); int dsound_count_devices(); -BOOL CALLBACK dsound_enum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext); -int sound_effect_loadvars(rct_sound_effect* sound_effect, LPWAVEFORMATEX* waveformat, char** data, DWORD* buffersize); -int sound_fill_buffer(LPDIRECTSOUNDBUFFER dsbuffer, char* src, DWORD size); rct_sound* sound_begin(); rct_sound* sound_next(rct_sound* sound); rct_sound* sound_add(rct_sound* sound); rct_sound* sound_remove(rct_sound* sound); int sound_bufferlost_restore(rct_sound* sound); -rct_sound_effect* sound_get_effect(uint16 sound_id); -MMRESULT mmio_open(const char* filename, HMMIO* hmmio, HGLOBAL* hmem, LPMMCKINFO mmckinfo); -MMRESULT mmio_read(HMMIO hmmio, uint32 size, char* buffer, LPMMCKINFO mmckinfo, int* read); -void sound_channel_free(HMMIO* hmmio, HGLOBAL* hmem); -MMRESULT mmio_seek(HMMIO* hmmio, LPMMCKINFO mmckinfo1, LPMMCKINFO mmckinfo2, int offset); -LPVOID map_file(LPCSTR lpFileName, DWORD dwCreationDisposition, DWORD dwNumberOfBytesToMap); -int unmap_file(LPCVOID base); +struct rct_sound_effect* sound_get_effect(uint16 sound_id); int dsound_create_primary_buffer(int a, int device, int channels, int samples, int bits); int get_dsound_devices(); int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z); diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index 0ba7743bee..9a3d2c6da5 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -18,6 +18,8 @@ * along with this program. If not, see . *****************************************************************************/ +#include + extern "C" { #include "../config.h" #include "../platform/platform.h" diff --git a/src/audio/mixer.h b/src/audio/mixer.h index 679f7ef0af..3f592fa6f3 100644 --- a/src/audio/mixer.h +++ b/src/audio/mixer.h @@ -186,6 +186,13 @@ extern "C" { #endif +#ifndef DSBPAN_LEFT +#define DSBPAN_LEFT -10000 +#endif +#ifndef DSBPAN_RIGHT +#define DSBPAN_RIGHT 10000 +#endif + void Mixer_Init(const char* device); void* Mixer_Play_Effect(int id, int loop, int volume, float pan, double rate, int deleteondone); void Mixer_Stop_Channel(void* channel); diff --git a/src/network/network.cpp b/src/network/network.cpp index dd5797c34c..988a2d53b5 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -18,6 +18,8 @@ * along with this program. If not, see . *****************************************************************************/ +#include + #include "network.h" extern "C" { diff --git a/src/platform/platform.h b/src/platform/platform.h index 7b51a15f72..5d62464e63 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -130,9 +130,9 @@ uint8 platform_get_locale_temperature_format(); // Windows specific definitions #ifdef _WIN32 // Defining WIN32_LEAN_AND_MEAN breaks dsound.h in audio.h (uncomment when dsound is finally removed) - // #ifndef WIN32_LEAN_AND_MEAN - // #define WIN32_LEAN_AND_MEAN - // #endif + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif #include int windows_get_registry_install_info(rct2_install_info *installInfo, char *source, char *font, uint8 charset); diff --git a/src/rct2.c b/src/rct2.c index 8fdf68811a..534ec5c337 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -358,7 +358,7 @@ void rct2_update_2() { int tick, tick2; - tick = timeGetTime(); + tick = SDL_GetTicks(); tick2 = tick - RCT2_GLOBAL(0x009DE580, sint32); RCT2_GLOBAL(0x009DE588, sint16) = tick2 = min(tick2, 500); From bea74ee261420f12e0cf1254e22e55f3d2a94c32 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 29 Aug 2015 13:12:52 +0100 Subject: [PATCH 0603/1173] make all file IO utf8 compatible, fixes #1847 --- src/audio/audio.c | 20 +-- src/audio/mixer.cpp | 10 +- src/cmdline_sprite.c | 42 +++--- src/config.c | 225 +++++++++++++++------------- src/drawing/sprite.c | 28 ++-- src/editor.c | 2 +- src/game.c | 6 +- src/interface/screenshot.c | 40 +++-- src/localisation/language.c | 16 +- src/object.c | 18 +-- src/object.h | 2 +- src/object_list.c | 36 ++--- src/platform/platform.h | 1 - src/platform/shared.c | 7 - src/rct2.c | 22 +-- src/ride/track.c | 52 ++++--- src/scenario.c | 4 +- src/scenario_list.c | 30 ++-- src/title.c | 24 +-- src/title.h | 4 +- src/util/util.c | 43 ++---- src/util/util.h | 13 +- src/windows/changelog.c | 2 +- src/windows/editor_bottom_toolbar.c | 2 +- src/windows/loadsave.c | 6 +- src/windows/server_list.c | 28 ++-- 26 files changed, 351 insertions(+), 332 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index d94dea542a..64548460e2 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -84,7 +84,7 @@ BOOL CALLBACK dsound_enum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCS int CALLBACK audio_timer_callback(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2); int sound_fill_buffer(LPDIRECTSOUNDBUFFER dsbuffer, char* src, DWORD size); void sound_channel_free(HMMIO* hmmio, HGLOBAL* hmem); -LPVOID map_file(LPCSTR lpFileName, DWORD dwCreationDisposition, DWORD dwNumberOfBytesToMap); +LPVOID map_file(LPCWSTR lpFileName, DWORD dwCreationDisposition, DWORD dwNumberOfBytesToMap); int unmap_file(LPCVOID base); void audio_init(int i) @@ -693,7 +693,9 @@ int map_sound_effects(const char* filename) if (RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID)) { return 0; } else { - RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID) = map_file(filename, 0, 0); + wchar_t *wcFilename = utf8_to_widechar(filename); + RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID) = map_file(wcFilename, 0, 0); + free(wcFilename); return RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID) != 0; } } @@ -1296,7 +1298,7 @@ MMRESULT mmio_seek(HMMIO* hmmio, LPMMCKINFO mmckinfo1, LPMMCKINFO mmckinfo2, int * * rct2: 0x004067F9 */ -LPVOID map_file(LPCSTR lpFileName, DWORD dwCreationDisposition, DWORD dwNumberOfBytesToMap) +LPVOID map_file(LPCWSTR lpFileName, DWORD dwCreationDisposition, DWORD dwNumberOfBytesToMap) { DWORD dwDesiredAccess; DWORD dwDesiredAccessmap; @@ -1317,9 +1319,9 @@ LPVOID map_file(LPCSTR lpFileName, DWORD dwCreationDisposition, DWORD dwNumberOf dwDesiredAccessmap = FILE_MAP_READ; dwCreationDisposition = OPEN_EXISTING; } - filehandle = CreateFileA(lpFileName, dwDesiredAccess, 0, 0, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, 0); + filehandle = CreateFileW(lpFileName, dwDesiredAccess, 0, 0, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, 0); if (filehandle != INVALID_HANDLE_VALUE) { - filemaphandle = CreateFileMappingA(filehandle, 0, flProtect, 0, dwNumberOfBytesToMap, 0); + filemaphandle = CreateFileMappingW(filehandle, 0, flProtect, 0, dwNumberOfBytesToMap, 0); CloseHandle(filehandle); if (filemaphandle) { address = MapViewOfFile(filemaphandle, dwDesiredAccessmap, 0, 0, dwNumberOfBytesToMap); @@ -1750,11 +1752,11 @@ void audio_init1() for(int m = 0; m < countof(ride_music_info_list); m++) { rct_ride_music_info* ride_music_info = ride_music_info_list[m]; - const char* path = get_file_path(ride_music_info->pathid); - FILE *file = fopen(path, "rb"); + const utf8* path = get_file_path(ride_music_info->pathid); + SDL_RWops *file = SDL_RWFromFile(path, "rb"); if (file != NULL) { - fread(&RCT2_GLOBAL(0x009AF47E, uint32), 4, 1, file); - fclose(file); + SDL_RWread(file, &RCT2_GLOBAL(0x009AF47E, uint32), 4, 1); + SDL_RWclose(file); RCT2_GLOBAL(0x014241BC, uint32) = 0; if (RCT2_GLOBAL(0x009AF47E, uint32) == 0x78787878) { ride_music_info->length = 0; diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index 9a3d2c6da5..909347c73b 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -90,7 +90,7 @@ bool Source_Sample::LoadWAV(const char* filename) log_verbose("Source_Sample::LoadWAV(%s)", filename); Unload(); - SDL_RWops* rw = platform_sdl_rwfromfile(filename, "rb"); + SDL_RWops* rw = SDL_RWFromFile(filename, "rb"); if (rw == NULL) { log_verbose("Error loading %s", filename); return false; @@ -114,12 +114,12 @@ bool Source_Sample::LoadWAV(const char* filename) return true; } -bool Source_Sample::LoadCSS1(const char* filename, unsigned int offset) +bool Source_Sample::LoadCSS1(const char *filename, unsigned int offset) { log_verbose("Source_Sample::LoadCSS1(%s, %d)", filename, offset); Unload(); - SDL_RWops* rw = platform_sdl_rwfromfile(filename, "rb"); + SDL_RWops* rw = SDL_RWFromFile(filename, "rb"); if (rw == NULL) { log_verbose("Unable to load %s", filename); return false; @@ -851,9 +851,9 @@ void* Mixer_Play_Music(int pathid, int loop, int streaming) return 0; } if (streaming) { - const char* filename = get_file_path(pathid); + const utf8 *filename = get_file_path(pathid); - SDL_RWops* rw = platform_sdl_rwfromfile(filename, "rb"); + SDL_RWops* rw = SDL_RWFromFile(filename, "rb"); if (rw == NULL) { return 0; } diff --git a/src/cmdline_sprite.c b/src/cmdline_sprite.c index 3d1c8497dd..af9a9ea022 100644 --- a/src/cmdline_sprite.c +++ b/src/cmdline_sprite.c @@ -49,16 +49,16 @@ void sprite_entries_make_relative() spriteFileEntries[i].offset -= (int)spriteFileData; } -bool sprite_file_open(const char *path) +bool sprite_file_open(const utf8 *path) { - FILE *file; + SDL_RWops *file; - file = fopen(path, "rb"); + file = SDL_RWFromFile(path, "rb"); if (file == NULL) return false; - if (fread(&spriteFileHeader, sizeof(rct_sprite_file_header), 1, file) != 1) { - fclose(file); + if (SDL_RWread(file, &spriteFileHeader, sizeof(rct_sprite_file_header), 1) != 1) { + SDL_RWclose(file); return false; } @@ -66,32 +66,32 @@ bool sprite_file_open(const char *path) int entryTableSize = spriteFileHeader.num_entries * sizeof(rct_g1_element); spriteFileEntries = malloc(entryTableSize); - if (fread(spriteFileEntries, entryTableSize, 1, file) != 1) { - fclose(file); + if (SDL_RWread(file, spriteFileEntries, entryTableSize, 1) != 1) { + SDL_RWclose(file); return false; } spriteFileData = malloc(spriteFileHeader.total_size); - if (fread(spriteFileData, spriteFileHeader.total_size, 1, file) != 1) { - fclose(file); + if (SDL_RWread(file, spriteFileData, spriteFileHeader.total_size, 1) != 1) { + SDL_RWclose(file); return false; } sprite_entries_make_absolute(); } - fclose(file); + SDL_RWclose(file); return true; } bool sprite_file_save(const char *path) { - FILE *file = fopen(path, "wb"); + SDL_RWops *file = SDL_RWFromFile(path, "wb"); if (file == NULL) return false; - if (fwrite(&spriteFileHeader, sizeof(rct_sprite_file_header), 1, file) != 1) { - fclose(file); + if (SDL_RWwrite(file, &spriteFileHeader, sizeof(rct_sprite_file_header), 1) != 1) { + SDL_RWclose(file); return false; } @@ -100,21 +100,21 @@ bool sprite_file_save(const char *path) int entryTableSize = spriteFileHeader.num_entries * sizeof(rct_g1_element); - if (fwrite(spriteFileEntries, entryTableSize, 1, file) != 1) { + if (SDL_RWwrite(file, spriteFileEntries, entryTableSize, 1) != 1) { sprite_entries_make_absolute(); - fclose(file); + SDL_RWclose(file); return false; } else { sprite_entries_make_absolute(); } - if (fwrite(spriteFileData, spriteFileHeader.total_size, 1, file) != 1) { - fclose(file); + if (SDL_RWwrite(file, spriteFileData, spriteFileHeader.total_size, 1) != 1) { + SDL_RWclose(file); return false; } } - fclose(file); + SDL_RWclose(file); return true; } @@ -591,7 +591,7 @@ int cmdline_for_sprite(const char **argv, int argc) bool silent = (argc >= 4 && strcmp(argv[3], "silent") == 0); bool fileExists = true; - FILE *file; + SDL_RWops *file; spriteFileHeader.num_entries = 0; spriteFileHeader.total_size = 0; @@ -606,9 +606,9 @@ int cmdline_for_sprite(const char **argv, int argc) imagePath[resourceLength - 1] = 0; sprintf(imagePath, "%s%c%d.png", imagePath, platform_get_path_separator(), i); - file = fopen(imagePath, "r"); + file = SDL_RWFromFile(imagePath, "r"); if (file != NULL) { - fclose(file); + SDL_RWclose(file); rct_g1_element spriteElement; uint8 *buffer; int bufferLength; diff --git a/src/config.c b/src/config.c index 0a95bb5679..7194ebf11e 100644 --- a/src/config.c +++ b/src/config.c @@ -262,16 +262,39 @@ title_sequences_configuration gConfigTitleSequences; bool config_open(const utf8string path); bool config_save(const utf8string path); static void config_read_properties(config_section_definition **currentSection, const_utf8string line); -static void config_save_property_value(FILE *file, uint8 type, value_union *value); +static void config_save_property_value(SDL_RWops *file, uint8 type, value_union *value); static bool config_read_enum(void *dest, int destSize, const utf8 *key, int keySize, config_enum_definition *enumDefinitions); -static void config_write_enum(FILE *file, uint8 type, value_union *value, config_enum_definition *enumDefinitions); +static void config_write_enum(SDL_RWops *file, uint8 type, value_union *value, config_enum_definition *enumDefinitions); -static int utf8_read(utf8 **outch); static void utf8_skip_whitespace(utf8 **outch); static void utf8_skip_non_whitespace(utf8 **outch); void config_apply_to_old_addresses(); +static int rwopsreadc(SDL_RWops *file) +{ + int c = 0; + if (SDL_RWread(file, &c, 1, 1) != 1) + c = EOF; + return c; +} + +static void rwopswritec(SDL_RWops *file, char c) +{ + SDL_RWwrite(file, &c, 1, 1); +} + +static void rwopsprintf(SDL_RWops *file, const char *format, ...) +{ + va_list args; + va_start(args, format); + + char buffer[64]; + vsprintf(buffer, format, args); + + va_end(args); +} + void config_set_defaults() { int i, j; @@ -344,14 +367,14 @@ bool config_save_default() bool config_open(const utf8string path) { - FILE *file; + SDL_RWops *file; uint8 *lineBuffer; size_t lineBufferCapacity; size_t lineLength; int c; config_section_definition *currentSection; - file = fopen(path, "rb"); + file = SDL_RWFromFile(path, "rb"); if (file == NULL) return false; @@ -361,11 +384,11 @@ bool config_open(const utf8string path) lineLength = 0; // Skim UTF-8 byte order mark - fread(lineBuffer, 3, 1, file); + SDL_RWread(file, lineBuffer, 3, 1); if (!utf8_is_bom(lineBuffer)) - fseek(file, 0, SEEK_SET); + SDL_RWseek(file, 0, RW_SEEK_SET); - while ((c = fgetc(file)) != EOF) { + while ((c = rwopsreadc(file)) != EOF) { if (c == '\n' || c == '\r') { lineBuffer[lineLength++] = 0; config_read_properties(¤tSection, (const_utf8string)lineBuffer); @@ -386,17 +409,17 @@ bool config_open(const utf8string path) } free(lineBuffer); - fclose(file); + SDL_RWclose(file); return true; } bool config_save(const utf8string path) { - FILE *file; + SDL_RWops *file; int i, j; value_union *value; - file = fopen(path, "wb"); + file = SDL_RWFromFile(path, "wb"); if (file == NULL) { log_error("Unable to write to config file."); return false; @@ -405,67 +428,67 @@ bool config_save(const utf8string path) for (i = 0; i < countof(_sectionDefinitions); i++) { config_section_definition *section = &_sectionDefinitions[i]; - fputc('[', file); - fwrite(section->section_name, strlen(section->section_name), 1, file); - fputc(']', file); - fputc('\n', file); + rwopswritec(file, '['); + SDL_RWwrite(file, section->section_name, strlen(section->section_name), 1); + rwopswritec(file, ']'); + rwopswritec(file, '\n'); for (j = 0; j < section->property_definitions_count; j++) { config_property_definition *property = §ion->property_definitions[j]; - fwrite(property->property_name, strlen(property->property_name), 1, file); - fwrite(" = ", 3, 1, file); + SDL_RWwrite(file, property->property_name, strlen(property->property_name), 1); + SDL_RWwrite(file, " = ", 3, 1); value = (value_union*)((size_t)section->base_address + (size_t)property->offset); if (property->enum_definitions != NULL) config_write_enum(file, property->type, value, property->enum_definitions); else config_save_property_value(file, property->type, value); - fputc('\n', file); + rwopswritec(file, '\n'); } - fputc('\n', file); + rwopswritec(file, '\n'); } - fclose(file); + SDL_RWclose(file); return true; } -static void config_save_property_value(FILE *file, uint8 type, value_union *value) +static void config_save_property_value(SDL_RWops *file, uint8 type, value_union *value) { switch (type) { case CONFIG_VALUE_TYPE_BOOLEAN: - if (value->value_boolean) fwrite("true", 4, 1, file); - else fwrite("false", 5, 1, file); + if (value->value_boolean) SDL_RWwrite(file, "true", 4, 1); + else SDL_RWwrite(file, "false", 5, 1); break; case CONFIG_VALUE_TYPE_UINT8: - fprintf(file, "%u", value->value_uint8); + rwopsprintf(file, "%u", value->value_uint8); break; case CONFIG_VALUE_TYPE_UINT16: - fprintf(file, "%u", value->value_uint16); + rwopsprintf(file, "%u", value->value_uint16); break; case CONFIG_VALUE_TYPE_UINT32: - fprintf(file, "%u", value->value_uint32); + rwopsprintf(file, "%u", value->value_uint32); break; case CONFIG_VALUE_TYPE_SINT8: - fprintf(file, "%d", value->value_sint8); + rwopsprintf(file, "%d", value->value_sint8); break; case CONFIG_VALUE_TYPE_SINT16: - fprintf(file, "%d", value->value_sint16); + rwopsprintf(file, "%d", value->value_sint16); break; case CONFIG_VALUE_TYPE_SINT32: - fprintf(file, "%d", value->value_sint32); + rwopsprintf(file, "%d", value->value_sint32); break; case CONFIG_VALUE_TYPE_FLOAT: - fprintf(file, "%.3f", value->value_float); + rwopsprintf(file, "%.3f", value->value_float); break; case CONFIG_VALUE_TYPE_DOUBLE: - fprintf(file, "%.6f", value->value_double); + rwopsprintf(file, "%.6f", value->value_double); break; case CONFIG_VALUE_TYPE_STRING: - fputc('"', file); + rwopswritec(file, '"'); if (value->value_string != NULL) - fwrite(value->value_string, strlen(value->value_string), 1, file); - fputc('"', file); + SDL_RWwrite(file, value->value_string, strlen(value->value_string), 1); + rwopswritec(file, '"'); break; } } @@ -480,8 +503,7 @@ bool config_get_section(const utf8string line, const utf8 **sectionName, int *se if (*ch != '[') return false; *sectionName = ++ch; - while (*ch != 0) { - c = utf8_read(&ch); + while ((c = utf8_get_next(ch, &ch)) != 0) { if (c == '#') return false; if (c == '[') return false; if (c == ' ') break; @@ -504,8 +526,7 @@ bool config_get_property_name_value(const utf8string line, utf8 **propertyName, if (*ch == 0) return false; *propertyName = ch; - while (*ch != 0) { - c = utf8_read(&ch); + while ((c = utf8_get_next(ch, &ch)) != 0) { if (isspace(c) || c == '=') { *propertyNameSize = ch - *propertyName - 1; break; @@ -529,14 +550,13 @@ bool config_get_property_name_value(const utf8string line, utf8 **propertyName, } *value = ch; - while (*ch != 0) { - c = utf8_read(&ch); + while ((c = utf8_get_next(ch, &ch)) != 0) { if (isspace(c) || c == '#') { if (!quotes) break; } lastC = c; } - *valueSize = ch - *value; + *valueSize = ch - *value - 1; if (quotes) (*valueSize)--; return true; } @@ -654,12 +674,12 @@ static bool config_read_enum(void *dest, int destSize, const utf8 *key, int keyS return false; } -static void config_write_enum(FILE *file, uint8 type, value_union *value, config_enum_definition *enumDefinitions) +static void config_write_enum(SDL_RWops *file, uint8 type, value_union *value, config_enum_definition *enumDefinitions) { uint32 enumValue = (value->value_uint32) & ((1 << (_configValueTypeSize[type] * 8)) - 1); while (enumDefinitions->key != NULL) { if (enumDefinitions->value.value_uint32 == enumValue) { - fwrite(enumDefinitions->key, strlen(enumDefinitions->key), 1, file); + SDL_RWwrite(file, enumDefinitions->key, strlen(enumDefinitions->key), 1); return; } enumDefinitions++; @@ -692,7 +712,7 @@ static void utf8_skip_whitespace(utf8 **outch) utf8 *ch; while (**outch != 0) { ch = *outch; - if (!isspace(utf8_read(outch))) { + if (!isspace(utf8_get_next(*outch, outch))) { *outch = ch; break; } @@ -702,7 +722,7 @@ static void utf8_skip_whitespace(utf8 **outch) static void utf8_skip_non_whitespace(utf8 **outch) { while (**outch != 0) { - if (isspace(utf8_read(outch))) + if (isspace(utf8_get_next(*outch, outch))) break; } } @@ -988,7 +1008,7 @@ void config_reset_shortcut_keys() memcpy(gShortcutKeys, _defaultShortcutKeys, sizeof(gShortcutKeys)); } -void config_shortcut_keys_get_path(char *outPath) +void config_shortcut_keys_get_path(utf8 *outPath) { platform_get_user_directory(outPath, NULL); strcat(outPath, "hotkeys.cfg"); @@ -996,22 +1016,22 @@ void config_shortcut_keys_get_path(char *outPath) bool config_shortcut_keys_load() { - char path[MAX_PATH]; - FILE *file; + utf8 path[MAX_PATH]; + SDL_RWops *file; bool result; uint16 version; config_shortcut_keys_get_path(path); - file = fopen(path, "rb"); + file = SDL_RWFromFile(path, "rb"); if (file != NULL) { - result = fread(&version, sizeof(version), 1, file) == 1; + result = SDL_RWread(file, &version, sizeof(version), 1) == 1; if (result && version == SHORTCUT_FILE_VERSION) { - result = fread(gShortcutKeys, sizeof(gShortcutKeys), 1, file) == 1; + result = SDL_RWread(file, gShortcutKeys, sizeof(gShortcutKeys), 1) == 1; } else { result = false; } - fclose(file); + SDL_RWclose(file); } else { result = false; } @@ -1023,19 +1043,19 @@ bool config_shortcut_keys_save() { const uint16 version = SHORTCUT_FILE_VERSION; - char path[MAX_PATH]; - FILE *file; + utf8 path[MAX_PATH]; + SDL_RWops *file; bool result; config_shortcut_keys_get_path(path); - file = fopen(path, "wb"); + file = SDL_RWFromFile(path, "wb"); if (file != NULL) { - result = fwrite(&version, sizeof(version), 1, file) == 1; + result = SDL_RWwrite(file, &version, sizeof(version), 1) == 1; if (result) { - result = fwrite(gShortcutKeys, sizeof(gShortcutKeys), 1, file) == 1; + result = SDL_RWwrite(file, gShortcutKeys, sizeof(gShortcutKeys), 1) == 1; } - fclose(file); + SDL_RWclose(file); } else { result = false; } @@ -1190,14 +1210,14 @@ bool themes_save_preset(int preset) bool themes_open(const_utf8string path) { - FILE *file; + SDL_RWops *file; uint8 *lineBuffer; size_t lineBufferCapacity; size_t lineLength; int c, preset; theme_section_definition *currentSection; - file = fopen(path, "rb"); + file = SDL_RWFromFile(path, "rb"); if (file == NULL) return false; @@ -1229,11 +1249,11 @@ bool themes_open(const_utf8string path) lineLength = 0; // Skim UTF-8 byte order mark - fread(lineBuffer, 3, 1, file); + SDL_RWread(file, lineBuffer, 3, 1); if (!(lineBuffer[0] == 0xEF && lineBuffer[1] == 0xBB && lineBuffer[2] == 0xBF)) - fseek(file, 0, SEEK_SET); + SDL_RWseek(file, 0, SEEK_SET); - while ((c = fgetc(file)) != EOF) { + while ((c = rwopsreadc(file)) != EOF) { if (c == '\n' || c == '\r') { lineBuffer[lineLength++] = 0; themes_read_properties(&gConfigThemes.presets[preset], ¤tSection, (utf8string)lineBuffer); @@ -1255,17 +1275,17 @@ bool themes_open(const_utf8string path) } free(lineBuffer); - fclose(file); + SDL_RWclose(file); return true; } static bool themes_save(const_utf8string path, int preset) { - FILE *file; + SDL_RWops *file; int i, j; value_union *value; - file = fopen(path, "wb"); + file = SDL_RWFromFile(path, "wb"); if (file == NULL) { log_error("Unable to write to theme file."); return false; @@ -1275,16 +1295,16 @@ static bool themes_save(const_utf8string path, int preset) for (i = 1; i < countof(_themeSectionDefinitions); i++) { theme_section_definition *section = &_themeSectionDefinitions[i]; - fputc('[', file); - fwrite(section->section_name, strlen(section->section_name), 1, file); - fputc(']', file); - fputc('\n', file); + rwopswritec(file, '['); + SDL_RWwrite(file, section->section_name, strlen(section->section_name), 1); + rwopswritec(file, ']'); + rwopswritec(file, '\n'); for (j = 0; j < section->property_definitions_count; j++) { theme_property_definition *property = §ion->property_definitions[j]; - fwrite(property->property_name, strlen(property->property_name), 1, file); - fwrite(" = ", 3, 1, file); + SDL_RWwrite(file, property->property_name, strlen(property->property_name), 1); + SDL_RWwrite(file, " = ", 3, 1); value = (value_union*)((size_t)&gConfigThemes.presets[preset] + (size_t)section->offset + (size_t)property->offset); @@ -1292,24 +1312,24 @@ static bool themes_save(const_utf8string path, int preset) config_write_enum(file, property->type, value, property->enum_definitions); else config_save_property_value(file, property->type, value); - fputc('\n', file); - } - fputc('\n', file); + rwopswritec(file, '\n'); } + rwopswritec(file, '\n'); + } for (i = 0; i < (int)gNumThemeWindows; i++) { theme_section_definition *section = &_themeSectionDefinitions[0]; - fputc('[', file); - fwrite(gThemeWindowDefinitions[i].section_name, strlen(gThemeWindowDefinitions[i].section_name), 1, file); - fputc(']', file); - fputc('\n', file); + rwopswritec(file, '['); + SDL_RWwrite(file, gThemeWindowDefinitions[i].section_name, strlen(gThemeWindowDefinitions[i].section_name), 1); + rwopswritec(file, ']'); + rwopswritec(file, '\n'); for (j = 0; j < section->property_definitions_count; j++) { theme_property_definition *property = §ion->property_definitions[j]; - fwrite(property->property_name, strlen(property->property_name), 1, file); - fwrite(" = ", 3, 1, file); + SDL_RWwrite(file, property->property_name, strlen(property->property_name), 1); + SDL_RWwrite(file, " = ", 3, 1); value = (value_union*)((size_t)gConfigThemes.presets[preset].windows + (size_t)(sizeof(theme_window) * i) + (size_t)property->offset); @@ -1317,11 +1337,11 @@ static bool themes_save(const_utf8string path, int preset) config_write_enum(file, property->type, value, property->enum_definitions); else config_save_property_value(file, property->type, value); - fputc('\n', file); - } + rwopswritec(file, '\n'); + } } - fclose(file); + SDL_RWclose(file); return true; } @@ -1336,8 +1356,7 @@ static void themes_read_properties(theme_preset *theme, theme_section_definition int sectionNameSize; if (config_get_section(ch, §ionName, §ionNameSize)) *currentSection = themes_get_section_def((utf8string)sectionName, sectionNameSize); - } - else { + } else { if (*currentSection != NULL) { utf8 *propertyName, *value; int propertyNameSize, valueSize; @@ -1500,7 +1519,7 @@ static void title_sequence_open(const char *path, const char *customName) { utf8 titlePath[MAX_PATH], scriptPath[MAX_PATH]; file_info fileInfo; - FILE *file; + SDL_RWops *file; int fileEnumHandle, i, preset; char parts[3 * 128], *token, *part1, *part2; char separator = platform_get_path_separator(); @@ -1571,8 +1590,8 @@ static void title_sequence_open(const char *path, const char *customName) platform_enumerate_files_end(fileEnumHandle); // Load the script file - file = fopen(scriptPath, "r"); - + file = SDL_RWFromFile(scriptPath, "r"); + sint64 fileSize = SDL_RWsize(file); do { title_script_get_line(file, parts); @@ -1619,14 +1638,14 @@ static void title_sequence_open(const char *path, const char *customName) gConfigTitleSequences.presets[preset].commands = realloc(gConfigTitleSequences.presets[preset].commands, sizeof(title_command) * (size_t)gConfigTitleSequences.presets[preset].num_commands); gConfigTitleSequences.presets[preset].commands[gConfigTitleSequences.presets[preset].num_commands - 1] = command; } - } while (!feof(file)); - fclose(file); + } while (SDL_RWtell(file) < fileSize); + SDL_RWclose(file); } void title_sequence_save_preset_script(int preset) { utf8 path[MAX_PATH]; - FILE *file; + SDL_RWops *file; int i; char separator = platform_get_path_separator(); @@ -1636,7 +1655,7 @@ void title_sequence_save_preset_script(int preset) strncat(path, &separator, 1); strcat(path, "script.txt"); - file = fopen(path, "wb"); + file = SDL_RWFromFile(path, "wb"); if (file == NULL) { log_error("Unable to write to script file."); return; @@ -1647,36 +1666,36 @@ void title_sequence_save_preset_script(int preset) switch (command->command) { case TITLE_SCRIPT_LOAD: if (command->saveIndex == 0xFF) - fprintf(file, "LOAD \r\n"); + rwopsprintf(file, "LOAD \r\n"); else - fprintf(file, "LOAD %s\r\n", gConfigTitleSequences.presets[preset].saves[command->saveIndex]); + rwopsprintf(file, "LOAD %s\r\n", gConfigTitleSequences.presets[preset].saves[command->saveIndex]); break; case TITLE_SCRIPT_LOCATION: - fprintf(file, "LOCATION %i %i\r\n", command->x, command->y); + rwopsprintf(file, "LOCATION %i %i\r\n", command->x, command->y); break; case TITLE_SCRIPT_ROTATE: - fprintf(file, "ROTATE %i\r\n", command->rotations); + rwopsprintf(file, "ROTATE %i\r\n", command->rotations); break; case TITLE_SCRIPT_ZOOM: - fprintf(file, "ZOOM %i\r\n", command->zoom); + rwopsprintf(file, "ZOOM %i\r\n", command->zoom); break; case TITLE_SCRIPT_SPEED: - fprintf(file, "SPEED %i\r\n", command->speed); + rwopsprintf(file, "SPEED %i\r\n", command->speed); break; case TITLE_SCRIPT_WAIT: - fprintf(file, "WAIT %i\r\n\r\n", command->seconds); + rwopsprintf(file, "WAIT %i\r\n\r\n", command->seconds); break; case TITLE_SCRIPT_RESTART: - fprintf(file, "RESTART\r\n"); + rwopsprintf(file, "RESTART\r\n"); break; case TITLE_SCRIPT_END: - fprintf(file, "END\r\n"); + rwopsprintf(file, "END\r\n"); break; } } - fclose(file); + SDL_RWclose(file); } diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index 8fee10a0c7..c343ee1ebf 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -39,25 +39,25 @@ int gfx_load_g1() { log_verbose("loading g1 graphics"); - FILE *file; + SDL_RWops *file; rct_g1_header header; unsigned int i; - file = fopen(get_file_path(PATH_ID_G1), "rb"); + file = SDL_RWFromFile(get_file_path(PATH_ID_G1), "rb"); if (file != NULL) { - if (fread(&header, 8, 1, file) == 1) { + if (SDL_RWread(file, &header, 8, 1) == 1) { // number of elements is stored in g1.dat, but because the entry headers are static, this can't be variable until // made into a dynamic array header.num_entries = 29294; // Read element headers - fread(g1Elements, header.num_entries * sizeof(rct_g1_element), 1, file); + SDL_RWread(file, g1Elements, header.num_entries * sizeof(rct_g1_element), 1); // Read element data _g1Buffer = rct2_malloc(header.total_size); - fread(_g1Buffer, header.total_size, 1, file); + SDL_RWread(file, _g1Buffer, header.total_size, 1); - fclose(file); + SDL_RWclose(file); // Fix entry data offsets for (i = 0; i < header.num_entries; i++) @@ -66,7 +66,7 @@ int gfx_load_g1() // Successful return 1; } - fclose(file); + SDL_RWclose(file); } // Unsuccessful @@ -78,23 +78,23 @@ int gfx_load_g2() { log_verbose("loading g2 graphics"); - FILE *file; + SDL_RWops *file; unsigned int i; char path[MAX_PATH]; sprintf(path, "%s%cdata%cg2.dat", gExePath, platform_get_path_separator(), platform_get_path_separator()); - file = fopen(path, "rb"); + file = SDL_RWFromFile(path, "rb"); if (file != NULL) { - if (fread(&g2.header, 8, 1, file) == 1) { + if (SDL_RWread(file, &g2.header, 8, 1) == 1) { // Read element headers g2.elements = malloc(g2.header.num_entries * sizeof(rct_g1_element)); - fread(g2.elements, g2.header.num_entries * sizeof(rct_g1_element), 1, file); + SDL_RWread(file, g2.elements, g2.header.num_entries * sizeof(rct_g1_element), 1); // Read element data g2.data = malloc(g2.header.total_size); - fread(g2.data, g2.header.total_size, 1, file); + SDL_RWread(file, g2.data, g2.header.total_size, 1); - fclose(file); + SDL_RWclose(file); // Fix entry data offsets for (i = 0; i < g2.header.num_entries; i++) @@ -103,7 +103,7 @@ int gfx_load_g2() // Successful return 1; } - fclose(file); + SDL_RWclose(file); } // Unsuccessful diff --git a/src/editor.c b/src/editor.c index d13386693c..e71753072d 100644 --- a/src/editor.c +++ b/src/editor.c @@ -330,7 +330,7 @@ static int editor_read_s6(const char *path) log_verbose("loading landscape, %s", path); - rw = platform_sdl_rwfromfile(path, "rb"); + rw = SDL_RWFromFile(path, "rb"); if (rw != NULL) { if (!sawyercoding_validate_checksum(rw)) { SDL_RWclose(rw); diff --git a/src/game.c b/src/game.c index ba6c818676..265b34d0eb 100644 --- a/src/game.c +++ b/src/game.c @@ -853,7 +853,7 @@ int game_load_save(const char *path) strcpy(gScenarioSaveName, path_get_filename(path)); path_remove_extension(gScenarioSaveName); - SDL_RWops* rw = platform_sdl_rwfromfile(path, "rb"); + SDL_RWops* rw = SDL_RWFromFile(path, "rb"); if (rw == NULL) { log_error("unable to open %s", path); RCT2_GLOBAL(RCT2_ADDRESS_ERROR_TYPE, uint8) = 255; @@ -1006,7 +1006,7 @@ void save_game() strcat(path, gScenarioSaveName); strcat(path, ".sv6"); - SDL_RWops* rw = platform_sdl_rwfromfile(path, "wb+"); + SDL_RWops* rw = SDL_RWFromFile(path, "wb+"); if (rw != NULL) { scenario_save(rw, 0x80000000); log_verbose("Saved to %s", gScenarioSaveName); @@ -1038,7 +1038,7 @@ void game_autosave() platform_file_copy(path, backupPath, true); } - SDL_RWops* rw = platform_sdl_rwfromfile(path, "wb+"); + SDL_RWops* rw = SDL_RWFromFile(path, "wb+"); if (rw != NULL) { scenario_save(rw, 0x80000000); SDL_RWclose(rw); diff --git a/src/interface/screenshot.c b/src/interface/screenshot.c index 14a9d83b72..f5f3c7201b 100644 --- a/src/interface/screenshot.c +++ b/src/interface/screenshot.c @@ -143,7 +143,7 @@ int screenshot_dump_bmp() int i, y, index, width, height, stride; char *buffer, path[MAX_PATH], *row; - FILE *fp; + SDL_RWops *fp; unsigned int bytesWritten; // Get a free screenshot path @@ -151,15 +151,14 @@ int screenshot_dump_bmp() return -1; // Open binary file for writing - if ((fp = fopen(path, "wb")) == NULL){ + if ((fp = SDL_RWFromFile(path, "wb")) == NULL){ return -1; } // Allocate buffer buffer = malloc(0xFFFF); if (buffer == NULL) { - //CloseHandle(hFile); - fclose(fp); + SDL_RWclose(fp); return -1; } @@ -174,9 +173,9 @@ int screenshot_dump_bmp() header.bfSize = height * stride + 1038; header.bfOffBits = 1038; - bytesWritten = fwrite(&header, sizeof(BitmapFileHeader), 1, fp); + bytesWritten = SDL_RWwrite(fp, &header, sizeof(BitmapFileHeader), 1); if (bytesWritten != 1) { - fclose(fp); + SDL_RWclose(fp); free(buffer); } @@ -191,9 +190,9 @@ int screenshot_dump_bmp() info.biYPelsPerMeter = 2520; info.biClrUsed = 246; - bytesWritten=fwrite(&info, sizeof(BitmapInfoHeader), 1, fp); + bytesWritten = SDL_RWwrite(fp, &info, sizeof(BitmapInfoHeader), 1); if (bytesWritten != 1) { - fclose(fp); + SDL_RWclose(fp); free(buffer); } @@ -205,9 +204,9 @@ int screenshot_dump_bmp() buffer[i * 4 + 2] = RCT2_ADDRESS(0x01424680, uint8)[i * 4 + 2]; } - bytesWritten = fwrite(buffer, sizeof(char), 246*4, fp); + bytesWritten = SDL_RWwrite(fp, buffer, sizeof(char), 246 * 4); if (bytesWritten != 246*4){ - fclose(fp); + SDL_RWclose(fp); free(buffer); } @@ -219,14 +218,14 @@ int screenshot_dump_bmp() memset(buffer, 0, stride); memcpy(buffer, row, dpi->width); - bytesWritten=fwrite(buffer, sizeof(char), stride, fp); + bytesWritten = SDL_RWwrite(fp, buffer, sizeof(char), stride); if (bytesWritten != stride){ - fclose(fp); + SDL_RWclose(fp); free(buffer); } } - fclose(fp); + SDL_RWclose(fp); free(buffer); return index; @@ -289,7 +288,14 @@ int screenshot_dump_png() log_error("Unable to save screenshot, %u: %s", lodepng_error_text(error)); index = -1; } else { - lodepng_save_file(png, pngSize, path); + SDL_RWops *file = SDL_RWFromFile(path, "wb"); + if (file == NULL) { + log_error("Unable to save screenshot, %s", SDL_GetError()); + index = -1; + } else { + SDL_RWwrite(file, png, pngSize, 1); + SDL_RWclose(file); + } } free(png); @@ -327,11 +333,13 @@ bool screenshot_write_png(rct_drawpixelinfo *dpi, const char *path) free(png); return false; } else { - error = lodepng_save_file(png, pngSize, path); - if (error != 0) { + SDL_RWops *file = SDL_RWFromFile(path, "wb"); + if (file == NULL) { free(png); return false; } + SDL_RWwrite(file, png, pngSize, 1); + SDL_RWclose(file); } free(png); diff --git a/src/localisation/language.c b/src/localisation/language.c index eec31cb815..72a24b0b36 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -98,7 +98,7 @@ const utf8 BlackLeftArrowString[] = { 0xC2, 0x8E, 0xE2, 0x97, 0x80, 0x00 }; const utf8 BlackRightArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xB6, 0x00 }; const utf8 CheckBoxMarkString[] = { 0xE2, 0x9C, 0x93, 0x00 }; -static int language_open_file(const char *filename, language_data *language); +static int language_open_file(const utf8 *filename, language_data *language); static void language_close(language_data *language); void utf8_remove_format_codes(utf8 *text) @@ -200,21 +200,21 @@ void language_close_all() * colon and before the new line will be saved as the string. Tokens are written with inside curly braces {TOKEN}. * Use # at the beginning of a line to leave a comment. */ -static int language_open_file(const char *filename, language_data *language) +static int language_open_file(const utf8 *filename, language_data *language) { assert(filename != NULL); assert(language != NULL); - FILE *f = fopen(filename, "rb"); + SDL_RWops *f = SDL_RWFromFile(filename, "rb"); if (f == NULL) return 0; - fseek(f, 0, SEEK_END); - language->string_data_size = ftell(f) + 1; + SDL_RWseek(f, 0, RW_SEEK_END); + language->string_data_size = (size_t)(SDL_RWtell(f) + 1); language->string_data = calloc(1, language->string_data_size); - fseek(f, 0, SEEK_SET); - fread(language->string_data, language->string_data_size, 1, f); - fclose(f); + SDL_RWseek(f, 0, RW_SEEK_SET); + SDL_RWread(f, language->string_data, language->string_data_size, 1); + SDL_RWclose(f); language->strings = calloc(STR_COUNT, sizeof(char*)); diff --git a/src/object.c b/src/object.c index 2d44166568..4fcfadef1a 100644 --- a/src/object.c +++ b/src/object.c @@ -33,20 +33,20 @@ #include "scenario.h" #include "rct1.h" -int object_load_entry(const char *path, rct_object_entry *outEntry) +int object_load_entry(const utf8 *path, rct_object_entry *outEntry) { - FILE *file; + SDL_RWops *file; - file = fopen(path, "rb"); + file = SDL_RWFromFile(path, "rb"); if (file == NULL) return 0; - if (fread(outEntry, sizeof(rct_object_entry), 1, file) != 1) { - fclose(file); + if (SDL_RWread(file, outEntry, sizeof(rct_object_entry), 1) != 1) { + SDL_RWclose(file); return 0; } - fclose(file); + SDL_RWclose(file); return 1; } @@ -61,7 +61,7 @@ int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSi log_verbose("loading object, %s", path); - rw = platform_sdl_rwfromfile(path, "rb"); + rw = SDL_RWFromFile(path, "rb"); if (rw == NULL) return 0; @@ -315,7 +315,7 @@ int object_load_packed(SDL_RWops* rw) } // Actually write the object to the file - SDL_RWops* rw_out = platform_sdl_rwfromfile(path, "wb"); + SDL_RWops* rw_out = SDL_RWFromFile(path, "wb"); if (rw_out != NULL){ uint8 result = write_object_file(rw_out, &entry); @@ -1514,7 +1514,7 @@ int object_get_scenario_text(rct_object_entry *entry) subsitute_path(path, RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), objectPath); rct_object_entry openedEntry; - SDL_RWops* rw = platform_sdl_rwfromfile(path, "rb"); + SDL_RWops* rw = SDL_RWFromFile(path, "rb"); if (rw != NULL) { SDL_RWread(rw, &openedEntry, sizeof(rct_object_entry), 1); if (object_entry_compare(&openedEntry, entry)) { diff --git a/src/object.h b/src/object.h index 0294c98865..ad7d7c66bd 100644 --- a/src/object.h +++ b/src/object.h @@ -92,7 +92,7 @@ typedef struct { extern rct_object_entry_group object_entry_groups[]; -int object_load_entry(const char *path, rct_object_entry *outEntry); +int object_load_entry(const utf8 *path, rct_object_entry *outEntry); void object_list_load(); void set_load_objects_fail_reason(); int object_read_and_load_entries(SDL_RWops* rw); diff --git a/src/object_list.c b/src/object_list.c index 12409ecb0a..1e96973ee5 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -94,7 +94,7 @@ static void load_object_filter(rct_object_entry* entry, uint8* chunk, rct_object static rct_object_filters *_installedObjectFilters = NULL; -static void get_plugin_path(char *outPath) +static void get_plugin_path(utf8 *outPath) { platform_get_user_directory(outPath, NULL); strcat(outPath, "plugin.dat"); @@ -347,20 +347,20 @@ void object_list_load() static int object_list_cache_load(int totalFiles, uint64 totalFileSize, int fileDateModifiedChecksum) { char path[MAX_PATH]; - FILE *file; + SDL_RWops *file; rct_plugin_header pluginHeader; uint32 filterVersion = 0; log_verbose("loading object list cache (plugin.dat)"); get_plugin_path(path); - file = fopen(path, "rb"); + file = SDL_RWFromFile(path, "rb"); if (file == NULL) { log_verbose("Unable to load %s", path); return 0; } - if (fread(&pluginHeader, sizeof(rct_plugin_header), 1, file) == 1) { + if (SDL_RWread(file, &pluginHeader, sizeof(rct_plugin_header), 1) == 1) { // Check if object repository has changed in anyway if ( pluginHeader.total_files == totalFiles && @@ -375,20 +375,20 @@ static int object_list_cache_load(int totalFiles, uint64 totalFileSize, int file // Read installed object list RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, void*) = rct2_malloc(pluginHeader.object_list_size); - if (fread(RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, void*), pluginHeader.object_list_size, 1, file) == 1) { + if (SDL_RWread(file, RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, void*), pluginHeader.object_list_size, 1) == 1) { RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32) = pluginHeader.object_list_no_items; if (pluginHeader.object_list_no_items != (pluginHeader.total_files & 0xFFFFFF)) log_error("Potential mismatch in file numbers. Possible corrupt file. Consider deleting plugin.dat."); - if (fread(&filterVersion, sizeof(filterVersion), 1, file) == 1) { + if (SDL_RWread(file, &filterVersion, sizeof(filterVersion), 1) == 1) { if (filterVersion == FILTER_VERSION) { if (_installedObjectFilters) free(_installedObjectFilters); _installedObjectFilters = malloc(sizeof(rct_object_filters) * pluginHeader.object_list_no_items); - if (fread(_installedObjectFilters, sizeof(rct_object_filters) * pluginHeader.object_list_no_items, 1, file) == 1) { + if (SDL_RWread(file, _installedObjectFilters, sizeof(rct_object_filters) * pluginHeader.object_list_no_items, 1) == 1) { - fclose(file); + SDL_RWclose(file); reset_loaded_objects(); object_list_examine(); return 1; @@ -411,11 +411,11 @@ static int object_list_cache_load(int totalFiles, uint64 totalFileSize, int file log_info("Objects files have been updated... updating object list cache"); } - fclose(file); + SDL_RWclose(file); return 0; } - fclose(file); + SDL_RWclose(file); log_error("loading object list cache failed"); return 0; @@ -423,8 +423,8 @@ static int object_list_cache_load(int totalFiles, uint64 totalFileSize, int file static int object_list_cache_save(int fileCount, uint64 totalFileSize, int fileDateModifiedChecksum, int currentItemOffset) { - char path[MAX_PATH]; - FILE *file; + utf8 path[MAX_PATH]; + SDL_RWops *file; rct_plugin_header pluginHeader; uint32 filterVersion = FILTER_VERSION; @@ -437,17 +437,17 @@ static int object_list_cache_save(int fileCount, uint64 totalFileSize, int fileD pluginHeader.object_list_no_items = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); get_plugin_path(path); - file = fopen(path,"wb"); + file = SDL_RWFromFile(path,"wb"); if (file == NULL) { log_error("Failed to save %s", path); return 0; } - fwrite(&pluginHeader, sizeof(rct_plugin_header), 1, file); - fwrite(RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, uint8*), pluginHeader.object_list_size, 1, file); - fwrite(&filterVersion, sizeof(filterVersion), 1, file); - fwrite(_installedObjectFilters, sizeof(rct_object_filters) * RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32), 1, file); - fclose(file); + SDL_RWwrite(file, &pluginHeader, sizeof(rct_plugin_header), 1); + SDL_RWwrite(file, RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, uint8*), pluginHeader.object_list_size, 1); + SDL_RWwrite(file, &filterVersion, sizeof(filterVersion), 1); + SDL_RWwrite(file, _installedObjectFilters, sizeof(rct_object_filters) * RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32), 1); + SDL_RWclose(file); return 1; } diff --git a/src/platform/platform.h b/src/platform/platform.h index 5d62464e63..55ef8a5461 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -89,7 +89,6 @@ void platform_process_messages(); int platform_scancode_to_rct_keycode(int sdl_key); void platform_start_text_input(utf8 *buffer, int max_length); void platform_stop_text_input(); -SDL_RWops* platform_sdl_rwfromfile(const utf8* filename, const char* mode); // Platform specific definitions char platform_get_path_separator(); diff --git a/src/platform/shared.c b/src/platform/shared.c index 4e6572e199..a80dffaa05 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -685,13 +685,6 @@ void platform_stop_text_input() gTextInput = NULL; } -SDL_RWops* platform_sdl_rwfromfile(const char* filename, const char* mode) -{ - utf8 utf8filename[512]; - win1252_to_utf8(utf8filename, filename, sizeof(utf8filename)); - return SDL_RWFromFile(utf8filename, mode); -} - static void platform_unload_cursors() { for (int i = 0; i < CURSOR_COUNT; i++) diff --git a/src/rct2.c b/src/rct2.c index 534ec5c337..d432f5d692 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -290,12 +290,12 @@ int check_file_paths() */ int check_file_path(int pathId) { - const char * path = get_file_path(pathId); - HANDLE file = CreateFile(path, FILE_GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL); + const utf8* path = get_file_path(pathId); + SDL_RWops *file = SDL_RWFromFile(path, "rb"); switch (pathId) { case PATH_ID_G1: - if (file == INVALID_HANDLE_VALUE) { + if (file == NULL) { // A data file is missing from the installation directory. The original implementation // asks for a CD-ROM path at this point and stores it in cdrom_path @ 0x9AA318. // The file_on_cdrom[pathId] @ 0x009AA0B flag is set to 1 as well. @@ -309,18 +309,18 @@ int check_file_path(int pathId) break; case PATH_ID_CUSTOM1: - if (file != INVALID_HANDLE_VALUE) - ride_music_info_list[36]->length = SetFilePointer(file, 0, 0, FILE_END); // Store file size in music_custom1_size @ 0x009AF164 + if (file != NULL) + ride_music_info_list[36]->length = (uint32)SDL_RWsize(file); // Store file size in music_custom1_size @ 0x009AF164 break; case PATH_ID_CUSTOM2: - if (file != INVALID_HANDLE_VALUE) - ride_music_info_list[37]->length = SetFilePointer(file, 0, 0, FILE_END); // Store file size in music_custom2_size @ 0x009AF16E + if (file != NULL) + ride_music_info_list[37]->length = (uint32)SDL_RWsize(file); // Store file size in music_custom2_size @ 0x009AF16E break; } - if (file != INVALID_HANDLE_VALUE) - CloseHandle(file); + if (file != NULL) + SDL_RWclose(file); return 1; } @@ -399,9 +399,9 @@ void rct2_endupdate() * * rct2: 0x00674E6C */ -const char *get_file_path(int pathId) +const utf8 *get_file_path(int pathId) { - static char path[MAX_PATH]; // get_file_path_buffer @ 0x009E3605 + static utf8 path[MAX_PATH]; // get_file_path_buffer @ 0x009E3605 // The original implementation checks if the file is on CD-ROM here (file_on_cdrom[pathId] @ 0x009AA0B1). // If so, the CD-ROM path (cdrom_path @ 0x9AA318) is used instead. This has been removed for now for diff --git a/src/ride/track.c b/src/ride/track.c index da08a9d92e..6994cb371d 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -277,33 +277,36 @@ static void track_list_query_directory(int *outTotalFiles){ platform_enumerate_files_end(enumFileHandle); } -static int track_list_cache_save(int fileCount, uint8* track_list_cache, uint32 track_list_size){ +static int track_list_cache_save(int fileCount, uint8* track_list_cache, uint32 track_list_size) +{ char path[MAX_PATH]; - FILE *file; + SDL_RWops *file; log_verbose("saving track list cache (tracks.idx)"); get_track_idx_path(path); - file = fopen(path, "wb"); + + file = SDL_RWFromFile(path, "wb"); if (file == NULL) { log_error("Failed to save %s", path); return 0; } - fwrite(&fileCount, sizeof(int), 1, file); - fwrite(track_list_cache, track_list_size, 1, file); + SDL_RWwrite(file, &fileCount, sizeof(int), 1); + SDL_RWwrite(file, track_list_cache, track_list_size, 1); uint8 last_entry = 0xFE; - fwrite(&last_entry, 1, 1, file); - fclose(file); + SDL_RWwrite(file, &last_entry, 1, 1); + SDL_RWclose(file); return 1; } -static uint8* track_list_cache_load(int totalFiles){ +static uint8* track_list_cache_load(int totalFiles) +{ char path[MAX_PATH]; - FILE *file; + SDL_RWops *file; log_verbose("loading track list cache (tracks.idx)"); get_track_idx_path(path); - file = fopen(path, "rb"); + file = SDL_RWFromFile(path, "rb"); if (file == NULL) { log_error("Failed to load %s", path); return 0; @@ -312,11 +315,11 @@ static uint8* track_list_cache_load(int totalFiles){ uint8* track_list_cache; uint32 fileCount; // Remove 4 for the file count variable - long track_list_size = fsize(file) - 4; + long track_list_size = (long)SDL_RWsize(file) - 4; if (track_list_size < 0) return 0; - fread(&fileCount, 4, 1, file); + SDL_RWread(file, &fileCount, 4, 1); if (fileCount != totalFiles){ log_verbose("Track file count is different."); @@ -324,7 +327,7 @@ static uint8* track_list_cache_load(int totalFiles){ } track_list_cache = malloc(track_list_size); - fread(track_list_cache, track_list_size, 1, file); + SDL_RWread(file, track_list_cache, track_list_size, 1); return track_list_cache; } @@ -500,15 +503,15 @@ uint8 td4_track_has_boosters(rct_track_td6* track_design, uint8* track_elements) */ rct_track_td6* load_track_design(const char *path) { - FILE *fp; - long fpLength; + SDL_RWops *fp; + int fpLength; char *fpBuffer, *decoded, *src; int i, decodedLength; uint8* edi; RCT2_GLOBAL(0x009AAC54, uint8) = 1; - fp = fopen(path, "rb"); + fp = SDL_RWFromFile(path, "rb"); if (fp == NULL) return 0; @@ -521,10 +524,10 @@ rct_track_td6* load_track_design(const char *path) *default_name++ = '\0'; // Read whole file into a buffer - fpLength = fsize(fp); + fpLength = (int)SDL_RWsize(fp); fpBuffer = malloc(fpLength); - fread(fpBuffer, fpLength, 1, fp); - fclose(fp); + SDL_RWread(fp, fpBuffer, fpLength, 1); + SDL_RWclose(fp); // Validate the checksum // Not the same checksum algorithm as scenarios and saved games @@ -2944,25 +2947,26 @@ int ride_to_td6(uint8 rideIndex){ /* rct2: 0x006771DC but not really its branched from that * quite far. */ -int save_track_to_file(rct_track_td6* track_design, char* path){ +int save_track_to_file(rct_track_td6* track_design, char* path) +{ window_close_construction_windows(); uint8* track_file = malloc(0x8000); int length = sawyercoding_encode_td6((char*)track_design, track_file, 0x609F); - FILE *file; + SDL_RWops *file; log_verbose("saving track %s", path); - file = fopen(path, "wb"); + file = SDL_RWFromFile(path, "wb"); if (file == NULL) { free(track_file); log_error("Failed to save %s", path); return 0; } - fwrite(track_file, length, 1, file); - fclose(file); + SDL_RWwrite(file, track_file, length, 1); + SDL_RWclose(file); free(track_file); return 1; diff --git a/src/scenario.c b/src/scenario.c index 5671b7cb90..82baeddefb 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -63,7 +63,7 @@ int scenario_load_basic(const char *path, rct_s6_header *header, rct_s6_info *in log_verbose("loading scenario details, %s", path); - rw = platform_sdl_rwfromfile(path, "rb"); + rw = SDL_RWFromFile(path, "rb"); if (rw != NULL) { // Read first chunk sawyercoding_read_chunk(rw, (uint8*)header); @@ -108,7 +108,7 @@ int scenario_load(const char *path) rct_s6_header *s6Header = (rct_s6_header*)0x009E34E4; rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; - rw = platform_sdl_rwfromfile(path, "rb"); + rw = SDL_RWFromFile(path, "rb"); if (rw != NULL) { if (!sawyercoding_validate_checksum(rw) && !gConfigGeneral.allow_loading_with_incorrect_checksum) { SDL_RWclose(rw); diff --git a/src/scenario_list.c b/src/scenario_list.c index b924cbf0a5..adb08858e6 100644 --- a/src/scenario_list.c +++ b/src/scenario_list.c @@ -154,7 +154,7 @@ static int scenario_list_sort_compare(const void *a, const void *b) /** * Gets the path for the scenario scores path. */ -static void scenario_scores_get_path(char *outPath) +static void scenario_scores_get_path(utf8 *outPath) { platform_get_user_directory(outPath, NULL); strcat(outPath, "scores.dat"); @@ -166,7 +166,7 @@ static void scenario_scores_get_path(char *outPath) */ static int scenario_scores_load() { - FILE *file; + SDL_RWops *file; char scoresPath[MAX_PATH]; scenario_scores_get_path(scoresPath); @@ -180,9 +180,9 @@ static int scenario_scores_load() // Try and load the scores file // First check user folder and then fallback to install directory - file = fopen(scoresPath, "rb"); + file = SDL_RWFromFile(scoresPath, "rb"); if (file == NULL) { - file = fopen(get_file_path(PATH_ID_SCORES), "rb"); + file = SDL_RWFromFile(get_file_path(PATH_ID_SCORES), "rb"); if (file == NULL) { log_error("Unable to load scenario scores."); return 0; @@ -191,8 +191,8 @@ static int scenario_scores_load() // Load header rct_scenario_scores_header header; - if (fread(&header, 16, 1, file) != 1) { - fclose(file); + if (SDL_RWread(file, &header, 16, 1) != 1) { + SDL_RWclose(file); log_error("Invalid header in scenario scores file."); return 0; } @@ -202,13 +202,13 @@ static int scenario_scores_load() int scenarioListBufferSize = gScenarioListCount * sizeof(rct_scenario_basic); gScenarioListCapacity = gScenarioListCount; gScenarioList = malloc(scenarioListBufferSize); - if (fread(gScenarioList, scenarioListBufferSize, 1, file) == 1) { - fclose(file); + if (SDL_RWread(file, gScenarioList, scenarioListBufferSize, 1) == 1) { + SDL_RWclose(file); return 1; } // Unable to load scores, free scenario list - fclose(file); + SDL_RWclose(file); gScenarioListCount = 0; gScenarioListCapacity = 0; free(gScenarioList); @@ -222,12 +222,12 @@ static int scenario_scores_load() */ int scenario_scores_save() { - FILE *file; - char scoresPath[MAX_PATH]; + SDL_RWops *file; + utf8 scoresPath[MAX_PATH]; scenario_scores_get_path(scoresPath); - file = fopen(scoresPath, "wb"); + file = SDL_RWFromFile(scoresPath, "wb"); if (file == NULL) { log_error("Unable to save scenario scores."); return 0; @@ -236,10 +236,10 @@ int scenario_scores_save() rct_scenario_scores_header header; header.scenario_count = gScenarioListCount; - fwrite(&header, sizeof(header), 1, file); + SDL_RWwrite(file, &header, sizeof(header), 1); if (gScenarioListCount > 0) - fwrite(gScenarioList, gScenarioListCount * sizeof(rct_scenario_basic), 1, file); + SDL_RWwrite(file, gScenarioList, gScenarioListCount * sizeof(rct_scenario_basic), 1); - fclose(file); + SDL_RWclose(file); return 1; } \ No newline at end of file diff --git a/src/title.c b/src/title.c index 0fc0201a72..f91f5a53ea 100644 --- a/src/title.c +++ b/src/title.c @@ -170,7 +170,7 @@ static int title_load_park(const char *path) int successfulLoad; if (_strcmpi(path_get_extension(path), ".sv6") == 0) { - SDL_RWops* rw = platform_sdl_rwfromfile(path, "rb"); + SDL_RWops* rw = SDL_RWFromFile(path, "rb"); if (rw != NULL) { successfulLoad = game_load_sv6(rw); SDL_RWclose(rw); @@ -522,7 +522,7 @@ static uint8 *generate_random_script() #pragma region Load script.txt -void title_script_get_line(FILE *file, char *parts) +void title_script_get_line(SDL_RWops *file, char *parts) { int i, c, part, cindex, whitespace, comment, load; @@ -535,7 +535,10 @@ void title_script_get_line(FILE *file, char *parts) comment = 0; load = 0; for (; part < 3;) { - c = fgetc(file); + c = 0; + if (SDL_RWread(file, &c, 1, 1) != 1) + c = EOF; + if (c == '\n' || c == '\r' || c == EOF) { parts[part * 128 + cindex] = 0; return; @@ -567,15 +570,16 @@ void title_script_get_line(FILE *file, char *parts) static uint8 *title_script_load() { - FILE *file; + SDL_RWops *file; char parts[3 * 128], *token, *part1, *part2, *src; - char path[MAX_PATH]; - char filePath[] = "data/title/script.txt"; + utf8 path[MAX_PATH]; + utf8 filePath[] = "data/title/script.txt"; sprintf(path, "%s%c%s", gExePath, platform_get_path_separator(), filePath); log_verbose("loading title script, %s", path); - file = fopen(path, "r"); + file = SDL_RWFromFile(path, "r"); + sint64 fileSize = SDL_RWsize(file); if (file == NULL) { log_error("unable to load title script"); return NULL; @@ -583,7 +587,7 @@ static uint8 *title_script_load() uint8 *binaryScript = (uint8*)malloc(1024 * 8); if (binaryScript == NULL) { - fclose(file); + SDL_RWclose(file); log_error("unable to allocate memory for script"); return NULL; @@ -623,8 +627,8 @@ static uint8 *title_script_load() return NULL; } } - } while (!feof(file)); - fclose(file); + } while (SDL_RWtell(file) < fileSize); + SDL_RWclose(file); *scriptPtr++ = TITLE_SCRIPT_RESTART; diff --git a/src/title.h b/src/title.h index a07ee2e59b..234adb6fe7 100644 --- a/src/title.h +++ b/src/title.h @@ -21,6 +21,8 @@ #ifndef _TITLE_H_ #define _TITLE_H_ +#include + enum { TITLE_SCRIPT_WAIT, TITLE_SCRIPT_LOADMM, @@ -43,7 +45,7 @@ extern sint32 gTitleScriptSkipLoad; void title_load(); void title_update(); void title_skip_from_beginning(); -void title_script_get_line(FILE *file, char *parts); +void title_script_get_line(SDL_RWops *file, char *parts); bool title_refresh_sequence(); void DrawOpenRCT2(int x, int y); diff --git a/src/util/util.c b/src/util/util.c index 72420b55b2..d5e8c39b4d 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "util.h" +#include int squaredmetres_to_squaredfeet(int squaredMetres) { @@ -41,7 +42,7 @@ int mph_to_kmph(int mph) return (mph * 1648) / 1024; } -bool filename_valid_characters(const char *filename) +bool filename_valid_characters(const utf8 *filename) { for (int i = 0; filename[i] != '\0'; i++) { if (filename[i] == '\\' || filename[i] == '/' || filename[i] == ':' || filename[i] == '?' || @@ -51,7 +52,7 @@ bool filename_valid_characters(const char *filename) return true; } -const char *path_get_filename(const char *path) +const char *path_get_filename(const utf8 *path) { const char *result, *ch; @@ -66,7 +67,7 @@ const char *path_get_filename(const char *path) return result; } -const char *path_get_extension(const char *path) +const char *path_get_extension(const utf8 *path) { const char *extension = NULL; const char *ch = path; @@ -81,7 +82,7 @@ const char *path_get_extension(const char *path) return extension; } -void path_set_extension(char *path, const char *newExtension) +void path_set_extension(utf8 *path, const utf8 *newExtension) { char *extension = NULL; char *ch = path; @@ -100,7 +101,7 @@ void path_set_extension(char *path, const char *newExtension) strcpy(extension, newExtension); } -void path_remove_extension(char *path) +void path_remove_extension(utf8 *path) { char *ch = path + strlen(path); for (--ch; ch >= path; --ch) { @@ -111,38 +112,26 @@ void path_remove_extension(char *path) } } -long fsize(FILE *fp) +bool readentirefile(const utf8 *path, void **outBuffer, int *outLength) { - long originalPosition, size; - - originalPosition = ftell(fp); - fseek(fp, 0, SEEK_END); - size = ftell(fp); - fseek(fp, originalPosition, SEEK_SET); - - return size; -} - -bool readentirefile(const char *path, void **outBuffer, long *outLength) -{ - FILE *fp; - long fpLength; + SDL_RWops *fp; + int fpLength; void *fpBuffer; // Open file - fp = fopen(path, "rb"); + fp = SDL_RWFromFile(path, "rb"); if (fp == NULL) return 0; // Get length - fseek(fp, 0, SEEK_END); - fpLength = ftell(fp); - rewind(fp); + SDL_RWseek(fp, 0, RW_SEEK_END); + fpLength = (int)SDL_RWtell(fp); + SDL_RWseek(fp, 0, RW_SEEK_SET); // Read whole file into a buffer fpBuffer = malloc(fpLength); - fread(fpBuffer, fpLength, 1, fp); - fclose(fp); + SDL_RWread(fp, fpBuffer, fpLength, 1); + SDL_RWclose(fp); *outBuffer = fpBuffer; *outLength = fpLength; @@ -190,7 +179,7 @@ int strcicmp(char const *a, char const *b) bool utf8_is_bom(const char *str) { - return str[0] == 0xEF && str[1] == 0xBB && str[2] == 0xBF; + return str[0] == (char)0xEF && str[1] == (char)0xBB && str[2] == (char)0xBF; } bool str_is_null_or_empty(const char *str) diff --git a/src/util/util.h b/src/util/util.h index 2723404a2a..c0e75feb61 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -27,14 +27,13 @@ int squaredmetres_to_squaredfeet(int squaredMetres); int metres_to_feet(int metres); int mph_to_kmph(int mph); -bool filename_valid_characters(const char *filename); +bool filename_valid_characters(const utf8 *filename); -const char *path_get_filename(const char *path); -const char *path_get_extension(const char *path); -void path_set_extension(char *path, const char *newExtension); -void path_remove_extension(char *path); -long fsize(FILE *fp); -bool readentirefile(const char *path, void **outBuffer, long *outLength); +const char *path_get_filename(const utf8 *path); +const char *path_get_extension(const utf8 *path); +void path_set_extension(utf8 *path, const utf8 *newExtension); +void path_remove_extension(utf8 *path); +bool readentirefile(const utf8 *path, void **outBuffer, int *outLength); int bitscanforward(int source); int bitcount(int source); diff --git a/src/windows/changelog.c b/src/windows/changelog.c index a10d57fffd..5cfc1147da 100644 --- a/src/windows/changelog.c +++ b/src/windows/changelog.c @@ -192,7 +192,7 @@ static void window_changelog_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, static bool window_changelog_read_file() { window_changelog_dispose_file(); - char path[MAX_PATH]; + utf8 path[MAX_PATH]; sprintf(path, "%s%cchangelog.txt", gExePath, platform_get_path_separator()); if (!readentirefile(path, &_changelogText, &_changelogTextSize)) { log_error("Unable to read changelog.txt"); diff --git a/src/windows/editor_bottom_toolbar.c b/src/windows/editor_bottom_toolbar.c index e6d7614c7e..62a55efa6d 100644 --- a/src/windows/editor_bottom_toolbar.c +++ b/src/windows/editor_bottom_toolbar.c @@ -377,7 +377,7 @@ void window_editor_bottom_toolbar_jump_forward_to_save_scenario() // Save the scenario parkFlagsBackup = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32); RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_18; - SDL_RWops* rw = platform_sdl_rwfromfile(path, "wb+"); + SDL_RWops* rw = SDL_RWFromFile(path, "wb+"); if (rw != NULL) { success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); SDL_RWclose(rw); diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 786cb694ef..a164f8af22 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -767,7 +767,7 @@ static void window_loadsave_select(rct_window *w, const char *path) } break; case (LOADSAVETYPE_SAVE | LOADSAVETYPE_GAME) : - rw = platform_sdl_rwfromfile(path, "wb+"); + rw = SDL_RWFromFile(path, "wb+"); if (rw != NULL) { int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 1 : 0); SDL_RWclose(rw); @@ -799,7 +799,7 @@ static void window_loadsave_select(rct_window *w, const char *path) } break; case (LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE) : - rw = platform_sdl_rwfromfile(path, "wb+"); + rw = SDL_RWFromFile(path, "wb+"); if (rw != NULL) { int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); SDL_RWclose(rw); @@ -819,7 +819,7 @@ static void window_loadsave_select(rct_window *w, const char *path) int parkFlagsBackup = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32); RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_18; s6Info->var_000 = 255; - rw = platform_sdl_rwfromfile(path, "wb+"); + rw = SDL_RWFromFile(path, "wb+"); int success = 0; if (rw != NULL) { success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); diff --git a/src/windows/server_list.c b/src/windows/server_list.c index 113992677a..8d109d1d3a 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -382,7 +382,7 @@ static void server_list_update_player_name() } } -static char *freadstralloc(FILE *file) +static char *freadstralloc(SDL_RWops *file) { int capacity = 64; char *buffer = malloc(capacity); @@ -390,8 +390,8 @@ static char *freadstralloc(FILE *file) int length = 0; int c; for (;;) { - c = fgetc(file); - if (c == EOF) break; + c = 0; + if (SDL_RWread(file, &c, 1, 1) != 1) break; if (c == 0) break; if (length > capacity) { @@ -410,12 +410,12 @@ static char *freadstralloc(FILE *file) static void server_list_load_saved_servers() { utf8 path[MAX_PATH]; - FILE *file; + SDL_RWops *file; platform_get_user_directory(path, NULL); strcat(path, "servers.cfg"); - file = fopen(path, "rb"); + file = SDL_RWFromFile(path, "rb"); if (file == NULL) { return; } @@ -423,7 +423,7 @@ static void server_list_load_saved_servers() dispose_saved_server_list(); // Read number of saved servers - fread(&_numSavedServers, sizeof(uint32), 1, file); + SDL_RWread(file, &_numSavedServers, sizeof(uint32), 1); _savedServers = malloc(_numSavedServers * sizeof(saved_server)); // Load each saved server @@ -435,36 +435,36 @@ static void server_list_load_saved_servers() serverInfo->description = freadstralloc(file); } - fclose(file); + SDL_RWclose(file); } static void server_list_save_saved_servers() { utf8 path[MAX_PATH]; - FILE *file; + SDL_RWops *file; platform_get_user_directory(path, NULL); strcat(path, "servers.cfg"); - file = fopen(path, "wb"); + file = SDL_RWFromFile(path, "wb"); if (file == NULL) { log_error("Unable to save servers."); return; } // Write number of saved servers - fwrite(&_numSavedServers, sizeof(uint32), 1, file); + SDL_RWwrite(file, &_numSavedServers, sizeof(uint32), 1); // Write each saved server for (int i = 0; i < _numSavedServers; i++) { saved_server *serverInfo = &_savedServers[i]; - fwrite(serverInfo->address, strlen(serverInfo->address) + 1, 1, file); - fwrite(serverInfo->name, strlen(serverInfo->name) + 1, 1, file); - fwrite(serverInfo->description, strlen(serverInfo->description) + 1, 1, file); + SDL_RWwrite(file, serverInfo->address, strlen(serverInfo->address) + 1, 1); + SDL_RWwrite(file, serverInfo->name, strlen(serverInfo->name) + 1, 1); + SDL_RWwrite(file, serverInfo->description, strlen(serverInfo->description) + 1, 1); } - fclose(file); + SDL_RWclose(file); } static void dispose_saved_server_list() From be3c54d2664ccbc511c43cdae3a3d0f31593d80f Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 30 Aug 2015 14:25:51 +0100 Subject: [PATCH 0604/1173] fix #1859 --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index 7194ebf11e..3c41cb5ad4 100644 --- a/src/config.c +++ b/src/config.c @@ -292,6 +292,8 @@ static void rwopsprintf(SDL_RWops *file, const char *format, ...) char buffer[64]; vsprintf(buffer, format, args); + SDL_RWwrite(file, buffer, strlen(buffer) + 1, 1); + va_end(args); } From 826d96ab907e9b55052dd8872c261e756b481b38 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 30 Aug 2015 16:51:41 +0100 Subject: [PATCH 0605/1173] add appveyor configuration --- appveyor.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 appveyor.yml diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000000..b9d7498dca --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,4 @@ +version: 0.0.3.{build} +build_script: +- set PATH=C:\Program Files (x86)\MSBuild\14.0\Bin;%PATH% +- .\build.bat \ No newline at end of file From 0c0847160d77e91159d637919f2eeae625a7a99d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 30 Aug 2015 22:57:29 +0100 Subject: [PATCH 0606/1173] fix #1857 --- src/ride/track.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ride/track.c b/src/ride/track.c index 6994cb371d..606348fd1c 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -322,12 +322,14 @@ static uint8* track_list_cache_load(int totalFiles) SDL_RWread(file, &fileCount, 4, 1); if (fileCount != totalFiles){ + SDL_RWclose(file); log_verbose("Track file count is different."); return 0; } track_list_cache = malloc(track_list_size); SDL_RWread(file, track_list_cache, track_list_size, 1); + SDL_RWclose(file); return track_list_cache; } From 401a389e73c3e98e508228bf0048f3a9dc50959c Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 30 Aug 2015 23:45:45 +0100 Subject: [PATCH 0607/1173] fix #1843 --- src/game.h | 1 + src/windows/top_toolbar.c | 218 +++++++++++++++++++------------------- src/world/scenery.h | 8 ++ 3 files changed, 120 insertions(+), 107 deletions(-) diff --git a/src/game.h b/src/game.h index d067b6dc5b..f753333455 100644 --- a/src/game.h +++ b/src/game.h @@ -93,6 +93,7 @@ enum { GAME_COMMAND_FLAG_4 = (1 << 4), GAME_COMMAND_FLAG_5 = (1 << 5), GAME_COMMAND_FLAG_GHOST = (1 << 6), + GAME_COOMAND_FLAG_7, GAME_COMMAND_FLAG_NETWORKED = (1 << 31) // Game command is coming from network }; diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 7a46c18738..8a4e678c74 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -1399,44 +1399,46 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin } /** - * rct2: 0x6e2cc6 + * + * rct2: 0x006E2CC6 */ -static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w, short widgetIndex){ +static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w, short widgetIndex) +{ scenery_remove_ghost_tool_placement(); - if (window_scenery_is_repaint_scenery_tool_on & 1){ + if (window_scenery_is_repaint_scenery_tool_on & 1) { repaint_scenery_tool_down(x, y, widgetIndex); return; } - int selected_tab = window_scenery_selected_scenery_by_tab[window_scenery_active_tab_index]; - uint8 scenery_type = (selected_tab & 0xFF00) >> 8; - uint8 selected_scenery = selected_tab & 0xFF; + int selectedTab = window_scenery_selected_scenery_by_tab[window_scenery_active_tab_index]; + uint8 sceneryType = (selectedTab & 0xFF00) >> 8; + uint8 selectedScenery = selectedTab & 0xFF; - if (selected_tab == -1) return; + if (selectedTab == -1) return; - sint16 grid_x, grid_y; - int ebp = selected_tab; + sint16 gridX, gridY; + int ebp = selectedTab; uint32 parameter_1, parameter_2, parameter_3; - sub_6E1F34(x, y, selected_tab, &grid_x, &grid_y, ¶meter_1, ¶meter_2, ¶meter_3); + sub_6E1F34(x, y, selectedTab, &gridX, &gridY, ¶meter_1, ¶meter_2, ¶meter_3); - if (grid_x == (sint16)0x8000)return; + if (gridX == (sint16)0x8000) return; - switch (scenery_type){ - case 0: + switch (sceneryType){ + case SCENERY_TYPE_SMALL: { - int cluster_size = 1; - if (window_scenery_is_build_cluster_tool_on){ - cluster_size = 35; + int quantity = 1; + if (window_scenery_is_build_cluster_tool_on) { + quantity = 35; } - for (; cluster_size > 0; cluster_size--){ - - int cluster_z_coordinate = RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16); + int successfulPlacements = 0; + for (int q = 0; q < quantity; q++) { + int zCoordinate = RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16); rct_scenery_entry* scenery = g_smallSceneryEntries[(parameter_1 >> 8) & 0xFF]; - sint16 cur_grid_x = grid_x; - sint16 cur_grid_y = grid_y; + sint16 cur_grid_x = gridX; + sint16 cur_grid_y = gridY; if (window_scenery_is_build_cluster_tool_on){ if (!(scenery->small_scenery.flags & SMALL_SCENERY_FLAG_FULL_TILE)){ @@ -1453,92 +1455,92 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w } } - uint8 bl = 1; - if (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) != 0 && - RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_SHIFT_PRESSED, uint8) != 0){ - bl = 20; + uint8 zAttemptRange = 1; + if ( + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) != 0 && + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_SHIFT_PRESSED, uint8) != 0 + ) { + zAttemptRange = 20; } - uint8 success = 0; + + bool success = false; + for (; zAttemptRange != 0; zAttemptRange--){ + int flags = GAME_COMMAND_FLAG_APPLY | (parameter_1 & 0xFF00); - for (; bl != 0; bl--){ RCT2_GLOBAL(0x009A8C29, uint8) |= 1; - - int ebx = parameter_1; - ebx &= 0xFF00; - if (window_scenery_is_build_cluster_tool_on){ - ebx |= 0x9; - } - else{ - ebx |= GAME_COMMAND_FLAG_APPLY; - } - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_POSITION_THIS_HERE; - - int cost = game_do_command(cur_grid_x, ebx, cur_grid_y, parameter_2, GAME_COMMAND_PLACE_SCENERY, RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint8) | (parameter_3 & 0xFFFF0000), RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16)); - - + int cost = game_do_command( + cur_grid_x, + flags, + cur_grid_y, + parameter_2, + GAME_COMMAND_PLACE_SCENERY, + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint8) | (parameter_3 & 0xFFFF0000), + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) + ); RCT2_GLOBAL(0x009A8C29, uint8) &= ~1; if (cost != MONEY32_UNDEFINED){ window_close_by_class(WC_ERROR); sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); - success = 1; + success = true; break; } - if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_NOT_ENOUGH_CASH_REQUIRES || - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_CAN_ONLY_BUILD_THIS_ON_WATER){ + if ( + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_NOT_ENOUGH_CASH_REQUIRES || + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_CAN_ONLY_BUILD_THIS_ON_WATER + ) { break; } RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) += 8; } - if (!success && !window_scenery_is_build_cluster_tool_on){ - sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); - return; + if (success) { + successfulPlacements++; + } else { + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_NOT_ENOUGH_CASH_REQUIRES) { + break; + } } + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) = zCoordinate; + } - RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) = cluster_z_coordinate; + if (successfulPlacements > 0) { + window_close_by_class(WC_ERROR); + } else { + sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); } break; } - case 1: + case SCENERY_TYPE_PATH_ITEM: { - // Path Bits - int ebx = parameter_1; - ebx &= 0xFF00; - ebx |= 0x81; + int flags = GAME_COMMAND_FLAG_APPLY | GAME_COOMAND_FLAG_7 | (parameter_1 & 0xFF00); RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_POSITION_THIS_HERE; - - int cost = game_do_command(grid_x, ebx, grid_y, parameter_2, GAME_COMMAND_PLACE_PATH, parameter_3, 0); - - if (cost == MONEY32_UNDEFINED){ - return; + int cost = game_do_command(gridX, flags, gridY, parameter_2, GAME_COMMAND_PLACE_PATH, parameter_3, 0); + if (cost != MONEY32_UNDEFINED) { + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); } - - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); break; } - case 2: + case SCENERY_TYPE_WALL: { - // Walls - uint8 bl = 1; - if (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) != 0 && - RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_SHIFT_PRESSED, uint8) != 0){ - bl = 20; + uint8 zAttemptRange = 1; + if ( + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) != 0 && + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_SHIFT_PRESSED, uint8) != 0 + ) { + zAttemptRange = 20; } - for (; bl != 0; bl--){ - RCT2_GLOBAL(0x009A8C29, uint8) |= 1; + for (; zAttemptRange != 0; zAttemptRange--) { + int flags = (parameter_1 & 0xFF00) | GAME_COMMAND_FLAG_APPLY; + RCT2_GLOBAL(0x009A8C29, uint8) |= 1; RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_BUILD_PARK_ENTRANCE_HERE; - - int ebx = (parameter_1 & 0xFF00) | 1; - - int cost = game_do_command(grid_x, ebx, grid_y, parameter_2, GAME_COMMAND_PLACE_FENCE, RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16), RCT2_GLOBAL(0x00F64F15, uint16)); - + int cost = game_do_command(gridX, flags, gridY, parameter_2, GAME_COMMAND_PLACE_FENCE, RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16), RCT2_GLOBAL(0x00F64F15, uint16)); RCT2_GLOBAL(0x009A8C29, uint8) &= ~1; if (cost != MONEY32_UNDEFINED){ @@ -1547,8 +1549,10 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w return; } - if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_NOT_ENOUGH_CASH_REQUIRES || - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_CAN_ONLY_BUILD_THIS_ON_WATER){ + if ( + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_NOT_ENOUGH_CASH_REQUIRES || + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_CAN_ONLY_BUILD_THIS_ON_WATER + ) { break; } @@ -1558,25 +1562,22 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); break; } - case 3: + case SCENERY_TYPE_LARGE: { - // Large Scenery - uint8 bl = 1; - if (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) != 0 && - RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_SHIFT_PRESSED, uint8) != 0){ - bl = 20; + uint8 zAttemptRange = 1; + if ( + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) != 0 && + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_SHIFT_PRESSED, uint8) != 0 + ) { + zAttemptRange = 20; } - for (; bl != 0; bl--){ + for (; zAttemptRange != 0; zAttemptRange--) { + int flags = (parameter_1 & 0xFF00) | GAME_COMMAND_FLAG_APPLY; + RCT2_GLOBAL(0x009A8C29, uint8) |= 1; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_POSITION_THIS_HERE; - - int ebx = (parameter_1 & 0xFF00) | 1; - - int cost = game_do_command(grid_x, ebx, grid_y, parameter_2, GAME_COMMAND_PLACE_LARGE_SCENERY, parameter_3, RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16)); - - + int cost = game_do_command(gridX, flags, gridY, parameter_2, GAME_COMMAND_PLACE_LARGE_SCENERY, parameter_3, RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16)); RCT2_GLOBAL(0x009A8C29, uint8) &= ~1; if (cost != MONEY32_UNDEFINED){ @@ -1585,8 +1586,10 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w return; } - if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_NOT_ENOUGH_CASH_REQUIRES || - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_CAN_ONLY_BUILD_THIS_ON_WATER){ + if ( + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_NOT_ENOUGH_CASH_REQUIRES || + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) == STR_CAN_ONLY_BUILD_THIS_ON_WATER + ) { break; } @@ -1594,27 +1597,28 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w } sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); - } break; - case 4: + } + case SCENERY_TYPE_BANNER: { - // Banners + int flags = (parameter_1 & 0xFF00) | GAME_COMMAND_FLAG_APPLY; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_POSITION_THIS_HERE; + registers regs = { + .eax = gridX, + .ebx = flags, + .ecx = gridY, + .edx = parameter_2, + .esi = GAME_COMMAND_PLACE_BANNER, + .edi = parameter_3 + }; + money32 cost = game_do_command_p(GAME_COMMAND_PLACE_BANNER, ®s.eax, ®s.ebx, ®s.ecx, ®s.edx, ®s.esi, ®s.edi, ®s.ebp); + if (cost != MONEY32_UNDEFINED) { + int bannerId = regs.edi; - // The return value will be banner id but the input is colour (param 3) - int banner_id = parameter_3; - - int cost; - { - int esi = 0, eax = grid_x, ecx = grid_y, edx = parameter_2, ebx = (parameter_1 & 0xFF00) | 1; - cost = game_do_command_p(GAME_COMMAND_PLACE_BANNER, &eax, &ebx, &ecx, &edx, &esi, &banner_id, &ebp); + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + window_banner_open(bannerId); } - - if (cost == MONEY32_UNDEFINED)return; - - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); - - window_banner_open(banner_id); break; } } diff --git a/src/world/scenery.h b/src/world/scenery.h index df208530a5..31db63c7ee 100644 --- a/src/world/scenery.h +++ b/src/world/scenery.h @@ -149,6 +149,14 @@ enum { PATH_BIT_FLAG_JUMPING_FOUNTAIN_SNOW = 1 << 5 }; +enum { + SCENERY_TYPE_SMALL, + SCENERY_TYPE_PATH_ITEM, + SCENERY_TYPE_WALL, + SCENERY_TYPE_LARGE, + SCENERY_TYPE_BANNER +}; + #define SCENERY_ENTRIES_BY_TAB 128 #define g_smallSceneryEntries ((rct_scenery_entry**)object_entry_groups[OBJECT_TYPE_SMALL_SCENERY].chunks) From dd5d6077246e66b04501d0fc38d88ff458c7fef0 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 31 Aug 2015 00:41:58 +0100 Subject: [PATCH 0608/1173] fix typo --- src/game.h | 2 +- src/windows/top_toolbar.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game.h b/src/game.h index f753333455..28f76ddd82 100644 --- a/src/game.h +++ b/src/game.h @@ -93,7 +93,7 @@ enum { GAME_COMMAND_FLAG_4 = (1 << 4), GAME_COMMAND_FLAG_5 = (1 << 5), GAME_COMMAND_FLAG_GHOST = (1 << 6), - GAME_COOMAND_FLAG_7, + GAME_COMMAND_FLAG_7, GAME_COMMAND_FLAG_NETWORKED = (1 << 31) // Game command is coming from network }; diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 8a4e678c74..892faf9de5 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -1516,7 +1516,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w } case SCENERY_TYPE_PATH_ITEM: { - int flags = GAME_COMMAND_FLAG_APPLY | GAME_COOMAND_FLAG_7 | (parameter_1 & 0xFF00); + int flags = GAME_COMMAND_FLAG_APPLY | GAME_COMMAND_FLAG_7 | (parameter_1 & 0xFF00); RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_POSITION_THIS_HERE; int cost = game_do_command(gridX, flags, gridY, parameter_2, GAME_COMMAND_PLACE_PATH, parameter_3, 0); From 2ff3e33e3e8b95a9cea70f983c6b384107d032f0 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 31 Aug 2015 11:12:15 +0200 Subject: [PATCH 0609/1173] Add cheat to disable vandalism --- data/language/english_uk.txt | 2 ++ src/config.c | 1 + src/config.h | 1 + src/localisation/string_ids.h | 3 +++ src/peep/peep.c | 3 +++ src/windows/cheats.c | 30 +++++++++++++++++++----------- 6 files changed, 29 insertions(+), 11 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 180217eb18..b114e49fc6 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3852,3 +3852,5 @@ STR_5510 :Default sound device STR_5511 :(UNKNOWN) STR_5512 :Save Game As STR_5513 :(Quick) save game +STR_5514 :Disable vandalism +STR_5515 :{SMALLFONT}{BLACK}Stops guests from vandalising your park when they're angry diff --git a/src/config.c b/src/config.c index 3c41cb5ad4..152cfb0cdc 100644 --- a/src/config.c +++ b/src/config.c @@ -223,6 +223,7 @@ config_property_definition _cheatDefinitions[] = { { offsetof(cheat_configuration, unlock_all_prices), "unlock_all_prices", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(cheat_configuration, build_in_pause_mode), "build_in_pause_mode", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(cheat_configuration, ignore_ride_intensity), "ignore_ride_intensity", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(cheat_configuration, disable_vandalism), "disable_vandalism", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, }; config_property_definition _twitchDefinitions[] = { diff --git a/src/config.h b/src/config.h index 8cbe69fd83..87ea0e48ba 100644 --- a/src/config.h +++ b/src/config.h @@ -197,6 +197,7 @@ typedef struct { uint8 unlock_all_prices; uint8 build_in_pause_mode; uint8 ignore_ride_intensity; + uint8 disable_vandalism; } cheat_configuration; typedef struct { diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index f0f09cf83b..2dcd3b2624 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2073,6 +2073,9 @@ enum { STR_SAVE_GAME_AS = 5512, STR_SHORTCUT_QUICK_SAVE_GAME = 5513, + STR_CHEAT_DISABLE_VANDALISM = 5514, + STR_CHEAT_DISABLE_VANDALISM_TIP = 5515, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/peep/peep.c b/src/peep/peep.c index 5e99ed6eb7..606a64942d 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -3891,6 +3891,9 @@ static int peep_update_walking_find_bin(rct_peep* peep){ /* rct2: 0x00690848*/ static void peep_update_walking_break_scenery(rct_peep* peep){ + if(gConfigCheat.disable_vandalism) + return; + if (!(peep->flags & PEEP_FLAGS_ANGRY)){ if (peep->happiness >= 48) return; if (peep->energy < 85) return; diff --git a/src/windows/cheats.c b/src/windows/cheats.c index c1385b4ca1..80435be664 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -78,6 +78,7 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1, WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15, WIDX_GUEST_IGNORE_RIDE_INTENSITY, + WIDX_DISABLE_VANDALISM, WIDX_GIVE_ALL_GUESTS_GROUP, WIDX_GIVE_GUESTS_MONEY, WIDX_GIVE_GUESTS_PARK_MAPS, @@ -186,7 +187,7 @@ static rct_widget window_cheats_money_widgets[] = { static rct_widget window_cheats_guests_widgets[] = { MAIN_CHEATS_WIDGETS, - { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(0), HPL(10.5), STR_CHEAT_SET_GUESTS_PARAMETERS, STR_NONE }, // Guests parameters group frame + { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(0), HPL(11.5), STR_CHEAT_SET_GUESTS_PARAMETERS, STR_NONE }, // Guests parameters group frame { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(1), HPL(1), STR_MAX, STR_NONE }, // happiness max { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(1), HPL(1), STR_MIN, STR_NONE }, // happiness min { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(2), HPL(2), STR_MAX, STR_NONE }, // energy max @@ -203,15 +204,16 @@ static rct_widget window_cheats_guests_widgets[] = { { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(7), HPL(7), STR_MIN, STR_NONE }, // bathroom min { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(9), HPL(9), STR_CHEAT_MORE_THAN_1, STR_NONE }, // ride intensity > 1 { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(9), HPL(9), STR_CHEAT_LESS_THAN_15, STR_NONE }, // ride intensity < 15 - { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(10), OHPL(10), STR_CHEAT_IGNORE_INTENSITY, STR_NONE }, // don't care about intensity - { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(12), HPL(14.5), STR_CHEAT_GIVE_ALL_GUESTS, STR_NONE }, // Guests parameters group frame - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(13), HPL(13), STR_CHEAT_CURRENCY_FORMAT, STR_NONE }, // give guests money - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(13), HPL(13), 2018, STR_NONE }, // give guests park maps - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(14), HPL(14), 2016, STR_NONE }, // give guests balloons - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(14), HPL(14), 2020, STR_NONE }, // give guests umbrellas - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(16), HPL(16), STR_CHEAT_LARGE_TRAM_GUESTS, STR_CHEAT_TIP_LARGE_TRAM_GUESTS }, // large tram - { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(16), HPL(16), STR_CHEAT_REMOVE_ALL_GUESTS, STR_CHEAT_TIP_REMOVE_ALL_GUESTS }, // remove all guests - { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(17), HPL(17), STR_CHEAT_EXPLODE, STR_CHEAT_TIP_EXPLODE }, // explode guests + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(10), OHPL(10), STR_CHEAT_IGNORE_INTENSITY, STR_NONE }, // guests ignore intensity + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(11), OHPL(11), STR_CHEAT_DISABLE_VANDALISM, STR_CHEAT_DISABLE_VANDALISM_TIP }, // disable vandalism + { WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(13), HPL(15.5), STR_CHEAT_GIVE_ALL_GUESTS, STR_NONE }, // Guests parameters group frame + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(14), HPL(14), STR_CHEAT_CURRENCY_FORMAT, STR_NONE }, // give guests money + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(14), HPL(14), STR_SHOP_ITEM_PLURAL_PARK_MAP, STR_NONE }, // give guests park maps + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(15), HPL(15), STR_SHOP_ITEM_PLURAL_BALLOON, STR_NONE }, // give guests balloons + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(15), HPL(15), STR_SHOP_ITEM_PLURAL_UMBRELLA, STR_NONE }, // give guests umbrellas + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(17), HPL(17), STR_CHEAT_LARGE_TRAM_GUESTS, STR_CHEAT_TIP_LARGE_TRAM_GUESTS }, // large tram + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(17), HPL(17), STR_CHEAT_REMOVE_ALL_GUESTS, STR_CHEAT_TIP_REMOVE_ALL_GUESTS }, // remove all guests + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(18), HPL(18), STR_CHEAT_EXPLODE, STR_CHEAT_TIP_EXPLODE }, // explode guests { WIDGETS_END }, }; @@ -408,7 +410,7 @@ static rct_window_event_list *window_cheats_page_events[] = { 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_HIGH_MONEY) | (1ULL << WIDX_CLEAR_LOAN), - (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_GUEST_PARAMETERS_GROUP) | (1ULL << WIDX_GUEST_HAPPINESS_MAX) | (1ULL << WIDX_GUEST_HAPPINESS_MIN) | (1ULL << WIDX_GUEST_ENERGY_MAX) | (1ULL << WIDX_GUEST_ENERGY_MIN) | (1ULL << WIDX_GUEST_HUNGER_MAX) | (1ULL << WIDX_GUEST_HUNGER_MIN) | (1ULL << WIDX_GUEST_THIRST_MAX) | (1ULL << WIDX_GUEST_THIRST_MIN) | (1ULL << WIDX_GUEST_NAUSEA_MAX) | (1ULL << WIDX_GUEST_NAUSEA_MIN) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1ULL << WIDX_GUEST_BATHROOM_MAX) | (1ULL << WIDX_GUEST_BATHROOM_MIN) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1ULL << WIDX_GUEST_IGNORE_RIDE_INTENSITY) | (1ULL << WIDX_GIVE_ALL_GUESTS_GROUP) | (1ULL << WIDX_GIVE_GUESTS_MONEY) | (1ULL << WIDX_GIVE_GUESTS_PARK_MAPS) | (1ULL << WIDX_GIVE_GUESTS_BALLOONS) | (1ULL << WIDX_GIVE_GUESTS_UMBRELLAS) | (1ULL << WIDX_TRAM_GUESTS) | (1ULL << WIDX_REMOVE_ALL_GUESTS) | (1ULL << WIDX_EXPLODE_GUESTS), + (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_GUEST_PARAMETERS_GROUP) | (1ULL << WIDX_GUEST_HAPPINESS_MAX) | (1ULL << WIDX_GUEST_HAPPINESS_MIN) | (1ULL << WIDX_GUEST_ENERGY_MAX) | (1ULL << WIDX_GUEST_ENERGY_MIN) | (1ULL << WIDX_GUEST_HUNGER_MAX) | (1ULL << WIDX_GUEST_HUNGER_MIN) | (1ULL << WIDX_GUEST_THIRST_MAX) | (1ULL << WIDX_GUEST_THIRST_MIN) | (1ULL << WIDX_GUEST_NAUSEA_MAX) | (1ULL << WIDX_GUEST_NAUSEA_MIN) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1ULL << WIDX_GUEST_BATHROOM_MAX) | (1ULL << WIDX_GUEST_BATHROOM_MIN) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1ULL << WIDX_GUEST_IGNORE_RIDE_INTENSITY) | (1ULL << WIDX_GIVE_ALL_GUESTS_GROUP) | (1ULL << WIDX_GIVE_GUESTS_MONEY) | (1ULL << WIDX_GIVE_GUESTS_PARK_MAPS) | (1ULL << WIDX_GIVE_GUESTS_BALLOONS) | (1ULL << WIDX_GIVE_GUESTS_UMBRELLAS) | (1ULL << WIDX_TRAM_GUESTS) | (1ULL << WIDX_REMOVE_ALL_GUESTS) | (1ULL << WIDX_EXPLODE_GUESTS) | (1ULL << WIDX_DISABLE_VANDALISM), (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_FREEZE_CLIMATE) | (1ULL << WIDX_OPEN_CLOSE_PARK) | (1ULL << WIDX_WEATHER_SUN) | (1ULL << WIDX_WEATHER_THUNDER) | (1ULL << WIDX_CLEAR_GRASS) | (1ULL << WIDX_MOWED_GRASS) | (1ULL << WIDX_WATER_PLANTS) | (1ULL << WIDX_FIX_VANDALISM) | (1ULL << WIDX_REMOVE_LITTER) | (1ULL << WIDX_WIN_SCENARIO) | (1ULL << WIDX_HAVE_FUN) | (1ULL << WIDX_UNLOCK_ALL_PRICES) | (1ULL << WIDX_SANDBOX_MODE) | (1ULL << WIDX_FAST_STAFF) | (1ULL << WIDX_NORMAL_STAFF) | (1ULL << WIDX_PARK_PARAMETERS) | (1ULL << WIDX_FORCE_PARK_RATING) | (1ULL << WIDX_INCREASE_PARK_RATING) | (1ULL << WIDX_DECREASE_PARK_RATING), (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) }; @@ -860,6 +862,11 @@ static void window_cheats_guests_mouseup(rct_window *w, int widgetIndex) config_save_default(); window_invalidate(w); break; + case WIDX_DISABLE_VANDALISM: + gConfigCheat.disable_vandalism ^= 1; + config_save_default(); + window_invalidate(w); + break; } } @@ -1048,6 +1055,7 @@ static void window_cheats_invalidate(rct_window *w) case WINDOW_CHEATS_PAGE_GUESTS: RCT2_GLOBAL(0x013CE952, int) = 10000; widget_set_checkbox_value(w, WIDX_GUEST_IGNORE_RIDE_INTENSITY, gConfigCheat.ignore_ride_intensity); + widget_set_checkbox_value(w, WIDX_DISABLE_VANDALISM, gConfigCheat.disable_vandalism); break; case WINDOW_CHEATS_PAGE_MISC: w->widgets[WIDX_OPEN_CLOSE_PARK].image = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_OPEN ? From 5f342eeb05ecfe4c8b014c0d4d13acf64c706bb4 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 31 Aug 2015 11:11:02 +0100 Subject: [PATCH 0610/1173] fix flag value --- src/game.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game.h b/src/game.h index 28f76ddd82..1713c641f1 100644 --- a/src/game.h +++ b/src/game.h @@ -93,7 +93,7 @@ enum { GAME_COMMAND_FLAG_4 = (1 << 4), GAME_COMMAND_FLAG_5 = (1 << 5), GAME_COMMAND_FLAG_GHOST = (1 << 6), - GAME_COMMAND_FLAG_7, + GAME_COMMAND_FLAG_7 = (1 << 7), GAME_COMMAND_FLAG_NETWORKED = (1 << 31) // Game command is coming from network }; From 03034e7e2a20f09f931e297635504fc51aeaaaef Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 31 Aug 2015 12:42:46 +0200 Subject: [PATCH 0611/1173] Clear all map elements beforing generating a new map, fixes #1762 --- src/world/map.c | 11 +++++++++++ src/world/map.h | 2 ++ src/world/mapgen.c | 4 ++++ 3 files changed, 17 insertions(+) diff --git a/src/world/map.c b/src/world/map.c index 75bb3795b2..ef156ffe67 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3954,3 +3954,14 @@ bool map_surface_is_blocked(sint16 x, sint16 y){ return false; } +/* Clears all map elements, to be used before generating a new map */ +void map_clear_all_elements() +{ + int mapMaxXY = RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16); + + for (int y = 0; y < (256 * 32); y += 32) { + for (int x = 0; x < (256 * 32); x += 32) { + sub_68AE2A(x, y); + } + } +} diff --git a/src/world/map.h b/src/world/map.h index 5f26f71ed7..1f82f1fb98 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -370,4 +370,6 @@ void map_invalidate_element(int x, int y, rct_map_element *mapElement); int map_get_tile_side(int mapX, int mapY); int map_get_tile_quadrant(int mapX, int mapY); +void map_clear_all_elements(); + #endif diff --git a/src/world/mapgen.c b/src/world/mapgen.c index ece85d5509..5bdfb4eeb3 100644 --- a/src/world/mapgen.c +++ b/src/world/mapgen.c @@ -105,6 +105,8 @@ void mapgen_generate_blank(mapgen_settings *settings) int x, y; rct_map_element *mapElement; + map_clear_all_elements(); + map_init(settings->mapSize); for (y = 1; y < settings->mapSize - 1; y++) { for (x = 1; x < settings->mapSize - 1; x++) { @@ -149,6 +151,8 @@ void mapgen_generate(mapgen_settings *settings) } } + map_clear_all_elements(); + // Initialise the base map map_init(mapSize); for (y = 1; y < mapSize - 1; y++) { From d49c99e0204de0892eafb40074d9543620b36cab Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 31 Aug 2015 13:23:52 +0200 Subject: [PATCH 0612/1173] Fix seat colour of TD4 River Rapids, fixes #1695 --- src/ride/track.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ride/track.c b/src/ride/track.c index 606348fd1c..83781183da 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -646,9 +646,14 @@ rct_track_td6* load_track_design(const char *path) } memcpy(&track_design->vehicle_object, vehicle_object, sizeof(rct_object_entry)); - for (i = 0; i < 32; i++) + for (i = 0; i < 32; i++) { track_design->vehicle_additional_colour[i] = track_design->vehicle_colours[i].trim_colour; + // RCT1 river rapids always had black seats. + if (track_design->type == RCT1_RIDE_TYPE_RIVER_RAPIDS) + track_design->vehicle_colours[i].trim_colour = 0; + } + track_design->space_required_x = 255; track_design->space_required_y = 255; track_design->lift_hill_speed_num_circuits = 5; From 5508ba587474d20a33faafb9075aadf7b536e4f5 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 31 Aug 2015 12:27:02 +0100 Subject: [PATCH 0613/1173] fix #1841 --- .gitignore | 1 + src/peep/peep.c | 52 ++++++++++++++++++++++++++----------------------- 2 files changed, 29 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index 5899e73e20..20ea9aed3a 100644 --- a/.gitignore +++ b/.gitignore @@ -57,6 +57,7 @@ local.properties *.suo *.user *.sln.docstates +.vs/ # Build results diff --git a/src/peep/peep.c b/src/peep/peep.c index 606a64942d..851384cc13 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -290,40 +290,44 @@ static void peep_leave_park(rct_peep* peep){ window_invalidate_by_number(WC_PEEP, peep->sprite_index); } -/* rct2: 0x0068f8CD*/ -static void sub_68F8CD(rct_peep *peep){ - if (peep->energy_growth_rate >= 33) +/** + * + * rct2: 0x0068F8CD + */ +static void sub_68F8CD(rct_peep *peep) +{ + if (peep->energy_growth_rate >= 33) { peep->energy_growth_rate -= 2; - - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TEMPERATURE, uint8) >= 21){ - if (peep->thirst >= 5) - peep->thirst--; } - if (peep->var_2A != 0) + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TEMPERATURE, uint8) >= 21 && peep->thirst >= 5) { + peep->thirst--; + } + + if (peep->var_2A != 0) { return; + } if (!(peep->flags & PEEP_FLAGS_LEAVING_PARK)){ - if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)){ - if (peep->energy >= 55) + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) { + if (peep->energy >= 70 && peep->happiness >= 60) { return; - - if (peep->happiness >= 45) - return; - - if (peep->cash_in_pocket >= MONEY(5, 00)) + } + } else { + if ( + peep->energy >= 55 && + peep->happiness >= 45 && + peep->cash_in_pocket >= MONEY(5, 00) + ) { return; + } } - else{ - if (peep->energy >= 70) - return; - - if (peep->happiness >= 60) - return; - } - if ((scenario_rand() & 0xFFFF) > 3276) - return; } + + if ((scenario_rand() & 0xFFFF) > 3276) { + return; + } + peep_leave_park(peep); } From 064cdf4d065c1bf2602d7de93715b4b3cde6415e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 31 Aug 2015 15:00:11 +0100 Subject: [PATCH 0614/1173] implement ride_set_vehicle_colours_to_random_preset --- projects/openrct2.vcxproj | 6 +-- src/object.c | 5 +-- src/ride/ride.c | 64 +++++++++++++++++++++++---- src/ride/ride.h | 93 +++++++++++++++++++++------------------ 4 files changed, 110 insertions(+), 58 deletions(-) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 36bb81c361..c5b0a22447 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -352,7 +352,7 @@ Disabled true 1Byte - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;SDL_MAIN_HANDLED;%(PreprocessorDefinitions) MultiThreaded true $(IntDir)fake\%(RelativeDir) @@ -383,7 +383,7 @@ xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" false - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;SDL_MAIN_HANDLED;%(PreprocessorDefinitions) $(IntDir)fake\%(RelativeDir) true Speed @@ -423,7 +423,7 @@ xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" false - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;ENABLE_TESTS;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;SDL_MAIN_HANDLED;ENABLE_TESTS;%(PreprocessorDefinitions) $(IntDir)fake\%(RelativeDir) true diff --git a/src/object.c b/src/object.c index 4fcfadef1a..c5d7af1f37 100644 --- a/src/object.c +++ b/src/object.c @@ -444,8 +444,7 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp } object_get_localised_text(&chunk, ecx, ebx, 2); - // Offset to Unknown struct - ride_type->var_1AE = (uint32_t)chunk; + ride_type->vehicle_preset_list = (vehicle_colour_preset_list*)chunk; // If Unknown struct size is 0xFF then there are 32 3 byte structures uint8 unknown_size = *chunk++; @@ -723,7 +722,7 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp rideVehicleEntry->peep_loading_positions = 0; } - ride_type->var_1AE = 0; + ride_type->vehicle_preset_list = NULL; return flags; } else if ((flags & 0xFF) == 2){ diff --git a/src/ride/ride.c b/src/ride/ride.c index 43a432f84e..25add82b0c 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -145,7 +145,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 sub_6DE52C(rct_ride *ride); +static void ride_set_vehicle_colours_to_random_preset(rct_ride *ride); rct_ride_type *ride_get_entry(rct_ride *ride) { @@ -2864,6 +2864,59 @@ 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) +{ + int i; + rct_ride *ride2; + FOR_ALL_RIDES(i, ride2) { + if (ride2 == ride) continue; + if (ride2->subtype != ride->subtype) 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) +{ + for (int attempt = 0; attempt < 200; attempt++) { + uint8 numColourConfigurations = presetList->count; + int randomConfigIndex = scenario_rand() % numColourConfigurations; + vehicle_colour *preset = &presetList->list[randomConfigIndex]; + + if (ride_does_vehicle_colour_exist(ride, preset)) { + return randomConfigIndex; + } + } + return 0; +} + +/** + * + * rct2: 0x006DE52C + */ +static void ride_set_vehicle_colours_to_random_preset(rct_ride *ride) +{ + 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]; + 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; + } else { + ride->colour_scheme_type = RIDE_COLOUR_SCHEME_DIFFERENT_PER_TRAIN; + for (int i = 0; i < 32; i++) { + vehicle_colour *preset = &presetList->list[i]; + ride->vehicle_colours[i].body_colour = preset->main; + ride->vehicle_colours[i].trim_colour = preset->additional_1; + ride->vehicle_colours_extended[i] = preset->additional_2; + } + } +} + #pragma endregion #pragma region Reachability @@ -5059,7 +5112,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; - sub_6DE52C(ride); + ride_set_vehicle_colours_to_random_preset(ride); window_invalidate_by_class(WC_RIDE_LIST); RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION; @@ -6171,11 +6224,6 @@ void ride_update_max_vehicles(int rideIndex) } } -static void sub_6DE52C(rct_ride *ride) -{ - RCT2_CALLPROC_X(0x006DE52C, 0, 0, 0, 0, (int)ride, 0, 0); -} - void ride_set_ride_entry(int rideIndex, int rideEntry) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_SET_VEHICLE_TYPE_FAIL; @@ -6276,7 +6324,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; - sub_6DE52C(ride); + ride_set_vehicle_colours_to_random_preset(ride); break; } diff --git a/src/ride/ride.h b/src/ride/ride.h index a87a168d64..fd932a11d4 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -48,6 +48,28 @@ typedef struct { uint8 entry_index; } ride_list_item; +typedef struct { + uint8 main; + uint8 additional; + uint8 supports; +} track_colour; + +typedef struct { + uint8 main; + uint8 additional_1; + uint8 additional_2; +} vehicle_colour; + +typedef struct { + uint8 count; + track_colour list[256]; +} track_colour_preset_list; + +typedef struct { + uint8 count; + vehicle_colour list[256]; +} vehicle_colour_preset_list; + /** * Ride type vehicle structure. * size: 0x65 @@ -99,38 +121,38 @@ typedef struct{ * size: unknown */ typedef struct { - rct_string_id name; // 0x000 - rct_string_id description; // 0x002 - uint32 images_offset; // 0x004 - uint32 flags; // 0x008 - uint8 ride_type[3]; // 0x00C - uint8 min_cars_in_train; // 0x00F - uint8 max_cars_in_train; // 0x010 - uint8 cars_per_flat_ride; // 0x011 - uint8 zero_cars; // 0x012 - uint8 tab_vehicle; // 0x013 - uint8 default_vehicle; // 0x014 - uint8 front_vehicle; // 0x015 - uint8 second_vehicle; // 0x016 - uint8 rear_vehicle; // 0x017 - uint8 third_vehicle; // 0x018 + rct_string_id name; // 0x000 + rct_string_id description; // 0x002 + uint32 images_offset; // 0x004 + uint32 flags; // 0x008 + uint8 ride_type[3]; // 0x00C + uint8 min_cars_in_train; // 0x00F + uint8 max_cars_in_train; // 0x010 + uint8 cars_per_flat_ride; // 0x011 + uint8 zero_cars; // 0x012 + uint8 tab_vehicle; // 0x013 + uint8 default_vehicle; // 0x014 + uint8 front_vehicle; // 0x015 + uint8 second_vehicle; // 0x016 + uint8 rear_vehicle; // 0x017 + uint8 third_vehicle; // 0x018 uint8 pad_019; - rct_ride_type_vehicle vehicles[4]; // 0x1A - uint32 var_1AE; - sint8 excitement_multipler; // 0x1B2 - sint8 intensity_multipler; // 0x1B3 - sint8 nausea_multipler; // 0x1B4 - uint8 max_height; // 0x1B5 + rct_ride_type_vehicle vehicles[4]; // 0x01A + vehicle_colour_preset_list *vehicle_preset_list; // 0x1AE + sint8 excitement_multipler; // 0x1B2 + sint8 intensity_multipler; // 0x1B3 + sint8 nausea_multipler; // 0x1B4 + uint8 max_height; // 0x1B5 union { - uint64 enabledTrackPieces; // 0x1B6 + uint64 enabledTrackPieces; // 0x1B6 struct { - uint32 enabledTrackPiecesA; // 0x1B6 - uint32 enabledTrackPiecesB; // 0x1BA + uint32 enabledTrackPiecesA; // 0x1B6 + uint32 enabledTrackPiecesB; // 0x1BA }; }; - uint8 category[2]; // 0x1BE - uint8 shop_item; // 0x1C0 - uint8 shop_item_secondary; // 0x1C1 + uint8 category[2]; // 0x1BE + uint8 shop_item; // 0x1C0 + uint8 shop_item_secondary; // 0x1C1 } rct_ride_type; /** @@ -705,23 +727,6 @@ enum { RIDE_INVALIDATE_RIDE_MAINTENANCE = 1 << 5, }; -typedef struct { - uint8 main; - uint8 additional; - uint8 supports; -} track_colour; - -typedef struct { - uint8 main; - uint8 additional_1; - uint8 additional_2; -} vehicle_colour; - -typedef struct { - uint8 count; - track_colour list[256]; -} track_colour_preset_list; - enum { RIDE_MEASUREMENT_FLAG_RUNNING = 1 << 0, RIDE_MEASUREMENT_FLAG_UNLOADING = 1 << 1, From 05132b2e04d015e913642370b849368ddb2aaa89 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 31 Aug 2015 15:57:50 +0100 Subject: [PATCH 0615/1173] implement sub_666CBE --- src/ride/ride.c | 113 +++++++++++++++++++++++++++++++----------------- 1 file changed, 73 insertions(+), 40 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 25add82b0c..247808da63 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -6350,7 +6350,43 @@ void sub_6CB945(int rideIndex) RCT2_CALLPROC_X(0x006CB945, 0, 0, 0, rideIndex, 0, 0, 0); } -money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 direction, uint8 flags, uint8 rideIndex, uint8 station_num, uint8 is_exit){ +/** + * + * rct2: 0x00666CBE + */ +static void sub_666CBE(int x, int y, rct_map_element *mapElement) +{ + int direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; + x += TileDirectionDelta[direction].x; + y += TileDirectionDelta[direction].y; + int z = mapElement->base_height; + int rideIndex = mapElement->properties.track.ride_index; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (mapElement->type != MAP_ELEMENT_TYPE_TRACK) continue; + if (mapElement->properties.track.ride_index != rideIndex) continue; + if (mapElement->base_height != z) continue; + if (mapElement->properties.track.type != TRACK_ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP) continue; + + direction <<= 2; + direction = (direction + 9) & 0x0F; + mapElement->properties.track.sequence &= direction; + direction = (direction + 3) & 0x0F; + mapElement->properties.track.sequence &= direction; + direction = (direction - 2) & 0x0F; + mapElement->properties.track.sequence &= direction; + direction = (direction + 1) & 0x0F; + mapElement->properties.track.sequence &= direction; + direction = (direction + 4) & 0x0F; + mapElement->properties.track.sequence &= direction; + map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); + return; + } while (!map_element_is_last_for_tile(mapElement++)); +} + +money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 direction, uint8 flags, uint8 rideIndex, uint8 station_num, uint8 is_exit) +{ // Remember when in Unknown station num mode rideIndex is unknown and z is set // When in known station num mode rideIndex is known and z is unknown @@ -6367,12 +6403,12 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio return MONEY32_UNDEFINED; } - if (station_num == 0xFF){ + if (station_num == 0xFF) { z *= 16; if (flags & GAME_COMMAND_FLAG_APPLY) return MONEY32_UNDEFINED; - if (!gCheatsSandboxMode && !map_is_location_owned(x, y, z)){ + if (!gCheatsSandboxMode && !map_is_location_owned(x, y, z)) { return MONEY32_UNDEFINED; } @@ -6383,29 +6419,27 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio // Horrible hack until map_can_construct_with_clear_at is implemented. RCT2_GLOBAL(0x009E32C8, uint8*) = (&flags) - 4; - if (!gCheatsDisableClearanceChecks && !map_can_construct_with_clear_at(x, y, z / 8, clear_z, (void*)0x0066637E, 0xF)){ + if (!gCheatsDisableClearanceChecks && !map_can_construct_with_clear_at(x, y, z / 8, clear_z, (void*)0x0066637E, 0xF)) { return MONEY32_UNDEFINED; } - if (RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & (1 << 2)){ + if (RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & (1 << 2)) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_RIDE_CANT_BUILD_THIS_UNDERWATER; return MONEY32_UNDEFINED; } - if (z > 1952){ + if (z > 1952) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_HIGH; return MONEY32_UNDEFINED; } - - } - else{ + } else { rct_ride* ride = GET_RIDE(rideIndex); - if (ride->status != RIDE_STATUS_CLOSED){ + if (ride->status != RIDE_STATUS_CLOSED) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_MUST_BE_CLOSED_FIRST; return MONEY32_UNDEFINED; } - if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK){ + if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_NOT_ALLOWED_TO_MODIFY_STATION; return MONEY32_UNDEFINED; } @@ -6417,9 +6451,9 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio sint16 remove_x = 0; sint16 remove_y = 0; - if (is_exit){ - if (ride->exits[station_num] != 0xFFFF){ - if (flags & (1 << 6)){ + if (is_exit) { + if (ride->exits[station_num] != 0xFFFF) { + if (flags & GAME_COMMAND_FLAG_GHOST) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 0; return MONEY32_UNDEFINED; } @@ -6428,21 +6462,18 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio remove_y = ((ride->exits[station_num] >> 8) & 0xFF) * 32; requires_remove = 1; } - } - else{ - if (ride->entrances[station_num] != 0xFFFF){ - if (flags & (1 << 6)){ - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 0; - return MONEY32_UNDEFINED; - } - - remove_x = (ride->entrances[station_num] & 0xFF) * 32; - remove_y = ((ride->entrances[station_num] >> 8) & 0xFF) * 32; - requires_remove = 1; + } else if (ride->entrances[station_num] != 0xFFFF) { + if (flags & GAME_COMMAND_FLAG_GHOST) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 0; + return MONEY32_UNDEFINED; } + + remove_x = (ride->entrances[station_num] & 0xFF) * 32; + remove_y = ((ride->entrances[station_num] >> 8) & 0xFF) * 32; + requires_remove = 1; } - if (requires_remove){ + if (requires_remove) { money32 success = game_do_command( remove_x, flags, @@ -6451,9 +6482,9 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT, station_num, 0 - ); + ); - if (success == MONEY32_UNDEFINED){ + if (success == MONEY32_UNDEFINED) { return MONEY32_UNDEFINED; } } @@ -6461,12 +6492,16 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio z = ride->station_heights[station_num] * 8; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, sint16) = z; - if (flags & GAME_COMMAND_FLAG_APPLY && !(flags & 0x48)){ + if ( + (flags & GAME_COMMAND_FLAG_APPLY) && + !(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED) && + !(flags & GAME_COMMAND_FLAG_GHOST) + ) { footpath_remove_litter(x, y, z); map_remove_walls_at_z(x, y, z); } - if (!gCheatsSandboxMode && !map_is_location_owned(x, y, z)){ + if (!gCheatsSandboxMode && !map_is_location_owned(x, y, z)) { return MONEY32_UNDEFINED; } @@ -6477,11 +6512,11 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio // Horrible hack until map_can_construct_with_clear_at is implemented. RCT2_GLOBAL(0x009E32C8, uint8*) = (&flags) - 4; - if (!gCheatsDisableClearanceChecks && !map_can_construct_with_clear_at(x, y, z / 8, clear_z, (void*)0x0066637E, 0xF)){ + if (!gCheatsDisableClearanceChecks && !map_can_construct_with_clear_at(x, y, z / 8, clear_z, (void*)0x0066637E, 0xF)) { return MONEY32_UNDEFINED; } - if (RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & ELEMENT_IS_UNDERWATER){ + if (RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & ELEMENT_IS_UNDERWATER) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_RIDE_CANT_BUILD_THIS_UNDERWATER; return MONEY32_UNDEFINED; } @@ -6491,8 +6526,7 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio return MONEY32_UNDEFINED; } - if (flags & GAME_COMMAND_FLAG_APPLY){ - + if (flags & GAME_COMMAND_FLAG_APPLY) { rct_map_element* mapElement = map_element_insert(x / 32, y / 32, z / 8, 0xF); mapElement->clearance_height = clear_z; mapElement->properties.entrance.type = is_exit; @@ -6500,14 +6534,13 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio mapElement->properties.entrance.ride_index = rideIndex; mapElement->type = MAP_ELEMENT_TYPE_ENTRANCE | direction; - if (flags & (1 << 6)){ + if (flags & GAME_COMMAND_FLAG_GHOST) { mapElement->flags |= MAP_ELEMENT_FLAG_GHOST; } - if (is_exit){ + if (is_exit) { ride->exits[station_num] = (x / 32) | (y / 32 << 8); - } - else{ + } else { ride->entrances[station_num] = (x / 32) | (y / 32 << 8); ride->first_peep_in_queue[station_num] = 0xFFFF; ride->queue_length[station_num] = 0; @@ -6516,8 +6549,8 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio } sub_6A7594(); - if (!(flags & (1 << 6))){ - RCT2_CALLPROC_X(0x00666CBE, x, 0, y, 0, (int)mapElement, 0, 0); + if (!(flags & GAME_COMMAND_FLAG_GHOST)) { + sub_666CBE(x, y, mapElement); } footpath_connect_edges(x, y, mapElement, flags); sub_6A759F(); From afb3aabb49e4e9d69e9d8baa0ce9407627f392ec Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 31 Aug 2015 16:02:50 +0100 Subject: [PATCH 0616/1173] implement sub_666D6F --- src/ride/ride.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 247808da63..2b72896d39 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -6385,6 +6385,35 @@ static void sub_666CBE(int x, int y, rct_map_element *mapElement) } while (!map_element_is_last_for_tile(mapElement++)); } +/** + * + * rct2: 0x00666D6F + */ +static void sub_666D6F(int x, int y, rct_map_element *mapElement) +{ + int direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; + x += TileDirectionDelta[direction].x; + y += TileDirectionDelta[direction].y; + int z = mapElement->base_height; + int rideIndex = mapElement->properties.track.ride_index; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (mapElement->type != MAP_ELEMENT_TYPE_TRACK) continue; + if (mapElement->properties.track.ride_index != rideIndex) continue; + if (mapElement->base_height != z) continue; + if (mapElement->properties.track.type != TRACK_ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP) continue; + + direction <<= 2; + direction = (direction + 9) & 0x0F; + mapElement->properties.track.sequence |= direction; + direction = (direction + 3) & 0x0F; + mapElement->properties.track.sequence |= direction; + map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); + return; + } while (!map_element_is_last_for_tile(mapElement++)); +} + money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 direction, uint8 flags, uint8 rideIndex, uint8 station_num, uint8 is_exit) { // Remember when in Unknown station num mode rideIndex is unknown and z is set @@ -6618,7 +6647,7 @@ money32 remove_ride_entrance_or_exit(sint16 x, sint16 y, uint8 rideIndex, uint8 } sub_6A7594(); - RCT2_CALLPROC_X(0x00666D6F, x, 0, y, 0, (int)mapElement, 0, 0); + sub_666D6F(x, y, mapElement); footpath_remove_edges_at(x, y, mapElement); uint8 is_exit = mapElement->properties.entrance.type; From f629e643877b2fd7d5d72bea2b11d5ebb1748857 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 31 Aug 2015 16:20:56 +0100 Subject: [PATCH 0617/1173] implement sprite_remove --- src/world/sprite.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/world/sprite.c b/src/world/sprite.c index cc93929c27..86dfcc89fe 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -479,7 +479,23 @@ void sprite_move(sint16 x, sint16 y, sint16 z, rct_sprite* sprite){ */ void sprite_remove(rct_sprite *sprite) { - RCT2_CALLPROC_X(0x0069EDB6, 0, 0, 0, 0, (int)sprite, 0, 0); + move_sprite_to_list(sprite, SPRITE_LINKEDLIST_OFFSET_NULL); + user_string_free(sprite->unknown.name_string_idx); + sprite->unknown.sprite_identifier = SPRITE_IDENTIFIER_NULL; + + uint32 quadrantIndex = sprite->unknown.x; + if (sprite->unknown.x == SPRITE_LOCATION_NULL) { + quadrantIndex = 0x10000; + } else { + quadrantIndex = (floor2(sprite->unknown.x, 32) << 3) | (sprite->unknown.y >> 5); + } + + uint16 *spriteIndex = &RCT2_ADDRESS(0x00F1EF60, uint16)[quadrantIndex]; + rct_sprite *quadrantSprite; + while ((quadrantSprite = &g_sprite_list[*spriteIndex]) != sprite) { + spriteIndex = &quadrantSprite->unknown.next_in_quadrant; + } + *spriteIndex = sprite->unknown.next_in_quadrant; } static bool litter_can_be_at(int x, int y, int z) From 8490a193289dc5e1e884d789ef20ad98c2028a1a Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 31 Aug 2015 20:20:36 +0200 Subject: [PATCH 0618/1173] Don't apply select by track type to research, fixes #1733 --- src/management/research.c | 10 +++++----- src/windows/editor_inventions_list.c | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/management/research.c b/src/management/research.c index 063827fdc1..5046e76245 100644 --- a/src/management/research.c +++ b/src/management/research.c @@ -183,12 +183,12 @@ void research_finish_item(sint32 entryIndex) RCT2_ADDRESS(0x01357644, uint32)[ebx] = RCT2_ADDRESS(0x0097C5D4, uint32)[ebx]; } RCT2_ADDRESS(0x001357424, uint32)[rideEntryIndex >> 5] |= 1 << (rideEntryIndex & 0x1F); - if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) || rideTypeShouldLoseSeparateFlag(rideEntry)) { + if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)) { for (i = 0; i < 128; i++) { rideEntry2 = GET_RIDE_ENTRY(i); if (rideEntry2 == (rct_ride_type*)-1) continue; - if ((rideEntry2->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) && !rideTypeShouldLoseSeparateFlag(rideEntry2)) + if ((rideEntry2->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)) continue; if (rideEntry2->ride_type[0] == base_ride_type || rideEntry2->ride_type[1] == base_ride_type || rideEntry2->ride_type[2] == base_ride_type) @@ -198,7 +198,7 @@ void research_finish_item(sint32 entryIndex) // I don't think 0x009AC06C is ever not 0, so probably redundant if (RCT2_GLOBAL(0x009AC06C, uint8) == 0) { - RCT2_GLOBAL(0x013CE952, rct_string_id) = ((rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) && !rideTypeShouldLoseSeparateFlag(rideEntry)) ? + RCT2_GLOBAL(0x013CE952, rct_string_id) = ((rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) ? rideEntry->name : base_ride_type + 2; if (!gSilentResearch) news_item_add_to_queue(NEWS_ITEM_RESEARCH, 2249, entryIndex); @@ -352,7 +352,7 @@ void research_remove_non_separate_vehicle_types() researchItem->entryIndex >= 0x10000 ) { rct_ride_type *rideEntry = GET_RIDE_ENTRY(researchItem->entryIndex & 0xFF); - if (!(rideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE | RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) || rideTypeShouldLoseSeparateFlag(rideEntry)) { + if (!(rideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE | RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME))) { // Check if ride type already exists further up for a vehicle type that isn't displayed as a ride researchItem2 = researchItem - 1; do { @@ -361,7 +361,7 @@ void research_remove_non_separate_vehicle_types() researchItem2->entryIndex >= 0x10000 ) { rideEntry = GET_RIDE_ENTRY(researchItem2->entryIndex & 0xFF); - if (!(rideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE | RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) || rideTypeShouldLoseSeparateFlag(rideEntry)) { + if (!(rideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE | RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME))) { if (((researchItem->entryIndex >> 8) & 0xFF) == ((researchItem2->entryIndex >> 8) & 0xFF)) { // Remove item diff --git a/src/windows/editor_inventions_list.c b/src/windows/editor_inventions_list.c index 8819a0632e..5c04f98508 100644 --- a/src/windows/editor_inventions_list.c +++ b/src/windows/editor_inventions_list.c @@ -197,14 +197,14 @@ static void research_rides_setup(){ rct_ride_type* ride_entry = GET_RIDE_ENTRY(object_index); uint8 master_found = 0; - if (!(ride_entry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) || rideTypeShouldLoseSeparateFlag(ride_entry)){ + if (!(ride_entry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)){ for (uint8 rideType = 0; rideType < object_entry_group_counts[OBJECT_TYPE_RIDE]; rideType++){ rct_ride_type* master_ride = GET_RIDE_ENTRY(rideType); if (master_ride == NULL || (uint32)master_ride == 0xFFFFFFFF) continue; - if (master_ride->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE && !rideTypeShouldLoseSeparateFlag(master_ride)) + if (master_ride->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) continue; // If master ride not in use @@ -317,7 +317,7 @@ static rct_string_id research_item_get_name(uint32 researchItem) if (rideEntry == NULL || rideEntry == (rct_ride_type*)0xFFFFFFFF) return 0; - if (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME && !rideTypeShouldLoseSeparateFlag(rideEntry)) + if (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) return rideEntry->name; return ((researchItem >> 8) & 0xFF) + 2; From 5abb9235257ba0d8e974ca2817fa941d34db1a81 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 1 Sep 2015 04:00:16 +0100 Subject: [PATCH 0619/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/french.txt | 360 +++++++++++++++++++-------------------- data/language/german.txt | 3 + 2 files changed, 183 insertions(+), 180 deletions(-) diff --git a/data/language/french.txt b/data/language/french.txt index d4ea9d51f9..7ce56c595b 100644 --- a/data/language/french.txt +++ b/data/language/french.txt @@ -879,13 +879,13 @@ STR_0873 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_0874 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_0875 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_0876 :{BLACK}{DOWN} -STR_0877 :Too low ! -STR_0878 :Too high ! -STR_0879 :Can't lower land here... -STR_0880 :Can't raise land here... -STR_0881 :Object in the way -STR_0882 :Charger partie -STR_0883 :Sauvegarder partie +STR_0877 :Trop bas ! +STR_0878 :Trop haut ! +STR_0879 :Ne peut pas abaisser le terrain ici... +STR_0880 :Ne peut pas élever le terrain ici... +STR_0881 :Objet dans le passage +STR_0882 :Charger une partie +STR_0883 :Sauvegarder la partie STR_0884 :Load Landscape STR_0885 :Save Landscape STR_0886 :Quitter la partie @@ -894,22 +894,22 @@ STR_0888 :Quitter Roller Coaster Designer STR_0889 :Quit Track Designs Manager STR_0890 :SCR{COMMA16}.BMP STR_0891 :Capture d'écran -STR_0892 :Screenshot saved to disk as '{STRINGID}' -STR_0893 :Screenshot failed ! +STR_0892 :Capture sauvegardée en tant que '{STRINGID}' +STR_0893 :Capture échouée ! STR_0894 :Landscape data area full ! STR_0895 :Can't build partly above and partly below ground STR_0896 :{POP16}{POP16}{STRINGID} Construction STR_0897 :Direction -STR_0898 :{SMALLFONT}{BLACK}Left-hand curve -STR_0899 :{SMALLFONT}{BLACK}Right-hand curve -STR_0900 :{SMALLFONT}{BLACK}Left-hand curve (small radius) -STR_0901 :{SMALLFONT}{BLACK}Right-hand curve (small radius) -STR_0902 :{SMALLFONT}{BLACK}Left-hand curve (very small radius) -STR_0903 :{SMALLFONT}{BLACK}Right-hand curve (very small radius) -STR_0904 :{SMALLFONT}{BLACK}Left-hand curve (large radius) -STR_0905 :{SMALLFONT}{BLACK}Right-hand curve (large radius) -STR_0906 :{SMALLFONT}{BLACK}Straight -STR_0907 :Slope +STR_0898 :{SMALLFONT}{BLACK}Courbe à gauche +STR_0899 :{SMALLFONT}{BLACK}Courbe à droite +STR_0900 :{SMALLFONT}{BLACK}Courbe à gauche (petit radius) +STR_0901 :{SMALLFONT}{BLACK}Courbe à droite (petit radius) +STR_0902 :{SMALLFONT}{BLACK}Courbe à gauche (très petit radius) +STR_0903 :{SMALLFONT}{BLACK}Courbe à droite (très petit radius) +STR_0904 :{SMALLFONT}{BLACK}Courbe à gauche (grand radius) +STR_0905 :{SMALLFONT}{BLACK}Courbe à droite (grand radius) +STR_0906 :{SMALLFONT}{BLACK}Droit +STR_0907 :Pente STR_0908 :Roll/Banking STR_0909 :Seat Rot. STR_0910 :{SMALLFONT}{BLACK}Roll for left-hand curve @@ -922,19 +922,19 @@ STR_0916 :{SMALLFONT}{BLACK}Remove the highlighted section STR_0917 :{SMALLFONT}{BLACK}Vertical drop STR_0918 :{SMALLFONT}{BLACK}Steep slope down STR_0919 :{SMALLFONT}{BLACK}Slope down -STR_0920 :{SMALLFONT}{BLACK}Level +STR_0920 :{SMALLFONT}{BLACK}Niveau STR_0921 :{SMALLFONT}{BLACK}Slope up STR_0922 :{SMALLFONT}{BLACK}Steep slope up STR_0923 :{SMALLFONT}{BLACK}Vertical rise STR_0924 :{SMALLFONT}{BLACK}Helix down STR_0925 :{SMALLFONT}{BLACK}Helix up -STR_0926 :Can't remove this... -STR_0927 :Can't construct this here... +STR_0926 :Ne peut pas enlever ceci... +STR_0927 :Ne peut pas construire ici... STR_0928 :{SMALLFONT}{BLACK}Chain lift, to pull cars up slopes -STR_0929 :'S' Bend (left) -STR_0930 :'S' Bend (right) -STR_0931 :Vertical Loop (left) -STR_0932 :Vertical Loop (right) +STR_0929 :Courbure 'S' (gauche) +STR_0930 :Courbure 'S' (droite) +STR_0931 :Boucle verticale (gauche) +STR_0932 :Boucle verticale (droite) STR_0933 :Raise or lower land first STR_0934 :Ride entrance in the way STR_0935 :Ride exit in the way @@ -976,16 +976,16 @@ STR_0970 :+450{DEGREE} STR_0971 :+495{DEGREE} STR_0972 :Annuler STR_0973 :OK -STR_0974 :Rides -STR_0975 :Shops and Stalls -STR_0976 :Toilets and Information Kiosks -STR_0977 :New Transport Rides -STR_0978 :New Gentle Rides +STR_0974 :Attractions +STR_0975 :Magasins et stands +STR_0976 :Toilettes et Kiosques d'Information +STR_0977 :Nouveaux moyens de transport +STR_0978 :Nouvelles attractions calmes STR_0979 :Nouvelles montagnes russes -STR_0980 :New Thrill Rides -STR_0981 :New Water Rides -STR_0982 :New Shops & Stalls -STR_0983 :Research & Development +STR_0980 :Nouvelles attractions à frissons +STR_0981 :Nouvelles attractions aquatiques +STR_0982 :Nouveaux magasins et stands +STR_0983 :Recherche & Développement STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP} STR_0986 :{BLACK}{CURRENCY2DP} @@ -993,26 +993,26 @@ STR_0987 :Too many rides/attractions STR_0988 :Can't create new ride/attraction... STR_0989 :{STRINGID} STR_0990 :{SMALLFONT}{BLACK}Construction -STR_0991 :Station platform -STR_0992 :{SMALLFONT}{BLACK}Demolish entire ride/attraction -STR_0993 :Demolish ride/attraction -STR_0994 :Demolish -STR_0995 :{WINDOW_COLOUR_1}Are you sure you want to completely demolish {STRINGID}? -STR_0996 :Overall view -STR_0997 :{SMALLFONT}{BLACK}View selection -STR_0998 :No more stations allowed on this ride -STR_0999 :Requires a station platform -STR_1000 :Track is not a complete circuit -STR_1001 :Track unsuitable for type of train -STR_1002 :Can't open {POP16}{POP16}{POP16}{STRINGID}... -STR_1003 :Can't test {POP16}{POP16}{POP16}{STRINGID}... -STR_1004 :Can't close {POP16}{POP16}{POP16}{STRINGID}... -STR_1005 :Can't start construction on {POP16}{POP16}{POP16}{STRINGID}... -STR_1006 :Must be closed first -STR_1007 :Unable to create enough vehicles -STR_1008 :{SMALLFONT}{BLACK}Open, close, or test ride/attraction -STR_1009 :{SMALLFONT}{BLACK}Open or close all rides/attractions -STR_1010 :{SMALLFONT}{BLACK}Open or close park +STR_0991 :Quai +STR_0992 :{SMALLFONT}{BLACK}Démolire toute l'attraction +STR_0993 :Démolire l'attraction +STR_0994 :Démolire +STR_0995 :{WINDOW_COLOUR_1}Êtes-vous vraiment sûr de vouloir démolir {STRINGID}? +STR_0996 :Vue générale +STR_0997 :{SMALLFONT}{BLACK}Vue sur la sélection +STR_0998 :Plus de stations autorisées sur cette attraction +STR_0999 :Nécessite un quai +STR_1000 :Le circuit n'est pas complet +STR_1001 :Le circuit est inadapté à ce type de train +STR_1002 :Ne peut pas ouvrir {POP16}{POP16}{POP16}{STRINGID}... +STR_1003 :Ne peut pas tester {POP16}{POP16}{POP16}{STRINGID}... +STR_1004 :Ne peut pas fermer {POP16}{POP16}{POP16}{STRINGID}... +STR_1005 :Ne peut pas construire sur {POP16}{POP16}{POP16}{STRINGID}... +STR_1006 :Doit être fermé d'abord +STR_1007 :Impossible de créer assez de véhicules +STR_1008 :{SMALLFONT}{BLACK}Ouvrir, fermer ou tester une attraction +STR_1009 :{SMALLFONT}{BLACK}Ouvrir, fermer ou tester toutes les attractions +STR_1010 :{SMALLFONT}{BLACK}Ouvrir ou fermer le parc STR_1011 :Tout fermer STR_1012 :Tout ouvrir STR_1013 :Fermer le parc @@ -1024,13 +1024,13 @@ STR_1018 :Can't make changes... STR_1019 :Can't make changes... STR_1020 :Can't make changes... STR_1021 :{POP16}{POP16}{POP16}{POP16}{STRINGID} -STR_1022 :{POP16}{POP16}{POP16}{COMMA16} car per train -STR_1023 :{POP16}{POP16}{POP16}{COMMA16} cars per train +STR_1022 :{POP16}{POP16}{POP16}{COMMA16} voiture par train +STR_1023 :{POP16}{POP16}{POP16}{COMMA16} voitures par trains STR_1024 :{COMMA16} voiture par train STR_1025 :{COMMA16} voitures par train -STR_1026 :Station platform too long! -STR_1027 :{SMALLFONT}{BLACK}Locate this on Main View -STR_1028 :Off edge of map! +STR_1026 :Le quai est trop long ! +STR_1027 :{SMALLFONT}{BLACK}Localiser sur la vue générale +STR_1028 :En dehors de la carte ! STR_1029 :Cannot build partly above and partly below water! STR_1030 :Can only build this underwater! STR_1031 :Can't build this underwater! @@ -1053,18 +1053,18 @@ STR_1047 :Game save failed! STR_1048 :Scenario save failed! STR_1049 :Landscape save failed! STR_1050 :Failed to load...{NEWLINE}File contains invalid data! -STR_1051 :Invisible Supports -STR_1052 :Invisible People -STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park -STR_1054 :{SMALLFONT}{BLACK}Name ride/attraction -STR_1055 :{SMALLFONT}{BLACK}Name person -STR_1056 :{SMALLFONT}{BLACK}Name staff member -STR_1057 :Ride/attraction name -STR_1058 :Enter new name for this ride/attraction: -STR_1059 :Can't rename ride/attraction... -STR_1060 :Invalid ride/attraction name -STR_1061 :Normal mode -STR_1062 :Continuous circuit mode +STR_1051 :Supports invisibles +STR_1052 :Visiteurs invisibles +STR_1053 :{SMALLFONT}{BLACK}Attractions dans le parc +STR_1054 :{SMALLFONT}{BLACK}Nommer l'attraction +STR_1055 :{SMALLFONT}{BLACK}Nommer la personne +STR_1056 :{SMALLFONT}{BLACK}Nommer l'employé +STR_1057 :Nom de l'attraction +STR_1058 :Entrez un nom pour cette attraction : +STR_1059 :Ne peut pas renommer l'attraction... +STR_1060 :Nom d'attraction invalide +STR_1061 :Mode normal +STR_1062 :Mode circuit continu STR_1063 :Reverse-Incline launched shuttle mode STR_1064 :Lancement (avec passage de la station) STR_1065 :Shuttle mode @@ -1124,46 +1124,46 @@ STR_1118 :Operating STR_1119 :Waiting for cable lift STR_1120 :Travelling at {VELOCITY} STR_1121 :Stopping -STR_1122 :Waiting for passengers -STR_1123 :Waiting to start +STR_1122 :En attente de passagers +STR_1123 :En attente du départ STR_1124 :Starting STR_1125 :Operating STR_1126 :Stopping -STR_1127 :Unloading passengers +STR_1127 :Déchargement des passagers STR_1128 :Stopped by block brakes -STR_1129 :All vehicles in same colours -STR_1130 :Different colours per {STRINGID} -STR_1131 :Different colours per vehicle -STR_1132 :Vehicle {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} -STR_1133 :Vehicle {POP16}{COMMA16} +STR_1129 :Tous les véhicules de mêmes couleurs +STR_1130 :Différentes couleurs par {STRINGID} +STR_1131 :Différentes couleurs par véhicule +STR_1132 :Véhicule {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1133 :Véhicule {POP16}{COMMA16} STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} STR_1135 :{STRINGID} {COMMA16} -STR_1136 :{SMALLFONT}{BLACK}Select main colour -STR_1137 :{SMALLFONT}{BLACK}Select additional colour 1 -STR_1138 :{SMALLFONT}{BLACK}Select additional colour 2 -STR_1139 :{SMALLFONT}{BLACK}Select support structure colour +STR_1136 :{SMALLFONT}{BLACK}Sélectionner la couleur principale +STR_1137 :{SMALLFONT}{BLACK}Sélectionner la couleur additionnelle 1 +STR_1138 :{SMALLFONT}{BLACK}Sélectionner la couleur additionnelle 2 +STR_1139 :{SMALLFONT}{BLACK}Sélectionner la couleur de la structure STR_1140 :{SMALLFONT}{BLACK}Select vehicle colour scheme option -STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify +STR_1141 :{SMALLFONT}{BLACK}Sélectionner quel véhicule modifier STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} STR_1144 :Can't build/move entrance for this ride/attraction... STR_1145 :Can't build/move exit for this ride/attraction... STR_1146 :Entrance not yet built STR_1147 :Exit not yet built -STR_1148 :Quarter load -STR_1149 :Half load -STR_1150 :Three-quarter load -STR_1151 :Full load -STR_1152 :Any load +STR_1148 :Quart de la charge +STR_1149 :Moitiée de la charge +STR_1150 :Trois-quarts de la charge +STR_1151 :Charge totale +STR_1152 :N'importe quelle charge STR_1153 :Height Marks on Ride Tracks STR_1154 :Height Marks on Land STR_1155 :Height Marks on Paths STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} -STR_1158 :Can't remove this... +STR_1158 :Ne peut pas retirer ceci... STR_1159 :{SMALLFONT}{BLACK}Place scenery, gardens, and other accessories STR_1160 :{SMALLFONT}{BLACK}Create/adjust lakes & water -STR_1161 :Can't position this here... +STR_1161 :Ne peut pas positionner ici... STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} STR_1163 :{STRINGID}{NEWLINE}(Right-Click to Modify) STR_1164 :{STRINGID}{NEWLINE}(Right-Click to Remove) @@ -1186,11 +1186,11 @@ STR_1180 :Can't build this underwater! STR_1181 :Allées STR_1182 :Type STR_1183 :Direction -STR_1184 :Slope +STR_1184 :Pente STR_1185 :{SMALLFONT}{BLACK}Direction -STR_1186 :{SMALLFONT}{BLACK}Slope down -STR_1187 :{SMALLFONT}{BLACK}Level -STR_1188 :{SMALLFONT}{BLACK}Slope up +STR_1186 :{SMALLFONT}{BLACK}Pente descendante +STR_1187 :{SMALLFONT}{BLACK}Niveau +STR_1188 :{SMALLFONT}{BLACK}Pente montante STR_1189 :{SMALLFONT}{BLACK}Construct the selected footpath section STR_1190 :{SMALLFONT}{BLACK}Remove previous footpath section STR_1191 :{BLACK}{STRINGID} @@ -1203,11 +1203,11 @@ STR_1197 :En panne STR_1198 :Crashed! STR_1199 :{COMMA16} person on ride STR_1200 :{COMMA16} people on ride -STR_1201 :Nobody in queue line -STR_1202 :1 person in queue line -STR_1203 :{COMMA16} people in queue line -STR_1204 :{COMMA16} minute queue time -STR_1205 :{COMMA16} minutes queue time +STR_1201 :Personne dans la file d'attente +STR_1202 :1 personne dans la file d'attente +STR_1203 :{COMMA16} personnes dans la file d'attente +STR_1204 :Attente de {COMMA16} minute dans la file +STR_1205 :Attente de {COMMA16} minutes dans la file STR_1206 :{WINDOW_COLOUR_2}Wait for: STR_1207 :{WINDOW_COLOUR_2}Leave if another train arrives at station STR_1208 :{WINDOW_COLOUR_2}Leave if another boat arrives at station @@ -1222,15 +1222,15 @@ STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronise departure with all STR_1217 :{COMMA16} secondes STR_1218 :{BLACK}{SMALLUP} STR_1219 :{BLACK}{SMALLDOWN} -STR_1220 :Exit only -STR_1221 :No entrance -STR_1222 :No exit -STR_1223 :{SMALLFONT}{BLACK}Attractions de transport -STR_1224 :{SMALLFONT}{BLACK}Attractions tranquilles +STR_1220 :Sortie seulement +STR_1221 :Pas d'entrée +STR_1222 :Pas de sortie +STR_1223 :{SMALLFONT}{BLACK}Moyens de transports +STR_1224 :{SMALLFONT}{BLACK}Attractions calmes STR_1225 :{SMALLFONT}{BLACK}Montagnes russes -STR_1226 :{SMALLFONT}{BLACK}Attractions frisson +STR_1226 :{SMALLFONT}{BLACK}Attractions à frissons STR_1227 :{SMALLFONT}{BLACK}Attractions aquatiques -STR_1228 :{SMALLFONT}{BLACK}Magasins et boutiques +STR_1228 :{SMALLFONT}{BLACK}Magasins et stands STR_1229 :train STR_1230 :trains STR_1231 :Train @@ -1238,13 +1238,13 @@ STR_1232 :Trains STR_1233 :{COMMA16} train STR_1234 :{COMMA16} trains STR_1235 :Train {COMMA16} -STR_1236 :boat -STR_1237 :boats -STR_1238 :Boat -STR_1239 :Boats -STR_1240 :{COMMA16} boat -STR_1241 :{COMMA16} boats -STR_1242 :Boat {COMMA16} +STR_1236 :bateau +STR_1237 :bateaux +STR_1238 :Bateau +STR_1239 :Bateaux +STR_1240 :{COMMA16} bateau +STR_1241 :{COMMA16} bateaux +STR_1242 :Bateau {COMMA16} STR_1243 :track STR_1244 :tracks STR_1245 :Track @@ -1394,23 +1394,23 @@ STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} STR_1389 :{OUTLINE}{RED}- {CURRENCY} STR_1390 :{CURRENCY2DP} STR_1391 :{RED}{CURRENCY2DP} -STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction -STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options -STR_1394 :{SMALLFONT}{BLACK}Operating options -STR_1395 :{SMALLFONT}{BLACK}Maintenance options -STR_1396 :{SMALLFONT}{BLACK}Colour scheme options -STR_1397 :{SMALLFONT}{BLACK}Sound & music options +STR_1392 :{SMALLFONT}{BLACK}Vue sur l'attraction +STR_1393 :{SMALLFONT}{BLACK}Détails des véhicules +STR_1394 :{SMALLFONT}{BLACK}Options d'opération +STR_1395 :{SMALLFONT}{BLACK}Options de maintenance +STR_1396 :{SMALLFONT}{BLACK}Options des couleurs +STR_1397 :{SMALLFONT}{BLACK}Options de son et musique STR_1398 :{SMALLFONT}{BLACK}Measurements and test data -STR_1399 :{SMALLFONT}{BLACK}Graphs +STR_1399 :{SMALLFONT}{BLACK}Graphiques STR_1400 :Entrée STR_1401 :Sortie STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction -STR_1404 :{SMALLFONT}{BLACK}Rotate 90{DEGREE} -STR_1405 :{SMALLFONT}{BLACK}Mirror image +STR_1404 :{SMALLFONT}{BLACK}Rotation de 90{DEGREE} +STR_1405 :{SMALLFONT}{BLACK}Miroir STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) -STR_1407 :{WINDOW_COLOUR_2}Build this... -STR_1408 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} +STR_1407 :{WINDOW_COLOUR_2}Construire ceci... +STR_1408 :{WINDOW_COLOUR_2}Prix : {BLACK}{CURRENCY} STR_1409 :Entry/Exit Platform STR_1410 :Vertical Tower STR_1411 :{STRINGID} in the way @@ -1428,9 +1428,9 @@ STR_1422 :{SMALLFONT}{BLACK}Logging data from {POP16}{STRINGID} STR_1423 :{SMALLFONT}{BLACK}Queue line path STR_1424 :{SMALLFONT}{BLACK}Footpath STR_1425 :Footpath -STR_1426 :Queue Line -STR_1427 :{WINDOW_COLOUR_2}Clients: {BLACK}{COMMA32} par heure -STR_1428 :{WINDOW_COLOUR_2}Admission price: +STR_1426 :File d'attente +STR_1427 :{WINDOW_COLOUR_2}Clients : {BLACK}{COMMA32} par heure +STR_1428 :{WINDOW_COLOUR_2}Prix d'entrée : STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} STR_1430 :Gratuit STR_1431 :Marche @@ -1444,22 +1444,22 @@ STR_1438 :Sitting STR_1439 :(select location) STR_1440 :Mowing grass STR_1441 :Balaye l'allée -STR_1442 :Emptying litter bin -STR_1443 :Watering gardens -STR_1444 :Watching {STRINGID} -STR_1445 :Watching construction of {STRINGID} +STR_1442 :Vide la poubelle +STR_1443 :Arrose les jardins +STR_1444 :Regarde {STRINGID} +STR_1445 :Regarde la construction de {STRINGID} STR_1446 :Looking at scenery -STR_1447 :Leaving the park +STR_1447 :Quitte le parc STR_1448 :Watching new ride being constructed STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) STR_1452 :Nom du visiteur -STR_1453 :Enter name for this guest: -STR_1454 :Can't name guest... -STR_1455 :Invalid name for guest -STR_1456 :{WINDOW_COLOUR_2}Cash spent: {BLACK}{CURRENCY2DP} -STR_1457 :{WINDOW_COLOUR_2}Cash in pocket: {BLACK}{CURRENCY2DP} +STR_1453 :Entrez le nom du visiteur: +STR_1454 :Ne peut pas nommer le visiteur... +STR_1455 :Nom de visiteur invalide +STR_1456 :{WINDOW_COLOUR_2}Argent dépensé: {BLACK}{CURRENCY2DP} +STR_1457 :{WINDOW_COLOUR_2}Argent de poche: {BLACK}{CURRENCY2DP} STR_1458 :{WINDOW_COLOUR_2}Temps dans le parc: {BLACK}{REALTIME} STR_1459 :Track style STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track @@ -1482,30 +1482,30 @@ STR_1476 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}Not yet available STR_1477 :{WINDOW_COLOUR_2}Intensity rating: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) STR_1478 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} ({STRINGID}) STR_1479 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}Not yet available -STR_1480 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} -STR_1481 :{SMALLFONT}{OPENQUOTES}I've spent all my money{ENDQUOTES} -STR_1482 :{SMALLFONT}{OPENQUOTES}I feel sick{ENDQUOTES} -STR_1483 :{SMALLFONT}{OPENQUOTES}I feel very sick{ENDQUOTES} -STR_1484 :{SMALLFONT}{OPENQUOTES}I want to go on something more thrilling than {STRINGID}{ENDQUOTES} -STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} looks too intense for me{ENDQUOTES} +STR_1480 :{SMALLFONT}{OPENQUOTES}Je ne peux pas me payer {STRINGID}{ENDQUOTES} +STR_1481 :{SMALLFONT}{OPENQUOTES}J'ai dépensé tout mon argent{ENDQUOTES} +STR_1482 :{SMALLFONT}{OPENQUOTES}Je me sens pas bien{ENDQUOTES} +STR_1483 :{SMALLFONT}{OPENQUOTES}Je me sens malade{ENDQUOTES} +STR_1484 :{SMALLFONT}{OPENQUOTES}Je veux aller sur quelque chose de plus excitant que {STRINGID}{ENDQUOTES} +STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} me paraît trop intense pour moi{ENDQUOTES} STR_1486 :{SMALLFONT}{OPENQUOTES}I haven't finished my {STRINGID} yet{ENDQUOTES} STR_1487 :{SMALLFONT}{OPENQUOTES}Just looking at {STRINGID} makes me feel sick{ENDQUOTES} STR_1488 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to go on {STRINGID}{ENDQUOTES} -STR_1489 :{SMALLFONT}{OPENQUOTES}I want to go home{ENDQUOTES} +STR_1489 :{SMALLFONT}{OPENQUOTES}Je veux rentrer chez moi{ENDQUOTES} STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} is really good value{ENDQUOTES} STR_1491 :{SMALLFONT}{OPENQUOTES}I've already got {STRINGID}{ENDQUOTES} -STR_1492 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} +STR_1492 :{SMALLFONT}{OPENQUOTES}Je ne peux pas me payer {STRINGID}{ENDQUOTES} STR_1493 :{SMALLFONT}{OPENQUOTES}I'm not hungry{ENDQUOTES} STR_1494 :{SMALLFONT}{OPENQUOTES}I'm not thirsty{ENDQUOTES} STR_1495 :{SMALLFONT}{OPENQUOTES}Help! I'm drowning!{ENDQUOTES} -STR_1496 :{SMALLFONT}{OPENQUOTES}I'm lost!{ENDQUOTES} +STR_1496 :{SMALLFONT}{OPENQUOTES}Je suis perdu !{ENDQUOTES} STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} was great{ENDQUOTES} STR_1498 :{SMALLFONT}{OPENQUOTES}I've been queuing for {STRINGID} for ages{ENDQUOTES} -STR_1499 :{SMALLFONT}{OPENQUOTES}I'm tired{ENDQUOTES} -STR_1500 :{SMALLFONT}{OPENQUOTES}I'm hungry{ENDQUOTES} -STR_1501 :{SMALLFONT}{OPENQUOTES}I'm thirsty{ENDQUOTES} -STR_1502 :{SMALLFONT}{OPENQUOTES}I need to go to the bathroom{ENDQUOTES} -STR_1503 :{SMALLFONT}{OPENQUOTES}I can't find {STRINGID}{ENDQUOTES} +STR_1499 :{SMALLFONT}{OPENQUOTES}Je suis fatigué{ENDQUOTES} +STR_1500 :{SMALLFONT}{OPENQUOTES}J'ai faim{ENDQUOTES} +STR_1501 :{SMALLFONT}{OPENQUOTES}J'ai soif{ENDQUOTES} +STR_1502 :{SMALLFONT}{OPENQUOTES}J'ai besoin d'aller aux toilettes{ENDQUOTES} +STR_1503 :{SMALLFONT}{OPENQUOTES}Je n'arrive pas à trouver {STRINGID}{ENDQUOTES} STR_1504 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to use {STRINGID}{ENDQUOTES} STR_1505 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} while it's raining{ENDQUOTES} STR_1506 :{SMALLFONT}{OPENQUOTES}The litter here is really bad{ENDQUOTES} @@ -1519,7 +1519,7 @@ STR_1513 :{SMALLFONT}{OPENQUOTES}The vandalism here is really bad{ENDQUOTES} STR_1514 :{SMALLFONT}{OPENQUOTES}Great scenery!{ENDQUOTES} STR_1515 :{SMALLFONT}{OPENQUOTES}This park is really clean and tidy{ENDQUOTES} STR_1516 :{SMALLFONT}{OPENQUOTES}The jumping fountains are great{ENDQUOTES} -STR_1517 :{SMALLFONT}{OPENQUOTES}The music is nice here{ENDQUOTES} +STR_1517 :{SMALLFONT}{OPENQUOTES}La musique est bien ici{ENDQUOTES} STR_1518 :{SMALLFONT}{OPENQUOTES}This balloon from {STRINGID} is really good value{ENDQUOTES} STR_1519 :{SMALLFONT}{OPENQUOTES}This cuddly toy from {STRINGID} is really good value{ENDQUOTES} STR_1520 :{SMALLFONT}{OPENQUOTES}This park map from {STRINGID} is really good value{ENDQUOTES} @@ -1659,7 +1659,7 @@ STR_1653 :{SMALLFONT}{OPENQUOTES}...and here we are on {STRINGID}!{ENDQUOTES} STR_1654 :{WINDOW_COLOUR_2}Recent thoughts: STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land STR_1656 :{SMALLFONT}{BLACK}Construct bridge or tunnel footpath -STR_1657 :{WINDOW_COLOUR_2}Attraction favourite +STR_1657 :{WINDOW_COLOUR_2}Attraction favorite STR_1658 :{WINDOW_COLOUR_2}intensity: {BLACK}less than {COMMA16} STR_1659 :{WINDOW_COLOUR_2}intensité: {BLACK}entre {COMMA16} et {COMMA16} STR_1660 :{WINDOW_COLOUR_2}intensity: {BLACK}more than {COMMA16} @@ -1764,8 +1764,8 @@ STR_1758 :{SMALLFONT}{BLACK}Build mode STR_1759 :{SMALLFONT}{BLACK}Move mode STR_1760 :{SMALLFONT}{BLACK}Fill-in mode STR_1761 :{SMALLFONT}{BLACK}Build maze in this direction -STR_1762 :Waterfalls -STR_1763 :Rapids +STR_1762 :Cascades +STR_1763 :Rapides STR_1764 :Log Bumps STR_1765 :On-ride photo section STR_1766 :Reverser turntable @@ -1777,8 +1777,8 @@ STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COM STR_1772 :{COMMA16} STR_1773 :Only one on-ride photo section allowed per ride STR_1774 :Only one cable lift hill allowed per ride -STR_1775 :Off -STR_1776 :On +STR_1775 :Éteint +STR_1776 :Allumé STR_1777 :{WINDOW_COLOUR_2}Music STR_1778 :{STRINGID} - - STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume @@ -1795,12 +1795,12 @@ STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff STR_1791 :{WINDOW_COLOUR_2}Uniform colour: STR_1792 :Responding to {STRINGID} breakdown call -STR_1793 :Heading to {STRINGID} for an inspection -STR_1794 :Fixing {STRINGID} +STR_1793 :Se rend à {STRINGID} pour une inspection +STR_1794 :Répare {STRINGID} STR_1795 :Answering radio call STR_1796 :Has broken down and requires fixing STR_1797 :This option cannot be changed for this ride -STR_1798 :Whirlpool +STR_1798 :Tourbillion STR_1799 :{POP16}{POP16}{POP16}{POP16}{POP16}{CURRENCY2DP} STR_1800 :Safety cut-out STR_1801 :Restraints stuck closed @@ -1833,24 +1833,24 @@ STR_1827 :Popularité STR_1828 :Satisfaction STR_1829 :Bénéfice STR_1830 :Longueur file -STR_1831 :Temps attente +STR_1831 :Temps d'attente STR_1832 :Fiabilité STR_1833 :Immobilisation STR_1834 :Plébiscitée -STR_1835 :Popularity: Unknown -STR_1836 :Popularity: {COMMA16}% -STR_1837 :Satisfaction: Unknown -STR_1838 :Satisfaction: {COMMA16}% -STR_1839 :Fiabilité: {COMMA16}% +STR_1835 :Popularité : Inconnue +STR_1836 :Popularité : {COMMA16}% +STR_1837 :Satisfaction : Inconnue +STR_1838 :Satisfaction : {COMMA16}% +STR_1839 :Fiabilité : {COMMA16}% STR_1840 :Immobilisation: {COMMA16}% -STR_1841 :Revenu: {CURRENCY} par heure -STR_1842 :Attraction préférée de: {COMMA16} visiteur -STR_1843 :Attraction préférée de: {COMMA16} visiteurs +STR_1841 :Revenu : {CURRENCY} par heure +STR_1842 :Attraction préférée de : {COMMA16} visiteur +STR_1843 :Attraction préférée de : {COMMA16} visiteurs STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list STR_1845 :{MONTHYEAR} STR_1846 :{COMMA16} visiteurs -STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} guests -STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} guests +STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} visiteurs +STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} visiteurs STR_1849 :{WINDOW_COLOUR_2}Play music STR_1850 :{SMALLFONT}{BLACK}Select whether music should be played for this ride STR_1851 :{WINDOW_COLOUR_2}Running cost: {BLACK}{CURRENCY2DP} per hour @@ -1861,13 +1861,13 @@ STR_1855 :{WINDOW_COLOUR_2}Built: {BLACK}{COMMA16} Years Ago STR_1856 :{WINDOW_COLOUR_2}Profit per item sold: {BLACK}{CURRENCY2DP} STR_1857 :{WINDOW_COLOUR_2}Loss per item sold: {BLACK}{CURRENCY2DP} STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY2DP} per month -STR_1859 :Handymen +STR_1859 :Ouvriers STR_1860 :Mécaniciens -STR_1861 :Security Guards +STR_1861 :Gardes de sécurité STR_1862 :Animateurs -STR_1863 :Handyman +STR_1863 :Ouvrier STR_1864 :Mécanicien -STR_1865 :Security Guard +STR_1865 :Garde de sécurité STR_1866 :Animateur STR_1867 :{BLACK}{COMMA16} {STRINGID} STR_1868 :Can't change number of rotations... @@ -1880,7 +1880,7 @@ STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides -STR_1878 :{WINDOW_COLOUR_2}Inspection: +STR_1878 :{WINDOW_COLOUR_2}Inspection : STR_1879 :Toutes les 10 minutes STR_1880 :Toutes les 20 minutes STR_1881 :Toutes les 30 minutes @@ -1923,7 +1923,7 @@ STR_1915 :{RED}{CURRENCY2DP} STR_1916 :{WINDOW_COLOUR_2}Emprunt: STR_1917 :{POP16}{POP16}{POP16}{CURRENCY} STR_1918 :Impossible d'emprunter d'avantage ! La banque refuse d'augmenter votre emprunt ! -STR_1919 :Pas asser d'argent disponible ! +STR_1919 :Pas assez d'argent disponible ! STR_1920 :Impossible de rembourser l'emprunt ! STR_1921 :{SMALLFONT}{BLACK}Commencer une nouvelle partie STR_1922 :{SMALLFONT}{BLACK}Continuer une partie sauvegardée @@ -2340,7 +2340,7 @@ STR_2332 :Units STR_2333 :Son STR_2334 :Pounds ({POUND}) STR_2335 :Dollars ($) -STR_2336 :Franc (F) +STR_2336 :Francs (F) STR_2337 :Deutschmark (DM) STR_2338 :Yen ({YEN}) STR_2339 :Peseta (Pts) diff --git a/data/language/german.txt b/data/language/german.txt index 5f62a55eec..d7ec6d63b3 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3846,3 +3846,6 @@ STR_5509 :{SMALLFONT}{BLACK}Erlaubt das Laden von Szenarios und gespeicherten STR_5510 :Standard Audiogerät STR_5511 :(UNBEKANNT) STR_5512 :Spiel speichern unter +STR_5513 :Schnellspeichern +STR_5514 :Vandalismus deaktivieren +STR_5515 :{SMALLFONT}{BLACK}Verhindert Vandalismus durch{NEWLINE}verärgerte Besucher From 7ef15a43261820de986549b5b1068b6a12aee1a4 Mon Sep 17 00:00:00 2001 From: LRFLEW Date: Tue, 1 Sep 2015 00:08:28 -0600 Subject: [PATCH 0620/1173] Added tooltip to colour selector --- data/language/english_uk.txt | 32 ++++++++++++++++++++ src/input.c | 9 ++++++ src/localisation/string_ids.h | 2 ++ src/windows/dropdown.c | 6 ++++ src/windows/dropdown.h | 2 ++ src/windows/tooltip.c | 55 ++++++++++++++++++++--------------- src/windows/tooltip.h | 1 + 7 files changed, 83 insertions(+), 24 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index b114e49fc6..8c41cb8221 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3854,3 +3854,35 @@ STR_5512 :Save Game As STR_5513 :(Quick) save game STR_5514 :Disable vandalism STR_5515 :{SMALLFONT}{BLACK}Stops guests from vandalising your park when they're angry +STR_5516 :Colour 00 +STR_5517 :Colour 01 +STR_5518 :Colour 02 +STR_5519 :Colour 03 +STR_5520 :Colour 04 +STR_5521 :Colour 05 +STR_5522 :Colour 06 +STR_5523 :Colour 07 +STR_5524 :Colour 08 +STR_5525 :Colour 09 +STR_5526 :Colour 0A +STR_5527 :Colour 0B +STR_5528 :Colour 0C +STR_5529 :Colour 0D +STR_5530 :Colour 0E +STR_5531 :Colour 0F +STR_5532 :Colour 10 +STR_5533 :Colour 11 +STR_5534 :Colour 12 +STR_5535 :Colour 13 +STR_5536 :Colour 14 +STR_5537 :Colour 15 +STR_5538 :Colour 16 +STR_5539 :Colour 17 +STR_5540 :Colour 18 +STR_5541 :Colour 19 +STR_5542 :Colour 1A +STR_5543 :Colour 1B +STR_5544 :Colour 1C +STR_5545 :Colour 1D +STR_5546 :Colour 1E +STR_5547 :Colour 1F diff --git a/src/input.c b/src/input.c index 04b0db3b39..8027c458a4 100644 --- a/src/input.c +++ b/src/input.c @@ -1197,6 +1197,12 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi if (dropdown_index == -1) return; + if (gDropdownIsColour && gDropdownLastColourHover != dropdown_index) { + gDropdownLastColourHover = dropdown_index; + window_tooltip_close(); + window_tooltip_show(STR_COLOUR_NAMES_START + dropdown_index, x, y); + } + // _dropdown_unknown?? highlighted? if (dropdown_index < 32 && RCT2_GLOBAL(0x009DED34, sint32) & (1 << dropdown_index))return; @@ -1206,6 +1212,9 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi // _dropdown_highlighted_index RCT2_GLOBAL(0x009DEBA2, sint16) = dropdown_index; window_invalidate_by_class(WC_DROPDOWN); + } else { + gDropdownLastColourHover = -1; + window_tooltip_close(); } } diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 2dcd3b2624..069b38fc65 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2076,6 +2076,8 @@ enum { STR_CHEAT_DISABLE_VANDALISM = 5514, STR_CHEAT_DISABLE_VANDALISM_TIP = 5515, + STR_COLOUR_NAMES_START = 5516, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/dropdown.c b/src/windows/dropdown.c index 362ac10e7b..3d3bf54c21 100644 --- a/src/windows/dropdown.c +++ b/src/windows/dropdown.c @@ -55,6 +55,8 @@ sint64 gDropdownItemsArgs[64]; // Replaces 0x009DED38 uint32 gDropdownItemsChecked; uint32 *gDropdownItemsDisabled = RCT2_ADDRESS(0x009DED34, uint32); +bool gDropdownIsColour; +int gDropdownLastColourHover; static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi); @@ -188,6 +190,7 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo RCT2_GLOBAL(0x009DED40, sint32) = _dropdown_item_width; RCT2_GLOBAL(0x009DED3C, sint32) = _dropdown_item_height; RCT2_GLOBAL(0x009DEBA2, sint16) = _dropdown_highlighted_index; + gDropdownIsColour = false; } /** @@ -266,6 +269,7 @@ void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 fl RCT2_GLOBAL(0x009DED40, sint32) = _dropdown_item_width; RCT2_GLOBAL(0x009DED3C, sint32) = _dropdown_item_height; RCT2_GLOBAL(0x009DEBA2, sint16) = _dropdown_highlighted_index; + gDropdownIsColour = false; } void window_dropdown_close() @@ -429,4 +433,6 @@ void window_dropdown_show_colour_available(rct_window *w, rct_widget *widget, ui gAppropriateImageDropdownItemsPerRow[numItems] ); + gDropdownIsColour = true; + gDropdownLastColourHover = -1; } diff --git a/src/windows/dropdown.h b/src/windows/dropdown.h index c26f140197..5f3d27ed03 100644 --- a/src/windows/dropdown.h +++ b/src/windows/dropdown.h @@ -37,6 +37,8 @@ extern uint16 gDropdownItemsFormat[64]; extern sint64 gDropdownItemsArgs[64]; extern uint32 gDropdownItemsChecked; extern uint32 *gDropdownItemsDisabled; +extern bool gDropdownIsColour; +extern int gDropdownLastColourHover; void window_dropdown_show_text(int x, int y, int extray, uint8 colour, uint8 flags, int num_items); void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colour, uint8 flags, int num_items, int width); diff --git a/src/windows/tooltip.c b/src/windows/tooltip.c index 378f6b6e20..c723cd9332 100644 --- a/src/windows/tooltip.c +++ b/src/windows/tooltip.c @@ -79,30 +79,11 @@ void window_tooltip_reset(int x, int y) } uint8* gTooltip_text_buffer = RCT2_ADDRESS(RCT2_ADDRESS_TOOLTIP_TEXT_BUFFER, uint8); -/** - * - * rct2: 0x006EA10D - */ -void window_tooltip_open(rct_window *widgetWindow, int widgetIndex, int x, int y) + +void window_tooltip_show(rct_string_id id, int x, int y) { rct_window *w; - rct_widget *widget; int width, height; - - if (widgetWindow == NULL || widgetIndex == -1) - return; - - widget = &widgetWindow->widgets[widgetIndex]; - window_event_invalidate_call(widgetWindow); - if (widget->tooltip == 0xFFFF) - return; - - RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_CLASS, rct_windowclass) = widgetWindow->classification; - RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_NUMBER, rct_windownumber) = widgetWindow->number; - RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WIDGET_INDEX, uint16) = widgetIndex; - - if (window_event_tooltip_call(widgetWindow, widgetIndex) == (rct_string_id)STR_NONE) - return; w = window_find_by_class(WC_ERROR); if (w != NULL) @@ -111,7 +92,7 @@ void window_tooltip_open(rct_window *widgetWindow, int widgetIndex, int x, int y RCT2_GLOBAL(0x0142006C, sint32) = -1; char* buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); - format_string(buffer, widget->tooltip, (void*)0x013CE952); + format_string(buffer, id, (void*)0x013CE952); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = FONT_SPRITE_BASE_MEDIUM; int tooltip_text_width; @@ -131,7 +112,7 @@ void window_tooltip_open(rct_window *widgetWindow, int widgetIndex, int x, int y window_tooltip_widgets[WIDX_BACKGROUND].bottom = height; memcpy(gTooltip_text_buffer, buffer, 512); - + x = clamp(0, x - (width / 2), RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - width); int max_y = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - height; @@ -150,12 +131,38 @@ void window_tooltip_open(rct_window *widgetWindow, int widgetIndex, int x, int y &window_tooltip_events, WC_TOOLTIP, WF_TRANSPARENT | WF_STICK_TO_FRONT - ); + ); w->widgets = window_tooltip_widgets; RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_NOT_SHOWN_TICKS, uint16) = 0; } +/** + * + * rct2: 0x006EA10D + */ +void window_tooltip_open(rct_window *widgetWindow, int widgetIndex, int x, int y) +{ + rct_widget *widget; + + if (widgetWindow == NULL || widgetIndex == -1) + return; + + widget = &widgetWindow->widgets[widgetIndex]; + window_event_invalidate_call(widgetWindow); + if (widget->tooltip == 0xFFFF) + return; + + RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_CLASS, rct_windowclass) = widgetWindow->classification; + RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_NUMBER, rct_windownumber) = widgetWindow->number; + RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WIDGET_INDEX, uint16) = widgetIndex; + + if (window_event_tooltip_call(widgetWindow, widgetIndex) == (rct_string_id)STR_NONE) + return; + + window_tooltip_show(widget->tooltip, x, y); +} + /** * * rct2: 0x006E98C6 diff --git a/src/windows/tooltip.h b/src/windows/tooltip.h index adff1c3ed6..a05e5e18b8 100644 --- a/src/windows/tooltip.h +++ b/src/windows/tooltip.h @@ -24,6 +24,7 @@ #include "../interface/window.h" void window_tooltip_reset(int x, int y); +void window_tooltip_show(rct_string_id id, int x, int y); void window_tooltip_open(rct_window *widgetWindow, int widgetIndex, int x, int y); void window_tooltip_close(); From 46dd7e0620dcbfa5384c9138cf7dd8285474b03b Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Tue, 1 Sep 2015 14:06:24 +0200 Subject: [PATCH 0621/1173] Add actual colours to colour tooltips --- data/language/english_uk.txt | 64 ++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 8c41cb8221..ff6f0386cb 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3854,35 +3854,35 @@ STR_5512 :Save Game As STR_5513 :(Quick) save game STR_5514 :Disable vandalism STR_5515 :{SMALLFONT}{BLACK}Stops guests from vandalising your park when they're angry -STR_5516 :Colour 00 -STR_5517 :Colour 01 -STR_5518 :Colour 02 -STR_5519 :Colour 03 -STR_5520 :Colour 04 -STR_5521 :Colour 05 -STR_5522 :Colour 06 -STR_5523 :Colour 07 -STR_5524 :Colour 08 -STR_5525 :Colour 09 -STR_5526 :Colour 0A -STR_5527 :Colour 0B -STR_5528 :Colour 0C -STR_5529 :Colour 0D -STR_5530 :Colour 0E -STR_5531 :Colour 0F -STR_5532 :Colour 10 -STR_5533 :Colour 11 -STR_5534 :Colour 12 -STR_5535 :Colour 13 -STR_5536 :Colour 14 -STR_5537 :Colour 15 -STR_5538 :Colour 16 -STR_5539 :Colour 17 -STR_5540 :Colour 18 -STR_5541 :Colour 19 -STR_5542 :Colour 1A -STR_5543 :Colour 1B -STR_5544 :Colour 1C -STR_5545 :Colour 1D -STR_5546 :Colour 1E -STR_5547 :Colour 1F +STR_5516 :{SMALLFONT}{BLACK}Black +STR_5517 :{SMALLFONT}{BLACK}Grey +STR_5518 :{SMALLFONT}{BLACK}White +STR_5519 :{SMALLFONT}{BLACK}Dark purple +STR_5520 :{SMALLFONT}{BLACK}Light purple +STR_5521 :{SMALLFONT}{BLACK}Bright purple +STR_5522 :{SMALLFONT}{BLACK}Dark blue +STR_5523 :{SMALLFONT}{BLACK}Light blue +STR_5524 :{SMALLFONT}{BLACK}Icy blue +STR_5525 :{SMALLFONT}{BLACK}Teal +STR_5526 :{SMALLFONT}{BLACK}Aquamarine +STR_5527 :{SMALLFONT}{BLACK}Saturated green +STR_5528 :{SMALLFONT}{BLACK}Dark green +STR_5529 :{SMALLFONT}{BLACK}Moss green +STR_5530 :{SMALLFONT}{BLACK}Bright green +STR_5531 :{SMALLFONT}{BLACK}Olive green +STR_5532 :{SMALLFONT}{BLACK}Dark olive green +STR_5533 :{SMALLFONT}{BLACK}Bright yellow +STR_5534 :{SMALLFONT}{BLACK}Yellow +STR_5535 :{SMALLFONT}{BLACK}Dark yellow +STR_5536 :{SMALLFONT}{BLACK}Light orange +STR_5537 :{SMALLFONT}{BLACK}Dark orange +STR_5538 :{SMALLFONT}{BLACK}Light brown +STR_5539 :{SMALLFONT}{BLACK}Saturated brown +STR_5540 :{SMALLFONT}{BLACK}Dark brown +STR_5541 :{SMALLFONT}{BLACK}Salmon pink +STR_5542 :{SMALLFONT}{BLACK}Bordeaux red +STR_5543 :{SMALLFONT}{BLACK}Saturated red +STR_5544 :{SMALLFONT}{BLACK}Bright red +STR_5545 :{SMALLFONT}{BLACK}Dark pink +STR_5546 :{SMALLFONT}{BLACK}Bright pink +STR_5547 :{SMALLFONT}{BLACK}Light pink From f16b740dcad36caa7fb4746bfb41ef1670c2e329 Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 2 Sep 2015 04:00:15 +0100 Subject: [PATCH 0622/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 2 ++ data/language/dutch.txt | 2 ++ data/language/english_us.txt | 2 ++ 3 files changed, 6 insertions(+) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index d73e1e9b34..21b59c44f4 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3853,3 +3853,5 @@ STR_5510 :預設聲效裝置 STR_5511 :(未知) STR_5512 :另存遊戲 STR_5513 :(快速)儲存遊戲 +STR_5514 :禁止設施被刻意毀壞 +STR_5515 :{SMALLFONT}{BLACK}禁止遊客憤怒時刻意毀壞公眾物件的行為 diff --git a/data/language/dutch.txt b/data/language/dutch.txt index e5a0671099..f41d7684fb 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3846,3 +3846,5 @@ STR_5510 :Standaard geluidsapparaat STR_5511 :(ONBEKEND) STR_5512 :Spel opslaan als... STR_5513 :Spel (snel) opslaan +STR_5514 :Vandalisme uitschakelen +STR_5515 :{SMALLFONT}{BLACK}Voorkomt dat bezoekers objecten in je park vernielen als ze kwaad zijn diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 3d3eb55920..259eb6d548 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3854,3 +3854,5 @@ STR_5510 :Default sound device STR_5511 :(UNKNOWN) STR_5512 :Save Game As STR_5513 :(Quick) save game +STR_5514 :Disable vandalism +STR_5515 :{SMALLFONT}{BLACK}Stops guests from vandalising your park when they're angry From ea9f87d0f3cfb532b3a6b9bae1c2719f032d874e Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 2 Sep 2015 12:42:43 +0200 Subject: [PATCH 0623/1173] Remove faulty copy-and-pasted check on secondary items, fixes #1866 --- src/windows/ride.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/windows/ride.c b/src/windows/ride.c index 008e4a7f3f..c318b823db 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -5485,12 +5485,6 @@ static void window_ride_income_increase_secondary_price(rct_window *w) ride = GET_RIDE(w->number); ride_type = gRideTypeList[ride->subtype]; - if ((RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) == 0) { - if (ride->type != RIDE_TYPE_TOILETS && ride_type->shop_item_secondary == 0xFF) { - if (!gConfigCheat.unlock_all_prices) - return; - } - } money16 price = ride->price_secondary; if (price < MONEY(20, 00)) price++; @@ -5510,12 +5504,6 @@ static void window_ride_income_decrease_secondary_price(rct_window *w) ride = GET_RIDE(w->number); ride_type = gRideTypeList[ride->subtype]; - if ((RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) == 0) { - if (ride->type != RIDE_TYPE_TOILETS && ride_type->shop_item_secondary == 0xFF) { - if (!gConfigCheat.unlock_all_prices) - return; - } - } money16 price = ride->price_secondary; if (price > MONEY(0, 00)) price--; From 73856c2e247702c00e958d4005f1cddf5fd91e36 Mon Sep 17 00:00:00 2001 From: Hugo Courtial Date: Wed, 2 Sep 2015 19:39:55 +0200 Subject: [PATCH 0624/1173] Add Dockerfile --- Dockerfile | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..7ddbfc3594 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,43 @@ +FROM nfnty/arch-mini +MAINTAINER s0r00t +ENV DISPLAY :0 + +RUN pacman -Syyu --noconfirm +RUN pacman -S --noconfirm git yajl cmake wget unzip wine +RUN pacman -S --noconfirm --needed base-devel + +RUN useradd -mg root travis +RUN usermod -aG wheel travis +RUN sed -i 's/# %wheel ALL=(ALL) NOPASSWD: ALL/%wheel ALL=(ALL) NOPASSWD: ALL/g' /etc/sudoers + +USER travis +WORKDIR /tmp +RUN curl -sL https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=package-query -o PKGBUILD +RUN makepkg +USER root +RUN pacman --noconfirm -U *.pkg.tar.xz +USER travis +RUN curl -sL https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=yaourt -o PKGBUILD +RUN makepkg +USER root +RUN pacman --noconfirm -U *.pkg.tar.xz + +USER travis +RUN gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys D9C4D26D0E604491 BB5869F064EA74AB 9D5EAAF69013B842 D605848ED7E69871 4DE8FF2A63C7CC90 +RUN yaourt -S --noconfirm mingw-w64-gcc mingw-w64-zlib mingw-w64-pkg-config mingw-w64-openssl mingw-w64-jansson mingw-w64-libtasn1 mingw-w64-gmp mingw-w64-nettle mingw-w64-libffi mingw-w64-p11-kit mingw-w64-readline mingw-w64-gnutls mingw-w64-libunistring mingw-w64-termcap mingw-w64-libidn mingw-w64-curl mingw-w64-expat mingw-w64-libdbus mingw-w64-sdl2 mingw-w64-sdl2_ttf mingw-w64-configure +USER root +RUN pacman --noconfirm -Rns $(pacman -Qttdq) +RUN pacman -Scc --noconfirm +WORKDIR /tmp +RUN rm -r * +WORKDIR /home/travis +USER travis +RUN git clone https://github.com/OpenRCT2/OpenRCT2 +WORKDIR OpenRCT2 +RUN ln -s /usr/i686-w64-mingw32/bin/libfreetype-6.dll +RUN ln -s /usr/i686-w64-mingw32/bin/libwinpthread-1.dll +RUN ln -s /usr/i686-w64-mingw32/bin/SDL2_ttf.dll +RUN ln -s /usr/i686-w64-mingw32/bin/SDL2.dll +RUN ln -s /usr/i686-w64-mingw32/bin/libbz2-1.dll +RUN ./install.sh +RUN ./build.sh From 6ea9b6666c0c17c4c073a1ba16442b81c52c3d84 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Wed, 2 Sep 2015 20:40:03 -0600 Subject: [PATCH 0625/1173] disable naggle --- src/network/network.cpp | 43 ++++++++++++++++++++++------------------- src/network/network.h | 5 +++-- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 988a2d53b5..57523bfd8f 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -170,6 +170,9 @@ int NetworkConnection::ReadPacket() inboundpacket.transferred += readBytes; if (inboundpacket.transferred == sizeof(inboundpacket.size)) { inboundpacket.size = ntohs(inboundpacket.size); + if(inboundpacket.size == 0){ // Can't have a size 0 packet + return NETWORK_DISCONNECTED; + } inboundpacket.data->resize(inboundpacket.size); } } else { @@ -192,30 +195,23 @@ int NetworkConnection::ReadPacket() return NETWORK_MORE_DATA; } -int NetworkConnection::SendPacket(NetworkPacket& packet) +bool NetworkConnection::SendPacket(NetworkPacket& packet) { + uint16 sizen = htons(packet.size); + std::vector tosend; + tosend.insert(tosend.end(), (uint8*)&sizen, (uint8*)&sizen + sizeof(sizen)); + tosend.insert(tosend.end(), packet.data->begin(), packet.data->end()); while (1) { - if (packet.transferred < sizeof(packet.size)) { - // send packet size - uint16 size = htons(packet.size); - int sentBytes = send(socket, &((char*)&size)[packet.transferred], sizeof(size) - packet.transferred, 0); - if (sentBytes == SOCKET_ERROR) { - return 0; - } - packet.transferred += sentBytes; - } else { - // send packet data - int sentBytes = send(socket, (const char*)&packet.GetData()[packet.transferred - sizeof(packet.size)], packet.data->size(), 0); - if (sentBytes == SOCKET_ERROR) { - return 0; - } - packet.transferred += sentBytes; - if (packet.transferred == sizeof(packet.size) + packet.data->size()) { - return 1; - } + int sentBytes = send(socket, (const char*)&tosend[packet.transferred], tosend.size() - packet.transferred, 0); + if (sentBytes == SOCKET_ERROR) { + return false; + } + packet.transferred += sentBytes; + if (packet.transferred == tosend.size()) { + return true; } } - return 0; + return false; } void NetworkConnection::QueuePacket(std::unique_ptr packet) @@ -233,6 +229,11 @@ void NetworkConnection::SendQueuedPackets() } } +bool NetworkConnection::SetTCPNoDelay(bool on) +{ + return setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (const char*)&on, sizeof(on)) == 0; +} + Network::Network() { wsa_initialized = false; @@ -330,6 +331,7 @@ bool Network::BeginClient(const char* host, unsigned short port) } server_connection.socket = server_socket; + server_connection.SetTCPNoDelay(true); mode = NETWORK_MODE_CLIENT; @@ -703,6 +705,7 @@ void Network::AddClient(SOCKET socket) { auto connection = std::unique_ptr(new NetworkConnection); // change to make_unique in c++14 connection->socket = socket; + connection->SetTCPNoDelay(true); client_connection_list.push_back(std::move(connection)); } diff --git a/src/network/network.h b/src/network/network.h index 55826d0668..bd7015897f 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -84,7 +84,7 @@ public: void Write(uint8* bytes, unsigned int size); void WriteString(const char* string); template - NetworkPacket& operator>>(T& value) { if (read + sizeof(value) > size) { value = 0; } else { value = ByteSwapBE(*((T*)&GetData()[read])); read += sizeof(value); } return *this; }; + NetworkPacket& operator>>(T& value) { if (read + sizeof(value) > size) { value = 0; } else { value = ByteSwapBE(*((T*)&GetData()[read])); read += sizeof(value); } return *this; } const uint8* Read(unsigned int size); const char* ReadString(); void Clear(); @@ -112,6 +112,7 @@ public: int ReadPacket(); void QueuePacket(std::unique_ptr packet); void SendQueuedPackets(); + bool SetTCPNoDelay(bool on); SOCKET socket; NetworkPacket inboundpacket; @@ -120,7 +121,7 @@ public: uint32 ping_time; private: - int SendPacket(NetworkPacket& packet); + bool SendPacket(NetworkPacket& packet); std::list> outboundpackets; }; From 8c2d0b37301896bc1b680c128d11cf6cd656fba3 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 3 Sep 2015 04:00:15 +0100 Subject: [PATCH 0626/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/korean.txt | 153 +++++++++++++++++++++++---------------- 1 file changed, 89 insertions(+), 64 deletions(-) diff --git a/data/language/korean.txt b/data/language/korean.txt index be89d7c594..8bb45f7060 100644 --- a/data/language/korean.txt +++ b/data/language/korean.txt @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 :컴팩트 롤러코스터 with a spiral lift hill and smooth, twisting drops. -STR_0513 :루핑 롤러코스터 where the 라이더 라이드 in a standing position -STR_0514 :Trains 서스펜디드 beneath the 롤러코스터 track swing out to the side around corners -STR_0515 :A steel 롤러코스터 with trains that are held beneath the track, with many complex and twisting track elements -STR_0516 :A gentle 롤러코스터 for people who haven't yet got the courage to face the larger 라이드s -STR_0517 :Passengers 라이드 in 미니ature trains along a narrow-gauge railway track -STR_0518 :Passengers travel in electric trains along a monorail track -STR_0519 :Passengers 라이드 in small cars hanging beneath the single-rail track, swinging freely from side to side around corners -STR_0520 :A dock platform where 손님 can drive/row personal watercraft on a body of water -STR_0521 :A fast and twisting 롤러코스터 with tight turns and steep drops. Intensity is bound to be high. -STR_0522 :A smaller 롤러코스터 where the 라이더 sit above the track with no car around them -STR_0523 :라이더 travel slowly in powered vehicles along a track-based route -STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down -STR_0525 :라이더 career down a twisting track guided only by the curvature and banking of the semi-circular track -STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower -STR_0527 :A smooth steel-tracked 롤러코스터 capable of vertical loops -STR_0528 :라이더 travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track -STR_0529 :Mine train themed 롤러코스터 trains career along steel 롤러코스터 track made to look like old railway track -STR_0530 :Cars hang from a steel cable which runs continuously from one end of the 라이드 to the other and back again -STR_0531 :A compact steel-tracked 롤러코스터 where the train travels through corkscrews and loops +STR_0512 :나선형 리프트 힐과 부드럽게 꼬인 낙하를 가진 알찬 구성의 롤러코스터입니다. +STR_0513 :손님들이 일어선 자세로 탑승하는 루핑 롤러코스터입니다 +STR_0514 :코너를 돌 때 롤러코스터 트랙 아래에 달린 차량이 흔들리는 열차입니다 +STR_0515 :복잡하고 꼬인 트랙 요소를 가진 트랙 아래를 달리는 스틸 롤러코스터 차량입니다 +STR_0516 :큰 놀이기구를 탈 용기가 없는 사람들을 위한 얌전한 롤러코스터입니다 +STR_0517 :손님들은 협궤 선로를 따라 달리는 미니어처 열차에 탑승합니다 +STR_0518 :손님들은 모노렝리 트랙을 따라 달리는 전기 차량에 탑승합니다 +STR_0519 :손님들은 코너를 돌 때마다 좌우로 흔들리는, 단선 트랙 아래에 달린 작은 차량에 탑승합니다 +STR_0520 :손님들이 물 위를 다니는 배를 운전하거나 또는 저을 수 있는 선착장입니다 +STR_0521 :급커브와 급하강을 가진 빠르게 꼬인 롤러코스터입니다. 격렬도가 높게 나올 것입니다 +STR_0522 :탑승객이 차량 없이 트랙 위에 앉는 작은 롤러코스터입니다 +STR_0523 :정해진 트랙을 따라 천천히 움직이는 차량입니다 +STR_0524 :자유낙하 차량은 공기 압축 방식으로 높은 철제 탑을 향해 차량을 쏘아올려 자유낙하하는 차량입니다 +STR_0525 :탑승객은 오직 반원형으로 휘어있고 꼬여있는 트랙을 따라 이동합니다 +STR_0526 :탑승객은 높은 곳으로 올라가면서 회전하는 관망대 캐빈에 탑승합니다 +STR_0527 :버티컬 루프를 사용할 수 있는 부드러운 철제 트랙의 롤러코스터입니다 +STR_0528 :탑승객은 공기를 넣은 고무 보트를 타고 반원이나 원형의 튜브 트랙을 따라 이동합니다 +STR_0529 :오래된 기차 선로처럼 보이게 만든 철제 트랙을 따라 움직이는 탄광 열차 테마를 한 롤러코스터 차량입니다. +STR_0530 :철제 케이블에 달린 차량이 연속적으로 놀이기구의 한쪽 끝에서 다른쪽 끝을 왕복 운행합니다 +STR_0531 :차량이 코크스크류와 루프를 통과하는 알찬 구성의 철제 트랙 롤러코스터입니다 STR_0532 : STR_0533 : -STR_0534 :Self-drive petrol-engined go karts -STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the 라이더 -STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling 라이더 through foaming rapids +STR_0534 :패트롤 엔진으로 움직이는 고 카트입니다 +STR_0535 :통나무 모양의 보트가 수로를 따라 이동하며, 떨어지면서 탑승객을 물에 젖게 만듭니다 +STR_0536 :원형의 보트가 수로를 따라 요동치며, 폭포를 통과하며 물을 튀기고 탑승객들에게 거품 소용돌이를 통과하며 스릴을 선사합니다 STR_0537 : STR_0538 : STR_0539 : @@ -563,47 +563,47 @@ STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects -STR_0563 :Sitting in comfortable trains with only simple lap restraints 라이더 enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills -STR_0564 :Running on 우든 track, this 코스터 is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' -STR_0565 :A simple 우든 롤러코스터 capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity -STR_0566 :Individual 롤러코스터 cars zip around a tight zig-zag layout of track with sharp corners and short sharp drops -STR_0567 :Sitting in seats 서스펜디드 either side of the track, 라이더 are pitched head-over-heels while they plunge down steep drops and travel through various inversions +STR_0562 :무서운 풍경과 특수 효과를 통과하며 여러 높이의 트랙을 따라 이동하는 전동 차량입니다 +STR_0563 :탑승객들은 한 바퀴를 운행하는 편안한 좌석에 앉아 언덕을 오르면서 느낄 수 있는 '무중력 시간'뿐만이 아니라 크고 부드러운 낙하와 꼬인 트랙의 느낌을 즐길 수 있습니다 +STR_0564 :목재 트랙 위를 움직이는 이 롤러코스터는 빠르고, 거칠고, 시끄럽고, 많은 '무중력 시간'과 함께 '제어 불가능할 것 같은' 탑승감을 선사합니다 +STR_0565 :완만한 경사와 커브만을 가진 간단한 목재 롤러코스터로, 이 롤러코스터의 차량은 오직 측면 마찰륜과 중력만으로 트랙 위에 얹혀진 상태로 운행합니다 +STR_0566 :개별적인 롤러코스터 차량이 급커브와 짧고 급한 경사를 가진 지그재그 모양의 트랙을 어지럽게 돌아다닙니다 +STR_0567 :트랙 반대편에 매달린 좌석에 앉아서, 탑승객들은 급강하와 여러 가지 반전 트랙을 통과하면서 거꾸러지는 동안 머리와 다리가 뒤집히게 됩니다 STR_0568 : -STR_0569 :Riding in special harnesses below the track, 라이더 experience the feeling of flight as they swoop through the air +STR_0569 :차량 밑에 달린 특별한 마차에 탑승하여, 탑승객들은 공중으로 급강하면서 하늘을 나는 기분을 느끼게 만듭니다 STR_0570 : -STR_0571 :Circular cars spin around as they travel along the zig-zagging 우든 track -STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the 라이더 with a gaint splash -STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the 라이더 -STR_0574 :라이더 are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground -STR_0575 :Powered trains hanging from a single rail transport people around the park +STR_0571 :원형의 차량이 나무 트랙을 지그재그로 이동하면서 회전합니다 +STR_0572 :대형 보트가 넓은 수로를 따라 컨베이어 벨트에 의해 언덕을 올라간 뒤, 급강하하면서 큰 물보라를 일으켜 탑승객을 젖게 만듭니다 +STR_0573 :탑승객이 직접 페달을 밟아 이동하는, 철제 트랙을 달리는 헬리콥터 모양의 전동 차량입니다 +STR_0574 :탑승객은 특수한 마차에 누운 자세로 매달려, 이리 저리 꼬이고 뒤집히는 트랙을 땅을 등지거나 마주보는 자세로 탑승하게 됩니다 +STR_0575 :공원 여기 저기로 사람들을 실어나르는, 단선 레일에 매달린 전동 열차입니다 STR_0576 : -STR_0577 :Bogied cars run on 우든 tracks, turning around on special reversing sections -STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists +STR_0577 :특수한 반전 섹션에서 앞뒤가 바뀌는 목재 트랙을 달리는 보우기 차입니다 +STR_0578 :원형 고리로 둘러싸여 급강하와 하트라인 트위트스를 횡단하는 트랙을 달리는 차량입니다. STR_0579 : -STR_0580 :A giant steel 롤러코스터 capable of smooth drops and hills of over 300ft -STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes +STR_0580 :90m 이상의 언덕을 부드럽게 오르내리는 거대한 철제 롤러코스터입니다 +STR_0581 :원형 모양의 좌석이 맨 위까지 끌어올려진 다음, 자유 낙하하며, 자기장에 의해 부드럽게 바닥에 정지합니다 STR_0582 : STR_0583 : -STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the 라이더 -STR_0585 :라이더 sit in pairs of seats 서스펜디드 beneath the track as they loop and twist through tight inversions -STR_0586 :Boat shaped cars run on 롤러코스터 track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections -STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station -STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops +STR_0584 :탑승객이 스스로 페달을 밟아 이동해야 하는, 특별한 철제 모노레일 트랙 위를 이동하는 자전거입니다 +STR_0585 :탑승객은 트랙 밑에 매달린 좌석 한 쌍에 앉아 루프와 트위스트를 급격히 통과합니다 +STR_0586 :보트 모양의 차량이 꼬인 커브와 급강하가 가능한 롤러코스터 트랙을 달리며, 강 섹션의 물에서는 물보라를 일으키며 감속합니다 +STR_0587 :아주 짜릿한 공기 압축 방식으로 발진하여 차량이 수직 트랙을 향해 속력을 높인 뒤, 꼭대기에 다다르면 다시 수직으로 하강하며 다른 탑승장에 도착합니다 +STR_0588 :개별적인 차량이 헤이펀 커브와 급강하를 포함한 지그재그 모양의 트랙 아래를 이동합니다 STR_0589 : -STR_0590 :라이더 라이드 in a submerged submarine through an underwater course -STR_0591 :Raft-shaped boats gently meander around a river track +STR_0590 :탑승객들은 잠수가 가능한 잠수함을 타고 수중 코스를 돕니다 +STR_0591 :뗏목 모양의 보트가 강 모양의 트랙을 따라 얌전히 이동합니다 STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 :인버티드 롤러코스터 trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track -STR_0599 :A compact 롤러코스터 with individual cars and smooth twisting drops -STR_0600 :Powered mine trains career along a smooth and twisted track layout +STR_0598 :뒤집힌 롤러코스터 차량이 탑승장을 나서 가속하여 높이 솟은 수직 트랙으로 솟아오르고, 다시 탑승장으로 후진하여 반대편의 수직 트랙을 향해 다시 솟아오릅니다 +STR_0599 :각각의 차량이 부드럽게 꼬인 채로 낙하하는 알찬 구성의 롤러코스터입니다. +STR_0600 :부드럽게 꼬인 트랙 구조를 따라 이동하는 탄광 차량입니다 STR_0601 : -STR_0602 :롤러코스터 trains are accelerated out of the station by linear induction motors to speed through twisting inversions +STR_0602 :롤러코스터 차량은 탑승장에서 선형 유도 모터에 의해 가속하여 트랙을 돌만한 속도까지 올라갑니다 STR_0603 :손님 {INT32} STR_0604 :손님 {INT32} STR_0605 :손님 {INT32} @@ -1017,27 +1017,27 @@ STR_1011 :모두 닫기 STR_1012 :모두 열기 STR_1013 :공원 닫기 STR_1014 :공원 열기 -STR_1015 :Unable to operate with more than one station platform in this mode -STR_1016 :Unable to operate with less than two stations in this mode -STR_1017 :Can't change operating mode... -STR_1018 :Can't make changes... -STR_1019 :Can't make changes... -STR_1020 :Can't make changes... +STR_1015 :이 운행 모드에서는 승강장을 하나만 건설해야 합니다 +STR_1016 :이 운행 모드에서는 승강장이 2개 이상 필요합니다 +STR_1017 :운행 모드를 변경할 수 없습니다... +STR_1018 :변경할 수 없습니다... +STR_1019 :변경할 수 없습니다... +STR_1020 :변경할 수 없습니다... STR_1021 :{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_1022 :1대당 {POP16}{POP16}{POP16}{COMMA16}량의 차량 STR_1023 :1대당 {POP16}{POP16}{POP16}{COMMA16}량의 차량 STR_1024 :1대당 {COMMA16}량의 차량 STR_1025 :1대당 {COMMA16}량의 차량 STR_1026 :탑승장이 너무 깁니다! -STR_1027 :{SMALLFONT}{BLACK}Locate this on Main View +STR_1027 :{SMALLFONT}{BLACK}여기로 이동 STR_1028 :지도 끝을 벗어납니다! -STR_1029 :Cannot build partly above and partly below water! -STR_1030 :Can only build this underwater! -STR_1031 :Can't build this underwater! -STR_1032 :Can only build this on water! -STR_1033 :Can only build this above ground! -STR_1034 :Can only build this on land! -STR_1035 :Local authority won't allow construction above tree-height! +STR_1029 :일부분만 수면 위로 나오도록 건설할 수 없습니다! +STR_1030 :수중에만 건설할 수 있습니다! +STR_1031 :물 속에 건설할 수 없습니다! +STR_1032 :물 위에만 건설할 수 있습니다! +STR_1033 :땅 위에만 건설할 수 있습니다! +STR_1034 :땅 위에만 건설할 수 있습니다! +STR_1035 :지역 당국이 나무 높이 이상의 건설을 허용하지 않습니다! STR_1036 :게임 불러오기 STR_1037 :풍경 불러오기 STR_1038 :저장된 게임을 시나리오로 변환 @@ -3827,3 +3827,28 @@ STR_5487 :{SMALLFONT}{BLACK}최근 메시지 보이기 STR_5488 :입구 없음 STR_5489 :{SMALLFONT}{BLACK}추적 중인 손님만 보기 STR_5490 :게임 밖으로 커서가 나가면 효과음 끄기 +STR_5491 :개발 목록 +STR_5492 :시나리오 설정 +STR_5493 :메시지 보내기 +STR_5494 :<더 이상 사용하지 않음> +STR_5495 :플레이어 목록 +STR_5496 :플레이어: +STR_5497 :핑: +STR_5498 :서버 목록 +STR_5499 :플레이어 이름: +STR_5500 :서버 추가 +STR_5501 :서버 열기 +STR_5502 :멀티플레이 +STR_5503 :호스트네임이나 IP 주소를 입력하세요: +STR_5504 :{SMALLFONT}{BLACK}멀티플레이 창을 엽니다 +STR_5505 :서버에 접속할 수 없습니다 +STR_5506 :손님이 격렬도를 무시하고 탐 +STR_5507 :미화원이 기본적으로 잔디를 깎음 +STR_5508 :올바르지 않은 체크합을 가진 파일 불러오기 허용 +STR_5509 :{SMALLFONT}{BLACK}데모에서 저장한 시나리오나 손상된 저장 파일과 같이 올바르지 않은 체크합을 가진 시나리오나 저장 파일을 불러오는 것을 허용합니다. +STR_5510 :기본 사운드 장치 +STR_5511 :(알 수 없음) +STR_5512 :다른 이름으로 저장 +STR_5513 :(간편) 게임 저장 +STR_5514 :기물 파손 끄기 +STR_5515 :{SMALLFONT}{BLACK}손님이 화가 났을 때 기물을 파손하지 않도록 설정합니다 From ba1101e012e9337dae92d55e45ebfeaf0cc4df74 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 3 Sep 2015 11:08:23 +0200 Subject: [PATCH 0627/1173] Check if the game is in title sequence mode before loading it, fixes #1870 --- src/title.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/title.c b/src/title.c index f91f5a53ea..a0cfce34fa 100644 --- a/src/title.c +++ b/src/title.c @@ -646,6 +646,9 @@ static uint8 *title_script_load() bool title_refresh_sequence() { + if(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) != SCREEN_FLAGS_TITLE_DEMO) + return; + _scriptCurrentPreset = gCurrentPreviewTitleSequence; title_sequence *title = &gConfigTitleSequences.presets[_scriptCurrentPreset]; From d849e3378c2f3ae9d50d0086111ca3770579c91d Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 3 Sep 2015 12:12:21 +0200 Subject: [PATCH 0628/1173] Keep track list responsive in pause mode, fixes #1493 --- src/windows/track_list.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/windows/track_list.c b/src/windows/track_list.c index f6135bd588..d5970907eb 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -298,9 +298,6 @@ static void window_track_list_scrollmousedown(rct_window *w, int scrollIndex, in if (w->track_list.var_484 & 1) return; - // Made it impossible to click a design in pause mode. Since the UI now stays responsive in pause mode, always allow clicking a design. - /*if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0) - return;*/ i = window_track_list_get_list_item_index_from_position(x, y); if (i != -1) @@ -317,8 +314,6 @@ static void window_track_list_scrollmouseover(rct_window *w, int scrollIndex, in if (w->track_list.var_484 & 1) return; - if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0) - return; i = window_track_list_get_list_item_index_from_position(x, y); if (i != -1 && w->track_list.var_482 != i) { From 2729531e0e765e707d70682391fee1baa8974e1e Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 3 Sep 2015 13:13:50 +0200 Subject: [PATCH 0629/1173] Cleaner fix --- src/title.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/title.c b/src/title.c index a0cfce34fa..bd35c33840 100644 --- a/src/title.c +++ b/src/title.c @@ -646,9 +646,6 @@ static uint8 *title_script_load() bool title_refresh_sequence() { - if(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) != SCREEN_FLAGS_TITLE_DEMO) - return; - _scriptCurrentPreset = gCurrentPreviewTitleSequence; title_sequence *title = &gConfigTitleSequences.presets[_scriptCurrentPreset]; @@ -719,8 +716,11 @@ bool title_refresh_sequence() _scriptWaitCounter = 0; gTitleScriptCommand = -1; gTitleScriptSave = 0xFF; - title_update_showcase(); - gfx_invalidate_screen(); + + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) == SCREEN_FLAGS_TITLE_DEMO) { + title_update_showcase(); + gfx_invalidate_screen(); + } return true; } @@ -738,8 +738,12 @@ bool title_refresh_sequence() gCurrentPreviewTitleSequence = 0; window_invalidate_by_class(WC_OPTIONS); window_invalidate_by_class(WC_TITLE_EDITOR); - title_update_showcase(); - gfx_invalidate_screen(); + + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) == SCREEN_FLAGS_TITLE_DEMO) { + title_update_showcase(); + gfx_invalidate_screen(); + } + return false; } From 7afae59150817cf3dfccde6a1c57d4eb6416c23e Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 3 Sep 2015 13:38:21 +0200 Subject: [PATCH 0630/1173] Only force installation on Travis --- install.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 7a3588113a..e834c27d66 100755 --- a/install.sh +++ b/install.sh @@ -74,7 +74,14 @@ if [[ `uname` == "Darwin" ]]; then popd fi elif [[ `uname` == "Linux" ]]; then - sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake + if [[ -z "$TRAVIS" ]]; then + sudo apt-get install -y binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake + if [[ -z "$DISABLE_G2_BUILD" ]]; then + sudo apt-get install -y wine + fi + else + sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake + fi fi if [[ ! -f $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz ]]; then From feebb7b39dbc912900c0be24f523177a1cf12995 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 3 Sep 2015 15:08:33 +0200 Subject: [PATCH 0631/1173] Take on-ride photos into account when calculating profit per hour, fixes #1877 --- src/ride/ride.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 2b72896d39..60d326c961 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -246,7 +246,7 @@ money32 ride_calculate_income_per_hour(rct_ride *ride) { rct_ride_type *entry; money32 incomePerHour, priceMinusCost; - int shopItem; + int currentShopItem; entry = GET_RIDE_ENTRY(ride->subtype); incomePerHour = @@ -263,16 +263,21 @@ money32 ride_calculate_income_per_hour(rct_ride *ride) incomePerHour *= 12; priceMinusCost = ride->price; - shopItem = entry->shop_item; - if (shopItem != 255) { - priceMinusCost -= get_shop_item_cost(shopItem); + currentShopItem = entry->shop_item; + if (currentShopItem != 255) { + priceMinusCost -= get_shop_item_cost(currentShopItem); + } - shopItem = entry->shop_item_secondary; - if (shopItem != 255) { - priceMinusCost += ride->price_secondary; - priceMinusCost -= get_shop_item_cost(shopItem); + currentShopItem = ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO ? + RCT2_GLOBAL(0x0097D7CB + (ride->type * 4), uint8) : + entry->shop_item_secondary; + + if (currentShopItem != 255) { + priceMinusCost += ride->price_secondary; + priceMinusCost -= get_shop_item_cost(currentShopItem); + + if(entry->shop_item!=255) priceMinusCost /= 2; - } } incomePerHour *= priceMinusCost; From c3ffd221de8438971971d8562fa93860d29dbdd2 Mon Sep 17 00:00:00 2001 From: Gator96100 Date: Thu, 3 Sep 2015 19:49:14 +0200 Subject: [PATCH 0632/1173] Added support for hostnames --- src/network/network.cpp | 16 +++++++++++++++- src/network/network.h | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 57523bfd8f..47532eb651 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -314,7 +314,7 @@ bool Network::BeginClient(const char* host, unsigned short port) SOCKADDR_IN server_address; server_address.sin_family = AF_INET; - server_address.sin_addr.S_un.S_addr = inet_addr(host); + server_address.sin_addr.S_un.S_addr = inet_addr(network_getAddress((char *)host)); server_address.sin_port = htons(port); if (connect(server_socket, (SOCKADDR*)&server_address, sizeof(SOCKADDR_IN)) != 0) { @@ -1047,6 +1047,20 @@ void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 } } +static char *network_getAddress(char *host) +{ + struct hostent *remoteHost; + struct in_addr addr; + + remoteHost = gethostbyname(host); + if (remoteHost != NULL && remoteHost->h_addrtype == AF_INET && remoteHost->h_addr_list[0] != 0) { + addr.s_addr = *(u_long *)remoteHost->h_addr_list[0]; + return inet_ntoa(addr); + } + + return host; +} + #else int network_get_mode() { return NETWORK_MODE_NONE; } uint32 network_get_server_tick() { return RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); } diff --git a/src/network/network.h b/src/network/network.h index bd7015897f..c7dcdeca50 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -241,6 +241,7 @@ void network_send_chat(const char* text); void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback); void network_print_error(); +static char *network_getAddress(char *host); #ifdef __cplusplus } From 42cc5555be18bf42b1a194478e2d69ca81179eba Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 3 Sep 2015 19:57:24 +0100 Subject: [PATCH 0633/1173] add Korean language descriptor --- src/localisation/language.c | 9 ++++++++- src/localisation/language.h | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/localisation/language.c b/src/localisation/language.c index 72a24b0b36..72421d7630 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -65,6 +65,13 @@ static TTFFontSetDescriptor TTFFontSimSun = {{ { "simsun.ttc", 13, 1, 0, 20, NULL }, }}; +static TTFFontSetDescriptor TTFFontMalgun = { { + { "malgun.ttf", 8, -1, -3, 6, NULL }, + { "malgun.ttf", 11, 1, -2, 14, NULL }, + { "malgun.ttf", 12, 1, -4, 14, NULL }, + { "malgun.ttf", 13, 1, 0, 20, NULL }, +} }; + const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "", "", "", "", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_UNDEFINED { "en-GB", "English (UK)", "English (UK)", "english_uk", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_ENGLISH_UK @@ -81,7 +88,7 @@ const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", &TTFFontMingLiu, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL { "zh-Hans", "Chinese (Simplified)", "Chinese (Simplified)", "chinese_simplified", &TTFFontSimSun, RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED }, // LANGUAGE_CHINESE_SIMPLIFIED { "fi-FI", "Finnish", "Suomi", "finnish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_FINNISH -// { "kr-KR", "Korean", "Korean", "english_uk", "malgun.ttf", RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN + { "kr-KR", "Korean", "Korean", "korean", &TTFFontMalgun, RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN }; int gCurrentLanguage = LANGUAGE_UNDEFINED; diff --git a/src/localisation/language.h b/src/localisation/language.h index f97fe44801..66b7928306 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -40,7 +40,7 @@ enum { LANGUAGE_CHINESE_TRADITIONAL, LANGUAGE_CHINESE_SIMPLIFIED, LANGUAGE_FINNISH, -// LANGUAGE_KOREAN, + LANGUAGE_KOREAN, LANGUAGE_COUNT }; From 4c60112bd545458de4ad0de8e0e798e0a30b1189 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 4 Sep 2015 04:00:15 +0100 Subject: [PATCH 0634/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 32 ++++++++++++++++++++++++++++++++ data/language/english_us.txt | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index f41d7684fb..05407b27a7 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3848,3 +3848,35 @@ STR_5512 :Spel opslaan als... STR_5513 :Spel (snel) opslaan STR_5514 :Vandalisme uitschakelen STR_5515 :{SMALLFONT}{BLACK}Voorkomt dat bezoekers objecten in je park vernielen als ze kwaad zijn +STR_5516 :{SMALLFONT}{BLACK}Zwart +STR_5517 :{SMALLFONT}{BLACK}Grijs +STR_5518 :{SMALLFONT}{BLACK}Wit +STR_5519 :{SMALLFONT}{BLACK}Donkerpaars +STR_5520 :{SMALLFONT}{BLACK}Lichtpaars +STR_5521 :{SMALLFONT}{BLACK}Helder paars +STR_5522 :{SMALLFONT}{BLACK}Darkblauw +STR_5523 :{SMALLFONT}{BLACK}Lichtblauw +STR_5524 :{SMALLFONT}{BLACK}IJzig blauw +STR_5525 :{SMALLFONT}{BLACK}Turquoise +STR_5526 :{SMALLFONT}{BLACK}Aquamarijn +STR_5527 :{SMALLFONT}{BLACK}Verzadigd groen +STR_5528 :{SMALLFONT}{BLACK}Donkergroen +STR_5529 :{SMALLFONT}{BLACK}Mosgroen +STR_5530 :{SMALLFONT}{BLACK}Helder groen +STR_5531 :{SMALLFONT}{BLACK}Olijfgroen +STR_5532 :{SMALLFONT}{BLACK}Donker olijfgroen +STR_5533 :{SMALLFONT}{BLACK}Helder geel +STR_5534 :{SMALLFONT}{BLACK}Geel +STR_5535 :{SMALLFONT}{BLACK}Donkergeel +STR_5536 :{SMALLFONT}{BLACK}Lichtoranje +STR_5537 :{SMALLFONT}{BLACK}Donkeroranje +STR_5538 :{SMALLFONT}{BLACK}Lichtbruin +STR_5539 :{SMALLFONT}{BLACK}Verzadigd bruin +STR_5540 :{SMALLFONT}{BLACK}Donkerbruin +STR_5541 :{SMALLFONT}{BLACK}Zalmroze +STR_5542 :{SMALLFONT}{BLACK}Bordeauxrood +STR_5543 :{SMALLFONT}{BLACK}Verzadigd rood +STR_5544 :{SMALLFONT}{BLACK}Helder rood +STR_5545 :{SMALLFONT}{BLACK}Donkerroze +STR_5546 :{SMALLFONT}{BLACK}Helder roze +STR_5547 :{SMALLFONT}{BLACK}Lichtroze diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 259eb6d548..e6a55caf1c 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3856,3 +3856,35 @@ STR_5512 :Save Game As STR_5513 :(Quick) save game STR_5514 :Disable vandalism STR_5515 :{SMALLFONT}{BLACK}Stops guests from vandalising your park when they're angry +STR_5516 :{SMALLFONT}{BLACK}Black +STR_5517 :{SMALLFONT}{BLACK}Gray +STR_5518 :{SMALLFONT}{BLACK}White +STR_5519 :{SMALLFONT}{BLACK}Dark purple +STR_5520 :{SMALLFONT}{BLACK}Light purple +STR_5521 :{SMALLFONT}{BLACK}Bright purple +STR_5522 :{SMALLFONT}{BLACK}Dark blue +STR_5523 :{SMALLFONT}{BLACK}Light blue +STR_5524 :{SMALLFONT}{BLACK}Icy blue +STR_5525 :{SMALLFONT}{BLACK}Teal +STR_5526 :{SMALLFONT}{BLACK}Aquamarine +STR_5527 :{SMALLFONT}{BLACK}Saturated green +STR_5528 :{SMALLFONT}{BLACK}Dark green +STR_5529 :{SMALLFONT}{BLACK}Moss green +STR_5530 :{SMALLFONT}{BLACK}Bright green +STR_5531 :{SMALLFONT}{BLACK}Olive green +STR_5532 :{SMALLFONT}{BLACK}Dark olive green +STR_5533 :{SMALLFONT}{BLACK}Bright yellow +STR_5534 :{SMALLFONT}{BLACK}Yellow +STR_5535 :{SMALLFONT}{BLACK}Dark yellow +STR_5536 :{SMALLFONT}{BLACK}Light orange +STR_5537 :{SMALLFONT}{BLACK}Dark orange +STR_5538 :{SMALLFONT}{BLACK}Light brown +STR_5539 :{SMALLFONT}{BLACK}Saturated brown +STR_5540 :{SMALLFONT}{BLACK}Dark brown +STR_5541 :{SMALLFONT}{BLACK}Salmon pink +STR_5542 :{SMALLFONT}{BLACK}Bordeaux red +STR_5543 :{SMALLFONT}{BLACK}Saturated red +STR_5544 :{SMALLFONT}{BLACK}Bright red +STR_5545 :{SMALLFONT}{BLACK}Dark pink +STR_5546 :{SMALLFONT}{BLACK}Bright pink +STR_5547 :{SMALLFONT}{BLACK}Light pink From 87eb6335ea4e5ebf671f1b5e10f4071e988515f0 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 4 Sep 2015 15:10:09 +0200 Subject: [PATCH 0635/1173] Remove unused variable --- src/world/map.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index ef156ffe67..56e8d19352 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3957,8 +3957,6 @@ bool map_surface_is_blocked(sint16 x, sint16 y){ /* Clears all map elements, to be used before generating a new map */ void map_clear_all_elements() { - int mapMaxXY = RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16); - for (int y = 0; y < (256 * 32); y += 32) { for (int x = 0; x < (256 * 32); x += 32) { sub_68AE2A(x, y); From 54b08da98ee77946af3f4fbd035782239802293c Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 5 Sep 2015 04:00:15 +0100 Subject: [PATCH 0636/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 32 +++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 21b59c44f4..ac4549252a 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3855,3 +3855,35 @@ STR_5512 :另存遊戲 STR_5513 :(快速)儲存遊戲 STR_5514 :禁止設施被刻意毀壞 STR_5515 :{SMALLFONT}{BLACK}禁止遊客憤怒時刻意毀壞公眾物件的行為 +STR_5516 :{SMALLFONT}{BLACK}黑色 +STR_5517 :{SMALLFONT}{BLACK}白色 +STR_5518 :{SMALLFONT}{BLACK}灰色 +STR_5519 :{SMALLFONT}{BLACK}暗紫色 +STR_5520 :{SMALLFONT}{BLACK}淺紫色 +STR_5521 :{SMALLFONT}{BLACK}明紫色 +STR_5522 :{SMALLFONT}{BLACK}暗藍色 +STR_5523 :{SMALLFONT}{BLACK}淺藍色 +STR_5524 :{SMALLFONT}{BLACK}冰藍色 +STR_5525 :{SMALLFONT}{BLACK}鴨綠色 +STR_5526 :{SMALLFONT}{BLACK}藍綠色 +STR_5527 :{SMALLFONT}{BLACK}深綠色 +STR_5528 :{SMALLFONT}{BLACK}暗綠色 +STR_5529 :{SMALLFONT}{BLACK}苔蘚綠色 +STR_5530 :{SMALLFONT}{BLACK}明綠色 +STR_5531 :{SMALLFONT}{BLACK}橄欖綠色 +STR_5532 :{SMALLFONT}{BLACK}暗橄欖綠色 +STR_5533 :{SMALLFONT}{BLACK}明黃色 +STR_5534 :{SMALLFONT}{BLACK}黃色 +STR_5535 :{SMALLFONT}{BLACK}暗黃色 +STR_5536 :{SMALLFONT}{BLACK}淺橙色 +STR_5537 :{SMALLFONT}{BLACK}暗橙色 +STR_5538 :{SMALLFONT}{BLACK}淺啡色 +STR_5539 :{SMALLFONT}{BLACK}深啡色 +STR_5540 :{SMALLFONT}{BLACK}暗啡色 +STR_5541 :{SMALLFONT}{BLACK}淺鮭紅色 +STR_5542 :{SMALLFONT}{BLACK}紅酒色 +STR_5543 :{SMALLFONT}{BLACK}深紅色 +STR_5544 :{SMALLFONT}{BLACK}明紅色 +STR_5545 :{SMALLFONT}{BLACK}暗粉紅色 +STR_5546 :{SMALLFONT}{BLACK}明粉紅色 +STR_5547 :{SMALLFONT}{BLACK}淺粉紅色 From e136923437bd1aa24f2710b5a72f326c4e4c7cba Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 5 Sep 2015 13:18:31 +0100 Subject: [PATCH 0637/1173] fix #1890 --- src/peep/peep.c | 82 ++++++++++++++++++++++++++----------------------- src/peep/peep.h | 14 +++++++++ 2 files changed, 58 insertions(+), 38 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 851384cc13..b908caeaff 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -341,9 +341,9 @@ static void sub_68F41A(rct_peep *peep, int index) if (peep->staff_type != STAFF_TYPE_SECURITY) return; - uint8 sprite_type = 23; + uint8 sprite_type = PEEP_SPRITE_TYPE_23; if (peep->state != PEEP_STATE_PATROLLING) - sprite_type = 3; + sprite_type = PEEP_SPRITE_TYPE_3; if (peep->sprite_type == sprite_type) return; @@ -1102,20 +1102,28 @@ item_pref item_order_preference[] = { { 0xFF, 0xFFFFFFFF, 0xFF} }; -/* rct2: 0x0069B8CC */ -void peep_update_sprite_type(rct_peep* peep){ - if (peep->sprite_type == 19 && - (scenario_rand() & 0xFFFF) <= 327){ +/** + * + * rct2: 0x0069B8CC + */ +void peep_update_sprite_type(rct_peep* peep) +{ + if ( + peep->sprite_type == PEEP_SPRITE_TYPE_19 && + (scenario_rand() & 0xFFFF) <= 327 + ) { uint8 bl = 0; - if ((scenario_rand() & 0xFFFF) <= 13107 && - peep->x != SPRITE_LOCATION_NULL){ + if ( + (scenario_rand() & 0xFFFF) <= 13107 && + peep->x != SPRITE_LOCATION_NULL + ) { bl = 1; sound_play_panned(SOUND_BALLOON_POP, 0x8001, peep->x, peep->y, peep->z); } - if (peep->x != SPRITE_LOCATION_NULL){ + if (peep->x != SPRITE_LOCATION_NULL) { create_balloon(peep->x, peep->y, peep->z + 9, peep->balloon_colour, bl); } @@ -1124,19 +1132,21 @@ void peep_update_sprite_type(rct_peep* peep){ peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; } - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8) != 0 && - peep->item_standard_flags & PEEP_ITEM_UMBRELLA && - peep->x != SPRITE_LOCATION_NULL){ + if ( + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8) != 0 && + (peep->item_standard_flags & PEEP_ITEM_UMBRELLA) && + peep->x != SPRITE_LOCATION_NULL + ) { int x = peep->x & 0xFFE0; int y = peep->y & 0xFFE0; - if (x < 0x1FFF && y < 0x1FFF){ + if (x < 0x1FFF && y < 0x1FFF) { rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); while (1) { - if ((peep->z / 32) < map_element->base_height)break; + if ((peep->z / 8) < map_element->base_height) break; - if (map_element_is_last_for_tile(map_element)){ - set_sprite_type(peep, 21); + if (map_element_is_last_for_tile(map_element)) { + set_sprite_type(peep, PEEP_SPRITE_TYPE_UMBRELLA); return; } map_element++; @@ -1144,55 +1154,51 @@ void peep_update_sprite_type(rct_peep* peep){ } } - for (item_pref* item_pref = item_order_preference; item_pref->type != 0xFF; item_pref++){ + for (item_pref* item_pref = item_order_preference; item_pref->type != 0xFF; item_pref++) { if (item_pref->type == 0){ - if (peep->item_standard_flags & item_pref->item){ + if (peep->item_standard_flags & item_pref->item) { set_sprite_type(peep, item_pref->sprite_type); return; } - } - else{ - if (peep->item_extra_flags & item_pref->item){ + } else { + if (peep->item_extra_flags & item_pref->item) { set_sprite_type(peep, item_pref->sprite_type); return; } } } - if (peep->state == PEEP_STATE_WATCHING && - peep->standing_flags & (1<<1)){ - set_sprite_type(peep, 38); + if (peep->state == PEEP_STATE_WATCHING && peep->standing_flags & (1 << 1)) { + set_sprite_type(peep, PEEP_SPRITE_TYPE_WATCHING); return; } - if (peep->nausea > 170){ - set_sprite_type(peep, 28); + if (peep->nausea > 170) { + set_sprite_type(peep, PEEP_SPRITE_TYPE_VERY_NAUSEOUS); return; } - if (peep->nausea > 140){ - set_sprite_type(peep, 27); + if (peep->nausea > 140) { + set_sprite_type(peep, PEEP_SPRITE_TYPE_NAUSEOUS); return; } - if (peep->energy <= 64 && - peep->happiness < 128){ - set_sprite_type(peep, 26); + if (peep->energy <= 64 && peep->happiness < 128) { + set_sprite_type(peep, PEEP_SPRITE_TYPE_26); return; } - if (peep->energy <= 80 && - peep->happiness < 128){ - set_sprite_type(peep, 25); + if (peep->energy <= 80 && peep->happiness < 128) { + set_sprite_type(peep, PEEP_SPRITE_TYPE_25); return; } - if (peep->bathroom > 220){ - set_sprite_type(peep, 29); + if (peep->bathroom > 220) { + set_sprite_type(peep, PEEP_SPRITE_TYPE_REQUIRE_BATHROOM); return; } - set_sprite_type(peep, 0); + set_sprite_type(peep, PEEP_SPRITE_TYPE_NORMAL); } /** @@ -5296,7 +5302,7 @@ rct_peep *peep_generate(int x, int y, int z) move_sprite_to_list((rct_sprite*)peep, SPRITE_LINKEDLIST_OFFSET_PEEP); peep->sprite_identifier = 1; - peep->sprite_type = 0; + peep->sprite_type = PEEP_SPRITE_TYPE_NORMAL; peep->var_2A = 1; peep->state = PEEP_STATE_FALLING; peep->action = PEEP_ACTION_NONE_2; diff --git a/src/peep/peep.h b/src/peep/peep.h index e50be6e520..7ceba2fad6 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -342,6 +342,20 @@ enum PEEP_ITEM { PEEP_ITEM_EMPTY_BOWL_BLUE = (1 << 21) }; +enum { + PEEP_SPRITE_TYPE_NORMAL = 0, + PEEP_SPRITE_TYPE_3 = 3, + PEEP_SPRITE_TYPE_19 = 19, + PEEP_SPRITE_TYPE_UMBRELLA = 21, + PEEP_SPRITE_TYPE_23 = 23, + PEEP_SPRITE_TYPE_25 = 25, + PEEP_SPRITE_TYPE_26 = 26, + PEEP_SPRITE_TYPE_NAUSEOUS = 27, + PEEP_SPRITE_TYPE_VERY_NAUSEOUS = 28, + PEEP_SPRITE_TYPE_REQUIRE_BATHROOM = 29, + PEEP_SPRITE_TYPE_WATCHING = 38 +}; + // Flags used by peep->window_invalidate_flags enum { PEEP_INVALIDATE_PEEP_THOUGHTS = 1, From 7228e427683c0cdfc64eb5071fb7d3190cadf944 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 5 Sep 2015 13:59:12 +0100 Subject: [PATCH 0638/1173] implement litter_remove_at --- src/peep/peep.c | 2 +- src/world/sprite.c | 25 +++++++++++++++++++++++-- src/world/sprite.h | 2 +- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index b908caeaff..f0d66667cc 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -3556,7 +3556,7 @@ static void peep_update_sweeping(rct_peep* peep){ if (peep->action == PEEP_ACTION_STAFF_SWEEP && peep->action_frame == 8){ // Remove sick at this location - sub_6738E1(peep->x, peep->y, peep->z); + litter_remove_at(peep->x, peep->y, peep->z); peep->staff_litter_swept++; peep->window_invalidate_flags |= PEEP_INVALIDATE_STAFF_STATS; } diff --git a/src/world/sprite.c b/src/world/sprite.c index 86dfcc89fe..f195f2adda 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -29,6 +29,12 @@ rct_sprite* g_sprite_list = RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite); +static uint16 sprite_get_first_in_quadrant(int x, int y) +{ + int offset = ((x & 0x1FE0) << 3) | (y >> 5); + return RCT2_ADDRESS(0x00F1EF60, uint16)[offset]; +} + static void invalidate_sprite_max_zoom(rct_sprite *sprite, int maxZoom) { if (sprite->unknown.sprite_left == (sint16)0x8000) return; @@ -576,7 +582,22 @@ void litter_create(int x, int y, int z, int direction, int type) * * rct2: 0x006738E1 */ -void sub_6738E1(int x, int y, int z) +void litter_remove_at(int x, int y, int z) { - RCT2_CALLPROC_X(0x006738E1, x, 0, y, z, 0, 0, 0); + uint16 spriteIndex = sprite_get_first_in_quadrant(x, y); + while (spriteIndex != SPRITE_INDEX_NULL) { + rct_sprite *sprite = &g_sprite_list[spriteIndex]; + uint16 nextSpriteIndex = sprite->unknown.next_in_quadrant; + if (sprite->unknown.linked_list_type_offset == SPRITE_LINKEDLIST_OFFSET_LITTER) { + rct_litter *litter = &sprite->litter; + + if (abs(litter->z - z) <= 16) { + if (abs(litter->x - x) <= 8 && abs(litter->y - y) <= 8) { + invalidate_sprite_0(sprite); + sprite_remove(sprite); + } + } + } + spriteIndex = nextSpriteIndex; + } } diff --git a/src/world/sprite.h b/src/world/sprite.h index b3eb9051de..aac3084c94 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -328,7 +328,7 @@ void invalidate_sprite_1(rct_sprite *sprite); void invalidate_sprite_2(rct_sprite *sprite); void sprite_remove(rct_sprite *sprite); void litter_create(int x, int y, int z, int direction, int type); -void sub_6738E1(int x, int y, int z); +void litter_remove_at(int x, int y, int z); void sprite_misc_3_create(int x, int y, int z); void sprite_misc_5_create(int x, int y, int z); From 6901c04f24aa818115a9f414bb95b4ad3447e346 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 5 Sep 2015 18:21:36 +0100 Subject: [PATCH 0639/1173] implement track_save_add_map_element and track_save_remove_map_element --- src/ride/track.c | 391 ++++++++++++++++++++++++++++++++++++++++++++++- src/world/map.h | 6 + 2 files changed, 395 insertions(+), 2 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index 83781183da..8d4ff9ff42 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -239,6 +239,8 @@ const rct_trackdefinition gTrackDefinitions_INCORRECT[] = { { TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_LEFT_LARGE_HALF_LOOP_DOWN }; +#define TRACK_MAX_SAVED_MAP_ELEMENTS 1500 + rct_map_element **gTrackSavedMapElements = (rct_map_element**)0x00F63674; static bool track_save_should_select_scenery_around(int rideIndex, rct_map_element *mapElement); @@ -3351,13 +3353,385 @@ static bool track_save_contains_map_element(rct_map_element *mapElement) return false; } +static int map_element_get_total_element_count(rct_map_element *mapElement) +{ + int elementCount; + rct_scenery_entry *sceneryEntry; + rct_large_scenery_tile *tile; + + switch (map_element_get_type(mapElement)) { + case MAP_ELEMENT_TYPE_PATH: + case MAP_ELEMENT_TYPE_SCENERY: + case MAP_ELEMENT_TYPE_FENCE: + return 1; + + case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: + sceneryEntry = g_largeSceneryEntries[mapElement->properties.scenerymultiple.type & 0x3FF]; + tile = sceneryEntry->large_scenery.tiles; + elementCount = 0; + do { + tile++; + elementCount++; + } while (tile->x_offset != (sint16)0xFFFF); + return elementCount; + + default: + return 0; + } +} + +static bool track_scenery_is_null(rct_track_scenery *trackScenery) +{ + return *((uint8*)trackScenery) == 0xFF; +} + +static void track_scenery_set_to_null(rct_track_scenery *trackScenery) +{ + *((uint8*)trackScenery) = 0xFF; +} + +static rct_map_element **track_get_next_spare_saved_map_element() +{ + rct_map_element **savedMapElement = gTrackSavedMapElements; + while (*savedMapElement != (rct_map_element*)0xFFFFFFFF) { + savedMapElement++; + } + return savedMapElement; +} + +/** + * + * rct2: 0x006D2ED2 + */ +static bool track_save_can_add_map_element(rct_map_element *mapElement) +{ + int newElementCount = map_element_get_total_element_count(mapElement); + if (newElementCount == 0) { + return false; + } + + // Get number of saved elements so far + rct_map_element **savedMapElement = track_get_next_spare_saved_map_element(); + + // Get number of spare elements left + int numSavedElements = savedMapElement - gTrackSavedMapElements; + int spareSavedElements = TRACK_MAX_SAVED_MAP_ELEMENTS - numSavedElements; + if (newElementCount > spareSavedElements) { + // No more spare saved elements left + return false; + } + + // Probably checking for spare elements in the TD6 struct + rct_track_scenery *trackScenery = (rct_track_scenery*)0x009DA193; + while (!track_scenery_is_null(trackScenery)) { trackScenery++; } + if (trackScenery >= (rct_track_scenery*)0x9DE207) { + return false; + } + + return true; +} + +/** + * + * rct2: 0x006D2F4C + */ +static void track_save_push_map_element(int x, int y, rct_map_element *mapElement) +{ + rct_map_element **savedMapElement; + + map_invalidate_tile_full(x, y); + savedMapElement = track_get_next_spare_saved_map_element(); + *savedMapElement = mapElement; + *(savedMapElement + 1) = (rct_map_element*)0xFFFFFFFF; +} + +/** + * + * rct2: 0x006D2FA7 + */ +static void track_save_push_map_element_desc(rct_object_entry *entry, int x, int y, int z, uint8 flags, uint8 primaryColour, uint8 secondaryColour) +{ + rct_track_scenery *item = (rct_track_scenery*)0x009DA193; + while (!track_scenery_is_null(item)) { item++; } + + item->scenery_object = *entry; + item->x = x / 32; + item->y = y / 32; + item->z = z; + item->flags = flags; + item->primary_colour = primaryColour; + item->secondary_colour = secondaryColour; + + track_scenery_set_to_null(item + 1); +} + +static void track_save_add_scenery(int x, int y, rct_map_element *mapElement) +{ + int entryType = mapElement->properties.scenery.type; + rct_object_entry *entry = (rct_object_entry*)&object_entry_groups[OBJECT_TYPE_SMALL_SCENERY].entries[entryType]; + + uint8 flags = 0; + flags |= mapElement->type & 3; + flags |= (mapElement->type & 0xC0) >> 4; + + uint8 primaryColour = mapElement->properties.scenery.colour_1 & 0x1F; + uint8 secondaryColour = mapElement->properties.scenery.colour_2 & 0x1F; + + track_save_push_map_element(x, y, mapElement); + track_save_push_map_element_desc(entry, x, y, mapElement->base_height, flags, primaryColour, secondaryColour); +} + +static void track_save_add_large_scenery(int x, int y, rct_map_element *mapElement) +{ + rct_large_scenery_tile *sceneryTiles, *tile; + int x0, y0, z0, z; + int direction, sequence; + + int entryType = mapElement->properties.scenerymultiple.type & 0x3FF; + rct_object_entry *entry = (rct_object_entry*)&object_entry_groups[OBJECT_TYPE_LARGE_SCENERY].entries[entryType]; + sceneryTiles = g_largeSceneryEntries[entryType]->large_scenery.tiles; + + z = mapElement->base_height; + direction = mapElement->type & 3; + sequence = mapElement->properties.scenerymultiple.type >> 10; + + if (!map_large_scenery_get_origin(x, y, z, direction, sequence, &x0, &y0, &z0)) { + return; + } + + // Iterate through each tile of the large scenery element + sequence = 0; + for (tile = sceneryTiles; tile->x_offset != -1; tile++, sequence++) { + sint16 offsetX = tile->x_offset; + sint16 offsetY = tile->y_offset; + rotate_map_coordinates(&offsetX, &offsetY, direction); + + x = x0 + offsetX; + y = y0 + offsetY; + z = (z0 + tile->z_offset) / 8; + mapElement = map_get_large_scenery_segment(x, y, z, direction, sequence); + if (mapElement != NULL) { + if (sequence == 0) { + uint8 flags = mapElement->type & 3; + uint8 primaryColour = mapElement->properties.scenerymultiple.colour[0] & 0x1F; + uint8 secondaryColour = mapElement->properties.scenerymultiple.colour[1] & 0x1F; + + track_save_push_map_element_desc(entry, x, y, z, flags, primaryColour, secondaryColour); + } + track_save_push_map_element(x, y, mapElement); + } + } +} + +static void track_save_add_wall(int x, int y, rct_map_element *mapElement) +{ + int entryType = mapElement->properties.fence.type; + rct_object_entry *entry = (rct_object_entry*)&object_entry_groups[OBJECT_TYPE_WALLS].entries[entryType]; + + uint8 flags = 0; + flags |= mapElement->type & 3; + flags |= mapElement->properties.fence.item[0] << 2; + + uint8 secondaryColour = ((mapElement->flags & 0x60) >> 2) | (mapElement->properties.fence.item[1] >> 5); + uint8 primaryColour = mapElement->properties.fence.item[1] & 0x1F; + + track_save_push_map_element(x, y, mapElement); + track_save_push_map_element_desc(entry, x, y, mapElement->base_height, flags, primaryColour, secondaryColour); +} + +static void track_save_add_footpath(int x, int y, rct_map_element *mapElement) +{ + int entryType = mapElement->properties.path.type >> 4; + rct_object_entry *entry = (rct_object_entry*)&object_entry_groups[OBJECT_TYPE_PATHS].entries[entryType]; + + uint8 flags = 0; + flags |= mapElement->properties.path.edges & 0x0F; + flags |= (mapElement->properties.path.type & 4) << 2; + flags |= (mapElement->properties.path.type & 3) << 5; + flags |= (mapElement->type & 1) << 7; + + track_save_push_map_element(x, y, mapElement); + track_save_push_map_element_desc(entry, x, y, mapElement->base_height, flags, 0, 0); +} + /** * * rct2: 0x006D2B3C */ static bool track_save_add_map_element(int interactionType, int x, int y, rct_map_element *mapElement) { - return !(RCT2_CALLPROC_X(0x006D2B3C, x, interactionType | (0 << 8), y, (int)mapElement, 0, 0, 0) & 0x100); + if (!track_save_can_add_map_element(mapElement)) { + return false; + } + + switch (interactionType) { + case VIEWPORT_INTERACTION_ITEM_SCENERY: + track_save_add_scenery(x, y, mapElement); + return true; + case VIEWPORT_INTERACTION_ITEM_LARGE_SCENERY: + track_save_add_large_scenery(x, y, mapElement); + return true; + case VIEWPORT_INTERACTION_ITEM_WALL: + track_save_add_wall(x, y, mapElement); + return true; + case VIEWPORT_INTERACTION_ITEM_FOOTPATH: + track_save_add_footpath(x, y, mapElement); + return true; + default: + return false; + } +} + +/** + * + * rct2: 0x006D2F78 + */ +static void track_save_pop_map_element(int x, int y, rct_map_element *mapElement) +{ + map_invalidate_tile_full(x, y); + + // Find map element and total of saved elements + int removeIndex = -1; + int numSavedElements = 0; + rct_map_element **savedMapElement = gTrackSavedMapElements; + while (*savedMapElement != (rct_map_element*)0xFFFFFFFF) { + if (*savedMapElement == mapElement) { + removeIndex = numSavedElements; + } + savedMapElement++; + numSavedElements++; + } + + if (removeIndex == -1) { + return; + } + + // Remove item and shift rest up one item + if (removeIndex < numSavedElements - 1) { + memmove(&gTrackSavedMapElements[removeIndex], &gTrackSavedMapElements[removeIndex + 1], (numSavedElements - removeIndex - 1) * sizeof(rct_map_element*)); + } + gTrackSavedMapElements[numSavedElements - 1] = (rct_map_element*)0xFFFFFFFF; +} + +/** + * + * rct2: 0x006D2FDD + */ +static void track_save_pop_map_element_desc(rct_object_entry *entry, int x, int y, int z, uint8 flags, uint8 primaryColour, uint8 secondaryColour) +{ + int removeIndex = -1; + int totalItems = 0; + + rct_track_scenery *items = (rct_track_scenery*)0x009DA193; + rct_track_scenery *item = items; + for (; !track_scenery_is_null(item); item++, totalItems++) { + if (item->x != x / 32) continue; + if (item->y != y / 32) continue; + if (item->z != z) continue; + if (item->flags != flags) continue; + if (!object_entry_compare(&item->scenery_object, entry)) continue; + + removeIndex = totalItems; + } + + if (removeIndex == -1) { + return; + } + + // Remove item and shift rest up one item + if (removeIndex < totalItems - 1) { + memmove(&items[removeIndex], &items[removeIndex + 1], (totalItems - removeIndex - 1) * sizeof(rct_track_scenery)); + } + track_scenery_set_to_null(&items[totalItems - 1]); +} + +static void track_save_remove_scenery(int x, int y, rct_map_element *mapElement) +{ + int entryType = mapElement->properties.scenery.type; + rct_object_entry *entry = (rct_object_entry*)&object_entry_groups[OBJECT_TYPE_SMALL_SCENERY].entries[entryType]; + + uint8 flags = 0; + flags |= mapElement->type & 3; + flags |= (mapElement->type & 0xC0) >> 4; + + uint8 primaryColour = mapElement->properties.scenery.colour_1 & 0x1F; + uint8 secondaryColour = mapElement->properties.scenery.colour_2 & 0x1F; + + track_save_pop_map_element(x, y, mapElement); + track_save_pop_map_element_desc(entry, x, y, mapElement->base_height, flags, primaryColour, secondaryColour); +} + +static void track_save_remove_large_scenery(int x, int y, rct_map_element *mapElement) +{ + rct_large_scenery_tile *sceneryTiles, *tile; + int x0, y0, z0, z; + int direction, sequence; + + int entryType = mapElement->properties.scenerymultiple.type & 0x3FF; + rct_object_entry *entry = (rct_object_entry*)&object_entry_groups[OBJECT_TYPE_LARGE_SCENERY].entries[entryType]; + sceneryTiles = g_largeSceneryEntries[entryType]->large_scenery.tiles; + + z = mapElement->base_height; + direction = mapElement->type & 3; + sequence = mapElement->properties.scenerymultiple.type >> 10; + + if (!map_large_scenery_get_origin(x, y, z, direction, sequence, &x0, &y0, &z0)) { + return; + } + + // Iterate through each tile of the large scenery element + sequence = 0; + for (tile = sceneryTiles; tile->x_offset != -1; tile++, sequence++) { + sint16 offsetX = tile->x_offset; + sint16 offsetY = tile->y_offset; + rotate_map_coordinates(&offsetX, &offsetY, direction); + + x = x0 + offsetX; + y = y0 + offsetY; + z = (z0 + tile->z_offset) / 8; + mapElement = map_get_large_scenery_segment(x, y, z, direction, sequence); + if (mapElement != NULL) { + if (sequence == 0) { + uint8 flags = mapElement->type & 3; + uint8 primaryColour = mapElement->properties.scenerymultiple.colour[0] & 0x1F; + uint8 secondaryColour = mapElement->properties.scenerymultiple.colour[1] & 0x1F; + + track_save_pop_map_element_desc(entry, x, y, z, flags, primaryColour, secondaryColour); + } + track_save_pop_map_element(x, y, mapElement); + } + } +} + +static void track_save_remove_wall(int x, int y, rct_map_element *mapElement) +{ + int entryType = mapElement->properties.fence.type; + rct_object_entry *entry = (rct_object_entry*)&object_entry_groups[OBJECT_TYPE_WALLS].entries[entryType]; + + uint8 flags = 0; + flags |= mapElement->type & 3; + flags |= mapElement->properties.fence.item[0] << 2; + + uint8 secondaryColour = ((mapElement->flags & 0x60) >> 2) | (mapElement->properties.fence.item[1] >> 5); + uint8 primaryColour = mapElement->properties.fence.item[1] & 0x1F; + + track_save_pop_map_element(x, y, mapElement); + track_save_pop_map_element_desc(entry, x, y, mapElement->base_height, flags, primaryColour, secondaryColour); +} + +static void track_save_remove_footpath(int x, int y, rct_map_element *mapElement) +{ + int entryType = mapElement->properties.path.type >> 4; + rct_object_entry *entry = (rct_object_entry*)&object_entry_groups[OBJECT_TYPE_PATHS].entries[entryType]; + + uint8 flags = 0; + flags |= mapElement->properties.path.edges & 0x0F; + flags |= (mapElement->properties.path.type & 4) << 2; + flags |= (mapElement->properties.path.type & 3) << 5; + flags |= (mapElement->type & 1) << 7; + + track_save_pop_map_element(x, y, mapElement); + track_save_pop_map_element_desc(entry, x, y, mapElement->base_height, flags, 0, 0); } /** @@ -3366,7 +3740,20 @@ static bool track_save_add_map_element(int interactionType, int x, int y, rct_ma */ static void track_save_remove_map_element(int interactionType, int x, int y, rct_map_element *mapElement) { - RCT2_CALLPROC_X(0x006D2B3C, x, interactionType | (1 << 8), y, (int)mapElement, 0, 0, 0); + switch (interactionType) { + case VIEWPORT_INTERACTION_ITEM_SCENERY: + track_save_remove_scenery(x, y, mapElement); + break; + case VIEWPORT_INTERACTION_ITEM_LARGE_SCENERY: + track_save_remove_large_scenery(x, y, mapElement); + break; + case VIEWPORT_INTERACTION_ITEM_WALL: + track_save_remove_wall(x, y, mapElement); + break; + case VIEWPORT_INTERACTION_ITEM_FOOTPATH: + track_save_remove_footpath(x, y, mapElement); + break; + } } /** diff --git a/src/world/map.h b/src/world/map.h index 1f82f1fb98..ac774809a2 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -372,4 +372,10 @@ int map_get_tile_quadrant(int mapX, int mapY); void map_clear_all_elements(); +rct_map_element *map_get_large_scenery_segment(int x, int y, int z, int direction, int sequence); +bool map_large_scenery_get_origin( + int x, int y, int z, int direction, int sequence, + int *outX, int *outY, int *outZ +); + #endif From 85181b5ed3f5cfbfcfa56c18eed31e7c80dae061 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 5 Sep 2015 18:46:13 +0100 Subject: [PATCH 0640/1173] add stay_connected config option --- src/config.c | 1 + src/config.h | 1 + src/network/network.cpp | 12 ++++++++++-- src/network/network.h | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 152cfb0cdc..20f6ae2b7b 100644 --- a/src/config.c +++ b/src/config.c @@ -238,6 +238,7 @@ config_property_definition _twitchDefinitions[] = { config_property_definition _networkDefinitions[] = { { offsetof(network_configuration, player_name), "player_name", CONFIG_VALUE_TYPE_STRING, {.value_string = "Player" }, NULL }, { offsetof(network_configuration, default_port), "default_port", CONFIG_VALUE_TYPE_UINT32, NETWORK_DEFAULT_PORT, NULL }, + { offsetof(network_configuration, stay_connected), "stay_connected", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, }; config_section_definition _sectionDefinitions[] = { diff --git a/src/config.h b/src/config.h index 87ea0e48ba..660902b46f 100644 --- a/src/config.h +++ b/src/config.h @@ -212,6 +212,7 @@ typedef struct { typedef struct { utf8string player_name; uint32 default_port; + uint8 stay_connected; } network_configuration; typedef struct theme_window { diff --git a/src/network/network.cpp b/src/network/network.cpp index 47532eb651..304e286999 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -298,6 +298,8 @@ void Network::Close() WSACleanup(); wsa_initialized = false; } + + gfx_invalidate_screen(); } bool Network::BeginClient(const char* host, unsigned short port) @@ -467,9 +469,14 @@ void Network::UpdateClient() Close(); } ProcessGameCommandQueue(); - if (!CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { + + // Check synchronisation + if (!_desynchronised && !CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { + _desynchronised = true; window_network_status_open("Network desync detected"); - Close(); + if (!gConfigNetwork.stay_connected) { + Close(); + } } } @@ -834,6 +841,7 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac server_tick = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); server_srand0_tick = 0; // window_network_status_open("Loaded new map from network"); + _desynchronised = false; } SDL_RWclose(rw); } diff --git a/src/network/network.h b/src/network/network.h index c7dcdeca50..a5de8b6f99 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -194,6 +194,7 @@ private: std::multiset game_command_queue; std::vector chunk_buffer; char password[33]; + bool _desynchronised; void UpdateServer(); void UpdateClient(); From c3fbdf78c0ae926bf16a04d942f637c968ee9f32 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 5 Sep 2015 19:32:01 +0100 Subject: [PATCH 0641/1173] fix writing null terminators in config file --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 20f6ae2b7b..cd6219d53d 100644 --- a/src/config.c +++ b/src/config.c @@ -294,7 +294,7 @@ static void rwopsprintf(SDL_RWops *file, const char *format, ...) char buffer[64]; vsprintf(buffer, format, args); - SDL_RWwrite(file, buffer, strlen(buffer) + 1, 1); + SDL_RWwrite(file, buffer, strlen(buffer), 1); va_end(args); } From 8c44ddac176c753fb3ce19fa79caba3689f7506e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 5 Sep 2015 20:06:58 +0100 Subject: [PATCH 0642/1173] fix 2nd problem of #1848 --- src/scenario.c | 2 +- src/windows/loadsave.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/scenario.c b/src/scenario.c index 82baeddefb..0a8ddebea0 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -45,7 +45,7 @@ #include "world/water.h" static char _scenarioPath[MAX_PATH]; -static const char *_scenarioFileName; +static const char *_scenarioFileName = ""; char gScenarioSaveName[MAX_PATH]; int gFirstTimeSave = 1; diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index a164f8af22..f6930b2ad9 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -801,6 +801,7 @@ static void window_loadsave_select(rct_window *w, const char *path) case (LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE) : rw = SDL_RWFromFile(path, "wb+"); if (rw != NULL) { + scenario_set_filename(path); int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); SDL_RWclose(rw); if (success) { @@ -822,6 +823,7 @@ static void window_loadsave_select(rct_window *w, const char *path) rw = SDL_RWFromFile(path, "wb+"); int success = 0; if (rw != NULL) { + scenario_set_filename(path); success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); SDL_RWclose(rw); } From ed824d36b0b0627e5ff29df3b6ff50ba373362fb Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 5 Sep 2015 20:34:56 +0100 Subject: [PATCH 0643/1173] refactor two CALLPROC functions in track.c --- src/ride/track.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index 8d4ff9ff42..73e5cfde9e 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3874,6 +3874,15 @@ const rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackT return get_track_def_from_ride(GET_RIDE(rideIndex), trackType); } +/** + * + * rct2: 0x006C4D89 + */ +static bool sub_6C4D89(int x, int y, int z, int direction, int rideIndex, int flags) +{ + return !(RCT2_CALLPROC_X(0x006C4D89, x, flags | (rideIndex << 8), y, z | (direction << 8), 0, 0, 0) & 0x100); +} + static money32 track_place(int rideIndex, int type, int originX, int originY, int originZ, int direction, int properties_1, int properties_2, int properties_3, int edx_flags, int flags) { rct_ride *ride = GET_RIDE(rideIndex); @@ -4145,7 +4154,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in entranceDirections = RCT2_ADDRESS(0x0099BA64, uint8)[type * 16]; } if ((entranceDirections & 0x10) && trackBlock->index == 0) { - if (RCT2_CALLPROC_X(0x006C4D89, x, rideIndex << 8, y, baseZ | (direction << 8), 0, 0, 0) & 0x100) { + if (!sub_6C4D89(x, y, baseZ, direction, rideIndex, 0)) { return MONEY32_UNDEFINED; } } @@ -4299,14 +4308,9 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in entranceDirections = RCT2_ADDRESS(0x0099BA64, uint8)[type * 16]; } - if (entranceDirections & (1 << 4)){ - if (trackBlock->index == 0){ - RCT2_CALLPROC_X(0x006C4D89, - x, - (rideIndex << 8) | GAME_COMMAND_FLAG_APPLY, - y, - baseZ | (direction << 8), - 0, 0, 0); + if (entranceDirections & (1 << 4)) { + if (trackBlock->index == 0) { + sub_6C4D89(x, y, baseZ, direction, rideIndex, GAME_COMMAND_FLAG_APPLY); } sub_6CB945(rideIndex); ride_update_max_vehicles(rideIndex); @@ -4361,6 +4365,15 @@ void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, ); } +/** + * + * rct2: 0x006C494B + */ +static bool sub_6C494B(int x, int y, int z, int direction, int rideIndex, int flags) +{ + return !(RCT2_CALLPROC_X(0x006C494B, x, flags | (rideIndex << 8), y, z | (direction << 8), 0, 0, 0) & 0x100); +} + money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, sint16 originZ, uint8 rotation, uint8 flags){ RCT2_GLOBAL(0x00141F56C, uint8) = 0; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, sint16) = originX + 16; @@ -4520,7 +4533,7 @@ money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, } if (entranceDirections & (1 << 4) && ((mapElement->properties.track.sequence & 0xF) == 0)){ - if (RCT2_CALLPROC_X(0x006C494B, x, (rideIndex << 8), y, (z / 8) | (rotation << 8), 0, 0, 0) & 0x100){ + if (!sub_6C494B(x, y, z / 8, rotation, rideIndex, 0)) { return MONEY32_UNDEFINED; } } @@ -4541,7 +4554,7 @@ money32 track_remove(uint8 type, uint8 sequence, sint16 originX, sint16 originY, continue; if (entranceDirections & (1 << 4) && ((mapElement->properties.track.sequence & 0xF) == 0)){ - if (RCT2_CALLPROC_X(0x006C494B, x, GAME_COMMAND_FLAG_APPLY | (rideIndex << 8), y, (z / 8) | (rotation << 8), 0, 0, 0) & 0x100){ + if (!sub_6C494B(x, y, z / 8, rotation, rideIndex, GAME_COMMAND_FLAG_APPLY)) { return MONEY32_UNDEFINED; } } From 2753af893b630f6271ec9ce6e0054ea2f369c1c6 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 6 Sep 2015 13:37:00 +0100 Subject: [PATCH 0644/1173] implement map_obstruction_set_error_text --- src/localisation/string_ids.h | 8 ++++- src/ride/ride_ratings.c | 2 +- src/world/map.c | 61 +++++++++++++++++++++++++++++++++-- 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 069b38fc65..261fbaa8ad 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -109,6 +109,7 @@ enum { STR_TOO_HIGH = 878, STR_CANT_LOWER_LAND_HERE = 879, STR_CANT_RAISE_LAND_HERE = 880, + STR_OBJECT_IN_THE_WAY = 881, STR_LOAD_GAME = 882, STR_SAVE_GAME = 883, @@ -164,7 +165,10 @@ enum { STR_S_BEND_RIGHT = 930, STR_VERTICAL_LOOP_LEFT = 931, STR_VERTICAL_LOOP_RIGHT = 932, - + STR_RAISE_OR_LOWER_LAND_FIRST = 933, + STR_RIDE_ENTRANCE_IN_THE_WAY = 934, + STR_RIDE_EXIT_IN_THE_WAY = 935, + STR_PARK_ENTRANCE_IN_THE_WAY = 936, STR_VIEW_OPTIONS_TIP = 937, STR_ADJUST_LAND_TIP = 938, STR_UNDERGROUND_VIEW = 939, @@ -414,6 +418,7 @@ enum { STR_CANT_BUILD_FOOTPATH_HERE = 1176, STR_CANT_REMOVE_FOOTPATH_FROM_HERE = 1177, STR_LAND_SLOPE_UNSUITABLE = 1178, + STR_FOOTPATH_IN_THE_WAY = 1179, STR_CANT_BUILD_THIS_UNDERWATER = 1180, STR_FOOTPATHS = 1181, @@ -540,6 +545,7 @@ enum { STR_ENTRY_EXIT_PLATFORM = 1409, STR_VERTICAL_TOWER = 1410, + STR_X_IN_THE_WAY = 1411, STR_DATA_LOGGING_NOT_AVAILABLE_FOR_THIS_TYPE_OF_RIDE = 1412, STR_DATA_LOGGING_WILL_START_WHEN_NEXT_LEAVES = 1413, diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index e7f9efd8fc..6e087f9d15 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -625,7 +625,7 @@ static void ride_ratings_calculate(rct_ride *ride) // Original ride calculation // calcFunc = RCT2_ADDRESS(0x0097E050, ride_ratings_calculation)[ride->type]; - // RCT2_CALLPROC_X((int)calcFunc, 0, 0, 0, 0, 0, (int)ride, 0); + // RCT2 CALLPROC X((int)calcFunc, 0, 0, 0, 0, 0, (int)ride, 0); } static void ride_ratings_calculate_value(rct_ride *ride) diff --git a/src/world/map.c b/src/world/map.c index 56e8d19352..aa4e621636 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3181,13 +3181,70 @@ rct_map_element *map_element_insert(int x, int y, int z, int flags) return insertedElement; } +/** + * + * rct2: 0x0068BB18 + */ +static void map_obstruction_set_error_text(rct_map_element *mapElement) +{ + rct_string_id errorStringId; + rct_ride *ride; + rct_scenery_entry *sceneryEntry; + + errorStringId = STR_OBJECT_IN_THE_WAY; + switch (map_element_get_type(mapElement)) { + case MAP_ELEMENT_TYPE_SURFACE: + errorStringId = STR_RAISE_OR_LOWER_LAND_FIRST; + break; + case MAP_ELEMENT_TYPE_PATH: + errorStringId = STR_FOOTPATH_IN_THE_WAY; + break; + case MAP_ELEMENT_TYPE_TRACK: + ride = GET_RIDE(mapElement->properties.track.ride_index); + errorStringId = STR_X_IN_THE_WAY; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = ride->name; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 2, uint32) = ride->name_arguments; + break; + case MAP_ELEMENT_TYPE_SCENERY: + sceneryEntry = g_smallSceneryEntries[mapElement->properties.scenery.type]; + errorStringId = STR_X_IN_THE_WAY; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = sceneryEntry->name; + break; + case MAP_ELEMENT_TYPE_ENTRANCE: + switch (mapElement->properties.entrance.type) { + case ENTRANCE_TYPE_RIDE_ENTRANCE: + errorStringId = STR_RIDE_ENTRANCE_IN_THE_WAY; + break; + case ENTRANCE_TYPE_RIDE_EXIT: + errorStringId = STR_RIDE_EXIT_IN_THE_WAY; + break; + case ENTRANCE_TYPE_PARK_ENTRANCE: + errorStringId = STR_PARK_ENTRANCE_IN_THE_WAY; + break; + } + break; + case MAP_ELEMENT_TYPE_FENCE: + sceneryEntry = g_wallSceneryEntries[mapElement->properties.scenery.type]; + errorStringId = STR_X_IN_THE_WAY; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = sceneryEntry->name; + break; + case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: + sceneryEntry = g_largeSceneryEntries[mapElement->properties.scenery.type]; + errorStringId = STR_X_IN_THE_WAY; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = sceneryEntry->name; + break; + } + + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = errorStringId; +} + /** * * rct2: 0x0068B932 */ int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *clearFunc, uint8 bl) { - //return (RCT2_CALLPROC_X(0x0068B932, x, bl, y, (zHigh << 8) | zLow, 0, 0, (int)clearFunc) & 0x100) == 0; + // return (RCT2 CALLPROC X(0x0068B932, x, bl, y, (zHigh << 8) | zLow, 0, 0, (int)clearFunc) & 0x100) == 0; RCT2_GLOBAL(0x00F1AD40, void*) = clearFunc; RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) = 1; if (x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16) || y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16) || x < 32 || y < 32) { @@ -3267,7 +3324,7 @@ int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *cle } } if (map_element != (rct_map_element*)0xFFFFFFF) { - RCT2_CALLPROC_X(0x0068BB18, 0, 0, 0, 0, (int)map_element, 0, 0); + map_obstruction_set_error_text(map_element); } return false; loc_68BAE6: From efada641a55ede14d59c4ceb4a965ce76a8e51a4 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 6 Sep 2015 17:36:55 +0100 Subject: [PATCH 0645/1173] implement map_place_fence_check_obstruction --- src/peep/peep.c | 2 +- src/world/map.c | 186 ++++++++++++++++++++++++++++++++++++++++---- src/world/scenery.h | 2 +- 3 files changed, 175 insertions(+), 15 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index f0d66667cc..2c87a5f3c7 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7891,7 +7891,7 @@ static void peep_reset_ride_heading(rct_peep *peep) */ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) { - // return RCT2_CALLPROC_X(0x006960AB, 0, 0, 0, rideIndex | (dh << 8), (int)peep, 0, bp) & 0x100; + // return RCT2 CALLPROC X(0x006960AB, 0, 0, 0, rideIndex | (dh << 8), (int)peep, 0, bp) & 0x100; rct_ride *ride = GET_RIDE(rideIndex); rct_ride_type *rideEntry; diff --git a/src/world/map.c b/src/world/map.c index aa4e621636..cf484cabd1 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -28,6 +28,9 @@ #include "../localisation/date.h" #include "../localisation/localisation.h" #include "../management/finance.h" +#include "../openrct2.h" +#include "../ride/track.h" +#include "../ride/track_data.h" #include "../scenario.h" #include "banner.h" #include "climate.h" @@ -36,7 +39,6 @@ #include "map_animation.h" #include "park.h" #include "scenery.h" -#include "../openrct2.h" /* Replaces 0x00993CCC & 0x00993CCE */ const rct_xy16 TileDirectionDelta[] = { @@ -67,6 +69,7 @@ static void map_update_grass_length(int x, int y, rct_map_element *mapElement); static void map_set_grass_length(int x, int y, rct_map_element *mapElement, int length); static void sub_68AE2A(int x, int y); static void translate_3d_to_2d(int rotation, int *x, int *y); +static void map_obstruction_set_error_text(rct_map_element *mapElement); void rotate_map_coordinates(sint16 *x, sint16 *y, int rotation) { @@ -2307,7 +2310,7 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi } if(*ebx & GAME_COMMAND_FLAG_APPLY && !(*ebx & 0x40)){ footpath_remove_litter(x, y, F64EC8); - if(!gCheatsDisableClearanceChecks && (scenery_entry->small_scenery.flags & SMALL_SCENERY_FLAG19)) { + if(!gCheatsDisableClearanceChecks && (scenery_entry->small_scenery.flags & SMALL_SCENERY_FLAG_ALLOW_WALLS)) { map_remove_walls_at(x, y, F64EC8, F64EC8 + scenery_entry->small_scenery.height); } } @@ -2433,21 +2436,178 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi *ebx = MONEY32_UNDEFINED; } +static bool map_is_location_at_edge(int x, int y) +{ + return x < 32 || y < 32 || x >= ((256 - 1) * 32) || y >= ((256 - 1) * 32); +} + +/** + * + * rct2: 0x006E5CBA + */ +static bool map_place_fence_check_obstruction_with_track(rct_scenery_entry *wall, int x, int y, int z0, int z1, int edge, rct_map_element *trackElement) +{ + const rct_preview_track *trackBlock; + int z, direction; + + int trackType = trackElement->properties.track.type; + int sequence = trackElement->properties.track.sequence & 0x0F; + int typeAndSequence = (trackType << 4) | sequence; + direction = (edge - trackElement->type) & 3; + rct_ride *ride = GET_RIDE(trackElement->properties.track.ride_index); + + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + if (RCT2_ADDRESS(0x0099AA94, uint8)[typeAndSequence] & (1 << direction)) { + if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_18)) { + return true; + } + } + } else { + if (RCT2_ADDRESS(0x00999A94, uint8)[typeAndSequence] & (1 << direction)) { + if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_18)) { + return true; + } + } + } + + if (!(wall->wall.flags & WALL_SCENERY_FLAG5)) { + return false; + } + + if (!(RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 1)) { + return false; + } + + rct_ride_type *rideEntry = GET_RIDE_ENTRY(ride->subtype); + if (rideEntry->flags & RIDE_ENTRY_FLAG_16) { + return false; + } + + RCT2_GLOBAL(0x0141F725, uint8) |= 1; + if (z0 & 1) { + return false; + } + + if (sequence == 0) { + if (RCT2_GLOBAL(0x0099BA64 + (trackType * 16), uint8) & 0x40) { + return false; + } + + if (gTrackDefinitions[trackType].bank_start == 0) { + if (!(RCT2_ADDRESS(0x009968BB, uint8)[trackType * 10] & 4)) { + direction = (trackElement->type & 3) ^ 2; + if (direction == edge) { + trackBlock = &TrackBlocks[trackType][sequence]; + z = RCT2_GLOBAL(0x009968BD + (trackType * 10), uint8); + z = trackElement->base_height + ((z - trackBlock->z) * 8); + if (z == z0) { + return true; + } + } + } + } + } + + trackBlock = &TrackBlocks[trackType][sequence + 1]; + if (trackBlock->index != 0xFF) { + return false; + } + + if (gTrackDefinitions[trackType].bank_end != 0) { + return false; + } + + direction = RCT2_ADDRESS(0x009968BC, uint8)[trackType * 10]; + if (direction & 4) { + return false; + } + + direction = (trackElement->type + direction) & 3; + if (direction != edge) { + return false; + } + + trackBlock = &TrackBlocks[trackType][sequence]; + z = RCT2_GLOBAL(0x009968BF + (trackType * 10), uint8); + z = trackElement->base_height + ((z - trackBlock->z) * 8); + if (z != z0) { + return false; + } + + return true; +} + /** * * rct2: 0x006E5C1A */ -bool sub_6E5C1A(rct_scenery_entry *wall, int x, int y, int edge, int dl, int dh) +static bool map_place_fence_check_obstruction(rct_scenery_entry *wall, int x, int y, int z0, int z1, int edge) { - return !(RCT2_CALLPROC_X(0x006E5C1A, - x, - edge, - y, - dl | (dh << 8), - 0, - (int)wall, - 0 - ) & 0x100); + int entryType, sequence; + rct_scenery_entry *entry; + rct_large_scenery_tile *tile; + + RCT2_GLOBAL(0x0141F725, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) = 1; + if (map_is_location_at_edge(x, y)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_OFF_EDGE_OF_MAP; + return false; + } + + rct_map_element *mapElement = map_get_first_element_at(x / 32, y / 32); + do { + int elementType = map_element_get_type(mapElement); + if (elementType == MAP_ELEMENT_TYPE_SURFACE) continue; + if (z0 >= mapElement->clearance_height) continue; + if (z1 <= mapElement->base_height) continue; + if (elementType == MAP_ELEMENT_TYPE_FENCE) { + int direction = mapElement->type & 3; + if (edge == direction) { + map_obstruction_set_error_text(mapElement); + return false; + } + continue; + } + if ((mapElement->flags & 0x0F) == 0) continue; + + switch (elementType) { + case MAP_ELEMENT_TYPE_ENTRANCE: + map_obstruction_set_error_text(mapElement); + return false; + case MAP_ELEMENT_TYPE_PATH: + if (mapElement->properties.path.edges & (1 << edge)) { + map_obstruction_set_error_text(mapElement); + return false; + } + break; + case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: + entryType = mapElement->properties.scenerymultiple.type & 0x3FF; + sequence = mapElement->properties.scenerymultiple.type >> 10; + entry = g_largeSceneryEntries[entryType]; + tile = &entry->large_scenery.tiles[sequence]; + + int direction = ((edge - mapElement->type) & 3) + 8; + if (!(tile->var_7 & (1 << direction))) { + map_obstruction_set_error_text(mapElement); + return false; + } + break; + case MAP_ELEMENT_TYPE_SCENERY: + entryType = mapElement->properties.scenery.type; + entry = g_smallSceneryEntries[entryType]; + if (entry->small_scenery.flags & SMALL_SCENERY_FLAG_ALLOW_WALLS) { + map_obstruction_set_error_text(mapElement); + return false; + } + break; + case MAP_ELEMENT_TYPE_TRACK: + if (!map_place_fence_check_obstruction_with_track(wall, x, y, z0, z1, edge, mapElement)) { + return false; + } + break; + } + } while (!map_element_is_last_for_tile(mapElement++)); + return true; } /** @@ -2641,7 +2801,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, RCT2_GLOBAL(0x00141F722, uint8) += fence->wall.height; if (!(flags & (1 << 7)) && !gCheatsDisableClearanceChecks){ - if (!sub_6E5C1A(fence, position.x, position.y, edge, RCT2_GLOBAL(0x00141F721, uint8), RCT2_GLOBAL(0x00141F722, uint8))) { + if (!map_place_fence_check_obstruction(fence, position.x, position.y, RCT2_GLOBAL(0x00141F721, uint8), RCT2_GLOBAL(0x00141F722, uint8), edge)) { *ebx = MONEY32_UNDEFINED; return; } diff --git a/src/world/scenery.h b/src/world/scenery.h index 31db63c7ee..5a724d67d8 100644 --- a/src/world/scenery.h +++ b/src/world/scenery.h @@ -54,7 +54,7 @@ typedef enum { SMALL_SCENERY_FLAG16 = (1 << 15), // 0x8000 SMALL_SCENERY_FLAG17 = (1 << 16), // 0x10000 SMALL_SCENERY_FLAG18 = (1 << 17), // 0x20000 - SMALL_SCENERY_FLAG19 = (1 << 18), // 0x40000 + SMALL_SCENERY_FLAG_ALLOW_WALLS = (1 << 18), // 0x40000 SMALL_SCENERY_FLAG_HAS_SECONDARY_COLOUR = (1 << 19), // 0x80000 SMALL_SCENERY_FLAG20 = (1 << 20), // 0x100000 SMALL_SCENERY_FLAG21 = (1 << 21), // 0x200000 From a0d684a07d5076d14814d5a403ad217135c75dd9 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 7 Sep 2015 04:00:15 +0100 Subject: [PATCH 0646/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/finnish.txt | 590 ++++++++++++++++++++------------------ 1 file changed, 312 insertions(+), 278 deletions(-) diff --git a/data/language/finnish.txt b/data/language/finnish.txt index 737da779a2..a643c037d3 100644 --- a/data/language/finnish.txt +++ b/data/language/finnish.txt @@ -25,7 +25,7 @@ STR_0020 :Tuolihissi STR_0021 :Korkkiruuvivuoristorata STR_0022 :Labyrintti STR_0023 :Kierreliukumäki -STR_0024 :Go Karts +STR_0024 :Mikroautot STR_0025 :Tukkijoki STR_0026 :Koskiseikkailu STR_0027 :Törmäysautot @@ -58,7 +58,7 @@ STR_0053 :Steel Twister Roller Coaster STR_0054 :Puinen vuoristorata STR_0055 :Side-Friction Roller Coaster STR_0056 :Villihiiri -STR_0057 :Multi-Dimension Roller Coaster +STR_0057 :Moniulottuvuus-vuoristorata STR_0058 :Tuntematon laite (38) STR_0059 :Lentävä vuoristorata STR_0060 :Tuntematon laite (3A) @@ -519,7 +519,7 @@ STR_0514 :Trains suspended beneath the roller coaster track swing out to the STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track -STR_0518 :Passengers travel in electric trains along a monorail track +STR_0518 :Matkustajat kulkevat sähköisillä junilla yksittäisellä raiteella STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. @@ -535,7 +535,7 @@ STR_0530 :Cars hang from a steel cable which runs continuously from one end o STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_0532 : STR_0533 : -STR_0534 :Self-drive petrol-engined go karts +STR_0534 :Itsestään ajavat bensalla kulkevat mikroautot STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids STR_0537 : @@ -835,7 +835,7 @@ STR_0830 :{SMALLFONT}{BLACK}Suurenna STR_0831 :{SMALLFONT}{BLACK}Pienennä STR_0832 :{SMALLFONT}{BLACK}Käännä 90{DEGREE} myötäpäivään STR_0833 :{SMALLFONT}{BLACK}Pysäytä peli -STR_0834 :{SMALLFONT}{BLACK}Disk and game options +STR_0834 :{SMALLFONT}{BLACK}Levy- ja peliasetukset STR_0835 :Game initialisation failed STR_0836 :Unable to start game in a minimised state STR_0837 :Unable to initialise graphics system @@ -881,8 +881,8 @@ STR_0875 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP STR_0876 :{BLACK}{DOWN} STR_0877 :Liian matala ! STR_0878 :Liian korkea ! -STR_0879 :Can't lower land here... -STR_0880 :Can't raise land here... +STR_0879 :Maata ei voi alentaa tästä... +STR_0880 :Maata ei voi nostaa tästä... STR_0881 :Esine on tiellä STR_0882 :Lataa peli STR_0883 :Tallenna peli @@ -897,37 +897,37 @@ STR_0891 :Kuvankaappaus STR_0892 :Kuvankaappaus tallennettu levylle nimellä '{STRINGID}' STR_0893 :Kuvankaappaus epäonnistui ! STR_0894 :Landscape data area full ! -STR_0895 :Can't build partly above and partly below ground +STR_0895 :Ei voi rakentaa osittain maan ylle ja alle STR_0896 :{POP16}{POP16}{STRINGID} Construction STR_0897 :Suunta -STR_0898 :{SMALLFONT}{BLACK}Left-hand curve -STR_0899 :{SMALLFONT}{BLACK}Right-hand curve -STR_0900 :{SMALLFONT}{BLACK}Left-hand curve (small radius) -STR_0901 :{SMALLFONT}{BLACK}Right-hand curve (small radius) -STR_0902 :{SMALLFONT}{BLACK}Left-hand curve (very small radius) -STR_0903 :{SMALLFONT}{BLACK}Right-hand curve (very small radius) -STR_0904 :{SMALLFONT}{BLACK}Left-hand curve (large radius) -STR_0905 :{SMALLFONT}{BLACK}Right-hand curve (large radius) -STR_0906 :{SMALLFONT}{BLACK}Straight +STR_0898 :{SMALLFONT}{BLACK}Vasemman käden kaarre +STR_0899 :{SMALLFONT}{BLACK}Oikean käden kaarre +STR_0900 :{SMALLFONT}{BLACK}Vasemman käden kaarre (pieni säde) +STR_0901 :{SMALLFONT}{BLACK}Oikean käden kaarre (pieni säde) +STR_0902 :{SMALLFONT}{BLACK}Vasemman käden kaarre (todella pieni säde) +STR_0903 :{SMALLFONT}{BLACK}Oikean käden kaarre (todella pieni säde) +STR_0904 :{SMALLFONT}{BLACK}Vasemman käden kaarre (iso säde) +STR_0905 :{SMALLFONT}{BLACK}Oikean käden kaarre (iso säde) +STR_0906 :{SMALLFONT}{BLACK}Suora STR_0907 :Liukumäki STR_0908 :Roll/Banking STR_0909 :Seat Rot. STR_0910 :{SMALLFONT}{BLACK}Roll for left-hand curve STR_0911 :{SMALLFONT}{BLACK}Roll for right-hand curve STR_0912 :{SMALLFONT}{BLACK}No roll -STR_0913 :{SMALLFONT}{BLACK}Move to previous section -STR_0914 :{SMALLFONT}{BLACK}Move to next section +STR_0913 :{SMALLFONT}{BLACK}Siirry edelliseen osaan +STR_0914 :{SMALLFONT}{BLACK}Siirry seuraavaan osaan STR_0915 :{SMALLFONT}{BLACK}Rakenna valittu osio STR_0916 :{SMALLFONT}{BLACK}Poista valittu osio -STR_0917 :{SMALLFONT}{BLACK}Vertical drop -STR_0918 :{SMALLFONT}{BLACK}Steep slope down -STR_0919 :{SMALLFONT}{BLACK}Slope down +STR_0917 :{SMALLFONT}{BLACK}Pystypudotus +STR_0918 :{SMALLFONT}{BLACK}Jyrkkä mäki alas +STR_0919 :{SMALLFONT}{BLACK}Mäki alas STR_0920 :{SMALLFONT}{BLACK}Taso -STR_0921 :{SMALLFONT}{BLACK}Slope up -STR_0922 :{SMALLFONT}{BLACK}Steep slope up -STR_0923 :{SMALLFONT}{BLACK}Vertical rise -STR_0924 :{SMALLFONT}{BLACK}Helix down -STR_0925 :{SMALLFONT}{BLACK}Helix up +STR_0921 :{SMALLFONT}{BLACK}Mäki ylös +STR_0922 :{SMALLFONT}{BLACK}Jyrkkä mäki ylös +STR_0923 :{SMALLFONT}{BLACK}Pystynousu +STR_0924 :{SMALLFONT}{BLACK}Kierre alas +STR_0925 :{SMALLFONT}{BLACK}Kierre ylös STR_0926 :Tämän poistaminen ei onnistu... STR_0927 :Tämän rakentaminen tähän ei onnistu... STR_0928 :{SMALLFONT}{BLACK}Chain lift, to pull cars up slopes @@ -935,17 +935,17 @@ STR_0929 :'S' kaarre (vasen) STR_0930 :'S' kaarre (oikea) STR_0931 :Vertical Loop (left) STR_0932 :Vertical Loop (right) -STR_0933 :Raise or lower land first -STR_0934 :Ride entrance in the way -STR_0935 :Ride exit in the way -STR_0936 :Park entrance in the way -STR_0937 :{SMALLFONT}{BLACK}View options +STR_0933 :Nosta tai laske maata ensin +STR_0934 :Ajelun sisäänkäynti edessä +STR_0935 :Ajelun uloskäynti edessä +STR_0936 :Puiston sisäänkäynti edessä +STR_0937 :{SMALLFONT}{BLACK}Näkymäasetukset STR_0938 :{SMALLFONT}{BLACK}Adjust land height and slope STR_0939 :Underground/Inside View STR_0940 :Remove Base Land STR_0941 :Remove Vertical Faces -STR_0942 :See-Through Rides -STR_0943 :See-Through Scenery +STR_0942 :Näe läpi ajelut +STR_0943 :Näe läpi maiseman STR_0944 :Tallenna STR_0945 :Älä tallenna STR_0946 :Peruuta @@ -981,9 +981,9 @@ STR_0975 :Kaupat ja kojut STR_0976 :Toilets and Information Kiosks STR_0977 :Uusi kuljetuslaite STR_0978 :New Gentle Rides -STR_0979 :New Roller Coasters +STR_0979 :Uusia vuoristoratoja STR_0980 :New Thrill Rides -STR_0981 :Uusi vesilaite +STR_0981 :Uusia vesilaitteita STR_0982 :Uusia kauppoja ja kojuja STR_0983 :Research & Development STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} @@ -999,7 +999,7 @@ STR_0993 :Romuta laite/nähtävyys STR_0994 :Romuta STR_0995 :{WINDOW_COLOUR_1}Oletko varma että haluat tuhota {STRINGID}:n? STR_0996 :Kokonaisnäkymä -STR_0997 :{SMALLFONT}{BLACK}View selection +STR_0997 :{SMALLFONT}{BLACK}Näe valinta STR_0998 :Enempää asemia ei sallittu tälle laitteelle STR_0999 :Requires a station platform STR_1000 :Track is not a complete circuit @@ -1052,13 +1052,13 @@ STR_1046 :OpenRCT2 Track Design File STR_1047 :Pelin tallennus epäonnistui! STR_1048 :Scenario save failed! STR_1049 :Maisematiedoston tallennus epäonnistui! -STR_1050 :Failed to load...{NEWLINE}File contains invalid data! +STR_1050 :Avaaminen epäonnistui...{NEWLINE}Tiedosto sisältää virheellistä tietoa! STR_1051 :Näkymättömiä tukia STR_1052 :Näkymättömiä henkilöitä STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park STR_1054 :{SMALLFONT}{BLACK}Name ride/attraction -STR_1055 :{SMALLFONT}{BLACK}Name person -STR_1056 :{SMALLFONT}{BLACK}Name staff member +STR_1055 :{SMALLFONT}{BLACK}Nimeä henkilö +STR_1056 :{SMALLFONT}{BLACK}Nimeä henkilöstön jäsen STR_1057 :Ride/attraction name STR_1058 :Enter new name for this ride/attraction: STR_1059 :Can't rename ride/attraction... @@ -1139,11 +1139,11 @@ STR_1133 :Ajoneuvo {POP16}{COMMA16} STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} STR_1135 :{STRINGID} {COMMA16} STR_1136 :{SMALLFONT}{BLACK}Valitse pääväri -STR_1137 :{SMALLFONT}{BLACK}Select additional colour 1 -STR_1138 :{SMALLFONT}{BLACK}Select additional colour 2 -STR_1139 :{SMALLFONT}{BLACK}Select support structure colour -STR_1140 :{SMALLFONT}{BLACK}Select vehicle colour scheme option -STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify +STR_1137 :{SMALLFONT}{BLACK}Valitse valinnainen väri 1 +STR_1138 :{SMALLFONT}{BLACK}Valitse valinnainen väri 2 +STR_1139 :{SMALLFONT}{BLACK}Valitse tukirakenteiden väri +STR_1140 :{SMALLFONT}{BLACK}Valitse ajoneuvon väriteemava +STR_1141 :{SMALLFONT}{BLACK}Valitse mitä ajoneuvoa/junaa muuttaa STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} STR_1144 :Can't build/move entrance for this ride/attraction... @@ -1168,8 +1168,8 @@ STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} STR_1163 :{STRINGID}{NEWLINE}(Oikea klikkaus muokkaa) STR_1164 :{STRINGID}{NEWLINE}(Oikea klikkaus poistaa) STR_1165 :{STRINGID} - {STRINGID} {COMMA16} -STR_1166 :Can't lower water level here... -STR_1167 :Can't raise water level here... +STR_1166 :Veden tasoa ei voi laskea tässä... +STR_1167 :Veden tasoa ei voi nostaa tässä... STR_1168 :Asetukset STR_1169 :(Ei mitään) STR_1170 :{STRING} @@ -1198,7 +1198,7 @@ STR_1192 :{OUTLINE}{RED}{STRINGID} STR_1193 :{WINDOW_COLOUR_2}{STRINGID} STR_1194 :Suljettu STR_1195 :Testiajo -STR_1196 :Avoin +STR_1196 :Auki STR_1197 :Rikki STR_1198 :Sortunut! STR_1199 :{COMMA16} henkilö laitteessa @@ -1406,7 +1406,7 @@ STR_1400 :Sisäänkäynti STR_1401 :Uloskäynti STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction -STR_1404 :{SMALLFONT}{BLACK}Rotate 90{DEGREE} +STR_1404 :{SMALLFONT}{BLACK}Käännä 90{DEGREE} STR_1405 :{SMALLFONT}{BLACK}Peilaa kuva STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) STR_1407 :{WINDOW_COLOUR_2}Rakenna tämä... @@ -1499,7 +1499,7 @@ STR_1493 :{SMALLFONT}{OPENQUOTES}Minulla ei ole nälkä{ENDQUOTES} STR_1494 :{SMALLFONT}{OPENQUOTES}Minulla ei ole jano{ENDQUOTES} STR_1495 :{SMALLFONT}{OPENQUOTES}Apua! Hukun!{ENDQUOTES} STR_1496 :{SMALLFONT}{OPENQUOTES}Olen eksynyt!{ENDQUOTES} -STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} was great{ENDQUOTES} +STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} oli mahtava{ENDQUOTES} STR_1498 :{SMALLFONT}{OPENQUOTES}I've been queuing for {STRINGID} for ages{ENDQUOTES} STR_1499 :{SMALLFONT}{OPENQUOTES}Olen väsynyt{ENDQUOTES} STR_1500 :{SMALLFONT}{OPENQUOTES}Minulla on nälkä{ENDQUOTES} @@ -1672,15 +1672,15 @@ STR_1666 :{WINDOW_COLOUR_2}Jano: STR_1667 :{WINDOW_COLOUR_2}WC: STR_1668 :{WINDOW_COLOUR_2}Tyytyväisyys: {BLACK}Tuntematon STR_1669 :{WINDOW_COLOUR_2}Tyytyväisyys: {BLACK}{COMMA16}% -STR_1670 :{WINDOW_COLOUR_2}Total customers: {BLACK}{COMMA32} -STR_1671 :{WINDOW_COLOUR_2}Total profit: {BLACK}{CURRENCY2DP} +STR_1670 :{WINDOW_COLOUR_2}Asiakkaiden määrä: {BLACK}{COMMA32} +STR_1671 :{WINDOW_COLOUR_2}Kokonaistuotanto: {BLACK}{CURRENCY2DP} STR_1672 :Jarrut STR_1673 :Spinning Control Toggle Track STR_1674 :Jarrutusnopeus STR_1675 :{POP16}{VELOCITY} STR_1676 :{SMALLFONT}{BLACK}Set speed limit for brakes -STR_1677 :{WINDOW_COLOUR_2}Popularity: {BLACK}Unknown -STR_1678 :{WINDOW_COLOUR_2}Popularity: {BLACK}{COMMA16}% +STR_1677 :{WINDOW_COLOUR_2}Suosio: {BLACK}Tuntematon +STR_1678 :{WINDOW_COLOUR_2}Suosio: {BLACK}{COMMA16}% STR_1679 :Helix up (left) STR_1680 :Helix up (right) STR_1681 :Helix down (left) @@ -1912,7 +1912,7 @@ STR_1904 :{WINDOW_COLOUR_2}Shop stock STR_1905 :{WINDOW_COLOUR_2}Ruoka-/juomamyynnit STR_1906 :{WINDOW_COLOUR_2}Food/drink stock STR_1907 :{WINDOW_COLOUR_2}Henkilökunnan palkat -STR_1908 :{WINDOW_COLOUR_2}Marketing +STR_1908 :{WINDOW_COLOUR_2}Markkinointi STR_1909 :{WINDOW_COLOUR_2}Tutkimustyö STR_1910 :{WINDOW_COLOUR_2}Lainan korko STR_1911 :{BLACK} at {COMMA16}% per year @@ -1946,17 +1946,17 @@ STR_1938 :{SMALLFONT}{BLACK}Näytä vierasnäkymä STR_1939 :{SMALLFONT}{BLACK}Näytä henkilöstönäkymä STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this guest STR_1941 :{SMALLFONT}{BLACK}Show which rides this guest has been on -STR_1942 :{SMALLFONT}{BLACK}Show financial information about this guest +STR_1942 :{SMALLFONT}{BLACK}Näytä vieraan taloustiedot STR_1943 :{SMALLFONT}{BLACK}Näytä vieraan viimeiset ajatukset -STR_1944 :{SMALLFONT}{BLACK}Show items guest is carrying +STR_1944 :{SMALLFONT}{BLACK}Näytä mitä esineitä vieras kantaa STR_1945 :{SMALLFONT}{BLACK}Show orders and options for this staff member -STR_1946 :{SMALLFONT}{BLACK}Select costume for this entertainer +STR_1946 :{SMALLFONT}{BLACK}Valitse puku viihdyttäjälle STR_1947 :{SMALLFONT}{BLACK}Show areas patrolled by selected staff type, and locate the nearest staff member -STR_1948 :{SMALLFONT}{BLACK}Hire a new staff member of the selected type +STR_1948 :{SMALLFONT}{BLACK}Palkkaa uusi tietyn tyyppinen henkilöstön jäsen STR_1949 :Taloudellinen yhteenveto -STR_1950 :Financial Graph -STR_1951 :Park Value Graph -STR_1952 :Profit Graph +STR_1950 :Talouskuvaaja +STR_1951 :Puiston arvokuvaaja +STR_1952 :Tuottokuvaaja STR_1953 :Markkinointi STR_1954 :Tutkimustyön rahoitus STR_1955 :{WINDOW_COLOUR_2}Number of circuits: @@ -2220,7 +2220,7 @@ STR_2212 :{SMALLFONT}{BLACK}Näytä puiston vartijat STR_2213 :{SMALLFONT}{BLACK}Näytä puiston viihdyttäjät STR_2214 :Rakentaminen ei ole mahdollista pelin ollessa pysäytettynä! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) -STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C +STR_2216 :{WINDOW_COLOU1R_2}{COMMA16}{DEGREE}C STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} @@ -2259,18 +2259,18 @@ STR_2251 :Can only be built on paths! STR_2252 :Can only be built across paths! STR_2253 :Transport Rides STR_2254 :Gentle Rides -STR_2255 :Roller Coasters +STR_2255 :Vuoristoradat STR_2256 :Thrill Rides STR_2257 :Vesiajelut STR_2258 :Shops & Stalls STR_2259 :Scenery & Themeing STR_2260 :Ei rahoitusta -STR_2261 :Minimum funding -STR_2262 :Normal funding -STR_2263 :Maximum funding +STR_2261 :Vähimmäisrahoitus +STR_2262 :Normaali rahoitus +STR_2263 :Täysrahoitus STR_2264 :Tutkimustyön rahoitus -STR_2265 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} per month -STR_2266 :Research priorities +STR_2265 :{WINDOW_COLOUR_2}Kustannus: {BLACK}{CURRENCY} kuukaudessa +STR_2266 :Tutkimustyön tärkeysjärjestykset STR_2267 :Paraikaa suunnitteilla STR_2268 :Last development STR_2269 :{WINDOW_COLOUR_2}Tyyppi: {BLACK}{STRINGID} @@ -2318,9 +2318,9 @@ STR_2310 :Build custom design STR_2311 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} (approx.) STR_2312 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} (approx.) STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) -STR_2314 :{WINDOW_COLOUR_2}Ahelun pituus: {BLACK}{STRINGID} -STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} -STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks +STR_2314 :{WINDOW_COLOUR_2}Ajelun pituus: {BLACK}{STRINGID} +STR_2315 :{WINDOW_COLOUR_2}Kustannus: {BLACK}noin {CURRENCY} +STR_2316 :{WINDOW_COLOUR_2}Tilaa tarvitaan: {BLACK}{COMMA16} x {COMMA16} neliöä STR_2317 : STR_2318 : STR_2319 : @@ -2335,19 +2335,19 @@ STR_2327 :Asetukset STR_2328 :{WINDOW_COLOUR_2}Valuutta: STR_2329 :{WINDOW_COLOUR_2}Etäisyys ja nopeus: STR_2330 :{WINDOW_COLOUR_2}Lämpötila: -STR_2331 :{WINDOW_COLOUR_2}Height Labels: -STR_2332 :Yksikköä +STR_2331 :{WINDOW_COLOUR_2}Korkeusmerkinnät: +STR_2332 :Yksikkö STR_2333 :Ääni -STR_2334 :Puntaa ({POUND}) -STR_2335 :Dollaria ($) -STR_2336 :Franc (F) -STR_2337 :Saksanmarkkaa (DM) -STR_2338 :Jeniä ({YEN}) -STR_2339 :Pesetaa (Pts) -STR_2340 :Liiraa (L) -STR_2341 :Guilders (fl.) -STR_2342 :Krona (kr) -STR_2343 :Euroa ({EURO}) +STR_2334 :Punta ({POUND}) +STR_2335 :Dollari ($) +STR_2336 :Frangi (F) +STR_2337 :Saksanmarkka (DM) +STR_2338 :Jen ({YEN}) +STR_2339 :Peseta (Pts) +STR_2340 :Liira (L) +STR_2341 :Guldeni (fl.) +STR_2342 :Kruunu (kr) +STR_2343 :Euro ({EURO}) STR_2344 :Brittiläinen STR_2345 :Metrinen STR_2346 :Näytä @@ -2369,7 +2369,7 @@ STR_2361 :Landscape Smoothing STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off STR_2363 :Gridlines on Landscape STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off -STR_2365 :The bank refuses to increase your loan! +STR_2365 :Pankki ei suostu korottamaan lainaasi! STR_2366 :Celsius ({DEGREE}C) STR_2367 :Fahrenheit (F) STR_2368 :Ei mitään @@ -2377,15 +2377,15 @@ STR_2369 :Matala STR_2370 :Tyydyttävä STR_2371 :Korkea STR_2372 :Matala -STR_2373 :Medium +STR_2373 :Keski STR_2374 :Korkea STR_2375 :Todella korkea STR_2376 :Extreme STR_2377 :Ultra-Extreme -STR_2378 :{SMALLFONT}{BLACK}Adjust smaller area of land -STR_2379 :{SMALLFONT}{BLACK}Adjust larger area of land -STR_2380 :{SMALLFONT}{BLACK}Adjust smaller area of water -STR_2381 :{SMALLFONT}{BLACK}Adjust larger area of water +STR_2378 :{SMALLFONT}{BLACK}Säädä pienempi alue maata +STR_2379 :{SMALLFONT}{BLACK}Säädä suurempi alue maata +STR_2380 :{SMALLFONT}{BLACK}Säädä pienempi alue vettä +STR_2381 :{SMALLFONT}{BLACK}Säädä suurempi alue vettä STR_2382 :Maa STR_2383 :Vesi STR_2384 :{WINDOW_COLOUR_2}Tavoitteesi: @@ -2402,26 +2402,26 @@ STR_2394 :{BLACK}To finish building all 5 of the partially built roller coast STR_2395 :{BLACK}To repay your loan and achieve a park value of at least {POP16}{POP16}{CURRENCY} STR_2396 :{BLACK}To achieve a monthly profit from food, drink and merchandise sales of at least {POP16}{POP16}{CURRENCY} STR_2397 :Ei mitään -STR_2398 :Number of guests at a given date -STR_2399 :Park value at a given date +STR_2398 :Vieraiden määrä tiettynä päivänä +STR_2399 :Puiston arvo tiettynä päivänä STR_2400 :Pidä hauskaa STR_2401 :Rakenna parhaat ajelut joita voit STR_2402 :Rakenna 10 vuoristorataa STR_2403 :Vieraiden määrä puistossa -STR_2404 :Monthly income from ride tickets -STR_2405 :Build 10 roller coasters of a given length -STR_2406 :Finish building 5 roller coasters -STR_2407 :Repay loan and achieve a given park value +STR_2404 :Kuukausittainen tulo ajelujen tuloista +STR_2405 :Rakenna 10 vuoristorataa tietyssä ajassa +STR_2406 :Rakenna valmiiksi 5 vuoristorataa +STR_2407 :Maksa laina pois ja saavuta tietty puiston arvo STR_2408 :Monthly profit from food/merchandise -STR_2409 :{WINDOW_COLOUR_2}Marketing campaigns in operation +STR_2409 :{WINDOW_COLOUR_2}Markkinointikampanjoja käynnissä STR_2410 :{BLACK}Ei mitään -STR_2411 :{WINDOW_COLOUR_2}Marketing campaigns available -STR_2412 :{SMALLFONT}{BLACK}Start this marketing campaign -STR_2413 :{BLACK}({CURRENCY2DP} per week) +STR_2411 :{WINDOW_COLOUR_2}Markkinointikampanjoja saatavilla +STR_2412 :{SMALLFONT}{BLACK}Aloita tämä markkinointikampanja +STR_2413 :{BLACK}({CURRENCY2DP} viikossa) STR_2414 :(Ei valittu) -STR_2415 :{WINDOW_COLOUR_2}Ride: +STR_2415 :{WINDOW_COLOUR_2}Ajelu: STR_2416 :{WINDOW_COLOUR_2}Esine: -STR_2417 :{WINDOW_COLOUR_2}Length of time: +STR_2417 :{WINDOW_COLOUR_2}Kesto: STR_2418 :Free entry to {STRINGID} STR_2419 :Free ride on {STRINGID} STR_2420 :Half-price entry to {STRINGID} @@ -2432,8 +2432,8 @@ STR_2424 :{WINDOW_COLOUR_2}Vouchers for free entry to the park STR_2425 :{WINDOW_COLOUR_2}Vouchers for free rides on a particular ride STR_2426 :{WINDOW_COLOUR_2}Vouchers for half-price entry to the park STR_2427 :{WINDOW_COLOUR_2}Vouchers for free food or drink -STR_2428 :{WINDOW_COLOUR_2}Advertising campaign for the park -STR_2429 :{WINDOW_COLOUR_2}Advertising campaign for a particular ride +STR_2428 :{WINDOW_COLOUR_2}Mainoskampanja puistollesi +STR_2429 :{WINDOW_COLOUR_2}Mainoskampanja tietylle ajelulle STR_2430 :{BLACK}Vouchers for free entry to {STRINGID} STR_2431 :{BLACK}Vouchers for free ride on {STRINGID} STR_2432 :{BLACK}Vouchers for half-price entry to {STRINGID} @@ -2447,14 +2447,14 @@ STR_2439 : STR_2440 : STR_2441 : STR_2442 : -STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} -STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} -STR_2445 :Start this marketing campaign -STR_2446 :{YELLOW}Your marketing campaign for free entry to the park has finished +STR_2443 :{WINDOW_COLOUR_2}Viikottainen kustannus: {BLACK}{CURRENCY2DP} +STR_2444 :{WINDOW_COLOUR_2}Kokonaiskustannus: {BLACK}{CURRENCY2DP} +STR_2445 :Aloita tämä markkinointikampanja +STR_2446 :{YELLOW}Markkinointikampanja ilmaisille sisäänpääsyille puistossasi on loppunut STR_2447 :{YELLOW}Your marketing campaign for free rides on {STRINGID} has finished -STR_2448 :{YELLOW}Your marketing campaign for half-price entry to the park has finished +STR_2448 :{YELLOW}Markkinointikampanja sisäänpääsy puoleen hintaan puistoosi on loppunut STR_2449 :{YELLOW}Your marketing campaign for free {STRINGID} has finished -STR_2450 :{YELLOW}Your advertising campaign for the park has finished +STR_2450 :{YELLOW}Mainoskampanjasi puistolle on loppunut STR_2451 :{YELLOW}Your advertising campaign for {STRINGID} has finished STR_2452 :{WINDOW_COLOUR_2}Cash (less loan): {BLACK}{CURRENCY2DP} STR_2453 :{WINDOW_COLOUR_2}Cash (less loan): {RED}{CURRENCY2DP} @@ -2463,16 +2463,16 @@ STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} - STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} - STR_2457 :{SMALLFONT}{BLACK}Show financial accounts STR_2458 :{SMALLFONT}{BLACK}Show graph of cash (less loan) over time -STR_2459 :{SMALLFONT}{BLACK}Show graph of park value over time -STR_2460 :{SMALLFONT}{BLACK}Show graph of weekly profit -STR_2461 :{SMALLFONT}{BLACK}Show marketing campaigns -STR_2462 :{SMALLFONT}{BLACK}Show view of park entrance +STR_2459 :{SMALLFONT}{BLACK}Näytä kuvaaja puiston arvosta +STR_2460 :{SMALLFONT}{BLACK}Näytä kuvaaja viikottaisesta tuotosta +STR_2461 :{SMALLFONT}{BLACK}Näytä markkinointikampanjat +STR_2462 :{SMALLFONT}{BLACK}Näytä puiston sisäänkäynti STR_2463 :{SMALLFONT}{BLACK}Show graph of park ratings over time STR_2464 :{SMALLFONT}{BLACK}Show graph of guest numbers over time -STR_2465 :{SMALLFONT}{BLACK}Show park entrance price and information -STR_2466 :{SMALLFONT}{BLACK}Show park statistics -STR_2467 :{SMALLFONT}{BLACK}Show objectives for this game -STR_2468 :{SMALLFONT}{BLACK}Show recent awards this park has received +STR_2465 :{SMALLFONT}{BLACK}Näytä sisäänpääsyhinta ja -tiedot +STR_2466 :{SMALLFONT}{BLACK}Näytä puiston tilastot +STR_2467 :{SMALLFONT}{BLACK}Näytä pelin tavoitteet +STR_2468 :{SMALLFONT}{BLACK}Näytä viimeiset palkinnot mitä tämä puisto on saanut STR_2469 :{SMALLFONT}{BLACK}Select level of research & development STR_2470 :{SMALLFONT}{BLACK}Research new transport rides STR_2471 :{SMALLFONT}{BLACK}Research new gentle rides @@ -2486,12 +2486,12 @@ STR_2478 :{SMALLFONT}{BLACK}Show graph of velocity against time STR_2479 :{SMALLFONT}{BLACK}Show graph of altitude against time STR_2480 :{SMALLFONT}{BLACK}Show graph of vertical acceleration against time STR_2481 :{SMALLFONT}{BLACK}Show graph of lateral acceleration against time -STR_2482 :{SMALLFONT}{BLACK}Profit: {CURRENCY} per week, Park Value: {CURRENCY} -STR_2483 :{WINDOW_COLOUR_2}Weekly profit: {BLACK}+{CURRENCY2DP} -STR_2484 :{WINDOW_COLOUR_2}Weekly profit: {RED}{CURRENCY2DP} -STR_2485 :Controls +STR_2482 :{SMALLFONT}{BLACK}Tuotte: {CURRENCY} viikossa, puiston arvo: {CURRENCY} +STR_2483 :{WINDOW_COLOUR_2}Viikottainen tuotto: {BLACK}+{CURRENCY2DP} +STR_2484 :{WINDOW_COLOUR_2}Viikottainen tuotto: {RED}{CURRENCY2DP} +STR_2485 :Ohjaimet STR_2486 :Yleiset -STR_2487 :Show 'real' names of guests +STR_2487 :Näytä vieraiden 'oikeat' nimet STR_2488 :{SMALLFONT}{BLACK}Toggle between showing 'real' names of guests and guest numbers STR_2489 :Pikanäppäimet... STR_2490 :Näppäimistön pikanäppäimet @@ -2515,19 +2515,19 @@ STR_2507 :Invisible people toggle STR_2508 :Height marks on land toggle STR_2509 :Height marks on ride tracks toggle STR_2510 :Height marks on paths toggle -STR_2511 :Adjust land -STR_2512 :Adjust water +STR_2511 :Säädä maata +STR_2512 :Säädä vettä STR_2513 :Build scenery STR_2514 :Build paths -STR_2515 :Build new ride -STR_2516 :Show financial information -STR_2517 :Show research information -STR_2518 :Show rides list -STR_2519 :Show park information -STR_2520 :Show guest list -STR_2521 :Show staff list -STR_2522 :Show recent messages -STR_2523 :Show map +STR_2515 :Rakenna uusi ajelu +STR_2516 :Näytä taloustiedot +STR_2517 :Näytä tutkimustyötiedot +STR_2518 :Näytä ajelulista +STR_2519 :Näytä puiston tiedot +STR_2520 :Näytä vieraslista +STR_2521 :Näytä henkilöstölista +STR_2522 :Näytä viimeiset viestit +STR_2523 :Näytä kartta STR_2524 :Kuvankaappaus ### The following need to be reordered to match SDL_keycode layout. STR_2525 :??? @@ -2538,7 +2538,7 @@ STR_2529 :??? STR_2530 :??? STR_2531 :??? STR_2532 :??? -STR_2533 :Backspace +STR_2533 :Askelpalautin STR_2534 :Tab STR_2535 :??? STR_2536 :??? @@ -2557,12 +2557,12 @@ STR_2548 :??? STR_2549 :??? STR_2550 :??? STR_2551 :??? -STR_2552 :Escape +STR_2552 :Esc-näppäin STR_2553 :??? STR_2554 :??? STR_2555 :??? STR_2556 :??? -STR_2557 :Spacebar +STR_2557 :Välilyönti STR_2558 :PgUp STR_2559 :PgDn STR_2560 :End @@ -2685,37 +2685,37 @@ STR_2676 :??? STR_2677 :??? STR_2678 :??? STR_2679 :??? -STR_2680 :All research complete +STR_2680 :Kaikki tutkimustyö on tehty STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} STR_2682 : STR_2683 : STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive STR_2685 :Simplex Noise Parameters -STR_2686 :{WINDOW_COLOUR_2}Low: -STR_2687 :{WINDOW_COLOUR_2}High: +STR_2686 :{WINDOW_COLOUR_2}Matala: +STR_2687 :{WINDOW_COLOUR_2}Korkea: STR_2688 :{WINDOW_COLOUR_2}Base Frequency: STR_2689 :{WINDOW_COLOUR_2}Octaves: STR_2690 :Map Generation STR_2691 :{WINDOW_COLOUR_2}Base height: -STR_2692 :{WINDOW_COLOUR_2}Water level: -STR_2693 :{WINDOW_COLOUR_2}Terrain: -STR_2694 :Generate -STR_2695 :Random terrain -STR_2696 :Place trees +STR_2692 :{WINDOW_COLOUR_2}Vedentaso: +STR_2693 :{WINDOW_COLOUR_2}Ympäristö: +STR_2694 :Luo +STR_2695 :Satunnainen ympäristö +STR_2696 :Aseta puita STR_2697 :??? STR_2698 :??? STR_2699 :??? -STR_2700 :Autosave frequency: +STR_2700 :Automaattisen tallennuksen tiheys: STR_2701 :Joka viikko STR_2702 :Joka toinen viikko STR_2703 :Joka kuukausi STR_2704 :Joka neljäs kuukausi STR_2705 :Joka vuosi STR_2706 :Ei koskaan -STR_2707 :Open new window -STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? -STR_2709 :Overwrite -STR_2710 :Type the name of the file. +STR_2707 :Avaa uusi ikkuna +STR_2708 :{WINDOW_COLOUR_1}Oletko varma, että haluat korvata tiedoston {STRINGID}? +STR_2709 :Korvaa +STR_2710 :Kirjoita tiedoston nimi. STR_2711 :; STR_2712 := STR_2713 :, @@ -2723,7 +2723,7 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(up) +STR_2718 :(ylös) STR_2719 :(uusi tiedosto) STR_2720 :{UINT16}sek STR_2721 :{UINT16}sekuntia @@ -2743,11 +2743,11 @@ STR_2734 :{COMMA16}mph STR_2735 :{COMMA16}km/h STR_2736 :{MONTH}, Vuosi {COMMA16} STR_2737 :{STRINGID} {MONTH}, Vuosi {COMMA16} -STR_2738 :Title screen music: -STR_2739 :None +STR_2738 :Otsikkoruudun musiikki: +STR_2739 :Ei mitään STR_2740 :RollerCoaster Tycoon 1 STR_2741 :RollerCoaster Tycoon 2 -STR_2742 :css50.dat not found +STR_2742 :css50.dat ei löydy STR_2743 :Copy data\css17.dat from your RCT1 installation to data\css50.dat in your RCT2 installation. STR_2744 :[ STR_2745 :\ @@ -2756,15 +2756,15 @@ STR_2747 :{ENDQUOTES} STR_2748 :Bar STR_2749 :My new scenario # New strings used in the cheats window previously these were ??? -STR_2750 :Move all items to top -STR_2751 :Move all items to bottom +STR_2750 :Siirrä kaikki esineet ylös +STR_2751 :Siirrä kaikki esineet alas STR_2752 :Clear grass -STR_2753 :Mowed grass -STR_2754 :Water plants -STR_2755 :Fix vandalism -STR_2756 :Remove litter -STR_2757 :Force Sun -STR_2758 :Force Thunder +STR_2753 :Leikattu ruoho +STR_2754 :Kastele kasvit +STR_2755 :Korjaa tärvelöinti +STR_2756 :Poista roskat +STR_2757 :Pakota aurinko +STR_2758 :Pakota ukkonen STR_2759 :Zero Clearance STR_2760 :+{CURRENCY} STR_2761 : @@ -2773,32 +2773,32 @@ STR_2763 :??? STR_2764 : STR_2765 :Large Tram STR_2766 :Win scenario -STR_2767 :Freeze Climate +STR_2767 :Jäädytä ilmasto STR_2768 :Unfreeze Climate STR_2769 :Avaa puisto STR_2770 :Sulje puisto -STR_2771 :Slower Gamespeed -STR_2772 :Faster Gamespeed -STR_2773 :Windowed -STR_2774 :Fullscreen -STR_2775 :Fullscreen (desktop) +STR_2771 :Hitaampi pelinopeus +STR_2772 :Nopeampi pelinopeus +STR_2773 :Ikkunoitu +STR_2774 :Koko näyttö +STR_2775 :Koko näyttö (työpöytä) STR_2776 :Kieli: STR_2777 :{MOVE_X}{SMALLFONT}{STRING} STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} -STR_2779 :Viewport #{COMMA16} -STR_2780 :Extra viewport +STR_2779 :Ikkuna #{COMMA16} +STR_2780 :Ylimääräinen ikkuna # End of new strings STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + -STR_2784 :Change keyboard shortcut +STR_2784 :Muuta näppäimistön pikanäppäintä STR_2785 :{WINDOW_COLOUR_2}Press new shortcut key for:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} STR_2786 :{SMALLFONT}{BLACK}Click on shortcut description to select new key -STR_2787 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} +STR_2787 :{WINDOW_COLOUR_2}Puiston arvo: {BLACK}{CURRENCY} STR_2788 :{WINDOW_COLOUR_2}Congratulations !{NEWLINE}{BLACK}You achieved your objective with a company value of {CURRENCY} ! -STR_2789 :{WINDOW_COLOUR_2}You have failed your objective ! +STR_2789 :{WINDOW_COLOUR_2}Epäonnistuit tavoitteessasi ! STR_2790 :Enter name into scenario chart -STR_2791 :Enter name +STR_2791 :Anna nimi STR_2792 :Please enter your name for the scenario chart: STR_2793 :{SMALLFONT}(Completed by {STRINGID}) STR_2794 :{WINDOW_COLOUR_2}Completed by: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} with a company value of: {BLACK}{CURRENCY} @@ -2807,17 +2807,17 @@ STR_2796 :{SMALLFONT}{BLACK}Sort the ride list into order using the informati STR_2797 :Scroll view when pointer at screen edge STR_2798 :{SMALLFONT}{BLACK}Select whether to scroll the view when the mouse pointer is at the screen edge STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments -STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32} -STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP} +STR_2800 :{WINDOW_COLOUR_2}Sisäänpääsyt: {BLACK}{COMMA32} +STR_2801 :{WINDOW_COLOUR_2}Tulot sisäänpääsyistä: {BLACK}{CURRENCY2DP} STR_2802 :Kartta STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map -STR_2805 :{SMALLFONT}{BLACK}Show map of park +STR_2805 :{SMALLFONT}{BLACK}Näytä puiston kartta STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organising them better STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organising them better STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organising them better -STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food -STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks +STR_2809 :{RED}Vieraat ovat nälkäisiä eivätkä löydä paikkaa mistä saisi ruokaa +STR_2810 :{RED}Vieraat ovat janoisia eivätkä löydä paikkaa josta saisi juotavaa STR_2811 :{RED}Vieraat valittavat etteivät löydä wc:tä puistostasi STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests @@ -2865,10 +2865,10 @@ STR_2854 :{RED}Guests can't get to the entrance of {STRINGID} !{NEWLINE}Const STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the ride exit STR_2856 :{WINDOW_COLOUR_2}Tutorial STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) -STR_2858 :Can't start marketing campaign... +STR_2858 :Markkinointikampanjaa ei voitu aloittaa... STR_2859 :Another instance of OpenRCT2 is already running -STR_2860 :Infogrames Interactive credits... -STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. +STR_2860 :Infogrames Interactiven lopputekstit... +STR_2861 :{WINDOW_COLOUR_2}Lisensoinut Infogrames Interactive Inc. STR_2862 :Music acknowledgements... STR_2863 :Music acknowledgements STR_2864 :{WINDOW_COLOUR_2}March - Children of the Regiment: (Fucik) non copyright @@ -2996,8 +2996,8 @@ STR_2985 :Banner STR_2986 :{SMALLFONT}{BLACK}Change text on banner STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for guests STR_2988 :{SMALLFONT}{BLACK}Demolish this banner -STR_2989 :{SMALLFONT}{BLACK}Select main colour -STR_2990 :{SMALLFONT}{BLACK}Select text colour +STR_2989 :{SMALLFONT}{BLACK}Valitse pääväri +STR_2990 :{SMALLFONT}{BLACK}Valitse tekstille väri STR_2991 :Kyltti STR_2992 :Tekstikyltti STR_2993 :Anna teksti tälle kyltille: @@ -3018,49 +3018,49 @@ STR_3007 :{LIGHTPINK}ABC STR_3008 :{PEARLAQUA}ABC STR_3009 :{PALESILVER}ABC STR_3010 :Tiedoston lataus ei onnistunut... -STR_3011 :File contains invalid data +STR_3011 :Tiedosto sisältää virheellistä tietoa STR_3012 :Dodgems beat style STR_3013 :Fairground organ style STR_3014 :Roman fanfare style -STR_3015 :Oriental style +STR_3015 :Itämainen tyyli STR_3016 :Marssilainen tyyli STR_3017 :Viidakkorummut-tyyli STR_3018 :Egyptiläinen tyyli -STR_3019 :Toyland style +STR_3019 :Lelumaatyyli STR_3020 : STR_3021 :Avaruustyyli STR_3022 :Kauhutyyli STR_3023 :Teknotyyli -STR_3024 :Gentle style +STR_3024 :Hempeätyyli STR_3025 :Kesätyyli STR_3026 :Vesityyli STR_3027 :Villilänsityyli STR_3028 :Jurassic style STR_3029 :Kivityyli STR_3030 :Ragtime style -STR_3031 :Fantasy style +STR_3031 :Fantasiatyyli STR_3032 :Kivityyli 2 STR_3033 :Jäätyyli STR_3034 :Lumityyli STR_3035 :Custom music 1 STR_3036 :Custom music 2 STR_3037 :Keskiaikainen tyyli -STR_3038 :Urban style +STR_3038 :Kaupunkimainen tyyli STR_3039 :Organ style STR_3040 :Mekaaninen tyyli -STR_3041 :Modern style +STR_3041 :Modernityyli STR_3042 :Merirosvotyyli STR_3043 :Kivityyli 3 STR_3044 :Karkkityyli -STR_3045 :{SMALLFONT}{BLACK}Select style of music to play -STR_3046 :This ride cannot be modified +STR_3045 :{SMALLFONT}{BLACK}Valitse toistettavan musiikin tyyli +STR_3046 :Tätä ajelua ei voi muokata STR_3047 :Local authority forbids demolition or modifications to this ride STR_3048 :Marketing campaigns forbidden by local authority -STR_3049 :Golf reikä A -STR_3050 :Golf reikä B -STR_3051 :Golf reikä C -STR_3052 :Golf reikä D -STR_3053 :Golf reikä E +STR_3049 :Golf-reikä A +STR_3050 :Golf-reikä B +STR_3051 :Golf-reikä C +STR_3052 :Golf-reikä D +STR_3053 :Golf-reikä E STR_3054 :Ladataan... STR_3055 :Valkoinen STR_3056 :Läpikuultava @@ -3071,31 +3071,31 @@ STR_3060 :Jääpalat STR_3061 :Puiset aidat STR_3062 :{SMALLFONT}{BLACK}Standard roller coaster track STR_3063 :{SMALLFONT}{BLACK}Water channel (track submerged) -STR_3064 :Beginner Parks -STR_3065 :Challenging Parks -STR_3066 :Expert Parks +STR_3064 :Aloittajan puistot +STR_3065 :Haastavat puistot +STR_3066 :Asiantuntijan puistot STR_3067 :{OPENQUOTES}Oikeat{ENDQUOTES} puistot STR_3068 :Muut puistot STR_3069 :Top Section STR_3070 :Slope to Level -STR_3071 :{WINDOW_COLOUR_2}Same price throughout park -STR_3072 :{SMALLFONT}{BLACK}Select whether this price is used throughout the entire park +STR_3071 :{WINDOW_COLOUR_2}Sama hinta kaikkialla puistossa +STR_3072 :{SMALLFONT}{BLACK}Valitse käytetäänkö samaa hintaa kaikkialla puistossa STR_3073 :{RED}WARNING: Your park rating has dropped below 700 !{NEWLINE}If you haven't raised the park rating in 4 weeks, your park will be closed down STR_3074 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have 3 weeks to raise the park rating STR_3075 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have only 2 weeks to raise the park rating, or your park will be closed down STR_3076 :{RED}FINAL WARNING: Your park rating is still below 700 !{NEWLINE}In just 7 days your park will be closed down unless you can raise the rating -STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! +STR_3077 :{RED}LAKKAUTUSTIEDOTE: Puistosi on suljettu ! STR_3078 :Tavallinen sisäänkäynti STR_3079 :Puinen sisäänkäynti -STR_3080 :Canvas tent entrance +STR_3080 :Kangastelttasisäänkäynti STR_3081 :Linnan sisäänkäynti (harmaa) STR_3082 :Linnan sisäänkäynti (ruskea) STR_3083 :Viidakkosisäänkäynti -STR_3084 :Log cabin entrance +STR_3084 :Hirsimökkisisäänkäynti STR_3085 :Klassinen/Roomalainen sisäänkäynti -STR_3086 :Abstract entrance +STR_3086 :Abstrktisisäänkäynti STR_3087 :Lumi-/Jääsisäänkäynti -STR_3088 :Pagoda entrance +STR_3088 :Pagodisisäänkäynti STR_3089 :Avaruussisäänkäynti STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station STR_3091 :Ei ole sallittua poistaa tätä aluetta! @@ -3110,17 +3110,17 @@ STR_3099 :{SMALLFONT}{BLACK}Valitse väri STR_3100 :{SMALLFONT}{BLACK}Valitse toinen väri STR_3101 :{SMALLFONT}{BLACK}Valitse kolmas väri STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape -STR_3103 :Can't re-paint this... -STR_3104 :{SMALLFONT}{BLACK}List rides +STR_3103 :Tämän uudelleenvärittäminen ei onnistunut... +STR_3104 :{SMALLFONT}{BLACK}Ajelulista STR_3105 :{SMALLFONT}{BLACK}List shops and stalls STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other guest facilities STR_3107 :Sulje -STR_3108 :Test +STR_3108 :Testi STR_3109 :Avaa STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16} STR_3111 :{SMALLFONT}{BLACK}Click on design to build it STR_3112 :{SMALLFONT}{BLACK}Click on design to rename or delete it -STR_3113 :Select a different design +STR_3113 :Valitse toinen malli STR_3114 :{SMALLFONT}{BLACK}Go back to design selection window STR_3115 :{SMALLFONT}{BLACK}Save track design STR_3116 :{SMALLFONT}{BLACK}Save track design (Not possible until ride has been tested and statistics have been generated) @@ -3149,7 +3149,7 @@ STR_3138 :Reset Selection STR_3139 :Cable lift unable to work in this operating mode STR_3140 :Cable lift hill must start immediately after station STR_3141 :Multi-circuit per ride not possible with cable lift hill -STR_3142 :{WINDOW_COLOUR_2}Capacity: {BLACK}{STRINGID} +STR_3142 :{WINDOW_COLOUR_2}Kapasiteetti: {BLACK}{STRINGID} STR_3143 :{SMALLFONT}{BLACK}Näytä ihmiset kartalla STR_3144 :{SMALLFONT}{BLACK}Show rides and stalls on map STR_3145 :{SMALLFONT}{BLACK}Vieritä {STRINGID} vasemmalle @@ -3174,27 +3174,27 @@ STR_3163 :Installing new data: STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) STR_3165 : STR_3166 :{BLACK}(ID: -STR_3167 :{WINDOW_COLOUR_2}Includes: {BLACK}{COMMA16} objects +STR_3167 :{WINDOW_COLOUR_2}Sisältää: {BLACK}{COMMA16} objektia STR_3168 :{WINDOW_COLOUR_2}Teksti: {BLACK}{STRINGID} -STR_3169 :Data for the following object not found: -STR_3170 :Not enough space for graphics -STR_3171 :Too many objects of this type selected -STR_3172 :The following object must be selected first: {STRING} -STR_3173 :This object is currently in use -STR_3174 :This object is required by another object -STR_3175 :This object is always required -STR_3176 :Unable to select this object +STR_3169 :Tiedot seuraavalle objektille ei löydy: +STR_3170 :Tilaa ei ole tarpeeksi grafiikoille +STR_3171 :Liian montaa tämän tyyppistä objektia valittuna +STR_3172 :Tämä objekti pitää valita ensiksi: {STRING} +STR_3173 :Tämä objekti on käytössä +STR_3174 :Tätä objektia tarvitaan toisessa projektissa +STR_3175 :Tätä objektia aina tarvitaan +STR_3176 :Ei onnistunut valita tätä objektia STR_3177 :Unable to de-select this object STR_3178 :At least one path object must be selected STR_3179 :At least one ride vehicle/attraction object must be selected -STR_3180 :Invalid selection of objects -STR_3181 :Object Selection - {STRINGID} +STR_3180 :Virheellinen objektien valinta +STR_3181 :Objektin valinta - {STRINGID} STR_3182 :Puiston sisäänkäynnintyyli on valittava STR_3183 :Veden tyyppi on valittava STR_3184 :Ride Vehicles/Attractions STR_3185 :Small Scenery STR_3186 :Large Scenery -STR_3187 :Walls/Fences +STR_3187 :Seinät/Aidat STR_3188 :Path Signs STR_3189 :Jalkakäytävät STR_3190 :Path Extras @@ -3203,26 +3203,26 @@ STR_3192 :Puiston sisäänkäynti STR_3193 :Vesi STR_3194 :Scenario Description STR_3195 :Keksintölista -STR_3196 :{WINDOW_COLOUR_2}RTutkimusryhmä: {BLACK}{STRINGID} +STR_3196 :{WINDOW_COLOUR_2}Tutkimusryhmä: {BLACK}{STRINGID} STR_3197 :{WINDOW_COLOUR_2}Items pre-invented at start of game: STR_3198 :{WINDOW_COLOUR_2}Items to invent during game: -STR_3199 :Random Shuffle +STR_3199 :Satunnainen sekoitus STR_3200 :{SMALLFONT}{BLACK}Randomly shuffle the list of items to invent during the game STR_3201 :Object Selection STR_3202 :Landscape Editor STR_3203 :Invention List Set Up STR_3204 :Options Selection -STR_3205 :Objective Selection +STR_3205 :Tavoitteen valinta STR_3206 :Save Scenario STR_3207 :Roller Coaster Designer STR_3208 :Track Designs Manager -STR_3209 :Back to Previous Step: -STR_3210 :Forward to Next Step: -STR_3211 :{WINDOW_COLOUR_2}Map size: +STR_3209 :Takaisin edelliseen vaiheeseen: +STR_3210 :Siirry seuraavaan vaiheeseen: +STR_3211 :{WINDOW_COLOUR_2}Kartan koko: STR_3212 :{POP16}{COMMA16} x {PUSH16}{COMMA16} -STR_3213 :Can't decrease map size any further -STR_3214 :Can't increase map size any further -STR_3215 :Too close to edge of map +STR_3213 :Karttaa ei voi enempää pienentää +STR_3214 :Karttaa ei voi enempää suurentaa +STR_3215 :Liian lähellä kartan reunaa STR_3216 :{SMALLFONT}{BLACK}Select park-owned land etc. STR_3217 :Maan omistaa STR_3218 :Rakennusoikeudet omistaa @@ -3245,7 +3245,7 @@ STR_3234 :Asetukset - Puisto STR_3235 :{SMALLFONT}{BLACK}Show financial options STR_3236 :{SMALLFONT}{BLACK}Show guest options STR_3237 :{SMALLFONT}{BLACK}Show park options -STR_3238 :No Money +STR_3238 :Ei rahaa STR_3239 :{SMALLFONT}{BLACK}Make this park a 'no money' park with no financial restrictions STR_3240 :{WINDOW_COLOUR_2}Aloitusrahamäärä: STR_3241 :{WINDOW_COLOUR_2}Aloituslaina: @@ -3274,8 +3274,8 @@ STR_3263 :{WINDOW_COLOUR_2}Guests initial thirst: STR_3264 :Can't increase this any further! STR_3265 :Can't reduce this any further! STR_3266 :{SMALLFONT}{BLACK}Select how this park charges for entrance and rides -STR_3267 :Forbid tree removal -STR_3268 :{SMALLFONT}{BLACK}Forbid tall trees being removed +STR_3267 :Estä puiden poistaminen +STR_3268 :{SMALLFONT}{BLACK}Estä korkeiden puiden poistaminen STR_3269 :Forbid landscape changes STR_3270 :{SMALLFONT}{BLACK}Forbid any changes to the landscape STR_3271 :Forbid high construction @@ -3288,10 +3288,10 @@ STR_3277 :{WINDOW_COLOUR_2}Cost to buy land: STR_3278 :{WINDOW_COLOUR_2}Cost to buy construction rights: STR_3279 :Free park entry / Pay per ride STR_3280 :Pay to enter park / Free rides -STR_3281 :{WINDOW_COLOUR_2}Entry price: -STR_3282 :{SMALLFONT}{BLACK}Select objective and park name +STR_3281 :{WINDOW_COLOUR_2}Sisäänpääsyhinta: +STR_3282 :{SMALLFONT}{BLACK}Valitse tavoite ja puiston nimi STR_3283 :{SMALLFONT}{BLACK}Select rides to be preserved -STR_3284 :Objective Selection +STR_3284 :Tavoitteen valinta STR_3285 :Preserved Rides STR_3286 :{SMALLFONT}{BLACK}Select objective for this scenario STR_3287 :{WINDOW_COLOUR_2}Tavoite: @@ -3324,16 +3324,16 @@ STR_3313 :Scenario Name STR_3314 :Enter name for scenario: STR_3315 :Park/Scenario Details STR_3316 :Enter description of this scenario: -STR_3317 :No details yet +STR_3317 :Lisätietoja ei ole vielä saatavilla STR_3318 :{SMALLFONT}{BLACK}Select which group this scenario appears in STR_3319 :{WINDOW_COLOUR_2}Scenario Group: STR_3320 :Unable to save scenario file... -STR_3321 :New objects installed successfully -STR_3322 :{WINDOW_COLOUR_2}Objective: {BLACK}{STRINGID} +STR_3321 :Uusia objekteja asennettu onnistuneesti +STR_3322 :{WINDOW_COLOUR_2}Tavoite: {BLACK}{STRINGID} STR_3323 :Missing object data, ID: STR_3324 :Tarvitsee lisäosapaketin: STR_3325 :Tarvitsee lisäosapaketin -STR_3326 :{WINDOW_COLOUR_2}(no image) +STR_3326 :{WINDOW_COLOUR_2}(ei kuvaa) STR_3327 :Starting positions for people not set STR_3328 :Can't advance to next editor stage... STR_3329 :Puiston sisäänkäyntiä ei ole vielä rakennettu @@ -3360,8 +3360,8 @@ STR_3349 :Poista STR_3350 :Track design name STR_3351 :Enter new name for this track design: STR_3352 :Can't rename track design... -STR_3353 :New name contains invalid characters -STR_3354 :Another file exists with this name, or file is write-protected +STR_3353 :Uusi nimi sisältää virheellisiä merkkejä +STR_3354 :Toinen saman niminen tiedosto on jo olemassa tai tiedosto on kirjoitussuojattu STR_3355 :Tiedosto on kirjoitussuojattu tai lukittu STR_3356 :Poista tiedosto STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ? @@ -3371,7 +3371,7 @@ STR_3360 :Varoitus! STR_3361 :Too many track designs of this type - Some will not be listed. STR_3362 : STR_3363 : -STR_3364 :Advanced +STR_3364 :Edistynyt STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups STR_3366 :{BLACK}= Ajelu STR_3367 :{BLACK}= Ruokakoju @@ -3381,7 +3381,7 @@ STR_3370 :{BLACK}= Info. Kiosk STR_3371 :{BLACK}= Ensiapu STR_3372 :{BLACK}= Kassakone STR_3373 :{BLACK}= WC -STR_3374 :Warning: Too many objects selected! +STR_3374 :Varoitus: Liian monta objektia valittuna! STR_3375 :Not all objects in this scenery group could be selected STR_3376 :Install new track design... STR_3377 :{SMALLFONT}{BLACK}Install a new track design file @@ -3458,11 +3458,11 @@ STR_3446 :Cancel Patrol Area # New strings, cleaner STR_5120 :Talous STR_5121 :Tutkimustyö -STR_5122 :Select rides by track type (like in RCT1) +STR_5122 :Valitse ajelut radan tyypin mukaan (kuten RCT1:ssä) STR_5123 :Uusi ajelut STR_5124 : STR_5125 :All destructable -STR_5126 :Random title music +STR_5126 :Satunnainen otsikkomusiikki STR_5127 :{SMALLFONT}{BLACK}Disable land elevation STR_5128 :Valinnan koko STR_5129 :Enter selection size between {COMMA16} and {COMMA16} @@ -3485,7 +3485,7 @@ STR_5145 :Turbonopeus STR_5146 :Hypernopeus STR_5147 :Huijaukset STR_5148 :{SMALLFONT}{BLACK}Muuta pelin nopeus -STR_5149 :{SMALLFONT}{BLACK}Open the cheats window +STR_5149 :{SMALLFONT}{BLACK}Avaa huijauksetikkuna STR_5150 :Enable debugging tools STR_5151 :, STR_5152 :. @@ -3494,7 +3494,7 @@ 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 STR_5157 :Unlock all prices -STR_5158 :Quit to menu +STR_5158 :Lopeta valikkoon STR_5159 :Lopeta OpenRCT2 STR_5160 :{MONTH} {STRINGID}, vuosi {COMMA16} STR_5161 :Päiväyksen tyyli: @@ -3549,7 +3549,7 @@ STR_5209 :Banner STR_5210 :Object Selection STR_5211 :Keksintölista STR_5212 :Scenario Options -STR_5213 :Objective Options +STR_5213 :Tavoiteasetukset STR_5214 :Map Generation STR_5215 :Track Design Manager STR_5216 :Track Design Manager List @@ -3569,13 +3569,13 @@ STR_5229 :{SMALLFONT}{BLACK}Puisto STR_5230 :{SMALLFONT}{BLACK}Työkalut STR_5231 :{SMALLFONT}{BLACK}Rides and Peeps STR_5232 :{SMALLFONT}{BLACK}Editors -STR_5233 :{SMALLFONT}{BLACK}Miscellaneous +STR_5233 :{SMALLFONT}{BLACK}Sekalaiset STR_5234 :{SMALLFONT}{BLACK}Kehotteet STR_5235 :{SMALLFONT}{BLACK}Asetukset STR_5236 :Ikkuna: -STR_5237 :Palette: +STR_5237 :Väripaletti: STR_5238 :Nykyinen teema: -STR_5239 :Duplicate +STR_5239 :Kopioi STR_5240 :Anna nimi teemalle STR_5241 :Nimen muuttaminen ei onnistunut STR_5242 :Teeman nimi on jo olemassa @@ -3606,8 +3606,8 @@ STR_5266 :{SMALLFONT}{BLACK}Näyttö STR_5267 :{SMALLFONT}{BLACK}Kulttuuri ja yksiköt STR_5268 :{SMALLFONT}{BLACK}Ääni STR_5269 :{SMALLFONT}{BLACK}Controls and interface -STR_5270 :{SMALLFONT}{BLACK}Miscellaneous -STR_5271 :{SMALLFONT}{BLACK}Twitch +STR_5270 :{SMALLFONT}{BLACK}Sekalaiset +STR_5271 :{SMALLFONT}{BLACK}Nykäys STR_5272 :{SMALLFONT}{BLACK}Small Scenery STR_5273 :{SMALLFONT}{BLACK}Large Scenery STR_5274 :{SMALLFONT}{BLACK}Jalkakäytävä @@ -3637,7 +3637,7 @@ STR_5297 :{SMALLFONT}{BLACK}Avaa puisto STR_5298 :{RED}{STRINGID} STR_5299 :{LIGHTPINK}{STRINGID} STR_5300 :{SMALLFONT}{BLACK}Quick fire staff -STR_5301 :{MEDIUMFONT}{BLACK}Clear your loan +STR_5301 :{MEDIUMFONT}{BLACK}Poista lainasi STR_5302 :Poista laina STR_5303 :Salli rakentelu pelin ollessa pysäytetty STR_5304 :Title Sequence: @@ -3679,7 +3679,7 @@ STR_5339 :Base height STR_5340 :Clearance height STR_5341 :Flags STR_5342 :Choose a map tile -STR_5343 :Automatically place staff +STR_5343 :Automaattisesti aseta henkilöstö STR_5344 :Muutosloki STR_5345 :Taloushuijaukset STR_5346 :Vierashuijaukset @@ -3705,7 +3705,7 @@ STR_5365 :{BLACK}Henkilökunnan nopeus: STR_5366 :Normaali STR_5367 :Nopea STR_5368 :Reset crash status -STR_5369 :Park parameters... +STR_5369 :Puiston määritteet... STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. STR_5371 :Object Selection STR_5372 :Invert right mouse dragging @@ -3714,7 +3714,7 @@ STR_5374 :Päiväys {STRINGID} STR_5375 :{UP} STR_5376 :{DOWN} STR_5377 :{SMALLFONT}{BLACK}Tallenteet -STR_5378 :{SMALLFONT}{BLACK}Script +STR_5378 :{SMALLFONT}{BLACK}Komentosarja STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence STR_5381 :{SMALLFONT}{BLACK}Stop playing title sequence @@ -3726,21 +3726,20 @@ STR_5386 :{SMALLFONT}{BLACK}Lisää uusi komento STR_5387 :{SMALLFONT}{BLACK}Muokkaa uusi komento STR_5388 :{SMALLFONT}{BLACK}Poista valittu komento STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence -STR_5390 :{SMALLFONT}{BLACK}Move the selected command down -STR_5391 :{SMALLFONT}{BLACK}Move the selected command up +STR_5390 :{SMALLFONT}{BLACK}Siirrä valittu komento alas +STR_5391 :{SMALLFONT}{BLACK}Siirrä valittu komento ylös STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence STR_5394 :{SMALLFONT}{BLACK}Uudelleennimeä valittu tallenne -STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game +STR_5395 :{SMALLFONT}{BLACK}Lataa valittu tallenne pelissä STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game -STR_5397 :Can only be used on the title screen +STR_5397 :Voidaan käyttää ainoastaan otsikkoruudussa STR_5398 :Cannot edit title sequence while it's playing STR_5399 :Press the stop button to continue editing STR_5400 :Can't change this title sequence STR_5401 :Create a new title sequence to make changes to STR_5402 :Failed to load title sequence -STR_5403 :Tuolla -may be no Load or Wait command or a save may be invalid +STR_5403 :There may be no Load or Wait command or a save may be invalid STR_5404 :Nimi on jo olemassa STR_5405 :Anna nimi tallenteelle STR_5406 :Enter a name for the title sequence @@ -3751,7 +3750,7 @@ STR_5410 :Muokkaa STR_5411 :Lataa uudelleen STR_5412 :Skip to STR_5413 :Lataa -STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5414 :Lataa{MOVE_X}{87}Six Flags Magic Mountain.SC6 STR_5415 :Lataa{MOVE_X}{87}{STRING} STR_5416 :Lataa{MOVE_X}{87}Tallennetta ei ole valittu STR_5417 :Sijainti @@ -3766,16 +3765,16 @@ STR_5425 :Uudelleen käynnistä STR_5426 :Lopeta STR_5427 :Koordinaatit: STR_5428 :Vastapäivään käännökset: -STR_5429 :Zoom level: +STR_5429 :Suurennus: STR_5430 :Sekuntia odottaa: STR_5431 :Tallenna lataakseen: STR_5432 :Komento: STR_5433 :Title Sequences -STR_5434 :Command Editor +STR_5434 :Komentojenmuokkain STR_5435 :Uudelleen nimeä tallenne STR_5436 :Edit Title Sequences... STR_5437 :Tallennusta ei valittuna -STR_5438 :Can't make changes while command editor is open +STR_5438 :Muutosten teko ei onnistu komentojenmuokkaimen ollessa päällä STR_5439 :A wait command with at least 4 seconds is required with a restart command STR_5440 :Minimise fullscreen on focus loss STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. @@ -3791,14 +3790,14 @@ STR_5450 :Lisää pelin nopeutta STR_5451 :Avaa huijausikkuna STR_5452 :Toggle visibility of toolbars STR_5453 :Valitse toinen ajelu -STR_5454 :Uncap FPS +STR_5454 :Älä rajoita FPS STR_5455 :Enable sandbox mode STR_5456 :Disable clearance checks STR_5457 :Disable support limits STR_5458 :Käännä myötäpäivään STR_5459 :Käännä vastapäivään -STR_5460 :Rotate view anti-clockwise -STR_5461 :Set guests' parameters +STR_5460 :Käännä näkymää vastapäivään +STR_5461 :Määritä vieraiden määritteitä STR_5462 :{CURRENCY} STR_5463 :Tavoite: Pidä hauskaa! STR_5464 :Yleiset @@ -3815,7 +3814,7 @@ STR_5474 :Display text on banners in upper case STR_5475 :{COMMA16} viikkoa STR_5476 :Laitteisto STR_5477 :Map rendering -STR_5478 :Controls +STR_5478 :Ohjaimet STR_5479 :Työkalupalkki STR_5480 :Show toolbar buttons for: STR_5481 :Teemat @@ -3840,13 +3839,48 @@ STR_5499 :Pelaajan nimi: STR_5500 :Lisää palvelin STR_5501 :Käynistä palvelin STR_5502 :Moninpeli -STR_5503 :Enter hostname or IP address: +STR_5503 :Anna isäntänimi tai IP-osoite: STR_5504 :{SMALLFONT}{BLACK}Näytä moninpelin tilanne STR_5505 :Yhdistäminen ei onnistunut. STR_5506 :Guests ignore intensities -STR_5507 :Handymen mow grass by default +STR_5507 :Yleismiehet leikkaavat ruohoa oletuksena STR_5508 :Allow loading files with incorrect checksums STR_5509 :{SMALLFONT}{BLACK}Allows loading scenarios and saves that have an incorrect checksum, like the scenarios from the demo or damaged saves. STR_5510 :Oletus äänilaite STR_5511 :(TUNTEMATON) STR_5512 :Tallenna peli nimellä +STR_5513 :(Pika) tallenna peli +STR_5514 :Disable vandalism +STR_5515 :{SMALLFONT}{BLACK}Estää vieraita tärvelemästä puistoasi heidän ollessa vihaisia +STR_5516 :{SMALLFONT}{BLACK}Musta +STR_5517 :{SMALLFONT}{BLACK}Harmaa +STR_5518 :{SMALLFONT}{BLACK}Valkoinen +STR_5519 :{SMALLFONT}{BLACK}Tummanvioletti +STR_5520 :{SMALLFONT}{BLACK}Vaaleanvioletti +STR_5521 :{SMALLFONT}{BLACK}Kirkkaanvioletti +STR_5522 :{SMALLFONT}{BLACK}Tummansininen +STR_5523 :{SMALLFONT}{BLACK}Vaaleansininen +STR_5524 :{SMALLFONT}{BLACK}Jäinensininen +STR_5525 :{SMALLFONT}{BLACK}Sinivihreä +STR_5526 :{SMALLFONT}{BLACK}Akvamariini +STR_5527 :{SMALLFONT}{BLACK}Kyllästettyvihreä +STR_5528 :{SMALLFONT}{BLACK}Tummanvihreä +STR_5529 :{SMALLFONT}{BLACK}Sammaleenvihreä +STR_5530 :{SMALLFONT}{BLACK}Kirkkaanvihreä +STR_5531 :{SMALLFONT}{BLACK}Oliivinvihreä +STR_5532 :{SMALLFONT}{BLACK}Tummanoliivinvihreä +STR_5533 :{SMALLFONT}{BLACK}Kirkkaankeltainen +STR_5534 :{SMALLFONT}{BLACK}Keltainen +STR_5535 :{SMALLFONT}{BLACK}Tummankeltainen +STR_5536 :{SMALLFONT}{BLACK}Vaaleanoranssi +STR_5537 :{SMALLFONT}{BLACK}Tummanoranssi +STR_5538 :{SMALLFONT}{BLACK}Vaaleanruskea +STR_5539 :{SMALLFONT}{BLACK}Kyllästettyruskea +STR_5540 :{SMALLFONT}{BLACK}Tummanruskea +STR_5541 :{SMALLFONT}{BLACK}Lohenvaaleanpunainen +STR_5542 :{SMALLFONT}{BLACK}Bordeauxinpunainen +STR_5543 :{SMALLFONT}{BLACK}Kyllästetynpunainen +STR_5544 :{SMALLFONT}{BLACK}Kirkkaanpunainen +STR_5545 :{SMALLFONT}{BLACK}Tummanvaaleanpunainen +STR_5546 :{SMALLFONT}{BLACK}Kirkasvaaleanpunainen +STR_5547 :{SMALLFONT}{BLACK}Vaaleanpunainen From 3ddddec21c072687d3e874809bddd90383d0a73a Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 7 Sep 2015 14:57:39 +0200 Subject: [PATCH 0647/1173] Fix some warnings --- src/audio/audio.c | 2 +- src/config.c | 12 ++++++------ src/drawing/scrolling_text.c | 4 ++-- src/drawing/string.c | 8 ++++---- src/localisation/language.c | 8 ++++---- src/rct1.c | 4 ++-- src/windows/changelog.c | 4 ++-- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 64548460e2..7531f7b216 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -1164,7 +1164,7 @@ MMRESULT mmio_open(const char* filename, HMMIO* hmmio, HGLOBAL* hmem, LPMMCKINFO goto label20; } memcpy(hmemold2, &waveformat, 16); - *((uint16*)*hmemold + 8) = (uint16)hmem; + *((uint16*)*hmemold + 8) = *(uint16*)*hmem; if (!hmem || mmioRead(hmmio1, (char*)*hmemold + 18, (LONG)hmem) == (LONG)hmem) { result = mmioAscend(hmmio1, &mmckinfo1, 0); if (!result) { diff --git a/src/config.c b/src/config.c index cd6219d53d..8680831ea3 100644 --- a/src/config.c +++ b/src/config.c @@ -329,7 +329,7 @@ void config_set_defaults() if (property->type == CONFIG_VALUE_TYPE_STRING) { // Copy the string to new memory const utf8 *src = property->default_value.value_string; - const utf8 **dst = &(destValue->value_string); + const utf8 **dst = (const utf8**)&(destValue->value_string); if (src != NULL) { *dst = _strdup(property->default_value.value_string); } @@ -507,7 +507,7 @@ bool config_get_section(const utf8string line, const utf8 **sectionName, int *se if (*ch != '[') return false; *sectionName = ++ch; - while ((c = utf8_get_next(ch, &ch)) != 0) { + while ((c = utf8_get_next(ch, (const utf8**)&ch)) != 0) { if (c == '#') return false; if (c == '[') return false; if (c == ' ') break; @@ -530,7 +530,7 @@ bool config_get_property_name_value(const utf8string line, utf8 **propertyName, if (*ch == 0) return false; *propertyName = ch; - while ((c = utf8_get_next(ch, &ch)) != 0) { + while ((c = utf8_get_next(ch, (const utf8**)&ch)) != 0) { if (isspace(c) || c == '=') { *propertyNameSize = ch - *propertyName - 1; break; @@ -554,7 +554,7 @@ bool config_get_property_name_value(const utf8string line, utf8 **propertyName, } *value = ch; - while ((c = utf8_get_next(ch, &ch)) != 0) { + while ((c = utf8_get_next(ch, (const utf8**)&ch)) != 0) { if (isspace(c) || c == '#') { if (!quotes) break; } @@ -716,7 +716,7 @@ static void utf8_skip_whitespace(utf8 **outch) utf8 *ch; while (**outch != 0) { ch = *outch; - if (!isspace(utf8_get_next(*outch, outch))) { + if (!isspace(utf8_get_next(*outch, (const utf8**)outch))) { *outch = ch; break; } @@ -726,7 +726,7 @@ static void utf8_skip_whitespace(utf8 **outch) static void utf8_skip_non_whitespace(utf8 **outch) { while (**outch != 0) { - if (isspace(utf8_get_next(*outch, outch))) + if (isspace(utf8_get_next(*outch, (const utf8**)outch))) break; } } diff --git a/src/drawing/scrolling_text.c b/src/drawing/scrolling_text.c index ec2a71ba75..cd877b8490 100644 --- a/src/drawing/scrolling_text.c +++ b/src/drawing/scrolling_text.c @@ -153,7 +153,7 @@ void scrolling_text_set_bitmap_for_sprite(utf8 *text, int scroll, uint8 *bitmap, utf8 *ch = text; while (true) { - uint32 codepoint = utf8_get_next(ch, &ch); + uint32 codepoint = utf8_get_next(ch, (const utf8**)&ch); // If at the end of the string loop back to the start if (codepoint == 0) { @@ -213,7 +213,7 @@ void scrolling_text_set_bitmap_for_ttf(utf8 *text, int scroll, uint8 *bitmap, si utf8 *dstCh = text; utf8 *ch = text; int codepoint; - while ((codepoint = utf8_get_next(ch, &ch)) != 0) { + while ((codepoint = utf8_get_next(ch, (const utf8**)&ch)) != 0) { if (utf8_is_format_code(codepoint)) { if (codepoint >= FORMAT_COLOUR_CODE_START && codepoint <= FORMAT_COLOUR_CODE_END) { colour = (uint8)codepoint; diff --git a/src/drawing/string.c b/src/drawing/string.c index e495959634..fe50765edc 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -70,7 +70,7 @@ int gfx_get_string_width_new_lined(utf8 *text) int width = 0; int maxWidth = 0; - while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { + while ((codepoint = utf8_get_next(ch, (const utf8**)&nextCh)) != 0) { if (codepoint == FORMAT_NEWLINE || codepoint == FORMAT_NEWLINE_SMALLER) { backup = *nextCh; *nextCh = 0; @@ -122,7 +122,7 @@ int gfx_clip_string(utf8 *text, int width) utf8 *nextCh = text; utf8 *clipCh = text; int codepoint; - while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { + while ((codepoint = utf8_get_next(ch, (const utf8**)&nextCh)) != 0) { if (utf8_is_format_code(codepoint)) { ch = nextCh; ch += utf8_get_format_code_arg_length(codepoint); @@ -179,7 +179,7 @@ int gfx_wrap_string(utf8 *text, int width, int *outNumLines, int *outFontHeight) utf8 *nextCh; int codepoint; int numCharactersOnLine = 0; - while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { + while ((codepoint = utf8_get_next(ch, (const utf8**)&nextCh)) != 0) { if (codepoint == ' ') { currentWord = ch; currentWidth = lineWidth; @@ -712,7 +712,7 @@ void gfx_draw_string_centred_wrapped_partial(rct_drawpixelinfo *dpi, int x, int utf8 *ch = buffer; utf8 *nextCh; int codepoint; - while ((codepoint = utf8_get_next(ch, &nextCh)) != 0) { + while ((codepoint = utf8_get_next(ch, (const utf8**)&nextCh)) != 0) { if (!utf8_is_format_code(codepoint)) { numCharactersDrawn++; if (numCharactersDrawn > numCharactersToDraw) { diff --git a/src/localisation/language.c b/src/localisation/language.c index 72421d7630..3a0272789e 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -113,7 +113,7 @@ void utf8_remove_format_codes(utf8 *text) utf8 *dstCh = text; utf8 *ch = text; int codepoint; - while ((codepoint = utf8_get_next(ch, &ch)) != 0) { + while ((codepoint = utf8_get_next(ch, (const utf8**)&ch)) != 0) { if (!utf8_is_format_code(codepoint)) { dstCh = utf8_write_codepoint(dstCh, codepoint); } @@ -240,7 +240,7 @@ static int language_open_file(const utf8 *filename, language_data *language) // Handle UTF-8 char *srcNext; - uint32 utf8Char = utf8_get_next(src, &srcNext); + uint32 utf8Char = utf8_get_next(src, (const utf8**)&srcNext); i += srcNext - src - 1; switch (mode) { @@ -343,7 +343,7 @@ void utf8_trim_string(utf8 *text) int codepoint; // Trim left - while ((codepoint = utf8_get_next(src, &src)) != 0) { + while ((codepoint = utf8_get_next(src, (const utf8**)&src)) != 0) { if (codepoint != ' ') { dst = utf8_write_codepoint(dst, codepoint); last = dst; @@ -352,7 +352,7 @@ void utf8_trim_string(utf8 *text) } if (codepoint != 0) { // Trim right - while ((codepoint = utf8_get_next(src, &src)) != 0) { + while ((codepoint = utf8_get_next(src, (const utf8**)&src)) != 0) { dst = utf8_write_codepoint(dst, codepoint); if (codepoint != ' ') { last = dst; diff --git a/src/rct1.c b/src/rct1.c index efa4d619ce..fc891c0a4c 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -70,7 +70,7 @@ bool rct1_read_sc4(const char *path, rct1_s4 *s4) long length, decodedLength; bool success; - if (!readentirefile(path, (void**)&buffer, &length)) { + if (!readentirefile(path, (void**)&buffer, (int*)&length)) { RCT2_GLOBAL(RCT2_ADDRESS_ERROR_TYPE, uint8) = 255; RCT2_GLOBAL(RCT2_ADDRESS_ERROR_STRING_ID, uint16) = 3011; return 0; @@ -100,7 +100,7 @@ bool rct1_read_sv4(const char *path, rct1_s4 *s4) long length, decodedLength; bool success; - if (!readentirefile(path, (void**)&buffer, &length)) { + if (!readentirefile(path, (void**)&buffer, (int*)&length)) { RCT2_GLOBAL(RCT2_ADDRESS_ERROR_TYPE, uint8) = 255; RCT2_GLOBAL(RCT2_ADDRESS_ERROR_STRING_ID, uint16) = 3011; return 0; diff --git a/src/windows/changelog.c b/src/windows/changelog.c index 5cfc1147da..fa37953a29 100644 --- a/src/windows/changelog.c +++ b/src/windows/changelog.c @@ -194,7 +194,7 @@ static bool window_changelog_read_file() window_changelog_dispose_file(); utf8 path[MAX_PATH]; sprintf(path, "%s%cchangelog.txt", gExePath, platform_get_path_separator()); - if (!readentirefile(path, &_changelogText, &_changelogTextSize)) { + if (!readentirefile(path, (void**)&_changelogText, (int*)&_changelogTextSize)) { log_error("Unable to read changelog.txt"); return false; } @@ -246,4 +246,4 @@ static void window_changelog_dispose_file() SafeFree(_changelogLines); _changelogTextSize = 0; _changelogNumLines = 0; -} \ No newline at end of file +} From 72000196dd6193f1c051023e6132f536f9f12c4f Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 7 Sep 2015 17:35:26 +0100 Subject: [PATCH 0648/1173] use English UK DAT strings instead of RCT2 Korean strings until fix or workaround is available #1898 --- src/localisation/language.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/localisation/language.c b/src/localisation/language.c index 3a0272789e..089f4f25b9 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -88,7 +88,7 @@ const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", &TTFFontMingLiu, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL { "zh-Hans", "Chinese (Simplified)", "Chinese (Simplified)", "chinese_simplified", &TTFFontSimSun, RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED }, // LANGUAGE_CHINESE_SIMPLIFIED { "fi-FI", "Finnish", "Suomi", "finnish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_FINNISH - { "kr-KR", "Korean", "Korean", "korean", &TTFFontMalgun, RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN + { "kr-KR", "Korean", "Korean", "korean", &TTFFontMalgun, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_KOREAN }; int gCurrentLanguage = LANGUAGE_UNDEFINED; From af39fcd35f0cc01ae4263c7d2929f65c8f964272 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 7 Sep 2015 18:18:52 +0100 Subject: [PATCH 0649/1173] fix #1873 --- src/ride/track.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ride/track.c b/src/ride/track.c index 73e5cfde9e..8f5b8157cd 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3949,7 +3949,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in } } - if ((edx_flags & (1 << 0)) && !(enabledTrackPieces & TRACK_LIFT_HILL_STEEP)) { + if ((edx_flags & (1 << 0)) && !(enabledTrackPieces & (1ULL << TRACK_LIFT_HILL_STEEP))) { if (RCT2_ADDRESS(0x0099423C, uint16)[type] & 0x400) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_STEEP_FOR_LIFT_HILL; return MONEY32_UNDEFINED; From f2beefb33bd4477ebe94c10145a677f4c25031d7 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 7 Sep 2015 18:43:31 +0100 Subject: [PATCH 0650/1173] fix #1886 --- src/ride/ride.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 60d326c961..4bdf8cfd08 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -6432,7 +6432,7 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio return MONEY32_UNDEFINED; } - if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0){ + if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; return MONEY32_UNDEFINED; } From 52252f82b3248a800bcd7a2c3300c0a6665ca72b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Mon, 7 Sep 2015 00:46:54 +0200 Subject: [PATCH 0651/1173] assorted fixes --- src/cmdline_sprite.c | 6 +++--- src/config.c | 4 ++-- src/drawing/string.c | 12 ++++++++---- src/localisation/utf8.c | 1 + src/management/award.c | 2 +- src/peep/peep.c | 6 +++--- src/ride/ride.c | 12 ++++++------ src/ride/track.c | 10 +++++++--- src/util/util.c | 2 +- src/windows/editor_bottom_toolbar.c | 4 ++-- src/windows/loadsave.c | 8 ++++---- src/windows/themes.c | 2 +- 12 files changed, 39 insertions(+), 30 deletions(-) diff --git a/src/cmdline_sprite.c b/src/cmdline_sprite.c index af9a9ea022..80360d2590 100644 --- a/src/cmdline_sprite.c +++ b/src/cmdline_sprite.c @@ -407,8 +407,8 @@ int cmdline_for_sprite(const char **argv, int argc) return -1; } - printf("sprites: %d\n", spriteFileHeader.num_entries); - printf("data size: %d\n", spriteFileHeader.total_size); + printf("sprites: %lu\n", spriteFileHeader.num_entries); + printf("data size: %lu\n", spriteFileHeader.total_size); sprite_file_close(); return 1; @@ -432,7 +432,7 @@ int cmdline_for_sprite(const char **argv, int argc) printf("height: %d\n", g1->height); printf("x offset: %d\n", g1->x_offset); printf("y offset: %d\n", g1->y_offset); - printf("data offset: 0x%X\n", (uint32)g1->offset); + printf("data offset: 0x%lX\n", (uint32)g1->offset); sprite_file_close(); return 1; diff --git a/src/config.c b/src/config.c index cd6219d53d..b69ac071f7 100644 --- a/src/config.c +++ b/src/config.c @@ -471,7 +471,7 @@ static void config_save_property_value(SDL_RWops *file, uint8 type, value_union rwopsprintf(file, "%u", value->value_uint16); break; case CONFIG_VALUE_TYPE_UINT32: - rwopsprintf(file, "%u", value->value_uint32); + rwopsprintf(file, "%lu", value->value_uint32); break; case CONFIG_VALUE_TYPE_SINT8: rwopsprintf(file, "%d", value->value_sint8); @@ -480,7 +480,7 @@ static void config_save_property_value(SDL_RWops *file, uint8 type, value_union rwopsprintf(file, "%d", value->value_sint16); break; case CONFIG_VALUE_TYPE_SINT32: - rwopsprintf(file, "%d", value->value_sint32); + rwopsprintf(file, "%ld", value->value_sint32); break; case CONFIG_VALUE_TYPE_FLOAT: rwopsprintf(file, "%.3f", value->value_float); diff --git a/src/drawing/string.c b/src/drawing/string.c index e495959634..d73f91ee3f 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -275,7 +275,7 @@ void gfx_draw_string_left_clipped(rct_drawpixelinfo* dpi, int format, void* args void gfx_draw_string_centred_clipped(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y, int width) { char* buffer; - short text_width; + int text_width; buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); format_string(buffer, format, args); @@ -286,9 +286,11 @@ void gfx_draw_string_centred_clipped(rct_drawpixelinfo *dpi, int format, void *a text_width = gfx_clip_string(buffer, width); // Draw the text centred - if (text_width <= 0xFFFF) { + if (text_width <= 0xFFFF && text_width >= 0) { x -= (text_width - 1) / 2; gfx_draw_string(dpi, buffer, colour, x, y); + } else { + log_warning("improper text width %d for string %s", text_width, buffer); } } @@ -331,7 +333,7 @@ void gfx_draw_string_right(rct_drawpixelinfo* dpi, int format, void* args, int c void gfx_draw_string_centred(rct_drawpixelinfo *dpi, int format, int x, int y, int colour, void *args) { char* buffer; - short text_width; + int text_width; buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); format_string(buffer, format, args); @@ -342,9 +344,11 @@ void gfx_draw_string_centred(rct_drawpixelinfo *dpi, int format, int x, int y, i text_width = gfx_get_string_width(buffer); // Draw the text centred - if (text_width <= 0xFFFF) { + if (text_width <= 0xFFFF && text_width >= 0) { x -= text_width / 2; gfx_draw_string(dpi, buffer, colour, x, y); + } else { + log_warning("improper text width %d for string %s", text_width, buffer); } } diff --git a/src/localisation/utf8.c b/src/localisation/utf8.c index 9f6763e01e..e6403e1399 100644 --- a/src/localisation/utf8.c +++ b/src/localisation/utf8.c @@ -1,4 +1,5 @@ #include "localisation.h" +#include uint32 utf8_get_next(const utf8 *char_ptr, const utf8 **nextchar_ptr) { diff --git a/src/management/award.c b/src/management/award.c index 4c025f28aa..d2ec346818 100644 --- a/src/management/award.c +++ b/src/management/award.c @@ -414,7 +414,7 @@ static int award_is_deserved_most_disappointing(int awardType, int activeAwardTy disappointingRides = 0; FOR_ALL_RIDES(i, ride) { - if (ride->excitement == 0xFFFF || ride->popularity == 0xFF) + if (ride->excitement == (ride_rating)0xFFFF || ride->popularity == 0xFF) continue; countedRides++; diff --git a/src/peep/peep.c b/src/peep/peep.c index 2c87a5f3c7..0ac27206f2 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -5394,7 +5394,7 @@ rct_peep *peep_generate(int x, int y, int z) cash = 0; } - if (RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_CASH, money16) == 0xFFFF){ + if (RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_CASH, money16) == (money16)0xFFFF){ cash = 0; } @@ -7030,7 +7030,7 @@ static int guest_path_find_leaving_park(rct_peep *peep, rct_map_element *map_ele RCT2_GLOBAL(0x00F1AEE0, uint8) = 1; RCT2_GLOBAL(0x00F1AEE1, uint8) = 0xFF; direction = sub_69A5F0(peep->next_x, peep->next_y, peep->next_z, peep, map_element); - if (direction == -1) + if (direction == 0xFF) return guest_path_find_aimless(peep, edges); else return peep_move_one_tile(direction, peep); @@ -8003,7 +8003,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) goto loc_696658; } } - if (ride->excitement != 0xFFFF) { + if (ride->excitement != (ride_rating)0xFFFF) { if (rideIndex == peep->guest_heading_to_ride_id) { if (ride->intensity > RIDE_RATING(10, 00) && !gConfigCheat.ignore_ride_intensity) goto loc_6965F1; goto loc_696387; diff --git a/src/ride/ride.c b/src/ride/ride.c index 60d326c961..2ba23f6f94 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -2989,9 +2989,9 @@ static void ride_entrance_exit_connected(rct_ride* ride, int ride_idx) entrance = ride->entrances[i], exit = ride->exits[i]; - if (station_start == -1 ) + if (station_start == 0xFFFF ) continue; - if (entrance != -1 && !ride_entrance_exit_is_reachable(entrance, ride, i)) { + if (entrance != 0xFFFF && !ride_entrance_exit_is_reachable(entrance, ride, i)) { // name of ride is parameter of the format string RCT2_GLOBAL(0x013CE952, uint16) = ride->name; RCT2_GLOBAL(0x013CE954, uint32) = ride->name_arguments; @@ -2999,7 +2999,7 @@ static void ride_entrance_exit_connected(rct_ride* ride, int ride_idx) ride->connected_message_throttle = 3; } - if (exit != -1 && !ride_entrance_exit_is_reachable(exit, ride, i)) { + if (exit != 0xFFFF && !ride_entrance_exit_is_reachable(exit, ride, i)) { // name of ride is parameter of the format string RCT2_GLOBAL(0x013CE952, uint16) = ride->name; RCT2_GLOBAL(0x013CE954, uint32) = ride->name_arguments; @@ -5222,17 +5222,17 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi peep->item_standard_flags &= ~PEEP_ITEM_PHOTO; } } - if(peep->item_extra_flags && PEEP_ITEM_PHOTO2){ + if(peep->item_extra_flags & PEEP_ITEM_PHOTO2){ if(peep->photo2_ride_ref == ride_id){ peep->item_extra_flags &= ~PEEP_ITEM_PHOTO2; } } - if(peep->item_extra_flags && PEEP_ITEM_PHOTO3){ + if(peep->item_extra_flags & PEEP_ITEM_PHOTO3){ if(peep->photo3_ride_ref == ride_id){ peep->item_extra_flags &= ~PEEP_ITEM_PHOTO3; } } - if(peep->item_extra_flags && PEEP_ITEM_PHOTO4){ + if(peep->item_extra_flags & PEEP_ITEM_PHOTO4){ if(peep->photo4_ride_ref == ride_id){ peep->item_extra_flags &= ~PEEP_ITEM_PHOTO4; } diff --git a/src/ride/track.c b/src/ride/track.c index 73e5cfde9e..7018fe4e4c 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -543,7 +543,11 @@ rct_track_td6* load_track_design(const char *path) // Decode the track data decoded = malloc(0x10000); decodedLength = sawyercoding_decode_td6(fpBuffer, decoded, fpLength); - realloc(decoded, decodedLength); + decoded = realloc(decoded, decodedLength); + if (decoded == NULL) { + log_error("failed to realloc"); + return 0; + } free(fpBuffer); rct_track_td6* track_design = RCT2_ADDRESS(0x009D8178, rct_track_td6); @@ -2733,7 +2737,7 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra bh = trackElement.element->properties.track.colour >> 4; } - uint8 flags = trackElement.element->type & (1 << 7) | bh; + uint8 flags = (trackElement.element->type & (1 << 7)) | bh; flags |= (trackElement.element->properties.track.colour & 3) << 4; if (RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 4] & (1 << 3) && @@ -2990,7 +2994,7 @@ int save_track_design(uint8 rideIndex){ return 0; } - if (ride->ratings.excitement == 0xFFFF){ + if (ride->ratings.excitement == (ride_rating)0xFFFF){ window_error_open(STR_CANT_SAVE_TRACK_DESIGN, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id)); return 0; } diff --git a/src/util/util.c b/src/util/util.c index d5e8c39b4d..f96fa54731 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -185,4 +185,4 @@ bool utf8_is_bom(const char *str) bool str_is_null_or_empty(const char *str) { return str == NULL || str[0] == 0; -} \ No newline at end of file +} diff --git a/src/windows/editor_bottom_toolbar.c b/src/windows/editor_bottom_toolbar.c index 62a55efa6d..3874d0b05a 100644 --- a/src/windows/editor_bottom_toolbar.c +++ b/src/windows/editor_bottom_toolbar.c @@ -400,7 +400,7 @@ static void window_editor_bottom_toolbar_mouseup(rct_window *w, int widgetIndex) { if (widgetIndex == WIDX_PREVIOUS_STEP_BUTTON) { if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) || - RCT2_GLOBAL(0x13573C8, uint16) == 0x2710 && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_18)) { + (RCT2_GLOBAL(0x13573C8, uint16) == 0x2710 && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_18))) { previous_button_mouseup_events[g_editor_step](); } } else if (widgetIndex == WIDX_NEXT_STEP_BUTTON) { @@ -573,4 +573,4 @@ void window_editor_bottom_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi) } } -} \ No newline at end of file +} diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index f6930b2ad9..17622d1f1d 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -429,8 +429,8 @@ static void window_loadsave_textinput(rct_window *w, int widgetIndex, char *text } strncpy(path, _directory, sizeof(path)); - strncat(path, text, sizeof(path)); - strncat(path, _extension, sizeof(path)); + strncat(path, text, sizeof(path) - strnlen(path, MAX_PATH) - 1); + strncat(path, _extension, sizeof(path) - strnlen(path, MAX_PATH) - 1); overwrite = 0; for (i = 0; i < _listItemsCount; i++) { @@ -604,8 +604,8 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co _shortenedDirectory[0] = '\0'; strncpy(filter, directory, sizeof(filter)); - strncat(filter, "*", sizeof(filter)); - strncat(filter, extension, sizeof(filter)); + strncat(filter, "*", sizeof(filter) - strnlen(filter, MAX_PATH) - 1); + strncat(filter, extension, sizeof(filter) - strnlen(filter, MAX_PATH) - 1); if (_listItems != NULL) free(_listItems); diff --git a/src/windows/themes.c b/src/windows/themes.c index 11e2a8aee4..3c51d80887 100644 --- a/src/windows/themes.c +++ b/src/windows/themes.c @@ -595,7 +595,7 @@ static void window_themes_dropdown(rct_window *w, int widgetIndex, int dropdownI switch (widgetIndex) { case WIDX_THEMES_LIST: if (dropdownIndex != -1) { - get_colour_scheme_tab()->colours[_color_index_2] = dropdownIndex | get_colour_scheme_tab()->colours[_color_index_2] & 0x80; + get_colour_scheme_tab()->colours[_color_index_2] = dropdownIndex | (get_colour_scheme_tab()->colours[_color_index_2] & 0x80); window_invalidate_all(); _color_index_1 = -1; _color_index_2 = -1; From 8ec51b6fc12775b9a9f1c5f8c1becb1f95fd8104 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 29 Aug 2015 02:05:21 +0100 Subject: [PATCH 0652/1173] add FileStream, IStream and IDisposable --- projects/openrct2.vcxproj | 4 ++ projects/openrct2.vcxproj.filters | 15 +++++ src/common.h | 2 + src/core/Exception.hpp | 10 ++++ src/core/FileStream.hpp | 94 +++++++++++++++++++++++++++++++ src/core/IDisposable.hpp | 10 ++++ src/core/IStream.hpp | 75 ++++++++++++++++++++++++ 7 files changed, 210 insertions(+) create mode 100644 src/core/Exception.hpp create mode 100644 src/core/FileStream.hpp create mode 100644 src/core/IDisposable.hpp create mode 100644 src/core/IStream.hpp diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index c5b0a22447..67022bd317 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -203,6 +203,10 @@ + + + + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 9c13072575..b82c90de10 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -53,6 +53,9 @@ {c6b9c169-ff2a-41df-9b1c-47d15763c3e2} + + {28a808eb-9017-44cc-939b-f828fd1e2e7d} + @@ -773,5 +776,17 @@ Source\Interface + + Source\Core + + + Source\Core + + + Source\Core + + + Source\Core + \ No newline at end of file diff --git a/src/common.h b/src/common.h index b8c710cf63..113f5850e5 100644 --- a/src/common.h +++ b/src/common.h @@ -26,4 +26,6 @@ #define SafeFree(x) if ((x) != NULL) { free(x); (x) = NULL; } +#define interface struct + #endif \ No newline at end of file diff --git a/src/core/Exception.hpp b/src/core/Exception.hpp new file mode 100644 index 0000000000..f3daf469e6 --- /dev/null +++ b/src/core/Exception.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include +#include "../common.h" + +class Exception : public std::exception { +public: + Exception() : std::exception() { } + Exception(const char *message) : std::exception(message) { } +}; diff --git a/src/core/FileStream.hpp b/src/core/FileStream.hpp new file mode 100644 index 0000000000..c70dfc90fa --- /dev/null +++ b/src/core/FileStream.hpp @@ -0,0 +1,94 @@ +#pragma once + +#include +#include "../common.h" +#include "IStream.hpp" + +enum { + FILE_MODE_OPEN, + FILE_MODE_WRITE +}; + +/** + * A stream for reading and writing to files. Wraps an SDL_RWops, SDL2's cross platform file stream. + */ +class FileStream : public IStream { +private: + SDL_RWops *_file; + bool _canRead; + bool _canWrite; + bool _disposed; + +public: + FileStream(const utf8 *path, int fileMode) { + const char *mode; + switch (fileMode) { + case FILE_MODE_OPEN: + mode = "rb"; + _canRead = true; + _canWrite = false; + break; + case FILE_MODE_WRITE: + mode = "wb"; + _canRead = false; + _canWrite = true; + break; + default: + throw; + } + + _file = SDL_RWFromFile(path, mode); + if (_file == NULL) { + throw IOException(SDL_GetError()); + } + + _disposed = false; + } + + ~FileStream() { + Dispose(); + } + + void Dispose() override { + if (!_disposed) { + _disposed = true; + SDL_RWclose(_file); + } + } + + bool CanRead() const override { return _canRead; } + bool CanWrite() const override { return _canWrite; } + + sint64 GetLength() const override { return SDL_RWsize(_file); } + sint64 GetPosition() const override { return SDL_RWtell(_file); } + + void SetPosition(sint64 position) override { + Seek(position, STREAM_SEEK_BEGIN); + } + + void Seek(sint64 offset, int origin) override { + switch (origin) { + case STREAM_SEEK_BEGIN: + SDL_RWseek(_file, offset, RW_SEEK_SET); + break; + case STREAM_SEEK_CURRENT: + SDL_RWseek(_file, offset, RW_SEEK_CUR); + break; + case STREAM_SEEK_END: + SDL_RWseek(_file, offset, RW_SEEK_END); + break; + } + } + + void Read(void *buffer, int length) override { + if (SDL_RWread(_file, buffer, length, 1) != 1) { + throw IOException("Attempted to read past end of file."); + } + } + + void Write(const void *buffer, int length) override { + if (SDL_RWwrite(_file, buffer, length, 1) != 1) { + throw IOException("Unable to write to file."); + } + } +}; diff --git a/src/core/IDisposable.hpp b/src/core/IDisposable.hpp new file mode 100644 index 0000000000..1b30559b03 --- /dev/null +++ b/src/core/IDisposable.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "../common.h" + +/** +* Represents an object that can be disposed. So things can explicitly close resources before the destructor kicks in. +*/ +interface IDisposable abstract { + virtual void Dispose() abstract; +}; diff --git a/src/core/IStream.hpp b/src/core/IStream.hpp new file mode 100644 index 0000000000..bc3bb1e01c --- /dev/null +++ b/src/core/IStream.hpp @@ -0,0 +1,75 @@ +#pragma once + +#include "../common.h" +#include "Exception.hpp" +#include "IDisposable.hpp" + +enum { + STREAM_SEEK_BEGIN, + STREAM_SEEK_CURRENT, + STREAM_SEEK_END +}; + +/** + * Represents a stream that can be read or written to. Implemented by types such as FileStream, NetworkStream or MemoryStream. + */ +interface IStream abstract : public IDisposable { + /////////////////////////////////////////////////////////////////////////// + // Interface methods + /////////////////////////////////////////////////////////////////////////// + // virtual ~IStream() abstract; + + virtual bool CanRead() const abstract; + virtual bool CanWrite() const abstract; + + virtual sint64 GetLength() const abstract; + virtual sint64 GetPosition() const abstract; + virtual void SetPosition(sint64 position) abstract; + virtual void Seek(sint64 offset, int origin) abstract; + + virtual void Read(void *buffer, int length) abstract; + virtual void Write(const void *buffer, int length) abstract; + + /////////////////////////////////////////////////////////////////////////// + // Helper methods + /////////////////////////////////////////////////////////////////////////// + + /** + * Reads the size of the given type from the stream directly into the given address. + */ + template + void Read(T *value) { + Read(value, sizeof(T)); + } + + /** + * Writes the size of the given type to the stream directly from the given address. + */ + template + void Write(const T *value) { + Write(value, sizeof(T)); + } + + /** + * Reads the given type from the stream. Use this only for small types (e.g. sint8, sint64, double) + */ + template + T ReadValue() { + T buffer; + Read(&buffer); + return buffer; + } + + /** + * Writes the given type to the stream. Use this only for small types (e.g. sint8, sint64, double) + */ + template + void WriteValue(const T value) { + Write(&value); + } +}; + +class IOException : public Exception { +public: + IOException(const char *message) : Exception(message) { } +}; From 952a4abdd1bc6f97efbde4921d842d54207fe4c9 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 31 Aug 2015 23:06:11 +0100 Subject: [PATCH 0653/1173] implement DAT translation, part 1 --- projects/openrct2.vcxproj | 2 + projects/openrct2.vcxproj.filters | 6 + src/localisation/LanguagePack.cpp | 200 ++++++++++++++++++++++++++++++ src/localisation/LanguagePack.h | 94 ++++++++++++++ src/localisation/language.c | 96 +++++++++----- 5 files changed, 370 insertions(+), 28 deletions(-) create mode 100644 src/localisation/LanguagePack.cpp create mode 100644 src/localisation/LanguagePack.h diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 67022bd317..688622c8a5 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -65,6 +65,7 @@ + @@ -235,6 +236,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index b82c90de10..9cd193edaf 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -537,6 +537,9 @@ Source\World + + Source\Localisation + @@ -788,5 +791,8 @@ Source\Core + + Source\Localisation + \ No newline at end of file diff --git a/src/localisation/LanguagePack.cpp b/src/localisation/LanguagePack.cpp new file mode 100644 index 0000000000..a9deaa3781 --- /dev/null +++ b/src/localisation/LanguagePack.cpp @@ -0,0 +1,200 @@ +extern "C" { + #include "../common.h" + #include "../util/util.h" + #include "localisation.h" +} + +#include "LanguagePack.h" + +#include + +// TODO Move to separate file +class StringBuilder final { +public: + StringBuilder() + { + _buffer = NULL; + _capacity = 0; + _length = 0; + } + + StringBuilder(int capacity) : StringBuilder() + { + EnsureCapacity(capacity); + } + + ~StringBuilder() + { + if (_buffer != NULL) free(_buffer); + } + + utf8 *GetString() const + { + utf8 *result = (utf8*)malloc(_length + 1); + memcpy(result, _buffer, _length); + result[_length] = 0; + return result; + } + + void Append(int codepoint) + { + int codepointLength = utf8_get_codepoint_length(codepoint); + EnsureCapacity(_length + codepointLength + 1); + utf8_write_codepoint(_buffer + _length, codepoint); + _length += codepointLength; + } + + void Append(utf8 *text) + { + int textLength = strlen(text); + + EnsureCapacity(_length + textLength + 1); + memcpy(_buffer + _length, text, textLength); + _length += textLength; + } + +private: + utf8 *_buffer; + size_t _capacity; + size_t _length; + + void EnsureCapacity(size_t capacity) + { + if (_capacity > capacity) return; + + _capacity = max(8, _capacity); + while (_capacity < capacity) { + _capacity *= 2; + } + + if (_buffer == NULL) { + _buffer = (utf8*)malloc(_capacity); + } else { + _buffer = (utf8*)realloc(_buffer, _capacity); + } + } +}; + +LanguagePack *LanguagePack::FromFile(int id, const utf8 *path) +{ + assert(path != NULL); + + int fileLength; + utf8 *fileData; + + // Load file directly into memory + SDL_RWops *file = SDL_RWFromFile(path, "rb"); + if (file == NULL) { + log_error("Unable to open %s", path); + return NULL; + } + + fileLength = (int)SDL_RWsize(file); + fileData = (utf8*)malloc(fileLength); + SDL_RWread(file, fileData, fileLength, 1); + SDL_RWclose(file); + + // Parse the memory as text + LanguagePack *result = FromText(id, fileData); + free(fileData); + + return result; +} + +LanguagePack *LanguagePack::FromText(int id, const utf8 *text) +{ + return new LanguagePack(id, text); +} + +LanguagePack::LanguagePack(int id, const utf8 *text) +{ + assert(text != NULL); + + _id = id; + _stringData = NULL; + _currentGroup = NULL; + + auto reader = UTF8StringReader(text); + +} + +LanguagePack::~LanguagePack() +{ + SafeFree(_stringData); + SafeFree(_currentGroup); +} + +static void SkipWhitespace(IStringReader *reader) +{ + int codepoint; + while (reader->TryPeek(&codepoint)) { + if (codepoint == '\t' || codepoint == ' ' || codepoint == '\r' || codepoint == '\n') { + reader->Skip(); + } else { + break; + } + } +} + +static void SkipToEndOfLine(IStringReader *reader) +{ + int codepoint; + while (reader->TryPeek(&codepoint)) { + if (codepoint != '\r' && codepoint != '\n') { + reader->Skip(); + } else { + break; + } + } +} + +void LanguagePack::ParseLine(IStringReader *reader) +{ + SkipWhitespace(reader); + + int codepoint; + if (!reader->TryPeek(&codepoint)) + return; + + switch (codepoint) { + case '#': + SkipToEndOfLine(reader); + break; + case '[': + ParseGroup(reader); + break; + default: + ParseString(reader); + break; + } +} + +void LanguagePack::ParseGroup(IStringReader *reader) +{ + auto sb = StringBuilder(); + int codepoint; + + // Should have already deduced that the next codepoint is a [ + reader->Skip(); + + // Read string up to ] or line end + bool closedCorrectly = false; + while (reader->TryRead(&codepoint)) { + if (codepoint == '\n' || codepoint == '\r') break; + if (codepoint == ']') { + closedCorrectly = true; + break; + } + sb.Append(codepoint); + } + + if (closedCorrectly) { + SafeFree(_currentGroup); + _currentGroup = sb.GetString(); + } +} + +void LanguagePack::ParseString(IStringReader *reader) +{ + +} diff --git a/src/localisation/LanguagePack.h b/src/localisation/LanguagePack.h new file mode 100644 index 0000000000..a66bc02093 --- /dev/null +++ b/src/localisation/LanguagePack.h @@ -0,0 +1,94 @@ +#pragma once + +#include + +extern "C" { + #include "../common.h" + #include "../util/util.h" + #include "localisation.h" +} + +struct IStringReader abstract { + virtual bool TryPeek(int *outCodepoint) abstract; + virtual bool TryRead(int *outCodepoint) abstract; + virtual void Skip() abstract; +}; + +// TODO Move to separate file in Core +class UTF8StringReader final : public IStringReader { +public: + UTF8StringReader(const utf8 *text) + { + // Skip UTF-8 byte order mark + if (strlen(text) >= 3 && utf8_is_bom(text)) { + text += 3; + } + + _text = text; + _current = text; + } + + bool TryPeek(int *outCodepoint) override + { + if (_current == NULL) return false; + + int codepoint = utf8_get_next(_current, NULL); + *outCodepoint = codepoint; + return true; + } + + bool TryRead(int *outCodepoint) override + { + if (_current == NULL) return false; + + int codepoint = utf8_get_next(_current, &_current); + *outCodepoint = codepoint; + if (codepoint == 0) { + _current = NULL; + return false; + } + return true; + } + + void Skip() override + { + int codepoint; + TryRead(&codepoint); + } + +private: + const utf8 *_text; + const utf8 *_current; +}; + +class LanguagePack final { +public: + static LanguagePack *FromFile(int id, const utf8 *path); + static LanguagePack *FromText(int id, const utf8 *text); + + ~LanguagePack(); + + int GetId() const { return _id; } + int GetCount() const { return _strings.size(); } + +private: + struct ObjectOverride { + char name[8]; + const utf8 *strings[4]; + }; + + int _id; + utf8 *_stringData; + std::vector _strings; + + LanguagePack(int id, const utf8 *text); + + /////////////////////////////////////////////////////////////////////////// + // Parsing + /////////////////////////////////////////////////////////////////////////// + utf8 *_currentGroup; + + void ParseLine(IStringReader *reader); + void ParseGroup(IStringReader *reader); + void ParseString(IStringReader *reader); +}; diff --git a/src/localisation/language.c b/src/localisation/language.c index 089f4f25b9..d2bc8557fe 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -228,6 +228,8 @@ static int language_open_file(const utf8 *filename, language_data *language) char *dst = NULL; char *token = NULL; char tokenBuffer[64]; + char groupBuffer[64]; + int groupLength = 0; int stringIndex = 0, mode = 0, stringId, maxStringId = 0; size_t i = 0; @@ -248,18 +250,39 @@ static int language_open_file(const utf8 *filename, language_data *language) // Search for a comment if (utf8Char == '#') { mode = 3; - } else if (utf8Char == ':' && stringId != -1) { - // Search for colon - dst = src + 1; - language->strings[stringId] = dst; - stringIndex++; - mode = 1; - } else if (!strncmp(src, "STR_", 4)){ - // Copy in the string number, 4 characters only - if (sscanf(src, "STR_%4d", &stringId) != 1) { - stringId = -1; - } else { - maxStringId = max(maxStringId, stringId); + } else if (utf8Char == '[') { + mode = 4; + } + + if (groupLength == 0) { + if (utf8Char == ':' && stringId != -1) { + // Search for colon + dst = src + 1; + language->strings[stringId] = dst; + stringIndex++; + mode = 1; + } else if (!strncmp(src, "STR_", 4)) { + // Copy in the string number, 4 characters only + if (sscanf(src, "STR_%4d", &stringId) != 1) { + stringId = -1; + } else { + maxStringId = max(maxStringId, stringId); + } + } + } else { + if (utf8Char == ':' && stringId != -1) { + // Search for colon + dst = src + 1; + language->strings[stringId] = dst; + stringIndex++; + mode = 1; + } else if (!strncmp(src, "STR_", 4)) { + // Copy in the string number, 4 characters only + if (sscanf(src, "STR_%4d", &stringId) != 1) { + stringId = -1; + } else { + maxStringId = max(maxStringId, stringId); + } } } break; @@ -295,6 +318,21 @@ static int language_open_file(const utf8 *filename, language_data *language) if (utf8Char == '\n' || utf8Char == '\r') { mode = 0; } + break; + case 4: + if (utf8Char == '\n' || utf8Char == '\r') { + groupLength = 0; + mode = 0; + } else if (utf8Char == ']') { + mode = 3; + } else { + if (groupLength < sizeof(groupBuffer) - 1) { + groupBuffer[groupLength + 0] = utf8Char; + groupBuffer[groupLength + 1] = 0; + groupLength++; + } + } + break; } } language->num_strings = maxStringId + 1; @@ -311,21 +349,6 @@ static void language_close(language_data *language) language->string_data_size = 0; } -const int OpenRCT2LangIdToObjectLangId[] = { - 0, - 0, - 1, - 3, - 6, - 2, - 0, - 0, - 4, - 7, - 5, - 13 -}; - #define STEX_BASE_STRING_ID 3447 #define NONSTEX_BASE_STRING_ID 3463 #define MAX_OBJECT_CACHED_STRINGS 2048 @@ -420,7 +443,7 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ char *pString = NULL; int result = 0; bool isBlank; - + while ((languageId = *(*pStringTable)++) != RCT2_LANGUAGE_ID_END) { isBlank = true; @@ -461,6 +484,23 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ while (*(*pStringTable)++ != 0); } + if (RCT2_GLOBAL(0x009ADAFC, uint8) == 0) { + if (type == OBJECT_TYPE_RIDE) { + char name[9]; + memcpy(name, object_entry_groups[type].entries[index].name, 8); + name[8] = 0; + + if (strcmp(name, "MGR1 ") == 0) { + switch (tableindex) { + case 0: return 824; + case 1: return 2142; + } + } + } + } else { + + } + // If not scenario text if (RCT2_GLOBAL(0x009ADAFC, uint8) == 0) { int stringid = NONSTEX_BASE_STRING_ID; From 7a0478404efb34b973e2407c37a9cc298d09a3ee Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 2 Sep 2015 22:00:02 +0100 Subject: [PATCH 0654/1173] add new C++ memory utility functions --- projects/openrct2.vcxproj | 3 + projects/openrct2.vcxproj.filters | 9 +++ src/core/Exception.hpp | 2 + src/core/Memory.hpp | 64 +++++++++++++++++++++ src/core/StringBuilder.hpp | 82 +++++++++++++++++++++++++++ src/core/StringReader.hpp | 57 +++++++++++++++++++ src/localisation/LanguagePack.cpp | 93 +++++-------------------------- src/localisation/LanguagePack.h | 53 +----------------- 8 files changed, 233 insertions(+), 130 deletions(-) create mode 100644 src/core/Memory.hpp create mode 100644 src/core/StringBuilder.hpp create mode 100644 src/core/StringReader.hpp diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 688622c8a5..bca15bf71e 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -208,6 +208,9 @@ + + + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 9cd193edaf..dad1e96ac8 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -794,5 +794,14 @@ Source\Localisation + + Source\Core + + + Source\Core + + + Source\Core + \ No newline at end of file diff --git a/src/core/Exception.hpp b/src/core/Exception.hpp index f3daf469e6..2940d578b0 100644 --- a/src/core/Exception.hpp +++ b/src/core/Exception.hpp @@ -7,4 +7,6 @@ class Exception : public std::exception { public: Exception() : std::exception() { } Exception(const char *message) : std::exception(message) { } + + const char *GetMessage() const { return what(); } }; diff --git a/src/core/Memory.hpp b/src/core/Memory.hpp new file mode 100644 index 0000000000..2e4d77c99a --- /dev/null +++ b/src/core/Memory.hpp @@ -0,0 +1,64 @@ +#pragma once + +/** + * Utility methods for memory management. Typically helpers and wrappers around the C standard library. + */ +namespace Memory { + template + T *Allocate() { + return (T*)malloc(sizeof(T)); + } + + template + T *Allocate(size_t size) { + return (T*)malloc(size); + } + + template + T *AllocateArray(size_t count) { + return (T*)malloc(count * sizeof(T)); + } + + template + T *Reallocate(T *ptr, size_t size) { + if (ptr == NULL) + return (T*)malloc(size); + else + return (T*)realloc((void*)ptr, size); + } + + template + T *ReallocateArray(T *ptr, size_t count) { + if (ptr == NULL) + return (T*)malloc(count * sizeof(T)); + else + return (T*)realloc((void*)ptr, count * sizeof(T)); + } + + template + void Free(T *ptr) { + free((void*)ptr); + } + + template + T *Copy(T *dst, const T *src, size_t size) { + return (T*)memcpy((void*)dst, (const void*)src, size); + } + + template + T *CopyArray(T *dst, const T *src, size_t count) { + return (T*)memcpy((void*)dst, (const void*)src, count * sizeof(T)); + } + + template + T *Duplicate(const T *src, size_t size) { + T *result = Allocate(size); + return Copy(result, src, size); + } + + template + T *DuplicateArray(const T *src, size_t count) { + T *result = AllocateArray(count); + return CopyArray(result, src, count); + } +} diff --git a/src/core/StringBuilder.hpp b/src/core/StringBuilder.hpp new file mode 100644 index 0000000000..251fd5ca5a --- /dev/null +++ b/src/core/StringBuilder.hpp @@ -0,0 +1,82 @@ +#pragma once + +#include "../common.h" +#include "../localisation/localisation.h" +#include "Memory.hpp" + +/** + * Class for constructing strings efficiently. A buffer is automatically allocated and reallocated when characters or strings + * are appended. Use GetString to copy the current state of the string builder to a new fire and forget string. + */ +class StringBuilder final { +public: + StringBuilder() { + _buffer = NULL; + _capacity = 0; + _length = 0; + } + + StringBuilder(int capacity) : StringBuilder() { + EnsureCapacity(capacity); + } + + ~StringBuilder() { + if (_buffer != NULL) Memory::Free(_buffer); + } + + utf8 *GetString() const { + utf8 *result = Memory::AllocateArray(_length + 1); + Memory::CopyArray(result, _buffer, _length); + result[_length] = 0; + return result; + } + + void Append(int codepoint) { + int codepointLength = utf8_get_codepoint_length(codepoint); + EnsureCapacity(_length + codepointLength + 1); + utf8_write_codepoint(_buffer + _length, codepoint); + _length += codepointLength; + _buffer[_length] = 0; + } + + void Append(utf8 *text) { + int textLength = strlen(text); + + EnsureCapacity(_length + textLength + 1); + Memory::Copy(_buffer + _length, text, textLength); + _length += textLength; + _buffer[_length] = 0; + } + + void Clear() { + _length = 0; + if (_capacity >= 1) { + _buffer[_length] = 0; + } + } + + /** + * Gets the current state of the StringBuilder. Warning: this represents the StringBuilder's current working buffer and will + * be deallocated when the StringBuilder is destructed. + */ + const utf8 *GetBuffer() { + return _buffer; + } + +private: + utf8 *_buffer; + size_t _capacity; + size_t _length; + + void EnsureCapacity(size_t capacity) + { + if (_capacity > capacity) return; + + _capacity = max(8, _capacity); + while (_capacity < capacity) { + _capacity *= 2; + } + + _buffer = Memory::ReallocateArray(_buffer, _capacity); + } +}; diff --git a/src/core/StringReader.hpp b/src/core/StringReader.hpp new file mode 100644 index 0000000000..095f7bd285 --- /dev/null +++ b/src/core/StringReader.hpp @@ -0,0 +1,57 @@ +#pragma once + +#include "../common.h" +#include "../localisation/localisation.h" +#include "../util/util.h" + +interface IStringReader abstract { + virtual bool TryPeek(int *outCodepoint) abstract; + virtual bool TryRead(int *outCodepoint) abstract; + virtual void Skip() abstract; +}; + +class UTF8StringReader final : public IStringReader { +public: + UTF8StringReader(const utf8 *text) + { + // Skip UTF-8 byte order mark + if (strlen(text) >= 3 && utf8_is_bom(text)) { + text += 3; + } + + _text = text; + _current = text; + } + + bool TryPeek(int *outCodepoint) override + { + if (_current == NULL) return false; + + int codepoint = utf8_get_next(_current, NULL); + *outCodepoint = codepoint; + return true; + } + + bool TryRead(int *outCodepoint) override + { + if (_current == NULL) return false; + + int codepoint = utf8_get_next(_current, &_current); + *outCodepoint = codepoint; + if (codepoint == 0) { + _current = NULL; + return false; + } + return true; + } + + void Skip() override + { + int codepoint; + TryRead(&codepoint); + } + +private: + const utf8 *_text; + const utf8 *_current; +}; diff --git a/src/localisation/LanguagePack.cpp b/src/localisation/LanguagePack.cpp index a9deaa3781..ecfe0e934e 100644 --- a/src/localisation/LanguagePack.cpp +++ b/src/localisation/LanguagePack.cpp @@ -4,100 +4,37 @@ extern "C" { #include "localisation.h" } +#include "../core/FileStream.hpp" +#include "../core/Memory.hpp" +#include "../core/StringBuilder.hpp" #include "LanguagePack.h" - #include -// TODO Move to separate file -class StringBuilder final { -public: - StringBuilder() - { - _buffer = NULL; - _capacity = 0; - _length = 0; - } - - StringBuilder(int capacity) : StringBuilder() - { - EnsureCapacity(capacity); - } - - ~StringBuilder() - { - if (_buffer != NULL) free(_buffer); - } - - utf8 *GetString() const - { - utf8 *result = (utf8*)malloc(_length + 1); - memcpy(result, _buffer, _length); - result[_length] = 0; - return result; - } - - void Append(int codepoint) - { - int codepointLength = utf8_get_codepoint_length(codepoint); - EnsureCapacity(_length + codepointLength + 1); - utf8_write_codepoint(_buffer + _length, codepoint); - _length += codepointLength; - } - - void Append(utf8 *text) - { - int textLength = strlen(text); - - EnsureCapacity(_length + textLength + 1); - memcpy(_buffer + _length, text, textLength); - _length += textLength; - } - -private: - utf8 *_buffer; - size_t _capacity; - size_t _length; - - void EnsureCapacity(size_t capacity) - { - if (_capacity > capacity) return; - - _capacity = max(8, _capacity); - while (_capacity < capacity) { - _capacity *= 2; - } - - if (_buffer == NULL) { - _buffer = (utf8*)malloc(_capacity); - } else { - _buffer = (utf8*)realloc(_buffer, _capacity); - } - } -}; - LanguagePack *LanguagePack::FromFile(int id, const utf8 *path) { assert(path != NULL); - int fileLength; + uint32 fileLength; utf8 *fileData; // Load file directly into memory - SDL_RWops *file = SDL_RWFromFile(path, "rb"); - if (file == NULL) { - log_error("Unable to open %s", path); + try { + FileStream fs = FileStream(path, FILE_MODE_OPEN); + + fileLength = (uint32)fs.GetLength(); + fileData = Memory::Allocate(fileLength); + fs.Read(fileData, fileLength); + + fs.Dispose(); + } catch (Exception ex) { + log_error("Unable to open %s: %s", path, ex.GetMessage()); return NULL; } - fileLength = (int)SDL_RWsize(file); - fileData = (utf8*)malloc(fileLength); - SDL_RWread(file, fileData, fileLength, 1); - SDL_RWclose(file); - // Parse the memory as text LanguagePack *result = FromText(id, fileData); - free(fileData); + Memory::Free(fileData); return result; } diff --git a/src/localisation/LanguagePack.h b/src/localisation/LanguagePack.h index a66bc02093..10b4c29d8b 100644 --- a/src/localisation/LanguagePack.h +++ b/src/localisation/LanguagePack.h @@ -8,58 +8,7 @@ extern "C" { #include "localisation.h" } -struct IStringReader abstract { - virtual bool TryPeek(int *outCodepoint) abstract; - virtual bool TryRead(int *outCodepoint) abstract; - virtual void Skip() abstract; -}; - -// TODO Move to separate file in Core -class UTF8StringReader final : public IStringReader { -public: - UTF8StringReader(const utf8 *text) - { - // Skip UTF-8 byte order mark - if (strlen(text) >= 3 && utf8_is_bom(text)) { - text += 3; - } - - _text = text; - _current = text; - } - - bool TryPeek(int *outCodepoint) override - { - if (_current == NULL) return false; - - int codepoint = utf8_get_next(_current, NULL); - *outCodepoint = codepoint; - return true; - } - - bool TryRead(int *outCodepoint) override - { - if (_current == NULL) return false; - - int codepoint = utf8_get_next(_current, &_current); - *outCodepoint = codepoint; - if (codepoint == 0) { - _current = NULL; - return false; - } - return true; - } - - void Skip() override - { - int codepoint; - TryRead(&codepoint); - } - -private: - const utf8 *_text; - const utf8 *_current; -}; +#include "../core/StringReader.hpp" class LanguagePack final { public: From 8085abadd33d4837b692b8e4e78f8754eb66f5f1 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 4 Sep 2015 23:27:47 +0100 Subject: [PATCH 0655/1173] add basic support for localisation object string overriding --- projects/openrct2.vcxproj | 2 +- projects/openrct2.vcxproj.filters | 6 +- src/common.h | 4 + src/core/Exception.hpp | 11 +- src/core/IDisposable.hpp | 6 +- src/core/IStream.hpp | 2 +- src/core/StringBuilder.hpp | 53 +++- src/core/StringReader.hpp | 19 +- src/localisation/LanguagePack.cpp | 269 ++++++++++++++++-- src/localisation/LanguagePack.h | 19 +- src/localisation/{language.c => language.cpp} | 253 +++------------- 11 files changed, 384 insertions(+), 260 deletions(-) rename src/localisation/{language.c => language.cpp} (62%) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index bca15bf71e..5e66683591 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -64,7 +64,7 @@ - + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index dad1e96ac8..cd83b092d9 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -216,9 +216,6 @@ Source\Localisation - - Source\Localisation - Source\Ride @@ -540,6 +537,9 @@ Source\Localisation + + Source\Localisation + diff --git a/src/common.h b/src/common.h index 113f5850e5..4ea6488767 100644 --- a/src/common.h +++ b/src/common.h @@ -26,6 +26,10 @@ #define SafeFree(x) if ((x) != NULL) { free(x); (x) = NULL; } +#define SafeDelete(x) if ((x) != nullptr) { delete (x); (x) = nullptr; } +#define SafeDeleteArray(x) if ((x) != nullptr) { delete[] (x); (x) = nullptr; } + #define interface struct +#define abstract = 0 #endif \ No newline at end of file diff --git a/src/core/Exception.hpp b/src/core/Exception.hpp index 2940d578b0..ac3d25d2ad 100644 --- a/src/core/Exception.hpp +++ b/src/core/Exception.hpp @@ -6,7 +6,14 @@ class Exception : public std::exception { public: Exception() : std::exception() { } - Exception(const char *message) : std::exception(message) { } + Exception(const char *message) : std::exception() { + _message = message; + } + virtual ~Exception() { } - const char *GetMessage() const { return what(); } + const char *what() const throw() override { return _message; } + const char *GetMessage() const { return _message; } + +private: + const char *_message; }; diff --git a/src/core/IDisposable.hpp b/src/core/IDisposable.hpp index 1b30559b03..e0cfb58726 100644 --- a/src/core/IDisposable.hpp +++ b/src/core/IDisposable.hpp @@ -3,8 +3,8 @@ #include "../common.h" /** -* Represents an object that can be disposed. So things can explicitly close resources before the destructor kicks in. -*/ -interface IDisposable abstract { + * Represents an object that can be disposed. So things can explicitly close resources before the destructor kicks in. + */ +interface IDisposable { virtual void Dispose() abstract; }; diff --git a/src/core/IStream.hpp b/src/core/IStream.hpp index bc3bb1e01c..00911cc6aa 100644 --- a/src/core/IStream.hpp +++ b/src/core/IStream.hpp @@ -13,7 +13,7 @@ enum { /** * Represents a stream that can be read or written to. Implemented by types such as FileStream, NetworkStream or MemoryStream. */ -interface IStream abstract : public IDisposable { +interface IStream : public IDisposable { /////////////////////////////////////////////////////////////////////////// // Interface methods /////////////////////////////////////////////////////////////////////////// diff --git a/src/core/StringBuilder.hpp b/src/core/StringBuilder.hpp index 251fd5ca5a..2618a3d882 100644 --- a/src/core/StringBuilder.hpp +++ b/src/core/StringBuilder.hpp @@ -6,7 +6,7 @@ /** * Class for constructing strings efficiently. A buffer is automatically allocated and reallocated when characters or strings - * are appended. Use GetString to copy the current state of the string builder to a new fire and forget string. + * are appended. Use GetString to copy the current state of the string builder to a new fire-and-forget string. */ class StringBuilder final { public: @@ -24,13 +24,9 @@ public: if (_buffer != NULL) Memory::Free(_buffer); } - utf8 *GetString() const { - utf8 *result = Memory::AllocateArray(_length + 1); - Memory::CopyArray(result, _buffer, _length); - result[_length] = 0; - return result; - } - + /** + * Appends the given character to the current string. + */ void Append(int codepoint) { int codepointLength = utf8_get_codepoint_length(codepoint); EnsureCapacity(_length + codepointLength + 1); @@ -39,7 +35,10 @@ public: _buffer[_length] = 0; } - void Append(utf8 *text) { + /** + * Appends the given string to the current string. + */ + void Append(const utf8 *text) { int textLength = strlen(text); EnsureCapacity(_length + textLength + 1); @@ -48,6 +47,9 @@ public: _buffer[_length] = 0; } + /** + * Clears the current string, but preserves the allocated memory for another string. + */ void Clear() { _length = 0; if (_capacity >= 1) { @@ -55,14 +57,45 @@ public: } } + /** + * Like Clear, only will guarantee freeing of the underlying buffer. + */ + void Reset() { + _length = 0; + _capacity = 0; + if (_buffer != NULL) { + Memory::Free(_buffer); + } + } + + /** + * Returns the current string buffer as a new fire-and-forget string. + */ + utf8 *GetString() const { + utf8 *result = Memory::AllocateArray(_length + 1); + Memory::CopyArray(result, _buffer, _length); + result[_length] = 0; + return result; + } + /** * Gets the current state of the StringBuilder. Warning: this represents the StringBuilder's current working buffer and will * be deallocated when the StringBuilder is destructed. */ - const utf8 *GetBuffer() { + const utf8 *GetBuffer() const { return _buffer; } + /** + * Gets the amount of allocated memory for the string buffer. + */ + size_t GetCapacity() const { return _capacity; } + + /** + * Gets the length of the current string. + */ + size_t GetLength() const { return _length; } + private: utf8 *_buffer; size_t _capacity; diff --git a/src/core/StringReader.hpp b/src/core/StringReader.hpp index 095f7bd285..196470cc87 100644 --- a/src/core/StringReader.hpp +++ b/src/core/StringReader.hpp @@ -4,16 +4,16 @@ #include "../localisation/localisation.h" #include "../util/util.h" -interface IStringReader abstract { +interface IStringReader { virtual bool TryPeek(int *outCodepoint) abstract; virtual bool TryRead(int *outCodepoint) abstract; virtual void Skip() abstract; + virtual bool CanRead() const abstract; }; class UTF8StringReader final : public IStringReader { public: - UTF8StringReader(const utf8 *text) - { + UTF8StringReader(const utf8 *text) { // Skip UTF-8 byte order mark if (strlen(text) >= 3 && utf8_is_bom(text)) { text += 3; @@ -23,8 +23,7 @@ public: _current = text; } - bool TryPeek(int *outCodepoint) override - { + bool TryPeek(int *outCodepoint) override { if (_current == NULL) return false; int codepoint = utf8_get_next(_current, NULL); @@ -32,8 +31,7 @@ public: return true; } - bool TryRead(int *outCodepoint) override - { + bool TryRead(int *outCodepoint) override { if (_current == NULL) return false; int codepoint = utf8_get_next(_current, &_current); @@ -45,12 +43,15 @@ public: return true; } - void Skip() override - { + void Skip() override { int codepoint; TryRead(&codepoint); } + bool CanRead() const override { + return _current != NULL; + } + private: const utf8 *_text; const utf8 *_current; diff --git a/src/localisation/LanguagePack.cpp b/src/localisation/LanguagePack.cpp index ecfe0e934e..27513a4a58 100644 --- a/src/localisation/LanguagePack.cpp +++ b/src/localisation/LanguagePack.cpp @@ -10,6 +10,9 @@ extern "C" { #include "LanguagePack.h" #include +constexpr rct_string_id ObjectOverrideBase = 0x6000; +constexpr int ObjectOverrideMaxStringCount = 4; + LanguagePack *LanguagePack::FromFile(int id, const utf8 *path) { assert(path != NULL); @@ -50,9 +53,30 @@ LanguagePack::LanguagePack(int id, const utf8 *text) _id = id; _stringData = NULL; _currentGroup = NULL; + _currentObjectOverride = NULL; auto reader = UTF8StringReader(text); + while (reader.CanRead()) { + ParseLine(&reader); + } + _stringData = _stringDataSB.GetString(); + + size_t stringDataBaseAddress = (size_t)_stringData; + for (size_t i = 0; i < _strings.size(); i++) { + _strings[i] = (utf8*)(stringDataBaseAddress + (size_t)_strings[i]); + } + for (size_t i = 0; i < _objectOverrides.size(); i++) { + for (int j = 0; j < ObjectOverrideMaxStringCount; j++) { + const utf8 **strPtr = &(_objectOverrides[i].strings[j]); + if (*strPtr != NULL) { + *strPtr = (utf8*)(stringDataBaseAddress + (size_t)*strPtr); + } + } + } + + // Destruct the string builder to free memory + _stringDataSB = StringBuilder(); } LanguagePack::~LanguagePack() @@ -61,11 +85,100 @@ LanguagePack::~LanguagePack() SafeFree(_currentGroup); } +const utf8 *LanguagePack::GetString(int stringId) const { + if (stringId >= ObjectOverrideBase) { + int offset = stringId - ObjectOverrideBase; + int ooIndex = offset / ObjectOverrideMaxStringCount; + int ooStringIndex = offset % ObjectOverrideMaxStringCount; + + if (_objectOverrides.size() > (size_t)ooIndex) { + return _objectOverrides[ooIndex].strings[ooStringIndex]; + } else { + return NULL; + } + } else { + if (_strings.size() > (size_t)stringId) { + return _strings[stringId]; + } else { + return NULL; + } + } +} + +rct_string_id LanguagePack::GetObjectOverrideStringId(const char *objectIdentifier, int index) +{ + assert(objectIdentifier != NULL); + assert(index < ObjectOverrideMaxStringCount); + + int ooIndex = 0; + for (const ObjectOverride &objectOverride : _objectOverrides) { + if (strncmp(objectOverride.name, objectIdentifier, 8) == 0) { + if (objectOverride.strings[index] == NULL) { + return STR_NONE; + } + return ObjectOverrideBase + (ooIndex * ObjectOverrideMaxStringCount) + index; + } + ooIndex++; + } + + return STR_NONE; +} + +LanguagePack::ObjectOverride *LanguagePack::GetObjectOverride(const char *objectIdentifier) +{ + assert(objectIdentifier != NULL); + + for (size_t i = 0; i < _objectOverrides.size(); i++) { + ObjectOverride *oo = &_objectOverrides[i]; + if (strncmp(oo->name, objectIdentifier, 8) == 0) { + return oo; + } + } + return false; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Parsing +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Partial support to open a uncompiled language file which parses tokens and converts them to the corresponding character +// code. Due to resource strings (strings in scenarios and objects) being written to the original game's string table, +// get_string will use those if the same entry in the loaded language is empty. +// +// Unsure at how the original game decides which entries to write resource strings to, but this could affect adding new +// strings for the time being. Further investigation is required. +// +// When reading the language files, the STR_XXXX part is read and XXXX becomes the string id number. Everything after the colon +// and before the new line will be saved as the string. Tokens are written with inside curly braces {TOKEN}. +// Use # at the beginning of a line to leave a comment. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +static bool IsWhitespace(int codepoint) +{ + return codepoint == '\t' || codepoint == ' ' || codepoint == '\r' || codepoint == '\n'; +} + +static bool IsNewLine(int codepoint) +{ + return codepoint == '\r' || codepoint == '\n'; +} + static void SkipWhitespace(IStringReader *reader) { int codepoint; while (reader->TryPeek(&codepoint)) { - if (codepoint == '\t' || codepoint == ' ' || codepoint == '\r' || codepoint == '\n') { + if (IsWhitespace(codepoint)) { + reader->Skip(); + } else { + break; + } + } +} + +static void SkipNewLine(IStringReader *reader) +{ + int codepoint; + while (reader->TryPeek(&codepoint)) { + if (IsNewLine(codepoint)) { reader->Skip(); } else { break; @@ -90,19 +203,23 @@ void LanguagePack::ParseLine(IStringReader *reader) SkipWhitespace(reader); int codepoint; - if (!reader->TryPeek(&codepoint)) - return; - - switch (codepoint) { - case '#': + if (reader->TryPeek(&codepoint)) { + switch (codepoint) { + case '#': + SkipToEndOfLine(reader); + break; + case '[': + ParseGroup(reader); + break; + case '\r': + case '\n': + break; + default: + ParseString(reader); + break; + } SkipToEndOfLine(reader); - break; - case '[': - ParseGroup(reader); - break; - default: - ParseString(reader); - break; + SkipNewLine(reader); } } @@ -116,8 +233,10 @@ void LanguagePack::ParseGroup(IStringReader *reader) // Read string up to ] or line end bool closedCorrectly = false; - while (reader->TryRead(&codepoint)) { - if (codepoint == '\n' || codepoint == '\r') break; + while (reader->TryPeek(&codepoint)) { + if (IsNewLine(codepoint)) break; + + reader->Skip(); if (codepoint == ']') { closedCorrectly = true; break; @@ -127,11 +246,129 @@ void LanguagePack::ParseGroup(IStringReader *reader) if (closedCorrectly) { SafeFree(_currentGroup); - _currentGroup = sb.GetString(); + + while (sb.GetLength() < 8) { + sb.Append(' '); + } + if (sb.GetLength() == 8) { + _currentGroup = sb.GetString(); + _currentObjectOverride = GetObjectOverride(_currentGroup); + if (_currentObjectOverride == NULL) { + _objectOverrides.push_back(ObjectOverride()); + _currentObjectOverride = &_objectOverrides[_objectOverrides.size() - 1]; + memset(_currentObjectOverride, 0, sizeof(ObjectOverride)); + memcpy(_currentObjectOverride->name, _currentGroup, 8); + } + } } } void LanguagePack::ParseString(IStringReader *reader) { + auto sb = StringBuilder(); + int codepoint; + // Parse string identifier + while (reader->TryPeek(&codepoint)) { + if (IsNewLine(codepoint)) { + // Unexpected new line, ignore line entirely + return; + } else if (!IsWhitespace(codepoint) && codepoint != ':') { + reader->Skip(); + sb.Append(codepoint); + } else { + break; + } + } + + SkipWhitespace(reader); + + // Parse a colon + if (!reader->TryPeek(&codepoint) || codepoint != ':') { + // Expected a colon, ignore line entirely + return; + } + reader->Skip(); + + // Validate identifier + const utf8 *identifier = sb.GetBuffer(); + + int stringId; + if (_currentGroup == NULL) { + if (sscanf(identifier, "STR_%4d", &stringId) != 1) { + // Ignore line entirely + return; + } + } else { + if (strcmp(identifier, "STR_NAME") == 0) { stringId = 0; } + else if (strcmp(identifier, "STR_DESC") == 0) { stringId = 1; } + + else if (strcmp(identifier, "STR_SCNR") == 0) { stringId = 0; } + else if (strcmp(identifier, "STR_PARK") == 0) { stringId = 1; } + else if (strcmp(identifier, "STR_DTLS") == 0) { stringId = 2; } + else { + // Ignore line entirely + return; + } + } + + // Rest of the line is the actual string + sb.Clear(); + while (reader->TryPeek(&codepoint) && !IsNewLine(codepoint)) { + if (codepoint == '{') { + uint32 token; + if (!ParseToken(reader, &token)) { + // Syntax error or unknown token, ignore line entirely + return; + } else { + sb.Append((int)token); + } + } else { + reader->Skip(); + sb.Append(codepoint); + } + } + + // Append a null terminator for the benefit of the last string + _stringDataSB.Append(0); + + // Get the relative offset to the string (add the base offset when we extract the string properly) + utf8 *relativeOffset = (utf8*)_stringDataSB.GetLength(); + + if (_currentGroup == NULL) { + // Make sure the list is big enough to contain this string id + while (_strings.size() <= (size_t)stringId) { + _strings.push_back(NULL); + } + + _strings[stringId] = relativeOffset; + } else { + _currentObjectOverride->strings[stringId] = relativeOffset; + } + + _stringDataSB.Append(sb.GetBuffer()); +} + +bool LanguagePack::ParseToken(IStringReader *reader, uint32 *token) +{ + auto sb = StringBuilder(); + int codepoint; + + // Skip open brace + reader->Skip(); + + while (reader->TryPeek(&codepoint)) { + if (IsNewLine(codepoint)) return false; + if (IsWhitespace(codepoint)) return false; + + reader->Skip(); + + if (codepoint == '}') break; + + sb.Append(codepoint); + } + + const utf8 *tokenName = sb.GetBuffer(); + *token = format_get_code(tokenName); + return true; } diff --git a/src/localisation/LanguagePack.h b/src/localisation/LanguagePack.h index 10b4c29d8b..ba09b387a5 100644 --- a/src/localisation/LanguagePack.h +++ b/src/localisation/LanguagePack.h @@ -8,6 +8,7 @@ extern "C" { #include "localisation.h" } +#include "../core/StringBuilder.hpp" #include "../core/StringReader.hpp" class LanguagePack final { @@ -20,6 +21,16 @@ public: int GetId() const { return _id; } int GetCount() const { return _strings.size(); } + const utf8 *GetString(int stringId) const; + + void SetString(int stringId, const utf8 *str) { + if (_strings.size() >= (size_t)stringId) { + _strings[stringId] = str; + } + } + + rct_string_id GetObjectOverrideStringId(const char *objectIdentifier, int index); + private: struct ObjectOverride { char name[8]; @@ -28,16 +39,22 @@ private: int _id; utf8 *_stringData; - std::vector _strings; + std::vector _strings; + std::vector _objectOverrides; LanguagePack(int id, const utf8 *text); + ObjectOverride *GetObjectOverride(const char *objectIdentifier); /////////////////////////////////////////////////////////////////////////// // Parsing /////////////////////////////////////////////////////////////////////////// + StringBuilder _stringDataSB; utf8 *_currentGroup; + ObjectOverride *_currentObjectOverride; void ParseLine(IStringReader *reader); void ParseGroup(IStringReader *reader); void ParseString(IStringReader *reader); + + bool ParseToken(IStringReader *reader, uint32 *token); }; diff --git a/src/localisation/language.c b/src/localisation/language.cpp similarity index 62% rename from src/localisation/language.c rename to src/localisation/language.cpp index d2bc8557fe..071e6df8a6 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.cpp @@ -18,6 +18,10 @@ * along with this program. If not, see . *****************************************************************************/ +#include "LanguagePack.h" + +extern "C" { + #include "../addresses.h" #include "../drawing/drawing.h" #include "../object.h" @@ -25,14 +29,6 @@ #include "../util/util.h" #include "localisation.h" -typedef struct { - int id; - int num_strings; - char **strings; - size_t string_data_size; - char *string_data; -} language_data; - enum { RCT2_LANGUAGE_ID_ENGLISH_UK, RCT2_LANGUAGE_ID_ENGLISH_US, @@ -88,25 +84,22 @@ const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", &TTFFontMingLiu, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL { "zh-Hans", "Chinese (Simplified)", "Chinese (Simplified)", "chinese_simplified", &TTFFontSimSun, RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED }, // LANGUAGE_CHINESE_SIMPLIFIED { "fi-FI", "Finnish", "Suomi", "finnish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_FINNISH - { "kr-KR", "Korean", "Korean", "korean", &TTFFontMalgun, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_KOREAN + { "kr-KR", "Korean", "Korean", "korean", &TTFFontMalgun, RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN }; int gCurrentLanguage = LANGUAGE_UNDEFINED; bool gUseTrueTypeFont = false; -language_data _languageFallback = { 0 }; -language_data _languageCurrent = { 0 }; +LanguagePack *_languageFallback = nullptr; +LanguagePack *_languageCurrent = nullptr; -const char **_languageOriginal = (char**)0x009BF2D4; +const char **_languageOriginal = (const char**)0x009BF2D4; -const utf8 BlackUpArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xB2, 0x00 }; -const utf8 BlackDownArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xBC, 0x00 }; -const utf8 BlackLeftArrowString[] = { 0xC2, 0x8E, 0xE2, 0x97, 0x80, 0x00 }; -const utf8 BlackRightArrowString[] = { 0xC2, 0x8E, 0xE2, 0x96, 0xB6, 0x00 }; -const utf8 CheckBoxMarkString[] = { 0xE2, 0x9C, 0x93, 0x00 }; - -static int language_open_file(const utf8 *filename, language_data *language); -static void language_close(language_data *language); +const utf8 BlackUpArrowString[] = { (utf8)0xC2, (utf8)0x8E, (utf8)0xE2, (utf8)0x96, (utf8)0xB2, (utf8)0x00 }; +const utf8 BlackDownArrowString[] = { (utf8)0xC2, (utf8)0x8E, (utf8)0xE2, (utf8)0x96, (utf8)0xBC, (utf8)0x00 }; +const utf8 BlackLeftArrowString[] = { (utf8)0xC2, (utf8)0x8E, (utf8)0xE2, (utf8)0x97, (utf8)0x80, (utf8)0x00 }; +const utf8 BlackRightArrowString[] = { (utf8)0xC2, (utf8)0x8E, (utf8)0xE2, (utf8)0x96, (utf8)0xB6, (utf8)0x00 }; +const utf8 CheckBoxMarkString[] = { (utf8)0xE2, (utf8)0x9C, (utf8)0x93, (utf8)0x00 }; void utf8_remove_format_codes(utf8 *text) { @@ -128,10 +121,10 @@ const char *language_get_string(rct_string_id id) if (id == (rct_string_id)STR_NONE) return NULL; - if (_languageCurrent.num_strings > id) - openrctString = _languageCurrent.strings[id]; - if (openrctString == NULL && _languageFallback.num_strings > id) - openrctString = _languageFallback.strings[id]; + if (_languageCurrent != nullptr) + openrctString = _languageCurrent->GetString(id); + if (openrctString == NULL && _languageFallback != nullptr) + openrctString = _languageFallback->GetString(id); if (id >= STR_OPENRCT2_BEGIN_STRING_ID) { return openrctString != NULL ? openrctString : "(undefined string)"; @@ -153,14 +146,12 @@ int language_open(int id) if (id != LANGUAGE_ENGLISH_UK) { sprintf(filename, languagePath, gExePath, LanguagesDescriptors[LANGUAGE_ENGLISH_UK].path); - if (language_open_file(filename, &_languageFallback)) { - _languageFallback.id = LANGUAGE_ENGLISH_UK; - } + _languageFallback = LanguagePack::FromFile(LANGUAGE_ENGLISH_UK, filename); } sprintf(filename, languagePath, gExePath, LanguagesDescriptors[id].path); - if (language_open_file(filename, &_languageCurrent)) { - _languageCurrent.id = id; + _languageCurrent = LanguagePack::FromFile(id, filename); + if (_languageCurrent != NULL) { gCurrentLanguage = id; if (LanguagesDescriptors[id].font == FONT_OPENRCT2_SPRITE) { @@ -184,171 +175,11 @@ int language_open(int id) void language_close_all() { - language_close(&_languageFallback); - language_close(&_languageCurrent); - _languageFallback.id = LANGUAGE_UNDEFINED; - _languageCurrent.id = LANGUAGE_UNDEFINED; + SafeDelete(_languageFallback); + SafeDelete(_languageCurrent); gCurrentLanguage = LANGUAGE_UNDEFINED; } -/** - * Partial support to open a uncompiled language file which parses tokens and converts them to the corresponding character - * code. Due to resource strings (strings in scenarios and objects) being written to the original game's string table, - * get_string will use those if the same entry in the loaded language is empty. - * - * Unsure at how the original game decides which entries to write resource strings to, but this could affect adding new - * strings for the time being. Further investigation is required. - * - * Also note that all strings are currently still ASCII. It probably can't be converted to UTF-8 until all game functions that - * read / write strings in some way is decompiled. The original game used a DIY extended 8-bit extended ASCII set for special - * characters, format codes and accents. - * - * In terms of reading the language files, the STR_XXXX part is read and XXXX becomes the string id number. Everything after the - * colon and before the new line will be saved as the string. Tokens are written with inside curly braces {TOKEN}. - * Use # at the beginning of a line to leave a comment. - */ -static int language_open_file(const utf8 *filename, language_data *language) -{ - assert(filename != NULL); - assert(language != NULL); - - SDL_RWops *f = SDL_RWFromFile(filename, "rb"); - if (f == NULL) - return 0; - - SDL_RWseek(f, 0, RW_SEEK_END); - language->string_data_size = (size_t)(SDL_RWtell(f) + 1); - language->string_data = calloc(1, language->string_data_size); - SDL_RWseek(f, 0, RW_SEEK_SET); - SDL_RWread(f, language->string_data, language->string_data_size, 1); - SDL_RWclose(f); - - language->strings = calloc(STR_COUNT, sizeof(char*)); - - char *dst = NULL; - char *token = NULL; - char tokenBuffer[64]; - char groupBuffer[64]; - int groupLength = 0; - int stringIndex = 0, mode = 0, stringId, maxStringId = 0; - size_t i = 0; - - // Skim UTF-8 byte order mark - if (utf8_is_bom(language->string_data)) - i += 3; - - for (; i < language->string_data_size; i++) { - char *src = &language->string_data[i]; - - // Handle UTF-8 - char *srcNext; - uint32 utf8Char = utf8_get_next(src, (const utf8**)&srcNext); - i += srcNext - src - 1; - - switch (mode) { - case 0: - // Search for a comment - if (utf8Char == '#') { - mode = 3; - } else if (utf8Char == '[') { - mode = 4; - } - - if (groupLength == 0) { - if (utf8Char == ':' && stringId != -1) { - // Search for colon - dst = src + 1; - language->strings[stringId] = dst; - stringIndex++; - mode = 1; - } else if (!strncmp(src, "STR_", 4)) { - // Copy in the string number, 4 characters only - if (sscanf(src, "STR_%4d", &stringId) != 1) { - stringId = -1; - } else { - maxStringId = max(maxStringId, stringId); - } - } - } else { - if (utf8Char == ':' && stringId != -1) { - // Search for colon - dst = src + 1; - language->strings[stringId] = dst; - stringIndex++; - mode = 1; - } else if (!strncmp(src, "STR_", 4)) { - // Copy in the string number, 4 characters only - if (sscanf(src, "STR_%4d", &stringId) != 1) { - stringId = -1; - } else { - maxStringId = max(maxStringId, stringId); - } - } - } - break; - case 1: - // Copy string over, stop at line break - if (utf8Char == '{') { - token = src + 1; - mode = 2; - } else if (utf8Char == '\n' || *src == '\r') { - *dst = 0; - mode = 0; - } else { - dst = utf8_write_codepoint(dst, utf8Char); - } - break; - case 2: - // Read token, convert to code - if (utf8Char == '}') { - int tokenLength = min(src - token, sizeof(tokenBuffer) - 1); - memcpy(tokenBuffer, token, tokenLength); - tokenBuffer[tokenLength] = 0; - uint32 code = format_get_code(tokenBuffer); - if (code == 0) { - code = atoi(tokenBuffer); - *dst++ = code & 0xFF; - } else { - dst = utf8_write_codepoint(dst, code); - } - mode = 1; - } - break; - case 3: - if (utf8Char == '\n' || utf8Char == '\r') { - mode = 0; - } - break; - case 4: - if (utf8Char == '\n' || utf8Char == '\r') { - groupLength = 0; - mode = 0; - } else if (utf8Char == ']') { - mode = 3; - } else { - if (groupLength < sizeof(groupBuffer) - 1) { - groupBuffer[groupLength + 0] = utf8Char; - groupBuffer[groupLength + 1] = 0; - groupLength++; - } - } - break; - } - } - language->num_strings = maxStringId + 1; - language->strings = realloc(language->strings, language->num_strings * sizeof(char*)); - - return 1; -} - -static void language_close(language_data *language) -{ - SafeFree(language->strings); - SafeFree(language->string_data); - language->num_strings = 0; - language->string_data_size = 0; -} - #define STEX_BASE_STRING_ID 3447 #define NONSTEX_BASE_STRING_ID 3463 #define MAX_OBJECT_CACHED_STRINGS 2048 @@ -402,9 +233,9 @@ static wchar_t convert_specific_language_character_to_unicode(int languageId, wc static utf8 *convert_multibyte_charset(const char *src, int languageId) { int reservedLength = (strlen(src) * 4) + 1; - utf8 *buffer = malloc(reservedLength); + utf8 *buffer = (utf8*)malloc(reservedLength); utf8 *dst = buffer; - for (const uint8 *ch = src; *ch != 0;) { + for (const uint8 *ch = (const uint8*)src; *ch != 0;) { if (*ch == 0xFF) { ch++; uint8 a = *ch++; @@ -419,7 +250,7 @@ static utf8 *convert_multibyte_charset(const char *src, int languageId) } *dst++ = 0; int actualLength = dst - buffer; - buffer = realloc(buffer, actualLength); + buffer = (utf8*)realloc(buffer, actualLength); return buffer; } @@ -450,7 +281,7 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ // Strings that are just ' ' are set as invalid langauges. // But if there is no real string then it will set the string as // the blank string - for (char *ch = *pStringTable; *ch != 0; ch++) { + for (char *ch = (char*)(*pStringTable); *ch != 0; ch++) { if (!isblank(*ch)) { isBlank = false; break; @@ -462,21 +293,21 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ // This is the ideal situation. Language found if (languageId == LanguagesDescriptors[gCurrentLanguage].rct2_original_id) { chosenLanguageId = languageId; - pString = *pStringTable; + pString = (char*)(*pStringTable); result |= 1; } // Just in case always load english into pString if (languageId == RCT2_LANGUAGE_ID_ENGLISH_UK && !(result & 1)) { chosenLanguageId = languageId; - pString = *pStringTable; + pString = (char*)(*pStringTable); result |= 2; } // Failing that fall back to whatever is first string if (!(result & 7)) { chosenLanguageId = languageId; - pString = *pStringTable; + pString = (char*)(*pStringTable); if (!isBlank) result |= 4; } @@ -485,20 +316,14 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ } if (RCT2_GLOBAL(0x009ADAFC, uint8) == 0) { - if (type == OBJECT_TYPE_RIDE) { - char name[9]; - memcpy(name, object_entry_groups[type].entries[index].name, 8); - name[8] = 0; + char name[9]; + memcpy(name, object_entry_groups[type].entries[index].name, 8); + name[8] = 0; - if (strcmp(name, "MGR1 ") == 0) { - switch (tableindex) { - case 0: return 824; - case 1: return 2142; - } - } + rct_string_id stringId = _languageCurrent->GetObjectOverrideStringId(name, tableindex); + if (stringId != (rct_string_id)STR_NONE) { + return stringId; } - } else { - } // If not scenario text @@ -528,8 +353,7 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ utf8_trim_string(*cacheString); //put pointer in stringtable - if (_languageCurrent.num_strings > stringid) - _languageCurrent.strings[stringid] = *cacheString; + _languageCurrent->SetString(stringid, *cacheString); // Until all string related functions are finished copy // to old array as well. _languageOriginal[stringid] = *cacheString; @@ -551,11 +375,12 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ utf8_trim_string(*cacheString); //put pointer in stringtable - if (_languageCurrent.num_strings > stringid) - _languageCurrent.strings[stringid] = *cacheString; + _languageCurrent->SetString(stringid, *cacheString); // Until all string related functions are finished copy // to old array as well. _languageOriginal[stringid] = *cacheString; return stringid; } } + +} From 34cd6a92426691b0b382d6dd716cc0f0f1451856 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 5 Sep 2015 01:02:08 +0100 Subject: [PATCH 0656/1173] fix GCC compile issue --- src/core/StringBuilder.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/StringBuilder.hpp b/src/core/StringBuilder.hpp index 2618a3d882..46d9572455 100644 --- a/src/core/StringBuilder.hpp +++ b/src/core/StringBuilder.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include "../common.h" #include "../localisation/localisation.h" #include "Memory.hpp" @@ -105,7 +107,7 @@ private: { if (_capacity > capacity) return; - _capacity = max(8, _capacity); + _capacity = (std::max)(8, _capacity); while (_capacity < capacity) { _capacity *= 2; } From fe7879f0a3fdd7bce8e334e1d401452c252913a4 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 6 Sep 2015 11:04:55 +0100 Subject: [PATCH 0657/1173] add capacity overriding --- src/localisation/LanguagePack.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/localisation/LanguagePack.cpp b/src/localisation/LanguagePack.cpp index 27513a4a58..e2a9ca60ad 100644 --- a/src/localisation/LanguagePack.cpp +++ b/src/localisation/LanguagePack.cpp @@ -302,6 +302,7 @@ void LanguagePack::ParseString(IStringReader *reader) } else { if (strcmp(identifier, "STR_NAME") == 0) { stringId = 0; } else if (strcmp(identifier, "STR_DESC") == 0) { stringId = 1; } + else if (strcmp(identifier, "STR_CPTY") == 0) { stringId = 2; } else if (strcmp(identifier, "STR_SCNR") == 0) { stringId = 0; } else if (strcmp(identifier, "STR_PARK") == 0) { stringId = 1; } From fc65a92275215b38b3d4669cb60b3815209a0020 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 7 Sep 2015 22:05:36 +0100 Subject: [PATCH 0658/1173] fix object override strings for scenario editor and plugin.dat --- projects/openrct2.vcxproj | 1 + projects/openrct2.vcxproj.filters | 3 +++ src/core/Math.hpp | 23 +++++++++++++++++++ src/core/StringBuilder.hpp | 5 ++-- src/localisation/language.cpp | 14 +++++++----- src/object.c | 3 +++ src/object.h | 1 + src/object_list.c | 38 ++++++++++++++++++++++++++++++- 8 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 src/core/Math.hpp diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 5e66683591..cd66b434b3 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -208,6 +208,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index cd83b092d9..070539ff77 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -803,5 +803,8 @@ Source\Core + + Source\Core + \ No newline at end of file diff --git a/src/core/Math.hpp b/src/core/Math.hpp new file mode 100644 index 0000000000..1e5902c124 --- /dev/null +++ b/src/core/Math.hpp @@ -0,0 +1,23 @@ +#pragma once + +/** + * Common mathematical functions. + */ +namespace Math { + + template + T Min(T a, T b) { + return a < b ? a : b; + } + + template + T Max(T a, T b) { + return a > b ? a : b; + } + + template + T Clamp(T low, T x, T max) { + return Min(Max(low, x), high); + } + +} diff --git a/src/core/StringBuilder.hpp b/src/core/StringBuilder.hpp index 46d9572455..b96c1cbe89 100644 --- a/src/core/StringBuilder.hpp +++ b/src/core/StringBuilder.hpp @@ -1,9 +1,8 @@ #pragma once -#include - #include "../common.h" #include "../localisation/localisation.h" +#include "Math.hpp" #include "Memory.hpp" /** @@ -107,7 +106,7 @@ private: { if (_capacity > capacity) return; - _capacity = (std::max)(8, _capacity); + _capacity = Math::Max(8U, _capacity); while (_capacity < capacity) { _capacity *= 2; } diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index 071e6df8a6..1f7904072f 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -315,15 +315,17 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ while (*(*pStringTable)++ != 0); } + char name[9]; if (RCT2_GLOBAL(0x009ADAFC, uint8) == 0) { - char name[9]; memcpy(name, object_entry_groups[type].entries[index].name, 8); - name[8] = 0; + } else { + memcpy(name, gTempObjectLoadName, 8); + } + name[8] = 0; - rct_string_id stringId = _languageCurrent->GetObjectOverrideStringId(name, tableindex); - if (stringId != (rct_string_id)STR_NONE) { - return stringId; - } + rct_string_id stringId = _languageCurrent->GetObjectOverrideStringId(name, tableindex); + if (stringId != (rct_string_id)STR_NONE) { + return stringId; } // If not scenario text diff --git a/src/object.c b/src/object.c index c5d7af1f37..4295cbb146 100644 --- a/src/object.c +++ b/src/object.c @@ -33,6 +33,8 @@ #include "scenario.h" #include "rct1.h" +char gTempObjectLoadName[9] = { 0 }; + int object_load_entry(const utf8 *path, rct_object_entry *outEntry) { SDL_RWops *file; @@ -1566,6 +1568,7 @@ int object_get_scenario_text(rct_object_entry *entry) // Tell text to be loaded into a different address RCT2_GLOBAL(0x009ADAFC, uint8) = 255; + memcpy(gTempObjectLoadName, openedEntry.name, 8); // Not used?? RCT2_GLOBAL(0x009ADAFD, uint8) = 1; object_paint(openedEntry.flags & 0x0F, 0, 0, 0, 0, (int)chunk, 0, 0); diff --git a/src/object.h b/src/object.h index ad7d7c66bd..18c11087d9 100644 --- a/src/object.h +++ b/src/object.h @@ -91,6 +91,7 @@ typedef struct { } rct_object_filters; extern rct_object_entry_group object_entry_groups[]; +extern char gTempObjectLoadName[9]; int object_load_entry(const utf8 *path, rct_object_entry *outEntry); void object_list_load(); diff --git a/src/object_list.c b/src/object_list.c index 1e96973ee5..7fd147949c 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -27,6 +27,10 @@ #include "util/sawyercoding.h" #include "game.h" #include "rct1.h" +#include "world/entrance.h" +#include "world/footpath.h" +#include "world/scenery.h" +#include "world/water.h" #define OBJECT_ENTRY_GROUP_COUNT 11 #define OBJECT_ENTRY_COUNT 721 @@ -673,6 +677,33 @@ rct_object_entry *object_list_find(rct_object_entry *entry) return NULL; } +rct_string_id object_get_name_string_id(rct_object_entry *entry, const void *chunk) +{ + int objectType = entry->flags & 0x0F; + switch (objectType) { + case OBJECT_TYPE_RIDE: + return ((rct_ride_type*)chunk)->name; + case OBJECT_TYPE_SMALL_SCENERY: + case OBJECT_TYPE_LARGE_SCENERY: + case OBJECT_TYPE_WALLS: + case OBJECT_TYPE_BANNERS: + case OBJECT_TYPE_PATH_BITS: + return ((rct_scenery_entry*)chunk)->name; + case OBJECT_TYPE_PATHS: + return ((rct_path_type*)chunk)->string_idx; + case OBJECT_TYPE_SCENERY_SETS: + return ((rct_scenery_set_entry*)chunk)->name; + case OBJECT_TYPE_PARK_ENTRANCE: + return ((rct_entrance_type*)chunk)->string_idx; + case OBJECT_TYPE_WATER: + return ((rct_water_type*)chunk)->string_idx; + case OBJECT_TYPE_SCENARIO_TEXT: + return ((rct_stex_entry*)chunk)->scenario_name; + default: + return STR_NONE; + } +} + /* Installs an object_entry at the desired installed_entry address * Returns the size of the new entry. Will return 0 on failure. */ @@ -740,7 +771,12 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in load_object_filter(entry, chunk, filter); // Always extract only the vehicle type, since the track type is always displayed in the left column, to prevent duplicate track names. - strcpy(installed_entry_pointer, language_get_string((rct_string_id)RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_BASE_STRING_ID, uint32))); + rct_string_id nameStringId = object_get_name_string_id(entry, chunk); + if (nameStringId == STR_NONE) { + nameStringId = (rct_string_id)RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_BASE_STRING_ID, uint32); + } + + strcpy(installed_entry_pointer, language_get_string(nameStringId)); while (*installed_entry_pointer++); // This is deceptive. Due to setting the total no images earlier to 0xF26E From 188978936b9b22d7584a1e05f7b4ef9ecfae1a8b Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 8 Sep 2015 11:44:55 +0200 Subject: [PATCH 0659/1173] Fix Math.Clamp definition --- src/core/Math.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Math.hpp b/src/core/Math.hpp index 1e5902c124..939159db08 100644 --- a/src/core/Math.hpp +++ b/src/core/Math.hpp @@ -16,7 +16,7 @@ namespace Math { } template - T Clamp(T low, T x, T max) { + T Clamp(T low, T x, T high) { return Min(Max(low, x), high); } From fddf057d6874b69c747d866553d87b039f611b58 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 8 Sep 2015 18:46:22 +0100 Subject: [PATCH 0660/1173] add scenario overrides --- src/localisation/LanguagePack.cpp | 106 ++++++++++++++++++++++++++++-- src/localisation/LanguagePack.h | 19 +++++- src/localisation/language.cpp | 11 ++++ src/localisation/language.h | 2 + src/scenario.c | 81 ++++++++++++++++------- 5 files changed, 192 insertions(+), 27 deletions(-) diff --git a/src/localisation/LanguagePack.cpp b/src/localisation/LanguagePack.cpp index e2a9ca60ad..cacc01da88 100644 --- a/src/localisation/LanguagePack.cpp +++ b/src/localisation/LanguagePack.cpp @@ -13,6 +13,9 @@ extern "C" { constexpr rct_string_id ObjectOverrideBase = 0x6000; constexpr int ObjectOverrideMaxStringCount = 4; +constexpr rct_string_id ScenarioOverrideBase = 0x7000; +constexpr int ScenarioOverrideMaxStringCount = 3; + LanguagePack *LanguagePack::FromFile(int id, const utf8 *path) { assert(path != NULL); @@ -54,6 +57,7 @@ LanguagePack::LanguagePack(int id, const utf8 *text) _stringData = NULL; _currentGroup = NULL; _currentObjectOverride = NULL; + _currentScenarioOverride = NULL; auto reader = UTF8StringReader(text); while (reader.CanRead()) { @@ -74,6 +78,14 @@ LanguagePack::LanguagePack(int id, const utf8 *text) } } } + for (size_t i = 0; i < _scenarioOverrides.size(); i++) { + for (int j = 0; j < ScenarioOverrideMaxStringCount; j++) { + const utf8 **strPtr = &(_scenarioOverrides[i].strings[j]); + if (*strPtr != NULL) { + *strPtr = (utf8*)(stringDataBaseAddress + (size_t)*strPtr); + } + } + } // Destruct the string builder to free memory _stringDataSB = StringBuilder(); @@ -86,7 +98,17 @@ LanguagePack::~LanguagePack() } const utf8 *LanguagePack::GetString(int stringId) const { - if (stringId >= ObjectOverrideBase) { + if (stringId >= ScenarioOverrideBase) { + int offset = stringId - ScenarioOverrideBase; + int ooIndex = offset / ScenarioOverrideMaxStringCount; + int ooStringIndex = offset % ScenarioOverrideMaxStringCount; + + if (_scenarioOverrides.size() > (size_t)ooIndex) { + return _scenarioOverrides[ooIndex].strings[ooStringIndex]; + } else { + return NULL; + } + }else if (stringId >= ObjectOverrideBase) { int offset = stringId - ObjectOverrideBase; int ooIndex = offset / ObjectOverrideMaxStringCount; int ooStringIndex = offset % ObjectOverrideMaxStringCount; @@ -124,6 +146,25 @@ rct_string_id LanguagePack::GetObjectOverrideStringId(const char *objectIdentifi return STR_NONE; } +rct_string_id LanguagePack::GetScenarioOverrideStringId(const utf8 *scenarioFilename, int index) +{ + assert(scenarioFilename != NULL); + assert(index < ScenarioOverrideMaxStringCount); + + int ooIndex = 0; + for (const ScenarioOverride &scenarioOverride : _scenarioOverrides) { + if (_stricmp(scenarioOverride.filename, scenarioFilename) == 0) { + if (scenarioOverride.strings[index] == NULL) { + return STR_NONE; + } + return ScenarioOverrideBase + (ooIndex * ScenarioOverrideMaxStringCount) + index; + } + ooIndex++; + } + + return STR_NONE; +} + LanguagePack::ObjectOverride *LanguagePack::GetObjectOverride(const char *objectIdentifier) { assert(objectIdentifier != NULL); @@ -137,6 +178,19 @@ LanguagePack::ObjectOverride *LanguagePack::GetObjectOverride(const char *object return false; } +LanguagePack::ScenarioOverride *LanguagePack::GetScenarioOverride(const utf8 *scenarioIdentifier) +{ + assert(scenarioIdentifier != NULL); + + for (size_t i = 0; i < _scenarioOverrides.size(); i++) { + ScenarioOverride *so = &_scenarioOverrides[i]; + if (_stricmp(so->name, scenarioIdentifier) == 0) { + return so; + } + } + return false; +} + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Parsing //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -209,7 +263,10 @@ void LanguagePack::ParseLine(IStringReader *reader) SkipToEndOfLine(reader); break; case '[': - ParseGroup(reader); + ParseGroupObject(reader); + break; + case '<': + ParseGroupScenario(reader); break; case '\r': case '\n': @@ -223,7 +280,7 @@ void LanguagePack::ParseLine(IStringReader *reader) } } -void LanguagePack::ParseGroup(IStringReader *reader) +void LanguagePack::ParseGroupObject(IStringReader *reader) { auto sb = StringBuilder(); int codepoint; @@ -253,6 +310,7 @@ void LanguagePack::ParseGroup(IStringReader *reader) if (sb.GetLength() == 8) { _currentGroup = sb.GetString(); _currentObjectOverride = GetObjectOverride(_currentGroup); + _currentScenarioOverride = NULL; if (_currentObjectOverride == NULL) { _objectOverrides.push_back(ObjectOverride()); _currentObjectOverride = &_objectOverrides[_objectOverrides.size() - 1]; @@ -263,6 +321,42 @@ void LanguagePack::ParseGroup(IStringReader *reader) } } +void LanguagePack::ParseGroupScenario(IStringReader *reader) +{ + auto sb = StringBuilder(); + int codepoint; + + // Should have already deduced that the next codepoint is a < + reader->Skip(); + + // Read string up to > or line end + bool closedCorrectly = false; + while (reader->TryPeek(&codepoint)) { + if (IsNewLine(codepoint)) break; + + reader->Skip(); + if (codepoint == '>') { + closedCorrectly = true; + break; + } + sb.Append(codepoint); + } + + if (closedCorrectly) { + SafeFree(_currentGroup); + + _currentGroup = sb.GetString(); + _currentObjectOverride = NULL; + _currentScenarioOverride = GetScenarioOverride(_currentGroup); + if (_currentScenarioOverride == NULL) { + _scenarioOverrides.push_back(ScenarioOverride()); + _currentScenarioOverride = &_scenarioOverrides[_scenarioOverrides.size() - 1]; + memset(_currentScenarioOverride, 0, sizeof(ObjectOverride)); + _currentScenarioOverride->filename = sb.GetString(); + } + } +} + void LanguagePack::ParseString(IStringReader *reader) { auto sb = StringBuilder(); @@ -344,7 +438,11 @@ void LanguagePack::ParseString(IStringReader *reader) _strings[stringId] = relativeOffset; } else { - _currentObjectOverride->strings[stringId] = relativeOffset; + if (_currentObjectOverride != NULL) { + _currentObjectOverride->strings[stringId] = relativeOffset; + } else { + _currentScenarioOverride->strings[stringId] = relativeOffset; + } } _stringDataSB.Append(sb.GetBuffer()); diff --git a/src/localisation/LanguagePack.h b/src/localisation/LanguagePack.h index ba09b387a5..56a3479184 100644 --- a/src/localisation/LanguagePack.h +++ b/src/localisation/LanguagePack.h @@ -30,6 +30,7 @@ public: } rct_string_id GetObjectOverrideStringId(const char *objectIdentifier, int index); + rct_string_id GetScenarioOverrideStringId(const utf8 *scenarioFilename, int index); private: struct ObjectOverride { @@ -37,13 +38,27 @@ private: const utf8 *strings[4]; }; + struct ScenarioOverride { + const utf8 *filename; + union { + const utf8 *strings[3]; + struct { + const utf8 *name; + const utf8 *park; + const utf8 *details; + }; + }; + }; + int _id; utf8 *_stringData; std::vector _strings; std::vector _objectOverrides; + std::vector _scenarioOverrides; LanguagePack(int id, const utf8 *text); ObjectOverride *GetObjectOverride(const char *objectIdentifier); + ScenarioOverride *GetScenarioOverride(const utf8 *scenarioFilename); /////////////////////////////////////////////////////////////////////////// // Parsing @@ -51,9 +66,11 @@ private: StringBuilder _stringDataSB; utf8 *_currentGroup; ObjectOverride *_currentObjectOverride; + ScenarioOverride *_currentScenarioOverride; void ParseLine(IStringReader *reader); - void ParseGroup(IStringReader *reader); + void ParseGroupObject(IStringReader *reader); + void ParseGroupScenario(IStringReader *reader); void ParseString(IStringReader *reader); bool ParseToken(IStringReader *reader, uint32 *token); diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index 1f7904072f..5d3323408a 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -385,4 +385,15 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ } } +bool language_get_localised_scenario_strings(const utf8 *scenarioFilename, rct_string_id *outStringIds) +{ + outStringIds[0] = _languageCurrent->GetScenarioOverrideStringId(scenarioFilename, 0); + outStringIds[1] = _languageCurrent->GetScenarioOverrideStringId(scenarioFilename, 1); + outStringIds[2] = _languageCurrent->GetScenarioOverrideStringId(scenarioFilename, 2); + return + outStringIds[0] != (rct_string_id)STR_NONE || + outStringIds[1] != (rct_string_id)STR_NONE || + outStringIds[2] != (rct_string_id)STR_NONE; +} + } diff --git a/src/localisation/language.h b/src/localisation/language.h index 66b7928306..4cc301146e 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -82,4 +82,6 @@ int utf8_length(const utf8 *text); wchar_t *utf8_to_widechar(const utf8 *src); utf8 *widechar_to_utf8(const wchar_t *src); +bool language_get_localised_scenario_strings(const utf8 *scenarioFilename, rct_string_id *outStringIds); + #endif diff --git a/src/scenario.c b/src/scenario.c index 0a8ddebea0..d8260bae5f 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -73,14 +73,29 @@ int scenario_load_basic(const char *path, rct_s6_header *header, rct_s6_info *in SDL_RWclose(rw); RCT2_GLOBAL(0x009AA00C, uint8) = 0; - // Checks for a scenario string object (possibly for localisation) - if ((info->entry.flags & 0xFF) != 255) { - if (object_get_scenario_text(&info->entry)) { - rct_stex_entry* stex_entry = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TEXT_TEMP_CHUNK, rct_stex_entry*); - format_string(info->name, stex_entry->scenario_name, NULL); - format_string(info->details, stex_entry->details, NULL); - RCT2_GLOBAL(0x009AA00C, uint8) = stex_entry->var_06; - object_free_scenario_text(); + // Get filename + utf8 filename[MAX_PATH]; + strcpy(filename, path_get_filename(path)); + path_remove_extension(filename); + + rct_string_id localisedStringIds[3]; + if (language_get_localised_scenario_strings(filename, localisedStringIds)) { + if (localisedStringIds[0] != (rct_string_id)STR_NONE) { + strncpy(info->name, language_get_string(localisedStringIds[0]), 64); + } + if (localisedStringIds[2] != (rct_string_id)STR_NONE) { + strncpy(info->details, language_get_string(localisedStringIds[2]), 256); + } + } else { + // Checks for a scenario string object (possibly for localisation) + if ((info->entry.flags & 0xFF) != 255) { + if (object_get_scenario_text(&info->entry)) { + rct_stex_entry* stex_entry = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TEXT_TEMP_CHUNK, rct_stex_entry*); + format_string(info->name, stex_entry->scenario_name, NULL); + format_string(info->details, stex_entry->details, NULL); + RCT2_GLOBAL(0x009AA00C, uint8) = stex_entry->var_06; + object_free_scenario_text(); + } } } return 1; @@ -282,23 +297,45 @@ void scenario_begin() strcpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, s6Info->details); strcpy((char*)RCT2_ADDRESS_SCENARIO_NAME, s6Info->name); - rct_stex_entry* stex = g_stexEntries[0]; - if ((int)stex != -1) { - char *buffer = (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER; + { + // Get filename + utf8 filename[MAX_PATH]; + strcpy(filename, _scenarioFileName); + path_remove_extension(filename); - // Set localised park name - format_string(buffer, stex->park_name, 0); - park_set_name(buffer); + rct_string_id localisedStringIds[3]; + if (language_get_localised_scenario_strings(filename, localisedStringIds)) { + if (localisedStringIds[0] != (rct_string_id)STR_NONE) { + strncpy((char*)RCT2_ADDRESS_SCENARIO_NAME, language_get_string(localisedStringIds[0]), 31); + ((char*)RCT2_ADDRESS_SCENARIO_NAME)[31] = '\0'; + } + if (localisedStringIds[1] != (rct_string_id)STR_NONE) { + park_set_name(language_get_string(localisedStringIds[1])); + } + if (localisedStringIds[2] != (rct_string_id)STR_NONE) { + strncpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, language_get_string(localisedStringIds[2]), 255); + ((char*)RCT2_ADDRESS_SCENARIO_DETAILS)[255] = '\0'; + } + } else { + rct_stex_entry* stex = g_stexEntries[0]; + if ((int)stex != -1) { + char *buffer = (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER; - // Set localised scenario name - format_string(buffer, stex->scenario_name, 0); - strncpy((char*)RCT2_ADDRESS_SCENARIO_NAME, buffer, 31); - ((char*)RCT2_ADDRESS_SCENARIO_NAME)[31] = '\0'; + // Set localised park name + format_string(buffer, stex->park_name, 0); + park_set_name(buffer); - // Set localised scenario details - format_string(buffer, stex->details, 0); - strncpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, buffer, 255); - ((char*)RCT2_ADDRESS_SCENARIO_DETAILS)[255] = '\0'; + // Set localised scenario name + format_string(buffer, stex->scenario_name, 0); + strncpy((char*)RCT2_ADDRESS_SCENARIO_NAME, buffer, 31); + ((char*)RCT2_ADDRESS_SCENARIO_NAME)[31] = '\0'; + + // Set localised scenario details + format_string(buffer, stex->details, 0); + strncpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, buffer, 255); + ((char*)RCT2_ADDRESS_SCENARIO_DETAILS)[255] = '\0'; + } + } } // Set the last saved game path From d7a7a81cd0cb4ee832362b41cf44a58b80ec4b12 Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 9 Sep 2015 04:00:15 +0100 Subject: [PATCH 0661/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/finnish.txt | 791 +++++++++++++++++++------------------- 1 file changed, 397 insertions(+), 394 deletions(-) diff --git a/data/language/finnish.txt b/data/language/finnish.txt index a643c037d3..5103dd37d4 100644 --- a/data/language/finnish.txt +++ b/data/language/finnish.txt @@ -4,23 +4,23 @@ STR_0000 : STR_0001 :{STRINGID} {COMMA16} STR_0002 :Kierrevuoristorata -STR_0003 :Stand-up Roller Coaster -STR_0004 :Suspended Swinging Coaster +STR_0003 :Seisomavuoristorata +STR_0004 :Riippukeinuvuoristorata STR_0005 :Käänteinen vuoristorata STR_0006 :Juniorivuoristorata STR_0007 :Pienoisrautatie -STR_0008 :Yksiraiteinen -STR_0009 :Mini Suspended Coaster +STR_0008 :Yksiraiteinen rautatie +STR_0009 :Pieni riippuva vuoristorata STR_0010 :Veneajelu STR_0011 :Puinen villihiiri -STR_0012 :Steeplechase +STR_0012 :Estejuoksu STR_0013 :Autoajelu -STR_0014 :Launched Freefall -STR_0015 :Rattikelkkavuoristorata +STR_0014 :Laukaistu vapaapudotus +STR_0015 :Rattikelkkarata STR_0016 :Näköalatorni -STR_0017 :Looping Roller Coaster -STR_0018 :Dinghy Slide -STR_0019 :Mine Train Coaster +STR_0017 :Silmukkavuoristorata +STR_0018 :Veneliukumäki +STR_0019 :Kaivosjunarata STR_0020 :Tuolihissi STR_0021 :Korkkiruuvivuoristorata STR_0022 :Labyrintti @@ -30,7 +30,7 @@ STR_0025 :Tukkijoki STR_0026 :Koskiseikkailu STR_0027 :Törmäysautot STR_0028 :Merirosvolaiva -STR_0029 :Swinging Inverter Ship +STR_0029 :Keinuva käänteinen laiva STR_0030 :Ruokakoju STR_0031 :Tuntematon koju (1D) STR_0032 :Juomakoju @@ -38,62 +38,63 @@ STR_0033 :Tuntematon koju (1F) STR_0034 :Kauppa STR_0035 :Karuselli STR_0036 :Tuntematon koju (22) -STR_0037 :Information Kiosk -STR_0038 :WC +STR_0037 :Infokioski +STR_0038 :Vessa STR_0039 :Maailmanpyörä STR_0040 :Liikesimulaattori STR_0041 :3D-teatteri -STR_0042 :Top Spin -STR_0043 :Space Rings -STR_0044 :Reverse Freefall Coaster +STR_0042 :Yläpyörähdys +STR_0043 :Avaruusrenkaat +STR_0044 :Päinvastainen vapaapudotusrata STR_0045 :Hissi -STR_0046 :Vertical Drop Roller Coaster -STR_0047 :Kassakone -STR_0048 :Twist +STR_0046 :Pystysuora tiputusvuoristorata +STR_0047 :Pankkiautomaatti +STR_0048 :Vääntely STR_0049 :Kummitustalo STR_0050 :Ensiapuhuone STR_0051 :Sirkusesitys STR_0052 :Kummitusjuna -STR_0053 :Steel Twister Roller Coaster +STR_0053 :Teräskiehkuravuoristorata STR_0054 :Puinen vuoristorata -STR_0055 :Side-Friction Roller Coaster +STR_0055 :Sivukitkavuoristorata STR_0056 :Villihiiri -STR_0057 :Moniulottuvuus-vuoristorata +STR_0057 :Moniulottuvuusvuoristorata STR_0058 :Tuntematon laite (38) STR_0059 :Lentävä vuoristorata STR_0060 :Tuntematon laite (3A) -STR_0061 :Virginia Reel -STR_0062 :Splash Boats +STR_0061 :Virginian kela +STR_0062 :Roiskahdusveneet STR_0063 :Minihelikopterit -STR_0064 :Lay-down Roller Coaster -STR_0065 :Suspended Monorail +STR_0064 :Makuuvuoristorata +STR_0065 :Riippuva yksiraiteinen rautatie STR_0066 :Tuntematon laite (40) -STR_0067 :Reverser Roller Coaster -STR_0068 :Heartline Twister Coaster -STR_0069 :Mini Golf -STR_0070 :Giga Coaster -STR_0071 :Roto-Drop +STR_0067 :Päinvastainen vuoristorata +STR_0068 :Sydänviivakiehkurarata +STR_0069 :Minigolffi +STR_0070 :Jättirata +STR_0071 :Pyörivä tiputus STR_0072 :Lentävät lautaset -STR_0073 :Crooked House -STR_0074 :Monorail Cycles -STR_0075 :Compact Inverted Coaster -STR_0076 :Water Coaster -STR_0077 :Air Powered Vertical Coaster -STR_0078 :Inverted Hairpin Coaster +STR_0073 :Kiero talo +STR_0074 :yksiraiteinen rautatiekierto +STR_0075 :Tiivis käänteinen rata +STR_0076 :Vesirata +STR_0077 :Ilmakäyttöinen pystysuora rata +STR_0078 :Kääteinenhiusneularata STR_0079 :Taikamatto STR_0080 :Sukellusveneajelu STR_0081 :Jokilautat STR_0082 :Tuntematon laite (50) -STR_0083 :Yhtiö +# 0083 is a name, and can't be translated. The ride itself was named after USS Enterprise from star trek, see wikipedia. +STR_0083 :Enterprise STR_0084 :Tuntematon laite (52) STR_0085 :Tuntematon laite (53) STR_0086 :Tuntematon laite (54) STR_0087 :Tuntematon laite (55) -STR_0088 :Inverted Impulse Coaster +STR_0088 :Käänteinen impulssirata STR_0089 :Minivuoristorata STR_0090 :Kaivosajelu STR_0091 :Tuntematon laite (59) -STR_0092 :LIM Launched Roller Coaster +STR_0092 :Induktiomoottorilaukaisuvuoristorata STR_0093 : STR_0094 : STR_0095 : @@ -823,7 +824,7 @@ STR_0818 :Syys STR_0819 :Loka STR_0820 :Marras STR_0821 :Joulu -STR_0822 :Unable to access graphic data file +STR_0822 :Kykenemätön avaamaan grafiikkadatatiedostoa STR_0823 :Puuttuva tai käyttökelvoton datatiedosto STR_0824 :{BLACK}{CROSS} STR_0825 :Nimi on jo käytössä @@ -836,9 +837,9 @@ STR_0831 :{SMALLFONT}{BLACK}Pienennä STR_0832 :{SMALLFONT}{BLACK}Käännä 90{DEGREE} myötäpäivään STR_0833 :{SMALLFONT}{BLACK}Pysäytä peli STR_0834 :{SMALLFONT}{BLACK}Levy- ja peliasetukset -STR_0835 :Game initialisation failed -STR_0836 :Unable to start game in a minimised state -STR_0837 :Unable to initialise graphics system +STR_0835 :Pelin alustus epäonnistui +STR_0836 :Kykenemätön aloittamaan peliä pienennetyssä tilassa +STR_0837 :Kykenemätön alustamaan grafiikkajärjestelmää STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} @@ -853,11 +854,11 @@ STR_0847 :Lisätietoja 'OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}Versio 2.01.028 STR_0850 :{WINDOW_COLOUR_2}Tekijänoikeus {COPYRIGHT} 2002 Chris Sawyer, kaikki oikeudet pidetään -STR_0851 :{WINDOW_COLOUR_2}Suunnitellut ja ohjelmoinnut Chris Sawyer +STR_0851 :{WINDOW_COLOUR_2}Suunnitellut ja ohjelmoinut Chris Sawyer STR_0852 :{WINDOW_COLOUR_2}Grafiikka Simon Foster STR_0853 :{WINDOW_COLOUR_2}Äänet ja musiikki Allister Brimble STR_0854 :{WINDOW_COLOUR_2}Lisä-äänet nauhoittanut David Ellis -STR_0855 :{WINDOW_COLOUR_2}Representation by Jacqui Lyons at Marjacq Ltd. +STR_0855 :{WINDOW_COLOUR_2}Edustaja Jacqui Lyons, Marjacq Ltd. STR_0856 :{WINDOW_COLOUR_2}Kiitoksia: STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth, ja John Wardley STR_0858 :{WINDOW_COLOUR_2} @@ -889,16 +890,16 @@ STR_0883 :Tallenna peli STR_0884 :Lataa maisema STR_0885 :Tallenna maisema STR_0886 :Lopeta peli -STR_0887 :Quit Scenario Editor -STR_0888 :Quit Roller Coaster Designer -STR_0889 :Quit Track Designs Manager +STR_0887 :Lopeta skenaariomuokkaaja +STR_0888 :Lopeta vuoristoratasuunnittelija +STR_0889 :Lopeta ratasuunnitelmahallinta STR_0890 :Kuva{COMMA16}.BMP STR_0891 :Kuvankaappaus STR_0892 :Kuvankaappaus tallennettu levylle nimellä '{STRINGID}' STR_0893 :Kuvankaappaus epäonnistui ! -STR_0894 :Landscape data area full ! +STR_0894 :Maiseman data-alue täynnä! STR_0895 :Ei voi rakentaa osittain maan ylle ja alle -STR_0896 :{POP16}{POP16}{STRINGID} Construction +STR_0896 :{POP16}{POP16}{STRINGID} Rakenne STR_0897 :Suunta STR_0898 :{SMALLFONT}{BLACK}Vasemman käden kaarre STR_0899 :{SMALLFONT}{BLACK}Oikean käden kaarre @@ -909,12 +910,12 @@ STR_0903 :{SMALLFONT}{BLACK}Oikean käden kaarre (todella pieni säde) STR_0904 :{SMALLFONT}{BLACK}Vasemman käden kaarre (iso säde) STR_0905 :{SMALLFONT}{BLACK}Oikean käden kaarre (iso säde) STR_0906 :{SMALLFONT}{BLACK}Suora -STR_0907 :Liukumäki -STR_0908 :Roll/Banking -STR_0909 :Seat Rot. -STR_0910 :{SMALLFONT}{BLACK}Roll for left-hand curve -STR_0911 :{SMALLFONT}{BLACK}Roll for right-hand curve -STR_0912 :{SMALLFONT}{BLACK}No roll +STR_0907 :Rinne +STR_0908 :Kallistus +STR_0909 :Istuimen kierto +STR_0910 :{SMALLFONT}{BLACK}Vasemmalle kaartava kallistus +STR_0911 :{SMALLFONT}{BLACK}Oikealle kaartava kallistus +STR_0912 :{SMALLFONT}{BLACK}Ei kallistusta STR_0913 :{SMALLFONT}{BLACK}Siirry edelliseen osaan STR_0914 :{SMALLFONT}{BLACK}Siirry seuraavaan osaan STR_0915 :{SMALLFONT}{BLACK}Rakenna valittu osio @@ -922,30 +923,30 @@ STR_0916 :{SMALLFONT}{BLACK}Poista valittu osio STR_0917 :{SMALLFONT}{BLACK}Pystypudotus STR_0918 :{SMALLFONT}{BLACK}Jyrkkä mäki alas STR_0919 :{SMALLFONT}{BLACK}Mäki alas -STR_0920 :{SMALLFONT}{BLACK}Taso +STR_0920 :{SMALLFONT}{BLACK}Tasanne STR_0921 :{SMALLFONT}{BLACK}Mäki ylös STR_0922 :{SMALLFONT}{BLACK}Jyrkkä mäki ylös STR_0923 :{SMALLFONT}{BLACK}Pystynousu -STR_0924 :{SMALLFONT}{BLACK}Kierre alas -STR_0925 :{SMALLFONT}{BLACK}Kierre ylös +STR_0924 :{SMALLFONT}{BLACK}Ruuvikierre alas +STR_0925 :{SMALLFONT}{BLACK}Ruuvikierre ylös STR_0926 :Tämän poistaminen ei onnistu... STR_0927 :Tämän rakentaminen tähän ei onnistu... -STR_0928 :{SMALLFONT}{BLACK}Chain lift, to pull cars up slopes -STR_0929 :'S' kaarre (vasen) -STR_0930 :'S' kaarre (oikea) -STR_0931 :Vertical Loop (left) -STR_0932 :Vertical Loop (right) +STR_0928 :{SMALLFONT}{BLACK}Ketjumäki, vaunujen vetämistä varten mäissä. +STR_0929 :'S' mutka (vasen) +STR_0930 :'S' mutka (oikea) +STR_0931 :Pystysuora kierukka(vasen) +STR_0932 :Pystysuora kierukka (oikea) STR_0933 :Nosta tai laske maata ensin -STR_0934 :Ajelun sisäänkäynti edessä -STR_0935 :Ajelun uloskäynti edessä +STR_0934 :Laitteen sisäänkäynti edessä +STR_0935 :Laitteen uloskäynti edessä STR_0936 :Puiston sisäänkäynti edessä STR_0937 :{SMALLFONT}{BLACK}Näkymäasetukset -STR_0938 :{SMALLFONT}{BLACK}Adjust land height and slope -STR_0939 :Underground/Inside View -STR_0940 :Remove Base Land -STR_0941 :Remove Vertical Faces -STR_0942 :Näe läpi ajelut -STR_0943 :Näe läpi maiseman +STR_0938 :{SMALLFONT}{BLACK}Muokkaa maan korkeutta ja jyrkkyyttä +STR_0939 :Maanalainen näkymä +STR_0940 :Poista pohjamaa +STR_0941 :Poista pystysuorat pinnat +STR_0942 :Näe laitteiden läpi +STR_0943 :Näe maiseman läpi STR_0944 :Tallenna STR_0945 :Älä tallenna STR_0946 :Peruuta @@ -957,7 +958,7 @@ STR_0951 :Lopeta peli STR_0952 :Lopeta peli STR_0953 :Lataa maisema STR_0954 : -STR_0955 :{SMALLFONT}{BLACK}Select seat rotation angle for this track section +STR_0955 :{SMALLFONT}{BLACK}Valitse istuimen kiertokulma tämän radan osioon STR_0956 :-180{DEGREE} STR_0957 :-135{DEGREE} STR_0958 :-90{DEGREE} @@ -978,48 +979,48 @@ STR_0972 :Peruuta STR_0973 :OK STR_0974 :Laitteet STR_0975 :Kaupat ja kojut -STR_0976 :Toilets and Information Kiosks -STR_0977 :Uusi kuljetuslaite -STR_0978 :New Gentle Rides +STR_0976 :Vessat ja infokioskit +STR_0977 :Uusia kuljetuslaitteita +STR_0978 :Uusia lempeitä laitteita STR_0979 :Uusia vuoristoratoja -STR_0980 :New Thrill Rides +STR_0980 :Uusia jännittäviä laitteita STR_0981 :Uusia vesilaitteita STR_0982 :Uusia kauppoja ja kojuja -STR_0983 :Research & Development +STR_0983 :Tutkimustyö & kehittely STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP} STR_0986 :{BLACK}{CURRENCY2DP} -STR_0987 :Too many rides/attractions -STR_0988 :Can't create new ride/attraction... +STR_0987 :Liian monta laitetta/kohdetta +STR_0988 :Ei pysty luomaan uutta laitetta/kohdetta... STR_0989 :{STRINGID} -STR_0990 :{SMALLFONT}{BLACK}Construction -STR_0991 :Station platform -STR_0992 :{SMALLFONT}{BLACK}Demolish entire ride/attraction +STR_0990 :{SMALLFONT}{BLACK}Rakennus +STR_0991 :Asematasanne +STR_0992 :{SMALLFONT}{BLACK}Romuta koko laite/kohde STR_0993 :Romuta laite/nähtävyys STR_0994 :Romuta STR_0995 :{WINDOW_COLOUR_1}Oletko varma että haluat tuhota {STRINGID}:n? STR_0996 :Kokonaisnäkymä STR_0997 :{SMALLFONT}{BLACK}Näe valinta -STR_0998 :Enempää asemia ei sallittu tälle laitteelle -STR_0999 :Requires a station platform -STR_1000 :Track is not a complete circuit -STR_1001 :Track unsuitable for type of train +STR_0998 :Ei lisää asemia sallittu tälle laitteelle +STR_0999 :Vaatii asematasanteen +STR_1000 :Rata ei tee täydellistä kierrosta +STR_1001 :Track unsuitable for type of train Rata ei sovi kyseiselle junalajille. STR_1002 :Avaaminen ei onnistu laitteessa {POP16}{POP16}{POP16}{STRINGID}... STR_1003 :Testiajo ei onnistu laitteessa {POP16}{POP16}{POP16}{STRINGID}... STR_1004 :Sulkeminen ei onnistu laitteessa {POP16}{POP16}{POP16}{STRINGID}... STR_1005 :Rakentaminen ei onnistu laitteessa {POP16}{POP16}{POP16}{STRINGID}... STR_1006 :Täytyy ensin sulkea -STR_1007 :Unable to create enough vehicles -STR_1008 :{SMALLFONT}{BLACK}Open, close, or test ride/attraction -STR_1009 :{SMALLFONT}{BLACK}Open or close all rides/attractions +STR_1007 :Kykenemätön luomaan tarpeeksi kulkuneuvoja +STR_1008 :{SMALLFONT}{BLACK}Avaa, sulje, tai testaa laitetta/kohdetta +STR_1009 :{SMALLFONT}{BLACK}Avaa tai sulje kaikki laitteet/kohteet STR_1010 :{SMALLFONT}{BLACK}Avaa tai sulje puisto STR_1011 :Sulje kaikki STR_1012 :Avaa kaikki STR_1013 :Sulje puisto STR_1014 :Avaa puisto -STR_1015 :Unable to operate with more than one station platform in this mode -STR_1016 :Unable to operate with less than two stations in this mode -STR_1017 :Can't change operating mode... +STR_1015 :Kykenemätön toimimaan useamman asematasanteen kanssa tässä toimintatilassa +STR_1016 :Kykenemätön toimimaan vähemmän kuin kahden asematasanteen kanssa tässä toimintatilassa +STR_1017 :Ei pysty vaihtaamaan toimintatilaa... STR_1018 :Muutoksien teko ei onnistu... STR_1019 :Muutoksien teko ei onnistu... STR_1020 :Muutoksien teko ei onnistu... @@ -1028,9 +1029,9 @@ STR_1022 :{POP16}{POP16}{POP16}{COMMA16} auto per juna STR_1023 :{POP16}{POP16}{POP16}{COMMA16} autoa per juna STR_1024 :{COMMA16} auto per juna STR_1025 :{COMMA16} autoa per juna -STR_1026 :Station platform too long! -STR_1027 :{SMALLFONT}{BLACK}Locate this on Main View -STR_1028 :Off edge of map! +STR_1026 :Asematasanne on liian pitkä! +STR_1027 :{SMALLFONT}{BLACK}Paikanna tämä päänäkymässä +STR_1028 :Kentän laidan yli! STR_1029 :Ei voi rakentaa osittain veden pinnan ylle ja alle! STR_1030 :Tämän voi ainoastaan rakentaa veden alle! STR_1031 :Tätä ei voi rakentaa veden alle! @@ -1040,77 +1041,77 @@ STR_1034 :Tämän voi ainoastaan rakentaa maanpinnalle! STR_1035 :Paikallinen virkavalta ei salli rakentaa puiden latvoja korkeammalle! STR_1036 :Lataa peli STR_1037 :Lataa maisema -STR_1038 :Convert saved game to scenario -STR_1039 :Install new track design +STR_1038 :Muunna tallennettu peli skenaarioksi +STR_1039 :Asenna uusi ratasuunnitelma STR_1040 :Tallenna peli -STR_1041 :Save Scenario +STR_1041 :Tallenna skenaario STR_1042 :Tallenna maisema STR_1043 :OpenRCT2 Tallennettu peli -STR_1044 :OpenRCT2 Scenario File +STR_1044 :OpenRCT2 Skenaariotiedosto STR_1045 :OpenRCT2 Maisematiedosto -STR_1046 :OpenRCT2 Track Design File +STR_1046 :OpenRCT2 Ratasuunitelmatiedosto STR_1047 :Pelin tallennus epäonnistui! -STR_1048 :Scenario save failed! +STR_1048 :Skenaarion tallennus epäonnistui! STR_1049 :Maisematiedoston tallennus epäonnistui! STR_1050 :Avaaminen epäonnistui...{NEWLINE}Tiedosto sisältää virheellistä tietoa! -STR_1051 :Näkymättömiä tukia -STR_1052 :Näkymättömiä henkilöitä -STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park -STR_1054 :{SMALLFONT}{BLACK}Name ride/attraction +STR_1051 :Näkymättömät tuet +STR_1052 :Näkymättömät ihmiset +STR_1053 :{SMALLFONT}{BLACK}Laitteet/kohteet puistossa +STR_1054 :{SMALLFONT}{BLACK}Nimeä laite/kohde STR_1055 :{SMALLFONT}{BLACK}Nimeä henkilö STR_1056 :{SMALLFONT}{BLACK}Nimeä henkilöstön jäsen -STR_1057 :Ride/attraction name -STR_1058 :Enter new name for this ride/attraction: -STR_1059 :Can't rename ride/attraction... -STR_1060 :Invalid ride/attraction name -STR_1061 :Normal mode -STR_1062 :Continuous circuit mode -STR_1063 :Reverse-Incline launched shuttle mode -STR_1064 :Powered launch (passing station) -STR_1065 :Shuttle mode -STR_1066 :Boat hire mode -STR_1067 :Upward launch -STR_1068 :Rotating lift mode -STR_1069 :Station to station mode -STR_1070 :Single ride per admission -STR_1071 :Unlimited rides per admission -STR_1072 :Maze mode -STR_1073 :Race mode -STR_1074 :Bumper-car mode -STR_1075 :Swing mode -STR_1076 :Shop stall mode -STR_1077 :Rotation mode -STR_1078 :Forward rotation -STR_1079 :Backward rotation +STR_1057 :Laitteen/kohteen nimi +STR_1058 :Kirjoita uusi nimi tälle laitteelle/kohteelle: +STR_1059 :Ei pysty uudelleennimeämään laitetta/kohdetta... +STR_1060 :Virheellinen laitteen/kohteen nimi +STR_1061 :Normaali toimintatila +STR_1062 :Toistuva kierros toimintatila +STR_1063 :Käänteinen-kallistus laukaistu sukkula toimintatila +STR_1064 :Voimalaukaisu (aseman ohimennen) +STR_1065 :Sukkulatoimintatila +STR_1066 :Veneajelu toimintatila +STR_1067 :ylöspäin laukaisu +STR_1068 :Pyörivä hissi toimintatila +STR_1069 :Asemalta asemalle toimintatila +STR_1070 :Yksi kyyti per sisäänpääsy +STR_1071 :Loputtomat kyydit per sisäänpääsy +STR_1072 :Labyrinttitoimintatila +STR_1073 :Kilpailutoimintatila +STR_1074 :Törmäysautotoimintatila +STR_1075 :Keinutoimintatila +STR_1076 :Kojutoimintatila +STR_1077 :Pyörimistoimintatila +STR_1078 :Eteenpäin pyöriminen +STR_1079 :Taaksepäin pyöriminen STR_1080 :Elokuva: {ENDQUOTES}Kostavat lentäjät{ENDQUOTES} STR_1081 :3D-elokuva: {ENDQUOTES}Hiiren hännät{ENDQUOTES} -STR_1082 :Space rings mode -STR_1083 :Beginners mode -STR_1084 :LIM-powered launch -STR_1085 :Elokuva: {ENDQUOTES}Jännityksen ajajat{ENDQUOTES} -STR_1086 :3D-elokuva: {ENDQUOTES}Myrskun jahtaajat{ENDQUOTES} -STR_1087 :3D-elokuva: {ENDQUOTES}Avaruuskaapparit{ENDQUOTES} -STR_1088 :Intense mode -STR_1089 :Berserk mode -STR_1090 :Haunted house mode -STR_1091 :Circus show mode -STR_1092 :Downward launch -STR_1093 :Crooked house mode -STR_1094 :Freefall drop mode -STR_1095 :Continuous circuit block sectioned mode -STR_1096 :Powered launch (without passing station) -STR_1097 :Powered launch block sectioned mode -STR_1098 :Moving to end of {POP16}{STRINGID} -STR_1099 :Waiting for passengers at {POP16}{STRINGID} -STR_1100 :Waiting to depart {POP16}{STRINGID} +STR_1082 :Avaruusrenkaat toimintatila +STR_1083 :Aloittelijoille toimintatila +STR_1084 :Induktiomoottorilaukaisu +STR_1085 :Elokuva: {ENDQUOTES}Jännityksen ratsastajat{ENDQUOTES} +STR_1086 :3D-elokuva: {ENDQUOTES}Myrskyn jahtaajat{ENDQUOTES} +STR_1087 :3D-elokuva: {ENDQUOTES}Avaruusryöstäjät{ENDQUOTES} +STR_1088 :Intensiivinen toimintatila +STR_1089 :Hullu toimintatila +STR_1090 :Kummitustalo toimintatila +STR_1091 :Sirkusesitys toimintatila +STR_1092 :Alaspäin laukaisu +STR_1093 :Kiero talo toimintatila +STR_1094 :Vapaapudotustoimintatila +STR_1095 :Toistuva kierros lohkojarrutuksella toiminatila +STR_1096 :Voimalaukaisu (ilman aseman ohimenemistä) +STR_1097 :Voimalaukaisu lohkojarrutuksella toimintatila +STR_1098 :Matkustetaan {POP16}{STRINGID} loppuun +STR_1099 :Odoitetaan matkustajia {POP16}{STRINGID} +STR_1100 :Odoitetaan lähtöä {POP16}{STRINGID} STR_1101 :Lähtemässä {POP16}{STRINGID} -STR_1102 :Liikkuen {VELOCITY} +STR_1102 :Nopeus {VELOCITY} STR_1103 :Saapumassa {POP16}{STRINGID} STR_1104 :Matkustajia puretaan {POP16}{STRINGID} -STR_1105 :Liikkuen {VELOCITY} -STR_1106 :Sortunut! +STR_1105 :Nopeus {VELOCITY} +STR_1106 :Sortuu! STR_1107 :Sortunut! -STR_1108 :Liikkuen {VELOCITY} +STR_1108 :Nopeus {VELOCITY} STR_1109 :Keinuu STR_1110 :Pyörii STR_1111 :Pyörii @@ -1121,8 +1122,8 @@ STR_1115 :Käynnissä STR_1116 :Käynnissä STR_1117 :Sirkusesitys menossa STR_1118 :Käynnissä -STR_1119 :Waiting for cable lift -STR_1120 :Liikkuen {VELOCITY} +STR_1119 :Odotettaa kaapelihissiä +STR_1120 :Nopeus {VELOCITY} STR_1121 :Pysäytetään STR_1122 :Odotetaan matkustajia STR_1123 :Odotetaan käynnistämistä @@ -1130,10 +1131,10 @@ STR_1124 :Käynnistetään STR_1125 :Käynnissä STR_1126 :Pysäytetään STR_1127 :Matkustajia puretaan -STR_1128 :Stopped by block brakes +STR_1128 :Pysähtynyt lohkojarruihin. STR_1129 :Kaikki ajoneuvot saman värisiä -STR_1130 :Different colours per {STRINGID} -STR_1131 :Different colours per vehicle +STR_1130 :Eri värit per {STRINGID} +STR_1131 :Eri värit per ajoneuvo STR_1132 :Ajoneuvo {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1133 :Ajoneuvo {POP16}{COMMA16} STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} @@ -1146,8 +1147,8 @@ STR_1140 :{SMALLFONT}{BLACK}Valitse ajoneuvon väriteemava STR_1141 :{SMALLFONT}{BLACK}Valitse mitä ajoneuvoa/junaa muuttaa STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} -STR_1144 :Can't build/move entrance for this ride/attraction... -STR_1145 :Can't build/move exit for this ride/attraction... +STR_1144 :Ei pysty rakentamaan/siirtämään tämän laitteen/kohteen sisäänkäyntiä... +STR_1145 :Ei pysty rakentamaan/siirtämään tämän laitteen/kohteen uloskäyntiä... STR_1146 :Sisäänkäyntiä ei ole vielä rakennettu STR_1147 :Uloskäyntiä ei ole vielä rakennettu STR_1148 :Neljännes kuorma @@ -1155,15 +1156,15 @@ STR_1149 :Puolikas kuorma STR_1150 :Kolmeneljäsosaa kuorma STR_1151 :Täysi kuorma STR_1152 :Mikä tahansa kuorma -STR_1153 :Height Marks on Ride Tracks -STR_1154 :Height Marks on Land -STR_1155 :Height Marks on Paths +STR_1153 :Korkeusmerkinnät laitteiden radoissa +STR_1154 :Korkeusmerkinnät maanpinnassa +STR_1155 :Korkeusmerkinnät poluissa STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} STR_1158 :Tämän poistaminen ei onnistu... -STR_1159 :{SMALLFONT}{BLACK}Place scenery, gardens, and other accessories -STR_1160 :{SMALLFONT}{BLACK}Create/adjust lakes & water -STR_1161 :Tätä ei voi asettaa tähän... +STR_1159 :{SMALLFONT}{BLACK}Aseta maisemaa, puutarhoja, ja muita tilpehöörejä. +STR_1160 :{SMALLFONT}{BLACK}Luo/säädä järviä ja vettä. +STR_1161 :Tätä ei voi asettaa sitä tähän... STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} STR_1163 :{STRINGID}{NEWLINE}(Oikea klikkaus muokkaa) STR_1164 :{STRINGID}{NEWLINE}(Oikea klikkaus poistaa) @@ -1175,12 +1176,12 @@ STR_1169 :(Ei mitään) STR_1170 :{STRING} STR_1171 :{RED}Suljettu - - STR_1172 :{YELLOW}{STRINGID} - - -STR_1173 :{SMALLFONT}{BLACK}Build footpaths and queue lines +STR_1173 :{SMALLFONT}{BLACK}Rakenna jalkakäytäviä ja jonotuslinjoja STR_1174 :Mainoskyltti on tiellä STR_1175 :Tätä ei voi rakentaa kaltevalle jalkakäytävälle STR_1176 :Jalkakäytävää ei voi rakentaa tähän... STR_1177 :Jalkakäytävää ei voi poistaa tästä... -STR_1178 :Land slope unsuitable +STR_1178 :Maan kaltevuus epäsopiva STR_1179 :Jalkakäytävä on tiellä STR_1180 :Tätä ei voi rakentaa veden alle! STR_1181 :Jalkakäytävät @@ -1188,11 +1189,11 @@ STR_1182 :Tyyppi STR_1183 :Suunta STR_1184 :Mäki STR_1185 :{SMALLFONT}{BLACK}Suunta -STR_1186 :{SMALLFONT}{BLACK}Slope down -STR_1187 :{SMALLFONT}{BLACK}Taso -STR_1188 :{SMALLFONT}{BLACK}Slope up -STR_1189 :{SMALLFONT}{BLACK}Construct the selected footpath section -STR_1190 :{SMALLFONT}{BLACK}Remove previous footpath section +STR_1186 :{SMALLFONT}{BLACK}Mäki alas +STR_1187 :{SMALLFONT}{BLACK}Tasanne +STR_1188 :{SMALLFONT}{BLACK}Mäki ylös +STR_1189 :{SMALLFONT}{BLACK}Rakenna valittu jalkakäytävän osio +STR_1190 :{SMALLFONT}{BLACK}Poista valittu jalkakäytävän osio STR_1191 :{BLACK}{STRINGID} STR_1192 :{OUTLINE}{RED}{STRINGID} STR_1193 :{WINDOW_COLOUR_2}{STRINGID} @@ -1211,26 +1212,26 @@ STR_1205 :{COMMA16} minuutin jonotusaika STR_1206 :{WINDOW_COLOUR_2}Odota: STR_1207 :{WINDOW_COLOUR_2}Lähde jos toinen juna saapuu asemalle STR_1208 :{WINDOW_COLOUR_2}Lähde jos toinen vene saapuu asemalle -STR_1209 :{SMALLFONT}{BLACK}Select whether should wait for passengers before departing -STR_1210 :{SMALLFONT}{BLACK}Select whether should leave if another vehicle arrives at the same station -STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time: -STR_1212 :{WINDOW_COLOUR_2}Maximum waiting time: -STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing -STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing -STR_1215 :{WINDOW_COLOUR_2}Synchronise with adjacent stations -STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronise departure with all adjacent stations (for 'racing') +STR_1209 :{SMALLFONT}{BLACK}Valitse pitäisikö odottaa matkustajia ennen lähtöä +STR_1210 :{SMALLFONT}{BLACK}Valitse pitäisikö lähteä jos toinen vaunu saapuu samalle asemalle +STR_1211 :{WINDOW_COLOUR_2}Vähimmäisodotusaika: +STR_1212 :{WINDOW_COLOUR_2}Enimmäisodotusaika: +STR_1213 :{SMALLFONT}{BLACK}Valitse vähimmäisodotusaika ennen lähtöä +STR_1214 :{SMALLFONT}{BLACK}Valitse enimmäisodotusaika ennen lähtöä +STR_1215 :{WINDOW_COLOUR_2}Synkronoi rinnakkaisasemien kanssa +STR_1216 :{SMALLFONT}{BLACK}Valitse pitäisikö synkronoida lähtö kaikkien rinnakkaisasemien kanssa ('kilpailua' varten) STR_1217 :{COMMA16} sekuntia STR_1218 :{BLACK}{SMALLUP} STR_1219 :{BLACK}{SMALLDOWN} STR_1220 :Vain uloskäynti STR_1221 :Ei sisäänkäyntiä STR_1222 :Ei uloskäyntiä -STR_1223 :{SMALLFONT}{BLACK}Transport rides -STR_1224 :{SMALLFONT}{BLACK}Gentle rides -STR_1225 :{SMALLFONT}{BLACK}Roller coasters -STR_1226 :{SMALLFONT}{BLACK}Thrill rides -STR_1227 :{SMALLFONT}{BLACK}Vesiajelut -STR_1228 :{SMALLFONT}{BLACK}Shops & stalls +STR_1223 :{SMALLFONT}{BLACK}Kuljetuslaitteet +STR_1224 :{SMALLFONT}{BLACK}Lempeät laitteet +STR_1225 :{SMALLFONT}{BLACK}Vuoristoradat +STR_1226 :{SMALLFONT}{BLACK}Jännittävät radat +STR_1227 :{SMALLFONT}{BLACK}Vesilaitteet +STR_1228 :{SMALLFONT}{BLACK}Kaupat ja kojut STR_1229 :juna STR_1230 :junaa STR_1231 :Juna @@ -1241,7 +1242,7 @@ STR_1235 :Juna {COMMA16} STR_1236 :vene STR_1237 :venettä STR_1238 :Vene -STR_1239 :Vene +STR_1239 :Venettä STR_1240 :{COMMA16} vene STR_1241 :{COMMA16} venettä STR_1242 :Vene {COMMA16} @@ -1252,13 +1253,13 @@ STR_1246 :Rataa STR_1247 :{COMMA16} rata STR_1248 :{COMMA16} rataa STR_1249 :Rata {COMMA16} -STR_1250 :docking platform -STR_1251 :docking platforms -STR_1252 :Docking platform -STR_1253 :Docking platforms -STR_1254 :{COMMA16} docking platform -STR_1255 :{COMMA16} docking platforms -STR_1256 :Docking platform {COMMA16} +STR_1250 :telakointitasanne +STR_1251 :telakointitasanteita +STR_1252 :Telakointitasanne +STR_1253 :Telakointitasanteita +STR_1254 :{COMMA16} telakointitasanne +STR_1255 :{COMMA16} telakointitasanteita +STR_1256 :Telakointitasanne {COMMA16} STR_1257 :asema STR_1258 :asemaa STR_1259 :Asema @@ -1267,7 +1268,7 @@ STR_1261 :{COMMA16} asema STR_1262 :{COMMA16} asemaa STR_1263 :Asema {COMMA16} STR_1264 :auto -STR_1265 :autoja +STR_1265 :autoa STR_1266 :Auto STR_1267 :Autoa STR_1268 :{COMMA16} auto @@ -1329,10 +1330,10 @@ STR_1323 :Rataa STR_1324 :{COMMA16} rata STR_1325 :{COMMA16} rataa STR_1326 :Rata {COMMA16} -STR_1327 :{SMALLFONT}{BLACK}Rotate objects by 90{DEGREE} -STR_1328 :Level land required +STR_1327 :{SMALLFONT}{BLACK}Käännä esineitä 90{DEGREE} +STR_1328 :Vaatii tasaisen maan STR_1329 :{WINDOW_COLOUR_2}Lähtönopeus: -STR_1330 :{SMALLFONT}{BLACK}Maximum speed when leaving station +STR_1330 :{SMALLFONT}{BLACK}Enimmäisnopeus kun lähdetään asemalta STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} STR_1332 :{VELOCITY} STR_1333 :{STRINGID} - {STRINGID}{POP16} @@ -1342,7 +1343,7 @@ STR_1336 :{STRINGID} - Asema {POP16}{COMMA16} Sisäänkäynti STR_1337 :{STRINGID} - Uloskäynti{POP16}{POP16} STR_1338 :{STRINGID} - Asema {POP16}{COMMA16} Uloskäynti STR_1339 :{BLACK}Testituloksia ei ole vielä saatavilla... -STR_1340 :{WINDOW_COLOUR_2}Max. speed: {BLACK}{VELOCITY} +STR_1340 :{WINDOW_COLOUR_2}Isoin nopeus: {BLACK}{VELOCITY} STR_1341 :{WINDOW_COLOUR_2}Ajelun kesto: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} STR_1342 :{DURATION} STR_1343 :{DURATION} / @@ -1350,202 +1351,203 @@ STR_1344 :{WINDOW_COLOUR_2}Radan pituus: {BLACK}{STRINGID}{STRINGID}{STRINGID STR_1345 :{LENGTH} STR_1346 :{LENGTH} / STR_1347 :{WINDOW_COLOUR_2}Keskinopeus: {BLACK}{VELOCITY} -STR_1348 :{WINDOW_COLOUR_2}Max. positive vertical G's: {BLACK}{COMMA2DP32}g -STR_1349 :{WINDOW_COLOUR_2}Max. positive vertical G's: {OUTLINE}{RED}{COMMA2DP32}g -STR_1350 :{WINDOW_COLOUR_2}Max. negative vertical G's: {BLACK}{COMMA2DP32}g -STR_1351 :{WINDOW_COLOUR_2}Max. negative vertical G's: {OUTLINE}{RED}{COMMA2DP32}g -STR_1352 :{WINDOW_COLOUR_2}Max. lateral G's: {BLACK}{COMMA2DP32}g -STR_1353 :{WINDOW_COLOUR_2}Max. lateral G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1348 :{WINDOW_COLOUR_2}Isoin positiivinen vertikaalinen G-voima: {BLACK}{COMMA2DP32}g +STR_1349 :{WINDOW_COLOUR_2}Isoin positiivinen vertikaalinen G-voima: {OUTLINE}{RED}{COMMA2DP32}g +STR_1350 :{WINDOW_COLOUR_2}Isoin negatiivinen vertikaalinen G-voima: {BLACK}{COMMA2DP32}g +STR_1351 :{WINDOW_COLOUR_2}Isoin negatiivinen vertikaalinen G-voima: {OUTLINE}{RED}{COMMA2DP32}g +STR_1352 :{WINDOW_COLOUR_2}Isoin sivuttainen G-voima: {BLACK}{COMMA2DP32}g +STR_1353 :{WINDOW_COLOUR_2}Isoin sivuttainen G-voima: {OUTLINE}{RED}{COMMA2DP32}g STR_1354 :{WINDOW_COLOUR_2}Korkein pudotuskorkeus: {BLACK}{LENGTH} -STR_1355 :{WINDOW_COLOUR_2}Pudotusta: {BLACK}{COMMA16} -STR_1356 :{WINDOW_COLOUR_2}Inversions: {BLACK}{COMMA16} +STR_1355 :{WINDOW_COLOUR_2}Pudotuksia: {BLACK}{COMMA16} +STR_1356 :{WINDOW_COLOUR_2}Käänteitä: {BLACK}{COMMA16} STR_1357 :{WINDOW_COLOUR_2}Reikää: {BLACK}{COMMA16} -STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs +STR_1358 :{WINDOW_COLOUR_2}'ilma-aika' yhteensä: {BLACK}{COMMA2DP32}secs STR_1359 :{WINDOW_COLOUR_2}Jonotusaika: {BLACK}{COMMA16} minuutti STR_1360 :{WINDOW_COLOUR_2}Jonotusaika: {BLACK}{COMMA16} minuuttia STR_1361 :Nopeuden muuttaminen ei onnistu... STR_1362 :Lähtönopeuden muuttaminen ei onnistu... -STR_1363 :Too high for supports! -STR_1364 :Supports for track above can't be extended any further! -STR_1365 :In-line Twist (left) -STR_1366 :In-line Twist (right) -STR_1367 :Half Loop -STR_1368 :Half Corkscrew (left) -STR_1369 :Half Corkscrew (right) -STR_1370 :Barrel Roll (left) -STR_1371 :Barrel Roll (right) -STR_1372 :Launched Lift Hill -STR_1373 :Large Half Loop (left) -STR_1374 :Large Half Loop (right) -STR_1375 :Upper Transfer -STR_1376 :Lower Transfer -STR_1377 :Heartline Roll (left) -STR_1378 :Heartline Roll (right) -STR_1379 :Reverser (left) -STR_1380 :Reverser (right) -STR_1381 :Curved Lift Hill (left) -STR_1382 :Curved Lift Hill (right) -STR_1383 :Quarter Loop +STR_1363 :Liian korkealla tukia varten! +STR_1364 :Ylemmän laitteen tukia ei voida laajentaa pidemmälle! +STR_1365 :Hallittava kierre (vasen) +STR_1366 :Hallittava kierre (oikea) +STR_1367 :Puolikas silmukka +STR_1368 :Puolikas korkkiruuvi (vasen) +STR_1369 :Puolikas korkkiruuvi (oikea) +STR_1370 :Tynnyrivierre (vasen) +STR_1371 :Tynnyrivierre (oikea) +STR_1372 :Laukaistu nostomäki +STR_1373 :Iso puolikas silmukka (vasen) +STR_1374 :Iso puolikas silmukka (oikea) +STR_1375 :Ylempi siirto +STR_1376 :Alempi siirto +STR_1377 :Sydämmen viiva vierähdys (vasen) +STR_1378 :Sydämmen viiva vierähdys (oikea) +STR_1379 :Käännin (vasen) +STR_1380 :Käännin (oikea) +STR_1381 :Kaareva nostomäki (vasen) +STR_1382 :Kaareva nostomäki (oikea) +STR_1383 :Neljännesosa silmukka STR_1384 :{YELLOW}{STRINGID} -STR_1385 :{SMALLFONT}{BLACK}Other track configurations +STR_1385 :{SMALLFONT}{BLACK}Muut radan asetukset STR_1386 :Erikoinen... STR_1387 :Maan tyyppiä ei voida muuttaa... STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} STR_1389 :{OUTLINE}{RED}- {CURRENCY} STR_1390 :{CURRENCY2DP} STR_1391 :{RED}{CURRENCY2DP} -STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction -STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options -STR_1394 :{SMALLFONT}{BLACK}Operating options -STR_1395 :{SMALLFONT}{BLACK}Maintenance options +STR_1392 :{SMALLFONT}{BLACK}Näkymä laitteesta/kohteesta +STR_1393 :{SMALLFONT}{BLACK}Kulkuneuvon yksitoiskohdat ja asetukset +STR_1394 :{SMALLFONT}{BLACK}Toiminta asetukset +STR_1395 :{SMALLFONT}{BLACK}Huolto asetukset STR_1396 :{SMALLFONT}{BLACK}Värityylin asetukset STR_1397 :{SMALLFONT}{BLACK}Ääni- ja musiikkiasetukset STR_1398 :{SMALLFONT}{BLACK}Mitat ja testitiedot -STR_1399 :{SMALLFONT}{BLACK}Kuvastot +STR_1399 :{SMALLFONT}{BLACK}Kaaviokuvat STR_1400 :Sisäänkäynti STR_1401 :Uloskäynti -STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction -STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction +STR_1402 :{SMALLFONT}{BLACK}Rakenna tai siirrä sisäänkäynti laitteesta/kohteesta +STR_1403 :{SMALLFONT}{BLACK}Rakenna tai siirrä uloskäynti laitteesta/kohteesta STR_1404 :{SMALLFONT}{BLACK}Käännä 90{DEGREE} STR_1405 :{SMALLFONT}{BLACK}Peilaa kuva -STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) +STR_1406 :{SMALLFONT}{BLACK}Vaihda maisema päälle/pois (vain jos saatavilla tälle suunnitelmalle) STR_1407 :{WINDOW_COLOUR_2}Rakenna tämä... STR_1408 :{WINDOW_COLOUR_2}Kustannus: {BLACK}{CURRENCY} -STR_1409 :Entry/Exit Platform -STR_1410 :Vertical Tower -STR_1411 :{STRINGID} in the way -STR_1412 :{WINDOW_COLOUR_3}Data logging not available for this type of ride -STR_1413 :{WINDOW_COLOUR_3}Data logging will start when next {STRINGID} leaves {STRINGID} +STR_1409 :Sisään-/uloskäyntitasanne +STR_1410 :Pystysuora torni +STR_1411 :{STRINGID} tiellä +STR_1412 :{WINDOW_COLOUR_3}Tietojen keruu ei ole saatavilla tämäntyyppiselle laitteelle +STR_1413 :{WINDOW_COLOUR_3}Tietojen keruu alkaa kun seuraava {STRINGID} lähtee {STRINGID} STR_1414 :{SMALLFONT}{BLACK}{DURATION} -STR_1415 :{WINDOW_COLOUR_2}Velocity -STR_1416 :{WINDOW_COLOUR_2}Altitude -STR_1417 :{WINDOW_COLOUR_2}Vert.G's -STR_1418 :{WINDOW_COLOUR_2}Lat.G's +STR_1415 :{WINDOW_COLOUR_2}Nopeus +STR_1416 :{WINDOW_COLOUR_2}Korkeus +STR_1417 :{WINDOW_COLOUR_2}Vert. G-voima +STR_1418 :{WINDOW_COLOUR_2}Sivut. G-voima STR_1419 :{SMALLFONT}{BLACK}{VELOCITY} STR_1420 :{SMALLFONT}{BLACK}{LENGTH} STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g -STR_1422 :{SMALLFONT}{BLACK}Logging data from {POP16}{STRINGID} -STR_1423 :{SMALLFONT}{BLACK}Queue line path +STR_1422 :{SMALLFONT}{BLACK}Kerätään tietoja {POP16}{STRINGID} +STR_1423 :{SMALLFONT}{BLACK}Jonolinjaston tie STR_1424 :{SMALLFONT}{BLACK}Jalkakäytävä STR_1425 :Jalkakäytävä -STR_1426 :Jono +STR_1426 :Jonolinjasto STR_1427 :{WINDOW_COLOUR_2}Asiakkaita: {BLACK}{COMMA32} per tunti STR_1428 :{WINDOW_COLOUR_2}Sisäänpääsymaksu: STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} STR_1430 :Ilmainen -STR_1431 :Kävelen +STR_1431 :Kävelee STR_1432 :Menossa kohti {STRINGID} -STR_1433 :Jonotan {STRINGID} -STR_1434 :Hukun +STR_1433 :Jonottaa {STRINGID} +STR_1434 :Hukkuu +#these following 3 would require extra coding, so i will leave them default for now STR_1435 :On {STRINGID} STR_1436 :In {STRINGID} STR_1437 :At {STRINGID} -STR_1438 :Istun +STR_1438 :Istuu STR_1439 :(valitse sijainti) -STR_1440 :Leikkaan ruohoa -STR_1441 :Harjaan jalkakäytävää -STR_1442 :Tyhjennän roskakoria -STR_1443 :Kastelen puutarhoja -STR_1444 :Katselen {STRINGID} -STR_1445 :Watching construction of {STRINGID} -STR_1446 :Looking at scenery -STR_1447 :Lähden puistosta -STR_1448 :Katson uuden ajelun rakentelua +STR_1440 :Leikkaa ruohoa +STR_1441 :Harjaa jalkakäytävää +STR_1442 :Tyhjentää roskakoria +STR_1443 :Kastelee puutarhoja +STR_1444 :Katsoo {STRINGID} +STR_1445 :Katsoo {STRINGID}:n rakentamista +STR_1446 :Katselee maisemia +STR_1447 :Lähdössä puistosta +STR_1448 :Katsoo uuden laitteen rakentamista STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) STR_1452 :Vieraan nimi -STR_1453 :Anna nimi vieraalle: +STR_1453 :Kirjoita nimi vieraalle: STR_1454 :Vieraan nimeäminen ei onnistu... STR_1455 :Virheellinen nimi vieraalle -STR_1456 :{WINDOW_COLOUR_2}Rahaa kulutettu: {BLACK}{CURRENCY2DP} +STR_1456 :{WINDOW_COLOUR_2}Rahaa käytetty: {BLACK}{CURRENCY2DP} STR_1457 :{WINDOW_COLOUR_2}Rahaa taskussa: {BLACK}{CURRENCY2DP} -STR_1458 :{WINDOW_COLOUR_2}Puistossa olemisaika: {BLACK}{REALTIME} +STR_1458 :{WINDOW_COLOUR_2}Aikaa kulutettu puistossa: {BLACK}{REALTIME} STR_1459 :Radan tyyli -STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track -STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track -STR_1462 :Too steep for lift hill +STR_1460 :{SMALLFONT}{BLACK}'U':n muotoinen avoin rata +STR_1461 :{SMALLFONT}{BLACK}'O':n muotoinen ympäröity rata +STR_1462 :Liian jyrkkä nostomäkeä varten STR_1463 :Vieraat -STR_1464 :Helix up (small) -STR_1465 :Helix up (large) -STR_1466 :Helix down (small) -STR_1467 :Helix down (large) +STR_1464 :Ruuvikierre ylös (pieni) +STR_1465 :Ruuvikierre ylös (iso) +STR_1466 :Ruuvikierre alas (pieni) +STR_1467 :Ruuvikierre alas (iso) STR_1468 :Henkilökunta -STR_1469 :Ride must start and end with stations -STR_1470 :Station not long enough +STR_1469 :Laitteen pitää alkaa ja loppua asemilla +STR_1470 :Asema ei ole tarpeeksi pitkä STR_1471 :{WINDOW_COLOUR_2}Nopeus: -STR_1472 :{SMALLFONT}{BLACK}Tämän ajelun nopeus -STR_1473 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1474 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}Not yet available -STR_1475 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1476 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}Not yet available -STR_1477 :{WINDOW_COLOUR_2}Intensity rating: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) -STR_1478 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1479 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}Not yet available -STR_1480 :{SMALLFONT}{OPENQUOTES}Ei ole varaa {STRINGID}{ENDQUOTES} +STR_1472 :{SMALLFONT}{BLACK}Tämän laitteen nopeus +STR_1473 :{WINDOW_COLOUR_2}Jännityksen arvosana: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1474 :{WINDOW_COLOUR_2}Jännityksen arvosana: {BLACK}Ei viellä saatavilla +STR_1475 :{WINDOW_COLOUR_2}Intensiteetti arvosana: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1476 :{WINDOW_COLOUR_2}Intensiteetti arvosana: {BLACK}Ei viellä saatavilla +STR_1477 :{WINDOW_COLOUR_2}Intensiteetti arvosana: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) +STR_1478 :{WINDOW_COLOUR_2}Pahoinvoinnin arvosana: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1479 :{WINDOW_COLOUR_2}Pahoinvoinnin arvosana: {BLACK}Ei viellä saatavilla +STR_1480 :{SMALLFONT}{OPENQUOTES}Minulla ei ole varaa mennä {STRINGID}{ENDQUOTES} STR_1481 :{SMALLFONT}{OPENQUOTES}Kulutin kaikki rahani{ENDQUOTES} -STR_1482 :{SMALLFONT}{OPENQUOTES}Tunnen oloni sairaaksi{ENDQUOTES} -STR_1483 :{SMALLFONT}{OPENQUOTES}Tunnen oloni todella sairaaksi{ENDQUOTES} -STR_1484 :{SMALLFONT}{OPENQUOTES}I want to go on something more thrilling than {STRINGID}{ENDQUOTES} -STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} looks too intense for me{ENDQUOTES} -STR_1486 :{SMALLFONT}{OPENQUOTES}I haven't finished my {STRINGID} yet{ENDQUOTES} -STR_1487 :{SMALLFONT}{OPENQUOTES}Just looking at {STRINGID} makes me feel sick{ENDQUOTES} -STR_1488 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to go on {STRINGID}{ENDQUOTES} +STR_1482 :{SMALLFONT}{OPENQUOTES}Tunnen oloni kamalaksi{ENDQUOTES} +STR_1483 :{SMALLFONT}{OPENQUOTES}Tunnen oloni todella kamalaksi{ENDQUOTES} +STR_1484 :{SMALLFONT}{OPENQUOTES}Tahdon mennä johonkin jännittävämpään kuin {STRINGID}{ENDQUOTES} +STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} näyttää liian hurjalta minulle{ENDQUOTES} +STR_1486 :{SMALLFONT}{OPENQUOTES}En ole syönyt/juonut {STRINGID} loppuun vielä{ENDQUOTES} +STR_1487 :{SMALLFONT}{OPENQUOTES}Pelkästään {STRINGID} katsominen saa minut tuntemaan oloni kamalaksi{ENDQUOTES} +STR_1488 :{SMALLFONT}{OPENQUOTES}En aijo maksaa noin paljon päästäkseni {STRINGID}{ENDQUOTES} STR_1489 :{SMALLFONT}{OPENQUOTES}Haluan kotiin{ENDQUOTES} -STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} is really good value{ENDQUOTES} +STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1491 :{SMALLFONT}{OPENQUOTES}Minulla on jo {STRINGID}{ENDQUOTES} -STR_1492 :{SMALLFONT}{OPENQUOTES}Minulla ei ole varaa {STRINGID}{ENDQUOTES} +STR_1492 :{SMALLFONT}{OPENQUOTES}Minulla ei ole varaa ostaa {STRINGID}{ENDQUOTES} STR_1493 :{SMALLFONT}{OPENQUOTES}Minulla ei ole nälkä{ENDQUOTES} STR_1494 :{SMALLFONT}{OPENQUOTES}Minulla ei ole jano{ENDQUOTES} STR_1495 :{SMALLFONT}{OPENQUOTES}Apua! Hukun!{ENDQUOTES} STR_1496 :{SMALLFONT}{OPENQUOTES}Olen eksynyt!{ENDQUOTES} STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} oli mahtava{ENDQUOTES} -STR_1498 :{SMALLFONT}{OPENQUOTES}I've been queuing for {STRINGID} for ages{ENDQUOTES} +STR_1498 :{SMALLFONT}{OPENQUOTES}Olen jonottanut ikuisuuden kohteeseen {STRINGID}{ENDQUOTES} STR_1499 :{SMALLFONT}{OPENQUOTES}Olen väsynyt{ENDQUOTES} STR_1500 :{SMALLFONT}{OPENQUOTES}Minulla on nälkä{ENDQUOTES} STR_1501 :{SMALLFONT}{OPENQUOTES}Minulla on jano{ENDQUOTES} -STR_1502 :{SMALLFONT}{OPENQUOTES}I need to go to the bathroom{ENDQUOTES} -STR_1503 :{SMALLFONT}{OPENQUOTES}I can't find {STRINGID}{ENDQUOTES} -STR_1504 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to use {STRINGID}{ENDQUOTES} -STR_1505 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} while it's raining{ENDQUOTES} -STR_1506 :{SMALLFONT}{OPENQUOTES}The litter here is really bad{ENDQUOTES} -STR_1507 :{SMALLFONT}{OPENQUOTES}I can't find the park exit{ENDQUOTES} -STR_1508 :{SMALLFONT}{OPENQUOTES}I want to get off {STRINGID}{ENDQUOTES} -STR_1509 :{SMALLFONT}{OPENQUOTES}I want to get out of {STRINGID}{ENDQUOTES} -STR_1510 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} - It isn't safe{ENDQUOTES} +STR_1502 :{SMALLFONT}{OPENQUOTES}Minun tarvitsee käydä vessassa{ENDQUOTES} +STR_1503 :{SMALLFONT}{OPENQUOTES}En löydä {STRINGID}{ENDQUOTES} +STR_1504 :{SMALLFONT}{OPENQUOTES}En aijo maksaa noin paljon käyttääkseni {STRINGID}{ENDQUOTES} +STR_1505 :{SMALLFONT}{OPENQUOTES}Täällä sataa, en halua mennä kohteeseen {STRINGID}{ENDQUOTES} +STR_1506 :{SMALLFONT}{OPENQUOTES}Täällä on todella paljon roskaa{ENDQUOTES} +STR_1507 :{SMALLFONT}{OPENQUOTES}En löydä puiston uloskäyntiä{ENDQUOTES} +STR_1508 :{SMALLFONT}{OPENQUOTES}Tahdon pois kohteesta {STRINGID}{ENDQUOTES} +STR_1509 :{SMALLFONT}{OPENQUOTES}Tahdon ulos kohteesta {STRINGID}{ENDQUOTES} +STR_1510 :{SMALLFONT}{OPENQUOTES}En mene kohteeseen {STRINGID} - Se ei ole turvallinen{ENDQUOTES} STR_1511 :{SMALLFONT}{OPENQUOTES}Tämä tie on kuvottava{ENDQUOTES} -STR_1512 :{SMALLFONT}{OPENQUOTES}It's too crowded here{ENDQUOTES} -STR_1513 :{SMALLFONT}{OPENQUOTES}The vandalism here is really bad{ENDQUOTES} +STR_1512 :{SMALLFONT}{OPENQUOTES}Täällä on liikaa tungosta{ENDQUOTES} +STR_1513 :{SMALLFONT}{OPENQUOTES}Täällä on todella paljon ilkivaltaa{ENDQUOTES} STR_1514 :{SMALLFONT}{OPENQUOTES}Mahtava maisema!{ENDQUOTES} -STR_1515 :{SMALLFONT}{OPENQUOTES}This park is really clean and tidy{ENDQUOTES} -STR_1516 :{SMALLFONT}{OPENQUOTES}The jumping fountains are great{ENDQUOTES} +STR_1515 :{SMALLFONT}{OPENQUOTES}Tämä puisto on todella puhdas ja siisti{ENDQUOTES} +STR_1516 :{SMALLFONT}{OPENQUOTES}Hyppivät suihkulähteet ovat todella mahtavia!{ENDQUOTES} STR_1517 :{SMALLFONT}{OPENQUOTES}Täällä oleva musiikki on hienoa{ENDQUOTES} -STR_1518 :{SMALLFONT}{OPENQUOTES}This balloon from {STRINGID} is really good value{ENDQUOTES} -STR_1519 :{SMALLFONT}{OPENQUOTES}This cuddly toy from {STRINGID} is really good value{ENDQUOTES} -STR_1520 :{SMALLFONT}{OPENQUOTES}This park map from {STRINGID} is really good value{ENDQUOTES} -STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} -STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} -STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} -STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} -STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} -STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} -STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} +STR_1518 :{SMALLFONT}{OPENQUOTES}Tämä ilmapallo kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1519 :{SMALLFONT}{OPENQUOTES}Tämä pehmolelu kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1520 :{SMALLFONT}{OPENQUOTES}Tämä puiston kartta kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1521 :{SMALLFONT}{OPENQUOTES}Tämä kuva kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1522 :{SMALLFONT}{OPENQUOTES}Tämä sateenvarjo kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1523 :{SMALLFONT}{OPENQUOTES}Tämä juoma kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1524 :{SMALLFONT}{OPENQUOTES}Tämä hampurilainen kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}Nämä ranskalaiset kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1526 :{SMALLFONT}{OPENQUOTES}Tämä jäätelö kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}Tämä hattara kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1528 : STR_1529 : STR_1530 : -STR_1531 :{SMALLFONT}{OPENQUOTES}This pizza from {STRINGID} is really good value{ENDQUOTES} +STR_1531 :{SMALLFONT}{OPENQUOTES}Tämä pitsa kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1532 : -STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good value{ENDQUOTES} -STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} -STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} -STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} -STR_1537 :{SMALLFONT}{OPENQUOTES}This toffee apple from {STRINGID} is really good value{ENDQUOTES} -STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} -STR_1539 :{SMALLFONT}{OPENQUOTES}This doughnut from {STRINGID} is really good value{ENDQUOTES} -STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} +STR_1533 :{SMALLFONT}{OPENQUOTES}Tämä popcorn kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1534 :{SMALLFONT}{OPENQUOTES}Tämä nakkisämpylä kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1535 :{SMALLFONT}{OPENQUOTES}Tämä lonkero kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1536 :{SMALLFONT}{OPENQUOTES}Tämä hattu kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}Tämä toffee omena kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1538 :{SMALLFONT}{OPENQUOTES}Tämä T-paita kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}Tämä donitsi kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1540 :{SMALLFONT}{OPENQUOTES}Tämä kahvi kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1541 : -STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} -STR_1543 :{SMALLFONT}{OPENQUOTES}This lemonade from {STRINGID} is really good value{ENDQUOTES} +STR_1542 :{SMALLFONT}{OPENQUOTES}Tämä friteerattu kana kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1543 :{SMALLFONT}{OPENQUOTES}Tämä limonaati {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1544 : STR_1545 : STR_1546 : @@ -1553,60 +1555,60 @@ STR_1547 : STR_1548 : STR_1549 : STR_1550 :{SMALLFONT}{OPENQUOTES}Vau!{ENDQUOTES} -STR_1551 :{SMALLFONT}{OPENQUOTES}I have the strangest feeling someone is watching me{ENDQUOTES} -STR_1552 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a balloon from {STRINGID}{ENDQUOTES} -STR_1553 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cuddly toy from {STRINGID}{ENDQUOTES} -STR_1554 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a park map from {STRINGID}{ENDQUOTES} -STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} -STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} -STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} -STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} -STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} -STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} -STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} +STR_1551 :{SMALLFONT}{OPENQUOTES}Minulla on outo fiilis että joku katselee minua{ENDQUOTES} +STR_1552 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa ilmapallosta kojussa {STRINGID}{ENDQUOTES} +STR_1553 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa pehmolelusta kojussa {STRINGID}{ENDQUOTES} +STR_1554 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa puiston kartasta kojussa {STRINGID}{ENDQUOTES} +STR_1555 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa kuva kojussa {STRINGID}{ENDQUOTES} +STR_1556 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa sateenvarjosta kojussa {STRINGID}{ENDQUOTES} +STR_1557 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa juomasta kojussa {STRINGID}{ENDQUOTES} +STR_1558 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa hampurilaisesta kojussa {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa ranskalaisista kojussa {STRINGID}{ENDQUOTES} +STR_1560 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa jäätelöstä kojussa {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa hattarasta kojussa {STRINGID}{ENDQUOTES} STR_1562 : STR_1563 : STR_1564 : -STR_1565 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for pizza from {STRINGID}{ENDQUOTES} +STR_1565 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa pitsasta kojussa {STRINGID}{ENDQUOTES} STR_1566 : -STR_1567 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for popcorn from {STRINGID}{ENDQUOTES} -STR_1568 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hot dog from {STRINGID}{ENDQUOTES} -STR_1569 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for tentacle from {STRINGID}{ENDQUOTES} -STR_1570 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hat from {STRINGID}{ENDQUOTES} -STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a toffee apple from {STRINGID}{ENDQUOTES} -STR_1572 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a T-shirt from {STRINGID}{ENDQUOTES} -STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a doughnut from {STRINGID}{ENDQUOTES} -STR_1574 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for coffee from {STRINGID}{ENDQUOTES} +STR_1567 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa popcornista kojussa {STRINGID}{ENDQUOTES} +STR_1568 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa nakkisämpylästä kojussa {STRINGID}{ENDQUOTES} +STR_1569 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa lonkerosta kojussa {STRINGID}{ENDQUOTES} +STR_1570 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa hatusta kojussa {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa toffee omenasta kojussa {STRINGID}{ENDQUOTES} +STR_1572 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa T-paidasta kojussa {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa donitsista kojussa {STRINGID}{ENDQUOTES} +STR_1574 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa kahvista kojussa {STRINGID}{ENDQUOTES} STR_1575 : -STR_1576 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried chicken from {STRINGID}{ENDQUOTES} -STR_1577 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for lemonade from {STRINGID}{ENDQUOTES} +STR_1576 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa friteeratusta kanasta kojussa {STRINGID}{ENDQUOTES} +STR_1577 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa limonaatista kojussa {STRINGID}{ENDQUOTES} STR_1578 : STR_1579 : STR_1580 : STR_1581 : STR_1582 : STR_1583 : -STR_1584 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} -STR_1585 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} -STR_1586 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} -STR_1587 :{SMALLFONT}{OPENQUOTES}This pretzel from {STRINGID} is really good value{ENDQUOTES} -STR_1588 :{SMALLFONT}{OPENQUOTES}This hot chocolate from {STRINGID} is really good value{ENDQUOTES} -STR_1589 :{SMALLFONT}{OPENQUOTES}This iced tea from {STRINGID} is really good value{ENDQUOTES} -STR_1590 :{SMALLFONT}{OPENQUOTES}This funnel cake from {STRINGID} is really good value{ENDQUOTES} -STR_1591 :{SMALLFONT}{OPENQUOTES}These sunglasses from {STRINGID} are really good value{ENDQUOTES} -STR_1592 :{SMALLFONT}{OPENQUOTES}These beef noodles from {STRINGID} are really good value{ENDQUOTES} -STR_1593 :{SMALLFONT}{OPENQUOTES}These fried rice noodles from {STRINGID} are really good value{ENDQUOTES} -STR_1594 :{SMALLFONT}{OPENQUOTES}This wonton soup from {STRINGID} is really good value{ENDQUOTES} -STR_1595 :{SMALLFONT}{OPENQUOTES}This meatball soup from {STRINGID} is really good value{ENDQUOTES} -STR_1596 :{SMALLFONT}{OPENQUOTES}This fruit juice from {STRINGID} is really good value{ENDQUOTES} -STR_1597 :{SMALLFONT}{OPENQUOTES}This soybean milk from {STRINGID} is really good value{ENDQUOTES} -STR_1598 :{SMALLFONT}{OPENQUOTES}This sujongkwa from {STRINGID} is really good value{ENDQUOTES} -STR_1599 :{SMALLFONT}{OPENQUOTES}This sub sandwich from {STRINGID} is really good value{ENDQUOTES} -STR_1600 :{SMALLFONT}{OPENQUOTES}This cookie from {STRINGID} is really good value{ENDQUOTES} +STR_1584 :{SMALLFONT}{OPENQUOTES}Tämä kuva kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1585 :{SMALLFONT}{OPENQUOTES}Tämä kuva kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1586 :{SMALLFONT}{OPENQUOTES}Tämä kuva kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1587 :{SMALLFONT}{OPENQUOTES}Tämä viipurinrinkeli kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1588 :{SMALLFONT}{OPENQUOTES}Tämä kuuma kaakao kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1589 :{SMALLFONT}{OPENQUOTES}Tämä jäätee kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1590 :{SMALLFONT}{OPENQUOTES}Tämä tippaleipä kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1591 :{SMALLFONT}{OPENQUOTES}Nämä aurinkolasit kojusta {STRINGID} are really good value{ENDQUOTES} +STR_1592 :{SMALLFONT}{OPENQUOTES}Nämä häränlihanuudelit kojusta {STRINGID} are really good value{ENDQUOTES} +STR_1593 :{SMALLFONT}{OPENQUOTES}Nämä paistetut riisinuudelit kojusta {STRINGID} are really good value{ENDQUOTES} +STR_1594 :{SMALLFONT}{OPENQUOTES}Tämä wonton keitto kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1595 :{SMALLFONT}{OPENQUOTES}Tämä lihapullakeitto kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1596 :{SMALLFONT}{OPENQUOTES}Tämä hedelmämehu kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1597 :{SMALLFONT}{OPENQUOTES}Tämä soijamaito kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1598 :{SMALLFONT}{OPENQUOTES}Tämä sujongkwa kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1599 :{SMALLFONT}{OPENQUOTES}Tämä subi kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1600 :{SMALLFONT}{OPENQUOTES}Tämä keksi kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1601 : STR_1602 : STR_1603 : -STR_1604 :{SMALLFONT}{OPENQUOTES}This roast sausage from {STRINGID} are really good value{ENDQUOTES} +STR_1604 :{SMALLFONT}{OPENQUOTES}Tämä grillattu makkara kojusta {STRINGID} are really good value{ENDQUOTES} STR_1605 : STR_1606 : STR_1607 : @@ -1618,27 +1620,27 @@ STR_1612 : STR_1613 : STR_1614 : STR_1615 : -STR_1616 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} -STR_1617 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} -STR_1618 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} -STR_1619 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a pretzel from {STRINGID}{ENDQUOTES} -STR_1620 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for hot chocolate from {STRINGID}{ENDQUOTES} -STR_1621 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for iced tea from {STRINGID}{ENDQUOTES} -STR_1622 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a funnel cake from {STRINGID}{ENDQUOTES} -STR_1623 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sunglasses from {STRINGID}{ENDQUOTES} -STR_1624 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for beef noodles from {STRINGID}{ENDQUOTES} -STR_1625 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried rice noodles from {STRINGID}{ENDQUOTES} -STR_1626 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for wonton soup from {STRINGID}{ENDQUOTES} -STR_1627 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for meatball soup from {STRINGID}{ENDQUOTES} -STR_1628 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fruit juice from {STRINGID}{ENDQUOTES} -STR_1629 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for soybean milk from {STRINGID}{ENDQUOTES} -STR_1630 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sujongkwa from {STRINGID}{ENDQUOTES} -STR_1631 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a sub sandwich from {STRINGID}{ENDQUOTES} -STR_1632 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cookie from {STRINGID}{ENDQUOTES} +STR_1616 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa kuvasta kojussa {STRINGID}{ENDQUOTES} +STR_1617 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa kuvasta kojussa {STRINGID}{ENDQUOTES} +STR_1618 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa kuvasta kojussa {STRINGID}{ENDQUOTES} +STR_1619 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa viipurinrinkelistä kojussa {STRINGID}{ENDQUOTES} +STR_1620 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa kaakaosta kojussa {STRINGID}{ENDQUOTES} +STR_1621 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa jääteestä kojussa {STRINGID}{ENDQUOTES} +STR_1622 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa tippaleivästä kojussa {STRINGID}{ENDQUOTES} +STR_1623 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa aurinkolaseista kojussa {STRINGID}{ENDQUOTES} +STR_1624 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa härkänuudeleista kojussa {STRINGID}{ENDQUOTES} +STR_1625 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa paistetusta riisinuudeleista kojussa {STRINGID}{ENDQUOTES} +STR_1626 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa wonton keitosta kojussa {STRINGID}{ENDQUOTES} +STR_1627 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa lihapullakeitosta kojussa {STRINGID}{ENDQUOTES} +STR_1628 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa hedelmämehusta kojussa {STRINGID}{ENDQUOTES} +STR_1629 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa soijamaidosta kojussa {STRINGID}{ENDQUOTES} +STR_1630 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa sujongkwa:sta kojussa {STRINGID}{ENDQUOTES} +STR_1631 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa subista kojussa {STRINGID}{ENDQUOTES} +STR_1632 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa keksistä kojussa {STRINGID}{ENDQUOTES} STR_1633 : STR_1634 : STR_1635 : -STR_1636 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a roast sausage from {STRINGID}{ENDQUOTES} +STR_1636 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa grillatusta makkarasta kojussa {STRINGID}{ENDQUOTES} STR_1637 : STR_1638 : STR_1639 : @@ -1652,11 +1654,11 @@ STR_1646 : STR_1647 : STR_1648 :{SMALLFONT}{OPENQUOTES}Auta! Laske minut alas!{ENDQUOTES} STR_1649 :{SMALLFONT}{OPENQUOTES}Rahat ovat loppumassa!{ENDQUOTES} -STR_1650 :{SMALLFONT}{OPENQUOTES}Vau! Uusi ajelu on rakennettu!{ENDQUOTES} -STR_1651 :{SMALLFONT}{OPENQUOTES}Nice ride! But not as good as the Phoenix...{ENDQUOTES} -STR_1652 :{SMALLFONT}{OPENQUOTES}I'm so excited - It's an Intamin ride!{ENDQUOTES} -STR_1653 :{SMALLFONT}{OPENQUOTES}...and here we are on {STRINGID}!{ENDQUOTES} -STR_1654 :{WINDOW_COLOUR_2}Viimeiset ajatukset: +STR_1650 :{SMALLFONT}{OPENQUOTES}Vau! Uutta laitetta rakennetaan!{ENDQUOTES} +STR_1651 :{SMALLFONT}{OPENQUOTES}Hieno laite! Mutta se ei ole yhtä hyvä kuin Phoenix:i...{ENDQUOTES} +STR_1652 :{SMALLFONT}{OPENQUOTES}Olen niin innoissani - se on Intamin laite!{ENDQUOTES} +STR_1653 :{SMALLFONT}{OPENQUOTES}...ja tässä me olemme {STRINGID}!{ENDQUOTES} +STR_1654 :{WINDOW_COLOUR_2}Viimeisimmät ajatukset: STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land STR_1656 :{SMALLFONT}{BLACK}Construct bridge or tunnel footpath STR_1657 :{WINDOW_COLOUR_2}Preferred ride @@ -3120,7 +3122,7 @@ STR_3109 :Avaa STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16} STR_3111 :{SMALLFONT}{BLACK}Click on design to build it STR_3112 :{SMALLFONT}{BLACK}Click on design to rename or delete it -STR_3113 :Valitse toinen malli +STR_3113 :Valitse toinen suunnitelma STR_3114 :{SMALLFONT}{BLACK}Go back to design selection window STR_3115 :{SMALLFONT}{BLACK}Save track design STR_3116 :{SMALLFONT}{BLACK}Save track design (Not possible until ride has been tested and statistics have been generated) @@ -3607,7 +3609,8 @@ STR_5267 :{SMALLFONT}{BLACK}Kulttuuri ja yksiköt STR_5268 :{SMALLFONT}{BLACK}Ääni STR_5269 :{SMALLFONT}{BLACK}Controls and interface STR_5270 :{SMALLFONT}{BLACK}Sekalaiset -STR_5271 :{SMALLFONT}{BLACK}Nykäys +# again, twitch is a name, and can't be translated +STR_5271 :{SMALLFONT}{BLACK}Twitch STR_5272 :{SMALLFONT}{BLACK}Small Scenery STR_5273 :{SMALLFONT}{BLACK}Large Scenery STR_5274 :{SMALLFONT}{BLACK}Jalkakäytävä From cc6832cf488f35d7c7d8b2778f40b16050840a03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Wed, 9 Sep 2015 00:08:28 +0100 Subject: [PATCH 0662/1173] fix travis builds by forcing it to ubuntu 14.04 This (for now) will force Travis' hand to use ubuntu 14.04 which has mingw 4.8 available. It is enough to compile the project as it stands. --- .travis.yml | 3 +++ install.sh | 1 + 2 files changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 863be8d7cd..116b0b1198 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,3 +17,6 @@ cache: apt: true sudo: required + +services: + - docker diff --git a/install.sh b/install.sh index e834c27d66..93d64307f5 100755 --- a/install.sh +++ b/install.sh @@ -74,6 +74,7 @@ if [[ `uname` == "Darwin" ]]; then popd fi elif [[ `uname` == "Linux" ]]; then + sudo apt-get update if [[ -z "$TRAVIS" ]]; then sudo apt-get install -y binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake if [[ -z "$DISABLE_G2_BUILD" ]]; then From 7c81d6b38c86e5e439e88aadb219ec786c2973f3 Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 9 Sep 2015 18:25:48 +0100 Subject: [PATCH 0663/1173] Update readme.md --- readme.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/readme.md b/readme.md index be3dc7ac0a..726131411a 100644 --- a/readme.md +++ b/readme.md @@ -5,7 +5,7 @@ An open source clone of RollerCoaster Tycoon 2 built by decompiling the original - [Screenshot 3, high resolution](http://i.imgur.com/yFzNyVu.jpg) - [Screenshot 4, resizable window](http://imgur.com/a/3GDuT) -[![Build Status](https://travis-ci.org/OpenRCT2/OpenRCT2.svg)](https://travis-ci.org/OpenRCT2/OpenRCT2) +[![Travis CI](https://travis-ci.org/OpenRCT2/OpenRCT2.svg)](https://travis-ci.org/OpenRCT2/OpenRCT2) [![AppVeyor](https://ci.appveyor.com/api/projects/status/fib6re830brysuo2?svg=true)](https://ci.appveyor.com/project/IntelOrca/openrct2) [![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/OpenRCT2/OpenRCT2?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) @@ -39,7 +39,7 @@ The project therefore acts as a patch to RollerCoaster Tycoon 2, allowing each p ## 1.3 Progress Currently, the windowing system, graphics rendering and basic game loop are being decompiled. Decompiling all of the game's procedures is a convenient way of identifying the game's memory structure. SDL2 has been used as a replacement for the operating system calls, allowing for cross-platform support after the dependency on the original game's executable has been removed. -As of 16th August 2014, various UI improvements have already been made, settings are now stored in a local INI file. More drawing functions have now been decompiled but still remain cryptic C, much of the game management have been decompiled (e.g. peep generation, awards, cash out) and almost half of the windows. A rough estimate based on number of functions in the original game and number of functions now in C tells us that the project is approximately 25% complete of its target goal of having the game run on 100% C code. More information can be found in [changes to original game](https://github.com/OpenRCT2/OpenRCT2/wiki/Changes-to-original-game) and [window progress](https://github.com/OpenRCT2/OpenRCT2/wiki/Window-progress). +As of 9th September 2015, a vast set of improvements have been added such as improved UI, tools, cheats, localisation and configuration. The entire window system and UI has been implemented, all file format handling such as loading and saving of parks, graphics and tracks, ride logic, game management (e.g. peep generation, awards, cash out) and a lot of the peep logic. What remains is a lot of code to draw the map, the rest of the peep logic, and the entirety of vehicle logic. The rest are small parts around different areas that aren't particularly significant. More information can be found in [changes to original game](https://github.com/OpenRCT2/OpenRCT2/wiki/Changes-to-original-game). ## 1.4 Aim The aim is to completely decompile RollerCoaster Tycoon 2 into C so that cross-platform support, new features, and new gameplay can be added in a similar fashion to OpenTTD. With the addition of SDL2, the game can already be run in a resizeable window (which was not possible originally). Once the game has been fully decompiled, additional gameplay features, gameplay tweaks, and improvements can be introduced. The following is only a brief, non-exhaustive list of the possibilities - there are many more: @@ -58,10 +58,10 @@ The aim is to completely decompile RollerCoaster Tycoon 2 into C so that cross-p # 2 Downloading the game / Building the source code -A couple of third parties offer downloadable precompiled builds. However, building the project is always recommended - -[OpenRCT2.com](https://openrct2.com/download) +Several third party build servers offer precompiled builds and installers of the latest stable and the develop branch. +[OpenRCT2.com](https://openrct2.com/download) [OpenRCT.net](https://openrct.net/builds.php) +[UrsaLabs](https://openrct.ursalabs.co) There is also a Launcher available from [OpenRCT.net](https://openrct.net/download) that will automatically update your build so that you always have the current version as they are released. @@ -108,6 +108,8 @@ As the easiest approach depends on your distribution, please take a look at the # 3 Contributing OpenRCT2 uses the [gitflow workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow). If you are implementing a new feature or logic from the original game, please branch off and perform pull requests to **develop**. If you are fixing a bug for the next release, please branch off and perform pull requests to the correct release branch. **master** only contains tagged releases, you should never branch off this. +Please read our [contributing guidelines](https://github.com/OpenRCT2/OpenRCT2/blob/develop/CONTRIBUTING.md) for information. + ## 3.1 Decompiling Experience with reverse engineering and x86 assembly is necessary to decompile the original game. [IDA 5.0](https://www.hex-rays.com/products/ida/support/download_freeware.shtml) is currently being used to disassemble and analyze the game. You are welcome to contribute to the process by taking an undecompiled procedure, disassembling it, and rewriting it in C. For more information and the latest IDA database, contact IntelOrca. @@ -138,9 +140,8 @@ Translations are in progress for German, Dutch, French, Hungarian, Polish, Spani # 5 More information - [GitHub](https://github.com/OpenRCT2/OpenRCT2) - [Facebook](https://www.facebook.com/OpenRCT2) -- [Automated builds](https://openrct2.com/download) -- [Secondary site for automated builds](https://openrct.net/builds.php) -- [Launcher that keeps your copy up-to-date](https://openrct.net/download) +- [OpenRCT2.com](https://openrct2.com) +- [OpenRCT.net](https://openrct.net) - [rct2 subreddit](http://www.reddit.com/r/rct/) - [openrct2 subreddit](http://www.reddit.com/r/openrct2) - [openrct2 subverse](http://www.voat.co/v/openrct2) From f271bc07216ba619ffa3e80845ab31d1f57fed53 Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 9 Sep 2015 18:27:01 +0100 Subject: [PATCH 0664/1173] Update .travis.yml --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 116b0b1198..6b56fed9be 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,8 +7,7 @@ script: - bash build.sh notifications: - irc: "irc.freenode.net#openrct2-dev" - on_failure: always + on_failure: change on_success: change cache: From 289555c082f913ef56e5bc6afdd7147c8f6c521d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 9 Sep 2015 19:22:41 +0100 Subject: [PATCH 0665/1173] fix #1908 --- src/core/StringBuilder.hpp | 14 ++++++++++++++ src/localisation/LanguagePack.cpp | 11 ++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/core/StringBuilder.hpp b/src/core/StringBuilder.hpp index b96c1cbe89..db83790573 100644 --- a/src/core/StringBuilder.hpp +++ b/src/core/StringBuilder.hpp @@ -41,13 +41,27 @@ public: */ void Append(const utf8 *text) { int textLength = strlen(text); + Append(text, textLength); + } + /** + * Appends the given string of the given length to the current string. Essentially used to ignore null terminators or copy + * the data faster as the length is already known. + */ + void Append(const utf8 *text, int textLength) { EnsureCapacity(_length + textLength + 1); Memory::Copy(_buffer + _length, text, textLength); _length += textLength; _buffer[_length] = 0; } + /** + * Appends the string of a given StringBuilder to the current string. + */ + void Append(const StringBuilder *sb) { + Append(sb->GetBuffer(), sb->GetLength()); + } + /** * Clears the current string, but preserves the allocated memory for another string. */ diff --git a/src/localisation/LanguagePack.cpp b/src/localisation/LanguagePack.cpp index cacc01da88..dd980d382e 100644 --- a/src/localisation/LanguagePack.cpp +++ b/src/localisation/LanguagePack.cpp @@ -445,7 +445,7 @@ void LanguagePack::ParseString(IStringReader *reader) } } - _stringDataSB.Append(sb.GetBuffer()); + _stringDataSB.Append(&sb); } bool LanguagePack::ParseToken(IStringReader *reader, uint32 *token) @@ -469,5 +469,14 @@ bool LanguagePack::ParseToken(IStringReader *reader, uint32 *token) const utf8 *tokenName = sb.GetBuffer(); *token = format_get_code(tokenName); + + // Handle explicit byte values + if (*token == 0) { + int number; + if (sscanf(tokenName, "%d", &number) == 1) { + *token = Math::Clamp(0, number, 255); + } + } + return true; } From 88db4f12aa9ee2ba7e51187834fc1e8304292a4d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 9 Sep 2015 20:25:34 +0100 Subject: [PATCH 0666/1173] fix #1910 --- src/windows/top_toolbar.c | 8 +++++- src/world/footpath.c | 57 +++++++++++++++++---------------------- 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 892faf9de5..490e4147ab 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -2130,7 +2130,13 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa //6e265b cost = game_do_command( map_tile.x, - parameter_1 | 0xE9, + (parameter_1 & 0xFF00) | ( + GAME_COMMAND_FLAG_APPLY | + GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | + GAME_COMMAND_FLAG_5 | + GAME_COMMAND_FLAG_GHOST | + GAME_COMMAND_FLAG_7 + ), map_tile.y, parameter_2, GAME_COMMAND_PLACE_PATH, diff --git a/src/world/footpath.c b/src/world/footpath.c index 8f8b762e9c..a46b074fa2 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -121,7 +121,7 @@ static void loc_6A6620(int flags, int x, int y, rct_map_element *mapElement) { int direction, z; - if ((mapElement->properties.path.type & 4) && !(flags & (1 << 6))) { + if ((mapElement->properties.path.type & 4) && !(flags & GAME_COMMAND_FLAG_GHOST)) { direction = mapElement->properties.path.type & 3; z = mapElement->base_height; map_remove_intersecting_walls(x, y, z, z + 6, direction ^ 2); @@ -129,14 +129,14 @@ static void loc_6A6620(int flags, int x, int y, rct_map_element *mapElement) mapElement = map_get_footpath_element(x / 32, y / 32, z); } - if (!(flags & (1 << 7))) + if (!(flags & GAME_COMMAND_FLAG_7)) footpath_connect_edges(x, y, mapElement, flags); sub_6A759F(); map_invalidate_tile_full(x, y); } -static money32 footpath_element_insert(int type, int x, int y, int z, int slope, int flags) +static money32 footpath_element_insert(int type, int x, int y, int z, int slope, int flags, uint8 pathItemType) { rct_map_element *mapElement; int bl, zHigh; @@ -184,7 +184,7 @@ static money32 footpath_element_insert(int type, int x, int y, int z, int slope, mapElement->clearance_height = z + 4 + (slope & 4 ? 2 : 0); mapElement->properties.path.type = (type << 4) | (slope & 7); mapElement->type |= type >> 7; - mapElement->properties.path.additions = RCT2_GLOBAL(0x00F3EF88, uint8); + mapElement->properties.path.additions = pathItemType; mapElement->properties.path.addition_status = 255; mapElement->flags &= ~MAP_ELEMENT_FLAG_BROKEN; if (flags & (1 << 6)) @@ -203,24 +203,24 @@ static money32 footpath_element_insert(int type, int x, int y, int z, int slope, return RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY ? 0 : RCT2_GLOBAL(0x00F3EFD9, money32); } -static money32 footpath_element_update(int x, int y, rct_map_element *mapElement, int type, int flags) +static money32 footpath_element_update(int x, int y, rct_map_element *mapElement, int type, int flags, uint8 pathItemType) { if ((mapElement->properties.path.type >> 4) != (type & 0x0F) || (mapElement->type & 1) != (type >> 7)) { RCT2_GLOBAL(0x00F3EFD9, money32) += MONEY(6, 00); - } else if (RCT2_GLOBAL(0x00F3EF88, uint16) != 0) { + } else if (pathItemType != 0) { if ( - !(flags & (1 << 6)) && - (mapElement->properties.path.additions & 0x0F) == RCT2_GLOBAL(0x00F3EF88, uint16) && + !(flags & GAME_COMMAND_FLAG_GHOST) && + (mapElement->properties.path.additions & 0x0F) == pathItemType && !(mapElement->flags & MAP_ELEMENT_FLAG_BROKEN) ) { - if (flags & (1 << 4)) + if (flags & GAME_COMMAND_FLAG_4) return MONEY32_UNDEFINED; return RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY ? 0 : RCT2_GLOBAL(0x00F3EFD9, money32); } - if (RCT2_GLOBAL(0x00F3EF88, uint16) != 0) { - rct_scenery_entry* scenery_entry = g_pathBitSceneryEntries[RCT2_GLOBAL(0x00F3EF88, uint16) - 1]; + if (pathItemType != 0) { + rct_scenery_entry* scenery_entry = g_pathBitSceneryEntries[pathItemType - 1]; uint16 unk6 = scenery_entry->path_bit.var_06; if ((unk6 & 0x80) && (mapElement->properties.path.type & 4)) { @@ -246,10 +246,10 @@ static money32 footpath_element_update(int x, int y, rct_map_element *mapElement RCT2_GLOBAL(0x00F3EFD9, money32) += scenery_entry->path_bit.price; } - if (flags & (1 << 4)) + if (flags & GAME_COMMAND_FLAG_4) return MONEY32_UNDEFINED; - if (flags & (1 << 6)) { + if (flags & GAME_COMMAND_FLAG_GHOST) { if (mapElement->properties.path.additions & 0x0F) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_NONE; return MONEY32_UNDEFINED; @@ -263,22 +263,16 @@ static money32 footpath_element_update(int x, int y, rct_map_element *mapElement return RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY ? 0 : RCT2_GLOBAL(0x00F3EFD9, money32); if ( - ( - RCT2_GLOBAL(0x00F3EF88, uint16) != 0 && - !(flags & (1 << 6)) - ) || - ( - RCT2_GLOBAL(0x00F3EF88, uint16) == 0 || - (mapElement->properties.path.additions & 0x80) - ) + (pathItemType != 0 && !(flags & GAME_COMMAND_FLAG_GHOST)) || + (pathItemType == 0 && (mapElement->properties.path.additions & 0x80)) ) { mapElement->properties.path.additions &= ~0x80; } - mapElement->properties.path.additions = (mapElement->properties.path.additions & 0xF0) | RCT2_GLOBAL(0x00F3EF88, uint8); - mapElement->flags &= ~0x20; - if (RCT2_GLOBAL(0x00F3EF88, uint16) != 0) { - rct_scenery_entry* scenery_entry = g_pathBitSceneryEntries[RCT2_GLOBAL(0x00F3EF88, uint16) - 1]; + mapElement->properties.path.additions = (mapElement->properties.path.additions & 0xF0) | pathItemType; + mapElement->flags &= ~MAP_ELEMENT_FLAG_BROKEN; + if (pathItemType != 0) { + rct_scenery_entry* scenery_entry = g_pathBitSceneryEntries[pathItemType - 1]; uint16 unk6 = scenery_entry->path_bit.var_06; if (unk6 & 1) mapElement->properties.path.addition_status = 255; @@ -287,18 +281,18 @@ static money32 footpath_element_update(int x, int y, rct_map_element *mapElement return RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY ? 0 : RCT2_GLOBAL(0x00F3EFD9, money32); } - if (flags & (1 << 4)) + if (flags & GAME_COMMAND_FLAG_4) return MONEY32_UNDEFINED; if (flags & GAME_COMMAND_FLAG_APPLY) { RCT2_GLOBAL(0x00F3EFF4, uint32) = 0x00F3EFF8; - if (!(flags & (1 << 7))) + if (!(flags & GAME_COMMAND_FLAG_7)) footpath_remove_edges_at(x, y, mapElement); mapElement->properties.path.type = (mapElement->properties.path.type & 0x0F) | (type << 4); mapElement->type = (mapElement->type & 0xFE) | (type >> 7); - mapElement->properties.path.additions = (mapElement->properties.path.additions & 0xF0) | RCT2_GLOBAL(0x00F3EF88, uint8); + mapElement->properties.path.additions = (mapElement->properties.path.additions & 0xF0) | pathItemType; mapElement->flags &= ~MAP_ELEMENT_FLAG_BROKEN; loc_6A6620(flags, x, y, mapElement); @@ -307,7 +301,7 @@ static money32 footpath_element_update(int x, int y, rct_map_element *mapElement return RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY ? 0 : RCT2_GLOBAL(0x00F3EFD9, money32); } -static money32 footpath_place_real(int type, int x, int y, int z, int slope, int flags, uint8 path_bit_type) +static money32 footpath_place_real(int type, int x, int y, int z, int slope, int flags, uint8 pathItemType) { rct_map_element *mapElement; @@ -326,7 +320,6 @@ static money32 footpath_place_real(int type, int x, int y, int z, int slope, int RCT2_GLOBAL(0x00F3EFD9, money32) = 0; RCT2_GLOBAL(0x00F3EFA4, uint8) = 0; - RCT2_GLOBAL(0x00F3EF88, uint16) = path_bit_type; // di if (x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) || y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16)) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_OFF_EDGE_OF_MAP; @@ -354,9 +347,9 @@ static money32 footpath_place_real(int type, int x, int y, int z, int slope, int footpath_provisional_remove(); mapElement = map_get_footpath_element_slope((x / 32), (y / 32), z, slope); if (mapElement == NULL) { - return footpath_element_insert(type, x, y, z, slope, flags); + return footpath_element_insert(type, x, y, z, slope, flags, pathItemType); } else { - return footpath_element_update(x, y, mapElement, type, flags); + return footpath_element_update(x, y, mapElement, type, flags, pathItemType); } } From b55d81e561015f2dbdff54c3fb079927afd52193 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 9 Sep 2015 22:14:43 +0100 Subject: [PATCH 0667/1173] implement ride_set_start_finish_points --- src/ride/ride.c | 151 ++++++++++++++++++++++++++++++++++++------------ src/ride/ride.h | 4 +- 2 files changed, 118 insertions(+), 37 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 901e95158c..7b5bccbb85 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -146,6 +146,7 @@ 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 sub_666CBE(int x, int y, rct_map_element *mapElement); rct_ride_type *ride_get_entry(rct_ride *ride) { @@ -4091,48 +4092,119 @@ bool ride_check_start_and_end_is_station(rct_xy_element *input, rct_xy_element * return true; } +/** + * Sets the position and direction of the returning point on the track of a boat hire ride. This will either be the end of the + * station or the last track piece from the end of the direction. + * rct2: 0x006B4D39 + */ +void ride_set_boat_hire_return_point(rct_ride *ride, rct_xy_element *startElement) +{ + int trackType; + int returnX = startElement->x; + int returnY = startElement->y; + rct_map_element *returnTrackElement = startElement->element; + track_begin_end trackBeginEnd; + while (track_block_get_previous(returnX, returnY, returnTrackElement, &trackBeginEnd)) { + int x = trackBeginEnd.begin_x; + int y = trackBeginEnd.begin_y; + int z = trackBeginEnd.begin_z; + int direction = trackBeginEnd.begin_direction; + trackType = trackBeginEnd.begin_element->properties.track.type; + sub_6C683D(&x, &y, &z, direction, trackType, 0, &returnTrackElement, 0); + returnX = x; + returnY = y; + }; + + trackType = returnTrackElement->properties.track.type; + int elementReturnDirection = RCT2_GLOBAL(0x009968BB + (trackType * 10), uint8); + ride->boat_hire_return_direction = (returnTrackElement->type + elementReturnDirection) & 3; + ride->boat_hire_return_position = (returnX >> 5) | ((returnY >> 5) << 8); +} + +/** + * + * rct2: 0x006B4D39 + */ +static void ride_set_maze_entrance_exit_points(rct_ride *ride) +{ + uint16 positions[9]; + + // Create a list of all the entrance and exit positions + uint16 *position = positions; + for (int i = 0; i < 4; i++) { + if (ride->entrances[i] != 0xFFFF) { + *position++ = ride->entrances[i]; + } + if (ride->exits[i] != 0xFFFF) { + *position++ = ride->exits[i]; + } + } + *position++ = 0xFFFF; + + // Enumerate entrance and exit positions + for (position = positions; *position != 0xFFFF; position++) { + int x = (*position & 0xFF) << 5; + int y = (*position >> 8) << 5; + int z = ride->station_heights[0]; + + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE) continue; + if ( + mapElement->properties.entrance.type != ENTRANCE_TYPE_RIDE_ENTRANCE && + mapElement->properties.entrance.type != ENTRANCE_TYPE_RIDE_EXIT + ) { + continue; + } + if (mapElement->base_height != z) continue; + + sub_666CBE(x, y, mapElement); + } while (!map_element_is_last_for_tile(mapElement++)); + } +} + +/** + * Sets a flag on all the track elements that can be the start of a circuit block. i.e. where a train can start. + * rct2: 0x006B4E6B + */ +static void ride_set_block_points(rct_xy_element *startElement) +{ + rct_xy_element currentElement = *startElement; + do { + int trackType = currentElement.element->properties.track.type; + switch (trackType) { + case TRACK_ELEM_END_STATION: + case TRACK_ELEM_CABLE_LIFT_HILL: + case TRACK_ELEM_25_DEG_UP_TO_FLAT: + case TRACK_ELEM_60_DEG_UP_TO_FLAT: + case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT: + case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT: + case 216: // block brakes + currentElement.element->flags &= ~(1 << 5); + break; + } + } while (track_block_get_next(¤tElement, ¤tElement, NULL, NULL) && currentElement.element != startElement->element); +} + /** * * rct2: 0x006B4D26 */ -void sub_6B4D26(int rideIndex, rct_xy_element *startElement) +void ride_set_start_finish_points(int rideIndex, rct_xy_element *startElement) { - RCT2_CALLPROC_X(0x006B4D26, startElement->x, 0, startElement->y, rideIndex, (int)startElement->element, 0, 0); return; - - rct_xy_element currentElement; - rct_ride *ride; - int trackType; - - ride = GET_RIDE(rideIndex); - if (ride->type == RIDE_TYPE_BOAT_RIDE) { - - } else if (ride->type != RIDE_TYPE_MAZE) { + rct_ride *ride = GET_RIDE(rideIndex); + switch (ride->type) { + case RIDE_TYPE_BOAT_RIDE: + ride_set_boat_hire_return_point(ride, startElement); + break; + case RIDE_TYPE_MAZE: + ride_set_maze_entrance_exit_points(ride); + break; } - if ( - ( - ride->mode == RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED || - ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED - ) && - !(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) - ) { - // Set flag on track pieces where a train can start - currentElement = *startElement; - do { - trackType = currentElement.element->properties.track.type; - switch (trackType) { - case TRACK_ELEM_END_STATION: - case TRACK_ELEM_CABLE_LIFT_HILL: - case TRACK_ELEM_25_DEG_UP_TO_FLAT: - case TRACK_ELEM_60_DEG_UP_TO_FLAT: - case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT: - case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT: - case 216: // block brakes - currentElement.element->flags &= ~(1 << 5); - break; - } - } while (track_block_get_next(¤tElement, ¤tElement, NULL, NULL) && currentElement.element != startElement->element); + if (ride_is_block_sectioned(ride) && !(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) { + ride_set_block_points(startElement); } } @@ -4358,7 +4430,7 @@ int ride_is_valid_for_test(int rideIndex, int goingToBeOpen, int isApplying) } if (isApplying) - sub_6B4D26(rideIndex, &trackElement); + ride_set_start_finish_points(rideIndex, &trackElement); if ( !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_13) && @@ -4481,7 +4553,7 @@ int ride_is_valid_for_open(int rideIndex, int goingToBeOpen, int isApplying) } if (isApplying) - sub_6B4D26(rideIndex, &trackElement); + ride_set_start_finish_points(rideIndex, &trackElement); if ( !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_13) && @@ -5510,6 +5582,13 @@ bool ride_is_powered_launched(rct_ride *ride) ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED; } +bool ride_is_block_sectioned(rct_ride *ride) +{ + return + ride->mode == RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED || + ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED; +} + bool ride_has_any_track_elements(int rideIndex) { map_element_iterator it; diff --git a/src/ride/ride.h b/src/ride/ride.h index fd932a11d4..a0135572f6 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -210,7 +210,8 @@ typedef struct { uint8 speed; // 0x0D0 uint8 rotations; // 0x0D0 }; - uint8 pad_0D1[0x3]; + uint8 boat_hire_return_direction; // 0x0D1 + uint16 boat_hire_return_position; // 0x0D2 uint8 measurement_index; // 0x0D4 // bits 0 through 4 are the number of helix sections // bit 5: spinning tunnel, water splash, or rapids @@ -997,6 +998,7 @@ bool ride_has_whirlpool(rct_ride *ride); bool ride_type_has_flag(int rideType, int flag); bool ride_is_powered_launched(rct_ride *ride); +bool ride_is_block_sectioned(rct_ride *ride); bool ride_has_any_track_elements(int rideIndex); void ride_all_has_any_track_elements(bool *rideIndexArray); From 72b153115b5e3e38b0df78b1df81c2769d342cf9 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 9 Sep 2015 22:56:40 +0100 Subject: [PATCH 0668/1173] fix #1909 --- src/management/news_item.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/management/news_item.c b/src/management/news_item.c index ee8bb0c151..4522321c99 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -208,13 +208,13 @@ static int news_item_get_new_history_slot() int i; // Find an available history news item slot - for (i = 11; i <= MAX_NEWS_ITEMS; i++) + for (i = 11; i < MAX_NEWS_ITEMS; i++) if (news_item_is_empty(i)) return i; // Dequeue the first history news item, shift history up news_item_shift_history_up(); - return MAX_NEWS_ITEMS; + return MAX_NEWS_ITEMS - 1; } /** From 85bbdde056fd0c905ab509baf11ab3e5910d668b Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 10 Sep 2015 04:00:15 +0100 Subject: [PATCH 0669/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 2075 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 2025 insertions(+), 50 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 05407b27a7..a391006f48 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -22,7 +22,7 @@ STR_0020 :Kabelbaan STR_0021 :Stalen schroefachtbaan STR_0022 :Doolhof STR_0023 :Spiraalglijbaan -STR_0024 :Go Karts +STR_0024 :Go-karts STR_0025 :Boomstamattractie STR_0026 :Wildwaterbaan STR_0027 :Botsauto's @@ -57,11 +57,11 @@ STR_0055 :Zijfrictie-achtbaan STR_0056 :Wilde muis STR_0057 :Multidimensie-achtbaan STR_0058 :Onbekende attractie (38) -STR_0059 :Omgekeerde luchtachtbaan +STR_0059 :Vliegachtbaan STR_0060 :Onbekende attractie (3A) STR_0061 :Virginia Reel STR_0062 :Plonsboten -STR_0063 :Minihelikopters +STR_0063 :Minihelicopters STR_0064 :Liggende achtbaan STR_0065 :Omgekeerde monorail STR_0066 :Onbekende attractie (40) @@ -526,13 +526,13 @@ STR_0524 :Een vrijevalwagen wordt pneumatisch langs een hoge stalen toren gel STR_0525 :Passagiers rijden over een kronkelende baan, waarbij ze enkel worden geleid door de ronding en banking van de halfronde baan. STR_0526 :Bezoekers gaan in een roterende observatiecabine langs een toren omhoog STR_0527 :Een soepele stalen achtbaan die verticale loopings kan maken. -STR_0528 :Passagiers varen in opblaasboten door een kronkelende halfopen of compleet gesloten glijbaan. +STR_0528 :Passagiers glijden in opblaasboten door een kronkelende halfopen of compleet gesloten glijbaan. STR_0529 :Achtbaantreinen in de vorm van een mijntrein razen over stalen achtbaanrails die er uitziet als een oude spoorbaan. STR_0530 :Stoeltjes hangen aan een continu draaiende stalen kabel die van het ene uiteinde van de baan naar het andere loopt, en daarna weer terug. STR_0531 :Een compacte stalen achtbaan waar de trein door schroeven en loopings gaat. STR_0532 : STR_0533 : -STR_0534 :Go-karts met benzinemotor die de passagiers zelf besturen +STR_0534 :Go-karts met benzinemotor die de passagiers zelf besturen. STR_0535 :Boten in de vorm van een boomstam varen door een waterbak, waarbij ze van steile hellingen afdalen om de passagiers te doorweken. STR_0536 :Ronde boten varen door een brede waterbak, waarbij ze de passagiers opwinden door watervallen en schuimende stroomversnellingen. STR_0537 : @@ -554,7 +554,7 @@ STR_0552 : STR_0553 : STR_0554 :Het karretje wordt het station uitgelanceerd over een lange rechte baan door middel van lineaire inductiemotoren, om daarna recht omhoog te gaan en weer terug te vallen richting het station. STR_0555 :Bezoekers gaan in een lift in een toren omhoog of omlaag om naar een ander hoogteniveau te komen. -STR_0556 :Extra brede karretjes gaan door over compleet verticale baan voor een ultimate vrijevalbeleving. +STR_0556 :Extra brede karretjes rijden over een compleet verticale baan voor de ultieme vrijevalbeleving. STR_0557 : STR_0558 : STR_0559 : @@ -575,7 +575,7 @@ STR_0573 :Aangedreven karretjes in de vorm van een helicopter rijden over een STR_0574 :Passagiers worden door middel van een speciale beugel in een liggende positie vastgehouden, waarna ze op hun rug of met hun gezicht naar de grond door kronkelende stukken baan en omkeringen heen gaan. STR_0575 :Aangedreven treinen hangen aan een enkele rail en vervoeren mensen door het park heen. STR_0576 : -STR_0577 :Karrtjes met draaistellen rijden op een houten baan en kunnen omkeren op speciale stukken baan. +STR_0577 :Karretjes met draaistellen rijden op een houten baan en kunnen omkeren op speciale stukken baan. STR_0578 :Karretjes rijden in een baan omgeven door hoepels en gaan door steile afdalingen en heartline-twists. STR_0579 : STR_0580 :Een gigantische stalen achtbaan die in staat is tot soepele afdalingen en heuvels die hoger zijn dan 90 meter. @@ -596,7 +596,7 @@ STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 :Omgekeerde achtbaantrein worden het station uit gelanceerd en gaan een verticale kronkelende baan op, waarna ze terugzakken, door het station heengaan en achteruit een ander stuk verticale baan opgaan. +STR_0598 :Een omgekeerde achtbaantrein wordt het station uit gelanceerd en gaat een verticale kronkelende baan op, waarna deze terugzakt, door het station heengaat en achteruit een ander stuk verticale baan opgaat. STR_0599 :Een compacte achtbaan met individuele karretjes en steile, kronkelende afdalingen. STR_0600 :Aangedreven mijntreinen rijden over een soepele en kronkelende baan. STR_0601 : @@ -1536,7 +1536,7 @@ STR_1533 :{SMALLFONT}{OPENQUOTES}Deze popcorn van {STRINGID} is erg goedkoop{ STR_1534 :{SMALLFONT}{OPENQUOTES}Deze hotdog van {STRINGID} is erg goedkoop{ENDQUOTES} STR_1535 :{SMALLFONT}{OPENQUOTES}Deze tentakel van {STRINGID} is erg goedkoop{ENDQUOTES} STR_1536 :{SMALLFONT}{OPENQUOTES}Deze hoed van {STRINGID} is erg goedkoop{ENDQUOTES} -STR_1537 :{SMALLFONT}{OPENQUOTES}Deze toffeeappel van {STRINGID} is erg goedkoop{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}Deze gevulde appel van {STRINGID} is erg goedkoop{ENDQUOTES} STR_1538 :{SMALLFONT}{OPENQUOTES}Dit T-shirt van {STRINGID} is erg goedkoop{ENDQUOTES} STR_1539 :{SMALLFONT}{OPENQUOTES}Deze donut van {STRINGID} is erg goedkoop{ENDQUOTES} STR_1540 :{SMALLFONT}{OPENQUOTES}Deze koffie van {STRINGID} is erg goedkoop{ENDQUOTES} @@ -1570,7 +1570,7 @@ STR_1567 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor popcorn van {STRI STR_1568 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een hotdog van {STRINGID}{ENDQUOTES} STR_1569 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een tentakel van {STRINGID}{ENDQUOTES} STR_1570 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een hoed van {STRINGID}{ENDQUOTES} -STR_1571 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een toffeeappel van {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een gevulde appel van {STRINGID}{ENDQUOTES} STR_1572 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een T-shirt van {STRINGID}{ENDQUOTES} STR_1573 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een donut van {STRINGID}{ENDQUOTES} STR_1574 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor koffie van {STRINGID}{ENDQUOTES} @@ -1980,7 +1980,7 @@ STR_1975 :{WINDOW_COLOUR_2}Prijs popcorn: STR_1976 :{WINDOW_COLOUR_2}Prijs hotdog: STR_1977 :{WINDOW_COLOUR_2}Prijs tentakel: STR_1978 :{WINDOW_COLOUR_2}Prijs hoed: -STR_1979 :{WINDOW_COLOUR_2}Prijs toffeeappel: +STR_1979 :{WINDOW_COLOUR_2}Prijs gevulde appel: STR_1980 :{WINDOW_COLOUR_2}Prijs T-shirt: STR_1981 :{WINDOW_COLOUR_2}Prijs donut: STR_1982 :{WINDOW_COLOUR_2}Prijs koffie: @@ -2008,7 +2008,7 @@ STR_2003 :Popcorn STR_2004 :Hotdog STR_2005 :Tentakel STR_2006 :Hoed -STR_2007 :Toffeeappel +STR_2007 :Gevulde appel STR_2008 :T-shirt STR_2009 :Donut STR_2010 :Koffie @@ -2036,7 +2036,7 @@ STR_2031 :Bakjes popcorn STR_2032 :Hotdogs STR_2033 :Tentakels STR_2034 :Hoeden -STR_2035 :Toffeeappels +STR_2035 :Gevulde appels STR_2036 :T-shirts STR_2037 :Donuts STR_2038 :Kopjes koffie @@ -2064,7 +2064,7 @@ STR_2059 :popcorn STR_2060 :een hotdog STR_2061 :een tentakel STR_2062 :een hoed -STR_2063 :een toffeeappel +STR_2063 :een gevulde appel STR_2064 :een T-shirt STR_2065 :een donut STR_2066 :een kop koffie @@ -2092,7 +2092,7 @@ STR_2087 :Popcorn STR_2088 :Hotdog STR_2089 :Tentakel STR_2090 :Hoed van {OPENQUOTES}{STRINGID}{ENDQUOTES} -STR_2091 :Toffeeappel +STR_2091 :Gevulde appel STR_2092 :T-shirt van {OPENQUOTES}{STRINGID}{ENDQUOTES} STR_2093 :Donut STR_2094 :Koffie @@ -3845,38 +3845,2013 @@ STR_5509 :{SMALLFONT}{BLACK}Maakt het mogelijk om scenario's en opgeslagen sp STR_5510 :Standaard geluidsapparaat STR_5511 :(ONBEKEND) STR_5512 :Spel opslaan als... -STR_5513 :Spel (snel) opslaan -STR_5514 :Vandalisme uitschakelen -STR_5515 :{SMALLFONT}{BLACK}Voorkomt dat bezoekers objecten in je park vernielen als ze kwaad zijn -STR_5516 :{SMALLFONT}{BLACK}Zwart -STR_5517 :{SMALLFONT}{BLACK}Grijs -STR_5518 :{SMALLFONT}{BLACK}Wit -STR_5519 :{SMALLFONT}{BLACK}Donkerpaars -STR_5520 :{SMALLFONT}{BLACK}Lichtpaars -STR_5521 :{SMALLFONT}{BLACK}Helder paars -STR_5522 :{SMALLFONT}{BLACK}Darkblauw -STR_5523 :{SMALLFONT}{BLACK}Lichtblauw -STR_5524 :{SMALLFONT}{BLACK}IJzig blauw -STR_5525 :{SMALLFONT}{BLACK}Turquoise -STR_5526 :{SMALLFONT}{BLACK}Aquamarijn -STR_5527 :{SMALLFONT}{BLACK}Verzadigd groen -STR_5528 :{SMALLFONT}{BLACK}Donkergroen -STR_5529 :{SMALLFONT}{BLACK}Mosgroen -STR_5530 :{SMALLFONT}{BLACK}Helder groen -STR_5531 :{SMALLFONT}{BLACK}Olijfgroen -STR_5532 :{SMALLFONT}{BLACK}Donker olijfgroen -STR_5533 :{SMALLFONT}{BLACK}Helder geel -STR_5534 :{SMALLFONT}{BLACK}Geel -STR_5535 :{SMALLFONT}{BLACK}Donkergeel -STR_5536 :{SMALLFONT}{BLACK}Lichtoranje -STR_5537 :{SMALLFONT}{BLACK}Donkeroranje -STR_5538 :{SMALLFONT}{BLACK}Lichtbruin -STR_5539 :{SMALLFONT}{BLACK}Verzadigd bruin -STR_5540 :{SMALLFONT}{BLACK}Donkerbruin -STR_5541 :{SMALLFONT}{BLACK}Zalmroze -STR_5542 :{SMALLFONT}{BLACK}Bordeauxrood -STR_5543 :{SMALLFONT}{BLACK}Verzadigd rood -STR_5544 :{SMALLFONT}{BLACK}Helder rood -STR_5545 :{SMALLFONT}{BLACK}Donkerroze -STR_5546 :{SMALLFONT}{BLACK}Helder roze -STR_5547 :{SMALLFONT}{BLACK}Lichtroze + +############# +# Scenarios # +############# + +## RCT2 Original + +STR_SCNR :Alpine Adventures +STR_PARK :Alpine Adventures +STR_DTLS :Maak van een klein skistation in de bergen een amusementspark met een sneeuwthema. + + +STR_SCNR :Amity Airfield +STR_PARK :Amity Airfield +STR_DTLS :Bouw een amusementspark met een luchtvaartthema op dit verlaten vliegveld. + + +STR_SCNR :Botany Breakers +STR_PARK :Botany Breakers +STR_DTLS :Het is je uitdaging om een zeer winstgevend park te bouwen op dit paradijselijke eiland. + + +STR_SCNR :Bumbly Bazaar +STR_PARK :Bumbly Bazaar +STR_DTLS :Beginnend met een klein marktkraampje, is het je uitdaging om de winst van winkels en kraampjes te vergroten door attracties en achtbanen te bouwen en zo meer klanten te trekken. + + +STR_SCNR :Crazy Castle +STR_PARK :Crazy Castle +STR_DTLS :Je hebt een groot kasteel geërfd - het is je opdracht er een klein themapark van te maken. + + +STR_SCNR :Dusty Greens +STR_PARK :Dusty Greens +STR_DTLS :Dusty Greens ligt aan een snelwegknooppunt in de woestijn, en is een gelegenheid om van een kleine golfbaan een succesvol themapark te maken. + + +STR_SCNR :Electric Fields +STR_PARK :Electric Fields +STR_DTLS :Je hebt een kleine boerderij geërfd, en het is je uitdaging een klein themapark tussen de velden en de boerderijen te bouwen. + + +STR_SCNR :Extreme Heights +STR_PARK :Extreme Heights +STR_DTLS :Vrij van financiële beperkingen, is het je uitdaging om dit woestijnpark uit te breiden om mensen te trekken die de extreemste sensaties zoeken. + + +STR_SCNR :Factory Capers +STR_PARK :Factory Capers +STR_DTLS :Een verlaten fabriekscomplex is een gelegenheid om een amusementspark met een mechanisch thema te bouwen. + + +STR_SCNR :Fungus Woods +STR_PARK :Fungus Woods +STR_DTLS :Beperkt tot uitsluitend de ouderwetse houten attracties, is het je uitdaging om een succesvol themapark in Fungus Woods te bouwen. + + +STR_SCNR :Ghost Town +STR_PARK :Ghost Town +STR_DTLS :Je wordt aangenomen door een grote keten van amusementsparken en het is je taak een gigantisch park met achtbanen te bouwen rond een verlaten mijnstadje. + + +STR_SCNR :Gravity Gardens +STR_PARK :Gravity Gardens +STR_DTLS :Het is je uitdaging een park met achtbanen in de prachtige Gravity Gardens te bouwen... geen andere attracties, alleen maar achtbanen! + + +STR_SCNR :Infernal Views +STR_PARK :Infernal Views +STR_DTLS :Een park dat op een hachelijke plaats is gevestigd: op een vulkaanse, naast stromende lava. + + +STR_SCNR :Lucky Lake +STR_PARK :Lucky Lake +STR_DTLS :Met een onbeperkt budget, maar gesitueerd op een veeleisende locatie is het een uitdaging dit park uit te breiden en te beheren. + + +STR_SCNR :Rainbow Summit +STR_PARK :Rainbow Summit +STR_DTLS :In dit park, gelegen op een heuvel, zijn hoge bouwwerken verboden. Kun je het park uitbreiden en het succesvol maken? + + +STR_SCNR :Six Flags Belgium +STR_PARK :Six Flags Belgium +STR_DTLS :Probeer dit Six Flags-park op je eigen manier te beheren en te verbeteren. + + +STR_SCNR :Six Flags Great Adventure +STR_PARK :Six Flags Great Adventure +STR_DTLS :Bouw de ontbrekende Six Flags-attracties, of maak je eigen ontwerpen om het park te verbeteren! Maar vergeet je uiteindelijke doel niet: meer bezoekers naar het park halen! + + +STR_SCNR :Six Flags Holland +STR_PARK :Six Flags Holland +STR_DTLS :Probeer dit Six Flags-park op je eigen manier te beheren en te verbeteren. + + +STR_SCNR :Six Flags Magic Mountain +STR_PARK :Six Flags Magic Mountain +STR_DTLS :Bouw de ontbrekende Six Flags-attracties, of maak je eigen ontwerpen om het park te verbeteren! Maar vergeet je uiteindelijke doel niet: je lening terugbetalen terwijl je de waarde van je park laat stijgen! + + +STR_SCNR :Six Flags over Texas +STR_PARK :Six Flags over Texas +STR_DTLS :Bouw de ontbrekende Six Flags-attracties, of maak je eigen ontwerpen om het park te verbeteren! Maar vergeet je uiteindelijke doel niet: meer bezoekers naar het park halen! + + +STR_SCNR :Bouw je eigen Six Flags Belgium +STR_PARK :Six Flags Belgium +STR_DTLS :Bouw je eigen versie van dit Europese Six Flags-park. + + +STR_SCNR :Bouw je eigen Six Flags Great Adventure +STR_PARK :Six Flags Great Adventure +STR_DTLS :Gebruik je ontwerpvaardigheden om dit Six Flags-park opnieuw te maken. + + +STR_SCNR :Bouw je eigen Six Flags Holland +STR_PARK :Six Flags Holland +STR_DTLS :Bouw je eigen versie van dit Europese Six Flags-park. + + +STR_SCNR :Bouw je eigen Six Flags Magic Mountain +STR_PARK :Six Flags Magic Mountain +STR_DTLS :Maak je eigen versie van dit enorme Six Flags-park. + + +STR_SCNR :Bouw je eigen Six Flags over Texas +STR_PARK :Six Flags over Texas +STR_DTLS :Maak je eigen versie van dit Six Flags-park. + + +STR_SCNR :Bouw je eigen Six Flags-park +STR_PARK :Six Flags +STR_DTLS :Maak je eigen Six Flags-park, door gebruik te maken van attracties uit andere Six Flags-parken of door zelf nieuwe attracties te ontwerpen. + +[NITROENT] +STR_NAME :'Nitro'-bord + +################################## +# Rides/attractions / Attracties # +################################## + +# 3D Cinema / 3d-bioscoop +[C3D] +STR_NAME :3D-bioscoop +STR_DESC :Bioscoop in een bolvormig gebouw waarin 3D-films worden getoond. +STR_CPTY :20 passagiers +# End of 3D Cinema / 3d-bioscoop + +# Mine Ride / Aangedreven mijntrein +[PMT1] +STR_NAME :Aangedreven mijntrein +STR_DESC :Aangedreven mijntreinen rijden over een soepele en kronkelende baan. +STR_CPTY :4 passagiers per karretje (voorste karretje 2) +# End of Mine Ride / Aangedreven mijntrein + +# Reverse Freefall Coaster / Achterwaartsevrijevalachtbaan +[REVF1] +STR_NAME :Wagen voor achterwaartse vrije val +STR_DESC :Grote wagen voor de achterwaartstevrijevalachtbaan. +STR_CPTY :8 passagiers + +#WW +[KOLARIDE] +STR_NAME :Koalabaan +STR_DESC :Grote wagen voor de achterwaartstevrijevalachtbaan. +STR_CPTY :8 passagiers + +#TT +[JETPACKX] +STR_NAME :Jetpack-booster +STR_DESC :Passagiers zitten in een voertuig dat gelanceerd wordt over een verticale baan. +STR_CPTY :8 passagiers +# End of Reverse Freefall Coaster / Achterwaartsevrijevalachtbaan + +# Car Ride / Autorondrit +[TRUCK1] +STR_NAME :Pickuptrucks +STR_DESC :Elektrische voertuigen in de vorm van een pickuptruck. +STR_CPTY :1 passagier per truck + +[RCR] +STR_NAME :Raceauto's +STR_DESC :Elektrische voertuigen in de vorm van een raceauto. +STR_CPTY :1 passagier per karretje + +[SPCAR] +STR_NAME :Sportauto's +STR_DESC :Elektrische voertuigen in de vorm van een sportauto. +STR_CPTY :1 passagier per karretje + +[VCR] +STR_NAME :Oldtimers +STR_DESC :Elektrische voertuigen in de vorm van een oldtimer. +STR_CPTY :1 passagier per karretje + +[CTCAR] +STR_NAME :Cheshire Cats +STR_DESC :Elektrische voertuigen in de vorm van een kat. +STR_CPTY :1 passagier per karretje + +[4X4] +STR_NAME :Monstertrucks +STR_DESC :Gigantische elektrische 4x4-trucks die steile hellingen kunnen nemen. +STR_CPTY :2 passagiers per truck + +#WW +[CRNVBFLY] +STR_NAME :Vlinderwagentjes +STR_DESC :Elektrische carnivalsoptochtwagentjes in de vorm van een vlinder. +STR_CPTY :2 passagiers per karretje + +#WW +[CRNVFROG] +STR_NAME :Kikkerwagentjes +STR_DESC :Elektrische carnivalsoptochtwagentjes in de vorm van een kikker. +STR_CPTY :2 passagiers per karretje + +#WW +[CRNVLZRD] +STR_NAME :Hagediswagentjes +STR_DESC :Elektrische carnivalsoptochtwagentjes in de vorm van een hagedis. +STR_CPTY :2 passagiers per karretje + +#WW +[BLACKCAB] +STR_NAME :Londonse taxi's +STR_DESC :Elektrische voertuigen in de vorm van een Londense taxi. +STR_CPTY :2 passagiers per karretje + +#WW +[HUSKIE] +STR_NAME :Huskiewagentjes +STR_DESC :Elektrische voertuigen in de vorm van een huskieslee. +STR_CPTY :2 passagiers per karretje + +#TT +[PEGASUSX] +STR_NAME :Pegasuskarretjes +STR_DESC :Elektrische voertuigen in de vorm van een kar die wordt voortgetrokken door Pegasus. +STR_CPTY :2 passagiers per karretje + +#TT +[HOVERCAR] +STR_NAME :Zweefwagens +STR_DESC :Door middel van maglev-technologie wordt de illusie van futuristische zweefwagens gecreëerd. +STR_CPTY :2 passagiers per karretje +# End of Car Ride / Autorondrit + +# Motion Simulator / Bewegingssimulator +[SIMPOD] +STR_NAME :Bewegingssimulator +STR_DESC :Passagiers bekijken een film in de cabine van een bewegingssimulator die wordt gedraaid en bewogen door een hydraulische arm. +STR_CPTY :8 passagiers + +#TT +[MICROBUS] +STR_NAME :Hippiebus +STR_DESC :Passagiers bekijken een film in de cabine van een bewegingssimulator die wordt gedraaid en bewogen door een hydraulische arm. +STR_CPTY :8 passagiers +# End of Motion Simulator / Bewegingssimulator + +# Bobsleigh Coaster / Bobslee-achtbaan +[BOB1] +STR_NAME :Bobslee-achtbaan +STR_DESC :Passagiers rijden over een kronkelende baan, waarbij ze enkel worden geleid door de ronding en banking van de halfronde baan. +STR_CPTY :2 passagiers per karretje + +[INTBOB] +STR_NAME :Zespersoonsbob +STR_DESC :Passagiers rijden over een kronkelende baan, waarbij ze enkel worden geleid door de ronding en banking van de halfronde baan. +STR_CPTY :6 passagiers per bob + +#WW +[PENGUINB] +STR_NAME :Pinguïnbobslee +STR_DESC :Passagiers rijden over een kronkelende baan, waarbij ze enkel worden geleid door de ronding en banking van de halfronde baan. +STR_CPTY :2 passagiers per karretje + +#TT +[BLCKDETH] +STR_NAME :Zwartedoodbobslee +STR_DESC :Passagiers rijden over een kronkelende baan in ratvormige karretjes, waarbij ze enkel worden geleid door de ronding en banking van de halfronde baan. +STR_CPTY :2 passagiers per karretje +# End of Bobsleigh Coaster / Bobslee-achtbaan + +# Log Flume / Boomstamattractie +[LFB1] +STR_NAME :Boomstamattractie +STR_DESC :Boten in de vorm van een boomstam varen door een waterbak, waarbij ze van steile hellingen afdalen om de passagiers te doorweken. +STR_CPTY :4 passagiers per boot + +#WW +[CROCFLUM] +STR_NAME :Krokillenrivier +STR_DESC :Boten in de vorm van een krokodil varen door een waterbak, waarbij ze van steile hellingen afdalen om de passagiers te doorweken. +STR_CPTY :4 passagiers per boot +# End of Log Flume / Boomstamattractie + +# Boat Ride / Bootverhuur +[RBOAT] +STR_NAME :Roeiboten +STR_DESC :Boten waarin passagiers zelf roeien. +STR_CPTY :2 passagiers per boot + +[BBOAT] +STR_NAME :Botsboten +STR_DESC :Kleine ronde bootjes, aangedreven door een centrale motor en bestuurd door de passagiers. +STR_CPTY :2 passagiers per boot + +[JSKI] +STR_NAME :Jetski's +STR_DESC :Eénpersoons jetski's die de bezoekers zelf kunnen besturen. +STR_CPTY :1 persoon per jetski + +[CBOAT] +STR_NAME :Kano's +STR_DESC :Lange kano's waarin de passagiers zelf roeien. +STR_CPTY :2 passagiers per kano + +[TRIKE] +STR_NAME :Waterfietsen +STR_DESC :Driewielige waterfietsen met grote raderwielen. +STR_CPTY :2 passagiers per waterfiets + +[SWANS] +STR_NAME :Zwanenbootjes +STR_DESC :Boten in de vorm van een zwaan, voortgestuwd door het trappen van de passagiers op de eerste rij. +STR_CPTY :4 passagiers per boot + +#WW +[DOLPHINR] +STR_NAME :Dolfijnenbootjes +STR_DESC :Eénpersoonsvoertuigen in de vorm van een dolfijn die de bezoekers zelf kunnen besturen. +STR_CPTY :1 persoon per voertuig + +#WW +[OUTRIGGR] +STR_NAME :Outriggerkano's +STR_DESC :Lange kano's waarin de passagiers zelf roeien. +STR_CPTY :2 passagiers per kano + +#WW +[TUTLBOAT] +STR_NAME :Schildpadbootjes +STR_DESC :Kleine ronde opblaasbootjes, aangedreven door een centrale motor en bestuurd door de passagiers. +STR_CPTY :2 passagiers per boot + +#WW +[MANDARIN] +STR_NAME :Mandarijneendbootjes +STR_DESC :Boot in de vorm van een mandarijneend, die wordt voortbewogen door het trappen van de passagiers op de eerste rij. +STR_CPTY :4 passagiers per boot + +#WW +[DHOWWATR] +STR_NAME :Dhowbootjes +STR_DESC :Decoratieve visserboot waarbij de passagiers zelf trappen. +STR_CPTY :2 passagiers per boot + +#CC +[AE-SWIM] +STR_NAME :Zwembad +STR_DESC :Een steiger waarvan gasten het water in kunnen om een stukje te zwemmen. Door "The Amazing Earl". +STR_CPTY :1 bezoeker per "boot" +# End of Boat Ride / Bootverhuur + +# Dodgems / Botsauto's +[DODG1] +STR_NAME :Botsauto's +STR_DESC :Elektrische wagentjes die de passagiers zelf besturen. +STR_CPTY :1 passagier per botsauto + +#TT +[TRICATOP] +STR_NAME :Triceratopsbotsauto's +STR_DESC :De passagiers vatten elkaar bij de horens in triceratopsvormige botsauto's. +STR_CPTY :1 passagier per botsauto + +#TT +[FIGTKNIT] +STR_NAME :Riddergevecht-botsauto's +STR_DESC :De passagiers strijden om de eer in paardvormige botsauto's. +STR_CPTY :1 passagier per botsauto +# End of Dodgems / Botsauto's + +# Circus +[CIRCUS1] +STR_NAME :Circus +STR_DESC :Een dierennummer in een circustent. +STR_CPTY :30 bezoekers +# End of Circus + +# Compact Inverted Coaster / Compacte omgekeerde achtbaan +[SLCT] +STR_NAME :Compacte omgekeerde achtbaan +STR_DESC :Passagiers zitten in stoelparen die onder de baan hangen terwijl ze door kronkelende en scherpe omkeringen gaan. +STR_CPTY :2 passagiers per karretje + +[VEKDV] +STR_NAME :Omgekeerde verticale shuttle +STR_DESC :Passagiers zitten in karretjes die onder de baan hangen, worden achteruit een verticale baan opgetrokken en vervolgens losgelaten, waarna ze door kronkelende en scherpe omkeringen gaan. +STR_CPTY :4 passagiers per karretje + +[SLCFO] +STR_NAME :Omgekeerde shuttle +STR_DESC :Passagiers zitten in stoelparen die onder de baan hangen terwijl ze door kronkelende en scherpe omkeringen gaan. +STR_CPTY :4 passagiers per karretje + +#WW +[POLARBER] +STR_NAME :IJsbeerachtbaan +STR_DESC :Passagiers zitten in paren, met het gezicht naar voren of achteren, en gaan door scherpe omkeringen. +STR_CPTY :4 passagiers per karretje +# End of Compact Inverted Coaster / Compacte omgekeerde achtbaan + +# Crooked House +[CHBUILD] +STR_NAME :Crooked House +STR_DESC :Gebouw met scheve kamers en gangen die de bezoekers desoriënteren. +STR_CPTY :5 bezoekers + +#TT +[FUNHOUSE] +STR_NAME :Fun House +STR_DESC :Gebouw met bewegende muren en vloeren om de bezoekers te desoriënteren. +STR_CPTY :5 bezoekers + +#TT +[HALOFMRS] +STR_NAME :Spiegelpaleis +STR_DESC :Gebouw met gebogen spiegels die de weerspiegeling van de bezoekers vervormen. +STR_CPTY :5 bezoekers + +#TT +[SPOKPRSN] +STR_NAME :Spookgevangenis +STR_DESC :Gebouw met kerkers en poppen van opgesloten mensen, om de bezoekers die er doorheen lopen angst aan te jagen. +STR_CPTY :5 bezoekers +# End of Crooked House + +# Maze / Doolhof +[HMAZE] +STR_NAME :Doolhof +STR_DESC :Bezoekers lopen door een doolhof van 1,8m hoge heggen en muren, en kunnen er pas uit wanneer ze de uitgang vinden. +# End of Maze / Doolhof + +# Merry-go-round / Draaimolen +[MGR1] +STR_NAME :Draaimolen +STR_DESC :Traditionele draaimolen met uit hout gesneden paarden. +STR_CPTY :16 passagiers + +#TT +[MGR2] +STR_NAME :Dubbeldekscarrousel +STR_DESC :Traditionele overdekte dubbeldekscarrousel met uit hout gesneden paarden. +STR_CPTY :32 passagiers +# End of Merry-go-round / Draaimolen + +# Enterprise +[ENTERP] +STR_NAME :Enterprise +STR_DESC :Draaiend wiel met hangende passagierscabines, dat eerst gaat draaien en vervolgens wordt opgetild door een steunarm. +STR_CPTY :16 passagiers + +#WW +[FIRECRAK] +STR_NAME :Voetzoekerenterprise +STR_DESC :Draaiend wiel met hangende passagierscabines, dat eerst gaat draaien en vervolgens wordt opgetild door een steunarm. +STR_CPTY :16 passagiers +# End of Enterprise + +# Monorail Cycles / Fietsbaan +[MONBK] +STR_NAME :Fietsbaan +STR_DESC :Speciale fietsen rijden over een stalen monorail, voortbewogen door het trappen van de passagiers. +STR_CPTY :1 persoon per fiets +# End of Monorail Cycles / Fietsbaan + +# Launched Freefall / Gelanceerde vrije val +[SSC1] +STR_NAME :Gelanceerde vrije val +STR_DESC :Een vrijevalwagen wordt pneumatisch langs een hoge stalen toren gelanceerd en gaat daarna in een vrije val weer naar beneden. +STR_CPTY :8 passagiers +# End of Launched Freefall / Gelanceerde vrije val + +# Giga Coaster / Giga-achtbaan +[INTST] +STR_NAME :Giga-achtbaan +STR_DESC :Een gigantische stalen achtbaan die in staat is tot soepele afdalingen en heuvels die hoger zijn dan 90 meter. +STR_CPTY :4 passagiers per karretje + +#WW +[TAXICSTR] +STR_NAME :Taxi-achtbaan +STR_DESC :Een gigantische stalen achtbaan met treinen in de vorm van een taxi die in staat is tot soepele afdalingen en heuvels die hoger zijn dan 90 meter. +STR_CPTY :4 passagiers per karretje +# End of Giga Coaster / Giga-achtbaan + +# Go-karts +[KART1] +STR_NAME :Go-karts +STR_DESC :Go-karts met benzinemotor die de passagiers zelf besturen. +STR_CPTY :1 persoon per kart + +#TT +[CAVMNCAR] +STR_NAME :Holbewoners-go-karts +STR_DESC :Passagiers racen in go-karts met een steentijdthema. +STR_CPTY :1 persoon per kart + +#TT +[1920RACR] +STR_NAME :Jarentwintig-raceauto's +STR_DESC :Passagiers racen in go-karts die er uitzien als raceauto's uit de jaren '20. +STR_CPTY :1 persoon per kart +# End of Go-karts + +# Heartline Twister +[UTCAR] +STR_NAME :Twisterkarretjes +STR_DESC :Achtbaankarretjes die geschikt zijn voor heartline twists. +STR_CPTY :4 passagiers per karretje + +[UTCARR] +STR_NAME :Twisterkarretjes (achterstevoren starten) +STR_DESC :Achtbaankarretjes die geschikt zijn voor heartline twists. +STR_CPTY :4 passagiers per karretje + +#WW +[TIGRTWST] +STR_NAME :Bengaalsetijgerkarretjes +STR_DESC :Achtbaankarretjes die geschikt zijn voor heartline twists. +STR_CPTY :4 passagiers per karretje +# End of Heartline Twister + +# Wooden Roller Coaster / Houten achtbaan +[PTCT1] +STR_NAME :Houten achtbaantrein +STR_DESC :Houten achtbaantrein met gevoerde zittingen en schootbeugels. +STR_CPTY :4 passagiers per karretje + +[PTCT2] +STR_NAME :Houten achtbaantrein (zespersoons) +STR_DESC :Houten achtbaantrein met gevoerde zittingen en schootbeugels. +STR_CPTY :6 passagiers per karretje + +[PTCT2R] +STR_NAME :Houten achtbaantrein (zespersoons, achteruit) +STR_DESC :Houten achtbaantrein met gevoerde zittingen en schootbeugels, die rijdt met de zittingen naar achteren. +STR_CPTY :6 passagiers per karretje + +[MFT] +STR_NAME :Gelede achtbaantrein +STR_DESC :Achtbaantrein met korte karretjes van één rij en een open voorkant. +STR_CPTY :2 passagiers per karretje + +#WW +[MINECART] +STR_NAME :Mijnkarretjes +STR_DESC :Houten achtbaantrein met gevoerde zittingen en schootbeugels. +STR_CPTY :4 passagiers per karretje + +#WW +[STGCCSTR] +STR_NAME :Postkoetsen +STR_DESC :Houten achtbaantrein met gevoerde zittingen en schootbeugels. +STR_CPTY :4 passagiers per karretje +# End of Wooden Roller Coaster / Houten achtbaan + +# Reverser Roller Coaster / Houten achteruitachtbaan +[REVCAR] +STR_NAME :Houten achteruitachtbaan +STR_DESC :Karretjes met draaistellen rijden op een houten baan en kunnen omkeren op speciale stukken baan. +STR_CPTY :6 passagiers per karretje + +#TT +[POLICECR] +STR_NAME :Politieautobaan +STR_DESC :Karretjes die er uitzien als een Amerikaanse politieauto uit de jaren '60 rijden op een houten baan en kunnen omkeren op speciale stukken baan. +STR_CPTY :6 passagiers per karretje +# End of Reverser Roller Coaster / Houten achteruitachtbaan + +# Wooden Wild Mouse / Houten wildemuisachtbaan +[WMMINE] +STR_NAME :Houten wildemijnachtbaan +STR_DESC :Kleine mijnkarretjes rijden op een zigzaggende baan en hellen gevaarlijk over in de haarspeldbochten en scherpe afdalingen. +STR_CPTY :2 passagiers per karretje + +[WMOUSE] +STR_NAME :Houten wildemuisachtbaan +STR_DESC :Kleine muisvormige karretjes rijden op een zigzaggende baan en hellen gevaarlijk over in de haarspeldbochten en scherpe afdalingen. +STR_CPTY :2 passagiers per karretje +# End of Wooden Wild Mouse / Houten wildemuisachtbaan + +# Junior Roller Coaster / Juniorachtbaan +[ZLDB] +STR_NAME :Lieveheersbeestjestreinen +STR_DESC :Achtbaantrein met kleine karretjes in de vorm van een lieveheersbeestje. +STR_CPTY :2 passagiers per karretje + +[ZLOG] +STR_NAME :Boomstronktreinen +STR_DESC :Achtbaantrein met kleine karretjes in de vorm van een boomstronk. +STR_CPTY :2 passagiers per karretje + +#WW +[WHICGRUB] +STR_NAME :Rupstreinen +STR_DESC :Achtbaantrein met kleine karretjes in de vorm van een grote rups. +STR_CPTY :2 passagiers per karretje + +#OCC +[ZPANDA] +STR_NAME :Pandatreinen +STR_DESC :Achtbaantrein met kleine karretjes in de vorm van een panda. +STR_CPTY :1 passagier per karretje +# End of Junior Roller Coaster / Juniorachtbaan + +# Chairlift / Kabelbaan +[CLIFT1] +STR_NAME :Stoeltjesliftkarretjes +STR_DESC :Open stoeltjesliftkarretjes. +STR_CPTY :2 passagiers per karretje + +[CLIFT2] +STR_NAME :Skiliftkarretjes +STR_DESC :Open karretjes in skiliftstijl. +STR_CPTY :2 passagiers per karretje +# End of Chairlift / Kabelbaan + +# LIM Launched RC / LIM-lanceringsachtbaan +[PREMT1] +STR_NAME :LIM-lanceringsachtbaan +STR_DESC :Achtbaantreinen worden door lineaire inductiemotoren het station uit gelanceerd en razen door een kronkelende baan die vaak over de kop gaat. +STR_CPTY :4 passagiers per karretje + +#WW +[TGVTRAIN] +STR_NAME :TGV-achtbaan +STR_DESC :Achtbaantreinen worden door lineaire inductiemotoren het station uit gelanceerd en razen door een kronkelende baan die vaak over de kop gaat. +STR_CPTY :4 passagiers per karretje + +#TT +[GANSTRCR] +STR_NAME :Gangsterauto-achtbaan +STR_DESC :Achtbaantreinen in de stijl van een gansterauto uit de jaren '20 worden door lineaire inductiemotoren het station uit gelanceerd en razen door een kronkelende baan die vaak over de kop gaat. +STR_CPTY :4 passagiers per karretje +# End of LIM Launched RC / LIM-lanceringsachtbaan + +# Lift +[LIFT1] +STR_NAME :Lift +STR_DESC :Bezoekers gaan in een lift in een toren omhoog of omlaag om naar een ander hoogteniveau te komen. +STR_CPTY :16 passagiers + +#WW +[MINELIFT] +STR_NAME :Mijnlift +STR_DESC :Bezoekers gaan in een lift in een toren omhoog of omlaag om naar een ander hoogteniveau te komen. +STR_CPTY :16 passagiers + +#TT +[TELEPTER] +STR_NAME :Teleporter +STR_DESC :Bezoekers gaan in een lift in een toren omhoog of omlaag om naar een ander hoogteniveau te komen. +STR_CPTY :16 passagiers +# End of Lift + +# Lay-down RC / Liggende achtbaan +[VEKST] +STR_NAME :Liggende achtbaan +STR_DESC :Passagiers worden door middel van een speciale beugel in een liggende positie vastgehouden, waarna ze op hun rug of met hun gezicht naar de grond door kronkelende stukken baan en omkeringen heen gaan. +STR_CPTY :4 passagiers per karretje + +#TT +[HARPIESX] +STR_NAME :Harpijenbaan +STR_DESC :Passagiers worden door middel van een speciale beugel in een liggende positie vastgehouden, waarna ze op hun rug of met hun gezicht naar de grond door kronkelende stukken baan en omkeringen heen gaan. +STR_CPTY :4 passagiers per karretje +# End of Lay-down RC / Liggende achtbaan + +# Air powered vertical RC / Luchtaangedreven verticale achtbaan +[THCAR] +STR_NAME :Luchtaangedreven verticale achtbaan +STR_DESC :Na een enerverende pneumatische lancering rijdt de trein met hogere snelheid over een verticale baan, over de top, en vervolgens over de andere kant weer naar beneden om terug te keren naar het station. +STR_CPTY :2 passagiers per karretje + +#WW +[BOMERANG] +STR_NAME :Boemerangachtbaan +STR_DESC :Na een enerverende pneumatische lancering rijdt de trein met hogere snelheid over een verticale baan, over de top, en vervolgens over de andere kant weer naar beneden om terug te keren naar het station. +STR_CPTY :2 passagiers per karretje + +#TT +[HOTRODXX] +STR_NAME :Hotrod-achtbaan +STR_DESC :Na een enerverende pneumatische lancering rijdt de trein met hogere snelheid over een verticale baan, over de top, en vervolgens over de andere kant weer naar beneden om terug te keren naar het station. +STR_CPTY :2 passagiers per karretje +# End of Air powered vertical RC / Luchtaangedreven verticale achtbaan + +# Mine train RC / Mijntreinachtbaan +[AMT1] +STR_NAME :Mijntreinachtbaan +STR_DESC :Achtbaantreinen in de vorm van een mijntrein razen over stalen achtbaanrails die er uitziet als een oude spoorbaan. +STR_CPTY :4 passagiers per karretje (voorste karretje 2) +# End of Mine train RC / Mijntreinachtbaan + +# Mini RC / Mini-achtbaan +[WCATC] +STR_NAME :Autokarretjes +STR_DESC :Achtbaankarretjes in de vorm van een auto. +STR_CPTY :4 passagiers per karretje + +[RCKC] +STR_NAME :Raketkarretjes +STR_DESC :Achtbaankarretjes in de vorm van een raket. +STR_CPTY :4 passagiers per karretje + +[JSTAR1] +STR_NAME :Rodelsleekarretjes +STR_DESC :Achtbaankarretjes in de vorm van een rodelslee, waarin de passagiers achter elkaar zitten. +STR_CPTY :4 passagiers per karretje + +#WW +[JAGUARRD] +STR_NAME :Jaguarkarretjes +STR_DESC :Achtbaankarretjes in de vorm van een jaguar. +STR_CPTY 4 passagiers per karretje + +#WW +[LIONRIDE] +STR_NAME :Leeuwenkarretjes +STR_DESC :Achtbaankarretjes in de vorm van een leeuw. +STR_CPTY :4 passagiers per karretje + +#WW +[RSSNCRRD] +STR_NAME :Russische auto's +STR_DESC :Achtbaankarretjes in de vorm van een Russische auto. +STR_CPTY :4 passagiers per auto + +#TT +[JETPLANE] +STR_NAME :Straalvliegtuigachtbaan +STR_DESC :Een compacte achtbaan met individuele karretjes en steile, kronkelende afdalingen. +STR_CPTY :4 passagiers per karretje +# End of Mini RC / Mini-achtbaan + +# Miniature railway / Miniatuurspoorweg +[NRL] +STR_NAME :Stoomtrein +STR_DESC :Miniatuurstroomtrein bestaande uit een replicastoomlocomotief en tender, die open houten wagons voorttrekt. +STR_CPTY :6 passagiers per wagon + +[NRL2] +STR_NAME :Stroomtrein met overdekte wagons +STR_DESC :Miniatuurstroomtrein bestaande uit een replicastoomlocomotief en tender, die wagons met stoffen overdekking voorttrekt. +STR_CPTY :6 passagiers per wagon + +[AML1] +STR_NAME :Amerikaanse stoomtrein +STR_DESC :Miniatuurstroomtrein bestaande uit een replicastoomlocomotief en tender, die wagons met stoffen overdekking voorttrekt. +STR_CPTY :6 passagiers per wagon + +[TRAM1] +STR_NAME :Trams +STR_DESC :Replica's van oude trams +STR_CPTY :10 passagiers per tram + +#WW +[LONDONBS] +STR_NAME :Londense bus +STR_DESC :Replica van de beroemde Londense Routemasters. +STR_CPTY :10 passagiers per bus + +#WW +[STEAMTRN] +STR_NAME :Maharadja-stoomtrein +STR_DESC :Miniatuurstroomtrein bestaande uit een replicastoomlocomotief en tender, die dichte houten wagons voorttrekt. +STR_CPTY :6 passagiers per wagon + +#WW +[SANFTRAM] +STR_NAME :Trams uit San Francisco +STR_DESC :Replica's van oude trams uit San Francisco +STR_CPTY :10 passagiers per tram + +#TT +[SCHOOLBS] +STR_NAME :Schoolbussen +STR_DESC :Replica's van Amerikaanse gele schoolbussen. +STR_CPTY :10 passagiers per bus +# End of Miniature railway / Miniatuurspoorweg + +# Mini Golf / Minigolf +[GOLF1] +STR_NAME :Miniholf +STR_DESC :Een rustig spelletje minigolf. +# End of Mini Golf / Minigolf + +# Mini Helicopters / Minihelicopters +[HELICAR] +STR_NAME :Minihelicopters +STR_DESC :Aangedreven karretjes in de vorm van een helicopter rijden over een stalen baan, bestuurd door het trappen van de passagiers. +STR_CPTY :2 passagiers per karretje +# End of Mini Helicopters / Minihelicopters + +# Monorail +[MONO1] +STR_NAME :Gestroomlijnde monorailtrein +STR_DESC :Monorailtrein met gestroomlijnde voor- en achterkant en een hoge capaciteit. +STR_CPTY :10 passagiers per karretje (voor en achter 5) + +[MONO2] +STR_NAME :Kleine monorailkarretjes +STR_DESC :Kleine monorailkarretjes met open zijkanten. +STR_CPTY :4 passagiers per karretje + +[MONO3] +STR_NAME :Retro-monorailtreinen +STR_DESC :Monorailtreinen met open karretjes. +STR_CPTY :4 passagiers per karretje +# End of Monorail + +# Multi-dimension RC / Multidimensieachtbaan +[ARRX] +STR_NAME :Multidimensieachtbaantrein +STR_DESC :Karretjes met stoelen die de passagiers halsoverkop kunnen laten tollen. +STR_CPTY :4 passagiers per karretje +# End of Multi-dimension RC / Multidimensieachtbaan + +# Observation Tower / Observatietoren +[OBS1] +STR_NAME :Observatietoren +STR_DESC :Draaiende observatiecabine die langs een verticale toren omhoog gaat. +STR_CPTY :20 passagiers + +[OBS2] +STR_NAME :Dubbelsdeks observatietoren +STR_DESC :Draaiende observatiecabine met twee dekken die langs een verticale toren omhoog gaat. +STR_CPTY :32 passagiers + +#TT +[BMVOCTPS] +STR_NAME :Klodder uit de ruimte +STR_DESC :Draaiende gethematiseerde observatiecabine die langs een verticale toren omhoog gaat. +STR_CPTY :20 passagiers +# End of Observation Tower / Observatietoren + +# Inverted Impulse RC / Omgekeerde Impulse-achtbaan +[INTINV] +STR_NAME :Omgekeerde Impulse-achtbaan +STR_DESC :Een omgekeerde achtbaantrein wordt het station uit gelanceerd en gaat een verticale kronkelende baan op, waarna deze terugzakt, door het station heengaat en achteruit een ander stuk verticale baan opgaat. +STR_CPTY :4 passagiers per karretje + +#TT +[BARNSTRM] +STR_NAME :Stuntvliegersachtbaan +STR_DESC :Een omgekeerde achtbaantrein wordt het station uit gelanceerd en gaat een verticale kronkelende baan op, waarna deze terugzakt, door het station heengaat en achteruit een ander stuk verticale baan opgaat. +STR_CPTY :4 passagiers per karretje +# End of Inverted Impulse RC / Omgekeerde Impulse-achtbaan + +# Inverted RC / Omgekeerde achtbaan +[NEMT] +STR_NAME :Omgekeerde achtbaan +STR_DESC :Passagiers zitten in stoelen die onder de baan hangen terwijl ze door grote loopings, twists en grote adembenemende afdelingen gaan. +STR_CPTY :4 passagiers per karretje +# End of Inverted RC / Omgekeerde achtbaan + +# Inverted Hairpin RC / Omgekeerde haarspeldachtbaan +[IVMC1] +STR_NAME :Omgekeerde haarspeldachtbaan +STR_DESC :Losse karretjes hangen onder een zigzaggende baan met haarspeldbochten en scherpe afdalingen. +STR_CPTY :4 passagiers per karretje +# End of Inverted Hairpin RC / Omgekeerde haarspeldachtbaan + +# Flying RC / Vliegachtbaan +[BMAIR] +STR_NAME :Vliegachtbaan +STR_DESC :Bezoekers hangen in treinen onder de baan met enkel schouderbeugels en krijgen zo de ervaring dat ze vliegen. +STR_CPTY :4 passagiers per karretje + +#WW +[CONDORRD] +STR_NAME :Condorbaan +STR_DESC :Bezoekers hangen in Condorvormige treinen onder de baan met enkel schouderbeugels en krijgen zo de ervaring dat ze vliegen. +STR_CPTY :4 passagiers per karretje + +#TT +[PTERODAC] +STR_NAME :Pterodactyl Coaster +STR_DESC :Bezoekers hangen in confortabele treinen onder de baan met enkel schouderbeugels en krijgen zo de ultieme prehistorische vliegervaring. +STR_CPTY :4 passagiers per karretje +# End of Flying RC / Vliegachtbaan + +# Inverted Mini RC / Omgekeerde mini-achtbaan +[BATFL] +STR_NAME :Schommelkarretjes +STR_DESC :Kleine karretjes die aan de rail erboven schommelen. +STR_CPTY :2 passagiers per karretje + +[SKYTR] +STR_NAME :Omgekeerde mini-achtbaan +STR_DESC :Passagiers zitten in kleine karretjes die onder een enkele rail hangen en naar buiten zwaaien in de bochten. +STR_CPTY :1 passagier per karretje + +#WW +[SPUTNIKR] +STR_NAME :Spoetnikbaan +STR_DESC :Passagiers zitten in karretjes in de vorm van de Spoetnik, die onder een enkele rail hangen en naar buiten zwaaien in de bochten. +STR_CPTY :2 passagiers per karretje + +#TT +[DRAGNFLY] +STR_NAME :Libellenbaan +STR_DESC :Passagiers zitten in kleine karretjes die onder een enkele rail hangen en naar buiten zwaaien in de bochten. +STR_CPTY :2 passagiers per karretje + +#TT +[HOVRBORD] +STR_NAME :Hoverboard Coaster +STR_DESC :Passagiers zitten op een futurisch hoverboard die onder een enkele rail hangt en naar buiten zwaait in de bochten. +STR_CPTY :2 passagiers per karretje +# End of Inverted Mini RC / Omgekeerde mini-achtbaan + +# Suspended monorail / Omgekeerde monorail +[SMONO] +STR_NAME :Hangende monorailtreinen +STR_DESC :Monorailtreinen met een hoge capaciteit. +STR_CPTY :8 passagiers per karretje + +#TT +[ZEPLELIN] +STR_NAME :Zeppelin +STR_DESC :Monorailtreinen met een hoge capaciteit. +STR_CPTY :8 passagiers per karretje +# End of Suspended monorail / Omgekeerde monorail + +# Suspended Swinging Coaster / Omgekeerde schommelachtbaan +[ARRSW1] +STR_NAME :Normale karretjes +STR_DESC :Omgekeerde achtbaantrein bestaande uit karretjes die vrijuit kunnen schommelen als de trein door een bocht gaat. +STR_CPTY :4 passagiers per karretje + +[ARRSW2] +STR_NAME :Vliegtuigkarretjes +STR_DESC :Omgekeerde achtbaantrein bestaande uit karretjes in de vorm van een vliegtuig, die vrijuit kunnen schommelen als de trein door een bocht gaat. +STR_CPTY :4 passagiers per karretje + +[VEKVAMP] +STR_NAME :Karretjes zonder bodem +STR_DESC :Omgekeerde achtbaantrein bestaande uit stoeltjesliftachtige karretjes die vrijuit kunnen schommelen als de trein door een bocht gaat. +STR_CPTY :2 passagiers per karretje + +#WW +[ROCKET] +STR_NAME :Raketten uit de jaren '50 +STR_DESC :Omgekeerde achtbaantrein bestaande uit karretjes in de vorm van een raket uit de jaren '50, die vrijuit kunnen schommelen als de trein door een bocht gaat. +STR_CPTY :4 passagiers per karretje + +#WW +[GORILLA] +STR_NAME :Gorillakarretjes +STR_DESC :Omgekeerde achtbaantrein bestaande uit karretjes in de vorm van een gorilla, die vrijuit kunnen schommelen als de trein door een bocht gaat. +STR_CPTY :4 passagiers per karretje + +#WW +[SLOTH] +STR_NAME :Luiaardkarretjes +STR_DESC :Omgekeerde achtbaantrein bestaande uit karretjes in de vorm van een luiaard, die vrijuit kunnen schommelen als de trein door een bocht gaat. +STR_CPTY :4 passagiers per karretje + +#WW +[FOOTBALL] +STR_NAME :Voetbalkarretjes +STR_DESC :Omgekeerde achtbaantrein bestaande uit karretjes in de vorm van een enorme voetbal, die vrijuit kunnen schommelen als de trein door een bocht gaat. +STR_CPTY :4 passagiers per karretje + +#TT +[SEAPLANE] +STR_NAME :Watervliegtuigbaan +STR_DESC :Omgekeerde achtbaantrein bestaande uit karretjes die vrijuit kunnen schommelen als de trein door een bocht gaat. +STR_CPTY :4 passagiers per karretje +# End of Suspended Swinging Coaster / Omgekeerde schommelachtbaan + +# Submarine ride / Onderzeeërattractie +[SUBMAR] +STR_NAME :Onderzeeërattractie +STR_DESC :Passagiers rijden over een onderwaterparcours in onderzeeërs. +STR_CPTY :4 passagiers per onderzeeër + +#WW +[HIPPORID] +STR_NAME :Nijlpaardonderzeeërs +STR_DESC :Passagiers rijden over een onderwaterparcours in onderzeeërs. +STR_CPTY :5 passagiers per onderzeeër + +#WW +[KILLWHAL] +STR_NAME :Orka-onderzeeërs +STR_DESC :Passagiers rijden over een onderwaterparcours in onderzeeërs. +STR_CPTY :5 passagiers per onderzeeër +# End of Submarine ride / Onderzeeërattractie + +# Splash boats / Plonsboten +[SPBOAT] +STR_NAME :Plonsboten +STR_DESC :Boten met een hoge capaciteit varen door een brede waterbak, worden naar boven vervoerd door een lopende band, en gaan met hoge snelheid steile heuvels af om met een grote plons de passagiers te doorweken. +STR_CPTY :16 passagiers per boot +# End of Splash boats / Plonsboten + +# Ferris Wheel / Reuzenrad +[FWH1] +STR_NAME :Reuzenrad +STR_DESC :Groot draaiend rad met open stoeltjes. +STR_CPTY :32 passagiers +# End of Ferris Wheel / Reuzenrad + +# River Rafts / Riviertocht +[RFTBOAT] +STR_NAME :Riviertocht +STR_DESC :Boten in de vorm van een vlot varen rustig door een waterbak. +STR_CPTY :4 passagiers per vlot + +#TT +[RIVRSTYX] +STR_NAME :De Styx +STR_DESC :Bezoekers varen in het bootje van Charon door een waterbak. +STR_CPTY :4 passagiers per bootje +# End of River Rafts / Riviertocht + +# Roto-drop +[GDROP1] +STR_NAME :Roto-drop +STR_DESC :Een ring van stoelen wordt naar de bovenkant van een hoge toren getrokken terwijl hij rustig ronddraait, waarna hij losgelaten wordt in een vrije val, waarna hij beneden rustig wordt afgeremd door middel van magnetische remmen. +STR_CPTY :16 passagiers +# End of Roto-drop + +# Space rings / Ruimteringen +[SRINGS] +STR_NAME :Ruimteringen +STR_DESC :Concentrische draaiende ringen waarmee de passagiers vrij kunnen draaien in alle richtingen. +STR_CPTY :1 bezoeker per ring + +#TT +[FLALMACE] +STR_NAME :Goedendags +STR_DESC :Passagiers zitten op stoel in de vorm van een goedendag die ronddraait aan een paal. +STR_CPTY :1 bezoeker per stoel + +#TT +[TIMEMACH] +STR_NAME :Tijdmachine +STR_DESC :Bezoekers zitten in een speciaal ontwerpen bol en krijgen de illusie dat ze door de tijd reizen. +STR_CPTY :1 bezoeker per tijdmachine +# End of Space rings / Ruimteringen + +# Swinging ship / Schommelschip +[SWSH1] +STR_NAME :Schommelschip +STR_DESC :Groot schommelend piratenschip +STR_CPTY :16 passagiers +# End of Swinging ship / Schommelschip + +# Swinging Inverter Ship / Schommelschip dat over de kop gaat +[SWSH2] +STR_NAME :Schommelschip dat over de kop gaat +STR_DESC :Schip dat is bevestigd aan een arm met een contragewicht, en 360 graden kan draaien. +STR_CPTY :12 passagiers + +#WW +[JUNKSWNG] +STR_NAME :Chinese jonk +STR_DESC :Chinese jonk die is bevestigd aan een arm met een contragewicht, en 360 graden kan draaien. +STR_CPTY :12 passagiers +# End of Swinging Inverter Ship / Schommelschip dat over de kop gaat + +# Spiral RC / Spiraalachtbaan +[SPDRCR] +STR_NAME :Spiraalachtbaan +STR_DESC :Een compacte achtbaan met een spiraalvormige kettingheuvel en karretjes waarin de passagiers achter elkaar zitten. +STR_CPTY :6 passagiers per karretje + +#WW +[RHINORID] +STR_NAME :Neushoornbaan +STR_DESC :Een compacte achtbaan met een spiraalvormige kettingheuvel en karretjes waarin de passagiers achter elkaar zitten. +STR_CPTY :6 passagiers per karretje + +#TT +[BATTRRAM] +STR_NAME :Stormrambaan +STR_DESC :Een compacte achtbaan met een spiraalvormige kettingheuvel en karretjes waarin de passagiers achter elkaar zitten. +STR_CPTY :6 passagiers per karretje +# End of Spiral RC / Spiraalachtbaan + +# Spiral Slide / Spiraalglijbaan +[HSKELT] +STR_NAME :Spiraalglijbaan +STR_DESC :Houten gebouw met van binnen een trap en van buiten een spiraalglijbaan voor glijmatten. +# End of Spiral Slide / Spiraalglijbaan + +# Haunted House / Spookhuis +[HHBUILD] +STR_NAME :Spookhuis +STR_DESC :Groot gethematiseerd gebouw met enge gangen en spookachtige kamers. +STR_CPTY :15 bezoekers +# End of Haunted House / Spookhuis + +# Ghost train / Spooktrein +[GTC] +STR_NAME :Spooktrein +STR_DESC :Aangedreven monstervormige karretjes rijden over een baan, die over meerdere hoogteniveau loopt, langs spookachtig decor en special effects. +STR_CPTY :2 passagiers per karretje + +[HMCAR] +STR_NAME :Spookachtig landhuis +STR_DESC :Aangedreven karretjes rijden over een baan, die over meerdere hoogteniveau loopt, langs decor en special effects. +STR_CPTY :2 passagiers per karretje +# End of Ghost train / Spooktrein + +# Stand-Up RC / Staande achtbaan +[TOGST] +STR_NAME :Staande achtbaan +STR_DESC :Een achtbaan met loopings waar de passagiers in de karretjes staan. +STR_CPTY :4 passagiers per karretje + +#WW +[OSTRICH] +STR_NAME :Struisvogelbaan +STR_DESC :Een achtbaan met loopings waar de passagiers in de karretjes staan. +STR_CPTY :4 passagiers per karretje +# End of Stand-Up RC / Staande achtbaan + +# Looping RC / Stalen achtbaan +[SCHT1] +STR_NAME :Achtbaantrein +STR_DESC :Achtbaantrein met schootbeugels, die door loopings kan rijden. +STR_CPTY :4 passagiers per karretje + +#TT +[POLCHASE] +STR_NAME :Politieachtervolging +STR_DESC :Achtbaantrein met schootbeugels, die door loopings kan rijden. +STR_CPTY :4 passagiers per karretje + +#CC +[AE-MTRHN] +STR_NAME :Matterhorntrein +STR_DESC :Achtbaantrein in de stijl van de beroemde Matterhorn voor de 50e verjaardag van Disneyland. Door "The Amazing Earl". +STR_CPTY :4 passagiers per karretje +# End of Looping RC / Stalen achtbaan + +# Corkscrew RC / Stalen schroefachtbaan +[ARRT1] +STR_NAME :Stalen schroefachtbaan +STR_DESC :Een compacte stalen achtbaan waar de trein door schroeven en loopings gaat. +STR_CPTY :4 passagiers per karretje + +[ARRT2] +STR_NAME :Hypercoaster +STR_DESC :Een achtbaan zonder omkeringen met grote heuvels, een hoge snelheid, en comfortabele treinen met enkel schootbeugels. +STR_CPTY :6 passagiers per karretje + +#WW +[ANACONDA] +STR_NAME :Anacondabaan +STR_DESC :Een achtbaan zonder omkeringen met grote heuvels, een hoge snelheid, en comfortabele treinen met enkel schootbeugels. +STR_CPTY :6 passagiers per karretje + +#WW +[GRATWHTE] +STR_NAME :Grote-witte-haaibaan +STR_DESC :Een achtbaan zonder omkeringen met grote heuvels, een hoge snelheid, en comfortabele treinen met enkel schootbeugels. +STR_CPTY :4 passagiers per karretje + +#WW +[CONGAEEL] +STR_NAME :Palingbaan +STR_DESC :Een compacte stalen achtbaan waar de palingvormige trein door schroeven en loopings gaat. +STR_CPTY :4 passagiers per karretje + +#WW +[BULLET] +STR_NAME :Shinkansenbaan +STR_DESC :Achtbaan met treinen in de vorm van de Japanse Shinkansen (kogeltrein). +STR_CPTY :4 passagiers per karretje + +#WW +[CADDILAC] +STR_NAME :Limousinebaan +STR_DESC :Achtbaan met treinen in de vorm van een limousine +STR_CPTY :4 passagiers per karretje + +#WW +[SEALS] +STR_NAME :Zeehondenbaan +STR_DESC :Een compacte stalen achtbaan waar de trein door schroeven en loopings gaat. +STR_CPTY :4 passagiers per karretje +# End of Corkscrew RC / Stalen schroefachtbaan + +# Steel Twister RC / Stalen twisterachtbaan +[BMSD] +STR_NAME :Twisterachtbaan +STR_DESC :Brede achtbaantrein die langs de soepele stalen baan glijdt en door diverse soorten omkeringen gaat. +STR_CPTY :4 passagiers per karretje + +[BMSU] +STR_NAME :Staande twisterachtbaan +STR_DESC :Passagiers staan in de brede achtbaantrein met speciaal ontworpen beugels terwijl ze door soepele afdalingen en meerdere omkeringen razen. +STR_CPTY :4 passagiers per karretje + +[BMFL] +STR_NAME :Achtbaan zonder bodem +STR_DESC :Brede achtbaantreinen zonder bodem, die de passagiers het gevoel geeft in de open lucht te zijn terwijl ze langs de kronkelende baan en door meerdere omkeringen glijden. +STR_CPTY :4 passagiers per karretje + +[GOLTR] +STR_NAME :Hyper-twistertreinen +STR_DESC :Ruime treinen met eenvoudige schootbeugels. +STR_CPTY :6 passagiers per karretje + +[BMRB] +STR_NAME :Hyper-twistertreinen (brede karretjes) +STR_DESC :Brede karretjes met vier verhoogde stoelen naast elkaar en eenvoudige schootbeugels. +STR_CPTY :4 passagiers per karretje + +#WW +[SURFBRDC] +STR_NAME :Surfbaan +STR_DESC :Passagiers staan in de brede achtbaantrein met speciaal ontworpen beugels terwijl ze door soepele afdalingen en meerdere omkeringen razen. +STR_CPTY :4 passagiers per karretje + +#TT +[CERBERUS] +STR_NAME :Cerberusbaan +STR_DESC :Bezoekers zitten in comfortabele treinen met enkel eenvoudige schootbeugels terwijl ze door door soepele afdalingen gaan. +STR_CPTY :4 passagiers per karretje +# End of Steel Twister RC / Stalen twisterachtbaan + +# Steeplechase (Singel Rail RC) +[STEEP1] +STR_NAME :Steeplechase +STR_DESC :Passagiers zitten op paardvormige voertuigen die over een enkele rail lopen. +STR_CPTY :2 passagiers per paard + +[STEEP2] +STR_NAME :Motorfietsrace +STR_DESC :Passagiers zitten op voertuigen in de vorm van een motorgiets die over een enkele rail lopen. +STR_CPTY :2 rassagiers per motorfiets + +[SBOX] +STR_NAME :Zeepkistenrace +STR_DESC :Passagiers zitten in voertuigen in de vorm van een zeepkist die over een enkele rail lopen. +STR_CPTY :4 passagiers per zeepkist + +#TT +[JOUSTING] +STR_NAME :Duellerende ridders +STR_DESC :Passagiers zitten op paardvormige voertuigen die over een enkele rail lopen. +STR_CPTY :2 passagiers per paard + +#TT +[RAPTORXX] +STR_NAME :Velociraptorrace +STR_DESC :Passagiers zitten op velociraptorvormige voertuigen die over een enkele rail lopen. +STR_CPTY :2 passagiers per velociraptor + +#TT +[HOVERBKE] +STR_NAME :Zweeffietsen +STR_DESC :Passagiers zitten op futuristische fietsvormige voertuigen die over een enkele rail lopen. +STR_CPTY :2 passagiers per zweeffiets + +#CC +[AE-REIND] +STR_NAME :Runaway Reindeer +STR_DESC :Passagiers zitten in paren op rendiervormige karretjes - compleet met knipperende rode neuzen. Door "The Amazing Earl". +STR_CPTY :2 passagiers per rendier +# End of Steeplechase (Singel Rail RC) + +# Topspin +[TOPSP1] +STR_NAME :Topspin +STR_DESC :Passagiers zitten in een gondel die is opgehangen aan grote roterende armen, en worden halsoverkop vooruit en achteruit gedraaid. +STR_CPTY :8 passagiers + +#TT +[TREBUCHT] +STR_NAME :Trebuchet-topspin +STR_DESC :Passagiers zitten in een gondel die is opgehangen aan grote roterende armen, gebaseerd op een middeleeuws belegeringswapen. +STR_CPTY :8 passagiers +# End of Topspin + +# Twist +[TWIST1] +STR_NAME :Twist +STR_DESC :Passagiers zitten per twee in stoelen die ronddraaien aan de uiteinden van drie lange draaiarmen. +STR_CPTY :18 passagiers + +[TWIST2] +STR_NAME :Sneeuwkopjes +STR_DESC :Passagiers zitten per twee in stoelen die om een sneeuwpop heendraaien. +STR_CPTY :18 passagiers + +#WW +[FABERGE] +STR_NAME :Fabergé-twist +STR_DESC :Passagiers zitten per twee in stoelen die ronddraaien aan de uiteinden van drie lange draaiarmen. +STR_CPTY :18 passagiers + +#WW +[DIAMONDR] +STR_NAME :Diamant-twist +STR_DESC :Passagiers zitten per twee in stoelen die ronddraaien aan de uiteinden van drie lange draaiarmen. +STR_CPTY :18 passagiers + +#WW +[ITALYPOR] +STR_NAME :Carabinieri-twist +STR_DESC :Passagiers zitten per twee in stoelen die ronddraaien aan de uiteinden van drie lange draaiarmen. +STR_CPTY :18 passagiers + +#WW +[COFFEECU] +STR_NAME :Koffiepot-twist +STR_DESC :Passagiers zitten per twee in stoelen die ronddraaien aan de uiteinden van drie lange draaiarmen. +STR_CPTY :18 passagiers + +#WW +[FIGHTKIT] +STR_NAME :Havik-twist +STR_DESC :Passagiers zitten per twee in stoelen die ronddraaien aan de uiteinden van drie lange draaiarmen. +STR_CPTY :18 passagiers + +#TT +[GINTSPDR] +STR_NAME :B-filmspin-twist +STR_DESC :Passagiers zitten per twee in stoelen die rond een reuzenspin uit een B-film draaien. +STR_CPTY :18 passagiers + +#TT +[DINOEGGS] +STR_NAME :Dinosaurei-twist +STR_DESC :Passagiers zitten per twee in stoelen die rond een bewegende moederdinosaurus draaien. +STR_CPTY :18 passagiers + +#TT +[NEPTUNEX] +STR_NAME :Neptunus-twist +STR_DESC :Passagiers zitten per twee in stoelen die rond een bewegend standbeeld van Neptunus draaien. +STR_CPTY :18 passagiers + +#TT +[TOMMYGUN] +STR_NAME :Tommygun-twist +STR_DESC :Passagiers zitten per twee in stoelen die rond een grote replica van een 'Tommy gun' draaien. +STR_CPTY :18 passagiers + +#CC +[RIDE4MKY] +STR_NAME :Zweefmolen +STR_DESC :Passagiers zitten in stoeltjes die onder een molen hangen en naar buiten vliegen als deze gaat draaien. +STR_CPTY :18 passagiers + +#CC +[AE-SWING] +STR_NAME :Zweefmolen +STR_DESC :Passagiers zitten in stoeltjes die onder een molen hangen en naar buiten vliegen als deze gaat draaien. Door "The Amazing Earl". +STR_CPTY :18 passagiers +# End of Twist + +# Vertical drop RC / Verticale achtbaan +[BMVD] +STR_NAME :Verticale achtbaan +STR_DESC :Extra brede karretjes rijden over een compleet verticale baan voor de ultieme vrijevalbeleving. +STR_CPTY :6 passagiers per karretje + +#TT +[VALKYRIE] +STR_NAME :Walkürenbaan +STR_DESC :Extra brede karretjes rijden over een compleet verticale baan voor de ultieme vrijevalbeleving. +STR_CPTY :6 passagiers per karretje +# End of Vertical drop RC / Verticale achtbaan + +# Virginia Reel +[VREEL] +STR_NAME :Virginia Reel +STR_DESC :Ronde karretjes gaan over een zigzaggende houten baan en draaien daarbij rond. +STR_CPTY :4 passagiers per karretje +# End of Virginia Reel + +# Magic Carpet / Vliegend tapijt +[MCARPET1] +STR_NAME :Vliegend tapijt +STR_DESC :Een grote wagen in de vorm van een vliegend tapijt draait rond aan de uiteinden van vier draaiarmen. +STR_CPTY :12 passagiers +# End of Magic Carpet / Vliegend tapijt + +# Flying saucers / Vliegende schotels +[FSAUC] +STR_NAME :Vliegende schotels +STR_DESC :Vliegende schotels die de passagiers zelf besturen +STR_CPTY :1 passagier per karretje + +#WW +[DRAGDODG] +STR_NAME :Chinese drakenkoppen +STR_DESC :Vliegende schotels die de passagiers zelf besturen +STR_CPTY :1 passagier per karretje + +#WW +[SKIDOO] +STR_NAME :Sneeuwscooters +STR_DESC :Elektrische sneeuwscooters die de passagiers zelf besturen +STR_CPTY :1 passagier per karretje + +#TT +[CYCLOPSX] +STR_NAME :Cyclopenogen +STR_DESC :Passagiers rijden in het oog van een grote cycloop. +STR_CPTY :1 passagier per karretje + +#TT +[FLWRPOWR] +STR_NAME :Flowerpower-schotels +STR_DESC :Vliegende schotels in de vorm van een bloem die de passagiers zelf besturen +STR_CPTY :1 passagier per karretje +# End of Flying saucers / Vliegende schotels + +# Water Coaster / Waterachtbaan +[CSTBOAT] +STR_NAME :Boten +STR_DESC :Achtbaankarretjes in de vorm van een boot. +STR_CPTY :6 passagiers per boot + +#WW +[MANTARAY] +STR_NAME :Manta's +STR_DESC :Achtbaankarretjes in de vorm van een manta (adelaarsrog). +STR_CPTY :6 passagiers per boot + +#TT +[TRILOBTE] +STR_NAME :Trilobietenbaan +STR_DESC :Bootvormige karretjes in de vorm van trilobiet rijden over achtbaanrails, waardoor ze hellende bochten en diepe afdalingen kunnen maken, waarna ze in bakken water neerplonzen en rustig een stukje kunnen varen. +STR_CPTY :6 passagiers per boot + +#TT +[FLYGBOAT] +STR_NAME :Vliegende boten +STR_DESC :Bootvormige karretjes rijden over achtbaanrails, waardoor ze hellende bochten en diepe afdalingen kunnen maken, waarna ze in bakken water neerplonzen en rustig een stukje kunnen varen. +STR_CPTY :6 passagiers per boot +# End of Water Coaster / Waterachtbaan + +# Dinghy Slide / Waterglijbaan +[DING1] +STR_NAME :Waterglijbaan +STR_DESC :Passagiers glijden in opblaasboten door een kronkelende halfopen of compleet gesloten glijbaan. +STR_CPTY :2 passagiers per bootje +# End of Dinghy Slide / Waterglijbaan + +# (Steel) Wild Mouse / (Stalen) Wilde muis +[SMC1] +STR_NAME :Muiskarretjes +STR_DESC :Losse karretjes in de vorm van een muis. +STR_CPTY :4 passagiers per karretje + +[SMC2] +STR_NAME :Mijnkarretjes +STR_DESC :Losse karretjes in de vorm van een houten mijnkarretje. +STR_CPTY :4 passagiers per karretje + +[WMSPIN] +STR_NAME :Draaiende wilde muis +STR_DESC :Muisvormige karretjes rijden snel door scherpe bochten en korte afdalingen, en draaien daarbij zachtjes rond om de passagiers te desoriënteren. +STR_CPTY :4 passagiers per karretje +# End of (Steel) Wild Mouse / (Stalen) Wilde muis + +# River Rapids / Wildwaterbaan +[RAPBOAT] +STR_NAME :Wildwaterbaan +STR_DESC :Ronde boten varen door een brede waterbak, waarbij ze de passagiers opwinden door watervallen en schuimende stroomversnellingen. +STR_CPTY :8 passagiers per boot + +#TT +[OAKBAREL] +STR_NAME :Eikenvatwildwaterbaan +STR_DESC :Eikenhouten vaten varen door een brede waterbak, waarbij ze de passagiers opwinden door watervallen en schuimende stroomversnellingen. +STR_CPTY :8 passagiers per boot +# End of River Rapids / Wildwaterbaan + +# Side-Friction RC / Zijfrictieachtbaan +[SFRIC1] +STR_NAME :Houten zijfrictiekarretjes +STR_DESC :Eenvoudige karretjes voor de zijfrictieachtbaan. +STR_CPTY :4 passagiers per karretjes +# End of Side-Friction RC / Zijfrictieachtbaan + +#################################### +# Shops/stalls / Winkels/kraampjes # +#################################### + +# Food stalls +[BURGB] +STR_NAME :Hamburgerbar +STR_DESC :Een hamburgervormig gebouw dat hamburgers verkoopt. + +[COOKST] +STR_NAME :Koekwinkel +STR_DESC :Een kraam waar grote koeken worden verkocht. + +[RSAUS] +STR_NAME :Gebradenworstkraam +STR_DESC :Een kraam waar Chinese gebraden worst wordt verkocht. + +[CHKNUG] +STR_NAME :Kipnuggetskraam +STR_DESC :Een kraam waar kipnuggets worden verkocht. + +[FRNOOD] +STR_NAME :Rijstnoedelkraam +STR_DESC :Een kraam waar Chinese gebakken rijstnoedels worden verkocht. + +[BNOODLES] +STR_NAME :Rundernoedelkraam +STR_DESC :Een kraam waar Chinese rundernoedels worden verkocht. + +[CHCKS] +STR_NAME :Gebakkenkipkraam +STR_DESC :Een kraam waar bakjes gebakken kip worden verkocht. + +[HOTDS] +STR_NAME :Hotdogkraam +STR_DESC :Een kraam waar hotdogs worden verkocht. + +[PIZZS] +STR_NAME :Pizzakraam +STR_DESC :Een kraam waar stukken pizza worden verkocht. + +[SUBSTL] +STR_NAME :Broodjeskraam +STR_DESC :Een kraam waar broodjes worden verkocht. + +[ICECR1] +STR_NAME :Vruchtenijskraam +STR_DESC :Een gethematiseerde kraam waar vruchtenijs wordt verkocht. + +[ICECR2] +STR_NAME :Roomijskraam +STR_DESC :Een kraam waar roomijs wordt verkocht. + +[SQDST] +STR_NAME :Zeevruchtenkraam +STR_DESC :Een kraam waar gebakken tentakel wordt verkocht. + +[WONTON] +STR_NAME :Wantansoepkraam +STR_DESC :Een kraam waar wantansoep wordt verkocht. + +[PRETST] +STR_NAME :Krakelingenkraam +STR_DESC :Een kraam waar knapperige zoute krakelingen worden verkocht. + +[TOFFS] +STR_NAME :Kraam met gevulde appels +STR_DESC :Een appelvormige kraam waar gevulde appels op een stokje worden verkocht. + +[CHPSH] +STR_NAME :Frietkot +STR_DESC :Een kraam waar friet wordt verkocht. + +[CHPSH2] +STR_NAME :Frietkraam +STR_DESC :Een kraam waar friet wordt verkocht. + +[CNDYF] +STR_NAME :Suikerspinkraam +STR_DESC :Een suikerspinvormige kraam waar roze suikerspinnen worden verkocht. + +[MBSOUP] +STR_NAME :Soep-met-balletjeskraam +STR_DESC :Een kraam waar Chinese soep met balletjes wordt verkocht. + +[FUNCAKE] +STR_NAME :Oliebollenkraam +STR_DESC :Een kraam waar oliebollen worden verkocht. + +[DOUGH] +STR_NAME :Donutkraam +STR_DESC :Een kraam waar donuts worden verkocht. + +[POPCS] +STR_NAME :Popcornkraam +STR_DESC :Een kraam waar grote emmers popcorn worden verkocht. + +#TT +[1920SAND] +STR_NAME :Artdeco-kraam +STR_DESC :Een kraam waar noedels en frisse limonade worden verkocht. + +#TT +[MEDISOUP] +STR_NAME :Heksensoep +STR_DESC :Een kraam waar dikke gebonden soep wordt verkocht. + +#TT +[MKTSTAL1] +STR_NAME :Marktkraam met gevulde appels +STR_DESC :Een marktkraam waar gevulde appels worden verkocht. + +#TT +[MYTHOSEA] +STR_NAME :Neptunus' zeevruchtenkraam +STR_DESC :Een kraam met Neptunus' zoute lekkernijen. +# End of Food stalls + +# Drink stalls +[COFFS] +STR_NAME :Koffiewinkel +STR_DESC :Een winkel in art-decostijl waar kopjes koffie worden verkocht. + +[CINDR] +STR_NAME :Sujeonggwakraam +STR_DESC :Een kraam waar Koreaanse sujeonggwa-drankjes worden verkocht. + +[HCHOC] +STR_NAME :Warmechocolademelkkraam +STR_DESC :Een kraam waar warme chocolademelk wordt verkocht. + +[DRNKS] +STR_NAME :Frisdrankkraam +STR_DESC :Een kraam in de vorm van vier blikjes waar frisdrank wordt verkocht. + +[ICETST] +STR_NAME :IJstheekraam +STR_DESC :Een kraam waar ijsthee wordt verkocht. + +[LEMST] +STR_NAME :Limonadekraam +STR_DESC :Een kraam waar verfrissende limonade wordt verkocht. + +[SOYBEAN] +STR_NAME :Sojamelkkraam +STR_DESC :Een kraam waar pakjes sojamelk worden verkocht. + +[STARFRDR] +STR_NAME :Vruchtendrankkraam +STR_DESC :Een kraam waar vruchtendrankjes worden verkocht. + +#TT +[MKTSTAL2] +STR_NAME :Marktkraam met limonade +STR_DESC :Een marktkraam waar ouderwetse, frisse limonade wordt verkocht. + +#TT +[MOONJUCE] +STR_NAME :Maansap +STR_DESC :Een waar de nieuwste soorten frisdrank worden verkocht. +# End of Drink stalls + +# Shops +[BALLN] +STR_NAME :Balloon Stall +STR_DESC :Een souvenirkraam waar met helium gevulde ballonnen worden verkocht. + +[HATST] +STR_NAME :Hoedenkraam +STR_DESC :Een souvenirkraam waar grote piepschuimen hoeden worden verkocht. + +[TSHRT] +STR_NAME :T-shirtkraam +STR_DESC :Een souvenirkraam waar T-shirts worden verkocht. + +[SUNGST] +STR_NAME :Zonnebrillenkraam +STR_DESC :Een kraam waar allerlei soorten zonnebrillen worden verkocht. + +[SOUVS] +STR_NAME :Souvenirkraam +STR_DESC :Een souvenirkraam waar knuffels en paraplu's worden verkocht. + +#TT +[SOFTOYST] +STR_NAME :Knuffelkraam +STR_DESC :Een kraam waar schattige zachtige dinosaurusknuffels worden verkocht. + +#TT +[1960TSRT] +STR_NAME :'Flower Power'-t-shirtkraam +STR_DESC :Een kraam waar t-shirts met bloemmotief worden verkocht. +# End of Shops + +# Toilets +[TLT1] +STR_NAME :Toiletten +STR_DESC :Eenvoudige toiletten in een prefab betonnen gebouw. + +[TLT2] +STR_NAME :Toiletten +STR_DESC :Toiletten in een gebouw in blokhutstijl. +# End of Toilets + +# Information Kiosks +[INFOK] +STR_NAME :Informatiekiosk +STR_DESC :Een kiosk waar gasten kaarten van het park en paraplu's kunnen kopen. +# End of Information Kiosks + +# Cash Machines +[ATM1] +STR_NAME :Geldautomaat +STR_DESC :Een geldautomaat die de bezoekers kunnen gebruiken als ze bijna door hun contante geld heen zijn. +# End of Cash Machines + +# First Aid +[FAID1] +STR_NAME :Eerste hulp +STR_DESC :Een gebouw waar misselijke gasten sneller kunnen opknappen. +# End of First Aid + +################################# +# Park Entrances / Parkingangen # +################################# + +[PKENT1] +STR_NAME :Traditionele parkingang + +[PKEMM] +STR_NAME :Parkingang met ijzeren poorten + +[PKESFH] +STR_NAME :Parkingang met gebouw + +#WW +[AFRICENT] +STR_NAME :Parkingang in Afrikaanse stijl + +#WW +[EUROENT] +STR_NAME :Parkingang in Europese stijl + +#WW +[ICEENT] +STR_NAME :Parkingang in ijsstijl + +#WW +[JAPENT] +STR_NAME :Parkingang in Japanse stijl + +#WW +[NAENT] +STR_NAME :Parkingang in Noord-Amerikaanse stijl + +#WW +[OZENTRAN] +STR_NAME :Parkingang in Australische stijl + +#WW +[SAMERENT] +STR_NAME :Parkingang in Zuid-Amerikaanse stijl + +#TT +[1920SENT] +STR_NAME :Parkingang in 'Roaring Twenties'-stijl + +#TT +[FUTURENT] +STR_NAME :Futuristische parkingang + +#TT +[GLDYRENT] +STR_NAME :Parkingang in 'rock 'n' roll'-stijl + +#TT +[JURASENT] +STR_NAME :Parkingang in prehistorische stijl + +#TT +[MEDIENTR] +STR_NAME :Parkingang in middeleeuwse stijl + +#TT +[MYTHENTR] +STR_NAME :Parkingang in mythologische stijl +######### +# Water # +######### + +[WTRCYAN] +STR_NAME :Natuurlijk water + +[WTRGREEN] +STR_NAME :Gifgroen water + +[WTRGRN] +STR_NAME :Groen water + +[WTRORNG] +STR_NAME :Oranje water + +#OCC +[WTRPINK] +STR_NAME :Roze water + +################# +# Paths / Paden # +################# + +[PATHASH] +STR_NAME :Voetpad met aslaag + +[PATHCRZY] +STR_NAME :Voetpad met onregelmatig plaveisel + +[PATHDIRT] +STR_NAME :Onverhard voetpad + +[PATHSPCE] +STR_NAME :Voetpad in ruimtestijl + +[ROAD] +STR_NAME :Weg + +[TARMAC] +STR_NAME :Voetpad van asfalt + +[TARMACB] +STR_NAME :Voetpad van bruin asfalt + +[TARMACG] +STR_NAME :Voetpad van groen asfalt + +#TT +[1920PATH] +STR_NAME :Stoep + +#TT +[FUTRPAT2] +STR_NAME :Printplaat-voetpad zonder leuningen + +#TT +[FUTRPATH] +STR_NAME :Printplaat-voetpad + +#TT +[JURRPATH] +STR_NAME :Rotsachtig voetpad + +#TT +[MEDIPATH] +STR_NAME :Houten voetpad + +#TT +[MYTHPATH] +STR_NAME :Mozaiek-voetpad + +#TT +[RANBPATH] +STR_NAME :Regenboogvoetpad + +################################# +# Scenery groups / Decorgroepen # +################################# + +[SCGABSTR] +STR_NAME :Abstract thema + +[SCGCANDY] +STR_NAME :Gigantisch-snoep-thema + +[SCGCLASS] +STR_NAME :Klassiek/Romeins thema + +[SCGEGYPT] +STR_NAME :Egyptisch thema + +[SCGFENCE] +STR_NAME :Hekken en muren + +[SCGGARDN] +STR_NAME :Bloemen + +[SCGGIANT] +STR_NAME :Gigantische-tuin-thema + +[SCGHALLO] +STR_NAME :Eng thema + +[SCGINDUS] +STR_NAME :Mechanisch thema + +[SCGJUNGL] +STR_NAME :Junglethema + +[SCGJURAS] +STR_NAME :Jurassisch thema + +[SCGMART] +STR_NAME :Marsthema + +[SCGMEDIE] +STR_NAME :Middeleeuws thema + +[SCGMINE] +STR_NAME :Mijnthema + +[SCGORIEN] +STR_NAME :Pagodethema + +[SCGPATHX] +STR_NAME :Borden en onderdelen voor voetpaden + +[SCGPIRAT] +STR_NAME :Piratenthema + +[SCGSHRUB] +STR_NAME :Struiken en ornamenten + +[SCGSIXFL] +STR_NAME :Six Flags-thema + +[SCGSNOW] +STR_NAME :Sneeuw- en ijsthema + +[SCGSPACE] +STR_NAME :Ruimtethema + +[SCGSPOOK] +STR_NAME :Spookthema + +[SCGSPORT] +STR_NAME :Sportthema + +[SCGTREES] +STR_NAME :Bomen + +[SCGURBAN] +STR_NAME :Stadsthema + +[SCGWALLS] +STR_NAME :Muren en daken + +[SCGWATER] +STR_NAME :Waterthema + +[SCGWOND] +STR_NAME :Wonderlandthema + +[SCGWWEST] +STR_NAME :Wildwestthema + +#WW +[SCGAFRIC] +STR_NAME : Afrikaans thema + +#WW +[SCGARTIC] +STR_NAME : Antarcticathema + +#WW +[SCGASIA] +STR_NAME : Aziatisch thema + +#WW +[SCGAUSTR] +STR_NAME : Australisch thema + +#WW +[SCGEUROP] +STR_NAME : Europees thema + +#WW +[SCGNAMRC] +STR_NAME : Noord-Amerikaans thema + +#WW +[SCGSAMER] +STR_NAME : Zuid-Amerikaans thema + +#TT +[SCG1920S] +STR_NAME : 'Roaring Twenties'-thema + +#TT +[SCG1920W] +STR_NAME : 'Roaring Twenties'-muren + +#TT +[SCG1960S] +STR_NAME : 'Rock 'n' roll'-thema + +#TT +[SCGFUTUR] +STR_NAME : Toekomstthema + +#TT +[SCGJURRA] +STR_NAME : Prehistorisch thema + +#TT +[SCGMEDIV] +STR_NAME : 'Donkere eeuwen'-thema + +#TT +[SCGMYTHO] +STR_NAME : Mythologisch thema From 17e635b8afe578c6cdb3a25425af6bcdf7d707cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 10 Sep 2015 08:11:00 +0200 Subject: [PATCH 0670/1173] In C++11 use actual pointer types instead of C's defines This is mostly `NULL` -> `nullptr` in cpp files, but I only noticed because `LanguagePack::GetObjectOverride` and `LanguagePack::GetScenarioOverride` were returning false instead of real pointer. Also fixes some whitespaces, you can `w=1` to github's URL to make it skip these. --- src/core/FileStream.hpp | 2 +- src/localisation/LanguagePack.cpp | 62 +++++++++++++++---------------- src/localisation/currency.h | 6 +-- src/localisation/date.c | 4 +- src/localisation/date.h | 4 +- src/localisation/format_codes.h | 6 +-- src/localisation/language.cpp | 52 +++++++++++++------------- src/localisation/language.h | 4 +- src/localisation/localisation.c | 8 ++-- src/localisation/localisation.h | 4 +- src/localisation/real_names.c | 6 +-- src/localisation/string_ids.h | 28 +++++++------- src/localisation/user.c | 8 ++-- src/localisation/user.h | 4 +- 14 files changed, 99 insertions(+), 99 deletions(-) diff --git a/src/core/FileStream.hpp b/src/core/FileStream.hpp index c70dfc90fa..e7b91d37d8 100644 --- a/src/core/FileStream.hpp +++ b/src/core/FileStream.hpp @@ -18,7 +18,7 @@ private: bool _canRead; bool _canWrite; bool _disposed; - + public: FileStream(const utf8 *path, int fileMode) { const char *mode; diff --git a/src/localisation/LanguagePack.cpp b/src/localisation/LanguagePack.cpp index dd980d382e..32a04c6793 100644 --- a/src/localisation/LanguagePack.cpp +++ b/src/localisation/LanguagePack.cpp @@ -18,7 +18,7 @@ constexpr int ScenarioOverrideMaxStringCount = 3; LanguagePack *LanguagePack::FromFile(int id, const utf8 *path) { - assert(path != NULL); + assert(path != nullptr); uint32 fileLength; utf8 *fileData; @@ -26,7 +26,7 @@ LanguagePack *LanguagePack::FromFile(int id, const utf8 *path) // Load file directly into memory try { FileStream fs = FileStream(path, FILE_MODE_OPEN); - + fileLength = (uint32)fs.GetLength(); fileData = Memory::Allocate(fileLength); fs.Read(fileData, fileLength); @@ -34,7 +34,7 @@ LanguagePack *LanguagePack::FromFile(int id, const utf8 *path) fs.Dispose(); } catch (Exception ex) { log_error("Unable to open %s: %s", path, ex.GetMessage()); - return NULL; + return nullptr; } // Parse the memory as text @@ -45,19 +45,19 @@ LanguagePack *LanguagePack::FromFile(int id, const utf8 *path) } LanguagePack *LanguagePack::FromText(int id, const utf8 *text) -{ +{ return new LanguagePack(id, text); } LanguagePack::LanguagePack(int id, const utf8 *text) { - assert(text != NULL); + assert(text != nullptr); _id = id; - _stringData = NULL; - _currentGroup = NULL; - _currentObjectOverride = NULL; - _currentScenarioOverride = NULL; + _stringData = nullptr; + _currentGroup = nullptr; + _currentObjectOverride = nullptr; + _currentScenarioOverride = nullptr; auto reader = UTF8StringReader(text); while (reader.CanRead()) { @@ -73,7 +73,7 @@ LanguagePack::LanguagePack(int id, const utf8 *text) for (size_t i = 0; i < _objectOverrides.size(); i++) { for (int j = 0; j < ObjectOverrideMaxStringCount; j++) { const utf8 **strPtr = &(_objectOverrides[i].strings[j]); - if (*strPtr != NULL) { + if (*strPtr != nullptr) { *strPtr = (utf8*)(stringDataBaseAddress + (size_t)*strPtr); } } @@ -81,7 +81,7 @@ LanguagePack::LanguagePack(int id, const utf8 *text) for (size_t i = 0; i < _scenarioOverrides.size(); i++) { for (int j = 0; j < ScenarioOverrideMaxStringCount; j++) { const utf8 **strPtr = &(_scenarioOverrides[i].strings[j]); - if (*strPtr != NULL) { + if (*strPtr != nullptr) { *strPtr = (utf8*)(stringDataBaseAddress + (size_t)*strPtr); } } @@ -106,7 +106,7 @@ const utf8 *LanguagePack::GetString(int stringId) const { if (_scenarioOverrides.size() > (size_t)ooIndex) { return _scenarioOverrides[ooIndex].strings[ooStringIndex]; } else { - return NULL; + return nullptr; } }else if (stringId >= ObjectOverrideBase) { int offset = stringId - ObjectOverrideBase; @@ -116,26 +116,26 @@ const utf8 *LanguagePack::GetString(int stringId) const { if (_objectOverrides.size() > (size_t)ooIndex) { return _objectOverrides[ooIndex].strings[ooStringIndex]; } else { - return NULL; + return nullptr; } } else { if (_strings.size() > (size_t)stringId) { return _strings[stringId]; } else { - return NULL; + return nullptr; } } } rct_string_id LanguagePack::GetObjectOverrideStringId(const char *objectIdentifier, int index) { - assert(objectIdentifier != NULL); + assert(objectIdentifier != nullptr); assert(index < ObjectOverrideMaxStringCount); int ooIndex = 0; for (const ObjectOverride &objectOverride : _objectOverrides) { if (strncmp(objectOverride.name, objectIdentifier, 8) == 0) { - if (objectOverride.strings[index] == NULL) { + if (objectOverride.strings[index] == nullptr) { return STR_NONE; } return ObjectOverrideBase + (ooIndex * ObjectOverrideMaxStringCount) + index; @@ -148,13 +148,13 @@ rct_string_id LanguagePack::GetObjectOverrideStringId(const char *objectIdentifi rct_string_id LanguagePack::GetScenarioOverrideStringId(const utf8 *scenarioFilename, int index) { - assert(scenarioFilename != NULL); + assert(scenarioFilename != nullptr); assert(index < ScenarioOverrideMaxStringCount); int ooIndex = 0; for (const ScenarioOverride &scenarioOverride : _scenarioOverrides) { if (_stricmp(scenarioOverride.filename, scenarioFilename) == 0) { - if (scenarioOverride.strings[index] == NULL) { + if (scenarioOverride.strings[index] == nullptr) { return STR_NONE; } return ScenarioOverrideBase + (ooIndex * ScenarioOverrideMaxStringCount) + index; @@ -167,7 +167,7 @@ rct_string_id LanguagePack::GetScenarioOverrideStringId(const utf8 *scenarioFile LanguagePack::ObjectOverride *LanguagePack::GetObjectOverride(const char *objectIdentifier) { - assert(objectIdentifier != NULL); + assert(objectIdentifier != nullptr); for (size_t i = 0; i < _objectOverrides.size(); i++) { ObjectOverride *oo = &_objectOverrides[i]; @@ -175,12 +175,12 @@ LanguagePack::ObjectOverride *LanguagePack::GetObjectOverride(const char *object return oo; } } - return false; + return nullptr; } LanguagePack::ScenarioOverride *LanguagePack::GetScenarioOverride(const utf8 *scenarioIdentifier) { - assert(scenarioIdentifier != NULL); + assert(scenarioIdentifier != nullptr); for (size_t i = 0; i < _scenarioOverrides.size(); i++) { ScenarioOverride *so = &_scenarioOverrides[i]; @@ -188,7 +188,7 @@ LanguagePack::ScenarioOverride *LanguagePack::GetScenarioOverride(const utf8 *sc return so; } } - return false; + return nullptr; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -310,8 +310,8 @@ void LanguagePack::ParseGroupObject(IStringReader *reader) if (sb.GetLength() == 8) { _currentGroup = sb.GetString(); _currentObjectOverride = GetObjectOverride(_currentGroup); - _currentScenarioOverride = NULL; - if (_currentObjectOverride == NULL) { + _currentScenarioOverride = nullptr; + if (_currentObjectOverride == nullptr) { _objectOverrides.push_back(ObjectOverride()); _currentObjectOverride = &_objectOverrides[_objectOverrides.size() - 1]; memset(_currentObjectOverride, 0, sizeof(ObjectOverride)); @@ -346,9 +346,9 @@ void LanguagePack::ParseGroupScenario(IStringReader *reader) SafeFree(_currentGroup); _currentGroup = sb.GetString(); - _currentObjectOverride = NULL; + _currentObjectOverride = nullptr; _currentScenarioOverride = GetScenarioOverride(_currentGroup); - if (_currentScenarioOverride == NULL) { + if (_currentScenarioOverride == nullptr) { _scenarioOverrides.push_back(ScenarioOverride()); _currentScenarioOverride = &_scenarioOverrides[_scenarioOverrides.size() - 1]; memset(_currentScenarioOverride, 0, sizeof(ObjectOverride)); @@ -388,7 +388,7 @@ void LanguagePack::ParseString(IStringReader *reader) const utf8 *identifier = sb.GetBuffer(); int stringId; - if (_currentGroup == NULL) { + if (_currentGroup == nullptr) { if (sscanf(identifier, "STR_%4d", &stringId) != 1) { // Ignore line entirely return; @@ -430,15 +430,15 @@ void LanguagePack::ParseString(IStringReader *reader) // Get the relative offset to the string (add the base offset when we extract the string properly) utf8 *relativeOffset = (utf8*)_stringDataSB.GetLength(); - if (_currentGroup == NULL) { + if (_currentGroup == nullptr) { // Make sure the list is big enough to contain this string id while (_strings.size() <= (size_t)stringId) { - _strings.push_back(NULL); + _strings.push_back(nullptr); } - + _strings[stringId] = relativeOffset; } else { - if (_currentObjectOverride != NULL) { + if (_currentObjectOverride != nullptr) { _currentObjectOverride->strings[stringId] = relativeOffset; } else { _currentScenarioOverride->strings[stringId] = relativeOffset; diff --git a/src/localisation/currency.h b/src/localisation/currency.h index c7cbd71300..c3147f7172 100644 --- a/src/localisation/currency.h +++ b/src/localisation/currency.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -35,7 +35,7 @@ typedef enum { CURRENCY_GUILDERS, // Dutch Gilder CURRENCY_KRONA, // Swedish Krona CURRENCY_EUROS, // Euro - + CURRENCY_END // Last item } CURRENCY_TYPE; diff --git a/src/localisation/date.c b/src/localisation/date.c index d0af9956b0..7b70923db9 100644 --- a/src/localisation/date.c +++ b/src/localisation/date.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/localisation/date.h b/src/localisation/date.h index 94d0f3af4c..69c373ff91 100644 --- a/src/localisation/date.h +++ b/src/localisation/date.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/localisation/format_codes.h b/src/localisation/format_codes.h index 7733597487..4f312be760 100644 --- a/src/localisation/format_codes.h +++ b/src/localisation/format_codes.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -136,4 +136,4 @@ enum { FORMAT_SYMBOL_FLAG = 20003, }; -#endif \ No newline at end of file +#endif diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index 5d3323408a..855b659e01 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -48,24 +48,24 @@ enum { }; static TTFFontSetDescriptor TTFFontMingLiu = {{ - { "msjh.ttc", 9, -1, -3, 6, NULL }, - { "mingliu.ttc", 11, 1, 1, 12, NULL }, - { "mingliu.ttc", 12, 1, 0, 12, NULL }, - { "mingliu.ttc", 13, 1, 0, 20, NULL }, + { "msjh.ttc", 9, -1, -3, 6, nullptr }, + { "mingliu.ttc", 11, 1, 1, 12, nullptr }, + { "mingliu.ttc", 12, 1, 0, 12, nullptr }, + { "mingliu.ttc", 13, 1, 0, 20, nullptr }, }}; static TTFFontSetDescriptor TTFFontSimSun = {{ - { "msyh.ttc", 9, -1, -3, 6, NULL }, - { "simsun.ttc", 11, 1, -1, 14, NULL }, - { "simsun.ttc", 12, 1, -2, 14, NULL }, - { "simsun.ttc", 13, 1, 0, 20, NULL }, + { "msyh.ttc", 9, -1, -3, 6, nullptr }, + { "simsun.ttc", 11, 1, -1, 14, nullptr }, + { "simsun.ttc", 12, 1, -2, 14, nullptr }, + { "simsun.ttc", 13, 1, 0, 20, nullptr }, }}; static TTFFontSetDescriptor TTFFontMalgun = { { - { "malgun.ttf", 8, -1, -3, 6, NULL }, - { "malgun.ttf", 11, 1, -2, 14, NULL }, - { "malgun.ttf", 12, 1, -4, 14, NULL }, - { "malgun.ttf", 13, 1, 0, 20, NULL }, + { "malgun.ttf", 8, -1, -3, 6, nullptr }, + { "malgun.ttf", 11, 1, -2, 14, nullptr }, + { "malgun.ttf", 12, 1, -4, 14, nullptr }, + { "malgun.ttf", 13, 1, 0, 20, nullptr }, } }; const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { @@ -116,22 +116,22 @@ void utf8_remove_format_codes(utf8 *text) const char *language_get_string(rct_string_id id) { - const char *openrctString = NULL; + const char *openrctString = nullptr; if (id == (rct_string_id)STR_NONE) - return NULL; + return nullptr; if (_languageCurrent != nullptr) openrctString = _languageCurrent->GetString(id); - if (openrctString == NULL && _languageFallback != nullptr) + if (openrctString == nullptr && _languageFallback != nullptr) openrctString = _languageFallback->GetString(id); if (id >= STR_OPENRCT2_BEGIN_STRING_ID) { - return openrctString != NULL ? openrctString : "(undefined string)"; + return openrctString != nullptr ? openrctString : "(undefined string)"; } else { const char *rct = _languageOriginal[id]; - const char *str = (openrctString == NULL || strlen(openrctString) == 0 ? rct : openrctString); - return str == NULL ? "" : str; + const char *str = (openrctString == nullptr || strlen(openrctString) == 0 ? rct : openrctString); + return str == nullptr ? "" : str; } } @@ -151,13 +151,13 @@ int language_open(int id) sprintf(filename, languagePath, gExePath, LanguagesDescriptors[id].path); _languageCurrent = LanguagePack::FromFile(id, filename); - if (_languageCurrent != NULL) { + if (_languageCurrent != nullptr) { gCurrentLanguage = id; if (LanguagesDescriptors[id].font == FONT_OPENRCT2_SPRITE) { ttf_dispose(); gUseTrueTypeFont = false; - gCurrentTTFFontSet = NULL; + gCurrentTTFFontSet = nullptr; } else { ttf_dispose(); gUseTrueTypeFont = true; @@ -187,7 +187,7 @@ void language_close_all() /* rct2: 0x0098DA16 */ uint16 ObjectTypeStringTableCount[] = { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }; -utf8 *_cachedObjectStrings[MAX_OBJECT_CACHED_STRINGS] = { NULL }; +utf8 *_cachedObjectStrings[MAX_OBJECT_CACHED_STRINGS] = { nullptr }; void utf8_trim_string(utf8 *text) { @@ -271,7 +271,7 @@ static bool rct2_language_is_multibyte_charset(int languageId) rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/*ecx*/, int index/*ebx*/, int tableindex/*edx*/) { uint8 languageId, chosenLanguageId; - char *pString = NULL; + char *pString = nullptr; int result = 0; bool isBlank; @@ -344,7 +344,7 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ // cache UTF-8 string int cacheStringOffset = stringid - STEX_BASE_STRING_ID; utf8 **cacheString = &_cachedObjectStrings[cacheStringOffset]; - if (*cacheString != NULL) { + if (*cacheString != nullptr) { free(*cacheString); } if (rct2_language_is_multibyte_charset(chosenLanguageId)) { @@ -366,7 +366,7 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ // cache UTF-8 string int cacheStringOffset = stringid - STEX_BASE_STRING_ID; utf8 **cacheString = &_cachedObjectStrings[cacheStringOffset]; - if (*cacheString != NULL) { + if (*cacheString != nullptr) { free(*cacheString); } if (rct2_language_is_multibyte_charset(chosenLanguageId)) { diff --git a/src/localisation/language.h b/src/localisation/language.h index 4cc301146e..4b76850447 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 141ce8805d..5149ff66cf 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -241,7 +241,7 @@ void format_comma_separated_integer(char **dest, long long value) // Append group separator if (groupIndex == 3) { groupIndex = 0; - + ch = commaMark; while (*ch != 0) { *dst++ = *ch++; @@ -309,7 +309,7 @@ void format_comma_separated_fixed_2dp(char **dest, long long value) // Append group separator if (groupIndex == 3) { groupIndex = 0; - + ch = commaMark; while (*ch != 0) { *dst++ = *ch++; diff --git a/src/localisation/localisation.h b/src/localisation/localisation.h index 51a9fe7b9c..a4551fde07 100644 --- a/src/localisation/localisation.h +++ b/src/localisation/localisation.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/localisation/real_names.c b/src/localisation/real_names.c index 0c1c8c1eef..2539f061c9 100644 --- a/src/localisation/real_names.c +++ b/src/localisation/real_names.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -1049,4 +1049,4 @@ const char *real_names[] = { "Zachary", "Zachery", "Zola" -}; \ No newline at end of file +}; diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 261fbaa8ad..cbd132239e 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -160,7 +160,7 @@ enum { STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS = 926, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE = 927, STR_RIDE_CONSTRUCTION_CHAIN_LIFT_TIP = 928, - + STR_S_BEND_LEFT = 929, STR_S_BEND_RIGHT = 930, STR_VERTICAL_LOOP_LEFT = 931, @@ -175,7 +175,7 @@ enum { STR_REMOVE_BASE_LAND = 940, STR_REMOVE_VERTICAL_FACES = 941, STR_SEE_THROUGH_RIDES = 942, - STR_SEE_THROUGH_SCENERY = 943, + STR_SEE_THROUGH_SCENERY = 943, STR_SAVE_PROMPT_SAVE = 944, STR_SAVE_PROMPT_DONT_SAVE = 945, @@ -592,13 +592,13 @@ enum { STR_HELIX_DOWN_LARGE = 1467, STR_STAFF = 1468, - + STR_RIDE_MUST_START_AND_END_WITH_STATIONS = 1469, STR_STATION_NOT_LONG_ENOUGH = 1470, STR_SPEED = 1471, STR_SPEED_TIP = 1472, - + STR_EXCITEMENT_RATING = 1473, STR_EXCITEMENT_RATING_NOT_YET_AVAILABLE = 1474, STR_INTENSITY_RATING = 1475, @@ -608,7 +608,7 @@ enum { STR_NAUSEA_RATING_NOT_YET_AVAILABLE = 1479, STR_THOUGHT_START = 1480, - + STR_CONSTRUCT_FOOTPATH_ON_LAND_TIP = 1655, STR_CONSTRUCT_BRIDGE_OR_TUNNEL_FOOTPATH_TIP = 1656, @@ -719,7 +719,7 @@ enum { STR_OFF = 1775, STR_ON = 1776, STR_MUSIC = 1777, - + STR_UNIFORM_COLOUR_TIP = 1790, STR_UNIFORM_COLOUR = 1791, STR_RESPONDING_TO_RIDE_BREAKDOWN_CALL = 1792, @@ -779,7 +779,7 @@ enum { STR_GUESTS_FAVOURITE_PLURAL_LABEL = 1843, STR_RIDE_LIST_INFORMATION_TYPE_TIP = 1844, STR_NUM_GUESTS = 1846, - + STR_PLAY_MUSIC = 1849, STR_SELECT_MUSIC_TIP = 1850, STR_RUNNING_COST_PER_HOUR = 1851, @@ -821,7 +821,7 @@ enum { STR_NEVER = 1885, STR_INSPECTING_RIDE = 1886, - + STR_TIME_SINCE_LAST_INSPECTION_MINUTES = 1887, STR_TIME_SINCE_LAST_INSPECTION_MORE_THAN_4_HOURS = 1888, STR_DOWN_TIME_LABEL_1889 = 1889, @@ -1572,7 +1572,7 @@ enum { STR_HEDGES = 3059, STR_ICE_BLOCKS = 3060, STR_WOODEN_FENCES = 3061, - + STR_RIDE_CONSTRUCTION_STANDARD_RC_TRACK_TIP = 3062, STR_RIDE_CONSTRUCTION_WATER_CHANNEL_TIP = 3063, @@ -1608,8 +1608,8 @@ enum { STR_SPACE_ENTRANCE = 3089, STR_SELECT_STYLE_OF_ENTRANCE_EXIT_STATION_TIP = 3090, - - STR_YOU_ARE_NOT_ALLOWED_TO_REMOVE_THIS_SECTION = 3091, + + STR_YOU_ARE_NOT_ALLOWED_TO_REMOVE_THIS_SECTION = 3091, STR_NOT_ALLOWED_TO_MODIFY_STATION = 3092, STR_SELECT_LIFT_HILL_CHAIN_SPEED_TIP = 3097, @@ -1774,7 +1774,7 @@ enum { STR_CLIMATE_WARM = STR_CLIMATE_COOL_AND_WET + 1, STR_CLIMATE_HOT_AND_DRY = STR_CLIMATE_COOL_AND_WET + 2, STR_CLIMATE_COLD = STR_CLIMATE_COOL_AND_WET + 3, - + STR_CHANGE = 3294, STR_CHANGE_NAME_OF_PARK_TIP = 3295, STR_CHANGE_NAME_OF_SCENARIO_TIP = 3296, diff --git a/src/localisation/user.c b/src/localisation/user.c index 0a61ccd1de..fea5d3eab1 100644 --- a/src/localisation/user.c +++ b/src/localisation/user.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -36,7 +36,7 @@ void user_string_clear_all() } /** - * + * * rct2: 0x006C421D */ rct_string_id user_string_allocate(int base, const utf8 *text) @@ -62,7 +62,7 @@ rct_string_id user_string_allocate(int base, const utf8 *text) } /** - * + * * rct2: 0x006C42AC */ void user_string_free(rct_string_id id) diff --git a/src/localisation/user.h b/src/localisation/user.h index 879c09ad49..54939ea9a8 100644 --- a/src/localisation/user.h +++ b/src/localisation/user.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ From 2c71e8c419d86de307c8639d3cc0b3ccac6edb10 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Thu, 10 Sep 2015 14:39:49 +0200 Subject: [PATCH 0671/1173] Fix Condor Ride description, fixes #1021 --- data/language/english_uk.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index ff6f0386cb..af3e4d140e 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3886,3 +3886,13 @@ STR_5544 :{SMALLFONT}{BLACK}Bright red STR_5545 :{SMALLFONT}{BLACK}Dark pink STR_5546 :{SMALLFONT}{BLACK}Bright pink STR_5547 :{SMALLFONT}{BLACK}Light pink + +##################### +# Rides/attractions # +##################### + +#WW +[CONDORRD] +STR_NAME :Condor Ride +STR_DESC :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air in Condor-shaped trains +STR_CPTY :4 passengers per car From bda7550e33837891851ee3b0c675792fd9702743 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 10 Sep 2015 20:06:13 +0100 Subject: [PATCH 0672/1173] fix #1913 --- src/peep/peep.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 0ac27206f2..9d15b9e1f2 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7974,9 +7974,12 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) } } } - if (!(RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 8] & 0x1000) || ride->value == 0xFFFF || ride->price != 0) { + + // Check price, safety, ratings etc. + if (!(RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x1000) || ride->value == 0xFFFF || ride->price != 0) { if (peep->previous_ride == rideIndex) goto loc_69666E; + if (ride->price != 0 && !peep_has_voucher_for_free_ride(peep, rideIndex)) { if (peep->cash_in_pocket <= 0) { if (!(bp & 4)) { @@ -8049,8 +8052,9 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) goto loc_696387; } - if (RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 8] & 0x10) { - if (scenario_rand() > 0x1999U) goto loc_69666E; + // Check G forces (basic intensity look check) + if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x10) { + if ((scenario_rand() & 0xFFFF) > 0x1999U) goto loc_69666E; if (ride->max_positive_vertical_g > 500 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; if (ride->max_negative_vertical_g < -400 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; if (ride->max_lateral_g > 400 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; From 4dd95c650b1e41c0a062c6f88e14190656127634 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 10 Sep 2015 22:16:41 +0100 Subject: [PATCH 0673/1173] implement RideData4 data --- src/management/research.c | 6 +- src/peep/peep.c | 6 +- src/ride/ride.c | 28 ++++---- src/ride/ride_data.c | 95 +++++++++++++++++++++++++++ src/ride/ride_data.h | 28 ++++++++ src/ride/ride_ratings.c | 7 +- src/ride/track.c | 11 ++-- src/windows/editor_object_selection.c | 12 ++-- src/windows/ride.c | 14 ++-- src/windows/ride_construction.c | 3 +- src/world/map.c | 3 +- 11 files changed, 175 insertions(+), 38 deletions(-) diff --git a/src/management/research.c b/src/management/research.c index 5046e76245..83ae23e1c4 100644 --- a/src/management/research.c +++ b/src/management/research.c @@ -24,10 +24,12 @@ #include "../localisation/date.h" #include "../management/finance.h" #include "../scenario.h" +#include "../rct1.h" +#include "../ride/ride.h" +#include "../ride/ride_data.h" #include "../world/scenery.h" #include "news_item.h" #include "research.h" -#include "../rct1.h" const int _researchRate[] = { 0, 160, 250, 400 }; @@ -177,7 +179,7 @@ void research_finish_item(sint32 entryIndex) RCT2_ADDRESS(0x01357404, uint32)[base_ride_type >> 5] |= (1 << (base_ride_type & 0x1F)); RCT2_ADDRESS(0x01357444, uint32)[base_ride_type] = RCT2_ADDRESS(0x0097C468, uint32)[base_ride_type]; RCT2_ADDRESS(0x01357644, uint32)[base_ride_type] = RCT2_ADDRESS(0x0097C5D4, uint32)[base_ride_type]; - if (RCT2_GLOBAL(0x0097D4F2 + (base_ride_type * 8), uint16) & 8) { + if (RideData4[base_ride_type].flags & RIDE_TYPE_FLAG4_3) { ebx = RCT2_GLOBAL(0x0097D4F5 + (base_ride_type * 8), uint8); RCT2_ADDRESS(0x01357444, uint32)[ebx] = RCT2_ADDRESS(0x0097C468, uint32)[ebx]; RCT2_ADDRESS(0x01357644, uint32)[ebx] = RCT2_ADDRESS(0x0097C5D4, uint32)[ebx]; diff --git a/src/peep/peep.c b/src/peep/peep.c index 9d15b9e1f2..8f5b69742b 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7898,7 +7898,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_8)) { if (ride->status == RIDE_STATUS_OPEN && !(ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN)) { - if (!(RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 8] & 0x1000) || ride->value == 0xFFFF || ride->price != 0) { + if (!(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_TRANSPORT_RIDE) || ride->value == 0xFFFF || ride->price != 0) { if (peep->flags & PEEP_FLAGS_LEAVING_PARK) { goto loc_69666E; } @@ -7976,7 +7976,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) } // Check price, safety, ratings etc. - if (!(RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x1000) || ride->value == 0xFFFF || ride->price != 0) { + if (!(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_TRANSPORT_RIDE) || ride->value == 0xFFFF || ride->price != 0) { if (peep->previous_ride == rideIndex) goto loc_69666E; @@ -8053,7 +8053,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) } // Check G forces (basic intensity look check) - if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x10) { + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES) { if ((scenario_rand() & 0xFFFF) > 0x1999U) goto loc_69666E; if (ride->max_positive_vertical_g > 500 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; if (ride->max_negative_vertical_g < -400 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; diff --git a/src/ride/ride.c b/src/ride/ride.c index 7b5bccbb85..55f2b4c06d 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -715,7 +715,7 @@ int ride_get_total_time(rct_ride *ride) int ride_can_have_multiple_circuits(rct_ride *ride) { - if (!(RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x200)) + if (!(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS)) return 0; // Only allow circuit or launch modes @@ -1294,7 +1294,7 @@ static void ride_construction_reset_current_piece() _currentTrackBankEnd = 0; _currentTrackLiftHill = 0; _currentTrackCovered = 0; - if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x8000) { + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_15) { _currentTrackCovered |= 2; } _previousTrackSlopeEnd = 0; @@ -1342,7 +1342,7 @@ void ride_construction_set_default_next_piece() // Set whether track is covered _currentTrackCovered &= ~2; - if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 8) { + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_3) { if (mapElement->properties.track.colour & 4) { _currentTrackCovered |= 2; } @@ -1362,7 +1362,7 @@ void ride_construction_set_default_next_piece() _currentTrackCurve = curve; // Set track banking - if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 8) { + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_3) { if (bank == TRACK_BANK_UPSIDE_DOWN) { bank = TRACK_BANK_NONE; _currentTrackCovered ^= 2; @@ -1394,7 +1394,7 @@ void ride_construction_set_default_next_piece() // Set whether track is covered _currentTrackCovered &= ~2; - if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 8) { + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_3) { if (mapElement->properties.track.colour & 4) { _currentTrackCovered |= 2; } @@ -1414,7 +1414,7 @@ void ride_construction_set_default_next_piece() _currentTrackCurve = curve; // Set track banking - if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 8) { + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_3) { if (bank == TRACK_BANK_UPSIDE_DOWN) { bank = TRACK_BANK_NONE; _currentTrackCovered ^= 2; @@ -1743,7 +1743,7 @@ int sub_6CC3FB(int rideIndex) _currentTrackLiftHill = 0; _currentTrackCovered = 0; - if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x8000) + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_15) _currentTrackCovered |= 2; _previousTrackBankEnd = 0; @@ -2552,8 +2552,12 @@ static void ride_music_update(int rideIndex) rct_vehicle *vehicle; rct_ride *ride = GET_RIDE(rideIndex); - if (!(RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 6)) + if ( + !(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_MUSIC_ON_DEFAULT) && + !(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_ALLOW_MUSIC) + ) { return; + } if (ride->status != RIDE_STATUS_OPEN || !(ride->lifecycle_flags & RIDE_LIFECYCLE_MUSIC)) { ride->music_tune_id = 255; @@ -4441,7 +4445,7 @@ int ride_is_valid_for_test(int rideIndex, int goingToBeOpen, int isApplying) } if ( - (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint32) & 0x400) && + (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_10) && (ride->lifecycle_flags & RIDE_LIFECYCLE_16) && !(ride->lifecycle_flags & RIDE_LIFECYCLE_CABLE_LIFT) ) { @@ -4564,7 +4568,7 @@ int ride_is_valid_for_open(int rideIndex, int goingToBeOpen, int isApplying) } if ( - (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint32) & 0x400) && + (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_10) && (ride->lifecycle_flags & RIDE_LIFECYCLE_16) && !(ride->lifecycle_flags & RIDE_LIFECYCLE_CABLE_LIFT) ) { @@ -5069,7 +5073,7 @@ foundRideEntry: ride->min_waiting_time = 10; ride->max_waiting_time = 60; ride->depart_flags = RIDE_DEPART_WAIT_FOR_MINIMUM_LENGTH | 3; - if (RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 4] & 2) { + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_MUSIC_ON_DEFAULT) { ride->lifecycle_flags |= RIDE_LIFECYCLE_MUSIC; } ride->music = RCT2_ADDRESS(0x0097D4F4, uint8)[ride->type * 8]; @@ -6260,7 +6264,7 @@ void ride_update_max_vehicles(int rideIndex) if ( (ride->mode != RIDE_MODE_STATION_TO_STATION && ride->mode != RIDE_MODE_CONTINUOUS_CIRCUIT) || - !(RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x40) + !(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_6) ) { maxNumTrains = min(maxNumTrains, 31); } else { diff --git a/src/ride/ride_data.c b/src/ride/ride_data.c index 75c7b5d019..e447788bf3 100644 --- a/src/ride/ride_data.c +++ b/src/ride/ride_data.c @@ -979,6 +979,101 @@ const uint8 RideLiftHillAdjustments[0x60] = { 4 // LIM Launched Roller Coaster }; +// rct2: 0x0097D4F2 +const rct_ride_data_4 RideData4[91] = { + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK_STYLE_3, 0, 0, 0, 20, 20 }, // RIDE_TYPE_SPIRAL_ROLLER_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_TECHNO, 0, 0, 0, 20, 20 }, // RIDE_TYPE_STAND_UP_ROLLER_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 20, 20 }, // RIDE_TYPE_SUSPENDED_SWINGING_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_TECHNO, 0, 0, 0, 20, 20 }, // RIDE_TYPE_INVERTED_ROLLER_COASTER + { RIDE_TYPE_FLAG4_0 | RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_SUMMER, 0, 0, 0, 10, 0 }, // RIDE_TYPE_JUNIOR_ROLLER_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_6 | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_TRANSPORT_RIDE, MUSIC_STYLE_SUMMER, 0, 0, 0, 10, 0 }, // RIDE_TYPE_MINIATURE_RAILWAY + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_6 | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_TRANSPORT_RIDE, MUSIC_STYLE_SUMMER, 0, 0, 0, 20, 20 }, // RIDE_TYPE_MONORAIL + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_WILD_WEST, 0, 0, 0, 10, 0 }, // RIDE_TYPE_MINI_SUSPENDED_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT, MUSIC_STYLE_WATER, 0, 0, 0, 20, 20 }, // RIDE_TYPE_BOAT_RIDE + { RIDE_TYPE_FLAG4_0 | RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_WILD_WEST, 0, 0, 0, 20, 20 }, // RIDE_TYPE_WOODEN_WILD_MOUSE + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 15, 0 }, // RIDE_TYPE_STEEPLECHASE + { RIDE_TYPE_FLAG4_0 | RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_6 | RIDE_TYPE_FLAG4_14, MUSIC_STYLE_SUMMER, 0, 0, 0, 20, 0 }, // RIDE_TYPE_CAR_RIDE + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_TECHNO, 0, 0, 0, 20, 20 }, // RIDE_TYPE_LAUNCHED_FREEFALL + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 10, 0 }, // RIDE_TYPE_BOBSLEIGH_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_14, MUSIC_STYLE_SUMMER, 0, 0, 0, 20, 20 }, // RIDE_TYPE_OBSERVATION_TOWER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 20, 20 }, // RIDE_TYPE_LOOPING_ROLLER_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_WATER, 0, 0, 0, 20, 20 }, // RIDE_TYPE_DINGHY_SLIDE + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_WILD_WEST, 0, 0, 0, 10, 0 }, // RIDE_TYPE_MINE_TRAIN_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_6 | RIDE_TYPE_FLAG4_TRANSPORT_RIDE | RIDE_TYPE_FLAG4_14, MUSIC_STYLE_SUMMER, 0, 0, 0, 20, 20 }, // RIDE_TYPE_CHAIRLIFT + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 10, 0 }, // RIDE_TYPE_CORKSCREW_ROLLER_COASTER + { RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT, MUSIC_STYLE_SUMMER, 0, 0, 0, 15, 0 }, // RIDE_TYPE_MAZE + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_SUMMER, 0, 0, 0, 20, 0 }, // RIDE_TYPE_SPIRAL_SLIDE + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_TECHNO, 0, 0, 0, 20, 20 }, // RIDE_TYPE_GO_KARTS + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_6 | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_WATER, 0, 0, 0, 20, 20 }, // RIDE_TYPE_LOG_FLUME + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_6 | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_WATER, 0, 0, 0, 15, 0 }, // RIDE_TYPE_RIVER_RAPIDS + { RIDE_TYPE_FLAG4_MUSIC_ON_DEFAULT | RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_14, MUSIC_STYLE_DODGEMS_BEAT, 0, 0, 0, 15, 0 }, // RIDE_TYPE_DODGEMS + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_PIRATES, 0, 0, 0, 15, 0 }, // RIDE_TYPE_PIRATE_SHIP + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_TECHNO, 0, 0, 0, 9, 0 }, // RIDE_TYPE_SWINGING_INVERTER_SHIP + { 0, MUSIC_STYLE_GENTLE, 0, 0, 0, 15, 0 }, // RIDE_TYPE_FOOD_STALL + { 0, MUSIC_STYLE_GENTLE, 0, 0, 0, 12, 0 }, // RIDE_TYPE_1D + { 0, MUSIC_STYLE_GENTLE, 0, 0, 0, 8, 0 }, // RIDE_TYPE_DRINK_STALL + { 0, MUSIC_STYLE_GENTLE, 0, 0, 0, 15, 0 }, // RIDE_TYPE_1F + { 0, MUSIC_STYLE_GENTLE, 0, 0, 0, 10, 0 }, // RIDE_TYPE_SHOP + { RIDE_TYPE_FLAG4_MUSIC_ON_DEFAULT | RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_FAIRGROUND_ORGAN, 0, 0, 0, 9, 0 }, // RIDE_TYPE_MERRY_GO_ROUND + { 0, MUSIC_STYLE_GENTLE, 0, 0, 0, 6, 25 }, // RIDE_TYPE_22 + { 0, MUSIC_STYLE_GENTLE, 0, 0, 0, 0, 0 }, // RIDE_TYPE_INFORMATION_KIOSK + { 0, MUSIC_STYLE_GENTLE, 0, 0, 0, 10, 0 }, // RIDE_TYPE_TOILETS + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION | RIDE_TYPE_FLAG4_14, MUSIC_STYLE_SUMMER, 0, 0, 0, 20, 0 }, // RIDE_TYPE_FERRIS_WHEEL + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION | RIDE_TYPE_FLAG4_14, MUSIC_STYLE_ROCK, 0, 0, 0, 20, 0 }, // RIDE_TYPE_MOTION_SIMULATOR + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION, MUSIC_STYLE_ROCK, 0, 0, 0, 20, 0 }, // RIDE_TYPE_3D_CINEMA + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 5, 0 }, // RIDE_TYPE_TOP_SPIN + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION | RIDE_TYPE_FLAG4_14, MUSIC_STYLE_GENTLE, 0, 0, 0, 20, 0 }, // RIDE_TYPE_SPACE_RINGS + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 10, 0 }, // RIDE_TYPE_REVERSE_FREEFALL_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_TRANSPORT_RIDE, MUSIC_STYLE_SUMMER, 0, 0, 0, 20, 20 }, // RIDE_TYPE_LIFT + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 0, 0 }, // RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER + { 0, MUSIC_STYLE_GENTLE, 0, 0, 0, 10, 0 }, // RIDE_TYPE_CASH_MACHINE + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_GENTLE, 0, 0, 0, 10, 0 }, // RIDE_TYPE_TWIST + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION, MUSIC_STYLE_HORROR, 0, 0, 0, 0, 0 }, // RIDE_TYPE_HAUNTED_HOUSE + { 0, MUSIC_STYLE_GENTLE, 0, 0, 0, 15, 0 }, // RIDE_TYPE_FIRST_AID + { RIDE_TYPE_FLAG4_MUSIC_ON_DEFAULT | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION, MUSIC_STYLE_CIRCUS_SHOW, 0, 0, 0, 15, 0 }, // RIDE_TYPE_CIRCUS_SHOW + { RIDE_TYPE_FLAG4_0 | RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_6 | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_HORROR, 0, 0, 0, 20, 20 }, // RIDE_TYPE_GHOST_TRAIN + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 20, 20 }, // RIDE_TYPE_TWISTER_ROLLER_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_WILD_WEST, 0, 0, 0, 20, 20 }, // RIDE_TYPE_WOODEN_ROLLER_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_GENTLE, 0, 0, 0, 20, 20 }, // RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER + { RIDE_TYPE_FLAG4_0 | RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 20, 20 }, // RIDE_TYPE_WILD_MOUSE + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | (1 << 3) | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK_STYLE_3, 56, 0, 0, 20, 20 }, // RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_GENTLE, 0, 0, 0, 20, 20 }, // RIDE_TYPE_38 + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | (1 << 3) | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13 | RIDE_TYPE_FLAG4_15, MUSIC_STYLE_ROCK, 58, 0, 0, 20, 20 }, // RIDE_TYPE_FLYING_ROLLER_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_13 | (1 << 15), MUSIC_STYLE_GENTLE, 0, 0, 0, 20, 20 }, // RIDE_TYPE_3A + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 20, 20 }, // RIDE_TYPE_VIRGINIA_REEL + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_6 | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_14, MUSIC_STYLE_WATER, 0, 0, 0, 15, 0 }, // RIDE_TYPE_SPLASH_BOATS + { RIDE_TYPE_FLAG4_0 | RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_6 | RIDE_TYPE_FLAG4_14, MUSIC_STYLE_SUMMER, 0, 0, 0, 20, 20 }, // RIDE_TYPE_MINI_HELICOPTERS + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | (1 << 3) | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 64, 0, 0, 10, 0 }, // RIDE_TYPE_LAY_DOWN_ROLLER_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_6 | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_TRANSPORT_RIDE, MUSIC_STYLE_SUMMER, 0, 0, 0, 20, 20 }, // RIDE_TYPE_SUSPENDED_MONORAIL + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_GENTLE, 0, 0, 0, 20, 20 }, // RIDE_TYPE_40 + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_TECHNO, 0, 0, 0, 15, 20 }, // RIDE_TYPE_REVERSER_ROLLER_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_TECHNO, 0, 0, 0, 10, 0 }, // RIDE_TYPE_HEARTLINE_TWISTER_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_14, MUSIC_STYLE_SUMMER, 0, 0, 0, 20, 20 }, // RIDE_TYPE_MINI_GOLF + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_10 | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK_STYLE_3, 0, 0, 0, 20, 0 }, // RIDE_TYPE_GIGA_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 15, 0 }, // RIDE_TYPE_ROTO_DROP + { RIDE_TYPE_FLAG4_MUSIC_ON_DEFAULT | RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 10, 0 }, // RIDE_TYPE_FLYING_SAUCERS + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION, MUSIC_STYLE_GENTLE, 0, 0, 0, 15, 0 }, // RIDE_TYPE_CROOKED_HOUSE + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_14, MUSIC_STYLE_SUMMER, 0, 0, 0, 20, 20 }, // RIDE_TYPE_MONORAIL_CYCLES + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_TECHNO, 0, 0, 0, 20, 20 }, // RIDE_TYPE_COMPACT_INVERTED_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_WATER, 0, 0, 0, 20, 0 }, // RIDE_TYPE_WATER_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK_STYLE_2, 0, 0, 0, 20, 20 }, // RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK_STYLE_2, 0, 0, 0, 15, 0 }, // RIDE_TYPE_INVERTED_HAIRPIN_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_EGYPTIAN, 0, 0, 0, 10, 0 }, // RIDE_TYPE_MAGIC_CARPET + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_6, MUSIC_STYLE_WATER, 0, 0, 0, 10, 20 }, // RIDE_TYPE_SUBMARINE_RIDE + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_6 | RIDE_TYPE_FLAG4_14, MUSIC_STYLE_GENTLE, 0, 0, 0, 7, 0 }, // RIDE_TYPE_RIVER_RAFTS + { 0, MUSIC_STYLE_GENTLE, 0, 0, 0, 20, 0 }, // RIDE_TYPE_50 + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_SINGLE_SESSION | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK_STYLE_2, 0, 0, 0, 12, 0 }, // RIDE_TYPE_ENTERPRISE + { 0, MUSIC_STYLE_GENTLE, 0, 0, 0, 15, 0 }, // RIDE_TYPE_52 + { 0, MUSIC_STYLE_GENTLE, 0, 0, 0, 12, 0 }, // RIDE_TYPE_53 + { 0, MUSIC_STYLE_GENTLE, 0, 0, 0, 20, 20 }, // RIDE_TYPE_54 + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 20, 20 }, // RIDE_TYPE_55 + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 20, 20 }, // RIDE_TYPE_INVERTED_IMPULSE_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_SUMMER, 0, 0, 0, 20, 20 }, // RIDE_TYPE_MINI_ROLLER_COASTER + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_WILD_WEST, 0, 0, 0, 20, 20 }, // RIDE_TYPE_MINE_RIDE + { RIDE_TYPE_FLAG4_0 | RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK_STYLE_2, 0, 0, 0, 20, 20 }, // RIDE_TYPE_59 + { RIDE_TYPE_FLAG4_ALLOW_MUSIC | RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG4_HAS_AIR_TIME | RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG4_11 | RIDE_TYPE_FLAG4_13, MUSIC_STYLE_ROCK, 0, 0, 0, 12, 7 }, // RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER +}; + // rct2: 0x00982358 const money8 DefaultShopItemPrice[SHOP_ITEM_COUNT] = { MONEY(0,90), // SHOP_ITEM_BALLOON diff --git a/src/ride/ride_data.h b/src/ride/ride_data.h index 62cbb6b8f7..8f3f42d3df 100644 --- a/src/ride/ride_data.h +++ b/src/ride/ride_data.h @@ -47,6 +47,32 @@ typedef struct { rct_string_id display; // "Diamond Heights" Balloon } rct_shop_item_string_types; +typedef struct { + uint16 flags; + uint8 default_music; + uint8 var_3; + uint8 pad[4]; +} rct_ride_data_4; + +enum { + RIDE_TYPE_FLAG4_0 = (1 << 0), + RIDE_TYPE_FLAG4_MUSIC_ON_DEFAULT = (1 << 1), + RIDE_TYPE_FLAG4_ALLOW_MUSIC = (1 << 2), + RIDE_TYPE_FLAG4_3 = (1 << 3), + RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES = (1 << 4), + RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT = (1 << 5), + RIDE_TYPE_FLAG4_6 = (1 << 6), + RIDE_TYPE_FLAG4_HAS_AIR_TIME = (1 << 7), + RIDE_TYPE_FLAG4_SINGLE_SESSION = (1 << 8), + RIDE_TYPE_FLAG4_ALLOW_MULTIPLE_CIRCUITS = (1 << 9), + RIDE_TYPE_FLAG4_10 = (1 << 10), + RIDE_TYPE_FLAG4_11 = (1 << 11), + RIDE_TYPE_FLAG4_TRANSPORT_RIDE = (1 << 12), + RIDE_TYPE_FLAG4_13 = (1 << 13), + RIDE_TYPE_FLAG4_14 = (1 << 14), + RIDE_TYPE_FLAG4_15 = (1 << 15), +}; + extern const bool hasRunningTrack[0x60]; extern const uint8 initialUpkeepCosts[0x60]; extern const uint8 costPerTrackPiece[0x60]; @@ -62,6 +88,8 @@ extern const uint8 RideAvailableBreakdowns[]; extern const rct_ride_entrance_definition RideEntranceDefinitions[RIDE_ENTRANCE_STYLE_COUNT]; extern const uint8 RideLiftHillAdjustments[0x60]; +extern const rct_ride_data_4 RideData4[91]; + extern const money8 DefaultShopItemPrice[SHOP_ITEM_COUNT]; extern const rct_shop_item_string_types ShopItemStringIds[SHOP_ITEM_COUNT]; extern const uint32 ShopItemImage[SHOP_ITEM_COUNT]; diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 6e087f9d15..9ac88e6ccb 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -784,11 +784,8 @@ static void ride_ratings_apply_adjustments(rct_ride *ride, rating_tuple *ratings ratings->intensity += ((ratings->intensity * rideEntry->intensity_multipler ) >> 7); ratings->nausea += ((ratings->nausea * rideEntry->nausea_multipler ) >> 7); - // As far as I can tell, this flag detects whether the ride is a roller - // coaster, or a log flume or rapids. Everything else it's not set. - // more detail: https://gist.github.com/kevinburke/d951e74e678b235eef3e - uint16 flags = RCT2_GLOBAL(0x0097D4F2 + ride->type * 8, uint16); - if (flags & 0x80) { + // Apply total air time + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_HAS_AIR_TIME) { uint16 totalAirTime = ride->total_air_time; if (rideEntry->flags & RIDE_ENTRY_FLAG_11) { if (totalAirTime >= 96) { diff --git a/src/ride/track.c b/src/ride/track.c index 6b8fba0b07..621609d82d 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -36,6 +36,7 @@ #include "../world/footpath.h" #include "../windows/error.h" #include "ride.h" +#include "ride_data.h" #include "ride_ratings.h" #include "track.h" #include "track_data.h" @@ -2346,7 +2347,7 @@ int track_is_connected_by_shape(rct_map_element *a, rct_map_element *b) trackType = a->properties.track.type; aBank = gTrackDefinitions[trackType].bank_end; aAngle = gTrackDefinitions[trackType].vangle_end; - if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 8) { + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_3) { if (a->properties.track.colour & 4) { if (aBank == TRACK_BANK_NONE) aBank = TRACK_BANK_UPSIDE_DOWN; @@ -2359,7 +2360,7 @@ int track_is_connected_by_shape(rct_map_element *a, rct_map_element *b) trackType = b->properties.track.type; bBank = gTrackDefinitions[trackType].bank_start; bAngle = gTrackDefinitions[trackType].vangle_start; - if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 8) { + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_3) { if (b->properties.track.colour & 4) { if (bBank == TRACK_BANK_NONE) bBank = TRACK_BANK_UPSIDE_DOWN; @@ -2740,8 +2741,10 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra uint8 flags = (trackElement.element->type & (1 << 7)) | bh; flags |= (trackElement.element->properties.track.colour & 3) << 4; - if (RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 4] & (1 << 3) && - trackElement.element->properties.track.colour & (1 << 2)){ + if ( + RideData4[ride->type].flags & RIDE_TYPE_FLAG4_3 && + trackElement.element->properties.track.colour & (1 << 2) + ) { flags |= (1 << 6); } diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index c0bea4d0ee..dc5e5d6fd9 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -22,17 +22,20 @@ #include "../addresses.h" #include "../audio/audio.h" #include "../game.h" +#include "../interface/themes.h" #include "../interface/widget.h" #include "../interface/window.h" #include "../localisation/localisation.h" #include "../management/research.h" #include "../object.h" +#include "../rct1.h" +#include "../ride/ride.h" +#include "../ride/ride_data.h" #include "../ride/track.h" #include "../scenario.h" -#include "error.h" -#include "../interface/themes.h" #include "dropdown.h" -#include "../rct1.h" +#include "error.h" + enum { FILTER_RCT2 = (1 << 0), @@ -523,8 +526,7 @@ static void setup_track_designer_objects(){ if (ride_type == 0xFF) continue; - if (!(RCT2_ADDRESS(0x0097D4F2, uint16)[ride_type * 4] & - (1 << 11))) + if (!(RideData4[ride_type].flags & RIDE_TYPE_FLAG4_11)) continue; *selection_flags &= ~OBJECT_SELECTION_FLAG_6; diff --git a/src/windows/ride.c b/src/windows/ride.c index c318b823db..acacbf3b7c 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -1131,15 +1131,19 @@ void window_ride_disable_tabs(rct_window *w) if ((RCT2_GLOBAL(0x97CF40 + ride_type * 8, uint32) & 0x2000) != 0) disabled_tabs |= (1 << WIDX_TAB_2); // 0x20 - if ((RCT2_GLOBAL(0x97CF40 + ride_type * 8, uint32) & 0x4000007) == 0 && - (RCT2_GLOBAL(0x97D4F2 + ride_type * 8, uint16) & 0x20) == 0) + if ( + !(RCT2_GLOBAL(0x97CF40 + ride_type * 8, uint32) & 0x4000007) && + !(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT) + ) { disabled_tabs |= (1 << WIDX_TAB_5); // 0x100 + } if ((RCT2_GLOBAL(0x97CF40 + ride_type * 8, uint32) & 0x20000) != 0) disabled_tabs |= (1 << WIDX_TAB_3 | 1 << WIDX_TAB_4 | 1 << WIDX_TAB_7); // 0x4C0 - if ((RCT2_GLOBAL(0x97D4F2 + ride_type * 8, uint32) & 0x4) == 0) + if (!(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_ALLOW_MUSIC)) { disabled_tabs |= (1 << WIDX_TAB_6); // 0x200 + } if (ride_type == RIDE_TYPE_CASH_MACHINE || ride_type == RIDE_TYPE_FIRST_AID || @@ -2122,7 +2126,7 @@ static rct_string_id window_ride_get_status_vehicle(rct_window *w, void *argumen if (ride->type == RIDE_TYPE_MINI_GOLF) return 0; - if ((RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x100) && stringId <= 1104) + if ((RideData4[ride->type].flags & RIDE_TYPE_FLAG4_SINGLE_SESSION) && stringId <= 1104) stringId += 23; RCT2_GLOBAL((int)arguments + 4, uint16) = RideNameConvention[ride->type].station_name; @@ -4065,7 +4069,7 @@ static void window_ride_colour_invalidate(rct_window *w) window_ride_colour_widgets[WIDX_TRACK_PREVIEW].type = WWT_EMPTY; // Entrance style - if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x20) { + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_HAS_ENTRANCE_EXIT) { window_ride_colour_widgets[WIDX_ENTRANCE_PREVIEW].type = WWT_SPINNER; window_ride_colour_widgets[WIDX_ENTRANCE_STYLE].type = WWT_DROPDOWN; window_ride_colour_widgets[WIDX_ENTRANCE_STYLE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 78f7379f6f..da7a53c292 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -30,6 +30,7 @@ #include "../interface/window.h" #include "../localisation/localisation.h" #include "../network/network.h" +#include "../ride/ride_data.h" #include "../ride/track.h" #include "dropdown.h" @@ -543,7 +544,7 @@ rct_window *window_ride_construction_open() _currentTrackLiftHill = 0; _currentTrackCovered = 0; - if (RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 4] & 0x8000) + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_15) _currentTrackCovered |= 2; RCT2_GLOBAL(0x00F440B6, uint8) = 0; diff --git a/src/world/map.c b/src/world/map.c index cf484cabd1..9e590a7576 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -29,6 +29,7 @@ #include "../localisation/localisation.h" #include "../management/finance.h" #include "../openrct2.h" +#include "../ride/ride_data.h" #include "../ride/track.h" #include "../ride/track_data.h" #include "../scenario.h" @@ -2474,7 +2475,7 @@ static bool map_place_fence_check_obstruction_with_track(rct_scenery_entry *wall return false; } - if (!(RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 1)) { + if (!(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_0)) { return false; } From 408665e4a4a9c35ce8fbbd88ebdd363a22795c75 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 11 Sep 2015 04:00:15 +0100 Subject: [PATCH 0674/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 37 +++++++++++++++++++++++++++++++++++- data/language/english_us.txt | 10 ++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index a391006f48..551c0ad2d8 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3845,6 +3845,41 @@ STR_5509 :{SMALLFONT}{BLACK}Maakt het mogelijk om scenario's en opgeslagen sp STR_5510 :Standaard geluidsapparaat STR_5511 :(ONBEKEND) STR_5512 :Spel opslaan als... +STR_5513 :Spel (snel) opslaan +STR_5514 :Vandalisme uitschakelen +STR_5515 :{SMALLFONT}{BLACK}Voorkomt dat bezoekers objecten in je park vernielen als ze kwaad zijn +STR_5516 :{SMALLFONT}{BLACK}Zwart +STR_5517 :{SMALLFONT}{BLACK}Grijs +STR_5518 :{SMALLFONT}{BLACK}Wit +STR_5519 :{SMALLFONT}{BLACK}Donkerpaars +STR_5520 :{SMALLFONT}{BLACK}Lichtpaars +STR_5521 :{SMALLFONT}{BLACK}Helder paars +STR_5522 :{SMALLFONT}{BLACK}Darkblauw +STR_5523 :{SMALLFONT}{BLACK}Lichtblauw +STR_5524 :{SMALLFONT}{BLACK}IJzig blauw +STR_5525 :{SMALLFONT}{BLACK}Turquoise +STR_5526 :{SMALLFONT}{BLACK}Aquamarijn +STR_5527 :{SMALLFONT}{BLACK}Verzadigd groen +STR_5528 :{SMALLFONT}{BLACK}Donkergroen +STR_5529 :{SMALLFONT}{BLACK}Mosgroen +STR_5530 :{SMALLFONT}{BLACK}Helder groen +STR_5531 :{SMALLFONT}{BLACK}Olijfgroen +STR_5532 :{SMALLFONT}{BLACK}Donker olijfgroen +STR_5533 :{SMALLFONT}{BLACK}Helder geel +STR_5534 :{SMALLFONT}{BLACK}Geel +STR_5535 :{SMALLFONT}{BLACK}Donkergeel +STR_5536 :{SMALLFONT}{BLACK}Lichtoranje +STR_5537 :{SMALLFONT}{BLACK}Donkeroranje +STR_5538 :{SMALLFONT}{BLACK}Lichtbruin +STR_5539 :{SMALLFONT}{BLACK}Verzadigd bruin +STR_5540 :{SMALLFONT}{BLACK}Donkerbruin +STR_5541 :{SMALLFONT}{BLACK}Zalmroze +STR_5542 :{SMALLFONT}{BLACK}Bordeauxrood +STR_5543 :{SMALLFONT}{BLACK}Verzadigd rood +STR_5544 :{SMALLFONT}{BLACK}Helder rood +STR_5545 :{SMALLFONT}{BLACK}Donkerroze +STR_5546 :{SMALLFONT}{BLACK}Helder roze +STR_5547 :{SMALLFONT}{BLACK}Lichtroze ############# # Scenarios # @@ -4290,7 +4325,7 @@ STR_CPTY :5 bezoekers # Maze / Doolhof [HMAZE] STR_NAME :Doolhof -STR_DESC :Bezoekers lopen door een doolhof van 1,8m hoge heggen en muren, en kunnen er pas uit wanneer ze de uitgang vinden. +STR_DESC :Bezoekers lopen door een doolhof van 1,8m hoge heggen of muren, en kunnen er pas uit wanneer ze de uitgang vinden. # End of Maze / Doolhof # Merry-go-round / Draaimolen diff --git a/data/language/english_us.txt b/data/language/english_us.txt index e6a55caf1c..e229928fe2 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3888,3 +3888,13 @@ STR_5544 :{SMALLFONT}{BLACK}Bright red STR_5545 :{SMALLFONT}{BLACK}Dark pink STR_5546 :{SMALLFONT}{BLACK}Bright pink STR_5547 :{SMALLFONT}{BLACK}Light pink + +######### +# Rides # +######### + +#WW +[CONDORRD] +STR_NAME :Condor Ride +STR_DESC :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air in Condor-shaped trains +STR_CPTY :4 passengers per car From 7e67f0381ed693dff453d3cfb38420c674c2a948 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 11 Sep 2015 14:38:45 +0200 Subject: [PATCH 0675/1173] Extend build-in-pause-mode to entrances and exits, clear up some flags, fix ghost sticking in pause mode, fixes #1918 --- src/ride/ride.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 55f2b4c06d..dbe9271617 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1190,7 +1190,7 @@ void sub_6C96C0() _currentTrackSelectionFlags &= ~4; game_do_command( RCT2_GLOBAL(0x00F440BF, uint16), - 41, + (GAME_COMMAND_FLAG_5 | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_APPLY), RCT2_GLOBAL(0x00F440C1, uint16), _currentRideIndex, GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT, @@ -1588,7 +1588,7 @@ static int ride_modify_entrance_or_exit(rct_map_element *mapElement, int x, int RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~2; } else { // Remove entrance / exit - game_do_command(x, 9, y, rideIndex, GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT, bl, 0); + game_do_command(x, (GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_APPLY), y, rideIndex, GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT, bl, 0); RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) = entranceType == ENTRANCE_TYPE_RIDE_ENTRANCE ? 29 : 30; RCT2_GLOBAL(0x00F44191, uint8) = entranceType; } @@ -6515,7 +6515,7 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio return MONEY32_UNDEFINED; } - if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0){ + if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; return MONEY32_UNDEFINED; } @@ -6697,8 +6697,8 @@ void game_command_place_ride_entrance_or_exit(int *eax, int *ebx, int *ecx, int money32 remove_ride_entrance_or_exit(sint16 x, sint16 y, uint8 rideIndex, uint8 station_num, uint8 flags){ rct_ride* ride = GET_RIDE(rideIndex); - if (!(flags & (1 << 6))){ - if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0){ + if (!(flags & GAME_COMMAND_FLAG_GHOST)){ + if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; return MONEY32_UNDEFINED; } From 6bd003c67fbf2c097763bae37cca030e881495f5 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 11 Sep 2015 15:13:54 +0200 Subject: [PATCH 0676/1173] Fix more warnings --- src/drawing/font.h | 4 ++-- src/platform/windows.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/drawing/font.h b/src/drawing/font.h index 48a9f33540..8d6868e12e 100644 --- a/src/drawing/font.h +++ b/src/drawing/font.h @@ -22,7 +22,7 @@ enum { }; typedef struct { - utf8 *filename; + const utf8 *filename; int ptSize; int offset_x; int offset_y; @@ -44,4 +44,4 @@ int font_get_size_from_sprite_base(uint16 spriteBase); int font_get_line_height(int fontSpriteBase); int font_get_line_height_small(int fontSpriteBase); -#endif \ No newline at end of file +#endif diff --git a/src/platform/windows.c b/src/platform/windows.c index f9f6ae7efd..7fad01329f 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -75,7 +75,7 @@ __declspec(dllexport) int StartOpenRCT(HINSTANCE hInstance, HINSTANCE hPrevInsta // Get command line arguments in standard form argv = CommandLineToArgvA(lpCmdLine, &argc); - runGame = cmdline_run(argv, argc); + runGame = cmdline_run((const char **)argv, argc); GlobalFree(argv); if (runGame) From 68fc066fc513e7bc82d3effd3280c2cf144fce11 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 11 Sep 2015 15:23:11 +0200 Subject: [PATCH 0677/1173] Fix two more warnings --- src/interface/console.c | 4 ++-- src/interface/screenshot.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/interface/console.c b/src/interface/console.c index 029a44ad9e..ea1c05efc8 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -938,7 +938,7 @@ console_command console_command_table[] = { { "object_count", cc_object_count, "Shows the number of objects of each type in the scenario.", "object_count" }, { "twitch", cc_twitch, "Twitch API" }, { "reset_user_strings", cc_reset_user_strings, "Resets all user-defined strings, to fix incorrectly occurring 'Chosen name in use already' errors.", "reset_user_strings" }, - { "fix_banner_count", cc_fix_banner_count, "Fixes incorrectly appearing 'Too many banners' error by marking every banner entry without a map element as null..", "fix_banner_count" } + { "fix_banner_count", cc_fix_banner_count, "Fixes incorrectly appearing 'Too many banners' error by marking every banner entry without a map element as null.", "fix_banner_count" } }; static int cc_windows(const utf8 **argv, int argc) { @@ -1038,7 +1038,7 @@ void console_execute_silent(const utf8 *src) bool validCommand = false; for (int i = 0; i < countof(console_command_table); i++) { if (strcmp(argv[0], console_command_table[i].command) == 0) { - console_command_table[i].func(argv + 1, argc - 1); + console_command_table[i].func((const utf8 **)(argv + 1), argc - 1); validCommand = true; break; } diff --git a/src/interface/screenshot.c b/src/interface/screenshot.c index f5f3c7201b..8e75f01b0a 100644 --- a/src/interface/screenshot.c +++ b/src/interface/screenshot.c @@ -299,7 +299,7 @@ int screenshot_dump_png() } free(png); - if (pixels != dpi->bits) { + if ((utf8*)pixels != (utf8*)dpi->bits) { free(pixels); } return index; @@ -567,4 +567,4 @@ int cmdline_for_screenshot(const char **argv, int argc) } openrct2_dispose(); return 1; -} \ No newline at end of file +} From a6ee08de11b7979da91642248b42b5a74f6efc5e Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 11 Sep 2015 16:21:27 +0200 Subject: [PATCH 0678/1173] Fix filter buttons in RC designer and TD manager, clean up some strings --- src/localisation/string_ids.h | 20 ++++++++ src/windows/editor_object_selection.c | 67 +++++++++++++-------------- 2 files changed, 53 insertions(+), 34 deletions(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index cbd132239e..c725353b63 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -745,6 +745,10 @@ enum { STR_CARRYING = 1810, STR_CANT_BUILD_PARK_ENTRANCE_HERE = 1811, + STR_STRING_DEFINED_TOOLTIP = 1812, + + STR_MISCELLANEOUS = 1813, + STR_ACTIONS = 1814, STR_THOUGHTS = STR_ACTIONS + 1, STR_INFORMATION_TYPE_TIP = 1816, @@ -1389,6 +1393,9 @@ enum { STR_CHEAT_TIP_LARGE_TRAM_GUESTS = 2684, + STR_ROLLERCOASTER_TYCOON_1_DROPDOWN = 2740, + STR_ROLLERCOASTER_TYCOON_2_DROPDOWN = 2741, + STR_CHEAT_CLEAR_GRASS = 2752, STR_CHEAT_MOWED_GRASS = 2753, STR_CHEAT_WATER_PLANTS = 2754, @@ -1901,12 +1908,23 @@ enum { STR_GIANT_SCREENSHOT = 5260, + STR_OBJECT_FILTER = 5261, + STR_OBJECT_FILTER_WW = 5262, + STR_OBJECT_FILTER_TT = 5263, + STR_OBJECT_FILTER_CUSTOM = 5264, + STR_OBJECT_FILTER_TIP = 5265, + STR_OPTIONS_DISPLAY_TIP = 5266, STR_OPTIONS_CULTURE_TIP = 5267, STR_OPTIONS_AUDIO_TIP = 5268, STR_OPTIONS_CONTROLS_AND_INTERFACE_TIP = 5269, STR_OPTIONS_MISCELLANEOUS_TIP = 5270, STR_OPTIONS_TWITCH_TIP = 5271, + + STR_OBJECT_SEARCH = 5275, + STR_OBJECT_SEARCH_DESC = 5276, + STR_OBJECT_SEARCH_CLEAR = 5277, + STR_CHEAT_SANDBOX_MODE = 5278, STR_CHEAT_SANDBOX_MODE_DISABLE = 5279, STR_CHEAT_SANDBOX_MODE_TIP = 5280, @@ -1950,6 +1968,8 @@ enum { STR_CHEAT_TITLE_RIDE = 5347, STR_CHEAT_TITLE_PARK = 5348, + STR_OBJECT_FILTER_ALL_RIDES_TIP = 5349, + STR_MAX = 5350, STR_MIN = 5351, diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index dc5e5d6fd9..67f032ecfb 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -120,35 +120,35 @@ enum WINDOW_STAFF_LIST_WIDGET_IDX { static rct_widget window_editor_object_selection_widgets[] = { { WWT_FRAME, 0, 0, 599, 0, 399, 0xFFFFFFFF, STR_NONE }, - { WWT_CAPTION, 0, 1, 598, 1, 14, 3181, STR_WINDOW_TITLE_TIP }, + { WWT_CAPTION, 0, 1, 598, 1, 14, STR_OBJECT_SELECTION, STR_WINDOW_TITLE_TIP }, { WWT_CLOSEBOX, 0, 587, 597, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, { WWT_RESIZE, 1, 0, 599, 43, 399, 0xFFFFFFFF, STR_NONE }, - { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, 1812 }, - { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, 1812 }, - { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, 1812 }, - { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, 1812 }, - { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, 1812 }, - { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, 1812 }, - { WWT_TAB, 1, 189, 219, 17, 43, 0x2000144E, 1812 }, - { WWT_TAB, 1, 220, 250, 17, 43, 0x2000144E, 1812 }, - { WWT_TAB, 1, 251, 281, 17, 43, 0x2000144E, 1812 }, - { WWT_TAB, 1, 282, 312, 17, 43, 0x2000144E, 1812 }, - { WWT_TAB, 1, 313, 343, 17, 43, 0x2000144E, 1812 }, + { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_STRING_DEFINED_TOOLTIP }, + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_STRING_DEFINED_TOOLTIP }, + { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_STRING_DEFINED_TOOLTIP }, + { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_STRING_DEFINED_TOOLTIP }, + { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_STRING_DEFINED_TOOLTIP }, + { WWT_TAB, 1, 158, 188, 17, 43, 0x2000144E, STR_STRING_DEFINED_TOOLTIP }, + { WWT_TAB, 1, 189, 219, 17, 43, 0x2000144E, STR_STRING_DEFINED_TOOLTIP }, + { WWT_TAB, 1, 220, 250, 17, 43, 0x2000144E, STR_STRING_DEFINED_TOOLTIP }, + { WWT_TAB, 1, 251, 281, 17, 43, 0x2000144E, STR_STRING_DEFINED_TOOLTIP }, + { WWT_TAB, 1, 282, 312, 17, 43, 0x2000144E, STR_STRING_DEFINED_TOOLTIP }, + { WWT_TAB, 1, 313, 343, 17, 43, 0x2000144E, STR_STRING_DEFINED_TOOLTIP }, { WWT_DROPDOWN_BUTTON, 0, 470, 591, 23, 34, STR_OBJECT_SELECTION_ADVANCED, STR_OBJECT_SELECTION_ADVANCED_TIP }, { WWT_SCROLL, 1, 4, 291, 60, 386, 2, STR_NONE }, { WWT_FLATBTN, 1, 391, 504, 46, 159, 0xFFFFFFFF, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 0, 384, 595, 24, 35, STR_INSTALL_NEW_TRACK_DESIGN, STR_INSTALL_NEW_TRACK_DESIGN_TIP }, - { WWT_DROPDOWN_BUTTON, 0, 350, 463, 23, 34, 5261, 5265 }, + { WWT_DROPDOWN_BUTTON, 0, 470, 591, 23, 34, STR_INSTALL_NEW_TRACK_DESIGN, STR_INSTALL_NEW_TRACK_DESIGN_TIP }, + { WWT_DROPDOWN_BUTTON, 0, 350, 463, 23, 34, STR_OBJECT_FILTER, STR_OBJECT_FILTER_TIP }, { WWT_TEXT_BOX, 1, 4, 214, 46, 57, (uint32)_filter_string, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 218, 287, 46, 57, 5277, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 218, 287, 46, 57, STR_OBJECT_SEARCH_CLEAR, STR_NONE }, { WWT_IMGBTN, 1, 3, 287, 73, 76, 0xFFFFFFFF, STR_NONE }, - { WWT_TAB, 1, 3, 33, 47, 73, 0x2000144E, 5349 }, - { WWT_TAB, 1, 34, 64, 47, 73, 0x2000144E, 1223 }, - { WWT_TAB, 1, 65, 95, 47, 73, 0x2000144E, 1224 }, - { WWT_TAB, 1, 96, 126, 47, 73, 0x2000144E, 1225 }, - { WWT_TAB, 1, 127, 157, 47, 73, 0x2000144E, 1226 }, - { WWT_TAB, 1, 158, 188, 47, 73, 0x2000144E, 1227 }, - { WWT_TAB, 1, 189, 219, 47, 73, 0x2000144E, 1228 }, + { WWT_TAB, 1, 3, 33, 47, 73, 0x2000144E, STR_OBJECT_FILTER_ALL_RIDES_TIP }, + { WWT_TAB, 1, 34, 64, 47, 73, 0x2000144E, STR_TRANSPORT_RIDES_TIP }, + { WWT_TAB, 1, 65, 95, 47, 73, 0x2000144E, STR_GENTLE_RIDES_TIP }, + { WWT_TAB, 1, 96, 126, 47, 73, 0x2000144E, STR_ROLLER_COASTERS_TIP }, + { WWT_TAB, 1, 127, 157, 47, 73, 0x2000144E, STR_THRILL_RIDES_TIP }, + { WWT_TAB, 1, 158, 188, 47, 73, 0x2000144E, STR_WATER_RIDES_TIP }, + { WWT_TAB, 1, 189, 219, 47, 73, 0x2000144E, STR_SHOPS_STALLS_TIP }, { WWT_13, 1, 4, 204, 80, 93, STR_NONE, STR_NONE }, { WWT_13, 1, 205, 291, 80, 93, STR_NONE, STR_NONE }, { WIDGETS_END } @@ -894,10 +894,10 @@ void window_editor_object_selection_mousedown(int widgetIndex, rct_window*w, rct gDropdownItemsFormat[1] = 1156; gDropdownItemsFormat[2] = 1156; gDropdownItemsFormat[3] = 1156; - gDropdownItemsArgs[0] = 2741; - gDropdownItemsArgs[1] = 5262; - gDropdownItemsArgs[2] = 5263; - gDropdownItemsArgs[3] = 5264; + gDropdownItemsArgs[0] = STR_ROLLERCOASTER_TYCOON_2_DROPDOWN; + gDropdownItemsArgs[1] = STR_OBJECT_FILTER_WW; + gDropdownItemsArgs[2] = STR_OBJECT_FILTER_TT; + gDropdownItemsArgs[3] = STR_OBJECT_FILTER_CUSTOM; window_dropdown_show_text( w->x + widget->left, @@ -1078,8 +1078,8 @@ static void window_editor_object_selection_invalidate(rct_window *w) w->widgets[WIDX_LIST].bottom = w->height - 14; w->widgets[WIDX_PREVIEW].left = w->width - 209; w->widgets[WIDX_PREVIEW].right = w->width - 96; - w->widgets[WIDX_INSTALL_TRACK].left = w->width - 216; - w->widgets[WIDX_INSTALL_TRACK].right = w->width - 130; + w->widgets[WIDX_INSTALL_TRACK].left = w->width - 130; + w->widgets[WIDX_INSTALL_TRACK].right = w->width - 9; w->widgets[WIDX_FILTER_DROPDOWN].left = w->width - 250; w->widgets[WIDX_FILTER_DROPDOWN].right = w->width - 137; @@ -1124,16 +1124,15 @@ static void window_editor_object_selection_invalidate(rct_window *w) if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_MANAGER | SCREEN_FLAGS_TRACK_DESIGNER)) { w->widgets[WIDX_ADVANCED].type = WWT_EMPTY; - w->widgets[WIDX_FILTER_DROPDOWN].type = WWT_EMPTY; for (i = 1; i < WINDOW_OBJECT_SELECTION_PAGE_COUNT; i++) w->widgets[WIDX_TAB_1 + i].type = WWT_EMPTY; x = 150; } else { w->widgets[WIDX_ADVANCED].type = WWT_DROPDOWN_BUTTON; - w->widgets[WIDX_FILTER_DROPDOWN].type = WWT_DROPDOWN_BUTTON; x = 300; } + w->widgets[WIDX_FILTER_DROPDOWN].type = WWT_DROPDOWN_BUTTON; w->widgets[WIDX_LIST].right = w->width - (600 - 587) - x; w->widgets[WIDX_PREVIEW].left = w->width - (600 - 537) - (x / 2); w->widgets[WIDX_PREVIEW].right = w->widgets[WIDX_PREVIEW].left + 113; @@ -1373,10 +1372,10 @@ static void window_editor_object_selection_paint(rct_window *w, rct_drawpixelinf // Draw object source source = (highlightedEntry->flags & 0xF0) >> 4; switch (source) { - case 8: stringId = 2741; break; - case 1: stringId = 5262; break; - case 2: stringId = 5263; break; - default: stringId = 5264; break; + case 8: stringId = STR_ROLLERCOASTER_TYCOON_2_DROPDOWN; break; + case 1: stringId = STR_OBJECT_FILTER_WW; break; + case 2: stringId = STR_OBJECT_FILTER_TT; break; + default: stringId = STR_OBJECT_FILTER_CUSTOM; break; } gfx_draw_string_right(dpi, stringId, NULL, 2, w->x + w->width - 5, w->y + w->height - 3 - 12 - 14); From 27ea266de11b31aaec7515966cbe408e9470e1ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 11 Sep 2015 22:53:01 +0200 Subject: [PATCH 0679/1173] Incrementation of paint_struct pointer looks bogus Since the value incremented is a pointer, pointer arithmetics apply, so instead of incrementing by 52, incrementation by 52^2 = 2704 takes place, which was confirmed by inspecting generated listing. --- src/interface/viewport.c | 52 ++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 1eb1ce114e..34f06e0026 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -288,12 +288,12 @@ void sub_6E7FF3(rct_window *w, rct_viewport *viewport, int x, int y) // viewport->view_width = (w->x - viewport->x) * zoom; // // sub_6E7FF3(w, viewport, x, y); -// +// // viewport->x += viewport->width; // viewport->view_x += viewport->width*zoom; // viewport->view_width = (viewport_bkup.width - viewport->width) * zoom; // viewport->width = viewport_bkup.width - viewport->width; -// +// // sub_6E7FF3(w, viewport, x, y); // // memcpy(viewport, &viewport_bkup, sizeof(rct_viewport)); @@ -707,7 +707,7 @@ void sub_688485(){ gfx_draw_sprite_raw_masked(dpi, x, y, image_id, ps->var_04); else gfx_draw_sprite(dpi, image_id, x, y, ps->var_04); - + if (ps->var_20 != 0){ ps = ps->var_20; continue; @@ -867,12 +867,12 @@ int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int edx, sint16 si, s RCT2_GLOBAL(0x00F1AD10, sint32) = di; } - RCT2_GLOBAL(0xEE7888, paint_struct*) += sizeof(paint_struct); + RCT2_GLOBAL(0xEE7888, paint_struct*) += 1; return 0; } /** - * + * * rct2: 0x006D4244 */ void viewport_vehicle_paint_setup(rct_vehicle *vehicle, int imageDirection) @@ -932,7 +932,7 @@ void viewport_vehicle_paint_setup(rct_vehicle *vehicle, int imageDirection) } /** - * + * * rct2: 0x0068F0FB */ void viewport_peep_paint_setup(rct_peep *peep, int imageDirection) @@ -941,7 +941,7 @@ void viewport_peep_paint_setup(rct_peep *peep, int imageDirection) } /** - * + * * rct2: 0x00672AC9 */ void viewport_misc_paint_setup(rct_sprite *misc, int imageDirection) @@ -1000,7 +1000,7 @@ void sprite_paint_setup(uint16 eax, uint16 ecx){ eax = (eax & 0x1FE0) << 3 | (ecx >> 5); int sprite_idx = RCT2_ADDRESS(0xF1EF60, uint16)[eax]; if (sprite_idx == SPRITE_INDEX_NULL) return; - + for (rct_sprite* spr = &g_sprite_list[sprite_idx]; sprite_idx != SPRITE_INDEX_NULL; sprite_idx = spr->unknown.next_in_quadrant){ spr = &g_sprite_list[sprite_idx]; dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); @@ -1042,7 +1042,7 @@ void sprite_paint_setup(uint16 eax, uint16 ecx){ } } -/* rct2: 0x006629BC +/* rct2: 0x006629BC * returns al * ebp : image_id * ax : unknown @@ -1158,7 +1158,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma } if (!is_exit && - !(map_element->flags & MAP_ELEMENT_FLAG_GHOST) && + !(map_element->flags & MAP_ELEMENT_FLAG_GHOST) && map_element->properties.entrance.ride_index != 0xFF){ RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = 0; @@ -1189,7 +1189,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], 0x3300, scrolling_text_setup(string_id, scroll, style->scrolling_mode), 0, height + style->height, 0x1C, 0x1C, 0); } - + image_id = RCT2_GLOBAL(0x009E32BC, uint32); if (!image_id){ image_id = 0x20B80000; @@ -1358,7 +1358,7 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma trackType = mapElement->properties.track.type; trackSequence = mapElement->properties.track.sequence & 0x0F; trackColourScheme = mapElement->properties.track.colour & 3; - + if ((RCT2_GLOBAL(0x0141E9E4, uint16) & 0x20) && dpi->zoom_level == 0) { RCT2_GLOBAL(0x009DE570, uint8) = 0; if (RCT2_ADDRESS(0x00999694, uint32)[trackType] & (1 << trackSequence)) { @@ -1431,14 +1431,14 @@ void viewport_entrance_paint_setup(uint8 direction, int height, rct_map_element* if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_PATH_HEIGHTS && dpi->zoom_level == 0){ - uint32 ebx = - (map_element->properties.entrance.type << 4) | + uint32 ebx = + (map_element->properties.entrance.type << 4) | (map_element->properties.entrance.index & 0xF); if (RCT2_ADDRESS(0x0097B974, uint8)[ebx] & 0xF){ int z = map_element->base_height * 8 + 3; - uint32 image_id = + uint32 image_id = z / 16 + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS,sint16) + 0x20101689; @@ -1577,12 +1577,12 @@ static void sub_68B3FB(int x, int y) if ((RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & 4) && RCT2_GLOBAL(0x9DE56A, uint16) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) && RCT2_GLOBAL(0x9DE56E, uint16) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16)){ - uint8 arrowRotation = + uint8 arrowRotation = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + (RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) & 3)) & 3; - uint32 imageId = - arrowRotation + + uint32 imageId = + arrowRotation + (RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) & 0xFC) + 0x20900C27; @@ -1601,7 +1601,7 @@ static void sub_68B3FB(int x, int y) if (bx <= dpi->y) return; - + rct_map_element* element = map_element;//push map_element sint16 max_height = 0; @@ -1624,7 +1624,7 @@ static void sub_68B3FB(int x, int y) dx -= dpi->height; if (dx >= dpi->y) return; - + RCT2_GLOBAL(0x9DE568, sint16) = x; RCT2_GLOBAL(0x9DE56C, sint16) = y; RCT2_GLOBAL(0x9DE57C, uint16) = 0; @@ -1777,7 +1777,7 @@ void map_element_paint_setup(int x, int y) RCT2_GLOBAL(0x0141E9D4, uint32) = 0xFFFF; RCT2_GLOBAL(0x0141E9D8, uint32) = 0xFFFF; RCT2_GLOBAL(0x0141E9DC, uint32) = 0xFFFF; - + sub_68B3FB(x, y); } else { viewport_blank_tiles_paint_setup(x, y); @@ -1790,8 +1790,8 @@ void map_element_paint_setup(int x, int y) */ void viewport_paint_setup() { - rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); - + rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + rct_xy16 mapTile = { .x = dpi->x & 0xFFE0, .y = (dpi->y - 16) & 0xFFE0 @@ -1808,7 +1808,7 @@ void viewport_paint_setup() mapTile.x &= 0xFFE0; mapTile.y &= 0xFFE0; - + for (; num_vertical_quadrants > 0; --num_vertical_quadrants){ map_element_paint_setup(mapTile.x, mapTile.y); sprite_paint_setup(mapTile.x, mapTile.y); @@ -1866,7 +1866,7 @@ void viewport_paint_setup() mapTile.x &= 0xFFE0; mapTile.y &= 0xFFE0; - + for (; num_vertical_quadrants > 0; --num_vertical_quadrants){ map_element_paint_setup(mapTile.x, mapTile.y); sprite_paint_setup(mapTile.x, mapTile.y); @@ -2612,7 +2612,7 @@ rct_viewport *viewport_find_from_point(int screenX, int screenY) { rct_window *w; rct_viewport *viewport; - + w = window_find_from_point(screenX, screenY); if (w == NULL) return NULL; From 788e988992b865ca547add11ca4d2d5e6c3e6e7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sat, 12 Sep 2015 00:16:05 +0200 Subject: [PATCH 0680/1173] Memory access fixes --- src/peep/peep.c | 297 ++++++++++++++++++++++++----------------------- src/ride/track.c | 119 ++++++++++--------- src/scenario.c | 31 +++-- src/title.c | 7 +- 4 files changed, 236 insertions(+), 218 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 8f5b69742b..3b42080bdc 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -131,7 +131,7 @@ void peep_update_all() { int i; uint16 spriteIndex; - rct_peep* peep; + rct_peep* peep; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E) return; @@ -178,7 +178,7 @@ static uint8 peep_assess_surroundings(sint16 center_x, sint16 center_y, sint16 c rct_scenery_entry* scenery; switch (map_element_get_type(mapElement)){ - case MAP_ELEMENT_TYPE_PATH: + case MAP_ELEMENT_TYPE_PATH: if ((mapElement->properties.path.additions & 0xF) == 0) break; @@ -186,8 +186,8 @@ static uint8 peep_assess_surroundings(sint16 center_x, sint16 center_y, sint16 c if (mapElement->properties.path.additions & (1 << 7)) break; - if (scenery->path_bit.var_06 & - (PATH_BIT_FLAG_JUMPING_FOUNTAIN_WATER | + if (scenery->path_bit.var_06 & + (PATH_BIT_FLAG_JUMPING_FOUNTAIN_WATER | PATH_BIT_FLAG_JUMPING_FOUNTAIN_SNOW)){ num_fountains++; break; @@ -307,7 +307,7 @@ static void sub_68F8CD(rct_peep *peep) if (peep->var_2A != 0) { return; } - + if (!(peep->flags & PEEP_FLAGS_LEAVING_PARK)){ if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) { if (peep->energy >= 70 && peep->happiness >= 60) { @@ -457,7 +457,7 @@ static void sub_68F41A(rct_peep *peep, int index) } } } - + if (peep->state == PEEP_STATE_WALKING && peep->var_2A == 0 && !(peep->flags & PEEP_FLAGS_LEAVING_PARK) && @@ -478,7 +478,7 @@ static void sub_68F41A(rct_peep *peep, int index) } } } - + if ((scenario_rand() & 0xFFFF) <= (peep->item_standard_flags & PEEP_ITEM_MAP ? 8192U : 2184U)){ peep_pick_ride_to_go_on(peep); } @@ -662,9 +662,9 @@ static void sub_68F41A(rct_peep *peep, int index) } } } - } + } // 68FA89 - if (peep->var_42 == 0 && + if (peep->var_42 == 0 && peep_has_food(peep)){ peep->var_42 += 3; } @@ -795,7 +795,7 @@ int sub_68F3AE(rct_peep* peep){ if (z == map_element->base_height)return 1; } } while (!map_element_is_last_for_tile(map_element++)); - + peep_decrement_num_riders(peep); peep->state = PEEP_STATE_FALLING; peep_window_state_update(peep); @@ -859,7 +859,7 @@ static void peep_state_reset(rct_peep* peep){ sub_693BE5(peep, 0); } -/* rct2: 0x69C308 +/* rct2: 0x69C308 * Check if lost. */ void peep_check_if_lost(rct_peep* peep){ @@ -918,9 +918,9 @@ void peep_check_cant_find_exit(rct_peep* peep){ if (--peep->var_C6 == 0) peep->var_C6 = 90; } -/* rct2: 0x6939EB +/* rct2: 0x6939EB * Also used to move peeps to the correct position to - * start an action. Returns 1 if the correct destination + * start an action. Returns 1 if the correct destination * has not yet been reached. xy_distance is how close the * peep is to the target. */ @@ -935,9 +935,9 @@ int peep_update_action(sint16* x, sint16* y, sint16* xy_distance, rct_peep* peep int x_delta = abs(*x); int y_delta = abs(*y); - + *xy_distance = x_delta + y_delta; - + if (peep->action >= 0xFE){ if (*xy_distance <= peep->destination_tolerence){ return 0; @@ -967,7 +967,7 @@ int peep_update_action(sint16* x, sint16* y, sint16* xy_distance, rct_peep* peep peep->action_sprite_image_offset = _edi[peep->no_action_frame_no + 1]; return 1; } - + uint32* edi = RCT2_ADDRESS(0x982708, uint32*)[peep->sprite_type * 2]; uint8* _edi = (uint8*)(edi[peep->action_sprite_type * 2 + 1]); peep->action_frame++; @@ -1021,7 +1021,7 @@ int peep_update_action(sint16* x, sint16* y, sint16* xy_distance, rct_peep* peep * Decreases rider count if on/entering a ride. */ void peep_decrement_num_riders(rct_peep* peep){ - if (peep->state == PEEP_STATE_ON_RIDE + if (peep->state == PEEP_STATE_ON_RIDE || peep->state == PEEP_STATE_ENTERING_RIDE){ rct_ride* ride = GET_RIDE(peep->current_ride); @@ -1037,7 +1037,7 @@ void set_sprite_type(rct_peep* peep, uint8 type){ peep->sprite_type = type; peep->action_sprite_image_offset = 0; peep->no_action_frame_no = 0; - + if (peep->action >= PEEP_ACTION_NONE_1) peep->action = PEEP_ACTION_NONE_2; @@ -1103,7 +1103,7 @@ item_pref item_order_preference[] = { }; /** - * + * * rct2: 0x0069B8CC */ void peep_update_sprite_type(rct_peep* peep) @@ -1118,7 +1118,7 @@ void peep_update_sprite_type(rct_peep* peep) (scenario_rand() & 0xFFFF) <= 13107 && peep->x != SPRITE_LOCATION_NULL ) { - + bl = 1; sound_play_panned(SOUND_BALLOON_POP, 0x8001, peep->x, peep->y, peep->z); } @@ -1151,7 +1151,7 @@ void peep_update_sprite_type(rct_peep* peep) } map_element++; } - } + } } for (item_pref* item_pref = item_order_preference; item_pref->type != 0xFF; item_pref++) { @@ -1172,32 +1172,32 @@ void peep_update_sprite_type(rct_peep* peep) set_sprite_type(peep, PEEP_SPRITE_TYPE_WATCHING); return; } - + if (peep->nausea > 170) { set_sprite_type(peep, PEEP_SPRITE_TYPE_VERY_NAUSEOUS); return; } - + if (peep->nausea > 140) { set_sprite_type(peep, PEEP_SPRITE_TYPE_NAUSEOUS); return; } - + if (peep->energy <= 64 && peep->happiness < 128) { set_sprite_type(peep, PEEP_SPRITE_TYPE_26); return; } - + if (peep->energy <= 80 && peep->happiness < 128) { set_sprite_type(peep, PEEP_SPRITE_TYPE_25); return; } - + if (peep->bathroom > 220) { set_sprite_type(peep, PEEP_SPRITE_TYPE_REQUIRE_BATHROOM); return; } - + set_sprite_type(peep, PEEP_SPRITE_TYPE_NORMAL); } @@ -1208,7 +1208,7 @@ void peep_update_sprite_type(rct_peep* peep) * count if on/entering a ride. */ void peep_window_state_update(rct_peep* peep){ - + rct_window* w = window_find_by_number(WC_PEEP, peep->sprite_index); if (w != NULL) window_event_invalidate_call(w); @@ -1259,7 +1259,7 @@ void peep_sprite_remove(rct_peep* peep){ sprite_remove((rct_sprite*)peep); } -/** New function removes peep from +/** New function removes peep from * park existance. Works with staff. */ void peep_remove(rct_peep* peep){ @@ -1368,7 +1368,7 @@ void peep_update_falling(rct_peep* peep){ invalidate_sprite_2((rct_sprite*)peep); return; } - + invalidate_sprite_2((rct_sprite*)peep); sprite_move(peep->x, peep->y, saved_height, (rct_sprite*)peep); invalidate_sprite_2((rct_sprite*)peep); @@ -1409,7 +1409,7 @@ void peep_try_get_up_from_sitting(rct_peep* peep){ } /** - * rct2: 0x0069152B + * rct2: 0x0069152B */ void peep_update_sitting(rct_peep* peep){ if (peep->sub_state == 0){ @@ -1422,8 +1422,8 @@ void peep_update_sitting(rct_peep* peep){ int ebx = peep->var_37 & 0x7; int x = (peep->x & 0xFFE0) + RCT2_ADDRESS(0x981F2C, uint16)[ebx * 2]; int y = (peep->y & 0xFFE0) + RCT2_ADDRESS(0x981F2E, uint16)[ebx * 2]; - int z = peep->z; - + int z = peep->z; + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, z, (rct_sprite*)peep); @@ -1448,7 +1448,7 @@ void peep_update_sitting(rct_peep* peep){ peep_try_get_up_from_sitting(peep); return; } - + if ((peep->flags & PEEP_FLAGS_LEAVING_PARK)){ peep_decrement_num_riders(peep); peep->state = PEEP_STATE_WALKING; @@ -1461,7 +1461,7 @@ void peep_update_sitting(rct_peep* peep){ sub_693B58(peep); return; } - + if (peep->sprite_type == 0x15){ peep_try_get_up_from_sitting(peep); return; @@ -1508,7 +1508,7 @@ void peep_update_sitting(rct_peep* peep){ /** * - * rct2: 0x006966A9 + * rct2: 0x006966A9 */ void remove_peep_from_queue(rct_peep* peep) { @@ -1577,7 +1577,7 @@ static void peep_go_to_ride_entrance(rct_peep* peep, rct_ride* ride){ int x = ride->entrances[peep->current_ride_station] & 0xFF; int y = ride->entrances[peep->current_ride_station] >> 8; int z = ride->station_heights[peep->current_ride_station]; - + rct_map_element* map_element = ride_get_station_exit_element(ride, x, y, z); uint8 direction = !map_element ? 0 : map_element->type & MAP_ELEMENT_DIRECTION_MASK; @@ -1669,7 +1669,7 @@ static void peep_update_ride_sub_state_0(rct_peep* peep){ } else{ chosen_train = ride->var_066[peep->current_ride_station]; - } + } if (chosen_train == 0xFF){ return; } @@ -1716,7 +1716,7 @@ static void peep_update_ride_sub_state_0(rct_peep* peep){ if (car_array_size == 0)return; } - if (ride->status != RIDE_STATUS_OPEN || + if (ride->status != RIDE_STATUS_OPEN || ride->var_1CA != 0){ if (peep->destination_tolerence == 0){ remove_peep_from_queue(peep); @@ -1791,7 +1791,7 @@ void peep_update_ride_sub_state_1(rct_peep* peep){ { uint8 vehicle = ride_entry->default_vehicle; - if (ride_entry->vehicles[vehicle].var_12 & (1 << 3) || + if (ride_entry->vehicles[vehicle].var_12 & (1 << 3) || ride_entry->vehicles[vehicle].var_14 & ((1 << 14) | (1<<12))) RCT2_GLOBAL(0xF1AECA, uint16) = 0x1C; else @@ -1800,7 +1800,7 @@ void peep_update_ride_sub_state_1(rct_peep* peep){ if (peep->sub_state == 1 && xy_distance < RCT2_GLOBAL(0xF1AECA, uint16)) peep->sub_state = 2; - + invalidate_sprite_2((rct_sprite*)peep); sint16 z = ride->station_heights[peep->current_ride_station] * 8; @@ -1827,7 +1827,7 @@ void peep_update_ride_sub_state_1(rct_peep* peep){ uint8 direction_entrance = (map_element->type & MAP_ELEMENT_DIRECTION_MASK); - if (ride->type == RIDE_TYPE_MAZE){ + if (ride->type == RIDE_TYPE_MAZE){ peep->maze_last_edge = direction_entrance + 1; x *= 32; y *= 32; @@ -1959,7 +1959,7 @@ void peep_update_ride_sub_state_1(rct_peep* peep){ } sint8 load_position = vehicle_type->peep_loading_positions[peep->current_seat]; - + switch (vehicle->sprite_direction / 8){ case 0: peep->destination_x = vehicle->x - load_position; @@ -2112,19 +2112,19 @@ static void peep_update_ride_sub_state_2_rejoin_queue(rct_peep* peep, rct_ride* queue_peep->next_in_queue = peep->sprite_index; } -/* rct2: 0x00691E42 +/* rct2: 0x00691E42 * Note: Before this was the entry * point for sub state 1 and 3. The * check has been removed that would * branch it out to 1 and 3. Now uses - * separate functions. + * separate functions. */ static void peep_update_ride_sub_state_2(rct_peep* peep){ rct_ride* ride = GET_RIDE(peep->current_ride); if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & RIDE_TYPE_FLAG_13){ if (ride->status != RIDE_STATUS_OPEN || - ride->var_1CA != 0 || + ride->var_1CA != 0 || (++peep->var_AC) == 0){ peep_update_ride_sub_state_2_rejoin_queue(peep, ride); @@ -2170,7 +2170,7 @@ static void peep_update_ride_sub_state_2(rct_peep* peep){ if (ride->mode == RIDE_MODE_FORWARD_ROTATION || ride->mode == RIDE_MODE_BACKWARD_ROTATION){ - if (peep->current_seat & 1 || + if (peep->current_seat & 1 || !(vehicle->next_free_seat & 1)){ peep_update_ride_sub_state_2_enter_ride(peep, ride); return; @@ -2189,7 +2189,7 @@ static void peep_update_ride_sub_state_2(rct_peep* peep){ ++peep->var_AC != 0 && !((GET_VEHICLE(ride->vehicles[peep->current_train]))->var_48 & (1 << 4))) return; - + if (ride->mode != RIDE_MODE_FORWARD_ROTATION && ride->mode != RIDE_MODE_BACKWARD_ROTATION){ if (vehicle->next_free_seat - 1 != peep->current_seat) @@ -2299,7 +2299,7 @@ void peep_update_ride_sub_state_7(rct_peep* peep){ exit_direction ^= (1 << 1); if (!(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & RIDE_TYPE_FLAG_16)){ - + for (; vehicle->var_01 != 0; vehicle = GET_VEHICLE(vehicle->prev_vehicle_on_train)){ uint16 eax = vehicle->var_36 / 4; if (eax == 0 || eax > 3) @@ -2389,7 +2389,7 @@ void peep_update_ride_sub_state_7(rct_peep* peep){ uint8 station_direction = (!map_element ? 0 : map_element->type & MAP_ELEMENT_DIRECTION_MASK); vehicle = GET_VEHICLE(ride->vehicles[peep->current_train]); - + ride_entry = GET_RIDE_ENTRY(vehicle->ride_subtype); rct_ride_type_vehicle* vehicle_type = &ride_entry->vehicles[vehicle->vehicle_type]; @@ -2444,7 +2444,7 @@ void peep_update_ride_sub_state_7(rct_peep* peep){ /* rct2: 0x0069376A */ static void peep_update_ride_prepare_for_state_9(rct_peep* peep){ rct_ride* ride = GET_RIDE(peep->current_ride); - + sint16 x = ride->exits[peep->current_ride_station] & 0xFF; sint16 y = ride->exits[peep->current_ride_station] >> 8; sint16 z = ride->station_heights[peep->current_ride_station]; @@ -2501,7 +2501,7 @@ static void peep_update_ride_sub_state_9(rct_peep* peep){ if (peep_update_action(&x, &y, &xy_distance, peep)){ invalidate_sprite_2((rct_sprite*)peep); - + if (xy_distance >= 16){ sint16 z = ride->station_heights[peep->current_ride_station] * 8; @@ -2510,7 +2510,7 @@ static void peep_update_ride_sub_state_9(rct_peep* peep){ invalidate_sprite_2((rct_sprite*)peep); return; } - + sub_693BE5(peep, 0); sprite_move(x, y, peep->z, (rct_sprite*)peep); invalidate_sprite_2((rct_sprite*)peep); @@ -2597,7 +2597,7 @@ static void peep_udpate_ride_sub_state_13(rct_peep* peep){ z = ride->station_heights[peep->current_ride_station] * 8 + 2; if ((peep->var_37 & 3) == 1){ - + if (xy_distance > 15) xy_distance = 15; @@ -2721,7 +2721,7 @@ static void peep_update_ride_sub_state_14(rct_peep* peep){ rct_map_element* map_element = ride_get_station_exit_element(ride, x, y, z); uint8 exit_direction = map_element->type & MAP_ELEMENT_DIRECTION_MASK; - + peep->var_37 = (exit_direction * 4) | (peep->var_37 & 0x30) | 1; x = ride->station_starts[peep->current_ride_station] & 0xFF; y = ride->station_starts[peep->current_ride_station] >> 8; @@ -2738,7 +2738,7 @@ static void peep_update_ride_sub_state_14(rct_peep* peep){ peep->sub_state = 16; return; } - } + } peep->var_37++; x = ride->station_starts[peep->current_ride_station] & 0xFF; @@ -2782,13 +2782,13 @@ static void peep_update_ride_sub_state_15(rct_peep* peep){ case 2: return; case 3: - { + { sint16 x = ride->station_starts[peep->current_ride_station] & 0xFF; sint16 y = ride->station_starts[peep->current_ride_station] >> 8; x *= 32; y *= 32; - + uint8 direction = (peep->var_37 / 4) & 3; sint16 dest_x = x + RCT2_ADDRESS(0x981F1C, sint16)[direction * 2]; sint16 dest_y = y + RCT2_ADDRESS(0x981F1E, sint16)[direction * 2]; @@ -2806,7 +2806,7 @@ static void peep_update_ride_sub_state_15(rct_peep* peep){ invalidate_sprite_2((rct_sprite*)peep); peep->var_37++; - return; + return; } default: return; @@ -2992,7 +2992,7 @@ static void peep_update_ride_sub_state_17(rct_peep* peep){ do { if (z != mapElement->base_height) continue; - + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_TRACK){ type = 1; break; @@ -3180,7 +3180,7 @@ static void peep_update_ride_sub_state_21(rct_peep* peep){ ride_update_satisfaction(ride, peep->happiness / 64); } -/* rct2: 0x691A30 +/* rct2: 0x691A30 * Used by entering_ride and queueing_front */ static void peep_update_ride(rct_peep* peep){ switch (peep->sub_state){ @@ -3264,7 +3264,7 @@ static void peep_update_ride(rct_peep* peep){ } } -/* rct2: 0x006C0E8B +/* rct2: 0x006C0E8B * Also used by inspecting. */ static void peep_update_fixing(int steps, rct_peep* peep){ @@ -3441,8 +3441,8 @@ static void peep_update_watering(rct_peep* peep){ peep->action_frame = 0; peep->action_sprite_image_offset = 0; sub_693B58(peep); - invalidate_sprite_2((rct_sprite*)peep); - + invalidate_sprite_2((rct_sprite*)peep); + peep->sub_state = 1; } else if (peep->sub_state == 1){ @@ -3460,15 +3460,15 @@ static void peep_update_watering(rct_peep* peep){ do{ if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_SCENERY) continue; - + if (abs(((int)peep->next_z) - map_element->base_height) > 4) continue; - + rct_scenery_entry* scenery_entry = g_smallSceneryEntries[map_element->properties.scenery.type]; if (!(scenery_entry->small_scenery.flags & SMALL_SCENERY_FLAG_CAN_BE_WATERED)) continue; - + map_element->properties.scenery.age = 0; map_invalidate_tile_zoom0(x, y, map_element->base_height * 8, map_element->clearance_height * 8); peep->staff_gardens_watered++; @@ -3551,7 +3551,7 @@ static void peep_update_emptying_bin(rct_peep* peep){ static void peep_update_sweeping(rct_peep* peep){ peep->var_E2 = 0; if (!sub_68F3AE(peep))return; - + invalidate_sprite_2((rct_sprite*)peep); if (peep->action == PEEP_ACTION_STAFF_SWEEP && peep->action_frame == 8){ @@ -3685,7 +3685,7 @@ static void peep_update_watching(rct_peep* peep){ return; } } - + if ((scenario_rand() & 0xFFFF) <= 655){ peep->action = PEEP_ACTION_TAKE_PHOTO; peep->action_frame = 0; @@ -3694,7 +3694,7 @@ static void peep_update_watching(rct_peep* peep){ invalidate_sprite_2((rct_sprite*)peep); return; } - + if ((peep->standing_flags & 1)){ if ((scenario_rand() & 0xFFFF) <= 655){ peep->action = PEEP_ACTION_WAVE; @@ -3739,7 +3739,7 @@ static void peep_update_entering_park(rct_peep* peep){ } sint16 x = 0, y = 0, xy_distance; if (peep_update_action(&x, &y, &xy_distance, peep)){ - invalidate_sprite_2((rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); sprite_move(x, y, peep->z, (rct_sprite*)peep); invalidate_sprite_2((rct_sprite*)peep); return; @@ -3805,7 +3805,7 @@ static int peep_update_walking_find_bench(rct_peep* peep){ free_edge &= ~(1 << ((sprite->peep.var_37 & 0x4) >> 2)); } - + if (!free_edge) return 0; free_edge ^= 0x3; @@ -3824,7 +3824,7 @@ static int peep_update_walking_find_bench(rct_peep* peep){ int ebx = peep->var_37 & 0x7; int x = (peep->x & 0xFFE0) + RCT2_ADDRESS(0x981F2C, uint16)[ebx * 2]; int y = (peep->y & 0xFFE0) + RCT2_ADDRESS(0x981F2E, uint16)[ebx * 2]; - + peep->destination_x = x; peep->destination_y = y; peep->destination_tolerence = 3; @@ -3959,9 +3959,9 @@ static void peep_update_walking_break_scenery(rct_peep* peep){ map_element->flags |= MAP_ELEMENT_FLAG_BROKEN; map_invalidate_tile_zoom1( - peep->next_x, - peep->next_y, - (map_element->base_height << 3) + 32, + peep->next_x, + peep->next_y, + (map_element->base_height << 3) + 32, map_element->base_height << 3); peep->var_F3 = 0x10; @@ -3973,7 +3973,7 @@ static void peep_update_walking_break_scenery(rct_peep* peep){ static void peep_update_buying(rct_peep* peep) { if (!sub_68F3AE(peep))return; - + rct_ride* ride = GET_RIDE(peep->current_ride); if (ride->type == RIDE_TYPE_NULL || ride->status != RIDE_STATUS_OPEN){ peep_decrement_num_riders(peep); @@ -4054,7 +4054,7 @@ static void peep_update_buying(rct_peep* peep) } else{ ride_update_popularity(ride, 0); - } + } peep->sub_state = 1; return; } @@ -4207,7 +4207,7 @@ static void peep_update_heading_to_inspect(rct_peep* peep){ return; } - if (ride->mechanic_status != RIDE_MECHANIC_STATUS_HEADING || + if (ride->mechanic_status != RIDE_MECHANIC_STATUS_HEADING || !(ride->lifecycle_flags & RIDE_LIFECYCLE_DUE_INSPECTION)){ peep_decrement_num_riders(peep); peep->state = PEEP_STATE_FALLING; @@ -4220,7 +4220,7 @@ static void peep_update_heading_to_inspect(rct_peep* peep){ sub_69A98C(peep); peep->sub_state = 2; } - + if (peep->sub_state <= 3){ peep->var_74++; if (peep->var_74 > 2500){ @@ -4298,7 +4298,7 @@ static void peep_update_heading_to_inspect(rct_peep* peep){ static void peep_update_answering(rct_peep* peep){ rct_ride* ride = GET_RIDE(peep->current_ride); - if (ride->type == RIDE_TYPE_NULL || + if (ride->type == RIDE_TYPE_NULL || ride->mechanic_status != RIDE_MECHANIC_STATUS_HEADING){ peep_decrement_num_riders(peep); @@ -4352,7 +4352,7 @@ static void peep_update_answering(rct_peep* peep){ rct_map_element* map_element = RCT2_GLOBAL(0x00F1EE1A, rct_map_element*); - if (peep->current_ride != + if (peep->current_ride != map_element->properties.entrance.ride_index) return; @@ -4681,10 +4681,10 @@ static void peep_update_walking(rct_peep* peep){ } } else if (peep_has_empty_container(peep)){ - if ((!(peep->next_var_29 & 0x18)) && + if ((!(peep->next_var_29 & 0x18)) && ((peep->sprite_index & 0x1FF) == (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x1FF))&& ((0xFFFF & scenario_rand()) <= 4096)){ - + uint8 pos_stnd = 0; for (int container = peep_empty_container_standard_flag(peep); pos_stnd < 32; pos_stnd++)if (container&(1<next_var_29 & 0x18) == 8){ rct_map_element* map_element = map_get_surface_element_at(peep->next_x / 32, peep->next_y / 32); - + int water_height = map_element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK; if (water_height){ invalidate_sprite_2((rct_sprite*)peep); @@ -4842,7 +4842,7 @@ static void peep_update_walking(rct_peep* peep){ /* From peep_update */ static void peep_update_thoughts(rct_peep* peep){ // Thoughts must always have a gap of at least - // 220 ticks in age between them. In order to + // 220 ticks in age between them. In order to // allow this when a thought is new it enters // a holding zone. Before it becomes fresh. int add_fresh = 1; @@ -4853,7 +4853,7 @@ static void peep_update_thoughts(rct_peep* peep){ if (peep->thoughts[i].var_2 == 1) { - add_fresh = 0; + add_fresh = 0; // If thought is fresh we wait 220 ticks // before allowing a new thought to become fresh. if (++peep->thoughts[i].var_3 >= 220) { @@ -4864,13 +4864,15 @@ static void peep_update_thoughts(rct_peep* peep){ } } else if (peep->thoughts[i].var_2 > 1) { - if (++peep->thoughts[i].var_3 == 0) { + if (++peep->thoughts[i].var_3 == 0) { // When thought is older than ~6900 ticks remove it if (++peep->thoughts[i].var_2 >= 28) { peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_THOUGHTS; // Clear top thought, push others up - memmove(&peep->thoughts[i], &peep->thoughts[i + 1], sizeof(rct_peep_thought)*(PEEP_MAX_THOUGHTS - i - 1)); + if (i < PEEP_MAX_THOUGHTS - 1) { + memmove(&peep->thoughts[i], &peep->thoughts[i + 1], sizeof(rct_peep_thought)*(PEEP_MAX_THOUGHTS - i - 1)); + } peep->thoughts[PEEP_MAX_THOUGHTS - 1].type = PEEP_THOUGHT_TYPE_NONE; } } @@ -4879,8 +4881,8 @@ static void peep_update_thoughts(rct_peep* peep){ fresh_thought = i; } } - // If there are no fresh thoughts - // a previously new thought can become + // If there are no fresh thoughts + // a previously new thought can become // fresh. if (add_fresh && fresh_thought != -1) { peep->thoughts[fresh_thought].var_2 = 1; @@ -4995,7 +4997,7 @@ static void peep_update(rct_peep *peep) peep_update_fixing(stepsToTake, peep); break; //There shouldnt be any more - default: + default: assert(0); break; } @@ -5240,7 +5242,7 @@ void peep_update_crowd_noise() void peep_applause() { uint16 spriteIndex; - rct_peep* peep; + rct_peep* peep; FOR_ALL_GUESTS(spriteIndex, peep) { if (peep->var_2A != 0) @@ -5600,7 +5602,7 @@ void get_arguments_from_thought(rct_peep_thought thought, uint32* argument_1, ui } /** - * rct2: 0x00698827 + * rct2: 0x00698827 * returns 1 on pickup (CF not set) */ int peep_can_be_picked_up(rct_peep* peep){ @@ -5720,7 +5722,7 @@ int peep_get_easteregg_name_id(rct_peep *peep) { char buffer[256]; int i; - + format_string(buffer, peep->name_string_idx, &peep->id); for (i = 0; i < countof(gPeepEasterEggNames); i++) @@ -5786,7 +5788,7 @@ static int peep_has_food_extra_flag(rct_peep* peep){ ); } -/* To simplify check of 0x36BA3E0 and 0x11FF78 +/* To simplify check of 0x36BA3E0 and 0x11FF78 * returns 0 on no food. */ int peep_has_food(rct_peep* peep){ @@ -5857,7 +5859,7 @@ static int peep_should_find_bench(rct_peep* peep){ if (peep->nausea <= 170 && peep->energy > 50){ return 0; } - + if (!(peep->next_var_29 & 0x1C)){ return 1; } @@ -5881,7 +5883,7 @@ void peep_insert_new_thought(rct_peep *peep, uint8 thought_type, uint8 thought_a sub_693B58(peep); invalidate_sprite_2((rct_sprite*)peep); } - + for (int i = 0; i < PEEP_MAX_THOUGHTS; ++i){ rct_peep_thought* thought = &peep->thoughts[i]; // Remove the oldest thought by setting it to NONE. @@ -5891,7 +5893,9 @@ void peep_insert_new_thought(rct_peep *peep, uint8 thought_type, uint8 thought_a // If the thought type has not changed then we need to move // it to the top of the thought list. This is done by first removing the // existing thought and placing it at the top. - memmove(thought, thought + 1, sizeof(rct_peep_thought)*(PEEP_MAX_THOUGHTS - i - 1)); + if (i < PEEP_MAX_THOUGHTS - 1) { + memmove(thought, thought + 1, sizeof(rct_peep_thought)*(PEEP_MAX_THOUGHTS - i - 1)); + } break; } } @@ -5906,7 +5910,7 @@ void peep_insert_new_thought(rct_peep *peep, uint8 thought_type, uint8 thought_a peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_THOUGHTS; } -/* rct2: 0x00699FE3 +/* rct2: 0x00699FE3 * Stops peeps that are having thoughts * such as "I'm hungry" after visiting a food shop. * Works for Thirst/Hungry/Low Money/Bathroom @@ -5936,7 +5940,10 @@ static void peep_stop_purchase_thought(rct_peep* peep, uint8 ride_type){ if (thought->type != thought_type)continue; - memmove(thought, thought + 1, sizeof(rct_peep_thought)*(PEEP_MAX_THOUGHTS - i - 1)); + + if (i < PEEP_MAX_THOUGHTS - 1) { + memmove(thought, thought + 1, sizeof(rct_peep_thought)*(PEEP_MAX_THOUGHTS - i - 1)); + } peep->thoughts[PEEP_MAX_THOUGHTS - 1].type = PEEP_THOUGHT_TYPE_NONE; @@ -5984,7 +5991,7 @@ void sub_693BAB(rct_peep* peep) { } /** - * + * * rct2: 0x00693CBB */ static int peep_update_queue_position(rct_peep* peep){ @@ -6110,7 +6117,7 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m ride->first_peep_in_queue[stationNum] = peep->sprite_index; peep->next_in_queue = previous_first; ride->queue_length[stationNum]++; - + peep_decrement_num_riders(peep); peep->current_ride = rideIndex; peep->current_ride_station = stationNum; @@ -6292,7 +6299,7 @@ static int peep_footpath_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_ma peep->next_y = (y & 0xFFE0); peep->next_z = map_element->base_height; peep->next_var_29 = map_element->properties.path.type & 7; - + sint16 z = peep_get_height_on_slope(peep, x, y); if (peep->type == PEEP_TYPE_STAFF){ @@ -6308,7 +6315,7 @@ static int peep_footpath_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_ma if (vandalism == true){ peep->var_EF |= 1; - if (peep->var_EF & 0x3E && + if (peep->var_EF & 0x3E && !(peep->var_EF & 0xC0)){ if ((scenario_rand() & 0xFFFF) <= 10922){ @@ -6323,7 +6330,7 @@ static int peep_footpath_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_ma (scenario_rand()&0xFFFF) <= 4369){ peep->var_EF -= 0x40; } - + uint16 crowded = 0; uint8 litter_count = 0; uint8 sick_count = 0; @@ -6354,7 +6361,7 @@ static int peep_footpath_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_ma } } - if (crowded >= 10 && + if (crowded >= 10 && peep->state == PEEP_STATE_WALKING && (scenario_rand() & 0xFFFF) <= 21845){ @@ -6379,7 +6386,7 @@ static int peep_footpath_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_ma for (uint8 time = 0; time < 3; time++){ total_sick += (disgusting_count >> (2 * time)) & 0x3; } - + if (total_sick >= 3 && (scenario_rand() & 0xFFFF) <= 10922){ peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_PATH_DISGUSTING, 0xFF); @@ -6476,7 +6483,7 @@ static int peep_interact_with_path(rct_peep* peep, sint16 x, sint16 y, rct_map_e rct_ride* ride = GET_RIDE(rideIndex); uint16 old_first_peep = ride->first_peep_in_queue[stationNum]; - ride->first_peep_in_queue[stationNum] = peep->sprite_index; + ride->first_peep_in_queue[stationNum] = peep->sprite_index; peep->next_in_queue = old_first_peep; ride->queue_length[stationNum]++; @@ -6522,9 +6529,9 @@ static int peep_interact_with_shop(rct_peep* peep, sint16 x, sint16 y, rct_map_e if (peep->type == PEEP_TYPE_STAFF) return peep_return_to_center_of_tile(peep); - + peep->var_F4 = 0; - + if (ride->status != RIDE_STATUS_OPEN) return peep_return_to_center_of_tile(peep); @@ -6538,14 +6545,14 @@ static int peep_interact_with_shop(rct_peep* peep, sint16 x, sint16 y, rct_map_e peep->var_F4 = 0; if (!sub_6960AB(peep, rideIndex, 0, 0)) return peep_return_to_center_of_tile(peep); - + money16 cost = ride->price; if (cost != 0){ ride->total_profit += cost; ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_PARK_RIDE_TICKETS * 4; peep_spend_money(peep, NULL, cost); - } + } peep->destination_x = (x & 0xFFE0) + 16; peep->destination_y = (y & 0xFFE0) + 16; peep->destination_tolerence = 3; @@ -6686,7 +6693,7 @@ rct_map_element* get_banner_on_path(rct_map_element *path_element) return NULL; } while (bannerElement++); - + return NULL; } @@ -6727,7 +6734,7 @@ static bool is_valid_path_z_and_direction(rct_map_element *mapElement, int curre } /** - * + * * rct2: 0x00694BAE */ static uint8 sub_694BAE(sint16 x, sint16 y, sint16 z, rct_map_element *mapElement, uint8 chosenDirection) @@ -6911,7 +6918,7 @@ static int sub_69A5F0(sint16 x, sint16 y, sint16 z, rct_peep *peep, rct_map_elem //uint8 start_z = RCT2_GLOBAL(0x00F1AED2, uint8); // //uint8 edges = 0xF; - //if (peep->var_CC.x == (start_x / 32) && + //if (peep->var_CC.x == (start_x / 32) && // peep->var_CC.y == (start_y / 32) && // peep->var_CC.z == start_z){ @@ -6920,7 +6927,7 @@ static int sub_69A5F0(sint16 x, sint16 y, sint16 z, rct_peep *peep, rct_map_elem // if (peep->var_D0[index].x == x && // peep->var_D0[index].y == y && // peep->var_D0[index].z == z){ - // edges = peep->var_D0[index].direction & 0xF; + // edges = peep->var_D0[index].direction & 0xF; // break; // } // } @@ -7164,7 +7171,7 @@ static void get_ride_queue_end(sint16 *x, sint16 *y, sint16 *z, sint16 dist){ if (!(mapElement->properties.path.edges & (1 << (direction ^ (1 << 1))))) break; - + if (RCT2_GLOBAL(0x00F3EFE8, rct_map_element*) == NULL) RCT2_GLOBAL(0x00F3EFE8, rct_map_element*) = mapElement; @@ -7209,7 +7216,7 @@ static int guest_path_finding(rct_peep* peep) if (peep->next_var_29 & 0x18) { return guest_surface_path_finding(peep); } - + x = peep->next_x; y = peep->next_y; z = peep->next_z; @@ -7266,14 +7273,14 @@ static int guest_path_finding(rct_peep* peep) } } - + if (!peep_has_food(peep) && (scenario_rand() & 0xFFFF) >= 2184) { uint8 adjustedEdges = edges; for (int chosenDirection = 0; chosenDirection < 4; chosenDirection++) { // If there is no path in that direction try another if (!(adjustedEdges & (1 << chosenDirection))) continue; - + uint8 rideIndex, pathSearchResult; pathSearchResult = sub_6949A4(peep->next_x, peep->next_y, peep->next_z, mapElement, chosenDirection, &rideIndex); switch (pathSearchResult) { @@ -7300,10 +7307,10 @@ static int guest_path_finding(rct_peep* peep) } } } - + if (peep->flags & PEEP_FLAGS_LEAVING_PARK) return guest_path_find_park_entrance(peep, mapElement, edges); - + if (peep->guest_heading_to_ride_id == 0xFF) return guest_path_find_aimless(peep, edges); @@ -7316,7 +7323,7 @@ static int guest_path_finding(rct_peep* peep) RCT2_GLOBAL(0x00F1AEE1, uint8) = rideIndex; RCT2_GLOBAL(0x00F1AEBC, uint32) = 4; - + uint16 closestDist = 0xFFFF; uint8 closestStationNum = 4; @@ -7386,7 +7393,7 @@ static int guest_path_finding(rct_peep* peep) } /** - * + * * rct2: 0x00693C9E */ static int sub_693C9E(rct_peep *peep) @@ -7439,7 +7446,7 @@ static int sub_693C9E(rct_peep *peep) sint16 base_z = max(0, (peep->z / 8) - 2); sint16 top_z = (peep->z / 8) + 1; - do{ + do{ if (base_z > mapElement->base_height) continue; if (top_z < mapElement->base_height) @@ -7481,7 +7488,7 @@ static int sub_693C9E(rct_peep *peep) if (mapElement == NULL) return peep_return_to_center_of_tile(peep); - sint16 water_height = mapElement->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK; + sint16 water_height = mapElement->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK; if (water_height) return peep_return_to_center_of_tile(peep); @@ -7501,7 +7508,7 @@ static int sub_693C9E(rct_peep *peep) } /** - * + * * rct2: 0x0069926C * Expend type was previously an offset saved in 0x00F1AEC0 */ @@ -7544,7 +7551,7 @@ static bool peep_has_ridden_ride_type(rct_peep *peep, int rideType) } /** - * + * * rct2: 0x0069545B */ static void peep_on_enter_ride(rct_peep *peep, int rideIndex) @@ -7685,7 +7692,7 @@ static bool peep_should_go_on_ride_again(rct_peep *peep, rct_ride *ride) if (peep->hunger < 30) return false; if (peep->thirst < 20) return false; if (peep->balloon_colour > 170) return false; - + uint8 r = (scenario_rand() & 0xFF); if (r <= 128) { if (peep->no_of_rides > 7) return false; @@ -7713,7 +7720,7 @@ static bool peep_really_liked_ride(rct_peep *peep, rct_ride *ride) } /** - * + * * rct2: 0x0069576E */ static void peep_on_exit_ride(rct_peep *peep, int rideIndex) @@ -7766,7 +7773,7 @@ static void peep_on_exit_ride(rct_peep *peep, int rideIndex) } /** - * + * * rct2: 0x00695444 */ static void peep_on_enter_or_exit_ride(rct_peep *peep, int rideIndex, int flags) @@ -7779,7 +7786,7 @@ static void peep_on_enter_or_exit_ride(rct_peep *peep, int rideIndex, int flags) } /** - * + * * rct2: 0x0069AF1E */ static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price) @@ -7788,7 +7795,7 @@ static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 pric } /** - * + * * rct2: 0x0069AEB7 */ static bool peep_should_use_cash_machine(rct_peep *peep, int rideIndex) @@ -7808,7 +7815,7 @@ static bool peep_should_use_cash_machine(rct_peep *peep, int rideIndex) } /** - * + * * rct2: 0x0069A98C */ static void sub_69A98C(rct_peep *peep) @@ -7820,7 +7827,7 @@ static void sub_69A98C(rct_peep *peep) } /** - * + * * rct2: 0x0068FD3A */ static void sub_68FD3A(rct_peep *peep) @@ -7829,7 +7836,7 @@ static void sub_68FD3A(rct_peep *peep) } /** - * + * * rct2: 0x00690B99 */ static bool sub_690B99(rct_peep *peep, int edge, uint8 *rideToView, uint8 *rideSeatToView) @@ -7846,7 +7853,7 @@ static bool sub_690B99(rct_peep *peep, int edge, uint8 *rideToView, uint8 *rideS } /** - * + * * rct2: 0x00694921 * Gets the height including the bit depending * on how far up the slope the peep is. @@ -7886,7 +7893,7 @@ static void peep_reset_ride_heading(rct_peep *peep) } /** - * + * * rct2: 0x006960AB */ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) @@ -8128,7 +8135,7 @@ loc_696658: } /** - * + * * rct2: 0x00695DD2 */ static void peep_pick_ride_to_go_on(rct_peep *peep) @@ -8240,7 +8247,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) } /** - * + * * rct2: 0x00695B70 */ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) @@ -8348,7 +8355,7 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) } /** - * + * * rct2: 0x006958D0 */ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFlags) @@ -8460,7 +8467,7 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl } /** - * + * * rct2: 0x0069C483 */ static void peep_give_real_name(rct_peep *peep) @@ -8469,7 +8476,7 @@ static void peep_give_real_name(rct_peep *peep) } /** - * + * * rct2: 0x00699115 */ void peep_update_name_sort(rct_peep *peep) @@ -8481,7 +8488,7 @@ void peep_update_name_sort(rct_peep *peep) } /** - * + * * rct2: 0x0069926C */ void peep_update_names(bool realNames) diff --git a/src/ride/track.c b/src/ride/track.c index 621609d82d..4430c7aa93 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -323,7 +323,7 @@ static uint8* track_list_cache_load(int totalFiles) if (track_list_size < 0) return 0; SDL_RWread(file, &fileCount, 4, 1); - + if (fileCount != totalFiles){ SDL_RWclose(file); log_verbose("Track file count is different."); @@ -387,8 +387,8 @@ void track_list_populate(ride_list_item item, uint8* track_list_cache){ if (isBelow == 1){ memmove( - &RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8)[track_entry_index * 128 + 128], - &RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8)[track_entry_index * 128], + &RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8)[track_entry_index * 128 + 128], + &RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8)[track_entry_index * 128], (cur_track_entry_index - track_entry_index) * 128); } @@ -416,7 +416,7 @@ void track_load_list(ride_list_item item) } int totalFiles; - + track_list_query_directory(&totalFiles); uint8* track_list_cache; @@ -431,7 +431,10 @@ void track_load_list(ride_list_item item) int enumFileHandle = platform_enumerate_files_begin(RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char)); if (enumFileHandle == INVALID_HANDLE) + { + free(new_file_pointer); return; + } while (platform_enumerate_files_next(enumFileHandle, &enumFileInfo)) { if (new_file_pointer > new_track_file + 0x3FF00)break; @@ -484,7 +487,7 @@ static void copy(void *dst, char **src, int length) *src += length; } -/* rct2: 0x00677530 +/* rct2: 0x00677530 * Returns 1 if it has booster track elements */ uint8 td4_track_has_boosters(rct_track_td6* track_design, uint8* track_elements){ @@ -515,7 +518,7 @@ rct_track_td6* load_track_design(const char *path) uint8* edi; RCT2_GLOBAL(0x009AAC54, uint8) = 1; - + fp = SDL_RWFromFile(path, "rb"); if (fp == NULL) return 0; @@ -566,7 +569,7 @@ rct_track_td6* load_track_design(const char *path) return NULL; } - // In td6 there are 32 sets of two byte vehicle colour specifiers + // In td6 there are 32 sets of two byte vehicle colour specifiers // In td4 there are 12 sets so the remaining 20 need to be read. if (version == 2) copy(&track_design->vehicle_colours[12], &src, 40); @@ -580,7 +583,7 @@ rct_track_td6* load_track_design(const char *path) uint8* track_elements = RCT2_ADDRESS(0x9D821B, uint8); // Read the actual track data. copy(track_elements, &src, 24572); - + uint8* final_track_element_location = track_elements + 24572; free(decoded); @@ -602,7 +605,7 @@ rct_track_td6* load_track_design(const char *path) track_element++; } memset(((uint8*)track_element) + 1, 255, final_track_element_location - (uint8*)track_element); - + } // Edit the colours to use the new versions @@ -687,7 +690,7 @@ void reset_track_list_cache(){ int backup_map(){ RCT2_GLOBAL(0xF440ED, uint8*) = malloc(0xED600); if (RCT2_GLOBAL(0xF440ED, uint32) == 0) return 0; - + RCT2_GLOBAL(0xF440F1, uint8*) = malloc(0x40000); if (RCT2_GLOBAL(0xF440F1, uint32) == 0){ free(RCT2_GLOBAL(0xF440ED, uint8*)); @@ -1055,8 +1058,8 @@ int track_place_scenery(rct_track_scenery* scenery_start, uint8 rideIndex, int o entry_type = 0xFF; entry_index = 0; - for (rct_path_type* path = g_pathTypeEntries[0]; - entry_index < object_entry_group_counts[OBJECT_TYPE_PATHS]; + for (rct_path_type* path = g_pathTypeEntries[0]; + entry_index < object_entry_group_counts[OBJECT_TYPE_PATHS]; path = g_pathTypeEntries[entry_index], entry_index++){ if (path == (rct_path_type*)-1) @@ -1135,7 +1138,7 @@ int track_place_scenery(rct_track_scenery* scenery_start, uint8 rideIndex, int o RCT2_GLOBAL(0x00F44129, sint16) = z; } } - + if (RCT2_GLOBAL(0x00F440D4, uint8) == 1 || RCT2_GLOBAL(0x00F440D4, uint8) == 2 || RCT2_GLOBAL(0x00F440D4, uint8) == 3 || @@ -1255,12 +1258,12 @@ int track_place_scenery(rct_track_scenery* scenery_start, uint8 rideIndex, int o RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 1811; cost = game_do_command( - mapCoord.x, - bl | (entry_index << 8), - mapCoord.y, - rotation | (scenery->primary_colour << 8), - GAME_COMMAND_PLACE_FENCE, - z, + mapCoord.x, + bl | (entry_index << 8), + mapCoord.y, + rotation | (scenery->primary_colour << 8), + GAME_COMMAND_PLACE_FENCE, + z, scenery->secondary_colour | ((scenery->flags & 0xFC) << 6) ); @@ -1411,7 +1414,7 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac RCT2_GLOBAL(0x00F440D4, uint8) == 4 || RCT2_GLOBAL(0x00F440D4, uint8) == 5){ - uint8 bl; + uint8 bl; money32 cost = 0; uint16 maze_entry; @@ -1888,8 +1891,8 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac } /** -* Places a virtual track. This can involve highlighting the surface tiles and showing the track layout. It is also used by -* the track preview window to place the whole track. +* Places a virtual track. This can involve highlighting the surface tiles and showing the track layout. It is also used by +* the track preview window to place the whole track. * Depending on the value of bl it modifies the function. * bl == 0, Draw outlines on the ground * bl == 1, @@ -1967,7 +1970,7 @@ int sub_6D01B3(uint8 bl, uint8 rideIndex, int x, int y, int z) return ebx; } -/* rct2: 0x006D2189 +/* rct2: 0x006D2189 * ebx = ride_id * cost = edi */ @@ -1975,7 +1978,7 @@ int sub_6D2189(int* cost, uint8* ride_id){ RCT2_GLOBAL(0xF44151, uint8) = 0; rct_track_td6* track_design = RCT2_ADDRESS(0x009D8178, rct_track_td6); uint8 entry_type, entry_index; - + if (!find_object_in_entry_group(&track_design->vehicle_object, &entry_type, &entry_index)) entry_index = 0xFF; @@ -2105,7 +2108,7 @@ void draw_track_preview(uint8** preview){ width = height; int zoom_level = 1; - + if (width > 1120) zoom_level = 2; @@ -2196,7 +2199,7 @@ void draw_track_preview(uint8** preview){ } /** - * + * * I don't think preview is a necessary output argument. It can be obtained easily using the track design structure. * rct2: 0x006D1DEC */ @@ -2258,7 +2261,7 @@ rct_track_design *track_get_info(int index, uint8** preview) } /** - * + * * rct2: 0x006D3664 */ int track_rename(const char *text) @@ -2301,13 +2304,13 @@ int track_rename(const char *text) track_load_list(item); reset_track_list_cache(); - + window_invalidate(w); return 1; } /** - * + * * rct2: 0x006D3761 */ int track_delete() @@ -2613,7 +2616,7 @@ int maze_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_ RCT2_GLOBAL(0x00F44058, uint8*) = track_elements; - // Previously you had to save start_x, y, z but + // Previously you had to save start_x, y, z but // no need since global vars not used sub_6D01B3(0, 0, 4096, 4096, 0); @@ -2895,7 +2898,7 @@ int ride_to_td6(uint8 rideIndex){ track_design->type = ride->type; rct_object_entry_extended* object = &object_entry_groups[OBJECT_TYPE_RIDE].entries[ride->subtype]; - // Note we are only copying rct_object_entry in size and + // Note we are only copying rct_object_entry in size and // not the extended as we don't need the chunk size. memcpy(&track_design->vehicle_object, object, sizeof(rct_object_entry)); @@ -3038,10 +3041,10 @@ int save_track_design(uint8 rideIndex){ pause_sounds(); int result = platform_open_common_file_dialog( - 0, - RCT2_ADDRESS(0x141ED68, char), - path, - "*.TD?", + 0, + RCT2_ADDRESS(0x141ED68, char), + path, + "*.TD?", RCT2_ADDRESS(0x141EE68, char)); unpause_sounds(); @@ -3224,12 +3227,12 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 988; int rideIndex = 0; { - int _eax = 0, - _ebx = GAME_COMMAND_FLAG_APPLY, - _ecx = 0, - _edx = track_design->type | (entry_index << 8), + int _eax = 0, + _ebx = GAME_COMMAND_FLAG_APPLY, + _ecx = 0, + _edx = track_design->type | (entry_index << 8), _esi = GAME_COMMAND_CREATE_RIDE, - _edi = 0, + _edi = 0, _ebp = 0; game_do_command_p(GAME_COMMAND_CREATE_RIDE, &_eax, &_ebx, &_ecx, &_edx, &_esi, &_edi, &_ebp); if (_ebx == MONEY32_UNDEFINED){ @@ -3262,7 +3265,7 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int cost = sub_6D01B3(bl, rideIndex, x, y, z); } - if (cost == MONEY32_UNDEFINED || + if (cost == MONEY32_UNDEFINED || !(flags & GAME_COMMAND_FLAG_APPLY)){ rct_string_id error_reason = RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id); game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); @@ -3337,7 +3340,7 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int } /** - * + * * rct2: 0x006D3026 */ void track_save_reset_scenery() @@ -3365,7 +3368,7 @@ static int map_element_get_total_element_count(rct_map_element *mapElement) int elementCount; rct_scenery_entry *sceneryEntry; rct_large_scenery_tile *tile; - + switch (map_element_get_type(mapElement)) { case MAP_ELEMENT_TYPE_PATH: case MAP_ELEMENT_TYPE_SCENERY: @@ -3439,7 +3442,7 @@ static bool track_save_can_add_map_element(rct_map_element *mapElement) } /** - * + * * rct2: 0x006D2F4C */ static void track_save_push_map_element(int x, int y, rct_map_element *mapElement) @@ -3453,7 +3456,7 @@ static void track_save_push_map_element(int x, int y, rct_map_element *mapElemen } /** - * + * * rct2: 0x006D2FA7 */ static void track_save_push_map_element_desc(rct_object_entry *entry, int x, int y, int z, uint8 flags, uint8 primaryColour, uint8 secondaryColour) @@ -3483,7 +3486,7 @@ static void track_save_add_scenery(int x, int y, rct_map_element *mapElement) uint8 primaryColour = mapElement->properties.scenery.colour_1 & 0x1F; uint8 secondaryColour = mapElement->properties.scenery.colour_2 & 0x1F; - + track_save_push_map_element(x, y, mapElement); track_save_push_map_element_desc(entry, x, y, mapElement->base_height, flags, primaryColour, secondaryColour); } @@ -3538,7 +3541,7 @@ static void track_save_add_wall(int x, int y, rct_map_element *mapElement) uint8 flags = 0; flags |= mapElement->type & 3; flags |= mapElement->properties.fence.item[0] << 2; - + uint8 secondaryColour = ((mapElement->flags & 0x60) >> 2) | (mapElement->properties.fence.item[1] >> 5); uint8 primaryColour = mapElement->properties.fence.item[1] & 0x1F; @@ -3556,13 +3559,13 @@ static void track_save_add_footpath(int x, int y, rct_map_element *mapElement) flags |= (mapElement->properties.path.type & 4) << 2; flags |= (mapElement->properties.path.type & 3) << 5; flags |= (mapElement->type & 1) << 7; - + track_save_push_map_element(x, y, mapElement); track_save_push_map_element_desc(entry, x, y, mapElement->base_height, flags, 0, 0); } /** - * + * * rct2: 0x006D2B3C */ static bool track_save_add_map_element(int interactionType, int x, int y, rct_map_element *mapElement) @@ -3590,7 +3593,7 @@ static bool track_save_add_map_element(int interactionType, int x, int y, rct_ma } /** - * + * * rct2: 0x006D2F78 */ static void track_save_pop_map_element(int x, int y, rct_map_element *mapElement) @@ -3621,7 +3624,7 @@ static void track_save_pop_map_element(int x, int y, rct_map_element *mapElement } /** - * + * * rct2: 0x006D2FDD */ static void track_save_pop_map_element_desc(rct_object_entry *entry, int x, int y, int z, uint8 flags, uint8 primaryColour, uint8 secondaryColour) @@ -3663,7 +3666,7 @@ static void track_save_remove_scenery(int x, int y, rct_map_element *mapElement) uint8 primaryColour = mapElement->properties.scenery.colour_1 & 0x1F; uint8 secondaryColour = mapElement->properties.scenery.colour_2 & 0x1F; - + track_save_pop_map_element(x, y, mapElement); track_save_pop_map_element_desc(entry, x, y, mapElement->base_height, flags, primaryColour, secondaryColour); } @@ -3718,7 +3721,7 @@ static void track_save_remove_wall(int x, int y, rct_map_element *mapElement) uint8 flags = 0; flags |= mapElement->type & 3; flags |= mapElement->properties.fence.item[0] << 2; - + uint8 secondaryColour = ((mapElement->flags & 0x60) >> 2) | (mapElement->properties.fence.item[1] >> 5); uint8 primaryColour = mapElement->properties.fence.item[1] & 0x1F; @@ -3736,13 +3739,13 @@ static void track_save_remove_footpath(int x, int y, rct_map_element *mapElement flags |= (mapElement->properties.path.type & 4) << 2; flags |= (mapElement->properties.path.type & 3) << 5; flags |= (mapElement->type & 1) << 7; - + track_save_pop_map_element(x, y, mapElement); track_save_pop_map_element_desc(entry, x, y, mapElement->base_height, flags, 0, 0); } /** - * + * * rct2: 0x006D2B3C */ static void track_save_remove_map_element(int interactionType, int x, int y, rct_map_element *mapElement) @@ -3764,7 +3767,7 @@ static void track_save_remove_map_element(int interactionType, int x, int y, rct } /** - * + * * rct2: 0x006D2B07 */ void track_save_toggle_map_element(int interactionType, int x, int y, rct_map_element *mapElement) @@ -3782,7 +3785,7 @@ void track_save_toggle_map_element(int interactionType, int x, int y, rct_map_el } /** - * + * * rct2: 0x006D303D */ void track_save_select_nearby_scenery(int rideIndex) @@ -4350,7 +4353,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in return price; } } - + /** * * rct2: 0x006C511D diff --git a/src/scenario.c b/src/scenario.c index d8260bae5f..9846f5ebef 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -110,7 +110,7 @@ int scenario_load_basic(const char *path, rct_s6_header *header, rct_s6_info *in } /** - * + * * rct2: 0x00676053 * scenario (ebx) */ @@ -210,7 +210,7 @@ int scenario_load(const char *path) } /** - * + * * rct2: 0x00678282 * scenario (ebx) */ @@ -385,7 +385,7 @@ void scenario_end() { rct_window* w; window_close_by_class(WC_DROPDOWN); - + for (w = g_window_list; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++){ if (!(w->flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT))) window_close(w); @@ -418,7 +418,7 @@ void scenario_success() int i; rct_scenario_basic* scenario; uint32 current_val = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_COMPANY_VALUE, uint32); - + RCT2_GLOBAL(RCT2_ADDRESS_COMPLETED_COMPANY_VALUE, uint32) = current_val; peep_applause(); @@ -452,7 +452,7 @@ void scenario_success_submit_name(const char *name) int i; rct_scenario_basic* scenario; uint32 scenarioWinCompanyValue; - + for (i = 0; i < gScenarioListCount; i++) { scenario = &gScenarioList[i]; @@ -466,7 +466,7 @@ void scenario_success_submit_name(const char *name) break; } } - + RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_SCENARIO_COMPLETE_NAME_INPUT; } @@ -761,7 +761,7 @@ int scenario_prepare_for_save() if ((int)stex != 0xFFFFFFFF) { format_string(buffer, stex->scenario_name, NULL); strncpy(s6Info->name, buffer, sizeof(s6Info->name)); - + memcpy(&s6Info->entry, &object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0], sizeof(rct_object_entry)); } @@ -834,9 +834,16 @@ int scenario_write_available_objects(FILE *file) // Initialise buffers buffer = malloc(bufferLength); + if (buffer == NULL) { + log_error("out of memory"); + return 0; + } dstBuffer = malloc(bufferLength + sizeof(sawyercoding_chunk_header)); - if (buffer == NULL || dstBuffer == NULL) - return 0; + if (dstBuffer == NULL) { + free(buffer); + log_error("out of memory"); + return 0; + } // Write entries rct_object_entry_extended *srcEntry = (rct_object_entry_extended*)0x00F3F03C; @@ -846,7 +853,7 @@ int scenario_write_available_objects(FILE *file) memset(dstEntry, 0xFF, sizeof(rct_object_entry)); else *dstEntry = *((rct_object_entry*)srcEntry); - + srcEntry++; dstEntry++; } diff --git a/src/title.c b/src/title.c index bd35c33840..dd1874f8dc 100644 --- a/src/title.c +++ b/src/title.c @@ -334,7 +334,7 @@ static void title_do_next_script_opcode() const uint8 *loadPtr; char *ch, filename[32], path[MAX_PATH]; char separator = platform_get_path_separator(); - + loadPtr = _currentScript - 1; // Get filename @@ -430,7 +430,7 @@ void DrawOpenRCT2(int x, int y) { char buffer[256]; rct_drawpixelinfo *dpi = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo); - + // Draw background gfx_fill_rect_inset(dpi, x, y, x + 128, y + 20, 0x80 | 12, 0x8); @@ -575,7 +575,7 @@ static uint8 *title_script_load() utf8 path[MAX_PATH]; utf8 filePath[] = "data/title/script.txt"; - + sprintf(path, "%s%c%s", gExePath, platform_get_path_separator(), filePath); log_verbose("loading title script, %s", path); file = SDL_RWFromFile(path, "r"); @@ -624,6 +624,7 @@ static uint8 *title_script_load() *scriptPtr++ = atoi(part1) & 0xFF; } else { log_error("unknown token, %s", token); + free(binaryScript); return NULL; } } From f081f8430ac2e0959c81e315447a7af3dc5cacc9 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 12 Sep 2015 13:59:21 +0100 Subject: [PATCH 0681/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/russian.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data/language/russian.txt b/data/language/russian.txt index 393a9746b7..bb536bc0c1 100644 --- a/data/language/russian.txt +++ b/data/language/russian.txt @@ -555,17 +555,17 @@ STR_0550 : STR_0551 : STR_0552 : STR_0553 : -STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station -STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another -STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience +STR_0554 :Разогнемая на станции вагонетка движется по длинно-уровневому пути, используюя линейный индукционный двигатель, после чего, устримляется прямиком вверх по вертикальному стержню, свободно падая обратно вниз, чтобы вернуться на станцию. +STR_0555 :Посетители катаются на лифте вверх, ли вниз по вертикальной башне, чтобы попасть с одного этажа на другой. +STR_0556 :Экстро-широкие вагонетки опускаются по совершенно вертикально-наклонённому пути, для максимального испытывания свободного падения. STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects -STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills -STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' +STR_0562 :Самоходные вагончики едут по мульти-уровневому пути, проезжая страшные декорации и специальные эффекты. +STR_0563 :Сидя в комфортных вагончиках, только с простыми поручнями, пассажиры наслаждаются большими мягкими выподами и извилистым путём, так же часто, как и "временем в воздухе" на возвышенностях. +STR_0564 :Бегущий по деревянному пути, этот атракцион быстр, жёсткий, шумный и дающие ощущение неуправляемой поездки с большм количеством "времени в воздухе". STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity STR_0566 :Individual roller coaster cars zip around a tight zig-zag layout of track with sharp corners and short sharp drops STR_0567 :Sitting in seats suspended either side of the track, riders are pitched head-over-heels while they plunge down steep drops and travel through various inversions From 72398151a7155ddf1e010c438f713db0889b5284 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 12 Sep 2015 18:17:25 +0100 Subject: [PATCH 0682/1173] implement ride_create_cable_lift --- projects/openrct2.vcxproj | 1 + src/common.h | 4 +- src/localisation/string_ids.h | 1 + src/network/http.cpp | 5 +- src/ride/ride.c | 95 ++++++++++++++++++++++++++++++++--- src/ride/ride.h | 6 +-- src/ride/track.c | 6 +-- src/ride/vehicle.c | 75 ++++++++++++++++++++++++++- src/ride/vehicle.h | 30 +++++++---- 9 files changed, 196 insertions(+), 27 deletions(-) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index cd66b434b3..491574e929 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -300,6 +300,7 @@ {D24D94F6-2A74-480C-B512-629C306CE92F} openrct2 openrct2 + 10.0.10240.0 diff --git a/src/common.h b/src/common.h index 4ea6488767..a965995ce0 100644 --- a/src/common.h +++ b/src/common.h @@ -29,7 +29,9 @@ #define SafeDelete(x) if ((x) != nullptr) { delete (x); (x) = nullptr; } #define SafeDeleteArray(x) if ((x) != nullptr) { delete[] (x); (x) = nullptr; } -#define interface struct +#ifndef interface + #define interface struct +#endif #define abstract = 0 #endif \ No newline at end of file diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index c725353b63..8840ff8ae0 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1662,6 +1662,7 @@ enum { STR_THIS_DESIGN_WILL_BE_BUILT_WITH_AN_ALTERNATIVE_VEHICLE_TYPE = 3136, STR_SELECT_NEARBY_SCENERY = 3137, STR_RESET_SELECTION = 3138, + STR_CABLE_LIFT_UNABLE_TO_WORK_IN_THIS_OPERATING_MODE = 3139, STR_MULTICIRCUIT_NOT_POSSIBLE_WITH_CABLE_LIFT_HILL = 3141, diff --git a/src/network/http.cpp b/src/network/http.cpp index a2ad158bec..306bde03ed 100644 --- a/src/network/http.cpp +++ b/src/network/http.cpp @@ -10,9 +10,12 @@ void http_dispose() { } #else #include -#include #include +// cURL includes windows.h, but we don't need all of it. +#define WIN32_LEAN_AND_MEAN +#include + typedef struct { char *ptr; int length; diff --git a/src/ride/ride.c b/src/ride/ride.c index dbe9271617..2eb5de507d 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4212,22 +4212,103 @@ void ride_set_start_finish_points(int rideIndex, rct_xy_element *startElement) } } +/** + * + * rct2: 0x0069ED9E + */ +static int sub_69ED9E() +{ + int miscSpriteCount = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_COUNT_MISC, uint16); + int unkCount = RCT2_GLOBAL(0x013573C8, uint16); + return max(0, miscSpriteCount + unkCount - 300); +} + /** * * rct2: 0x006DD84C */ -int sub_6DD84C(rct_ride *ride, int rideIndex, rct_xy_element *element, int isApplying) +int ride_create_vehicles(rct_ride *ride, int rideIndex, rct_xy_element *element, int isApplying) { return RCT2_CALLPROC_X(0x006DD84C, element->x, isApplying, element->y, rideIndex, (int)ride, (int)element->element, 0) & 0x100; } +static bool sub_6D31A6(rct_ride *ride) +{ + return !(RCT2_CALLPROC_X(0x006D31A6, 0, 0, 0, 0, 0, (int)ride, 0) & 0x100); +} + /** * * rct2: 0x006DF4D4 */ -int sub_6DF4D4(rct_ride *ride, rct_xy_element *element, int isApplying) +bool ride_create_cable_lift(int rideIndex, bool isApplying) { - return RCT2_CALLPROC_X(0x006DF4D4, element->x, isApplying, element->y, 0, (int)ride, (int)element->element, 0) & 0x100; + rct_ride *ride = GET_RIDE(rideIndex); + + if (ride->mode != RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED && + ride->mode != RIDE_MODE_CONTINUOUS_CIRCUIT + ) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CABLE_LIFT_UNABLE_TO_WORK_IN_THIS_OPERATING_MODE; + return false; + } + + if (ride->num_circuits > 1) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_MULTICIRCUIT_NOT_POSSIBLE_WITH_CABLE_LIFT_HILL; + return false; + } + + if (sub_69ED9E() <= 5) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_UNABLE_TO_CREATE_ENOUGH_VEHICLES; + return false; + } + + if (!sub_6D31A6(ride)) { + return false; + } + + if (!isApplying) { + return true; + } + + int x = ride->cable_lift_x; + int y = ride->cable_lift_y; + int z = ride->cable_lift_z; + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; + if (mapElement->base_height != z) continue; + break; + } while (!map_element_is_last_for_tile(mapElement++)); + int direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; + + rct_vehicle *head = NULL; + rct_vehicle *tail = NULL; + uint32 ebx = 0; + for (int i = 0; i < 5; i++) { + uint32 edx = ror32(0x15478, 10); + uint16 var_44 = edx & 0xFFFF; + edx = rol32(edx, 10) >> 1; + ebx -= edx; + uint32 var_24 = ebx; + ebx -= edx; + + rct_vehicle *current = cable_lift_segment_create(rideIndex, x, y, z, direction, var_44, var_24, i == 0); + current->next_vehicle_on_train = SPRITE_INDEX_NULL; + if (i == 0) { + head = current; + } else { + tail->next_vehicle_on_train = current->sprite_index; + tail->next_or_first_vehicle_on_train = current->sprite_index; + current->prev_vehicle_on_train = tail->sprite_index; + } + tail = current; + } + head->prev_vehicle_on_train = tail->sprite_index; + tail->next_or_first_vehicle_on_train = head->sprite_index; + + ride->lifecycle_flags |= RIDE_LIFECYCLE_CABLE_LIFT; + sub_6DEF56(head); + return true; } /** @@ -4440,7 +4521,7 @@ int ride_is_valid_for_test(int rideIndex, int goingToBeOpen, int isApplying) !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_13) && !(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) ) { - if (sub_6DD84C(ride, rideIndex, &trackElement, isApplying)) + if (ride_create_vehicles(ride, rideIndex, &trackElement, isApplying)) return 0; } @@ -4449,7 +4530,7 @@ int ride_is_valid_for_test(int rideIndex, int goingToBeOpen, int isApplying) (ride->lifecycle_flags & RIDE_LIFECYCLE_16) && !(ride->lifecycle_flags & RIDE_LIFECYCLE_CABLE_LIFT) ) { - if (sub_6DF4D4(ride, &trackElement, isApplying)) + if (!ride_create_cable_lift(rideIndex, isApplying)) return 0; } @@ -4563,7 +4644,7 @@ int ride_is_valid_for_open(int rideIndex, int goingToBeOpen, int isApplying) !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_13) && !(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) ) { - if (sub_6DD84C(ride, rideIndex, &trackElement, isApplying)) + if (ride_create_vehicles(ride, rideIndex, &trackElement, isApplying)) return 0; } @@ -4572,7 +4653,7 @@ int ride_is_valid_for_open(int rideIndex, int goingToBeOpen, int isApplying) (ride->lifecycle_flags & RIDE_LIFECYCLE_16) && !(ride->lifecycle_flags & RIDE_LIFECYCLE_CABLE_LIFT) ) { - if (sub_6DF4D4(ride, &trackElement, isApplying)) + if (!ride_create_cable_lift(rideIndex, isApplying)) return 0; } diff --git a/src/ride/ride.h b/src/ride/ride.h index a0135572f6..68c99f8543 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -349,9 +349,9 @@ typedef struct { uint16 total_air_time; // 0x1F4 uint8 pad_1F6; uint8 num_circuits; // 0x1F7 - sint16 var_1F8; - sint16 var_1FA; - uint8 var_1FC; + sint16 cable_lift_x; // 0x1F8 + sint16 cable_lift_y; // 0x1FA + uint8 cable_lift_z; // 0x1FC uint8 pad_1FD; uint16 cable_lift; // 0x1FE uint16 queue_length[4]; // 0x200 diff --git a/src/ride/track.c b/src/ride/track.c index 4430c7aa93..258b20e1f4 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -4223,9 +4223,9 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in if (trackBlock->index != 0) break; ride->lifecycle_flags |= RIDE_LIFECYCLE_16; - ride->var_1F8 = x; - ride->var_1FA = y; - ride->var_1FC = baseZ; + ride->cable_lift_x = x; + ride->cable_lift_y = y; + ride->cable_lift_z = baseZ; break; case 0xD8: ride->num_block_brakes++; diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index f3647fe600..6fcb060c28 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -23,11 +23,12 @@ #include "../audio/mixer.h" #include "../config.h" #include "../interface/viewport.h" +#include "../openrct2.h" #include "../world/sprite.h" #include "ride.h" #include "ride_data.h" +#include "track.h" #include "vehicle.h" -#include "../openrct2.h" static void vehicle_update(rct_vehicle *vehicle); @@ -639,4 +640,74 @@ rct_vehicle *vehicle_get_head(rct_vehicle *vehicle) int vehicle_is_used_in_pairs(rct_vehicle *vehicle) { return vehicle->num_seats & VEHICLE_SEAT_PAIR_FLAG; -} \ No newline at end of file +} + +/** + * + * rct2: 0x006DEF56 + */ +void sub_6DEF56(rct_vehicle *cableLift) +{ + RCT2_CALLPROC_X(0x006DEF56, 0, 0, 0, 0, (int)cableLift, 0, 0); +} + +rct_vehicle *cable_lift_segment_create(int rideIndex, int x, int y, int z, int direction, uint16 var_44, uint32 var_24, bool head) +{ + rct_ride *ride = GET_RIDE(rideIndex); + rct_vehicle *current = &(create_sprite(1)->vehicle); + current->sprite_identifier = SPRITE_IDENTIFIER_VEHICLE; + current->ride = rideIndex; + current->ride_subtype = 0xFF; + if (head) { + move_sprite_to_list((rct_sprite*)current, SPRITE_LINKEDLIST_OFFSET_VEHICLE); + ride->cable_lift = current->sprite_index; + } + current->var_01 = head ? 0 : 1; + current->var_44 = var_44; + current->var_24 = var_24; + current->sprite_width = 10; + current->sprite_height_negative = 10; + current->sprite_height_positive = 10; + current->var_46 = 100; + current->num_seats = 0; + current->speed = 20; + current->var_C3 = 80; + current->velocity = 0; + current->var_2C = 0; + current->var_4A = 0; + current->var_4C = 0; + current->var_4E = 0; + current->var_B5 = 0; + current->var_BA = 0; + current->var_B6 = 0; + current->var_B8 = 0; + current->sound1_id = 0xFF; + current->sound2_id = 0xFF; + current->var_C4 = 0; + current->var_C5 = 0; + current->var_C8 = 0; + current->var_CC = 0xFF; + current->var_1F = 0; + current->var_20 = 0; + for (int j = 0; j < 32; j++) { + current->peep[j] = SPRITE_INDEX_NULL; + } + current->var_CD = 0; + current->sprite_direction = direction << 3; + current->var_38 = x; + current->var_3A = y; + + z = z * 8; + current->var_3C = z; + z += RCT2_GLOBAL(0x0097D21A + (ride->type * 8), uint8); + + sprite_move(16, 16, z, (rct_sprite*)current); + current->var_36 = (TRACK_ELEM_CABLE_LIFT_HILL << 2) | (current->sprite_direction >> 3); + current->var_34 = 164; + current->var_48 = 2; + current->status = VEHICLE_STATUS_MOVING_TO_END_OF_STATION; + current->var_51 = 0; + current->num_peeps = 0; + current->next_free_seat = 0; + return current; +} diff --git a/src/ride/vehicle.h b/src/ride/vehicle.h index b2c95e4f7d..dc7327cb98 100644 --- a/src/ride/vehicle.h +++ b/src/ride/vehicle.h @@ -53,9 +53,11 @@ typedef struct { sint16 sprite_bottom; // 0x1C uint8 sprite_direction; // 0x1E uint8 var_1F; - uint8 pad_20[0x08]; + uint8 var_20; + uint8 pad_21[3]; + uint32 var_24; sint32 velocity; // 0x28 - uint8 pad_2C[0x04]; + uint32 var_2C; uint8 ride; // 0x30 uint8 vehicle_type; // 0x31 rct_vehicle_colour colours; // 0x32 @@ -69,31 +71,37 @@ typedef struct { uint16 var_3C; uint16 next_vehicle_on_train; // 0x3E uint16 prev_vehicle_on_train; // 0x40 - uint16 pad_42; + uint16 next_or_first_vehicle_on_train; // 0x42 uint16 var_44; uint16 var_46; uint16 var_48; - uint8 pad_4A; + uint8 var_4A; uint8 current_station; // 0x4B - uint8 pad_4C[0x4]; + uint16 var_4C; + uint16 var_4E; uint8 status; // 0x50 uint8 var_51; uint16 peep[32]; // 0x52 uint8 peep_tshirt_colours[32]; // 0x92 uint8 num_seats; // 0xB2 uint8 num_peeps; // 0xB3 - uint8 next_free_seat; // 0xB4 - uint8 pad_B5[0x06]; + uint8 next_free_seat; // 0xB4 + uint8 var_B5; + uint16 var_B6; + uint16 var_B8; + uint8 var_BA; uint8 sound1_id; // 0xBB uint8 sound1_volume; // 0xBC uint8 sound2_id; // 0xBD uint8 sound2_volume; // 0xBE sint8 var_BF; - uint8 pad_C0[0x02]; + uint8 pad_C0[2]; uint8 speed; // 0xC2 - uint8 pad_C3[2]; + uint8 var_C3; + uint8 var_C4; uint8 var_C5; - uint8 pad_C6[6]; + uint8 pad_C6[2]; + uint32 var_C8; uint8 var_CC; uint8 var_CD; union { @@ -151,6 +159,8 @@ void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG); void vehicle_set_map_toolbar(rct_vehicle *vehicle); int vehicle_is_used_in_pairs(rct_vehicle *vehicle); rct_vehicle *vehicle_get_head(rct_vehicle *vehicle); +void sub_6DEF56(rct_vehicle *cableLift); +rct_vehicle *cable_lift_segment_create(int rideIndex, int x, int y, int z, int direction, uint16 var_44, uint32 var_24, bool head); /** Helper macro until rides are stored in this module. */ #define GET_VEHICLE(sprite_index) &(g_sprite_list[sprite_index].vehicle) From 42691726fc3ca73eacab6417f0675c8ec9f94a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sat, 12 Sep 2015 23:43:02 +0200 Subject: [PATCH 0683/1173] workaround for mingw bug For some reason mingw or sdl has trouble providing proper HWND, which in turn prevents opening up a window for selecting file to save when trying to convert save game to scenario. Fixes #1486. --- src/platform/windows.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/platform/windows.c b/src/platform/windows.c index 7fad01329f..63aa03fb16 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -417,7 +417,7 @@ void platform_show_messagebox(char *message) } /** - * + * * rct2: 0x004080EA */ int platform_open_common_file_dialog(int type, utf8 *title, utf8 *filename, utf8 *filterPattern, utf8 *filterName) @@ -467,7 +467,7 @@ int platform_open_common_file_dialog(int type, utf8 *title, utf8 *filename, utf8 *((wchar_t*)((wchar_t*)0x01423800 + wcfilterNameLength + 1 + wcfilterPatternLength + 1)) = 0; openFileName.lpstrFilter = (wchar_t*)0x01423800; - // + // tmp = RCT2_GLOBAL(0x009E2C74, uint32); if (RCT2_GLOBAL(0x009E2BB8, uint32) == 2 && RCT2_GLOBAL(0x009E1AF8, uint32) == 1) RCT2_GLOBAL(0x009E2C74, uint32) = 1; @@ -482,7 +482,7 @@ int platform_open_common_file_dialog(int type, utf8 *title, utf8 *filename, utf8 result = GetOpenFileNameW(&openFileName); } - // + // RCT2_GLOBAL(0x009E2C74, uint32) = tmp; WideCharToMultiByte(CP_UTF8, 0, wcfilename, countof(wcfilename), filename, MAX_PATH, NULL, NULL); @@ -539,7 +539,7 @@ utf8 *platform_open_directory_browser(utf8 *title) } /** - * + * * rct2: 0x00407978 */ int windows_get_registry_install_info(rct2_install_info *installInfo, char *source, char *font, uint8 charset) @@ -553,7 +553,7 @@ int windows_get_registry_install_info(rct2_install_info *installInfo, char *sour strcat(subkeyInfogrames, source); strcpy(subkeyFishTechGroup, "Software\\Fish Technology Group\\"); strcat(subkeyFishTechGroup, source); - + memset(&lf, 0, sizeof(lf)); lf.lfCharSet = charset; lf.lfHeight = 12; @@ -561,22 +561,22 @@ int windows_get_registry_install_info(rct2_install_info *installInfo, char *sour strcpy(lf.lfFaceName, font); RCT2_GLOBAL(RCT2_ADDRESS_HFONT, HFONT) = CreateFontIndirectA(&lf); - + if (RegOpenKeyA(HKEY_LOCAL_MACHINE, subkeyInfogrames, &hKey) != ERROR_SUCCESS) return 0; if (RegOpenKeyA(HKEY_LOCAL_MACHINE, subkeyFishTechGroup, &hKey) != ERROR_SUCCESS) return 0; - + size = 260; RegQueryValueExA(hKey, "Title", 0, &type, installInfo->title, &size); size = 260; RegQueryValueExA(hKey, "Path", 0, &type, installInfo->path, &size); - + installInfo->var_20C = 235960; - + size = 4; RegQueryValueExA(hKey, "InstallLevel", 0, &type, (LPBYTE)&installInfo->installLevel, &size); for (int i = 0; i <= 15; i++) { @@ -602,7 +602,15 @@ HWND windows_get_window_handle() log_error("SDL_GetWindowWMInfo failed %s", SDL_GetError()); exit(-1); } - return wmInfo.info.win.window; + HWND handle = wmInfo.info.win.window; + #ifdef __MINGW32__ + assert(sizeof(HWND) == sizeof(uint32)); + HWND result = (((uint32)handle & 0xff000000) >> 8) | (((uint32)handle & 0xff0000) << 8) | (((uint32)handle & 0xff00) >> 8) | (((uint32)handle & 0xff) << 8); + log_warning("twisting bits of handle, a workaround for mingw/sdl bug"); + #else + HWND result = handle; + #endif // __MINGW32__ + return result; } /** From f988f69ae088476d50d768f59d95a1a19064b11c Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 13 Sep 2015 02:59:55 +0100 Subject: [PATCH 0684/1173] implement sub_6D31A6 --- src/core/Memory.hpp | 3 + src/core/StringBuilder.hpp | 3 + src/localisation/string_ids.h | 2 +- src/ride/ride.c | 110 +++++++++++++++++++++++++++++++--- src/ride/track.c | 38 ++++++++++++ src/ride/track.h | 1 + 6 files changed, 148 insertions(+), 9 deletions(-) diff --git a/src/core/Memory.hpp b/src/core/Memory.hpp index 2e4d77c99a..fe9ef9bbf4 100644 --- a/src/core/Memory.hpp +++ b/src/core/Memory.hpp @@ -42,11 +42,14 @@ namespace Memory { template T *Copy(T *dst, const T *src, size_t size) { + if (size == 0) return (T*)dst; return (T*)memcpy((void*)dst, (const void*)src, size); } template T *CopyArray(T *dst, const T *src, size_t count) { + count *= sizeof(T); + if (count == 0) return (T*)dst; return (T*)memcpy((void*)dst, (const void*)src, count * sizeof(T)); } diff --git a/src/core/StringBuilder.hpp b/src/core/StringBuilder.hpp index db83790573..19f69f3c1c 100644 --- a/src/core/StringBuilder.hpp +++ b/src/core/StringBuilder.hpp @@ -87,6 +87,7 @@ public: * Returns the current string buffer as a new fire-and-forget string. */ utf8 *GetString() const { + // If buffer is null, length should be 0 which will create a new one byte memory block containing a null terminator utf8 *result = Memory::AllocateArray(_length + 1); Memory::CopyArray(result, _buffer, _length); result[_length] = 0; @@ -98,6 +99,8 @@ public: * be deallocated when the StringBuilder is destructed. */ const utf8 *GetBuffer() const { + // buffer may be null, so return an immutable empty string + if (_buffer == NULL) return ""; return _buffer; } diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 8840ff8ae0..b4de98d40a 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1663,7 +1663,7 @@ enum { STR_SELECT_NEARBY_SCENERY = 3137, STR_RESET_SELECTION = 3138, STR_CABLE_LIFT_UNABLE_TO_WORK_IN_THIS_OPERATING_MODE = 3139, - + STR_CABLE_LIFT_HILL_MUST_START_IMMEDIATELY_AFTER_STATION = 3140, STR_MULTICIRCUIT_NOT_POSSIBLE_WITH_CABLE_LIFT_HILL = 3141, STR_SHOW_PEOPLE_ON_MAP_TIP = 3143, diff --git a/src/ride/ride.c b/src/ride/ride.c index 2eb5de507d..a2905aa025 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4181,8 +4181,8 @@ static void ride_set_block_points(rct_xy_element *startElement) case TRACK_ELEM_CABLE_LIFT_HILL: case TRACK_ELEM_25_DEG_UP_TO_FLAT: case TRACK_ELEM_60_DEG_UP_TO_FLAT: - case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT: - case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT: + case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT: + case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT: case 216: // block brakes currentElement.element->flags &= ~(1 << 5); break; @@ -4191,7 +4191,7 @@ static void ride_set_block_points(rct_xy_element *startElement) } /** - * + * * rct2: 0x006B4D26 */ void ride_set_start_finish_points(int rideIndex, rct_xy_element *startElement) @@ -4213,7 +4213,7 @@ void ride_set_start_finish_points(int rideIndex, rct_xy_element *startElement) } /** - * + * * rct2: 0x0069ED9E */ static int sub_69ED9E() @@ -4224,7 +4224,7 @@ static int sub_69ED9E() } /** - * + * * rct2: 0x006DD84C */ int ride_create_vehicles(rct_ride *ride, int rideIndex, rct_xy_element *element, int isApplying) @@ -4232,9 +4232,103 @@ int ride_create_vehicles(rct_ride *ride, int rideIndex, rct_xy_element *element, return RCT2_CALLPROC_X(0x006DD84C, element->x, isApplying, element->y, rideIndex, (int)ride, (int)element->element, 0) & 0x100; } -static bool sub_6D31A6(rct_ride *ride) +/** + * + * rct2: 0x006D31A6 + */ +static bool sub_6D31A6(rct_ride *ride, bool isApplying) { - return !(RCT2_CALLPROC_X(0x006D31A6, 0, 0, 0, 0, 0, (int)ride, 0) & 0x100); + return !(RCT2_CALLPROC_X(0x006D31A6, 0, isApplying ? 1 : 0, 0, 0, 0, (int)ride, 0) & 0x100); + + // TODO This implementation does not work because track_block_get_previous called from track_circuit_iterator_previous seems + // to be ending prematurely and not iterating the complete track. This can be reproduced by constructing a giga coaster + // with a lift hill (pre-designed one will do) and testing it. This means other methods that use + // track_block_get_previous could be faulty. It might a particuarly track block that causes it. + + uint16 xy; + int stationIndex; + for (stationIndex = 0; stationIndex < 4; stationIndex++) { + xy = ride->station_starts[stationIndex]; + if (xy != 0xFFFF) break; + if (stationIndex == 3) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CABLE_LIFT_HILL_MUST_START_IMMEDIATELY_AFTER_STATION; + return false; + } + } + + int x = (xy & 0xFF) * 32; + int y = (xy >> 8) * 32; + int z = ride->station_heights[stationIndex]; + + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (mapElement->type != MAP_ELEMENT_TYPE_TRACK) continue; + if (mapElement->base_height != z) continue; + + int trackType = mapElement->properties.track.type; + if (!(RCT2_ADDRESS(0x0099BA64, uint8)[trackType * 16] & 0x10)) { + continue; + } + + break; + } while (!map_element_is_last_for_tile(mapElement++)); + + enum { + STATE_FIND_CABLE_LIFT, + STATE_FIND_STATION, + STATE_REST_OF_TRACK + }; + int state = STATE_FIND_CABLE_LIFT; + + track_circuit_iterator it; + track_circuit_iterator_begin(&it, (rct_xy_element){ + .x = x, + .y = y, + .element = mapElement + }); + while (track_circuit_iterator_previous(&it)) { + mapElement = it.current.element; + int trackType = mapElement->properties.track.type; + + uint16 flags = 16; + switch (state) { + case STATE_FIND_CABLE_LIFT: + // Search for a cable lift hill track element + if (trackType == TRACK_ELEM_CABLE_LIFT_HILL) { + flags = 8; + state = STATE_FIND_STATION; + } + break; + case STATE_FIND_STATION: + // Search for the start of the hill + switch (trackType) { + case TRACK_ELEM_FLAT: + case TRACK_ELEM_25_DEG_UP: + case TRACK_ELEM_60_DEG_UP: + case TRACK_ELEM_FLAT_TO_25_DEG_UP: + case TRACK_ELEM_25_DEG_UP_TO_FLAT: + case TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP: + case TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP: + case TRACK_ELEM_FLAT_TO_60_DEG_UP_LONG_BASE: + flags = 8; + break; + case TRACK_ELEM_END_STATION: + state = STATE_REST_OF_TRACK; + break; + default: + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CABLE_LIFT_HILL_MUST_START_IMMEDIATELY_AFTER_STATION; + return false; + } + break; + } + if (isApplying) { + z = mapElement->base_height * 8; + int direction = mapElement->type & 3; + trackType = mapElement->properties.track.type; + sub_6C683D(&x, &y, &z, direction, trackType, 0, &mapElement, flags); + } + } + return true; } /** @@ -4262,7 +4356,7 @@ bool ride_create_cable_lift(int rideIndex, bool isApplying) return false; } - if (!sub_6D31A6(ride)) { + if (!sub_6D31A6(ride, isApplying)) { return false; } diff --git a/src/ride/track.c b/src/ride/track.c index 258b20e1f4..615e8b0a33 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -4709,6 +4709,44 @@ void track_circuit_iterator_begin(track_circuit_iterator *it, rct_xy_element fir it->looped = false; } +bool track_circuit_iterator_previous(track_circuit_iterator *it) +{ + track_begin_end trackBeginEnd; + + if (it->first == NULL) { + if (!track_block_get_previous(it->last.x, it->last.y, it->last.element, &trackBeginEnd)) + return false; + + it->current.x = trackBeginEnd.begin_x; + it->current.y = trackBeginEnd.begin_y; + it->current.element = trackBeginEnd.begin_element; + it->currentZ = trackBeginEnd.begin_z; + it->currentDirection = trackBeginEnd.begin_direction; + + it->first = it->current.element; + return true; + } else { + if (!it->firstIteration && it->first == it->current.element) { + it->looped = true; + return false; + } + + it->firstIteration = false; + it->last = it->current; + + if (track_block_get_previous(it->last.x, it->last.y, it->last.element, &trackBeginEnd)) { + it->current.x = trackBeginEnd.begin_x; + it->current.y = trackBeginEnd.begin_y; + it->current.element = trackBeginEnd.begin_element; + it->currentZ = trackBeginEnd.begin_z; + it->currentDirection = trackBeginEnd.begin_direction; + return true; + } else { + return false; + } + } +} + bool track_circuit_iterator_next(track_circuit_iterator *it) { if (it->first == NULL) { diff --git a/src/ride/track.h b/src/ride/track.h index 219fd974d5..ffe2c2e59e 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -532,6 +532,7 @@ void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, void game_command_set_brakes_speed(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void track_circuit_iterator_begin(track_circuit_iterator *it, rct_xy_element first); +bool track_circuit_iterator_previous(track_circuit_iterator *it); bool track_circuit_iterator_next(track_circuit_iterator *it); void track_get_back(rct_xy_element *input, rct_xy_element *output); From 597c9e19de91ea5a071a4398017ff011a2a9a03e Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 13 Sep 2015 04:00:15 +0100 Subject: [PATCH 0685/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/finnish.txt | 154 +++++++++++++++++++------------------- 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/data/language/finnish.txt b/data/language/finnish.txt index 5103dd37d4..2ebde6de53 100644 --- a/data/language/finnish.txt +++ b/data/language/finnish.txt @@ -75,7 +75,7 @@ STR_0070 :Jättirata STR_0071 :Pyörivä tiputus STR_0072 :Lentävät lautaset STR_0073 :Kiero talo -STR_0074 :yksiraiteinen rautatiekierto +STR_0074 :Yksiraiteinen rautatiekierto STR_0075 :Tiivis käänteinen rata STR_0076 :Vesirata STR_0077 :Ilmakäyttöinen pystysuora rata @@ -858,7 +858,7 @@ STR_0851 :{WINDOW_COLOUR_2}Suunnitellut ja ohjelmoinut Chris Sawyer STR_0852 :{WINDOW_COLOUR_2}Grafiikka Simon Foster STR_0853 :{WINDOW_COLOUR_2}Äänet ja musiikki Allister Brimble STR_0854 :{WINDOW_COLOUR_2}Lisä-äänet nauhoittanut David Ellis -STR_0855 :{WINDOW_COLOUR_2}Edustaja Jacqui Lyons, Marjacq Ltd. +STR_0855 :{WINDOW_COLOUR_2}Edustaja Jacqui Lyons at Marjacq Ltd. STR_0856 :{WINDOW_COLOUR_2}Kiitoksia: STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth, ja John Wardley STR_0858 :{WINDOW_COLOUR_2} @@ -897,7 +897,7 @@ STR_0890 :Kuva{COMMA16}.BMP STR_0891 :Kuvankaappaus STR_0892 :Kuvankaappaus tallennettu levylle nimellä '{STRINGID}' STR_0893 :Kuvankaappaus epäonnistui ! -STR_0894 :Maiseman data-alue täynnä! +STR_0894 :Maisematietoalue on täynnä ! STR_0895 :Ei voi rakentaa osittain maan ylle ja alle STR_0896 :{POP16}{POP16}{STRINGID} Rakenne STR_0897 :Suunta @@ -934,7 +934,7 @@ STR_0927 :Tämän rakentaminen tähän ei onnistu... STR_0928 :{SMALLFONT}{BLACK}Ketjumäki, vaunujen vetämistä varten mäissä. STR_0929 :'S' mutka (vasen) STR_0930 :'S' mutka (oikea) -STR_0931 :Pystysuora kierukka(vasen) +STR_0931 :Pystysuora kierukka (vasen) STR_0932 :Pystysuora kierukka (oikea) STR_0933 :Nosta tai laske maata ensin STR_0934 :Laitteen sisäänkäynti edessä @@ -1004,14 +1004,14 @@ STR_0997 :{SMALLFONT}{BLACK}Näe valinta STR_0998 :Ei lisää asemia sallittu tälle laitteelle STR_0999 :Vaatii asematasanteen STR_1000 :Rata ei tee täydellistä kierrosta -STR_1001 :Track unsuitable for type of train Rata ei sovi kyseiselle junalajille. +STR_1001 :Rata ei sovi kyseiselle junalajille STR_1002 :Avaaminen ei onnistu laitteessa {POP16}{POP16}{POP16}{STRINGID}... STR_1003 :Testiajo ei onnistu laitteessa {POP16}{POP16}{POP16}{STRINGID}... STR_1004 :Sulkeminen ei onnistu laitteessa {POP16}{POP16}{POP16}{STRINGID}... STR_1005 :Rakentaminen ei onnistu laitteessa {POP16}{POP16}{POP16}{STRINGID}... STR_1006 :Täytyy ensin sulkea STR_1007 :Kykenemätön luomaan tarpeeksi kulkuneuvoja -STR_1008 :{SMALLFONT}{BLACK}Avaa, sulje, tai testaa laitetta/kohdetta +STR_1008 :{SMALLFONT}{BLACK}Avaa, sulje tai testaa laitetta/kohdetta STR_1009 :{SMALLFONT}{BLACK}Avaa tai sulje kaikki laitteet/kohteet STR_1010 :{SMALLFONT}{BLACK}Avaa tai sulje puisto STR_1011 :Sulje kaikki @@ -1070,7 +1070,7 @@ STR_1063 :Käänteinen-kallistus laukaistu sukkula toimintatila STR_1064 :Voimalaukaisu (aseman ohimennen) STR_1065 :Sukkulatoimintatila STR_1066 :Veneajelu toimintatila -STR_1067 :ylöspäin laukaisu +STR_1067 :Ylöspäin laukaisu STR_1068 :Pyörivä hissi toimintatila STR_1069 :Asemalta asemalle toimintatila STR_1070 :Yksi kyyti per sisäänpääsy @@ -1122,7 +1122,7 @@ STR_1115 :Käynnissä STR_1116 :Käynnissä STR_1117 :Sirkusesitys menossa STR_1118 :Käynnissä -STR_1119 :Odotettaa kaapelihissiä +STR_1119 :Odotetaan kaapelihissiä STR_1120 :Nopeus {VELOCITY} STR_1121 :Pysäytetään STR_1122 :Odotetaan matkustajia @@ -1163,8 +1163,8 @@ STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} STR_1158 :Tämän poistaminen ei onnistu... STR_1159 :{SMALLFONT}{BLACK}Aseta maisemaa, puutarhoja, ja muita tilpehöörejä. -STR_1160 :{SMALLFONT}{BLACK}Luo/säädä järviä ja vettä. -STR_1161 :Tätä ei voi asettaa sitä tähän... +STR_1160 :{SMALLFONT}{BLACK}Luo/säädä järviä ja vettä +STR_1161 :Tätä ei voi asettaa tähän... STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} STR_1163 :{STRINGID}{NEWLINE}(Oikea klikkaus muokkaa) STR_1164 :{STRINGID}{NEWLINE}(Oikea klikkaus poistaa) @@ -1343,7 +1343,7 @@ STR_1336 :{STRINGID} - Asema {POP16}{COMMA16} Sisäänkäynti STR_1337 :{STRINGID} - Uloskäynti{POP16}{POP16} STR_1338 :{STRINGID} - Asema {POP16}{COMMA16} Uloskäynti STR_1339 :{BLACK}Testituloksia ei ole vielä saatavilla... -STR_1340 :{WINDOW_COLOUR_2}Isoin nopeus: {BLACK}{VELOCITY} +STR_1340 :{WINDOW_COLOUR_2}Suurin nopeus: {BLACK}{VELOCITY} STR_1341 :{WINDOW_COLOUR_2}Ajelun kesto: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} STR_1342 :{DURATION} STR_1343 :{DURATION} / @@ -1351,17 +1351,17 @@ STR_1344 :{WINDOW_COLOUR_2}Radan pituus: {BLACK}{STRINGID}{STRINGID}{STRINGID STR_1345 :{LENGTH} STR_1346 :{LENGTH} / STR_1347 :{WINDOW_COLOUR_2}Keskinopeus: {BLACK}{VELOCITY} -STR_1348 :{WINDOW_COLOUR_2}Isoin positiivinen vertikaalinen G-voima: {BLACK}{COMMA2DP32}g -STR_1349 :{WINDOW_COLOUR_2}Isoin positiivinen vertikaalinen G-voima: {OUTLINE}{RED}{COMMA2DP32}g -STR_1350 :{WINDOW_COLOUR_2}Isoin negatiivinen vertikaalinen G-voima: {BLACK}{COMMA2DP32}g -STR_1351 :{WINDOW_COLOUR_2}Isoin negatiivinen vertikaalinen G-voima: {OUTLINE}{RED}{COMMA2DP32}g -STR_1352 :{WINDOW_COLOUR_2}Isoin sivuttainen G-voima: {BLACK}{COMMA2DP32}g -STR_1353 :{WINDOW_COLOUR_2}Isoin sivuttainen G-voima: {OUTLINE}{RED}{COMMA2DP32}g +STR_1348 :{WINDOW_COLOUR_2}Suurin positiivinen vertikaalinen G-voima: {BLACK}{COMMA2DP32}g +STR_1349 :{WINDOW_COLOUR_2}Suurin positiivinen vertikaalinen G-voima: {OUTLINE}{RED}{COMMA2DP32}g +STR_1350 :{WINDOW_COLOUR_2}Suurin negatiivinen vertikaalinen G-voima: {BLACK}{COMMA2DP32}g +STR_1351 :{WINDOW_COLOUR_2}Suurin negatiivinen vertikaalinen G-voima: {OUTLINE}{RED}{COMMA2DP32}g +STR_1352 :{WINDOW_COLOUR_2}Suurin sivuttainen G-voima: {BLACK}{COMMA2DP32}g +STR_1353 :{WINDOW_COLOUR_2}Suurin sivuttainen G-voima: {OUTLINE}{RED}{COMMA2DP32}g STR_1354 :{WINDOW_COLOUR_2}Korkein pudotuskorkeus: {BLACK}{LENGTH} STR_1355 :{WINDOW_COLOUR_2}Pudotuksia: {BLACK}{COMMA16} STR_1356 :{WINDOW_COLOUR_2}Käänteitä: {BLACK}{COMMA16} STR_1357 :{WINDOW_COLOUR_2}Reikää: {BLACK}{COMMA16} -STR_1358 :{WINDOW_COLOUR_2}'ilma-aika' yhteensä: {BLACK}{COMMA2DP32}secs +STR_1358 :{WINDOW_COLOUR_2}ilma-aika' yhteensä: {BLACK}{COMMA2DP32}secs STR_1359 :{WINDOW_COLOUR_2}Jonotusaika: {BLACK}{COMMA16} minuutti STR_1360 :{WINDOW_COLOUR_2}Jonotusaika: {BLACK}{COMMA16} minuuttia STR_1361 :Nopeuden muuttaminen ei onnistu... @@ -1380,8 +1380,8 @@ STR_1373 :Iso puolikas silmukka (vasen) STR_1374 :Iso puolikas silmukka (oikea) STR_1375 :Ylempi siirto STR_1376 :Alempi siirto -STR_1377 :Sydämmen viiva vierähdys (vasen) -STR_1378 :Sydämmen viiva vierähdys (oikea) +STR_1377 :Sydämen viiva vierähdys (vasen) +STR_1378 :Sydämen viiva vierähdys (oikea) STR_1379 :Käännin (vasen) STR_1380 :Käännin (oikea) STR_1381 :Kaareva nostomäki (vasen) @@ -1397,11 +1397,11 @@ STR_1390 :{CURRENCY2DP} STR_1391 :{RED}{CURRENCY2DP} STR_1392 :{SMALLFONT}{BLACK}Näkymä laitteesta/kohteesta STR_1393 :{SMALLFONT}{BLACK}Kulkuneuvon yksitoiskohdat ja asetukset -STR_1394 :{SMALLFONT}{BLACK}Toiminta asetukset -STR_1395 :{SMALLFONT}{BLACK}Huolto asetukset +STR_1394 :{SMALLFONT}{BLACK}Toiminta-asetukset +STR_1395 :{SMALLFONT}{BLACK}Huoltoasetukset STR_1396 :{SMALLFONT}{BLACK}Värityylin asetukset STR_1397 :{SMALLFONT}{BLACK}Ääni- ja musiikkiasetukset -STR_1398 :{SMALLFONT}{BLACK}Mitat ja testitiedot +STR_1398 :{SMALLFONT}{BLACK}Mitat- ja testitiedot STR_1399 :{SMALLFONT}{BLACK}Kaaviokuvat STR_1400 :Sisäänkäynti STR_1401 :Uloskäynti @@ -1479,9 +1479,9 @@ STR_1471 :{WINDOW_COLOUR_2}Nopeus: STR_1472 :{SMALLFONT}{BLACK}Tämän laitteen nopeus STR_1473 :{WINDOW_COLOUR_2}Jännityksen arvosana: {BLACK}{COMMA2DP32} ({STRINGID}) STR_1474 :{WINDOW_COLOUR_2}Jännityksen arvosana: {BLACK}Ei viellä saatavilla -STR_1475 :{WINDOW_COLOUR_2}Intensiteetti arvosana: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1476 :{WINDOW_COLOUR_2}Intensiteetti arvosana: {BLACK}Ei viellä saatavilla -STR_1477 :{WINDOW_COLOUR_2}Intensiteetti arvosana: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) +STR_1475 :{WINDOW_COLOUR_2}Intensiteettiarvosana: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1476 :{WINDOW_COLOUR_2}Intensiteettiarvosana: {BLACK}Ei viellä saatavilla +STR_1477 :{WINDOW_COLOUR_2}Intensiteettiarvosana: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) STR_1478 :{WINDOW_COLOUR_2}Pahoinvoinnin arvosana: {BLACK}{COMMA2DP32} ({STRINGID}) STR_1479 :{WINDOW_COLOUR_2}Pahoinvoinnin arvosana: {BLACK}Ei viellä saatavilla STR_1480 :{SMALLFONT}{OPENQUOTES}Minulla ei ole varaa mennä {STRINGID}{ENDQUOTES} @@ -1492,7 +1492,7 @@ STR_1484 :{SMALLFONT}{OPENQUOTES}Tahdon mennä johonkin jännittävämpään STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} näyttää liian hurjalta minulle{ENDQUOTES} STR_1486 :{SMALLFONT}{OPENQUOTES}En ole syönyt/juonut {STRINGID} loppuun vielä{ENDQUOTES} STR_1487 :{SMALLFONT}{OPENQUOTES}Pelkästään {STRINGID} katsominen saa minut tuntemaan oloni kamalaksi{ENDQUOTES} -STR_1488 :{SMALLFONT}{OPENQUOTES}En aijo maksaa noin paljon päästäkseni {STRINGID}{ENDQUOTES} +STR_1488 :{SMALLFONT}{OPENQUOTES}En aio maksaa noin paljon päästäkseni {STRINGID}{ENDQUOTES} STR_1489 :{SMALLFONT}{OPENQUOTES}Haluan kotiin{ENDQUOTES} STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1491 :{SMALLFONT}{OPENQUOTES}Minulla on jo {STRINGID}{ENDQUOTES} @@ -1508,7 +1508,7 @@ STR_1500 :{SMALLFONT}{OPENQUOTES}Minulla on nälkä{ENDQUOTES} STR_1501 :{SMALLFONT}{OPENQUOTES}Minulla on jano{ENDQUOTES} STR_1502 :{SMALLFONT}{OPENQUOTES}Minun tarvitsee käydä vessassa{ENDQUOTES} STR_1503 :{SMALLFONT}{OPENQUOTES}En löydä {STRINGID}{ENDQUOTES} -STR_1504 :{SMALLFONT}{OPENQUOTES}En aijo maksaa noin paljon käyttääkseni {STRINGID}{ENDQUOTES} +STR_1504 :{SMALLFONT}{OPENQUOTES}En aio maksaa noin paljon käyttääkseni {STRINGID}{ENDQUOTES} STR_1505 :{SMALLFONT}{OPENQUOTES}Täällä sataa, en halua mennä kohteeseen {STRINGID}{ENDQUOTES} STR_1506 :{SMALLFONT}{OPENQUOTES}Täällä on todella paljon roskaa{ENDQUOTES} STR_1507 :{SMALLFONT}{OPENQUOTES}En löydä puiston uloskäyntiä{ENDQUOTES} @@ -1541,8 +1541,8 @@ STR_1533 :{SMALLFONT}{OPENQUOTES}Tämä popcorn kojusta {STRINGID} on todella STR_1534 :{SMALLFONT}{OPENQUOTES}Tämä nakkisämpylä kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1535 :{SMALLFONT}{OPENQUOTES}Tämä lonkero kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1536 :{SMALLFONT}{OPENQUOTES}Tämä hattu kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} -STR_1537 :{SMALLFONT}{OPENQUOTES}Tämä toffee omena kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} -STR_1538 :{SMALLFONT}{OPENQUOTES}Tämä T-paita kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}Tämä toffeeomena kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1538 :{SMALLFONT}{OPENQUOTES}Tämä t-paita kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1539 :{SMALLFONT}{OPENQUOTES}Tämä donitsi kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1540 :{SMALLFONT}{OPENQUOTES}Tämä kahvi kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1541 : @@ -1556,32 +1556,32 @@ STR_1548 : STR_1549 : STR_1550 :{SMALLFONT}{OPENQUOTES}Vau!{ENDQUOTES} STR_1551 :{SMALLFONT}{OPENQUOTES}Minulla on outo fiilis että joku katselee minua{ENDQUOTES} -STR_1552 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa ilmapallosta kojussa {STRINGID}{ENDQUOTES} -STR_1553 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa pehmolelusta kojussa {STRINGID}{ENDQUOTES} -STR_1554 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa puiston kartasta kojussa {STRINGID}{ENDQUOTES} -STR_1555 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa kuva kojussa {STRINGID}{ENDQUOTES} -STR_1556 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa sateenvarjosta kojussa {STRINGID}{ENDQUOTES} -STR_1557 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa juomasta kojussa {STRINGID}{ENDQUOTES} -STR_1558 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa hampurilaisesta kojussa {STRINGID}{ENDQUOTES} -STR_1559 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa ranskalaisista kojussa {STRINGID}{ENDQUOTES} -STR_1560 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa jäätelöstä kojussa {STRINGID}{ENDQUOTES} -STR_1561 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa hattarasta kojussa {STRINGID}{ENDQUOTES} +STR_1552 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon ilmapallosta kojussa {STRINGID}{ENDQUOTES} +STR_1553 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon pehmolelusta kojussa {STRINGID}{ENDQUOTES} +STR_1554 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon puiston kartasta kojussa {STRINGID}{ENDQUOTES} +STR_1555 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon kuvasta kojussa {STRINGID}{ENDQUOTES} +STR_1556 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon sateenvarjosta kojussa {STRINGID}{ENDQUOTES} +STR_1557 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon juomasta kojussa {STRINGID}{ENDQUOTES} +STR_1558 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon hampurilaisesta kojussa {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon ranskalaisista kojussa {STRINGID}{ENDQUOTES} +STR_1560 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon jäätelöstä kojussa {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon hattarasta kojussa {STRINGID}{ENDQUOTES} STR_1562 : STR_1563 : STR_1564 : -STR_1565 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa pitsasta kojussa {STRINGID}{ENDQUOTES} +STR_1565 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon hattarasta kojussa {STRINGID}{ENDQUOTES} STR_1566 : -STR_1567 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa popcornista kojussa {STRINGID}{ENDQUOTES} -STR_1568 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa nakkisämpylästä kojussa {STRINGID}{ENDQUOTES} -STR_1569 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa lonkerosta kojussa {STRINGID}{ENDQUOTES} -STR_1570 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa hatusta kojussa {STRINGID}{ENDQUOTES} -STR_1571 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa toffee omenasta kojussa {STRINGID}{ENDQUOTES} -STR_1572 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa T-paidasta kojussa {STRINGID}{ENDQUOTES} -STR_1573 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa donitsista kojussa {STRINGID}{ENDQUOTES} -STR_1574 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa kahvista kojussa {STRINGID}{ENDQUOTES} +STR_1567 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon popcornista kojussa {STRINGID}{ENDQUOTES} +STR_1568 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon nakkisämpylästä kojussa {STRINGID}{ENDQUOTES} +STR_1569 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon lonkerosta kojussa {STRINGID}{ENDQUOTES} +STR_1570 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon hatusta kojussa {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon toffeeomenasta kojussa {STRINGID}{ENDQUOTES} +STR_1572 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon t-paidasta kojussa {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon donitsista kojussa {STRINGID}{ENDQUOTES} +STR_1574 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon kahvista kojussa {STRINGID}{ENDQUOTES} STR_1575 : -STR_1576 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa friteeratusta kanasta kojussa {STRINGID}{ENDQUOTES} -STR_1577 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa limonaatista kojussa {STRINGID}{ENDQUOTES} +STR_1576 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon friteeratusta kanasta kojussa {STRINGID}{ENDQUOTES} +STR_1577 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon limonaatista kojussa {STRINGID}{ENDQUOTES} STR_1578 : STR_1579 : STR_1580 : @@ -1595,20 +1595,20 @@ STR_1587 :{SMALLFONT}{OPENQUOTES}Tämä viipurinrinkeli kojusta {STRINGID} on STR_1588 :{SMALLFONT}{OPENQUOTES}Tämä kuuma kaakao kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1589 :{SMALLFONT}{OPENQUOTES}Tämä jäätee kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1590 :{SMALLFONT}{OPENQUOTES}Tämä tippaleipä kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} -STR_1591 :{SMALLFONT}{OPENQUOTES}Nämä aurinkolasit kojusta {STRINGID} are really good value{ENDQUOTES} -STR_1592 :{SMALLFONT}{OPENQUOTES}Nämä häränlihanuudelit kojusta {STRINGID} are really good value{ENDQUOTES} -STR_1593 :{SMALLFONT}{OPENQUOTES}Nämä paistetut riisinuudelit kojusta {STRINGID} are really good value{ENDQUOTES} -STR_1594 :{SMALLFONT}{OPENQUOTES}Tämä wonton keitto kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1591 :{SMALLFONT}{OPENQUOTES}TNämä aurinkolasit kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1592 :{SMALLFONT}{OPENQUOTES}Nämä häränlihanuudelit kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1593 :{SMALLFONT}{OPENQUOTES}Nämä paistetut riisinuudelit kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1594 :{SMALLFONT}{OPENQUOTES}Tämä wontonkeitto kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1595 :{SMALLFONT}{OPENQUOTES}Tämä lihapullakeitto kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1596 :{SMALLFONT}{OPENQUOTES}Tämä hedelmämehu kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1597 :{SMALLFONT}{OPENQUOTES}Tämä soijamaito kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1598 :{SMALLFONT}{OPENQUOTES}Tämä sujongkwa kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} -STR_1599 :{SMALLFONT}{OPENQUOTES}Tämä subi kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} +STR_1599 :{SMALLFONT}{OPENQUOTES}Tämä pantonki kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1600 :{SMALLFONT}{OPENQUOTES}Tämä keksi kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1601 : STR_1602 : STR_1603 : -STR_1604 :{SMALLFONT}{OPENQUOTES}Tämä grillattu makkara kojusta {STRINGID} are really good value{ENDQUOTES} +STR_1604 :{SMALLFONT}{OPENQUOTES}Tämä grillattu makkara kojusta {STRINGID} on todella hyvän arvoinen{ENDQUOTES} STR_1605 : STR_1606 : STR_1607 : @@ -1620,27 +1620,27 @@ STR_1612 : STR_1613 : STR_1614 : STR_1615 : -STR_1616 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa kuvasta kojussa {STRINGID}{ENDQUOTES} -STR_1617 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa kuvasta kojussa {STRINGID}{ENDQUOTES} -STR_1618 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa kuvasta kojussa {STRINGID}{ENDQUOTES} -STR_1619 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa viipurinrinkelistä kojussa {STRINGID}{ENDQUOTES} -STR_1620 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa kaakaosta kojussa {STRINGID}{ENDQUOTES} -STR_1621 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa jääteestä kojussa {STRINGID}{ENDQUOTES} -STR_1622 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa tippaleivästä kojussa {STRINGID}{ENDQUOTES} -STR_1623 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa aurinkolaseista kojussa {STRINGID}{ENDQUOTES} -STR_1624 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa härkänuudeleista kojussa {STRINGID}{ENDQUOTES} -STR_1625 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa paistetusta riisinuudeleista kojussa {STRINGID}{ENDQUOTES} -STR_1626 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa wonton keitosta kojussa {STRINGID}{ENDQUOTES} -STR_1627 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa lihapullakeitosta kojussa {STRINGID}{ENDQUOTES} -STR_1628 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa hedelmämehusta kojussa {STRINGID}{ENDQUOTES} -STR_1629 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa soijamaidosta kojussa {STRINGID}{ENDQUOTES} -STR_1630 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa sujongkwa:sta kojussa {STRINGID}{ENDQUOTES} -STR_1631 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa subista kojussa {STRINGID}{ENDQUOTES} -STR_1632 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa keksistä kojussa {STRINGID}{ENDQUOTES} +STR_1616 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon kuvasta kojussa {STRINGID}{ENDQUOTES} +STR_1617 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon kuvasta kojussa {STRINGID}{ENDQUOTES} +STR_1618 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon kuvasta kojussa {STRINGID}{ENDQUOTES} +STR_1619 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon viipurinrinkelistä kojussa {STRINGID}{ENDQUOTES} +STR_1620 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon kaakaosta kojussa {STRINGID}{ENDQUOTES} +STR_1621 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon jääteestä kojussa {STRINGID}{ENDQUOTES} +STR_1622 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon tippaleivästä kojussa {STRINGID}{ENDQUOTES} +STR_1623 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon aurinkolaseista kojussa {STRINGID}{ENDQUOTES} +STR_1624 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon härkänuudeleista kojussa {STRINGID}{ENDQUOTES} +STR_1625 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon paistetusta riisinuudeleista kojussa {STRINGID}{ENDQUOTES} +STR_1626 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon wontonkeitosta kojussa {STRINGID}{ENDQUOTES} +STR_1627 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon lihapullakeitosta kojussa {STRINGID}{ENDQUOTES} +STR_1628 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon hedelmämehusta kojussa {STRINGID}{ENDQUOTES} +STR_1629 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon soijamaidosta kojussa {STRINGID}{ENDQUOTES} +STR_1630 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon sujongkwasta kojussa {STRINGID}{ENDQUOTES} +STR_1631 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon patongista kojussa {STRINGID}{ENDQUOTES} +STR_1632 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon keksistä kojussa {STRINGID}{ENDQUOTES} STR_1633 : STR_1634 : STR_1635 : -STR_1636 :{SMALLFONT}{OPENQUOTES}En maksa noin paljoa grillatusta makkarasta kojussa {STRINGID}{ENDQUOTES} +STR_1636 :{SMALLFONT}{OPENQUOTES}En maksa noin paljon grillatusta makkarasta kojussa {STRINGID}{ENDQUOTES} STR_1637 : STR_1638 : STR_1639 : @@ -1655,8 +1655,8 @@ STR_1647 : STR_1648 :{SMALLFONT}{OPENQUOTES}Auta! Laske minut alas!{ENDQUOTES} STR_1649 :{SMALLFONT}{OPENQUOTES}Rahat ovat loppumassa!{ENDQUOTES} STR_1650 :{SMALLFONT}{OPENQUOTES}Vau! Uutta laitetta rakennetaan!{ENDQUOTES} -STR_1651 :{SMALLFONT}{OPENQUOTES}Hieno laite! Mutta se ei ole yhtä hyvä kuin Phoenix:i...{ENDQUOTES} -STR_1652 :{SMALLFONT}{OPENQUOTES}Olen niin innoissani - se on Intamin laite!{ENDQUOTES} +STR_1651 :{SMALLFONT}{OPENQUOTES}Hieno laite! Mutta se ei ole yhtä hyvä kuin Phoenix...{ENDQUOTES} +STR_1652 :{SMALLFONT}{OPENQUOTES}Olen niin innoissani - se on Intaminlaite!{ENDQUOTES} STR_1653 :{SMALLFONT}{OPENQUOTES}...ja tässä me olemme {STRINGID}!{ENDQUOTES} STR_1654 :{WINDOW_COLOUR_2}Viimeisimmät ajatukset: STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land From d58b4e358962932e56025dde7547ca8501d1e4a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sun, 13 Sep 2015 21:41:37 +0200 Subject: [PATCH 0686/1173] memory safeness Just some more memory checks. One memset appears to be wrong, is fixed now. I think this might fix #1928, but please check. --- src/localisation/LanguagePack.cpp | 2 +- src/scenario.c | 25 ++++++++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/localisation/LanguagePack.cpp b/src/localisation/LanguagePack.cpp index 32a04c6793..0c8739c34c 100644 --- a/src/localisation/LanguagePack.cpp +++ b/src/localisation/LanguagePack.cpp @@ -351,7 +351,7 @@ void LanguagePack::ParseGroupScenario(IStringReader *reader) if (_currentScenarioOverride == nullptr) { _scenarioOverrides.push_back(ScenarioOverride()); _currentScenarioOverride = &_scenarioOverrides[_scenarioOverrides.size() - 1]; - memset(_currentScenarioOverride, 0, sizeof(ObjectOverride)); + memset(_currentScenarioOverride, 0, sizeof(ScenarioOverride)); _currentScenarioOverride->filename = sb.GetString(); } } diff --git a/src/scenario.c b/src/scenario.c index 9846f5ebef..45723c4425 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -75,7 +75,14 @@ int scenario_load_basic(const char *path, rct_s6_header *header, rct_s6_info *in // Get filename utf8 filename[MAX_PATH]; - strcpy(filename, path_get_filename(path)); + const char *temp_filename = path_get_filename(path); + int len = strnlen(temp_filename, MAX_PATH); + strncpy(filename, temp_filename, MAX_PATH); + if (len == MAX_PATH) + { + filename[MAX_PATH - 1] = '\0'; + log_warning("truncated string %s", filename); + } path_remove_extension(filename); rct_string_id localisedStringIds[3]; @@ -229,7 +236,13 @@ int scenario_load_and_play_from_path(const char *path) if (!scenario_load(path)) return 0; - strcpy(_scenarioPath, path); + int len = strnlen(path, MAX_PATH); + strncpy(_scenarioPath, path, len); + if (len == MAX_PATH) + { + _scenarioPath[MAX_PATH - 1] = '\0'; + log_warning("truncated string %s", _scenarioPath); + } _scenarioFileName = path_get_filename(_scenarioPath); log_verbose("starting scenario, %s", path); @@ -300,7 +313,13 @@ void scenario_begin() { // Get filename utf8 filename[MAX_PATH]; - strcpy(filename, _scenarioFileName); + int len = strnlen(_scenarioFileName, MAX_PATH); + strncpy(filename, _scenarioFileName, len); + if (len == MAX_PATH) + { + filename[MAX_PATH - 1] = '\0'; + log_warning("truncated string %s", filename); + } path_remove_extension(filename); rct_string_id localisedStringIds[3]; From 34f56a262b3ce87628df409d6fd4493ea531c9c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Mon, 14 Sep 2015 22:58:14 +0200 Subject: [PATCH 0687/1173] Null-terminate buffer read from language packs --- src/localisation/LanguagePack.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/localisation/LanguagePack.cpp b/src/localisation/LanguagePack.cpp index 0c8739c34c..588dfc5d8e 100644 --- a/src/localisation/LanguagePack.cpp +++ b/src/localisation/LanguagePack.cpp @@ -28,8 +28,9 @@ LanguagePack *LanguagePack::FromFile(int id, const utf8 *path) FileStream fs = FileStream(path, FILE_MODE_OPEN); fileLength = (uint32)fs.GetLength(); - fileData = Memory::Allocate(fileLength); + fileData = Memory::Allocate(fileLength + 1); fs.Read(fileData, fileLength); + fileData[fileLength] = '\0'; fs.Dispose(); } catch (Exception ex) { From 02d83f860e857ab8cde4042c8cba051e6f6b42e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Mon, 14 Sep 2015 23:03:03 +0200 Subject: [PATCH 0688/1173] In case any memory was allocated for lang pack, free it --- src/localisation/LanguagePack.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/localisation/LanguagePack.cpp b/src/localisation/LanguagePack.cpp index 588dfc5d8e..2b1c9953f7 100644 --- a/src/localisation/LanguagePack.cpp +++ b/src/localisation/LanguagePack.cpp @@ -21,7 +21,7 @@ LanguagePack *LanguagePack::FromFile(int id, const utf8 *path) assert(path != nullptr); uint32 fileLength; - utf8 *fileData; + utf8 *fileData = nullptr; // Load file directly into memory try { @@ -34,6 +34,7 @@ LanguagePack *LanguagePack::FromFile(int id, const utf8 *path) fs.Dispose(); } catch (Exception ex) { + Memory::Free(fileData); log_error("Unable to open %s: %s", path, ex.GetMessage()); return nullptr; } From 3ea534f75803572fadcff2ab00ac75bfe7d7bc36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 15 Sep 2015 00:01:21 +0200 Subject: [PATCH 0689/1173] make sure strings are properly terminated --- src/config.c | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/config.c b/src/config.c index 124be470a3..92e8615107 100644 --- a/src/config.c +++ b/src/config.c @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -526,7 +526,7 @@ bool config_get_property_name_value(const utf8string line, utf8 **propertyName, ch = line; utf8_skip_whitespace(&ch); - + if (*ch == 0) return false; *propertyName = ch; @@ -816,7 +816,7 @@ bool config_find_or_browse_install_directory() void config_apply_to_old_addresses() { RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_EDGE_SCROLLING, sint8) = gConfigGeneral.edge_scrolling; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CURRENCY, sint8) = gConfigGeneral.currency_format; + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CURRENCY, sint8) = gConfigGeneral.currency_format; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) = gConfigGeneral.measurement_format; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_TEMPERATURE, sint8) = gConfigGeneral.temperature_format; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CONSTRUCTION_MARKER, uint8) = gConfigGeneral.construction_marker_colour; @@ -866,10 +866,10 @@ void config_apply_to_old_addresses() //general configuration RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_EDGE_SCROLLING, sint8) = gConfigGeneral.edge_scrolling; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CURRENCY, sint8) = gConfigGeneral.currency_format; + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CURRENCY, sint8) = gConfigGeneral.currency_format; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) = gConfigGeneral.measurement_format; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_TEMPERATURE, sint8) = gConfigGeneral.temperature_format; - + // always show gridlines if (gConfigGeneral.always_show_gridlines){ RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) |= CONFIG_FLAG_ALWAYS_SHOW_GRIDLINES; @@ -885,7 +885,7 @@ void config_apply_to_old_addresses() else { RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) &= !CONFIG_FLAG_DISABLE_SMOOTH_LANDSCAPE; } - + // show height as units if (gConfigGeneral.show_height_as_units){ RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) |= CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS; @@ -904,10 +904,10 @@ void config_apply_to_old_addresses() //sound configuration: force software buffering and best quality RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, sint8) = 2; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, sint8) = 1; + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, sint8) = 1; // Line below is temporarily disabled until all config is in the new format. - //if (RCT2_GLOBAL(0x009AB4C6, sint8) == 1) + //if (RCT2_GLOBAL(0x009AB4C6, sint8) == 1) // return; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_CONFIG, sint8) = 1; // Marks config as first time loaded @@ -916,9 +916,9 @@ void config_apply_to_old_addresses() if (!(RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS)) RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) + 1) * 256; } - + } - + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MAX_VEHICLE_SOUNDS, sint8) = RCT2_ADDRESS(0x009AF601, sint8)[RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, sint8)]; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MAX_NO_SOUNDS, sint8) = RCT2_ADDRESS(0x009AF604, sint8)[RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, sint8)]; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = 0; @@ -1004,7 +1004,7 @@ static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = { #define SHORTCUT_FILE_VERSION 1 /** - * + * * rct2: 0x006E3604 */ void config_reset_shortcut_keys() @@ -1201,7 +1201,7 @@ void themes_load_presets() bool themes_save_preset(int preset) { utf8 path[MAX_PATH]; - + platform_get_user_directory(path, "themes"); strcat(path, gConfigThemes.presets[preset].name); strcat(path, ".ini"); @@ -1323,7 +1323,7 @@ static bool themes_save(const_utf8string path, int preset) for (i = 0; i < (int)gNumThemeWindows; i++) { theme_section_definition *section = &_themeSectionDefinitions[0]; - + rwopswritec(file, '['); SDL_RWwrite(file, gThemeWindowDefinitions[i].section_name, strlen(gThemeWindowDefinitions[i].section_name), 1); rwopswritec(file, ']'); @@ -1473,7 +1473,7 @@ void title_sequences_set_default() gConfigTitleSequences.presets = malloc(0); gConfigTitleSequences.num_presets = 0; - + // Load OpenRCT2 title sequence sprintf(path, "%s%c%s%c%s%c%s%c", gExePath, sep, "data", sep, "title", sep, "rct2", sep); title_sequence_open(path, language_get_string(5308)); @@ -1547,7 +1547,7 @@ static void title_sequence_open(const char *path, const char *customName) if (preset == gConfigTitleSequences.num_presets) { gConfigTitleSequences.num_presets++; gConfigTitleSequences.presets = realloc(gConfigTitleSequences.presets, sizeof(title_sequence) * (size_t)gConfigTitleSequences.num_presets); - + if (customName == NULL) { char nameBuffer[MAX_PATH], *name; strcpy(nameBuffer, path); @@ -1566,7 +1566,7 @@ static void title_sequence_open(const char *path, const char *customName) strcpy(gConfigTitleSequences.presets[preset].name, customName); strcpy(gConfigTitleSequences.presets[preset].path, path); } - + gConfigTitleSequences.presets[preset].saves = malloc(0); gConfigTitleSequences.presets[preset].commands = malloc(0); gConfigTitleSequences.presets[preset].num_saves = 0; @@ -1580,7 +1580,8 @@ static void title_sequence_open(const char *path, const char *customName) while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) { gConfigTitleSequences.presets[preset].num_saves++; gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); - strcpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], fileInfo.path); + strncpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], fileInfo.path, TITLE_SEQUENCE_MAX_SAVE_LENGTH); + gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1][TITLE_SEQUENCE_MAX_SAVE_LENGTH - 1] = '\0'; } platform_enumerate_files_end(fileEnumHandle); strcpy(titlePath, path); @@ -1589,10 +1590,11 @@ static void title_sequence_open(const char *path, const char *customName) while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) { gConfigTitleSequences.presets[preset].num_saves++; gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); - strcpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], fileInfo.path); + strncpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], fileInfo.path, TITLE_SEQUENCE_MAX_SAVE_LENGTH); + gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1][TITLE_SEQUENCE_MAX_SAVE_LENGTH - 1] = '\0'; } platform_enumerate_files_end(fileEnumHandle); - + // Load the script file file = SDL_RWFromFile(scriptPath, "r"); sint64 fileSize = SDL_RWsize(file); @@ -1653,7 +1655,7 @@ void title_sequence_save_preset_script(int preset) int i; char separator = platform_get_path_separator(); - + platform_get_user_directory(path, "title sequences"); strcat(path, path_get_filename(gConfigTitleSequences.presets[preset].name)); strncat(path, &separator, 1); @@ -1664,7 +1666,7 @@ void title_sequence_save_preset_script(int preset) log_error("Unable to write to script file."); return; } - + for (i = 0; i < gConfigTitleSequences.presets[preset].num_commands; i++) { title_command *command = &gConfigTitleSequences.presets[preset].commands[i]; switch (command->command) { From ee96aaec8e3627852226ffc63cb716f50fbeea86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 15 Sep 2015 00:21:11 +0200 Subject: [PATCH 0690/1173] reduce amount of times the pointer is freed to one track_list_cache is being free()d as part of track_load_list, which is a better place to do so, as it has full ownership of that pointer. --- src/ride/track.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ride/track.c b/src/ride/track.c index 615e8b0a33..137396b123 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -397,7 +397,6 @@ void track_list_populate(ride_list_item item, uint8* track_list_cache){ } RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8)[cur_track_entry_index * 128] = '\0'; - free(track_list_cache); } /** From 338855ba50edf25ffba9f81fae2eb31a32c4ff52 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 15 Sep 2015 04:00:15 +0100 Subject: [PATCH 0691/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 38 +++++++++++++++++++++++++++ data/language/dutch.txt | 8 +++--- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index ac4549252a..9b0031da4a 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3887,3 +3887,41 @@ STR_5544 :{SMALLFONT}{BLACK}明紅色 STR_5545 :{SMALLFONT}{BLACK}暗粉紅色 STR_5546 :{SMALLFONT}{BLACK}明粉紅色 STR_5547 :{SMALLFONT}{BLACK}淺粉紅色 + + +##################### +# Rides/attractions # +##################### +############################################################################### +## RCT2 Objects +############################################################################### +[AML1] +STR_NAME :美式蒸氣火車 +STR_DESC :配備著復刻蒸氣火車頭及煤水車的小型蒸氣火車, 拉著帶有帆布車頂的木製車廂 +STR_CPTY :每車廂6個乘客 + +[CLIFT1] +STR_NAME :纜車車卡 +STR_DESC :供纜車使用的開放式車卡 +STR_CPTY :每車卡2個乘客 + +[CLIFT2] +STR_NAME :登頂滑雪纜車車椅 +STR_DESC :供纜車使用的開放式車卡 +STR_CPTY :每車卡2個乘客 + +[LIFT1] +STR_NAME :升降機 +STR_DESC :遊客乘搭升降機上下穿梭於垂直的管道中, 並借此訪問另一層 +STR_CPTY :16個乘客 + +[MONO1] +STR_NAME :流線型單軌電車 +STR_DESC :大載客量的單軌電車, 車頭車尾都配備著流線型設計 +STR_CPTY :每車卡5或10個乘客 + +#WW +[CONDORRD] +STR_NAME :神鷹暢遊 +STR_DESC :乘客乘坐於軌道下的神鷹造型列車上, 將會於飛馳中體驗飛一般的快感 +STR_CPTY :每車卡4個乘客 diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 551c0ad2d8..9cab977080 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3573,9 +3573,9 @@ STR_5237 :Palet: STR_5238 :Huidig thema: STR_5239 :Kopiëren STR_5240 :Voer een naam in voor dit thema -STR_5241 :Kan dit thema niet wijzigen -STR_5242 :Themanaam bestaat al -STR_5243 :Er zijn ongeldige tekens gebruikt +STR_5241 :Kan dit thema niet wijzigen. +STR_5242 :Themanaam bestaat al. +STR_5243 :Er zijn ongeldige tekens gebruikt. STR_5244 :Thema's STR_5245 :Bovenste werkbalk STR_5246 :Onderste werkbalk @@ -3588,7 +3588,7 @@ STR_5252 :Scenarioselectie titelscherm STR_5253 :Parkinformatie STR_5254 :Aanmaken STR_5255 :{SMALLFONT}{BLACK}Begint een nieuwe, lege titelpresentatie -STR_5256 :Een nieuw thema aanmaken om wijzigingen aan te brengen +STR_5256 :Maak een nieuw thema aan om wijzigingen aan te brengen. STR_5257 :{SMALLFONT}{BLACK}Een nieuw thema aanmaken dat is gebaseerd op het huidige STR_5258 :{SMALLFONT}{BLACK}Het huidige thema verwijderen STR_5259 :{SMALLFONT}{BLACK}Het huidige thema hernoemen From 4909272a4457de677866fca1c99b8c6a714fa686 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 18 Sep 2015 10:54:48 +0200 Subject: [PATCH 0692/1173] Add cheat option to show all operating modes; cleanup --- data/language/english_uk.txt | 1 + src/cheats.c | 2 ++ src/cheats.h | 1 + src/localisation/string_ids.h | 1 + src/ride/ride.c | 24 ++++++++++++++++++++---- src/ride/ride.h | 1 + src/ride/ride_data.c | 4 ++++ src/ride/ride_data.h | 1 + src/windows/ride.c | 12 +++--------- src/windows/top_toolbar.c | 20 +++++++++----------- 10 files changed, 43 insertions(+), 24 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index af3e4d140e..f8d65acebf 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3886,6 +3886,7 @@ STR_5544 :{SMALLFONT}{BLACK}Bright red STR_5545 :{SMALLFONT}{BLACK}Dark pink STR_5546 :{SMALLFONT}{BLACK}Bright pink STR_5547 :{SMALLFONT}{BLACK}Light pink +STR_5548 :Show all operating modes ##################### # Rides/attractions # diff --git a/src/cheats.c b/src/cheats.c index 4719dad484..7297ede6e3 100644 --- a/src/cheats.c +++ b/src/cheats.c @@ -3,10 +3,12 @@ bool gCheatsSandboxMode = false; bool gCheatsDisableClearanceChecks = false; bool gCheatsDisableSupportLimits = false; +bool gCheatsShowAllOperatingModes = false; void cheats_reset() { gCheatsSandboxMode = false; gCheatsDisableClearanceChecks = false; gCheatsDisableSupportLimits = false; + gCheatsShowAllOperatingModes = false; } diff --git a/src/cheats.h b/src/cheats.h index c18038de1a..62b8033241 100644 --- a/src/cheats.h +++ b/src/cheats.h @@ -26,6 +26,7 @@ extern bool gCheatsSandboxMode; extern bool gCheatsDisableClearanceChecks; extern bool gCheatsDisableSupportLimits; +extern bool gCheatsShowAllOperatingModes; void cheats_reset(); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index b4de98d40a..db3e1437fb 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2104,6 +2104,7 @@ enum { STR_CHEAT_DISABLE_VANDALISM_TIP = 5515, STR_COLOUR_NAMES_START = 5516, + STR_SHOW_ALL_OPERATING_MODES = 5548, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/ride/ride.c b/src/ride/ride.c index a2905aa025..be387edeb8 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3681,11 +3681,8 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * ride_remove_peeps(ride_id); rct_ride_type* ride_entry = GET_RIDE_ENTRY(ride->subtype); - const uint8* available_modes = RideAvailableModes; + const uint8* available_modes = ride_seek_available_modes(ride); - for (int i = 0; i < ride->type; i++) { - while (*(available_modes++) != 255) {} - } if (ride_entry->flags & RIDE_ENTRY_FLAG_17){ available_modes += 2; } @@ -7043,3 +7040,22 @@ void ride_reset_all_names() ride->name_arguments_number = name_args.number; } } + +const uint8* ride_seek_available_modes(rct_ride *ride) +{ + const uint8* availableModes; + + if(!gCheatsShowAllOperatingModes) { + availableModes = RideAvailableModes; + + for (int i = 0; i < ride->type; i++) { + while (*(availableModes++) != 255) { } + } + } + else + { + availableModes = AllRideModesAvailable; + } + + return availableModes; +} diff --git a/src/ride/ride.h b/src/ride/ride.h index 68c99f8543..517f006b28 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -1042,5 +1042,6 @@ void sub_6C94D8(); bool shop_item_is_food_or_drink(int shopItem); void ride_reset_all_names(); +const uint8* ride_seek_available_modes(rct_ride *ride); #endif diff --git a/src/ride/ride_data.c b/src/ride/ride_data.c index e447788bf3..ada6fabd7b 100644 --- a/src/ride/ride_data.c +++ b/src/ride/ride_data.c @@ -774,6 +774,10 @@ const uint8 RideAvailableModes[] = { RIDE_MODE_POWERED_LAUNCH_PASSTROUGH, RIDE_MODE_POWERED_LAUNCH, RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED, 0xFF // 60 LIM Launched Roller Coaster }; +const uint8 AllRideModesAvailable[] = { + RIDE_MODE_NORMAL, RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE, RIDE_MODE_POWERED_LAUNCH_PASSTROUGH, RIDE_MODE_SHUTTLE, RIDE_MODE_BOAT_HIRE, RIDE_MODE_UPWARD_LAUNCH, RIDE_MODE_ROTATING_LIFT, RIDE_MODE_STATION_TO_STATION, RIDE_MODE_SINGLE_RIDE_PER_ADMISSION, RIDE_MODE_UNLIMITED_RIDES_PER_ADMISSION, RIDE_MODE_MAZE, RIDE_MODE_RACE, RIDE_MODE_BUMPERCAR, RIDE_MODE_SWING, RIDE_MODE_SHOP_STALL, RIDE_MODE_ROTATION, RIDE_MODE_FORWARD_ROTATION, RIDE_MODE_BACKWARD_ROTATION, RIDE_MODE_FILM_AVENGING_AVIATORS, RIDE_MODE_3D_FILM_MOUSE_TAILS, RIDE_MODE_SPACE_RINGS, RIDE_MODE_BEGINNERS, RIDE_MODE_LIM_POWERED_LAUNCH, RIDE_MODE_FILM_THRILL_RIDERS, RIDE_MODE_3D_FILM_STORM_CHASERS, RIDE_MODE_3D_FILM_SPACE_RAIDERS, RIDE_MODE_INTENSE, RIDE_MODE_BERSERK, RIDE_MODE_HAUNTED_HOUSE, RIDE_MODE_CIRCUS_SHOW, RIDE_MODE_DOWNWARD_LAUNCH, RIDE_MODE_CROOKED_HOUSE, RIDE_MODE_FREEFALL_DROP, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, RIDE_MODE_POWERED_LAUNCH, RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED, 0xFF +}; + const uint8 RideAvailableBreakdowns[] = { (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), // 00 Spiral Roller coaster (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), // 01 Stand Up Coaster diff --git a/src/ride/ride_data.h b/src/ride/ride_data.h index 8f3f42d3df..7e1c2ccb4d 100644 --- a/src/ride/ride_data.h +++ b/src/ride/ride_data.h @@ -83,6 +83,7 @@ extern const uint8 rideUnknownData3[0x60]; extern const rct_ride_name_convention RideNameConvention[96]; extern const uint8 RideAvailableModes[]; +extern const uint8 AllRideModesAvailable[]; extern const uint8 RideAvailableBreakdowns[]; extern const rct_ride_entrance_definition RideEntranceDefinitions[RIDE_ENTRANCE_STYLE_COUNT]; diff --git a/src/windows/ride.c b/src/windows/ride.c index acacbf3b7c..bcdb9de417 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -2762,10 +2762,7 @@ static void window_ride_mode_dropdown(rct_window *w, rct_widget *widget) rideEntry = ride_get_entry(ride); // Seek to available modes for this ride - availableModes = RideAvailableModes; - for (i = 0; i < ride->type; i++) { - while (*(availableModes++) != 255) { } - } + availableModes = ride_seek_available_modes(ride); // Count number of available modes mode = availableModes; @@ -2950,7 +2947,6 @@ static void window_ride_operating_dropdown(rct_window *w, int widgetIndex, int d { rct_ride *ride; const uint8 *availableModes; - int i; if (dropdownIndex == -1) return; @@ -2960,10 +2956,8 @@ static void window_ride_operating_dropdown(rct_window *w, int widgetIndex, int d switch (widgetIndex) { case WIDX_MODE_DROPDOWN: // Seek to available modes for this ride - availableModes = RideAvailableModes; - for (i = 0; i < ride->type; i++) { - while (*(availableModes++) != 255) { } - } + availableModes = ride_seek_available_modes(ride); + set_operating_setting(w->number, 0, availableModes[dropdownIndex]); break; case WIDX_LOAD_DROPDOWN: diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 490e4147ab..44dd45fcd8 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -116,7 +116,8 @@ enum { DDIDX_CHEATS, DDIDX_ENABLE_SANDBOX_MODE = 2, DDIDX_DISABLE_CLEARANCE_CHECKS, - DDIDX_DISABLE_SUPPORT_LIMITS + DDIDX_DISABLE_SUPPORT_LIMITS, + DDIDX_SHOW_ALL_OPERATING_MODES }; #pragma region Toolbar_widget_ordering @@ -421,17 +422,19 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg gDropdownItemsFormat[2] = 1156; gDropdownItemsFormat[3] = 1156; gDropdownItemsFormat[4] = 1156; + gDropdownItemsFormat[5] = 1156; gDropdownItemsArgs[0] = 5217; gDropdownItemsArgs[2] = STR_ENABLE_SANDBOX_MODE; gDropdownItemsArgs[3] = STR_DISABLE_CLEARANCE_CHECKS; gDropdownItemsArgs[4] = STR_DISABLE_SUPPORT_LIMITS; + gDropdownItemsArgs[5] = STR_SHOW_ALL_OPERATING_MODES; window_dropdown_show_text( w->x + widget->left, w->y + widget->top, widget->bottom - widget->top + 1, w->colours[0] | 0x80, 0, - 5 + 6 ); if (gCheatsSandboxMode) gDropdownItemsChecked |= (1 << DDIDX_ENABLE_SANDBOX_MODE); @@ -439,6 +442,8 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg gDropdownItemsChecked |= (1 << DDIDX_DISABLE_CLEARANCE_CHECKS); if (gCheatsDisableSupportLimits) gDropdownItemsChecked |= (1 << DDIDX_DISABLE_SUPPORT_LIMITS); + if (gCheatsShowAllOperatingModes) + gDropdownItemsChecked |= (1 << DDIDX_SHOW_ALL_OPERATING_MODES); RCT2_GLOBAL(0x009DEBA2, uint16) = 0; break; case WIDX_VIEW_MENU: @@ -556,6 +561,8 @@ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int drop case DDIDX_DISABLE_SUPPORT_LIMITS: gCheatsDisableSupportLimits = !gCheatsDisableSupportLimits; break; + case DDIDX_SHOW_ALL_OPERATING_MODES: + gCheatsShowAllOperatingModes = !gCheatsShowAllOperatingModes; } break; case WIDX_VIEW_MENU: @@ -739,12 +746,6 @@ static void window_top_toolbar_invalidate(rct_window *w) else w->pressed_widgets |= (1 << WIDX_PATH); - // Fast forward button pressed down - // if (0) - // w->pressed_widgets |= (1 << WIDX_FASTFORWARD); - // else - // w->pressed_widgets &= ~(1 << WIDX_FASTFORWARD); - if (!(RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) & 1)) w->pressed_widgets &= ~(1 << WIDX_PAUSE); else @@ -797,9 +798,6 @@ static void window_top_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi) for (int i = 0; i < 3 && i < gGameSpeed - 4 && gGameSpeed >= 5; i++) { gfx_draw_sprite(dpi, SPR_G2_HYPER_ARROW, x + 5 + i * 6, y + 15, 0); } - /*if (gGameSpeed >= 8) { - gfx_draw_sprite(dpi, SPR_G2_HYPER_ARROWS, x + 5, y + 15, 0); - }*/ } // Draw cheats button From e2ec6e0970c095c01bdac37640fafb1db671805b Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Fri, 18 Sep 2015 11:55:52 +0200 Subject: [PATCH 0693/1173] Move 'show all operating modes' to Cheats window --- src/localisation/string_ids.h | 3 ++- src/windows/cheats.c | 10 ++++++++-- src/windows/top_toolbar.c | 11 ++--------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index db3e1437fb..d366b4b736 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2104,7 +2104,8 @@ enum { STR_CHEAT_DISABLE_VANDALISM_TIP = 5515, STR_COLOUR_NAMES_START = 5516, - STR_SHOW_ALL_OPERATING_MODES = 5548, + + STR_CHEAT_SHOW_ALL_OPERATING_MODES = 5548, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 80435be664..f0aa95a46b 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -117,7 +117,8 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_DISABLE_BRAKES_FAILURE, WIDX_DISABLE_ALL_BREAKDOWNS, WIDX_BUILD_IN_PAUSE_MODE, - WIDX_RESET_CRASH_STATUS + WIDX_RESET_CRASH_STATUS, + WIDX_SHOW_ALL_OPERATING_MODES }; enum { @@ -257,6 +258,7 @@ static rct_widget window_cheats_rides_widgets[] = { { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(10), OHPL(10), STR_CHEAT_DISABLE_BREAKDOWNS, STR_NONE }, // Disable all breakdowns { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(8), OHPL(8), STR_CHEAT_BUILD_IN_PAUSE_MODE, STR_NONE }, // Build in pause mode { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_RESET_CRASH_STATUS, STR_NONE }, // Reset crash status + { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(7), OHPL(7), STR_CHEAT_SHOW_ALL_OPERATING_MODES, STR_NONE }, // Show all operating modes { WIDGETS_END }, }; @@ -412,7 +414,7 @@ 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_HIGH_MONEY) | (1ULL << WIDX_CLEAR_LOAN), (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_GUEST_PARAMETERS_GROUP) | (1ULL << WIDX_GUEST_HAPPINESS_MAX) | (1ULL << WIDX_GUEST_HAPPINESS_MIN) | (1ULL << WIDX_GUEST_ENERGY_MAX) | (1ULL << WIDX_GUEST_ENERGY_MIN) | (1ULL << WIDX_GUEST_HUNGER_MAX) | (1ULL << WIDX_GUEST_HUNGER_MIN) | (1ULL << WIDX_GUEST_THIRST_MAX) | (1ULL << WIDX_GUEST_THIRST_MIN) | (1ULL << WIDX_GUEST_NAUSEA_MAX) | (1ULL << WIDX_GUEST_NAUSEA_MIN) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1ULL << WIDX_GUEST_BATHROOM_MAX) | (1ULL << WIDX_GUEST_BATHROOM_MIN) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1ULL << WIDX_GUEST_IGNORE_RIDE_INTENSITY) | (1ULL << WIDX_GIVE_ALL_GUESTS_GROUP) | (1ULL << WIDX_GIVE_GUESTS_MONEY) | (1ULL << WIDX_GIVE_GUESTS_PARK_MAPS) | (1ULL << WIDX_GIVE_GUESTS_BALLOONS) | (1ULL << WIDX_GIVE_GUESTS_UMBRELLAS) | (1ULL << WIDX_TRAM_GUESTS) | (1ULL << WIDX_REMOVE_ALL_GUESTS) | (1ULL << WIDX_EXPLODE_GUESTS) | (1ULL << WIDX_DISABLE_VANDALISM), (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_FREEZE_CLIMATE) | (1ULL << WIDX_OPEN_CLOSE_PARK) | (1ULL << WIDX_WEATHER_SUN) | (1ULL << WIDX_WEATHER_THUNDER) | (1ULL << WIDX_CLEAR_GRASS) | (1ULL << WIDX_MOWED_GRASS) | (1ULL << WIDX_WATER_PLANTS) | (1ULL << WIDX_FIX_VANDALISM) | (1ULL << WIDX_REMOVE_LITTER) | (1ULL << WIDX_WIN_SCENARIO) | (1ULL << WIDX_HAVE_FUN) | (1ULL << WIDX_UNLOCK_ALL_PRICES) | (1ULL << WIDX_SANDBOX_MODE) | (1ULL << WIDX_FAST_STAFF) | (1ULL << WIDX_NORMAL_STAFF) | (1ULL << WIDX_PARK_PARAMETERS) | (1ULL << WIDX_FORCE_PARK_RATING) | (1ULL << WIDX_INCREASE_PARK_RATING) | (1ULL << WIDX_DECREASE_PARK_RATING), - (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_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_SHOW_ALL_OPERATING_MODES) }; static rct_string_id window_cheats_page_titles[] = { @@ -1006,6 +1008,9 @@ static void window_cheats_rides_mouseup(rct_window *w, int widgetIndex) case WIDX_RESET_CRASH_STATUS: cheat_reset_crash_status(); break; + case WIDX_SHOW_ALL_OPERATING_MODES: + gCheatsShowAllOperatingModes = !gCheatsShowAllOperatingModes; + break; } } @@ -1069,6 +1074,7 @@ static void window_cheats_invalidate(rct_window *w) widget_set_checkbox_value(w, WIDX_DISABLE_BRAKES_FAILURE, gConfigCheat.disable_brakes_failure); widget_set_checkbox_value(w, WIDX_DISABLE_ALL_BREAKDOWNS, gConfigCheat.disable_all_breakdowns); widget_set_checkbox_value(w, WIDX_BUILD_IN_PAUSE_MODE, gConfigCheat.build_in_pause_mode); + widget_set_checkbox_value(w, WIDX_SHOW_ALL_OPERATING_MODES, gCheatsShowAllOperatingModes); break; } diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 44dd45fcd8..3e6e307336 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -116,8 +116,7 @@ enum { DDIDX_CHEATS, DDIDX_ENABLE_SANDBOX_MODE = 2, DDIDX_DISABLE_CLEARANCE_CHECKS, - DDIDX_DISABLE_SUPPORT_LIMITS, - DDIDX_SHOW_ALL_OPERATING_MODES + DDIDX_DISABLE_SUPPORT_LIMITS }; #pragma region Toolbar_widget_ordering @@ -422,19 +421,17 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg gDropdownItemsFormat[2] = 1156; gDropdownItemsFormat[3] = 1156; gDropdownItemsFormat[4] = 1156; - gDropdownItemsFormat[5] = 1156; gDropdownItemsArgs[0] = 5217; gDropdownItemsArgs[2] = STR_ENABLE_SANDBOX_MODE; gDropdownItemsArgs[3] = STR_DISABLE_CLEARANCE_CHECKS; gDropdownItemsArgs[4] = STR_DISABLE_SUPPORT_LIMITS; - gDropdownItemsArgs[5] = STR_SHOW_ALL_OPERATING_MODES; window_dropdown_show_text( w->x + widget->left, w->y + widget->top, widget->bottom - widget->top + 1, w->colours[0] | 0x80, 0, - 6 + 5 ); if (gCheatsSandboxMode) gDropdownItemsChecked |= (1 << DDIDX_ENABLE_SANDBOX_MODE); @@ -442,8 +439,6 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg gDropdownItemsChecked |= (1 << DDIDX_DISABLE_CLEARANCE_CHECKS); if (gCheatsDisableSupportLimits) gDropdownItemsChecked |= (1 << DDIDX_DISABLE_SUPPORT_LIMITS); - if (gCheatsShowAllOperatingModes) - gDropdownItemsChecked |= (1 << DDIDX_SHOW_ALL_OPERATING_MODES); RCT2_GLOBAL(0x009DEBA2, uint16) = 0; break; case WIDX_VIEW_MENU: @@ -561,8 +556,6 @@ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int drop case DDIDX_DISABLE_SUPPORT_LIMITS: gCheatsDisableSupportLimits = !gCheatsDisableSupportLimits; break; - case DDIDX_SHOW_ALL_OPERATING_MODES: - gCheatsShowAllOperatingModes = !gCheatsShowAllOperatingModes; } break; case WIDX_VIEW_MENU: From b4a91321055682bfbe48c49b222d22ed35ded32b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 18 Sep 2015 12:01:00 +0200 Subject: [PATCH 0694/1173] Create a matrix of jobs for easier configuration testing Right now it will post two jobs, one regular and the other one with network disabled, so both get tested on future commits. --- .travis.yml | 4 ++++ build.sh | 20 ++------------------ 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6b56fed9be..357b595a0a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,10 @@ cache: - cache apt: true +env: + - OPENRCT2_CMAKE_OPTS= + - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON" + sudo: required services: diff --git a/build.sh b/build.sh index 8ad2585903..6f48556dc1 100755 --- a/build.sh +++ b/build.sh @@ -2,23 +2,12 @@ set -e -nonet=false; - -if [[ "$1" = "--include-nonet" ]]; then - nonet=true -fi - cachedir=.cache mkdir -p $cachedir if [[ ! -d build ]]; then mkdir -p build fi -if [[ $nonet = true ]]; then - if [[ ! -d build_nonet ]]; then - mkdir -p build_nonet - fi -fi libversion=2 libVFile="./libversion" @@ -66,15 +55,10 @@ if [[ "$needsdownload" = "true" ]]; then fi pushd build - cmake -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt -DCMAKE_BUILD_TYPE=Debug .. + echo OPENRCT2_CMAKE_OPTS = $OPENRCT_CMAKE_OPTS + cmake -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt -DCMAKE_BUILD_TYPE=Debug $OPENRCT2_CMAKE_OPTS .. make popd -if [[ $nonet = true ]]; then - pushd build_nonet - cmake -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt -DCMAKE_BUILD_TYPE=Debug -DDISABLE_NETWORK=ON .. - make - popd -fi if [[ ! -h openrct2.dll ]]; then ln -s build/openrct2.dll openrct2.dll From 30cccce98bbfb8edeb6f44ee529f282374bbae91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 18 Sep 2015 13:51:46 +0200 Subject: [PATCH 0695/1173] try libsdl2-dev:i386 --- .travis.yml | 4 ++-- build.sh | 2 +- install.sh | 6 +++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 357b595a0a..546134c0e3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,8 +16,8 @@ cache: apt: true env: - - OPENRCT2_CMAKE_OPTS= - - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON" + - OPENRCT2_CMAKE_OPTS="-DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" + - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" sudo: required diff --git a/build.sh b/build.sh index 6f48556dc1..ac73080354 100755 --- a/build.sh +++ b/build.sh @@ -56,7 +56,7 @@ fi pushd build echo OPENRCT2_CMAKE_OPTS = $OPENRCT_CMAKE_OPTS - cmake -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt -DCMAKE_BUILD_TYPE=Debug $OPENRCT2_CMAKE_OPTS .. + cmake -DCMAKE_BUILD_TYPE=Debug $OPENRCT2_CMAKE_OPTS .. make popd diff --git a/install.sh b/install.sh index 93d64307f5..71a204430a 100755 --- a/install.sh +++ b/install.sh @@ -74,6 +74,7 @@ if [[ `uname` == "Darwin" ]]; then popd fi elif [[ `uname` == "Linux" ]]; then + sudo dpkg --add-architecture i386 sudo apt-get update if [[ -z "$TRAVIS" ]]; then sudo apt-get install -y binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake @@ -81,7 +82,10 @@ elif [[ `uname` == "Linux" ]]; then sudo apt-get install -y wine fi else - sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake + apt-cache search libsdl2 + apt-cache policy libsdl2-dev:i386 + apt-cache policy libsdl2-dev + sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386 fi fi From 4df876183194f767de25d4add030b3952e69f1f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 4 Aug 2015 01:08:42 +0200 Subject: [PATCH 0696/1173] remove windows-only code Step 1 on road towards Linux. Remove windows-specific code, stub it out where needed and make sure we can still compile it the way it is. Take care of Travis' build matrix to include new build configuration. Install new packages. --- .travis.yml | 3 + CMakeLists.txt | 10 ++- Dockerfile | 63 ++++++++------ install.sh | 13 ++- src/audio/audio.c | 133 ++++++++++++++++++++++++++++++ src/audio/audio.h | 18 +++- src/audio/mixer.cpp | 32 ++++++- src/audio/mixer.h | 13 ++- src/drawing/rect.c | 3 +- src/hook.c | 11 ++- src/localisation/LanguagePack.cpp | 1 + src/localisation/localisation.c | 8 ++ src/network/http.h | 8 +- src/network/network.cpp | 4 +- src/network/network.h | 4 + src/openrct2.c | 25 ++++-- src/platform/platform.h | 32 +++++-- src/platform/shared.c | 4 + src/rct2.c | 18 ++++ src/util/util.c | 1 + 20 files changed, 356 insertions(+), 48 deletions(-) diff --git a/.travis.yml b/.travis.yml index 546134c0e3..172a8d25ce 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,6 +18,9 @@ cache: env: - OPENRCT2_CMAKE_OPTS="-DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" + - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" + - OPENRCT2_CMAKE_OPTS="-DDISABLE_HTTP_TWITCH=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" + - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON -DCMAKE_C_COMPILER=gcc-4.8 -DCMAKE_CXX_COMPILER=g++-4.8" sudo: required diff --git a/CMakeLists.txt b/CMakeLists.txt index 104931660c..14b4af5259 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,8 +26,10 @@ project(${PROJECT}) add_definitions(-DORCT2_RESOURCE_DIR="${ORCT2_RESOURCE_DIR}") add_definitions(-DHAVE_CONFIG_H) add_definitions(-DCURL_STATICLIB) -#uncomment the line bellow if you don't want to build openrct2 with twitch integration -#add_definitions(-DDISABLE_HTTP -DDISABLE_TWITCH) +option(DISABLE_HTTP_TWITCH "Disable HTTP and Twitch support.") +if (DISABLE_HTTP_TWITCH) + add_definitions(-DDISABLE_HTTP -DDISABLE_TWITCH) +endif (DISABLE_HTTP_TWITCH) option(DISABLE_NETWORK "Disable multiplayer functionality. Mainly for testing.") if (DISABLE_NETWORK) @@ -37,7 +39,7 @@ endif (DISABLE_NETWORK) set(ORCTLIBS_INCLUDE /usr/local/cross-tools/orctlibs/include) set(JANSSON_INCLUDE /usr/local/cross-tools/orctlibs/include/jansson) set(ORCTLIBS_LIB_DIR /usr/local/cross-tools/orctlibs/lib) -set(ORCTLIBS_LIB jansson curl ssl crypto ws2_32) +set(ORCTLIBS_LIB jansson curl ssl crypto) # include lib include_directories("lib/") @@ -75,6 +77,6 @@ set_target_properties(${PROJECT} PROPERTIES PREFIX "") TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB}) if (WIN32) - target_link_libraries(${PROJECT} winmm.lib -limm32 -lversion -ldsound) + target_link_libraries(${PROJECT} winmm.lib -limm32 -lversion -ldsound ws2_32) endif (WIN32) diff --git a/Dockerfile b/Dockerfile index 7ddbfc3594..a4202ee790 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,43 +1,60 @@ FROM nfnty/arch-mini -MAINTAINER s0r00t -ENV DISPLAY :0 RUN pacman -Syyu --noconfirm -RUN pacman -S --noconfirm git yajl cmake wget unzip wine +RUN pacman -S --noconfirm git curl jshon expac RUN pacman -S --noconfirm --needed base-devel +RUN pacman -S --noconfirm yajl RUN useradd -mg root travis RUN usermod -aG wheel travis RUN sed -i 's/# %wheel ALL=(ALL) NOPASSWD: ALL/%wheel ALL=(ALL) NOPASSWD: ALL/g' /etc/sudoers -USER travis WORKDIR /tmp -RUN curl -sL https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=package-query -o PKGBUILD +USER travis +RUN curl -sLO https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=package-query +RUN mv PKGBUILD?h=package-query PKGBUILD RUN makepkg USER root RUN pacman --noconfirm -U *.pkg.tar.xz USER travis -RUN curl -sL https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=yaourt -o PKGBUILD +RUN curl -sLO https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=yaourt +RUN mv PKGBUILD?h=yaourt PKGBUILD RUN makepkg USER root RUN pacman --noconfirm -U *.pkg.tar.xz +RUN pacman -R --noconfirm gcc +RUN yes | pacman -S gcc-libs-multilib +RUN pacman -S --noconfirm gcc-multilib cmake +RUN pacman -S --noconfirm cmake USER travis +RUN yaourt -S --noconfirm mingw-w64-headers +RUN yaourt -S --noconfirm mingw-w64-gcc +RUN yaourt -S --noconfirm wine +RUN yaourt -S --noconfirm mingw-w64-zlib mingw-w64-pkg-config RUN gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys D9C4D26D0E604491 BB5869F064EA74AB 9D5EAAF69013B842 D605848ED7E69871 4DE8FF2A63C7CC90 -RUN yaourt -S --noconfirm mingw-w64-gcc mingw-w64-zlib mingw-w64-pkg-config mingw-w64-openssl mingw-w64-jansson mingw-w64-libtasn1 mingw-w64-gmp mingw-w64-nettle mingw-w64-libffi mingw-w64-p11-kit mingw-w64-readline mingw-w64-gnutls mingw-w64-libunistring mingw-w64-termcap mingw-w64-libidn mingw-w64-curl mingw-w64-expat mingw-w64-libdbus mingw-w64-sdl2 mingw-w64-sdl2_ttf mingw-w64-configure -USER root -RUN pacman --noconfirm -Rns $(pacman -Qttdq) -RUN pacman -Scc --noconfirm -WORKDIR /tmp -RUN rm -r * -WORKDIR /home/travis -USER travis -RUN git clone https://github.com/OpenRCT2/OpenRCT2 -WORKDIR OpenRCT2 -RUN ln -s /usr/i686-w64-mingw32/bin/libfreetype-6.dll -RUN ln -s /usr/i686-w64-mingw32/bin/libwinpthread-1.dll -RUN ln -s /usr/i686-w64-mingw32/bin/SDL2_ttf.dll -RUN ln -s /usr/i686-w64-mingw32/bin/SDL2.dll -RUN ln -s /usr/i686-w64-mingw32/bin/libbz2-1.dll -RUN ./install.sh -RUN ./build.sh +RUN yaourt -S --noconfirm mingw-w64-openssl +RUN yaourt -S --noconfirm mingw-w64-jansson +RUN yaourt -S --noconfirm mingw-w64-libtasn1 +RUN yaourt -S --noconfirm mingw-w64-gmp +RUN yaourt -S --noconfirm mingw-w64-nettle +RUN yaourt -S --noconfirm mingw-w64-libffi +RUN yaourt -S --noconfirm mingw-w64-p11-kit +RUN yaourt -S --noconfirm mingw-w64-readline +RUN yaourt -S --noconfirm mingw-w64-gnutls +RUN yaourt -S --noconfirm mingw-w64-libunistring +RUN yaourt -S --noconfirm mingw-w64-termcap +RUN yaourt -S --noconfirm mingw-w64-gettext +RUN yaourt -S --noconfirm mingw-w64-libidn +RUN yaourt -S --noconfirm mingw-w64-curl +RUN yaourt -S --noconfirm mingw-w64-expat +RUN yaourt -S --noconfirm mingw-w64-libdbus +RUN yaourt -S --noconfirm mingw-w64-sdl2 +RUN yaourt -S --noconfirm mingw-w64-sdl2_ttf +RUN yaourt -S --noconfirm wget unzip +RUN yaourt -S --noconfirm lib32-jansson lib32-curl lib32-sdl2 lib32-sdl2_ttf +RUN yaourt -S --noconfirm lib32-speex +#RUN git clone https://github.com/OpenRCT2/OpenRCT2 +#WORKDIR /tmp/OpenRCT2 +#RUN ./install.sh +#RUN ./build.sh diff --git a/install.sh b/install.sh index 71a204430a..06fdc181b3 100755 --- a/install.sh +++ b/install.sh @@ -74,7 +74,9 @@ if [[ `uname` == "Darwin" ]]; then popd fi elif [[ `uname` == "Linux" ]]; then - sudo dpkg --add-architecture i386 + if [[ ! -z "$TRAVIS" ]]; then + sudo dpkg --add-architecture i386 + fi sudo apt-get update if [[ -z "$TRAVIS" ]]; then sudo apt-get install -y binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake @@ -85,7 +87,9 @@ elif [[ `uname` == "Linux" ]]; then apt-cache search libsdl2 apt-cache policy libsdl2-dev:i386 apt-cache policy libsdl2-dev - sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386 + sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386 gcc-4.8 pkg-config:i386 g++-4.8-multilib gcc-4.8-multilib libjansson-dev:i386 libspeex-dev:i386 libspeexdsp-dev:i386 + export CC=gcc-4.8 + export CXX=g++-4.8 fi fi @@ -148,6 +152,11 @@ if [[ ! -f $cachedir/i686-w64-mingw32-pkg-config ]]; then echo -e "#!/bin/sh\nexport PKG_CONFIG_LIBDIR=/usr/local/cross-tools/i686-w64-mingw32/lib/pkgconfig\npkg-config \$@" > $cachedir/i686-w64-mingw32-pkg-config; fi +set -x +dpkg -L libsdl2-dev +dpkg -L libsdl2-ttf-dev +set +x + chmod +x $cachedir/i686-w64-mingw32-pkg-config sudo cp $cachedir/i686-w64-mingw32-pkg-config /usr/local/bin/ diff --git a/src/audio/audio.c b/src/audio/audio.c index 7531f7b216..07c940768b 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -18,7 +18,9 @@ * along with this program. If not, see . *****************************************************************************/ +#ifdef _WIN32 #include +#endif // _WIN32 #include "../addresses.h" #include "../config.h" @@ -41,11 +43,13 @@ typedef struct { uint32 var_110; uint32 var_114; uint32 var_118; +#ifdef _WIN32 HGLOBAL hmem; // 0x11C HMMIO hmmio; // 0x120 MMCKINFO mmckinfo1; // 0x124 MMCKINFO mmckinfo2; // 0x138 LPDIRECTSOUNDBUFFER dsbuffer; // 0x14C +#endif // _WIN32 uint32 bufsize; // 0x150 uint32 playpos; // 0x154 uint32 var_158; @@ -57,7 +61,9 @@ typedef struct { struct rct_sound_effect { uint32 size; +#ifdef _WIN32 WAVEFORMATEX format; +#endif // _WIN32 uint8* data; }; @@ -73,6 +79,7 @@ void *gCrowdSoundChannel = 0; void *gTitleMusicChannel = 0; bool gGameSoundsOff = false; +#ifdef _WIN32 void audio_timefunc(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2, int channel); int sound_effect_loadvars(struct rct_sound_effect* sound_effect, LPWAVEFORMATEX* waveformat, char** data, DWORD* buffersize); MMRESULT mmio_open(const char* filename, HMMIO* hmmio, HGLOBAL* hmem, LPMMCKINFO mmckinfo); @@ -86,6 +93,7 @@ int sound_fill_buffer(LPDIRECTSOUNDBUFFER dsbuffer, char* src, DWORD size); void sound_channel_free(HMMIO* hmmio, HGLOBAL* hmem); LPVOID map_file(LPCWSTR lpFileName, DWORD dwCreationDisposition, DWORD dwNumberOfBytesToMap); int unmap_file(LPCVOID base); +#endif // _WIN32 void audio_init(int i) { @@ -126,6 +134,7 @@ void audio_get_devices() } } +#ifdef _WIN32 /** * * rct2: 0x00401000 @@ -329,6 +338,7 @@ int CALLBACK audio_timer_callback(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DW } return 0; } +#endif // _WIN32 /** * @@ -336,6 +346,7 @@ int CALLBACK audio_timer_callback(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DW */ int sub_40153B(int channel) { +#ifdef _WIN32 rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; if (sound_channel->var_4) { if (sound_channel->hmmio) { @@ -354,6 +365,9 @@ int sub_40153B(int channel) return 0; } } +#else + STUB(); +#endif // _WIN32 return 1; } @@ -369,6 +383,7 @@ int sub_4015E7(int channel) int buf2size; int read; int zero = 0; +#ifdef _WIN32 rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; int result = dsbuffer->lpVtbl->Lock(dsbuffer, 0, sound_channel->bufsize, (LPVOID*)&buf1, (LPDWORD)&buf1size, (LPVOID*)&buf2, (LPDWORD)&buf2size, 0); @@ -401,6 +416,10 @@ int sub_4015E7(int channel) sound_channel->playpos = 0; } return result; +#else + STUB(); + return 0; +#endif // _WIN32 } /** @@ -409,6 +428,7 @@ int sub_4015E7(int channel) */ int sound_channel_load_file(int channel, const char* filename, int offset) { +#ifdef _WIN32 rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; sound_channel->hmem; sound_channel->hmmio; @@ -441,9 +461,13 @@ int sound_channel_load_file(int channel, const char* filename, int offset) sub_4015E7(channel); sound_channel->var_158 = offset; sound_channel->stopped = 0; +#else + STUB(); +#endif // _WIN32 return 0; } +#ifdef _WIN32 /** * * rct2: 0x00401822 @@ -467,6 +491,7 @@ int mmio_open_channel(int channel, char* filename, LONG offset) sound_channel->var_158 = offset; return 0; } +#endif // _WIN32 /** * @@ -474,6 +499,7 @@ int mmio_open_channel(int channel, char* filename, LONG offset) */ int audio_create_timer() { +#ifdef _WIN32 if (RCT2_GLOBAL(0x009E1AA4, int)) { return 0; } @@ -485,6 +511,9 @@ int audio_create_timer() if (!RCT2_GLOBAL(0x009E1AA0, MMRESULT)) { return 0; } +#else + STUB(); +#endif // _WIN32 RCT2_GLOBAL(0x009E1AA4, int) = 1; return 1; } @@ -498,6 +527,7 @@ int audio_remove_timer() for (int i = 0; i < 4; i++) { sound_channel_stop(i); } +#ifdef _WIN32 if (RCT2_GLOBAL(0x009E1AA4, int)) { timeKillEvent(RCT2_GLOBAL(0x009E1AA0, MMRESULT)); timeEndPeriod(50); @@ -508,6 +538,9 @@ int audio_remove_timer() RCT2_GLOBAL(0x009E1AA4, int) = 0; return result; } +#else + STUB(); +#endif // _WIN32 return 0; } @@ -536,6 +569,7 @@ int sound_channel_load_file2(int channel, const char* filename, int offset) */ int sound_channel_play(int channel, int a2, int volume, int pan, int frequency) { +#ifdef _WIN32 rct_sound_channel* sound_channel = &RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[channel]; sound_channel->var_164 = a2; sound_channel_set_frequency(channel, frequency); @@ -545,6 +579,9 @@ int sound_channel_play(int channel, int a2, int volume, int pan, int frequency) dsbuffer->lpVtbl->SetCurrentPosition(dsbuffer, 0); dsbuffer->lpVtbl->Play(dsbuffer, 0, 0, DSBPLAY_LOOPING); sound_channel->playing = 1; +#else + STUB(); +#endif // _WIN32 return 1; } @@ -554,6 +591,7 @@ int sound_channel_play(int channel, int a2, int volume, int pan, int frequency) */ int sound_channel_stop(int channel) { +#ifdef _WIN32 rct_sound_channel* sound_channel = &RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[channel]; sound_channel->playing = 0; sound_channel->stopped = 1; @@ -571,6 +609,9 @@ int sound_channel_stop(int channel) RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel] = 0; } _InterlockedExchange(&RCT2_GLOBAL(0x009E1AAC, LONG), 0); +#else + STUB(); +#endif // _WIN32 return 1; } @@ -580,12 +621,16 @@ int sound_channel_stop(int channel) */ int sound_channel_set_frequency(int channel, int frequency) { +#ifdef _WIN32 LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; if (dsbuffer) { if (SUCCEEDED(dsbuffer->lpVtbl->SetFrequency(dsbuffer, frequency))) return 1; } +#else + STUB(); +#endif // _WIN32 return 0; } @@ -595,12 +640,16 @@ int sound_channel_set_frequency(int channel, int frequency) */ int sound_channel_set_pan(int channel, int pan) { +#ifdef _WIN32 LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; if (dsbuffer) { if (SUCCEEDED(dsbuffer->lpVtbl->SetPan(dsbuffer, pan))) return 1; } +#else + STUB(); +#endif // _WIN32 return 0; } @@ -610,12 +659,16 @@ int sound_channel_set_pan(int channel, int pan) */ int sound_channel_set_volume(int channel, int volume) { +#ifdef _WIN32 LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; if (dsbuffer) { if (SUCCEEDED(dsbuffer->lpVtbl->SetVolume(dsbuffer, volume))) return 1; } +#else + STUB(); +#endif // _WIN32 return 0; } @@ -668,6 +721,7 @@ int sound_channel_is_playing(int channel) int audio_release() { sound_stop_all(); +#ifdef _WIN32 if (RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)) { RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->Release(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)); RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER) = 0; @@ -682,6 +736,10 @@ int audio_release() RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND) = 0; } return result; +#else + STUB(); + return 0; +#endif // _WIN32 } /** @@ -690,6 +748,7 @@ int audio_release() */ int map_sound_effects(const char* filename) { +#ifdef _WIN32 if (RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID)) { return 0; } else { @@ -698,6 +757,10 @@ int map_sound_effects(const char* filename) free(wcFilename); return RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID) != 0; } +#else + STUB(); + return 0; +#endif // _WIN32 } /** @@ -706,12 +769,16 @@ int map_sound_effects(const char* filename) */ int unmap_sound_effects() { +#ifdef _WIN32 if (RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID)) { sound_stop_all(); unmap_file(RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID)); RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID) = 0; return 1; } +#else + STUB(); +#endif // _WIN32 return 0; } @@ -721,6 +788,7 @@ int unmap_sound_effects() */ int sound_prepare(int sound_id, rct_sound *sound, int channels, int software) { +#ifdef _WIN32 DSBUFFERDESC bufferdesc; char* buffer = 0; memset(&bufferdesc, 0, sizeof(bufferdesc)); @@ -772,6 +840,9 @@ int sound_prepare(int sound_id, rct_sound *sound, int channels, int software) sound->dsbuffer = 0; } } +#else + STUB(); +#endif // _WIN32 return 0; } @@ -781,6 +852,7 @@ int sound_prepare(int sound_id, rct_sound *sound, int channels, int software) */ int sound_duplicate(rct_sound* newsound, rct_sound* sound) { +#ifdef _WIN32 if (FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->DuplicateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), sound->dsbuffer, &newsound->dsbuffer))) { return 0; } else { @@ -790,6 +862,10 @@ int sound_duplicate(rct_sound* newsound, rct_sound* sound) sound_add(newsound); return 1; } +#else + STUB(); + return 1; +#endif // _WIN32 } /** @@ -798,11 +874,15 @@ int sound_duplicate(rct_sound* newsound, rct_sound* sound) */ int sound_stop(rct_sound* sound) { +#ifdef _WIN32 if (sound->dsbuffer) { sound->dsbuffer->lpVtbl->Release(sound->dsbuffer); sound->dsbuffer = 0; return sound_remove(sound) ? 1 : 0; } +#else + STUB(); +#endif // _WIN32 return 0; } @@ -825,6 +905,7 @@ int sound_stop_all() */ void sound_bufferlost_check() { +#ifdef _WIN32 rct_sound* sound = RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_BEGIN, rct_sound*); while (sound && sound != RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_END, rct_sound*)) { DWORD status; @@ -835,6 +916,9 @@ void sound_bufferlost_check() } sound = sound->next; } +#else + STUB(); +#endif // _WIN32 } /** @@ -842,6 +926,7 @@ void sound_bufferlost_check() * rct2: 0x00404E53 */ int sound_is_playing(rct_sound* sound){ +#ifdef _WIN32 if (sound->dsbuffer) { DWORD status; if (SUCCEEDED(sound->dsbuffer->lpVtbl->GetStatus(sound->dsbuffer, &status))) { @@ -850,6 +935,9 @@ int sound_is_playing(rct_sound* sound){ } } +#else + STUB(); +#endif // _WIN32 return 0; } @@ -859,6 +947,7 @@ int sound_is_playing(rct_sound* sound){ */ int sound_play(rct_sound* sound, int looping, int volume, int pan, int frequency) { +#ifdef _WIN32 if (sound->dsbuffer) { sound_set_frequency(sound, frequency); sound_set_pan(sound, pan); @@ -876,6 +965,9 @@ int sound_play(rct_sound* sound, int looping, int volume, int pan, int frequency return 1; } +#else + STUB(); +#endif // _WIN32 return 0; } @@ -885,11 +977,15 @@ int sound_play(rct_sound* sound, int looping, int volume, int pan, int frequency */ int sound_set_frequency(rct_sound* sound, int frequency) { +#ifdef _WIN32 if (sound->dsbuffer) { if (SUCCEEDED(sound->dsbuffer->lpVtbl->SetFrequency(sound->dsbuffer, frequency))) return 1; } +#else + STUB(); +#endif // _WIN32 return 0; } @@ -899,11 +995,15 @@ int sound_set_frequency(rct_sound* sound, int frequency) */ int sound_set_pan(rct_sound* sound, int pan) { +#ifdef _WIN32 if (sound->dsbuffer) { if (SUCCEEDED(sound->dsbuffer->lpVtbl->SetPan(sound->dsbuffer, pan))) return 1; } +#else + STUB(); +#endif // _WIN32 return 0; } @@ -913,11 +1013,15 @@ int sound_set_pan(rct_sound* sound, int pan) */ int sound_set_volume(rct_sound* sound, int volume) { +#ifdef _WIN32 if (sound->dsbuffer) { if (SUCCEEDED(sound->dsbuffer->lpVtbl->SetVolume(sound->dsbuffer, volume))) return 1; } +#else + STUB(); +#endif // _WIN32 return 0; } @@ -927,9 +1031,13 @@ int sound_set_volume(rct_sound* sound, int volume) */ int sound_load3dparameters() { +#ifdef _WIN32 if (SUCCEEDED(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->GetAllParameters(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER), &RCT2_GLOBAL(0x009A6084, DS3DBUFFER)))) { return 1; } +#else + STUB(); +#endif // _WIN32 return 0; } @@ -945,6 +1053,7 @@ int sound_load3dposition() return 0; } +#ifdef _WIN32 /** * * rct2: 0x00404F85 @@ -1017,6 +1126,7 @@ int sound_fill_buffer(LPDIRECTSOUNDBUFFER dsbuffer, char* src, DWORD size) } return 0; } +#endif // _WIN32 /** * @@ -1091,6 +1201,7 @@ rct_sound* sound_remove(rct_sound* sound) */ int sound_bufferlost_restore(rct_sound* sound) { +#ifdef _WIN32 DWORD buffersize = 0; LPWAVEFORMATEX waveformat = 0; char* data = 0; @@ -1102,6 +1213,9 @@ int sound_bufferlost_restore(rct_sound* sound) } } } +#else + STUB(); +#endif // _WIN32 return 0; } @@ -1111,12 +1225,17 @@ int sound_bufferlost_restore(rct_sound* sound) */ struct rct_sound_effect* sound_get_effect(uint16 sound_id) { +#ifdef _WIN32 if (RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID) && sound_id < RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, uint32*)[0]) { return (struct rct_sound_effect*)(RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, int) + RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, uint32*)[sound_id + 1]); } +#else + STUB(); +#endif // _WIN32 return 0; } +#ifdef _WIN32 /** * * rct2: 0x00405222 @@ -1458,6 +1577,7 @@ int get_dsound_devices() } return 0; } +#endif // _WIN32 /** * @@ -1734,6 +1854,7 @@ void stop_title_music() void audio_init1() { int devicenum = 0; +#ifdef _WIN32 if (RCT2_GLOBAL(0x009AAC5C, uint8)) { rct_dsdevice* dsdevice = &RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES, rct_dsdevice*)[0]; while (dsdevice->guid.Data1 != RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_GUID, GUID).Data1 || @@ -1763,6 +1884,9 @@ void audio_init1() } } } +#else + STUB(); +#endif // _WIN32 } /** @@ -1782,7 +1906,12 @@ void audio_init2(int device) other_sound->id = 0xFFFF; } RCT2_GLOBAL(0x014241BC, uint32) = 1; +#ifdef _WIN32 int successdsound = dsound_create_primary_buffer(0, device, 2, 22050, 16); +#else + int successdsound = 0; + STUB(); +#endif // _WIN32 RCT2_GLOBAL(0x014241BC, uint32) = 0; if (!successdsound) { return; @@ -1799,7 +1928,11 @@ void audio_init2(int device) } RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = device; rct_dsdevice dsdevice = RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES, rct_dsdevice*)[device]; +#ifdef _WIN32 RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_GUID, GUID) = dsdevice.guid; +#else + STUB(); +#endif // _WIN32 RCT2_GLOBAL(0x009AAC5C, uint8) = 1; config_save_default(); RCT2_GLOBAL(0x014241BC, uint32) = 1; diff --git a/src/audio/audio.h b/src/audio/audio.h index 648d937ac7..7c6ca1431d 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -21,7 +21,9 @@ #ifndef _AUDIO_H_ #define _AUDIO_H_ +#ifdef _WIN32 #include +#endif // _WIN32 #include "../common.h" #include "../world/sprite.h" @@ -44,16 +46,24 @@ void audio_get_devices(); * Represents a single directsound device. */ typedef struct { +#ifdef _WIN32 GUID guid; char desc[256]; char drvname[256]; +#else + uint8 padding[16+256+256]; +#endif // _WIN32 } rct_dsdevice; /** * Represents a prepared sound. */ typedef struct rct_sound { +#ifdef _WIN32 struct IDirectSoundBuffer *dsbuffer; +#else + void *padding; +#endif // _WIN32 uint16 id; uint16 var_8; int has_caps; @@ -162,15 +172,19 @@ int sound_set_pan(rct_sound* sound, int pan); int sound_set_volume(rct_sound* sound, int volume); int sound_load3dparameters(); int sound_load3dposition(); +#ifdef _WIN32 int dsound_count_devices(); +#endif // _WIN32 rct_sound* sound_begin(); rct_sound* sound_next(rct_sound* sound); rct_sound* sound_add(rct_sound* sound); rct_sound* sound_remove(rct_sound* sound); int sound_bufferlost_restore(rct_sound* sound); struct rct_sound_effect* sound_get_effect(uint16 sound_id); +#ifdef _WIN32 int dsound_create_primary_buffer(int a, int device, int channels, int samples, int bits); int get_dsound_devices(); +#endif // _WIN32 int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z); void stop_completed_sounds(); void start_title_music(); diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index 909347c73b..26470fe369 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -18,7 +18,9 @@ * along with this program. If not, see . *****************************************************************************/ +#ifdef _WIN32 #include +#endif // _WIN32 extern "C" { #include "../config.h" @@ -103,7 +105,11 @@ bool Source_Sample::LoadWAV(const char* filename) if (spec != NULL) { format.freq = spec->freq; +#ifdef _WIN32 format.format = spec->format; +#else + STUB(); +#endif // _WIN32 format.channels = spec->channels; issdlwav = true; } else { @@ -138,11 +144,15 @@ bool Source_Sample::LoadCSS1(const char *filename, unsigned int offset) Uint32 soundsize; SDL_RWread(rw, &soundsize, sizeof(soundsize), 1); length = soundsize; +#ifdef _WIN32 WAVEFORMATEX waveformat; SDL_RWread(rw, &waveformat, sizeof(waveformat), 1); format.freq = waveformat.nSamplesPerSec; format.format = AUDIO_S16LSB; format.channels = waveformat.nChannels; +#else + STUB(); +#endif // _WIN32 data = new (std::nothrow) uint8[length]; if (!data) { log_verbose("Unable to allocate data"); @@ -170,6 +180,7 @@ void Source_Sample::Unload() bool Source_Sample::Convert(AudioFormat format) { +#ifdef _WIN32 if(Source_Sample::format.format != format.format || Source_Sample::format.channels != format.channels || Source_Sample::format.freq != format.freq){ SDL_AudioCVT cvt; if (SDL_BuildAudioCVT(&cvt, Source_Sample::format.format, Source_Sample::format.channels, Source_Sample::format.freq, format.format, format.channels, format.freq) < 0) { @@ -188,6 +199,9 @@ bool Source_Sample::Convert(AudioFormat format) Source_Sample::format = format; return true; } +#else + STUB(); +#endif // _WIN32 return false; } @@ -262,6 +276,7 @@ bool Source_SampleStream::LoadWAV(SDL_RWops* rw) return false; } Uint64 chunkstart = SDL_RWtell(rw); +#ifdef _WIN32 PCMWAVEFORMAT waveformat; SDL_RWread(rw, &waveformat, sizeof(waveformat), 1); SDL_RWseek(rw, chunkstart + fmtchunk_size, RW_SEEK_SET); @@ -283,6 +298,9 @@ bool Source_SampleStream::LoadWAV(SDL_RWops* rw) break; } format.channels = waveformat.wf.nChannels; +#else + STUB(); +#endif // _WIN32 const Uint32 DATA = 0x61746164; Uint32 datachunk_size = FindChunk(rw, DATA); if (!datachunk_size) { @@ -444,6 +462,7 @@ void Mixer::Init(const char* device) { Close(); SDL_AudioSpec want, have; +#ifdef _WIN32 SDL_zero(want); want.freq = 44100; want.format = AUDIO_S16SYS; @@ -455,6 +474,9 @@ void Mixer::Init(const char* device) format.format = have.format; format.channels = have.channels; format.freq = have.freq; +#else + STUB(); +#endif // _WIN32 const char* filename = get_file_path(PATH_ID_CSS1); for (int i = 0; i < countof(css1sources); i++) { Source_Sample* source_sample = new Source_Sample; @@ -567,6 +589,7 @@ void SDLCALL Mixer::Callback(void* arg, uint8* stream, int length) void Mixer::MixChannel(Channel& channel, uint8* data, int length) { +#ifdef _WIN32 if (channel.source && channel.source->Length() > 0 && !channel.done && gConfigSound.sound) { AudioFormat streamformat = channel.source->Format(); int loaded = 0; @@ -710,6 +733,9 @@ void Mixer::MixChannel(Channel& channel, uint8* data, int length) channel.done = true; } } +#else + STUB(); +#endif // _WIN32 } void Mixer::EffectPanS16(Channel& channel, sint16* data, int length) @@ -752,10 +778,14 @@ void Mixer::EffectFadeU8(uint8* data, int length, int startvolume, int endvolume bool Mixer::MustConvert(Source& source) { +#ifdef _WIN32 const AudioFormat sourceformat = source.Format(); if (sourceformat.format != format.format || sourceformat.channels != format.channels || sourceformat.freq != format.freq) { return true; } +#else + STUB(); +#endif // _WIN32 return false; } @@ -880,4 +910,4 @@ void* Mixer_Play_Music(int pathid, int loop, int streaming) } } return 0; -} \ No newline at end of file +} diff --git a/src/audio/mixer.h b/src/audio/mixer.h index 3f592fa6f3..fde3658d73 100644 --- a/src/audio/mixer.h +++ b/src/audio/mixer.h @@ -21,8 +21,15 @@ #ifndef _MIXER_H_ #define _MIXER_H_ +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus #include "../common.h" #include +#include "../platform/platform.h" +#ifdef __cplusplus +} +#endif // __cplusplus #define USE_MIXER @@ -206,11 +213,15 @@ void Mixer_Channel_SetGroup(void* channel, int group); void* Mixer_Play_Music(int pathid, int loop, int streaming); static int DStoMixerVolume(int volume) { return (int)(SDL_MIX_MAXVOLUME * (SDL_pow(10, (float)volume / 2000))); }; +#ifdef _WIN32 static float DStoMixerPan(int pan) { return (((float)pan + -DSBPAN_LEFT) / DSBPAN_RIGHT) / 2; }; +#else +static float DStoMixerPan(int pan) { STUB(); return ((float)pan) / 2; }; +#endif // _WIN32 static double DStoMixerRate(int frequency) { return (double)frequency / 22050; }; #ifdef __cplusplus } #endif -#endif \ No newline at end of file +#endif diff --git a/src/drawing/rect.c b/src/drawing/rect.c index 297dafd849..70894fe0ac 100644 --- a/src/drawing/rect.c +++ b/src/drawing/rect.c @@ -21,6 +21,7 @@ #include "../addresses.h" #include "../common.h" #include "drawing.h" +#include "../platform/platform.h" /** * @@ -324,4 +325,4 @@ void gfx_fill_rect_inset(rct_drawpixelinfo* dpi, short left, short top, short ri } } } -} \ No newline at end of file +} diff --git a/src/hook.c b/src/hook.c index 185d4680b5..0471ad3037 100644 --- a/src/hook.c +++ b/src/hook.c @@ -18,13 +18,17 @@ * along with this program. If not, see . *****************************************************************************/ +#ifdef _WIN32 #include +#endif // _WIN32 #include "hook.h" +#include "platform/platform.h" void* g_hooktableaddress = 0; int g_hooktableoffset = 0; int g_maxhooks = 1000; +#ifdef _WIN32 void hookfunc(int address, int newaddress, int stacksize, int registerargs[], int registersreturned, int eaxDestinationRegister) { int i = 0; @@ -211,9 +215,11 @@ void hookfunc(int address, int newaddress, int stacksize, int registerargs[], in WriteProcessMemory(GetCurrentProcess(), (LPVOID)address, data, i, 0); } +#endif // _WIN32 void addhook(int address, int newaddress, int stacksize, int registerargs[], int registersreturned, int eaxDestinationRegister) { +#ifdef _WIN32 if (!g_hooktableaddress) { g_hooktableaddress = VirtualAllocEx(GetCurrentProcess(), NULL, g_maxhooks * 100, MEM_COMMIT, PAGE_EXECUTE_READWRITE); } @@ -229,4 +235,7 @@ void addhook(int address, int newaddress, int stacksize, int registerargs[], int WriteProcessMemory(GetCurrentProcess(), (LPVOID)address, data, i, 0); hookfunc(hookaddress, newaddress, stacksize, registerargs, registersreturned, eaxDestinationRegister); g_hooktableoffset++; -} \ No newline at end of file +#else + STUB(); +#endif // _WIN32 +} diff --git a/src/localisation/LanguagePack.cpp b/src/localisation/LanguagePack.cpp index 2b1c9953f7..f50ffb3519 100644 --- a/src/localisation/LanguagePack.cpp +++ b/src/localisation/LanguagePack.cpp @@ -2,6 +2,7 @@ extern "C" { #include "../common.h" #include "../util/util.h" #include "localisation.h" + #include "../platform/platform.h" } #include "../core/FileStream.hpp" diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 5149ff66cf..bf532f5639 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -18,6 +18,9 @@ * along with this program. If not, see . *****************************************************************************/ +#ifdef _WIN32 +#include +#endif // _WIN32 #include "../addresses.h" #include "../config.h" #include "../game.h" @@ -848,8 +851,13 @@ int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength) } } +#ifdef _WIN32 MultiByteToWideChar(CP_ACP, 0, src, -1, intermediateBuffer, bufferCount); int result = WideCharToMultiByte(CP_UTF8, 0, intermediateBuffer, -1, dst, maxBufferLength, NULL, NULL); +#else + STUB(); + int result = 0; +#endif // _WIN32 if (heapBuffer != NULL) { free(heapBuffer); diff --git a/src/network/http.h b/src/network/http.h index ffc051a235..57454af491 100644 --- a/src/network/http.h +++ b/src/network/http.h @@ -1,6 +1,7 @@ #ifndef _HTTP_H_ #define _HTTP_H_ +#ifndef DISABLE_HTTP #include #include "../common.h" @@ -9,10 +10,13 @@ typedef struct { json_t *root; } http_json_response; -void http_init(); -void http_dispose(); http_json_response *http_request_json(const char *url); void http_request_json_async(const char *url, void (*callback)(http_json_response*)); void http_request_json_dispose(http_json_response *response); +#endif // DISABLE_HTTP + +// These callbacks are defined anyway, but are dummy if HTTP is disabled +void http_init(); +void http_dispose(); #endif diff --git a/src/network/network.cpp b/src/network/network.cpp index 304e286999..ba16e7da5e 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -18,7 +18,9 @@ * along with this program. If not, see . *****************************************************************************/ -#include +extern "C" { +#include "../platform/platform.h" +} #include "network.h" diff --git a/src/network/network.h b/src/network/network.h index a5de8b6f99..85652193f6 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -44,6 +44,10 @@ extern "C" { #ifndef DISABLE_NETWORK +#ifdef _WIN32 +#include +#endif // _WIN32 + enum { NETWORK_AUTH_NONE, NETWORK_AUTH_REQUESTED, diff --git a/src/openrct2.c b/src/openrct2.c index 2778948fef..d2df37bac4 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -62,7 +62,7 @@ static void openrct2_copy_files_over(const utf8 *originalDirectory, const utf8 * utf8 *ch, filter[MAX_PATH], oldPath[MAX_PATH], newPath[MAX_PATH]; int fileEnumHandle; file_info fileInfo; - + if (!platform_ensure_directory_exists(newDirectory)) { log_error("Could not create directory %s.", newDirectory); return; @@ -80,7 +80,7 @@ static void openrct2_copy_files_over(const utf8 *originalDirectory, const utf8 * while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) { strcpy(newPath, newDirectory); strcat(newPath, fileInfo.path); - + strcpy(oldPath, originalDirectory); ch = strchr(oldPath, '*'); if (ch != NULL) @@ -115,6 +115,7 @@ static void openrct2_copy_files_over(const utf8 *originalDirectory, const utf8 * // TODO move to platform static void openrct2_set_exe_path() { +#ifdef _WIN32 wchar_t exePath[MAX_PATH]; wchar_t tempPath[MAX_PATH]; wchar_t *exeDelimiter; @@ -127,6 +128,16 @@ static void openrct2_set_exe_path() tempPath[exeDelimiterIndex] = L'\0'; _wfullpath(exePath, tempPath, MAX_PATH); WideCharToMultiByte(CP_UTF8, 0, exePath, countof(exePath), gExePath, countof(gExePath), NULL, NULL); +#else + char exePath[MAX_PATH]; + ssize_t bytesRead; + bytesRead = readlink("/proc/self/exe", exePath, MAX_PATH); + if (bytesRead == -1) { + log_fatal("failed to read /proc/self/exe"); + } + exePath[MAX_PATH - 1] = '\0'; + strncpy(gExePath, exePath, MAX_PATH); +#endif // _WIN32 } /** @@ -179,7 +190,11 @@ bool openrct2_initialise() if (!gOpenRCT2Headless) { audio_init(); audio_get_devices(); +#ifdef _WIN32 get_dsound_devices(); +#else + STUB(); +#endif // _WIN32 } language_open(gConfigGeneral.language); http_init(); @@ -331,7 +346,7 @@ static void openrct2_loop() _spritelocations1[i].y = g_sprite_list[i].unknown.y; _spritelocations1[i].z = g_sprite_list[i].unknown.z; } - + // Update the game so the sprite positions update rct2_update(); diff --git a/src/platform/platform.h b/src/platform/platform.h index 55ef8a5461..23934c5661 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -17,11 +17,13 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ - + #ifndef _PLATFORM_H_ #define _PLATFORM_H_ +#ifdef _WIN32 #define HAVE_MATH_H +#endif // _WIN32 #include @@ -136,6 +138,26 @@ uint8 platform_get_locale_temperature_format(); int windows_get_registry_install_info(rct2_install_info *installInfo, char *source, char *font, uint8 charset); HWND windows_get_window_handle(); -#endif +#endif // _WIN32 -#endif \ No newline at end of file +#ifdef __linux__ +#include +#include +#define STUB() log_warning("Function %s at %s:%d is a stub.\n", __PRETTY_FUNCTION__, __FILE__, __LINE__) +#define _strcmpi _stricmp +#define _stricmp(x, y) strcasecmp((x), (y)) +#define _strnicmp(x, y, n) strncasecmp((x), (y), (n)) + +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define RCT2_ENDIANESS __ORDER_LITTLE_ENDIAN__ +#define LOBYTE(w) ((uint8_t)(w)) +#define HIBYTE(w) ((uint8_t)(((uint16_t)(w)>>8)&0xFF)) +#endif // __BYTE_ORDER__ + +#ifndef RCT2_ENDIANESS +#error Unknown endianess! +#endif // RCT2_ENDIANESS + +#endif // __linux__ + +#endif diff --git a/src/platform/shared.c b/src/platform/shared.c index a80dffaa05..dc48f40c8c 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -736,6 +736,7 @@ void platform_set_cursor(char cursor) static void platform_load_cursors() { RCT2_GLOBAL(0x14241BC, uint32) = 2; +#ifdef _WIN32 HINSTANCE hInst = RCT2_GLOBAL(RCT2_ADDRESS_HINSTANCE, HINSTANCE); RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_ARROW, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x74)); RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_BLANK, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0xA1)); @@ -764,6 +765,9 @@ static void platform_load_cursors() RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_ENTRANCE_DOWN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0x9F)); RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_HAND_OPEN, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0xA6)); RCT2_GLOBAL(RCT2_ADDRESS_HCURSOR_HAND_CLOSED, HCURSOR) = LoadCursor(hInst, MAKEINTRESOURCE(0xA5)); +#else + STUB(); +#endif // _WIN32 _cursors[0] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW); _cursors[1] = SDL_CreateCursor(blank_cursor_data, blank_cursor_mask, 32, 32, BLANK_CURSOR_HOTX, BLANK_CURSOR_HOTY); diff --git a/src/rct2.c b/src/rct2.c index d432f5d692..e59d65d098 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -333,6 +333,7 @@ int check_files_integrity() { int i; const char *path; +#ifdef _WIN32 HANDLE file; WIN32_FIND_DATA find_data; @@ -350,6 +351,9 @@ int check_files_integrity() FindClose(file); } +#else + STUB(); +#endif // _WIN32 return 1; } @@ -439,6 +443,7 @@ const utf8 *get_file_path(int pathId) */ void get_system_info() { +#ifdef _WIN32 OSVERSIONINFO versionInfo; SYSTEM_INFO sysInfo; MEMORYSTATUS memInfo; @@ -450,10 +455,12 @@ void get_system_info() RCT2_GLOBAL(RCT2_ADDRESS_OS_MINOR_VERSION, uint32) = versionInfo.dwMinorVersion; RCT2_GLOBAL(RCT2_ADDRESS_OS_BUILD_NUMBER, uint32) = versionInfo.dwBuildNumber; } else { +#endif // _WIN32 RCT2_GLOBAL(RCT2_ADDRESS_OS_PLATFORM_ID, uint32) = -1; RCT2_GLOBAL(RCT2_ADDRESS_OS_MAJOR_VERSION, uint32) = 0; RCT2_GLOBAL(RCT2_ADDRESS_OS_MINOR_VERSION, uint32) = 0; RCT2_GLOBAL(RCT2_ADDRESS_OS_BUILD_NUMBER, uint32) = 0; +#ifdef _WIN32 } GetSystemInfo(&sysInfo); @@ -494,6 +501,9 @@ void get_system_info() RCT2_GLOBAL(0x1423C18, sint32) = 1; RCT2_GLOBAL(0x01423C20, uint32) = (SDL_HasMMX() == SDL_TRUE); +#else + STUB(); +#endif // _WIN32 } @@ -503,6 +513,7 @@ void get_system_info() */ void get_system_time() { +#ifdef _WIN32 SYSTEMTIME systime; GetSystemTime(&systime); @@ -510,6 +521,9 @@ void get_system_time() RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_MONTH, sint16) = systime.wMonth; RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_YEAR, sint16) = systime.wYear; RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_DAYOFWEEK, sint16) = systime.wDayOfWeek; +#else + STUB(); +#endif // _WIN32 } /** @@ -518,11 +532,15 @@ void get_system_time() */ void get_local_time() { +#ifdef _WIN32 SYSTEMTIME systime; GetLocalTime(&systime); RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_HOUR, sint16) = systime.wHour; RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_MINUTE, sint16) = systime.wMinute; +#else + STUB(); +#endif // _WIN32 } /** diff --git a/src/util/util.c b/src/util/util.c index f96fa54731..f17ac3f424 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -20,6 +20,7 @@ #include "util.h" #include +#include "../platform/platform.h" int squaredmetres_to_squaredfeet(int squaredMetres) { From e4b7785bdd5dd8975d336cb3b93fc6d56cc9ed21 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 19 Sep 2015 04:00:15 +0100 Subject: [PATCH 0697/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 71 +++++++++++++++++++++++++++ data/language/korean.txt | 43 ++++++++++++++++ 2 files changed, 114 insertions(+) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 9b0031da4a..956519123d 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3887,6 +3887,7 @@ STR_5544 :{SMALLFONT}{BLACK}明紅色 STR_5545 :{SMALLFONT}{BLACK}暗粉紅色 STR_5546 :{SMALLFONT}{BLACK}明粉紅色 STR_5547 :{SMALLFONT}{BLACK}淺粉紅色 +STR_5548 :顯示所有運作模式 ##################### @@ -3920,6 +3921,76 @@ STR_NAME :流線型單軌電車 STR_DESC :大載客量的單軌電車, 車頭車尾都配備著流線型設計 STR_CPTY :每車卡5或10個乘客 +[MONO2] +STR_NAME :小型單軌電車 +STR_DESC :附有開放式側邊的小型單軌電車 +STR_CPTY :每車卡4個乘客 + +[MONO3] +STR_NAME :懷舊風格單軌電車 +STR_DESC :使用開放式設計車廂的單軌電車 +STR_CPTY :每車卡4個乘客 + +[NRL] +STR_NAME :蒸氣火車 +STR_DESC :配備著復刻蒸氣火車頭及煤水車的小型蒸氣火車, 拉著開放式的木製車廂 +STR_CPTY :每車廂6個乘客 + +[NRL2] +STR_NAME :有蓋蒸氣火車 +STR_DESC :配備著復刻蒸氣火車頭及煤水車的小型蒸氣火車, 拉著帶有織布車頂的木製車廂 +STR_CPTY :每車廂6個乘客 + +[SMONO] +STR_NAME :懸掛式單軌電車 +STR_DESC :大載客量的單軌電車 +STR_CPTY :每車卡8個乘客 + +[TRAM1] +STR_NAME :電車Trams +STR_DESC :復刻的懷舊電車 +STR_CPTY :每車卡10個乘客 + +[4X4] +STR_NAME :怪獸卡車 +STR_DESC :能爬上陡斜坡道, 而且帶有動力的巨型4 x 4卡車 +STR_CPTY :每卡車2個乘客 + +[CHBUILD] +STR_NAME :古怪屋 +STR_DESC :一座建築物, 含有扭曲房間及傾斜走道使人於行走中失去方向感 +STR_CPTY :5個遊客 + +[CIRCUS1] +STR_NAME :馬戲團 +STR_DESC :於大型帳幕內進行動物馬戲團表演 +STR_CPTY :30個遊客 + +[CTCAR] +STR_NAME :笑臉貓遊 +STR_DESC :帶有動力的貓班車輛跟隨著軌道的路線遊覽周邊 +STR_CPTY :每輛車2個乘客 + +[DODG1] +STR_NAME :碰碰車 +STR_DESC :自助駕駛的電力碰碰車 +STR_CPTY :每車輛1個乘客 + +[FSAUC] +STR_NAME :碰碰飛碟 +STR_DESC :自助駕駛的飛碟型車輛 +STR_CPTY :每飛碟1個乘客 + +[FWH1] +STR_NAME :摩天輪 +STR_DESC :不斷旋轉, 附有露天座椅的巨大輪環 +STR_CPTY :32乘客 + +[GOLF1] +STR_NAME :迷你高爾夫 +STR_DESC :一個溫和的迷你高爾夫遊戲 +STR_CPTY : + #WW [CONDORRD] STR_NAME :神鷹暢遊 diff --git a/data/language/korean.txt b/data/language/korean.txt index 8bb45f7060..0d6646e520 100644 --- a/data/language/korean.txt +++ b/data/language/korean.txt @@ -3852,3 +3852,46 @@ STR_5512 :다른 이름으로 저장 STR_5513 :(간편) 게임 저장 STR_5514 :기물 파손 끄기 STR_5515 :{SMALLFONT}{BLACK}손님이 화가 났을 때 기물을 파손하지 않도록 설정합니다 +STR_5516 :{SMALLFONT}{BLACK}검은색 +STR_5517 :{SMALLFONT}{BLACK}회색 +STR_5518 :{SMALLFONT}{BLACK}흰색 +STR_5519 :{SMALLFONT}{BLACK}어두운 보라색 +STR_5520 :{SMALLFONT}{BLACK}보라색 +STR_5521 :{SMALLFONT}{BLACK}밝은 보라색 +STR_5522 :{SMALLFONT}{BLACK}어두운 파란색 +STR_5523 :{SMALLFONT}{BLACK}밝은 파란색 +STR_5524 :{SMALLFONT}{BLACK}아이시 블루 +STR_5525 :{SMALLFONT}{BLACK}틸 +STR_5526 :{SMALLFONT}{BLACK}아쿠아마린 +STR_5527 :{SMALLFONT}{BLACK}짙은 녹색 +STR_5528 :{SMALLFONT}{BLACK}어두운 녹색 +STR_5529 :{SMALLFONT}{BLACK}모스 그린 +STR_5530 :{SMALLFONT}{BLACK}밝은 녹색 +STR_5531 :{SMALLFONT}{BLACK}올리브 그린 +STR_5532 :{SMALLFONT}{BLACK}어두운 올리브 그린 +STR_5533 :{SMALLFONT}{BLACK}밝은 노란색 +STR_5534 :{SMALLFONT}{BLACK}노란색 +STR_5535 :{SMALLFONT}{BLACK}어두운 노란색 +STR_5536 :{SMALLFONT}{BLACK}밝은 주황색 +STR_5537 :{SMALLFONT}{BLACK}어두운 주황색 +STR_5538 :{SMALLFONT}{BLACK}밝은 갈색 +STR_5539 :{SMALLFONT}{BLACK}짙은 갈색 +STR_5540 :{SMALLFONT}{BLACK}어두운 갈색 +STR_5541 :{SMALLFONT}{BLACK}살몬 핑크 +STR_5542 :{SMALLFONT}{BLACK}보르도 레드 +STR_5543 :{SMALLFONT}{BLACK}짙은 빨간색 +STR_5544 :{SMALLFONT}{BLACK}밝은 빨간색 +STR_5545 :{SMALLFONT}{BLACK}어두운 분홍색 +STR_5546 :{SMALLFONT}{BLACK}밝은 분홍색 +STR_5547 :{SMALLFONT}{BLACK}분홍색 +STR_5548 :모든 운행 모드 보이기 + +##################### +# Rides/attractions # +##################### + +#WW +[CONDORRD] +STR_NAME :콘도르 라이드 +STR_DESC :트랙 아래를 달리는 특별한 차량에 탑승한 승객들은 콘도르 모양의 열차 안에서 공중으로 떨어지며 하늘을 나는 기분을 경험하게 됩니다. +STR_CPTY :차량당 4명의 승객 From e0860bc3aba43aa6bb7df1fc12125d2a709c2fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sat, 19 Sep 2015 09:29:39 +0200 Subject: [PATCH 0698/1173] Make file paths use platform-specific separators --- src/rct2.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/rct2.c b/src/rct2.c index e59d65d098..f0f5224f8f 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -153,25 +153,41 @@ int rct2_init_directories() } } + char separator[] = {platform_get_path_separator(), 0}; + strcpy(RCT2_ADDRESS(RCT2_ADDRESS_APP_PATH, char), gConfigGeneral.game_path); strcpy(RCT2_ADDRESS(RCT2_ADDRESS_APP_PATH_SLASH, char), RCT2_ADDRESS(RCT2_ADDRESS_APP_PATH, char)); - strcat(RCT2_ADDRESS(RCT2_ADDRESS_APP_PATH_SLASH, char), "\\"); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_APP_PATH_SLASH, char), separator); strcpy(RCT2_ADDRESS(RCT2_ADDRESS_SAVED_GAMES_PATH, char), RCT2_ADDRESS(RCT2_ADDRESS_APP_PATH, char)); - strcat(RCT2_ADDRESS(RCT2_ADDRESS_SAVED_GAMES_PATH, char), "\\Saved Games\\"); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_SAVED_GAMES_PATH, char), separator); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_SAVED_GAMES_PATH, char), "Saved Games"); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_SAVED_GAMES_PATH, char), separator); strcpy(RCT2_ADDRESS(RCT2_ADDRESS_SCENARIOS_PATH, char), RCT2_ADDRESS(RCT2_ADDRESS_APP_PATH, char)); - strcat(RCT2_ADDRESS(RCT2_ADDRESS_SCENARIOS_PATH, char), "\\Scenarios\\*.SC6"); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_SCENARIOS_PATH, char), separator); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_SCENARIOS_PATH, char), "Scenarios"); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_SCENARIOS_PATH, char), separator); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_SCENARIOS_PATH, char), "*.SC6"); strcpy(RCT2_ADDRESS(RCT2_ADDRESS_LANDSCAPES_PATH, char), RCT2_ADDRESS(RCT2_ADDRESS_APP_PATH, char)); - strcat(RCT2_ADDRESS(RCT2_ADDRESS_LANDSCAPES_PATH, char), "\\Landscapes\\*.SC6"); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_LANDSCAPES_PATH, char), separator); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_LANDSCAPES_PATH, char), "Landscapes"); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_LANDSCAPES_PATH, char), separator); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_LANDSCAPES_PATH, char), "*.SC6"); strcpy(RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), RCT2_ADDRESS(RCT2_ADDRESS_APP_PATH, char)); - strcat(RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), "\\ObjData\\*.DAT"); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), separator); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), "ObjData"); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), separator); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), "*.DAT"); strcpy(RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), RCT2_ADDRESS(RCT2_ADDRESS_APP_PATH, char)); - strcat(RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), "\\Tracks\\*.TD?"); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), separator); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), "Tracks"); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), separator); + strcat(RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), "*.TD?"); strcpy(RCT2_ADDRESS(RCT2_ADDRESS_SAVED_GAMES_PATH_2, char), RCT2_ADDRESS(RCT2_ADDRESS_SAVED_GAMES_PATH, char)); return 1; @@ -413,7 +429,7 @@ const utf8 *get_file_path(int pathId) strcpy(path, gConfigGeneral.game_path); // Make sure base path is terminated with a slash - if (strlen(path) == 0 || path[strlen(path) - 1] != '\\') + if (strlen(path) == 0 || path[strlen(path) - 1] != platform_get_path_separator()) { if (strlen(path) >= MAX_PATH - 1) { @@ -422,7 +438,8 @@ const utf8 *get_file_path(int pathId) return path; } - strcat(path, "\\"); + char separator[] = {platform_get_path_separator(), 0}; + strcat(path, separator); } // Concatenate file path From 0bef4f3467f083c35f218ae5d576eeddd45dd7c2 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 20 Sep 2015 04:00:15 +0100 Subject: [PATCH 0699/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/german.txt | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/data/language/german.txt b/data/language/german.txt index d7ec6d63b3..13422737f0 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3849,3 +3849,36 @@ STR_5512 :Spiel speichern unter STR_5513 :Schnellspeichern STR_5514 :Vandalismus deaktivieren STR_5515 :{SMALLFONT}{BLACK}Verhindert Vandalismus durch{NEWLINE}verärgerte Besucher +STR_5516 :{SMALLFONT}{BLACK}Schwarz +STR_5517 :{SMALLFONT}{BLACK}Grau +STR_5518 :{SMALLFONT}{BLACK}Weiß +STR_5519 :{SMALLFONT}{BLACK}Dunkelviolett +STR_5520 :{SMALLFONT}{BLACK}Hellviolett +STR_5521 :{SMALLFONT}{BLACK}Lila +STR_5522 :{SMALLFONT}{BLACK}Dunkelblau +STR_5523 :{SMALLFONT}{BLACK}Hellblau +STR_5524 :{SMALLFONT}{BLACK}Himmelblau +STR_5525 :{SMALLFONT}{BLACK}Blaugrün +STR_5526 :{SMALLFONT}{BLACK}Aquamarinblau +STR_5527 :{SMALLFONT}{BLACK}Gesättigtes Grün +STR_5528 :{SMALLFONT}{BLACK}Dunkelgrün +STR_5529 :{SMALLFONT}{BLACK}Moosgrün +STR_5530 :{SMALLFONT}{BLACK}Hellgrün +STR_5531 :{SMALLFONT}{BLACK}Olivgrün +STR_5532 :{SMALLFONT}{BLACK}Dunkles Olivgrün +STR_5533 :{SMALLFONT}{BLACK}Hellgelb +STR_5534 :{SMALLFONT}{BLACK}Gelb +STR_5535 :{SMALLFONT}{BLACK}Dunkelgelb +STR_5536 :{SMALLFONT}{BLACK}Orange +STR_5537 :{SMALLFONT}{BLACK}Dunkelorange +STR_5538 :{SMALLFONT}{BLACK}Hellbraun +STR_5539 :{SMALLFONT}{BLACK}Gesättigtes Braun +STR_5540 :{SMALLFONT}{BLACK}Dunkelbraun +STR_5541 :{SMALLFONT}{BLACK}Lachsrosa +STR_5542 :{SMALLFONT}{BLACK}Bordeauxrot +STR_5543 :{SMALLFONT}{BLACK}Gesättigtes Rot +STR_5544 :{SMALLFONT}{BLACK}Hellrot +STR_5545 :{SMALLFONT}{BLACK}Dunkelrosa +STR_5546 :{SMALLFONT}{BLACK}Leuchtendes Rosa +STR_5547 :{SMALLFONT}{BLACK}Hellrosa +STR_5548 :Alle Betriebsmodi anzeigen From 5b99a587d511d27f9d5ba6a1ab7e53fc3794e6f5 Mon Sep 17 00:00:00 2001 From: FlynnsPixel Date: Sun, 20 Sep 2015 17:44:20 +1000 Subject: [PATCH 0700/1173] Stopped infinite loop in boat_hire_return_point --- src/ride/ride.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index be387edeb8..5ff8e7e958 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4100,12 +4100,17 @@ bool ride_check_start_and_end_is_station(rct_xy_element *input, rct_xy_element * */ void ride_set_boat_hire_return_point(rct_ride *ride, rct_xy_element *startElement) { - int trackType; + int trackType = -1; int returnX = startElement->x; int returnY = startElement->y; + int startX = returnX; + int startY = returnY; rct_map_element *returnTrackElement = startElement->element; track_begin_end trackBeginEnd; while (track_block_get_previous(returnX, returnY, returnTrackElement, &trackBeginEnd)) { + // If previous track is back to the starting x, y, then break loop (otherwise possible infinite loop) + if (trackType != -1 && startX == trackBeginEnd.begin_x && startY == trackBeginEnd.begin_y) break; + int x = trackBeginEnd.begin_x; int y = trackBeginEnd.begin_y; int z = trackBeginEnd.begin_z; From 48ef64c9133bf719fd93d80b9dfa2adad8f67d24 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 20 Sep 2015 11:47:01 +0200 Subject: [PATCH 0701/1173] Take out MinGW error preventing Linux from being detected. --- CMakeLists_mingw.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/CMakeLists_mingw.txt b/CMakeLists_mingw.txt index b694795580..335da5da77 100644 --- a/CMakeLists_mingw.txt +++ b/CMakeLists_mingw.txt @@ -1,5 +1,3 @@ -SET(CMAKE_SYSTEM_NAME Windows) - SET(COMPILER_PREFIX i686-w64-mingw32) SET(CMAKE_C_COMPILER ${COMPILER_PREFIX}-gcc) SET(CMAKE_CXX_COMPILER ${COMPILER_PREFIX}-c++) From c86f07bbba61b4cdf16bdb0270c3793b6cab6c66 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 20 Sep 2015 12:02:09 +0200 Subject: [PATCH 0702/1173] Fix Travis --- CMakeLists_mingw.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CMakeLists_mingw.txt b/CMakeLists_mingw.txt index 335da5da77..69361d4f96 100644 --- a/CMakeLists_mingw.txt +++ b/CMakeLists_mingw.txt @@ -1,3 +1,6 @@ +SET(ACTUAL_SYSTEM ${CMAKE_SYSTEM_NAME}) +SET(CMAKE_SYSTEM_NAME Windows) + SET(COMPILER_PREFIX i686-w64-mingw32) SET(CMAKE_C_COMPILER ${COMPILER_PREFIX}-gcc) SET(CMAKE_CXX_COMPILER ${COMPILER_PREFIX}-c++) @@ -10,11 +13,11 @@ SET(PKG_CONFIG_EXECUTABLE ${COMPILER_PREFIX}-pkg-config) # set(CMAKE_C_FLAGS "-masm=intel -std=gnu99 -fpack-struct=1" CACHE STRING "" FORCE) set(CMAKE_CXX_FLAGS "-masm=intel -std=c++0x -std=gnu++0x -fpack-struct=1" CACHE STRING "" FORCE) -if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") +if(${ACTUAL_SYSTEM} MATCHES "Linux") set(CMAKE_SHARED_LINKER_FLAGS "-O3 -static-libgcc -static-libstdc++ -static -lpthread" CACHE STRING "" FORCE) else() set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++" CACHE STRING "" FORCE) -endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") +endif(${ACTUAL_SYSTEM} MATCHES "Linux") # find and include SDL2 INCLUDE(FindPkgConfig) From 4ce0e3a8b23c1087d6d830a17c31953943031e45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 4 Aug 2015 22:39:44 +0200 Subject: [PATCH 0703/1173] Linux platform file Add bulk of the platform file for linux, change the compilation target from shared library to executable for linux, provide necessary changes to make it compile & load the stub of a process. Make sure functions are marked as stubs where needed, and implementation is expected. --- CMakeLists.txt | 21 +- install.sh | 2 +- src/audio/audio.c | 11 +- src/diagnostic.c | 2 +- src/diagnostic.h | 2 +- src/drawing/string.c | 25 +- src/localisation/localisation.c | 7 +- src/object.c | 24 +- src/object.h | 8 +- src/object_list.c | 37 +- src/openrct2.c | 15 +- src/platform/linux.c | 759 ++++++++++++++++++++++++++++++++ src/platform/platform.h | 1 + src/platform/unix.c | 10 +- src/rct2.h | 12 +- 15 files changed, 864 insertions(+), 72 deletions(-) create mode 100644 src/platform/linux.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 14b4af5259..de942e7807 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,8 +36,8 @@ if (DISABLE_NETWORK) add_definitions(-DDISABLE_NETWORK) endif (DISABLE_NETWORK) -set(ORCTLIBS_INCLUDE /usr/local/cross-tools/orctlibs/include) -set(JANSSON_INCLUDE /usr/local/cross-tools/orctlibs/include/jansson) +set(ORCTLIBS_INCLUDE /usr/local/cross-tools/orctlibs/include) +set(JANSSON_INCLUDE /usr/local/cross-tools/orctlibs/include/jansson) set(ORCTLIBS_LIB_DIR /usr/local/cross-tools/orctlibs/lib) set(ORCTLIBS_LIB jansson curl ssl crypto) @@ -50,8 +50,8 @@ file(GLOB_RECURSE ORCT2_SOURCES "src/*.c" "src/*.cpp" "lib/*.c") if (UNIX) # force 32bit build for now and set necessary flags to compile code as is - set(CMAKE_C_FLAGS "-m32 -masm=intel -std=gnu99") - set(CMAKE_CXX_FLAGS "-m32 -std=gnu++11 -masm=intel") + set(CMAKE_C_FLAGS "-m32 -masm=intel -fvar-tracking-assignments -std=gnu99") + set(CMAKE_CXX_FLAGS "-m32 -std=gnu++11 -fvar-tracking-assignments -masm=intel") set(LIB32 /usr/lib32) set(CMAKE_SHARED_LINKER_FLAGS "-m32 -Wl,-melf_i386 -L${LIB32} -lSDL2_ttf") set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}) @@ -62,11 +62,15 @@ if (UNIX) INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS}) endif (UNIX) -INCLUDE_DIRECTORIES(${ORCTLIBS_INCLUDE} ${JANSSON_INCLUDE}) -LINK_DIRECTORIES(${SDL2_LIBRARY_DIRS} ${ORCTLIBS_LIB_DIR}) +if (WIN32) + # build as library for now, replace with add_executable + add_library(${PROJECT} SHARED ${ORCT2_SOURCES}) +else (WIN32) + add_executable(${PROJECT} ${ORCT2_SOURCES}) +endif (WIN32) -# build as library for now, replace with add_executable -add_library(${PROJECT} SHARED ${ORCT2_SOURCES}) +INCLUDE_DIRECTORIES(${ORCTLIBS_INCLUDE} ${JANSSON_INCLUDE}) +LINK_DIRECTORIES(${LINK_DIRECTORIES} ${LIB32} ${SDL2_LIBRARY_DIRS} ${ORCTLIBS_LIB_DIR}) # install into ${CMAKE_INSTALL_PREFIX}/bin/ #install (TARGETS ${PROJECT} DESTINATION bin) @@ -79,4 +83,3 @@ TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB}) if (WIN32) target_link_libraries(${PROJECT} winmm.lib -limm32 -lversion -ldsound ws2_32) endif (WIN32) - diff --git a/install.sh b/install.sh index 06fdc181b3..1400804253 100755 --- a/install.sh +++ b/install.sh @@ -87,7 +87,7 @@ elif [[ `uname` == "Linux" ]]; then apt-cache search libsdl2 apt-cache policy libsdl2-dev:i386 apt-cache policy libsdl2-dev - sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386 gcc-4.8 pkg-config:i386 g++-4.8-multilib gcc-4.8-multilib libjansson-dev:i386 libspeex-dev:i386 libspeexdsp-dev:i386 + sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386 gcc-4.8 pkg-config:i386 g++-4.8-multilib gcc-4.8-multilib libjansson-dev:i386 libspeex-dev:i386 libspeexdsp-dev:i386 libcurl4-openssl-dev:i386 libcrypto++-dev:i386 export CC=gcc-4.8 export CXX=g++-4.8 fi diff --git a/src/audio/audio.c b/src/audio/audio.c index 07c940768b..a919d9b241 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -556,7 +556,8 @@ int sound_channel_load_file2(int channel, const char* filename, int offset) if (sound_channel_is_playing(channel)) { sound_channel_stop(channel); } - if (SUCCEEDED(sound_channel_load_file(channel, filename, offset))) { + int load_result = sound_channel_load_file(channel, filename, offset); + if (load_result >= 0) { RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[channel].var_4 = 0; return 1; } @@ -961,7 +962,7 @@ int sound_play(rct_sound* sound, int looping, int volume, int pan, int frequency } else { playflags = 0; } - if (SUCCEEDED(sound->dsbuffer->lpVtbl->Play(sound->dsbuffer, 0, 0, playflags))) + if (SUCCEEDED(sound->dsbuffer->lpVtbl->Play(sound->dsbuffer, 0, 0, playflags))) return 1; } @@ -1497,7 +1498,7 @@ int dsound_create_primary_buffer(int a, int device, int channels, int samples, i if (FAILED(DirectSoundCreate(&dsdevice->guid, &RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), 0))) { return 0; } - if (FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->SetCooperativeLevel(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), windows_get_window_handle(), DSSCL_NORMAL)) || + if (FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->SetCooperativeLevel(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), windows_get_window_handle(), DSSCL_NORMAL)) || FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->CreateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), &bufferdesc, &RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER), 0))) { RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->Release(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)); RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND) = 0; diff --git a/src/diagnostic.c b/src/diagnostic.c index d2d06d5f7d..4d756348a8 100644 --- a/src/diagnostic.c +++ b/src/diagnostic.c @@ -79,4 +79,4 @@ void diagnostic_log_with_location(int diagnosticLevel, const char *file, const c // Line terminator fprintf(stream, "\n"); -} \ No newline at end of file +} diff --git a/src/diagnostic.h b/src/diagnostic.h index 21029db312..556ff98324 100644 --- a/src/diagnostic.h +++ b/src/diagnostic.h @@ -57,4 +57,4 @@ void diagnostic_log_with_location(int diagnosticLevel, const char *file, const c #endif -#endif \ No newline at end of file +#endif diff --git a/src/drawing/string.c b/src/drawing/string.c index fcca4343e2..3a11a1cdef 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -22,6 +22,7 @@ #include "../localisation/localisation.h" #include "../sprites.h" #include "../world/map.h" +#include "../platform/platform.h" #include "drawing.h" static int ttf_get_string_width(const utf8 *text); @@ -353,7 +354,7 @@ void gfx_draw_string_centred(rct_drawpixelinfo *dpi, int format, int x, int y, i } /** - * + * * rct2: 0x006C1E53 * dpi (edi) * args (esi) @@ -407,7 +408,7 @@ int gfx_draw_string_centred_wrapped(rct_drawpixelinfo *dpi, void *args, int x, i } /** - * + * * rct2: 0x006C2105 * dpi (edi) * args (esi) @@ -441,7 +442,7 @@ int gfx_draw_string_left_wrapped(rct_drawpixelinfo *dpi, void *args, int x, int gfx_draw_string(dpi, buffer, 0xFE, x, lineY); buffer = get_string_end(buffer) + 1; lineY += lineHeight; - } + } return lineY - y; } @@ -492,7 +493,7 @@ void colour_char(uint8 colour, uint16* current_font_flags, uint8* palette_pointe if (!(*current_font_flags & 2)) { eax = eax & 0x0FF0000FF; } - // Adjust text palette. Store current colour? + // Adjust text palette. Store current colour? palette_pointer[1] = eax & 0xFF; palette_pointer[2] = (eax >> 8) & 0xFF; palette_pointer[3] = (eax >> 16) & 0xFF; @@ -512,7 +513,7 @@ void colour_char_window(uint8 colour, uint16* current_font_flags,uint8* palette_ if (*current_font_flags & 2) { eax |= 0x0A0A00; } - //Adjust text palette. Store current colour? + //Adjust text palette. Store current colour? palette_pointer[1] = eax & 0xFF; palette_pointer[2] = (eax >> 8) & 0xFF; palette_pointer[3] = (eax >> 16) & 0xFF; @@ -521,7 +522,7 @@ void colour_char_window(uint8 colour, uint16* current_font_flags,uint8* palette_ } /** - * + * * rct2: 0x00682702 * dpi (edi) * buffer (esi) @@ -712,7 +713,7 @@ void gfx_draw_string_centred_wrapped_partial(rct_drawpixelinfo *dpi, int x, int lineY = y - ((numLines * lineHeight) / 2); for (int line = 0; line <= numLines; line++) { int halfWidth = gfx_get_string_width(buffer) / 2; - + utf8 *ch = buffer; utf8 *nextCh; int codepoint; @@ -735,7 +736,7 @@ void gfx_draw_string_centred_wrapped_partial(rct_drawpixelinfo *dpi, int x, int buffer = get_string_end(buffer) + 1; lineY += lineHeight; - } + } } static uint32 _ttf_surface_cache_hash(TTF_Font *font, const utf8 *text) @@ -884,7 +885,7 @@ bool ttf_initialise() for (int i = 0; i < 4; i++) { TTFFontDescriptor *fontDesc = &(gCurrentTTFFontSet->size[i]); - + utf8 fontPath[MAX_PATH] = "C:\\Windows\\Fonts\\"; strcat(fontPath, fontDesc->filename); @@ -1000,7 +1001,7 @@ static void ttf_draw_string_raw_ttf(rct_drawpixelinfo *dpi, const utf8 *text, te return; } } - + int fontSize = font_get_size_from_sprite_base(info->font_sprite_base); int drawX = info->x + fontDesc->offset_x; int drawY = info->y + fontDesc->offset_y; diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index bf532f5639..e39c58a3d9 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -856,7 +856,12 @@ int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength) int result = WideCharToMultiByte(CP_UTF8, 0, intermediateBuffer, -1, dst, maxBufferLength, NULL, NULL); #else STUB(); - int result = 0; + // we cannot walk past maxBufferLength, but in case we have still space left + // we need one byte for null terminator + int result = strnlen(src, maxBufferLength) + 1; + result = min(result, maxBufferLength); + strncpy(dst, src, maxBufferLength); + dst[maxBufferLength - 1] = '\0'; #endif // _WIN32 if (heapBuffer != NULL) { diff --git a/src/object.c b/src/object.c index 4295cbb146..3bf78c483d 100644 --- a/src/object.c +++ b/src/object.c @@ -56,7 +56,7 @@ int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSi { uint8 objectType; rct_object_entry openedEntry; - char path[260]; + char path[MAX_PATH]; SDL_RWops* rw; subsitute_path(path, RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), (char*)installedObject + 16); @@ -259,7 +259,7 @@ int object_load_packed(SDL_RWops* rw) } if (entryGroupIndex == object_entry_group_counts[type]){ - // This should never occur. Objects are not loaded before installing a + // This should never occur. Objects are not loaded before installing a // packed object. So there is only one object loaded at this point. log_error("Too many objects of the same type loaded."); rct2_free(chunk); @@ -285,7 +285,7 @@ int object_load_packed(SDL_RWops* rw) } // Convert the entry name to a upper case path name - char path[260]; + char path[MAX_PATH]; char objectPath[9] = { 0 }; for (int i = 0; i < 8; ++i){ if (entry.name[i] != ' ') @@ -400,7 +400,7 @@ int object_calculate_checksum(const rct_object_entry *entry, const char *data, i int object_chunk_load_image_directory(uint8_t** chunk) { int image_start_no = RCT2_GLOBAL(RCT2_ADDRESS_TOTAL_NO_IMAGES, uint32_t); - + // First dword of chunk is no_images int no_images = *((uint32_t*)(*chunk)); *chunk += 4; @@ -754,7 +754,7 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp return flags; } else - { + { rct_window* w = (rct_window*)esi; int width = w->x + w->width - x - 4; @@ -1415,7 +1415,7 @@ int paint_water_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* d return 0; } else if ((flags & 0xFF) == 3){ - if (!((flags >> 8) & 0xFF)) + if (!((flags >> 8) & 0xFF)) gfx_draw_string_centred(dpi, 3326, ecx, edx, 0, (void*)esi); } return flags; @@ -1467,7 +1467,7 @@ int object_paint(int type, int eax, int ebx, int ecx, int edx, int esi, int edi, switch (type) { case OBJECT_TYPE_RIDE: - return paint_ride_entry(eax, ebx, ecx, edx, (rct_drawpixelinfo*)edi, esi, ebp); + return paint_ride_entry(eax, ebx, ecx, edx, (rct_drawpixelinfo*)edi, esi, ebp); case OBJECT_TYPE_SMALL_SCENERY: return paint_small_scenery(eax, ebx, ecx, edx, (rct_drawpixelinfo*)edi, esi, ebp); case OBJECT_TYPE_LARGE_SCENERY: @@ -1477,7 +1477,7 @@ int object_paint(int type, int eax, int ebx, int ecx, int edx, int esi, int edi, case OBJECT_TYPE_BANNERS: return paint_banner(eax, ebx, ecx, edx, (rct_drawpixelinfo*)edi, esi, ebp); case OBJECT_TYPE_PATHS: - return paint_path_entry(eax, ebx, ecx, edx, (rct_drawpixelinfo*)edi, esi, ebp); + return paint_path_entry(eax, ebx, ecx, edx, (rct_drawpixelinfo*)edi, esi, ebp); case OBJECT_TYPE_PATH_BITS: return paint_path_bit(eax, ebx, ecx, edx, (rct_drawpixelinfo*)edi, esi, ebp); case OBJECT_TYPE_SCENERY_SETS: @@ -1503,14 +1503,14 @@ int object_get_scenario_text(rct_object_entry *entry) rct_object_entry *installedObject = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); installedObject = object_list_find(entry); - + if (installedObject == NULL){ log_error("Object not found: %.8s", entry->name); RCT2_GLOBAL(0x00F42BD9, uint8) = 0; return 0; } - char path[260]; + char path[MAX_PATH]; char *objectPath = (char*)installedObject + 16; subsitute_path(path, RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char), objectPath); @@ -1571,7 +1571,7 @@ int object_get_scenario_text(rct_object_entry *entry) memcpy(gTempObjectLoadName, openedEntry.name, 8); // Not used?? RCT2_GLOBAL(0x009ADAFD, uint8) = 1; - object_paint(openedEntry.flags & 0x0F, 0, 0, 0, 0, (int)chunk, 0, 0); + object_paint(openedEntry.flags & 0x0F, 0, 0, 0, 0, (int)chunk, 0, 0); // Tell text to be loaded into normal address RCT2_GLOBAL(0x009ADAFC, uint8) = 0; // Not used?? @@ -1630,7 +1630,7 @@ rct_object_entry *object_get_next(rct_object_entry *entry) // Skip theme objects pos += *pos * 16 + 1; - // Skip + // Skip pos += 4; return (rct_object_entry*)pos; diff --git a/src/object.h b/src/object.h index 18c11087d9..50ebf7cc86 100644 --- a/src/object.h +++ b/src/object.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -75,7 +75,7 @@ extern int object_entry_group_counts[]; extern int object_entry_group_encoding[]; typedef struct { - uint8 **chunks; + uint8 **chunks; rct_object_entry_extended *entries; } rct_object_entry_group; @@ -122,4 +122,4 @@ char *object_get_name(rct_object_entry *entry); rct_object_filters *get_object_filter(int index); -#endif \ No newline at end of file +#endif diff --git a/src/object_list.c b/src/object_list.c index 7fd147949c..cccd9b3592 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -115,7 +115,7 @@ static void object_list_sort() objectBuffer = &RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); numObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, sint32); copied = calloc(numObjects, sizeof(uint8)); - + // Get buffer size entry = *objectBuffer; for (i = 0; i < numObjects; i++) @@ -166,7 +166,7 @@ static void object_list_sort() } /** - * + * * rct2: 0x006A93CD */ static void object_list_examine() @@ -237,7 +237,7 @@ static int object_list_query_directory(int *outTotalFiles, uint64 *outTotalFileS } /** - * + * * rct2: 0x006A8B40 */ void object_list_load() @@ -291,17 +291,17 @@ void object_list_load() free(_installedObjectFilters); _installedObjectFilters = NULL; } - + enumFileHandle = platform_enumerate_files_begin(RCT2_ADDRESS(RCT2_ADDRESS_OBJECT_DATA_PATH, char)); if (enumFileHandle != INVALID_HANDLE) { uint32 installed_buffer_size = 0x1000; - + while (platform_enumerate_files_next(enumFileHandle, &enumFileInfo)) { fileCount++; if ((installed_buffer_size - current_item_offset) <= 2842){ installed_buffer_size += 0x1000; - RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, void*) = rct2_realloc(RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, void*), installed_buffer_size); + RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, void*) = rct2_realloc(RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, void*), installed_buffer_size); if (RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, int) == -1){ log_error("Failed to allocate memory for object list"); rct2_exit_reason(835, 3162); @@ -355,6 +355,11 @@ static int object_list_cache_load(int totalFiles, uint64 totalFileSize, int file rct_plugin_header pluginHeader; uint32 filterVersion = 0; +#ifndef _WIN32 + // TODO: remove me! + log_error("this is to be removed after testing/implementation is done"); + return 0; +#endif log_verbose("loading object list cache (plugin.dat)"); get_plugin_path(path); @@ -391,7 +396,7 @@ static int object_list_cache_load(int totalFiles, uint64 totalFileSize, int file free(_installedObjectFilters); _installedObjectFilters = malloc(sizeof(rct_object_filters) * pluginHeader.object_list_no_items); if (SDL_RWread(file, _installedObjectFilters, sizeof(rct_object_filters) * pluginHeader.object_list_no_items, 1) == 1) { - + SDL_RWclose(file); reset_loaded_objects(); object_list_examine(); @@ -431,7 +436,7 @@ static int object_list_cache_save(int fileCount, uint64 totalFileSize, int fileD SDL_RWops *file; rct_plugin_header pluginHeader; uint32 filterVersion = FILTER_VERSION; - + log_verbose("saving object list cache (plugin.dat)"); pluginHeader.total_files = fileCount | 0x01000000; @@ -519,7 +524,7 @@ void set_load_objects_fail_reason(){ } /** - * + * * rct2: 0x006AA0C6 */ int object_read_and_load_entries(SDL_RWops* rw) @@ -557,7 +562,7 @@ int object_read_and_load_entries(SDL_RWops* rw) } } - free(entries); + free(entries); if (load_fail){ object_unload_all(); RCT2_GLOBAL(0x14241BC, uint32) = 0; @@ -571,7 +576,7 @@ int object_read_and_load_entries(SDL_RWops* rw) /** - * + * * rct2: 0x006A9CE8 */ void object_unload_all() @@ -631,7 +636,7 @@ void object_list_create_hash_table() // Set hash table slot _installedObjectHashTable[index] = installedObject; - + // Next installed object installedObject = object_get_next(installedObject); } @@ -645,8 +650,8 @@ int find_object_in_entry_group(rct_object_entry* entry, uint8* entry_type, uint8 *entry_type = entry->flags & 0xF; rct_object_entry_group entry_group = object_entry_groups[*entry_type]; - for (*entry_index = 0; - *entry_index < object_entry_group_counts[*entry_type]; + for (*entry_index = 0; + *entry_index < object_entry_group_counts[*entry_type]; ++(*entry_index), entry_group.chunks++, entry_group.entries++){ diff --git a/src/openrct2.c b/src/openrct2.c index d2df37bac4..c6d7a80570 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -135,8 +135,19 @@ static void openrct2_set_exe_path() if (bytesRead == -1) { log_fatal("failed to read /proc/self/exe"); } - exePath[MAX_PATH - 1] = '\0'; - strncpy(gExePath, exePath, MAX_PATH); + exePath[bytesRead] = '\0'; + log_verbose("######################################## Setting exe path to %s", exePath); + char *exeDelimiter = strrchr(exePath, platform_get_path_separator()); + if (exeDelimiter == NULL) + { + log_error("should never happen here"); + gExePath[0] = '\0'; + return; + } + int exeDelimiterIndex = (int)(exeDelimiter - exePath); + + strncpy(gExePath, exePath, exeDelimiterIndex + 1); + gExePath[exeDelimiterIndex] = '\0'; #endif // _WIN32 } diff --git a/src/platform/linux.c b/src/platform/linux.c new file mode 100644 index 0000000000..24d68ca60e --- /dev/null +++ b/src/platform/linux.c @@ -0,0 +1,759 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#ifdef __linux + +#include +#include +#include +#include +#include +#include "../addresses.h" +#include "../cmdline.h" +#include "../openrct2.h" +#include "../localisation/language.h" +#include "../localisation/currency.h" +#include "../config.h" +#include "platform.h" +#include + +// The name of the mutex used to prevent multiple instances of the game from running +#define SINGLE_INSTANCE_MUTEX_NAME "RollerCoaster Tycoon 2_GSKMUTEX" + +/** + * The function that is called directly from the host application (rct2.exe)'s WinMain. This will be removed when OpenRCT2 can + * be built as a stand alone application. + */ +int main(int argc, const char **argv) +{ + //RCT2_GLOBAL(RCT2_ADDRESS_HINSTANCE, HINSTANCE) = hInstance; + //RCT2_GLOBAL(RCT2_ADDRESS_CMDLINE, LPSTR) = lpCmdLine; + + STUB(); + int run_game = cmdline_run(argv, argc); + if (run_game == 1) + { + openrct2_launch(); + } + + exit(gExitCode); + return gExitCode; +} + +char platform_get_path_separator() +{ + return '/'; +} + +bool platform_file_exists(const utf8 *path) +{ + wchar_t *wPath = utf8_to_widechar(path); + int len = min(MAX_PATH, utf8_length(path)); + char buffer[MAX_PATH]; + wcstombs(buffer, wPath, len); + buffer[len] = '\0'; + free(wPath); + int exists = access(buffer, F_OK) != -1; + log_warning("file '%s' exists = %i", buffer, exists); + return exists; +} + +bool platform_directory_exists(const utf8 *path) +{ + wchar_t *wPath = utf8_to_widechar(path); + int len = min(MAX_PATH, utf8_length(path)); + char buffer[MAX_PATH]; + wcstombs(buffer, wPath, len); + buffer[len] = '\0'; + free(wPath); + struct stat dirinfo; + int result = stat(buffer, &dirinfo); + log_verbose("checking dir %s, result = %d, is_dir = %d", buffer, result, S_ISDIR(dirinfo.st_mode)); + if ((result != 0) || !S_ISDIR(dirinfo.st_mode)) + { + return 0; + } + return 1; +} + +bool platform_original_game_data_exists(const utf8 *path) +{ + wchar_t *wPath = utf8_to_widechar(path); + int len = min(MAX_PATH, utf8_length(path)); + char buffer[MAX_PATH]; + wcstombs(buffer, wPath, len); + buffer[len] = '\0'; + free(wPath); + char checkPath[MAX_PATH]; + sprintf(checkPath, "%s%c%s%c%s", buffer, platform_get_path_separator(), "data", platform_get_path_separator(), "g1.dat"); + return platform_file_exists(checkPath); +} + +mode_t getumask() +{ + mode_t mask = umask(0); + umask(mask); + return 0777 & ~mask; // Keep in mind 0777 is octal +} + +bool platform_ensure_directory_exists(const utf8 *path) +{ + mode_t mask = getumask(); + + wchar_t *wPath = utf8_to_widechar(path); + int len = min(MAX_PATH, utf8_length(path)); + char buffer[MAX_PATH]; + wcstombs(buffer, wPath, len); + buffer[len - 1] = '\0'; + free(wPath); + log_verbose("%s", buffer); + const int result = mkdir(buffer, mask); + if (result == 0 || (result == -1 && errno == EEXIST)) + return true; + return false; +} + +bool platform_directory_delete(const utf8 *path) +{ + STUB(); + return 1; +} + +bool platform_lock_single_instance() +{ + STUB(); + return 1; +} + +typedef struct { + char active; + char pattern[MAX_PATH]; + struct dirent **fileListTemp; + char **paths; + int cnt; + int handle; + void* data; +} enumerate_file_info; +static enumerate_file_info _enumerateFileInfoList[8] = { 0 }; + +char *g_file_pattern; + +static int winfilter(const struct dirent *d) +{ + int entry_length = strnlen(d->d_name, MAX_PATH); + char *name_upper = malloc(entry_length + 1); + if (name_upper == NULL) + { + log_error("out of memory"); + return 0; + } + for (int i = 0; i < entry_length; i++) + { + name_upper[i] = (char)toupper(d->d_name[i]); + } + name_upper[entry_length] = '\0'; + bool match = strstr(name_upper, g_file_pattern) != NULL; + //log_warning("trying matching filename %s, result = %d", name_upper, match); + free(name_upper); + return match; +} + +int platform_enumerate_files_begin(const utf8 *pattern) +{ + int i; + enumerate_file_info *enumFileInfo; + wchar_t *wpattern = utf8_to_widechar(pattern); + int length = min(utf8_length(pattern), MAX_PATH); + char *npattern = malloc(length); + int converted; + converted = wcstombs(npattern, wpattern, length); + npattern[length - 1] = '\0'; + if (converted == MAX_PATH) { + log_warning("truncated string %s", npattern); + } + log_warning("begin file search, pattern: %s", npattern); + + char *file_name = strrchr(npattern, platform_get_path_separator()); + char *dir_name; + if (file_name != NULL) + { + dir_name = strndup(npattern, file_name - npattern); + file_name = &file_name[1]; + } else { + file_name = npattern; + dir_name = strdup("."); + } + + char *smatch = strchr(file_name, '*'); + if ((smatch != file_name) && (smatch != NULL)) + { + log_error("Sorry, can only match '*' at start of filename."); + return -1; + } else { + // '*' found + if (smatch != NULL) + { + // some boundary checking needed + // skip the '*' + smatch = &smatch[1]; + char *match2 = strchr(&smatch[1], '*'); + if (match2 != NULL) + { + log_error("Sorry, can only match one '*' wildcard."); + return -1; + } + } else { + // '*' not found + smatch = file_name; + } + } + char *qmatch = strchr(file_name, '?'); + if ((qmatch != &npattern[length - 1]) && (qmatch != NULL)) + { + log_error("Sorry, can only match '?' at end of filename."); + return -1; + } else { + qmatch = &npattern[length]; + } + int pattern_length = qmatch - smatch; + g_file_pattern = strndup(smatch, pattern_length); + for (int j = 0; j < pattern_length; j++) + { + g_file_pattern[j] = (char)toupper(g_file_pattern[j]); + } + log_warning("looking for file matching %s", g_file_pattern); + int cnt; + for (i = 0; i < countof(_enumerateFileInfoList); i++) { + enumFileInfo = &_enumerateFileInfoList[i]; + if (!enumFileInfo->active) { + strncpy(enumFileInfo->pattern, npattern, length); + cnt = scandir(dir_name, &enumFileInfo->fileListTemp, winfilter, alphasort); + if (cnt < 0) + { + break; + } + log_warning("found %d files matching in dir '%s'", cnt, dir_name); + enumFileInfo->cnt = cnt; + enumFileInfo->paths = malloc(cnt * sizeof(char *)); + char **paths = enumFileInfo->paths; + // 256 is size of dirent.d_name + const int buf_len = min(MAX_PATH, 256); + const int dir_name_len = strnlen(dir_name, MAX_PATH); + char separator[] = {platform_get_path_separator(), 0}; + for (int idx = 0; idx < cnt; idx++) + { + struct dirent *d = enumFileInfo->fileListTemp[idx]; + const int entry_len = strnlen(d->d_name, MAX_PATH); + // 1 for separator, 1 for trailing null + paths[idx] = malloc(sizeof(char) * min(MAX_PATH, entry_len + dir_name_len + 2)); + paths[idx][0] = '\0'; + log_verbose("dir_name: %s", dir_name); + strncat(paths[idx], dir_name, MAX_PATH); + strncat(paths[idx], separator, MAX_PATH); + strncat(paths[idx], d->d_name, MAX_PATH); + log_verbose("paths[%d] = %s", idx, paths[idx]); + } + enumFileInfo->handle = 0; + enumFileInfo->active = 1; + free(dir_name); + free(g_file_pattern); + g_file_pattern = NULL; + free(wpattern); + free(npattern); + return i; + } + } + + free(dir_name); + free(g_file_pattern); + g_file_pattern = NULL; + free(wpattern); + free(npattern); + return -1; +} + +bool platform_enumerate_files_next(int handle, file_info *outFileInfo) +{ + bool result; + enumerate_file_info *enumFileInfo; + + enumFileInfo = &_enumerateFileInfoList[handle]; + + log_verbose("handle = %d", handle); + if (enumFileInfo->handle < enumFileInfo->cnt) { + result = true; + } else { + result = false; + } + + if (result) { + int entryIdx = enumFileInfo->handle++; + struct stat fileInfo; + log_verbose("trying handle %d", entryIdx); + char *fileName = enumFileInfo->paths[entryIdx]; + int statRes; + statRes = stat(fileName, &fileInfo); + if (statRes == -1) { + log_error("failed to stat file '%s'! errno = %i", fileName, errno); + return 0; + } + outFileInfo->path = basename(fileName); + outFileInfo->size = fileInfo.st_size; + outFileInfo->last_modified = fileInfo.st_mtime; + return 1; + } else { + return 0; + } +} + +void platform_enumerate_files_end(int handle) +{ + int i; + enumerate_file_info *enumFileInfo; + + enumFileInfo = &_enumerateFileInfoList[handle]; + int cnt = enumFileInfo->cnt; + for (i = 0; i < cnt; i++) { + free(enumFileInfo->fileListTemp[i]); + free(enumFileInfo->paths[i]); + } + free(enumFileInfo->fileListTemp); + free(enumFileInfo->paths); + // FIXME: this here could have a bug + enumFileInfo->fileListTemp = NULL; + enumFileInfo->handle = 0; + enumFileInfo->active = 0; +} + +static int dirfilter(const struct dirent *d) +{ +#ifdef _DIRENT_HAVE_D_TYPE + if (d->d_type != DT_DIR) + { + return 1; + } else { + return 0; + } +#else +#error implement dirfilter! +#endif // _DIRENT_HAVE_D_TYPE +} + +int platform_enumerate_directories_begin(const utf8 *directory) +{ + int i; + enumerate_file_info *enumFileInfo; + wchar_t *wpattern = utf8_to_widechar(directory); + int length = min(utf8_length(directory), MAX_PATH); + char *npattern = malloc(length); + int converted; + converted = wcstombs(npattern, wpattern, length); + npattern[length - 1] = '\0'; + if (converted == MAX_PATH) { + log_warning("truncated string %s", npattern); + } + log_warning("begin directory listing, path: %s", npattern); + + // TODO: add some checking for stringness and directoryness + + int cnt; + for (i = 0; i < countof(_enumerateFileInfoList); i++) { + enumFileInfo = &_enumerateFileInfoList[i]; + if (!enumFileInfo->active) { + strncpy(enumFileInfo->pattern, npattern, length); + cnt = scandir(npattern, &enumFileInfo->fileListTemp, dirfilter, alphasort); + if (cnt < 0) + { + break; + } + log_warning("found %d files in dir '%s'", cnt, npattern); + enumFileInfo->cnt = cnt; + enumFileInfo->paths = malloc(cnt * sizeof(char *)); + char **paths = enumFileInfo->paths; + // 256 is size of dirent.d_name + const int buf_len = min(MAX_PATH, 256); + const int dir_name_len = strnlen(npattern, MAX_PATH); + char separator[] = {platform_get_path_separator(), 0}; + for (int idx = 0; idx < cnt; idx++) + { + struct dirent *d = enumFileInfo->fileListTemp[idx]; + const int entry_len = strnlen(d->d_name, MAX_PATH); + // 1 for separator, 1 for trailing null + paths[idx] = malloc(sizeof(char) * min(MAX_PATH, entry_len + dir_name_len + 2)); + paths[idx][0] = '\0'; + log_verbose("dir_name: %s", npattern); + strncat(paths[idx], npattern, MAX_PATH); + strncat(paths[idx], separator, MAX_PATH); + strncat(paths[idx], d->d_name, MAX_PATH); + log_verbose("paths[%d] = %s", idx, paths[idx]); + } + enumFileInfo->handle = 0; + enumFileInfo->active = 1; + free(wpattern); + free(npattern); + return i; + } + } + + free(wpattern); + free(npattern); + return -1; +} + +bool platform_enumerate_directories_next(int handle, utf8 *path) +{ + bool result; + enumerate_file_info *enumFileInfo; + + enumFileInfo = &_enumerateFileInfoList[handle]; + + log_verbose("handle = %d", handle); + if (enumFileInfo->handle < enumFileInfo->cnt) { + result = true; + } else { + result = false; + } + + if (result) { + int entryIdx = enumFileInfo->handle++; + struct stat fileInfo; + log_verbose("trying handle %d", entryIdx); + char *fileName = enumFileInfo->paths[entryIdx]; + int statRes; + statRes = stat(fileName, &fileInfo); + if (statRes == -1) { + log_error("failed to stat file '%s'! errno = %i", fileName, errno); + return 0; + } + // so very, very wrong… + strncpy(path, basename(fileName), MAX_PATH); + strncat(path, "/", MAX_PATH); + path[MAX_PATH - 1] = '\0'; + return 1; + } else { + return 0; + } +} + +void platform_enumerate_directories_end(int handle) +{ + int i; + enumerate_file_info *enumFileInfo; + + enumFileInfo = &_enumerateFileInfoList[handle]; + int cnt = enumFileInfo->cnt; + for (i = 0; i < cnt; i++) { + free(enumFileInfo->fileListTemp[i]); + free(enumFileInfo->paths[i]); + } + free(enumFileInfo->fileListTemp); + free(enumFileInfo->paths); + // FIXME: this here could have a bug + enumFileInfo->fileListTemp = NULL; + enumFileInfo->handle = 0; + enumFileInfo->active = 0; +} + +int platform_get_drives(){ + /* + return GetLogicalDrives(); + */ + STUB(); + return 0xff; +} + +bool platform_file_copy(const utf8 *srcPath, const utf8 *dstPath, bool overwrite) +{ + STUB(); + return 0; +} + +bool platform_file_move(const utf8 *srcPath, const utf8 *dstPath) +{ + STUB(); + return 0; +} + +bool platform_file_delete(const utf8 *path) +{ + STUB(); + return 0; +} + +void platform_hide_cursor() +{ + STUB(); +} + +void platform_show_cursor() +{ + STUB(); +} + +void platform_get_cursor_position(int *x, int *y) +{ + + STUB(); +} + +void platform_set_cursor_position(int x, int y) +{ + STUB(); +} + +unsigned int platform_get_ticks() +{ + STUB(); + return 100; +} + +wchar_t *regular_to_wchar(const char* src) +{ + int len = strnlen(src, MAX_PATH); + wchar_t *w_buffer = malloc((len + 1) * sizeof(wchar_t)); + mbtowc (NULL, NULL, 0); /* reset mbtowc */ + + int max = len; + int i = 0; + while (max > 0) + { + int length; + length = mbtowc(&w_buffer[i], &src[i], max); + if (length < 1) + { + w_buffer[i + 1] = '\0'; + break; + } + i += length; + max -= length; + } + return w_buffer; +} + +void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) +{ + char buffer[MAX_PATH]; + buffer[0] = '\0'; + log_verbose("buffer = '%s'", buffer); + const char *homedir = getenv("XDG_CONFIG_HOME"); + log_verbose("homedir = '%s'", homedir); + if (homedir == NULL) + { + homedir = getpwuid(getuid())->pw_dir; + log_verbose("homedir was null, used getuid, now is = '%s'", homedir); + if (homedir == NULL) + { + log_error("Couldn't find user home directory"); + return; + } + } + char separator[2] = { platform_get_path_separator(), 0 }; + strncat(buffer, homedir, MAX_PATH); + strncat(buffer, separator, MAX_PATH); + strncat(buffer, "OpenRCT2", MAX_PATH); + strncat(buffer, separator, MAX_PATH); + log_verbose("outPath + OpenRCT2 = '%s'", buffer); + if (subDirectory != NULL && subDirectory[0] != 0) { + log_verbose("adding subDirectory '%s'", subDirectory); + strcat(buffer, subDirectory); + strcat(buffer, separator); + } + int len = strnlen(buffer, MAX_PATH); + wchar_t *w_buffer = regular_to_wchar(buffer); + w_buffer[len] = '\0'; + utf8 *path = widechar_to_utf8(w_buffer); + free(w_buffer); + strcpy(outPath, path); + free(path); + log_verbose("outPath + subDirectory = '%s'", buffer); +} + +void platform_show_messagebox(char *message) +{ + STUB(); + log_warning(message); +} + +/** + * + * rct2: 0x004080EA + */ +int platform_open_common_file_dialog(int type, utf8 *title, utf8 *filename, utf8 *filterPattern, utf8 *filterName) +{ + STUB(); + return 0; +} + +utf8 *platform_open_directory_browser(utf8 *title) +{ + STUB(); + return NULL; +} + +uint16 platform_get_locale_language(){ + /* + CHAR langCode[4]; + + if (GetLocaleInfo(LOCALE_USER_DEFAULT, + LOCALE_SABBREVLANGNAME, + (LPSTR)&langCode, + sizeof(langCode)) == 0){ + return LANGUAGE_UNDEFINED; + } + + if (strcmp(langCode, "ENG") == 0){ + return LANGUAGE_ENGLISH_UK; + } + else if (strcmp(langCode, "ENU") == 0){ + return LANGUAGE_ENGLISH_US; + } + else if (strcmp(langCode, "DEU") == 0){ + return LANGUAGE_GERMAN; + } + else if (strcmp(langCode, "NLD") == 0){ + return LANGUAGE_DUTCH; + } + else if (strcmp(langCode, "FRA") == 0){ + return LANGUAGE_FRENCH; + } + else if (strcmp(langCode, "HUN") == 0){ + return LANGUAGE_HUNGARIAN; + } + else if (strcmp(langCode, "PLK") == 0){ + return LANGUAGE_POLISH; + } + else if (strcmp(langCode, "ESP") == 0){ + return LANGUAGE_SPANISH; + } + else if (strcmp(langCode, "SVE") == 0){ + return LANGUAGE_SWEDISH; + } + else if (strcmp(langCode, "ITA") == 0){ + return LANGUAGE_ITALIAN; + } + else if (strcmp(langCode, "POR") == 0){ + return LANGUAGE_PORTUGUESE_BR; + } + */ + STUB(); + return LANGUAGE_ENGLISH_UK; +} + +time_t platform_file_get_modified_time(const utf8* path){ + /* + WIN32_FILE_ATTRIBUTE_DATA data; + if (!GetFileAttributesEx(path, GetFileExInfoStandard, &data)) + return 0; + ULARGE_INTEGER ull; + ull.LowPart = data.ftLastWriteTime.dwLowDateTime; + ull.HighPart = data.ftLastWriteTime.dwHighDateTime; + return ull.QuadPart / 10000000ULL - 11644473600ULL; + */ + STUB(); + return 100; +} + +uint8 platform_get_locale_currency(){ + /* + CHAR currCode[4]; + + if (GetLocaleInfo(LOCALE_USER_DEFAULT, + LOCALE_SINTLSYMBOL, + (LPSTR)&currCode, + sizeof(currCode)) == 0){ + return CURRENCY_POUNDS; + } + if (strcmp(currCode, "GBP") == 0){ + return CURRENCY_POUNDS; + } + else if (strcmp(currCode, "USD") == 0){ + return CURRENCY_DOLLARS; + } + else if (strcmp(currCode, "EUR") == 0){ + return CURRENCY_EUROS; + } + else if (strcmp(currCode, "SEK") == 0){ + return CURRENCY_KRONA; + } + else if (strcmp(currCode, "DEM") == 0){ + return CURRENCY_DEUTSCHMARK; + } + else if (strcmp(currCode, "ITL") == 0){ + return CURRENCY_LIRA; + } + else if (strcmp(currCode, "JPY") == 0){ + return CURRENCY_YEN; + } + else if (strcmp(currCode, "ESP") == 0){ + return CURRENCY_PESETA; + } + else if (strcmp(currCode, "FRF") == 0){ + return CURRENCY_FRANC; + } + else if (strcmp(currCode, "NLG") == 0){ + return CURRENCY_GUILDERS; + } + */ + STUB(); + return CURRENCY_POUNDS; +} + +uint8 platform_get_locale_measurement_format(){ + /* + UINT measurement_system; + if (GetLocaleInfo(LOCALE_USER_DEFAULT, + LOCALE_IMEASURE | LOCALE_RETURN_NUMBER, + (LPSTR)&measurement_system, + sizeof(measurement_system)) == 0){ + return MEASUREMENT_FORMAT_IMPERIAL; + } + switch (measurement_system){ + case 0: + return MEASUREMENT_FORMAT_METRIC; + case 1: + default: + return MEASUREMENT_FORMAT_IMPERIAL; + }*/ + STUB(); + return MEASUREMENT_FORMAT_METRIC; +} + +uint8 platform_get_locale_temperature_format(){ + /* + // There does not seem to be a function to obtain this, just check the countries + UINT country; + if (GetLocaleInfo(LOCALE_USER_DEFAULT, + LOCALE_IMEASURE | LOCALE_RETURN_NUMBER, + (LPSTR)&country, + sizeof(country)) == 0){ + return TEMPERATURE_FORMAT_C; + } + switch (country){ + case CTRY_UNITED_STATES: + case CTRY_BELIZE: + return TEMPERATURE_FORMAT_F; + default: + return TEMPERATURE_FORMAT_C; + } + */ + STUB(); + return TEMPERATURE_FORMAT_C; +} +#endif // __linux diff --git a/src/platform/platform.h b/src/platform/platform.h index 23934c5661..a894264f77 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -147,6 +147,7 @@ uint8 platform_get_locale_temperature_format(); #define _strcmpi _stricmp #define _stricmp(x, y) strcasecmp((x), (y)) #define _strnicmp(x, y, n) strncasecmp((x), (y), (n)) +#define _strdup(x) strdup((x)) #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #define RCT2_ENDIANESS __ORDER_LITTLE_ENDIAN__ diff --git a/src/platform/unix.c b/src/platform/unix.c index e5151df42d..602709bb63 100644 --- a/src/platform/unix.c +++ b/src/platform/unix.c @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -31,14 +31,16 @@ // { // if (cmdline_run(argv, argc)) // openrct2_launch(); -// +// // return gExitCode; // } +/* char platform_get_path_separator() { return '/'; } +*/ #endif -#endif \ No newline at end of file +#endif diff --git a/src/rct2.h b/src/rct2.h index 5749e3a133..74cf311b7e 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ - + #ifndef _RCT2_H_ #define _RCT2_H_ @@ -206,7 +206,11 @@ enum { // rct2 @ 0x0097F67C static const char * const file_paths[] = { - "Data\\G1.DAT", +#ifdef _WIN32 + "data\\g1.dat", +#else + "data/g1.dat", +#endif // _WIN32 "Data\\PLUGIN.DAT", "Data\\CSS1.DAT", "Data\\CSS2.DAT", From b64d4225beca4ce3ef5d1a4777e10469c215c20f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sun, 20 Sep 2015 23:19:38 +0200 Subject: [PATCH 0704/1173] Declare link directories prior to using them As it turns out, you have to declare your link directories before you use them in cmake, otherwise your executables/binaries will have no knowledge of them. This should fix travis builds for mingw. --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index de942e7807..c392ed1def 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,6 +62,9 @@ if (UNIX) INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS}) endif (UNIX) +INCLUDE_DIRECTORIES(${ORCTLIBS_INCLUDE} ${JANSSON_INCLUDE}) +LINK_DIRECTORIES(${LINK_DIRECTORIES} ${LIB32} ${SDL2_LIBRARY_DIRS} ${ORCTLIBS_LIB_DIR}) + if (WIN32) # build as library for now, replace with add_executable add_library(${PROJECT} SHARED ${ORCT2_SOURCES}) @@ -69,9 +72,6 @@ else (WIN32) add_executable(${PROJECT} ${ORCT2_SOURCES}) endif (WIN32) -INCLUDE_DIRECTORIES(${ORCTLIBS_INCLUDE} ${JANSSON_INCLUDE}) -LINK_DIRECTORIES(${LINK_DIRECTORIES} ${LIB32} ${SDL2_LIBRARY_DIRS} ${ORCTLIBS_LIB_DIR}) - # install into ${CMAKE_INSTALL_PREFIX}/bin/ #install (TARGETS ${PROJECT} DESTINATION bin) From 0af364a9b6f0ee3d810c514d00f52552c60fbc04 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Mon, 21 Sep 2015 10:41:09 -0600 Subject: [PATCH 0705/1173] fix #1944 --- src/world/map.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/map.c b/src/world/map.c index 9e590a7576..a2b4e1376e 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -350,7 +350,7 @@ int map_element_height(int x, int y) rct_map_element *mapElement; // Off the map - if (x >= 8192 || y >= 8192) + if ((unsigned)x >= 8192 || (unsigned)y >= 8192) return 16; // Truncate subtile coordinates From 16eb4666eeebc6ba921cfd9afd57423262e67cd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 22 Sep 2015 08:29:05 +0200 Subject: [PATCH 0706/1173] Safely handle 'file not found' or wrong parameters `platform_enumerate_files_begin` (and it directory counterpart) can return `-1`, make sure we handle that value properly when passed on to `platform_enumerate_files_next` and `platform_enumerate_files_end` --- src/platform/linux.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/platform/linux.c b/src/platform/linux.c index 24d68ca60e..f9320bdb24 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -297,7 +297,7 @@ bool platform_enumerate_files_next(int handle, file_info *outFileInfo) enumFileInfo = &_enumerateFileInfoList[handle]; log_verbose("handle = %d", handle); - if (enumFileInfo->handle < enumFileInfo->cnt) { + if ((handle >= 0) && (enumFileInfo->handle < enumFileInfo->cnt)) { result = true; } else { result = false; @@ -328,6 +328,10 @@ void platform_enumerate_files_end(int handle) int i; enumerate_file_info *enumFileInfo; + if (handle < 0) + { + return; + } enumFileInfo = &_enumerateFileInfoList[handle]; int cnt = enumFileInfo->cnt; for (i = 0; i < cnt; i++) { @@ -425,7 +429,7 @@ bool platform_enumerate_directories_next(int handle, utf8 *path) enumFileInfo = &_enumerateFileInfoList[handle]; log_verbose("handle = %d", handle); - if (enumFileInfo->handle < enumFileInfo->cnt) { + if ((handle >= 0) && (enumFileInfo->handle < enumFileInfo->cnt)) { result = true; } else { result = false; @@ -457,6 +461,10 @@ void platform_enumerate_directories_end(int handle) int i; enumerate_file_info *enumFileInfo; + if (handle < 0) + { + return; + } enumFileInfo = &_enumerateFileInfoList[handle]; int cnt = enumFileInfo->cnt; for (i = 0; i < cnt; i++) { From 5ceafd66a3f90bb8b7e91c91e47133c1163af1d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 22 Sep 2015 19:02:39 +0200 Subject: [PATCH 0707/1173] Fix memory leak in screenshot.c and guest.c --- src/interface/screenshot.c | 26 ++++--- src/windows/guest.c | 136 +++++++++++++++++++------------------ 2 files changed, 86 insertions(+), 76 deletions(-) diff --git a/src/interface/screenshot.c b/src/interface/screenshot.c index 8e75f01b0a..be15586f89 100644 --- a/src/interface/screenshot.c +++ b/src/interface/screenshot.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -38,7 +38,7 @@ static int screenshot_dump_bmp(); static int screenshot_dump_png(); /** - * + * * rct2: 0x006E3AEC */ void screenshot_check() @@ -133,7 +133,7 @@ typedef struct { } BitmapInfoHeader; /** - * + * * rct2: 0x00683D20 */ int screenshot_dump_bmp() @@ -176,7 +176,9 @@ int screenshot_dump_bmp() bytesWritten = SDL_RWwrite(fp, &header, sizeof(BitmapFileHeader), 1); if (bytesWritten != 1) { SDL_RWclose(fp); - free(buffer); + SafeFree(buffer); + log_error("failed to save screenshot"); + return -1; } // Info header @@ -193,7 +195,9 @@ int screenshot_dump_bmp() bytesWritten = SDL_RWwrite(fp, &info, sizeof(BitmapInfoHeader), 1); if (bytesWritten != 1) { SDL_RWclose(fp); - free(buffer); + SafeFree(buffer); + log_error("failed to save screenshot"); + return -1; } // Palette @@ -207,7 +211,9 @@ int screenshot_dump_bmp() bytesWritten = SDL_RWwrite(fp, buffer, sizeof(char), 246 * 4); if (bytesWritten != 246*4){ SDL_RWclose(fp); - free(buffer); + SafeFree(buffer); + log_error("failed to save screenshot"); + return -1; } // Image, save upside down @@ -221,7 +227,9 @@ int screenshot_dump_bmp() bytesWritten = SDL_RWwrite(fp, buffer, sizeof(char), stride); if (bytesWritten != stride){ SDL_RWclose(fp); - free(buffer); + SafeFree(buffer); + log_error("failed to save screenshot"); + return -1; } } @@ -451,7 +459,7 @@ int cmdline_for_screenshot(const char **argv, int argc) bool centreMapX = false; bool centreMapY = false; int resolutionWidth, resolutionHeight, customX, customY, customZoom, customRotation; - + const char *inputPath = argv[0]; const char *outputPath = argv[1]; if (giantScreenshot) { diff --git a/src/windows/guest.c b/src/windows/guest.c index 846a8a9d3d..0e538fc903 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -63,16 +63,16 @@ enum WINDOW_GUEST_WIDGET_IDX { WIDX_MARQUEE = 10, WIDX_VIEWPORT, - WIDX_ACTION_LBL, + WIDX_ACTION_LBL, WIDX_PICKUP, WIDX_RENAME, WIDX_LOCATE, WIDX_TRACK, - + WIDX_RIDE_SCROLL = 10 }; -rct_widget window_guest_overview_widgets[] = { +rct_widget window_guest_overview_widgets[] = { { WWT_FRAME, 0, 0, 191, 0, 156, 0x0FFFFFFFF, STR_NONE }, // Panel / Background { WWT_CAPTION, 0, 1, 190, 1, 14, 865, STR_WINDOW_TITLE_TIP }, // Title { WWT_CLOSEBOX, 0, 179, 189, 2, 13, 824, STR_CLOSE_WINDOW_TIP }, // Close x button @@ -482,7 +482,7 @@ uint32 window_guest_page_enabled_widgets[] = { * */ void window_guest_open(rct_peep* peep){ - + if (peep->type == PEEP_TYPE_STAFF){ window_staff_open(peep); return; @@ -512,22 +512,22 @@ void window_guest_open(rct_peep* peep){ window->viewport_focus_coordinates.y = -1; } - + window->page = 0; window_invalidate(window); - + window->widgets = window_guest_page_widgets[WINDOW_GUEST_OVERVIEW]; window->enabled_widgets = window_guest_page_enabled_widgets[WINDOW_GUEST_OVERVIEW]; window->hold_down_widgets = 0; window->event_handlers = window_guest_page_events[WINDOW_GUEST_OVERVIEW]; window->pressed_widgets = 0; - + window_guest_disable_widgets(window); window_init_scroll_widgets(window); window_guest_viewport_init(window); } -/* rct2: 0x006987A6 +/* rct2: 0x006987A6 * Disables the finance tab when no money. * Disables peep pickup when in certain no pickup states. */ @@ -552,10 +552,10 @@ void window_guest_disable_widgets(rct_window* w){ /* rct2: 0x00696A75 */ void window_guest_overview_close(rct_window *w) -{ +{ if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE){ - if (w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS,rct_windowclass) && - w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER,rct_windownumber)) + if (w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS,rct_windowclass) && + w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER,rct_windownumber)) tool_cancel(); } } @@ -564,13 +564,13 @@ void window_guest_overview_close(rct_window *w) void window_guest_overview_resize(rct_window *w){ window_guest_disable_widgets(w); window_event_invalidate_call(w); - + widget_invalidate(w, WIDX_MARQUEE); - + window_set_resize(w, 192, 159, 500, 450); - + rct_viewport* view = w->viewport; - + if (view){ if ((w->width - 30) == view->width){ if ((w->height - 72) == view->height){ @@ -611,7 +611,7 @@ void window_guest_overview_mouse_up(rct_window *w, int widgetIndex) if (tool_set(w, widgetIndex, 7)) { return; } - + w->var_48C = peep->x; remove_peep_from_ride(peep); @@ -642,26 +642,26 @@ void window_guest_set_page(rct_window* w, int page){ if(w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber) && w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass)) tool_cancel(); - + } int listen = 0; if ( page == WINDOW_GUEST_OVERVIEW && w->page==WINDOW_GUEST_OVERVIEW && w->viewport){ if(!(w->viewport->flags & VIEWPORT_FLAG_SOUND_ON)) listen = 1; } - - + + w->page = page; w->frame_no = 0; w->no_list_items = 0; w->selected_list_item = -1; - + rct_viewport* viewport = w->viewport; w->viewport = 0; if (viewport){ viewport->width = 0; } - + w->enabled_widgets = window_guest_page_enabled_widgets[page]; w->hold_down_widgets = 0; w->event_handlers = window_guest_page_events[page]; @@ -673,7 +673,7 @@ void window_guest_set_page(rct_window* w, int page){ window_event_invalidate_call(w); window_init_scroll_widgets(w); window_invalidate(w); - + if (listen && w->viewport) w->viewport->flags |= VIEWPORT_FLAG_SOUND_ON; } @@ -692,7 +692,7 @@ void window_guest_viewport_init(rct_window* w){ } focus = { 0 }; //The focus will be either a sprite or a coordinate. focus.sprite.sprite_id = w->number; - + rct_peep* peep = GET_PEEP(w->number); if (peep->state == PEEP_STATE_PICKED){ @@ -700,8 +700,8 @@ void window_guest_viewport_init(rct_window* w){ } else{ uint8 final_check = 1; - if (peep->state == PEEP_STATE_ON_RIDE - || peep->state == PEEP_STATE_ENTERING_RIDE + if (peep->state == PEEP_STATE_ON_RIDE + || peep->state == PEEP_STATE_ENTERING_RIDE || (peep->state == PEEP_STATE_LEAVING_RIDE && peep->x == SPRITE_LOCATION_NULL)){ rct_ride* ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[peep->current_ride]); @@ -739,7 +739,7 @@ void window_guest_viewport_init(rct_window* w){ if (w->viewport){ //Check all combos, for now skipping y and rot - if (focus.coordinate.x == w->viewport_focus_coordinates.x && + if (focus.coordinate.x == w->viewport_focus_coordinates.x && focus.coordinate.y == w->viewport_focus_coordinates.y && focus.coordinate.z == w->viewport_focus_coordinates.z && focus.coordinate.rotation == w->viewport_focus_coordinates.rotation) @@ -785,58 +785,58 @@ void window_guest_viewport_init(rct_window* w){ } /** - * rct2: 0x6983dd + * rct2: 0x6983dd * used by window_staff as well */ void window_guest_overview_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ if (w->disabled_widgets & (1<widgets[WIDX_TAB_1]; int width = widget->right - widget->left - 1; int height = widget->bottom - widget->top - 1; int x = widget->left + 1 + w->x; int y = widget->top + 1 + w->y; if (w->page == WINDOW_GUEST_OVERVIEW) height++; - + rct_drawpixelinfo* clip_dpi = clip_drawpixelinfo(dpi, x, width, y, height ); if (!clip_dpi) return; - + x = 14; y = 20; - + rct_peep* peep = GET_PEEP(w->number); - + if (peep->type == PEEP_TYPE_STAFF && peep->staff_type == STAFF_TYPE_ENTERTAINER) y++; - + int ebx = *(RCT2_ADDRESS(0x982708, uint32*)[peep->sprite_type * 2]) + 1; - + int eax = 0; - + if (w->page == WINDOW_GUEST_OVERVIEW){ eax = w->var_494>>16; eax &= 0xFFFC; } ebx += eax; - + int sprite_id = ebx | (peep->tshirt_colour << 19) | (peep->trousers_colour << 24) | 0xA0000000; gfx_draw_sprite( clip_dpi, sprite_id, x, y, 0); - + // If holding a balloon if (ebx >= 0x2A1D && ebx < 0x2A3D){ ebx += 32; ebx |= (peep->balloon_colour << 19) | 0x20000000; gfx_draw_sprite( clip_dpi, ebx, x, y, 0); } - + // If holding umbrella if (ebx >= 0x2BBD && ebx < 0x2BDD){ ebx += 32; ebx |= (peep->umbrella_colour << 19) | 0x20000000; gfx_draw_sprite(clip_dpi, ebx, x, y, 0); } - + // If wearing hat if (ebx >= 0x29DD && ebx < 0x29FD){ ebx += 32; @@ -887,9 +887,9 @@ void window_guest_rides_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ int image_id = SPR_TAB_RIDE_0; if ( w->page == WINDOW_GUEST_RIDES ){ - image_id += (w->frame_no / 4) & 0xF; + image_id += (w->frame_no / 4) & 0xF; } - + gfx_draw_sprite(dpi, image_id, x, y, 0); } @@ -904,9 +904,9 @@ void window_guest_finance_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ int image_id = SPR_TAB_FINANCES_SUMMARY_0; if ( w->page == WINDOW_GUEST_FINANCE ){ - image_id += (w->frame_no / 2) & 0x7; + image_id += (w->frame_no / 2) & 0x7; } - + gfx_draw_sprite(dpi, image_id, x, y, 0); } @@ -921,9 +921,9 @@ void window_guest_thoughts_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ int image_id = 5269; if ( w->page == WINDOW_GUEST_THOUGHTS ){ - image_id += (w->frame_no / 2) & 0x7; + image_id += (w->frame_no / 2) & 0x7; } - + gfx_draw_sprite(dpi, image_id, x, y, 0); } @@ -936,7 +936,7 @@ void window_guest_inventory_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ int y = widget->top + w->y; int image_id = 5326; - + gfx_draw_sprite(dpi, image_id, x, y, 0); } @@ -985,6 +985,7 @@ void window_guest_overview_paint(rct_window *w, rct_drawpixelinfo *dpi) for (; i < PEEP_MAX_THOUGHTS; ++i){ if (peep->thoughts[i].type == PEEP_THOUGHT_TYPE_NONE){ w->list_information_type = 0; + rct2_free(dpi_marquee); return; } if (peep->thoughts[i].var_2 == 1){ // If a fresh thought @@ -993,6 +994,7 @@ void window_guest_overview_paint(rct_window *w, rct_drawpixelinfo *dpi) } if (i == PEEP_MAX_THOUGHTS){ w->list_information_type = 0; + rct2_free(dpi_marquee); return; } @@ -1012,32 +1014,32 @@ void window_guest_overview_paint(rct_window *w, rct_drawpixelinfo *dpi) void window_guest_overview_invalidate(rct_window *w) { colour_scheme_update(w); - + if (window_guest_page_widgets[w->page] != w->widgets){ w->widgets = window_guest_page_widgets[w->page]; window_init_scroll_widgets(w); } - + w->pressed_widgets &= ~(WIDX_TAB_1 | WIDX_TAB_2 |WIDX_TAB_3 |WIDX_TAB_4 |WIDX_TAB_5 |WIDX_TAB_6); w->pressed_widgets |= 1ULL << (w->page + WIDX_TAB_1); - + rct_peep* peep = GET_PEEP(w->number); RCT2_GLOBAL(0x13CE952,uint16) = peep->name_string_idx; RCT2_GLOBAL(0x13CE954,uint32) = peep->id; - + w->pressed_widgets &= ~(1<flags & 0x8){ w->pressed_widgets |= (1<width - 1; window_guest_overview_widgets[WIDX_BACKGROUND].bottom = w->height - 1; - + window_guest_overview_widgets[WIDX_PAGE_BACKGROUND].right =w->width - 1; window_guest_overview_widgets[WIDX_PAGE_BACKGROUND].bottom = w->height - 1; - + window_guest_overview_widgets[WIDX_TITLE].right = w->width - 2; - + window_guest_overview_widgets[WIDX_CLOSE].left = w->width - 13; window_guest_overview_widgets[WIDX_CLOSE].right = w->width - 3; @@ -1047,7 +1049,7 @@ void window_guest_overview_invalidate(rct_window *w) window_guest_overview_widgets[WIDX_ACTION_LBL].top = w->height - 12; window_guest_overview_widgets[WIDX_ACTION_LBL].bottom = w->height - 3; window_guest_overview_widgets[WIDX_ACTION_LBL].right = w->width - 24; - + window_guest_overview_widgets[WIDX_MARQUEE].right = w->width - 24; window_guest_overview_widgets[WIDX_PICKUP].right = w->width - 2; @@ -1059,7 +1061,7 @@ void window_guest_overview_invalidate(rct_window *w) window_guest_overview_widgets[WIDX_RENAME].left = w->width - 25; window_guest_overview_widgets[WIDX_LOCATE].left = w->width - 25; window_guest_overview_widgets[WIDX_TRACK].left = w->width - 25; - + window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_6); } @@ -1073,7 +1075,7 @@ void window_guest_overview_update(rct_window* w){ widget_invalidate(w, WIDX_TAB_1); widget_invalidate(w, WIDX_TAB_2); - + w->list_information_type += 2; if ((w->var_494 & 0xFFFF) == 0xFFFF) @@ -1101,7 +1103,7 @@ void window_guest_overview_text_input(rct_window *w, int widgetIndex, char *text if (text == NULL) return; - + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_NAME_GUEST; game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 0)), GAME_COMMAND_SET_PEEP_NAME, *((int*)(text + 8)), *((int*)(text + 4))); game_do_command(2, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 12)), GAME_COMMAND_SET_PEEP_NAME, *((int*)(text + 20)), *((int*)(text + 16))); @@ -1143,7 +1145,7 @@ void window_guest_overview_tool_update(rct_window* w, int widgetIndex, int x, in RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_Y, uint16) = y; w->var_492++; if (w->var_492 >= 48)w->var_492 = 0; - + rct_peep* peep; peep = GET_PEEP(w->number); int ebx = (RCT2_ADDRESS(0x982708, uint32*)[peep->sprite_type * 2])[22]; @@ -1168,7 +1170,7 @@ void window_guest_overview_tool_down(rct_window* w, int widgetIndex, int x, int if (dest_x == (sint16)0x8000)return; - // Set the coordinate of destination to be exactly + // Set the coordinate of destination to be exactly // in the middle of a tile. dest_x += 16; dest_y += 16; @@ -1264,7 +1266,7 @@ void window_guest_stats_resize(rct_window *w) window_set_resize(w, 192, 162, 192, 162); } -/* rct2: 0x6974ED, 0x00697959, 0x00697C7B, 0x00697ED2, 0x00698333 +/* rct2: 0x6974ED, 0x00697959, 0x00697C7B, 0x00697ED2, 0x00698333 * This is a combination of 5 functions that were identical */ void window_guest_unknown_05(rct_window *w) @@ -1315,7 +1317,7 @@ void window_guest_stats_invalidate(rct_window *w) /** * * rct2: 0x0066ECC1 -* +* * ebp: colour, contains flag 0x80000000 for blinking */ void window_guest_stats_bars_paint(int value, int x, int y, rct_window *w, rct_drawpixelinfo *dpi, int colour){ @@ -1545,8 +1547,8 @@ void window_guest_rides_scroll_get_size(rct_window *w, int scrollIndex, int *wid window_invalidate(w); } - int visable_height = *height - - window_guest_rides_widgets[WIDX_RIDE_SCROLL].bottom + int visable_height = *height + - window_guest_rides_widgets[WIDX_RIDE_SCROLL].bottom + window_guest_rides_widgets[WIDX_RIDE_SCROLL].top + 21; @@ -1638,7 +1640,7 @@ void window_guest_rides_paint(rct_window *w, rct_drawpixelinfo *dpi) y = w->y + window_guest_rides_widgets[WIDX_PAGE_BACKGROUND].bottom - 12; - int ride_string_id = 3094; + int ride_string_id = 3094; int ride_string_arguments = 0; if (peep->favourite_ride != 0xFF){ rct_ride* ride = GET_RIDE(peep->favourite_ride); @@ -1886,7 +1888,7 @@ void window_guest_thoughts_paint(rct_window *w, rct_drawpixelinfo *dpi) RCT2_GLOBAL(0x13CE952, uint32) = argument1; RCT2_GLOBAL(0x13CE956, uint32) = argument2; - int width = window_guest_thoughts_widgets[WIDX_PAGE_BACKGROUND].right + int width = window_guest_thoughts_widgets[WIDX_PAGE_BACKGROUND].right - window_guest_thoughts_widgets[WIDX_PAGE_BACKGROUND].left - 8; @@ -2050,7 +2052,7 @@ void window_guest_inventory_paint(rct_window *w, rct_drawpixelinfo *dpi) for (int item = 0; item < SHOP_ITEM_COUNT; item++) { if (y >= maxY) break; if (!peep_has_item(peep, item)) continue; - + void *args = (void*)0x013CE952; rct_string_id stringId = window_guest_inventory_format_item(peep, item, (uint8*)args); y += gfx_draw_string_left_wrapped(dpi, args, x, y, itemNameWidth, stringId, 0); From cf7c827d0d5b3eae78aea19dca54ed252a05945e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 22 Sep 2015 19:03:44 +0200 Subject: [PATCH 0708/1173] Fix possible null dereference and resource leak --- src/title.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/title.c b/src/title.c index dd1874f8dc..f4d0d6de75 100644 --- a/src/title.c +++ b/src/title.c @@ -579,11 +579,11 @@ static uint8 *title_script_load() sprintf(path, "%s%c%s", gExePath, platform_get_path_separator(), filePath); log_verbose("loading title script, %s", path); file = SDL_RWFromFile(path, "r"); - sint64 fileSize = SDL_RWsize(file); if (file == NULL) { log_error("unable to load title script"); return NULL; } + sint64 fileSize = SDL_RWsize(file); uint8 *binaryScript = (uint8*)malloc(1024 * 8); if (binaryScript == NULL) { @@ -624,7 +624,8 @@ static uint8 *title_script_load() *scriptPtr++ = atoi(part1) & 0xFF; } else { log_error("unknown token, %s", token); - free(binaryScript); + SafeFree(binaryScript); + SDL_RWclose(file); return NULL; } } From 33d5e0b79f92518587a20ca826aa146bb7cddfe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 22 Sep 2015 19:05:00 +0200 Subject: [PATCH 0709/1173] fix loop counter --- src/platform/shared.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/platform/shared.c b/src/platform/shared.c index dc48f40c8c..3bb73a91ff 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -117,7 +117,7 @@ void platform_update_fullscreen_resolutions() gNumResolutions = 0; for (i = 0; i < numDisplayModes; i++) { SDL_GetDisplayMode(displayIndex, i, &mode); - + aspectRatio = (float)mode.w / mode.h; if (gResolutionsAllowAnyAspectRatio || fabs(desktopAspectRatio - aspectRatio) < 0.0001f) { gResolutions[gNumResolutions].width = mode.w; @@ -198,7 +198,7 @@ void platform_draw() else if (pitch == (width * 2) + padding) { uint16 *dst = pixels; - for (int y = height; y > 0; y++) { + for (int y = height; y > 0; y--) { for (int x = width; x > 0; x--) { *dst++ = *(uint16 *)(&gPaletteHWMapped[*src++]); } dst = (uint16*)(((uint8 *)dst) + padding); } @@ -206,7 +206,7 @@ void platform_draw() else if (pitch == width + padding) { uint8 *dst = pixels; - for (int y = height; y > 0; y++) { + for (int y = height; y > 0; y--) { for (int x = width; x > 0; x--) { *dst++ = *(uint8 *)(&gPaletteHWMapped[*src++]); } dst += padding; } @@ -649,7 +649,7 @@ int platform_scancode_to_rct_keycode(int sdl_key) { char keycode = (char)SDL_GetKeyFromScancode((SDL_Scancode)sdl_key); - // Until we reshufle the text files to use the new positions + // Until we reshufle the text files to use the new positions // this will suffice to move the majority to the correct positions. // Note any special buttons PgUp PgDwn are mapped wrong. if (keycode >= 'a' && keycode <= 'z') @@ -804,7 +804,7 @@ void platform_refresh_video() { int width = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); int height = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16); - + SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, gConfigGeneral.minimize_fullscreen_focus_loss ? "1" : "0"); if (gConfigGeneral.hardware_display) { @@ -826,7 +826,7 @@ void platform_refresh_video() pixelformat = format; } } - + gBufferTexture = SDL_CreateTexture(gRenderer, pixelformat, SDL_TEXTUREACCESS_STREAMING, width, height); Uint32 format; SDL_QueryTexture(gBufferTexture, &format, 0, 0, 0); From 8ec1054477a68c2ccfc808cfdfc965c23c15b4df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 22 Sep 2015 19:06:42 +0200 Subject: [PATCH 0710/1173] add missing parntheses --- src/ride/ride.c | 182 ++++++++++++++++++++++++------------------------ 1 file changed, 91 insertions(+), 91 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 5ff8e7e958..e07840e230 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -286,7 +286,7 @@ money32 ride_calculate_income_per_hour(rct_ride *ride) } /** - * + * * rct2: 0x006CAF80 * ax result x * bx result y @@ -405,7 +405,7 @@ bool track_block_get_next_from_zero(sint16 x, sint16 y, sint16 z_start, uint8 ri } /** - * + * * rct2: 0x006C60C2 */ bool track_block_get_next(rct_xy_element *input, rct_xy_element *output, int *z, int *direction) @@ -461,9 +461,9 @@ bool track_block_get_next(rct_xy_element *input, rct_xy_element *output, int *z, return track_block_get_next_from_zero(x, y, OriginZ, rideIndex, directionStart, output, z, direction); } -/* rct2: 0x006C63D6 +/* rct2: 0x006C63D6 * Returns the begin position / direction and end position / direction of the track piece that procedes the given location. - * Gets the previous track block coordinates from the + * Gets the previous track block coordinates from the * coordinates of the first of element of a track block. * Use track_block_get_previous if you are unsure if you are * on the first element of a track block @@ -561,7 +561,7 @@ bool track_block_get_previous_from_zero(sint16 x, sint16 y, sint16 z, uint8 ride } /** - * + * * rct2: 0x006C6402 * * @remarks outTrackBeginEnd.begin_x and outTrackBeginEnd.begin_y will be in the higher two bytes of ecx and edx where as @@ -612,7 +612,7 @@ bool track_block_get_previous(int x, int y, rct_map_element *mapElement, track_b } /** - * + * * Make sure to pass in the x and y of the start track element too. * rct2: 0x006CB02F * ax result x @@ -631,7 +631,7 @@ int ride_find_track_gap(rct_xy_element *input, rct_xy_element *output) if (ride->type == RIDE_TYPE_MAZE) return 0; - + w = window_find_by_class(WC_RIDE_CONSTRUCTION); if (w != NULL && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && _currentRideIndex == rideIndex) sub_6C9627(); @@ -652,7 +652,7 @@ int ride_find_track_gap(rct_xy_element *input, rct_xy_element *output) } /** - * + * * rct2: 0x006AF561 */ void ride_get_status(int rideIndex, int *formatSecondary, int *argument) @@ -726,7 +726,7 @@ int ride_can_have_multiple_circuits(rct_ride *ride) ) { return 0; } - + // Must have no more than one vehicle and one station if (ride->num_vehicles > 1 || ride->num_stations > 1) return 0; @@ -789,7 +789,7 @@ static int ride_check_if_construction_allowed(rct_ride *ride) if (ride->status != RIDE_STATUS_CLOSED) { RCT2_GLOBAL(0x013CE952 + 6, uint16) = ride->name; RCT2_GLOBAL(0x013CE952 + 8, uint32) = ride->name_arguments; - window_error_open(STR_CANT_START_CONSTRUCTION_ON, STR_MUST_BE_CLOSED_FIRST); + window_error_open(STR_CANT_START_CONSTRUCTION_ON, STR_MUST_BE_CLOSED_FIRST); return 0; } @@ -867,7 +867,7 @@ void ride_construct(int rideIndex) } /** - * + * * rct2: 0x006DD4D5 */ static void ride_remove_cable_lift(rct_ride *ride) @@ -888,7 +888,7 @@ static void ride_remove_cable_lift(rct_ride *ride) } /** - * + * * rct2: 0x006DD506 */ static void ride_remove_vehicles(rct_ride *ride) @@ -919,7 +919,7 @@ static void ride_remove_vehicles(rct_ride *ride) } /** - * + * * rct2: 0x006DD4AC */ void ride_clear_for_construction(int rideIndex) @@ -930,7 +930,7 @@ void ride_clear_for_construction(int rideIndex) ride = GET_RIDE(rideIndex); ride_measurement_clear(ride); - + ride->lifecycle_flags &= ~(RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; @@ -943,7 +943,7 @@ void ride_clear_for_construction(int rideIndex) } /** - * + * * rct2: 0x006664DF */ void ride_remove_peeps(int rideIndex) @@ -1020,7 +1020,7 @@ void ride_remove_peeps(int rideIndex) invalidate_sprite_2((rct_sprite*)peep); peep->state = PEEP_STATE_FALLING; sub_693BE5(peep, 0); - + peep->happiness = min(peep->happiness, peep->happiness_growth_rate) / 2; peep->happiness_growth_rate = peep->happiness; peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_STATS; @@ -1034,7 +1034,7 @@ void ride_remove_peeps(int rideIndex) /** * Gets the origin track element (sequence 0). Seems to do more than that though and even invalidates track. - * rct2: 0x006C683D + * rct2: 0x006C683D * ax : x * bx : direction << 8, type * cx : y @@ -1178,7 +1178,7 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par } /** - * + * * rct2: 0x006C96C0 */ void sub_6C96C0() @@ -1203,7 +1203,7 @@ void sub_6C96C0() rideIndex = _currentRideIndex; RCT2_GLOBAL(0x00F441D2, uint8) = rideIndex; - + x = RCT2_GLOBAL(0x00F440C5, uint16); y = RCT2_GLOBAL(0x00F440C7, uint16); z = RCT2_GLOBAL(0x00F440C9, uint16); @@ -1221,7 +1221,7 @@ void sub_6C96C0() y -= TileDirectionDelta[direction].y; } rct_xy_element next_track; - + if (track_block_get_next_from_zero(x, y, z, rideIndex, direction, &next_track, &z, &direction)) { game_do_command( next_track.x, @@ -1280,7 +1280,7 @@ void sub_6C9627() } /** - * + * * rct2: 0x006C9B19 */ static void ride_construction_reset_current_piece() @@ -1306,7 +1306,7 @@ static void ride_construction_reset_current_piece() } /** - * + * * rct2: 0x006C9800 */ void ride_construction_set_default_next_piece() @@ -1432,7 +1432,7 @@ void ride_construction_set_default_next_piece() } /** - * + * * rct2: 0x006C9296 */ void ride_select_next_section() @@ -1490,7 +1490,7 @@ void ride_select_next_section() } /** - * + * * rct2: 0x006C93B8 */ void ride_select_previous_section() @@ -1540,7 +1540,7 @@ void ride_select_previous_section() } /** - * + * * rct2: 0x006CC2CA */ static int ride_modify_entrance_or_exit(rct_map_element *mapElement, int x, int y) @@ -1592,13 +1592,13 @@ static int ride_modify_entrance_or_exit(rct_map_element *mapElement, int x, int RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) = entranceType == ENTRANCE_TYPE_RIDE_ENTRANCE ? 29 : 30; RCT2_GLOBAL(0x00F44191, uint8) = entranceType; } - + window_invalidate_by_class(WC_RIDE_CONSTRUCTION); return 1; } /** - * + * * rct2: 0x006CC287 */ int ride_modify_maze(rct_map_element *mapElement, int x, int y) @@ -1615,7 +1615,7 @@ int ride_modify_maze(rct_map_element *mapElement, int x, int y) } /** - * + * * rct2: 0x006CC056 */ int ride_modify(rct_xy_element *input) @@ -1661,7 +1661,7 @@ int ride_modify(rct_xy_element *input) z = mapElement.element->base_height * 8; direction = mapElement.element->type & 3; type = mapElement.element->properties.track.type; - + if (sub_6C683D(&x, &y, &z, direction, type, 0, NULL, 0)) return 0; @@ -1713,7 +1713,7 @@ int ride_modify(rct_xy_element *input) } /** - * + * * rct2: 0x006CC3FB */ int sub_6CC3FB(int rideIndex) @@ -1799,7 +1799,7 @@ static void ride_update(int rideIndex) { int i; rct_ride *ride = GET_RIDE(rideIndex); - + if (ride->var_1CA != 0) ride->var_1CA--; @@ -2066,7 +2066,7 @@ static void ride_breakdown_update(int rideIndex) return; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) return; - + if (ride->lifecycle_flags & (RIDE_LIFECYCLE_BROKEN_DOWN | RIDE_LIFECYCLE_CRASHED)) ride->var_19C++; @@ -2131,7 +2131,7 @@ static int ride_get_new_breakdown_problem(rct_ride *ride) entry = ride_get_entry(ride); if (entry->flags & RIDE_ENTRY_FLAG_14) return -1; - + availableBreakdownProblems = RideAvailableBreakdowns[ride->type]; // Calculate the total probability range for all possible breakdown problems @@ -2198,7 +2198,7 @@ void ride_prepare_breakdown(int rideIndex, int breakdownReason) ride->mechanic_status = RIDE_MECHANIC_STATUS_UNDEFINED; ride->var_1AC = 0; ride->var_1AD = 0; - + switch (breakdownReason) { case BREAKDOWN_SAFETY_CUT_OUT: case BREAKDOWN_CONTROL_FAILURE: @@ -2303,7 +2303,7 @@ static void ride_mechanic_status_update(int rideIndex, int mechanicStatus) int breakdownReason; rct_ride *ride; rct_peep *mechanic; - + ride = GET_RIDE(rideIndex); switch (mechanicStatus) { case RIDE_MECHANIC_STATUS_UNDEFINED: @@ -2402,7 +2402,7 @@ rct_peep *ride_find_closest_mechanic(rct_ride *ride, int forInspection) int x, y, z, stationIndex, direction; uint16 xy; rct_map_element *mapElement; - + // Get either exit position or entrance position if there is no exit stationIndex = ride->inspection_station; xy = ride->exits[stationIndex]; @@ -2441,7 +2441,7 @@ rct_peep *find_closest_mechanic(int x, int y, int forInspection) unsigned int closestDistance, distance; uint16 spriteIndex; rct_peep *peep, *closestMechanic = NULL; - + closestDistance = -1; FOR_ALL_STAFF(spriteIndex, peep) { if (peep->staff_type != STAFF_TYPE_MECHANIC) @@ -2465,7 +2465,7 @@ rct_peep *find_closest_mechanic(int x, int y, int forInspection) if (map_is_location_in_park(x, y)) if (!mechanic_is_location_in_patrol(peep, x & 0xFFE0, y & 0xFFE0)) continue; - + if (peep->x == (sint16)0x8000) continue; @@ -2572,7 +2572,7 @@ static void ride_music_update(int rideIndex) } } - // Oscillate parameters for a power cut effect when breaking down + // Oscillate parameters for a power cut effect when breaking down if (ride->lifecycle_flags & (RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN)) { if (ride->breakdown_reason_pending == BREAKDOWN_CONTROL_FAILURE) { if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 7)) @@ -2788,7 +2788,7 @@ int ride_get_free_measurement() } /** - * + * * rct2: 0x006B66D9 */ rct_ride_measurement *ride_get_measurement(int rideIndex, rct_string_id *message) @@ -2830,7 +2830,7 @@ rct_ride_measurement *ride_get_measurement(int rideIndex, rct_string_id *message } else { measurement = GET_RIDE_MEASUREMENT(i); } - + measurement->ride_index = rideIndex; ride->measurement_index = i; measurement->flags = 0; @@ -2938,8 +2938,8 @@ void ride_check_all_reachable() { rct_ride *ride; int i; - - FOR_ALL_RIDES(i, ride) { + + FOR_ALL_RIDES(i, ride) { if (ride->connected_message_throttle != 0) ride->connected_message_throttle--; if (ride->status != RIDE_STATUS_OPEN || ride->connected_message_throttle != 0) @@ -2999,11 +2999,11 @@ static void ride_entrance_exit_connected(rct_ride* ride, int ride_idx) if (entrance != 0xFFFF && !ride_entrance_exit_is_reachable(entrance, ride, i)) { // name of ride is parameter of the format string RCT2_GLOBAL(0x013CE952, uint16) = ride->name; - RCT2_GLOBAL(0x013CE954, uint32) = ride->name_arguments; + RCT2_GLOBAL(0x013CE954, uint32) = ride->name_arguments; news_item_add_to_queue(1, STR_ENTRANCE_NOT_CONNECTED, ride_idx); ride->connected_message_throttle = 3; } - + if (exit != 0xFFFF && !ride_entrance_exit_is_reachable(exit, ride, i)) { // name of ride is parameter of the format string RCT2_GLOBAL(0x013CE952, uint16) = ride->name; @@ -3012,7 +3012,7 @@ static void ride_entrance_exit_connected(rct_ride* ride, int ride_idx) ride->connected_message_throttle = 3; } - } + } } static void ride_shop_connected(rct_ride* ride, int ride_idx) @@ -3026,7 +3026,7 @@ static void ride_shop_connected(rct_ride* ride, int ride_idx) x = (coordinate & 0xFF); y = (coordinate >> 8) & 0xFF; - + mapElement = map_get_first_element_at(x, y); do { if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_TRACK && mapElement->properties.track.ride_index == ride_idx) @@ -3191,7 +3191,7 @@ void ride_set_map_tooltip(rct_map_element *mapElement) } /** - * + * * rct2: 0x006BC3AC * Update ride music parameters * @param x (ax) @@ -3638,7 +3638,7 @@ void ride_music_update_final() void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) { RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_RUNNING_COSTS * 4; - + uint8 ride_id = *edx & 0xFF; rct_ride* ride = GET_RIDE(ride_id); @@ -3752,7 +3752,7 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * } /** - * + * * rct2: 0x006B4CC1 */ int ride_mode_check_valid_station_numbers(rct_ride *ride) @@ -3813,7 +3813,7 @@ int ride_mode_check_station_present(rct_ride* ride){ } /** - * + * * rct2: 0x006B5872 */ int ride_check_for_entrance_exit(int rideIndex) @@ -3833,11 +3833,11 @@ int ride_check_for_entrance_exit(int rideIndex) if (ride->entrances[i] != 0xFFFF) { entrance = 1; } - + if (ride->exits[i] != 0xFFFF) { exit = 1; } - + // If station start and no entrance/exit // Sets same error message as no entrance if (ride->exits[i] == 0xFFFF && ride->entrances[i] == 0xFFFF){ @@ -3860,7 +3860,7 @@ int ride_check_for_entrance_exit(int rideIndex) } /** - * + * * rct2: 0x006B5952 */ void sub_6B5952(int rideIndex) @@ -3890,7 +3890,7 @@ void sub_6B5952(int rideIndex) } /** - * + * * rct2: 0x006D3319 */ int ride_check_block_brakes(rct_xy_element *input, rct_xy_element *output) @@ -4006,13 +4006,13 @@ bool ride_check_track_contains_banked(rct_xy_element *input, rct_xy_element *out } /** - * + * * rct2: 0x006CB25D */ int ride_check_station_length(rct_xy_element *input, rct_xy_element *output) { rct_window* w = window_find_by_class(WC_RIDE_CONSTRUCTION); - if (w != 0 && + if (w != 0 && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && _currentRideIndex == input->element->properties.track.ride_index){ sub_6C9627(); @@ -4055,7 +4055,7 @@ int ride_check_station_length(rct_xy_element *input, rct_xy_element *output) } /** - * + * * rct2: 0x006CB2DA */ bool ride_check_start_and_end_is_station(rct_xy_element *input, rct_xy_element *output) @@ -4128,7 +4128,7 @@ void ride_set_boat_hire_return_point(rct_ride *ride, rct_xy_element *startElemen } /** - * + * * rct2: 0x006B4D39 */ static void ride_set_maze_entrance_exit_points(rct_ride *ride) @@ -4334,7 +4334,7 @@ static bool sub_6D31A6(rct_ride *ride, bool isApplying) } /** - * + * * rct2: 0x006DF4D4 */ bool ride_create_cable_lift(int rideIndex, bool isApplying) @@ -4408,7 +4408,7 @@ bool ride_create_cable_lift(int rideIndex, bool isApplying) } /** - * + * * rct2: 0x006B51C0 */ void loc_6B51C0(int rideIndex) @@ -4463,7 +4463,7 @@ void loc_6B51C0(int rideIndex) } /** - * + * * rct2: 0x006B528A */ void loc_6B528A(rct_xy_element *trackElement) @@ -4485,7 +4485,7 @@ void loc_6B528A(rct_xy_element *trackElement) } /** - * + * * rct2: 0x006B4F6B */ rct_map_element *loc_6B4F6B(int rideIndex, int x, int y) @@ -4509,7 +4509,7 @@ rct_map_element *loc_6B4F6B(int rideIndex, int x, int y) if (mapElement->properties.track.ride_index == rideIndex) return mapElement; } while (!map_element_is_last_for_tile(mapElement++)); - + return NULL; } @@ -4633,7 +4633,7 @@ int ride_is_valid_for_test(int rideIndex, int goingToBeOpen, int isApplying) return 1; } /** - * + * * rct2: 0x006B4EEA */ int ride_is_valid_for_open(int rideIndex, int goingToBeOpen, int isApplying) @@ -4661,7 +4661,7 @@ int ride_is_valid_for_open(int rideIndex, int goingToBeOpen, int 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; @@ -4762,7 +4762,7 @@ void ride_set_status(int rideIndex, int status) } /** - * + * * rct2: 0x006B4EA6 */ void game_command_set_ride_status(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) @@ -4788,7 +4788,7 @@ void game_command_set_ride_status(int *eax, int *ebx, int *ecx, int *edx, int *e ride_remove_peeps(rideIndex); } } - + ride->status = RIDE_STATUS_CLOSED; ride->lifecycle_flags &= ~RIDE_LIFECYCLE_PASS_STATION_NO_STOPPING; ride->race_winner = 0xFFFF; @@ -4836,7 +4836,7 @@ void ride_set_name(int rideIndex, const char *name) } /** - * + * * rct2: 0x006B578B */ void game_command_set_ride_name(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) @@ -4905,7 +4905,7 @@ void game_command_set_ride_name(int *eax, int *ebx, int *ecx, int *edx, int *esi } /** - * + * * rct2: 0x006CB7FB */ int ride_get_refund_price(int ride_id) @@ -4985,7 +4985,7 @@ int ride_get_refund_price(int ride_id) } /** - * + * * rct2: 0x00696707 */ static void ride_stop_peeps_queuing(int rideIndex) @@ -5067,7 +5067,7 @@ static bool ride_name_exists(char *name) } /** - * + * * rct2: 0x006B4776 */ static void ride_set_to_random_colour_preset(rct_ride *ride) @@ -5140,7 +5140,7 @@ static bool shop_item_has_common_price(int shopItem) } /** - * + * * rct2: 0x006B3F0F */ money32 ride_create(int type, int subType, int flags, int *outRideIndex) @@ -5269,7 +5269,7 @@ foundRideEntry: ride->var_120 = 0; ride->var_122 = 0; ride->var_148 = 0; - + ride->price = 0; ride->price_secondary = 0; if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { @@ -5286,7 +5286,7 @@ foundRideEntry: if (rideEntry->shop_item_secondary != 255) { ride->price_secondary = DefaultShopItemPrice[rideEntry->shop_item_secondary]; } - + if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) == OBJECTIVE_BUILD_THE_BEST) { ride->price = 0; } @@ -5331,7 +5331,7 @@ foundRideEntry: ride->running_cost = 0; ride->var_134 = 0; ride->var_136 = 0; - + ride->value = 0xFFFF; ride->satisfaction = 255; ride->satisfaction_time_out = 0; @@ -5379,7 +5379,7 @@ foundRideEntry: } /** - * + * * rct2: 0x006B3F0F */ void game_command_create_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) @@ -5395,7 +5395,7 @@ void game_command_callback_ride_construct_new(int eax, int ebx, int ecx, int edx } /** - * + * * rct2: 0x006B49D9 */ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) @@ -5440,7 +5440,7 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi sub_6CB945(ride_id); news_item_disable_news(NEWS_ITEM_RIDE, ride_id); - + for(int i = 0; i < MAX_BANNERS; i++){ rct_banner *banner = &gBanners[i]; if(banner->type != BANNER_NULL && banner->flags & BANNER_FLAG_2 && banner->colour == ride_id){ @@ -5450,7 +5450,7 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi } uint16 spriteIndex; - rct_peep *peep; + rct_peep *peep; FOR_ALL_GUESTS(spriteIndex, peep){ uint8 ride_id_bit = ride_id & 0x3; uint8 ride_id_offset = ride_id / 8; @@ -5523,7 +5523,7 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi } /** - * + * * rct2: 0x006B2FC5 */ void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) @@ -5580,7 +5580,7 @@ void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, in } /** - * + * * rct2: 0x006B53E9 */ void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) @@ -5591,7 +5591,7 @@ void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *es rct_ride *ride; rct_ride_type *ride_type; bool secondary_price; - + flags = *ebx; ride_number = (*edx & 0xFF); ride = GET_RIDE(ride_number); @@ -5944,7 +5944,7 @@ int loc_6CD18E(short mapX, short mapY, short entranceMinX, short entranceMinY, s } /** - * + * * rct2: 0x006CCF70 */ void ride_get_entrance_or_exit_position_from_screen_position(int screenX, int screenY, int *outX, int *outY, int *outDirection) @@ -6025,7 +6025,7 @@ void ride_get_entrance_or_exit_position_from_screen_position(int screenX, int sc } if (map_get_station(mapElement) != RCT2_GLOBAL(0x00F44193, uint8)) continue; - + int ebx = (mapElement->properties.track.type << 4) + (mapElement->properties.track.sequence & 0x0F); int eax = (direction + 2 - mapElement->type) & MAP_ELEMENT_DIRECTION_MASK; if (RCT2_ADDRESS(0x0099CA64, uint8)[ebx] & (1 << eax)) { @@ -6154,7 +6154,7 @@ bool ride_are_all_possible_entrances_and_exits_built(rct_ride *ride) { if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) return true; - + for (int i = 0; i < 4; i++) { if (ride->station_starts[i] == 0xFFFF) continue; if (ride->entrances[i] == 0xFFFF) { @@ -6273,14 +6273,14 @@ static void ride_update_vehicle_colours(int rideIndex) } /** - * + * * rct2: 0x006DE4CD * trainLayout: Originally fixed to 0x00F64E38. This no longer postfixes with 255. */ void ride_entry_get_train_layout(int rideEntryIndex, int numCarsPerTrain, uint8 *trainLayout) { rct_ride_type *rideEntry = GET_RIDE_ENTRY(rideEntryIndex); - + for (int i = 0; i < numCarsPerTrain; i++) { uint8 vehicleType = rideEntry->default_vehicle; if (i == 0 && rideEntry->front_vehicle != 255) { @@ -6333,7 +6333,7 @@ static int ride_get_track_length(rct_ride *ride) continue; trackType = mapElement->properties.track.type; - if (!RCT2_GLOBAL(0x0099BA64 + (trackType * 16), uint32) & 0x10) + if (!(RCT2_GLOBAL(0x0099BA64 + (trackType * 16), uint32) & 0x10)) continue; if (mapElement->base_height != z) From a3d407079f50d76d92891076e9e41a85e039146c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 22 Sep 2015 19:18:57 +0200 Subject: [PATCH 0711/1173] fix windows position clamping --- src/interface/window.c | 82 +++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/src/interface/window.c b/src/interface/window.c index db2b98c60b..3e9b3e3a0e 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -142,7 +142,7 @@ rct_widget *window_get_scroll_widget(rct_window *w, int scrollIndex) } /** - * + * * rct2: 0x006ED7B0 */ void window_dispatch_update_all() @@ -165,7 +165,7 @@ void window_update_all_viewports() } /** - * + * * rct2: 0x006E77A1 */ void window_update_all() @@ -201,7 +201,7 @@ void window_update_all() } /** - * + * * rct2: 0x006E78E3 */ static void window_scroll_wheel_input(rct_window *w, int scrollIndex, int wheel) @@ -209,7 +209,7 @@ static void window_scroll_wheel_input(rct_window *w, int scrollIndex, int wheel) int widgetIndex, size; rct_scroll *scroll; rct_widget *widget; - + scroll = &w->scrolls[scrollIndex]; widget = window_get_scroll_widget(w, scrollIndex); widgetIndex = window_get_widget_index(w, widget); @@ -233,7 +233,7 @@ static void window_scroll_wheel_input(rct_window *w, int scrollIndex, int wheel) } /** - * + * * rct2: 0x006E793B */ static int window_wheel_input(rct_window *w, int wheel) @@ -260,7 +260,7 @@ static int window_wheel_input(rct_window *w, int wheel) } /** - * + * * rct2: 0x006E79FB */ static void window_viewport_wheel_input(rct_window *w, int wheel) @@ -275,7 +275,7 @@ static void window_viewport_wheel_input(rct_window *w, int wheel) } /** - * + * * rct2: 0x006E7868 */ static void window_all_wheel_input() @@ -328,7 +328,7 @@ static void window_all_wheel_input() return; } } - + // Check other scroll views on window if (window_wheel_input(w, wheel)) return; @@ -430,7 +430,7 @@ rct_window *window_create(int x, int y, int width, int height, rct_window_event_ } /** - * + * * rct2: 0x006EA934 * * @param x (dx) @@ -455,7 +455,7 @@ static bool sub_6EA8EC(int x, int y, int width, int height) } /** - * + * * rct2: 0x006EA934 * * @param x (dx) @@ -473,7 +473,7 @@ static bool sub_6EA934(int x, int y, int width, int height) } /** - * + * * rct2: 0x006EA934 * * @param x (dx) @@ -624,7 +624,7 @@ rct_window *window_create_auto_pos(int width, int height, rct_window_event_list // Clamp to inside the screen foundSpace: if (x < 0) - x = x; + x = 0; if (x + width > screenWidth) x = screenWidth - width; @@ -708,7 +708,7 @@ void window_close_by_class(rct_windowclass cls) void window_close_by_number(rct_windowclass cls, rct_windownumber number) { rct_window* w; - + for (w = g_window_list; w < RCT2_NEW_WINDOW; w++) { if (w->classification == cls && w->number == number) { window_close(w); @@ -744,7 +744,7 @@ rct_window *window_find_by_class(rct_windowclass cls) rct_window *window_find_by_number(rct_windowclass cls, rct_windownumber number) { rct_window *w; - + for (w = g_window_list; w < RCT2_NEW_WINDOW; w++) if (w->classification == cls && w->number == number) return w; @@ -807,7 +807,7 @@ void window_close_all_except_class(rct_windowclass cls) { } /** - * + * * rct2: 0x006EA845 */ rct_window *window_find_from_point(int x, int y) @@ -827,7 +827,7 @@ rct_window *window_find_from_point(int x, int y) widget = &w->widgets[widget_index]; } - + return w; } @@ -835,7 +835,7 @@ rct_window *window_find_from_point(int x, int y) } /** - * + * * rct2: 0x006EA594 * x (ax) * y (bx) @@ -953,7 +953,7 @@ void widget_invalidate(rct_window *w, int widgetIndex) void widget_invalidate_by_class(rct_windowclass cls, int widgetIndex) { rct_window* w; - + for (w = g_window_list; w < RCT2_NEW_WINDOW; w++) if (w->classification == cls) widget_invalidate(w, widgetIndex); @@ -969,7 +969,7 @@ void widget_invalidate_by_class(rct_windowclass cls, int widgetIndex) void widget_invalidate_by_number(rct_windowclass cls, rct_windownumber number, int widgetIndex) { rct_window* w; - + for (w = g_window_list; w < RCT2_NEW_WINDOW; w++) if (w->classification == cls && w->number == number) widget_invalidate(w, widgetIndex); @@ -1019,7 +1019,7 @@ void window_init_scroll_widgets(rct_window *w) } /** - * + * * rct2: 0x006EAE4E * * @param w The window (esi). @@ -1081,7 +1081,7 @@ int window_get_scroll_data_index(rct_window *w, int widget_index) } /** - * + * * rct2: 0x006ECDA4 */ rct_window *window_bring_to_front(rct_window *w) @@ -1133,7 +1133,7 @@ rct_window *window_bring_to_front_by_class(rct_windowclass cls) } /** - * + * * rct2: 0x006ED78A * cls (cl) * number (dx) @@ -1184,7 +1184,7 @@ void window_push_others_right(rct_window* window) } /** - * + * * rct2: 0x006EE6EA */ void window_push_others_below(rct_window *w1) @@ -1228,13 +1228,13 @@ void window_push_others_below(rct_window *w1) /** - * + * * rct2: 0x006EE2E4 */ rct_window *window_get_main() { rct_window* w; - + for (w = g_window_list; w < RCT2_NEW_WINDOW; w++) if (w->classification == WC_MAIN_WINDOW) return w; @@ -1243,9 +1243,9 @@ rct_window *window_get_main() } /** - * Based on + * Based on * rct2: 0x696ee9 & 0x66842F & 0x006AF3B3 - * + * */ void window_scroll_to_viewport(rct_window *w) { @@ -1345,7 +1345,7 @@ void window_scroll_to_location(rct_window *w, int x, int y, int z) } /** - * + * * rct2: 0x00688956 */ void sub_688956() @@ -1357,7 +1357,7 @@ void sub_688956() } /** - * + * * rct2: 0x0068881A * direction can be used to alter the camera rotation: * 1: clockwise @@ -1438,7 +1438,7 @@ void window_zoom_set(rct_window *w, int zoomLevel) } /** - * + * * rct2: 0x006887A6 */ void window_zoom_in(rct_window *w) @@ -1447,7 +1447,7 @@ void window_zoom_in(rct_window *w) } /** - * + * * rct2: 0x006887E0 */ void window_zoom_out(rct_window *w) @@ -1456,7 +1456,7 @@ void window_zoom_out(rct_window *w) } /** - * + * * rct2: 0x006EE308 * DEPRECIATED please use the new text_input window. */ @@ -1602,7 +1602,7 @@ static int window_draw_split(rct_window *w, int left, int top, int right, int bo } /** - * + * * rct2: 0x006EB15C * * @param window (esi) @@ -1636,7 +1636,7 @@ void window_draw_widgets(rct_window *w, rct_drawpixelinfo *dpi) } /** - * + * * rct2: 0x00685BE1 * * @param dpi (edi) @@ -1726,7 +1726,7 @@ void window_set_resize(rct_window *w, int minWidth, int minHeight, int maxWidth, } /** - * + * * rct2: 0x006EE212 * * @param tool (al) @@ -1758,7 +1758,7 @@ int tool_set(rct_window *w, int widgetIndex, int tool) } /** - * + * * rct2: 0x006EE281 */ void tool_cancel() @@ -2006,7 +2006,7 @@ void window_bubble_list_item(rct_window* w, int item_position){ w->list_item_positions[item_position + 1] = swap; } -/* rct2: 0x006ED710 +/* rct2: 0x006ED710 * Called after a window resize to move windows if they * are going to be out of sight. */ @@ -2140,7 +2140,7 @@ void window_resize_gui_scenario_editor(int width, int height) RCT2_GLOBAL(0x9A998A, uint16) = bottomWind->width - 198; RCT2_GLOBAL(0x9A998C, uint16) = bottomWind->width - 3; } - + } /* Based on rct2: 0x6987ED and another version from window_park */ @@ -2148,7 +2148,7 @@ void window_align_tabs(rct_window *w, uint8 start_tab_id, uint8 end_tab_id) { int i, x = w->widgets[start_tab_id].left; int tab_width = w->widgets[start_tab_id].right - w->widgets[start_tab_id].left; - + for (i = start_tab_id; i <= end_tab_id; i++) { if (!(w->disabled_widgets & (1LL << i))) { w->widgets[i].left = x; @@ -2380,7 +2380,7 @@ void window_move_and_snap(rct_window *w, int newWindowX, int newWindowY, int sna int originalY = w->y; newWindowY = clamp(29, newWindowY, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 34); - + if (snapProximity > 0) { w->x = newWindowX; w->y = newWindowY; @@ -2498,4 +2498,4 @@ void window_update_textbox() widget_invalidate(w, gCurrentTextBox.widget_index); window_event_textinput_call(w, gCurrentTextBox.widget_index, gTextBoxInput); } -} \ No newline at end of file +} From 52e0b737bebed912091d68e0865da57cc1601381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 22 Sep 2015 22:45:03 +0200 Subject: [PATCH 0712/1173] Drop initial null check from SafeFree Both free and delete treat nullptr the same way: as a no-op [1][2]. Get rid of checking if the pointer passed is a null one before acting on it. See stackoverflow.com/q/154136/do-while-and-if-else-statements-in in case you are wondering why is it done this way. [1] http://www.cplusplus.com/reference/cstdlib/free/ [2] http://www.cplusplus.com/reference/new/operator%20delete/ --- src/common.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/common.h b/src/common.h index a965995ce0..b488f7c8e7 100644 --- a/src/common.h +++ b/src/common.h @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -17,21 +17,21 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ - + #ifndef _COMMON_H_ #define _COMMON_H_ #include "diagnostic.h" #include "rct2.h" -#define SafeFree(x) if ((x) != NULL) { free(x); (x) = NULL; } +#define SafeFree(x) do { free(x); (x) = NULL; } while (0) -#define SafeDelete(x) if ((x) != nullptr) { delete (x); (x) = nullptr; } -#define SafeDeleteArray(x) if ((x) != nullptr) { delete[] (x); (x) = nullptr; } +#define SafeDelete(x) do { delete (x); (x) = nullptr; } while (0) +#define SafeDeleteArray(x) do { delete[] (x); (x) = nullptr; } while (0) #ifndef interface #define interface struct #endif #define abstract = 0 -#endif \ No newline at end of file +#endif From 1bd8e11c0f4ebea025fda131556776c550820332 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 22 Sep 2015 23:36:05 +0200 Subject: [PATCH 0713/1173] Make it work on Linux MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Right now the project is decompiled to the point where it is feasible to try porting it to another platform. It doesn't work 100% correctly, but it's nearing this state. To port it to Linux I mmapped the openrct2.exe into expected places, disabled two offending calls (RCT2_CALLPROC_EBPSAFE(0x0040701D) and RCT2_CALLPROC_X(0x006E7FF3…)), replaced memory management routines with generic ones and removed all the function-pointer calls. A basic, non-exhaustive check is included to verify that memory is loaded correctly in place. That last bit is probably the most intrusive one, but had to be done, as the calling convention on Linux differs from the one on Windows. It could possibly be emulated (just like RCT2_CALLFUNC_X) until dependency on exe is dropped. It is possible to completely remove calls out to original code by commenting out contents of RCT2_CALLFUNC_X, right now this will yield working UI, but no rendering of peeps, rides or rest of world. This can be used as a benchmark or test platform for correctness of implementation. The data sections will still be required for now. Assets are expected to be in specific places, so to launch it, following needs to satisified: * $build/data/ has to have contents of $RCT2/Data/ * $build/data/ (same as above) has to have contents of $repo/data/ * $build/ObjData/ has to have contents of $RCT2/ObjData/ * $build/../openrct2.exe has to be $repo/openrct2.exe (as of 976ea0d) Keep in mind you can symlink stuff and that filesystems are case sensitive! You can copy more of required data to possibly improve your experience. Pretty much all of this commit will possibly have to be reverted by the time OpenRCT2 gains independence. Remember to build with -DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON --- src/addresses.h | 11 ++++ src/audio/mixer.cpp | 4 ++ src/interface/viewport.c | 4 ++ src/interface/window.c | 4 ++ src/localisation/localisation.c | 2 +- src/openrct2.c | 89 +++++++++++++++++++++++++++++++++ src/platform/linux.c | 1 - src/rct2.c | 15 ++++++ 8 files changed, 128 insertions(+), 2 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 63d03c17a3..672d4f3a12 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -27,6 +27,7 @@ #define RCT2_ADDRESS(address, type) ((type*)(address)) #define RCT2_GLOBAL(address, type) (*((type*)(address))) +#ifdef _WIN32 #define RCT2_CALLPROC(address) (((void(*)())(address))()) #define RCT2_CALLFUNC(address, returnType) (((returnType(*)())(address))()) @@ -36,6 +37,16 @@ #define RCT2_CALLFUNC_4(address, returnType, a1, a2, a3, a4, v1, v2, v3, v4) (((returnType(*)(a1, a2, a3, a4))(address))(v1, v2, v3, v4)) #define RCT2_CALLFUNC_5(address, returnType, a1, a2, a3, a4, a5, v1, v2, v3, v4, v5) (((returnType(*)(a1, a2, a3, a4, a5))(address))(v1, v2, v3, v4, v5)) #define RCT2_CALLFUNC_6(address, returnType, a1, a2, a3, a4, a5, a6, v1, v2, v3, v4, v5, v6) (((returnType(*)(a1, a2, a3, a4, a5, a6))(address))(v1, v2, v3, v4, v5, v6)) +#else +#define RCT2_CALLPROC(address) +#define RCT2_CALLFUNC(address, returnType) +#define RCT2_CALLFUNC_1(address, returnType, a1, v1) +#define RCT2_CALLFUNC_2(address, returnType, a1, a2, v1, v2) +#define RCT2_CALLFUNC_3(address, returnType, a1, a2, a3, v1, v2, v3) +#define RCT2_CALLFUNC_4(address, returnType, a1, a2, a3, a4, v1, v2, v3, v4) +#define RCT2_CALLFUNC_5(address, returnType, a1, a2, a3, a4, a5, v1, v2, v3, v4, v5) +#define RCT2_CALLFUNC_6(address, returnType, a1, a2, a3, a4, a5, a6, v1, v2, v3, v4, v5, v6) +#endif // _WIN32 #define RCT2_CALLPROC_1(address, a1, v1) RCT2_CALLFUNC_1(address, void, a1, v1) #define RCT2_CALLPROC_2(address, a1, a2, v1, v2) RCT2_CALLFUNC_2(address, void, a1, a2, v1, v2) diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index 26470fe369..4faad9c126 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -545,9 +545,13 @@ Channel* Mixer::Play(Source& source, int loop, bool deleteondone, bool deletesou void Mixer::Stop(Channel& channel) { +#ifdef _WIN32 Lock(); channel.stopping = true; Unlock(); +#else +#warning unimplemented +#endif // _WIN32 } bool Mixer::LoadMusic(int pathid) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 34f06e0026..73a2fbc7a8 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -271,7 +271,11 @@ void sub_689174(sint16* x, sint16* y, sint16 *z) void sub_6E7FF3(rct_window *w, rct_viewport *viewport, int x, int y) { +#ifdef _WIN32 RCT2_CALLPROC_X(0x006E7FF3, 0, 0, 0, x, (int)viewport, (int)w, y); +#else + STUB(); +#endif // _WIN32 // int zoom = 1 << viewport->zoom; // if (w >= RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*)){ diff --git a/src/interface/window.c b/src/interface/window.c index 3e9b3e3a0e..699cd15477 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -2420,7 +2420,11 @@ void textinput_cancel() // The following code is only necessary for the old Windows text input dialog. In theory this isn't used anymore, but can // still be triggered via original code paths. +#ifdef _WIN32 RCT2_CALLPROC_EBPSAFE(0x0040701D); +#else + log_warning("there should be something called here (0x0040701D)"); +#endif // _WIN32 if (RCT2_GLOBAL(0x009DEB8C, uint8) != 255) { RCT2_CALLPROC_EBPSAFE(0x006EE4E2); w = window_find_by_number( diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index e39c58a3d9..9f44cf7454 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -855,7 +855,7 @@ int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength) MultiByteToWideChar(CP_ACP, 0, src, -1, intermediateBuffer, bufferCount); int result = WideCharToMultiByte(CP_UTF8, 0, intermediateBuffer, -1, dst, maxBufferLength, NULL, NULL); #else - STUB(); + //STUB(); // we cannot walk past maxBufferLength, but in case we have still space left // we need one byte for null terminator int result = strnlen(src, maxBufferLength) + 1; diff --git a/src/openrct2.c b/src/openrct2.c index c6d7a80570..7eede9d930 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -40,6 +40,15 @@ #include "util/util.h" #include "world/mapgen.h" +#ifdef __linux__ +#include +#include +#include +#include +#include +#include +#endif // __linux__ + int gOpenRCT2StartupAction = STARTUP_ACTION_TITLE; utf8 gOpenRCT2StartupActionPath[512] = { 0 }; utf8 gExePath[MAX_PATH]; @@ -175,6 +184,86 @@ bool openrct2_initialise() return false; } +#ifdef __linux__ + #define DATA_OFFSET 0x004A4000 + + const char *exepath = "../openrct2.exe"; + int fd = open(exepath, O_RDONLY); + if (fd < 0) { + log_fatal("failed to open %s, errno = %d", exepath, errno); + exit(1); + } + + // Using PE-bear I was able to figure out all the needed addresses to be filled. + // There are three sections to be loaded: .rdata, .data and .text, plus another + // one to be mapped: DATASEG. + // Out of the three, two can simply be mmapped into memory, while the third one, + // .data has a virtual size which is much completely different to its file size + // (even when taking page-alignment into consideration) + // + // The sections are as follows (dump from gdb) + // [0] 0x401000->0x6f7000 at 0x00001000: .text ALLOC LOAD READONLY CODE HAS_CONTENTS + // [1] 0x6f7000->0x8a325d at 0x002f7000: CODESEG ALLOC LOAD READONLY CODE HAS_CONTENTS + // [2] 0x8a4000->0x9a5894 at 0x004a4000: .rdata ALLOC LOAD DATA HAS_CONTENTS + // [3] 0x9a6000->0x9e2000 at 0x005a6000: .data ALLOC LOAD DATA HAS_CONTENTS + // [4] 0x1428000->0x14282bc at 0x005e2000: DATASEG ALLOC LOAD DATA HAS_CONTENTS + // [5] 0x1429000->0x1452000 at 0x005e3000: .cms_t ALLOC LOAD READONLY CODE HAS_CONTENTS + // [6] 0x1452000->0x14aaf3e at 0x0060c000: .cms_d ALLOC LOAD DATA HAS_CONTENTS + // [7] 0x14ab000->0x14ac58a at 0x00665000: .idata ALLOC LOAD READONLY DATA HAS_CONTENTS + // [8] 0x14ad000->0x14b512f at 0x00667000: .rsrc ALLOC LOAD DATA HAS_CONTENTS + // + // .data section, however, has virtual size of 0xA81C3C, and so + // 0x9a6000 + 0xA81C3C = 0x1427C3C, which after alignment to page size becomes + // 0x1428000, which can be seen as next section, DATASEG + // + // Since mmap does not provide a way to create a mapping with virtual size, + // I resorted to creating a one large map for data and memcpy'ing data where + // required. + // Another section is needed for .text, as it requires PROT_EXEC flag. + + // TODO: UGLY, UGLY HACK! + off_t file_size = 6750208; + + int len = 0x01429000 - 0x8a4000; // 0xB85000, 12079104 bytes or around 11.5MB + // section: rw data + void *base = mmap((void *)0x8a4000, len, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0); + log_warning("base = %x, 0x01423b40 >= base == %i, 0x01423b40 < base + len == %i", base, (void *)0x01423b40 >= base, (void *)0x01423b40 < base + len); + if (base == MAP_FAILED) { + log_warning("errno = %i", errno); + exit(1); + } + + len = 0x004A3000; + // section: text + void *base2 = mmap((void *)(0x401000), len, PROT_EXEC | PROT_WRITE | PROT_READ, MAP_PRIVATE, fd, 0x1000); + if (base2 != (void *)(0x401000)) + { + log_fatal("mmap failed to get required offset! got %p, expected %p, errno = %d", base2, (void *)(0x401000), errno); + exit(1); + } + + void *fbase = mmap(NULL, file_size, PROT_READ, MAP_PRIVATE, fd, 0); + int err = errno; + log_warning("mmapped file to %p", fbase); + if (fbase == MAP_FAILED) + { + log_fatal("mmap failed to get required offset! got %p, errno = %d", fbase, err); + exit(1); + } + // .rdata and real part of .data + // 0x9e2000 - 0x8a4000 = 0x13e000 + memcpy(base, fbase + DATA_OFFSET, 0x13e000); +#endif // __linux__ + const uint32 c1 = sawyercoding_calculate_checksum((void *)0x009ACFA4, 128); + const uint32 c2 = sawyercoding_calculate_checksum((void *)0x009ACFA4, 720 * 4); + const uint32 exp_c1 = 32640; + const uint32 exp_c2 = 734400; + log_warning("c1 = %u, expected %u, match %d", c1, exp_c1, c1 == exp_c1); + log_warning("c1 = %u, expected %u, match %d", c2, exp_c2, c2 == exp_c2); + if (c1 != exp_c1 || c2 != exp_c2) + { + exit(1); + } openrct2_set_exe_path(); config_set_defaults(); diff --git a/src/platform/linux.c b/src/platform/linux.c index f9320bdb24..055d6c01b8 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -517,7 +517,6 @@ void platform_show_cursor() void platform_get_cursor_position(int *x, int *y) { - STUB(); } diff --git a/src/rct2.c b/src/rct2.c index f0f5224f8f..025f329a52 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -567,7 +567,12 @@ void get_local_time() */ void *rct2_malloc(size_t numBytes) { + #ifdef _WIN32 return RCT2_CALLFUNC_1(0x004068B2, void*, size_t, numBytes); + #else + //log_warning("call rct's function"); + return malloc(numBytes); + #endif // _WIN32 } /** @@ -577,7 +582,12 @@ void *rct2_malloc(size_t numBytes) */ void *rct2_realloc(void *block, size_t numBytes) { + #ifdef _WIN32 return RCT2_CALLFUNC_2(0x004068BD, void*, void*, size_t, block, numBytes); + #else + //log_warning("call rct's function"); + return realloc(block, numBytes); + #endif // _WIN32 } /** @@ -586,5 +596,10 @@ void *rct2_realloc(void *block, size_t numBytes) */ void rct2_free(void *block) { + #ifdef _WIN32 RCT2_CALLPROC_1(0x004068CD, void*, block); + #else + //log_warning("call rct's function"); + free(block); + #endif // _WIN32 } From 7c8b0641d9be1d561658b38d3363b7d0edebd821 Mon Sep 17 00:00:00 2001 From: YamaArashi Date: Tue, 22 Sep 2015 15:26:23 -0700 Subject: [PATCH 0714/1173] replace viewport flags numeric literals with constants --- src/interface/viewport.c | 10 +++++----- src/windows/ride_construction.c | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 73a2fbc7a8..bc53420ca8 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -993,7 +993,7 @@ void sprite_paint_setup(uint16 eax, uint16 ecx){ dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & 0x4000)return; + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_INVISIBLE_SPRITES) return; if (dpi->zoom_level > 2) return; @@ -1363,7 +1363,7 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma trackSequence = mapElement->properties.track.sequence & 0x0F; trackColourScheme = mapElement->properties.track.colour & 3; - if ((RCT2_GLOBAL(0x0141E9E4, uint16) & 0x20) && dpi->zoom_level == 0) { + if ((RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_TRACK_HEIGHTS) && dpi->zoom_level == 0) { RCT2_GLOBAL(0x009DE570, uint8) = 0; if (RCT2_ADDRESS(0x00999694, uint32)[trackType] & (1 << trackSequence)) { uint16 ax = RCT2_GLOBAL(0x0097D21A + (ride->type * 8), uint8); @@ -2172,9 +2172,9 @@ void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, in dpi2->bits = bits_pointer; dpi2->pitch = pitch; - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & 0x3001){ + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & (VIEWPORT_FLAG_HIDE_VERTICAL | VIEWPORT_FLAG_HIDE_BASE | VIEWPORT_FLAG_UNDERGROUND_INSIDE)){ uint8 colour = 0x0A; - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & 0x4000){ + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_INVISIBLE_SPRITES){ colour = 0; } gfx_clear(dpi2, colour); @@ -2188,7 +2188,7 @@ void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, in sub_688485(); int weather_colour = RCT2_ADDRESS(0x98195C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER_GLOOM, uint8)]; - if ((weather_colour != -1) && (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & 0x4000)) && (!(RCT2_GLOBAL(0x9DEA6F, uint8) & 1))){ + if ((weather_colour != -1) && (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_INVISIBLE_SPRITES)) && (!(RCT2_GLOBAL(0x9DEA6F, uint8) & 1))){ gfx_fill_rect(dpi2, dpi2->x, dpi2->y, dpi2->width + dpi2->x - 1, dpi2->height + dpi2->y - 1, weather_colour); } viewport_draw_money_effects(); diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index da7a53c292..4cdeccae80 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -2179,12 +2179,12 @@ static void sub_6CBCE2( ) { rct_ride *ride; const rct_preview_track *trackBlock; - int preserve_word_141E9E4; + int preserve_current_viewport_flags; int x, y, baseZ, clearanceZ, offsetX, offsetY; uint64 preserve_map_size_vars; - preserve_word_141E9E4 = RCT2_GLOBAL(0x0141E9E4, uint16); - RCT2_GLOBAL(0x0141E9E4, uint16) = 0; + preserve_current_viewport_flags = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16); + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) = 0; trackDirection &= 3; RCT2_GLOBAL(0x00EE7880, uint32) = 0x00F1A4CC; @@ -2287,7 +2287,7 @@ static void sub_6CBCE2( sub_688217(); sub_688485(); - RCT2_GLOBAL(0x0141E9E4, uint16) = preserve_word_141E9E4; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) = preserve_current_viewport_flags; } /** From bc8bf39e1ba827c77d61bbbc678aa59a2b21c320 Mon Sep 17 00:00:00 2001 From: YamaArashi Date: Tue, 22 Sep 2015 15:43:42 -0700 Subject: [PATCH 0715/1173] paint setup current type constant --- src/interface/viewport.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index bc53420ca8..7cfadad381 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1364,7 +1364,7 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma trackColourScheme = mapElement->properties.track.colour & 3; if ((RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_TRACK_HEIGHTS) && dpi->zoom_level == 0) { - RCT2_GLOBAL(0x009DE570, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = 0; if (RCT2_ADDRESS(0x00999694, uint32)[trackType] & (1 << trackSequence)) { uint16 ax = RCT2_GLOBAL(0x0097D21A + (ride->type * 8), uint8); uint32 ebx = 0x20381689 + (height + 8) / 16; @@ -1386,7 +1386,7 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma } } - RCT2_GLOBAL(0x009DE570, uint8) = 3; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = 3; RCT2_GLOBAL(0x00F44198, uint32) = (ride->track_colour_main[trackColourScheme] << 19) | (ride->track_colour_additional[trackColourScheme] << 24) | 0xA0000000; RCT2_GLOBAL(0x00F441A0, uint32) = 0x20000000; RCT2_GLOBAL(0x00F441A4, uint32) = 0x20C00000; @@ -1399,7 +1399,7 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma } if (mapElement->flags & MAP_ELEMENT_FLAG_GHOST) { uint32 meh = RCT2_ADDRESS(0x00993CC4, uint32)[RCT2_GLOBAL(0x009AACBF, uint8)]; - RCT2_GLOBAL(0x009DE570, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = 0; RCT2_GLOBAL(0x00F44198, uint32) = meh; RCT2_GLOBAL(0x00F4419C, uint32) = meh; RCT2_GLOBAL(0x00F441A0, uint32) = meh; From 9ac89c2b5ee9c92af0c360ce8527403027087c39 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Wed, 23 Sep 2015 02:39:45 -0600 Subject: [PATCH 0716/1173] remove directsound and get sound working for linux native --- CMakeLists.txt | 2 +- projects/openrct2.vcxproj | 4 +- src/audio/audio.c | 1706 +------------------------------------ src/audio/audio.h | 130 +-- src/audio/mixer.cpp | 70 +- src/audio/mixer.h | 6 - src/game.c | 2 +- src/intro.c | 19 +- src/openrct2.c | 6 +- src/peep/peep.c | 15 - src/rct2.c | 2 +- src/rct2.h | 56 +- src/ride/ride.c | 86 -- src/ride/vehicle.c | 96 +-- src/title.c | 2 +- src/windows/options.c | 2 - src/world/climate.c | 39 - 17 files changed, 129 insertions(+), 2114 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c392ed1def..51d08c54c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,5 +81,5 @@ set_target_properties(${PROJECT} PROPERTIES PREFIX "") TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB}) if (WIN32) - target_link_libraries(${PROJECT} winmm.lib -limm32 -lversion -ldsound ws2_32) + target_link_libraries(${PROJECT} winmm.lib -limm32 -lversion ws2_32) endif (WIN32) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 491574e929..68fe45712f 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -363,7 +363,7 @@ Disabled true 1Byte - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;SDL_MAIN_HANDLED;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;SDL_MAIN_HANDLED;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true $(IntDir)fake\%(RelativeDir) @@ -372,7 +372,7 @@ true - winmm.lib;sdl2.lib;Dsound.lib;%(AdditionalDependencies) + winmm.lib;sdl2.lib;%(AdditionalDependencies) "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\..\Data\g2.dat" "$(SolutionDir)\..\Resources\g2\" diff --git a/src/audio/audio.c b/src/audio/audio.c index a919d9b241..dfc3b0e598 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -18,10 +18,6 @@ * along with this program. If not, see . *****************************************************************************/ -#ifdef _WIN32 -#include -#endif // _WIN32 - #include "../addresses.h" #include "../config.h" #include "../interface/viewport.h" @@ -35,38 +31,6 @@ #include "mixer.h" #include "../openrct2.h" -typedef struct { - uint32 playing; // 0x000 - uint32 var_4; - char filename[MAX_PATH]; // 0x008 - uint32 var_10C; - uint32 var_110; - uint32 var_114; - uint32 var_118; -#ifdef _WIN32 - HGLOBAL hmem; // 0x11C - HMMIO hmmio; // 0x120 - MMCKINFO mmckinfo1; // 0x124 - MMCKINFO mmckinfo2; // 0x138 - LPDIRECTSOUNDBUFFER dsbuffer; // 0x14C -#endif // _WIN32 - uint32 bufsize; // 0x150 - uint32 playpos; // 0x154 - uint32 var_158; - uint32 var_15C; - uint32 stopped; // 0x160 - uint32 var_164; - uint32 var_168; -} rct_sound_channel; - -struct rct_sound_effect { - uint32 size; -#ifdef _WIN32 - WAVEFORMATEX format; -#endif // _WIN32 - uint8* data; -}; - int gAudioDeviceCount; audio_device *gAudioDevices = NULL; rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS]; @@ -79,22 +43,6 @@ void *gCrowdSoundChannel = 0; void *gTitleMusicChannel = 0; bool gGameSoundsOff = false; -#ifdef _WIN32 -void audio_timefunc(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2, int channel); -int sound_effect_loadvars(struct rct_sound_effect* sound_effect, LPWAVEFORMATEX* waveformat, char** data, DWORD* buffersize); -MMRESULT mmio_open(const char* filename, HMMIO* hmmio, HGLOBAL* hmem, LPMMCKINFO mmckinfo); -MMRESULT mmio_read(HMMIO hmmio, uint32 size, char* buffer, LPMMCKINFO mmckinfo, int* read); -MMRESULT mmio_seek(HMMIO* hmmio, LPMMCKINFO mmckinfo1, LPMMCKINFO mmckinfo2, int offset); -int mmio_open_channel(int channel, char* filename, LONG offset); -BOOL CALLBACK dsound_enum_callback_count(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext); -BOOL CALLBACK dsound_enum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext); -int CALLBACK audio_timer_callback(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2); -int sound_fill_buffer(LPDIRECTSOUNDBUFFER dsbuffer, char* src, DWORD size); -void sound_channel_free(HMMIO* hmmio, HGLOBAL* hmem); -LPVOID map_file(LPCWSTR lpFileName, DWORD dwCreationDisposition, DWORD dwNumberOfBytesToMap); -int unmap_file(LPCVOID base); -#endif // _WIN32 - void audio_init(int i) { if (SDL_Init(SDL_INIT_AUDIO) < 0) { @@ -134,1452 +82,6 @@ void audio_get_devices() } } -#ifdef _WIN32 -/** -* -* rct2: 0x00401000 -*/ -void audio_timefunc(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2, int channel) -{ - rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; - DWORD status; - DWORD dwCurrentPlayCursor; - DWORD dwCurrentWriteCursor; - uint32 var1; - int var2; - int bufferlost = 0; - char* buf1; - int buf1size; - char* buf2; - int buf2size; - sound_channel->dsbuffer->lpVtbl->GetStatus(sound_channel->dsbuffer, &status); - if (status & DSBSTATUS_BUFFERLOST) { - if (FAILED(sound_channel->dsbuffer->lpVtbl->Restore(sound_channel->dsbuffer))) { - return; - } - sound_channel->playpos = 0; - bufferlost = 1; - } - sound_channel->dsbuffer->lpVtbl->GetCurrentPosition(sound_channel->dsbuffer, &dwCurrentPlayCursor, &dwCurrentWriteCursor); - if (dwCurrentPlayCursor != sound_channel->playpos || bufferlost) { - if (sound_channel->var_168 && !sound_channel->var_15C) { - if (!sound_channel->stopped) { - sound_channel->stopped = 1; - if (!sound_channel->var_4) { - LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; - sound_channel->playing = 0; - if (dsbuffer) { - dsbuffer->lpVtbl->Stop(dsbuffer); - dsbuffer->lpVtbl->Release(dsbuffer); - RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel] = 0; - } - if (sound_channel->hmmio) { - sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem); - } - } - } - return; - } - if (dwCurrentPlayCursor >= sound_channel->playpos) { - var1 = dwCurrentPlayCursor - sound_channel->playpos; - } else { - var1 = dwCurrentPlayCursor + sound_channel->bufsize - sound_channel->playpos; - } - if (bufferlost) { - var2 = 2 * sound_channel->bufsize / 6; - } else { - var2 = var1; - } - sound_channel->var_158 += var1; - if (sound_channel->var_168) { - uint32 var3 = sound_channel->var_15C; - uint32* var4 = &sound_channel->var_15C; - if (var3) { - if (var1 <= var3) { - *var4 = var3 - var1; - } else { - *var4 = 0; - } - if (SUCCEEDED(sound_channel->dsbuffer->lpVtbl->Lock(sound_channel->dsbuffer, sound_channel->playpos, var2, (LPVOID*)&buf1, (LPDWORD)&buf1size, (LPVOID*)&buf2, (LPDWORD)&buf2size, 0))) { - uint16 var5 = -(sound_channel->mmckinfo1.cksize != 8); - var5 &= 0x80; - memset(buf1, var5 + 128, buf1size); - if (buf2 && buf2size) { - uint16 var5 = -(sound_channel->mmckinfo1.cksize != 8); - var5 &= 0x80; - memset(buf2, var5 + 128, buf2size); - } - sound_channel->dsbuffer->lpVtbl->Unlock(sound_channel->dsbuffer, buf1, buf1size, buf2, buf2size); - sound_channel->playpos += var2; - if (sound_channel->playpos >= sound_channel->bufsize) { - sound_channel->playpos = sound_channel->playpos - sound_channel->bufsize; - } - return; - } - // TimeFunc() could not lock DirectSoundBuffer - return; - } - } - if (FAILED(sound_channel->dsbuffer->lpVtbl->Lock(sound_channel->dsbuffer, sound_channel->playpos, var2, (LPVOID*)&buf1, (LPDWORD)&buf1size, (LPVOID*)&buf2, (LPDWORD)&buf2size, 0))) { - // TimeFunc() could not lock DirectSoundBuffer - return; - } - if (buf1size) { - if (sound_channel->stopped) { - uint16 var5 = -(sound_channel->mmckinfo1.cksize != 8); - var5 &= 0x80; - memset(buf1, var5 + 128, buf1size); - goto label49; - } - } - int var7; - mmio_read(sound_channel->hmmio, buf1size, buf1, &sound_channel->mmckinfo1, &var7); - if (var7 < buf1size) { - if (!sound_channel->var_164) { - int s = sound_channel->mmckinfo1.cksize; - int t = buf1size - var7; - int v; - if (s == 8) { - v = 128; - } else { - if (s != 16) { - goto label42; - } - v = 0; - } - memset(&buf1[var7], v, t); - label42: - sound_channel->var_168 = 1; - if (dwCurrentPlayCursor <= sound_channel->playpos) { - sound_channel->var_15C = sound_channel->playpos - dwCurrentPlayCursor; - } else { - sound_channel->var_15C = sound_channel->playpos + sound_channel->bufsize - dwCurrentPlayCursor; - } - goto label49; - } - char* v21 = buf1; - int v38 = buf1size; - do { - v38 -= var7; - v21 += var7; - sub_40153B(channel); - mmio_read(sound_channel->hmmio, v38, v21, &sound_channel->mmckinfo1, &var7); - } while(var7 < v38); - } - label49: - if (buf2size == 0 || sound_channel->stopped != 0) { - if(buf2 != 0 && buf2size != 0 && sound_channel->stopped != 0) { - int var5 = -(sound_channel->mmckinfo1.cksize != 8); - var5 &= 0x80; - memset(buf2, var5 + 128, buf2size); - } - goto label68; - } - mmio_read(sound_channel->hmmio, buf2size, buf2, &sound_channel->mmckinfo1, &var7); - if (var7 >= buf2size) { - label68: - sound_channel->dsbuffer->lpVtbl->Unlock(sound_channel->dsbuffer, buf1, buf1size, buf2, buf2size); - sound_channel->playpos += var2; - if (sound_channel->playpos >= sound_channel->bufsize) { - sound_channel->playpos -= sound_channel->bufsize; - } - if (bufferlost != 0) { - sound_channel->dsbuffer->lpVtbl->Play(sound_channel->dsbuffer, 0, 0, DSBPLAY_LOOPING); - } - return; - } - if (sound_channel->var_164 != 0) { - char* v26 = buf2; - int v27 = buf2size; - do { - v26 += var7; - v27 -= var7; - sub_40153B(channel); - mmio_read(sound_channel->hmmio, v27, v26, &sound_channel->mmckinfo1, &var7); - } while(var7 < v27); - goto label68; - } - int s = buf2size - var7; - int v; - if (sound_channel->hmem == (HGLOBAL)8) { - v = 128; - } else { - if (sound_channel->hmem != (HGLOBAL)16) { - goto label58; - } - v = 0; - } - memset(&buf2[var7], v, s); - label58: - sound_channel->var_168 = 1; - if (dwCurrentPlayCursor <= sound_channel->playpos) { - sound_channel->var_15C = sound_channel->playpos - dwCurrentPlayCursor; - } else { - sound_channel->var_15C = sound_channel->playpos + sound_channel->bufsize - dwCurrentPlayCursor; - } - goto label68; - } -} - -/** -* -* rct2: 0x004014DF -*/ -int CALLBACK audio_timer_callback(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2) -{ - if (_InterlockedExchange(&RCT2_GLOBAL(0x009E1AAC, LONG), 1) == 0) { - for (int i = 0; i < 4; i++) { - rct_sound_channel* sound_channel = &RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[i]; - if(sound_channel->playing){ - audio_timefunc(uTimerID, uMsg, dwUser, dw1, dw2, i); - } - } - return _InterlockedExchange(&RCT2_GLOBAL(0x009E1AAC, LONG), 0); - } - return 0; -} -#endif // _WIN32 - -/** -* -* rct2: 0x0040153B -*/ -int sub_40153B(int channel) -{ -#ifdef _WIN32 - rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; - if (sound_channel->var_4) { - if (sound_channel->hmmio) { - sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem); - } - if (mmio_open_channel(channel, sound_channel->filename, sound_channel->var_110)) { - return 0; - } - sound_channel->var_164 = sound_channel->var_114; - sound_channel->var_118 = sound_channel->var_110; - sound_channel->var_4 = 0; - } else { - int result = mmio_seek(&sound_channel->hmmio, &sound_channel->mmckinfo1, &sound_channel->mmckinfo2, sound_channel->var_118); - sound_channel->var_158 = sound_channel->var_118; - if (result) { - return 0; - } - } -#else - STUB(); -#endif // _WIN32 - return 1; -} - -/** -* -* rct2: 0x004015E7 -*/ -int sub_4015E7(int channel) -{ - char* buf1; - int buf1size; - char* buf2; - int buf2size; - int read; - int zero = 0; -#ifdef _WIN32 - rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; - LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; - int result = dsbuffer->lpVtbl->Lock(dsbuffer, 0, sound_channel->bufsize, (LPVOID*)&buf1, (LPDWORD)&buf1size, (LPVOID*)&buf2, (LPDWORD)&buf2size, 0); - if (SUCCEEDED(result)) { - if (buf1size) { - mmio_read(sound_channel->hmmio, buf1size, buf1, &sound_channel->mmckinfo1, &read); - int r = read; - if (read < buf1size) { - if (sound_channel->var_164) { - char* b = buf1; - int d = buf1size; - do { - d -= r; - b += r; - sub_40153B(channel); - mmio_read(sound_channel->hmmio, d, b, &sound_channel->mmckinfo1, &read); - r = read; - } while(read < d); - } else { - sound_channel->var_168 = 1; - sound_channel->var_15C = read; - LPWAVEFORMATEX waveformat = sound_channel->hmem; - uint16 v = ((waveformat->nBlockAlign != 8) - 1) & 0x80; - memset(&buf1[read], v, buf1size - r); - } - } - } - result = dsbuffer->lpVtbl->Unlock(dsbuffer, buf1, buf1size, buf2, zero); - sound_channel->var_158 = 0; - sound_channel->playpos = 0; - } - return result; -#else - STUB(); - return 0; -#endif // _WIN32 -} - -/** -* -* rct2: 0x004016FF -*/ -int sound_channel_load_file(int channel, const char* filename, int offset) -{ -#ifdef _WIN32 - rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; - sound_channel->hmem; - sound_channel->hmmio; - if (mmio_open(filename, &sound_channel->hmmio, &sound_channel->hmem, &sound_channel->mmckinfo2)) { - return -100; - } - if (*(uint16*)sound_channel->hmem != 1) { - sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem); - return -101; - } - if (mmio_seek(&sound_channel->hmmio, &sound_channel->mmckinfo1, &sound_channel->mmckinfo2, offset)) { - sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem); - return -103; - } - sound_channel->bufsize = 120 * *((uint32*)sound_channel->hmem + 2) / 100; - DSBUFFERDESC bufferdesc; - memset(&bufferdesc, 0, sizeof(bufferdesc)); - bufferdesc.dwFlags = RCT2_GLOBAL(0x009E1AA8, uint32) | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY; - bufferdesc.dwBufferBytes = sound_channel->bufsize; - bufferdesc.lpwfxFormat = sound_channel->hmem; - bufferdesc.dwSize = sizeof(bufferdesc); - int ret = RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->CreateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), &bufferdesc, &RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel], 0); - if (FAILED(ret)) { - return -102; - } - sound_channel->dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; - sound_channel->var_168 = 0; - sound_channel->var_15C = 0; - sound_channel->var_164 = 1; - sub_4015E7(channel); - sound_channel->var_158 = offset; - sound_channel->stopped = 0; -#else - STUB(); -#endif // _WIN32 - return 0; -} - -#ifdef _WIN32 -/** -* -* rct2: 0x00401822 -*/ -int mmio_open_channel(int channel, char* filename, LONG offset) -{ - rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel]; - LPMMCKINFO v4 = &sound_channel->mmckinfo2; - HMMIO* v5 = &sound_channel->hmmio; - if (mmio_open(filename, &sound_channel->hmmio, &sound_channel->hmem, &sound_channel->mmckinfo2)) { - return -100; - } - if (*(uint16*)sound_channel->hmem != 1) { - sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem); - return -101; - } - if (mmio_seek(&sound_channel->hmmio, &sound_channel->mmckinfo1, &sound_channel->mmckinfo2, offset)) { - sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem); - return -103; - } - sound_channel->var_158 = offset; - return 0; -} -#endif // _WIN32 - -/** -* -* rct2: 0x004018A6 -*/ -int audio_create_timer() -{ -#ifdef _WIN32 - if (RCT2_GLOBAL(0x009E1AA4, int)) { - return 0; - } - for (int i = 0; i < 4; i++) { - rct_sound_channel* sound_channel = &RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[i]; - sound_channel->playing = 0; - } - RCT2_GLOBAL(0x009E1AA0, MMRESULT) = timeSetEvent(50, 10, (LPTIMECALLBACK)audio_timer_callback, 0, TIME_PERIODIC); - if (!RCT2_GLOBAL(0x009E1AA0, MMRESULT)) { - return 0; - } -#else - STUB(); -#endif // _WIN32 - RCT2_GLOBAL(0x009E1AA4, int) = 1; - return 1; -} - -/** -* -* rct2: 0x004018F0 -*/ -int audio_remove_timer() -{ - for (int i = 0; i < 4; i++) { - sound_channel_stop(i); - } -#ifdef _WIN32 - if (RCT2_GLOBAL(0x009E1AA4, int)) { - timeKillEvent(RCT2_GLOBAL(0x009E1AA0, MMRESULT)); - timeEndPeriod(50); - while (_InterlockedExchange(&RCT2_GLOBAL(0x009E1AAC, LONG), 1) != 1) { - Sleep(100); - } - int result = _InterlockedExchange(&RCT2_GLOBAL(0x009E1AAC, LONG), 0); - RCT2_GLOBAL(0x009E1AA4, int) = 0; - return result; - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -/** -* -* rct2: 0x0040194E -*/ -int sound_channel_load_file2(int channel, const char* filename, int offset) -{ - if (!RCT2_GLOBAL(0x009E1AA4, int)) { - return 0; - } - if (sound_channel_is_playing(channel)) { - sound_channel_stop(channel); - } - int load_result = sound_channel_load_file(channel, filename, offset); - if (load_result >= 0) { - RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[channel].var_4 = 0; - return 1; - } - return 0; -} - -/** -* -* rct2: 0x00401999 -*/ -int sound_channel_play(int channel, int a2, int volume, int pan, int frequency) -{ -#ifdef _WIN32 - rct_sound_channel* sound_channel = &RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[channel]; - sound_channel->var_164 = a2; - sound_channel_set_frequency(channel, frequency); - sound_channel_set_pan(channel, pan); - sound_channel_set_volume(channel, volume); - LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; - dsbuffer->lpVtbl->SetCurrentPosition(dsbuffer, 0); - dsbuffer->lpVtbl->Play(dsbuffer, 0, 0, DSBPLAY_LOOPING); - sound_channel->playing = 1; -#else - STUB(); -#endif // _WIN32 - return 1; -} - -/** -* -* rct2: 0x00401A05 -*/ -int sound_channel_stop(int channel) -{ -#ifdef _WIN32 - rct_sound_channel* sound_channel = &RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[channel]; - sound_channel->playing = 0; - sound_channel->stopped = 1; - while (_InterlockedExchange(&RCT2_GLOBAL(0x009E1AAC, LONG), 1) != 1) { - Sleep(10); - } - if (sound_channel->hmmio) { - sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem); - } - - LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; - if (dsbuffer) { - dsbuffer->lpVtbl->Stop(dsbuffer); - dsbuffer->lpVtbl->Release(dsbuffer); - RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel] = 0; - } - _InterlockedExchange(&RCT2_GLOBAL(0x009E1AAC, LONG), 0); -#else - STUB(); -#endif // _WIN32 - return 1; -} - -/** -* -* rct2: 0x00401A93 -*/ -int sound_channel_set_frequency(int channel, int frequency) -{ -#ifdef _WIN32 - LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; - if (dsbuffer) { - if (SUCCEEDED(dsbuffer->lpVtbl->SetFrequency(dsbuffer, frequency))) - return 1; - - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -/** -* -* rct2: 0x00401AB3 -*/ -int sound_channel_set_pan(int channel, int pan) -{ -#ifdef _WIN32 - LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; - if (dsbuffer) { - if (SUCCEEDED(dsbuffer->lpVtbl->SetPan(dsbuffer, pan))) - return 1; - - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -/** -* -* rct2: 0x00401AD3 -*/ -int sound_channel_set_volume(int channel, int volume) -{ -#ifdef _WIN32 - LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel]; - if (dsbuffer) { - if (SUCCEEDED(dsbuffer->lpVtbl->SetVolume(dsbuffer, volume))) - return 1; - - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -/** -* -* rct2: 0x00401AF3 -*/ -void sub_401AF3(int channel, const char* filename, int a3, int a4) -{ - rct_sound_channel* sound_channel = &RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[channel]; - sound_channel->var_4 = 1; - memcpy(sound_channel->filename, filename, sizeof(sound_channel->filename)); - sound_channel->var_10C = 0; - sound_channel->var_110 = a4; - sound_channel->var_114 = a3; - sound_channel->var_164 = 1; -} - -/** -* -* rct2: 0x00401B46 -*/ -int sub_401B46(int channel) -{ - rct_sound_channel* sound_channel = &RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[channel]; - if (sound_channel->stopped) { - return 0; - } else { - return sound_channel->var_158; - } -} - -/** -* -* rct2: 0x00401B63 -*/ -int sound_channel_is_playing(int channel) -{ - if (RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[channel].playing) { - return RCT2_ADDRESS(RCT2_ADDRESS_SOUND_CHANNEL_LIST, rct_sound_channel)[channel].stopped == 0; - } else { - return 0; - } -} - -/** -* -* rct2: 0x00404BD2 -*/ -int audio_release() -{ - sound_stop_all(); -#ifdef _WIN32 - if (RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)) { - RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->Release(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)); - RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER) = 0; - } - if (RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)) { - RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)->lpVtbl->Release(RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)); - RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER) = 0; - } - int result = 0; - if (RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)) { - result = RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->Release(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)); - RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND) = 0; - } - return result; -#else - STUB(); - return 0; -#endif // _WIN32 -} - -/** -* -* rct2: 0x00404C1A -*/ -int map_sound_effects(const char* filename) -{ -#ifdef _WIN32 - if (RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID)) { - return 0; - } else { - wchar_t *wcFilename = utf8_to_widechar(filename); - RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID) = map_file(wcFilename, 0, 0); - free(wcFilename); - return RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID) != 0; - } -#else - STUB(); - return 0; -#endif // _WIN32 -} - -/** -* -* rct2: 0x00404C45 -*/ -int unmap_sound_effects() -{ -#ifdef _WIN32 - if (RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID)) { - sound_stop_all(); - unmap_file(RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID)); - RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID) = 0; - return 1; - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -/** -* -* rct2: 0x00404C6D -*/ -int sound_prepare(int sound_id, rct_sound *sound, int channels, int software) -{ -#ifdef _WIN32 - DSBUFFERDESC bufferdesc; - char* buffer = 0; - memset(&bufferdesc, 0, sizeof(bufferdesc)); - bufferdesc.dwSize = sizeof(bufferdesc); - rct_sound* tempsound = sound_begin(); - if (tempsound) { - int wasduplicated = 0; - while (!tempsound->dsbuffer || tempsound->id != sound_id || !sound_duplicate(sound, tempsound)) { - tempsound = sound_next(tempsound); - if (!tempsound) { - wasduplicated = 1; - break; - } - } - if (!wasduplicated) { - return 1; - } - } - struct rct_sound_effect* sound_effect = sound_get_effect(sound_id); - if (sound_effect) { - if (sound_effect_loadvars(sound_effect, &bufferdesc.lpwfxFormat, &buffer, &bufferdesc.dwBufferBytes)) { - if (channels == 0){ - bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STATIC; - } - else if (channels == 2) { - bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRL3D | DSBCAPS_STATIC; - } else { - bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY | DSBCAPS_STATIC; - } - if (RCT2_GLOBAL(0x009E2B90, uint32)) { - bufferdesc.dwFlags |= DSBCAPS_CTRLPAN; - } - if (software) { - bufferdesc.dwFlags |= DSBCAPS_LOCSOFTWARE; - } - if (SUCCEEDED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->CreateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), &bufferdesc, &sound->dsbuffer, 0))) { - if (sound_fill_buffer(sound->dsbuffer, buffer, bufferdesc.dwBufferBytes)) { - sound->id = sound_id; - DSBCAPS caps; - caps.dwSize = sizeof(caps); - sound->dsbuffer->lpVtbl->GetCaps(sound->dsbuffer, &caps); - sound->has_caps = caps.dwFlags; - sound_add(sound); - return 1; - } - sound->dsbuffer->lpVtbl->Release(sound->dsbuffer); - sound->dsbuffer = 0; - } - sound->dsbuffer = 0; - } - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -/** -* -* rct2: 0x00404D99 -*/ -int sound_duplicate(rct_sound* newsound, rct_sound* sound) -{ -#ifdef _WIN32 - if (FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->DuplicateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), sound->dsbuffer, &newsound->dsbuffer))) { - return 0; - } else { - newsound->id = sound->id; - newsound->has_caps = sound->has_caps; - newsound->var_0C = sound->var_0C; - sound_add(newsound); - return 1; - } -#else - STUB(); - return 1; -#endif // _WIN32 -} - -/** -* -* rct2: 0x00404DD8 -*/ -int sound_stop(rct_sound* sound) -{ -#ifdef _WIN32 - if (sound->dsbuffer) { - sound->dsbuffer->lpVtbl->Release(sound->dsbuffer); - sound->dsbuffer = 0; - return sound_remove(sound) ? 1 : 0; - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -/** -* -* rct2: 0x00404DF5 -*/ -int sound_stop_all() -{ - int result = 0; - while (RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_BEGIN, rct_sound*)) { - result = sound_stop(RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_BEGIN, rct_sound*)); - } - return result; -} - -/** -* -* rct2: 0x00404E0D -*/ -void sound_bufferlost_check() -{ -#ifdef _WIN32 - rct_sound* sound = RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_BEGIN, rct_sound*); - while (sound && sound != RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_END, rct_sound*)) { - DWORD status; - if (SUCCEEDED(sound->dsbuffer->lpVtbl->GetStatus(sound->dsbuffer, &status))) { - if (status & DSBSTATUS_BUFFERLOST) { - sound_bufferlost_restore(sound); - } - } - sound = sound->next; - } -#else - STUB(); -#endif // _WIN32 -} - -/** -* -* rct2: 0x00404E53 -*/ -int sound_is_playing(rct_sound* sound){ -#ifdef _WIN32 - if (sound->dsbuffer) { - DWORD status; - if (SUCCEEDED(sound->dsbuffer->lpVtbl->GetStatus(sound->dsbuffer, &status))) { - if (status & DSBSTATUS_PLAYING || status & DSBSTATUS_LOOPING) - return 1; - - } - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -/** -* -* rct2: 0x00404E7F -*/ -int sound_play(rct_sound* sound, int looping, int volume, int pan, int frequency) -{ -#ifdef _WIN32 - if (sound->dsbuffer) { - sound_set_frequency(sound, frequency); - sound_set_pan(sound, pan); - sound_set_volume(sound, volume); - DWORD playflags; - if (looping) { - if (looping != 1) - return 1; - - playflags = DSBPLAY_LOOPING; - } else { - playflags = 0; - } - if (SUCCEEDED(sound->dsbuffer->lpVtbl->Play(sound->dsbuffer, 0, 0, playflags))) - return 1; - - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -/** -* -* rct2: 0x00404ED7 -*/ -int sound_set_frequency(rct_sound* sound, int frequency) -{ -#ifdef _WIN32 - if (sound->dsbuffer) { - if (SUCCEEDED(sound->dsbuffer->lpVtbl->SetFrequency(sound->dsbuffer, frequency))) - return 1; - - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -/** -* -* rct2: 0x00404EF2 -*/ -int sound_set_pan(rct_sound* sound, int pan) -{ -#ifdef _WIN32 - if (sound->dsbuffer) { - if (SUCCEEDED(sound->dsbuffer->lpVtbl->SetPan(sound->dsbuffer, pan))) - return 1; - - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -/** -* -* rct2: 0x00404F0D -*/ -int sound_set_volume(rct_sound* sound, int volume) -{ -#ifdef _WIN32 - if (sound->dsbuffer) { - if (SUCCEEDED(sound->dsbuffer->lpVtbl->SetVolume(sound->dsbuffer, volume))) - return 1; - - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -/** -* -* rct2: 0x000404F28 -*/ -int sound_load3dparameters() -{ -#ifdef _WIN32 - if (SUCCEEDED(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->GetAllParameters(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER), &RCT2_GLOBAL(0x009A6084, DS3DBUFFER)))) { - return 1; - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -/** -* -* rct2: 0x00404F3F -*/ -int sound_load3dposition() -{ - /*if (SUCCEEDED(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->GetPosition(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER), &RCT2_GLOBAL(0x009A6084, D3DVECTOR), 1))) { - return 1; - }*/ - return 0; -} - -#ifdef _WIN32 -/** -* -* rct2: 0x00404F85 -*/ -BOOL CALLBACK dsound_enum_callback_count(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext) -{ - RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES_COUNTER, int)++; - return 1; -} - -/** -* -* rct2: 0x00404F91 -*/ -int dsound_count_devices() -{ - RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES_COUNTER, int) = 0; - if (SUCCEEDED(DirectSoundEnumerate(dsound_enum_callback_count, 0))) { - return RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES_COUNTER, int); - } - return 0; -} - -/** -* -* rct2: 0x00404FB1 -*/ -BOOL CALLBACK dsound_enum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext) -{ - if (lpGuid) { - memcpy(&RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES, rct_dsdevice*)[RCT2_GLOBAL(0x01425B54, int)].guid, lpGuid, sizeof(GUID)); - } else { - memset(&RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES, rct_dsdevice*)[RCT2_GLOBAL(0x01425B54, int)].guid, 0, sizeof(GUID)); - } - strcpy(RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES, rct_dsdevice*)[RCT2_GLOBAL(0x01425B54, int)].desc, lpcstrDescription); - strcpy(RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES, rct_dsdevice*)[RCT2_GLOBAL(0x01425B54, int)].drvname, lpcstrModule); - RCT2_GLOBAL(0x01425B54, int)++; - return 1; -} - -/** -* -* rct2: 0x00405054 -*/ -int sound_effect_loadvars(struct rct_sound_effect* sound_effect, LPWAVEFORMATEX* waveformat, char** data, DWORD* buffersize) -{ - *buffersize = sound_effect->size; - *waveformat = &sound_effect->format; - *data = (char*)&sound_effect->data; - return 1; -} - -/** -* -* rct2: 0x00405076 -*/ -int sound_fill_buffer(LPDIRECTSOUNDBUFFER dsbuffer, char* src, DWORD size) -{ - LPVOID buf; - LPVOID buf2; - DWORD buf2size; - if (SUCCEEDED(dsbuffer->lpVtbl->Lock(dsbuffer, 0, size, &buf, &size, &buf2, &buf2size, 0))) { - memset(buf, 0, size); - memcpy(buf, src, size); - if (buf2size) { - memcpy(buf2, &src[size], buf2size); - } - dsbuffer->lpVtbl->Unlock(dsbuffer, buf, size, buf2, buf2size); - return 1; - } - return 0; -} -#endif // _WIN32 - -/** -* -* rct2: 0x00405103 -*/ -rct_sound* sound_begin() -{ - return RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_BEGIN, rct_sound*); -} - -/** -* -* rct2: 0x00405109 -*/ -rct_sound* sound_next(rct_sound* sound) -{ - if (RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_END, rct_sound*) == sound) { - return 0; - } else { - return sound->next; - } -} - -/** -* -* rct2: 0x0040511C -*/ -rct_sound* sound_add(rct_sound* sound) -{ - if (RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_BEGIN, rct_sound*)) { - RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_END, rct_sound*)->next = sound; - } else { - RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_BEGIN, rct_sound*) = sound; - } - RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_END, rct_sound*) = sound; - sound->next = 0; - return sound; -} - -/** -* -* rct2: 0x00405143 -*/ -rct_sound* sound_remove(rct_sound* sound) -{ - rct_sound* result = RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_BEGIN, rct_sound*); - if (sound == result) { - if (sound == RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_END, rct_sound*)) { - RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_END, rct_sound*) = 0; - RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_BEGIN, rct_sound*) = 0; - } - result = sound->next; - RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_BEGIN, rct_sound*) = result; - } else { - while (result->next != sound) - result = result->next; - - if (sound == RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_END, rct_sound*)) { - RCT2_GLOBAL(RCT2_ADDRESS_SOUNDLIST_END, rct_sound*) = result; - result->next = 0; - } else - result->next = sound->next; - - } - sound->next = 0; - return result; -} - -/** -* -* rct2: 0x00405199 -*/ -int sound_bufferlost_restore(rct_sound* sound) -{ -#ifdef _WIN32 - DWORD buffersize = 0; - LPWAVEFORMATEX waveformat = 0; - char* data = 0; - if (sound) { - if (SUCCEEDED(sound->dsbuffer->lpVtbl->Restore(sound->dsbuffer))) { - struct rct_sound_effect* sound_effect = sound_get_effect(sound->id); - if (sound_effect != 0) { - return sound_effect_loadvars(sound_effect, &waveformat, &data, &buffersize) && sound_fill_buffer(sound->dsbuffer, data, buffersize); - } - } - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -/** -* -* rct2: 0x00405206 -*/ -struct rct_sound_effect* sound_get_effect(uint16 sound_id) -{ -#ifdef _WIN32 - if (RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, LPVOID) && sound_id < RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, uint32*)[0]) { - return (struct rct_sound_effect*)(RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, int) + RCT2_GLOBAL(RCT2_ADDRESS_SOUND_EFFECTS_MAPPING, uint32*)[sound_id + 1]); - } -#else - STUB(); -#endif // _WIN32 - return 0; -} - -#ifdef _WIN32 -/** -* -* rct2: 0x00405222 -*/ -MMRESULT mmio_open(const char* filename, HMMIO* hmmio, HGLOBAL* hmem, LPMMCKINFO mmckinfo) -{ - HGLOBAL* hmemold; - HGLOBAL hmemold2; - HMMIO hmmio1; - MMRESULT result; - MMCKINFO mmckinfo1; - WAVEFORMATEX waveformat; - - hmemold = hmem; - *hmem = 0; - hmmio1 = mmioOpenA((char*)filename, 0, MMIO_ALLOCBUF); - if (hmmio1) { - result = mmioDescend(hmmio1, mmckinfo, 0, 0); - if (result != MMSYSERR_NOERROR) { - goto label20; - } - if (mmckinfo->ckid != 1179011410/*RIFF*/ || mmckinfo->fccType != 1163280727/*WAVE*/) { - result = 57601; - goto label20; - } - mmckinfo1.ckid = 544501094/*fmt*/; - result = mmioDescend(hmmio1, &mmckinfo1, mmckinfo, MMIO_FINDCHUNK); - if (result != MMSYSERR_NOERROR) { - goto label20; - } - if (mmckinfo1.cksize < 16) { - label19: - result = 57601; - goto label20; - } - if (mmioRead(hmmio1, (HPSTR)&waveformat, 16) == 16) { - if (waveformat.wFormatTag == 1) { - //strcpy(audio_info.var_0, "\x01"); - hmem = 0; - label11: - hmemold2 = GlobalAlloc(0, (SIZE_T)(hmem + 18)); - *hmemold = hmemold2; - if (!hmemold2) { - result = 57344; - goto label20; - } - memcpy(hmemold2, &waveformat, 16); - *((uint16*)*hmemold + 8) = *(uint16*)*hmem; - if (!hmem || mmioRead(hmmio1, (char*)*hmemold + 18, (LONG)hmem) == (LONG)hmem) { - result = mmioAscend(hmmio1, &mmckinfo1, 0); - if (!result) { - goto label24; - } - goto label20; - } - goto label19; - } - if (mmioRead(hmmio1, (HPSTR)&hmem, 2) == 2) { - goto label11; - } - } - result = 57602; - goto label20; - } - result = 57600; - label20: - if (*hmemold) { - GlobalFree(*hmemold); - *hmemold = 0; - } - if (hmmio1) { - mmioClose(hmmio1, 0); - hmmio1 = 0; - } - label24: - *hmmio = hmmio1; - return result; -} - -/** -* -* rct2: 0x00405383 -*/ -MMRESULT mmio_read(HMMIO hmmio, uint32 size, char* buffer, LPMMCKINFO mmckinfo, int* read) -{ - MMIOINFO mmioinfo; - MMRESULT result; - result = mmioGetInfo(hmmio, &mmioinfo, 0); - if (result != 0) { - *read = 0; - return 1; - } - int size2 = size; - if (size > mmckinfo->cksize) { - size2 = mmckinfo->cksize; - } - int v8 = 0; - mmckinfo->cksize -= size2; - if (size2) { - while (1) { - HPSTR p = mmioinfo.pchEndRead; - if (mmioinfo.pchNext == mmioinfo.pchEndRead) { - result = mmioAdvance(hmmio, &mmioinfo, 0); - if (result != 0) { - *read = 0; - return result; - } - p = mmioinfo.pchEndRead; - if (mmioinfo.pchNext == mmioinfo.pchEndRead) { - break; - } - } - int q = p - mmioinfo.pchNext; - if (size2 - v8 < p - mmioinfo.pchNext) { - q = size2 - v8; - } - memcpy(&buffer[v8], mmioinfo.pchNext, q); - mmioinfo.pchNext += q; - v8 += q; - if (v8 >= size2) { - result = mmioSetInfo(hmmio, &mmioinfo, 0); - if (result != 0) { - *read = 0; - return result; - } else { - *read = size2; - return result; - } - } - } - *read = 0; - return 57603; - } - result = mmioSetInfo(hmmio, &mmioinfo, 0); - if (result != 0) { - *read = 0; - return result; - } else { - *read = size2; - return result; - } -} - -/** -* -* rct2: 0x00405436 -*/ -void sound_channel_free(HMMIO* hmmio, HGLOBAL* hmem) -{ - if(*hmem) - { - GlobalFree(*hmem); - *hmem = 0; - } - if(*hmmio) - { - mmioClose(*hmmio, 0); - *hmmio = 0; - } -} - -/** -* -* rct2: 0x00405465 -*/ -MMRESULT mmio_seek(HMMIO* hmmio, LPMMCKINFO mmckinfo1, LPMMCKINFO mmckinfo2, int offset) -{ - mmioSeek(*hmmio, mmckinfo2->dwDataOffset + 4, SEEK_SET); - mmckinfo1->ckid = 1635017060/*DATA*/; - MMRESULT result = mmioDescend(*hmmio, mmckinfo1, mmckinfo2, MMIO_FINDCHUNK); - if (!result) { - mmioSeek(*hmmio, offset, SEEK_CUR); - return 0; - } - return result; -} - -/** -* -* rct2: 0x004067F9 -*/ -LPVOID map_file(LPCWSTR lpFileName, DWORD dwCreationDisposition, DWORD dwNumberOfBytesToMap) -{ - DWORD dwDesiredAccess; - DWORD dwDesiredAccessmap; - DWORD flProtect; - HANDLE filehandle; - HANDLE filemaphandle; - LPVOID address = 0; - if (dwCreationDisposition) { - if (dwCreationDisposition == CREATE_NEW) { - dwDesiredAccess = GENERIC_READ | GENERIC_WRITE; - dwDesiredAccessmap = FILE_MAP_WRITE; - flProtect = PAGE_READWRITE; - dwCreationDisposition = OPEN_ALWAYS; - } - } else { - dwDesiredAccess = GENERIC_READ; - flProtect = PAGE_READONLY; - dwDesiredAccessmap = FILE_MAP_READ; - dwCreationDisposition = OPEN_EXISTING; - } - filehandle = CreateFileW(lpFileName, dwDesiredAccess, 0, 0, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, 0); - if (filehandle != INVALID_HANDLE_VALUE) { - filemaphandle = CreateFileMappingW(filehandle, 0, flProtect, 0, dwNumberOfBytesToMap, 0); - CloseHandle(filehandle); - if (filemaphandle) { - address = MapViewOfFile(filemaphandle, dwDesiredAccessmap, 0, 0, dwNumberOfBytesToMap); - CloseHandle(filemaphandle); - } - } - return address; -} - -/** -* -* rct2: 0x004068A0 -*/ -int unmap_file(LPCVOID base) -{ - if (base) { - return UnmapViewOfFile(base); - } - return 0; -} - -/** -* -* rct2: 0x00404932 -*/ -int dsound_create_primary_buffer(int a, int device, int channels, int samples, int bits) -{ - rct_dsdevice* dsdevice = 0; - if (device) { - if (device > RCT2_GLOBAL(RCT2_ADDRESS_NUM_DSOUND_DEVICES, int)) { - return 0; - } - dsdevice = &RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES, rct_dsdevice*)[device]; - } - memset(&RCT2_GLOBAL(RCT2_ADDRESS_AUDIO_INFO, WAVEFORMATEX), 0, sizeof(WAVEFORMATEX)); - RCT2_GLOBAL(RCT2_ADDRESS_AUDIO_INFO, WAVEFORMATEX).wFormatTag = 1; - RCT2_GLOBAL(RCT2_ADDRESS_AUDIO_INFO, WAVEFORMATEX).nChannels = channels; - RCT2_GLOBAL(RCT2_ADDRESS_AUDIO_INFO, WAVEFORMATEX).nSamplesPerSec = samples; - RCT2_GLOBAL(RCT2_ADDRESS_AUDIO_INFO, WAVEFORMATEX).nAvgBytesPerSec = samples * RCT2_GLOBAL(0x01425B4C, uint16); - RCT2_GLOBAL(RCT2_ADDRESS_AUDIO_INFO, WAVEFORMATEX).nBlockAlign = bits * channels / 8; - RCT2_GLOBAL(RCT2_ADDRESS_AUDIO_INFO, WAVEFORMATEX).wBitsPerSample = bits; - RCT2_GLOBAL(RCT2_ADDRESS_AUDIO_INFO, WAVEFORMATEX).cbSize = 0; - DSBUFFERDESC bufferdesc; - memset(&bufferdesc, 0, sizeof(bufferdesc)); - bufferdesc.dwSize = sizeof(bufferdesc); - if (a) { - if (a != 1) { - return 0; - } - bufferdesc.dwFlags = DSBCAPS_CTRL3D | DSBCAPS_PRIMARYBUFFER; - if (RCT2_GLOBAL(0x009E2B90, uint32)) { - bufferdesc.dwFlags = DSBCAPS_STICKYFOCUS | DSBCAPS_CTRL3D | DSBCAPS_PRIMARYBUFFER; - } - if (FAILED(DirectSoundCreate(&dsdevice->guid, &RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), 0))) { - return 0; - } - if (FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->SetCooperativeLevel(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), windows_get_window_handle(), DSSCL_NORMAL)) || - FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->CreateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), &bufferdesc, &RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER), 0))) { - RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->Release(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)); - RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND) = 0; - return 0; - } - if (SUCCEEDED(RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)->lpVtbl->QueryInterface(RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER), &RCT2_GLOBAL(0x009A4444, IID) /* IID_IDirectSound3DBuffer */, (void**)&RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)))) { - // doesn't seem to ever make it here, below doesn't make sense and is probably remnants of unused 3d sound tests - memset(&RCT2_GLOBAL(0x009A6084, DS3DBUFFER), 0, sizeof(RCT2_GLOBAL(0x009A6084, DS3DBUFFER))); - RCT2_GLOBAL(0x009A6084, DS3DBUFFER).dwSize = sizeof(RCT2_GLOBAL(0x009A6084, DS3DBUFFER)); - - if (sound_load3dparameters()) { - RCT2_GLOBAL(0x009A6084, DS3DBUFFER).vPosition.x = 0.0f; - } - RCT2_GLOBAL(0x009A6084, DS3DBUFFER).vPosition.y = 0.0f; - RCT2_GLOBAL(0x009A6084, DS3DBUFFER).vPosition.x = -1.0f; - RCT2_GLOBAL(0x009A6084, DS3DBUFFER).flMaxDistance = 9.8999996f; - RCT2_GLOBAL(0x009A6084, DS3DBUFFER).flMinDistance = 0.25f; - if (sound_load3dposition()) { - if (SUCCEEDED(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->SetMinDistance(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER), RCT2_GLOBAL(0x009A6084, DS3DBUFFER).flMinDistance, 1))) { - if (sound_load3dparameters()) { - return 1; - } - } - } - RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->Release(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)); - RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER) = 0; - RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)->lpVtbl->Release(RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)); - RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER) = 0; - RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->Release(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)); - RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND) = 0; - } else { - RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)->lpVtbl->Release(RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)); - RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER) = 0; - RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->Release(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)); - RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND) = 0; - } - } - bufferdesc.dwFlags = DSBCAPS_PRIMARYBUFFER; - if (RCT2_GLOBAL(0x009E2B90, uint32)) { - bufferdesc.dwFlags = DSBCAPS_STICKYFOCUS | DSBCAPS_PRIMARYBUFFER; - } - if (FAILED(DirectSoundCreate(&dsdevice->guid, &RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), 0))) { - return 0; - } - if (FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->SetCooperativeLevel(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), windows_get_window_handle(), DSSCL_PRIORITY))) { - RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->Release(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)); - RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND) = 0; - return 0; - } - RCT2_GLOBAL(0x01425B60, DSCAPS).dwSize = sizeof(DSCAPS); - RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->GetCaps(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), &RCT2_GLOBAL(0x01425B60, DSCAPS)); - if (FAILED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->CreateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), &bufferdesc, &RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER), 0))) { - RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)->lpVtbl->Release(RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)); - RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER) = 0; - RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->Release(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)); - RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND) = 0; - } - WAVEFORMATEX waveformat1, waveformat2; - RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)->lpVtbl->GetFormat(RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER), &waveformat1, sizeof(WAVEFORMATEX), 0); - RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)->lpVtbl->SetFormat(RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER), &RCT2_GLOBAL(RCT2_ADDRESS_AUDIO_INFO, WAVEFORMATEX)); - RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER)->lpVtbl->GetFormat(RCT2_GLOBAL(0x009E2BA8, LPDIRECTSOUNDBUFFER), &waveformat2, sizeof(WAVEFORMATEX), 0); - return 1; -} - -/** -* -* rct2: 0x0040502E -*/ -int get_dsound_devices() -{ - RCT2_GLOBAL(RCT2_ADDRESS_NUM_DSOUND_DEVICES, uint32) = dsound_count_devices(); - RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES, rct_dsdevice*) = malloc(RCT2_GLOBAL(RCT2_ADDRESS_NUM_DSOUND_DEVICES, uint32) * sizeof(rct_dsdevice)); - if (RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES, rct_dsdevice*)) { - RCT2_GLOBAL(0x01425B54, int) = 0; - DirectSoundEnumerate(dsound_enum_callback, 0); - return RCT2_GLOBAL(0x01425B54, int); - } - return 0; -} -#endif // _WIN32 - /** * * rct2: 0x006BB76E @@ -1641,16 +143,6 @@ int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z) } } } - int i = 0; - rct_other_sound* other_sound = &RCT2_ADDRESS(0x009AF484, rct_other_sound)[i]; - while (other_sound->id != 0xFFFF) { - i++; - other_sound = &RCT2_ADDRESS(0x009AF484, rct_other_sound)[i]; - if (i > RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MAX_NO_SOUNDS, uint8)) { // too many sounds playing - return sound_id; - } - } - other_sound->id = sound_id; int pan; if (ebx == (sint16)0x8000) { pan = 0; @@ -1665,44 +157,11 @@ int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z) if (!RCT2_GLOBAL(0x009AAC6D, uint8)) { pan = 0; } -#ifdef USE_MIXER Mixer_Play_Effect(sound_id, MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(pan), 1, 1); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_prepare(sound_id, &other_sound->sound, 1, RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, uint32)); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - RCT2_GLOBAL(0x014241BC, uint32) = 1; - result = sound_play(&other_sound->sound, 0, volume, pan, 0); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } return result; } -/** -* -* rct2: 0x006BB991 -*/ -void stop_completed_sounds() -{ - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) != -1) { - for (int i = 0; i < 7; i++) { - rct_other_sound* other_sound = &RCT2_ADDRESS(0x009AF484, rct_other_sound)[i]; - if (other_sound->id != (uint16)-1) { - RCT2_GLOBAL(0x014241BC, uint32) = 1; - int isplaying = sound_is_playing(&other_sound->sound); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - if (!isplaying) { - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_stop(&other_sound->sound); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - other_sound->id = (uint16)-1; - } - } - } - } -} - /** * * rct2: 0x006BD0F8 @@ -1730,18 +189,7 @@ void start_title_music() if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0)) && !gGameSoundsOff && RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) { if (!RCT2_GLOBAL(0x009AF600, uint8)) { -#ifdef USE_MIXER gTitleMusicChannel = Mixer_Play_Music(musicPathId, MIXER_LOOP_INFINITE, true); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - int result = sound_channel_load_file2(3, (char*)get_file_path(musicPathId), 0); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - if (result) { - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_channel_play(3, 1, 0, 0, 0); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - } -#endif RCT2_GLOBAL(0x009AF600, uint8) = 1; } } else { @@ -1751,34 +199,6 @@ void start_title_music() } } -/** -* -* rct2: 0x006BCAE5 -*/ -void stop_other_sounds() -{ - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) != -1) { - if (RCT2_GLOBAL(0x009AF5A8, uint32) != 1) { - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_stop(RCT2_GLOBAL(0x009AF5AC, rct_sound*)); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - RCT2_GLOBAL(0x009AF5A8, uint32) = 1; - } - if (RCT2_GLOBAL(0x009AF5C0, uint32) != 8) { - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_stop(RCT2_GLOBAL(0x009AF5C4, rct_sound*)); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - RCT2_GLOBAL(0x009AF5C0, uint32) = 8; - } - if (RCT2_GLOBAL(0x009AF5D8, uint32) != 8) { - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_stop(RCT2_GLOBAL(0x009AF5DC, rct_sound*)); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - RCT2_GLOBAL(0x009AF5D8, uint32) = 8; - } - } -} - /** * * rct2: 0x006BCA9F @@ -1787,15 +207,9 @@ void stop_ride_music() { if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0))) { for (int i = 0; i < AUDIO_MAX_RIDE_MUSIC; i++) { - rct_ride_music* ride_music = &gRideMusicList[i];//&RCT2_ADDRESS(0x009AF46C, rct_ride_music)[i]; + rct_ride_music* ride_music = &gRideMusicList[i]; if (ride_music->rideid != (uint8)-1) { -#ifdef USE_MIXER Mixer_Stop_Channel(ride_music->sound_channel); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_channel_stop(i); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif ride_music->rideid = -1; } } @@ -1810,16 +224,10 @@ void stop_crowd_sound() { if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0))) { if (RCT2_GLOBAL(0x009AF5FC, uint32) != 1) { -#ifdef USE_MIXER if (gCrowdSoundChannel) { Mixer_Stop_Channel(gCrowdSoundChannel); gCrowdSoundChannel = 0; } -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_channel_stop(2); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif RCT2_GLOBAL(0x009AF5FC, uint32) = 1; } } @@ -1833,16 +241,10 @@ void stop_title_music() { if (RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0)) { if (RCT2_GLOBAL(0x009AF600, uint8) != 0) { -#ifdef USE_MIXER if (gTitleMusicChannel) { Mixer_Stop_Channel(gTitleMusicChannel); gTitleMusicChannel = 0; } -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_channel_stop(3); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } } RCT2_GLOBAL(0x009AF600, uint8) = 0; @@ -1855,21 +257,6 @@ void stop_title_music() void audio_init1() { int devicenum = 0; -#ifdef _WIN32 - if (RCT2_GLOBAL(0x009AAC5C, uint8)) { - rct_dsdevice* dsdevice = &RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES, rct_dsdevice*)[0]; - while (dsdevice->guid.Data1 != RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_GUID, GUID).Data1 || - dsdevice->guid.Data2 != RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_GUID, GUID).Data2 || - dsdevice->guid.Data3 != RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_GUID, GUID).Data3 || - memcmp(dsdevice->guid.Data4, RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_GUID, GUID).Data4, sizeof(dsdevice->guid.Data4)) != 0) { - dsdevice++; - devicenum++; - if (devicenum >= RCT2_GLOBAL(RCT2_ADDRESS_NUM_DSOUND_DEVICES, int)) { - devicenum = 0; - break; - } - } - } audio_init2(devicenum); for(int m = 0; m < countof(ride_music_info_list); m++) { @@ -1885,9 +272,6 @@ void audio_init1() } } } -#else - STUB(); -#endif // _WIN32 } /** @@ -1897,59 +281,17 @@ void audio_init1() void audio_init2(int device) { audio_close(); - for (int i = 0; i < AUDIO_MAX_VEHICLE_SOUNDS/*7*/; i++) { + for (int i = 0; i < AUDIO_MAX_VEHICLE_SOUNDS; i++) { rct_vehicle_sound* vehicle_sound = &gVehicleSoundList[i]; - //rct_vehicle_sound* vehicle_sound = &RCT2_ADDRESS(RCT2_ADDRESS_VEHICLE_SOUND_LIST, rct_vehicle_sound)[i]; vehicle_sound->id = 0xFFFF; } - for (int i = 0; i < 7; i++) { - rct_other_sound* other_sound = &RCT2_ADDRESS(0x009AF484, rct_other_sound)[i]; - other_sound->id = 0xFFFF; - } - RCT2_GLOBAL(0x014241BC, uint32) = 1; -#ifdef _WIN32 - int successdsound = dsound_create_primary_buffer(0, device, 2, 22050, 16); -#else - int successdsound = 0; - STUB(); -#endif // _WIN32 - RCT2_GLOBAL(0x014241BC, uint32) = 0; - if (!successdsound) { - return; - } - const char * filepath = get_file_path(2); - RCT2_GLOBAL(0x014241BC, uint32) = 1; - int successmap = map_sound_effects(filepath); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - if (!successmap) { - RCT2_GLOBAL(0x014241BC, uint32) = 1; - audio_release(); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - return; - } RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = device; - rct_dsdevice dsdevice = RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_DEVICES, rct_dsdevice*)[device]; -#ifdef _WIN32 - RCT2_GLOBAL(RCT2_ADDRESS_DSOUND_GUID, GUID) = dsdevice.guid; -#else - STUB(); -#endif // _WIN32 RCT2_GLOBAL(0x009AAC5C, uint8) = 1; config_save_default(); - RCT2_GLOBAL(0x014241BC, uint32) = 1; - int successtimer = audio_create_timer(); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - if (successtimer) { - RCT2_GLOBAL(0x009AF284, uint32) |= (1 << 0); - for (int i = 0; i < AUDIO_MAX_RIDE_MUSIC; i++) { - rct_ride_music* ride_music = &gRideMusicList[i];//&RCT2_ADDRESS(0x009AF46C, rct_ride_music)[i]; - ride_music->rideid = -1; - } - } - - // Used by original code for directsound - if (!(RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & 1 << 4)) { - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) |= 1 << 4; + RCT2_GLOBAL(0x009AF284, uint32) |= (1 << 0); + for (int i = 0; i < AUDIO_MAX_RIDE_MUSIC; i++) { + rct_ride_music* ride_music = &gRideMusicList[i]; + ride_music->rideid = -1; } } @@ -1959,22 +301,12 @@ void audio_init2(int device) */ void audio_close() { - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) != -1) { - stop_other_sounds(); - stop_crowd_sound(); - stop_title_music(); - if (RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0)) { - stop_ride_music(); - RCT2_GLOBAL(0x014241BC, uint32) = 1; - audio_remove_timer(); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - } - RCT2_GLOBAL(0x014241BC, uint32) = 1; - unmap_sound_effects(); - audio_release(); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = -1; + stop_crowd_sound(); + stop_title_music(); + if (RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0)) { + stop_ride_music(); } + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = -1; } /* rct2: 0x006BAB8A */ @@ -1995,7 +327,6 @@ void toggle_all_sounds(){ void pause_sounds() { gGameSoundsOff = 1; - stop_other_sounds(); stop_vehicle_sounds(); stop_ride_music(); stop_crowd_sound(); @@ -2017,27 +348,14 @@ void unpause_sounds() void stop_vehicle_sounds() { if (!gOpenRCT2Headless && RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) != -1) { - for (int i = 0; i < countof(gVehicleSoundList)/*7*/; i++) { + for (int i = 0; i < countof(gVehicleSoundList); i++) { rct_vehicle_sound* vehicle_sound = &gVehicleSoundList[i]; - //rct_vehicle_sound* vehicle_sound = &RCT2_ADDRESS(RCT2_ADDRESS_VEHICLE_SOUND_LIST, rct_vehicle_sound)[i]; if (vehicle_sound->id != 0xFFFF) { if (vehicle_sound->sound1_id != 0xFFFF) { -#ifdef USE_MIXER Mixer_Stop_Channel(vehicle_sound->sound1_channel); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_stop(&vehicle_sound->sound1); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } if (vehicle_sound->sound2_id != 0xFFFF) { -#ifdef USE_MIXER Mixer_Stop_Channel(vehicle_sound->sound2_channel); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_stop(&vehicle_sound->sound2); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } } vehicle_sound->id = 0xFFFF; diff --git a/src/audio/audio.h b/src/audio/audio.h index 7c6ca1431d..82a475ad38 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -21,10 +21,6 @@ #ifndef _AUDIO_H_ #define _AUDIO_H_ -#ifdef _WIN32 -#include -#endif // _WIN32 - #include "../common.h" #include "../world/sprite.h" @@ -42,95 +38,55 @@ void audio_init(); void audio_quit(); void audio_get_devices(); -/** - * Represents a single directsound device. - */ -typedef struct { -#ifdef _WIN32 - GUID guid; - char desc[256]; - char drvname[256]; -#else - uint8 padding[16+256+256]; -#endif // _WIN32 -} rct_dsdevice; - -/** - * Represents a prepared sound. - */ -typedef struct rct_sound { -#ifdef _WIN32 - struct IDirectSoundBuffer *dsbuffer; -#else - void *padding; -#endif // _WIN32 - uint16 id; - uint16 var_8; - int has_caps; - int var_0C; - struct rct_sound* next; -} rct_sound; - typedef struct { uint16 id; - sint16 volume; // 0x02 - rct_sound sound1; // 0x04 - uint16 sound1_id; // 0x18 - sint16 sound1_volume; // 0x1A - sint16 sound1_pan; // 0x1C + sint16 volume; + uint16 sound1_id; + sint16 sound1_volume; + sint16 sound1_pan; uint16 sound1_freq; - rct_sound sound2; // 0x20 - uint16 sound2_id; // 0x34 - sint16 sound2_volume; // 0x36 - sint16 sound2_pan; // 0x38 - uint16 sound2_freq; // 0x3A - // added to openrct2: + uint16 sound2_id; + sint16 sound2_volume; + sint16 sound2_pan; + uint16 sound2_freq; void* sound1_channel; void* sound2_channel; } rct_vehicle_sound; typedef struct { uint16 id; - sint16 panx; // 0x2 - sint16 pany; // 0x4 - uint16 frequency; // 0x6 - sint16 volume; // 0x8 - uint16 var_A; // 0xA + sint16 panx; + sint16 pany; + uint16 frequency; + sint16 volume; + uint16 var_A; } rct_vehicle_sound_params; -typedef struct { - uint16 id; - rct_sound sound; -} rct_other_sound; - typedef struct { uint8 rideid; uint8 tuneid; - sint32 offset; //0x2 - sint16 volume; //0x6 - sint16 pan; //0x8 - uint16 freq; //0xA + sint32 offset; + sint16 volume; + sint16 pan; + uint16 freq; } rct_ride_music_params; typedef struct { uint8 rideid; uint8 tuneid; - sint16 volume; //0x2 - sint16 pan; //0x4 - uint16 freq; //0x6 - // added to openrct2: + sint16 volume; + sint16 pan; + uint16 freq; void* sound_channel; } rct_ride_music; typedef struct { uint32 length; uint32 offset; - uint8 pathid; //0x8 + uint8 pathid; uint8 var_9; } rct_ride_music_info; -struct rct_sound_effect; - #define NUM_DEFAULT_MUSIC_TRACKS 46 extern rct_ride_music_info* ride_music_info_list[NUM_DEFAULT_MUSIC_TRACKS]; extern rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS]; @@ -143,52 +99,8 @@ extern void *gCrowdSoundChannel; extern void *gTitleMusicChannel; extern bool gGameSoundsOff; -int sub_40153B(int channel); -int sub_4015E7(int channel); -int sound_channel_load_file(int channel, const char* filename, int offset); -int audio_create_timer(); -int audio_remove_timer(); -int sound_channel_load_file2(int channel, const char* filename, int offset); -int sound_channel_play(int channel, int a2, int volume, int pan, int frequency); -int sound_channel_stop(int channel); -int sound_channel_set_frequency(int channel, int frequency); -int sound_channel_set_pan(int channel, int pan); -int sound_channel_set_volume(int channel, int volume); -void sub_401AF3(int channel, const char* filename, int a3, int a4); -int sub_401B46(int channel); -int sound_channel_is_playing(int channel); -int audio_release(); -int map_sound_effects(const char* filename); -int unmap_sound_effects(); -int sound_prepare(int sound_id, rct_sound *sound, int channels, int software); -int sound_duplicate(rct_sound* newsound, rct_sound* sound); -int sound_stop(rct_sound *sound); -int sound_stop_all(); -void sound_bufferlost_check(); -int sound_is_playing(rct_sound* sound); -int sound_play(rct_sound* sound, int looping, int volume, int pan, int frequency); -int sound_set_frequency(rct_sound* sound, int frequency); -int sound_set_pan(rct_sound* sound, int pan); -int sound_set_volume(rct_sound* sound, int volume); -int sound_load3dparameters(); -int sound_load3dposition(); -#ifdef _WIN32 -int dsound_count_devices(); -#endif // _WIN32 -rct_sound* sound_begin(); -rct_sound* sound_next(rct_sound* sound); -rct_sound* sound_add(rct_sound* sound); -rct_sound* sound_remove(rct_sound* sound); -int sound_bufferlost_restore(rct_sound* sound); -struct rct_sound_effect* sound_get_effect(uint16 sound_id); -#ifdef _WIN32 -int dsound_create_primary_buffer(int a, int device, int channels, int samples, int bits); -int get_dsound_devices(); -#endif // _WIN32 int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z); -void stop_completed_sounds(); void start_title_music(); -void stop_other_sounds(); void stop_ride_music(); void stop_crowd_sound(); void stop_title_music(); diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index 4faad9c126..210d90407d 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -18,10 +18,6 @@ * along with this program. If not, see . *****************************************************************************/ -#ifdef _WIN32 -#include -#endif // _WIN32 - extern "C" { #include "../config.h" #include "../platform/platform.h" @@ -105,11 +101,7 @@ bool Source_Sample::LoadWAV(const char* filename) if (spec != NULL) { format.freq = spec->freq; -#ifdef _WIN32 format.format = spec->format; -#else - STUB(); -#endif // _WIN32 format.channels = spec->channels; issdlwav = true; } else { @@ -144,15 +136,20 @@ bool Source_Sample::LoadCSS1(const char *filename, unsigned int offset) Uint32 soundsize; SDL_RWread(rw, &soundsize, sizeof(soundsize), 1); length = soundsize; -#ifdef _WIN32 - WAVEFORMATEX waveformat; + struct WaveFormatEx + { + Uint16 encoding; + Uint16 channels; + Uint32 frequency; + Uint32 byterate; + Uint16 blockalign; + Uint16 bitspersample; + Uint16 extrasize; + } waveformat; SDL_RWread(rw, &waveformat, sizeof(waveformat), 1); - format.freq = waveformat.nSamplesPerSec; + format.freq = waveformat.frequency; format.format = AUDIO_S16LSB; - format.channels = waveformat.nChannels; -#else - STUB(); -#endif // _WIN32 + format.channels = waveformat.channels; data = new (std::nothrow) uint8[length]; if (!data) { log_verbose("Unable to allocate data"); @@ -180,7 +177,6 @@ void Source_Sample::Unload() bool Source_Sample::Convert(AudioFormat format) { -#ifdef _WIN32 if(Source_Sample::format.format != format.format || Source_Sample::format.channels != format.channels || Source_Sample::format.freq != format.freq){ SDL_AudioCVT cvt; if (SDL_BuildAudioCVT(&cvt, Source_Sample::format.format, Source_Sample::format.channels, Source_Sample::format.freq, format.format, format.channels, format.freq) < 0) { @@ -199,9 +195,6 @@ bool Source_Sample::Convert(AudioFormat format) Source_Sample::format = format; return true; } -#else - STUB(); -#endif // _WIN32 return false; } @@ -276,16 +269,24 @@ bool Source_SampleStream::LoadWAV(SDL_RWops* rw) return false; } Uint64 chunkstart = SDL_RWtell(rw); -#ifdef _WIN32 - PCMWAVEFORMAT waveformat; + struct WaveFormat + { + Uint16 encoding; + Uint16 channels; + Uint32 frequency; + Uint32 byterate; + Uint16 blockalign; + Uint16 bitspersample; + } waveformat; SDL_RWread(rw, &waveformat, sizeof(waveformat), 1); SDL_RWseek(rw, chunkstart + fmtchunk_size, RW_SEEK_SET); - if (waveformat.wf.wFormatTag != WAVE_FORMAT_PCM) { + const Uint16 pcmformat = 0x0001; + if (waveformat.encoding != pcmformat) { log_verbose("Not in proper format"); return false; } - format.freq = waveformat.wf.nSamplesPerSec; - switch (waveformat.wBitsPerSample) { + format.freq = waveformat.frequency; + switch (waveformat.bitspersample) { case 8: format.format = AUDIO_U8; break; @@ -297,10 +298,7 @@ bool Source_SampleStream::LoadWAV(SDL_RWops* rw) return false; break; } - format.channels = waveformat.wf.nChannels; -#else - STUB(); -#endif // _WIN32 + format.channels = waveformat.channels; const Uint32 DATA = 0x61746164; Uint32 datachunk_size = FindChunk(rw, DATA); if (!datachunk_size) { @@ -462,7 +460,6 @@ void Mixer::Init(const char* device) { Close(); SDL_AudioSpec want, have; -#ifdef _WIN32 SDL_zero(want); want.freq = 44100; want.format = AUDIO_S16SYS; @@ -474,9 +471,6 @@ void Mixer::Init(const char* device) format.format = have.format; format.channels = have.channels; format.freq = have.freq; -#else - STUB(); -#endif // _WIN32 const char* filename = get_file_path(PATH_ID_CSS1); for (int i = 0; i < countof(css1sources); i++) { Source_Sample* source_sample = new Source_Sample; @@ -545,13 +539,9 @@ Channel* Mixer::Play(Source& source, int loop, bool deleteondone, bool deletesou void Mixer::Stop(Channel& channel) { -#ifdef _WIN32 Lock(); channel.stopping = true; Unlock(); -#else -#warning unimplemented -#endif // _WIN32 } bool Mixer::LoadMusic(int pathid) @@ -593,7 +583,6 @@ void SDLCALL Mixer::Callback(void* arg, uint8* stream, int length) void Mixer::MixChannel(Channel& channel, uint8* data, int length) { -#ifdef _WIN32 if (channel.source && channel.source->Length() > 0 && !channel.done && gConfigSound.sound) { AudioFormat streamformat = channel.source->Format(); int loaded = 0; @@ -737,9 +726,6 @@ void Mixer::MixChannel(Channel& channel, uint8* data, int length) channel.done = true; } } -#else - STUB(); -#endif // _WIN32 } void Mixer::EffectPanS16(Channel& channel, sint16* data, int length) @@ -782,14 +768,10 @@ void Mixer::EffectFadeU8(uint8* data, int length, int startvolume, int endvolume bool Mixer::MustConvert(Source& source) { -#ifdef _WIN32 const AudioFormat sourceformat = source.Format(); if (sourceformat.format != format.format || sourceformat.channels != format.channels || sourceformat.freq != format.freq) { return true; } -#else - STUB(); -#endif // _WIN32 return false; } diff --git a/src/audio/mixer.h b/src/audio/mixer.h index fde3658d73..6f68e1177d 100644 --- a/src/audio/mixer.h +++ b/src/audio/mixer.h @@ -31,8 +31,6 @@ extern "C" { } #endif // __cplusplus -#define USE_MIXER - #define MIXER_LOOP_NONE 0 #define MIXER_LOOP_INFINITE -1 @@ -213,11 +211,7 @@ void Mixer_Channel_SetGroup(void* channel, int group); void* Mixer_Play_Music(int pathid, int loop, int streaming); static int DStoMixerVolume(int volume) { return (int)(SDL_MIX_MAXVOLUME * (SDL_pow(10, (float)volume / 2000))); }; -#ifdef _WIN32 static float DStoMixerPan(int pan) { return (((float)pan + -DSBPAN_LEFT) / DSBPAN_RIGHT) / 2; }; -#else -static float DStoMixerPan(int pan) { STUB(); return ((float)pan) / 2; }; -#endif // _WIN32 static double DStoMixerRate(int frequency) { return (double)frequency / 22050; }; #ifdef __cplusplus diff --git a/src/game.c b/src/game.c index 265b34d0eb..50ee37673d 100644 --- a/src/game.c +++ b/src/game.c @@ -1071,7 +1071,7 @@ void rct2_exit_reason(rct_string_id title, rct_string_id body){ */ void rct2_exit() { - audio_close(); + //audio_close(); //Post quit message does not work in 0x6e3879 as its windows only. openrct2_finish(); } diff --git a/src/intro.c b/src/intro.c index 0757c467ff..f067568a85 100644 --- a/src/intro.c +++ b/src/intro.c @@ -31,7 +31,6 @@ static void screen_intro_process_keyboard_input(); static void screen_intro_skip_part(); static int _sound_playing_flag = 0; ///< Used to test if a sound is currently playing. -static rct_sound _prepared_sound; ///< A prepared sound for playing. static int _tick_counter; ///< Used mainly for timing but also for Y coordinate and fading. // rct2: 0x0068E966 @@ -60,12 +59,12 @@ void intro_update() // Chain lift sound _sound_playing_flag = 0; - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) != -1) { + /*if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) != -1) { // Prepare and play the sound if (sound_prepare(SOUND_LIFT_7, &_prepared_sound, 0, 1)) if (sound_play(&_prepared_sound, 1, 0, 0, 0)) _sound_playing_flag = 1; - } + }*/ // Move to next part (*part)++; @@ -132,17 +131,17 @@ void intro_update() if (_tick_counter == 259) { // Stop the chain lift sound if (_sound_playing_flag == 1) { - sound_stop(&_prepared_sound); + //sound_stop(&_prepared_sound); _sound_playing_flag = 0; } // Play the track friction sound - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) != -1) { + /*if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) != -1) { // Prepare and play the sound if (sound_prepare(SOUND_TRACK_FRICTION_3, &_prepared_sound, 1, 1)) if (sound_play(&_prepared_sound, 1, -800, 0, 0x3A98)) _sound_playing_flag = 1; - } + }*/ } // Check if logo is off the screen .ish @@ -163,15 +162,15 @@ void intro_update() // Stop the track friction sound if (_sound_playing_flag == 1) { - sound_stop(&_prepared_sound); + //sound_stop(&_prepared_sound); _sound_playing_flag = 0; } // Play long peep scream sound - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) != -1) + /*if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) != -1) if (sound_prepare(SOUND_SCREAM_1, &_prepared_sound, 0, 1)) if (sound_play(&_prepared_sound, 0, 0, 0, 0)) - _sound_playing_flag = 1; + _sound_playing_flag = 1;*/ // Move to the next part (*part)++; @@ -230,7 +229,7 @@ void intro_update() // Stop any playing sound if (_sound_playing_flag == 1) { - sound_stop(&_prepared_sound); + //sound_stop(&_prepared_sound); _sound_playing_flag = 0; } diff --git a/src/openrct2.c b/src/openrct2.c index 7eede9d930..69d5b9a46d 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -290,11 +290,7 @@ bool openrct2_initialise() if (!gOpenRCT2Headless) { audio_init(); audio_get_devices(); -#ifdef _WIN32 - get_dsound_devices(); -#else - STUB(); -#endif // _WIN32 + //get_dsound_devices(); } language_open(gConfigGeneral.language); http_init(); diff --git a/src/peep/peep.c b/src/peep/peep.c index 3b42080bdc..61d0f78203 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -5184,12 +5184,8 @@ void peep_update_crowd_noise() if (visiblePeeps < 0) { // Mute crowd noise if (RCT2_GLOBAL(0x009AF5FC, uint32) != 1) { -#ifdef USE_MIXER Mixer_Stop_Channel(gCrowdSoundChannel); gCrowdSoundChannel = 0; -#else - sound_channel_stop(2); //RCT2_CALLPROC_1(0x00401A05, int, 2); -#endif RCT2_GLOBAL(0x009AF5FC, uint32) = 1; } } else { @@ -5204,7 +5200,6 @@ void peep_update_crowd_noise() // Check if crowd noise is already playing if (RCT2_GLOBAL(0x009AF5FC, uint32) == 1) { // Load and play crowd noise -#ifdef USE_MIXER if (!gCrowdSoundChannel) { gCrowdSoundChannel = Mixer_Play_Music(PATH_ID_CSS2, MIXER_LOOP_INFINITE, false); if (gCrowdSoundChannel) { @@ -5215,20 +5210,10 @@ void peep_update_crowd_noise() Mixer_Channel_Volume(gCrowdSoundChannel, DStoMixerVolume(volume)); RCT2_GLOBAL(0x009AF5FC, uint32) = volume; } -#else - if (sound_channel_load_file2(2, (char*)get_file_path(PATH_ID_CSS2), 0)) { - sound_channel_play(2, 1, volume, 0, 0); - RCT2_GLOBAL(0x009AF5FC, uint32) = volume; - } -#endif } else { // Alter crowd noise volume if (RCT2_GLOBAL(0x009AF5FC, uint32) != volume) { -#ifdef USE_MIXER Mixer_Channel_Volume(gCrowdSoundChannel, DStoMixerVolume(volume)); -#else - sound_channel_set_volume(2, volume);//RCT2_CALLPROC_2(0x00401AD3, int, int, 2, volume); -#endif RCT2_GLOBAL(0x009AF5FC, uint32) = volume; } } diff --git a/src/rct2.c b/src/rct2.c index 025f329a52..8c071ea771 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -403,7 +403,7 @@ void rct2_update_2() else game_update(); - stop_completed_sounds(); // removes other sounds that are no longer playing in directsound + //stop_completed_sounds(); // removes other sounds that are no longer playing in directsound twitch_update(); chat_update(); diff --git a/src/rct2.h b/src/rct2.h index 74cf311b7e..669a2ec026 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -208,9 +208,6 @@ static const char * const file_paths[] = { #ifdef _WIN32 "data\\g1.dat", -#else - "data/g1.dat", -#endif // _WIN32 "Data\\PLUGIN.DAT", "Data\\CSS1.DAT", "Data\\CSS2.DAT", @@ -261,6 +258,59 @@ static const char * const file_paths[] = "Data\\CSS45.DAT", "Data\\CSS46.DAT", "Data\\CSS50.DAT" +#else + "data/g1.dat", + "data/plugin.dat", + "data/css1.dat", + "data/css2.dat", + "data/css4.dat", + "data/css5.dat", + "data/css6.dat", + "data/css7.dat", + "data/css8.dat", + "data/css9.dat", + "data/css11.dat", + "data/css12.dat", + "data/css13.dat", + "data/css14.dat", + "data/css15.dat", + "data/css3.dat", + "data/css17.dat", + "data/css18.dat", + "data/css19.dat", + "data/css20.dat", + "data/css21.dat", + "data/css22.dat", + "Saved Games/scores.dat", + "data/css23.dat", + "data/css24.dat", + "data/css25.dat", + "data/css26.dat", + "data/css27.dat", + "data/css28.dat", + "data/css29.dat", + "data/css30.dat", + "data/css31.dat", + "data/css32.dat", + "data/css33.dat", + "data/css34.dat", + "data/css35.dat", + "data/css36.dat", + "data/css37.dat", + "data/css38.dat", + "data/CUSTOM1.WAV", + "data/CUSTOM2.WAV", + "data/css39.dat", + "data/css40.dat", + "data/css41.dat", + "Scenarios/Six Flags Magic Mountain.SC6", + "data/css42.dat", + "data/css43.dat", + "data/css44.dat", + "data/css45.dat", + "data/css46.dat", + "data/css50.dat" +#endif // _WIN32 }; // Files to check (rct2 @ 0x0097FB5A) diff --git a/src/ride/ride.c b/src/ride/ride.c index e07840e230..e9feb8dce6 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3322,24 +3322,12 @@ int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint goto label51; } } -#ifdef USE_MIXER int playing = Mixer_Channel_IsPlaying(gRideMusicList[channel].sound_channel); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - int playing = sound_channel_is_playing(channel); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif if (!playing) { *tuneId = 0xFF; return 0; } -#ifdef USE_MIXER a1 = Mixer_Channel_GetOffset(gRideMusicList[channel].sound_channel); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - a1 = sub_401B46(channel); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif label51: if (a1 < ride_music_info_list[*tuneId]->length) { position = a1; @@ -3487,13 +3475,7 @@ void ride_music_update_final() rct_ride_music_params* ride_music_params = &gRideMusicParamsList[0];//&RCT2_GLOBAL(0x009AF430, rct_ride_music_params); while (ride_music_params < gRideMusicParamsListEnd/*RCT2_GLOBAL(0x009AF42C, rct_ride_music_params*)*/) { if (ride_music_params->rideid == ride_music->rideid && ride_music_params->tuneid == ride_music->tuneid) { -#ifdef USE_MIXER int isplaying = Mixer_Channel_IsPlaying(gRideMusicList[channel].sound_channel); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - int isplaying = sound_channel_is_playing(channel); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif if (isplaying) { goto label32; } @@ -3501,13 +3483,7 @@ void ride_music_update_final() } ride_music_params++; } -#ifdef USE_MIXER Mixer_Stop_Channel(gRideMusicList[channel].sound_channel); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_channel_stop(channel); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif ride_music->rideid = -1; } label32: @@ -3527,7 +3503,6 @@ void ride_music_update_final() channel++; if (channel >= AUDIO_MAX_RIDE_MUSIC) { rct_ride_music_info* ride_music_info = ride_music_info_list[ride_music_params->tuneid]; -#ifdef USE_MIXER rct_ride_music* ride_music = &gRideMusicList[ebx]; ride_music->sound_channel = Mixer_Play_Music(ride_music_info->pathid, MIXER_LOOP_NONE, true); if (ride_music->sound_channel) { @@ -3547,82 +3522,21 @@ void ride_music_update_final() } else { //RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8) = 0; } -#else - const char* filename = get_file_path(ride_music_info->pathid); - RCT2_GLOBAL(0x014241BC, uint32) = 3; - HANDLE hfile = osinterface_file_open(filename); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - if (hfile != INVALID_HANDLE_VALUE) { - RCT2_GLOBAL(0x014241BC, uint32) = 3; - osinterface_file_read(hfile, &RCT2_GLOBAL(0x009AF47E, uint32), 4); - RCT2_GLOBAL(0x014241BC, uint32) = 3; - osinterface_file_close(hfile); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - } - if (hfile == INVALID_HANDLE_VALUE || RCT2_GLOBAL(0x009AF47E, uint32) != 0x78787878) { - int offset = ride_music_params->offset - 10000; - if (offset < 0) { - offset = 0; - } - RCT2_GLOBAL(0x014241BC, uint32) = 1; - int musicloaded = sound_channel_load_file2(ebx, filename, offset & 0xFFFFFFF0); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - if (musicloaded) { - RCT2_GLOBAL(0x014241BC, uint32) = 1; - int musicplayed = sound_channel_play(ebx, 0, ride_music_params->volume, ride_music_params->pan, ride_music_params->freq); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - if (musicplayed) { - rct_ride_music_info* ride_music_info = &RCT2_GLOBAL(0x009AF1C8, rct_ride_music_info*)[ride_music_params->tuneid]; - if (ride_music_info->var_9) { - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sub_401AF3(ebx, get_file_path(ride_music_info->pathid), 1, 0); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - } - rct_ride_music* ride_music = &gRideMusicList[ebx];//&RCT2_ADDRESS(0x009AF46C, rct_ride_music)[ebx]; - ride_music->volume = ride_music_params->volume; - ride_music->pan = ride_music_params->pan; - ride_music->freq = ride_music_params->freq; - ride_music->rideid = ride_music_params->rideid; - ride_music->tuneid = ride_music_params->tuneid; - } - } else { - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8) = 0; - } - } -#endif return; } } if (ride_music_params->volume != ride_music->volume) { ride_music->volume = ride_music_params->volume; -#ifdef USE_MIXER Mixer_Channel_Volume(ride_music->sound_channel, DStoMixerVolume(ride_music->volume)); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_channel_set_volume(channel, ride_music_params->volume); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } if (ride_music_params->pan != ride_music->pan) { ride_music->pan = ride_music_params->pan; -#ifdef USE_MIXER Mixer_Channel_Pan(ride_music->sound_channel, DStoMixerPan(ride_music->pan)); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_channel_set_pan(channel, ride_music_params->pan); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } if (ride_music_params->freq != ride_music->freq) { ride_music->freq = ride_music_params->freq; -#ifdef USE_MIXER Mixer_Channel_Rate(ride_music->sound_channel, DStoMixerRate(ride_music->freq)); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_channel_set_frequency(channel, ride_music_params->freq); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } } diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index 6fcb060c28..a51b2aa365 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -212,22 +212,10 @@ void vehicle_sounds_update() } } if (vehicle_sound->sound1_id != (uint16)-1) { -#ifdef USE_MIXER Mixer_Stop_Channel(vehicle_sound->sound1_channel); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_stop(&vehicle_sound->sound1); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } if (vehicle_sound->sound2_id != (uint16)-1) { -#ifdef USE_MIXER Mixer_Stop_Channel(vehicle_sound->sound2_channel); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_stop(&vehicle_sound->sound2); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } vehicle_sound->id = (uint16)-1; } @@ -347,33 +335,16 @@ void vehicle_sounds_update() if (sprite->vehicle.sound1_id == (uint8)-1) { if (vehicle_sound->sound1_id != (uint16)-1) { vehicle_sound->sound1_id = -1; -#ifdef USE_MIXER - Mixer_Stop_Channel(vehicle_sound->sound1_channel); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_stop(&vehicle_sound->sound1); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif + Mixer_Stop_Channel(vehicle_sound->sound1_channel); } } else { if (vehicle_sound->sound1_id == (uint16)-1) { goto label69; } if (sprite->vehicle.sound1_id != vehicle_sound->sound1_id) { -#ifdef USE_MIXER Mixer_Stop_Channel(vehicle_sound->sound1_channel); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_stop(&vehicle_sound->sound1); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif label69: vehicle_sound->sound1_id = sprite->vehicle.sound1_id; -#ifndef USE_MIXER - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_prepare(sprite->vehicle.sound1_id, &vehicle_sound->sound1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, uint32)); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif vehicle_sound->sound1_pan = vehicle_sound_params->panx; vehicle_sound->sound1_volume = volume; vehicle_sound->sound1_freq = vehicle_sound_params->frequency; @@ -386,35 +357,17 @@ void vehicle_sounds_update() if (!RCT2_GLOBAL(0x009AAC6D, uint8)) { pan = 0; } -#ifdef USE_MIXER vehicle_sound->sound1_channel = Mixer_Play_Effect(sprite->vehicle.sound1_id, looping ? MIXER_LOOP_INFINITE : MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(pan), DStoMixerRate(frequency), 0); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_play(&vehicle_sound->sound1, looping, volume, pan, frequency); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif goto label87; } if (volume != vehicle_sound->sound1_volume) { vehicle_sound->sound1_volume = volume; -#ifdef USE_MIXER Mixer_Channel_Volume(vehicle_sound->sound1_channel, DStoMixerVolume(volume)); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_set_volume(&vehicle_sound->sound1, volume); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } if (vehicle_sound_params->panx != vehicle_sound->sound1_pan) { vehicle_sound->sound1_pan = vehicle_sound_params->panx; if (RCT2_GLOBAL(0x009AAC6D, uint8)) { -#ifdef USE_MIXER Mixer_Channel_Pan(vehicle_sound->sound1_channel, DStoMixerPan(vehicle_sound_params->panx)); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_set_pan(&vehicle_sound->sound1, vehicle_sound_params->panx); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } } if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 3) && vehicle_sound_params->frequency != vehicle_sound->sound1_freq) { @@ -423,13 +376,7 @@ void vehicle_sounds_update() if (RCT2_GLOBAL(0x009AF51F, uint8*)[2 * sprite->vehicle.sound1_id] & 2) { frequency = (frequency / 2) + 4000; } -#ifdef USE_MIXER Mixer_Channel_Rate(vehicle_sound->sound1_channel, DStoMixerRate(frequency)); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_set_frequency(&vehicle_sound->sound1, frequency); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } } label87: // do sound2 stuff, screams @@ -444,33 +391,16 @@ void vehicle_sounds_update() if (sprite->vehicle.sound2_id == (uint8)-1) { if (vehicle_sound->sound2_id != (uint16)-1) { vehicle_sound->sound2_id = -1; -#ifdef USE_MIXER Mixer_Stop_Channel(vehicle_sound->sound2_channel); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_stop(&vehicle_sound->sound2); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } } else { if (vehicle_sound->sound2_id == (uint16)-1) { goto label93; } if (sprite->vehicle.sound2_id != vehicle_sound->sound2_id) { -#ifdef USE_MIXER Mixer_Stop_Channel(vehicle_sound->sound2_channel); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_stop(&vehicle_sound->sound2); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif label93: vehicle_sound->sound2_id = sprite->vehicle.sound2_id; -#ifndef USE_MIXER - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_prepare(sprite->vehicle.sound2_id, &vehicle_sound->sound2, 1, RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, uint32)); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif vehicle_sound->sound2_pan = vehicle_sound_params->panx; vehicle_sound->sound2_volume = volume; vehicle_sound->sound2_freq = vehicle_sound_params->frequency; @@ -487,35 +417,17 @@ void vehicle_sounds_update() if (!RCT2_GLOBAL(0x009AAC6D, uint8)) { pan = 0; } -#ifdef USE_MIXER vehicle_sound->sound2_channel = Mixer_Play_Effect(sprite->vehicle.sound2_id, looping ? MIXER_LOOP_INFINITE : MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(pan), DStoMixerRate(frequency), 0); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_play(&vehicle_sound->sound2, looping, volume, pan, frequency); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif goto label114; } if (volume != vehicle_sound->sound2_volume) { -#ifdef USE_MIXER Mixer_Channel_Volume(vehicle_sound->sound2_channel, DStoMixerVolume(volume)); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_set_volume(&vehicle_sound->sound2, volume); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif vehicle_sound->sound2_volume = volume; } if (vehicle_sound_params->panx != vehicle_sound->sound2_pan) { vehicle_sound->sound2_pan = vehicle_sound_params->panx; if (RCT2_GLOBAL(0x009AAC6D, uint8)) { -#ifdef USE_MIXER Mixer_Channel_Pan(vehicle_sound->sound2_channel, DStoMixerPan(vehicle_sound_params->panx)); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_set_pan(&vehicle_sound->sound2, vehicle_sound_params->panx); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } } if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 3) && vehicle_sound_params->frequency != vehicle_sound->sound2_freq) { @@ -525,13 +437,7 @@ void vehicle_sounds_update() if (frequency > 25700) { frequency = 25700; } -#ifdef USE_MIXER Mixer_Channel_Rate(vehicle_sound->sound2_channel, DStoMixerRate(frequency)); -#else - RCT2_GLOBAL(0x014241BC, uint32) = 1; - sound_set_frequency(&vehicle_sound->sound2, frequency); - RCT2_GLOBAL(0x014241BC, uint32) = 0; -#endif } } diff --git a/src/title.c b/src/title.c index f4d0d6de75..dda66712a4 100644 --- a/src/title.c +++ b/src/title.c @@ -124,7 +124,7 @@ void title_load() reset_0x69EBE4(); stop_ride_music(); stop_crowd_sound(); - stop_other_sounds(); + //stop_other_sounds(); viewport_init_all(); news_item_init_queue(); title_create_windows(); diff --git a/src/windows/options.c b/src/windows/options.c index abdccf5799..03e1282fff 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -1003,7 +1003,6 @@ static void window_options_dropdown(rct_window *w, int widgetIndex, int dropdown case WIDX_SOUND_DROPDOWN: audio_init2(dropdownIndex); if (dropdownIndex < gAudioDeviceCount) { -#ifdef USE_MIXER if (dropdownIndex == 0) { Mixer_Init(NULL); gConfigSound.device = NULL; @@ -1016,7 +1015,6 @@ static void window_options_dropdown(rct_window *w, int widgetIndex, int dropdown strcpy(gConfigSound.device, devicename); } config_save_default(); -#endif } window_invalidate(w); break; diff --git a/src/world/climate.c b/src/world/climate.c index f72319fd3b..470a1d2fbd 100644 --- a/src/world/climate.c +++ b/src/world/climate.c @@ -62,10 +62,8 @@ static const rct_weather_transition* climate_transitions[4]; // Sound data static int _rainVolume = 1; -static rct_sound _rainSoundInstance; static void* _rainSoundChannel = 0; static unsigned int _lightningTimer, _thunderTimer; -static rct_sound _thunderSoundInstance[MAX_THUNDER_INSTANCES]; static void* _thunderSoundChannels[MAX_THUNDER_INSTANCES]; static int _thunderStatus[MAX_THUNDER_INSTANCES] = { THUNDER_STATUS_NULL, THUNDER_STATUS_NULL }; static unsigned int _thunderSoundId; @@ -110,14 +108,10 @@ void climate_reset(int climate) _lightningTimer = 0; _thunderTimer = 0; if (_rainVolume != 1){ -#ifdef USE_MIXER if (_rainSoundChannel) { Mixer_Stop_Channel(_rainSoundChannel); _rainSoundChannel = 0; } -#else - sound_stop(&_rainSoundInstance); -#endif _rainVolume = 1; } @@ -259,46 +253,29 @@ static void climate_update_rain_sound() if (_climateCurrentWeatherEffect == 1 || _climateCurrentWeatherEffect == 2) { if (_rainVolume == 1) { // Start playing the rain sound -#ifdef USE_MIXER if (!_rainSoundChannel) { _rainSoundChannel = Mixer_Play_Effect(SOUND_RAIN_1, MIXER_LOOP_INFINITE, DStoMixerVolume(-4000), 0.5f, 1, 0); } -#else - if (sound_prepare(SOUND_RAIN_1, &_rainSoundInstance, 1, RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, uint32))) - sound_play(&_rainSoundInstance, 1, -4000, 0, 0); -#endif _rainVolume = -4000; } else { // Increase rain sound _rainVolume = min(-1400, _rainVolume + 80); -#ifdef USE_MIXER if (_rainSoundChannel) { Mixer_Channel_Volume(_rainSoundChannel, DStoMixerVolume(_rainVolume)); } -#else - sound_set_volume(&_rainSoundInstance, _rainVolume); -#endif } } else if (_rainVolume != 1) { // Decrease rain sound _rainVolume -= 80; if (_rainVolume > -4000) { -#ifdef USE_MIXER if (_rainSoundChannel) { Mixer_Channel_Volume(_rainSoundChannel, DStoMixerVolume(_rainVolume)); } -#else - sound_set_volume(&_rainSoundInstance, _rainVolume); -#endif } else { -#ifdef USE_MIXER if (_rainSoundChannel) { Mixer_Stop_Channel(_rainSoundChannel); _rainSoundChannel = 0; } -#else - sound_stop(&_rainSoundInstance); -#endif _rainVolume = 1; } } @@ -328,17 +305,10 @@ static void climate_update_thunder_sound() if (_thunderStatus[i] == THUNDER_STATUS_NULL) continue; -#ifdef USE_MIXER if (!Mixer_Channel_IsPlaying(_thunderSoundChannels[i])) { Mixer_Stop_Channel(_thunderSoundChannels[i]); _thunderStatus[i] = THUNDER_STATUS_NULL; } -#else - if (!sound_is_playing(&_thunderSoundInstance[i])) { - sound_stop(&_thunderSoundInstance[i]); - _thunderStatus[i] = THUNDER_STATUS_NULL; - } -#endif } } @@ -381,20 +351,11 @@ static void climate_update_thunder() static int climate_play_thunder(int instanceIndex, int soundId, int volume, int pan) { -#ifdef USE_MIXER _thunderSoundChannels[instanceIndex] = Mixer_Play_Effect(soundId, MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(pan), 1, 0); if (_thunderSoundChannels[instanceIndex]) { _thunderStatus[instanceIndex] = THUNDER_STATUS_PLAYING; return 1; } -#else - if (sound_prepare(soundId, &_thunderSoundInstance[instanceIndex], 1, RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, uint32))) { - sound_play(&_thunderSoundInstance[instanceIndex], 0, volume, pan, 0); - - _thunderStatus[instanceIndex] = THUNDER_STATUS_PLAYING; - return 1; - } -#endif return 0; } From f15ba8ed0ff5860b0751c485c2831dc602fe5c62 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 24 Sep 2015 13:03:44 +0100 Subject: [PATCH 0717/1173] Update CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 156ec5a1f7..e58c2296e3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,7 @@ questions or concerns, please ask in the [gitter](https://gitter.im/OpenRCT2/Ope # Reporting bugs To report a bug, ensure you have a GitHub account. Search the issues page to see if the bug has already been reported. If not, create a new issue and write the steps to reproduce. Upload a saved game if possible and this is very helpful -for users to replicate the bug. +for users to replicate the bug. Please state which version of the game you are running and where you downloaded it from, e.g. *openrct2.com develop 0.0.3 build 1255 (ec25b2f)*. # Translation Translation is managed in a separate repository, [OpenRCT2/Localisation](https://github.com/OpenRCT2/Localisation). From c93c1c738a81f3120a6c32e22694ed2eaa2fbcbb Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 24 Sep 2015 18:30:14 +0100 Subject: [PATCH 0718/1173] fix network warnings by using new functions over deprecated --- src/network/network.cpp | 32 +++++++++++++++++++++++--------- src/network/network.h | 3 ++- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index ba16e7da5e..b99474ab48 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -316,9 +316,17 @@ bool Network::BeginClient(const char* host, unsigned short port) return false; } + char address[64]; + if (!network_get_address(address, sizeof(address), host)) { + log_error("Unable to resolve hostname."); + return false; + } + SOCKADDR_IN server_address; + if (inet_pton(AF_INET, address, &server_address.sin_addr) != 1) { + return false; + } server_address.sin_family = AF_INET; - server_address.sin_addr.S_un.S_addr = inet_addr(network_getAddress((char *)host)); server_address.sin_port = htons(port); if (connect(server_socket, (SOCKADDR*)&server_address, sizeof(SOCKADDR_IN)) != 0) { @@ -1057,18 +1065,24 @@ void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 } } -static char *network_getAddress(char *host) +static bool network_get_address(char *dst, size_t dstLength, const char *host) { - struct hostent *remoteHost; - struct in_addr addr; + struct addrinfo *remoteHost; - remoteHost = gethostbyname(host); - if (remoteHost != NULL && remoteHost->h_addrtype == AF_INET && remoteHost->h_addr_list[0] != 0) { - addr.s_addr = *(u_long *)remoteHost->h_addr_list[0]; - return inet_ntoa(addr); + if (getaddrinfo(host, NULL, NULL, &remoteHost) != 0) { + // Failed to resolve host name + return false; } - return host; + for (; remoteHost != NULL; remoteHost = remoteHost->ai_next) { + if (remoteHost->ai_family != AF_INET) continue; + + struct sockaddr_in *ipv4SockAddr = (struct sockaddr_in*)remoteHost->ai_addr; + return inet_ntop(AF_INET, (const void*)&ipv4SockAddr->sin_addr, dst, dstLength) != NULL; + } + + // No IPv4 addresses found for host name + return false; } #else diff --git a/src/network/network.h b/src/network/network.h index 85652193f6..671d61fdd1 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -46,6 +46,7 @@ extern "C" { #ifdef _WIN32 #include +#include #endif // _WIN32 enum { @@ -246,7 +247,7 @@ void network_send_chat(const char* text); void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback); void network_print_error(); -static char *network_getAddress(char *host); +static bool network_get_address(char *dst, size_t dstLength, const char *host); #ifdef __cplusplus } From 266f1c1e374929b2103b2ad2c3c86c48e45b3837 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Thu, 24 Sep 2015 18:39:15 +0100 Subject: [PATCH 0719/1173] make multiplayer work in linux --- src/network/network.cpp | 68 +++++++++++++++++++++++++++++------------ src/network/network.h | 17 +++++++++++ src/title.c | 4 +++ 3 files changed, 69 insertions(+), 20 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index b99474ab48..c6770c85d7 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -163,7 +163,7 @@ int NetworkConnection::ReadPacket() // read packet size int readBytes = recv(socket, &((char*)&inboundpacket.size)[inboundpacket.transferred], sizeof(inboundpacket.size) - inboundpacket.transferred, 0); if (readBytes == SOCKET_ERROR || readBytes == 0) { - if (WSAGetLastError() != WSAEWOULDBLOCK) { + if (LAST_SOCKET_ERROR() != EWOULDBLOCK && LAST_SOCKET_ERROR() != EAGAIN) { return NETWORK_DISCONNECTED; } else { return NETWORK_NO_DATA; @@ -182,7 +182,7 @@ int NetworkConnection::ReadPacket() if (inboundpacket.data->capacity() > 0) { int readBytes = recv(socket, (char*)&inboundpacket.GetData()[inboundpacket.transferred - sizeof(inboundpacket.size)], sizeof(inboundpacket.size) + inboundpacket.size - inboundpacket.transferred, 0); if (readBytes == SOCKET_ERROR || readBytes == 0) { - if (WSAGetLastError() != WSAEWOULDBLOCK) { + if (LAST_SOCKET_ERROR() != EWOULDBLOCK && LAST_SOCKET_ERROR() != EAGAIN) { return NETWORK_DISCONNECTED; } else { return NETWORK_NO_DATA; @@ -201,6 +201,7 @@ bool NetworkConnection::SendPacket(NetworkPacket& packet) { uint16 sizen = htons(packet.size); std::vector tosend; + tosend.reserve(sizeof(sizen) + packet.size); tosend.insert(tosend.end(), (uint8*)&sizen, (uint8*)&sizen + sizeof(sizen)); tosend.insert(tosend.end(), packet.data->begin(), packet.data->end()); while (1) { @@ -236,6 +237,22 @@ bool NetworkConnection::SetTCPNoDelay(bool on) return setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (const char*)&on, sizeof(on)) == 0; } +bool NetworkConnection::SetNonBlocking(bool on) +{ + return SetNonBlocking(socket, on); +} + +bool NetworkConnection::SetNonBlocking(SOCKET socket, bool on) +{ +#ifdef _WIN32 + u_long nonblocking = on; + return ioctlsocket(socket, FIONBIO, &nonblocking) == 0; +#else + int flags = fcntl(socket, F_GETFL, 0); + return fcntl(socket, F_SETFL, on ? (flags | O_NONBLOCK) : (flags & ~O_NONBLOCK)) == 0; +#endif +} + Network::Network() { wsa_initialized = false; @@ -266,6 +283,7 @@ Network::~Network() bool Network::Init() { +#ifdef _WIN32 if (!wsa_initialized) { log_verbose("Initialising WSA"); WSADATA wsa_data; @@ -275,6 +293,7 @@ bool Network::Init() } wsa_initialized = true; } +#endif return true; } @@ -296,10 +315,12 @@ void Network::Close() game_command_queue.clear(); player_list.clear(); +#ifdef _WIN32 if (wsa_initialized) { WSACleanup(); wsa_initialized = false; } +#endif gfx_invalidate_screen(); } @@ -322,28 +343,27 @@ bool Network::BeginClient(const char* host, unsigned short port) return false; } - SOCKADDR_IN server_address; + sockaddr_in server_address; if (inet_pton(AF_INET, address, &server_address.sin_addr) != 1) { return false; } server_address.sin_family = AF_INET; server_address.sin_port = htons(port); - if (connect(server_socket, (SOCKADDR*)&server_address, sizeof(SOCKADDR_IN)) != 0) { + if (connect(server_socket, (sockaddr*)&server_address, sizeof(server_address)) != 0) { log_error("Unable to connect to host."); return false; } else { printf("Connected to server!\n"); } - u_long nonblocking = 1; - if (ioctlsocket(server_socket, FIONBIO, &nonblocking) != NO_ERROR) { - closesocket(server_socket); - log_error("Failed to set non-blocking mode."); - } - server_connection.socket = server_socket; server_connection.SetTCPNoDelay(true); + if (!server_connection.SetNonBlocking(true)) { + closesocket(server_socket); + log_error("Failed to set non-blocking mode."); + return false; + } mode = NETWORK_MODE_CLIENT; @@ -364,12 +384,12 @@ bool Network::BeginServer(unsigned short port) return false; } - SOCKADDR_IN local_address; + sockaddr_in local_address; local_address.sin_family = AF_INET; - local_address.sin_addr.S_un.S_addr = INADDR_ANY; + local_address.sin_addr.s_addr = INADDR_ANY; local_address.sin_port = htons(port); - if (bind(listening_socket, (SOCKADDR*)&local_address, sizeof(SOCKADDR_IN)) != 0) { + if (bind(listening_socket, (sockaddr*)&local_address, sizeof(local_address)) != 0) { closesocket(listening_socket); log_error("Unable to bind to socket."); return false; @@ -381,8 +401,7 @@ bool Network::BeginServer(unsigned short port) return false; } - u_long nonblocking = 1; - if (ioctlsocket(listening_socket, FIONBIO, &nonblocking) != NO_ERROR) { + if (!NetworkConnection::SetNonBlocking(listening_socket, true)) { closesocket(listening_socket); log_error("Failed to set non-blocking mode."); return false; @@ -458,13 +477,12 @@ void Network::UpdateServer() } SOCKET socket = accept(listening_socket, NULL, NULL); if (socket == INVALID_SOCKET) { - if (WSAGetLastError() != WSAEWOULDBLOCK) { + if (LAST_SOCKET_ERROR() != EWOULDBLOCK) { PrintError(); log_error("Failed to accept client."); } } else { - u_long nonblocking = 1; - if (ioctlsocket(socket, FIONBIO, &nonblocking) != NO_ERROR) { + if (!NetworkConnection::SetNonBlocking(socket, true)) { closesocket(socket); log_error("Failed to set non-blocking mode."); } else { @@ -772,10 +790,16 @@ NetworkPlayer* Network::AddPlayer(const char* name) void Network::PrintError() { +#ifdef _WIN32 wchar_t *s = NULL; - FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&s, 0, NULL); + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, LAST_SOCKET_ERROR(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&s, 0, NULL); fprintf(stderr, "%S\n", s); LocalFree(s); +#else + char *s = strerror(LAST_SOCKET_ERROR()); + fprintf(stderr, "%s\n", s); +#endif + } int Network::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacket& packet) @@ -838,7 +862,7 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac chunk_buffer.resize(offset + chunksize); } char status[256]; - sprintf(status, "Downloading map ... (%d / %d)", (offset + chunksize) / 1000, size / 1000); + sprintf(status, "Downloading map ... (%lu / %lu)", (offset + chunksize) / 1000, size / 1000); window_network_status_open(status); memcpy(&chunk_buffer[offset], (void*)packet.Read(chunksize), chunksize); if (offset + chunksize == size) { @@ -982,7 +1006,11 @@ void network_close() int network_begin_client(const char *host, int port) { + if (gNetwork.GetMode() == NETWORK_MODE_NONE) { return gNetwork.BeginClient(host, port); + } else { + return false; + } } int network_begin_server(int port) diff --git a/src/network/network.h b/src/network/network.h index 671d61fdd1..04f99d8aba 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -47,6 +47,21 @@ extern "C" { #ifdef _WIN32 #include #include +#define LAST_SOCKET_ERROR() WSAGetLastError() +#undef EWOULDBLOCK +#define EWOULDBLOCK WSAEWOULDBLOCK +#else +#include +#include +#include +#include +#include +typedef int SOCKET; +#define SOCKET_ERROR -1 +#define INVALID_SOCKET -1 +#define LAST_SOCKET_ERROR() errno +#define closesocket close +#define ioctlsocket ioctl #endif // _WIN32 enum { @@ -118,6 +133,8 @@ public: void QueuePacket(std::unique_ptr packet); void SendQueuedPackets(); bool SetTCPNoDelay(bool on); + bool SetNonBlocking(bool on); + static bool SetNonBlocking(SOCKET socket, bool on); SOCKET socket; NetworkPacket inboundpacket; diff --git a/src/title.c b/src/title.c index dda66712a4..6da72cecfa 100644 --- a/src/title.c +++ b/src/title.c @@ -33,6 +33,7 @@ #include "intro.h" #include "management/news_item.h" #include "management/research.h" +#include "network/network.h" #include "openrct2.h" #include "peep/staff.h" #include "ride/ride.h" @@ -131,6 +132,9 @@ void title_load() title_init_showcase(); gfx_invalidate_screen(); RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) = 0; +#ifndef DISABLE_NETWORK + network_close(); +#endif if (gOpenRCT2ShowChangelog) { gOpenRCT2ShowChangelog = false; From 077f3a19955d27ea4afbdeb23b9b855b96339c36 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 24 Sep 2015 19:03:11 +0100 Subject: [PATCH 0720/1173] refactor RCT2 PE setup. --- src/openrct2.c | 201 ++++++++++++++++++++++++++++--------------------- 1 file changed, 114 insertions(+), 87 deletions(-) diff --git a/src/openrct2.c b/src/openrct2.c index 69d5b9a46d..6de7aeb621 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -65,6 +65,8 @@ int _finished; static struct { sint16 x, y, z; } _spritelocations1[MAX_SPRITES], _spritelocations2[MAX_SPRITES]; static void openrct2_loop(); +static bool openrct2_setup_rct2_segment(); +static void openrct2_setup_rct2_hooks(); static void openrct2_copy_files_over(const utf8 *originalDirectory, const utf8 *newDirectory, const utf8 *extension) { @@ -184,86 +186,11 @@ bool openrct2_initialise() return false; } -#ifdef __linux__ - #define DATA_OFFSET 0x004A4000 - - const char *exepath = "../openrct2.exe"; - int fd = open(exepath, O_RDONLY); - if (fd < 0) { - log_fatal("failed to open %s, errno = %d", exepath, errno); - exit(1); + if (!openrct2_setup_rct2_segment()) { + log_fatal("Unable to load RCT2 data sector"); + return false; } - // Using PE-bear I was able to figure out all the needed addresses to be filled. - // There are three sections to be loaded: .rdata, .data and .text, plus another - // one to be mapped: DATASEG. - // Out of the three, two can simply be mmapped into memory, while the third one, - // .data has a virtual size which is much completely different to its file size - // (even when taking page-alignment into consideration) - // - // The sections are as follows (dump from gdb) - // [0] 0x401000->0x6f7000 at 0x00001000: .text ALLOC LOAD READONLY CODE HAS_CONTENTS - // [1] 0x6f7000->0x8a325d at 0x002f7000: CODESEG ALLOC LOAD READONLY CODE HAS_CONTENTS - // [2] 0x8a4000->0x9a5894 at 0x004a4000: .rdata ALLOC LOAD DATA HAS_CONTENTS - // [3] 0x9a6000->0x9e2000 at 0x005a6000: .data ALLOC LOAD DATA HAS_CONTENTS - // [4] 0x1428000->0x14282bc at 0x005e2000: DATASEG ALLOC LOAD DATA HAS_CONTENTS - // [5] 0x1429000->0x1452000 at 0x005e3000: .cms_t ALLOC LOAD READONLY CODE HAS_CONTENTS - // [6] 0x1452000->0x14aaf3e at 0x0060c000: .cms_d ALLOC LOAD DATA HAS_CONTENTS - // [7] 0x14ab000->0x14ac58a at 0x00665000: .idata ALLOC LOAD READONLY DATA HAS_CONTENTS - // [8] 0x14ad000->0x14b512f at 0x00667000: .rsrc ALLOC LOAD DATA HAS_CONTENTS - // - // .data section, however, has virtual size of 0xA81C3C, and so - // 0x9a6000 + 0xA81C3C = 0x1427C3C, which after alignment to page size becomes - // 0x1428000, which can be seen as next section, DATASEG - // - // Since mmap does not provide a way to create a mapping with virtual size, - // I resorted to creating a one large map for data and memcpy'ing data where - // required. - // Another section is needed for .text, as it requires PROT_EXEC flag. - - // TODO: UGLY, UGLY HACK! - off_t file_size = 6750208; - - int len = 0x01429000 - 0x8a4000; // 0xB85000, 12079104 bytes or around 11.5MB - // section: rw data - void *base = mmap((void *)0x8a4000, len, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0); - log_warning("base = %x, 0x01423b40 >= base == %i, 0x01423b40 < base + len == %i", base, (void *)0x01423b40 >= base, (void *)0x01423b40 < base + len); - if (base == MAP_FAILED) { - log_warning("errno = %i", errno); - exit(1); - } - - len = 0x004A3000; - // section: text - void *base2 = mmap((void *)(0x401000), len, PROT_EXEC | PROT_WRITE | PROT_READ, MAP_PRIVATE, fd, 0x1000); - if (base2 != (void *)(0x401000)) - { - log_fatal("mmap failed to get required offset! got %p, expected %p, errno = %d", base2, (void *)(0x401000), errno); - exit(1); - } - - void *fbase = mmap(NULL, file_size, PROT_READ, MAP_PRIVATE, fd, 0); - int err = errno; - log_warning("mmapped file to %p", fbase); - if (fbase == MAP_FAILED) - { - log_fatal("mmap failed to get required offset! got %p, errno = %d", fbase, err); - exit(1); - } - // .rdata and real part of .data - // 0x9e2000 - 0x8a4000 = 0x13e000 - memcpy(base, fbase + DATA_OFFSET, 0x13e000); -#endif // __linux__ - const uint32 c1 = sawyercoding_calculate_checksum((void *)0x009ACFA4, 128); - const uint32 c2 = sawyercoding_calculate_checksum((void *)0x009ACFA4, 720 * 4); - const uint32 exp_c1 = 32640; - const uint32 exp_c2 = 734400; - log_warning("c1 = %u, expected %u, match %d", c1, exp_c1, c1 == exp_c1); - log_warning("c1 = %u, expected %u, match %d", c2, exp_c2, c2 == exp_c2); - if (c1 != exp_c1 || c2 != exp_c2) - { - exit(1); - } openrct2_set_exe_path(); config_set_defaults(); @@ -300,15 +227,7 @@ bool openrct2_initialise() title_sequences_set_default(); title_sequences_load_presets(); - // Hooks to allow RCT2 to call OpenRCT2 functions instead - addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0, 0); // remove when all callers are decompiled - addhook(0x006E7499, (int)gfx_redraw_screen_rect, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0, 0); // remove when 0x6E7FF3 is decompiled - addhook(0x006B752C, (int)ride_crash, 0, (int[]){ EDX, EBX, END }, 0, 0); // remove when all callers are decompiled - addhook(0x0069A42F, (int)peep_window_state_update, 0, (int[]){ ESI, END }, 0, 0); // remove when all callers are decompiled - addhook(0x006BB76E, (int)sound_play_panned, 0, (int[]){EAX, EBX, ECX, EDX, EBP, END}, EAX, 0); // remove when all callers are decompiled - addhook(0x006C42D9, (int)scrolling_text_setup, 0, (int[]){EAX, ECX, EBP, END}, 0, EBX); // remove when all callers are decompiled - addhook(0x006C2321, (int)gfx_get_string_width, 0, (int[]){ESI, END}, 0, ECX); // remove when all callers are decompiled - addhook(0x006C2555, (int)format_string, 0, (int[]){EDI, EAX, ECX, END}, 0, 0); // remove when all callers are decompiled + openrct2_setup_rct2_hooks(); if (!rct2_init()) return false; @@ -529,6 +448,114 @@ void openrct2_reset_object_tween_locations() } } +/** + * Loads RCT2's data model and remaps the addresses. + * @returns true if the data integrity check succeeded, otherwise false. + */ +static bool openrct2_setup_rct2_segment() +{ + // Linux will run OpenRCT2 as a native application and then load in the Windows PE, mapping the appropriate addresses as + // necessary. Windows does not need to do this as OpenRCT2 runs as a DLL loaded from the Windows PE. +#ifdef __linux__ + #define DATA_OFFSET 0x004A4000 + + const char *exepath = "../openrct2.exe"; + int fd = open(exepath, O_RDONLY); + if (fd < 0) { + log_fatal("failed to open %s, errno = %d", exepath, errno); + exit(1); + } + + // Using PE-bear I was able to figure out all the needed addresses to be filled. + // There are three sections to be loaded: .rdata, .data and .text, plus another + // one to be mapped: DATASEG. + // Out of the three, two can simply be mmapped into memory, while the third one, + // .data has a virtual size which is much completely different to its file size + // (even when taking page-alignment into consideration) + // + // The sections are as follows (dump from gdb) + // [0] 0x401000->0x6f7000 at 0x00001000: .text ALLOC LOAD READONLY CODE HAS_CONTENTS + // [1] 0x6f7000->0x8a325d at 0x002f7000: CODESEG ALLOC LOAD READONLY CODE HAS_CONTENTS + // [2] 0x8a4000->0x9a5894 at 0x004a4000: .rdata ALLOC LOAD DATA HAS_CONTENTS + // [3] 0x9a6000->0x9e2000 at 0x005a6000: .data ALLOC LOAD DATA HAS_CONTENTS + // [4] 0x1428000->0x14282bc at 0x005e2000: DATASEG ALLOC LOAD DATA HAS_CONTENTS + // [5] 0x1429000->0x1452000 at 0x005e3000: .cms_t ALLOC LOAD READONLY CODE HAS_CONTENTS + // [6] 0x1452000->0x14aaf3e at 0x0060c000: .cms_d ALLOC LOAD DATA HAS_CONTENTS + // [7] 0x14ab000->0x14ac58a at 0x00665000: .idata ALLOC LOAD READONLY DATA HAS_CONTENTS + // [8] 0x14ad000->0x14b512f at 0x00667000: .rsrc ALLOC LOAD DATA HAS_CONTENTS + // + // .data section, however, has virtual size of 0xA81C3C, and so + // 0x9a6000 + 0xA81C3C = 0x1427C3C, which after alignment to page size becomes + // 0x1428000, which can be seen as next section, DATASEG + // + // Since mmap does not provide a way to create a mapping with virtual size, + // I resorted to creating a one large map for data and memcpy'ing data where + // required. + // Another section is needed for .text, as it requires PROT_EXEC flag. + + // TODO: UGLY, UGLY HACK! + off_t file_size = 6750208; + + int len = 0x01429000 - 0x8a4000; // 0xB85000, 12079104 bytes or around 11.5MB + // section: rw data + void *base = mmap((void *)0x8a4000, len, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0); + log_warning("base = %x, 0x01423b40 >= base == %i, 0x01423b40 < base + len == %i", base, (void *)0x01423b40 >= base, (void *)0x01423b40 < base + len); + if (base == MAP_FAILED) { + log_warning("errno = %i", errno); + exit(1); + } + + len = 0x004A3000; + // section: text + void *base2 = mmap((void *)(0x401000), len, PROT_EXEC | PROT_WRITE | PROT_READ, MAP_PRIVATE, fd, 0x1000); + if (base2 != (void *)(0x401000)) + { + log_fatal("mmap failed to get required offset! got %p, expected %p, errno = %d", base2, (void *)(0x401000), errno); + exit(1); + } + + void *fbase = mmap(NULL, file_size, PROT_READ, MAP_PRIVATE, fd, 0); + int err = errno; + log_warning("mmapped file to %p", fbase); + if (fbase == MAP_FAILED) + { + log_fatal("mmap failed to get required offset! got %p, errno = %d", fbase, err); + exit(1); + } + // .rdata and real part of .data + // 0x9e2000 - 0x8a4000 = 0x13e000 + memcpy(base, fbase + DATA_OFFSET, 0x13e000); +#endif // __linux__ + + // Check that the expected data is at various addresses. + const uint32 c1 = sawyercoding_calculate_checksum((void *)0x009ACFA4, 128); + const uint32 c2 = sawyercoding_calculate_checksum((void *)0x009ACFA4, 720 * 4); + const uint32 exp_c1 = 32640; + const uint32 exp_c2 = 734400; + if (c1 != exp_c1 || c2 != exp_c2) { + log_warning("c1 = %u, expected %u, match %d", c1, exp_c1, c1 == exp_c1); + log_warning("c1 = %u, expected %u, match %d", c2, exp_c2, c2 == exp_c2); + return false; + } + + return true; +} + +/** + * Setup hooks to allow RCT2 to call OpenRCT2 functions instead. + */ +static void openrct2_setup_rct2_hooks() +{ + addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0, 0); // remove when all callers are decompiled + addhook(0x006E7499, (int)gfx_redraw_screen_rect, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0, 0); // remove when 0x6E7FF3 is decompiled + addhook(0x006B752C, (int)ride_crash, 0, (int[]){ EDX, EBX, END }, 0, 0); // remove when all callers are decompiled + addhook(0x0069A42F, (int)peep_window_state_update, 0, (int[]){ ESI, END }, 0, 0); // remove when all callers are decompiled + addhook(0x006BB76E, (int)sound_play_panned, 0, (int[]){EAX, EBX, ECX, EDX, EBP, END}, EAX, 0); // remove when all callers are decompiled + addhook(0x006C42D9, (int)scrolling_text_setup, 0, (int[]){EAX, ECX, EBP, END}, 0, EBX); // remove when all callers are decompiled + addhook(0x006C2321, (int)gfx_get_string_width, 0, (int[]){ESI, END}, 0, ECX); // remove when all callers are decompiled + addhook(0x006C2555, (int)format_string, 0, (int[]){EDI, EAX, ECX, END}, 0, 0); // remove when all callers are decompiled +} + #if _MSC_VER >= 1900 /** * Temporary fix for libraries not compiled with VS2015 From fa5aa0a5240659226372b0e8b8726755ed282cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 24 Sep 2015 20:02:28 +0200 Subject: [PATCH 0721/1173] enable linux multiplayer build for travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 172a8d25ce..b5436dfcdc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,6 +21,7 @@ env: - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" - OPENRCT2_CMAKE_OPTS="-DDISABLE_HTTP_TWITCH=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON -DCMAKE_C_COMPILER=gcc-4.8 -DCMAKE_CXX_COMPILER=g++-4.8" + - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=OFF -DDISABLE_HTTP_TWITCH=ON -DCMAKE_C_COMPILER=gcc-4.8 -DCMAKE_CXX_COMPILER=g++-4.8" sudo: required From bd51c7ed808f5fe3686e829f55c587e1689e00c1 Mon Sep 17 00:00:00 2001 From: nightroan Date: Mon, 21 Sep 2015 03:01:01 -0700 Subject: [PATCH 0722/1173] Fixed #1939 by adding a callback to delay selection of the next piece until the server sends back the placement command. --- src/game.c | 2 + src/ride/ride.c | 75 +++++++++++++++++++++++++++++++++ src/ride/ride.h | 2 + src/windows/ride_construction.c | 16 +++++++ 4 files changed, 95 insertions(+) diff --git a/src/game.c b/src/game.c index 50ee37673d..788100d360 100644 --- a/src/game.c +++ b/src/game.c @@ -65,6 +65,8 @@ GAME_COMMAND_CALLBACK_POINTER* game_command_callback = 0; GAME_COMMAND_CALLBACK_POINTER* game_command_callback_table[] = { 0, game_command_callback_ride_construct_new, + game_command_callback_ride_construct_placed_front, + game_command_callback_ride_construct_placed_back, }; int game_command_callback_get_index(GAME_COMMAND_CALLBACK_POINTER* callback) diff --git a/src/ride/ride.c b/src/ride/ride.c index e9feb8dce6..b8637b9dcf 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5308,6 +5308,81 @@ void game_command_callback_ride_construct_new(int eax, int ebx, int ecx, int edx ride_construct(rideIndex); } +/** + * + * Network client callback when placing ride pieces + * Client does execute placing the piece on the same tick as mouse_up - waits for server command + * Re-executes function from ride_construction - window_ride_construction_construct() + * Only uses part that deals with construction state + */ + +void game_command_callback_ride_construct_placed_back(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp) +{ + int trackType, trackDirection, rideIndex, edxRS16, x, y, z, properties; + track_begin_end trackBeginEnd; + + RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex; + trackDirection = _currentTrackPieceDirection ^ 2; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + if (!(trackDirection & 4)) { + x += TileDirectionDelta[trackDirection].x; + y += TileDirectionDelta[trackDirection].y; + } + + if (track_block_get_previous_from_zero(x, y, z, _currentRideIndex, trackDirection, &trackBeginEnd)) { + _currentTrackBeginX = trackBeginEnd.begin_x; + _currentTrackBeginY = trackBeginEnd.begin_y; + _currentTrackBeginZ = trackBeginEnd.begin_z; + _currentTrackPieceDirection = trackBeginEnd.begin_direction; + _currentTrackPieceType = trackBeginEnd.begin_element->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + ride_select_previous_section(); + } + else { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_0; + } + + sub_6C84CE(); +} + +void game_command_callback_ride_construct_placed_front(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp) +{ + int trackType, trackDirection, rideIndex, edxRS16, x, y, z, properties; + track_begin_end trackBeginEnd; + + RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex; + trackDirection = _currentTrackPieceDirection; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + if (!(trackDirection & 4)) { + x -= TileDirectionDelta[trackDirection].x; + y -= TileDirectionDelta[trackDirection].y; + } + + rct_xy_element next_track; + if (track_block_get_next_from_zero(x, y, z, _currentRideIndex, trackDirection, &next_track, &z, &trackDirection)) { + _currentTrackBeginX = next_track.x; + _currentTrackBeginY = next_track.y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = next_track.element->type & MAP_ELEMENT_DIRECTION_MASK; + _currentTrackPieceType = next_track.element->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + ride_select_next_section(); + } + else { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_0; + } + + sub_6C84CE(); +} + /** * * rct2: 0x006B49D9 diff --git a/src/ride/ride.h b/src/ride/ride.h index 517f006b28..cba6689fc4 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -967,6 +967,8 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * int ride_get_refund_price(int ride_id); void game_command_create_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_callback_ride_construct_new(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); +void game_command_callback_ride_construct_placed_front(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); +void game_command_callback_ride_construct_placed_back(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 4cdeccae80..a175f38231 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1563,6 +1563,15 @@ static void window_ride_construction_construct(rct_window *w) return; } + // If client, then we can't update 'next piece selection' code until server sends back command + if (network_get_mode() == NETWORK_MODE_CLIENT) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + game_command_callback = game_command_callback_ride_construct_placed_back; + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) { + game_command_callback = game_command_callback_ride_construct_placed_front; + } + } + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; RCT2_GLOBAL(0x00F44074, money32) = game_do_command( x, @@ -1592,6 +1601,9 @@ static void window_ride_construction_construct(rct_window *w) viewport_set_visibility(2); } + // *************** + // NOTE: the rest of this function (minus the network condition) is copied to game_command_callback_ride_construct_placed_front/back + // Please update both ends if there are any changes here if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex; trackDirection = _currentTrackPieceDirection ^ 2; @@ -1643,6 +1655,10 @@ static void window_ride_construction_construct(rct_window *w) } } + // returning early here makes it so that the construction window doesn't blink + if (network_get_mode() == NETWORK_MODE_CLIENT) + return; + sub_6C84CE(); } From 3835c8c109c545da3f1d2cfa3819186fc732cd55 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 26 Sep 2015 13:47:53 +0100 Subject: [PATCH 0723/1173] fix inet_ntop signature issues --- src/network/network.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index c6770c85d7..18b4497fd9 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -1106,7 +1106,7 @@ static bool network_get_address(char *dst, size_t dstLength, const char *host) if (remoteHost->ai_family != AF_INET) continue; struct sockaddr_in *ipv4SockAddr = (struct sockaddr_in*)remoteHost->ai_addr; - return inet_ntop(AF_INET, (const void*)&ipv4SockAddr->sin_addr, dst, dstLength) != NULL; + return inet_ntop(AF_INET, (void*)&ipv4SockAddr->sin_addr, dst, dstLength) != NULL; } // No IPv4 addresses found for host name From 015c41f6ef4d05643c8df47b202b6e04152837ab Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 26 Sep 2015 14:07:17 +0100 Subject: [PATCH 0724/1173] fix #1744 --- src/interface/viewport.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 7cfadad381..5ec11bf5a4 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1173,14 +1173,18 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma if (ride->status == RIDE_STATUS_OPEN && !(ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN)){ - RCT2_GLOBAL(0x0013CE954, uint32) = ride->name_arguments; - RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, rct_string_id) = ride->name; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, rct_string_id) = ride->name; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 2, uint32) = ride->name_arguments; string_id = STR_RIDE_ENTRANCE_NAME; } uint8 entrance_string[MAX_PATH]; - format_string(entrance_string, string_id, RCT2_ADDRESS(RCT2_ADDRESS_COMMON_FORMAT_ARGS, void)); + if (gConfigGeneral.upper_case_banners) { + format_string_to_upper(entrance_string, string_id, RCT2_ADDRESS(RCT2_ADDRESS_COMMON_FORMAT_ARGS, void)); + } else { + format_string(entrance_string, string_id, RCT2_ADDRESS(RCT2_ADDRESS_COMMON_FORMAT_ARGS, void)); + } RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0x1C0; @@ -1280,7 +1284,11 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele } uint8 park_name[MAX_PATH]; - format_string(park_name, park_text_id, RCT2_ADDRESS(0x0013CE952, void)); + if (gConfigGeneral.upper_case_banners) { + format_string_to_upper(park_name, park_text_id, RCT2_ADDRESS(RCT2_ADDRESS_COMMON_FORMAT_ARGS, void)); + } else { + format_string(park_name, park_text_id, RCT2_ADDRESS(RCT2_ADDRESS_COMMON_FORMAT_ARGS, void)); + } RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0x1C0; uint16 string_width = gfx_get_string_width(park_name); @@ -1527,7 +1535,11 @@ void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* m RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = gBanners[map_element->properties.banner.index].string_idx; string_id = STR_BANNER_TEXT; } - format_string(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char), string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + if (gConfigGeneral.upper_case_banners) { + format_string_to_upper(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char), string_id, RCT2_ADDRESS(RCT2_ADDRESS_COMMON_FORMAT_ARGS, void)); + } else { + format_string(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char), string_id, RCT2_ADDRESS(RCT2_ADDRESS_COMMON_FORMAT_ARGS, void)); + } RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0x1C0; From a04663368e5784dcc06f5a841be0a5131dbb9d7f Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 26 Sep 2015 14:35:26 +0100 Subject: [PATCH 0725/1173] add two new date formats, y/m/d and y/d/m, closes #1900 --- data/language/english_uk.txt | 6 +++++- src/localisation/date.c | 14 ++++++++++++++ src/localisation/date.h | 9 +++++++++ src/localisation/string_ids.h | 12 ++++++++++++ src/windows/game_bottom_toolbar.c | 15 +++++---------- src/windows/options.c | 17 +++++++++-------- 6 files changed, 54 insertions(+), 19 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index f8d65acebf..7de56f5f19 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3498,7 +3498,7 @@ STR_5156 :{SMALLFONT}{BLACK}Allows testing of most ride types even when the t STR_5157 :Unlock all prices STR_5158 :Quit to menu STR_5159 :Exit OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} +STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, Year {POP16}{COMMA16} STR_5161 :Date Format: STR_5162 :Day/Month/Year STR_5163 :Month/Day/Year @@ -3887,6 +3887,10 @@ STR_5545 :{SMALLFONT}{BLACK}Dark pink STR_5546 :{SMALLFONT}{BLACK}Bright pink STR_5547 :{SMALLFONT}{BLACK}Light pink STR_5548 :Show all operating modes +STR_5549 :Year/Month/Day +STR_5550 :{POP16}{POP16}Year {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} +STR_5551 :Year/Day/Month +STR_5552 :{POP16}{POP16}Year {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} ##################### # Rides/attractions # diff --git a/src/localisation/date.c b/src/localisation/date.c index 7b70923db9..50a754bce2 100644 --- a/src/localisation/date.c +++ b/src/localisation/date.c @@ -20,10 +20,24 @@ #include "../addresses.h" #include "date.h" +#include "string_ids.h" // rct2: 0x00993988 const sint16 days_in_month[MONTH_COUNT] = { 31, 30, 31, 30, 31, 31, 30, 31 }; +const rct_string_id DateFormatStringIds[] = { + STR_DATE_FORMAT_DAY_MONTH_YEAR, + STR_DATE_FORMAT_MONTH_DAY_YEAR, + STR_DATE_FORMAT_YEAR_MONTH_DAY, + STR_DATE_FORMAT_YEAR_DAY_MONTH +}; + +const rct_string_id DateFormatStringFormatIds[] = { + STR_DATE_FORMAT_DMY, + STR_DATE_FORMAT_MDY, + STR_DATE_FORMAT_YMD, + STR_DATE_FORMAT_YDM +}; int date_get_month(int months) { diff --git a/src/localisation/date.h b/src/localisation/date.h index 69c373ff91..6ae0b112e8 100644 --- a/src/localisation/date.h +++ b/src/localisation/date.h @@ -36,7 +36,16 @@ enum { MONTH_COUNT }; +enum { + DATE_FORMAT_DAY_MONTH_YEAR, + DATE_FORMAT_MONTH_DAY_YEAR, + DATE_FORMAT_YEAR_MONTH_DAY, + DATE_FORMAT_YEAR_DAY_MONTH +}; + extern const sint16 days_in_month[MONTH_COUNT]; +extern const rct_string_id DateFormatStringIds[]; +extern const rct_string_id DateFormatStringFormatIds[]; int date_get_month(int months); int date_get_year(int months); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index d366b4b736..5728e84bc9 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1393,6 +1393,8 @@ enum { STR_CHEAT_TIP_LARGE_TRAM_GUESTS = 2684, + STR_DATE_FORMAT_DMY = 2737, + STR_ROLLERCOASTER_TYCOON_1_DROPDOWN = 2740, STR_ROLLERCOASTER_TYCOON_2_DROPDOWN = 2741, @@ -1883,6 +1885,11 @@ enum { STR_CHEAT_UNLOCK_PRICES = 5157, + STR_DATE_FORMAT_MDY = 5160, + STR_DATE_FORMAT = 5161, + STR_DATE_FORMAT_DAY_MONTH_YEAR = 5162, + STR_DATE_FORMAT_MONTH_DAY_YEAR = 5163, + STR_TWITCH_NAME = 5164, STR_TWITCH_PEEP_FOLLOWERS = 5165, STR_TWITCH_PEEP_FOLLOWERS_TIP = 5166, @@ -2107,6 +2114,11 @@ enum { STR_CHEAT_SHOW_ALL_OPERATING_MODES = 5548, + STR_DATE_FORMAT_YEAR_MONTH_DAY = 5549, + STR_DATE_FORMAT_YMD = 5550, + STR_DATE_FORMAT_YEAR_DAY_MONTH = 5551, + STR_DATE_FORMAT_YDM = 5552, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index 0b27eb209d..e65afee41a 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -452,19 +452,14 @@ static void window_game_bottom_toolbar_draw_right_panel(rct_drawpixelinfo *dpi, int year = date_get_year(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16)) + 1; int month = date_get_month(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16) & 7); int day = ((RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16) * days_in_month[month]) >> 16) & 0xFF; - if (gConfigGeneral.date_format) { - RCT2_GLOBAL(0x013CE952, short) = month; - RCT2_GLOBAL(0x013CE954, short) = STR_DATE_DAY_1 + day; - } - else { - RCT2_GLOBAL(0x013CE952, short) = STR_DATE_DAY_1 + day; - RCT2_GLOBAL(0x013CE954, short) = month; - } - + + rct_string_id stringId = DateFormatStringFormatIds[gConfigGeneral.date_format]; + RCT2_GLOBAL(0x013CE952, short) = STR_DATE_DAY_1 + day; + RCT2_GLOBAL(0x013CE954, short) = month; RCT2_GLOBAL(0x013CE956, short) = year; gfx_draw_string_centred( dpi, - (gConfigGeneral.date_format ? 5160 : 2737), + stringId, x, y, (RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WINDOWCLASS, rct_windowclass) == 2 && RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WIDGETINDEX, sint32) == WIDX_DATE ? 2 : w->colours[0] & 0x7F), diff --git a/src/windows/options.c b/src/windows/options.c index 03e1282fff..40b93d010b 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -31,17 +31,18 @@ #include "../audio/mixer.h" #include "../config.h" #include "../drawing/drawing.h" +#include "../interface/themes.h" +#include "../interface/title_sequences.h" #include "../interface/viewport.h" #include "../interface/widget.h" #include "../interface/window.h" +#include "../localisation/date.h" #include "../localisation/localisation.h" #include "../platform/platform.h" #include "../sprites.h" +#include "../title.h" #include "dropdown.h" #include "error.h" -#include "../interface/themes.h" -#include "../interface/title_sequences.h" -#include "../title.h" enum WINDOW_OPTIONS_PAGE { WINDOW_OPTIONS_PAGE_DISPLAY, @@ -789,11 +790,11 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* gDropdownItemsChecked = 1 << (gCurrentLanguage - 1); break; case WIDX_DATE_FORMAT_DROPDOWN: - for (i = 0; i < 2; i++) { + for (i = 0; i < 4; i++) { gDropdownItemsFormat[i] = 1142; - gDropdownItemsArgs[i] = 5162 + i; + gDropdownItemsArgs[i] = DateFormatStringIds[i]; } - window_options_show_dropdown(w, widget, 2); + window_options_show_dropdown(w, widget, 4); gDropdownItemsChecked = 1 << (gConfigGeneral.date_format); break; } @@ -1334,12 +1335,12 @@ static void window_options_paint(rct_window *w, rct_drawpixelinfo *dpi) gfx_draw_string_left(dpi, 5161, w, w->colours[1], w->x + 10, w->y + window_options_culture_widgets[WIDX_DATE_FORMAT].top + 1); gfx_draw_string_left( dpi, - 5162 + gConfigGeneral.date_format, + DateFormatStringIds[gConfigGeneral.date_format], NULL, w->colours[1], w->x + window_options_culture_widgets[WIDX_DATE_FORMAT].left + 1, w->y + window_options_culture_widgets[WIDX_DATE_FORMAT].top - ); + ); break; case WINDOW_OPTIONS_PAGE_AUDIO: gfx_draw_string_left(dpi, 2738, w, w->colours[1], w->x + 10, w->y + window_options_audio_widgets[WIDX_TITLE_MUSIC].top + 1); From 8d3f7600fbd3e3332462c1884e0909977e9d71b8 Mon Sep 17 00:00:00 2001 From: nightroan Date: Sat, 26 Sep 2015 15:59:12 -0700 Subject: [PATCH 0726/1173] As a multiplayer client, don't select the next track piece if is is unaffordable. --- src/windows/ride_construction.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index a175f38231..d119924836 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1583,6 +1583,8 @@ static void window_ride_construction_construct(rct_window *w) 0 ); if (RCT2_GLOBAL(0x00F44074, money32) == MONEY32_UNDEFINED) { + if (network_get_mode() == NETWORK_MODE_CLIENT) + game_command_callback = 0; // don't do callback if we can't afford the track piece sub_6C84CE(); return; } From 4643881389a22c3676523388083380a3311e7a5f Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 27 Sep 2015 04:00:16 +0100 Subject: [PATCH 0727/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 7 ++++++- data/language/english_us.txt | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 9cab977080..5ae2e50de4 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3492,7 +3492,7 @@ STR_5156 :{SMALLFONT}{BLACK}Maakt het mogelijk om de meeste attractietypes te STR_5157 :Alle prijzen ontgrendelen STR_5158 :Terug naar het hoofdmenu STR_5159 :OpenRCT2 afsluiten -STR_5160 :{MONTH} {STRINGID}, jaar {COMMA16} +STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, jaar {POP16}{COMMA16} STR_5161 :Datumnotatie: STR_5162 :Dag/maand/jaar STR_5163 :Maand/dag/jaar @@ -3880,6 +3880,11 @@ STR_5544 :{SMALLFONT}{BLACK}Helder rood STR_5545 :{SMALLFONT}{BLACK}Donkerroze STR_5546 :{SMALLFONT}{BLACK}Helder roze STR_5547 :{SMALLFONT}{BLACK}Lichtroze +STR_5548 :Alle bedrijfsmodi tonen +STR_5549 :Jaar/maand/dag +STR_5550 :{POP16}{POP16}Jaar {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} +STR_5551 :Jaar/dag/maand +STR_5552 :{POP16}{POP16}Jaar {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} ############# # Scenarios # diff --git a/data/language/english_us.txt b/data/language/english_us.txt index e229928fe2..193b2879a1 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3500,7 +3500,7 @@ STR_5156 :{SMALLFONT}{BLACK}Allows testing of most ride types even when the t STR_5157 :Unlock all prices STR_5158 :Quit to menu STR_5159 :Exit OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} +STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, Year {POP16}{COMMA16} STR_5161 :Date Format: STR_5162 :Day/Month/Year STR_5163 :Month/Day/Year @@ -3888,6 +3888,11 @@ STR_5544 :{SMALLFONT}{BLACK}Bright red STR_5545 :{SMALLFONT}{BLACK}Dark pink STR_5546 :{SMALLFONT}{BLACK}Bright pink STR_5547 :{SMALLFONT}{BLACK}Light pink +STR_5548 :Show all operating modes +STR_5549 :Year/Month/Day +STR_5550 :{POP16}{POP16}Year {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} +STR_5551 :Year/Day/Month +STR_5552 :{POP16}{POP16}Year {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} ######### # Rides # From 9643bfe471337a5a2cf3c21217426be8be2a5f2d Mon Sep 17 00:00:00 2001 From: Mithun Hunsur Date: Sun, 27 Sep 2015 16:54:50 +1000 Subject: [PATCH 0728/1173] Correct full name in contributors.md Was just looking through and noticed my name was wrong. Hope you don't mind! --- contributors.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributors.md b/contributors.md index 89b4be1d90..cbda400657 100644 --- a/contributors.md +++ b/contributors.md @@ -67,7 +67,7 @@ Includes all git commit authors. Aliases are GitHub user names. * James Robertson (rd3k) * Max Boße (MakaHost) * (MaxBareiss) -* Philip Plarkson (Philpax) +* Mithun Hunsur (Philpax) * (RollingStar) ## Translation From 1a0fc465592f178be598975b0823f919b20b3307 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 27 Sep 2015 16:21:45 +0100 Subject: [PATCH 0729/1173] Fix #1723 issue caused by failing to return. The logic would fall through to the ending code so that it would just make a beeline to the exit after walking to one corner. --- src/peep/peep.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/peep/peep.c b/src/peep/peep.c index 61d0f78203..2ac50005c0 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -2643,6 +2643,7 @@ static void peep_udpate_ride_sub_state_13(rct_peep* peep){ peep->destination_x = x; peep->destination_y = y; + return; } peep->var_37 |= 3; From a697606211bbc439c41f376fab8695d224aaa42a Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 27 Sep 2015 16:55:34 +0100 Subject: [PATCH 0730/1173] Fix #1718. Incorrect cursors on scroll widgets. Issue was being caused by passing the incorrect x and y parameters due to missing a widget dereference. I've also moved the x/y coordinates of the hand open/close to closer match what it feels like. --- src/cursors.h | 8 ++++---- src/input.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cursors.h b/src/cursors.h index 19b19a2448..b3714cfaa1 100644 --- a/src/cursors.h +++ b/src/cursors.h @@ -174,12 +174,12 @@ extern unsigned char entrance_down_cursor_mask[32 * 4]; extern unsigned char hand_open_cursor_data[32 * 4]; extern unsigned char hand_open_cursor_mask[32 * 4]; -#define HAND_OPEN_CURSOR_HOTX 0 -#define HAND_OPEN_CURSOR_HOTY 0 +#define HAND_OPEN_CURSOR_HOTX 5 +#define HAND_OPEN_CURSOR_HOTY 1 extern unsigned char hand_closed_cursor_data[32 * 4]; extern unsigned char hand_closed_cursor_mask[32 * 4]; -#define HAND_CLOSED_CURSOR_HOTX 0 -#define HAND_CLOSED_CURSOR_HOTY 0 +#define HAND_CLOSED_CURSOR_HOTX 5 +#define HAND_CLOSED_CURSOR_HOTY 1 #endif \ No newline at end of file diff --git a/src/input.c b/src/input.c index 8027c458a4..7a60d4f8a2 100644 --- a/src/input.c +++ b/src/input.c @@ -1023,7 +1023,7 @@ void process_mouse_over(int x, int y) RCT2_GLOBAL(0x9DE558, uint16) = x; RCT2_GLOBAL(0x9DE55A, uint16) = y; int output_scroll_area, scroll_id; - widget_scroll_get_part(window, window->widgets, x, y, &x, &y, &output_scroll_area, &scroll_id); + widget_scroll_get_part(window, &window->widgets[widgetId], x, y, &x, &y, &output_scroll_area, &scroll_id); cursorId = scroll_id; if (output_scroll_area != SCROLL_PART_VIEW) { From 9e1e0748f30ec69335745e8afeaa8e2220be8fd8 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 27 Sep 2015 21:32:17 +0100 Subject: [PATCH 0731/1173] Fix #1947. Maze entrances no longer modify hedges wrong. > Issue was caused by incorrectly translating btr and bts to C. In addition the operation was on a word and not a byte so it wouldn't change the maze correctly for all rotations. I've also refactored the code to make it a bit easier to follow. --- src/ride/ride.c | 50 +++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index b8637b9dcf..425511fa19 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -146,7 +146,7 @@ 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 sub_666CBE(int x, int y, rct_map_element *mapElement); +static void maze_entrance_hedge_removal(int x, int y, rct_map_element *mapElement); rct_ride_type *ride_get_entry(rct_ride *ride) { @@ -4078,7 +4078,7 @@ static void ride_set_maze_entrance_exit_points(rct_ride *ride) } if (mapElement->base_height != z) continue; - sub_666CBE(x, y, mapElement); + maze_entrance_hedge_removal(x, y, mapElement); } while (!map_element_is_last_for_tile(mapElement++)); } } @@ -6607,8 +6607,9 @@ void sub_6CB945(int rideIndex) /** * * rct2: 0x00666CBE + * Removes the hedge walls for an entrance placement. */ -static void sub_666CBE(int x, int y, rct_map_element *mapElement) +static void maze_entrance_hedge_removal(int x, int y, rct_map_element *mapElement) { int direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; x += TileDirectionDelta[direction].x; @@ -6623,17 +6624,19 @@ static void sub_666CBE(int x, int y, rct_map_element *mapElement) if (mapElement->base_height != z) continue; if (mapElement->properties.track.type != TRACK_ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP) continue; - direction <<= 2; - direction = (direction + 9) & 0x0F; - mapElement->properties.track.sequence &= direction; - direction = (direction + 3) & 0x0F; - mapElement->properties.track.sequence &= direction; - direction = (direction - 2) & 0x0F; - mapElement->properties.track.sequence &= direction; - direction = (direction + 1) & 0x0F; - mapElement->properties.track.sequence &= direction; - direction = (direction + 4) & 0x0F; - mapElement->properties.track.sequence &= direction; + // Each maze element is split into 4 sections with 4 different walls + uint8 mazeSection = direction * 4; + // Remove the top outer wall + mapElement->properties.track.maze_entry &= ~(1 << ((mazeSection + 9) & 0x0F)); + // Remove the bottom outer wall + mapElement->properties.track.maze_entry &= ~(1 << ((mazeSection + 12) & 0x0F)); + // Remove the intersecting wall + mapElement->properties.track.maze_entry &= ~(1 << ((mazeSection + 10) & 0x0F)); + // Remove the top hedge section + mapElement->properties.track.maze_entry &= ~(1 << ((mazeSection + 11) & 0x0F)); + // Remove the bottom hedge section + mapElement->properties.track.maze_entry &= ~(1 << ((mazeSection + 15) & 0x0F)); + map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); return; } while (!map_element_is_last_for_tile(mapElement++)); @@ -6642,8 +6645,9 @@ static void sub_666CBE(int x, int y, rct_map_element *mapElement) /** * * rct2: 0x00666D6F + * Replaces the outer hedge walls for an entrance placement removal. */ -static void sub_666D6F(int x, int y, rct_map_element *mapElement) +static void maze_entrance_hedge_replacement(int x, int y, rct_map_element *mapElement) { int direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; x += TileDirectionDelta[direction].x; @@ -6658,11 +6662,13 @@ static void sub_666D6F(int x, int y, rct_map_element *mapElement) if (mapElement->base_height != z) continue; if (mapElement->properties.track.type != TRACK_ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP) continue; - direction <<= 2; - direction = (direction + 9) & 0x0F; - mapElement->properties.track.sequence |= direction; - direction = (direction + 3) & 0x0F; - mapElement->properties.track.sequence |= direction; + // Each maze element is split into 4 sections with 4 different walls + uint8 mazeSection = direction * 4; + // Add the top outer wall + mapElement->properties.track.maze_entry |= (1 << ((mazeSection + 9) & 0x0F)); + // Add the bottom outer wall + mapElement->properties.track.maze_entry |= (1 << ((mazeSection + 12) & 0x0F)); + map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); return; } while (!map_element_is_last_for_tile(mapElement++)); @@ -6833,7 +6839,7 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio sub_6A7594(); if (!(flags & GAME_COMMAND_FLAG_GHOST)) { - sub_666CBE(x, y, mapElement); + maze_entrance_hedge_removal(x, y, mapElement); } footpath_connect_edges(x, y, mapElement, flags); sub_6A759F(); @@ -6901,7 +6907,7 @@ money32 remove_ride_entrance_or_exit(sint16 x, sint16 y, uint8 rideIndex, uint8 } sub_6A7594(); - sub_666D6F(x, y, mapElement); + maze_entrance_hedge_replacement(x, y, mapElement); footpath_remove_edges_at(x, y, mapElement); uint8 is_exit = mapElement->properties.entrance.type; From eaa44ab1e15050c5691e7374842c6731d97aa4ef Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 27 Sep 2015 21:55:48 +0100 Subject: [PATCH 0732/1173] Fix #1854. Special track elements disable correctly. Issue was caused by a change I asked to be done a month back. Dropdowns are awkward windows the global array for dropdown content should be populated before creating them but not anything else as that will get reset. In this case the disabled items were reset. The same happens for highlighted index if that is specified before window creation --- src/windows/dropdown.c | 6 +++--- src/windows/ride_construction.c | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/windows/dropdown.c b/src/windows/dropdown.c index 3d3bf54c21..4d900297e4 100644 --- a/src/windows/dropdown.c +++ b/src/windows/dropdown.c @@ -179,7 +179,7 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo // Input state _dropdown_highlighted_index = -1; - RCT2_GLOBAL(0x009DED34, sint32) = 0; + *gDropdownItemsDisabled = 0; gDropdownItemsChecked = 0; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE; @@ -258,7 +258,7 @@ void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 fl // Input state _dropdown_highlighted_index = -1; - RCT2_GLOBAL(0x009DED34, sint32) = 0; + *gDropdownItemsDisabled = 0; gDropdownItemsChecked = 0; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE; @@ -337,7 +337,7 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) colour = w->colours[0] & 0x7F; if (i == _dropdown_highlighted_index) colour = 2; - if (RCT2_GLOBAL(0x009DED34, uint32) & (1 << i)) + if (*gDropdownItemsDisabled & (1 << i)) if (i < 32) colour = (w->colours[0] & 0x7F) | 0x40; diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index d119924836..8c0d9394ed 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -3164,7 +3164,6 @@ static void window_ride_construction_show_special_track_dropdown(rct_window *w, RCT2_GLOBAL(0x009DEBA2, sint16) = i; } } - *gDropdownItemsDisabled = RCT2_GLOBAL(0x00F4409C, uint32); window_dropdown_show_text_custom_width( w->x + widget->left, @@ -3175,6 +3174,8 @@ static void window_ride_construction_show_special_track_dropdown(rct_window *w, _numCurrentPossibleRideConfigurations, widget->right - widget->left ); + + *gDropdownItemsDisabled = RCT2_GLOBAL(0x00F4409C, uint32); } /** From adebebe2d452870a5c52b5db56fba97276c76eec Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 28 Sep 2015 04:00:17 +0100 Subject: [PATCH 0733/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 7 +++++-- data/language/german.txt | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 956519123d..59f18568ce 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3498,7 +3498,7 @@ STR_5156 :{SMALLFONT}{BLACK}容許測試大部份軌道設計, 即使未建 STR_5157 :允許設置進入樂園及乘坐遊樂設施的價格 STR_5158 :回到主選單 STR_5159 :離開OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, 第{COMMA16}年 +STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, {POP16}第{COMMA16}年 STR_5161 :日期格式: STR_5162 :日/月/年 STR_5163 :月/日/年 @@ -3888,7 +3888,10 @@ STR_5545 :{SMALLFONT}{BLACK}暗粉紅色 STR_5546 :{SMALLFONT}{BLACK}明粉紅色 STR_5547 :{SMALLFONT}{BLACK}淺粉紅色 STR_5548 :顯示所有運作模式 - +STR_5549 :年/月/日 +STR_5550 :{POP16}{POP16}第{COMMA16}年, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} +STR_5551 :年/日/月 +STR_5552 :{POP16}{POP16}第{COMMA16}年, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} ##################### # Rides/attractions # diff --git a/data/language/german.txt b/data/language/german.txt index 13422737f0..b23816f710 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3493,7 +3493,7 @@ STR_5156 :{SMALLFONT}{BLACK}Erlaubt das Testen der meisten Bahnarten, selbst STR_5157 :Alle Preise freischalten STR_5158 :Spiel beenden STR_5159 :OpenRCT2 beenden -STR_5160 :{MONTH} {STRINGID}, Jahr {COMMA16} +STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, Jahr {POP16}{COMMA16} STR_5161 :Datumsformat: STR_5162 :Tag/Monat/Jahr STR_5163 :Monat/Tag/Jahr @@ -3882,3 +3882,7 @@ STR_5545 :{SMALLFONT}{BLACK}Dunkelrosa STR_5546 :{SMALLFONT}{BLACK}Leuchtendes Rosa STR_5547 :{SMALLFONT}{BLACK}Hellrosa STR_5548 :Alle Betriebsmodi anzeigen +STR_5549 :Jahr/Monat/Tag +STR_5550 :{POP16}{POP16}Jahr {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} +STR_5551 :Jahr/Tag/Monat +STR_5552 :{POP16}{POP16}Jahr {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} From c6b0d0919d72ca9d45df55589dea8de3bd194fff Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 28 Sep 2015 18:10:41 +0100 Subject: [PATCH 0734/1173] fix #1982 --- src/core/StringBuilder.hpp | 2 ++ src/localisation/LanguagePack.cpp | 15 +++++++++++---- src/localisation/LanguagePack.h | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/core/StringBuilder.hpp b/src/core/StringBuilder.hpp index 19f69f3c1c..3c39617a4a 100644 --- a/src/core/StringBuilder.hpp +++ b/src/core/StringBuilder.hpp @@ -47,6 +47,8 @@ public: /** * Appends the given string of the given length to the current string. Essentially used to ignore null terminators or copy * the data faster as the length is already known. + * @param text Pointer to the UTF-8 text to append. + * @param textLength Number of bytes to copy. (Can be used to append single bytes rather than codepoints) */ void Append(const utf8 *text, int textLength) { EnsureCapacity(_length + textLength + 1); diff --git a/src/localisation/LanguagePack.cpp b/src/localisation/LanguagePack.cpp index f50ffb3519..b4386129ed 100644 --- a/src/localisation/LanguagePack.cpp +++ b/src/localisation/LanguagePack.cpp @@ -415,11 +415,16 @@ void LanguagePack::ParseString(IStringReader *reader) while (reader->TryPeek(&codepoint) && !IsNewLine(codepoint)) { if (codepoint == '{') { uint32 token; - if (!ParseToken(reader, &token)) { + bool isByte; + if (ParseToken(reader, &token, &isByte)) { + if (isByte) { + sb.Append((const utf8*)&token, 1); + } else { + sb.Append((int)token); + } + } else { // Syntax error or unknown token, ignore line entirely return; - } else { - sb.Append((int)token); } } else { reader->Skip(); @@ -451,7 +456,7 @@ void LanguagePack::ParseString(IStringReader *reader) _stringDataSB.Append(&sb); } -bool LanguagePack::ParseToken(IStringReader *reader, uint32 *token) +bool LanguagePack::ParseToken(IStringReader *reader, uint32 *token, bool *isByte) { auto sb = StringBuilder(); int codepoint; @@ -472,12 +477,14 @@ bool LanguagePack::ParseToken(IStringReader *reader, uint32 *token) const utf8 *tokenName = sb.GetBuffer(); *token = format_get_code(tokenName); + *isByte = false; // Handle explicit byte values if (*token == 0) { int number; if (sscanf(tokenName, "%d", &number) == 1) { *token = Math::Clamp(0, number, 255); + *isByte = true; } } diff --git a/src/localisation/LanguagePack.h b/src/localisation/LanguagePack.h index 56a3479184..871b689401 100644 --- a/src/localisation/LanguagePack.h +++ b/src/localisation/LanguagePack.h @@ -73,5 +73,5 @@ private: void ParseGroupScenario(IStringReader *reader); void ParseString(IStringReader *reader); - bool ParseToken(IStringReader *reader, uint32 *token); + bool ParseToken(IStringReader *reader, uint32 *token, bool *isByte); }; From 5d1beb14c005d9e79a1bae0e52e332a468dad359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Wed, 23 Sep 2015 19:27:51 +0200 Subject: [PATCH 0735/1173] Platform, memory fixes --- src/ride/track.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index 137396b123..fa40c4ed7b 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -524,7 +524,8 @@ rct_track_td6* load_track_design(const char *path) char* track_name_pointer = (char*)path; while (*track_name_pointer++ != '\0'); - while (*--track_name_pointer != '\\'); + const char separator = platform_get_path_separator(); + while (*--track_name_pointer != separator); char* default_name = RCT2_ADDRESS(0x009E3504, char); // Copy the track name for use as the default name of this ride while (*++track_name_pointer != '.')*default_name++ = *track_name_pointer; @@ -580,10 +581,11 @@ rct_track_td6* load_track_design(const char *path) copy(&track_design->track_spine_colour, &src, version == 1 ? 140 : 67); uint8* track_elements = RCT2_ADDRESS(0x9D821B, uint8); + int len = decodedLength - (src - decoded); // Read the actual track data. - copy(track_elements, &src, 24572); + copy(track_elements, &src, len); - uint8* final_track_element_location = track_elements + 24572; + uint8* final_track_element_location = track_elements + len; free(decoded); // td4 files require some work to be recognised as td6. From a16de307d738fbdde9306e0e4efb8522c4476360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 24 Sep 2015 22:47:14 +0200 Subject: [PATCH 0736/1173] Refactor project build scripts This is mostly refactoring of cmake scripts, but also touches build.sh and install.sh. The cmake should be much more palatable now for major Linux distributions. At the same time, new configuration is introduced to Linux version, one with Twitch enabled. Please note, however, this change requires update of orctlibs.zip for mingw builds. --- .travis.yml | 13 ++-- CMakeLists.txt | 36 +++++----- CMakeLists_mingw.txt | 7 +- build.sh | 4 +- install.sh | 164 ++++++++++++++++++++++++------------------- src/network/http.cpp | 8 +-- src/network/http.h | 2 +- 7 files changed, 125 insertions(+), 109 deletions(-) diff --git a/.travis.yml b/.travis.yml index b5436dfcdc..80d3afdb5b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,18 +10,19 @@ notifications: on_failure: change on_success: change -cache: +cache: directories: - - cache + - .cache apt: true env: - - OPENRCT2_CMAKE_OPTS="-DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" - - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" - - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" - - OPENRCT2_CMAKE_OPTS="-DDISABLE_HTTP_TWITCH=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON -DCMAKE_C_COMPILER=gcc-4.8 -DCMAKE_CXX_COMPILER=g++-4.8" - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=OFF -DDISABLE_HTTP_TWITCH=ON -DCMAKE_C_COMPILER=gcc-4.8 -DCMAKE_CXX_COMPILER=g++-4.8" + - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=OFF -DDISABLE_HTTP_TWITCH=OFF -DCMAKE_C_COMPILER=gcc-4.8 -DCMAKE_CXX_COMPILER=g++-4.8" + - OPENRCT2_CMAKE_OPTS="-DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" TARGET=windows + - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" TARGET=windows + - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" TARGET=windows + - OPENRCT2_CMAKE_OPTS="-DDISABLE_HTTP_TWITCH=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" TARGET=windows sudo: required diff --git a/CMakeLists.txt b/CMakeLists.txt index 51d08c54c9..019c29e6a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,9 +26,19 @@ project(${PROJECT}) add_definitions(-DORCT2_RESOURCE_DIR="${ORCT2_RESOURCE_DIR}") add_definitions(-DHAVE_CONFIG_H) add_definitions(-DCURL_STATICLIB) + +INCLUDE(FindPkgConfig) + option(DISABLE_HTTP_TWITCH "Disable HTTP and Twitch support.") if (DISABLE_HTTP_TWITCH) add_definitions(-DDISABLE_HTTP -DDISABLE_TWITCH) +else (DISABLE_HTTP_TWITCH) + PKG_CHECK_MODULES(LIBCURL REQUIRED libcurl) + PKG_CHECK_MODULES(JANSSON REQUIRED jansson) + SET(HTTPLIBS ${LIBCURL_LIBRARIES} ${JANSSON_LIBRARIES}) + if (WIN32) + SET(HTTPLIBS ${HTTPLIBS} ssl crypto winmm.lib ws2_32) + endif (WIN32) endif (DISABLE_HTTP_TWITCH) option(DISABLE_NETWORK "Disable multiplayer functionality. Mainly for testing.") @@ -36,11 +46,6 @@ if (DISABLE_NETWORK) add_definitions(-DDISABLE_NETWORK) endif (DISABLE_NETWORK) -set(ORCTLIBS_INCLUDE /usr/local/cross-tools/orctlibs/include) -set(JANSSON_INCLUDE /usr/local/cross-tools/orctlibs/include/jansson) -set(ORCTLIBS_LIB_DIR /usr/local/cross-tools/orctlibs/lib) -set(ORCTLIBS_LIB jansson curl ssl crypto) - # include lib include_directories("lib/") # include speex header @@ -52,18 +57,15 @@ if (UNIX) # force 32bit build for now and set necessary flags to compile code as is set(CMAKE_C_FLAGS "-m32 -masm=intel -fvar-tracking-assignments -std=gnu99") set(CMAKE_CXX_FLAGS "-m32 -std=gnu++11 -fvar-tracking-assignments -masm=intel") - set(LIB32 /usr/lib32) - set(CMAKE_SHARED_LINKER_FLAGS "-m32 -Wl,-melf_i386 -L${LIB32} -lSDL2_ttf") + set(CMAKE_SHARED_LINKER_FLAGS "-m32 -Wl,-melf_i386") set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}) - - # find and include SDL2 - INCLUDE(FindPkgConfig) - PKG_CHECK_MODULES(SDL2 REQUIRED sdl2 SDL2_ttf) - INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS}) endif (UNIX) -INCLUDE_DIRECTORIES(${ORCTLIBS_INCLUDE} ${JANSSON_INCLUDE}) -LINK_DIRECTORIES(${LINK_DIRECTORIES} ${LIB32} ${SDL2_LIBRARY_DIRS} ${ORCTLIBS_LIB_DIR}) +# find and include SDL2 +PKG_CHECK_MODULES(SDL2 REQUIRED sdl2 SDL2_ttf) +INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${LIBCURL_INCLUDE_DIRS} ${JANSSON_INCLUDE_DIRS}) + +LINK_DIRECTORIES(${SDL2_LIBRARY_DIRS} ${JANSSON_LIBRARY_DIRS} ${LIBCURL_LIBRARY_DIRS}) if (WIN32) # build as library for now, replace with add_executable @@ -78,8 +80,4 @@ endif (WIN32) # libopenrct2.dll -> openrct2.dll set_target_properties(${PROJECT} PROPERTIES PREFIX "") -TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB}) - -if (WIN32) - target_link_libraries(${PROJECT} winmm.lib -limm32 -lversion ws2_32) -endif (WIN32) +TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB} ${JANSSON_LIBRARIES} ${HTTPLIBS}) diff --git a/CMakeLists_mingw.txt b/CMakeLists_mingw.txt index 69361d4f96..4be930b8e4 100644 --- a/CMakeLists_mingw.txt +++ b/CMakeLists_mingw.txt @@ -19,11 +19,6 @@ else() set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++" CACHE STRING "" FORCE) endif(${ACTUAL_SYSTEM} MATCHES "Linux") -# find and include SDL2 -INCLUDE(FindPkgConfig) -PKG_CHECK_MODULES(SDL2 REQUIRED sdl2 SDL2_ttf) -INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS}) - if(APPLE) SET(TARGET_ENVIRONMENT /usr/local/mingw-w32-bin_i686-darwin/i686-w64-mingw32) else() @@ -39,3 +34,5 @@ SET(CMAKE_FIND_ROOT_PATH ${TARGET_ENVIRONMENT}) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +# INCLUDE_DIRECTORIES(${ORCTLIBS_INCLUDE} ${JANSSON_INCLUDE}) diff --git a/build.sh b/build.sh index ac73080354..8a60258a87 100755 --- a/build.sh +++ b/build.sh @@ -42,7 +42,7 @@ if [[ "$needsdownload" = "true" ]]; then if [[ -d $cachedir/orctlibs ]]; then rm -rf $cachedir/orctlibs fi - curl https://download.openrct2.website/dev/lib/mingw -o $cachedir/orctlibs.zip + curl https://dl.dropboxusercontent.com/u/1323345/orctlibs.zip -o $cachedir/orctlibs.zip mkdir -p $cachedir/orctlibs pushd $cachedir/orctlibs unzip -uaq ../orctlibs.zip @@ -55,7 +55,7 @@ if [[ "$needsdownload" = "true" ]]; then fi pushd build - echo OPENRCT2_CMAKE_OPTS = $OPENRCT_CMAKE_OPTS + echo OPENRCT2_CMAKE_OPTS = $OPENRCT2_CMAKE_OPTS cmake -DCMAKE_BUILD_TYPE=Debug $OPENRCT2_CMAKE_OPTS .. make popd diff --git a/install.sh b/install.sh index 1400804253..c1745a9f72 100755 --- a/install.sh +++ b/install.sh @@ -8,6 +8,11 @@ mkdir -p $cachedir echo `uname` +# Sets default target to "linux", if none specified +TARGET=${TARGET-linux} + +echo TARGET = $TARGET + if [[ `uname` == "Darwin" ]]; then echo "Installation of OpenRCT2 assumes you have homebrew and use it to install packages." @@ -84,81 +89,96 @@ elif [[ `uname` == "Linux" ]]; then sudo apt-get install -y wine fi else - apt-cache search libsdl2 - apt-cache policy libsdl2-dev:i386 - apt-cache policy libsdl2-dev - sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386 gcc-4.8 pkg-config:i386 g++-4.8-multilib gcc-4.8-multilib libjansson-dev:i386 libspeex-dev:i386 libspeexdsp-dev:i386 libcurl4-openssl-dev:i386 libcrypto++-dev:i386 - export CC=gcc-4.8 - export CXX=g++-4.8 + case "$TARGET" in + "linux") + sudo apt-get install -y --force-yes cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386 gcc-4.8 pkg-config:i386 g++-4.8-multilib gcc-4.8-multilib libjansson-dev:i386 libspeex-dev:i386 libspeexdsp-dev:i386 libcurl4-openssl-dev:i386 libcrypto++-dev:i386 + wget https://launchpad.net/ubuntu/+archive/primary/+files/libjansson4_2.7-1ubuntu1_i386.deb + wget https://launchpad.net/ubuntu/+archive/primary/+files/libjansson-dev_2.7-1ubuntu1_i386.deb + sudo dpkg -i libjansson4_2.7-1ubuntu1_i386.deb + sudo dpkg -i libjansson-dev_2.7-1ubuntu1_i386.deb + sudo apt-get install -f + export CC=gcc-4.8 + export CXX=g++-4.8 + ;; + "windows") + sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake + ;; + *) + echo "unkown target $TARGET" + exit 1 + esac fi fi -if [[ ! -f $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz ]]; then - wget http://libsdl.org/release/SDL2-devel-${SDL2_PV}-mingw.tar.gz --output-document $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz; -fi -if [[ ! -f $cachedir/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz ]]; then - wget https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz --output-document $cachedir/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz; -fi -if [[ ! -d $cachedir/SDL2-${SDL2_PV} ]]; then - pushd $cachedir - tar -xzf SDL2-devel-${SDL2_PV}-mingw.tar.gz - popd -fi -if [[ ! -d $cachedir/SDL2_ttf-${SDL2_TTF_PV} ]]; then - pushd $cachedir - tar -xzf SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz - popd -fi -if [[ ! -f $cachedir/orctlibs.zip ]]; then - curl https://download.openrct2.website/dev/lib/mingw -o $cachedir/orctlibs.zip; -fi -if [[ ! -d $cachedir/orctlibs ]]; then - mkdir -p $cachedir/orctlibs - pushd $cachedir/orctlibs - unzip -uaq ../orctlibs.zip - popd -fi +if [[ $TARGET == "windows" ]]; then + if [[ ! -f $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz ]]; then + wget http://libsdl.org/release/SDL2-devel-${SDL2_PV}-mingw.tar.gz --output-document $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz; + fi + if [[ ! -f $cachedir/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz ]]; then + wget https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz --output-document $cachedir/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz; + fi + if [[ ! -d $cachedir/SDL2-${SDL2_PV} ]]; then + pushd $cachedir + tar -xzf SDL2-devel-${SDL2_PV}-mingw.tar.gz + popd + fi + if [[ ! -d $cachedir/SDL2_ttf-${SDL2_TTF_PV} ]]; then + pushd $cachedir + tar -xzf SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz + popd + fi + if [[ ! -f $cachedir/orctlibs.zip ]]; then + curl https://dl.dropboxusercontent.com/u/1323345/orctlibs.zip -o $cachedir/orctlibs.zip; + fi + if [[ ! -d $cachedir/orctlibs ]]; then + mkdir -p $cachedir/orctlibs + pushd $cachedir/orctlibs + unzip -uaq ../orctlibs.zip + ls -lR . + popd + fi -# Apply platform patch -mingw_patch=libsdl2-mingw-2.0.3-fix-platform-detection-for-mingw.patch -if [[ ! -f $cachedir/$mingw_patch ]]; then - wget "https://github.com/anyc/anyc-overlay/raw/master/media-libs/libsdl2-mingw/files/$mingw_patch" --output-document $cachedir/$mingw_patch; + # Apply platform patch + mingw_patch=libsdl2-mingw-2.0.3-fix-platform-detection-for-mingw.patch + if [[ ! -f $cachedir/$mingw_patch ]]; then + wget "https://github.com/anyc/anyc-overlay/raw/master/media-libs/libsdl2-mingw/files/$mingw_patch" --output-document $cachedir/$mingw_patch; - # XXX not sure how to make this idempotent. - pushd $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32/include/SDL2/ - echo "Applying patch." - patch -p2 < ../../../../$mingw_patch - popd + # XXX not sure how to make this idempotent. + pushd $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32/include/SDL2/ + echo "Applying patch." + patch -p2 < ../../../../$mingw_patch + popd + fi + + if [[ ! -d /usr/local/cross-tools ]]; then + sudo mkdir -p /usr/local/cross-tools + fi + if [[ ! -d /usr/local/cross-tools/i686-w64-mingw32 ]]; then + sudo cp -r $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32 /usr/local/cross-tools/ + sudo cp -r $cachedir/SDL2_ttf-${SDL2_TTF_PV}/i686-w64-mingw32 /usr/local/cross-tools/ + fi + if [[ ! -d /usr/local/cross-tools/orctlibs ]]; then + sudo mkdir -p /usr/local/cross-tools/orctlibs + mkdir -p lib + sudo cp -rf $cachedir/orctlibs/glob/* /usr/local/cross-tools/orctlibs/. + cp -rf $cachedir/orctlibs/local/* ./lib/. + fi + + if [[ ! -f $cachedir/i686-w64-mingw32-pkg-config ]]; then + # If this fails to work because of newlines, be sure you are running this + # script with Bash, and not sh. We should really move this to a separate + # file. + echo -e "#!/bin/sh\nexport PKG_CONFIG_PATH=/usr/local/cross-tools/i686-w64-mingw32/lib/pkgconfig:/usr/local/cross-tools/orctlibs/lib/pkgconfig\npkg-config \$@" > $cachedir/i686-w64-mingw32-pkg-config; + for i in /usr/local/cross-tools/orctlibs/lib/pkgconfig/*.pc + do + cat $i + done + fi + + chmod +x $cachedir/i686-w64-mingw32-pkg-config + sudo cp $cachedir/i686-w64-mingw32-pkg-config /usr/local/bin/ + + ls -al /usr/local/bin | grep pkg-config + cat /usr/local/bin/i686-w64-mingw32-pkg-config +# $TARGET == "windows" fi - -if [[ ! -d /usr/local/cross-tools ]]; then - sudo mkdir -p /usr/local/cross-tools -fi -if [[ ! -d /usr/local/cross-tools/i686-w64-mingw32 ]]; then - sudo cp -r $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32 /usr/local/cross-tools/ - sudo cp -r $cachedir/SDL2_ttf-${SDL2_TTF_PV}/i686-w64-mingw32 /usr/local/cross-tools/ -fi -if [[ ! -d /usr/local/cross-tools/orctlibs ]]; then - sudo mkdir -p /usr/local/cross-tools/orctlibs - mkdir -p lib - sudo cp -rf $cachedir/orctlibs/glob/* /usr/local/cross-tools/orctlibs/. - cp -rf $cachedir/orctlibs/local/* ./lib/. -fi - -if [[ ! -f $cachedir/i686-w64-mingw32-pkg-config ]]; then - # If this fails to work because of newlines, be sure you are running this - # script with Bash, and not sh. We should really move this to a separate - # file. - echo -e "#!/bin/sh\nexport PKG_CONFIG_LIBDIR=/usr/local/cross-tools/i686-w64-mingw32/lib/pkgconfig\npkg-config \$@" > $cachedir/i686-w64-mingw32-pkg-config; -fi - -set -x -dpkg -L libsdl2-dev -dpkg -L libsdl2-ttf-dev -set +x - -chmod +x $cachedir/i686-w64-mingw32-pkg-config -sudo cp $cachedir/i686-w64-mingw32-pkg-config /usr/local/bin/ - -ls -al /usr/local/bin | grep pkg-config -cat /usr/local/bin/i686-w64-mingw32-pkg-config diff --git a/src/network/http.cpp b/src/network/http.cpp index 306bde03ed..3711694acb 100644 --- a/src/network/http.cpp +++ b/src/network/http.cpp @@ -1,5 +1,6 @@ extern "C" { #include "http.h" + #include "../platform/platform.h" } #ifdef DISABLE_HTTP @@ -10,7 +11,6 @@ void http_dispose() { } #else #include -#include // cURL includes windows.h, but we don't need all of it. #define WIN32_LEAN_AND_MEAN @@ -69,8 +69,8 @@ http_json_response *http_request_json(const char *url) writeBuffer.length = 0; writeBuffer.capacity = 0; - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, TRUE); - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true); curl_easy_setopt(curl, CURLOPT_CAINFO, "curl-ca-bundle.crt"); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &writeBuffer); @@ -149,4 +149,4 @@ void http_request_json_dispose(http_json_response *response) free(response); } -#endif \ No newline at end of file +#endif diff --git a/src/network/http.h b/src/network/http.h index 57454af491..1cd567f91d 100644 --- a/src/network/http.h +++ b/src/network/http.h @@ -2,7 +2,7 @@ #define _HTTP_H_ #ifndef DISABLE_HTTP -#include +#include #include "../common.h" typedef struct { From ec1366dd299a41fefa16df4dfd0b8747125fe7ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sun, 27 Sep 2015 10:43:52 +0200 Subject: [PATCH 0737/1173] use docker for 32bit build --- .travis.yml | 2 + build.sh | 67 ++++----- dockerfiles/32bit/Dockerfile | 29 ++++ Dockerfile => dockerfiles/full/Dockerfile | 0 install.sh | 167 ++++++++++++---------- pre-build.ps1 | 2 +- 6 files changed, 161 insertions(+), 106 deletions(-) create mode 100644 dockerfiles/32bit/Dockerfile rename Dockerfile => dockerfiles/full/Dockerfile (100%) diff --git a/.travis.yml b/.travis.yml index 80d3afdb5b..e4791043cd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,6 +23,8 @@ env: - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" TARGET=windows - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" TARGET=windows - OPENRCT2_CMAKE_OPTS="-DDISABLE_HTTP_TWITCH=ON -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" TARGET=windows + - TARGET=docker32 + - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON" TARGET=docker32 sudo: required diff --git a/build.sh b/build.sh index 8a60258a87..acf81627f5 100755 --- a/build.sh +++ b/build.sh @@ -5,20 +5,24 @@ set -e cachedir=.cache mkdir -p $cachedir +# Sets default target to "linux", if none specified +TARGET=${TARGET-linux} + if [[ ! -d build ]]; then mkdir -p build fi -libversion=2 +# keep in sync with version in install.sh +libversion=3 libVFile="./libversion" libdir="./lib" currentversion=0 needsdownload="true" -if [ -f $libVFile ]; then - while read line; do - currentversion=$line - continue +if [ -f $libVFile ]; then + while read line; do + currentversion=$line + continue done < $libVFile fi @@ -27,40 +31,40 @@ if [ $currentversion -ge $libversion ]; then fi if [ ! -d $libdir ]; then - needsdownload="true" + needsdownload="true" fi - + if [[ "$needsdownload" = "true" ]]; then - echo "New libraries need to be downloaded, the script might ask you for sudo access password" - rm -rf ./lib - if [[ -f $cachedir/orctlibs.zip ]]; then - rm -rf $cachedir/orctlibs.zip - fi - if [[ -d /usr/local/cross-tools/orctlibs ]]; then - sudo rm -rf /usr/local/cross-tools/orctlibs - fi - if [[ -d $cachedir/orctlibs ]]; then - rm -rf $cachedir/orctlibs - fi - curl https://dl.dropboxusercontent.com/u/1323345/orctlibs.zip -o $cachedir/orctlibs.zip - mkdir -p $cachedir/orctlibs - pushd $cachedir/orctlibs - unzip -uaq ../orctlibs.zip - popd - sudo mkdir -p /usr/local/cross-tools/orctlibs - mkdir -p lib - sudo cp -rf $cachedir/orctlibs/glob/* /usr/local/cross-tools/orctlibs/. - cp -rf $cachedir/orctlibs/local/* ./lib/. - echo $libversion > $libVFile + echo "New libraries need to be downloaded. Clearing cache and calling ./install.sh" + rm -rf ./lib + if [[ -f $cachedir/orctlibs.zip ]]; then + rm -rf $cachedir/orctlibs.zip + fi + if [[ -d /usr/local/cross-tools/orctlibs ]]; then + sudo rm -rf /usr/local/cross-tools/orctlibs + fi + if [[ -d $cachedir/orctlibs ]]; then + rm -rf $cachedir/orctlibs + fi + ./install.sh + echo $libversion > $libVFile fi pushd build echo OPENRCT2_CMAKE_OPTS = $OPENRCT2_CMAKE_OPTS - cmake -DCMAKE_BUILD_TYPE=Debug $OPENRCT2_CMAKE_OPTS .. - make + if [[ $TARGET == "docker32" ]] + then + PARENT=`readlink -f ../` + chmod a+rwx `pwd` + chmod g+s `pwd` + docker run -u travis -v $PARENT:/work/openrct2 -w /work/openrct2/build -i -t janisozaur/openrct2:32bit-only bash -c "cmake ../ $OPENRCT2_CMAKE_OPTS && make" + else + cmake -DCMAKE_BUILD_TYPE=Debug $OPENRCT2_CMAKE_OPTS .. + make + fi popd -if [[ ! -h openrct2.dll ]]; then +if [[ ! -h openrct2.dll ]]; then ln -s build/openrct2.dll openrct2.dll fi @@ -74,4 +78,3 @@ if [[ -t 1 ]]; then else echo -e "\nDone! Run OpenRCT2 by typing:\n\nwine openrct2.exe\n" fi - diff --git a/dockerfiles/32bit/Dockerfile b/dockerfiles/32bit/Dockerfile new file mode 100644 index 0000000000..30ce06b4c4 --- /dev/null +++ b/dockerfiles/32bit/Dockerfile @@ -0,0 +1,29 @@ +FROM nfnty/arch-mini + +RUN pacman -Syyu --noconfirm +RUN pacman -S --noconfirm git curl jshon expac yajl wget unzip cmake +RUN pacman -S --noconfirm --needed base-devel + +RUN useradd -mg root travis +RUN usermod -aG wheel travis +RUN sed -i 's/# %wheel ALL=(ALL) NOPASSWD: ALL/%wheel ALL=(ALL) NOPASSWD: ALL/g' /etc/sudoers + +WORKDIR /tmp +USER travis +RUN curl -sLO https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=package-query +RUN mv PKGBUILD?h=package-query PKGBUILD +RUN makepkg +USER root +RUN pacman --noconfirm -U *.pkg.tar.xz +USER travis +RUN curl -sLO https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=yaourt +RUN mv PKGBUILD?h=yaourt PKGBUILD +RUN makepkg +USER root +RUN pacman --noconfirm -U *.pkg.tar.xz + +RUN pacman -R --noconfirm gcc +RUN yes | pacman -S gcc-libs-multilib +RUN pacman -S --noconfirm gcc-multilib +USER travis +RUN yaourt -S --noconfirm lib32-jansson lib32-curl lib32-sdl2 lib32-sdl2_ttf lib32-speex diff --git a/Dockerfile b/dockerfiles/full/Dockerfile similarity index 100% rename from Dockerfile rename to dockerfiles/full/Dockerfile diff --git a/install.sh b/install.sh index c1745a9f72..5bc150abb5 100755 --- a/install.sh +++ b/install.sh @@ -10,6 +10,85 @@ echo `uname` # Sets default target to "linux", if none specified TARGET=${TARGET-linux} +# keep in sync with version in build.sh +libversion=3 +libVFile="./libversion" + +function download_sdl { + if [[ ! -f $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz ]]; then + wget http://libsdl.org/release/SDL2-devel-${SDL2_PV}-mingw.tar.gz --output-document $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz; + fi + if [[ ! -f $cachedir/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz ]]; then + wget https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz --output-document $cachedir/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz; + fi + if [[ ! -d $cachedir/SDL2-${SDL2_PV} ]]; then + pushd $cachedir + tar -xzf SDL2-devel-${SDL2_PV}-mingw.tar.gz + popd + fi + if [[ ! -d $cachedir/SDL2_ttf-${SDL2_TTF_PV} ]]; then + pushd $cachedir + tar -xzf SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz + popd + fi + # Apply platform patch + mingw_patch=libsdl2-mingw-2.0.3-fix-platform-detection-for-mingw.patch + if [[ ! -f $cachedir/$mingw_patch ]]; then + wget "https://github.com/anyc/anyc-overlay/raw/master/media-libs/libsdl2-mingw/files/$mingw_patch" --output-document $cachedir/$mingw_patch; + + # XXX not sure how to make this idempotent. + pushd $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32/include/SDL2/ + echo "Applying patch." + patch -p2 < ../../../../$mingw_patch + popd + fi +} + +function download_libs { + if [[ ! -f $cachedir/orctlibs.zip ]]; then + curl https://dl.dropboxusercontent.com/u/1323345/orctlibs.zip -o $cachedir/orctlibs.zip; + fi + if [[ ! -d $cachedir/orctlibs ]]; then + mkdir -p $cachedir/orctlibs + pushd $cachedir/orctlibs + unzip -uaq ../orctlibs.zip + popd + fi +} + +function install_cross_tools { + if [[ ! -d /usr/local/cross-tools ]]; then + sudo mkdir -p /usr/local/cross-tools + fi + if [[ ! -d /usr/local/cross-tools/i686-w64-mingw32 ]]; then + sudo cp -r $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32 /usr/local/cross-tools/ + sudo cp -r $cachedir/SDL2_ttf-${SDL2_TTF_PV}/i686-w64-mingw32 /usr/local/cross-tools/ + fi + if [[ ! -d /usr/local/cross-tools/orctlibs ]]; then + sudo mkdir -p /usr/local/cross-tools/orctlibs + sudo cp -rf $cachedir/orctlibs/glob/* /usr/local/cross-tools/orctlibs/. + fi +} + +function install_pkg_config { + if [[ ! -f $cachedir/i686-w64-mingw32-pkg-config ]]; then + # If this fails to work because of newlines, be sure you are running this + # script with Bash, and not sh. We should really move this to a separate + # file. + echo -e "#!/bin/sh\nexport PKG_CONFIG_PATH=/usr/local/cross-tools/i686-w64-mingw32/lib/pkgconfig:/usr/local/cross-tools/orctlibs/lib/pkgconfig\npkg-config \$@" > $cachedir/i686-w64-mingw32-pkg-config; + fi + + chmod +x $cachedir/i686-w64-mingw32-pkg-config + sudo cp $cachedir/i686-w64-mingw32-pkg-config /usr/local/bin/ + + ls -al /usr/local/bin | grep pkg-config + cat /usr/local/bin/i686-w64-mingw32-pkg-config +} + +function install_local_libs { + mkdir -p lib + cp -rf $cachedir/orctlibs/local/* ./lib/. +} echo TARGET = $TARGET @@ -79,18 +158,18 @@ if [[ `uname` == "Darwin" ]]; then popd fi elif [[ `uname` == "Linux" ]]; then - if [[ ! -z "$TRAVIS" ]]; then - sudo dpkg --add-architecture i386 - fi - sudo apt-get update if [[ -z "$TRAVIS" ]]; then sudo apt-get install -y binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake if [[ -z "$DISABLE_G2_BUILD" ]]; then sudo apt-get install -y wine fi else + # prevent build.sh from re-doing all the steps again + echo $libversion > $libVFile case "$TARGET" in "linux") + sudo dpkg --add-architecture i386 + sudo apt-get update sudo apt-get install -y --force-yes cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386 gcc-4.8 pkg-config:i386 g++-4.8-multilib gcc-4.8-multilib libjansson-dev:i386 libspeex-dev:i386 libspeexdsp-dev:i386 libcurl4-openssl-dev:i386 libcrypto++-dev:i386 wget https://launchpad.net/ubuntu/+archive/primary/+files/libjansson4_2.7-1ubuntu1_i386.deb wget https://launchpad.net/ubuntu/+archive/primary/+files/libjansson-dev_2.7-1ubuntu1_i386.deb @@ -101,8 +180,12 @@ elif [[ `uname` == "Linux" ]]; then export CXX=g++-4.8 ;; "windows") + sudo apt-get update sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake ;; + "docker32") + docker pull janisozaur/openrct2:32bit-only + ;; *) echo "unkown target $TARGET" exit 1 @@ -110,75 +193,13 @@ elif [[ `uname` == "Linux" ]]; then fi fi +download_libs +# Local libs are required for all targets +install_local_libs + if [[ $TARGET == "windows" ]]; then - if [[ ! -f $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz ]]; then - wget http://libsdl.org/release/SDL2-devel-${SDL2_PV}-mingw.tar.gz --output-document $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz; - fi - if [[ ! -f $cachedir/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz ]]; then - wget https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz --output-document $cachedir/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz; - fi - if [[ ! -d $cachedir/SDL2-${SDL2_PV} ]]; then - pushd $cachedir - tar -xzf SDL2-devel-${SDL2_PV}-mingw.tar.gz - popd - fi - if [[ ! -d $cachedir/SDL2_ttf-${SDL2_TTF_PV} ]]; then - pushd $cachedir - tar -xzf SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz - popd - fi - if [[ ! -f $cachedir/orctlibs.zip ]]; then - curl https://dl.dropboxusercontent.com/u/1323345/orctlibs.zip -o $cachedir/orctlibs.zip; - fi - if [[ ! -d $cachedir/orctlibs ]]; then - mkdir -p $cachedir/orctlibs - pushd $cachedir/orctlibs - unzip -uaq ../orctlibs.zip - ls -lR . - popd - fi - - # Apply platform patch - mingw_patch=libsdl2-mingw-2.0.3-fix-platform-detection-for-mingw.patch - if [[ ! -f $cachedir/$mingw_patch ]]; then - wget "https://github.com/anyc/anyc-overlay/raw/master/media-libs/libsdl2-mingw/files/$mingw_patch" --output-document $cachedir/$mingw_patch; - - # XXX not sure how to make this idempotent. - pushd $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32/include/SDL2/ - echo "Applying patch." - patch -p2 < ../../../../$mingw_patch - popd - fi - - if [[ ! -d /usr/local/cross-tools ]]; then - sudo mkdir -p /usr/local/cross-tools - fi - if [[ ! -d /usr/local/cross-tools/i686-w64-mingw32 ]]; then - sudo cp -r $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32 /usr/local/cross-tools/ - sudo cp -r $cachedir/SDL2_ttf-${SDL2_TTF_PV}/i686-w64-mingw32 /usr/local/cross-tools/ - fi - if [[ ! -d /usr/local/cross-tools/orctlibs ]]; then - sudo mkdir -p /usr/local/cross-tools/orctlibs - mkdir -p lib - sudo cp -rf $cachedir/orctlibs/glob/* /usr/local/cross-tools/orctlibs/. - cp -rf $cachedir/orctlibs/local/* ./lib/. - fi - - if [[ ! -f $cachedir/i686-w64-mingw32-pkg-config ]]; then - # If this fails to work because of newlines, be sure you are running this - # script with Bash, and not sh. We should really move this to a separate - # file. - echo -e "#!/bin/sh\nexport PKG_CONFIG_PATH=/usr/local/cross-tools/i686-w64-mingw32/lib/pkgconfig:/usr/local/cross-tools/orctlibs/lib/pkgconfig\npkg-config \$@" > $cachedir/i686-w64-mingw32-pkg-config; - for i in /usr/local/cross-tools/orctlibs/lib/pkgconfig/*.pc - do - cat $i - done - fi - - chmod +x $cachedir/i686-w64-mingw32-pkg-config - sudo cp $cachedir/i686-w64-mingw32-pkg-config /usr/local/bin/ - - ls -al /usr/local/bin | grep pkg-config - cat /usr/local/bin/i686-w64-mingw32-pkg-config + download_sdl + install_cross_tools + install_pkg_config # $TARGET == "windows" fi diff --git a/pre-build.ps1 b/pre-build.ps1 index 3c7f56ce94..959028d5fe 100644 --- a/pre-build.ps1 +++ b/pre-build.ps1 @@ -1,5 +1,5 @@ #init -$libversion = 2 +$libversion = 3 $path = Split-Path $Script:MyInvocation.MyCommand.Path $zip = $path+'\orctlibs.zip' $libs = $path+'\lib' From da2f2827d158607c53617e16fe02dac4bd6a848b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Mon, 28 Sep 2015 22:33:28 +0200 Subject: [PATCH 0738/1173] Update VS library file The only change done here was to move jansson.h one level up --- pre-build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pre-build.ps1 b/pre-build.ps1 index 959028d5fe..d198153e9d 100644 --- a/pre-build.ps1 +++ b/pre-build.ps1 @@ -23,7 +23,7 @@ if (!$libsTest -or $needsdownload) { rm $libs -Recurse -Force } mkdir $libs - Invoke-WebRequest https://download.openrct2.website/dev/lib/vs -OutFile $path\orctlibs.zip + Invoke-WebRequest https://dl.dropboxusercontent.com/u/1323345/orctlibs_vs.zip -OutFile $path\orctlibs.zip [System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') > $null [System.IO.Compression.ZipFile]::ExtractToDirectory($zip, $libs) rm $path\orctlibs.zip -Force -ErrorAction SilentlyContinue From 11bbf7c19ee91ed9eb735da20c3b573e60f04eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Mon, 28 Sep 2015 22:42:28 +0200 Subject: [PATCH 0739/1173] Use openrct.net mirror for the files --- install.sh | 3 ++- pre-build.ps1 | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/install.sh b/install.sh index 5bc150abb5..2a841af795 100755 --- a/install.sh +++ b/install.sh @@ -4,6 +4,7 @@ SDL2_PV=2.0.3 SDL2_TTF_PV=2.0.12 cachedir=.cache +liburl=https://openrct.net/launcher/libs/orctlibs.zip mkdir -p $cachedir echo `uname` @@ -46,7 +47,7 @@ function download_sdl { function download_libs { if [[ ! -f $cachedir/orctlibs.zip ]]; then - curl https://dl.dropboxusercontent.com/u/1323345/orctlibs.zip -o $cachedir/orctlibs.zip; + curl $liburl -o $cachedir/orctlibs.zip; fi if [[ ! -d $cachedir/orctlibs ]]; then mkdir -p $cachedir/orctlibs diff --git a/pre-build.ps1 b/pre-build.ps1 index d198153e9d..539e65755f 100644 --- a/pre-build.ps1 +++ b/pre-build.ps1 @@ -4,6 +4,7 @@ $path = Split-Path $Script:MyInvocation.MyCommand.Path $zip = $path+'\orctlibs.zip' $libs = $path+'\lib' $libsVFile = $path+'\libversion' +$liburl = 'https://openrct.net/launcher/libs/orctlibs_vs.zip' $libsTest = Test-Path $libs #libs version test @@ -23,7 +24,7 @@ if (!$libsTest -or $needsdownload) { rm $libs -Recurse -Force } mkdir $libs - Invoke-WebRequest https://dl.dropboxusercontent.com/u/1323345/orctlibs_vs.zip -OutFile $path\orctlibs.zip + Invoke-WebRequest $liburl -OutFile $path\orctlibs.zip [System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') > $null [System.IO.Compression.ZipFile]::ExtractToDirectory($zip, $libs) rm $path\orctlibs.zip -Force -ErrorAction SilentlyContinue From abb0acde413e9c15b5b57c452037204d9525c2a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Mon, 28 Sep 2015 23:15:10 +0200 Subject: [PATCH 0740/1173] sha256 versioning of library zip --- build.sh | 6 +++--- install.sh | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/build.sh b/build.sh index acf81627f5..378ddf7dd6 100755 --- a/build.sh +++ b/build.sh @@ -13,7 +13,7 @@ if [[ ! -d build ]]; then fi # keep in sync with version in install.sh -libversion=3 +sha256sum=0a7b5ea46e9cb4b19000b69690eae0b75929752f7db192c78bd7ffb61d696835 libVFile="./libversion" libdir="./lib" currentversion=0 @@ -26,7 +26,7 @@ if [ -f $libVFile ]; then done < $libVFile fi -if [ $currentversion -ge $libversion ]; then +if [ "z$currentversion" == "z$sha256sum" ]; then needsdownload="false" fi @@ -35,6 +35,7 @@ if [ ! -d $libdir ]; then fi if [[ "$needsdownload" = "true" ]]; then + echo "Found library had sha256sum $currentversion, expected $sha256sum" echo "New libraries need to be downloaded. Clearing cache and calling ./install.sh" rm -rf ./lib if [[ -f $cachedir/orctlibs.zip ]]; then @@ -47,7 +48,6 @@ if [[ "$needsdownload" = "true" ]]; then rm -rf $cachedir/orctlibs fi ./install.sh - echo $libversion > $libVFile fi pushd build diff --git a/install.sh b/install.sh index 2a841af795..90e20fc449 100755 --- a/install.sh +++ b/install.sh @@ -166,7 +166,6 @@ elif [[ `uname` == "Linux" ]]; then fi else # prevent build.sh from re-doing all the steps again - echo $libversion > $libVFile case "$TARGET" in "linux") sudo dpkg --add-architecture i386 @@ -195,6 +194,9 @@ elif [[ `uname` == "Linux" ]]; then fi download_libs +# mind the gap (trailing space) +sha256sum $cachedir/orctlibs.zip | cut -f1 -d\ > $libVFile +echo "Downloaded library with sha256sum: $(cat $libVFile)" # Local libs are required for all targets install_local_libs From 9e621985464718327eb21637f8041eecacc7bd8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 29 Sep 2015 00:01:51 +0200 Subject: [PATCH 0741/1173] Partially revert c93c1c7, for mingw builds only Conditionally restore old functionality which got broken for mingw builds with commit c93c1c7. Allow building with old version of code, but generate a warning when doing so. --- CMakeLists.txt | 6 +++++- src/network/network.cpp | 22 +++++++++++++++++++- src/network/network.h | 46 ++++++++++++++++++++++++++--------------- 3 files changed, 55 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 019c29e6a7..d919fe4d5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,6 +44,10 @@ endif (DISABLE_HTTP_TWITCH) option(DISABLE_NETWORK "Disable multiplayer functionality. Mainly for testing.") if (DISABLE_NETWORK) add_definitions(-DDISABLE_NETWORK) +else (DISABLE_NETWORK) + if (WIN32) + SET(NETWORKLIBS ${NETWORKLIBS} ws2_32) + endif (WIN32) endif (DISABLE_NETWORK) # include lib @@ -80,4 +84,4 @@ endif (WIN32) # libopenrct2.dll -> openrct2.dll set_target_properties(${PROJECT} PROPERTIES PREFIX "") -TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB} ${JANSSON_LIBRARIES} ${HTTPLIBS}) +TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB} ${JANSSON_LIBRARIES} ${HTTPLIBS} ${NETWORKLIBS}) diff --git a/src/network/network.cpp b/src/network/network.cpp index 18b4497fd9..f72fb0c4b1 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -337,16 +337,20 @@ bool Network::BeginClient(const char* host, unsigned short port) return false; } + sockaddr_in server_address; +#ifdef USE_INET_PTON char address[64]; if (!network_get_address(address, sizeof(address), host)) { log_error("Unable to resolve hostname."); return false; } - sockaddr_in server_address; if (inet_pton(AF_INET, address, &server_address.sin_addr) != 1) { return false; } +#else + server_address.sin_addr.S_un.S_addr = inet_addr(network_getAddress((char *)host)); +#endif // USE_INET_PTON server_address.sin_family = AF_INET; server_address.sin_port = htons(port); @@ -1093,6 +1097,7 @@ void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 } } +#ifdef USE_INET_PTON static bool network_get_address(char *dst, size_t dstLength, const char *host) { struct addrinfo *remoteHost; @@ -1112,6 +1117,21 @@ static bool network_get_address(char *dst, size_t dstLength, const char *host) // No IPv4 addresses found for host name return false; } +#else +static char *network_getAddress(char *host) +{ + struct hostent *remoteHost; + struct in_addr addr; + remoteHost = gethostbyname(host); + if (remoteHost != NULL && remoteHost->h_addrtype == AF_INET && remoteHost->h_addr_list[0] != 0) { + addr.s_addr = *(u_long *)remoteHost->h_addr_list[0]; + return inet_ntoa(addr); + } + + return host; +} +#endif // USE_INET_PTON + #else int network_get_mode() { return NETWORK_MODE_NONE; } diff --git a/src/network/network.h b/src/network/network.h index 04f99d8aba..9f86bb5bf1 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -44,24 +44,32 @@ extern "C" { #ifndef DISABLE_NETWORK -#ifdef _WIN32 -#include -#include -#define LAST_SOCKET_ERROR() WSAGetLastError() -#undef EWOULDBLOCK -#define EWOULDBLOCK WSAEWOULDBLOCK +#ifndef __MINGW32__ +#define USE_INET_PTON #else -#include -#include -#include -#include -#include -typedef int SOCKET; -#define SOCKET_ERROR -1 -#define INVALID_SOCKET -1 -#define LAST_SOCKET_ERROR() errno -#define closesocket close -#define ioctlsocket ioctl +#warning using deprecated network functions in lieu of inet_pton, inet_ntop +#endif // __MINGW32__ + +#ifdef _WIN32 + #include + #ifdef USE_INET_PTON + #include + #endif + #define LAST_SOCKET_ERROR() WSAGetLastError() + #undef EWOULDBLOCK + #define EWOULDBLOCK WSAEWOULDBLOCK +#else + #include + #include + #include + #include + #include + typedef int SOCKET; + #define SOCKET_ERROR -1 + #define INVALID_SOCKET -1 + #define LAST_SOCKET_ERROR() errno + #define closesocket close + #define ioctlsocket ioctl #endif // _WIN32 enum { @@ -264,7 +272,11 @@ void network_send_chat(const char* text); void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback); void network_print_error(); +#ifdef USE_INET_PTON static bool network_get_address(char *dst, size_t dstLength, const char *host); +#else +static char *network_getAddress(char *host); +#endif // USE_INET_PTON #ifdef __cplusplus } From d6631e182b6e79de34c50f3de42cd747f4622fc4 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 29 Sep 2015 04:00:16 +0100 Subject: [PATCH 0742/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_simplified.txt | 2 +- data/language/finnish.txt | 2 +- data/language/french.txt | 2 +- data/language/korean.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/language/chinese_simplified.txt b/data/language/chinese_simplified.txt index 9cddf0fca4..c30edc924a 100644 --- a/data/language/chinese_simplified.txt +++ b/data/language/chinese_simplified.txt @@ -3506,7 +3506,7 @@ STR_5156 :{SMALLFONT}{BLACK}Allows testing of most ride types even when the t STR_5157 :Unlock all prices STR_5158 :Quit to menu STR_5159 :Exit OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, Year {COMMA16} +STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, Year {POP16}{COMMA16} STR_5161 :Date Format: STR_5162 :Day/Month/Year STR_5163 :Month/Day/Year diff --git a/data/language/finnish.txt b/data/language/finnish.txt index 2ebde6de53..c64f54be08 100644 --- a/data/language/finnish.txt +++ b/data/language/finnish.txt @@ -3498,7 +3498,7 @@ STR_5156 :{SMALLFONT}{BLACK}Allows testing of most ride types even when the t STR_5157 :Unlock all prices STR_5158 :Lopeta valikkoon STR_5159 :Lopeta OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, vuosi {COMMA16} +STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, vuosi {POP16}{COMMA16} STR_5161 :Päiväyksen tyyli: STR_5162 :Päivä/Kuukausi/Vuosi STR_5163 :Kuukausi/Päivä/Vuosi diff --git a/data/language/french.txt b/data/language/french.txt index 7ce56c595b..35d6087c29 100644 --- a/data/language/french.txt +++ b/data/language/french.txt @@ -3497,7 +3497,7 @@ STR_5156 :{SMALLFONT}{BLACK}Allows testing of most ride types even when the t STR_5157 :Unlock all prices STR_5158 :Quit to menu STR_5159 :Quitter OpenRCT2 -STR_5160 :{MONTH} {STRINGID}, an {COMMA16} +STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, an {POP16}{COMMA16} STR_5161 :Date Format: STR_5162 :Day/Month/Year STR_5163 :Month/Day/Year diff --git a/data/language/korean.txt b/data/language/korean.txt index 0d6646e520..3c76121c85 100644 --- a/data/language/korean.txt +++ b/data/language/korean.txt @@ -3496,7 +3496,7 @@ STR_5156 :{SMALLFONT}{BLACK}대부분의 놀이기구 종류에서 트랙이 STR_5157 :모든 가격 잠금 해제 STR_5158 :종료하고 메뉴로 STR_5159 :OpenRCT2 종료 -STR_5160 :{COMMA16}년 {MONTH} {STRINGID} +STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, {POP16}{COMMA16}년 STR_5161 :날짜 형식: STR_5162 :일/월/년 STR_5163 :년/월/일 From 89846a088ab898d05d7edf8388d64ed4bb0a8bc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 29 Sep 2015 23:35:15 +0200 Subject: [PATCH 0743/1173] platform time functions --- src/platform/linux.c | 26 ++++++++++++++++++++++++++ src/platform/platform.h | 15 +++++++++++++++ src/platform/windows.c | 22 ++++++++++++++++++++++ src/rct2.c | 30 ++++++++++-------------------- 4 files changed, 73 insertions(+), 20 deletions(-) diff --git a/src/platform/linux.c b/src/platform/linux.c index 055d6c01b8..32832d3c33 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -33,6 +33,7 @@ #include "../config.h" #include "platform.h" #include +#include // The name of the mutex used to prevent multiple instances of the game from running #define SINGLE_INSTANCE_MUTEX_NAME "RollerCoaster Tycoon 2_GSKMUTEX" @@ -57,6 +58,31 @@ int main(int argc, const char **argv) return gExitCode; } +void platform_get_date(rct2_date *out_date) +{ + assert(out_date != NULL); + time_t rawtime; + struct tm * timeinfo; + time(&rawtime); + timeinfo = gmtime(&rawtime); + out_date->day = timeinfo->tm_mday; + out_date->month = timeinfo->tm_mon; + out_date->year = timeinfo->tm_year; + out_date->day_of_week = timeinfo->tm_wday; +} + +void platform_get_time(rct2_time *out_time) +{ + assert(out_time != NULL); + time_t rawtime; + struct tm * timeinfo; + time(&rawtime); + timeinfo = gmtime(&rawtime); + out_time->second = timeinfo->tm_sec; + out_time->minute = timeinfo->tm_min; + out_time->hour = timeinfo->tm_hour; +} + char platform_get_path_separator() { return '/'; diff --git a/src/platform/platform.h b/src/platform/platform.h index a894264f77..545cac11cd 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -45,6 +45,19 @@ typedef struct { uint64 last_modified; } file_info; +typedef struct { + sint16 day; + sint16 month; + sint16 year; + sint16 day_of_week; +} rct2_date; + +typedef struct { + sint16 hour; + sint16 minute; + sint16 second; +} rct2_time; + typedef struct { int x, y; unsigned char left, middle, right, any; @@ -91,6 +104,8 @@ void platform_process_messages(); int platform_scancode_to_rct_keycode(int sdl_key); void platform_start_text_input(utf8 *buffer, int max_length); void platform_stop_text_input(); +void platform_get_date(rct2_date *out_date); +void platform_get_time(rct2_time *out_time); // Platform specific definitions char platform_get_path_separator(); diff --git a/src/platform/windows.c b/src/platform/windows.c index 63aa03fb16..dc0469392f 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -85,6 +85,28 @@ __declspec(dllexport) int StartOpenRCT(HINSTANCE hInstance, HINSTANCE hPrevInsta return gExitCode; } +void platform_get_date(rct2_date *out_date) +{ + assert(out_date != NULL); + SYSTEMTIME systime; + + GetSystemTime(&systime); + out_date->day = systime.wDay; + out_date->month = systime.wMonth; + out_date->year = systime.wYear; + out_date->day_of_week = systime.wDayOfWeek; +} + +void platform_get_time(rct2_time *out_time) +{ + assert(out_time != NULL); + SYSTEMTIME systime; + GetLocalTime(&systime); + out_time->hour = systime.wHour; + out_time->minute = systime.wMinute; + out_time->second = systime.wSecond; +} + char platform_get_path_separator() { return '\\'; diff --git a/src/rct2.c b/src/rct2.c index 8c071ea771..be90027f05 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -530,17 +530,12 @@ void get_system_info() */ void get_system_time() { -#ifdef _WIN32 - SYSTEMTIME systime; - - GetSystemTime(&systime); - RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_DAY, sint16) = systime.wDay; - RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_MONTH, sint16) = systime.wMonth; - RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_YEAR, sint16) = systime.wYear; - RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_DAYOFWEEK, sint16) = systime.wDayOfWeek; -#else - STUB(); -#endif // _WIN32 + rct2_date date; + platform_get_date(&date); + RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_DAY, sint16) = date.day; + RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_MONTH, sint16) = date.month; + RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_YEAR, sint16) = date.year; + RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_DAYOFWEEK, sint16) = date.day_of_week; } /** @@ -549,15 +544,10 @@ void get_system_time() */ void get_local_time() { -#ifdef _WIN32 - SYSTEMTIME systime; - GetLocalTime(&systime); - - RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_HOUR, sint16) = systime.wHour; - RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_MINUTE, sint16) = systime.wMinute; -#else - STUB(); -#endif // _WIN32 + rct2_time t; + platform_get_time(&t); + RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_HOUR, sint16) = t.hour; + RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_MINUTE, sint16) = t.minute; } /** From 50e484145a6dd77ef388675b30d8f1863ea3a24d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 29 Sep 2015 23:45:13 +0200 Subject: [PATCH 0744/1173] Don't install recommended packages on travis Old: 15 upgraded, 255 newly installed, 16 to remove and 82 not upgraded. Need to get 62.7 MB of archives. After this operation, 267 MB of additional disk space will be used. New: 14 upgraded, 252 newly installed, 13 to remove and 83 not upgraded. Need to get 61.1 MB of archives. After this operation, 258 MB of additional disk space will be used. The difference may look small, but when you see the list of affected packages, you will notice that java installer is now skipped, which shaves quite a big chunk of time wasted. Skipped packages: * libsasl2-modules * libtxc-dxtn-s2tc0 * libx11-doc * oracle-java8-installer --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 90e20fc449..2315509266 100755 --- a/install.sh +++ b/install.sh @@ -170,7 +170,7 @@ elif [[ `uname` == "Linux" ]]; then "linux") sudo dpkg --add-architecture i386 sudo apt-get update - sudo apt-get install -y --force-yes cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386 gcc-4.8 pkg-config:i386 g++-4.8-multilib gcc-4.8-multilib libjansson-dev:i386 libspeex-dev:i386 libspeexdsp-dev:i386 libcurl4-openssl-dev:i386 libcrypto++-dev:i386 + sudo apt-get install --no-install-recommends -y --force-yes cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386 gcc-4.8 pkg-config:i386 g++-4.8-multilib gcc-4.8-multilib libjansson-dev:i386 libspeex-dev:i386 libspeexdsp-dev:i386 libcurl4-openssl-dev:i386 libcrypto++-dev:i386 wget https://launchpad.net/ubuntu/+archive/primary/+files/libjansson4_2.7-1ubuntu1_i386.deb wget https://launchpad.net/ubuntu/+archive/primary/+files/libjansson-dev_2.7-1ubuntu1_i386.deb sudo dpkg -i libjansson4_2.7-1ubuntu1_i386.deb From ecc2f74b63677a17d1e33da747d526053dfcb8dc Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 29 Sep 2015 23:07:07 +0100 Subject: [PATCH 0745/1173] Implement game command footpath from track. Fixes #1954 --- src/game.c | 4 +- src/game.h | 2 +- src/ride/track.c | 2 +- src/world/footpath.c | 106 +++++++++++++++++++++++++++++++++++++++++++ src/world/footpath.h | 1 + 5 files changed, 111 insertions(+), 4 deletions(-) diff --git a/src/game.c b/src/game.c index 788100d360..ac213d6455 100644 --- a/src/game.c +++ b/src/game.c @@ -1127,7 +1127,7 @@ static uint32 game_do_command_table[58] = { 0, 0, 0, - 0x006A68AE, + 0, 0, 0, // use new_game_command_table, original: 0x00663CCD, // 20 0,//0x006B53E9, @@ -1190,7 +1190,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_place_scenery, game_command_set_water_height, game_command_place_footpath, - game_command_emptysub, + game_command_place_footpath_from_track, game_command_remove_footpath, game_command_change_surface_style, // 20 game_command_set_ride_price, diff --git a/src/game.h b/src/game.h index 1713c641f1..6817ab3e8d 100644 --- a/src/game.h +++ b/src/game.h @@ -44,7 +44,7 @@ enum GAME_COMMAND { GAME_COMMAND_PLACE_SCENERY, GAME_COMMAND_SET_WATER_HEIGHT, GAME_COMMAND_PLACE_PATH, - GAME_COMMAND_18, + GAME_COMMAND_PLACE_PATH_FROM_TRACK, GAME_COMMAND_REMOVE_PATH, GAME_COMMAND_CHANGE_SURFACE_STYLE, GAME_COMMAND_SET_RIDE_PRICE, diff --git a/src/ride/track.c b/src/ride/track.c index fa40c4ed7b..99b4f19ca3 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1297,7 +1297,7 @@ int track_place_scenery(rct_track_scenery* scenery_start, uint8 rideIndex, int o if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0; RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; - cost = game_do_command(mapCoord.x, bl | (bh << 8), mapCoord.y, z | (entry_index << 8), GAME_COMMAND_18, 0, 0); + cost = game_do_command(mapCoord.x, bl | (bh << 8), mapCoord.y, z | (entry_index << 8), GAME_COMMAND_PLACE_PATH_FROM_TRACK, 0, 0); } else{ if (RCT2_GLOBAL(0x00F440D4, uint8) == 1) diff --git a/src/world/footpath.c b/src/world/footpath.c index a46b074fa2..ac0422851d 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -416,6 +416,112 @@ void game_command_place_footpath(int *eax, int *ebx, int *ecx, int *edx, int *es ); } +static money32 footpath_place_from_track(int type, int x, int y, int z, int slope, int edges, int flags) +{ + rct_map_element *mapElement; + + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z * 8; + + if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; + return MONEY32_UNDEFINED; + } + + if (flags & GAME_COMMAND_FLAG_APPLY) + footpath_interrupt_peeps(x, y, z * 8); + + RCT2_GLOBAL(0x00F3EFD9, money32) = 0; + RCT2_GLOBAL(0x00F3EFA4, uint8) = 0; + + if (!map_is_location_owned(x, y, z * 8) && !gCheatsSandboxMode) { + return MONEY32_UNDEFINED; + } + + if (!((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || gCheatsSandboxMode) && !map_is_location_owned(x, y, z * 8)) + return MONEY32_UNDEFINED; + + if (z < 2) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_LOW; + return MONEY32_UNDEFINED; + } + + if (z > 248) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_HIGH; + return MONEY32_UNDEFINED; + } + + if (flags & GAME_COMMAND_FLAG_APPLY) { + if (!(flags & (GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_GHOST))) { + footpath_remove_litter(x, y, z * 8); + } + } + + RCT2_GLOBAL(0x00F3EFD9, money32) += 120; + uint8 bl = 15; + int zHigh = z + 4; + if (slope & 4) { + bl = RCT2_ADDRESS(0x0098D7EC, uint8)[slope & 3]; + zHigh += 2; + } + + RCT2_GLOBAL(0x00F3EF84, uint16) = x; + RCT2_GLOBAL(0x00F3EF86, uint16) = y; + + // Ugh, hack until 0x006A6733 is written + // 0x006A6733 expects the flags to be at (*0xF3EF7C) + 8 + RCT2_GLOBAL(0x00F3EF7C, uint32) = (uint32)(&flags - 2); + + if (!gCheatsDisableClearanceChecks && !map_can_construct_with_clear_at(x, y, z, zHigh, (void*)0x006A6733, bl)) + return MONEY32_UNDEFINED; + + RCT2_GLOBAL(0x00F3EFA4, uint8) = RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8); + if (!gCheatsDisableClearanceChecks && (RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & ELEMENT_IS_UNDERWATER)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CANT_BUILD_THIS_UNDERWATER; + return MONEY32_UNDEFINED; + } + + mapElement = map_get_surface_element_at((x / 32), (y / 32)); + + int supportHeight = z - mapElement->base_height; + RCT2_GLOBAL(0x00F3EFD9, money32) += supportHeight < 0 ? MONEY(20, 00) : (supportHeight / 2) * MONEY(5, 00); + + if (flags & GAME_COMMAND_FLAG_APPLY) { + mapElement = map_element_insert(x / 32, y / 32, z, 0x0F); + mapElement->type = MAP_ELEMENT_TYPE_PATH; + mapElement->clearance_height = z + 4 + (slope & 4 ? 2 : 0); + mapElement->properties.path.type = (type << 4) | (slope & 7); + mapElement->type |= type >> 7; + mapElement->properties.path.additions = 0; + mapElement->properties.path.addition_status = 255; + mapElement->properties.path.edges = edges & 0xF; + mapElement->flags &= ~MAP_ELEMENT_FLAG_BROKEN; + if (flags & (1 << 6)) + mapElement->flags |= MAP_ELEMENT_FLAG_GHOST; + + map_invalidate_tile_full(x, y); + } + return RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY ? 0 : RCT2_GLOBAL(0x00F3EFD9, money32); +} + +/* + * rct2: 0x006A68AE + */ +void game_command_place_footpath_from_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) +{ + *ebx = footpath_place_from_track( + (*edx >> 8) & 0xFF, + *eax & 0xFFFF, + *ecx & 0xFFFF, + *edx & 0xFF, + ((*ebx >> 13) & 0x3) | ((*ebx >> 10) & 0x4), + (*ebx >> 8) & 0xF, + *ebx & 0xFF + ); +} + /** * * rct2: 0x006A67C0 diff --git a/src/world/footpath.h b/src/world/footpath.h index 450c8a38fc..eb54b96584 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -50,6 +50,7 @@ extern const rct_xy16 word_981D6C[4]; money32 footpath_remove_real(int x, int y, int z, int flags); void game_command_place_footpath(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +void game_command_place_footpath_from_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_remove_footpath(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); money32 footpath_place(int type, int x, int y, int z, int slope, int flags); void footpath_remove(int x, int y, int z, int flags); From b5711638bc066f809767c8e17346213f5b4c39a4 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Wed, 30 Sep 2015 21:55:36 +0100 Subject: [PATCH 0746/1173] Implement game_command_set_peep_name Note this is how most of the existing cheats are used --- src/game.c | 8 +-- src/peep/peep.c | 181 +++++++++++++++++++++++++++++++++++++++++++++++- src/peep/peep.h | 13 ++-- 3 files changed, 191 insertions(+), 11 deletions(-) diff --git a/src/game.c b/src/game.c index ac213d6455..2b62532aa8 100644 --- a/src/game.c +++ b/src/game.c @@ -1129,9 +1129,9 @@ static uint32 game_do_command_table[58] = { 0, 0, 0, - 0, // use new_game_command_table, original: 0x00663CCD, // 20 - 0,//0x006B53E9, - 0x00698D6C, // text input + 0, // 20 + 0, + 0, 0, 0, 0x0068BC01, @@ -1194,7 +1194,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_remove_footpath, game_command_change_surface_style, // 20 game_command_set_ride_price, - game_command_emptysub, + game_command_set_peep_name, game_command_raise_land, game_command_lower_land, game_command_emptysub, diff --git a/src/peep/peep.c b/src/peep/peep.c index 2ac50005c0..c6f1081a98 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -36,6 +36,7 @@ #include "../world/scenery.h" #include "../world/footpath.h" #include "../management/marketing.h" +#include "../game.h" #include "peep.h" #include "staff.h" @@ -7741,7 +7742,7 @@ static void peep_on_exit_ride(rct_peep *peep, int rideIndex) } } - if (peep->flags & PEEP_FLAGS_26) { + if (peep->flags & PEEP_FLAGS_NICE_RIDE) { peep_insert_new_thought(peep, PEEP_THOUGHT_NICE_RIDE, 255); } @@ -8078,7 +8079,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) if (!(bp & 4)) { ride_update_popularity(ride, 1); - if ((peep->flags & PEEP_FLAGS_27) && ride_type_is_intamin(ride->type)) { + if ((peep->flags & PEEP_FLAGS_INTAMIN) && ride_type_is_intamin(ride->type)) { peep_insert_new_thought(peep, PEEP_THOUGHT_EXCITED, 255); } } @@ -8530,3 +8531,179 @@ static bool peep_heading_for_ride_or_park_exit(rct_peep *peep) { return (peep->flags & PEEP_FLAGS_LEAVING_PARK) || peep->guest_heading_to_ride_id != 0xFF; } + +money32 set_peep_name(int flags, int state, uint16 sprite_index, uint8* text_1, uint8* text_2, uint8* text_3) { + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; + if (state == 1) { + RCT2_GLOBAL(0x00F1AEF4, uint16) = sprite_index; + } + + uint8* fullText = RCT2_ADDRESS(0x00F1AEF6, uint8); + if (flags & GAME_COMMAND_FLAG_APPLY) { + uint8 position = (state - 1) % 3; + memcpy(fullText + position * 12, text_1, 4); + memcpy(fullText + 4 + position * 12, text_2, 4); + memcpy(fullText + 8 + position * 12, text_3, 4); + } + + if (state != 0) + return 0; + + rct_peep* peep = GET_PEEP(sprite_index); + RCT2_GLOBAL(0x0013CE952, uint32) = peep->id; + uint8* curName = RCT2_ADDRESS(0x00141ED68, uint8); + rct_string_id curId = peep->name_string_idx; + format_string(curName, curId, RCT2_ADDRESS(0x0013CE952, void)); + + if (strcmp(curName, fullText) == 0) + return 0; + + if (*fullText == '\0') { + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 1455; + return MONEY32_UNDEFINED; + } + + rct_string_id newId = user_string_allocate(4, fullText); + if (newId == 0) { + return MONEY32_UNDEFINED; + } + + if (!(flags & GAME_COMMAND_FLAG_APPLY)) { + user_string_free(newId); + return 0; + } + + user_string_free(curId); + peep->name_string_idx = newId; + + peep_update_name_sort(peep); + + peep->flags &= ~PEEP_FLAGS_WAVING; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_KATIE_BRAYSHAW, peep)) { + peep->flags |= PEEP_FLAGS_WAVING; + } + + peep->flags &= ~PEEP_FLAGS_PHOTO; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_CHRIS_SAWYER, peep)) { + peep->flags |= PEEP_FLAGS_PHOTO; + } + + peep->flags &= ~PEEP_FLAGS_PAINTING; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_SIMON_FOSTER, peep)) { + peep->flags |= PEEP_FLAGS_PAINTING; + } + + peep->flags &= ~PEEP_FLAGS_WOW; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_JOHN_WARDLEY, peep)) { + peep->flags |= PEEP_FLAGS_WOW; + } + + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_MELANIE_WARN, peep)) { + peep->happiness = 250; + peep->happiness_growth_rate = 250; + peep->energy = 127; + peep->energy_growth_rate = 127; + peep->nausea = 0; + peep->nausea_growth_rate = 0; + } + + peep->flags &= ~PEEP_FLAGS_LITTER; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_LISA_STIRLING, peep)) { + peep->flags |= PEEP_FLAGS_LITTER; + } + + peep->flags &= ~PEEP_FLAGS_LOST; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_DONALD_MACRAE, peep)) { + peep->flags |= PEEP_FLAGS_LOST; + } + + peep->flags &= ~PEEP_FLAGS_HUNGER; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_KATHERINE_MCGOWAN, peep)) { + peep->flags |= PEEP_FLAGS_HUNGER; + } + + peep->flags &= ~PEEP_FLAGS_BATHROOM; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_FRANCES_MCGOWAN, peep)) { + peep->flags |= PEEP_FLAGS_BATHROOM; + } + + peep->flags &= ~PEEP_FLAGS_CROWDED; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_CORINA_MASSOURA, peep)) { + peep->flags |= PEEP_FLAGS_CROWDED; + } + + peep->flags &= ~PEEP_FLAGS_HAPPINESS; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_CAROL_YOUNG, peep)) { + peep->flags |= PEEP_FLAGS_HAPPINESS; + } + + peep->flags &= ~PEEP_FLAGS_NAUSEA; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_MIA_SHERIDAN, peep)) { + peep->flags |= PEEP_FLAGS_NAUSEA; + } + + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_KATIE_RODGER, peep)) { + peep->flags |= PEEP_FLAGS_LEAVING_PARK; + peep->flags &= ~PEEP_FLAGS_PARK_ENTRANCE_CHOSEN; + } + + peep->flags &= ~PEEP_FLAGS_16; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_EMMA_GARRELL, peep)) { + peep->flags |= PEEP_FLAGS_16; + } + + peep->flags &= ~PEEP_FLAGS_EATING; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_JOANNE_BARTON, peep)) { + peep->flags |= PEEP_FLAGS_EATING; + } + + peep->flags &= ~PEEP_FLAGS_22; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_FELICITY_ANDERSON, peep)) { + peep->flags |= PEEP_FLAGS_22; + } + + peep->flags &= ~PEEP_FLAGS_JOY; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_KATIE_SMITH, peep)) { + peep->flags |= PEEP_FLAGS_JOY; + } + + peep->flags &= ~PEEP_FLAGS_ANGRY; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_EILIDH_BELL, peep)) { + peep->flags |= PEEP_FLAGS_ANGRY; + } + + peep->flags &= ~PEEP_FLAGS_ICE_CREAM; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_NANCY_STILLWAGON, peep)) { + peep->flags |= PEEP_FLAGS_ICE_CREAM; + } + + peep->flags &= ~PEEP_FLAGS_NICE_RIDE; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_ANDY_HINE, peep)) { + peep->flags |= PEEP_FLAGS_NICE_RIDE; + } + + peep->flags &= ~PEEP_FLAGS_INTAMIN; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_ELISSA_WHITE, peep)) { + peep->flags |= PEEP_FLAGS_INTAMIN; + } + + peep->flags &= ~PEEP_FLAGS_HERE_WE_ARE; + if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_DAVID_ELLIS, peep)) { + peep->flags |= PEEP_FLAGS_HERE_WE_ARE; + } + + gfx_invalidate_screen(); + return 0; +} + +/* rct2: 0x00698D6C */ +void game_command_set_peep_name(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) { + *ebx = set_peep_name( + *ebx & 0xFF, + *eax & 0xFFFF, + *ecx & 0xFFFF, + (uint8*)edx, + (uint8*)ebp, + (uint8*)edi + ); +} \ No newline at end of file diff --git a/src/peep/peep.h b/src/peep/peep.h index 7ceba2fad6..a5142c74f0 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -264,18 +264,19 @@ enum PEEP_FLAGS { PEEP_FLAGS_CROWDED = (1 << 13), // The peep will start feeling crowded PEEP_FLAGS_HAPPINESS = (1 << 14), // The peep will start increasing happiness PEEP_FLAGS_NAUSEA = (1 << 15), // Makes the peep feel sick (e.g. after an extreme ride) - + PEEP_FLAGS_16 = (1 << 16), PEEP_FLAGS_EATING = (1 << 17), // Reduces hunger PEEP_FLAGS_EXPLODE = (1 << 18), PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE = (1 << 19), PEEP_FLAGS_PARK_ENTRANCE_CHOSEN = (1 << 20), //Set when the nearest park entrance has been chosen PEEP_FLAGS_21 = (1 << 21), - + PEEP_FLAGS_22 = (1 << 22), PEEP_FLAGS_JOY = (1 << 23), // Makes the peep jump in joy PEEP_FLAGS_ANGRY = (1 << 24), - PEEP_FLAGS_ICE_CREAM = (1 << 25), // Unconfirmed - PEEP_FLAGS_26 = (1 << 26), - PEEP_FLAGS_27 = (1 << 27), + PEEP_FLAGS_ICE_CREAM = (1 << 25), // Gives the peeps infront of them in queue ice cream + PEEP_FLAGS_NICE_RIDE = (1 << 26), // Makes the peep think "Nice ride! But not as good as the Phoenix..." on exiting a ride + PEEP_FLAGS_INTAMIN = (1 << 27), // Makes the peep think "I'm so excited - It's an Intamin ride!" while riding on a Intamin + PEEP_FLAGS_HERE_WE_ARE = (1 << 28), // Makes the peep think "...and here we are on X!" while riding a ride PEEP_FLAGS_TWITCH = (1 << 31) // Added for twitch integration }; @@ -628,4 +629,6 @@ void sub_693BE5(rct_peep* peep, uint8 al); void peep_update_name_sort(rct_peep *peep); void peep_update_names(bool realNames); +void game_command_set_peep_name(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); + #endif From f40ccc883a7090ca2f6c551125cd3ca2dbffb8ec Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Wed, 30 Sep 2015 22:01:44 +0100 Subject: [PATCH 0747/1173] Name remaining peep cheat flag enums --- src/peep/peep.c | 8 ++++---- src/peep/peep.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index c6f1081a98..749c118c4e 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -8647,9 +8647,9 @@ money32 set_peep_name(int flags, int state, uint16 sprite_index, uint8* text_1, peep->flags &= ~PEEP_FLAGS_PARK_ENTRANCE_CHOSEN; } - peep->flags &= ~PEEP_FLAGS_16; + peep->flags &= ~PEEP_FLAGS_PURPLE; if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_EMMA_GARRELL, peep)) { - peep->flags |= PEEP_FLAGS_16; + peep->flags |= PEEP_FLAGS_PURPLE; } peep->flags &= ~PEEP_FLAGS_EATING; @@ -8657,9 +8657,9 @@ money32 set_peep_name(int flags, int state, uint16 sprite_index, uint8* text_1, peep->flags |= PEEP_FLAGS_EATING; } - peep->flags &= ~PEEP_FLAGS_22; + peep->flags &= ~PEEP_FLAGS_CONTAGIOUS; if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_FELICITY_ANDERSON, peep)) { - peep->flags |= PEEP_FLAGS_22; + peep->flags |= PEEP_FLAGS_CONTAGIOUS; } peep->flags &= ~PEEP_FLAGS_JOY; diff --git a/src/peep/peep.h b/src/peep/peep.h index a5142c74f0..dcaa8b12d3 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -264,13 +264,13 @@ enum PEEP_FLAGS { PEEP_FLAGS_CROWDED = (1 << 13), // The peep will start feeling crowded PEEP_FLAGS_HAPPINESS = (1 << 14), // The peep will start increasing happiness PEEP_FLAGS_NAUSEA = (1 << 15), // Makes the peep feel sick (e.g. after an extreme ride) - PEEP_FLAGS_16 = (1 << 16), + PEEP_FLAGS_PURPLE = (1 << 16), // Makes surrounding peeps purple PEEP_FLAGS_EATING = (1 << 17), // Reduces hunger PEEP_FLAGS_EXPLODE = (1 << 18), PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE = (1 << 19), PEEP_FLAGS_PARK_ENTRANCE_CHOSEN = (1 << 20), //Set when the nearest park entrance has been chosen PEEP_FLAGS_21 = (1 << 21), - PEEP_FLAGS_22 = (1 << 22), + PEEP_FLAGS_CONTAGIOUS = (1 << 22), // Makes any peeps in surrounding tiles sick PEEP_FLAGS_JOY = (1 << 23), // Makes the peep jump in joy PEEP_FLAGS_ANGRY = (1 << 24), PEEP_FLAGS_ICE_CREAM = (1 << 25), // Gives the peeps infront of them in queue ice cream From ca298d5568550a61ecc028f9299a5a402061030b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 1 Oct 2015 17:05:31 +0200 Subject: [PATCH 0748/1173] Remove leftover porting hack --- src/object_list.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/object_list.c b/src/object_list.c index cccd9b3592..3700aa7825 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -355,11 +355,6 @@ static int object_list_cache_load(int totalFiles, uint64 totalFileSize, int file rct_plugin_header pluginHeader; uint32 filterVersion = 0; -#ifndef _WIN32 - // TODO: remove me! - log_error("this is to be removed after testing/implementation is done"); - return 0; -#endif log_verbose("loading object list cache (plugin.dat)"); get_plugin_path(path); From df52bb5ca1399988284848991ef46c1d00d0030c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 1 Oct 2015 18:48:48 +0200 Subject: [PATCH 0749/1173] Add hooks for Linux --- src/hook.c | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/src/hook.c b/src/hook.c index 0471ad3037..be83f39dc3 100644 --- a/src/hook.c +++ b/src/hook.c @@ -8,18 +8,20 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ #ifdef _WIN32 -#include + #include +#else + #include #endif // _WIN32 #include "hook.h" #include "platform/platform.h" @@ -28,7 +30,6 @@ void* g_hooktableaddress = 0; int g_hooktableoffset = 0; int g_maxhooks = 1000; -#ifdef _WIN32 void hookfunc(int address, int newaddress, int stacksize, int registerargs[], int registersreturned, int eaxDestinationRegister) { int i = 0; @@ -96,7 +97,7 @@ void hookfunc(int address, int newaddress, int stacksize, int registerargs[], in data[i++] = 0x00; data[i++] = 0x00; data[i++] = 0x00; - + int sizec = i; data[i++] = 0x8B; // push eax, [esp] - puts eip in eax @@ -140,7 +141,7 @@ void hookfunc(int address, int newaddress, int stacksize, int registerargs[], in if (!(registersreturned & EDI)) { data[i++] = 0x57; // push edi } - + data[i++] = 0x83; // sub esp, x data[i++] = 0xEC; data[i++] = 4 + (stacksize * 4) + rargssize; @@ -210,18 +211,31 @@ void hookfunc(int address, int newaddress, int stacksize, int registerargs[], in if (!(registersreturned & EAX)) { data[i++] = 0x58; // pop eax } - + data[i++] = 0xC3; // retn +#ifdef _WIN32 WriteProcessMemory(GetCurrentProcess(), (LPVOID)address, data, i, 0); -} +#else + // We own the pages with PROT_WRITE | PROT_EXEC, we can simply just memcpy the data + memcpy((void *)address, data, i); #endif // _WIN32 +} void addhook(int address, int newaddress, int stacksize, int registerargs[], int registersreturned, int eaxDestinationRegister) { -#ifdef _WIN32 if (!g_hooktableaddress) { - g_hooktableaddress = VirtualAllocEx(GetCurrentProcess(), NULL, g_maxhooks * 100, MEM_COMMIT, PAGE_EXECUTE_READWRITE); + size_t size = g_maxhooks * 100; +#ifdef _WIN32 + g_hooktableaddress = VirtualAllocEx(GetCurrentProcess(), NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); +#else + g_hooktableaddress = mmap(NULL, size, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (g_hooktableaddress == MAP_FAILED) + { + perror("mmap"); + exit(1); + } +#endif // _WIN32 } if (g_hooktableoffset > g_maxhooks) { return; @@ -232,10 +246,12 @@ void addhook(int address, int newaddress, int stacksize, int registerargs[], int data[i++] = 0xE9; // jmp *((int *)&data[i]) = hookaddress - address - i - 4; i += 4; data[i++] = 0xC3; // retn +#ifdef _WIN32 WriteProcessMemory(GetCurrentProcess(), (LPVOID)address, data, i, 0); +#else + // We own the pages with PROT_WRITE | PROT_EXEC, we can simply just memcpy the data + memcpy((void *)address, data, i); +#endif // _WIN32 hookfunc(hookaddress, newaddress, stacksize, registerargs, registersreturned, eaxDestinationRegister); g_hooktableoffset++; -#else - STUB(); -#endif // _WIN32 } From 9a1e88872f91c66540e4f51f3996d9fcbf4b9138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 1 Oct 2015 18:57:45 +0200 Subject: [PATCH 0750/1173] sub_6E7FF3 no longer causes problems --- src/interface/viewport.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 5ec11bf5a4..11175a52d6 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -271,11 +271,7 @@ void sub_689174(sint16* x, sint16* y, sint16 *z) void sub_6E7FF3(rct_window *w, rct_viewport *viewport, int x, int y) { -#ifdef _WIN32 RCT2_CALLPROC_X(0x006E7FF3, 0, 0, 0, x, (int)viewport, (int)w, y); -#else - STUB(); -#endif // _WIN32 // int zoom = 1 << viewport->zoom; // if (w >= RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*)){ From 33e04b8bd66ab153404c4e0c9eee2611b936b2c8 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Thu, 1 Oct 2015 21:24:24 +0100 Subject: [PATCH 0751/1173] Implement game_command_place_park_entrance --- src/game.c | 4 +- src/world/map.c | 161 +++++++++++++++++++++++++++++++++++++++++++++++ src/world/map.h | 1 + src/world/park.h | 1 + 4 files changed, 165 insertions(+), 2 deletions(-) diff --git a/src/game.c b/src/game.c index 2b62532aa8..f6c65942d6 100644 --- a/src/game.c +++ b/src/game.c @@ -1145,7 +1145,7 @@ static uint32 game_do_command_table[58] = { 0, 0, 0,//0x006649BD, //buy_land_rights - 0x006666E7, + 0, 0, 0x006CD8CE, 0, @@ -1208,7 +1208,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_set_park_name, game_command_set_park_open, game_command_buy_land_rights, //game_command_emptysub,//game_command_buy_land_rights, - game_command_emptysub, + game_command_place_park_entrance, game_command_remove_park_entrance, game_command_emptysub, game_command_set_park_entrance_fee, diff --git a/src/world/map.c b/src/world/map.c index a2b4e1376e..f066163018 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -4181,3 +4181,164 @@ void map_clear_all_elements() } } } + +money32 place_park_entrance(int flags, sint16 x, sint16 y, sint16 z, uint8 direction) { + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LAND_PURCHASE * 4; + + RCT2_GLOBAL(0x009DEA5E, sint16) = x; + RCT2_GLOBAL(0x009DEA60, sint16) = y; + // ?? + RCT2_GLOBAL(0x009DEA62, sint16) = (z & 0xFF) << 4; + + if (!sub_68B044()) { + return MONEY32_UNDEFINED; + } + + if (x <= 32 || y <= 32 || x >= (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16) - 32) || y >= (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16) - 32)) { + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 3215; + return MONEY32_UNDEFINED; + } + + sint8 entranceNum = -1; + for (uint8 i = 0; i < 4; ++i) { + if (RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[i] == (sint16)0x8000) { + entranceNum = i; + break; + } + } + + if (entranceNum == -1) { + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 3227; + return MONEY32_UNDEFINED; + } + + if (flags & GAME_COMMAND_FLAG_APPLY) { + RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[entranceNum] = x; + RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, sint16)[entranceNum] = y; + RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Z, sint16)[entranceNum] = (z & 0xFF) << 4; + RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_DIRECTION, uint8)[entranceNum] = direction; + } + + sint16 zLow = (z & 0xFF) * 2; + sint16 zHigh = zLow + 12; + if (!map_can_construct_at(x, y, zLow, zHigh, 0xF)) { + return MONEY32_UNDEFINED; + } + + if (flags & GAME_COMMAND_FLAG_APPLY) { + + if (!(flags & GAME_COMMAND_FLAG_GHOST)) { + rct_map_element* surfaceElement = map_get_surface_element_at(x / 32, y / 32); + surfaceElement->properties.surface.ownership = 0; + } + + rct_map_element* newElement = map_element_insert(x / 32, y / 32, zLow, 0xF); + newElement->clearance_height = zHigh; + + if (flags & GAME_COMMAND_FLAG_GHOST) { + newElement->flags |= MAP_ELEMENT_FLAG_GHOST; + } + + newElement->type = MAP_ELEMENT_TYPE_ENTRANCE; + newElement->type |= direction; + newElement->properties.entrance.index = 0; + newElement->properties.entrance.type = ENTRANCE_TYPE_PARK_ENTRANCE; + newElement->properties.entrance.path_type = RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_PATH_ID, uint16) & 0xFF; + + if (!(flags & GAME_COMMAND_FLAG_GHOST)) { + footpath_connect_edges(x, y, newElement, 1); + } + + update_park_fences(x, y); + update_park_fences(x - 32, y); + update_park_fences(x + 32, y); + update_park_fences(x, y - 32); + update_park_fences(x, y + 32); + + map_invalidate_tile(x, y, newElement->base_height, newElement->clearance_height); + + map_animation_create(MAP_ANIMATION_TYPE_PARK_ENTRANCE, x, y, zLow); + } + + x += TileDirectionDelta[(direction - 1) & 0x3].x; + y += TileDirectionDelta[(direction - 1) & 0x3].y; + + if (!map_can_construct_at(x, y, zLow, zHigh, 0xF)) { + return MONEY32_UNDEFINED; + } + + if (flags & GAME_COMMAND_FLAG_APPLY) { + + if (!(flags & GAME_COMMAND_FLAG_GHOST)) { + rct_map_element* surfaceElement = map_get_surface_element_at(x / 32, y / 32); + surfaceElement->properties.surface.ownership = 0; + } + + rct_map_element* newElement = map_element_insert(x / 32, y / 32, zLow, 0xF); + newElement->clearance_height = zHigh; + + if (flags & GAME_COMMAND_FLAG_GHOST) { + newElement->flags |= MAP_ELEMENT_FLAG_GHOST; + } + + newElement->type = MAP_ELEMENT_TYPE_ENTRANCE; + newElement->type |= direction; + newElement->properties.entrance.index = 1; + newElement->properties.entrance.type = ENTRANCE_TYPE_PARK_ENTRANCE; + + update_park_fences(x, y); + update_park_fences(x - 32, y); + update_park_fences(x + 32, y); + update_park_fences(x, y - 32); + update_park_fences(x, y + 32); + + map_invalidate_tile(x, y, newElement->base_height, newElement->clearance_height); + } + + x += TileDirectionDelta[(direction + 1) & 0x3].x * 2; + y += TileDirectionDelta[(direction + 1) & 0x3].y * 2; + + if (!map_can_construct_at(x, y, zLow, zHigh, 0xF)) { + return MONEY32_UNDEFINED; + } + + if (flags & GAME_COMMAND_FLAG_APPLY) { + + if (!(flags & GAME_COMMAND_FLAG_GHOST)) { + rct_map_element* surfaceElement = map_get_surface_element_at(x / 32, y / 32); + surfaceElement->properties.surface.ownership = 0; + } + + rct_map_element* newElement = map_element_insert(x / 32, y / 32, zLow, 0xF); + newElement->clearance_height = zHigh; + + if (flags & GAME_COMMAND_FLAG_GHOST) { + newElement->flags |= MAP_ELEMENT_FLAG_GHOST; + } + + newElement->type = MAP_ELEMENT_TYPE_ENTRANCE; + newElement->type |= direction; + newElement->properties.entrance.index = 2; + newElement->properties.entrance.type = ENTRANCE_TYPE_PARK_ENTRANCE; + + update_park_fences(x, y); + update_park_fences(x - 32, y); + update_park_fences(x + 32, y); + update_park_fences(x, y - 32); + update_park_fences(x, y + 32); + + map_invalidate_tile(x, y, newElement->base_height, newElement->clearance_height); + } + + return 0; +} + +/* rct2: 0x006666E7 */ +void game_command_place_park_entrance(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { + *ebx = place_park_entrance( + *ebx & 0xFF, + *eax & 0xFFFF, + *ecx & 0xFFFF, + *edx & 0xFFFF, + (*ebx >> 8) & 0xFF); +} \ No newline at end of file diff --git a/src/world/map.h b/src/world/map.h index ac774809a2..4f5625990a 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -330,6 +330,7 @@ void game_command_place_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi, void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); +void game_command_place_park_entrance(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); #define GET_MAP_ELEMENT(x) (&(RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS, rct_map_element)[x])) #define TILE_MAP_ELEMENT_POINTER(x) (RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*)[x]) diff --git a/src/world/park.h b/src/world/park.h index c9125dbaec..349bf96c6c 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -66,6 +66,7 @@ void generate_new_guest(); void park_update(); void park_update_histories(); +void update_park_fences(int x, int y); uint8 calculate_guest_initial_happiness(uint8 percentage); From 5d75fa4464439f33862c29b2bcd8269fa7ed57ea Mon Sep 17 00:00:00 2001 From: Rune Laenen Date: Fri, 2 Oct 2015 13:41:13 +0200 Subject: [PATCH 0752/1173] var_2A to outside_of_park --- src/management/award.c | 16 ++++++++-------- src/peep/peep.c | 30 +++++++++++++++--------------- src/peep/peep.h | 2 +- src/peep/staff.c | 2 +- src/windows/guest_list.c | 10 +++++----- src/world/park.c | 2 +- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/management/award.c b/src/management/award.c index d2ec346818..5bbb728899 100644 --- a/src/management/award.c +++ b/src/management/award.c @@ -76,7 +76,7 @@ static int award_is_deserved_most_untidy(int awardType, int activeAwardTypes) negativeCount = 0; FOR_ALL_GUESTS(spriteIndex, peep) { - if (peep->var_2A != 0) + if (peep->outside_of_park != 0) continue; if (peep->thoughts[0].var_2 > 5) @@ -109,7 +109,7 @@ static int award_is_deserved_most_tidy(int awardType, int activeAwardTypes) positiveCount = 0; negativeCount = 0; FOR_ALL_GUESTS(spriteIndex, peep) { - if (peep->var_2A != 0) + if (peep->outside_of_park != 0) continue; if (peep->thoughts[0].var_2 > 5) @@ -183,7 +183,7 @@ static int award_is_deserved_most_beautiful(int awardType, int activeAwardTypes) positiveCount = 0; negativeCount = 0; FOR_ALL_GUESTS(spriteIndex, peep) { - if (peep->var_2A != 0) + if (peep->outside_of_park != 0) continue; if (peep->thoughts[0].var_2 > 5) @@ -227,7 +227,7 @@ static int award_is_deserved_safest(int awardType, int activeAwardTypes) peepsWhoDislikeVandalism = 0; FOR_ALL_GUESTS(spriteIndex, peep) { - if (peep->var_2A != 0) + if (peep->outside_of_park != 0) continue; if (peep->thoughts[0].var_2 <= 5 && peep->thoughts[0].type == PEEP_THOUGHT_TYPE_VANDALISM) peepsWhoDislikeVandalism++; @@ -307,7 +307,7 @@ static int award_is_deserved_best_food(int awardType, int activeAwardTypes) // Count hungry peeps hungryPeeps = 0; FOR_ALL_GUESTS(spriteIndex, peep) { - if (peep->var_2A != 0) + if (peep->outside_of_park != 0) continue; if (peep->thoughts[0].var_2 <= 5 && peep->thoughts[0].type == PEEP_THOUGHT_TYPE_HUNGRY) @@ -353,7 +353,7 @@ static int award_is_deserved_worst_food(int awardType, int activeAwardTypes) // Count hungry peeps hungryPeeps = 0; FOR_ALL_GUESTS(spriteIndex, peep) { - if (peep->var_2A != 0) + if (peep->outside_of_park != 0) continue; if (peep->thoughts[0].var_2 <= 5 && peep->thoughts[0].type == PEEP_THOUGHT_TYPE_HUNGRY) @@ -388,7 +388,7 @@ static int award_is_deserved_best_restrooms(int awardType, int activeAwardTypes) // Count number of guests who are thinking they need the restroom guestsWhoNeedRestroom = 0; FOR_ALL_GUESTS(spriteIndex, peep) { - if (peep->var_2A != 0) + if (peep->outside_of_park != 0) continue; if (peep->thoughts[0].var_2 <= 5 && peep->thoughts[0].type == PEEP_THOUGHT_TYPE_BATHROOM) @@ -517,7 +517,7 @@ static int award_is_deserved_most_confusing_layout(int awardType, int activeAwar peepsCounted = 0; peepsLost = 0; FOR_ALL_GUESTS(spriteIndex, peep) { - if (peep->var_2A != 0) + if (peep->outside_of_park != 0) continue; peepsCounted++; diff --git a/src/peep/peep.c b/src/peep/peep.c index 749c118c4e..313fa81b24 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -305,7 +305,7 @@ static void sub_68F8CD(rct_peep *peep) peep->thirst--; } - if (peep->var_2A != 0) { + if (peep->outside_of_park != 0) { return; } @@ -460,7 +460,7 @@ static void sub_68F41A(rct_peep *peep, int index) } if (peep->state == PEEP_STATE_WALKING && - peep->var_2A == 0 && + peep->outside_of_park == 0 && !(peep->flags & PEEP_FLAGS_LEAVING_PARK) && peep->no_of_rides == 0 && peep->guest_heading_to_ride_id == 0xFF){ @@ -486,7 +486,7 @@ static void sub_68F41A(rct_peep *peep, int index) if ((index & 0x3FF) == (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x3FF)){ - if (peep->var_2A == 0 && + if (peep->outside_of_park == 0 && (peep->state == PEEP_STATE_WALKING || peep->state == PEEP_STATE_SITTING)){ uint8 num_thoughts = 0; @@ -1265,7 +1265,7 @@ void peep_sprite_remove(rct_peep* peep){ */ void peep_remove(rct_peep* peep){ if (peep->type == PEEP_TYPE_GUEST){ - if (peep->var_2A == 0){ + if (peep->outside_of_park == 0){ RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16)--; RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint16) |= BTM_TB_DIRTY_FLAG_PEEP_COUNT; } @@ -3630,7 +3630,7 @@ static void peep_update_leaving_park(rct_peep* peep){ return; } - peep->var_2A = 1; + peep->outside_of_park = 1; peep->destination_tolerence = 5; RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16)--; RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint16) |= BTM_TB_DIRTY_FLAG_PEEP_COUNT; @@ -3750,7 +3750,7 @@ static void peep_update_entering_park(rct_peep* peep){ peep->state = PEEP_STATE_FALLING; peep_window_state_update(peep); - peep->var_2A = 0; + peep->outside_of_park = 0; peep->time_in_park = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32); RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16)++; RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16)--; @@ -5024,7 +5024,7 @@ void peep_problem_warnings_update() RCT2_GLOBAL(RCT2_ADDRESS_RIDE_COUNT, sint16) = ride_get_count(); // refactor this to somewhere else FOR_ALL_GUESTS(spriteIndex, peep) { - if (peep->var_2A != 0 || peep->thoughts[0].var_2 > 5) + if (peep->outside_of_park != 0 || peep->thoughts[0].var_2 > 5) continue; switch (peep->thoughts[0].type) { @@ -5232,7 +5232,7 @@ void peep_applause() rct_peep* peep; FOR_ALL_GUESTS(spriteIndex, peep) { - if (peep->var_2A != 0) + if (peep->outside_of_park != 0) continue; // Release balloon @@ -5269,7 +5269,7 @@ void peep_update_days_in_queue() rct_peep *peep; FOR_ALL_GUESTS(sprite_index, peep) { - if (peep->var_2A == 0 && peep->state == PEEP_STATE_QUEUING) { + if (peep->outside_of_park == 0 && peep->state == PEEP_STATE_QUEUING) { if (peep->days_in_queue < 255) { peep->days_in_queue += 1; } @@ -5292,7 +5292,7 @@ rct_peep *peep_generate(int x, int y, int z) peep->sprite_identifier = 1; peep->sprite_type = PEEP_SPRITE_TYPE_NORMAL; - peep->var_2A = 1; + peep->outside_of_park = 1; peep->state = PEEP_STATE_FALLING; peep->action = PEEP_ACTION_NONE_2; peep->var_6D = 0; @@ -6426,11 +6426,11 @@ static int peep_interact_with_path(rct_peep* peep, sint16 x, sint16 y, rct_map_e sint16 z = map_element->base_height * 8; if (!map_is_location_owned(x, y, z)){ - if (peep->var_2A == 0) + if (peep->outside_of_park == 0) return peep_return_to_center_of_tile(peep); } else{ - if (peep->var_2A == 1) + if (peep->outside_of_park == 1) return peep_return_to_center_of_tile(peep); } @@ -7214,7 +7214,7 @@ static int guest_path_finding(rct_peep* peep) } uint8 edges = path_get_permitted_edges(mapElement); - if (peep->var_2A == 0 && peep_heading_for_ride_or_park_exit(peep)) { + if (peep->outside_of_park == 0 && peep_heading_for_ride_or_park_exit(peep)) { uint8 adjustedEdges = edges; for (int chosenDirection = 0; chosenDirection < 4; chosenDirection++) { // If there is no path in that direction try another @@ -7249,7 +7249,7 @@ static int guest_path_finding(rct_peep* peep) } // loc_694F19: - if (peep->var_2A != 0){ + if (peep->outside_of_park != 0){ switch (peep->state) { case PEEP_STATE_ENTERING_PARK: return guest_path_find_entering_park(peep, mapElement, edges); @@ -7423,7 +7423,7 @@ static int sub_693C9E(rct_peep *peep) } if (x < 32 || y < 32 || x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) || y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16)){ - if (peep->var_2A == 1){ + if (peep->outside_of_park == 1){ RCT2_GLOBAL(0x00F1EE18, uint16) |= (1 << 1); } return peep_return_to_center_of_tile(peep); diff --git a/src/peep/peep.h b/src/peep/peep.h index dcaa8b12d3..b270f3c456 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -402,7 +402,7 @@ typedef struct { uint16 next_y; // 0x26 uint8 next_z; // 0x28 uint8 next_var_29; // 0x29 - uint8 var_2A; + uint8 outside_of_park; uint8 state; // 0x2B uint8 sub_state; // 0x2C uint8 sprite_type; // 0x2D diff --git a/src/peep/staff.c b/src/peep/staff.c index 270d6c5e62..71cf4d2da5 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -135,7 +135,7 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, newPeep->action_sprite_type = 0; newPeep->var_C4 = 0; newPeep->type = PEEP_TYPE_STAFF; - newPeep->var_2A = 0; + newpeep->outside_of_park = 0; newPeep->flags = 0; newPeep->paid_to_enter = 0; newPeep->paid_on_rides = 0; diff --git a/src/windows/guest_list.c b/src/windows/guest_list.c index 63cb9d2a97..6a42012c46 100644 --- a/src/windows/guest_list.c +++ b/src/windows/guest_list.c @@ -428,7 +428,7 @@ static void window_guest_list_scrollgetsize(rct_window *w, int scrollIndex, int numGuests = 0; FOR_ALL_GUESTS(spriteIndex, peep) { - if (peep->var_2A != 0) + if (peep->outside_of_park != 0) continue; if (_window_guest_list_selected_filter != -1) if (window_guest_list_is_peep_in_filter(peep)) @@ -487,7 +487,7 @@ static void window_guest_list_scrollmousedown(rct_window *w, int scrollIndex, in i = y / 10; i += _window_guest_list_selected_page * 3173; FOR_ALL_GUESTS(spriteIndex, peep) { - if (peep->var_2A != 0) + if (peep->outside_of_park != 0) continue; if (_window_guest_list_selected_filter != -1) if (window_guest_list_is_peep_in_filter(peep)) @@ -653,7 +653,7 @@ static void window_guest_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, // For each guest FOR_ALL_GUESTS(spriteIndex, peep) { peep->var_0C &= ~0x200; - if (peep->var_2A != 0) + if (peep->outside_of_park != 0) continue; if (_window_guest_list_selected_filter != -1) { if (window_guest_list_is_peep_in_filter(peep)) @@ -837,12 +837,12 @@ static void window_guest_list_find_groups() // Set all guests to unassigned FOR_ALL_GUESTS(spriteIndex, peep) - if (peep->var_2A == 0) + if (peep->outside_of_park == 0) peep->var_0C |= (1 << 8); // For each guest / group FOR_ALL_GUESTS(spriteIndex, peep) { - if (peep->var_2A != 0 || !(peep->var_0C & (1 << 8))) + if (peep->outside_of_park != 0 || !(peep->var_0C & (1 << 8))) continue; // New group, cap at 240 though diff --git a/src/world/park.c b/src/world/park.c index 27f3fb5cfd..00f51de222 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -187,7 +187,7 @@ int calculate_park_rating() num_happy_peeps = 0; _bp = 0; FOR_ALL_GUESTS(spriteIndex, peep) { - if (peep->var_2A != 0) + if (peep->outside_of_park != 0) continue; if (peep->happiness > 128) num_happy_peeps++; From 1b5e55d346af8194ba11f6c8072fc5e0490587cb Mon Sep 17 00:00:00 2001 From: Rune Laenen Date: Fri, 2 Oct 2015 13:45:17 +0200 Subject: [PATCH 0753/1173] newPeep fix --- src/peep/staff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/peep/staff.c b/src/peep/staff.c index 71cf4d2da5..2edcd7e1f5 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -135,7 +135,7 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, newPeep->action_sprite_type = 0; newPeep->var_C4 = 0; newPeep->type = PEEP_TYPE_STAFF; - newpeep->outside_of_park = 0; + newPeep->outside_of_park = 0; newPeep->flags = 0; newPeep->paid_to_enter = 0; newPeep->paid_on_rides = 0; From 7ac930c3180d89dfa5893e033b4d767f207f09fc Mon Sep 17 00:00:00 2001 From: Rune Laenen Date: Fri, 2 Oct 2015 13:49:13 +0200 Subject: [PATCH 0754/1173] errorfix guest_list --- src/windows/guest_list.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/guest_list.c b/src/windows/guest_list.c index 6a42012c46..3f3bd0cd2f 100644 --- a/src/windows/guest_list.c +++ b/src/windows/guest_list.c @@ -865,7 +865,7 @@ static void window_guest_list_find_groups() // Find more peeps that belong to same group FOR_ALL_GUESTS(spriteIndex2, peep2) { - if (peep2->var_2A != 0 || !(peep2->var_0C & (1 << 8))) + if (peep2->outside_of_park != 0 || !(peep2->var_0C & (1 << 8))) continue; uint32 argument1, argument2; From 00949686c2b98cefd4f1836cc375c9fd6043793b Mon Sep 17 00:00:00 2001 From: JarnoVgr Date: Fri, 2 Oct 2015 14:04:42 +0200 Subject: [PATCH 0755/1173] Improved support for VS version selector Version selector defaulted to VS2013 (12.0) instead of VS2015 (14.0). --- projects/openrct2.sln | 4 ++-- projects/openrct2.vcxproj | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/openrct2.sln b/projects/openrct2.sln index 67248e41b4..500b31b2fe 100644 --- a/projects/openrct2.sln +++ b/projects/openrct2.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 +# Visual Studio 2015 +VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openrct2", "openrct2.vcxproj", "{D24D94F6-2A74-480C-B512-629C306CE92F}" ProjectSection(ProjectDependencies) = postProject diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 68fe45712f..001832c924 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -1,5 +1,5 @@  - + From 7934e2efd2153ea1ff1f8fc1043f2168456fc1df Mon Sep 17 00:00:00 2001 From: Rune Laenen Date: Fri, 2 Oct 2015 14:16:02 +0200 Subject: [PATCH 0756/1173] Fix issue 1942 --- src/scenario.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/scenario.c b/src/scenario.c index 45723c4425..c22be884a0 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -245,6 +245,8 @@ int scenario_load_and_play_from_path(const char *path) } _scenarioFileName = path_get_filename(_scenarioPath); + gFirstTimeSave = 1; + log_verbose("starting scenario, %s", path); scenario_begin(); From 5793ded4234b3d482d4ea75b84af2875856b9f3a Mon Sep 17 00:00:00 2001 From: zsilencer Date: Thu, 1 Oct 2015 17:08:14 -0600 Subject: [PATCH 0757/1173] mouse drag in linux --- src/platform/linux.c | 26 -------------------------- src/platform/shared.c | 25 +++++++++++++++++++++++++ src/platform/windows.c | 33 --------------------------------- 3 files changed, 25 insertions(+), 59 deletions(-) diff --git a/src/platform/linux.c b/src/platform/linux.c index 32832d3c33..cb8b405004 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -531,32 +531,6 @@ bool platform_file_delete(const utf8 *path) return 0; } -void platform_hide_cursor() -{ - STUB(); -} - -void platform_show_cursor() -{ - STUB(); -} - -void platform_get_cursor_position(int *x, int *y) -{ - STUB(); -} - -void platform_set_cursor_position(int x, int y) -{ - STUB(); -} - -unsigned int platform_get_ticks() -{ - STUB(); - return 100; -} - wchar_t *regular_to_wchar(const char* src) { int len = strnlen(src, MAX_PATH); diff --git a/src/platform/shared.c b/src/platform/shared.c index 3bb73a91ff..fa8ffcbbf2 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -907,3 +907,28 @@ static void platform_refresh_screenbuffer(int width, int height, int pitch) RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, uint32) = (width >> 6) + 1; RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_ROWS, uint32) = (height >> 3) + 1; } + +void platform_hide_cursor() +{ + SDL_ShowCursor(SDL_DISABLE); +} + +void platform_show_cursor() +{ + SDL_ShowCursor(SDL_ENABLE); +} + +void platform_get_cursor_position(int *x, int *y) +{ + SDL_GetMouseState(x, y); +} + +void platform_set_cursor_position(int x, int y) +{ + SDL_WarpMouseInWindow(NULL, x, y); +} + +unsigned int platform_get_ticks() +{ + return SDL_GetTicks(); +} \ No newline at end of file diff --git a/src/platform/windows.c b/src/platform/windows.c index dc0469392f..653bef75ba 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -378,39 +378,6 @@ bool platform_file_delete(const utf8 *path) return success == TRUE; } -void platform_hide_cursor() -{ - ShowCursor(FALSE); -} - -void platform_show_cursor() -{ - ShowCursor(TRUE); -} - -void platform_get_cursor_position(int *x, int *y) -{ - POINT point; - - if (GetCursorPos(&point)) { - *x = point.x; - *y = point.y; - } else { - *x = INT32_MIN; - *y = INT32_MIN; - } -} - -void platform_set_cursor_position(int x, int y) -{ - SetCursorPos(x, y); -} - -unsigned int platform_get_ticks() -{ - return GetTickCount(); -} - void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) { wchar_t wOutPath[MAX_PATH]; From 8a5d9bf614b39c4dcb521f00a84babedc07b8b52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 2 Oct 2015 21:18:08 +0200 Subject: [PATCH 0758/1173] Platform name --- src/cmdline.c | 4 +--- src/rct2.h | 10 +++++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/cmdline.c b/src/cmdline.c index 70c5a48996..a5619c103e 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -90,9 +90,7 @@ int cmdline_run(const char **argv, int argc) argc = argparse_parse(&argparse, argc, argv); if (version) { - printf("%s v%s\n", OPENRCT2_NAME, OPENRCT2_VERSION); - printf("%s (%s)\n", OPENRCT2_PLATFORM, OPENRCT2_ARCHITECTURE); - printf("%s\n", OPENRCT2_TIMESTAMP); + print_launch_information(); return 0; } diff --git a/src/rct2.h b/src/rct2.h index 669a2ec026..cb18b19375 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -85,7 +85,15 @@ typedef utf16* utf16string; #define OPENRCT2_NAME "OpenRCT2" #define OPENRCT2_VERSION "0.0.3" #define OPENRCT2_ARCHITECTURE "x86" -#define OPENRCT2_PLATFORM "Windows" +#ifdef _WIN32 + #define OPENRCT2_PLATFORM "Windows" +#endif // _WIN32 +#ifdef __linux__ + #define OPENRCT2_PLATFORM "Linux" +#endif +#ifndef OPENRCT2_PLATFORM + #error Unknown platform! +#endif #define OPENRCT2_TIMESTAMP __DATE__ " " __TIME__ // The following constants are for automated build servers From ffee5229b5c2158b984f273076910f855a3e74fd Mon Sep 17 00:00:00 2001 From: zsilencer Date: Fri, 2 Oct 2015 09:44:18 -0600 Subject: [PATCH 0759/1173] fix directories in linux --- build.sh | 30 +++++++-- build_g2.sh | 6 +- src/openrct2.c | 2 +- src/platform/linux.c | 23 +++---- src/platform/shared.c | 2 +- src/platform/windows.c | 2 +- src/rct2.c | 7 ++ src/rct2.h | 150 +++++++++++++---------------------------- 8 files changed, 98 insertions(+), 124 deletions(-) diff --git a/build.sh b/build.sh index 378ddf7dd6..1c7cc7784a 100755 --- a/build.sh +++ b/build.sh @@ -64,8 +64,20 @@ pushd build fi popd -if [[ ! -h openrct2.dll ]]; then - ln -s build/openrct2.dll openrct2.dll +if [[ $TARGET == "windows" ]]; then + if [[ ! -h openrct2.dll ]]; then + ln -s build/openrct2.dll openrct2.dll + fi +fi + +if [[ ! -h build/data ]]; then + ln -s ../data build/data +fi + +if [[ $TARGET == "linux" ]] || [[ $TARGET == "docker32" ]]; then + if [[ ! -h openrct2 ]]; then + ln -s build/openrct2 openrct2 + fi fi if [[ -z "$DISABLE_G2_BUILD" ]]; then @@ -73,8 +85,16 @@ if [[ -z "$DISABLE_G2_BUILD" ]]; then ./build_g2.sh > /dev/null 2>&1 fi -if [[ -t 1 ]]; then - echo -e "\nDone! Run OpenRCT2 by typing:\n\n\033[95mwine openrct2.exe\n\033[0m" +if [[ $TARGET == "windows" ]]; then + if [[ -t 1 ]]; then + echo -e "\nDone! Run OpenRCT2 by typing:\n\n\033[95mwine openrct2.exe\n\033[0m" + else + echo -e "\nDone! Run OpenRCT2 by typing:\n\nwine openrct2.exe\n" + fi else - echo -e "\nDone! Run OpenRCT2 by typing:\n\nwine openrct2.exe\n" + if [[ -t 1 ]]; then + echo -e "\nDone! Run OpenRCT2 by typing:\n\n\033[95m./openrct2\n\033[0m" + else + echo -e "\nDone! Run OpenRCT2 by typing:\n\n./openrct2\n" + fi fi diff --git a/build_g2.sh b/build_g2.sh index d870c40205..3d3a72b307 100755 --- a/build_g2.sh +++ b/build_g2.sh @@ -1,3 +1,7 @@ #!/bin/bash -wine openrct2.exe sprite build data/g2.dat resources/g2/ +if [[ $TARGET == "windows" ]]; then + wine openrct2.exe sprite build data/g2.dat resources/g2/ +else + ./openrct2 sprite build data/g2.dat resources/g2/ +fi diff --git a/src/openrct2.c b/src/openrct2.c index 6de7aeb621..7d4ce2d7b3 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -459,7 +459,7 @@ static bool openrct2_setup_rct2_segment() #ifdef __linux__ #define DATA_OFFSET 0x004A4000 - const char *exepath = "../openrct2.exe"; + const char *exepath = "openrct2.exe"; int fd = open(exepath, O_RDONLY); if (fd < 0) { log_fatal("failed to open %s, errno = %d", exepath, errno); diff --git a/src/platform/linux.c b/src/platform/linux.c index cb8b405004..bccad09470 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -128,7 +128,7 @@ bool platform_original_game_data_exists(const utf8 *path) buffer[len] = '\0'; free(wPath); char checkPath[MAX_PATH]; - sprintf(checkPath, "%s%c%s%c%s", buffer, platform_get_path_separator(), "data", platform_get_path_separator(), "g1.dat"); + sprintf(checkPath, "%s%c%s%c%s", buffer, platform_get_path_separator(), "Data", platform_get_path_separator(), "g1.dat"); return platform_file_exists(checkPath); } @@ -374,8 +374,11 @@ void platform_enumerate_files_end(int handle) static int dirfilter(const struct dirent *d) { + if (d->d_name[0] == '.') { + return 0; + } #ifdef _DIRENT_HAVE_D_TYPE - if (d->d_type != DT_DIR) + if (d->d_type == DT_DIR) { return 1; } else { @@ -510,7 +513,7 @@ int platform_get_drives(){ return GetLogicalDrives(); */ STUB(); - return 0xff; + return 0; } bool platform_file_copy(const utf8 *srcPath, const utf8 *dstPath, bool overwrite) @@ -664,16 +667,10 @@ uint16 platform_get_locale_language(){ } time_t platform_file_get_modified_time(const utf8* path){ - /* - WIN32_FILE_ATTRIBUTE_DATA data; - if (!GetFileAttributesEx(path, GetFileExInfoStandard, &data)) - return 0; - ULARGE_INTEGER ull; - ull.LowPart = data.ftLastWriteTime.dwLowDateTime; - ull.HighPart = data.ftLastWriteTime.dwHighDateTime; - return ull.QuadPart / 10000000ULL - 11644473600ULL; - */ - STUB(); + struct stat buf; + if (stat(path, &buf) == 0) { + return buf.st_mtime; + } return 100; } diff --git a/src/platform/shared.c b/src/platform/shared.c index fa8ffcbbf2..839322dc1e 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -931,4 +931,4 @@ void platform_set_cursor_position(int x, int y) unsigned int platform_get_ticks() { return SDL_GetTicks(); -} \ No newline at end of file +} diff --git a/src/platform/windows.c b/src/platform/windows.c index 653bef75ba..911d42475f 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -132,7 +132,7 @@ bool platform_directory_exists(const utf8 *path) bool platform_original_game_data_exists(const utf8 *path) { utf8 checkPath[MAX_PATH]; - sprintf(checkPath, "%s%c%s%c%s", path, platform_get_path_separator(), "data", platform_get_path_separator(), "g1.dat"); + sprintf(checkPath, "%s%c%s%c%s", path, platform_get_path_separator(), "Data", platform_get_path_separator(), "g1.dat"); return platform_file_exists(checkPath); } diff --git a/src/rct2.c b/src/rct2.c index be90027f05..f35b1b6b1a 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -449,8 +449,15 @@ const utf8 *get_file_path(int pathId) return path; } + char *pathp = path + strnlen(path, sizeof(path)); + strcat(path, file_paths[pathId]); + while (*pathp) { + if (*pathp == '\\') *pathp = platform_get_path_separator(); + pathp++; + } + return path; } diff --git a/src/rct2.h b/src/rct2.h index 669a2ec026..99abc0d0d1 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -206,111 +206,57 @@ enum { // rct2 @ 0x0097F67C static const char * const file_paths[] = { -#ifdef _WIN32 - "data\\g1.dat", - "Data\\PLUGIN.DAT", - "Data\\CSS1.DAT", - "Data\\CSS2.DAT", - "Data\\CSS4.DAT", - "Data\\CSS5.DAT", - "Data\\CSS6.DAT", - "Data\\CSS7.DAT", - "Data\\CSS8.DAT", - "Data\\CSS9.DAT", - "Data\\CSS11.DAT", - "Data\\CSS12.DAT", - "Data\\CSS13.DAT", - "Data\\CSS14.DAT", - "Data\\CSS15.DAT", - "Data\\CSS3.DAT", - "Data\\CSS17.DAT", - "Data\\CSS18.DAT", - "Data\\CSS19.DAT", - "Data\\CSS20.DAT", - "Data\\CSS21.DAT", - "Data\\CSS22.DAT", - "Saved Games\\scores.DAT", - "Data\\CSS23.DAT", - "Data\\CSS24.DAT", - "Data\\CSS25.DAT", - "Data\\CSS26.DAT", - "Data\\CSS27.DAT", - "Data\\CSS28.DAT", - "Data\\CSS29.DAT", - "Data\\CSS30.DAT", - "Data\\CSS31.DAT", - "Data\\CSS32.DAT", - "Data\\CSS33.DAT", - "Data\\CSS34.DAT", - "Data\\CSS35.DAT", - "Data\\CSS36.DAT", - "Data\\CSS37.DAT", - "Data\\CSS38.DAT", + "Data\\g1.dat", + "Data\\plugin.dat", + "Data\\css1.dat", + "Data\\css2.dat", + "Data\\css4.dat", + "Data\\css5.dat", + "Data\\css6.dat", + "Data\\css7.dat", + "Data\\css8.dat", + "Data\\css9.dat", + "Data\\css11.dat", + "Data\\css12.dat", + "Data\\css13.dat", + "Data\\css14.dat", + "Data\\css15.dat", + "Data\\css3.dat", + "Data\\css17.dat", + "Data\\css18.dat", + "Data\\css19.dat", + "Data\\css20.dat", + "Data\\css21.dat", + "Data\\css22.dat", + "Saved Games\\scores.dat", + "Data\\css23.dat", + "Data\\css24.dat", + "Data\\css25.dat", + "Data\\css26.dat", + "Data\\css27.dat", + "Data\\css28.dat", + "Data\\css29.dat", + "Data\\css30.dat", + "Data\\css31.dat", + "Data\\css32.dat", + "Data\\css33.dat", + "Data\\css34.dat", + "Data\\css35.dat", + "Data\\css36.dat", + "Data\\css37.dat", + "Data\\css38.dat", "Data\\CUSTOM1.WAV", "Data\\CUSTOM2.WAV", - "Data\\CSS39.DAT", - "Data\\CSS40.DAT", - "Data\\CSS41.DAT", + "Data\\css39.dat", + "Data\\css40.dat", + "Data\\css41.dat", "Scenarios\\Six Flags Magic Mountain.SC6", - "Data\\CSS42.DAT", - "Data\\CSS43.DAT", - "Data\\CSS44.DAT", - "Data\\CSS45.DAT", - "Data\\CSS46.DAT", - "Data\\CSS50.DAT" -#else - "data/g1.dat", - "data/plugin.dat", - "data/css1.dat", - "data/css2.dat", - "data/css4.dat", - "data/css5.dat", - "data/css6.dat", - "data/css7.dat", - "data/css8.dat", - "data/css9.dat", - "data/css11.dat", - "data/css12.dat", - "data/css13.dat", - "data/css14.dat", - "data/css15.dat", - "data/css3.dat", - "data/css17.dat", - "data/css18.dat", - "data/css19.dat", - "data/css20.dat", - "data/css21.dat", - "data/css22.dat", - "Saved Games/scores.dat", - "data/css23.dat", - "data/css24.dat", - "data/css25.dat", - "data/css26.dat", - "data/css27.dat", - "data/css28.dat", - "data/css29.dat", - "data/css30.dat", - "data/css31.dat", - "data/css32.dat", - "data/css33.dat", - "data/css34.dat", - "data/css35.dat", - "data/css36.dat", - "data/css37.dat", - "data/css38.dat", - "data/CUSTOM1.WAV", - "data/CUSTOM2.WAV", - "data/css39.dat", - "data/css40.dat", - "data/css41.dat", - "Scenarios/Six Flags Magic Mountain.SC6", - "data/css42.dat", - "data/css43.dat", - "data/css44.dat", - "data/css45.dat", - "data/css46.dat", - "data/css50.dat" -#endif // _WIN32 + "Data\\css42.dat", + "Data\\css43.dat", + "Data\\css44.dat", + "Data\\css45.dat", + "Data\\css46.dat", + "Data\\css50.dat" }; // Files to check (rct2 @ 0x0097FB5A) From ef186a5ee0911a643246c198535cd629a9913963 Mon Sep 17 00:00:00 2001 From: nightroan Date: Fri, 2 Oct 2015 00:55:16 -0700 Subject: [PATCH 0760/1173] Added name to contributor list --- contributors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contributors.md b/contributors.md index cbda400657..aff87d6c53 100644 --- a/contributors.md +++ b/contributors.md @@ -53,6 +53,7 @@ Includes all git commit authors. Aliases are GitHub user names. * (halfbro) * (Myrtle) * (nean) +* Michael Pham (nightroan) ## Toolchain * (Balletie) - OSX From 1963749c58d548205acf98d7d6012196d8ddd9cb Mon Sep 17 00:00:00 2001 From: nightroan Date: Fri, 2 Oct 2015 19:14:01 -0700 Subject: [PATCH 0761/1173] Fixed #1948 by clearing ebx when setting ride price --- src/ride/ride.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ride/ride.c b/src/ride/ride.c index 425511fa19..6f87ce8c8e 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5594,6 +5594,8 @@ void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *es //edx ride_number //ebp ride_type + *ebx = 0; // for cost check - changing ride price does not cost anything + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_PARK_RIDE_TICKETS * 4; if (flags & 0x1) { if (!secondary_price) { From 494869b22e59f7f80a6ff548127b2cd36ef405a8 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 3 Oct 2015 04:00:16 +0100 Subject: [PATCH 0762/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 5ae2e50de4..704f971764 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -88,7 +88,7 @@ STR_0086 :Onbekende attractie (54) STR_0087 :Onbekende attractie (55) STR_0088 :Omgekeerde Impulse-achtbaan STR_0089 :Mini-achtbaan -STR_0090 :Aandreven mijntrein +STR_0090 :Aangedreven mijntrein STR_0091 :Onbekende attractie (59) STR_0092 :LIM-lanceringsachtbaan STR_0093 : From 377650d9f582e53f5570617c32c6039c97d56c63 Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Sat, 3 Oct 2015 14:18:43 +0200 Subject: [PATCH 0763/1173] Change autosave system to use wall-clock time based frequencies The autosave system will now use frequencies based on wall-clock time rather than in-game time, for example every 15 minutes. This frequency is not affected by pausing the game or changing the game speed. The default frequency is every 5 minutes. --- data/language/english_uk.txt | 10 +++++----- src/config.c | 2 +- src/config.h | 10 +++++----- src/game.c | 3 +++ src/localisation/string_ids.h | 7 +++++++ src/scenario.c | 37 +++++++++++++++++++---------------- src/scenario.h | 1 + src/windows/options.c | 7 ++++--- 8 files changed, 46 insertions(+), 31 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 7de56f5f19..2dc461a654 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2706,11 +2706,11 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Autosave frequency: -STR_2701 :Every week -STR_2702 :Every 2 weeks -STR_2703 :Every month -STR_2704 :Every 4 months -STR_2705 :Every year +STR_2701 :Every minute +STR_2702 :Every 5 minutes +STR_2703 :Every 15 minutes +STR_2704 :Every 30 minutes +STR_2705 :Every hour STR_2706 :Never STR_2707 :Open new window STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? diff --git a/src/config.c b/src/config.c index 92e8615107..c979af93ea 100644 --- a/src/config.c +++ b/src/config.c @@ -157,7 +157,7 @@ config_enum_definition _dateFormatEnum[] = { config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, always_show_gridlines), "always_show_gridlines", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, - { offsetof(general_configuration, autosave_frequency), "autosave", CONFIG_VALUE_TYPE_UINT8, AUTOSAVE_EVERY_MONTH, NULL }, + { offsetof(general_configuration, autosave_frequency), "autosave", CONFIG_VALUE_TYPE_UINT8, AUTOSAVE_EVERY_5MINUTES, NULL }, { offsetof(general_configuration, confirmation_prompt), "confirmation_prompt", CONFIG_VALUE_TYPE_UINT8, 0, NULL }, { offsetof(general_configuration, construction_marker_colour), "construction_marker_colour", CONFIG_VALUE_TYPE_UINT8, false, NULL }, { offsetof(general_configuration, currency_format), "currency_format", CONFIG_VALUE_TYPE_UINT8, CURRENCY_POUNDS, _currencyEnum }, diff --git a/src/config.h b/src/config.h index 660902b46f..127e7602e4 100644 --- a/src/config.h +++ b/src/config.h @@ -98,11 +98,11 @@ enum { }; enum { - AUTOSAVE_EVERY_WEEK, - AUTOSAVE_EVERY_2_WEEKS, - AUTOSAVE_EVERY_MONTH, - AUTOSAVE_EVERY_4_MONTHS, - AUTOSAVE_EVERY_YEAR, + AUTOSAVE_EVERY_MINUTE, + AUTOSAVE_EVERY_5MINUTES, + AUTOSAVE_EVERY_15MINUTES, + AUTOSAVE_EVERY_30MINUTES, + AUTOSAVE_EVERY_HOUR, AUTOSAVE_NEVER }; diff --git a/src/game.c b/src/game.c index f6c65942d6..1eb5ceed19 100644 --- a/src/game.c +++ b/src/game.c @@ -296,6 +296,9 @@ void game_update() } } + // Always perform autosave check, even when paused + scenario_autosave_check(); + network_update(); news_item_update_current(); window_dispatch_update_all(); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 5728e84bc9..779e3dac99 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1393,6 +1393,13 @@ enum { STR_CHEAT_TIP_LARGE_TRAM_GUESTS = 2684, + STR_SAVE_EVERY_MINUTE = 2701, + STR_SAVE_EVERY_5MINUTES = 2702, + STR_SAVE_EVERY_15MINUTES = 2703, + STR_SAVE_EVERY_30MINUTES = 2704, + STR_SAVE_EVERY_HOUR = 2705, + STR_SAVE_NEVER = 2706, + STR_DATE_FORMAT_DMY = 2737, STR_ROLLERCOASTER_TYCOON_1_DROPDOWN = 2740, diff --git a/src/scenario.c b/src/scenario.c index c22be884a0..c6d27a6c32 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -514,34 +514,38 @@ void scenario_entrance_fee_too_high_check() } } -static void scenario_autosave_check() +void scenario_autosave_check() { - uint32 next_month_tick = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16) + 4; - uint16 month = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); + // Timestamp in milliseconds + static uint32 last_save = 0; + bool shouldSave = 0; + // Milliseconds since last save + uint32_t time_since_save = SDL_GetTicks() - last_save; + switch (gConfigGeneral.autosave_frequency) { - case AUTOSAVE_EVERY_WEEK: - shouldSave = (next_month_tick % 0x4000 == 0); + case AUTOSAVE_EVERY_MINUTE: + shouldSave = time_since_save >= 1 * 60 * 1000; break; - case AUTOSAVE_EVERY_2_WEEKS: - shouldSave = (next_month_tick % 0x8000 == 0); + case AUTOSAVE_EVERY_5MINUTES: + shouldSave = time_since_save >= 5 * 60 * 1000; break; - case AUTOSAVE_EVERY_MONTH: - shouldSave = (next_month_tick >= 0x10000); + case AUTOSAVE_EVERY_15MINUTES: + shouldSave = time_since_save >= 15 * 60 * 1000; break; - case AUTOSAVE_EVERY_4_MONTHS: - if (next_month_tick >= 0x10000) - shouldSave = (((month + 1) & 3) == 0); + case AUTOSAVE_EVERY_30MINUTES: + shouldSave = time_since_save >= 30 * 60 * 1000; break; - case AUTOSAVE_EVERY_YEAR: - if (next_month_tick >= 0x10000) - shouldSave = (((month + 1) & 7) == 0); + case AUTOSAVE_EVERY_HOUR: + shouldSave = time_since_save >= 60 * 60 * 1000; break; } - if (shouldSave) + if (shouldSave) { + last_save = SDL_GetTicks(); game_autosave(); + } } static void scenario_day_update() @@ -636,7 +640,6 @@ void scenario_update() uint8 currentMonth = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16) & 7; uint8 currentDaysInMonth = (uint8)days_in_month[currentMonth]; - scenario_autosave_check(); if ((currentDaysInMonth * nextMonthTick) >> 16 != (currentDaysInMonth * currentMonthTick) >> 16) { scenario_day_update(); } diff --git a/src/scenario.h b/src/scenario.h index a11a2cf9dc..2b5e222225 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -434,5 +434,6 @@ void scenario_set_filename(const char *value); void scenario_failure(); void scenario_success(); void scenario_success_submit_name(const char *name); +void scenario_autosave_check(); #endif diff --git a/src/windows/options.c b/src/windows/options.c index 40b93d010b..76a1f079ae 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -869,10 +869,11 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* case WINDOW_OPTIONS_PAGE_MISC: switch (widgetIndex) { case WIDX_AUTOSAVE_DROPDOWN: - for (i = AUTOSAVE_EVERY_WEEK; i <= AUTOSAVE_NEVER; i++) { + for (i = AUTOSAVE_EVERY_MINUTE; i <= AUTOSAVE_NEVER; i++) { gDropdownItemsFormat[i] = 1142; - gDropdownItemsArgs[i] = 2701 + i; + gDropdownItemsArgs[i] = STR_SAVE_EVERY_MINUTE + i; } + window_options_show_dropdown(w, widget, AUTOSAVE_NEVER + 1); gDropdownItemsChecked = 1 << gConfigGeneral.autosave_frequency; break; @@ -1371,7 +1372,7 @@ static void window_options_paint(rct_window *w, rct_drawpixelinfo *dpi) gfx_draw_string_left(dpi, 2700, w, w->colours[1], w->x + 10, w->y + window_options_misc_widgets[WIDX_AUTOSAVE].top + 1); gfx_draw_string_left( dpi, - 2701 + gConfigGeneral.autosave_frequency, + STR_SAVE_EVERY_MINUTE + gConfigGeneral.autosave_frequency, NULL, w->colours[1], w->x + window_options_misc_widgets[WIDX_AUTOSAVE].left + 1, From 33857d287b53efeaa8a7a6e641178978bc2df30d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sat, 3 Oct 2015 14:57:02 +0200 Subject: [PATCH 0764/1173] Require speex, use zipped version only when targetting mingw --- CMakeLists.txt | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d919fe4d5f..36c07e49cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,10 +52,8 @@ endif (DISABLE_NETWORK) # include lib include_directories("lib/") -# include speex header -include_directories("lib/libspeex/") # add source files -file(GLOB_RECURSE ORCT2_SOURCES "src/*.c" "src/*.cpp" "lib/*.c") +file(GLOB_RECURSE ORCT2_SOURCES "src/*.c" "src/*.cpp" "lib/argparse/*.c" "lib/cutest/*.c" "lib/lodepng/*.c") if (UNIX) # force 32bit build for now and set necessary flags to compile code as is @@ -67,13 +65,24 @@ endif (UNIX) # find and include SDL2 PKG_CHECK_MODULES(SDL2 REQUIRED sdl2 SDL2_ttf) -INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${LIBCURL_INCLUDE_DIRS} ${JANSSON_INCLUDE_DIRS}) + +# speex v1.1.15 is supplied in our zipped library, but distributions provide +# updated version, with required functions extracted out to libspeexdsp. +# This largely takes care of the problem +if (WIN32) + include_directories("lib/libspeex/") + file(GLOB_RECURSE SPEEX_SOURCES "lib/libspeex/*.c") +else (WIN32) + PKG_CHECK_MODULES(SPEEX REQUIRED speexdsp) +endif (WIN32) + +INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${LIBCURL_INCLUDE_DIRS} ${JANSSON_INCLUDE_DIRS} ${SPEEX_INCLUDE_DIRS}) LINK_DIRECTORIES(${SDL2_LIBRARY_DIRS} ${JANSSON_LIBRARY_DIRS} ${LIBCURL_LIBRARY_DIRS}) if (WIN32) # build as library for now, replace with add_executable - add_library(${PROJECT} SHARED ${ORCT2_SOURCES}) + add_library(${PROJECT} SHARED ${ORCT2_SOURCES} ${SPEEX_SOURCES}) else (WIN32) add_executable(${PROJECT} ${ORCT2_SOURCES}) endif (WIN32) @@ -84,4 +93,4 @@ endif (WIN32) # libopenrct2.dll -> openrct2.dll set_target_properties(${PROJECT} PROPERTIES PREFIX "") -TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB} ${JANSSON_LIBRARIES} ${HTTPLIBS} ${NETWORKLIBS}) +TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB} ${JANSSON_LIBRARIES} ${HTTPLIBS} ${NETWORKLIBS} ${SPEEX_LIBRARIES}) From ae82ffcd96cf9a2cc4b198488192fa1c5d2e8878 Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Sat, 3 Oct 2015 16:48:25 +0200 Subject: [PATCH 0765/1173] Rename window flags --- src/input.c | 6 +++--- src/interface/window.c | 8 ++++---- src/interface/window.h | 6 +++--- src/windows/banner.c | 2 +- src/windows/editor_bottom_toolbar.c | 2 +- src/windows/editor_inventions_list.c | 2 +- src/windows/editor_scenario_options.c | 2 +- src/windows/game_bottom_toolbar.c | 2 +- src/windows/guest.c | 2 +- src/windows/map_tooltip.c | 2 +- src/windows/maze_construction.c | 2 +- src/windows/ride.c | 2 +- src/windows/ride_construction.c | 2 +- src/windows/scenery.c | 2 +- src/windows/sign.c | 4 ++-- src/windows/staff.c | 2 +- src/windows/title_menu.c | 2 +- src/windows/top_toolbar.c | 2 +- 18 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/input.c b/src/input.c index 7a60d4f8a2..459136660d 100644 --- a/src/input.c +++ b/src/input.c @@ -434,7 +434,7 @@ static void input_viewport_drag_continue() platform_show_cursor(); RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) = INPUT_STATE_RESET; } else if (dx != 0 || dy != 0) { - if (!(w->flags & (1 << 2))) { + if (!(w->flags & WF_NO_SCROLLING)) { RCT2_GLOBAL(0x009DE540, sint16) = 1000; dx <<= viewport->zoom + 1; dy <<= viewport->zoom + 1; @@ -1543,7 +1543,7 @@ void game_handle_edge_scroll() mainWindow = window_get_main(); if (mainWindow == NULL) return; - if ((mainWindow->flags & WF_2) || (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 9)) + if ((mainWindow->flags & WF_NO_SCROLLING) || (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 9)) return; if (mainWindow->viewport == NULL) return; @@ -1586,7 +1586,7 @@ void game_handle_key_scroll() mainWindow = window_get_main(); if (mainWindow == NULL) return; - if ((mainWindow->flags & WF_2) || (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 9)) + if ((mainWindow->flags & WF_NO_SCROLLING) || (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 9)) return; if (mainWindow->viewport == NULL) return; diff --git a/src/interface/window.c b/src/interface/window.c index 699cd15477..b3ae422db0 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -361,7 +361,7 @@ rct_window *window_create(int x, int y, int width, int height, rct_window_event_ if (RCT2_NEW_WINDOW >= &(g_window_list[MAX_NUMBER_WINDOWS])) { // Close least recently used window for (w = g_window_list; w < RCT2_NEW_WINDOW; w++) - if (!(w->flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT | WF_9))) + if (!(w->flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT | WF_NO_AUTO_CLOSE))) break; window_close(w); @@ -820,7 +820,7 @@ rct_window *window_find_from_point(int x, int y) if (x < w->x || x >= w->x + w->width || y < w->y || y >= w->y + w->height) continue; - if (w->flags & WF_5) { + if (w->flags & WF_NO_BACKGROUND) { widget_index = window_find_widget_from_point(w, x, y); if (widget_index == -1) continue; @@ -1335,7 +1335,7 @@ void window_scroll_to_location(rct_window *w, int x, int y, int z) } // rct2: 0x006E7C76 if (w->viewport_target_sprite == -1) { - if (!(w->flags & WF_2)) { + if (!(w->flags & WF_NO_SCROLLING)) { w->saved_view_x = map_coordinate.x - (sint16)(w->viewport->view_width * window_scroll_locations[i][0]); w->saved_view_y = map_coordinate.y - (sint16)(w->viewport->view_height * window_scroll_locations[i][1]); w->flags |= WF_SCROLLING_TO_LOCATION; @@ -1613,7 +1613,7 @@ void window_draw_widgets(rct_window *w, rct_drawpixelinfo *dpi) rct_widget *widget; int widgetIndex; - if ((w->flags & WF_TRANSPARENT) && !(w->flags & WF_5)) + if ((w->flags & WF_TRANSPARENT) && !(w->flags & WF_NO_BACKGROUND)) gfx_fill_rect(dpi, w->x, w->y, w->x + w->width - 1, w->y + w->height - 1, 0x2000000 | 51); //todo: some code missing here? Between 006EB18C and 006EB260 diff --git a/src/interface/window.h b/src/interface/window.h index 5b5af29019..6a5b288aba 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -329,13 +329,13 @@ typedef enum { WF_STICK_TO_BACK = (1 << 0), WF_STICK_TO_FRONT = (1 << 1), - WF_2 = (1 << 2), + WF_NO_SCROLLING = (1 << 2), // User is unable to scroll this viewport WF_SCROLLING_TO_LOCATION = (1 << 3), WF_TRANSPARENT = (1 << 4), - WF_5 = (1 << 5), + WF_NO_BACKGROUND = (1 << 5), // Instead of half transparency, completely remove the window background WF_7 = (1 << 7), WF_RESIZABLE = (1 << 8), - WF_9 = (1 << 9), + WF_NO_AUTO_CLOSE = (1 << 9), // Don't auto close this window if too many windows are open WF_10 = (1 << 10), WF_WHITE_BORDER_ONE = (1 << 12), WF_WHITE_BORDER_MASK = (1 << 12) | (1 << 13), diff --git a/src/windows/banner.c b/src/windows/banner.c index 9926914055..a8bba69e64 100644 --- a/src/windows/banner.c +++ b/src/windows/banner.c @@ -117,7 +117,7 @@ void window_banner_open(rct_windownumber number) if (w != NULL) return; - w = window_create_auto_pos(WW, WH, &window_banner_events, WC_BANNER, WF_2); + w = window_create_auto_pos(WW, WH, &window_banner_events, WC_BANNER, WF_NO_SCROLLING); w->widgets = window_banner_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | diff --git a/src/windows/editor_bottom_toolbar.c b/src/windows/editor_bottom_toolbar.c index 3874d0b05a..84c6979030 100644 --- a/src/windows/editor_bottom_toolbar.c +++ b/src/windows/editor_bottom_toolbar.c @@ -130,7 +130,7 @@ void window_editor_bottom_toolbar_open() window = window_create(0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 32, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16), 32, &window_editor_bottom_toolbar_events, - WC_BOTTOM_TOOLBAR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5); + WC_BOTTOM_TOOLBAR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_NO_BACKGROUND); window->widgets = window_editor_bottom_toolbar_widgets; window->enabled_widgets |= diff --git a/src/windows/editor_inventions_list.c b/src/windows/editor_inventions_list.c index 5c04f98508..66feb1b2fd 100644 --- a/src/windows/editor_inventions_list.c +++ b/src/windows/editor_inventions_list.c @@ -532,7 +532,7 @@ void window_editor_inventions_list_open() 400, &window_editor_inventions_list_events, WC_EDITOR_INVENTION_LIST, - WF_2 + WF_NO_SCROLLING ); w->widgets = window_editor_inventions_list_widgets; w->enabled_widgets = diff --git a/src/windows/editor_scenario_options.c b/src/windows/editor_scenario_options.c index fc81d86aae..bb6c71fa4f 100644 --- a/src/windows/editor_scenario_options.c +++ b/src/windows/editor_scenario_options.c @@ -343,7 +343,7 @@ void window_editor_scenario_options_open() 148, window_editor_scenario_options_page_events[0], WC_EDITOR_SCENARIO_OPTIONS, - WF_2 + WF_NO_SCROLLING ); w->widgets = window_editor_scenario_options_widgets[0]; w->enabled_widgets = window_editor_scenario_options_page_enabled_widgets[0]; diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index e65afee41a..c9e001f09e 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -134,7 +134,7 @@ void window_game_bottom_toolbar_open() RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16), 32, &window_game_bottom_toolbar_events, WC_BOTTOM_TOOLBAR, - WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5 + WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_NO_BACKGROUND ); window->widgets = window_game_bottom_toolbar_widgets; window->enabled_widgets |= diff --git a/src/windows/guest.c b/src/windows/guest.c index 0e538fc903..d2cda8b34f 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -774,7 +774,7 @@ void window_guest_viewport_init(rct_window* w){ int height = view_widget->bottom - view_widget->top - 1; viewport_create(w, x, y, width, height, 0, focus.coordinate.x, focus.coordinate.y, focus.coordinate.z, focus.sprite.type & VIEWPORT_FOCUS_TYPE_MASK, focus.sprite.sprite_id); - w->flags |= WF_2; + w->flags |= WF_NO_SCROLLING; window_invalidate(w); } } diff --git a/src/windows/map_tooltip.c b/src/windows/map_tooltip.c index a7fc768074..0356c31197 100644 --- a/src/windows/map_tooltip.c +++ b/src/windows/map_tooltip.c @@ -121,7 +121,7 @@ static void window_map_tooltip_open() w = window_find_by_class(WC_MAP_TOOLTIP); if (w == NULL) { w = window_create( - x, y, width, height, &window_map_tooltip_events, WC_MAP_TOOLTIP, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5 + x, y, width, height, &window_map_tooltip_events, WC_MAP_TOOLTIP, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_NO_BACKGROUND ); w->widgets = window_map_tooltip_widgets; } else { diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index b3f29fa920..00f0d90576 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -143,7 +143,7 @@ static void window_maze_construction_construct(int direction); */ rct_window *window_maze_construction_open() { - rct_window *w = window_create(0, 29, 166, 200, &window_maze_construction_events, WC_RIDE_CONSTRUCTION, WF_9); + rct_window *w = window_create(0, 29, 166, 200, &window_maze_construction_events, WC_RIDE_CONSTRUCTION, WF_NO_AUTO_CLOSE); w->widgets = window_maze_construction_widgets; w->enabled_widgets = 0x6F0001C4; diff --git a/src/windows/ride.c b/src/windows/ride.c index bcdb9de417..7a8d0403cb 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -1581,7 +1581,7 @@ static void window_ride_init_viewport(rct_window *w) focus.sprite.type & VIEWPORT_FOCUS_TYPE_MASK, focus.sprite.sprite_id); - w->flags |= WF_2; + w->flags |= WF_NO_SCROLLING; window_invalidate(w); } if (w->viewport){ diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 8c0d9394ed..87926da849 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -511,7 +511,7 @@ rct_window *window_ride_construction_open() if (ride->type == RIDE_TYPE_MAZE) return window_maze_construction_open(); - w = window_create(0, 29, 166, 394, &window_ride_construction_events, WC_RIDE_CONSTRUCTION, WF_9); + w = window_create(0, 29, 166, 394, &window_ride_construction_events, WC_RIDE_CONSTRUCTION, WF_NO_AUTO_CLOSE); w->widgets = window_ride_construction_widgets; w->enabled_widgets = 0x67EFFFFFC4; diff --git a/src/windows/scenery.c b/src/windows/scenery.c index b7c132a489..1e7760c359 100644 --- a/src/windows/scenery.c +++ b/src/windows/scenery.c @@ -428,7 +428,7 @@ void window_scenery_open() WINDOW_SCENERY_HEIGHT, &window_scenery_events, WC_SCENERY, - WF_2 + WF_NO_SCROLLING ); window->widgets = window_scenery_widgets; diff --git a/src/windows/sign.c b/src/windows/sign.c index aae51c5078..9c2a56dfe5 100644 --- a/src/windows/sign.c +++ b/src/windows/sign.c @@ -153,7 +153,7 @@ void window_sign_open(rct_windownumber number) if (w != NULL) return; - w = window_create_auto_pos(WW, WH, &window_sign_events, WC_BANNER, WF_2); + w = window_create_auto_pos(WW, WH, &window_sign_events, WC_BANNER, WF_NO_SCROLLING); w->widgets = window_sign_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | @@ -492,7 +492,7 @@ void window_sign_small_open(rct_windownumber number){ ); w->viewport->flags = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_ALWAYS_SHOW_GRIDLINES) ? VIEWPORT_FLAG_GRIDLINES : 0; - w->flags |= WF_2; + w->flags |= WF_NO_SCROLLING; window_invalidate(w); } diff --git a/src/windows/staff.c b/src/windows/staff.c index 29aa3b50e2..143f9bb3fd 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -1228,7 +1228,7 @@ void window_staff_viewport_init(rct_window* w){ int height = view_widget->bottom - view_widget->top - 1; viewport_create(w, x, y, width, height, 0, 0, 0, 0, focus.type & VIEWPORT_FOCUS_TYPE_MASK, focus.sprite_id); - w->flags |= WF_2; + w->flags |= WF_NO_SCROLLING; window_invalidate(w); } } diff --git a/src/windows/title_menu.c b/src/windows/title_menu.c index 2bb2c004f1..970d021ca8 100644 --- a/src/windows/title_menu.c +++ b/src/windows/title_menu.c @@ -98,7 +98,7 @@ void window_title_menu_open() 328, 100, &window_title_menu_events, WC_TITLE_MENU, - WF_STICK_TO_BACK | WF_TRANSPARENT | WF_5 + WF_STICK_TO_BACK | WF_TRANSPARENT | WF_NO_BACKGROUND ); window->widgets = window_title_menu_widgets; window->enabled_widgets = ( diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 3e6e307336..620c518ea1 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -269,7 +269,7 @@ void window_top_toolbar_open() RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16), 28, &window_top_toolbar_events, WC_TOP_TOOLBAR, - WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5 + WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_NO_BACKGROUND ); window->widgets = window_top_toolbar_widgets; From d6a5d78742a564ae4c68bd6fd5e44956c08a1b75 Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Sat, 3 Oct 2015 18:20:01 +0200 Subject: [PATCH 0766/1173] Handle SDL_CreateRenderer error --- src/platform/shared.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/platform/shared.c b/src/platform/shared.c index 839322dc1e..65594368fe 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -810,6 +810,11 @@ void platform_refresh_video() if (gConfigGeneral.hardware_display) { if (gRenderer == NULL) gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); + + if (gRenderer == NULL) { + log_fatal("SDL_CreateRenderer %s", SDL_GetError()); + exit(-1); + } if (gBufferTexture != NULL) SDL_DestroyTexture(gBufferTexture); From 8463e58922f445e2121feacfb5f9fede619094de Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Sat, 3 Oct 2015 20:00:29 +0200 Subject: [PATCH 0767/1173] Define some tick related addresses --- src/addresses.h | 8 ++++++++ src/editor.c | 2 +- src/game.c | 4 ++-- src/input.c | 18 ++++++++++++------ src/interface/console.c | 2 +- src/interface/window.c | 6 +++--- src/rct2.c | 8 ++++---- src/scenario.c | 2 +- 8 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 672d4f3a12..47c1513827 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -203,6 +203,8 @@ #define RCT2_ADDRESS_CURRENT_SCROLL_AREA 0x009DE548 #define RCT2_ADDRESS_CURRENT_SCROLL_ID 0x009DE54C +#define RCT2_ADDRESS_TICKS_SINCE_DRAG_START 0x009DE540 + #define RCT2_ADDRESS_PICKEDUP_PEEP_SPRITE 0x009DE550 #define RCT2_ADDRESS_PICKEDUP_PEEP_X 0x009DE554 #define RCT2_ADDRESS_PICKEDUP_PEEP_Y 0x009DE556 @@ -214,8 +216,12 @@ // Of type viewport interaction #define RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE 0x009DE570 +#define RCT2_ADDRESS_LAST_TICK_COUNT 0x009DE580 + #define RCT2_ADDRESS_PALETTE_EFFECT_FRAME_NO 0x009DE584 +#define RCT2_ADDRESS_TICKS_SINCE_LAST_UPDATE 0x009DE588 + // Flags: // 0x1 Enable selection // 0x2 Enable construct selection, see CONSTRUCT_PATH_* @@ -257,6 +263,8 @@ #define RCT2_ADDRESS_WINDOW_DPI 0x009DEA74 +#define RCT2_ADDRESS_WINDOW_UPDATE_TICKS 0x009DEB7C + #define RCT2_ADDRESS_TEXTINPUT_WIDGETINDEX 0x009DEB88 #define RCT2_ADDRESS_TEXTINPUT_WINDOWNUMBER 0x009DEB8A #define RCT2_ADDRESS_TEXTINPUT_WINDOWCLASS 0x009DEB8C diff --git a/src/editor.c b/src/editor.c index e71753072d..1736aa42c9 100644 --- a/src/editor.c +++ b/src/editor.c @@ -583,7 +583,7 @@ static void editor_finalise_main_view() reset_all_sprite_quadrant_placements(); scenery_set_default_placement_configuration(); window_new_ride_init_vars(); - RCT2_GLOBAL(0x009DEB7C, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_UPDATE_TICKS, uint16) = 0; load_palette(); gfx_invalidate_screen(); } diff --git a/src/game.c b/src/game.c index 1eb5ceed19..a5e7f957de 100644 --- a/src/game.c +++ b/src/game.c @@ -255,7 +255,7 @@ void game_update() if (gGameSpeed > 1) { numUpdates = 1 << (gGameSpeed - 1); } else { - numUpdates = RCT2_GLOBAL(0x009DE588, uint16) / 31; + numUpdates = RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_LAST_UPDATE, uint16) / 31; numUpdates = clamp(1, numUpdates, 4); } @@ -913,7 +913,7 @@ void game_load_init() reset_all_sprite_quadrant_placements(); scenery_set_default_placement_configuration(); window_new_ride_init_vars(); - RCT2_GLOBAL(0x009DEB7C, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_UPDATE_TICKS, uint16) = 0; if (RCT2_GLOBAL(0x0013587C4, uint32) == 0) // this check is not in scenario play finance_update_loan_hash(); diff --git a/src/input.c b/src/input.c index 459136660d..eb3f5809e6 100644 --- a/src/input.c +++ b/src/input.c @@ -247,7 +247,8 @@ static void game_handle_input_mouse(int x, int y, int state) } else if (state == 4) { input_viewport_drag_end(); - if (RCT2_GLOBAL(0x009DE540, sint16) < 500) { + if (RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_DRAG_START, sint16) < 500) { + // If the user pressed the right mouse button for less than 500 ticks, interpret as right click viewport_interaction_right_click(x, y); } } @@ -409,7 +410,7 @@ static void input_viewport_drag_begin(rct_window *w, int x, int y) RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) = INPUT_STATE_VIEWPORT_RIGHT; _dragWindowClass = w->classification; _dragWindowNumber = w->number; - RCT2_GLOBAL(0x009DE540, sint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_DRAG_START, sint16) = 0; platform_get_cursor_position(&_dragX, &_dragY); platform_hide_cursor(); @@ -429,13 +430,18 @@ static void input_viewport_drag_continue() w = window_find_by_number(_dragWindowClass, _dragWindowNumber); viewport = w->viewport; - RCT2_GLOBAL(0x009DE540, sint16) += RCT2_GLOBAL(0x009DE588, sint16); + RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_DRAG_START, sint16) += RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_LAST_UPDATE, sint16); if (viewport == NULL) { platform_show_cursor(); RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) = INPUT_STATE_RESET; } else if (dx != 0 || dy != 0) { if (!(w->flags & WF_NO_SCROLLING)) { - RCT2_GLOBAL(0x009DE540, sint16) = 1000; + // User dragged a scrollable viewport + + // If the drag time is less than 500 the "drag" is usually interpreted as a right click. + // As the user moved the mouse, don't interpret it as right click in any case. + RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_DRAG_START, sint16) = 1000; + dx <<= viewport->zoom + 1; dy <<= viewport->zoom + 1; if (gConfigGeneral.invert_viewport_drag){ @@ -1225,7 +1231,7 @@ static void input_update_tooltip(rct_window *w, int widgetIndex, int x, int y) (RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_CURSOR_X, sint16) == x && RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_CURSOR_Y, sint16) == y) ) { - RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TIMEOUT, uint16) = RCT2_GLOBAL(0x009DE588, uint16); + RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TIMEOUT, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_LAST_UPDATE, uint16); int bp = 2000; if (RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_NOT_SHOWN_TICKS, uint16) >= 1) @@ -1245,7 +1251,7 @@ static void input_update_tooltip(rct_window *w, int widgetIndex, int x, int y) ) { window_tooltip_close(); } - RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TIMEOUT, uint16) += RCT2_GLOBAL(0x009DE588, uint16); + RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TIMEOUT, uint16) += RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_LAST_UPDATE, uint16); if (RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TIMEOUT, uint16) < 8000) return; window_close_by_class(WC_TOOLTIP); diff --git a/src/interface/console.c b/src/interface/console.c index ea1c05efc8..e0c7871ea3 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -797,7 +797,7 @@ static int cc_load_object(const utf8 **argv, int argc) { scenery_set_default_placement_configuration(); window_new_ride_init_vars(); - RCT2_GLOBAL(0x009DEB7C, uint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_UPDATE_TICKS, uint16) = 0; gfx_invalidate_screen(); console_writeline("Object file loaded."); } diff --git a/src/interface/window.c b/src/interface/window.c index b3ae422db0..53a42eecfb 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -181,9 +181,9 @@ void window_update_all() gfx_draw_all_dirty_blocks(); // 1000 tick update - RCT2_GLOBAL(0x009DEB7C, sint16) += RCT2_GLOBAL(0x009DE588, sint16); - if (RCT2_GLOBAL(0x009DEB7C, sint16) >= 1000) { - RCT2_GLOBAL(0x009DEB7C, sint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_UPDATE_TICKS, sint16) += RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_LAST_UPDATE, sint16); + if (RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_UPDATE_TICKS, sint16) >= 1000) { + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_UPDATE_TICKS, sint16) = 0; for (w = RCT2_LAST_WINDOW; w >= g_window_list; w--) window_event_unknown_07_call(w); } diff --git a/src/rct2.c b/src/rct2.c index f35b1b6b1a..4cff9cab88 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -380,15 +380,15 @@ void rct2_update_2() tick = SDL_GetTicks(); - tick2 = tick - RCT2_GLOBAL(0x009DE580, sint32); - RCT2_GLOBAL(0x009DE588, sint16) = tick2 = min(tick2, 500); + tick2 = tick - RCT2_GLOBAL(RCT2_ADDRESS_LAST_TICK_COUNT, sint32); + RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_LAST_UPDATE, sint16) = tick2 = min(tick2, 500); - RCT2_GLOBAL(0x009DE580, sint32) = tick; + RCT2_GLOBAL(RCT2_ADDRESS_LAST_TICK_COUNT, sint32) = tick; if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0) RCT2_GLOBAL(RCT2_ADDRESS_PALETTE_EFFECT_FRAME_NO, sint32) += tick2; if (RCT2_GLOBAL(RCT2_ADDRESS_ON_TUTORIAL, uint8) != 0) - RCT2_GLOBAL(0x009DE588, sint16) = 31; + RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_LAST_UPDATE, sint16) = 31; // TODO: screenshot countdown process diff --git a/src/scenario.c b/src/scenario.c index c6d27a6c32..b1b7ae7a45 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -291,7 +291,7 @@ void scenario_begin() RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, sint32) ^= platform_get_ticks(); RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_1, sint32) ^= platform_get_ticks(); - RCT2_GLOBAL(0x009DEB7C, sint16) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_UPDATE_TICKS, sint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, sint32) &= 0xFFFFF7FF; if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, sint32) & PARK_FLAGS_NO_MONEY_SCENARIO) RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, sint32) |= PARK_FLAGS_NO_MONEY; From 7aebdcd5346fb13187700d79fdf46ebccea0ae92 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sat, 3 Oct 2015 13:22:28 -0600 Subject: [PATCH 0768/1173] fix #2009 --- src/openrct2.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/openrct2.c b/src/openrct2.c index 7d4ce2d7b3..c446c4692a 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -354,6 +354,8 @@ static void openrct2_loop() uncapTick = currentTick - 25 - 1; } + platform_process_messages(); + while (uncapTick <= currentTick && currentTick - uncapTick > 25) { // Get the original position of each sprite for (uint16 i = 0; i < MAX_SPRITES; i++) { @@ -391,7 +393,6 @@ static void openrct2_loop() invalidate_sprite_2(&g_sprite_list[i]); } - platform_process_messages(); rct2_draw(); platform_draw(); fps++; From b77e8f51466e9ef24903bd151e86d5e34f5105ca Mon Sep 17 00:00:00 2001 From: Andrew Waters Date: Sat, 3 Oct 2015 13:39:15 -0700 Subject: [PATCH 0769/1173] Fixed typo of peep_udpate_ride_sub_state_13 --- src/peep/peep.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 313fa81b24..4c5a5a24c4 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -2588,7 +2588,7 @@ static void peep_update_ride_sub_state_12(rct_peep* peep){ } /* rct2: 0x0069357D */ -static void peep_udpate_ride_sub_state_13(rct_peep* peep){ +static void peep_update_ride_sub_state_13(rct_peep* peep){ sint16 x, y, xy_distance; rct_ride* ride = GET_RIDE(peep->current_ride); @@ -3235,7 +3235,7 @@ static void peep_update_ride(rct_peep* peep){ peep_update_ride_sub_state_12(peep); break; case 13: - peep_udpate_ride_sub_state_13(peep); + peep_update_ride_sub_state_13(peep); break; case 14: peep_update_ride_sub_state_14(peep); From 81925af2191c7a80a28209f5d146cbf07cda8e6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sat, 3 Oct 2015 22:50:50 +0200 Subject: [PATCH 0770/1173] Use OpenRCT2's docker repository --- build.sh | 2 +- install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index 1c7cc7784a..90e2178542 100755 --- a/build.sh +++ b/build.sh @@ -57,7 +57,7 @@ pushd build PARENT=`readlink -f ../` chmod a+rwx `pwd` chmod g+s `pwd` - docker run -u travis -v $PARENT:/work/openrct2 -w /work/openrct2/build -i -t janisozaur/openrct2:32bit-only bash -c "cmake ../ $OPENRCT2_CMAKE_OPTS && make" + docker run -u travis -v $PARENT:/work/openrct2 -w /work/openrct2/build -i -t openrct2/openrct2:32bit-only bash -c "cmake ../ $OPENRCT2_CMAKE_OPTS && make" else cmake -DCMAKE_BUILD_TYPE=Debug $OPENRCT2_CMAKE_OPTS .. make diff --git a/install.sh b/install.sh index 2315509266..bbf8020467 100755 --- a/install.sh +++ b/install.sh @@ -184,7 +184,7 @@ elif [[ `uname` == "Linux" ]]; then sudo apt-get install -y --force-yes binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake ;; "docker32") - docker pull janisozaur/openrct2:32bit-only + docker pull openrct2/openrct2:32bit-only ;; *) echo "unkown target $TARGET" From c03cec721e8c649ec95a4f2b923e1bccda823a78 Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Sat, 3 Oct 2015 16:05:51 +0200 Subject: [PATCH 0771/1173] Add Steam overlay detection that pauses the game (#1903) The Steam overlay is detected by checking if the center pixel of the framebuffer is changed between rendering and presenting to the screen. This happens when the Steam overlay draws the gray fade on the screen. This does not affect other overlays like FRAPS, MSI Afterburner and OBS overlays that don't obstruct the center of the screen. --- src/platform/shared.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/platform/shared.c b/src/platform/shared.c index 65594368fe..900ef27d61 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -73,6 +73,9 @@ static const int _fullscreen_modes[] = { 0, SDL_WINDOW_FULLSCREEN, SDL_WINDOW_FU static unsigned int _lastGestureTimestamp; static float _gestureRadius; +static uint32 _pixelBeforeOverlay; +static uint32 _pixelAfterOverlay; + static void platform_create_window(); static void platform_load_cursors(); static void platform_unload_cursors(); @@ -179,6 +182,39 @@ void platform_get_closest_resolution(int inWidth, int inHeight, int *outWidth, i } } +static void read_center_pixel(int width, int height, uint32 *pixel) { + SDL_Rect centerPixelRegion = {width / 2, height / 2, 1, 1}; + SDL_RenderReadPixels(gRenderer, ¢erPixelRegion, SDL_PIXELFORMAT_RGBA8888, pixel, sizeof(uint32)); +} + +// Should be called before SDL_RenderPresent to capture frame buffer before Steam overlay is drawn. +static void overlay_pre_render(int width, int height) { + read_center_pixel(width, height, &_pixelBeforeOverlay); +} + +// Should be called after SDL_RenderPresent, when Steam overlay has had the chance to be drawn. +static void overlay_post_render(int width, int height) { + static bool overlayActive = false; + static bool pausedBeforeOverlay = false; + + read_center_pixel(width, height, &_pixelAfterOverlay); + + // Detect an active Steam overlay by checking if the center pixel is changed by the gray fade. + // Will not be triggered by applications rendering to corners, like FRAPS, MSI Afterburner and Friends popups. + bool newOverlayActive = _pixelBeforeOverlay != _pixelAfterOverlay; + + // Toggle game pause state consistently with base pause state + if (!overlayActive && newOverlayActive) { + pausedBeforeOverlay = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) & 1; + + if (!pausedBeforeOverlay) pause_toggle(); + } else if (overlayActive && !newOverlayActive && !pausedBeforeOverlay) { + pause_toggle(); + } + + overlayActive = newOverlayActive; +} + void platform_draw() { int width = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); @@ -215,7 +251,12 @@ void platform_draw() } SDL_RenderCopy(gRenderer, gBufferTexture, NULL, NULL); + + overlay_pre_render(width, height); + SDL_RenderPresent(gRenderer); + + overlay_post_render(width, height); } else { // Lock the surface before setting its pixels From 51377fc96059a7af397dd1b09d6caddba6566a20 Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Sat, 3 Oct 2015 20:46:34 +0200 Subject: [PATCH 0772/1173] Add setting for Steam overlay pausing and add extra check --- data/language/english_uk.txt | 1 + src/config.c | 1 + src/config.h | 1 + src/localisation/string_ids.h | 2 ++ src/platform/platform.h | 2 ++ src/platform/shared.c | 5 ++++- src/platform/windows.c | 6 ++++++ src/windows/options.c | 26 ++++++++++++++++++-------- 8 files changed, 35 insertions(+), 9 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 2dc461a654..b125cef62f 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3891,6 +3891,7 @@ STR_5549 :Year/Month/Day STR_5550 :{POP16}{POP16}Year {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} STR_5551 :Year/Day/Month STR_5552 :{POP16}{POP16}Year {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} +STR_5553 :Pause game when Steam overlay is open ##################### # Rides/attractions # diff --git a/src/config.c b/src/config.c index c979af93ea..3f45c323b9 100644 --- a/src/config.c +++ b/src/config.c @@ -192,6 +192,7 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, day_night_cycle), "day_night_cycle", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, upper_case_banners), "upper_case_banners", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, allow_loading_with_incorrect_checksum),"allow_loading_with_incorrect_checksum", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(general_configuration, steam_overlay_pause), "steam_overlay_pause", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, }; config_property_definition _interfaceDefinitions[] = { diff --git a/src/config.h b/src/config.h index 127e7602e4..7708042d0a 100644 --- a/src/config.h +++ b/src/config.h @@ -166,6 +166,7 @@ typedef struct { uint8 day_night_cycle; uint8 upper_case_banners; uint8 allow_loading_with_incorrect_checksum; + uint8 steam_overlay_pause; } general_configuration; typedef struct { diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 779e3dac99..75d5d689eb 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2126,6 +2126,8 @@ enum { STR_DATE_FORMAT_YEAR_DAY_MONTH = 5551, STR_DATE_FORMAT_YDM = 5552, + STR_STEAM_OVERLAY_PAUSE = 5553, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/platform/platform.h b/src/platform/platform.h index 545cac11cd..491c07d39c 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -143,6 +143,8 @@ uint16 platform_get_locale_language(); uint8 platform_get_locale_measurement_format(); uint8 platform_get_locale_temperature_format(); +bool platform_is_steam_overlay_attached(); + // Windows specific definitions #ifdef _WIN32 // Defining WIN32_LEAN_AND_MEAN breaks dsound.h in audio.h (uncomment when dsound is finally removed) diff --git a/src/platform/shared.c b/src/platform/shared.c index 900ef27d61..d6d3fad15e 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -201,7 +201,10 @@ static void overlay_post_render(int width, int height) { // Detect an active Steam overlay by checking if the center pixel is changed by the gray fade. // Will not be triggered by applications rendering to corners, like FRAPS, MSI Afterburner and Friends popups. - bool newOverlayActive = _pixelBeforeOverlay != _pixelAfterOverlay; + bool newOverlayActive = + _pixelBeforeOverlay != _pixelAfterOverlay && + platform_is_steam_overlay_attached() && + gConfigGeneral.steam_overlay_pause; // Toggle game pause state consistently with base pause state if (!overlayActive && newOverlayActive) { diff --git a/src/platform/windows.c b/src/platform/windows.c index 911d42475f..b0a26b45a0 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -21,6 +21,7 @@ #ifdef _WIN32 #include +#include #include #include #include @@ -839,4 +840,9 @@ uint8 platform_get_locale_temperature_format() return TEMPERATURE_FORMAT_C; } } + +bool platform_is_steam_overlay_attached() +{ + return GetModuleHandle("GameOverlayRenderer.dll") != NULL; +} #endif diff --git a/src/windows/options.c b/src/windows/options.c index 76a1f079ae..301843995c 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -79,6 +79,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_HARDWARE_DISPLAY_CHECKBOX, WIDX_UNCAP_FPS_CHECKBOX, WIDX_MINIMIZE_FOCUS_LOSS, + WIDX_STEAM_OVERLAY_PAUSE, WIDX_RENDERING_GROUP, WIDX_TILE_SMOOTHING_CHECKBOX, WIDX_GRIDLINES_CHECKBOX, @@ -168,7 +169,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { static rct_widget window_options_display_widgets[] = { MAIN_OPTIONS_WIDGETS, - { WWT_GROUPBOX, 1, 5, 304, 53, 145, STR_HARDWARE_GROUP, STR_NONE }, // Hardware group + { WWT_GROUPBOX, 1, 5, 304, 53, 160, STR_HARDWARE_GROUP, STR_NONE }, // Hardware group { WWT_DROPDOWN, 1, 155, 299, 68, 79, STR_RESOLUTION_X_BY_Y, STR_NONE }, // resolution { WWT_DROPDOWN_BUTTON, 1, 288, 298, 69, 78, STR_DROPDOWN_GLYPH, STR_NONE }, { WWT_DROPDOWN, 1, 155, 299, 83, 94, 871, STR_NONE }, // fullscreen @@ -176,14 +177,15 @@ static rct_widget window_options_display_widgets[] = { { WWT_CHECKBOX, 1, 10, 290, 99, 110, STR_HARDWARE_DISPLAY, STR_NONE }, // hardware display { WWT_CHECKBOX, 1, 10, 290, 114, 125, STR_UNCAP_FPS, STR_NONE }, // uncap fps { WWT_CHECKBOX, 1, 10, 290, 129, 140, STR_MININISE_FULL_SCREEN_ON_FOCUS_LOSS, STR_NONE }, // minimise fullscreen focus loss + { WWT_CHECKBOX, 1, 10, 290, 144, 155, STR_STEAM_OVERLAY_PAUSE, STR_NONE }, // minimise fullscreen focus loss - { WWT_GROUPBOX, 1, 5, 304, 149, 240, STR_RENDERING_GROUP, STR_NONE }, // Rendering group - { WWT_CHECKBOX, 1, 10, 290, 164, 175, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, // landscape smoothing - { WWT_CHECKBOX, 1, 10, 290, 179, 190, STR_GRIDLINES, STR_GRIDLINES_TIP }, // gridlines - { WWT_DROPDOWN, 1, 155, 299, 193, 204, STR_NONE, STR_NONE }, // construction marker - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 194, 203, STR_DROPDOWN_GLYPH, STR_NONE }, - { WWT_CHECKBOX, 1, 10, 290, 209, 220, STR_CYCLE_DAY_NIGHT, STR_NONE }, // cycle day-night - { WWT_CHECKBOX, 1, 10, 290, 224, 235, STR_UPPER_CASE_BANNERS, STR_NONE }, // upper case banners + { WWT_GROUPBOX, 1, 5, 304, 164, 255, STR_RENDERING_GROUP, STR_NONE }, // Rendering group + { WWT_CHECKBOX, 1, 10, 290, 179, 190, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, // landscape smoothing + { WWT_CHECKBOX, 1, 10, 290, 194, 205, STR_GRIDLINES, STR_GRIDLINES_TIP }, // gridlines + { WWT_DROPDOWN, 1, 155, 299, 208, 219, STR_NONE, STR_NONE }, // construction marker + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 209, 218, STR_DROPDOWN_GLYPH, STR_NONE }, + { WWT_CHECKBOX, 1, 10, 290, 224, 235, STR_CYCLE_DAY_NIGHT, STR_NONE }, // cycle day-night + { WWT_CHECKBOX, 1, 10, 290, 239, 250, STR_UPPER_CASE_BANNERS, STR_NONE }, // upper case banners { WIDGETS_END }, }; @@ -355,6 +357,7 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_HARDWARE_DISPLAY_CHECKBOX) | (1 << WIDX_UNCAP_FPS_CHECKBOX) | (1 << WIDX_MINIMIZE_FOCUS_LOSS) | + (1 << WIDX_STEAM_OVERLAY_PAUSE) | (1 << WIDX_CONSTRUCTION_MARKER) | (1 << WIDX_CONSTRUCTION_MARKER_DROPDOWN) | (1 << WIDX_DAY_NIGHT_CHECKBOX) | @@ -502,6 +505,11 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) config_save_default(); window_invalidate(w); break; + case WIDX_STEAM_OVERLAY_PAUSE: + gConfigGeneral.steam_overlay_pause ^= 1; + config_save_default(); + window_invalidate(w); + break; case WIDX_DAY_NIGHT_CHECKBOX: gConfigGeneral.day_night_cycle ^= 1; config_save_default(); @@ -1114,6 +1122,7 @@ static void window_options_invalidate(rct_window *w) widget_set_checkbox_value(w, WIDX_HARDWARE_DISPLAY_CHECKBOX, gConfigGeneral.hardware_display); widget_set_checkbox_value(w, WIDX_UNCAP_FPS_CHECKBOX, gConfigGeneral.uncap_fps); widget_set_checkbox_value(w, WIDX_MINIMIZE_FOCUS_LOSS, gConfigGeneral.minimize_fullscreen_focus_loss); + widget_set_checkbox_value(w, WIDX_STEAM_OVERLAY_PAUSE, gConfigGeneral.steam_overlay_pause); widget_set_checkbox_value(w, WIDX_DAY_NIGHT_CHECKBOX, gConfigGeneral.day_night_cycle); widget_set_checkbox_value(w, WIDX_UPPER_CASE_BANNERS_CHECKBOX, gConfigGeneral.upper_case_banners); @@ -1131,6 +1140,7 @@ static void window_options_invalidate(rct_window *w) window_options_display_widgets[WIDX_HARDWARE_DISPLAY_CHECKBOX].type = WWT_CHECKBOX; window_options_display_widgets[WIDX_UNCAP_FPS_CHECKBOX].type = WWT_CHECKBOX; window_options_display_widgets[WIDX_MINIMIZE_FOCUS_LOSS].type = WWT_CHECKBOX; + window_options_display_widgets[WIDX_STEAM_OVERLAY_PAUSE].type = WWT_CHECKBOX; window_options_display_widgets[WIDX_DAY_NIGHT_CHECKBOX].type = WWT_CHECKBOX; window_options_display_widgets[WIDX_UPPER_CASE_BANNERS_CHECKBOX].type = WWT_CHECKBOX; break; From f6b7121c23ec860635a8134fae2809831911c28e Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Sat, 3 Oct 2015 23:10:42 +0200 Subject: [PATCH 0773/1173] Implement platform_is_steam_overlay_attached for unix --- src/platform/unix.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/platform/unix.c b/src/platform/unix.c index 602709bb63..e38b55671f 100644 --- a/src/platform/unix.c +++ b/src/platform/unix.c @@ -23,6 +23,7 @@ #include "../cmdline.h" #include "../openrct2.h" +#include /** * Unix, linux and fallback entry point to OpenRCT2. @@ -42,5 +43,9 @@ char platform_get_path_separator() } */ +bool platform_is_steam_overlay_attached() { + return dlopen("gameoverlayrenderer.so", RTLD_NOLOAD) != NULL; +} + #endif #endif From 8321b14a337522a57964e6175482a7ea4718eb99 Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Sat, 3 Oct 2015 23:55:23 +0200 Subject: [PATCH 0774/1173] Link with libdl --- CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 36c07e49cc..435325884e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,6 +76,11 @@ else (WIN32) PKG_CHECK_MODULES(SPEEX REQUIRED speexdsp) endif (WIN32) +# Include libdl for dlopen +if (UNIX) + set(DLLIB dl) +endif (UNIX) + INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${LIBCURL_INCLUDE_DIRS} ${JANSSON_INCLUDE_DIRS} ${SPEEX_INCLUDE_DIRS}) LINK_DIRECTORIES(${SDL2_LIBRARY_DIRS} ${JANSSON_LIBRARY_DIRS} ${LIBCURL_LIBRARY_DIRS}) @@ -93,4 +98,4 @@ endif (WIN32) # libopenrct2.dll -> openrct2.dll set_target_properties(${PROJECT} PROPERTIES PREFIX "") -TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB} ${JANSSON_LIBRARIES} ${HTTPLIBS} ${NETWORKLIBS} ${SPEEX_LIBRARIES}) +TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB} ${JANSSON_LIBRARIES} ${HTTPLIBS} ${NETWORKLIBS} ${SPEEX_LIBRARIES} ${DLLIB}) From 3f77a6778a63b285946a1ec10c1a6af857a80474 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 4 Oct 2015 00:07:22 +0100 Subject: [PATCH 0775/1173] Implemented game_command_set_land_ownership. Refactored map buy land rights for tile as it was partially broken and used a very odd style. --- src/game.c | 4 +- src/world/map.c | 48 +++++++++++ src/world/map.h | 1 + src/world/park.c | 215 ++++++++++++++++++----------------------------- 4 files changed, 134 insertions(+), 134 deletions(-) diff --git a/src/game.c b/src/game.c index a5e7f957de..b55434f975 100644 --- a/src/game.c +++ b/src/game.c @@ -1168,7 +1168,7 @@ static uint32 game_do_command_table[58] = { 0, 0, 0, - 0x006648E3, + 0, 0 }; @@ -1231,7 +1231,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_set_fence_colour, game_command_set_large_scenery_colour, game_command_set_banner_colour, - game_command_emptysub, + game_command_set_land_ownership, game_command_clear_scenery }; diff --git a/src/world/map.c b/src/world/map.c index f066163018..56a37d1824 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1717,6 +1717,54 @@ void game_command_set_land_height(int *eax, int *ebx, int *ecx, int *edx, int *e ); } +money32 map_set_land_ownership(uint8 flags, sint16 x1, sint16 y1, sint16 x2, sint16 y2, uint8 newOwnership) { + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LAND_PURCHASE * 4; + + if (!(flags & GAME_COMMAND_FLAG_APPLY)) + return 0; + + RCT2_GLOBAL(0x009E2E28, uint8) = 0; + + for (sint16 y = y1; y < y2; y += 32) { + for (sint16 x = x1; x < x2; x += 32) { + if (x > RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16)) + continue; + if (y > RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16)) + continue; + + map_buy_land_rights(x, y, x2, y2, 6, flags | (newOwnership << 8)); + } + } + + if (!(RCT2_GLOBAL(0x9E2E28, uint8) & 1)) { + return 0; + } + + sint16 x = clamp(0, x1, RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16)); + sint16 y = clamp(0, y1, RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16)); + + x += 16; + y += 16; + + sint16 z = map_element_height(x, y) & 0xFFFF; + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + return 0; +} + +/* rct2: 0x006648E3*/ +void game_command_set_land_ownership(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) +{ + *ebx = map_set_land_ownership( + *ebx & 0xFF, + *eax & 0xFFFF, + *ecx & 0xFFFF, + *edi & 0xFFFF, + *ebp & 0xFFFF, + *edx & 0xFF + ); +} + + money32 raise_land(int flags, int x, int y, int z, int ax, int ay, int bx, int by, int selectionType) { money32 cost = 0; diff --git a/src/world/map.h b/src/world/map.h index 4f5625990a..abc1ecc6c2 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -311,6 +311,7 @@ money32 raise_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags); money32 map_place_fence(int type, int x, int y, int z, int edge, int primaryColour, int secondaryColour, int tertiaryColour, int flags); void game_command_set_land_height(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +void game_command_set_land_ownership(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_remove_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_remove_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); diff --git a/src/world/park.c b/src/world/park.c index 00f51de222..739cfaa6c8 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -919,174 +919,125 @@ void game_command_set_park_name(int *eax, int *ebx, int *ecx, int *edx, int *esi *ebx = 0; } -int map_buy_land_rights_for_tile(int x, int y, int setting, int flags) { - int y2; - int cost; - int tile_idx; +money32 map_buy_land_rights_for_tile(int x, int y, int setting, int flags) { + rct_map_element* surfaceElement = map_get_surface_element_at(x / 32, y / 32); + if (surfaceElement == NULL) + return MONEY32_UNDEFINED; - y2 = y; - cost = 0; - tile_idx = (((y & 0xFFE0) * 256) + (x & 0xFFE0)) / 32; - while ((TILE_MAP_ELEMENT_POINTER(tile_idx)->type & 0x3C) != 0) { - y2 += 8; - tile_idx = (((y2 & 0xFFE0) * 256) + (x & 0xFFE0)) / 32; - } - uint8 ownership = TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership; switch (setting) { case 0: - if ((ownership & OWNERSHIP_OWNED) != 0) { // If the land is already owned - cost = 0; - return cost; + if ((surfaceElement->properties.surface.ownership & OWNERSHIP_OWNED) != 0) { // If the land is already owned + return 0; } - else if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) != 0 || (ownership & OWNERSHIP_AVAILABLE) == 0) { + + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) != 0 || (surfaceElement->properties.surface.ownership & OWNERSHIP_AVAILABLE) == 0) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 1726; // Land not for sale! - cost = 0;// MONEY32_UNDEFINED; - return cost; + return MONEY32_UNDEFINED; } - else { - if ((flags & 1) != 0) { - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership |= OWNERSHIP_OWNED; - update_park_fences(x, y); - update_park_fences(x - 32, y); - update_park_fences(x + 32, y); - update_park_fences(x, y + 32); - update_park_fences(x, y - 32); - } - cost = RCT2_GLOBAL(RCT2_ADDRESS_LAND_COST, uint16); - return cost; - } - break; - case 1: - if ((flags & 1) != 0) { - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership &= 0xCF; + if (flags & GAME_COMMAND_FLAG_APPLY) { + surfaceElement->properties.surface.ownership |= OWNERSHIP_OWNED; update_park_fences(x, y); update_park_fences(x - 32, y); update_park_fences(x + 32, y); update_park_fences(x, y + 32); update_park_fences(x, y - 32); } - cost = 0; - break; + return RCT2_GLOBAL(RCT2_ADDRESS_LAND_COST, uint16); + case 1: + if (flags & GAME_COMMAND_FLAG_APPLY) { + surfaceElement->properties.surface.ownership &= ~(OWNERSHIP_OWNED | OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED); + update_park_fences(x, y); + update_park_fences(x - 32, y); + update_park_fences(x + 32, y); + update_park_fences(x, y + 32); + update_park_fences(x, y - 32); + } + return 0; case 2: - if ((ownership & (OWNERSHIP_OWNED | OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED)) != 0) { // If the land or construction rights are already owned - cost = 0; - return cost; + if ((surfaceElement->properties.surface.ownership & (OWNERSHIP_OWNED | OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED)) != 0) { // If the land or construction rights are already owned + return 0; } - else if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) != 0 || (ownership & OWNERSHIP_CONSTRUCTION_RIGHTS_AVAILABLE) == 0) { + + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) != 0 || (surfaceElement->properties.surface.ownership & OWNERSHIP_CONSTRUCTION_RIGHTS_AVAILABLE) == 0) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 1727; // Construction rights not for sale! - cost = 0;// MONEY32_UNDEFINED; - return cost; + return MONEY32_UNDEFINED; } - else { - if ((flags & 1) != 0) { - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership |= OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED; - uint16 baseHeight = TILE_MAP_ELEMENT_POINTER(tile_idx)->base_height; - baseHeight *= 8; - map_invalidate_tile(x, y, baseHeight, baseHeight + 16); - } - cost = RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCTION_RIGHTS_COST, uint16); - return cost; + + if (flags & GAME_COMMAND_FLAG_APPLY) { + surfaceElement->properties.surface.ownership |= OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED; + uint16 baseHeight = surfaceElement->base_height * 8; + map_invalidate_tile(x, y, baseHeight, baseHeight + 16); } - break; + return RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCTION_RIGHTS_COST, uint16); case 3: - if ((flags & 1) != 0) { - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership &= 0xEF; - uint16 baseHeight = TILE_MAP_ELEMENT_POINTER(tile_idx)->base_height; - baseHeight *= 8; + if (flags & GAME_COMMAND_FLAG_APPLY) { + surfaceElement->properties.surface.ownership &= ~OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED; + uint16 baseHeight = surfaceElement->base_height * 8; map_invalidate_tile(x, y, baseHeight, baseHeight + 16); } - cost = 0; - break; - break; + return 0; case 4: - if ((flags & 1) != 0) { - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership |= OWNERSHIP_AVAILABLE; - uint16 baseHeight = TILE_MAP_ELEMENT_POINTER(tile_idx)->base_height; - baseHeight *= 8; + if (flags & GAME_COMMAND_FLAG_APPLY) { + surfaceElement->properties.surface.ownership |= OWNERSHIP_AVAILABLE; + uint16 baseHeight = surfaceElement->base_height * 8; map_invalidate_tile(x, y, baseHeight, baseHeight + 16); } - cost = 0; - break; + return 0; case 5: - if ((flags & 1) != 0) { - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership |= OWNERSHIP_CONSTRUCTION_RIGHTS_AVAILABLE; - uint16 baseHeight = TILE_MAP_ELEMENT_POINTER(tile_idx)->base_height; - baseHeight *= 8; + if (flags & GAME_COMMAND_FLAG_APPLY) { + surfaceElement->properties.surface.ownership |= OWNERSHIP_CONSTRUCTION_RIGHTS_AVAILABLE; + uint16 baseHeight = surfaceElement->base_height * 8; map_invalidate_tile(x, y, baseHeight, baseHeight + 16); } - cost = 0; - break; + return 0; default: - if (x <= 32) { + if (x <= 32 || y <= 32) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 3215; - cost = 0;// MONEY32_UNDEFINED; - return cost; + return MONEY32_UNDEFINED; } - else if (y <= 32) { - int ebp = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16); - ebp -= 32; - if (x >= ebp || y >= ebp) { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 3215; - cost = 0;// MONEY32_UNDEFINED; - return cost; + + if (x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) - 32 || y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) - 32) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 3215; + return MONEY32_UNDEFINED; + } + + rct_map_element* mapElement = map_get_first_element_at(x / 32, y / 32); + do { + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_ENTRANCE){ + return 0; } - else { - int tile_idx2 = (((y & 0xFFE0) * 256) + (x & 0xFFE0)) / 32; - ownership = TILE_MAP_ELEMENT_POINTER(tile_idx2)->properties.surface.ownership; - y2 = y; - do { - y2 += 8; - tile_idx2 = (((y2 & 0xFFE0) * 256) + (x & 0xFFE0)) / 32; - if ((TILE_MAP_ELEMENT_POINTER(tile_idx2)->type & 0x3C) == 0x10) { - cost = 0; - return cost; - } + } while (!map_element_is_last_for_tile(mapElement++)); - } while ((TILE_MAP_ELEMENT_POINTER(((((y - 8) & 0xFFE0) * 256) + (x & 0xFFE0)) / 32)->flags & 0x80) == 0); + uint8 newOwnership = (flags & 0xFF00) >> 4; + if (newOwnership == (surfaceElement->properties.surface.ownership & 0xF0)) { + return 0; + } - uint8 bh = (flags & 0xFF00) >> 4; - if (bh == (TILE_MAP_ELEMENT_POINTER(tile_idx2)->properties.surface.ownership & 0xF0)) { - cost = 0; - return cost; - } - else { - if ((cost & 1) == 0) { - cost = RCT2_GLOBAL(RCT2_ADDRESS_LAND_COST, uint16); - return cost; - } - if ((bh & 0xF0) == 0) { - uint16 bp = RCT2_GLOBAL(RCT2_ADDRESS_PEEP_SPAWNS, uint16); - if (x != (bp & 0xFFE0)) { - bp = RCT2_GLOBAL(RCT2_ADDRESS_PEEP_SPAWNS + 2, uint16); - if (y != (bp & 0xFFE0)) { - RCT2_GLOBAL(RCT2_ADDRESS_PEEP_SPAWNS, uint16) = 0xFFFF; - } - } - bp = RCT2_GLOBAL(0x13573F8, uint16); - if (x != (bp & 0xFFE0)) { - bp = RCT2_GLOBAL(0x13573F8 + 2, uint16); - if (y != (bp & 0xFFE0)) { - RCT2_GLOBAL(0x13573F8, uint16) = 0xFFFF; - } - } - } - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership &= 0x0F; - TILE_MAP_ELEMENT_POINTER(tile_idx)->properties.surface.ownership |= bh; - update_park_fences(x, y); - update_park_fences(x - 32, y); - update_park_fences(x + 32, y); - update_park_fences(x, y + 32); - update_park_fences(x, y - 32); - RCT2_GLOBAL(0x9E2E28, uint8) |= 1; + if (!(flags & GAME_COMMAND_FLAG_APPLY)) { + return RCT2_GLOBAL(RCT2_ADDRESS_LAND_COST, uint16); + } - cost = 0; - return cost; + if ((newOwnership & 0xF0) != 0) { + rct2_peep_spawn *peepSpawns = gPeepSpawns; + + for (uint8 i = 0; i < 2; ++i) { + if (x == (peepSpawns[i].x & 0xFFE0)) { + if (y == (peepSpawns[i].y & 0xFFE0)) { + peepSpawns[i].x = 0xFFFF; + } } } } - break; + surfaceElement->properties.surface.ownership &= 0x0F; + surfaceElement->properties.surface.ownership |= newOwnership; + update_park_fences(x, y); + update_park_fences(x - 32, y); + update_park_fences(x + 32, y); + update_park_fences(x, y + 32); + update_park_fences(x, y - 32); + RCT2_GLOBAL(0x9E2E28, uint8) |= 1; + return 0; } - return cost; } int map_buy_land_rights(int x0, int y0, int x1, int y1, int setting, int flags) @@ -1137,7 +1088,7 @@ void game_command_buy_land_rights(int *eax, int *ebx, int *ecx, int *edx, int *e (*edi & 0xFFFF), (*ebp & 0xFFFF), (*edx & 0xFF00) >> 8, - *ebx & 0xFF + *ebx & 0xFFFF ); } From 625e051d3595e274a65d2ada32d469f946bbc6f5 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 4 Oct 2015 00:35:26 +0100 Subject: [PATCH 0776/1173] Fix #2025. Issue caused by failing to check if coordinates outside of map --- src/world/map.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index f066163018..f490d26606 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -841,6 +841,8 @@ int map_is_location_in_park(int x, int y) if (x < (256 * 32) && y < (256 * 32)) { mapElement = map_get_surface_element_at(x / 32, y / 32); + if (mapElement == NULL) + return 0; if (mapElement->properties.surface.ownership & OWNERSHIP_OWNED) return 1; } @@ -4219,8 +4221,8 @@ money32 place_park_entrance(int flags, sint16 x, sint16 y, sint16 z, uint8 direc RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_DIRECTION, uint8)[entranceNum] = direction; } - sint16 zLow = (z & 0xFF) * 2; - sint16 zHigh = zLow + 12; + sint8 zLow = (z & 0xFF) * 2; + sint8 zHigh = zLow + 12; if (!map_can_construct_at(x, y, zLow, zHigh, 0xF)) { return MONEY32_UNDEFINED; } From 9124d0257a25c6a9a8cfebca6f382c6f6319c963 Mon Sep 17 00:00:00 2001 From: xperia64 Date: Sat, 3 Oct 2015 22:36:47 -0400 Subject: [PATCH 0777/1173] Use wget to get orctlibs.zip --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index bbf8020467..831a68bed4 100755 --- a/install.sh +++ b/install.sh @@ -47,7 +47,7 @@ function download_sdl { function download_libs { if [[ ! -f $cachedir/orctlibs.zip ]]; then - curl $liburl -o $cachedir/orctlibs.zip; + wget $liburl -O $cachedir/orctlibs.zip; fi if [[ ! -d $cachedir/orctlibs ]]; then mkdir -p $cachedir/orctlibs From 928ef24684d3246410dc8128c73724092e752347 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 4 Oct 2015 04:00:17 +0100 Subject: [PATCH 0778/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_simplified.txt | 10 ++--- data/language/chinese_traditional.txt | 10 ++--- data/language/dutch.txt | 10 ++--- data/language/english_us.txt | 10 ++--- data/language/finnish.txt | 59 +++++++++++++++++---------- data/language/french.txt | 10 ++--- data/language/german.txt | 10 ++--- data/language/hungarian.txt | 12 +++--- data/language/italian.txt | 12 +++--- data/language/korean.txt | 10 ++--- data/language/polish.txt | 10 ++--- data/language/portuguese_br.txt | 10 ++--- data/language/russian.txt | 10 ++--- data/language/spanish_sp.txt | 10 ++--- data/language/swedish.txt | 10 ++--- 15 files changed, 109 insertions(+), 94 deletions(-) diff --git a/data/language/chinese_simplified.txt b/data/language/chinese_simplified.txt index c30edc924a..d543ddea86 100644 --- a/data/language/chinese_simplified.txt +++ b/data/language/chinese_simplified.txt @@ -2711,11 +2711,11 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Autosave frequency: -STR_2701 :Every week -STR_2702 :Every 2 weeks -STR_2703 :Every month -STR_2704 :Every 4 months -STR_2705 :Every year +STR_2701 :Every minute +STR_2702 :Every 5 minutes +STR_2703 :Every 15 minutes +STR_2704 :Every 30 minutes +STR_2705 :Every hour STR_2706 :Never STR_2707 :Open new window STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 59f18568ce..a08ddc0e59 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -2706,11 +2706,11 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :自動儲存的頻率: -STR_2701 :每週 -STR_2702 :每兩週 -STR_2703 :每月 -STR_2704 :每四個月 -STR_2705 :每年 +STR_2701 :每分钟 +STR_2702 :每5分鐘 +STR_2703 :每15分鐘 +STR_2704 :每30分鐘 +STR_2705 :每小時 STR_2706 :從不 STR_2707 :開啟新視窗 STR_2708 :{WINDOW_COLOUR_1}你確定要覆蓋存檔{STRINGID}? diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 704f971764..c43b95379e 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -2702,11 +2702,11 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Automatisch opslaan: -STR_2701 :Elke week -STR_2702 :Elke 2 weken -STR_2703 :Elke maand -STR_2704 :Elke 4 maanden -STR_2705 :Elk jaar +STR_2701 :Elke minuut +STR_2702 :Elke 5 minuten +STR_2703 :Elke 15 minuten +STR_2704 :Elke 30 minuten +STR_2705 :Elk uur STR_2706 :Nooit STR_2707 :Open nieuw scherm STR_2708 :{WINDOW_COLOUR_1}Weet je zeker dat je {STRINGID} wilt vervangen? diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 193b2879a1..f120dbced0 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -2706,11 +2706,11 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Autosave frequency: -STR_2701 :Every week -STR_2702 :Every 2 weeks -STR_2703 :Every month -STR_2704 :Every 4 months -STR_2705 :Every year +STR_2701 :Every minute +STR_2702 :Every 5 minutes +STR_2703 :Every 15 minutes +STR_2704 :Every 30 minutes +STR_2705 :Every hour STR_2706 :Never STR_2707 :Open new window STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? diff --git a/data/language/finnish.txt b/data/language/finnish.txt index c64f54be08..8b80312a12 100644 --- a/data/language/finnish.txt +++ b/data/language/finnish.txt @@ -1069,9 +1069,9 @@ STR_1062 :Toistuva kierros toimintatila STR_1063 :Käänteinen-kallistus laukaistu sukkula toimintatila STR_1064 :Voimalaukaisu (aseman ohimennen) STR_1065 :Sukkulatoimintatila -STR_1066 :Veneajelu toimintatila +STR_1066 :Veneajelutoimintatila STR_1067 :Ylöspäin laukaisu -STR_1068 :Pyörivä hissi toimintatila +STR_1068 :Pyörivä hissi -toimintatila STR_1069 :Asemalta asemalle toimintatila STR_1070 :Yksi kyyti per sisäänpääsy STR_1071 :Loputtomat kyydit per sisäänpääsy @@ -1671,7 +1671,7 @@ STR_1663 :{WINDOW_COLOUR_2}Nausea: STR_1664 :{WINDOW_COLOUR_2}Energia: STR_1665 :{WINDOW_COLOUR_2}Nälkä: STR_1666 :{WINDOW_COLOUR_2}Jano: -STR_1667 :{WINDOW_COLOUR_2}WC: +STR_1667 :{WINDOW_COLOUR_2}Vessa: STR_1668 :{WINDOW_COLOUR_2}Tyytyväisyys: {BLACK}Tuntematon STR_1669 :{WINDOW_COLOUR_2}Tyytyväisyys: {BLACK}{COMMA16}% STR_1670 :{WINDOW_COLOUR_2}Asiakkaiden määrä: {BLACK}{COMMA32} @@ -2708,11 +2708,11 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Automaattisen tallennuksen tiheys: -STR_2701 :Joka viikko -STR_2702 :Joka toinen viikko -STR_2703 :Joka kuukausi -STR_2704 :Joka neljäs kuukausi -STR_2705 :Joka vuosi +STR_2701 :1 min välein +STR_2702 :5 min välein +STR_2703 :15 min välein +STR_2704 :30 min välein +STR_2705 :Tunnin välein STR_2706 :Ei koskaan STR_2707 :Avaa uusi ikkuna STR_2708 :{WINDOW_COLOUR_1}Oletko varma, että haluat korvata tiedoston {STRINGID}? @@ -2820,7 +2820,7 @@ STR_2807 :{RED}Guests are complaining about the amount of litter in your park STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organising them better STR_2809 :{RED}Vieraat ovat nälkäisiä eivätkä löydä paikkaa mistä saisi ruokaa STR_2810 :{RED}Vieraat ovat janoisia eivätkä löydä paikkaa josta saisi juotavaa -STR_2811 :{RED}Vieraat valittavat etteivät löydä wc:tä puistostasi +STR_2811 :{RED}Vieraat valittavat etteivät löydä vessaa puistostasi STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests STR_2814 :{WINDOW_COLOUR_2}Sotkuisin puisto -palkinto @@ -2833,8 +2833,8 @@ STR_2820 :{WINDOW_COLOUR_2}Turvallisin puisto -palkinto STR_2821 :{WINDOW_COLOUR_2}Paras henkilöstö -palkinto STR_2822 :{WINDOW_COLOUR_2}Parhaat puistoruuat -palkinto STR_2823 :{WINDOW_COLOUR_2}Huonoimmat puistoruuat -palkinto -STR_2824 :{WINDOW_COLOUR_2}Parhaat puistowc:t -palkinto -STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award +STR_2824 :{WINDOW_COLOUR_2}Parhaat puistovessat -palkinto +STR_2825 :{WINDOW_COLOUR_2}Pettymyksellisin puisto -palkinto STR_2826 :{WINDOW_COLOUR_2}Parhaat vesiajelut -palkinto STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride colour schemes award @@ -2850,17 +2850,17 @@ STR_2837 :{TOPAZ}Puistosi sai 'Turvallisin puisto maassa' -palkinnon! STR_2838 :{TOPAZ}Puistosi sai 'Puisto parhaimmalla henkilöstöllä' -palkinnon! STR_2839 :{TOPAZ}Puistosi sai 'Puisto parhaimmalla ruualla maassa' -palkinnon! STR_2840 :{TOPAZ}Puisto sai 'Puisto huonoimmalla ruualla maassa' -palkinnon! -STR_2841 :{TOPAZ}Puistosi sai 'Puisto parhaimmilla wc-tiloilla maassa' -palkinnon! -STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! -STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water rides in the country'! +STR_2841 :{TOPAZ}Puistosi sai 'Puisto parhaimmilla vessatiloilla maassa' -palkinnon! +STR_2842 :{TOPAZ}Puistosi sai 'Pettymyksellisin puisto maassa' -palkinnon! +STR_2843 :{TOPAZ}Puistosi sai 'Parhaat vesiajelut maassa' -palkinnon! STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed rides'! STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of colour schemes'! STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle rides'! STR_2848 :{WINDOW_COLOUR_2}Ei tuoreita palkintoja -STR_2849 :New scenario installed successfully +STR_2849 :Uusi skenaario asennettiin onnistuneesti STR_2850 :New track design installed successfully -STR_2851 :Scenario already installed +STR_2851 :Skenaario jo asennettu STR_2852 :Track design already installed STR_2853 :Kiellettyä paikallisten viranomaisten mukaan! STR_2854 :{RED}Guests can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance @@ -3382,7 +3382,7 @@ STR_3369 :{BLACK}= Matkamuistokoju STR_3370 :{BLACK}= Info. Kiosk STR_3371 :{BLACK}= Ensiapu STR_3372 :{BLACK}= Kassakone -STR_3373 :{BLACK}= WC +STR_3373 :{BLACK}= Vessa STR_3374 :Varoitus: Liian monta objektia valittuna! STR_3375 :Not all objects in this scenery group could be selected STR_3376 :Install new track design... @@ -3448,7 +3448,7 @@ STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and le STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape STR_3438 :Unable to remove all scenery from here... -STR_3439 :Clear Scenery +STR_3439 :Tyhjennä maisema STR_3440 :Sivu 1 STR_3441 :Sivu 2 STR_3442 :Sivu 3 @@ -3463,9 +3463,9 @@ STR_5121 :Tutkimustyö STR_5122 :Valitse ajelut radan tyypin mukaan (kuten RCT1:ssä) STR_5123 :Uusi ajelut STR_5124 : -STR_5125 :All destructable +STR_5125 :Kaikki tuhottavat STR_5126 :Satunnainen otsikkomusiikki -STR_5127 :{SMALLFONT}{BLACK}Disable land elevation +STR_5127 :{SMALLFONT}{BLACK}Estä maan korkeuden muuttaminen STR_5128 :Valinnan koko STR_5129 :Enter selection size between {COMMA16} and {COMMA16} STR_5130 :Kartan koko @@ -3498,7 +3498,7 @@ STR_5156 :{SMALLFONT}{BLACK}Allows testing of most ride types even when the t STR_5157 :Unlock all prices STR_5158 :Lopeta valikkoon STR_5159 :Lopeta OpenRCT2 -STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, vuosi {POP16}{COMMA16} +STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, Vuosi {POP16}{COMMA16} STR_5161 :Päiväyksen tyyli: STR_5162 :Päivä/Kuukausi/Vuosi STR_5163 :Kuukausi/Päivä/Vuosi @@ -3697,7 +3697,7 @@ STR_5354 :{BLACK}Nälkä: STR_5355 :{BLACK}Jano: STR_5356 :{BLACK}Pahoinvointi: STR_5357 :{BLACK}Pahoinvoinnin sietoraja: -STR_5358 :{BLACK}WC: +STR_5358 :{BLACK}Vessa: STR_5359 :Poista vieraat STR_5360 :{SMALLFONT}{BLACK}Poista kaikki vieraat kartalta STR_5361 :Anna kaikille vieraille: @@ -3887,3 +3887,18 @@ STR_5544 :{SMALLFONT}{BLACK}Kirkkaanpunainen STR_5545 :{SMALLFONT}{BLACK}Tummanvaaleanpunainen STR_5546 :{SMALLFONT}{BLACK}Kirkasvaaleanpunainen STR_5547 :{SMALLFONT}{BLACK}Vaaleanpunainen +STR_5548 :Show all operating modes +STR_5549 :Vuosi/Kuukausi/Päivä +STR_5550 :{POP16}{POP16}Vuosi {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} +STR_5551 :Vuosi/Päivä/Kuukausi +STR_5552 :{POP16}{POP16}Vuosi {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} + +######### +# Rides # +######### + +#WW +[CONDORRD] +STR_NAME :Condor Ride +STR_DESC :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air in Condor-shaped trains +STR_CPTY :4 matkustajaa per auto diff --git a/data/language/french.txt b/data/language/french.txt index 35d6087c29..dd0503da08 100644 --- a/data/language/french.txt +++ b/data/language/french.txt @@ -2705,11 +2705,11 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Autosave frequency: -STR_2701 :Every week -STR_2702 :Every 2 weeks -STR_2703 :Every month -STR_2704 :Every 4 months -STR_2705 :Every year +STR_2701 :Toutes les minutes +STR_2702 :Toutes les 5 minutes +STR_2703 :Toutes les 15 minutes +STR_2704 :Toutes les 30 minutes +STR_2705 :Toutes les heures STR_2706 :Jamais STR_2707 :Open new window STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? diff --git a/data/language/german.txt b/data/language/german.txt index b23816f710..186aa71c7a 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -2704,11 +2704,11 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Autosave-Frequenz: -STR_2701 :Jede Woche -STR_2702 :Alle 2 Wochen -STR_2703 :Jeden Monat -STR_2704 :Alle 4 Monate -STR_2705 :Jedes Jahr +STR_2701 :Jede Minute +STR_2702 :Alle 5 Minuten +STR_2703 :Alle 15 Minuten +STR_2704 :Alle 30 Minuten +STR_2705 :Jede Stunde STR_2706 :Nie STR_2707 :Neues Fenster STR_2708 :{WINDOW_COLOUR_1}Sind Sie sicher, dass Sie {STRINGID} überschreiben möchten? diff --git a/data/language/hungarian.txt b/data/language/hungarian.txt index 587306f420..3479980735 100644 --- a/data/language/hungarian.txt +++ b/data/language/hungarian.txt @@ -2705,12 +2705,12 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Autosave frequency: -STR_2701 :Every week -STR_2702 :Every 2 weeks -STR_2703 :Every month -STR_2704 :Every 4 months -STR_2705 :Every year -STR_2706 :Never +STR_2701 :Minden percben +STR_2702 :Minden 5 percben +STR_2703 :Minden 15 percben +STR_2704 :Minden 30 percben +STR_2705 :Minden órában +STR_2706 :Soha STR_2707 :Open new window STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? STR_2709 :Overwrite diff --git a/data/language/italian.txt b/data/language/italian.txt index fffd5261fc..cc9467fb10 100644 --- a/data/language/italian.txt +++ b/data/language/italian.txt @@ -2705,12 +2705,12 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Autosave frequency: -STR_2701 :Every week -STR_2702 :Every 2 weeks -STR_2703 :Every month -STR_2704 :Every 4 months -STR_2705 :Every year -STR_2706 :Never +STR_2701 :Ogni minuto +STR_2702 :Ogni 5 minuti +STR_2703 :Ogni 15 minuti +STR_2704 :Ogni 30 minuti +STR_2705 :Ogni ora +STR_2706 :Mai STR_2707 :Open new window STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? STR_2709 :Overwrite diff --git a/data/language/korean.txt b/data/language/korean.txt index 3c76121c85..569be01f3b 100644 --- a/data/language/korean.txt +++ b/data/language/korean.txt @@ -2706,11 +2706,11 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :자동 저장 주기: -STR_2701 :매 1주마다 -STR_2702 :매 2주마다 -STR_2703 :매 1개월마다 -STR_2704 :매 4개월마다 -STR_2705 :매 1년마다 +STR_2701 :매 모든 분 +STR_2702 :매 5분마다 +STR_2703 :매 15분마다 +STR_2704 :매 30분마다 +STR_2705 :매 시간마다 STR_2706 :안 함 STR_2707 :새 창 열기 STR_2708 :{WINDOW_COLOUR_1}정말 {STRINGID}에 덮어씌우시겠습니까? diff --git a/data/language/polish.txt b/data/language/polish.txt index 5ccda5c790..48d9b4a71a 100644 --- a/data/language/polish.txt +++ b/data/language/polish.txt @@ -2742,11 +2742,11 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Autosave frequency: -STR_2701 :Every week -STR_2702 :Every 2 weeks -STR_2703 :Every month -STR_2704 :Every 4 months -STR_2705 :Every year +STR_2701 :Every minute +STR_2702 :Every 5 minutes +STR_2703 :Every 15 minutes +STR_2704 :Every 30 minutes +STR_2705 :Every hour STR_2706 :Never STR_2707 :Open new window STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? diff --git a/data/language/portuguese_br.txt b/data/language/portuguese_br.txt index 0020fba54b..37f674aaf7 100644 --- a/data/language/portuguese_br.txt +++ b/data/language/portuguese_br.txt @@ -2703,11 +2703,11 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Frequencia do Salvamento automático -STR_2701 :Toda semana -STR_2702 :A cada 2 semanas -STR_2703 :Todo mês -STR_2704 :A cada 4 meses -STR_2705 :Todo ano +STR_2701 :A cada minuto +STR_2702 :A cada 5 minutos +STR_2703 :A cada 15 minutos +STR_2704 :A cada 30 minutos +STR_2705 :A cada hora STR_2706 :Nunca STR_2707 :Abrir nova janela STR_2708 :{WINDOW_COLOUR_1}Você tem certeza que quer sobrescrever {STRINGID}? diff --git a/data/language/russian.txt b/data/language/russian.txt index bb536bc0c1..1216f8c625 100644 --- a/data/language/russian.txt +++ b/data/language/russian.txt @@ -2706,11 +2706,11 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Autosave frequency: -STR_2701 :Every week -STR_2702 :Every 2 weeks -STR_2703 :Every month -STR_2704 :Every 4 months -STR_2705 :Every year +STR_2701 :Every minute +STR_2702 :Every 5 minutes +STR_2703 :Every 15 minutes +STR_2704 :Every 30 minutes +STR_2705 :Every hour STR_2706 :Never STR_2707 :Open new window STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? diff --git a/data/language/spanish_sp.txt b/data/language/spanish_sp.txt index 7905e4f702..9c626836b8 100644 --- a/data/language/spanish_sp.txt +++ b/data/language/spanish_sp.txt @@ -2705,11 +2705,11 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Autosave frequency: -STR_2701 :Every week -STR_2702 :Every 2 weeks -STR_2703 :Every month -STR_2704 :Every 4 months -STR_2705 :Every year +STR_2701 :Every minute +STR_2702 :Every 5 minutes +STR_2703 :Every 15 minutes +STR_2704 :Every 30 minutes +STR_2705 :Every hour STR_2706 :Never STR_2707 :Open new window STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? diff --git a/data/language/swedish.txt b/data/language/swedish.txt index bd80b4b490..81e930b655 100644 --- a/data/language/swedish.txt +++ b/data/language/swedish.txt @@ -2707,11 +2707,11 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :Autospar frekvens: -STR_2701 :Varje vecka -STR_2702 :Varannan vecka -STR_2703 :Varje månad -STR_2704 :Var 4:e månad -STR_2705 :Varje år +STR_2701 :Varje minut +STR_2702 :Var 5:e minut +STR_2703 :Var 15:e minut +STR_2704 :Var 30:e minut +STR_2705 :Varje timme STR_2706 :Aldrig STR_2707 :Öppna ett nytt fönster STR_2708 :{WINDOW_COLOUR_1}Är du säker på att du vill skriva över {STRINGID}? From 84bf968b23a3907bd9c56ad3817c7f569c2dc315 Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Sun, 4 Oct 2015 15:46:15 +0200 Subject: [PATCH 0779/1173] Fix flags in dlopen call for steam overlay check --- src/platform/unix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/unix.c b/src/platform/unix.c index e38b55671f..7ee7d9a8da 100644 --- a/src/platform/unix.c +++ b/src/platform/unix.c @@ -44,7 +44,7 @@ char platform_get_path_separator() */ bool platform_is_steam_overlay_attached() { - return dlopen("gameoverlayrenderer.so", RTLD_NOLOAD) != NULL; + return dlopen("gameoverlayrenderer.so", RTLD_NOW | RTLD_NOLOAD) != NULL; } #endif From af6a6bb8be5eb46a9ee5a0958b8f4e48b51b319c Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Sun, 4 Oct 2015 16:43:22 +0200 Subject: [PATCH 0780/1173] Rewrite platform_is_steam_overlay_attached for Unix to detect all possible situations --- src/platform/unix.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/platform/unix.c b/src/platform/unix.c index 7ee7d9a8da..6401814e14 100644 --- a/src/platform/unix.c +++ b/src/platform/unix.c @@ -43,8 +43,35 @@ char platform_get_path_separator() } */ +// See http://syprog.blogspot.ru/2011/12/listing-loaded-shared-objects-in-linux.html +struct lmap { + void* base_address; + char* path; + void* unused; + struct lmap *next, *prev; +}; + +struct dummy { + void* pointers[3]; + struct dummy* ptr; +}; + bool platform_is_steam_overlay_attached() { - return dlopen("gameoverlayrenderer.so", RTLD_NOW | RTLD_NOLOAD) != NULL; + void* processHandle = dlopen(NULL, RTLD_NOW); + + struct dummy* p = (struct dummy*) processHandle; + p = p->ptr; + + struct lmap* pl = (struct lmap*) p->ptr; + + while (pl != NULL) { + if (strstr(pl->path, "gameoverlayrenderer.so") != NULL) { + return true; + } + pl = pl->next; + } + + return false; } #endif From 7297fc86e93ac03f202815d911440fb41c05bb0a Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 4 Oct 2015 20:22:50 +0100 Subject: [PATCH 0781/1173] Fix #2029. Issue with 1x1 land ownership tool --- src/world/map.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 41e38d50df..5960a433a7 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1727,8 +1727,8 @@ money32 map_set_land_ownership(uint8 flags, sint16 x1, sint16 y1, sint16 x2, sin RCT2_GLOBAL(0x009E2E28, uint8) = 0; - for (sint16 y = y1; y < y2; y += 32) { - for (sint16 x = x1; x < x2; x += 32) { + for (sint16 y = y1; y <= y2; y += 32) { + for (sint16 x = x1; x <= x2; x += 32) { if (x > RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16)) continue; if (y > RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16)) From 9017e5ff86d46a5e47128b4b15d81cc280189224 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 4 Oct 2015 20:44:17 +0100 Subject: [PATCH 0782/1173] Fix #1899. Prevent mountain tool from being possible for land ownership tool. --- src/windows/map.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/windows/map.c b/src/windows/map.c index 7f69195056..f7d8728b1b 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -258,6 +258,8 @@ static void window_map_mouseup(rct_window *w, int widgetIndex) if (tool_set(w, widgetIndex, 2)) break; RCT2_GLOBAL(0xF1AD61, sint8) = 2; + // Prevent mountain tool tool size. + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = max(MINIMUM_TOOL_SIZE, RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)); show_gridlines(); show_land_rights(); show_construction_rights(); From 36917bd75a75a112bd5492b8dc48a745a3cb5135 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 4 Oct 2015 20:52:27 +0100 Subject: [PATCH 0783/1173] Fix #1661. Track direction now remembered when deleteing last section --- src/windows/ride_construction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 87926da849..85e09df891 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1771,7 +1771,7 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) sub_6C84CE(); if (!sub_6CAF80(_currentRideIndex, &outputElement)) { sub_6CC3FB(_currentRideIndex); - _currentTrackPieceDirection = _currentTrackPieceDirection; + _currentTrackPieceDirection = direction; if (!(slope & 0x100)) { _currentTrackCurve = slope; _previousTrackSlopeEnd = slopeEnd; From 609dad157a708e1ecc53e081d9357317dbb75e43 Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Sun, 4 Oct 2015 22:31:28 +0200 Subject: [PATCH 0784/1173] Optimise Steam overlay check --- src/platform/platform.h | 4 +++- src/platform/shared.c | 22 ++++++++++++++-------- src/platform/unix.c | 2 +- src/platform/windows.c | 2 +- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/platform/platform.h b/src/platform/platform.h index 491c07d39c..0929c215e3 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -90,6 +90,8 @@ extern int gNumResolutions; extern resolution *gResolutions; extern SDL_Window *gWindow; +extern bool gSteamOverlayActive; + // Platform shared definitions void platform_update_fullscreen_resolutions(); void platform_get_closest_resolution(int inWidth, int inHeight, int *outWidth, int *outHeight); @@ -143,7 +145,7 @@ uint16 platform_get_locale_language(); uint8 platform_get_locale_measurement_format(); uint8 platform_get_locale_temperature_format(); -bool platform_is_steam_overlay_attached(); +bool platform_check_steam_overlay_attached(); // Windows specific definitions #ifdef _WIN32 diff --git a/src/platform/shared.c b/src/platform/shared.c index d6d3fad15e..cdf9ecf854 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -59,6 +59,8 @@ SDL_PixelFormat *gBufferTextureFormat = NULL; SDL_Color gPalette[256]; uint32 gPaletteHWMapped[256]; +bool gSteamOverlayActive = false; + static SDL_Surface *_surface; static SDL_Palette *_palette; @@ -188,12 +190,12 @@ static void read_center_pixel(int width, int height, uint32 *pixel) { } // Should be called before SDL_RenderPresent to capture frame buffer before Steam overlay is drawn. -static void overlay_pre_render(int width, int height) { +static void overlay_pre_render_check(int width, int height) { read_center_pixel(width, height, &_pixelBeforeOverlay); } // Should be called after SDL_RenderPresent, when Steam overlay has had the chance to be drawn. -static void overlay_post_render(int width, int height) { +static void overlay_post_render_check(int width, int height) { static bool overlayActive = false; static bool pausedBeforeOverlay = false; @@ -201,10 +203,7 @@ static void overlay_post_render(int width, int height) { // Detect an active Steam overlay by checking if the center pixel is changed by the gray fade. // Will not be triggered by applications rendering to corners, like FRAPS, MSI Afterburner and Friends popups. - bool newOverlayActive = - _pixelBeforeOverlay != _pixelAfterOverlay && - platform_is_steam_overlay_attached() && - gConfigGeneral.steam_overlay_pause; + bool newOverlayActive = _pixelBeforeOverlay != _pixelAfterOverlay; // Toggle game pause state consistently with base pause state if (!overlayActive && newOverlayActive) { @@ -255,11 +254,15 @@ void platform_draw() SDL_RenderCopy(gRenderer, gBufferTexture, NULL, NULL); - overlay_pre_render(width, height); + if (gSteamOverlayActive && gConfigGeneral.steam_overlay_pause) { + overlay_pre_render_check(width, height); + } SDL_RenderPresent(gRenderer); - overlay_post_render(width, height); + if (gSteamOverlayActive && gConfigGeneral.steam_overlay_pause) { + overlay_post_render_check(width, height); + } } else { // Lock the surface before setting its pixels @@ -687,6 +690,9 @@ static void platform_create_window() platform_update_fullscreen_resolutions(); platform_set_fullscreen_mode(gConfigGeneral.fullscreen_mode); + + // Check if steam overlay renderer is loaded into the process + gSteamOverlayActive = platform_check_steam_overlay_attached(); } int platform_scancode_to_rct_keycode(int sdl_key) diff --git a/src/platform/unix.c b/src/platform/unix.c index 6401814e14..956828364e 100644 --- a/src/platform/unix.c +++ b/src/platform/unix.c @@ -56,7 +56,7 @@ struct dummy { struct dummy* ptr; }; -bool platform_is_steam_overlay_attached() { +bool platform_check_steam_overlay_attached() { void* processHandle = dlopen(NULL, RTLD_NOW); struct dummy* p = (struct dummy*) processHandle; diff --git a/src/platform/windows.c b/src/platform/windows.c index b0a26b45a0..5856582f0b 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -841,7 +841,7 @@ uint8 platform_get_locale_temperature_format() } } -bool platform_is_steam_overlay_attached() +bool platform_check_steam_overlay_attached() { return GetModuleHandle("GameOverlayRenderer.dll") != NULL; } From cbbc4edd20907ea054cceeb39bbda37ec8a23ef8 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 4 Oct 2015 21:39:02 +0100 Subject: [PATCH 0785/1173] Fix #1720. Ride train count misscalculation. Should now correctly allow more trains when car length reduced --- src/ride/ride.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 6f87ce8c8e..516df6ead1 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -6396,7 +6396,9 @@ void ride_update_max_vehicles(int rideIndex) break; } } + int newCarsPerTrain = max(ride->var_0CB, rideEntry->min_cars_in_train); maxCarsPerTrain = max(maxCarsPerTrain, rideEntry->min_cars_in_train); + newCarsPerTrain = min(maxCarsPerTrain, newCarsPerTrain); ride->min_max_cars_per_train = maxCarsPerTrain | (rideEntry->min_cars_in_train << 4); switch (ride->mode) { @@ -6413,15 +6415,15 @@ void ride_update_max_vehicles(int rideIndex) break; default: // Calculate maximum number of trains - ride_entry_get_train_layout(ride->subtype, maxCarsPerTrain, trainLayout); + ride_entry_get_train_layout(ride->subtype, newCarsPerTrain, trainLayout); trainLength = 0; - for (int i = 0; i < maxCarsPerTrain; i++) { + for (int i = 0; i < newCarsPerTrain; i++) { vehicleEntry = &rideEntry->vehicles[trainLayout[i]]; trainLength += vehicleEntry->var_04; } int totalLength = trainLength / 2; - if (maxCarsPerTrain != 1) + if (newCarsPerTrain != 1) totalLength /= 2; maxNumTrains = 0; @@ -6436,12 +6438,12 @@ void ride_update_max_vehicles(int rideIndex) ) { maxNumTrains = min(maxNumTrains, 31); } else { - ride_entry_get_train_layout(ride->subtype, maxCarsPerTrain, trainLayout); + ride_entry_get_train_layout(ride->subtype, newCarsPerTrain, trainLayout); vehicleEntry = &rideEntry->vehicles[trainLayout[0]]; int unk = vehicleEntry->var_5C; int totalSpacing = 0; - for (int i = 0; i < maxCarsPerTrain; i++) { + for (int i = 0; i < newCarsPerTrain; i++) { vehicleEntry = &rideEntry->vehicles[trainLayout[i]]; totalSpacing += vehicleEntry->var_04; } @@ -6463,7 +6465,7 @@ void ride_update_max_vehicles(int rideIndex) } ride->max_trains = maxNumTrains; - numCarsPerTrain = min(ride->var_0CB, maxCarsPerTrain); + numCarsPerTrain = min(ride->var_0CB, newCarsPerTrain); numVehicles = min(ride->var_0CA, maxNumTrains); } else { ride->max_trains = rideEntry->cars_per_flat_ride; From 21c84375f4cf45fdb7f521482868811e98c2062b Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 5 Oct 2015 04:00:16 +0100 Subject: [PATCH 0786/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 2 +- data/language/korean.txt | 96 ++++++++++++++------------- 2 files changed, 51 insertions(+), 47 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index a08ddc0e59..7aa46eff92 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -2706,7 +2706,7 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :自動儲存的頻率: -STR_2701 :每分钟 +STR_2701 :每分鐘 STR_2702 :每5分鐘 STR_2703 :每15分鐘 STR_2704 :每30分鐘 diff --git a/data/language/korean.txt b/data/language/korean.txt index 569be01f3b..ff1df96f43 100644 --- a/data/language/korean.txt +++ b/data/language/korean.txt @@ -947,7 +947,7 @@ STR_0941 :절벽 안 보이기 STR_0942 :놀이기구 안 보이기 STR_0943 :풍경 안 보이기 STR_0944 :저장 -STR_0945 :저장하지 않음 +STR_0945 :저장 안 함 STR_0946 :취소 STR_0947 :불러오기 전에 저장하시겠습니까? STR_0948 :종료하기 전에 저장하시겠습니까? @@ -1173,7 +1173,7 @@ STR_1167 :이곳의 물을 올릴 수 없습니다... STR_1168 :옵션 STR_1169 :(없음) STR_1170 :{STRING} -STR_1171 :{RED}닫음 - - +STR_1171 :{RED}닫힘 - - STR_1172 :{YELLOW}{STRINGID} - - STR_1173 :{SMALLFONT}{BLACK}보도와 대기줄을 만듭니다 STR_1174 :전광판 사인이 있습니다 @@ -1432,7 +1432,7 @@ STR_1426 :대기줄 STR_1427 :{WINDOW_COLOUR_2}손님: {BLACK}{COMMA32}명/시간 STR_1428 :{WINDOW_COLOUR_2}입장료: STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} -STR_1430 :Free +STR_1430 :무료 STR_1431 :걷는 중 STR_1432 :{STRINGID}(으)로 향하는 중 STR_1433 :{STRINGID}(에)서 대기 중 @@ -1846,7 +1846,7 @@ STR_1840 :고장률: {COMMA16}% STR_1841 :수익: 시간당 {CURRENCY2DP} STR_1842 :좋아하는 손님 수: {COMMA16}명 STR_1843 :좋아하는 손님 수: {COMMA16}명 -STR_1844 :{SMALLFONT}{BLACK}놀이기구/시설 목록에서 보여줄 정보의 종류를 선택하세요 +STR_1844 :{SMALLFONT}{BLACK}놀이기구/시설 목록에서 보여줄 정보를 선택하세요 STR_1845 :{MONTHYEAR} STR_1846 :{COMMA16} 손님 STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} 손님 @@ -2278,9 +2278,9 @@ STR_2270 :{WINDOW_COLOUR_2}진행: {BLACK}{STRINGID} STR_2271 :{WINDOW_COLOUR_2}예상: {BLACK}{STRINGID} STR_2272 :{WINDOW_COLOUR_2}놀이기구/시술:{NEWLINE}{BLACK}{STRINGID} STR_2273 :{WINDOW_COLOUR_2}풍경/테마:{NEWLINE}{BLACK}{STRINGID} -STR_2274 :{SMALLFONT}{BLACK}Show details of this invention or development -STR_2275 :{SMALLFONT}{BLACK}Show funding and options for research & development -STR_2276 :{SMALLFONT}{BLACK}Show research & development status +STR_2274 :{SMALLFONT}{BLACK}이 개발에 대한 상세 내역을 보여줍니다 +STR_2275 :{SMALLFONT}{BLACK}연구 & 개발을 위한 투자 설정 창을 보여줍니다 +STR_2276 :{SMALLFONT}{BLACK}연구 & 개발 상황을 보여줍니다 STR_2277 :알 수 없는 STR_2278 :운송용 놀이기구 STR_2279 :얌전한 놀이기구 @@ -2527,7 +2527,7 @@ STR_2519 :공원 정보를 보여줍니다 STR_2520 :손님 목록을 보여줍니다 STR_2521 :직원 목록을 보여줍니다 STR_2522 :최근 메시지를 보여줍니다 -STR_2523 :지도를 봅니다 +STR_2523 :지도 보기 STR_2524 :스크린 샷 ### The following need to be reordered to match SDL_keycode layout. STR_2525 :??? @@ -2538,8 +2538,8 @@ STR_2529 :??? STR_2530 :??? STR_2531 :??? STR_2532 :??? -STR_2533 :Backspace -STR_2534 :Tab +STR_2533 :백스페이스 +STR_2534 :탭 STR_2535 :??? STR_2536 :??? STR_2537 :Clear @@ -2562,7 +2562,7 @@ STR_2553 :??? STR_2554 :??? STR_2555 :??? STR_2556 :??? -STR_2557 :Spacebar +STR_2557 :스페이스바 STR_2558 :PgUp STR_2559 :PgDn STR_2560 :End @@ -2706,7 +2706,7 @@ STR_2697 :??? STR_2698 :??? STR_2699 :??? STR_2700 :자동 저장 주기: -STR_2701 :매 모든 분 +STR_2701 :매 1분마다 STR_2702 :매 5분마다 STR_2703 :매 15분마다 STR_2704 :매 30분마다 @@ -3127,8 +3127,8 @@ STR_3116 :{SMALLFONT}{BLACK}트랙 디자인을 저장합니다 (놀이기구 STR_3117 :{BLACK}정비기술자에게 연락 중... STR_3118 :{BLACK}{STRINGID}(이)가 놀이기구로 향하고 있음 STR_3119 :{BLACK}{STRINGID}(이)가 놀이기구를 수리하고 있음 -STR_3120 :{SMALLFONT}{BLACK}가장 가까운 정비기술자를 찾거나 정비기술자가 놀이기구를 수리하게 합니다 -STR_3121 :정비기술자를 찾을 수 없거나 근방에 있는 모든 정비기술자가 바쁩니다 +STR_3120 :{SMALLFONT}{BLACK}가까운 정비기술자를 찾아서 놀이기구를 수리하게 합니다 +STR_3121 :정비기술자가 근처에 없거나 모두 바쁩니다 STR_3122 :{WINDOW_COLOUR_2}이 놀이기구를 좋아하는 손님: {BLACK}{COMMA16}명 STR_3123 :{WINDOW_COLOUR_2}이 놀이기구를 좋아하는 손님: {BLACK}{COMMA16}명 STR_3124 :고장난 {STRINGID} @@ -3286,8 +3286,8 @@ STR_3275 :손님 생성 난이도 상승 STR_3276 :{SMALLFONT}{BLACK}공원에 손님을 유치하기 더 어렵게 만듭니다 STR_3277 :{WINDOW_COLOUR_2}땅 구입 비용: STR_3278 :{WINDOW_COLOUR_2}건설권 구입 비용: -STR_3279 :공원 입장 무료 / 놀이기구 탑승료 받음 -STR_3280 :공원 입장료 받음 / 놀이기구 탑승료 무료 +STR_3279 :놀이기구 탑승료만 받기 +STR_3280 :공원 입장료만 받기 STR_3281 :{WINDOW_COLOUR_2}입장료: STR_3282 :{SMALLFONT}{BLACK}목표와 공원 이름을 선택하세요 STR_3283 :{SMALLFONT}{BLACK}보호할 놀이기구를 선택하세요 @@ -3373,7 +3373,7 @@ STR_3362 :<더 이상 사용하지 않음> STR_3363 :<더 이상 사용하지 않음> STR_3364 :고급 STR_3365 :{SMALLFONT}{BLACK}조형물 그룹과 함께 조형물 각각을 따로 선택할 수 있게 허용합니다 -STR_3366 :{BLACK}= 라이드 +STR_3366 :{BLACK}= 놀이기구 STR_3367 :{BLACK}= 음식 상점 STR_3368 :{BLACK}= 음료수 상점 STR_3369 :{BLACK}= 기념품 가게 @@ -3459,7 +3459,7 @@ STR_3446 :순찰 영역 해제 STR_5120 :재정 STR_5121 :연구 STR_5122 :놀이기구를 (RCT1처럼) 트랙 종류 별로 선택 -STR_5123 :놀이기구 갱신 +STR_5123 :놀이기구 새 걸로 STR_5124 :<더 이상 사용하지 않음> STR_5125 :모두 파괴 가능 STR_5126 :무작위 타이틀 음악 @@ -3473,7 +3473,7 @@ STR_5133 :{SMALLFONT}{BLACK}땅 구입 도구 크기 줄이기 STR_5134 :{SMALLFONT}{BLACK}땅 구입 도구 크기 늘이기 STR_5135 :{SMALLFONT}{BLACK}땅 소유권과 건설권 구입하기 STR_5136 :땅 소유권 -STR_5137 :체인 리프트 힐과 발사 속력을{NEWLINE}다음 속도까지 허용: {VELOCITY} +STR_5137 :체인/발사 속력을 {VELOCITY}까지 허용 STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} STR_5139 :{WHITE}{STRINGID} STR_5140 :브레이크 고장 안 나게 @@ -3499,20 +3499,20 @@ STR_5159 :OpenRCT2 종료 STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, {POP16}{COMMA16}년 STR_5161 :날짜 형식: STR_5162 :일/월/년 -STR_5163 :년/월/일 -STR_5164 :Twitch 채널 이름 -STR_5165 :팔로워 이후에 사람들 이름 붙이기 -STR_5166 :{SMALLFONT}{BLACK}Twitch 채널의 팔로워 다음으로 사람들의 이름을 붙입니다 -STR_5167 :팔로워 사람 추적 -STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for 손님 named after channel's Twitch followers -STR_5169 :Twitch 채팅의 손님 이후에 사람들 이름 붙이기 -STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat +STR_5163 :월/일/년 +STR_5164 :트위치 채널 이름 +STR_5165 :손님 이름을 팔로워 이름을 따서 붙이기 +STR_5166 :{SMALLFONT}{BLACK}트위치 채널의 팔로워 이름을 따서 손님 이름으로 사용합니다 +STR_5167 :팔로워 손님 추적 +STR_5168 :{SMALLFONT}{BLACK}채널의 트위치 팔로워 이름을 딴 손님을 추적합니다 +STR_5169 :손님 이름을 트위치 채팅의 접속자 이름을 따서 붙이기 +STR_5170 :{SMALLFONT}{BLACK}트위치 채팅의 접속자 이름을 따서 손님 이름으로 사용합니다 STR_5171 :채팅 인원 추적 -STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for 손님 named after Twitch chat participants -STR_5173 :Twitch 채팅 내용을 뉴스로 전송 -STR_5174 :{SMALLFONT}{BLACK}Twitch의 채팅 메시지를 !news를 이용하여 게임 메시지로 알려줍니다 -STR_5175 :Twitch 채널 이름 입력 -STR_5176 :Twitch 통합 허용 +STR_5172 :{SMALLFONT}{BLACK}트위치 채팅에 참가하고 있는 사람들의 이름을 딴 손님의 행적을 추적합니다 +STR_5173 :트위치 채팅 내용을 뉴스로 전송 +STR_5174 :{SMALLFONT}{BLACK}트위치의 채팅 메시지를 !news를 이용하여 게임 메시지로 알려줍니다 +STR_5175 :트위치 채널 이름 입력 +STR_5176 :트위치 통합 허용 STR_5177 :풀 스크린 모드: STR_5178 :{SMALLFONT}{BLACK}재정 치트를 보여줍니다 STR_5179 :{SMALLFONT}{BLACK}손님 치트를 보여줍니다 @@ -3621,7 +3621,7 @@ STR_5281 :{SMALLFONT}{BLACK}기능 STR_5282 :RCT1 놀이기구 열기/닫기 아이콘 STR_5283 :RCT1 공원 열기/닫기 아이콘 STR_5284 :RCT1 시나리오 선택 폰트 -STR_5285 :손님 폭탄!!! +STR_5285 :손님 터트리기!!! STR_5286 :{SMALLFONT}{BLACK}일부 손님을 터뜨립니다 STR_5287 :놀이기구가 이미 고장난 상태입니다 STR_5288 :놀이기구가 닫혔습니다 @@ -3649,8 +3649,8 @@ STR_5309 :OpenRCT2 STR_5310 :무작위 STR_5311 :{SMALLFONT}{BLACK}디버그 도구 STR_5312 :콘솔 보이기 -STR_5313 :칸 검색기 보이기 -STR_5314 :칸 검색기 +STR_5313 :칸 탐색기 열기 +STR_5314 :칸 탐색기 STR_5315 :잔디 STR_5316 :모래 STR_5317 :진흙 @@ -3675,9 +3675,9 @@ STR_5335 :놀이기구 입구 STR_5336 :놀이기구 출구 STR_5337 :공원 입구 STR_5338 :요소 종류 -STR_5339 :기본 높이 -STR_5340 :높이 제한 제거 -STR_5341 :깃발 +STR_5339 :기본 고도 +STR_5340 :최상단 높이 +STR_5341 :플래그 STR_5342 :지도 칸 선택 STR_5343 :직원 자동 배치 STR_5344 :변경기록 @@ -3697,8 +3697,8 @@ STR_5357 :{BLACK}멀미 참을성: STR_5358 :{BLACK}화장실: STR_5359 :손님 없애기 STR_5360 :{SMALLFONT}{BLACK}지도 상의 모든 손님을 없앱니다 -STR_5361 :모든 손님에게: -STR_5362 :{BLACK}모든 손님들이 선호하는 놀이기구 격렬도를 설정합니다 +STR_5361 :모든 손님에게 다음 물건 주기: +STR_5362 :{BLACK}손님들의 선호 격렬도 설정: STR_5363 :1 이상 STR_5364 :15 이하 STR_5365 :{BLACK}직원 속도: @@ -3778,11 +3778,11 @@ STR_5438 :명령 에디터가 열려있을 때 변경할 수 없습니다 STR_5439 :4초 이상의 기다림 명령은 재시작 명령이 필요합니다. STR_5440 :커서가 게임 밖으로 나가면 풀스크린을 최소화 STR_5441 :{SMALLFONT}{BLACK}놀이기구를 RCT1처럼 종류별로 구분합니다. -STR_5442 :공원 등급 고정하기: +STR_5442 :공원 등급 고정: STR_5443 :속도{MOVE_X}{87}{STRINGID} STR_5444 :속도: STR_5445 :속도 -STR_5446 :Get +STR_5446 :얻기 STR_5447 :종류 {STRINGID} STR_5448 :놀이기구 / 차량 {STRINGID} STR_5449 :게임 속도 느리게 @@ -3791,8 +3791,8 @@ STR_5451 :치트 창 열기 STR_5452 :메뉴 표시 설정 변경 STR_5453 :다른 놀이기구 선택 STR_5454 :FPS 제한 해제 -STR_5455 :모래상자 모드 사용 -STR_5456 :재고(?) 확인 안 하기 +STR_5455 :모래상자 모드 +STR_5456 :겹쳐짓기 모드 STR_5457 :지지대 제한 없애기 STR_5458 :시계방향으로 회전 STR_5459 :반시계방향으로 회전 @@ -3850,7 +3850,7 @@ STR_5510 :기본 사운드 장치 STR_5511 :(알 수 없음) STR_5512 :다른 이름으로 저장 STR_5513 :(간편) 게임 저장 -STR_5514 :기물 파손 끄기 +STR_5514 :기물을 파손하지 않게 하기 STR_5515 :{SMALLFONT}{BLACK}손님이 화가 났을 때 기물을 파손하지 않도록 설정합니다 STR_5516 :{SMALLFONT}{BLACK}검은색 STR_5517 :{SMALLFONT}{BLACK}회색 @@ -3885,9 +3885,13 @@ STR_5545 :{SMALLFONT}{BLACK}어두운 분홍색 STR_5546 :{SMALLFONT}{BLACK}밝은 분홍색 STR_5547 :{SMALLFONT}{BLACK}분홍색 STR_5548 :모든 운행 모드 보이기 +STR_5549 :연/월/일 +STR_5550 :{POP16}{POP16}{COMMA16}년 {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} +STR_5551 :연/일/월 +STR_5552 :{POP16}{POP16}{COMMA16}년 {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} ##################### -# Rides/attractions # +# Rides/attractions # ##################### #WW From 06c33dfd8adbc52879d9dd5d13c5a1713dcb8172 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 6 Oct 2015 04:00:17 +0100 Subject: [PATCH 0787/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 1 + data/language/german.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 7aa46eff92..18ffb50692 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3892,6 +3892,7 @@ STR_5549 :年/月/日 STR_5550 :{POP16}{POP16}第{COMMA16}年, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} STR_5551 :年/日/月 STR_5552 :{POP16}{POP16}第{COMMA16}年, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} +STR_5553 :當Steam overlay開啟時暫停遊戲 ##################### # Rides/attractions # diff --git a/data/language/german.txt b/data/language/german.txt index 186aa71c7a..2cc63e1dfb 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3886,3 +3886,4 @@ STR_5549 :Jahr/Monat/Tag STR_5550 :{POP16}{POP16}Jahr {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} STR_5551 :Jahr/Tag/Monat STR_5552 :{POP16}{POP16}Jahr {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} +STR_5553 :Spiel bei geöffnetem Steam Overlay pausieren From 468a6c15fadaff8abe2ea486a6b534945c26c646 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Tue, 6 Oct 2015 23:52:37 -0600 Subject: [PATCH 0788/1173] implement peep_give_real_name --- src/peep/peep.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 4c5a5a24c4..885c5a8323 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -8459,7 +8459,33 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl */ static void peep_give_real_name(rct_peep *peep) { - RCT2_CALLPROC_X(0x0069C483, 0, 0, 0, 0, (int)peep, 0, 0); + // Generate a name_string_idx from the peep id using bit twiddling + uint32 eax = peep->id + 0xF0B; + uint16 dx = 0; + dx |= ((eax & 0x400) ? 1 : 0) << 13; + dx |= ((eax & 0x2000) ? 1 : 0) << 12; + dx |= ((eax & 0x800) ? 1 : 0) << 11; + dx |= ((eax & 0x400) ? 1 : 0) << 10; + dx |= ((eax & 0x1) ? 1 : 0) << 9; + dx |= ((eax & 0x40) ? 1 : 0) << 8; + dx |= ((eax & 0x2) ? 1 : 0) << 7; + dx |= ((eax & 0x4) ? 1 : 0) << 6; + dx |= ((eax & 0x100) ? 1 : 0) << 5; + dx |= ((eax & 0x20) ? 1 : 0) << 4; + dx |= ((eax & 0x80) ? 1 : 0) << 3; + dx |= ((eax & 0x8) ? 1 : 0) << 2; + dx |= ((eax & 0x200) ? 1 : 0) << 1; + dx |= ((eax & 0x10) ? 1 : 0) << 0; + eax = dx & 0xF; + dx *= 4; + eax *= 4096; + dx += eax; + if (dx < eax) { + dx += 0x1000; + } + dx /= 4; + dx += 0xA000; + peep->name_string_idx = dx; } /** From 6403b0a47f6bd1deb7ef6831763e057ec97eba4a Mon Sep 17 00:00:00 2001 From: xperia64 Date: Wed, 7 Oct 2015 17:23:03 -0400 Subject: [PATCH 0789/1173] Add download function to install.sh that delegates to curl or wget --- install.sh | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/install.sh b/install.sh index 831a68bed4..3ac8475eed 100755 --- a/install.sh +++ b/install.sh @@ -15,12 +15,23 @@ TARGET=${TARGET-linux} libversion=3 libVFile="./libversion" +function download { + if command -v curl > /dev/null 2>&1; then + curl -o $2 $1 + elif command -v wget > /dev/null 2>&1; then + wget -O $2 $1 + else + echo "Please install either wget or curl to continue" + exit 1 + fi +} + function download_sdl { if [[ ! -f $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz ]]; then - wget http://libsdl.org/release/SDL2-devel-${SDL2_PV}-mingw.tar.gz --output-document $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz; + download http://libsdl.org/release/SDL2-devel-${SDL2_PV}-mingw.tar.gz $cachedir/SDL2-devel-${SDL2_PV}-mingw.tar.gz; fi if [[ ! -f $cachedir/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz ]]; then - wget https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz --output-document $cachedir/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz; + download https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz $cachedir/SDL2_ttf-devel-${SDL2_TTF_PV}-mingw.tar.gz; fi if [[ ! -d $cachedir/SDL2-${SDL2_PV} ]]; then pushd $cachedir @@ -35,7 +46,7 @@ function download_sdl { # Apply platform patch mingw_patch=libsdl2-mingw-2.0.3-fix-platform-detection-for-mingw.patch if [[ ! -f $cachedir/$mingw_patch ]]; then - wget "https://github.com/anyc/anyc-overlay/raw/master/media-libs/libsdl2-mingw/files/$mingw_patch" --output-document $cachedir/$mingw_patch; + download "https://github.com/anyc/anyc-overlay/raw/master/media-libs/libsdl2-mingw/files/$mingw_patch" $cachedir/$mingw_patch; # XXX not sure how to make this idempotent. pushd $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32/include/SDL2/ @@ -47,7 +58,7 @@ function download_sdl { function download_libs { if [[ ! -f $cachedir/orctlibs.zip ]]; then - wget $liburl -O $cachedir/orctlibs.zip; + download $liburl $cachedir/orctlibs.zip; fi if [[ ! -d $cachedir/orctlibs ]]; then mkdir -p $cachedir/orctlibs @@ -114,13 +125,6 @@ if [[ `uname` == "Darwin" ]]; then echo "brew was found" fi - echo "Check if wget is installed" - which -s wget - if [ $? -eq 1 ]; then - echo "wget is not installed, installing wget.." - eval "$package_command install wget" - fi - # Install packages with whatever command was found. # Very possible I'm missing some dependencies here. eval "$package_command install cmake wine" @@ -139,7 +143,7 @@ if [[ `uname` == "Darwin" ]]; then mingw_tar=$mingw_name"_20130531".tar.bz2 mingw_path=/usr/local/$mingw_name if [[ ! -f $cachedir/$mingw_tar ]]; then - wget "https://downloads.sourceforge.net/project/mingw-w64/Toolchains targetting Win32/Automated Builds/$mingw_tar" --output-document $cachedir/$mingw_tar + download "https://downloads.sourceforge.net/project/mingw-w64/Toolchains targetting Win32/Automated Builds/$mingw_tar" $cachedir/$mingw_tar fi if [[ ! -d "$mingw_path" ]]; then @@ -171,8 +175,8 @@ elif [[ `uname` == "Linux" ]]; then sudo dpkg --add-architecture i386 sudo apt-get update sudo apt-get install --no-install-recommends -y --force-yes cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386 gcc-4.8 pkg-config:i386 g++-4.8-multilib gcc-4.8-multilib libjansson-dev:i386 libspeex-dev:i386 libspeexdsp-dev:i386 libcurl4-openssl-dev:i386 libcrypto++-dev:i386 - wget https://launchpad.net/ubuntu/+archive/primary/+files/libjansson4_2.7-1ubuntu1_i386.deb - wget https://launchpad.net/ubuntu/+archive/primary/+files/libjansson-dev_2.7-1ubuntu1_i386.deb + download https://launchpad.net/ubuntu/+archive/primary/+files/libjansson4_2.7-1ubuntu1_i386.deb libjansson4_2.7-1ubuntu1_i386.deb + download https://launchpad.net/ubuntu/+archive/primary/+files/libjansson-dev_2.7-1ubuntu1_i386.deb libjansson-dev_2.7-1ubuntu1_i386.deb sudo dpkg -i libjansson4_2.7-1ubuntu1_i386.deb sudo dpkg -i libjansson-dev_2.7-1ubuntu1_i386.deb sudo apt-get install -f From 24e13f73a98d4ebcac06e9d26339961ce8008ae2 Mon Sep 17 00:00:00 2001 From: xperia64 Date: Wed, 7 Oct 2015 17:48:46 -0400 Subject: [PATCH 0790/1173] Make curl follow redirects --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 3ac8475eed..5704a9ce23 100755 --- a/install.sh +++ b/install.sh @@ -17,7 +17,7 @@ libVFile="./libversion" function download { if command -v curl > /dev/null 2>&1; then - curl -o $2 $1 + curl -L -o $2 $1 elif command -v wget > /dev/null 2>&1; then wget -O $2 $1 else From dfd0c52b7ea546d8e43ce9d3a47dc60ecff1f3d7 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 8 Oct 2015 10:47:14 +0200 Subject: [PATCH 0791/1173] Name PEEP_FLAGS_5 --- src/peep/peep.c | 6 +++--- src/peep/peep.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 885c5a8323..c429bd551a 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -6261,7 +6261,7 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m RCT2_GLOBAL(RCT2_ADDRESS_INCOME_FROM_ADMISSIONS, money32) += entranceFee; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_PARK_ENTRANCE_TICKETS * 4; peep_spend_money(peep, &peep->paid_to_enter, entranceFee); - peep->flags |= PEEP_FLAGS_5; + peep->flags |= PEEP_FLAGS_HAS_PAID_FOR_PARK_ENTRY; } RCT2_GLOBAL(RCT2_ADDRESS_TOTAL_ADMISSIONS, uint32)++; @@ -8057,7 +8057,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) loc_696387:; uint32 value = ride->value; if (value != 0xFFFF && !peep_has_voucher_for_free_ride(peep, rideIndex)) { - if (peep->flags & PEEP_FLAGS_5) value /= 4; + if (peep->flags & PEEP_FLAGS_HAS_PAID_FOR_PARK_ENTRY) value /= 4; if (ride->price > (money16)(value * 2)) { if (bp & 4) goto loc_696658; peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_BAD_VALUE, rideIndex); @@ -8732,4 +8732,4 @@ void game_command_set_peep_name(int *eax, int *ebx, int *ecx, int *edx, int *esi (uint8*)ebp, (uint8*)edi ); -} \ No newline at end of file +} diff --git a/src/peep/peep.h b/src/peep/peep.h index b270f3c456..a1e07c466e 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -253,7 +253,7 @@ enum PEEP_FLAGS { PEEP_FLAGS_2 = (1 << 2), PEEP_FLAGS_TRACKING = (1 << 3), PEEP_FLAGS_WAVING = (1 << 4), // Makes the peep wave - PEEP_FLAGS_5 = (1 << 5), // Set on paying to enter park? + PEEP_FLAGS_HAS_PAID_FOR_PARK_ENTRY = (1 << 5), // Set on paying to enter park? PEEP_FLAGS_PHOTO = (1 << 6), // Makes the peep take a picture PEEP_FLAGS_PAINTING = (1 << 7), PEEP_FLAGS_WOW = (1 << 8), // Makes a peep WOW2 From 3590b1c1b93bf5c2d9aff7e3516eb40f0041c261 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Thu, 8 Oct 2015 10:58:17 +0200 Subject: [PATCH 0792/1173] Adjust comment --- src/peep/peep.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/peep/peep.h b/src/peep/peep.h index a1e07c466e..10ac9203c6 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -253,7 +253,7 @@ enum PEEP_FLAGS { PEEP_FLAGS_2 = (1 << 2), PEEP_FLAGS_TRACKING = (1 << 3), PEEP_FLAGS_WAVING = (1 << 4), // Makes the peep wave - PEEP_FLAGS_HAS_PAID_FOR_PARK_ENTRY = (1 << 5), // Set on paying to enter park? + PEEP_FLAGS_HAS_PAID_FOR_PARK_ENTRY = (1 << 5), // Set on paying to enter park PEEP_FLAGS_PHOTO = (1 << 6), // Makes the peep take a picture PEEP_FLAGS_PAINTING = (1 << 7), PEEP_FLAGS_WOW = (1 << 8), // Makes a peep WOW2 From ceeaa34ac80e728470c86d64296ec00938ec1f1d Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Fri, 9 Oct 2015 17:12:48 +1000 Subject: [PATCH 0793/1173] Start work on cleaning up sub_6960AB --- src/peep/peep.c | 216 +++++++++++++++++++++++++++++++----------------- src/ride/ride.h | 2 +- 2 files changed, 141 insertions(+), 77 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index c429bd551a..91f6764c43 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -70,7 +70,8 @@ static bool peep_has_ridden_ride_type(rct_peep *peep, int rideType); static void peep_on_enter_or_exit_ride(rct_peep *peep, int rideIndex, int flags); static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price); static bool peep_should_use_cash_machine(rct_peep *peep, int rideIndex); -static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp); +static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags); +static bool peep_should_go_to_shop(rct_peep *peep, int rideIndex, bool peepAtShop); static void sub_69A98C(rct_peep *peep); static void sub_68FD3A(rct_peep *peep); static bool sub_690B99(rct_peep *peep, int edge, uint8 *rideToView, uint8 *rideSeatToView); @@ -7880,80 +7881,61 @@ static void peep_reset_ride_heading(rct_peep *peep) } /** - * + * * rct2: 0x006960AB + * + * This function is called whenever a peep is deciding whether or not they want to go on a ride or visit a shop. + * They may be physically present at the ride/shop, or they may just be thinking about it. */ -static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) +static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags) { // return RCT2 CALLPROC X(0x006960AB, 0, 0, 0, rideIndex | (dh << 8), (int)peep, 0, bp) & 0x100; rct_ride *ride = GET_RIDE(rideIndex); rct_ride_type *rideEntry; + // Indicates if the peep is about to enter a queue (as opposed to entering an entrance directly from a path) + bool peepAtQueue = flags & 1; + + // Indicates whether a peep is physically at the ride, or is just thinking about it. + bool peepAtRide = !(flags & 4); + + char buffer[255]; + sprintf(buffer, "sub_6960AB: ride %d, queue %d, flags %d\n", rideIndex, entranceNum, flags); + OutputDebugString(buffer); + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_8)) { if (ride->status == RIDE_STATUS_OPEN && !(ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN)) { + + // Peeps that are leaving the park will refuse to go on any rides, with the exception of free transport rides. if (!(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_TRANSPORT_RIDE) || ride->value == 0xFFFF || ride->price != 0) { if (peep->flags & PEEP_FLAGS_LEAVING_PARK) { goto loc_69666E; } } - if (RCT2_ADDRESS(0x0097CF40, uint32)[ride->type * 2] & 0x20000) { - if (rideIndex == peep->previous_ride) goto loc_69666E; - if (ride->type != RIDE_TYPE_CASH_MACHINE) { - if (ride->type == RIDE_TYPE_FIRST_AID) { - if (peep->nausea < 128) goto loc_69666E; - goto loc_69652C; - } - rideEntry = GET_RIDE_ENTRY(ride->subtype); - if (rideEntry->shop_item == 255) { - if (peep->bathroom < 70) goto loc_69666E; - money16 ax = ride->price * 40; - if ((ax >> 8) != 0 || (ax & 0xFF) > peep->bathroom) { - if (!(bp & 4)) { - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_PAYING, rideIndex); - if (peep->happiness_growth_rate >= 60) { - peep->happiness_growth_rate -= 16; - } - ride_update_popularity(ride, 0); - } - goto loc_696658; - } - } - if (ride->price != 0) { - if (peep->cash_in_pocket <= 0) { - if (!(bp & 4)) { - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 255); - } - goto loc_696658; - } - if (ride->price > peep->cash_in_pocket) { - if (!(bp & 4)) { - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, rideIndex); - } - goto loc_696658; - } - } - } - - loc_69652C: - if (!(bp & 4)) { - ride_update_popularity(ride, 1); - if (rideIndex == peep->guest_heading_to_ride_id) { - peep_reset_ride_heading(peep); - } - } - return true; + // All of the shop logic is contained within this if statement. + if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & RIDE_TYPE_FLAG_IS_SHOP) { + return peep_should_go_to_shop(peep, rideIndex, peepAtRide); } - if (!(bp & 2)) { - if (ride->queue_length[dh] == 1000) + + // Queue logic + if (!(flags & 2)) { + + // Peeps won't join a queue that has 1000 peeps already in it. + if (ride->queue_length[entranceNum] >= 1000) goto loc_696645; - if (!(bp & 1)) { - if (ride->first_peep_in_queue[dh] != 0xFFFF) + + // Rides without queues can only have one peep waiting at a time. + if (!peepAtQueue) { + if (ride->first_peep_in_queue[entranceNum] != 0xFFFF) goto loc_696645; + } else { - if (ride->first_peep_in_queue[dh] != 0xFFFF) { - rct_peep *firstPeepInQueue = &(g_sprite_list[ride->first_peep_in_queue[dh]].peep); + + // This block of code won't allow a peep to join a queue if some sort of distance based criteria is met. + if (ride->first_peep_in_queue[entranceNum] != 0xFFFF) { + rct_peep *firstPeepInQueue = &(g_sprite_list[ride->first_peep_in_queue[entranceNum]].peep); if (abs(firstPeepInQueue->z - peep->z) <= 6) { int dx = abs(firstPeepInQueue->x - peep->x); int dy = abs(firstPeepInQueue->y - peep->y); @@ -7969,45 +7951,56 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) } } - // Check price, safety, ratings etc. + // Assuming the queue conditions are met, peeps will always go on free transport rides. + // Ride ratings, recent crashes and weather will all be ignored. if (!(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_TRANSPORT_RIDE) || ride->value == 0xFFFF || ride->price != 0) { if (peep->previous_ride == rideIndex) goto loc_69666E; + // Price checks if (ride->price != 0 && !peep_has_voucher_for_free_ride(peep, rideIndex)) { if (peep->cash_in_pocket <= 0) { - if (!(bp & 4)) { + if (peepAtRide) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 255); } goto loc_696658; } if (ride->price > peep->cash_in_pocket) { - if (!(bp & 4)) { + if (peepAtRide) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, rideIndex); } goto loc_696658; } } - if (ride->last_crash_type != RIDE_CRASH_TYPE_NONE) { - if (peep->happiness < 225) { - if (!(bp & 4)) { - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_SAFE, rideIndex); - if (peep->happiness_growth_rate >= 64) { - peep->happiness_growth_rate -= 8; - } - ride_update_popularity(ride, 0); + + // If happy enough, peeps will ignore the fact that a ride has recently crashed. + if (ride->last_crash_type != RIDE_CRASH_TYPE_NONE && peep->happiness < 225) { + if (peepAtRide) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_SAFE, rideIndex); + if (peep->happiness_growth_rate >= 64) { + peep->happiness_growth_rate -= 8; } - goto loc_696658; + ride_update_popularity(ride, 0); } + goto loc_696658; } + + if (ride->excitement != (ride_rating)0xFFFF) { if (rideIndex == peep->guest_heading_to_ride_id) { if (ride->intensity > RIDE_RATING(10, 00) && !gConfigCheat.ignore_ride_intensity) goto loc_6965F1; goto loc_696387; } + + // Peeps won't go on certain rides while it's raining. if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8) != 0) { - if ((ride->var_114 >> 5) >= 3) goto loc_696387; - if (!(bp & 4)) { + + char buffer[255]; + sprintf(buffer, "var_114: %d/255\n", ride->var_114); + OutputDebugString(buffer); + + if (ride->var_114 > 96) goto loc_696387; + if (peepAtRide) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_WHILE_RAINING, rideIndex); if (peep->happiness_growth_rate >= 64) { peep->happiness_growth_rate -= 8; @@ -8019,7 +8012,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) ride_rating maxIntensity = min((peep->intensity >> 4) * 100, 1000) + peep->happiness; ride_rating minIntensity = ((peep->intensity & 0x0F) * 100) - peep->happiness; if (ride->intensity < minIntensity && !gConfigCheat.ignore_ride_intensity) { - if (!(bp & 4)) { + if (peepAtRide) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_MORE_THRILLING, rideIndex); if (peep->happiness_growth_rate >= 64) { peep->happiness_growth_rate -= 8; @@ -8033,7 +8026,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) ride_rating minNausea = RCT2_ADDRESS(0x00982390, uint16)[(peep->nausea_tolerance & 3) * 2] - peep->happiness; ride_rating maxNausea = RCT2_ADDRESS(0x00982392, uint16)[(peep->nausea_tolerance & 3) * 2] + peep->happiness; if (ride->nausea > maxNausea && !gConfigCheat.ignore_ride_intensity) { - if (!(bp & 4)) { + if (peepAtRide) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SICKENING, rideIndex); if (peep->happiness_growth_rate >= 64) { peep->happiness_growth_rate -= 8; @@ -8054,12 +8047,13 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) if (ride->max_lateral_g > 400 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; } + // This is where the peep checks if the asking price is good enough for the ride. loc_696387:; uint32 value = ride->value; if (value != 0xFFFF && !peep_has_voucher_for_free_ride(peep, rideIndex)) { if (peep->flags & PEEP_FLAGS_HAS_PAID_FOR_PARK_ENTRY) value /= 4; if (ride->price > (money16)(value * 2)) { - if (bp & 4) goto loc_696658; + if (!peepAtRide) goto loc_696658; peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_BAD_VALUE, rideIndex); if (peep->happiness_growth_rate < 60) { peep->happiness_growth_rate -= 16; @@ -8067,7 +8061,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) ride_update_popularity(ride, 0); goto loc_696658; } - if (ride->price <= (money16)(value / 2) && bp == 4) { + if (ride->price <= (money16)(value / 2) && flags == 4) { if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_GOOD_VALUE, rideIndex); @@ -8077,7 +8071,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) } } - if (!(bp & 4)) { + if (peepAtRide) { ride_update_popularity(ride, 1); if ((peep->flags & PEEP_FLAGS_INTAMIN) && ride_type_is_intamin(ride->type)) { peep_insert_new_thought(peep, PEEP_THOUGHT_EXCITED, 255); @@ -8092,14 +8086,17 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int dh, int bp) return true; } } + +// Check has failed: peep will not go on ride. loc_69666E: if (rideIndex == peep->guest_heading_to_ride_id) { peep_reset_ride_heading(peep); } return false; +// The ride is too intense for the peep loc_6965F1: - if (!(bp & 4)) { + if (!(flags & 4)) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_INTENSE, rideIndex); if (peep->happiness_growth_rate >= 64) { peep->happiness_growth_rate -= 8; @@ -8108,11 +8105,13 @@ loc_6965F1: } goto loc_696658; +// Something queue related? When RIDE_LIFECYCLE_9 is set, peeps won't consider the ride when thinking about what to go on next. loc_696645: ride->lifecycle_flags |= RIDE_LIFECYCLE_9; +// Check has failed: peep will not go on ride, but it will still be marked as the last ride they visited. loc_696658: - if (!(bp & 4)) { + if (!(flags & 4)) { peep->previous_ride = rideIndex; peep->previous_ride_time_out = 0; } @@ -8121,6 +8120,71 @@ loc_696658: return false; } +static bool peep_should_go_to_shop(rct_peep *peep, int rideIndex, bool peepAtShop) +{ + rct_ride *ride = GET_RIDE(rideIndex); + + // Peeps won't go to the same shop twice in a row. + if (rideIndex == peep->previous_ride) goto failedCheck; + + if (ride->type == RIDE_TYPE_FIRST_AID) { + if (peep->nausea < 128) goto failedCheck; + goto successfulCheck; + } + + if (ride->type == RIDE_TYPE_TOILETS) { + if (peep->bathroom < 70) goto failedCheck; + + // The amount that peeps are willing to pay to use the Toilets scales with their bathroom stat. + // It effectively has a minimum of $0.10 (due to the check above) and a maximum of $0.60. + if (ride->price * 40 > peep->bathroom) { + if (peepAtShop) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_PAYING, rideIndex); + if (peep->happiness_growth_rate >= 60) { + peep->happiness_growth_rate -= 16; + } + ride_update_popularity(ride, 0); + } + goto failedCheck; + } + } + + if (ride->price != 0) { + if (peep->cash_in_pocket <= 0) { + if (peepAtShop) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 255); + } + goto failedCheck; + } + if (ride->price > peep->cash_in_pocket) { + if (peepAtShop) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, rideIndex); + } + goto failedCheck; + } + } + + +successfulCheck: + if (peepAtShop) { + ride_update_popularity(ride, 1); + if (rideIndex == peep->guest_heading_to_ride_id) { + peep_reset_ride_heading(peep); + } + } + return true; + +failedCheck: + if (peepAtShop) { + peep->previous_ride = rideIndex; + peep->previous_ride_time_out = 0; + } + + peep_reset_ride_heading(peep); + return false; + +} + /** * * rct2: 0x00695DD2 diff --git a/src/ride/ride.h b/src/ride/ride.h index cba6689fc4..e40b6b46b8 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -407,7 +407,7 @@ enum { RIDE_LIFECYCLE_BREAKDOWN_PENDING = 1 << 6, RIDE_LIFECYCLE_BROKEN_DOWN = 1 << 7, RIDE_LIFECYCLE_DUE_INSPECTION = 1 << 8, - RIDE_LIFECYCLE_9 = 1 << 9, + RIDE_LIFECYCLE_9 = 1 << 9, // Queue is full? RIDE_LIFECYCLE_CRASHED = 1 << 10, RIDE_LIFECYCLE_11 = 1 << 11, RIDE_LIFECYCLE_EVER_BEEN_OPENED = 1 << 12, From a5b9b356a0fcd2338eef08e173602d1d43576d30 Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Fri, 9 Oct 2015 22:11:15 +1000 Subject: [PATCH 0794/1173] Cleaned up the queue logic --- src/peep/peep.c | 77 +++++++++++++++++++++++++++---------------------- src/ride/ride.h | 2 +- 2 files changed, 44 insertions(+), 35 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 91f6764c43..aeb581017c 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -71,6 +71,7 @@ static void peep_on_enter_or_exit_ride(rct_peep *peep, int rideIndex, int flags) static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price); static bool peep_should_use_cash_machine(rct_peep *peep, int rideIndex); static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags); +static void peep_tried_to_enter_full_queue(rct_peep *peep, int rideIndex); static bool peep_should_go_to_shop(rct_peep *peep, int rideIndex, bool peepAtShop); static void sub_69A98C(rct_peep *peep); static void sub_68FD3A(rct_peep *peep); @@ -7889,10 +7890,7 @@ static void peep_reset_ride_heading(rct_peep *peep) */ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags) { - // return RCT2 CALLPROC X(0x006960AB, 0, 0, 0, rideIndex | (dh << 8), (int)peep, 0, bp) & 0x100; - rct_ride *ride = GET_RIDE(rideIndex); - rct_ride_type *rideEntry; // Indicates if the peep is about to enter a queue (as opposed to entering an entrance directly from a path) bool peepAtQueue = flags & 1; @@ -7900,10 +7898,6 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags // Indicates whether a peep is physically at the ride, or is just thinking about it. bool peepAtRide = !(flags & 4); - char buffer[255]; - sprintf(buffer, "sub_6960AB: ride %d, queue %d, flags %d\n", rideIndex, entranceNum, flags); - OutputDebugString(buffer); - if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_8)) { if (ride->status == RIDE_STATUS_OPEN && !(ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN)) { @@ -7914,37 +7908,47 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags } } - // All of the shop logic is contained within this if statement. if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & RIDE_TYPE_FLAG_IS_SHOP) { return peep_should_go_to_shop(peep, rideIndex, peepAtRide); } - // Queue logic + // Flag 2 and flag 4 are always used together, and never with flag 1. + // This is the only place that flag 2 is checked; unsure if it has any special significance. if (!(flags & 2)) { // Peeps won't join a queue that has 1000 peeps already in it. - if (ride->queue_length[entranceNum] >= 1000) - goto loc_696645; + if (ride->queue_length[entranceNum] >= 1000) { + peep_tried_to_enter_full_queue(peep, rideIndex); + return false; + } // Rides without queues can only have one peep waiting at a time. if (!peepAtQueue) { - if (ride->first_peep_in_queue[entranceNum] != 0xFFFF) - goto loc_696645; - + if (ride->first_peep_in_queue[entranceNum] != 0xFFFF) { + peep_tried_to_enter_full_queue(peep, rideIndex); + return false; + } } else { - - // This block of code won't allow a peep to join a queue if some sort of distance based criteria is met. + // Check if there's room in the queue for the peep to enter. if (ride->first_peep_in_queue[entranceNum] != 0xFFFF) { rct_peep *firstPeepInQueue = &(g_sprite_list[ride->first_peep_in_queue[entranceNum]].peep); if (abs(firstPeepInQueue->z - peep->z) <= 6) { int dx = abs(firstPeepInQueue->x - peep->x); int dy = abs(firstPeepInQueue->y - peep->y); int maxD = max(dx, dy); - if (maxD <= 13) { - if (firstPeepInQueue->time_in_queue > 10) - goto loc_696645; - if (maxD < 8) - goto loc_696645; + + // Unlike normal paths, peeps cannot overlap when queueing for a ride. + // This check enforces a minimum distance between peeps entering the queue. + if (maxD < 8) { + peep_tried_to_enter_full_queue(peep, rideIndex); + return false; + } + + // This checks if there's a peep standing still at the very end of the queue. + if (maxD <= 13 + && firstPeepInQueue->time_in_queue > 10) { + peep_tried_to_enter_full_queue(peep, rideIndex); + return false; } } } @@ -7994,11 +7998,6 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags // Peeps won't go on certain rides while it's raining. if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8) != 0) { - - char buffer[255]; - sprintf(buffer, "var_114: %d/255\n", ride->var_114); - OutputDebugString(buffer); - if (ride->var_114 > 96) goto loc_696387; if (peepAtRide) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_WHILE_RAINING, rideIndex); @@ -8082,7 +8081,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags peep_reset_ride_heading(peep); } - ride->lifecycle_flags &= ~RIDE_LIFECYCLE_9; + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_QUEUE_FULL; return true; } } @@ -8105,10 +8104,6 @@ loc_6965F1: } goto loc_696658; -// Something queue related? When RIDE_LIFECYCLE_9 is set, peeps won't consider the ride when thinking about what to go on next. -loc_696645: - ride->lifecycle_flags |= RIDE_LIFECYCLE_9; - // Check has failed: peep will not go on ride, but it will still be marked as the last ride they visited. loc_696658: if (!(flags & 4)) { @@ -8120,6 +8115,20 @@ loc_696658: return false; } +/* + * When the queue is full, peeps will ignore the ride when thinking about what to go on next. + * Does not effect peeps that walk up to the queue entrance. + * This flag is reset the next time a peep successfully joins the queue. + */ +static void peep_tried_to_enter_full_queue(rct_peep *peep, int rideIndex) +{ + rct_ride *ride = GET_RIDE(rideIndex); + + ride->lifecycle_flags |= RIDE_LIFECYCLE_QUEUE_FULL; + peep->previous_ride = rideIndex; + peep->previous_ride_time_out = 0; +} + static bool peep_should_go_to_shop(rct_peep *peep, int rideIndex, bool peepAtShop) { rct_ride *ride = GET_RIDE(rideIndex); @@ -8257,7 +8266,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) continue; rct_ride *ride = GET_RIDE(i); - if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_9)) { + if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_QUEUE_FULL)) { if (sub_6960AB(peep, i, 0, 6)) { *nextPotentialRide++ = i; numPotentialRides++; @@ -8366,7 +8375,7 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) continue; rct_ride *ride = GET_RIDE(i); - if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_9)) { + if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_QUEUE_FULL)) { if (sub_6960AB(peep, i, 0, 6)) { *nextPotentialRide++ = i; numPotentialRides++; @@ -8478,7 +8487,7 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl continue; rct_ride *ride = GET_RIDE(i); - if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_9)) { + if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_QUEUE_FULL)) { if (sub_6960AB(peep, i, 0, 6)) { *nextPotentialRide++ = i; numPotentialRides++; diff --git a/src/ride/ride.h b/src/ride/ride.h index e40b6b46b8..88eec5e4e3 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -407,7 +407,7 @@ enum { RIDE_LIFECYCLE_BREAKDOWN_PENDING = 1 << 6, RIDE_LIFECYCLE_BROKEN_DOWN = 1 << 7, RIDE_LIFECYCLE_DUE_INSPECTION = 1 << 8, - RIDE_LIFECYCLE_9 = 1 << 9, // Queue is full? + RIDE_LIFECYCLE_QUEUE_FULL = 1 << 9, RIDE_LIFECYCLE_CRASHED = 1 << 10, RIDE_LIFECYCLE_11 = 1 << 11, RIDE_LIFECYCLE_EVER_BEEN_OPENED = 1 << 12, From 6dd04bbb1a9bcbbc0cf4cdc4d315d95cd076d81c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 9 Oct 2015 17:02:45 +0200 Subject: [PATCH 0795/1173] Don't copy more memory than we own --- src/core/Memory.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/Memory.hpp b/src/core/Memory.hpp index fe9ef9bbf4..52cacc5286 100644 --- a/src/core/Memory.hpp +++ b/src/core/Memory.hpp @@ -48,7 +48,6 @@ namespace Memory { template T *CopyArray(T *dst, const T *src, size_t count) { - count *= sizeof(T); if (count == 0) return (T*)dst; return (T*)memcpy((void*)dst, (const void*)src, count * sizeof(T)); } From fb9a5833d6c7f3cc8afd5741c0ede47edc1535d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 9 Oct 2015 17:02:56 +0200 Subject: [PATCH 0796/1173] Fix override offsets while loading LanguagePack When loading language pack, a check is made not to double entries. This check was wrong, because it tried to use offsets as pointers to strings. These offsets are later rewritten to actual pointers in remaining part of LanguagePack::LanguagePack --- src/core/StringBuilder.hpp | 2 +- src/localisation/LanguagePack.cpp | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/core/StringBuilder.hpp b/src/core/StringBuilder.hpp index 3c39617a4a..b92f4001b0 100644 --- a/src/core/StringBuilder.hpp +++ b/src/core/StringBuilder.hpp @@ -125,7 +125,7 @@ private: { if (_capacity > capacity) return; - _capacity = Math::Max(8U, _capacity); + _capacity = Math::Max((size_t)8, _capacity); while (_capacity < capacity) { _capacity *= 2; } diff --git a/src/localisation/LanguagePack.cpp b/src/localisation/LanguagePack.cpp index b4386129ed..4a532c3c82 100644 --- a/src/localisation/LanguagePack.cpp +++ b/src/localisation/LanguagePack.cpp @@ -187,7 +187,10 @@ LanguagePack::ScenarioOverride *LanguagePack::GetScenarioOverride(const utf8 *sc for (size_t i = 0; i < _scenarioOverrides.size(); i++) { ScenarioOverride *so = &_scenarioOverrides[i]; - if (_stricmp(so->name, scenarioIdentifier) == 0) { + // At this point ScenarioOverrides were not yet rewritten to point at + // strings, but rather still hold offsets from base. + const utf8 *name = _stringDataSB.GetBuffer() + (size_t)so->name; + if (_stricmp(name, scenarioIdentifier) == 0) { return so; } } From 74d0b033df0ec21b4125a8c8e2c29aeb5cf541cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 9 Oct 2015 18:22:37 +0200 Subject: [PATCH 0797/1173] Name RCT2_ADDRESS_PALETTE --- src/addresses.h | 18 +++++++------ src/drawing/drawing.c | 32 +++++++++++------------ src/game.c | 52 +++++++++++++++++++------------------- src/interface/screenshot.c | 18 ++++++------- 4 files changed, 61 insertions(+), 59 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 47c1513827..8b33a6cf47 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John, Kevin Burke, Matthias Lanzinger * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -556,7 +556,7 @@ #define RCT2_ADDRESS_NEW_WINDOW_PTR 0x014234B8 #define RCT2_ADDRESS_VIEWPORT_LIST 0x014234BC -// Null Terminated list of active viewport pointers. +// Null Terminated list of active viewport pointers. // This is also the end of RCT2_ADDRESS_VIEWPORT_LIST. #define RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY 0x01423570 @@ -632,6 +632,8 @@ #define RCT2_ADDRESS_INPUT_QUEUE 0x01424340 +#define RCT2_ADDRESS_PALETTE 0x01424680 + #define RCT2_ADDRESS_AUDIO_INFO 0x01425B40 #define RCT2_ADDRESS_SOUND_CHANNEL_LIST 0x014262E0 @@ -707,7 +709,7 @@ static int RCT2_CALLPROC_X(int address, int _eax, int _ebx, int _ecx, int _edx, add esp, 4 \n\ pop ebp \n\ pop ebx \n\ - " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp) + " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp) : : "eax","ecx","edx","esi","edi" ); @@ -758,7 +760,7 @@ static int RCT2_CALLFUNC_X(int address, int *_eax, int *_ebx, int *_ecx, int *_e // Call function call [esp] - + // Store output eax push eax push ebp @@ -778,7 +780,7 @@ static int RCT2_CALLFUNC_X(int address, int *_eax, int *_ebx, int *_ecx, int *_e mov [eax], ecx // Pop ebx reg into ecx - pop ecx + pop ecx mov eax, [_ebx] mov[eax], ecx @@ -796,7 +798,7 @@ static int RCT2_CALLFUNC_X(int address, int *_eax, int *_ebx, int *_ecx, int *_e lahf // Pop address pop ebp - + pop ebx pop ebp } @@ -866,7 +868,7 @@ static int RCT2_CALLFUNC_X(int address, int *_eax, int *_ebx, int *_ecx, int *_e \n\ pop ebx \n\ pop ebp \n\ - " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp) + " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp) : : "eax","ecx","edx","esi","edi" ); diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index cc323848b6..c1fac53c64 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -38,7 +38,7 @@ int _screenDirtyBlocksSize = 0; uint32 rainPixels[MAX_RAIN_PIXELS]; //Originally 0x9ABE0C, 12 elements from 0xF3 are the peep top colour, 12 elements from 0xCA are peep trouser colour -const uint8 peep_palette[0x100] = { +const uint8 peep_palette[0x100] = { 0x00, 0xF3, 0xF4, 0xF5, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, @@ -138,8 +138,8 @@ void gfx_transpose_palette(int pal, unsigned char product) { rct_g1_element g1 = g1Elements[pal]; int width = g1.width; - int x = g1.x_offset; - uint8* dest_pointer = (uint8*)&(RCT2_ADDRESS(0x01424680, uint8)[x * 4]); + int x = g1.x_offset; + uint8* dest_pointer = (uint8*)&(RCT2_ADDRESS(RCT2_ADDRESS_PALETTE, uint8)[x * 4]); uint8* source_pointer = g1.offset; for (; width > 0; width--) { @@ -149,7 +149,7 @@ void gfx_transpose_palette(int pal, unsigned char product) source_pointer += 3; dest_pointer += 4; } - platform_update_palette((char*)0x01424680, 10, 236); + platform_update_palette((char*)RCT2_ADDRESS_PALETTE, 10, 236); } /* rct2: 0x006837E3 */ @@ -165,7 +165,7 @@ void load_palette(){ rct_g1_element g1 = g1Elements[palette]; int width = g1.width; int x = g1.x_offset; - uint8* dest_pointer = (uint8*)&(RCT2_ADDRESS(0x01424680, uint8)[x * 4]); + uint8* dest_pointer = (uint8*)&(RCT2_ADDRESS(RCT2_ADDRESS_PALETTE, uint8)[x * 4]); uint8* source_pointer = g1.offset; for (; width > 0; width--) { @@ -175,7 +175,7 @@ void load_palette(){ source_pointer += 3; dest_pointer += 4; } - platform_update_palette((char*)0x01424680, 10, 236); + platform_update_palette((char*)RCT2_ADDRESS_PALETTE, 10, 236); } /** @@ -204,7 +204,7 @@ uint8* gfx_get_dirty_blocks() } /** - * + * * rct2: 0x006E732D * left (ax) * top (bx) @@ -264,7 +264,7 @@ void gfx_draw_all_dirty_blocks() for (xx = x; xx < x + columns; xx++) if (screenDirtyBlocks[yy * RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, uint32) + xx] == 0) goto endRowCheck; - + endRowCheck: rows = yy - y; gfx_draw_dirty_blocks(x, y, columns, rows); @@ -295,8 +295,8 @@ static void gfx_draw_dirty_blocks(int x, int y, int columns, int rows) } /** - * - * rct2: 0x006E7499 + * + * rct2: 0x006E7499 * left (ax) * top (bx) * right (dx) @@ -435,7 +435,7 @@ void gfx_draw_rain(int left, int top, int width, int height, sint32 x_start, sin //Store colour and position *pixel_store++ = (x_pixel_offset << 8) | current_pixel; - + } } } @@ -460,7 +460,7 @@ void redraw_rain() } rct_window *window = window_get_main(); uint32 numPixels = window->width * window->height; - + uint32 *rain_pixels = rainPixels; if (rain_pixels) { uint8 *screen_pixels = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo)->bits; @@ -485,13 +485,13 @@ void gfx_invalidate_pickedup_peep() int sprite = RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_SPRITE, sint32); if (sprite != -1) { sprite = sprite & 0x7FFFF; - + rct_g1_element *g1_elements = &g1Elements[sprite]; int left = RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_X, sint16) + g1_elements->x_offset; int top = RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_Y, sint16) + g1_elements->y_offset; int right = left + g1_elements->width; int bottom = top + g1_elements->height; - + gfx_set_dirty_blocks(left, top, right, bottom); } } diff --git a/src/game.c b/src/game.c index b55434f975..c9e574bbbe 100644 --- a/src/game.c +++ b/src/game.c @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John, Peter Hill * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ - + #include "addresses.h" #include "audio/audio.h" #include "config.h" @@ -104,7 +104,7 @@ void game_reduce_game_speed() } /** - * + * * rct2: 0x0066B5C0 (part of 0x0066B3E8) */ void game_create_windows() @@ -134,12 +134,12 @@ void update_palette_effects() int xoffset = g1_element.x_offset; xoffset = xoffset * 4; for (int i = 0; i < g1_element.width; i++) { - RCT2_ADDRESS(0x01424680 + xoffset, uint8)[(i * 4) + 0] = -((0xFF - g1_element.offset[(i * 3) + 0]) / 2) - 1; - RCT2_ADDRESS(0x01424680 + xoffset, uint8)[(i * 4) + 1] = -((0xFF - g1_element.offset[(i * 3) + 1]) / 2) - 1; - RCT2_ADDRESS(0x01424680 + xoffset, uint8)[(i * 4) + 2] = -((0xFF - g1_element.offset[(i * 3) + 2]) / 2) - 1; + RCT2_ADDRESS(RCT2_ADDRESS_PALETTE + xoffset, uint8)[(i * 4) + 0] = -((0xFF - g1_element.offset[(i * 3) + 0]) / 2) - 1; + RCT2_ADDRESS(RCT2_ADDRESS_PALETTE + xoffset, uint8)[(i * 4) + 1] = -((0xFF - g1_element.offset[(i * 3) + 1]) / 2) - 1; + RCT2_ADDRESS(RCT2_ADDRESS_PALETTE + xoffset, uint8)[(i * 4) + 2] = -((0xFF - g1_element.offset[(i * 3) + 2]) / 2) - 1; } RCT2_GLOBAL(0x014241BC, uint32) = 2; - platform_update_palette(RCT2_ADDRESS(0x01424680, uint8), 10, 236); + platform_update_palette(RCT2_ADDRESS(RCT2_ADDRESS_PALETTE, uint8), 10, 236); RCT2_GLOBAL(0x014241BC, uint32) = 0; RCT2_GLOBAL(RCT2_ADDRESS_LIGHTNING_ACTIVE, uint8)++; } else { @@ -155,9 +155,9 @@ void update_palette_effects() int xoffset = g1_element.x_offset; xoffset = xoffset * 4; for (int i = 0; i < g1_element.width; i++) { - RCT2_ADDRESS(0x01424680 + xoffset, uint8)[(i * 4) + 0] = g1_element.offset[(i * 3) + 0]; - RCT2_ADDRESS(0x01424680 + xoffset, uint8)[(i * 4) + 1] = g1_element.offset[(i * 3) + 1]; - RCT2_ADDRESS(0x01424680 + xoffset, uint8)[(i * 4) + 2] = g1_element.offset[(i * 3) + 2]; + RCT2_ADDRESS(RCT2_ADDRESS_PALETTE + xoffset, uint8)[(i * 4) + 0] = g1_element.offset[(i * 3) + 0]; + RCT2_ADDRESS(RCT2_ADDRESS_PALETTE + xoffset, uint8)[(i * 4) + 1] = g1_element.offset[(i * 3) + 1]; + RCT2_ADDRESS(RCT2_ADDRESS_PALETTE + xoffset, uint8)[(i * 4) + 2] = g1_element.offset[(i * 3) + 2]; } } @@ -227,11 +227,11 @@ void update_palette_effects() } RCT2_GLOBAL(0x014241BC, uint32) = 2; - platform_update_palette(RCT2_ADDRESS(0x01424680, uint8), 230, 16); + platform_update_palette(RCT2_ADDRESS(RCT2_ADDRESS_PALETTE, uint8), 230, 16); RCT2_GLOBAL(0x014241BC, uint32) = 0; if (RCT2_GLOBAL(RCT2_ADDRESS_LIGHTNING_ACTIVE, uint8) == 2) { RCT2_GLOBAL(0x014241BC, uint32) = 2; - platform_update_palette(RCT2_ADDRESS(0x01424680, uint8), 10, 236); + platform_update_palette(RCT2_ADDRESS(RCT2_ADDRESS_PALETTE, uint8), 10, 236); RCT2_GLOBAL(0x014241BC, uint32) = 0; RCT2_GLOBAL(RCT2_ADDRESS_LIGHTNING_ACTIVE, uint8) = 0; } @@ -385,7 +385,7 @@ void game_logic_update() } /** - * + * * rct2: 0x0069C62C * * @param cost (ebp) @@ -408,7 +408,7 @@ static uint32 game_do_command_table[58]; static GAME_COMMAND_POINTER* new_game_command_table[58]; /** - * + * * rct2: 0x006677F2 * * @param flags (ebx) @@ -449,13 +449,13 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * (command == GAME_COMMAND_PLACE_FENCE || command == GAME_COMMAND_PLACE_SCENERY || command == GAME_COMMAND_PLACE_LARGE_SCENERY || - command == GAME_COMMAND_PLACE_BANNER || + command == GAME_COMMAND_PLACE_BANNER || command == GAME_COMMAND_PLACE_PATH)) { scenery_remove_ghost_tool_placement(); } *ebx &= ~GAME_COMMAND_FLAG_APPLY; - + // Primary command if (game_do_command_table[command] == 0) { new_game_command_table[command](eax, ebx, ecx, edx, esi, edi, ebp); @@ -517,7 +517,7 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * if (RCT2_GLOBAL(0x009A8C28, uint8) != 0) return cost; - // + // if (!(flags & 0x20)) { // Update money balance finance_payment(cost, RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) / 4); @@ -555,7 +555,7 @@ void pause_toggle() } /** - * + * * rct2: 0x00667C15 */ void game_pause_toggle(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) @@ -567,7 +567,7 @@ void game_pause_toggle(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *ed } /** - * + * * rct2: 0x0066DB5F */ static void game_load_or_quit(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) @@ -720,7 +720,7 @@ void game_convert_strings_to_rct2(rct_s6_data *s6) } /** - * + * * rct2: 0x00675E1B */ int game_load_sv6(SDL_RWops* rw) @@ -845,7 +845,7 @@ int game_load_network(SDL_RWops* rw) } /** - * + * * rct2: 0x00675E1B */ int game_load_save(const char *path) @@ -939,7 +939,7 @@ void reset_all_sprite_quadrant_placements() } /** - * + * * rct2: 0x0066DBB7 */ static void load_game() @@ -1071,7 +1071,7 @@ void rct2_exit_reason(rct_string_id title, rct_string_id body){ /** - * + * * rct2: 0x006E3879 */ void rct2_exit() @@ -1082,7 +1082,7 @@ void rct2_exit() } /** - * + * * rct2: 0x0066DB79 */ void game_load_or_quit_no_save_prompt() @@ -1134,7 +1134,7 @@ static uint32 game_do_command_table[58] = { 0, 0, // 20 0, - 0, + 0, 0, 0, 0x0068BC01, diff --git a/src/interface/screenshot.c b/src/interface/screenshot.c index be15586f89..43c1584eec 100644 --- a/src/interface/screenshot.c +++ b/src/interface/screenshot.c @@ -203,9 +203,9 @@ int screenshot_dump_bmp() // Palette memset(buffer, 0, 246 * 4); for (i = 0; i < 246; i++) { - buffer[i * 4 + 0] = RCT2_ADDRESS(0x01424680, uint8)[i * 4 + 0]; - buffer[i * 4 + 1] = RCT2_ADDRESS(0x01424680, uint8)[i * 4 + 1]; - buffer[i * 4 + 2] = RCT2_ADDRESS(0x01424680, uint8)[i * 4 + 2]; + buffer[i * 4 + 0] = RCT2_ADDRESS(RCT2_ADDRESS_PALETTE, uint8)[i * 4 + 0]; + buffer[i * 4 + 1] = RCT2_ADDRESS(RCT2_ADDRESS_PALETTE, uint8)[i * 4 + 1]; + buffer[i * 4 + 2] = RCT2_ADDRESS(RCT2_ADDRESS_PALETTE, uint8)[i * 4 + 2]; } bytesWritten = SDL_RWwrite(fp, buffer, sizeof(char), 246 * 4); @@ -267,9 +267,9 @@ int screenshot_dump_png() padding = dpi->pitch; for (i = 0; i < 256; i++) { - b = RCT2_ADDRESS(0x01424680, uint8)[i * 4 + 0]; - g = RCT2_ADDRESS(0x01424680, uint8)[i * 4 + 1]; - r = RCT2_ADDRESS(0x01424680, uint8)[i * 4 + 2]; + b = RCT2_ADDRESS(RCT2_ADDRESS_PALETTE, uint8)[i * 4 + 0]; + g = RCT2_ADDRESS(RCT2_ADDRESS_PALETTE, uint8)[i * 4 + 1]; + r = RCT2_ADDRESS(RCT2_ADDRESS_PALETTE, uint8)[i * 4 + 2]; lodepng_palette_add(&state.info_raw, r, g, b, a); } @@ -329,9 +329,9 @@ bool screenshot_write_png(rct_drawpixelinfo *dpi, const char *path) for (int i = 0; i < 256; i++) { unsigned char r, g, b, a = 255; - b = RCT2_ADDRESS(0x01424680, uint8)[i * 4 + 0]; - g = RCT2_ADDRESS(0x01424680, uint8)[i * 4 + 1]; - r = RCT2_ADDRESS(0x01424680, uint8)[i * 4 + 2]; + b = RCT2_ADDRESS(RCT2_ADDRESS_PALETTE, uint8)[i * 4 + 0]; + g = RCT2_ADDRESS(RCT2_ADDRESS_PALETTE, uint8)[i * 4 + 1]; + r = RCT2_ADDRESS(RCT2_ADDRESS_PALETTE, uint8)[i * 4 + 2]; lodepng_palette_add(&state.info_raw, r, g, b, a); } From 59cdff7055b078eb387e691a3f3f8c1ed1d6c873 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 9 Oct 2015 22:11:28 +0100 Subject: [PATCH 0798/1173] Potential fix to #639. The scenario name was missing its null to indicate the end of the string. This would cause scenarios to have odd fileNames that are compared against to compare a scenario against the scenario list --- src/scenario.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scenario.c b/src/scenario.c index b1b7ae7a45..ea2b96af52 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -236,7 +236,7 @@ int scenario_load_and_play_from_path(const char *path) if (!scenario_load(path)) return 0; - int len = strnlen(path, MAX_PATH); + int len = strnlen(path, MAX_PATH) + 1; strncpy(_scenarioPath, path, len); if (len == MAX_PATH) { From 5a59e7fed4063143a661199555423a0c5e0fce92 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 9 Oct 2015 22:25:30 +0100 Subject: [PATCH 0799/1173] Fix issue with last commit --- src/scenario.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scenario.c b/src/scenario.c index ea2b96af52..6c5c8618f8 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -238,7 +238,7 @@ int scenario_load_and_play_from_path(const char *path) int len = strnlen(path, MAX_PATH) + 1; strncpy(_scenarioPath, path, len); - if (len == MAX_PATH) + if (len - 1 == MAX_PATH) { _scenarioPath[MAX_PATH - 1] = '\0'; log_warning("truncated string %s", _scenarioPath); From 2b66253d285e38b7c3aafbc5b033e74b4fa771a9 Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Sat, 10 Oct 2015 18:53:48 +1000 Subject: [PATCH 0800/1173] Replaced remaining gotos with function calls --- src/peep/peep.c | 275 ++++++++++++++++++++++++++++-------------------- src/peep/peep.h | 2 +- src/ride/ride.h | 1 + 3 files changed, 161 insertions(+), 117 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index aeb581017c..234a2ae47f 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -70,7 +70,9 @@ static bool peep_has_ridden_ride_type(rct_peep *peep, int rideType); static void peep_on_enter_or_exit_ride(rct_peep *peep, int rideIndex, int flags); static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price); static bool peep_should_use_cash_machine(rct_peep *peep, int rideIndex); -static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags); +static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNum, int flags); +static void peep_ride_is_too_intense(rct_peep *peep, int rideIndex, bool peepAtRide); +static void peep_chose_not_to_go_on_ride(rct_peep *peep, int rideIndex, bool peepAtRide, bool updateLastRide); static void peep_tried_to_enter_full_queue(rct_peep *peep, int rideIndex); static bool peep_should_go_to_shop(rct_peep *peep, int rideIndex, bool peepAtShop); static void sub_69A98C(rct_peep *peep); @@ -462,7 +464,7 @@ static void sub_68F41A(rct_peep *peep, int index) } if (peep->state == PEEP_STATE_WALKING && - peep->outside_of_park == 0 && + peep->outside_of_park == 0 && !(peep->flags & PEEP_FLAGS_LEAVING_PARK) && peep->no_of_rides == 0 && peep->guest_heading_to_ride_id == 0xFF){ @@ -6093,7 +6095,7 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m peep->var_F4 = 0; uint8 stationNum = (map_element->properties.entrance.index >> 4) & 0x7; - if (!sub_6960AB(peep, rideIndex, stationNum, 0)){ + if (!peep_should_go_on_ride(peep, rideIndex, stationNum, 0)){ peep->var_79 = rideIndex; return peep_return_to_center_of_tile(peep); } @@ -6463,7 +6465,7 @@ static int peep_interact_with_path(rct_peep* peep, sint16 x, sint16 y, rct_map_e peep->var_F4 = 0; uint8 stationNum = (map_element->properties.path.additions & 0x70) >> 4; - if (!sub_6960AB(peep, rideIndex, stationNum, 1)){ + if (!peep_should_go_on_ride(peep, rideIndex, stationNum, 1)){ peep->var_79 = rideIndex; return peep_return_to_center_of_tile(peep); } @@ -6532,7 +6534,7 @@ static int peep_interact_with_shop(rct_peep* peep, sint16 x, sint16 y, rct_map_e if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_PEEP_SHOULD_GO_INSIDE_FACILITY)){ peep->var_F4 = 0; - if (!sub_6960AB(peep, rideIndex, 0, 0)) + if (!peep_should_go_on_ride(peep, rideIndex, 0, 0)) return peep_return_to_center_of_tile(peep); money16 cost = ride->price; @@ -7888,14 +7890,14 @@ static void peep_reset_ride_heading(rct_peep *peep) * This function is called whenever a peep is deciding whether or not they want to go on a ride or visit a shop. * They may be physically present at the ride/shop, or they may just be thinking about it. */ -static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags) +static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNum, int flags) { rct_ride *ride = GET_RIDE(rideIndex); // Indicates if the peep is about to enter a queue (as opposed to entering an entrance directly from a path) bool peepAtQueue = flags & 1; - // Indicates whether a peep is physically at the ride, or is just thinking about it. + // Indicates whether a peep is physically at the ride, or is just thinking about going on the ride. bool peepAtRide = !(flags & 4); if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_8)) { @@ -7904,7 +7906,8 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags // Peeps that are leaving the park will refuse to go on any rides, with the exception of free transport rides. if (!(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_TRANSPORT_RIDE) || ride->value == 0xFFFF || ride->price != 0) { if (peep->flags & PEEP_FLAGS_LEAVING_PARK) { - goto loc_69666E; + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, false); + return false; } } @@ -7912,10 +7915,9 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags return peep_should_go_to_shop(peep, rideIndex, peepAtRide); } - // Flag 2 and flag 4 are always used together, and never with flag 1. - // This is the only place that flag 2 is checked; unsure if it has any special significance. - if (!(flags & 2)) { - + // This used to check !(flags & 2), but the function is only ever called with flags = 0, 1 or 6. + // This means we can use the existing !(flags & 4) check. + if (peepAtRide) { // Peeps won't join a queue that has 1000 peeps already in it. if (ride->queue_length[entranceNum] >= 1000) { peep_tried_to_enter_full_queue(peep, rideIndex); @@ -7928,7 +7930,8 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags peep_tried_to_enter_full_queue(peep, rideIndex); return false; } - } else { + } + else { // Check if there's room in the queue for the peep to enter. if (ride->first_peep_in_queue[entranceNum] != 0xFFFF) { rct_peep *firstPeepInQueue = &(g_sprite_list[ride->first_peep_in_queue[entranceNum]].peep); @@ -7958,22 +7961,25 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags // Assuming the queue conditions are met, peeps will always go on free transport rides. // Ride ratings, recent crashes and weather will all be ignored. if (!(RideData4[ride->type].flags & RIDE_TYPE_FLAG4_TRANSPORT_RIDE) || ride->value == 0xFFFF || ride->price != 0) { - if (peep->previous_ride == rideIndex) - goto loc_69666E; + if (peep->previous_ride == rideIndex) { + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, false); + return false; + } - // Price checks + // Basic price checks if (ride->price != 0 && !peep_has_voucher_for_free_ride(peep, rideIndex)) { - if (peep->cash_in_pocket <= 0) { - if (peepAtRide) { - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 255); - } - goto loc_696658; - } + if (ride->price > peep->cash_in_pocket) { if (peepAtRide) { - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, rideIndex); + if (peep->cash_in_pocket <= 0) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 255); + } + else { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, rideIndex); + } } - goto loc_696658; + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); + return false; } } @@ -7986,19 +7992,23 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags } ride_update_popularity(ride, 0); } - goto loc_696658; + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); + return false; } if (ride->excitement != (ride_rating)0xFFFF) { + // If a peep has already decided that they're going to go on a ride, they'll skip the weather and + // excitment check and will only do a basic intensity check when they arrive at the ride itself. if (rideIndex == peep->guest_heading_to_ride_id) { - if (ride->intensity > RIDE_RATING(10, 00) && !gConfigCheat.ignore_ride_intensity) goto loc_6965F1; - goto loc_696387; + if (ride->intensity > RIDE_RATING(10, 00) && !gConfigCheat.ignore_ride_intensity) { + peep_ride_is_too_intense(peep, rideIndex, peepAtRide); + return false; + } } // Peeps won't go on certain rides while it's raining. - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8) != 0) { - if (ride->var_114 > 96) goto loc_696387; + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8) != 0 && ride->var_114 < 96) { if (peepAtRide) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_WHILE_RAINING, rideIndex); if (peep->happiness_growth_rate >= 64) { @@ -8006,63 +8016,98 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags } ride_update_popularity(ride, 0); } - goto loc_696658; + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); + return false; } - ride_rating maxIntensity = min((peep->intensity >> 4) * 100, 1000) + peep->happiness; - ride_rating minIntensity = ((peep->intensity & 0x0F) * 100) - peep->happiness; - if (ride->intensity < minIntensity && !gConfigCheat.ignore_ride_intensity) { - if (peepAtRide) { - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_MORE_THRILLING, rideIndex); - if (peep->happiness_growth_rate >= 64) { - peep->happiness_growth_rate -= 8; - } - ride_update_popularity(ride, 0); - } - goto loc_696658; - } - if (ride->intensity > maxIntensity && !gConfigCheat.ignore_ride_intensity) goto loc_6965F1; - ride_rating minNausea = RCT2_ADDRESS(0x00982390, uint16)[(peep->nausea_tolerance & 3) * 2] - peep->happiness; - ride_rating maxNausea = RCT2_ADDRESS(0x00982392, uint16)[(peep->nausea_tolerance & 3) * 2] + peep->happiness; - if (ride->nausea > maxNausea && !gConfigCheat.ignore_ride_intensity) { - if (peepAtRide) { - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SICKENING, rideIndex); - if (peep->happiness_growth_rate >= 64) { - peep->happiness_growth_rate -= 8; + if (!gConfigCheat.ignore_ride_intensity) { + // Intensity calculations. Even though the max intensity can go up to 15, it's capped + // at 10.0 (before happiness calculations). A full happiness bar will increase the max + // intensity and decrease the min intensity by about 2.5. + ride_rating maxIntensity = min((peep->intensity >> 4) * 100, 1000) + peep->happiness; + ride_rating minIntensity = ((peep->intensity & 0x0F) * 100) - peep->happiness; + if (ride->intensity < minIntensity) { + if (peepAtRide) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_MORE_THRILLING, rideIndex); + if (peep->happiness_growth_rate >= 64) { + peep->happiness_growth_rate -= 8; + } + ride_update_popularity(ride, 0); } - ride_update_popularity(ride, 0); + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); + return false; + } + if (ride->intensity > maxIntensity) { + peep_ride_is_too_intense(peep, rideIndex, peepAtRide); + return false; + } + + // Nausea calculations + ride_rating minNausea = RCT2_ADDRESS(0x00982390, uint16)[(peep->nausea_tolerance & 3) * 2] - peep->happiness; + ride_rating maxNausea = RCT2_ADDRESS(0x00982392, uint16)[(peep->nausea_tolerance & 3) * 2] + peep->happiness; + if (ride->nausea > maxNausea) { + if (peepAtRide) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SICKENING, rideIndex); + if (peep->happiness_growth_rate >= 64) { + peep->happiness_growth_rate -= 8; + } + ride_update_popularity(ride, 0); + } + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); + return false; + } + if (ride->nausea >= 140 && peep->nausea > 160) { + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, false); + return false; } - goto loc_696658; } - if (ride->nausea >= 140 && peep->nausea > 160 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; - goto loc_696387; } - // Check G forces (basic intensity look check) - if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES) { - if ((scenario_rand() & 0xFFFF) > 0x1999U) goto loc_69666E; - if (ride->max_positive_vertical_g > 500 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; - if (ride->max_negative_vertical_g < -400 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; - if (ride->max_lateral_g > 400 && !gConfigCheat.ignore_ride_intensity) goto loc_69666E; + // If the ride has not yet been rated and is capable of having g-forces, + // there's a 90% chance that the peep will ignore it. + if ((ride->excitement == (ride_rating)0xFFFF) + && (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_PEEP_CHECK_GFORCES)) { + if ((scenario_rand() & 0xFFFF) > 0x1999U) { + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, false); + return false; + } + + if (!gConfigCheat.ignore_ride_intensity) { + if (ride->max_positive_vertical_g > FIXED_2DP(5, 00) + || ride->max_negative_vertical_g < FIXED_2DP(-4, 00) + || ride->max_lateral_g > FIXED_2DP(4, 00)) { + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, false); + return false; + } + } } - // This is where the peep checks if the asking price is good enough for the ride. - loc_696387:; uint32 value = ride->value; + + // If the value of the ride hasn't yet been calculated, peeps will be willing to pay any amount for the ride. if (value != 0xFFFF && !peep_has_voucher_for_free_ride(peep, rideIndex)) { - if (peep->flags & PEEP_FLAGS_HAS_PAID_FOR_PARK_ENTRY) value /= 4; + + // The amount peeps are willing to pay is decreased by 75% if they had to pay to enter the park. + if (peep->flags & PEEP_FLAGS_HAS_PAID_FOR_PARK_ENTRY) + value /= 4; + + // Peeps won't pay more than twice the value of the ride. if (ride->price > (money16)(value * 2)) { - if (!peepAtRide) goto loc_696658; - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_BAD_VALUE, rideIndex); - if (peep->happiness_growth_rate < 60) { - peep->happiness_growth_rate -= 16; + if (peepAtRide) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_BAD_VALUE, rideIndex); + if (peep->happiness_growth_rate < 60) { + peep->happiness_growth_rate -= 16; + } + ride_update_popularity(ride, 0); } - ride_update_popularity(ride, 0); - goto loc_696658; + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); + return false; } - if (ride->price <= (money16)(value / 2) && flags == 4) { + + // A ride is good value if the price is 50% or less of the ride value and the peep didn't pay to enter the park. + if (ride->price <= (money16)(value / 2) && peepAtRide) { if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) { + if (!(peep->flags & PEEP_FLAGS_HAS_PAID_FOR_PARK_ENTRY)) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_GOOD_VALUE, rideIndex); } } @@ -8070,6 +8115,7 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags } } + // At this point, the peep has decided to go on the ride. if (peepAtRide) { ride_update_popularity(ride, 1); if ((peep->flags & PEEP_FLAGS_INTAMIN) && ride_type_is_intamin(ride->type)) { @@ -8086,33 +8132,34 @@ static bool sub_6960AB(rct_peep *peep, int rideIndex, int entranceNum, int flags } } -// Check has failed: peep will not go on ride. -loc_69666E: - if (rideIndex == peep->guest_heading_to_ride_id) { - peep_reset_ride_heading(peep); - } + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, false); return false; +} -// The ride is too intense for the peep -loc_6965F1: - if (!(flags & 4)) { +static void peep_ride_is_too_intense(rct_peep *peep, int rideIndex, bool peepAtRide) +{ + rct_ride *ride = GET_RIDE(rideIndex); + + if (peepAtRide) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_INTENSE, rideIndex); if (peep->happiness_growth_rate >= 64) { peep->happiness_growth_rate -= 8; } ride_update_popularity(ride, 0); } - goto loc_696658; + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); +} -// Check has failed: peep will not go on ride, but it will still be marked as the last ride they visited. -loc_696658: - if (!(flags & 4)) { +static void peep_chose_not_to_go_on_ride(rct_peep *peep, int rideIndex, bool peepAtRide, bool updateLastRide) +{ + if (peepAtRide && updateLastRide) { peep->previous_ride = rideIndex; peep->previous_ride_time_out = 0; } - peep_reset_ride_heading(peep); - return false; + if (rideIndex == peep->guest_heading_to_ride_id) { + peep_reset_ride_heading(peep); + } } /* @@ -8134,15 +8181,16 @@ static bool peep_should_go_to_shop(rct_peep *peep, int rideIndex, bool peepAtSho rct_ride *ride = GET_RIDE(rideIndex); // Peeps won't go to the same shop twice in a row. - if (rideIndex == peep->previous_ride) goto failedCheck; - - if (ride->type == RIDE_TYPE_FIRST_AID) { - if (peep->nausea < 128) goto failedCheck; - goto successfulCheck; + if (rideIndex == peep->previous_ride) { + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtShop, true); + return false; } if (ride->type == RIDE_TYPE_TOILETS) { - if (peep->bathroom < 70) goto failedCheck; + if (peep->bathroom < 70) { + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtShop, true); + return false; + } // The amount that peeps are willing to pay to use the Toilets scales with their bathroom stat. // It effectively has a minimum of $0.10 (due to the check above) and a maximum of $0.60. @@ -8154,27 +8202,32 @@ static bool peep_should_go_to_shop(rct_peep *peep, int rideIndex, bool peepAtSho } ride_update_popularity(ride, 0); } - goto failedCheck; + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtShop, true); + return false; } } - if (ride->price != 0) { - if (peep->cash_in_pocket <= 0) { - if (peepAtShop) { + if (ride->type == RIDE_TYPE_FIRST_AID) { + if (peep->nausea < 128) { + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtShop, true); + return false; + } + } + + // Basic price checks + if (ride->price != 0 && ride->price > peep->cash_in_pocket) { + if (peepAtShop) { + if (peep->cash_in_pocket <= 0) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 255); } - goto failedCheck; - } - if (ride->price > peep->cash_in_pocket) { - if (peepAtShop) { + else { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, rideIndex); } - goto failedCheck; } + peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtShop, true); + return false; } - - -successfulCheck: + if (peepAtShop) { ride_update_popularity(ride, 1); if (rideIndex == peep->guest_heading_to_ride_id) { @@ -8182,16 +8235,6 @@ successfulCheck: } } return true; - -failedCheck: - if (peepAtShop) { - peep->previous_ride = rideIndex; - peep->previous_ride_time_out = 0; - } - - peep_reset_ride_heading(peep); - return false; - } /** @@ -8267,7 +8310,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) rct_ride *ride = GET_RIDE(i); if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_QUEUE_FULL)) { - if (sub_6960AB(peep, i, 0, 6)) { + if (peep_should_go_on_ride(peep, i, 0, 6)) { *nextPotentialRide++ = i; numPotentialRides++; } @@ -8376,7 +8419,7 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) rct_ride *ride = GET_RIDE(i); if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_QUEUE_FULL)) { - if (sub_6960AB(peep, i, 0, 6)) { + if (peep_should_go_on_ride(peep, i, 0, 6)) { *nextPotentialRide++ = i; numPotentialRides++; } @@ -8488,7 +8531,7 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl rct_ride *ride = GET_RIDE(i); if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_QUEUE_FULL)) { - if (sub_6960AB(peep, i, 0, 6)) { + if (peep_should_go_on_ride(peep, i, 0, 6)) { *nextPotentialRide++ = i; numPotentialRides++; } diff --git a/src/peep/peep.h b/src/peep/peep.h index 10ac9203c6..44a3477a3c 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -428,7 +428,7 @@ typedef struct { uint8 bathroom; // 0x40 uint8 var_41; uint8 var_42; - uint8 intensity; // 0x43 + uint8 intensity; // 0x43 The max intensity is stored in the first 4 bits, and the min intensity in the second 4 bits uint8 nausea_tolerance; // 0x44 uint8 window_invalidate_flags; // 0x45 money16 paid_on_drink; // 0x46 diff --git a/src/ride/ride.h b/src/ride/ride.h index 88eec5e4e3..d764b1df48 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -236,6 +236,7 @@ typedef struct { union { uint8 inversions; // 0x114 (???X XXXX) uint8 holes; // 0x114 (???X XXXX) + // This has something to do with how much of the ride is undercover. uint8 var_114; }; uint8 drops; // 0x115 (??XX XXXX) From 3f8477836943e029de2a66c5e3cbb104f9ca41af Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Sat, 10 Oct 2015 18:57:25 +1000 Subject: [PATCH 0801/1173] Removed extra spaces --- src/peep/peep.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 234a2ae47f..7e46042987 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -464,7 +464,7 @@ static void sub_68F41A(rct_peep *peep, int index) } if (peep->state == PEEP_STATE_WALKING && - peep->outside_of_park == 0 && + peep->outside_of_park == 0 && !(peep->flags & PEEP_FLAGS_LEAVING_PARK) && peep->no_of_rides == 0 && peep->guest_heading_to_ride_id == 0xFF){ @@ -7884,7 +7884,7 @@ static void peep_reset_ride_heading(rct_peep *peep) } /** - * + * * rct2: 0x006960AB * * This function is called whenever a peep is deciding whether or not they want to go on a ride or visit a shop. @@ -7947,7 +7947,7 @@ static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNu return false; } - // This checks if there's a peep standing still at the very end of the queue. + // This checks if there's a peep standing still at the very end of the queue. if (maxD <= 13 && firstPeepInQueue->time_in_queue > 10) { peep_tried_to_enter_full_queue(peep, rideIndex); @@ -8227,7 +8227,7 @@ static bool peep_should_go_to_shop(rct_peep *peep, int rideIndex, bool peepAtSho peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtShop, true); return false; } - + if (peepAtShop) { ride_update_popularity(ride, 1); if (rideIndex == peep->guest_heading_to_ride_id) { From 3a11bbb6d4a823db223667aee9e3016e4513c404 Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Wed, 7 Oct 2015 20:53:55 +0200 Subject: [PATCH 0802/1173] Recalculate peep count after loading a save --- src/game.c | 20 +++++++++++++++++++- src/game.h | 1 + src/scenario.c | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/game.c b/src/game.c index b55434f975..00c414563b 100644 --- a/src/game.c +++ b/src/game.c @@ -775,15 +775,33 @@ int game_load_sv6(SDL_RWops* rw) return 0;//This never gets called } - // The rest is the same as in scenario load and play + // The rest is the same as in scenario_load reset_loaded_objects(); map_update_tile_pointers(); reset_0x69EBE4(); openrct2_reset_object_tween_locations(); game_convert_strings_to_utf8(); + game_fix_save_vars(); // OpenRCT2 fix broken save games + return 1; } +// OpenRCT2 workaround to recalculate some values which are saved redundantly in the save to fix corrupted files. +// For example recalculate guest count by looking at all the guests instead of trusting the value in the file. +void game_fix_save_vars() { + + // Recalculates peep count after loading a save to fix corrupted files + rct_peep* peep; + uint16 spriteIndex; + uint16 peepCount = 0; + FOR_ALL_GUESTS(spriteIndex, peep) { + if(!peep->outside_of_park) + peepCount++; + } + + RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) = peepCount; +} + // Load game state for multiplayer int game_load_network(SDL_RWops* rw) { diff --git a/src/game.h b/src/game.h index 6817ab3e8d..115030495e 100644 --- a/src/game.h +++ b/src/game.h @@ -140,5 +140,6 @@ void rct2_exit_reason(rct_string_id title, rct_string_id body); void game_autosave(); void game_convert_strings_to_utf8(); void game_convert_strings_to_rct2(rct_s6_data *s6); +void game_fix_save_vars(); #endif diff --git a/src/scenario.c b/src/scenario.c index b1b7ae7a45..daa7af63a4 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -204,6 +204,8 @@ int scenario_load(const char *path) reset_0x69EBE4(); openrct2_reset_object_tween_locations(); game_convert_strings_to_utf8(); + game_fix_save_vars(); // OpenRCT2 fix broken save games + return 1; } From 955f9a02e9429e1a667fb7f730077ef592399557 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 10 Oct 2015 11:54:19 +0100 Subject: [PATCH 0803/1173] fix ride rating underflows, #2031 --- src/ride/ride_ratings.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 9ac88e6ccb..3c8491958a 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -620,8 +620,14 @@ static void ride_ratings_calculate(rct_ride *ride) ride_ratings_calculation calcFunc; calcFunc = ride_ratings_calculate_func_table[ride->type]; - if (calcFunc != NULL) + if (calcFunc != NULL) { calcFunc(ride); + } + + // Prevent negative ratings + ride->ratings.excitement = max(0, ride->ratings.excitement); + ride->ratings.intensity = max(0, ride->ratings.intensity); + ride->ratings.nausea = max(0, ride->ratings.nausea); // Original ride calculation // calcFunc = RCT2_ADDRESS(0x0097E050, ride_ratings_calculation)[ride->type]; From 1b2a7e62a25de2855d426bcb4fa71bf78dbab81d Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Sat, 10 Oct 2015 21:31:56 +1000 Subject: [PATCH 0804/1173] Identified 0x00982392 as a nausea lookup array --- src/addresses.h | 4 ++++ src/peep/peep.c | 14 ++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 47c1513827..93eb4176bb 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -64,6 +64,10 @@ // they aren't directly referenced, for example when a game is saved and // loaded, large chunks of data is read and written to. +// An array of 8 uint16s containing the min and max nausea values for each +// of the four nausea tolerance levels. +#define RCT2_ADDRESS_NAUSEA_THRESHOLDS 0x00982390 + #define RCT2_ADDRESS_EASTEREGG_NAMES 0x00988C20 // An array of pointers to the start of a way to diff --git a/src/peep/peep.c b/src/peep/peep.c index 7e46042987..3051804498 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7574,8 +7574,8 @@ static void peep_on_enter_ride(rct_peep *peep, int rideIndex) satisfactionFlags |= (1 << 7); } - minNausea = RCT2_ADDRESS(0x00982390, uint16)[(peep->nausea_tolerance & 3) * 2]; - maxNausea = RCT2_ADDRESS(0x00982392, uint16)[(peep->nausea_tolerance & 3) * 2]; + minNausea = RCT2_ADDRESS(RCT2_ADDRESS_NAUSEA_THRESHOLDS, uint16)[(peep->nausea_tolerance & 3) * 2]; + maxNausea = RCT2_ADDRESS(RCT2_ADDRESS_NAUSEA_THRESHOLDS, uint16)[(peep->nausea_tolerance & 3) * 2 + 1]; if (maxNausea <= ride->nausea || minNausea >= ride->nausea) { satisfactionFlags |= (1 << 2); } @@ -8042,9 +8042,9 @@ static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNu return false; } - // Nausea calculations - ride_rating minNausea = RCT2_ADDRESS(0x00982390, uint16)[(peep->nausea_tolerance & 3) * 2] - peep->happiness; - ride_rating maxNausea = RCT2_ADDRESS(0x00982392, uint16)[(peep->nausea_tolerance & 3) * 2] + peep->happiness; + // Nausea calculations. + ride_rating maxNausea = RCT2_ADDRESS(RCT2_ADDRESS_NAUSEA_THRESHOLDS, uint16)[(peep->nausea_tolerance & 3) * 2 + 1] + peep->happiness; + if (ride->nausea > maxNausea) { if (peepAtRide) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SICKENING, rideIndex); @@ -8056,7 +8056,9 @@ static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNu peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, true); return false; } - if (ride->nausea >= 140 && peep->nausea > 160) { + + // Very nauseous peeps will only go on very gentle rides. + if (ride->nausea >= FIXED_2DP(1, 40) && peep->nausea > 160) { peep_chose_not_to_go_on_ride(peep, rideIndex, peepAtRide, false); return false; } From b0437746a94e515915b02305fa2a2f15a0bf2d5d Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Sat, 10 Oct 2015 21:34:37 +1000 Subject: [PATCH 0805/1173] Fixed min and max intensity being swapped --- src/peep/peep.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 3051804498..e87f4932b4 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7558,8 +7558,8 @@ static void peep_on_enter_ride(rct_peep *peep, int rideIndex) satisfactionFlags = 0x1FF; } else { satisfactionFlags = 0; - maxIntensity = (peep->intensity & 0x0F) * 100; - minIntensity = (peep->intensity / 16) * 100; + maxIntensity = (peep->intensity >> 4) * 100; + minIntensity = (peep->intensity & 0xF) * 100; if (maxIntensity <= ride->intensity || minIntensity >= ride->intensity) { satisfactionFlags |= (1 << 1); } From 75263034e580ec118179cefc51d27e731f74cbe8 Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Sat, 10 Oct 2015 23:15:56 +1000 Subject: [PATCH 0806/1173] Use GET_PEEP macro --- src/peep/peep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index e87f4932b4..ac3f3270b1 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7934,7 +7934,7 @@ static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNu else { // Check if there's room in the queue for the peep to enter. if (ride->first_peep_in_queue[entranceNum] != 0xFFFF) { - rct_peep *firstPeepInQueue = &(g_sprite_list[ride->first_peep_in_queue[entranceNum]].peep); + rct_peep *firstPeepInQueue = GET_PEEP(ride->first_peep_in_queue[entranceNum]); if (abs(firstPeepInQueue->z - peep->z) <= 6) { int dx = abs(firstPeepInQueue->x - peep->x); int dy = abs(firstPeepInQueue->y - peep->y); From 3975af93f481de74ad02e08f8df4efacf0e3e513 Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Sun, 11 Oct 2015 02:51:03 +1000 Subject: [PATCH 0807/1173] Renamed ride->var_114 to undercover_portion and updated comments --- src/peep/peep.c | 5 +++-- src/ride/ride.h | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index ac3f3270b1..d4e98dc93d 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -8007,8 +8007,9 @@ static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNu } } - // Peeps won't go on certain rides while it's raining. - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8) != 0 && ride->var_114 < 96) { + // Peeps won't go on rides that aren't sufficiently undercover while it's raining. + // The threshold is fairly low and only requires about 10-15% of the ride to be undercover. + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8) != 0 && (ride->undercover_portion >> 5) < 3) { if (peepAtRide) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_WHILE_RAINING, rideIndex); if (peep->happiness_growth_rate >= 64) { diff --git a/src/ride/ride.h b/src/ride/ride.h index d764b1df48..a1981d825d 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -236,8 +236,9 @@ typedef struct { union { uint8 inversions; // 0x114 (???X XXXX) uint8 holes; // 0x114 (???X XXXX) - // This has something to do with how much of the ride is undercover. - uint8 var_114; + // The undercover portion is a very rough approximation of how much of the ride is undercover. + // It reaches the maximum value of 7 at about 50% undercover and doesn't increase beyond that. + uint8 undercover_portion; // 0x114 (XXX?-????) }; uint8 drops; // 0x115 (??XX XXXX) uint8 var_116; From 58b7df8fd772e7a1aec179d83a0ad50c9bfc2216 Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Sun, 11 Oct 2015 03:03:59 +1000 Subject: [PATCH 0808/1173] Renamed ride->first_peep_in_queue to last_peep_in_queue --- src/peep/peep.c | 40 ++++++++++++++++++++-------------------- src/rct1.h | 2 +- src/ride/ride.c | 2 +- src/ride/ride.h | 2 +- src/windows/cheats.c | 3 ++- 5 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index d4e98dc93d..697dd5d51b 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -1521,13 +1521,13 @@ void remove_peep_from_queue(rct_peep* peep) uint8 cur_station = peep->current_ride_station; ride->queue_length[cur_station]--; - if (peep->sprite_index == ride->first_peep_in_queue[cur_station]) + if (peep->sprite_index == ride->last_peep_in_queue[cur_station]) { - ride->first_peep_in_queue[cur_station] = peep->next_in_queue; + ride->last_peep_in_queue[cur_station] = peep->next_in_queue; return; } - for (rct_peep* other_peep = GET_PEEP(ride->first_peep_in_queue[cur_station]);; + for (rct_peep* other_peep = GET_PEEP(ride->last_peep_in_queue[cur_station]);; other_peep = GET_PEEP(other_peep->next_in_queue)){ if (peep->sprite_index == other_peep->next_in_queue){ other_peep->next_in_queue = peep->next_in_queue; @@ -2104,14 +2104,14 @@ static void peep_update_ride_sub_state_2_rejoin_queue(rct_peep* peep, rct_ride* ride->queue_length[peep->current_ride_station]++; - uint16 current_first = ride->first_peep_in_queue[peep->current_ride_station]; - if (current_first == 0xFFFF){ - ride->first_peep_in_queue[peep->current_ride_station] = peep->sprite_index; + uint16 current_last = ride->last_peep_in_queue[peep->current_ride_station]; + if (current_last == 0xFFFF){ + ride->last_peep_in_queue[peep->current_ride_station] = peep->sprite_index; return; } rct_peep* queue_peep; - for (queue_peep = GET_PEEP(current_first); + for (queue_peep = GET_PEEP(current_last); queue_peep->next_in_queue != 0xFFFF; queue_peep = GET_PEEP(queue_peep->next_in_queue)); @@ -6104,9 +6104,9 @@ static int peep_interact_with_entrance(rct_peep* peep, sint16 x, sint16 y, rct_m peep->var_79 = rideIndex; rct_ride* ride = GET_RIDE(rideIndex); - uint16 previous_first = ride->first_peep_in_queue[stationNum]; - ride->first_peep_in_queue[stationNum] = peep->sprite_index; - peep->next_in_queue = previous_first; + uint16 previous_last = ride->last_peep_in_queue[stationNum]; + ride->last_peep_in_queue[stationNum] = peep->sprite_index; + peep->next_in_queue = previous_last; ride->queue_length[stationNum]++; peep_decrement_num_riders(peep); @@ -6473,9 +6473,9 @@ static int peep_interact_with_path(rct_peep* peep, sint16 x, sint16 y, rct_map_e peep->var_79 = rideIndex; rct_ride* ride = GET_RIDE(rideIndex); - uint16 old_first_peep = ride->first_peep_in_queue[stationNum]; - ride->first_peep_in_queue[stationNum] = peep->sprite_index; - peep->next_in_queue = old_first_peep; + uint16 old_last_peep = ride->last_peep_in_queue[stationNum]; + ride->last_peep_in_queue[stationNum] = peep->sprite_index; + peep->next_in_queue = old_last_peep; ride->queue_length[stationNum]++; peep_decrement_num_riders(peep); @@ -7926,18 +7926,18 @@ static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNu // Rides without queues can only have one peep waiting at a time. if (!peepAtQueue) { - if (ride->first_peep_in_queue[entranceNum] != 0xFFFF) { + if (ride->last_peep_in_queue[entranceNum] != 0xFFFF) { peep_tried_to_enter_full_queue(peep, rideIndex); return false; } } else { // Check if there's room in the queue for the peep to enter. - if (ride->first_peep_in_queue[entranceNum] != 0xFFFF) { - rct_peep *firstPeepInQueue = GET_PEEP(ride->first_peep_in_queue[entranceNum]); - if (abs(firstPeepInQueue->z - peep->z) <= 6) { - int dx = abs(firstPeepInQueue->x - peep->x); - int dy = abs(firstPeepInQueue->y - peep->y); + if (ride->last_peep_in_queue[entranceNum] != 0xFFFF) { + rct_peep *lastPeepInQueue = GET_PEEP(ride->last_peep_in_queue[entranceNum]); + if (abs(lastPeepInQueue->z - peep->z) <= 6) { + int dx = abs(lastPeepInQueue->x - peep->x); + int dy = abs(lastPeepInQueue->y - peep->y); int maxD = max(dx, dy); // Unlike normal paths, peeps cannot overlap when queueing for a ride. @@ -7949,7 +7949,7 @@ static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNu // This checks if there's a peep standing still at the very end of the queue. if (maxD <= 13 - && firstPeepInQueue->time_in_queue > 10) { + && lastPeepInQueue->time_in_queue > 10) { peep_tried_to_enter_full_queue(peep, rideIndex); return false; } diff --git a/src/rct1.h b/src/rct1.h index 07acdc4b95..159d1ce984 100644 --- a/src/rct1.h +++ b/src/rct1.h @@ -63,7 +63,7 @@ typedef struct { uint8 station_depart[4]; uint16 entrance[4]; uint16 exit[4]; - uint16 first_peep_in_queue[4]; + uint16 last_peep_in_queue[4]; uint8 num_peeps_in_queue[4]; uint16 vehicles[12]; uint8 depart_flags; diff --git a/src/ride/ride.c b/src/ride/ride.c index 516df6ead1..062f904d96 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -6835,7 +6835,7 @@ money32 place_ride_entrance_or_exit(sint16 x, sint16 y, sint16 z, uint8 directio ride->exits[station_num] = (x / 32) | (y / 32 << 8); } else { ride->entrances[station_num] = (x / 32) | (y / 32 << 8); - ride->first_peep_in_queue[station_num] = 0xFFFF; + ride->last_peep_in_queue[station_num] = 0xFFFF; ride->queue_length[station_num] = 0; map_animation_create(MAP_ANIMATION_TYPE_RIDE_ENTRANCE, x, y, z / 8); diff --git a/src/ride/ride.h b/src/ride/ride.h index a1981d825d..cd69c37099 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -187,7 +187,7 @@ typedef struct { uint8 var_066[4]; uint16 entrances[4]; // 0x06A uint16 exits[4]; // 0x072 - uint16 first_peep_in_queue[4]; // 0x07A + uint16 last_peep_in_queue[4]; // 0x07A uint8 pad_082[4]; uint16 vehicles[32]; // 0x086 Points to the first car in the train uint8 depart_flags; // 0x0C6 diff --git a/src/windows/cheats.c b/src/windows/cheats.c index f0aa95a46b..950c129b78 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -708,7 +708,8 @@ static void cheat_remove_all_guests() ride_set_status(i, RIDE_STATUS_CLOSED); for(int i=0;i<4;i++) { - ride->first_peep_in_queue[i]=0xFFFF; + ride->queue_length[i] = 0; + ride->last_peep_in_queue[i]=0xFFFF; } } window_invalidate_by_class(WC_RIDE); From 55d6666f134d03a94754ea0a5f106e64f85be3d6 Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Sun, 11 Oct 2015 03:21:33 +1000 Subject: [PATCH 0809/1173] Added an enum for flags used in peep_should_go_on_ride --- src/peep/peep.c | 12 ++++++------ src/peep/peep.h | 6 ++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 697dd5d51b..083f9b5806 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -6465,7 +6465,7 @@ static int peep_interact_with_path(rct_peep* peep, sint16 x, sint16 y, rct_map_e peep->var_F4 = 0; uint8 stationNum = (map_element->properties.path.additions & 0x70) >> 4; - if (!peep_should_go_on_ride(peep, rideIndex, stationNum, 1)){ + if (!peep_should_go_on_ride(peep, rideIndex, stationNum, PEEP_RIDE_DECISION_AT_QUEUE)){ peep->var_79 = rideIndex; return peep_return_to_center_of_tile(peep); } @@ -7895,10 +7895,10 @@ static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNu rct_ride *ride = GET_RIDE(rideIndex); // Indicates if the peep is about to enter a queue (as opposed to entering an entrance directly from a path) - bool peepAtQueue = flags & 1; + bool peepAtQueue = flags & PEEP_RIDE_DECISION_AT_QUEUE; // Indicates whether a peep is physically at the ride, or is just thinking about going on the ride. - bool peepAtRide = !(flags & 4); + bool peepAtRide = !(flags & PEEP_RIDE_DECISION_THINKING); if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_8)) { if (ride->status == RIDE_STATUS_OPEN && !(ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN)) { @@ -8313,7 +8313,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) rct_ride *ride = GET_RIDE(i); if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_QUEUE_FULL)) { - if (peep_should_go_on_ride(peep, i, 0, 6)) { + if (peep_should_go_on_ride(peep, i, 0, PEEP_RIDE_DECISION_THINKING)) { *nextPotentialRide++ = i; numPotentialRides++; } @@ -8422,7 +8422,7 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) rct_ride *ride = GET_RIDE(i); if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_QUEUE_FULL)) { - if (peep_should_go_on_ride(peep, i, 0, 6)) { + if (peep_should_go_on_ride(peep, i, 0, PEEP_RIDE_DECISION_THINKING)) { *nextPotentialRide++ = i; numPotentialRides++; } @@ -8534,7 +8534,7 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl rct_ride *ride = GET_RIDE(i); if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_QUEUE_FULL)) { - if (peep_should_go_on_ride(peep, i, 0, 6)) { + if (peep_should_go_on_ride(peep, i, 0, PEEP_RIDE_DECISION_THINKING)) { *nextPotentialRide++ = i; numPotentialRides++; } diff --git a/src/peep/peep.h b/src/peep/peep.h index 44a3477a3c..90e98fa968 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -366,6 +366,12 @@ enum { PEEP_INVALIDATE_STAFF_STATS = 1 << 4, }; +// Flags used by peep_should_go_on_ride() +enum { + PEEP_RIDE_DECISION_AT_QUEUE = 1, + PEEP_RIDE_DECISION_THINKING = 1 << 2 +}; + typedef struct { uint8 type; //0 uint8 item; //1 From 49cf5e3774d727099f9555f8a73adab600bca41c Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Sun, 11 Oct 2015 04:07:14 +1000 Subject: [PATCH 0810/1173] Moved the nausea thresholds into a C array --- src/addresses.h | 5 +---- src/peep/peep.c | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 93eb4176bb..2f99a72770 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -64,10 +64,6 @@ // they aren't directly referenced, for example when a game is saved and // loaded, large chunks of data is read and written to. -// An array of 8 uint16s containing the min and max nausea values for each -// of the four nausea tolerance levels. -#define RCT2_ADDRESS_NAUSEA_THRESHOLDS 0x00982390 - #define RCT2_ADDRESS_EASTEREGG_NAMES 0x00988C20 // An array of pointers to the start of a way to @@ -661,6 +657,7 @@ #define RCT2_ADDRESS_DPI_LINE_LENGTH_GLOBAL 0x9ABDB0 //uint16 width+pitch #define RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS 0x009AA00D #define RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_CONFIG 0x009AB4C6 +#define RCT2_ADDRESS_NAUSEA_THRESHOLDS 0x00982390 //uint16 #pragma endregion diff --git a/src/peep/peep.c b/src/peep/peep.c index 083f9b5806..7b04fe58d3 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -116,6 +116,15 @@ const char *gPeepEasterEggNames[] = { "DAVID ELLIS" }; +// These arrays contain the base minimum and maximum nausea ratings for peeps, based on their nausea tolerance level. +static const ride_rating NauseaMinimumThresholds[] = { + 0, 0, 200, 400 +}; + +static const ride_rating NauseaMaximumThresholds[] = { + 300, 600, 800, 1000 +}; + int peep_get_staff_count() { uint16 spriteIndex; @@ -7574,8 +7583,8 @@ static void peep_on_enter_ride(rct_peep *peep, int rideIndex) satisfactionFlags |= (1 << 7); } - minNausea = RCT2_ADDRESS(RCT2_ADDRESS_NAUSEA_THRESHOLDS, uint16)[(peep->nausea_tolerance & 3) * 2]; - maxNausea = RCT2_ADDRESS(RCT2_ADDRESS_NAUSEA_THRESHOLDS, uint16)[(peep->nausea_tolerance & 3) * 2 + 1]; + minNausea = NauseaMinimumThresholds[(peep->nausea_tolerance & 3)]; + maxNausea = NauseaMaximumThresholds[(peep->nausea_tolerance & 3)]; if (maxNausea <= ride->nausea || minNausea >= ride->nausea) { satisfactionFlags |= (1 << 2); } @@ -8044,8 +8053,8 @@ static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNu } // Nausea calculations. - ride_rating maxNausea = RCT2_ADDRESS(RCT2_ADDRESS_NAUSEA_THRESHOLDS, uint16)[(peep->nausea_tolerance & 3) * 2 + 1] + peep->happiness; - + ride_rating maxNausea = NauseaMaximumThresholds[(peep->nausea_tolerance & 3)] + peep->happiness; + if (ride->nausea > maxNausea) { if (peepAtRide) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SICKENING, rideIndex); From 8ec4d61739a30e7a40dc69734c51563f508ce412 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 10 Oct 2015 20:26:17 +0100 Subject: [PATCH 0811/1173] add callfunc wrappers for the last three remaining game commands and remove original call table --- src/game.c | 104 +++++++---------------------------------------- src/ride/track.c | 18 ++++++++ src/ride/track.h | 2 + src/world/map.c | 9 ++++ src/world/map.h | 1 + 5 files changed, 44 insertions(+), 90 deletions(-) diff --git a/src/game.c b/src/game.c index 7711bd71f5..d1357b6175 100644 --- a/src/game.c +++ b/src/game.c @@ -404,7 +404,6 @@ static int game_check_affordability(int cost) return MONEY32_UNDEFINED; } -static uint32 game_do_command_table[58]; static GAME_COMMAND_POINTER* new_game_command_table[58]; /** @@ -456,12 +455,8 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * *ebx &= ~GAME_COMMAND_FLAG_APPLY; - // Primary command - if (game_do_command_table[command] == 0) { - new_game_command_table[command](eax, ebx, ecx, edx, esi, edi, ebp); - } else { - RCT2_CALLFUNC_X(game_do_command_table[command], eax, ebx, ecx, edx, esi, edi, ebp); - } + // First call for validity and price check + new_game_command_table[command](eax, ebx, ecx, edx, esi, edi, ebp); cost = *ebx; if (cost != MONEY32_UNDEFINED) { @@ -495,12 +490,8 @@ int game_do_command_p(int command, int *eax, int *ebx, int *ecx, int *edx, int * } } - // Secondary command - if (game_do_command_table[command] == 0) { - new_game_command_table[command](eax, ebx, ecx, edx, esi, edi, ebp); - } else { - RCT2_CALLFUNC_X(game_do_command_table[command], eax, ebx, ecx, edx, esi, edi, ebp); - } + // Second call to actually perform the operation + new_game_command_table[command](eax, ebx, ecx, edx, esi, edi, ebp); if (game_command_callback) { game_command_callback(*eax, *ebx, *ecx, *edx, *esi, *edi, *ebp); @@ -1127,71 +1118,6 @@ void game_load_or_quit_no_save_prompt() } } -#pragma region Game command function table - -static uint32 game_do_command_table[58] = { - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, // 10 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, // 20 - 0, - 0, - 0, - 0, - 0x0068BC01, - 0, - 0, - 0, - 0, // use new_game_command_table, original: 0x006BEFA1, 29 - 0, // 30 - 0, - 0, - 0, - 0, - 0,//0x006649BD, //buy_land_rights - 0, - 0, - 0x006CD8CE, - 0, - 0, // 40 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0x006CDEE4, - 0, // 50 - 0, - 0, - 0, - 0, - 0, - 0, - 0 -}; - -void game_command_emptysub(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) {} - static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_set_ride_appearance, game_command_set_land_height, @@ -1203,7 +1129,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_demolish_ride, game_command_set_ride_status, game_command_set_ride_vehicles, - game_command_set_ride_name, // 10 + game_command_set_ride_name, game_command_set_ride_setting, game_command_place_ride_entrance_or_exit, game_command_remove_ride_entrance_or_exit, @@ -1213,27 +1139,27 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_place_footpath, game_command_place_footpath_from_track, game_command_remove_footpath, - game_command_change_surface_style, // 20 + game_command_change_surface_style, game_command_set_ride_price, game_command_set_peep_name, game_command_raise_land, game_command_lower_land, - game_command_emptysub, + game_command_smooth_land, game_command_raise_water, game_command_lower_water, game_command_set_brakes_speed, - game_command_hire_new_staff_member, //game_command_emptysub, - game_command_set_staff_patrol, // 30 + game_command_hire_new_staff_member, + game_command_set_staff_patrol, game_command_fire_staff_member, game_command_set_staff_order, game_command_set_park_name, game_command_set_park_open, - game_command_buy_land_rights, //game_command_emptysub,//game_command_buy_land_rights, + game_command_buy_land_rights, game_command_place_park_entrance, game_command_remove_park_entrance, - game_command_emptysub, + game_command_set_maze_track, game_command_set_park_entrance_fee, - game_command_update_staff_colour, // 40 + game_command_update_staff_colour, game_command_place_fence, game_command_remove_fence, game_command_place_large_scenery, @@ -1242,8 +1168,8 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_set_research_funding, game_command_place_track_design, game_command_start_campaign, - game_command_emptysub, - game_command_place_banner, // 50 + game_command_place_maze_design, + game_command_place_banner, game_command_remove_banner, game_command_set_scenery_colour, game_command_set_fence_colour, @@ -1252,5 +1178,3 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_set_land_ownership, game_command_clear_scenery }; - -#pragma endregion diff --git a/src/ride/track.c b/src/ride/track.c index 99b4f19ca3..a263cb5ee6 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3340,6 +3340,15 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int *edi = rideIndex; } +/** + * + * rct2: 0x006CDEE4 + */ +void game_command_place_maze_design(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) +{ + RCT2_CALLFUNC_X(0x006CDEE4, eax, ebx, ecx, edx, esi, edi, ebp); +} + /** * * rct2: 0x006D3026 @@ -4658,6 +4667,15 @@ void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, return; } +/** + * + * rct2: 0x006CD8CE + */ +void game_command_set_maze_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) +{ + RCT2_CALLFUNC_X(0x006CD8CE, eax, ebx, ecx, edx, esi, edi, ebp); +} + /** * * rct2: 0x006C5AE9 diff --git a/src/ride/track.h b/src/ride/track.h index ffe2c2e59e..e279fa1400 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -518,6 +518,7 @@ int save_track_design(uint8 rideIndex); int install_track(char* source_path, char* dest_name); void window_track_list_format_name(utf8 *dst, const utf8 *src, int colour, bool quotes); void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); +void game_command_place_maze_design(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void track_save_reset_scenery(); void track_save_select_nearby_scenery(int rideIndex); @@ -529,6 +530,7 @@ const rct_track_coordinates *get_track_coord_from_ride(rct_ride *ride, int track void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +void game_command_set_maze_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_brakes_speed(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void track_circuit_iterator_begin(track_circuit_iterator *it, rct_xy_element first); diff --git a/src/world/map.c b/src/world/map.c index 5960a433a7..c02691b09c 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2051,6 +2051,15 @@ void game_command_lower_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, i ); } +/** + * + * rct2: 0x0068BC01 + */ +void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) +{ + RCT2_CALLFUNC_X(0x0068BC01, eax, ebx, ecx, edx, esi, edi, ebp); +} + /** * * rct2: 0x006E66A0 diff --git a/src/world/map.h b/src/world/map.h index abc1ecc6c2..d860869ec4 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -323,6 +323,7 @@ void game_command_clear_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi void game_command_change_surface_style(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_raise_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_lower_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); +void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_raise_water(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_lower_water(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_set_water_height(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); From 969324032e2bb28614aedcac89ea33fb4a563975 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 11 Oct 2015 02:23:39 +0100 Subject: [PATCH 0812/1173] implement map smooth game command --- src/world/map.c | 462 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 461 insertions(+), 1 deletion(-) diff --git a/src/world/map.c b/src/world/map.c index c02691b09c..0194509789 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2051,13 +2051,473 @@ void game_command_lower_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, i ); } +static int map_get_corner_height(rct_map_element *mapElement, int slopeMask) +{ + int z = mapElement->base_height; + int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; + switch (slopeMask) { + case 1: + if (slope & 1) { + z += 2; + if (slope == 27) { + z += 2; + } + } + break; + case 2: + if (slope & 2) { + z += 2; + if (slope == 23) { + z += 2; + } + } + break; + case 4: + if (slope & 4) { + z += 2; + if (slope == 30) { + z += 2; + } + } + break; + case 8: + if (slope & 8) { + z += 2; + if (slope == 29) { + z += 2; + } + } + break; + } + return z; +} + +/** + * + * rct2: 0x0068C3B2 + */ +static money32 sub_68C3B2(uint8 flags, int x, int y, uint8 targetBaseZ, uint8 minBaseZ) +{ + // Check if inside map bounds + if (x < 0 || y < 0 || x >= (256 * 32) || y >= (256 * 32)) { + return MONEY32_UNDEFINED; + } + + // Get height of tile + rct_map_element *mapElement = map_get_surface_element_at(x >> 5, y >> 5); + uint8 baseZ = map_get_corner_height(mapElement, 1); + + // Check if tile is same height as target tile + if (baseZ == targetBaseZ) { + // No need to raise or lower + return MONEY32_UNDEFINED; + } + + uint8 style; + if (targetBaseZ <= baseZ) { + baseZ = baseZ - targetBaseZ; + if (baseZ <= minBaseZ) { + return MONEY32_UNDEFINED; + } + targetBaseZ = mapElement->base_height; + int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; + style = map_element_lower_styles[0][slope]; + if (style & 0x20) { + targetBaseZ -= 2; + style &= ~0x20; + } + } else { + baseZ = targetBaseZ - baseZ; + if (baseZ <= minBaseZ) { + return MONEY32_UNDEFINED; + } + targetBaseZ = mapElement->base_height; + int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; + style = map_element_raise_styles[0][slope]; + if ((style & 0x20) != 0) { + targetBaseZ += 2; + style &= ~0x20; + } + } + + return game_do_command(x, flags, y, targetBaseZ | (style << 8), GAME_COMMAND_SET_LAND_HEIGHT, 0, 0); +} + +/** + * + * rct2: 0x0068C47A + */ +static money32 sub_68C47A(uint8 flags, int x, int y, uint8 targetBaseZ, uint8 minBaseZ) +{ + // Check if inside map bounds + if (x < 0 || y < 0 || x >= (256 * 32) || y >= (256 * 32)) { + return MONEY32_UNDEFINED; + } + + // Get height of tile + rct_map_element *mapElement = map_get_surface_element_at(x >> 5, y >> 5); + uint8 baseZ = map_get_corner_height(mapElement, 2); + + // Check if tile is same height as target tile + if (baseZ == targetBaseZ) { + // No need to raise or lower + return MONEY32_UNDEFINED; + } + + uint8 style; + if (targetBaseZ <= baseZ) { + baseZ = baseZ - targetBaseZ; + if (baseZ <= minBaseZ) { + return MONEY32_UNDEFINED; + } + targetBaseZ = mapElement->base_height; + int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; + style = map_element_lower_styles[1][slope]; + if (style & 0x20) { + targetBaseZ -= 2; + style &= ~0x20; + } + } else { + baseZ = targetBaseZ - baseZ; + if (baseZ <= minBaseZ) { + return MONEY32_UNDEFINED; + } + targetBaseZ = mapElement->base_height; + int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; + style = map_element_raise_styles[1][slope]; + if ((style & 0x20) != 0) { + targetBaseZ += 2; + style &= ~0x20; + } + } + + return game_do_command(x, flags, y, targetBaseZ | (style << 8), GAME_COMMAND_SET_LAND_HEIGHT, 0, 0); +} + +/** + * + * rct2: 0x0068C222 + */ +static money32 sub_68C222(uint8 flags, int x, int y, uint8 targetBaseZ, uint8 minBaseZ) +{ + // Check if inside map bounds + if (x < 0 || y < 0 || x >= (256 * 32) || y >= (256 * 32)) { + return MONEY32_UNDEFINED; + } + + // Get height of tile + rct_map_element *mapElement = map_get_surface_element_at(x >> 5, y >> 5); + uint8 baseZ = map_get_corner_height(mapElement, 4); + + // Check if tile is same height as target tile + if (baseZ == targetBaseZ) { + // No need to raise or lower + return MONEY32_UNDEFINED; + } + + uint8 style; + if (targetBaseZ <= baseZ) { + baseZ = baseZ - targetBaseZ; + if (baseZ <= minBaseZ) { + return MONEY32_UNDEFINED; + } + targetBaseZ = mapElement->base_height; + int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; + style = map_element_lower_styles[2][slope]; + if (style & 0x20) { + targetBaseZ -= 2; + style &= ~0x20; + } + } else { + baseZ = targetBaseZ - baseZ; + if (baseZ <= minBaseZ) { + return MONEY32_UNDEFINED; + } + targetBaseZ = mapElement->base_height; + int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; + style = map_element_raise_styles[2][slope]; + if ((style & 0x20) != 0) { + targetBaseZ += 2; + style &= ~0x20; + } + } + + return game_do_command(x, flags, y, targetBaseZ | (style << 8), GAME_COMMAND_SET_LAND_HEIGHT, 0, 0); +} + +/** + * + * rct2: 0x0068C2EA + */ +static money32 sub_68C2EA(uint8 flags, int x, int y, uint8 targetBaseZ, uint8 minBaseZ) +{ + // Check if inside map bounds + if (x < 0 || y < 0 || x >= (256 * 32) || y >= (256 * 32)) { + return MONEY32_UNDEFINED; + } + + // Get height of tile + rct_map_element *mapElement = map_get_surface_element_at(x >> 5, y >> 5); + uint8 baseZ = map_get_corner_height(mapElement, 8); + + // Check if tile is same height as target tile + if (baseZ == targetBaseZ) { + // No need to raise or lower + return MONEY32_UNDEFINED; + } + + uint8 style; + if (targetBaseZ <= baseZ) { + baseZ = baseZ - targetBaseZ; + if (baseZ <= minBaseZ) { + return MONEY32_UNDEFINED; + } + targetBaseZ = mapElement->base_height; + int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; + style = map_element_lower_styles[3][slope]; + if (style & 0x20) { + targetBaseZ -= 2; + style &= ~0x20; + } + } else { + baseZ = targetBaseZ - baseZ; + if (baseZ <= minBaseZ) { + return MONEY32_UNDEFINED; + } + targetBaseZ = mapElement->base_height; + int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; + style = map_element_raise_styles[3][slope]; + if ((style & 0x20) != 0) { + targetBaseZ += 2; + style &= ~0x20; + } + } + + return game_do_command(x, flags, y, targetBaseZ | (style << 8), GAME_COMMAND_SET_LAND_HEIGHT, 0, 0); +} + /** * * rct2: 0x0068BC01 */ void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { - RCT2_CALLFUNC_X(0x0068BC01, eax, ebx, ecx, edx, esi, edi, ebp); + // RCT2_CALLFUNC_X(0x0068BC01, eax, ebx, ecx, edx, esi, edi, ebp); return; + + int flags = *ebx & 0xFF; + int centreX = *eax & 0xFFFF; + int centreY = *ecx & 0xFFFF; + int centreZ = map_element_height(centreX, centreY); + int mapLeftRight = *edx; + int mapTopBottom = *ebp; + int mapLeft = mapLeftRight & 0xFFFF; + int mapTop = mapTopBottom & 0xFFFF; + int mapRight = mapLeftRight >> 16; + int mapBottom = mapTopBottom >> 16; + + int subCommand = *edi; + int subGameCommandType = *edi == 1 ? GAME_COMMAND_RAISE_LAND : GAME_COMMAND_LOWER_LAND; + + // Play sound (only once) + if ((flags & GAME_COMMAND_FLAG_APPLY) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, centreX, centreY, centreZ); + } + + money32 totalCost = 0; + + // First raise / lower the centre tile + money32 result; + result = game_do_command(centreX, flags, centreY, mapLeftRight, subGameCommandType, 4, mapTopBottom); + if (result != MONEY32_UNDEFINED) { + totalCost += result; + } + + int x, y, z; + rct_map_element *mapElement; + + x = mapLeft; + y = mapTop; + mapElement = map_get_surface_element_at(x >> 5, y >> 5); + int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; + if (slope != 0) { + int command = subCommand == 0xFFFF ? GAME_COMMAND_RAISE_LAND : GAME_COMMAND_LOWER_LAND; + result = game_do_command(centreX, flags, centreY, mapLeftRight, command, 4, mapTopBottom); + if (result != MONEY32_UNDEFINED) { + totalCost += result; + } + + x = mapLeft; + y = mapTop; + mapElement = map_get_surface_element_at(x >> 5, y >> 5); + slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; + + *ebx = totalCost * 4; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = centreX; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = centreY; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = centreZ; + return; + } + + x = mapLeft; + y = mapTop; + int bx = ((mapRight - mapLeft) >> 5) - 1; + sint8 byte_F1AD5C = -2; + + for (;;) { + byte_F1AD5C += 2; + bx += 2; + x -= 32; + y -= 32; + if (bx > 64) { + *ebx = totalCost * 4; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = centreX; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = centreY; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = centreZ; + return; + } + + sint8 minZ = (byte_F1AD5C << 1) & 0xFF; + + // Corner (North-West) + mapElement = map_get_surface_element_at(mapLeft >> 5, mapTop >> 5); + z = map_get_corner_height(mapElement, 4); + result = sub_68C3B2(flags, x, y, z, minZ); + if (result != MONEY32_UNDEFINED) { + totalCost += result; + } + y += 32; + + // Side (West) + for (int i = 0; i < bx; i++) { + int y2 = clamp(mapTop, y, mapBottom); + mapElement = map_get_surface_element_at(mapLeft >> 5, y2 >> 5); + z = map_get_corner_height(mapElement, 4); + result = sub_68C47A(flags, x, y, z, minZ); + if (result != MONEY32_UNDEFINED) { + totalCost += result; + } + minZ -= 2; + if (y >= mapTop) { + minZ += 2; + if (y > mapBottom) { + minZ += 2; + } + } + z = map_get_corner_height(mapElement, 8); + result = sub_68C3B2(flags, x, y, z, minZ); + if (result != MONEY32_UNDEFINED) { + totalCost += result; + } + + y += 32; + } + + // Corner (South-West) + mapElement = map_get_surface_element_at(mapLeft >> 5, mapBottom >> 5); + z = map_get_corner_height(mapElement, 8); + result = sub_68C47A(flags, x, y, z, minZ); + if (result != MONEY32_UNDEFINED) { + totalCost += result; + } + x += 32; + + // Side (South) + for (int i = 0; i < bx; i++) { + int x2 = clamp(mapLeft, x, mapRight); + mapElement = map_get_surface_element_at(x2 >> 5, mapBottom >> 5); + z = map_get_corner_height(mapElement, 8); + result = sub_68C222(flags, x, y, z, minZ); + if (result != MONEY32_UNDEFINED) { + totalCost += result; + } + minZ -= 2; + if (x >= mapLeft) { + minZ += 2; + if (x > mapRight) { + minZ += 2; + } + } + z = map_get_corner_height(mapElement, 1); + result = sub_68C47A(flags, x, y, z, minZ); + if (result != MONEY32_UNDEFINED) { + totalCost += result; + } + + x += 32; + } + + // Corner (South-East) + mapElement = map_get_surface_element_at(mapRight >> 5, mapBottom >> 5); + z = map_get_corner_height(mapElement, 1); + result = sub_68C222(flags, x, y, z, minZ); + if (result != MONEY32_UNDEFINED) { + totalCost += result; + } + y -= 32; + + // Side (East) + for (int i = 0; i < bx; i++) { + int y2 = clamp(mapTop, y, mapBottom); + mapElement = map_get_surface_element_at(mapRight >> 5, y2 >> 5); + z = map_get_corner_height(mapElement, 1); + result = sub_68C2EA(flags, x, y, z, minZ); + if (result != MONEY32_UNDEFINED) { + totalCost += result; + } + minZ -= 2; + if (y <= mapBottom) { + minZ += 2; + if (y < mapTop) { + minZ += 2; + } + } + z = map_get_corner_height(mapElement, 2); + result = sub_68C222(flags, x, y, z, minZ); + if (result != MONEY32_UNDEFINED) { + totalCost += result; + } + + y -= 32; + } + + // Corner (North-East) + mapElement = map_get_surface_element_at(mapRight >> 5, mapTop >> 5); + z = map_get_corner_height(mapElement, 2); + result = sub_68C2EA(flags, x, y, z, minZ); + if (result != MONEY32_UNDEFINED) { + totalCost += result; + } + x -= 32; + + // Side (North) + for (int i = 0; i < bx; i++) { + int x2 = clamp(mapLeft, x, mapRight); + mapElement = map_get_surface_element_at(x2 >> 5, mapTop >> 5); + z = map_get_corner_height(mapElement, 2); + result = sub_68C3B2(flags, x, y, z, minZ); + if (result != MONEY32_UNDEFINED) { + totalCost += result; + } + minZ -= 2; + if (x <= mapRight) { + minZ += 2; + if (x < mapLeft) { + minZ += 2; + } + } + z = map_get_corner_height(mapElement, 4); + result = sub_68C2EA(flags, x, y, z, minZ); + if (result != MONEY32_UNDEFINED) { + totalCost += result; + } + + x -= 32; + } + } + + *ebx = totalCost; } /** From fbd2598ac374aaa820e2dcea5e4b4192663b5239 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 11 Oct 2015 04:00:16 +0100 Subject: [PATCH 0813/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/portuguese_br.txt | 1080 ++++++++++++++++++++++--------- 1 file changed, 760 insertions(+), 320 deletions(-) diff --git a/data/language/portuguese_br.txt b/data/language/portuguese_br.txt index 37f674aaf7..dc64d25a67 100644 --- a/data/language/portuguese_br.txt +++ b/data/language/portuguese_br.txt @@ -1,4 +1,4 @@ -# STR_XXXX part is read and XXXX becomes the string id number. +# STR_XXXX part is read and XXXX becomes the string id number. # Everything after the colon and before the new line will be saved as the string. # Use # at the beginning of a line to leave a comment. STR_0000 : @@ -7,14 +7,14 @@ STR_0002 :Spiral Roller Coaster STR_0003 :Stand-up Roller Coaster STR_0004 :Suspended Swinging Coaster STR_0005 :Inverted Roller Coaster -STR_0006 :Montanha-Russa Junior +STR_0006 :Montanha-Russa Junior STR_0007 :Miniature Railway STR_0008 :Monotrilho STR_0009 :Mini Suspended Coaster STR_0010 :Boat Ride STR_0011 :Wooden Wild Mouse STR_0012 :Steeplechase -STR_0013 :Passeio de carro* +STR_0013 :Passeio de carro STR_0014 :Launched Freefall STR_0015 :Bobsleigh Coaster STR_0016 :Observation Tower @@ -23,44 +23,44 @@ STR_0018 :Dinghy Slide STR_0019 :Mine Train Coaster STR_0020 :Teleférico STR_0021 :Corkscrew Roller Coaster -STR_0022 :Maze +STR_0022 :Labirinto STR_0023 :Spiral Slide -STR_0024 :Go Karts +STR_0024 :Karts STR_0025 :Log Flume STR_0026 :River Rapids STR_0027 :Dodgems -STR_0028 :Pirate Ship +STR_0028 :Barco Pirata STR_0029 :Swinging Inverter Ship STR_0030 :Food Stall STR_0031 :Unknown Stall (1D) STR_0032 :Drink Stall STR_0033 :Unknown Stall (1F) STR_0034 :Shop -STR_0035 :Merry-Go-Round +STR_0035 :Carrossel STR_0036 :Unknown Stall (22) -STR_0037 :Quiosque -STR_0038 :Banheiro -STR_0039 :Ferris Wheel +STR_0037 :Quiosque de Informações +STR_0038 :Banheiros +STR_0039 :Roda Gigante STR_0040 :Motion Simulator -STR_0041 :3D Cinema +STR_0041 :Cinema 3D STR_0042 :Top Spin -STR_0043 :Space Rings +STR_0043 :Giroscopio Humano STR_0044 :Reverse Freefall Coaster STR_0045 :Elevador STR_0046 :Vertical Drop Roller Coaster -STR_0047 :Cash Machine +STR_0047 :Caixa Eletrônico STR_0048 :Twist -STR_0049 :Haunted House -STR_0050 :First Aid Room +STR_0049 :Casa Assombrada +STR_0050 :Primeiros Socorros STR_0051 :Circus Show STR_0052 :Ghost Train -STR_0053 :Hyper-Twister Roller Coaster +STR_0053 :Steel Twister Roller Coaster STR_0054 :Wooden Roller Coaster STR_0055 :Side-Friction Roller Coaster STR_0056 :Wild Mouse STR_0057 :Multi-Dimension Roller Coaster STR_0058 :Unknown Ride (38) -STR_0059 :Aerial Inverted Roller Coaster +STR_0059 :Flying Roller Coaster STR_0060 :Unknown Ride (3A) STR_0061 :Virginia Reel STR_0062 :Splash Boats @@ -70,7 +70,7 @@ STR_0065 :Monotrilho Suspenso STR_0066 :Unknown Ride (40) STR_0067 :Reverser Roller Coaster STR_0068 :Heartline Twister Coaster -STR_0069 :Mini Golf +STR_0069 :Mini Golfe STR_0070 :Giga Coaster STR_0071 :Roto-Drop STR_0072 :Flying Saucers @@ -80,8 +80,8 @@ STR_0075 :Compact Inverted Coaster STR_0076 :Montanha-Russa D'água STR_0077 :Air Powered Vertical Coaster STR_0078 :Inverted Hairpin Coaster -STR_0079 :Magic Carpet -STR_0080 :Submarine Ride +STR_0079 :Tapete Mágico +STR_0080 :Submarino STR_0081 :River Rafts STR_0082 :Unknown Ride (50) STR_0083 :Enterprise @@ -779,7 +779,7 @@ STR_0774 :Park Sem Nome{POP16}{POP16} STR_0775 :Park Sem Nome{POP16}{POP16} STR_0776 :Park Sem Nome{POP16}{POP16} STR_0777 :Park Sem Nome{POP16}{POP16} -STR_0778 :Entrar* +STR_0778 :Entrar STR_0779 :1º de STR_0780 :2 de STR_0781 :3 de @@ -851,15 +851,15 @@ STR_0845 : STR_0846 : STR_0847 :Sobre 'OpenRCT2' STR_0848 :RollerCoaster Tycoon 2 -STR_0849 :{WINDOW_COLOUR_2}Versão 2.01.028 -STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, Todos os Direitos Reservados +STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028 +STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, todos os Direitos Reservados STR_0851 :{WINDOW_COLOUR_2}Projetado e programado por Chris Sawyer STR_0852 :{WINDOW_COLOUR_2}Gráficos por Simon Foster STR_0853 :{WINDOW_COLOUR_2}Som e musícas por Allister Brimble STR_0854 :{WINDOW_COLOUR_2}Sons adicionais gravador por David Ellis STR_0855 :{WINDOW_COLOUR_2}Representação por Jacqui Lyons na Marjacq Ltd. STR_0856 :{WINDOW_COLOUR_2}Obrigado a: -STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth e John Wardley +STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth, and John Wardley STR_0858 :{WINDOW_COLOUR_2} STR_0859 :{WINDOW_COLOUR_2} STR_0860 :{WINDOW_COLOUR_2} @@ -886,8 +886,8 @@ STR_0880 :Não é possível aumentar a terra aqui... STR_0881 :Objeto no caminho STR_0882 :Carregar Jogo STR_0883 :Salvar Jogo -STR_0884 :Carregar Landscape* -STR_0885 :Salvar Landscape* +STR_0884 :Carregar Landscape +STR_0885 :Salvar Landscape STR_0886 :Sair do Jogo STR_0887 :Sair do Editor de Cenário STR_0888 :Sair do Designer de Montanha-Russa @@ -899,7 +899,7 @@ STR_0893 :Capturas de tela falhou ! STR_0894 :Landscape data area full ! STR_0895 :Impossível construir parcialmente em cima e em baixo do chão STR_0896 :{POP16}{POP16}{STRINGID} Construção -STR_0897 :Sentido* +STR_0897 :Sentido STR_0898 :{SMALLFONT}{BLACK}Curva para esquerda STR_0899 :{SMALLFONT}{BLACK}Curva para direita STR_0900 :{SMALLFONT}{BLACK}Curva para esquerda (raio pequeno) @@ -908,9 +908,9 @@ STR_0902 :{SMALLFONT}{BLACK}Curva para esquerda (raio muito pequeno) STR_0903 :{SMALLFONT}{BLACK}Curva para esquerda (raio muito pequeno) STR_0904 :{SMALLFONT}{BLACK}Curva para esquerda (raio grande) STR_0905 :{SMALLFONT}{BLACK}Curva para esquerda (raio grande) -STR_0906 :{SMALLFONT}{BLACK}Em Linha Reta* -STR_0907 :Inclinação* -STR_0908 :Rolar/Banking* +STR_0906 :{SMALLFONT}{BLACK}Em Linha Reta +STR_0907 :Inclinação +STR_0908 :Rolar/Banking STR_0909 :Seat Rot. STR_0910 :{SMALLFONT}{BLACK}Roll for left-hand curve STR_0911 :{SMALLFONT}{BLACK}Roll for right-hand curve @@ -930,7 +930,7 @@ STR_0924 :{SMALLFONT}{BLACK}Helix down STR_0925 :{SMALLFONT}{BLACK}Helix up STR_0926 :Impossível remover isto... STR_0927 :Impossível construir isto aqui... -STR_0928 :{SMALLFONT}{BLACK}Corrente elevador, para puxar os carros para cima** +STR_0928 :{SMALLFONT}{BLACK}Corrente elevador, para puxar os carros para cima STR_0929 :Curva 'S' (esquerda) STR_0930 :Curva 'S' (direita) STR_0931 :Loop Vertical (esquerda) @@ -945,7 +945,7 @@ STR_0939 :Subterrâneo/Visão interna STR_0940 :Remover base da terra STR_0941 :Remover faces verticais STR_0942 :Ver Através das Atrações -STR_0943 :Ver Através dos Cenários* +STR_0943 :Ver Através dos Cenários STR_0944 :Salvar STR_0945 :Não Salvar STR_0946 :Cancelar @@ -957,7 +957,7 @@ STR_0951 :Sair do Jogo STR_0952 :Sair do Jogo STR_0953 :Load Landscape STR_0954 : -STR_0955 :{SMALLFONT}{BLACK}Escolha um ângulo de rotação do assento para esta seção da pista* +STR_0955 :{SMALLFONT}{BLACK}Escolha um ângulo de rotação do assento para esta seção da pista STR_0956 :-180{DEGREE} STR_0957 :-135{DEGREE} STR_0958 :-90{DEGREE} @@ -980,11 +980,11 @@ STR_0974 :Atrações STR_0975 :Lojas, Barracas & Stands STR_0976 :Banheiros e Quiosques de Informações STR_0977 :Novas Atrações de Transporte -STR_0978 :Novas Atrações Suaves/Calmas* +STR_0978 :Novas Atrações Suaves/Calmas STR_0979 :Novas Montanhas-Russas STR_0980 :Novas Atrações Emocionantes STR_0981 :Novas Atrações Aquáticas -STR_0982 :Novas Lojas, Barracas & Stands* +STR_0982 :Novas Lojas, Barracas & Stands STR_0983 :Pesquisa e Desenvolvimento STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP} @@ -1010,7 +1010,7 @@ STR_1004 :Impossível Fechar {POP16}{POP16}{POP16}{STRINGID}... STR_1005 :Impossível começar a construção no {POP16}{POP16}{POP16}{STRINGID}... STR_1006 :Deve ser fechado primeiro STR_1007 :Impossível criar veículos suficientes -STR_1008 :{SMALLFONT}{BLACK}Abrir, fechar ou testar atração* +STR_1008 :{SMALLFONT}{BLACK}Abrir, fechar ou testar atração STR_1009 :{SMALLFONT}{BLACK}Abrir ou fechar todas as atrações STR_1010 :{SMALLFONT}{BLACK}Abrir ou fechar o parque STR_1011 :Fechar todos @@ -1030,7 +1030,7 @@ STR_1024 :{COMMA16} carro por trem STR_1025 :{COMMA16} carros por trens STR_1026 :Plataforma da estação é muito longa! STR_1027 :{SMALLFONT}{BLACK}Localizar isto na Visão Principal -STR_1028 :Fora da borada do mapa! +STR_1028 :Fora da borda do mapa! STR_1029 :Cannot build partly above and partly below water! STR_1030 :Can only build this underwater! STR_1031 :Can't build this underwater! @@ -1049,10 +1049,10 @@ STR_1043 :OpenRCT2 Jogo Salvo STR_1044 :OpenRCT2 Arquivo de Cenário STR_1045 :OpenRCT2 Landscape File STR_1046 :OpenRCT2 Arquivo de Projeto da Pista -STR_1047 :Salvar o jogo falhou! -STR_1048 :Salvar o cenário falhou! +STR_1047 :Falha ao salvar o jogo! +STR_1048 :Falha ao salvar o cenário! STR_1049 :Landscape save failed! -STR_1050 :Carregar o jogo falhou...{NEWLINE}Arquivo contém dados inválidos! +STR_1050 :Falha ao carregar o jogo...{NEWLINE}Arquivo contém dados inválidos! STR_1051 :Suportes Invisíveis STR_1052 :Pessoas Invisíveis STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park @@ -1061,12 +1061,12 @@ STR_1055 :{SMALLFONT}{BLACK}Name person STR_1056 :{SMALLFONT}{BLACK}Name staff member STR_1057 :Ride/attraction name STR_1058 :Digite o novo nome para esta atração: -STR_1059 :Impossível renomear a atração... -STR_1060 :Inválido nome para a atração +STR_1059 :Impossível renomear a atração.. +STR_1060 :Nome inválido para a atração STR_1061 :Modo normal STR_1062 :Modo de circuito contínuo STR_1063 :Reverse-Incline launched shuttle mode -STR_1064 :Lançamento alimentado* (passing station) +STR_1064 :Lançamento alimentado (estação de passagem) STR_1065 :Shuttle mode STR_1066 :Boat hire mode STR_1067 :Upward launch @@ -1089,8 +1089,8 @@ STR_1083 :Beginners mode STR_1084 :LIM-powered launch STR_1085 :Film: {ENDQUOTES}Thrill riders{ENDQUOTES} STR_1086 :Filme em 3D: {ENDQUOTES}Caçadores de tempestades{ENDQUOTES} -STR_1087 :Filme em 3D: {ENDQUOTES}Space raiders*{ENDQUOTES} -STR_1088 :Intense mode +STR_1087 :Filme em 3D: {ENDQUOTES}Caçadores do espaço{ENDQUOTES} +STR_1088 :Modo intenso STR_1089 :Berserk mode STR_1090 :Haunted house mode STR_1091 :Circus show mode @@ -1104,13 +1104,13 @@ STR_1098 :Moving to end of {POP16}{STRINGID} STR_1099 :Waiting for passengers at {POP16}{STRINGID} STR_1100 :Waiting to depart {POP16}{STRINGID} STR_1101 :Departing {POP16}{STRINGID} -STR_1102 :Travelling at {VELOCITY} -STR_1103 :Arriving at {POP16}{STRINGID} +STR_1102 :Viajando a {VELOCITY} +STR_1103 :Chegando a {POP16}{STRINGID} STR_1104 :Unloading passengers at {POP16}{STRINGID} -STR_1105 :Travelling at {VELOCITY} +STR_1105 :Viajando a {VELOCITY} STR_1106 :Falhando! STR_1107 :Quebrado! -STR_1108 :Travelling at {VELOCITY} +STR_1108 :Viajando a {VELOCITY} STR_1109 :Balançando STR_1110 :Rotacionando STR_1111 :Rotacionando @@ -1122,7 +1122,7 @@ STR_1116 :Operando STR_1117 :Doing circus show STR_1118 :Operando STR_1119 :Waiting for cable lift -STR_1120 :Travelling at {VELOCITY} +STR_1120 :Viajando a {VELOCITY} STR_1121 :Terminando STR_1122 :Aguardando passageiros STR_1123 :Aguardando para iniciar @@ -1146,15 +1146,15 @@ STR_1140 :{SMALLFONT}{BLACK}Selecione a opção do esquema de cor do veículo STR_1141 :{SMALLFONT}{BLACK}Selecione o veiculo/Trem para modificar STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} -STR_1144 :Can't build/move entrance for this ride/attraction... -STR_1145 :Can't build/move exit for this ride/attraction... -STR_1146 :Entrance not yet built -STR_1147 :Exit not yet built +STR_1144 :Impossível contruir/mover a entrada para essa atração... +STR_1145 :Impossível contruir/mover a saida para essa atração... +STR_1146 :Entrada ainda não construida +STR_1147 :Saida ainda não construida STR_1148 :Um quarto de carga -STR_1149 :Metade de carga* -STR_1150 :três quartos de carga* -STR_1151 :Carga total* -STR_1152 :Qualquer carga* +STR_1149 :Metade de carga +STR_1150 :Três quartos de carga +STR_1151 :Carga total +STR_1152 :Qualquer carga STR_1153 :Height Marks on Ride Tracks STR_1154 :Height Marks on Land STR_1155 :Height Marks on Paths @@ -1163,15 +1163,15 @@ STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} STR_1158 :Impossível remover isto... STR_1159 :{SMALLFONT}{BLACK}Coloque cenários, jardins, e outros acessórios STR_1160 :{SMALLFONT}{BLACK}Criar/ajustar lagos e água -STR_1161 :Can't position this here... +STR_1161 :Impossível posicionar isto aqui... STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} -STR_1163 :{STRINGID}{NEWLINE}(Right-Click to Modify) -STR_1164 :{STRINGID}{NEWLINE}(Right-Click to Remove) +STR_1163 :{STRINGID}{NEWLINE}(Botão direito para modificar) +STR_1164 :{STRINGID}{NEWLINE}(Botão direito para remover) STR_1165 :{STRINGID} - {STRINGID} {COMMA16} STR_1166 :Impossível diminuir o nível da água aqui... STR_1167 :Impossível aumentar o nível da água aqui... STR_1168 :Opções -STR_1169 :(None) +STR_1169 :(Nenhum) STR_1170 :{STRING} STR_1171 :{RED}Fechado - - STR_1172 :{YELLOW}{STRINGID} - - @@ -1182,22 +1182,22 @@ STR_1176 :Can't build footpath here... STR_1177 :Can't remove footpath from here... STR_1178 :Land slope unsuitable STR_1179 :Footpath in the way -STR_1180 :Can't build this underwater! -STR_1181 :Footpaths -STR_1182 :Type -STR_1183 :Direction -STR_1184 :Slope -STR_1185 :{SMALLFONT}{BLACK}Direction -STR_1186 :{SMALLFONT}{BLACK}Slope down -STR_1187 :{SMALLFONT}{BLACK}Level -STR_1188 :{SMALLFONT}{BLACK}Slope up +STR_1180 :Impossível construir isto debaixo de água! +STR_1181 :Caminhos +STR_1182 :Tipo +STR_1183 :Direção +STR_1184 :Inclinação +STR_1185 :{SMALLFONT}{BLACK}Direção +STR_1186 :{SMALLFONT}{BLACK}inclinação para baixo +STR_1187 :{SMALLFONT}{BLACK}Nível +STR_1188 :{SMALLFONT}{BLACK}inclinação para cima STR_1189 :{SMALLFONT}{BLACK}Construct the selected footpath section STR_1190 :{SMALLFONT}{BLACK}Remove previous footpath section STR_1191 :{BLACK}{STRINGID} STR_1192 :{OUTLINE}{RED}{STRINGID} STR_1193 :{WINDOW_COLOUR_2}{STRINGID} STR_1194 :Fechado -STR_1195 :Executar teste* +STR_1195 :Executar teste STR_1196 :Aberto STR_1197 :Enguiçou STR_1198 :Quebrado! @@ -1223,14 +1223,14 @@ STR_1217 :{COMMA16} seconds STR_1218 :{BLACK}{SMALLUP} STR_1219 :{BLACK}{SMALLDOWN} STR_1220 :Somente Saida -STR_1221 :No entrance* -STR_1222 :No exit* +STR_1221 :Sem entrada +STR_1222 :Sem saída STR_1223 :{SMALLFONT}{BLACK}Atrações de Transporte STR_1224 :{SMALLFONT}{BLACK}Atrações Suaves/Calmas STR_1225 :{SMALLFONT}{BLACK}Montanhas-Russas STR_1226 :{SMALLFONT}{BLACK}Atrações Emocionantes STR_1227 :{SMALLFONT}{BLACK}Atrações Aquáticas -STR_1228 :{SMALLFONT}{BLACK}Lojas, Barracas & Stands* +STR_1228 :{SMALLFONT}{BLACK}Lojas, Barracas & Stands STR_1229 :trem STR_1230 :trens STR_1231 :Trem @@ -1338,11 +1338,11 @@ STR_1332 :{VELOCITY} STR_1333 :{STRINGID} - {STRINGID}{POP16} STR_1334 :{STRINGID} - {STRINGID} {COMMA16} STR_1335 :{STRINGID} - Entrada{POP16}{POP16} -STR_1336 :{STRINGID} - Estação* {POP16}{COMMA16} Entrada* +STR_1336 :{STRINGID} - Estação {POP16}{COMMA16} Entrada STR_1337 :{STRINGID} - Saida{POP16}{POP16} -STR_1338 :{STRINGID} - Estação* {POP16}{COMMA16} Saida* +STR_1338 :{STRINGID} - Estação {POP16}{COMMA16} Saida STR_1339 :{BLACK}Nenhum resultado de teste ainda... -STR_1340 :{WINDOW_COLOUR_2}Max. speed: {BLACK}{VELOCITY} +STR_1340 :{WINDOW_COLOUR_2}Vel. Max.: {BLACK}{VELOCITY} STR_1341 :{WINDOW_COLOUR_2}Ride time: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} STR_1342 :{DURATION} STR_1343 :{DURATION} / @@ -1388,36 +1388,36 @@ STR_1382 :Curved Lift Hill (right) STR_1383 :Quarter Loop STR_1384 :{YELLOW}{STRINGID} STR_1385 :{SMALLFONT}{BLACK}Other track configurations -STR_1386 :Special... +STR_1386 :Especial... STR_1387 :Can't change land type... STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} STR_1389 :{OUTLINE}{RED}- {CURRENCY} STR_1390 :{CURRENCY2DP} STR_1391 :{RED}{CURRENCY2DP} -STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction -STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options -STR_1394 :{SMALLFONT}{BLACK}Operating options -STR_1395 :{SMALLFONT}{BLACK}Maintenance options -STR_1396 :{SMALLFONT}{BLACK}Colour scheme options -STR_1397 :{SMALLFONT}{BLACK}Sound & music options -STR_1398 :{SMALLFONT}{BLACK}Measurements and test data -STR_1399 :{SMALLFONT}{BLACK}Graphs +STR_1392 :{SMALLFONT}{BLACK}Visão da atração +STR_1393 :{SMALLFONT}{BLACK}Opções e detalhes do veiculo +STR_1394 :{SMALLFONT}{BLACK}Opções de operação +STR_1395 :{SMALLFONT}{BLACK}Opções de manutenção +STR_1396 :{SMALLFONT}{BLACK}Opções de esquema de cor +STR_1397 :{SMALLFONT}{BLACK}Opções de som e música +STR_1398 :{SMALLFONT}{BLACK}Medições e dados teste +STR_1399 :{SMALLFONT}{BLACK}Gráficos STR_1400 :Entrada -STR_1401 :Saida -STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction -STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction -STR_1404 :{SMALLFONT}{BLACK}Rotate 90{DEGREE} -STR_1405 :{SMALLFONT}{BLACK}Mirror image -STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) -STR_1407 :{WINDOW_COLOUR_2}Build this... -STR_1408 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} -STR_1409 :Entry/Exit Platform -STR_1410 :Vertical Tower -STR_1411 :{STRINGID} in the way +STR_1401 :Saída +STR_1402 :{SMALLFONT}{BLACK}Construir ou mover a entrada da atração +STR_1403 :{SMALLFONT}{BLACK}Construir ou mover a saída da atração +STR_1404 :{SMALLFONT}{BLACK}Rotacionar 90{DEGREE} +STR_1405 :{SMALLFONT}{BLACK}Imagem espelhada +STR_1406 :{SMALLFONT}{BLACK}Alternar cenário on / off (se disponível para este projeto) +STR_1407 :{WINDOW_COLOUR_2}Construir isto... +STR_1408 :{WINDOW_COLOUR_2}Custo: {BLACK}{CURRENCY} +STR_1409 :Entrada/Saída Plataforma +STR_1410 :Torre Vertical +STR_1411 :{STRINGID} no caminho STR_1412 :{WINDOW_COLOUR_3}Data logging not available for this type of ride STR_1413 :{WINDOW_COLOUR_3}Data logging will start when next {STRINGID} leaves {STRINGID} STR_1414 :{SMALLFONT}{BLACK}{DURATION} -STR_1415 :{WINDOW_COLOUR_2}Velocity +STR_1415 :{WINDOW_COLOUR_2}Velocidade STR_1416 :{WINDOW_COLOUR_2}Altitude STR_1417 :{WINDOW_COLOUR_2}Vert.G's STR_1418 :{WINDOW_COLOUR_2}Lat.G's @@ -1425,32 +1425,32 @@ STR_1419 :{SMALLFONT}{BLACK}{VELOCITY} STR_1420 :{SMALLFONT}{BLACK}{LENGTH} STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g STR_1422 :{SMALLFONT}{BLACK}Logging data from {POP16}{STRINGID} -STR_1423 :{SMALLFONT}{BLACK}Queue line path -STR_1424 :{SMALLFONT}{BLACK}Footpath -STR_1425 :Footpath -STR_1426 :Queue Line -STR_1427 :{WINDOW_COLOUR_2}Customers: {BLACK}{COMMA32} per hour -STR_1428 :{WINDOW_COLOUR_2}Admission price: +STR_1423 :{SMALLFONT}{BLACK}Caminho da fila +STR_1424 :{SMALLFONT}{BLACK}Trajeto +STR_1425 :Trajeto +STR_1426 :Fila de espera +STR_1427 :{WINDOW_COLOUR_2}Clientes: {BLACK}{COMMA32} por hora +STR_1428 :{WINDOW_COLOUR_2}Preço de entrada: STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} -STR_1430 :Free +STR_1430 :Livre STR_1431 :Andando STR_1432 :Rumo a {STRINGID} STR_1433 :Filas para {STRINGID} STR_1434 :Afogando STR_1435 :Em {STRINGID} -STR_1436 :No {STRINGID} -STR_1437 :Na {STRINGID} -STR_1438 :Sentado -STR_1439 :(selecione o local) +STR_1436 :In {STRINGID} +STR_1437 :At {STRINGID} +STR_1438 :Sentando +STR_1439 :(select location) STR_1440 :Cortando grama -STR_1441 :Varrer calçada +STR_1441 :Varrendo calçada STR_1442 :Esvaziando lixeira STR_1443 :Regando jardins STR_1444 :Assistindo {STRINGID} STR_1445 :Assistindo construção de {STRINGID} STR_1446 :Olhando para paisagem STR_1447 :Saindo do parque -STR_1448 :Watching new ride being constructed +STR_1448 :Assistindo a nova atração sendo construida STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) @@ -1460,92 +1460,92 @@ STR_1454 :Não é possivel nomear o visitante... STR_1455 :Nome invalido para o visitante STR_1456 :{WINDOW_COLOUR_2}Dinheiro gasto: {BLACK}{CURRENCY2DP} STR_1457 :{WINDOW_COLOUR_2}Dinheiro no bolso: {BLACK}{CURRENCY2DP} -STR_1458 :{WINDOW_COLOUR_2}Tempo no park: {BLACK}{REALTIME} -STR_1459 :Track style +STR_1458 :{WINDOW_COLOUR_2}Tempo no parque: {BLACK}{REALTIME} +STR_1459 :Estilo da pista STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track STR_1462 :Too steep for lift hill STR_1463 :Visitantes -STR_1464 :Helix up (small) -STR_1465 :Helix up (large) -STR_1466 :Helix down (small) -STR_1467 :Helix down (large) -STR_1468 :Staff +STR_1464 :Hélice cima (pequeno) +STR_1465 :Hélice cima (grande) +STR_1466 :Hélice baixo (pequeno) +STR_1467 :Hélice baixo (grande) +STR_1468 :Funcionários STR_1469 :Ride must start and end with stations STR_1470 :Station not long enough -STR_1471 :{WINDOW_COLOUR_2}Speed: +STR_1471 :{WINDOW_COLOUR_2}Velocidade: STR_1472 :{SMALLFONT}{BLACK}Velocidade desta atração -STR_1473 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1474 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}Not yet available -STR_1475 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1476 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}Not yet available -STR_1477 :{WINDOW_COLOUR_2}Intensity rating: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) -STR_1478 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1479 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}Not yet available -STR_1480 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} -STR_1481 :{SMALLFONT}{OPENQUOTES}I've spent all my money{ENDQUOTES} -STR_1482 :{SMALLFONT}{OPENQUOTES}I feel sick{ENDQUOTES} -STR_1483 :{SMALLFONT}{OPENQUOTES}I feel very sick{ENDQUOTES} -STR_1484 :{SMALLFONT}{OPENQUOTES}I want to go on something more thrilling than {STRINGID}{ENDQUOTES} -STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} looks too intense for me{ENDQUOTES} -STR_1486 :{SMALLFONT}{OPENQUOTES}I haven't finished my {STRINGID} yet{ENDQUOTES} -STR_1487 :{SMALLFONT}{OPENQUOTES}Just looking at {STRINGID} makes me feel sick{ENDQUOTES} -STR_1488 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to go on {STRINGID}{ENDQUOTES} -STR_1489 :{SMALLFONT}{OPENQUOTES}I want to go home{ENDQUOTES} -STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} is really good value{ENDQUOTES} -STR_1491 :{SMALLFONT}{OPENQUOTES}I've already got {STRINGID}{ENDQUOTES} -STR_1492 :{SMALLFONT}{OPENQUOTES}I can't afford {STRINGID}{ENDQUOTES} -STR_1493 :{SMALLFONT}{OPENQUOTES}I'm not hungry{ENDQUOTES} -STR_1494 :{SMALLFONT}{OPENQUOTES}I'm not thirsty{ENDQUOTES} -STR_1495 :{SMALLFONT}{OPENQUOTES}Help! I'm drowning!{ENDQUOTES} -STR_1496 :{SMALLFONT}{OPENQUOTES}I'm lost!{ENDQUOTES} -STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} was great{ENDQUOTES} -STR_1498 :{SMALLFONT}{OPENQUOTES}I've been queuing for {STRINGID} for ages{ENDQUOTES} -STR_1499 :{SMALLFONT}{OPENQUOTES}I'm tired{ENDQUOTES} -STR_1500 :{SMALLFONT}{OPENQUOTES}I'm hungry{ENDQUOTES} -STR_1501 :{SMALLFONT}{OPENQUOTES}I'm thirsty{ENDQUOTES} -STR_1502 :{SMALLFONT}{OPENQUOTES}I need to go to the bathroom{ENDQUOTES} -STR_1503 :{SMALLFONT}{OPENQUOTES}I can't find {STRINGID}{ENDQUOTES} -STR_1504 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to use {STRINGID}{ENDQUOTES} -STR_1505 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} while it's raining{ENDQUOTES} -STR_1506 :{SMALLFONT}{OPENQUOTES}The litter here is really bad{ENDQUOTES} -STR_1507 :{SMALLFONT}{OPENQUOTES}I can't find the park exit{ENDQUOTES} -STR_1508 :{SMALLFONT}{OPENQUOTES}I want to get off {STRINGID}{ENDQUOTES} -STR_1509 :{SMALLFONT}{OPENQUOTES}I want to get out of {STRINGID}{ENDQUOTES} -STR_1510 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} - It isn't safe{ENDQUOTES} -STR_1511 :{SMALLFONT}{OPENQUOTES}This path is disgusting{ENDQUOTES} -STR_1512 :{SMALLFONT}{OPENQUOTES}It's too crowded here{ENDQUOTES} -STR_1513 :{SMALLFONT}{OPENQUOTES}The vandalism here is really bad{ENDQUOTES} -STR_1514 :{SMALLFONT}{OPENQUOTES}Great scenery!{ENDQUOTES} -STR_1515 :{SMALLFONT}{OPENQUOTES}This park is really clean and tidy{ENDQUOTES} -STR_1516 :{SMALLFONT}{OPENQUOTES}The jumping fountains are great{ENDQUOTES} -STR_1517 :{SMALLFONT}{OPENQUOTES}The music is nice here{ENDQUOTES} -STR_1518 :{SMALLFONT}{OPENQUOTES}This balloon from {STRINGID} is really good value{ENDQUOTES} -STR_1519 :{SMALLFONT}{OPENQUOTES}This cuddly toy from {STRINGID} is really good value{ENDQUOTES} -STR_1520 :{SMALLFONT}{OPENQUOTES}This park map from {STRINGID} is really good value{ENDQUOTES} -STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} -STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} -STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} -STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} -STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} -STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} -STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} +STR_1473 :{WINDOW_COLOUR_2}Classificação de emoção: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1474 :{WINDOW_COLOUR_2}Classificação de emoção: {BLACK}Indisponível +STR_1475 :{WINDOW_COLOUR_2}Classificação de intensidade: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1476 :{WINDOW_COLOUR_2}Classificação de intensidade: {BLACK}Indisponível +STR_1477 :{WINDOW_COLOUR_2}Classificação de intensidade: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) +STR_1478 :{WINDOW_COLOUR_2}Classificação de náuseas: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1479 :{WINDOW_COLOUR_2}Classificação de náuseas: {BLACK}Indisponível +STR_1480 :{SMALLFONT}{OPENQUOTES}Eu não posso pagar{STRINGID}{ENDQUOTES} +STR_1481 :{SMALLFONT}{OPENQUOTES}Eu gastei todo o meu dinheiro{ENDQUOTES} +STR_1482 :{SMALLFONT}{OPENQUOTES}Eu me sinto mal{ENDQUOTES} +STR_1483 :{SMALLFONT}{OPENQUOTES}Eu me sinto muito mal{ENDQUOTES} +STR_1484 :{SMALLFONT}{OPENQUOTES}Eu quero ir em algo mais emocionante do que {STRINGID}{ENDQUOTES} +STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} parece muito intenso para mim{ENDQUOTES} +STR_1486 :{SMALLFONT}{OPENQUOTES}Eu não terminei meu {STRINGID} ainda{ENDQUOTES} +STR_1487 :{SMALLFONT}{OPENQUOTES}Basta olhar para {STRINGID} para me sentir mal{ENDQUOTES} +STR_1488 :{SMALLFONT}{OPENQUOTES}Eu não estou pagando muito para ir em {STRINGID}{ENDQUOTES} +STR_1489 :{SMALLFONT}{OPENQUOTES}Eu quero ir para casa{ENDQUOTES} +STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} é realmente bom preço{ENDQUOTES} +STR_1491 :{SMALLFONT}{OPENQUOTES}Eu já tenho {STRINGID}{ENDQUOTES} +STR_1492 :{SMALLFONT}{OPENQUOTES}Não posso pagar {STRINGID}{ENDQUOTES} +STR_1493 :{SMALLFONT}{OPENQUOTES}Eu não estou com fome{ENDQUOTES} +STR_1494 :{SMALLFONT}{OPENQUOTES}Eu não estou com sede{ENDQUOTES} +STR_1495 :{SMALLFONT}{OPENQUOTES}Socorro! Estou me afogando!{ENDQUOTES} +STR_1496 :{SMALLFONT}{OPENQUOTES}Eu estou perdido!{ENDQUOTES} +STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} foi ótimo{ENDQUOTES} +STR_1498 :{SMALLFONT}{OPENQUOTES}Eu estive na fila para {STRINGID} por anos{ENDQUOTES} +STR_1499 :{SMALLFONT}{OPENQUOTES}Eu estou cansado{ENDQUOTES} +STR_1500 :{SMALLFONT}{OPENQUOTES}Eu estou com fome{ENDQUOTES} +STR_1501 :{SMALLFONT}{OPENQUOTES}Eu estou com sede{ENDQUOTES} +STR_1502 :{SMALLFONT}{OPENQUOTES}Eu preciso ir ao banheiro{ENDQUOTES} +STR_1503 :{SMALLFONT}{OPENQUOTES}Eu não consigo encontrar {STRINGID}{ENDQUOTES} +STR_1504 :{SMALLFONT}{OPENQUOTES}Eu não estou pagando muito de usar {STRINGID}{ENDQUOTES} +STR_1505 :{SMALLFONT}{OPENQUOTES}Eu não estou indo em {STRINGID} enquanto está chovendo{ENDQUOTES} +STR_1506 :{SMALLFONT}{OPENQUOTES}O lixo aqui é muito ruim{ENDQUOTES} +STR_1507 :{SMALLFONT}{OPENQUOTES}Eu não estou encontrando a saída do parque{ENDQUOTES} +STR_1508 :{SMALLFONT}{OPENQUOTES}Eu quero sair{STRINGID}{ENDQUOTES} +STR_1509 :{SMALLFONT}{OPENQUOTES}Eu quero sair do {STRINGID}{ENDQUOTES} +STR_1510 :{SMALLFONT}{OPENQUOTES}Eu não estou indo em {STRINGID} - Não é seguro{ENDQUOTES} +STR_1511 :{SMALLFONT}{OPENQUOTES}Este caminho é nojento{ENDQUOTES} +STR_1512 :{SMALLFONT}{OPENQUOTES}Está lotado aqui{ENDQUOTES} +STR_1513 :{SMALLFONT}{OPENQUOTES}O vandalismo aqui é muito ruim{ENDQUOTES} +STR_1514 :{SMALLFONT}{OPENQUOTES}Excelente cenário!{ENDQUOTES} +STR_1515 :{SMALLFONT}{OPENQUOTES}Este parque é realmente limpo e arrumado{ENDQUOTES} +STR_1516 :{SMALLFONT}{OPENQUOTES}As fontes de salto são ótimas{ENDQUOTES} +STR_1517 :{SMALLFONT}{OPENQUOTES}A música é agradável aqui{ENDQUOTES} +STR_1518 :{SMALLFONT}{OPENQUOTES}Este balão de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1519 :{SMALLFONT}{OPENQUOTES}Este brinquedo pelúcia de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1520 :{SMALLFONT}{OPENQUOTES}Este mapa do parque de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1521 :{SMALLFONT}{OPENQUOTES}Esta foto na atração de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1522 :{SMALLFONT}{OPENQUOTES}Este guarda-chuva de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1523 :{SMALLFONT}{OPENQUOTES}Esta bebida de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1524 :{SMALLFONT}{OPENQUOTES}Este hambúrguer de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}Estas batatas fritas de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1526 :{SMALLFONT}{OPENQUOTES}Este sorvete de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}Este algodão-doce de {STRINGID} tem um bom preço{ENDQUOTES} STR_1528 : STR_1529 : STR_1530 : -STR_1531 :{SMALLFONT}{OPENQUOTES}This pizza from {STRINGID} is really good value{ENDQUOTES} +STR_1531 :{SMALLFONT}{OPENQUOTES}Esta pizza de {STRINGID} tem um bom preço{ENDQUOTES} STR_1532 : -STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good value{ENDQUOTES} -STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} -STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} -STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} -STR_1537 :{SMALLFONT}{OPENQUOTES}This toffee apple from {STRINGID} is really good value{ENDQUOTES} -STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} -STR_1539 :{SMALLFONT}{OPENQUOTES}This doughnut from {STRINGID} is really good value{ENDQUOTES} -STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} +STR_1533 :{SMALLFONT}{OPENQUOTES}Esta pipoca de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1534 :{SMALLFONT}{OPENQUOTES}Este cachorro quente de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1535 :{SMALLFONT}{OPENQUOTES}Este tentáculo de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1536 :{SMALLFONT}{OPENQUOTES}Este chapéu de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}Esta maça do amor de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1538 :{SMALLFONT}{OPENQUOTES}Esta camiseta de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}Esta rosquinha de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1540 :{SMALLFONT}{OPENQUOTES}Este café de {STRINGID} tem um bom preço{ENDQUOTES} STR_1541 : -STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} -STR_1543 :{SMALLFONT}{OPENQUOTES}This lemonade from {STRINGID} is really good value{ENDQUOTES} +STR_1542 :{SMALLFONT}{OPENQUOTES}Este frango frito de {STRINGID} tem um bom preço{ENDQUOTES} +STR_1543 :{SMALLFONT}{OPENQUOTES}Esta limonada de {STRINGID} tem um bom preço{ENDQUOTES} STR_1544 : STR_1545 : STR_1546 : @@ -1661,9 +1661,9 @@ STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land STR_1656 :{SMALLFONT}{BLACK}Construct bridge or tunnel footpath STR_1657 :{WINDOW_COLOUR_2}Atração preferida STR_1658 :{WINDOW_COLOUR_2}intensidade: {BLACK}menor que {COMMA16} -STR_1659 :{WINDOW_COLOUR_2}intensidade: {BLACK}entre {COMMA16} e {COMMA16} +STR_1659 :{WINDOW_COLOUR_2}intensidade: {BLACK}entre {COMMA16} and {COMMA16} STR_1660 :{WINDOW_COLOUR_2}intensidade: {BLACK}maior que {COMMA16} -STR_1661 :{WINDOW_COLOUR_2}Tolerância à náuseas: {BLACK}{STRINGID} +STR_1661 :{WINDOW_COLOUR_2}Tolerância à náuseas:{BLACK}{STRINGID} STR_1662 :{WINDOW_COLOUR_2}Felicidade: STR_1663 :{WINDOW_COLOUR_2}Náusea: STR_1664 :{WINDOW_COLOUR_2}Energia: @@ -1676,41 +1676,41 @@ STR_1670 :{WINDOW_COLOUR_2}Total de clientes: {BLACK}{COMMA32} STR_1671 :{WINDOW_COLOUR_2}Lucro total: {BLACK}{CURRENCY2DP} STR_1672 :Freios STR_1673 :Spinning Control Toggle Track -STR_1674 :Brake speed +STR_1674 :Velocidade do freio STR_1675 :{POP16}{VELOCITY} STR_1676 :{SMALLFONT}{BLACK}Set speed limit for brakes STR_1677 :{WINDOW_COLOUR_2}Popularidade: {BLACK}Desconhecido STR_1678 :{WINDOW_COLOUR_2}Popularidade: {BLACK}{COMMA16}% -STR_1679 :Hélice Cima (esquerda)* -STR_1680 :Hélice Cima (direita)* -STR_1681 :Hélice Baixo (esqueda)* -STR_1682 :Hélice Baixo (direita)* -STR_1683 :Base size 2 x 2 -STR_1684 :Base size 4 x 4 -STR_1685 :Base size 2 x 4 -STR_1686 :Base size 5 x 1 -STR_1687 :Water splash -STR_1688 :Base size 4 x 1 +STR_1679 :Hélice Cima (esquerda) +STR_1680 :Hélice Cima (direita) +STR_1681 :Hélice Baixo (esqueda) +STR_1682 :Hélice Baixo (direita) +STR_1683 :Tamanho da base 2 x 2 +STR_1684 :Tamanho da base 4 x 4 +STR_1685 :Tamanho da base 2 x 4 +STR_1686 :Tamanho da base 5 x 1 +STR_1687 :Respingo da água +STR_1688 :Tamanho da base 4 x 1 STR_1689 :Block brakes STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} STR_1691 :{WINDOW_COLOUR_2} Cost: {BLACK}{CURRENCY} STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY} STR_1693 :{SMALLFONT}{BLACK}Visitantes STR_1694 :{SMALLFONT}{BLACK}Funcionários -STR_1695 :{SMALLFONT}{BLACK}Rendimentos e gastos* -STR_1696 :{SMALLFONT}{BLACK}Informação para os clientes* +STR_1695 :{SMALLFONT}{BLACK}Rendimentos e gastos +STR_1696 :{SMALLFONT}{BLACK}Informação para os clientes STR_1697 :Cannot place these on queue line area STR_1698 :Can only place these on queue area STR_1699 :Muitas pessoas no jogo -STR_1700 :Contratar novo Faz-Tudo* -STR_1701 :Contratar novo Mecânico* -STR_1702 :Contratar novo Segurança* -STR_1703 :Contratar novo Animador* +STR_1700 :Contratar novo Faz-Tudo +STR_1701 :Contratar novo Mecânico +STR_1702 :Contratar novo Segurança +STR_1703 :Contratar novo Animador STR_1704 :Impossível contratar novos funcionários... STR_1705 :{SMALLFONT}{BLACK}Demitir este funcionário -STR_1706 :{SMALLFONT}{BLACK}Move this person to a new location +STR_1706 :{SMALLFONT}{BLACK}Mover essa pessao para um novo local STR_1707 :Muitos funcionários no jogo -STR_1708 :{SMALLFONT}{BLACK}Set patrol area for this staff member +STR_1708 :{SMALLFONT}{BLACK}Definir área de patrulha do funcionário STR_1709 :Demitir funcionário STR_1710 :Sim STR_1711 :{WINDOW_COLOUR_1}Are you sure you want to sack {STRINGID}? @@ -1729,27 +1729,27 @@ STR_1723 :Impossível abrir o park... STR_1724 :Impossível fechar o park... STR_1725 :Impossível comprar Can't buy região... STR_1726 :Região não está a venda! -STR_1727 :Construction rights not for sale! -STR_1728 :Can't buy construction rights here... -STR_1729 :Land not owned by park! +STR_1727 :Direitos de construção não está à venda! +STR_1728 :Não pode comprar os direitos de construção aqui... +STR_1729 :Os terrenos não são propriedade do parque! STR_1730 :{RED}Fechado - - STR_1731 :{WHITE}{STRINGID} - - STR_1732 :Construir STR_1733 :Modo -STR_1734 :{WINDOW_COLOUR_2}Number of laps: -STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit +STR_1734 :{WINDOW_COLOUR_2}Número de voltas: +STR_1735 :{SMALLFONT}{BLACK}Número de voltas do circuito STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1737 :{COMMA16} -STR_1738 :Can't change number of laps... +STR_1738 :Impossível alterar o número de voltas... STR_1739 :Corrida ganha pelo visitante {INT32} STR_1740 :Corrida ganha por {STRINGID} -STR_1741 :Ainda não construido! -STR_1742 :{WINDOW_COLOUR_2}Max. people on ride: -STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this ride at one time +STR_1741 :Ainda não construido ! +STR_1742 :{WINDOW_COLOUR_2}Max. pessoas na atração: +STR_1743 :{SMALLFONT}{BLACK}Número máximo permitido de pessoas na atração por vez STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1745 :{COMMA16} -STR_1746 :Can't change this... -STR_1747 :{WINDOW_COLOUR_2}Time limit: +STR_1746 :Impossível alterar isto... +STR_1747 :{WINDOW_COLOUR_2}Tempo limite: STR_1748 :{SMALLFONT}{BLACK}Time limit for ride STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} STR_1750 :{DURATION} @@ -1759,13 +1759,13 @@ STR_1753 :{SMALLFONT}{BLACK}Show summarised list of guests in park STR_1754 :{BLACK}{COMMA16} visitantes STR_1755 :{BLACK}{COMMA16} visitante STR_1756 :{WINDOW_COLOUR_2}Preço de entrada: -STR_1757 :{WINDOW_COLOUR_2}confiabilidade: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1757 :{WINDOW_COLOUR_2}Confiabilidade: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1758 :{SMALLFONT}{BLACK}Modo de construção STR_1759 :{SMALLFONT}{BLACK}Modo de movimentação -STR_1760 :{SMALLFONT}{BLACK}Modo de Preenchimento +STR_1760 :{SMALLFONT}{BLACK}Modo de Preenchiment STR_1761 :{SMALLFONT}{BLACK}Construir labirinto nessa direção STR_1762 :Cachoeiras -STR_1763 :Rapids +STR_1763 :Corredeiras STR_1764 :Log Bumps STR_1765 :On-ride photo section STR_1766 :Reverser turntable @@ -1779,7 +1779,7 @@ STR_1773 :Only one on-ride photo section allowed per ride STR_1774 :Only one cable lift hill allowed per ride STR_1775 :Desligado STR_1776 :Ligado -STR_1777 :{WINDOW_COLOUR_2}Música +STR_1777 :{WINDOW_COLOUR_2}Música: STR_1778 :{STRINGID} - - STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Fantasia de panda STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Fantasia de tigre @@ -1792,30 +1792,30 @@ STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Fantasia de astronauta STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Fantasia de bandido STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Fantasia de xerife STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Fantasia de pirata -STR_1790 :{SMALLFONT}{BLACK}Selecione a cor do uniforme para este tipo de equipe +STR_1790 :{SMALLFONT}{BLACK}Selecione a cor do uniforme para este tipo de funcionário STR_1791 :{WINDOW_COLOUR_2}Cor do uniforme: -STR_1792 :Respondendo a chamada de quebra da {STRINGID}* -STR_1793 :Rumo ao {STRINGID} para uma inspecção* -STR_1794 :Reparando a {STRINGID}* +STR_1792 :Respondendo a chamada de quebra da {STRINGID} +STR_1793 :Rumo ao {STRINGID} para uma inspecção +STR_1794 :Reparando a {STRINGID} STR_1795 :Respondendo a chamada do rádio STR_1796 :Esta quebrado e requer conserto STR_1797 :Esta opção não pode ser alterada para esta atração STR_1798 :Turbilhão STR_1799 :{POP16}{POP16}{POP16}{POP16}{POP16}{CURRENCY2DP} -STR_1800 :Segurança cortada* -STR_1801 :Restrições presas fechadas* -STR_1802 :Restrições presas abertas* +STR_1800 :Segurança cortada +STR_1801 :Restrições presas fechadas +STR_1802 :Restrições presas abertas STR_1803 :Portas emperradas fechadas STR_1804 :Portas emperradas abertas STR_1805 :Veículo em mal funcionamento -STR_1806 :Falha nos freios* -STR_1807 :Falha nos controles* +STR_1806 :Falha nos freios +STR_1807 :Falha nos controles STR_1808 :{WINDOW_COLOUR_2}Última quebra: {BLACK}{STRINGID} STR_1809 :{WINDOW_COLOUR_2}Atualmente quebrado: {OUTLINE}{RED}{STRINGID} STR_1810 :{WINDOW_COLOUR_2}Transportando: STR_1811 :Impossível construir isto aqui... STR_1812 :{SMALLFONT}{BLACK}{STRINGID} -STR_1813 :Objetos váriados* +STR_1813 :Objetos váriados STR_1814 :Ações STR_1815 :Pensamentos STR_1816 :{SMALLFONT}{BLACK}Selecione o tipo de informação para mostrar na lista de visitantes @@ -1823,11 +1823,11 @@ STR_1817 :({COMMA16}) STR_1818 :{WINDOW_COLOUR_2}Todos os visitantes STR_1819 :{WINDOW_COLOUR_2}Todos os visitantes (resumido) STR_1820 :{WINDOW_COLOUR_2}Visitantes {STRINGID} -STR_1821 :{WINDOW_COLOUR_2}Pensamentos dos visitantes* {STRINGID} -STR_1822 :{WINDOW_COLOUR_2}Visistantes pensam sobre* {POP16}{STRINGID} +STR_1821 :{WINDOW_COLOUR_2}Pensamentos dos visitantes {STRINGID} +STR_1822 :{WINDOW_COLOUR_2}Visistantes pensam sobre {{POP16}{STRINGID} STR_1823 :{SMALLFONT}{BLACK}Mostrar os pensamentos dos visitantes sobre essa atração -STR_1824 :{SMALLFONT}{BLACK}Mostrar os visitantes nesta atração* -STR_1825 :{SMALLFONT}{BLACK}Mostrar os visitantes na fila para essa atração* +STR_1824 :{SMALLFONT}{BLACK}Mostrar os visitantes nesta atração +STR_1825 :{SMALLFONT}{BLACK}Mostrar os visitantes na fila para essa atração STR_1826 :Estado STR_1827 :Popularidade STR_1828 :Satisfação @@ -1843,10 +1843,10 @@ STR_1837 :Satisfação: Desconhecido STR_1838 :Satisfação: {COMMA16}% STR_1839 :Confiança: {COMMA16}% STR_1840 :Tempo ocioso: {COMMA16}% -STR_1841 :Lucro: {CURRENCY} por hora -STR_1842 :Favorito de: {COMMA16} visitante* +STR_1841 :Lucro: {CURRENCY2DP} por hora +STR_1842 :Favorito de: {COMMA16} visitante STR_1843 :Favorito de: {COMMA16} visitantes -STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list +STR_1844 :{SMALLFONT}{BLACK}Selecione o tipo de informação para ser exibida na lista de atrações STR_1845 :{MONTHYEAR} STR_1846 :{COMMA16} Visitantes STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} Visitantes @@ -1860,7 +1860,7 @@ STR_1854 :{WINDOW_COLOUR_2}Construído: {BLACK}Ano Passado STR_1855 :{WINDOW_COLOUR_2}Construído: {BLACK}{COMMA16} Anos atrás STR_1856 :{WINDOW_COLOUR_2}Lucro por item vendido: {BLACK}{CURRENCY2DP} STR_1857 :{WINDOW_COLOUR_2}Prejuízo por item vendido: {BLACK}{CURRENCY2DP} -STR_1858 :{WINDOW_COLOUR_2}Custo: {BLACK}{CURRENCY} por mês +STR_1858 :{WINDOW_COLOUR_2}Custo: {BLACK}{CURRENCY2DP} por mês STR_1859 :Faz-Tudo STR_1860 :Mecânicos STR_1861 :Seguranças @@ -1893,23 +1893,25 @@ STR_1887 :{WINDOW_COLOUR_2}Tempo desde a última inspeção: {BLACK}{COMMA16} STR_1888 :{WINDOW_COLOUR_2}Tempo desde a última inspeção: {BLACK}mais de 4 horas STR_1889 :{WINDOW_COLOUR_2}Tempo ocioso: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1890 :{SMALLFONT}{BLACK}Selecione a frequência com um mecânico deve verificar esta atração -STR_1891 :No {STRINGID} no parque ainda!* -STR_1892 :RollerCoaster Tycoon 2 -STR_1893 :Por favor, insira o CD RollerCoaster Tycoon 2 na seguinte unidade: +STR_1891 :No {STRINGID} parque ainda! +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : STR_1894 :{WINDOW_COLOUR_2}{STRINGID} vendido: {BLACK}{COMMA32} STR_1895 :{SMALLFONT}{BLACK}Construir uma nova atração STR_1896 :{WINDOW_COLOUR_2}Receitas/Despesas -STR_1897 :{WINDOW_COLOUR_2}Construção das atrações -STR_1898 :{WINDOW_COLOUR_2}Custos de funcionamento das atrações -STR_1899 :{WINDOW_COLOUR_2}A aquisição de terrenos -STR_1900 :{WINDOW_COLOUR_2}Paisagismo* -STR_1901 :{WINDOW_COLOUR_2}Bilhetes da entrada no parque -STR_1902 :{WINDOW_COLOUR_2}Bilhetes das atrações +STR_1897 :{WINDOW_COLOUR_2}Construções +STR_1898 :{WINDOW_COLOUR_2}Func. das atrações +STR_1899 :{WINDOW_COLOUR_2}Compra de terrenos +STR_1900 :{WINDOW_COLOUR_2}Landscaping +STR_1901 :{WINDOW_COLOUR_2}Entradas no parque +STR_1902 :{WINDOW_COLOUR_2}Atrações STR_1903 :{WINDOW_COLOUR_2}Vendas das lojas STR_1904 :{WINDOW_COLOUR_2}Estoque das lojas -STR_1905 :{WINDOW_COLOUR_2}Vendas de Comidas/Bebidas -STR_1906 :{WINDOW_COLOUR_2}Estoque de Comidas/Bebidas -STR_1907 :{WINDOW_COLOUR_2}Salários dos funcionários +STR_1905 :{WINDOW_COLOUR_2}Vendas de Comidas +STR_1906 :{WINDOW_COLOUR_2}Estoq. de Comidas +STR_1907 :{WINDOW_COLOUR_2}Funcionários STR_1908 :{WINDOW_COLOUR_2}Marketing STR_1909 :{WINDOW_COLOUR_2}Pesquisa STR_1910 :{WINDOW_COLOUR_2}Juros de empréstimos @@ -1918,25 +1920,25 @@ STR_1912 :{MONTH} STR_1913 :{BLACK}+{CURRENCY2DP} STR_1914 :{BLACK}{CURRENCY2DP} STR_1915 :{RED}{CURRENCY2DP} -STR_1916 :{WINDOW_COLOUR_2}Empréstimo: +STR_1916 :{WINDOW_COLOUR_2}crédito: STR_1917 :{POP16}{POP16}{POP16}{CURRENCY} STR_1918 :Não é possivel emprestar mais dinheiro! -STR_1919 :Não possui dinheiro suficiente!* +STR_1919 :Não possui dinheiro suficiente! STR_1920 :Impossível pagar o empréstimo! STR_1921 :{SMALLFONT}{BLACK}Começar um novo jogo -STR_1922 :{SMALLFONT}{BLACK}Continuar jogando um jogo salvo +STR_1922 :{SMALLFONT}{BLACK}Continuar um jogo salvo STR_1923 :{SMALLFONT}{BLACK}Mostrar Tutoriais STR_1924 :{SMALLFONT}{BLACK}Sair STR_1925 :Impossível colocar uma pessoa aqui... STR_1926 :{SMALLFONT} -STR_1927 :{YELLOW}{STRINGID} Quebrou* -STR_1928 :{RED}{STRINGID} Bateu!* +STR_1927 :{YELLOW}{STRINGID} Quebrou +STR_1928 :{RED}{STRINGID} Bateu! STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this guest - (If tracking is on, guest's movements will be reported in the message area) -STR_1931 :{STRINGID} Juntou-se a fila de espera para {STRINGID} +STR_1931 :{STRINGID} entrou na fila de espera para {STRINGID} STR_1932 :{STRINGID} está no {STRINGID} -STR_1933 :{STRINGID} está em {STRINGID} -STR_1934 :{STRINGID} saiu {STRINGID} +STR_1933 :{STRINGID} esta no {STRINGID} +STR_1934 :{STRINGID} saiu do {STRINGID} STR_1935 :{STRINGID} saiu do parque STR_1936 :{STRINGID} comprou {STRINGID} STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message @@ -1993,16 +1995,16 @@ STR_1987 :{WINDOW_COLOUR_2} STR_1988 :Balão STR_1989 :Brinquedo de Pelúcia STR_1990 :Mapa do parque -STR_1991 :On-Ride Photo +STR_1991 :Foto da Atração STR_1992 :Guarda-Chuva STR_1993 :Bebida -STR_1994 :hambúrguer -STR_1995 :Batatas Fritas +STR_1994 :Hambúrguer +STR_1995 :Batata Frita STR_1996 :Sorvete STR_1997 :Algodão-Doce STR_1998 :Lata Vazia STR_1999 :Lixo -STR_2000 :Caixa de hambúrguer Vazia +STR_2000 :Caixa de Hambúrguer Vazia STR_2001 :Pizza STR_2002 :Voucher STR_2003 :Pipoca @@ -2024,13 +2026,13 @@ STR_2018 :Mapas do Parque STR_2019 :Fotos na Atração STR_2020 :Guarda-Chuvas STR_2021 :Bebidas -STR_2022 :hambúrguers +STR_2022 :Hambúrguers STR_2023 :Batatas Fritas STR_2024 :Sorvetes STR_2025 :Algodões-Doces STR_2026 :Latas Vazias STR_2027 :Lixos -STR_2028 :Caixas de hambúrguer Vazias +STR_2028 :Caixas de Hambúrguer Vazias STR_2029 :Pizzas STR_2030 :Vouchers STR_2031 :Pipocas @@ -2053,7 +2055,7 @@ STR_2047 :uma foto na atração STR_2048 :um guarda-chuva STR_2049 :uma bebida STR_2050 :um hambúrguer -STR_2051 :alguma batata frita +STR_2051 :uma batata frita STR_2052 :um sorvete STR_2053 :algum algodão-Doce STR_2054 :uma lata vazia @@ -2212,10 +2214,10 @@ STR_2206 :Empty Drink Carton STR_2207 :Empty Juice Cup STR_2208 :Roast Sausage STR_2209 :Empty Bowl -STR_2210 :{SMALLFONT}{BLACK}Show list of Faz-Tudo in park -STR_2211 :{SMALLFONT}{BLACK}Show list of mechanics in park -STR_2212 :{SMALLFONT}{BLACK}Show list of security guards in park -STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park +STR_2210 :{SMALLFONT}{BLACK}Exibir a lista de faz-tudo no parque +STR_2211 :{SMALLFONT}{BLACK}Exibir a lista de mecanicos no parque +STR_2212 :{SMALLFONT}{BLACK}Exibir a lista de seguranças no parque +STR_2213 :{SMALLFONT}{BLACK}Exibir a lista de animadores no parque STR_2214 :Construction not possible while game is paused! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C @@ -2254,7 +2256,7 @@ STR_2248 :Impossível demolir a atração... STR_2249 :{BABYBLUE}Nova atração disponível agora:{NEWLINE}{STRINGID} STR_2250 :{BABYBLUE}Novo Cenário/Tematização disponível agora:{NEWLINE}{STRINGID} STR_2251 :Somente pode ser construído sobre os caminhos! -STR_2252 :Somente pode ser construído através de caminhos!* +STR_2252 :Somente pode ser construído através de caminhos! STR_2253 :Atrações de Transporte STR_2254 :Atrações Suaves/Calmas STR_2255 :Montanhas-Russas @@ -2289,13 +2291,13 @@ STR_2283 :Lojas/Barracas STR_2284 :Cenário/Tematização STR_2285 :Pesquisa Inicial STR_2286 :Projetando -STR_2287 :Completando Projeto +STR_2287 :Completando Projeto STR_2288 :Desconhecido STR_2289 :{STRINGID} {STRINGID} STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} STR_2291 :Selecione o cenário para novo jogo STR_2292 :{WINDOW_COLOUR_2}Rides been on: -STR_2293 :{BLACK} Nada* +STR_2293 :{BLACK} Nada STR_2294 :{SMALLFONT}{BLACK}Change base land style STR_2295 :{SMALLFONT}{BLACK}Change vertical edges of land STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} paid to enter park @@ -2324,11 +2326,11 @@ STR_2318 : STR_2319 : STR_2320 : STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} -STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} +STR_2322 :{WINDOW_COLOUR_2}Funcionário: {BLACK}{COMMA16} STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} STR_2324 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}sq.ft. STR_2325 :{SMALLFONT}{BLACK}Comprar terreno para extender o parque -STR_2326 :{SMALLFONT}{BLACK}Comprar os direitos de construção para permitir a construção acima ou abaixo da terra fora do parque* +STR_2326 :{SMALLFONT}{BLACK}Comprar os direitos de construção para permitir a construção acima ou abaixo da terra fora do parque STR_2327 :Opções STR_2328 :{WINDOW_COLOUR_2}Moeda: STR_2329 :{WINDOW_COLOUR_2}Distância e Velocidade: @@ -2349,7 +2351,7 @@ STR_2343 :Euros ({EURO}) STR_2344 :Imperial STR_2345 :Métrica STR_2346 :Exibição -STR_2347 :{RED}{STRINGID} has drowned! +STR_2347 :{RED}{STRINGID} se afogou! STR_2348 :{SMALLFONT}{BLACK}Mostrar as estatísticas para esse funcionário STR_2349 :{WINDOW_COLOUR_2}Salário: {BLACK}{CURRENCY} por mês STR_2350 :{WINDOW_COLOUR_2}Empregado em: {BLACK}{MONTHYEAR} @@ -2421,7 +2423,7 @@ STR_2415 :{WINDOW_COLOUR_2}Atração: STR_2416 :{WINDOW_COLOUR_2}Item: STR_2417 :{WINDOW_COLOUR_2}Período de tempo: STR_2418 :Entrada gratuita para {STRINGID} -STR_2419 :Atração gratuita no {STRINGID}* +STR_2419 :Atração gratuita no {STRINGID} STR_2420 :Meia-entrada para {STRINGID} STR_2421 :Gratuito {STRINGID} STR_2422 :Campanha publicitária para {STRINGID} @@ -2487,14 +2489,14 @@ STR_2481 :{SMALLFONT}{BLACK}Show graph of lateral acceleration against time STR_2482 :{SMALLFONT}{BLACK}Profit: {CURRENCY} per week, Park Value: {CURRENCY} STR_2483 :{WINDOW_COLOUR_2}Lucro semanal: {BLACK}+{CURRENCY2DP} STR_2484 :{WINDOW_COLOUR_2}Lucro semanal: {RED}{CURRENCY2DP} -STR_2485 :Controls -STR_2486 :General -STR_2487 :Show 'real' names of guests -STR_2488 :{SMALLFONT}{BLACK}Toggle between showing 'real' names of guests and guest numbers -STR_2489 :Shortcut keys... -STR_2490 :Keyboard shortcuts -STR_2491 :Reset keys -STR_2492 :{SMALLFONT}{BLACK}Set all keyboard shortcuts back to default settings +STR_2485 :Controles +STR_2486 :Geral +STR_2487 :Exibir nomes 'reais' para os visitantes +STR_2488 :{SMALLFONT}{BLACK}Alternar entre exibir nomes 'reais' para os visitantes e numeros de visitantes +STR_2489 :Teclas de atalho... +STR_2490 :Atalhos do teclado +STR_2491 :Redefinir teclas +STR_2492 :{SMALLFONT}{BLACK}Redefinir todos os atalhos de teclado para as configurações padrão STR_2493 :Close top-most window STR_2494 :Close all floating windows STR_2495 :Cancel construction mode @@ -2527,6 +2529,7 @@ STR_2521 :Show staff list STR_2522 :Show recent messages STR_2523 :Show map STR_2524 :Screenshot +### The following need to be reordered to match SDL_keycode layout. STR_2525 :??? STR_2526 :??? STR_2527 :??? @@ -2702,7 +2705,7 @@ STR_2696 :Colocar árvores STR_2697 :??? STR_2698 :??? STR_2699 :??? -STR_2700 :Frequencia do Salvamento automático +STR_2700 :Salvamento automático: STR_2701 :A cada minuto STR_2702 :A cada 5 minutos STR_2703 :A cada 15 minutos @@ -2722,18 +2725,18 @@ STR_2716 :/ STR_2717 :' STR_2718 :(cima) STR_2719 :(novo arquivo) -STR_2720 :{UINT16}sec -STR_2721 :{UINT16}secs -STR_2722 :{UINT16}min:{UINT16}sec -STR_2723 :{UINT16}min:{UINT16}secs -STR_2724 :{UINT16}mins:{UINT16}sec -STR_2725 :{UINT16}mins:{UINT16}secs +STR_2720 :{UINT16}seg +STR_2721 :{UINT16}segs +STR_2722 :{UINT16}min:{UINT16}seg +STR_2723 :{UINT16}min:{UINT16}segs +STR_2724 :{UINT16}mins:{UINT16}seg +STR_2725 :{UINT16}mins:{UINT16}segs STR_2726 :{UINT16}min STR_2727 :{UINT16}mins -STR_2728 :{UINT16}hour:{UINT16}min -STR_2729 :{UINT16}hour:{UINT16}mins -STR_2730 :{UINT16}hours:{UINT16}min -STR_2731 :{UINT16}hours:{UINT16}mins +STR_2728 :{UINT16}hora:{UINT16}min +STR_2729 :{UINT16}hora:{UINT16}mins +STR_2730 :{UINT16}horas:{UINT16}min +STR_2731 :{UINT16}horas:{UINT16}mins STR_2732 :{COMMA16}ft STR_2733 :{COMMA16}m STR_2734 :{COMMA16}mph @@ -2751,7 +2754,7 @@ STR_2745 :\ STR_2746 :] STR_2747 :{ENDQUOTES} STR_2748 :Bar -STR_2749 :Meu novo cenário* +STR_2749 :Meu novo cenário # New strings used in the cheats window previously these were ??? STR_2750 :Mover todos os itens para o topo STR_2751 :Mover todos os itens para baixo @@ -2768,8 +2771,8 @@ STR_2761 : STR_2762 : STR_2763 :??? STR_2764 : -STR_2765 :Leva de Visitantes* -STR_2766 :??? +STR_2765 :Leva de Visitantes +STR_2766 :Ganhar cenário STR_2767 :Congelar Clima STR_2768 :Descongelar Clima STR_2769 :Abrir o Parque @@ -2788,30 +2791,30 @@ STR_2780 :Extra viewport STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + -STR_2784 :Change keyboard shortcut +STR_2784 :Mudar atalho do teclado STR_2785 :{WINDOW_COLOUR_2}Press new shortcut key for:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} STR_2786 :{SMALLFONT}{BLACK}Click on shortcut description to select new key STR_2787 :{WINDOW_COLOUR_2}Valor do parque: {BLACK}{CURRENCY} STR_2788 :{WINDOW_COLOUR_2}Parabéns !{NEWLINE}{BLACK}Você alcançou seu objetivo com o valor da empresa de {CURRENCY} ! STR_2789 :{WINDOW_COLOUR_2}Você falhou no seu objetivo ! -STR_2790 :Digite o nome do gráfico do cenário* +STR_2790 :Digite o nome do gráfico do cenário STR_2791 :Digite o nome STR_2792 :Por favor, insira o seu nome para o gráfico do cenário: STR_2793 :{SMALLFONT}(Completado por {STRINGID}) STR_2794 :{WINDOW_COLOUR_2}Completed by: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} with a company value of: {BLACK}{CURRENCY} STR_2795 :Sort STR_2796 :{SMALLFONT}{BLACK}Sort the ride list into order using the information type displayed -STR_2797 :Scroll view when pointer at screen edge -STR_2798 :{SMALLFONT}{BLACK}Select whether to scroll the view when the mouse pointer is at the screen edge +STR_2797 :Move a tela quando o ponteiro estiver na borda da tela +STR_2798 :{SMALLFONT}{BLACK}Selecione se deseja mover a tela quando o ponteiro do mouse estiver na borda da tela STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32} STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP} -STR_2802 :Map +STR_2802 :Mapa STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map -STR_2805 :{SMALLFONT}{BLACK}Show map of park -STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your Faz-Tudo are and consider organising them better -STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your Faz-Tudo are and consider organising them better +STR_2805 :{SMALLFONT}{BLACK}Exibir o mapa do parque +STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organising them better STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organising them better STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks @@ -2823,7 +2826,7 @@ STR_2815 :{WINDOW_COLOUR_2}O maior prêmio de parque arrumado STR_2816 :{WINDOW_COLOUR_2}Prêmio para o parque com as melhores montanhas-russas STR_2817 :{WINDOW_COLOUR_2}Prêmio do parque com melhor valor STR_2818 :{WINDOW_COLOUR_2}Prêmio do mais belo parque -STR_2819 :{WINDOW_COLOUR_2}Worst value park award +STR_2819 :{WINDOW_COLOUR_2}Prêmio do parque com pior valor STR_2820 :{WINDOW_COLOUR_2}Prêmio do parque mais seguro STR_2821 :{WINDOW_COLOUR_2}Prêmio da melhor equipe STR_2822 :{WINDOW_COLOUR_2}Prêmio da melhor comida de parque @@ -2862,7 +2865,7 @@ STR_2854 :{RED}Guests can't get to the entrance of {STRINGID} !{NEWLINE}Const STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the ride exit STR_2856 :{WINDOW_COLOUR_2}Tutorial STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) -STR_2858 :Can't start marketing campaign... +STR_2858 :Impossível começar uma campanha de marketing... STR_2859 :Another instance of OpenRCT2 is already running STR_2860 :Infogrames Interactive credits... STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. @@ -3061,7 +3064,7 @@ STR_3053 :Golf hole E STR_3054 :Carregando... STR_3055 :Branco STR_3056 :Translúcido -STR_3057 :{WINDOW_COLOUR_2}Construction Marker: +STR_3057 :{WINDOW_COLOUR_2}Marcador de Construção: STR_3058 :Brick walls STR_3059 :Hedges STR_3060 :Ice blocks @@ -3097,7 +3100,7 @@ STR_3089 :Space entrance STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station STR_3091 :You are not allowed to remove this section! STR_3092 :You are not allowed to move or modify the station for this ride! -STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} +STR_3093 :{WINDOW_COLOUR_2}Favorito: {BLACK}{STRINGID} STR_3094 :N/A STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} @@ -3105,7 +3108,7 @@ STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed STR_3098 :Can't change lift hill speed... STR_3099 :{SMALLFONT}{BLACK}Select colour STR_3100 :{SMALLFONT}{BLACK}Select second colour -STR_3101 :{SMALLFONT}{BLACK}Select third coluor +STR_3101 :{SMALLFONT}{BLACK}Select third colour STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape STR_3103 :Can't re-paint this... STR_3104 :{SMALLFONT}{BLACK}List rides @@ -3295,7 +3298,7 @@ STR_3287 :{WINDOW_COLOUR_2}Objetivo: STR_3288 :{SMALLFONT}{BLACK}Selecione o clima STR_3289 :{WINDOW_COLOUR_2}Clima: STR_3290 :Frio e úmido -STR_3291 :Morno* +STR_3291 :Morno STR_3292 :Quente e seco STR_3293 :Frio STR_3294 :Mudar... @@ -3443,7 +3446,7 @@ STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... # End of tutorial strings -STR_3437 :{SMALLFONT}{BLACK}Limpar grandes áreas de cenário no terreno* +STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape STR_3438 :Impossível remover todos os cenários a partir daqui... STR_3439 :Limpar Cenário STR_3440 :Página 1 @@ -3453,10 +3456,447 @@ STR_3443 :Página 4 STR_3444 :Página 5 STR_3445 :Definir a Área de Patrulha STR_3446 :Cancelar a Área de Patrulha +# New strings, cleaner +STR_5120 :Finanças +STR_5121 :Pesquisas +STR_5122 :Select rides by track type (like in RCT1) +STR_5123 :Renovar atrações +STR_5124 : +STR_5125 :All destructable +STR_5126 :Random title music +STR_5127 :{SMALLFONT}{BLACK}Disable land elevation +STR_5128 :Selection size +STR_5129 :Enter selection size between {COMMA16} and {COMMA16} +STR_5130 :Map size +STR_5131 :Enter map size between {COMMA16} and {COMMA16} +STR_5132 :Consertar todas as atrações +STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights +STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights +STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights +STR_5136 :Land rights +STR_5137 :Allow lift hill and launch speeds{NEWLINE}up to {VELOCITY} +STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} +STR_5139 :{WHITE}{STRINGID} +STR_5140 :Disable brakes failure +STR_5141 :Disable all breakdowns +STR_5142 :Normal Speed +STR_5143 :Quick Speed +STR_5144 :Fast Speed +STR_5145 :Turbo Speed +STR_5146 :Hyper Speed +STR_5147 :Trapaças +STR_5148 :{SMALLFONT}{BLACK}Change the game speed +STR_5149 :{SMALLFONT}{BLACK}Exibir opções de trapaça +STR_5150 :Habilitar ferramentas de depuração +STR_5151 :, +STR_5152 :. +STR_5153 :Editar Temas... +STR_5154 :Exibição por Hardware +STR_5155 :Permitir o teste de atrações incompletas +STR_5156 :{SMALLFONT}{BLACK}Permite testar a maioria dos tipos de atrações, mesmo quando a atração está inacabada, não se aplica bloquear os modos seccionados +STR_5157 :Unlock all prices +STR_5158 :Sair para o menu +STR_5159 :Sair do OpenRCT2 +STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, Ano {POP16}{COMMA16} +STR_5161 :Formato da Data: +STR_5162 :Dia/Mês/Ano +STR_5163 :Mês/Dia/Ano +STR_5164 :Nome do canal do Twitch +STR_5165 :Name peeps after followers +STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers +STR_5167 :Track follower peeps +STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after channel's Twitch followers +STR_5169 :Name peeps after people in Twitch chat +STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat +STR_5171 :Track chat peeps +STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after Twitch chat participants +STR_5173 :Pull Twitch chat as news +STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications +STR_5175 :Input the name of your Twitch channel +STR_5176 :Habilita integração com Twitch +STR_5177 :Modo tela inteira: +STR_5178 :{SMALLFONT}{BLACK}Mostrar trapaças financeiras +STR_5179 :{SMALLFONT}{BLACK}Mostrar trapaças de visitantes +STR_5180 :{SMALLFONT}{BLACK}Mostrar trapaças do parque +STR_5181 :{SMALLFONT}{BLACK}Mostrar trapaças das atrações +STR_5182 :{INT32} +STR_5183 :Base height +STR_5184 :Enter base height between {COMMA16} and {COMMA16} +STR_5185 :Water level +STR_5186 :Enter water level between {COMMA16} and {COMMA16} +STR_5187 :Finanças +STR_5188 :Nova Campanha +STR_5189 :Pesquisa +STR_5190 :Mapa +STR_5191 :Viewport +STR_5192 :Recent News +STR_5193 :Land +STR_5194 :Água +STR_5195 :Clear Scenery +STR_5196 :Land Rights +STR_5197 :Scenery +STR_5198 :Footpath +STR_5199 :Ride Construction +STR_5200 :Track Design Place +STR_5201 :New Ride +STR_5202 :Track Design Selection +STR_5203 :Ride +STR_5204 :Ride List +STR_5205 :Guest +STR_5206 :Guest List +STR_5207 :Staff +STR_5208 :Staff List +STR_5209 :Banner +STR_5210 :Object Selection +STR_5211 :Invention List +STR_5212 :Scenario Options +STR_5213 :Objective Options +STR_5214 :Map Generation +STR_5215 :Track Design Manager +STR_5216 :Track Design Manager List +STR_5217 :Cheats +STR_5218 :Themes +STR_5219 :Options +STR_5220 :Keyboard Shortcuts +STR_5221 :Change Keyboard Shortcut +STR_5222 :Load/Save +STR_5223 :Save Prompt +STR_5224 :Demolish Ride Prompt +STR_5225 :Fire Staff Prompt +STR_5226 :Track Delete Prompt +STR_5227 :Save Overwrite Prompt +STR_5228 :{SMALLFONT}{BLACK}Main UI +STR_5229 :{SMALLFONT}{BLACK}Park +STR_5230 :{SMALLFONT}{BLACK}Tools +STR_5231 :{SMALLFONT}{BLACK}Rides and Peeps +STR_5232 :{SMALLFONT}{BLACK}Editors +STR_5233 :{SMALLFONT}{BLACK}Miscellaneous +STR_5234 :{SMALLFONT}{BLACK}Prompts +STR_5235 :{SMALLFONT}{BLACK}Settings +STR_5236 :Window: +STR_5237 :Palette: +STR_5238 :Current Theme: +STR_5239 :Duplicate +STR_5240 :Enter a name for the theme +STR_5241 :Can't change this theme +STR_5242 :Theme name already exists +STR_5243 :Invalid characters used +STR_5244 :Themes +STR_5245 :Top Toolbar +STR_5246 :Bottom Toolbar +STR_5247 :Track Editor Bottom Toolbar +STR_5248 :Scenario Editor Bottom Toolbar +STR_5249 :Title Menu Buttons +STR_5250 :Title Exit Button +STR_5251 :Title Options Button +STR_5252 :Title Scenario Selection +STR_5253 :Park Information +STR_5254 :Create +STR_5255 :{SMALLFONT}{BLACK}Create a new title sequence from scratch +STR_5256 :Create a new theme to make changes to +STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one +STR_5258 :{SMALLFONT}{BLACK}Delete the current theme +STR_5259 :{SMALLFONT}{BLACK}Rename the current theme +STR_5260 :Giant Screenshot +STR_5261 :Filter +STR_5262 :Wacky Worlds +STR_5263 :Time Twister +STR_5264 :Custom +STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible +STR_5266 :{SMALLFONT}{BLACK}Display +STR_5267 :{SMALLFONT}{BLACK}Culture and Units +STR_5268 :{SMALLFONT}{BLACK}Audio +STR_5269 :{SMALLFONT}{BLACK}Controls and interface +STR_5270 :{SMALLFONT}{BLACK}Miscellaneous +STR_5271 :{SMALLFONT}{BLACK}Twitch +STR_5272 :{SMALLFONT}{BLACK}Small Scenery +STR_5273 :{SMALLFONT}{BLACK}Large Scenery +STR_5274 :{SMALLFONT}{BLACK}Footpath +STR_5275 :Search for Objects +STR_5276 :Enter the name of an object to search for +STR_5277 :Claro +STR_5278 :Modo sandbox ativado +STR_5279 :Modo sandbox desativado +STR_5280 :{SMALLFONT}{BLACK}Allow editing land ownership settings through the Map window and other options that are normally restricted to the Scenario Editor +STR_5281 :{SMALLFONT}{BLACK}Features +STR_5282 :RCT1 Ride Open/Close Lights +STR_5283 :RCT1 Park Open/Close Lights +STR_5284 :RCT1 Scenario Selection Font +STR_5285 :EXPLODIR!! +STR_5286 :{SMALLFONT}{BLACK}Explodir alguns visitantes +STR_5287 :Atração já está quebrada +STR_5288 :Atração está fechada +STR_5289 :Indisponível quebra para essa atração +STR_5290 :Consertar atração +STR_5291 :Impossível forçar quebra +STR_5292 :{SMALLFONT}{BLACK}Forçar quebra +STR_5293 :{SMALLFONT}{BLACK}Fechar atração +STR_5294 :{SMALLFONT}{BLACK}Testar atração +STR_5295 :{SMALLFONT}{BLACK}Abrir atração +STR_5296 :{SMALLFONT}{BLACK}Fechar parque +STR_5297 :{SMALLFONT}{BLACK}Abrir parque +STR_5298 :{RED}{STRINGID} +STR_5299 :{LIGHTPINK}{STRINGID} +STR_5300 :{SMALLFONT}{BLACK}Quick fire staff +STR_5301 :{MEDIUMFONT}{BLACK}Limpar seu empréstimo +STR_5302 :Limpar empréstimo +STR_5303 :Allow building in pause mode +STR_5304 :Sequencia de Títulos: +STR_5305 :RollerCoaster Tycoon 1 +STR_5306 :RollerCoaster Tycoon 1 (AA) +STR_5307 :RollerCoaster Tycoon 1 (AA + LL) +STR_5308 :RollerCoaster Tycoon 2 +STR_5309 :OpenRCT2 +STR_5310 :Aleatório +STR_5311 :{SMALLFONT}{BLACK}Ferramentas de depuração +STR_5312 :Exibir console +STR_5313 :Exibir inspetor de título +STR_5314 :Inspetor de título +STR_5315 :Grama +STR_5316 :Areia +STR_5317 :Sujeira +STR_5318 :Pedra +STR_5319 :Marciano +STR_5320 :Tabuleiro de damas +STR_5321 :Tufos de grama +STR_5322 :Gelo +STR_5323 :Grade (vermelho) +STR_5324 :Grade (amarelo) +STR_5325 :Grade (azul) +STR_5326 :Grade (verde) +STR_5327 :Areia (escura) +STR_5328 :Areia (clara) +STR_5329 :Tabuleiro de damas (Invertido) +STR_5330 :Visão subterrânea +STR_5331 :Pedra +STR_5332 :Madeira (vermelha) +STR_5333 :Madeira (preta) +STR_5334 :Gelo +STR_5335 :Entrada da atração +STR_5336 :Saida da atração +STR_5337 :Entrada do parque +STR_5338 :Tipo de elemento +STR_5339 :Altura da base +STR_5340 :Altura de passagem +STR_5341 :Bandeiras +STR_5342 :Escolha o titulo do mapa +STR_5343 :Colocar automaticamente funcionários +STR_5344 :Log de mudanças +STR_5345 :Trapaça financeira +STR_5346 :Trapaça do visitante +STR_5347 :Trapaça da atração +STR_5348 :Trapaça do parque +STR_5349 :{SMALLFONT}{BLACK}Todas as Atrações +STR_5350 :Max +STR_5351 :Min +STR_5352 :{BLACK}Felicidade: +STR_5353 :{BLACK}Energia: +STR_5354 :{BLACK}Fome: +STR_5355 :{BLACK}Sede: +STR_5356 :{BLACK}Náusea: +STR_5357 :{BLACK}Tolerância a náusea +STR_5358 :{BLACK}Banheiro: +STR_5359 :Remove os visitantes +STR_5360 :{SMALLFONT}{BLACK}Remove todos os visitantes do mapa +STR_5361 :{BLACK}De a todos os visitantes: +STR_5362 :{BLACK}Intensidade preferida: +STR_5363 :Maior que 1 +STR_5364 :Menor que 15 +STR_5365 :{BLACK}Vel. dos funcionários: +STR_5366 :Normal +STR_5367 :Rápido +STR_5368 :Redefinir o status de acidente +STR_5369 :Parâmetros do parque... +STR_5370 :{SMALLFONT}{BLACK}Clique nesse botão para modificar os parâmetros {NEWLINE}do parque com restrições,{NEWLINE}geração de visitantes e dinheiro. +STR_5371 :Object Selection +STR_5372 :Inverter seleção do botão direito do mouse +STR_5373 :Nome {STRINGID} +STR_5374 :Data {STRINGID} +STR_5375 :{UP} +STR_5376 :{DOWN} +STR_5377 :{SMALLFONT}{BLACK}Saves +STR_5378 :{SMALLFONT}{BLACK}Script +STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command +STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence +STR_5381 :{SMALLFONT}{BLACK}Stop playing title sequence +STR_5382 :{SMALLFONT}{BLACK}Restart title sequence +STR_5383 :{SMALLFONT}{BLACK}Create a new title sequence based on the current one +STR_5384 :{SMALLFONT}{BLACK}Delete the current title sequence +STR_5385 :{SMALLFONT}{BLACK}Rename the current title sequence +STR_5386 :{SMALLFONT}{BLACK}Insert a new command +STR_5387 :{SMALLFONT}{BLACK}Edit the selected command +STR_5388 :{SMALLFONT}{BLACK}Delete the selected command +STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence +STR_5390 :{SMALLFONT}{BLACK}Move the selected command down +STR_5391 :{SMALLFONT}{BLACK}Move the selected command up +STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence +STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence +STR_5394 :{SMALLFONT}{BLACK}Rename the selected save +STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game +STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game +STR_5397 :Can only be used on the title screen +STR_5398 :Cannot edit title sequence while it's playing +STR_5399 :Press the stop button to continue editing +STR_5400 :Impossível alterar esta sequência de título +STR_5401 :Criar uma nova sequência de título para fazer alterações para +STR_5402 :Falha ao carregar a sequência do título +STR_5403 :Não pode haver nenhuma carga, comando de espera ou uma gravação pode ser inválida +STR_5404 :Este nome já existe +STR_5405 :Insira um nome para o salvar +STR_5406 :Insira um nome para a sequência de título +STR_5407 :Adicionar +STR_5408 :Remoder +STR_5409 :Inserir +STR_5410 :Editar +STR_5411 :Recarregar +STR_5412 :Ir para +STR_5413 :Carregar +STR_5414 :Carregar{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :Carregar{MOVE_X}{87}{STRING} +STR_5416 :Carregar{MOVE_X}{87}Salvar não selecionado +STR_5417 :localização +STR_5418 :Localização{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :Rotacionar +STR_5420 :Rotacionar{MOVE_X}{87}{COMMA16} +STR_5421 :Ampliar +STR_5422 :Ampliar{MOVE_X}{87}{COMMA16} +STR_5423 :Aguarde +STR_5424 :Wait{MOVE_X}{87}{COMMA16} +STR_5425 :Reiniciar +STR_5426 :Fim +STR_5427 :Cordenadas: +STR_5428 :Rotações anti-horário: +STR_5429 :Nível de ampliação: +STR_5430 :Segundos de espera: +STR_5431 :Salvar para carregar: +STR_5432 :Comando: +STR_5433 :Sequências de título +STR_5434 :Command Editor +STR_5435 :Rename save +STR_5436 :Editar a sequência de título... +STR_5437 :Salvar não selecionado +STR_5438 :Impossível fazer mudanças enquanto editor de comando está aberto +STR_5439 :Um comando de espera com pelo menos 4 segundos é necessário com um comando de reinicialização +STR_5440 :Minimizar tela inteira quando perder o faco +STR_5441 :{SMALLFONT}{BLACK}Identificar as atrações por tipo de pista,{NEWLINE}assim os veículos podem ser alterados {NEWLINE}depois, como no RCT1. +STR_5442 :Forças a classificação do parque: +STR_5443 :Velocidade{MOVE_X}{87}{STRINGID} +STR_5444 :Velocidade: +STR_5445 :Velocidade +STR_5446 :Conseguir +STR_5447 :Tipo {STRINGID} +STR_5448 :Atração / Veículo {STRINGID} +STR_5449 :Reduzir a velocidade do jogo +STR_5450 :Aumentar a velocidade do jogo +STR_5451 :Abrir janela de trapaças +STR_5452 :Alternar a visibilidade da barra de ferramentas +STR_5453 :Selecione outra atração +STR_5454 :Remover limite de FPS +STR_5455 :Ativar o modo sandbox +STR_5456 :Desabilitar as verificações de depuração +STR_5457 :Desativar limites de apoio +STR_5458 :Rotacionar no sentido horário +STR_5459 :Rotacionar anti-horário +STR_5460 :Rotacionar visão sentido anti-horário +STR_5461 :Definir parâmetros dos visitantes +STR_5462 :{CURRENCY} +STR_5463 :Objetivo: Divirta-se! +STR_5464 :Geral +STR_5465 :Clima +STR_5466 :Funcionários +STR_5467 :ALT + +STR_5468 :Mensagens recentes +STR_5469 :Desloca mapa para cima +STR_5470 :Desloca mapa para esquerda +STR_5471 :Desloca mapa para baixo +STR_5472 :Desloca mapa para direita +STR_5473 :Ciclo dia / noite +STR_5474 :Exibie texto nos banners em letras maiúsculas +STR_5475 :{COMMA16} semanas +STR_5476 :Hardware +STR_5477 :Renderização do mapa +STR_5478 :Controles +STR_5479 :Barra de Ferramentas +STR_5480 :Mostrar os botões da barra de ferramentas para: +STR_5481 :Temas +STR_5482 :{WINDOW_COLOUR_2}Tempo desde a última inspeção: {BLACK}1 minuto +STR_5483 :{BLACK}({COMMA16} semanas restantes) +STR_5484 :{BLACK}({COMMA16} semana restante) +STR_5485 :{SMALLFONT}{STRING} +STR_5486 :{BLACK}{COMMA16} +STR_5487 :{SMALLFONT}{BLACK}Exibir as mensagens recentes +STR_5488 :Entrada proibida +STR_5489 :{SMALLFONT}{BLACK}Mostrar apenas os visitantes monitorados +STR_5490 :Desativar som quando perder o foco +STR_5491 :Lista de Invenções +STR_5492 :Opções de cenário +STR_5493 :Enviar Mensagem +STR_5494 : +STR_5495 :Lista de Jogadores +STR_5496 :Jogador: +STR_5497 :Ping: +STR_5498 :Lista de Servidores +STR_5499 :Nome do Jogador: +STR_5500 :Adic. Servidor +STR_5501 :Iniciar Servidor +STR_5502 :Multijogador +STR_5503 :Digite o nome do servidor ou o endereço de IP: +STR_5504 :{SMALLFONT}{BLACK}Exibir o estado do multijogador +STR_5505 :Impossível se conectar ao servidor. +STR_5506 :Os Visistantes ignoram as intensidades +STR_5507 :Faz-Tudo corta a grama por padrão +STR_5508 :Carregamento de arquivos com checksums incorreto +STR_5509 :{SMALLFONT}{BLACK}Permitir o carregamento de cenários e jogos salvos que possuam checksum incorreto, como os cenários do demo e jogos salvos danificados. +STR_5510 :Dispositivo de som padrão +STR_5511 :(DESCONHECIDO) +STR_5512 :Salvar Jogo Como +STR_5513 :(Rapido) salvar jogo +STR_5514 :Desativar vandalismo +STR_5515 :{SMALLFONT}{BLACK}Parar o vandalismo dos visitantes no seu parque quando eles estão com raiva +STR_5516 :{SMALLFONT}{BLACK}Preto +STR_5517 :{SMALLFONT}{BLACK}Cinza +STR_5518 :{SMALLFONT}{BLACK}Branco +STR_5519 :{SMALLFONT}{BLACK}Roxo escuro +STR_5520 :{SMALLFONT}{BLACK}Roxo claro +STR_5521 :{SMALLFONT}{BLACK}Roxo brilhante +STR_5522 :{SMALLFONT}{BLACK}Azul escuro +STR_5523 :{SMALLFONT}{BLACK}Azul claro +STR_5524 :{SMALLFONT}{BLACK}Azul Gelo +STR_5525 :{SMALLFONT}{BLACK}Azul esverdeado +STR_5526 :{SMALLFONT}{BLACK}Turquesa +STR_5527 :{SMALLFONT}{BLACK}Verde saturado +STR_5528 :{SMALLFONT}{BLACK}Verde escuro +STR_5529 :{SMALLFONT}{BLACK}Moss green +STR_5530 :{SMALLFONT}{BLACK}Bright green +STR_5531 :{SMALLFONT}{BLACK}Olive green +STR_5532 :{SMALLFONT}{BLACK}Verde oliva escuro +STR_5533 :{SMALLFONT}{BLACK}Amarelo brilhante +STR_5534 :{SMALLFONT}{BLACK}Amarelo +STR_5535 :{SMALLFONT}{BLACK}Amarelo escuro +STR_5536 :{SMALLFONT}{BLACK}Laranja claro +STR_5537 :{SMALLFONT}{BLACK}Laranja escuro +STR_5538 :{SMALLFONT}{BLACK}Marrrom claro +STR_5539 :{SMALLFONT}{BLACK}Marrom saturado +STR_5540 :{SMALLFONT}{BLACK}Marrom escuro +STR_5541 :{SMALLFONT}{BLACK}Salmão +STR_5542 :{SMALLFONT}{BLACK}Vermelho vinho +STR_5543 :{SMALLFONT}{BLACK}Vermelho saturado +STR_5544 :{SMALLFONT}{BLACK}Vermelho brilhante +STR_5545 :{SMALLFONT}{BLACK}Rosa escuro +STR_5546 :{SMALLFONT}{BLACK}Rosa brilhante +STR_5547 :{SMALLFONT}{BLACK}Rosa claro +STR_5548 :Exibir todos os modos operacionais +STR_5549 :Ano/Mês/Dia +STR_5550 :{POP16}{POP16}Ano {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} +STR_5551 :Ano/Mês/Dia +STR_5552 :{POP16}{POP16}Ano {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} -#Thousands separator -STR_5151 :. -#Decimal separator -STR_5152 :, +##################### +# Rides/attractions # +##################### -# Note: as this is an unmaintained language, don't add new strings unless you intend to become the mainainer. +#WW +[CONDORRD] +STR_NAME :Condor +STR_DESC :Montando em arreios especiais sob a pista, os passageiros experimentarão a sensação de voar pelo ar em uma estrutura na forma de Condor +STR_CPTY :4 passageiros por carro \ No newline at end of file From 6c38ab44fa751f18fbf0a08f59a66d0348101b30 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 11 Oct 2015 11:39:01 +0100 Subject: [PATCH 0814/1173] refactor map smooth game command --- src/world/map.c | 323 +++++++++++++----------------------------------- 1 file changed, 85 insertions(+), 238 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 0194509789..0926e655c0 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2051,12 +2051,12 @@ void game_command_lower_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, i ); } -static int map_get_corner_height(rct_map_element *mapElement, int slopeMask) +static int map_get_corner_height(rct_map_element *mapElement, int direction) { int z = mapElement->base_height; int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; - switch (slopeMask) { - case 1: + switch (direction) { + case 0: if (slope & 1) { z += 2; if (slope == 27) { @@ -2064,7 +2064,7 @@ static int map_get_corner_height(rct_map_element *mapElement, int slopeMask) } } break; - case 2: + case 1: if (slope & 2) { z += 2; if (slope == 23) { @@ -2072,7 +2072,7 @@ static int map_get_corner_height(rct_map_element *mapElement, int slopeMask) } } break; - case 4: + case 2: if (slope & 4) { z += 2; if (slope == 30) { @@ -2080,7 +2080,7 @@ static int map_get_corner_height(rct_map_element *mapElement, int slopeMask) } } break; - case 8: + case 3: if (slope & 8) { z += 2; if (slope == 29) { @@ -2094,9 +2094,12 @@ static int map_get_corner_height(rct_map_element *mapElement, int slopeMask) /** * - * rct2: 0x0068C3B2 + * rct2: 0x0068C3B2 slope 1, style 0 + * rct2: 0x0068C47A slope 2, style 1 + * rct2: 0x0068C222 slope 4, style 2 + * rct2: 0x0068C2EA slope 8, style 3 */ -static money32 sub_68C3B2(uint8 flags, int x, int y, uint8 targetBaseZ, uint8 minBaseZ) +static money32 smooth_land_tile(int direction, uint8 flags, int x, int y, uint8 targetBaseZ, uint8 minBaseZ) { // Check if inside map bounds if (x < 0 || y < 0 || x >= (256 * 32) || y >= (256 * 32)) { @@ -2105,7 +2108,7 @@ static money32 sub_68C3B2(uint8 flags, int x, int y, uint8 targetBaseZ, uint8 mi // Get height of tile rct_map_element *mapElement = map_get_surface_element_at(x >> 5, y >> 5); - uint8 baseZ = map_get_corner_height(mapElement, 1); + uint8 baseZ = map_get_corner_height(mapElement, direction); // Check if tile is same height as target tile if (baseZ == targetBaseZ) { @@ -2121,7 +2124,7 @@ static money32 sub_68C3B2(uint8 flags, int x, int y, uint8 targetBaseZ, uint8 mi } targetBaseZ = mapElement->base_height; int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; - style = map_element_lower_styles[0][slope]; + style = map_element_lower_styles[direction][slope]; if (style & 0x20) { targetBaseZ -= 2; style &= ~0x20; @@ -2133,7 +2136,7 @@ static money32 sub_68C3B2(uint8 flags, int x, int y, uint8 targetBaseZ, uint8 mi } targetBaseZ = mapElement->base_height; int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; - style = map_element_raise_styles[0][slope]; + style = map_element_raise_styles[direction][slope]; if ((style & 0x20) != 0) { targetBaseZ += 2; style &= ~0x20; @@ -2143,180 +2146,12 @@ static money32 sub_68C3B2(uint8 flags, int x, int y, uint8 targetBaseZ, uint8 mi return game_do_command(x, flags, y, targetBaseZ | (style << 8), GAME_COMMAND_SET_LAND_HEIGHT, 0, 0); } -/** - * - * rct2: 0x0068C47A - */ -static money32 sub_68C47A(uint8 flags, int x, int y, uint8 targetBaseZ, uint8 minBaseZ) +money32 smooth_land(int flags, int centreX, int centreY, int mapLeft, int mapTop, int mapRight, int mapBottom, int command) { - // Check if inside map bounds - if (x < 0 || y < 0 || x >= (256 * 32) || y >= (256 * 32)) { - return MONEY32_UNDEFINED; - } - - // Get height of tile - rct_map_element *mapElement = map_get_surface_element_at(x >> 5, y >> 5); - uint8 baseZ = map_get_corner_height(mapElement, 2); - - // Check if tile is same height as target tile - if (baseZ == targetBaseZ) { - // No need to raise or lower - return MONEY32_UNDEFINED; - } - - uint8 style; - if (targetBaseZ <= baseZ) { - baseZ = baseZ - targetBaseZ; - if (baseZ <= minBaseZ) { - return MONEY32_UNDEFINED; - } - targetBaseZ = mapElement->base_height; - int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; - style = map_element_lower_styles[1][slope]; - if (style & 0x20) { - targetBaseZ -= 2; - style &= ~0x20; - } - } else { - baseZ = targetBaseZ - baseZ; - if (baseZ <= minBaseZ) { - return MONEY32_UNDEFINED; - } - targetBaseZ = mapElement->base_height; - int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; - style = map_element_raise_styles[1][slope]; - if ((style & 0x20) != 0) { - targetBaseZ += 2; - style &= ~0x20; - } - } - - return game_do_command(x, flags, y, targetBaseZ | (style << 8), GAME_COMMAND_SET_LAND_HEIGHT, 0, 0); -} - -/** - * - * rct2: 0x0068C222 - */ -static money32 sub_68C222(uint8 flags, int x, int y, uint8 targetBaseZ, uint8 minBaseZ) -{ - // Check if inside map bounds - if (x < 0 || y < 0 || x >= (256 * 32) || y >= (256 * 32)) { - return MONEY32_UNDEFINED; - } - - // Get height of tile - rct_map_element *mapElement = map_get_surface_element_at(x >> 5, y >> 5); - uint8 baseZ = map_get_corner_height(mapElement, 4); - - // Check if tile is same height as target tile - if (baseZ == targetBaseZ) { - // No need to raise or lower - return MONEY32_UNDEFINED; - } - - uint8 style; - if (targetBaseZ <= baseZ) { - baseZ = baseZ - targetBaseZ; - if (baseZ <= minBaseZ) { - return MONEY32_UNDEFINED; - } - targetBaseZ = mapElement->base_height; - int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; - style = map_element_lower_styles[2][slope]; - if (style & 0x20) { - targetBaseZ -= 2; - style &= ~0x20; - } - } else { - baseZ = targetBaseZ - baseZ; - if (baseZ <= minBaseZ) { - return MONEY32_UNDEFINED; - } - targetBaseZ = mapElement->base_height; - int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; - style = map_element_raise_styles[2][slope]; - if ((style & 0x20) != 0) { - targetBaseZ += 2; - style &= ~0x20; - } - } - - return game_do_command(x, flags, y, targetBaseZ | (style << 8), GAME_COMMAND_SET_LAND_HEIGHT, 0, 0); -} - -/** - * - * rct2: 0x0068C2EA - */ -static money32 sub_68C2EA(uint8 flags, int x, int y, uint8 targetBaseZ, uint8 minBaseZ) -{ - // Check if inside map bounds - if (x < 0 || y < 0 || x >= (256 * 32) || y >= (256 * 32)) { - return MONEY32_UNDEFINED; - } - - // Get height of tile - rct_map_element *mapElement = map_get_surface_element_at(x >> 5, y >> 5); - uint8 baseZ = map_get_corner_height(mapElement, 8); - - // Check if tile is same height as target tile - if (baseZ == targetBaseZ) { - // No need to raise or lower - return MONEY32_UNDEFINED; - } - - uint8 style; - if (targetBaseZ <= baseZ) { - baseZ = baseZ - targetBaseZ; - if (baseZ <= minBaseZ) { - return MONEY32_UNDEFINED; - } - targetBaseZ = mapElement->base_height; - int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; - style = map_element_lower_styles[3][slope]; - if (style & 0x20) { - targetBaseZ -= 2; - style &= ~0x20; - } - } else { - baseZ = targetBaseZ - baseZ; - if (baseZ <= minBaseZ) { - return MONEY32_UNDEFINED; - } - targetBaseZ = mapElement->base_height; - int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; - style = map_element_raise_styles[3][slope]; - if ((style & 0x20) != 0) { - targetBaseZ += 2; - style &= ~0x20; - } - } - - return game_do_command(x, flags, y, targetBaseZ | (style << 8), GAME_COMMAND_SET_LAND_HEIGHT, 0, 0); -} - -/** - * - * rct2: 0x0068BC01 - */ -void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) -{ - // RCT2_CALLFUNC_X(0x0068BC01, eax, ebx, ecx, edx, esi, edi, ebp); return; - - int flags = *ebx & 0xFF; - int centreX = *eax & 0xFFFF; - int centreY = *ecx & 0xFFFF; + int commandType; int centreZ = map_element_height(centreX, centreY); - int mapLeftRight = *edx; - int mapTopBottom = *ebp; - int mapLeft = mapLeftRight & 0xFFFF; - int mapTop = mapTopBottom & 0xFFFF; - int mapRight = mapLeftRight >> 16; - int mapBottom = mapTopBottom >> 16; - - int subCommand = *edi; - int subGameCommandType = *edi == 1 ? GAME_COMMAND_RAISE_LAND : GAME_COMMAND_LOWER_LAND; + int mapLeftRight = mapLeft | (mapRight << 16); + int mapTopBottom = mapTop | (mapBottom << 16); // Play sound (only once) if ((flags & GAME_COMMAND_FLAG_APPLY) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { @@ -2327,7 +2162,8 @@ void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, // First raise / lower the centre tile money32 result; - result = game_do_command(centreX, flags, centreY, mapLeftRight, subGameCommandType, 4, mapTopBottom); + commandType = command == 1 ? GAME_COMMAND_RAISE_LAND : GAME_COMMAND_LOWER_LAND; + result = game_do_command(centreX, flags, centreY, mapLeftRight, commandType, 4, mapTopBottom); if (result != MONEY32_UNDEFINED) { totalCost += result; } @@ -2340,8 +2176,8 @@ void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, mapElement = map_get_surface_element_at(x >> 5, y >> 5); int slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; if (slope != 0) { - int command = subCommand == 0xFFFF ? GAME_COMMAND_RAISE_LAND : GAME_COMMAND_LOWER_LAND; - result = game_do_command(centreX, flags, centreY, mapLeftRight, command, 4, mapTopBottom); + commandType = command == 0xFFFF ? GAME_COMMAND_RAISE_LAND : GAME_COMMAND_LOWER_LAND; + result = game_do_command(centreX, flags, centreY, mapLeftRight, commandType, 4, mapTopBottom); if (result != MONEY32_UNDEFINED) { totalCost += result; } @@ -2350,51 +2186,41 @@ void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, y = mapTop; mapElement = map_get_surface_element_at(x >> 5, y >> 5); slope = mapElement->properties.surface.slope & MAP_ELEMENT_SLOPE_MASK; - - *ebx = totalCost * 4; - RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; - RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = centreX; - RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = centreY; - RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = centreZ; - return; - } - - x = mapLeft; - y = mapTop; - int bx = ((mapRight - mapLeft) >> 5) - 1; - sint8 byte_F1AD5C = -2; - - for (;;) { - byte_F1AD5C += 2; - bx += 2; - x -= 32; - y -= 32; - if (bx > 64) { - *ebx = totalCost * 4; + if (slope != 0) { RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = centreX; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = centreY; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = centreZ; - return; + return totalCost * 4; } + } - sint8 minZ = (byte_F1AD5C << 1) & 0xFF; + x = mapLeft; + y = mapTop; + int size = ((mapRight - mapLeft) >> 5) + 1; + sint8 initialMinZ = -2; + + for (; size <= 64; size += 2) { + initialMinZ += 2; + sint8 minZ = (initialMinZ << 1) & 0xFF; + x -= 32; + y -= 32; // Corner (North-West) mapElement = map_get_surface_element_at(mapLeft >> 5, mapTop >> 5); - z = map_get_corner_height(mapElement, 4); - result = sub_68C3B2(flags, x, y, z, minZ); + z = map_get_corner_height(mapElement, 2); + result = smooth_land_tile(0, flags, x, y, z, minZ); if (result != MONEY32_UNDEFINED) { totalCost += result; } y += 32; // Side (West) - for (int i = 0; i < bx; i++) { + for (int i = 0; i < size; i++) { int y2 = clamp(mapTop, y, mapBottom); mapElement = map_get_surface_element_at(mapLeft >> 5, y2 >> 5); - z = map_get_corner_height(mapElement, 4); - result = sub_68C47A(flags, x, y, z, minZ); + z = map_get_corner_height(mapElement, 2); + result = smooth_land_tile(1, flags, x, y, z, minZ); if (result != MONEY32_UNDEFINED) { totalCost += result; } @@ -2405,8 +2231,8 @@ void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, minZ += 2; } } - z = map_get_corner_height(mapElement, 8); - result = sub_68C3B2(flags, x, y, z, minZ); + z = map_get_corner_height(mapElement, 3); + result = smooth_land_tile(0, flags, x, y, z, minZ); if (result != MONEY32_UNDEFINED) { totalCost += result; } @@ -2416,19 +2242,19 @@ void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, // Corner (South-West) mapElement = map_get_surface_element_at(mapLeft >> 5, mapBottom >> 5); - z = map_get_corner_height(mapElement, 8); - result = sub_68C47A(flags, x, y, z, minZ); + z = map_get_corner_height(mapElement, 3); + result = smooth_land_tile(1, flags, x, y, z, minZ); if (result != MONEY32_UNDEFINED) { totalCost += result; } x += 32; // Side (South) - for (int i = 0; i < bx; i++) { + for (int i = 0; i < size; i++) { int x2 = clamp(mapLeft, x, mapRight); mapElement = map_get_surface_element_at(x2 >> 5, mapBottom >> 5); - z = map_get_corner_height(mapElement, 8); - result = sub_68C222(flags, x, y, z, minZ); + z = map_get_corner_height(mapElement, 3); + result = smooth_land_tile(2, flags, x, y, z, minZ); if (result != MONEY32_UNDEFINED) { totalCost += result; } @@ -2439,8 +2265,8 @@ void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, minZ += 2; } } - z = map_get_corner_height(mapElement, 1); - result = sub_68C47A(flags, x, y, z, minZ); + z = map_get_corner_height(mapElement, 0); + result = smooth_land_tile(1, flags, x, y, z, minZ); if (result != MONEY32_UNDEFINED) { totalCost += result; } @@ -2450,19 +2276,19 @@ void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, // Corner (South-East) mapElement = map_get_surface_element_at(mapRight >> 5, mapBottom >> 5); - z = map_get_corner_height(mapElement, 1); - result = sub_68C222(flags, x, y, z, minZ); + z = map_get_corner_height(mapElement, 0); + result = smooth_land_tile(2, flags, x, y, z, minZ); if (result != MONEY32_UNDEFINED) { totalCost += result; } y -= 32; // Side (East) - for (int i = 0; i < bx; i++) { + for (int i = 0; i < size; i++) { int y2 = clamp(mapTop, y, mapBottom); mapElement = map_get_surface_element_at(mapRight >> 5, y2 >> 5); - z = map_get_corner_height(mapElement, 1); - result = sub_68C2EA(flags, x, y, z, minZ); + z = map_get_corner_height(mapElement, 0); + result = smooth_land_tile(3, flags, x, y, z, minZ); if (result != MONEY32_UNDEFINED) { totalCost += result; } @@ -2473,8 +2299,8 @@ void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, minZ += 2; } } - z = map_get_corner_height(mapElement, 2); - result = sub_68C222(flags, x, y, z, minZ); + z = map_get_corner_height(mapElement, 1); + result = smooth_land_tile(2, flags, x, y, z, minZ); if (result != MONEY32_UNDEFINED) { totalCost += result; } @@ -2484,19 +2310,19 @@ void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, // Corner (North-East) mapElement = map_get_surface_element_at(mapRight >> 5, mapTop >> 5); - z = map_get_corner_height(mapElement, 2); - result = sub_68C2EA(flags, x, y, z, minZ); + z = map_get_corner_height(mapElement, 1); + result = smooth_land_tile(3, flags, x, y, z, minZ); if (result != MONEY32_UNDEFINED) { totalCost += result; } x -= 32; // Side (North) - for (int i = 0; i < bx; i++) { + for (int i = 0; i < size; i++) { int x2 = clamp(mapLeft, x, mapRight); mapElement = map_get_surface_element_at(x2 >> 5, mapTop >> 5); - z = map_get_corner_height(mapElement, 2); - result = sub_68C3B2(flags, x, y, z, minZ); + z = map_get_corner_height(mapElement, 1); + result = smooth_land_tile(0, flags, x, y, z, minZ); if (result != MONEY32_UNDEFINED) { totalCost += result; } @@ -2507,8 +2333,8 @@ void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, minZ += 2; } } - z = map_get_corner_height(mapElement, 4); - result = sub_68C2EA(flags, x, y, z, minZ); + z = map_get_corner_height(mapElement, 2); + result = smooth_land_tile(3, flags, x, y, z, minZ); if (result != MONEY32_UNDEFINED) { totalCost += result; } @@ -2517,7 +2343,28 @@ void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, } } - *ebx = totalCost; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = centreX; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = centreY; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = centreZ; + return totalCost * 4; +} + +/** + * + * rct2: 0x0068BC01 + */ +void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) +{ + int flags = *ebx & 0xFF; + int centreX = *eax & 0xFFFF; + int centreY = *ecx & 0xFFFF; + int mapLeft = *edx & 0xFFFF; + int mapTop = *ebp & 0xFFFF; + int mapRight = *edx >> 16; + int mapBottom = *ebp >> 16; + int command = *edi; + *ebx = smooth_land(flags, centreX, centreY, mapLeft, mapTop, mapRight, mapBottom, command); } /** From d5ae4a55ffda8328bc4219aa9e32ab0a6ec8ae19 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 11 Oct 2015 12:26:33 +0100 Subject: [PATCH 0815/1173] allow 1 to 64 mountain tool size --- data/language/english_uk.txt | 1 + src/localisation/string_ids.h | 2 ++ src/windows/land.c | 59 +++++++++++++++++++++++------------ src/windows/top_toolbar.c | 10 +++--- src/world/map.c | 19 +++++++---- src/world/map.h | 4 ++- 6 files changed, 63 insertions(+), 32 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index b125cef62f..74009664a5 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3892,6 +3892,7 @@ STR_5550 :{POP16}{POP16}Year {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH STR_5551 :Year/Day/Month STR_5552 :{POP16}{POP16}Year {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} STR_5553 :Pause game when Steam overlay is open +STR_5554 :{SMALLFONT}{BLACK}Enable mountain tool ##################### # Rides/attractions # diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 75d5d689eb..54f7a2ffe2 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2128,6 +2128,8 @@ enum { STR_STEAM_OVERLAY_PAUSE = 5553, + STR_ENABLE_MOUNTAIN_TOOL_TIP = 5554, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/land.c b/src/windows/land.c index 1a68a7884c..94f9e4200b 100644 --- a/src/windows/land.c +++ b/src/windows/land.c @@ -28,31 +28,36 @@ #include "dropdown.h" #include "../interface/themes.h" -#define MINIMUM_TOOL_SIZE 0 +#define MINIMUM_TOOL_SIZE 1 #define MAXIMUM_TOOL_SIZE 64 enum WINDOW_LAND_WIDGET_IDX { WIDX_BACKGROUND, WIDX_TITLE, WIDX_CLOSE, + WIDX_MOUNTAINMODE, + WIDX_PAINTMODE, WIDX_PREVIEW, WIDX_DECREMENT, WIDX_INCREMENT, WIDX_FLOOR, WIDX_WALL, - WIDX_PAINTMODE, }; static rct_widget window_land_widgets[] = { - { WWT_FRAME, 0, 0, 97, 0, 125, -1, STR_NONE }, // panel / background - { WWT_CAPTION, 0, 1, 96, 1, 14, STR_LAND, STR_WINDOW_TITLE_TIP }, // title bar - { WWT_CLOSEBOX, 0, 85, 95, 2, 13, 824, STR_CLOSE_WINDOW_TIP }, // close x button - { WWT_IMGBTN, 0, 10, 53, 17, 48, 5503, STR_NONE }, // preview box - { WWT_TRNBTN, 1, 11, 26, 18, 33, 0x20000000 | SPR_LAND_TOOL_DECREASE, STR_ADJUST_SMALLER_LAND_TIP }, // decrement size - { WWT_TRNBTN, 1, 37, 52, 32, 47, 0x20000000 | SPR_LAND_TOOL_INCREASE, STR_ADJUST_LARGER_LAND_TIP }, // increment size - { WWT_FLATBTN, 1, 2, 48, 75, 110, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP }, // floor texture - { WWT_FLATBTN, 1, 49, 95, 75, 110, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP }, // wall texture - { WWT_FLATBTN, 1, 64, 87, 21, 44, 5173, 5127 }, // paint mode + { WWT_FRAME, 0, 0, 97, 0, 143, -1, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 96, 1, 14, STR_LAND, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 85, 95, 2, 13, 824, STR_CLOSE_WINDOW_TIP }, // close x button + + { WWT_FLATBTN, 1, 19, 42, 19, 42, 5147, STR_ENABLE_MOUNTAIN_TOOL_TIP }, // mountain mode + { WWT_FLATBTN, 1, 55, 78, 19, 42, 5173, 5127 }, // paint mode + + { WWT_IMGBTN, 0, 27, 70, 48, 79, 5503, STR_NONE }, // preview box + { WWT_TRNBTN, 1, 28, 43, 49, 64, 0x20000000 | SPR_LAND_TOOL_DECREASE, STR_ADJUST_SMALLER_LAND_TIP }, // decrement size + { WWT_TRNBTN, 1, 54, 69, 63, 78, 0x20000000 | SPR_LAND_TOOL_INCREASE, STR_ADJUST_LARGER_LAND_TIP }, // increment size + + { WWT_FLATBTN, 1, 2, 48, 106, 141, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP }, // floor texture + { WWT_FLATBTN, 1, 49, 95, 106, 141, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP }, // wall texture { WIDGETS_END }, }; @@ -128,7 +133,7 @@ void window_land_open() if (window_find_by_class(WC_LAND) != NULL) return; - window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 98, 29, 98, 126, &window_land_events, WC_LAND, 0); + window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 98, 29, 98, 144, &window_land_events, WC_LAND, 0); window->widgets = window_land_widgets; window->enabled_widgets = (1 << WIDX_CLOSE) | @@ -136,6 +141,7 @@ void window_land_open() (1 << WIDX_INCREMENT) | (1 << WIDX_FLOOR) | (1 << WIDX_WALL) | + (1 << WIDX_MOUNTAINMODE) | (1 << WIDX_PAINTMODE) | (1 << WIDX_PREVIEW); window_init_scroll_widgets(window); @@ -143,7 +149,8 @@ void window_land_open() RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_SURFACE, uint8) = 255; RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_EDGE, uint8) = 255; - LandPaintMode = false; + gLandMountainMode = false; + gLandPaintMode = false; _selectedFloorTexture = 0; _selectedWallTexture = 0; RCT2_GLOBAL(RCT2_ADDRESS_LAND_RAISE_COST, money32) = MONEY32_UNDEFINED; @@ -185,8 +192,14 @@ static void window_land_mouseup(rct_window *w, int widgetIndex) // Invalidate the window window_invalidate(w); break; + case WIDX_MOUNTAINMODE: + gLandMountainMode ^= 1; + gLandPaintMode = 0; + window_invalidate(w); + break; case WIDX_PAINTMODE: - LandPaintMode ^= 1; + gLandMountainMode = 0; + gLandPaintMode ^= 1; window_invalidate(w); break; case WIDX_PREVIEW: @@ -336,7 +349,9 @@ static void window_land_invalidate(rct_window *w) w->pressed_widgets |= (1 << WIDX_FLOOR); if (RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_EDGE, uint8) != 255) w->pressed_widgets |= (1 << WIDX_WALL); - if (LandPaintMode != 0) + if (gLandMountainMode) + w->pressed_widgets |= (1 << WIDX_MOUNTAINMODE); + if (gLandPaintMode) w->pressed_widgets |= (1 << WIDX_PAINTMODE); window_land_widgets[WIDX_FLOOR].image = SPR_FLOOR_TEXTURE_GRASS + _selectedFloorTexture; @@ -355,19 +370,23 @@ static void window_land_paint(rct_window *w, rct_drawpixelinfo *dpi) { int x, y, numTiles; money32 price; + rct_widget *previewWidget = &window_land_widgets[WIDX_PREVIEW]; window_draw_widgets(w, dpi); - x = w->x + (window_land_widgets[WIDX_PREVIEW].left + window_land_widgets[WIDX_PREVIEW].right) / 2; - y = w->y + (window_land_widgets[WIDX_PREVIEW].top + window_land_widgets[WIDX_PREVIEW].bottom) / 2; - // Draw number for tool sizes bigger than 7 if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) > 7) { + x = w->x + (previewWidget->left + previewWidget->right) / 2; + y = w->y + (previewWidget->top + previewWidget->bottom) / 2; gfx_draw_string_centred(dpi, STR_LAND_TOOL_SIZE_VALUE, x, y - 2, 0, &RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16)); + } else if (gLandMountainMode) { + x = w->x + previewWidget->left; + y = w->y + previewWidget->top; + gfx_draw_sprite(dpi, SPR_LAND_TOOL_SIZE_0, x, y, 0); } - x = w->x + (window_land_widgets[WIDX_PREVIEW].left + window_land_widgets[WIDX_PREVIEW].right) / 2 + 17; - y = w->y + window_land_widgets[WIDX_PREVIEW].bottom + 5; + x = w->x + (previewWidget->left + previewWidget->right) / 2; + y = w->y + previewWidget->bottom + 5; // Draw raise cost amount if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_RAISE_COST, uint32) != MONEY32_UNDEFINED && RCT2_GLOBAL(RCT2_ADDRESS_LAND_RAISE_COST, uint32) != 0) diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 620c518ea1..868068e110 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -1792,7 +1792,7 @@ void top_toolbar_tool_update_land(sint16 x, sint16 y){ rct_xy16 mapTile = { .x = x, .y = y }; RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 0); - if (tool_size == 1){ + if (tool_size == 1 && !gLandMountainMode){ int direction; screen_pos_to_map_pos(&mapTile.x, &mapTile.y, &direction); @@ -2498,7 +2498,7 @@ static void window_top_toolbar_tool_update(rct_window* w, int widgetIndex, int x top_toolbar_tool_update_scenery_clear(x, y); break; case WIDX_LAND: - if (LandPaintMode) + if (gLandPaintMode) top_toolbar_tool_update_land_paint(x, y); else top_toolbar_tool_update_land(x, y); @@ -2576,7 +2576,7 @@ money32 selection_raise_land(uint8 flags) uint32 yBounds = (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16) & 0xFFFF) | (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16) << 16); RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_RAISE_LAND_HERE; - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) == 0) { + if (gLandMountainMode) { return game_do_command(centreX, flags, centreY, xBounds, GAME_COMMAND_EDIT_LAND_SMOOTH, 1, yBounds); } else { return game_do_command(centreX, flags, centreY, xBounds, GAME_COMMAND_RAISE_LAND, RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16), yBounds); @@ -2598,7 +2598,7 @@ money32 selection_lower_land(uint8 flags) uint32 yBounds = (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16) & 0xFFFF) | (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16) << 16); RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_LOWER_LAND_HERE; - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) == 0) { + if (gLandMountainMode) { return game_do_command(centreX, flags, centreY, xBounds, GAME_COMMAND_EDIT_LAND_SMOOTH, 0xFFFF, yBounds); } else { return game_do_command(centreX, flags, centreY, xBounds, GAME_COMMAND_LOWER_LAND, RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16), yBounds); @@ -2746,7 +2746,7 @@ static void window_top_toolbar_tool_drag(rct_window* w, int widgetIndex, int x, break; case WIDX_LAND: // Custom setting to only change land style instead of raising or lowering land - if (LandPaintMode) { + if (gLandPaintMode) { if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16)&(1 << 0)){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_CHANGE_LAND_TYPE; game_do_command( diff --git a/src/world/map.c b/src/world/map.c index 0926e655c0..076899d23f 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -58,7 +58,8 @@ rct_map_element **gMapElementTilePointers = (rct_map_element**)RCT2_ADDRESS_TILE rct_xy16 *gMapSelectionTiles = (rct_xy16*)0x009DE596; rct2_peep_spawn *gPeepSpawns = (rct2_peep_spawn*)RCT2_ADDRESS_PEEP_SPAWNS; -bool LandPaintMode; +bool gLandMountainMode; +bool gLandPaintMode; bool LandRightsMode; bool gClearSmallScenery; bool gClearLargeScenery; @@ -2148,6 +2149,12 @@ static money32 smooth_land_tile(int direction, uint8 flags, int x, int y, uint8 money32 smooth_land(int flags, int centreX, int centreY, int mapLeft, int mapTop, int mapRight, int mapBottom, int command) { + // Cap bounds to map + mapLeft = max(mapLeft, 32); + mapTop = max(mapTop, 32); + mapRight = min(mapRight, 255 * 32); + mapBottom = min(mapBottom, 255 * 32); + int commandType; int centreZ = map_element_height(centreX, centreY); int mapLeftRight = mapLeft | (mapRight << 16); @@ -2200,7 +2207,7 @@ money32 smooth_land(int flags, int centreX, int centreY, int mapLeft, int mapTop int size = ((mapRight - mapLeft) >> 5) + 1; sint8 initialMinZ = -2; - for (; size <= 64; size += 2) { + for (; size <= 256; size += 2) { initialMinZ += 2; sint8 minZ = (initialMinZ << 1) & 0xFF; x -= 32; @@ -2359,10 +2366,10 @@ void game_command_smooth_land(int* eax, int* ebx, int* ecx, int* edx, int* esi, int flags = *ebx & 0xFF; int centreX = *eax & 0xFFFF; int centreY = *ecx & 0xFFFF; - int mapLeft = *edx & 0xFFFF; - int mapTop = *ebp & 0xFFFF; - int mapRight = *edx >> 16; - int mapBottom = *ebp >> 16; + int mapLeft = (sint16)(*edx & 0xFFFF); + int mapTop = (sint16)(*ebp & 0xFFFF); + int mapRight = (sint16)(*edx >> 16); + int mapBottom = (sint16)(*ebp >> 16); int command = *edi; *ebx = smooth_land(flags, centreX, centreY, mapLeft, mapTop, mapRight, mapBottom, command); } diff --git a/src/world/map.h b/src/world/map.h index d860869ec4..60d41f67bb 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -262,8 +262,10 @@ extern rct_map_element **gMapElementTilePointers; extern rct_xy16 *gMapSelectionTiles; extern rct2_peep_spawn *gPeepSpawns; +// Used in the land tool window to enable mountain tool / land smoothing +extern bool gLandMountainMode; // Used in the land tool window to allow dragging and changing land styles -extern bool LandPaintMode; +extern bool gLandPaintMode; // Used in the land rights tool window to either buy land rights or construction rights extern bool LandRightsMode; // Used in the clear scenery tool From 6cd3b41065def67e3e91031fd97710a8c4bba547 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 11 Oct 2015 12:31:57 +0100 Subject: [PATCH 0816/1173] fix overflows / underflows with mountain tool --- src/world/map.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 076899d23f..5b2b5bbcba 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2100,7 +2100,7 @@ static int map_get_corner_height(rct_map_element *mapElement, int direction) * rct2: 0x0068C222 slope 4, style 2 * rct2: 0x0068C2EA slope 8, style 3 */ -static money32 smooth_land_tile(int direction, uint8 flags, int x, int y, uint8 targetBaseZ, uint8 minBaseZ) +static money32 smooth_land_tile(int direction, uint8 flags, int x, int y, int targetBaseZ, int minBaseZ) { // Check if inside map bounds if (x < 0 || y < 0 || x >= (256 * 32) || y >= (256 * 32)) { @@ -2109,7 +2109,7 @@ static money32 smooth_land_tile(int direction, uint8 flags, int x, int y, uint8 // Get height of tile rct_map_element *mapElement = map_get_surface_element_at(x >> 5, y >> 5); - uint8 baseZ = map_get_corner_height(mapElement, direction); + int baseZ = map_get_corner_height(mapElement, direction); // Check if tile is same height as target tile if (baseZ == targetBaseZ) { @@ -2205,11 +2205,11 @@ money32 smooth_land(int flags, int centreX, int centreY, int mapLeft, int mapTop x = mapLeft; y = mapTop; int size = ((mapRight - mapLeft) >> 5) + 1; - sint8 initialMinZ = -2; + int initialMinZ = -2; for (; size <= 256; size += 2) { initialMinZ += 2; - sint8 minZ = (initialMinZ << 1) & 0xFF; + int minZ = initialMinZ * 2; x -= 32; y -= 32; From 63603871eaa8bad8949e2f86fd26bf26448150e0 Mon Sep 17 00:00:00 2001 From: Caio Alonso Date: Sun, 11 Oct 2015 15:26:18 -0300 Subject: [PATCH 0817/1173] fixes the portuguese (br) language name --- src/localisation/language.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index 855b659e01..eba6a6af0f 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -43,7 +43,7 @@ enum { RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL, RCT2_LANGUAGE_ID_12, - RCT2_LANGUAGE_ID_PORTUGESE, + RCT2_LANGUAGE_ID_PORTUGUESE, RCT2_LANGUAGE_ID_END = 255 }; @@ -80,7 +80,7 @@ const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "es-ES", "Spanish", "Espa\xC3\xB1ol", "spanish_sp", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_SPANISH }, // LANGUAGE_SPANISH { "sv-SE", "Swedish", "Svenska", "swedish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_SWEDISH }, // LANGUAGE_SWEDISH { "it-IT", "Italian", "Italiano", "italian", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ITALIAN }, // LANGUAGE_ITALIAN - { "pt-BR", "Portuguese (BR)", "Portug\xC3\xAAs (BR)", "portuguese_br", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_PORTUGESE }, // LANGUAGE_PORTUGUESE_BR + { "pt-BR", "Portuguese (BR)", "Portugu\xC3\xAAs (BR)", "portuguese_br", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_PORTUGUESE }, // LANGUAGE_PORTUGUESE_BR { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", &TTFFontMingLiu, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL { "zh-Hans", "Chinese (Simplified)", "Chinese (Simplified)", "chinese_simplified", &TTFFontSimSun, RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED }, // LANGUAGE_CHINESE_SIMPLIFIED { "fi-FI", "Finnish", "Suomi", "finnish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_FINNISH From 105280a082c05a6f85b9b140941f4ae8b92ce162 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 12 Oct 2015 15:58:15 +0200 Subject: [PATCH 0818/1173] Introduce cheat option to show vehicles from other track types --- data/language/english_uk.txt | 1 + src/cheats.c | 2 ++ src/cheats.h | 1 + src/localisation/string_ids.h | 5 +++ src/windows/cheats.c | 10 ++++-- src/windows/dropdown.h | 2 +- src/windows/ride.c | 64 +++++++++++++++++++++++------------ 7 files changed, 61 insertions(+), 24 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 74009664a5..f6d816fa12 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3893,6 +3893,7 @@ STR_5551 :Year/Day/Month STR_5552 :{POP16}{POP16}Year {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} STR_5553 :Pause game when Steam overlay is open STR_5554 :{SMALLFONT}{BLACK}Enable mountain tool +STR_5555 :Show vehicles from other track types ##################### # Rides/attractions # diff --git a/src/cheats.c b/src/cheats.c index 7297ede6e3..c6ced49833 100644 --- a/src/cheats.c +++ b/src/cheats.c @@ -4,6 +4,7 @@ bool gCheatsSandboxMode = false; bool gCheatsDisableClearanceChecks = false; bool gCheatsDisableSupportLimits = false; bool gCheatsShowAllOperatingModes = false; +bool gCheatsShowVehiclesFromOtherTrackTypes = false; void cheats_reset() { @@ -11,4 +12,5 @@ void cheats_reset() gCheatsDisableClearanceChecks = false; gCheatsDisableSupportLimits = false; gCheatsShowAllOperatingModes = false; + gCheatsShowVehiclesFromOtherTrackTypes = false; } diff --git a/src/cheats.h b/src/cheats.h index 62b8033241..3c9c2d292d 100644 --- a/src/cheats.h +++ b/src/cheats.h @@ -27,6 +27,7 @@ extern bool gCheatsSandboxMode; extern bool gCheatsDisableClearanceChecks; extern bool gCheatsDisableSupportLimits; extern bool gCheatsShowAllOperatingModes; +extern bool gCheatsShowVehiclesFromOtherTrackTypes; void cheats_reset(); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 54f7a2ffe2..833ff8e122 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1947,6 +1947,9 @@ enum { STR_CHEAT_EXPLODE = 5285, STR_CHEAT_TIP_EXPLODE = 5286, + STR_DEBUG_NO_BREAKDOWNS_AVAILABLE = 5289, + STR_DEBUG_FIX_RIDE = 5290, + STR_CHEAT_TIP_CLEAR_LOAN = 5301, STR_CHEAT_CLEAR_LOAN = 5302, STR_CHEAT_BUILD_IN_PAUSE_MODE = 5303, @@ -2130,6 +2133,8 @@ enum { STR_ENABLE_MOUNTAIN_TOOL_TIP = 5554, + STR_CHEAT_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES = 5555, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/cheats.c b/src/windows/cheats.c index f0aa95a46b..de90955bf3 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -118,7 +118,8 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_DISABLE_ALL_BREAKDOWNS, WIDX_BUILD_IN_PAUSE_MODE, WIDX_RESET_CRASH_STATUS, - WIDX_SHOW_ALL_OPERATING_MODES + WIDX_SHOW_ALL_OPERATING_MODES, + WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES }; enum { @@ -259,6 +260,7 @@ static rct_widget window_cheats_rides_widgets[] = { { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(8), OHPL(8), STR_CHEAT_BUILD_IN_PAUSE_MODE, STR_NONE }, // Build in pause mode { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_RESET_CRASH_STATUS, STR_NONE }, // Reset crash status { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(7), OHPL(7), STR_CHEAT_SHOW_ALL_OPERATING_MODES, STR_NONE }, // Show all operating modes + { 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 { WIDGETS_END }, }; @@ -414,7 +416,7 @@ 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_HIGH_MONEY) | (1ULL << WIDX_CLEAR_LOAN), (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_GUEST_PARAMETERS_GROUP) | (1ULL << WIDX_GUEST_HAPPINESS_MAX) | (1ULL << WIDX_GUEST_HAPPINESS_MIN) | (1ULL << WIDX_GUEST_ENERGY_MAX) | (1ULL << WIDX_GUEST_ENERGY_MIN) | (1ULL << WIDX_GUEST_HUNGER_MAX) | (1ULL << WIDX_GUEST_HUNGER_MIN) | (1ULL << WIDX_GUEST_THIRST_MAX) | (1ULL << WIDX_GUEST_THIRST_MIN) | (1ULL << WIDX_GUEST_NAUSEA_MAX) | (1ULL << WIDX_GUEST_NAUSEA_MIN) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1ULL << WIDX_GUEST_BATHROOM_MAX) | (1ULL << WIDX_GUEST_BATHROOM_MIN) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1ULL << WIDX_GUEST_IGNORE_RIDE_INTENSITY) | (1ULL << WIDX_GIVE_ALL_GUESTS_GROUP) | (1ULL << WIDX_GIVE_GUESTS_MONEY) | (1ULL << WIDX_GIVE_GUESTS_PARK_MAPS) | (1ULL << WIDX_GIVE_GUESTS_BALLOONS) | (1ULL << WIDX_GIVE_GUESTS_UMBRELLAS) | (1ULL << WIDX_TRAM_GUESTS) | (1ULL << WIDX_REMOVE_ALL_GUESTS) | (1ULL << WIDX_EXPLODE_GUESTS) | (1ULL << WIDX_DISABLE_VANDALISM), (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_FREEZE_CLIMATE) | (1ULL << WIDX_OPEN_CLOSE_PARK) | (1ULL << WIDX_WEATHER_SUN) | (1ULL << WIDX_WEATHER_THUNDER) | (1ULL << WIDX_CLEAR_GRASS) | (1ULL << WIDX_MOWED_GRASS) | (1ULL << WIDX_WATER_PLANTS) | (1ULL << WIDX_FIX_VANDALISM) | (1ULL << WIDX_REMOVE_LITTER) | (1ULL << WIDX_WIN_SCENARIO) | (1ULL << WIDX_HAVE_FUN) | (1ULL << WIDX_UNLOCK_ALL_PRICES) | (1ULL << WIDX_SANDBOX_MODE) | (1ULL << WIDX_FAST_STAFF) | (1ULL << WIDX_NORMAL_STAFF) | (1ULL << WIDX_PARK_PARAMETERS) | (1ULL << WIDX_FORCE_PARK_RATING) | (1ULL << WIDX_INCREASE_PARK_RATING) | (1ULL << WIDX_DECREASE_PARK_RATING), - (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_SHOW_ALL_OPERATING_MODES) + (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_SHOW_ALL_OPERATING_MODES) | (1ULL << WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES) }; static rct_string_id window_cheats_page_titles[] = { @@ -1011,6 +1013,9 @@ static void window_cheats_rides_mouseup(rct_window *w, int widgetIndex) case WIDX_SHOW_ALL_OPERATING_MODES: gCheatsShowAllOperatingModes = !gCheatsShowAllOperatingModes; break; + case WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES: + gCheatsShowVehiclesFromOtherTrackTypes = !gCheatsShowVehiclesFromOtherTrackTypes; + break; } } @@ -1075,6 +1080,7 @@ static void window_cheats_invalidate(rct_window *w) widget_set_checkbox_value(w, WIDX_DISABLE_ALL_BREAKDOWNS, gConfigCheat.disable_all_breakdowns); widget_set_checkbox_value(w, WIDX_BUILD_IN_PAUSE_MODE, gConfigCheat.build_in_pause_mode); widget_set_checkbox_value(w, WIDX_SHOW_ALL_OPERATING_MODES, gCheatsShowAllOperatingModes); + widget_set_checkbox_value(w, WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES, gCheatsShowVehiclesFromOtherTrackTypes); break; } diff --git a/src/windows/dropdown.h b/src/windows/dropdown.h index 5f3d27ed03..2a4789c453 100644 --- a/src/windows/dropdown.h +++ b/src/windows/dropdown.h @@ -48,4 +48,4 @@ int dropdown_index_from_point(int x, int y, rct_window* w); void window_dropdown_show_colour(rct_window *w, rct_widget *widget, uint8 dropdownColour, uint8 selectedColour); void window_dropdown_show_colour_available(rct_window *w, rct_widget *widget, uint8 dropdownColour, uint8 selectedColour, uint32 availableColours); -#endif \ No newline at end of file +#endif diff --git a/src/windows/ride.c b/src/windows/ride.c index 7a8d0403cb..dc3ea507a3 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -20,6 +20,7 @@ #include "../addresses.h" #include "../audio/audio.h" +#include "../cheats.h" #include "../config.h" #include "../game.h" #include "../input.h" @@ -2312,39 +2313,60 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi rct_ride *ride; rct_ride_type *rideEntry, *currentRideEntry; rct_string_id stringId; - int i, minCars, maxCars, cars, numItems, quadIndex, bitIndex, rideEntryIndex, selectedIndex; + int i, minCars, maxCars, cars, numItems, quadIndex, bitIndex, rideEntryIndex, selectedIndex, rideTypeIterator, rideTypeIteratorMax; uint8 *rideEntryIndexPtr, *currentRideEntryIndex; + bool selectionShouldBeExpanded; ride = GET_RIDE(w->number); rideEntry = ride_get_entry(ride); + if(gCheatsShowVehiclesFromOtherTrackTypes && !(ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) || ride->type==RIDE_TYPE_MAZE || ride->type==RIDE_TYPE_MINI_GOLF)) { + selectionShouldBeExpanded=true; + rideTypeIterator=0; + rideTypeIteratorMax=90; + } + else { + selectionShouldBeExpanded=false; + rideTypeIterator=ride->type; + rideTypeIteratorMax=ride->type; + } + switch (widgetIndex) { case WIDX_VEHICLE_TYPE_DROPDOWN: - rideEntryIndexPtr = get_ride_entry_indices_for_ride_type(ride->type); - currentRideEntryIndex; - selectedIndex = -1; numItems = 0; - for (currentRideEntryIndex = rideEntryIndexPtr; *currentRideEntryIndex != 0xFF; currentRideEntryIndex++) { - rideEntryIndex = *currentRideEntryIndex; - currentRideEntry = GET_RIDE_ENTRY(rideEntryIndex); - // Skip if vehicle has the same track type, but not same subtype, unless subtype switching is enabled - if ((currentRideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE | RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) && !gConfigInterface.select_by_track_type) + + for (; rideTypeIterator<=rideTypeIteratorMax; rideTypeIterator++) { + + if(selectionShouldBeExpanded && ride_type_has_flag(rideTypeIterator, RIDE_TYPE_FLAG_FLAT_RIDE)) + continue; + if(selectionShouldBeExpanded && (rideTypeIterator==RIDE_TYPE_MAZE || rideTypeIterator==RIDE_TYPE_MINI_GOLF)) continue; - quadIndex = rideEntryIndex >> 5; - bitIndex = rideEntryIndex & 0x1F; - // Skip if vehicle type is not invented yet - if (!(RCT2_ADDRESS(0x01357424, uint32)[quadIndex] & (1 << bitIndex))) - continue; + rideEntryIndexPtr = get_ride_entry_indices_for_ride_type(rideTypeIterator); + currentRideEntryIndex; - if (ride->subtype == rideEntryIndex) - selectedIndex = numItems; + for (currentRideEntryIndex = rideEntryIndexPtr; *currentRideEntryIndex != 0xFF; currentRideEntryIndex++) { + rideEntryIndex = *currentRideEntryIndex; + currentRideEntry = GET_RIDE_ENTRY(rideEntryIndex); + // Skip if vehicle has the same track type, but not same subtype, unless subtype switching is enabled + if ((currentRideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE | RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) && !(gConfigInterface.select_by_track_type || selectionShouldBeExpanded)) + continue; - gDropdownItemsFormat[numItems] = 1142; - gDropdownItemsArgs[numItems] = (rideEntryIndex << 16) | currentRideEntry->name; + quadIndex = rideEntryIndex >> 5; + bitIndex = rideEntryIndex & 0x1F; + // Skip if vehicle type is not invented yet + if (!(RCT2_ADDRESS(0x01357424, uint32)[quadIndex] & (1 << bitIndex))) + continue; - numItems++; + if (ride->subtype == rideEntryIndex) + selectedIndex = numItems; + + gDropdownItemsFormat[numItems] = 1142; + gDropdownItemsArgs[numItems] = (rideEntryIndex << 16) | currentRideEntry->name; + + numItems++; + } } window_dropdown_show_text_custom_width( @@ -3353,7 +3375,7 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc break; } gDropdownItemsFormat[0] = 1142; - gDropdownItemsArgs[0] = 5290; + gDropdownItemsArgs[0] = STR_DEBUG_FIX_RIDE; for (i = 0; i < 8; i++) { if (RideAvailableBreakdowns[ride_type->ride_type[j]] & (uint8)(1 << i)) { if (i == BREAKDOWN_BRAKES_FAILURE && (ride->mode == RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED || ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED)) { @@ -3366,7 +3388,7 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc } } if (num_items == 1) { - window_error_open(5289, STR_NONE); + window_error_open(STR_DEBUG_NO_BREAKDOWNS_AVAILABLE, STR_NONE); } else { window_dropdown_show_text( From a1cc3e4759448ef2a2cbe61648c4eff16f196983 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 12 Oct 2015 16:01:58 +0200 Subject: [PATCH 0819/1173] Fix vehicle dropdown when 'Select-by-track-type' off and 'Show vehicles from other track types' on --- src/windows/ride.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/ride.c b/src/windows/ride.c index dc3ea507a3..23510f5f7e 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -2503,7 +2503,7 @@ static void window_ride_vehicle_invalidate(rct_window *w) // Vehicle type window_ride_vehicle_widgets[WIDX_VEHICLE_TYPE].image = rideEntry->name; // Always show a dropdown button when changing subtypes is allowed - if ((var_496(w) <= 1 || (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)) && !gConfigInterface.select_by_track_type) { + if ((var_496(w) <= 1 || (rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)) && !(gConfigInterface.select_by_track_type || gCheatsShowVehiclesFromOtherTrackTypes)) { window_ride_vehicle_widgets[WIDX_VEHICLE_TYPE].type = WWT_14; window_ride_vehicle_widgets[WIDX_VEHICLE_TYPE_DROPDOWN].type = WWT_EMPTY; w->enabled_widgets &= ~(1 << WIDX_VEHICLE_TYPE); From 9572f1b5320efd29173f25b84e729ec5d1b59242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Mon, 12 Oct 2015 22:18:14 +0200 Subject: [PATCH 0820/1173] type and const fixes for sawyercoding --- src/scenario.c | 22 ++++---- src/scenario.h | 8 +-- src/util/sawyercoding.c | 118 +++++++++++++++++++++------------------- src/util/sawyercoding.h | 26 ++++----- 4 files changed, 90 insertions(+), 84 deletions(-) diff --git a/src/scenario.c b/src/scenario.c index 1d0a5c088a..45ba4b4244 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -851,7 +851,7 @@ int scenario_write_packed_objects(SDL_RWops* rw) */ int scenario_write_available_objects(FILE *file) { - char *buffer, *dstBuffer; + uint8 *buffer, *dstBuffer; int i, encodedLength; sawyercoding_chunk_header chunkHeader; @@ -860,16 +860,16 @@ int scenario_write_available_objects(FILE *file) // Initialise buffers buffer = malloc(bufferLength); - if (buffer == NULL) { - log_error("out of memory"); - return 0; - } + if (buffer == NULL) { + log_error("out of memory"); + return 0; + } dstBuffer = malloc(bufferLength + sizeof(sawyercoding_chunk_header)); - if (dstBuffer == NULL) { - free(buffer); - log_error("out of memory"); - return 0; - } + if (dstBuffer == NULL) { + free(buffer); + log_error("out of memory"); + return 0; + } // Write entries rct_object_entry_extended *srcEntry = (rct_object_entry_extended*)0x00F3F03C; @@ -1123,7 +1123,7 @@ int scenario_save_network(SDL_RWops* rw) bool scenario_save_s6(SDL_RWops* rw, rct_s6_data *s6) { - char *buffer; + uint8 *buffer; sawyercoding_chunk_header chunkHeader; int encodedLength; long fileSize; diff --git a/src/scenario.h b/src/scenario.h index 2b5e222225..8e079c49b5 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -175,7 +175,7 @@ typedef struct { uint32 dword_0135789C; uint32 dword_013578A0; uint32 dword_013578A4[201]; - + // SC6[8] uint16 last_guests_in_park; uint8 pad_01357BCA[3]; @@ -283,7 +283,7 @@ typedef struct { uint16 park_entrance_y[4]; uint16 park_entrance_z[4]; uint8 park_entrance_direction[4]; - uint8 scenario_filename[256]; + char scenario_filename[256]; uint8 saved_expansion_pack_names[3256]; rct_banner banners[250]; char custom_strings[0x8000]; diff --git a/src/util/sawyercoding.c b/src/util/sawyercoding.c index 5f75cc2480..90abde0744 100644 --- a/src/util/sawyercoding.c +++ b/src/util/sawyercoding.c @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -22,17 +22,18 @@ #include "../platform/platform.h" #include "sawyercoding.h" -static int decode_chunk_rle(uint8* src_buffer, uint8* dst_buffer, int length); -static int decode_chunk_repeat(char *buffer, int length); -static void decode_chunk_rotate(char *buffer, int length); +static size_t decode_chunk_rle(const uint8* src_buffer, uint8* dst_buffer, size_t length); +static size_t decode_chunk_repeat(uint8 *buffer, size_t length); +static void decode_chunk_rotate(uint8 *buffer, size_t length); -static int encode_chunk_rle(char *src_buffer, char *dst_buffer, int length); -static int encode_chunk_repeat(char *src_buffer, char *dst_buffer, int length); -static void encode_chunk_rotate(char *buffer, int length); +static size_t encode_chunk_rle(const uint8 *src_buffer, uint8 *dst_buffer, size_t length); +static size_t encode_chunk_repeat(const uint8 *src_buffer, uint8 *dst_buffer, size_t length); +static void encode_chunk_rotate(uint8 *buffer, size_t length); -uint32 sawyercoding_calculate_checksum(uint8* buffer, uint32 length) +uint32 sawyercoding_calculate_checksum(const uint8* buffer, size_t length) { - uint32 i, checksum = 0; + size_t i; + uint32 checksum = 0; for (i = 0; i < length; i++) checksum += buffer[i]; @@ -40,21 +41,23 @@ uint32 sawyercoding_calculate_checksum(uint8* buffer, uint32 length) } /** - * + * * rct2: 0x00676FD2 */ int sawyercoding_validate_checksum(SDL_RWops* rw) { - uint32 i, checksum, fileChecksum, dataSize, bufferSize; + size_t i, dataSize, bufferSize; + uint32 checksum, fileChecksum; uint8 buffer[1024]; // Get data size SDL_RWseek(rw, 0, RW_SEEK_END); - dataSize = (uint32)SDL_RWtell(rw); + // for whatever the reason, SDL_RWtell return Sint64 instead of size_t. + dataSize = (size_t)SDL_RWtell(rw); if (dataSize < 8) return 0; dataSize -= 4; - + // Calculate checksum SDL_RWseek(rw, 0, RW_SEEK_SET); checksum = 0; @@ -80,11 +83,11 @@ int sawyercoding_validate_checksum(SDL_RWops* rw) } /** - * + * * rct2: 0x0067685F * buffer (esi) */ -int sawyercoding_read_chunk(SDL_RWops* rw, uint8 *buffer) +size_t sawyercoding_read_chunk(SDL_RWops* rw, uint8 *buffer) { sawyercoding_chunk_header chunkHeader; @@ -129,9 +132,9 @@ int sawyercoding_read_chunk(SDL_RWops* rw, uint8 *buffer) /** * * rct2: 0x006762E1 -* +* */ -int sawyercoding_write_chunk_buffer(uint8 *dst_file, uint8* buffer, sawyercoding_chunk_header chunkHeader){ +size_t sawyercoding_write_chunk_buffer(uint8 *dst_file, uint8* buffer, sawyercoding_chunk_header chunkHeader){ uint8 *encode_buffer, *encode_buffer2; switch (chunkHeader.encoding){ @@ -178,16 +181,16 @@ int sawyercoding_write_chunk_buffer(uint8 *dst_file, uint8* buffer, sawyercoding return chunkHeader.length + sizeof(sawyercoding_chunk_header); } -int sawyercoding_decode_sv4(char *src, char *dst, int length) +size_t sawyercoding_decode_sv4(const uint8 *src, uint8 *dst, size_t length) { // (0 to length - 4): RLE chunk // (length - 4 to length): checksum return decode_chunk_rle(src, dst, length - 4); } -int sawyercoding_decode_sc4(char *src, char *dst, int length) +size_t sawyercoding_decode_sc4(const uint8 *src, uint8 *dst, size_t length) { - int decodedLength, i; + size_t decodedLength, i; uint32 *code; // Uncompress @@ -207,9 +210,10 @@ int sawyercoding_decode_sc4(char *src, char *dst, int length) return decodedLength; } -int sawyercoding_encode_sv4(char *src, char *dst, int length) +size_t sawyercoding_encode_sv4(const uint8 *src, uint8 *dst, size_t length) { - int encodedLength, checksum; + size_t encodedLength; + uint32 checksum; // Encode encodedLength = encode_chunk_rle(src, dst, length); @@ -221,16 +225,16 @@ int sawyercoding_encode_sv4(char *src, char *dst, int length) return encodedLength + 4; } -int sawyercoding_decode_td6(char *src, char *dst, int length) +size_t sawyercoding_decode_td6(const uint8 *src, uint8 *dst, size_t length) { return decode_chunk_rle(src, dst, length - 4); } -int sawyercoding_encode_td6(char* src, char* dst, int length){ - int output_length = encode_chunk_rle(src, dst, length); +size_t sawyercoding_encode_td6(const uint8* src, uint8* dst, size_t length){ + size_t output_length = encode_chunk_rle(src, dst, length); uint32 checksum = 0; - for (int i = 0; i < output_length; i++){ + for (size_t i = 0; i < output_length; i++){ uint8 new_byte = ((checksum & 0xFF) + dst[i]) & 0xFF; checksum = (checksum & 0xFFFFFF00) + new_byte; checksum = rol32(checksum, 3); @@ -243,11 +247,11 @@ int sawyercoding_encode_td6(char* src, char* dst, int length){ } /* Based off of rct2: 0x006770C1 */ -int sawyercoding_validate_track_checksum(char* src, int length){ +int sawyercoding_validate_track_checksum(const uint8* src, size_t length){ uint32 file_checksum = *((uint32*)&src[length - 4]); uint32 checksum = 0; - for (int i = 0; i < length - 4; i++){ + for (size_t i = 0; i < length - 4; i++){ uint8 new_byte = ((checksum & 0xFF) + src[i]) & 0xFF; checksum = (checksum & 0xFFFFFF00) + new_byte; checksum = rol32(checksum, 3); @@ -258,7 +262,7 @@ int sawyercoding_validate_track_checksum(char* src, int length){ else if (checksum - 0x1A67C == file_checksum) return 1; // .TD4 else if (checksum - 0x1A650 == file_checksum) - return 1; // .TD4 + return 1; // .TD4 else return 0; } @@ -266,12 +270,12 @@ int sawyercoding_validate_track_checksum(char* src, int length){ #pragma region Decoding /** - * + * * rct2: 0x0067693A */ -static int decode_chunk_rle(uint8* src_buffer, uint8* dst_buffer, int length) +static size_t decode_chunk_rle(const uint8* src_buffer, uint8* dst_buffer, size_t length) { - int i, j, count; + size_t i, j, count; uint8 *dst, rleCodeByte; dst = dst_buffer; @@ -288,19 +292,19 @@ static int decode_chunk_rle(uint8* src_buffer, uint8* dst_buffer, int length) *dst++ = src_buffer[++i]; } } - + // Return final size return dst - dst_buffer; } /** - * + * * rct2: 0x006769F1 */ -static int decode_chunk_repeat(char *buffer, int length) +static size_t decode_chunk_repeat(uint8 *buffer, size_t length) { - int i, j, count; - unsigned char *src, *dst, *copyOffset; + size_t i, j, count; + uint8 *src, *dst, *copyOffset; // Backup buffer src = malloc(length); @@ -322,16 +326,17 @@ static int decode_chunk_repeat(char *buffer, int length) free(src); // Return final size - return (char*)dst - buffer; + return dst - buffer; } /** - * + * * rct2: 0x006768F4 */ -static void decode_chunk_rotate(char *buffer, int length) +static void decode_chunk_rotate(uint8 *buffer, size_t length) { - int i, code = 1; + size_t i; + uint8 code = 1; for (i = 0; i < length; i++) { buffer[i] = ror8(buffer[i], code); code = (code + 2) % 8; @@ -346,13 +351,13 @@ static void decode_chunk_rotate(char *buffer, int length) * Ensure dst_buffer is bigger than src_buffer then resize afterwards * returns length of dst_buffer */ -static int encode_chunk_rle(char *src_buffer, char *dst_buffer, int length) +static size_t encode_chunk_rle(const uint8 *src_buffer, uint8 *dst_buffer, size_t length) { - char* src = src_buffer; - char* dst = dst_buffer; - char* end_src = src + length; + const uint8* src = src_buffer; + uint8* dst = dst_buffer; + const uint8* end_src = src + length; uint8 count = 0; - char* src_norm_start = src; + const uint8* src_norm_start = src; while (src < end_src - 1){ @@ -387,11 +392,11 @@ static int encode_chunk_rle(char *src_buffer, char *dst_buffer, int length) return dst - dst_buffer; } -static int encode_chunk_repeat(char *src_buffer, char *dst_buffer, int length) +static size_t encode_chunk_repeat(const uint8 *src_buffer, uint8 *dst_buffer, size_t length) { - int i, j, outLength; - int searchIndex, searchEnd, maxRepeatCount; - int bestRepeatIndex, bestRepeatCount, repeatIndex, repeatCount; + size_t i, j, outLength; + size_t searchIndex, searchEnd, maxRepeatCount; + size_t bestRepeatIndex, bestRepeatCount, repeatIndex, repeatCount; if (length == 0) return 0; @@ -444,9 +449,10 @@ static int encode_chunk_repeat(char *src_buffer, char *dst_buffer, int length) return outLength; } -static void encode_chunk_rotate(char *buffer, int length) +static void encode_chunk_rotate(uint8 *buffer, size_t length) { - int i, code = 1; + size_t i; + uint8 code = 1; for (i = 0; i < length; i++) { buffer[i] = rol8(buffer[i], code); code = (code + 2) % 8; @@ -455,9 +461,9 @@ static void encode_chunk_rotate(char *buffer, int length) #pragma endregion -int sawyercoding_detect_file_type(char *src, int length) +int sawyercoding_detect_file_type(const uint8 *src, size_t length) { - int i; + size_t i; // Currently can't detect TD4, as the checksum is the same as SC4 (need alternative method) @@ -478,4 +484,4 @@ int sawyercoding_detect_file_type(char *src, int length) } return -1; -} \ No newline at end of file +} diff --git a/src/util/sawyercoding.h b/src/util/sawyercoding.h index f12e589ec6..80e3c756ed 100644 --- a/src/util/sawyercoding.h +++ b/src/util/sawyercoding.h @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ - + #ifndef _SAWYERCODING_H_ #define _SAWYERCODING_H_ @@ -48,16 +48,16 @@ enum { }; int sawyercoding_validate_checksum(SDL_RWops* rw); -uint32 sawyercoding_calculate_checksum(uint8* buffer, uint32 length); -int sawyercoding_read_chunk(SDL_RWops* rw, uint8 *buffer); -int sawyercoding_write_chunk_buffer(uint8 *dst_file, uint8* buffer, sawyercoding_chunk_header chunkHeader); -int sawyercoding_decode_sv4(char *src, char *dst, int length); -int sawyercoding_decode_sc4(char *src, char *dst, int length); -int sawyercoding_encode_sv4(char *src, char *dst, int length); -int sawyercoding_decode_td6(char *src, char *dst, int length); -int sawyercoding_encode_td6(char* src, char* dst, int length); -int sawyercoding_validate_track_checksum(char* src, int length); +uint32 sawyercoding_calculate_checksum(const uint8* buffer, size_t length); +size_t sawyercoding_read_chunk(SDL_RWops* rw, uint8 *buffer); +size_t sawyercoding_write_chunk_buffer(uint8 *dst_file, uint8* buffer, sawyercoding_chunk_header chunkHeader); +size_t sawyercoding_decode_sv4(const uint8 *src, uint8 *dst, size_t length); +size_t sawyercoding_decode_sc4(const uint8 *src, uint8 *dst, size_t length); +size_t sawyercoding_encode_sv4(const uint8 *src, uint8 *dst, size_t length); +size_t sawyercoding_decode_td6(const uint8 *src, uint8 *dst, size_t length); +size_t sawyercoding_encode_td6(const uint8 *src, uint8 *dst, size_t length); +int sawyercoding_validate_track_checksum(const uint8* src, size_t length); -int sawyercoding_detect_file_type(char *src, int length); +int sawyercoding_detect_file_type(const uint8 *src, size_t length); #endif From 2db3f4ee23fdb3e08ad4f6d3643909cc85ed929a Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 13 Oct 2015 04:00:16 +0100 Subject: [PATCH 0821/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 18ffb50692..d00e4620b2 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3893,6 +3893,7 @@ STR_5550 :{POP16}{POP16}第{COMMA16}年, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUS STR_5551 :年/日/月 STR_5552 :{POP16}{POP16}第{COMMA16}年, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} STR_5553 :當Steam overlay開啟時暫停遊戲 +STR_5554 :{SMALLFONT}{BLACK}啟用山丘工具 ##################### # Rides/attractions # From e6359f486bb956d9de343d76367c4453182cd40f Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 14 Oct 2015 04:00:16 +0100 Subject: [PATCH 0822/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index c43b95379e..8b8f574a71 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3885,6 +3885,8 @@ STR_5549 :Jaar/maand/dag STR_5550 :{POP16}{POP16}Jaar {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} STR_5551 :Jaar/dag/maand STR_5552 :{POP16}{POP16}Jaar {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} +STR_5553 :Spel pauzeren als de Steam-overlay open staat +STR_5554 :{SMALLFONT}{BLACK}Overgangen met omringend land gladstrijken ############# # Scenarios # From 0a14971cdf1efddb907b00cd33e66b785e58ca33 Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Wed, 14 Oct 2015 23:18:43 +1000 Subject: [PATCH 0823/1173] Cleaned up peep_on_enter_ride --- src/peep/peep.c | 292 ++++++++++++++++++++++++++++++------------------ src/peep/peep.h | 2 +- 2 files changed, 184 insertions(+), 110 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 7b04fe58d3..a6ab246adb 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -5314,7 +5314,7 @@ rct_peep *peep_generate(int x, int y, int z) peep->action_sprite_type = 0; peep->flags = 0; peep->favourite_ride = 0xFF; - peep->var_FA = 0; + peep->favourite_ride_rating = 0; uint8* edx = RCT2_ADDRESS(0x98270C, uint8*)[peep->sprite_type * 2]; peep->sprite_width = edx[peep->action_sprite_type * 4]; @@ -7553,130 +7553,204 @@ static bool peep_has_ridden_ride_type(rct_peep *peep, int rideType) /** * * rct2: 0x0069545B + * Updates the happiness and nausea growth rates for peeps upon entering a ride, + * and contains the logic for determining if the ride will become the peep's favourite. + * The ride itself has its satisfaction value updated. */ static void peep_on_enter_ride(rct_peep *peep, int rideIndex) { - rct_ride *ride; - ride_rating minIntensity, maxIntensity; - ride_rating minNausea, maxNausea; - uint16 satisfactionFlags; + rct_ride *ride = GET_RIDE(rideIndex); + + // Check to see if this should become the peep's favourite ride. + // For this, a "ride rating" is calculated based on the excitement of the ride and the peep's current happiness. + // As this value cannot exceed 255, the happier the peep is, the more irrelevant the ride's excitement becomes. + // Due to the minimum happiness requirement, an excitement rating of more than 3.8 has no further effect. + + // If the ride rating is higher than any ride the peep has already been on and the happiness criteria is met, + // the ride becomes the peep's favourite. - ride = GET_RIDE(rideIndex); peep->flags &= ~PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE; - if (ride->excitement == (ride_rating)0xFFFF) { - satisfactionFlags = 0x1FF; - } else { - satisfactionFlags = 0; - maxIntensity = (peep->intensity >> 4) * 100; - minIntensity = (peep->intensity & 0xF) * 100; - if (maxIntensity <= ride->intensity || minIntensity >= ride->intensity) { - satisfactionFlags |= (1 << 1); - } - maxIntensity -= peep->happiness * 2; - minIntensity += peep->happiness; - if (maxIntensity <= ride->intensity || minIntensity >= ride->intensity) { - satisfactionFlags |= (1 << 4); - } - maxIntensity -= peep->happiness * 2; - minIntensity += peep->happiness; - if (maxIntensity <= ride->intensity || minIntensity >= ride->intensity) { - satisfactionFlags |= (1 << 7); - } - - minNausea = NauseaMinimumThresholds[(peep->nausea_tolerance & 3)]; - maxNausea = NauseaMaximumThresholds[(peep->nausea_tolerance & 3)]; - if (maxNausea <= ride->nausea || minNausea >= ride->nausea) { - satisfactionFlags |= (1 << 2); - } - maxNausea -= peep->happiness * 2; - minNausea += peep->happiness; - if (maxNausea <= ride->nausea || minNausea >= ride->nausea) { - satisfactionFlags |= (1 << 5); - } - maxNausea -= peep->happiness * 2; - minNausea += peep->happiness; - if (maxNausea <= ride->nausea || minNausea >= ride->nausea) { - satisfactionFlags |= (1 << 8); - } - satisfactionFlags |= (1 << 9); - } - - if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { - if (ride->value != 0xFFFF) { - satisfactionFlags &= ~(1 << 9); - satisfactionFlags |= (1 << 10); - if ((money16)ride->value < ride->price) { - satisfactionFlags &= ~(1 << 10); - satisfactionFlags |= (1 << 9); - if ((ride->value + ((ride->value * peep->happiness) / 256)) < ride->price) { - satisfactionFlags &= ~(1 << 9); - } - } - } - } - - uint8 satisfactionVar = 0; - if (satisfactionFlags & (1 << 9)) satisfactionVar += 15; - if (satisfactionFlags & (1 << 10)) satisfactionVar += 40; - if ((satisfactionFlags & (1 << 9)) && (satisfactionFlags & (1 << 10))) satisfactionVar -= 45; - if ((satisfactionFlags & 6) == 6) { - satisfactionVar += 70; - } else { - if (satisfactionFlags & 6) satisfactionVar += 15; - if ((satisfactionFlags & 0x30) == 0x30) { - satisfactionVar += 35; - } else { - if (satisfactionFlags & 0x30) satisfactionVar += 10; - if ((satisfactionFlags & 0x180) == 0x180) { - satisfactionVar += 10; - } else { - satisfactionVar -= 60; - } - } - } - - if (peep->time_in_queue <= 750) { - satisfactionVar += 10; - } else if (peep->time_in_queue >= 2250) { - satisfactionVar -= 10; - if (peep->time_in_queue >= 4500) { - satisfactionVar -= 25; - } - } - - if (peep_has_ridden(peep, peep->current_ride)) satisfactionVar += 10; - peep_set_has_ridden(peep, peep->current_ride); - if (peep->no_of_rides < 255) peep->no_of_rides++; - - if (peep_has_ridden_ride_type(peep, ride->type)) satisfactionVar += 10; - peep_set_has_ridden_ride_type(peep, ride->type); - - uint8 unkExcitementValue = clamp(0, (ride->excitement / 4) + peep->happiness, 255); - if (unkExcitementValue >= peep->var_FA) { + uint8 peepRideRating = clamp(0, (ride->excitement / 4) + peep->happiness, 255); + if (peepRideRating >= peep->favourite_ride_rating) { if (peep->happiness >= 160 && peep->happiness_growth_rate >= 160) { - peep->var_FA = unkExcitementValue; + peep->favourite_ride_rating = peepRideRating; peep->flags |= PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE; } } - uint8 satisfaction = 0; - if (satisfactionVar >= 0) { - satisfaction++; - if (satisfactionVar >= 20) { - satisfaction++; - if (satisfactionVar >= 40) { - satisfaction++; + /** + * The satisfaction values calculated here are used to determine how happy the peep is with the ride, + * and also affects the satisfaction stat of the ride itself. The factors that affect satisfaction include: + * - The price of the ride compared to the ride's value + * - How closely the intensity and nausea of the ride matches the peep's preferences + * - How long the peep was waiting in the queue + * - If the peep has been on the ride before, or on another ride of the same type + */ + + uint8 rawSatisfaction = 0; + + // Calculate satisfaction based on the price and value of the ride. + uint8 valueSatisfaction = 1; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { + if (ride->value != 0xFFFF) { + if (ride->price <= (money16)ride->value) { + valueSatisfaction = 2; + } + // Even if the price is more than the value, the peep will still be partially satisfied if their + // happiness is high enough to offset the difference. (Scales from +0% at empty happiness to +99% at full) + else if (ride->price <= (money16)(ride->value + ride->value * (peep->happiness / 256.0))) { + valueSatisfaction = 1; + } + else { + valueSatisfaction = 0; } } } - ride_update_satisfaction(ride, satisfaction); - peep->happiness_growth_rate = clamp(0, satisfactionVar + peep->happiness_growth_rate, 255); + switch (valueSatisfaction) { + case 2: + rawSatisfaction += 40; + break; + case 1: + rawSatisfaction += 15; + break; + case 0: + rawSatisfaction -= 45; + break; + } + + // Calculate satisfaction based on the intensity and nausea of the ride. + // The best possible score from this section is achieved by having the intensity and nausea + // of the ride fall exactly within the peep's preferences, but lower scores can still be achieved + // if the peep's happiness is enough to offset it. + ride_rating minIntensity, maxIntensity; + ride_rating minNausea, maxNausea; + uint8 intensitySatisfaction = 3; + uint8 nauseaSatisfaction = 3; + + if (ride->excitement != (ride_rating)0xFFFF) { + maxIntensity = (peep->intensity >> 4) * 100; + minIntensity = (peep->intensity & 0xF) * 100; + if (ride->intensity > maxIntensity || ride->intensity < minIntensity) { + intensitySatisfaction--; + } + + minIntensity -= peep->happiness * 2; + maxIntensity += peep->happiness; + if (ride->intensity > maxIntensity || ride->intensity < minIntensity) { + intensitySatisfaction--; + } + + minIntensity -= peep->happiness * 2; + maxIntensity += peep->happiness; + if (ride->intensity > maxIntensity || ride->intensity < minIntensity) { + intensitySatisfaction--; + } + + // Although it's not shown in the interface, a peep with Average or High nausea tolerance + // has a minimum preferred nausea value. (For peeps with None or Low, this is set to zero.) + minNausea = NauseaMinimumThresholds[peep->nausea_tolerance & 3]; + maxNausea = NauseaMaximumThresholds[peep->nausea_tolerance & 3]; + if (ride->nausea > maxNausea || ride->nausea < minNausea) { + nauseaSatisfaction--; + } + + minNausea -= peep->happiness * 2; + maxNausea += peep->happiness; + if (ride->nausea > maxNausea || ride->nausea < minNausea) { + nauseaSatisfaction--; + } + + minNausea -= peep->happiness * 2; + maxNausea += peep->happiness; + if (ride->nausea > maxNausea || ride->nausea < minNausea) { + nauseaSatisfaction--; + } + } + + // The combination of the intensity and nausea satisfaction is then used to determine the raw satisfaction value. + uint8 highestSatisfaction = max(intensitySatisfaction, nauseaSatisfaction); + uint8 lowestSatisfaction = min(intensitySatisfaction, nauseaSatisfaction); + + if (highestSatisfaction == 3) { + switch (lowestSatisfaction) { + case 3: + rawSatisfaction += 20; + case 2: + rawSatisfaction += 15; + case 1: + rawSatisfaction += 35; + break; + case 0: + rawSatisfaction -= 35; + } + } + else if (highestSatisfaction == 2) { + switch (lowestSatisfaction) { + case 2: + rawSatisfaction += 15; + case 1: + rawSatisfaction += 20; + break; + case 0: + rawSatisfaction -= 50; + } + } + else if (highestSatisfaction == 1 && lowestSatisfaction == 1) { + rawSatisfaction += 10; + } + else { + rawSatisfaction -= 60; + } + + // Calculate satisfaction based on how long the peep has been in the queue for. + // (For comparison: peeps start thinking "I've been queueing for a long time" at 3500 and + // start leaving the queue at 4300.) + if (peep->time_in_queue >= 4500) + rawSatisfaction -= 35; + else if (peep->time_in_queue >= 2250) + rawSatisfaction -= 10; + else if (peep->time_in_queue <= 750) + rawSatisfaction += 10; + + // Peeps get a small boost in satisfaction if they've been on a ride of the same type before, + // and this boost is doubled if they've already been on this particular ride. + if (peep_has_ridden_ride_type(peep, ride->type)) + rawSatisfaction += 10; + peep_set_has_ridden_ride_type(peep, ride->type); + + if (peep_has_ridden(peep, peep->current_ride)) + rawSatisfaction += 10; + peep_set_has_ridden(peep, peep->current_ride); + + if (peep->no_of_rides < 255) + peep->no_of_rides++; + + // Update the satisfaction stat of the ride itself. + uint8 satisfaction = 0; + if (rawSatisfaction >= 40) + satisfaction = 3; + else if (rawSatisfaction >= 20) + satisfaction = 2; + else if (rawSatisfaction >= 0) + satisfaction = 1; + + ride_update_satisfaction(ride, satisfaction); + + // Update the happiness growth rate of the peep. The largest possible change is +/- 1 + peep->happiness_growth_rate = clamp(0, rawSatisfaction + peep->happiness_growth_rate, 255); + + /* + * Update the nausea growth of the peep. This is calculated based on: + * - The nausea rating of the ride + * - Their new happiness growth rate (the higher, the less nauseous) + * - How hungry the peep is (+0% nausea at 50% hunger up to +100% nausea at 100% hunger) + * - The peep's nausea tolerance (Final modifier: none: 100%, low: 50%, average: 25%, high: 12.5%) + */ uint32 nauseaMultiplier = clamp(64, 256 - peep->happiness_growth_rate, 200); uint32 nauseaGrowthRateChange = (ride->nausea * nauseaMultiplier) / 512; - nauseaGrowthRateChange *= max(128, peep->hunger); - nauseaGrowthRateChange /= 128; - nauseaGrowthRateChange *= 2; + nauseaGrowthRateChange *= max(128, peep->hunger) / 64; nauseaGrowthRateChange >>= (peep->nausea_tolerance & 3); peep->nausea_growth_rate = (uint8)clamp(0, peep->nausea_growth_rate + nauseaGrowthRateChange, 255); } diff --git a/src/peep/peep.h b/src/peep/peep.h index 90e98fa968..66c4526713 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -542,7 +542,7 @@ typedef struct { uint8 umbrella_colour; // 0xF7 uint8 hat_colour; // 0xF8 uint8 favourite_ride; // 0xF9 - uint8 var_FA; + uint8 favourite_ride_rating; // 0xFA uint8 pad_FB; uint32 item_standard_flags; // 0xFC } rct_peep; From d71ca1f376f3f676bf43ace79d6aa3835bc85a00 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 14 Oct 2015 16:19:50 +0200 Subject: [PATCH 0824/1173] Extend dropdowns to hold up to 64 items (with bugs) --- src/input.c | 6 +++--- src/windows/dropdown.c | 16 ++++++++-------- src/windows/dropdown.h | 4 ++-- src/windows/ride.c | 11 ++++++----- src/windows/ride_construction.c | 2 +- src/windows/staff.c | 2 +- 6 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/input.c b/src/input.c index eb3f5809e6..d10e2f9232 100644 --- a/src/input.c +++ b/src/input.c @@ -1126,7 +1126,7 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi if (dropdown_index == -1)goto dropdown_cleanup; // _dropdown_unknown?? highlighted? - if (dropdown_index < 32 && RCT2_GLOBAL(0x009DED34, sint32) & (1 << dropdown_index))goto dropdown_cleanup; + if (dropdown_index < 64 && gDropdownItemsDisabled & (1ULL << dropdown_index))goto dropdown_cleanup; // gDropdownItemsFormat[dropdown_index] will not work until all windows that use dropdown decompiled if (RCT2_ADDRESS(0x9DEBA4, uint16)[dropdown_index] == 0)goto dropdown_cleanup; @@ -1210,7 +1210,7 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi } // _dropdown_unknown?? highlighted? - if (dropdown_index < 32 && RCT2_GLOBAL(0x009DED34, sint32) & (1 << dropdown_index))return; + if (dropdown_index < 64 && gDropdownItemsDisabled & (1ULL << dropdown_index))return; // gDropdownItemsFormat[dropdown_index] will not work until all windows that use dropdown decompiled if (RCT2_ADDRESS(0x9DEBA4, uint16)[dropdown_index] == 0)return; @@ -1670,4 +1670,4 @@ static void update_cursor_position() // write tutorial cursor position break; } -} \ No newline at end of file +} diff --git a/src/windows/dropdown.c b/src/windows/dropdown.c index 4d900297e4..cce9070f9f 100644 --- a/src/windows/dropdown.c +++ b/src/windows/dropdown.c @@ -53,8 +53,8 @@ int gDropdownNumItems; uint16 gDropdownItemsFormat[64]; sint64 gDropdownItemsArgs[64]; // Replaces 0x009DED38 -uint32 gDropdownItemsChecked; -uint32 *gDropdownItemsDisabled = RCT2_ADDRESS(0x009DED34, uint32); +uint64 gDropdownItemsChecked; +uint64 gDropdownItemsDisabled; bool gDropdownIsColour; int gDropdownLastColourHover; @@ -179,7 +179,7 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo // Input state _dropdown_highlighted_index = -1; - *gDropdownItemsDisabled = 0; + gDropdownItemsDisabled = 0; gDropdownItemsChecked = 0; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE; @@ -258,7 +258,7 @@ void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 fl // Input state _dropdown_highlighted_index = -1; - *gDropdownItemsDisabled = 0; + gDropdownItemsDisabled = 0; gDropdownItemsChecked = 0; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE; @@ -329,16 +329,16 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) ); } else { // Text item - if (i < 32) - if (gDropdownItemsChecked & (1 << i)) + if (i < 64) + if (gDropdownItemsChecked & (1ULL << i)) item++; // Calculate colour colour = w->colours[0] & 0x7F; if (i == _dropdown_highlighted_index) colour = 2; - if (*gDropdownItemsDisabled & (1 << i)) - if (i < 32) + if (gDropdownItemsDisabled & (1ULL << i)) + if (i < 64) colour = (w->colours[0] & 0x7F) | 0x40; // Draw item string diff --git a/src/windows/dropdown.h b/src/windows/dropdown.h index 2a4789c453..fbaee52ee4 100644 --- a/src/windows/dropdown.h +++ b/src/windows/dropdown.h @@ -35,8 +35,8 @@ extern int gAppropriateImageDropdownItemsPerRow[]; extern int gDropdownNumItems; extern uint16 gDropdownItemsFormat[64]; extern sint64 gDropdownItemsArgs[64]; -extern uint32 gDropdownItemsChecked; -extern uint32 *gDropdownItemsDisabled; +extern uint64 gDropdownItemsChecked; +extern uint64 gDropdownItemsDisabled; extern bool gDropdownIsColour; extern int gDropdownLastColourHover; diff --git a/src/windows/ride.c b/src/windows/ride.c index 23510f5f7e..d6a99ea1cb 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -1763,7 +1763,7 @@ static void window_ride_show_view_dropdown(rct_window *w, rct_widget *widget) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) { j = 2; for (i = 0; i < ride->num_vehicles; i++) { - RCT2_GLOBAL(0x009DED34, uint32) |= j; + gDropdownItemsDisabled |= j; j <<= 1; } } @@ -2336,7 +2336,8 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi selectedIndex = -1; numItems = 0; - for (; rideTypeIterator<=rideTypeIteratorMax; rideTypeIterator++) { + // Dropdowns with more items start acting weird, so cap it to 63. + for (; rideTypeIterator<=rideTypeIteratorMax && numItems<=63; rideTypeIterator++) { if(selectionShouldBeExpanded && ride_type_has_flag(rideTypeIterator, RIDE_TYPE_FLAG_FLAT_RIDE)) continue; @@ -2379,7 +2380,7 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi widget->right - dropdownWidget->left ); - gDropdownItemsChecked = (1 << selectedIndex); + gDropdownItemsChecked = (1ULL << selectedIndex); break; case WIDX_VEHICLE_TRAINS_DROPDOWN: window_dropdown_show_text_custom_width( @@ -3421,7 +3422,7 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc } if ((ride->lifecycle_flags & RIDE_LIFECYCLE_BREAKDOWN_PENDING) == 0) { - *gDropdownItemsDisabled = (1 << 0); + gDropdownItemsDisabled = (1 << 0); } } break; @@ -4703,7 +4704,7 @@ static void window_ride_measurements_mousedown(int widgetIndex, rct_window *w, r ); RCT2_GLOBAL(0x009DEBA2, sint16) = 0; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) - RCT2_GLOBAL(0x009DED34, uint32) |= 2; + gDropdownItemsDisabled |= 2; } /** diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 85e09df891..91d47ad76f 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -3175,7 +3175,7 @@ static void window_ride_construction_show_special_track_dropdown(rct_window *w, widget->right - widget->left ); - *gDropdownItemsDisabled = RCT2_GLOBAL(0x00F4409C, uint32); + gDropdownItemsDisabled = (uint64)RCT2_GLOBAL(0x00F4409C, uint32); } /** diff --git a/src/windows/staff.c b/src/windows/staff.c index 143f9bb3fd..423564f341 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -538,7 +538,7 @@ void window_staff_overview_mousedown(int widgetIndex, rct_window* w, rct_widget* // Disable clear patrol area if no area is set. if (!(RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[peep->staff_id] & 2)) { - RCT2_GLOBAL(0x009DED34, sint32) |= 1 << 1; + gDropdownItemsDisabled |= (1ULL << 1); } } From 3855d70d1a43f0377f99164ac7e908095c64b796 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 14 Oct 2015 20:54:02 +0100 Subject: [PATCH 0825/1173] fix dropdown 64 item support and remove old RCT2 addresses --- src/input.c | 27 +++++---- src/windows/banner.c | 2 +- src/windows/dropdown.c | 83 ++++++++++++++------------ src/windows/dropdown.h | 4 ++ src/windows/editor_objective_options.c | 6 +- src/windows/editor_scenario_options.c | 2 +- src/windows/finances.c | 2 +- src/windows/guest_list.c | 4 +- src/windows/land.c | 8 +-- src/windows/mapgen.c | 16 ++--- src/windows/options.c | 38 ++++++------ src/windows/park.c | 10 ++-- src/windows/research.c | 2 +- src/windows/ride.c | 56 +++++++++-------- src/windows/ride_construction.c | 2 +- src/windows/ride_list.c | 2 +- src/windows/staff.c | 2 +- src/windows/themes.c | 9 +-- src/windows/title_command_editor.c | 6 +- src/windows/title_editor.c | 2 +- src/windows/top_toolbar.c | 50 +++++++++------- 21 files changed, 182 insertions(+), 151 deletions(-) diff --git a/src/input.c b/src/input.c index d10e2f9232..c2d63a34c4 100644 --- a/src/input.c +++ b/src/input.c @@ -1123,13 +1123,17 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi if (w->classification == WC_DROPDOWN) { dropdown_index = dropdown_index_from_point(x, y, w); - if (dropdown_index == -1)goto dropdown_cleanup; + if (dropdown_index == -1) { + goto dropdown_cleanup; + } - // _dropdown_unknown?? highlighted? - if (dropdown_index < 64 && gDropdownItemsDisabled & (1ULL << dropdown_index))goto dropdown_cleanup; + if (dropdown_index < 64 && gDropdownItemsDisabled & (1ULL << dropdown_index)) { + goto dropdown_cleanup; + } - // gDropdownItemsFormat[dropdown_index] will not work until all windows that use dropdown decompiled - if (RCT2_ADDRESS(0x9DEBA4, uint16)[dropdown_index] == 0)goto dropdown_cleanup; + if (gDropdownItemsFormat[dropdown_index] == 0) { + goto dropdown_cleanup; + } } else { if (cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex) @@ -1209,14 +1213,15 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi window_tooltip_show(STR_COLOUR_NAMES_START + dropdown_index, x, y); } - // _dropdown_unknown?? highlighted? - if (dropdown_index < 64 && gDropdownItemsDisabled & (1ULL << dropdown_index))return; + if (dropdown_index < 64 && gDropdownItemsDisabled & (1ULL << dropdown_index)) { + return; + } - // gDropdownItemsFormat[dropdown_index] will not work until all windows that use dropdown decompiled - if (RCT2_ADDRESS(0x9DEBA4, uint16)[dropdown_index] == 0)return; + if (gDropdownItemsFormat[dropdown_index] == 0) { + return; + } - // _dropdown_highlighted_index - RCT2_GLOBAL(0x009DEBA2, sint16) = dropdown_index; + gDropdownHighlightedIndex = dropdown_index; window_invalidate_by_class(WC_DROPDOWN); } else { gDropdownLastColourHover = -1; diff --git a/src/windows/banner.c b/src/windows/banner.c index a8bba69e64..6ff97c3bb4 100644 --- a/src/windows/banner.c +++ b/src/windows/banner.c @@ -239,7 +239,7 @@ static void window_banner_mousedown(int widgetIndex, rct_window*w, rct_widget* w 13, widget->right - widget->left - 3); - gDropdownItemsChecked = 1 << (banner->text_colour - 1); + dropdown_set_checked(banner->text_colour - 1, true); break; } } diff --git a/src/windows/dropdown.c b/src/windows/dropdown.c index cce9070f9f..c8347f0337 100644 --- a/src/windows/dropdown.c +++ b/src/windows/dropdown.c @@ -47,16 +47,38 @@ int _dropdown_num_columns; int _dropdown_num_rows; int _dropdown_item_width; int _dropdown_item_height; -int _dropdown_highlighted_index; int gDropdownNumItems; uint16 gDropdownItemsFormat[64]; sint64 gDropdownItemsArgs[64]; -// Replaces 0x009DED38 uint64 gDropdownItemsChecked; uint64 gDropdownItemsDisabled; bool gDropdownIsColour; int gDropdownLastColourHover; +int gDropdownHighlightedIndex; + +bool dropdown_is_checked(int index) +{ + return gDropdownItemsChecked & (1ULL << index); +} + +void dropdown_set_checked(int index, bool value) +{ + if (value) { + gDropdownItemsChecked |= 1ULL << index; + } else { + gDropdownItemsChecked &= ~(1ULL << index); + } +} + +void dropdown_set_disabled(int index, bool value) +{ + if (value) { + gDropdownItemsDisabled |= 1ULL << index; + } else { + gDropdownItemsDisabled &= ~(1ULL << index); + } +} static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi); @@ -178,18 +200,13 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo w->colours[0] = colour; // Input state - _dropdown_highlighted_index = -1; + gDropdownHighlightedIndex = -1; gDropdownItemsDisabled = 0; gDropdownItemsChecked = 0; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE; // Copy the following properties until all use of it is decompiled - RCT2_GLOBAL(0x009DEBA0, sint16) = gDropdownNumItems; - RCT2_GLOBAL(0x009DED44, sint32) = _dropdown_num_columns; - RCT2_GLOBAL(0x009DED48, sint32) = _dropdown_num_rows; - RCT2_GLOBAL(0x009DED40, sint32) = _dropdown_item_width; - RCT2_GLOBAL(0x009DED3C, sint32) = _dropdown_item_height; - RCT2_GLOBAL(0x009DEBA2, sint16) = _dropdown_highlighted_index; + gDropdownHighlightedIndex = gDropdownHighlightedIndex; gDropdownIsColour = false; } @@ -257,18 +274,13 @@ void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 fl w->colours[0] = colour; // Input state - _dropdown_highlighted_index = -1; + gDropdownHighlightedIndex = -1; gDropdownItemsDisabled = 0; gDropdownItemsChecked = 0; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE; // Copy the following properties until all use of it is decompiled - RCT2_GLOBAL(0x009DEBA0, sint16) = gDropdownNumItems; - RCT2_GLOBAL(0x009DED44, sint32) = _dropdown_num_columns; - RCT2_GLOBAL(0x009DED48, sint32) = _dropdown_num_rows; - RCT2_GLOBAL(0x009DED40, sint32) = _dropdown_item_width; - RCT2_GLOBAL(0x009DED3C, sint32) = _dropdown_item_height; - RCT2_GLOBAL(0x009DEBA2, sint16) = _dropdown_highlighted_index; + gDropdownHighlightedIndex = gDropdownHighlightedIndex; gDropdownIsColour = false; } @@ -283,7 +295,7 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) window_draw_widgets(w, dpi); - _dropdown_highlighted_index = RCT2_GLOBAL(0x009DEBA2, sint16); + gDropdownHighlightedIndex = gDropdownHighlightedIndex; for (int i = 0; i < gDropdownNumItems; i++) { cell_x = i % _dropdown_num_columns; cell_y = i / _dropdown_num_columns; @@ -306,7 +318,7 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) } } else { // - if (i == _dropdown_highlighted_index) { + if (i == gDropdownHighlightedIndex) { l = w->x + 2 + (cell_x * _dropdown_item_width); t = w->y + 2 + (cell_y * _dropdown_item_height); r = l + _dropdown_item_width - 1; @@ -318,7 +330,7 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) if (item == (uint16)-1 || item == (uint16)-2) { // Image item image = *((uint32*)&gDropdownItemsArgs[i]); - if (item == (uint16)-2 && _dropdown_highlighted_index == i) + if (item == (uint16)-2 && gDropdownHighlightedIndex == i) image++; gfx_draw_sprite( @@ -329,13 +341,15 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) ); } else { // Text item - if (i < 64) - if (gDropdownItemsChecked & (1ULL << i)) + if (i < 64) { + if (dropdown_is_checked(i)) { item++; + } + } // Calculate colour colour = w->colours[0] & 0x7F; - if (i == _dropdown_highlighted_index) + if (i == gDropdownHighlightedIndex) colour = 2; if (gDropdownItemsDisabled & (1ULL << i)) if (i < 64) @@ -358,7 +372,8 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) /* New function based on 6e914e * returns -1 if index is invalid */ -int dropdown_index_from_point(int x, int y, rct_window* w){ +int dropdown_index_from_point(int x, int y, rct_window *w) +{ int top = y - w->y - 2; if (top < 0) return -1; @@ -367,20 +382,14 @@ int dropdown_index_from_point(int x, int y, rct_window* w){ left -= 2; if (left < 0) return -1; - // _dropdown_item_width - int column_no = left / RCT2_GLOBAL(0x009DED40, sint32); - // _dropdown_no_columns - if (column_no >= RCT2_GLOBAL(0x009DED44, sint32)) return -1; - - // _dropdown_item_height - int row_no = top / RCT2_GLOBAL(0x9DED3C, uint8); - // _dropdown_no_rows - if (row_no >= RCT2_GLOBAL(0x009DED48, sint32)) return -1; + int column_no = left / _dropdown_item_width; + if (column_no >= _dropdown_num_columns) return -1; - // _dropdown_no_columns - int dropdown_index = row_no * RCT2_GLOBAL(0x009DED44, sint32) + column_no; - // _dropdown_no_items - if (dropdown_index >= RCT2_GLOBAL(0x009DEBA0, sint16)) return -1; + int row_no = top / _dropdown_item_height; + if (row_no >= _dropdown_num_rows) return -1; + + int dropdown_index = row_no * _dropdown_num_columns + column_no; + if (dropdown_index >= gDropdownNumItems) return -1; return dropdown_index; } @@ -413,7 +422,7 @@ void window_dropdown_show_colour_available(rct_window *w, rct_widget *widget, ui for (i = 0; i < 32; i++) { if (availableColours & (1 << i)) { if (selectedColour == i) - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; gDropdownItemsFormat[i] = 0xFFFE; gDropdownItemsArgs[i] = ((uint64)i << 32) | (0x20000000 | (i << 19) | 5059); diff --git a/src/windows/dropdown.h b/src/windows/dropdown.h index fbaee52ee4..5096e2ae92 100644 --- a/src/windows/dropdown.h +++ b/src/windows/dropdown.h @@ -39,6 +39,10 @@ extern uint64 gDropdownItemsChecked; extern uint64 gDropdownItemsDisabled; extern bool gDropdownIsColour; extern int gDropdownLastColourHover; +extern int gDropdownHighlightedIndex; + +void dropdown_set_checked(int index, bool value); +void dropdown_set_disabled(int index, bool value); void window_dropdown_show_text(int x, int y, int extray, uint8 colour, uint8 flags, int num_items); void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colour, uint8 flags, int num_items, int width); diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index fd67695778..1712de45fd 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -496,7 +496,7 @@ static void window_editor_objective_options_show_objective_dropdown(rct_window * objectiveType = RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8); for (i = 0; i < numItems; i++) { if (gDropdownItemsArgs[i] - STR_OBJECTIVE_DROPDOWN_NONE == objectiveType) { - gDropdownItemsChecked = (1 << i); + dropdown_set_checked(i, true); break; } } @@ -522,7 +522,7 @@ static void window_editor_objective_options_show_climate_dropdown(rct_window *w) 4, dropdownWidget->right - dropdownWidget->left - 3 ); - gDropdownItemsChecked = (1 << RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, uint8)); + dropdown_set_checked(RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, uint8), true); } static void window_editor_objective_options_show_category_dropdown(rct_window *w) @@ -546,7 +546,7 @@ static void window_editor_objective_options_show_category_dropdown(rct_window *w 5, dropdownWidget->right - dropdownWidget->left - 3 ); - gDropdownItemsChecked = (1 << s6Info->category); + dropdown_set_checked(s6Info->category, true); } static void window_editor_objective_options_arg_1_increase(rct_window *w) diff --git a/src/windows/editor_scenario_options.c b/src/windows/editor_scenario_options.c index bb6c71fa4f..24ee1454e4 100644 --- a/src/windows/editor_scenario_options.c +++ b/src/windows/editor_scenario_options.c @@ -1035,7 +1035,7 @@ static void window_editor_scenario_options_park_mousedown(int widgetIndex, rct_w dropdownWidget->right - dropdownWidget->left - 3 ); - gDropdownItemsChecked = 1 << (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY ? 0 : 1); + dropdown_set_checked((RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY ? 0 : 1), true); break; } } diff --git a/src/windows/finances.c b/src/windows/finances.c index b61e436346..11ad495297 100644 --- a/src/windows/finances.c +++ b/src/windows/finances.c @@ -1298,7 +1298,7 @@ static void window_finances_research_mousedown(int widgetIndex, rct_window *w, r ); int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8); - gDropdownItemsChecked = (1 << currentResearchLevel); + dropdown_set_checked(currentResearchLevel, true); } /** diff --git a/src/windows/guest_list.c b/src/windows/guest_list.c index 3f3bd0cd2f..d1b097b92b 100644 --- a/src/windows/guest_list.c +++ b/src/windows/guest_list.c @@ -352,7 +352,7 @@ static void window_guest_list_mousedown(int widgetIndex, rct_window*w, rct_widge gDropdownItemsFormat[i] = 1142; gDropdownItemsArgs[i] = STR_PAGE_1 + i; } - gDropdownItemsChecked = (1 << _window_guest_list_selected_view); + dropdown_set_checked(_window_guest_list_selected_view, true); break; case WIDX_INFO_TYPE_DROPDOWN_BUTTON: widget = &w->widgets[widgetIndex - 1]; @@ -372,7 +372,7 @@ static void window_guest_list_mousedown(int widgetIndex, rct_window*w, rct_widge widget->right - widget->left - 3 ); - gDropdownItemsChecked = (1 << _window_guest_list_selected_view); + dropdown_set_checked(_window_guest_list_selected_view, true); break; } } diff --git a/src/windows/land.c b/src/windows/land.c index 94f9e4200b..82cb1e99cd 100644 --- a/src/windows/land.c +++ b/src/windows/land.c @@ -222,7 +222,7 @@ static void window_land_mousedown(int widgetIndex, rct_window*w, rct_widget* wid gDropdownItemsFormat[i] = -1; gDropdownItemsArgs[i] = SPR_FLOOR_TEXTURE_GRASS + window_land_floor_texture_order[i]; if (window_land_floor_texture_order[i] == _selectedFloorTexture) - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; } window_dropdown_show_image( w->x + widget->left, w->y + widget->top, @@ -239,7 +239,7 @@ static void window_land_mousedown(int widgetIndex, rct_window*w, rct_widget* wid gDropdownItemsFormat[i] = -1; gDropdownItemsArgs[i] = SPR_WALL_TEXTURE_ROCK + window_land_wall_texture_order[i]; if (window_land_wall_texture_order[i] == _selectedWallTexture) - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; } window_dropdown_show_image( w->x + widget->left, w->y + widget->top, @@ -268,7 +268,7 @@ static void window_land_dropdown(rct_window *w, int widgetIndex, int dropdownInd switch (widgetIndex) { case WIDX_FLOOR: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; type = (dropdownIndex == -1) ? _selectedFloorTexture : @@ -284,7 +284,7 @@ static void window_land_dropdown(rct_window *w, int widgetIndex, int dropdownInd break; case WIDX_WALL: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; type = (dropdownIndex == -1) ? _selectedWallTexture : diff --git a/src/windows/mapgen.c b/src/windows/mapgen.c index e641556f2c..87d9fe573e 100644 --- a/src/windows/mapgen.c +++ b/src/windows/mapgen.c @@ -536,7 +536,7 @@ static void window_mapgen_base_mousedown(int widgetIndex, rct_window *w, rct_wid gDropdownItemsFormat[i] = -1; gDropdownItemsArgs[i] = SPR_FLOOR_TEXTURE_GRASS + window_land_floor_texture_order[i]; if (window_land_floor_texture_order[i] == _floorTexture) - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; } window_dropdown_show_image( w->x + widget->left, w->y + widget->top, @@ -553,7 +553,7 @@ static void window_mapgen_base_mousedown(int widgetIndex, rct_window *w, rct_wid gDropdownItemsFormat[i] = -1; gDropdownItemsArgs[i] = SPR_WALL_TEXTURE_ROCK + window_land_wall_texture_order[i]; if (window_land_wall_texture_order[i] == _wallTexture) - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; } window_dropdown_show_image( w->x + widget->left, w->y + widget->top, @@ -575,7 +575,7 @@ static void window_mapgen_base_dropdown(rct_window *w, int widgetIndex, int drop switch (widgetIndex) { case WIDX_FLOOR_TEXTURE: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; type = (dropdownIndex == -1) ? _floorTexture : @@ -591,7 +591,7 @@ static void window_mapgen_base_dropdown(rct_window *w, int widgetIndex, int drop break; case WIDX_WALL_TEXTURE: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; type = (dropdownIndex == -1) ? _wallTexture : @@ -859,7 +859,7 @@ static void window_mapgen_simplex_mousedown(int widgetIndex, rct_window *w, rct_ gDropdownItemsFormat[i] = -1; gDropdownItemsArgs[i] = SPR_FLOOR_TEXTURE_GRASS + window_land_floor_texture_order[i]; if (window_land_floor_texture_order[i] == _floorTexture) - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; } window_dropdown_show_image( w->x + widget->left, w->y + widget->top, @@ -876,7 +876,7 @@ static void window_mapgen_simplex_mousedown(int widgetIndex, rct_window *w, rct_ gDropdownItemsFormat[i] = -1; gDropdownItemsArgs[i] = SPR_WALL_TEXTURE_ROCK + window_land_wall_texture_order[i]; if (window_land_wall_texture_order[i] == _wallTexture) - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; } window_dropdown_show_image( w->x + widget->left, w->y + widget->top, @@ -898,7 +898,7 @@ static void window_mapgen_simplex_dropdown(rct_window *w, int widgetIndex, int d switch (widgetIndex) { case WIDX_SIMPLEX_FLOOR_TEXTURE: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; type = (dropdownIndex == -1) ? _floorTexture : @@ -915,7 +915,7 @@ static void window_mapgen_simplex_dropdown(rct_window *w, int widgetIndex, int d break; case WIDX_SIMPLEX_WALL_TEXTURE: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; type = (dropdownIndex == -1) ? _wallTexture : diff --git a/src/windows/options.c b/src/windows/options.c index 301843995c..5567922add 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -715,8 +715,9 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, gNumResolutions); - if (selectedResolution != -1 && selectedResolution < 32) - gDropdownItemsChecked = 1 << selectedResolution; + if (selectedResolution != -1 && selectedResolution < 32) { + dropdown_set_checked(selectedResolution, true); + } } break; @@ -730,7 +731,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, 3); - gDropdownItemsChecked = 1 << gConfigGeneral.fullscreen_mode; + dropdown_set_checked(gConfigGeneral.fullscreen_mode, true); break; case WIDX_CONSTRUCTION_MARKER_DROPDOWN: gDropdownItemsFormat[0] = 1142; @@ -740,7 +741,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, 2); - gDropdownItemsChecked = 1 << gConfigGeneral.construction_marker_colour; + dropdown_set_checked(gConfigGeneral.construction_marker_colour, true); break; } break; @@ -755,7 +756,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, 2); - gDropdownItemsChecked = gConfigGeneral.show_height_as_units ? 1 : 2; + dropdown_set_checked(gConfigGeneral.show_height_as_units ? 1 : 2, true); break; case WIDX_CURRENCY_DROPDOWN: num_items = 10; @@ -767,7 +768,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, num_items); - gDropdownItemsChecked = 1 << gConfigGeneral.currency_format; + dropdown_set_checked(gConfigGeneral.currency_format, true); break; case WIDX_DISTANCE_DROPDOWN: gDropdownItemsFormat[0] = 1142; @@ -777,7 +778,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, 2); - gDropdownItemsChecked = 1 << gConfigGeneral.measurement_format; + dropdown_set_checked(gConfigGeneral.measurement_format, true); break; case WIDX_TEMPERATURE_DROPDOWN: gDropdownItemsFormat[0] = 1142; @@ -787,7 +788,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, 2); - gDropdownItemsChecked = 1 << gConfigGeneral.temperature_format; + dropdown_set_checked(gConfigGeneral.temperature_format, true); break; case WIDX_LANGUAGE_DROPDOWN: for (i = 1; i < LANGUAGE_COUNT; i++) { @@ -795,7 +796,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* gDropdownItemsArgs[i - 1] = (sint32)LanguagesDescriptors[i].native_name; } window_options_show_dropdown(w, widget, LANGUAGE_COUNT - 1); - gDropdownItemsChecked = 1 << (gCurrentLanguage - 1); + dropdown_set_checked(gCurrentLanguage - 1, true); break; case WIDX_DATE_FORMAT_DROPDOWN: for (i = 0; i < 4; i++) { @@ -803,7 +804,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* gDropdownItemsArgs[i] = DateFormatStringIds[i]; } window_options_show_dropdown(w, widget, 4); - gDropdownItemsChecked = 1 << (gConfigGeneral.date_format); + dropdown_set_checked(gConfigGeneral.date_format, true); break; } break; @@ -821,7 +822,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, gAudioDeviceCount); - gDropdownItemsChecked |= (1 << RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32)); + dropdown_set_checked(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32), true); break; case WIDX_TITLE_MUSIC_DROPDOWN: num_items = 4; @@ -836,7 +837,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, num_items); - gDropdownItemsChecked = 1 << gConfigSound.title_music; + dropdown_set_checked(gConfigSound.title_music, true); break; } break; @@ -866,10 +867,11 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* widget->right - widget->left - 3 ); - if (gCurrentTheme == 0 || gCurrentTheme == 1) - gDropdownItemsChecked = 1 << (gCurrentTheme ^ 1); - else - gDropdownItemsChecked = 1 << (gCurrentTheme); + if (gCurrentTheme == 0 || gCurrentTheme == 1) { + dropdown_set_checked(gCurrentTheme ^ 1, true); + } else { + dropdown_set_checked(gCurrentTheme, true); + } break; } break; @@ -883,7 +885,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* } window_options_show_dropdown(w, widget, AUTOSAVE_NEVER + 1); - gDropdownItemsChecked = 1 << gConfigGeneral.autosave_frequency; + dropdown_set_checked(gConfigGeneral.autosave_frequency, true); break; case WIDX_TITLE_SEQUENCE_DROPDOWN: num_items = gConfigTitleSequences.num_presets; @@ -903,7 +905,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* widget->right - widget->left - 3 ); - gDropdownItemsChecked = 1 << (gCurrentPreviewTitleSequence); + dropdown_set_checked(gCurrentPreviewTitleSequence, true); break; } break; diff --git a/src/windows/park.c b/src/windows/park.c index 230160f55e..c4d4e0998d 100644 --- a/src/windows/park.c +++ b/src/windows/park.c @@ -689,11 +689,11 @@ static void window_park_entrance_mousedown(int widgetIndex, rct_window*w, rct_wi ); if (park_is_open()) { - RCT2_GLOBAL(0x009DEBA2, sint16) = 0; - gDropdownItemsChecked |= (1 << 1); + gDropdownHighlightedIndex = 0; + dropdown_set_checked(1, true); } else { - RCT2_GLOBAL(0x009DEBA2, sint16) = 1; - gDropdownItemsChecked |= (1 << 0); + gDropdownHighlightedIndex = 1; + dropdown_set_checked(0, true); } } } @@ -706,7 +706,7 @@ static void window_park_entrance_dropdown(rct_window *w, int widgetIndex, int dr { if (widgetIndex == WIDX_OPEN_OR_CLOSE) { if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; if (dropdownIndex != 0) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = 1724; diff --git a/src/windows/research.c b/src/windows/research.c index b888096b81..c58ce270ec 100644 --- a/src/windows/research.c +++ b/src/windows/research.c @@ -465,7 +465,7 @@ static void window_research_funding_mousedown(int widgetIndex, rct_window *w, rc ); int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8); - gDropdownItemsChecked = (1 << currentResearchLevel); + dropdown_set_checked(currentResearchLevel, true); } /** diff --git a/src/windows/ride.c b/src/windows/ride.c index d6a99ea1cb..f757342726 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -1769,7 +1769,7 @@ static void window_ride_show_view_dropdown(rct_window *w, rct_widget *widget) } // Set checked item - gDropdownItemsChecked |= (1 << w->ride.view); + dropdown_set_checked(w->ride.view, true); } /** @@ -1844,8 +1844,8 @@ static void window_ride_show_open_dropdown(rct_window *w, rct_widget *widget) highlightedIndex--; } - gDropdownItemsChecked |= (1 << checkedIndex); - RCT2_GLOBAL(0x009DEBA2, sint16) = highlightedIndex; + dropdown_set_checked(checkedIndex, true); + gDropdownHighlightedIndex = highlightedIndex; } /** @@ -1892,7 +1892,7 @@ static void window_ride_main_dropdown(rct_window *w, int widgetIndex, int dropdo break; case WIDX_OPEN: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; ride = GET_RIDE(w->number); if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_NO_TEST_MODE) && dropdownIndex != 0) @@ -2380,7 +2380,7 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi widget->right - dropdownWidget->left ); - gDropdownItemsChecked = (1ULL << selectedIndex); + dropdown_set_checked(selectedIndex, true); break; case WIDX_VEHICLE_TRAINS_DROPDOWN: window_dropdown_show_text_custom_width( @@ -2399,7 +2399,7 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi gDropdownItemsArgs[i] = ((i + 1) << 16) | (i == 0 ? stringId : stringId + 1); } - gDropdownItemsChecked = (1 << (ride->num_vehicles - 1)); + dropdown_set_checked(ride->num_vehicles - 1, true); break; case WIDX_VEHICLE_CARS_PER_TRAIN_DROPDOWN: minCars = (ride->min_max_cars_per_train >> 4); @@ -2425,7 +2425,7 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi gDropdownItemsArgs[i] |= (cars - rideEntry->zero_cars) << 16; } - gDropdownItemsChecked = (1 << (ride->num_cars_per_train - minCars)); + dropdown_set_checked(ride->num_cars_per_train - minCars, true); break; } } @@ -2820,9 +2820,11 @@ static void window_ride_mode_dropdown(rct_window *w, rct_widget *widget) ); // Set checked item - for (i = 0; i < numAvailableModes; i++) - if (ride->mode == availableModes[i]) - gDropdownItemsChecked = 1 << i; + for (i = 0; i < numAvailableModes; i++) { + if (ride->mode == availableModes[i]) { + dropdown_set_checked(i, true); + } + } } /** @@ -2851,7 +2853,7 @@ static void window_ride_load_dropdown(rct_window *w, rct_widget *widget) widget->right - dropdownWidget->left ); - gDropdownItemsChecked = (1 << (ride->depart_flags & RIDE_DEPART_WAIT_FOR_LOAD_MASK)); + dropdown_set_checked(ride->depart_flags & RIDE_DEPART_WAIT_FOR_LOAD_MASK, true); } /** @@ -3366,7 +3368,7 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc widget->right - dropdownWidget->left ); - gDropdownItemsChecked = (1 << ride->inspection_interval); + dropdown_set_checked(ride->inspection_interval, true); break; case WIDX_FORCE_BREAKDOWN: @@ -3411,7 +3413,7 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc continue; } if (i == breakdownReason) { - gDropdownItemsChecked = (1 << num_items); + dropdown_set_checked(num_items, true); break; } gDropdownItemsFormat[num_items] = 1142; @@ -3813,7 +3815,7 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid widget->right - dropdownWidget->left ); - gDropdownItemsChecked = 1 << colourSchemeIndex; + dropdown_set_checked(colourSchemeIndex, true); break; case WIDX_TRACK_MAIN_COLOUR: window_dropdown_show_colour(w, widget, w->colours[1], ride->track_colour_main[colourSchemeIndex]); @@ -3840,17 +3842,18 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid widget->right - dropdownWidget->left ); - gDropdownItemsChecked = 1 << ride->track_colour_supports[colourSchemeIndex]; + dropdown_set_checked(ride->track_colour_supports[colourSchemeIndex], true); break; - case WIDX_ENTRANCE_STYLE_DROPDOWN: + case WIDX_ENTRANCE_STYLE_DROPDOWN: for (i = 0; i < countof(window_ride_entrance_style_list); i++) { gDropdownItemsFormat[i] = 1142; gDropdownItemsArgs[i] = RideEntranceDefinitions[window_ride_entrance_style_list[i]].string_id; - if (ride->entrance_style == window_ride_entrance_style_list[i]) - gDropdownItemsChecked = 1 << i; + if (ride->entrance_style == window_ride_entrance_style_list[i]) { + dropdown_set_checked(i, true); + } } - int checked = gDropdownItemsChecked; + uint64 checked = gDropdownItemsChecked; window_dropdown_show_text_custom_width( w->x + dropdownWidget->left, @@ -3864,7 +3867,7 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid gDropdownItemsChecked = checked; break; - case WIDX_VEHICLE_COLOUR_SCHEME_DROPDOWN: + case WIDX_VEHICLE_COLOUR_SCHEME_DROPDOWN: for (i = 0; i < 3; i++) { gDropdownItemsFormat[i] = 1142; gDropdownItemsArgs[i] = (RideNameConvention[ride->type].vehicle_name << 16) | (STR_ALL_VEHICLES_IN_SAME_COLOURS + i); @@ -3880,7 +3883,7 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid widget->right - dropdownWidget->left ); - gDropdownItemsChecked = 1 << (ride->colour_scheme_type & 3); + dropdown_set_checked(ride->colour_scheme_type & 3, true); break; case WIDX_VEHICLE_COLOUR_INDEX_DROPDOWN: numItems = ride->num_vehicles; @@ -3903,7 +3906,7 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid widget->right - dropdownWidget->left ); - gDropdownItemsChecked = 1 << w->var_48C; + dropdown_set_checked(w->var_48C, true); break; case WIDX_VEHICLE_MAIN_COLOUR: vehicleColour = ride_get_vehicle_colour(ride, w->var_48C); @@ -4452,8 +4455,9 @@ static void window_ride_music_mousedown(int widgetIndex, rct_window *w, rct_widg ); for (i = 0; i < numItems; i++) { - if (window_ride_current_music_style_order[i] == ride->music) - gDropdownItemsChecked = (1 << i); + if (window_ride_current_music_style_order[i] == ride->music) { + dropdown_set_checked(i, true); + } } } @@ -4702,7 +4706,7 @@ static void window_ride_measurements_mousedown(int widgetIndex, rct_window *w, r 0, 2 ); - RCT2_GLOBAL(0x009DEBA2, sint16) = 0; + gDropdownHighlightedIndex = 0; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) gDropdownItemsDisabled |= 2; } @@ -4717,7 +4721,7 @@ static void window_ride_measurements_dropdown(rct_window *w, int widgetIndex, in return; if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + dropdownIndex = gDropdownHighlightedIndex; if (dropdownIndex == 0) save_track_design((uint8)w->number); diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 91d47ad76f..6257ecf9ad 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -3161,7 +3161,7 @@ static void window_ride_construction_show_special_track_dropdown(rct_window *w, } gDropdownItemsFormat[i] = trackPieceStringId; if ((trackPiece | 0x100) == _currentTrackCurve) { - RCT2_GLOBAL(0x009DEBA2, sint16) = i; + gDropdownHighlightedIndex = i; } } diff --git a/src/windows/ride_list.c b/src/windows/ride_list.c index 873a93c76e..ae3cf98b2d 100644 --- a/src/windows/ride_list.c +++ b/src/windows/ride_list.c @@ -263,7 +263,7 @@ static void window_ride_list_mousedown(int widgetIndex, rct_window*w, rct_widget numItems, widget->right - widget->left - 3 ); - gDropdownItemsChecked |= (1 << _window_ride_list_information_type); + dropdown_set_checked(_window_ride_list_information_type, true); } } diff --git a/src/windows/staff.c b/src/windows/staff.c index 423564f341..4b306cf126 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -532,7 +532,7 @@ void window_staff_overview_mousedown(int widgetIndex, rct_window* w, rct_widget* int y = widget->top + w->y; int extray = widget->bottom - widget->top + 1; window_dropdown_show_text(x, y, extray, w->colours[1], 0, 2); - RCT2_GLOBAL(0x009DEBA2, sint16) = 0; + gDropdownHighlightedIndex = 0; rct_peep* peep = GET_PEEP(w->number); diff --git a/src/windows/themes.c b/src/windows/themes.c index 3c51d80887..94b04f68a9 100644 --- a/src/windows/themes.c +++ b/src/windows/themes.c @@ -552,10 +552,11 @@ static void window_themes_mousedown(int widgetIndex, rct_window* w, rct_widget* widget->right - widget->left - 3 ); - if (gCurrentTheme == 0 || gCurrentTheme == 1) - gDropdownItemsChecked = 1 << (gCurrentTheme ^ 1); - else - gDropdownItemsChecked = 1 << (gCurrentTheme); + if (gCurrentTheme == 0 || gCurrentTheme == 1) { + dropdown_set_checked(gCurrentTheme ^ 1, true); + } else { + dropdown_set_checked(gCurrentTheme, true); + } break; case WIDX_THEMES_RCT1_RIDE_LIGHTS: if (gCurrentTheme >= 2) { diff --git a/src/windows/title_command_editor.c b/src/windows/title_command_editor.c index 54e74ce8ee..7fb1c66aca 100644 --- a/src/windows/title_command_editor.c +++ b/src/windows/title_command_editor.c @@ -322,7 +322,7 @@ static void window_title_command_editor_mousedown(int widgetIndex, rct_window* w widget->right - widget->left - 3 ); - gDropdownItemsChecked = 1 << get_command_info_index(command.command); + dropdown_set_checked(get_command_info_index(command.command), true); break; case WIDX_INPUT_DROPDOWN: if (command.command == TITLE_SCRIPT_SPEED) { @@ -342,7 +342,7 @@ static void window_title_command_editor_mousedown(int widgetIndex, rct_window* w widget->right - widget->left - 3 ); - gDropdownItemsChecked = 1 << (command.speed - 1); + dropdown_set_checked(command.speed - 1, true); } else if (command.command == TITLE_SCRIPT_LOAD) { num_items = gConfigTitleSequences.presets[gCurrentTitleSequence].num_saves; @@ -361,7 +361,7 @@ static void window_title_command_editor_mousedown(int widgetIndex, rct_window* w widget->right - widget->left - 3 ); - gDropdownItemsChecked = 1 << (command.saveIndex); + dropdown_set_checked(command.saveIndex, true); } break; } diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index feb68f79e0..5832f8c17d 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -587,7 +587,7 @@ static void window_title_editor_mousedown(int widgetIndex, rct_window* w, rct_wi widget->right - widget->left - 3 ); - gDropdownItemsChecked = 1 << (gCurrentTitleSequence); + dropdown_set_checked(gCurrentTitleSequence, true); } break; } diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 868068e110..1b01e3361f 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -411,8 +411,9 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg ); #ifndef DISABLE_TWITCH - if (_menuDropdownIncludesTwitch && gTwitchEnable) - gDropdownItemsChecked |= (1 << 11); + if (_menuDropdownIncludesTwitch && gTwitchEnable) { + dropdown_set_checked(11, true); + } #endif break; case WIDX_CHEATS: @@ -433,12 +434,15 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg 0, 5 ); - if (gCheatsSandboxMode) - gDropdownItemsChecked |= (1 << DDIDX_ENABLE_SANDBOX_MODE); - if (gCheatsDisableClearanceChecks) - gDropdownItemsChecked |= (1 << DDIDX_DISABLE_CLEARANCE_CHECKS); - if (gCheatsDisableSupportLimits) - gDropdownItemsChecked |= (1 << DDIDX_DISABLE_SUPPORT_LIMITS); + if (gCheatsSandboxMode) { + dropdown_set_checked(DDIDX_ENABLE_SANDBOX_MODE, true); + } + if (gCheatsDisableClearanceChecks) { + dropdown_set_checked(DDIDX_DISABLE_CLEARANCE_CHECKS, true); + } + if (gCheatsDisableSupportLimits) { + dropdown_set_checked(DDIDX_DISABLE_SUPPORT_LIMITS, true); + } RCT2_GLOBAL(0x009DEBA2, uint16) = 0; break; case WIDX_VIEW_MENU: @@ -2844,10 +2848,12 @@ void top_toolbar_init_fastforward_menu(rct_window* w, rct_widget* widget) { ); // Set checkmarks - if (gGameSpeed <= 4) - gDropdownItemsChecked |= (1 << (gGameSpeed - 1)); - if (gGameSpeed == 8) - gDropdownItemsChecked |= (1 << 5); + if (gGameSpeed <= 4) { + dropdown_set_checked(gGameSpeed - 1, true); + } + if (gGameSpeed == 8) { + dropdown_set_checked(5, true); + } if (gConfigGeneral.debugging_tools) RCT2_GLOBAL(0x9DEBA2, uint16) = (gGameSpeed == 8 ? 0 : gGameSpeed); @@ -3011,25 +3017,25 @@ void top_toolbar_init_view_menu(rct_window* w, rct_widget* widget) { // Set checkmarks rct_viewport* mainViewport = window_get_main()->viewport; if (mainViewport->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE) - gDropdownItemsChecked |= (1 << 0); + dropdown_set_checked(0, true); if (mainViewport->flags & VIEWPORT_FLAG_HIDE_BASE) - gDropdownItemsChecked |= (1 << 1); + dropdown_set_checked(1, true); if (mainViewport->flags & VIEWPORT_FLAG_HIDE_VERTICAL) - gDropdownItemsChecked |= (1 << 2); + dropdown_set_checked(2, true); if (mainViewport->flags & VIEWPORT_FLAG_SEETHROUGH_RIDES) - gDropdownItemsChecked |= (1 << 4); + dropdown_set_checked(4, true); if (mainViewport->flags & VIEWPORT_FLAG_SEETHROUGH_SCENERY) - gDropdownItemsChecked |= (1 << 5); + dropdown_set_checked(5, true); if (mainViewport->flags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS) - gDropdownItemsChecked |= (1 << 6); + dropdown_set_checked(6, true); if (mainViewport->flags & VIEWPORT_FLAG_INVISIBLE_PEEPS) - gDropdownItemsChecked |= (1 << 7); + dropdown_set_checked(7, true); if (mainViewport->flags & VIEWPORT_FLAG_LAND_HEIGHTS) - gDropdownItemsChecked |= (1 << 9); + dropdown_set_checked(9, true); if (mainViewport->flags & VIEWPORT_FLAG_TRACK_HEIGHTS) - gDropdownItemsChecked |= (1 << 10); + dropdown_set_checked(10, true); if (mainViewport->flags & VIEWPORT_FLAG_PATH_HEIGHTS) - gDropdownItemsChecked |= (1 << 11); + dropdown_set_checked(11, true); RCT2_GLOBAL(0x9DEBA2, uint16) = 0; } From 0442f08aae7d403c499ad93a62b1c1d394bc0117 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 14 Oct 2015 21:16:10 +0100 Subject: [PATCH 0826/1173] remove redundant dropdown assignment --- src/windows/dropdown.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/windows/dropdown.c b/src/windows/dropdown.c index c8347f0337..a593e4c69f 100644 --- a/src/windows/dropdown.c +++ b/src/windows/dropdown.c @@ -203,11 +203,8 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo gDropdownHighlightedIndex = -1; gDropdownItemsDisabled = 0; gDropdownItemsChecked = 0; - RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE; - - // Copy the following properties until all use of it is decompiled - gDropdownHighlightedIndex = gDropdownHighlightedIndex; gDropdownIsColour = false; + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = INPUT_STATE_DROPDOWN_ACTIVE; } /** From 31e6942ff09c452256dcbe4378cd261896b8a2fb Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Thu, 15 Oct 2015 21:03:29 +0100 Subject: [PATCH 0827/1173] Fix #1761. Issue caused by or = instead of != --- src/world/footpath.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/world/footpath.c b/src/world/footpath.c index ac0422851d..bbf281036e 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -1413,9 +1413,9 @@ static void footpath_unown(int x, int y, rct_map_element *pathElement) int ownershipUnk = 0; int z = pathElement->base_height; rct_map_element *surfaceElement = map_get_surface_element_at(x >> 5, y >> 5); - if (surfaceElement->base_height |= z) { + if (surfaceElement->base_height != z) { z -= 2; - if (surfaceElement->base_height |= z) { + if (surfaceElement->base_height != z) { ownershipUnk = (surfaceElement->properties.surface.ownership & 0xCF) >> 4; } } From ee1e71f287fa30292c0a5ee773deef6c0ff9bd7f Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Thu, 15 Oct 2015 22:16:27 +0100 Subject: [PATCH 0828/1173] Fix loadlandscape breaking enabled tabs Issue was caused by not calling sub_6DFED0 when loading the landscape. I assume in vanilla this would happen as part of the loading but due to the way loadsave now works it doesn't happen. In the process I also labelled the offset for editor step. --- src/editor.c | 8 ++++---- src/interface/viewport_interaction.c | 5 +++-- src/rct1.c | 3 ++- src/ride/ride.c | 3 ++- src/scenario.h | 2 +- src/scenario_list.c | 2 +- src/windows/editor_bottom_toolbar.c | 7 +++++-- src/windows/loadsave.c | 4 ++-- 8 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/editor.c b/src/editor.c index 1736aa42c9..991ec7fe4b 100644 --- a/src/editor.c +++ b/src/editor.c @@ -160,7 +160,7 @@ void editor_convert_save_to_scenario() } RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_SCENARIO_EDITOR; - s6Info->var_000 = 4; + s6Info->editor_step = EDITOR_STEP_OBJECTIVE_SELECTION; s6Info->category = SCENARIO_CATEGORY_BUILDYOUROWN; viewport_init_all(); news_item_init_queue(); @@ -347,10 +347,10 @@ static int editor_read_s6(const char *path) // Read second chunk sawyercoding_read_chunk(rw, (uint8*)s6Info); - if (s6Info->var_000 == 255) - s6Info->var_000 = 1; + if (s6Info->editor_step == 255) + s6Info->editor_step = EDITOR_STEP_LANDSCAPE_EDITOR; } else { - s6Info->var_000 = 1; + s6Info->editor_step = EDITOR_STEP_LANDSCAPE_EDITOR; s6Info->category = SCENARIO_CATEGORY_BUILDYOUROWN; format_string(s6Info->details, STR_NO_DETAILS_YET, NULL); } diff --git a/src/interface/viewport_interaction.c b/src/interface/viewport_interaction.c index 8d570cacec..7f95d9e53a 100644 --- a/src/interface/viewport_interaction.c +++ b/src/interface/viewport_interaction.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "../addresses.h" +#include "../editor.h" #include "../game.h" #include "../localisation/localisation.h" #include "../ride/ride.h" @@ -56,7 +57,7 @@ int viewport_interaction_get_item_left(int x, int y, viewport_interaction_info * return info->type = VIEWPORT_INTERACTION_ITEM_NONE; // - if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) && s6Info->var_000 != 6) + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) && s6Info->editor_step != EDITOR_STEP_ROLLERCOASTER_DESIGNER) return info->type = VIEWPORT_INTERACTION_ITEM_NONE; rct_xy16 mapCoord = { 0 }; @@ -179,7 +180,7 @@ int viewport_interaction_get_item_right(int x, int y, viewport_interaction_info return info->type = VIEWPORT_INTERACTION_ITEM_NONE; // - if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) && s6Info->var_000 != 6) + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) && s6Info->editor_step != EDITOR_STEP_ROLLERCOASTER_DESIGNER) return info->type = VIEWPORT_INTERACTION_ITEM_NONE; rct_xy16 mapCoord = { 0 }; diff --git a/src/rct1.c b/src/rct1.c index fc891c0a4c..e5c84f1e41 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -20,6 +20,7 @@ #include "addresses.h" #include "config.h" +#include "editor.h" #include "interface/viewport.h" #include "interface/window.h" #include "localisation/localisation.h" @@ -234,7 +235,7 @@ void rct1_fix_landscape() rct_s6_header *s6Header = (rct_s6_header*)0x009E34E4; rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; - s6Info->var_000 = 1; + s6Info->editor_step = EDITOR_STEP_LANDSCAPE_EDITOR; s6Info->category = 4; format_string(s6Info->details, STR_NO_DETAILS_YET, NULL); s6Info->name[0] = 0; diff --git a/src/ride/ride.c b/src/ride/ride.c index 062f904d96..8607cffec2 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -24,6 +24,7 @@ #include "../cheats.h" #include "../common.h" #include "../config.h" +#include "../editor.h" #include "../game.h" #include "../input.h" #include "../interface/window.h" @@ -1776,7 +1777,7 @@ void ride_update_all() // Remove all rides if scenario editor if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) { - if (s6Info->var_000 <= 2) + if (s6Info->editor_step <= EDITOR_STEP_INVENTIONS_LIST_SET_UP) FOR_ALL_RIDES(i, ride) ride->type = RIDE_TYPE_NULL; return; diff --git a/src/scenario.h b/src/scenario.h index 8e079c49b5..afc5f335b5 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -49,7 +49,7 @@ typedef struct { * size: 0x198 */ typedef struct { - uint8 var_000; + uint8 editor_step; uint8 category; // 0x01 uint8 objective_type; // 0x02 uint8 objective_arg_1; // 0x03 diff --git a/src/scenario_list.c b/src/scenario_list.c index adb08858e6..695c8c9208 100644 --- a/src/scenario_list.c +++ b/src/scenario_list.c @@ -89,7 +89,7 @@ static void scenario_list_add(const char *path) return; // Ignore scenarios where first header byte is not 255 - if (s6Info.var_000 != 255) + if (s6Info.editor_step != 255) return; // Check if scenario already exists in list, likely if in scores diff --git a/src/windows/editor_bottom_toolbar.c b/src/windows/editor_bottom_toolbar.c index 84c6979030..278820e9dc 100644 --- a/src/windows/editor_bottom_toolbar.c +++ b/src/windows/editor_bottom_toolbar.c @@ -119,6 +119,8 @@ static EMPTY_ARGS_VOID_POINTER *next_button_mouseup_events[] = { NULL }; +static void sub_6DFED0(); + /** * Creates the main editor top toolbar window. * rct2: 0x0066F052 (part of 0x0066EF38) @@ -140,6 +142,7 @@ void window_editor_bottom_toolbar_open() (1 << WIDX_NEXT_IMAGE); window_init_scroll_widgets(window); + sub_6DFED0(); } /** @@ -369,7 +372,7 @@ void window_editor_bottom_toolbar_jump_forward_to_save_scenario() } // - s6Info->var_000 = 255; + s6Info->editor_step = 255; // Ensure path has .SC6 extension path_set_extension(path, ".SC6"); @@ -388,7 +391,7 @@ void window_editor_bottom_toolbar_jump_forward_to_save_scenario() title_load(); } else { window_error_open(STR_SCENARIO_SAVE_FAILED, -1); - s6Info->var_000 = 4; + s6Info->editor_step = EDITOR_STEP_OBJECTIVE_SELECTION; } } diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 17622d1f1d..b3f584ac28 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -819,7 +819,7 @@ static void window_loadsave_select(rct_window *w, const char *path) rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; int parkFlagsBackup = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32); RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_18; - s6Info->var_000 = 255; + s6Info->editor_step = 255; rw = SDL_RWFromFile(path, "wb+"); int success = 0; if (rw != NULL) { @@ -834,7 +834,7 @@ static void window_loadsave_select(rct_window *w, const char *path) title_load(); } else { window_error_open(STR_SAVE_SCENARIO, STR_SCENARIO_SAVE_FAILED); - s6Info->var_000 = 4; + s6Info->editor_step = EDITOR_STEP_OBJECTIVE_SELECTION; } break; } From b959d13c6514934085dfb53a14d15c0079a0ea92 Mon Sep 17 00:00:00 2001 From: Andrew Waters Date: Thu, 15 Oct 2015 18:22:51 -0700 Subject: [PATCH 0829/1173] Add implementation of sub_69AF1E() --- src/localisation/string_ids.h | 5 + src/peep/peep.c | 245 +++++++++++++++++++++++++++++++++- src/peep/peep.h | 2 +- src/ride/ride.c | 88 +++++++++++- src/ride/ride.h | 7 + 5 files changed, 343 insertions(+), 4 deletions(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 75d5d689eb..82e4295f4a 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -868,6 +868,8 @@ enum { STR_EXIT = 1924, STR_RIDE_HAS_CRASHED = 1928, + STR_PEEP_TRACKING_NOTIFICATION_BOUGHT_X = 1936, + STR_SHOW_SUBJECT_TIP = 1937, STR_STAFF_OVERVIEW_TIP = 1939, @@ -1044,6 +1046,9 @@ enum { STR_SHOP_ITEM_PLURAL_ROAST_SAUSAGE = 2164, STR_SHOP_ITEM_PLURAL_EMPTY_BOWL_BLUE = 2165, + STR_SHOP_ITEM_INDEFINITE_PHOTO2 = 2166, + STR_SHOP_ITEM_INDEFINITE_PHOTO3 = 2167, + STR_SHOP_ITEM_INDEFINITE_PHOTO4 = 2168, STR_SHOP_ITEM_INDEFINITE_PRETZEL = 2169, STR_SHOP_ITEM_INDEFINITE_HOT_CHOCOLATE = 2170, STR_SHOP_ITEM_INDEFINITE_ICED_TEA = 2171, diff --git a/src/peep/peep.c b/src/peep/peep.c index c429bd551a..4bd1833fdb 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7772,13 +7772,254 @@ static void peep_on_enter_or_exit_ride(rct_peep *peep, int rideIndex, int flags) } } -/** +/** Main logic to decide whether a peep should buy an item in question + * + * Also handles the purchase as well, so once it returns, the peep will have the + * item and the money will have been deducted. + * + * eax: shopItem | (rideIndex << 8) + * ecx: price + * esi: *peep + * + * Returns 0 or 1 depending on if the peep decided to buy the item * * rct2: 0x0069AF1E */ static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price) { - return !(RCT2_CALLPROC_X(0x0069AF1E, shopItem | (rideIndex << 8), 0, price, 0, (int)peep, 0, 0) & 0x100); + rct_ride* ride = GET_RIDE(rideIndex); + money16 value; + + bool has_voucher = false; + + if ((peep->item_standard_flags & PEEP_ITEM_VOUCHER) && + (peep->voucher_type == VOUCHER_TYPE_FOOD_OR_DRINK_FREE) && + (peep->voucher_arguments == shopItem)) { + has_voucher = true; + } + + if (peep_has_item(peep, shopItem)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_ALREADY_GOT, shopItem); + return 0; + } + + if (shop_item_is_food_or_drink(shopItem)) { + int food = -1; + if (food = peep_has_food_standard_flag(peep)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_HAVENT_FINISHED, bitscanforward(food)); + return 0; + } else if (food = peep_has_food_extra_flag(peep)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_HAVENT_FINISHED, bitscanforward(food) + 32); + return 0; + } else if (peep->nausea >= 145) + return 0; + } + + if ((shopItem == SHOP_ITEM_BALLOON) || (shopItem == SHOP_ITEM_ICE_CREAM) + || (shopItem == SHOP_ITEM_COTTON_CANDY) || (shopItem == SHOP_ITEM_SUNGLASSES)) { + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, sint8) != 0) + return 0; + } + + if ((shopItem == SHOP_ITEM_SUNGLASSES) || (shopItem == SHOP_ITEM_ICE_CREAM)) { + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TEMPERATURE, sint8) < 12) + return 0; + } + + if (shop_item_is_food(shopItem) && (peep->hunger > 75)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_HUNGRY, 0xFF); + return 0; + } + + if (shop_item_is_drink(shopItem) && (peep->thirst > 75)) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_NOT_THIRSTY, 0xFF); + return 0; + } + + if ((shopItem == SHOP_ITEM_UMBRELLA) && (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, sint8) != 0)) + goto loc_69B119; + + if ((shopItem != SHOP_ITEM_MAP) && shop_item_is_souvenir(shopItem) && !has_voucher) { + if (((scenario_rand() & 0x7F) + 0x73) > peep->happiness) + return 0; + else if (peep->no_of_rides < 3) + return 0; + } + +loc_69B119: + if (!has_voucher) { + if (price != 0) { + if (peep->cash_in_pocket == 0) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SPENT_MONEY, 0xFF); + return 0; + } + if (price > peep->cash_in_pocket) { + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD, shopItem); + return 0; + } + } + + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TEMPERATURE, uint16) >= 21) + value = get_shop_hot_value(shopItem); + else if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TEMPERATURE, uint16) <= 11) + value = get_shop_cold_value(shopItem); + else + value = get_shop_base_value(shopItem); + + if (value < price) { + value -= price; + if (shopItem == SHOP_ITEM_UMBRELLA) { + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, sint8) != 0) + goto loc_69B221; + } + + value = -value; + if (peep->happiness >= 128) + value /= 2; + + if (peep->happiness >= 180) + value /= 2; + + if (value > ((money16)(scenario_rand() & 0x07))) { + // "I'm not paying that much for x" + uint8 thought_type = (shopItem >= 32 ? (PEEP_THOUGHT_TYPE_PHOTO2_MUCH + (shopItem - 32)) : (PEEP_THOUGHT_TYPE_BALLOON_MUCH + shopItem)); + peep_insert_new_thought(peep, shopItem, rideIndex); + return 0; + } + } + else { + value -= price; + value = max(8, value); + sint8 dl = value; + + if ((dl >= (scenario_rand() & 0x07)) && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { + // "This x is a really good value" + uint8 thought_item = (shopItem >= 32 ? (PEEP_THOUGHT_TYPE_PHOTO2 + (shopItem - 32)) : (PEEP_THOUGHT_TYPE_BALLOON + shopItem)); + peep_insert_new_thought(peep, thought_item, rideIndex); + } + + dl *= 4; + peep->happiness_growth_rate = min((peep->happiness_growth_rate + dl), 255); + + peep->happiness = min((peep->happiness + dl), 255); + } + } + +loc_69B221: + if (!has_voucher) { + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TEMPERATURE, uint16) >= 21) + value = get_shop_hot_value(shopItem); + else if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TEMPERATURE, uint16) <= 11) + value = get_shop_cold_value(shopItem); + else + value = get_shop_base_value(shopItem); + + value -= price; + uint8 satisfaction = 0; + if (value > -8) { + satisfaction++; + if (value > -3) { + satisfaction++; + if (value > 3) + satisfaction++; + } + } + + ride_update_satisfaction(ride, satisfaction); + } + + // The peep has now decided to buy the item (or, specifically, has not been + // dissuaded so far). + if (shopItem >= 32) + peep->item_extra_flags |= (1 << (shopItem - 32)); + else + peep->item_standard_flags |= (1 << shopItem); + + if (shopItem == SHOP_ITEM_TSHIRT) + peep->tshirt_colour = ride->track_colour_main[0]; + + if (shopItem == SHOP_ITEM_HAT) + peep->hat_colour = ride->track_colour_main[0]; + + if (shopItem == SHOP_ITEM_BALLOON) + peep->balloon_colour = ride->track_colour_main[0]; + + if (shopItem == SHOP_ITEM_UMBRELLA) + peep->umbrella_colour = ride->track_colour_main[0]; + + if (shopItem == SHOP_ITEM_MAP) + sub_69A98C(peep); + + uint16 dl; + if (shopItem >= 32) + dl = RCT2_ADDRESS(0x982310, uint8)[shopItem - 32]; + else + dl = RCT2_ADDRESS(0x9822F4, uint8)[shopItem]; + + peep->var_42 = min((peep->var_42 + dl), 255); + + if (shopItem == SHOP_ITEM_PHOTO) + peep->photo1_ride_ref = rideIndex; + + if (shopItem == SHOP_ITEM_PHOTO2) + peep->photo2_ride_ref = rideIndex; + + if (shopItem == SHOP_ITEM_PHOTO3) + peep->photo3_ride_ref = rideIndex; + + if (shopItem == SHOP_ITEM_PHOTO4) + peep->photo4_ride_ref = rideIndex; + + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; + peep_update_sprite_type(peep); + if (peep->flags & PEEP_FLAGS_TRACKING) { + RCT2_GLOBAL(0x13CE952,uint16) = peep->name_string_idx; + RCT2_GLOBAL((0x13CE952 + 2), uint32) = peep->id; + RCT2_GLOBAL((0x13CE956 + 2), uint16) = (shopItem >= 32 ? STR_SHOP_ITEM_INDEFINITE_PHOTO2 + (shopItem - 32) : STR_SHOP_ITEM_INDEFINITE_BALLOON + shopItem); + news_item_add_to_queue(2, STR_PEEP_TRACKING_NOTIFICATION_BOUGHT_X, peep->sprite_index); + } + + if (shop_item_is_food(shopItem)) + peep->no_of_food++; + + if (shop_item_is_drink(shopItem)) + peep->no_of_drinks++; + + if (shop_item_is_souvenir(shopItem)) + peep->no_of_souvenirs++; + + money16* expend_type = &peep->paid_on_souvenirs; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_SHOP_STOCK * 4; + + if (shop_item_is_food(shopItem)) { + expend_type = &peep->paid_on_food; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_FOODDRINK_STOCK * 4; + } + + if (shop_item_is_drink(shopItem)) { + expend_type = &peep->paid_on_drink; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_FOODDRINK_STOCK * 4; + } + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) + finance_payment(get_shop_item_cost(shopItem), (RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) / 4)); + + // Sets the expenditure type to *_FOODDRINK_SALES or *_SHOP_SALES appropriately. + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) -= 4; + if (!has_voucher) + peep_spend_money(peep, expend_type, price); + else { + peep->item_standard_flags &= ~PEEP_ITEM_VOUCHER; + peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; + } + + ride->total_profit += (price - get_shop_item_cost(shopItem)); + ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; + ride->var_120++; + ride->total_customers++; + ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_CUSTOMER; + + return 1; } /** diff --git a/src/peep/peep.h b/src/peep/peep.h index 10ac9203c6..d32d966518 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -437,7 +437,7 @@ typedef struct { uint8 photo2_ride_ref; // 0x5C uint8 photo3_ride_ref; // 0x5D uint8 photo4_ride_ref; // 0x5E - uint8 pad_5F[0x09]; // 0x5C + uint8 pad_5F[0x09]; // 0x5F uint8 current_ride; // 0x68 uint8 current_ride_station; // 0x69 uint8 current_train; // 0x6A diff --git a/src/ride/ride.c b/src/ride/ride.c index 516df6ead1..404087d7fd 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -239,6 +239,27 @@ money32 get_shop_item_cost(int shopItem) RCT2_GLOBAL(0x00982144 + (shopItem * 8), uint16); } +money16 get_shop_base_value(int shopItem) +{ + return shopItem < 32 ? + RCT2_GLOBAL((0x00982164 + 2) + (shopItem * 8), uint16) : + RCT2_GLOBAL((0x00982144 + 2) + (shopItem * 8), uint16); +} + +money16 get_shop_cold_value(int shopItem) +{ + return shopItem < 32 ? + RCT2_GLOBAL((0x00982164 + 4) + (shopItem * 8), uint16) : + RCT2_GLOBAL((0x00982144 + 4) + (shopItem * 8), uint16); +} + +money16 get_shop_hot_value(int shopItem) +{ + return shopItem < 32 ? + RCT2_GLOBAL((0x00982164 + 6) + (shopItem * 8), uint16) : + RCT2_GLOBAL((0x00982144 + 6) + (shopItem * 8), uint16); +} + /** * * rct2: 0x006AC3AB @@ -7001,7 +7022,6 @@ bool shop_item_is_food_or_drink(int shopItem) case SHOP_ITEM_CHOCOLATE: case SHOP_ITEM_ICED_TEA: case SHOP_ITEM_FUNNEL_CAKE: - case SHOP_ITEM_SUNGLASSES: case SHOP_ITEM_BEEF_NOODLES: case SHOP_ITEM_FRIED_RICE_NOODLES: case SHOP_ITEM_WONTON_SOUP: @@ -7018,6 +7038,72 @@ bool shop_item_is_food_or_drink(int shopItem) } } +bool shop_item_is_food(int shopItem) +{ + switch (shopItem) { + case SHOP_ITEM_BURGER: + case SHOP_ITEM_FRIES: + case SHOP_ITEM_ICE_CREAM: + case SHOP_ITEM_COTTON_CANDY: + case SHOP_ITEM_PIZZA: + case SHOP_ITEM_POPCORN: + case SHOP_ITEM_HOT_DOG: + case SHOP_ITEM_TENTACLE: + case SHOP_ITEM_CANDY_APPLE: + case SHOP_ITEM_DONUT: + case SHOP_ITEM_CHICKEN: + case SHOP_ITEM_PRETZEL: + case SHOP_ITEM_FUNNEL_CAKE: + case SHOP_ITEM_BEEF_NOODLES: + case SHOP_ITEM_FRIED_RICE_NOODLES: + case SHOP_ITEM_WONTON_SOUP: + case SHOP_ITEM_MEATBALL_SOUP: + case SHOP_ITEM_SUB_SANDWICH: + case SHOP_ITEM_COOKIE: + case SHOP_ITEM_ROAST_SAUSAGE: + return true; + default: + return false; + } +} + +bool shop_item_is_drink(int shopItem) +{ + switch (shopItem) { + case SHOP_ITEM_DRINK: + case SHOP_ITEM_COFFEE: + case SHOP_ITEM_LEMONADE: + case SHOP_ITEM_CHOCOLATE: + case SHOP_ITEM_ICED_TEA: + case SHOP_ITEM_FRUIT_JUICE: + case SHOP_ITEM_SOYBEAN_MILK: + case SHOP_ITEM_SU_JONGKWA: + return true; + default: + return false; + } +} + +bool shop_item_is_souvenir(int shopItem) +{ + switch (shopItem) { + case SHOP_ITEM_BALLOON: + case SHOP_ITEM_TOY: + case SHOP_ITEM_MAP: + case SHOP_ITEM_PHOTO: + case SHOP_ITEM_UMBRELLA: + case SHOP_ITEM_HAT: + case SHOP_ITEM_TSHIRT: + case SHOP_ITEM_PHOTO2: + case SHOP_ITEM_PHOTO3: + case SHOP_ITEM_PHOTO4: + case SHOP_ITEM_SUNGLASSES: + return true; + default: + return false; + } +} + void ride_reset_all_names() { int i; diff --git a/src/ride/ride.h b/src/ride/ride.h index cba6689fc4..6a1d820197 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -930,6 +930,10 @@ void ride_update_all(); void ride_check_all_reachable(); void ride_update_satisfaction(rct_ride* ride, uint8 happiness); void ride_update_popularity(rct_ride* ride, uint8 pop_amount); +money32 get_shop_item_cost(int shopItem); +money16 get_shop_base_value(int shopItem); +money16 get_shop_hot_value(int shopItem); +money16 get_shop_cold_value(int shopItem); int sub_6CAF80(int rideIndex, rct_xy_element *output); int ride_find_track_gap(rct_xy_element *input, rct_xy_element *output); void ride_construct_new(ride_list_item listItem); @@ -1043,6 +1047,9 @@ bool ride_type_is_intamin(int rideType); void sub_6C94D8(); bool shop_item_is_food_or_drink(int shopItem); +bool shop_item_is_food(int shopItem); +bool shop_item_is_drink(int shopItem); +bool shop_item_is_souvenir(int shopItem); void ride_reset_all_names(); const uint8* ride_seek_available_modes(rct_ride *ride); From 6068b361bca716fddd3bedea3618d49de5ed9d5f Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 16 Oct 2015 04:00:16 +0100 Subject: [PATCH 0830/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 1 + data/language/english_us.txt | 3 +++ data/language/german.txt | 2 ++ 3 files changed, 6 insertions(+) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 8b8f574a71..a0a63f2432 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3887,6 +3887,7 @@ STR_5551 :Jaar/dag/maand STR_5552 :{POP16}{POP16}Jaar {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} STR_5553 :Spel pauzeren als de Steam-overlay open staat STR_5554 :{SMALLFONT}{BLACK}Overgangen met omringend land gladstrijken +STR_5555 :Voertuigen van andere baantypen tonen ############# # Scenarios # diff --git a/data/language/english_us.txt b/data/language/english_us.txt index f120dbced0..3525b557ff 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3893,6 +3893,9 @@ STR_5549 :Year/Month/Day STR_5550 :{POP16}{POP16}Year {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} STR_5551 :Year/Day/Month STR_5552 :{POP16}{POP16}Year {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} +STR_5553 :Pause game when Steam overlay is open +STR_5554 :{SMALLFONT}{BLACK}Enable mountain tool +STR_5555 :Show vehicles from other track types ######### # Rides # diff --git a/data/language/german.txt b/data/language/german.txt index 2cc63e1dfb..ecd0c51591 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3887,3 +3887,5 @@ STR_5550 :{POP16}{POP16}Jahr {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH STR_5551 :Jahr/Tag/Monat STR_5552 :{POP16}{POP16}Jahr {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} STR_5553 :Spiel bei geöffnetem Steam Overlay pausieren +STR_5554 :{SMALLFONT}{BLACK}Gebirgswerkzeug aktivieren +STR_5555 :Fahrzeuge anderer Streckentyp. anzeigen From 109ebe4f562f17de8dd08812028011ebacf9b214 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Fri, 16 Oct 2015 01:06:46 -0600 Subject: [PATCH 0831/1173] fix compiler warning --- src/peep/peep.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index c8d0f813c7..9c2f09693d 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -8829,27 +8829,27 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl static void peep_give_real_name(rct_peep *peep) { // Generate a name_string_idx from the peep id using bit twiddling - uint32 eax = peep->id + 0xF0B; + uint16 ax = (uint16)(peep->id + 0xF0B); uint16 dx = 0; - dx |= ((eax & 0x400) ? 1 : 0) << 13; - dx |= ((eax & 0x2000) ? 1 : 0) << 12; - dx |= ((eax & 0x800) ? 1 : 0) << 11; - dx |= ((eax & 0x400) ? 1 : 0) << 10; - dx |= ((eax & 0x1) ? 1 : 0) << 9; - dx |= ((eax & 0x40) ? 1 : 0) << 8; - dx |= ((eax & 0x2) ? 1 : 0) << 7; - dx |= ((eax & 0x4) ? 1 : 0) << 6; - dx |= ((eax & 0x100) ? 1 : 0) << 5; - dx |= ((eax & 0x20) ? 1 : 0) << 4; - dx |= ((eax & 0x80) ? 1 : 0) << 3; - dx |= ((eax & 0x8) ? 1 : 0) << 2; - dx |= ((eax & 0x200) ? 1 : 0) << 1; - dx |= ((eax & 0x10) ? 1 : 0) << 0; - eax = dx & 0xF; + dx |= ((ax & 0x400) ? 1 : 0) << 13; + dx |= ((ax & 0x2000) ? 1 : 0) << 12; + dx |= ((ax & 0x800) ? 1 : 0) << 11; + dx |= ((ax & 0x400) ? 1 : 0) << 10; + dx |= ((ax & 0x1) ? 1 : 0) << 9; + dx |= ((ax & 0x40) ? 1 : 0) << 8; + dx |= ((ax & 0x2) ? 1 : 0) << 7; + dx |= ((ax & 0x4) ? 1 : 0) << 6; + dx |= ((ax & 0x100) ? 1 : 0) << 5; + dx |= ((ax & 0x20) ? 1 : 0) << 4; + dx |= ((ax & 0x80) ? 1 : 0) << 3; + dx |= ((ax & 0x8) ? 1 : 0) << 2; + dx |= ((ax & 0x200) ? 1 : 0) << 1; + dx |= ((ax & 0x10) ? 1 : 0) << 0; + ax = dx & 0xF; dx *= 4; - eax *= 4096; - dx += eax; - if (dx < eax) { + ax *= 4096; + dx += ax; + if (dx < ax) { dx += 0x1000; } dx /= 4; From ae6c88d1cec87ff171e5f29936fa18f735845aee Mon Sep 17 00:00:00 2001 From: zsilencer Date: Fri, 16 Oct 2015 02:25:56 -0600 Subject: [PATCH 0832/1173] remove unused/redundant RCT2_GLOBALS fix #2065 and cleanup --- src/audio/audio.c | 99 +++++++++------------ src/game.c | 6 +- src/peep/peep.c | 30 ++----- src/ride/ride.c | 213 ++++++++++++++++++++++----------------------- src/ride/vehicle.c | 34 +------- 5 files changed, 159 insertions(+), 223 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index dfc3b0e598..3934632f3e 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -94,35 +94,34 @@ void audio_get_devices() */ int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z) { - int result = 0; if (!gGameSoundsOff) { - RCT2_GLOBAL(0x00F438AD, uint8) = 0; + int volumedown = 0; int volume = 0; if (ebx == 0x8001) { rct_map_element* mapelement = map_get_surface_element_at(x / 32, y / 32); if (mapelement) { if ((mapelement->base_height * 8) - 5 > z) { - RCT2_GLOBAL(0x00F438AD, uint8) = 10; + volumedown = 10; } } - sint16 v11; - sint16 v12; + sint16 rx; + sint16 ry; switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) { case 0: - v11 = y - x; - v12 = ((y + x) / 2) - z; + rx = y - x; + ry = ((y + x) / 2) - z; break; case 1: - v11 = -x - y; - v12 = ((y - x) / 2) - z; + rx = -x - y; + ry = ((y - x) / 2) - z; break; case 2: - v11 = x - y; - v12 = ((-y - x) / 2) - z; + rx = x - y; + ry = ((-y - x) / 2) - z; break; case 3: - v11 = y + x; - v12 = ((x - y) / 2) - z; + rx = y + x; + ry = ((x - y) / 2) - z; break; } rct_window* window = RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); @@ -133,11 +132,11 @@ int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z) } rct_viewport* viewport = window->viewport; if (viewport && viewport->flags & VIEWPORT_FLAG_SOUND_ON) { - sint16 v15 = v12 - viewport->view_y; - sint16 v16 = v11 - viewport->view_x; - ebx = viewport->x + (v16 >> viewport->zoom); - volume = RCT2_ADDRESS(0x0099282C, int)[sound_id] + ((-1024 * viewport->zoom - 1) << RCT2_GLOBAL(0x00F438AD, uint8)) + 1; - if (v15 < 0 || v15 >= viewport->view_height || v16 < 0 || v16 >= viewport->view_width || volume < -10000) { + sint16 vy = ry - viewport->view_y; + sint16 vx = rx - viewport->view_x; + ebx = viewport->x + (vx >> viewport->zoom); + volume = RCT2_ADDRESS(0x0099282C, int)[sound_id] + ((-1024 * viewport->zoom - 1) << volumedown) + 1; + if (vy < 0 || vy >= viewport->view_height || vx < 0 || vx >= viewport->view_width || volume < -10000) { return sound_id; } } @@ -154,12 +153,9 @@ int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z) } pan = ((x2 / screenwidth) - 0x8000) >> 4; } - if (!RCT2_GLOBAL(0x009AAC6D, uint8)) { - pan = 0; - } Mixer_Play_Effect(sound_id, MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(pan), 1, 1); } - return result; + return 0; } /** @@ -186,16 +182,12 @@ void start_title_music() break; } - if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0)) && !gGameSoundsOff - && RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) { - if (!RCT2_GLOBAL(0x009AF600, uint8)) { + if (!gGameSoundsOff && RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) { + if (!gTitleMusicChannel) { gTitleMusicChannel = Mixer_Play_Music(musicPathId, MIXER_LOOP_INFINITE, true); - RCT2_GLOBAL(0x009AF600, uint8) = 1; } } else { - if (RCT2_GLOBAL(0x009AF600, uint8)) { - stop_title_music(); - } + stop_title_music(); } } @@ -205,13 +197,13 @@ void start_title_music() */ void stop_ride_music() { - if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0))) { - for (int i = 0; i < AUDIO_MAX_RIDE_MUSIC; i++) { - rct_ride_music* ride_music = &gRideMusicList[i]; - if (ride_music->rideid != (uint8)-1) { + for (int i = 0; i < AUDIO_MAX_RIDE_MUSIC; i++) { + rct_ride_music* ride_music = &gRideMusicList[i]; + if (ride_music->rideid != (uint8)-1) { + if (ride_music->sound_channel) { Mixer_Stop_Channel(ride_music->sound_channel); - ride_music->rideid = -1; } + ride_music->rideid = -1; } } } @@ -222,14 +214,9 @@ void stop_ride_music() */ void stop_crowd_sound() { - if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0))) { - if (RCT2_GLOBAL(0x009AF5FC, uint32) != 1) { - if (gCrowdSoundChannel) { - Mixer_Stop_Channel(gCrowdSoundChannel); - gCrowdSoundChannel = 0; - } - RCT2_GLOBAL(0x009AF5FC, uint32) = 1; - } + if (gCrowdSoundChannel) { + Mixer_Stop_Channel(gCrowdSoundChannel); + gCrowdSoundChannel = 0; } } @@ -239,15 +226,10 @@ void stop_crowd_sound() */ void stop_title_music() { - if (RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0)) { - if (RCT2_GLOBAL(0x009AF600, uint8) != 0) { - if (gTitleMusicChannel) { - Mixer_Stop_Channel(gTitleMusicChannel); - gTitleMusicChannel = 0; - } - } + if (gTitleMusicChannel) { + Mixer_Stop_Channel(gTitleMusicChannel); + gTitleMusicChannel = 0; } - RCT2_GLOBAL(0x009AF600, uint8) = 0; } /** @@ -264,10 +246,11 @@ void audio_init1() const utf8* path = get_file_path(ride_music_info->pathid); SDL_RWops *file = SDL_RWFromFile(path, "rb"); if (file != NULL) { - SDL_RWread(file, &RCT2_GLOBAL(0x009AF47E, uint32), 4, 1); + uint32 head; + SDL_RWread(file, &head, sizeof(head), 1); SDL_RWclose(file); RCT2_GLOBAL(0x014241BC, uint32) = 0; - if (RCT2_GLOBAL(0x009AF47E, uint32) == 0x78787878) { + if (head == 0x78787878) { ride_music_info->length = 0; } } @@ -283,12 +266,10 @@ void audio_init2(int device) audio_close(); for (int i = 0; i < AUDIO_MAX_VEHICLE_SOUNDS; i++) { rct_vehicle_sound* vehicle_sound = &gVehicleSoundList[i]; - vehicle_sound->id = 0xFFFF; + vehicle_sound->id = -1; } RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = device; - RCT2_GLOBAL(0x009AAC5C, uint8) = 1; config_save_default(); - RCT2_GLOBAL(0x009AF284, uint32) |= (1 << 0); for (int i = 0; i < AUDIO_MAX_RIDE_MUSIC; i++) { rct_ride_music* ride_music = &gRideMusicList[i]; ride_music->rideid = -1; @@ -303,9 +284,7 @@ void audio_close() { stop_crowd_sound(); stop_title_music(); - if (RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0)) { - stop_ride_music(); - } + stop_ride_music(); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = -1; } @@ -326,7 +305,7 @@ void toggle_all_sounds(){ */ void pause_sounds() { - gGameSoundsOff = 1; + gGameSoundsOff = true; stop_vehicle_sounds(); stop_ride_music(); stop_crowd_sound(); @@ -338,7 +317,7 @@ void pause_sounds() */ void unpause_sounds() { - gGameSoundsOff = 0; + gGameSoundsOff = false; } /** diff --git a/src/game.c b/src/game.c index d1357b6175..ad6f2c4be4 100644 --- a/src/game.c +++ b/src/game.c @@ -539,10 +539,12 @@ void pause_toggle() { RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) ^= 1; window_invalidate_by_class(WC_TOP_TOOLBAR); - if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) & 1) + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) & 1) { pause_sounds(); - else unpause_sounds(); + } else { + unpause_sounds(); + } } /** diff --git a/src/peep/peep.c b/src/peep/peep.c index 9c2f09693d..4baff8613e 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -5156,9 +5156,6 @@ void peep_update_crowd_noise() rct_peep *peep; int visiblePeeps; - if (!(RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0))) - return; - if (gGameSoundsOff) return; @@ -5198,10 +5195,9 @@ void peep_update_crowd_noise() visiblePeeps = (visiblePeeps / 2) - 6; if (visiblePeeps < 0) { // Mute crowd noise - if (RCT2_GLOBAL(0x009AF5FC, uint32) != 1) { + if (gCrowdSoundChannel) { Mixer_Stop_Channel(gCrowdSoundChannel); gCrowdSoundChannel = 0; - RCT2_GLOBAL(0x009AF5FC, uint32) = 1; } } else { sint32 volume; @@ -5212,26 +5208,16 @@ void peep_update_crowd_noise() volume = volume * volume * volume * volume; volume = (((207360000 - volume) >> viewport->zoom) - 207360000) / 65536 - 150; - // Check if crowd noise is already playing - if (RCT2_GLOBAL(0x009AF5FC, uint32) == 1) { - // Load and play crowd noise - if (!gCrowdSoundChannel) { - gCrowdSoundChannel = Mixer_Play_Music(PATH_ID_CSS2, MIXER_LOOP_INFINITE, false); - if (gCrowdSoundChannel) { - Mixer_Channel_SetGroup(gCrowdSoundChannel, MIXER_GROUP_NONE); - } - } + // Load and play crowd noise if needed and set volume + if (!gCrowdSoundChannel) { + gCrowdSoundChannel = Mixer_Play_Music(PATH_ID_CSS2, MIXER_LOOP_INFINITE, false); if (gCrowdSoundChannel) { - Mixer_Channel_Volume(gCrowdSoundChannel, DStoMixerVolume(volume)); - RCT2_GLOBAL(0x009AF5FC, uint32) = volume; - } - } else { - // Alter crowd noise volume - if (RCT2_GLOBAL(0x009AF5FC, uint32) != volume) { - Mixer_Channel_Volume(gCrowdSoundChannel, DStoMixerVolume(volume)); - RCT2_GLOBAL(0x009AF5FC, uint32) = volume; + Mixer_Channel_SetGroup(gCrowdSoundChannel, MIXER_GROUP_NONE); } } + if (gCrowdSoundChannel) { + Mixer_Channel_Volume(gCrowdSoundChannel, DStoMixerVolume(volume)); + } } } diff --git a/src/ride/ride.c b/src/ride/ride.c index d1a2696aed..6647246b6f 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3328,10 +3328,7 @@ int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint if (panx < -10000) { panx = -10000; } - if (!RCT2_GLOBAL(0x009AAC6D, uint8)) { - panx = 0; - } - rct_ride_music* ride_music = &gRideMusicList[0];//&RCT2_GLOBAL(0x009AF46C, rct_ride_music); + rct_ride_music* ride_music = &gRideMusicList[0]; int channel = 0; uint32 a1; while (ride_music->rideid != rideIndex || ride_music->tuneid != *tuneId) { @@ -3352,15 +3349,15 @@ int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint label51: if (a1 < ride_music_info_list[*tuneId]->length) { position = a1; - rct_ride_music_params* ride_music_params = gRideMusicParamsListEnd;//RCT2_GLOBAL(0x009AF42C, rct_ride_music_params*); - if (ride_music_params < &gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC]/*(rct_ride_music_params*)0x009AF46C*/) { + rct_ride_music_params* ride_music_params = gRideMusicParamsListEnd; + if (ride_music_params < &gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC]) { ride_music_params->rideid = rideIndex; ride_music_params->tuneid = *tuneId; ride_music_params->offset = a1; ride_music_params->volume = v32; ride_music_params->pan = panx; ride_music_params->freq = RCT2_GLOBAL(0x009AF47C, uint16); - gRideMusicParamsListEnd++;//RCT2_GLOBAL(0x009AF42C, rct_ride_music_params*)++; + gRideMusicParamsListEnd++; } } else { *tuneId = 0xFF; @@ -3443,124 +3440,122 @@ void ride_music_update_final() rct_ride_music_params* edi = NULL; int ebx; if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2)) { - if ((RCT2_GLOBAL(0x009AF284, uint32) & (1 << 0))) { - if (!gGameSoundsOff && gConfigSound.sound && gConfigSound.ride_music && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 1)) { - // set to stop music if volume <= 1 ? - while (1) { - int v8 = 0; - int v9 = 1; - rct_ride_music_params* ride_music_params = &gRideMusicParamsList[0];//&RCT2_GLOBAL(0x009AF430, rct_ride_music_params); - while (ride_music_params < gRideMusicParamsListEnd/*RCT2_GLOBAL(0x009AF42C, rct_ride_music_params*)*/) { - if (ride_music_params->rideid != (uint8)-1) { - rct_ride_music_info* ride_music_info = ride_music_info_list[ride_music_params->tuneid]; - if (RCT2_ADDRESS(0x009AA0B1, uint8*)[ride_music_info->pathid]) { // file_on_cdrom[] - v8++; - if (v9 >= ride_music_params->volume) { - v9 = ride_music_params->volume; - edi = ride_music_params; - } - } - } - ride_music_params++; - } - if (v8 <= 1) { - break; - } - edi->rideid = -1; - } - while (1) { - int v8 = 0; - int v9 = 1; - rct_ride_music_params* ride_music_params = &gRideMusicParamsList[0];//&RCT2_GLOBAL(0x009AF430, rct_ride_music_params); - while (ride_music_params < gRideMusicParamsListEnd/*RCT2_GLOBAL(0x009AF42C, rct_ride_music_params*)*/) { - if (ride_music_params->rideid != (uint8)-1) { + if (!gGameSoundsOff && gConfigSound.sound && gConfigSound.ride_music && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 1)) { + // set to stop music if volume <= 1 ? + while (1) { + int v8 = 0; + int v9 = 1; + rct_ride_music_params* ride_music_params = &gRideMusicParamsList[0]; + while (ride_music_params < gRideMusicParamsListEnd) { + if (ride_music_params->rideid != (uint8)-1) { + rct_ride_music_info* ride_music_info = ride_music_info_list[ride_music_params->tuneid]; + if (RCT2_ADDRESS(0x009AA0B1, uint8*)[ride_music_info->pathid]) { // file_on_cdrom[] v8++; if (v9 >= ride_music_params->volume) { v9 = ride_music_params->volume; edi = ride_music_params; } } + } + ride_music_params++; + } + if (v8 <= 1) { + break; + } + edi->rideid = -1; + } + while (1) { + int v8 = 0; + int v9 = 1; + rct_ride_music_params* ride_music_params = &gRideMusicParamsList[0]; + while (ride_music_params < gRideMusicParamsListEnd) { + if (ride_music_params->rideid != (uint8)-1) { + v8++; + if (v9 >= ride_music_params->volume) { + v9 = ride_music_params->volume; + edi = ride_music_params; + } + } + ride_music_params++; + } + if (v8 <= 2) { + break; + } + edi->rideid = -1; + } + + // stop currently playing music that is not in music params list or not playing? + rct_ride_music* ride_music = &gRideMusicList[0]; + int channel = 0; + do { + if (ride_music->rideid != (uint8)-1) { + rct_ride_music_params* ride_music_params = &gRideMusicParamsList[0]; + while (ride_music_params < gRideMusicParamsListEnd) { + if (ride_music_params->rideid == ride_music->rideid && ride_music_params->tuneid == ride_music->tuneid) { + int isplaying = Mixer_Channel_IsPlaying(gRideMusicList[channel].sound_channel); + if (isplaying) { + goto label32; + } + break; + } ride_music_params++; } - if (v8 <= 2) { - break; - } - edi->rideid = -1; + Mixer_Stop_Channel(gRideMusicList[channel].sound_channel); + ride_music->rideid = -1; } + label32: + ride_music++; + channel++; + } while(channel < AUDIO_MAX_RIDE_MUSIC); - // stop currently playing music that is not in music params list or not playing? - rct_ride_music* ride_music = &gRideMusicList[0];//&RCT2_GLOBAL(0x009AF46C, rct_ride_music); - int channel = 0; - do { - if (ride_music->rideid != (uint8)-1) { - rct_ride_music_params* ride_music_params = &gRideMusicParamsList[0];//&RCT2_GLOBAL(0x009AF430, rct_ride_music_params); - while (ride_music_params < gRideMusicParamsListEnd/*RCT2_GLOBAL(0x009AF42C, rct_ride_music_params*)*/) { - if (ride_music_params->rideid == ride_music->rideid && ride_music_params->tuneid == ride_music->tuneid) { - int isplaying = Mixer_Channel_IsPlaying(gRideMusicList[channel].sound_channel); - if (isplaying) { - goto label32; + for (rct_ride_music_params* ride_music_params = &gRideMusicParamsList[0]; ride_music_params < gRideMusicParamsListEnd; ride_music_params++) { + if (ride_music_params->rideid != (uint8)-1) { + rct_ride_music* ride_music = &gRideMusicList[0]; + int channel = 0; + while (ride_music_params->rideid != ride_music->rideid || ride_music_params->tuneid != ride_music->tuneid) { + if (ride_music->rideid == (uint8)-1) { + ebx = channel; + } + ride_music++; + channel++; + if (channel >= AUDIO_MAX_RIDE_MUSIC) { + rct_ride_music_info* ride_music_info = ride_music_info_list[ride_music_params->tuneid]; + rct_ride_music* ride_music = &gRideMusicList[ebx]; + ride_music->sound_channel = Mixer_Play_Music(ride_music_info->pathid, MIXER_LOOP_NONE, true); + if (ride_music->sound_channel) { + ride_music->volume = ride_music_params->volume; + ride_music->pan = ride_music_params->pan; + ride_music->freq = ride_music_params->freq; + ride_music->rideid = ride_music_params->rideid; + ride_music->tuneid = ride_music_params->tuneid; + Mixer_Channel_Volume(ride_music->sound_channel, DStoMixerVolume(ride_music->volume)); + Mixer_Channel_Pan(ride_music->sound_channel, DStoMixerPan(ride_music->pan)); + Mixer_Channel_Rate(ride_music->sound_channel, DStoMixerRate(ride_music->freq)); + int offset = ride_music_params->offset - 10000; + if (offset < 0) { + offset = 0; } - break; + Mixer_Channel_SetOffset(ride_music->sound_channel, offset); + } else { + //RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8) = 0; } - ride_music_params++; + return; } - Mixer_Stop_Channel(gRideMusicList[channel].sound_channel); - ride_music->rideid = -1; } - label32: - ride_music++; - channel++; - } while(channel < AUDIO_MAX_RIDE_MUSIC); - - for (rct_ride_music_params* ride_music_params = &gRideMusicParamsList[0]/*&RCT2_GLOBAL(0x009AF430, rct_ride_music_params)*/; ride_music_params < gRideMusicParamsListEnd/*RCT2_GLOBAL(0x009AF42C, rct_ride_music_params*)*/; ride_music_params++) { - if (ride_music_params->rideid != (uint8)-1) { - rct_ride_music* ride_music = &gRideMusicList[0];//&RCT2_GLOBAL(0x009AF46C, rct_ride_music); - int channel = 0; - while (ride_music_params->rideid != ride_music->rideid || ride_music_params->tuneid != ride_music->tuneid) { - if (ride_music->rideid == (uint8)-1) { - ebx = channel; - } - ride_music++; - channel++; - if (channel >= AUDIO_MAX_RIDE_MUSIC) { - rct_ride_music_info* ride_music_info = ride_music_info_list[ride_music_params->tuneid]; - rct_ride_music* ride_music = &gRideMusicList[ebx]; - ride_music->sound_channel = Mixer_Play_Music(ride_music_info->pathid, MIXER_LOOP_NONE, true); - if (ride_music->sound_channel) { - ride_music->volume = ride_music_params->volume; - ride_music->pan = ride_music_params->pan; - ride_music->freq = ride_music_params->freq; - ride_music->rideid = ride_music_params->rideid; - ride_music->tuneid = ride_music_params->tuneid; - Mixer_Channel_Volume(ride_music->sound_channel, DStoMixerVolume(ride_music->volume)); - Mixer_Channel_Pan(ride_music->sound_channel, DStoMixerPan(ride_music->pan)); - Mixer_Channel_Rate(ride_music->sound_channel, DStoMixerRate(ride_music->freq)); - int offset = ride_music_params->offset - 10000; - if (offset < 0) { - offset = 0; - } - Mixer_Channel_SetOffset(ride_music->sound_channel, offset); - } else { - //RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8) = 0; - } - return; - } - } - - if (ride_music_params->volume != ride_music->volume) { - ride_music->volume = ride_music_params->volume; - Mixer_Channel_Volume(ride_music->sound_channel, DStoMixerVolume(ride_music->volume)); - } - if (ride_music_params->pan != ride_music->pan) { - ride_music->pan = ride_music_params->pan; - Mixer_Channel_Pan(ride_music->sound_channel, DStoMixerPan(ride_music->pan)); - } - if (ride_music_params->freq != ride_music->freq) { - ride_music->freq = ride_music_params->freq; - Mixer_Channel_Rate(ride_music->sound_channel, DStoMixerRate(ride_music->freq)); - } + if (ride_music_params->volume != ride_music->volume) { + ride_music->volume = ride_music_params->volume; + Mixer_Channel_Volume(ride_music->sound_channel, DStoMixerVolume(ride_music->volume)); } + if (ride_music_params->pan != ride_music->pan) { + ride_music->pan = ride_music_params->pan; + Mixer_Channel_Pan(ride_music->sound_channel, DStoMixerPan(ride_music->pan)); + } + if (ride_music_params->freq != ride_music->freq) { + ride_music->freq = ride_music_params->freq; + Mixer_Channel_Rate(ride_music->sound_channel, DStoMixerRate(ride_music->freq)); + } + } } } diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index a51b2aa365..4b03ba9c20 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -63,17 +63,11 @@ void vehicle_update_sound_params(rct_vehicle* vehicle) if (t8 >= RCT2_GLOBAL(0x009AF5A0, sint16) && t9 >= RCT2_GLOBAL(0x009AF5A2, sint16)) { uint16 v9 = sub_6BC2F3(vehicle); rct_vehicle_sound_params* i; - //for (i = RCT2_ADDRESS(0x00F438B4, rct_vehicle_sound_params); i < RCT2_GLOBAL(0x00F438B0, rct_vehicle_sound_params*) && v9 <= i->var_A; i++); for (i = &gVehicleSoundParamsList[0]; i < gVehicleSoundParamsListEnd && v9 <= i->var_A; i++); - //if (i < RCT2_ADDRESS(0x00F43908, rct_vehicle_sound_params)) { // 0x00F43908 is end of rct_vehicle_sound_params list, which has 7 elements, not to be confused with variable at 0x00F43908 if (i < &gVehicleSoundParamsList[countof(gVehicleSoundParamsList)]) { - //if (RCT2_GLOBAL(0x00F438B0, rct_vehicle_sound_params*) < RCT2_ADDRESS(0x00F43908, rct_vehicle_sound_params)) { - // RCT2_GLOBAL(0x00F438B0, rct_vehicle_sound_params*)++; - //} if (gVehicleSoundParamsListEnd < &gVehicleSoundParamsList[countof(gVehicleSoundParamsList)]) { gVehicleSoundParamsListEnd++; } - //rct_vehicle_sound_params* j = RCT2_GLOBAL(0x00F438B0, rct_vehicle_sound_params*) - 1; rct_vehicle_sound_params* j = gVehicleSoundParamsListEnd - 1; while (j >= i) { j--; @@ -195,17 +189,13 @@ void vehicle_sounds_update() } } } - //label12: - //RCT2_GLOBAL(0x00F438B0, rct_vehicle_sound_params**) = &RCT2_GLOBAL(0x00F438B4, rct_vehicle_sound_params*); gVehicleSoundParamsListEnd = &gVehicleSoundParamsList[0]; for (uint16 i = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_VEHICLE, uint16); i != SPRITE_INDEX_NULL; i = g_sprite_list[i].vehicle.next) { vehicle_update_sound_params(&g_sprite_list[i].vehicle); } - //for (rct_vehicle_sound* vehicle_sound = &RCT2_GLOBAL(RCT2_ADDRESS_VEHICLE_SOUND_LIST, rct_vehicle_sound); vehicle_sound != &RCT2_GLOBAL(0x009AF42C, rct_vehicle_sound); vehicle_sound++) { for(int i = 0; i < countof(gVehicleSoundList); i++){ rct_vehicle_sound* vehicle_sound = &gVehicleSoundList[i]; if (vehicle_sound->id != (uint16)-1) { - //for (rct_vehicle_sound_params* vehicle_sound_params = &RCT2_GLOBAL(0x00F438B4, rct_vehicle_sound_params); vehicle_sound_params != RCT2_GLOBAL(0x00F438B0, rct_vehicle_sound_params*); vehicle_sound_params++) { for (rct_vehicle_sound_params* vehicle_sound_params = &gVehicleSoundParamsList[0]; vehicle_sound_params != gVehicleSoundParamsListEnd; vehicle_sound_params++) { if (vehicle_sound->id == vehicle_sound_params->id) { goto label26; @@ -223,10 +213,8 @@ void vehicle_sounds_update() ; } - //for (rct_vehicle_sound_params* vehicle_sound_params = &RCT2_GLOBAL(0x00F438B4, rct_vehicle_sound_params); ; vehicle_sound_params++) { for (rct_vehicle_sound_params* vehicle_sound_params = &gVehicleSoundParamsList[0]; ; vehicle_sound_params++) { label28: - //if (vehicle_sound_params >= RCT2_GLOBAL(0x00F438B0, rct_vehicle_sound_params*)) { if (vehicle_sound_params >= gVehicleSoundParamsListEnd) { return; } @@ -284,18 +272,15 @@ void vehicle_sounds_update() } rct_vehicle_sound* vehicle_sound = &gVehicleSoundList[0]; - //rct_vehicle_sound* vehicle_sound = &RCT2_GLOBAL(RCT2_ADDRESS_VEHICLE_SOUND_LIST, rct_vehicle_sound); while (vehicle_sound_params->id != vehicle_sound->id) { - vehicle_sound++; // went here 2x - //if (vehicle_sound >= &RCT2_GLOBAL(0x009AF42C, rct_vehicle_sound)) { + vehicle_sound++; if (vehicle_sound >= &gVehicleSoundList[countof(gVehicleSoundList)]) { - //vehicle_sound = &RCT2_GLOBAL(RCT2_ADDRESS_VEHICLE_SOUND_LIST, rct_vehicle_sound); vehicle_sound = &gVehicleSoundList[0]; int i = 0; while (vehicle_sound->id != (uint16)-1) { vehicle_sound++; i++; - if (i >= countof(gVehicleSoundList)/*i >= RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MAX_VEHICLE_SOUNDS, uint8)*/) { + if (i >= countof(gVehicleSoundList)) { vehicle_sound_params = (rct_vehicle_sound_params*)((int)vehicle_sound_params + 10); goto label28; } @@ -354,9 +339,6 @@ void vehicle_sounds_update() } uint8 looping = RCT2_ADDRESS(0x009AF51E, uint8)[2 * sprite->vehicle.sound1_id]; int pan = vehicle_sound_params->panx; - if (!RCT2_GLOBAL(0x009AAC6D, uint8)) { - pan = 0; - } vehicle_sound->sound1_channel = Mixer_Play_Effect(sprite->vehicle.sound1_id, looping ? MIXER_LOOP_INFINITE : MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(pan), DStoMixerRate(frequency), 0); goto label87; } @@ -366,9 +348,7 @@ void vehicle_sounds_update() } if (vehicle_sound_params->panx != vehicle_sound->sound1_pan) { vehicle_sound->sound1_pan = vehicle_sound_params->panx; - if (RCT2_GLOBAL(0x009AAC6D, uint8)) { - Mixer_Channel_Pan(vehicle_sound->sound1_channel, DStoMixerPan(vehicle_sound_params->panx)); - } + Mixer_Channel_Pan(vehicle_sound->sound1_channel, DStoMixerPan(vehicle_sound_params->panx)); } if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 3) && vehicle_sound_params->frequency != vehicle_sound->sound1_freq) { vehicle_sound->sound1_freq = vehicle_sound_params->frequency; @@ -414,9 +394,6 @@ void vehicle_sounds_update() } uint8 looping = RCT2_ADDRESS(0x009AF51E, uint8)[2 * sprite->vehicle.sound2_id]; int pan = vehicle_sound_params->panx; - if (!RCT2_GLOBAL(0x009AAC6D, uint8)) { - pan = 0; - } vehicle_sound->sound2_channel = Mixer_Play_Effect(sprite->vehicle.sound2_id, looping ? MIXER_LOOP_INFINITE : MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(pan), DStoMixerRate(frequency), 0); goto label114; } @@ -426,9 +403,7 @@ void vehicle_sounds_update() } if (vehicle_sound_params->panx != vehicle_sound->sound2_pan) { vehicle_sound->sound2_pan = vehicle_sound_params->panx; - if (RCT2_GLOBAL(0x009AAC6D, uint8)) { - Mixer_Channel_Pan(vehicle_sound->sound2_channel, DStoMixerPan(vehicle_sound_params->panx)); - } + Mixer_Channel_Pan(vehicle_sound->sound2_channel, DStoMixerPan(vehicle_sound_params->panx)); } if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 3) && vehicle_sound_params->frequency != vehicle_sound->sound2_freq) { vehicle_sound->sound2_freq = vehicle_sound_params->frequency; @@ -438,7 +413,6 @@ void vehicle_sounds_update() frequency = 25700; } Mixer_Channel_Rate(vehicle_sound->sound2_channel, DStoMixerRate(frequency)); - } } } From 76252a32d92fa3c383d0628ebebaa851742f5860 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 16 Oct 2015 18:51:25 +0100 Subject: [PATCH 0833/1173] fix peep.c warnings --- src/peep/peep.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 4baff8613e..3e2bd4d5ec 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7787,7 +7787,7 @@ static void peep_on_enter_or_exit_ride(rct_peep *peep, int rideIndex, int flags) static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price) { rct_ride* ride = GET_RIDE(rideIndex); - money16 value; + money32 value; bool has_voucher = false; @@ -7889,18 +7889,18 @@ loc_69B119: else { value -= price; value = max(8, value); - sint8 dl = value; - if ((dl >= (scenario_rand() & 0x07)) && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { - // "This x is a really good value" - uint8 thought_item = (shopItem >= 32 ? (PEEP_THOUGHT_TYPE_PHOTO2 + (shopItem - 32)) : (PEEP_THOUGHT_TYPE_BALLOON + shopItem)); - peep_insert_new_thought(peep, thought_item, rideIndex); + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) { + if (value >= (money32)(scenario_rand() & 0x07)) { + // "This x is a really good value" + uint8 thought_item = (shopItem >= 32 ? (PEEP_THOUGHT_TYPE_PHOTO2 + (shopItem - 32)) : (PEEP_THOUGHT_TYPE_BALLOON + shopItem)); + peep_insert_new_thought(peep, thought_item, rideIndex); + } } - dl *= 4; - peep->happiness_growth_rate = min((peep->happiness_growth_rate + dl), 255); - - peep->happiness = min((peep->happiness + dl), 255); + int happinessGrowth = value * 4; + peep->happiness_growth_rate = min((peep->happiness_growth_rate + happinessGrowth), 255); + peep->happiness = min((peep->happiness + happinessGrowth), 255); } } From 6c6fa1d444d1d83546b53a29b706d21779cdada5 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 16 Oct 2015 22:20:16 +0100 Subject: [PATCH 0834/1173] add ability for server to kick player, closes #2071 --- data/language/english_uk.txt | 1 + src/localisation/string_ids.h | 2 ++ src/network/network.cpp | 32 ++++++++++++++++++++- src/network/network.h | 6 +++- src/windows/player_list.c | 53 +++++++++++++++++++++++++++++++++-- 5 files changed, 90 insertions(+), 4 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index f6d816fa12..fa72826150 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3894,6 +3894,7 @@ STR_5552 :{POP16}{POP16}Year {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {M STR_5553 :Pause game when Steam overlay is open STR_5554 :{SMALLFONT}{BLACK}Enable mountain tool STR_5555 :Show vehicles from other track types +STR_5556 :Kick Player ##################### # Rides/attractions # diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 4ce62fe8c7..ff39a83959 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2140,6 +2140,8 @@ enum { STR_CHEAT_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES = 5555, + STR_KICK_PLAYER = 5556, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/network/network.cpp b/src/network/network.cpp index f72fb0c4b1..52f39132e6 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -1042,7 +1042,7 @@ uint32 network_get_server_tick() return gNetwork.GetServerTick(); } -uint8 network_get_player_id() +uint8 network_get_current_player_id() { return gNetwork.GetPlayerID(); } @@ -1067,6 +1067,11 @@ int network_get_player_ping(unsigned int index) return gNetwork.player_list[index]->ping; } +int network_get_player_id(unsigned int index) +{ + return gNetwork.player_list[index]->id; +} + void network_send_map() { gNetwork.Server_Send_MAP(); @@ -1097,6 +1102,29 @@ void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 } } +void Network::KickPlayer(int playerId) +{ + NetworkPlayer *player = GetPlayerByID(playerId); + for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + if ((*it)->player->id == playerId) { + char buffer[128]; + sprintf(buffer, "%s has been kicked.", (*it)->player->name); + + // Disconnect the client + closesocket((*it)->socket); + + chat_history_add(buffer); + Server_Send_CHAT(buffer); + break; + } + } +} + +void network_kick_player(int playerId) +{ + gNetwork.KickPlayer(playerId); +} + #ifdef USE_INET_PTON static bool network_get_address(char *dst, size_t dstLength, const char *host) { @@ -1145,6 +1173,8 @@ int network_get_num_players() { return 1; } const char* network_get_player_name(unsigned int index) { return "local (OpenRCT2 compiled without MP)"; } uint32 network_get_player_flags(unsigned int index) { return 0; } int network_get_player_ping(unsigned int index) { return 0; } +int network_get_player_id(unsigned int index) { return 0; } void network_send_chat(const char* text) {} void network_close() {} +void network_kick_player(int playerId) { } #endif /* DISABLE_NETWORK */ diff --git a/src/network/network.h b/src/network/network.h index 9f86bb5bf1..e1d698d5e8 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -173,6 +173,7 @@ public: const char* FormatChat(NetworkPlayer* fromplayer, const char* text); void SendPacketToClients(NetworkPacket& packet); bool CheckSRAND(uint32 tick, uint32 srand0); + void KickPlayer(int playerId); void Client_Send_AUTH(const char* gameversion, const char* name, const char* password); void Server_Send_MAP(NetworkConnection* connection = nullptr); @@ -261,16 +262,19 @@ int network_get_mode(); void network_update(); int network_get_authstatus(); uint32 network_get_server_tick(); -uint8 network_get_player_id(); +uint8 network_get_current_player_id(); int network_get_num_players(); const char* network_get_player_name(unsigned int index); uint32 network_get_player_flags(unsigned int index); int network_get_player_ping(unsigned int index); +int network_get_player_id(unsigned int index); void network_send_map(); void network_send_chat(const char* text); void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback); +void network_kick_player(int playerId); + void network_print_error(); #ifdef USE_INET_PTON static bool network_get_address(char *dst, size_t dstLength, const char *host); diff --git a/src/windows/player_list.c b/src/windows/player_list.c index 0556f55e53..2a75e6b42a 100644 --- a/src/windows/player_list.c +++ b/src/windows/player_list.c @@ -24,6 +24,7 @@ #include "../localisation/localisation.h" #include "../network/network.h" #include "../sprites.h" +#include "../windows/dropdown.h" enum WINDOW_PLAYER_LIST_WIDGET_IDX { WIDX_BACKGROUND, @@ -47,8 +48,10 @@ static rct_widget window_player_list_widgets[] = { static void window_player_list_mouseup(rct_window *w, int widgetIndex); static void window_player_list_resize(rct_window *w); static void window_player_list_mousedown(int widgetIndex, rct_window* w, rct_widget* widget); +static void window_player_list_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_player_list_update(rct_window *w); static void window_player_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); +static void window_player_list_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); static void window_player_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y); static void window_player_list_invalidate(rct_window *w); static void window_player_list_paint(rct_window *w, rct_drawpixelinfo *dpi); @@ -59,7 +62,7 @@ static rct_window_event_list window_player_list_events = { window_player_list_mouseup, window_player_list_resize, window_player_list_mousedown, - NULL, + window_player_list_dropdown, NULL, window_player_list_update, NULL, @@ -71,7 +74,7 @@ static rct_window_event_list window_player_list_events = { NULL, NULL, window_player_list_scrollgetsize, - NULL, + window_player_list_scrollmousedown, NULL, window_player_list_scrollmouseover, NULL, @@ -85,8 +88,14 @@ static rct_window_event_list window_player_list_events = { window_player_list_scrollpaint }; +enum { + DDIDX_KICK +}; + static void window_player_list_refresh_list(rct_window *w); +static int _dropdownPlayerId; + void window_player_list_open() { rct_window* window; @@ -154,6 +163,15 @@ static void window_player_list_mousedown(int widgetIndex, rct_window* w, rct_wid } } +static void window_player_list_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) +{ + switch (dropdownIndex) { + case DDIDX_KICK: + network_kick_player(_dropdownPlayerId); + break; + } +} + static void window_player_list_update(rct_window *w) { widget_invalidate(w, WIDX_TAB1 + w->page); @@ -178,6 +196,37 @@ static void window_player_list_scrollgetsize(rct_window *w, int scrollIndex, int } } +static void window_player_list_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) +{ + if (network_get_mode() != NETWORK_MODE_SERVER) { + return; + } + + int index; + + index = y / 10; + if (index >= w->no_list_items) + return; + + w->selected_list_item = index; + window_invalidate(w); + + rct_widget *listWidget = &w->widgets[WIDX_LIST]; + int ddx = w->x + listWidget->left + x; + int ddy = w->y + listWidget->top + y; + + if (index == 0) { + return; + } + _dropdownPlayerId = network_get_player_id(index); + if (_dropdownPlayerId == network_get_current_player_id()) { + return; + } + + gDropdownItemsFormat[0] = STR_KICK_PLAYER; + window_dropdown_show_text(ddx, ddy, 0, 7, 0, 1); +} + static void window_player_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) { int index; From 341b658ed08a0d42ba62f7fb906de51e70ae8f80 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 16 Oct 2015 22:45:17 +0100 Subject: [PATCH 0835/1173] add gui option for stay_connected --- data/language/english_uk.txt | 1 + src/localisation/string_ids.h | 1 + src/windows/options.c | 11 ++++++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index fa72826150..e306a49921 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3895,6 +3895,7 @@ STR_5553 :Pause game when Steam overlay is open STR_5554 :{SMALLFONT}{BLACK}Enable mountain tool STR_5555 :Show vehicles from other track types STR_5556 :Kick Player +STR_5557 :Stay connected after desynchronisation (Multiplayer) ##################### # Rides/attractions # diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index ff39a83959..14d82f3767 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2141,6 +2141,7 @@ enum { STR_CHEAT_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES = 5555, STR_KICK_PLAYER = 5556, + STR_STAY_CONNECTED_AFTER_DESYNC = 5557, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/windows/options.c b/src/windows/options.c index 5567922add..68d69f3d69 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -142,6 +142,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_TITLE_SEQUENCE_DROPDOWN, WIDX_TITLE_SEQUENCE_BUTTON, WIDX_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM, + WIDX_STAY_CONNECTED_AFTER_DESYNC, // Twitch WIDX_CHANNEL_BUTTON = WIDX_PAGE_START, @@ -256,6 +257,7 @@ static rct_widget window_options_misc_widgets[] = { { WWT_DROPDOWN_BUTTON, 1, 288, 298, 174, 183, STR_DROPDOWN_GLYPH, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 26, 185, 189, 200, STR_EDIT_TITLE_SEQUENCES_BUTTON, STR_NONE }, // Title sequences button { WWT_CHECKBOX, 2, 10, 299, 204, 215, STR_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM, STR_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM_TIP }, // Allow loading with incorrect checksum + { WWT_CHECKBOX, 2, 10, 299, 219, 230, STR_STAY_CONNECTED_AFTER_DESYNC, STR_NONE }, // Do not disconnect after the client desynchronises with the server { WIDGETS_END }, }; @@ -411,7 +413,8 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_TITLE_SEQUENCE) | (1 << WIDX_TITLE_SEQUENCE_DROPDOWN) | (1 << WIDX_TITLE_SEQUENCE_BUTTON) | - (1 << WIDX_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM), + (1 << WIDX_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM) | + (1 << WIDX_STAY_CONNECTED_AFTER_DESYNC), MAIN_OPTIONS_ENABLED_WIDGETS | (1 << WIDX_CHANNEL_BUTTON) | @@ -643,6 +646,10 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) config_save_default(); window_invalidate(w); break; + case WIDX_STAY_CONNECTED_AFTER_DESYNC: + gConfigNetwork.stay_connected = !gConfigNetwork.stay_connected; + config_save_default(); + window_invalidate(w); } break; @@ -1257,6 +1264,7 @@ static void window_options_invalidate(rct_window *w) widget_set_checkbox_value(w, WIDX_HANDYMEN_MOW_DEFAULT, gConfigGeneral.handymen_mow_default); widget_set_checkbox_value(w, WIDX_DEBUGGING_TOOLS, gConfigGeneral.debugging_tools); widget_set_checkbox_value(w, WIDX_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM, gConfigGeneral.allow_loading_with_incorrect_checksum); + widget_set_checkbox_value(w, WIDX_STAY_CONNECTED_AFTER_DESYNC, gConfigNetwork.stay_connected); window_options_misc_widgets[WIDX_REAL_NAME_CHECKBOX].type = WWT_CHECKBOX; window_options_misc_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_CHECKBOX; @@ -1270,6 +1278,7 @@ static void window_options_invalidate(rct_window *w) window_options_misc_widgets[WIDX_TITLE_SEQUENCE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; window_options_misc_widgets[WIDX_TITLE_SEQUENCE_BUTTON].type = WWT_DROPDOWN_BUTTON; window_options_misc_widgets[WIDX_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM].type = WWT_CHECKBOX; + window_options_misc_widgets[WIDX_STAY_CONNECTED_AFTER_DESYNC].type = WWT_CHECKBOX; break; case WINDOW_OPTIONS_PAGE_TWITCH: From 4ddca816e00a76455921d974872b11bfa089b5c6 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 16 Oct 2015 23:26:55 +0100 Subject: [PATCH 0836/1173] Possible fix to #2049. I need this confirmed as I can't reproduce the issue even when I change the peep logic to always being sick. --- src/world/sprite.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/world/sprite.c b/src/world/sprite.c index f195f2adda..507452b870 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -538,8 +538,8 @@ void litter_create(int x, int y, int z, int direction, int type) uint16 spriteIndex, nextSpriteIndex; uint32 newestLitterCreationTick; - x += TileDirectionDelta[direction].x / 8; - y += TileDirectionDelta[direction].y / 8; + x += TileDirectionDelta[direction >> 3].x / 8; + y += TileDirectionDelta[direction >> 3].y / 8; if (!litter_can_be_at(x, y, z)) return; From 0829059ee42e1cf10393d8c40ab241693f2eda09 Mon Sep 17 00:00:00 2001 From: xperia64 Date: Fri, 16 Oct 2015 23:45:40 -0400 Subject: [PATCH 0837/1173] Wrap download arguments in quotes --- install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install.sh b/install.sh index 5704a9ce23..df1fdcfa76 100755 --- a/install.sh +++ b/install.sh @@ -17,9 +17,9 @@ libVFile="./libversion" function download { if command -v curl > /dev/null 2>&1; then - curl -L -o $2 $1 + curl -L -o "$2" "$1" elif command -v wget > /dev/null 2>&1; then - wget -O $2 $1 + wget -O "$2" "$1" else echo "Please install either wget or curl to continue" exit 1 From 93e7e219cc9c67e84af2dbc1b494fd2d75250a8b Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 17 Oct 2015 13:35:09 +0100 Subject: [PATCH 0838/1173] fix peep inverted logic from 76252a32d92fa3c383d0628ebebaa851742f5860 --- src/peep/peep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 3e2bd4d5ec..0aa56a7eb4 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7890,7 +7890,7 @@ loc_69B119: value -= price; value = max(8, value); - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { if (value >= (money32)(scenario_rand() & 0x07)) { // "This x is a really good value" uint8 thought_item = (shopItem >= 32 ? (PEEP_THOUGHT_TYPE_PHOTO2 + (shopItem - 32)) : (PEEP_THOUGHT_TYPE_BALLOON + shopItem)); From 8850d1153f2a6f37d39ea8820baa98ec08ce703e Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Sun, 18 Oct 2015 02:31:17 +1000 Subject: [PATCH 0839/1173] Split off independent logic into their own functions --- src/peep/peep.c | 154 +++++++++++++++++++++++++++--------------------- 1 file changed, 87 insertions(+), 67 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index a6ab246adb..c064928548 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -68,6 +68,9 @@ static bool peep_has_ridden(rct_peep *peep, int rideIndex); static void peep_set_has_ridden_ride_type(rct_peep *peep, int rideType); static bool peep_has_ridden_ride_type(rct_peep *peep, int rideType); static void peep_on_enter_or_exit_ride(rct_peep *peep, int rideIndex, int flags); +static void peep_update_favourite_ride(rct_peep *peep, rct_ride *ride); +static sint8 peep_calculate_ride_satisfaction(rct_peep *peep, rct_ride *ride); +static void peep_update_ride_nausea_growth(rct_peep *peep, rct_ride *ride); static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 price); static bool peep_should_use_cash_machine(rct_peep *peep, int rideIndex); static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNum, int flags); @@ -7532,43 +7535,72 @@ static void peep_spend_money(rct_peep *peep, money16 *peep_expend_type, money32 static void peep_set_has_ridden(rct_peep *peep, int rideIndex) { - peep->rides_been_on[rideIndex >> 5] |= 1 << (rideIndex & 0x1F); + peep->rides_been_on[rideIndex / 32] |= 1 << (rideIndex % 32); + rct_ride *ride = GET_RIDE(rideIndex); + peep_set_has_ridden_ride_type(peep, ride->type); } static bool peep_has_ridden(rct_peep *peep, int rideIndex) { - return peep->rides_been_on[rideIndex >> 5] & (1 << (rideIndex & 0x1F)); + return peep->rides_been_on[rideIndex / 32] & (1 << (rideIndex % 32)); } static void peep_set_has_ridden_ride_type(rct_peep *peep, int rideType) { - peep->rides_been_on[rideType >> 5] |= 1 << (rideType & 0x1F); + peep->ride_types_been_on[rideType / 32] |= 1 << (rideType % 32); } static bool peep_has_ridden_ride_type(rct_peep *peep, int rideType) { - return peep->rides_been_on[rideType >> 5] & (1 << (rideType & 0x1F)); + return peep->ride_types_been_on[rideType / 32] & (1 << (rideType % 32)); } /** * * rct2: 0x0069545B - * Updates the happiness and nausea growth rates for peeps upon entering a ride, - * and contains the logic for determining if the ride will become the peep's favourite. - * The ride itself has its satisfaction value updated. + * Updates various peep stats upon entering a ride, as well as updating the + * ride's satisfaction value. */ static void peep_on_enter_ride(rct_peep *peep, int rideIndex) { rct_ride *ride = GET_RIDE(rideIndex); - // Check to see if this should become the peep's favourite ride. - // For this, a "ride rating" is calculated based on the excitement of the ride and the peep's current happiness. - // As this value cannot exceed 255, the happier the peep is, the more irrelevant the ride's excitement becomes. - // Due to the minimum happiness requirement, an excitement rating of more than 3.8 has no further effect. - - // If the ride rating is higher than any ride the peep has already been on and the happiness criteria is met, - // the ride becomes the peep's favourite. + // Calculate how satisfying the ride is for the peep. Can range from -140 to +140. + sint8 satisfaction = peep_calculate_ride_satisfaction(peep, ride); + // Update the satisfaction stat of the ride. + uint8 rideSatisfaction = 0; + if (satisfaction >= 40) + rideSatisfaction = 3; + else if (satisfaction >= 20) + rideSatisfaction = 2; + else if (satisfaction >= 0) + rideSatisfaction = 1; + + ride_update_satisfaction(ride, rideSatisfaction); + + // Update various peep stats. + if (peep->no_of_rides < 255) + peep->no_of_rides++; + + peep_set_has_ridden(peep, peep->current_ride); + peep_update_favourite_ride(peep, ride); + peep->happiness_growth_rate = clamp(0, peep->happiness_growth_rate + satisfaction, 255); + peep_update_ride_nausea_growth(peep, ride); +} + +/* + * Check to see if the specified ride should become the peep's favourite. + * For this, a "ride rating" is calculated based on the excitement of the ride and the peep's current happiness. + * As this value cannot exceed 255, the happier the peep is, the more irrelevant the ride's excitement becomes. + * Due to the minimum happiness requirement, an excitement rating of more than 3.8 has no further effect. + * + * If the ride rating is higher than any ride the peep has already been on and the happiness criteria is met, + * the ride becomes the peep's favourite. (This doesn't happen right away, but will be updated once the peep + * exits the ride.) + */ +static void peep_update_favourite_ride(rct_peep *peep, rct_ride *ride) +{ peep->flags &= ~PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE; uint8 peepRideRating = clamp(0, (ride->excitement / 4) + peep->happiness, 255); if (peepRideRating >= peep->favourite_ride_rating) { @@ -7577,17 +7609,19 @@ static void peep_on_enter_ride(rct_peep *peep, int rideIndex) peep->flags |= PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE; } } +} - /** - * The satisfaction values calculated here are used to determine how happy the peep is with the ride, - * and also affects the satisfaction stat of the ride itself. The factors that affect satisfaction include: - * - The price of the ride compared to the ride's value - * - How closely the intensity and nausea of the ride matches the peep's preferences - * - How long the peep was waiting in the queue - * - If the peep has been on the ride before, or on another ride of the same type - */ - - uint8 rawSatisfaction = 0; +/** + * The satisfaction values calculated here are used to determine how happy the peep is with the ride, + * and also affects the satisfaction stat of the ride itself. The factors that affect satisfaction include: + * - The price of the ride compared to the ride's value + * - How closely the intensity and nausea of the ride matches the peep's preferences + * - How long the peep was waiting in the queue + * - If the peep has been on the ride before, or on another ride of the same type + */ +static sint8 peep_calculate_ride_satisfaction(rct_peep *peep, rct_ride *ride) +{ + sint8 satisfaction = 0; // Calculate satisfaction based on the price and value of the ride. uint8 valueSatisfaction = 1; @@ -7610,13 +7644,13 @@ static void peep_on_enter_ride(rct_peep *peep, int rideIndex) switch (valueSatisfaction) { case 2: - rawSatisfaction += 40; + satisfaction += 40; break; case 1: - rawSatisfaction += 15; + satisfaction += 15; break; case 0: - rawSatisfaction -= 45; + satisfaction -= 45; break; } @@ -7676,78 +7710,64 @@ static void peep_on_enter_ride(rct_peep *peep, int rideIndex) if (highestSatisfaction == 3) { switch (lowestSatisfaction) { case 3: - rawSatisfaction += 20; + satisfaction += 20; case 2: - rawSatisfaction += 15; + satisfaction += 15; case 1: - rawSatisfaction += 35; + satisfaction += 35; break; case 0: - rawSatisfaction -= 35; + satisfaction -= 35; } } else if (highestSatisfaction == 2) { switch (lowestSatisfaction) { case 2: - rawSatisfaction += 15; + satisfaction += 15; case 1: - rawSatisfaction += 20; + satisfaction += 20; break; case 0: - rawSatisfaction -= 50; + satisfaction -= 50; } } else if (highestSatisfaction == 1 && lowestSatisfaction == 1) { - rawSatisfaction += 10; + satisfaction += 10; } else { - rawSatisfaction -= 60; + satisfaction -= 60; } - + // Calculate satisfaction based on how long the peep has been in the queue for. // (For comparison: peeps start thinking "I've been queueing for a long time" at 3500 and // start leaving the queue at 4300.) if (peep->time_in_queue >= 4500) - rawSatisfaction -= 35; + satisfaction -= 35; else if (peep->time_in_queue >= 2250) - rawSatisfaction -= 10; + satisfaction -= 10; else if (peep->time_in_queue <= 750) - rawSatisfaction += 10; + satisfaction += 10; // Peeps get a small boost in satisfaction if they've been on a ride of the same type before, // and this boost is doubled if they've already been on this particular ride. if (peep_has_ridden_ride_type(peep, ride->type)) - rawSatisfaction += 10; - peep_set_has_ridden_ride_type(peep, ride->type); + satisfaction += 10; if (peep_has_ridden(peep, peep->current_ride)) - rawSatisfaction += 10; - peep_set_has_ridden(peep, peep->current_ride); + satisfaction += 10; - if (peep->no_of_rides < 255) - peep->no_of_rides++; + return satisfaction; +} - // Update the satisfaction stat of the ride itself. - uint8 satisfaction = 0; - if (rawSatisfaction >= 40) - satisfaction = 3; - else if (rawSatisfaction >= 20) - satisfaction = 2; - else if (rawSatisfaction >= 0) - satisfaction = 1; - - ride_update_satisfaction(ride, satisfaction); - - // Update the happiness growth rate of the peep. The largest possible change is +/- 1 - peep->happiness_growth_rate = clamp(0, rawSatisfaction + peep->happiness_growth_rate, 255); - - /* - * Update the nausea growth of the peep. This is calculated based on: - * - The nausea rating of the ride - * - Their new happiness growth rate (the higher, the less nauseous) - * - How hungry the peep is (+0% nausea at 50% hunger up to +100% nausea at 100% hunger) - * - The peep's nausea tolerance (Final modifier: none: 100%, low: 50%, average: 25%, high: 12.5%) - */ +/* + * Update the nausea growth of the peep based on a ride. This is calculated based on: + * - The nausea rating of the ride + * - Their new happiness growth rate (the higher, the less nauseous) + * - How hungry the peep is (+0% nausea at 50% hunger up to +100% nausea at 100% hunger) + * - The peep's nausea tolerance (Final modifier: none: 100%, low: 50%, average: 25%, high: 12.5%) + */ +static void peep_update_ride_nausea_growth(rct_peep *peep, rct_ride *ride) +{ uint32 nauseaMultiplier = clamp(64, 256 - peep->happiness_growth_rate, 200); uint32 nauseaGrowthRateChange = (ride->nausea * nauseaMultiplier) / 512; nauseaGrowthRateChange *= max(128, peep->hunger) / 64; From 05f6ea96a0ee81ea7a5374f0a27e3858d842410b Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Sun, 18 Oct 2015 02:32:26 +1000 Subject: [PATCH 0840/1173] Fixed inconsistent use of peep->rides_been_on --- src/peep/peep.c | 8 ++++---- src/ride/ride.c | 2 +- src/windows/guest.c | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index c064928548..a2eede65f4 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7535,24 +7535,24 @@ static void peep_spend_money(rct_peep *peep, money16 *peep_expend_type, money32 static void peep_set_has_ridden(rct_peep *peep, int rideIndex) { - peep->rides_been_on[rideIndex / 32] |= 1 << (rideIndex % 32); + peep->rides_been_on[rideIndex / 8] |= 1 << (rideIndex % 8); rct_ride *ride = GET_RIDE(rideIndex); peep_set_has_ridden_ride_type(peep, ride->type); } static bool peep_has_ridden(rct_peep *peep, int rideIndex) { - return peep->rides_been_on[rideIndex / 32] & (1 << (rideIndex % 32)); + return peep->rides_been_on[rideIndex / 8] & (1 << (rideIndex % 8)); } static void peep_set_has_ridden_ride_type(rct_peep *peep, int rideType) { - peep->ride_types_been_on[rideType / 32] |= 1 << (rideType % 32); + peep->ride_types_been_on[rideType / 8] |= 1 << (rideType % 8); } static bool peep_has_ridden_ride_type(rct_peep *peep, int rideType) { - return peep->ride_types_been_on[rideType / 32] & (1 << (rideType % 32)); + return peep->ride_types_been_on[rideType / 8] & (1 << (rideType % 8)); } /** diff --git a/src/ride/ride.c b/src/ride/ride.c index 062f904d96..23e0fe7226 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5441,7 +5441,7 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi uint16 spriteIndex; rct_peep *peep; FOR_ALL_GUESTS(spriteIndex, peep){ - uint8 ride_id_bit = ride_id & 0x3; + uint8 ride_id_bit = ride_id % 8; uint8 ride_id_offset = ride_id / 8; peep->rides_been_on[ride_id_offset] &= ~(1 << ride_id_bit); // clear ride from potentially being in rides_been_on if(peep->state == PEEP_STATE_WATCHING){ diff --git a/src/windows/guest.c b/src/windows/guest.c index d2cda8b34f..8cdde252e3 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -1514,7 +1514,7 @@ void window_guest_rides_update(rct_window *w) uint8 curr_list_position = 0; for (uint8 ride_id = 0; ride_id < 255; ++ride_id){ // Offset to the ride_id bit in peep_rides_been_on - uint8 ride_id_bit = ride_id & 0x7; + uint8 ride_id_bit = ride_id % 8; uint8 ride_id_offset = ride_id / 8; if (peep->rides_been_on[ride_id_offset] & (1 << ride_id_bit)){ rct_ride* ride = GET_RIDE(ride_id); From 6449dfd6ead3d0e0925eeab111419ca398b02d3c Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sat, 17 Oct 2015 11:37:08 -0600 Subject: [PATCH 0841/1173] fix #2076 --- src/audio/audio.c | 11 +++++++++++ src/audio/audio.h | 2 ++ src/world/climate.c | 29 ++++++++++++++--------------- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 3934632f3e..8391881d2b 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -41,6 +41,7 @@ rct_ride_music_params gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC]; rct_ride_music_params *gRideMusicParamsListEnd; void *gCrowdSoundChannel = 0; void *gTitleMusicChannel = 0; +void *gRainSoundChannel = 0; bool gGameSoundsOff = false; void audio_init(int i) @@ -232,6 +233,14 @@ void stop_title_music() } } +void stop_rain_sound() +{ + if (gRainSoundChannel) { + Mixer_Stop_Channel(gRainSoundChannel); + gRainSoundChannel = 0; + } +} + /** * * rct2: 0x006BA8E0 @@ -285,6 +294,7 @@ void audio_close() stop_crowd_sound(); stop_title_music(); stop_ride_music(); + stop_rain_sound(); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = -1; } @@ -309,6 +319,7 @@ void pause_sounds() stop_vehicle_sounds(); stop_ride_music(); stop_crowd_sound(); + stop_rain_sound(); } /** diff --git a/src/audio/audio.h b/src/audio/audio.h index 82a475ad38..880f2b4853 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -97,6 +97,7 @@ extern rct_ride_music_params gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC]; extern rct_ride_music_params *gRideMusicParamsListEnd; extern void *gCrowdSoundChannel; extern void *gTitleMusicChannel; +extern void *gRainSoundChannel; extern bool gGameSoundsOff; int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z); @@ -104,6 +105,7 @@ void start_title_music(); void stop_ride_music(); void stop_crowd_sound(); void stop_title_music(); +void stop_raid_sound(); void audio_init1(); void audio_init2(int device); void audio_close(); diff --git a/src/world/climate.c b/src/world/climate.c index 470a1d2fbd..f65b22563b 100644 --- a/src/world/climate.c +++ b/src/world/climate.c @@ -62,7 +62,6 @@ static const rct_weather_transition* climate_transitions[4]; // Sound data static int _rainVolume = 1; -static void* _rainSoundChannel = 0; static unsigned int _lightningTimer, _thunderTimer; static void* _thunderSoundChannels[MAX_THUNDER_INSTANCES]; static int _thunderStatus[MAX_THUNDER_INSTANCES] = { THUNDER_STATUS_NULL, THUNDER_STATUS_NULL }; @@ -108,9 +107,9 @@ void climate_reset(int climate) _lightningTimer = 0; _thunderTimer = 0; if (_rainVolume != 1){ - if (_rainSoundChannel) { - Mixer_Stop_Channel(_rainSoundChannel); - _rainSoundChannel = 0; + if (gRainSoundChannel) { + Mixer_Stop_Channel(gRainSoundChannel); + gRainSoundChannel = 0; } _rainVolume = 1; } @@ -251,30 +250,30 @@ void climate_update_sound() static void climate_update_rain_sound() { if (_climateCurrentWeatherEffect == 1 || _climateCurrentWeatherEffect == 2) { + // Start playing the rain sound + if (!gRainSoundChannel) { + gRainSoundChannel = Mixer_Play_Effect(SOUND_RAIN_1, MIXER_LOOP_INFINITE, DStoMixerVolume(-4000), 0.5f, 1, 0); + } if (_rainVolume == 1) { - // Start playing the rain sound - if (!_rainSoundChannel) { - _rainSoundChannel = Mixer_Play_Effect(SOUND_RAIN_1, MIXER_LOOP_INFINITE, DStoMixerVolume(-4000), 0.5f, 1, 0); - } _rainVolume = -4000; } else { // Increase rain sound _rainVolume = min(-1400, _rainVolume + 80); - if (_rainSoundChannel) { - Mixer_Channel_Volume(_rainSoundChannel, DStoMixerVolume(_rainVolume)); + if (gRainSoundChannel) { + Mixer_Channel_Volume(gRainSoundChannel, DStoMixerVolume(_rainVolume)); } } } else if (_rainVolume != 1) { // Decrease rain sound _rainVolume -= 80; if (_rainVolume > -4000) { - if (_rainSoundChannel) { - Mixer_Channel_Volume(_rainSoundChannel, DStoMixerVolume(_rainVolume)); + if (gRainSoundChannel) { + Mixer_Channel_Volume(gRainSoundChannel, DStoMixerVolume(_rainVolume)); } } else { - if (_rainSoundChannel) { - Mixer_Stop_Channel(_rainSoundChannel); - _rainSoundChannel = 0; + if (gRainSoundChannel) { + Mixer_Stop_Channel(gRainSoundChannel); + gRainSoundChannel = 0; } _rainVolume = 1; } From cf78d76bdfceb74c1682f5f792c4a0c4b14dc0c6 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sat, 17 Oct 2015 11:46:40 -0600 Subject: [PATCH 0842/1173] make disable volume on focus lost not reset title music --- src/audio/audio.h | 1 - src/audio/mixer.cpp | 14 +++++++++++++- src/audio/mixer.h | 3 +++ src/platform/shared.c | 5 +++-- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/audio/audio.h b/src/audio/audio.h index 880f2b4853..d22a26442a 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -105,7 +105,6 @@ void start_title_music(); void stop_ride_music(); void stop_crowd_sound(); void stop_title_music(); -void stop_raid_sound(); void audio_init1(); void audio_init2(int device); void audio_close(); diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index 210d90407d..75685e5209 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -448,6 +448,7 @@ void Channel::SetGroup(int group) Mixer::Mixer() { effectbuffer = 0; + volume = 1; for (int i = 0; i < countof(css1sources); i++) { css1sources[i] = 0; } @@ -565,6 +566,11 @@ bool Mixer::LoadMusic(int pathid) } } +void Mixer::SetVolume(float volume) +{ + Mixer::volume = volume; +} + void SDLCALL Mixer::Callback(void* arg, uint8* stream, int length) { Mixer* mixer = (Mixer*)arg; @@ -671,7 +677,8 @@ void Mixer::MixChannel(Channel& channel, uint8* data, int length) mixlength = length - loaded; } - float volumeadjust = (gConfigSound.master_volume / 100.0f); + float volumeadjust = volume; + volumeadjust *= (gConfigSound.master_volume / 100.0f); if (channel.group == MIXER_GROUP_MUSIC) { volumeadjust *= (gConfigSound.music_volume / 100.0f); } @@ -897,3 +904,8 @@ void* Mixer_Play_Music(int pathid, int loop, int streaming) } return 0; } + +void Mixer_SetVolume(float volume) +{ + gMixer.SetVolume(volume); +} diff --git a/src/audio/mixer.h b/src/audio/mixer.h index 6f68e1177d..35fa5b92e1 100644 --- a/src/audio/mixer.h +++ b/src/audio/mixer.h @@ -167,6 +167,7 @@ public: Channel* Play(Source& source, int loop, bool deleteondone, bool deletesourceondone); void Stop(Channel& channel); bool LoadMusic(int pathid); + void SetVolume(float volume); Source* css1sources[SOUND_MAXID]; Source* musicsources[PATH_ID_END]; @@ -185,6 +186,7 @@ private: uint8* effectbuffer; std::list channels; Source_Null source_null; + float volume; }; extern "C" @@ -209,6 +211,7 @@ unsigned long Mixer_Channel_GetOffset(void* channel); int Mixer_Channel_SetOffset(void* channel, unsigned long offset); void Mixer_Channel_SetGroup(void* channel, int group); void* Mixer_Play_Music(int pathid, int loop, int streaming); +void Mixer_SetVolume(float volume); static int DStoMixerVolume(int volume) { return (int)(SDL_MIX_MAXVOLUME * (SDL_pow(10, (float)volume / 2000))); }; static float DStoMixerPan(int pan) { return (((float)pan + -DSBPAN_LEFT) / DSBPAN_RIGHT) / 2; }; diff --git a/src/platform/shared.c b/src/platform/shared.c index cdf9ecf854..de47d4caf6 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -20,6 +20,7 @@ #include "../addresses.h" #include "../audio/audio.h" +#include "../audio/mixer.h" #include "../config.h" #include "../cursors.h" #include "../drawing/drawing.h" @@ -406,10 +407,10 @@ void platform_process_messages() platform_resize(e.window.data1, e.window.data2); if (gConfigSound.audio_focus && gConfigSound.sound) { if (e.window.event == SDL_WINDOWEVENT_FOCUS_GAINED) { - unpause_sounds(); + Mixer_SetVolume(1); } if (e.window.event == SDL_WINDOWEVENT_FOCUS_LOST) { - pause_sounds(); + Mixer_SetVolume(0); } } break; From 516cb1f7c9b07f1b4a843735e51b21766e7655c8 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 18 Oct 2015 04:00:17 +0100 Subject: [PATCH 0843/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index d00e4620b2..acc4fd96da 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3894,6 +3894,9 @@ STR_5551 :年/日/月 STR_5552 :{POP16}{POP16}第{COMMA16}年, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} STR_5553 :當Steam overlay開啟時暫停遊戲 STR_5554 :{SMALLFONT}{BLACK}啟用山丘工具 +STR_5555 :顯示來自其他類型軌道的車輛種類 +STR_5556 :踢走玩家 +STR_5557 :多人遊戲不同步時依然保持連線 ##################### # Rides/attractions # From fedd83987e9ec408124cc2e43d0f6d3125be9617 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 18 Oct 2015 12:02:31 +0100 Subject: [PATCH 0844/1173] Fix Disable Network build --- src/network/network.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/network/network.cpp b/src/network/network.cpp index 52f39132e6..e7f80fcc90 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -1177,4 +1177,5 @@ int network_get_player_id(unsigned int index) { return 0; } void network_send_chat(const char* text) {} void network_close() {} void network_kick_player(int playerId) { } +uint8 network_get_current_player_id() { return 0; } #endif /* DISABLE_NETWORK */ From 0551fb7170f55445e32e8ec952062d522b296e04 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 18 Oct 2015 12:07:45 +0100 Subject: [PATCH 0845/1173] Fix #1914. Removed y variable as it is not part of function call --- src/interface/viewport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 11175a52d6..f5806c026b 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1607,7 +1607,7 @@ static void sub_68B3FB(int x, int y) RCT2_GLOBAL(0x9DEA54, uint16) = 0; RCT2_GLOBAL(0x9DEA56, uint16) = arrowZ + 18; - sub_98197C(0, 0xFF, imageId, y & 0xFF00, arrowZ, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 0xFF, imageId, 0, arrowZ, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); } int bx = dx + 52; From 7d378a362020b4500c71550016eb14fc7a9da712 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 18 Oct 2015 12:46:38 +0100 Subject: [PATCH 0846/1173] Fix unused variable warnings --- src/ride/ride.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 5295829d07..f1de4faae9 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5335,7 +5335,7 @@ void game_command_callback_ride_construct_new(int eax, int ebx, int ecx, int edx void game_command_callback_ride_construct_placed_back(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp) { - int trackType, trackDirection, rideIndex, edxRS16, x, y, z, properties; + int trackDirection, x, y, z; track_begin_end trackBeginEnd; RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex; @@ -5368,8 +5368,7 @@ void game_command_callback_ride_construct_placed_back(int eax, int ebx, int ecx, void game_command_callback_ride_construct_placed_front(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp) { - int trackType, trackDirection, rideIndex, edxRS16, x, y, z, properties; - track_begin_end trackBeginEnd; + int trackDirection, x, y, z; RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex; trackDirection = _currentTrackPieceDirection; From f512c5fad01bec84d36ef555b7cebf81a55bea92 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 18 Oct 2015 13:18:10 +0100 Subject: [PATCH 0847/1173] Use correct function call for crashed vehicles --- src/interface/viewport.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index f5806c026b..8aeeabe15b 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -889,12 +889,8 @@ void viewport_vehicle_paint_setup(rct_vehicle *vehicle, int imageDirection) RCT2_GLOBAL(0x9DEA52, uint16) = 0; RCT2_GLOBAL(0x9DEA54, uint16) = 0; RCT2_GLOBAL(0x9DEA56, uint16) = z + 2; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) { - case 0: RCT2_CALLPROC_X(0x00686806, 0, ebx, 0, z, 1, 1, 0); break; - case 1: RCT2_CALLPROC_X(0x006869B2, 0, ebx, 0, z, 1, 1, 0); break; - case 2: RCT2_CALLPROC_X(0x00686B6F, 0, ebx, 0, z, 1, 1, 0); break; - case 3: RCT2_CALLPROC_X(0x00686D31, 0, ebx, 0, z, 1, 1, 0); break; - } + sub_98197C(0, 0, ebx, 0, z, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + return; } if (vehicle->ride_subtype == 0xFF) { From 34e1e773a7acc7f5ce0e1c2d5fada83489d62bb5 Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Sun, 18 Oct 2015 22:40:07 +1000 Subject: [PATCH 0848/1173] Fixes #2080 --- src/windows/ride_list.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/windows/ride_list.c b/src/windows/ride_list.c index ae3cf98b2d..1070bd585b 100644 --- a/src/windows/ride_list.c +++ b/src/windows/ride_list.c @@ -235,7 +235,7 @@ static void window_ride_list_resize(rct_window *w) */ static void window_ride_list_mousedown(int widgetIndex, rct_window*w, rct_widget* widget) { - int numItems, i; + int currentItem, lastItem, count; if (widgetIndex == WIDX_OPEN_CLOSE_ALL) { gDropdownItemsFormat[0] = STR_CLOSE_ALL; @@ -244,23 +244,26 @@ static void window_ride_list_mousedown(int widgetIndex, rct_window*w, rct_widget } else if (widgetIndex == WIDX_INFORMATION_TYPE_DROPDOWN) { widget--; - numItems = 9; - if (w->page != PAGE_RIDES) - numItems -= 5; - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) - numItems--; + if (w->page == PAGE_RIDES) + lastItem = STR_GUESTS_FAVOURITE; + else + lastItem = STR_PROFIT; + + for (count = 0, currentItem = STR_STATUS; currentItem <= lastItem; currentItem++) { + if ((RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) && (currentItem == STR_PROFIT)) + continue; + gDropdownItemsFormat[count] = 1142; + gDropdownItemsArgs[count] = currentItem; + count++; + } - for (i = 0; i < numItems; i++) { - gDropdownItemsFormat[i] = 1142; - gDropdownItemsArgs[i] = STR_STATUS + i; - } window_dropdown_show_text_custom_width( w->x + widget->left, w->y + widget->top, widget->bottom - widget->top, w->colours[1], DROPDOWN_FLAG_STAY_OPEN, - numItems, + count, widget->right - widget->left - 3 ); dropdown_set_checked(_window_ride_list_information_type, true); From 3ee518bf878fedf6a201418b942caa6a0eed15e4 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 18 Oct 2015 14:01:16 +0100 Subject: [PATCH 0849/1173] Define CableLiftVehicle structure --- src/interface/viewport.c | 2 +- src/ride/ride_data.c | 42 ++++++++++++++++++++++++++++++++++++++++ src/ride/ride_data.h | 2 ++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 8aeeabe15b..6adbf8b4d1 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -894,7 +894,7 @@ void viewport_vehicle_paint_setup(rct_vehicle *vehicle, int imageDirection) } if (vehicle->ride_subtype == 0xFF) { - vehicleEntry = (rct_ride_type_vehicle*)0x009DE232; + vehicleEntry = &CableLiftVehicle; } else { rideEntry = GET_RIDE_ENTRY(vehicle->ride_subtype); vehicleEntry = &rideEntry->vehicles[vehicle->vehicle_type]; diff --git a/src/ride/ride_data.c b/src/ride/ride_data.c index ada6fabd7b..5cd410bfae 100644 --- a/src/ride/ride_data.c +++ b/src/ride/ride_data.c @@ -1251,3 +1251,45 @@ const uint32 ShopItemImage[SHOP_ITEM_COUNT] = { 5109, // SHOP_ITEM_ROAST_SAUSAGE 5110, // SHOP_ITEM_EMPTY_BOWL_BLUE }; + +const rct_ride_type_vehicle CableLiftVehicle = { + .var_00 = 0x1F, + .var_02 = 0, + .var_03 = 0, + .var_04 = 0, + .var_08 = 0, + .var_0A = 0, + .pad_0B = 0, + .var_0C = 0x7, + .var_0E = 0, + .var_0F = 0, + .var_10 = 0, + .var_11 = 0, + .var_12 = 0, + .var_14 = 0, + .var_16 = 1, + .base_image_id = 29110, + .var_1C = 0, + .var_20 = 29142, + .var_24 = 29214, + .var_28 = 0, + .var_2C = 0, + .var_30 = 0, + .var_34 = 0, + .var_38 = 0, + .var_3C = 0, + .var_40 = 0, + .var_44 = 0, + .var_48 = 0, + .var_4C = 0, + .no_vehicle_images = 0, + .no_seating_rows = 0, + .pad_55 = { 0,0xFF,0,0,0 }, + .var_5A = 0, + .pad_5B = 0, + .var_5C = 0, + .var_5D = 0, + .pad_5E = { 1,0xE }, + .var_60 = 0, + .peep_loading_positions = NULL +}; \ No newline at end of file diff --git a/src/ride/ride_data.h b/src/ride/ride_data.h index 7e1c2ccb4d..c8731e6f5b 100644 --- a/src/ride/ride_data.h +++ b/src/ride/ride_data.h @@ -95,4 +95,6 @@ extern const money8 DefaultShopItemPrice[SHOP_ITEM_COUNT]; extern const rct_shop_item_string_types ShopItemStringIds[SHOP_ITEM_COUNT]; extern const uint32 ShopItemImage[SHOP_ITEM_COUNT]; +extern const rct_ride_type_vehicle CableLiftVehicle; + #endif From 8c276acde70c39d43d8bdd3e7ba1baa4433c5e0d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 18 Oct 2015 21:16:00 +0100 Subject: [PATCH 0850/1173] fix #2085 --- src/windows/ride_list.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/windows/ride_list.c b/src/windows/ride_list.c index 1070bd585b..835a87eec7 100644 --- a/src/windows/ride_list.c +++ b/src/windows/ride_list.c @@ -195,8 +195,9 @@ static void window_ride_list_mouseup(rct_window *w, int widgetIndex) w->no_list_items = 0; w->frame_no = 0; w->selected_list_item = -1; - if (w->page != PAGE_RIDES && _window_ride_list_information_type > INFORMATION_TYPE_PROFIT) - _window_ride_list_information_type = INFORMATION_TYPE_PROFIT; + if (w->page != PAGE_RIDES && _window_ride_list_information_type > INFORMATION_TYPE_PROFIT) { + _window_ride_list_information_type = INFORMATION_TYPE_STATUS; + } window_invalidate(w); } break; From 7250adaf714f5664f596764bc7be187992a0377f Mon Sep 17 00:00:00 2001 From: Sam Horn Date: Mon, 19 Oct 2015 18:36:45 +1000 Subject: [PATCH 0851/1173] Identify peep->var_C6 --- src/management/marketing.c | 4 ++-- src/peep/peep.c | 36 ++++++++++++++++++++---------------- src/peep/peep.h | 4 ++-- src/peep/staff.c | 6 +++--- src/windows/staff_list.c | 2 +- src/world/park.c | 22 ++++++++++------------ 6 files changed, 38 insertions(+), 36 deletions(-) diff --git a/src/management/marketing.c b/src/management/marketing.c index e7bcf36095..58566554ed 100644 --- a/src/management/marketing.c +++ b/src/management/marketing.c @@ -116,7 +116,7 @@ void marketing_set_guest_campaign(rct_peep *peep, int campaign) peep->voucher_type = VOUCHER_TYPE_RIDE_FREE; peep->voucher_arguments = gMarketingCampaignRideIndex[campaign]; peep->guest_heading_to_ride_id = gMarketingCampaignRideIndex[campaign]; - peep->var_C6 = 240; + peep->peep_is_lost_countdown = 240; break; case ADVERTISING_CAMPAIGN_PARK_ENTRY_HALF_PRICE: peep->item_standard_flags |= PEEP_ITEM_VOUCHER; @@ -131,7 +131,7 @@ void marketing_set_guest_campaign(rct_peep *peep, int campaign) break; case ADVERTISING_CAMPAIGN_RIDE: peep->guest_heading_to_ride_id = gMarketingCampaignRideIndex[campaign]; - peep->var_C6 = 240; + peep->peep_is_lost_countdown = 240; break; } } diff --git a/src/peep/peep.c b/src/peep/peep.c index a89366977f..845d2738cc 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -290,12 +290,12 @@ static void peep_update_hunger(rct_peep *peep){ static void peep_leave_park(rct_peep* peep){ peep->guest_heading_to_ride_id = 0xFF; if (peep->flags & PEEP_FLAGS_LEAVING_PARK){ - if (peep->var_C6 < 60){ + if (peep->peep_is_lost_countdown < 60){ return; } } else{ - peep->var_C6 = 254; + peep->peep_is_lost_countdown = 254; peep->flags |= PEEP_FLAGS_LEAVING_PARK; peep->flags &= ~PEEP_FLAGS_PARK_ENTRANCE_CHOSEN; } @@ -899,16 +899,18 @@ void peep_check_if_lost(rct_peep* peep){ * Check if cant find ride. */ void peep_check_cant_find_ride(rct_peep* peep){ - if (peep->guest_heading_to_ride_id == 0xFF) return; + if (peep->guest_heading_to_ride_id == 0xFF) + return; - if (peep->var_C6 == 30 || peep->var_C6 == 60){ + // Peeps will think "I can't find ride X" twice before giving up completely. + if (peep->peep_is_lost_countdown == 30 || peep->peep_is_lost_countdown == 60) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_FIND, peep->guest_heading_to_ride_id); - peep->happiness_growth_rate = max(peep->happiness_growth_rate - 30, 0); } - peep->var_C6--; - if (peep->var_C6 != 0)return; + peep->peep_is_lost_countdown--; + if (peep->peep_is_lost_countdown != 0) + return; peep->guest_heading_to_ride_id = 0xFF; rct_window* w = window_find_by_number(WC_PEEP, peep->sprite_index); @@ -924,15 +926,17 @@ void peep_check_cant_find_ride(rct_peep* peep){ * Check if cant find exit. */ void peep_check_cant_find_exit(rct_peep* peep){ - if (!(peep->flags & PEEP_FLAGS_LEAVING_PARK))return; + if (!(peep->flags & PEEP_FLAGS_LEAVING_PARK)) + return; - if (peep->var_C6 == 1){ + // Peeps who can't find the park exit will continue to get less happy until they find it. + if (peep->peep_is_lost_countdown == 1) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_FIND_EXIT, 0xFF); - peep->happiness_growth_rate = max(peep->happiness_growth_rate - 30, 0); } - if (--peep->var_C6 == 0) peep->var_C6 = 90; + if (--peep->peep_is_lost_countdown == 0) + peep->peep_is_lost_countdown = 90; } /* rct2: 0x6939EB @@ -6884,7 +6888,7 @@ uint8 sub_69A60A(rct_peep* peep){ } if (peep->flags & PEEP_FLAGS_LEAVING_PARK && - peep->var_C6 < 90){ + peep->peep_is_lost_countdown < 90){ return 16; } @@ -7819,7 +7823,7 @@ static void peep_on_exit_ride(rct_peep *peep, int rideIndex) if (peep_should_go_on_ride_again(peep, ride)) { peep->guest_heading_to_ride_id = rideIndex; - peep->var_C6 = 200; + peep->peep_is_lost_countdown = 200; sub_69A98C(peep); rct_window *w = window_find_by_number(WC_PEEP, peep->sprite_index); @@ -8666,7 +8670,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) // Head to that ride peep->guest_heading_to_ride_id = mostExcitingRideIndex; - peep->var_C6 = 200; + peep->peep_is_lost_countdown = 200; sub_69A98C(peep); // Invalidate windows @@ -8777,7 +8781,7 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) // Head to that ride peep->guest_heading_to_ride_id = closestRideIndex; - peep->var_C6 = 200; + peep->peep_is_lost_countdown = 200; sub_69A98C(peep); // Invalidate windows @@ -8889,7 +8893,7 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl // Head to that ride peep->guest_heading_to_ride_id = closestRideIndex; - peep->var_C6 = 200; + peep->peep_is_lost_countdown = 200; sub_69A98C(peep); // Invalidate windows diff --git a/src/peep/peep.h b/src/peep/peep.h index 4489580c6e..fa1fb85201 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -494,8 +494,8 @@ typedef struct { uint8 guest_heading_to_ride_id; // 0xC5 }; union { - uint8 staff_orders; // 0xC6 - uint8 var_C6; + uint8 staff_orders; // 0xC6 + uint8 peep_is_lost_countdown; // 0xC6 }; uint8 photo1_ride_ref; // 0xC7 uint32 flags; // 0xC8 diff --git a/src/peep/staff.c b/src/peep/staff.c index 2edcd7e1f5..1a23c2cf3e 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -142,12 +142,12 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, newPeep->paid_on_food = 0; newPeep->paid_on_souvenirs = 0; - newPeep->var_C6 = 0; + newPeep->staff_orders = 0; if (staff_type == 0) { - newPeep->var_C6 = 7; + newPeep->staff_orders = 7; } else if (staff_type == 1) { - newPeep->var_C6 = 3; + newPeep->staff_orders = 3; } uint16 idSearchSpriteIndex; diff --git a/src/windows/staff_list.c b/src/windows/staff_list.c index 68c3b8134a..cff9782bbb 100644 --- a/src/windows/staff_list.c +++ b/src/windows/staff_list.c @@ -656,7 +656,7 @@ void window_staff_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int sc staffOrderIcon_x = 0x7D; if (peep->staff_type != 3) { - staffOrders = peep->var_C6; + staffOrders = peep->staff_orders; staffOrderSprite = RCT2_ADDRESS(0x00992A08, uint32)[selectedTab]; while (staffOrders != 0) { diff --git a/src/world/park.c b/src/world/park.c index 739cfaa6c8..1b7dc588d2 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -170,7 +170,7 @@ int calculate_park_rating() int result; result = 1150; - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & 0x4000) + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_DIFFICULT_PARK_RATING) result = 1050; // Guests @@ -178,23 +178,21 @@ int calculate_park_rating() rct_peep* peep; uint16 spriteIndex; int num_happy_peeps; - short _bp; + int num_lost_guests; // -150 to +3 based on a range of guests from 0 to 2000 result -= 150 - (min(2000, RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16)) / 13); - // Guests, happiness, ? + // Find the number of happy peeps and the number of peeps who can't find the park exit num_happy_peeps = 0; - _bp = 0; + num_lost_guests = 0; FOR_ALL_GUESTS(spriteIndex, peep) { if (peep->outside_of_park != 0) continue; if (peep->happiness > 128) num_happy_peeps++; - if (!(peep->flags & PEEP_FLAGS_LEAVING_PARK)) - continue; - if (peep->var_C6 <= 89) - _bp++; + if ((peep->flags & PEEP_FLAGS_LEAVING_PARK) && (peep->peep_is_lost_countdown < 90)) + num_lost_guests++; } // Peep happiness -500 to +0 @@ -203,10 +201,10 @@ int calculate_park_rating() if (RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) > 0) result += 2 * min(250, (num_happy_peeps * 300) / RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16)); - // ? - _bp -= 25; - if (_bp >= 0) - result -= _bp * 7; + // Up to 25 guests can be lost without affecting the park rating. + num_lost_guests -= 25; + if (num_lost_guests > 0) + result -= num_lost_guests * 7; } // Rides From 3f992092190d58f5f24506d60bd0377cfc7d6f60 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 19 Oct 2015 12:20:21 +0100 Subject: [PATCH 0852/1173] Refactor calculate_park_rating logic ...to avoid changing a local variable's meaning. --- src/world/park.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/world/park.c b/src/world/park.c index 1b7dc588d2..267061dac9 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -202,9 +202,8 @@ int calculate_park_rating() result += 2 * min(250, (num_happy_peeps * 300) / RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16)); // Up to 25 guests can be lost without affecting the park rating. - num_lost_guests -= 25; - if (num_lost_guests > 0) - result -= num_lost_guests * 7; + if (num_lost_guests > 25) + result -= (num_lost_guests - 25) * 7; } // Rides From d5701639582f5002516b67d661649dc147fcb740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Mon, 19 Oct 2015 20:27:27 +0200 Subject: [PATCH 0853/1173] Fix types Bunch of type fixes --- src/localisation/localisation.c | 2 +- src/object.c | 18 +++++++++--------- src/object.h | 2 +- src/peep/peep.c | 4 ++-- src/platform/platform.h | 2 +- src/platform/shared.c | 2 +- src/rct1.c | 4 ++-- src/ride/track.c | 18 +++++++++--------- src/title.c | 3 ++- 9 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 9f44cf7454..edd237f716 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -430,7 +430,7 @@ void format_length(char **dest, sint16 value) stringId--; } - uint16 *argRef = &value; + sint16 *argRef = &value; format_string_part(dest, stringId, (char**)&argRef); (*dest)--; } diff --git a/src/object.c b/src/object.c index 3bf78c483d..85d69ccab6 100644 --- a/src/object.c +++ b/src/object.c @@ -80,7 +80,7 @@ int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSi // Read chunk size *chunkSize = *((uint32*)installedObject_pointer); - char *chunk; + uint8 *chunk; if (*chunkSize == 0xFFFFFFFF) { chunk = rct2_malloc(0x600000); @@ -137,7 +137,7 @@ int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSi memcpy(extended_entry, &openedEntry, sizeof(rct_object_entry)); extended_entry->chunk_size = *chunkSize; - RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_CHUNK_POINTER, char*) = chunk; + RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_CHUNK_POINTER, uint8*) = chunk; if (RCT2_GLOBAL(0x9ADAFD, uint8) != 0) object_paint(objectType, 0, groupIndex, objectType, 0, (int)chunk, 0, 0); @@ -347,7 +347,7 @@ void object_unload(rct_object_entry *entry) object_paint(object_type, 1, 0, 0, 0, (int)chunk, 0, 0); rct2_free(chunk); - object_entry_groups[object_type].chunks[object_index] = (char*)-1; + object_entry_groups[object_type].chunks[object_index] = (uint8*)-1; } int object_entry_compare(const rct_object_entry *a, const rct_object_entry *b) @@ -375,7 +375,7 @@ int object_entry_compare(const rct_object_entry *a, const rct_object_entry *b) return 1; } -int object_calculate_checksum(const rct_object_entry *entry, const char *data, int dataLength) +int object_calculate_checksum(const rct_object_entry *entry, const uint8 *data, int dataLength) { int i; const char *eee = (char*)entry; @@ -458,7 +458,7 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp chunk += 0x60; } - sint8* peep_loading_positions = chunk; + sint8* peep_loading_positions = (sint8 *)chunk; // Peep loading positions variable size // 4 different vehicle subtypes are available for (int i = 0; i < 4; ++i){ @@ -642,8 +642,8 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp set_vehicle_type_image_max_sizes(rideVehicleEntry, num_images); } - uint8 no_positions = *peep_loading_positions++; - if (no_positions == 0xFF) + sint8 no_positions = *peep_loading_positions++; + if (no_positions == -1) { // The no_positions is 16 bit skip over peep_loading_positions += 2; @@ -1528,7 +1528,7 @@ int object_get_scenario_text(rct_object_entry *entry) // Read chunk int chunkSize = *((uint32*)pos); - char *chunk; + uint8 *chunk; if (chunkSize == 0xFFFFFFFF) { chunk = malloc(0x600000); chunkSize = sawyercoding_read_chunk(rw, chunk); @@ -1649,5 +1649,5 @@ char *object_get_name(rct_object_entry *entry) // Skip no of images pos += 4; - return pos; + return (char *)pos; } diff --git a/src/object.h b/src/object.h index 50ebf7cc86..a980e6d0c8 100644 --- a/src/object.h +++ b/src/object.h @@ -108,7 +108,7 @@ int object_get_scenario_text(rct_object_entry *entry); void object_free_scenario_text(); int object_get_length(rct_object_entry *entry); int object_entry_compare(const rct_object_entry *a, const rct_object_entry *b); -int object_calculate_checksum(const rct_object_entry *entry, const char *data, int dataLength); +int object_calculate_checksum(const rct_object_entry *entry, const uint8 *data, int dataLength); int object_paint(int type, int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); rct_object_entry *object_get_next(rct_object_entry *entry); int write_object_file(SDL_RWops* rw, rct_object_entry* entry); diff --git a/src/peep/peep.c b/src/peep/peep.c index 845d2738cc..41edb3b2f7 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -9017,7 +9017,7 @@ money32 set_peep_name(int flags, int state, uint16 sprite_index, uint8* text_1, RCT2_GLOBAL(0x00F1AEF4, uint16) = sprite_index; } - uint8* fullText = RCT2_ADDRESS(0x00F1AEF6, uint8); + utf8* fullText = RCT2_ADDRESS(0x00F1AEF6, utf8); if (flags & GAME_COMMAND_FLAG_APPLY) { uint8 position = (state - 1) % 3; memcpy(fullText + position * 12, text_1, 4); @@ -9030,7 +9030,7 @@ money32 set_peep_name(int flags, int state, uint16 sprite_index, uint8* text_1, rct_peep* peep = GET_PEEP(sprite_index); RCT2_GLOBAL(0x0013CE952, uint32) = peep->id; - uint8* curName = RCT2_ADDRESS(0x00141ED68, uint8); + utf8* curName = RCT2_ADDRESS(0x00141ED68, utf8); rct_string_id curId = peep->name_string_idx; format_string(curName, curId, RCT2_ADDRESS(0x0013CE952, void)); diff --git a/src/platform/platform.h b/src/platform/platform.h index 0929c215e3..a67fe3c701 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -98,7 +98,7 @@ void platform_get_closest_resolution(int inWidth, int inHeight, int *outWidth, i void platform_init(); void platform_draw(); void platform_free(); -void platform_update_palette(char *colours, int start_index, int num_colours); +void platform_update_palette(const uint8 *colours, int start_index, int num_colours); void platform_set_fullscreen_mode(int mode); void platform_set_cursor(char cursor); void platform_refresh_video(); diff --git a/src/platform/shared.c b/src/platform/shared.c index de47d4caf6..60898cad58 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -347,7 +347,7 @@ static uint8 lerp(uint8 a, uint8 b, float t) return (uint8)(a + amount); } -void platform_update_palette(char* colours, int start_index, int num_colours) +void platform_update_palette(const uint8* colours, int start_index, int num_colours) { SDL_Surface *surface; int i; diff --git a/src/rct1.c b/src/rct1.c index e5c84f1e41..d373ea9488 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -67,7 +67,7 @@ static void sub_69E891(); bool rct1_read_sc4(const char *path, rct1_s4 *s4) { - char *buffer, *decodedBuffer; + uint8 *buffer, *decodedBuffer; long length, decodedLength; bool success; @@ -97,7 +97,7 @@ bool rct1_read_sc4(const char *path, rct1_s4 *s4) bool rct1_read_sv4(const char *path, rct1_s4 *s4) { - char *buffer, *decodedBuffer; + uint8 *buffer, *decodedBuffer; long length, decodedLength; bool success; diff --git a/src/ride/track.c b/src/ride/track.c index a263cb5ee6..682339b092 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -341,7 +341,7 @@ void track_list_populate(ride_list_item item, uint8* track_list_cache){ uint8 cur_track_entry_index = 0; for (uint8 track_type = *track_pointer++; track_type != 0xFE; - track_pointer += strlen(track_pointer) + 1, + track_pointer += strlen((const char *)track_pointer) + 1, track_type = *track_pointer++){ rct_object_entry* track_object = (rct_object_entry*)track_pointer; track_pointer += sizeof(rct_object_entry); @@ -379,7 +379,7 @@ void track_list_populate(ride_list_item item, uint8* track_list_cache){ uint8 track_entry_index = 0; uint8 isBelow = 0; for (; track_entry_index != cur_track_entry_index; track_entry_index++){ - if (strcicmp(track_pointer, &RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8)[track_entry_index * 128]) < 0){ + if (strcicmp((const char *)track_pointer, &RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, const char)[track_entry_index * 128]) < 0){ isBelow = 1; break; } @@ -392,7 +392,7 @@ void track_list_populate(ride_list_item item, uint8* track_list_cache){ (cur_track_entry_index - track_entry_index) * 128); } - strcpy(&RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8)[track_entry_index * 128], track_pointer); + strcpy(&RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, char)[track_entry_index * 128], (const char *)track_pointer); cur_track_entry_index++; } @@ -458,7 +458,7 @@ void track_load_list(ride_list_item item) new_file_pointer += sizeof(rct_object_entry); int file_name_length = strlen(enumFileInfo.path); - strcpy(new_file_pointer, enumFileInfo.path); + strcpy((char *)new_file_pointer, enumFileInfo.path); new_file_pointer += file_name_length + 1; } platform_enumerate_files_end(enumFileHandle); @@ -480,7 +480,7 @@ void track_load_list(ride_list_item item) free(track_list_cache); } -static void copy(void *dst, char **src, int length) +static void copy(void *dst, uint8 **src, int length) { memcpy(dst, *src, length); *src += length; @@ -512,7 +512,7 @@ rct_track_td6* load_track_design(const char *path) { SDL_RWops *fp; int fpLength; - char *fpBuffer, *decoded, *src; + uint8 *fpBuffer, *decoded, *src; int i, decodedLength; uint8* edi; @@ -1995,7 +1995,7 @@ int sub_6D2189(int* cost, uint8* ride_id){ rct_ride* ride = GET_RIDE(*ride_id); - uint8* ride_name = RCT2_ADDRESS(0x9E3504, uint8); + const utf8* ride_name = RCT2_ADDRESS(0x9E3504, const utf8); rct_string_id new_ride_name = user_string_allocate(132, ride_name); if (new_ride_name){ @@ -2229,7 +2229,7 @@ rct_track_design *track_get_info(int index, uint8** preview) RCT2_ADDRESS(RCT2_ADDRESS_TRACK_DESIGN_INDEX_CACHE, uint32)[i] = index; char track_path[MAX_PATH] = { 0 }; - subsitute_path(track_path, (char*)RCT2_ADDRESS_TRACKS_PATH, trackDesignList + (index * 128)); + subsitute_path(track_path, (char*)RCT2_ADDRESS_TRACKS_PATH, (char *)trackDesignList + (index * 128)); rct_track_td6* loaded_track = NULL; @@ -2973,7 +2973,7 @@ int save_track_to_file(rct_track_td6* track_design, char* path) uint8* track_file = malloc(0x8000); - int length = sawyercoding_encode_td6((char*)track_design, track_file, 0x609F); + int length = sawyercoding_encode_td6((uint8 *)track_design, track_file, 0x609F); SDL_RWops *file; diff --git a/src/title.c b/src/title.c index 6da72cecfa..ac5ac2040d 100644 --- a/src/title.c +++ b/src/title.c @@ -677,7 +677,8 @@ bool title_refresh_sequence() } } if (hasLoad && (hasWait || !hasRestart) && !hasInvalidSave) { - uint8 *src, *scriptPtr, *binaryScript; + char *src; + uint8 *scriptPtr, *binaryScript; binaryScript = malloc(1024 * 8); scriptPtr = binaryScript; From 773066502321bfb8a38371c9be92df60273a0770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Mon, 19 Oct 2015 20:45:04 +0200 Subject: [PATCH 0854/1173] Cache expression in gfx_rle_sprite_to_buffer --- src/drawing/sprite.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index c343ee1ebf..0fc5ef7609 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -265,9 +265,11 @@ void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_point uint8* next_source_pointer; uint8* next_dest_pointer = dest_bits_pointer; + int lineWidth = (dpi->width / zoom_amount) + dpi->pitch; + if (source_y_start < 0){ source_y_start += zoom_amount; - next_dest_pointer += dpi->width / zoom_amount + dpi->pitch; + next_dest_pointer += lineWidth; height -= zoom_amount; } @@ -365,7 +367,7 @@ void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_point } //Add a line to the drawing surface pointer - next_dest_pointer += dpi->width / zoom_amount + dpi->pitch; + next_dest_pointer += lineWidth; } } From 328c42d5d521904bec394b41d95fd3a678e9c967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Mon, 19 Oct 2015 20:50:52 +0200 Subject: [PATCH 0855/1173] Use same naming convention --- src/drawing/sprite.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index 0fc5ef7609..b9e0c2f391 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -265,11 +265,11 @@ void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_point uint8* next_source_pointer; uint8* next_dest_pointer = dest_bits_pointer; - int lineWidth = (dpi->width / zoom_amount) + dpi->pitch; + int line_width = (dpi->width / zoom_amount) + dpi->pitch; if (source_y_start < 0){ source_y_start += zoom_amount; - next_dest_pointer += lineWidth; + next_dest_pointer += line_width; height -= zoom_amount; } @@ -367,7 +367,7 @@ void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_point } //Add a line to the drawing surface pointer - next_dest_pointer += lineWidth; + next_dest_pointer += line_width; } } From 4f4f434c5a9e159cbbbf1050959c8b6ca01b86c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Mon, 19 Oct 2015 22:55:16 +0200 Subject: [PATCH 0856/1173] Bit shifting --- src/drawing/sprite.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index b9e0c2f391..28529b1038 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -265,7 +265,7 @@ void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_point uint8* next_source_pointer; uint8* next_dest_pointer = dest_bits_pointer; - int line_width = (dpi->width / zoom_amount) + dpi->pitch; + int line_width = (dpi->width >> zoom_level) + dpi->pitch; if (source_y_start < 0){ source_y_start += zoom_amount; @@ -311,7 +311,7 @@ void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_point if (x_start > 0){ //Since the start is positive //We need to move the drawing surface to the correct position - dest_pointer += x_start / zoom_amount; + dest_pointer += x_start >> zoom_level; } else{ //If the start is negative we require to remove part of the image. From ad7d2b3c00c141e12c5da5207e93b7f499dab2b7 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 20 Oct 2015 04:00:17 +0100 Subject: [PATCH 0857/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/french.txt | 1299 +++++++++++++++++++------------------- data/language/german.txt | 12 + 2 files changed, 662 insertions(+), 649 deletions(-) diff --git a/data/language/french.txt b/data/language/french.txt index dd0503da08..ccbf835f24 100644 --- a/data/language/french.txt +++ b/data/language/french.txt @@ -3,85 +3,85 @@ # Use # at the beginning of a line to leave a comment. STR_0000 : STR_0001 :{STRINGID} {COMMA16} -STR_0002 :Spiral Roller Coaster -STR_0003 :Stand-up Roller Coaster +STR_0002 :Montagnes russes en spirales +STR_0003 :Montagnes russes debout STR_0004 :Suspended Swinging Coaster -STR_0005 :Inverted Roller Coaster -STR_0006 :Junior Roller Coaster -STR_0007 :Miniature Railway +STR_0005 :Montagnes russes inversées +STR_0006 :Montagnes russes junior +STR_0007 :Chemin de fer miniature STR_0008 :Monorail -STR_0009 :Mini Suspended Coaster +STR_0009 :Mini montagnes russes suspendues STR_0010 :Boat Hire STR_0011 :Wooden Wild Mouse STR_0012 :Steeplechase -STR_0013 :Car Ride +STR_0013 :Balade en voiture STR_0014 :Launched Freefall STR_0015 :Bobsleigh Coaster -STR_0016 :Observation Tower +STR_0016 :Tour d'observation STR_0017 :Looping Roller Coaster STR_0018 :Dinghy Slide -STR_0019 :Mine Train Coaster +STR_0019 :Train de la mine STR_0020 :Chairlift STR_0021 :Corkscrew Roller Coaster -STR_0022 :Maze -STR_0023 :Spiral Slide +STR_0022 :Labyrinthe +STR_0023 :Toboggan spiral STR_0024 :Go Karts STR_0025 :Log Flume STR_0026 :River Rapids STR_0027 :Dodgems -STR_0028 :Pirate Ship +STR_0028 :Bateau pirate STR_0029 :Swinging Inverter Ship -STR_0030 :Food Stall +STR_0030 :Stand de nourriture STR_0031 :Unknown Stall (1D) -STR_0032 :Drink Stall +STR_0032 :Stand de boissons STR_0033 :Unknown Stall (1F) -STR_0034 :Shop -STR_0035 :Merry-Go-Round +STR_0034 :Boutique +STR_0035 :Manège STR_0036 :Unknown Stall (22) -STR_0037 :Information Kiosk -STR_0038 :Toilets -STR_0039 :Ferris Wheel -STR_0040 :Motion Simulator -STR_0041 :3D Cinema +STR_0037 :Kiosque d'information +STR_0038 :Toilettes +STR_0039 :Grande roue +STR_0040 :Simulateur de mouvements +STR_0041 :Cinéma 3D STR_0042 :Top Spin -STR_0043 :Space Rings +STR_0043 :Anneaux de l'espace STR_0044 :Reverse Freefall Coaster -STR_0045 :Lift +STR_0045 :Ascenseur STR_0046 :Vertical Drop Roller Coaster -STR_0047 :Cash Machine +STR_0047 :Distributeur de monnaie STR_0048 :Twist -STR_0049 :Haunted House -STR_0050 :First Aid Room -STR_0051 :Circus Show -STR_0052 :Ghost Train +STR_0049 :Maison hantée +STR_0050 :Infirmerie +STR_0051 :Spectacle de cirque +STR_0052 :Train fantôme STR_0053 :Steel Twister Roller Coaster -STR_0054 :Wooden Roller Coaster +STR_0054 :Montagnes russes en bois STR_0055 :Side-Friction Roller Coaster -STR_0056 :Wild Mouse +STR_0056 :Souris sauvage STR_0057 :Multi-Dimension Roller Coaster STR_0058 :Unknown Ride (38) -STR_0059 :Flying Roller Coaster +STR_0059 :Montagnes russes volantes STR_0060 :Unknown Ride (3A) STR_0061 :Virginia Reel STR_0062 :Splash Boats -STR_0063 :Mini Helicopters +STR_0063 :Mini hélicoptères STR_0064 :Lay-down Roller Coaster -STR_0065 :Suspended Monorail +STR_0065 :Monorail suspendu STR_0066 :Unknown Ride (40) STR_0067 :Reverser Roller Coaster STR_0068 :Heartline Twister Coaster -STR_0069 :Mini Golf +STR_0069 :Mini-golf STR_0070 :Giga Coaster STR_0071 :Roto-Drop STR_0072 :Flying Saucers -STR_0073 :Crooked House +STR_0073 :Maison bizarre STR_0074 :Monorail Cycles STR_0075 :Compact Inverted Coaster STR_0076 :Water Coaster STR_0077 :Air Powered Vertical Coaster STR_0078 :Inverted Hairpin Coaster -STR_0079 :Magic Carpet -STR_0080 :Submarine Ride +STR_0079 :Tapis volant +STR_0080 :Balade sous-marine STR_0081 :River Rafts STR_0082 :Unknown Ride (50) STR_0083 :Enterprise @@ -90,7 +90,7 @@ STR_0085 :Unknown Ride (53) STR_0086 :Unknown Ride (54) STR_0087 :Unknown Ride (55) STR_0088 :Inverted Impulse Coaster -STR_0089 :Mini Roller Coaster +STR_0089 :Mini montagnes russes STR_0090 :Mine Ride STR_0091 :Unknown Ride (59) STR_0092 :LIM Launched Roller Coaster @@ -823,22 +823,22 @@ STR_0818 :Sep STR_0819 :Oct STR_0820 :Nov STR_0821 :Déc -STR_0822 :Unable to access graphic data file -STR_0823 :Missing or inaccessible data file +STR_0822 :Impossible d'accéder au fichier de données graphiques +STR_0823 :Fichier de données manquant ou inaccessible STR_0824 :{BLACK}{CROSS} -STR_0825 :Chosen name in use already -STR_0826 :Too many names defined -STR_0827 :Not enough cash - requires {CURRENCY2DP} -STR_0828 :{SMALLFONT}{BLACK}Close window -STR_0829 :{SMALLFONT}{BLACK}Window title - Drag this to move window -STR_0830 :{SMALLFONT}{BLACK}Zoom view in -STR_0831 :{SMALLFONT}{BLACK}Zoom view out -STR_0832 :{SMALLFONT}{BLACK}Rotate view 90{DEGREE} clockwise -STR_0833 :{SMALLFONT}{BLACK}Pause game -STR_0834 :{SMALLFONT}{BLACK}Disk and game options -STR_0835 :Game initialization failed -STR_0836 :Unable to start game in a minimised state -STR_0837 :Unable to initialise graphics system +STR_0825 :Nom choisi déjà utilisé +STR_0826 :Trop de noms définis +STR_0827 :Pas assez d'argent - Nécessite {CURRENCY2DP} +STR_0828 :{SMALLFONT}{BLACK}Fermer la fenêtre +STR_0829 :{SMALLFONT}{BLACK}Titre de la fenêtre - Faites glisser ceci pour déplacer la fenêtre +STR_0830 :{SMALLFONT}{BLACK}Zoomer sur la vue +STR_0831 :{SMALLFONT}{BLACK}Dézoomer sur la vue +STR_0832 :{SMALLFONT}{BLACK}Tourner la vue de 90{DEGREE} dans le sens des aiguilles d'une montre +STR_0833 :{SMALLFONT}{BLACK}Mettre en pause le jeu +STR_0834 :{SMALLFONT}{BLACK}Options du jeu et du disque +STR_0835 :L'initialisation du jeu a échouée +STR_0836 :Impossible de démarrer le jeu minimisé +STR_0837 :Impossible d'initialiser le système de graphiques STR_0838 : STR_0839 :{UINT16} x {UINT16} STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} @@ -849,7 +849,8 @@ STR_0843 : STR_0844 : STR_0845 : STR_0846 : -STR_0847 :A propos 'OpenRCT2' +#end +STR_0847 :A propos d'OpenRCT2 STR_0848 :RollerCoaster Tycoon 2 STR_0849 :{WINDOW_COLOUR_2}Version 2.01.028 STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, tous droits réservés @@ -879,67 +880,67 @@ STR_0873 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_0874 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_0875 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_0876 :{BLACK}{DOWN} -STR_0877 :Trop bas ! -STR_0878 :Trop haut ! -STR_0879 :Ne peut pas abaisser le terrain ici... -STR_0880 :Ne peut pas élever le terrain ici... +STR_0877 :Trop bas! +STR_0878 :Trop haut! +STR_0879 :Impossible d'abaisser le terrain ici... +STR_0880 :Impossible de surélever le terrain ici... STR_0881 :Objet dans le passage -STR_0882 :Charger une partie -STR_0883 :Sauvegarder la partie -STR_0884 :Load Landscape -STR_0885 :Save Landscape +STR_0882 :Charger partie +STR_0883 :Sauvegarder partie +STR_0884 :Charger paysage +STR_0885 :Sauvegarder paysage STR_0886 :Quitter la partie -STR_0887 :Quitter l'Editeur de scénario -STR_0888 :Quitter Roller Coaster Designer -STR_0889 :Quit Track Designs Manager +STR_0887 :Quitter l'Éditeur de scénario +STR_0888 :Quitter le concepteur de montagnes russes +STR_0889 :Quitter le gestionnaire des voies STR_0890 :SCR{COMMA16}.BMP STR_0891 :Capture d'écran -STR_0892 :Capture sauvegardée en tant que '{STRINGID}' -STR_0893 :Capture échouée ! +STR_0892 :Capture d'écran sauvegardée en tant que '{STRINGID}' +STR_0893 :La capture d'écran a échouée! STR_0894 :Landscape data area full ! -STR_0895 :Can't build partly above and partly below ground +STR_0895 :Impossible de construire partiellement au dessus et partiellement en dessous du sol STR_0896 :{POP16}{POP16}{STRINGID} Construction STR_0897 :Direction STR_0898 :{SMALLFONT}{BLACK}Courbe à gauche STR_0899 :{SMALLFONT}{BLACK}Courbe à droite -STR_0900 :{SMALLFONT}{BLACK}Courbe à gauche (petit radius) -STR_0901 :{SMALLFONT}{BLACK}Courbe à droite (petit radius) -STR_0902 :{SMALLFONT}{BLACK}Courbe à gauche (très petit radius) -STR_0903 :{SMALLFONT}{BLACK}Courbe à droite (très petit radius) -STR_0904 :{SMALLFONT}{BLACK}Courbe à gauche (grand radius) -STR_0905 :{SMALLFONT}{BLACK}Courbe à droite (grand radius) +STR_0900 :{SMALLFONT}{BLACK}Courbe à gauche (petit rayon) +STR_0901 :{SMALLFONT}{BLACK}Courbe à droite (petit rayon) +STR_0902 :{SMALLFONT}{BLACK}Courbe à gauche (très petit rayon) +STR_0903 :{SMALLFONT}{BLACK}Courbe à droite (très petit rayon) +STR_0904 :{SMALLFONT}{BLACK}Courbe à gauche (grand rayon) +STR_0905 :{SMALLFONT}{BLACK}Courbe à droite (grand rayon) STR_0906 :{SMALLFONT}{BLACK}Droit STR_0907 :Pente STR_0908 :Roll/Banking -STR_0909 :Seat Rot. +STR_0909 :Rot. des sièges. STR_0910 :{SMALLFONT}{BLACK}Roll for left-hand curve STR_0911 :{SMALLFONT}{BLACK}Roll for right-hand curve STR_0912 :{SMALLFONT}{BLACK}No roll -STR_0913 :{SMALLFONT}{BLACK}Move to previous section -STR_0914 :{SMALLFONT}{BLACK}Move to next section +STR_0913 :{SMALLFONT}{BLACK}Aller à la section précédente +STR_0914 :{SMALLFONT}{BLACK}Aller à la section suivante STR_0915 :{SMALLFONT}{BLACK}Construct the selected section STR_0916 :{SMALLFONT}{BLACK}Remove the highlighted section -STR_0917 :{SMALLFONT}{BLACK}Vertical drop +STR_0917 :{SMALLFONT}{BLACK}Chute verticale STR_0918 :{SMALLFONT}{BLACK}Steep slope down STR_0919 :{SMALLFONT}{BLACK}Slope down STR_0920 :{SMALLFONT}{BLACK}Niveau STR_0921 :{SMALLFONT}{BLACK}Slope up STR_0922 :{SMALLFONT}{BLACK}Steep slope up STR_0923 :{SMALLFONT}{BLACK}Vertical rise -STR_0924 :{SMALLFONT}{BLACK}Helix down -STR_0925 :{SMALLFONT}{BLACK}Helix up -STR_0926 :Ne peut pas enlever ceci... -STR_0927 :Ne peut pas construire ici... +STR_0924 :{SMALLFONT}{BLACK}Hélice descendante +STR_0925 :{SMALLFONT}{BLACK}Hélice montante +STR_0926 :Impossible de supprimer ceci... +STR_0927 :Impossible de construire ceci ici... STR_0928 :{SMALLFONT}{BLACK}Chain lift, to pull cars up slopes -STR_0929 :Courbure 'S' (gauche) -STR_0930 :Courbure 'S' (droite) +STR_0929 :Courbe en 'S' (gauche) +STR_0930 :Courbe en 'S' (droite) STR_0931 :Boucle verticale (gauche) STR_0932 :Boucle verticale (droite) -STR_0933 :Raise or lower land first -STR_0934 :Ride entrance in the way -STR_0935 :Ride exit in the way -STR_0936 :Park entrance in the way -STR_0937 :{SMALLFONT}{BLACK}View options +STR_0933 :Surélevez ou abaissez le terrain d'abord +STR_0934 :Entrée de l'attraction dans le passage +STR_0935 :Sortie de l'attraction dans le passage +STR_0936 :Entrée du parc dans le passage +STR_0937 :{SMALLFONT}{BLACK}Voir les options STR_0938 :{SMALLFONT}{BLACK}Adjust land height and slope STR_0939 :Vue souterraine/intérieure STR_0940 :Supprimer surface de base @@ -949,15 +950,15 @@ STR_0943 :Décor transparent STR_0944 :Sauvegarder STR_0945 :Ne pas sauvegarder STR_0946 :Annuler -STR_0947 :Save this before loading ? -STR_0948 :Save this before quitting ? -STR_0949 :Save this before quitting ? +STR_0947 :Sauvegarder ceci avant de charger ? +STR_0948 :Sauvegarder ceci avant de quitter ? +STR_0949 :Sauvegarder ceci avant de quitter ? STR_0950 :Charger une partie STR_0951 :Quitter la partie STR_0952 :Quitter la partie -STR_0953 :Load Landscape +STR_0953 :Charger le paysage STR_0954 : -STR_0955 :{SMALLFONT}{BLACK}Select seat rotation angle for this track section +STR_0955 :{SMALLFONT}{BLACK}Sélectionnez l'angle de rotation des sièges pour cette section de voie STR_0956 :-180{DEGREE} STR_0957 :-135{DEGREE} STR_0958 :-90{DEGREE} @@ -978,7 +979,7 @@ STR_0972 :Annuler STR_0973 :OK STR_0974 :Attractions STR_0975 :Magasins et stands -STR_0976 :Toilettes et Kiosques d'Information +STR_0976 :Toilettes et kiosques d'information STR_0977 :Nouveaux moyens de transport STR_0978 :Nouvelles attractions calmes STR_0979 :Nouvelles montagnes russes @@ -989,27 +990,27 @@ STR_0983 :Recherche & Développement STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP} STR_0986 :{BLACK}{CURRENCY2DP} -STR_0987 :Too many rides/attractions -STR_0988 :Can't create new ride/attraction... +STR_0987 :Trop d'attractions +STR_0988 :Impossible de créer une nouvelle attraction... STR_0989 :{STRINGID} STR_0990 :{SMALLFONT}{BLACK}Construction STR_0991 :Quai -STR_0992 :{SMALLFONT}{BLACK}Démolire toute l'attraction -STR_0993 :Démolire l'attraction -STR_0994 :Démolire +STR_0992 :{SMALLFONT}{BLACK}Démolir toute l'attraction +STR_0993 :Démolir l'attraction +STR_0994 :Démolir STR_0995 :{WINDOW_COLOUR_1}Êtes-vous vraiment sûr de vouloir démolir {STRINGID}? STR_0996 :Vue générale STR_0997 :{SMALLFONT}{BLACK}Vue sur la sélection STR_0998 :Plus de stations autorisées sur cette attraction STR_0999 :Nécessite un quai -STR_1000 :Le circuit n'est pas complet -STR_1001 :Le circuit est inadapté à ce type de train -STR_1002 :Ne peut pas ouvrir {POP16}{POP16}{POP16}{STRINGID}... -STR_1003 :Ne peut pas tester {POP16}{POP16}{POP16}{STRINGID}... -STR_1004 :Ne peut pas fermer {POP16}{POP16}{POP16}{STRINGID}... -STR_1005 :Ne peut pas construire sur {POP16}{POP16}{POP16}{STRINGID}... +STR_1000 :La voie n'est pas un circuit complet +STR_1001 :La voie est inadaptée à ce type de train +STR_1002 :Impossible d'ouvrir {POP16}{POP16}{POP16}{STRINGID}... +STR_1003 ::Impossible de tester {POP16}{POP16}{POP16}{STRINGID}... +STR_1004 ::Impossible de fermer {POP16}{POP16}{POP16}{STRINGID}... +STR_1005 ::Impossible de commencer la construction sur {POP16}{POP16}{POP16}{STRINGID}... STR_1006 :Doit être fermé d'abord -STR_1007 :Impossible de créer assez de véhicules +STR_1007 :Impossible de créer suffisamment de véhicules STR_1008 :{SMALLFONT}{BLACK}Ouvrir, fermer ou tester une attraction STR_1009 :{SMALLFONT}{BLACK}Ouvrir, fermer ou tester toutes les attractions STR_1010 :{SMALLFONT}{BLACK}Ouvrir ou fermer le parc @@ -1017,42 +1018,42 @@ STR_1011 :Tout fermer STR_1012 :Tout ouvrir STR_1013 :Fermer le parc STR_1014 :Ouvrir le parc -STR_1015 :Unable to operate with more than one station platform in this mode -STR_1016 :Unable to operate with less than two stations in this mode -STR_1017 :Can't change operating mode... -STR_1018 :Can't make changes... -STR_1019 :Can't make changes... -STR_1020 :Can't make changes... +STR_1015 :Impossible de fonctionner avec plus d'une platforme de station dans ce mode +STR_1016 :Impossible de fonctionner avec moins de deux stations dans ce mode +STR_1017 :Impossible de changer le mode d'opération... +STR_1018 :Impossible d'appliquer les changements... +STR_1019 :Impossible d'appliquer les changements... +STR_1020 :Impossible d'appliquer les changements... STR_1021 :{POP16}{POP16}{POP16}{POP16}{STRINGID} STR_1022 :{POP16}{POP16}{POP16}{COMMA16} voiture par train STR_1023 :{POP16}{POP16}{POP16}{COMMA16} voitures par trains STR_1024 :{COMMA16} voiture par train STR_1025 :{COMMA16} voitures par train -STR_1026 :Le quai est trop long ! +STR_1026 :Le quai est trop long! STR_1027 :{SMALLFONT}{BLACK}Localiser sur la vue générale -STR_1028 :En dehors de la carte ! -STR_1029 :Cannot build partly above and partly below water! -STR_1030 :Can only build this underwater! -STR_1031 :Can't build this underwater! -STR_1032 :Can only build this on water! -STR_1033 :Can only build this above ground! -STR_1034 :Can only build this on land! -STR_1035 :Local authority won't allow construction above tree-height! +STR_1028 :En dehors de la carte! +STR_1029 :Impossible de construire partiellement au dessus et partiellement en dessous de l'eau! +STR_1030 :Ne peut être construit que sous l'eau! +STR_1031 :Impossible de construire ceci sous l'eau! +STR_1032 :Ne peut être construit que sur l'eau! +STR_1033 :Ne peut être construit qu'au dessus du sol! +STR_1034 :Ne peut être construit que sur le sol! +STR_1035 :Les autorités locales n'autoriseront pas les constructions plus hautes qu'un arbre! STR_1036 :Charger une partie -STR_1037 :Load Landscape -STR_1038 :Convert saved game to scenario -STR_1039 :Install new track design +STR_1037 :Charger un paysage +STR_1038 :Convertir une partie sauvegardée en scénario +STR_1039 :Installer un nouveau modèle de voie STR_1040 :Sauvegarder la partie STR_1041 :Sauvegarder le scénario -STR_1042 :Save Landscape -STR_1043 :OpenRCT2 Saved Game -STR_1044 :OpenRCT2 Scenario File -STR_1045 :OpenRCT2 Landscape File -STR_1046 :OpenRCT2 Track Design File -STR_1047 :Game save failed! -STR_1048 :Scenario save failed! -STR_1049 :Landscape save failed! -STR_1050 :Failed to load...{NEWLINE}File contains invalid data! +STR_1042 :Sauvegarder le paysage +STR_1043 :Partie sauvegardée OpenRCT2 +STR_1044 :Fichier de scénario OpenRCT2 +STR_1045 :Fichier de paysage OpenRCT2 +STR_1046 :Modèle de voie OpenRCT2 +STR_1047 :La sauvegarde du jeu a échouée! +STR_1048 :La sauvegarde du scénario a échouée! +STR_1049 :La sauvegarde du paysage a échouée! +STR_1050 :Impossible de charger...{NEWLINE}Le fichier contient des données invalides! STR_1051 :Supports invisibles STR_1052 :Visiteurs invisibles STR_1053 :{SMALLFONT}{BLACK}Attractions dans le parc @@ -1070,119 +1071,119 @@ STR_1064 :Lancement (avec passage de la station) STR_1065 :Shuttle mode STR_1066 :Boat hire mode STR_1067 :Upward launch -STR_1068 :Rotating lift mode -STR_1069 :Station to station mode -STR_1070 :Single ride per admission -STR_1071 :Unlimited rides per admission -STR_1072 :Maze mode -STR_1073 :Race mode -STR_1074 :Bumper-car mode +STR_1068 :Mode ascenseur en rotation +STR_1069 :Mode station à station +STR_1070 :Un seul tour par entrée +STR_1071 :Tours illimités par entrée +STR_1072 :Mode labyrinthe +STR_1073 :Mode course +STR_1074 :Mode auto-tamponneuses STR_1075 :Swing mode -STR_1076 :Shop stall mode -STR_1077 :Rotation mode -STR_1078 :Forward rotation -STR_1079 :Backward rotation +STR_1076 :Mode stand de boutique +STR_1077 :Mode rotation +STR_1078 :Rotation vers l'avant +STR_1079 :Rotation vers l'arrière STR_1080 :Film: {ENDQUOTES}Avenging aviators{ENDQUOTES} -STR_1081 :3D film: {ENDQUOTES}Mouse tails{ENDQUOTES} -STR_1082 :Space rings mode -STR_1083 :Beginners mode +STR_1081 :3D film: {ENDQUOTES}Queues de souris{ENDQUOTES} +STR_1082 :Mode anneaux de l'espace +STR_1083 :Mode débutants STR_1084 :LIM-powered launch STR_1085 :Film: {ENDQUOTES}Thrill riders{ENDQUOTES} -STR_1086 :3D film: {ENDQUOTES}Storm chasers{ENDQUOTES} -STR_1087 :3D film: {ENDQUOTES}Space raiders{ENDQUOTES} -STR_1088 :Intense mode +STR_1086 :3D film: {ENDQUOTES}Chasseurs de tempêtes{ENDQUOTES} +STR_1087 :3D film: {ENDQUOTES}Commandos de l'espace{ENDQUOTES} +STR_1088 :Mode intense STR_1089 :Berserk mode -STR_1090 :Haunted house mode -STR_1091 :Circus show mode +STR_1090 :Mode maison hantée +STR_1091 :Mode spectacle de cirque STR_1092 :Downward launch -STR_1093 :Crooked house mode -STR_1094 :Freefall drop mode +STR_1093 :Mode maison biscornue +STR_1094 :Mode chute libre STR_1095 :Continuous circuit block sectioned mode STR_1096 :Lancement (sans passage de la station) STR_1097 :Powered launch block sectioned mode -STR_1098 :Moving to end of {POP16}{STRINGID} -STR_1099 :Waiting for passengers at {POP16}{STRINGID} -STR_1100 :Waiting to depart {POP16}{STRINGID} -STR_1101 :Departing {POP16}{STRINGID} -STR_1102 :Travelling at {VELOCITY} -STR_1103 :Arriving at {POP16}{STRINGID} -STR_1104 :Unloading passengers at {POP16}{STRINGID} -STR_1105 :Travelling at {VELOCITY} -STR_1106 :Crashing! -STR_1107 :Crashed! -STR_1108 :Travelling at {VELOCITY} -STR_1109 :Swinging -STR_1110 :Rotating -STR_1111 :Rotating -STR_1112 :Operating -STR_1113 :Showing film -STR_1114 :Rotating -STR_1115 :Operating -STR_1116 :Operating -STR_1117 :Doing circus show -STR_1118 :Operating -STR_1119 :Waiting for cable lift -STR_1120 :Travelling at {VELOCITY} -STR_1121 :Stopping -STR_1122 :En attente de passagers -STR_1123 :En attente du départ -STR_1124 :Starting -STR_1125 :Operating -STR_1126 :Stopping -STR_1127 :Déchargement des passagers -STR_1128 :Stopped by block brakes -STR_1129 :Tous les véhicules de mêmes couleurs -STR_1130 :Différentes couleurs par {STRINGID} -STR_1131 :Différentes couleurs par véhicule +STR_1098 :Se déplace vers la fin de {POP16}{STRINGID} +STR_1099 :Attend des passagers à {POP16}{STRINGID} +STR_1100 :Attend pour quitter {POP16}{STRINGID} +STR_1101 :Part de {POP16}{STRINGID} +STR_1102 :Voyage à {VELOCITY} +STR_1103 :Arrive à {POP16}{STRINGID} +STR_1104 :Dépose des passagers à {POP16}{STRINGID} +STR_1105 :Voyage à {VELOCITY} +STR_1106 :S'écrase! +STR_1107 :Écrasé! +STR_1108 :Voyage à {VELOCITY} +STR_1109 :Se balance +STR_1110 :Pivote +STR_1111 :Pivote +STR_1112 :Fonctionne +STR_1113 :Diffuse le film +STR_1114 :Pivote +STR_1115 :Fonctionne +STR_1116 :Fonctionne +STR_1117 :Spectacle de cirque en cours +STR_1118 :Fonctionne +STR_1119 :Attend la montée par câble +STR_1120 :Voyage à{VELOCITY} +STR_1121 :S'arrête +STR_1122 :Attend des passagers +STR_1123 :Attend le départ +STR_1124 :Démarre +STR_1125 :Fonctionne +STR_1126 :S'arrête +STR_1127 :Dépose des passagers +STR_1128 :Arrété par les blocs de freins +STR_1129 :Tous les véhicules de la même couleur +STR_1130 :Couleurs différentes par {STRINGID} +STR_1131 :Couleurs différentes par véhicule STR_1132 :Véhicule {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1133 :Véhicule {POP16}{COMMA16} STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} STR_1135 :{STRINGID} {COMMA16} -STR_1136 :{SMALLFONT}{BLACK}Sélectionner la couleur principale -STR_1137 :{SMALLFONT}{BLACK}Sélectionner la couleur additionnelle 1 -STR_1138 :{SMALLFONT}{BLACK}Sélectionner la couleur additionnelle 2 -STR_1139 :{SMALLFONT}{BLACK}Sélectionner la couleur de la structure -STR_1140 :{SMALLFONT}{BLACK}Select vehicle colour scheme option -STR_1141 :{SMALLFONT}{BLACK}Sélectionner quel véhicule modifier +STR_1136 :{SMALLFONT}{BLACK}Sélectionnez la couleur principale +STR_1137 :{SMALLFONT}{BLACK}Sélectionnez la couleur supplémentaire 1 +STR_1138 :{SMALLFONT}{BLACK}Sélectionnez la couleur supplémentaire 2 +STR_1139 :{SMALLFONT}{BLACK}Sélectionnez la couleur de la structure de support +STR_1140 :{SMALLFONT}{BLACK}Sélectionnez le motif de couleur du véhicule +STR_1141 :{SMALLFONT}{BLACK}Sélectionnez quel véhicule/train à modifier STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} -STR_1144 :Can't build/move entrance for this ride/attraction... -STR_1145 :Can't build/move exit for this ride/attraction... -STR_1146 :Entrance not yet built -STR_1147 :Exit not yet built +STR_1144 :Impossible de construire/déplacer l'entrée de cette attraction... +STR_1145 :Impossible de construire/déplacer la sortie de cette attraction... +STR_1146 :Entrée pas encore construite +STR_1147 :Sortie pas encore construite STR_1148 :Quart de la charge STR_1149 :Moitiée de la charge STR_1150 :Trois-quarts de la charge STR_1151 :Charge totale STR_1152 :N'importe quelle charge -STR_1153 :Height Marks on Ride Tracks -STR_1154 :Height Marks on Land -STR_1155 :Height Marks on Paths +STR_1153 :Niveau de hauteur sur les voies +STR_1154 :Niveau de hauteur sur le terrain +STR_1155 :Niveau de hauteur sur les chemins STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} -STR_1158 :Ne peut pas retirer ceci... -STR_1159 :{SMALLFONT}{BLACK}Place scenery, gardens, and other accessories -STR_1160 :{SMALLFONT}{BLACK}Create/adjust lakes & water -STR_1161 :Ne peut pas positionner ici... +STR_1158 :Impossible de supprimer ceci... +STR_1159 :{SMALLFONT}{BLACK}Placer le décor, les jardins, et autres accessoires +STR_1160 :{SMALLFONT}{BLACK}Créer/Adjuster les lacs et l'eau +STR_1161 :Impossible de positionner ceci ici... STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} -STR_1163 :{STRINGID}{NEWLINE}(Right-Click to Modify) -STR_1164 :{STRINGID}{NEWLINE}(Right-Click to Remove) +STR_1163 :{STRINGID}{NEWLINE}(Clic-droit pour modifier) +STR_1164 :{STRINGID}{NEWLINE}(Clic-droit pour supprimer) STR_1165 :{STRINGID} - {STRINGID} {COMMA16} -STR_1166 :Can't lower water level here... -STR_1167 :Can't raise water level here... +STR_1166 :Impossible d'abaisser le niveau de l'eau ici... +STR_1167 :Impossible de surélever le niveau de l'eau ici... STR_1168 :Options STR_1169 :(None) STR_1170 :{STRING} -STR_1171 :{RED}Closed - - +STR_1171 :{RED}Fermé - - STR_1172 :{YELLOW}{STRINGID} - - -STR_1173 :{SMALLFONT}{BLACK}Build footpaths and queue lines -STR_1174 :Banner sign in the way -STR_1175 :Can't build this on sloped footpath -STR_1176 :Can't build footpath here... -STR_1177 :Can't remove footpath from here... -STR_1178 :Land slope unsuitable -STR_1179 :Footpath in the way -STR_1180 :Can't build this underwater! +STR_1173 :{SMALLFONT}{BLACK}Construire des chemins et des files d'attentes +STR_1174 :Panneau d'affichage sur le passage +STR_1175 :Impossible de construire ceci sur un chemin en pente +STR_1176 :Impossible de construire un chemin ici... +STR_1177 :Impossible de supprimer ce chemin... +STR_1178 :Terrain en pente inadapté +STR_1179 :Chemin sur le passage +STR_1180 :Impossible de construire ceci sous l'eau! STR_1181 :Allées STR_1182 :Type STR_1183 :Direction @@ -1191,8 +1192,8 @@ STR_1185 :{SMALLFONT}{BLACK}Direction STR_1186 :{SMALLFONT}{BLACK}Pente descendante STR_1187 :{SMALLFONT}{BLACK}Niveau STR_1188 :{SMALLFONT}{BLACK}Pente montante -STR_1189 :{SMALLFONT}{BLACK}Construct the selected footpath section -STR_1190 :{SMALLFONT}{BLACK}Remove previous footpath section +STR_1189 :{SMALLFONT}{BLACK}Construire la section de chemin sélectionnée +STR_1190 :{SMALLFONT}{BLACK}Supprimer la section de chemin précédente STR_1191 :{BLACK}{STRINGID} STR_1192 :{OUTLINE}{RED}{STRINGID} STR_1193 :{WINDOW_COLOUR_2}{STRINGID} @@ -1200,25 +1201,25 @@ STR_1194 :Fermé STR_1195 :En test STR_1196 :Ouvert STR_1197 :En panne -STR_1198 :Crashed! -STR_1199 :{COMMA16} person on ride -STR_1200 :{COMMA16} people on ride +STR_1198 :Écrasé! +STR_1199 :{COMMA16} personne sur l'attraction +STR_1200 :{COMMA16} personnes sur l'attraction STR_1201 :Personne dans la file d'attente -STR_1202 :1 personne dans la file d'attente +STR_1202 :Une personne dans la file d'attente STR_1203 :{COMMA16} personnes dans la file d'attente -STR_1204 :Attente de {COMMA16} minute dans la file -STR_1205 :Attente de {COMMA16} minutes dans la file -STR_1206 :{WINDOW_COLOUR_2}Wait for: -STR_1207 :{WINDOW_COLOUR_2}Leave if another train arrives at station -STR_1208 :{WINDOW_COLOUR_2}Leave if another boat arrives at station -STR_1209 :{SMALLFONT}{BLACK}Select whether should wait for passengers before departing -STR_1210 :{SMALLFONT}{BLACK}Select whether should leave if another vehicle arrives at the same station -STR_1211 :{WINDOW_COLOUR_2}Minimum waiting time: -STR_1212 :{WINDOW_COLOUR_2}Maximum waiting time: -STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing -STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing -STR_1215 :{WINDOW_COLOUR_2}Synchronise with adjacent stations -STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronise departure with all adjacent stations (for 'racing') +STR_1204 :{COMMA16} minute d'attente +STR_1205 :{COMMA16} minutes d'attente +STR_1206 :{WINDOW_COLOUR_2}Attendre: +STR_1207 :{WINDOW_COLOUR_2}Quitter si un autre train arrive à la station +STR_1208 :{WINDOW_COLOUR_2}Quitter si un autre bateau arrive à la station +STR_1209 :{SMALLFONT}{BLACK}Sélectionnez si il faut attendre des passagers avant de partir +STR_1210 :{SMALLFONT}{BLACK}Sélectionnez si il faut partir quand un autre véhicule arrive à la même station +STR_1211 :{WINDOW_COLOUR_2}Temps d'attente minimum: +STR_1212 :{WINDOW_COLOUR_2}Temps d'attente maximum: +STR_1213 :{SMALLFONT}{BLACK}Sélectionnez la durée minimum à attendre avant de partir +STR_1214 :{SMALLFONT}{BLACK}Sélectionnez la durée maximum à attendre avant de partir +STR_1215 :{WINDOW_COLOUR_2}Synchroniser avec les stations adjacentes +STR_1216 :{SMALLFONT}{BLACK}Sélectionnez si il faut synchroniser le départ avec toutes les stations adjacentes STR_1217 :{COMMA16} secondes STR_1218 :{BLACK}{SMALLUP} STR_1219 :{BLACK}{SMALLDOWN} @@ -1245,20 +1246,20 @@ STR_1239 :Bateaux STR_1240 :{COMMA16} bateau STR_1241 :{COMMA16} bateaux STR_1242 :Bateau {COMMA16} -STR_1243 :track -STR_1244 :tracks -STR_1245 :Track -STR_1246 :Tracks -STR_1247 :{COMMA16} track -STR_1248 :{COMMA16} tracks -STR_1249 :Track {COMMA16} -STR_1250 :docking platform -STR_1251 :docking platforms -STR_1252 :Docking platform -STR_1253 :Docking platforms -STR_1254 :{COMMA16} docking platform -STR_1255 :{COMMA16} docking platforms -STR_1256 :Docking platform {COMMA16} +STR_1243 :voie +STR_1244 :voies +STR_1245 :Voie +STR_1246 :Voies +STR_1247 :{COMMA16} voie +STR_1248 :{COMMA16} voies +STR_1249 :Voie {COMMA16} +STR_1250 :plateforme d'arrimage +STR_1251 :plateformes d'arrimage +STR_1252 :Plateforme d'arrimage +STR_1253 :Plateformes d'arrimage +STR_1254 :{COMMA16} plateforme d'arrimage +STR_1255 :{COMMA16} plateformes d'arrimage +STR_1256 :Plateforme d'arrimage {COMMA16} STR_1257 :station STR_1258 :stations STR_1259 :Station @@ -1266,13 +1267,13 @@ STR_1260 :Stations STR_1261 :{COMMA16} station STR_1262 :{COMMA16} stations STR_1263 :Station {COMMA16} -STR_1264 :car -STR_1265 :cars -STR_1266 :Car -STR_1267 :Cars -STR_1268 :{COMMA16} car -STR_1269 :{COMMA16} cars -STR_1270 :Car {COMMA16} +STR_1264 :voiture +STR_1265 :voitures +STR_1266 :Voiture +STR_1267 :Voitures +STR_1268 :{COMMA16} voiture +STR_1269 :{COMMA16} voitures +STR_1270 :Voiture {COMMA16} STR_1271 :bâtiment STR_1272 :bâtiments STR_1273 :Bâtiment @@ -1287,41 +1288,41 @@ STR_1281 :Structures STR_1282 :{COMMA16} structure STR_1283 :{COMMA16} structures STR_1284 :Structure {COMMA16} -STR_1285 :ship -STR_1286 :ships -STR_1287 :Ship -STR_1288 :Ships -STR_1289 :{COMMA16} ship -STR_1290 :{COMMA16} ships -STR_1291 :Ship {COMMA16} -STR_1292 :cabin -STR_1293 :cabins -STR_1294 :Cabin -STR_1295 :Cabins -STR_1296 :{COMMA16} cabin -STR_1297 :{COMMA16} cabins -STR_1298 :Cabin {COMMA16} -STR_1299 :wheel -STR_1300 :wheels -STR_1301 :Wheel -STR_1302 :Wheels -STR_1303 :{COMMA16} wheel -STR_1304 :{COMMA16} wheels -STR_1305 :Wheel {COMMA16} -STR_1306 :ring -STR_1307 :rings -STR_1308 :Ring -STR_1309 :Rings -STR_1310 :{COMMA16} ring -STR_1311 :{COMMA16} rings -STR_1312 :Ring {COMMA16} -STR_1313 :player -STR_1314 :players -STR_1315 :Player -STR_1316 :Players -STR_1317 :{COMMA16} player -STR_1318 :{COMMA16} players -STR_1319 :Player {COMMA16} +STR_1285 :navire +STR_1286 :navires +STR_1287 :Navire +STR_1288 :Navires +STR_1289 :{COMMA16} navire +STR_1290 :{COMMA16} Navires +STR_1291 :Navire {COMMA16} +STR_1292 :cabine +STR_1293 :cabines +STR_1294 :Cabine +STR_1295 :Cabines +STR_1296 :{COMMA16} cabine +STR_1297 :{COMMA16} cabines +STR_1298 :Cabine {COMMA16} +STR_1299 :roue +STR_1300 :roues +STR_1301 :Roue +STR_1302 :Roues +STR_1303 :{COMMA16} roue +STR_1304 :{COMMA16} roues +STR_1305 :Roue {COMMA16} +STR_1306 :anneau +STR_1307 :anneaux +STR_1308 :Anneau +STR_1309 :Anneaux +STR_1310 :{COMMA16} anneau +STR_1311 :{COMMA16} anneaux +STR_1312 :Anneau {COMMA16} +STR_1313 :joueur +STR_1314 :joueurs +STR_1315 :Joueur +STR_1316 :Joueurs +STR_1317 :{COMMA16} joueur +STR_1318 :{COMMA16} joueurs +STR_1319 :Joueur {COMMA16} STR_1320 :course STR_1321 :courses STR_1322 :Course @@ -1329,10 +1330,10 @@ STR_1323 :Courses STR_1324 :{COMMA16} course STR_1325 :{COMMA16} courses STR_1326 :Course {COMMA16} -STR_1327 :{SMALLFONT}{BLACK}Rotate objects by 90{DEGREE} -STR_1328 :Level land required -STR_1329 :{WINDOW_COLOUR_2}Launch speed: -STR_1330 :{SMALLFONT}{BLACK}Maximum speed when leaving station +STR_1327 :{SMALLFONT}{BLACK}Pivoter les objets de 90{DEGREE} +STR_1328 :Niveau de terrain requis +STR_1329 :{WINDOW_COLOUR_2}Vitesse de lancement: +STR_1330 :{SMALLFONT}{BLACK}Vitesse maximale en quittant la station STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} STR_1332 :{VELOCITY} STR_1333 :{STRINGID} - {STRINGID}{POP16} @@ -1341,12 +1342,12 @@ STR_1335 :{STRINGID} - Entrée{POP16}{POP16} STR_1336 :{STRINGID} - Entrée de station {POP16}{COMMA16} STR_1337 :{STRINGID} - Sortie{POP16}{POP16} STR_1338 :{STRINGID} - Sortie de station {POP16}{COMMA16} -STR_1339 :{BLACK}No test results yet... -STR_1340 :{WINDOW_COLOUR_2}Max. speed: {BLACK}{VELOCITY} -STR_1341 :{WINDOW_COLOUR_2}Ride time: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1339 :{BLACK}Pas encore de résultats de test... +STR_1340 :{WINDOW_COLOUR_2}Vitesse max.: {BLACK}{VELOCITY} +STR_1341 :{WINDOW_COLOUR_2}Durée de l'attraction: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} STR_1342 :{DURATION} STR_1343 :{DURATION} / -STR_1344 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1344 :{WINDOW_COLOUR_2}Longueur de l'attraction: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} STR_1345 :{LENGTH} STR_1346 :{LENGTH} / STR_1347 :{WINDOW_COLOUR_2}Vitesse moyenne: {BLACK}{VELOCITY} @@ -1356,20 +1357,20 @@ STR_1350 :{WINDOW_COLOUR_2}Max. negative vertical G's: {BLACK}{COMMA2DP32}g STR_1351 :{WINDOW_COLOUR_2}Max. negative vertical G's: {OUTLINE}{RED}{COMMA2DP32}g STR_1352 :{WINDOW_COLOUR_2}Max. lateral G's: {BLACK}{COMMA2DP32}g STR_1353 :{WINDOW_COLOUR_2}Max. lateral G's: {OUTLINE}{RED}{COMMA2DP32}g -STR_1354 :{WINDOW_COLOUR_2}Highest drop height: {BLACK}{LENGTH} -STR_1355 :{WINDOW_COLOUR_2}Drops: {BLACK}{COMMA16} +STR_1354 :{WINDOW_COLOUR_2}Plus haute hauteur de chute: {BLACK}{LENGTH} +STR_1355 :{WINDOW_COLOUR_2}Chutes: {BLACK}{COMMA16} STR_1356 :{WINDOW_COLOUR_2}Inversions: {BLACK}{COMMA16} -STR_1357 :{WINDOW_COLOUR_2}Holes: {BLACK}{COMMA16} +STR_1357 :{WINDOW_COLOUR_2}Trous: {BLACK}{COMMA16} STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs -STR_1359 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minute -STR_1360 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minutes -STR_1361 :Can't change speed... -STR_1362 :Can't change launch speed... -STR_1363 :Too high for supports! -STR_1364 :Supports for track above can't be extended any further! +STR_1359 :{WINDOW_COLOUR_2}Temps d'attente: {BLACK}{COMMA16} minute +STR_1360 :{WINDOW_COLOUR_2}Temps d'attente: {BLACK}{COMMA16} minutes +STR_1361 :Impossible de changer la vitesse... +STR_1362 :Impossidle de changer la vitesse de lancement... +STR_1363 :Trop haut pour les supports! +STR_1364 :Les supports pour la voie d'au dessus ne peuvent être plus étendus! STR_1365 :In-line Twist (left) STR_1366 :In-line Twist (right) -STR_1367 :Half Loop +STR_1367 :Demi boucle STR_1368 :Half Corkscrew (left) STR_1369 :Half Corkscrew (right) STR_1370 :Barrel Roll (left) @@ -1385,11 +1386,11 @@ STR_1379 :Reverser (left) STR_1380 :Reverser (right) STR_1381 :Curved Lift Hill (left) STR_1382 :Curved Lift Hill (right) -STR_1383 :Quarter Loop +STR_1383 :Quart de boucle STR_1384 :{YELLOW}{STRINGID} -STR_1385 :{SMALLFONT}{BLACK}Other track configurations -STR_1386 :Special... -STR_1387 :Can't change land type... +STR_1385 :{SMALLFONT}{BLACK}Autres configurations de voie +STR_1386 :Spécial... +STR_1387 :Impossible de changer le type de terrain... STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} STR_1389 :{OUTLINE}{RED}- {CURRENCY} STR_1390 :{CURRENCY2DP} @@ -1400,20 +1401,20 @@ STR_1394 :{SMALLFONT}{BLACK}Options d'opération STR_1395 :{SMALLFONT}{BLACK}Options de maintenance STR_1396 :{SMALLFONT}{BLACK}Options des couleurs STR_1397 :{SMALLFONT}{BLACK}Options de son et musique -STR_1398 :{SMALLFONT}{BLACK}Measurements and test data +STR_1398 :{SMALLFONT}{BLACK}Données de test et mesures STR_1399 :{SMALLFONT}{BLACK}Graphiques STR_1400 :Entrée STR_1401 :Sortie -STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction -STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction +STR_1402 :{SMALLFONT}{BLACK}Construire ou déplacer l'entrée de l'attraction +STR_1403 :{SMALLFONT}{BLACK}Construire ou déplacer la sortie de l'attraction STR_1404 :{SMALLFONT}{BLACK}Rotation de 90{DEGREE} STR_1405 :{SMALLFONT}{BLACK}Miroir -STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) +STR_1406 :{SMALLFONT}{BLACK}Activer/Désactiver le décor (si disponible pour ce modèle) STR_1407 :{WINDOW_COLOUR_2}Construire ceci... STR_1408 :{WINDOW_COLOUR_2}Prix : {BLACK}{CURRENCY} -STR_1409 :Entry/Exit Platform -STR_1410 :Vertical Tower -STR_1411 :{STRINGID} in the way +STR_1409 :Plateforme d'entrée/sortie +STR_1410 :Tour verticale +STR_1411 :{STRINGID} dans le passage STR_1412 :{WINDOW_COLOUR_3}Data logging not available for this type of ride STR_1413 :{WINDOW_COLOUR_3}Data logging will start when next {STRINGID} leaves {STRINGID} STR_1414 :{SMALLFONT}{BLACK}{DURATION} @@ -1424,128 +1425,128 @@ STR_1418 :{WINDOW_COLOUR_2}Lat.G's STR_1419 :{SMALLFONT}{BLACK}{VELOCITY} STR_1420 :{SMALLFONT}{BLACK}{LENGTH} STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g -STR_1422 :{SMALLFONT}{BLACK}Logging data from {POP16}{STRINGID} -STR_1423 :{SMALLFONT}{BLACK}Queue line path -STR_1424 :{SMALLFONT}{BLACK}Footpath -STR_1425 :Footpath +STR_1422 :{SMALLFONT}{BLACK}Prise en note des données de {POP16}{STRINGID} +STR_1423 :{SMALLFONT}{BLACK}Chemin de la file d'attente +STR_1424 :{SMALLFONT}{BLACK}Chemin +STR_1425 :Chemin STR_1426 :File d'attente -STR_1427 :{WINDOW_COLOUR_2}Clients : {BLACK}{COMMA32} par heure -STR_1428 :{WINDOW_COLOUR_2}Prix d'entrée : +STR_1427 :{WINDOW_COLOUR_2}Clients: {BLACK}{COMMA32} par heure +STR_1428 :{WINDOW_COLOUR_2}Prix d'entrée: STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} STR_1430 :Gratuit STR_1431 :Marche -STR_1432 :Heading for {STRINGID} -STR_1433 :Queuing for {STRINGID} -STR_1434 :Drowning +STR_1432 :Se dirige vers {STRINGID} +STR_1433 :Fait la queue pour {STRINGID} +STR_1434 :Se noie STR_1435 :En {STRINGID} STR_1436 :Dans {STRINGID} STR_1437 :A {STRINGID} -STR_1438 :Sitting +STR_1438 :Est assis STR_1439 :(select location) -STR_1440 :Mowing grass +STR_1440 :Tond le gazon STR_1441 :Balaye l'allée STR_1442 :Vide la poubelle STR_1443 :Arrose les jardins STR_1444 :Regarde {STRINGID} STR_1445 :Regarde la construction de {STRINGID} -STR_1446 :Looking at scenery +STR_1446 :Regarde le décor STR_1447 :Quitte le parc -STR_1448 :Watching new ride being constructed +STR_1448 :Regarde une nouvelle attraction en cours de construction STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) STR_1452 :Nom du visiteur -STR_1453 :Entrez le nom du visiteur: -STR_1454 :Ne peut pas nommer le visiteur... +STR_1453 :Entrez un nom pour ce visiteur: +STR_1454 :Impossible de nommer le visiteur... STR_1455 :Nom de visiteur invalide STR_1456 :{WINDOW_COLOUR_2}Argent dépensé: {BLACK}{CURRENCY2DP} -STR_1457 :{WINDOW_COLOUR_2}Argent de poche: {BLACK}{CURRENCY2DP} +STR_1457 :{WINDOW_COLOUR_2}Argent dans la poche: {BLACK}{CURRENCY2DP} STR_1458 :{WINDOW_COLOUR_2}Temps dans le parc: {BLACK}{REALTIME} -STR_1459 :Track style -STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track -STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track +STR_1459 :Type de voie +STR_1460 :{SMALLFONT}{BLACK}Voie ouverte en forme de 'U' +STR_1461 :{SMALLFONT}{BLACK}Voie fermée en forme de 'O' STR_1462 :Too steep for lift hill STR_1463 :Visiteurs -STR_1464 :Helix up (small) -STR_1465 :Helix up (large) -STR_1466 :Helix down (small) -STR_1467 :Helix down (large) +STR_1464 :Hélice montante (petite) +STR_1465 :Hélice montante (grande) +STR_1466 :Hélice descendante (petite) +STR_1467 :Hélice descendante (grande) STR_1468 :Personnel -STR_1469 :Ride must start and end with stations -STR_1470 :Station not long enough +STR_1469 :L'attraction doit commencer et finir avec des stations +STR_1470 :Station pas assez longue STR_1471 :{WINDOW_COLOUR_2}Vitesse: -STR_1472 :{SMALLFONT}{BLACK}Speed of this ride -STR_1473 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1474 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}Not yet available -STR_1475 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1476 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}Not yet available -STR_1477 :{WINDOW_COLOUR_2}Intensity rating: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) -STR_1478 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1479 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}Not yet available -STR_1480 :{SMALLFONT}{OPENQUOTES}Je ne peux pas me payer {STRINGID}{ENDQUOTES} +STR_1472 :{SMALLFONT}{BLACK}Vitesse de cette attraction +STR_1473 :{WINDOW_COLOUR_2}Niveau d'excitation: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1474 :{WINDOW_COLOUR_2}Niveau d'excitation: {BLACK}Pas encore disponible +STR_1475 :{WINDOW_COLOUR_2}Niveau d'intensité: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1476 :{WINDOW_COLOUR_2}Niveau d'intensité: {BLACK}Pas encore disponible +STR_1477 :{WINDOW_COLOUR_2}Niveau d'intensité: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) +STR_1478 :{WINDOW_COLOUR_2}Niveau de nausée: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1479 :{WINDOW_COLOUR_2}Niveau de nausée: {BLACK}Pas encore disponible +STR_1480 :{SMALLFONT}{OPENQUOTES}Je ne peux pas me payer{STRINGID}{ENDQUOTES} STR_1481 :{SMALLFONT}{OPENQUOTES}J'ai dépensé tout mon argent{ENDQUOTES} -STR_1482 :{SMALLFONT}{OPENQUOTES}Je me sens pas bien{ENDQUOTES} -STR_1483 :{SMALLFONT}{OPENQUOTES}Je me sens malade{ENDQUOTES} +STR_1482 :{SMALLFONT}{OPENQUOTES}Je me sens malade{ENDQUOTES} +STR_1483 :{SMALLFONT}{OPENQUOTES}Je me sens très malade{ENDQUOTES} STR_1484 :{SMALLFONT}{OPENQUOTES}Je veux aller sur quelque chose de plus excitant que {STRINGID}{ENDQUOTES} -STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} me paraît trop intense pour moi{ENDQUOTES} -STR_1486 :{SMALLFONT}{OPENQUOTES}I haven't finished my {STRINGID} yet{ENDQUOTES} -STR_1487 :{SMALLFONT}{OPENQUOTES}Just looking at {STRINGID} makes me feel sick{ENDQUOTES} -STR_1488 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to go on {STRINGID}{ENDQUOTES} +STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} a l'air trop intense pour moi{ENDQUOTES} +STR_1486 :{SMALLFONT}{OPENQUOTES}Je n'ai pas encore fini mon {STRINGID} {ENDQUOTES} +STR_1487 :{SMALLFONT}{OPENQUOTES}Rien que le fait de regarder {STRINGID} me rend malade{ENDQUOTES} +STR_1488 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour aller sur {STRINGID}{ENDQUOTES} STR_1489 :{SMALLFONT}{OPENQUOTES}Je veux rentrer chez moi{ENDQUOTES} -STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} is really good value{ENDQUOTES} -STR_1491 :{SMALLFONT}{OPENQUOTES}I've already got {STRINGID}{ENDQUOTES} +STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} est un très bon choix{ENDQUOTES} +STR_1491 :{SMALLFONT}{OPENQUOTES}J'ai déjà un {STRINGID}{ENDQUOTES} STR_1492 :{SMALLFONT}{OPENQUOTES}Je ne peux pas me payer {STRINGID}{ENDQUOTES} -STR_1493 :{SMALLFONT}{OPENQUOTES}I'm not hungry{ENDQUOTES} -STR_1494 :{SMALLFONT}{OPENQUOTES}I'm not thirsty{ENDQUOTES} -STR_1495 :{SMALLFONT}{OPENQUOTES}Help! I'm drowning!{ENDQUOTES} -STR_1496 :{SMALLFONT}{OPENQUOTES}Je suis perdu !{ENDQUOTES} -STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} was great{ENDQUOTES} -STR_1498 :{SMALLFONT}{OPENQUOTES}I've been queuing for {STRINGID} for ages{ENDQUOTES} +STR_1493 :{SMALLFONT}{OPENQUOTES}Je n'ai pas faim{ENDQUOTES} +STR_1494 :{SMALLFONT}{OPENQUOTES}Je n'ai pas soif{ENDQUOTES} +STR_1495 :{SMALLFONT}{OPENQUOTES}À l'aide! Je me noie!{ENDQUOTES} +STR_1496 :{SMALLFONT}{OPENQUOTES}Je suis perdu!{ENDQUOTES} +STR_1497 :{SMALLFONT}{OPENQUOTES}{STRINGID} était génial{ENDQUOTES} +STR_1498 :{SMALLFONT}{OPENQUOTES}Je fais la queue pour {STRINGID} depuis des années{ENDQUOTES} STR_1499 :{SMALLFONT}{OPENQUOTES}Je suis fatigué{ENDQUOTES} STR_1500 :{SMALLFONT}{OPENQUOTES}J'ai faim{ENDQUOTES} STR_1501 :{SMALLFONT}{OPENQUOTES}J'ai soif{ENDQUOTES} -STR_1502 :{SMALLFONT}{OPENQUOTES}J'ai besoin d'aller aux toilettes{ENDQUOTES} -STR_1503 :{SMALLFONT}{OPENQUOTES}Je n'arrive pas à trouver {STRINGID}{ENDQUOTES} -STR_1504 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to use {STRINGID}{ENDQUOTES} -STR_1505 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} while it's raining{ENDQUOTES} -STR_1506 :{SMALLFONT}{OPENQUOTES}The litter here is really bad{ENDQUOTES} -STR_1507 :{SMALLFONT}{OPENQUOTES}I can't find the park exit{ENDQUOTES} -STR_1508 :{SMALLFONT}{OPENQUOTES}I want to get off {STRINGID}{ENDQUOTES} -STR_1509 :{SMALLFONT}{OPENQUOTES}I want to get out of {STRINGID}{ENDQUOTES} -STR_1510 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} - It isn't safe{ENDQUOTES} -STR_1511 :{SMALLFONT}{OPENQUOTES}This path is disgusting{ENDQUOTES} -STR_1512 :{SMALLFONT}{OPENQUOTES}It's too crowded here{ENDQUOTES} -STR_1513 :{SMALLFONT}{OPENQUOTES}The vandalism here is really bad{ENDQUOTES} -STR_1514 :{SMALLFONT}{OPENQUOTES}Great scenery!{ENDQUOTES} -STR_1515 :{SMALLFONT}{OPENQUOTES}This park is really clean and tidy{ENDQUOTES} -STR_1516 :{SMALLFONT}{OPENQUOTES}The jumping fountains are great{ENDQUOTES} -STR_1517 :{SMALLFONT}{OPENQUOTES}La musique est bien ici{ENDQUOTES} -STR_1518 :{SMALLFONT}{OPENQUOTES}This balloon from {STRINGID} is really good value{ENDQUOTES} -STR_1519 :{SMALLFONT}{OPENQUOTES}This cuddly toy from {STRINGID} is really good value{ENDQUOTES} -STR_1520 :{SMALLFONT}{OPENQUOTES}This park map from {STRINGID} is really good value{ENDQUOTES} -STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} -STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} -STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} -STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} -STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} -STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} -STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} +STR_1502 :{SMALLFONT}{OPENQUOTES}Je dois aller aux toilettes{ENDQUOTES} +STR_1503 :{SMALLFONT}{OPENQUOTES}Je ne peux pas trouver {STRINGID}{ENDQUOTES} +STR_1504 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour utiliser {STRINGID}{ENDQUOTES} +STR_1505 :{SMALLFONT}{OPENQUOTES}Je ne vais pas sur {STRINGID} pendant qu'il pleut{ENDQUOTES} +STR_1506 :{SMALLFONT}{OPENQUOTES}La poubelle est mauvaise ici{ENDQUOTES} +STR_1507 :{SMALLFONT}{OPENQUOTES}Je ne peux pas trouver la sortie du parc{ENDQUOTES} +STR_1508 :{SMALLFONT}{OPENQUOTES}Je veux descendre de {STRINGID}{ENDQUOTES} +STR_1509 :{SMALLFONT}{OPENQUOTES}Je veux sortir de {STRINGID}{ENDQUOTES} +STR_1510 :{SMALLFONT}{OPENQUOTES}Je ne vais pas sur {STRINGID} - Ce n'est pas sécurisé{ENDQUOTES} +STR_1511 :{SMALLFONT}{OPENQUOTES}Ce chemin me dégoûte{ENDQUOTES} +STR_1512 :{SMALLFONT}{OPENQUOTES}Il y a trop de monde ici{ENDQUOTES} +STR_1513 :{SMALLFONT}{OPENQUOTES}Le vandalisme ici est vraiment mauvais{ENDQUOTES} +STR_1514 :{SMALLFONT}{OPENQUOTES}Super décor!{ENDQUOTES} +STR_1515 :{SMALLFONT}{OPENQUOTES}Ce parc est très propre et organisé{ENDQUOTES} +STR_1516 :{SMALLFONT}{OPENQUOTES}Les jets d'eau sont super{ENDQUOTES} +STR_1517 :{SMALLFONT}{OPENQUOTES}La musique est sympa ici{ENDQUOTES} +STR_1518 :{SMALLFONT}{OPENQUOTES}Ce ballon de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1519 :{SMALLFONT}{OPENQUOTES}Cette peluche de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1520 :{SMALLFONT}{OPENQUOTES}Cette carte du parc de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1521 :{SMALLFONT}{OPENQUOTES}Cette photo sur le vif de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1522 :{SMALLFONT}{OPENQUOTES}Ce parapluie de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1523 :{SMALLFONT}{OPENQUOTES}Cette boisson de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1524 :{SMALLFONT}{OPENQUOTES}Ce burger de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}Ces frites de {STRINGID} sont un très bon choix{ENDQUOTES} +STR_1526 :{SMALLFONT}{OPENQUOTES}Cette glace de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}Cette barbe-à-papa de {STRINGID} est un très bon choix{ENDQUOTES} STR_1528 : STR_1529 : STR_1530 : -STR_1531 :{SMALLFONT}{OPENQUOTES}This pizza from {STRINGID} is really good value{ENDQUOTES} +STR_1531 :{SMALLFONT}{OPENQUOTES}Cette pizza de {STRINGID} est un très bon choix{ENDQUOTES} STR_1532 : -STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good value{ENDQUOTES} -STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} -STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} -STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} -STR_1537 :{SMALLFONT}{OPENQUOTES}This toffee apple from {STRINGID} is really good value{ENDQUOTES} -STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} -STR_1539 :{SMALLFONT}{OPENQUOTES}This doughnut from {STRINGID} is really good value{ENDQUOTES} -STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} +STR_1533 :{SMALLFONT}{OPENQUOTES}Ce popcorn de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1534 :{SMALLFONT}{OPENQUOTES}Ce hot-dog de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1535 :{SMALLFONT}{OPENQUOTES}Ce poulpe de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1536 :{SMALLFONT}{OPENQUOTES}Ce chapeau de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}Cette pomme d'amour de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1538 :{SMALLFONT}{OPENQUOTES}Ce T-shirt de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}Ce donut de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1540 :{SMALLFONT}{OPENQUOTES}Ce café de {STRINGID} est un très bon choix{ENDQUOTES} STR_1541 : -STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} -STR_1543 :{SMALLFONT}{OPENQUOTES}This lemonade from {STRINGID} is really good value{ENDQUOTES} +STR_1542 :{SMALLFONT}{OPENQUOTES}Ce poulet frit de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1543 :{SMALLFONT}{OPENQUOTES}Cette limonade de {STRINGID} est un très bon choix{ENDQUOTES} STR_1544 : STR_1545 : STR_1546 : @@ -1553,60 +1554,60 @@ STR_1547 : STR_1548 : STR_1549 : STR_1550 :{SMALLFONT}{OPENQUOTES}Wow!{ENDQUOTES} -STR_1551 :{SMALLFONT}{OPENQUOTES}I have the strangest feeling someone is watching me{ENDQUOTES} -STR_1552 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a balloon from {STRINGID}{ENDQUOTES} -STR_1553 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cuddly toy from {STRINGID}{ENDQUOTES} -STR_1554 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a park map from {STRINGID}{ENDQUOTES} -STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} -STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} -STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} -STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} -STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} -STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} -STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} +STR_1551 :{SMALLFONT}{OPENQUOTES}J'ai l'étrange impression que quelqu'un me regarde{ENDQUOTES} +STR_1552 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un ballon de {STRINGID}{ENDQUOTES} +STR_1553 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour une peluche de {STRINGID}{ENDQUOTES} +STR_1554 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour une carte du parc de {STRINGID}{ENDQUOTES} +STR_1555 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour une photo sur le vif de {STRINGID}{ENDQUOTES} +STR_1556 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un parapluie de {STRINGID}{ENDQUOTES} +STR_1557 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour une boisson de {STRINGID}{ENDQUOTES} +STR_1558 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un burger de {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour des frites de {STRINGID}{ENDQUOTES} +STR_1560 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour une glace de {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour une barbe-à-papa de {STRINGID}{ENDQUOTES} STR_1562 : STR_1563 : STR_1564 : -STR_1565 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for pizza from {STRINGID}{ENDQUOTES} +STR_1565 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour une pizza de {STRINGID}{ENDQUOTES} STR_1566 : -STR_1567 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for popcorn from {STRINGID}{ENDQUOTES} -STR_1568 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hot dog from {STRINGID}{ENDQUOTES} -STR_1569 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for tentacle from {STRINGID}{ENDQUOTES} -STR_1570 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a hat from {STRINGID}{ENDQUOTES} -STR_1571 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a toffee apple from {STRINGID}{ENDQUOTES} -STR_1572 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a T-shirt from {STRINGID}{ENDQUOTES} -STR_1573 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a doughnut from {STRINGID}{ENDQUOTES} -STR_1574 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for coffee from {STRINGID}{ENDQUOTES} +STR_1567 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour du popcorn de {STRINGID}{ENDQUOTES} +STR_1568 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un hot dog de {STRINGID}{ENDQUOTES} +STR_1569 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour du poulpe de {STRINGID}{ENDQUOTES} +STR_1570 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un chapeau de {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour une pomme d'amour de {STRINGID}{ENDQUOTES} +STR_1572 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un T-shirt de {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un donut de {STRINGID}{ENDQUOTES} +STR_1574 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un café de {STRINGID}{ENDQUOTES} STR_1575 : -STR_1576 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried chicken from {STRINGID}{ENDQUOTES} -STR_1577 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for lemonade from {STRINGID}{ENDQUOTES} +STR_1576 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour du poulet frit de {STRINGID}{ENDQUOTES} +STR_1577 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un limonade de {STRINGID}{ENDQUOTES} STR_1578 : STR_1579 : STR_1580 : STR_1581 : STR_1582 : STR_1583 : -STR_1584 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} -STR_1585 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} -STR_1586 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} -STR_1587 :{SMALLFONT}{OPENQUOTES}This pretzel from {STRINGID} is really good value{ENDQUOTES} -STR_1588 :{SMALLFONT}{OPENQUOTES}This hot chocolate from {STRINGID} is really good value{ENDQUOTES} -STR_1589 :{SMALLFONT}{OPENQUOTES}This iced tea from {STRINGID} is really good value{ENDQUOTES} -STR_1590 :{SMALLFONT}{OPENQUOTES}This funnel cake from {STRINGID} is really good value{ENDQUOTES} -STR_1591 :{SMALLFONT}{OPENQUOTES}These sunglasses from {STRINGID} are really good value{ENDQUOTES} -STR_1592 :{SMALLFONT}{OPENQUOTES}These beef noodles from {STRINGID} are really good value{ENDQUOTES} -STR_1593 :{SMALLFONT}{OPENQUOTES}These fried rice noodles from {STRINGID} are really good value{ENDQUOTES} -STR_1594 :{SMALLFONT}{OPENQUOTES}This wonton soup from {STRINGID} is really good value{ENDQUOTES} -STR_1595 :{SMALLFONT}{OPENQUOTES}This meatball soup from {STRINGID} is really good value{ENDQUOTES} -STR_1596 :{SMALLFONT}{OPENQUOTES}This fruit juice from {STRINGID} is really good value{ENDQUOTES} -STR_1597 :{SMALLFONT}{OPENQUOTES}This soybean milk from {STRINGID} is really good value{ENDQUOTES} -STR_1598 :{SMALLFONT}{OPENQUOTES}This sujongkwa from {STRINGID} is really good value{ENDQUOTES} -STR_1599 :{SMALLFONT}{OPENQUOTES}This sub sandwich from {STRINGID} is really good value{ENDQUOTES} -STR_1600 :{SMALLFONT}{OPENQUOTES}This cookie from {STRINGID} is really good value{ENDQUOTES} +STR_1584 :{SMALLFONT}{OPENQUOTES}Cette photo sur le vif de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1585 :{SMALLFONT}{OPENQUOTES}Cette photo sur le vif de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1586 :{SMALLFONT}{OPENQUOTES}Cette photo sur le vif de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1587 :{SMALLFONT}{OPENQUOTES}Ce bretzel de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1588 :{SMALLFONT}{OPENQUOTES}Ce chocolat chaud de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1589 :{SMALLFONT}{OPENQUOTES}Ce thé glacé de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1590 :{SMALLFONT}{OPENQUOTES}Ce funnel cake de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1591 :{SMALLFONT}{OPENQUOTES}Ces lunettes de soleil de {STRINGID} sont un très bon choix{ENDQUOTES} +STR_1592 :{SMALLFONT}{OPENQUOTES}Ces nouilles au boeuf de {STRINGID} sont un très bon choix{ENDQUOTES} +STR_1593 :{SMALLFONT}{OPENQUOTES}Ces nouilles au riz frit de {STRINGID} sont un très bon choix{ENDQUOTES} +STR_1594 :{SMALLFONT}{OPENQUOTES}Cette soupe aux raviolis de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1595 :{SMALLFONT}{OPENQUOTES}Cette soupe aux boulettes de viande de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1596 :{SMALLFONT}{OPENQUOTES}Ce jus de fruits de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1597 :{SMALLFONT}{OPENQUOTES}Ce lait de soja de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1598 :{SMALLFONT}{OPENQUOTES}Ce sujongkwa de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1599 :{SMALLFONT}{OPENQUOTES}Ce sub sandwich de {STRINGID} est un très bon choix{ENDQUOTES} +STR_1600 :{SMALLFONT}{OPENQUOTES}Ce cookie de {STRINGID} est un très bon choix{ENDQUOTES} STR_1601 : STR_1602 : STR_1603 : -STR_1604 :{SMALLFONT}{OPENQUOTES}This roast sausage from {STRINGID} are really good value{ENDQUOTES} +STR_1604 :{SMALLFONT}{OPENQUOTES}Cette saucisse grillée de {STRINGID} est un très bon choix{ENDQUOTES} STR_1605 : STR_1606 : STR_1607 : @@ -1618,27 +1619,27 @@ STR_1612 : STR_1613 : STR_1614 : STR_1615 : -STR_1616 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} -STR_1617 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} -STR_1618 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} -STR_1619 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a pretzel from {STRINGID}{ENDQUOTES} -STR_1620 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for hot chocolate from {STRINGID}{ENDQUOTES} -STR_1621 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for iced tea from {STRINGID}{ENDQUOTES} -STR_1622 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a funnel cake from {STRINGID}{ENDQUOTES} -STR_1623 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sunglasses from {STRINGID}{ENDQUOTES} -STR_1624 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for beef noodles from {STRINGID}{ENDQUOTES} -STR_1625 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fried rice noodles from {STRINGID}{ENDQUOTES} -STR_1626 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for wonton soup from {STRINGID}{ENDQUOTES} -STR_1627 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for meatball soup from {STRINGID}{ENDQUOTES} -STR_1628 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for fruit juice from {STRINGID}{ENDQUOTES} -STR_1629 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for soybean milk from {STRINGID}{ENDQUOTES} -STR_1630 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for sujongkwa from {STRINGID}{ENDQUOTES} -STR_1631 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a sub sandwich from {STRINGID}{ENDQUOTES} -STR_1632 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cookie from {STRINGID}{ENDQUOTES} +STR_1616 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour une photo sur le vif de {STRINGID}{ENDQUOTES} +STR_1617 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour une photo sur le vif de {STRINGID}{ENDQUOTES} +STR_1618 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour une photo sur le vif de {STRINGID}{ENDQUOTES} +STR_1619 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un bretzel de {STRINGID}{ENDQUOTES} +STR_1620 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un chocolat chaud de {STRINGID}{ENDQUOTES} +STR_1621 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour du thé glacé de {STRINGID}{ENDQUOTES} +STR_1622 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un funnel cake de {STRINGID}{ENDQUOTES} +STR_1623 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour des lunettes de soleil de {STRINGID}{ENDQUOTES} +STR_1624 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour des nouilles au boeuf de {STRINGID}{ENDQUOTES} +STR_1625 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour des nouilles au riz frit de {STRINGID}{ENDQUOTES} +STR_1626 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour une soupe aux raviolis de {STRINGID}{ENDQUOTES} +STR_1627 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour une soupe aux boulettes de viandes de {STRINGID}{ENDQUOTES} +STR_1628 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un jus de fruits de {STRINGID}{ENDQUOTES} +STR_1629 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour du lait de soja de {STRINGID}{ENDQUOTES} +STR_1630 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un sujongkwa de {STRINGID}{ENDQUOTES} +STR_1631 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un sub sandwich de {STRINGID}{ENDQUOTES} +STR_1632 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour un cookie de {STRINGID}{ENDQUOTES} STR_1633 : STR_1634 : STR_1635 : -STR_1636 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a roast sausage from {STRINGID}{ENDQUOTES} +STR_1636 :{SMALLFONT}{OPENQUOTES}Je ne paierai pas autant pour une saucisse grillée de {STRINGID}{ENDQUOTES} STR_1637 : STR_1638 : STR_1639 : @@ -1650,124 +1651,124 @@ STR_1644 : STR_1645 : STR_1646 : STR_1647 : -STR_1648 :{SMALLFONT}{OPENQUOTES}Help! Put me down!{ENDQUOTES} -STR_1649 :{SMALLFONT}{OPENQUOTES}I'm running out of cash!{ENDQUOTES} -STR_1650 :{SMALLFONT}{OPENQUOTES}Wow! A new ride being built!{ENDQUOTES} -STR_1651 :{SMALLFONT}{OPENQUOTES}Nice ride! But not as good as the Phoenix...{ENDQUOTES} -STR_1652 :{SMALLFONT}{OPENQUOTES}I'm so excited - It's an Intamin ride!{ENDQUOTES} -STR_1653 :{SMALLFONT}{OPENQUOTES}...and here we are on {STRINGID}!{ENDQUOTES} -STR_1654 :{WINDOW_COLOUR_2}Recent thoughts: -STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land -STR_1656 :{SMALLFONT}{BLACK}Construct bridge or tunnel footpath +STR_1648 :{SMALLFONT}{OPENQUOTES}À l'aide! Déposez-moi!{ENDQUOTES} +STR_1649 :{SMALLFONT}{OPENQUOTES}Je n'ai plus d'argent!{ENDQUOTES} +STR_1650 :{SMALLFONT}{OPENQUOTES}Wow! Une nouvelle attraction en cours de construction!{ENDQUOTES} +STR_1651 :{SMALLFONT}{OPENQUOTES}Super attraction! Mais pas aussi bien que le Phoenix...{ENDQUOTES} +STR_1652 :{SMALLFONT}{OPENQUOTES}Je suis tellement excité - C'est une attraction Intamin!{ENDQUOTES} +STR_1653 :{SMALLFONT}{OPENQUOTES}...et là nous sommes sur {STRINGID}!{ENDQUOTES} +STR_1654 :{WINDOW_COLOUR_2}Pensées récentes: +STR_1655 :{SMALLFONT}{BLACK}Construire un chemin sur le terrain +STR_1656 :{SMALLFONT}{BLACK}Construire un pont ou un tunnel STR_1657 :{WINDOW_COLOUR_2}Attraction favorite -STR_1658 :{WINDOW_COLOUR_2}intensity: {BLACK}less than {COMMA16} +STR_1658 :{WINDOW_COLOUR_2}intensité: {BLACK}moins de {COMMA16} STR_1659 :{WINDOW_COLOUR_2}intensité: {BLACK}entre {COMMA16} et {COMMA16} -STR_1660 :{WINDOW_COLOUR_2}intensity: {BLACK}more than {COMMA16} +STR_1660 :{WINDOW_COLOUR_2}intensité: {BLACK}plus de {COMMA16} STR_1661 :{WINDOW_COLOUR_2}Tolérance nausée: {BLACK}{STRINGID} STR_1662 :{WINDOW_COLOUR_2}Bonheur: STR_1663 :{WINDOW_COLOUR_2}Nausée: -STR_1664 :{WINDOW_COLOUR_2}Energie: +STR_1664 :{WINDOW_COLOUR_2}Énergie: STR_1665 :{WINDOW_COLOUR_2}Faim: STR_1666 :{WINDOW_COLOUR_2}Soif: STR_1667 :{WINDOW_COLOUR_2}Toilettes: -STR_1668 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}Unknown +STR_1668 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}Inconnue STR_1669 :{WINDOW_COLOUR_2}Satisfaction: {BLACK}{COMMA16}% -STR_1670 :{WINDOW_COLOUR_2}Total customers: {BLACK}{COMMA32} -STR_1671 :{WINDOW_COLOUR_2}Total profit: {BLACK}{CURRENCY2DP} +STR_1670 :{WINDOW_COLOUR_2}Total de clients: {BLACK}{COMMA32} +STR_1671 :{WINDOW_COLOUR_2}Profit total: {BLACK}{CURRENCY2DP} STR_1672 :Freins STR_1673 :Spinning Control Toggle Track -STR_1674 :Brake speed +STR_1674 :Vitesse des freins STR_1675 :{POP16}{VELOCITY} -STR_1676 :{SMALLFONT}{BLACK}Set speed limit for brakes -STR_1677 :{WINDOW_COLOUR_2}Popularity: {BLACK}Unknown -STR_1678 :{WINDOW_COLOUR_2}Popularity: {BLACK}{COMMA16}% -STR_1679 :Helix up (left) -STR_1680 :Helix up (right) -STR_1681 :Helix down (left) -STR_1682 :Helix down (right) +STR_1676 :{SMALLFONT}{BLACK}Définir la limite de vitesse pour les freins +STR_1677 :{WINDOW_COLOUR_2}Popularité: {BLACK}Inconnue +STR_1678 :{WINDOW_COLOUR_2}Popularité: {BLACK}{COMMA16}% +STR_1679 :Hélice montante (gauche) +STR_1680 :Hélice montante (droite) +STR_1681 :Hélice descendante (gauche) +STR_1682 :Hélice descendante (droite) STR_1683 :Base size 2 x 2 STR_1684 :Base size 4 x 4 STR_1685 :Base size 2 x 4 STR_1686 :Base size 5 x 1 STR_1687 :Water splash STR_1688 :Base size 4 x 1 -STR_1689 :Block brakes +STR_1689 :Blocs de freins STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} -STR_1691 :{WINDOW_COLOUR_2} Cost: {BLACK}{CURRENCY} -STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY} +STR_1691 :{WINDOW_COLOUR_2} Coût: {BLACK}{CURRENCY} +STR_1692 :{WINDOW_COLOUR_2} Coût: {BLACK}de {CURRENCY} STR_1693 :{SMALLFONT}{BLACK}Visiteurs STR_1694 :{SMALLFONT}{BLACK}Personnel -STR_1695 :{SMALLFONT}{BLACK}Income and costs -STR_1696 :{SMALLFONT}{BLACK}Customer information -STR_1697 :Cannot place these on queue line area -STR_1698 :Can only place these on queue area -STR_1699 :Too many people in game -STR_1700 :Hire new Handyman -STR_1701 :Hire new Mechanic -STR_1702 :Hire new Security Guard -STR_1703 :Hire new Entertainer -STR_1704 :Can't hire new staff... -STR_1705 :{SMALLFONT}{BLACK}Sack this staff member -STR_1706 :{SMALLFONT}{BLACK}Move this person to a new location -STR_1707 :Too many staff in game -STR_1708 :{SMALLFONT}{BLACK}Set patrol area for this staff member -STR_1709 :Sack staff +STR_1695 :{SMALLFONT}{BLACK}Profit et coûts +STR_1696 :{SMALLFONT}{BLACK}Informations sur les clients +STR_1697 :Impossible de les placer sur une file d'attente +STR_1698 :Ne peut être placé que sur une file d'attente +STR_1699 :Trop de personnes en jeu +STR_1700 :Embaucher un nouvel homme de service +STR_1701 :Embaucher un nouveau mécanicien +STR_1702 :Embaucher un nouvel agent de sécurité +STR_1703 :Embaucher un nouvel animateur +STR_1704 :Impossible d'embaucher de nouveaux employés... +STR_1705 :{SMALLFONT}{BLACK}Licencier cet employé +STR_1706 :{SMALLFONT}{BLACK}Déplacer cette personne vers une nouvelle localisation +STR_1707 :Trop d'employés en jeu +STR_1708 :{SMALLFONT}{BLACK}Définir une zone de patrouille pour cet employé +STR_1709 :Licencier des employés STR_1710 :Oui -STR_1711 :{WINDOW_COLOUR_1}Are you sure you want to sack {STRINGID}? -STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Sweep footpaths -STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Water gardens -STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Empty litter bins -STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Mow grass +STR_1711 :{WINDOW_COLOUR_1}Êtes-vous sûr de vouloir licencier {STRINGID}? +STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Balayer les chemins +STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Arroser les jardins +STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Vider les poubelles +STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Tondre le gazon STR_1716 :Nom du parc non valide STR_1717 :Impossible de renommer le parc... -STR_1718 :Nom dur parc +STR_1718 :Nom du parc STR_1719 :Saisir nom du parc: -STR_1720 :{SMALLFONT}{BLACK}Name park +STR_1720 :{SMALLFONT}{BLACK}Nommer le parc STR_1721 :Parc fermé STR_1722 :Parc ouvert -STR_1723 :Can't open park... -STR_1724 :Can't close park... -STR_1725 :Impossible d'acheter le terrain... +STR_1723 :Impossible d'ouvrir le parc... +STR_1724 :Impossible de fermer le parc... +STR_1725 :Impossible d'acheter ce terrain... STR_1726 :Ce terrain n'est pas a vendre! STR_1727 :Les droits de construction ne sont pas à vendre! -STR_1728 :Impossible d'acheter les droits de construction içi... -STR_1729 :Land not owned by park! -STR_1730 :{RED}Closed - - +STR_1728 :Impossible d'acheter les droits de construction ici... +STR_1729 :Ce terrain n'appartient pas au parc! +STR_1730 :{RED}Fermé - - STR_1731 :{WHITE}{STRINGID} - - -STR_1732 :Build +STR_1732 :Construire STR_1733 :Mode -STR_1734 :{WINDOW_COLOUR_2}Number of laps: -STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit +STR_1734 :{WINDOW_COLOUR_2}Nombre de tours: +STR_1735 :{SMALLFONT}{BLACK}Nombre de tours du circuit STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1737 :{COMMA16} -STR_1738 :Can't change number of laps... -STR_1739 :Race won by guest {INT32} +STR_1738 :Impossible de changer le nombre de tours... +STR_1739 :Course gagnée par visiteur {INT32} STR_1740 :Course gagnée par {STRINGID} -STR_1741 :Not yet constructed ! -STR_1742 :{WINDOW_COLOUR_2}Max. people on ride: -STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this ride at one time +STR_1741 :Pas encore construit! +STR_1742 :{WINDOW_COLOUR_2}Personnes max. sur l'attraction: +STR_1743 :{SMALLFONT}{BLACK}Nombre maximum de personnes autorisées sur cette attraction en même temps STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1745 :{COMMA16} -STR_1746 :Can't change this... -STR_1747 :{WINDOW_COLOUR_2}Time limit: -STR_1748 :{SMALLFONT}{BLACK}Time limit for ride +STR_1746 :Impossible de changer ceci... +STR_1747 :{WINDOW_COLOUR_2}Limite de temps: +STR_1748 :{SMALLFONT}{BLACK}Limite de temps pour l'attraction STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} STR_1750 :{DURATION} -STR_1751 :Can't change time limit for ride... -STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park -STR_1753 :{SMALLFONT}{BLACK}Show summarised list of guests in park -STR_1754 :{BLACK}{COMMA16} guests -STR_1755 :{BLACK}{COMMA16} guest -STR_1756 :{WINDOW_COLOUR_2}Admission price: -STR_1757 :{WINDOW_COLOUR_2}Reliability: {MOVE_X}{255}{BLACK}{COMMA16}% -STR_1758 :{SMALLFONT}{BLACK}Build mode -STR_1759 :{SMALLFONT}{BLACK}Move mode -STR_1760 :{SMALLFONT}{BLACK}Fill-in mode -STR_1761 :{SMALLFONT}{BLACK}Build maze in this direction +STR_1751 :Impossible de changer la limite de temps pour l'attraction... +STR_1752 :{SMALLFONT}{BLACK}Afficher la liste de chaque visiteur dans le parc +STR_1753 :{SMALLFONT}{BLACK}Afficher la liste résumée des visiteurs dans le parc +STR_1754 :{BLACK}{COMMA16} visiteurs +STR_1755 :{BLACK}{COMMA16} visiteur +STR_1756 :{WINDOW_COLOUR_2}Prix d'entrée: +STR_1757 :{WINDOW_COLOUR_2}Fiabilité: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1758 :{SMALLFONT}{BLACK}Mode construction +STR_1759 :{SMALLFONT}{BLACK}Mode déplacement +STR_1760 :{SMALLFONT}{BLACK}Mode remplissage +STR_1761 :{SMALLFONT}{BLACK}Construire le labyrinthe dans cette direction STR_1762 :Cascades STR_1763 :Rapides -STR_1764 :Log Bumps -STR_1765 :On-ride photo section +STR_1764 :Rondins de bois +STR_1765 :Section photo sur le vif STR_1766 :Reverser turntable STR_1767 :Spinning tunnel STR_1768 :Can't change number of swings... @@ -1775,56 +1776,56 @@ STR_1769 :{WINDOW_COLOUR_2}Number of swings: STR_1770 :{SMALLFONT}{BLACK}Number of complete swings STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1772 :{COMMA16} -STR_1773 :Only one on-ride photo section allowed per ride -STR_1774 :Only one cable lift hill allowed per ride +STR_1773 :Seulement une section photo sur le vif autorisée par attraction +STR_1774 :Seulement une montée par câble autorisée par attraction STR_1775 :Éteint STR_1776 :Allumé -STR_1777 :{WINDOW_COLOUR_2}Music +STR_1777 :{WINDOW_COLOUR_2}Musique STR_1778 :{STRINGID} - - -STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume -STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume -STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume -STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume -STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume -STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snowman costume -STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Knight costume -STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume -STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume -STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume -STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume -STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff -STR_1791 :{WINDOW_COLOUR_2}Uniform colour: -STR_1792 :Responding to {STRINGID} breakdown call +STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Costume de panda +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Costume de tigre +STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Costume d'éléphant +STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Costume romain +STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Costume de gorille +STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Costume de bonhomme de neige +STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Costume de chevalier +STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Costume d'astronaute +STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Costume de bandit +STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Costume de shérif +STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Costume de pirate +STR_1790 :{SMALLFONT}{BLACK}Sélectionnez la couleur de l'uniforme pour ce type d'employé +STR_1791 :{WINDOW_COLOUR_2}Couleur d'uniforme: +STR_1792 :Répond à l'appel sur l'incident de {STRINGID} STR_1793 :Se rend à {STRINGID} pour une inspection STR_1794 :Répare {STRINGID} -STR_1795 :Answering radio call -STR_1796 :Has broken down and requires fixing -STR_1797 :This option cannot be changed for this ride -STR_1798 :Tourbillion +STR_1795 :Répond à l'appel radio +STR_1796 :S'est cassé et nécessite une réparation +STR_1797 :Cette option ne peut être changée pour cette attraction +STR_1798 :Tourbillon STR_1799 :{POP16}{POP16}{POP16}{POP16}{POP16}{CURRENCY2DP} -STR_1800 :Safety cut-out +STR_1800 :Contour de sécurité STR_1801 :Restraints stuck closed STR_1802 :Restraints stuck open -STR_1803 :Doors stuck closed -STR_1804 :Doors stuck open -STR_1805 :Vehicle malfunction -STR_1806 :Brakes failure -STR_1807 :Control failure -STR_1808 :{WINDOW_COLOUR_2}Last breakdown: {BLACK}{STRINGID} -STR_1809 :{WINDOW_COLOUR_2}Current breakdown: {OUTLINE}{RED}{STRINGID} -STR_1810 :{WINDOW_COLOUR_2}Carrying: -STR_1811 :Can't build this here... +STR_1803 :Portes restent fermées +STR_1804 :Portes restent ouvertes +STR_1805 :Malfonction d'un véhicule +STR_1806 :Défaillance des freins +STR_1807 :Défaillance des contrôles +STR_1808 :{WINDOW_COLOUR_2}Dernier incident: {BLACK}{STRINGID} +STR_1809 :{WINDOW_COLOUR_2}Incident actuel: {OUTLINE}{RED}{STRINGID} +STR_1810 :{WINDOW_COLOUR_2}Porte: +STR_1811 :Impossible de construire ça ici... STR_1812 :{SMALLFONT}{BLACK}{STRINGID} -STR_1813 :Miscellaneous Objects +STR_1813 :Objets divers STR_1814 :Actions -STR_1815 :Thoughts +STR_1815 :Pensées STR_1816 :{SMALLFONT}{BLACK}Select information type to show in guest list STR_1817 :({COMMA16}) STR_1818 :{WINDOW_COLOUR_2}Tous les visiteurs STR_1819 :{WINDOW_COLOUR_2}Tous les visiteurs (résumé) STR_1820 :{WINDOW_COLOUR_2}Visiteurs {STRINGID} -STR_1821 :{WINDOW_COLOUR_2}Guests thinking {STRINGID} -STR_1822 :{WINDOW_COLOUR_2}Guests thinking about {POP16}{STRINGID} +STR_1821 :{WINDOW_COLOUR_2}Visiteurs pensant {STRINGID} +STR_1822 :{WINDOW_COLOUR_2}Visiteurs pensant à {POP16}{STRINGID} STR_1823 :{SMALLFONT}{BLACK}Show guests' thoughts about this ride/attraction STR_1824 :{SMALLFONT}{BLACK}Show guests on this ride/attraction STR_1825 :{SMALLFONT}{BLACK}Show guests queuing for this ride/attraction @@ -1851,7 +1852,7 @@ STR_1845 :{MONTHYEAR} STR_1846 :{COMMA16} visiteurs STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} visiteurs STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} visiteurs -STR_1849 :{WINDOW_COLOUR_2}Play music +STR_1849 :{WINDOW_COLOUR_2}Jouer de la musique STR_1850 :{SMALLFONT}{BLACK}Select whether music should be played for this ride STR_1851 :{WINDOW_COLOUR_2}Running cost: {BLACK}{CURRENCY2DP} per hour STR_1852 :{WINDOW_COLOUR_2}Running cost: {BLACK}Unknown @@ -1861,11 +1862,11 @@ STR_1855 :{WINDOW_COLOUR_2}Built: {BLACK}{COMMA16} Years Ago STR_1856 :{WINDOW_COLOUR_2}Profit per item sold: {BLACK}{CURRENCY2DP} STR_1857 :{WINDOW_COLOUR_2}Loss per item sold: {BLACK}{CURRENCY2DP} STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY2DP} per month -STR_1859 :Ouvriers +STR_1859 :Hommes de service STR_1860 :Mécaniciens STR_1861 :Gardes de sécurité STR_1862 :Animateurs -STR_1863 :Ouvrier +STR_1863 :Homme de service STR_1864 :Mécanicien STR_1865 :Garde de sécurité STR_1866 :Animateur @@ -1875,11 +1876,11 @@ STR_1869 :{WINDOW_COLOUR_2}Number of rotations: STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1872 :{COMMA16} -STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY2DP} per hour -STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour +STR_1873 :{WINDOW_COLOUR_2}Revenu: {BLACK}{CURRENCY2DP} par heure +STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} par heure STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} -STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides -STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides +STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspecter les attractions +STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Réparer les attractions STR_1878 :{WINDOW_COLOUR_2}Inspection : STR_1879 :Toutes les 10 minutes STR_1880 :Toutes les 20 minutes @@ -1888,18 +1889,18 @@ STR_1882 :Toutes les 45 minutes STR_1883 :Toutes les heures STR_1884 :Toutes les 2 heures STR_1885 :Jamais -STR_1886 :Inspecting {STRINGID} -STR_1887 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}{COMMA16} minutes -STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hours -STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% -STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride -STR_1891 :No {STRINGID} in park yet! +STR_1886 :En train d'inspecter {STRINGID} +STR_1887 :{WINDOW_COLOUR_2}Temps écoulé depuis la dernière inspection: {BLACK}{COMMA16} minutes +STR_1888 :{WINDOW_COLOUR_2}Temps écoulé depuis la dernière inspection: {BLACK}plus de 4 heures +STR_1889 :{WINDOW_COLOUR_2}Temps d'arrêt: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1890 :{SMALLFONT}{BLACK}Sélectionnez la fréquence de vérification de l'attraction +STR_1891 :Pas encore de {STRINGID} dans le parc! # The following two strings were used to display an error when the disc was missing. # This has been replaced in OpenRCT2. STR_1892 : STR_1893 : -STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} -STR_1895 :{SMALLFONT}{BLACK}Build new ride/attraction +STR_1894 :{WINDOW_COLOUR_2}{STRINGID} vendu: {BLACK}{COMMA32} +STR_1895 :{SMALLFONT}{BLACK}Construire une nouvelle attraction STR_1896 :{WINDOW_COLOUR_2}Dépenses/Revenus STR_1897 :{WINDOW_COLOUR_2}Constr. attraction STR_1898 :{WINDOW_COLOUR_2}Coût d'expl. attr. @@ -1922,28 +1923,28 @@ STR_1914 :{BLACK}{CURRENCY2DP} STR_1915 :{RED}{CURRENCY2DP} STR_1916 :{WINDOW_COLOUR_2}Emprunt: STR_1917 :{POP16}{POP16}{POP16}{CURRENCY} -STR_1918 :Impossible d'emprunter d'avantage ! La banque refuse d'augmenter votre emprunt ! -STR_1919 :Pas assez d'argent disponible ! -STR_1920 :Impossible de rembourser l'emprunt ! +STR_1918 :Impossible d'emprunter d'avantage! La banque refuse d'augmenter votre emprunt! +STR_1919 :Pas assez d'argent disponible! +STR_1920 :Impossible de rembourser l'emprunt! STR_1921 :{SMALLFONT}{BLACK}Commencer une nouvelle partie STR_1922 :{SMALLFONT}{BLACK}Continuer une partie sauvegardée STR_1923 :{SMALLFONT}{BLACK}Didacticiel STR_1924 :{SMALLFONT}{BLACK}Quitter -STR_1925 :Can't place person here... +STR_1925 :Impossible de placer quelqu'un ici... STR_1926 :{SMALLFONT} -STR_1927 :{YELLOW}{STRINGID} has broken down -STR_1928 :{RED}{STRINGID} has crashed! -STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better -STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this guest - (If tracking is on, guest's movements will be reported in the message area) -STR_1931 :{STRINGID} has joined the queue line for {STRINGID} -STR_1932 :{STRINGID} is on {STRINGID} -STR_1933 :{STRINGID} is in {STRINGID} -STR_1934 :{STRINGID} has left {STRINGID} -STR_1935 :{STRINGID} has left the park -STR_1936 :{STRINGID} has bought {STRINGID} -STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message -STR_1938 :{SMALLFONT}{BLACK}Show view of guest -STR_1939 :{SMALLFONT}{BLACK}Show view of staff member +STR_1927 :{YELLOW}{STRINGID} s'est cassé +STR_1928 :{RED}{STRINGID} s'est écrasé! +STR_1929 :{RED}{STRINGID} n'est toujours pas réparé{NEWLINE}Vérifiez où sont vos mécaniciens et pensez à leur attribuer des zones de patrouilles +STR_1930 :{SMALLFONT}{BLACK}Activer/Désactiver la surveillance de ce visiteur - (Si la surveillance est activée, les mouvements du visiteur seront annoncés dans la zone de notifications) +STR_1931 :{STRINGID} a rejoint la file d'attente pour {STRINGID} +STR_1932 :{STRINGID} est sur {STRINGID} +STR_1933 :{STRINGID} est dans {STRINGID} +STR_1934 :{STRINGID} a quitté {STRINGID} +STR_1935 :{STRINGID} a quitté le parc +STR_1936 :{STRINGID} a acheté {STRINGID} +STR_1937 :{SMALLFONT}{BLACK}Afficher des informations à propos du sujet de ce message +STR_1938 :{SMALLFONT}{BLACK}Afficher vue du visiteur +STR_1939 :{SMALLFONT}{BLACK}Afficher vue de l'employé STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this guest STR_1941 :{SMALLFONT}{BLACK}Show which rides this guest has been on STR_1942 :{SMALLFONT}{BLACK}Show financial information about this guest @@ -1959,28 +1960,28 @@ STR_1951 :Graphique valeur du parc STR_1952 :Graphique bénéfices STR_1953 :Marketing STR_1954 :Financement recherches -STR_1955 :{WINDOW_COLOUR_2}Number of circuits: -STR_1956 :{SMALLFONT}{BLACK}Number of circuits of track per ride +STR_1955 :{WINDOW_COLOUR_2}Nombre de circuits: +STR_1956 :{SMALLFONT}{BLACK}Nombre de circuits de voie par attraction STR_1957 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1958 :{COMMA16} -STR_1959 :Can't change number of circuits... -STR_1960 :{WINDOW_COLOUR_2}Balloon price: -STR_1961 :{WINDOW_COLOUR_2}Cuddly Toy price: -STR_1962 :{WINDOW_COLOUR_2}Park Map price: -STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: -STR_1964 :{WINDOW_COLOUR_2}Umbrella price: -STR_1965 :{WINDOW_COLOUR_2}Drink price: -STR_1966 :{WINDOW_COLOUR_2}Burger price: -STR_1967 :{WINDOW_COLOUR_2}Chips price: -STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: -STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: +STR_1959 :Impossible de changer le nombre de circuits +STR_1960 :{WINDOW_COLOUR_2}Prix d'un ballon: +STR_1961 :{WINDOW_COLOUR_2}Prix d'une peluche: +STR_1962 :{WINDOW_COLOUR_2}Prix d'une carte du parc: +STR_1963 :{WINDOW_COLOUR_2}Prix d'une photo sur le vif: +STR_1964 :{WINDOW_COLOUR_2}Prix d'un parapluie: +STR_1965 :{WINDOW_COLOUR_2}Prix d'une boisson: +STR_1966 :{WINDOW_COLOUR_2}Prix d'un burger: +STR_1967 :{WINDOW_COLOUR_2}Prix des frites: +STR_1968 :{WINDOW_COLOUR_2}Prix d'une glace: +STR_1969 :{WINDOW_COLOUR_2}Prix d'une barbe-à-papa: STR_1970 :{WINDOW_COLOUR_2} STR_1971 :{WINDOW_COLOUR_2} STR_1972 :{WINDOW_COLOUR_2} -STR_1973 :{WINDOW_COLOUR_2}Pizza price: +STR_1973 :{WINDOW_COLOUR_2}Prix d'une pizza: STR_1974 :{WINDOW_COLOUR_2} -STR_1975 :{WINDOW_COLOUR_2}Popcorn price: -STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: +STR_1975 :{WINDOW_COLOUR_2}Prix du popcorn: +STR_1976 :{WINDOW_COLOUR_2}Prix d'un hot-dog: STR_1977 :{WINDOW_COLOUR_2}Tentacle price: STR_1978 :{WINDOW_COLOUR_2}Hat price: STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: @@ -2222,23 +2223,23 @@ STR_2214 :Construction not possible while game is paused! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F -STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled -STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} -STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} -STR_2221 :{SMALLFONT}{BLACK}Park Rating: {COMMA16} +STR_2218 :{RED}{STRINGID} sur {STRINGID} n'est pas encore revenu à {STRINGID}!{NEWLINE}Vérifiez si il est coinçé ou au point mort +STR_2219 :{RED}{COMMA16} personnes sont mortes dans un accident sur {STRINGID} +STR_2220 :{WINDOW_COLOUR_2}Notation du parc: {BLACK}{COMMA16} +STR_2221 :{SMALLFONT}{BLACK}Notation du parc: {COMMA16} STR_2222 :{SMALLFONT}{BLACK}{STRINGID} -STR_2223 :{WINDOW_COLOUR_2}Guests in park: {BLACK}{COMMA16} +STR_2223 :{WINDOW_COLOUR_2}Visiteurs dans le parc: {BLACK}{COMMA16} STR_2224 :{WINDOW_COLOUR_2}Argent: {BLACK}{CURRENCY2DP} STR_2225 :{WINDOW_COLOUR_2}Argent: {RED}{CURRENCY2DP} STR_2226 :{WINDOW_COLOUR_2}Valeur du parc: {BLACK}{CURRENCY} STR_2227 :{WINDOW_COLOUR_2}Valeur de l'entreprise: {BLACK}{CURRENCY} -STR_2228 :{WINDOW_COLOUR_2}Last month's profit from food/drink and{NEWLINE}merchandise sales: {BLACK}{CURRENCY} +STR_2228 :{WINDOW_COLOUR_2}Profits du mois dernier provenant de l'alimentation et{NEWLINE} de la vente de marchandise: {BLACK}{CURRENCY} STR_2229 :Slope up to vertical STR_2230 :Vertical track STR_2231 :Holding brake for drop -STR_2232 :Cable lift hill -STR_2233 :{SMALLFONT}{BLACK}Park information -STR_2234 :Recent Messages +STR_2232 :Montée par câble +STR_2233 :{SMALLFONT}{BLACK}Informations sur le parc +STR_2234 :Messages récents STR_2235 :{SMALLFONT}{STRINGID} {STRINGID} STR_2236 :Janvier STR_2237 :Février @@ -3805,7 +3806,7 @@ STR_5464 :General STR_5465 :Climate STR_5466 :Personnel STR_5467 :ALT + -STR_5468 :Recent messages +STR_5468 :Messages récents STR_5469 :Scroll map up STR_5470 :Scroll map left STR_5471 :Scroll map down @@ -3813,20 +3814,20 @@ STR_5472 :Scroll map right STR_5473 :Cycle day / night STR_5474 :Display text on banners in upper case STR_5475 :{COMMA16} semaines -STR_5476 :Hardware -STR_5477 :Map rendering -STR_5478 :Controls -STR_5479 :Toolbar +STR_5476 :Matériel +STR_5477 :Rendu de la carte +STR_5478 :Contrôles +STR_5479 :Barre d'outils STR_5480 :Show toolbar buttons for: STR_5481 :Thèmes -STR_5482 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}1 minute -STR_5483 :{BLACK}({COMMA16} weeks remaining) -STR_5484 :{BLACK}({COMMA16} week remaining) +STR_5482 :{WINDOW_COLOUR_2}Temps écoulé depuis la dernière inspection: {BLACK}une minute +STR_5483 :{BLACK}({COMMA16} semaines restantes) +STR_5484 :{BLACK}({COMMA16} semaine restante) STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} -STR_5487 :{SMALLFONT}{BLACK}Show recent messages -STR_5488 :No entrance -STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests -STR_5490 :Disable audio on focus loss -STR_5491 :Inventions list +STR_5487 :{SMALLFONT}{BLACK}Afficher les messages récents +STR_5488 :Pas d'entrée +STR_5489 :{SMALLFONT}{BLACK}Afficher seulement les visiteurs surveillés +STR_5490 :Couper le son lorsque la fenêtre est minimisée +STR_5491 :Liste d'inventions STR_5492 :Options scénario diff --git a/data/language/german.txt b/data/language/german.txt index ecd0c51591..91d718128d 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3889,3 +3889,15 @@ STR_5552 :{POP16}{POP16}Jahr {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {M STR_5553 :Spiel bei geöffnetem Steam Overlay pausieren STR_5554 :{SMALLFONT}{BLACK}Gebirgswerkzeug aktivieren STR_5555 :Fahrzeuge anderer Streckentyp. anzeigen +STR_5556 :Spieler entfernen +STR_5557 :Nach Desync. verbunden bleiben (Mehrspieler) + +####################### +# Bahnen/Attraktionen # +####################### + +#WW +[CONDORRD] +STR_NAME :Kondorbahn +STR_DESC :Die Passagiere fahren, in speziellen Gurten hängend, unterhalb der Strecke. In den kondorförmigen Wagen erleben sie dabei ein Gefühl des Fliegens. +STR_CPTY :4 Fahrgäste pro Wagen From 5c611dc600ef9a355c5bc214dcce5cf37c0614d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Tue, 20 Oct 2015 17:35:31 +0200 Subject: [PATCH 0858/1173] Optimize peep functions --- src/peep/peep.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 845d2738cc..2f77c1efcb 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -8612,8 +8612,8 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) // Take nearby rides into consideration int cx = floor2(peep->x, 32); int cy = floor2(peep->y, 32); - for (int x = cx - 320; x <= cx + 320; x++) { - for (int y = cy - 320; y <= cy + 320; y++) { + for (int x = cx - 320; x <= cx + 320; x += 32) { + for (int y = cy - 320; y <= cy + 320; y += 32) { if (x >= 0 && y >= 0 && x < (256 * 32) && y < (256 * 32)) { rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); do { @@ -8728,8 +8728,8 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) // Take nearby rides into consideration int cx = floor2(peep->x, 32); int cy = floor2(peep->y, 32); - for (int x = cx - 320; x <= cx + 320; x++) { - for (int y = cy - 320; y <= cy + 320; y++) { + for (int x = cx - 320; x <= cx + 320; x += 32) { + for (int y = cy - 320; y <= cy + 320; y += 32) { if (x >= 0 && y >= 0 && x < (256 * 32) && y < (256 * 32)) { rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); do { @@ -8840,8 +8840,8 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl // Take nearby rides into consideration int cx = floor2(peep->x, 32); int cy = floor2(peep->y, 32); - for (int x = cx - 320; x <= cx + 320; x++) { - for (int y = cy - 320; y <= cy + 320; y++) { + for (int x = cx - 320; x <= cx + 320; x += 32) { + for (int y = cy - 320; y <= cy + 320; y += 32) { if (x >= 0 && y >= 0 && x < (256 * 32) && y < (256 * 32)) { rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); do { From 6cf6c4be25e45b685b9bb3b1ea76c8ac1badeefa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Tue, 20 Oct 2015 18:06:03 +0200 Subject: [PATCH 0859/1173] Optimize bitscanforward using intrinsic function --- src/util/util.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/util/util.c b/src/util/util.c index f17ac3f424..d7f081357b 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -143,11 +143,16 @@ int bitscanforward(int source) { int i; + #if _MSC_VER >= 1400 // Visual Studio 2005 + _BitScanForward(&i, source); + return i; + #else for (i = 0; i < 32; i++) if (source & (1 << i)) return i; return -1; + #endif } int bitcount(int source) From d531243c986dd613c5b2bf110d604cdc2d11d9e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Tue, 20 Oct 2015 18:10:05 +0200 Subject: [PATCH 0860/1173] Optimize bitscanforward using intrinsic function --- src/util/util.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/util/util.c b/src/util/util.c index f17ac3f424..d7f081357b 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -143,11 +143,16 @@ int bitscanforward(int source) { int i; + #if _MSC_VER >= 1400 // Visual Studio 2005 + _BitScanForward(&i, source); + return i; + #else for (i = 0; i < 32; i++) if (source & (1 << i)) return i; return -1; + #endif } int bitcount(int source) From 7d0ce00baba5cb871d355f68ecd11f4cdd3cd893 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 20 Oct 2015 20:16:30 +0200 Subject: [PATCH 0861/1173] Strip all whitespace --- distribution/windows/install.nsi | 24 +- projects/resource.h | 2 +- src/audio/mixer.cpp | 4 +- src/audio/mixer.h | 4 +- src/cheats.h | 4 +- src/cmdline.c | 6 +- src/cmdline.h | 4 +- src/cmdline_sprite.c | 20 +- src/config.h | 4 +- src/drawing/drawing.h | 6 +- src/drawing/font.c | 4 +- src/drawing/line.c | 4 +- src/drawing/rain.c | 14 +- src/drawing/rect.c | 20 +- src/drawing/scrolling_text.c | 10 +- src/drawing/sprite.c | 20 +- src/editor.c | 14 +- src/editor.h | 4 +- src/game.h | 6 +- src/hook.h | 4 +- src/input.c | 42 ++-- src/input.h | 4 +- src/interface/console.c | 4 +- src/interface/graph.c | 4 +- src/interface/graph.h | 4 +- src/interface/keyboard_shortcut.c | 8 +- src/interface/keyboard_shortcut.h | 4 +- src/interface/screenshot.h | 4 +- src/interface/themes.c | 4 +- src/interface/title_sequences.c | 10 +- src/interface/viewport.h | 4 +- src/interface/viewport_interaction.c | 34 +-- src/interface/widget.c | 54 ++--- src/interface/widget.h | 4 +- src/interface/window.h | 10 +- src/intro.c | 8 +- src/intro.h | 6 +- src/management/award.c | 6 +- src/management/award.h | 4 +- src/management/finance.c | 4 +- src/management/marketing.c | 8 +- src/management/marketing.h | 4 +- src/management/news_item.c | 10 +- src/management/news_item.h | 4 +- src/management/research.c | 12 +- src/management/research.h | 6 +- src/network/network.cpp | 12 +- src/network/network.h | 4 +- src/network/twitch.cpp | 2 +- src/openrct2.h | 4 +- src/peep/peep.c | 4 +- src/peep/peep.h | 12 +- src/peep/staff.c | 6 +- src/peep/staff.h | 4 +- src/platform/osx.c | 4 +- src/platform/shared.c | 2 +- src/rct1.c | 18 +- src/rct1.h | 6 +- src/rct2.c | 22 +- src/ride/ride.h | 8 +- src/ride/ride_data.h | 4 +- src/ride/ride_ratings.c | 98 ++++---- src/ride/ride_ratings.h | 4 +- src/ride/station.c | 6 +- src/ride/station.h | 4 +- src/ride/track.h | 6 +- src/ride/track_data.c | 138 +++++------ src/ride/vehicle.c | 14 +- src/ride/vehicle.h | 4 +- src/scenario_list.c | 10 +- src/sprites.h | 6 +- src/title.h | 6 +- src/tutorial.c | 4 +- src/tutorial.h | 4 +- src/util/util.c | 4 +- src/util/util.h | 4 +- src/windows/about.c | 12 +- src/windows/banner.c | 32 +-- src/windows/cheats.c | 10 +- src/windows/clear_scenery.c | 10 +- src/windows/dropdown.c | 12 +- src/windows/dropdown.h | 4 +- src/windows/editor_bottom_toolbar.c | 14 +- src/windows/editor_inventions_list.c | 18 +- src/windows/editor_object_selection.c | 46 ++-- src/windows/editor_objective_options.c | 6 +- src/windows/editor_scenario_options.c | 10 +- src/windows/error.c | 12 +- src/windows/error.h | 4 +- src/windows/finances.c | 58 ++--- src/windows/footpath.c | 58 ++--- src/windows/game_bottom_toolbar.c | 18 +- src/windows/guest_list.c | 48 ++-- src/windows/install_track.c | 4 +- src/windows/land.c | 4 +- src/windows/land_rights.c | 4 +- src/windows/loadsave.c | 8 +- src/windows/main.c | 6 +- src/windows/map.c | 30 +-- src/windows/map_tooltip.c | 12 +- src/windows/mapgen.c | 8 +- src/windows/maze_construction.c | 18 +- src/windows/music_credits.c | 4 +- src/windows/network_status.c | 4 +- src/windows/new_campaign.c | 22 +- src/windows/new_ride.c | 14 +- src/windows/news.c | 22 +- src/windows/options.c | 20 +- src/windows/park.c | 66 +++--- src/windows/player_list.c | 4 +- src/windows/research.c | 26 +- src/windows/ride.c | 314 ++++++++++++------------- src/windows/ride_construction.c | 66 +++--- src/windows/ride_list.c | 40 ++-- src/windows/save_prompt.c | 4 +- src/windows/scenery.c | 28 +-- src/windows/server_list.c | 4 +- src/windows/shortcut_keys.c | 6 +- src/windows/sign.c | 6 +- src/windows/staff.c | 30 +-- src/windows/staff_fire_prompt.c | 8 +- src/windows/staff_list.c | 8 +- src/windows/text_input.c | 14 +- src/windows/themes.c | 2 +- src/windows/tile_inspector.c | 2 +- src/windows/title_command_editor.c | 14 +- src/windows/title_editor.c | 28 +-- src/windows/title_exit.c | 6 +- src/windows/title_logo.c | 6 +- src/windows/title_menu.c | 4 +- src/windows/title_options.c | 4 +- src/windows/title_scenarioselect.c | 8 +- src/windows/tooltip.c | 18 +- src/windows/tooltip.h | 4 +- src/windows/top_toolbar.c | 80 +++---- src/windows/track_list.c | 6 +- src/windows/track_manage.c | 4 +- src/windows/track_place.c | 20 +- src/windows/viewport.c | 6 +- src/windows/water.c | 6 +- src/world/banner.c | 4 +- src/world/banner.h | 4 +- src/world/climate.c | 24 +- src/world/climate.h | 4 +- src/world/footpath.c | 40 ++-- src/world/footpath.h | 4 +- src/world/fountain.c | 10 +- src/world/fountain.h | 4 +- src/world/map.c | 84 +++---- src/world/map.h | 4 +- src/world/map_animation.c | 8 +- src/world/map_animation.h | 4 +- src/world/map_helpers.c | 12 +- src/world/map_helpers.h | 4 +- src/world/mapgen.c | 8 +- src/world/mapgen.h | 4 +- src/world/park.c | 40 ++-- src/world/park.h | 4 +- src/world/scenery.c | 12 +- src/world/scenery.h | 4 +- src/world/sprite.c | 10 +- src/world/sprite.h | 4 +- test/tests.c | 2 +- 163 files changed, 1280 insertions(+), 1280 deletions(-) diff --git a/distribution/windows/install.nsi b/distribution/windows/install.nsi index 83c2e0ea5d..837658b62f 100644 --- a/distribution/windows/install.nsi +++ b/distribution/windows/install.nsi @@ -121,7 +121,7 @@ Section "!OpenRCT2" Section1 ; Copy the rest of the stuff SetOutPath "$INSTDIR\" - + ; Copy curl ca file File ..\..\curl-ca-bundle.crt @@ -370,14 +370,14 @@ FunctionEnd ; $var=2 Version2 is newer Function VersionCompare !define VersionCompare `!insertmacro VersionCompareCall` - + !macro VersionCompareCall _VER1 _VER2 _RESULT Push `${_VER1}` Push `${_VER2}` Call VersionCompare Pop ${_RESULT} !macroend - + Exch $1 Exch Exch $0 @@ -388,7 +388,7 @@ Function VersionCompare Push $5 Push $6 Push $7 - + begin: StrCpy $2 -1 IntOp $2 $2 + 1 @@ -398,7 +398,7 @@ Function VersionCompare StrCpy $4 $0 $2 IntOp $2 $2 + 1 StrCpy $0 $0 '' $2 - + StrCpy $2 -1 IntOp $2 $2 + 1 StrCpy $3 $1 1 $2 @@ -407,32 +407,32 @@ Function VersionCompare StrCpy $5 $1 $2 IntOp $2 $2 + 1 StrCpy $1 $1 '' $2 - + StrCmp $4$5 '' equal - + StrCpy $6 -1 IntOp $6 $6 + 1 StrCpy $3 $4 1 $6 StrCmp $3 '0' -2 StrCmp $3 '' 0 +2 StrCpy $4 0 - + StrCpy $7 -1 IntOp $7 $7 + 1 StrCpy $3 $5 1 $7 StrCmp $3 '0' -2 StrCmp $3 '' 0 +2 StrCpy $5 0 - + StrCmp $4 0 0 +2 StrCmp $5 0 begin newer2 StrCmp $5 0 newer1 IntCmp $6 $7 0 newer1 newer2 - + StrCpy $4 '1$4' StrCpy $5 '1$5' IntCmp $4 $5 begin newer2 newer1 - + equal: StrCpy $0 0 goto end @@ -441,7 +441,7 @@ Function VersionCompare goto end newer2: StrCpy $0 2 - + end: Pop $7 Pop $6 diff --git a/projects/resource.h b/projects/resource.h index f70ccbffb2..545b58f6b5 100644 --- a/projects/resource.h +++ b/projects/resource.h @@ -3,7 +3,7 @@ // Used by openrct2.rc // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 101 diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index 75685e5209..ef0b5a6f7f 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/audio/mixer.h b/src/audio/mixer.h index 35fa5b92e1..0e6faf3218 100644 --- a/src/audio/mixer.h +++ b/src/audio/mixer.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/cheats.h b/src/cheats.h index 3c9c2d292d..ab46cfb676 100644 --- a/src/cheats.h +++ b/src/cheats.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/cmdline.c b/src/cmdline.c index a5619c103e..bfe317abe1 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -70,7 +70,7 @@ static const char *const usage[] = { */ int cmdline_run(const char **argv, int argc) { - // + // int version = 0, headless = 0, verbose = 0, width = 0, height = 0, port = 0; char *server = NULL; diff --git a/src/cmdline.h b/src/cmdline.h index f8e99229d1..91e2e33bc4 100644 --- a/src/cmdline.h +++ b/src/cmdline.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/cmdline_sprite.c b/src/cmdline_sprite.c index 80360d2590..a967c211fe 100644 --- a/src/cmdline_sprite.c +++ b/src/cmdline_sprite.c @@ -89,7 +89,7 @@ bool sprite_file_save(const char *path) SDL_RWops *file = SDL_RWFromFile(path, "wb"); if (file == NULL) return false; - + if (SDL_RWwrite(file, &spriteFileHeader, sizeof(rct_sprite_file_header), 1) != 1) { SDL_RWclose(file); return false; @@ -218,7 +218,7 @@ int get_closest_palette_index(sint16 *colour){ } int get_palette_index(sint16 *colour) -{ +{ if (is_transparent_pixel(colour)) return -1; @@ -267,7 +267,7 @@ bool sprite_file_import(const char *path, rct_g1_element *outElement, uint8 **ou } uint8 *dst = buffer + (height * 2); - + for (unsigned int y = 0; y < height; y++) { rle_code *previousCode, *currentCode; @@ -285,7 +285,7 @@ bool sprite_file_import(const char *path, rct_g1_element *outElement, uint8 **ou if (mode == MODE_CLOSEST || mode == MODE_DITHERING) if (paletteIndex == -1 && !is_transparent_pixel(src)) paletteIndex = get_closest_palette_index(src); - + if (mode == MODE_DITHERING) if (!is_transparent_pixel(src) && is_changable_pixel(get_palette_index(src))){ @@ -487,7 +487,7 @@ int cmdline_for_sprite(const char **argv, int argc) int maxIndex = (int)spriteFileHeader.num_entries; int numbers = (int)floor(log(maxIndex)); - + strncpy(outputPath, argv[2], MAX_PATH); int pathLen = strlen(outputPath); @@ -560,7 +560,7 @@ int cmdline_for_sprite(const char **argv, int argc) fprintf(stderr, "Unable to open input sprite file.\n"); return -1; } - + spriteFileHeader.num_entries++; spriteFileHeader.total_size += bufferLength; spriteFileEntries = realloc(spriteFileEntries, spriteFileHeader.num_entries * sizeof(rct_g1_element)); @@ -572,7 +572,7 @@ int cmdline_for_sprite(const char **argv, int argc) spriteFileEntries[spriteFileHeader.num_entries - 1] = spriteElement; memcpy(spriteFileData + (spriteFileHeader.total_size - bufferLength), buffer, bufferLength); spriteFileEntries[spriteFileHeader.num_entries - 1].offset = spriteFileData + (spriteFileHeader.total_size - bufferLength); - + free(buffer); if (!sprite_file_save(spriteFilePath)) return -1; @@ -672,7 +672,7 @@ static rct_sprite_file_palette_entry _standardPalette[256] = { { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, - // + // { 35, 35, 23, 255 }, { 51, 51, 35, 255 }, { 67, 67, 47, 255 }, @@ -865,9 +865,9 @@ static rct_sprite_file_palette_entry _standardPalette[256] = { { 207, 207, 131, 255 }, { 231, 231, 171, 255 }, { 255, 255, 207, 255 }, - + // 203 - 214 (Secondary remap) - { 27, 0, 63, 255 }, + { 27, 0, 63, 255 }, { 51, 0, 103, 255 }, { 63, 11, 123, 255 }, { 79, 23, 143, 255 }, diff --git a/src/config.h b/src/config.h index 7708042d0a..8db4a4fe03 100644 --- a/src/config.h +++ b/src/config.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 64ce9c6018..302be8a37f 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -79,7 +79,7 @@ extern int gLastDrawStringY; extern rct_g1_element *g1Elements; extern rct_gx g2; -// +// rct_drawpixelinfo* clip_drawpixelinfo(rct_drawpixelinfo* dpi, int left, int width, int top, int height); void gfx_set_dirty_blocks(sint16 left, sint16 top, sint16 right, sint16 bottom); void gfx_draw_all_dirty_blocks(); diff --git a/src/drawing/font.c b/src/drawing/font.c index cde247dc04..eaadbd1901 100644 --- a/src/drawing/font.c +++ b/src/drawing/font.c @@ -21,7 +21,7 @@ void font_sprite_initialise_characters() int glyphOffset = fontSize * FONT_SPRITE_GLYPH_COUNT; for (uint8 glyphIndex = 0; glyphIndex < FONT_SPRITE_GLYPH_COUNT; glyphIndex++) { rct_g1_element g1 = g1Elements[glyphIndex + SPR_CHAR_START + glyphOffset]; - + int width = fontSize == FONT_SIZE_BIG ? g1.width + 1 : g1.width - 1; if (glyphIndex >= (FORMAT_ARGUMENT_CODE_START - 32) && glyphIndex < (FORMAT_COLOUR_CODE_END - 32)) { width = 0; @@ -29,7 +29,7 @@ void font_sprite_initialise_characters() *pCharacterWidth++ = (uint8)width; } } - + scrolling_text_initialise_bitmaps(); for (int i = 0; i < 32; i++) { diff --git a/src/drawing/line.c b/src/drawing/line.c index 28bfbe7db6..82676eb376 100644 --- a/src/drawing/line.c +++ b/src/drawing/line.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/drawing/rain.c b/src/drawing/rain.c index 2357ef7069..7aaed208a8 100644 --- a/src/drawing/rain.c +++ b/src/drawing/rain.c @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014 + * Copyright (c) 2014 * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. * * This file is part of OpenRCT2. @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -105,7 +105,7 @@ static void draw_rain_window(rct_window* original_w, short left, short right, sh draw_rain_window(original_w, left, w_right, top, bottom, draw_rain_func); left = w_right; - draw_rain_window(original_w, left, right, top, bottom, draw_rain_func); + draw_rain_window(original_w, left, right, top, bottom, draw_rain_func); return; } @@ -113,7 +113,7 @@ static void draw_rain_window(rct_window* original_w, short left, short right, sh draw_rain_window(original_w, left, right, top, w->y, draw_rain_func); top = w->y; - draw_rain_window(original_w, left, right, top, bottom, draw_rain_func); + draw_rain_window(original_w, left, right, top, bottom, draw_rain_func); return; } @@ -122,7 +122,7 @@ static void draw_rain_window(rct_window* original_w, short left, short right, sh draw_rain_window(original_w, left, right, top, w_bottom, draw_rain_func); top = w_bottom; - draw_rain_window(original_w, left, right, top, bottom, draw_rain_func); + draw_rain_window(original_w, left, right, top, bottom, draw_rain_func); return; } } @@ -147,7 +147,7 @@ static void draw_rain_animation(uint32 draw_rain_func) } /** - * + * * rct2: 0x00684218 */ void update_rain_animation() diff --git a/src/drawing/rect.c b/src/drawing/rect.c index 70894fe0ac..071875890a 100644 --- a/src/drawing/rect.c +++ b/src/drawing/rect.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -42,7 +42,7 @@ void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bot top_ = top; bottom_ = bottom; dpi_ = dpi; - + if ((left > right) || (top > bottom) || (dpi->x > right) || (left >= (dpi->x + dpi->width)) || (bottom < dpi->y) || (top >= (dpi->y + dpi->height))) return; @@ -52,7 +52,7 @@ void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bot uint16 cross_pattern = 0; int start_x = left - dpi->x; - if (start_x < 0){ + if (start_x < 0){ cross_pattern ^= start_x; start_x = 0; } @@ -65,7 +65,7 @@ void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bot int width = end_x - start_x; int start_y = top - dpi->y; - if (start_y < 0){ + if (start_y < 0){ cross_pattern ^= start_y; start_y = 0; } @@ -80,14 +80,14 @@ void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bot // 00678B2E 00678BE5 //Cross hatching uint8* dest_pointer = (start_y * (dpi->width + dpi->pitch)) + start_x + dpi->bits; - + uint32 ecx; for (int i = 0; i < height; ++i) { uint8* next_dest_pointer = dest_pointer + dpi->width + dpi->pitch; ecx = cross_pattern; // Rotate right ecx = (ecx >> 1) | (ecx << (sizeof(ecx) * CHAR_BIT - 1)); - ecx = (ecx & 0xFFFF0000) | width; + ecx = (ecx & 0xFFFF0000) | width; // Fill every other pixel with the colour for (; (ecx & 0xFFFF) > 0; ecx--) { ecx = ecx ^ 0x80000000; @@ -98,7 +98,7 @@ void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bot } cross_pattern ^= 1; dest_pointer = next_dest_pointer; - + } return; } @@ -143,7 +143,7 @@ void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bot for (int no_lines = height; no_lines > 0; no_lines--) { char* next_dest_pointer = dest_pointer + dpi->width + dpi->pitch; - uint16 pattern = pattern_pointer[pattern_y]; + uint16 pattern = pattern_pointer[pattern_y]; for (int no_pixels = width; no_pixels > 0; --no_pixels) { if (pattern & (1 << pattern_x)) @@ -168,7 +168,7 @@ void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bot left -= dpi->x;//0x4 if ( left < 0 ){ RCT2_GLOBAL(0xEDF824,sint32) -= left; - left = 0; + left = 0; } right -= dpi->x; right++; diff --git a/src/drawing/scrolling_text.c b/src/drawing/scrolling_text.c index cd877b8490..ed7a36a210 100644 --- a/src/drawing/scrolling_text.c +++ b/src/drawing/scrolling_text.c @@ -33,7 +33,7 @@ void scrolling_text_initialise_bitmaps() .zoom_level = 0 }; - + for (int i = 0; i < 224; i++) { memset(drawingSurface, 0, sizeof(drawingSurface)); gfx_draw_sprite(&dpi, i + 0x10D5, -1, 0, 0); @@ -136,7 +136,7 @@ int scrolling_text_setup(rct_string_id stringId, uint16 scroll, uint16 scrolling scrolling_text_format(scrollString, scrollText); sint16* scrollingModePositions = RCT2_ADDRESS(RCT2_ADDRESS_SCROLLING_MODE_POSITIONS, uint16*)[scrollingMode]; - + memset(scrollText->bitmap, 0, 320 * 8); if (gUseTrueTypeFont) { scrolling_text_set_bitmap_for_ttf(scrollString, scroll, scrollText->bitmap, scrollingModePositions); @@ -186,8 +186,8 @@ void scrolling_text_set_bitmap_for_sprite(utf8 *text, int scroll, uint8 *bitmap, uint8 *dst = &bitmap[scrollPosition]; for (uint8 char_bitmap = *characterBitmap; char_bitmap != 0; char_bitmap >>= 1){ if (char_bitmap & 1) *dst = characterColour; - - // Jump to next row + + // Jump to next row dst += 64; } } @@ -261,7 +261,7 @@ void scrolling_text_set_bitmap_for_ttf(utf8 *text, int scroll, uint8 *bitmap, si for (int y = 0; y < height; y++) { if (src[y * pitch + x] != 0) *dst = colour; - // Jump to next row + // Jump to next row dst += 64; } } diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index 28529b1038..dcd3fbc683 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -32,7 +32,7 @@ rct_gx g2; rct_g1_element *g1Elements = (rct_g1_element*)RCT2_ADDRESS_G1_ELEMENTS; /** - * + * * rct2: 0x00678998 */ int gfx_load_g1() @@ -267,8 +267,8 @@ void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_point int line_width = (dpi->width >> zoom_level) + dpi->pitch; - if (source_y_start < 0){ - source_y_start += zoom_amount; + if (source_y_start < 0){ + source_y_start += zoom_amount; next_dest_pointer += line_width; height -= zoom_amount; } @@ -351,7 +351,7 @@ void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_point else if (image_type & IMAGE_TYPE_MIX_BACKGROUND){//In the .exe these are all unraveled loops //Doesnt use source pointer ??? mix with background only? //Not Tested - + for (; no_pixels > 0; no_pixels -= zoom_amount, dest_pointer++){ uint8 pixel = *dest_pointer; pixel = palette_pointer[pixel]; @@ -374,7 +374,7 @@ void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_point /** * * rct2: 0x0067A28E - * image_id (ebx) + * image_id (ebx) * image_id as below * 0b_111X_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX image_type * 0b_XXX1_11XX_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX image_sub_type (unknown pointer) @@ -444,7 +444,7 @@ void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint32 uint32 top_offset = palette_to_g1_offset[top_type]; //RCT2_ADDRESS(0x97FCBC, uint32)[top_type]; rct_g1_element top_palette = g1Elements[top_offset]; memcpy(palette_pointer + 0xF3, top_palette.offset + 0xF3, 12); - + //Trousers int trouser_type = (image_id >> 24) & 0x1f; uint32 trouser_offset = palette_to_g1_offset[trouser_type]; //RCT2_ADDRESS(0x97FCBC, uint32)[trouser_type]; @@ -471,7 +471,7 @@ void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, in { int image_element = image_id & 0x7FFFF; int image_type = (image_id & 0xE0000000) >> 28; - + rct_g1_element* g1_source; if (image_element < SPR_G2_BEGIN) { g1_source = &g1Elements[image_element]; @@ -598,7 +598,7 @@ void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, in uint8* dest_pointer = (uint8*)dpi->bits; //Move the pointer to the start point of the destination dest_pointer += ((dpi->width / zoom_amount) + dpi->pitch)*dest_start_y + dest_start_x; - + if (g1_source->flags & G1_FLAG_RLE_COMPRESSION){ //We have to use a different method to move the source pointer for //rle encoded sprites so that will be handled within this function diff --git a/src/editor.c b/src/editor.c index 991ec7fe4b..76756700b5 100644 --- a/src/editor.c +++ b/src/editor.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -183,7 +183,7 @@ void trackdesigner_load() banner_init(); reset_park_entrances(); user_string_clear_all(); - reset_sprite_list(); + reset_sprite_list(); ride_init_all(); window_guest_list_init_vars_a(); staff_reset_modes(); @@ -261,7 +261,7 @@ static void set_all_land_owned() void editor_load_landscape(const char *path) { window_close_construction_windows(); - + char *extension = strrchr(path, '.'); if (extension != NULL) { if (_stricmp(extension, ".sv4") == 0) { @@ -413,19 +413,19 @@ static int editor_read_s6(const char *path) map_update_tile_pointers(); map_remove_all_rides(); - // + // for (i = 0; i < MAX_BANNERS; i++) if (gBanners[i].type == 255) gBanners[i].flags &= ~BANNER_FLAG_2; - // + // rct_ride *ride; FOR_ALL_RIDES(i, ride) user_string_free(ride->name); ride_init_all(); - // + // for (i = 0; i < MAX_SPRITES; i++) { rct_sprite *sprite = &g_sprite_list[i]; user_string_free(sprite->unknown.name_string_idx); diff --git a/src/editor.h b/src/editor.h index 54044a3dfa..83b0f46f8c 100644 --- a/src/editor.h +++ b/src/editor.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/game.h b/src/game.h index 115030495e..ec806a8cc4 100644 --- a/src/game.h +++ b/src/game.h @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ - + #ifndef _GAME_H_ #define _GAME_H_ diff --git a/src/hook.h b/src/hook.h index 1e0628b95b..7f2289f059 100644 --- a/src/hook.h +++ b/src/hook.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/input.c b/src/input.c index c2d63a34c4..343213b720 100644 --- a/src/input.c +++ b/src/input.c @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -98,7 +98,7 @@ static void sub_6EA2AA(rct_window *w, int widgetIndex, int x, int y, int edi); #pragma region Mouse input /** - * + * * rct2: 0x006EA627 */ void game_handle_input() @@ -144,7 +144,7 @@ void game_handle_input() } /** - * + * * rct2: 0x006E83C7 */ static void game_get_next_input(int *x, int *y, int *state) @@ -165,7 +165,7 @@ static void game_get_next_input(int *x, int *y, int *state) } /** - * + * * rct2: 0x00407074 */ static rct_mouse_data* get_mouse_input() @@ -181,7 +181,7 @@ static rct_mouse_data* get_mouse_input() } /** - * + * * rct2: 0x006E8655 */ static void game_handle_input_mouse(int x, int y, int state) @@ -330,7 +330,7 @@ static void game_handle_input_mouse(int x, int y, int state) break; } } - + #pragma region Window positioning / resizing void input_window_position_begin(rct_window *w, int widgetIndex, int x, int y) @@ -512,7 +512,7 @@ static void input_scroll_begin(rct_window *w, int widgetIndex, int x, int y) case SCROLL_PART_HSCROLLBAR_RIGHT: scroll->h_left = min(scroll->h_left + 3, widget_width); break; - case SCROLL_PART_HSCROLLBAR_LEFT_TROUGH: + case SCROLL_PART_HSCROLLBAR_LEFT_TROUGH: scroll->h_left = max(scroll->h_left - widget_width , 0); break; case SCROLL_PART_HSCROLLBAR_RIGHT_TROUGH: @@ -556,9 +556,9 @@ static void input_scroll_continue(rct_window *w, int widgetIndex, int state, int invalidate_scroll(); return; } - + widget_scroll_get_part(w, widget, x, y, &x2, &y2, &scroll_part, &scroll_id); - + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SCROLL_AREA, uint16) == SCROLL_PART_HSCROLLBAR_THUMB){ int temp_x = x; x -= RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_CURSOR_X, uint16); @@ -780,7 +780,7 @@ static void input_scroll_part_update_vbottom(rct_window *w, int widgetIndex, int #pragma region Widgets /** - * + * * rct2: 0x006E9253 */ static void input_widget_over(int x, int y, rct_window *w, int widgetIndex) @@ -818,7 +818,7 @@ static void input_widget_over(int x, int y, rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006E9269 */ static void input_widget_over_change_check(rct_windowclass windowClass, rct_windownumber windowNumber, int widgetIndex) @@ -871,7 +871,7 @@ static void input_widget_over_flatbutton_invalidate() } /** - * + * * rct2: 0x006E95F9 */ static void input_widget_left(int x, int y, rct_window *w, int widgetIndex) @@ -956,7 +956,7 @@ static void input_widget_left(int x, int y, rct_window *w, int widgetIndex) #pragma endregion /** - * + * * rct2: 0x006ED833 */ void process_mouse_over(int x, int y) @@ -1072,7 +1072,7 @@ void process_mouse_tool(int x, int y) } /** - * + * * rct2: 0x006E8DA7 */ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_window *w, rct_widget *widget) @@ -1270,14 +1270,14 @@ static void input_update_tooltip(rct_window *w, int widgetIndex, int x, int y) #pragma region Keyboard input /** - * + * * rct2: 0x006E3B43 */ void title_handle_keyboard_input() { rct_window *w; int key; - + if (!gConsoleOpen) { // Handle modifier keys and key scrolling RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) = 0; @@ -1294,7 +1294,7 @@ void title_handle_keyboard_input() while ((key = get_next_key()) != 0) { if (key == 255) continue; - + // Reserve backtick for console if (key == SDL_SCANCODE_GRAVE) { if (gConfigGeneral.debugging_tools || gConsoleOpen) { @@ -1320,7 +1320,7 @@ void title_handle_keyboard_input() } /** - * + * * rct2: 0x006E3B43 */ void game_handle_keyboard_input() @@ -1464,7 +1464,7 @@ static void sub_6EA2AA(rct_window *w, int widgetIndex, int x, int y, int edi) } /** - * + * * rct2: 0x00406CD2 */ int get_next_key() @@ -1505,7 +1505,7 @@ void sub_6ED990(char cursor_id){ /** - * + * * rct2: 0x006E876D */ void invalidate_scroll() diff --git a/src/input.h b/src/input.h index 3d36382961..493b0faaa7 100644 --- a/src/input.h +++ b/src/input.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/interface/console.c b/src/interface/console.c index e0c7871ea3..b1f3e014aa 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -154,7 +154,7 @@ void console_draw(rct_drawpixelinfo *dpi) int x = _consoleLeft + 4; int y = _consoleTop + 4; - + // Draw previous lines utf8 lineBuffer[2 + 256], *lineCh; ch = _consoleViewBufferStart; @@ -933,7 +933,7 @@ console_command console_command_table[] = { { "windows", cc_windows, "Lists all the windows that can be opened.", "windows" }, { "load_object", cc_load_object, "Loads the object file into the scenario.\n" "Loading a scenery group will not load its associated objects.\n" - "This is a safer method opposed to \"open object_selection\".", + "This is a safer method opposed to \"open object_selection\".", "load_object " }, { "object_count", cc_object_count, "Shows the number of objects of each type in the scenario.", "object_count" }, { "twitch", cc_twitch, "Twitch API" }, diff --git a/src/interface/graph.c b/src/interface/graph.c index 96917c88af..53bc2fffb5 100644 --- a/src/interface/graph.c +++ b/src/interface/graph.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/interface/graph.h b/src/interface/graph.h index 82a0f7fa6c..e6c9aee74e 100644 --- a/src/interface/graph.h +++ b/src/interface/graph.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index b8d919dde5..946ab53dcf 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -35,7 +35,7 @@ typedef void (*shortcut_action)(); static const shortcut_action shortcut_table[SHORTCUT_COUNT]; /** - * + * * rct2: 0x006E3E91 */ void keyboard_shortcut_set(int key) @@ -58,7 +58,7 @@ void keyboard_shortcut_set(int key) } /** - * + * * rct2: 0x006E3E68 */ void keyboard_shortcut_handle(int key) diff --git a/src/interface/keyboard_shortcut.h b/src/interface/keyboard_shortcut.h index d9e4e20535..3b9dc2599e 100644 --- a/src/interface/keyboard_shortcut.h +++ b/src/interface/keyboard_shortcut.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/interface/screenshot.h b/src/interface/screenshot.h index 0672a135bb..81feb53801 100644 --- a/src/interface/screenshot.h +++ b/src/interface/screenshot.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/interface/themes.c b/src/interface/themes.c index f10aa752f7..dd6244376d 100644 --- a/src/interface/themes.c +++ b/src/interface/themes.c @@ -98,7 +98,7 @@ theme_window_preset gThemeWindowsRCT1[] = { { WC_GUEST_LIST, COLOURS_RCT1(22, 26, 26, 0, 0, 0) }, { WC_STAFF_LIST, COLOURS_RCT1(12, 4, 4, 0, 0, 0) }, { WC_FINANCES, COLOURS_RCT1(4, 1, 1, 0, 0, 0) }, - { WC_TITLE_MENU, COLOURS_RCT1(129, 129, 129, 0, 0, 0) }, + { WC_TITLE_MENU, COLOURS_RCT1(129, 129, 129, 0, 0, 0) }, { WC_TITLE_EXIT, COLOURS_RCT1(129, 129, 129, 0, 0, 0) }, { WC_NEW_CAMPAIGN, COLOURS_RCT1(4, 4, 1, 0, 0, 0) }, { WC_TITLE_OPTIONS, COLOURS_RCT1(129, 129, 129, 0, 0, 0) }, @@ -156,7 +156,7 @@ void colour_scheme_update(rct_window *window) void colour_scheme_update_by_class(rct_window *window, rct_windowclass classification) { theme_window* theme = theme_window_get_by_class(classification); - + bool transparent = false; for (int i = 0; i < 6; i++) { window->colours[i] = theme->colours[i]; diff --git a/src/interface/title_sequences.c b/src/interface/title_sequences.c index e1753a4971..b008df572b 100644 --- a/src/interface/title_sequences.c +++ b/src/interface/title_sequences.c @@ -100,7 +100,7 @@ void title_sequence_create_preset(const char *name) strcat(path, gConfigTitleSequences.presets[preset].name); platform_file_delete(path); platform_ensure_directory_exists(path); - + title_sequence_save_preset_script(preset); gCurrentTitleSequence = preset; } @@ -164,7 +164,7 @@ void title_sequence_duplicate_preset(int duplicate, const char *name) if (loadmm) { title_sequence_add_save(preset, get_file_path(PATH_ID_SIXFLAGS_MAGICMOUNTAIN), "Six Flags Magic Mountain.SC6"); } - + title_sequence_save_preset_script(preset); gCurrentTitleSequence = preset; } @@ -241,7 +241,7 @@ void title_sequence_add_save(int preset, const char *path, const char *newName) gConfigTitleSequences.presets[preset].num_saves++; gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); - + strcpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], newName); // Add the appropriate extension if needed if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) @@ -260,7 +260,7 @@ void title_sequence_remove_save(int preset, int index) strncat(path, &separator, 1); strcat(path, gConfigTitleSequences.presets[preset].saves[index]); platform_file_delete(path); - + // Remove all references to this save in the commands and decrement save indecies for (int i = 0; i < gConfigTitleSequences.presets[preset].num_commands; i++) { if (gConfigTitleSequences.presets[preset].commands[i].command == TITLE_SCRIPT_LOAD) { @@ -270,7 +270,7 @@ void title_sequence_remove_save(int preset, int index) gConfigTitleSequences.presets[preset].commands[i].saveIndex--; } } - + for (int i = index; i < gConfigTitleSequences.presets[preset].num_saves - 1; i++) { strcpy(gConfigTitleSequences.presets[preset].saves[i], gConfigTitleSequences.presets[preset].saves[i + 1]); } diff --git a/src/interface/viewport.h b/src/interface/viewport.h index aad675b6d9..a1fd91a45d 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or diff --git a/src/interface/viewport_interaction.c b/src/interface/viewport_interaction.c index 7f95d9e53a..b8ef2602e1 100644 --- a/src/interface/viewport_interaction.c +++ b/src/interface/viewport_interaction.c @@ -56,7 +56,7 @@ int viewport_interaction_get_item_left(int x, int y, viewport_interaction_info * if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TITLE_DEMO | SCREEN_FLAGS_SCENARIO_EDITOR | SCREEN_FLAGS_TRACK_MANAGER)) return info->type = VIEWPORT_INTERACTION_ITEM_NONE; - // + // if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) && s6Info->editor_step != EDITOR_STEP_ROLLERCOASTER_DESIGNER) return info->type = VIEWPORT_INTERACTION_ITEM_NONE; @@ -162,7 +162,7 @@ int viewport_interaction_left_click(int x, int y) } /** - * + * * rct2: 0x006EDE88 */ int viewport_interaction_get_item_right(int x, int y, viewport_interaction_info *info) @@ -179,7 +179,7 @@ int viewport_interaction_get_item_right(int x, int y, viewport_interaction_info if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TITLE_DEMO | SCREEN_FLAGS_TRACK_MANAGER)) return info->type = VIEWPORT_INTERACTION_ITEM_NONE; - // + // if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) && s6Info->editor_step != EDITOR_STEP_ROLLERCOASTER_DESIGNER) return info->type = VIEWPORT_INTERACTION_ITEM_NONE; @@ -336,7 +336,7 @@ int viewport_interaction_right_over(int x, int y) } /** - * + * * rct2: 0x006E8A62 */ int viewport_interaction_right_click(int x, int y) @@ -385,7 +385,7 @@ int viewport_interaction_right_click(int x, int y) } /** - * + * * rct2: 0x006E08D2 */ static void viewport_interaction_remove_scenery(rct_map_element *mapElement, int x, int y) @@ -403,7 +403,7 @@ static void viewport_interaction_remove_scenery(rct_map_element *mapElement, int } /** - * + * * rct2: 0x006A614A */ static void viewport_interaction_remove_footpath(rct_map_element *mapElement, int x, int y) @@ -413,7 +413,7 @@ static void viewport_interaction_remove_footpath(rct_map_element *mapElement, in rct_map_element *mapElement2; z = mapElement->base_height; - + w = window_find_by_class(WC_FOOTPATH); if (w != NULL) footpath_provisional_update(); @@ -429,7 +429,7 @@ static void viewport_interaction_remove_footpath(rct_map_element *mapElement, in } /** - * + * * rct2: 0x006A61AB */ static void viewport_interaction_remove_footpath_item(rct_map_element *mapElement, int x, int y) @@ -453,7 +453,7 @@ static void viewport_interaction_remove_footpath_item(rct_map_element *mapElemen } /** - * + * * rct2: 0x00666C0E */ void viewport_interaction_remove_park_entrance(rct_map_element *mapElement, int x, int y) @@ -474,7 +474,7 @@ void viewport_interaction_remove_park_entrance(rct_map_element *mapElement, int } /** - * + * * rct2: 0x006E57A9 */ static void viewport_interaction_remove_park_wall(rct_map_element *mapElement, int x, int y) @@ -499,7 +499,7 @@ static void viewport_interaction_remove_park_wall(rct_map_element *mapElement, i } /** - * + * * rct2: 0x006B88DC */ static void viewport_interaction_remove_large_scenery(rct_map_element *mapElement, int x, int y) @@ -516,12 +516,12 @@ static void viewport_interaction_remove_large_scenery(rct_map_element *mapElemen } else { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_REMOVE_THIS; game_do_command( - x, - 1 | ((mapElement->type & 0x3) << 8), - y, + x, + 1 | ((mapElement->type & 0x3) << 8), + y, mapElement->base_height | ((mapElement->properties.scenerymultiple.type >> 10) << 8), - GAME_COMMAND_REMOVE_LARGE_SCENERY, - 0, + GAME_COMMAND_REMOVE_LARGE_SCENERY, + 0, 0 ); } @@ -538,7 +538,7 @@ static rct_peep *viewport_interaction_get_closest_peep(int x, int y, int maxDist w = window_find_from_point(x, y); if (w == NULL) return 0; - + viewport = w->viewport; if (viewport == NULL || viewport->zoom >= 2) return 0; diff --git a/src/interface/widget.c b/src/interface/widget.c index 25f7aab9d2..1ed283347b 100644 --- a/src/interface/widget.c +++ b/src/interface/widget.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -48,7 +48,7 @@ static void widget_vscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i static void widget_draw_image(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex); /** - * + * * rct2: 0x006EAF26 */ void widget_scroll_update_thumbs(rct_window *w, int widget_index) @@ -102,7 +102,7 @@ void widget_scroll_update_thumbs(rct_window *w, int widget_index) } /** - * + * * rct2: 0x006EB2A8 */ void widget_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -170,7 +170,7 @@ void widget_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006EB6CE */ static void widget_frame_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -188,7 +188,7 @@ static void widget_frame_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetI r = w->x + widget->right; b = w->y + widget->bottom; - // + // press = (w->flags & WF_10 ? 0x80 : 0); // Get the colour @@ -210,7 +210,7 @@ static void widget_frame_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetI } /** - * + * * rct2: 0x006EB765 */ static void widget_resize_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -247,7 +247,7 @@ static void widget_resize_draw(rct_drawpixelinfo *dpi, rct_window *w, int widget } /** - * + * * rct2: 0x006EB8E5 */ static void widget_button_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -297,7 +297,7 @@ static void widget_tab_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetInd // Get the widget widget = &w->widgets[widgetIndex]; - // + // if (widget->image == -1) return; @@ -330,7 +330,7 @@ static void widget_tab_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetInd } /** - * + * * rct2: 0x006EB861 */ static void widget_flat_button_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -373,7 +373,7 @@ static void widget_flat_button_draw(rct_drawpixelinfo *dpi, rct_window *w, int w } /** - * + * * rct2: 0x006EBBEB */ static void widget_text_button(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -403,7 +403,7 @@ static void widget_text_button(rct_drawpixelinfo *dpi, rct_window *w, int widget } /** - * + * * rct2: 0x006EBC41 */ static void widget_text_unknown(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -462,7 +462,7 @@ static void widget_text_unknown(rct_drawpixelinfo *dpi, rct_window *w, int widge } /** - * + * * rct2: 0x006EBD52 */ static void widget_text(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -492,7 +492,7 @@ static void widget_text(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006EBD1F */ static void widget_text_inset(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -518,7 +518,7 @@ static void widget_text_inset(rct_drawpixelinfo *dpi, rct_window *w, int widgetI } /** - * + * * rct2: 0x006EC1A6 */ static void widget_text_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -546,12 +546,12 @@ static void widget_text_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIn gfx_fill_rect_inset(dpi, l, t, r, b, colour, press); // TODO - + gfx_fill_rect(dpi, l, t, r, b, colour); } /** - * + * * rct2: 0x006EB535 */ static void widget_groupbox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -611,7 +611,7 @@ static void widget_groupbox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg } /** - * + * * rct2: 0x006EB2F9 */ static void widget_caption_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -632,7 +632,7 @@ static void widget_caption_draw(rct_drawpixelinfo *dpi, rct_window *w, int widge // Get the colour colour = w->colours[widget->colour]; - // + // if (w->var_4B8 != -1) { gfx_draw_sprite(dpi, *((char*)(0x013CA742 + w->var_4B8)) << 19, l + 1, t + 1, 0); if (w->width > 638) @@ -643,7 +643,7 @@ static void widget_caption_draw(rct_drawpixelinfo *dpi, rct_window *w, int widge gfx_draw_sprite(dpi, *((char*)(0x013CA742 + w->var_4B9)) << 19, l + 1 + 638, t + 1, 0); } - // + // press = 0x70; if (w->flags & WF_10) press |= 0x80; @@ -651,7 +651,7 @@ static void widget_caption_draw(rct_drawpixelinfo *dpi, rct_window *w, int widge gfx_fill_rect_inset(dpi, l, t, r, b, colour, press); gfx_fill_rect(dpi, r + 1, t, r + 1, b, *((char*)(0x0141FC47 + (colour * 8)))); } else { - // + // press = 0x60; if (w->flags & WF_10) press |= 0x80; @@ -682,7 +682,7 @@ static void widget_caption_draw(rct_drawpixelinfo *dpi, rct_window *w, int widge } /** - * + * * rct2: 0x006EBB85 */ static void widget_closebox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -726,7 +726,7 @@ static void widget_closebox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg } /** - * + * * rct2: 0x006EBAD9 */ static void widget_checkbox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -770,7 +770,7 @@ static void widget_checkbox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg } /** - * + * * rct2: 0x006EBD96 */ static void widget_scroll_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) @@ -858,11 +858,11 @@ static void widget_hscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i gfx_fill_rect(dpi, l + 10, t + 3, r - 10, t + 3, *((char*)(0x0141FC4B + (colour * 8)))); gfx_fill_rect(dpi, l + 10, t + 7, r - 10, t + 7, *((char*)(0x0141FC47 + (colour * 8)))); gfx_fill_rect(dpi, l + 10, t + 8, r - 10, t + 8, *((char*)(0x0141FC4B + (colour * 8)))); - + // Left button gfx_fill_rect_inset(dpi, l, t, l + 9, b, colour, (scroll->flags & HSCROLLBAR_LEFT_PRESSED ? 0x20 : 0)); gfx_draw_string(dpi, (char*)BlackLeftArrowString, 0, l + 1, t); - + // Thumb gfx_fill_rect_inset(dpi, max(l + 10, l + scroll->h_thumb_left - 1), t, @@ -901,7 +901,7 @@ static void widget_vscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i } /** - * + * * rct2: 0x006EB951 */ static void widget_draw_image(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex) diff --git a/src/interface/widget.h b/src/interface/widget.h index ad7e4d0b35..8a8c5022c4 100644 --- a/src/interface/widget.h +++ b/src/interface/widget.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/interface/window.h b/src/interface/window.h index 6a5b288aba..3df13ba0a4 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -102,7 +102,7 @@ typedef struct { uint16 v_thumb_bottom; // 0x10 } rct_scroll; -/** +/** * Viewport focus structure. * size: 0xA * Use sprite.type to work out type. @@ -122,7 +122,7 @@ typedef struct{ uint16 sprite_id; //0x482 uint8 pad_484; uint8 type; //0x485 & VIEWPORT_FOCUS_TYPE_MASK - uint16 pad_486; + uint16 pad_486; uint8 rotation; //0x488 uint8 zoom; //0x489 } sprite_focus; @@ -286,7 +286,7 @@ typedef enum { WE_RESIZE = 2, WE_MOUSE_DOWN = 3, WE_DROPDOWN = 4, - WE_UNKNOWN_05 = 5, + WE_UNKNOWN_05 = 5, // Unknown 05: Used to update tabs that are not being animated // see window_peep. When the overview tab is not highlighted the // items being carried such as hats/balloons still need to be shown diff --git a/src/intro.c b/src/intro.c index f067568a85..3021a78860 100644 --- a/src/intro.c +++ b/src/intro.c @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ - + #include "addresses.h" #include "audio/audio.h" #include "drawing/drawing.h" @@ -101,7 +101,7 @@ void intro_update() break; case 3: - // + // _tick_counter += 5; // Clear the screen diff --git a/src/intro.h b/src/intro.h index b0f09cb462..b3df910e2c 100644 --- a/src/intro.h +++ b/src/intro.h @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ - + #ifndef _INTRO_H_ #define _INTRO_H_ diff --git a/src/management/award.c b/src/management/award.c index 5bbb728899..6eac789f6b 100644 --- a/src/management/award.c +++ b/src/management/award.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -416,7 +416,7 @@ static int award_is_deserved_most_disappointing(int awardType, int activeAwardTy FOR_ALL_RIDES(i, ride) { if (ride->excitement == (ride_rating)0xFFFF || ride->popularity == 0xFF) continue; - + countedRides++; // Unpopular diff --git a/src/management/award.h b/src/management/award.h index 1fb14d5843..87e21fd6c3 100644 --- a/src/management/award.h +++ b/src/management/award.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/management/finance.c b/src/management/finance.c index d17415ced0..17b474b64f 100644 --- a/src/management/finance.c +++ b/src/management/finance.c @@ -66,7 +66,7 @@ void finance_payment(money32 amount, rct_expenditure_type type) RCT2_ADDRESS(RCT2_ADDRESS_EXPENDITURE_TABLE, money32)[type] -= amount; if (dword_988E60[type] & 1) RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_EXPENDITURE, money32) -= amount; // Cumulative amount of money spent this day - + RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint32) |= BTM_TB_DIRTY_FLAG_MONEY; window_invalidate_by_class(WC_FINANCES); @@ -353,7 +353,7 @@ void finance_shift_expenditure_table() { } /** - * + * * rct2: 0x0069E89B */ void finance_reset_cash_to_initial() diff --git a/src/management/marketing.c b/src/management/marketing.c index 58566554ed..7a45392083 100644 --- a/src/management/marketing.c +++ b/src/management/marketing.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -85,7 +85,7 @@ void marketing_update() gMarketingCampaignDaysLeft[campaign] &= ~CAMPAIGN_ACTIVE_FLAG; if (active) continue; - + if (--gMarketingCampaignDaysLeft[campaign] != 0) continue; @@ -143,7 +143,7 @@ void marketing_start_campaign(int type, int rideOrItem, int numWeeks) } /** - * + * * rct2: 0x0069E73C */ void game_command_start_campaign(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) diff --git a/src/management/marketing.h b/src/management/marketing.h index 67a35ed651..080289ad9d 100644 --- a/src/management/marketing.h +++ b/src/management/marketing.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/management/news_item.c b/src/management/news_item.c index 4522321c99..7135785bf3 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -103,7 +103,7 @@ static bool news_item_is_current_old() } /** - * + * * rct2: 0x0066E252 */ void news_item_update_current() @@ -156,7 +156,7 @@ void news_item_update_current() } /** - * + * * rct2: 0x0066E377 */ void news_item_close_current() @@ -381,7 +381,7 @@ void news_item_open_subject(int type, int subject) } } } - + // Switch to new scenery tab window = window_find_by_class(WC_SCENERY); if (window != NULL) diff --git a/src/management/news_item.h b/src/management/news_item.h index a23be1c19e..8e1cea3c41 100644 --- a/src/management/news_item.h +++ b/src/management/news_item.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/management/research.c b/src/management/research.c index 83ae23e1c4..e84f2986e0 100644 --- a/src/management/research.c +++ b/src/management/research.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -91,7 +91,7 @@ static void research_calculate_expected_date() expectedDay = currentDay + (daysRemaining & 0xFFFF); dayQuotient = expectedDay / 0x10000; dayRemainder = expectedDay % 0x10000; - + expectedMonth = date_get_month(currentMonth + dayQuotient + (daysRemaining >> 16)); expectedDay = (dayRemainder * days_in_month[expectedMonth]) >> 16; @@ -299,7 +299,7 @@ void sub_684AC3(){ ebp->entryIndex = (research + 1)->entryIndex; uint8 cat = edx->category; - edx->category = ebp->category; + edx->category = ebp->category; ebp->category = cat; } @@ -322,7 +322,7 @@ void sub_684AC3(){ } } - + for (research = gResearchItems; research->entryIndex != RESEARCHED_ITEMS_SEPARATOR; research++){ research_finish_item(research->entryIndex); } @@ -351,7 +351,7 @@ void research_remove_non_separate_vehicle_types() researchItem != gResearchItems && researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR && researchItem->entryIndex != RESEARCHED_ITEMS_END && - researchItem->entryIndex >= 0x10000 + researchItem->entryIndex >= 0x10000 ) { rct_ride_type *rideEntry = GET_RIDE_ENTRY(researchItem->entryIndex & 0xFF); if (!(rideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE | RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME))) { diff --git a/src/management/research.h b/src/management/research.h index 6d6de71a0e..f8cf061082 100644 --- a/src/management/research.h +++ b/src/management/research.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -29,7 +29,7 @@ typedef struct { uint8 category; } rct_research_item; -enum{ +enum{ RESEARCH_ENTRY_FLAG_SCENERY_SET_ALWAYS_RESEARCHED = (1 << 29), RESEARCH_ENTRY_FLAG_RIDE_ALWAYS_RESEARCHED = (1 << 30), }; diff --git a/src/network/network.cpp b/src/network/network.cpp index e7f80fcc90..8aeb41dc62 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -166,7 +166,7 @@ int NetworkConnection::ReadPacket() if (LAST_SOCKET_ERROR() != EWOULDBLOCK && LAST_SOCKET_ERROR() != EAGAIN) { return NETWORK_DISCONNECTED; } else { - return NETWORK_NO_DATA; + return NETWORK_NO_DATA; } } inboundpacket.transferred += readBytes; @@ -613,14 +613,14 @@ void Network::Server_Send_CHAT(const char* text) void Network::Client_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback) { std::unique_ptr packet = std::move(NetworkPacket::Allocate()); - *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | GAME_COMMAND_FLAG_NETWORKED) << ecx << edx << esi << edi << ebp << callback; + *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | GAME_COMMAND_FLAG_NETWORKED) << ecx << edx << esi << edi << ebp << callback; server_connection.QueuePacket(std::move(packet)); } void Network::Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 playerid, uint8 callback) { std::unique_ptr packet = std::move(NetworkPacket::Allocate()); - *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | GAME_COMMAND_FLAG_NETWORKED) << ecx << edx << esi << edi << ebp << playerid << callback; + *packet << (uint32)NETWORK_COMMAND_GAMECMD << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << eax << (ebx | GAME_COMMAND_FLAG_NETWORKED) << ecx << edx << esi << edi << ebp << playerid << callback; SendPacketToClients(*packet); } @@ -803,7 +803,7 @@ void Network::PrintError() char *s = strerror(LAST_SOCKET_ERROR()); fprintf(stderr, "%s\n", s); #endif - + } int Network::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacket& packet) diff --git a/src/network/network.h b/src/network/network.h index e1d698d5e8..12f1f84e47 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/network/twitch.cpp b/src/network/twitch.cpp index 1e36c0526b..bdc1633313 100644 --- a/src/network/twitch.cpp +++ b/src/network/twitch.cpp @@ -175,7 +175,7 @@ static void twitch_leave() // http_request_json_dispose(jsonResponse); // _twitchState = TWITCH_STATE_LEFT; // _twitchIdle = true; - // + // // console_writeline("Left twitch channel."); // }); } diff --git a/src/openrct2.h b/src/openrct2.h index da306caa9c..2d8ac7daf5 100644 --- a/src/openrct2.h +++ b/src/openrct2.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/peep/peep.c b/src/peep/peep.c index f012a56fb4..c1ca5f5c1d 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -8379,7 +8379,7 @@ static bool peep_should_go_on_ride(rct_peep *peep, int rideIndex, int entranceNu // Nausea calculations. ride_rating maxNausea = NauseaMaximumThresholds[(peep->nausea_tolerance & 3)] + peep->happiness; - + if (ride->nausea > maxNausea) { if (peepAtRide) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_SICKENING, rideIndex); @@ -9125,7 +9125,7 @@ money32 set_peep_name(int flags, int state, uint16 sprite_index, uint8* text_1, peep->flags |= PEEP_FLAGS_LEAVING_PARK; peep->flags &= ~PEEP_FLAGS_PARK_ENTRANCE_CHOSEN; } - + peep->flags &= ~PEEP_FLAGS_PURPLE; if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_EMMA_GARRELL, peep)) { peep->flags |= PEEP_FLAGS_PURPLE; diff --git a/src/peep/peep.h b/src/peep/peep.h index fa1fb85201..c758f335b7 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -210,16 +210,16 @@ enum PEEP_STATE { PEEP_STATE_INSPECTING = 23 }; -enum PEEP_ACTION_EVENTS { +enum PEEP_ACTION_EVENTS { PEEP_ACTION_CHECK_TIME = 0, // If no food then check watch PEEP_ACTION_EAT_FOOD = 1, PEEP_ACTION_SHAKE_HEAD = 2, - PEEP_ACTION_EMPTY_POCKETS = 3, + PEEP_ACTION_EMPTY_POCKETS = 3, PEEP_ACTION_SITTING_EAT_FOOD = 4, PEEP_ACTION_SITTING_CHECK_WATCH = 4, PEEP_ACTION_SITTING_LOOK_AROUND_LEFT = 5, - PEEP_ACTION_SITTING_LOOK_AROUND_RIGHT = 6, + PEEP_ACTION_SITTING_LOOK_AROUND_RIGHT = 6, PEEP_ACTION_WOW = 7, PEEP_ACTION_THROW_UP = 8, PEEP_ACTION_JUMP = 9, @@ -413,14 +413,14 @@ typedef struct { uint8 sub_state; // 0x2C uint8 sprite_type; // 0x2D uint8 type; // 0x2E - union{ + union{ uint8 staff_type; // 0x2F uint8 no_of_rides; // 0x2F }; uint8 tshirt_colour; // 0x30 uint8 trousers_colour; // 0x31 uint16 destination_x; // 0x32 Location that the peep is trying to get to - uint16 destination_y; // 0x34 + uint16 destination_y; // 0x34 uint8 destination_tolerence; // 0x36 How close to destination before next action/state 0 = exact uint8 var_37; uint8 energy; // 0x38 @@ -477,7 +477,7 @@ typedef struct { }; uint8 var_79; uint16 time_in_queue; // 0x7A - uint8 rides_been_on[32]; // 0x7C + uint8 rides_been_on[32]; // 0x7C // 255 bit bitmap of every ride the peep has been on see // window_peep_rides_update for how to use. uint32 id; // 0x9C diff --git a/src/peep/staff.c b/src/peep/staff.c index 1a23c2cf3e..3d44d0cb53 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -56,7 +56,7 @@ void game_command_update_staff_colour(int *eax, int *ebx, int *ecx, int *edx, in uint8 staffType, colour; int spriteIndex; rct_peep *peep; - + staffType = (*ebx >> 8) & 0xFF; colour = (*edx >> 8) & 0xFF; @@ -125,7 +125,7 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, sprite_remove((rct_sprite*)newPeep); } else { move_sprite_to_list((rct_sprite *)newPeep, SPRITE_LINKEDLIST_OFFSET_PEEP); - + newPeep->sprite_identifier = 1; newPeep->window_invalidate_flags = 0; newPeep->action = PEEP_ACTION_NONE_2; @@ -412,7 +412,7 @@ void staff_update_greyed_patrol_areas() { for (int i = 0; i < 128; ++i) RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS + ((staff_type + STAFF_MAX_COUNT) * 512), uint32)[i] = 0; - + for (uint16 sprite_index = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_PEEP, uint16); sprite_index != SPRITE_INDEX_NULL; sprite_index = peep->next) { peep = GET_PEEP(sprite_index); diff --git a/src/peep/staff.h b/src/peep/staff.h index 68b2b32321..396246edd3 100644 --- a/src/peep/staff.h +++ b/src/peep/staff.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/platform/osx.c b/src/platform/osx.c index d16040f99d..4f08d128f1 100644 --- a/src/platform/osx.c +++ b/src/platform/osx.c @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or diff --git a/src/platform/shared.c b/src/platform/shared.c index 60898cad58..d57a75dcb5 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -861,7 +861,7 @@ void platform_refresh_video() if (gConfigGeneral.hardware_display) { if (gRenderer == NULL) gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); - + if (gRenderer == NULL) { log_fatal("SDL_CreateRenderer %s", SDL_GetError()); exit(-1); diff --git a/src/rct1.c b/src/rct1.c index d373ea9488..0a3a454f41 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -163,7 +163,7 @@ void rct1_import_s4(rct1_s4 *s4) memset(edi, 0, 64); edi += 64; } while (--edx > 0); edi += 0xA800; - + edx = 4; do { ebx = 32; @@ -366,7 +366,7 @@ static void rct1_load_default_objects() } /** - * + * * rct2: 0x006A29B9 */ static void rct1_fix_terrain() @@ -380,7 +380,7 @@ static void rct1_fix_terrain() if (map_element_get_type(element) != MAP_ELEMENT_TYPE_SURFACE) continue; - + // Convert terrain map_element_set_terrain(element, RCT1TerrainConvertTable[map_element_get_terrain(element)]); map_element_set_terrain_edge(element, RCT1TerrainEdgeConvertTable[map_element_get_terrain_edge(element)]); @@ -423,7 +423,7 @@ static void rct1_fix_entrance_positions() { rct_map_element *element; map_element_iterator it; - + for (int i = 0; i < 4; i++) RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, uint16)[i] = 0x8000; @@ -534,10 +534,10 @@ static void rct1_reset_park_entrance_path_type() static void rct1_clear_extra_sprite_entries() { rct_unk_sprite *sprite; - + for (int i = 5000; i < MAX_SPRITES; i++) { sprite = &(g_sprite_list[i].unknown); - + memset(&g_sprite_list[i], 0, sizeof(rct_sprite)); sprite->sprite_identifier = 255; @@ -563,7 +563,7 @@ static void rct1_clear_extra_tile_entries() for (int i = 0; i < 0x10000; i++) { gMapElementTilePointers[i] = (rct_map_element*)-1; } - + // Get the first free map element rct_map_element *nextFreeMapElement = gMapElements; for (int i = 0; i < 128 * 128; i++) { diff --git a/src/rct1.h b/src/rct1.h index 159d1ce984..b1c7616e4a 100644 --- a/src/rct1.h +++ b/src/rct1.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -92,7 +92,7 @@ typedef struct { uint8 unk_B2[18]; union { uint8 num_inversions; - uint8 num_holes; + uint8 num_holes; }; uint8 num_drops; uint8 unk_C6; diff --git a/src/rct2.c b/src/rct2.c index 4cff9cab88..154b1aab9c 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John, Matthias Lanzinger * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -137,7 +137,7 @@ int rct2_init() } /** - * + * * rct2: 0x00683499 */ int rct2_init_directories() @@ -202,7 +202,7 @@ void subsitute_path(char *dest, const char *path, const char *filename) } /** - * + * * rct2: 0x00674B42 */ int rct2_startup_checks() @@ -212,7 +212,7 @@ int rct2_startup_checks() if (!check_files_integrity()) return 0; - + return 1; } @@ -257,7 +257,7 @@ void rct2_draw() } else { //game } - + gCurrentDrawCount++; } @@ -288,7 +288,7 @@ int rct2_open_file(const char *path) } /** - * + * * rct2: 0x00674C95 */ int check_file_paths() @@ -301,7 +301,7 @@ int check_file_paths() } /** - * + * * rct2: 0x00674CA5 */ int check_file_path(int pathId) @@ -342,7 +342,7 @@ int check_file_path(int pathId) } /** - * + * * rct2: 0x00674C0B */ int check_files_integrity() @@ -416,7 +416,7 @@ void rct2_endupdate() } /** - * + * * rct2: 0x00674E6C */ const utf8 *get_file_path(int pathId) @@ -511,7 +511,7 @@ void get_system_info() HDC screenHandle = GetDC(NULL); if (screenHandle) { RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_CAP_BPP, sint32) = GetDeviceCaps(screenHandle, BITSPIXEL); - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_CAP_RASTER_STRETCH, sint32) = GetDeviceCaps(screenHandle, RASTERCAPS) >> 8; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_CAP_RASTER_STRETCH, sint32) = GetDeviceCaps(screenHandle, RASTERCAPS) >> 8; ReleaseDC(NULL, screenHandle); } else { RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_CAP_BPP, sint32) = 0; diff --git a/src/ride/ride.h b/src/ride/ride.h index 8992644adb..a8d269a2a3 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -70,7 +70,7 @@ typedef struct { vehicle_colour list[256]; } vehicle_colour_preset_list; -/** +/** * Ride type vehicle structure. * size: 0x65 */ @@ -219,7 +219,7 @@ typedef struct { // bit 7: whirlpool uint8 special_track_elements; // 0x0D5 uint8 pad_0D6[2]; - // Divide this value by 29127 to get the human-readable max speed + // Divide this value by 29127 to get the human-readable max speed // (in RCT2, display_speed = (max_speed * 9) >> 18) sint32 max_speed; // 0x0D8 sint32 average_speed; // 0x0DC diff --git a/src/ride/ride_data.h b/src/ride/ride_data.h index c8731e6f5b..bd124525b5 100644 --- a/src/ride/ride_data.h +++ b/src/ride/ride_data.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 3c8491958a..48a69ac9cb 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -195,7 +195,7 @@ static void ride_ratings_update_state_2() if (ride->entrances[entranceIndex] == 0xFFFF) RCT2_GLOBAL(0x0138B5CE, uint16) |= 1; } - + ride_ratings_score_close_proximity(mapElement); trackElement.x = _rideRatingsProximityX; @@ -759,7 +759,7 @@ static uint16 ride_compute_upkeep(rct_ride *ride) upkeep += 160; } else if (ride->mode == RIDE_MODE_LIM_POWERED_LAUNCH) { upkeep += 320; - } else if (ride->mode == RIDE_MODE_POWERED_LAUNCH || + } else if (ride->mode == RIDE_MODE_POWERED_LAUNCH || ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED) { upkeep += 220; } @@ -782,7 +782,7 @@ static uint16 ride_compute_upkeep(rct_ride *ride) static void ride_ratings_apply_adjustments(rct_ride *ride, rating_tuple *ratings) { rct_ride_type *rideEntry; - + rideEntry = gRideTypeList[ride->subtype]; // Apply ride entry multipliers @@ -1024,7 +1024,7 @@ static rating_tuple get_special_track_elements_rating(uint8 type, rct_ride *ride excitement += 50; intensity += 30; nausea += 20; - } + } if (ride_has_waterfall(ride)) { excitement += 55; intensity += 30; @@ -1400,7 +1400,7 @@ static void ride_ratings_calculate_spiral_roller_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 14; set_unreliability_factor(ride); @@ -1417,12 +1417,12 @@ static void ride_ratings_calculate_spiral_roller_coaster(rct_ride *ride) ride_ratings_apply_65E1C2(&ratings, ride, 15420, 32768, 35108); ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 6693); - + if ((ride->inversions & 0x1F) == 0) ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 2, 2); - + ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); - + if ((ride->inversions & 0x1F) == 0) { ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 40), 2, 2, 2); ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); @@ -1446,7 +1446,7 @@ static void ride_ratings_calculate_stand_up_roller_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 17; set_unreliability_factor(ride); @@ -1485,7 +1485,7 @@ static void ride_ratings_calculate_suspended_swinging_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 18; set_unreliability_factor(ride); @@ -1526,7 +1526,7 @@ static void ride_ratings_calculate_inverted_roller_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 17; set_unreliability_factor(ride); @@ -1543,12 +1543,12 @@ static void ride_ratings_calculate_inverted_roller_coaster(rct_ride *ride) ride_ratings_apply_65E1C2(&ratings, ride, 15420, 15291, 35108); ride_ratings_apply_proximity(&ratings, ride, 15657); ride_ratings_apply_scenery(&ratings, ride, 8366); - + if ((ride->inversions & 0x1F) == 0) ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 12, 2, 2, 2); - + ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); - + if ((ride->inversions & 0x1F) == 0) ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0,30), 2, 2, 2); @@ -1570,7 +1570,7 @@ static void ride_ratings_calculate_junior_roller_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 13; set_unreliability_factor(ride); @@ -1683,7 +1683,7 @@ static void ride_ratings_calculate_mini_suspended_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 15; set_unreliability_factor(ride); @@ -1755,7 +1755,7 @@ static void ride_ratings_calculate_wooden_wild_mouse(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 14; set_unreliability_factor(ride); @@ -1797,7 +1797,7 @@ static void ride_ratings_calculate_steeplechase(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 14; set_unreliability_factor(ride); @@ -1909,7 +1909,7 @@ static void ride_ratings_calculate_bobsleigh_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 16; set_unreliability_factor(ride); @@ -1980,7 +1980,7 @@ static void ride_ratings_calculate_looping_roller_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = ride_is_powered_launched(ride) ? 20 : 15; set_unreliability_factor(ride); @@ -2002,7 +2002,7 @@ static void ride_ratings_calculate_looping_roller_coaster(rct_ride *ride) ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 14, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); - + if ((ride->inversions & 0x1F) == 0) { ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 10), 2, 2, 2); ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); @@ -2026,7 +2026,7 @@ static void ride_ratings_calculate_dinghy_slide(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 13; set_unreliability_factor(ride); @@ -2065,7 +2065,7 @@ static void ride_ratings_calculate_mine_train_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 16; set_unreliability_factor(ride); @@ -2121,7 +2121,7 @@ static void ride_ratings_calculate_chairlift(rct_ride *ride) ride_ratings_apply_proximity(&ratings, ride, 11183); ride_ratings_apply_scenery(&ratings, ride, 25098); ride_ratings_apply_first_length_penalty(&ratings, ride, 0x960000, 2, 2, 2); - + ride_ratings_apply_intensity_penalty(&ratings); ride_ratings_apply_adjustments(ride, &ratings); @@ -2149,7 +2149,7 @@ static void ride_ratings_calculate_corkscrew_roller_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 16; set_unreliability_factor(ride); @@ -2203,7 +2203,7 @@ static void ride_ratings_calculate_maze(rct_ride *ride) int size = min(ride->maze_tiles, 100); ratings.excitement += size; ratings.intensity += size * 2; - + ride_ratings_apply_scenery(&ratings, ride, 22310); ride_ratings_apply_intensity_penalty(&ratings); @@ -2262,7 +2262,7 @@ static void ride_ratings_calculate_go_karts(rct_ride *ride) ride_ratings_set(&ratings, RIDE_RATING(1,42), RIDE_RATING(1,73), RIDE_RATING(0,40)); ride_ratings_apply_length(&ratings, ride, 700, 32768); - + if (ride->mode == RIDE_MODE_RACE && ride->num_vehicles >= 4) { ratings.excitement += RIDE_RATING(1,40); ratings.intensity += RIDE_RATING(0,50); @@ -2692,7 +2692,7 @@ static void ride_ratings_calculate_reverse_freefall_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 25; set_unreliability_factor(ride); @@ -2759,7 +2759,7 @@ static void ride_ratings_calculate_vertical_drop_roller_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 16; set_unreliability_factor(ride); @@ -2814,10 +2814,10 @@ static void ride_ratings_calculate_twist(rct_ride *ride) ratings.nausea += ride->rotations * 20; ride_ratings_apply_scenery(&ratings, ride, 13943); - + ride_ratings_apply_intensity_penalty(&ratings); ride_ratings_apply_adjustments(ride, &ratings); - + ride->ratings = ratings; ride->upkeep_cost = ride_compute_upkeep(ride); @@ -2858,7 +2858,7 @@ static void ride_ratings_calculate_flying_roller_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 17; set_unreliability_factor(ride); @@ -2904,7 +2904,7 @@ static void ride_ratings_calculate_virginia_reel(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 19; set_unreliability_factor(ride); @@ -3012,7 +3012,7 @@ static void ride_ratings_calculate_lay_down_roller_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 18; set_unreliability_factor(ride); @@ -3098,7 +3098,7 @@ static void ride_ratings_calculate_reverser_roller_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 19; set_unreliability_factor(ride); @@ -3146,7 +3146,7 @@ static void ride_ratings_calculate_heartline_twister_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 18; set_unreliability_factor(ride); @@ -3292,7 +3292,7 @@ static void ride_ratings_calculate_twister_roller_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 15; set_unreliability_factor(ride); @@ -3338,7 +3338,7 @@ static void ride_ratings_calculate_wooden_roller_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 19; set_unreliability_factor(ride); @@ -3379,7 +3379,7 @@ static void ride_ratings_calculate_side_friction_roller_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 19; set_unreliability_factor(ride); @@ -3419,7 +3419,7 @@ static void ride_ratings_calculate_wild_mouse(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 14; set_unreliability_factor(ride); @@ -3460,7 +3460,7 @@ static void ride_ratings_calculate_multi_dimension_roller_coaster(rct_ride *ride if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 18; set_unreliability_factor(ride); @@ -3506,7 +3506,7 @@ static void ride_ratings_calculate_giga_coaster(rct_ride *ride) if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) return; - + ride->unreliability_factor = 14; set_unreliability_factor(ride); @@ -3526,9 +3526,9 @@ static void ride_ratings_calculate_giga_coaster(rct_ride *ride) if ((ride->inversions & 0x1F) == 0) ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 16, 2, 2, 2); - + ride_ratings_apply_max_speed_penalty(&ratings, ride, 0xA0000, 2, 2, 2); - + if ((ride->inversions & 0x1F) == 0) { ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0, 40), 2, 2, 2); ride_ratings_apply_num_drops_penalty(&ratings, ride, 2, 2, 2, 2); @@ -3851,7 +3851,7 @@ static void ride_ratings_calculate_magic_carpet(rct_ride *ride) ratings.nausea += ride->operation_option * 20; ride_ratings_apply_scenery(&ratings, ride, 11155); - + ride_ratings_apply_intensity_penalty(&ratings); ride_ratings_apply_adjustments(ride, &ratings); @@ -3909,7 +3909,7 @@ static void ride_ratings_calculate_river_rafts(rct_ride *ride) ride_ratings_apply_drops(&ratings, ride, 78643, 93622, 62259); ride_ratings_apply_proximity(&ratings, ride, 13420); ride_ratings_apply_scenery(&ratings, ride, 11155); - + ride_ratings_apply_intensity_penalty(&ratings); ride_ratings_apply_adjustments(ride, &ratings); @@ -3941,7 +3941,7 @@ static void ride_ratings_calculate_enterprise(rct_ride *ride) ratings.nausea += ride->operation_option * 16; ride_ratings_apply_scenery(&ratings, ride, 19521); - + ride_ratings_apply_intensity_penalty(&ratings); ride_ratings_apply_adjustments(ride, &ratings); diff --git a/src/ride/ride_ratings.h b/src/ride/ride_ratings.h index 5baa99e2e9..29c5c92fff 100644 --- a/src/ride/ride_ratings.h +++ b/src/ride/ride_ratings.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/ride/station.c b/src/ride/station.c index 9dffe1680a..fcdda75918 100644 --- a/src/ride/station.c +++ b/src/ride/station.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -222,7 +222,7 @@ static void ride_update_station_race(rct_ride *ride, int stationIndex) return; } } - + // Begin the race ride_race_init_vehicle_speeds(ride); ride->lifecycle_flags |= RIDE_LIFECYCLE_PASS_STATION_NO_STOPPING; diff --git a/src/ride/station.h b/src/ride/station.h index b71f1dc27d..8614e5b059 100644 --- a/src/ride/station.h +++ b/src/ride/station.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/ride/track.h b/src/ride/track.h index e279fa1400..07d4a6343d 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -129,7 +129,7 @@ typedef struct { uint32 flags; // 0x02 }; union{ - // After loading the track this is converted to + // After loading the track this is converted to // a flags register uint8 ride_mode; // 0x06 uint8 track_flags; // 0x06 diff --git a/src/ride/track_data.c b/src/ride/track_data.c index 2a44f51788..1ba63b6e65 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -4878,75 +4878,75 @@ const uint8 TrackPieceLengths[256] = { 100, // TRACK_ELEM_RIGHT_LARGE_HALF_LOOP_UP 100, // TRACK_ELEM_RIGHT_LARGE_HALF_LOOP_DOWN 100, // TRACK_ELEM_LEFT_LARGE_HALF_LOOP_DOWN - 96, // - 96, // - 96, // - 96, // - 64, // - 64, // - 64, // - 64, // - 64, // - 64, // - 16, // - 16, // - 64, // - 64, // - 32, // - 32, // - 32, // - 32, // - 32, // - 80, // - 80, // - 80, // - 64, // - 64, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 32, // - 80, // - 80, // - 80, // + 96, // + 96, // + 96, // + 96, // + 64, // + 64, // + 64, // + 64, // + 64, // + 64, // + 16, // + 16, // + 64, // + 64, // + 32, // + 32, // + 32, // + 32, // + 32, // + 80, // + 80, // + 80, // + 64, // + 64, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 80, // + 80, // + 80, // }; // rct2: 0x00998C95 diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index 4b03ba9c20..285704aa1c 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -320,7 +320,7 @@ void vehicle_sounds_update() if (sprite->vehicle.sound1_id == (uint8)-1) { if (vehicle_sound->sound1_id != (uint16)-1) { vehicle_sound->sound1_id = -1; - Mixer_Stop_Channel(vehicle_sound->sound1_channel); + Mixer_Stop_Channel(vehicle_sound->sound1_channel); } } else { if (vehicle_sound->sound1_id == (uint16)-1) { @@ -424,7 +424,7 @@ void vehicle_sounds_update() } /** - * + * * rct2: 0x006D4204 */ void vehicle_update_all() @@ -449,7 +449,7 @@ void vehicle_update_all() } /** - * + * * rct2: 0x006D77F2 */ static void vehicle_update(rct_vehicle *vehicle) @@ -458,7 +458,7 @@ static void vehicle_update(rct_vehicle *vehicle) } /** - * + * * rct2: 0x006D73D0 * ax: verticalG * dx: lateralG @@ -470,7 +470,7 @@ void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG) esi = (int)vehicle; RCT2_CALLFUNC_X(0x006D73D0, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - + if (verticalG != NULL) *verticalG = (sint16)(eax & 0xFFFF); if (lateralG != NULL) *lateralG = (sint16)(edx & 0xFFFF); } diff --git a/src/ride/vehicle.h b/src/ride/vehicle.h index dc7327cb98..542fac531a 100644 --- a/src/ride/vehicle.h +++ b/src/ride/vehicle.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/scenario_list.c b/src/scenario_list.c index 695c8c9208..4d38ffa338 100644 --- a/src/scenario_list.c +++ b/src/scenario_list.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -43,7 +43,7 @@ rct_scenario_basic *get_scenario_by_filename(const char *filename) } /** - * + * * rct2: 0x006775A8 */ void scenario_load_list() @@ -161,7 +161,7 @@ static void scenario_scores_get_path(utf8 *outPath) } /** - * + * * rct2: 0x006775A8 */ static int scenario_scores_load() @@ -217,7 +217,7 @@ static int scenario_scores_load() } /** - * + * * rct2: 0x00677B50 */ int scenario_scores_save() diff --git a/src/sprites.h b/src/sprites.h index df08a21df1..95194a2a70 100644 --- a/src/sprites.h +++ b/src/sprites.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -32,7 +32,7 @@ enum { SPR_HOT_AND_DRY = 3292, SPR_COLD = 3293, - // This is the start of every character there are + // This is the start of every character there are // 224 characters per font (first 32 are control codes hence why it doesn't go to 255) // 4 fonts // = 896 sprites diff --git a/src/title.h b/src/title.h index 234adb6fe7..c856674fe3 100644 --- a/src/title.h +++ b/src/title.h @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ - + #ifndef _TITLE_H_ #define _TITLE_H_ diff --git a/src/tutorial.c b/src/tutorial.c index 778cf47812..07e6b4c725 100644 --- a/src/tutorial.c +++ b/src/tutorial.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/tutorial.h b/src/tutorial.h index a9db5b71db..d1b2eced61 100644 --- a/src/tutorial.h +++ b/src/tutorial.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/util/util.c b/src/util/util.c index d7f081357b..68db4cfd74 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/util/util.h b/src/util/util.h index c0e75feb61..398ca173c4 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/windows/about.c b/src/windows/about.c index c0c18c75dc..a513d5bf41 100644 --- a/src/windows/about.c +++ b/src/windows/about.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -77,7 +77,7 @@ static rct_window_event_list window_about_events = { }; /** - * + * * rct2: 0x0066D2AC */ void window_about_open() @@ -106,7 +106,7 @@ void window_about_open() } /** - * + * * rct2: 0x0066D4D5 */ static void window_about_mouseup(rct_window *w, int widgetIndex) @@ -125,7 +125,7 @@ static void window_about_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x0066D321 */ static void window_about_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -140,7 +140,7 @@ static void window_about_paint(rct_window *w, rct_drawpixelinfo *dpi) // Version RCT2_GLOBAL(0x009C383C, uint8) = 49; gfx_draw_string_centred(dpi, STR_VERSION_X, x, y, 0, (void*)0x009E2D28); - + // Credits RCT2_GLOBAL(0x009C383C, uint8) = 48; y += 10; diff --git a/src/windows/banner.c b/src/windows/banner.c index 6ff97c3bb4..01f6d4ec1d 100644 --- a/src/windows/banner.c +++ b/src/windows/banner.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -75,8 +75,8 @@ static rct_window_event_list window_banner_events = { NULL, window_banner_mouseup, NULL, - window_banner_mousedown, - window_banner_dropdown, + window_banner_mousedown, + window_banner_dropdown, NULL, NULL, NULL, @@ -133,7 +133,7 @@ void window_banner_open(rct_windownumber number) int view_x = gBanners[w->number].x << 5; int view_y = gBanners[w->number].y << 5; - + rct_map_element* map_element = map_get_first_element_at(view_x / 32, view_y / 32); while(1) { if ( @@ -220,25 +220,25 @@ static void window_banner_mousedown(int widgetIndex, rct_window*w, rct_widget* w window_dropdown_show_colour(w, widget, w->colours[1] | 0x80, banner->colour); break; case WIDX_TEXT_COLOR_DROPDOWN_BUTTON: - + for( int i = 0; i < 13; ++i){ gDropdownItemsFormat[i] = 1142; gDropdownItemsArgs[i] = 2997 + i; } - + //Switch to the dropdown box widget. widget--; window_dropdown_show_text_custom_width( - widget->left + w->x, - widget->top + w->y, + widget->left + w->x, + widget->top + w->y, widget->bottom - widget->top + 1, - w->colours[1], + w->colours[1], DROPDOWN_FLAG_STAY_OPEN, - 13, + 13, widget->right - widget->left - 3); - + dropdown_set_checked(banner->text_colour - 1, true); break; } @@ -246,7 +246,7 @@ static void window_banner_mousedown(int widgetIndex, rct_window*w, rct_widget* w /* rct2: 0x6ba517 */ static void window_banner_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) -{ +{ rct_banner* banner = &gBanners[w->number]; switch(widgetIndex){ @@ -323,16 +323,16 @@ static void window_banner_invalidate(rct_window *w) rct_scenery_entry* sceneryEntry = g_bannerSceneryEntries[banner->type]; if (sceneryEntry->banner.flags & 1) colour_btn->type = WWT_COLORBTN; - + w->pressed_widgets &= ~(1ULL<disabled_widgets &= ~( (1ULL<flags & BANNER_FLAG_NO_ENTRY){ w->pressed_widgets |= (1ULL<disabled_widgets |= + w->disabled_widgets |= (1ULL<. *****************************************************************************/ @@ -1131,7 +1131,7 @@ static void window_cheats_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w) sprite_idx += (w->frame_no / 2) % 8; gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_1].left, w->y + w->widgets[WIDX_TAB_1].top, 0); } - + // Guests tab if (!(w->disabled_widgets & (1 << WIDX_TAB_2))) { sprite_idx = 5568; @@ -1159,9 +1159,9 @@ static void window_cheats_set_page(rct_window *w, int page) { w->page = page; w->frame_no = 0; - + w->enabled_widgets = window_cheats_page_enabled_widgets[page]; - + w->pressed_widgets = 0; w->event_handlers = window_cheats_page_events[page]; diff --git a/src/windows/clear_scenery.c b/src/windows/clear_scenery.c index fcbb6a50c5..e6ef342c3d 100644 --- a/src/windows/clear_scenery.c +++ b/src/windows/clear_scenery.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -97,7 +97,7 @@ static rct_window_event_list window_clear_scenery_events = { }; /** - * + * * rct2: 0x0068E0A7 */ void window_clear_scenery_open() @@ -221,11 +221,11 @@ static void window_clear_scenery_invalidate(rct_window *w) // Set the preview image button to be pressed down w->pressed_widgets = (1 << WIDX_PREVIEW) | (gClearSmallScenery ? (1 << WIDX_SMALL_SCENERY) : 0) | - (gClearLargeScenery ? (1 << WIDX_LARGE_SCENERY) : 0) | + (gClearLargeScenery ? (1 << WIDX_LARGE_SCENERY) : 0) | (gClearFootpath ? (1 << WIDX_FOOTPATH) : 0); // Update the preview image (for tool sizes up to 7) - window_clear_scenery_widgets[WIDX_PREVIEW].image = RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) <= 7 ? + window_clear_scenery_widgets[WIDX_PREVIEW].image = RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) <= 7 ? SPR_LAND_TOOL_SIZE_0 + RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) : 0xFFFFFFFF; } diff --git a/src/windows/dropdown.c b/src/windows/dropdown.c index a593e4c69f..6e3335e92c 100644 --- a/src/windows/dropdown.c +++ b/src/windows/dropdown.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -170,7 +170,7 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo _dropdown_item_height = 10; if (flags & 0x40) _dropdown_item_height = flags & 0x3F; - + // Set the widgets gDropdownNumItems = num_items; _dropdown_num_rows = num_items; @@ -314,7 +314,7 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) *((char*)(0x00141FC4B + (w->colours[0] * 8)))); } } else { - // + // if (i == gDropdownHighlightedIndex) { l = w->x + 2 + (cell_x * _dropdown_item_width); t = w->y + 2 + (cell_y * _dropdown_item_height); @@ -366,7 +366,7 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) } } -/* New function based on 6e914e +/* New function based on 6e914e * returns -1 if index is invalid */ int dropdown_index_from_point(int x, int y, rct_window *w) @@ -408,7 +408,7 @@ void window_dropdown_show_colour_available(rct_window *w, rct_widget *widget, ui uint32 availableColours) { int i, numItems; - + // Count number of available colours numItems = 0; for (i = 0; i < 32; i++) diff --git a/src/windows/dropdown.h b/src/windows/dropdown.h index 5096e2ae92..43dcc4cf0d 100644 --- a/src/windows/dropdown.h +++ b/src/windows/dropdown.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/windows/editor_bottom_toolbar.c b/src/windows/editor_bottom_toolbar.c index 278820e9dc..1dcbd2a15b 100644 --- a/src/windows/editor_bottom_toolbar.c +++ b/src/windows/editor_bottom_toolbar.c @@ -109,7 +109,7 @@ static EMPTY_ARGS_VOID_POINTER *previous_button_mouseup_events[] = { }; static EMPTY_ARGS_VOID_POINTER *next_button_mouseup_events[] = { - window_editor_bottom_toolbar_jump_forward_from_object_selection, + window_editor_bottom_toolbar_jump_forward_from_object_selection, window_editor_bottom_toolbar_jump_forward_to_invention_list_set_up, window_editor_bottom_toolbar_jump_forward_to_options_selection, window_editor_bottom_toolbar_jump_forward_to_objective_selection, @@ -371,7 +371,7 @@ void window_editor_bottom_toolbar_jump_forward_to_save_scenario() return; } - // + // s6Info->editor_step = 255; // Ensure path has .SC6 extension @@ -467,16 +467,16 @@ void window_editor_bottom_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi) if (g_editor_step == EDITOR_STEP_OBJECT_SELECTION) { drawNextButton = true; - } + } else if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) { drawPreviousButton = true; - } + } else if (RCT2_GLOBAL(0x13573C8, uint16) != 0x2710) { drawNextButton = true; } else if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_18) { drawNextButton = true; - } + } else { drawPreviousButton = true; } @@ -502,7 +502,7 @@ void window_editor_bottom_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi) window_draw_widgets(w, dpi); if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER)) { - + if (drawPreviousButton) { gfx_fill_rect_inset(dpi, @@ -566,7 +566,7 @@ void window_editor_bottom_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi) short textX = (window_editor_bottom_toolbar_widgets[WIDX_NEXT_IMAGE].left + window_editor_bottom_toolbar_widgets[WIDX_NEXT_IMAGE].right - 30) / 2 + w->x; short textY = window_editor_bottom_toolbar_widgets[WIDX_NEXT_IMAGE].top + 6 + w->y; - + short stringId = STR_OBJECT_SELECTION_STEP + g_editor_step + 1; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) stringId = STR_ROLLERCOASTER_DESIGNER_STEP; diff --git a/src/windows/editor_inventions_list.c b/src/windows/editor_inventions_list.c index 66feb1b2fd..396512b107 100644 --- a/src/windows/editor_inventions_list.c +++ b/src/windows/editor_inventions_list.c @@ -164,7 +164,7 @@ static int research_item_is_always_researched(rct_research_item *researchItem) return (researchItem->entryIndex & (RESEARCH_ENTRY_FLAG_RIDE_ALWAYS_RESEARCHED | RESEARCH_ENTRY_FLAG_SCENERY_SET_ALWAYS_RESEARCHED)) != 0; } -/* rct2: 0x0068596F +/* rct2: 0x0068596F * Sets rides that are in use to be always researched */ static void research_rides_setup(){ @@ -239,11 +239,11 @@ static void research_rides_setup(){ } } -/* rct2: 0x0068590C +/* rct2: 0x0068590C * Sets the critical scenery sets to always researched */ static void research_scenery_sets_setup(){ - + for (rct_object_entry* object = RCT2_ADDRESS(0x0098DA74, rct_object_entry); (object->flags & 0xFF) != 0xFF; object++){ @@ -284,8 +284,8 @@ static void research_always_researched_setup() * rct2: 0x00685A79 */ static void sub_685A79() -{ - for (rct_research_item* research = gResearchItems; +{ + for (rct_research_item* research = gResearchItems; research->entryIndex != RESEARCHED_ITEMS_END_2; research++){ @@ -304,7 +304,7 @@ static rct_string_id research_item_get_name(uint32 researchItem) { rct_ride_type *rideEntry; rct_scenery_set_entry *sceneryEntry; - + if (researchItem < 0x10000) { sceneryEntry = g_scenerySetEntries[researchItem & 0xFF]; if (sceneryEntry == NULL || sceneryEntry == (rct_scenery_set_entry*)0xFFFFFFFF) @@ -624,7 +624,7 @@ static void window_editor_inventions_list_scrollgetheight(rct_window *w, int scr // Count / skip pre-researched items for (researchItem = gResearchItems; researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR; researchItem++) *height += 10; - + if (scrollIndex == 1) { researchItem++; @@ -736,7 +736,7 @@ static void window_editor_inventions_list_paint(rct_window *w, rct_drawpixelinfo int x, y, width; window_draw_widgets(w, dpi); - + // Tab image x = w->x + w->widgets[WIDX_TAB_1].left; y = w->y + w->widgets[WIDX_TAB_1].top; @@ -831,7 +831,7 @@ static void window_editor_inventions_list_scrollpaint(rct_window *w, rct_drawpix // Since this is now a do while need to conteract the +10 itemY = -10; - do{ + do{ itemY += 10; if (itemY + 10 < dpi->y || itemY >= dpi->y + dpi->height) continue; diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 67f032ecfb..b6e064aed3 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -50,7 +50,7 @@ enum { FILTER_RIDE_WATER = (1 << 9), FILTER_RIDE_STALL = (1 << 10), - + FILTER_ALL = 0x7EF, } FILTER_FLAGS; @@ -628,8 +628,8 @@ static void setup_in_use_selection_flags(){ uint8 entry_type, entry_index; if (find_object_in_entry_group(installedObject, &entry_type, &entry_index)){ if (RCT2_ADDRESS(0x0098DA38, uint8*)[entry_type][entry_index] & (1 << 0)){ - *selection_flags |= - OBJECT_SELECTION_FLAG_IN_USE | + *selection_flags |= + OBJECT_SELECTION_FLAG_IN_USE | OBJECT_SELECTION_FLAG_SELECTED; } if (RCT2_ADDRESS(0x0098DA38, uint8*)[entry_type][entry_index] & (1 << 1)){ @@ -733,7 +733,7 @@ void unload_unselected_objects(){ } /** - * + * * rct2: 0x006AB199 */ static void window_editor_object_selection_close(rct_window *w) @@ -765,7 +765,7 @@ static void window_editor_object_selection_close(rct_window *w) } /** - * + * * rct2: 0x006AAFAB */ static void window_editor_object_selection_mouseup(rct_window *w, int widgetIndex) @@ -910,7 +910,7 @@ void window_editor_object_selection_mousedown(int widgetIndex, rct_window*w, rct gDropdownItemsChecked = _filter_flags & 0xF; break; - + } } @@ -935,7 +935,7 @@ static void window_editor_object_selection_dropdown(rct_window *w, int widgetInd } /** - * + * * rct2: 0x006AB031 */ static void window_editor_object_selection_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) @@ -944,7 +944,7 @@ static void window_editor_object_selection_scrollgetsize(rct_window *w, int scro } /** - * + * * rct2: 0x006AB0B6 */ static void window_editor_object_selection_scroll_mousedown(rct_window *w, int scrollIndex, int x, int y) @@ -999,7 +999,7 @@ static void window_editor_object_selection_scroll_mousedown(rct_window *w, int s } /** - * + * * rct2: 0x006AB079 */ static void window_editor_object_selection_scroll_mouseover(rct_window *w, int scrollIndex, int x, int y) @@ -1027,7 +1027,7 @@ static void window_editor_object_selection_scroll_mouseover(rct_window *w, int s } /** - * + * * rct2: 0x006AB058 */ static void window_editor_object_selection_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) @@ -1054,7 +1054,7 @@ static void window_editor_object_selection_tooltip(rct_window* w, int widgetInde } /** - * + * * rct2: 0x006AA9FD */ static void window_editor_object_selection_invalidate(rct_window *w) @@ -1180,14 +1180,14 @@ static void window_editor_object_selection_invalidate(rct_window *w) (1 << WIDX_FILTER_RIDE_TAB_WATER) | (1 << WIDX_FILTER_RIDE_TAB_STALL)); for (int i = WIDX_FILTER_RIDE_TAB_FRAME; i <= WIDX_FILTER_RIDE_TAB_STALL; i++) w->widgets[i].type = WWT_EMPTY; - + w->widgets[WIDX_LIST_SORT_TYPE].type = WWT_EMPTY; w->widgets[WIDX_LIST_SORT_RIDE].type = WWT_EMPTY; } } /** - * + * * rct2: 0x006AAB56 */ static void window_editor_object_selection_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -1363,7 +1363,7 @@ static void window_editor_object_selection_paint(rct_window *w, rct_drawpixelinf strcpy(stringBuffer, name); } gfx_draw_string_centred_clipped(dpi, stringId, NULL, 0, x, y, width); - + // Draw description of object x = w->x + w->widgets[WIDX_LIST].right + 4; y += 15; @@ -1379,7 +1379,7 @@ static void window_editor_object_selection_paint(rct_window *w, rct_drawpixelinf } gfx_draw_string_right(dpi, stringId, NULL, 2, w->x + w->width - 5, w->y + w->height - 3 - 12 - 14); - // + // if (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS) { y = w->y + w->height - 3 - 12 - 14 - 14; @@ -1404,7 +1404,7 @@ static void window_editor_object_selection_paint(rct_window *w, rct_drawpixelinf } /** - * + * * rct2: 0x006AADA3 */ static void window_editor_object_selection_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) @@ -1651,7 +1651,7 @@ void reset_required_object_flags(){ set_required_object_flags(required_object); required_object++; } - + } selection_flags++; @@ -1659,9 +1659,9 @@ void reset_required_object_flags(){ } } -/* +/* * Master objects are objects that are not - * optional / required dependants of an + * optional / required dependants of an * object. */ void set_object_selection_error(uint8 is_master_object, rct_string_id error_msg){ @@ -1814,7 +1814,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct // Skip size of chunk pos += 4; - uint8 num_required_objects = *pos++; + uint8 num_required_objects = *pos++; rct_object_entry* required_objects = (rct_object_entry*)pos; for (; num_required_objects != 0; num_required_objects--){ if (!window_editor_object_selection_select_object(++bh, flags, required_objects)){ @@ -1837,7 +1837,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct } theme_object++; } - + if (bh != 0 && !(flags&(1 << 1))){ uint32* arguments = RCT2_ADDRESS(0x0013CE952, uint32); object_create_identifier_name((char*)0x009BC95A, installedObject); @@ -1888,7 +1888,7 @@ static int get_object_from_object_selection(uint8 object_type, int y, uint8 *obj } /** - * + * * rct2: 0x006D33E2 */ static void window_editor_object_selection_manage_tracks() @@ -1927,7 +1927,7 @@ static void window_editor_object_selection_manage_tracks() } /** - * + * * rct2: 0x006ABBBE */ static void editor_load_selected_objects() diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index 1712de45fd..0a4909d758 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -506,7 +506,7 @@ static void window_editor_objective_options_show_climate_dropdown(rct_window *w) { int i; rct_widget *dropdownWidget; - + dropdownWidget = &w->widgets[WIDX_CLIMATE]; for (i = 0; i < 4; i++) { @@ -530,7 +530,7 @@ static void window_editor_objective_options_show_category_dropdown(rct_window *w rct_s6_info *s6Info = (rct_s6_info*)0x00141F570; int i; rct_widget *dropdownWidget; - + dropdownWidget = &w->widgets[WIDX_CATEGORY]; for (i = 0; i < 5; i++) { @@ -1224,7 +1224,7 @@ static void window_editor_objective_options_update_disabled_widgets(rct_window * numRides++; } } - + if (numRides == 0) { w->disabled_widgets &= ~(1 << WIDX_TAB_2); } else { diff --git a/src/windows/editor_scenario_options.c b/src/windows/editor_scenario_options.c index 24ee1454e4..f1bb0880fb 100644 --- a/src/windows/editor_scenario_options.c +++ b/src/windows/editor_scenario_options.c @@ -830,7 +830,7 @@ static void window_editor_scenario_options_guests_invalidate(rct_window *w) } else { w->widgets[WIDX_CASH_PER_GUEST].type = WWT_SPINNER; w->widgets[WIDX_CASH_PER_GUEST_INCREASE].type = WWT_DROPDOWN_BUTTON; - w->widgets[WIDX_CASH_PER_GUEST_DECREASE].type = WWT_DROPDOWN_BUTTON; + w->widgets[WIDX_CASH_PER_GUEST_DECREASE].type = WWT_DROPDOWN_BUTTON; } // Guests prefer less intense rides checkbox @@ -874,7 +874,7 @@ static void window_editor_scenario_options_guests_paint(rct_window *w, rct_drawp arg = RCT2_GLOBAL(RCT2_ADDRESS_GUEST_INITIAL_CASH, money16); gfx_draw_string_left(dpi, 3246, &arg, 0, x, y); } - + // Guest initial happiness label x = w->x + 8; y = w->y + w->widgets[WIDX_GUEST_INITIAL_HAPPINESS].top; @@ -1177,7 +1177,7 @@ static void window_editor_scenario_options_park_paint(rct_window *w, rct_drawpix x = w->x + 8; y = w->y + w->widgets[WIDX_LAND_COST].top; gfx_draw_string_left(dpi, 3277, NULL, 0, x, y); - + // Cost to buy land value x = w->x + w->widgets[WIDX_LAND_COST].left + 1; y = w->y + w->widgets[WIDX_LAND_COST].top; @@ -1190,7 +1190,7 @@ static void window_editor_scenario_options_park_paint(rct_window *w, rct_drawpix x = w->x + 8; y = w->y + w->widgets[WIDX_CONSTRUCTION_RIGHTS_COST].top; gfx_draw_string_left(dpi, 3278, NULL, 0, x, y); - + // Cost to buy construction rights value x = w->x + w->widgets[WIDX_CONSTRUCTION_RIGHTS_COST].left + 1; y = w->y + w->widgets[WIDX_CONSTRUCTION_RIGHTS_COST].top; @@ -1208,7 +1208,7 @@ static void window_editor_scenario_options_park_paint(rct_window *w, rct_drawpix stringId = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY ? 3279 : 3280; gfx_draw_string_left(dpi, 1193, &stringId, 0, x, y); } - + if (w->widgets[WIDX_ENTRY_PRICE].type != WWT_EMPTY) { // Entry price label x = w->x + w->widgets[WIDX_PAY_FOR_PARK_OR_RIDES].right + 8; diff --git a/src/windows/error.c b/src/windows/error.c index 90576f6b61..b93d15da65 100644 --- a/src/windows/error.c +++ b/src/windows/error.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -72,7 +72,7 @@ static char _window_error_text[512]; static uint16 _window_error_num_lines; /** - * + * * rct2: 0x0066792F * * bx: title @@ -133,7 +133,7 @@ void window_error_open(rct_string_id title, rct_string_id message) y = y - height - 40; y = min(y, maxY); } - + w = window_create(x, y, width, height, &window_error_events, WC_ERROR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_RESIZABLE); w->widgets = window_error_widgets; w->error.var_480 = 0; @@ -142,7 +142,7 @@ void window_error_open(rct_string_id title, rct_string_id message) } /** - * + * * rct2: 0x00667BFE */ static void window_error_unknown5(rct_window *w) @@ -153,7 +153,7 @@ static void window_error_unknown5(rct_window *w) } /** - * + * * rct2: 0x00667AA3 */ static void window_error_paint(rct_window *w, rct_drawpixelinfo *dpi) diff --git a/src/windows/error.h b/src/windows/error.h index 3ddb36c1c9..6f30cc74f2 100644 --- a/src/windows/error.h +++ b/src/windows/error.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/windows/finances.c b/src/windows/finances.c index 11ad495297..3b74bd95c8 100644 --- a/src/windows/finances.c +++ b/src/windows/finances.c @@ -627,7 +627,7 @@ static void window_finances_summary_update(rct_window *w) } /** - * + * * rct2: 0x0069C732 */ static void window_finances_summary_invalidate(rct_window *w) @@ -644,7 +644,7 @@ static void window_finances_summary_invalidate(rct_window *w) } /** - * + * * rct2: 0x0069C771 */ static void window_finances_summary_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -693,7 +693,7 @@ static void window_finances_summary_paint(rct_window *w, rct_drawpixelinfo *dpi) y - 1 ); y += 14; - + // Month expenditures money32 profit = 0; money32 *expenditures = &RCT2_ADDRESS(RCT2_ADDRESS_EXPENDITURE_TABLE, money32)[i * 14]; @@ -728,7 +728,7 @@ static void window_finances_summary_paint(rct_window *w, rct_drawpixelinfo *dpi) x += 80; } - + // Horizontal rule below expenditure / income table gfx_fill_rect_inset(dpi, w->x + 8, w->y + 223, w->x + 8 + 513, w->y + 223 + 1, w->colours[1], 0x20); @@ -765,7 +765,7 @@ static void window_finances_summary_paint(rct_window *w, rct_drawpixelinfo *dpi) #pragma region Financial graph page /** - * + * * rct2: 0x0069CF70 */ static void window_finances_financial_graph_mouseup(rct_window *w, int widgetIndex) @@ -777,7 +777,7 @@ static void window_finances_financial_graph_mouseup(rct_window *w, int widgetInd } /** - * + * * rct2: 0x0069CF8B */ static void window_finances_financial_graph_update(rct_window *w) @@ -789,7 +789,7 @@ static void window_finances_financial_graph_update(rct_window *w) } /** - * + * * rct2: 0x0069CBDB */ static void window_finances_financial_graph_invalidate(rct_window *w) @@ -805,7 +805,7 @@ static void window_finances_financial_graph_invalidate(rct_window *w) } /** - * + * * rct2: 0x0069CC10 */ static void window_finances_financial_graph_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -875,7 +875,7 @@ static void window_finances_financial_graph_paint(rct_window *w, rct_drawpixelin #pragma region Value graph page /** - * + * * rct2: 0x0069D338 */ static void window_finances_park_value_graph_mouseup(rct_window *w, int widgetIndex) @@ -887,7 +887,7 @@ static void window_finances_park_value_graph_mouseup(rct_window *w, int widgetIn } /** - * + * * rct2: 0x0069D353 */ static void window_finances_park_value_graph_update(rct_window *w) @@ -899,7 +899,7 @@ static void window_finances_park_value_graph_update(rct_window *w) } /** - * + * * rct2: 0x0069CFC0 */ static void window_finances_park_value_graph_invalidate(rct_window *w) @@ -915,7 +915,7 @@ static void window_finances_park_value_graph_invalidate(rct_window *w) } /** - * + * * rct2: 0x0069CFF5 */ static void window_finances_park_value_graph_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -981,7 +981,7 @@ static void window_finances_park_value_graph_paint(rct_window *w, rct_drawpixeli #pragma region Profit graph page /** - * + * * rct2: 0x0069D715 */ static void window_finances_profit_graph_mouseup(rct_window *w, int widgetIndex) @@ -993,7 +993,7 @@ static void window_finances_profit_graph_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x0069D730 */ static void window_finances_profit_graph_update(rct_window *w) @@ -1005,7 +1005,7 @@ static void window_finances_profit_graph_update(rct_window *w) } /** - * + * * rct2: 0x0069D388 */ static void window_finances_profit_graph_invalidate(rct_window *w) @@ -1021,7 +1021,7 @@ static void window_finances_profit_graph_invalidate(rct_window *w) } /** - * + * * rct2: 0x0069D3BD */ static void window_finances_profit_graph_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -1087,7 +1087,7 @@ static void window_finances_profit_graph_paint(rct_window *w, rct_drawpixelinfo #pragma region Marketing page /** - * + * * rct2: 0x0069D9F9 */ static void window_finances_marketing_mouseup(rct_window *w, int widgetIndex) @@ -1102,7 +1102,7 @@ static void window_finances_marketing_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x0069DA2F */ static void window_finances_marketing_update(rct_window *w) @@ -1114,7 +1114,7 @@ static void window_finances_marketing_update(rct_window *w) } /** - * + * * rct2: 0x0069D765 */ static void window_finances_marketing_invalidate(rct_window *w) @@ -1162,7 +1162,7 @@ static void window_finances_marketing_invalidate(rct_window *w) } /** - * + * * rct2: 0x0069D834 */ static void window_finances_marketing_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -1236,7 +1236,7 @@ static void window_finances_marketing_paint(rct_window *w, rct_drawpixelinfo *dp #pragma region Research page /** - * + * * rct2: 0x0069DB3F */ static void window_finances_research_mouseup(rct_window *w, int widgetIndex) @@ -1270,14 +1270,14 @@ static void window_finances_research_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x0069DB66 */ static void window_finances_research_mousedown(int widgetIndex, rct_window *w, rct_widget* widget) { rct_widget *dropdownWidget; int i; - + if (widgetIndex != WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON) return; @@ -1302,7 +1302,7 @@ static void window_finances_research_mousedown(int widgetIndex, rct_window *w, r } /** - * + * * rct2: 0x0069DB6D */ static void window_finances_research_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -1314,7 +1314,7 @@ static void window_finances_research_dropdown(rct_window *w, int widgetIndex, in } /** - * + * * rct2: 0x0069DC23 */ static void window_finances_research_update(rct_window *w) @@ -1326,7 +1326,7 @@ static void window_finances_research_update(rct_window *w) } /** - * + * * rct2: 0x0069DA64 */ static void window_finances_research_invalidate(rct_window *w) @@ -1347,7 +1347,7 @@ static void window_finances_research_invalidate(rct_window *w) // Current funding window_finances_research_widgets[WIDX_RESEARCH_FUNDING].image = STR_NO_FUNDING + currentResearchLevel; - + // Checkboxes int activeResearchTypes = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint16); int uncompletedResearchTypes = gResearchUncompletedCategories; @@ -1372,7 +1372,7 @@ static void window_finances_research_invalidate(rct_window *w) } /** - * + * * rct2: 0x0069DAF0 */ static void window_finances_research_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -1406,7 +1406,7 @@ static void window_finances_set_page(rct_window *w, int page) w->widgets = window_finances_page_widgets[page]; w->disabled_widgets = 0; w->pressed_widgets = 0; - + window_invalidate(w); if (w->page == WINDOW_FINANCES_PAGE_RESEARCH) { w->width = 320; diff --git a/src/windows/footpath.c b/src/windows/footpath.c index 2dcbfe94e0..adcd719edb 100644 --- a/src/windows/footpath.c +++ b/src/windows/footpath.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -162,7 +162,7 @@ static void window_footpath_set_enabled_and_pressed_widgets(); static void footpath_get_next_path_info(int *type, int *x, int *y, int *z, int *slope); /** - * + * * rct2: 0x006A7C43 */ void window_footpath_open() @@ -222,7 +222,7 @@ void window_footpath_open() } /** - * + * * rct2: 0x006A852F */ static void window_footpath_close(rct_window *w) @@ -236,7 +236,7 @@ static void window_footpath_close(rct_window *w) } /** - * + * * rct2: 0x006A7E92 */ static void window_footpath_mouseup(rct_window *w, int widgetIndex) @@ -285,7 +285,7 @@ static void window_footpath_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006A7EC5 */ static void window_footpath_mousedown(int widgetIndex, rct_window*w, rct_widget* widget) @@ -322,7 +322,7 @@ static void window_footpath_mousedown(int widgetIndex, rct_window*w, rct_widget* } /** - * + * * rct2: 0x006A7F18 */ static void window_footpath_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -336,7 +336,7 @@ static void window_footpath_dropdown(rct_window *w, int widgetIndex, int dropdow RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_PATH_TYPE, uint8) = SELECTED_PATH_TYPE_QUEUE; else return; - + // Get path id pathId = dropdownIndex; if (pathId == -1) { @@ -372,7 +372,7 @@ static void window_footpath_dropdown(rct_window *w, int widgetIndex, int dropdow } /** - * + * * rct2: 0x006A8032 */ static void window_footpath_toolupdate(rct_window* w, int widgetIndex, int x, int y) @@ -385,7 +385,7 @@ static void window_footpath_toolupdate(rct_window* w, int widgetIndex, int x, in } /** - * + * * rct2: 0x006A8047 */ static void window_footpath_tooldown(rct_window* w, int widgetIndex, int x, int y) @@ -397,7 +397,7 @@ static void window_footpath_tooldown(rct_window* w, int widgetIndex, int x, int } /** - * + * * rct2: 0x006A8067 */ static void window_footpath_tooldrag(rct_window* w, int widgetIndex, int x, int y) @@ -408,7 +408,7 @@ static void window_footpath_tooldrag(rct_window* w, int widgetIndex, int x, int } /** - * + * * rct2: 0x006A8066 */ static void window_footpath_toolup(rct_window* w, int widgetIndex, int x, int y) @@ -420,7 +420,7 @@ static void window_footpath_toolup(rct_window* w, int widgetIndex, int x, int y) } /** - * + * * rct2: 0x006A7760 */ static void window_footpath_update_provisional_path_for_bridge_mode(rct_window *w) @@ -455,7 +455,7 @@ static void window_footpath_update_provisional_path_for_bridge_mode(rct_window * } /** - * + * * rct2: 0x006A84BB */ static void window_footpath_update(rct_window *w) @@ -482,7 +482,7 @@ static void window_footpath_update(rct_window *w) } /** - * + * * rct2: 0x006A7D1C */ static void window_footpath_invalidate(rct_window *w) @@ -491,7 +491,7 @@ static void window_footpath_invalidate(rct_window *w) rct_path_type *pathType; colour_scheme_update(w); - + // Press / unpress footpath and queue type buttons w->pressed_widgets &= ~(1 << WIDX_FOOTPATH_TYPE); w->pressed_widgets &= ~(1 << WIDX_QUEUELINE_TYPE); @@ -517,7 +517,7 @@ static void window_footpath_invalidate(rct_window *w) window_footpath_widgets[WIDX_QUEUELINE_TYPE].type = WWT_FLATBTN; } else { window_footpath_widgets[WIDX_QUEUELINE_TYPE].type = WWT_EMPTY; - } + } // Disable queue line button if in Scenario Editor if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) @@ -525,7 +525,7 @@ static void window_footpath_invalidate(rct_window *w) } /** - * + * * rct2: 0x006A7D8B */ static void window_footpath_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -570,7 +570,7 @@ static void window_footpath_paint(rct_window *w, rct_drawpixelinfo *dpi) } /** - * + * * rct2: 0x006A7F88 */ static void window_footpath_show_footpath_types_dialog(rct_window *w, rct_widget *widget, int showQueues) @@ -636,7 +636,7 @@ static void window_footpath_mousedown_slope(int slope) } /** - * + * * rct2: 0x006A81FB */ static void window_footpath_set_provisional_path_at_point(int x, int y) @@ -724,7 +724,7 @@ static void window_footpath_set_selection_start_bridge_at_point(int screenX, int } /** - * + * * rct2: 0x006A82C5 */ static void window_footpath_place_path_at_point(int x, int y) @@ -767,7 +767,7 @@ static void window_footpath_place_path_at_point(int x, int y) } /** - * + * * rct2: 0x006A840F */ static void window_footpath_start_bridge_at_point(int screenX, int screenY) @@ -800,7 +800,7 @@ static void window_footpath_start_bridge_at_point(int screenX, int screenY) } } } - + tool_cancel(); RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_X, uint16) = x; RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_Y, uint16) = y; @@ -878,7 +878,7 @@ static void window_footpath_construct() } /** - * + * * rct2: 0x006A78EF */ static void footpath_remove_map_element(rct_map_element *mapElement) @@ -929,7 +929,7 @@ static void footpath_remove_map_element(rct_map_element *mapElement) } /** - * + * * rct2: 0x006A7873 */ static rct_map_element *footpath_get_map_element_to_remove() @@ -958,7 +958,7 @@ static rct_map_element *footpath_get_map_element_to_remove() if (!(mapElement->properties.path.type & 4)) if ((mapElement->properties.path.type & 3) == RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_DIRECTION, uint8)) continue; - + return mapElement; } } @@ -968,7 +968,7 @@ static rct_map_element *footpath_get_map_element_to_remove() } /** - * + * * rct2: 0x006A7863 */ static void window_footpath_remove() @@ -986,7 +986,7 @@ static void window_footpath_remove() } /** - * + * * rct2: 0x006A855C */ static void window_footpath_set_enabled_and_pressed_widgets() @@ -1061,7 +1061,7 @@ static void window_footpath_set_enabled_and_pressed_widgets() } /** - * + * * rct2: 0x006A7B20 */ static void footpath_get_next_path_info(int *type, int *x, int *y, int *z, int *slope) diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index c9e001f09e..5867e645f8 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -158,7 +158,7 @@ void window_game_bottom_toolbar_open() } /** - * + * * rct2: 0x0066C588 */ static void window_game_bottom_toolbar_mouseup(rct_window *w, int widgetIndex) @@ -225,7 +225,7 @@ static void window_game_bottom_toolbar_tooltip(rct_window* w, int widgetIndex, r case WIDX_DATE: month = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16) & 7; day = ((RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16) * days_in_month[month]) >> 16) & 0xFF; - + RCT2_GLOBAL(0x013CE952, short) = STR_DATE_DAY_1 + day; RCT2_GLOBAL(0x013CE954, short) = STR_MONTH_MARCH + month; break; @@ -233,7 +233,7 @@ static void window_game_bottom_toolbar_tooltip(rct_window* w, int widgetIndex, r } /** - * + * * rct2: 0x0066BBA0 */ static void window_game_bottom_toolbar_invalidate(rct_window *w) @@ -314,7 +314,7 @@ static void window_game_bottom_toolbar_invalidate(rct_window *w) } /** - * + * * rct2: 0x0066BB79 */ void window_game_bottom_toolbar_invalidate_news_item() @@ -325,7 +325,7 @@ void window_game_bottom_toolbar_invalidate_news_item() } /** - * + * * rct2: 0x0066BC87 */ static void window_game_bottom_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -411,7 +411,7 @@ static void window_game_bottom_toolbar_draw_left_panel(rct_drawpixelinfo *dpi, r } /** - * + * * rct2: 0x0066C76C */ static void window_game_bottom_toolbar_draw_park_rating(rct_drawpixelinfo *dpi, rct_window *w, int colour, int x, int y, uint8 factor) @@ -493,7 +493,7 @@ static void window_game_bottom_toolbar_draw_right_panel(rct_drawpixelinfo *dpi, } /** - * + * * rct2: 0x0066BFA5 */ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rct_window *w) diff --git a/src/windows/guest_list.c b/src/windows/guest_list.c index d1b097b92b..517569c438 100644 --- a/src/windows/guest_list.c +++ b/src/windows/guest_list.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -138,7 +138,7 @@ static void window_guest_list_find_groups(); static void get_arguments_from_peep(rct_peep *peep, uint32 *argument_1, uint32* argument_2); /** - * + * * rct2: 0x006992E3 */ void window_guest_list_open() @@ -267,7 +267,7 @@ void window_guest_list_open_with_filter(int type, int index) } /** - * + * * rct2: 0x00699AAF */ static void window_guest_list_mouseup(rct_window *w, int widgetIndex) @@ -292,7 +292,7 @@ static void window_guest_list_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x00699EA3 */ static void window_guest_list_resize(rct_window *w) @@ -310,7 +310,7 @@ static void window_guest_list_resize(rct_window *w) } /** - * + * * rct2: 0x00699AC4 */ static void window_guest_list_mousedown(int widgetIndex, rct_window*w, rct_widget* widget) @@ -378,7 +378,7 @@ static void window_guest_list_mousedown(int widgetIndex, rct_window*w, rct_widge } /** - * + * * rct2: 0x00699AE1 */ static void window_guest_list_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -400,7 +400,7 @@ static void window_guest_list_dropdown(rct_window *w, int widgetIndex, int dropd } /** - * + * * rct2: 0x00699E54 */ static void window_guest_list_update(rct_window *w) @@ -414,7 +414,7 @@ static void window_guest_list_update(rct_window *w) } /** - * + * * rct2: 0x00699C55 */ static void window_guest_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) @@ -474,7 +474,7 @@ static void window_guest_list_scrollgetsize(rct_window *w, int scrollIndex, int } /** - * + * * rct2: 0x00699D7D */ static void window_guest_list_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) @@ -498,7 +498,7 @@ static void window_guest_list_scrollmousedown(rct_window *w, int scrollIndex, in if (i == 0) { // Open guest window window_guest_open(peep); - + break; } else { i--; @@ -521,7 +521,7 @@ static void window_guest_list_scrollmousedown(rct_window *w, int scrollIndex, in } /** - * + * * rct2: 0x00699D3B */ static void window_guest_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) @@ -537,7 +537,7 @@ static void window_guest_list_scrollmouseover(rct_window *w, int scrollIndex, in } /** - * + * * rct2: 0x00699E4A */ static void window_guest_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) @@ -546,7 +546,7 @@ static void window_guest_list_tooltip(rct_window* w, int widgetIndex, rct_string } /** - * + * * rct2: 0x00699511 */ static void window_guest_list_invalidate(rct_window *w) @@ -576,7 +576,7 @@ static void window_guest_list_invalidate(rct_window *w) } /** - * + * * rct2: 0x006995CC */ static void window_guest_list_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -632,7 +632,7 @@ static void window_guest_list_paint(rct_window *w, rct_drawpixelinfo *dpi) } /** - * + * * rct2: 0x00699701 */ static void window_guest_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) @@ -664,7 +664,7 @@ static void window_guest_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, if (_window_guest_list_tracking_only && !(peep->flags & PEEP_FLAGS_TRACKING)) continue; - // + // if (y + 11 >= -0x7FFF && y + 11 > dpi->y && y < 0x7FFF) { // Check if y is beyond the scroll control if (y > dpi->y + dpi->height) @@ -690,9 +690,9 @@ static void window_guest_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, // Tracking icon if (peep->flags & PEEP_FLAGS_TRACKING) gfx_draw_sprite(dpi, 5129, 112, y, 0); - + // Action - + get_arguments_from_action(peep, &argument_1, &argument_2); RCT2_GLOBAL(0x013CE952, uint32) = argument_1; @@ -709,7 +709,7 @@ static void window_guest_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, continue; if (thought->var_2 > 5) break; - + get_arguments_from_thought(peep->thoughts[j], &argument_1, &argument_2); RCT2_GLOBAL(0x013CE952, uint32) = argument_1; @@ -789,7 +789,7 @@ static int window_guest_list_is_peep_in_filter(rct_peep* peep) return 1; } -/** +/** * rct2:0x0069B7EA * Calculates a hash value (arguments) for comparing peep actions/thoughts * peep (esi) @@ -817,7 +817,7 @@ static void get_arguments_from_peep(rct_peep *peep, uint32 *argument_1, uint32* } /** - * + * * rct2: 0x0069B5AE */ static void window_guest_list_find_groups() @@ -854,11 +854,11 @@ static void window_guest_list_find_groups() _window_guest_list_num_groups++; _window_guest_list_groups_num_guests[groupIndex] = 1; peep->var_0C &= ~(1 << 8); - + get_arguments_from_peep( peep, &_window_guest_list_groups_argument_1[groupIndex], &_window_guest_list_groups_argument_2[groupIndex]); RCT2_GLOBAL(0x00F1EDF6, uint32) = _window_guest_list_groups_argument_1[groupIndex]; RCT2_GLOBAL(0x00F1EDFA, uint32) = _window_guest_list_groups_argument_2[groupIndex]; - + RCT2_ADDRESS(0x00F1AF26, uint8)[groupIndex] = groupIndex; faceIndex = groupIndex * 56; _window_guest_list_groups_guest_faces[faceIndex++] = get_peep_face_sprite_small(peep) - 5486; diff --git a/src/windows/install_track.c b/src/windows/install_track.c index 70615409f6..b0591080b7 100644 --- a/src/windows/install_track.c +++ b/src/windows/install_track.c @@ -270,7 +270,7 @@ static void window_install_track_invalidate(rct_window *w) else w->pressed_widgets &= ~(1 << WIDX_TOGGLE_SCENERY); - if (w->track_list.var_482 != 0xFFFF) { + if (w->track_list.var_482 != 0xFFFF) { w->disabled_widgets &= ~(1 << WIDX_TRACK_PREVIEW); } else { @@ -326,7 +326,7 @@ static void window_install_track_paint(rct_window *w, rct_drawpixelinfo *dpi) y = w->y + widget->bottom - 12; RCT2_GLOBAL(0x00F44153, uint8) = 0; - + // Warnings if (track_td6->track_flags & 1) { RCT2_GLOBAL(0x00F44153, uint8) = 1; diff --git a/src/windows/land.c b/src/windows/land.c index 82cb1e99cd..366c9f2a2f 100644 --- a/src/windows/land.c +++ b/src/windows/land.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/windows/land_rights.c b/src/windows/land_rights.c index ce0ea3cf89..b59432fee9 100644 --- a/src/windows/land_rights.c +++ b/src/windows/land_rights.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index b3f584ac28..9e2d0e1c97 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -18,7 +18,7 @@ * along with this program. If not, see . *****************************************************************************/ -#include +#include #include "../addresses.h" #include "../config.h" #include "../game.h" @@ -399,7 +399,7 @@ static void window_loadsave_scrollmouseover(rct_window *w, int scrollIndex, int selectedItem = y / 10; if (selectedItem >= w->no_list_items) return; - + w->selected_list_item = selectedItem; window_invalidate(w); @@ -530,13 +530,13 @@ static void window_loadsave_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, i char *templateString; gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, RCT2_ADDRESS(0x0141FC48,uint8)[w->colours[1] * 8]); - + templateString = (char*)language_get_string(templateStringId); for (i = 0; i < w->no_list_items; i++) { y = i * 10; if (y > dpi->y + dpi->height) break; - + if (y + 10 < dpi->y) continue; diff --git a/src/windows/main.c b/src/windows/main.c index 1d6fdb8d10..e1bdf08aa8 100644 --- a/src/windows/main.c +++ b/src/windows/main.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -92,7 +92,7 @@ void window_main_open() /** * - * rct2: 0x66CCAE + * rct2: 0x66CCAE * This function immediately jumps to 0x00685BE1 this is the second function * decompiled. */ diff --git a/src/windows/map.c b/src/windows/map.c index f7d8728b1b..e8174c9ed4 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -847,7 +847,7 @@ static void window_map_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int sc window_map_paint_peep_overlay(dpi); else window_map_paint_train_overlay(dpi); - + window_map_paint_hud_rectangle(dpi); } @@ -855,7 +855,7 @@ static void window_map_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int sc * * rct2: 0x0068CA6C */ -static void window_map_init_map() +static void window_map_init_map() { memset(RCT2_GLOBAL(RCT2_ADDRESS_MAP_IMAGE_DATA, void*), 0x0A0A0A0A, 256 * 256 * sizeof(uint32)); RCT2_GLOBAL(0x00F1AD6C, uint32) = 0; @@ -887,7 +887,7 @@ static void window_map_center_on_view_point() dx = ((w->viewport->view_height >> 1) + w->viewport->view_y) >> 4; cx += offset.x; dx += offset.y; - + // calculate width and height of minimap ax = w_map->widgets[WIDX_MAP].right - w_map->widgets[WIDX_MAP].left - 11; @@ -1078,7 +1078,7 @@ static void window_map_paint_train_overlay(rct_drawpixelinfo *dpi) /** * The call to gfx_fill_rect was originally wrapped in sub_68DABD which made sure that arguments were ordered correctly, * but it doesn't look like it's ever necessary here so the call was removed. - * + * * rct2: 0x0068D8CE */ static void window_map_paint_hud_rectangle(rct_drawpixelinfo *dpi) @@ -1115,7 +1115,7 @@ static void window_map_paint_hud_rectangle(rct_drawpixelinfo *dpi) } /** - * + * * rct2: 0x0068D24E */ static void window_map_set_land_rights_tool_update(int x, int y) @@ -1148,7 +1148,7 @@ static void window_map_set_land_rights_tool_update(int x, int y) } /** - * + * * rct2: 0x00666EEF */ void sub_666EEF(int x, int y, sint16 *mapX, sint16 *mapY, sint16 *mapZ, int *direction) @@ -1174,7 +1174,7 @@ void sub_666EEF(int x, int y, sint16 *mapX, sint16 *mapY, sint16 *mapZ, int *dir } /** - * + * * rct2: 0x00666FD0 */ static void window_map_place_park_entrance_tool_update(int x, int y) @@ -1218,7 +1218,7 @@ static void window_map_place_park_entrance_tool_update(int x, int y) } /** - * + * * rct2: 0x0068D4E9 */ static void window_map_set_peep_spawn_tool_update(int x, int y) @@ -1256,7 +1256,7 @@ static void window_map_set_peep_spawn_tool_update(int x, int y) } /** - * + * * rct2: 0x006670A4 */ static void window_map_place_park_entrance_tool_down(int x, int y) @@ -1293,7 +1293,7 @@ static void window_map_place_park_entrance_tool_down(int x, int y) } /** - * + * * rct2: 0x0068D573 */ static void window_map_set_peep_spawn_tool_down(int x, int y) @@ -1327,7 +1327,7 @@ static void window_map_set_peep_spawn_tool_down(int x, int y) } /** - * + * * rct2: 0x0068D641 */ static void map_window_increase_map_size() @@ -1348,7 +1348,7 @@ static void map_window_increase_map_size() } /** - * + * * rct2: 0x0068D6B4 */ static void map_window_decrease_map_size() @@ -1596,7 +1596,7 @@ static void map_window_set_pixels(rct_window *w) { uint16 colour, *destination; int x, y, dx, dy; - + destination = (uint16*)((RCT2_GLOBAL(0x00F1AD6C, uint32) * 511) + RCT2_GLOBAL(0x00F1AD68, uint32) + 255); switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) { case 0: diff --git a/src/windows/map_tooltip.c b/src/windows/map_tooltip.c index 0356c31197..8499a0b7d2 100644 --- a/src/windows/map_tooltip.c +++ b/src/windows/map_tooltip.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -63,7 +63,7 @@ static rct_window_event_list window_map_tooltip_events = { NULL }; -#define MAP_TOOLTIP_ARGS +#define MAP_TOOLTIP_ARGS static int _lastCursorX; static int _lastCursorY; @@ -105,7 +105,7 @@ void window_map_tooltip_update_visibility() } /** - * + * * rct2: 0x006A7C43 */ static void window_map_tooltip_open() @@ -134,7 +134,7 @@ static void window_map_tooltip_open() } /** - * + * * rct2: 0x006EE8CE */ static void window_map_tooltip_update(rct_window *w) @@ -143,7 +143,7 @@ static void window_map_tooltip_update(rct_window *w) } /** - * + * * rct2: 0x006EE894 */ static void window_map_tooltip_paint(rct_window *w, rct_drawpixelinfo *dpi) diff --git a/src/windows/mapgen.c b/src/windows/mapgen.c index 87d9fe573e..dd7336dd70 100644 --- a/src/windows/mapgen.c +++ b/src/windows/mapgen.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -168,7 +168,7 @@ static rct_widget window_mapgen_simplex_widgets[] = { { WWT_FLATBTN, 1, 225, 271, 68, 103, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP }, { WWT_FLATBTN, 1, 225, 271, 104, 139, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP }, - + { WIDGETS_END }, }; @@ -978,7 +978,7 @@ static void window_mapgen_simplex_paint(rct_window *w, rct_drawpixelinfo *dpi) uint16 mapSizeArgs[2] = { _mapSize, _mapSize }; gfx_draw_string_left(dpi, 839, mapSizeArgs, w->colours[1], w->x + w->widgets[WIDX_SIMPLEX_MAP_SIZE].left + 1, w->y + w->widgets[WIDX_SIMPLEX_MAP_SIZE].top + 1); - + arg = (_waterLevel - 12) / 2; gfx_draw_string_left(dpi, 1737, &arg, w->colours[1], w->x + w->widgets[WIDX_SIMPLEX_WATER_LEVEL].left + 1, w->y + w->widgets[WIDX_SIMPLEX_WATER_LEVEL].top + 1); } diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index 00f0d90576..5dc90c56f6 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -172,7 +172,7 @@ static void window_maze_construction_close(rct_window *w) // In order to cancel the yellow arrow correctly the // selection tool should be cancelled. tool_cancel(); - + hide_gridlines(); uint8 rideIndex = _currentRideIndex; @@ -360,12 +360,12 @@ static void window_maze_construction_entrance_tooldown(int x, int y, rct_window* RCT2_GLOBAL(0x00141E9AE, rct_string_id) = is_exit ? 1144 : 1145; money32 cost = game_do_command( - x, - GAME_COMMAND_FLAG_APPLY | ((direction ^ 2) << 8), - y, + x, + GAME_COMMAND_FLAG_APPLY | ((direction ^ 2) << 8), + y, rideIndex | (is_exit << 8), - GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, - RCT2_GLOBAL(0x00F44193, uint8), + GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, + RCT2_GLOBAL(0x00F44193, uint8), 0); if (cost == MONEY32_UNDEFINED) @@ -392,7 +392,7 @@ static void window_maze_construction_entrance_tooldown(int x, int y, rct_window* } /** - * + * * rct2: 0x006CD65D */ static void window_maze_construction_tooldown(rct_window* w, int widgetIndex, int x, int y) @@ -431,13 +431,13 @@ static void window_maze_construction_paint(rct_window *w, rct_drawpixelinfo *dpi } /** - * + * * rct2: 0x006CD887 */ void window_maze_construction_update_pressed_widgets() { rct_window *w; - + w = window_find_by_class(WC_RIDE_CONSTRUCTION); if (w == NULL) return; diff --git a/src/windows/music_credits.c b/src/windows/music_credits.c index 0fad3895c8..8908fc8520 100644 --- a/src/windows/music_credits.c +++ b/src/windows/music_credits.c @@ -102,7 +102,7 @@ void window_music_credits_open() window->colours[0] = 7; window->colours[1] = 7; window->colours[2] = 7; - + } /** @@ -172,5 +172,5 @@ static void window_music_credits_scrollpaint(rct_window *w, rct_drawpixelinfo *d y += 10; string += 1; } - + } \ No newline at end of file diff --git a/src/windows/network_status.c b/src/windows/network_status.c index 813e7e9620..7073aaf203 100644 --- a/src/windows/network_status.c +++ b/src/windows/network_status.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/windows/new_campaign.c b/src/windows/new_campaign.c index 7d87a96f86..73aaa03bb2 100644 --- a/src/windows/new_campaign.c +++ b/src/windows/new_campaign.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -126,7 +126,7 @@ int ride_name_compare(const void *a, const void *b) } /** - * + * * rct2: 0x0069E16F */ void window_new_campaign_open(sint16 campaignType) @@ -134,7 +134,7 @@ void window_new_campaign_open(sint16 campaignType) rct_window *w; rct_ride *ride; int i, numApplicableRides; - + w = window_bring_to_front_by_class(WC_NEW_CAMPAIGN); if (w != NULL) { if (w->campaign.campaign_type == campaignType) @@ -189,7 +189,7 @@ void window_new_campaign_open(sint16 campaignType) } /** - * + * * rct2: 0x0069E320 */ static void window_new_campaign_get_shop_items() @@ -208,7 +208,7 @@ static void window_new_campaign_get_shop_items() // Remove certain items? items &= 0x0011FF78036BA3E0; - // + // numItems = 0; for (i = 0; i < 64; i++) if (items & (1LL << i)) @@ -217,7 +217,7 @@ static void window_new_campaign_get_shop_items() } /** - * + * * rct2: 0x0069E50B */ static void window_new_campaign_mouseup(rct_window *w, int widgetIndex) @@ -234,7 +234,7 @@ static void window_new_campaign_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x0069E51C */ static void window_new_campaign_mousedown(int widgetIndex, rct_window *w, rct_widget* widget) @@ -304,7 +304,7 @@ static void window_new_campaign_mousedown(int widgetIndex, rct_window *w, rct_wi } /** - * + * * rct2: 0x0069E537 */ static void window_new_campaign_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -322,7 +322,7 @@ static void window_new_campaign_dropdown(rct_window *w, int widgetIndex, int dro } /** - * + * * rct2: 0x0069E397 */ static void window_new_campaign_invalidate(rct_window *w) @@ -367,7 +367,7 @@ static void window_new_campaign_invalidate(rct_window *w) } /** - * + * * rct2: 0x0069E493 */ static void window_new_campaign_paint(rct_window *w, rct_drawpixelinfo *dpi) diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index a1b35e7b8c..b0fb38d021 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -383,7 +383,7 @@ static void window_new_ride_scroll_to_focused_ride(rct_window *w) int scrollWidth = 0; int scrollHeight = 0; window_get_scroll_size(w, 0, &scrollWidth, &scrollHeight); - + // Find row index of the focused ride type rct_widget *listWidget = &window_new_ride_widgets[WIDX_RIDE_LIST]; int focusRideType = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_RIDE_LIST_HIGHLIGHTED_ITEM, uint16)[_window_new_ride_current_tab]; @@ -443,13 +443,13 @@ rct_window *window_new_ride_open() w->new_ride.highlighted_ride_id = -1; _lastTrackDesignCountRideType.type = 255; _lastTrackDesignCountRideType.entry_index = 255; - + window_new_ride_populate_list(); - + w->new_ride.highlighted_ride_id = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_RIDE_LIST_HIGHLIGHTED_ITEM, sint16)[_window_new_ride_current_tab]; if (w->new_ride.highlighted_ride_id == -1) w->new_ride.highlighted_ride_id = RCT2_GLOBAL(0x00F43523, sint16); - + w->width = 1; window_new_ride_refresh_widget_sizing(w); window_new_ride_scroll_to_focused_ride(w); @@ -460,7 +460,7 @@ rct_window *window_new_ride_open() rct_window *window_new_ride_open_research() { rct_window *w; - + w = window_new_ride_open(); window_new_ride_set_page(w, WINDOW_NEW_RIDE_PAGE_RESEARCH); return w; @@ -790,7 +790,7 @@ static void window_new_ride_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, i flags |= 0x20; if (w->new_ride.highlighted_ride_id == *((sint16*)listItem) || flags != 0) gfx_fill_rect_inset(dpi, x, y, x + 115, y + 115, w->colours[1], 0x80 | flags); - + // Draw ride image with feathered border rideEntry = rideEntries[listItem->entry_index]; int image_id = rideEntry->images_offset; @@ -911,7 +911,7 @@ static void window_new_ride_paint_ride_information(rct_window *w, rct_drawpixeli } price = (price >> 17) * 10 * RCT2_GLOBAL(0x0097D21D + (item.type * 8), uint8); - // + // rct_string_id stringId = 1691; if (!ride_type_has_flag(item.type, RIDE_TYPE_FLAG_15)) stringId++; diff --git a/src/windows/news.c b/src/windows/news.c index 623aa7a073..8e6b1677b5 100644 --- a/src/windows/news.c +++ b/src/windows/news.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -85,7 +85,7 @@ static rct_window_event_list window_news_events = { }; /** - * + * * rct2: 0x0066E464 */ void window_news_open() @@ -121,7 +121,7 @@ void window_news_open() } /** - * + * * rct2: 0x0066D4D5 */ static void window_news_mouseup(rct_window *w, int widgetIndex) @@ -134,7 +134,7 @@ static void window_news_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x0066EAB8 */ static void window_news_update(rct_window *w) @@ -176,7 +176,7 @@ static void window_news_update(rct_window *w) } /** - * + * * rct2: 0x0066EA3C */ static void window_news_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) @@ -193,7 +193,7 @@ static void window_news_scrollgetsize(rct_window *w, int scrollIndex, int *width } /** - * + * * rct2: 0x0066EA5C */ static void window_news_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) @@ -244,7 +244,7 @@ static void window_news_scrollmousedown(rct_window *w, int scrollIndex, int x, i } /** - * + * * rct2: 0x0066EAAE */ static void window_news_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) @@ -253,7 +253,7 @@ static void window_news_tooltip(rct_window* w, int widgetIndex, rct_string_id *s } /** - * + * * rct2: 0x0066E4E8 */ static void window_news_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -267,7 +267,7 @@ static void window_news_invalidate(rct_window *w) } /** - * + * * rct2: 0x0066E4EE */ static void window_news_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) @@ -346,7 +346,7 @@ static void window_news_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int s gfx_draw_sprite(cliped_dpi, image_id, clip_x, clip_y, 0); rct2_free(cliped_dpi); - break; + break; } case NEWS_ITEM_MONEY: gfx_draw_sprite(dpi, SPR_FINANCE, x, yy, 0); diff --git a/src/windows/options.c b/src/windows/options.c index 68d69f3d69..26982daa7d 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -87,7 +87,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_CONSTRUCTION_MARKER_DROPDOWN, WIDX_DAY_NIGHT_CHECKBOX, WIDX_UPPER_CASE_BANNERS_CHECKBOX, - + // Culture / Units WIDX_LANGUAGE = WIDX_PAGE_START, WIDX_LANGUAGE_DROPDOWN, @@ -199,7 +199,7 @@ static rct_widget window_options_culture_widgets[] = { { WWT_DROPDOWN, 1, 155, 299, 83, 94, 872, STR_NONE }, // distance { WWT_DROPDOWN_BUTTON, 1, 288, 298, 84, 93, STR_DROPDOWN_GLYPH, STR_NONE }, { WWT_DROPDOWN, 1, 155, 299, 98, 110, 875, STR_NONE }, // temperature - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 99, 108, STR_DROPDOWN_GLYPH, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 99, 108, STR_DROPDOWN_GLYPH, STR_NONE }, { WWT_DROPDOWN, 1, 155, 299, 113, 124, 868, STR_NONE }, // height labels { WWT_DROPDOWN_BUTTON, 1, 288, 298, 114, 123, STR_DROPDOWN_GLYPH, STR_NONE }, { WWT_DROPDOWN, 1, 155, 299, 128, 139, STR_NONE, STR_NONE }, // date format @@ -263,7 +263,7 @@ static rct_widget window_options_misc_widgets[] = { static rct_widget window_options_twitch_widgets[] = { MAIN_OPTIONS_WIDGETS, - { WWT_DROPDOWN_BUTTON, 2, 10, 299, 54, 65, STR_TWITCH_NAME, STR_NONE }, // Twitch channel name + { WWT_DROPDOWN_BUTTON, 2, 10, 299, 54, 65, STR_TWITCH_NAME, STR_NONE }, // Twitch channel name { WWT_CHECKBOX, 2, 10, 299, 69, 80, STR_TWITCH_PEEP_FOLLOWERS, STR_TWITCH_PEEP_FOLLOWERS_TIP }, // Twitch name peeps by follows { WWT_CHECKBOX, 2, 10, 299, 84, 95, STR_TWITCH_FOLLOWERS_TRACK, STR_TWITCH_FOLLOWERS_TRACK_TIP }, // Twitch information on for follows { WWT_CHECKBOX, 2, 10, 299, 99, 110, STR_TWITCH_PEEP_CHAT, STR_TWITCH_PEEP_CHAT_TIP }, // Twitch name peeps by chat @@ -412,7 +412,7 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_DEBUGGING_TOOLS) | (1 << WIDX_TITLE_SEQUENCE) | (1 << WIDX_TITLE_SEQUENCE_DROPDOWN) | - (1 << WIDX_TITLE_SEQUENCE_BUTTON) | + (1 << WIDX_TITLE_SEQUENCE_BUTTON) | (1 << WIDX_ALLOW_LOADING_WITH_INCORRECT_CHECKSUM) | (1 << WIDX_STAY_CONNECTED_AFTER_DESYNC), @@ -695,7 +695,7 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* widget) { int num_items, i; - + widget = &w->widgets[widgetIndex - 1]; switch (w->page) { @@ -1093,7 +1093,7 @@ static void window_options_dropdown(rct_window *w, int widgetIndex, int dropdown } /** -* +* * rct2: 0x006BAD48 */ static void window_options_invalidate(rct_window *w) @@ -1399,7 +1399,7 @@ static void window_options_paint(rct_window *w, rct_drawpixelinfo *dpi) w->x + window_options_misc_widgets[WIDX_AUTOSAVE].left + 1, w->y + window_options_misc_widgets[WIDX_AUTOSAVE].top ); - + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&gConfigTitleSequences.presets[gCurrentPreviewTitleSequence].name; gfx_draw_string_left(dpi, STR_TITLE_SEQUENCE, w, w->colours[1], w->x + 10, w->y + window_options_misc_widgets[WIDX_TITLE_SEQUENCE].top + 1); gfx_draw_string_left_clipped( @@ -1429,7 +1429,7 @@ static void window_options_show_dropdown(rct_window *w, rct_widget *widget, int ); } -static void window_options_update_height_markers() +static void window_options_update_height_markers() { RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, uint16) = gConfigGeneral.show_height_as_units ? 0 : (gConfigGeneral.measurement_format + 1) * 256; diff --git a/src/windows/park.c b/src/windows/park.c index c4d4e0998d..d456fab6db 100644 --- a/src/windows/park.c +++ b/src/windows/park.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -122,7 +122,7 @@ static rct_widget window_park_guests_widgets[] = { static rct_widget window_park_price_widgets[] = { MAIN_PARK_WIDGETS, - { WWT_24, 1, 7, 146, 50, 61, STR_ADMISSION_PRICE, STR_NONE }, // + { WWT_24, 1, 7, 146, 50, 61, STR_ADMISSION_PRICE, STR_NONE }, // { WWT_SPINNER, 1, 147, 222, 50, 61, 0x595, STR_NONE }, // price { WWT_DROPDOWN_BUTTON, 1, 211, 221, 51, 55, STR_NUMERIC_UP, STR_NONE }, // increase price { WWT_DROPDOWN_BUTTON, 1, 211, 221, 56, 60, STR_NUMERIC_DOWN, STR_NONE }, // decrease price @@ -486,7 +486,7 @@ static uint32 window_park_page_enabled_widgets[] = { (1 << WIDX_TAB_5) | (1 << WIDX_TAB_6) | (1 << WIDX_TAB_7) | - (1 << WIDX_INCREASE_PRICE) | + (1 << WIDX_INCREASE_PRICE) | (1 << WIDX_DECREASE_PRICE), (1 << WIDX_CLOSE) | @@ -541,7 +541,7 @@ static void window_park_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w); static void window_park_set_disabled_tabs(rct_window *w); /** - * + * * rct2: 0x00667F11 */ rct_window *window_park_open() @@ -582,7 +582,7 @@ static void window_park_prepare_window_title_text() #pragma region Entrance page /** - * + * * rct2: 0x00667C48 */ void window_park_entrance_open() @@ -607,7 +607,7 @@ void window_park_entrance_open() } /** - * + * * rct2: 0x0066860C */ static void window_park_entrance_close(rct_window *w) @@ -699,7 +699,7 @@ static void window_park_entrance_mousedown(int widgetIndex, rct_window*w, rct_wi } /** - * + * * rct2: 0x006682B8 */ static void window_park_entrance_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -719,7 +719,7 @@ static void window_park_entrance_dropdown(rct_window *w, int widgetIndex, int dr } /** - * + * * rct2: 0x006686B5 */ static void window_park_entrance_update(rct_window *w) @@ -807,7 +807,7 @@ void window_park_entrance_tool_update_land_rights(sint16 x, sint16 y){ } /** - * + * * rct2: 0x006681D1 */ static void window_park_entrance_toolupdate(rct_window* w, int widgetIndex, int x, int y) @@ -820,7 +820,7 @@ static void window_park_entrance_toolupdate(rct_window* w, int widgetIndex, int } /** - * + * * rct2: 0x006681E6 */ static void window_park_entrance_tooldown(rct_window* w, int widgetIndex, int x, int y) @@ -860,13 +860,13 @@ static void window_park_entrance_tooldown(rct_window* w, int widgetIndex, int x, } /** - * + * * rct2: 0x006681FB */ static void window_park_entrance_tooldrag(rct_window* w, int widgetIndex, int x, int y) { rct_window* w2 = window_find_by_number(0xB, 0); - + if (!w2) { switch (widgetIndex){ case WIDX_BUY_LAND_RIGHTS: @@ -904,7 +904,7 @@ static void window_park_entrance_tooldrag(rct_window* w, int widgetIndex, int x, } /** - * + * * rct2: 0x0066822A */ static void window_park_entrance_toolabort(rct_window *w, int widgetIndex) @@ -915,7 +915,7 @@ static void window_park_entrance_toolabort(rct_window *w, int widgetIndex) hide_land_rights(); else hide_construction_rights(); - } + } //else if (widgetIndex == WIDX_BUY_CONSTRUCTION_RIGHTS) { // hide_gridlines(); // hide_construction_rights(); @@ -923,7 +923,7 @@ static void window_park_entrance_toolabort(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x0066848B */ static void window_park_entrance_textinput(rct_window *w, int widgetIndex, char *text) @@ -933,7 +933,7 @@ static void window_park_entrance_textinput(rct_window *w, int widgetIndex, char } /** - * + * * rct2: 0x00667FDC */ static void window_park_entrance_invalidate(rct_window *w) @@ -961,7 +961,7 @@ static void window_park_entrance_invalidate(rct_window *w) w->disabled_widgets |= (1 << WIDX_OPEN_OR_CLOSE) | (1 << WIDX_CLOSE_LIGHT) | (1 << WIDX_OPEN_LIGHT); else w->disabled_widgets &= ~((1 << WIDX_OPEN_OR_CLOSE) | (1 << WIDX_CLOSE_LIGHT) | (1 << WIDX_OPEN_LIGHT)); - + // Only allow purchase of land when there is money if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) window_park_entrance_widgets[WIDX_BUY_LAND_RIGHTS].type = WWT_EMPTY; @@ -977,7 +977,7 @@ static void window_park_entrance_invalidate(rct_window *w) window_park_entrance_widgets[WIDX_STATUS].right = w->width - 26; window_park_entrance_widgets[WIDX_STATUS].top = w->height - 13; window_park_entrance_widgets[WIDX_STATUS].bottom = w->height - 3; - + if (theme_get_preset()->features.rct1_park_lights) { window_park_entrance_widgets[WIDX_OPEN_OR_CLOSE].type = WWT_EMPTY; if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) == OBJECTIVE_GUESTS_AND_RATING) { @@ -1014,7 +1014,7 @@ static void window_park_entrance_invalidate(rct_window *w) } /** - * + * * rct2: 0x006680D0 */ static void window_park_entrance_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -1047,7 +1047,7 @@ static void window_park_entrance_paint(rct_window *w, rct_drawpixelinfo *dpi) } /** - * + * * rct2: 0x00669B55 */ static void window_park_init_viewport(rct_window *w) @@ -1481,7 +1481,7 @@ static void window_park_price_invalidate(rct_window *w) static void window_park_price_paint(rct_window *w, rct_drawpixelinfo *dpi) { int x, y; - + window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1574,7 +1574,7 @@ static void window_park_stats_invalidate(rct_window *w) static void window_park_stats_paint(rct_window *w, rct_drawpixelinfo *dpi) { int x, y, parkSize, stringIndex; - + window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1615,7 +1615,7 @@ static void window_park_stats_paint(rct_window *w, rct_drawpixelinfo *dpi) #pragma region Objective page /** - * + * * rct2: 0x00667E57 */ void window_park_objective_open() @@ -1647,7 +1647,7 @@ void window_park_objective_open() } /** - * + * * rct2: 0x006695AA */ static void window_park_objective_mouseup(rct_window *w, int widgetIndex) @@ -1689,7 +1689,7 @@ static void window_park_objective_resize(rct_window *w) } /** - * + * * rct2: 0x0066966C */ static void window_park_objective_update(rct_window *w) @@ -1699,7 +1699,7 @@ static void window_park_objective_update(rct_window *w) } /** - * + * * rct2: 0x006695CC */ static void window_park_objective_textinput(rct_window *w, int widgetIndex, char *text) @@ -1711,7 +1711,7 @@ static void window_park_objective_textinput(rct_window *w, int widgetIndex, char } /** - * + * * rct2: 0x006693B2 */ static void window_park_objective_invalidate(rct_window *w) @@ -1721,7 +1721,7 @@ static void window_park_objective_invalidate(rct_window *w) window_park_set_pressed_tab(w); window_park_prepare_window_title_text(); - // + // if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SCENARIO_COMPLETE_NAME_INPUT) window_park_objective_widgets[WIDX_ENTER_NAME].type = WWT_DROPDOWN_BUTTON; else @@ -1732,13 +1732,13 @@ static void window_park_objective_invalidate(rct_window *w) } /** - * + * * rct2: 0x0066945C */ static void window_park_objective_paint(rct_window *w, rct_drawpixelinfo *dpi) { int x, y; - + window_draw_widgets(w, dpi); window_park_draw_tab_images(dpi, w); @@ -1761,7 +1761,7 @@ static void window_park_objective_paint(rct_window *w, rct_drawpixelinfo *dpi) y += gfx_draw_string_left_wrapped(dpi, (void*)0x013CE952, x, y, 221, 2385 + RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8), 0); y += 5; - + // Objective outcome if (RCT2_GLOBAL(RCT2_ADDRESS_COMPLETED_COMPANY_VALUE, money32) != MONEY32_UNDEFINED) { if (RCT2_GLOBAL(RCT2_ADDRESS_COMPLETED_COMPANY_VALUE, money32) == 0x80000001) { @@ -1980,7 +1980,7 @@ static void window_park_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w) if (w->page == WINDOW_PARK_PAGE_GUESTS) sprite_idx += (w->frame_no / 8) % 8; gfx_draw_sprite(dpi, sprite_idx, w->x + w->widgets[WIDX_TAB_3].left, w->y + w->widgets[WIDX_TAB_3].top, 0); - + sprite_idx = *RCT2_GLOBAL(0x00982708, sint32*) + 1; if (w->page == WINDOW_PARK_PAGE_GUESTS) sprite_idx += w->var_492 & 0xFFFFFFFC; diff --git a/src/windows/player_list.c b/src/windows/player_list.c index 2a75e6b42a..8733f05780 100644 --- a/src/windows/player_list.c +++ b/src/windows/player_list.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/windows/research.c b/src/windows/research.c index c58ce270ec..ff381a5fad 100644 --- a/src/windows/research.c +++ b/src/windows/research.c @@ -121,7 +121,7 @@ static void window_research_funding_update(rct_window *w); static void window_research_funding_invalidate(rct_window *w); static void window_research_funding_paint(rct_window *w, rct_drawpixelinfo *dpi); -// +// static rct_window_event_list window_research_development_events = { NULL, window_research_development_mouseup, @@ -288,7 +288,7 @@ static void window_research_development_update(rct_window *w) } /** - * + * * rct2: 0x006B6819 */ static void window_research_development_invalidate(rct_window *w) @@ -311,7 +311,7 @@ static void window_research_development_invalidate(rct_window *w) } /** - * + * * rct2: 0x006B689B */ static void window_research_development_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -407,7 +407,7 @@ void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dp #pragma region Funding page /** - * + * * rct2: 0x0069DB3F */ static void window_research_funding_mouseup(rct_window *w, int widgetIndex) @@ -437,14 +437,14 @@ static void window_research_funding_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x0069DB66 */ static void window_research_funding_mousedown(int widgetIndex, rct_window *w, rct_widget* widget) { rct_widget *dropdownWidget; int i; - + if (widgetIndex != WIDX_RESEARCH_FUNDING_DROPDOWN_BUTTON) return; @@ -469,7 +469,7 @@ static void window_research_funding_mousedown(int widgetIndex, rct_window *w, rc } /** - * + * * rct2: 0x0069DB6D */ static void window_research_funding_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -482,7 +482,7 @@ static void window_research_funding_dropdown(rct_window *w, int widgetIndex, int } /** - * + * * rct2: 0x0069DC23 */ static void window_research_funding_update(rct_window *w) @@ -494,7 +494,7 @@ static void window_research_funding_update(rct_window *w) } /** - * + * * rct2: 0x0069DA64 */ static void window_research_funding_invalidate(rct_window *w) @@ -508,7 +508,7 @@ static void window_research_funding_invalidate(rct_window *w) window_research_set_pressed_tab(w); - if ((RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) || + if ((RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) || (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) == RESEARCH_STAGE_FINISHED_ALL)) { //window_research_funding_widgets[WIDX_FUNDING_GROUP].type = WWT_EMPTY; window_research_funding_widgets[WIDX_RESEARCH_FUNDING].type = WWT_EMPTY; @@ -522,7 +522,7 @@ static void window_research_funding_invalidate(rct_window *w) int currentResearchLevel = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RESEARCH_LEVEL, uint8); window_research_funding_widgets[WIDX_RESEARCH_FUNDING].image = STR_NO_FUNDING + currentResearchLevel; } - + // Checkboxes int activeResearchTypes = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_RESEARCH_TYPES, uint16); int uncompletedResearchTypes = gResearchUncompletedCategories; @@ -547,7 +547,7 @@ static void window_research_funding_invalidate(rct_window *w) } /** - * + * * rct2: 0x0069DAF0 */ static void window_research_funding_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -591,7 +591,7 @@ static void window_research_set_page(rct_window *w, int page) w->widgets = window_research_page_widgets[page]; w->disabled_widgets = 0; w->pressed_widgets = 0; - + window_invalidate(w); if (w->page == WINDOW_RESEARCH_PAGE_DEVELOPMENT) { w->width = 300; diff --git a/src/windows/ride.c b/src/windows/ride.c index f757342726..4a0fa1c03d 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -969,7 +969,7 @@ static void window_ride_draw_tab_image(rct_drawpixelinfo *dpi, rct_window *w, in } /** - * + * * rct2: 0x006B2E88 */ static void window_ride_draw_tab_main(rct_drawpixelinfo *dpi, rct_window *w) @@ -1003,7 +1003,7 @@ static void window_ride_draw_tab_main(rct_drawpixelinfo *dpi, rct_window *w) } /** - * + * * rct2: 0x006B2B68 */ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo *dpi, rct_window *w) @@ -1072,7 +1072,7 @@ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo *dpi, rct_window *w) } /** - * + * * rct2: 0x006B2F42 */ static void window_ride_draw_tab_customer(rct_drawpixelinfo *dpi, rct_window *w) @@ -1089,13 +1089,13 @@ static void window_ride_draw_tab_customer(rct_drawpixelinfo *dpi, rct_window *w) spriteIndex += RCT2_GLOBAL(RCT2_GLOBAL(0x00982708, uint32), uint32); spriteIndex += 1; spriteIndex |= 0xA9E00000; - + gfx_draw_sprite(dpi, spriteIndex, w->x + (widget->left + widget->right) / 2, w->y + widget->bottom - 6, 0); } } /** - * + * * rct2: 0x006B2B35 */ static void window_ride_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w) @@ -1163,7 +1163,7 @@ void window_ride_disable_tabs(rct_window *w) } /** - * + * * rct2: 0x006AEAB4 */ rct_window *window_ride_open(int rideIndex) @@ -1206,7 +1206,7 @@ rct_window *window_ride_open(int rideIndex) } /** - * + * * rct2: 0x006ACC28 */ rct_window *window_ride_main_open(int rideIndex) @@ -1245,7 +1245,7 @@ rct_window *window_ride_main_open(int rideIndex) } /** - * + * * rct2: 0x006ACCCE */ rct_window *window_ride_open_station(int rideIndex, int stationIndex) @@ -1314,7 +1314,7 @@ rct_window *window_ride_open_track(rct_map_element *mapElement) } /** - * + * * rct2: 0x006ACAC2 */ rct_window *window_ride_open_vehicle(rct_vehicle *vehicle) @@ -1335,7 +1335,7 @@ rct_window *window_ride_open_vehicle(rct_vehicle *vehicle) for (i = 0; i < 32; i++) { if (ride->vehicles[i] == headVehicleSpriteIndex) break; - + view++; } @@ -1471,7 +1471,7 @@ static void window_ride_anchor_border_widgets(rct_window *w) #pragma region Main /** - * + * * rct2: 0x006AF994 */ static void window_ride_init_viewport(rct_window *w) @@ -1489,7 +1489,7 @@ static void window_ride_init_viewport(rct_window *w) focus.sprite.sprite_id = -1; focus.coordinate.zoom = 0; focus.coordinate.rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); - + if (eax >= 0 && eax < ride->num_vehicles && ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK){ focus.sprite.sprite_id = ride->vehicles[eax]; @@ -1511,7 +1511,7 @@ static void window_ride_init_viewport(rct_window *w) } while (count >= 0); eax = ride->station_starts[stationIndex]; - + focus.coordinate.x = (eax & 0xFF) << 5; focus.coordinate.y = (eax & 0xFF00) >> 3; focus.coordinate.z = ride->station_heights[stationIndex] << 3; @@ -1570,16 +1570,16 @@ static void window_ride_init_viewport(rct_window *w) int width = view_widget->right - view_widget->left - 1; int height = view_widget->bottom - view_widget->top - 1; viewport_create( - w, - x, - y, - width, - height, + w, + x, + y, + width, + height, focus.coordinate.zoom, - focus.coordinate.x, - focus.coordinate.y & VIEWPORT_FOCUS_Y_MASK, - focus.coordinate.z, - focus.sprite.type & VIEWPORT_FOCUS_TYPE_MASK, + focus.coordinate.x, + focus.coordinate.y & VIEWPORT_FOCUS_Y_MASK, + focus.coordinate.z, + focus.sprite.type & VIEWPORT_FOCUS_TYPE_MASK, focus.sprite.sprite_id); w->flags |= WF_NO_SCROLLING; @@ -1592,7 +1592,7 @@ static void window_ride_init_viewport(rct_window *w) } /** - * + * * rct2: 0x006B4971 */ void window_ride_construct(rct_window *w) @@ -1602,7 +1602,7 @@ void window_ride_construct(rct_window *w) } /** - * + * * rct2: 0x006AF315 */ static void window_ride_rename(rct_window *w) @@ -1615,7 +1615,7 @@ static void window_ride_rename(rct_window *w) } /** - * + * * rct2: 0x006AF17E */ static void window_ride_main_mouseup(rct_window *w, int widgetIndex) @@ -1680,7 +1680,7 @@ static void window_ride_main_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006AF4A2 */ static void window_ride_main_resize(rct_window *w) @@ -1710,7 +1710,7 @@ static void window_ride_main_resize(rct_window *w) } /** - * + * * rct2: 0x006AF825 */ static void window_ride_show_view_dropdown(rct_window *w, rct_widget *widget) @@ -1773,7 +1773,7 @@ static void window_ride_show_view_dropdown(rct_window *w, rct_widget *widget) } /** - * + * * rct2: 0x006AF64C */ static void window_ride_show_open_dropdown(rct_window *w, rct_widget *widget) @@ -1797,7 +1797,7 @@ static void window_ride_show_open_dropdown(rct_window *w, rct_widget *widget) gDropdownItemsFormat[numItems] = 1142; gDropdownItemsArgs[numItems] = STR_OPEN_RIDE; numItems++; - + window_dropdown_show_text( w->x + widget->left, w->y + widget->top, @@ -1849,7 +1849,7 @@ static void window_ride_show_open_dropdown(rct_window *w, rct_widget *widget) } /** - * + * * rct2: 0x006AF1BD */ static void window_ride_main_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) @@ -1865,7 +1865,7 @@ static void window_ride_main_mousedown(int widgetIndex, rct_window *w, rct_widge } /** - * + * * rct2: 0x006AF300 */ static void window_ride_main_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -1921,7 +1921,7 @@ static void window_ride_main_dropdown(rct_window *w, int widgetIndex, int dropdo } /** - * + * * rct2: 0x006AF40F */ static void window_ride_main_update(rct_window *w) @@ -1965,7 +1965,7 @@ static void window_ride_main_update(rct_window *w) } /** - * + * * rct2: 0x006AF2F9 */ static void window_ride_main_textinput(rct_window *w, int widgetIndex, char *text) @@ -1977,7 +1977,7 @@ static void window_ride_main_textinput(rct_window *w, int widgetIndex, char *tex } /** - * + * * rct2: 0x006AF55A */ static void window_ride_main_unknown_14(rct_window *w) @@ -1986,7 +1986,7 @@ static void window_ride_main_unknown_14(rct_window *w) } /** - * + * * rct2: 0x006AECF6 */ static void window_ride_main_invalidate(rct_window *w) @@ -2036,7 +2036,7 @@ static void window_ride_main_invalidate(rct_window *w) window_ride_main_widgets[WIDX_CLOSE_LIGHT].type = WWT_IMGBTN; window_ride_main_widgets[WIDX_TEST_LIGHT].type = (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_NO_TEST_MODE) ? WWT_EMPTY : WWT_IMGBTN); window_ride_main_widgets[WIDX_OPEN_LIGHT].type = WWT_IMGBTN; - + height = 62; if (window_ride_main_widgets[WIDX_TEST_LIGHT].type != WWT_EMPTY) { window_ride_main_widgets[WIDX_TEST_LIGHT].top = height; @@ -2071,7 +2071,7 @@ static void window_ride_main_invalidate(rct_window *w) } /** - * + * * rct2: 0x006AF10A */ static rct_string_id window_ride_get_status_overall_view(rct_window *w, void *arguments) @@ -2090,7 +2090,7 @@ static rct_string_id window_ride_get_status_overall_view(rct_window *w, void *ar } /** - * + * * rct2: 0x006AEFEF */ static rct_string_id window_ride_get_status_vehicle(rct_window *w, void *arguments) @@ -2140,7 +2140,7 @@ static rct_string_id window_ride_get_status_vehicle(rct_window *w, void *argumen } /** - * + * * rct2: 0x006AEF65 */ static rct_string_id window_ride_get_status_station(rct_window *w, void *arguments) @@ -2188,7 +2188,7 @@ static rct_string_id window_ride_get_status_station(rct_window *w, void *argumen } /** - * + * * rct2: 0x006AEE73 */ static rct_string_id window_ride_get_status(rct_window *w, void *arguments) @@ -2205,7 +2205,7 @@ static rct_string_id window_ride_get_status(rct_window *w, void *arguments) } /** - * + * * rct2: 0x006AEE73 */ static void window_ride_main_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -2266,7 +2266,7 @@ static void window_ride_main_paint(rct_window *w, rct_drawpixelinfo *dpi) #pragma region Vehicle /** - * + * * rct2: 0x006B272D */ static void window_ride_vehicle_mouseup(rct_window *w, int widgetIndex) @@ -2295,7 +2295,7 @@ static void window_ride_vehicle_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006B2ABB */ static void window_ride_vehicle_resize(rct_window *w) @@ -2304,7 +2304,7 @@ static void window_ride_vehicle_resize(rct_window *w) } /** - * + * * rct2: 0x006B2748 */ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) @@ -2431,7 +2431,7 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi } /** - * + * * rct2: 0x006B2767 */ static void window_ride_vehicle_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -2460,7 +2460,7 @@ static void window_ride_vehicle_dropdown(rct_window *w, int widgetIndex, int dro } /** - * + * * rct2: 0x006B2AA1 */ static void window_ride_vehicle_update(rct_window *w) @@ -2471,7 +2471,7 @@ static void window_ride_vehicle_update(rct_window *w) } /** - * + * * rct2: 0x006B222C */ static void window_ride_vehicle_invalidate(rct_window *w) @@ -2481,7 +2481,7 @@ static void window_ride_vehicle_invalidate(rct_window *w) rct_ride_type *rideEntry; rct_string_id stringId; int carsPerTrain; - + colour_scheme_update(w); widgets = window_ride_page_widgets[w->page]; @@ -2545,7 +2545,7 @@ static void window_ride_vehicle_invalidate(rct_window *w) } /** - * + * * rct2: 0x006B23DC */ static void window_ride_vehicle_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -2608,7 +2608,7 @@ typedef struct { rct_vehichle_paintinfo _sprites_to_draw[144]; /** - * + * * rct2: 0x006B2502 */ static void window_ride_vehicle_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) @@ -2734,7 +2734,7 @@ static void window_ride_mode_tweak_set(rct_window *w, uint8 value) } /** - * + * * rct2: 0x006B11D5 */ static void window_ride_mode_tweak_increase(rct_window *w) @@ -2755,7 +2755,7 @@ static void window_ride_mode_tweak_increase(rct_window *w) } /** - * + * * rct2: 0x006B120A */ static void window_ride_mode_tweak_decrease(rct_window *w) @@ -2769,7 +2769,7 @@ static void window_ride_mode_tweak_decrease(rct_window *w) } /** - * + * * rct2: 0x006B1631 */ static void window_ride_mode_dropdown(rct_window *w, rct_widget *widget) @@ -2789,7 +2789,7 @@ static void window_ride_mode_dropdown(rct_window *w, rct_widget *widget) // Count number of available modes mode = availableModes; - numAvailableModes = -1; + numAvailableModes = -1; do { numAvailableModes++; } while (*(mode++) != 255); @@ -2828,7 +2828,7 @@ static void window_ride_mode_dropdown(rct_window *w, rct_widget *widget) } /** - * + * * rct2: 0x006B15C0 */ static void window_ride_load_dropdown(rct_window *w, rct_widget *widget) @@ -2857,7 +2857,7 @@ static void window_ride_load_dropdown(rct_window *w, rct_widget *widget) } /** - * + * * rct2: 0x006B10A7 */ static void window_ride_operating_mouseup(rct_window *w, int widgetIndex) @@ -2901,7 +2901,7 @@ static void window_ride_operating_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006B1715 */ static void window_ride_operating_resize(rct_window *w) @@ -2910,7 +2910,7 @@ static void window_ride_operating_resize(rct_window *w) } /** - * + * * rct2: 0x006B10F4 */ static void window_ride_operating_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) @@ -2965,7 +2965,7 @@ static void window_ride_operating_mousedown(int widgetIndex, rct_window *w, rct_ } /** - * + * * rct2: 0x006B1165 */ static void window_ride_operating_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -2992,7 +2992,7 @@ static void window_ride_operating_dropdown(rct_window *w, int widgetIndex, int d } /** - * + * * rct2: 0x006B178E */ static void window_ride_operating_update(rct_window *w) @@ -3011,7 +3011,7 @@ static void window_ride_operating_update(rct_window *w) } /** - * + * * rct2: 0x006B0B30 */ static void window_ride_operating_invalidate(rct_window *w) @@ -3067,7 +3067,7 @@ static void window_ride_operating_invalidate(rct_window *w) window_ride_operating_widgets[WIDX_OPERATE_NUMBER_OF_CIRCUITS_INCREASE].type = WWT_EMPTY; window_ride_operating_widgets[WIDX_OPERATE_NUMBER_OF_CIRCUITS_DECREASE].type = WWT_EMPTY; } - + // Leave if another vehicle arrives at station if ( ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION) && @@ -3219,7 +3219,7 @@ static void window_ride_operating_invalidate(rct_window *w) } /** - * + * * rct2: 0x006B1001 */ static void window_ride_operating_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -3255,7 +3255,7 @@ static void window_ride_operating_paint(rct_window *w, rct_drawpixelinfo *dpi) #pragma region Maintenance /** - * + * * rct2: 0x006B1AE4 */ static void window_ride_locate_mechanic(rct_window *w) @@ -3279,7 +3279,7 @@ static void window_ride_locate_mechanic(rct_window *w) } /** - * + * * rct2: 0x006B7D08 */ static void window_ride_maintenance_draw_bar(rct_window *w, rct_drawpixelinfo *dpi, int x, int y, int value, int unk) @@ -3298,7 +3298,7 @@ static void window_ride_maintenance_draw_bar(rct_window *w, rct_drawpixelinfo *d } /** - * + * * rct2: 0x006B1AAD */ static void window_ride_maintenance_mouseup(rct_window *w, int widgetIndex) @@ -3326,7 +3326,7 @@ static void window_ride_maintenance_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006B1D70 */ static void window_ride_maintenance_resize(rct_window *w) @@ -3335,7 +3335,7 @@ static void window_ride_maintenance_resize(rct_window *w) } /** - * + * * rct2: 0x006B1ACE */ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) @@ -3345,7 +3345,7 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc rct_widget *dropdownWidget; int i, j, num_items; uint8 breakdownReason; - + dropdownWidget = widget; ride = GET_RIDE(w->number); @@ -3402,7 +3402,7 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc DROPDOWN_FLAG_STAY_OPEN, num_items ); - + num_items = 1; breakdownReason = ride->breakdown_reason_pending; if (breakdownReason != BREAKDOWN_NONE && (ride->lifecycle_flags & RIDE_LIFECYCLE_BREAKDOWN_PENDING)) { @@ -3429,11 +3429,11 @@ static void window_ride_maintenance_mousedown(int widgetIndex, rct_window *w, rc } break; } - + } /** - * + * * rct2: 0x006B1AD9 */ static void window_ride_maintenance_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -3445,7 +3445,7 @@ static void window_ride_maintenance_dropdown(rct_window *w, int widgetIndex, int if (dropdownIndex == -1) return; - + ride = GET_RIDE(w->number); ride_type = gRideTypeList[ride->subtype]; @@ -3505,7 +3505,7 @@ static void window_ride_maintenance_dropdown(rct_window *w, int widgetIndex, int } /** - * + * * rct2: 0x006B1D37 */ static void window_ride_maintenance_update(rct_window *w) @@ -3524,7 +3524,7 @@ static void window_ride_maintenance_update(rct_window *w) } /** - * + * * rct2: 0x006B17C8 */ static void window_ride_maintenance_invalidate(rct_window *w) @@ -3560,7 +3560,7 @@ static void window_ride_maintenance_invalidate(rct_window *w) } /** - * + * * rct2: 0x006B1877 */ static void window_ride_maintenance_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -3657,7 +3657,7 @@ static void window_ride_maintenance_paint(rct_window *w, rct_drawpixelinfo *dpi) RCT2_GLOBAL(0x013CE952 + 2, uint32) = mechanicSprite->id; gfx_draw_string_left_wrapped(dpi, (void*)0x013CE952, x + 4, y, 280, stringId, 0); } - } + } } } } @@ -3725,7 +3725,7 @@ static void window_ride_set_track_colour_scheme(rct_window *w, int x, int y) } /** - * + * * rct2: 0x006B04FA */ static void window_ride_colour_close(rct_window *w) @@ -3743,7 +3743,7 @@ static void window_ride_colour_close(rct_window *w) } /** - * + * * rct2: 0x006B02A1 */ static void window_ride_colour_mouseup(rct_window *w, int widgetIndex) @@ -3771,7 +3771,7 @@ static void window_ride_colour_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006B0AB6 */ static void window_ride_colour_resize(rct_window *w) @@ -3780,7 +3780,7 @@ static void window_ride_colour_resize(rct_window *w) } /** - * + * * rct2: 0x006B02C6 */ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) @@ -3924,7 +3924,7 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid } /** - * + * * rct2: 0x006B0331 */ static void window_ride_colour_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -3973,7 +3973,7 @@ static void window_ride_colour_dropdown(rct_window *w, int widgetIndex, int drop } /** - * + * * rct2: 0x006B0A8F */ static void window_ride_colour_update(rct_window *w) @@ -3985,27 +3985,27 @@ static void window_ride_colour_update(rct_window *w) } /** - * + * * rct2: 0x006B04EC */ static void window_ride_colour_tooldown(rct_window *w, int widgetIndex, int x, int y) -{ +{ if (widgetIndex == WIDX_PAINT_INDIVIDUAL_AREA) window_ride_set_track_colour_scheme(w, x, y); } /** - * + * * rct2: 0x006B04F3 */ static void window_ride_colour_tooldrag(rct_window *w, int widgetIndex, int x, int y) -{ +{ if (widgetIndex == WIDX_PAINT_INDIVIDUAL_AREA) window_ride_set_track_colour_scheme(w, x, y); } /** - * + * * rct2: 0x006AFB36 */ static void window_ride_colour_invalidate(rct_window *w) @@ -4057,7 +4057,7 @@ static void window_ride_colour_invalidate(rct_window *w) window_ride_colour_widgets[WIDX_TRACK_COLOUR_SCHEME_DROPDOWN].type = WWT_EMPTY; window_ride_colour_widgets[WIDX_PAINT_INDIVIDUAL_AREA].type = WWT_EMPTY; } - + // Track main colour if (window_ride_has_track_colour(ride, 0)) { window_ride_colour_widgets[WIDX_TRACK_MAIN_COLOUR].type = WWT_COLORBTN; @@ -4073,7 +4073,7 @@ static void window_ride_colour_invalidate(rct_window *w) } else { window_ride_colour_widgets[WIDX_TRACK_ADDITIONAL_COLOUR].type = WWT_EMPTY; } - + // Track supports colour if (window_ride_has_track_colour(ride, 2) && ride->type != RIDE_TYPE_MAZE) { window_ride_colour_widgets[WIDX_TRACK_SUPPORT_COLOUR].type = WWT_COLORBTN; @@ -4112,7 +4112,7 @@ static void window_ride_colour_invalidate(rct_window *w) window_ride_colour_widgets[WIDX_VEHICLE_PREVIEW].type = WWT_SCROLL; window_ride_colour_widgets[WIDX_VEHICLE_MAIN_COLOUR].type = WWT_COLORBTN; window_ride_colour_widgets[WIDX_VEHICLE_MAIN_COLOUR].image = window_ride_get_colour_button_image(vehicleColour.main); - + uint8 trainLayout[16]; ride_entry_get_train_layout(ride->subtype, ride->num_cars_per_train, trainLayout); @@ -4180,7 +4180,7 @@ static void window_ride_colour_invalidate(rct_window *w) } /** - * + * * rct2: 0x006AFF3E */ static void window_ride_colour_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -4202,10 +4202,10 @@ static void window_ride_colour_paint(rct_window *w, rct_drawpixelinfo *dpi) widget = &window_ride_colour_widgets[WIDX_TRACK_PREVIEW]; if (widget->type != WWT_EMPTY) gfx_fill_rect(dpi, w->x + widget->left + 1, w->y + widget->top + 1, w->x + widget->right - 1, w->y + widget->bottom - 1, 12); - + trackColour = ride_get_track_colour(ride, *((uint16*)&w->var_494)); - // + // if (rideEntry->shop_item == 0xFF) { x = w->x + widget->left; y = w->y + widget->top; @@ -4277,7 +4277,7 @@ static void window_ride_colour_paint(rct_window *w, rct_drawpixelinfo *dpi) } /** - * + * * rct2: 0x006B0192 */ static void window_ride_colour_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) @@ -4360,7 +4360,7 @@ const uint8 MusicStyleOrder[] = { static uint8 window_ride_current_music_style_order[42]; /** - * + * * rct2: 0x006B215D */ static void window_ride_toggle_music(rct_window *w) @@ -4374,7 +4374,7 @@ static void window_ride_toggle_music(rct_window *w) } /** - * + * * rct2: 0x006B1ED7 */ static void window_ride_music_mouseup(rct_window *w, int widgetIndex) @@ -4402,7 +4402,7 @@ static void window_ride_music_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006AF4A2 */ static void window_ride_music_resize(rct_window *w) @@ -4412,7 +4412,7 @@ static void window_ride_music_resize(rct_window *w) } /** - * + * * rct2: 0x006B1EFC */ static void window_ride_music_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) @@ -4428,7 +4428,7 @@ static void window_ride_music_mousedown(int widgetIndex, rct_window *w, rct_widg int numItems = 0; if (ride->type == RIDE_TYPE_MERRY_GO_ROUND) { - window_ride_current_music_style_order[numItems++] = MUSIC_STYLE_FAIRGROUND_ORGAN; + window_ride_current_music_style_order[numItems++] = MUSIC_STYLE_FAIRGROUND_ORGAN; } else { for (i = 0; i < countof(MusicStyleOrder); i++) window_ride_current_music_style_order[numItems++] = MusicStyleOrder[i]; @@ -4462,7 +4462,7 @@ static void window_ride_music_mousedown(int widgetIndex, rct_window *w, rct_widg } /** - * + * * rct2: 0x006B1F03 */ static void window_ride_music_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -4480,7 +4480,7 @@ static void window_ride_music_dropdown(rct_window *w, int widgetIndex, int dropd } /** - * + * * rct2: 0x006B2198 */ static void window_ride_music_update(rct_window *w) @@ -4491,7 +4491,7 @@ static void window_ride_music_update(rct_window *w) } /** - * + * * rct2: 0x006B1DEA */ static void window_ride_music_invalidate(rct_window *w) @@ -4533,7 +4533,7 @@ static void window_ride_music_invalidate(rct_window *w) } /** - * + * * rct2: 0x006B1ECC */ static void window_ride_music_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -4591,7 +4591,7 @@ static void setup_scenery_selection(rct_window* w){ } /** - * + * * rct2: 0x006D3026 */ static void window_ride_measurements_design_reset() @@ -4600,7 +4600,7 @@ static void window_ride_measurements_design_reset() } /** - * + * * rct2: 0x006D303D */ static void window_ride_measurements_design_select_nearby_scenery() @@ -4609,7 +4609,7 @@ static void window_ride_measurements_design_select_nearby_scenery() } /** - * + * * rct2: 0x006AD4DA */ static void window_ride_measurements_design_cancel() @@ -4619,7 +4619,7 @@ static void window_ride_measurements_design_cancel() } /** - * + * * rct2: 0x006AD4CD */ static void window_ride_measurements_design_save(rct_window *w) @@ -4630,7 +4630,7 @@ static void window_ride_measurements_design_save(rct_window *w) } /** - * + * * rct2: 0x006AD4DA */ static void window_ride_measurements_close(rct_window *w) @@ -4639,7 +4639,7 @@ static void window_ride_measurements_close(rct_window *w) } /** - * + * * rct2: 0x006AD478 */ static void window_ride_measurements_mouseup(rct_window *w, int widgetIndex) @@ -4676,7 +4676,7 @@ static void window_ride_measurements_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006AD564 */ static void window_ride_measurements_resize(rct_window *w) @@ -4685,7 +4685,7 @@ static void window_ride_measurements_resize(rct_window *w) } /** - * + * * rct2: 0x006AD4AB */ static void window_ride_measurements_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) @@ -4712,7 +4712,7 @@ static void window_ride_measurements_mousedown(int widgetIndex, rct_window *w, r } /** - * + * * rct2: 0x006AD4B2 */ static void window_ride_measurements_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -4730,7 +4730,7 @@ static void window_ride_measurements_dropdown(rct_window *w, int widgetIndex, in } /** - * + * * rct2: 0x006AD5DD */ static void window_ride_measurements_update(rct_window *w) @@ -4741,7 +4741,7 @@ static void window_ride_measurements_update(rct_window *w) } /** - * + * * rct2: 0x006D2AE7 */ static void window_ride_measurements_tooldown(rct_window *w, int widgetIndex, int x, int y) @@ -4762,7 +4762,7 @@ static void window_ride_measurements_tooldown(rct_window *w, int widgetIndex, in } /** - * + * * rct2: 0x006AD4DA */ static void window_ride_measurements_toolabort(rct_window *w, int widgetIndex) @@ -4771,7 +4771,7 @@ static void window_ride_measurements_toolabort(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006ACDBC */ static void window_ride_measurements_invalidate(rct_window *w) @@ -4822,7 +4822,7 @@ static void window_ride_measurements_invalidate(rct_window *w) } /** - * + * * rct2: 0x006ACF07 */ static void window_ride_measurements_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -4849,7 +4849,7 @@ static void window_ride_measurements_paint(rct_window *w, rct_drawpixelinfo *dpi gfx_fill_rect_inset(dpi, x, y, w->x + 312, y + 1, w->colours[1], 0x20); } else { ride = GET_RIDE(w->number); - + x = w->x + window_ride_measurements_widgets[WIDX_PAGE_BACKGROUND].left + 4; y = w->y + window_ride_measurements_widgets[WIDX_PAGE_BACKGROUND].top + 4; @@ -5016,7 +5016,7 @@ enum { }; /** - * + * * rct2: 0x006AE8A6 */ static void window_ride_set_graph(rct_window *w, int type) @@ -5031,7 +5031,7 @@ static void window_ride_set_graph(rct_window *w, int type) } /** - * + * * rct2: 0x006AE85D */ static void window_ride_graphs_mouseup(rct_window *w, int widgetIndex) @@ -5056,7 +5056,7 @@ static void window_ride_graphs_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006AE8DA */ static void window_ride_graphs_resize(rct_window *w) @@ -5065,7 +5065,7 @@ static void window_ride_graphs_resize(rct_window *w) } /** - * + * * rct2: 0x006AE878 */ static void window_ride_graphs_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) @@ -5087,7 +5087,7 @@ static void window_ride_graphs_mousedown(int widgetIndex, rct_window *w, rct_wid } /** - * + * * rct2: 0x006AE95D */ static void window_ride_graphs_update(rct_window *w) @@ -5116,7 +5116,7 @@ static void window_ride_graphs_update(rct_window *w) } /** - * + * * rct2: 0x006AEA75 */ static void window_ride_graphs_scrollgetheight(rct_window *w, int scrollIndex, int *width, int *height) @@ -5135,7 +5135,7 @@ static void window_ride_graphs_scrollgetheight(rct_window *w, int scrollIndex, i } /** - * + * * rct2: 0x006AE953 */ static void window_ride_graphs_15(rct_window *w, int scrollIndex, int scrollAreaType) @@ -5144,7 +5144,7 @@ static void window_ride_graphs_15(rct_window *w, int scrollIndex, int scrollArea } /** - * + * * rct2: 0x006AEA05 */ static void window_ride_graphs_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) @@ -5169,7 +5169,7 @@ static void window_ride_graphs_tooltip(rct_window* w, int widgetIndex, rct_strin } /** - * + * * rct2: 0x006AE372 */ static void window_ride_graphs_invalidate(rct_window *w) @@ -5199,7 +5199,7 @@ static void window_ride_graphs_invalidate(rct_window *w) w->pressed_widgets &= ~(1 << WIDX_GRAPH_VERTICAL); w->pressed_widgets &= ~(1 << WIDX_GRAPH_LATERAL); w->pressed_widgets |= (1LL << (WIDX_GRAPH_VELOCITY + (w->list_information_type & 0xFF))); - + // Hide graph buttons that are not applicable if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_G_FORCES)) { window_ride_graphs_widgets[WIDX_GRAPH_VERTICAL].type = WWT_DROPDOWN_BUTTON; @@ -5231,7 +5231,7 @@ static void window_ride_graphs_invalidate(rct_window *w) } /** - * + * * rct2: 0x006AE4BC */ static void window_ride_graphs_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -5241,7 +5241,7 @@ static void window_ride_graphs_paint(rct_window *w, rct_drawpixelinfo *dpi) } /** - * + * * rct2: 0x006AE4C7 */ static void window_ride_graphs_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) @@ -5359,7 +5359,7 @@ static void window_ride_graphs_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi #pragma region Income /** - * + * * rct2: 0x006ADEFD */ static void window_ride_income_toggle_primary_price(rct_window *w) @@ -5371,7 +5371,7 @@ static void window_ride_income_toggle_primary_price(rct_window *w) ride = GET_RIDE(w->number); ride_type = gRideTypeList[ride->subtype]; - + if (ride->type == RIDE_TYPE_TOILETS) { shop_item = 0x1F; } @@ -5406,7 +5406,7 @@ static void window_ride_income_toggle_primary_price(rct_window *w) } /** - * + * * rct2: 0x006AE06E */ static void window_ride_income_toggle_secondary_price(rct_window *w) @@ -5418,7 +5418,7 @@ static void window_ride_income_toggle_secondary_price(rct_window *w) ride = GET_RIDE(w->number); ride_type = gRideTypeList[ride->subtype]; - + shop_item = ride_type->shop_item_secondary; if (shop_item == 0xFF) shop_item = RCT2_GLOBAL(0x0097D7CB + (ride->type * 4), uint8); @@ -5449,7 +5449,7 @@ static void window_ride_income_toggle_secondary_price(rct_window *w) } /** - * + * * rct2: 0x006AE1E4 */ static void window_ride_income_increase_primary_price(rct_window *w) @@ -5459,7 +5459,7 @@ static void window_ride_income_increase_primary_price(rct_window *w) ride = GET_RIDE(w->number); ride_type = gRideTypeList[ride->subtype]; - + if ((RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_FREE_ENTRY) == 0) { if (ride->type != RIDE_TYPE_TOILETS && ride_type->shop_item == 0xFF) { if (!gConfigCheat.unlock_all_prices) @@ -5474,7 +5474,7 @@ static void window_ride_income_increase_primary_price(rct_window *w) } /** - * + * * rct2: 0x006AE237 */ static void window_ride_income_decrease_primary_price(rct_window *w) @@ -5499,7 +5499,7 @@ static void window_ride_income_decrease_primary_price(rct_window *w) } /** - * + * * rct2: 0x006AE269 */ static void window_ride_income_increase_secondary_price(rct_window *w) @@ -5509,7 +5509,7 @@ static void window_ride_income_increase_secondary_price(rct_window *w) ride = GET_RIDE(w->number); ride_type = gRideTypeList[ride->subtype]; - + money16 price = ride->price_secondary; if (price < MONEY(20, 00)) price++; @@ -5518,7 +5518,7 @@ static void window_ride_income_increase_secondary_price(rct_window *w) } /** - * + * * rct2: 0x006AE28D */ static void window_ride_income_decrease_secondary_price(rct_window *w) @@ -5528,7 +5528,7 @@ static void window_ride_income_decrease_secondary_price(rct_window *w) ride = GET_RIDE(w->number); ride_type = gRideTypeList[ride->subtype]; - + money16 price = ride->price_secondary; if (price > MONEY(0, 00)) price--; @@ -5537,7 +5537,7 @@ static void window_ride_income_decrease_secondary_price(rct_window *w) } /** - * + * * rct2: 0x006ADEA9 */ static void window_ride_income_mouseup(rct_window *w, int widgetIndex) @@ -5568,7 +5568,7 @@ static void window_ride_income_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006AE2F8 */ static void window_ride_income_resize(rct_window *w) @@ -5577,7 +5577,7 @@ static void window_ride_income_resize(rct_window *w) } /** - * + * * rct2: 0x006ADED4 */ static void window_ride_income_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) @@ -5599,7 +5599,7 @@ static void window_ride_income_mousedown(int widgetIndex, rct_window *w, rct_wid } /** - * + * * rct2: 0x006AE2BF */ static void window_ride_income_update(rct_window *w) @@ -5618,7 +5618,7 @@ static void window_ride_income_update(rct_window *w) } /** - * + * * rct2: 0x006ADAA3 */ static void window_ride_income_invalidate(rct_window *w) @@ -5658,7 +5658,7 @@ static void window_ride_income_invalidate(rct_window *w) window_ride_income_widgets[WIDX_PRIMARY_PRICE_LABEL].image = STR_RIDE_INCOME_ADMISSION_PRICE; window_ride_income_widgets[WIDX_SECONDARY_PRICE_LABEL].image = STR_ON_RIDE_PHOTO_PRICE; window_ride_income_widgets[WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK].type = WWT_EMPTY; - + window_ride_income_widgets[WIDX_PRIMARY_PRICE].image = 1429; RCT2_GLOBAL(0x013CE952 + 6, money32) = ride->price; if (ride->price == 0) @@ -5735,7 +5735,7 @@ static void window_ride_income_invalidate(rct_window *w) } /** - * + * * rct2: 0x006ADCE5 */ static void window_ride_income_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -5822,7 +5822,7 @@ static void window_ride_income_paint(rct_window *w, rct_drawpixelinfo *dpi) #pragma region Customer /** - * + * * rct2: 0x006AD986 */ static void window_ride_customer_mouseup(rct_window *w, int widgetIndex) @@ -5856,7 +5856,7 @@ static void window_ride_customer_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006ADA29 */ static void window_ride_customer_resize(rct_window *w) @@ -5866,7 +5866,7 @@ static void window_ride_customer_resize(rct_window *w) } /** - * + * * rct2: 0x006AD9DD */ static void window_ride_customer_update(rct_window *w) @@ -5888,7 +5888,7 @@ static void window_ride_customer_update(rct_window *w) } /** - * + * * rct2: 0x006AD5F8 */ static void window_ride_customer_invalidate(rct_window *w) @@ -5923,7 +5923,7 @@ static void window_ride_customer_invalidate(rct_window *w) } /** - * + * * rct2: 0x006AD6CD */ static void window_ride_customer_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -5985,7 +5985,7 @@ static void window_ride_customer_paint(rct_window *w, rct_drawpixelinfo *dpi) gfx_draw_string_left(dpi, STR_ITEMS_SOLD, (void*)0x013CE952, 0, x, y); y += 10; } - + // Secondary shop items sold / on-ride photos sold shopItem = ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO ? RCT2_GLOBAL(0x0097D7CB + (ride->type * 4), uint8) : diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 6257ecf9ad..34d4cd9b2e 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1752,7 +1752,7 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) sub_6C84CE(); return; } - + if (gotoStartPlacementMode) { z &= 0xFFF0; _currentTrackBeginZ = z; @@ -2005,7 +2005,7 @@ static void window_ride_construction_toolupdate(rct_window* w, int widgetIndex, } /** - * + * * rct2: 0x006C8248 */ static void window_ride_construction_tooldown(rct_window* w, int widgetIndex, int x, int y) @@ -2065,7 +2065,7 @@ static void window_ride_construction_paint(rct_window *w, rct_drawpixelinfo *dpi int x, y, width, height; window_draw_widgets(w, dpi); - + widget = &window_ride_construction_widgets[WIDX_CONSTRUCT]; if (widget->type == WWT_EMPTY) return; @@ -2309,7 +2309,7 @@ static void sub_6CBCE2( } /** - * + * * rct2: 0x006C84CE */ void sub_6C84CE() @@ -2338,11 +2338,11 @@ void sub_6C84CE() } window_ride_construction_update_possible_ride_configurations(); - window_ride_construction_update_widgets(w); + window_ride_construction_update_widgets(w); } /** - * + * * rct2: 0x006CA2DF * bh: trackRotation (out) * dl: ??? (out) @@ -2367,7 +2367,7 @@ static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int } /** - * + * * rct2: 0x006C6A77 */ static void window_ride_construction_update_enabled_track_pieces() @@ -2381,7 +2381,7 @@ static void window_ride_construction_update_enabled_track_pieces() } /** - * + * * rct2: 0x006CA162 */ money32 sub_6CA162(int rideIndex, int trackType, int trackDirection, int edxRS16, int x, int y, int z) @@ -2416,7 +2416,7 @@ money32 sub_6CA162(int rideIndex, int trackType, int trackDirection, int edxRS16 z += ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? RCT2_GLOBAL(0x009972BD + (trackType * 10), uint16) : RCT2_GLOBAL(0x009968BD + (trackType * 10), uint16); - + RCT2_GLOBAL(0x00F440C9, uint16) = z; RCT2_GLOBAL(0x00F440CB, uint8) = trackDirection; _currentTrackSelectionFlags |= 2; @@ -2429,7 +2429,7 @@ money32 sub_6CA162(int rideIndex, int trackType, int trackDirection, int edxRS16 } /** - * + * * rct2: 0x006C94D8 */ void sub_6C94D8() @@ -2521,7 +2521,7 @@ void sub_6C94D8() } /** - * + * * rct2: 0x006C84E2 */ static void window_ride_construction_update_map_selection() @@ -2561,7 +2561,7 @@ static void window_ride_construction_update_map_selection() } /** - * + * * rct2: 0x006C8648 */ static void window_ride_construction_update_possible_ride_configurations() @@ -2634,7 +2634,7 @@ static void window_ride_construction_update_possible_ride_configurations() if (bank == TRACK_BANK_UPSIDE_DOWN && bank != _previousTrackBankEnd) continue; - + _currentPossibleRideConfigurations[currentPossibleRideConfigurationIndex] = trackType; RCT2_GLOBAL(0x00F4409C, uint32) |= (1 << currentPossibleRideConfigurationIndex); if ( @@ -2652,7 +2652,7 @@ static void window_ride_construction_update_possible_ride_configurations() } /** - * + * * rct2: 0x006C87F5 */ static void window_ride_construction_update_widgets(rct_window *w) @@ -2671,7 +2671,7 @@ static void window_ride_construction_update_widgets(rct_window *w) window_ride_construction_widgets[WIDX_ENTRANCE].type = WWT_DROPDOWN_BUTTON; window_ride_construction_widgets[WIDX_EXIT].type = WWT_DROPDOWN_BUTTON; } - + if (_numCurrentPossibleSpecialTrackPieces == 0) { window_ride_construction_widgets[WIDX_SPECIAL_TRACK_DROPDOWN].type = WWT_EMPTY; } else { @@ -3146,7 +3146,7 @@ static void window_ride_construction_select_map_tiles(rct_ride *ride, int trackT } /** - * + * * rct2: 0x006C776D */ static void window_ride_construction_show_special_track_dropdown(rct_window *w, rct_widget *widget) @@ -3179,7 +3179,7 @@ static void window_ride_construction_show_special_track_dropdown(rct_window *w, } /** - * + * * rct2: 0x006C7630 */ static void ride_selected_track_set_seat_rotation(int seatRotation) @@ -3193,7 +3193,7 @@ static void ride_selected_track_set_seat_rotation(int seatRotation) } /** - * + * * rct2: 0x006C7502 */ static void loc_6C7502(int al) @@ -3209,7 +3209,7 @@ static void loc_6C7502(int al) } /** - * + * * rct2: 0x006C76E9 */ static void ride_construction_set_brakes_speed(int brakesSpeed) @@ -3235,7 +3235,7 @@ static void ride_construction_set_brakes_speed(int brakesSpeed) } /** - * + * * rct2: 0x006CC6A8 */ void ride_construction_toolupdate_construct(int screenX, int screenY) @@ -3251,7 +3251,7 @@ void ride_construction_toolupdate_construct(int screenX, int screenY) map_invalidate_map_selection_tiles(); return; } - + z = RCT2_GLOBAL(0x00F44163, uint16); if (z == 0) z = map_get_highest_z(x >> 5, y >> 5); @@ -3276,7 +3276,7 @@ void ride_construction_toolupdate_construct(int screenX, int screenY) } _currentTrackPieceType = trackType; ride = GET_RIDE(_currentRideIndex); - + // Re-using this other code, very slight difference from original // - Original code checks for MSB mask instead of 255 on trackPart->var_00 // - Original code checks this first as its already set origin tile, probably just a micro optimisation @@ -3374,7 +3374,7 @@ void ride_construction_toolupdate_construct(int screenX, int screenY) } /** - * + * * rct2: 0x006CD354 */ void ride_construction_toolupdate_entrance_exit(int screenX, int screenY) @@ -3419,7 +3419,7 @@ void ride_construction_toolupdate_entrance_exit(int screenX, int screenY) } /** - * + * * rct2: 0x006CCA73 */ void ride_construction_tooldown_construct(int screenX, int screenY) @@ -3494,15 +3494,15 @@ void ride_construction_tooldown_construct(int screenX, int screenY) break; RCT2_GLOBAL(0x009A8C29, uint8) |= 1; - + RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; RCT2_GLOBAL(0x00F44074, money32) = game_do_command( - _currentTrackBeginX, - GAME_COMMAND_FLAG_APPLY | (4 << 8), - _currentTrackBeginY, - _currentRideIndex, - GAME_COMMAND_SET_MAZE_TRACK, - _currentTrackBeginZ, + _currentTrackBeginX, + GAME_COMMAND_FLAG_APPLY | (4 << 8), + _currentTrackBeginY, + _currentRideIndex, + GAME_COMMAND_SET_MAZE_TRACK, + _currentTrackBeginZ, 0); RCT2_GLOBAL(0x009A8C29, uint8) &= ~1; @@ -3580,7 +3580,7 @@ void ride_construction_tooldown_construct(int screenX, int screenY) int saveCurrentTrackBankEnd = _currentTrackBankEnd; int saveCurrentTrackCovered = _currentTrackCovered; int saveCurrentTrackLiftHill = _currentTrackLiftHill; - + sub_6CC3FB(_currentRideIndex); _currentTrackPieceDirection = saveTrackDirection; @@ -3615,7 +3615,7 @@ void ride_construction_tooldown_construct(int screenX, int screenY) } /** - * + * * rct2: 0x006CCA73 */ static void ride_construction_tooldown_entrance_exit(int screenX, int screenY) diff --git a/src/windows/ride_list.c b/src/windows/ride_list.c index 835a87eec7..27be37c6cb 100644 --- a/src/windows/ride_list.c +++ b/src/windows/ride_list.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -135,7 +135,7 @@ static void window_ride_list_close_all(rct_window *w); static void window_ride_list_open_all(rct_window *w); /** - * + * * rct2: 0x006B30BC */ void window_ride_list_open() @@ -173,7 +173,7 @@ void window_ride_list_open() } /** - * + * * rct2: 0x006B3511 */ static void window_ride_list_mouseup(rct_window *w, int widgetIndex) @@ -211,7 +211,7 @@ static void window_ride_list_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x006B38A7 */ static void window_ride_list_resize(rct_window *w) @@ -231,7 +231,7 @@ static void window_ride_list_resize(rct_window *w) } /** - * + * * rct2: 0x006B3532 */ static void window_ride_list_mousedown(int widgetIndex, rct_window*w, rct_widget* widget) @@ -272,7 +272,7 @@ static void window_ride_list_mousedown(int widgetIndex, rct_window*w, rct_widget } /** - * + * * rct2: 0x006B3547 */ static void window_ride_list_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) @@ -292,7 +292,7 @@ static void window_ride_list_dropdown(rct_window *w, int widgetIndex, int dropdo } /** - * + * * rct2: 0x006B386B */ static void window_ride_list_update(rct_window *w) @@ -304,7 +304,7 @@ static void window_ride_list_update(rct_window *w) } /** - * + * * rct2: 0x006B35A1 */ static void window_ride_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height) @@ -327,7 +327,7 @@ static void window_ride_list_scrollgetsize(rct_window *w, int scrollIndex, int * } /** - * + * * rct2: 0x006B361F */ static void window_ride_list_scrollmousedown(rct_window *w, int scrollIndex, int x, int y) @@ -343,7 +343,7 @@ static void window_ride_list_scrollmousedown(rct_window *w, int scrollIndex, int } /** - * + * * rct2: 0x006B35EF */ static void window_ride_list_scrollmouseover(rct_window *w, int scrollIndex, int x, int y) @@ -359,7 +359,7 @@ static void window_ride_list_scrollmouseover(rct_window *w, int scrollIndex, int } /** - * + * * rct2: 0x006B3861 */ static void window_ride_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) @@ -368,7 +368,7 @@ static void window_ride_list_tooltip(rct_window* w, int widgetIndex, rct_string_ } /** - * + * * rct2: 0x006B3182 */ static void window_ride_list_invalidate(rct_window *w) @@ -407,7 +407,7 @@ static void window_ride_list_invalidate(rct_window *w) w->widgets[WIDX_OPEN_CLOSE_ALL].type = WWT_EMPTY; w->widgets[WIDX_CLOSE_LIGHT].type = WWT_IMGBTN; w->widgets[WIDX_OPEN_LIGHT].type = WWT_IMGBTN; - + sint8 allClosed = -1; sint8 allOpen = -1; FOR_ALL_RIDES(i, ride) { @@ -433,7 +433,7 @@ static void window_ride_list_invalidate(rct_window *w) } /** - * + * * rct2: 0x006B3235 */ static void window_ride_list_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -443,7 +443,7 @@ static void window_ride_list_paint(rct_window *w, rct_drawpixelinfo *dpi) } /** - * + * * rct2: 0x006B3240 */ static void window_ride_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) @@ -462,7 +462,7 @@ static void window_ride_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, gfx_fill_rect(dpi, 0, y, 800, y + 9, 0x02000031); format = 1193; } - + // Get ride ride = &g_ride_list[w->list_item_positions[i]]; @@ -543,7 +543,7 @@ static void window_ride_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, } /** - * + * * rct2: 0x006B38EA */ static void window_ride_list_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w) @@ -572,7 +572,7 @@ static void window_ride_list_draw_tab_images(rct_drawpixelinfo *dpi, rct_window /** - * + * * rct2: 0x006B39A8 */ static void window_ride_list_refresh_list(rct_window *w) @@ -592,7 +592,7 @@ static void window_ride_list_refresh_list(rct_window *w) countB++; } } - + if (countB != 0) window_invalidate(w); diff --git a/src/windows/save_prompt.c b/src/windows/save_prompt.c index 03e0b42ce8..020630df44 100644 --- a/src/windows/save_prompt.c +++ b/src/windows/save_prompt.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/windows/scenery.c b/src/windows/scenery.c index 1e7760c359..d189f02e41 100644 --- a/src/windows/scenery.c +++ b/src/windows/scenery.c @@ -256,7 +256,7 @@ void init_scenery() } } - // small scenery + // small scenery for (uint16 sceneryId = 0; sceneryId < 0xFC; sceneryId++) { if ((uint32)g_smallSceneryEntries[sceneryId] == 0xFFFFFFFF) continue; @@ -722,7 +722,7 @@ static void window_scenery_update(rct_window *w) } window_invalidate(w); - + if (!window_scenery_is_scenery_tool_active()){ window_close(w); return; @@ -861,7 +861,7 @@ void window_scenery_invalidate(rct_window *w) uint32 titleStringId = 1813; if (tabIndex < 19) titleStringId = g_scenerySetEntries[tabIndex]->name; - + window_scenery_widgets[WIDX_SCENERY_TITLE].image = titleStringId; w->pressed_widgets = (((uint32)w->pressed_widgets & 0xFF00000F) | (1 << (tabIndex + 4))) & 0xBBFFFFFF; @@ -871,10 +871,10 @@ void window_scenery_invalidate(rct_window *w) if (window_scenery_is_build_cluster_tool_on == 1) w->pressed_widgets |= (1 << WIDX_SCENERY_BUILD_CLUSTER_BUTTON); - + window_scenery_widgets[WIDX_SCENERY_ROTATE_OBJECTS_BUTTON].type = WWT_EMPTY; window_scenery_widgets[WIDX_SCENERY_BUILD_CLUSTER_BUTTON].type = WWT_EMPTY; - + sint16 tabSelectedSceneryId = window_scenery_selected_scenery_by_tab[tabIndex]; if (tabSelectedSceneryId != -1) { if (tabSelectedSceneryId < 0x100) { @@ -901,7 +901,7 @@ void window_scenery_invalidate(rct_window *w) window_scenery_widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WWT_EMPTY; window_scenery_widgets[WIDX_SCENERY_SECONDARY_COLOUR_BUTTON].type = WWT_EMPTY; window_scenery_widgets[WIDX_SCENERY_TERTIARY_COLOUR_BUTTON].type = WWT_EMPTY; - + if (window_scenery_is_repaint_scenery_tool_on & 1) { // repaint colored scenery tool is on window_scenery_widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WWT_COLORBTN; window_scenery_widgets[WIDX_SCENERY_SECONDARY_COLOUR_BUTTON].type = WWT_COLORBTN; @@ -912,7 +912,7 @@ void window_scenery_invalidate(rct_window *w) if (tabSelectedSceneryId >= 0x400) { sceneryEntry = g_bannerSceneryEntries[tabSelectedSceneryId - 0x400]; - + if (sceneryEntry->banner.flags & 1) window_scenery_widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WWT_COLORBTN; } else if (tabSelectedSceneryId >= 0x300) { @@ -984,12 +984,12 @@ void window_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi) uint16 tabIndex = window_scenery_active_tab_index; uint16 selectedWidgetId = tabIndex + 4; uint32 imageId = ((w->colours[1] << 19) | window_scenery_widgets[selectedWidgetId].image) + 1ul; - + gfx_draw_sprite(dpi, imageId, w->x + window_scenery_widgets[selectedWidgetId].left, w->y + window_scenery_widgets[selectedWidgetId].top, selectedWidgetId); - + sint16 selectedSceneryEntryId = w->scenery.selected_scenery_id; if (selectedSceneryEntryId == -1) { if (window_scenery_is_repaint_scenery_tool_on & 1) // repaint colored scenery tool is on @@ -1051,10 +1051,10 @@ void window_scenery_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrol int sceneryTabItemIndex = 0; sint16 currentSceneryGlobalId = -1; sint16 left = 0, top = 0; - + while ((currentSceneryGlobalId = window_scenery_tab_entries[tabIndex][sceneryTabItemIndex]) != -1) { uint16 tabSelectedSceneryId = window_scenery_selected_scenery_by_tab[tabIndex]; - + if (window_scenery_is_repaint_scenery_tool_on == 1) { if (w->scenery.selected_scenery_id == currentSceneryGlobalId) { @@ -1117,8 +1117,8 @@ void window_scenery_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrol imageId &= 0xDFFFFFFF; tertiaryColour = window_scenery_tertiary_colour; } - - } + + } gfx_draw_sprite(clipdpi, imageId, 0x2F, (sceneryEntry->wall.height * 2) + 0x32, tertiaryColour); @@ -1175,7 +1175,7 @@ void window_scenery_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrol rct2_free(clipdpi); } } - + left += SCENERY_BUTTON_WIDTH; if (left >= 594) { top += SCENERY_BUTTON_HEIGHT; diff --git a/src/windows/server_list.c b/src/windows/server_list.c index 8d109d1d3a..8cd531f841 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -215,7 +215,7 @@ static void window_server_list_scroll_mousedown(rct_window *w, int scrollIndex, if (serverIndex >= _numSavedServers) return; char *serverAddress = _savedServers[serverIndex].address; - + switch (_hoverButtonIndex) { case WIDX_LIST_REMOVE: remove_saved_server(serverIndex); @@ -425,7 +425,7 @@ static void server_list_load_saved_servers() // Read number of saved servers SDL_RWread(file, &_numSavedServers, sizeof(uint32), 1); _savedServers = malloc(_numSavedServers * sizeof(saved_server)); - + // Load each saved server for (int i = 0; i < _numSavedServers; i++) { saved_server *serverInfo = &_savedServers[i]; diff --git a/src/windows/shortcut_keys.c b/src/windows/shortcut_keys.c index 02d2cd295d..5328e522d5 100644 --- a/src/windows/shortcut_keys.c +++ b/src/windows/shortcut_keys.c @@ -228,20 +228,20 @@ static void window_shortcut_scrollmouseover(rct_window *w, int scrollIndex, int int selected_item = y / 10; if (selected_item >= w->no_list_items) return; - + w->selected_list_item = selected_item; window_invalidate(w); } /** - * + * * rct2: 0x006E38E6 */ static void window_shortcut_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, RCT2_ADDRESS(0x0141FC48,uint8)[w->colours[1] * 8]); - + for (int i = 0; i < w->no_list_items; ++i) { int y = i * 10; if (y > dpi->y + dpi->height) diff --git a/src/windows/sign.c b/src/windows/sign.c index 9c2a56dfe5..d1e288a816 100644 --- a/src/windows/sign.c +++ b/src/windows/sign.c @@ -248,8 +248,8 @@ static void window_sign_mouseup(rct_window *w, int widgetIndex) 1 | ((map_element->type&0x3) << 8), y, map_element->base_height | ((map_element->properties.scenerymultiple.type >> 10) << 8), - GAME_COMMAND_REMOVE_LARGE_SCENERY, - 0, + GAME_COMMAND_REMOVE_LARGE_SCENERY, + 0, 0); break; case WIDX_SIGN_TEXT: @@ -451,7 +451,7 @@ void window_sign_small_open(rct_windownumber number){ int view_x = gBanners[w->number].x << 5; int view_y = gBanners[w->number].y << 5; - + rct_map_element* map_element = map_get_first_element_at(view_x / 32, view_y / 32); while (1){ diff --git a/src/windows/staff.c b/src/windows/staff.c index 4b306cf126..d47741ee1c 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -70,7 +70,7 @@ enum WINDOW_STAFF_WIDGET_IDX { WIDX_COSTUME_BTN, }; -rct_widget window_staff_overview_widgets[] = { +rct_widget window_staff_overview_widgets[] = { { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, 0x0FFFFFFFF, STR_NONE }, // Panel / Background { WWT_CAPTION, 0, 1, WW - 2, 1, 14, 0x361, STR_WINDOW_TITLE_TIP }, // Title { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // Close x button @@ -90,7 +90,7 @@ rct_widget window_staff_overview_widgets[] = { }; //0x9AF910 -rct_widget window_staff_options_widgets[] = { +rct_widget window_staff_options_widgets[] = { { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, 0x0FFFFFFFF, STR_NONE }, // Panel / Background { WWT_CAPTION, 0, 1, WW - 2, 1, 14, 0x361, STR_WINDOW_TITLE_TIP }, // Title { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // Close x button @@ -109,7 +109,7 @@ rct_widget window_staff_options_widgets[] = { }; //0x9AF9F4 -rct_widget window_staff_stats_widgets[] = { +rct_widget window_staff_stats_widgets[] = { { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, 0x0FFFFFFFF, STR_NONE }, // Panel / Background { WWT_CAPTION, 0, 1, WW - 2, 1, 14, 0x361, STR_WINDOW_TITLE_TIP }, // Title { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // Close x button @@ -388,16 +388,16 @@ void window_staff_set_page(rct_window* w, int page) if(w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber) && w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass)) tool_cancel(); - + } - + int listen = 0; if (page == WINDOW_STAFF_OVERVIEW && w->page == WINDOW_STAFF_OVERVIEW && w->viewport){ if (!(w->viewport->flags & VIEWPORT_FLAG_SOUND_ON)) listen = 1; } - + w->page = page; w->frame_no = 0; @@ -514,7 +514,7 @@ void window_staff_overview_resize(rct_window *w) window_staff_viewport_init(w); } -/** +/** * Handle the dropdown of patrol button. * rct2: 0x006BDF98 */ @@ -575,7 +575,7 @@ void window_staff_overview_dropdown(rct_window *w, int widgetIndex, int dropdown /** * Update the animation frame of the tab icon. - * rct2: 0x6BE602 + * rct2: 0x6BE602 */ void window_staff_overview_update(rct_window* w) { @@ -646,10 +646,10 @@ void window_staff_stats_mouseup(rct_window *w, int widgetIndex) void window_staff_stats_resize(rct_window *w) { w->min_width = 190; - w->max_width = 190; + w->max_width = 190; w->min_height = 119; w->max_height = 119; - + if (w->width < w->min_width) { w->width = w->min_width; window_invalidate(w); @@ -805,7 +805,7 @@ void window_staff_overview_invalidate(rct_window *w) } w->pressed_widgets |= 1ULL << (w->page + WIDX_TAB_1); - + rct_peep* peep = GET_PEEP(w->number); RCT2_GLOBAL(0x13CE952, uint16) = peep->name_string_idx; @@ -1073,7 +1073,7 @@ void window_staff_overview_tool_down(rct_window* w, int widgetIndex, int x, int if (dest_x == (sint16)0x8000)return; - // Set the coordinate of destination to be exactly + // Set the coordinate of destination to be exactly // in the middle of a tile. dest_x += 16; dest_y += 16; @@ -1271,7 +1271,7 @@ void window_staff_options_mousedown(int widgetIndex, rct_window* w, rct_widget* rct_peep* peep = GET_PEEP(w->number); int item_checked = 0; - //This will be moved below where Items Checked is when all + //This will be moved below where Items Checked is when all //of dropdown related functions are finished. This prevents //the dropdown from not working on first click. for (int i = 0; i < no_entries; ++i){ @@ -1285,13 +1285,13 @@ void window_staff_options_mousedown(int widgetIndex, rct_window* w, rct_widget* //Get the dropdown box widget instead of button. widget--; - + int x = widget->left + w->x; int y = widget->top + w->y; int extray = widget->bottom - widget->top + 1; int width = widget->right - widget->left - 3; window_dropdown_show_text_custom_width(x, y, extray, w->colours[1], DROPDOWN_FLAG_STAY_OPEN, no_entries, width); - + // See above note. gDropdownItemsChecked = item_checked; } diff --git a/src/windows/staff_fire_prompt.c b/src/windows/staff_fire_prompt.c index 0669f0bd8b..564888159c 100644 --- a/src/windows/staff_fire_prompt.c +++ b/src/windows/staff_fire_prompt.c @@ -112,7 +112,7 @@ void window_staff_fire_prompt_open(rct_peep* peep) static void window_staff_fire_mouseup(rct_window *w, int widgetIndex) { rct_peep* peep = &g_sprite_list[w->number].peep; - + switch (widgetIndex){ case WIDX_YES: game_do_command(peep->x, 1, peep->y, w->number, GAME_COMMAND_FIRE_STAFF_MEMBER, 0, 0); @@ -137,12 +137,12 @@ static void window_staff_fire_paint(rct_window *w, rct_drawpixelinfo *dpi) window_draw_widgets(w, dpi); rct_peep* peep = &g_sprite_list[w->number].peep; - + RCT2_GLOBAL(0x13CE952, uint16) = peep->name_string_idx; RCT2_GLOBAL(0x13CE954, uint32) = peep->id; - + int x = w->x + WW / 2; int y = w->y + (WH / 2) - 3; - + gfx_draw_string_centred_wrapped(dpi, (void*)0x13CE952, x, y, WW - 4, STR_FIRE_STAFF_ID, 0); } diff --git a/src/windows/staff_list.c b/src/windows/staff_list.c index cff9782bbb..da0fe1edf2 100644 --- a/src/windows/staff_list.c +++ b/src/windows/staff_list.c @@ -412,7 +412,7 @@ void window_staff_list_scrollgetsize(rct_window *w, int scrollIndex, int *width, RCT2_GLOBAL(RCT2_ADDRESS_STAFF_HIGHLIGHTED_INDEX, short) = -1; window_invalidate(w); } - + *height = staffCount * 10; i = *height - window_staff_list_widgets[WIDX_STAFF_LIST_LIST].bottom + window_staff_list_widgets[WIDX_STAFF_LIST_LIST].top + 21; if (i < 0) @@ -493,7 +493,7 @@ void window_staff_list_invalidate(rct_window *w) w->pressed_widgets = pressed_widgets | (1 << widgetIndex); window_staff_list_widgets[WIDX_STAFF_LIST_HIRE_BUTTON].image = STR_HIRE_HANDYMAN + tabIndex; window_staff_list_widgets[WIDX_STAFF_LIST_UNIFORM_COLOR_PICKER].type = WWT_EMPTY; - + if (tabIndex < 3) { window_staff_list_widgets[WIDX_STAFF_LIST_UNIFORM_COLOR_PICKER].type = WWT_COLORBTN; window_staff_list_widgets[WIDX_STAFF_LIST_UNIFORM_COLOR_PICKER].image = @@ -573,8 +573,8 @@ void window_staff_list_paint(rct_window *w, rct_drawpixelinfo *dpi) window_staff_list_widgets[WIDX_STAFF_LIST_ENTERTAINERS_TAB].top + w->y + 1, window_staff_list_widgets[WIDX_STAFF_LIST_ENTERTAINERS_TAB].bottom - window_staff_list_widgets[WIDX_STAFF_LIST_ENTERTAINERS_TAB].top - 1 ); - - + + if (sprite_dpi != NULL) { // Entertainers tab image diff --git a/src/windows/text_input.c b/src/windows/text_input.c index b2df708142..19aff71d4b 100644 --- a/src/windows/text_input.c +++ b/src/windows/text_input.c @@ -21,7 +21,7 @@ /** * Text Input Window * - * This is a new window created to replace the windows dialog box + * This is a new window created to replace the windows dialog box * that is used for inputing new text for ride names and peep names. */ @@ -137,9 +137,9 @@ void window_text_input_open(rct_window* call_w, int call_widget, rct_string_id t // Window will be in the center of the screen rct_window* w = window_create_centred( - WW, + WW, height, - &window_text_input_events, + &window_text_input_events, WC_TEXTINPUT, WF_STICK_TO_FRONT ); @@ -260,10 +260,10 @@ static void window_text_input_paint(rct_window *w, rct_drawpixelinfo *dpi) window_draw_widgets(w, dpi); int y = w->y + 25; - + int no_lines = 0; int font_height = 0; - + gfx_draw_string_centred(dpi, input_text_description, w->x + WW / 2, y, w->colours[1], &TextInputDescriptionArgs); @@ -316,7 +316,7 @@ static void window_text_input_paint(rct_window *w, rct_drawpixelinfo *dpi) cur_drawn++; } - + wrap_pointer += string_length + 1; if (text_input[char_count + string_length] == ' ')char_count++; @@ -359,7 +359,7 @@ void window_text_input_key(rct_window* w, int key) if (calling_w) window_event_textinput_call(calling_w, calling_widget, text_input); } - + window_invalidate(w); } diff --git a/src/windows/themes.c b/src/windows/themes.c index 94b04f68a9..ed65866a49 100644 --- a/src/windows/themes.c +++ b/src/windows/themes.c @@ -754,7 +754,7 @@ void window_themes_invalidate(rct_window *w) window_themes_widgets[WIDX_THEMES_LIST].right = w->width - 4; window_themes_widgets[WIDX_THEMES_LIST].bottom = w->height - 0x0F; - + window_themes_widgets[WIDX_THEMES_LIST].type = WWT_EMPTY; window_themes_widgets[WIDX_THEMES_RCT1_RIDE_LIGHTS].type = WWT_EMPTY; window_themes_widgets[WIDX_THEMES_RCT1_PARK_LIGHTS].type = WWT_EMPTY; diff --git a/src/windows/tile_inspector.c b/src/windows/tile_inspector.c index c04026e863..72a8b71993 100644 --- a/src/windows/tile_inspector.c +++ b/src/windows/tile_inspector.c @@ -274,7 +274,7 @@ static void window_tile_inspector_paint(rct_window *w, rct_drawpixelinfo *dpi) draw_string_left_underline(dpi, STR_TILE_INSPECTOR_BASE_HEIGHT, NULL, 12, x + 200, y); draw_string_left_underline(dpi, STR_TILE_INSPECTOR_CLEARANGE_HEIGHT, NULL, 12, x + 280, y); draw_string_left_underline(dpi, STR_TILE_INSPECTOR_FLAGS, NULL, 12, x + 390, y); - + } static void window_tile_inspector_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) diff --git a/src/windows/title_command_editor.c b/src/windows/title_command_editor.c index 7fb1c66aca..9cc7a77199 100644 --- a/src/windows/title_command_editor.c +++ b/src/windows/title_command_editor.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -96,7 +96,7 @@ static rct_widget window_title_command_editor_widgets[] = { { WWT_DROPDOWN_BUTTON, 1, WW-28, WW-18, BY2+1, BY2+10, 876, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, WS+WHA+3, WW-WS-1, BY2-14, BY2-3, 5446, STR_NONE }, // Get location/zoom/etc - + { WWT_DROPDOWN_BUTTON, 1, 10, 80, WH-21, WH-10, STR_OK, STR_NONE }, // OKAY { WWT_DROPDOWN_BUTTON, 1, WW-80, WW-10, WH-21, WH-10, STR_CANCEL, STR_NONE }, // Cancel @@ -203,9 +203,9 @@ void window_title_command_editor_open(int index, bool insert) return; window = window_create_centred( - WW, + WW, WH, - &window_title_command_editor_events, + &window_title_command_editor_events, WC_TITLE_COMMAND_EDITOR, WF_STICK_TO_FRONT ); @@ -311,7 +311,7 @@ static void window_title_command_editor_mousedown(int widgetIndex, rct_window* w gDropdownItemsFormat[i] = 1142; gDropdownItemsArgs[i] = window_title_command_editor_orders[i].nameStringId; } - + window_dropdown_show_text_custom_width( w->x + widget->left, w->y + widget->top, @@ -370,7 +370,7 @@ static void window_title_command_editor_mousedown(int widgetIndex, rct_window* w static void window_title_command_editor_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { rct_xy16 mapCoord; - + if (dropdownIndex == -1) return; diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index 5832f8c17d..78edd9a61c 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -102,7 +102,7 @@ enum WINDOW_TITLE_EDITOR_WIDGET_IDX { WIDX_TITLE_EDITOR_SAVES_TAB, WIDX_TITLE_EDITOR_SCRIPT_TAB, WIDX_TITLE_EDITOR_LIST, - + // Presets Tab WIDX_TITLE_EDITOR_PRESETS, WIDX_TITLE_EDITOR_PRESETS_DROPDOWN, @@ -123,7 +123,7 @@ enum WINDOW_TITLE_EDITOR_WIDGET_IDX { WIDX_TITLE_EDITOR_DELETE, //WIDX_TITLE_EDITOR_RELOAD, WIDX_TITLE_EDITOR_SKIP_TO, - + WIDX_TITLE_EDITOR_MOVE_UP, WIDX_TITLE_EDITOR_MOVE_DOWN, @@ -155,7 +155,7 @@ static rct_widget window_title_editor_widgets[] = { { WWT_TAB, 1, 34, 64, 17, 43, 0x02000144E, 5377 }, // saves tab { WWT_TAB, 1, 65, 95, 17, 43, 0x02000144E, 5378 }, // script tab { WWT_SCROLL, 1, BX+BW+9,WW-4, 48, WH-4, 3, STR_NONE }, // command/save list - + // Presets Tab { WWT_DROPDOWN, 1, 125, 299, 60, 71, STR_NONE, STR_NONE }, // Preset title sequences { WWT_DROPDOWN_BUTTON, 1, 288, 298, 61, 70, 876, STR_NONE }, @@ -163,7 +163,7 @@ static rct_widget window_title_editor_widgets[] = { { WWT_DROPDOWN_BUTTON, 1, 10, 100, 82+20, 93+20, 5239, 5383 }, // Duplicate button { WWT_DROPDOWN_BUTTON, 1, 110, 200, 82, 93, 3349, 5384 }, // Delete button { WWT_DROPDOWN_BUTTON, 1, 210, 300, 82, 93, 3348, 5385 }, // Rename button - + // Saves Tab { WWT_DROPDOWN_BUTTON, 1, BX, BX+BW-1,BY, BH, 5407, 5392 }, // Add { WWT_DROPDOWN_BUTTON, 1, BX, BX+BW-1,BY+(BS*1), BH+(BS*1), 5408, 5393 }, // Remove @@ -267,7 +267,7 @@ void window_title_editor_open(int tab) (1 << WIDX_TITLE_EDITOR_STOP) | (1 << WIDX_TITLE_EDITOR_REPLAY) | (1 << WIDX_TITLE_EDITOR_SKIP); - + window_init_scroll_widgets(window); window->list_information_type = 0; @@ -495,7 +495,7 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex) } static void window_title_editor_resize(rct_window *w) -{ +{ if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_PRESETS) { w->min_width = WW; w->min_height = WH2; @@ -594,7 +594,7 @@ static void window_title_editor_mousedown(int widgetIndex, rct_window* w, rct_wi } static void window_title_editor_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) -{ +{ if (dropdownIndex == -1) return; @@ -630,7 +630,7 @@ void window_title_editor_scrollgetsize(rct_window *w, int scrollIndex, int *widt lineCount = gConfigTitleSequences.presets[gCurrentTitleSequence].num_saves; else if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_SCRIPT) lineCount = gConfigTitleSequences.presets[gCurrentTitleSequence].num_commands; - + *height = lineCount * ROW_HEIGHT; i = *height - window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].bottom + window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].top + 21; if (i < 0) @@ -669,7 +669,7 @@ void window_title_editor_scrollmouseover(rct_window *w, int scrollIndex, int x, { int index; sint16 oldHighlightedIndex; - + index = y / ROW_HEIGHT; switch (w->selected_tab) { oldHighlightedIndex = _window_title_editor_highlighted_index; @@ -751,7 +751,7 @@ void window_title_editor_invalidate(rct_window *w) uint8 widgetIndex = w->selected_tab + 4; w->pressed_widgets = pressed_widgets | (1 << widgetIndex); - + window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].type = WWT_EMPTY; window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].type = WWT_EMPTY; @@ -777,7 +777,7 @@ void window_title_editor_invalidate(rct_window *w) window_title_editor_widgets[WIDX_TITLE_EDITOR_STOP].type = WWT_EMPTY; window_title_editor_widgets[WIDX_TITLE_EDITOR_REPLAY].type = WWT_EMPTY; window_title_editor_widgets[WIDX_TITLE_EDITOR_SKIP].type = WWT_EMPTY; - + switch (w->selected_tab) { case WINDOW_TITLE_EDITOR_TAB_PRESETS: window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].type = WWT_DROPDOWN; @@ -813,7 +813,7 @@ void window_title_editor_invalidate(rct_window *w) window_title_editor_widgets[WIDX_TITLE_EDITOR_SKIP].type = WWT_IMGBTN; break; } - + window_title_editor_widgets[WIDX_TITLE_EDITOR_BACKGROUND].right = w->width - 1; window_title_editor_widgets[WIDX_TITLE_EDITOR_BACKGROUND].bottom = w->height - 1; window_title_editor_widgets[WIDX_TITLE_EDITOR_TAB_CONTENT_PANEL].right = w->width - 1; @@ -910,7 +910,7 @@ void window_title_editor_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int else if (i & 1) { gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, RCT2_GLOBAL(0x0141FC4A + (w->colours[1] * 8), uint8) | 0x1000000); } - + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&title->saves[i]; if (selected || hover) { format_string(buffer, 1170, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); @@ -985,7 +985,7 @@ void window_title_editor_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int commandName = 5426; break; } - + if ((selected || hover) && !error) { format_string(buffer, commandName, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); } diff --git a/src/windows/title_exit.c b/src/windows/title_exit.c index b78c788ca5..7bcefd86a8 100644 --- a/src/windows/title_exit.c +++ b/src/windows/title_exit.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -102,7 +102,7 @@ static void window_title_exit_mouseup(rct_window *w, int widgetIndex) } /** -* +* * rct2: 0x0066B836 */ static void window_title_exit_paint(rct_window *w, rct_drawpixelinfo *dpi) diff --git a/src/windows/title_logo.c b/src/windows/title_logo.c index 001be0e02d..9e338a8e63 100644 --- a/src/windows/title_logo.c +++ b/src/windows/title_logo.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -72,7 +72,7 @@ void window_title_logo_open() { int i, packs; rct_window *window; - + // Count number of expansion packs packs = 0; for (i = 0; i < 16; i++) diff --git a/src/windows/title_menu.c b/src/windows/title_menu.c index 970d021ca8..a42588d59c 100644 --- a/src/windows/title_menu.c +++ b/src/windows/title_menu.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/windows/title_options.c b/src/windows/title_options.c index 40be52d339..f841862d37 100644 --- a/src/windows/title_options.c +++ b/src/windows/title_options.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/windows/title_scenarioselect.c b/src/windows/title_scenarioselect.c index b817b6113a..c370e6a373 100644 --- a/src/windows/title_scenarioselect.c +++ b/src/windows/title_scenarioselect.c @@ -99,7 +99,7 @@ static rct_window_event_list window_scenarioselect_events = { }; /** - * + * * rct2: 0x006781B5 */ void window_scenarioselect_open() @@ -120,7 +120,7 @@ void window_scenarioselect_open() WF_10 ); window->widgets = window_scenarioselect_widgets; - + window->enabled_widgets = 0x04 | 0x10 | 0x20 | 0x40 | 0x80 | 0x100; window_init_scroll_widgets(window); window->viewport_focus_coordinates.var_480 = -1; @@ -132,7 +132,7 @@ void window_scenarioselect_open() } /** - * + * * rct2: 0x00677C8A */ static void window_scenarioselect_init_tabs() @@ -262,7 +262,7 @@ static void window_scenarioselect_paint(rct_window *w, rct_drawpixelinfo *dpi) rct_scenario_basic *scenario; window_draw_widgets(w, dpi); - + format = (theme_get_preset()->features.rct1_scenario_font) ? 5138 : 1193; // Text for each tab diff --git a/src/windows/tooltip.c b/src/windows/tooltip.c index c723cd9332..d8edd3dd65 100644 --- a/src/windows/tooltip.c +++ b/src/windows/tooltip.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -138,13 +138,13 @@ void window_tooltip_show(rct_string_id id, int x, int y) } /** - * + * * rct2: 0x006EA10D */ void window_tooltip_open(rct_window *widgetWindow, int widgetIndex, int x, int y) { rct_widget *widget; - + if (widgetWindow == NULL || widgetIndex == -1) return; @@ -164,7 +164,7 @@ void window_tooltip_open(rct_window *widgetWindow, int widgetIndex, int x, int y } /** - * + * * rct2: 0x006E98C6 */ void window_tooltip_close() @@ -177,7 +177,7 @@ void window_tooltip_close() } /** - * + * * rct2: 0x006EA578 */ static void window_tooltip_onclose(rct_window *w) @@ -186,7 +186,7 @@ static void window_tooltip_onclose(rct_window *w) } /** - * + * * rct2: 0x006EA580 */ static void window_tooltip_update(rct_window *w) @@ -196,7 +196,7 @@ static void window_tooltip_update(rct_window *w) } /** - * + * * rct2: 0x006EA41D */ static void window_tooltip_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -221,7 +221,7 @@ static void window_tooltip_paint(rct_window *w, rct_drawpixelinfo *dpi) gfx_draw_pixel(dpi, right - 1, top + 1, 0x0200002F); gfx_draw_pixel(dpi, left + 1, bottom - 1, 0x0200002F); gfx_draw_pixel(dpi, right - 1, bottom - 1, 0x0200002F); - + // Text left = w->x + ((w->width + 1) / 2) - 1; top = w->y + 1; diff --git a/src/windows/tooltip.h b/src/windows/tooltip.h index a05e5e18b8..b5b649463c 100644 --- a/src/windows/tooltip.h +++ b/src/windows/tooltip.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 1b01e3361f..3eb2511f76 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -188,7 +188,7 @@ static rct_widget window_top_toolbar_widgets[] = { { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_FINANCES_RESEARCH_TIP }, // Research { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_SHOW_RECENT_MESSAGES_TIP }, // News { WWT_TRNBTN, 0, 0x001E, 0x003B, 0, 27, 0x20000000 | 0x15F9, STR_SHOW_MULTIPLAYER_STATUS_TIP }, // Network - + { WWT_EMPTY, 0, 0, 10-1, 0, 0, 0xFFFFFFFF, STR_NONE }, // Artificial widget separator { WIDGETS_END }, }; @@ -277,7 +277,7 @@ void window_top_toolbar_open() } /** - * + * * rct2: 0x0066C957 */ static void window_top_toolbar_mouseup(rct_window *w, int widgetIndex) @@ -342,7 +342,7 @@ static void window_top_toolbar_mouseup(rct_window *w, int widgetIndex) } /** - * + * * rct2: 0x0066CA3B */ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widget* widget) @@ -597,7 +597,7 @@ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int drop } /** - * + * * rct2: 0x0066C810 */ static void window_top_toolbar_invalidate(rct_window *w) @@ -653,7 +653,7 @@ static void window_top_toolbar_invalidate(rct_window *w) window_top_toolbar_widgets[WIDX_PATH].type = WWT_EMPTY; window_top_toolbar_widgets[WIDX_CLEAR_SCENERY].type = WWT_EMPTY; } - + if (g_editor_step != EDITOR_STEP_ROLLERCOASTER_DESIGNER) { window_top_toolbar_widgets[WIDX_CONSTRUCT_RIDE].type = WWT_EMPTY; window_top_toolbar_widgets[WIDX_FASTFORWARD].type = WWT_EMPTY; @@ -759,7 +759,7 @@ static void window_top_toolbar_invalidate(rct_window *w) } /** - * + * * rct2: 0x0066C8EC */ static void window_top_toolbar_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -965,7 +965,7 @@ static void repaint_scenery_tool_down(sint16 x, sint16 y, sint16 widgetIndex){ } } -/* rct2: 0x006E1F34 +/* rct2: 0x006E1F34 * Outputs * eax : grid_x * ebx : parameter_1 @@ -1053,7 +1053,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin } } } - + switch (scenery_type){ case 0: { @@ -1129,7 +1129,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin // If CTRL not pressed if (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_CTRL_PRESSED, uint8) == 0){ - uint16 flags = + uint16 flags = VIEWPORT_INTERACTION_MASK_TERRAIN & VIEWPORT_INTERACTION_MASK_WATER; int interaction_type = 0; @@ -1208,7 +1208,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin { // Path bits - uint16 flags = + uint16 flags = VIEWPORT_INTERACTION_MASK_FOOTPATH & VIEWPORT_INTERACTION_MASK_FOOTPATH_ITEM; int interaction_type = 0; @@ -1373,7 +1373,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin uint8 rotation = window_scenery_rotation; rotation -= RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); rotation &= 0x3; - + sint16 z = map_element->base_height; if (map_element->properties.path.type & (1 << 2)){ @@ -1394,7 +1394,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin } /** - * + * * rct2: 0x006E2CC6 */ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w, short widgetIndex) @@ -1418,7 +1418,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w sub_6E1F34(x, y, selectedTab, &gridX, &gridY, ¶meter_1, ¶meter_2, ¶meter_3); if (gridX == (sint16)0x8000) return; - + switch (sceneryType){ case SCENERY_TYPE_SMALL: { @@ -1457,7 +1457,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w ) { zAttemptRange = 20; } - + bool success = false; for (; zAttemptRange != 0; zAttemptRange--){ int flags = GAME_COMMAND_FLAG_APPLY | (parameter_1 & 0xFF00); @@ -1569,7 +1569,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w for (; zAttemptRange != 0; zAttemptRange--) { int flags = (parameter_1 & 0xFF00) | GAME_COMMAND_FLAG_APPLY; - + RCT2_GLOBAL(0x009A8C29, uint8) |= 1; RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_POSITION_THIS_HERE; int cost = game_do_command(gridX, flags, gridY, parameter_2, GAME_COMMAND_PLACE_LARGE_SCENERY, parameter_3, RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16)); @@ -1783,7 +1783,7 @@ void top_toolbar_tool_update_land(sint16 x, sint16 y){ money32 lower_cost = selection_lower_land(0); money32 raise_cost = selection_raise_land(0); - if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_RAISE_COST, money32) != raise_cost || + if (RCT2_GLOBAL(RCT2_ADDRESS_LAND_RAISE_COST, money32) != raise_cost || RCT2_GLOBAL(RCT2_ADDRESS_LAND_LOWER_COST, money32) != lower_cost){ RCT2_GLOBAL(RCT2_ADDRESS_LAND_RAISE_COST, money32) = raise_cost; RCT2_GLOBAL(RCT2_ADDRESS_LAND_LOWER_COST, money32) = lower_cost; @@ -1889,7 +1889,7 @@ void top_toolbar_tool_update_land(sint16 x, sint16 y){ state_changed++; } - + if (tool_size == 0) tool_size = 1; @@ -1978,11 +1978,11 @@ void top_toolbar_tool_update_water(sint16 x, sint16 y){ rct_xy16 mapTile = { 0 }; int interaction_type = 0; get_map_coordinates_from_pos( - x, - y, - VIEWPORT_INTERACTION_MASK_TERRAIN & VIEWPORT_INTERACTION_MASK_WATER, - &mapTile.x, - &mapTile.y, + x, + y, + VIEWPORT_INTERACTION_MASK_TERRAIN & VIEWPORT_INTERACTION_MASK_WATER, + &mapTile.x, + &mapTile.y, &interaction_type, NULL, NULL); @@ -2073,7 +2073,7 @@ void top_toolbar_tool_update_water(sint16 x, sint16 y){ } } -/* rct2: 0x006E24F6 +/* rct2: 0x006E24F6 * On failure returns MONEY32_UNDEFINED * On success places ghost scenery and returns cost to place proper */ @@ -2090,12 +2090,12 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa // Small Scenery //6e252b cost = game_do_command( - map_tile.x, + map_tile.x, parameter_1 | 0x69, - map_tile.y, - parameter_2, - GAME_COMMAND_PLACE_SCENERY, - parameter_3, + map_tile.y, + parameter_2, + GAME_COMMAND_PLACE_SCENERY, + parameter_3, RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16)); if (cost == MONEY32_UNDEFINED) @@ -2168,7 +2168,7 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) = map_tile.x; RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_WALL_ROTATION, uint8) = (parameter_2 & 0xFF); - + mapElement = RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT, rct_map_element*); RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = mapElement->base_height; @@ -2264,7 +2264,7 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ scenery_remove_ghost_tool_placement(); return; } - + rct_scenery_entry* scenery; uint8 bl; money32 cost; @@ -2293,7 +2293,7 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ (parameter2 & 0xFF) == RCT2_GLOBAL(0x00F64F0E, uint8)&& RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) == RCT2_GLOBAL(0x00F64F0A, sint16) && RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_SELECTED_OBJECT, uint16) == selected_tab){ - return; + return; } scenery_remove_ghost_tool_placement(); @@ -2403,9 +2403,9 @@ void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ rct_xy16* selectedTile = gMapSelectionTiles; for (rct_large_scenery_tile* tile = scenery->large_scenery.tiles; tile->x_offset != (sint16)0xFFFF; tile++){ - rct_xy16 tileLocation = { - .x = tile->x_offset, - .y = tile->y_offset + rct_xy16 tileLocation = { + .x = tile->x_offset, + .y = tile->y_offset }; rotate_map_coordinates(&tileLocation.x, &tileLocation.y, (parameter1 >> 8) & 0xFF); @@ -2566,7 +2566,7 @@ static void window_top_toolbar_tool_down(rct_window* w, int widgetIndex, int x, } /** -* +* * rct2: 0x006644DD */ money32 selection_raise_land(uint8 flags) @@ -2780,11 +2780,11 @@ static void window_top_toolbar_tool_drag(rct_window* w, int widgetIndex, int x, } /** - * + * * rct2: 0x0066CC5B */ static void window_top_toolbar_tool_up(rct_window* w, int widgetIndex, int x, int y) -{ +{ switch (widgetIndex) { case WIDX_LAND: map_invalidate_selection_rect(); @@ -2805,7 +2805,7 @@ static void window_top_toolbar_tool_up(rct_window* w, int widgetIndex, int x, in } /** - * + * * rct2: 0x0066CA58 */ static void window_top_toolbar_tool_abort(rct_window *w, int widgetIndex) diff --git a/src/windows/track_list.c b/src/windows/track_list.c index d5970907eb..fa9c2f1697 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -514,7 +514,7 @@ static void window_track_list_paint(rct_window *w, rct_drawpixelinfo *dpi) } } } - + if (ride_type_has_flag(track_td6->type, RIDE_TYPE_FLAG_HAS_DROPS)) { // Drops drops = track_td6->drops & 0x3F; diff --git a/src/windows/track_manage.c b/src/windows/track_manage.c index eaa9c122b3..4b1ac29344 100644 --- a/src/windows/track_manage.c +++ b/src/windows/track_manage.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/windows/track_place.c b/src/windows/track_place.c index 4d61006534..9d73faee30 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -166,7 +166,7 @@ static void window_track_place_draw_mini_preview() while (trackBlock->index != 255) { x = originX; y = originY; - + switch (rotation & 3) { case 0: x += trackBlock->x; @@ -310,7 +310,7 @@ static void window_track_place_clear_provisional() if (_window_track_place_last_was_valid) { sub_6D01B3( 6, - RCT2_GLOBAL(0x00F440EB, uint8), + RCT2_GLOBAL(0x00F440EB, uint8), _window_track_place_last_valid_x, _window_track_place_last_valid_y, _window_track_place_last_valid_z @@ -327,7 +327,7 @@ static int window_track_place_get_base_z(int x, int y) { rct_map_element *mapElement; int z; - + mapElement = map_get_surface_element_at(x >> 5, y >> 5); z = mapElement->base_height * 8; @@ -343,7 +343,7 @@ static int window_track_place_get_base_z(int x, int y) // Increase Z above water if (mapElement->properties.surface.terrain & 0x1F) z = max(z, (mapElement->properties.surface.terrain & 0x1F) << 4); - + return z + sub_6D01B3(3, 0, x, y, z); } @@ -486,7 +486,7 @@ static void window_track_place_toolupdate(rct_window* w, int widgetIndex, int x, mapZ = window_track_place_get_base_z(mapX, mapY); if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0 || gConfigCheat.build_in_pause_mode) { window_track_place_clear_provisional(); - + // Try increasing Z until a feasible placement is found for (i = 0; i < 7; i++) { window_track_place_attempt_placement(mapX, mapY, mapZ, 105, &cost, &rideIndex); @@ -508,7 +508,7 @@ static void window_track_place_toolupdate(rct_window* w, int widgetIndex, int x, _window_track_place_last_cost = cost; widget_invalidate(w, WIDX_PRICE); } - + sub_6D01B3(0, 0, mapX, mapY, mapZ); } @@ -530,7 +530,7 @@ static void window_track_place_tooldown(rct_window* w, int widgetIndex, int x, i sub_68A15E(x, y, &mapX, &mapY, NULL, NULL); if (mapX == (short)0x8000) return; - + // Try increasing Z until a feasible placement is found mapZ = window_track_place_get_base_z(mapX, mapY); for (i = 0; i < 7; i++) { @@ -596,7 +596,7 @@ static void window_track_place_paint(rct_window *w, rct_drawpixelinfo *dpi) { rct_drawpixelinfo *clippedDpi; rct_g1_element tmpElement, *subsituteElement; - + window_draw_widgets(w, dpi); // Draw mini tile preview diff --git a/src/windows/viewport.c b/src/windows/viewport.c index 43803bef5b..166759a19a 100644 --- a/src/windows/viewport.c +++ b/src/windows/viewport.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -229,7 +229,7 @@ static void window_viewport_invalidate(rct_window *w) w->disabled_widgets |= 1 << WIDX_ZOOM_IN; if (viewport->zoom >= 3) w->disabled_widgets |= 1 << WIDX_ZOOM_OUT; - + viewport->x = w->x + viewportWidget->left; viewport->y = w->y + viewportWidget->top; viewport->width = viewportWidget->right - viewportWidget->left; diff --git a/src/windows/water.c b/src/windows/water.c index ea3de071c3..85ccc87f36 100644 --- a/src/windows/water.c +++ b/src/windows/water.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -91,7 +91,7 @@ static rct_window_event_list window_water_events = { }; /** - * + * * rct2: 0x006E6A40 */ void window_water_open() diff --git a/src/world/banner.c b/src/world/banner.c index 64b1bbeaeb..44521c90f2 100644 --- a/src/world/banner.c +++ b/src/world/banner.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/world/banner.h b/src/world/banner.h index 131fc1d9c4..7b836d0815 100644 --- a/src/world/banner.h +++ b/src/world/banner.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/world/climate.c b/src/world/climate.c index f65b22563b..dd1316d117 100644 --- a/src/world/climate.c +++ b/src/world/climate.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -43,9 +43,9 @@ typedef struct { // These still need to be read / written when loading and saving // int gClimateNextWeather; -// +// // static int _climateCurrentWeatherEffect; -// +// // static int _climateNextTemperature; // static int _climateNextWeatherEffect; // static int _climateNextWeatherGloom; @@ -103,7 +103,7 @@ void climate_reset(int climate) RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER_EFFECT, sint8) = climate_weather_data[weather].effect_level; RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER_GLOOM, sint8) = climate_weather_data[weather].gloom_level; RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, sint8) = climate_weather_data[weather].rain_level; - + _lightningTimer = 0; _thunderTimer = 0; if (_rainVolume != 1){ @@ -135,7 +135,7 @@ void toggle_climate_lock() /** * Weather & climate update iteration. * Gradually changes the weather parameters towards their determined next values. - * + * * rct2: 0x006C46B1 */ void climate_update() @@ -162,7 +162,7 @@ void climate_update() RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE_UPDATE_TIMER, sint16)--; } else if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x7F)) { - + if (temperature == target_temperature) { if (cur_gloom == next_gloom) { _climateCurrentWeatherEffect = _climateNextWeatherEffect; @@ -196,14 +196,14 @@ void climate_force_weather(uint8 weather){ RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE_UPDATE_TIMER, sint16) = 1920; climate_update(); - + // Incase of change in gloom level force a complete redraw gfx_invalidate_screen(); } /** * Calculates future weather development. - * RCT2 implements this as discrete probability distributions dependant on month and climate + * RCT2 implements this as discrete probability distributions dependant on month and climate * for next_weather. The other weather parameters are then looked up depending only on the * next weather. * @@ -215,7 +215,7 @@ static void climate_determine_future_weather() const rct_weather_transition* climate_table = climate_transitions[climate]; sint8 month = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16) & 7; rct_weather_transition transition = climate_table[month]; - + // Generate a random variable with values 0 upto distribution_size-1 and chose weather from the distribution table accordingly sint8 next_weather = transition.distribution[ ((scenario_rand() & 0xFF) * transition.distribution_size) >> 8 ]; gClimateNextWeather = next_weather; @@ -224,12 +224,12 @@ static void climate_determine_future_weather() _climateNextWeatherEffect = climate_weather_data[next_weather].effect_level; _climateNextWeatherGloom = climate_weather_data[next_weather].gloom_level; _climateNextRainLevel = climate_weather_data[next_weather].rain_level; - + RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE_UPDATE_TIMER, sint16) = 1920; } /** - * + * * rct2: 0x006BCB91 */ void climate_update_sound() diff --git a/src/world/climate.h b/src/world/climate.h index 0ab10b5be3..7acf000483 100644 --- a/src/world/climate.h +++ b/src/world/climate.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/world/footpath.c b/src/world/footpath.c index bbf281036e..943981c9ea 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -113,7 +113,7 @@ rct_map_element *map_get_footpath_element_slope(int x, int y, int z, int slope) return mapElement; } } while (!map_element_is_last_for_tile(mapElement++)); - + return NULL; } @@ -159,7 +159,7 @@ static money32 footpath_element_insert(int type, int x, int y, int z, int slope, RCT2_GLOBAL(0x00F3EF84, uint16) = x; RCT2_GLOBAL(0x00F3EF86, uint16) = y; - + // Ugh, hack until 0x006A6733 is written // 0x006A6733 expects the flags to be at (*0xF3EF7C) + 8 RCT2_GLOBAL(0x00F3EF7C, uint32) = (uint32)(&flags - 2); @@ -515,7 +515,7 @@ void game_command_place_footpath_from_track(int *eax, int *ebx, int *ecx, int *e (*edx >> 8) & 0xFF, *eax & 0xFFFF, *ecx & 0xFFFF, - *edx & 0xFF, + *edx & 0xFF, ((*ebx >> 13) & 0x3) | ((*ebx >> 10) & 0x4), (*ebx >> 8) & 0xF, *ebx & 0xFF @@ -542,7 +542,7 @@ void footpath_remove(int x, int y, int z, int flags) } /** - * + * * rct2: 0x006A76FF */ money32 footpath_provisional_set(int type, int x, int y, int z, int slope) @@ -565,7 +565,7 @@ money32 footpath_provisional_set(int type, int x, int y, int z, int slope) } /** - * + * * rct2: 0x006A77FF */ void footpath_provisional_remove() @@ -583,7 +583,7 @@ void footpath_provisional_remove() } /** - * + * * rct2: 0x006A7831 */ void footpath_provisional_update() @@ -686,7 +686,7 @@ void footpath_get_coordinates_from_pos(int screenX, int screenY, int *x, int *y, } /** - * + * * rct2: 0x0068A0C9 * screenX: eax * screenY: ebx @@ -719,7 +719,7 @@ void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, return; } } - + get_map_coordinates_from_pos(screenX, screenY, VIEWPORT_INTERACTION_MASK_RIDE & VIEWPORT_INTERACTION_MASK_FOOTPATH & VIEWPORT_INTERACTION_MASK_TERRAIN, &map_pos.x, &map_pos.y, &interactionType, mapElement, &viewport); *x = map_pos.x; *y = map_pos.y; @@ -739,7 +739,7 @@ void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, } /** - * + * * rct2: 0x00673883 */ void footpath_remove_litter(int x, int y, int z) @@ -765,7 +765,7 @@ void footpath_remove_litter(int x, int y, int z) } /** - * + * * rct2: 0x0069A48B */ void footpath_interrupt_peeps(int x, int y, int z) @@ -858,15 +858,15 @@ static rct_map_element *footpath_connect_corners_get_neighbour(int x, int y, int static void footpath_connect_corners(int initialX, int initialY, rct_map_element *initialMapElement) { rct_map_element *mapElement[4]; - + if (footpath_element_is_queue(initialMapElement)) return; if (footpath_element_is_sloped(initialMapElement)) return; - + mapElement[0] = initialMapElement; int z = initialMapElement->base_height; - for (int initialDirection = 0; initialDirection < 4; initialDirection++) { + for (int initialDirection = 0; initialDirection < 4; initialDirection++) { int x = initialX; int y = initialY; int direction = initialDirection; @@ -1070,7 +1070,7 @@ static bool footpath_is_queue_connected_to_path(int x, int y, rct_map_element *m } /** - * + * * rct2: 0x006A6D7E */ static void loc_6A6D7E( @@ -1225,7 +1225,7 @@ static void loc_6A6C85( } /** - * + * * rct2: 0x006A6C66 */ void footpath_connect_edges(int x, int y, rct_map_element *mapElement, int flags) @@ -1269,7 +1269,7 @@ void footpath_connect_edges(int x, int y, rct_map_element *mapElement, int flags } /** - * + * * rct2: 0x006A742F */ void footpath_chain_ride_queue(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction) @@ -1292,7 +1292,7 @@ void footpath_chain_ride_queue(int rideIndex, int entranceIndex, int x, int y, r } } } - + x += TileDirectionDelta[direction].x; y += TileDirectionDelta[direction].y; mapElement = map_get_first_element_at(x >> 5, y >> 5); @@ -1364,7 +1364,7 @@ void footpath_chain_ride_queue(int rideIndex, int entranceIndex, int x, int y, r } /** - * + * * rct2: 0x006A759F */ void sub_6A759F() diff --git a/src/world/footpath.h b/src/world/footpath.h index eb54b96584..23ecaac8f8 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/world/fountain.c b/src/world/fountain.c index 7f4d1b738e..3c720c9474 100644 --- a/src/world/fountain.c +++ b/src/world/fountain.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -279,7 +279,7 @@ static void jumping_fountain_continue(rct_jumping_fountain *jumpingFountain) jumping_fountain_split(jumpingFountain, x, y, z, availableDirections); return; } - + jumping_fountain_random(jumpingFountain, x, y, z, availableDirections); } @@ -310,7 +310,7 @@ static bool is_jumping_fountain(int type, int x, int y, int z) return true; } while (!map_element_is_last_for_tile(mapElement++)); - + return false; } @@ -340,7 +340,7 @@ static void jumping_fountain_goto_edge(rct_jumping_fountain *jumpingFountain, in jumping_fountain_split(jumpingFountain, x, y, z, availableDirections); return; } - + direction = randomIndex & 7; while (!(availableDirections & (1 << direction))) direction = (direction + 1) & 7; diff --git a/src/world/fountain.h b/src/world/fountain.h index d7b63fe148..68f04449a6 100644 --- a/src/world/fountain.h +++ b/src/world/fountain.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/world/map.c b/src/world/map.c index 5b2b5bbcba..fe97d9e22c 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -163,7 +163,7 @@ void map_element_iterator_restart_for_tile(map_element_iterator *it) rct_map_element *map_get_first_element_at(int x, int y) { - if (x < 0 || y < 0 || x > 255 || y > 255) { + if (x < 0 || y < 0 || x > 255 || y > 255) { log_error("Trying to access element outside of range"); return NULL; } @@ -172,7 +172,7 @@ rct_map_element *map_get_first_element_at(int x, int y) void map_set_tile_elements(int x, int y, rct_map_element *elements) { - if (x < 0 || y < 0 || x > 255 || y > 255) { + if (x < 0 || y < 0 || x > 255 || y > 255) { log_error("Trying to access element outside of range"); return; } @@ -274,7 +274,7 @@ rct_map_element* map_get_path_element_at(int x, int y, int z){ return NULL; } /** - * + * * rct2: 0x0068AB4C */ void map_init(int size) @@ -315,7 +315,7 @@ void map_init(int size) } /** - * + * * rct2: 0x0068AFFD */ void map_update_tile_pointers() @@ -512,7 +512,7 @@ void sub_68B089() if (mapElement == mapElementFirst) return; - // + // TILE_MAP_ELEMENT_POINTER(i) = mapElement; do { *mapElement = *mapElementFirst; @@ -876,7 +876,7 @@ void game_command_remove_scenery(int* eax, int* ebx, int* ecx, int* edx, int* es uint8 scenery_type = *edx >> 8; uint8 map_element_type = *ebx >> 8; money32 cost; - + rct_scenery_entry *entry = g_smallSceneryEntries[scenery_type]; cost = entry->small_scenery.removal_price * 10; @@ -944,7 +944,7 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; - + if (!(*ebx & 0x40) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; *ebx = MONEY32_UNDEFINED; @@ -969,7 +969,7 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i // If we are removing ghost elements if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)) continue; - + element_found = 1; break; } while (!map_element_is_last_for_tile(map_element++)); @@ -980,11 +980,11 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i } map_element_remove_banner_entry(map_element); - + int ecx2 = map_element->properties.scenerymultiple.type >> 10; rct_scenery_entry* scenery_entry = g_largeSceneryEntries[map_element->properties.scenerymultiple.type & 0x3FF]; - rct_xyz16 firstTile = { - .x = scenery_entry->large_scenery.tiles[ecx2].x_offset, + rct_xyz16 firstTile = { + .x = scenery_entry->large_scenery.tiles[ecx2].x_offset, .y = scenery_entry->large_scenery.tiles[ecx2].y_offset, .z = (base_height * 8) - scenery_entry->large_scenery.tiles[ecx2].z_offset }; @@ -1018,7 +1018,7 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i // If not applying then no need to delete the actual element if (!(*ebx & GAME_COMMAND_FLAG_APPLY)) continue; - + rct_map_element* sceneryElement = map_get_first_element_at(currentTile.x / 32, currentTile.y / 32); uint8 tile_not_found = 1; do @@ -1151,7 +1151,7 @@ void game_command_set_scenery_colour(int* eax, int* ebx, int* ecx, int* edx, int map_element->properties.scenery.colour_2 |= color2; map_invalidate_tile_full(x, y); } - + *ebx = 0; } @@ -1319,7 +1319,7 @@ void game_command_set_large_scenery_colour(int* eax, int* ebx, int* ecx, int* ed map_element->properties.scenerymultiple.colour[1] |= color2; map_invalidate_tile_full(x3, y3); } - + i++; } *ebx = 0; @@ -1366,7 +1366,7 @@ void game_command_set_banner_colour(int* eax, int* ebx, int* ecx, int* edx, int* gBanners[map_element->properties.banner.index].colour = color; map_invalidate_tile_zoom1(x, y, z, z + 32); } - + *ebx = 0; } @@ -1562,7 +1562,7 @@ money32 map_change_surface_style(int x0, int y0, int x1, int y1, uint8 surfaceSt if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode) { if (!map_is_location_in_park(x, y)) continue; } - + rct_map_element* mapElement = map_get_surface_element_at(x / 32, y / 32); if (surfaceStyle != 0xFF){ @@ -1609,7 +1609,7 @@ money32 map_change_surface_style(int x0, int y0, int x1, int y1, uint8 surfaceSt } } } - + if (flags & 1) { if (!(mapElement->properties.surface.terrain & MAP_ELEMENT_SURFACE_TERRAIN_MASK)) { if (!(mapElement->type & MAP_ELEMENT_DIRECTION_MASK)) { @@ -1807,7 +1807,7 @@ money32 raise_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b money32 tileCost = map_set_land_height(flags, xi, yi, height, newStyle, selectionType); if (tileCost == MONEY32_UNDEFINED) return MONEY32_UNDEFINED; - + cost += tileCost; } } @@ -1871,7 +1871,7 @@ money32 lower_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b money32 tileCost = map_set_land_height(flags, xi, yi, height, newStyle, selectionType); if (tileCost == MONEY32_UNDEFINED) return MONEY32_UNDEFINED; - + cost += tileCost; } } @@ -1923,11 +1923,11 @@ money32 raise_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags) } else { height = map_element->base_height + 2; } - + money32 tileCost = game_do_command(xi, flags, yi, (max_height << 8) + height, GAME_COMMAND_SET_WATER_HEIGHT, 0, 0); if (tileCost == MONEY32_UNDEFINED) return MONEY32_UNDEFINED; - + cost += tileCost; } } @@ -2396,10 +2396,10 @@ void game_command_raise_water(int* eax, int* ebx, int* ecx, int* edx, int* esi, void game_command_lower_water(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { *ebx = lower_water( - (sint16)(*eax & 0xFFFF), - (sint16)(*ecx & 0xFFFF), - (sint16)(*edi & 0xFFFF), - (sint16)(*ebp & 0xFFFF), + (sint16)(*eax & 0xFFFF), + (sint16)(*ecx & 0xFFFF), + (sint16)(*edi & 0xFFFF), + (sint16)(*ebp & 0xFFFF), (uint8)*ebx ); } @@ -2427,7 +2427,7 @@ void game_command_set_water_height(int* eax, int* ebx, int* ecx, int* edx, int* *ebx = MONEY32_UNDEFINED; return; } - + if(base_height < 2){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TOO_LOW; *ebx = MONEY32_UNDEFINED; @@ -2843,7 +2843,7 @@ static bool map_place_fence_check_obstruction_with_track(rct_scenery_entry *wall } } } - + if (!(wall->wall.flags & WALL_SCENERY_FLAG5)) { return false; } @@ -3025,7 +3025,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !(flags & (1 << 7)) && !gCheatsSandboxMode){ - + if (position.z == 0){ if (!map_is_location_in_park(position.x, position.y)){ *ebx = MONEY32_UNDEFINED; @@ -3252,7 +3252,7 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; int x = (sint16)*eax; int y = (sint16)*ecx; - int z = (sint16)*ebp; + int z = (sint16)*ebp; uint8 color1 = *edx; uint8 color2 = *edx >> 8; uint8 flags = *ebx; @@ -3289,7 +3289,7 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in } } rct_large_scenery_tile* tile = scenery_entry->large_scenery.tiles; - sint16 F43884 = 0xFFFF; + sint16 F43884 = 0xFFFF; do{ if(tile->x_offset == (sint16)0xFFFF){ break; @@ -3783,7 +3783,7 @@ int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *cle RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) = 1; if (x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16) || y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, sint16) || x < 32 || y < 32) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_OFF_EDGE_OF_MAP; - return false; + return false; } rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); do { @@ -3844,9 +3844,9 @@ int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *cle ch += 2; } int bh = zLow + 4; - if ((!(bl & 1) || (bl & 0x10 || zLow >= al) && bh >= al) && + if ((!(bl & 1) || (bl & 0x10 || zLow >= al) && bh >= al) && (!(bl & 2) || (bl & 0x20 || zLow >= ah) && bh >= ah) && - (!(bl & 4) || (bl & 0x40 || zLow >= cl) && bh >= cl) && + (!(bl & 4) || (bl & 0x40 || zLow >= cl) && bh >= cl) && (!(bl & 8) || (bl & 0x80 || zLow >= ch) && bh >= ch)) { continue; } @@ -3888,7 +3888,7 @@ int map_can_construct_at(int x, int y, int zLow, int zHigh, uint8 bl) } /** - * + * * rct2: 0x006E5935 */ void map_remove_intersecting_walls(int x, int y, int z0, int z1, int direction) @@ -4099,7 +4099,7 @@ void map_extend_boundary_surface() for (x = 0; x < 256; x++) { existingMapElement = map_get_surface_element_at(x, y - 1); newMapElement = map_get_surface_element_at(x, y); - + newMapElement->type = (newMapElement->type & 0x7C) | (existingMapElement->type & 0x83); newMapElement->properties.surface.slope = existingMapElement->properties.surface.slope & 0xE0; newMapElement->properties.surface.terrain = existingMapElement->properties.surface.terrain; @@ -4133,7 +4133,7 @@ void map_extend_boundary_surface() for (y = 0; y < 256; y++) { existingMapElement = map_get_surface_element_at(x - 1, y); newMapElement = map_get_surface_element_at(x, y); - + newMapElement->type = (newMapElement->type & 0x7C) | (existingMapElement->type & 0x83); newMapElement->properties.surface.slope = existingMapElement->properties.surface.slope & 0xE0; newMapElement->properties.surface.terrain = existingMapElement->properties.surface.terrain; @@ -4232,7 +4232,7 @@ static void sub_68AE2A(int x, int y) map_element_remove(mapElement); break; } - } + } } int map_get_highest_z(int tileX, int tileY) @@ -4311,7 +4311,7 @@ bool map_large_scenery_get_origin( } /** - * + * * rct2: 0x006B9B05 */ void sign_set_colour(int x, int y, int z, int direction, int sequence, uint8 mainColour, uint8 textColour) @@ -4361,7 +4361,7 @@ void sign_set_colour(int x, int y, int z, int direction, int sequence, uint8 mai } /** - * + * * rct2: 0x006E588E */ void map_remove_walls_at(int x, int y, int z0, int z1) @@ -4388,7 +4388,7 @@ repeat: } /** - * + * * rct2: 0x006E57E6 */ void map_remove_walls_at_z(int x, int y, int z) diff --git a/src/world/map.h b/src/world/map.h index 60d41f67bb..dad1e48030 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/world/map_animation.c b/src/world/map_animation.c index 2d3241d20f..b68a6a9e52 100644 --- a/src/world/map_animation.c +++ b/src/world/map_animation.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -36,7 +36,7 @@ static const map_animation_invalidate_event_handler _animatedObjectEventHandlers rct_map_animation *gAnimatedObjects = (rct_map_animation*)0x013886A0; /** - * + * * rct2: 0x0068AF67 * * @param type (dh) @@ -404,7 +404,7 @@ static bool map_animation_invalidate_banner(int x, int y, int baseZ) continue; if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_BANNER) continue; - + baseZ = mapElement->base_height * 8; map_invalidate_tile_zoom1(x, y, baseZ, baseZ + 16); return false; diff --git a/src/world/map_animation.h b/src/world/map_animation.h index ce749b6110..2bf35cd1c5 100644 --- a/src/world/map_animation.h +++ b/src/world/map_animation.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/world/map_helpers.c b/src/world/map_helpers.c index be2644ecaf..773def8cb9 100644 --- a/src/world/map_helpers.c +++ b/src/world/map_helpers.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -61,8 +61,8 @@ int map_smooth(int l, int t, int r, int b) if (cornerHeights[i] == highest){ count++; - // Check if surrounding corners aren't too high. The current tile - // can't compensate for all the height differences anymore if it has + // Check if surrounding corners aren't too high. The current tile + // can't compensate for all the height differences anymore if it has // the extra height slope. int highestOnLowestSide; switch (i){ @@ -297,14 +297,14 @@ int map_smooth_wavy(int l, int t, int r, int b) map_get_corner_height(x + 0, y + 1, 3) > mapElement->base_height ) mapElement->properties.surface.slope |= 8; - + if ( map_get_corner_height(x + 1, y - 1, 1) > mapElement->base_height || map_get_corner_height(x + 1, y + 0, 3) > mapElement->base_height || map_get_corner_height(x + 0, y - 1, 0) > mapElement->base_height ) mapElement->properties.surface.slope |= 2; - + if ( map_get_corner_height(x - 1, y - 1, 0) > mapElement->base_height || map_get_corner_height(x - 1, y + 0, 2) > mapElement->base_height || diff --git a/src/world/map_helpers.h b/src/world/map_helpers.h index 423bb4c25e..3a2dffa630 100644 --- a/src/world/map_helpers.h +++ b/src/world/map_helpers.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/world/mapgen.c b/src/world/mapgen.c index 5bdfb4eeb3..6d89306220 100644 --- a/src/world/mapgen.c +++ b/src/world/mapgen.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -352,7 +352,7 @@ static void mapgen_place_trees() case TERRAIN_ICE: if (numSnowTreeIds == 0) break; - + type = snowTreeIds[rand() % numSnowTreeIds]; break; } @@ -620,7 +620,7 @@ static void mapgen_set_height() uint8 q11 = get_height(heightX + 1, heightY + 1); uint8 baseHeight = (q00 + q01 + q10 + q11) / 4; - + mapElement = map_get_surface_element_at(x, y); mapElement->base_height = max(2, baseHeight * 2); mapElement->clearance_height = mapElement->base_height; diff --git a/src/world/mapgen.h b/src/world/mapgen.h index ed6fd47450..fd83f9e3e8 100644 --- a/src/world/mapgen.h +++ b/src/world/mapgen.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/world/park.c b/src/world/park.c index 267061dac9..fa1310ac74 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -60,7 +60,7 @@ int park_is_open() } /** - * + * * rct2: 0x00667132 */ void park_init() @@ -120,7 +120,7 @@ void park_init() } /** - * + * * rct2: 0x0066729F */ void park_reset_history() @@ -132,7 +132,7 @@ void park_reset_history() } /** - * + * * rct2: 0x0066A348 */ int park_calculate_size() @@ -154,12 +154,12 @@ int park_calculate_size() RCT2_GLOBAL(RCT2_ADDRESS_PARK_SIZE, uint16) = tiles; window_invalidate_by_class(WC_PARK_INFORMATION); } - + return tiles; } /** - * + * * rct2: 0x00669EAA */ int calculate_park_rating() @@ -172,14 +172,14 @@ int calculate_park_rating() result = 1150; if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_DIFFICULT_PARK_RATING) result = 1050; - + // Guests { rct_peep* peep; uint16 spriteIndex; int num_happy_peeps; int num_lost_guests; - + // -150 to +3 based on a range of guests from 0 to 2000 result -= 150 - (min(2000, RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16)) / 13); @@ -194,7 +194,7 @@ int calculate_park_rating() if ((peep->flags & PEEP_FLAGS_LEAVING_PARK) && (peep->peep_is_lost_countdown < 90)) num_lost_guests++; } - + // Peep happiness -500 to +0 result -= 500; @@ -270,7 +270,7 @@ int calculate_park_rating() } result -= 600 - (4 * (150 - min(150, num_litter))); } - + result -= RCT2_GLOBAL(0x0135882E, sint16); result = clamp(0, result, 999); return result; @@ -293,7 +293,7 @@ money32 calculate_ride_value(rct_ride *ride) } /** - * + * * rct2: 0x0066A3F6 */ money32 calculate_park_value() @@ -476,7 +476,7 @@ static rct_peep *park_generate_new_guest() peep = peep_generate(spawn.x, spawn.y, spawn.z * 16); if (peep != NULL) { peep->sprite_direction = spawn.direction << 3; - + // Get the centre point of the tile the peep is on peep->destination_x = (peep->x & 0xFFE0) + 16; peep->destination_y = (peep->y & 0xFFE0) + 16; @@ -722,7 +722,7 @@ void update_park_fences(int x, int y) return; if (y > 0x1FFF) return; - + rct_map_element* sufaceElement = map_get_surface_element_at(x / 32, y / 32); if (sufaceElement == NULL)return; @@ -735,7 +735,7 @@ void update_park_fences(int x, int y) do { if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE) continue; - + if (mapElement->properties.entrance.type != ENTRANCE_TYPE_PARK_ENTRANCE) continue; @@ -772,7 +772,7 @@ void update_park_fences(int x, int y) if (sufaceElement->properties.surface.ownership != newOwnership) { int z0 = sufaceElement->base_height * 8; int z1 = z0 + 16; - map_invalidate_tile(x, y, z0, z1); + map_invalidate_tile(x, y, z0, z1); sufaceElement->properties.surface.ownership = newOwnership; } } @@ -926,7 +926,7 @@ money32 map_buy_land_rights_for_tile(int x, int y, int setting, int flags) { if ((surfaceElement->properties.surface.ownership & OWNERSHIP_OWNED) != 0) { // If the land is already owned return 0; } - + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) != 0 || (surfaceElement->properties.surface.ownership & OWNERSHIP_AVAILABLE) == 0) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 1726; // Land not for sale! return MONEY32_UNDEFINED; @@ -954,12 +954,12 @@ money32 map_buy_land_rights_for_tile(int x, int y, int setting, int flags) { if ((surfaceElement->properties.surface.ownership & (OWNERSHIP_OWNED | OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED)) != 0) { // If the land or construction rights are already owned return 0; } - + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) != 0 || (surfaceElement->properties.surface.ownership & OWNERSHIP_CONSTRUCTION_RIGHTS_AVAILABLE) == 0) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 1727; // Construction rights not for sale! return MONEY32_UNDEFINED; } - + if (flags & GAME_COMMAND_FLAG_APPLY) { surfaceElement->properties.surface.ownership |= OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED; uint16 baseHeight = surfaceElement->base_height * 8; @@ -1122,7 +1122,7 @@ void park_remove_ghost_entrance() } /** - * + * * rct2: 0x00666F4E */ money32 park_place_ghost_entrance(int x, int y, int z, int direction) diff --git a/src/world/park.h b/src/world/park.h index 349bf96c6c..5f24a295e4 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/src/world/scenery.c b/src/world/scenery.c index 5075173d7f..9974593d96 100644 --- a/src/world/scenery.c +++ b/src/world/scenery.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -94,7 +94,7 @@ void scenery_update_age(int x, int y, rct_map_element *mapElement) break; } } - + // Reset age / water plant mapElement->properties.scenery.age = 0; map_invalidate_tile_zoom1(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); @@ -125,12 +125,12 @@ void scenery_remove_ghost_tool_placement(){ if (RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 0)){ RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 0); game_do_command( - x, + x, 105 | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT_TYPE, uint8) << 8), - y, + y, z | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_SELECTED_OBJECT, uint8) << 8), GAME_COMMAND_REMOVE_SCENERY, - 0, + 0, 0); } diff --git a/src/world/scenery.h b/src/world/scenery.h index 5a724d67d8..2dc30ba3e9 100644 --- a/src/world/scenery.h +++ b/src/world/scenery.h @@ -92,7 +92,7 @@ typedef struct { uint8 flags2; // 0x09 sint16 price; // 0x0A uint8 scenery_tab_id; // 0x0C - uint8 var_0D; + uint8 var_0D; } rct_wall_scenery_entry; typedef enum { @@ -164,7 +164,7 @@ enum { #define g_wallSceneryEntries ((rct_scenery_entry**)object_entry_groups[OBJECT_TYPE_WALLS].chunks) #define g_bannerSceneryEntries ((rct_scenery_entry**)object_entry_groups[OBJECT_TYPE_BANNERS].chunks) -// Often 0x009ADA50 is used for pathBits this is 1 entry before g_pathBitSceneryEntries and is used +// Often 0x009ADA50 is used for pathBits this is 1 entry before g_pathBitSceneryEntries and is used // because 0 represents no path bits on a path. So remember to remove 1 when using it for 0x009ADA50 #define g_pathBitSceneryEntries ((rct_scenery_entry**)object_entry_groups[OBJECT_TYPE_PATH_BITS].chunks) #define g_scenerySetEntries ((rct_scenery_set_entry**)object_entry_groups[OBJECT_TYPE_SCENERY_SETS].chunks) diff --git a/src/world/sprite.c b/src/world/sprite.c index 507452b870..65d7c8c5c1 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ @@ -156,7 +156,7 @@ void sprite_clear_all_unused() { rct_unk_sprite *sprite; uint16 spriteIndex, nextSpriteIndex, previousSpriteIndex; - + spriteIndex = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_NEXT_INDEX, uint16); while (spriteIndex != SPRITE_INDEX_NULL) { sprite = &g_sprite_list[spriteIndex].unknown; @@ -219,7 +219,7 @@ rct_sprite *create_sprite(uint8 bl) /* * rct2: 0x0069ED0B * This function moves a sprite to the specified sprite linked list. -* There are 5/6 of those, and cl specifies a pointer offset +* There are 5/6 of those, and cl specifies a pointer offset * of the desired linked list in a uint16 array. Known valid values are * 2, 4, 6, 8 or 10 (SPRITE_LINKEDLIST_OFFSET_...) */ @@ -231,7 +231,7 @@ void move_sprite_to_list(rct_sprite *sprite, uint8 cl) if (unkSprite->linked_list_type_offset == cl) return; - // If the sprite is currently the head of the list, the + // If the sprite is currently the head of the list, the // sprite following this one becomes the new head of the list. if (unkSprite->previous == SPRITE_INDEX_NULL) { diff --git a/src/world/sprite.h b/src/world/sprite.h index aac3084c94..89fdb512d2 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -8,12 +8,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ diff --git a/test/tests.c b/test/tests.c index 487306343d..6963f14517 100644 --- a/test/tests.c +++ b/test/tests.c @@ -41,7 +41,7 @@ int cmdline_for_test(const char **argv, int argc) CuSuite* new_suite(void) { CuSuite* suite = CuSuiteNew(); - + // Test Finance SUITE_ADD_TEST(suite, test_finance_setup); SUITE_ADD_TEST(suite, test_finance_loan_increase); From 610a7d6954ea63f7f01772533338efd7b6a14cfe Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 20 Oct 2015 20:40:17 +0100 Subject: [PATCH 0862/1173] Fix #2095. Bitscanforward needs to return -1 if nothing found. --- src/util/util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/util/util.c b/src/util/util.c index d7f081357b..e980f4c2b8 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -144,8 +144,8 @@ int bitscanforward(int source) int i; #if _MSC_VER >= 1400 // Visual Studio 2005 - _BitScanForward(&i, source); - return i; + uint8 success = _BitScanForward(&i, source); + return success != 0 ? i : -1; #else for (i = 0; i < 32; i++) if (source & (1 << i)) From c097ce5b1345e58730b18ee04811a95cc87c384c Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 20 Oct 2015 21:36:09 +0100 Subject: [PATCH 0863/1173] fix #2064 --- src/ride/ride_ratings.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 48a69ac9cb..7e8b49d5f0 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -624,10 +624,12 @@ static void ride_ratings_calculate(rct_ride *ride) calcFunc(ride); } - // Prevent negative ratings - ride->ratings.excitement = max(0, ride->ratings.excitement); - ride->ratings.intensity = max(0, ride->ratings.intensity); - ride->ratings.nausea = max(0, ride->ratings.nausea); + if (ride->ratings.excitement != -1) { + // Prevent negative ratings + ride->ratings.excitement = max(0, ride->ratings.excitement); + ride->ratings.intensity = max(0, ride->ratings.intensity); + ride->ratings.nausea = max(0, ride->ratings.nausea); + } // Original ride calculation // calcFunc = RCT2_ADDRESS(0x0097E050, ride_ratings_calculation)[ride->type]; From be7d3d5b54a0a8a4a7c861648f1ff295b021bb7b Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 20 Oct 2015 22:15:48 +0100 Subject: [PATCH 0864/1173] do not do any sound / music operations when in headless mode --- src/audio/mixer.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index ef0b5a6f7f..5e9df6fef2 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -22,6 +22,7 @@ extern "C" { #include "../config.h" #include "../platform/platform.h" #include "../localisation/localisation.h" + #include "../openrct2.h" #include "audio.h" } #include "mixer.h" @@ -800,11 +801,15 @@ bool Mixer::Convert(SDL_AudioCVT& cvt, const uint8* data, unsigned long length, void Mixer_Init(const char* device) { + if (gOpenRCT2Headless) return; + gMixer.Init(device); } void* Mixer_Play_Effect(int id, int loop, int volume, float pan, double rate, int deleteondone) { + if (gOpenRCT2Headless) return 0; + if (!gConfigSound.sound) { return 0; } @@ -824,11 +829,15 @@ void* Mixer_Play_Effect(int id, int loop, int volume, float pan, double rate, in void Mixer_Stop_Channel(void* channel) { + if (gOpenRCT2Headless) return; + gMixer.Stop(*(Channel*)channel); } void Mixer_Channel_Volume(void* channel, int volume) { + if (gOpenRCT2Headless) return; + gMixer.Lock(); ((Channel*)channel)->SetVolume(volume); gMixer.Unlock(); @@ -836,6 +845,8 @@ void Mixer_Channel_Volume(void* channel, int volume) void Mixer_Channel_Pan(void* channel, float pan) { + if (gOpenRCT2Headless) return; + gMixer.Lock(); ((Channel*)channel)->SetPan(pan); gMixer.Unlock(); @@ -843,6 +854,8 @@ void Mixer_Channel_Pan(void* channel, float pan) void Mixer_Channel_Rate(void* channel, double rate) { + if (gOpenRCT2Headless) return; + gMixer.Lock(); ((Channel*)channel)->SetRate(rate); gMixer.Unlock(); @@ -850,26 +863,36 @@ void Mixer_Channel_Rate(void* channel, double rate) int Mixer_Channel_IsPlaying(void* channel) { + if (gOpenRCT2Headless) return false; + return ((Channel*)channel)->IsPlaying(); } unsigned long Mixer_Channel_GetOffset(void* channel) { + if (gOpenRCT2Headless) return 0; + return ((Channel*)channel)->GetOffset(); } int Mixer_Channel_SetOffset(void* channel, unsigned long offset) { + if (gOpenRCT2Headless) return 0; + return ((Channel*)channel)->SetOffset(offset); } void Mixer_Channel_SetGroup(void* channel, int group) { + if (gOpenRCT2Headless) return; + ((Channel*)channel)->SetGroup(group); } void* Mixer_Play_Music(int pathid, int loop, int streaming) { + if (gOpenRCT2Headless) return 0; + if (!gConfigSound.sound) { return 0; } @@ -907,5 +930,7 @@ void* Mixer_Play_Music(int pathid, int loop, int streaming) void Mixer_SetVolume(float volume) { + if (gOpenRCT2Headless) return; + gMixer.SetVolume(volume); } From 8e45cccb7a54e7a22dc86a0cd6b4610a29e0f57d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 20 Oct 2015 01:18:59 +0200 Subject: [PATCH 0865/1173] Minor fixes Includes (mostly) type fixes, dead code removal, signed vs unsigned comparison fixes, memory leaks removal. --- src/cmdline_sprite.c | 3 +++ src/config.c | 6 +++--- src/drawing/drawing.c | 6 +++--- src/drawing/drawing.h | 2 +- src/drawing/line.c | 6 +++--- src/drawing/rect.c | 4 ++-- src/drawing/scrolling_text.c | 4 ++-- src/drawing/sprite.c | 1 - src/drawing/string.c | 2 +- src/game.c | 2 -- src/interface/screenshot.c | 3 ++- src/interface/viewport.c | 8 ++++---- src/object.h | 2 +- src/object_list.c | 16 ++++++++-------- src/platform/shared.c | 2 +- src/ride/ride.c | 4 ++-- src/ride/track.c | 2 +- src/windows/ride.c | 7 +++---- src/windows/track_list.c | 9 +++++---- 19 files changed, 45 insertions(+), 44 deletions(-) diff --git a/src/cmdline_sprite.c b/src/cmdline_sprite.c index a967c211fe..d6a6e8b2ae 100644 --- a/src/cmdline_sprite.c +++ b/src/cmdline_sprite.c @@ -167,6 +167,7 @@ bool sprite_file_export(int spriteIndex, const char *outPath) pngError = lodepng_encode(&pngData, &pngSize, pixels, spriteHeader->width, spriteHeader->height, &pngState); if (pngError != 0) { + free(pngData); fprintf(stderr, "Error creating PNG data, %u: %s", pngError, lodepng_error_text(pngError)); return false; } else { @@ -247,6 +248,7 @@ bool sprite_file_import(const char *path, rct_g1_element *outElement, uint8 **ou pngError = lodepng_decode_file(&pixels, &width, &height, path, LCT_RGBA, 8); if (pngError != 0) { + free(pixels); fprintf(stderr, "Error creating PNG data, %u: %s", pngError, lodepng_error_text(pngError)); return false; } @@ -373,6 +375,7 @@ bool sprite_file_import(const char *path, rct_g1_element *outElement, uint8 **ou } } free(pixels); + free(src); int bufferLength = (int)(dst - buffer); buffer = realloc(buffer, bufferLength); diff --git a/src/config.c b/src/config.c index 3f45c323b9..33dfde27e2 100644 --- a/src/config.c +++ b/src/config.c @@ -373,7 +373,7 @@ bool config_save_default() bool config_open(const utf8string path) { SDL_RWops *file; - uint8 *lineBuffer; + utf8string lineBuffer; size_t lineBufferCapacity; size_t lineLength; int c; @@ -1216,7 +1216,7 @@ bool themes_save_preset(int preset) bool themes_open(const_utf8string path) { SDL_RWops *file; - uint8 *lineBuffer; + utf8string lineBuffer; size_t lineBufferCapacity; size_t lineLength; int c, preset; @@ -1255,7 +1255,7 @@ bool themes_open(const_utf8string path) // Skim UTF-8 byte order mark SDL_RWread(file, lineBuffer, 3, 1); - if (!(lineBuffer[0] == 0xEF && lineBuffer[1] == 0xBB && lineBuffer[2] == 0xBF)) + if (!(lineBuffer[0] == (utf8)0xEF && lineBuffer[1] == (utf8)0xBB && lineBuffer[2] == (utf8)0xBF)) SDL_RWseek(file, 0, SEEK_SET); while ((c = rwopsreadc(file)) != EOF) { diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index c1fac53c64..51ddca2b61 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -111,7 +111,7 @@ static void gfx_draw_dirty_blocks(int x, int y, int columns, int rows); void gfx_clear(rct_drawpixelinfo *dpi, int colour) { int y, w, h; - char* ptr; + uint8* ptr; w = dpi->width >> dpi->zoom_level; h = dpi->height >> dpi->zoom_level; @@ -149,7 +149,7 @@ void gfx_transpose_palette(int pal, unsigned char product) source_pointer += 3; dest_pointer += 4; } - platform_update_palette((char*)RCT2_ADDRESS_PALETTE, 10, 236); + platform_update_palette((uint8*)RCT2_ADDRESS_PALETTE, 10, 236); } /* rct2: 0x006837E3 */ @@ -175,7 +175,7 @@ void load_palette(){ source_pointer += 3; dest_pointer += 4; } - platform_update_palette((char*)RCT2_ADDRESS_PALETTE, 10, 236); + platform_update_palette((uint8*)RCT2_ADDRESS_PALETTE, 10, 236); } /** diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 302be8a37f..05125a9a38 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -26,7 +26,7 @@ // Size: 0x10 typedef struct { - char* bits; // 0x00 + uint8* bits; // 0x00 short x; // 0x04 short y; // 0x06 short width; // 0x08 diff --git a/src/drawing/line.c b/src/drawing/line.c index 82676eb376..c4697f7dea 100644 --- a/src/drawing/line.c +++ b/src/drawing/line.c @@ -53,13 +53,13 @@ void gfx_draw_line_on_buffer(rct_drawpixelinfo *dpi, char colour, int y, int x, if (no_pixels <= 0)return; } - char* bits_pointer; + uint8* bits_pointer; //Get the buffer we are drawing to and move to the first coordinate. bits_pointer = dpi->bits + y*(dpi->pitch + dpi->width) + x; //Draw the line to the specified colour for (; no_pixels > 0; --no_pixels, ++bits_pointer){ - *((uint8*)bits_pointer) = colour; + *bits_pointer = colour; } } @@ -147,4 +147,4 @@ void gfx_draw_line(rct_drawpixelinfo *dpi, int x1, int y1, int x2, int y2, int c } } return; -} \ No newline at end of file +} diff --git a/src/drawing/rect.c b/src/drawing/rect.c index 071875890a..26bb39c1e9 100644 --- a/src/drawing/rect.c +++ b/src/drawing/rect.c @@ -126,7 +126,7 @@ void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bot if (colour & 0x4000000){ //0x4000000 // 00678B8A 00678E38 - char* dest_pointer; + uint8* dest_pointer; dest_pointer = start_y * (dpi->width + dpi->pitch) + start_x + dpi->bits; //The pattern loops every 15 lines this is which @@ -142,7 +142,7 @@ void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bot pattern_pointer = RCT2_ADDRESS(0x0097FEFC,uint16*)[colour >> 28]; // or possibly uint8)[esi*4] ? for (int no_lines = height; no_lines > 0; no_lines--) { - char* next_dest_pointer = dest_pointer + dpi->width + dpi->pitch; + uint8* next_dest_pointer = dest_pointer + dpi->width + dpi->pitch; uint16 pattern = pattern_pointer[pattern_y]; for (int no_pixels = width; no_pixels > 0; --no_pixels) { diff --git a/src/drawing/scrolling_text.c b/src/drawing/scrolling_text.c index ed7a36a210..0e96e43166 100644 --- a/src/drawing/scrolling_text.c +++ b/src/drawing/scrolling_text.c @@ -24,7 +24,7 @@ void scrolling_text_initialise_bitmaps() { uint8 drawingSurface[64]; rct_drawpixelinfo dpi = { - .bits = (char*)&drawingSurface, + .bits = (uint8 *)&drawingSurface, .x = 0, .y = 0, .width = 8, @@ -135,7 +135,7 @@ int scrolling_text_setup(rct_string_id stringId, uint16 scroll, uint16 scrolling utf8 scrollString[256]; scrolling_text_format(scrollString, scrollText); - sint16* scrollingModePositions = RCT2_ADDRESS(RCT2_ADDRESS_SCROLLING_MODE_POSITIONS, uint16*)[scrollingMode]; + sint16* scrollingModePositions = RCT2_ADDRESS(RCT2_ADDRESS_SCROLLING_MODE_POSITIONS, sint16*)[scrollingMode]; memset(scrollText->bitmap, 0, 320 * 8); if (gUseTrueTypeFont) { diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index dcd3fbc683..d269e7d1c6 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -644,7 +644,6 @@ void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, in eax = 0; memcpy((char*)new_source_pointer, (char*)source_pointer, ecx); new_source_pointer += ecx; - source_pointer += ecx; source_pointer = (uint8*)ebx; } source_pointer = new_source_pointer_start + g1_source->width*source_start_y + source_start_x; diff --git a/src/drawing/string.c b/src/drawing/string.c index 3a11a1cdef..97206c6090 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -742,7 +742,7 @@ void gfx_draw_string_centred_wrapped_partial(rct_drawpixelinfo *dpi, int x, int static uint32 _ttf_surface_cache_hash(TTF_Font *font, const utf8 *text) { uint32 hash = ((uint32)font * 23) ^ 0xAAAAAAAA; - for (const uint8 *ch = text; *ch != 0; ch++) { + for (const utf8 *ch = text; *ch != 0; ch++) { hash = ror32(hash, 3) ^ (*ch * 13); } return hash; diff --git a/src/game.c b/src/game.c index ad6f2c4be4..684bab3c03 100644 --- a/src/game.c +++ b/src/game.c @@ -759,7 +759,6 @@ int game_load_sv6(SDL_RWops* rw) if (!load_success){ set_load_objects_fail_reason(); if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_5){ - RCT2_GLOBAL(0x14241BC, uint32) = 2; //call 0x0040705E Sets cursor position and something else. Calls maybe wind func 8 probably pointless RCT2_GLOBAL(0x14241BC, uint32) = 0; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) &= ~INPUT_FLAG_5; @@ -838,7 +837,6 @@ int game_load_network(SDL_RWops* rw) if (!load_success){ set_load_objects_fail_reason(); if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_5){ - RCT2_GLOBAL(0x14241BC, uint32) = 2; //call 0x0040705E Sets cursor position and something else. Calls maybe wind func 8 probably pointless RCT2_GLOBAL(0x14241BC, uint32) = 0; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) &= ~INPUT_FLAG_5; diff --git a/src/interface/screenshot.c b/src/interface/screenshot.c index 43c1584eec..5f32a308d5 100644 --- a/src/interface/screenshot.c +++ b/src/interface/screenshot.c @@ -142,7 +142,8 @@ int screenshot_dump_bmp() BitmapInfoHeader info; int i, y, index, width, height, stride; - char *buffer, path[MAX_PATH], *row; + char path[MAX_PATH]; + uint8 *buffer, *row; SDL_RWops *fp; unsigned int bytesWritten; diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 6adbf8b4d1..6b5635a32a 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -878,7 +878,7 @@ int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int edx, sint16 si, s void viewport_vehicle_paint_setup(rct_vehicle *vehicle, int imageDirection) { rct_ride_type *rideEntry; - rct_ride_type_vehicle *vehicleEntry; + const rct_ride_type_vehicle *vehicleEntry; int x = vehicle->x; int y = vehicle->y; @@ -1171,7 +1171,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma string_id = STR_RIDE_ENTRANCE_NAME; } - uint8 entrance_string[MAX_PATH]; + utf8 entrance_string[MAX_PATH]; if (gConfigGeneral.upper_case_banners) { format_string_to_upper(entrance_string, string_id, RCT2_ADDRESS(RCT2_ADDRESS_COMMON_FORMAT_ARGS, void)); } else { @@ -1275,7 +1275,7 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele park_text_id = 1731; } - uint8 park_name[MAX_PATH]; + utf8 park_name[MAX_PATH]; if (gConfigGeneral.upper_case_banners) { format_string_to_upper(park_name, park_text_id, RCT2_ADDRESS(RCT2_ADDRESS_COMMON_FORMAT_ARGS, void)); } else { @@ -2094,7 +2094,7 @@ static void viewport_draw_money_effects() do { format_string(buffer, ps->string_id, &ps->args); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = FONT_SPRITE_BASE_MEDIUM; - gfx_draw_string_with_y_offsets(&dpi, buffer, 0, ps->x, ps->y, ps->y_offsets); + gfx_draw_string_with_y_offsets(&dpi, buffer, 0, ps->x, ps->y, (sint8 *)ps->y_offsets); } while ((ps = ps->next) != NULL); } diff --git a/src/object.h b/src/object.h index a980e6d0c8..dfbfc30901 100644 --- a/src/object.h +++ b/src/object.h @@ -114,7 +114,7 @@ rct_object_entry *object_get_next(rct_object_entry *entry); int write_object_file(SDL_RWops* rw, rct_object_entry* entry); void reset_loaded_objects(); int find_object_in_entry_group(rct_object_entry* entry, uint8* entry_type, uint8* entry_index); -void object_create_identifier_name(uint8* string_buffer, rct_object_entry* object); +void object_create_identifier_name(char* string_buffer, const rct_object_entry* object); rct_object_entry *object_list_find(rct_object_entry *entry); diff --git a/src/object_list.c b/src/object_list.c index 3700aa7825..12410c6580 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -462,7 +462,7 @@ int check_object_entry(rct_object_entry *entry) } /* rct2: 0x006AB344 */ -void object_create_identifier_name(uint8* string_buffer, rct_object_entry* object){ +void object_create_identifier_name(char* string_buffer, const rct_object_entry* object){ for (uint8 i = 0; i < 8; ++i){ if (object->name[i] != ' '){ *string_buffer++ = object->name[i]; @@ -473,14 +473,14 @@ void object_create_identifier_name(uint8* string_buffer, rct_object_entry* objec for (uint8 i = 0; i < 4; ++i){ uint8 flag_part = (object->flags >> (i * 8)) & 0xFF; - *string_buffer++ = RCT2_ADDRESS(0x0098DA64, uint8)[flag_part >> 4]; - *string_buffer++ = RCT2_ADDRESS(0x0098DA64, uint8)[flag_part & 0xF]; + *string_buffer++ = RCT2_ADDRESS(0x0098DA64, char)[flag_part >> 4]; + *string_buffer++ = RCT2_ADDRESS(0x0098DA64, char)[flag_part & 0xF]; } for (uint8 i = 0; i < 4; ++i){ uint8 checksum_part = (object->checksum >> (i * 8)) & 0xFF; - *string_buffer++ = RCT2_ADDRESS(0x0098DA64, uint8)[checksum_part >> 4]; - *string_buffer++ = RCT2_ADDRESS(0x0098DA64, uint8)[checksum_part & 0xF]; + *string_buffer++ = RCT2_ADDRESS(0x0098DA64, char)[checksum_part >> 4]; + *string_buffer++ = RCT2_ADDRESS(0x0098DA64, char)[checksum_part & 0xF]; } *string_buffer++ = '\0'; } @@ -714,7 +714,7 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in memcpy(installed_entry_pointer, entry, sizeof(rct_object_entry)); installed_entry_pointer += sizeof(rct_object_entry); - strcpy(installed_entry_pointer, path); + strcpy((char *)installed_entry_pointer, path); while (*installed_entry_pointer++); // Chunk size is set to unknown @@ -772,11 +772,11 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in // Always extract only the vehicle type, since the track type is always displayed in the left column, to prevent duplicate track names. rct_string_id nameStringId = object_get_name_string_id(entry, chunk); - if (nameStringId == STR_NONE) { + if (nameStringId == (rct_string_id)STR_NONE) { nameStringId = (rct_string_id)RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_BASE_STRING_ID, uint32); } - strcpy(installed_entry_pointer, language_get_string(nameStringId)); + strcpy((char *)installed_entry_pointer, language_get_string(nameStringId)); while (*installed_entry_pointer++); // This is deceptive. Due to setting the total no images earlier to 0xF26E diff --git a/src/platform/shared.c b/src/platform/shared.c index d57a75dcb5..cfc13835f5 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -33,7 +33,7 @@ #include "../openrct2.h" #include "platform.h" -typedef void(*update_palette_func)(char*, int, int); +typedef void(*update_palette_func)(const uint8*, int, int); openrct2_cursor gCursorState; const unsigned char *gKeysState; diff --git a/src/ride/ride.c b/src/ride/ride.c index f1de4faae9..a233ca27b9 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5815,10 +5815,10 @@ void ride_all_has_any_track_elements(bool *rideIndexArray) /* rct2: 0x006847BA */ void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int num_images){ - char bitmap[200][200] = { 0 }; + uint8 bitmap[200][200] = { 0 }; rct_drawpixelinfo dpi = { - .bits = (char*)bitmap, + .bits = (uint8*)bitmap, .x = -100, .y = -100, .width = 200, diff --git a/src/ride/track.c b/src/ride/track.c index 682339b092..20ff56b066 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -2141,7 +2141,7 @@ void draw_track_preview(uint8** preview){ dpi->width = 370; dpi->height = 217; dpi->pitch = 0; - dpi->bits = (char*)preview; + dpi->bits = (uint8*)preview; top = y; left = x; diff --git a/src/windows/ride.c b/src/windows/ride.c index 4a0fa1c03d..ad2ed10b8d 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -2314,7 +2314,7 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi rct_ride_type *rideEntry, *currentRideEntry; rct_string_id stringId; int i, minCars, maxCars, cars, numItems, quadIndex, bitIndex, rideEntryIndex, selectedIndex, rideTypeIterator, rideTypeIteratorMax; - uint8 *rideEntryIndexPtr, *currentRideEntryIndex; + uint8 *rideEntryIndexPtr; bool selectionShouldBeExpanded; ride = GET_RIDE(w->number); @@ -2345,9 +2345,8 @@ static void window_ride_vehicle_mousedown(int widgetIndex, rct_window *w, rct_wi continue; rideEntryIndexPtr = get_ride_entry_indices_for_ride_type(rideTypeIterator); - currentRideEntryIndex; - for (currentRideEntryIndex = rideEntryIndexPtr; *currentRideEntryIndex != 0xFF; currentRideEntryIndex++) { + for (uint8 *currentRideEntryIndex = rideEntryIndexPtr; *currentRideEntryIndex != 0xFF; currentRideEntryIndex++) { rideEntryIndex = *currentRideEntryIndex; currentRideEntry = GET_RIDE_ENTRY(rideEntryIndex); // Skip if vehicle has the same track type, but not same subtype, unless subtype switching is enabled @@ -5802,7 +5801,7 @@ static void window_ride_income_paint(rct_window *w, rct_drawpixelinfo *dpi) // Running cost per hour costPerHour = ride->upkeep_cost * 16; - stringId = ride->upkeep_cost == 0xFFFF ? STR_RUNNING_COST_UNKNOWN : STR_RUNNING_COST_PER_HOUR; + stringId = ride->upkeep_cost == (money16)0xFFFF ? STR_RUNNING_COST_UNKNOWN : STR_RUNNING_COST_PER_HOUR; gfx_draw_string_left(dpi, stringId, &costPerHour, 0, x, y); y += 10; diff --git a/src/windows/track_list.c b/src/windows/track_list.c index fa9c2f1697..fda1413675 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -153,7 +153,7 @@ void window_track_list_open(ride_list_item item) */ static void window_track_list_select(rct_window *w, int index) { - uint8 *trackDesignItem, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8); + utf8 *trackDesignItem, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, utf8); rct_track_design *trackDesign; w->track_list.var_480 = index; @@ -172,7 +172,7 @@ static void window_track_list_select(rct_window *w, int index) index--; trackDesignItem = trackDesignList + (index * 128); - RCT2_GLOBAL(0x00F4403C, uint8*) = trackDesignItem; + RCT2_GLOBAL(0x00F4403C, utf8*) = trackDesignItem; window_track_list_format_name( (char*)0x009BC313, @@ -382,7 +382,8 @@ static void window_track_list_paint(rct_window *w, rct_drawpixelinfo *dpi) { rct_widget *widget; rct_track_design *trackDesign = NULL; - uint8 *image, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8); + uint8 *image; + utf8 *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, utf8); uint16 holes, speed, drops, dropHeight, inversions; fixed32_2dp rating; int trackIndex, x, y, colour, gForces, airTime; @@ -559,7 +560,7 @@ static void window_track_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, { rct_string_id stringId, stringId2; int i, x, y, colour; - uint8 *trackDesignItem, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8); + utf8 *trackDesignItem, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, utf8); colour = RCT2_GLOBAL(0x00141FC48 + (w->colours[0] * 8), uint8); colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; From 17b906b3a0c07e71c3c3fbf010e8f7215ec4233c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Wed, 21 Oct 2015 09:10:43 +0200 Subject: [PATCH 0866/1173] Use SDL_RWsize to get size info --- src/util/util.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/util/util.c b/src/util/util.c index 2189de7e91..467172aed7 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -125,9 +125,7 @@ bool readentirefile(const utf8 *path, void **outBuffer, int *outLength) return 0; // Get length - SDL_RWseek(fp, 0, RW_SEEK_END); - fpLength = (int)SDL_RWtell(fp); - SDL_RWseek(fp, 0, RW_SEEK_SET); + fpLength = (int)SDL_RWsize(fp); // Read whole file into a buffer fpBuffer = malloc(fpLength); From 717d18c9e99a748c3ed1258d129635a2c01a48cd Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 21 Oct 2015 21:02:15 +0100 Subject: [PATCH 0867/1173] add XP msbuild configuration --- projects/language/language.vcxproj | 43 ++++++++++-- projects/libs/libs.vcxproj | 61 ++++++++++++++--- projects/openrct2.sln | 9 ++- projects/openrct2.vcxproj | 102 ++++++++++++++++++++--------- projects/openrct2.vcxproj.user | 13 ++-- 5 files changed, 175 insertions(+), 53 deletions(-) diff --git a/projects/language/language.vcxproj b/projects/language/language.vcxproj index fe2b874ec2..4df11124bc 100644 --- a/projects/language/language.vcxproj +++ b/projects/language/language.vcxproj @@ -5,14 +5,18 @@ Debug Win32 - - Release with Tests - Win32 - Release Win32 + + Release + Win32 + + + Release with Tests + Win32 + {0468FC1E-5881-4DB9-9DDE-1892290B31D9} @@ -32,6 +36,13 @@ true MultiByte + + Utility + false + v140_xp + true + MultiByte + Utility false @@ -48,6 +59,9 @@ + + + @@ -60,6 +74,10 @@ $(SolutionDir)..\build\$(Configuration)\ $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ + + $(SolutionDir)..\build\$(Configuration)\ + $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ + $(SolutionDir)..\build\Release\ $(SolutionDir)..\obj\$(ProjectName)\Release\ @@ -94,6 +112,23 @@ xcopy /Y "$(SolutionDir)\..\Data\Language\*.*" "$(TargetDir)\Data\Language\" + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + xcopy /Y "$(SolutionDir)\..\Data\Language\*.*" "$(TargetDir)\Data\Language\" + + Level3 diff --git a/projects/libs/libs.vcxproj b/projects/libs/libs.vcxproj index e39d321bdf..aa57182937 100644 --- a/projects/libs/libs.vcxproj +++ b/projects/libs/libs.vcxproj @@ -5,14 +5,18 @@ Debug Win32 - - Release with Tests - Win32 - Release Win32 + + Release XP + Win32 + + + Release with Tests + Win32 + {074DC930-05C6-4B7F-B5DD-DD237E6E44DB} @@ -32,6 +36,13 @@ true MultiByte + + StaticLibrary + false + v140_xp + true + MultiByte + StaticLibrary false @@ -48,6 +59,9 @@ + + + @@ -64,6 +78,12 @@ ..\..\lib\libcurl\include;..\..\lib\jansson;..\..\lib\cutest\CuTest.h;..\..\lib\SDL2_ttf\include;$(IncludePath) ..\..\lib\libcurl\lib;..\..\lib\SDL2_ttf\lib\x86;$(LibraryPath) + + $(SolutionDir)..\build\$(Configuration)\ + $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ + ..\..\lib\libcurl\include;..\..\lib\jansson;..\..\lib\cutest\CuTest.h;..\..\lib\SDL2_ttf\include;$(IncludePath) + ..\..\lib\libcurl\lib;..\..\lib\SDL2_ttf\lib\x86;$(LibraryPath) + $(SolutionDir)..\build\Release\ $(SolutionDir)..\obj\$(ProjectName)\Release\ @@ -115,6 +135,31 @@ Powershell -NonInteractive -ExecutionPolicy "ByPass" -File "$(ProjectDir)../../pre-build.ps1" + + + Level3 + MaxSpeed + true + true + true + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;NS_ENABLE_THREADS;NS_ENABLE_SSL;DISABLE_MD5;%(PreprocessorDefinitions) + MultiThreaded + 1Byte + + + + + true + true + true + + + libcurl.lib;Ws2_32.lib;SDL2_ttf.lib;%(AdditionalDependencies) + + + Powershell -NonInteractive -ExecutionPolicy "ByPass" -File "$(ProjectDir)../../pre-build.ps1" + + Level3 @@ -142,9 +187,7 @@ - TurnOffAllWarnings - TurnOffAllWarnings - TurnOffAllWarnings + TurnOffAllWarnings @@ -159,9 +202,7 @@ - TurnOffAllWarnings - TurnOffAllWarnings - TurnOffAllWarnings + TurnOffAllWarnings diff --git a/projects/openrct2.sln b/projects/openrct2.sln index 500b31b2fe..2a6c7dccd4 100644 --- a/projects/openrct2.sln +++ b/projects/openrct2.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2015 +# Visual Studio 14 VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openrct2", "openrct2.vcxproj", "{D24D94F6-2A74-480C-B512-629C306CE92F}" @@ -16,6 +16,7 @@ Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release with Tests|Win32 = Release with Tests|Win32 + Release XP|Win32 = Release XP|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution @@ -23,18 +24,24 @@ Global {D24D94F6-2A74-480C-B512-629C306CE92F}.Debug|Win32.Build.0 = Debug|Win32 {D24D94F6-2A74-480C-B512-629C306CE92F}.Release with Tests|Win32.ActiveCfg = Release with Tests|Win32 {D24D94F6-2A74-480C-B512-629C306CE92F}.Release with Tests|Win32.Build.0 = Release with Tests|Win32 + {D24D94F6-2A74-480C-B512-629C306CE92F}.Release XP|Win32.ActiveCfg = Release XP|Win32 + {D24D94F6-2A74-480C-B512-629C306CE92F}.Release XP|Win32.Build.0 = Release XP|Win32 {D24D94F6-2A74-480C-B512-629C306CE92F}.Release|Win32.ActiveCfg = Release|Win32 {D24D94F6-2A74-480C-B512-629C306CE92F}.Release|Win32.Build.0 = Release|Win32 {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Debug|Win32.ActiveCfg = Debug|Win32 {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Debug|Win32.Build.0 = Debug|Win32 {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Release with Tests|Win32.ActiveCfg = Release with Tests|Win32 {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Release with Tests|Win32.Build.0 = Release with Tests|Win32 + {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Release XP|Win32.ActiveCfg = Release with Tests|Win32 + {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Release XP|Win32.Build.0 = Release with Tests|Win32 {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Release|Win32.ActiveCfg = Release|Win32 {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Release|Win32.Build.0 = Release|Win32 {074DC930-05C6-4B7F-B5DD-DD237E6E44DB}.Debug|Win32.ActiveCfg = Debug|Win32 {074DC930-05C6-4B7F-B5DD-DD237E6E44DB}.Debug|Win32.Build.0 = Debug|Win32 {074DC930-05C6-4B7F-B5DD-DD237E6E44DB}.Release with Tests|Win32.ActiveCfg = Release with Tests|Win32 {074DC930-05C6-4B7F-B5DD-DD237E6E44DB}.Release with Tests|Win32.Build.0 = Release with Tests|Win32 + {074DC930-05C6-4B7F-B5DD-DD237E6E44DB}.Release XP|Win32.ActiveCfg = Release XP|Win32 + {074DC930-05C6-4B7F-B5DD-DD237E6E44DB}.Release XP|Win32.Build.0 = Release XP|Win32 {074DC930-05C6-4B7F-B5DD-DD237E6E44DB}.Release|Win32.ActiveCfg = Release|Win32 {074DC930-05C6-4B7F-B5DD-DD237E6E44DB}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 001832c924..ea6a74ab68 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -10,14 +10,18 @@ Debug Win32 - - Release with Tests - Win32 - Release Win32 + + Release XP + Win32 + + + Release with Tests + Win32 + @@ -45,12 +49,7 @@ - - - - - - + @@ -103,10 +102,7 @@ - - - - + @@ -178,12 +174,7 @@ - - - - - - + @@ -221,12 +212,7 @@ - - - - - - + @@ -316,6 +302,13 @@ true MultiByte + + DynamicLibrary + false + v140_xp + true + MultiByte + DynamicLibrary false @@ -332,6 +325,9 @@ + + + @@ -347,15 +343,18 @@ $(SolutionDir)..\lib\sdl\lib\x86;$(SolutionDir)..\lib\libcurl\lib;$(LibraryPath) $(SolutionDir)..\build\$(Configuration)\ $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ - - + + + $(SolutionDir)..\lib;$(SolutionDir)..\lib\libspeex;$(SolutionDir)..\lib\sdl\include;$(SolutionDir)..\lib\libcurl\include;$(SolutionDir)..\lib\jansson;$(SolutionDir)..\lib\cutest;$(SolutionDir)..\lib\SDL2_ttf\include;$(IncludePath) + $(SolutionDir)..\lib\sdl\lib\x86;$(SolutionDir)..\lib\libcurl\lib;$(LibraryPath) + $(SolutionDir)..\build\$(Configuration)\ + $(SolutionDir)..\obj\$(ProjectName)\$(Configuration)\ $(SolutionDir)..\lib;$(SolutionDir)..\lib\libspeex;$(SolutionDir)..\lib\sdl\include;$(SolutionDir)..\lib\libcurl\include;$(SolutionDir)..\lib\jansson;$(SolutionDir)..\lib\cutest;$(SolutionDir)..\lib\SDL2_ttf\include;$(IncludePath) $(SolutionDir)..\lib\sdl\lib\x86;$(SolutionDir)..\lib\libcurl\lib;$(LibraryPath) $(SolutionDir)..\build\Release\ $(SolutionDir)..\obj\$(ProjectName)\Release\ - @@ -403,11 +402,52 @@ xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" true true true - winmm.lib;sdl2.lib;Dsound.lib;%(AdditionalDependencies) + winmm.lib;sdl2.lib;%(AdditionalDependencies) /ignore:4099 %(AdditionalOptions) "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\..\Data\g2.dat" "$(SolutionDir)\..\Resources\g2\" +xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" + Build g2.dat and copy the Data directory. + + + + + + + + + + + + + Level3 + Full + true + true + + + MultiThreaded + 1Byte + 4013 + + + false + DISABLE_NETWORK;DISABLE_HTTP;DISABLE_TWITCH;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;SDL_MAIN_HANDLED;%(PreprocessorDefinitions) + $(IntDir)fake\%(RelativeDir) + true + Speed + + + true + true + true + winmm.lib;sdl2.lib;%(AdditionalDependencies) + /ignore:4099 %(AdditionalOptions) + Windows + + + "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\..\Data\g2.dat" "$(SolutionDir)\..\Resources\g2\" xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" Build g2.dat and copy the Data directory. @@ -442,7 +482,7 @@ xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" true true true - winmm.lib;sdl2.lib;Dsound.lib;%(AdditionalDependencies) + winmm.lib;sdl2.lib;%(AdditionalDependencies) /ignore:4099 %(AdditionalOptions) diff --git a/projects/openrct2.vcxproj.user b/projects/openrct2.vcxproj.user index e10da7a3ba..e977faccec 100644 --- a/projects/openrct2.vcxproj.user +++ b/projects/openrct2.vcxproj.user @@ -14,16 +14,15 @@ $(TargetDir)\openrct2.exe + + $(TargetDir) + WindowsLocalDebugger + $(TargetDir)\openrct2.exe + + $(TargetDir) WindowsLocalDebugger $(TargetDir)\openrct2.exe - - $(TargetDir)\openrct2.exe - WindowsLocalDebugger - $(TargetDir) - - - \ No newline at end of file From 00ff795d0442b422892434de9adfd654d1ccbb89 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 21 Oct 2015 21:06:15 +0100 Subject: [PATCH 0868/1173] hide multiplayer button if network is disabled --- src/windows/title_menu.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/windows/title_menu.c b/src/windows/title_menu.c index a42588d59c..ddc684d58f 100644 --- a/src/windows/title_menu.c +++ b/src/windows/title_menu.c @@ -112,6 +112,11 @@ void window_title_menu_open() // Disable tutorial button window->disabled_widgets = (1 << WIDX_SHOW_TUTORIAL); +#if DISABLE_NETWORK + // Disable multiplayer + window->widgets[WIDX_MULTIPLAYER].type = WWT_EMPTY; +#endif + window_init_scroll_widgets(window); } @@ -190,14 +195,18 @@ static void window_title_menu_cursor(rct_window *w, int widgetIndex, int x, int static void window_title_menu_paint(rct_window *w, rct_drawpixelinfo *dpi) { gfx_fill_rect(dpi, w->x, w->y, w->x + w->width - 1, w->y + 82 - 1, 0x2000000 | 51); - gfx_fill_rect( - dpi, - w->x + window_title_menu_widgets[WIDX_MULTIPLAYER].left, - w->y + window_title_menu_widgets[WIDX_MULTIPLAYER].top, - w->x + window_title_menu_widgets[WIDX_MULTIPLAYER].right, - w->y + window_title_menu_widgets[WIDX_MULTIPLAYER].bottom, - 0x2000000 | 51 - ); + + rct_widget *multiplayerButtonWidget = &window_title_menu_widgets[WIDX_MULTIPLAYER]; + if (multiplayerButtonWidget->type != WWT_EMPTY) { + gfx_fill_rect( + dpi, + w->x + multiplayerButtonWidget->left, + w->y + multiplayerButtonWidget->top, + w->x + multiplayerButtonWidget->right, + w->y + multiplayerButtonWidget->bottom, + 0x2000000 | 51 + ); + } window_draw_widgets(w, dpi); } From 67cf1495e199b857a0b6405402e40491ded267e9 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 21 Oct 2015 21:09:39 +0100 Subject: [PATCH 0869/1173] fix msbuild XP configration mistake for language project --- projects/language/language.vcxproj | 2 +- projects/openrct2.sln | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/language/language.vcxproj b/projects/language/language.vcxproj index 4df11124bc..071a041562 100644 --- a/projects/language/language.vcxproj +++ b/projects/language/language.vcxproj @@ -10,7 +10,7 @@ Win32 - Release + Release XP Win32 diff --git a/projects/openrct2.sln b/projects/openrct2.sln index 2a6c7dccd4..5667f3043f 100644 --- a/projects/openrct2.sln +++ b/projects/openrct2.sln @@ -32,8 +32,8 @@ Global {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Debug|Win32.Build.0 = Debug|Win32 {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Release with Tests|Win32.ActiveCfg = Release with Tests|Win32 {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Release with Tests|Win32.Build.0 = Release with Tests|Win32 - {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Release XP|Win32.ActiveCfg = Release with Tests|Win32 - {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Release XP|Win32.Build.0 = Release with Tests|Win32 + {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Release XP|Win32.ActiveCfg = Release XP|Win32 + {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Release XP|Win32.Build.0 = Release XP|Win32 {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Release|Win32.ActiveCfg = Release|Win32 {0468FC1E-5881-4DB9-9DDE-1892290B31D9}.Release|Win32.Build.0 = Release|Win32 {074DC930-05C6-4B7F-B5DD-DD237E6E44DB}.Debug|Win32.ActiveCfg = Debug|Win32 From 06b13794ea2a06740b5e58cc296bc05928c295d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 22 Oct 2015 10:15:45 +0200 Subject: [PATCH 0870/1173] Use const for parameters In profiling, gfx_rle_sprite_to_buffer turns out to be a hot spot. Use const pointers, so compiler can make more assumptions regarding them and perhaps optimize more heavily. --- src/drawing/drawing.h | 2 +- src/drawing/sprite.c | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 05125a9a38..45baa09cdf 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -109,7 +109,7 @@ int gfx_load_g1(); int gfx_load_g2(); void sub_68371D(); void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, uint8* source_pointer, uint8* dest_pointer, rct_g1_element* source_image, rct_drawpixelinfo *dest_dpi, int height, int width, int image_type); -void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_pointer, uint8* palette_pointer, rct_drawpixelinfo *dpi, int image_type, int source_y_start, int height, int source_x_start, int width); +void gfx_rle_sprite_to_buffer(const uint8* source_bits_pointer, uint8* dest_bits_pointer, const uint8* palette_pointer, const rct_drawpixelinfo *dpi, int image_type, int source_y_start, int height, int source_x_start, int width); void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint32 tertiary_colour); void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint8* palette_pointer, uint8* unknown_pointer); void gfx_draw_sprite_raw_masked(rct_drawpixelinfo *dpi, int x, int y, int maskImage, int colourImage); diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index d269e7d1c6..918321f0a5 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -258,11 +258,10 @@ void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, ui * This function copies the sprite data onto the screen * rct2: 0x0067AA18 */ -void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_pointer, uint8* palette_pointer, rct_drawpixelinfo *dpi, int image_type, int source_y_start, int height, int source_x_start, int width){ +void gfx_rle_sprite_to_buffer(const uint8* source_bits_pointer, uint8* dest_bits_pointer, const uint8* palette_pointer, const rct_drawpixelinfo *dpi, int image_type, int source_y_start, int height, int source_x_start, int width){ int zoom_level = dpi->zoom_level; int zoom_amount = 1 << zoom_level; int zoom_mask = 0xFFFFFFFF << zoom_level; - uint8* next_source_pointer; uint8* next_dest_pointer = dest_bits_pointer; int line_width = (dpi->width >> zoom_level) + dpi->pitch; @@ -278,13 +277,13 @@ void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_point //The first part of the source pointer is a list of offsets to different lines //This will move the pointer to the correct source line. - next_source_pointer = source_bits_pointer + ((uint16*)source_bits_pointer)[y]; + const uint8 *next_source_pointer = source_bits_pointer + ((uint16*)source_bits_pointer)[y]; uint8 last_data_line = 0; //For every data section in the line while (!last_data_line){ - uint8* source_pointer = next_source_pointer; + const uint8* source_pointer = next_source_pointer; uint8* dest_pointer = next_dest_pointer; int no_pixels = *source_pointer++; From 2e52fac0ca2f887195b047f49711c35410fe5093 Mon Sep 17 00:00:00 2001 From: nightroan Date: Thu, 22 Oct 2015 01:17:30 -0700 Subject: [PATCH 0871/1173] Testing or opening a ride only closes the construction window for that ride. --- src/ride/ride.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index a233ca27b9..78e657938c 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4452,7 +4452,7 @@ int ride_is_valid_for_test(int rideIndex, int goingToBeOpen, int isApplying) ride = GET_RIDE(rideIndex); - window_close_by_class(WC_RIDE_CONSTRUCTION); + window_close_by_number(WC_RIDE_CONSTRUCTION, rideIndex); stationIndex = ride_mode_check_station_present(ride); if (stationIndex == -1)return 0; @@ -4575,7 +4575,7 @@ int ride_is_valid_for_open(int rideIndex, int goingToBeOpen, int isApplying) ride = GET_RIDE(rideIndex); - window_close_by_class(WC_RIDE_CONSTRUCTION); + window_close_by_number(WC_RIDE_CONSTRUCTION, rideIndex); stationIndex = ride_mode_check_station_present(ride); if (stationIndex == -1)return 0; From cd60c354172f60a33ea291308d0ee4d0b819e298 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 22 Oct 2015 19:55:03 +0200 Subject: [PATCH 0872/1173] Add myself to contributor list --- contributors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contributors.md b/contributors.md index aff87d6c53..5000298a47 100644 --- a/contributors.md +++ b/contributors.md @@ -61,6 +61,7 @@ Includes all git commit authors. Aliases are GitHub user names. * Miso Zmiric (mzmiric5) - OSX * Jarno Veuger (JarnoVgr) - Windows build server * Ted John (IntelOrca) - Windows +* Michał Janiszewski (janisozaur) - Linux, Travis CI ## Documentation * (honzi) From 18c867a6fe4a2a994d8b14a048e42fae5696c346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 22 Oct 2015 19:47:58 +0200 Subject: [PATCH 0873/1173] Modify inline assembly to properly returns results Both RCT2_CALLFUNC_X and RCT2_CALLPROC_X did not really return any value, even though declared to return an int. The inlines are now modified to properly return flags (`lahf`), with other contents zeroed out. --- src/addresses.h | 149 ++++++++++++++++++++++++++---------------------- 1 file changed, 82 insertions(+), 67 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 48ce7eab4a..19eeb5c03c 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -676,6 +676,7 @@ */ static int RCT2_CALLPROC_X(int address, int _eax, int _ebx, int _ecx, int _edx, int _esi, int _edi, int _ebp) { + int result; #ifdef _MSC_VER __asm { push ebp @@ -691,10 +692,12 @@ static int RCT2_CALLPROC_X(int address, int _eax, int _ebx, int _ecx, int _edx, lahf pop ebp pop ebp + /* Load result with flags */ + mov result, eax } #else __asm__ ( "\ - \n\ + \n\ push ebx \n\ push ebp \n\ push %[address] \n\ @@ -710,11 +713,15 @@ static int RCT2_CALLPROC_X(int address, int _eax, int _ebx, int _ecx, int _edx, add esp, 4 \n\ pop ebp \n\ pop ebx \n\ - " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp) + /* Load result with flags */ \n\ + mov %[result], eax \n\ + " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp), [result] "+m" (result) : : "eax","ecx","edx","esi","edi" ); #endif + // lahf only modifies ah, zero out the rest + return result & 0xFF00; } static int RCT2_CALLPROC_EBPSAFE(int address) @@ -735,6 +742,7 @@ static int RCT2_CALLPROC_EBPSAFE(int address) */ static int RCT2_CALLFUNC_X(int address, int *_eax, int *_ebx, int *_ecx, int *_edx, int *_esi, int *_edi, int *_ebp) { + int result; #ifdef _MSC_VER __asm { // Store C's base pointer @@ -802,78 +810,85 @@ static int RCT2_CALLFUNC_X(int address, int *_eax, int *_ebx, int *_ecx, int *_e pop ebx pop ebp + /* Load result with flags */ + mov result, eax } #else __asm__ ( "\ - \n\ - /* Store C's base pointer*/ \n\ - push ebp \n\ - push ebx \n\ - \n\ - /* Store %[address] to call*/ \n\ - push %[address] \n\ - \n\ - /* Set all registers to the input values*/ \n\ - mov eax, [%[_eax]] \n\ - mov eax, [eax] \n\ - mov ebx, [%[_ebx]] \n\ - mov ebx, [ebx] \n\ - mov ecx, [%[_ecx]] \n\ - mov ecx, [ecx] \n\ - mov edx, [%[_edx]] \n\ - mov edx, [edx] \n\ - mov esi, [%[_esi]] \n\ - mov esi, [esi] \n\ - mov edi, [%[_edi]] \n\ - mov edi, [edi] \n\ - mov ebp, [%[_ebp]] \n\ - mov ebp, [ebp] \n\ - \n\ - /* Call function*/ \n\ - call [esp] \n\ - \n\ - /* Store output eax */ \n\ - push eax \n\ - push ebp \n\ - push ebx \n\ - mov ebp, [esp + 20] \n\ - mov ebx, [esp + 16] \n\ - /* Get resulting ecx, edx, esi, edi registers*/ \n\ - mov eax, [%[_edi]] \n\ - mov [eax], edi \n\ - mov eax, [%[_esi]] \n\ - mov [eax], esi \n\ - mov eax, [%[_edx]] \n\ - mov [eax], edx \n\ - mov eax, [%[_ecx]] \n\ - mov [eax], ecx \n\ - /* Pop ebx reg into ecx*/ \n\ - pop ecx \n\ - mov eax, [%[_ebx]] \n\ - mov [eax], ecx \n\ - \n\ - /* Pop ebp reg into ecx */\n\ - pop ecx \n\ - mov eax, [%[_ebp]] \n\ - mov [eax], ecx \n\ - \n\ - pop eax \n\ - /* Get resulting eax register*/ \n\ - mov ecx, [%[_eax]] \n\ - mov [ecx], eax \n\ - \n\ - /* Save flags as return in eax*/ \n\ - lahf \n\ - /* Pop address*/ \n\ - pop ebp \n\ - \n\ - pop ebx \n\ - pop ebp \n\ - " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp) + \n\ + /* Store C's base pointer*/ \n\ + push ebp \n\ + push ebx \n\ + \n\ + /* Store %[address] to call*/ \n\ + push %[address] \n\ + \n\ + /* Set all registers to the input values*/ \n\ + mov eax, [%[_eax]] \n\ + mov eax, [eax] \n\ + mov ebx, [%[_ebx]] \n\ + mov ebx, [ebx] \n\ + mov ecx, [%[_ecx]] \n\ + mov ecx, [ecx] \n\ + mov edx, [%[_edx]] \n\ + mov edx, [edx] \n\ + mov esi, [%[_esi]] \n\ + mov esi, [esi] \n\ + mov edi, [%[_edi]] \n\ + mov edi, [edi] \n\ + mov ebp, [%[_ebp]] \n\ + mov ebp, [ebp] \n\ + \n\ + /* Call function*/ \n\ + call [esp] \n\ + \n\ + /* Store output eax */ \n\ + push eax \n\ + push ebp \n\ + push ebx \n\ + mov ebp, [esp + 20] \n\ + mov ebx, [esp + 16] \n\ + /* Get resulting ecx, edx, esi, edi registers*/ \n\ + mov eax, [%[_edi]] \n\ + mov [eax], edi \n\ + mov eax, [%[_esi]] \n\ + mov [eax], esi \n\ + mov eax, [%[_edx]] \n\ + mov [eax], edx \n\ + mov eax, [%[_ecx]] \n\ + mov [eax], ecx \n\ + /* Pop ebx reg into ecx*/ \n\ + pop ecx \n\ + mov eax, [%[_ebx]] \n\ + mov [eax], ecx \n\ + \n\ + /* Pop ebp reg into ecx */\n\ + pop ecx \n\ + mov eax, [%[_ebp]] \n\ + mov [eax], ecx \n\ + \n\ + pop eax \n\ + /* Get resulting eax register*/ \n\ + mov ecx, [%[_eax]] \n\ + mov [ecx], eax \n\ + \n\ + /* Save flags as return in eax*/ \n\ + lahf \n\ + /* Pop address*/ \n\ + pop ebp \n\ + \n\ + pop ebx \n\ + pop ebp \n\ + /* Load result with flags */ \n\ + mov %[result], eax \n\ + " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp), [result] "+m" (result) + : : "eax","ecx","edx","esi","edi" ); #endif + // lahf only modifies ah, zero out the rest + return result & 0xFF00; } typedef struct { From 10587cb5ab12532727cf3e86f7c7bd2f4f78624a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 22 Oct 2015 23:32:27 +0200 Subject: [PATCH 0874/1173] Port non-VS inline asm to AT&T syntax This is much more liked by other compilers --- CMakeLists.txt | 4 +- src/addresses.h | 114 ++++++++++++++++++++++++------------------------ src/rct2.c | 4 +- 3 files changed, 61 insertions(+), 61 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 435325884e..fccdd91d99 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,8 +57,8 @@ file(GLOB_RECURSE ORCT2_SOURCES "src/*.c" "src/*.cpp" "lib/argparse/*.c" "lib/cu if (UNIX) # force 32bit build for now and set necessary flags to compile code as is - set(CMAKE_C_FLAGS "-m32 -masm=intel -fvar-tracking-assignments -std=gnu99") - set(CMAKE_CXX_FLAGS "-m32 -std=gnu++11 -fvar-tracking-assignments -masm=intel") + set(CMAKE_C_FLAGS "-m32 -fvar-tracking-assignments -std=gnu99") + set(CMAKE_CXX_FLAGS "-m32 -std=gnu++11 -fvar-tracking-assignments") set(CMAKE_SHARED_LINKER_FLAGS "-m32 -Wl,-melf_i386") set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}) endif (UNIX) diff --git a/src/addresses.h b/src/addresses.h index 19eeb5c03c..1b69c339d4 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -698,23 +698,23 @@ static int RCT2_CALLPROC_X(int address, int _eax, int _ebx, int _ecx, int _edx, #else __asm__ ( "\ \n\ - push ebx \n\ - push ebp \n\ + push %%ebx \n\ + push %%ebp \n\ push %[address] \n\ - mov eax, %[_eax] \n\ - mov ebx, %[_ebx] \n\ - mov ecx, %[_ecx] \n\ - mov edx, %[_edx] \n\ - mov esi, %[_esi] \n\ - mov edi, %[_edi] \n\ - mov ebp, %[_ebp] \n\ - call [esp] \n\ + mov %[_eax], %%eax \n\ + mov %[_ebx], %%ebx \n\ + mov %[_ecx], %%ecx \n\ + mov %[_edx], %%edx \n\ + mov %[_esi], %%esi \n\ + mov %[_edi], %%edi \n\ + mov %[_ebp], %%ebp \n\ + call *(%%esp) \n\ lahf \n\ - add esp, 4 \n\ - pop ebp \n\ - pop ebx \n\ + add $4, %%esp \n\ + pop %%ebp \n\ + pop %%ebx \n\ /* Load result with flags */ \n\ - mov %[result], eax \n\ + mov %%eax, %[result] \n\ " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp), [result] "+m" (result) : : "eax","ecx","edx","esi","edi" @@ -817,70 +817,70 @@ static int RCT2_CALLFUNC_X(int address, int *_eax, int *_ebx, int *_ecx, int *_e __asm__ ( "\ \n\ /* Store C's base pointer*/ \n\ - push ebp \n\ - push ebx \n\ + push %%ebp \n\ + push %%ebx \n\ \n\ /* Store %[address] to call*/ \n\ push %[address] \n\ \n\ /* Set all registers to the input values*/ \n\ - mov eax, [%[_eax]] \n\ - mov eax, [eax] \n\ - mov ebx, [%[_ebx]] \n\ - mov ebx, [ebx] \n\ - mov ecx, [%[_ecx]] \n\ - mov ecx, [ecx] \n\ - mov edx, [%[_edx]] \n\ - mov edx, [edx] \n\ - mov esi, [%[_esi]] \n\ - mov esi, [esi] \n\ - mov edi, [%[_edi]] \n\ - mov edi, [edi] \n\ - mov ebp, [%[_ebp]] \n\ - mov ebp, [ebp] \n\ + mov %[_eax], %%eax \n\ + mov (%%eax), %%eax \n\ + mov %[_ebx], %%ebx \n\ + mov (%%ebx), %%ebx \n\ + mov %[_ecx], %%ecx \n\ + mov (%%ecx), %%ecx \n\ + mov %[_edx], %%edx \n\ + mov (%%edx), %%edx \n\ + mov %[_esi], %%esi \n\ + mov (%%esi), %%esi \n\ + mov %[_edi], %%edi \n\ + mov (%%edi), %%edi \n\ + mov %[_ebp], %%ebp \n\ + mov (%%ebp), %%ebp \n\ \n\ /* Call function*/ \n\ - call [esp] \n\ + call *(%%esp) \n\ \n\ /* Store output eax */ \n\ - push eax \n\ - push ebp \n\ - push ebx \n\ - mov ebp, [esp + 20] \n\ - mov ebx, [esp + 16] \n\ + push %%eax \n\ + push %%ebp \n\ + push %%ebx \n\ + mov 20(%%esp), %%ebp \n\ + mov 16(%%esp), %%ebx \n\ /* Get resulting ecx, edx, esi, edi registers*/ \n\ - mov eax, [%[_edi]] \n\ - mov [eax], edi \n\ - mov eax, [%[_esi]] \n\ - mov [eax], esi \n\ - mov eax, [%[_edx]] \n\ - mov [eax], edx \n\ - mov eax, [%[_ecx]] \n\ - mov [eax], ecx \n\ + mov %[_edi], %%eax \n\ + mov %%edi, (%%eax) \n\ + mov %[_esi], %%eax \n\ + mov %%esi, (%%eax) \n\ + mov %[_edx], %%eax \n\ + mov %%edx, (%%eax) \n\ + mov %[_ecx], %%eax \n\ + mov %%ecx, (%%eax) \n\ /* Pop ebx reg into ecx*/ \n\ - pop ecx \n\ - mov eax, [%[_ebx]] \n\ - mov [eax], ecx \n\ + pop %%ecx \n\ + mov %[_ebx], %%eax \n\ + mov %%ecx, (%%eax) \n\ \n\ /* Pop ebp reg into ecx */\n\ - pop ecx \n\ - mov eax, [%[_ebp]] \n\ - mov [eax], ecx \n\ + pop %%ecx \n\ + mov %[_ebp], %%eax \n\ + mov %%ecx, (%%eax) \n\ \n\ - pop eax \n\ + pop %%eax \n\ /* Get resulting eax register*/ \n\ - mov ecx, [%[_eax]] \n\ - mov [ecx], eax \n\ + mov %[_eax], %%ecx \n\ + mov %%eax, (%%ecx) \n\ \n\ /* Save flags as return in eax*/ \n\ lahf \n\ /* Pop address*/ \n\ - pop ebp \n\ + pop %%ebp \n\ \n\ - pop ebx \n\ - pop ebp \n\ + pop %%ebx \n\ + pop %%ebp \n\ /* Load result with flags */ \n\ - mov %[result], eax \n\ + mov %%eax, %[result] \n\ " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp), [result] "+m" (result) : diff --git a/src/rct2.c b/src/rct2.c index 154b1aab9c..560db3ab9a 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -228,8 +228,8 @@ void rct2_update() #else __asm__ ( "\ \n\ - mov eax, 0x009DE564 \n\ - mov [eax], esp \n\ + movl $0x009DE564, %%eax \n\ + movl %%esp, (%%eax) \n\ " : : : "eax" ); #endif From f8407176d14fa93a58eeb9398f46e05b1658f619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 22 Oct 2015 23:39:09 +0200 Subject: [PATCH 0875/1173] drop no longer needed debug switch for gcc --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fccdd91d99..26f133133e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,8 +57,8 @@ file(GLOB_RECURSE ORCT2_SOURCES "src/*.c" "src/*.cpp" "lib/argparse/*.c" "lib/cu if (UNIX) # force 32bit build for now and set necessary flags to compile code as is - set(CMAKE_C_FLAGS "-m32 -fvar-tracking-assignments -std=gnu99") - set(CMAKE_CXX_FLAGS "-m32 -std=gnu++11 -fvar-tracking-assignments") + set(CMAKE_C_FLAGS "-m32 -std=gnu99") + set(CMAKE_CXX_FLAGS "-m32 -std=gnu++11") set(CMAKE_SHARED_LINKER_FLAGS "-m32 -Wl,-melf_i386") set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}) endif (UNIX) From 11fb15bba78ce26c6d7fbc06092cfab72e34aec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 22 Oct 2015 23:51:05 +0200 Subject: [PATCH 0876/1173] Add casts for types --- src/windows/editor_object_selection.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index b6e064aed3..39efc7e727 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -1327,13 +1327,13 @@ static void window_editor_object_selection_paint(rct_window *w, rct_drawpixelinf width = w->width - w->widgets[WIDX_LIST].right - 6; // Skip object dat name - text = (char*)(highlightedEntry + 1); - datName = text; + text = (uint8*)(highlightedEntry + 1); + datName = (char*)text; do { text++; } while (*(text - 1) != 0); text += 4; - name = text; + name = (char*)text; RCT2_GLOBAL(0x009BC677, uint8) = 14; From ff19998846ac4d274165e30a77c07ba83ef7be8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 22 Oct 2015 23:54:07 +0200 Subject: [PATCH 0877/1173] Add clang to travis matrix --- .travis.yml | 1 + install.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e4791043cd..e7f94d1820 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,7 @@ cache: env: - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON -DCMAKE_C_COMPILER=gcc-4.8 -DCMAKE_CXX_COMPILER=g++-4.8" + - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++" - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=OFF -DDISABLE_HTTP_TWITCH=ON -DCMAKE_C_COMPILER=gcc-4.8 -DCMAKE_CXX_COMPILER=g++-4.8" - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=OFF -DDISABLE_HTTP_TWITCH=OFF -DCMAKE_C_COMPILER=gcc-4.8 -DCMAKE_CXX_COMPILER=g++-4.8" - OPENRCT2_CMAKE_OPTS="-DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt" TARGET=windows diff --git a/install.sh b/install.sh index df1fdcfa76..31acc48c72 100755 --- a/install.sh +++ b/install.sh @@ -174,7 +174,7 @@ elif [[ `uname` == "Linux" ]]; then "linux") sudo dpkg --add-architecture i386 sudo apt-get update - sudo apt-get install --no-install-recommends -y --force-yes cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386 gcc-4.8 pkg-config:i386 g++-4.8-multilib gcc-4.8-multilib libjansson-dev:i386 libspeex-dev:i386 libspeexdsp-dev:i386 libcurl4-openssl-dev:i386 libcrypto++-dev:i386 + sudo apt-get install --no-install-recommends -y --force-yes cmake libsdl2-dev:i386 libsdl2-ttf-dev:i386 gcc-4.8 pkg-config:i386 g++-4.8-multilib gcc-4.8-multilib libjansson-dev:i386 libspeex-dev:i386 libspeexdsp-dev:i386 libcurl4-openssl-dev:i386 libcrypto++-dev:i386 clang download https://launchpad.net/ubuntu/+archive/primary/+files/libjansson4_2.7-1ubuntu1_i386.deb libjansson4_2.7-1ubuntu1_i386.deb download https://launchpad.net/ubuntu/+archive/primary/+files/libjansson-dev_2.7-1ubuntu1_i386.deb libjansson-dev_2.7-1ubuntu1_i386.deb sudo dpkg -i libjansson4_2.7-1ubuntu1_i386.deb From 5bc180a583c8fdbf2eaadbf6a5ab294e348db498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 22 Oct 2015 23:59:10 +0200 Subject: [PATCH 0878/1173] Fixes for travis builds of new AT&T syntax --- CMakeLists_mingw.txt | 4 ++-- install.sh | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/CMakeLists_mingw.txt b/CMakeLists_mingw.txt index 4be930b8e4..d4817994d1 100644 --- a/CMakeLists_mingw.txt +++ b/CMakeLists_mingw.txt @@ -11,8 +11,8 @@ SET(PKG_CONFIG_EXECUTABLE ${COMPILER_PREFIX}-pkg-config) # potential flags to make code more similar to MSVC: # -fshort-wchar -fshort-enums -mms-bitfields # -set(CMAKE_C_FLAGS "-masm=intel -std=gnu99 -fpack-struct=1" CACHE STRING "" FORCE) -set(CMAKE_CXX_FLAGS "-masm=intel -std=c++0x -std=gnu++0x -fpack-struct=1" CACHE STRING "" FORCE) +set(CMAKE_C_FLAGS "-std=gnu99 -fpack-struct=1" CACHE STRING "" FORCE) +set(CMAKE_CXX_FLAGS "-std=c++0x -std=gnu++0x -fpack-struct=1" CACHE STRING "" FORCE) if(${ACTUAL_SYSTEM} MATCHES "Linux") set(CMAKE_SHARED_LINKER_FLAGS "-O3 -static-libgcc -static-libstdc++ -static -lpthread" CACHE STRING "" FORCE) else() diff --git a/install.sh b/install.sh index 31acc48c72..eb19e49d5e 100755 --- a/install.sh +++ b/install.sh @@ -180,8 +180,6 @@ elif [[ `uname` == "Linux" ]]; then sudo dpkg -i libjansson4_2.7-1ubuntu1_i386.deb sudo dpkg -i libjansson-dev_2.7-1ubuntu1_i386.deb sudo apt-get install -f - export CC=gcc-4.8 - export CXX=g++-4.8 ;; "windows") sudo apt-get update From 12d9278e1e8a710a3922fe75f6e841fb5dd647dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 23 Oct 2015 00:04:19 +0200 Subject: [PATCH 0879/1173] Use 'trusty' image for travis now that it's public Travis CI team has recently published beta image of Trusty for testing [1]. Switch to that image for CI builds in a non-hacky way. [1] http://blog.travis-ci.com/2015-10-14-opening-up-ubuntu-trusty-beta/ --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index e7f94d1820..4a7ae74da1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,6 +28,7 @@ env: - OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON" TARGET=docker32 sudo: required +dist: trusty services: - docker From ded8e40babc17de76ebe15b768c4b401222a0b64 Mon Sep 17 00:00:00 2001 From: Smiley Barry Date: Fri, 23 Oct 2015 10:56:51 +0300 Subject: [PATCH 0880/1173] Fix broken section link --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 726131411a..29c90182d3 100644 --- a/readme.md +++ b/readme.md @@ -15,7 +15,7 @@ An open source clone of RollerCoaster Tycoon 2 built by decompiling the original - 1.2 - [Decompiling the game](#12-decompiling-the-game) - 1.3 - [Progress](#13-progress) - 1.4 - [Aim](#14-aim) -- 2 - [Downloading the game / Building the source code](#2-building-the-source-code) +- 2 - [Downloading the game / Building the source code](#2-downloading-the-game--building-the-source-code) - 2.1 - [Building Prerequisites](#21-building-prerequisites) - 2.2 - [Compiling and running](#22-compiling-and-running) - 3 - [Contributing](#3-contributing) From 831dc631c8c9cecc249944cb4ef3f90303100cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Fri, 23 Oct 2015 12:40:35 +0200 Subject: [PATCH 0881/1173] Optimize Mixer::EffectPanS16 --- src/audio/mixer.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index 5e9df6fef2..0706f641c8 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -738,10 +738,17 @@ void Mixer::MixChannel(Channel& channel, uint8* data, int length) void Mixer::EffectPanS16(Channel& channel, sint16* data, int length) { + const float dt = 1 / (length * 2); + float left_volume = channel.oldvolume_l; + float right_volume = channel.oldvolume_r; + const float d_left = dt * channel.volume_l; + const float d_right = dt * channel.volume_r; + for (int i = 0; i < length * 2; i += 2) { - float t = (float)i / (length * 2); - data[i] = (sint16)(data[i] * ((1.0 - t) * channel.oldvolume_l + t * channel.volume_l)); - data[i + 1] = (sint16)(data[i + 1] * ((1.0 - t) * channel.oldvolume_r + t * channel.volume_r)); + data[i] = (sint16)(data[i] * left_volume); + data[i + 1] = (sint16)(data[i + 1] * right_volume); + left_volume += d_left; + right_volume += d_right; } } From fdbd08e306508837cf22dc93c72c3222d3cb8a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Fri, 23 Oct 2015 14:06:38 +0200 Subject: [PATCH 0882/1173] Calculate correct d_left / d_right --- src/audio/mixer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index 0706f641c8..e232fa908e 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -738,11 +738,11 @@ void Mixer::MixChannel(Channel& channel, uint8* data, int length) void Mixer::EffectPanS16(Channel& channel, sint16* data, int length) { - const float dt = 1 / (length * 2); + const float dt = 1.0f / (length * 2); float left_volume = channel.oldvolume_l; float right_volume = channel.oldvolume_r; - const float d_left = dt * channel.volume_l; - const float d_right = dt * channel.volume_r; + const float d_left = dt * (channel.volume_l - channel.oldvolume_l); + const float d_right = dt * (channel.volume_r - channel.oldvolume_r); for (int i = 0; i < length * 2; i += 2) { data[i] = (sint16)(data[i] * left_volume); From 79552feb54adb34ebe3273a960f35788dc0559da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 23 Oct 2015 17:22:31 +0200 Subject: [PATCH 0883/1173] Only copy strings when they're different When called from window_loadsave_scrollmousedown, window_loadsave_populate_list will try to strncpy a string over itself. This commit prevents that. --- src/windows/loadsave.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 9e2d0e1c97..f5ebc59814 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -600,7 +600,9 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co char *dst, filter[MAX_PATH], subDir[MAX_PATH]; strncpy(_directory, directory, sizeof(_directory)); - strncpy(_extension, extension, sizeof(_extension)); + if (_extension != extension) { + strncpy(_extension, extension, sizeof(_extension)); + } _shortenedDirectory[0] = '\0'; strncpy(filter, directory, sizeof(filter)); From 8a23aa1bec70af96407963c9875bc276e57dcbf8 Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Fri, 23 Oct 2015 17:33:21 +0200 Subject: [PATCH 0884/1173] Change openrct2_loop to not draw if window is minimized or otherwise hidden (fixes #2096) --- src/openrct2.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/openrct2.c b/src/openrct2.c index c446c4692a..04e9dca7c5 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -393,8 +393,11 @@ static void openrct2_loop() invalidate_sprite_2(&g_sprite_list[i]); } - rct2_draw(); - platform_draw(); + if ((SDL_GetWindowFlags(gWindow) & (SDL_WINDOW_MINIMIZED | SDL_WINDOW_HIDDEN)) == 0) { + rct2_draw(); + platform_draw(); + } + fps++; if (SDL_GetTicks() - secondTick >= 1000) { fps = 0; @@ -426,8 +429,10 @@ static void openrct2_loop() rct2_update(); - rct2_draw(); - platform_draw(); + if ((SDL_GetWindowFlags(gWindow) & (SDL_WINDOW_MINIMIZED | SDL_WINDOW_HIDDEN)) == 0) { + rct2_draw(); + platform_draw(); + } } } while (!_finished); } From 29976790cb208b9099f3633f04125e4b0f339a20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Sat, 24 Oct 2015 12:32:56 +0200 Subject: [PATCH 0885/1173] Low level optimizations * Just memcpy if we don't have to use a pallete and zoom_amount == 1 * Replace some divide operations by right-shifts * Optimize / simplify sub_68B3FB --- src/drawing/sprite.c | 20 ++++++++------ src/interface/viewport.c | 58 +++++++++++----------------------------- 2 files changed, 28 insertions(+), 50 deletions(-) diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index 918321f0a5..e055ed5f04 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -359,8 +359,13 @@ void gfx_rle_sprite_to_buffer(const uint8* source_bits_pointer, uint8* dest_bits } else { - for (; no_pixels > 0; no_pixels -= zoom_amount, source_pointer += zoom_amount, dest_pointer++){ - *dest_pointer = *source_pointer; + if (zoom_amount == 1) { + memcpy(dest_pointer, source_pointer, no_pixels); + } + else { + for (; no_pixels > 0; no_pixels -= zoom_amount, source_pointer += zoom_amount, dest_pointer++) { + *dest_pointer = *source_pointer; + } } } } @@ -498,7 +503,6 @@ void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, in //Its used super often so we will define it to a separate variable. int zoom_level = dpi->zoom_level; - int zoom_amount = 1 << zoom_level; int zoom_mask = 0xFFFFFFFF << zoom_level; if (zoom_level && g1_source->flags & G1_FLAG_RLE_COMPRESSION){ @@ -552,8 +556,8 @@ void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, in //If the image no longer has anything to draw if (height <= 0)return; - dest_start_y /= zoom_amount; - dest_end_y /= zoom_amount; + dest_start_y >>= zoom_level; + dest_end_y >>= zoom_level; //This will be the width of the drawn image int width = g1_source->width; @@ -591,12 +595,12 @@ void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, in if (width <= 0)return; } - dest_start_x /= zoom_amount; - dest_end_x /= zoom_amount; + dest_start_x >>= zoom_level; + dest_end_x >>= zoom_level; uint8* dest_pointer = (uint8*)dpi->bits; //Move the pointer to the start point of the destination - dest_pointer += ((dpi->width / zoom_amount) + dpi->pitch)*dest_start_y + dest_start_x; + dest_pointer += ((dpi->width >> zoom_level) + dpi->pitch) * dest_start_y + dest_start_x; if (g1_source->flags & G1_FLAG_RLE_COMPRESSION){ //We have to use a different method to move the source pointer for diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 6b5635a32a..3678c97d7c 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1559,7 +1559,7 @@ static void sub_68B3FB(int x, int y) RCT2_GLOBAL(0x9DE574, uint16_t) = x; RCT2_GLOBAL(0x9DE576, uint16_t) = y; - rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); + rct_map_element* map_element = map_get_first_element_at(x >> 5, y >> 5); int dx = 0; switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) { @@ -1580,7 +1580,7 @@ static void sub_68B3FB(int x, int y) dx = x - y; break; } - dx /= 2; + dx >>= 1; // Display little yellow arrow when building footpaths? if ((RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & 4) && RCT2_GLOBAL(0x9DE56A, uint16) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) && @@ -1805,9 +1805,9 @@ void viewport_paint_setup() .y = (dpi->y - 16) & 0xFFE0 }; - sint16 half_x = mapTile.x / 2; + sint16 half_x = mapTile.x >> 1; - uint16 num_vertical_quadrants = (dpi->height + 2128) / 32; + uint16 num_vertical_quadrants = (dpi->height + 2128) >> 5; switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)){ case 0: @@ -1821,19 +1821,12 @@ void viewport_paint_setup() map_element_paint_setup(mapTile.x, mapTile.y); sprite_paint_setup(mapTile.x, mapTile.y); - mapTile.x -= 32; - mapTile.y += 32; + sprite_paint_setup(mapTile.x - 32, mapTile.y + 32); - sprite_paint_setup(mapTile.x, mapTile.y); + map_element_paint_setup(mapTile.x, mapTile.y + 32); + sprite_paint_setup(mapTile.x, mapTile.y + 32); mapTile.x += 32; - - map_element_paint_setup(mapTile.x, mapTile.y); - sprite_paint_setup(mapTile.x, mapTile.y); - - mapTile.x += 32; - mapTile.y -= 32; - sprite_paint_setup(mapTile.x, mapTile.y); mapTile.y += 32; @@ -1850,19 +1843,12 @@ void viewport_paint_setup() map_element_paint_setup(mapTile.x, mapTile.y); sprite_paint_setup(mapTile.x, mapTile.y); - mapTile.x -= 32; - mapTile.y -= 32; + sprite_paint_setup(mapTile.x - 32, mapTile.y - 32); - sprite_paint_setup(mapTile.x, mapTile.y); + map_element_paint_setup(mapTile.x - 32, mapTile.y); + sprite_paint_setup(mapTile.x - 32, mapTile.y); mapTile.y += 32; - - map_element_paint_setup(mapTile.x, mapTile.y); - sprite_paint_setup(mapTile.x, mapTile.y); - - mapTile.x += 32; - mapTile.y += 32; - sprite_paint_setup(mapTile.x, mapTile.y); mapTile.x -= 32; @@ -1879,19 +1865,13 @@ void viewport_paint_setup() map_element_paint_setup(mapTile.x, mapTile.y); sprite_paint_setup(mapTile.x, mapTile.y); - mapTile.x += 32; - mapTile.y -= 32; + sprite_paint_setup(mapTile.x + 32, mapTile.y - 32); - sprite_paint_setup(mapTile.x, mapTile.y); + map_element_paint_setup(mapTile.x, mapTile.y - 32); + sprite_paint_setup(mapTile.x, mapTile.y - 32); mapTile.x -= 32; - map_element_paint_setup(mapTile.x, mapTile.y); - sprite_paint_setup(mapTile.x, mapTile.y); - - mapTile.x -= 32; - mapTile.y += 32; - sprite_paint_setup(mapTile.x, mapTile.y); mapTile.y -= 32; @@ -1908,19 +1888,13 @@ void viewport_paint_setup() map_element_paint_setup(mapTile.x, mapTile.y); sprite_paint_setup(mapTile.x, mapTile.y); - mapTile.x += 32; - mapTile.y += 32; + sprite_paint_setup(mapTile.x + 32, mapTile.y + 32); - sprite_paint_setup(mapTile.x, mapTile.y); + map_element_paint_setup(mapTile.x + 32, mapTile.y); + sprite_paint_setup(mapTile.x + 32, mapTile.y); mapTile.y -= 32; - map_element_paint_setup(mapTile.x, mapTile.y); - sprite_paint_setup(mapTile.x, mapTile.y); - - mapTile.x -= 32; - mapTile.y -= 32; - sprite_paint_setup(mapTile.x, mapTile.y); mapTile.x += 32; From 475466dcd9b68ba9aa1fc27d57d4d891683778d0 Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Wed, 7 Oct 2015 20:30:50 +0200 Subject: [PATCH 0886/1173] Require a restart after changing hardware rendering setting, decouple setting from active status --- data/language/english_uk.txt | 1 + src/localisation/string_ids.h | 3 +++ src/platform/platform.h | 2 ++ src/platform/shared.c | 18 +++++++++++++----- src/windows/options.c | 9 +++++++++ 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index e306a49921..dfd3774486 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3896,6 +3896,7 @@ STR_5554 :{SMALLFONT}{BLACK}Enable mountain tool STR_5555 :Show vehicles from other track types STR_5556 :Kick Player STR_5557 :Stay connected after desynchronisation (Multiplayer) +STR_5558 :A restart is required for this setting to take effect ##################### # Rides/attractions # diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 14d82f3767..1078c93e0a 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2143,6 +2143,9 @@ enum { STR_KICK_PLAYER = 5556, STR_STAY_CONNECTED_AFTER_DESYNC = 5557, + STR_RESTART_REQUIRED = 5558, + + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/platform/platform.h b/src/platform/platform.h index 0929c215e3..ec84336859 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -90,6 +90,8 @@ extern int gNumResolutions; extern resolution *gResolutions; extern SDL_Window *gWindow; +extern bool gHardwareDisplay; + extern bool gSteamOverlayActive; // Platform shared definitions diff --git a/src/platform/shared.c b/src/platform/shared.c index cdf9ecf854..3bd1934bc0 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -58,6 +58,7 @@ SDL_Texture *gBufferTexture = NULL; SDL_PixelFormat *gBufferTextureFormat = NULL; SDL_Color gPalette[256]; uint32 gPaletteHWMapped[256]; +bool gHardwareDisplay; bool gSteamOverlayActive = false; @@ -223,7 +224,7 @@ void platform_draw() int height = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16); if (!gOpenRCT2Headless) { - if (gConfigGeneral.hardware_display) { + if (gHardwareDisplay) { void *pixels; int pitch; if (SDL_LockTexture(gBufferTexture, NULL, &pixels, &pitch) == 0) { @@ -370,7 +371,7 @@ void platform_update_palette(char* colours, int start_index, int num_colours) } } - if (!gOpenRCT2Headless && !gConfigGeneral.hardware_display) { + if (!gOpenRCT2Headless && !gHardwareDisplay) { surface = SDL_GetWindowSurface(gWindow); if (!surface) { log_fatal("SDL_GetWindowSurface failed %s", SDL_GetError()); @@ -673,6 +674,8 @@ static void platform_create_window() RCT2_GLOBAL(0x009E2D8C, sint32) = 0; + gHardwareDisplay = gConfigGeneral.hardware_display; + // Create window in window first rather than fullscreen so we have the display the window is on first gWindow = SDL_CreateWindow( "OpenRCT2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_RESIZABLE @@ -857,13 +860,18 @@ void platform_refresh_video() SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, gConfigGeneral.minimize_fullscreen_focus_loss ? "1" : "0"); - if (gConfigGeneral.hardware_display) { + log_verbose("HardwareDisplay: %s", gHardwareDisplay ? "true" : "false"); + + if (gHardwareDisplay) { if (gRenderer == NULL) gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (gRenderer == NULL) { - log_fatal("SDL_CreateRenderer %s", SDL_GetError()); - exit(-1); + log_warning("SDL_CreateRenderer failed: %s", SDL_GetError()); + log_warning("Falling back to software rendering..."); + gHardwareDisplay = false; + platform_refresh_video(); // try again without hardware rendering + return; } if (gBufferTexture != NULL) diff --git a/src/windows/options.c b/src/windows/options.c index 68d69f3d69..696b6b90c3 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -493,7 +493,16 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) break; case WIDX_HARDWARE_DISPLAY_CHECKBOX: gConfigGeneral.hardware_display ^= 1; +#ifdef _WIN32 + // Windows is apparently able to switch to hardware rendering on the fly although + // using the same window in an unaccelerated and accelerated context is unsupported by SDL2 + gHardwareDisplay = gConfigGeneral.hardware_display; platform_refresh_video(); +#else + // Linux requires a restart. This could be improved in the future by recreating the window, + // https://github.com/OpenRCT2/OpenRCT2/issues/2015 + window_error_open(STR_RESTART_REQUIRED, STR_NONE); +#endif config_save_default(); window_invalidate(w); break; From dc8e197799e977a1bad82c42ea876d8d24ef2b9a Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Sat, 24 Oct 2015 17:10:33 +0200 Subject: [PATCH 0887/1173] Added 10-minute inspections cheat. --- data/language/english_uk.txt | 3 +++ src/localisation/string_ids.h | 2 ++ src/windows/cheats.c | 19 ++++++++++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index dfd3774486..c577655013 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3897,6 +3897,9 @@ STR_5555 :Show vehicles from other track types STR_5556 :Kick Player STR_5557 :Stay connected after desynchronisation (Multiplayer) STR_5558 :A restart is required for this setting to take effect +STR_5559 :10 min. inspections +STR_5560 :{SMALLFONT}{BLACK}Sets the inspection time to 'Every 10 minutes' on all rides + ##################### # Rides/attractions # diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 1078c93e0a..168aa09046 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2013,6 +2013,8 @@ enum { STR_NORMAL = 5366, STR_FAST = 5367, STR_CHEAT_RESET_CRASH_STATUS = 5368, + STR_CHEAT_10_MINUTE_INSPECTIONS = 5559, + STR_CHEAT_10_MINUTE_INSPECTIONS_TIP = 5560, STR_CHEAT_PARK_PARAMETERS = 5369, STR_CHEAT_TIP_PARK_PARAMETERS = 5370, diff --git a/src/windows/cheats.c b/src/windows/cheats.c index f5c2eedbad..185117a6a5 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -118,6 +118,7 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_DISABLE_ALL_BREAKDOWNS, WIDX_BUILD_IN_PAUSE_MODE, WIDX_RESET_CRASH_STATUS, + WIDX_10_MINUTE_INSPECTIONS, WIDX_SHOW_ALL_OPERATING_MODES, WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES }; @@ -259,6 +260,7 @@ static rct_widget window_cheats_rides_widgets[] = { { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(10), OHPL(10), STR_CHEAT_DISABLE_BREAKDOWNS, STR_NONE }, // Disable all breakdowns { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(8), OHPL(8), STR_CHEAT_BUILD_IN_PAUSE_MODE, STR_NONE }, // Build in pause mode { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_RESET_CRASH_STATUS, STR_NONE }, // Reset crash status + { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(2), HPL(2), STR_CHEAT_10_MINUTE_INSPECTIONS, STR_CHEAT_10_MINUTE_INSPECTIONS_TIP }, // 10 minute inspections { WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(7), OHPL(7), STR_CHEAT_SHOW_ALL_OPERATING_MODES, STR_NONE }, // Show all operating modes { 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 { WIDGETS_END }, @@ -416,7 +418,7 @@ 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_HIGH_MONEY) | (1ULL << WIDX_CLEAR_LOAN), (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_GUEST_PARAMETERS_GROUP) | (1ULL << WIDX_GUEST_HAPPINESS_MAX) | (1ULL << WIDX_GUEST_HAPPINESS_MIN) | (1ULL << WIDX_GUEST_ENERGY_MAX) | (1ULL << WIDX_GUEST_ENERGY_MIN) | (1ULL << WIDX_GUEST_HUNGER_MAX) | (1ULL << WIDX_GUEST_HUNGER_MIN) | (1ULL << WIDX_GUEST_THIRST_MAX) | (1ULL << WIDX_GUEST_THIRST_MIN) | (1ULL << WIDX_GUEST_NAUSEA_MAX) | (1ULL << WIDX_GUEST_NAUSEA_MIN) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1ULL << WIDX_GUEST_BATHROOM_MAX) | (1ULL << WIDX_GUEST_BATHROOM_MIN) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1ULL << WIDX_GUEST_IGNORE_RIDE_INTENSITY) | (1ULL << WIDX_GIVE_ALL_GUESTS_GROUP) | (1ULL << WIDX_GIVE_GUESTS_MONEY) | (1ULL << WIDX_GIVE_GUESTS_PARK_MAPS) | (1ULL << WIDX_GIVE_GUESTS_BALLOONS) | (1ULL << WIDX_GIVE_GUESTS_UMBRELLAS) | (1ULL << WIDX_TRAM_GUESTS) | (1ULL << WIDX_REMOVE_ALL_GUESTS) | (1ULL << WIDX_EXPLODE_GUESTS) | (1ULL << WIDX_DISABLE_VANDALISM), (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_FREEZE_CLIMATE) | (1ULL << WIDX_OPEN_CLOSE_PARK) | (1ULL << WIDX_WEATHER_SUN) | (1ULL << WIDX_WEATHER_THUNDER) | (1ULL << WIDX_CLEAR_GRASS) | (1ULL << WIDX_MOWED_GRASS) | (1ULL << WIDX_WATER_PLANTS) | (1ULL << WIDX_FIX_VANDALISM) | (1ULL << WIDX_REMOVE_LITTER) | (1ULL << WIDX_WIN_SCENARIO) | (1ULL << WIDX_HAVE_FUN) | (1ULL << WIDX_UNLOCK_ALL_PRICES) | (1ULL << WIDX_SANDBOX_MODE) | (1ULL << WIDX_FAST_STAFF) | (1ULL << WIDX_NORMAL_STAFF) | (1ULL << WIDX_PARK_PARAMETERS) | (1ULL << WIDX_FORCE_PARK_RATING) | (1ULL << WIDX_INCREASE_PARK_RATING) | (1ULL << WIDX_DECREASE_PARK_RATING), - (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_SHOW_ALL_OPERATING_MODES) | (1ULL << WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES) + (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) }; static rct_string_id window_cheats_page_titles[] = { @@ -586,6 +588,18 @@ static void cheat_reset_crash_status() window_invalidate_by_class(WC_RIDE); } +static void cheat_10_minute_inspections() +{ + int i; + rct_ride *ride; + + FOR_ALL_RIDES(i, ride) { + // Set inspection interval to 10 minutes + ride->inspection_interval = RIDE_INSPECTION_EVERY_10_MINUTES; + } + window_invalidate_by_class(WC_RIDE); +} + static void cheat_increase_money(money32 amount) { money32 currentMoney; @@ -1011,6 +1025,9 @@ static void window_cheats_rides_mouseup(rct_window *w, int widgetIndex) case WIDX_RESET_CRASH_STATUS: cheat_reset_crash_status(); break; + case WIDX_10_MINUTE_INSPECTIONS: + cheat_10_minute_inspections(); + break; case WIDX_SHOW_ALL_OPERATING_MODES: gCheatsShowAllOperatingModes = !gCheatsShowAllOperatingModes; break; From e5ce186534651f4b812e20458c1c3f7a499e3909 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Sat, 24 Oct 2015 17:23:34 +0200 Subject: [PATCH 0888/1173] Wrapped new widget with () --- src/windows/cheats.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 185117a6a5..070a607f7b 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -418,7 +418,7 @@ 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_HIGH_MONEY) | (1ULL << WIDX_CLEAR_LOAN), (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_GUEST_PARAMETERS_GROUP) | (1ULL << WIDX_GUEST_HAPPINESS_MAX) | (1ULL << WIDX_GUEST_HAPPINESS_MIN) | (1ULL << WIDX_GUEST_ENERGY_MAX) | (1ULL << WIDX_GUEST_ENERGY_MIN) | (1ULL << WIDX_GUEST_HUNGER_MAX) | (1ULL << WIDX_GUEST_HUNGER_MIN) | (1ULL << WIDX_GUEST_THIRST_MAX) | (1ULL << WIDX_GUEST_THIRST_MIN) | (1ULL << WIDX_GUEST_NAUSEA_MAX) | (1ULL << WIDX_GUEST_NAUSEA_MIN) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1ULL << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1ULL << WIDX_GUEST_BATHROOM_MAX) | (1ULL << WIDX_GUEST_BATHROOM_MIN) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1ULL << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1ULL << WIDX_GUEST_IGNORE_RIDE_INTENSITY) | (1ULL << WIDX_GIVE_ALL_GUESTS_GROUP) | (1ULL << WIDX_GIVE_GUESTS_MONEY) | (1ULL << WIDX_GIVE_GUESTS_PARK_MAPS) | (1ULL << WIDX_GIVE_GUESTS_BALLOONS) | (1ULL << WIDX_GIVE_GUESTS_UMBRELLAS) | (1ULL << WIDX_TRAM_GUESTS) | (1ULL << WIDX_REMOVE_ALL_GUESTS) | (1ULL << WIDX_EXPLODE_GUESTS) | (1ULL << WIDX_DISABLE_VANDALISM), (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_FREEZE_CLIMATE) | (1ULL << WIDX_OPEN_CLOSE_PARK) | (1ULL << WIDX_WEATHER_SUN) | (1ULL << WIDX_WEATHER_THUNDER) | (1ULL << WIDX_CLEAR_GRASS) | (1ULL << WIDX_MOWED_GRASS) | (1ULL << WIDX_WATER_PLANTS) | (1ULL << WIDX_FIX_VANDALISM) | (1ULL << WIDX_REMOVE_LITTER) | (1ULL << WIDX_WIN_SCENARIO) | (1ULL << WIDX_HAVE_FUN) | (1ULL << WIDX_UNLOCK_ALL_PRICES) | (1ULL << WIDX_SANDBOX_MODE) | (1ULL << WIDX_FAST_STAFF) | (1ULL << WIDX_NORMAL_STAFF) | (1ULL << WIDX_PARK_PARAMETERS) | (1ULL << WIDX_FORCE_PARK_RATING) | (1ULL << WIDX_INCREASE_PARK_RATING) | (1ULL << WIDX_DECREASE_PARK_RATING), - (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_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) }; static rct_string_id window_cheats_page_titles[] = { From 3ebd576d78dc35c5b922518435d55e982b164523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Sat, 24 Oct 2015 18:25:11 +0200 Subject: [PATCH 0889/1173] Cache width of line --- src/drawing/sprite.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index e055ed5f04..ca3ab618ac 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -132,6 +132,8 @@ void sub_68371D() void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, uint8* source_pointer, uint8* dest_pointer, rct_g1_element* source_image, rct_drawpixelinfo *dest_dpi, int height, int width, int image_type){ uint16 zoom_level = dest_dpi->zoom_level; uint8 zoom_amount = 1 << zoom_level; + uint32 dest_line_width = (dest_dpi->width / zoom_amount) + dest_dpi->pitch; + uint32 source_line_width = source_image->width * zoom_amount; //Requires use of palette? if (image_type & IMAGE_TYPE_USE_PALETTE){ @@ -140,9 +142,9 @@ void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, ui unknown_pointer += source_pointer - source_image->offset;// RCT2_GLOBAL(0x9E3CE0, uint32); for (; height > 0; height -= zoom_amount){ - uint8* next_source_pointer = source_pointer + (uint32)(source_image->width * zoom_amount); - uint8* next_unknown_pointer = unknown_pointer + (uint32)(source_image->width * zoom_amount); - uint8* next_dest_pointer = dest_pointer + (dest_dpi->width / zoom_amount) + dest_dpi->pitch; + uint8* next_source_pointer = source_pointer + source_line_width; + uint8* next_unknown_pointer = unknown_pointer + source_line_width; + uint8* next_dest_pointer = dest_pointer + dest_line_width; for (int no_pixels = width; no_pixels > 0; no_pixels -= zoom_amount, source_pointer += zoom_amount, unknown_pointer += zoom_amount, dest_pointer++){ uint8 pixel = *source_pointer; @@ -161,8 +163,8 @@ void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, ui //image colour adjusted? for (; height > 0; height -= zoom_amount){ - uint8* next_source_pointer = source_pointer + (uint32)(source_image->width * zoom_amount); - uint8* next_dest_pointer = dest_pointer + (dest_dpi->width / zoom_amount) + dest_dpi->pitch; + uint8* next_source_pointer = source_pointer + source_line_width; + uint8* next_dest_pointer = dest_pointer + dest_line_width; for (int no_pixels = width; no_pixels > 0; no_pixels -= zoom_amount, source_pointer += zoom_amount, dest_pointer++){ uint8 pixel = *source_pointer; pixel = palette_pointer[pixel]; @@ -171,7 +173,7 @@ void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, ui } } - source_pointer = next_source_pointer; + source_pointer == next_source_pointer; dest_pointer = next_dest_pointer; } return; @@ -181,8 +183,8 @@ void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, ui //telling if it needs to be drawn not for colour. if (image_type & IMAGE_TYPE_MIX_BACKGROUND){//Not tested for (; height > 0; height -= zoom_amount){ - uint8* next_source_pointer = source_pointer + (uint32)(source_image->width * zoom_amount); - uint8* next_dest_pointer = dest_pointer + (dest_dpi->width / zoom_amount) + dest_dpi->pitch; + uint8* next_source_pointer = source_pointer + source_line_width; + uint8* next_dest_pointer = dest_pointer + dest_line_width; for (int no_pixels = width; no_pixels > 0; no_pixels -= zoom_amount, source_pointer += zoom_amount, dest_pointer++){ uint8 pixel = *source_pointer; @@ -202,8 +204,8 @@ void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, ui //Basic bitmap no fancy stuff if (!(source_image->flags & G1_FLAG_BMP)){//Not tested for (; height > 0; height -= zoom_amount){ - uint8* next_source_pointer = source_pointer + (uint32)(source_image->width * zoom_amount); - uint8* next_dest_pointer = dest_pointer + (dest_dpi->width / zoom_amount) + dest_dpi->pitch; + uint8* next_source_pointer = source_pointer + source_line_width; + uint8* next_dest_pointer = dest_pointer + dest_line_width; for (int no_pixels = width; no_pixels > 0; no_pixels -= zoom_amount, dest_pointer++, source_pointer += zoom_amount){ *dest_pointer = *source_pointer; @@ -219,9 +221,9 @@ void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, ui unknown_pointer += source_pointer - source_image->offset; for (; height > 0; height -= zoom_amount){ - uint8* next_source_pointer = source_pointer + (uint32)(source_image->width * zoom_amount); - uint8* next_unknown_pointer = unknown_pointer + (uint32)(source_image->width * zoom_amount); - uint8* next_dest_pointer = dest_pointer + (dest_dpi->width / zoom_amount) + dest_dpi->pitch; + uint8* next_source_pointer = source_pointer + source_line_width; + uint8* next_unknown_pointer = unknown_pointer + source_line_width; + uint8* next_dest_pointer = dest_pointer + dest_line_width; for (int no_pixels = width; no_pixels > 0; no_pixels -= zoom_amount, dest_pointer++, source_pointer += zoom_amount, unknown_pointer += zoom_amount){ uint8 pixel = *source_pointer; @@ -238,8 +240,8 @@ void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, ui //Basic bitmap with no draw pixels for (; height > 0; height -= zoom_amount){ - uint8* next_source_pointer = source_pointer + (uint32)(source_image->width * zoom_amount); - uint8* next_dest_pointer = dest_pointer + (dest_dpi->width / zoom_amount) + dest_dpi->pitch; + uint8* next_source_pointer = source_pointer + source_line_width; + uint8* next_dest_pointer = dest_pointer + dest_line_width; for (int no_pixels = width; no_pixels > 0; no_pixels -= zoom_amount, dest_pointer++, source_pointer += zoom_amount){ uint8 pixel = *source_pointer; From 9752d197e6784a484dd9b21d92536433ff286007 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Sat, 24 Oct 2015 21:02:08 +0200 Subject: [PATCH 0890/1173] Fix assignment --- src/drawing/sprite.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index ca3ab618ac..9f47d9b533 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -173,7 +173,7 @@ void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, ui } } - source_pointer == next_source_pointer; + source_pointer = next_source_pointer; dest_pointer = next_dest_pointer; } return; From 663e4303006a92b18251f28712aae549385eb3fd Mon Sep 17 00:00:00 2001 From: e-foley Date: Sat, 24 Oct 2015 14:54:15 -0700 Subject: [PATCH 0891/1173] cap airtime bonus Caps airtime addition to excitement rating rather than allowing infinite subtraction --- src/ride/ride_ratings.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 7e8b49d5f0..37ae617dea 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -794,17 +794,13 @@ static void ride_ratings_apply_adjustments(rct_ride *ride, rating_tuple *ratings // Apply total air time if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_HAS_AIR_TIME) { - uint16 totalAirTime = ride->total_air_time; if (rideEntry->flags & RIDE_ENTRY_FLAG_11) { - if (totalAirTime >= 96) { - totalAirTime -= 96; - ratings->excitement -= totalAirTime / 8; - ratings->nausea += totalAirTime / 16; - } + // Limit airtime bonus for heartline twister coaster (see issues #2031 and #2064) + ratings->excitement += min(ride->total_air_time, 96) / 8; } else { - ratings->excitement += totalAirTime / 8; - ratings->nausea += totalAirTime / 16; + ratings->excitement += ride->total_air_time / 8; } + ratings->nausea += ride->total_air_time / 16; } } From 73eed6830afd7c6c720f3b04a6aa9656c7e9a48b Mon Sep 17 00:00:00 2001 From: e-foley Date: Sat, 24 Oct 2015 14:59:55 -0700 Subject: [PATCH 0892/1173] remove unnecessary rating conditioning Remove old workaround to issue #2064 --- src/ride/ride_ratings.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 37ae617dea..c24642406b 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -624,13 +624,6 @@ static void ride_ratings_calculate(rct_ride *ride) calcFunc(ride); } - if (ride->ratings.excitement != -1) { - // Prevent negative ratings - ride->ratings.excitement = max(0, ride->ratings.excitement); - ride->ratings.intensity = max(0, ride->ratings.intensity); - ride->ratings.nausea = max(0, ride->ratings.nausea); - } - // Original ride calculation // calcFunc = RCT2_ADDRESS(0x0097E050, ride_ratings_calculation)[ride->type]; // RCT2 CALLPROC X((int)calcFunc, 0, 0, 0, 0, 0, (int)ride, 0); From fcd22dd8cae95d07049e4d704cd4c0d454914c1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sat, 24 Oct 2015 23:52:12 +0200 Subject: [PATCH 0893/1173] Memory handling fixes --- src/title.c | 2 +- src/windows/editor_object_selection.c | 4 ++++ src/windows/editor_objective_options.c | 10 ++++++++++ src/windows/editor_scenario_options.c | 2 +- src/windows/guest_list.c | 3 +++ src/windows/install_track.c | 11 ++++++----- src/windows/loadsave.c | 3 +++ 7 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/title.c b/src/title.c index ac5ac2040d..a7e947e94e 100644 --- a/src/title.c +++ b/src/title.c @@ -171,7 +171,7 @@ static void title_init_showcase() static int title_load_park(const char *path) { rct_window* w; - int successfulLoad; + int successfulLoad = 0; if (_strcmpi(path_get_extension(path), ".sv6") == 0) { SDL_RWops* rw = SDL_RWFromFile(path, "rb"); diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 39efc7e727..034afb51f6 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -354,6 +354,10 @@ static void visible_list_refresh(rct_window *w) case RIDE_SORT_RIDE: sortFunc = visible_list_sort_ride_name; break; + default: + log_warning("Wrong sort type %d, leaving list as-is.", _listSortType); + window_invalidate(w); + return; } qsort(_listItems, _numListItems, sizeof(list_item), sortFunc); diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index 0a4909d758..2ffbd5af0f 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -785,10 +785,20 @@ static void window_editor_objective_options_main_textinput(rct_window *w, int wi break; case WIDX_SCENARIO_NAME: strncpy(s6Info->name, text, 64); + if (strnlen(s6Info->name, 64) == 64) + { + s6Info->name[64 - 1] = '\0'; + log_warning("Truncated S6 name: %s", s6Info->name); + } window_invalidate(w); break; case WIDX_DETAILS: strncpy(s6Info->details, text, 256); + if (strnlen(s6Info->details, 256) == 256) + { + s6Info->details[256 - 1] = '\0'; + log_warning("Truncated S6 name: %s", s6Info->details); + } window_invalidate(w); break; } diff --git a/src/windows/editor_scenario_options.c b/src/windows/editor_scenario_options.c index f1bb0880fb..4073444ec4 100644 --- a/src/windows/editor_scenario_options.c +++ b/src/windows/editor_scenario_options.c @@ -559,7 +559,7 @@ static void window_editor_scenario_options_financial_mousedown(int widgetIndex, break; } - if(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_PLAYING) { + if(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) == SCREEN_FLAGS_PLAYING) { window_invalidate_by_class(WC_FINANCES); window_invalidate_by_class(WC_BOTTOM_TOOLBAR); } diff --git a/src/windows/guest_list.c b/src/windows/guest_list.c index 517569c438..67d30bbddb 100644 --- a/src/windows/guest_list.c +++ b/src/windows/guest_list.c @@ -447,6 +447,9 @@ static void window_guest_list_scrollgetsize(rct_window *w, int scrollIndex, int w->var_492 = _window_guest_list_num_groups; y = _window_guest_list_num_groups * 21; break; + default: + log_error("Improper tab selected: %d, bailing out.", _window_guest_list_selected_tab); + return; } i = _window_guest_list_selected_page; diff --git a/src/windows/install_track.c b/src/windows/install_track.c index b0591080b7..08130e8f00 100644 --- a/src/windows/install_track.c +++ b/src/windows/install_track.c @@ -134,15 +134,16 @@ void window_install_track_open(const char* path) w->track_list.var_484 = 0; window_push_others_right(w); - memset(track_path, 0, MAX_PATH - 1); - strcpy(track_path, path); + strncpy(track_path, path, MAX_PATH); + track_path[MAX_PATH - 1] = '\0'; char* track_name_pointer = track_path; while (*track_name_pointer++ != '\0'); while (*--track_name_pointer != '\\'); track_name_pointer++; - strcpy(track_dest_name, track_name_pointer); + strncpy(track_dest_name, track_name_pointer, MAX_PATH); + track_dest_name[MAX_PATH - 1] = '\0'; window_invalidate(w); } @@ -153,7 +154,7 @@ void window_install_track_open(const char* path) */ static void window_install_track_select(rct_window *w, int index) { - uint8 *trackDesignItem, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8); + utf8 *trackDesignItem, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, utf8); rct_track_design *trackDesign; w->track_list.var_480 = index; @@ -172,7 +173,7 @@ static void window_install_track_select(rct_window *w, int index) index--; trackDesignItem = trackDesignList + (index * 128); - RCT2_GLOBAL(0x00F4403C, uint8*) = trackDesignItem; + RCT2_GLOBAL(0x00F4403C, utf8*) = trackDesignItem; window_track_list_format_name( (char*)0x009BC313, diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index f5ebc59814..e4e2bdf200 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -602,6 +602,7 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co strncpy(_directory, directory, sizeof(_directory)); if (_extension != extension) { strncpy(_extension, extension, sizeof(_extension)); + _extension[sizeof(_extension) - 1] = '\0'; } _shortenedDirectory[0] = '\0'; @@ -921,7 +922,9 @@ static rct_window *window_overwrite_prompt_open(const char *name, const char *pa w->colours[0] = 154; strncpy(_window_overwrite_prompt_name, name, sizeof(_window_overwrite_prompt_name)); + _window_overwrite_prompt_name[sizeof(_window_overwrite_prompt_name) - 1] = '\0'; strncpy(_window_overwrite_prompt_path, path, sizeof(_window_overwrite_prompt_path)); + _window_overwrite_prompt_path[sizeof(_window_overwrite_prompt_path) - 1] = '\0'; return w; } From 358647d07ccfd572319a9d80b1118f73b9fc7322 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Heres?= Date: Sun, 25 Oct 2015 16:34:01 +0100 Subject: [PATCH 0894/1173] Replace constants in world/sprite.c --- src/world/sprite.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/world/sprite.c b/src/world/sprite.c index 65d7c8c5c1..51098ca2b4 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -37,7 +37,7 @@ static uint16 sprite_get_first_in_quadrant(int x, int y) static void invalidate_sprite_max_zoom(rct_sprite *sprite, int maxZoom) { - if (sprite->unknown.sprite_left == (sint16)0x8000) return; + if (sprite->unknown.sprite_left == SPRITE_LOCATION_NULL) return; for (rct_viewport** viewport_p = RCT2_ADDRESS(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); *viewport_p != NULL; viewport_p++) { rct_viewport* viewport = *viewport_p; @@ -86,7 +86,7 @@ void invalidate_sprite_2(rct_sprite *sprite) */ void reset_sprite_list(){ RCT2_GLOBAL(0x1388698, uint16) = 0; - memset(g_sprite_list, 0, sizeof(rct_sprite)* 0x2710); + memset(g_sprite_list, 0, sizeof(rct_sprite) * MAX_SPRITES); for (int i = 0; i < 6; ++i){ RCT2_ADDRESS(RCT2_ADDRESS_SPRITES_NEXT_INDEX, uint16)[i] = -1; @@ -96,8 +96,8 @@ void reset_sprite_list(){ rct_sprite* previous_spr = (rct_sprite*)SPRITE_INDEX_NULL; rct_sprite* spr = g_sprite_list; - for (int i = 0; i < 0x2710; ++i){ - spr->unknown.sprite_identifier = 0xFF; + for (int i = 0; i < MAX_SPRITES; ++i){ + spr->unknown.sprite_identifier = SPRITE_IDENTIFIER_NULL; spr->unknown.sprite_index = i; spr->unknown.next = SPRITE_INDEX_NULL; spr->unknown.linked_list_type_offset = 0; @@ -114,7 +114,7 @@ void reset_sprite_list(){ spr++; } - RCT2_GLOBAL(0x13573C8, uint16) = 0x2710; + RCT2_GLOBAL(0x13573C8, uint16) = MAX_SPRITES; reset_0x69EBE4(); } @@ -130,7 +130,7 @@ void reset_0x69EBE4(){ rct_sprite* spr = g_sprite_list; for (; spr < (rct_sprite*)RCT2_ADDRESS_SPRITES_NEXT_INDEX; spr++){ - if (spr->unknown.sprite_identifier != 0xFF){ + if (spr->unknown.sprite_identifier != SPRITE_IDENTIFIER_NULL){ uint32 edi = spr->unknown.x; if (spr->unknown.x == SPRITE_LOCATION_NULL){ edi = 0x10000; @@ -413,17 +413,17 @@ void sprite_misc_update_all() */ void sprite_move(sint16 x, sint16 y, sint16 z, rct_sprite* sprite){ if (x < 0 || y < 0 || x > 0x1FFF || y > 0x1FFF) - x = 0x8000; + x = SPRITE_LOCATION_NULL; int new_position = x; - if (x == (sint16)0x8000)new_position = 0x10000; + if (x == SPRITE_LOCATION_NULL)new_position = 0x10000; else{ new_position &= 0x1FE0; new_position = (y >> 5) | (new_position << 3); } int current_position = sprite->unknown.x; - if (sprite->unknown.x == (sint16)0x8000)current_position = 0x10000; + if (sprite->unknown.x == SPRITE_LOCATION_NULL)current_position = 0x10000; else{ current_position &= 0x1FE0; current_position = (sprite->unknown.y >> 5) | (current_position << 3); @@ -443,8 +443,8 @@ void sprite_move(sint16 x, sint16 y, sint16 z, rct_sprite* sprite){ sprite->unknown.next_in_quadrant = temp_sprite_idx; } - if (x == (sint16)0x8000){ - sprite->unknown.sprite_left = 0x8000; + if (x == SPRITE_LOCATION_NULL){ + sprite->unknown.sprite_left = SPRITE_LOCATION_NULL; sprite->unknown.x = x; sprite->unknown.y = y; sprite->unknown.z = z; From 4ac42ff1b27d3a7dbcd771317c4ac3d2dff2ce3e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 25 Oct 2015 16:00:21 +0000 Subject: [PATCH 0895/1173] add vehicle struct, enum labels and helper functions from implement-ride-create-vehicles branch. --- src/interface/viewport.c | 34 +++---- src/object.c | 58 ++++++----- src/peep/peep.c | 12 +-- src/ride/ride.c | 203 +++++++++++++++++++++++++++++++++------ src/ride/ride.h | 46 --------- src/ride/ride_data.c | 31 +++--- src/ride/station.c | 2 +- src/ride/track.c | 5 + src/ride/track.h | 2 + src/ride/vehicle.c | 54 +++++++++-- src/ride/vehicle.h | 121 ++++++++++++++++++++--- src/windows/ride.c | 12 +-- src/world/map.c | 21 +++- src/world/map.h | 2 + 14 files changed, 429 insertions(+), 174 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 3678c97d7c..e25d1aa564 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -907,23 +907,23 @@ void viewport_vehicle_paint_setup(rct_vehicle *vehicle, int imageDirection) uint32 rct2VehiclePtrFormat = ((uint32)vehicleEntry) - offsetof(rct_ride_type, vehicles); RCT2_GLOBAL(0x00F64DFC, uint32) = rct2VehiclePtrFormat; - switch (vehicleEntry->var_5D) { - case 0: RCT2_CALLPROC_X(0x006D45F8, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 2: RCT2_CALLPROC_X(0x006D5FAB, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 3: RCT2_CALLPROC_X(0x006D6258, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 4: RCT2_CALLPROC_X(0x006D5889, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 5: RCT2_CALLPROC_X(0x006D42F0, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 6: RCT2_CALLPROC_X(0x006D43C6, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 7: RCT2_CALLPROC_X(0x006D4453, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 8: RCT2_CALLPROC_X(0x006D4295, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 9: RCT2_CALLPROC_X(0x006D5DA9, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 10: RCT2_CALLPROC_X(0x006D5600, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 11: RCT2_CALLPROC_X(0x006D5696, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 12: RCT2_CALLPROC_X(0x006D57EE, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 13: RCT2_CALLPROC_X(0x006D5783, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 14: RCT2_CALLPROC_X(0x006D5701, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 15: RCT2_CALLPROC_X(0x006D5B48, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; - case 16: RCT2_CALLPROC_X(0x006D44D5, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + switch (vehicleEntry->car_visual) { + case VEHICLE_VISUAL_DEFAULT: RCT2_CALLPROC_X(0x006D45F8, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case VEHICLE_VISUAL_LAUNCHED_FREEFALL: RCT2_CALLPROC_X(0x006D5FAB, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case VEHICLE_VISUAL_OBSERVATION_TOWER: RCT2_CALLPROC_X(0x006D6258, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case VEHICLE_VISUAL_RIVER_RAPIDS: RCT2_CALLPROC_X(0x006D5889, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case VEHICLE_VISUAL_MINI_GOLF_PLAYER: RCT2_CALLPROC_X(0x006D42F0, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case VEHICLE_VISUAL_MINI_GOLF_BALL: RCT2_CALLPROC_X(0x006D43C6, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case VEHICLE_VISUAL_REVERSER: RCT2_CALLPROC_X(0x006D4453, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case VEHICLE_VISUAL_SPLASH_BOATS_OR_WATER_COASTER: RCT2_CALLPROC_X(0x006D4295, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case VEHICLE_VISUAL_ROTO_DROP: RCT2_CALLPROC_X(0x006D5DA9, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 10: RCT2_CALLPROC_X(0x006D5600, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 11: RCT2_CALLPROC_X(0x006D5696, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 12: RCT2_CALLPROC_X(0x006D57EE, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 13: RCT2_CALLPROC_X(0x006D5783, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case 14: RCT2_CALLPROC_X(0x006D5701, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case VEHICLE_VISUAL_VIRGINIA_REEL: RCT2_CALLPROC_X(0x006D5B48, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; + case VEHICLE_VISUAL_SUBMARINE: RCT2_CALLPROC_X(0x006D44D5, x, imageDirection, y, z, (int)vehicle, rct2VehiclePtrFormat, 0); break; } } diff --git a/src/object.c b/src/object.c index 85d69ccab6..96badbb090 100644 --- a/src/object.c +++ b/src/object.c @@ -480,20 +480,18 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp for (int i = 0; i < 4; ++i){ rct_ride_type_vehicle* rideVehicleEntry = &ride_type->vehicles[i]; - if (rideVehicleEntry->var_0C & 1){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT) { int al = 1; - if (rideVehicleEntry->var_14 & 2) - { + if (rideVehicleEntry->var_14 & 2) { al = 13; - if ((rideVehicleEntry->var_14 & 0x820) != 0x820) - { + if ((rideVehicleEntry->var_14 & 0x820) != 0x820) { al = 7; - if (!(rideVehicleEntry->var_14 & 0x20)) - { - if (!(rideVehicleEntry->var_14 & 0x800)) - { + if (!(rideVehicleEntry->var_14 & 0x20)) { + if (!(rideVehicleEntry->var_14 & 0x800)) { al = 5; - if (rideVehicleEntry->var_14 & 0x200) al = 3; + if (rideVehicleEntry->var_14 & 0x200) { + al = 3; + } } } } @@ -514,7 +512,7 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp } } } - if (rideVehicleEntry->var_12 & 0x1000) al = rideVehicleEntry->var_60; + if (rideVehicleEntry->var_12 & 0x1000) al = rideVehicleEntry->special_frames; rideVehicleEntry->var_02 = al; // 0x6DE946 @@ -522,16 +520,16 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp rideVehicleEntry->base_image_id = cur_vehicle_images_offset; int image_index = rideVehicleEntry->base_image_id; - if (rideVehicleEntry->var_5D != 4){ + if (rideVehicleEntry->car_visual != VEHICLE_VISUAL_RIVER_RAPIDS) { int b = rideVehicleEntry->var_16 * 32; if (rideVehicleEntry->var_12 & 0x800) b /= 2; - if (rideVehicleEntry->var_0C & 0x8000) b /= 8; + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_15) b /= 8; image_index += b; // Incline 25 - if (rideVehicleEntry->var_0C & 0x2){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_GENTLE_SLOPES) { rideVehicleEntry->var_20 = image_index; b = rideVehicleEntry->var_16 * 72; if (rideVehicleEntry->var_12 & 0x4000) @@ -541,81 +539,81 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp } // Incline 60 - if (rideVehicleEntry->var_0C & 0x4){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_STEEP_SLOPES) { rideVehicleEntry->var_24 = image_index; b = rideVehicleEntry->var_16 * 80; image_index += b; } // Verticle - if (rideVehicleEntry->var_0C & 0x8){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES) { rideVehicleEntry->var_28 = image_index; b = rideVehicleEntry->var_16 * 116; image_index += b; } // Unknown - if (rideVehicleEntry->var_0C & 0x10){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES) { rideVehicleEntry->var_2C = image_index; b = rideVehicleEntry->var_16 * 24; image_index += b; } // Bank - if (rideVehicleEntry->var_0C & 0x20){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT_BANKED) { rideVehicleEntry->var_30 = image_index; b = rideVehicleEntry->var_16 * 80; image_index += b; } - if (rideVehicleEntry->var_0C & 0x40){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_INLINE_TWISTS) { rideVehicleEntry->var_34 = image_index; b = rideVehicleEntry->var_16 * 40; image_index += b; } // Track half? Up/Down - if (rideVehicleEntry->var_0C & 0x80){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS) { rideVehicleEntry->var_38 = image_index; b = rideVehicleEntry->var_16 * 128; image_index += b; } // Unknown - if (rideVehicleEntry->var_0C & 0x100){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS) { rideVehicleEntry->var_3C = image_index; b = rideVehicleEntry->var_16 * 16; image_index += b; } // Unknown - if (rideVehicleEntry->var_0C & 0x200){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS) { rideVehicleEntry->var_40 = image_index; b = rideVehicleEntry->var_16 * 16; image_index += b; } - if (rideVehicleEntry->var_0C & 0x400){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS) { rideVehicleEntry->var_44 = image_index; b = rideVehicleEntry->var_16 * 128; image_index += b; } - if (rideVehicleEntry->var_0C & 0x800){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS) { rideVehicleEntry->var_48 = image_index; b = rideVehicleEntry->var_16 * 16; image_index += b; } - if (rideVehicleEntry->var_0C & 0x1000){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_CORKSCREWS) { rideVehicleEntry->var_4C = image_index; b = rideVehicleEntry->var_16 * 80; image_index += b; } // Unknown - if (rideVehicleEntry->var_0C & 0x2000){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION) { rideVehicleEntry->var_1C = image_index; b = rideVehicleEntry->var_16 * 12; image_index += b; } - if (rideVehicleEntry->var_0C & 0x4000){ + if (rideVehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_14) { // Same offset as above??? rideVehicleEntry->var_4C = image_index; b = rideVehicleEntry->var_16 * 32; @@ -715,9 +713,9 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp rideVehicleEntry->var_16 = 0; if (!(rideVehicleEntry->var_12 & 0x400)){ - rideVehicleEntry->var_0E = 0; - rideVehicleEntry->var_0F = 0; - rideVehicleEntry->var_10 = 0; + rideVehicleEntry->sprite_width = 0; + rideVehicleEntry->sprite_height_negative = 0; + rideVehicleEntry->sprite_height_positive = 0; } rideVehicleEntry->var_02 = 0; rideVehicleEntry->var_03 = 0; diff --git a/src/peep/peep.c b/src/peep/peep.c index c1ca5f5c1d..6591668e3a 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -2245,7 +2245,7 @@ static void peep_update_ride_sub_state_5(rct_peep* peep){ vehicle->num_peeps++; ride->var_120++; - vehicle->var_46 += seated_peep->var_41; + vehicle->friction += seated_peep->var_41; invalidate_sprite_2((rct_sprite*)seated_peep); sprite_move(0x8000, 0, 0, (rct_sprite*)seated_peep); @@ -2260,7 +2260,7 @@ static void peep_update_ride_sub_state_5(rct_peep* peep){ vehicle->num_peeps++; ride->var_120++; - vehicle->var_46 += peep->var_41; + vehicle->friction += peep->var_41; invalidate_sprite_2((rct_sprite*)vehicle); invalidate_sprite_2((rct_sprite*)peep); @@ -2300,7 +2300,7 @@ void peep_update_ride_sub_state_7(rct_peep* peep){ peep->action_sprite_image_offset = 0; vehicle->num_peeps--; - vehicle->var_46 -= peep->var_41; + vehicle->friction -= peep->var_41; invalidate_sprite_2((rct_sprite*)vehicle); peep->current_ride_station = ride_station; @@ -2321,16 +2321,16 @@ void peep_update_ride_sub_state_7(rct_peep* peep){ if (!(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & RIDE_TYPE_FLAG_16)){ - for (; vehicle->var_01 != 0; vehicle = GET_VEHICLE(vehicle->prev_vehicle_on_train)){ + for (; vehicle->is_child; vehicle = GET_VEHICLE(vehicle->prev_vehicle_on_ride)){ uint16 eax = vehicle->var_36 / 4; if (eax == 0 || eax > 3) continue; - rct_map_element* inner_map = map_get_first_element_at(vehicle->var_38 / 32, vehicle->var_3A / 32); + rct_map_element* inner_map = map_get_first_element_at(vehicle->track_x / 32, vehicle->track_y / 32); for (;; inner_map++){ if (map_element_get_type(inner_map) != MAP_ELEMENT_TYPE_TRACK) continue; - if (inner_map->base_height == vehicle->var_3C / 8) + if (inner_map->base_height == vehicle->track_z / 8) break; } diff --git a/src/ride/ride.c b/src/ride/ride.c index 78e657938c..e9af8a942c 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -901,7 +901,7 @@ static void ride_remove_cable_lift(rct_ride *ride) ride->lifecycle_flags &= ~RIDE_LIFECYCLE_CABLE_LIFT; spriteIndex = ride->cable_lift; do { - vehicle = &(g_sprite_list[spriteIndex].vehicle); + vehicle = GET_VEHICLE(spriteIndex); invalidate_sprite_2((rct_sprite*)vehicle); sprite_remove((rct_sprite*)vehicle); spriteIndex = vehicle->next_vehicle_on_train; @@ -926,7 +926,7 @@ static void ride_remove_vehicles(rct_ride *ride) for (i = 0; i < 32; i++) { spriteIndex = ride->vehicles[i]; while (spriteIndex != SPRITE_INDEX_NULL) { - vehicle = &(g_sprite_list[spriteIndex].vehicle); + vehicle = GET_VEHICLE(spriteIndex); invalidate_sprite_2((rct_sprite*)vehicle); sprite_remove((rct_sprite*)vehicle); spriteIndex = vehicle->next_vehicle_on_train; @@ -1448,7 +1448,7 @@ void ride_construction_set_default_next_piece() // Set track slope and lift hill _currentTrackSlopeEnd = slope; _previousTrackSlopeEnd = slope; - _currentTrackLiftHill = (mapElement->type & 0x80) != 0; + _currentTrackLiftHill = track_element_is_lift_hill(mapElement); break; } } @@ -1874,7 +1874,7 @@ static void ride_update(int rideIndex) 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); + rct_vehicle *vehicle = GET_VEHICLE(ride->vehicles[i]); if (vehicle->status == VEHICLE_STATUS_CRASHED || vehicle->status == VEHICLE_STATUS_CRASHING) { ride_set_status(rideIndex, RIDE_STATUS_CLOSED); @@ -2241,14 +2241,14 @@ void ride_prepare_breakdown(int rideIndex, int breakdownReason) ride->broken_car = scenario_rand() % ride->num_cars_per_train; // Set flag on broken car - vehicle = &(g_sprite_list[ride->vehicles[ride->broken_vehicle]].vehicle); + vehicle = GET_VEHICLE(ride->vehicles[ride->broken_vehicle]); for (i = ride->broken_car; i > 0; i--) { if (vehicle->next_vehicle_on_train == (uint16)0xFFFFFFFF) { vehicle = NULL; break; } else { - vehicle = &(g_sprite_list[vehicle->next_vehicle_on_train].vehicle); + vehicle = GET_VEHICLE(vehicle->next_vehicle_on_train); } } if (vehicle != NULL) @@ -2260,7 +2260,7 @@ void ride_prepare_breakdown(int rideIndex, int breakdownReason) ride->broken_car = 0; // Set flag on broken train, first car - vehicle = &(g_sprite_list[ride->vehicles[ride->broken_vehicle]].vehicle); + vehicle = GET_VEHICLE(ride->vehicles[ride->broken_vehicle]); vehicle->var_48 |= 0x200; break; case BREAKDOWN_BRAKES_FAILURE: @@ -2587,7 +2587,7 @@ static void ride_music_update(int rideIndex) } if (ride->type == RIDE_TYPE_CIRCUS_SHOW) { - vehicle = &(g_sprite_list[ride->vehicles[0]].vehicle); + vehicle = GET_VEHICLE(ride->vehicles[0]); if (vehicle->status != VEHICLE_STATUS_DOING_CIRCUS_SHOW) { ride->music_tune_id = 255; return; @@ -2678,7 +2678,7 @@ void ride_measurement_update(rct_ride_measurement *measurement) if (spriteIndex == SPRITE_INDEX_NULL) return; - vehicle = &(g_sprite_list[spriteIndex].vehicle); + vehicle = GET_VEHICLE(spriteIndex); if (measurement->flags & RIDE_MEASUREMENT_FLAG_UNLOADING) { if (vehicle->status != VEHICLE_STATUS_DEPARTING && vehicle->status != VEHICLE_STATUS_STOPPING) @@ -2766,7 +2766,7 @@ void ride_measurements_update() if (spriteIndex == SPRITE_INDEX_NULL) continue; - vehicle = &(g_sprite_list[spriteIndex].vehicle); + vehicle = GET_VEHICLE(spriteIndex); if (vehicle->status == VEHICLE_STATUS_DEPARTING || vehicle->status == VEHICLE_STATUS_STOPPING) { measurement->vehicle_index = j; measurement->current_station = vehicle->current_station; @@ -4156,13 +4156,152 @@ static int sub_69ED9E() return max(0, miscSpriteCount + unkCount - 300); } +void vehicle_unset_var_48_b1(rct_vehicle *head) +{ + uint16 spriteIndex; + rct_vehicle *vehicle = head; + while (true) { + vehicle->var_48 &= ~(1 << 1); + spriteIndex = vehicle->next_vehicle_on_train; + if (spriteIndex == SPRITE_INDEX_NULL) { + break; + } + vehicle = GET_VEHICLE(spriteIndex); + } +} + +/** + * + * rct2: 0x006DDE9E + */ +void ride_create_vehicles_find_first_block(rct_ride *ride, rct_xy_element *outXYElement) +{ + rct_vehicle *vehicle = GET_VEHICLE(ride->vehicles[0]); + int firstX = vehicle->track_x; + int firstY = vehicle->track_y; + int firstZ = vehicle->track_z; + rct_map_element *firstElement = map_get_track_element_at(firstX, firstY, firstZ / 8); + + assert(firstElement != NULL); + + int x = firstX; + int y = firstY; + int z = firstZ; + rct_map_element *trackElement = firstElement; + track_begin_end trackBeginEnd; + while (track_block_get_previous(x, y, trackElement, &trackBeginEnd)) { + x = trackBeginEnd.begin_x; + y = trackBeginEnd.begin_y; + trackElement = trackBeginEnd.begin_element; + if (x == firstX && y == firstY && trackElement == firstElement) { + break; + } + + int trackType = trackElement->properties.track.type; + switch (trackType) { + case TRACK_ELEM_25_DEG_UP_TO_FLAT: + case TRACK_ELEM_60_DEG_UP_TO_FLAT: + if (track_element_is_lift_hill(trackElement)) { + outXYElement->x = x; + outXYElement->y = y; + outXYElement->element = trackElement; + return; + } + break; + case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT: + case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT: + if (track_element_is_lift_hill(trackElement)) { + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; + if (mapElement->base_height != z) continue; + if ((mapElement->properties.track.sequence & 0x0F) != 0) continue; + if (mapElement->properties.track.type != trackType) continue; + break; + } while (!map_element_is_last_for_tile(mapElement)); + + outXYElement->x = x; + outXYElement->y = y; + outXYElement->element = mapElement; + return; + } + break; + case TRACK_ELEM_END_STATION: + case TRACK_ELEM_CABLE_LIFT_HILL: + case 216: + outXYElement->x = x; + outXYElement->y = y; + outXYElement->element = trackElement; + return; + } + } + + outXYElement->x = firstX; + outXYElement->y = firstY; + outXYElement->element = firstElement; +} + +/** + * + * rct2: 0x006DDF9C + */ +void loc_6DDF9C(rct_ride *ride, rct_map_element *mapElement) +{ + registers regs; + rct_vehicle *train, *car; + + for (int i = 0; i < ride->num_vehicles; i++) { + train = GET_VEHICLE(ride->vehicles[i]); + if (i == 0) { + sub_6DAB4C(train, NULL); + vehicle_unset_var_48_b1(train); + continue; + } + + do { + mapElement->flags |= (1 << 5); + car = train; + while (true) { + car->velocity = 0; + car->var_2C = 0; + car->var_4A = 0; + car->var_24 += 13962; + + uint16 spriteIndex = car->next_vehicle_on_train; + if (spriteIndex == SPRITE_INDEX_NULL) { + break; + } + car = GET_VEHICLE(spriteIndex); + } + } while (sub_6DAB4C(train, NULL) & 0x400); + + mapElement->flags |= (1 << 5); + car = train; + while (true) { + car->var_48 &= ~(1 << 1); + car->status = VEHICLE_STATUS_TRAVELLING; + regs.ax = car->var_36 >> 2; + if (regs.al == 1) { + car->status = VEHICLE_STATUS_MOVING_TO_END_OF_STATION; + } + + uint16 spriteIndex = car->next_vehicle_on_train; + if (spriteIndex == SPRITE_INDEX_NULL) { + break; + } + car = GET_VEHICLE(spriteIndex); + } + } +} + /** * * rct2: 0x006DD84C */ -int ride_create_vehicles(rct_ride *ride, int rideIndex, rct_xy_element *element, int isApplying) +bool ride_create_vehicles(rct_ride *ride, int rideIndex, rct_xy_element *element, int isApplying) { - return RCT2_CALLPROC_X(0x006DD84C, element->x, isApplying, element->y, rideIndex, (int)ride, (int)element->element, 0) & 0x100; + bool b = !(RCT2_CALLPROC_X(0x006DD84C, element->x, isApplying, element->y, rideIndex, (int)ride, (int)element->element, 0) & 0x100); + return b; } /** @@ -4325,13 +4464,13 @@ bool ride_create_cable_lift(int rideIndex, bool isApplying) head = current; } else { tail->next_vehicle_on_train = current->sprite_index; - tail->next_or_first_vehicle_on_train = current->sprite_index; - current->prev_vehicle_on_train = tail->sprite_index; + tail->next_vehicle_on_ride = current->sprite_index; + current->prev_vehicle_on_ride = tail->sprite_index; } tail = current; } - head->prev_vehicle_on_train = tail->sprite_index; - tail->next_or_first_vehicle_on_train = head->sprite_index; + head->prev_vehicle_on_ride = tail->sprite_index; + tail->next_vehicle_on_ride = head->sprite_index; ride->lifecycle_flags |= RIDE_LIFECYCLE_CABLE_LIFT; sub_6DEF56(head); @@ -4547,9 +4686,10 @@ int ride_is_valid_for_test(int rideIndex, int goingToBeOpen, int isApplying) if ( !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_13) && !(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) - ) { - if (ride_create_vehicles(ride, rideIndex, &trackElement, isApplying)) + ) { + if (!ride_create_vehicles(ride, rideIndex, &trackElement, isApplying)) { return 0; + } } if ( @@ -4671,8 +4811,9 @@ int ride_is_valid_for_open(int rideIndex, int goingToBeOpen, int isApplying) !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_13) && !(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) ) { - if (ride_create_vehicles(ride, rideIndex, &trackElement, isApplying)) + if (!ride_create_vehicles(ride, rideIndex, &trackElement, isApplying)) { return 0; + } } if ( @@ -5890,9 +6031,9 @@ void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int n bl += 16; } - vehicle_type->var_0E = al; - vehicle_type->var_0F = bl; - vehicle_type->var_10 = bh; + vehicle_type->sprite_width = al; + vehicle_type->sprite_height_negative = bl; + vehicle_type->sprite_height_positive = bh; } /** @@ -6192,7 +6333,7 @@ void invalidate_test_results(int rideIndex) for (int i = 0; i < ride->num_vehicles; i++) { uint16 spriteIndex = ride->vehicles[i]; if (spriteIndex != SPRITE_INDEX_NULL) { - rct_vehicle *vehicle = &(g_sprite_list[spriteIndex].vehicle); + rct_vehicle *vehicle = GET_VEHICLE(spriteIndex); vehicle->var_48 &= ~(1 << 5); } } @@ -6220,7 +6361,7 @@ void ride_fix_breakdown(int rideIndex, int reliabilityIncreaseFactor) for (int i = 0; i < ride->num_vehicles; i++) { spriteIndex = ride->vehicles[i]; while (spriteIndex != SPRITE_INDEX_NULL) { - vehicle = &(g_sprite_list[spriteIndex].vehicle); + vehicle = GET_VEHICLE(spriteIndex); vehicle->var_48 &= ~(1 << 7); vehicle->var_48 &= ~(1 << 8); vehicle->var_48 &= ~(1 << 9); @@ -6254,7 +6395,7 @@ static void ride_update_vehicle_colours(int rideIndex) int carIndex = 0; spriteIndex = ride->vehicles[i]; while (spriteIndex != SPRITE_INDEX_NULL) { - vehicle = &(g_sprite_list[spriteIndex].vehicle); + vehicle = GET_VEHICLE(spriteIndex); switch (ride->colour_scheme_type & 3) { case RIDE_COLOUR_SCHEME_ALL_SAME: colours = ride->vehicle_colours[0]; @@ -6404,7 +6545,7 @@ void ride_update_max_vehicles(int rideIndex) for (int i = 0; i < numCars; i++) { vehicleEntry = &rideEntry->vehicles[trainLayout[i]]; trainLength += vehicleEntry->var_04; - totalFriction += vehicleEntry->var_08; + totalFriction += vehicleEntry->car_friction; } if (trainLength <= stationLength && totalFriction <= maxFriction) { @@ -6456,7 +6597,7 @@ void ride_update_max_vehicles(int rideIndex) } else { ride_entry_get_train_layout(ride->subtype, newCarsPerTrain, trainLayout); vehicleEntry = &rideEntry->vehicles[trainLayout[0]]; - int unk = vehicleEntry->var_5C; + int speed = vehicleEntry->powered_max_speed; int totalSpacing = 0; for (int i = 0; i < newCarsPerTrain; i++) { @@ -6466,9 +6607,9 @@ void ride_update_max_vehicles(int rideIndex) totalSpacing >>= 13; int trackLength = ride_get_track_length(ride) / 4; - if (unk > 10) trackLength = (trackLength * 3) / 4; - if (unk > 25) trackLength = (trackLength * 3) / 4; - if (unk > 40) trackLength = (trackLength * 3) / 4; + if (speed > 10) trackLength = (trackLength * 3) / 4; + if (speed > 25) trackLength = (trackLength * 3) / 4; + if (speed > 40) trackLength = (trackLength * 3) / 4; maxNumTrains = 0; int length = 0; @@ -6976,7 +7117,7 @@ void ride_crash(int rideIndex, int vehicleIndex) vehicleIndex &= 0xFF; ride = GET_RIDE(rideIndex); - vehicle = &(g_sprite_list[ride->vehicles[vehicleIndex]]).vehicle; + vehicle = GET_VEHICLE(ride->vehicles[vehicleIndex]); w = window_ride_open_vehicle(vehicle); if (w->viewport != NULL) { diff --git a/src/ride/ride.h b/src/ride/ride.h index a8d269a2a3..e1320f4da8 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -70,52 +70,6 @@ typedef struct { vehicle_colour list[256]; } vehicle_colour_preset_list; -/** - * Ride type vehicle structure. - * size: 0x65 - */ -typedef struct{ - uint16 var_00; // 0x00 , 0x1A - uint8 var_02; // 0x02 , 0x1C - uint8 var_03; // 0x03 , 0x1D - uint32 var_04; // 0x04 , 0x1E - uint16 var_08; // 0x08 , 0x22 - sint8 var_0A; // 0x0A , 0x24 - uint8 pad_0B; - uint16 var_0C; // 0x0C , 0x26 - uint8 var_0E; // 0x0E , 0x28 - uint8 var_0F; // 0x0F , 0x29 - uint8 var_10; // 0x10 , 0x2A - uint8 var_11; // 0x11 , 0x2B - uint16 var_12; // 0x12 , 0x2C - uint16 var_14; // 0x14 , 0x2E - uint16 var_16; // 0x16 , 0x30 - uint32 base_image_id; // 0x18 , 0x32 - uint32 var_1C; // 0x1C , 0x36 - uint32 var_20; // 0x20 , 0x3A - uint32 var_24; // 0x24 , 0x3E - uint32 var_28; // 0x28 , 0x42 - uint32 var_2C; // 0x2C , 0x46 - uint32 var_30; // 0x30 , 0x4A - uint32 var_34; // 0x34 , 0x4E - uint32 var_38; // 0x38 , 0x52 - uint32 var_3C; // 0x3C , 0x56 - uint32 var_40; // 0x40 , 0x5A - uint32 var_44; // 0x44 , 0x5E - uint32 var_48; // 0x48 , 0x62 - uint32 var_4C; // 0x4C , 0x66 - uint32 no_vehicle_images; // 0x50 , 0x6A - uint8 no_seating_rows; // 0x54 , 0x6E - uint8 pad_55[0x5]; - uint8 var_5A; // 0x5A , 0x74 - uint8 pad_5B; // 0x5B , 0x75 - uint8 var_5C; // 0x5C , 0x76 - uint8 var_5D; // 0x5D , 0x77 - uint8 pad_5E[0x2]; - uint8 var_60; // 0x60 , 0x7A - sint8* peep_loading_positions; // 0x61 , 0x7B -} rct_ride_type_vehicle; - /** * Ride type structure. * size: unknown diff --git a/src/ride/ride_data.c b/src/ride/ride_data.c index 5cd410bfae..c3679300e7 100644 --- a/src/ride/ride_data.c +++ b/src/ride/ride_data.c @@ -1253,17 +1253,17 @@ const uint32 ShopItemImage[SHOP_ITEM_COUNT] = { }; const rct_ride_type_vehicle CableLiftVehicle = { - .var_00 = 0x1F, + .rotation_frame_mask = 31, .var_02 = 0, .var_03 = 0, .var_04 = 0, - .var_08 = 0, - .var_0A = 0, - .pad_0B = 0, - .var_0C = 0x7, - .var_0E = 0, - .var_0F = 0, - .var_10 = 0, + .car_friction = 0, + .tab_height = 0, + .num_seats = 0, + .sprite_flags = 0x7, + .sprite_width = 0, + .sprite_height_negative = 0, + .sprite_height_positive = 0, .var_11 = 0, .var_12 = 0, .var_14 = 0, @@ -1284,12 +1284,15 @@ const rct_ride_type_vehicle CableLiftVehicle = { .var_4C = 0, .no_vehicle_images = 0, .no_seating_rows = 0, - .pad_55 = { 0,0xFF,0,0,0 }, + .spinning_inertia = 0, + .spinning_friction = 255, + .pad_57 = { 0,0,0 }, .var_5A = 0, - .pad_5B = 0, - .var_5C = 0, - .var_5D = 0, - .pad_5E = { 1,0xE }, - .var_60 = 0, + .powered_acceleration = 0, + .powered_max_speed = 0, + .car_visual = 0, + .pad_5E = { 1 }, + .draw_order = 14, + .special_frames = 0, .peep_loading_positions = NULL }; \ No newline at end of file diff --git a/src/ride/station.c b/src/ride/station.c index fcdda75918..5870e66050 100644 --- a/src/ride/station.c +++ b/src/ride/station.c @@ -252,7 +252,7 @@ static void ride_race_init_vehicle_speeds(rct_ride *ride) rideEntry = GET_RIDE_ENTRY(vehicle->ride_subtype); - vehicle->speed = (scenario_rand() & 16) - 8 + rideEntry->vehicles[vehicle->vehicle_type].var_5C; + vehicle->speed = (scenario_rand() & 16) - 8 + rideEntry->vehicles[vehicle->vehicle_type].powered_max_speed; if (vehicle->num_peeps != 0) { rct_peep *peep = &g_sprite_list[vehicle->peep[0]].peep; diff --git a/src/ride/track.c b/src/ride/track.c index 20ff56b066..06fe6d5179 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -4819,3 +4819,8 @@ void track_get_front(rct_xy_element *input, rct_xy_element *output) } while (result); *output = lastTrack; } + +bool track_element_is_lift_hill(rct_map_element *trackElement) +{ + return trackElement->type & 0x80; +} diff --git a/src/ride/track.h b/src/ride/track.h index 07d4a6343d..64d9ed5596 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -540,4 +540,6 @@ bool track_circuit_iterator_next(track_circuit_iterator *it); void track_get_back(rct_xy_element *input, rct_xy_element *output); void track_get_front(rct_xy_element *input, rct_xy_element *output); +bool track_element_is_lift_hill(rct_map_element *trackElement); + #endif diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index 285704aa1c..ca188b2251 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -138,7 +138,7 @@ int sub_6BC2F3(rct_vehicle* vehicle) int result = 0; rct_vehicle* vehicle_temp = vehicle; do { - result += vehicle_temp->var_46; + result += vehicle_temp->friction; } while (vehicle_temp->next_vehicle_on_train != (uint16)-1 && (vehicle_temp = GET_VEHICLE(vehicle_temp->next_vehicle_on_train))); sint32 v4 = vehicle->velocity; if (v4 < 0) { @@ -482,8 +482,9 @@ void vehicle_set_map_toolbar(rct_vehicle *vehicle) ride = GET_RIDE(vehicle->ride); - while (vehicle->var_01 != 0) - vehicle = &(g_sprite_list[vehicle->prev_vehicle_on_train].vehicle); + while (vehicle->is_child) { + vehicle = GET_VEHICLE(vehicle->prev_vehicle_on_ride); + } for (vehicleIndex = 0; vehicleIndex < 32; vehicleIndex++) if (ride->vehicles[vehicleIndex] == vehicle->sprite_index) @@ -507,7 +508,7 @@ rct_vehicle *vehicle_get_head(rct_vehicle *vehicle) rct_vehicle *prevVehicle; for (;;) { - prevVehicle = &(g_sprite_list[vehicle->prev_vehicle_on_train].vehicle); + prevVehicle = GET_VEHICLE(vehicle->prev_vehicle_on_ride); if (prevVehicle->next_vehicle_on_train == SPRITE_INDEX_NULL) break; @@ -542,16 +543,16 @@ rct_vehicle *cable_lift_segment_create(int rideIndex, int x, int y, int z, int d move_sprite_to_list((rct_sprite*)current, SPRITE_LINKEDLIST_OFFSET_VEHICLE); ride->cable_lift = current->sprite_index; } - current->var_01 = head ? 0 : 1; + current->is_child = head ? 0 : 1; current->var_44 = var_44; current->var_24 = var_24; current->sprite_width = 10; current->sprite_height_negative = 10; current->sprite_height_positive = 10; - current->var_46 = 100; + current->friction = 100; current->num_seats = 0; current->speed = 20; - current->var_C3 = 80; + current->acceleration = 80; current->velocity = 0; current->var_2C = 0; current->var_4A = 0; @@ -574,11 +575,11 @@ rct_vehicle *cable_lift_segment_create(int rideIndex, int x, int y, int z, int d } current->var_CD = 0; current->sprite_direction = direction << 3; - current->var_38 = x; - current->var_3A = y; + current->track_x = x; + current->track_y = y; z = z * 8; - current->var_3C = z; + current->track_z = z; z += RCT2_GLOBAL(0x0097D21A + (ride->type * 8), uint8); sprite_move(16, 16, z, (rct_sprite*)current); @@ -591,3 +592,36 @@ rct_vehicle *cable_lift_segment_create(int rideIndex, int x, int y, int z, int d current->next_free_seat = 0; return current; } + +/** + * + * rct2: 0x006DAB4C + */ +int sub_6DAB4C(rct_vehicle *vehicle, int *outStation) +{ + registers regs; + regs.esi = (int)vehicle; + + RCT2_CALLFUNC_Y(0x006DAB4C, ®s); + + if (outStation != NULL) *outStation = regs.ebx; + return regs.eax; +} + +/** + * + * rct2: 0x006DD365 + */ +bool sub_6DD365(rct_vehicle *vehicle) +{ + registers regs; + regs.esi = (int)vehicle; + + return RCT2_CALLFUNC_Y(0x006DD365, ®s) & 0x100; +} + +rct_ride_type_vehicle *vehicle_get_vehicle_entry(rct_vehicle *vehicle) +{ + rct_ride_type *rideEntry = GET_RIDE_ENTRY(vehicle->ride_subtype); + return &rideEntry->vehicles[vehicle->vehicle_type]; +} diff --git a/src/ride/vehicle.h b/src/ride/vehicle.h index 542fac531a..a1869f2008 100644 --- a/src/ride/vehicle.h +++ b/src/ride/vehicle.h @@ -29,9 +29,58 @@ typedef struct{ uint8 trim_colour; } rct_vehicle_colour; +/** + * Ride type vehicle structure. + * size: 0x65 + */ +typedef struct { + uint16 rotation_frame_mask; // 0x00 , 0x1A + uint8 var_02; // 0x02 , 0x1C + uint8 var_03; // 0x03 , 0x1D + uint32 var_04; // 0x04 , 0x1E + uint16 car_friction; // 0x08 , 0x22 + sint8 tab_height; // 0x0A , 0x24 + uint8 num_seats; // 0x0B , 0x25 + uint16 sprite_flags; // 0x0C , 0x26 + uint8 sprite_width; // 0x0E , 0x28 + uint8 sprite_height_negative; // 0x0F , 0x29 + uint8 sprite_height_positive; // 0x10 , 0x2A + uint8 var_11; // 0x11 , 0x2B + uint16 var_12; // 0x12 , 0x2C + uint16 var_14; // 0x14 , 0x2E + uint16 var_16; // 0x16 , 0x30 + uint32 base_image_id; // 0x18 , 0x32 + uint32 var_1C; // 0x1C , 0x36 + uint32 var_20; // 0x20 , 0x3A + uint32 var_24; // 0x24 , 0x3E + uint32 var_28; // 0x28 , 0x42 + uint32 var_2C; // 0x2C , 0x46 + uint32 var_30; // 0x30 , 0x4A + uint32 var_34; // 0x34 , 0x4E + uint32 var_38; // 0x38 , 0x52 + uint32 var_3C; // 0x3C , 0x56 + uint32 var_40; // 0x40 , 0x5A + uint32 var_44; // 0x44 , 0x5E + uint32 var_48; // 0x48 , 0x62 + uint32 var_4C; // 0x4C , 0x66 + uint32 no_vehicle_images; // 0x50 , 0x6A + uint8 no_seating_rows; // 0x54 , 0x6E + uint8 spinning_inertia; // 0x55 , 0x6F + uint8 spinning_friction; // 0x56 , 0x70 + uint8 pad_57[0x3]; + uint8 var_5A; // 0x5A , 0x74 + uint8 powered_acceleration; // 0x5B , 0x75 + uint8 powered_max_speed; // 0x5C , 0x76 + uint8 car_visual; // 0x5D , 0x77 + uint8 pad_5E; + uint8 draw_order; + uint8 special_frames; // 0x60 , 0x7A + sint8* peep_loading_positions; // 0x61 , 0x7B +} rct_ride_type_vehicle; + typedef struct { uint8 sprite_identifier; // 0x00 - uint8 var_01; + uint8 is_child; // 0x01 uint16 next_in_quadrant; // 0x02 uint16 next; // 0x04 uint16 previous; // 0x06 @@ -63,17 +112,19 @@ typedef struct { rct_vehicle_colour colours; // 0x32 uint16 var_34; sint16 var_36; - //x related - uint16 var_38; - // y related - uint16 var_3A; - // z related - uint16 var_3C; + uint16 track_x; // 0x38 + uint16 track_y; // 0x3A + uint16 track_z; // 0x3C uint16 next_vehicle_on_train; // 0x3E - uint16 prev_vehicle_on_train; // 0x40 - uint16 next_or_first_vehicle_on_train; // 0x42 + + // The previous vehicle on the same train or the last vehicle on the previous or only train. + uint16 prev_vehicle_on_ride; // 0x40 + + // The next vehicle on the same train or the first vehicle on the next or only train + uint16 next_vehicle_on_ride; // 0x42 + uint16 var_44; - uint16 var_46; + uint16 friction; // 0x46 uint16 var_48; uint8 var_4A; uint8 current_station; // 0x4B @@ -97,7 +148,7 @@ typedef struct { sint8 var_BF; uint8 pad_C0[2]; uint8 speed; // 0xC2 - uint8 var_C3; + uint8 acceleration; // 0xC3 uint8 var_C4; uint8 var_C5; uint8 pad_C6[2]; @@ -108,12 +159,21 @@ typedef struct { uint8 var_CE; uint8 num_laps; // 0xCE }; - uint8 pad_CF[0x06]; + uint8 pad_CF[0x04]; + uint8 var_D3; + uint8 var_D4; uint8 var_D5; uint8 ride_subtype; // 0xD6 uint8 colours_extended; // 0xD7 + uint8 var_D8; + uint8 var_D9; } rct_vehicle; +typedef struct { + rct_vehicle *head; + rct_vehicle *tail; +} train_ref; + enum { VEHICLE_STATUS_MOVING_TO_END_OF_STATION, VEHICLE_STATUS_WAITING_FOR_PASSENGERS, @@ -148,6 +208,40 @@ enum { VEHICLE_STATUS_STOPPED_BY_BLOCK_BRAKES }; +enum { + VEHICLE_SPRITE_FLAG_FLAT = (1 << 0), + VEHICLE_SPRITE_FLAG_GENTLE_SLOPES = (1 << 1), + VEHICLE_SPRITE_FLAG_STEEP_SLOPES = (1 << 2), + VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES = (1 << 3), + VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES = (1 << 4), + VEHICLE_SPRITE_FLAG_FLAT_BANKED = (1 << 5), + VEHICLE_SPRITE_FLAG_INLINE_TWISTS = (1 << 6), + VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS = (1 << 7), + VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS = (1 << 8), + VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS = (1 << 9), + VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS = (1 << 10), + VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS = (1 << 11), + VEHICLE_SPRITE_FLAG_CORKSCREWS = (1 << 12), + VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION = (1 << 13), + VEHICLE_SPRITE_FLAG_14 = (1 << 14), + VEHICLE_SPRITE_FLAG_15 = (1 << 15), +}; + +enum { + VEHICLE_VISUAL_DEFAULT, + VEHICLE_VISUAL_FLAT_RIDE_OR_CAR_RIDE, + VEHICLE_VISUAL_LAUNCHED_FREEFALL, + VEHICLE_VISUAL_OBSERVATION_TOWER, + VEHICLE_VISUAL_RIVER_RAPIDS, + VEHICLE_VISUAL_MINI_GOLF_PLAYER, + VEHICLE_VISUAL_MINI_GOLF_BALL, + VEHICLE_VISUAL_REVERSER, + VEHICLE_VISUAL_SPLASH_BOATS_OR_WATER_COASTER, + VEHICLE_VISUAL_ROTO_DROP, + VEHICLE_VISUAL_VIRGINIA_REEL = 15, + VEHICLE_VISUAL_SUBMARINE +}; + #define VEHICLE_SEAT_PAIR_FLAG 0x80 #define VEHICLE_SEAT_NUM_MASK 0x7F @@ -161,6 +255,9 @@ int vehicle_is_used_in_pairs(rct_vehicle *vehicle); rct_vehicle *vehicle_get_head(rct_vehicle *vehicle); void sub_6DEF56(rct_vehicle *cableLift); rct_vehicle *cable_lift_segment_create(int rideIndex, int x, int y, int z, int direction, uint16 var_44, uint32 var_24, bool head); +int sub_6DAB4C(rct_vehicle *vehicle, int *outStation); +bool sub_6DD365(rct_vehicle *vehicle); +rct_ride_type_vehicle *vehicle_get_vehicle_entry(rct_vehicle *vehicle); /** Helper macro until rides are stored in this module. */ #define GET_VEHICLE(sprite_index) &(g_sprite_list[sprite_index].vehicle) diff --git a/src/windows/ride.c b/src/windows/ride.c index ad2ed10b8d..591fdd6489 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -1052,7 +1052,7 @@ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo *dpi, rct_window *w) } rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[trainLayout[rideEntry->tab_vehicle]]; - height += rideVehicleEntry->var_0A; + height += rideVehicleEntry->tab_height; vehicleColour = ride_get_vehicle_colour(ride, 0); @@ -1060,7 +1060,7 @@ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo *dpi, rct_window *w) if (w->page == WINDOW_RIDE_PAGE_VEHICLE) spriteIndex += w->frame_no; spriteIndex /= (rideVehicleEntry->var_12 & 0x800) ? 4 : 2; - spriteIndex &= rideVehicleEntry->var_00; + spriteIndex &= rideVehicleEntry->rotation_frame_mask; spriteIndex *= rideVehicleEntry->var_16; spriteIndex += rideVehicleEntry->base_image_id; spriteIndex |= (vehicleColour.additional_1 << 24) | (vehicleColour.main << 19); @@ -2633,7 +2633,7 @@ static void window_ride_vehicle_scrollpaint(rct_window *w, rct_drawpixelinfo *dp startY = widget->bottom - widget->top - 4; rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[trainLayout[0]]; - startY += rideVehicleEntry->var_0A; + startY += rideVehicleEntry->tab_height; // For each train for (i = 0; i < ride->num_vehicles; i++) { @@ -2665,7 +2665,7 @@ static void window_ride_vehicle_scrollpaint(rct_window *w, rct_drawpixelinfo *dp if (rideVehicleEntry->var_12 & 0x800) spriteIndex /= 2; - spriteIndex &= rideVehicleEntry->var_00; + spriteIndex &= rideVehicleEntry->rotation_frame_mask; spriteIndex *= rideVehicleEntry->var_16; spriteIndex += rideVehicleEntry->base_image_id; spriteIndex |= (vehicleColour.additional_1 << 24) | (vehicleColour.main << 19); @@ -4308,11 +4308,11 @@ static void window_ride_colour_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[trainLayout[trainCarIndex]]; - y += rideVehicleEntry->var_0A; + y += rideVehicleEntry->tab_height; // Draw the coloured spinning vehicle spriteIndex = rideVehicleEntry->var_12 & 0x800 ? w->frame_no / 4 : w->frame_no / 2; - spriteIndex &= rideVehicleEntry->var_00; + spriteIndex &= rideVehicleEntry->rotation_frame_mask; spriteIndex *= rideVehicleEntry->var_16; spriteIndex += rideVehicleEntry->base_image_id; spriteIndex |= (vehicleColour.additional_1 << 24) | (vehicleColour.main << 19); diff --git a/src/world/map.c b/src/world/map.c index fe97d9e22c..6acc8e6ef9 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -4714,4 +4714,23 @@ void game_command_place_park_entrance(int* eax, int* ebx, int* ecx, int* edx, in *ecx & 0xFFFF, *edx & 0xFFFF, (*ebx >> 8) & 0xFF); -} \ No newline at end of file +} + +/** + * Gets the map element at x, y, z. + * @param x x units, not tiles. + * @param y y units, not tiles. + * @param z Base height. + */ +rct_map_element *map_get_track_element_at(int x, int y, int z) +{ + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; + if (mapElement->base_height != z) continue; + + return mapElement; + } while (!map_element_is_last_for_tile(mapElement++)); + + return NULL; +} diff --git a/src/world/map.h b/src/world/map.h index dad1e48030..703f257dd1 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -383,4 +383,6 @@ bool map_large_scenery_get_origin( int *outX, int *outY, int *outZ ); +rct_map_element *map_get_track_element_at(int x, int y, int z); + #endif From 2b0d5b24703914b38fbdbab93118c0388e5b27ae Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 25 Oct 2015 20:54:19 +0100 Subject: [PATCH 0896/1173] Remove obsolete sound and config code --- src/addresses.h | 27 ----------- src/config.c | 104 ---------------------------------------- src/openrct2.c | 1 - src/platform/platform.h | 1 - src/ride/ride.c | 2 - src/ride/vehicle.c | 4 +- 6 files changed, 2 insertions(+), 137 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 1b69c339d4..38d8944dcb 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -75,24 +75,10 @@ #define RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS 0x009A9804 #define RCT2_ADDRESS_MAP_TOOLTIP_ARGS 0x009A9808 -// #define RCT2_ADDRESS_SCENARIO_LIST 0x009A9FF4 -// #define RCT2_ADDRESS_NUM_SCENARIOS 0x009AA008 - #define RCT2_ADDRESS_APP_PATH 0x009AA214 -#define RCT2_ADDRESS_DSOUND_GUID 0x009AAC5D - -#define RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER 0x009AAC6E -// When all sounds reversed replace with gConfigSound.ride_music -#define RCT2_ADDRESS_CONFIG_MUSIC 0x009AAC72 - #define RCT2_ADDRESS_CONFIG_FLAGS 0x009AAC74 -// MAX vehicle sounds not used anymore -#define RCT2_ADDRESS_CONFIG_MAX_VEHICLE_SOUNDS 0x009AAC75 - -#define RCT2_ADDRESS_CONFIG_MAX_NO_SOUNDS 0x009AAC76 -#define RCT2_ADDRESS_CONFIG_SOUND_QUALITY 0x009AAC77 #define RCT2_ADDRESS_CONFIG_METRIC 0x009AAC78 #define RCT2_ADDRESS_CONFIG_TEMPERATURE 0x009AAC79 #define RCT2_ADDRESS_CONFIG_KEYBOARD_SHORTCUTS 0x009AAC7A @@ -170,8 +156,6 @@ #define RCT2_ADDRESS_CURRENT_SOUND_DEVICE 0x009AF280 -#define RCT2_ADDRESS_VEHICLE_SOUND_LIST 0x009AF288 - #define RCT2_ADDRESS_DRAW_SCROLL_LIST 0x009C3840 #define RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID 0x009D7A80 @@ -269,15 +253,6 @@ #define RCT2_ADDRESS_TEXTINPUT_WINDOWNUMBER 0x009DEB8A #define RCT2_ADDRESS_TEXTINPUT_WINDOWCLASS 0x009DEB8C -#define RCT2_ADDRESS_DSOUND_BUFFERS 0x009E1AB0 -#define RCT2_ADDRESS_NUM_DSOUND_DEVICES 0x009E2B88 -#define RCT2_ADDRESS_DSOUND_DEVICES 0x009E2B8C -#define RCT2_ADDRESS_SOUND_EFFECTS_MAPPING 0x009E2B94 -#define RCT2_ADDRESS_SOUNDLIST_BEGIN 0x009E2B98 -#define RCT2_ADDRESS_SOUNDLIST_END 0x009E2B9C -#define RCT2_ADDRESS_DIRECTSOUND 0x009E2BA0 -#define RCT2_ADDRESS_DSOUND_DEVICES_COUNTER 0x009E2BAC - #define RCT2_ADDRESS_CMDLINE 0x009E2D98 #define RCT2_ADDRESS_MOUSE_WRITE_INDEX 0x009E2DE4 @@ -636,8 +611,6 @@ #define RCT2_ADDRESS_AUDIO_INFO 0x01425B40 -#define RCT2_ADDRESS_SOUND_CHANNEL_LIST 0x014262E0 - #define RCT2_ADDRESS_COMMON_FORMAT_ARGS 0x013CE952 #define RCT2_ADDRESS_STAFF_MODE_ARRAY 0x013CA672 diff --git a/src/config.c b/src/config.c index 33dfde27e2..a293bac650 100644 --- a/src/config.c +++ b/src/config.c @@ -821,9 +821,6 @@ void config_apply_to_old_addresses() RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) = gConfigGeneral.measurement_format; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_TEMPERATURE, sint8) = gConfigGeneral.temperature_format; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CONSTRUCTION_MARKER, uint8) = gConfigGeneral.construction_marker_colour; - // Force best sound quality and software buffering, for original code. - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, sint8) = 2; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, sint8) = 1; RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = (gConfigGeneral.measurement_format + 1) * 256; if (gConfigGeneral.show_height_as_units) RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = 0; @@ -841,107 +838,6 @@ void config_apply_to_old_addresses() RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) = configFlags; } -// The following functions are related to the original configuration file. This has now been replaced with a new configuration -// INI file located in the user's OpenRCT2 home directory. - -/** - * Reads the config file data/config.cfg - * rct2: 0x006752D5 - */ -/*void config_dat_load() -{ - FILE *fp=NULL; - - const char *path = get_file_path(PATH_ID_GAMECFG); - - fp = fopen(path, "rb"); - - if (fp != NULL) { - // Read and check magic number - fread(RCT2_ADDRESS(0x013CE928, void), 1, 4, fp); - - if (RCT2_GLOBAL(0x013CE928, int) == MagicNumber) { - // Read options - fread((void*)0x009AAC5C, 1, 2155, fp); - fclose(fp); - - //general configuration - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_EDGE_SCROLLING, sint8) = gConfigGeneral.edge_scrolling; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CURRENCY, sint8) = gConfigGeneral.currency_format; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) = gConfigGeneral.measurement_format; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_TEMPERATURE, sint8) = gConfigGeneral.temperature_format; - - // always show gridlines - if (gConfigGeneral.always_show_gridlines){ - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) |= CONFIG_FLAG_ALWAYS_SHOW_GRIDLINES; - } - else { - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) &= !CONFIG_FLAG_ALWAYS_SHOW_GRIDLINES; - } - - // landscape smoothing - if (!gConfigGeneral.landscape_smoothing){ - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) |= CONFIG_FLAG_DISABLE_SMOOTH_LANDSCAPE; - } - else { - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) &= !CONFIG_FLAG_DISABLE_SMOOTH_LANDSCAPE; - } - - // show height as units - if (gConfigGeneral.show_height_as_units){ - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) |= CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS; - } - else { - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) &= !CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS; - } - - // save plugin data - if (gConfigGeneral.save_plugin_data){ - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) |= CONFIG_FLAG_SAVE_PLUGIN_DATA; - } - else { - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) &= !CONFIG_FLAG_SAVE_PLUGIN_DATA; - } - - //sound configuration: force software buffering and best quality - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, sint8) = 2; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, sint8) = 1; - - // Line below is temporarily disabled until all config is in the new format. - //if (RCT2_GLOBAL(0x009AB4C6, sint8) == 1) - // return; - - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_CONFIG, sint8) = 1; // Marks config as first time loaded - - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) + 2) * 256; - if (!(RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS)) - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) + 1) * 256; - } - - } - - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MAX_VEHICLE_SOUNDS, sint8) = RCT2_ADDRESS(0x009AF601, sint8)[RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, sint8)]; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MAX_NO_SOUNDS, sint8) = RCT2_ADDRESS(0x009AF604, sint8)[RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, sint8)]; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = 0; - if (!(RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS)) - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, sint16) = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, sint8) + 1) * 256; - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FIRST_TIME_LOAD_OBJECTS, sint8) = 1; -}*/ - -/** - * Save configuration to the data/config.cfg file - * rct2: 0x00675487 - */ -/*void config_dat_save() -{ - FILE *fp = fopen(get_file_path(PATH_ID_GAMECFG), "wb"); - if (fp != NULL){ - fwrite(&MagicNumber, 4, 1, fp); - fwrite((void*)0x009AAC5C, 2155, 1, fp); - fclose(fp); - } -}*/ - #pragma endregion #pragma region Shortcuts diff --git a/src/openrct2.c b/src/openrct2.c index 04e9dca7c5..a48b5ef83f 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -217,7 +217,6 @@ bool openrct2_initialise() if (!gOpenRCT2Headless) { audio_init(); audio_get_devices(); - //get_dsound_devices(); } language_open(gConfigGeneral.language); http_init(); diff --git a/src/platform/platform.h b/src/platform/platform.h index f69eae5507..7c71c3ea64 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -151,7 +151,6 @@ bool platform_check_steam_overlay_attached(); // Windows specific definitions #ifdef _WIN32 - // Defining WIN32_LEAN_AND_MEAN breaks dsound.h in audio.h (uncomment when dsound is finally removed) #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif diff --git a/src/ride/ride.c b/src/ride/ride.c index e9af8a942c..4e6188f5a1 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3537,8 +3537,6 @@ void ride_music_update_final() offset = 0; } Mixer_Channel_SetOffset(ride_music->sound_channel, offset); - } else { - //RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8) = 0; } return; } diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index ca188b2251..8f8e9ed6fa 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -146,10 +146,10 @@ int sub_6BC2F3(rct_vehicle* vehicle) } result += ((uint16)v4) >> 13; rct_vehicle_sound* vehicle_sound = &gVehicleSoundList[0]; - //rct_vehicle_sound* vehicle_sound = RCT2_ADDRESS(RCT2_ADDRESS_VEHICLE_SOUND_LIST, rct_vehicle_sound); + while (vehicle_sound->id != vehicle->sprite_index) { vehicle_sound++; - //if (vehicle_sound >= RCT2_GLOBAL(0x009AF42C, rct_vehicle_sound*)) { + if (vehicle_sound >= &gVehicleSoundList[countof(gVehicleSoundList)]) { return result; } From 98fd1bf95df9edd9bdc92a9a413b09ac9e6dc7c1 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 25 Oct 2015 21:42:09 +0100 Subject: [PATCH 0897/1173] Reinstate RCT2_ADDRESS_VEHICLE_SOUND_LIST --- src/addresses.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/addresses.h b/src/addresses.h index 38d8944dcb..f426ed80e4 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -156,6 +156,8 @@ #define RCT2_ADDRESS_CURRENT_SOUND_DEVICE 0x009AF280 +#define RCT2_ADDRESS_VEHICLE_SOUND_LIST 0x009AF288 + #define RCT2_ADDRESS_DRAW_SCROLL_LIST 0x009C3840 #define RCT2_ADDRESS_DRAW_SCROLL_NEXT_ID 0x009D7A80 From 8d84b540ad62fb087ee7e16c6d0d1c992c304601 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 25 Oct 2015 21:25:54 +0000 Subject: [PATCH 0898/1173] add vehicle struct and enum labels from vehicle-update branch. --- src/interface/viewport.c | 2 +- src/peep/peep.c | 9 ++++++--- src/ride/ride.c | 26 ++++++++++++------------- src/ride/station.c | 2 +- src/ride/vehicle.c | 41 +++++++++++++++++++++++++--------------- src/ride/vehicle.h | 33 +++++++++++++++++++++++++++----- src/windows/ride.c | 8 ++++---- src/world/map.c | 20 ++++++++++++++++++++ src/world/map.h | 1 + 9 files changed, 99 insertions(+), 43 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index e25d1aa564..aa92041b0b 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -899,7 +899,7 @@ void viewport_vehicle_paint_setup(rct_vehicle *vehicle, int imageDirection) rideEntry = GET_RIDE_ENTRY(vehicle->ride_subtype); vehicleEntry = &rideEntry->vehicles[vehicle->vehicle_type]; - if (vehicle->var_48 & 0x800) { + if (vehicle->update_flags & VEHICLE_UPDATE_FLAG_11) { vehicleEntry++; z += 16; } diff --git a/src/peep/peep.c b/src/peep/peep.c index 6591668e3a..1f9c815739 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -2206,10 +2206,13 @@ static void peep_update_ride_sub_state_2(rct_peep* peep){ } } + rct_vehicle *currentTrain = GET_VEHICLE(ride->vehicles[peep->current_train]); if (ride->status == RIDE_STATUS_OPEN && ++peep->var_AC != 0 && - !((GET_VEHICLE(ride->vehicles[peep->current_train]))->var_48 & (1 << 4))) + !(vehicle->update_flags & VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART) + ) { return; + } if (ride->mode != RIDE_MODE_FORWARD_ROTATION && ride->mode != RIDE_MODE_BACKWARD_ROTATION){ @@ -2322,8 +2325,8 @@ void peep_update_ride_sub_state_7(rct_peep* peep){ if (!(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & RIDE_TYPE_FLAG_16)){ for (; vehicle->is_child; vehicle = GET_VEHICLE(vehicle->prev_vehicle_on_ride)){ - uint16 eax = vehicle->var_36 / 4; - if (eax == 0 || eax > 3) + uint16 trackType = vehicle->track_type >> 2; + if (trackType == 0 || trackType > 3) continue; rct_map_element* inner_map = map_get_first_element_at(vehicle->track_x / 32, vehicle->track_y / 32); diff --git a/src/ride/ride.c b/src/ride/ride.c index 4e6188f5a1..b10bd7f000 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -2252,7 +2252,7 @@ void ride_prepare_breakdown(int rideIndex, int breakdownReason) } } if (vehicle != NULL) - vehicle->var_48 |= 0x100; + vehicle->update_flags |= VEHICLE_UPDATE_FLAG_BROKEN_CAR; break; case BREAKDOWN_VEHICLE_MALFUNCTION: // Choose a random train @@ -2261,7 +2261,7 @@ void ride_prepare_breakdown(int rideIndex, int breakdownReason) // Set flag on broken train, first car vehicle = GET_VEHICLE(ride->vehicles[ride->broken_vehicle]); - vehicle->var_48 |= 0x200; + vehicle->update_flags |= VEHICLE_UPDATE_FLAG_BROKEN_TRAIN; break; case BREAKDOWN_BRAKES_FAILURE: // Original code generates a random number but does not use it @@ -2671,7 +2671,7 @@ void ride_measurement_update(rct_ride_measurement *measurement) uint16 spriteIndex; rct_ride *ride; rct_vehicle *vehicle; - int unk, velocity, altitude, verticalG, lateralG; + int velocity, altitude, verticalG, lateralG; ride = GET_RIDE(measurement->ride_index); spriteIndex = ride->vehicles[measurement->vehicle_index]; @@ -2694,8 +2694,8 @@ void ride_measurement_update(rct_ride_measurement *measurement) return; } - unk = (vehicle->var_36 / 4) & 0xFF; - if (unk == 216 || unk == 123 || unk == 9 || unk == 63 || unk == 147 || unk == 155) + uint8 trackType = (vehicle->track_type >> 2) & 0xFF; + if (trackType == 216 || trackType == 123 || trackType == 9 || trackType == 63 || trackType == 147 || trackType == 155) if (vehicle->velocity == 0) return; @@ -4159,7 +4159,7 @@ void vehicle_unset_var_48_b1(rct_vehicle *head) uint16 spriteIndex; rct_vehicle *vehicle = head; while (true) { - vehicle->var_48 &= ~(1 << 1); + vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_1; spriteIndex = vehicle->next_vehicle_on_train; if (spriteIndex == SPRITE_INDEX_NULL) { break; @@ -4245,7 +4245,6 @@ void ride_create_vehicles_find_first_block(rct_ride *ride, rct_xy_element *outXY */ void loc_6DDF9C(rct_ride *ride, rct_map_element *mapElement) { - registers regs; rct_vehicle *train, *car; for (int i = 0; i < ride->num_vehicles; i++) { @@ -4276,10 +4275,9 @@ void loc_6DDF9C(rct_ride *ride, rct_map_element *mapElement) mapElement->flags |= (1 << 5); car = train; while (true) { - car->var_48 &= ~(1 << 1); + car->update_flags &= ~VEHICLE_UPDATE_FLAG_1; car->status = VEHICLE_STATUS_TRAVELLING; - regs.ax = car->var_36 >> 2; - if (regs.al == 1) { + if ((car->track_type >> 2) == TRACK_ELEM_END_STATION) { car->status = VEHICLE_STATUS_MOVING_TO_END_OF_STATION; } @@ -6332,7 +6330,7 @@ void invalidate_test_results(int rideIndex) uint16 spriteIndex = ride->vehicles[i]; if (spriteIndex != SPRITE_INDEX_NULL) { rct_vehicle *vehicle = GET_VEHICLE(spriteIndex); - vehicle->var_48 &= ~(1 << 5); + vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_TESTING; } } } @@ -6360,9 +6358,9 @@ void ride_fix_breakdown(int rideIndex, int reliabilityIncreaseFactor) spriteIndex = ride->vehicles[i]; while (spriteIndex != SPRITE_INDEX_NULL) { vehicle = GET_VEHICLE(spriteIndex); - vehicle->var_48 &= ~(1 << 7); - vehicle->var_48 &= ~(1 << 8); - vehicle->var_48 &= ~(1 << 9); + vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_7; + vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_BROKEN_CAR; + vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_BROKEN_TRAIN; spriteIndex = vehicle->next_vehicle_on_train; } } diff --git a/src/ride/station.c b/src/ride/station.c index 5870e66050..91f25949fb 100644 --- a/src/ride/station.c +++ b/src/ride/station.c @@ -248,7 +248,7 @@ static void ride_race_init_vehicle_speeds(rct_ride *ride) for (i = 0; i < ride->num_vehicles; i++) { vehicle = &g_sprite_list[ride->vehicles[i]].vehicle; - vehicle->var_48 &= ~(1 << 6); + vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_6; rideEntry = GET_RIDE_ENTRY(vehicle->ride_subtype); diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index 8f8e9ed6fa..62edd5903f 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -22,6 +22,7 @@ #include "../audio/audio.h" #include "../audio/mixer.h" #include "../config.h" +#include "../hook.h" #include "../interface/viewport.h" #include "../openrct2.h" #include "../world/sprite.h" @@ -518,6 +519,16 @@ rct_vehicle *vehicle_get_head(rct_vehicle *vehicle) return vehicle; } +rct_vehicle *vehicle_get_tail(rct_vehicle *vehicle) +{ + uint16 spriteIndex; + + while ((spriteIndex = vehicle->next_vehicle_on_train) != SPRITE_INDEX_NULL) { + vehicle = GET_VEHICLE(spriteIndex); + } + return vehicle; +} + int vehicle_is_used_in_pairs(rct_vehicle *vehicle) { return vehicle->num_seats & VEHICLE_SEAT_PAIR_FLAG; @@ -567,7 +578,7 @@ rct_vehicle *cable_lift_segment_create(int rideIndex, int x, int y, int z, int d current->var_C4 = 0; current->var_C5 = 0; current->var_C8 = 0; - current->var_CC = 0xFF; + current->scream_sound_id = 0xFF; current->var_1F = 0; current->var_20 = 0; for (int j = 0; j < 32; j++) { @@ -583,9 +594,9 @@ rct_vehicle *cable_lift_segment_create(int rideIndex, int x, int y, int z, int d z += RCT2_GLOBAL(0x0097D21A + (ride->type * 8), uint8); sprite_move(16, 16, z, (rct_sprite*)current); - current->var_36 = (TRACK_ELEM_CABLE_LIFT_HILL << 2) | (current->sprite_direction >> 3); + current->track_type = (TRACK_ELEM_CABLE_LIFT_HILL << 2) | (current->sprite_direction >> 3); current->var_34 = 164; - current->var_48 = 2; + current->update_flags = VEHICLE_UPDATE_FLAG_1; current->status = VEHICLE_STATUS_MOVING_TO_END_OF_STATION; current->var_51 = 0; current->num_peeps = 0; @@ -593,6 +604,18 @@ rct_vehicle *cable_lift_segment_create(int rideIndex, int x, int y, int z, int d return current; } +/** + * + * rct2: 0x006DD365 + */ +bool sub_6DD365(rct_vehicle *vehicle) +{ + registers regs; + regs.esi = (int)vehicle; + + return RCT2_CALLFUNC_Y(0x006DD365, ®s) & 0x100; +} + /** * * rct2: 0x006DAB4C @@ -608,18 +631,6 @@ int sub_6DAB4C(rct_vehicle *vehicle, int *outStation) return regs.eax; } -/** - * - * rct2: 0x006DD365 - */ -bool sub_6DD365(rct_vehicle *vehicle) -{ - registers regs; - regs.esi = (int)vehicle; - - return RCT2_CALLFUNC_Y(0x006DD365, ®s) & 0x100; -} - rct_ride_type_vehicle *vehicle_get_vehicle_entry(rct_vehicle *vehicle) { rct_ride_type *rideEntry = GET_RIDE_ENTRY(vehicle->ride_subtype); diff --git a/src/ride/vehicle.h b/src/ride/vehicle.h index a1869f2008..1f8f175f8b 100644 --- a/src/ride/vehicle.h +++ b/src/ride/vehicle.h @@ -111,7 +111,10 @@ typedef struct { uint8 vehicle_type; // 0x31 rct_vehicle_colour colours; // 0x32 uint16 var_34; - sint16 var_36; + union { + sint16 track_direction; // 0x36 (0000 0000 0000 0011) + sint16 track_type; // 0x36 (0000 0011 1111 1100) + }; uint16 track_x; // 0x38 uint16 track_y; // 0x3A uint16 track_z; // 0x3C @@ -125,7 +128,7 @@ typedef struct { uint16 var_44; uint16 friction; // 0x46 - uint16 var_48; + uint16 update_flags; // 0x48 uint8 var_4A; uint8 current_station; // 0x4B uint16 var_4C; @@ -153,13 +156,14 @@ typedef struct { uint8 var_C5; uint8 pad_C6[2]; uint32 var_C8; - uint8 var_CC; + uint8 scream_sound_id; // 0xCC uint8 var_CD; union { uint8 var_CE; uint8 num_laps; // 0xCE }; - uint8 pad_CF[0x04]; + uint8 pad_CF[0x03]; + sint8 var_D2; uint8 var_D3; uint8 var_D4; uint8 var_D5; @@ -208,6 +212,25 @@ enum { VEHICLE_STATUS_STOPPED_BY_BLOCK_BRAKES }; +enum{ + VEHICLE_UPDATE_FLAG_0 = (1 << 0), + VEHICLE_UPDATE_FLAG_1 = (1 << 1), + VEHICLE_UPDATE_FLAG_WAIT_ON_ADJACENT = (1 << 2), + VEHICLE_UPDATE_FLAG_3 = (1 << 3), + VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART = (1 << 4), + VEHICLE_UPDATE_FLAG_TESTING = (1 << 5), + VEHICLE_UPDATE_FLAG_6 = (1 << 6), + VEHICLE_UPDATE_FLAG_7 = (1 << 7), + VEHICLE_UPDATE_FLAG_BROKEN_CAR = (1 << 8), + VEHICLE_UPDATE_FLAG_BROKEN_TRAIN = (1 << 9), + VEHICLE_UPDATE_FLAG_10 = (1 << 10), + VEHICLE_UPDATE_FLAG_11 = (1 << 11), + VEHICLE_UPDATE_FLAG_12 = (1 << 12), + VEHICLE_UPDATE_FLAG_13 = (1 << 13), + VEHICLE_UPDATE_FLAG_14 = (1 << 14), + VEHICLE_UPDATE_FLAG_15 = (1 << 15) +}; + enum { VEHICLE_SPRITE_FLAG_FLAT = (1 << 0), VEHICLE_SPRITE_FLAG_GENTLE_SLOPES = (1 << 1), @@ -255,8 +278,8 @@ int vehicle_is_used_in_pairs(rct_vehicle *vehicle); rct_vehicle *vehicle_get_head(rct_vehicle *vehicle); void sub_6DEF56(rct_vehicle *cableLift); rct_vehicle *cable_lift_segment_create(int rideIndex, int x, int y, int z, int direction, uint16 var_44, uint32 var_24, bool head); -int sub_6DAB4C(rct_vehicle *vehicle, int *outStation); bool sub_6DD365(rct_vehicle *vehicle); +int sub_6DAB4C(rct_vehicle *vehicle, int *outStation); rct_ride_type_vehicle *vehicle_get_vehicle_entry(rct_vehicle *vehicle); /** Helper macro until rides are stored in this module. */ diff --git a/src/windows/ride.c b/src/windows/ride.c index 591fdd6489..72319b9613 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -2110,8 +2110,8 @@ static rct_string_id window_ride_get_status_vehicle(rct_window *w, void *argumen vehicle = &(g_sprite_list[vehicleSpriteIndex].vehicle); if (vehicle->status != VEHICLE_STATUS_CRASHING && vehicle->status != VEHICLE_STATUS_CRASHED) { - int ax = vehicle->var_36 / 4; - if (ax == 216 || ax == 123 || ax == 9 || ax == 63 || ax == 147 || ax == 155) { + int trackType = vehicle->track_type >> 2; + if (trackType == 216 || trackType == 123 || trackType == 9 || trackType == 63 || trackType == 147 || trackType == 155) { if ((RCT2_ADDRESS(0x01357644, uint32)[ride->type] & 0x40) && vehicle->velocity == 0) { RCT2_GLOBAL((int)arguments + 0, uint16) = STR_STOPPED_BY_BLOCK_BRAKES; return 1191; @@ -3462,11 +3462,11 @@ static void window_ride_maintenance_dropdown(rct_window *w, int widgetIndex, int case BREAKDOWN_DOORS_STUCK_CLOSED: case BREAKDOWN_DOORS_STUCK_OPEN: vehicle = &(g_sprite_list[ride->vehicles[ride->broken_vehicle]].vehicle); - vehicle->var_48 &= ~0x100; + vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_BROKEN_CAR; break; case BREAKDOWN_VEHICLE_MALFUNCTION: vehicle = &(g_sprite_list[ride->vehicles[ride->broken_vehicle]].vehicle); - vehicle->var_48 &= ~0x200; + vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_BROKEN_TRAIN; break; } ride->lifecycle_flags &= ~(RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN); diff --git a/src/world/map.c b/src/world/map.c index 6acc8e6ef9..7f6af24a97 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -4734,3 +4734,23 @@ rct_map_element *map_get_track_element_at(int x, int y, int z) return NULL; } + +/** + * Gets the map element at x, y, z. + * @param x x units, not tiles. + * @param y y units, not tiles. + * @param z Base height. + */ +rct_map_element *map_get_track_element_at_of_type(int x, int y, int z, int trackType) +{ + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; + if (mapElement->base_height != z) continue; + if (mapElement->properties.track.type != trackType) continue; + + return mapElement; + } while (!map_element_is_last_for_tile(mapElement++)); + + return NULL; +} diff --git a/src/world/map.h b/src/world/map.h index 703f257dd1..c99617a8c4 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -384,5 +384,6 @@ bool map_large_scenery_get_origin( ); rct_map_element *map_get_track_element_at(int x, int y, int z); +rct_map_element *map_get_track_element_at_of_type(int x, int y, int z, int trackType); #endif From 04eacc890424181af3e5280c16bc3412514487d4 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 26 Oct 2015 04:00:17 +0000 Subject: [PATCH 0899/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index a0a63f2432..18b06c1ae1 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3888,6 +3888,11 @@ STR_5552 :{POP16}{POP16}Jaar {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {M STR_5553 :Spel pauzeren als de Steam-overlay open staat STR_5554 :{SMALLFONT}{BLACK}Overgangen met omringend land gladstrijken STR_5555 :Voertuigen van andere baantypen tonen +STR_5556 :Speler verwijderen +STR_5557 :Verbinding behouden na desynchronisatie (multiplayer) +STR_5558 :Om deze instelling van kracht te laten worden is een herstart vereist. +STR_5559 :Elke 10 min. inspect. +STR_5560 :{SMALLFONT}{BLACK}Stelt het inspectieinterval van alle attracties in op 'Elke 10 minuten'. ############# # Scenarios # From 61444c8518998321a32c3dce9f2c3ec0780cb401 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 26 Oct 2015 10:21:04 +0100 Subject: [PATCH 0900/1173] Display the visible/practical map size instead of the technical size, fixes #2133 --- src/windows/map.c | 20 +++++++++++++------- src/windows/mapgen.c | 40 +++++++++++++++++++++++++++------------- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/windows/map.c b/src/windows/map.c index e8174c9ed4..8376340cf7 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -36,6 +36,11 @@ #define MINIMUM_TOOL_SIZE 1 #define MAXIMUM_TOOL_SIZE 64 +#define MINIMUM_MAP_SIZE_TECHNICAL 15 +#define MAXIMUM_MAP_SIZE_TECHNICAL 256 +#define MINIMUM_MAP_SIZE_PRACTICAL MINIMUM_MAP_SIZE_TECHNICAL-2 +#define MAXIMUM_MAP_SIZE_PRACTICAL MAXIMUM_MAP_SIZE_TECHNICAL-2 + enum { PAGE_PEEPS, PAGE_RIDES @@ -604,8 +609,7 @@ static void window_map_textinput(rct_window *w, int widgetIndex, char *text) case WIDX_LAND_TOOL: size = strtol(text, &end, 10); if (*end == '\0') { - size = max(MINIMUM_TOOL_SIZE,size); - size = min(MAXIMUM_TOOL_SIZE,size); + size = clamp(MINIMUM_TOOL_SIZE, size, MAXIMUM_TOOL_SIZE); RCT2_GLOBAL(RCT2_ADDRESS_LAND_TOOL_SIZE, sint16) = size; window_invalidate(w); } @@ -613,8 +617,10 @@ static void window_map_textinput(rct_window *w, int widgetIndex, char *text) case WIDX_MAP_SIZE_SPINNER: size = strtol(text, &end, 10); if (*end == '\0') { - if (size < 50) size = 50; - if (size > 256) size = 256; + // The practical size is 2 lower than the technical size + size += 2; + size=clamp(MINIMUM_MAP_SIZE_TECHNICAL, size, MAXIMUM_MAP_SIZE_TECHNICAL); + int currentSize = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16); while (size < currentSize) { map_window_decrease_map_size(); @@ -924,7 +930,7 @@ static void window_map_show_default_scenario_editor_buttons(rct_window *w) { w->widgets[WIDX_MAP_SIZE_SPINNER].type = WWT_SPINNER; w->widgets[WIDX_MAP_SIZE_SPINNER_UP].type = WWT_DROPDOWN_BUTTON; w->widgets[WIDX_MAP_SIZE_SPINNER_DOWN].type = WWT_DROPDOWN_BUTTON; - RCT2_GLOBAL(0x013CE952 + 2, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16); + RCT2_GLOBAL(0x013CE952 + 2, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) - 2; } static void window_map_inputsize_land(rct_window *w) @@ -936,8 +942,8 @@ static void window_map_inputsize_land(rct_window *w) static void window_map_inputsize_map(rct_window *w) { - ((uint16*)TextInputDescriptionArgs)[0] = 50; - ((uint16*)TextInputDescriptionArgs)[1] = 256; + ((uint16*)TextInputDescriptionArgs)[0] = 13; + ((uint16*)TextInputDescriptionArgs)[1] = 254; window_text_input_open(w, WIDX_MAP_SIZE_SPINNER, 5130, 5131, STR_NONE, STR_NONE, 4); } diff --git a/src/windows/mapgen.c b/src/windows/mapgen.c index dd7336dd70..2c46c69e47 100644 --- a/src/windows/mapgen.c +++ b/src/windows/mapgen.c @@ -289,7 +289,7 @@ static rct_window_event_list window_mapgen_simplex_events = { NULL, NULL, NULL, - NULL, + window_mapgen_textinput, NULL, NULL, NULL, @@ -392,8 +392,10 @@ static uint32 window_mapgen_page_hold_down_widgets[] = { const int window_mapgen_tab_animation_loops[] = { 16, 16 }; -#define MAPSIZE_MIN 16 -#define MAPSIZE_MAX 256 +#define MINIMUM_MAP_SIZE_TECHNICAL 15 +#define MAXIMUM_MAP_SIZE_TECHNICAL 256 +#define MINIMUM_MAP_SIZE_PRACTICAL MINIMUM_MAP_SIZE_TECHNICAL-2 +#define MAXIMUM_MAP_SIZE_PRACTICAL MAXIMUM_MAP_SIZE_TECHNICAL-2 #define BASESIZE_MIN 0 #define BASESIZE_MAX 60 #define WATERLEVEL_MIN 0 @@ -485,9 +487,10 @@ static void window_mapgen_base_mouseup(rct_window *w, int widgetIndex) gfx_invalidate_screen(); break; case WIDX_MAP_SIZE: - ((uint16*)TextInputDescriptionArgs)[0] = MAPSIZE_MIN; - ((uint16*)TextInputDescriptionArgs)[1] = MAPSIZE_MAX; - window_text_input_open(w, WIDX_MAP_SIZE, 5130, 5131, 5182, _mapSize, 4); + ((uint16*)TextInputDescriptionArgs)[0] = MINIMUM_MAP_SIZE_PRACTICAL; + ((uint16*)TextInputDescriptionArgs)[1] = MAXIMUM_MAP_SIZE_PRACTICAL; + // Practical map size is 2 lower than the technical map size + window_text_input_open(w, WIDX_MAP_SIZE, 5130, 5131, 5182, _mapSize - 2, 4); break; case WIDX_BASE_HEIGHT: ((uint16*)TextInputDescriptionArgs)[0] = (BASESIZE_MIN - 12) / 2; @@ -508,11 +511,11 @@ static void window_mapgen_base_mousedown(int widgetIndex, rct_window *w, rct_wid switch (widgetIndex) { case WIDX_MAP_SIZE_UP: - _mapSize = min(_mapSize + 1, MAPSIZE_MAX); + _mapSize = min(_mapSize + 1, MAXIMUM_MAP_SIZE_TECHNICAL); window_invalidate(w); break; case WIDX_MAP_SIZE_DOWN: - _mapSize = max(_mapSize - 1, MAPSIZE_MIN); + _mapSize = max(_mapSize - 1, MINIMUM_MAP_SIZE_TECHNICAL); window_invalidate(w); break; case WIDX_BASE_HEIGHT_UP: @@ -632,7 +635,10 @@ static void window_mapgen_textinput(rct_window *w, int widgetIndex, char *text) switch (widgetIndex) { case WIDX_MAP_SIZE: - _mapSize = clamp(MAPSIZE_MIN, value, MAPSIZE_MAX); + case WIDX_SIMPLEX_MAP_SIZE: + // The practical size is 2 lower than the technical size + value += 2; + _mapSize = clamp(MINIMUM_MAP_SIZE_TECHNICAL, value, MAXIMUM_MAP_SIZE_TECHNICAL); break; case WIDX_BASE_HEIGHT: _baseHeight = clamp(BASESIZE_MIN, (value * 2) + 12, BASESIZE_MAX); @@ -674,7 +680,8 @@ static void window_mapgen_base_paint(rct_window *w, rct_drawpixelinfo *dpi) gfx_draw_string_left(dpi, 2692, 0, 0, w->x + 4, w->y + w->widgets[WIDX_WATER_LEVEL].top + 1); gfx_draw_string_left(dpi, 2693, 0, 0, w->x + 4, w->y + w->widgets[WIDX_FLOOR_TEXTURE].top + 1); - uint16 mapSizeArgs[2] = { _mapSize, _mapSize }; + // The practical map size is 2 lower than the technical map size + uint16 mapSizeArgs[2] = { _mapSize - 2, _mapSize -2 }; gfx_draw_string_left(dpi, 839, mapSizeArgs, w->colours[1], w->x + w->widgets[WIDX_MAP_SIZE].left + 1, w->y + w->widgets[WIDX_MAP_SIZE].top + 1); arg = (_baseHeight - 12) / 2; @@ -781,6 +788,12 @@ static void window_mapgen_simplex_mouseup(rct_window *w, int widgetIndex) case WIDX_TAB_3: window_mapgen_set_page(w, widgetIndex - WIDX_TAB_1); break; + case WIDX_SIMPLEX_MAP_SIZE: + ((uint16*)TextInputDescriptionArgs)[0] = MINIMUM_MAP_SIZE_PRACTICAL; + ((uint16*)TextInputDescriptionArgs)[1] = MAXIMUM_MAP_SIZE_PRACTICAL; + // Practical map size is 2 lower than the technical map size + window_text_input_open(w, WIDX_SIMPLEX_MAP_SIZE, 5130, 5131, 5182, _mapSize - 2, 4); + break; case WIDX_GENERATE: mapgenSettings.mapSize = _mapSize; @@ -839,11 +852,11 @@ static void window_mapgen_simplex_mousedown(int widgetIndex, rct_window *w, rct_ window_invalidate(w); break; case WIDX_SIMPLEX_MAP_SIZE_UP: - _mapSize = min(_mapSize + 1, 256); + _mapSize = min(_mapSize + 1, MAXIMUM_MAP_SIZE_TECHNICAL); window_invalidate(w); break; case WIDX_SIMPLEX_MAP_SIZE_DOWN: - _mapSize = max(_mapSize - 1, 16); + _mapSize = max(_mapSize - 1, MINIMUM_MAP_SIZE_TECHNICAL); window_invalidate(w); break; case WIDX_SIMPLEX_WATER_LEVEL_UP: @@ -976,7 +989,8 @@ static void window_mapgen_simplex_paint(rct_window *w, rct_drawpixelinfo *dpi) gfx_draw_string_left(dpi, 3311, &_simplex_base_freq, w->colours[1], w->x + w->widgets[WIDX_SIMPLEX_BASE_FREQ].left + 1, w->y + w->widgets[WIDX_SIMPLEX_BASE_FREQ].top + 1); gfx_draw_string_left(dpi, 1737, &_simplex_octaves, w->colours[1], w->x + w->widgets[WIDX_SIMPLEX_OCTAVES].left + 1, w->y + w->widgets[WIDX_SIMPLEX_OCTAVES].top + 1); - uint16 mapSizeArgs[2] = { _mapSize, _mapSize }; + // The practical map size is 2 lower than the technical map size + uint16 mapSizeArgs[2] = { _mapSize - 2, _mapSize - 2 }; gfx_draw_string_left(dpi, 839, mapSizeArgs, w->colours[1], w->x + w->widgets[WIDX_SIMPLEX_MAP_SIZE].left + 1, w->y + w->widgets[WIDX_SIMPLEX_MAP_SIZE].top + 1); arg = (_waterLevel - 12) / 2; From 9504f3f10da3ef9fadd8fe92a036148b8144e7c4 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 26 Oct 2015 13:53:26 +0100 Subject: [PATCH 0901/1173] Replace missed occurrence of magic numbers with defines --- src/windows/map.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/windows/map.c b/src/windows/map.c index 8376340cf7..e69939c38d 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -942,8 +942,8 @@ static void window_map_inputsize_land(rct_window *w) static void window_map_inputsize_map(rct_window *w) { - ((uint16*)TextInputDescriptionArgs)[0] = 13; - ((uint16*)TextInputDescriptionArgs)[1] = 254; + ((uint16*)TextInputDescriptionArgs)[0] = MINIMUM_MAP_SIZE_PRACTICAL; + ((uint16*)TextInputDescriptionArgs)[1] = MAXIMUM_MAP_SIZE_PRACTICAL; window_text_input_open(w, WIDX_MAP_SIZE_SPINNER, 5130, 5131, STR_NONE, STR_NONE, 4); } From 4865cedc599f0ffc9ad8a3817d5a02569a563b75 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 27 Oct 2015 04:00:18 +0000 Subject: [PATCH 0902/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index acc4fd96da..2fc92c4639 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3897,6 +3897,9 @@ STR_5554 :{SMALLFONT}{BLACK}啟用山丘工具 STR_5555 :顯示來自其他類型軌道的車輛種類 STR_5556 :踢走玩家 STR_5557 :多人遊戲不同步時依然保持連線 +STR_5558 :此設定會於重啟遊戲後生效 +STR_5559 :檢查時距為10分鐘 +STR_5560 :將所有遊樂設施的檢查時距設定為'每10分鐘' ##################### # Rides/attractions # From 00e2ca43a1aabc6aa986b8667373441b44f0e3ef Mon Sep 17 00:00:00 2001 From: zsilencer Date: Mon, 26 Oct 2015 21:43:33 -0600 Subject: [PATCH 0903/1173] ipv6 support, non-blocking address resolve and connect --- src/game.c | 4 +- src/interface/chat.c | 7 +- src/network/network.cpp | 285 +++++++++++++++++++++++++------------- src/network/network.h | 77 ++++++---- src/windows/server_list.c | 18 ++- 5 files changed, 265 insertions(+), 126 deletions(-) diff --git a/src/game.c b/src/game.c index 684bab3c03..af57ec2ba1 100644 --- a/src/game.c +++ b/src/game.c @@ -259,7 +259,7 @@ void game_update() numUpdates = clamp(1, numUpdates, 4); } - if (network_get_mode() == NETWORK_MODE_CLIENT) { + if (network_get_mode() == NETWORK_MODE_CLIENT && network_get_status() == NETWORK_STATUS_CONNECTED) { if (network_get_server_tick() - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) >= 10) { // make sure client doesn't fall behind the server too much numUpdates += 10; @@ -335,7 +335,7 @@ void game_update() void game_logic_update() { network_update(); - if (network_get_mode() == NETWORK_MODE_CLIENT) { + if (network_get_mode() == NETWORK_MODE_CLIENT && network_get_status() == NETWORK_STATUS_CONNECTED) { if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) >= network_get_server_tick()) { // dont run past the server return; diff --git a/src/interface/chat.c b/src/interface/chat.c index 863327ddcc..43d66acc2d 100644 --- a/src/interface/chat.c +++ b/src/interface/chat.c @@ -59,6 +59,9 @@ void chat_update() void chat_draw() { + if (network_get_mode() == NETWORK_MODE_NONE) { + return; + } rct_drawpixelinfo *dpi = (rct_drawpixelinfo*)RCT2_ADDRESS_SCREEN_DPI; _chatLeft = 10; _chatTop = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 40 - ((CHAT_HISTORY_SIZE + 1) * 10); @@ -108,7 +111,9 @@ void chat_input(int c) { switch (c) { case SDL_SCANCODE_RETURN: - network_send_chat(_chatCurrentLine); + if (strlen(_chatCurrentLine) > 0) { + network_send_chat(_chatCurrentLine); + } chat_clear_input(); chat_close(); break; diff --git a/src/network/network.cpp b/src/network/network.cpp index 8aeb41dc62..f8a438ba5f 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -33,6 +33,7 @@ extern "C" { #include #include #include +#include extern "C" { #include "../config.h" #include "../game.h" @@ -41,6 +42,7 @@ extern "C" { #include "../localisation/date.h" #include "../localisation/localisation.h" #include "../scenario.h" +#include "../windows/error.h" } #pragma comment(lib, "Ws2_32.lib") @@ -155,6 +157,14 @@ NetworkConnection::NetworkConnection() { authstatus = NETWORK_AUTH_NONE; player = 0; + socket = INVALID_SOCKET; +} + +NetworkConnection::~NetworkConnection() +{ + if (socket != INVALID_SOCKET) { + closesocket(socket); + } } int NetworkConnection::ReadPacket() @@ -253,10 +263,78 @@ bool NetworkConnection::SetNonBlocking(SOCKET socket, bool on) #endif } +NetworkAddress::NetworkAddress() +{ + ss = std::make_shared(); + ss_len = std::make_shared(); + status = std::make_shared(); + *status = RESOLVE_NONE; +} + +void NetworkAddress::Resolve(const char* host, unsigned short port, bool nonblocking) +{ + // A non-blocking hostname resolver + *status = RESOLVE_INPROGRESS; + mutex = SDL_CreateMutex(); + cond = SDL_CreateCond(); + NetworkAddress::host = host; + NetworkAddress::port = port; + SDL_LockMutex(mutex); + SDL_Thread* thread = SDL_CreateThread(ResolveFunc, 0, this); + // The mutex/cond is to make sure ResolveFunc doesn't ever get a dangling pointer + SDL_CondWait(cond, mutex); + SDL_UnlockMutex(mutex); + SDL_DestroyCond(cond); + SDL_DestroyMutex(mutex); + if (!nonblocking) { + int status; + SDL_WaitThread(thread, &status); + } +} + +int NetworkAddress::GetResolveStatus(void) +{ + return *status; +} + +int NetworkAddress::ResolveFunc(void* pointer) +{ + // Copy data for thread safety + NetworkAddress * networkaddress = (NetworkAddress*)pointer; + SDL_LockMutex(networkaddress->mutex); + std::string host; + if (networkaddress->host) host = networkaddress->host; + std::string port = std::to_string(networkaddress->port); + std::shared_ptr ss = networkaddress->ss; + std::shared_ptr ss_len = networkaddress->ss_len; + std::shared_ptr status = networkaddress->status; + SDL_CondSignal(networkaddress->cond); + SDL_UnlockMutex(networkaddress->mutex); + + // Perform the resolve + addrinfo hints; + addrinfo* res; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + if (host.length() == 0) { + hints.ai_flags = AI_PASSIVE; + } + getaddrinfo(host.length() == 0 ? NULL : host.c_str(), port.c_str(), &hints, &res); + if (res) { + memcpy(&(*ss), res->ai_addr, res->ai_addrlen); + *ss_len = res->ai_addrlen; + *status = RESOLVE_OK; + } else { + *status = RESOLVE_FAILED; + } + return 0; +} + Network::Network() { wsa_initialized = false; mode = NETWORK_MODE_NONE; + status = NETWORK_STATUS_NONE; last_tick_sent_time = 0; last_ping_sent_time = 0; strcpy(password, ""); @@ -300,16 +378,15 @@ bool Network::Init() void Network::Close() { if (mode == NETWORK_MODE_CLIENT) { - closesocket(server_socket); + closesocket(server_connection.socket); } else if (mode == NETWORK_MODE_SERVER) { closesocket(listening_socket); - for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { - closesocket((*it)->socket); - } } mode = NETWORK_MODE_NONE; + status = NETWORK_STATUS_NONE; + server_connection.authstatus = NETWORK_AUTH_NONE; client_connection_list.clear(); game_command_queue.clear(); @@ -331,69 +408,39 @@ bool Network::BeginClient(const char* host, unsigned short port) if (!Init()) return false; - server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (server_socket == INVALID_SOCKET) { - log_error("Unable to create socket."); - return false; - } + server_address.Resolve(host, port); + status = NETWORK_STATUS_RESOLVING; - sockaddr_in server_address; -#ifdef USE_INET_PTON - char address[64]; - if (!network_get_address(address, sizeof(address), host)) { - log_error("Unable to resolve hostname."); - return false; - } - - if (inet_pton(AF_INET, address, &server_address.sin_addr) != 1) { - return false; - } -#else - server_address.sin_addr.S_un.S_addr = inet_addr(network_getAddress((char *)host)); -#endif // USE_INET_PTON - server_address.sin_family = AF_INET; - server_address.sin_port = htons(port); - - if (connect(server_socket, (sockaddr*)&server_address, sizeof(server_address)) != 0) { - log_error("Unable to connect to host."); - return false; - } else { - printf("Connected to server!\n"); - } - - server_connection.socket = server_socket; - server_connection.SetTCPNoDelay(true); - if (!server_connection.SetNonBlocking(true)) { - closesocket(server_socket); - log_error("Failed to set non-blocking mode."); - return false; - } + window_network_status_open("Resolving..."); mode = NETWORK_MODE_CLIENT; - Client_Send_AUTH(OPENRCT2_VERSION, gConfigNetwork.player_name, ""); return true; } -bool Network::BeginServer(unsigned short port) +bool Network::BeginServer(unsigned short port, const char* address) { Close(); if (!Init()) return false; + NetworkAddress networkaddress; + networkaddress.Resolve(address, port, false); + log_verbose("Begin listening for clients"); - listening_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + listening_socket = socket(networkaddress.ss->ss_family, SOCK_STREAM, IPPROTO_TCP); if (listening_socket == INVALID_SOCKET) { log_error("Unable to create socket."); return false; } - sockaddr_in local_address; - local_address.sin_family = AF_INET; - local_address.sin_addr.s_addr = INADDR_ANY; - local_address.sin_port = htons(port); + // Turn off IPV6_V6ONLY so we can accept both v4 and v6 connections + int value = 0; + if (setsockopt(listening_socket, IPPROTO_IPV6, IPV6_V6ONLY, (const char*)&value, sizeof(value)) != 0) { + log_error("IPV6_V6ONLY failed. %d", LAST_SOCKET_ERROR()); + } - if (bind(listening_socket, (sockaddr*)&local_address, sizeof(local_address)) != 0) { + if (bind(listening_socket, (sockaddr*)&(*networkaddress.ss), (*networkaddress.ss_len)) != 0) { closesocket(listening_socket); log_error("Unable to bind to socket."); return false; @@ -426,6 +473,11 @@ int Network::GetMode() return mode; } +int Network::GetStatus() +{ + return status; +} + int Network::GetAuthStatus() { if (GetMode() == NETWORK_MODE_CLIENT) { @@ -470,11 +522,11 @@ void Network::UpdateServer() it++; } } - if (SDL_GetTicks() - last_tick_sent_time >= 25) { + if (SDL_TICKS_PASSED(SDL_GetTicks(), last_tick_sent_time + 25)) { last_tick_sent_time = SDL_GetTicks(); Server_Send_TICK(); } - if (SDL_GetTicks() - last_ping_sent_time >= 3000) { + if (SDL_TICKS_PASSED(SDL_GetTicks(), last_ping_sent_time + 3000)) { last_ping_sent_time = SDL_GetTicks(); Server_Send_PING(); Server_Send_PINGLIST(); @@ -497,18 +549,91 @@ void Network::UpdateServer() void Network::UpdateClient() { - if (!ProcessConnection(server_connection)) { - Close(); - } - ProcessGameCommandQueue(); + bool connectfailed = false; + switch(status){ + case NETWORK_STATUS_RESOLVING:{ + if(server_address.GetResolveStatus() == NetworkAddress::RESOLVE_OK){ + server_connection.socket = socket(server_address.ss->ss_family, SOCK_STREAM, IPPROTO_TCP); + if (server_connection.socket == INVALID_SOCKET) { + log_error("Unable to create socket."); + connectfailed = true; + break; + } - // Check synchronisation - if (!_desynchronised && !CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { - _desynchronised = true; - window_network_status_open("Network desync detected"); - if (!gConfigNetwork.stay_connected) { + server_connection.SetTCPNoDelay(true); + if (!server_connection.SetNonBlocking(true)) { + log_error("Failed to set non-blocking mode."); + connectfailed = true; + break; + } + + if (connect(server_connection.socket, (sockaddr *)&(*server_address.ss), (*server_address.ss_len)) == SOCKET_ERROR && (LAST_SOCKET_ERROR() == EINPROGRESS || LAST_SOCKET_ERROR() == EWOULDBLOCK)){ + window_network_status_open("Connecting..."); + server_connect_time = SDL_GetTicks(); + status = NETWORK_STATUS_CONNECTING; + } else { + log_error("connect() failed %d", LAST_SOCKET_ERROR()); + connectfailed = true; + break; + } + } else { + log_error("Could not resolve address."); + connectfailed = true; + } + }break; + case NETWORK_STATUS_CONNECTING:{ + int error = 0; + socklen_t len = sizeof(error); + getsockopt(server_connection.socket, SOL_SOCKET, SO_ERROR, (char*)&error, &len); + if (error != 0) { + log_error("Connection failed %d", error); + connectfailed = true; + break; + } + if (SDL_TICKS_PASSED(SDL_GetTicks(), server_connect_time + 3000)) { + log_error("Connection timed out."); + connectfailed = true; + break; + } + fd_set writeFD; + FD_ZERO(&writeFD); + FD_SET(server_connection.socket, &writeFD); + timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + if (select(server_connection.socket + 1, NULL, &writeFD, NULL, &timeout) > 0) { + int error = 0; + socklen_t len = sizeof(error); + getsockopt(server_connection.socket, SOL_SOCKET, SO_ERROR, (char*)&error, &len); + if (error == 0) { + status = NETWORK_STATUS_CONNECTED; + Client_Send_AUTH(OPENRCT2_VERSION, gConfigNetwork.player_name, ""); + window_network_status_open("Authenticating..."); + } + } + }break; + case NETWORK_STATUS_CONNECTED: + if (!ProcessConnection(server_connection)) { + window_network_status_open("Connection closed"); Close(); } + ProcessGameCommandQueue(); + + // Check synchronisation + if (!_desynchronised && !CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { + _desynchronised = true; + window_network_status_open("Network desync detected"); + if (!gConfigNetwork.stay_connected) { + Close(); + } + } + break; + } + + if (connectfailed) { + Close(); + window_network_status_close(); + window_error_open(STR_UNABLE_TO_CONNECT_TO_SERVER, STR_NONE); } } @@ -1032,6 +1157,11 @@ int network_get_mode() return gNetwork.GetMode(); } +int network_get_status() +{ + return gNetwork.GetStatus(); +} + int network_get_authstatus() { return gNetwork.GetAuthStatus(); @@ -1125,44 +1255,9 @@ void network_kick_player(int playerId) gNetwork.KickPlayer(playerId); } -#ifdef USE_INET_PTON -static bool network_get_address(char *dst, size_t dstLength, const char *host) -{ - struct addrinfo *remoteHost; - - if (getaddrinfo(host, NULL, NULL, &remoteHost) != 0) { - // Failed to resolve host name - return false; - } - - for (; remoteHost != NULL; remoteHost = remoteHost->ai_next) { - if (remoteHost->ai_family != AF_INET) continue; - - struct sockaddr_in *ipv4SockAddr = (struct sockaddr_in*)remoteHost->ai_addr; - return inet_ntop(AF_INET, (void*)&ipv4SockAddr->sin_addr, dst, dstLength) != NULL; - } - - // No IPv4 addresses found for host name - return false; -} -#else -static char *network_getAddress(char *host) -{ - struct hostent *remoteHost; - struct in_addr addr; - remoteHost = gethostbyname(host); - if (remoteHost != NULL && remoteHost->h_addrtype == AF_INET && remoteHost->h_addr_list[0] != 0) { - addr.s_addr = *(u_long *)remoteHost->h_addr_list[0]; - return inet_ntoa(addr); - } - - return host; -} -#endif // USE_INET_PTON - - #else int network_get_mode() { return NETWORK_MODE_NONE; } +int network_get_status() { return NETWORK_STATUS_NONE; } uint32 network_get_server_tick() { return RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); } void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback) {} void network_send_map() {} diff --git a/src/network/network.h b/src/network/network.h index 12f1f84e47..a6c208fedc 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -31,6 +31,22 @@ enum { NETWORK_PLAYER_FLAG_ISSERVER = 1 << 0, }; +enum { + NETWORK_AUTH_NONE, + NETWORK_AUTH_REQUESTED, + NETWORK_AUTH_OK, + NETWORK_AUTH_BADVERSION, + NETWORK_AUTH_BADNAME, + NETWORK_AUTH_BADPASSWORD +}; + +enum { + NETWORK_STATUS_NONE, + NETWORK_STATUS_RESOLVING, + NETWORK_STATUS_CONNECTING, + NETWORK_STATUS_CONNECTED +}; + #define NETWORK_DEFAULT_PORT 11753 #ifdef __cplusplus @@ -44,17 +60,9 @@ extern "C" { #ifndef DISABLE_NETWORK -#ifndef __MINGW32__ -#define USE_INET_PTON -#else -#warning using deprecated network functions in lieu of inet_pton, inet_ntop -#endif // __MINGW32__ - #ifdef _WIN32 #include - #ifdef USE_INET_PTON - #include - #endif + #include #define LAST_SOCKET_ERROR() WSAGetLastError() #undef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK @@ -72,15 +80,6 @@ extern "C" { #define ioctlsocket ioctl #endif // _WIN32 -enum { - NETWORK_AUTH_NONE, - NETWORK_AUTH_REQUESTED, - NETWORK_AUTH_OK, - NETWORK_AUTH_BADVERSION, - NETWORK_AUTH_BADNAME, - NETWORK_AUTH_BADPASSWORD -}; - #ifdef __cplusplus #include @@ -137,6 +136,7 @@ class NetworkConnection { public: NetworkConnection(); + ~NetworkConnection(); int ReadPacket(); void QueuePacket(std::unique_ptr packet); void SendQueuedPackets(); @@ -155,6 +155,33 @@ private: std::list> outboundpackets; }; +class NetworkAddress +{ +public: + NetworkAddress(); + void Resolve(const char* host, unsigned short port, bool nonblocking = true); + int GetResolveStatus(void); + + std::shared_ptr ss; + std::shared_ptr ss_len; + + enum { + RESOLVE_NONE, + RESOLVE_INPROGRESS, + RESOLVE_OK, + RESOLVE_FAILED + }; + +private: + static int ResolveFunc(void* pointer); + + const char* host; + unsigned short port; + SDL_mutex* mutex; + SDL_cond* cond; + std::shared_ptr status; +}; + class Network { public: @@ -163,8 +190,9 @@ public: bool Init(); void Close(); bool BeginClient(const char* host, unsigned short port); - bool BeginServer(unsigned short port); + bool BeginServer(unsigned short port, const char* address = NULL); int GetMode(); + int GetStatus(); int GetAuthStatus(); uint32 GetServerTick(); uint8 GetPlayerID(); @@ -211,8 +239,9 @@ private: }; int mode; + int status; + NetworkAddress server_address; bool wsa_initialized; - SOCKET server_socket; SOCKET listening_socket; NetworkConnection server_connection; uint32 last_tick_sent_time; @@ -226,6 +255,8 @@ private: std::vector chunk_buffer; char password[33]; bool _desynchronised; + uint32 server_connect_time; + void UpdateServer(); void UpdateClient(); @@ -259,6 +290,7 @@ int network_begin_client(const char *host, int port); int network_begin_server(int port); int network_get_mode(); +int network_get_status(); void network_update(); int network_get_authstatus(); uint32 network_get_server_tick(); @@ -276,11 +308,6 @@ void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 void network_kick_player(int playerId); void network_print_error(); -#ifdef USE_INET_PTON -static bool network_get_address(char *dst, size_t dstLength, const char *host); -#else -static char *network_getAddress(char *host); -#endif // USE_INET_PTON #ifdef __cplusplus } diff --git a/src/windows/server_list.c b/src/windows/server_list.c index 8cd531f841..2be9576779 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -524,17 +524,29 @@ static void join_server(char *address, bool spectate) { int port = gConfigNetwork.default_port; - char *colon = strchr(address, ':'); - if (colon != NULL) { + bool addresscopied = false; + + char *endbracket = strrchr(address, ']'); + char *startbracket = strrchr(address, '['); + char *dot = strchr(address, '.'); + + char *colon = strrchr(address, ':'); + if (colon != NULL && (endbracket != NULL || dot != NULL)) { address = substr(address, colon - address); sscanf(colon + 1, "%d", &port); + addresscopied = true; + } + + if (startbracket && endbracket) { + address = substr(startbracket + 1, endbracket - startbracket - 1); + addresscopied = true; } if (!network_begin_client(address, port)) { window_error_open(STR_UNABLE_TO_CONNECT_TO_SERVER, STR_NONE); } - if (colon != NULL) { + if (addresscopied) { free(address); } } From 0cdaa0b57e15fd64d54cbac703e5b1c80ebdce80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 27 Oct 2015 18:32:39 +0100 Subject: [PATCH 0904/1173] Guard against possible NULL dereference --- src/input.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/input.c b/src/input.c index 343213b720..65621f24c1 100644 --- a/src/input.c +++ b/src/input.c @@ -1250,8 +1250,9 @@ static void input_update_tooltip(rct_window *w, int widgetIndex, int x, int y) } } else { - if (RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_CLASS, rct_windowclass) != w->classification || - RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_NUMBER, rct_windownumber) != w->number || + if (((w != NULL) && + (RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_CLASS, rct_windowclass) != w->classification || + RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WINDOW_NUMBER, rct_windownumber) != w->number)) || RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_WIDGET_INDEX, uint16) != widgetIndex ) { window_tooltip_close(); From 7ac22b3be50b8c0a4a6fbd77f5838d358a86ed90 Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 28 Oct 2015 04:00:16 +0000 Subject: [PATCH 0905/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/french.txt | 528 ++++++++++++++++---------------- data/language/portuguese_br.txt | 5 + 2 files changed, 269 insertions(+), 264 deletions(-) diff --git a/data/language/french.txt b/data/language/french.txt index ccbf835f24..ee3f80705f 100644 --- a/data/language/french.txt +++ b/data/language/french.txt @@ -1062,7 +1062,7 @@ STR_1055 :{SMALLFONT}{BLACK}Nommer la personne STR_1056 :{SMALLFONT}{BLACK}Nommer l'employé STR_1057 :Nom de l'attraction STR_1058 :Entrez un nom pour cette attraction : -STR_1059 :Ne peut pas renommer l'attraction... +STR_1059 :Impossible de renommer l'attraction... STR_1060 :Nom d'attraction invalide STR_1061 :Mode normal STR_1062 :Mode circuit continu @@ -1083,12 +1083,12 @@ STR_1076 :Mode stand de boutique STR_1077 :Mode rotation STR_1078 :Rotation vers l'avant STR_1079 :Rotation vers l'arrière -STR_1080 :Film: {ENDQUOTES}Avenging aviators{ENDQUOTES} +STR_1080 :Film: {ENDQUOTES}Les aviateurs vengeurs{ENDQUOTES} STR_1081 :3D film: {ENDQUOTES}Queues de souris{ENDQUOTES} STR_1082 :Mode anneaux de l'espace STR_1083 :Mode débutants STR_1084 :LIM-powered launch -STR_1085 :Film: {ENDQUOTES}Thrill riders{ENDQUOTES} +STR_1085 :Film: {ENDQUOTES}Le grand frisson{ENDQUOTES} STR_1086 :3D film: {ENDQUOTES}Chasseurs de tempêtes{ENDQUOTES} STR_1087 :3D film: {ENDQUOTES}Commandos de l'espace{ENDQUOTES} STR_1088 :Mode intense @@ -1373,8 +1373,8 @@ STR_1366 :In-line Twist (right) STR_1367 :Demi boucle STR_1368 :Half Corkscrew (left) STR_1369 :Half Corkscrew (right) -STR_1370 :Barrel Roll (left) -STR_1371 :Barrel Roll (right) +STR_1370 :Tonneau (gauche) +STR_1371 :Tonneau (droite) STR_1372 :Launched Lift Hill STR_1373 :Large Half Loop (left) STR_1374 :Large Half Loop (right) @@ -1847,21 +1847,21 @@ STR_1840 :Immobilisation: {COMMA16}% STR_1841 :Revenu : {CURRENCY} par heure STR_1842 :Attraction préférée de : {COMMA16} visiteur STR_1843 :Attraction préférée de : {COMMA16} visiteurs -STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list +STR_1844 :{SMALLFONT}{BLACK}Sélectionnez le type d'information à afficher dans la liste des attractions STR_1845 :{MONTHYEAR} STR_1846 :{COMMA16} visiteurs STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} visiteurs STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} visiteurs STR_1849 :{WINDOW_COLOUR_2}Jouer de la musique STR_1850 :{SMALLFONT}{BLACK}Select whether music should be played for this ride -STR_1851 :{WINDOW_COLOUR_2}Running cost: {BLACK}{CURRENCY2DP} per hour -STR_1852 :{WINDOW_COLOUR_2}Running cost: {BLACK}Unknown -STR_1853 :{WINDOW_COLOUR_2}Built: {BLACK}This Year -STR_1854 :{WINDOW_COLOUR_2}Built: {BLACK}Last Year -STR_1855 :{WINDOW_COLOUR_2}Built: {BLACK}{COMMA16} Years Ago -STR_1856 :{WINDOW_COLOUR_2}Profit per item sold: {BLACK}{CURRENCY2DP} -STR_1857 :{WINDOW_COLOUR_2}Loss per item sold: {BLACK}{CURRENCY2DP} -STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY2DP} per month +STR_1851 :{WINDOW_COLOUR_2}Coût de fonctionnement: {BLACK}{CURRENCY2DP} par heure +STR_1852 :{WINDOW_COLOUR_2}Coût de fonctionnement: {BLACK}Inconnu +STR_1853 :{WINDOW_COLOUR_2}Construit: {BLACK}Cette année +STR_1854 :{WINDOW_COLOUR_2}Construit: {BLACK}L'année dernière +STR_1855 :{WINDOW_COLOUR_2}Construit: {BLACK}il y a {COMMA16} ans +STR_1856 :{WINDOW_COLOUR_2}Bénéfice par objet vendu: {BLACK}{CURRENCY2DP} +STR_1857 :{WINDOW_COLOUR_2}Perte par objet vendu: {BLACK}{CURRENCY2DP} +STR_1858 :{WINDOW_COLOUR_2}Coût: {BLACK}{CURRENCY2DP} par mois STR_1859 :Hommes de service STR_1860 :Mécaniciens STR_1861 :Gardes de sécurité @@ -1871,9 +1871,9 @@ STR_1864 :Mécanicien STR_1865 :Garde de sécurité STR_1866 :Animateur STR_1867 :{BLACK}{COMMA16} {STRINGID} -STR_1868 :Can't change number of rotations... -STR_1869 :{WINDOW_COLOUR_2}Number of rotations: -STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations +STR_1868 :Impossible de changer le nombre de rotations... +STR_1869 :{WINDOW_COLOUR_2}Nombre de rotations: +STR_1870 :{SMALLFONT}{BLACK}Nombre de rotations complètes STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1872 :{COMMA16} STR_1873 :{WINDOW_COLOUR_2}Revenu: {BLACK}{CURRENCY2DP} par heure @@ -1945,15 +1945,15 @@ STR_1936 :{STRINGID} a acheté {STRINGID} STR_1937 :{SMALLFONT}{BLACK}Afficher des informations à propos du sujet de ce message STR_1938 :{SMALLFONT}{BLACK}Afficher vue du visiteur STR_1939 :{SMALLFONT}{BLACK}Afficher vue de l'employé -STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this guest -STR_1941 :{SMALLFONT}{BLACK}Show which rides this guest has been on -STR_1942 :{SMALLFONT}{BLACK}Show financial information about this guest -STR_1943 :{SMALLFONT}{BLACK}Show guest's recent thoughts -STR_1944 :{SMALLFONT}{BLACK}Show items guest is carrying -STR_1945 :{SMALLFONT}{BLACK}Show orders and options for this staff member -STR_1946 :{SMALLFONT}{BLACK}Select costume for this entertainer -STR_1947 :{SMALLFONT}{BLACK}Show areas patrolled by selected staff type, and locate the nearest staff member -STR_1948 :{SMALLFONT}{BLACK}Hire a new staff member of the selected type +STR_1940 :{SMALLFONT}{BLACK}Afficher l'humeur, l'énergie, la faim... de ce visiteur +STR_1941 :{SMALLFONT}{BLACK}Afficher sur quelles attractions ce visiteur est allé +STR_1942 :{SMALLFONT}{BLACK}Afficher les informations financières à propos de ce visiteur +STR_1943 :{SMALLFONT}{BLACK}Afficher les pensées récentes de ce visiteur +STR_1944 :{SMALLFONT}{BLACK}Afficher les objets que porte ce visiteur +STR_1945 :{SMALLFONT}{BLACK}Afficher les ordres et options pour cet employé +STR_1946 :{SMALLFONT}{BLACK}Sélectionner le costume de cet animateur +STR_1947 :{SMALLFONT}{BLACK}Afficher les zones de patrouilles des employés de ce type, et localiser l'employé le plus proche +STR_1948 :{SMALLFONT}{BLACK}Embaucher un nouvel employé du même type STR_1949 :Résumé financier STR_1950 :Graphique financier STR_1951 :Graphique valeur du parc @@ -1982,244 +1982,244 @@ STR_1973 :{WINDOW_COLOUR_2}Prix d'une pizza: STR_1974 :{WINDOW_COLOUR_2} STR_1975 :{WINDOW_COLOUR_2}Prix du popcorn: STR_1976 :{WINDOW_COLOUR_2}Prix d'un hot-dog: -STR_1977 :{WINDOW_COLOUR_2}Tentacle price: -STR_1978 :{WINDOW_COLOUR_2}Hat price: -STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: -STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: -STR_1981 :{WINDOW_COLOUR_2}Doughnut price: -STR_1982 :{WINDOW_COLOUR_2}Coffee price: +STR_1977 :{WINDOW_COLOUR_2}Prix du pouple: +STR_1978 :{WINDOW_COLOUR_2}Prix d'un chapeau: +STR_1979 :{WINDOW_COLOUR_2}Prix d'une pomme d'amour: +STR_1980 :{WINDOW_COLOUR_2}Prix d'un T-Shirt: +STR_1981 :{WINDOW_COLOUR_2}Prix d'un donut: +STR_1982 :{WINDOW_COLOUR_2}Prix d'un café: STR_1983 :{WINDOW_COLOUR_2} -STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: -STR_1985 :{WINDOW_COLOUR_2}Lemonade price: +STR_1984 :{WINDOW_COLOUR_2}Prix du poulet frit: +STR_1985 :{WINDOW_COLOUR_2}Prix de la limonade: STR_1986 :{WINDOW_COLOUR_2} STR_1987 :{WINDOW_COLOUR_2} -STR_1988 :Balloon -STR_1989 :Cuddly Toy -STR_1990 :Park Map -STR_1991 :On-Ride Photo -STR_1992 :Umbrella -STR_1993 :Drink +STR_1988 :Ballon +STR_1989 :Peluche +STR_1990 :Carte du parc +STR_1991 :Photo sur le vif +STR_1992 :Parapluie +STR_1993 :Boisson gazeuse STR_1994 :Burger -STR_1995 :Chips -STR_1996 :Ice Cream -STR_1997 :Candyfloss -STR_1998 :Empty Can -STR_1999 :Rubbish -STR_2000 :Empty Burger Box +STR_1995 :Frites +STR_1996 :Glace +STR_1997 :Barbe-à-papa +STR_1998 :Canette vide +STR_1999 :Déchet +STR_2000 :Boite à Burger vide STR_2001 :Pizza -STR_2002 :Voucher +STR_2002 :Coupon STR_2003 :Popcorn -STR_2004 :Hot Dog -STR_2005 :Tentacle -STR_2006 :Hat -STR_2007 :Toffee Apple +STR_2004 :Hot-Dog +STR_2005 :Poulpe +STR_2006 :Chapeau +STR_2007 :Pomme d'amour STR_2008 :T-Shirt -STR_2009 :Doughnut -STR_2010 :Coffee -STR_2011 :Empty Cup -STR_2012 :Fried Chicken -STR_2013 :Lemonade -STR_2014 :Empty Box -STR_2015 :Empty Bottle -STR_2016 :Balloons -STR_2017 :Cuddly Toys -STR_2018 :Park Maps -STR_2019 :On-Ride Photos -STR_2020 :Umbrellas -STR_2021 :Drinks +STR_2009 :Donut +STR_2010 :Café +STR_2011 :Tasse vide +STR_2012 :Poulet frit +STR_2013 :Limonade +STR_2014 :Boite vide +STR_2015 :Bouteille vide +STR_2016 :Ballons +STR_2017 :Peluches +STR_2018 :Cartes du parc +STR_2019 :Photos sur le vif +STR_2020 :Parapluies +STR_2021 :Boissons gazeuses STR_2022 :Burgers -STR_2023 :Chips -STR_2024 :Ice Creams -STR_2025 :Candyfloss -STR_2026 :Empty Cans -STR_2027 :Rubbish -STR_2028 :Empty Burger Boxes +STR_2023 :Frites +STR_2024 :Glaces +STR_2025 :Barbes-à-papa +STR_2026 :Canettes vides +STR_2027 :Déchets +STR_2028 :Boites à Burger vides STR_2029 :Pizzas -STR_2030 :Vouchers +STR_2030 :Coupons STR_2031 :Popcorn -STR_2032 :Hot Dogs -STR_2033 :Tentacles -STR_2034 :Hats -STR_2035 :Toffee Apples +STR_2032 :Hot-Dogs +STR_2033 :Poulpe +STR_2034 :Chapeaux +STR_2035 :Pommes d'amour STR_2036 :T-Shirts -STR_2037 :Doughnuts -STR_2038 :Coffees -STR_2039 :Empty Cups -STR_2040 :Fried Chicken -STR_2041 :Lemonade -STR_2042 :Empty Boxes -STR_2043 :Empty Bottles -STR_2044 :a Balloon -STR_2045 :a Cuddly Toy -STR_2046 :a Park Map -STR_2047 :an On-Ride Photo -STR_2048 :an Umbrella -STR_2049 :a Drink -STR_2050 :a Burger -STR_2051 :some Chips -STR_2052 :an Ice Cream -STR_2053 :some Candyfloss -STR_2054 :an Empty Can -STR_2055 :some Rubbish -STR_2056 :an Empty Burger Box -STR_2057 :a Pizza -STR_2058 :a Voucher -STR_2059 :some Popcorn -STR_2060 :a Hot Dog -STR_2061 :a Tentacle -STR_2062 :a Hat -STR_2063 :a Toffee Apple -STR_2064 :a T-Shirt -STR_2065 :a Doughnut -STR_2066 :a Coffee -STR_2067 :an Empty Cup -STR_2068 :some Fried Chicken -STR_2069 :some Lemonade -STR_2070 :an Empty Box -STR_2071 :an Empty Bottle -STR_2072 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Balloon -STR_2073 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Cuddly Toy -STR_2074 :Map of {STRINGID} -STR_2075 :On-Ride Photo of {STRINGID} -STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Umbrella -STR_2077 :Drink +STR_2037 :Donuts +STR_2038 :Cafés +STR_2039 :Tasses vides +STR_2040 :Poulet frit +STR_2041 :Limonade +STR_2042 :Boites vides +STR_2043 :Bouteilles vides +STR_2044 :un Ballon +STR_2045 :une Peluche +STR_2046 :une carte du parc +STR_2047 :une photo sur le vif +STR_2048 :un parapluie +STR_2049 :une boisson gazeuse +STR_2050 :un Burger +STR_2051 :des Frites +STR_2052 :une glace +STR_2053 :une barbe-à-papa +STR_2054 :une canette vide +STR_2055 :un déchet +STR_2056 :une Boite à Burger vide +STR_2057 :une Pizza +STR_2058 :un Coupon +STR_2059 :du Popcorn +STR_2060 :un Hot-Dog +STR_2061 :du Poulpe +STR_2062 :un chapeau +STR_2063 :une pomme d'amour +STR_2064 :un T-Shirt +STR_2065 :un Donut +STR_2066 :un café +STR_2067 :une tasse vide +STR_2068 :du poulet frit +STR_2069 :de la limonade +STR_2070 :une boite vide +STR_2071 :une bouteille vide +STR_2072 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Ballon +STR_2073 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Peluche +STR_2074 :Carte de {STRINGID} +STR_2075 :Photo sur le vif de {STRINGID} +STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Parapluie +STR_2077 :Boisson gazeuse STR_2078 :Burger -STR_2079 :Chips -STR_2080 :Ice Cream -STR_2081 :Candyfloss -STR_2082 :Empty Can -STR_2083 :Rubbish -STR_2084 :Empty Burger Box +STR_2079 :Frites +STR_2080 :Glace +STR_2081 :Barbe-à-papa +STR_2082 :Canette vide +STR_2083 :Déchet +STR_2084 :Boite à Burger vide STR_2085 :Pizza -STR_2086 :Voucher for {STRINGID} +STR_2086 :Coupon pour {STRINGID} STR_2087 :Popcorn -STR_2088 :Hot Dog -STR_2089 :Tentacle -STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hat -STR_2091 :Toffee Apple +STR_2088 :Hot-Dog +STR_2089 :Poulpe +STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Chapeau +STR_2091 :Pomme d'amour STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-Shirt -STR_2093 :Doughnut -STR_2094 :Coffee -STR_2095 :Empty Cup -STR_2096 :Fried Chicken -STR_2097 :Lemonade -STR_2098 :Empty Box -STR_2099 :Empty Bottle -STR_2100 :{WINDOW_COLOUR_2}On-Ride Photo price: -STR_2101 :{WINDOW_COLOUR_2}On-Ride Photo price: -STR_2102 :{WINDOW_COLOUR_2}On-Ride Photo price: -STR_2103 :{WINDOW_COLOUR_2}Pretzel price: -STR_2104 :{WINDOW_COLOUR_2}Hot Chocolate price: -STR_2105 :{WINDOW_COLOUR_2}Iced Tea price: -STR_2106 :{WINDOW_COLOUR_2}Funnel Cake price: -STR_2107 :{WINDOW_COLOUR_2}Sunglasses price: -STR_2108 :{WINDOW_COLOUR_2}Beef Noodles price: -STR_2109 :{WINDOW_COLOUR_2}Fried Rice Noodles price: -STR_2110 :{WINDOW_COLOUR_2}Wonton Soup price: -STR_2111 :{WINDOW_COLOUR_2}Meatball Soup price: -STR_2112 :{WINDOW_COLOUR_2}Fruit Juice price: -STR_2113 :{WINDOW_COLOUR_2}Soybean Milk price: -STR_2114 :{WINDOW_COLOUR_2}Sujongkwa price: -STR_2115 :{WINDOW_COLOUR_2}Sub Sandwich price: -STR_2116 :{WINDOW_COLOUR_2}Cookie price: +STR_2093 :Donut +STR_2094 :Café +STR_2095 :Tasse vide +STR_2096 :Poulet frit +STR_2097 :Limonade +STR_2098 :Boite vide +STR_2099 :Bouteille vide +STR_2100 :{WINDOW_COLOUR_2}Prix d'une photo sur le vif: +STR_2101 :{WINDOW_COLOUR_2}Prix d'une photo sur le vif: +STR_2102 :{WINDOW_COLOUR_2}Prix d'une photo sur le vif: +STR_2103 :{WINDOW_COLOUR_2}Prix d'un bretzel: +STR_2104 :{WINDOW_COLOUR_2}Prix d'un chocolat chaud: +STR_2105 :{WINDOW_COLOUR_2}Prix d'un thé glacé: +STR_2106 :{WINDOW_COLOUR_2}Prix d'un funnel cake: +STR_2107 :{WINDOW_COLOUR_2}Prix des lunettes de soleil: +STR_2108 :{WINDOW_COLOUR_2}Prix des nouilles au boeuf: +STR_2109 :{WINDOW_COLOUR_2}Prix des nouilles au riz frit: +STR_2110 :{WINDOW_COLOUR_2}Prix de la soupe aux raviolis: +STR_2111 :{WINDOW_COLOUR_2}Prix de la soupe aux boulettes de viande: +STR_2112 :{WINDOW_COLOUR_2}Prix d'un jus de fruits: +STR_2113 :{WINDOW_COLOUR_2}Prix d'un lait de soja: +STR_2114 :{WINDOW_COLOUR_2}Prix d'un sujongkwa: +STR_2115 :{WINDOW_COLOUR_2}Prix d'un sub sandwich: +STR_2116 :{WINDOW_COLOUR_2}Prix d'un cookie: STR_2117 :{WINDOW_COLOUR_2} STR_2118 :{WINDOW_COLOUR_2} STR_2119 :{WINDOW_COLOUR_2} -STR_2120 :{WINDOW_COLOUR_2}Roast Sausage price: +STR_2120 :{WINDOW_COLOUR_2}Prix d'une saucisse grillée: STR_2121 :{WINDOW_COLOUR_2} -STR_2122 :On-Ride Photo -STR_2123 :On-Ride Photo -STR_2124 :On-Ride Photo -STR_2125 :Pretzel -STR_2126 :Hot Chocolate -STR_2127 :Iced Tea +STR_2122 :Photo sur le vif +STR_2123 :Photo sur le vif +STR_2124 :Photo sur le vif +STR_2125 :Bretzel +STR_2126 :Chocolat chaud +STR_2127 :Thé glacé STR_2128 :Funnel Cake -STR_2129 :Sunglasses -STR_2130 :Beef Noodles -STR_2131 :Fried Rice Noodles -STR_2132 :Wonton Soup -STR_2133 :Meatball Soup -STR_2134 :Fruit Juice -STR_2135 :Soybean Milk +STR_2129 :Lunettes de soleil +STR_2130 :Nouilles au boeuf +STR_2131 :Nouilles au riz frit +STR_2132 :Soupe aux raviolis +STR_2133 :Soupe aux boulettes de viande +STR_2134 :Jus de fruits +STR_2135 :Lait de soja STR_2136 :Sujongkwa STR_2137 :Sub Sandwich STR_2138 :Cookie -STR_2139 :Empty Bowl -STR_2140 :Empty Drink Carton -STR_2141 :Empty Juice Cup -STR_2142 :Roast Sausage -STR_2143 :Empty Bowl -STR_2144 :On-Ride Photos -STR_2145 :On-Ride Photos -STR_2146 :On-Ride Photos -STR_2147 :Pretzels -STR_2148 :Hot Chocolates -STR_2149 :Iced Teas +STR_2139 :Bol vide +STR_2140 :Brique vide +STR_2141 :Tasse de jus vide +STR_2142 :Saucisse grillée +STR_2143 :Bol vide +STR_2144 :Photos sur le vif +STR_2145 :Photos sur le vif +STR_2146 :Photos sur le vif +STR_2147 :Bretzels +STR_2148 :Chocolats chaud +STR_2149 :Thés glacés STR_2150 :Funnel Cakes -STR_2151 :Sunglasses -STR_2152 :Beef Noodles -STR_2153 :Fried Rice Noodles -STR_2154 :Wonton Soups -STR_2155 :Meatball Soups -STR_2156 :Fruit Juices -STR_2157 :Soybean Milks +STR_2151 :Lunettes de soleil +STR_2152 :Nouilles au boeuf +STR_2153 :Nouilles au riz frit +STR_2154 :Soupes aux raviolis +STR_2155 :Soupes aux boulettes de viande +STR_2156 :Jus de fruits +STR_2157 :Laits de soja STR_2158 :Sujongkwa -STR_2159 :Sub Sandwiches +STR_2159 :Sub Sandwichs STR_2160 :Cookies -STR_2161 :Empty Bowls -STR_2162 :Empty Drink Cartons -STR_2163 :Empty Juice cups -STR_2164 :Roast Sausages -STR_2165 :Empty Bowls -STR_2166 :an On-Ride Photo -STR_2167 :an On-Ride Photo -STR_2168 :an On-Ride Photo -STR_2169 :a Pretzel -STR_2170 :a Hot Chocolate -STR_2171 :an Iced Tea -STR_2172 :a Funnel Cake -STR_2173 :a pair of Sunglasses -STR_2174 :some Beef Noodles -STR_2175 :some Fried Rice Noodles -STR_2176 :some Wonton Soup -STR_2177 :some Meatball Soup -STR_2178 :a Fruit Juice -STR_2179 :some Soybean Milk -STR_2180 :some Sujongkwa -STR_2181 :a Sub Sandwich -STR_2182 :a Cookie -STR_2183 :an Empty Bowl -STR_2184 :an Empty Drink Carton -STR_2185 :an Empty Juice Cup -STR_2186 :a Roast Sausage -STR_2187 :an Empty Bowl -STR_2188 :On-Ride Photo of {STRINGID} -STR_2189 :On-Ride Photo of {STRINGID} -STR_2190 :On-Ride Photo of {STRINGID} -STR_2191 :Pretzel -STR_2192 :Hot Chocolate -STR_2193 :Iced Tea +STR_2161 :Bols vides +STR_2162 :Briques vides +STR_2163 :Tasses de jus vides +STR_2164 :Saucisses grillées +STR_2165 :Bols vides +STR_2166 :une photo sur le vif +STR_2167 :une photo sur le vif +STR_2168 :une photo sur le vif +STR_2169 :un bretzel +STR_2170 :un chocolat chaud +STR_2171 :un thé glacé +STR_2172 :un Funnel Cake +STR_2173 :une paire de lunettes de soleil +STR_2174 :des nouilles au boeuf +STR_2175 :des nouilles au riz frit +STR_2176 :de la soupe aux raviolis +STR_2177 :de la soupe aux boulettes de viande +STR_2178 :un jus de fruits +STR_2179 :du lait de soja +STR_2180 :du Sujongkwa +STR_2181 :un Sub Sandwich +STR_2182 :un Cookie +STR_2183 :un bol vide +STR_2184 :une brique vide +STR_2185 :une tasse de jus vide +STR_2186 :une saucisse grillée +STR_2187 :un bol vide +STR_2188 :Photo sur le vif de {STRINGID} +STR_2189 :Photo sur le vif de {STRINGID} +STR_2190 :Photo sur le vif de {STRINGID} +STR_2191 :Bretzel +STR_2192 :Chocolat chaud +STR_2193 :Thé glacé STR_2194 :Funnel Cake -STR_2195 :Sunglasses -STR_2196 :Beef Noodles -STR_2197 :Fried Rice Noodles -STR_2198 :Wonton Soup -STR_2199 :Meatball Soup -STR_2200 :Fruit Juice -STR_2201 :Soybean Milk +STR_2195 :Lunettes de soleil +STR_2196 :Nouilles au boeuf +STR_2197 :Nouilles au riz frit +STR_2198 :Soupe aux raviolis +STR_2199 :Soupe aux boulettes de viande +STR_2200 :Jus de fruits +STR_2201 :Lait de soja STR_2202 :Sujongkwa STR_2203 :Sub Sandwich STR_2204 :Cookie -STR_2205 :Empty Bowl -STR_2206 :Empty Drink Carton -STR_2207 :Empty Juice Cup -STR_2208 :Roast Sausage -STR_2209 :Empty Bowl -STR_2210 :{SMALLFONT}{BLACK}Show list of handymen in park -STR_2211 :{SMALLFONT}{BLACK}Show list of mechanics in park -STR_2212 :{SMALLFONT}{BLACK}Show list of security guards in park -STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park -STR_2214 :Construction not possible while game is paused! +STR_2205 :Bol vide +STR_2206 :Brique vide +STR_2207 :Tasse de jus vide +STR_2208 :Saucisse grillée +STR_2209 :Bol vide +STR_2210 :{SMALLFONT}{BLACK}Afficher la liste des hommes de service dans le parc +STR_2211 :{SMALLFONT}{BLACK}Afficher la liste des mécaniciens dans le parc +STR_2212 :{SMALLFONT}{BLACK}Afficher la liste des agents de sécurité dans le parc +STR_2213 :{SMALLFONT}{BLACK}Afficher la liste des animateurs dans le parc +STR_2214 :Construction impossible durant la pause! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F @@ -2253,11 +2253,11 @@ STR_2244 :Septembre STR_2245 :Octobre STR_2246 :Novembre STR_2247 :Décembre -STR_2248 :Can't demolish ride/attraction... -STR_2249 :{BABYBLUE}New ride/attraction now available:{NEWLINE}{STRINGID} -STR_2250 :{BABYBLUE}New scenery/themeing now available:{NEWLINE}{STRINGID} -STR_2251 :Can only be built on paths! -STR_2252 :Can only be built across paths! +STR_2248 :Impossible de démolir l'attraction... +STR_2249 :{BABYBLUE}Nouvelle attraction disponible:{NEWLINE}{STRINGID} +STR_2250 :{BABYBLUE}Nouveau paysage disponible:{NEWLINE}{STRINGID} +STR_2251 :Ne peut être construit que sur les chemins! +STR_2252 :Ne peut être construit qu'à travers les chemins! STR_2253 :Attractions de transport STR_2254 :Attractions tranquilles STR_2255 :Montagnes russes @@ -2269,7 +2269,7 @@ STR_2260 :Aucun financement STR_2261 :Financement minimum STR_2262 :Financement normal STR_2263 :Financement maximum -STR_2264 :Research funding +STR_2264 :Financement recherches STR_2265 :{WINDOW_COLOUR_2}Coût: {BLACK}{CURRENCY} par mois STR_2266 :Priorités recherches STR_2267 :En cours de développement @@ -2279,9 +2279,9 @@ STR_2270 :{WINDOW_COLOUR_2}Progression: {BLACK}{STRINGID} STR_2271 :{WINDOW_COLOUR_2}Fin prévue: {BLACK}{STRINGID} STR_2272 :{WINDOW_COLOUR_2}Ride/attraction:{NEWLINE}{BLACK}{STRINGID} STR_2273 :{WINDOW_COLOUR_2}Scenery/themeing:{NEWLINE}{BLACK}{STRINGID} -STR_2274 :{SMALLFONT}{BLACK}Show details of this invention or development -STR_2275 :{SMALLFONT}{BLACK}Show funding and options for research & development -STR_2276 :{SMALLFONT}{BLACK}Show research & development status +STR_2274 :{SMALLFONT}{BLACK}Afficher détails de cette invention +STR_2275 :{SMALLFONT}{BLACK}Afficher financement et options de la recherche et du développement +STR_2276 :{SMALLFONT}{BLACK}Afficher status de la recherche et du développement STR_2277 :Inconnu STR_2278 :Attraction de transport STR_2279 :Attraction tranquille @@ -2290,32 +2290,32 @@ STR_2281 :Attraction frisson STR_2282 :Attraction aquatique STR_2283 :Magasins et boutiques STR_2284 :Décor et thèmes -STR_2285 :Initial research -STR_2286 :Designing -STR_2287 :Completing design -STR_2288 :Unknown +STR_2285 :Recherche initiale +STR_2286 :Conception +STR_2287 :Finition du concept +STR_2288 :Inconnu STR_2289 :{STRINGID} {STRINGID} STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} STR_2291 :Choisir scénario pour nouvelle partie -STR_2292 :{WINDOW_COLOUR_2}Rides been on: -STR_2293 :{BLACK} Nothing +STR_2292 :{WINDOW_COLOUR_2}Attractions utilisées: +STR_2293 :{BLACK} Rien STR_2294 :{SMALLFONT}{BLACK}Change base land style STR_2295 :{SMALLFONT}{BLACK}Change vertical edges of land -STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} paid to enter park -STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} ride -STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} rides -STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} item of food -STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} items of food -STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drink -STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drinks -STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenir -STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenirs -STR_2305 :Track design files -STR_2306 :Save track design -STR_2307 :Select {STRINGID} design -STR_2308 :{STRINGID} Track Designs -STR_2309 :Install New Track Design -STR_2310 :Build custom design +STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} payé pour entrer dans le parc +STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} dépensé pour {BLACK}{COMMA16} attraction +STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} dépensé pour {BLACK}{COMMA16} attractions +STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} dépensé pour {BLACK}{COMMA16} aliment +STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} dépensé pour {BLACK}{COMMA16} aliments +STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} dépensé pour {BLACK}{COMMA16} boisson +STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} dépensé pour {BLACK}{COMMA16} boissons +STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} dépensé pour {BLACK}{COMMA16} souvenir +STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} dépensé pour {BLACK}{COMMA16} souvenirs +STR_2305 :Fichiers de concepts de voie +STR_2306 :Sauvegarder le concept de voie +STR_2307 :Sélectionner le concept {STRINGID} +STR_2308 :{STRINGID} Concepts de Voies +STR_2309 :Installer un Nouveau Concept de Voie +STR_2310 :Construire un concept personnalisé STR_2311 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} (approx.) STR_2312 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} (approx.) STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) diff --git a/data/language/portuguese_br.txt b/data/language/portuguese_br.txt index dc64d25a67..6a263f8de4 100644 --- a/data/language/portuguese_br.txt +++ b/data/language/portuguese_br.txt @@ -3890,6 +3890,11 @@ STR_5549 :Ano/Mês/Dia STR_5550 :{POP16}{POP16}Ano {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} STR_5551 :Ano/Mês/Dia STR_5552 :{POP16}{POP16}Ano {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} +STR_5553 :Pausar o jogo quando a Steam estiver aberta sobrepondo +STR_5554 :{SMALLFONT}{BLACK}Habilitar ferramenta de montanha +STR_5555 :Exibir veiculos de outros tipos de atrações +STR_5556 :Remover Jogador +STR_5557 :Manter conectado após dessincronização (Multijogador) ##################### # Rides/attractions # From 29243780c89409928ee8355818c5c406d98981a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Wed, 28 Oct 2015 07:26:01 +0100 Subject: [PATCH 0906/1173] add limits.h include for CHAR_BIT --- src/drawing/rect.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/drawing/rect.c b/src/drawing/rect.c index 26bb39c1e9..8da268b2cc 100644 --- a/src/drawing/rect.c +++ b/src/drawing/rect.c @@ -18,6 +18,7 @@ * along with this program. If not, see . *****************************************************************************/ +#include #include "../addresses.h" #include "../common.h" #include "drawing.h" From 2f457aeffcf77dc02227c5133573bf854b68d2c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Wed, 28 Oct 2015 08:02:30 +0100 Subject: [PATCH 0907/1173] Cleanups * Remove unused function in config.c * Check handle *before* it is used * Provide explicit parentheses around unclear if statements --- src/config.c | 20 -------------------- src/peep/peep.c | 4 ++-- src/platform/linux.c | 9 ++++++--- src/ride/ride_data.c | 4 ++-- src/world/map.c | 10 +++++----- 5 files changed, 15 insertions(+), 32 deletions(-) diff --git a/src/config.c b/src/config.c index a293bac650..50dc70b522 100644 --- a/src/config.c +++ b/src/config.c @@ -692,26 +692,6 @@ static void config_write_enum(SDL_RWops *file, uint8 type, value_union *value, c config_save_property_value(file, type, value); } -static int utf8_read(utf8 **outch) -{ - int result; - int numBytes; - - utf8 *ch = *outch; - if (!(ch[0] & 0x80)) { - result = ch[0]; - numBytes = 1; - } else if (!(ch[0] & 0x20)) { - result = ((ch[0] & 0x1F) << 6) | (ch[1] & 0x3F); - numBytes = 2; - } else { - numBytes = 1; - } - - *outch = ch + numBytes; - return result; -} - static void utf8_skip_whitespace(utf8 **outch) { utf8 *ch; diff --git a/src/peep/peep.c b/src/peep/peep.c index 1f9c815739..b1a6979058 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7905,10 +7905,10 @@ static bool sub_69AF1E(rct_peep *peep, int rideIndex, int shopItem, money32 pric if (shop_item_is_food_or_drink(shopItem)) { int food = -1; - if (food = peep_has_food_standard_flag(peep)) { + if ((food = peep_has_food_standard_flag(peep))) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_HAVENT_FINISHED, bitscanforward(food)); return 0; - } else if (food = peep_has_food_extra_flag(peep)) { + } else if ((food = peep_has_food_extra_flag(peep))) { peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_HAVENT_FINISHED, bitscanforward(food) + 32); return 0; } else if (peep->nausea >= 145) diff --git a/src/platform/linux.c b/src/platform/linux.c index bccad09470..4fd11fc530 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -317,13 +317,16 @@ int platform_enumerate_files_begin(const utf8 *pattern) bool platform_enumerate_files_next(int handle, file_info *outFileInfo) { - bool result; + bool result = true; enumerate_file_info *enumFileInfo; + if (handle < 0) + { + result = false; + } enumFileInfo = &_enumerateFileInfoList[handle]; - log_verbose("handle = %d", handle); - if ((handle >= 0) && (enumFileInfo->handle < enumFileInfo->cnt)) { + if (result && (enumFileInfo->handle < enumFileInfo->cnt)) { result = true; } else { result = false; diff --git a/src/ride/ride_data.c b/src/ride/ride_data.c index c3679300e7..41cfe8ac47 100644 --- a/src/ride/ride_data.c +++ b/src/ride/ride_data.c @@ -1291,8 +1291,8 @@ const rct_ride_type_vehicle CableLiftVehicle = { .powered_acceleration = 0, .powered_max_speed = 0, .car_visual = 0, - .pad_5E = { 1 }, + .pad_5E = 1, .draw_order = 14, .special_frames = 0, .peep_loading_positions = NULL -}; \ No newline at end of file +}; diff --git a/src/world/map.c b/src/world/map.c index 7f6af24a97..15b2bfe78b 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -912,7 +912,7 @@ void game_command_remove_scenery(int* eax, int* ebx, int* ecx, int* edx, int* es while(map_element->type != map_element_type || map_element->base_height != base_height || map_element->properties.scenery.type != scenery_type || - (*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)){ + ((*ebx & GAME_COMMAND_FLAG_GHOST) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST))){ map_element++; if((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE){ *ebx = 0; @@ -3844,10 +3844,10 @@ int map_can_construct_with_clear_at(int x, int y, int zLow, int zHigh, void *cle ch += 2; } int bh = zLow + 4; - if ((!(bl & 1) || (bl & 0x10 || zLow >= al) && bh >= al) && - (!(bl & 2) || (bl & 0x20 || zLow >= ah) && bh >= ah) && - (!(bl & 4) || (bl & 0x40 || zLow >= cl) && bh >= cl) && - (!(bl & 8) || (bl & 0x80 || zLow >= ch) && bh >= ch)) { + if ((!(bl & 1) || ((bl & 0x10 || zLow >= al) && bh >= al)) && + (!(bl & 2) || ((bl & 0x20 || zLow >= ah) && bh >= ah)) && + (!(bl & 4) || ((bl & 0x40 || zLow >= cl) && bh >= cl)) && + (!(bl & 8) || ((bl & 0x80 || zLow >= ch) && bh >= ch))) { continue; } loc_68BABC: From 330b6b5524880f0acaab810d46c12bb2bc363e9b Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 18 Oct 2015 19:03:51 +0100 Subject: [PATCH 0908/1173] Implemented tables for top spin paint setup --- projects/openrct2.vcxproj | 2 + projects/openrct2.vcxproj.filters | 6 + src/interface/viewport.c | 54 ++++---- src/ride/track_data.c | 100 +++++++++++++- src/ride/track_data.h | 1 + src/ride/track_paint.c | 212 ++++++++++++++++++++++++++++++ src/ride/track_paint.h | 10 ++ 7 files changed, 355 insertions(+), 30 deletions(-) create mode 100644 src/ride/track_paint.c create mode 100644 src/ride/track_paint.h diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index ea6a74ab68..44e73ff7e8 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -94,6 +94,7 @@ + @@ -250,6 +251,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 070539ff77..247c93564f 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -540,6 +540,9 @@ Source\Localisation + + Source\Ride + @@ -806,5 +809,8 @@ Source\Core + + Source\Ride + \ No newline at end of file diff --git a/src/interface/viewport.c b/src/interface/viewport.c index aa92041b0b..538fd7cad3 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -24,6 +24,7 @@ #include "../localisation/localisation.h" #include "../ride/ride_data.h" #include "../ride/track_data.h" +#include "../ride/track_paint.h" #include "../sprites.h" #include "../world/map.h" #include "../world/sprite.h" @@ -1373,16 +1374,7 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma RCT2_GLOBAL(0x009DEA52, uint16) = 1000; RCT2_GLOBAL(0x009DEA54, uint16) = 1000; RCT2_GLOBAL(0x009DEA56, uint16) = 2047; - RCT2_CALLPROC_X( - RCT2_ADDRESS(0x0098197C, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)], - 16, - ebx, - 16, - height + ax + 3, - 1, - 1, - 0 - ); + sub_98197C(16, 0, ebx, 16, height + ax + 3, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); } } @@ -1398,28 +1390,34 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma RCT2_GLOBAL(0x00F441A4, uint32) = 0x21600000; } if (mapElement->flags & MAP_ELEMENT_FLAG_GHOST) { - uint32 meh = RCT2_ADDRESS(0x00993CC4, uint32)[RCT2_GLOBAL(0x009AACBF, uint8)]; + uint32 ghost_id = RCT2_ADDRESS(0x00993CC4, uint32)[RCT2_GLOBAL(0x009AACBF, uint8)]; RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = 0; - RCT2_GLOBAL(0x00F44198, uint32) = meh; - RCT2_GLOBAL(0x00F4419C, uint32) = meh; - RCT2_GLOBAL(0x00F441A0, uint32) = meh; - RCT2_GLOBAL(0x00F441A4, uint32) = meh; + RCT2_GLOBAL(0x00F44198, uint32) = ghost_id; + RCT2_GLOBAL(0x00F4419C, uint32) = ghost_id; + RCT2_GLOBAL(0x00F441A0, uint32) = ghost_id; + RCT2_GLOBAL(0x00F441A4, uint32) = ghost_id; } - uint32 **trackTypeList = (uint32**)RideTypeTrackPaintFunctions[ride->type]; - uint32 *trackDirectionList = trackTypeList[trackType]; + TRACK_PAINT_FUNCTION ***trackTypeList = (TRACK_PAINT_FUNCTION***)RideTypeTrackPaintFunctionsOld[ride->type]; + if (trackTypeList == NULL) { + trackTypeList = (TRACK_PAINT_FUNCTION***)RideTypeTrackPaintFunctions[ride->type]; + trackTypeList[trackType][direction](rideIndex, trackSequence, direction, height, mapElement); + } + else { + uint32 *trackDirectionList = (uint32*)trackTypeList[trackType]; - // Have to call from this point as it pushes esi and expects callee to pop it - RCT2_CALLPROC_X( - 0x006C4934, - ride->type, - (int)trackDirectionList, - direction, - height, - (int)mapElement, - rideIndex * sizeof(rct_ride), - trackSequence - ); + // Have to call from this point as it pushes esi and expects callee to pop it + RCT2_CALLPROC_X( + 0x006C4934, + ride->type, + (int)trackDirectionList, + direction, + height, + (int)mapElement, + rideIndex * sizeof(rct_ride), + trackSequence + ); + } } if (isEntranceStyleNone) { diff --git a/src/ride/track_data.c b/src/ride/track_data.c index 1ba63b6e65..f1590b882e 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -20,6 +20,7 @@ #include "track.h" #include "track_data.h" +#include "track_paint.h" const rct_track_coordinates* FlatTrackCoordinates = RCT2_ADDRESS(0x009972BB, const rct_track_coordinates); @@ -5469,7 +5470,7 @@ const track_curve_chain gFlatRideTrackCurveChain[256] = { { 0, 57088 }, }; -const uint32 RideTypeTrackPaintFunctions[91] = { +const uint32 RideTypeTrackPaintFunctionsOld[91] = { 0x008A42F4, // RIDE_TYPE_SPIRAL_ROLLER_COASTER 0x008A6DB0, // RIDE_TYPE_STAND_UP_ROLLER_COASTER 0x008A85E4, // RIDE_TYPE_SUSPENDED_SWINGING_COASTER @@ -5510,7 +5511,7 @@ const uint32 RideTypeTrackPaintFunctions[91] = { 0x008A8CC8, // RIDE_TYPE_FERRIS_WHEEL 0x00763520, // RIDE_TYPE_MOTION_SIMULATOR 0x0076554C, // RIDE_TYPE_3D_CINEMA - 0x0076659C, // RIDE_TYPE_TOP_SPIN + 0, // RIDE_TYPE_TOP_SPIN 0x00767A40, // RIDE_TYPE_SPACE_RINGS 0x00768BAC, // RIDE_TYPE_REVERSE_FREEFALL_COASTER 0x0076C5BC, // RIDE_TYPE_LIFT @@ -5562,3 +5563,98 @@ const uint32 RideTypeTrackPaintFunctions[91] = { 0x00000000, // RIDE_TYPE_59 0x008A5F6C, // RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER }; + + +const uint32 RideTypeTrackPaintFunctions[91] = { + 0, // RIDE_TYPE_SPIRAL_ROLLER_COASTER + 0, // RIDE_TYPE_STAND_UP_ROLLER_COASTER + 0, // RIDE_TYPE_SUSPENDED_SWINGING_COASTER + 0, // RIDE_TYPE_INVERTED_ROLLER_COASTER + 0, // RIDE_TYPE_JUNIOR_ROLLER_COASTER + 0, // RIDE_TYPE_MINIATURE_RAILWAY + 0, // RIDE_TYPE_MONORAIL + 0, // RIDE_TYPE_MINI_SUSPENDED_COASTER + 0, // RIDE_TYPE_BOAT_RIDE + 0, // RIDE_TYPE_WOODEN_WILD_MOUSE + 0, // RIDE_TYPE_STEEPLECHASE + 0, // RIDE_TYPE_CAR_RIDE + 0, // RIDE_TYPE_LAUNCHED_FREEFALL + 0, // RIDE_TYPE_BOBSLEIGH_COASTER + 0, // RIDE_TYPE_OBSERVATION_TOWER + 0, // RIDE_TYPE_LOOPING_ROLLER_COASTER + 0, // RIDE_TYPE_DINGHY_SLIDE + 0, // RIDE_TYPE_MINE_TRAIN_COASTER + 0, // RIDE_TYPE_CHAIRLIFT + 0, // RIDE_TYPE_CORKSCREW_ROLLER_COASTER + 0, // RIDE_TYPE_MAZE + 0, // RIDE_TYPE_SPIRAL_SLIDE + 0, // RIDE_TYPE_GO_KARTS + 0, // RIDE_TYPE_LOG_FLUME + 0, // RIDE_TYPE_RIVER_RAPIDS + 0, // RIDE_TYPE_DODGEMS + 0, // RIDE_TYPE_PIRATE_SHIP + 0, // RIDE_TYPE_SWINGING_INVERTER_SHIP + 0, // RIDE_TYPE_FOOD_STALL + 0, // RIDE_TYPE_1D + 0, // RIDE_TYPE_DRINK_STALL + 0, // RIDE_TYPE_1F + 0, // RIDE_TYPE_SHOP + 0, // RIDE_TYPE_MERRY_GO_ROUND + 0, // RIDE_TYPE_22 + 0, // RIDE_TYPE_INFORMATION_KIOSK + 0, // RIDE_TYPE_TOILETS + 0, // RIDE_TYPE_FERRIS_WHEEL + 0, // RIDE_TYPE_MOTION_SIMULATOR + 0, // RIDE_TYPE_3D_CINEMA + (uint32)top_spin_track_paint_functions, // RIDE_TYPE_TOP_SPIN + 0, // RIDE_TYPE_SPACE_RINGS + 0, // RIDE_TYPE_REVERSE_FREEFALL_COASTER + 0, // RIDE_TYPE_LIFT + 0, // RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER + 0, // RIDE_TYPE_CASH_MACHINE + 0, // RIDE_TYPE_TWIST + 0, // RIDE_TYPE_HAUNTED_HOUSE + 0, // RIDE_TYPE_FIRST_AID + 0, // RIDE_TYPE_CIRCUS_SHOW + 0, // RIDE_TYPE_GHOST_TRAIN + 0, // RIDE_TYPE_TWISTER_ROLLER_COASTER + 0, // RIDE_TYPE_WOODEN_ROLLER_COASTER + 0, // RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER + 0, // RIDE_TYPE_WILD_MOUSE + 0, // RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER + 0, // RIDE_TYPE_38 + 0, // RIDE_TYPE_FLYING_ROLLER_COASTER + 0, // RIDE_TYPE_3A + 0, // RIDE_TYPE_VIRGINIA_REEL + 0, // RIDE_TYPE_SPLASH_BOATS + 0, // RIDE_TYPE_MINI_HELICOPTERS + 0, // RIDE_TYPE_LAY_DOWN_ROLLER_COASTER + 0, // RIDE_TYPE_SUSPENDED_MONORAIL + 0, // RIDE_TYPE_40 + 0, // RIDE_TYPE_REVERSER_ROLLER_COASTER + 0, // RIDE_TYPE_HEARTLINE_TWISTER_COASTER + 0, // RIDE_TYPE_MINI_GOLF + 0, // RIDE_TYPE_GIGA_COASTER + 0, // RIDE_TYPE_ROTO_DROP + 0, // RIDE_TYPE_FLYING_SAUCERS + 0, // RIDE_TYPE_CROOKED_HOUSE + 0, // RIDE_TYPE_MONORAIL_CYCLES + 0, // RIDE_TYPE_COMPACT_INVERTED_COASTER + 0, // RIDE_TYPE_WATER_COASTER + 0, // RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER + 0, // RIDE_TYPE_INVERTED_HAIRPIN_COASTER + 0, // RIDE_TYPE_MAGIC_CARPET + 0, // RIDE_TYPE_SUBMARINE_RIDE + 0, // RIDE_TYPE_RIVER_RAFTS + 0, // RIDE_TYPE_50 + 0, // RIDE_TYPE_ENTERPRISE + 0, // RIDE_TYPE_52 + 0, // RIDE_TYPE_53 + 0, // RIDE_TYPE_54 + 0, // RIDE_TYPE_55 + 0, // RIDE_TYPE_INVERTED_IMPULSE_COASTER + 0, // RIDE_TYPE_MINI_ROLLER_COASTER + 0, // RIDE_TYPE_MINE_RIDE + 0, // RIDE_TYPE_59 + 0, // RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER +}; diff --git a/src/ride/track_data.h b/src/ride/track_data.h index 1a6010df89..366e642589 100644 --- a/src/ride/track_data.h +++ b/src/ride/track_data.h @@ -41,3 +41,4 @@ extern const track_curve_chain gTrackCurveChain[256]; extern const track_curve_chain gFlatRideTrackCurveChain[256]; extern const uint32 RideTypeTrackPaintFunctions[91]; +extern const uint32 RideTypeTrackPaintFunctionsOld[91]; diff --git a/src/ride/track_paint.c b/src/ride/track_paint.c new file mode 100644 index 0000000000..1f9753a86a --- /dev/null +++ b/src/ride/track_paint.c @@ -0,0 +1,212 @@ +/***************************************************************************** +* Copyright (c) 2014 Ted John +* OpenRCT2, an open source clone of Roller Coaster Tycoon 2. +* +* This file is part of OpenRCT2. +* +* OpenRCT2 is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. + +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. + +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*****************************************************************************/ + + +#include "../addresses.h" +#include "../config.h" +#include "../drawing/drawing.h" +#include "../localisation/localisation.h" +#include "ride_data.h" +#include "track_data.h" +#include "../sprites.h" +#include "../world/map.h" +#include "../world/sprite.h" +#include "../interface/viewport.h" +#include "../interface/window.h" +#include "track_paint.h" + +void dummy_paint_setup_function(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) {} + +TRACK_PAINT_FUNCTION* dummy_rotation[] = { + dummy_paint_setup_function, + dummy_paint_setup_function, + dummy_paint_setup_function, + dummy_paint_setup_function, +}; + +void top_spin_paint_setup_rot_0(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement); +void top_spin_paint_setup_rot_1(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement); +void top_spin_paint_setup_rot_2(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement); +void top_spin_paint_setup_rot_3(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement); + +/* 0x0076679C */ +TRACK_PAINT_FUNCTION* top_spin_base_functions[] = { + top_spin_paint_setup_rot_0, + top_spin_paint_setup_rot_1, + top_spin_paint_setup_rot_2, + top_spin_paint_setup_rot_3, +}; + +TRACK_PAINT_FUNCTION** top_spin_track_paint_functions[] = { + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + dummy_rotation, + top_spin_base_functions // 123 +}; + + + +/* rct2: 0x007667BC + */ +void top_spin_paint_setup_rot_0(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + return; + RCT2_CALLPROC_X(0x007667BC, 0, 0, 0, 0, 0, 0, 0); +} + +/* rct2: 0x007667EC +*/ +void top_spin_paint_setup_rot_1(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + return; + RCT2_CALLPROC_X(0x007667EC, 0, 0, 0, 0, 0, 0, 0); +} + +/* rct2: 0x0076671C +*/ +void top_spin_paint_setup_rot_2(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + return; + RCT2_CALLPROC_X(0x0076671C, 0, 0, 0, 0, 0, 0, 0); +} + +/* rct2: 0x0076674C +*/ +void top_spin_paint_setup_rot_3(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + return; + RCT2_CALLPROC_X(0x0076674C, 0, 0, 0, 0, 0, 0, 0); +} \ No newline at end of file diff --git a/src/ride/track_paint.h b/src/ride/track_paint.h new file mode 100644 index 0000000000..28084a1f5d --- /dev/null +++ b/src/ride/track_paint.h @@ -0,0 +1,10 @@ +#ifndef _TRACK_PAINT_H +#define _TRACK_PAINT_H + +#include "../common.h" + +typedef void (TRACK_PAINT_FUNCTION)(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement); + +extern TRACK_PAINT_FUNCTION** top_spin_track_paint_functions[]; + +#endif \ No newline at end of file From c62e61bd36d59b88c1afe18a7128479f65999f5e Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 18 Oct 2015 19:58:22 +0100 Subject: [PATCH 0909/1173] Started implementing rotation 0 --- src/interface/viewport.c | 62 ++-- src/interface/viewport.h | 3 + src/ride/ride.h | 2 +- src/ride/track_paint.c | 739 ++++++++++++++++++++++++++++++++++++++- 4 files changed, 779 insertions(+), 27 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 538fd7cad3..a589637619 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -722,7 +722,7 @@ void sub_688485(){ } /* rct2: 0x00686806, 0x006869B2, 0x00686B6F, 0x00686D31, 0x0098197C */ -int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int edx, sint16 si, sint16 di, uint32 rotation){ +int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_x, sint16 length_y, uint32 rotation){ int ebp = ah + RCT2_GLOBAL(0x9DEA56, uint16); RCT2_GLOBAL(0xF1AD28, paint_struct*) = 0; @@ -731,7 +731,7 @@ int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int edx, sint16 si, s //Not a paint struct but something similar paint_struct* ps = RCT2_GLOBAL(0xEE7888, paint_struct*); - if ((uint32)ps >= RCT2_GLOBAL(0xEE7880, uint32)) return 1; + if ((uint32)ps >= RCT2_GLOBAL(0xEE7880, uint32))return 1; ps->image_id = image_id; @@ -748,11 +748,23 @@ int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int edx, sint16 si, s rct_xyz16 coord_3d = { .x = al, .y = cl, - .z = edx + .z = height }; - rotate_map_coordinates(&coord_3d.x, &coord_3d.y, rotation); - + switch (rotation) { + case 0: + rotate_map_coordinates(&coord_3d.x, &coord_3d.y, 0); + break; + case 1: + rotate_map_coordinates(&coord_3d.x, &coord_3d.y, 3); + break; + case 2: + rotate_map_coordinates(&coord_3d.x, &coord_3d.y, 2); + break; + case 3: + rotate_map_coordinates(&coord_3d.x, &coord_3d.y, 1); + break; + } coord_3d.x += RCT2_GLOBAL(0x9DE568, sint16); coord_3d.y += RCT2_GLOBAL(0x9DE56C, sint16); @@ -774,12 +786,12 @@ int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int edx, sint16 si, s if (right <= dpi->x)return 1; if (top <= dpi->y)return 1; - if (left > dpi->x + dpi->width) return 1; - if (bottom > dpi->y + dpi->height) return 1; + if (left > dpi->x + dpi->width)return 1; + if (bottom > dpi->y + dpi->height)return 1; - rct_xy16 unk = { - .x = di, - .y = si + rct_xy16 boundBox = { + .x = length_x, + .y = length_y }; rct_xy16 s_unk = { @@ -790,31 +802,31 @@ int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int edx, sint16 si, s // Unsure why rots 1 and 3 need to swap switch (rotation){ case 0: - rotate_map_coordinates(&unk.x, &unk.y, 0); + rotate_map_coordinates(&boundBox.x, &boundBox.y, 0); rotate_map_coordinates(&s_unk.x, &s_unk.y, 0); - unk.x--; - unk.y--; + boundBox.x--; + boundBox.y--; break; case 1: - rotate_map_coordinates(&unk.x, &unk.y, 3); + rotate_map_coordinates(&boundBox.x, &boundBox.y, 3); rotate_map_coordinates(&s_unk.x, &s_unk.y, 3); - unk.y--; + boundBox.y--; break; case 2: - rotate_map_coordinates(&unk.x, &unk.y, 2); + rotate_map_coordinates(&boundBox.x, &boundBox.y, 2); rotate_map_coordinates(&s_unk.x, &s_unk.y, 2); break; case 3: - rotate_map_coordinates(&unk.x, &unk.y, 1); + rotate_map_coordinates(&boundBox.x, &boundBox.y, 1); rotate_map_coordinates(&s_unk.x, &s_unk.y, 1); - unk.x--; + boundBox.x--; break; } - ps->other_x = unk.x + s_unk.x + RCT2_GLOBAL(0x9DE568, sint16); + ps->other_x = boundBox.x + s_unk.x + RCT2_GLOBAL(0x9DE568, sint16); ps->some_x = RCT2_GLOBAL(0x009DEA56, sint16); ps->some_y = ebp; - ps->other_y = unk.y + s_unk.y + RCT2_GLOBAL(0x009DE56C, sint16); + ps->other_y = boundBox.y + s_unk.y + RCT2_GLOBAL(0x009DE56C, sint16); ps->var_1A = 0; ps->attached_x = s_unk.x + RCT2_GLOBAL(0x9DE568, sint16); ps->attached_y = s_unk.y + RCT2_GLOBAL(0x009DE56C, sint16); @@ -846,7 +858,7 @@ int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int edx, sint16 si, s break; } - di = attach.x + attach.y; + sint16 di = attach.x + attach.y; if (di < 0) di = 0; @@ -860,12 +872,12 @@ int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int edx, sint16 si, s RCT2_ADDRESS(0x00F1A50C, paint_struct*)[di] = ps; ps->next_quadrant_ps = old_ps; - if (di < RCT2_GLOBAL(0x00F1AD0C, sint32)){ - RCT2_GLOBAL(0x00F1AD0C, sint32) = di; + if ((uint16)di < RCT2_GLOBAL(0x00F1AD0C, uint32)){ + RCT2_GLOBAL(0x00F1AD0C, uint32) = di; } - if (di > RCT2_GLOBAL(0x00F1AD10, sint32)){ - RCT2_GLOBAL(0x00F1AD10, sint32) = di; + if ((uint16)di > RCT2_GLOBAL(0x00F1AD10, uint32)){ + RCT2_GLOBAL(0x00F1AD10, uint32) = di; } RCT2_GLOBAL(0xEE7888, paint_struct*) += 1; diff --git a/src/interface/viewport.h b/src/interface/viewport.h index a1fd91a45d..bdf47b590a 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -131,6 +131,9 @@ void painter_setup(); void sub_688485(); void sub_688217(); +int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_x, sint16 length_y, uint32 rotation); +int 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); void screen_get_map_xy(int screenX, int screenY, sint16 *x, sint16 *y, rct_viewport **viewport); diff --git a/src/ride/ride.h b/src/ride/ride.h index e1320f4da8..0734fedc7e 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -828,7 +828,7 @@ extern rct_ride* g_ride_list; /** Helper macros until rides are stored in this module. */ #define GET_RIDE(x) (&g_ride_list[x]) #define GET_RIDE_MEASUREMENT(x) (&(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_MEASUREMENTS, rct_ride_measurement)[x])) -#define GET_RIDE_ENTRY(x) RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, rct_ride_type*)[x] +#define GET_RIDE_ENTRY(x) gRideTypeList[x] /** * Helper macro loop for enumerating through all the non null rides. diff --git a/src/ride/track_paint.c b/src/ride/track_paint.c index 1f9753a86a..6d52b82dbd 100644 --- a/src/ride/track_paint.c +++ b/src/ride/track_paint.c @@ -181,18 +181,743 @@ TRACK_PAINT_FUNCTION** top_spin_track_paint_functions[] = { top_spin_base_functions // 123 }; +/* rct2: 0x0076687C */ +void top_spin_paint_tile_0(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); + sub_6629BC(height, 0, image_id, direction & 1); + image_id = 22137 | RCT2_GLOBAL(0x00F44198, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height; + sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9B8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9BC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9CC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D4, uint16) = 0xFFFF; + + height += 112; + if (RCT2_GLOBAL(0x141E9D8, sint16) < height) { + RCT2_GLOBAL(0x141E9D8, sint16) = height; + RCT2_GLOBAL(0x141E9DA, uint8) = 32; + } +} + +/* rct2:0x007667AE */ +rct_xy16 loc_7667AE[] = { + { .x = 0, .y = -1 }, + { .x = 1, .y = 0 }, + { .x = 0, .y = 1}, + { .x = -1, .y = 0 }, +}; + +/* rct2:0x007667AC */ +rct_xy16 loc_7667AC[] = { + { .x = -1, .y = 0 }, + { .x = 0, .y = -1 }, + { .x = 1, .y = 0 }, + { .x = 0, .y = 1 }, +}; + +/* rct2: 0x0076750D */ +void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction, int height, rct_map_element* mapElement) { + // As we will be drawing a vehicle we need to backup the mapElement that + // is assigned to the drawings. + rct_map_element* curMapElement = RCT2_GLOBAL(0x009DE578, rct_map_element*); + + height += 3; + + rct_ride* ride = GET_RIDE(rideIndex); + rct_ride_type* rideEntry = GET_RIDE_ENTRY(ride->subtype); + rct_vehicle* vehicle = NULL; + + uint8 seatRotation = 0; + sint8 armRotation = 0; + + if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK && + ride->vehicles[0] != SPRITE_INDEX_NULL) { + vehicle = GET_VEHICLE(ride->vehicles[0]); + + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_SPRITE; + RCT2_GLOBAL(0x009DE578, rct_vehicle*) = vehicle; + + armRotation = vehicle->var_1F; + seatRotation = vehicle->var_20; + } + + RCT2_GLOBAL(0x009DEA52, sint16) = al + 16; + RCT2_GLOBAL(0x009DEA54, sint16) = cl + 16; + RCT2_GLOBAL(0x009DEA56, sint16) = height; + + //di + uint8 lengthY = 24; + //si + uint8 lengthX = 24; + + uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); + if (image_id == 0x20000000) { + image_id = + 0xA0000000 | + (ride->track_colour_main[0] << 19) | + (ride->track_colour_supports[0] << 24); + } + + image_id += (direction & 1) << 1; + image_id += rideEntry->vehicles[0].base_image_id; + // Left back bottom support + image_id += 572; + + sub_98197C(al, 90, image_id, cl, height, lengthX, lengthY, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + image_id = RCT2_GLOBAL(0x00F441A0, uint32); + if (image_id == 0x20000000) { + image_id = + 0xA0000000 | + (ride->track_colour_main[0] << 19) | + (ride->track_colour_additional[0] << 24); + } + + sint32 var_1F = armRotation; + if (direction & 2) { + var_1F = -var_1F; + if (var_1F != 0) + var_1F += 48; + } + image_id += var_1F; + image_id += (direction & 1) * 48; + image_id += rideEntry->vehicles[0].base_image_id; + // Left hand arm + image_id += 380; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + al | (90 << 8), + image_id, + cl, + height, + lengthX, + lengthY, + 0); + + uint32 seatImageId; + + if (vehicle != NULL && vehicle->var_B5 >= 64) { + // Open Restraints + image_id = (vehicle->var_B5 - 64) >> 6; + image_id += direction * 3; + image_id += rideEntry->vehicles[0].base_image_id; + image_id += 64; + seatImageId = image_id; + } + else { + image_id = direction * 16; + // Var_20 Rotation of seats + image_id += seatRotation; + image_id += rideEntry->vehicles[0].base_image_id; + seatImageId = image_id; + } + + image_id = RCT2_GLOBAL(0x00F441A0, uint32); + if (image_id == 0x20000000) { + image_id = + 0xA0000000 | + (ride->vehicle_colours[0].body_colour << 19) | + (ride->vehicle_colours[0].trim_colour << 24); + } + image_id += seatImageId; + + rct_xyz16 seatCoords = { + .x = al, + .y = cl, + .z = height + }; + seatCoords.z += RCT2_ADDRESS(0x14280BC, sint16)[armRotation]; + + switch (direction) { + case 0: + seatCoords.x -= RCT2_ADDRESS(0x0142811C, sint8)[armRotation]; + break; + case 1: + seatCoords.y += RCT2_ADDRESS(0x0142811C, sint8)[armRotation]; + break; + case 2: + seatCoords.x += RCT2_ADDRESS(0x0142811C, sint8)[armRotation]; + break; + case 3: + seatCoords.y -= RCT2_ADDRESS(0x0142811C, sint8)[armRotation]; + break; + } + + RCT2_GLOBAL(0x014280B8, sint8) = (sint8)seatCoords.x; + RCT2_GLOBAL(0x014280B9, sint8) = (sint8)seatCoords.y; + RCT2_GLOBAL(0x014280BA, sint16) = seatCoords.z; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + seatCoords.x | (90 << 8), + image_id, + seatCoords.y, + seatCoords.z, + lengthX, + lengthY, + 0); + + rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + if (dpi->zoom_level < 2 && vehicle != NULL && vehicle->num_peeps != 0) { + image_id = + (vehicle->peep_tshirt_colours[0] << 19) | + (vehicle->peep_tshirt_colours[1] << 24); + image_id += seatImageId; + image_id += 0xA0000000; + image_id += 76; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + seatCoords.x | (90 << 8), image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + + if (vehicle->num_peeps > 2) { + image_id = + (vehicle->peep_tshirt_colours[2] << 19) | + (vehicle->peep_tshirt_colours[3] << 24); + image_id += seatImageId; + image_id += 0xA0000000; + image_id += 152; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + seatCoords.x | (90 << 8), image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + } + + if (vehicle->num_peeps > 4) { + image_id = + (vehicle->peep_tshirt_colours[4] << 19) | + (vehicle->peep_tshirt_colours[5] << 24); + image_id += seatImageId; + image_id += 0xA0000000; + image_id += 228; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + seatCoords.x | (90 << 8), image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + } + + if (vehicle->num_peeps > 6) { + image_id = + (vehicle->peep_tshirt_colours[6] << 19) | + (vehicle->peep_tshirt_colours[7] << 24); + image_id += seatImageId; + image_id += 0xA0000000; + image_id += 304; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + seatCoords.x | (90 << 8), image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + } + } + + image_id = RCT2_GLOBAL(0x00F441A0, uint32); + if (image_id == 0x20000000) { + image_id = + 0xA0000000 | + (ride->track_colour_main[0] << 19) | + (ride->track_colour_additional[0] << 24); + } + + image_id += var_1F; + image_id += (direction & 1) * 48; + image_id += rideEntry->vehicles[0].base_image_id; + // Right hand arm + image_id += 476; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + al | (90 << 8), + image_id, + cl, + height, + lengthX, + lengthY, + 0); + + image_id = RCT2_GLOBAL(0x00F441A0, uint32); + if (image_id == 0x20000000) { + image_id = + 0xA0000000 | + (ride->track_colour_main[0] << 19) | + (ride->track_colour_supports[0] << 24); + } + + image_id += (direction & 1) << 1; + image_id += rideEntry->vehicles[0].base_image_id; + // Right back bottom support + image_id += 573; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + al | (90 << 8), + image_id, + cl, + height, + lengthX, + lengthY, + 0); + + RCT2_GLOBAL(0x009DE578, rct_map_element*) = curMapElement; + RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_RIDE; +} + +/* rct2: 0x0076693F */ +void top_spin_paint_tile_rot_0_tile_1(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); + sub_6629BC(height, 0, image_id, direction & 1); + + image_id = 22137 | RCT2_GLOBAL(0x00F44198, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height; + sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); + uint16 entranceLoc = + ((x / 32) + loc_7667AE[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].x) | + (((y / 32) + loc_7667AE[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].y) << 8); + + uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; + rct_ride* ride = GET_RIDE(rideIndex); + + if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { + + image_id = 22141 | RCT2_GLOBAL(0x00F441A0, uint32); + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 2; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 7 << 8, image_id, 0, height, 1, 32, 0); + } + + entranceLoc = + ((x / 32) + loc_7667AC[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].x) | + (((y / 32) + loc_7667AC[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].y) << 8); + + if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { + + image_id = 22138 | RCT2_GLOBAL(0x00F441A0, uint32); + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 2; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 7 << 8, image_id, 0, height, 32, 1, 0); + } + + top_spin_paint_vehicle(32, 32, rideIndex, direction, height, mapElement); + + RCT2_GLOBAL(0x141E9B4, uint16) = height + 2; + RCT2_GLOBAL(0x141E9B6, uint16) = 32; + RCT2_GLOBAL(0x141E9B8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9BC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C8, uint16) = height + 2; + RCT2_GLOBAL(0x141E9CA, uint16) = 32; + RCT2_GLOBAL(0x141E9CC, uint16) = height + 2; + RCT2_GLOBAL(0x141E9CE, uint16) = 32; + RCT2_GLOBAL(0x141E9D0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D4, uint16) = 0xFFFF; + + height += 110; + if (RCT2_GLOBAL(0x141E9D8, sint16) < height) { + RCT2_GLOBAL(0x141E9D8, sint16) = height; + RCT2_GLOBAL(0x141E9DA, uint8) = 32; + } +} + +/* rct2: 0x00767033 */ +void top_spin_paint_tile_rot_0_tile_2(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); + sub_6629BC(height, 0, image_id, direction & 1); + + image_id = 22137 | RCT2_GLOBAL(0x00F44198, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height; + sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); + uint16 entranceLoc = + ((x / 32) + loc_7667AC[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].x) | + (((y / 32) + loc_7667AC[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].y) << 8); + + uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; + rct_ride* ride = GET_RIDE(rideIndex); + + if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { + + image_id = 22138 | RCT2_GLOBAL(0x00F441A0, uint32); + RCT2_GLOBAL(0x009DEA52, uint16) = 2; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 7 << 8, image_id, 0, height, 32, 1, 0); + } + + RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9B8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9BC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9CC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D4, uint16) = 0xFFFF; + + height += 110; + if (RCT2_GLOBAL(0x141E9D8, sint16) < height) { + RCT2_GLOBAL(0x141E9D8, sint16) = height; + RCT2_GLOBAL(0x141E9DA, uint8) = 32; + } +} + +/* rct2: 0x0076718D */ +void top_spin_paint_tile_rot_0_tile_4(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); + sub_6629BC(height, 0, image_id, direction & 1); + + image_id = 22137 | RCT2_GLOBAL(0x00F44198, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height; + sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); + uint16 entranceLoc = + ((x / 32) + loc_7667AE[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].x) | + (((y / 32) + loc_7667AE[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].y) << 8); + + uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; + rct_ride* ride = GET_RIDE(rideIndex); + + if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { + + image_id = 22141 | RCT2_GLOBAL(0x00F441A0, uint32); + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 2; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 7 << 8, image_id, 0, height, 1, 32, 0); + } + + RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9B8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9BC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9CC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D4, uint16) = 0xFFFF; + + height += 110; + if (RCT2_GLOBAL(0x141E9D8, sint16) < height) { + RCT2_GLOBAL(0x141E9D8, sint16) = height; + RCT2_GLOBAL(0x141E9DA, uint8) = 32; + } +} + +/* rct2: 0x00766B4C */ +void top_spin_paint_tile_rot_0_tile_3(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); + sub_6629BC(height, 0, image_id, direction & 1); + + image_id = 22136 | RCT2_GLOBAL(0x00F44198, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height; + sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); + uint16 entranceLoc = + ((x / 32) + loc_7667AC[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].x) | + (((y / 32) + loc_7667AC[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].y) << 8); + + uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; + rct_ride* ride = GET_RIDE(rideIndex); + + if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { + + image_id = 22138 | RCT2_GLOBAL(0x00F441A0, uint32); + RCT2_GLOBAL(0x009DEA52, uint16) = 2; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 7 << 8, image_id, 0, height, 32, 1, 0); + } + + image_id = 22139 | RCT2_GLOBAL(0x00F441A0, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 30; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + sub_98197C(0, 7, image_id, 0, height, 1, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + top_spin_paint_vehicle(32, -32, rideIndex, direction, height, mapElement); + + RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9B8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9BC, uint16) = height + 2; + RCT2_GLOBAL(0x141E9BE, uint16) = 32; + RCT2_GLOBAL(0x141E9C0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9CC, uint16) = height + 2; + RCT2_GLOBAL(0x141E9CE, uint16) = 32; + RCT2_GLOBAL(0x141E9D0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D4, uint16) = height + 2; + RCT2_GLOBAL(0x141E9D6, uint16) = 32; + + height += 110; + if (RCT2_GLOBAL(0x141E9D8, sint16) < height) { + RCT2_GLOBAL(0x141E9D8, sint16) = height; + RCT2_GLOBAL(0x141E9DA, uint8) = 32; + } +} + +/* rct2: 0x007672E7 */ +void top_spin_paint_tile_rot_0_tile_5(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); + sub_6629BC(height, 0, image_id, direction & 1); + + image_id = 22136 | RCT2_GLOBAL(0x00F44198, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height; + sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + image_id = 22139 | RCT2_GLOBAL(0x00F441A0, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 30; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + sub_98197C(0, 7, image_id, 0, height, 1, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + top_spin_paint_vehicle(0, -32, rideIndex, direction, height, mapElement); + + RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9B8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9BC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9CC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D4, uint16) = 0xFFFF; + + height += 112; + if (RCT2_GLOBAL(0x141E9D8, sint16) < height) { + RCT2_GLOBAL(0x141E9D8, sint16) = height; + RCT2_GLOBAL(0x141E9DA, uint8) = 32; + } +} + +/* rct2: 0x00766D09 */ +void top_spin_paint_tile_rot_0_tile_6(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); + sub_6629BC(height, 0, image_id, direction & 1); + + image_id = 22135 | RCT2_GLOBAL(0x00F44198, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height; + sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); + uint16 entranceLoc = + ((x / 32) + loc_7667AE[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].x) | + (((y / 32) + loc_7667AE[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].y) << 8); + + uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; + rct_ride* ride = GET_RIDE(rideIndex); + + if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { + + image_id = 22141 | RCT2_GLOBAL(0x00F441A0, uint32); + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 2; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 7 << 8, image_id, 0, height, 1, 32, 0); + } + + image_id = 22140 | RCT2_GLOBAL(0x00F441A0, uint32); + RCT2_GLOBAL(0x009DEA52, uint16) = 30; + RCT2_GLOBAL(0x009DEA54, uint16) = 2; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + + sub_98197C(0,7 , image_id, 0, height, 32, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + top_spin_paint_vehicle(-32, 32, rideIndex, direction, height, mapElement); + + RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9B8, uint16) = height + 2; + RCT2_GLOBAL(0x141E9BA, uint16) = 32; + RCT2_GLOBAL(0x141E9BC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C8, uint16) = height + 2; + RCT2_GLOBAL(0x141E9CA, uint16) = 32; + RCT2_GLOBAL(0x141E9CC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D0, uint16) = height + 2; + RCT2_GLOBAL(0x141E9D0, uint16) = 32; + RCT2_GLOBAL(0x141E9D4, uint16) = 0xFFFF; + + height += 110; + if (RCT2_GLOBAL(0x141E9D8, sint16) < height) { + RCT2_GLOBAL(0x141E9D8, sint16) = height; + RCT2_GLOBAL(0x141E9DA, uint8) = 32; + } +} + +/* rct2: 0x00766EC6 */ +void top_spin_paint_tile_rot_0_tile_7(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); + sub_6629BC(height, 0, image_id, direction & 1); + + image_id = 22134 | RCT2_GLOBAL(0x00F44198, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height; + sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + image_id = 22140 | RCT2_GLOBAL(0x00F441A0, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 29; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 3; + sub_98197C(0, 7, image_id, 0, height, 28, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + image_id = 22139 | RCT2_GLOBAL(0x00F441A0, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 29; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 3; + sub_98197C(0, 7, image_id, 0, height, 1, 28, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + top_spin_paint_vehicle(-32, -32, rideIndex, direction, height, mapElement); + + RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9B8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9BC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C0, uint16) = height + 2; + RCT2_GLOBAL(0x141E9C2, uint16) = 32; + RCT2_GLOBAL(0x141E9C4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9CC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D0, uint16) = height + 2; + RCT2_GLOBAL(0x141E9D2, uint16) = 32; + RCT2_GLOBAL(0x141E9D4, uint16) = height + 2; + RCT2_GLOBAL(0x141E9D6, uint16) = 32; + + height += 110; + if (RCT2_GLOBAL(0x141E9D8, sint16) < height) { + RCT2_GLOBAL(0x141E9D8, sint16) = height; + RCT2_GLOBAL(0x141E9DA, uint8) = 32; + } +} + +/* rct2: 0x007673FA */ +void top_spin_paint_tile_rot_0_tile_8(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); + sub_6629BC(height, 0, image_id, direction & 1); + + image_id = 22135 | RCT2_GLOBAL(0x00F44198, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height; + sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + image_id = 22140 | RCT2_GLOBAL(0x00F441A0, uint32); + RCT2_GLOBAL(0x009DEA52, uint16) = 30; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + + sub_98197C(0, 7, image_id, 0, height, 32, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + + top_spin_paint_vehicle(-32, 0, rideIndex, direction, height, mapElement); + + RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9B8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9BC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C4, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9C8, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9CC, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D0, uint16) = 0xFFFF; + RCT2_GLOBAL(0x141E9D4, uint16) = 0xFFFF; + + height += 112; + if (RCT2_GLOBAL(0x141E9D8, sint16) < height) { + RCT2_GLOBAL(0x141E9D8, sint16) = height; + RCT2_GLOBAL(0x141E9DA, uint8) = 32; + } +} /* rct2: 0x007667BC */ void top_spin_paint_setup_rot_0(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + switch (trackSequence) + { + case 0: + top_spin_paint_tile_0(rideIndex, trackSequence, direction, height, mapElement); + break; + case 1: + top_spin_paint_tile_rot_0_tile_1(rideIndex, trackSequence, direction, height, mapElement); + break; + case 2: + top_spin_paint_tile_rot_0_tile_2(rideIndex, trackSequence, direction, height, mapElement); + break; + case 3: + top_spin_paint_tile_rot_0_tile_3(rideIndex, trackSequence, direction, height, mapElement); + break; + case 4: + top_spin_paint_tile_rot_0_tile_4(rideIndex, trackSequence, direction, height, mapElement); + break; + case 5: + top_spin_paint_tile_rot_0_tile_5(rideIndex, trackSequence, direction, height, mapElement); + break; + case 6: + top_spin_paint_tile_rot_0_tile_6(rideIndex, trackSequence, direction, height, mapElement); + break; + case 7: + top_spin_paint_tile_rot_0_tile_7(rideIndex, trackSequence, direction, height, mapElement); + break; + case 8: + top_spin_paint_tile_rot_0_tile_8(rideIndex, trackSequence, direction, height, mapElement); + break; + } return; - RCT2_CALLPROC_X(0x007667BC, 0, 0, 0, 0, 0, 0, 0); } /* rct2: 0x007667EC */ void top_spin_paint_setup_rot_1(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + switch (trackSequence) + { + case 0: + top_spin_paint_tile_0(rideIndex, trackSequence, direction, height, mapElement); + break; + } return; RCT2_CALLPROC_X(0x007667EC, 0, 0, 0, 0, 0, 0, 0); } @@ -200,6 +925,12 @@ void top_spin_paint_setup_rot_1(uint8 rideIndex, uint8 trackSequence, uint8 dire /* rct2: 0x0076671C */ void top_spin_paint_setup_rot_2(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + switch (trackSequence) + { + case 0: + top_spin_paint_tile_0(rideIndex, trackSequence, direction, height, mapElement); + break; + } return; RCT2_CALLPROC_X(0x0076671C, 0, 0, 0, 0, 0, 0, 0); } @@ -207,6 +938,12 @@ void top_spin_paint_setup_rot_2(uint8 rideIndex, uint8 trackSequence, uint8 dire /* rct2: 0x0076674C */ void top_spin_paint_setup_rot_3(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + switch (trackSequence) + { + case 0: + top_spin_paint_tile_0(rideIndex, trackSequence, direction, height, mapElement); + break; + } return; RCT2_CALLPROC_X(0x0076674C, 0, 0, 0, 0, 0, 0, 0); } \ No newline at end of file From e7c653abf28e2e4c7b01c41f19fdd8447ec55e53 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 25 Oct 2015 22:58:06 +0000 Subject: [PATCH 0910/1173] Refactor attached ps setup code --- src/interface/viewport.c | 28 ++++++++++++++-------- src/interface/viewport.h | 1 + src/ride/track_paint.c | 50 ++++++++++++++++++---------------------- 3 files changed, 41 insertions(+), 38 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index a589637619..9ebf407c62 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -721,6 +721,19 @@ void sub_688485(){ } +/* rct2: 0x006874B0, 0x00687618, 0x0068778C, 0x00687902, 0x0098199C */ +int sub_98199C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_x, sint16 length_y, uint32 rotation){ + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + al | (ah << 8), + image_id, + cl, + height, + length_x, + length_y, + rotation); + return 1; +} + /* rct2: 0x00686806, 0x006869B2, 0x00686B6F, 0x00686D31, 0x0098197C */ int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_x, sint16 length_y, uint32 rotation){ int ebp = ah + RCT2_GLOBAL(0x9DEA56, uint16); @@ -1134,8 +1147,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, uint16) = height; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - ah << 8, transparant_image_id, 0, height, 2, 0x1C, 0); + sub_98199C(0, ah, transparant_image_id, 0, height, 2, 0x1C, 0); } image_id += 4; @@ -1152,8 +1164,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma RCT2_GLOBAL(0x009DEA54, uint16) = 28; RCT2_GLOBAL(0x009DEA56, uint16) = height; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - ah << 8, transparant_image_id, 0, height, 2, 0x1C, 0); + sub_98199C(0, ah, transparant_image_id, 0, height, 2, 0x1C, 0); } uint32 eax = 0xFFFF0600 | ((height / 16) & 0xFF); @@ -1199,8 +1210,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma RCT2_GLOBAL(0x009DEA52, uint16) = 2; RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, uint16) = height + style->height; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x3300, scrolling_text_setup(string_id, scroll, style->scrolling_mode), 0, height + style->height, 0x1C, 0x1C, 0); + sub_98199C(0, 0x33, scrolling_text_setup(string_id, scroll, style->scrolling_mode), 0, height + style->height, 0x1C, 0x1C, 0); } image_id = RCT2_GLOBAL(0x009E32BC, uint32); @@ -1306,8 +1316,7 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, sint16) = height + entrance->text_height; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x2F00, scrolling_text_setup(park_text_id, scroll, entrance->scrolling_mode + direction / 2), 0, height + entrance->text_height, 0x1C, 0x1C, 0); + sub_98199C(0, 0x2F, scrolling_text_setup(park_text_id, scroll, entrance->scrolling_mode + direction / 2), 0, height + entrance->text_height, 0x1C, 0x1C, 0); break; case 1: case 2: @@ -1548,8 +1557,7 @@ void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* m uint16 string_width = gfx_get_string_width(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char)); uint16 scroll = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) / 2) % string_width; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x1500, scrolling_text_setup(string_id, scroll, scrollingMode), 0, height + 22, 1, 1, 0); + sub_98199C(0, 0x15, scrolling_text_setup(string_id, scroll, scrollingMode), 0, height + 22, 1, 1, 0); } /** diff --git a/src/interface/viewport.h b/src/interface/viewport.h index bdf47b590a..d13305eb17 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -132,6 +132,7 @@ void sub_688485(); void sub_688217(); int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_x, sint16 length_y, uint32 rotation); +int sub_98199C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_x, sint16 length_y, uint32 rotation); int 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/ride/track_paint.c b/src/ride/track_paint.c index 6d52b82dbd..912668fd2c 100644 --- a/src/ride/track_paint.c +++ b/src/ride/track_paint.c @@ -296,8 +296,9 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction // Left hand arm image_id += 380; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - al | (90 << 8), + sub_98199C( + al, + 90, image_id, cl, height, @@ -358,8 +359,9 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction RCT2_GLOBAL(0x014280B9, sint8) = (sint8)seatCoords.y; RCT2_GLOBAL(0x014280BA, sint16) = seatCoords.z; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - seatCoords.x | (90 << 8), + sub_98199C( + seatCoords.x, + 90, image_id, seatCoords.y, seatCoords.z, @@ -376,8 +378,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id += 0xA0000000; image_id += 76; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - seatCoords.x | (90 << 8), image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + sub_98199C(seatCoords.x, 90, image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); if (vehicle->num_peeps > 2) { image_id = @@ -387,8 +388,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id += 0xA0000000; image_id += 152; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - seatCoords.x | (90 << 8), image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + sub_98199C(seatCoords.x, 90, image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); } if (vehicle->num_peeps > 4) { @@ -399,8 +399,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id += 0xA0000000; image_id += 228; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - seatCoords.x | (90 << 8), image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + sub_98199C(seatCoords.x, 90, image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); } if (vehicle->num_peeps > 6) { @@ -411,8 +410,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id += 0xA0000000; image_id += 304; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - seatCoords.x | (90 << 8), image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + sub_98199C(seatCoords.x, 90, image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); } } @@ -430,8 +428,9 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction // Right hand arm image_id += 476; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - al | (90 << 8), + sub_98199C( + al, + 90, image_id, cl, height, @@ -452,8 +451,9 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction // Right back bottom support image_id += 573; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - al | (90 << 8), + sub_98199C( + al, + 90, image_id, cl, height, @@ -492,8 +492,7 @@ void top_spin_paint_tile_rot_0_tile_1(uint8 rideIndex, uint8 trackSequence, uint RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 7 << 8, image_id, 0, height, 1, 32, 0); + sub_98199C(0, 7, image_id, 0, height, 1, 32, 0); } entranceLoc = @@ -507,8 +506,7 @@ void top_spin_paint_tile_rot_0_tile_1(uint8 rideIndex, uint8 trackSequence, uint RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 7 << 8, image_id, 0, height, 32, 1, 0); + sub_98199C(0, 7, image_id, 0, height, 32, 1, 0); } top_spin_paint_vehicle(32, 32, rideIndex, direction, height, mapElement); @@ -560,8 +558,7 @@ void top_spin_paint_tile_rot_0_tile_2(uint8 rideIndex, uint8 trackSequence, uint RCT2_GLOBAL(0x009DEA54, uint16) = 0; RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 7 << 8, image_id, 0, height, 32, 1, 0); + sub_98199C(0, 7, image_id, 0, height, 32, 1, 0); } RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; @@ -608,8 +605,7 @@ void top_spin_paint_tile_rot_0_tile_4(uint8 rideIndex, uint8 trackSequence, uint RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 7 << 8, image_id, 0, height, 1, 32, 0); + sub_98199C(0, 7, image_id, 0, height, 1, 32, 0); } RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; @@ -656,8 +652,7 @@ void top_spin_paint_tile_rot_0_tile_3(uint8 rideIndex, uint8 trackSequence, uint RCT2_GLOBAL(0x009DEA54, uint16) = 0; RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 7 << 8, image_id, 0, height, 32, 1, 0); + sub_98199C(0, 7, image_id, 0, height, 32, 1, 0); } image_id = 22139 | RCT2_GLOBAL(0x00F441A0, uint32); @@ -754,8 +749,7 @@ void top_spin_paint_tile_rot_0_tile_6(uint8 rideIndex, uint8 trackSequence, uint RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 7 << 8, image_id, 0, height, 1, 32, 0); + sub_98199C(0, 7, image_id, 0, height, 1, 32, 0); } image_id = 22140 | RCT2_GLOBAL(0x00F441A0, uint32); From d9b7c1fafd6a5bab43a41550084b22324c9eed61 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Wed, 28 Oct 2015 19:02:32 +0000 Subject: [PATCH 0911/1173] Implement remaining rotations --- src/ride/track_paint.c | 123 ++++++++++++++++++++++++++++++++--------- 1 file changed, 96 insertions(+), 27 deletions(-) diff --git a/src/ride/track_paint.c b/src/ride/track_paint.c index 912668fd2c..54b1d6d9cf 100644 --- a/src/ride/track_paint.c +++ b/src/ride/track_paint.c @@ -360,10 +360,10 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction RCT2_GLOBAL(0x014280BA, sint16) = seatCoords.z; sub_98199C( - seatCoords.x, + (sint8)seatCoords.x, 90, image_id, - seatCoords.y, + (sint8)seatCoords.y, seatCoords.z, lengthX, lengthY, @@ -378,7 +378,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id += 0xA0000000; image_id += 76; - sub_98199C(seatCoords.x, 90, image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + sub_98199C((sint8)seatCoords.x, 90, image_id, (sint8)seatCoords.y, seatCoords.z, lengthX, lengthY, 0); if (vehicle->num_peeps > 2) { image_id = @@ -388,7 +388,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id += 0xA0000000; image_id += 152; - sub_98199C(seatCoords.x, 90, image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + sub_98199C((sint8)seatCoords.x, 90, image_id, (sint8)seatCoords.y, seatCoords.z, lengthX, lengthY, 0); } if (vehicle->num_peeps > 4) { @@ -399,7 +399,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id += 0xA0000000; image_id += 228; - sub_98199C(seatCoords.x, 90, image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + sub_98199C((sint8)seatCoords.x, 90, image_id, (sint8)seatCoords.y, seatCoords.z, lengthX, lengthY, 0); } if (vehicle->num_peeps > 6) { @@ -410,7 +410,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id += 0xA0000000; image_id += 304; - sub_98199C(seatCoords.x, 90, image_id, seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + sub_98199C((sint8)seatCoords.x, 90, image_id, (sint8)seatCoords.y, seatCoords.z, lengthX, lengthY, 0); } } @@ -466,7 +466,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction } /* rct2: 0x0076693F */ -void top_spin_paint_tile_rot_0_tile_1(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { +void top_spin_paint_tile_1(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); sub_6629BC(height, 0, image_id, direction & 1); @@ -532,7 +532,7 @@ void top_spin_paint_tile_rot_0_tile_1(uint8 rideIndex, uint8 trackSequence, uint } /* rct2: 0x00767033 */ -void top_spin_paint_tile_rot_0_tile_2(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { +void top_spin_paint_tile_2(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); sub_6629BC(height, 0, image_id, direction & 1); @@ -579,7 +579,7 @@ void top_spin_paint_tile_rot_0_tile_2(uint8 rideIndex, uint8 trackSequence, uint } /* rct2: 0x0076718D */ -void top_spin_paint_tile_rot_0_tile_4(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { +void top_spin_paint_tile_4(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); sub_6629BC(height, 0, image_id, direction & 1); @@ -626,7 +626,7 @@ void top_spin_paint_tile_rot_0_tile_4(uint8 rideIndex, uint8 trackSequence, uint } /* rct2: 0x00766B4C */ -void top_spin_paint_tile_rot_0_tile_3(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { +void top_spin_paint_tile_3(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); sub_6629BC(height, 0, image_id, direction & 1); @@ -685,7 +685,7 @@ void top_spin_paint_tile_rot_0_tile_3(uint8 rideIndex, uint8 trackSequence, uint } /* rct2: 0x007672E7 */ -void top_spin_paint_tile_rot_0_tile_5(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { +void top_spin_paint_tile_5(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); sub_6629BC(height, 0, image_id, direction & 1); @@ -723,7 +723,7 @@ void top_spin_paint_tile_rot_0_tile_5(uint8 rideIndex, uint8 trackSequence, uint } /* rct2: 0x00766D09 */ -void top_spin_paint_tile_rot_0_tile_6(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { +void top_spin_paint_tile_6(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); sub_6629BC(height, 0, image_id, direction & 1); @@ -782,7 +782,7 @@ void top_spin_paint_tile_rot_0_tile_6(uint8 rideIndex, uint8 trackSequence, uint } /* rct2: 0x00766EC6 */ -void top_spin_paint_tile_rot_0_tile_7(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { +void top_spin_paint_tile_7(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); sub_6629BC(height, 0, image_id, direction & 1); @@ -830,7 +830,7 @@ void top_spin_paint_tile_rot_0_tile_7(uint8 rideIndex, uint8 trackSequence, uint } /* rct2: 0x007673FA */ -void top_spin_paint_tile_rot_0_tile_8(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { +void top_spin_paint_tile_8(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); sub_6629BC(height, 0, image_id, direction & 1); @@ -876,28 +876,28 @@ void top_spin_paint_setup_rot_0(uint8 rideIndex, uint8 trackSequence, uint8 dire top_spin_paint_tile_0(rideIndex, trackSequence, direction, height, mapElement); break; case 1: - top_spin_paint_tile_rot_0_tile_1(rideIndex, trackSequence, direction, height, mapElement); + top_spin_paint_tile_1(rideIndex, trackSequence, direction, height, mapElement); break; case 2: - top_spin_paint_tile_rot_0_tile_2(rideIndex, trackSequence, direction, height, mapElement); + top_spin_paint_tile_2(rideIndex, trackSequence, direction, height, mapElement); break; case 3: - top_spin_paint_tile_rot_0_tile_3(rideIndex, trackSequence, direction, height, mapElement); + top_spin_paint_tile_3(rideIndex, trackSequence, direction, height, mapElement); break; case 4: - top_spin_paint_tile_rot_0_tile_4(rideIndex, trackSequence, direction, height, mapElement); + top_spin_paint_tile_4(rideIndex, trackSequence, direction, height, mapElement); break; case 5: - top_spin_paint_tile_rot_0_tile_5(rideIndex, trackSequence, direction, height, mapElement); + top_spin_paint_tile_5(rideIndex, trackSequence, direction, height, mapElement); break; case 6: - top_spin_paint_tile_rot_0_tile_6(rideIndex, trackSequence, direction, height, mapElement); + top_spin_paint_tile_6(rideIndex, trackSequence, direction, height, mapElement); break; case 7: - top_spin_paint_tile_rot_0_tile_7(rideIndex, trackSequence, direction, height, mapElement); + top_spin_paint_tile_7(rideIndex, trackSequence, direction, height, mapElement); break; case 8: - top_spin_paint_tile_rot_0_tile_8(rideIndex, trackSequence, direction, height, mapElement); + top_spin_paint_tile_8(rideIndex, trackSequence, direction, height, mapElement); break; } return; @@ -911,12 +911,35 @@ void top_spin_paint_setup_rot_1(uint8 rideIndex, uint8 trackSequence, uint8 dire case 0: top_spin_paint_tile_0(rideIndex, trackSequence, direction, height, mapElement); break; + case 1: + top_spin_paint_tile_3(rideIndex, trackSequence, direction, height, mapElement); + break; + case 2: + top_spin_paint_tile_5(rideIndex, trackSequence, direction, height, mapElement); + break; + case 3: + top_spin_paint_tile_7(rideIndex, trackSequence, direction, height, mapElement); + break; + case 4: + top_spin_paint_tile_2(rideIndex, trackSequence, direction, height, mapElement); + break; + case 5: + top_spin_paint_tile_8(rideIndex, trackSequence, direction, height, mapElement); + break; + case 6: + top_spin_paint_tile_1(rideIndex, trackSequence, direction, height, mapElement); + break; + case 7: + top_spin_paint_tile_6(rideIndex, trackSequence, direction, height, mapElement); + break; + case 8: + top_spin_paint_tile_4(rideIndex, trackSequence, direction, height, mapElement); + break; } return; - RCT2_CALLPROC_X(0x007667EC, 0, 0, 0, 0, 0, 0, 0); } -/* rct2: 0x0076671C +/* rct2: 0x0076681C */ void top_spin_paint_setup_rot_2(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { switch (trackSequence) @@ -924,12 +947,35 @@ void top_spin_paint_setup_rot_2(uint8 rideIndex, uint8 trackSequence, uint8 dire case 0: top_spin_paint_tile_0(rideIndex, trackSequence, direction, height, mapElement); break; + case 1: + top_spin_paint_tile_7(rideIndex, trackSequence, direction, height, mapElement); + break; + case 2: + top_spin_paint_tile_8(rideIndex, trackSequence, direction, height, mapElement); + break; + case 3: + top_spin_paint_tile_6(rideIndex, trackSequence, direction, height, mapElement); + break; + case 4: + top_spin_paint_tile_5(rideIndex, trackSequence, direction, height, mapElement); + break; + case 5: + top_spin_paint_tile_4(rideIndex, trackSequence, direction, height, mapElement); + break; + case 6: + top_spin_paint_tile_3(rideIndex, trackSequence, direction, height, mapElement); + break; + case 7: + top_spin_paint_tile_1(rideIndex, trackSequence, direction, height, mapElement); + break; + case 8: + top_spin_paint_tile_2(rideIndex, trackSequence, direction, height, mapElement); + break; } return; - RCT2_CALLPROC_X(0x0076671C, 0, 0, 0, 0, 0, 0, 0); } -/* rct2: 0x0076674C +/* rct2: 0x0076684C */ void top_spin_paint_setup_rot_3(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { switch (trackSequence) @@ -937,7 +983,30 @@ void top_spin_paint_setup_rot_3(uint8 rideIndex, uint8 trackSequence, uint8 dire case 0: top_spin_paint_tile_0(rideIndex, trackSequence, direction, height, mapElement); break; + case 1: + top_spin_paint_tile_6(rideIndex, trackSequence, direction, height, mapElement); + break; + case 2: + top_spin_paint_tile_4(rideIndex, trackSequence, direction, height, mapElement); + break; + case 3: + top_spin_paint_tile_1(rideIndex, trackSequence, direction, height, mapElement); + break; + case 4: + top_spin_paint_tile_8(rideIndex, trackSequence, direction, height, mapElement); + break; + case 5: + top_spin_paint_tile_2(rideIndex, trackSequence, direction, height, mapElement); + break; + case 6: + top_spin_paint_tile_7(rideIndex, trackSequence, direction, height, mapElement); + break; + case 7: + top_spin_paint_tile_3(rideIndex, trackSequence, direction, height, mapElement); + break; + case 8: + top_spin_paint_tile_5(rideIndex, trackSequence, direction, height, mapElement); + break; } return; - RCT2_CALLPROC_X(0x0076674C, 0, 0, 0, 0, 0, 0, 0); } \ No newline at end of file From 930bdc16693b17362afe4ba27269f2516fa8c3b3 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Wed, 28 Oct 2015 19:57:02 +0000 Subject: [PATCH 0912/1173] Make suggested changes. Invis huts now correctly remove fence --- src/interface/viewport.c | 8 +- src/ride/track_paint.c | 375 ++++++++++++++++++++++----------------- src/ride/track_paint.h | 4 +- 3 files changed, 216 insertions(+), 171 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 9ebf407c62..9de5abdec6 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1419,10 +1419,12 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma RCT2_GLOBAL(0x00F441A4, uint32) = ghost_id; } - TRACK_PAINT_FUNCTION ***trackTypeList = (TRACK_PAINT_FUNCTION***)RideTypeTrackPaintFunctionsOld[ride->type]; + TRACK_PAINT_FUNCTION **trackTypeList = (TRACK_PAINT_FUNCTION**)RideTypeTrackPaintFunctionsOld[ride->type]; if (trackTypeList == NULL) { - trackTypeList = (TRACK_PAINT_FUNCTION***)RideTypeTrackPaintFunctions[ride->type]; - trackTypeList[trackType][direction](rideIndex, trackSequence, direction, height, mapElement); + trackTypeList = (TRACK_PAINT_FUNCTION**)RideTypeTrackPaintFunctions[ride->type]; + + if (trackTypeList[trackType] != NULL) + trackTypeList[trackType][direction](rideIndex, trackSequence, direction, height, mapElement); } else { uint32 *trackDirectionList = (uint32*)trackTypeList[trackType]; diff --git a/src/ride/track_paint.c b/src/ride/track_paint.c index 54b1d6d9cf..c923988399 100644 --- a/src/ride/track_paint.c +++ b/src/ride/track_paint.c @@ -32,152 +32,143 @@ #include "../interface/window.h" #include "track_paint.h" -void dummy_paint_setup_function(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) {} - -TRACK_PAINT_FUNCTION* dummy_rotation[] = { - dummy_paint_setup_function, - dummy_paint_setup_function, - dummy_paint_setup_function, - dummy_paint_setup_function, -}; - void top_spin_paint_setup_rot_0(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement); void top_spin_paint_setup_rot_1(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement); void top_spin_paint_setup_rot_2(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement); void top_spin_paint_setup_rot_3(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement); /* 0x0076679C */ -TRACK_PAINT_FUNCTION* top_spin_base_functions[] = { +TRACK_PAINT_FUNCTION top_spin_base_functions[] = { top_spin_paint_setup_rot_0, top_spin_paint_setup_rot_1, top_spin_paint_setup_rot_2, top_spin_paint_setup_rot_3, }; -TRACK_PAINT_FUNCTION** top_spin_track_paint_functions[] = { - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, - dummy_rotation, +TRACK_PAINT_FUNCTION* top_spin_track_paint_functions[] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, top_spin_base_functions // 123 }; @@ -655,12 +646,19 @@ void top_spin_paint_tile_3(uint8 rideIndex, uint8 trackSequence, uint8 direction sub_98199C(0, 7, image_id, 0, height, 32, 1, 0); } - image_id = 22139 | RCT2_GLOBAL(0x00F441A0, uint32); + entranceLoc = + ((x / 32) + loc_7667AC[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 3) & 3].x) | + (((y / 32) + loc_7667AC[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 3) & 3].y) << 8); - RCT2_GLOBAL(0x009DEA52, uint16) = 0; - RCT2_GLOBAL(0x009DEA54, uint16) = 30; - RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; - sub_98197C(0, 7, image_id, 0, height, 1, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { + + image_id = 22139 | RCT2_GLOBAL(0x00F441A0, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 30; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + sub_98197C(0, 7, image_id, 0, height, 1, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + } top_spin_paint_vehicle(32, -32, rideIndex, direction, height, mapElement); @@ -696,12 +694,22 @@ void top_spin_paint_tile_5(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA56, uint16) = height; sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); - image_id = 22139 | RCT2_GLOBAL(0x00F441A0, uint32); + sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); + uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; + rct_ride* ride = GET_RIDE(rideIndex); - RCT2_GLOBAL(0x009DEA52, uint16) = 0; - RCT2_GLOBAL(0x009DEA54, uint16) = 30; - RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; - sub_98197C(0, 7, image_id, 0, height, 1, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + uint16 entranceLoc = + ((x / 32) + loc_7667AC[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 3) & 3].x) | + (((y / 32) + loc_7667AC[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 3) & 3].y) << 8); + + if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { + image_id = 22139 | RCT2_GLOBAL(0x00F441A0, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 30; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + sub_98197C(0, 7, image_id, 0, height, 1, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + } top_spin_paint_vehicle(0, -32, rideIndex, direction, height, mapElement); @@ -752,13 +760,20 @@ void top_spin_paint_tile_6(uint8 rideIndex, uint8 trackSequence, uint8 direction sub_98199C(0, 7, image_id, 0, height, 1, 32, 0); } - image_id = 22140 | RCT2_GLOBAL(0x00F441A0, uint32); - RCT2_GLOBAL(0x009DEA52, uint16) = 30; - RCT2_GLOBAL(0x009DEA54, uint16) = 2; - RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + entranceLoc = + ((x / 32) + loc_7667AE[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 1) & 3].x) | + (((y / 32) + loc_7667AE[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 1) & 3].y) << 8); + + if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { + + image_id = 22140 | RCT2_GLOBAL(0x00F441A0, uint32); + RCT2_GLOBAL(0x009DEA52, uint16) = 30; + RCT2_GLOBAL(0x009DEA54, uint16) = 2; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + + sub_98197C(0, 7, image_id, 0, height, 32, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + } - sub_98197C(0,7 , image_id, 0, height, 32, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); - top_spin_paint_vehicle(-32, 32, rideIndex, direction, height, mapElement); RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; @@ -793,19 +808,37 @@ void top_spin_paint_tile_7(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA56, uint16) = height; sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); - image_id = 22140 | RCT2_GLOBAL(0x00F441A0, uint32); + sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); + uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; + rct_ride* ride = GET_RIDE(rideIndex); - RCT2_GLOBAL(0x009DEA52, uint16) = 29; - RCT2_GLOBAL(0x009DEA54, uint16) = 0; - RCT2_GLOBAL(0x009DEA56, uint16) = height + 3; - sub_98197C(0, 7, image_id, 0, height, 28, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); - - image_id = 22139 | RCT2_GLOBAL(0x00F441A0, uint32); + uint16 entranceLoc = + ((x / 32) + loc_7667AE[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 1) & 3].x) | + (((y / 32) + loc_7667AE[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 1) & 3].y) << 8); - RCT2_GLOBAL(0x009DEA52, uint16) = 0; - RCT2_GLOBAL(0x009DEA54, uint16) = 29; - RCT2_GLOBAL(0x009DEA56, uint16) = height + 3; - sub_98197C(0, 7, image_id, 0, height, 1, 28, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { + + image_id = 22140 | RCT2_GLOBAL(0x00F441A0, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 29; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 3; + sub_98197C(0, 7, image_id, 0, height, 28, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + } + + entranceLoc = + ((x / 32) + loc_7667AC[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 3) & 3].x) | + (((y / 32) + loc_7667AC[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 3) & 3].y) << 8); + + if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { + + image_id = 22139 | RCT2_GLOBAL(0x00F441A0, uint32); + + RCT2_GLOBAL(0x009DEA52, uint16) = 0; + RCT2_GLOBAL(0x009DEA54, uint16) = 29; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 3; + sub_98197C(0, 7, image_id, 0, height, 1, 28, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + } top_spin_paint_vehicle(-32, -32, rideIndex, direction, height, mapElement); @@ -841,13 +874,23 @@ void top_spin_paint_tile_8(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA56, uint16) = height; sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); - image_id = 22140 | RCT2_GLOBAL(0x00F441A0, uint32); - RCT2_GLOBAL(0x009DEA52, uint16) = 30; - RCT2_GLOBAL(0x009DEA54, uint16) = 0; - RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); + uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; + rct_ride* ride = GET_RIDE(rideIndex); - sub_98197C(0, 7, image_id, 0, height, 32, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + uint16 entranceLoc = + ((x / 32) + loc_7667AE[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 1) & 3].x) | + (((y / 32) + loc_7667AE[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 1) & 3].y) << 8); + if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { + + image_id = 22140 | RCT2_GLOBAL(0x00F441A0, uint32); + RCT2_GLOBAL(0x009DEA52, uint16) = 30; + RCT2_GLOBAL(0x009DEA54, uint16) = 0; + RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; + + sub_98197C(0, 7, image_id, 0, height, 32, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + } top_spin_paint_vehicle(-32, 0, rideIndex, direction, height, mapElement); RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; diff --git a/src/ride/track_paint.h b/src/ride/track_paint.h index 28084a1f5d..f020078c8a 100644 --- a/src/ride/track_paint.h +++ b/src/ride/track_paint.h @@ -3,8 +3,8 @@ #include "../common.h" -typedef void (TRACK_PAINT_FUNCTION)(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement); +typedef void (*TRACK_PAINT_FUNCTION)(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement); -extern TRACK_PAINT_FUNCTION** top_spin_track_paint_functions[]; +extern TRACK_PAINT_FUNCTION* top_spin_track_paint_functions[]; #endif \ No newline at end of file From 0b66558852e1c9c1065a61b19a1f6424569aca04 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 29 Oct 2015 04:00:17 +0000 Subject: [PATCH 0913/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/german.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/language/german.txt b/data/language/german.txt index 91d718128d..76fffd1484 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3891,6 +3891,9 @@ STR_5554 :{SMALLFONT}{BLACK}Gebirgswerkzeug aktivieren STR_5555 :Fahrzeuge anderer Streckentyp. anzeigen STR_5556 :Spieler entfernen STR_5557 :Nach Desync. verbunden bleiben (Mehrspieler) +STR_5558 :Damit diese Einstellung wirksam wird, ist ein Neustart erforderlich +STR_5559 :10 Min. Inspektionen +STR_5560 :{SMALLFONT}{BLACK}Setzt die Inspektionszeit aller Bahnen{NEWLINE}auf 'Alle 10 Minuten' ####################### # Bahnen/Attraktionen # From 115c099e2a85b0675b44d51d2e1442e1c45eab6b Mon Sep 17 00:00:00 2001 From: kmdreko Date: Wed, 28 Oct 2015 00:45:10 -0500 Subject: [PATCH 0914/1173] Decompiled sub_6E7FF3 --- src/interface/viewport.c | 157 +++++++++++++++++++++++++++++++-------- 1 file changed, 125 insertions(+), 32 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 9de5abdec6..80e20f7ffa 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -270,40 +270,133 @@ void sub_689174(sint16* x, sint16* y, sint16 *z) *z = height; } -void sub_6E7FF3(rct_window *w, rct_viewport *viewport, int x, int y) +// ax = viewport->x +// bx = viewport->y; +// cx = viewport->width; +// dx = viewport->height; +// di = dx; +// si = dy; +void sub_683359(int x, int y, int width, int height, int dx, int dy) { - RCT2_CALLPROC_X(0x006E7FF3, 0, 0, 0, x, (int)viewport, (int)w, y); + RCT2_CALLPROC_X(0x00683359, x, y, width, height, dy, dx, 0); +} -// int zoom = 1 << viewport->zoom; -// if (w >= RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*)){ -// if (viewport != w->viewport){ -// if ((viewport->x + viewport->width > w->x) && -// (w->x + w->width > viewport->x) && -// (viewport->y + viewport->height > w->y) && -// (w->y + w->height > viewport->y)){ -// if (viewport->x < w->x){ -// rct_viewport viewport_bkup; -// memcpy(&viewport_bkup, viewport, sizeof(rct_viewport)); -// -// viewport->width = w->x - viewport->x; -// viewport->view_width = (w->x - viewport->x) * zoom; -// -// sub_6E7FF3(w, viewport, x, y); -// -// viewport->x += viewport->width; -// viewport->view_x += viewport->width*zoom; -// viewport->view_width = (viewport_bkup.width - viewport->width) * zoom; -// viewport->width = viewport_bkup.width - viewport->width; -// -// sub_6E7FF3(w, viewport, x, y); -// -// memcpy(viewport, &viewport_bkup, sizeof(rct_viewport)); -// return; -// }//x6E80C4 -// }//0x6E824a -// } // 0x6e824a -// }//x6e8255 -// +void sub_6E7FF3(rct_window *window, rct_viewport *viewport, int x, int y) +{ + // sub-divide by intersecting windows + if (window < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*)) + { + // skip current window and non-intersecting windows + if (viewport == window->viewport || + viewport->x + viewport->width <= window->x || + viewport->x >= window->x + window->width || + viewport->y + viewport->height <= window->y || + viewport->y >= window->y + window->height) + return sub_6E7FF3(window + 1, viewport, x, y); + + // save viewport + rct_viewport view_copy; + memcpy(&view_copy, viewport, sizeof(rct_viewport)); + + if (viewport->x < window->x) + { + viewport->width = window->x - viewport->x; + viewport->view_width = viewport->width << viewport->zoom; + sub_6E7FF3(window, viewport, x, y); + + viewport->x += viewport->width; + viewport->view_x += viewport->width << viewport->zoom; + viewport->width = view_copy.width - viewport->width; + viewport->view_width = viewport->width << viewport->zoom; + sub_6E7FF3(window, viewport, x, y); + } + else if (viewport->x + viewport->width > window->x + window->width) + { + viewport->width = window->x + window->width - viewport->x; + viewport->view_width = viewport->width << viewport->zoom; + sub_6E7FF3(window, viewport, x, y); + + viewport->x += viewport->width; + viewport->view_x += viewport->width << viewport->zoom; + viewport->width = view_copy.width - viewport->width; + viewport->view_width = viewport->width << viewport->zoom; + sub_6E7FF3(window, viewport, x, y); + } + else if (viewport->y < window->y) + { + viewport->height = window->y - viewport->y; + viewport->view_width = viewport->width << viewport->zoom; + sub_6E7FF3(window, viewport, x, y); + + viewport->y += viewport->height; + viewport->view_y += viewport->height << viewport->zoom; + viewport->height = view_copy.height - viewport->height; + viewport->view_width = viewport->width << viewport->zoom; + sub_6E7FF3(window, viewport, x, y); + } + else if (viewport->y + viewport->height > window->y + window->height) + { + viewport->height = window->y + window->height - viewport->y; + viewport->view_width = viewport->width << viewport->zoom; + sub_6E7FF3(window, viewport, x, y); + + viewport->y += viewport->height; + viewport->view_y += viewport->height << viewport->zoom; + viewport->height = view_copy.height - viewport->height; + viewport->view_width = viewport->width << viewport->zoom; + sub_6E7FF3(window, viewport, x, y); + } + + // restore viewport + memcpy(viewport, &view_copy, sizeof(rct_viewport)); + } + else + { + sint16 left = viewport->x; + sint16 right = viewport->x + viewport->width; + sint16 top = viewport->y; + sint16 bottom = viewport->y + viewport->height; + + // if moved more than the viewport size + if (abs(x) < viewport->width && abs(y) < viewport->height) + { + // update whole block ? + sub_683359(viewport->x, viewport->y, viewport->width, viewport->height, x, y); + + if (x > 0) + { + // draw left + sint16 _right = viewport->x + x; + gfx_redraw_screen_rect(left, top, _right, bottom); + left += x; + } + else if (x < 0) + { + // draw right + sint16 _left = viewport->x + viewport->width + x; + gfx_redraw_screen_rect(_left, top, right, bottom); + right += x; + } + + if (y > 0) + { + // draw top + bottom = viewport->y + y; + gfx_redraw_screen_rect(left, top, right, bottom); + } + else if (y < 0) + { + // draw bottom + top = viewport->y + viewport->height + y; + gfx_redraw_screen_rect(left, top, right, bottom); + } + } + else + { + // redraw whole viewport + gfx_redraw_screen_rect(left, top, right, bottom); + } + } } void sub_6E7F34(rct_window* w, rct_viewport* viewport, sint16 x_diff, sint16 y_diff){ From 01793e11b79f7ca6f31bf5276598f3eda1acf855 Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Wed, 28 Oct 2015 11:44:08 +0100 Subject: [PATCH 0915/1173] Replace RCT2_GLOBAL magic numbers with address identifiers and string ids --- src/editor.c | 2 +- src/game.c | 6 +++--- src/input.c | 2 +- src/interface/graph.c | 2 +- src/interface/screenshot.c | 6 +++--- src/interface/viewport.c | 4 ++-- src/interface/window.c | 2 +- src/management/finance.c | 4 ++-- src/management/marketing.c | 4 ++-- src/management/news_item.c | 12 ++++++------ src/management/research.c | 4 ++-- src/rct1.c | 2 +- src/ride/ride.c | 8 ++++---- src/ride/ride.h | 2 +- src/ride/track.c | 18 +++++++++--------- src/scenario.c | 4 ++-- src/windows/cheats.c | 4 ++-- src/windows/editor_inventions_list.c | 2 +- src/windows/editor_objective_options.c | 2 +- src/windows/finances.c | 6 +++--- src/windows/game_bottom_toolbar.c | 14 +++++++------- src/windows/guest.c | 2 +- src/windows/guest_list.c | 12 ++++++------ src/windows/land.c | 2 +- src/windows/loadsave.c | 2 +- src/windows/map.c | 2 +- src/windows/new_campaign.c | 2 +- src/windows/new_ride.c | 4 ++-- src/windows/news.c | 4 ++-- src/windows/options.c | 6 +++--- src/windows/park.c | 20 ++++++++++---------- src/windows/research.c | 6 +++--- src/windows/ride.c | 16 ++++++++-------- src/windows/ride_construction.c | 6 +++--- src/windows/ride_list.c | 4 ++-- src/windows/scenery.c | 8 ++++---- src/windows/shortcut_keys.c | 2 +- src/windows/staff_list.c | 10 +++++----- src/windows/themes.c | 2 +- src/windows/title_editor.c | 2 +- src/windows/title_scenarioselect.c | 4 ++-- src/windows/track_list.c | 4 ++-- src/world/climate.c | 10 +++++----- src/world/climate.h | 2 +- src/world/map.c | 6 +++--- src/world/park.c | 2 +- 46 files changed, 125 insertions(+), 125 deletions(-) diff --git a/src/editor.c b/src/editor.c index 76756700b5..b13a79ab76 100644 --- a/src/editor.c +++ b/src/editor.c @@ -460,7 +460,7 @@ static int editor_read_s6(const char *path) MONEY(100,00) ); - RCT2_GLOBAL(0x013573DC, uint32) = min(RCT2_GLOBAL(0x013573DC, uint32), 100000); + RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, uint32) = min(RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, uint32), 100000); finance_reset_cash_to_initial(); finance_update_loan_hash(); diff --git a/src/game.c b/src/game.c index af57ec2ba1..8d9df819fe 100644 --- a/src/game.c +++ b/src/game.c @@ -902,9 +902,9 @@ void game_load_init() mainWindow->viewport_target_sprite = -1; mainWindow->saved_view_x = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_X, sint16); mainWindow->saved_view_y = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_Y, sint16); - uint8 _cl = (RCT2_GLOBAL(0x0138869E, sint16) & 0xFF) - mainWindow->viewport->zoom; - mainWindow->viewport->zoom = RCT2_GLOBAL(0x0138869E, sint16) & 0xFF; - *((char*)(&RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, sint32))) = RCT2_GLOBAL(0x0138869E, sint16) >> 8; + uint8 _cl = (RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, sint16) & 0xFF) - mainWindow->viewport->zoom; + mainWindow->viewport->zoom = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, sint16) & 0xFF; + *((char*)(&RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, sint32))) = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, sint16) >> 8; if (_cl != 0) { if (_cl < 0) { _cl = -_cl; diff --git a/src/input.c b/src/input.c index 65621f24c1..88fab3a384 100644 --- a/src/input.c +++ b/src/input.c @@ -1454,7 +1454,7 @@ static void sub_6EA2AA(rct_window *w, int widgetIndex, int x, int y, int edi) int numLines, fontHeight; gfx_wrap_string(buffer, width + 1, &numLines, &fontHeight); - RCT2_GLOBAL(0x01420044, uint16) = numLines; + RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TEXT_HEIGHT, uint16) = numLines; tooltipWindow->widgets[0].right = width + 3; tooltipWindow->widgets[0].bottom = ((numLines + 1) * 10) + 4; diff --git a/src/interface/graph.c b/src/interface/graph.c index 53bc2fffb5..7e1fc5cb31 100644 --- a/src/interface/graph.c +++ b/src/interface/graph.c @@ -35,7 +35,7 @@ static void graph_draw_months_uint8(rct_drawpixelinfo *dpi, uint8 *history, int for (i = count - 1; i >= 0; i--) { if (history[i] != 0 && history[i] != 255 && yearOver32 % 4 == 0) { // Draw month text - RCT2_GLOBAL(0x013CE952, uint32) = ((yearOver32 / 4) + 8) % 8 + STR_MONTH_SHORT_MAR; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = ((yearOver32 / 4) + 8) % 8 + STR_MONTH_SHORT_MAR; gfx_draw_string_centred(dpi, 2222, x, y - 10, 0, (void*)0x013CE952); // Draw month mark diff --git a/src/interface/screenshot.c b/src/interface/screenshot.c index 5f32a308d5..9ac0c16546 100644 --- a/src/interface/screenshot.c +++ b/src/interface/screenshot.c @@ -55,8 +55,8 @@ void screenshot_check() rct_string_id stringId = 3165; sprintf((char*)language_get_string(stringId), "SCR%d%s", screenshotIndex, _screenshot_format_extension[gConfigGeneral.screenshot_format]); - RCT2_GLOBAL(0x013CE952, uint16) = stringId; - // RCT2_GLOBAL(0x013CE952, uint16) = STR_SCR_BMP; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = stringId; + // RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_SCR_BMP; // RCT2_GLOBAL(0x013CE952 + 2, uint16) = screenshotIndex; RCT2_GLOBAL(0x009A8C29, uint8) |= 1; @@ -83,7 +83,7 @@ static int screenshot_get_next_path(char *path, int format) int i; for (i = 1; i < 1000; i++) { - RCT2_GLOBAL(0x013CE952, uint16) = i; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = i; // Glue together path and filename sprintf(path, "%sSCR%d%s", screenshotPath, i, _screenshot_format_extension[format]); diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 9de5abdec6..6b553866af 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1390,7 +1390,7 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma if (RCT2_ADDRESS(0x00999694, uint32)[trackType] & (1 << trackSequence)) { uint16 ax = RCT2_GLOBAL(0x0097D21A + (ride->type * 8), uint8); uint32 ebx = 0x20381689 + (height + 8) / 16; - ebx += RCT2_GLOBAL(0x009AACBD, uint16); + ebx += RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, uint16); ebx -= RCT2_GLOBAL(0x01359208, uint16); RCT2_GLOBAL(0x009DEA52, uint16) = 1000; RCT2_GLOBAL(0x009DEA54, uint16) = 1000; @@ -1411,7 +1411,7 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma RCT2_GLOBAL(0x00F441A4, uint32) = 0x21600000; } if (mapElement->flags & MAP_ELEMENT_FLAG_GHOST) { - uint32 ghost_id = RCT2_ADDRESS(0x00993CC4, uint32)[RCT2_GLOBAL(0x009AACBF, uint8)]; + uint32 ghost_id = RCT2_ADDRESS(0x00993CC4, uint32)[RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CONSTRUCTION_MARKER, uint8)]; RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = 0; RCT2_GLOBAL(0x00F44198, uint32) = ghost_id; RCT2_GLOBAL(0x00F4419C, uint32) = ghost_id; diff --git a/src/interface/window.c b/src/interface/window.c index 53a42eecfb..e40ca34f86 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -2425,7 +2425,7 @@ void textinput_cancel() #else log_warning("there should be something called here (0x0040701D)"); #endif // _WIN32 - if (RCT2_GLOBAL(0x009DEB8C, uint8) != 255) { + if (RCT2_GLOBAL(RCT2_ADDRESS_TEXTINPUT_WINDOWCLASS, uint8) != 255) { RCT2_CALLPROC_EBPSAFE(0x006EE4E2); w = window_find_by_number( RCT2_GLOBAL(RCT2_ADDRESS_TEXTINPUT_WINDOWCLASS, rct_windowclass), diff --git a/src/management/finance.c b/src/management/finance.c index 17b474b64f..d8231779d9 100644 --- a/src/management/finance.c +++ b/src/management/finance.c @@ -171,7 +171,7 @@ void finance_init() { RCT2_GLOBAL(0x01358334, money32) = 0; RCT2_GLOBAL(0x01358338, uint16) = 0; - RCT2_GLOBAL(0x013573DC, money32) = MONEY(10000,00); // Cheat detection + RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) = MONEY(10000,00); // Cheat detection RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint32) = ENCRYPT_MONEY(MONEY(10000,00)); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = MONEY(10000,00); @@ -317,7 +317,7 @@ void game_command_set_current_loan(int* eax, int* ebx, int* ecx, int* edx, int* finance_update_loan_hash(); window_invalidate_by_class(WC_FINANCES); - RCT2_GLOBAL(0x009A9804, uint16) |= 1; + RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint16) |= 1; } *ebx = 0; diff --git a/src/management/marketing.c b/src/management/marketing.c index 7a45392083..5eee2c627e 100644 --- a/src/management/marketing.c +++ b/src/management/marketing.c @@ -94,10 +94,10 @@ void marketing_update() // This sets the string parameters for the marketing types that have an argument. if (campaign == ADVERTISING_CAMPAIGN_RIDE_FREE || campaign == ADVERTISING_CAMPAIGN_RIDE) { rct_ride* ride = GET_RIDE(campaignItem); - RCT2_GLOBAL(0x013CE952, uint16) = ride->name; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = ride->name; RCT2_GLOBAL(0x013CE954, uint32) = ride->name_arguments; } else if (campaign == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) { - RCT2_GLOBAL(0x013CE952, uint16) = ShopItemStringIds[campaignItem].plural; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = ShopItemStringIds[campaignItem].plural; } news_item_add_to_queue(NEWS_ITEM_MONEY, STR_MARKETING_FINISHED_BASE + campaign, 0); diff --git a/src/management/news_item.c b/src/management/news_item.c index 7135785bf3..87e17cae15 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -122,18 +122,18 @@ void news_item_update_current() bx = 12; if (bx != RCT2_GLOBAL(0x009DEA6B, sint16) || ax != 1) { // loc_66E2AE - RCT2_GLOBAL(0x013573DC, sint32) -= 10000; - if (RCT2_GLOBAL(0x013573DC, sint32) >= 0) - RCT2_GLOBAL(0x013573DC, sint32) = -RCT2_GLOBAL(0x013573DC, sint32); + RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, sint32) -= 10000; + if (RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, sint32) >= 0) + RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, sint32) = -RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, sint32); } } else { if (ax != RCT2_GLOBAL(0x009DEA69, sint16)) { ax--; if (ax != RCT2_GLOBAL(0x009DEA69, sint16)) { // loc_66E2AE - RCT2_GLOBAL(0x013573DC, sint32) -= 10000; - if (RCT2_GLOBAL(0x013573DC, sint32) >= 0) - RCT2_GLOBAL(0x013573DC, sint32) = -RCT2_GLOBAL(0x013573DC, sint32); + RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, sint32) -= 10000; + if (RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, sint32) >= 0) + RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, sint32) = -RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, sint32); } } } diff --git a/src/management/research.c b/src/management/research.c index e84f2986e0..d8e3f0d116 100644 --- a/src/management/research.c +++ b/src/management/research.c @@ -200,7 +200,7 @@ void research_finish_item(sint32 entryIndex) // I don't think 0x009AC06C is ever not 0, so probably redundant if (RCT2_GLOBAL(0x009AC06C, uint8) == 0) { - RCT2_GLOBAL(0x013CE952, rct_string_id) = ((rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) ? + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, rct_string_id) = ((rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME)) ? rideEntry->name : base_ride_type + 2; if (!gSilentResearch) news_item_add_to_queue(NEWS_ITEM_RESEARCH, 2249, entryIndex); @@ -217,7 +217,7 @@ void research_finish_item(sint32 entryIndex) // I don't think 0x009AC06C is ever not 0, so probably redundant if (RCT2_GLOBAL(0x009AC06C, uint8) == 0) { - RCT2_GLOBAL(0x013CE952, rct_string_id) = scenerySetEntry->name; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, rct_string_id) = scenerySetEntry->name; if (!gSilentResearch) news_item_add_to_queue(NEWS_ITEM_RESEARCH, 2250, entryIndex); } diff --git a/src/rct1.c b/src/rct1.c index 0a3a454f41..b151ee507a 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -467,7 +467,7 @@ static void rct1_reset_research() researchItem++; researchItem->entryIndex = RESEARCHED_ITEMS_END_2; RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) = 0; - RCT2_GLOBAL(0x01357CF4, sint32) = -1; + RCT2_GLOBAL(RCT2_ADDRESS_LAST_RESEARCHED_ITEM_SUBJECT, sint32) = -1; news_item_init_queue(); } diff --git a/src/ride/ride.c b/src/ride/ride.c index b10bd7f000..879639c970 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -2867,7 +2867,7 @@ rct_ride_measurement *ride_get_measurement(int rideIndex, rct_string_id *message if (message != NULL) *message = 0; return measurement; } else { - RCT2_GLOBAL(0x013CE952, uint16) = RideNameConvention[ride->type].vehicle_name; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = RideNameConvention[ride->type].vehicle_name; RCT2_GLOBAL(0x013CE952 + 2, uint16) = RideNameConvention[ride->type].station_name; if (message != NULL) *message = STR_DATA_LOGGING_WILL_START_WHEN_NEXT_LEAVES; return NULL; @@ -3020,7 +3020,7 @@ static void ride_entrance_exit_connected(rct_ride* ride, int ride_idx) continue; if (entrance != 0xFFFF && !ride_entrance_exit_is_reachable(entrance, ride, i)) { // name of ride is parameter of the format string - RCT2_GLOBAL(0x013CE952, uint16) = ride->name; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = ride->name; RCT2_GLOBAL(0x013CE954, uint32) = ride->name_arguments; news_item_add_to_queue(1, STR_ENTRANCE_NOT_CONNECTED, ride_idx); ride->connected_message_throttle = 3; @@ -3028,7 +3028,7 @@ static void ride_entrance_exit_connected(rct_ride* ride, int ride_idx) if (exit != 0xFFFF && !ride_entrance_exit_is_reachable(exit, ride, i)) { // name of ride is parameter of the format string - RCT2_GLOBAL(0x013CE952, uint16) = ride->name; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = ride->name; RCT2_GLOBAL(0x013CE954, uint32) = ride->name_arguments; news_item_add_to_queue(1, STR_EXIT_NOT_CONNECTED, ride_idx); ride->connected_message_throttle = 3; @@ -3094,7 +3094,7 @@ static void ride_shop_connected(rct_ride* ride, int ride_idx) } // Name of ride is parameter of the format string - RCT2_GLOBAL(0x013CE952, uint16) = ride->name; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = ride->name; RCT2_GLOBAL(0x013CE954, uint32) = ride->name_arguments; news_item_add_to_queue(1, STR_ENTRANCE_NOT_CONNECTED, ride_idx); diff --git a/src/ride/ride.h b/src/ride/ride.h index 0734fedc7e..ccb0e32b94 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -858,7 +858,7 @@ extern const uint8 gRideClassifications[255]; #define _currentTrackBeginX RCT2_GLOBAL(0x00F440A8, uint16) #define _currentTrackBeginY RCT2_GLOBAL(0x00F440AA, uint16) #define _currentTrackBeginZ RCT2_GLOBAL(0x00F440AC, uint16) -#define _currentTrackPieceDirection RCT2_GLOBAL(0x00F440AE, uint8) +#define _currentTrackPieceDirection RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) #define _currentTrackPieceType RCT2_GLOBAL(0x00F440AF, uint8) #define _currentTrackSelectionFlags RCT2_GLOBAL(0x00F440B0, uint8) #define _rideConstructionArrowPulseTime RCT2_GLOBAL(0x00F440B1, sint8) diff --git a/src/ride/track.c b/src/ride/track.c index 06fe6d5179..290bb7ae46 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1197,7 +1197,7 @@ int track_place_scenery(rct_track_scenery* scenery_start, uint8 rideIndex, int o if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 0xE9; if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0x80; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 1161; + RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_CANT_POSITION_THIS_HERE; cost = game_do_command( mapCoord.x, @@ -1256,7 +1256,7 @@ int track_place_scenery(rct_track_scenery* scenery_start, uint8 rideIndex, int o if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 105; if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 1811; + RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_CANT_BUILD_PARK_ENTRANCE_HERE; cost = game_do_command( mapCoord.x, @@ -1296,7 +1296,7 @@ int track_place_scenery(rct_track_scenery* scenery_start, uint8 rideIndex, int o if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 105; if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; + RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; cost = game_do_command(mapCoord.x, bl | (bh << 8), mapCoord.y, z | (entry_index << 8), GAME_COMMAND_PLACE_PATH_FROM_TRACK, 0, 0); } else{ @@ -1425,7 +1425,7 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac rotation += maze->unk_2; rotation &= 3; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; + RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; bl = 1; if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 0x69; @@ -1444,7 +1444,7 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac rotation += maze->unk_2; rotation &= 3; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; + RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; bl = 1; if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 0x69; @@ -1466,7 +1466,7 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 0x69; if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; + RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; cost = game_do_command(mapCoord.x, bl | (maze_entry & 0xFF) << 8, mapCoord.y, rideIndex | (maze_entry & 0xFF00), GAME_COMMAND_PLACE_MAZE_DESIGN, z, 0); break; @@ -1641,7 +1641,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 105; if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; + RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; money32 cost = game_do_command(x, bl | (rotation << 8), y, edx, GAME_COMMAND_PLACE_TRACK, edi, 0); RCT2_GLOBAL(0x00F440D5, money32) += cost; @@ -1847,7 +1847,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 105; if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; + RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; money32 cost = game_do_command(x, bl | (rotation << 8), y, rideIndex | (is_exit << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, di, 0); RCT2_GLOBAL(0x00F440D5, money32) += cost; @@ -1866,7 +1866,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac z += RCT2_GLOBAL(0x00F44146, sint16); z /= 16; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; + RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; money32 cost = game_do_command(x, 0 | (rotation << 8), y, z | (is_exit << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, -1, 0); RCT2_GLOBAL(0x00F440D5, money32) += cost; diff --git a/src/scenario.c b/src/scenario.c index 45ba4b4244..d3a15000ab 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -306,8 +306,8 @@ void scenario_begin() RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, sint16) = calculate_park_rating(); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_VALUE, money32) = calculate_park_value(); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_COMPANY_VALUE, money32) = calculate_company_value(); - RCT2_GLOBAL(0x013587D0, money32) = RCT2_GLOBAL(0x013573DC, money32) - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32); - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint32) = ENCRYPT_MONEY(RCT2_GLOBAL(0x013573DC, sint32)); + RCT2_GLOBAL(0x013587D0, money32) = RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32); + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint32) = ENCRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, sint32)); finance_update_loan_hash(); diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 070a607f7b..161c607d16 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -1078,10 +1078,10 @@ static void window_cheats_invalidate(rct_window *w) switch (w->page) { case WINDOW_CHEATS_PAGE_MONEY: - RCT2_GLOBAL(0x013CE952, int) = 50000; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, int) = 50000; break; case WINDOW_CHEATS_PAGE_GUESTS: - RCT2_GLOBAL(0x013CE952, int) = 10000; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, int) = 10000; widget_set_checkbox_value(w, WIDX_GUEST_IGNORE_RIDE_INTENSITY, gConfigCheat.ignore_ride_intensity); widget_set_checkbox_value(w, WIDX_DISABLE_VANDALISM, gConfigCheat.disable_vandalism); break; diff --git a/src/windows/editor_inventions_list.c b/src/windows/editor_inventions_list.c index 396512b107..0a5975f1a6 100644 --- a/src/windows/editor_inventions_list.c +++ b/src/windows/editor_inventions_list.c @@ -675,7 +675,7 @@ static void window_editor_inventions_list_scrollmouseover(rct_window *w, int scr */ static void window_editor_inventions_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - RCT2_GLOBAL(0x013CE952, uint16) = 3159; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = 3159; } /** diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index 2ffbd5af0f..bf7f5a26b4 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -401,7 +401,7 @@ static void window_editor_objective_options_main_mouseup(rct_window *w, int widg window_editor_objective_options_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_PARK_NAME: - RCT2_GLOBAL(0x013CE962, uint32) = RCT2_GLOBAL(0x013573D8, uint32); + RCT2_GLOBAL(0x013CE962, uint32) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, uint32); window_text_input_open(w, WIDX_PARK_NAME, STR_PARK_NAME, STR_ENTER_PARK_NAME, RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id), 0, 32); break; case WIDX_SCENARIO_NAME: diff --git a/src/windows/finances.c b/src/windows/finances.c index 3b74bd95c8..c809ff38f1 100644 --- a/src/windows/finances.c +++ b/src/windows/finances.c @@ -1182,7 +1182,7 @@ static void window_finances_marketing_paint(rct_window *w, rct_drawpixelinfo *dp continue; noCampaignsActive = 0; - RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id); + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id); RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, uint32); // Set special parameters @@ -1190,11 +1190,11 @@ static void window_finances_marketing_paint(rct_window *w, rct_drawpixelinfo *dp case ADVERTISING_CAMPAIGN_RIDE_FREE: case ADVERTISING_CAMPAIGN_RIDE: ride = GET_RIDE(gMarketingCampaignRideIndex[i]); - RCT2_GLOBAL(0x013CE952, uint16) = ride->name; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = ride->name; RCT2_GLOBAL(0x013CE952 + 2, uint32) = ride->name_arguments; break; case ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE: - RCT2_GLOBAL(0x013CE952, uint16) = ShopItemStringIds[gMarketingCampaignRideIndex[i]].plural; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = ShopItemStringIds[gMarketingCampaignRideIndex[i]].plural; break; } diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index 5867e645f8..75abbaa634 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -216,17 +216,17 @@ static void window_game_bottom_toolbar_tooltip(rct_window* w, int widgetIndex, r switch (widgetIndex) { case WIDX_MONEY: - RCT2_GLOBAL(0x013CE952, int) = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PROFIT, sint32); + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, int) = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PROFIT, sint32); RCT2_GLOBAL(0x013CE956, int) = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_VALUE, sint32); break; case WIDX_PARK_RATING: - RCT2_GLOBAL(0x013CE952, short) = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, sint16); + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, sint16); break; case WIDX_DATE: month = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16) & 7; day = ((RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16) * days_in_month[month]) >> 16) & 0xFF; - RCT2_GLOBAL(0x013CE952, short) = STR_DATE_DAY_1 + day; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = STR_DATE_DAY_1 + day; RCT2_GLOBAL(0x013CE954, short) = STR_MONTH_MARCH + month; break; } @@ -379,10 +379,10 @@ static void window_game_bottom_toolbar_draw_left_panel(rct_drawpixelinfo *dpi, r // Draw money if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { - RCT2_GLOBAL(0x013CE952, int) = DECRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint32)); + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, int) = DECRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint32)); gfx_draw_string_centred( dpi, - (RCT2_GLOBAL(0x013CE952, int) < 0 ? 1391 : 1390), + (RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, int) < 0 ? 1391 : 1390), x, y - 3, (RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WINDOWCLASS, rct_windowclass) == 2 && RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_OVER_WIDGETINDEX, sint32) == WIDX_MONEY ? 2 : w->colours[0] & 0x7F), (void*)0x013CE952 @@ -454,7 +454,7 @@ static void window_game_bottom_toolbar_draw_right_panel(rct_drawpixelinfo *dpi, int day = ((RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16) * days_in_month[month]) >> 16) & 0xFF; rct_string_id stringId = DateFormatStringFormatIds[gConfigGeneral.date_format]; - RCT2_GLOBAL(0x013CE952, short) = STR_DATE_DAY_1 + day; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = STR_DATE_DAY_1 + day; RCT2_GLOBAL(0x013CE954, short) = month; RCT2_GLOBAL(0x013CE956, short) = year; gfx_draw_string_centred( @@ -476,7 +476,7 @@ static void window_game_bottom_toolbar_draw_right_panel(rct_drawpixelinfo *dpi, temperature = climate_celsius_to_fahrenheit(temperature); format = STR_FAHRENHEIT_VALUE; } - RCT2_GLOBAL(0x013CE952, short) = temperature; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = temperature; gfx_draw_string_left(dpi, format, (void*)0x013CE952, 0, x, y + 6); x += 30; diff --git a/src/windows/guest.c b/src/windows/guest.c index 8cdde252e3..f460e0329d 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -1534,7 +1534,7 @@ void window_guest_rides_update(rct_window *w) /* rct2: 0x697844 */ void window_guest_rides_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_LIST; } /* rct2: 0x69784E */ diff --git a/src/windows/guest_list.c b/src/windows/guest_list.c index 67d30bbddb..6302ff358c 100644 --- a/src/windows/guest_list.c +++ b/src/windows/guest_list.c @@ -545,7 +545,7 @@ static void window_guest_list_scrollmouseover(rct_window *w, int scrollIndex, in */ static void window_guest_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_LIST; } /** @@ -629,7 +629,7 @@ static void window_guest_list_paint(rct_window *w, rct_drawpixelinfo *dpi) if (_window_guest_list_selected_tab == PAGE_INDIVIDUAL) { x = w->x + 4; y = w->y + window_guest_list_widgets[WIDX_GUEST_LIST].bottom + 2; - RCT2_GLOBAL(0x013CE952, sint16) = w->var_492; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, sint16) = w->var_492; gfx_draw_string_left(dpi, (w->var_492 == 1 ? 1755 : 1754), (void*)0x013CE952, 0, x, y); } } @@ -681,7 +681,7 @@ static void window_guest_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, } // Guest name - RCT2_GLOBAL(0x013CE952, uint16) = peep->name_string_idx; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = peep->name_string_idx; RCT2_GLOBAL(0x013CE954, uint32) = peep->id; gfx_draw_string_left_clipped(dpi, format, (void*)0x013CE952, 0, 0, y - 1, 113); @@ -698,7 +698,7 @@ static void window_guest_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, get_arguments_from_action(peep, &argument_1, &argument_2); - RCT2_GLOBAL(0x013CE952, uint32) = argument_1; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = argument_1; RCT2_GLOBAL(0x013CE952 + 4, uint32) = argument_2; gfx_draw_string_left_clipped(dpi, format, (void*)0x013CE952, 0, 133, y - 1, 314); break; @@ -715,7 +715,7 @@ static void window_guest_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, get_arguments_from_thought(peep->thoughts[j], &argument_1, &argument_2); - RCT2_GLOBAL(0x013CE952, uint32) = argument_1; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = argument_1; RCT2_GLOBAL(0x013CE952 + 4, uint32) = argument_2; gfx_draw_string_left_clipped(dpi, format, (void*)0x013CE952, 0, 118, y - 1, 329); break; @@ -753,7 +753,7 @@ static void window_guest_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, gfx_draw_sprite(dpi, _window_guest_list_groups_guest_faces[i * 56 + j] + 5486, j * 8, y + 9, 0); // Draw action - RCT2_GLOBAL(0x013CE952, uint32) = _window_guest_list_groups_argument_1[i]; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = _window_guest_list_groups_argument_1[i]; RCT2_GLOBAL(0x013CE952 + 4, uint32) = _window_guest_list_groups_argument_2[i]; RCT2_GLOBAL(0x013CE952 + 10, uint32) = numGuests; gfx_draw_string_left_clipped(dpi, format, (void*)0x013CE952, 0, 0, y - 1, 414); diff --git a/src/windows/land.c b/src/windows/land.c index 366c9f2a2f..066c435944 100644 --- a/src/windows/land.c +++ b/src/windows/land.c @@ -407,7 +407,7 @@ static void window_land_paint(rct_window *w, rct_drawpixelinfo *dpi) price += numTiles * 100; if (price != 0 && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { - RCT2_GLOBAL(0x013CE952, sint32) = price; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, sint32) = price; gfx_draw_string_centred(dpi, 986, x, y, 0, (void*)0x013CE952); } } diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index e4e2bdf200..a5da1ea182 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -448,7 +448,7 @@ static void window_loadsave_textinput(rct_window *w, int widgetIndex, char *text static void window_loadsave_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_LIST; } static void window_loadsave_invalidate(rct_window *w) diff --git a/src/windows/map.c b/src/windows/map.c index e69939c38d..13b7f1bf63 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -1603,7 +1603,7 @@ static void map_window_set_pixels(rct_window *w) uint16 colour, *destination; int x, y, dx, dy; - destination = (uint16*)((RCT2_GLOBAL(0x00F1AD6C, uint32) * 511) + RCT2_GLOBAL(0x00F1AD68, uint32) + 255); + destination = (uint16*)((RCT2_GLOBAL(0x00F1AD6C, uint32) * 511) + RCT2_GLOBAL(RCT2_ADDRESS_MAP_IMAGE_DATA, uint32) + 255); switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) { case 0: x = RCT2_GLOBAL(0x00F1AD6C, uint32) * 32; diff --git a/src/windows/new_campaign.c b/src/windows/new_campaign.c index 73aaa03bb2..611a8cb1f2 100644 --- a/src/windows/new_campaign.c +++ b/src/windows/new_campaign.c @@ -343,7 +343,7 @@ static void window_new_campaign_invalidate(rct_window *w) if (w->campaign.ride_id != SELECTED_RIDE_UNDEFINED) { rct_ride *ride = GET_RIDE(w->campaign.ride_id); window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].image = ride->name; - RCT2_GLOBAL(0x013CE952, uint32) = ride->name_arguments; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = ride->name_arguments; } break; case ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE: diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index b0fb38d021..739122f782 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -489,7 +489,7 @@ void window_new_ride_focus(ride_list_item rideItem) ride_list_item *listItem = (ride_list_item*)0x00F43523; while (listItem->type != RIDE_TYPE_NULL) { if (listItem->type == rideItem.type && listItem->entry_index == rideItem.entry_index) { - RCT2_GLOBAL(0x00F43825, uint8) = rideItem.type; + RCT2_GLOBAL(RCT2_ADDRESS_WINDOW_RIDE_LIST_HIGHLIGHTED_ITEM, uint8) = rideItem.type; RCT2_GLOBAL(0x00F43826, uint8) = rideItem.entry_index; w->new_ride.highlighted_ride_id = (rideItem.entry_index << 8) | rideItem.type; window_new_ride_scroll_to_focused_ride(w); @@ -720,7 +720,7 @@ static void window_new_ride_scrollmouseover(rct_window *w, int scrollIndex, int */ static void window_new_ride_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - RCT2_GLOBAL(0x013CE952, uint16) = 3159; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = 3159; } /** diff --git a/src/windows/news.c b/src/windows/news.c index 8e6b1677b5..25789b147d 100644 --- a/src/windows/news.c +++ b/src/windows/news.c @@ -249,7 +249,7 @@ static void window_news_scrollmousedown(rct_window *w, int scrollIndex, int x, i */ static void window_news_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - RCT2_GLOBAL(0x013CE952, uint16) = 3159; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = 3159; } /** @@ -290,7 +290,7 @@ static void window_news_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int s gfx_fill_rect_inset(dpi, -1, y, 383, y + 41, w->colours[1], 0x24); // Date text - RCT2_GLOBAL(0x013CE952, uint16) = STR_DATE_DAY_1 + newsItem->day - 1; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_DATE_DAY_1 + newsItem->day - 1; RCT2_GLOBAL(0x013CE952 + 2, uint16) = STR_MONTH_MARCH + (newsItem->month_year % 8); gfx_draw_string_left(dpi, 2235, (void*)0x013CE952, 2, 4, y); diff --git a/src/windows/options.c b/src/windows/options.c index 8e354a556d..22527eb959 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -1195,13 +1195,13 @@ static void window_options_invalidate(rct_window *w) // sound devices if (currentSoundDevice == -1 || gAudioDeviceCount == 0) { - RCT2_GLOBAL(0x013CE952, uint16) = STR_SOUND_NONE; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_SOUND_NONE; } else { if (currentSoundDevice == 0) - RCT2_GLOBAL(0x013CE952, uint16) = 5510; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = 5510; else - RCT2_GLOBAL(0x013CE952, uint16) = 1170; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = 1170; RCT2_GLOBAL(0x013CE952 + 2, uint32) = (uint32)gAudioDevices[currentSoundDevice].name; } diff --git a/src/windows/park.c b/src/windows/park.c index d456fab6db..94f27632cd 100644 --- a/src/windows/park.c +++ b/src/windows/park.c @@ -575,7 +575,7 @@ static void window_park_set_disabled_tabs(rct_window *w) static void window_park_prepare_window_title_text() { - RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id); + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id); RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, uint32); } @@ -645,7 +645,7 @@ static void window_park_entrance_mouseup(rct_window *w, int widgetIndex) window_scroll_to_viewport(w); break; case WIDX_RENAME: - RCT2_GLOBAL(0x013CE962, uint32) = RCT2_GLOBAL(0x013573D8, uint32); + RCT2_GLOBAL(0x013CE962, uint32) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, uint32); window_text_input_open(w, WIDX_RENAME, STR_PARK_NAME, STR_ENTER_PARK_NAME, RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id), 0, 32); break; case WIDX_CLOSE_LIGHT: @@ -948,7 +948,7 @@ static void window_park_entrance_invalidate(rct_window *w) window_park_set_pressed_tab(w); // Set open / close park button state - RCT2_GLOBAL(0x013CE952, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id); + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id); RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME_ARGS, uint32); window_park_entrance_widgets[WIDX_OPEN_OR_CLOSE].image = park_is_open() ? SPR_OPEN : SPR_CLOSED; window_park_entrance_widgets[WIDX_CLOSE_LIGHT].image = SPR_G2_RCT1_CLOSE_BUTTON_0 + !park_is_open() * 2 + widget_is_pressed(w, WIDX_CLOSE_LIGHT); @@ -1032,7 +1032,7 @@ static void window_park_entrance_paint(rct_window *w, rct_drawpixelinfo *dpi) } // Draw park closed / open label - RCT2_GLOBAL(0x013CE952, uint16) = park_is_open() ? STR_PARK_OPEN : STR_PARK_CLOSED; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = park_is_open() ? STR_PARK_OPEN : STR_PARK_CLOSED; labelWidget = &window_park_entrance_widgets[WIDX_STATUS]; gfx_draw_string_centred_clipped( @@ -1588,20 +1588,20 @@ static void window_park_stats_paint(rct_window *w, rct_drawpixelinfo *dpi) stringIndex = STR_PARK_SIZE_IMPERIAL_LABEL; parkSize = squaredmetres_to_squaredfeet(parkSize); } - RCT2_GLOBAL(0x013CE952, uint32) = parkSize; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = parkSize; gfx_draw_string_left(dpi, stringIndex, (void*)0x013CE952, 0, x, y); y += 10; // Draw number of rides / attractions if (w->list_information_type != (uint16)-1) { - RCT2_GLOBAL(0x013CE952, uint32) = w->list_information_type; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = w->list_information_type; gfx_draw_string_left(dpi, STR_NUMBER_OF_RIDES_LABEL, (void*)0x013CE952, 0, x, y); } y += 10; // Draw number of staff if (w->var_48C != -1) { - RCT2_GLOBAL(0x013CE952, uint32) = w->var_48C; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = w->var_48C; gfx_draw_string_left(dpi, STR_STAFF_LABEL, (void*)0x013CE952, 0, x, y); } y += 10; @@ -1746,7 +1746,7 @@ static void window_park_objective_paint(rct_window *w, rct_drawpixelinfo *dpi) x = w->x + window_park_objective_widgets[WIDX_PAGE_BACKGROUND].left + 4; y = w->y + window_park_objective_widgets[WIDX_PAGE_BACKGROUND].top + 7; strcpy((char*)0x009BC677, RCT2_ADDRESS(RCT2_ADDRESS_SCENARIO_DETAILS, char)); - RCT2_GLOBAL(0x013CE952, short) = 3165; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = 3165; y += gfx_draw_string_left_wrapped(dpi, (void*)0x013CE952, x, y, 222, 1191, 0); y += 5; @@ -1755,7 +1755,7 @@ static void window_park_objective_paint(rct_window *w, rct_drawpixelinfo *dpi) y += 10; // Objective - RCT2_GLOBAL(0x013CE952, short) = RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS, uint16); + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_NUM_GUESTS, uint16); RCT2_GLOBAL(0x013CE954, short) = date_get_total_months(MONTH_OCTOBER, RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_YEAR, uint8)); RCT2_GLOBAL(0x013CE956, int) = RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_CURRENCY, sint32); @@ -1769,7 +1769,7 @@ static void window_park_objective_paint(rct_window *w, rct_drawpixelinfo *dpi) gfx_draw_string_left_wrapped(dpi, NULL, x, y, 222, 2789, 0); } else { // Objective completed - RCT2_GLOBAL(0x013CE952, int) = RCT2_GLOBAL(RCT2_ADDRESS_COMPLETED_COMPANY_VALUE, money32); + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, int) = RCT2_GLOBAL(RCT2_ADDRESS_COMPLETED_COMPANY_VALUE, money32); gfx_draw_string_left_wrapped(dpi, (void*)0x013CE952, x, y, 222, 2788, 0); } } diff --git a/src/windows/research.c b/src/windows/research.c index ff381a5fad..0c03911c09 100644 --- a/src/windows/research.c +++ b/src/windows/research.c @@ -340,7 +340,7 @@ void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dp gfx_draw_string_left_wrapped(dpi, &stringId, x, y, 296, STR_RESEARCH_PROGRESS_LABEL, 0); y += 15; - RCT2_GLOBAL(0x013CE952, uint16) = STR_UNKNOWN; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_UNKNOWN; gfx_draw_string_left(dpi, STR_RESEARCH_EXPECTED_LABEL, (void*)0x013CE952, 0, x, y); } else { // Research type @@ -368,11 +368,11 @@ void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dp y += 15; // Expected - RCT2_GLOBAL(0x013CE952, uint16) = STR_UNKNOWN; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_UNKNOWN; if (RCT2_GLOBAL(RCT2_ADDRESS_RESEARH_PROGRESS_STAGE, uint8) != 0) { uint16 expectedDay = RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_DAY, uint8); if (expectedDay != 255) { - RCT2_GLOBAL(0x013CE952, uint16) = 2289; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = 2289; RCT2_GLOBAL(0x013CE952 + 2, uint16) = STR_DATE_DAY_1 + expectedDay; RCT2_GLOBAL(0x013CE952 + 4, uint16) = STR_MONTH_MARCH + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RESEARCH_EXPECTED_MONTH, uint8); } diff --git a/src/windows/ride.c b/src/windows/ride.c index 72319b9613..879fa83f8b 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -1660,15 +1660,15 @@ static void window_ride_main_mouseup(rct_window *w, int widgetIndex) switch (widgetIndex - WIDX_CLOSE_LIGHT) { case 0: status = RIDE_STATUS_CLOSED; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1004; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_CLOSE; break; case 1: status = RIDE_STATUS_TESTING; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1003; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_TEST; break; case 2: status = RIDE_STATUS_OPEN; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1002; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_OPEN; break; } @@ -1901,15 +1901,15 @@ static void window_ride_main_dropdown(rct_window *w, int widgetIndex, int dropdo switch (dropdownIndex) { case 0: status = RIDE_STATUS_CLOSED; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1004; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_CLOSE; break; case 1: status = RIDE_STATUS_TESTING; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1003; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_TEST; break; case 2: status = RIDE_STATUS_OPEN; - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1002; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_OPEN; break; } @@ -2236,7 +2236,7 @@ static void window_ride_main_paint(rct_window *w, rct_drawpixelinfo *dpi) RCT2_GLOBAL(0x013CE952 + 2, uint16) = w->ride.view; } } - RCT2_GLOBAL(0x013CE952, uint16) = stringId; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = stringId; widget = &window_ride_main_widgets[WIDX_VIEW]; gfx_draw_string_centred( @@ -5153,7 +5153,7 @@ static void window_ride_graphs_tooltip(rct_window* w, int widgetIndex, rct_strin rct_string_id message; if (widgetIndex == WIDX_GRAPH) { - RCT2_GLOBAL(0x013CE952, uint16) = 3158; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = 3158; measurement = ride_get_measurement(w->number, &message); if (measurement != NULL && (measurement->flags & RIDE_MEASUREMENT_FLAG_RUNNING)) { RCT2_GLOBAL(0x013CE952 + 4, uint16) = measurement->vehicle_index + 1; diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 34d4cd9b2e..7ebe6f8527 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -2038,7 +2038,7 @@ static void window_ride_construction_invalidate(rct_window *w) if (stringId == STR_RAPIDS && ride->type == RIDE_TYPE_CAR_RIDE) stringId = STR_LOG_BUMPS; } - RCT2_GLOBAL(0x013CE952, uint16) = stringId; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = stringId; if (RCT2_GLOBAL(0x00F440D3, uint8) == 1) RCT2_GLOBAL(0x013CE952 + 2, uint16) = ((RCT2_GLOBAL(0x00F440CD, uint8) * 9) >> 2) & 0xFFFF; @@ -3495,7 +3495,7 @@ void ride_construction_tooldown_construct(int screenX, int screenY) RCT2_GLOBAL(0x009A8C29, uint8) |= 1; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; + RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; RCT2_GLOBAL(0x00F44074, money32) = game_do_command( _currentTrackBeginX, GAME_COMMAND_FLAG_APPLY | (4 << 8), @@ -3524,7 +3524,7 @@ void ride_construction_tooldown_construct(int screenX, int screenY) w = window_find_by_class(WC_RIDE_CONSTRUCTION); if (w != NULL){ tool_set(w, 23, 12); - RCT2_GLOBAL(0x009DE518, uint32) |= (1 << 6); + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) |= (1 << 6); RCT2_GLOBAL(0x00F44159, uint8) = 0; RCT2_GLOBAL(0x00F4415C, uint8) = 0; } diff --git a/src/windows/ride_list.c b/src/windows/ride_list.c index 27be37c6cb..92fd542508 100644 --- a/src/windows/ride_list.c +++ b/src/windows/ride_list.c @@ -364,7 +364,7 @@ static void window_ride_list_scrollmouseover(rct_window *w, int scrollIndex, int */ static void window_ride_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_LIST; } /** @@ -536,7 +536,7 @@ static void window_ride_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, if (formatSecondary == STR_BROKEN_DOWN || formatSecondary == STR_CRASHED) format = 1192; - RCT2_GLOBAL(0x013CE952, uint16) = formatSecondary; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = formatSecondary; gfx_draw_string_left_clipped(dpi, format, (void*)0x013CE952, 0, 160, y - 1, 157); y += 10; } diff --git a/src/windows/scenery.c b/src/windows/scenery.c index d189f02e41..dbba566335 100644 --- a/src/windows/scenery.c +++ b/src/windows/scenery.c @@ -822,7 +822,7 @@ void window_scenery_tooltip(rct_window* w, int widgetIndex, rct_string_id *strin { switch (widgetIndex) { case WIDX_SCENERY_LIST: - RCT2_GLOBAL(0x013CE952, uint16) = 3159; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = 3159; break; case WIDX_SCENERY_TAB_1: case WIDX_SCENERY_TAB_2: @@ -844,7 +844,7 @@ void window_scenery_tooltip(rct_window* w, int widgetIndex, rct_string_id *strin case WIDX_SCENERY_TAB_18: case WIDX_SCENERY_TAB_19: case WIDX_SCENERY_TAB_20: - RCT2_GLOBAL(0x013CE952, uint16) = g_scenerySetEntries[widgetIndex - WIDX_SCENERY_TAB_1]->name; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = g_scenerySetEntries[widgetIndex - WIDX_SCENERY_TAB_1]->name; break; } } @@ -1025,7 +1025,7 @@ void window_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi) price = RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_COST, uint32); } - RCT2_GLOBAL(0x013CE952, uint32) = price; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = price; if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { // -14 @@ -1033,7 +1033,7 @@ void window_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi) w->x + w->width - 0x1A, w->y + w->height - 13); } - RCT2_GLOBAL(0x013CE952, uint16) = sceneryEntry->name; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = sceneryEntry->name; gfx_draw_string_left_clipped(dpi, 0x4A7, (void*)0x013CE952, 0, w->x + 3, w->y + w->height - 13, w->width - 19); } diff --git a/src/windows/shortcut_keys.c b/src/windows/shortcut_keys.c index 5328e522d5..b96522bbde 100644 --- a/src/windows/shortcut_keys.c +++ b/src/windows/shortcut_keys.c @@ -194,7 +194,7 @@ static void window_shortcut_paint(rct_window *w, rct_drawpixelinfo *dpi) */ static void window_shortcut_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_LIST; } /** diff --git a/src/windows/staff_list.c b/src/windows/staff_list.c index da0fe1edf2..5156de4cf5 100644 --- a/src/windows/staff_list.c +++ b/src/windows/staff_list.c @@ -475,7 +475,7 @@ void window_staff_list_scrollmouseover(rct_window *w, int scrollIndex, int x, in */ void window_staff_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_LIST; } /** @@ -590,7 +590,7 @@ void window_staff_list_paint(rct_window *w, rct_drawpixelinfo *dpi) } if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { - RCT2_GLOBAL(0x013CE952, uint32) = RCT2_ADDRESS(0x00992A00, uint16)[selectedTab]; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = RCT2_ADDRESS(0x00992A00, uint16)[selectedTab]; gfx_draw_string_left(dpi, 1858, (void*)0x013CE952, 0, w->x + 0xA5, w->y + 0x20); } @@ -604,7 +604,7 @@ void window_staff_list_paint(rct_window *w, rct_drawpixelinfo *dpi) staffTypeStringId += 4; } - RCT2_GLOBAL(0x013CE952, uint16) = _window_staff_list_selected_type_count; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = _window_staff_list_selected_type_count; RCT2_GLOBAL(0x013CE952 + 2, uint16) = staffTypeStringId; gfx_draw_string_left(dpi, STR_STAFF_LIST_COUNTER, (void*)0x013CE952, 0, w->x + 4, window_staff_list_widgets[WIDX_STAFF_LIST_LIST].bottom + w->y + 2); @@ -640,12 +640,12 @@ void window_staff_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int sc format = (_quick_fire_mode ? 5299 : 1193); } - RCT2_GLOBAL(0x013CE952, uint16) = peep->name_string_idx; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = peep->name_string_idx; RCT2_GLOBAL(0x013CE952 + 2, uint32) = peep->id; gfx_draw_string_left_clipped(dpi, format, (void*)0x013CE952, 0, 0, y - 1, 107); get_arguments_from_action(peep, &argument_1, &argument_2); - RCT2_GLOBAL(0x013CE952, uint32) = argument_1; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32) = argument_1; RCT2_GLOBAL(0x013CE952 + 4, uint32) = argument_2; gfx_draw_string_left_clipped(dpi, format, (void*)0x013CE952, 0, 175, y - 1, 305); diff --git a/src/windows/themes.c b/src/windows/themes.c index ed65866a49..01cba5d5bc 100644 --- a/src/windows/themes.c +++ b/src/windows/themes.c @@ -727,7 +727,7 @@ static void window_themes_textinput(rct_window *w, int widgetIndex, char *text) void window_themes_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_LIST; } void window_themes_invalidate(rct_window *w) diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index 78edd9a61c..e2631f5ade 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -740,7 +740,7 @@ static void window_title_editor_textinput(rct_window *w, int widgetIndex, char * void window_title_editor_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_LIST; } void window_title_editor_invalidate(rct_window *w) diff --git a/src/windows/title_scenarioselect.c b/src/windows/title_scenarioselect.c index c370e6a373..079f766059 100644 --- a/src/windows/title_scenarioselect.c +++ b/src/windows/title_scenarioselect.c @@ -342,7 +342,7 @@ static void window_scenarioselect_scrollpaint(rct_window *w, rct_drawpixelinfo * // Draw scenario name strcpy((char*)0x009BC677, scenario->name); - RCT2_GLOBAL(0x013CE952, short) = 3165; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = 3165; gfx_draw_string_centred(dpi, highlighted ? highlighted_format : unhighlighted_format, 210, y + 1, 0, (void*)0x013CE952); // Check if scenario is completed @@ -352,7 +352,7 @@ static void window_scenarioselect_scrollpaint(rct_window *w, rct_drawpixelinfo * // Draw completion score strcpy((char*)0x009BC677, scenario->completed_by); - RCT2_GLOBAL(0x013CE952, short) = 2793; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = 2793; RCT2_GLOBAL(0x013CE954, short) = 3165; gfx_draw_string_centred(dpi, highlighted ? 1193 : 1191, 210, y + 11, 0, (void*)0x013CE952); } diff --git a/src/windows/track_list.c b/src/windows/track_list.c index fda1413675..d6ea9d5d1f 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -328,7 +328,7 @@ static void window_track_list_scrollmouseover(rct_window *w, int scrollIndex, in */ static void window_track_list_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { - RCT2_GLOBAL(0x013CE952, uint16) = STR_LIST; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = STR_LIST; } /** @@ -348,7 +348,7 @@ static void window_track_list_invalidate(rct_window *w) if (!(entry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) || rideTypeShouldLoseSeparateFlag(entry)) stringId = _window_track_list_item.type + 2; - RCT2_GLOBAL(0x013CE952, uint16) = stringId; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = stringId; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { window_track_list_widgets[WIDX_TITLE].image = STR_TRACK_DESIGNS; window_track_list_widgets[WIDX_TRACK_LIST].tooltip = STR_CLICK_ON_DESIGN_TO_RENAME_OR_DELETE_IT; diff --git a/src/world/climate.c b/src/world/climate.c index dd1316d117..eeae821230 100644 --- a/src/world/climate.c +++ b/src/world/climate.c @@ -51,12 +51,12 @@ typedef struct { // static int _climateNextWeatherGloom; // static int _climateNextRainLevel; -#define _climateCurrentWeatherEffect RCT2_GLOBAL(0x013CA74E, uint8) +#define _climateCurrentWeatherEffect RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER_EFFECT, uint8) -#define _climateNextTemperature RCT2_GLOBAL(0x013CA74D, uint8) -#define _climateNextWeatherEffect RCT2_GLOBAL(0x013CA74F, uint8) -#define _climateNextWeatherGloom RCT2_GLOBAL(0x013CA751, uint8) -#define _climateNextRainLevel RCT2_GLOBAL(0x013CA753, uint8) +#define _climateNextTemperature RCT2_GLOBAL(RCT2_ADDRESS_NEXT_TEMPERATURE, uint8) +#define _climateNextWeatherEffect RCT2_GLOBAL(RCT2_ADDRESS_NEXT_WEATHER_EFFECT, uint8) +#define _climateNextWeatherGloom RCT2_GLOBAL(RCT2_ADDRESS_NEXT_WEATHER_GLOOM, uint8) +#define _climateNextRainLevel RCT2_GLOBAL(RCT2_ADDRESS_NEXT_RAIN_LEVEL, uint8) static const rct_weather_transition* climate_transitions[4]; diff --git a/src/world/climate.h b/src/world/climate.h index 7acf000483..147b6445ac 100644 --- a/src/world/climate.h +++ b/src/world/climate.h @@ -49,7 +49,7 @@ typedef struct { // This still needs to be read / written when loading and saving // extern int gClimateNextWeather; -#define gClimateNextWeather RCT2_GLOBAL(0x013CA74B, uint8) +#define gClimateNextWeather RCT2_GLOBAL(RCT2_ADDRESS_NEXT_WEATHER, uint8) extern const rct_weather climate_weather_data[6]; diff --git a/src/world/map.c b/src/world/map.c index 15b2bfe78b..116bbc56ae 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -4558,10 +4558,10 @@ void map_clear_all_elements() money32 place_park_entrance(int flags, sint16 x, sint16 y, sint16 z, uint8 direction) { RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LAND_PURCHASE * 4; - RCT2_GLOBAL(0x009DEA5E, sint16) = x; - RCT2_GLOBAL(0x009DEA60, sint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, sint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, sint16) = y; // ?? - RCT2_GLOBAL(0x009DEA62, sint16) = (z & 0xFF) << 4; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, sint16) = (z & 0xFF) << 4; if (!sub_68B044()) { return MONEY32_UNDEFINED; diff --git a/src/world/park.c b/src/world/park.c index fa1310ac74..5f22410873 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -583,7 +583,7 @@ void park_update_histories() int guestsInPark = RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16); int lastGuestsInPark = RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16); RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16) = guestsInPark; - RCT2_GLOBAL(0x009A9804, uint16) |= 4; + RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint16) |= 4; int changeInGuestsInPark = guestsInPark - lastGuestsInPark; int guestChangeModifier = 1; From 060d41f5a0a4114f7fe7ebbd8cae0eaa055badcd Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Wed, 28 Oct 2015 12:50:05 +0100 Subject: [PATCH 0916/1173] Replace raw addresses in RCT2_ADDRESS() with identifiers --- src/peep/peep.c | 6 +++--- src/ride/ride.c | 2 +- src/scenario.c | 14 +++++++------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index b1a6979058..e5b8ece6da 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -8812,7 +8812,7 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl if (peep->x == (sint16)0x8000) return; if (peep->guest_heading_to_ride_id != 255) { ride = GET_RIDE(peep->guest_heading_to_ride_id); - if (RCT2_ADDRESS(0x0097CF40, uint32)[ride->type * 2] & 0x03800000) { + if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & 0x03800000) { return; } } @@ -8835,7 +8835,7 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl // Consider all rides in the park int i; FOR_ALL_RIDES(i, ride) { - if (RCT2_ADDRESS(0x0097CF40, uint32)[ride->type * 2] & rideTypeFlags) { + if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & rideTypeFlags) { RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= (1 << (i & 0x1F)); } } @@ -8852,7 +8852,7 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl int rideIndex = mapElement->properties.track.ride_index; ride = GET_RIDE(rideIndex); - if (RCT2_ADDRESS(0x0097CF40, uint32)[ride->type * 2] & rideTypeFlags) { + if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & rideTypeFlags) { RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (1 << (rideIndex & 0x1F)); } } while (!map_element_is_last_for_tile(mapElement++)); diff --git a/src/ride/ride.c b/src/ride/ride.c index 879639c970..fcbf42edbb 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -126,7 +126,7 @@ static const int RideInspectionInterval[] = { 10, 20, 30, 45, 60, 120, 0, 0 }; -rct_ride_type **gRideTypeList = RCT2_ADDRESS(0x009ACFA4, rct_ride_type*); +rct_ride_type **gRideTypeList = RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, rct_ride_type*); rct_ride* g_ride_list = RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride); // Static function declarations diff --git a/src/scenario.c b/src/scenario.c index d3a15000ab..a31ed2c710 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -817,7 +817,7 @@ int scenario_get_num_packed_objects_to_write() rct_object_entry_extended *entry = (rct_object_entry_extended*)0x00F3F03C; for (i = 0; i < 721; i++, entry++) { - if (RCT2_ADDRESS(0x009ACFA4, uint32)[i] == 0xFFFFFFFF || (entry->flags & 0xF0)) + if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, uint32)[i] == 0xFFFFFFFF || (entry->flags & 0xF0)) continue; count++; @@ -835,7 +835,7 @@ int scenario_write_packed_objects(SDL_RWops* rw) int i; rct_object_entry_extended *entry = (rct_object_entry_extended*)0x00F3F03C; for (i = 0; i < 721; i++, entry++) { - if (RCT2_ADDRESS(0x009ACFA4, uint32)[i] == 0xFFFFFFFF || (entry->flags & 0xF0)) + if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, uint32)[i] == 0xFFFFFFFF || (entry->flags & 0xF0)) continue; if (!write_object_file(rw, (rct_object_entry*)entry)) @@ -875,7 +875,7 @@ int scenario_write_available_objects(FILE *file) rct_object_entry_extended *srcEntry = (rct_object_entry_extended*)0x00F3F03C; rct_object_entry *dstEntry = (rct_object_entry*)buffer; for (i = 0; i < 721; i++) { - if (RCT2_ADDRESS(0x009ACFA4, uint32)[i] == 0xFFFFFFFF) + if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, uint32)[i] == 0xFFFFFFFF) memset(dstEntry, 0xFF, sizeof(rct_object_entry)); else *dstEntry = *((rct_object_entry*)srcEntry); @@ -1021,10 +1021,10 @@ int scenario_save(SDL_RWops* rw, int flags) memcpy(&s6->info, (rct_s6_info*)0x0141F570, sizeof(rct_s6_info)); for (int i = 0; i < 721; i++) { - uint32 chunkPtr = RCT2_ADDRESS(0x009ACFA4, uint32)[i]; + uint32 chunkPtr = RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, uint32)[i]; rct_object_entry_extended *entry = &(RCT2_ADDRESS(0x00F3F03C, rct_object_entry_extended)[i]); - if (RCT2_ADDRESS(0x009ACFA4, uint32)[i] == 0xFFFFFFFF) { + if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, uint32)[i] == 0xFFFFFFFF) { memset(&s6->objects[i], 0xFF, sizeof(rct_object_entry)); } else { s6->objects[i] = *((rct_object_entry*)entry); @@ -1095,10 +1095,10 @@ int scenario_save_network(SDL_RWops* rw) memcpy(&s6->info, (rct_s6_info*)0x0141F570, sizeof(rct_s6_info)); for (int i = 0; i < 721; i++) { - uint32 chunkPtr = RCT2_ADDRESS(0x009ACFA4, uint32)[i]; + uint32 chunkPtr = RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, uint32)[i]; rct_object_entry_extended *entry = &(RCT2_ADDRESS(0x00F3F03C, rct_object_entry_extended)[i]); - if (RCT2_ADDRESS(0x009ACFA4, uint32)[i] == 0xFFFFFFFF) { + if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, uint32)[i] == 0xFFFFFFFF) { memset(&s6->objects[i], 0xFF, sizeof(rct_object_entry)); } else { s6->objects[i] = *((rct_object_entry*)entry); From 111ddeb4455ee205084ea23aa86b35651607af6b Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Wed, 28 Oct 2015 13:43:42 +0100 Subject: [PATCH 0917/1173] Replace old RCT2_ADDRESS_RIDE_ENTRIES accesses by GET_RIDE_ENTRY() --- src/scenario.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/scenario.c b/src/scenario.c index a31ed2c710..81264a5f3c 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -817,7 +817,7 @@ int scenario_get_num_packed_objects_to_write() rct_object_entry_extended *entry = (rct_object_entry_extended*)0x00F3F03C; for (i = 0; i < 721; i++, entry++) { - if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, uint32)[i] == 0xFFFFFFFF || (entry->flags & 0xF0)) + if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF || (entry->flags & 0xF0)) continue; count++; @@ -835,7 +835,7 @@ int scenario_write_packed_objects(SDL_RWops* rw) int i; rct_object_entry_extended *entry = (rct_object_entry_extended*)0x00F3F03C; for (i = 0; i < 721; i++, entry++) { - if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, uint32)[i] == 0xFFFFFFFF || (entry->flags & 0xF0)) + if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF || (entry->flags & 0xF0)) continue; if (!write_object_file(rw, (rct_object_entry*)entry)) @@ -875,7 +875,7 @@ int scenario_write_available_objects(FILE *file) rct_object_entry_extended *srcEntry = (rct_object_entry_extended*)0x00F3F03C; rct_object_entry *dstEntry = (rct_object_entry*)buffer; for (i = 0; i < 721; i++) { - if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, uint32)[i] == 0xFFFFFFFF) + if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF) memset(dstEntry, 0xFF, sizeof(rct_object_entry)); else *dstEntry = *((rct_object_entry*)srcEntry); @@ -1021,10 +1021,10 @@ int scenario_save(SDL_RWops* rw, int flags) memcpy(&s6->info, (rct_s6_info*)0x0141F570, sizeof(rct_s6_info)); for (int i = 0; i < 721; i++) { - uint32 chunkPtr = RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, uint32)[i]; + uint32 chunkPtr = GET_RIDE_ENTRY(i); rct_object_entry_extended *entry = &(RCT2_ADDRESS(0x00F3F03C, rct_object_entry_extended)[i]); - if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, uint32)[i] == 0xFFFFFFFF) { + if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF) { memset(&s6->objects[i], 0xFF, sizeof(rct_object_entry)); } else { s6->objects[i] = *((rct_object_entry*)entry); @@ -1095,10 +1095,10 @@ int scenario_save_network(SDL_RWops* rw) memcpy(&s6->info, (rct_s6_info*)0x0141F570, sizeof(rct_s6_info)); for (int i = 0; i < 721; i++) { - uint32 chunkPtr = RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, uint32)[i]; + uint32 chunkPtr = GET_RIDE_ENTRY(i); rct_object_entry_extended *entry = &(RCT2_ADDRESS(0x00F3F03C, rct_object_entry_extended)[i]); - if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, uint32)[i] == 0xFFFFFFFF) { + if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF) { memset(&s6->objects[i], 0xFF, sizeof(rct_object_entry)); } else { s6->objects[i] = *((rct_object_entry*)entry); From 56645a69417ebdeb5a105befe6be9726066535cc Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Wed, 28 Oct 2015 14:09:17 +0100 Subject: [PATCH 0918/1173] Revert address constant replacement in ride.h --- src/ride/ride.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ride/ride.h b/src/ride/ride.h index ccb0e32b94..0734fedc7e 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -858,7 +858,7 @@ extern const uint8 gRideClassifications[255]; #define _currentTrackBeginX RCT2_GLOBAL(0x00F440A8, uint16) #define _currentTrackBeginY RCT2_GLOBAL(0x00F440AA, uint16) #define _currentTrackBeginZ RCT2_GLOBAL(0x00F440AC, uint16) -#define _currentTrackPieceDirection RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) +#define _currentTrackPieceDirection RCT2_GLOBAL(0x00F440AE, uint8) #define _currentTrackPieceType RCT2_GLOBAL(0x00F440AF, uint8) #define _currentTrackSelectionFlags RCT2_GLOBAL(0x00F440B0, uint8) #define _rideConstructionArrowPulseTime RCT2_GLOBAL(0x00F440B1, sint8) From cc35320b6a20ae6a087870c3d689ad0466802c11 Mon Sep 17 00:00:00 2001 From: dail8859 Date: Thu, 29 Oct 2015 12:05:18 -0400 Subject: [PATCH 0919/1173] Update readme.md Remove mentioning of VS2013. Other minor edits. --- readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/readme.md b/readme.md index 29c90182d3..99733e8b68 100644 --- a/readme.md +++ b/readme.md @@ -24,7 +24,7 @@ An open source clone of RollerCoaster Tycoon 2 built by decompiling the original - 3.3 - [Cleaning and documenting the source code](#33-cleaning-and-documenting-the-source-code) - 3.4 - [Implementing new features / fixing bugs](#34-implementing-new-features--fixing-bugs) - 3.5 - [Translation](#35-translation) -- 4 - [Licence](#4-license) +- 4 - [Licence](#4-licence) # 1 Introduction @@ -71,7 +71,7 @@ OpenRCT2 requires original files of Rollercoaster Tycoon 2 to play. It can be bo ### Windows: - Windows XP / Vista / 7 / 8 / 10 -- Visual Studio 2015 (Enterprise / Professional / [Community (Free)](https://www.visualstudio.com/products/visual-studio-community-vs) +- Visual Studio 2015 (Enterprise / Professional / [Community (Free)](https://www.visualstudio.com/products/visual-studio-community-vs)) - [Powershell 4.0](http://social.technet.microsoft.com/wiki/contents/articles/21016.how-to-install-windows-powershell-4-0.aspx). ### Mac OS X: @@ -91,7 +91,7 @@ OpenRCT2 requires original files of Rollercoaster Tycoon 2 to play. It can be bo 5. When OpenRCT2 is run for the first time, it creates a settings file in `My Documents/OpenRCT2`. If it can't find the original installation of RCT2, you will need to edit `config.ini` in that folder and change the value of `game_path` to where RCT2 is installed. 6. If the game crashes, you may need to press the red, square Stop button along the top of VS Express to stop the program. -Alternatively, to simply build the project you can just execute ``build.bat`` within VS2013 Native Tools Command prompt or Github Windows prompt. +Alternatively, to simply build the project you can just execute ``build.bat`` within VS2015 Native Tools Command prompt or Github Windows prompt. ### Mac OS X: Providing Homebrew or MacPorts are installed (but not both!), OpenRCT2's dependencies and Wine can be installed automatically through `install.sh`. @@ -134,7 +134,7 @@ While decompilation is an ongoing process, this does not prohibit changes being ## 3.5 Translation Translations are in progress for German, Dutch, French, Hungarian, Polish, Spanish, Swedish, Italian, and more. You can translate the game into other languages by editing the language files in the data directory. Please join discussions and submit pull requests to https://github.com/OpenRCT2/Localisation. -# 4 License +# 4 Licence **OpenRCT2** is licensed under the GNU General Public License version 3. # 5 More information From 31f412d0e40ebde7675254c410d92c99b95a15f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Wed, 28 Oct 2015 22:05:30 +0100 Subject: [PATCH 0920/1173] Fixes: scope & types, control flow, cmake, platform support --- CMakeLists.txt | 2 +- src/input.c | 9 +++++- src/openrct2.c | 4 +-- src/platform/linux.c | 67 ++++++++++++++++++++------------------------ 4 files changed, 41 insertions(+), 41 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 26f133133e..20a9c6416a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,7 +59,7 @@ if (UNIX) # force 32bit build for now and set necessary flags to compile code as is set(CMAKE_C_FLAGS "-m32 -std=gnu99") set(CMAKE_CXX_FLAGS "-m32 -std=gnu++11") - set(CMAKE_SHARED_LINKER_FLAGS "-m32 -Wl,-melf_i386") + set(CMAKE_SHARED_LINKER_FLAGS "-m32") set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}) endif (UNIX) diff --git a/src/input.c b/src/input.c index 65621f24c1..2bd19b7a7d 100644 --- a/src/input.c +++ b/src/input.c @@ -543,6 +543,8 @@ static void input_scroll_continue(rct_window *w, int widgetIndex, int state, int int scroll_part, scroll_id; int x2, y2; + assert(w != NULL); + widget = &w->widgets[widgetIndex]; if (widgetIndex != RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WIDGETINDEX, uint32)){ invalidate_scroll(); @@ -662,6 +664,7 @@ static void input_scroll_part_update_hthumb(rct_window *w, int widgetIndex, int */ static void input_scroll_part_update_vthumb(rct_window *w, int widgetIndex, int y, int scroll_id) { + assert(w != NULL); rct_widget *widget = &w->widgets[widgetIndex]; int newTop; @@ -699,6 +702,7 @@ static void input_scroll_part_update_vthumb(rct_window *w, int widgetIndex, int */ static void input_scroll_part_update_hleft(rct_window *w, int widgetIndex, int scroll_id) { + assert(w != NULL); if (window_find_by_number(w->classification, w->number)) { w->scrolls[scroll_id].flags |= HSCROLLBAR_LEFT_PRESSED; if (w->scrolls[scroll_id].h_left < 0) @@ -716,6 +720,7 @@ static void input_scroll_part_update_hleft(rct_window *w, int widgetIndex, int s */ static void input_scroll_part_update_hright(rct_window *w, int widgetIndex, int scroll_id) { + assert(w != NULL); rct_widget *widget = &w->widgets[widgetIndex]; if (window_find_by_number(w->classification, w->number)) { w->scrolls[scroll_id].flags |= HSCROLLBAR_RIGHT_PRESSED; @@ -739,7 +744,8 @@ static void input_scroll_part_update_hright(rct_window *w, int widgetIndex, int * rct: 0x006E9C37 */ static void input_scroll_part_update_vtop(rct_window *w, int widgetIndex, int scroll_id) -{; +{ + assert(w != NULL); if (window_find_by_number(w->classification, w->number)) { w->scrolls[scroll_id].flags |= VSCROLLBAR_UP_PRESSED; if (w->scrolls[scroll_id].v_top < 0) @@ -757,6 +763,7 @@ static void input_scroll_part_update_vtop(rct_window *w, int widgetIndex, int sc */ static void input_scroll_part_update_vbottom(rct_window *w, int widgetIndex, int scroll_id) { + assert(w != NULL); rct_widget *widget = &w->widgets[widgetIndex]; if (window_find_by_number(w->classification, w->number)) { w->scrolls[scroll_id].flags |= VSCROLLBAR_DOWN_PRESSED; diff --git a/src/openrct2.c b/src/openrct2.c index a48b5ef83f..02243a2530 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -503,7 +503,7 @@ static bool openrct2_setup_rct2_segment() int len = 0x01429000 - 0x8a4000; // 0xB85000, 12079104 bytes or around 11.5MB // section: rw data - void *base = mmap((void *)0x8a4000, len, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0); + void *base = mmap((void *)0x8a4000, len, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS | MAP_SHARED, 0, 0); log_warning("base = %x, 0x01423b40 >= base == %i, 0x01423b40 < base + len == %i", base, (void *)0x01423b40 >= base, (void *)0x01423b40 < base + len); if (base == MAP_FAILED) { log_warning("errno = %i", errno); @@ -512,7 +512,7 @@ static bool openrct2_setup_rct2_segment() len = 0x004A3000; // section: text - void *base2 = mmap((void *)(0x401000), len, PROT_EXEC | PROT_WRITE | PROT_READ, MAP_PRIVATE, fd, 0x1000); + void *base2 = mmap((void *)(0x401000), len, PROT_EXEC | PROT_WRITE | PROT_READ, MAP_FIXED | MAP_PRIVATE, fd, 0x1000); if (base2 != (void *)(0x401000)) { log_fatal("mmap failed to get required offset! got %p, expected %p, errno = %d", base2, (void *)(0x401000), errno); diff --git a/src/platform/linux.c b/src/platform/linux.c index 4fd11fc530..f68740a3fe 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -96,7 +96,7 @@ bool platform_file_exists(const utf8 *path) wcstombs(buffer, wPath, len); buffer[len] = '\0'; free(wPath); - int exists = access(buffer, F_OK) != -1; + bool exists = access(buffer, F_OK) != -1; log_warning("file '%s' exists = %i", buffer, exists); return exists; } @@ -114,9 +114,9 @@ bool platform_directory_exists(const utf8 *path) log_verbose("checking dir %s, result = %d, is_dir = %d", buffer, result, S_ISDIR(dirinfo.st_mode)); if ((result != 0) || !S_ISDIR(dirinfo.st_mode)) { - return 0; + return false; } - return 1; + return true; } bool platform_original_game_data_exists(const utf8 *path) @@ -159,13 +159,13 @@ bool platform_ensure_directory_exists(const utf8 *path) bool platform_directory_delete(const utf8 *path) { STUB(); - return 1; + return true; } bool platform_lock_single_instance() { STUB(); - return 1; + return true; } typedef struct { @@ -203,7 +203,6 @@ static int winfilter(const struct dirent *d) int platform_enumerate_files_begin(const utf8 *pattern) { - int i; enumerate_file_info *enumFileInfo; wchar_t *wpattern = utf8_to_widechar(pattern); int length = min(utf8_length(pattern), MAX_PATH); @@ -266,7 +265,7 @@ int platform_enumerate_files_begin(const utf8 *pattern) } log_warning("looking for file matching %s", g_file_pattern); int cnt; - for (i = 0; i < countof(_enumerateFileInfoList); i++) { + for (int i = 0; i < countof(_enumerateFileInfoList); i++) { enumFileInfo = &_enumerateFileInfoList[i]; if (!enumFileInfo->active) { strncpy(enumFileInfo->pattern, npattern, length); @@ -317,16 +316,15 @@ int platform_enumerate_files_begin(const utf8 *pattern) bool platform_enumerate_files_next(int handle, file_info *outFileInfo) { - bool result = true; - enumerate_file_info *enumFileInfo; if (handle < 0) { - result = false; + return false; } - enumFileInfo = &_enumerateFileInfoList[handle]; + enumerate_file_info *enumFileInfo = &_enumerateFileInfoList[handle]; + bool result; - if (result && (enumFileInfo->handle < enumFileInfo->cnt)) { + if (enumFileInfo->handle < enumFileInfo->cnt) { result = true; } else { result = false; @@ -341,29 +339,26 @@ bool platform_enumerate_files_next(int handle, file_info *outFileInfo) statRes = stat(fileName, &fileInfo); if (statRes == -1) { log_error("failed to stat file '%s'! errno = %i", fileName, errno); - return 0; + return false; } outFileInfo->path = basename(fileName); outFileInfo->size = fileInfo.st_size; outFileInfo->last_modified = fileInfo.st_mtime; - return 1; + return true; } else { - return 0; + return false; } } void platform_enumerate_files_end(int handle) { - int i; - enumerate_file_info *enumFileInfo; - if (handle < 0) { return; } - enumFileInfo = &_enumerateFileInfoList[handle]; + enumerate_file_info *enumFileInfo = &_enumerateFileInfoList[handle]; int cnt = enumFileInfo->cnt; - for (i = 0; i < cnt; i++) { + for (int i = 0; i < cnt; i++) { free(enumFileInfo->fileListTemp[i]); free(enumFileInfo->paths[i]); } @@ -380,7 +375,7 @@ static int dirfilter(const struct dirent *d) if (d->d_name[0] == '.') { return 0; } -#ifdef _DIRENT_HAVE_D_TYPE +#if defined(_DIRENT_HAVE_D_TYPE) || defined(DT_UNKNOWN) if (d->d_type == DT_DIR) { return 1; @@ -389,12 +384,11 @@ static int dirfilter(const struct dirent *d) } #else #error implement dirfilter! -#endif // _DIRENT_HAVE_D_TYPE +#endif // defined(_DIRENT_HAVE_D_TYPE) || defined(DT_UNKNOWN) } int platform_enumerate_directories_begin(const utf8 *directory) { - int i; enumerate_file_info *enumFileInfo; wchar_t *wpattern = utf8_to_widechar(directory); int length = min(utf8_length(directory), MAX_PATH); @@ -410,7 +404,7 @@ int platform_enumerate_directories_begin(const utf8 *directory) // TODO: add some checking for stringness and directoryness int cnt; - for (i = 0; i < countof(_enumerateFileInfoList); i++) { + for (int i = 0; i < countof(_enumerateFileInfoList); i++) { enumFileInfo = &_enumerateFileInfoList[i]; if (!enumFileInfo->active) { strncpy(enumFileInfo->pattern, npattern, length); @@ -455,13 +449,16 @@ int platform_enumerate_directories_begin(const utf8 *directory) bool platform_enumerate_directories_next(int handle, utf8 *path) { - bool result; - enumerate_file_info *enumFileInfo; + if (handle < 0) + { + return false; + } - enumFileInfo = &_enumerateFileInfoList[handle]; + bool result; + enumerate_file_info *enumFileInfo = &_enumerateFileInfoList[handle]; log_verbose("handle = %d", handle); - if ((handle >= 0) && (enumFileInfo->handle < enumFileInfo->cnt)) { + if (enumFileInfo->handle < enumFileInfo->cnt) { result = true; } else { result = false; @@ -470,36 +467,32 @@ bool platform_enumerate_directories_next(int handle, utf8 *path) if (result) { int entryIdx = enumFileInfo->handle++; struct stat fileInfo; - log_verbose("trying handle %d", entryIdx); char *fileName = enumFileInfo->paths[entryIdx]; int statRes; statRes = stat(fileName, &fileInfo); if (statRes == -1) { log_error("failed to stat file '%s'! errno = %i", fileName, errno); - return 0; + return false; } // so very, very wrong… strncpy(path, basename(fileName), MAX_PATH); strncat(path, "/", MAX_PATH); path[MAX_PATH - 1] = '\0'; - return 1; + return true; } else { - return 0; + return false; } } void platform_enumerate_directories_end(int handle) { - int i; - enumerate_file_info *enumFileInfo; - if (handle < 0) { return; } - enumFileInfo = &_enumerateFileInfoList[handle]; + enumerate_file_info *enumFileInfo = &_enumerateFileInfoList[handle]; int cnt = enumFileInfo->cnt; - for (i = 0; i < cnt; i++) { + for (int i = 0; i < cnt; i++) { free(enumFileInfo->fileListTemp[i]); free(enumFileInfo->paths[i]); } From 7fcc801d0183f89934ec230c2782591bdd5b285c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Wed, 28 Oct 2015 22:41:17 +0100 Subject: [PATCH 0921/1173] Cleanup allocated segments on disposal --- src/openrct2.c | 70 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 59 insertions(+), 11 deletions(-) diff --git a/src/openrct2.c b/src/openrct2.c index 02243a2530..8271397a2f 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -58,6 +58,12 @@ bool gOpenRCT2Headless = false; bool gOpenRCT2ShowChangelog; +#if defined(__linux__) +void *gDataSegment; +void *gTextSegment; +int gExeFd; +#endif // defined(__linux__) + /** If set, will end the OpenRCT2 game loop. Intentially private to this module so that the flag can not be set back to 0. */ int _finished; @@ -66,6 +72,7 @@ static struct { sint16 x, y, z; } _spritelocations1[MAX_SPRITES], _spritelocatio static void openrct2_loop(); static bool openrct2_setup_rct2_segment(); +static bool openrct2_release_rct2_segment(); static void openrct2_setup_rct2_hooks(); static void openrct2_copy_files_over(const utf8 *originalDirectory, const utf8 *newDirectory, const utf8 *extension) @@ -308,6 +315,7 @@ void openrct2_dispose() network_close(); http_dispose(); language_close_all(); + openrct2_release_rct2_segment(); platform_free(); } @@ -465,8 +473,8 @@ static bool openrct2_setup_rct2_segment() #define DATA_OFFSET 0x004A4000 const char *exepath = "openrct2.exe"; - int fd = open(exepath, O_RDONLY); - if (fd < 0) { + gExeFd = open(exepath, O_RDONLY); + if (gExeFd < 0) { log_fatal("failed to open %s, errno = %d", exepath, errno); exit(1); } @@ -503,23 +511,22 @@ static bool openrct2_setup_rct2_segment() int len = 0x01429000 - 0x8a4000; // 0xB85000, 12079104 bytes or around 11.5MB // section: rw data - void *base = mmap((void *)0x8a4000, len, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS | MAP_SHARED, 0, 0); - log_warning("base = %x, 0x01423b40 >= base == %i, 0x01423b40 < base + len == %i", base, (void *)0x01423b40 >= base, (void *)0x01423b40 < base + len); - if (base == MAP_FAILED) { - log_warning("errno = %i", errno); + gDataSegment = mmap((void *)0x8a4000, len, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS | MAP_SHARED, 0, 0); + if (gDataSegment != (void *)0x8a4000) { + log_fatal("mmap failed to get required offset for data segment! got %p, expected %p, errno = %d", gDataSegment, (void *)(0x8a4000), errno); exit(1); } len = 0x004A3000; // section: text - void *base2 = mmap((void *)(0x401000), len, PROT_EXEC | PROT_WRITE | PROT_READ, MAP_FIXED | MAP_PRIVATE, fd, 0x1000); - if (base2 != (void *)(0x401000)) + gTextSegment = mmap((void *)(0x401000), len, PROT_EXEC | PROT_WRITE | PROT_READ, MAP_FIXED | MAP_PRIVATE, gExeFd, 0x1000); + if (gTextSegment != (void *)(0x401000)) { - log_fatal("mmap failed to get required offset! got %p, expected %p, errno = %d", base2, (void *)(0x401000), errno); + log_fatal("mmap failed to get required offset for text segment! got %p, expected %p, errno = %d", gTextSegment, (void *)(0x401000), errno); exit(1); } - void *fbase = mmap(NULL, file_size, PROT_READ, MAP_PRIVATE, fd, 0); + void *fbase = mmap(NULL, file_size, PROT_READ, MAP_PRIVATE, gExeFd, 0); int err = errno; log_warning("mmapped file to %p", fbase); if (fbase == MAP_FAILED) @@ -529,7 +536,13 @@ static bool openrct2_setup_rct2_segment() } // .rdata and real part of .data // 0x9e2000 - 0x8a4000 = 0x13e000 - memcpy(base, fbase + DATA_OFFSET, 0x13e000); + memcpy(gDataSegment, fbase + DATA_OFFSET, 0x13e000); + err = munmap(fbase, file_size); + if (err != 0) + { + err = errno; + log_error("Failed to unmap file! errno = %d", err); + } #endif // __linux__ // Check that the expected data is at various addresses. @@ -546,6 +559,41 @@ static bool openrct2_setup_rct2_segment() return true; } +/** + * Releases segments created with @ref openrct2_setup_rct2_segment, if any. + */ +static bool openrct2_release_rct2_segment() +{ + bool result = true; +#if defined(__linux__) + int len = 0x01429000 - 0x8a4000; // 0xB85000, 12079104 bytes or around 11.5MB + int err; + err = munmap(gDataSegment, len); + if (err != 0) + { + err = errno; + log_error("Failed to unmap data segment! errno = %d", err); + result = false; + } + len = 0x004A3000; + err = munmap(gTextSegment, len); + if (err != 0) + { + err = errno; + log_error("Failed to unmap text segment! errno = %d", err); + result = false; + } + err = close(gExeFd); + if (err != 0) + { + err = errno; + log_error("Failed to close file! errno = %d", err); + result = false; + } +#endif // defined(__linux__) + return result; +} + /** * Setup hooks to allow RCT2 to call OpenRCT2 functions instead. */ From 00a347159c44747228b4bb68ea0db4a75ed71b2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 29 Oct 2015 21:24:54 +0100 Subject: [PATCH 0922/1173] Type fixes, remove unused variable --- src/scenario.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/scenario.c b/src/scenario.c index 81264a5f3c..292d174672 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -817,7 +817,7 @@ int scenario_get_num_packed_objects_to_write() rct_object_entry_extended *entry = (rct_object_entry_extended*)0x00F3F03C; for (i = 0; i < 721; i++, entry++) { - if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF || (entry->flags & 0xF0)) + if (GET_RIDE_ENTRY(i) == (void *)0xFFFFFFFF || (entry->flags & 0xF0)) continue; count++; @@ -835,7 +835,7 @@ int scenario_write_packed_objects(SDL_RWops* rw) int i; rct_object_entry_extended *entry = (rct_object_entry_extended*)0x00F3F03C; for (i = 0; i < 721; i++, entry++) { - if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF || (entry->flags & 0xF0)) + if (GET_RIDE_ENTRY(i) == (void *)0xFFFFFFFF || (entry->flags & 0xF0)) continue; if (!write_object_file(rw, (rct_object_entry*)entry)) @@ -875,7 +875,7 @@ int scenario_write_available_objects(FILE *file) rct_object_entry_extended *srcEntry = (rct_object_entry_extended*)0x00F3F03C; rct_object_entry *dstEntry = (rct_object_entry*)buffer; for (i = 0; i < 721; i++) { - if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF) + if (GET_RIDE_ENTRY(i) == (void *)0xFFFFFFFF) memset(dstEntry, 0xFF, sizeof(rct_object_entry)); else *dstEntry = *((rct_object_entry*)srcEntry); @@ -1021,10 +1021,9 @@ int scenario_save(SDL_RWops* rw, int flags) memcpy(&s6->info, (rct_s6_info*)0x0141F570, sizeof(rct_s6_info)); for (int i = 0; i < 721; i++) { - uint32 chunkPtr = GET_RIDE_ENTRY(i); rct_object_entry_extended *entry = &(RCT2_ADDRESS(0x00F3F03C, rct_object_entry_extended)[i]); - if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF) { + if (GET_RIDE_ENTRY(i) == (void *)0xFFFFFFFF) { memset(&s6->objects[i], 0xFF, sizeof(rct_object_entry)); } else { s6->objects[i] = *((rct_object_entry*)entry); @@ -1095,10 +1094,9 @@ int scenario_save_network(SDL_RWops* rw) memcpy(&s6->info, (rct_s6_info*)0x0141F570, sizeof(rct_s6_info)); for (int i = 0; i < 721; i++) { - uint32 chunkPtr = GET_RIDE_ENTRY(i); rct_object_entry_extended *entry = &(RCT2_ADDRESS(0x00F3F03C, rct_object_entry_extended)[i]); - if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF) { + if (GET_RIDE_ENTRY(i) == (void *)0xFFFFFFFF) { memset(&s6->objects[i], 0xFF, sizeof(rct_object_entry)); } else { s6->objects[i] = *((rct_object_entry*)entry); From 1d772b01d01fa056ccb1d0861f55776099cdddf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 29 Oct 2015 21:41:49 +0100 Subject: [PATCH 0923/1173] Plug memory leak and validate getsockopt result --- src/network/network.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index f8a438ba5f..82b95a8e34 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -324,6 +324,7 @@ int NetworkAddress::ResolveFunc(void* pointer) memcpy(&(*ss), res->ai_addr, res->ai_addrlen); *ss_len = res->ai_addrlen; *status = RESOLVE_OK; + freeaddrinfo(res); } else { *status = RESOLVE_FAILED; } @@ -584,7 +585,12 @@ void Network::UpdateClient() case NETWORK_STATUS_CONNECTING:{ int error = 0; socklen_t len = sizeof(error); - getsockopt(server_connection.socket, SOL_SOCKET, SO_ERROR, (char*)&error, &len); + int result = getsockopt(server_connection.socket, SOL_SOCKET, SO_ERROR, (char*)&error, &len); + if (result != 0) + { + log_error("getsockopt failed with error %d", LAST_SOCKET_ERROR()); + break; + } if (error != 0) { log_error("Connection failed %d", error); connectfailed = true; @@ -602,9 +608,14 @@ void Network::UpdateClient() timeout.tv_sec = 0; timeout.tv_usec = 0; if (select(server_connection.socket + 1, NULL, &writeFD, NULL, &timeout) > 0) { - int error = 0; + error = 0; socklen_t len = sizeof(error); - getsockopt(server_connection.socket, SOL_SOCKET, SO_ERROR, (char*)&error, &len); + result = getsockopt(server_connection.socket, SOL_SOCKET, SO_ERROR, (char*)&error, &len); + if (result != 0) + { + log_error("getsockopt failed with error %d", LAST_SOCKET_ERROR()); + break; + } if (error == 0) { status = NETWORK_STATUS_CONNECTED; Client_Send_AUTH(OPENRCT2_VERSION, gConfigNetwork.player_name, ""); From 1f9c02fc5fe1271c6b347bbe2397d0727b90af45 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 30 Oct 2015 04:00:17 +0000 Subject: [PATCH 0924/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/german.txt | 46 ++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/data/language/german.txt b/data/language/german.txt index 76fffd1484..357a497d66 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -880,8 +880,8 @@ STR_0875 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP STR_0876 :{BLACK}{DOWN} STR_0877 :Zu niedrig! STR_0878 :Zu hoch! -STR_0879 :Gelände kann hier nicht tiefer gemacht werden... -STR_0880 :Gelände kann hier nicht höher gemacht werden... +STR_0879 :Gelände kann hier nicht gesenkt werden... +STR_0880 :Gelände kann hier nicht erhöht werden... STR_0881 :Objekt ist im Weg STR_0882 :Spiel laden STR_0883 :Spiel speichern @@ -934,7 +934,7 @@ STR_0929 :S-Kurve (links) STR_0930 :S-Kurve (rechts) STR_0931 :Vertikale Schleife (l.) STR_0932 :Vertikale Schleife (r.) -STR_0933 :Gelände zuerst höher bzw. niedriger machen +STR_0933 :Gelände muss erhöht/gesenkt werden STR_0934 :Attraktionseingang im Weg STR_0935 :Attraktionsausgang im Weg STR_0936 :Parkeingang im Weg @@ -1073,7 +1073,7 @@ STR_1068 :Rotationsliftmodus STR_1069 :Station-zu-Station-Modus STR_1070 :Einzelfahrt pro Eintritt STR_1071 :Unbegrenzte Fahrten pro Eintritt -STR_1072 :Irrgartenmodus +STR_1072 :Labyrinthmodus STR_1073 :Rennmodus STR_1074 :Autoskooter-Modus STR_1075 :Schwingmodus @@ -1178,10 +1178,10 @@ STR_1173 :{SMALLFONT}{BLACK}Fußwege und Warteschlangenreihen anlegen STR_1174 :Banner im Weg STR_1175 :Kann nicht auf Fußweg mit Neigung angelegt werden STR_1176 :Fußweg kann hier nicht angelegt werden... -STR_1177 :Fußweg kann von hier nicht entfernt werden... +STR_1177 :Fußweg kann hier nicht entfernt werden... STR_1178 :Landneigung unpassend STR_1179 :Fußweg im Weg -STR_1180 :Kann unter Wasser nicht gebaut werden! +STR_1180 :Kann nicht unter Wasser gebaut werden! STR_1181 :Fußwege STR_1182 :Art STR_1183 :Richtung @@ -1514,7 +1514,7 @@ STR_1509 :{SMALLFONT}{OPENQUOTES}Ich möchte aus {STRINGID} aussteigen{ENDQUO STR_1510 :{SMALLFONT}{OPENQUOTES}Ich gehe nicht auf {STRINGID} - Es ist nicht sicher{ENDQUOTES} STR_1511 :{SMALLFONT}{OPENQUOTES}Dieser Weg ist schrecklich{ENDQUOTES} STR_1512 :{SMALLFONT}{OPENQUOTES}Hier sind zu viele Leute{ENDQUOTES} -STR_1513 :{SMALLFONT}{OPENQUOTES}Es sieht wirklich schlimm aus mit dem Vandalismus hier{ENDQUOTES} +STR_1513 :{SMALLFONT}{OPENQUOTES}Der Vandalismus hier ist schrecklich{ENDQUOTES} STR_1514 :{SMALLFONT}{OPENQUOTES}Eine tolle Landschaft!{ENDQUOTES} STR_1515 :{SMALLFONT}{OPENQUOTES}Dieser Park ist wirklich sauber und aufgeräumt{ENDQUOTES} STR_1516 :{SMALLFONT}{OPENQUOTES}Die Springbrunnen sind großartig{ENDQUOTES} @@ -1649,7 +1649,7 @@ STR_1644 : STR_1645 : STR_1646 : STR_1647 : -STR_1648 :{SMALLFONT}{OPENQUOTES}Hilfe! Bringt mich runter!{ENDQUOTES} +STR_1648 :{SMALLFONT}{OPENQUOTES}Hilfe! Lasst mich runter!{ENDQUOTES} STR_1649 :{SMALLFONT}{OPENQUOTES}Mir geht das Geld aus!{ENDQUOTES} STR_1650 :{SMALLFONT}{OPENQUOTES}Wow! Eine neue Bahn im Bau!{ENDQUOTES} STR_1651 :{SMALLFONT}{OPENQUOTES}Gute Bahn! Doch nicht so gut wie die Phoenix...{ENDQUOTES} @@ -1690,7 +1690,7 @@ STR_1685 :Grundflächengröße 2 x 4 STR_1686 :Grundflächengröße 5 x 1 STR_1687 :Wasser-Splash STR_1688 :Grundflächengröße 4 x 1 -STR_1689 :Klotzbremsen +STR_1689 :Blockbremsen STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} STR_1691 :{WINDOW_COLOUR_2} Kosten: {BLACK}{CURRENCY} STR_1692 :{WINDOW_COLOUR_2} Kosten: {BLACK}ab {CURRENCY} @@ -1736,7 +1736,7 @@ STR_1731 :{WHITE}{STRINGID} - - STR_1732 :Bauen STR_1733 :Modus STR_1734 :{WINDOW_COLOUR_2}Anzahl der Runden: -STR_1735 :{SMALLFONT}{BLACK}Rundenanzahl der Rundfahrt +STR_1735 :{SMALLFONT}{BLACK}Rundenanzahl STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1737 :{COMMA16} STR_1738 :Rundenanzahl kann nicht geändert werden... @@ -1744,7 +1744,7 @@ STR_1739 :Rennen gewonnen von Besucher {INT32} STR_1740 :Rennen wurde gewonnen von {STRINGID} STR_1741 :Noch nicht gebaut! STR_1742 :{WINDOW_COLOUR_2}Max. Besucherzahl: -STR_1743 :{SMALLFONT}{BLACK}Höchstzahl zulässiger Personen zu einem Zeitpunkt bei dieser Bahn +STR_1743 :{SMALLFONT}{BLACK}Max. Anzahl von Personen zur selben Zeit auf dieser Bahn STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1745 :{COMMA16} STR_1746 :Dies kann nicht geändert werden... @@ -1762,7 +1762,7 @@ STR_1757 :{WINDOW_COLOUR_2}Zuverlässigkeit: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1758 :{SMALLFONT}{BLACK}Baumodus STR_1759 :{SMALLFONT}{BLACK}Verschiebemodus STR_1760 :{SMALLFONT}{BLACK}Ausfüllmodus -STR_1761 :{SMALLFONT}{BLACK}Irrgarten in diese Richtung bauen +STR_1761 :{SMALLFONT}{BLACK}Labyrinth in diese Richtung bauen STR_1762 :Wasserfälle STR_1763 :Stromschnellen STR_1764 :Baumstammstöße @@ -1793,8 +1793,8 @@ STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriffkostüm STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Piratenkostüm STR_1790 :{SMALLFONT}{BLACK}Uniformfarbe für diesen{NEWLINE}Mitarbeiter auswählen STR_1791 :{WINDOW_COLOUR_2}Uniformfarbe: -STR_1792 :Antwortet auf {STRINGID} -Störungsruf -STR_1793 :Unterwegs zu {STRINGID} für eine Inspektion +STR_1792 :Antwortet auf Störung von {STRINGID} +STR_1793 :Unterwegs zur Inspektion von {STRINGID} STR_1794 :Repariert {STRINGID} STR_1795 :Beantwortet einen Funkspruch STR_1796 :Ist ausgefallen und erfordert Reparatur @@ -1919,7 +1919,7 @@ STR_1914 :{BLACK}{CURRENCY2DP} STR_1915 :{RED}{CURRENCY2DP} STR_1916 :{WINDOW_COLOUR_2}Darlehen: STR_1917 :{POP16}{POP16}{POP16}{CURRENCY} -STR_1918 :Es können keine weiteren Gelder geliehen werden! +STR_1918 :Es kann kein weiteres Darlehnen aufgenommen werden! STR_1919 :Nicht genügend Geld verfügbar! STR_1920 :Darlehen kann nicht zurückgezahlt werden! STR_1921 :{SMALLFONT}{BLACK}Neues Spiel beginnen @@ -2220,7 +2220,7 @@ STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F STR_2218 :{RED}{STRINGID} bei {STRINGID} ist noch nicht zu {STRINGID} zurückgekehrt!{NEWLINE}Überprüfen Sie, ob es steckengeblieben ist oder angehalten hat -STR_2219 :{RED}{COMMA16} Menschen sind in einem Unfall gestorben bei {STRINGID} +STR_2219 :{RED}{COMMA16} Menschen sind in einem Unfall bei {STRINGID} gestorben STR_2220 :{WINDOW_COLOUR_2}Parkbewertung: {BLACK}{COMMA16} STR_2221 :{SMALLFONT}{BLACK}Parkbewertung: {COMMA16} STR_2222 :{SMALLFONT}{BLACK}{STRINGID} @@ -2269,7 +2269,7 @@ STR_2264 :Forschungsfinanzierung STR_2265 :{WINDOW_COLOUR_2}Kosten: {BLACK}{CURRENCY} pro Monat STR_2266 :Forschungsprioritäten STR_2267 :Zur Zeit in Entwicklung -STR_2268 :Letzte Entwicklung +STR_2268 :Zuletzt Entwickelt STR_2269 :{WINDOW_COLOUR_2}Typ: {BLACK}{STRINGID} STR_2270 :{WINDOW_COLOUR_2}Fortschritt: {BLACK}{STRINGID} STR_2271 :{WINDOW_COLOUR_2}Erwartet: {BLACK}{STRINGID} @@ -2498,7 +2498,7 @@ STR_2492 :{SMALLFONT}{BLACK}Alle Tastenkürzel auf Standardeinstellung zurüc STR_2493 :Oberstes Fenster schließen STR_2494 :Alle freien Fenster schließen STR_2495 :Baumodus abbrechen -STR_2496 :Spielpause +STR_2496 :Spiel pausieren STR_2497 :Ansicht wegzoomen STR_2498 :Ansicht heranzoomen STR_2499 :Ansicht im Uhrzeigersinn drehen @@ -2621,7 +2621,7 @@ STR_2614 :Y STR_2615 :Z STR_2616 :??? STR_2617 :??? -STR_2618 :Menu +STR_2618 :Menü STR_2619 :??? STR_2620 :??? STR_2621 :Zehnertastatur 0 @@ -2851,7 +2851,7 @@ STR_2842 :{TOPAZ}Ihr Park hat die Auszeichnung `Enttäuschendster Park des La STR_2843 :{TOPAZ}Ihr Park hat die Auszeichnung `Park mit den besten Wasserbahnen des Landes' erhalten! STR_2844 :{TOPAZ}Ihr Park hat die Auszeichnung `Park mit den besten eigenen Bahnentwürfen des Landes' erhalten! STR_2845 :{TOPAZ}Ihr Park hat die Auszeichnung `Park mit der buntesten Farbwahl' erhalten! -STR_2846 :{TOPAZ}Ihr Park hat die Auszeichnung `Park mit der konfusesten Anordnung' erhalten! +STR_2846 :{TOPAZ}Ihr Park hat die Auszeichnung `Park mit der verwirrensten Anordnung' erhalten! STR_2847 :{TOPAZ}Ihr Park hat die Auszeichnung `Park mit den besten gemäßigten Bahnen' erhalten! STR_2848 :{WINDOW_COLOUR_2}Keine aktuellen Auszeichnungen STR_2849 :Neues Szenario erfolgreich installiert @@ -3126,7 +3126,7 @@ STR_3117 :{BLACK}Mechaniker rufen... STR_3118 :{BLACK}{STRINGID} geht zur Bahn STR_3119 :{BLACK}{STRINGID} repariert die Bahn STR_3120 :{SMALLFONT}{BLACK}Nächsten verfügbaren Mechaniker{NEWLINE}oder Mechaniker bei einer{NEWLINE}Bahnreparatur suchen -STR_3121 :Örtlicher Mechaniker kann nicht gefunden werden, oder alle Mechaniker sind gerade beschäftigt +STR_3121 :Es befindet sich kein Mechaniker in der Nähe, oder alle Mechaniker sind gerade beschäftigt STR_3122 :{WINDOW_COLOUR_2}Lieblingsbahn von: {BLACK}{COMMA16} Besucher STR_3123 :{WINDOW_COLOUR_2}Lieblingsbahn von: {BLACK}{COMMA16} Besuchern STR_3124 :Defekt {STRINGID} @@ -3184,7 +3184,7 @@ STR_3175 :Dieses Objekt wird immer benötigt STR_3176 :Dieses Objekt kann nicht ausgewählt werden STR_3177 :Die Auswahl dieses Objekts kann nicht aufgehoben werden STR_3178 :Es muss mindestens ein Fußwegobjekt ausgewählt werden -STR_3179 :Es muss mindestens ein Attraktionsobjekt ausgewählt werden +STR_3179 :Es muss mindestens eine Attraktion ausgewählt werden STR_3180 :Ungültige Auswahl an Objekten STR_3181 :Objektauswahl - {STRINGID} STR_3182 :Parkeingangsart muss ausgewählt werden @@ -3338,7 +3338,7 @@ STR_3329 :Parkeingang noch nicht gebaut STR_3330 :Park muss Gelände besitzen STR_3331 :Fußweg vom Parkeingang zum Kartenrand entweder nicht vollständig oder zu komplex - Fußweg darf nicht zu breit sein und sollte so wenige Kreuzungen und Biegungen wie möglich aufweisen STR_3332 :Parkeingang liegt verkehrt herum oder besitzt keinen Fußweg zum Kartenrand -STR_3333 :Plugin-Objekte bei gespeich. Spielen exportieren +STR_3333 :Zusatzobjekte bei gespeich. Spielen exportieren STR_3334 :{SMALLFONT}{BLACK}Wählen Sie aus, ob zusätzliche Plugin-Objektdaten (Zusatzdaten, die nicht zum Hauptprodukt gehören) in Spielständen oder Szenariodateien gespeichert werden sollen, damit jemand, der nicht über die zusätzlichen Objektdaten verfügt, die gespeicherten Daten laden kann STR_3335 :Achterbahn-Designer - Bahnarten & Fahrzeuge auswählen STR_3336 :Streckenentwurf-Manager - Bahnart auswählen From a819a6f1779df67db37cb42445d55a19aa8bd5d1 Mon Sep 17 00:00:00 2001 From: Flukiestemperor Date: Fri, 30 Oct 2015 06:44:19 -0500 Subject: [PATCH 0925/1173] Fix crash when map element is null in a save --- src/game.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/game.c b/src/game.c index 8d9df819fe..42bc57e745 100644 --- a/src/game.c +++ b/src/game.c @@ -792,6 +792,19 @@ void game_fix_save_vars() { } RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) = peepCount; + + // Fixes broken saves where a surface element could be null + for (int y = 0; y < 256; y++) { + for (int x = 0; x < 256; x++) { + rct_map_element *mapElement = map_get_surface_element_at(x, y); + + if (mapElement == NULL) + { + log_error("Null map element at x = %d and y = %d. Fixing...", x, y); + map_element_insert(x, y, 14, 0); + } + } + } } // Load game state for multiplayer From 9284930d7ee46a057d4e347bbc1a584e38fe1695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 30 Oct 2015 15:18:29 +0100 Subject: [PATCH 0926/1173] Add safe_strncpy function safe_strncpy is similar to strncpy, but makes sure buffer is null-terminated. Update most of project to use this updated function to prevent illegal memory accesses. --- src/audio/audio.c | 5 +-- src/audio/audio.h | 4 ++- src/cmdline.c | 6 ++-- src/cmdline_sprite.c | 6 ++-- src/config.c | 28 ++++++++-------- src/config.h | 7 ++-- src/editor.c | 10 +++--- src/game.c | 20 +++++------ src/interface/chat.c | 7 ++-- src/interface/console.c | 3 +- src/interface/themes.c | 5 +-- src/interface/title_sequences.c | 18 +++++----- src/interface/widget.c | 5 +-- src/localisation/currency.h | 4 ++- src/localisation/localisation.c | 10 +++--- src/localisation/user.c | 3 +- src/management/news_item.c | 3 +- src/network/network.cpp | 5 +-- src/network/twitch.cpp | 7 ++-- src/openrct2.c | 12 +++---- src/platform/linux.c | 9 ++--- src/platform/shared.c | 3 +- src/platform/windows.c | 3 +- src/scenario.c | 32 +++++++++--------- src/scenario_list.c | 13 ++++---- src/title.c | 2 +- src/util/util.c | 23 +++++++++++++ src/util/util.h | 1 + src/windows/editor_bottom_toolbar.c | 2 +- src/windows/editor_object_selection.c | 7 ++-- src/windows/editor_objective_options.c | 9 ++--- src/windows/loadsave.c | 46 ++++++++++++-------------- src/windows/network_status.c | 3 +- src/windows/options.c | 4 +-- src/windows/park.c | 2 +- src/windows/player_list.c | 5 +-- src/windows/server_list.c | 5 +-- src/windows/text_input.c | 12 +++---- src/windows/title_editor.c | 4 +-- src/windows/title_scenarioselect.c | 11 +++--- src/windows/tooltip.c | 4 +-- 41 files changed, 208 insertions(+), 160 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 8391881d2b..ac90544cc4 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -30,6 +30,7 @@ #include "audio.h" #include "mixer.h" #include "../openrct2.h" +#include "../util/util.h" int gAudioDeviceCount; audio_device *gAudioDevices = NULL; @@ -72,13 +73,13 @@ void audio_get_devices() gAudioDeviceCount++; gAudioDevices = malloc(gAudioDeviceCount * sizeof(audio_device)); - strcpy(gAudioDevices[0].name, language_get_string(5510)); + safe_strncpy(gAudioDevices[0].name, language_get_string(5510), AUDIO_DEVICE_NAME_SIZE); for (i = 1; i < gAudioDeviceCount; i++) { const char *utf8_name = SDL_GetAudioDeviceName(i - 1, SDL_FALSE); if (utf8_name == NULL) utf8_name = language_get_string(5511); - strcpy(gAudioDevices[i].name, utf8_name); + safe_strncpy(gAudioDevices[i].name, utf8_name, AUDIO_DEVICE_NAME_SIZE); } } } diff --git a/src/audio/audio.h b/src/audio/audio.h index d22a26442a..7c3030903a 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -24,8 +24,10 @@ #include "../common.h" #include "../world/sprite.h" +#define AUDIO_DEVICE_NAME_SIZE 256 + typedef struct { - char name[256]; + char name[AUDIO_DEVICE_NAME_SIZE]; } audio_device; extern int gAudioDeviceCount; diff --git a/src/cmdline.c b/src/cmdline.c index bfe317abe1..586d343f48 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -108,7 +108,7 @@ int cmdline_run(const char **argv, int argc) if (server != NULL) { gNetworkStart = NETWORK_MODE_CLIENT; - strncpy(gNetworkStartHost, server, sizeof(gNetworkStartHost)); + safe_strncpy(gNetworkStartHost, server, sizeof(gNetworkStartHost)); } #endif // DISABLE_NETWORK @@ -152,7 +152,7 @@ static int cmdline_for_edit(const char **argv, int argc) { gOpenRCT2StartupAction = STARTUP_ACTION_EDIT; if (argc >= 1) - strcpy(gOpenRCT2StartupActionPath, argv[0]); + safe_strncpy(gOpenRCT2StartupActionPath, argv[0], 512); return 0; } @@ -163,7 +163,7 @@ static int cmdline_for_none(const char **argv, int argc) if (platform_file_exists(argv[0])) { gOpenRCT2StartupAction = STARTUP_ACTION_OPEN; - strcpy(gOpenRCT2StartupActionPath, argv[0]); + safe_strncpy(gOpenRCT2StartupActionPath, argv[0], 512); return 0; } else { fprintf(stderr, "error: %s does not exist\n", argv[0]); diff --git a/src/cmdline_sprite.c b/src/cmdline_sprite.c index d6a6e8b2ae..d6e8ac2c21 100644 --- a/src/cmdline_sprite.c +++ b/src/cmdline_sprite.c @@ -491,7 +491,7 @@ int cmdline_for_sprite(const char **argv, int argc) int maxIndex = (int)spriteFileHeader.num_entries; int numbers = (int)floor(log(maxIndex)); - strncpy(outputPath, argv[2], MAX_PATH); + safe_strncpy(outputPath, argv[2], MAX_PATH); int pathLen = strlen(outputPath); if (pathLen >= MAX_PATH - numbers - 5){ @@ -502,7 +502,7 @@ int cmdline_for_sprite(const char **argv, int argc) for (int x = 0; x < numbers; x++){ outputPath[pathLen + x] = '0'; } - strncpy(outputPath + pathLen + numbers, ".png", MAX_PATH); + safe_strncpy(outputPath + pathLen + numbers, ".png", MAX_PATH); for (int spriteIndex = 0; spriteIndex < maxIndex; spriteIndex++){ @@ -604,7 +604,7 @@ int cmdline_for_sprite(const char **argv, int argc) int i = 0; do { // Create image path - strcpy(imagePath, resourcePath); + safe_strncpy(imagePath, resourcePath, MAX_PATH); if (resourcePath[resourceLength - 1] == '/' || resourcePath[resourceLength - 1] == '\\') imagePath[resourceLength - 1] = 0; sprintf(imagePath, "%s%c%d.png", imagePath, platform_get_path_separator(), i); diff --git a/src/config.c b/src/config.c index 50dc70b522..a2d5d74d1a 100644 --- a/src/config.c +++ b/src/config.c @@ -758,7 +758,7 @@ static bool config_find_rct2_path(utf8 *resultPath) for (i = 0; i < countof(searchLocations); i++) { if (platform_original_game_data_exists(searchLocations[i])) { - strcpy(resultPath, searchLocations[i]); + safe_strncpy(resultPath, searchLocations[i], MAX_PATH); return true; } } @@ -774,7 +774,7 @@ bool config_find_or_browse_install_directory() if (config_find_rct2_path(path)) { SafeFree(gConfigGeneral.game_path); gConfigGeneral.game_path = malloc(strlen(path) + 1); - strcpy(gConfigGeneral.game_path, path); + safe_strncpy(gConfigGeneral.game_path, path, MAX_PATH); } else { platform_show_messagebox("Unable to find RCT2 installation directory. Please select the directory where you installed RCT2!"); installPath = platform_open_directory_browser("Please select your RCT2 directory"); @@ -1005,7 +1005,7 @@ void themes_set_default() gConfigThemes.presets = malloc(sizeof(theme_preset) * gConfigThemes.num_presets); // Set RCT2 theme - strcpy(gConfigThemes.presets[0].name, language_get_string(2741)); + safe_strncpy(gConfigThemes.presets[0].name, language_get_string(2741), THEME_PRESET_NAME_SIZE); gConfigThemes.presets[0].windows = malloc(sizeof(theme_window) * gNumThemeWindows); // Define the defaults for RCT2 here @@ -1019,7 +1019,7 @@ void themes_set_default() } // Set RCT1 theme - strcpy(gConfigThemes.presets[1].name, language_get_string(2740)); + safe_strncpy(gConfigThemes.presets[1].name, language_get_string(2740), THEME_PRESET_NAME_SIZE); gConfigThemes.presets[1].windows = malloc(sizeof(theme_window) * gNumThemeWindows); // Define the defaults for RCT1 here @@ -1113,7 +1113,7 @@ bool themes_open(const_utf8string path) if (preset == gConfigThemes.num_presets) { gConfigThemes.num_presets++; gConfigThemes.presets = realloc(gConfigThemes.presets, sizeof(theme_preset) * gConfigThemes.num_presets); - strcpy(gConfigThemes.presets[preset].name, path_get_filename(path)); + safe_strncpy(gConfigThemes.presets[preset].name, path_get_filename(path), THEME_PRESET_NAME_SIZE); path_remove_extension(gConfigThemes.presets[preset].name); gConfigThemes.presets[preset].windows = malloc(sizeof(theme_window) * gNumThemeWindows); gConfigThemes.presets[preset].features.rct1_ride_lights = false; @@ -1406,7 +1406,7 @@ static void title_sequence_open(const char *path, const char *customName) char separator = platform_get_path_separator(); // Check for the script file - strcpy(scriptPath, path); + safe_strncpy(scriptPath, path, MAX_PATH); strcat(scriptPath, "script.txt"); if (!platform_file_exists(scriptPath)) { // No script file, title sequence is invalid @@ -1427,7 +1427,7 @@ static void title_sequence_open(const char *path, const char *customName) if (customName == NULL) { char nameBuffer[MAX_PATH], *name; - strcpy(nameBuffer, path); + safe_strncpy(nameBuffer, path, MAX_PATH); name = nameBuffer + strlen(nameBuffer) - 1; while (*name == '\\' || *name == '/') { *name = 0; @@ -1436,12 +1436,12 @@ static void title_sequence_open(const char *path, const char *customName) while (*(name - 1) != '\\' && *(name - 1) != '/') { name--; } - strcpy(gConfigTitleSequences.presets[preset].name, name); + safe_strncpy(gConfigTitleSequences.presets[preset].name, name, TITLE_SEQUENCE_NAME_SIZE); gConfigTitleSequences.presets[preset].path[0] = 0; } else { - strcpy(gConfigTitleSequences.presets[preset].name, customName); - strcpy(gConfigTitleSequences.presets[preset].path, path); + safe_strncpy(gConfigTitleSequences.presets[preset].name, customName, TITLE_SEQUENCE_NAME_SIZE); + safe_strncpy(gConfigTitleSequences.presets[preset].path, path, MAX_PATH); } gConfigTitleSequences.presets[preset].saves = malloc(0); @@ -1451,23 +1451,23 @@ static void title_sequence_open(const char *path, const char *customName) } // Get the save file list - strcpy(titlePath, path); + safe_strncpy(titlePath, path, MAX_PATH); strcat(titlePath, "*.sv6"); fileEnumHandle = platform_enumerate_files_begin(titlePath); while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) { gConfigTitleSequences.presets[preset].num_saves++; gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); - strncpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], fileInfo.path, TITLE_SEQUENCE_MAX_SAVE_LENGTH); + safe_strncpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], fileInfo.path, TITLE_SEQUENCE_MAX_SAVE_LENGTH); gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1][TITLE_SEQUENCE_MAX_SAVE_LENGTH - 1] = '\0'; } platform_enumerate_files_end(fileEnumHandle); - strcpy(titlePath, path); + safe_strncpy(titlePath, path, MAX_PATH); strcat(titlePath, "*.sc6"); fileEnumHandle = platform_enumerate_files_begin(titlePath); while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) { gConfigTitleSequences.presets[preset].num_saves++; gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); - strncpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], fileInfo.path, TITLE_SEQUENCE_MAX_SAVE_LENGTH); + safe_strncpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], fileInfo.path, TITLE_SEQUENCE_MAX_SAVE_LENGTH); gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1][TITLE_SEQUENCE_MAX_SAVE_LENGTH - 1] = '\0'; } platform_enumerate_files_end(fileEnumHandle); diff --git a/src/config.h b/src/config.h index 8db4a4fe03..b41965c4d7 100644 --- a/src/config.h +++ b/src/config.h @@ -230,9 +230,10 @@ typedef struct { uint8 rct1_scenario_font; } theme_features; +#define THEME_PRESET_NAME_SIZE 256 typedef struct theme_preset { - char name[256]; + char name[THEME_PRESET_NAME_SIZE]; theme_window *windows; // Add structures for any other settings here @@ -260,8 +261,10 @@ typedef struct { uint8 y; // LOCATION } title_command; +#define TITLE_SEQUENCE_NAME_SIZE 256 + typedef struct { - char name[256]; + char name[TITLE_SEQUENCE_NAME_SIZE]; char path[MAX_PATH]; // Needed for non-modifiable presets char (*saves)[TITLE_SEQUENCE_MAX_SAVE_LENGTH]; title_command *commands; diff --git a/src/editor.c b/src/editor.c index b13a79ab76..8175d03ca6 100644 --- a/src/editor.c +++ b/src/editor.c @@ -90,7 +90,7 @@ void editor_load() gfx_invalidate_screen(); RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, sint16) = 0; - strcpy((char*)RCT2_ADDRESS_SCENARIO_NAME, language_get_string(2749)); + safe_strncpy((char*)RCT2_ADDRESS_SCENARIO_NAME, language_get_string(2749), 0x40); } /** @@ -105,7 +105,7 @@ static int show_convert_saved_game_to_scenario_dialog(char *resultPath) char filterName[256]; format_string(title, STR_CONVERT_SAVED_GAME_TO_SCENARIO_1038, NULL); - strcpy(filename, RCT2_ADDRESS(RCT2_ADDRESS_SAVED_GAMES_PATH, char)); + safe_strncpy(filename, RCT2_ADDRESS(RCT2_ADDRESS_SAVED_GAMES_PATH, char), MAX_PATH); format_string(filterName, STR_RCT2_SAVED_GAME, NULL); pause_sounds(); @@ -113,7 +113,7 @@ static int show_convert_saved_game_to_scenario_dialog(char *resultPath) unpause_sounds(); if (result) - strcpy(resultPath, filename); + safe_strncpy(resultPath, filename, MAX_PATH); return result; } @@ -142,8 +142,8 @@ void editor_convert_save_to_scenario() RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_NO_MONEY_SCENARIO; RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) |= PARK_FLAGS_NO_MONEY; - strcpy(s6Info->name, (const char*)RCT2_ADDRESS_SCENARIO_NAME); - strcpy(s6Info->details, (const char*)RCT2_ADDRESS_SCENARIO_DETAILS); + safe_strncpy(s6Info->name, (const char*)RCT2_ADDRESS_SCENARIO_NAME, 64); + safe_strncpy(s6Info->details, (const char*)RCT2_ADDRESS_SCENARIO_DETAILS, 256); s6Info->objective_type = RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8); s6Info->objective_arg_1 = RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_YEAR, uint8); s6Info->objective_arg_2 = RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_CURRENCY, sint32); diff --git a/src/game.c b/src/game.c index 42bc57e745..b16a705913 100644 --- a/src/game.c +++ b/src/game.c @@ -590,7 +590,7 @@ static int open_landscape_file_dialog() { int result; format_string((char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, STR_LOAD_LANDSCAPE_DIALOG_TITLE, 0); - strcpy((char*)0x0141EF68, (char*)RCT2_ADDRESS_LANDSCAPES_PATH); + safe_strncpy((char*)0x0141EF68, (char*)RCT2_ADDRESS_LANDSCAPES_PATH, MAX_PATH); format_string((char*)0x0141EE68, STR_RCT2_LANDSCAPE_FILE, 0); pause_sounds(); result = platform_open_common_file_dialog(1, (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, (char*)0x0141EF68, "*.SV6;*.SV4;*.SC6", (char*)0x0141EE68); @@ -607,7 +607,7 @@ static int open_load_game_dialog() { int result; format_string((char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, STR_LOAD_GAME_DIALOG_TITLE, 0); - strcpy((char*)0x0141EF68, (char*)RCT2_ADDRESS_SAVED_GAMES_PATH); + safe_strncpy((char*)0x0141EF68, (char*)RCT2_ADDRESS_SAVED_GAMES_PATH, MAX_PATH); format_string((char*)0x0141EE68, STR_RCT2_SAVED_GAME, 0); pause_sounds(); result = platform_open_common_file_dialog(1, (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, (char*)0x0141EF68, "*.SV6", (char*)0x0141EE68); @@ -639,7 +639,7 @@ static void load_landscape() strcpy(esi, ".SC6"); break; } - strcpy((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2, (char*)0x0141EF68); + safe_strncpy((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2, (char*)0x0141EF68, MAX_PATH); editor_load_landscape((char*)0x0141EF68); if (1) { @@ -874,10 +874,10 @@ int game_load_save(const char *path) { log_verbose("loading saved game, %s", path); - strcpy((char*)0x0141EF68, path); - strcpy((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2, path); + safe_strncpy((char*)0x0141EF68, path, MAX_PATH); + safe_strncpy((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2, path, MAX_PATH); - strcpy(gScenarioSaveName, path_get_filename(path)); + safe_strncpy(gScenarioSaveName, path_get_filename(path), MAX_PATH); path_remove_extension(gScenarioSaveName); SDL_RWops* rw = SDL_RWFromFile(path, "rb"); @@ -983,7 +983,7 @@ static void load_game() strcpy(esi, ".SV6"); break; } - strcpy((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2, (char*)0x0141EF68); + safe_strncpy((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2, (char*)0x0141EF68, MAX_PATH); if (game_load_save((char *)0x0141EF68)) { gfx_invalidate_screen(); @@ -1009,7 +1009,7 @@ static int show_save_game_dialog(char *resultPath) char filterName[256]; format_string(title, STR_SAVE_GAME_1040, NULL); - strcpy(filename, RCT2_ADDRESS(RCT2_ADDRESS_SAVED_GAMES_PATH_2, char)); + safe_strncpy(filename, RCT2_ADDRESS(RCT2_ADDRESS_SAVED_GAMES_PATH_2, char), MAX_PATH); format_string(filterName, STR_RCT2_SAVED_GAME, NULL); pause_sounds(); @@ -1017,7 +1017,7 @@ static int show_save_game_dialog(char *resultPath) unpause_sounds(); if (result) - strcpy(resultPath, filename); + safe_strncpy(resultPath, filename, MAX_PATH); return result; } @@ -1056,7 +1056,7 @@ void game_autosave() utf8 backupPath[MAX_PATH]; platform_get_user_directory(path, "save"); - strcpy(backupPath, path); + safe_strncpy(backupPath, path, MAX_PATH); strcat(path, "autosave.sv6"); strcat(backupPath, "autosave.sv6.bak"); diff --git a/src/interface/chat.c b/src/interface/chat.c index 43d66acc2d..ec783c1b4d 100644 --- a/src/interface/chat.c +++ b/src/interface/chat.c @@ -5,6 +5,7 @@ #include "../network/network.h" #include "../platform/platform.h" #include "chat.h" +#include "../util/util.h" #define CHAT_HISTORY_SIZE 10 #define CHAT_INPUT_SIZE 256 @@ -77,14 +78,14 @@ void chat_draw() if (!gChatOpen && SDL_TICKS_PASSED(SDL_GetTicks(), chat_history_get_time(i) + 10000)) { break; } - strcpy(lineBuffer, chat_history_get(i)); + safe_strncpy(lineBuffer, chat_history_get(i), CHAT_INPUT_SIZE + 10); gfx_set_dirty_blocks(x, y, x + gfx_get_string_width(lineBuffer), y + 12); gfx_draw_string(dpi, lineBuffer, 255, x, y); } if (gChatOpen) { lineCh = utf8_write_codepoint(lineCh, FORMAT_OUTLINE); lineCh = utf8_write_codepoint(lineCh, FORMAT_CELADON); - strcpy(lineCh, _chatCurrentLine); + safe_strncpy(lineCh, _chatCurrentLine, CHAT_INPUT_SIZE); y = _chatBottom - 10; gfx_set_dirty_blocks(x, y, x + gfx_get_string_width(lineBuffer) + 7, y + 12); if (_chatCaretTicks < 15) { @@ -136,4 +137,4 @@ static uint32 chat_history_get_time(unsigned int index) static void chat_clear_input() { _chatCurrentLine[0] = 0; -} \ No newline at end of file +} diff --git a/src/interface/console.c b/src/interface/console.c index b1f3e014aa..a880cda82d 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -17,6 +17,7 @@ #include "../world/banner.h" #include "../world/scenery.h" #include "../management/research.h" +#include "../util/util.h" #include "console.h" #include "window.h" #include "viewport.h" @@ -187,7 +188,7 @@ void console_draw(rct_drawpixelinfo *dpi) int lineLength = min(sizeof(lineBuffer) - (size_t)utf8_get_codepoint_length(FORMAT_GREEN), (size_t)(nextLine - ch)); lineCh = lineBuffer; lineCh = utf8_write_codepoint(lineCh, FORMAT_GREEN); - strncpy(lineCh, ch, lineLength); + safe_strncpy(lineCh, ch, lineLength); lineCh[lineLength] = 0; gfx_draw_string(dpi, lineBuffer, 255, x, y); diff --git a/src/interface/themes.c b/src/interface/themes.c index dd6244376d..b91f1ff6ed 100644 --- a/src/interface/themes.c +++ b/src/interface/themes.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "../localisation/string_ids.h" +#include "../util/util.h" #include "window.h" #include "themes.h" @@ -193,7 +194,7 @@ void theme_create_preset(int duplicate, const char *name) int preset = gConfigThemes.num_presets; gConfigThemes.num_presets++; gConfigThemes.presets = realloc(gConfigThemes.presets, sizeof(theme_preset) * gConfigThemes.num_presets); - strcpy(gConfigThemes.presets[preset].name, name); + safe_strncpy(gConfigThemes.presets[preset].name, name, THEME_PRESET_NAME_SIZE); gConfigThemes.presets[preset].windows = malloc(sizeof(theme_window) * gNumThemeWindows); for (int i = 0; i < (int)gNumThemeWindows; i++) { gConfigThemes.presets[preset].windows[i] = gConfigThemes.presets[duplicate].windows[i]; @@ -234,7 +235,7 @@ void theme_rename_preset(int preset, const char *newName) strcat(dest, ".ini"); platform_file_move(src, dest); - strcpy(gConfigThemes.presets[preset].name, newName); + safe_strncpy(gConfigThemes.presets[preset].name, newName, THEME_PRESET_NAME_SIZE); if (preset == gCurrentTheme) { gConfigInterface.current_theme_preset = gConfigThemes.presets[preset].name; diff --git a/src/interface/title_sequences.c b/src/interface/title_sequences.c index b008df572b..5d3b05cbb3 100644 --- a/src/interface/title_sequences.c +++ b/src/interface/title_sequences.c @@ -47,7 +47,7 @@ bool title_sequence_save_exists(int preset, const char *name) { utf8 newName[MAX_PATH]; char *extension = (char*)path_get_extension(name); - strcpy(newName, name); + safe_strncpy(newName, name, MAX_PATH); if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) strcat(newName, ".sv6"); for (int i = 0; i < gConfigTitleSequences.presets[preset].num_saves; i++) { @@ -86,7 +86,7 @@ void title_sequence_create_preset(const char *name) int preset = gConfigTitleSequences.num_presets; gConfigTitleSequences.num_presets++; gConfigTitleSequences.presets = realloc(gConfigTitleSequences.presets, sizeof(title_sequence) * (size_t)gConfigTitleSequences.num_presets); - strcpy(gConfigTitleSequences.presets[preset].name, name); + safe_strncpy(gConfigTitleSequences.presets[preset].name, name, TITLE_SEQUENCE_NAME_SIZE); gConfigTitleSequences.presets[preset].path[0] = 0; gConfigTitleSequences.presets[preset].saves = malloc(0); @@ -112,7 +112,7 @@ void title_sequence_duplicate_preset(int duplicate, const char *name) int preset = gConfigTitleSequences.num_presets; gConfigTitleSequences.num_presets++; gConfigTitleSequences.presets = realloc(gConfigTitleSequences.presets, sizeof(title_sequence) * (size_t)gConfigTitleSequences.num_presets); - strcpy(gConfigTitleSequences.presets[preset].name, name); + safe_strncpy(gConfigTitleSequences.presets[preset].name, name, TITLE_SEQUENCE_NAME_SIZE); gConfigTitleSequences.presets[preset].path[0] = 0; size_t savesSize = sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * gConfigTitleSequences.presets[duplicate].num_saves; @@ -144,7 +144,7 @@ void title_sequence_duplicate_preset(int duplicate, const char *name) char separator = platform_get_path_separator(); for (int i = 0; i < gConfigTitleSequences.presets[preset].num_saves; i++) { if (gConfigTitleSequences.presets[duplicate].path[0]) { - strcpy(srcPath, gConfigTitleSequences.presets[duplicate].path); + safe_strncpy(srcPath, gConfigTitleSequences.presets[duplicate].path, MAX_PATH); strcat(srcPath, gConfigTitleSequences.presets[duplicate].saves[i]); } else { @@ -210,7 +210,7 @@ void title_sequence_rename_preset(int preset, const char *newName) strcat(dest, newName); platform_file_move(src, dest); - strcpy(gConfigTitleSequences.presets[preset].name, newName); + safe_strncpy(gConfigTitleSequences.presets[preset].name, newName, TITLE_SEQUENCE_NAME_SIZE); // Rename the config preset name if needed if (preset == gCurrentPreviewTitleSequence) { @@ -224,7 +224,7 @@ void title_sequence_add_save(int preset, const char *path, const char *newName) { utf8 newPath[MAX_PATH]; char *extension = (char*)path_get_extension(newName); - strcpy(newPath, newName); + safe_strncpy(newPath, newName, MAX_PATH); if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) strcat(newPath, ".sv6"); if (preset >= TITLE_SEQUENCE_DEFAULT_PRESETS && preset < gConfigTitleSequences.num_presets && filename_valid_characters(newPath) && !title_sequence_save_exists(preset, newPath) && platform_file_exists(path)) { @@ -242,7 +242,7 @@ void title_sequence_add_save(int preset, const char *path, const char *newName) gConfigTitleSequences.presets[preset].num_saves++; gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); - strcpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], newName); + safe_strncpy(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], newName, TITLE_SEQUENCE_MAX_SAVE_LENGTH); // Add the appropriate extension if needed if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) strcat(gConfigTitleSequences.presets[preset].saves[gConfigTitleSequences.presets[preset].num_saves - 1], ".sv6"); @@ -272,7 +272,7 @@ void title_sequence_remove_save(int preset, int index) } for (int i = index; i < gConfigTitleSequences.presets[preset].num_saves - 1; i++) { - strcpy(gConfigTitleSequences.presets[preset].saves[i], gConfigTitleSequences.presets[preset].saves[i + 1]); + safe_strncpy(gConfigTitleSequences.presets[preset].saves[i], gConfigTitleSequences.presets[preset].saves[i + 1], TITLE_SEQUENCE_MAX_SAVE_LENGTH); } gConfigTitleSequences.presets[preset].num_saves--; gConfigTitleSequences.presets[preset].saves = realloc(gConfigTitleSequences.presets[preset].saves, sizeof(char[TITLE_SEQUENCE_MAX_SAVE_LENGTH]) * (size_t)gConfigTitleSequences.presets[preset].num_saves); @@ -302,7 +302,7 @@ void title_sequence_rename_save(int preset, int index, const char *newName) strcat(dest, ".sv6"); platform_file_move(src, dest); - strcpy(gConfigTitleSequences.presets[preset].saves[index], newName); + safe_strncpy(gConfigTitleSequences.presets[preset].saves[index], newName, TITLE_SEQUENCE_MAX_SAVE_LENGTH); // Add the appropriate extension if needed if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) strcat(gConfigTitleSequences.presets[preset].saves[index], ".sv6"); diff --git a/src/interface/widget.c b/src/interface/widget.c index 1ed283347b..801c5621e4 100644 --- a/src/interface/widget.c +++ b/src/interface/widget.c @@ -26,6 +26,7 @@ #include "window.h" #include "../platform/platform.h" #include "../localisation/localisation.h" +#include "../util/util.h" static void widget_frame_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex); static void widget_resize_draw(rct_drawpixelinfo *dpi, rct_window *w, int widgetIndex); @@ -1174,7 +1175,7 @@ static void widget_text_box_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg if (!active) { if (w->widgets[widgetIndex].image != 0) { - strcpy(wrapped_string, (char*)w->widgets[widgetIndex].image); + safe_strncpy(wrapped_string, (char*)w->widgets[widgetIndex].image, 512); gfx_wrap_string(wrapped_string, r - l - 5, &no_lines, &font_height); gfx_draw_string(dpi, wrapped_string, w->colours[1], l + 2, t); } @@ -1182,7 +1183,7 @@ static void widget_text_box_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg } - strcpy(wrapped_string, gTextBoxInput); + safe_strncpy(wrapped_string, gTextBoxInput, 512); // String length needs to add 12 either side of box // +13 for cursor when max length. diff --git a/src/localisation/currency.h b/src/localisation/currency.h index c3147f7172..9ed73bf71c 100644 --- a/src/localisation/currency.h +++ b/src/localisation/currency.h @@ -44,11 +44,13 @@ typedef enum { CURRENCY_SUFFIX } CURRENCY_AFFIX; +#define CURRENCY_SYMBOL_MAX_SIZE 8 + // Currency format specification - inspired by OpenTTD typedef struct { // Rate is relative to 0.1 GBP int rate; - utf8 symbol[8]; + utf8 symbol[CURRENCY_SYMBOL_MAX_SIZE]; int affix; } rct_currency_spec; diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index edd237f716..9e6f349513 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -364,7 +364,7 @@ void format_currency(char **dest, long long value) // Prefix if (currencySpec->affix == CURRENCY_PREFIX) { - strcpy(*dest, symbol); + safe_strncpy(*dest, symbol, CURRENCY_SYMBOL_MAX_SIZE); *dest += strlen(*dest); } @@ -372,7 +372,7 @@ void format_currency(char **dest, long long value) // Currency symbol suffix if (currencySpec->affix == CURRENCY_SUFFIX) { - strcpy(*dest, symbol); + safe_strncpy(*dest, symbol, CURRENCY_SYMBOL_MAX_SIZE); *dest += strlen(*dest); } } @@ -395,7 +395,7 @@ void format_currency_2dp(char **dest, long long value) // Prefix if (currencySpec->affix == CURRENCY_PREFIX) { - strcpy(*dest, symbol); + safe_strncpy(*dest, symbol, CURRENCY_SYMBOL_MAX_SIZE); *dest += strlen(*dest); } @@ -408,7 +408,7 @@ void format_currency_2dp(char **dest, long long value) // Currency symbol suffix if (currencySpec->affix == CURRENCY_SUFFIX) { - strcpy(*dest, symbol); + safe_strncpy(*dest, symbol, CURRENCY_SYMBOL_MAX_SIZE); *dest += strlen(*dest); } } @@ -860,7 +860,7 @@ int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength) // we need one byte for null terminator int result = strnlen(src, maxBufferLength) + 1; result = min(result, maxBufferLength); - strncpy(dst, src, maxBufferLength); + safe_strncpy(dst, src, maxBufferLength); dst[maxBufferLength - 1] = '\0'; #endif // _WIN32 diff --git a/src/localisation/user.c b/src/localisation/user.c index fea5d3eab1..e664715dd1 100644 --- a/src/localisation/user.c +++ b/src/localisation/user.c @@ -21,6 +21,7 @@ #include "../addresses.h" #include "localisation.h" #include "../ride/ride.h" +#include "../util/util.h" utf8 *gUserStrings = (char*)0x0135A8F4; @@ -54,7 +55,7 @@ rct_string_id user_string_allocate(int base, const utf8 *text) if (userString[0] != 0) continue; - strncpy(userString, text, USER_STRING_MAX_LENGTH - 1); + safe_strncpy(userString, text, USER_STRING_MAX_LENGTH - 1); return 0x8000 + (i | highBits); } RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_TOO_MANY_NAMES_DEFINED; diff --git a/src/management/news_item.c b/src/management/news_item.c index 87e17cae15..2d75402dd8 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -26,6 +26,7 @@ #include "../localisation/localisation.h" #include "../ride/ride.h" #include "../world/sprite.h" +#include "../util/util.h" #include "news_item.h" rct_news_item *gNewsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item); @@ -324,7 +325,7 @@ void news_item_add_to_queue_raw(uint8 type, const utf8 *text, uint32 assoc) newsItem->ticks = 0; newsItem->month_year = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); newsItem->day = ((days_in_month[(newsItem->month_year & 7)] * RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16)) >> 16) + 1; - strncpy(newsItem->text, text, 255); + safe_strncpy(newsItem->text, text, 255); newsItem->text[254] = 0; // blatant disregard for what happens on the last element. diff --git a/src/network/network.cpp b/src/network/network.cpp index 82b95a8e34..a3827f86c2 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -43,6 +43,7 @@ extern "C" { #include "../localisation/localisation.h" #include "../scenario.h" #include "../windows/error.h" +#include "../util/util.h" } #pragma comment(lib, "Ws2_32.lib") @@ -147,7 +148,7 @@ void NetworkPacket::Clear() NetworkPlayer::NetworkPlayer(const char* name) { - strncpy((char*)NetworkPlayer::name, name, sizeof(NetworkPlayer::name)); + safe_strncpy((char*)NetworkPlayer::name, name, sizeof(NetworkPlayer::name)); NetworkPlayer::name[sizeof(NetworkPlayer::name) - 1] = 0; ping = 0; flags = 0; @@ -664,7 +665,7 @@ const char* Network::FormatChat(NetworkPlayer* fromplayer, const char* text) if (fromplayer) { lineCh = utf8_write_codepoint(lineCh, FORMAT_OUTLINE); lineCh = utf8_write_codepoint(lineCh, FORMAT_BABYBLUE); - strcpy(lineCh, (const char*)fromplayer->name); + safe_strncpy(lineCh, (const char*)fromplayer->name, 1024); strcat(lineCh, ": "); } strcat(formatted, text); diff --git a/src/network/twitch.cpp b/src/network/twitch.cpp index bdc1633313..06fb34b629 100644 --- a/src/network/twitch.cpp +++ b/src/network/twitch.cpp @@ -22,6 +22,7 @@ extern "C" { #include "../management/news_item.h" #include "../peep/peep.h" #include "../world/sprite.h" + #include "../util/util.h" #include "http.h" #include "twitch.h" @@ -406,14 +407,14 @@ static void twitch_parse_chat_message(const char *message) message++; ch = strchrm(message, " \t"); - strncpy(buffer, message, ch - message); + safe_strncpy(buffer, message, ch - message); buffer[ch - message] = 0; if (_strcmpi(buffer, "news") == 0) { if (gConfigTwitch.enable_news) { ch = strskipwhitespace(ch); buffer[0] = (char)FORMAT_TOPAZ; - strncpy(buffer + 1, ch, sizeof(buffer) - 2); + safe_strncpy(buffer + 1, ch, sizeof(buffer) - 2); buffer[sizeof(buffer) - 2] = 0; // Remove unsupport characters @@ -432,4 +433,4 @@ static void twitch_parse_chat_message(const char *message) } } -#endif \ No newline at end of file +#endif diff --git a/src/openrct2.c b/src/openrct2.c index 8271397a2f..8146782832 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -87,7 +87,7 @@ static void openrct2_copy_files_over(const utf8 *originalDirectory, const utf8 * } // Create filter path - strcpy(filter, originalDirectory); + safe_strncpy(filter, originalDirectory, MAX_PATH); ch = strchr(filter, '*'); if (ch != NULL) *ch = 0; @@ -96,10 +96,10 @@ static void openrct2_copy_files_over(const utf8 *originalDirectory, const utf8 * fileEnumHandle = platform_enumerate_files_begin(filter); while (platform_enumerate_files_next(fileEnumHandle, &fileInfo)) { - strcpy(newPath, newDirectory); + safe_strncpy(newPath, newDirectory, MAX_PATH); strcat(newPath, fileInfo.path); - strcpy(oldPath, originalDirectory); + safe_strncpy(oldPath, originalDirectory, MAX_PATH); ch = strchr(oldPath, '*'); if (ch != NULL) *ch = 0; @@ -112,10 +112,10 @@ static void openrct2_copy_files_over(const utf8 *originalDirectory, const utf8 * fileEnumHandle = platform_enumerate_directories_begin(originalDirectory); while (platform_enumerate_directories_next(fileEnumHandle, filter)) { - strcpy(newPath, newDirectory); + safe_strncpy(newPath, newDirectory, MAX_PATH); strcat(newPath, filter); - strcpy(oldPath, originalDirectory); + safe_strncpy(oldPath, originalDirectory, MAX_PATH); ch = strchr(oldPath, '*'); if (ch != NULL) *ch = 0; @@ -164,7 +164,7 @@ static void openrct2_set_exe_path() } int exeDelimiterIndex = (int)(exeDelimiter - exePath); - strncpy(gExePath, exePath, exeDelimiterIndex + 1); + safe_strncpy(gExePath, exePath, exeDelimiterIndex + 1); gExePath[exeDelimiterIndex] = '\0'; #endif // _WIN32 } diff --git a/src/platform/linux.c b/src/platform/linux.c index f68740a3fe..4c76595791 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -32,6 +32,7 @@ #include "../localisation/currency.h" #include "../config.h" #include "platform.h" +#include "../util/util.h" #include #include @@ -268,7 +269,7 @@ int platform_enumerate_files_begin(const utf8 *pattern) for (int i = 0; i < countof(_enumerateFileInfoList); i++) { enumFileInfo = &_enumerateFileInfoList[i]; if (!enumFileInfo->active) { - strncpy(enumFileInfo->pattern, npattern, length); + safe_strncpy(enumFileInfo->pattern, npattern, length); cnt = scandir(dir_name, &enumFileInfo->fileListTemp, winfilter, alphasort); if (cnt < 0) { @@ -407,7 +408,7 @@ int platform_enumerate_directories_begin(const utf8 *directory) for (int i = 0; i < countof(_enumerateFileInfoList); i++) { enumFileInfo = &_enumerateFileInfoList[i]; if (!enumFileInfo->active) { - strncpy(enumFileInfo->pattern, npattern, length); + safe_strncpy(enumFileInfo->pattern, npattern, length); cnt = scandir(npattern, &enumFileInfo->fileListTemp, dirfilter, alphasort); if (cnt < 0) { @@ -475,7 +476,7 @@ bool platform_enumerate_directories_next(int handle, utf8 *path) return false; } // so very, very wrong… - strncpy(path, basename(fileName), MAX_PATH); + safe_strncpy(path, basename(fileName), MAX_PATH); strncat(path, "/", MAX_PATH); path[MAX_PATH - 1] = '\0'; return true; @@ -586,7 +587,7 @@ void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) w_buffer[len] = '\0'; utf8 *path = widechar_to_utf8(w_buffer); free(w_buffer); - strcpy(outPath, path); + safe_strncpy(outPath, path, MAX_PATH); free(path); log_verbose("outPath + subDirectory = '%s'", buffer); } diff --git a/src/platform/shared.c b/src/platform/shared.c index ad6e92d93f..a04fb90b85 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -31,6 +31,7 @@ #include "../input.h" #include "../localisation/localisation.h" #include "../openrct2.h" +#include "../util/util.h" #include "platform.h" typedef void(*update_palette_func)(const uint8*, int, int); @@ -589,7 +590,7 @@ void platform_process_messages() } break; case SDL_TEXTEDITING: - strcpy(gTextInputComposition, e.edit.text); + safe_strncpy(gTextInputComposition, e.edit.text, min(e.edit.length, 32)); gTextInputCompositionStart = e.edit.start; gTextInputCompositionLength = e.edit.length; gTextInputCompositionActive = gTextInputComposition[0] != 0; diff --git a/src/platform/windows.c b/src/platform/windows.c index 5856582f0b..1b76c7df70 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -30,6 +30,7 @@ #include "../openrct2.h" #include "../localisation/language.h" #include "../localisation/currency.h" +#include "../util/util.h" #include "../config.h" #include "platform.h" @@ -386,7 +387,7 @@ void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, NULL, 0, wOutPath))) { utf8 *outPathTemp = widechar_to_utf8(wOutPath); - strcpy(outPath, outPathTemp); + safe_strncpy(outPath, outPathTemp, MAX_PATH); free(outPathTemp); strcat(outPath, separator); diff --git a/src/scenario.c b/src/scenario.c index 292d174672..ef3db26fa1 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -77,7 +77,7 @@ int scenario_load_basic(const char *path, rct_s6_header *header, rct_s6_info *in utf8 filename[MAX_PATH]; const char *temp_filename = path_get_filename(path); int len = strnlen(temp_filename, MAX_PATH); - strncpy(filename, temp_filename, MAX_PATH); + safe_strncpy(filename, temp_filename, MAX_PATH); if (len == MAX_PATH) { filename[MAX_PATH - 1] = '\0'; @@ -88,10 +88,10 @@ int scenario_load_basic(const char *path, rct_s6_header *header, rct_s6_info *in rct_string_id localisedStringIds[3]; if (language_get_localised_scenario_strings(filename, localisedStringIds)) { if (localisedStringIds[0] != (rct_string_id)STR_NONE) { - strncpy(info->name, language_get_string(localisedStringIds[0]), 64); + safe_strncpy(info->name, language_get_string(localisedStringIds[0]), 64); } if (localisedStringIds[2] != (rct_string_id)STR_NONE) { - strncpy(info->details, language_get_string(localisedStringIds[2]), 256); + safe_strncpy(info->details, language_get_string(localisedStringIds[2]), 256); } } else { // Checks for a scenario string object (possibly for localisation) @@ -239,7 +239,7 @@ int scenario_load_and_play_from_path(const char *path) return 0; int len = strnlen(path, MAX_PATH) + 1; - strncpy(_scenarioPath, path, len); + safe_strncpy(_scenarioPath, path, len); if (len - 1 == MAX_PATH) { _scenarioPath[MAX_PATH - 1] = '\0'; @@ -311,14 +311,14 @@ void scenario_begin() finance_update_loan_hash(); - strcpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, s6Info->details); - strcpy((char*)RCT2_ADDRESS_SCENARIO_NAME, s6Info->name); + safe_strncpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, s6Info->details, 256); + safe_strncpy((char*)RCT2_ADDRESS_SCENARIO_NAME, s6Info->name, 64); { // Get filename utf8 filename[MAX_PATH]; int len = strnlen(_scenarioFileName, MAX_PATH); - strncpy(filename, _scenarioFileName, len); + safe_strncpy(filename, _scenarioFileName, len); if (len == MAX_PATH) { filename[MAX_PATH - 1] = '\0'; @@ -329,14 +329,14 @@ void scenario_begin() rct_string_id localisedStringIds[3]; if (language_get_localised_scenario_strings(filename, localisedStringIds)) { if (localisedStringIds[0] != (rct_string_id)STR_NONE) { - strncpy((char*)RCT2_ADDRESS_SCENARIO_NAME, language_get_string(localisedStringIds[0]), 31); + safe_strncpy((char*)RCT2_ADDRESS_SCENARIO_NAME, language_get_string(localisedStringIds[0]), 31); ((char*)RCT2_ADDRESS_SCENARIO_NAME)[31] = '\0'; } if (localisedStringIds[1] != (rct_string_id)STR_NONE) { park_set_name(language_get_string(localisedStringIds[1])); } if (localisedStringIds[2] != (rct_string_id)STR_NONE) { - strncpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, language_get_string(localisedStringIds[2]), 255); + safe_strncpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, language_get_string(localisedStringIds[2]), 255); ((char*)RCT2_ADDRESS_SCENARIO_DETAILS)[255] = '\0'; } } else { @@ -350,12 +350,12 @@ void scenario_begin() // Set localised scenario name format_string(buffer, stex->scenario_name, 0); - strncpy((char*)RCT2_ADDRESS_SCENARIO_NAME, buffer, 31); + safe_strncpy((char*)RCT2_ADDRESS_SCENARIO_NAME, buffer, 31); ((char*)RCT2_ADDRESS_SCENARIO_NAME)[31] = '\0'; // Set localised scenario details format_string(buffer, stex->details, 0); - strncpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, buffer, 255); + safe_strncpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, buffer, 255); ((char*)RCT2_ADDRESS_SCENARIO_DETAILS)[255] = '\0'; } } @@ -482,8 +482,8 @@ void scenario_success_submit_name(const char *name) if (strequals(scenario->path, _scenarioFileName, 256, true)) { scenarioWinCompanyValue = RCT2_GLOBAL(0x013587C0, uint32); if (scenario->company_value == scenarioWinCompanyValue) { - strncpy(scenario->completed_by, name, 64); - strncpy((char*)0x013587D8, name, 32); + safe_strncpy(scenario->completed_by, name, 64); + safe_strncpy((char*)0x013587D8, name, 32); scenario_scores_save(); } break; @@ -786,7 +786,7 @@ int scenario_prepare_for_save() rct_stex_entry* stex = g_stexEntries[0]; if ((int)stex != 0xFFFFFFFF) { format_string(buffer, stex->scenario_name, NULL); - strncpy(s6Info->name, buffer, sizeof(s6Info->name)); + safe_strncpy(s6Info->name, buffer, sizeof(s6Info->name)); memcpy(&s6Info->entry, &object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0], sizeof(rct_object_entry)); } @@ -910,7 +910,7 @@ static void sub_674BCF() char *dst = &savedExpansionPackNames[i * 128]; if (RCT2_GLOBAL(RCT2_ADDRESS_EXPANSION_FLAGS, uint16) & (1 << i)) { char *src = &(RCT2_ADDRESS(RCT2_ADDRESS_EXPANSION_NAMES, char)[i * 128]); - strncpy(dst, src, 128); + safe_strncpy(dst, src, 128); } else { *dst = 0; } @@ -1034,7 +1034,7 @@ int scenario_save(SDL_RWops* rw, int flags) memcpy(s6->map_elements, (void*)0x00F663B8, 0x180000); memcpy(&s6->dword_010E63B8, (void*)0x010E63B8, 0x2E8570); - strncpy(s6->scenario_filename, _scenarioFileName, sizeof(s6->scenario_filename)); + safe_strncpy(s6->scenario_filename, _scenarioFileName, sizeof(s6->scenario_filename)); scenario_fix_ghosts(s6); game_convert_strings_to_rct2(s6); diff --git a/src/scenario_list.c b/src/scenario_list.c index 4d38ffa338..78940c8935 100644 --- a/src/scenario_list.c +++ b/src/scenario_list.c @@ -20,6 +20,7 @@ #include "addresses.h" #include "platform/platform.h" +#include "util/util.h" #include "scenario.h" // Scenario list @@ -102,8 +103,8 @@ static void scenario_list_add(const char *path) scenario->objective_arg_1 = s6Info.objective_arg_1; scenario->objective_arg_2 = s6Info.objective_arg_2; scenario->objective_arg_3 = s6Info.objective_arg_3; - strcpy(scenario->name, s6Info.name); - strcpy(scenario->details, s6Info.details); + safe_strncpy(scenario->name, s6Info.name, 64); + safe_strncpy(scenario->details, s6Info.details, 256); } else { // Check if the scenario list buffer has room for another scenario if (gScenarioListCount >= gScenarioListCapacity) { @@ -117,7 +118,7 @@ static void scenario_list_add(const char *path) gScenarioListCount++; // Add this new scenario to the list - strcpy(scenario->path, path); + safe_strncpy(scenario->path, path, 256); scenario->flags = SCENARIO_FLAGS_VISIBLE; if (RCT2_GLOBAL(0x009AA00C, uint8) & 1) scenario->flags |= SCENARIO_FLAGS_SIXFLAGS; @@ -126,8 +127,8 @@ static void scenario_list_add(const char *path) scenario->objective_arg_1 = s6Info.objective_arg_1; scenario->objective_arg_2 = s6Info.objective_arg_2; scenario->objective_arg_3 = s6Info.objective_arg_3; - strcpy(scenario->name, s6Info.name); - strcpy(scenario->details, s6Info.details); + safe_strncpy(scenario->name, s6Info.name, 64); + safe_strncpy(scenario->details, s6Info.details, 256); } } @@ -242,4 +243,4 @@ int scenario_scores_save() SDL_RWclose(file); return 1; -} \ No newline at end of file +} diff --git a/src/title.c b/src/title.c index a7e947e94e..3852d844ed 100644 --- a/src/title.c +++ b/src/title.c @@ -349,7 +349,7 @@ static void title_do_next_script_opcode() // Construct full relative path if (gConfigTitleSequences.presets[_scriptCurrentPreset].path[0]) { - strcpy(path, gConfigTitleSequences.presets[_scriptCurrentPreset].path); + safe_strncpy(path, gConfigTitleSequences.presets[_scriptCurrentPreset].path, MAX_PATH); } else { platform_get_user_directory(path, "title sequences"); diff --git a/src/util/util.c b/src/util/util.c index 467172aed7..6138e13e39 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -181,6 +181,29 @@ int strcicmp(char const *a, char const *b) } } +char *safe_strncpy(char * destination, const char * source, size_t size) +{ + char *result = destination; + bool terminated = false; + for (size_t i = 0; i < size; i++) + { + if (*source != '\0') + { + *destination++ = *source++; + } else { + *destination = *source; + terminated = true; + break; + } + } + if (!terminated) + { + destination[size - 1] = '\0'; + log_warning("Truncating string %s to %d bytes.", destination, size); + } + return result; +} + bool utf8_is_bom(const char *str) { return str[0] == (char)0xEF && str[1] == (char)0xBB && str[2] == (char)0xBF; diff --git a/src/util/util.h b/src/util/util.h index 398ca173c4..8eba3a2b3f 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -39,6 +39,7 @@ int bitscanforward(int source); int bitcount(int source); bool strequals(const char *a, const char *b, int length, bool caseInsensitive); int strcicmp(char const *a, char const *b); +char *safe_strncpy(char * destination, const char * source, size_t num); bool utf8_is_bom(const char *str); bool str_is_null_or_empty(const char *str); diff --git a/src/windows/editor_bottom_toolbar.c b/src/windows/editor_bottom_toolbar.c index 1dcbd2a15b..4416c40895 100644 --- a/src/windows/editor_bottom_toolbar.c +++ b/src/windows/editor_bottom_toolbar.c @@ -341,7 +341,7 @@ static int show_save_scenario_dialog(char *resultPath) unpause_sounds(); if (result) - strcpy(resultPath, filename); + safe_strncpy(resultPath, filename, MAX_PATH); return result; } diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 034afb51f6..388af33f45 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -35,6 +35,7 @@ #include "../scenario.h" #include "dropdown.h" #include "error.h" +#include "../util/util.h" enum { @@ -1991,7 +1992,7 @@ static void window_editor_object_selection_textinput(rct_window *w, int widgetIn } else { memset(_filter_string, 0, sizeof(_filter_string)); - strcpy(_filter_string, text); + safe_strncpy(_filter_string, text, sizeof(_filter_string)); } filter_update_counts(); @@ -2013,8 +2014,8 @@ static bool filter_string(rct_object_entry *entry) char name_lower[MAX_PATH]; char filter_lower[sizeof(_filter_string)]; - strcpy(name_lower, name); - strcpy(filter_lower, _filter_string); + safe_strncpy(name_lower, name, MAX_PATH); + safe_strncpy(filter_lower, _filter_string, sizeof(_filter_string)); for (int i = 0; i < (int)strlen(name_lower); i++) name_lower[i] = (char)tolower(name_lower[i]); diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index bf7f5a26b4..9dd1d28e63 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -29,6 +29,7 @@ #include "dropdown.h" #include "error.h" #include "../interface/themes.h" +#include "../util/util.h" #pragma region Widgets @@ -405,11 +406,11 @@ static void window_editor_objective_options_main_mouseup(rct_window *w, int widg window_text_input_open(w, WIDX_PARK_NAME, STR_PARK_NAME, STR_ENTER_PARK_NAME, RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id), 0, 32); break; case WIDX_SCENARIO_NAME: - strcpy((char*)0x009BC677, s6Info->name); + safe_strncpy((char*)0x009BC677, s6Info->name, 64); window_text_input_open(w, WIDX_SCENARIO_NAME, 3313, 3314, 3165, 0, 32); break; case WIDX_DETAILS: - strcpy((char*)0x009BC677, s6Info->details); + safe_strncpy((char*)0x009BC677, s6Info->details, 256); window_text_input_open(w, WIDX_DETAILS, 3315, 3316, 3165, 0, 256); break; } @@ -1002,7 +1003,7 @@ static void window_editor_objective_options_main_paint(rct_window *w, rct_drawpi if (stex != NULL) { RCT2_GLOBAL(0x013CE952 + 0, uint16) = stex->scenario_name; } else { - strcpy((char*)0x009BC677, s6Info->name); + safe_strncpy((char*)0x009BC677, s6Info->name, 64); RCT2_GLOBAL(0x013CE952 + 0, uint16) = 3165; } RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x0013573D8, uint32); @@ -1021,7 +1022,7 @@ static void window_editor_objective_options_main_paint(rct_window *w, rct_drawpi if (stex != NULL) { RCT2_GLOBAL(0x013CE952 + 0, uint16) = stex->details; } else { - strcpy((char*)0x009BC677, s6Info->details); + safe_strncpy((char*)0x009BC677, s6Info->details, 256); RCT2_GLOBAL(0x013CE952 + 0, uint16) = 3165; } RCT2_GLOBAL(0x013CE952 + 2, uint32) = RCT2_GLOBAL(0x0013573D8, uint32); diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index a5da1ea182..cf57c1442a 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -221,7 +221,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) } */ - strcpy(path, RCT2_ADDRESS(RCT2_ADDRESS_SCENARIOS_PATH, char)); + safe_strncpy(path, RCT2_ADDRESS(RCT2_ADDRESS_SCENARIOS_PATH, char), MAX_PATH); ch = strchr(path, '*'); if (ch != NULL) *ch = 0; @@ -240,7 +240,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) } */ - strcpy(path, RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char)); + safe_strncpy(path, RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), MAX_PATH); ch = strchr(path, '*'); if (ch != NULL) *ch = 0; @@ -273,12 +273,12 @@ static void window_loadsave_mouseup(rct_window *w, int widgetIndex) window_close(w); break; case WIDX_BROWSE: - strcpy(filename, _directory); + safe_strncpy(filename, _directory, MAX_PATH); if (_type & LOADSAVETYPE_SAVE) strcat(filename, (char*)RCT2_ADDRESS_SCENARIO_NAME); memset(filter, '\0', MAX_PATH); - strncpy(filter, "*", MAX_PATH); + safe_strncpy(filter, "*", MAX_PATH); strncat(filter, _extension, MAX_PATH); switch (_type) { @@ -375,7 +375,7 @@ static void window_loadsave_scrollmousedown(rct_window *w, int scrollIndex, int includeNewItem = (_type & 1) == LOADSAVETYPE_SAVE; char directory[MAX_PATH]; - strncpy(directory, _listItems[selectedItem].path, sizeof(directory)); + safe_strncpy(directory, _listItems[selectedItem].path, sizeof(directory)); window_loadsave_populate_list(includeNewItem, true, directory, _extension); window_init_scroll_widgets(w); @@ -428,7 +428,7 @@ static void window_loadsave_textinput(rct_window *w, int widgetIndex, char *text return; } - strncpy(path, _directory, sizeof(path)); + safe_strncpy(path, _directory, sizeof(path)); strncat(path, text, sizeof(path) - strnlen(path, MAX_PATH) - 1); strncat(path, _extension, sizeof(path) - strnlen(path, MAX_PATH) - 1); @@ -469,7 +469,7 @@ static void window_loadsave_paint(rct_window *w, rct_drawpixelinfo *dpi) utf8 *ch = buffer; ch = utf8_write_codepoint(ch, FORMAT_MEDIUMFONT); ch = utf8_write_codepoint(ch, FORMAT_BLACK); - strcpy(ch, _shortenedDirectory); + safe_strncpy(ch, _shortenedDirectory, sizeof(buffer) - (ch - buffer)); // Draw shadow gfx_draw_string(dpi, buffer, 0, w->x + 4, w->y + 20); @@ -599,14 +599,14 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co const char *src; char *dst, filter[MAX_PATH], subDir[MAX_PATH]; - strncpy(_directory, directory, sizeof(_directory)); + safe_strncpy(_directory, directory, sizeof(_directory)); if (_extension != extension) { - strncpy(_extension, extension, sizeof(_extension)); + safe_strncpy(_extension, extension, sizeof(_extension)); _extension[sizeof(_extension) - 1] = '\0'; } _shortenedDirectory[0] = '\0'; - strncpy(filter, directory, sizeof(filter)); + safe_strncpy(filter, directory, sizeof(filter)); strncat(filter, "*", sizeof(filter) - strnlen(filter, MAX_PATH) - 1); strncat(filter, extension, sizeof(filter) - strnlen(filter, MAX_PATH) - 1); @@ -638,15 +638,15 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co } if (!topLevel){ listItem = &_listItems[_listItemsCount]; - strncpy(listItem->name, language_get_string(2718), sizeof(listItem->name)); + safe_strncpy(listItem->name, language_get_string(2718), sizeof(listItem->name)); memset(listItem->path, '\0', MAX_PATH); - strncpy(listItem->path, directory, lastSlash + 1); + safe_strncpy(listItem->path, directory, lastSlash + 1); listItem->type = TYPE_UP; _listItemsCount++; } else if (platform_get_drives() != 0 && directory[0] != '\0'){ includeNewItem = false; listItem = &_listItems[_listItemsCount]; - strncpy(listItem->name, language_get_string(2718), sizeof(listItem->name)); + safe_strncpy(listItem->name, language_get_string(2718), sizeof(listItem->name)); memset(listItem->path, '\0', MAX_PATH); listItem->type = TYPE_UP; _listItemsCount++; @@ -655,7 +655,7 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co if (includeNewItem) { listItem = &_listItems[_listItemsCount]; - strncpy(listItem->name, language_get_string(2719), sizeof(listItem->name)); + safe_strncpy(listItem->name, language_get_string(2719), sizeof(listItem->name)); listItem->path[0] = '\0'; listItem->type = TYPE_NEW_FILE; _listItemsCount++; @@ -673,9 +673,9 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co listItem = &_listItems[_listItemsCount]; memset(listItem->path, '\0', MAX_PATH); - strncpy(listItem->path, directory, MAX_PATH); + safe_strncpy(listItem->path, directory, MAX_PATH); strncat(listItem->path, subDir, MAX_PATH); - strncpy(listItem->name, subDir, sizeof(listItem->name)); + safe_strncpy(listItem->name, subDir, sizeof(listItem->name)); listItem->type = TYPE_DIRECTORY; _listItemsCount++; } @@ -691,7 +691,7 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co } listItem = &_listItems[_listItemsCount]; - strncpy(listItem->path, directory, sizeof(listItem->path)); + safe_strncpy(listItem->path, directory, sizeof(listItem->path)); strncat(listItem->path, fileInfo.path, sizeof(listItem->path)); listItem->type = TYPE_FILE; listItem->date_modified = platform_file_get_modified_time(listItem->path); @@ -739,7 +739,7 @@ static void window_loadsave_select(rct_window *w, const char *path) if (gLoadSaveTitleSequenceSave) { utf8 newName[MAX_PATH]; char *extension = (char*)path_get_extension(path_get_filename(path)); - strcpy(newName, path_get_filename(path)); + safe_strncpy(newName, path_get_filename(path), MAX_PATH); if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) strcat(newName, ".sv6"); if (title_sequence_save_exists(gCurrentTitleSequence, newName)) { @@ -756,7 +756,7 @@ static void window_loadsave_select(rct_window *w, const char *path) network_begin_server(gConfigNetwork.default_port); } - strcpy(gScenarioSaveName, path_get_filename(path)); + safe_strncpy(gScenarioSaveName, path_get_filename(path), MAX_PATH); path_remove_extension(gScenarioSaveName); gFirstTimeSave = 0; @@ -776,7 +776,7 @@ static void window_loadsave_select(rct_window *w, const char *path) SDL_RWclose(rw); if (success) { - strcpy(gScenarioSaveName, path_get_filename(path)); + safe_strncpy(gScenarioSaveName, path_get_filename(path), MAX_PATH); path_remove_extension(gScenarioSaveName); gFirstTimeSave = 0; @@ -921,10 +921,8 @@ static rct_window *window_overwrite_prompt_open(const char *name, const char *pa w->flags |= WF_TRANSPARENT; w->colours[0] = 154; - strncpy(_window_overwrite_prompt_name, name, sizeof(_window_overwrite_prompt_name)); - _window_overwrite_prompt_name[sizeof(_window_overwrite_prompt_name) - 1] = '\0'; - strncpy(_window_overwrite_prompt_path, path, sizeof(_window_overwrite_prompt_path)); - _window_overwrite_prompt_path[sizeof(_window_overwrite_prompt_path) - 1] = '\0'; + safe_strncpy(_window_overwrite_prompt_name, name, sizeof(_window_overwrite_prompt_name)); + safe_strncpy(_window_overwrite_prompt_path, path, sizeof(_window_overwrite_prompt_path)); return w; } diff --git a/src/windows/network_status.c b/src/windows/network_status.c index 7073aaf203..cadcbe99b9 100644 --- a/src/windows/network_status.c +++ b/src/windows/network_status.c @@ -22,6 +22,7 @@ #include "../interface/widget.h" #include "../interface/window.h" #include "../localisation/localisation.h" +#include "../util/util.h" #include "../network/network.h" enum WINDOW_NETWORK_STATUS_WIDGET_IDX { @@ -79,7 +80,7 @@ void window_network_status_open(const char* text) { rct_window* window; - strncpy(window_network_status_text, text, sizeof(window_network_status_text)); + safe_strncpy(window_network_status_text, text, sizeof(window_network_status_text)); // Check if window is already open window = window_bring_to_front_by_class(WC_NETWORK_STATUS); diff --git a/src/windows/options.c b/src/windows/options.c index 22527eb959..ed8230929c 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -43,6 +43,7 @@ #include "../title.h" #include "dropdown.h" #include "error.h" +#include "../util/util.h" enum WINDOW_OPTIONS_PAGE { WINDOW_OPTIONS_PAGE_DISPLAY, @@ -1039,8 +1040,7 @@ static void window_options_dropdown(rct_window *w, int widgetIndex, int dropdown char* devicename = gAudioDevices[dropdownIndex].name; Mixer_Init(devicename); SafeFree(gConfigSound.device); - gConfigSound.device = malloc(strlen(devicename) + 1); - strcpy(gConfigSound.device, devicename); + gConfigSound.device = strndup(devicename, AUDIO_DEVICE_NAME_SIZE); } config_save_default(); } diff --git a/src/windows/park.c b/src/windows/park.c index 94f27632cd..8f761e9f31 100644 --- a/src/windows/park.c +++ b/src/windows/park.c @@ -1745,7 +1745,7 @@ static void window_park_objective_paint(rct_window *w, rct_drawpixelinfo *dpi) // Scenario description x = w->x + window_park_objective_widgets[WIDX_PAGE_BACKGROUND].left + 4; y = w->y + window_park_objective_widgets[WIDX_PAGE_BACKGROUND].top + 7; - strcpy((char*)0x009BC677, RCT2_ADDRESS(RCT2_ADDRESS_SCENARIO_DETAILS, char)); + safe_strncpy((char*)0x009BC677, RCT2_ADDRESS(RCT2_ADDRESS_SCENARIO_DETAILS, char), 256); RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = 3165; y += gfx_draw_string_left_wrapped(dpi, (void*)0x013CE952, x, y, 222, 1191, 0); y += 5; diff --git a/src/windows/player_list.c b/src/windows/player_list.c index 8733f05780..e342dc4325 100644 --- a/src/windows/player_list.c +++ b/src/windows/player_list.c @@ -25,6 +25,7 @@ #include "../network/network.h" #include "../sprites.h" #include "../windows/dropdown.h" +#include "../util/util.h" enum WINDOW_PLAYER_LIST_WIDGET_IDX { WIDX_BACKGROUND, @@ -282,7 +283,7 @@ static void window_player_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi int colour = 0; if (i == w->selected_list_item) { gfx_fill_rect(dpi, 0, y, 800, y + 9, 0x02000031); - strcpy(&buffer[0], network_get_player_name(i)); + safe_strncpy(&buffer[0], network_get_player_name(i), sizeof(buffer)); colour = w->colours[2]; } else { if (network_get_player_flags(i) & NETWORK_PLAYER_FLAG_ISSERVER) { @@ -290,7 +291,7 @@ static void window_player_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi } else { lineCh = utf8_write_codepoint(lineCh, FORMAT_BLACK); } - strcpy(lineCh, network_get_player_name(i)); + safe_strncpy(lineCh, network_get_player_name(i), sizeof(buffer) - (lineCh - buffer)); } gfx_clip_string(buffer, 230); gfx_draw_string(dpi, buffer, colour, 0, y - 1); diff --git a/src/windows/server_list.c b/src/windows/server_list.c index 2be9576779..fb10c4442d 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -24,6 +24,7 @@ #include "../localisation/localisation.h" #include "../network/network.h" #include "../sprites.h" +#include "../util/util.h" #include "error.h" #define WWIDTH_MIN 500 @@ -158,7 +159,7 @@ void window_server_list_open() window_set_resize(window, WWIDTH_MIN, WHEIGHT_MIN, WWIDTH_MAX, WHEIGHT_MAX); - strncpy(_playerName, gConfigNetwork.player_name, sizeof(_playerName)); + safe_strncpy(_playerName, gConfigNetwork.player_name, sizeof(_playerName)); server_list_load_saved_servers(); window->no_list_items = _numSavedServers; @@ -277,7 +278,7 @@ static void window_server_list_textinput(rct_window *w, int widgetIndex, char *t memset(_playerName, 0, sizeof(_playerName)); } else { memset(_playerName, 0, sizeof(_playerName)); - strcpy(_playerName, text); + safe_strncpy(_playerName, text, sizeof(_playerName)); } widget_invalidate(w, WIDX_PLAYER_NAME_INPUT); diff --git a/src/windows/text_input.c b/src/windows/text_input.c index 19aff71d4b..a990d07905 100644 --- a/src/windows/text_input.c +++ b/src/windows/text_input.c @@ -125,7 +125,7 @@ void window_text_input_open(rct_window* call_w, int call_widget, rct_string_id t // Work out the existing size of the window char wrapped_string[512]; - strcpy(wrapped_string, text_input); + safe_strncpy(wrapped_string, text_input, 512); int no_lines = 0, font_height = 0; @@ -175,7 +175,7 @@ void window_text_input_raw_open(rct_window* call_w, int call_widget, rct_string_ // Enter in the the text input buffer any existing // text. if (existing_text != NULL) - strncpy(text_input, existing_text, maxLength); + safe_strncpy(text_input, existing_text, maxLength); // In order to prevent strings that exceed the maxLength // from crashing the game. @@ -186,7 +186,7 @@ void window_text_input_raw_open(rct_window* call_w, int call_widget, rct_string_ // Work out the existing size of the window char wrapped_string[512]; - strcpy(wrapped_string, text_input); + safe_strncpy(wrapped_string, text_input, 512); int no_lines = 0, font_height = 0; @@ -273,7 +273,7 @@ static void window_text_input_paint(rct_window *w, rct_drawpixelinfo *dpi) RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16) = 0; char wrapped_string[512]; - strcpy(wrapped_string, text_input); + safe_strncpy(wrapped_string, text_input, 512); // String length needs to add 12 either side of box // +13 for cursor when max length. @@ -389,7 +389,7 @@ static void window_text_input_invalidate(rct_window *w) { // Work out the existing size of the window char wrapped_string[512]; - strcpy(wrapped_string, text_input); + safe_strncpy(wrapped_string, text_input, 512); int no_lines = 0, font_height = 0; @@ -412,4 +412,4 @@ static void window_text_input_invalidate(rct_window *w) window_text_input_widgets[WIDX_CANCEL].bottom = height - 10; window_text_input_widgets[WIDX_BACKGROUND].bottom = height - 1; -} \ No newline at end of file +} diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index e2631f5ade..8a4bd3a2e4 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -1,5 +1,5 @@ /***************************************************************************** -* Copyright (c) 2014 Maciek Baron, Dniel Tar +* Copyright (c) 2014 Maciek Baron, D�niel Tar * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. * * This file is part of OpenRCT2. @@ -360,7 +360,7 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex) case WIDX_TITLE_EDITOR_LOAD: if (w->selected_list_item != -1) { if (gConfigTitleSequences.presets[gCurrentTitleSequence].path[0]) { - strcpy(path, gConfigTitleSequences.presets[gCurrentTitleSequence].path); + safe_strncpy(path, gConfigTitleSequences.presets[gCurrentTitleSequence].path, MAX_PATH); } else { platform_get_user_directory(path, "title sequences"); diff --git a/src/windows/title_scenarioselect.c b/src/windows/title_scenarioselect.c index 079f766059..58dbeb6a29 100644 --- a/src/windows/title_scenarioselect.c +++ b/src/windows/title_scenarioselect.c @@ -28,6 +28,7 @@ #include "../interface/widget.h" #include "../interface/window.h" #include "../interface/themes.h" +#include "../util/util.h" enum { WIDX_BACKGROUND, @@ -285,13 +286,13 @@ static void window_scenarioselect_paint(rct_window *w, rct_drawpixelinfo *dpi) // Scenario name x = w->x + window_scenarioselect_widgets[WIDX_SCENARIOLIST].right + 4; y = w->y + window_scenarioselect_widgets[WIDX_TABCONTENT].top + 5; - strcpy((char*)0x009BC677, scenario->name); + safe_strncpy((char*)0x009BC677, scenario->name, 64); RCT2_GLOBAL(0x013CE952 + 0, short) = 3165; gfx_draw_string_centred_clipped(dpi, 1193, (void*)0x013CE952, 0, x + 85, y, 170); y += 15; // Scenario details - strcpy((char*)0x009BC677, scenario->details); + safe_strncpy((char*)0x009BC677, scenario->details, 256); RCT2_GLOBAL(0x013CE952 + 0, short) = 3165; y += gfx_draw_string_left_wrapped(dpi, (void*)0x013CE952, x, y, 170, 1191, 0) + 5; @@ -304,7 +305,7 @@ static void window_scenarioselect_paint(rct_window *w, rct_drawpixelinfo *dpi) // Scenario score if (scenario->flags & SCENARIO_FLAGS_COMPLETED) { - strcpy((char*)0x009BC677, scenario->completed_by); + safe_strncpy((char*)0x009BC677, scenario->completed_by, 64); RCT2_GLOBAL(0x013CE952 + 0, short) = 3165; RCT2_GLOBAL(0x013CE952 + 2, int) = scenario->company_value; y += gfx_draw_string_left_wrapped(dpi, (void*)0x013CE952, x, y, 170, STR_COMPLETED_BY_WITH_COMPANY_VALUE, 0); @@ -341,7 +342,7 @@ static void window_scenarioselect_scrollpaint(rct_window *w, rct_drawpixelinfo * gfx_fill_rect(dpi, 0, y, w->width, y + 23, 0x02000031); // Draw scenario name - strcpy((char*)0x009BC677, scenario->name); + safe_strncpy((char*)0x009BC677, scenario->name, 64); RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = 3165; gfx_draw_string_centred(dpi, highlighted ? highlighted_format : unhighlighted_format, 210, y + 1, 0, (void*)0x013CE952); @@ -351,7 +352,7 @@ static void window_scenarioselect_scrollpaint(rct_window *w, rct_drawpixelinfo * gfx_draw_sprite(dpi, 0x5A9F, 395, y + 1, 0); // Draw completion score - strcpy((char*)0x009BC677, scenario->completed_by); + safe_strncpy((char*)0x009BC677, scenario->completed_by, 64); RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = 2793; RCT2_GLOBAL(0x013CE954, short) = 3165; gfx_draw_string_centred(dpi, highlighted ? 1193 : 1191, 210, y + 11, 0, (void*)0x013CE952); diff --git a/src/windows/tooltip.c b/src/windows/tooltip.c index d8edd3dd65..724e42e331 100644 --- a/src/windows/tooltip.c +++ b/src/windows/tooltip.c @@ -225,5 +225,5 @@ static void window_tooltip_paint(rct_window *w, rct_drawpixelinfo *dpi) // Text left = w->x + ((w->width + 1) / 2) - 1; top = w->y + 1; - draw_string_centred_raw(dpi, left, top, RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TEXT_HEIGHT, uint16), gTooltip_text_buffer); -} \ No newline at end of file + draw_string_centred_raw(dpi, left, top, RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TEXT_HEIGHT, uint16), (char *)gTooltip_text_buffer); +} From 45b3d8362d7f608ab3c4abe40f0644ffac8cd123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 30 Oct 2015 16:08:49 +0100 Subject: [PATCH 0927/1173] Provide strndup implementation for platforms missing it --- src/platform/platform.h | 4 ++++ src/platform/windows.c | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/platform/platform.h b/src/platform/platform.h index 7c71c3ea64..75e568da43 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -181,4 +181,8 @@ bool platform_check_steam_overlay_attached(); #endif // __linux__ +#if !(POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) + char *strndup(const char *src, size_t size); +#endif // !(POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) + #endif diff --git a/src/platform/windows.c b/src/platform/windows.c index 1b76c7df70..c3c4434660 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -846,4 +846,19 @@ bool platform_check_steam_overlay_attached() { return GetModuleHandle("GameOverlayRenderer.dll") != NULL; } + +char *strndup(const char *src, size_t size) +{ + size_t len = strnlen(src, size); + char *dst = (char *)malloc(len + 1); + + if (dst == NULL) + { + return NULL; + } + + dst = memcpy(dst, src, len); + dst[len] = '\0'; + return (char *)dst; +} #endif From 9a76c59ec9a0402bdc998c2a92f8eac9e68ee37f Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Wed, 28 Oct 2015 22:03:37 +0000 Subject: [PATCH 0928/1173] Fix entrance drawing issue. Fixes #2164. --- src/interface/viewport.c | 39 +++++++++++++++++++++------------------ src/interface/viewport.h | 4 ++-- src/ride/track_paint.c | 30 +++++++++++++++--------------- 3 files changed, 38 insertions(+), 35 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 589633c671..20d5a872f8 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -815,21 +815,21 @@ void sub_688485(){ } /* rct2: 0x006874B0, 0x00687618, 0x0068778C, 0x00687902, 0x0098199C */ -int sub_98199C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_x, sint16 length_y, uint32 rotation){ +int sub_98199C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_y, sint16 length_x, uint32 rotation){ RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], al | (ah << 8), image_id, cl, height, - length_x, length_y, + length_x, rotation); return 1; } /* rct2: 0x00686806, 0x006869B2, 0x00686B6F, 0x00686D31, 0x0098197C */ -int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_x, sint16 length_y, uint32 rotation){ - int ebp = ah + RCT2_GLOBAL(0x9DEA56, uint16); +int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_y, sint16 length_x, uint32 rotation){ + int ebp = ah + RCT2_GLOBAL(0x9DEA56, sint16); RCT2_GLOBAL(0xF1AD28, paint_struct*) = 0; RCT2_GLOBAL(0xF1AD2C, uint32) = 0; @@ -907,25 +907,25 @@ int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 le // Unsure why rots 1 and 3 need to swap switch (rotation){ - case 0: - rotate_map_coordinates(&boundBox.x, &boundBox.y, 0); - rotate_map_coordinates(&s_unk.x, &s_unk.y, 0); + case 0: boundBox.x--; boundBox.y--; + rotate_map_coordinates(&s_unk.x, &s_unk.y, 0); + rotate_map_coordinates(&boundBox.x, &boundBox.y, 0); break; case 1: - rotate_map_coordinates(&boundBox.x, &boundBox.y, 3); + boundBox.x--; rotate_map_coordinates(&s_unk.x, &s_unk.y, 3); - boundBox.y--; + rotate_map_coordinates(&boundBox.x, &boundBox.y, 3); break; case 2: rotate_map_coordinates(&boundBox.x, &boundBox.y, 2); rotate_map_coordinates(&s_unk.x, &s_unk.y, 2); break; case 3: + boundBox.y--; rotate_map_coordinates(&boundBox.x, &boundBox.y, 1); rotate_map_coordinates(&s_unk.x, &s_unk.y, 1); - boundBox.x--; break; } @@ -1227,7 +1227,10 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma sint8 ah = is_exit ? 0x23 : 0x33; - sub_98197C(0, ah, image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sint16 lengthY = (direction & 1) ? 28 : 2; + sint16 lengthX = (direction & 1) ? 2 : 28; + + sub_98197C(0, ah, image_id, 0, height, lengthY, lengthX, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); if (transparant_image_id){ if (is_exit){ @@ -1240,24 +1243,24 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98199C(0, ah, transparant_image_id, 0, height, 2, 0x1C, 0); + sub_98199C(0, ah, transparant_image_id, 0, height, lengthY, lengthX, 0); } image_id += 4; - RCT2_GLOBAL(0x009DEA52, uint16) = 2; - RCT2_GLOBAL(0x009DEA54, uint16) = 28; + RCT2_GLOBAL(0x009DEA52, uint16) = (direction & 1) ? 28 : 2; + RCT2_GLOBAL(0x009DEA54, uint16) = (direction & 1) ? 2 : 28; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(0, ah, image_id, 0, height, 2, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, ah, image_id, 0, height, lengthY, lengthX, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); if (transparant_image_id){ transparant_image_id += 4; - RCT2_GLOBAL(0x009DEA52, uint16) = 2; - RCT2_GLOBAL(0x009DEA54, uint16) = 28; + RCT2_GLOBAL(0x009DEA52, uint16) = (direction & 1) ? 28 : 2; + RCT2_GLOBAL(0x009DEA54, uint16) = (direction & 1) ? 2 : 28; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98199C(0, ah, transparant_image_id, 0, height, 2, 0x1C, 0); + sub_98199C(0, ah, transparant_image_id, 0, height, lengthY, lengthX, 0); } uint32 eax = 0xFFFF0600 | ((height / 16) & 0xFF); diff --git a/src/interface/viewport.h b/src/interface/viewport.h index d13305eb17..d416a96494 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -131,8 +131,8 @@ void painter_setup(); void sub_688485(); void sub_688217(); -int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_x, sint16 length_y, uint32 rotation); -int sub_98199C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_x, sint16 length_y, uint32 rotation); +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); void viewport_invalidate(rct_viewport *viewport, int left, int top, int right, int bottom); diff --git a/src/ride/track_paint.c b/src/ride/track_paint.c index c923988399..5f6f0c2f2a 100644 --- a/src/ride/track_paint.c +++ b/src/ride/track_paint.c @@ -248,9 +248,9 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction RCT2_GLOBAL(0x009DEA56, sint16) = height; //di - uint8 lengthY = 24; - //si uint8 lengthX = 24; + //si + uint8 lengthY = 24; uint32 image_id = RCT2_GLOBAL(0x00F441A0, uint32); if (image_id == 0x20000000) { @@ -265,7 +265,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction // Left back bottom support image_id += 572; - sub_98197C(al, 90, image_id, cl, height, lengthX, lengthY, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(al, 90, image_id, cl, height, lengthY, lengthX, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); image_id = RCT2_GLOBAL(0x00F441A0, uint32); if (image_id == 0x20000000) { @@ -293,8 +293,8 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id, cl, height, - lengthX, - lengthY, + lengthY, + lengthX, 0); uint32 seatImageId; @@ -356,8 +356,8 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id, (sint8)seatCoords.y, seatCoords.z, - lengthX, - lengthY, + lengthY, + lengthX, 0); rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); @@ -369,7 +369,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id += 0xA0000000; image_id += 76; - sub_98199C((sint8)seatCoords.x, 90, image_id, (sint8)seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + sub_98199C((sint8)seatCoords.x, 90, image_id, (sint8)seatCoords.y, seatCoords.z, lengthY, lengthX, 0); if (vehicle->num_peeps > 2) { image_id = @@ -379,7 +379,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id += 0xA0000000; image_id += 152; - sub_98199C((sint8)seatCoords.x, 90, image_id, (sint8)seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + sub_98199C((sint8)seatCoords.x, 90, image_id, (sint8)seatCoords.y, seatCoords.z, lengthY, lengthX, 0); } if (vehicle->num_peeps > 4) { @@ -390,7 +390,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id += 0xA0000000; image_id += 228; - sub_98199C((sint8)seatCoords.x, 90, image_id, (sint8)seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + sub_98199C((sint8)seatCoords.x, 90, image_id, (sint8)seatCoords.y, seatCoords.z, lengthY, lengthX, 0); } if (vehicle->num_peeps > 6) { @@ -401,7 +401,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id += 0xA0000000; image_id += 304; - sub_98199C((sint8)seatCoords.x, 90, image_id, (sint8)seatCoords.y, seatCoords.z, lengthX, lengthY, 0); + sub_98199C((sint8)seatCoords.x, 90, image_id, (sint8)seatCoords.y, seatCoords.z, lengthY, lengthX, 0); } } @@ -425,8 +425,8 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id, cl, height, - lengthX, - lengthY, + lengthY, + lengthX, 0); image_id = RCT2_GLOBAL(0x00F441A0, uint32); @@ -448,8 +448,8 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id, cl, height, - lengthX, - lengthY, + lengthY, + lengthX, 0); RCT2_GLOBAL(0x009DE578, rct_map_element*) = curMapElement; From 6c5acdde6a468d4ba143dcdd66a9e917f5a45f11 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Fri, 30 Oct 2015 19:41:49 -0600 Subject: [PATCH 0929/1173] fix #2161 --- src/peep/peep.c | 4 ++-- src/ride/ride.c | 4 ++-- src/world/park.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index e5b8ece6da..d1d06e3ec7 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -9021,12 +9021,12 @@ money32 set_peep_name(int flags, int state, uint16 sprite_index, uint8* text_1, } utf8* fullText = RCT2_ADDRESS(0x00F1AEF6, utf8); - if (flags & GAME_COMMAND_FLAG_APPLY) { + //if (flags & GAME_COMMAND_FLAG_APPLY) { // this check seems to be useless and causes problems in multiplayer uint8 position = (state - 1) % 3; memcpy(fullText + position * 12, text_1, 4); memcpy(fullText + 4 + position * 12, text_2, 4); memcpy(fullText + 8 + position * 12, text_3, 4); - } + //} if (state != 0) return 0; diff --git a/src/ride/ride.c b/src/ride/ride.c index fcbf42edbb..dc97e233ce 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4919,7 +4919,7 @@ void game_command_set_ride_name(int *eax, int *ebx, int *ecx, int *edx, int *esi int nameChunkIndex = *eax & 0xFFFF; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_RUNNING_COSTS * 4; - if (*ebx & GAME_COMMAND_FLAG_APPLY) { + //if (*ebx & GAME_COMMAND_FLAG_APPLY) { // this check seems to be useless and causes problems in multiplayer int nameChunkOffset = nameChunkIndex - 1; if (nameChunkOffset < 0) nameChunkOffset = 2; @@ -4927,7 +4927,7 @@ void game_command_set_ride_name(int *eax, int *ebx, int *ecx, int *edx, int *esi RCT2_GLOBAL(newName + nameChunkOffset + 0, uint32) = *edx; RCT2_GLOBAL(newName + nameChunkOffset + 4, uint32) = *ebp; RCT2_GLOBAL(newName + nameChunkOffset + 8, uint32) = *edi; - } + //} if (nameChunkIndex != 0) { *ebx = 0; diff --git a/src/world/park.c b/src/world/park.c index 5f22410873..61ea797a8f 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -869,7 +869,7 @@ void game_command_set_park_name(int *eax, int *ebx, int *ecx, int *edx, int *esi int nameChunkIndex = *eax & 0xFFFF; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; - if (*ebx & GAME_COMMAND_FLAG_APPLY) { + //if (*ebx & GAME_COMMAND_FLAG_APPLY) { // this check seems to be useless and causes problems in multiplayer int nameChunkOffset = nameChunkIndex - 1; if (nameChunkOffset < 0) nameChunkOffset = 2; @@ -877,7 +877,7 @@ void game_command_set_park_name(int *eax, int *ebx, int *ecx, int *edx, int *esi RCT2_GLOBAL(newName + nameChunkOffset + 0, uint32) = *edx; RCT2_GLOBAL(newName + nameChunkOffset + 4, uint32) = *ebp; RCT2_GLOBAL(newName + nameChunkOffset + 8, uint32) = *edi; - } + //} if (nameChunkIndex != 0) { *ebx = 0; From a95357a32d3e440dcf08885e43b4b0b0a636639c Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sat, 31 Oct 2015 02:25:43 -0600 Subject: [PATCH 0930/1173] signs and banners editable in multiplayer --- src/game.c | 10 ++- src/game.h | 6 +- src/windows/banner.c | 53 ++--------- src/windows/sign.c | 110 ++++++----------------- src/world/map.c | 210 +++++++++++++++++++++++++++++++++++++++++++ src/world/map.h | 4 + 6 files changed, 260 insertions(+), 133 deletions(-) diff --git a/src/game.c b/src/game.c index b16a705913..f603d93422 100644 --- a/src/game.c +++ b/src/game.c @@ -404,7 +404,7 @@ static int game_check_affordability(int cost) return MONEY32_UNDEFINED; } -static GAME_COMMAND_POINTER* new_game_command_table[58]; +static GAME_COMMAND_POINTER* new_game_command_table[62]; /** * @@ -1131,7 +1131,7 @@ void game_load_or_quit_no_save_prompt() } } -static GAME_COMMAND_POINTER* new_game_command_table[58] = { +static GAME_COMMAND_POINTER* new_game_command_table[62] = { game_command_set_ride_appearance, game_command_set_land_height, game_pause_toggle, @@ -1189,5 +1189,9 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_set_large_scenery_colour, game_command_set_banner_colour, game_command_set_land_ownership, - game_command_clear_scenery + game_command_clear_scenery, + game_command_set_banner_name, + game_command_set_sign_name, + game_command_set_banner_style, + game_command_set_sign_style }; diff --git a/src/game.h b/src/game.h index ec806a8cc4..286c21fb1f 100644 --- a/src/game.h +++ b/src/game.h @@ -83,7 +83,11 @@ enum GAME_COMMAND { GAME_COMMAND_SET_LARGE_SCENERY_COLOUR, GAME_COMMAND_SET_BANNER_COLOUR, GAME_COMMAND_SET_LAND_OWNERSHIP, - GAME_COMMAND_CLEAR_SCENERY + GAME_COMMAND_CLEAR_SCENERY, + GAME_COMMAND_SET_BANNER_NAME, + GAME_COMMAND_SET_SIGN_NAME, + GAME_COMMAND_SET_BANNER_STYLE, + GAME_COMMAND_SET_SIGN_STYLE }; enum { diff --git a/src/windows/banner.c b/src/windows/banner.c index 01f6d4ec1d..d084a8de62 100644 --- a/src/windows/banner.c +++ b/src/windows/banner.c @@ -199,13 +199,7 @@ static void window_banner_mouseup(rct_window *w, int widgetIndex) break; case WIDX_BANNER_NO_ENTRY: textinput_cancel(); - banner->flags ^= BANNER_FLAG_NO_ENTRY; - window_invalidate(w); - - map_element->properties.banner.flags = 0xFF; - if (banner->flags & BANNER_FLAG_NO_ENTRY){ - map_element->properties.banner.flags &= ~(1 << map_element->properties.banner.position); - } + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, banner->colour, GAME_COMMAND_SET_BANNER_STYLE, banner->text_colour, banner->flags ^ BANNER_FLAG_NO_ENTRY); break; } } @@ -254,35 +248,13 @@ static void window_banner_dropdown(rct_window *w, int widgetIndex, int dropdownI if (dropdownIndex == -1) break; - banner->colour = (uint8)dropdownIndex; - window_invalidate(w); + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, dropdownIndex, GAME_COMMAND_SET_BANNER_STYLE, banner->text_colour, 0); break; case WIDX_TEXT_COLOR_DROPDOWN_BUTTON: if (dropdownIndex == -1) break; - banner->text_colour = dropdownIndex + 1; - - int colourCodepoint = FORMAT_COLOUR_CODE_START + banner->text_colour; - - uint8 buffer[256]; - format_string(buffer, banner->string_idx, 0); - int firstCodepoint = utf8_get_next(buffer, NULL); - if (firstCodepoint >= FORMAT_COLOUR_CODE_START && firstCodepoint <= FORMAT_COLOUR_CODE_END) { - utf8_write_codepoint(buffer, colourCodepoint); - } else { - utf8_insert_codepoint(buffer, colourCodepoint); - } - - rct_string_id stringId = user_string_allocate(128, buffer); - if (stringId != 0) { - rct_string_id prev_string_id = banner->string_idx; - banner->string_idx = stringId; - user_string_free(prev_string_id); - window_invalidate(w); - } else { - window_error_open(2984, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id)); - } + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, banner->colour, GAME_COMMAND_SET_BANNER_STYLE, dropdownIndex + 1, 0); break; } } @@ -291,22 +263,9 @@ static void window_banner_dropdown(rct_window *w, int widgetIndex, int dropdownI static void window_banner_textinput(rct_window *w, int widgetIndex, char *text) { if (widgetIndex == WIDX_BANNER_TEXT && text != NULL) { - rct_banner* banner = &gBanners[w->number]; - - utf8 *buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, uint8); - utf8 *dst = buffer; - dst = utf8_write_codepoint(dst, FORMAT_COLOUR_CODE_START + banner->text_colour); - strncpy(dst, text, 32); - - rct_string_id stringId = user_string_allocate(128, buffer); - if (stringId) { - rct_string_id prev_string_id = banner->string_idx; - banner->string_idx = stringId; - user_string_free(prev_string_id); - window_invalidate(w); - } else { - window_error_open(2984, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id)); - } + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 0)), GAME_COMMAND_SET_BANNER_NAME, *((int*)(text + 8)), *((int*)(text + 4))); + game_do_command(2, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 12)), GAME_COMMAND_SET_BANNER_NAME, *((int*)(text + 20)), *((int*)(text + 16))); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 24)), GAME_COMMAND_SET_BANNER_NAME, *((int*)(text + 32)), *((int*)(text + 28))); } } diff --git a/src/windows/sign.c b/src/windows/sign.c index d1e288a816..23f2eb85be 100644 --- a/src/windows/sign.c +++ b/src/windows/sign.c @@ -187,8 +187,10 @@ void window_sign_open(rct_windownumber number) int view_z = map_element->base_height << 3; w->frame_no = view_z; - w->list_information_type = map_element->properties.scenerymultiple.colour[0] & 0x1F; - w->var_492 = map_element->properties.scenerymultiple.colour[1] & 0x1F; + rct_banner* banner = &gBanners[w->number]; + + banner->colour = map_element->properties.scenerymultiple.colour[0] & 0x1F; + banner->text_colour = map_element->properties.scenerymultiple.colour[1] & 0x1F; w->var_48C = map_element->properties.scenerymultiple.type; view_x += 16; @@ -274,10 +276,10 @@ static void window_sign_mousedown(int widgetIndex, rct_window*w, rct_widget* wid switch (widgetIndex) { case WIDX_MAIN_COLOR: - window_dropdown_show_colour(w, widget, w->colours[1] | 0x80, (uint8)w->list_information_type); + window_dropdown_show_colour(w, widget, w->colours[1] | 0x80, (uint8)banner->colour); break; case WIDX_TEXT_COLOR: - window_dropdown_show_colour(w, widget, w->colours[1] | 0x80, (uint8)w->var_492); + window_dropdown_show_colour(w, widget, w->colours[1] | 0x80, (uint8)banner->text_colour); break; } } @@ -285,70 +287,31 @@ static void window_sign_mousedown(int widgetIndex, rct_window*w, rct_widget* wid /* rct2: 0x6B979C */ static void window_sign_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { + rct_banner *banner = &gBanners[w->number]; + switch (widgetIndex){ case WIDX_MAIN_COLOR: if (dropdownIndex == -1) return; - w->list_information_type = dropdownIndex; + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, banner->text_colour, GAME_COMMAND_SET_SIGN_STYLE, dropdownIndex, 1); break; case WIDX_TEXT_COLOR: if (dropdownIndex == -1) return; - w->var_492 = dropdownIndex; + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, dropdownIndex, GAME_COMMAND_SET_SIGN_STYLE, banner->colour, 1); break; default: return; } - rct_banner *banner = &gBanners[w->number]; - rct_map_element *mapElement = banner_get_map_element(w->number); - if (mapElement == NULL || map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE) - return; - - sign_set_colour( - banner->x * 32, - banner->y * 32, - mapElement->base_height, - mapElement->type & 3, - mapElement->properties.scenerymultiple.type >> 10, - w->list_information_type & 0xFF, - w->var_492 & 0xFF - ); window_invalidate(w); } /* rct2: 0x6B9791 & 0x6E6171*/ static void window_sign_textinput(rct_window *w, int widgetIndex, char *text) { - rct_banner* banner = &gBanners[w->number]; - int x = banner->x << 5; - int y = banner->y << 5; - if (widgetIndex == WIDX_SIGN_TEXT && text != NULL) { - if (*text != 0) { - rct_string_id string_id = user_string_allocate(128, text); - if (string_id != 0) { - rct_string_id prev_string_id = banner->string_idx; - banner->string_idx = string_id; - user_string_free(prev_string_id); - - banner->flags &= ~(BANNER_FLAG_2); - gfx_invalidate_screen(); - } else { - window_error_open(2984, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id)); - } - } - else{ - int rideIndex = banner_get_closest_ride_index(x, y, 16); - if (rideIndex == -1) - return; - - banner->colour = rideIndex; - banner->flags |= BANNER_FLAG_2; - - rct_string_id prev_string_id = banner->string_idx; - banner->string_idx = 778; - user_string_free(prev_string_id); - gfx_invalidate_screen(); - } + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 0)), GAME_COMMAND_SET_SIGN_NAME, *((int*)(text + 8)), *((int*)(text + 4))); + game_do_command(2, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 12)), GAME_COMMAND_SET_SIGN_NAME, *((int*)(text + 20)), *((int*)(text + 16))); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, w->number, *((int*)(text + 24)), GAME_COMMAND_SET_SIGN_NAME, *((int*)(text + 32)), *((int*)(text + 28))); } } @@ -372,8 +335,10 @@ static void window_sign_invalidate(rct_window *w) text_colour_btn->type = WWT_COLORBTN; } - main_colour_btn->image = (w->list_information_type << 19) | 0x600013C3; - text_colour_btn->image = (w->var_492 << 19) | 0x600013C3; + rct_banner* banner = &gBanners[w->number]; + + main_colour_btn->image = (banner->colour << 19) | 0x600013C3; + text_colour_btn->image = (banner->text_colour << 19) | 0x600013C3; } /* rct2: 0x006B9754 & 0x006E6134 */ @@ -468,8 +433,9 @@ void window_sign_small_open(rct_windownumber number){ int view_z = map_element->base_height << 3; w->frame_no = view_z; - w->list_information_type = map_element->properties.fence.item[1] & 0x1F; - w->var_492 = (map_element->properties.fence.item[1] >> 5) | ((map_element->flags&0x60) >> 2); + rct_banner* banner = &gBanners[w->number]; + banner->colour = map_element->properties.fence.item[1] & 0x1F; + banner->text_colour = (map_element->properties.fence.item[1] >> 5) | ((map_element->flags&0x60) >> 2); w->var_48C = map_element->properties.fence.type; view_x += 16; @@ -550,43 +516,21 @@ static void window_sign_small_mouseup(rct_window *w, int widgetIndex) /* rct2: 0x6E617C */ static void window_sign_small_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { + rct_banner* banner = &gBanners[w->number]; + switch (widgetIndex){ case WIDX_MAIN_COLOR: if (dropdownIndex == -1) return; - w->list_information_type = dropdownIndex; + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, dropdownIndex, GAME_COMMAND_SET_SIGN_STYLE, banner->text_colour, 0); break; case WIDX_TEXT_COLOR: if (dropdownIndex == -1) return; - w->var_492 = dropdownIndex; + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, banner->colour, GAME_COMMAND_SET_SIGN_STYLE, dropdownIndex, 0); break; default: return; } - rct_banner* banner = &gBanners[w->number]; - int x = banner->x << 5; - int y = banner->y << 5; - - rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); - - while (1){ - if (map_element_get_type(map_element) == MAP_ELEMENT_TYPE_FENCE) { - rct_scenery_entry* scenery_entry = g_wallSceneryEntries[map_element->properties.fence.type]; - if (scenery_entry->wall.var_0D != 0xFF){ - if (map_element->properties.fence.item[0] == w->number) - break; - } - } - map_element++; - } - - map_element->flags &= 0x9F; - map_element->properties.fence.item[1] = - w->list_information_type | - ((w->var_492 & 0x7) << 5); - map_element->flags |= ((w->var_492 & 0x18) << 2); - - map_invalidate_tile(x, y, map_element->base_height * 8, map_element->clearance_height * 8); window_invalidate(w); } @@ -610,6 +554,8 @@ static void window_sign_small_invalidate(rct_window *w) text_colour_btn->type = WWT_COLORBTN; } - main_colour_btn->image = (w->list_information_type << 19) | 0x600013C3; - text_colour_btn->image = (w->var_492 << 19) | 0x600013C3; + rct_banner* banner = &gBanners[w->number]; + + main_colour_btn->image = (banner->colour << 19) | 0x600013C3; + text_colour_btn->image = (banner->text_colour << 19) | 0x600013C3; } diff --git a/src/world/map.c b/src/world/map.c index 116bbc56ae..fbc12b811a 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -4716,6 +4716,216 @@ void game_command_place_park_entrance(int* eax, int* ebx, int* ecx, int* edx, in (*ebx >> 8) & 0xFF); } +void game_command_set_banner_name(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { + static char newName[128]; + + rct_banner* banner = &gBanners[*ecx]; + + int nameChunkIndex = *eax & 0xFFFF; + + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_RUNNING_COSTS * 4; + int nameChunkOffset = nameChunkIndex - 1; + if (nameChunkOffset < 0) + nameChunkOffset = 2; + nameChunkOffset *= 12; + RCT2_GLOBAL(newName + nameChunkOffset + 0, uint32) = *edx; + RCT2_GLOBAL(newName + nameChunkOffset + 4, uint32) = *ebp; + RCT2_GLOBAL(newName + nameChunkOffset + 8, uint32) = *edi; + + if (nameChunkIndex != 0) { + *ebx = 0; + return; + } + + utf8 *buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, uint8); + utf8 *dst = buffer; + dst = utf8_write_codepoint(dst, FORMAT_COLOUR_CODE_START + banner->text_colour); + strncpy(dst, newName, 32); + + rct_string_id stringId = user_string_allocate(128, buffer); + if (stringId) { + rct_string_id prev_string_id = banner->string_idx; + banner->string_idx = stringId; + user_string_free(prev_string_id); + rct_window* w = window_bring_to_front_by_number(WC_BANNER, *ecx); + if (w) { + window_invalidate(w); + } + } else { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 2984; + *ebx = MONEY32_UNDEFINED; + return; + } + + *ebx = 0; +} + +void game_command_set_sign_name(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { + static char newName[128]; + + rct_banner* banner = &gBanners[*ecx]; + int x = banner->x << 5; + int y = banner->y << 5; + + int nameChunkIndex = *eax & 0xFFFF; + + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_RUNNING_COSTS * 4; + int nameChunkOffset = nameChunkIndex - 1; + if (nameChunkOffset < 0) + nameChunkOffset = 2; + nameChunkOffset *= 12; + RCT2_GLOBAL(newName + nameChunkOffset + 0, uint32) = *edx; + RCT2_GLOBAL(newName + nameChunkOffset + 4, uint32) = *ebp; + RCT2_GLOBAL(newName + nameChunkOffset + 8, uint32) = *edi; + + if (nameChunkIndex != 0) { + *ebx = 0; + return; + } + + if (newName[0] != 0) { + rct_string_id string_id = user_string_allocate(128, newName); + if (string_id != 0) { + rct_string_id prev_string_id = banner->string_idx; + banner->string_idx = string_id; + user_string_free(prev_string_id); + + banner->flags &= ~(BANNER_FLAG_2); + gfx_invalidate_screen(); + } else { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 2984; + *ebx = MONEY32_UNDEFINED; + return; + } + } + else{ + int rideIndex = banner_get_closest_ride_index(x, y, 16); + if (rideIndex == -1) { + *ebx = 0; + return; + } + + banner->colour = rideIndex; + banner->flags |= BANNER_FLAG_2; + + rct_string_id prev_string_id = banner->string_idx; + banner->string_idx = 778; + user_string_free(prev_string_id); + gfx_invalidate_screen(); + } + + *ebx = 0; +} + +void game_command_set_banner_style(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { + rct_banner* banner = &gBanners[*ecx]; + + banner->colour = (uint8)*edx; + banner->text_colour = (uint8)*edi; + + banner->flags = (uint8)*ebp; + + int x = banner->x << 5; + int y = banner->y << 5; + + rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); + + while (1){ + if ((map_element_get_type(map_element) == MAP_ELEMENT_TYPE_BANNER) && + (map_element->properties.banner.index == *ecx)) break; + map_element++; + } + + map_element->properties.banner.flags = 0xFF; + if (banner->flags & BANNER_FLAG_NO_ENTRY){ + map_element->properties.banner.flags &= ~(1 << map_element->properties.banner.position); + } + + int colourCodepoint = FORMAT_COLOUR_CODE_START + banner->text_colour; + + uint8 buffer[256]; + format_string(buffer, banner->string_idx, 0); + int firstCodepoint = utf8_get_next(buffer, NULL); + if (firstCodepoint >= FORMAT_COLOUR_CODE_START && firstCodepoint <= FORMAT_COLOUR_CODE_END) { + utf8_write_codepoint(buffer, colourCodepoint); + } else { + utf8_insert_codepoint(buffer, colourCodepoint); + } + + rct_string_id stringId = user_string_allocate(128, buffer); + if (stringId != 0) { + rct_string_id prev_string_id = banner->string_idx; + banner->string_idx = stringId; + user_string_free(prev_string_id); + rct_window* w = window_bring_to_front_by_number(WC_BANNER, *ecx); + if (w) { + window_invalidate(w); + } + } else { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 2984; + *ebx = MONEY32_UNDEFINED; + return; + } + + *ebx = 0; +} + +void game_command_set_sign_style(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { + rct_banner *banner = &gBanners[*ecx]; + int x = banner->x << 5; + int y = banner->y << 5; + + banner->colour = (uint8)*edx; + banner->text_colour = (uint8)*edi; + + if (*ebp == 0) { // small sign + + rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); + + while (1){ + if (map_element_get_type(map_element) == MAP_ELEMENT_TYPE_FENCE) { + rct_scenery_entry* scenery_entry = g_wallSceneryEntries[map_element->properties.fence.type]; + if (scenery_entry->wall.var_0D != 0xFF){ + if (map_element->properties.fence.item[0] == *ecx) + break; + } + } + map_element++; + } + map_element->flags &= 0x9F; + map_element->properties.fence.item[1] = + banner->colour | + ((banner->text_colour & 0x7) << 5); + map_element->flags |= ((banner->text_colour & 0x18) << 2); + + map_invalidate_tile(x, y, map_element->base_height * 8, map_element->clearance_height * 8); + } else { // large sign + rct_map_element *mapElement = banner_get_map_element(*ecx); + if (mapElement == NULL || map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 2984; + *ebx = MONEY32_UNDEFINED; + return; + } + + sign_set_colour( + banner->x * 32, + banner->y * 32, + mapElement->base_height, + mapElement->type & 3, + mapElement->properties.scenerymultiple.type >> 10, + banner->colour, + banner->text_colour + ); + } + + rct_window* w = window_bring_to_front_by_number(WC_BANNER, *ecx); + if (w) { + window_invalidate(w); + } + + *ebx = 0; +} + /** * Gets the map element at x, y, z. * @param x x units, not tiles. diff --git a/src/world/map.h b/src/world/map.h index c99617a8c4..e1c4ed0aa0 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -335,6 +335,10 @@ void game_command_place_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_place_park_entrance(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); +void game_command_set_banner_name(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); +void game_command_set_sign_name(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); +void game_command_set_banner_style(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); +void game_command_set_sign_style(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); #define GET_MAP_ELEMENT(x) (&(RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS, rct_map_element)[x])) #define TILE_MAP_ELEMENT_POINTER(x) (RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*)[x]) From d18adc80def71a73f14a0561706ecdcf64fc4612 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sat, 31 Oct 2015 17:43:36 -0600 Subject: [PATCH 0931/1173] fix small error --- src/windows/sign.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/windows/sign.c b/src/windows/sign.c index 23f2eb85be..ad51f0f1d7 100644 --- a/src/windows/sign.c +++ b/src/windows/sign.c @@ -292,11 +292,11 @@ static void window_sign_dropdown(rct_window *w, int widgetIndex, int dropdownInd switch (widgetIndex){ case WIDX_MAIN_COLOR: if (dropdownIndex == -1) return; - game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, banner->text_colour, GAME_COMMAND_SET_SIGN_STYLE, dropdownIndex, 1); + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, dropdownIndex, GAME_COMMAND_SET_SIGN_STYLE, banner->text_colour, 1); break; case WIDX_TEXT_COLOR: if (dropdownIndex == -1) return; - game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, dropdownIndex, GAME_COMMAND_SET_SIGN_STYLE, banner->colour, 1); + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, banner->colour, GAME_COMMAND_SET_SIGN_STYLE, dropdownIndex, 1); break; default: return; From 34dff6f46bb189e7d5381ca5f0fda64d1a7035e8 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sun, 1 Nov 2015 01:50:44 -0600 Subject: [PATCH 0932/1173] address #2073, graceful KickPlayer with message, disconnect reason messages, chat player name and text different color --- src/network/network.cpp | 126 ++++++++++++++++++++++++++++------------ src/network/network.h | 10 +++- 2 files changed, 97 insertions(+), 39 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index a3827f86c2..6a23a8c0bc 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -51,10 +51,10 @@ extern "C" { Network gNetwork; enum { - NETWORK_SUCCESS, - NETWORK_NO_DATA, - NETWORK_MORE_DATA, - NETWORK_DISCONNECTED + NETWORK_READPACKET_SUCCESS, + NETWORK_READPACKET_NO_DATA, + NETWORK_READPACKET_MORE_DATA, + NETWORK_READPACKET_DISCONNECTED }; enum { @@ -66,6 +66,7 @@ enum { NETWORK_COMMAND_PLAYERLIST, NETWORK_COMMAND_PING, NETWORK_COMMAND_PINGLIST, + NETWORK_COMMAND_SETDISCONNECTMSG, NETWORK_COMMAND_MAX }; @@ -159,6 +160,8 @@ NetworkConnection::NetworkConnection() authstatus = NETWORK_AUTH_NONE; player = 0; socket = INVALID_SOCKET; + ResetLastPacketTime(); + last_disconnect_reason = NULL; } NetworkConnection::~NetworkConnection() @@ -175,16 +178,16 @@ int NetworkConnection::ReadPacket() int readBytes = recv(socket, &((char*)&inboundpacket.size)[inboundpacket.transferred], sizeof(inboundpacket.size) - inboundpacket.transferred, 0); if (readBytes == SOCKET_ERROR || readBytes == 0) { if (LAST_SOCKET_ERROR() != EWOULDBLOCK && LAST_SOCKET_ERROR() != EAGAIN) { - return NETWORK_DISCONNECTED; + return NETWORK_READPACKET_DISCONNECTED; } else { - return NETWORK_NO_DATA; + return NETWORK_READPACKET_NO_DATA; } } inboundpacket.transferred += readBytes; if (inboundpacket.transferred == sizeof(inboundpacket.size)) { inboundpacket.size = ntohs(inboundpacket.size); if(inboundpacket.size == 0){ // Can't have a size 0 packet - return NETWORK_DISCONNECTED; + return NETWORK_READPACKET_DISCONNECTED; } inboundpacket.data->resize(inboundpacket.size); } @@ -194,18 +197,19 @@ int NetworkConnection::ReadPacket() int readBytes = recv(socket, (char*)&inboundpacket.GetData()[inboundpacket.transferred - sizeof(inboundpacket.size)], sizeof(inboundpacket.size) + inboundpacket.size - inboundpacket.transferred, 0); if (readBytes == SOCKET_ERROR || readBytes == 0) { if (LAST_SOCKET_ERROR() != EWOULDBLOCK && LAST_SOCKET_ERROR() != EAGAIN) { - return NETWORK_DISCONNECTED; + return NETWORK_READPACKET_DISCONNECTED; } else { - return NETWORK_NO_DATA; + return NETWORK_READPACKET_NO_DATA; } } inboundpacket.transferred += readBytes; } if (inboundpacket.transferred == sizeof(inboundpacket.size) + inboundpacket.size) { - return NETWORK_SUCCESS; + last_packet_time = SDL_GetTicks(); + return NETWORK_READPACKET_SUCCESS; } } - return NETWORK_MORE_DATA; + return NETWORK_READPACKET_MORE_DATA; } bool NetworkConnection::SendPacket(NetworkPacket& packet) @@ -264,6 +268,19 @@ bool NetworkConnection::SetNonBlocking(SOCKET socket, bool on) #endif } +void NetworkConnection::ResetLastPacketTime() +{ + last_packet_time = SDL_GetTicks(); +} + +bool NetworkConnection::ReceivedPacketRecently() +{ + if (SDL_TICKS_PASSED(SDL_GetTicks(), last_packet_time + 7000)) { + return false; + } + return true; +} + NetworkAddress::NetworkAddress() { ss = std::make_shared(); @@ -349,6 +366,7 @@ Network::Network() client_command_handlers[NETWORK_COMMAND_PLAYERLIST] = &Network::Client_Handle_PLAYERLIST; client_command_handlers[NETWORK_COMMAND_PING] = &Network::Client_Handle_PING; client_command_handlers[NETWORK_COMMAND_PINGLIST] = &Network::Client_Handle_PINGLIST; + client_command_handlers[NETWORK_COMMAND_SETDISCONNECTMSG] = &Network::Client_Handle_SETDISCONNECTMSG; server_command_handlers.resize(NETWORK_COMMAND_MAX, 0); server_command_handlers[NETWORK_COMMAND_AUTH] = &Network::Server_Handle_AUTH; server_command_handlers[NETWORK_COMMAND_CHAT] = &Network::Server_Handle_CHAT; @@ -389,6 +407,7 @@ void Network::Close() mode = NETWORK_MODE_NONE; status = NETWORK_STATUS_NONE; server_connection.authstatus = NETWORK_AUTH_NONE; + server_connection.last_disconnect_reason = NULL; client_connection_list.clear(); game_command_queue.clear(); @@ -619,6 +638,7 @@ void Network::UpdateClient() } if (error == 0) { status = NETWORK_STATUS_CONNECTED; + server_connection.ResetLastPacketTime(); Client_Send_AUTH(OPENRCT2_VERSION, gConfigNetwork.player_name, ""); window_network_status_open("Authenticating..."); } @@ -626,7 +646,14 @@ void Network::UpdateClient() }break; case NETWORK_STATUS_CONNECTED: if (!ProcessConnection(server_connection)) { - window_network_status_open("Connection closed"); + char errormsg[256]; + char reason[100]; + reason[0] = 0; + if (server_connection.last_disconnect_reason) { + sprintf(reason, ": %s", server_connection.last_disconnect_reason); + } + sprintf(errormsg, "Disconnected%s", reason); + window_network_status_open(errormsg); Close(); } ProcessGameCommandQueue(); @@ -665,10 +692,13 @@ const char* Network::FormatChat(NetworkPlayer* fromplayer, const char* text) if (fromplayer) { lineCh = utf8_write_codepoint(lineCh, FORMAT_OUTLINE); lineCh = utf8_write_codepoint(lineCh, FORMAT_BABYBLUE); - safe_strncpy(lineCh, (const char*)fromplayer->name, 1024); + safe_strncpy(lineCh, (const char*)fromplayer->name, sizeof(fromplayer->name)); strcat(lineCh, ": "); + lineCh = strchr(lineCh, '\0'); } - strcat(formatted, text); + lineCh = utf8_write_codepoint(lineCh, FORMAT_OUTLINE); + lineCh = utf8_write_codepoint(lineCh, FORMAT_WHITE); + safe_strncpy(lineCh, text, 800); return formatted; } @@ -806,37 +836,45 @@ void Network::Server_Send_PINGLIST() SendPacketToClients(*packet); } +void Network::Server_Send_SETDISCONNECTMSG(NetworkConnection& connection, const char* msg) +{ + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); + *packet << (uint32)NETWORK_COMMAND_SETDISCONNECTMSG; + packet->WriteString(msg); + connection.QueuePacket(std::move(packet)); +} + bool Network::ProcessConnection(NetworkConnection& connection) { + connection.SendQueuedPackets(); int packetStatus; do { packetStatus = connection.ReadPacket(); switch(packetStatus) { - case NETWORK_DISCONNECTED: + case NETWORK_READPACKET_DISCONNECTED: // closed connection or network error PrintError(); - if (GetMode() == NETWORK_MODE_CLIENT) { - printf("Server disconnected...\n"); - return false; - } else - if (GetMode() == NETWORK_MODE_SERVER) { - printf("Client disconnected...\n"); - return false; + if (!connection.last_disconnect_reason) { + connection.last_disconnect_reason = "Connection Closed"; } + return false; break; - case NETWORK_SUCCESS: + case NETWORK_READPACKET_SUCCESS: // done reading in packet ProcessPacket(connection, connection.inboundpacket); break; - case NETWORK_MORE_DATA: + case NETWORK_READPACKET_MORE_DATA: // more data required to be read break; - case NETWORK_NO_DATA: + case NETWORK_READPACKET_NO_DATA: // could not read anything from socket break; } - } while (packetStatus == NETWORK_MORE_DATA || packetStatus == NETWORK_SUCCESS); - connection.SendQueuedPackets(); + } while (packetStatus == NETWORK_READPACKET_MORE_DATA || packetStatus == NETWORK_READPACKET_SUCCESS); + if (!connection.ReceivedPacketRecently()) { + connection.last_disconnect_reason = "No Data"; + return false; + } return true; } @@ -893,7 +931,12 @@ void Network::RemoveClient(std::unique_ptr& connection) char* lineCh = text; lineCh = utf8_write_codepoint(lineCh, FORMAT_OUTLINE); lineCh = utf8_write_codepoint(lineCh, FORMAT_RED); - sprintf(lineCh, "%s has disconnected", connection_player->name); + char reasonstr[100]; + reasonstr[0] = 0; + if (connection->last_disconnect_reason) { + sprintf(reasonstr, " (%s)", connection->last_disconnect_reason); + } + sprintf(lineCh, "%s has disconnected%s", connection_player->name, reasonstr); chat_history_add(text); gNetwork.Server_Send_CHAT(text); } @@ -1026,7 +1069,7 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac int Network::Client_Handle_CHAT(NetworkConnection& connection, NetworkPacket& packet) { - const char* text = (char*)packet.Read(packet.size - packet.read); + const char* text = packet.ReadString(); if (text) { chat_history_add(text); } @@ -1035,7 +1078,7 @@ int Network::Client_Handle_CHAT(NetworkConnection& connection, NetworkPacket& pa int Network::Server_Handle_CHAT(NetworkConnection& connection, NetworkPacket& packet) { - const char* text = (const char*)packet.Read(packet.size - packet.read); + const char* text = packet.ReadString(); if (text) { const char* formatted = FormatChat(connection.player, text); chat_history_add(formatted); @@ -1135,6 +1178,17 @@ int Network::Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket return 1; } +int Network::Client_Handle_SETDISCONNECTMSG(NetworkConnection& connection, NetworkPacket& packet) +{ + static char msg[256] = {0}; + const char* disconnectmsg = packet.ReadString(); + if (disconnectmsg) { + safe_strncpy(msg, disconnectmsg, sizeof(msg)); + connection.last_disconnect_reason = msg; + } + return 1; +} + int network_init() { return gNetwork.Init(); @@ -1249,14 +1303,10 @@ void Network::KickPlayer(int playerId) NetworkPlayer *player = GetPlayerByID(playerId); for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { if ((*it)->player->id == playerId) { - char buffer[128]; - sprintf(buffer, "%s has been kicked.", (*it)->player->name); - - // Disconnect the client - closesocket((*it)->socket); - - chat_history_add(buffer); - Server_Send_CHAT(buffer); + // Disconnect the client gracefully + (*it)->last_disconnect_reason = "Kicked"; + Server_Send_SETDISCONNECTMSG(*(*it), "Get out of the server!"); + shutdown((*it)->socket, SHUT_RD); break; } } diff --git a/src/network/network.h b/src/network/network.h index a6c208fedc..2356937cdb 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -66,6 +66,9 @@ extern "C" { #define LAST_SOCKET_ERROR() WSAGetLastError() #undef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK + #ifndef SHUT_RD + #define SHUT_RD SD_RECEIVE + #endif #else #include #include @@ -143,16 +146,20 @@ public: bool SetTCPNoDelay(bool on); bool SetNonBlocking(bool on); static bool SetNonBlocking(SOCKET socket, bool on); + void ResetLastPacketTime(); + bool ReceivedPacketRecently(); SOCKET socket; NetworkPacket inboundpacket; int authstatus; NetworkPlayer* player; uint32 ping_time; + const char* last_disconnect_reason; private: bool SendPacket(NetworkPacket& packet); std::list> outboundpackets; + uint32 last_packet_time; }; class NetworkAddress @@ -214,6 +221,7 @@ public: void Client_Send_PING(); void Server_Send_PING(); void Server_Send_PINGLIST(); + void Server_Send_SETDISCONNECTMSG(NetworkConnection& connection, const char* msg); std::vector> player_list; @@ -257,7 +265,6 @@ private: bool _desynchronised; uint32 server_connect_time; - void UpdateServer(); void UpdateClient(); @@ -276,6 +283,7 @@ private: int Client_Handle_PING(NetworkConnection& connection, NetworkPacket& packet); int Server_Handle_PING(NetworkConnection& connection, NetworkPacket& packet); int Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket& packet); + int Client_Handle_SETDISCONNECTMSG(NetworkConnection& connection, NetworkPacket& packet); }; #endif // __cplusplus From d2ec665ae4bc63235316a6da4f568479b853410d Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Sun, 1 Nov 2015 09:59:13 +0100 Subject: [PATCH 0933/1173] Fix Bug #2138 --- src/windows/ride.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/windows/ride.c b/src/windows/ride.c index 879fa83f8b..e3dadfd032 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -3844,6 +3844,7 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid dropdown_set_checked(ride->track_colour_supports[colourSchemeIndex], true); break; case WIDX_ENTRANCE_STYLE_DROPDOWN: + gDropdownItemsChecked = 0; for (i = 0; i < countof(window_ride_entrance_style_list); i++) { gDropdownItemsFormat[i] = 1142; gDropdownItemsArgs[i] = RideEntranceDefinitions[window_ride_entrance_style_list[i]].string_id; From 9a981ef68f3c0bb19347f4975a3249c38e4012b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sun, 1 Nov 2015 18:44:16 +0100 Subject: [PATCH 0934/1173] Fix variable not being shifted When decompiled, at 0x6AA8ED, there's `shr edi,0x4`, which is not reflected in sources. The `type` without that shift could easily become a value large enough to point to memory beyond object entries and modify those values. In my case, it was modifying `RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS` from 2122 to 2123 (by setting lowest bit), which luckily, is used later in `setup_in_use_selection_flags`. For this reason, I believe it could be a major source of other problems, possibly also recent `MAP_ANIMATION` ones, although I haven't checked. I also put an assert in place to validate type against max available count. --- src/windows/editor_object_selection.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 388af33f45..bd3b37fdd1 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -578,6 +578,8 @@ static void setup_in_use_selection_flags(){ break; case MAP_ELEMENT_TYPE_PATH: type = iter.element->properties.path.type; + type >>= 4; + assert(type < object_entry_group_counts[OBJECT_TYPE_PATHS]); RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_PATHS][type] |= (1 << 0); path_additions = iter.element->properties.path.additions & 0xF; @@ -588,6 +590,7 @@ static void setup_in_use_selection_flags(){ break; case MAP_ELEMENT_TYPE_SCENERY: type = iter.element->properties.scenery.type; + assert(type < object_entry_group_counts[OBJECT_TYPE_SMALL_SCENERY]); RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_SMALL_SCENERY][type] |= (1 << 0); break; case MAP_ELEMENT_TYPE_ENTRANCE: @@ -597,19 +600,23 @@ static void setup_in_use_selection_flags(){ RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_PARK_ENTRANCE][0] |= (1 << 0); type = iter.element->properties.entrance.path_type; + assert(type < object_entry_group_counts[OBJECT_TYPE_PATHS]); RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_PATHS][type] |= (1 << 0); break; case MAP_ELEMENT_TYPE_FENCE: type = iter.element->properties.fence.type; + assert(type < object_entry_group_counts[OBJECT_TYPE_WALLS]); RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_WALLS][type] |= (1 << 0); break; case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: type = iter.element->properties.scenerymultiple.type & 0x3FF; + assert(type < object_entry_group_counts[OBJECT_TYPE_LARGE_SCENERY]); RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_LARGE_SCENERY][type] |= (1 << 0); break; case MAP_ELEMENT_TYPE_BANNER: banner = &gBanners[iter.element->properties.banner.index]; type = banner->type; + assert(type < object_entry_group_counts[OBJECT_TYPE_BANNERS]); RCT2_ADDRESS(0x0098DA38, uint8*)[OBJECT_TYPE_BANNERS][type] |= (1 << 0); break; } From 428613a8047a524ce4d9925cda3040d95c5fdfcf Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 1 Nov 2015 20:04:24 +0000 Subject: [PATCH 0935/1173] Fix #2122. Mechanics default to blue and guards yellow. --- src/world/park.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/world/park.c b/src/world/park.c index 61ea797a8f..98188e243e 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -70,8 +70,8 @@ void park_init() RCT2_GLOBAL(0x013CA740, uint8) = 0; RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, uint16) = 777; RCT2_GLOBAL(RCT2_ADDRESS_HANDYMAN_COLOUR, uint8) = 28; - RCT2_GLOBAL(RCT2_ADDRESS_MECHANIC_COLOUR, uint8) = 28; - RCT2_GLOBAL(RCT2_ADDRESS_SECURITY_COLOUR, uint8) = 28; + RCT2_GLOBAL(RCT2_ADDRESS_MECHANIC_COLOUR, uint8) = 7; + RCT2_GLOBAL(RCT2_ADDRESS_SECURITY_COLOUR, uint8) = 18; RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16) = 0; From f1cdc99afcefee9d6b74d04e73b1fbb95ce8439d Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 1 Nov 2015 20:55:54 +0000 Subject: [PATCH 0936/1173] Fix #2079. Scroll windows no longer have incorrect tooltips There was an issue with forgetting to reset the x/y variable introduced when I fixed a different bug. Possibly fixes #2136 --- src/input.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/input.c b/src/input.c index 24c66838b6..947138e16b 100644 --- a/src/input.c +++ b/src/input.c @@ -1036,14 +1036,19 @@ void process_mouse_over(int x, int y) RCT2_GLOBAL(0x9DE558, uint16) = x; RCT2_GLOBAL(0x9DE55A, uint16) = y; int output_scroll_area, scroll_id; - widget_scroll_get_part(window, &window->widgets[widgetId], x, y, &x, &y, &output_scroll_area, &scroll_id); + int scroll_x, scroll_y; + widget_scroll_get_part(window, &window->widgets[widgetId], x, y, &scroll_x, &scroll_y, &output_scroll_area, &scroll_id); cursorId = scroll_id; if (output_scroll_area != SCROLL_PART_VIEW) { cursorId = CURSOR_ARROW; break; } - //Fall through to default + // Same as default but with scroll_x/y + cursorId = window_event_cursor_call(window, widgetId, scroll_x, scroll_y); + if (cursorId == -1) + cursorId = CURSOR_ARROW; + break; default: cursorId = window_event_cursor_call(window, widgetId, x, y); if (cursorId == -1) From d21e5a3b8ca16f05b3a1c23be6b587e01d4536d3 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 1 Nov 2015 21:03:50 +0000 Subject: [PATCH 0937/1173] Fix #2136. Issue caused by missing branch. --- src/windows/scenery.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/windows/scenery.c b/src/windows/scenery.c index dbba566335..f09153e7dc 100644 --- a/src/windows/scenery.c +++ b/src/windows/scenery.c @@ -843,9 +843,11 @@ void window_scenery_tooltip(rct_window* w, int widgetIndex, rct_string_id *strin case WIDX_SCENERY_TAB_17: case WIDX_SCENERY_TAB_18: case WIDX_SCENERY_TAB_19: - case WIDX_SCENERY_TAB_20: RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = g_scenerySetEntries[widgetIndex - WIDX_SCENERY_TAB_1]->name; break; + case WIDX_SCENERY_TAB_20: + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = 1813; + break; } } From 61b7c77be3283e1e28fac4cb46989823e2540f99 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 1 Nov 2015 22:21:46 +0000 Subject: [PATCH 0938/1173] add colour enum --- projects/openrct2.vcxproj | 1 + projects/openrct2.vcxproj.filters | 3 + src/interface/colour.h | 53 ++++++++++++ src/interface/themes.c | 137 +++++++++++++++--------------- src/world/park.c | 7 +- 5 files changed, 130 insertions(+), 71 deletions(-) create mode 100644 src/interface/colour.h diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 44e73ff7e8..dd28db7755 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -213,6 +213,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 247c93564f..5707164ac7 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -812,5 +812,8 @@ Source\Ride + + Source\Interface + \ No newline at end of file diff --git a/src/interface/colour.h b/src/interface/colour.h new file mode 100644 index 0000000000..27372884f1 --- /dev/null +++ b/src/interface/colour.h @@ -0,0 +1,53 @@ +#ifndef _COLOUR_H_ +#define _COLOUR_H_ + +/** + * Colour IDs as used by the colour dropdown, NOT palette indices. + */ +enum { + COLOUR_BLACK, + COLOUR_GREY, + COLOUR_WHITE, + COLOUR_DARK_PURPLE, + COLOUR_LIGHT_PURPLE, + COLOUR_BRIGHT_PURPLE, + COLOUR_DARK_BLUE, + COLOUR_LIGHT_BLUE, + COLOUR_ICY_BLUE, + COLOUR_TEAL, + COLOUR_AQUAMARINE, + COLOUR_SATURATED_GREEN, + COLOUR_DARK_GREEN, + COLOUR_MOSS_GREEN, + COLOUR_BRIGHT_GREEN, + COLOUR_OLIVE_GREEN, + COLOUR_DARK_OLIVE_GREEN, + COLOUR_BRIGHT_YELLOW, + COLOUR_YELLOW, + COLOUR_DARK_YELLOW, + COLOUR_LIGHT_ORANGE, + COLOUR_DARK_ORANGE, + COLOUR_LIGHT_BROWN, + COLOUR_SATURATED_BROWN, + COLOUR_DARK_BROWN, + COLOUR_SALMON_PINK, + COLOUR_BORDEAUX_RED, + COLOUR_SATURATED_RED, + COLOUR_BRIGHT_RED, + COLOUR_DARK_PINK, + COLOUR_BRIGHT_PINK, + COLOUR_LIGHT_PINK +}; + +/** + * These colours change depending on the current water colours. + */ +enum { + COLOUR_DARK_WATER = 9, + COLOUR_LIGHT_WATER = 10 +}; + +#define COLOUR_FLAG_TRANSLUCENT (1 << 7) +#define TRANSLUCENT(x) ((x) | COLOUR_FLAG_TRANSLUCENT) + +#endif \ No newline at end of file diff --git a/src/interface/themes.c b/src/interface/themes.c index b91f1ff6ed..96ef4f6742 100644 --- a/src/interface/themes.c +++ b/src/interface/themes.c @@ -20,6 +20,7 @@ #include "../localisation/string_ids.h" #include "../util/util.h" +#include "colour.h" #include "window.h" #include "themes.h" @@ -30,83 +31,83 @@ #define COLOURS_5(c0, c1, c2, c3, c4) 5, { { (c0), (c1), (c2), (c3), (c4), 0 } } #define COLOURS_6(c0, c1, c2, c3, c4, c5) 6, { { (c0), (c1), (c2), (c3), (c4), (c5) } } +#define THEME_DEF_END { 0xFF, { 0, 0, 0, 0, 0, 0 } } + #define TWINDOW(window_class, window_name, window_string_id, theme) { window_class, window_name, window_string_id, theme } theme_window_definition gThemeWindowDefinitions[] = { /* Window Class ini section name stringid window defaults */ - { WC_TOP_TOOLBAR, "top_toolbar", 5245, COLOURS_4(7, 12, 24, 1) }, - { WC_BOTTOM_TOOLBAR, "bottom_toolbar", 5246, COLOURS_4(140, 140, 0, 14) }, - { WC_RIDE, "ride", 5203, COLOURS_3(1, 26, 1) }, - { WC_RIDE_CONSTRUCTION, "ride_construction", 5199, COLOURS_3(24, 24, 24) }, - { WC_RIDE_LIST, "ride_list", 5204, COLOURS_3(1, 26, 26) }, - { WC_SAVE_PROMPT, "save_prompt", 5223, COLOURS_1(154) }, - { WC_CONSTRUCT_RIDE, "new_ride", 5201, COLOURS_3(24, 26, 26) }, - { WC_DEMOLISH_RIDE_PROMPT, "demolish_ride_prompt", 5224, COLOURS_1(154) }, - { WC_SCENERY, "scenery", 5197, COLOURS_3(24, 12, 12) }, - { WC_OPTIONS, "options", 5219, COLOURS_3(7, 7, 7) }, - { WC_FOOTPATH, "footpath", 5198, COLOURS_3(24, 24, 24) }, - { WC_LAND, "land", 5193, COLOURS_3(24, 24, 24) }, - { WC_WATER, "water", 5194, COLOURS_3(24, 24, 24) }, - { WC_PEEP, "guest", 5205, COLOURS_3(1, 15, 15) }, - { WC_GUEST_LIST, "guest_list", 5206, COLOURS_3(1, 15, 15) }, - { WC_STAFF_LIST, "staff_list", 5208, COLOURS_3(1, 4, 4) }, - { WC_FIRE_PROMPT, "staff_fire_prompt", 5225, COLOURS_1(154) }, - { WC_PARK_INFORMATION, "park_information", 5253, COLOURS_3(1, 19, 19) }, - { WC_FINANCES, "finances", 5187, COLOURS_3(1, 19, 19) }, - { WC_TITLE_MENU, "title_menu", 5249, COLOURS_3(140, 140, 140) }, - { WC_TITLE_EXIT, "title_exit", 5250, COLOURS_3(140, 140, 140) }, - { WC_RECENT_NEWS, "recent_news", 5192, COLOURS_3(1, 1, 0) }, - { WC_SCENARIO_SELECT, "scenario_select", 5252, COLOURS_3(1, 26, 26) }, - { WC_TRACK_DESIGN_LIST, "track_design_list", 5202, COLOURS_3(26, 26, 26) }, - { WC_TRACK_DESIGN_PLACE, "track_design_place", 5200, COLOURS_3(24, 24, 24) }, - { WC_NEW_CAMPAIGN, "new_campaign", 5188, COLOURS_3(19, 19, 19) }, - { WC_KEYBOARD_SHORTCUT_LIST, "keyboard_shortcuts", 5220, COLOURS_3(7, 7, 7) }, - { WC_CHANGE_KEYBOARD_SHORTCUT, "change_keyboard_shortcut", 5221, COLOURS_3(7, 7, 7) }, - { WC_MAP, "map", 5190, COLOURS_2(12, 24) }, - { WC_BANNER, "banner", 5209, COLOURS_3(24, 24, 24) }, - { WC_EDITOR_OBJECT_SELECTION, "editor_object_selection", 5210, COLOURS_3(4, 1, 1) }, - { WC_EDITOR_INVENTION_LIST, "editor_invention_list", 5211, COLOURS_3(4, 1, 1) }, - { WC_EDITOR_SCENARIO_OPTIONS, "editor_scenario_options", 5212, COLOURS_3(4, 1, 1) }, - { WC_EDTIOR_OBJECTIVE_OPTIONS, "editor_objection_options", 5213, COLOURS_3(4, 1, 1) }, - { WC_MANAGE_TRACK_DESIGN, "manage_track_design", 5215, COLOURS_3(1, 1, 1) }, - { WC_TRACK_DELETE_PROMPT, "track_delete_prompt", 5226, COLOURS_3(26, 26, 26) }, - { WC_INSTALL_TRACK, "install_track", 5216, COLOURS_3(26, 26, 26) }, - { WC_CLEAR_SCENERY, "clear_scenery", 5195, COLOURS_3(24, 24, 24) }, - { WC_CHEATS, "cheats", 5217, COLOURS_3(1, 19, 19) }, - { WC_RESEARCH, "research", 5189, COLOURS_3(1, 19, 19) }, - { WC_VIEWPORT, "viewport", 5191, COLOURS_3(24, 24, 24) }, - { WC_MAPGEN, "map_generation", 5214, COLOURS_3(12, 24, 24) }, - { WC_LOADSAVE, "loadsave", 5222, COLOURS_3(7, 7, 7) }, - { WC_LOADSAVE_OVERWRITE_PROMPT, "loadsave_overwrite_prompt", 5227, COLOURS_1(154) }, - { WC_TITLE_OPTIONS, "title_options", 5251, COLOURS_3(140, 140, 140) }, - { WC_LAND_RIGHTS, "land_rights", 5196, COLOURS_3(19, 19, 19) }, - { WC_THEMES, "themes", 5218, COLOURS_3(1, 12, 12) }, - { WC_STAFF, "staff", 5207, COLOURS_3(1, 4, 4) }, - { WC_EDITOR_TRACK_BOTTOM_TOOLBAR, "editor_track_bottom_toolbar", 5247, COLOURS_3(135, 135, 135) }, - { WC_EDITOR_SCENARIO_BOTTOM_TOOLBAR, "editor_scenario_bottom_toolbar", 5248, COLOURS_3(150, 150, 141) }, - { WC_TITLE_EDITOR, "title_sequences", 5433, COLOURS_3(1, 15, 15) }, + { WC_TOP_TOOLBAR, "top_toolbar", 5245, COLOURS_4(COLOUR_LIGHT_BLUE, COLOUR_DARK_GREEN, COLOUR_DARK_BROWN, COLOUR_GREY ) }, + { WC_BOTTOM_TOOLBAR, "bottom_toolbar", 5246, COLOURS_4(TRANSLUCENT(COLOUR_DARK_GREEN), TRANSLUCENT(COLOUR_DARK_GREEN), COLOUR_BLACK, COLOUR_BRIGHT_GREEN ) }, + { WC_RIDE, "ride", 5203, COLOURS_3(COLOUR_GREY, COLOUR_BORDEAUX_RED, COLOUR_GREY ) }, + { WC_RIDE_CONSTRUCTION, "ride_construction", 5199, COLOURS_3(COLOUR_DARK_BROWN, COLOUR_DARK_BROWN, COLOUR_DARK_BROWN ) }, + { WC_RIDE_LIST, "ride_list", 5204, COLOURS_3(COLOUR_GREY, COLOUR_BORDEAUX_RED, COLOUR_BORDEAUX_RED ) }, + { WC_SAVE_PROMPT, "save_prompt", 5223, COLOURS_1(TRANSLUCENT(COLOUR_BORDEAUX_RED) ) }, + { WC_CONSTRUCT_RIDE, "new_ride", 5201, COLOURS_3(COLOUR_DARK_BROWN, COLOUR_BORDEAUX_RED, COLOUR_BORDEAUX_RED ) }, + { WC_DEMOLISH_RIDE_PROMPT, "demolish_ride_prompt", 5224, COLOURS_1(TRANSLUCENT(COLOUR_BORDEAUX_RED) ) }, + { WC_SCENERY, "scenery", 5197, COLOURS_3(COLOUR_DARK_BROWN, COLOUR_DARK_GREEN, COLOUR_DARK_GREEN ) }, + { WC_OPTIONS, "options", 5219, COLOURS_3(COLOUR_LIGHT_BLUE, COLOUR_LIGHT_BLUE, COLOUR_LIGHT_BLUE ) }, + { WC_FOOTPATH, "footpath", 5198, COLOURS_3(COLOUR_DARK_BROWN, COLOUR_DARK_BROWN, COLOUR_DARK_BROWN ) }, + { WC_LAND, "land", 5193, COLOURS_3(COLOUR_DARK_BROWN, COLOUR_DARK_BROWN, COLOUR_DARK_BROWN ) }, + { WC_WATER, "water", 5194, COLOURS_3(COLOUR_DARK_BROWN, COLOUR_DARK_BROWN, COLOUR_DARK_BROWN ) }, + { WC_PEEP, "guest", 5205, COLOURS_3(COLOUR_GREY, COLOUR_OLIVE_GREEN, COLOUR_OLIVE_GREEN ) }, + { WC_GUEST_LIST, "guest_list", 5206, COLOURS_3(COLOUR_GREY, COLOUR_OLIVE_GREEN, COLOUR_OLIVE_GREEN ) }, + { WC_STAFF_LIST, "staff_list", 5208, COLOURS_3(COLOUR_GREY, COLOUR_LIGHT_PURPLE, COLOUR_LIGHT_PURPLE ) }, + { WC_FIRE_PROMPT, "staff_fire_prompt", 5225, COLOURS_1(TRANSLUCENT(COLOUR_BORDEAUX_RED) ) }, + { WC_PARK_INFORMATION, "park_information", 5253, COLOURS_3(COLOUR_GREY, COLOUR_DARK_YELLOW, COLOUR_DARK_YELLOW ) }, + { WC_FINANCES, "finances", 5187, COLOURS_3(COLOUR_GREY, COLOUR_DARK_YELLOW, COLOUR_DARK_YELLOW ) }, + { WC_TITLE_MENU, "title_menu", 5249, COLOURS_3(TRANSLUCENT(COLOUR_DARK_GREEN), TRANSLUCENT(COLOUR_DARK_GREEN), TRANSLUCENT(COLOUR_DARK_GREEN) ) }, + { WC_TITLE_EXIT, "title_exit", 5250, COLOURS_3(TRANSLUCENT(COLOUR_DARK_GREEN), TRANSLUCENT(COLOUR_DARK_GREEN), TRANSLUCENT(COLOUR_DARK_GREEN) ) }, + { WC_RECENT_NEWS, "recent_news", 5192, COLOURS_3(COLOUR_GREY, COLOUR_GREY, COLOUR_BLACK ) }, + { WC_SCENARIO_SELECT, "scenario_select", 5252, COLOURS_3(COLOUR_GREY, COLOUR_BORDEAUX_RED, COLOUR_BORDEAUX_RED ) }, + { WC_TRACK_DESIGN_LIST, "track_design_list", 5202, COLOURS_3(COLOUR_BORDEAUX_RED, COLOUR_BORDEAUX_RED, COLOUR_BORDEAUX_RED ) }, + { WC_TRACK_DESIGN_PLACE, "track_design_place", 5200, COLOURS_3(COLOUR_DARK_BROWN, COLOUR_DARK_BROWN, COLOUR_DARK_BROWN ) }, + { WC_NEW_CAMPAIGN, "new_campaign", 5188, COLOURS_3(COLOUR_DARK_YELLOW, COLOUR_DARK_YELLOW, COLOUR_DARK_YELLOW ) }, + { WC_KEYBOARD_SHORTCUT_LIST, "keyboard_shortcuts", 5220, COLOURS_3(COLOUR_LIGHT_BLUE, COLOUR_LIGHT_BLUE, COLOUR_LIGHT_BLUE ) }, + { WC_CHANGE_KEYBOARD_SHORTCUT, "change_keyboard_shortcut", 5221, COLOURS_3(COLOUR_LIGHT_BLUE, COLOUR_LIGHT_BLUE, COLOUR_LIGHT_BLUE ) }, + { WC_MAP, "map", 5190, COLOURS_2(COLOUR_DARK_GREEN, COLOUR_DARK_BROWN ) }, + { WC_BANNER, "banner", 5209, COLOURS_3(COLOUR_DARK_BROWN, COLOUR_DARK_BROWN, COLOUR_DARK_BROWN ) }, + { WC_EDITOR_OBJECT_SELECTION, "editor_object_selection", 5210, COLOURS_3(COLOUR_LIGHT_PURPLE, COLOUR_GREY, COLOUR_GREY ) }, + { WC_EDITOR_INVENTION_LIST, "editor_invention_list", 5211, COLOURS_3(COLOUR_LIGHT_PURPLE, COLOUR_GREY, COLOUR_GREY ) }, + { WC_EDITOR_SCENARIO_OPTIONS, "editor_scenario_options", 5212, COLOURS_3(COLOUR_LIGHT_PURPLE, COLOUR_GREY, COLOUR_GREY ) }, + { WC_EDTIOR_OBJECTIVE_OPTIONS, "editor_objection_options", 5213, COLOURS_3(COLOUR_LIGHT_PURPLE, COLOUR_GREY, COLOUR_GREY ) }, + { WC_MANAGE_TRACK_DESIGN, "manage_track_design", 5215, COLOURS_3(COLOUR_GREY, COLOUR_GREY, COLOUR_GREY ) }, + { WC_TRACK_DELETE_PROMPT, "track_delete_prompt", 5226, COLOURS_3(COLOUR_BORDEAUX_RED, COLOUR_BORDEAUX_RED, COLOUR_BORDEAUX_RED ) }, + { WC_INSTALL_TRACK, "install_track", 5216, COLOURS_3(COLOUR_BORDEAUX_RED, COLOUR_BORDEAUX_RED, COLOUR_BORDEAUX_RED ) }, + { WC_CLEAR_SCENERY, "clear_scenery", 5195, COLOURS_3(COLOUR_DARK_BROWN, COLOUR_DARK_BROWN, COLOUR_DARK_BROWN ) }, + { WC_CHEATS, "cheats", 5217, COLOURS_3(COLOUR_GREY, COLOUR_DARK_YELLOW, COLOUR_DARK_YELLOW ) }, + { WC_RESEARCH, "research", 5189, COLOURS_3(COLOUR_GREY, COLOUR_DARK_YELLOW, COLOUR_DARK_YELLOW ) }, + { WC_VIEWPORT, "viewport", 5191, COLOURS_3(COLOUR_DARK_BROWN, COLOUR_DARK_BROWN, COLOUR_DARK_BROWN ) }, + { WC_MAPGEN, "map_generation", 5214, COLOURS_3(COLOUR_DARK_GREEN, COLOUR_DARK_BROWN, COLOUR_DARK_BROWN ) }, + { WC_LOADSAVE, "loadsave", 5222, COLOURS_3(COLOUR_LIGHT_BLUE, COLOUR_LIGHT_BLUE, COLOUR_LIGHT_BLUE ) }, + { WC_LOADSAVE_OVERWRITE_PROMPT, "loadsave_overwrite_prompt", 5227, COLOURS_1(TRANSLUCENT(COLOUR_BORDEAUX_RED) ) }, + { WC_TITLE_OPTIONS, "title_options", 5251, COLOURS_3(TRANSLUCENT(COLOUR_DARK_GREEN), TRANSLUCENT(COLOUR_DARK_GREEN), TRANSLUCENT(COLOUR_DARK_GREEN) ) }, + { WC_LAND_RIGHTS, "land_rights", 5196, COLOURS_3(COLOUR_DARK_YELLOW, COLOUR_DARK_YELLOW, COLOUR_DARK_YELLOW ) }, + { WC_THEMES, "themes", 5218, COLOURS_3(COLOUR_GREY, COLOUR_DARK_GREEN, COLOUR_DARK_GREEN ) }, + { WC_STAFF, "staff", 5207, COLOURS_3(COLOUR_GREY, COLOUR_LIGHT_PURPLE, COLOUR_LIGHT_PURPLE ) }, + { WC_EDITOR_TRACK_BOTTOM_TOOLBAR, "editor_track_bottom_toolbar", 5247, COLOURS_3(TRANSLUCENT(COLOUR_LIGHT_BLUE), TRANSLUCENT(COLOUR_LIGHT_BLUE), TRANSLUCENT(COLOUR_LIGHT_BLUE) ) }, + { WC_EDITOR_SCENARIO_BOTTOM_TOOLBAR, "editor_scenario_bottom_toolbar", 5248, COLOURS_3(TRANSLUCENT(COLOUR_LIGHT_BROWN), TRANSLUCENT(COLOUR_LIGHT_BROWN), TRANSLUCENT(COLOUR_MOSS_GREEN) ) }, + { WC_TITLE_EDITOR, "title_sequences", 5433, COLOURS_3(COLOUR_GREY, COLOUR_OLIVE_GREEN, COLOUR_OLIVE_GREEN ) }, }; #define COLOURS_RCT1(c0, c1, c2, c3, c4, c5) { { (c0), (c1), (c2), (c3), (c4), (c5) } } theme_window_preset gThemeWindowsRCT1[] = { - { WC_TOP_TOOLBAR, COLOURS_RCT1(1, 1, 1, 1, 0, 0) }, - { WC_BOTTOM_TOOLBAR, COLOURS_RCT1(129, 129, 0, 18, 0, 0) }, - { WC_RIDE, COLOURS_RCT1(26, 1, 11, 0, 0, 0) }, - { WC_RIDE_LIST, COLOURS_RCT1(26, 1, 1, 0, 0, 0) }, - { WC_CONSTRUCT_RIDE, COLOURS_RCT1(26, 1, 1, 0, 0, 0) }, - { WC_PEEP, COLOURS_RCT1(22, 26, 26, 0, 0, 0) }, - { WC_GUEST_LIST, COLOURS_RCT1(22, 26, 26, 0, 0, 0) }, - { WC_STAFF_LIST, COLOURS_RCT1(12, 4, 4, 0, 0, 0) }, - { WC_FINANCES, COLOURS_RCT1(4, 1, 1, 0, 0, 0) }, - { WC_TITLE_MENU, COLOURS_RCT1(129, 129, 129, 0, 0, 0) }, - { WC_TITLE_EXIT, COLOURS_RCT1(129, 129, 129, 0, 0, 0) }, - { WC_NEW_CAMPAIGN, COLOURS_RCT1(4, 4, 1, 0, 0, 0) }, - { WC_TITLE_OPTIONS, COLOURS_RCT1(129, 129, 129, 0, 0, 0) }, - { WC_STAFF, COLOURS_RCT1(12, 4, 4, 0, 0, 0) }, - - - { 0xFF, { 0, 0, 0, 0, 0, 0 } } // End + { WC_TOP_TOOLBAR, COLOURS_RCT1(COLOUR_GREY, COLOUR_GREY, COLOUR_GREY, COLOUR_GREY, COLOUR_BLACK, COLOUR_BLACK) }, + { WC_BOTTOM_TOOLBAR, COLOURS_RCT1(TRANSLUCENT(COLOUR_GREY), TRANSLUCENT(COLOUR_GREY), COLOUR_BLACK, COLOUR_YELLOW, COLOUR_BLACK, COLOUR_BLACK) }, + { WC_RIDE, COLOURS_RCT1(COLOUR_BORDEAUX_RED, COLOUR_GREY, COLOUR_SATURATED_GREEN, COLOUR_BLACK, COLOUR_BLACK, COLOUR_BLACK) }, + { WC_RIDE_LIST, COLOURS_RCT1(COLOUR_BORDEAUX_RED, COLOUR_GREY, COLOUR_GREY, COLOUR_BLACK, COLOUR_BLACK, COLOUR_BLACK) }, + { WC_CONSTRUCT_RIDE, COLOURS_RCT1(COLOUR_BORDEAUX_RED, COLOUR_GREY, COLOUR_GREY, COLOUR_BLACK, COLOUR_BLACK, COLOUR_BLACK) }, + { WC_PEEP, COLOURS_RCT1(COLOUR_LIGHT_BROWN, COLOUR_BORDEAUX_RED, COLOUR_BORDEAUX_RED, COLOUR_BLACK, COLOUR_BLACK, COLOUR_BLACK) }, + { WC_GUEST_LIST, COLOURS_RCT1(COLOUR_LIGHT_BROWN, COLOUR_BORDEAUX_RED, COLOUR_BORDEAUX_RED, COLOUR_BLACK, COLOUR_BLACK, COLOUR_BLACK) }, + { WC_STAFF_LIST, COLOURS_RCT1(COLOUR_DARK_GREEN, COLOUR_LIGHT_PURPLE, COLOUR_LIGHT_PURPLE, COLOUR_BLACK, COLOUR_BLACK, COLOUR_BLACK) }, + { WC_FINANCES, COLOURS_RCT1(COLOUR_LIGHT_PURPLE, COLOUR_GREY, COLOUR_GREY, COLOUR_BLACK, COLOUR_BLACK, COLOUR_BLACK) }, + { WC_TITLE_MENU, COLOURS_RCT1(TRANSLUCENT(COLOUR_GREY), TRANSLUCENT(COLOUR_GREY), TRANSLUCENT(COLOUR_GREY), COLOUR_BLACK, COLOUR_BLACK, COLOUR_BLACK) }, + { WC_TITLE_EXIT, COLOURS_RCT1(TRANSLUCENT(COLOUR_GREY), TRANSLUCENT(COLOUR_GREY), TRANSLUCENT(COLOUR_GREY), COLOUR_BLACK, COLOUR_BLACK, COLOUR_BLACK) }, + { WC_NEW_CAMPAIGN, COLOURS_RCT1(COLOUR_LIGHT_PURPLE, COLOUR_LIGHT_PURPLE, COLOUR_GREY, COLOUR_BLACK, COLOUR_BLACK, COLOUR_BLACK) }, + { WC_TITLE_OPTIONS, COLOURS_RCT1(TRANSLUCENT(COLOUR_GREY), TRANSLUCENT(COLOUR_GREY), TRANSLUCENT(COLOUR_GREY), COLOUR_BLACK, COLOUR_BLACK, COLOUR_BLACK) }, + { WC_STAFF, COLOURS_RCT1(COLOUR_DARK_GREEN, COLOUR_LIGHT_PURPLE, COLOUR_LIGHT_PURPLE, COLOUR_BLACK, COLOUR_BLACK, COLOUR_BLACK) }, + THEME_DEF_END }; uint16 gCurrentTheme = 0; diff --git a/src/world/park.c b/src/world/park.c index 98188e243e..1111b8a4bd 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -20,6 +20,7 @@ #include "../addresses.h" #include "../game.h" +#include "../interface/colour.h" #include "../interface/window.h" #include "../localisation/localisation.h" #include "../management/award.h" @@ -69,9 +70,9 @@ void park_init() RCT2_GLOBAL(0x013CA740, uint8) = 0; RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, uint16) = 777; - RCT2_GLOBAL(RCT2_ADDRESS_HANDYMAN_COLOUR, uint8) = 28; - RCT2_GLOBAL(RCT2_ADDRESS_MECHANIC_COLOUR, uint8) = 7; - RCT2_GLOBAL(RCT2_ADDRESS_SECURITY_COLOUR, uint8) = 18; + RCT2_GLOBAL(RCT2_ADDRESS_HANDYMAN_COLOUR, uint8) = COLOUR_BRIGHT_RED; + RCT2_GLOBAL(RCT2_ADDRESS_MECHANIC_COLOUR, uint8) = COLOUR_LIGHT_BLUE; + RCT2_GLOBAL(RCT2_ADDRESS_SECURITY_COLOUR, uint8) = COLOUR_YELLOW; RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_LAST_GUESTS_IN_PARK, uint16) = 0; RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16) = 0; From 0f9bc229b4bebb0030af94b847b0acabf42e865a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sun, 1 Nov 2015 23:33:02 +0100 Subject: [PATCH 0939/1173] Fixes to safe_strncpy * don't touch memory at all if size passed is 0 * use original address instead of now-changed `destination` * fix one of the calls having improper size passed --- src/interface/console.c | 2 +- src/util/util.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/interface/console.c b/src/interface/console.c index a880cda82d..f9cb170361 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -188,7 +188,7 @@ void console_draw(rct_drawpixelinfo *dpi) int lineLength = min(sizeof(lineBuffer) - (size_t)utf8_get_codepoint_length(FORMAT_GREEN), (size_t)(nextLine - ch)); lineCh = lineBuffer; lineCh = utf8_write_codepoint(lineCh, FORMAT_GREEN); - safe_strncpy(lineCh, ch, lineLength); + safe_strncpy(lineCh, ch, CONSOLE_BUFFER_SIZE); lineCh[lineLength] = 0; gfx_draw_string(dpi, lineBuffer, 255, x, y); diff --git a/src/util/util.c b/src/util/util.c index 6138e13e39..923c08fa29 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -183,6 +183,10 @@ int strcicmp(char const *a, char const *b) char *safe_strncpy(char * destination, const char * source, size_t size) { + if (size == 0) + { + return destination; + } char *result = destination; bool terminated = false; for (size_t i = 0; i < size; i++) @@ -198,7 +202,7 @@ char *safe_strncpy(char * destination, const char * source, size_t size) } if (!terminated) { - destination[size - 1] = '\0'; + result[size - 1] = '\0'; log_warning("Truncating string %s to %d bytes.", destination, size); } return result; From eaffec651c37ff8d9d5ff6faa7265f99faa1afdb Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Mon, 2 Nov 2015 19:45:18 +0000 Subject: [PATCH 0940/1173] Fix #2178. Failure to load a scenario no longer causes intro to be playable. --- src/openrct2.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/openrct2.c b/src/openrct2.c index 8146782832..b1ccd332f2 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -277,7 +277,8 @@ void openrct2_launch() break; case STARTUP_ACTION_OPEN: assert(gOpenRCT2StartupActionPath != NULL); - rct2_open_file(gOpenRCT2StartupActionPath); + if (rct2_open_file(gOpenRCT2StartupActionPath) == 0) + break; RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_PLAYING; From ddd6b63d09e5c1be5641192bb723c1b2a0691cc3 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Mon, 2 Nov 2015 20:03:06 +0000 Subject: [PATCH 0941/1173] Fix #2173. Entrance fee too high can no longer be a news item if no money is on. This is kind of an original bug because the game doesn't check normally to see if money is on during this. I didn't want to reset the entrance fee as then it would be annoying switching between the two states. The peeps don't pay if no money is on so nothing is lost. --- src/scenario.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scenario.c b/src/scenario.c index ef3db26fa1..4b910753fd 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -505,7 +505,7 @@ void scenario_entrance_fee_too_high_check() int max_fee = totalRideValue + (totalRideValue / 2); uint32 game_flags = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), packed_xy; - if ((game_flags & PARK_FLAGS_PARK_OPEN) && park_entrance_fee > max_fee) { + if ((game_flags & PARK_FLAGS_PARK_OPEN) && (!game_flags & PARK_FLAGS_NO_MONEY) && park_entrance_fee > max_fee) { for (int i = 0; RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[i] != SPRITE_LOCATION_NULL; i++) { x = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[i] + 16; y = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, sint16)[i] + 16; From 4c72710e02437daed9c9bceffb053b85d6305f09 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Mon, 2 Nov 2015 20:08:55 +0000 Subject: [PATCH 0942/1173] Fix issue introduced in last commit --- src/scenario.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scenario.c b/src/scenario.c index 4b910753fd..76b6b6768e 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -505,7 +505,7 @@ void scenario_entrance_fee_too_high_check() int max_fee = totalRideValue + (totalRideValue / 2); uint32 game_flags = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32), packed_xy; - if ((game_flags & PARK_FLAGS_PARK_OPEN) && (!game_flags & PARK_FLAGS_NO_MONEY) && park_entrance_fee > max_fee) { + if ((game_flags & PARK_FLAGS_PARK_OPEN) && !(game_flags & PARK_FLAGS_NO_MONEY) && park_entrance_fee > max_fee) { for (int i = 0; RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[i] != SPRITE_LOCATION_NULL; i++) { x = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[i] + 16; y = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, sint16)[i] + 16; From 45bfdad4e3b0beeaee20cd2c5f61f703d49fb718 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 2 Nov 2015 20:43:55 +0000 Subject: [PATCH 0943/1173] fix #1144 --- src/interface/window.h | 10 +++++++++- src/windows/loadsave.c | 25 +++++++++++++++++++++++++ src/windows/save_prompt.c | 14 +++++++++----- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/interface/window.h b/src/interface/window.h index 3df13ba0a4..e37b9244c6 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -485,8 +485,16 @@ enum { LOADSAVETYPE_NETWORK = 1 << 4, }; -extern bool gLoadSaveTitleSequenceSave; +enum { + MODAL_RESULT_FAIL = -1, + MODAL_RESULT_CANCEL, + MODAL_RESULT_OK +}; +typedef void (*modal_callback)(int result); + +extern bool gLoadSaveTitleSequenceSave; +extern modal_callback gLoadSaveCallback; // rct2: 0x01420078 extern rct_window* g_window_list; diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index cf57c1442a..41d8e81932 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -124,6 +124,8 @@ typedef struct { uint8 type; } loadsave_list_item; +modal_callback gLoadSaveCallback; + int _listItemsCount = 0; loadsave_list_item *_listItems = NULL; char _directory[MAX_PATH]; @@ -145,6 +147,7 @@ static rct_window *window_overwrite_prompt_open(const char *name, const char *pa rct_window *window_loadsave_open(int type, char *defaultName) { + gLoadSaveCallback = NULL; gLoadSaveTitleSequenceSave = false; char path[MAX_PATH], *ch; int includeNewItem; @@ -731,6 +734,13 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co window_loadsave_sort_list(sortStartIndex, _listItemsCount - 1); } +static void window_loadsave_invoke_callback(int result) +{ + if (gLoadSaveCallback != NULL) { + gLoadSaveCallback(result); + } +} + static void window_loadsave_select(rct_window *w, const char *path) { SDL_RWops* rw; @@ -750,6 +760,7 @@ static void window_loadsave_select(rct_window *w, const char *path) title_sequence_add_save(gCurrentTitleSequence, path, newName); window_close(w); } + window_loadsave_invoke_callback(MODAL_RESULT_OK); } else if (game_load_save(path)) { if (_loadsaveType & LOADSAVETYPE_NETWORK) { @@ -762,11 +773,13 @@ static void window_loadsave_select(rct_window *w, const char *path) window_close(w); gfx_invalidate_screen(); + window_loadsave_invoke_callback(MODAL_RESULT_OK); rct2_endupdate(); } else { // 1050, not the best message... window_error_open(STR_LOAD_GAME, 1050); + window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; case (LOADSAVETYPE_SAVE | LOADSAVETYPE_GAME) : @@ -783,22 +796,28 @@ static void window_loadsave_select(rct_window *w, const char *path) window_close_by_class(WC_LOADSAVE); game_do_command(0, 1047, 0, -1, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); gfx_invalidate_screen(); + + window_loadsave_invoke_callback(MODAL_RESULT_OK); } else { window_error_open(STR_SAVE_GAME, 1047); + window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } } else { window_error_open(STR_SAVE_GAME, 1047); + window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; case (LOADSAVETYPE_LOAD | LOADSAVETYPE_LANDSCAPE) : editor_load_landscape(path); if (1) { gfx_invalidate_screen(); + window_loadsave_invoke_callback(MODAL_RESULT_OK); rct2_endupdate(); } else { // 1050, not the best message... window_error_open(STR_LOAD_LANDSCAPE, 1050); + window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; case (LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE) : @@ -810,11 +829,14 @@ static void window_loadsave_select(rct_window *w, const char *path) if (success) { window_close_by_class(WC_LOADSAVE); gfx_invalidate_screen(); + window_loadsave_invoke_callback(MODAL_RESULT_OK); } else { window_error_open(STR_SAVE_LANDSCAPE, 1049); + window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } } else { window_error_open(STR_SAVE_LANDSCAPE, 1049); + window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; case (LOADSAVETYPE_SAVE | LOADSAVETYPE_SCENARIO) : @@ -834,16 +856,19 @@ static void window_loadsave_select(rct_window *w, const char *path) if (success) { window_close_by_class(WC_LOADSAVE); + window_loadsave_invoke_callback(MODAL_RESULT_OK); title_load(); } else { window_error_open(STR_SAVE_SCENARIO, STR_SCENARIO_SAVE_FAILED); s6Info->editor_step = EDITOR_STEP_OBJECTIVE_SELECTION; + window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; } case (LOADSAVETYPE_LOAD | LOADSAVETYPE_TRACK) : window_install_track_open(path); window_close_by_class(WC_LOADSAVE); + window_loadsave_invoke_callback(MODAL_RESULT_OK); break; } } diff --git a/src/windows/save_prompt.c b/src/windows/save_prompt.c index 020630df44..0321e20a66 100644 --- a/src/windows/save_prompt.c +++ b/src/windows/save_prompt.c @@ -72,6 +72,7 @@ static void window_save_prompt_close(rct_window *w); static void window_save_prompt_mouseup(rct_window *w, int widgetIndex); static void window_save_prompt_invalidate(rct_window *w); static void window_save_prompt_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_save_prompt_callback(int result); static rct_window_event_list window_save_prompt_events = { window_save_prompt_close, @@ -237,6 +238,7 @@ static void window_save_prompt_mouseup(rct_window *w, int widgetIndex) case WIDX_SAVE: save_game_as(); window_close(w); + gLoadSaveCallback = window_save_prompt_callback; break; case WIDX_DONT_SAVE: game_load_or_quit_no_save_prompt(); @@ -259,11 +261,6 @@ static void window_save_prompt_mouseup(rct_window *w, int widgetIndex) return; } } - - if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) < 3840) { - game_load_or_quit_no_save_prompt(); - return; - } } static void window_save_prompt_invalidate(rct_window *w) @@ -274,4 +271,11 @@ static void window_save_prompt_invalidate(rct_window *w) static void window_save_prompt_paint(rct_window *w, rct_drawpixelinfo *dpi) { window_draw_widgets(w, dpi); +} + +static void window_save_prompt_callback(int result) +{ + if (result == MODAL_RESULT_OK) { + game_load_or_quit_no_save_prompt(); + } } \ No newline at end of file From 2c58e1d89444a118a29b2d1a0009a014ce7de33b Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 2 Nov 2015 21:09:27 +0000 Subject: [PATCH 0944/1173] use internal load window for convert saved game to scenario, closes #2121 --- src/editor.c | 43 ++++++++++--------------------------------- 1 file changed, 10 insertions(+), 33 deletions(-) diff --git a/src/editor.c b/src/editor.c index 8175d03ca6..76d53e952f 100644 --- a/src/editor.c +++ b/src/editor.c @@ -45,6 +45,7 @@ #include "world/scenery.h" #include "world/sprite.h" +void editor_convert_save_to_scenario_callback(int result); static void set_all_land_owned(); static int editor_load_landscape_from_sv4(const char *path); static int editor_load_landscape_from_sc4(const char *path); @@ -93,48 +94,24 @@ void editor_load() safe_strncpy((char*)RCT2_ADDRESS_SCENARIO_NAME, language_get_string(2749), 0x40); } -/** - * - * rct2: 0x0067505F - */ -static int show_convert_saved_game_to_scenario_dialog(char *resultPath) -{ - int result; - char title[256]; - char filename[MAX_PATH]; - char filterName[256]; - - format_string(title, STR_CONVERT_SAVED_GAME_TO_SCENARIO_1038, NULL); - safe_strncpy(filename, RCT2_ADDRESS(RCT2_ADDRESS_SAVED_GAMES_PATH, char), MAX_PATH); - format_string(filterName, STR_RCT2_SAVED_GAME, NULL); - - pause_sounds(); - result = platform_open_common_file_dialog(1, title, filename, "*.SV6", filterName); - unpause_sounds(); - - if (result) - safe_strncpy(resultPath, filename, MAX_PATH); - return result; -} - /** * * rct2: 0x00672781 */ void editor_convert_save_to_scenario() { - rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; - char savedGamePath[MAX_PATH]; - tool_cancel(); - if (!show_convert_saved_game_to_scenario_dialog(savedGamePath)) - return; + window_loadsave_open(LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME, NULL); + gLoadSaveCallback = editor_convert_save_to_scenario_callback; +} - path_set_extension(savedGamePath, ".SV6"); - - // Load the saved game - if (!game_load_save(savedGamePath)) +void editor_convert_save_to_scenario_callback(int result) +{ + if (result != MODAL_RESULT_OK) { return; + } + + rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) |= PARK_FLAGS_NO_MONEY_SCENARIO; From a0909a242d60aff0a0484b81e04a480d6afc6266 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 2 Nov 2015 21:23:01 +0000 Subject: [PATCH 0945/1173] fix several safe_strncpy calls --- src/scenario.c | 14 +++----------- src/windows/loadsave.c | 5 ++--- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/src/scenario.c b/src/scenario.c index 76b6b6768e..d250db71cd 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -317,27 +317,19 @@ void scenario_begin() { // Get filename utf8 filename[MAX_PATH]; - int len = strnlen(_scenarioFileName, MAX_PATH); - safe_strncpy(filename, _scenarioFileName, len); - if (len == MAX_PATH) - { - filename[MAX_PATH - 1] = '\0'; - log_warning("truncated string %s", filename); - } + safe_strncpy(filename, _scenarioFileName, sizeof(filename)); path_remove_extension(filename); rct_string_id localisedStringIds[3]; if (language_get_localised_scenario_strings(filename, localisedStringIds)) { if (localisedStringIds[0] != (rct_string_id)STR_NONE) { - safe_strncpy((char*)RCT2_ADDRESS_SCENARIO_NAME, language_get_string(localisedStringIds[0]), 31); - ((char*)RCT2_ADDRESS_SCENARIO_NAME)[31] = '\0'; + safe_strncpy((char*)RCT2_ADDRESS_SCENARIO_NAME, language_get_string(localisedStringIds[0]), 32); } if (localisedStringIds[1] != (rct_string_id)STR_NONE) { park_set_name(language_get_string(localisedStringIds[1])); } if (localisedStringIds[2] != (rct_string_id)STR_NONE) { - safe_strncpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, language_get_string(localisedStringIds[2]), 255); - ((char*)RCT2_ADDRESS_SCENARIO_DETAILS)[255] = '\0'; + safe_strncpy((char*)RCT2_ADDRESS_SCENARIO_DETAILS, language_get_string(localisedStringIds[2]), 256); } } else { rct_stex_entry* stex = g_stexEntries[0]; diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 41d8e81932..78bbcc91fc 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -642,15 +642,14 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co if (!topLevel){ listItem = &_listItems[_listItemsCount]; safe_strncpy(listItem->name, language_get_string(2718), sizeof(listItem->name)); - memset(listItem->path, '\0', MAX_PATH); - safe_strncpy(listItem->path, directory, lastSlash + 1); + safe_strncpy(listItem->path, directory, sizeof(listItem->path)); listItem->type = TYPE_UP; _listItemsCount++; } else if (platform_get_drives() != 0 && directory[0] != '\0'){ includeNewItem = false; listItem = &_listItems[_listItemsCount]; safe_strncpy(listItem->name, language_get_string(2718), sizeof(listItem->name)); - memset(listItem->path, '\0', MAX_PATH); + memset(listItem->path, '\0', sizeof(listItem->path)); listItem->type = TYPE_UP; _listItemsCount++; } From be32b5e5f49119e04c08f9f3ff72541b9e1ac4ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 30 Oct 2015 10:57:57 +0100 Subject: [PATCH 0946/1173] Init all fields in audio classes --- src/audio/mixer.cpp | 17 ----------------- src/audio/mixer.h | 40 ++++++++++++++++++++-------------------- 2 files changed, 20 insertions(+), 37 deletions(-) diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index e232fa908e..fa692f1787 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -199,14 +199,6 @@ bool Source_Sample::Convert(AudioFormat format) return false; } -Source_SampleStream::Source_SampleStream() -{ - length = 0; - rw = NULL; - buffer = 0; - buffersize = 0; -} - Source_SampleStream::~Source_SampleStream() { Unload(); @@ -349,18 +341,9 @@ void Source_SampleStream::Unload() Channel::Channel() { - resampler = 0; SetRate(1); SetVolume(SDL_MIX_MAXVOLUME); - oldvolume = 0; - oldvolume_l = 0; - oldvolume_r = 0; SetPan(0.5f); - done = true; - stopping = false; - source = 0; - deletesourceondone = false; - group = MIXER_GROUP_NONE; } Channel::~Channel() diff --git a/src/audio/mixer.h b/src/audio/mixer.h index 0e6faf3218..3fe66b4816 100644 --- a/src/audio/mixer.h +++ b/src/audio/mixer.h @@ -105,7 +105,7 @@ protected: class Source_SampleStream : public Source { public: - Source_SampleStream(); + Source_SampleStream() = default; ~Source_SampleStream(); bool LoadWAV(SDL_RWops* rw); @@ -113,10 +113,10 @@ private: Uint32 FindChunk(SDL_RWops* rw, Uint32 wanted_id); void Unload(); - SDL_RWops* rw; - Uint64 databegin; - uint8* buffer; - unsigned long buffersize; + SDL_RWops* rw = nullptr; + Uint64 databegin = 0; + uint8* buffer = nullptr; + unsigned long buffersize = 0; protected: unsigned long Read(unsigned long offset, const uint8** data, unsigned long length); @@ -139,21 +139,21 @@ public: friend class Mixer; private: - int loop; - unsigned long offset; - double rate; - int volume; - float volume_l, volume_r; - float oldvolume_l, oldvolume_r; - float pan; - bool done; - bool deleteondone; - bool deletesourceondone; - bool stopping; - int oldvolume; - int group; - SpeexResamplerState* resampler; - Source* source; + int loop = 0; + unsigned long offset = 0; + double rate = 0; + int volume = 1; + float volume_l = 0.f, volume_r = 0.f; + float oldvolume_l = 0.f, oldvolume_r = 0.f; + float pan = 0; + bool done = true; + bool deleteondone = false; + bool deletesourceondone = false; + bool stopping = false; + int oldvolume = 0; + int group = MIXER_GROUP_NONE; + SpeexResamplerState* resampler = nullptr; + Source* source = nullptr; }; class Mixer From c0e2a5c7beea46ef6c92e5765c253f142b8b5e38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 30 Oct 2015 11:00:35 +0100 Subject: [PATCH 0947/1173] Add get_current_rotation function and DEBUG_LEVEL macros --- CMakeLists.txt | 8 +- src/audio/audio.c | 2 +- src/diagnostic.h | 43 +++++++++++ src/interface/screenshot.c | 2 +- src/interface/viewport.c | 72 +++++++++++------- src/interface/viewport.h | 2 + src/interface/window.c | 4 +- src/ride/ride.c | 4 +- src/ride/track.c | 2 +- src/ride/track_paint.c | 130 ++++++++++++++++---------------- src/scenario.c | 4 +- src/windows/footpath.c | 6 +- src/windows/guest.c | 2 +- src/windows/map.c | 18 ++--- src/windows/maze_construction.c | 2 +- src/windows/park.c | 2 +- src/windows/ride.c | 2 +- src/windows/ride_construction.c | 2 +- src/windows/staff.c | 2 +- src/windows/top_toolbar.c | 8 +- src/windows/track_place.c | 6 +- src/windows/viewport.c | 4 +- src/world/map.c | 10 +-- src/world/map_animation.c | 5 +- src/world/money_effect.c | 4 +- src/world/sprite.c | 2 +- 26 files changed, 209 insertions(+), 139 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 20a9c6416a..3664d6f6a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,10 @@ else (DISABLE_NETWORK) endif (WIN32) endif (DISABLE_NETWORK) +set(DEBUG_LEVEL 0 CACHE STRING "Select debug level for compilation. Use value in range 0–3.") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDEBUG=${DEBUG_LEVEL}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDEBUG=${DEBUG_LEVEL}") + # include lib include_directories("lib/") # add source files @@ -57,8 +61,8 @@ file(GLOB_RECURSE ORCT2_SOURCES "src/*.c" "src/*.cpp" "lib/argparse/*.c" "lib/cu if (UNIX) # force 32bit build for now and set necessary flags to compile code as is - set(CMAKE_C_FLAGS "-m32 -std=gnu99") - set(CMAKE_CXX_FLAGS "-m32 -std=gnu++11") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -std=gnu99") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -std=gnu++11") set(CMAKE_SHARED_LINKER_FLAGS "-m32") set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}) endif (UNIX) diff --git a/src/audio/audio.c b/src/audio/audio.c index ac90544cc4..02f67c061e 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -108,7 +108,7 @@ int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z) } sint16 rx; sint16 ry; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) { + switch (get_current_rotation()) { case 0: rx = y - x; ry = ((y + x) / 2) - z; diff --git a/src/diagnostic.h b/src/diagnostic.h index 556ff98324..00c03bd154 100644 --- a/src/diagnostic.h +++ b/src/diagnostic.h @@ -30,6 +30,49 @@ enum { DIAGNOSTIC_LEVEL_COUNT }; +/* + * Compile-time debug levels. + * + * When compiling, just add -DDEBUG={0,1,2,3} (where 0 means disabled) + * Regardless of DEBUG value, a set of defines will be created: + * - DEBUG_LEVEL_1 + * - DEBUG_LEVEL_2 + * - DEBUG_LEVEL_3 + * which you would use like so: + * + * #if DEBUG_LEVEL_1 + * (... some debug code ...) + * #if DEBUG_LEVEL_2 + * (... more debug code ...) + * #endif // DEBUG_LEVEL_2 + * #endif // DEBUG_LEVEL_1 + * + * The defines will be either 0 or 1 so compiler will complain about undefined + * macro if you forget to include the file, which would not happen if we were + * only checking whether the define is present or not. + */ + +#if defined(DEBUG) + #if DEBUG > 0 + #define DEBUG_LEVEL_1 1 + #if DEBUG > 1 + #define DEBUG_LEVEL_2 1 + #if DEBUG > 2 + #define DEBUG_LEVEL_3 1 + #else + #define DEBUG_LEVEL_3 0 + #endif // DEBUG > 2 + #else + #define DEBUG_LEVEL_3 0 + #define DEBUG_LEVEL_2 0 + #endif // DEBUG > 1 + #endif // DEBUG > 0 +#else + #define DEBUG_LEVEL_3 0 + #define DEBUG_LEVEL_2 0 + #define DEBUG_LEVEL_1 0 +#endif // defined(DEBUG) + extern int _log_levels[DIAGNOSTIC_LEVEL_COUNT]; void diagnostic_log(int diagnosticLevel, const char *format, ...); diff --git a/src/interface/screenshot.c b/src/interface/screenshot.c index 9ac0c16546..79c1ae2ccf 100644 --- a/src/interface/screenshot.c +++ b/src/interface/screenshot.c @@ -357,7 +357,7 @@ bool screenshot_write_png(rct_drawpixelinfo *dpi, const char *path) void screenshot_giant() { - int originalRotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + int originalRotation = get_current_rotation(); int originalZoom = 0; rct_window *mainWindow = window_get_main(); diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 20d5a872f8..f10ba0d4d0 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -140,7 +140,7 @@ void center_2d_coordinates(int x, int y, int z, int* out_x, int* out_y, rct_view .z = z }; - rct_xy16 coord_2d = coordinate_3d_to_2d(&coord_3d, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + rct_xy16 coord_2d = coordinate_3d_to_2d(&coord_3d, get_current_rotation()); // If the start location was invalid // propagate the invalid location to the output. @@ -259,7 +259,7 @@ void sub_689174(sint16* x, sint16* y, sint16 *z) if (pos.x > max && pos.y > max) { int x_corr[] = { -1, 1, 1, -1 }; int y_corr[] = { -1, -1, 1, 1 }; - uint32 rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); + uint32 rotation = get_current_rotation(); pos.x += x_corr[rotation] * height; pos.y += y_corr[rotation] * height; } @@ -816,7 +816,7 @@ void sub_688485(){ /* rct2: 0x006874B0, 0x00687618, 0x0068778C, 0x00687902, 0x0098199C */ int sub_98199C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_y, sint16 length_x, uint32 rotation){ - RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[get_current_rotation()], al | (ah << 8), image_id, cl, @@ -858,7 +858,7 @@ int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 le }; switch (rotation) { - case 0: + case 0: rotate_map_coordinates(&coord_3d.x, &coord_3d.y, 0); break; case 1: @@ -1008,7 +1008,7 @@ void viewport_vehicle_paint_setup(rct_vehicle *vehicle, int imageDirection) RCT2_GLOBAL(0x9DEA52, uint16) = 0; RCT2_GLOBAL(0x9DEA54, uint16) = 0; RCT2_GLOBAL(0x9DEA56, uint16) = z + 2; - sub_98197C(0, 0, ebx, 0, z, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 0, ebx, 0, z, 1, 1, get_current_rotation()); return; } @@ -1087,7 +1087,7 @@ void viewport_litter_paint_setup(rct_litter *litter, int imageDirection) RCT2_GLOBAL(0x9DEA54, uint16) = 0xFFFC; RCT2_GLOBAL(0x9DEA56, uint16) = litter->z + 2; - sub_98197C(0, 0xFF, image_id, 0, litter->z, 4, 4, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 0xFF, image_id, 0, litter->z, 4, 4, get_current_rotation()); } @@ -1125,7 +1125,7 @@ void sprite_paint_setup(uint16 eax, uint16 ecx){ if (dpi->x + dpi->width <= spr->unknown.sprite_left)continue; if (spr->unknown.sprite_right <= dpi->x)continue; - int image_direction = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); + int image_direction = get_current_rotation(); image_direction <<= 3; image_direction += spr->unknown.sprite_direction; image_direction &= 0x1F; @@ -1230,7 +1230,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma sint16 lengthY = (direction & 1) ? 28 : 2; sint16 lengthX = (direction & 1) ? 2 : 28; - sub_98197C(0, ah, image_id, 0, height, lengthY, lengthX, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, ah, image_id, 0, height, lengthY, lengthX, get_current_rotation()); if (transparant_image_id){ if (is_exit){ @@ -1252,7 +1252,7 @@ void viewport_ride_entrance_exit_paint_setup(uint8 direction, int height, rct_ma RCT2_GLOBAL(0x009DEA54, uint16) = (direction & 1) ? 2 : 28; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(0, ah, image_id, 0, height, lengthY, lengthX, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, ah, image_id, 0, height, lengthY, lengthX, get_current_rotation()); if (transparant_image_id){ transparant_image_id += 4; @@ -1367,7 +1367,7 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, sint16) = height; - sub_98197C(0, 0, image_id, 0, height, 0x1C, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, 0, image_id, 0, height, 0x1C, 32, get_current_rotation()); entrance = (rct_entrance_type*)object_entry_groups[OBJECT_TYPE_PARK_ENTRANCE].chunks[0]; image_id = (entrance->image_id + direction * 3) | ghost_id; @@ -1376,7 +1376,7 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, sint16) = height + 32; - sub_98197C(0, 0x2F, image_id, 0, height, 0x1C, 0x1C, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, 0x2F, image_id, 0, height, 0x1C, 0x1C, get_current_rotation()); if ((direction + 1) & (1 << 1)) break; @@ -1423,7 +1423,7 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele RCT2_GLOBAL(0x009DEA54, uint16) = 3; RCT2_GLOBAL(0x009DEA56, sint16) = height; - sub_98197C(0, 0x4F, image_id, 0, height, di, 0x1A, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, 0x4F, image_id, 0, height, di, 0x1A, get_current_rotation()); break; } @@ -1491,7 +1491,7 @@ void viewport_track_paint_setup(uint8 direction, int height, rct_map_element *ma RCT2_GLOBAL(0x009DEA52, uint16) = 1000; RCT2_GLOBAL(0x009DEA54, uint16) = 1000; RCT2_GLOBAL(0x009DEA56, uint16) = 2047; - sub_98197C(16, 0, ebx, 16, height + ax + 3, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(16, 0, ebx, 16, height + ax + 3, 1, 1, get_current_rotation()); } } @@ -1571,7 +1571,7 @@ void viewport_entrance_paint_setup(uint8 direction, int height, rct_map_element* RCT2_GLOBAL(0x009DEA56, sint16) = z; RCT2_GLOBAL(0x009DEA56, uint16) += 64; - sub_98197C(16, 0, image_id, 16, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(16, 0, image_id, 16, height, 1, 1, get_current_rotation()); } } @@ -1620,11 +1620,11 @@ void viewport_banner_paint_setup(uint8 direction, int height, rct_map_element* m 0x20000000; } - sub_98197C(0, 0x15, image_id, 0, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, 0x15, image_id, 0, height, 1, 1, get_current_rotation()); RCT2_GLOBAL(0x9DEA52, uint32) = RCT2_ADDRESS(0x98D888, uint32)[direction * 2]; image_id++; - sub_98197C(0, 0x15, image_id, 0, height, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + sub_98197C(0, 0x15, image_id, 0, height, 1, 1, get_current_rotation()); // Opposite direction direction ^= 2; @@ -1678,7 +1678,7 @@ static void sub_68B3FB(int x, int y) rct_map_element* map_element = map_get_first_element_at(x >> 5, y >> 5); int dx = 0; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) { + switch (get_current_rotation()) { case 0: dx = x + y; break; @@ -1702,7 +1702,7 @@ static void sub_68B3FB(int x, int y) RCT2_GLOBAL(0x9DE56A, uint16) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) && RCT2_GLOBAL(0x9DE56E, uint16) == RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16)){ uint8 arrowRotation = - (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + (get_current_rotation() + (RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) & 3)) & 3; uint32 imageId = @@ -1719,7 +1719,7 @@ static void sub_68B3FB(int x, int y) RCT2_GLOBAL(0x9DEA54, uint16) = 0; RCT2_GLOBAL(0x9DEA56, uint16) = arrowZ + 18; - sub_98197C(0, 0xFF, imageId, 0, arrowZ, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 0xFF, imageId, 0, arrowZ, 32, 32, get_current_rotation()); } int bx = dx + 52; @@ -1753,7 +1753,7 @@ static void sub_68B3FB(int x, int y) RCT2_GLOBAL(0x9DE56C, sint16) = y; RCT2_GLOBAL(0x9DE57C, uint16) = 0; do { - int direction = (map_element->type + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) & MAP_ELEMENT_DIRECTION_MASK; + int direction = (map_element->type + get_current_rotation()) & MAP_ELEMENT_DIRECTION_MASK; int height = map_element->base_height * 8; uint32_t dword_9DE574 = RCT2_GLOBAL(0x9DE574, uint32_t); @@ -1806,7 +1806,7 @@ static void viewport_blank_tiles_paint_setup(int x, int y) rct_drawpixelinfo *dpi = RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*); int dx; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) { + switch (get_current_rotation()) { case 0: dx = x + y; break; @@ -1835,14 +1835,14 @@ static void viewport_blank_tiles_paint_setup(int x, int y) RCT2_GLOBAL(0x9DE56C, sint16) = y; RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8_t) = VIEWPORT_INTERACTION_ITEM_NONE; RCT2_CALLPROC_X( - (int)RCT2_ADDRESS(0x98196C, uint32_t*)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + (int)RCT2_ADDRESS(0x98196C, uint32_t*)[get_current_rotation()], 0xFF00, 3123, y & 0xFF00, 16, 32, 32, - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t) + get_current_rotation() ); } @@ -1925,7 +1925,7 @@ void viewport_paint_setup() uint16 num_vertical_quadrants = (dpi->height + 2128) >> 5; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)){ + switch (get_current_rotation()){ case 0: mapTile.x = mapTile.y - half_x; mapTile.y = mapTile.y + half_x; @@ -2074,7 +2074,7 @@ void sub_688217_helper(uint16 ax, uint8 flag) if (!(ps_next->var_1B & (1 << 1))) continue; int yes = 0; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) { + switch (get_current_rotation()) { case 0: if (my_some_y >= ps_next->some_x && my_other_y >= ps_next->attached_y && my_other_x >= ps_next->attached_x && !(my_some_x < ps_next->some_y && my_attached_y < ps_next->other_y && my_attached_x < ps_next->other_x)) @@ -2339,7 +2339,7 @@ rct_xy16 screen_coord_to_viewport_coord(rct_viewport *viewport, uint16 x, uint16 rct_xy16 viewport_coord_to_map_coord(int x, int y, int z) { rct_xy16 ret; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) { + switch (get_current_rotation()) { case 0: ret.x = -x / 2 + y + z; ret.y = x / 2 + y + z; @@ -2854,3 +2854,23 @@ void screen_get_map_xy_side_with_z(sint16 screenX, sint16 screenY, sint16 z, sin *mapX = floor2(*mapX, 32); *mapY = floor2(*mapY, 32); } + +/** + * Get current viewport rotation. + * + * If an invalid rotation is detected and DEBUG_LEVEL_1 is enabled, an error + * will be reported. + * + * @returns rotation in range 0-3 (inclusive) + */ +int get_current_rotation() +{ + int rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); + int rotation_masked = rotation & 3; +#if DEBUG_LEVEL_1 + if (rotation != rotation_masked) { + log_error("Found wrong rotation %d! Will return %d instead.", rotation, rotation_masked); + } +#endif // DEBUG_LEVEL_1 + return rotation_masked; +} diff --git a/src/interface/viewport.h b/src/interface/viewport.h index d416a96494..16b585f82e 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -144,4 +144,6 @@ void screen_get_map_xy_quadrant_with_z(sint16 screenX, sint16 screenY, sint16 z, void screen_get_map_xy_side(sint16 screenX, sint16 screenY, sint16 *mapX, sint16 *mapY, uint8 *side); void screen_get_map_xy_side_with_z(sint16 screenX, sint16 screenY, sint16 z, sint16 *mapX, sint16 *mapY, uint8 *side); +int get_current_rotation(); + #endif diff --git a/src/interface/window.c b/src/interface/window.c index e40ca34f86..90865813d7 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -1301,7 +1301,7 @@ void window_scroll_to_location(rct_window *w, int x, int y, int z) } } - rct_xy16 map_coordinate = coordinate_3d_to_2d(&location_3d, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)); + rct_xy16 map_coordinate = coordinate_3d_to_2d(&location_3d, get_current_rotation()); int i = 0; if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO)) { @@ -1389,7 +1389,7 @@ void window_rotate_camera(rct_window *w, int direction) z = map_element_height(x, y); } - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + direction) % 4; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = (get_current_rotation() + direction) % 4; int new_x, new_y; center_2d_coordinates(x, y, z, &new_x, &new_y, viewport); diff --git a/src/ride/ride.c b/src/ride/ride.c index dc97e233ce..5f3c4d5c15 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1986,7 +1986,7 @@ static void ride_spiral_slide_update(rct_ride *ride) z = ride->station_heights[i]; mapElement = ride_get_station_start_track_element(ride, i); - int rotation = ((mapElement->type & 3) << 2) | RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + int rotation = ((mapElement->type & 3) << 2) | get_current_rotation(); x *= 32; y *= 32; x += RCT2_GLOBAL(0x0098DDB8 + (rotation * 4), sint16); @@ -3231,7 +3231,7 @@ int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint RCT2_GLOBAL(0x009AF47C, uint16) = sampleRate; sint16 v11; sint16 v12; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) { + switch (get_current_rotation()) { case 0: v11 = y - x; v12 = ((y + x) / 2) - z; diff --git a/src/ride/track.c b/src/ride/track.c index 290bb7ae46..8d12c0a5f2 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -716,7 +716,7 @@ int backup_map(){ *(uint16*)(backup_info + 4) = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16); *(uint16*)(backup_info + 6) = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_MINUS_2, uint16); *(uint16*)(backup_info + 8) = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16); - *(uint32*)(backup_info + 10) = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); + *(uint32*)(backup_info + 10) = get_current_rotation(); return 1; } diff --git a/src/ride/track_paint.c b/src/ride/track_paint.c index 5f6f0c2f2a..5d6920f3ec 100644 --- a/src/ride/track_paint.c +++ b/src/ride/track_paint.c @@ -182,7 +182,7 @@ void top_spin_paint_tile_0(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA52, uint16) = 0; RCT2_GLOBAL(0x009DEA54, uint16) = 0; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 1, image_id, 0, height, 32, 32, get_current_rotation()); RCT2_GLOBAL(0x141E9B4, uint16) = 0xFFFF; RCT2_GLOBAL(0x141E9B8, uint16) = 0xFFFF; @@ -265,7 +265,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction // Left back bottom support image_id += 572; - sub_98197C(al, 90, image_id, cl, height, lengthY, lengthX, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(al, 90, image_id, cl, height, lengthY, lengthX, get_current_rotation()); image_id = RCT2_GLOBAL(0x00F441A0, uint32); if (image_id == 0x20000000) { @@ -290,10 +290,10 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction sub_98199C( al, 90, - image_id, - cl, - height, - lengthY, + image_id, + cl, + height, + lengthY, lengthX, 0); @@ -352,18 +352,18 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction sub_98199C( (sint8)seatCoords.x, - 90, - image_id, + 90, + image_id, (sint8)seatCoords.y, - seatCoords.z, - lengthY, + seatCoords.z, + lengthY, lengthX, 0); rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); if (dpi->zoom_level < 2 && vehicle != NULL && vehicle->num_peeps != 0) { - image_id = - (vehicle->peep_tshirt_colours[0] << 19) | + image_id = + (vehicle->peep_tshirt_colours[0] << 19) | (vehicle->peep_tshirt_colours[1] << 24); image_id += seatImageId; image_id += 0xA0000000; @@ -403,7 +403,7 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction sub_98199C((sint8)seatCoords.x, 90, image_id, (sint8)seatCoords.y, seatCoords.z, lengthY, lengthX, 0); } - } + } image_id = RCT2_GLOBAL(0x00F441A0, uint32); if (image_id == 0x20000000) { @@ -420,12 +420,12 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction image_id += 476; sub_98199C( - al, + al, 90, - image_id, - cl, - height, - lengthY, + image_id, + cl, + height, + lengthY, lengthX, 0); @@ -445,10 +445,10 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction sub_98199C( al, 90, - image_id, - cl, - height, - lengthY, + image_id, + cl, + height, + lengthY, lengthX, 0); @@ -466,12 +466,12 @@ void top_spin_paint_tile_1(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA52, uint16) = 0; RCT2_GLOBAL(0x009DEA54, uint16) = 0; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 1, image_id, 0, height, 32, 32, get_current_rotation()); sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); - uint16 entranceLoc = - ((x / 32) + loc_7667AE[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].x) | - (((y / 32) + loc_7667AE[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].y) << 8); + uint16 entranceLoc = + ((x / 32) + loc_7667AE[get_current_rotation()].x) | + (((y / 32) + loc_7667AE[get_current_rotation()].y) << 8); uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; rct_ride* ride = GET_RIDE(rideIndex); @@ -487,8 +487,8 @@ void top_spin_paint_tile_1(uint8 rideIndex, uint8 trackSequence, uint8 direction } entranceLoc = - ((x / 32) + loc_7667AC[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].x) | - (((y / 32) + loc_7667AC[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].y) << 8); + ((x / 32) + loc_7667AC[get_current_rotation()].x) | + (((y / 32) + loc_7667AC[get_current_rotation()].y) << 8); if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { @@ -499,9 +499,9 @@ void top_spin_paint_tile_1(uint8 rideIndex, uint8 trackSequence, uint8 direction sub_98199C(0, 7, image_id, 0, height, 32, 1, 0); } - + top_spin_paint_vehicle(32, 32, rideIndex, direction, height, mapElement); - + RCT2_GLOBAL(0x141E9B4, uint16) = height + 2; RCT2_GLOBAL(0x141E9B6, uint16) = 32; RCT2_GLOBAL(0x141E9B8, uint16) = 0xFFFF; @@ -532,12 +532,12 @@ void top_spin_paint_tile_2(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA52, uint16) = 0; RCT2_GLOBAL(0x009DEA54, uint16) = 0; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 1, image_id, 0, height, 32, 32, get_current_rotation()); sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); uint16 entranceLoc = - ((x / 32) + loc_7667AC[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].x) | - (((y / 32) + loc_7667AC[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].y) << 8); + ((x / 32) + loc_7667AC[get_current_rotation()].x) | + (((y / 32) + loc_7667AC[get_current_rotation()].y) << 8); uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; rct_ride* ride = GET_RIDE(rideIndex); @@ -579,12 +579,12 @@ void top_spin_paint_tile_4(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA52, uint16) = 0; RCT2_GLOBAL(0x009DEA54, uint16) = 0; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 1, image_id, 0, height, 32, 32, get_current_rotation()); sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); uint16 entranceLoc = - ((x / 32) + loc_7667AE[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].x) | - (((y / 32) + loc_7667AE[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].y) << 8); + ((x / 32) + loc_7667AE[get_current_rotation()].x) | + (((y / 32) + loc_7667AE[get_current_rotation()].y) << 8); uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; rct_ride* ride = GET_RIDE(rideIndex); @@ -626,12 +626,12 @@ void top_spin_paint_tile_3(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA52, uint16) = 0; RCT2_GLOBAL(0x009DEA54, uint16) = 0; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 1, image_id, 0, height, 32, 32, get_current_rotation()); sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); uint16 entranceLoc = - ((x / 32) + loc_7667AC[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].x) | - (((y / 32) + loc_7667AC[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].y) << 8); + ((x / 32) + loc_7667AC[get_current_rotation()].x) | + (((y / 32) + loc_7667AC[get_current_rotation()].y) << 8); uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; rct_ride* ride = GET_RIDE(rideIndex); @@ -647,8 +647,8 @@ void top_spin_paint_tile_3(uint8 rideIndex, uint8 trackSequence, uint8 direction } entranceLoc = - ((x / 32) + loc_7667AC[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 3) & 3].x) | - (((y / 32) + loc_7667AC[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 3) & 3].y) << 8); + ((x / 32) + loc_7667AC[(get_current_rotation() + 3) & 3].x) | + (((y / 32) + loc_7667AC[(get_current_rotation() + 3) & 3].y) << 8); if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { @@ -657,7 +657,7 @@ void top_spin_paint_tile_3(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA52, uint16) = 0; RCT2_GLOBAL(0x009DEA54, uint16) = 30; RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; - sub_98197C(0, 7, image_id, 0, height, 1, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 7, image_id, 0, height, 1, 32, get_current_rotation()); } top_spin_paint_vehicle(32, -32, rideIndex, direction, height, mapElement); @@ -692,15 +692,15 @@ void top_spin_paint_tile_5(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA52, uint16) = 0; RCT2_GLOBAL(0x009DEA54, uint16) = 0; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 1, image_id, 0, height, 32, 32, get_current_rotation()); sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; rct_ride* ride = GET_RIDE(rideIndex); uint16 entranceLoc = - ((x / 32) + loc_7667AC[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 3) & 3].x) | - (((y / 32) + loc_7667AC[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 3) & 3].y) << 8); + ((x / 32) + loc_7667AC[(get_current_rotation() + 3) & 3].x) | + (((y / 32) + loc_7667AC[(get_current_rotation() + 3) & 3].y) << 8); if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { image_id = 22139 | RCT2_GLOBAL(0x00F441A0, uint32); @@ -708,7 +708,7 @@ void top_spin_paint_tile_5(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA52, uint16) = 0; RCT2_GLOBAL(0x009DEA54, uint16) = 30; RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; - sub_98197C(0, 7, image_id, 0, height, 1, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 7, image_id, 0, height, 1, 32, get_current_rotation()); } top_spin_paint_vehicle(0, -32, rideIndex, direction, height, mapElement); @@ -740,12 +740,12 @@ void top_spin_paint_tile_6(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA52, uint16) = 0; RCT2_GLOBAL(0x009DEA54, uint16) = 0; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 1, image_id, 0, height, 32, 32, get_current_rotation()); sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); uint16 entranceLoc = - ((x / 32) + loc_7667AE[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].x) | - (((y / 32) + loc_7667AE[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)].y) << 8); + ((x / 32) + loc_7667AE[get_current_rotation()].x) | + (((y / 32) + loc_7667AE[get_current_rotation()].y) << 8); uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; rct_ride* ride = GET_RIDE(rideIndex); @@ -761,8 +761,8 @@ void top_spin_paint_tile_6(uint8 rideIndex, uint8 trackSequence, uint8 direction } entranceLoc = - ((x / 32) + loc_7667AE[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 1) & 3].x) | - (((y / 32) + loc_7667AE[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 1) & 3].y) << 8); + ((x / 32) + loc_7667AE[(get_current_rotation() + 1) & 3].x) | + (((y / 32) + loc_7667AE[(get_current_rotation() + 1) & 3].y) << 8); if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { @@ -771,7 +771,7 @@ void top_spin_paint_tile_6(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; - sub_98197C(0, 7, image_id, 0, height, 32, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 7, image_id, 0, height, 32, 1, get_current_rotation()); } top_spin_paint_vehicle(-32, 32, rideIndex, direction, height, mapElement); @@ -806,15 +806,15 @@ void top_spin_paint_tile_7(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA52, uint16) = 0; RCT2_GLOBAL(0x009DEA54, uint16) = 0; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 1, image_id, 0, height, 32, 32, get_current_rotation()); sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; rct_ride* ride = GET_RIDE(rideIndex); uint16 entranceLoc = - ((x / 32) + loc_7667AE[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 1) & 3].x) | - (((y / 32) + loc_7667AE[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 1) & 3].y) << 8); + ((x / 32) + loc_7667AE[(get_current_rotation() + 1) & 3].x) | + (((y / 32) + loc_7667AE[(get_current_rotation() + 1) & 3].y) << 8); if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { @@ -823,12 +823,12 @@ void top_spin_paint_tile_7(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA52, uint16) = 29; RCT2_GLOBAL(0x009DEA54, uint16) = 0; RCT2_GLOBAL(0x009DEA56, uint16) = height + 3; - sub_98197C(0, 7, image_id, 0, height, 28, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 7, image_id, 0, height, 28, 1, get_current_rotation()); } entranceLoc = - ((x / 32) + loc_7667AC[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 3) & 3].x) | - (((y / 32) + loc_7667AC[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 3) & 3].y) << 8); + ((x / 32) + loc_7667AC[(get_current_rotation() + 3) & 3].x) | + (((y / 32) + loc_7667AC[(get_current_rotation() + 3) & 3].y) << 8); if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { @@ -837,7 +837,7 @@ void top_spin_paint_tile_7(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA52, uint16) = 0; RCT2_GLOBAL(0x009DEA54, uint16) = 29; RCT2_GLOBAL(0x009DEA56, uint16) = height + 3; - sub_98197C(0, 7, image_id, 0, height, 1, 28, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 7, image_id, 0, height, 1, 28, get_current_rotation()); } top_spin_paint_vehicle(-32, -32, rideIndex, direction, height, mapElement); @@ -872,15 +872,15 @@ void top_spin_paint_tile_8(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA52, uint16) = 0; RCT2_GLOBAL(0x009DEA54, uint16) = 0; RCT2_GLOBAL(0x009DEA56, uint16) = height; - sub_98197C(0, 1, image_id, 0, height, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 1, image_id, 0, height, 32, 32, get_current_rotation()); sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16); uint8 entranceId = (mapElement->properties.track.sequence & 0x70) >> 4; rct_ride* ride = GET_RIDE(rideIndex); uint16 entranceLoc = - ((x / 32) + loc_7667AE[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 1) & 3].x) | - (((y / 32) + loc_7667AE[(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 1) & 3].y) << 8); + ((x / 32) + loc_7667AE[(get_current_rotation() + 1) & 3].x) | + (((y / 32) + loc_7667AE[(get_current_rotation() + 1) & 3].y) << 8); if (ride->entrances[entranceId] != entranceLoc && ride->exits[entranceId] != entranceLoc) { @@ -889,7 +889,7 @@ void top_spin_paint_tile_8(uint8 rideIndex, uint8 trackSequence, uint8 direction RCT2_GLOBAL(0x009DEA54, uint16) = 0; RCT2_GLOBAL(0x009DEA56, uint16) = height + 2; - sub_98197C(0, 7, image_id, 0, height, 32, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)); + sub_98197C(0, 7, image_id, 0, height, 32, 1, get_current_rotation()); } top_spin_paint_vehicle(-32, 0, rideIndex, direction, height, mapElement); @@ -910,7 +910,7 @@ void top_spin_paint_tile_8(uint8 rideIndex, uint8 trackSequence, uint8 direction } } -/* rct2: 0x007667BC +/* rct2: 0x007667BC */ void top_spin_paint_setup_rot_0(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { switch (trackSequence) @@ -1052,4 +1052,4 @@ void top_spin_paint_setup_rot_3(uint8 rideIndex, uint8 trackSequence, uint8 dire break; } return; -} \ No newline at end of file +} diff --git a/src/scenario.c b/src/scenario.c index d250db71cd..597c0d452e 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -991,7 +991,7 @@ int scenario_save(SDL_RWops* rw, int flags) viewX = viewport->view_width / 2 + viewport->view_x; viewY = viewport->view_height / 2 + viewport->view_y; viewZoom = viewport->zoom; - viewRotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + viewRotation = get_current_rotation(); } else { viewX = 0; viewY = 0; @@ -1064,7 +1064,7 @@ int scenario_save_network(SDL_RWops* rw) viewX = viewport->view_width / 2 + viewport->view_x; viewY = viewport->view_height / 2 + viewport->view_y; viewZoom = viewport->zoom; - viewRotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + viewRotation = get_current_rotation(); } else { viewX = 0; viewY = 0; diff --git a/src/windows/footpath.c b/src/windows/footpath.c index adcd719edb..51309bc1ac 100644 --- a/src/windows/footpath.c +++ b/src/windows/footpath.c @@ -537,7 +537,7 @@ static void window_footpath_paint(rct_window *w, rct_drawpixelinfo *dpi) if (!(w->disabled_widgets & (1 << WIDX_CONSTRUCT))) { // Get construction image - image = (RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_DIRECTION, uint8) + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) % 4; + image = (RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_DIRECTION, uint8) + get_current_rotation()) % 4; if (RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_SLOPE, uint8) == 2) image += 4; else if (RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_SLOPE, uint8) == 6) @@ -618,7 +618,7 @@ static void window_footpath_show_footpath_types_dialog(rct_window *w, rct_widget static void window_footpath_mousedown_direction(int direction) { footpath_provisional_update(); - RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_DIRECTION, uint8) = (direction - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) & 3; + RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_DIRECTION, uint8) = (direction - get_current_rotation()) & 3; _window_footpath_cost = MONEY32_UNDEFINED; window_footpath_set_enabled_and_pressed_widgets(); } @@ -1012,7 +1012,7 @@ static void window_footpath_set_enabled_and_pressed_widgets() pressedWidgets = w->pressed_widgets & 0xFFFF887F; disabledWidgets = 0; - currentRotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + currentRotation = get_current_rotation(); if (RCT2_GLOBAL(RCT2_ADDRESS_PATH_CONSTRUCTION_MODE, uint8) >= PATH_CONSTRUCTION_MODE_BRIDGE_OR_TUNNEL) { // Set pressed directional widget direction = (RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_DIRECTION, uint8) + currentRotation) & 3; diff --git a/src/windows/guest.c b/src/windows/guest.c index f460e0329d..f0e18f6739 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -732,7 +732,7 @@ void window_guest_viewport_init(rct_window* w){ focus.sprite.type |= VIEWPORT_FOCUS_TYPE_SPRITE | VIEWPORT_FOCUS_TYPE_COORDINATE; focus.sprite.pad_486 &= 0xFFFF; } - focus.coordinate.rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + focus.coordinate.rotation = get_current_rotation(); } uint16 viewport_flags; diff --git a/src/windows/map.c b/src/windows/map.c index 13b7f1bf63..22179e1b98 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -224,7 +224,7 @@ void window_map_open() window_init_scroll_widgets(w); - w->map.rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint16); + w->map.rotation = get_current_rotation(); window_map_init_map(); RCT2_GLOBAL(0x00F64F05, uint8) = 0; @@ -394,8 +394,8 @@ static void window_map_mousedown(int widgetIndex, rct_window *w, rct_widget *wid */ static void window_map_update(rct_window *w) { - if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8) != w->map.rotation) { - w->map.rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + if (get_current_rotation() != w->map.rotation) { + w->map.rotation = get_current_rotation(); window_map_init_map(); window_map_center_on_view_point(); } @@ -885,7 +885,7 @@ static void window_map_center_on_view_point() if (w_map == NULL) return; - rct_xy16 offset = MiniMapOffsets[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8) & 3]; + rct_xy16 offset = MiniMapOffsets[get_current_rotation()]; // calculate center view point of viewport and transform it to minimap coordinates @@ -975,7 +975,7 @@ static void window_map_transform_to_map_coords(sint16 *left, sint16 *top) sint16 x = *left, y = *top; sint16 temp; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) { + switch (get_current_rotation()) { case 3: temp = x; x = y; @@ -1097,7 +1097,7 @@ static void window_map_paint_hud_rectangle(rct_drawpixelinfo *dpi) if (viewport == NULL) return; - rct_xy16 offset = MiniMapOffsets[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) & 3]; + rct_xy16 offset = MiniMapOffsets[get_current_rotation()]; sint16 left = (viewport->view_x >> 5) + offset.x; sint16 right = ((viewport->view_x + viewport->view_width) >> 5) + offset.x; sint16 top = (viewport->view_y >> 4) + offset.y; @@ -1176,7 +1176,7 @@ void sub_666EEF(int x, int y, sint16 *mapX, sint16 *mapY, sint16 *mapZ, int *dir } } } - *direction = (window_scenery_rotation - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) & 3; + *direction = (window_scenery_rotation - get_current_rotation()) & 3; } /** @@ -1604,7 +1604,7 @@ static void map_window_set_pixels(rct_window *w) int x, y, dx, dy; destination = (uint16*)((RCT2_GLOBAL(0x00F1AD6C, uint32) * 511) + RCT2_GLOBAL(RCT2_ADDRESS_MAP_IMAGE_DATA, uint32) + 255); - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) { + switch (get_current_rotation()) { case 0: x = RCT2_GLOBAL(0x00F1AD6C, uint32) * 32; y = 0; @@ -1665,7 +1665,7 @@ static void map_window_screen_to_map(int screenX, int screenY, int *mapX, int *m screenY = ((screenY + 8) ) / 2; x = (screenY - screenX) * 32; y = (screenX + screenY) * 32; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8) & 3) { + switch (get_current_rotation()) { case 0: *mapX = x; *mapY = y; diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index 5dc90c56f6..f815181b43 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -225,7 +225,7 @@ static void window_maze_construction_mouseup(rct_window *w, int widgetIndex) case WIDX_MAZE_DIRECTION_SE: case WIDX_MAZE_DIRECTION_SW: window_maze_construction_construct( - ((widgetIndex - WIDX_MAZE_DIRECTION_NW) - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) & 3 + ((widgetIndex - WIDX_MAZE_DIRECTION_NW) - get_current_rotation()) & 3 ); break; } diff --git a/src/windows/park.c b/src/windows/park.c index 8f761e9f31..6b32b71bed 100644 --- a/src/windows/park.c +++ b/src/windows/park.c @@ -1064,7 +1064,7 @@ static void window_park_init_viewport(rct_window *w) x = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_X, sint16)[i] + 16; y = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Y, sint16)[i] + 16; z = RCT2_ADDRESS(RCT2_ADDRESS_PARK_ENTRANCE_Z, sint16)[i] + 32; - r = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + r = get_current_rotation(); xy = 0x40000000 | (y << 16) | x; zr = (z << 16) | (r << 8); diff --git a/src/windows/ride.c b/src/windows/ride.c index e3dadfd032..4032b18685 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -1488,7 +1488,7 @@ static void window_ride_init_viewport(rct_window *w) focus.sprite.sprite_id = -1; focus.coordinate.zoom = 0; - focus.coordinate.rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + focus.coordinate.rotation = get_current_rotation(); if (eax >= 0 && eax < ride->num_vehicles && ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK){ diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 7ebe6f8527..d81b6e7c0f 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -2152,7 +2152,7 @@ static void window_ride_construction_draw_track_piece( z -= bx; int start_x = x; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) { + switch (get_current_rotation()) { case 0: x = y - x; y = (y + start_x) / 2 - z; diff --git a/src/windows/staff.c b/src/windows/staff.c index d47741ee1c..9d4f41b29a 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -1188,7 +1188,7 @@ void window_staff_viewport_init(rct_window* w){ } else{ focus.type |= VIEWPORT_FOCUS_TYPE_SPRITE | VIEWPORT_FOCUS_TYPE_COORDINATE; - focus.rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + focus.rotation = get_current_rotation(); } uint16 viewport_flags; diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 3eb2511f76..154019aabe 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -1117,7 +1117,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin rotation = scenario_rand() & 0xFF; } - rotation -= RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + rotation -= get_current_rotation(); rotation &= 0x3; // Also places it in lower but think thats for clobering @@ -1195,7 +1195,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin rotation = scenario_rand() & 0xFF; } - rotation -= RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + rotation -= get_current_rotation(); rotation &= 0x3; // Also places it in lower but think thats for clobering @@ -1344,7 +1344,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin *grid_y &= 0xFFE0; uint8 rotation = window_scenery_rotation; - rotation -= RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + rotation -= get_current_rotation(); rotation &= 0x3; *parameter_1 = (rotation << 8); @@ -1371,7 +1371,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin } uint8 rotation = window_scenery_rotation; - rotation -= RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + rotation -= get_current_rotation(); rotation &= 0x3; sint16 z = map_element->base_height; diff --git a/src/windows/track_place.c b/src/windows/track_place.c index 9d73faee30..12eddb7ee8 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -150,7 +150,7 @@ static void window_track_place_draw_mini_preview() if (track->type != RIDE_TYPE_MAZE) { #pragma region Track - rotation = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); + rotation = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) + get_current_rotation(); trackElement = RCT2_ADDRESS(0x009D821B, rct_track_element); while (trackElement->type != 255) { @@ -249,7 +249,7 @@ static void window_track_place_draw_mini_preview() } else { #pragma region Maze - rotation = (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) & 3; + rotation = (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) + get_current_rotation()) & 3; mazeElement = RCT2_ADDRESS(0x009D821B, rct_maze_element); while (mazeElement->all != 0) { x = mazeElement->x * 32; @@ -393,7 +393,7 @@ void window_track_place_open() show_gridlines(); _window_track_place_last_cost = MONEY32_UNDEFINED; _window_track_place_last_x = 0xFFFF; - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = (-RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8) + 2) & 3; + RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = (-get_current_rotation() + 2) & 3; window_track_place_draw_mini_preview(); } diff --git a/src/windows/viewport.c b/src/windows/viewport.c index 166759a19a..9a09015bb0 100644 --- a/src/windows/viewport.c +++ b/src/windows/viewport.c @@ -119,7 +119,7 @@ void window_viewport_open() (1 << WIDX_LOCATE); w->number = _viewportNumber++; - rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, sint32); + rotation = get_current_rotation(); // Create viewport viewport_create(w, w->x, w->y, w->width, w->height, 0, 128 * 32, 128 * 32, 0, 1, -1); @@ -245,4 +245,4 @@ static void window_viewport_paint(rct_window *w, rct_drawpixelinfo *dpi) // Draw viewport if (w->viewport != NULL) window_draw_viewport(dpi, w); -} \ No newline at end of file +} diff --git a/src/world/map.c b/src/world/map.c index fbc12b811a..81919c5ff4 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3539,28 +3539,28 @@ void map_get_bounding_box(int ax, int ay, int bx, int by, int *left, int *top, i int x, y; x = ax; y = ay; - translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y); + translate_3d_to_2d(get_current_rotation(), &x, &y); *left = x; *right = x; *top = y; *bottom = y; x = bx; y = ay; - translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y); + translate_3d_to_2d(get_current_rotation(), &x, &y); if (x < *left) *left = x; if (x > *right) *right = x; if (y > *bottom) *bottom = y; if (y < *top) *top = y; x = bx; y = by; - translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y); + translate_3d_to_2d(get_current_rotation(), &x, &y); if (x < *left) *left = x; if (x > *right) *right = x; if (y > *bottom) *bottom = y; if (y < *top) *top = y; x = ax; y = by; - translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y); + translate_3d_to_2d(get_current_rotation(), &x, &y); if (x < *left) *left = x; if (x > *right) *right = x; if (y > *bottom) *bottom = y; @@ -4431,7 +4431,7 @@ void map_invalidate_tile_under_zoom(int x, int y, int z0, int z1, int maxZoom) x += 16; y += 16; - translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y); + translate_3d_to_2d(get_current_rotation(), &x, &y); x1 = x - 32; y1 = y - 32 - z1; diff --git a/src/world/map_animation.c b/src/world/map_animation.c index b68a6a9e52..0ce1832451 100644 --- a/src/world/map_animation.c +++ b/src/world/map_animation.c @@ -22,6 +22,7 @@ #include "../ride/ride.h" #include "../ride/ride_data.h" #include "../ride/track.h" +#include "../interface/viewport.h" #include "map_animation.h" #include "map.h" #include "scenery.h" @@ -150,7 +151,7 @@ static bool map_animation_invalidate_queue_banner(int x, int y, int baseZ) if (!(mapElement->properties.path.type & PATH_FLAG_QUEUE_BANNER)) continue; - int direction = ((mapElement->type >> 6) + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) & 3; + int direction = ((mapElement->type >> 6) + get_current_rotation()) & 3; if (direction == MAP_ELEMENT_DIRECTION_NORTH || direction == MAP_ELEMENT_DIRECTION_EAST) { baseZ = mapElement->base_height * 8; map_invalidate_tile_zoom1(x, y, baseZ + 16, baseZ + 30); @@ -542,4 +543,4 @@ static const map_animation_invalidate_event_handler _animatedObjectEventHandlers map_animation_invalidate_large_scenery, map_animation_invalidate_wall_unknown, map_animation_invalidate_wall -}; \ No newline at end of file +}; diff --git a/src/world/money_effect.c b/src/world/money_effect.c index 132d6293a3..b33565531f 100644 --- a/src/world/money_effect.c +++ b/src/world/money_effect.c @@ -96,8 +96,8 @@ void money_effect_update(rct_money_effect *moneyEffect) return; moneyEffect->move_delay = 0; - int x = moneyEffect->x + _moneyEffectMoveOffset[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)].x; - int y = moneyEffect->y + _moneyEffectMoveOffset[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)].y; + int x = moneyEffect->x + _moneyEffectMoveOffset[get_current_rotation()].x; + int y = moneyEffect->y + _moneyEffectMoveOffset[get_current_rotation()].y; int z = moneyEffect->z; sprite_move(x, y, z, (rct_sprite*)moneyEffect); diff --git a/src/world/sprite.c b/src/world/sprite.c index 51098ca2b4..3be296848e 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -451,7 +451,7 @@ void sprite_move(sint16 x, sint16 y, sint16 z, rct_sprite* sprite){ return; } sint16 new_x = x, new_y = y, start_x = x; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)){ + switch (get_current_rotation()){ case 0: new_x = new_y - new_x; new_y = (new_y + start_x) / 2 - z; From a911ff09d05d7164bdfb5c14fba70ad96d44fe65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 30 Oct 2015 12:32:47 +0100 Subject: [PATCH 0948/1173] Some more checks, make sure gVehicleHierarchies are counted properly --- src/drawing/sprite.c | 2 + src/input.c | 1 + src/management/research.c | 2 + src/rct1.c | 305 +++++++++++++++++++------------------- src/rct1.h | 1 - 5 files changed, 160 insertions(+), 151 deletions(-) diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index 9f47d9b533..aaa09f1cd2 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -136,6 +136,7 @@ void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, ui uint32 source_line_width = source_image->width * zoom_amount; //Requires use of palette? if (image_type & IMAGE_TYPE_USE_PALETTE){ + assert(palette_pointer != NULL); //Mix with another image?? and colour adjusted if (unknown_pointer!= NULL){ //Not tested. I can't actually work out when this code runs. @@ -182,6 +183,7 @@ void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, ui //Mix with background. It only uses source pointer for //telling if it needs to be drawn not for colour. if (image_type & IMAGE_TYPE_MIX_BACKGROUND){//Not tested + assert(palette_pointer != NULL); for (; height > 0; height -= zoom_amount){ uint8* next_source_pointer = source_pointer + source_line_width; uint8* next_dest_pointer = dest_pointer + dest_line_width; diff --git a/src/input.c b/src/input.c index 947138e16b..cee459a73f 100644 --- a/src/input.c +++ b/src/input.c @@ -428,6 +428,7 @@ static void input_viewport_drag_continue() dx = newDragX - _dragX; dy = newDragY - _dragY; w = window_find_by_number(_dragWindowClass, _dragWindowNumber); + assert(w != NULL); viewport = w->viewport; RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_DRAG_START, sint16) += RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_LAST_UPDATE, sint16); diff --git a/src/management/research.c b/src/management/research.c index d8e3f0d116..5873493565 100644 --- a/src/management/research.c +++ b/src/management/research.c @@ -295,7 +295,9 @@ void sub_684AC3(){ ebp = inner_research; } } while ((inner_research++)->entryIndex != RESEARCHED_ITEMS_END); + assert(edx != NULL); edx->entryIndex = research->entryIndex; + assert(ebp != NULL); ebp->entryIndex = (research + 1)->entryIndex; uint8 cat = edx->category; diff --git a/src/rct1.c b/src/rct1.c index b151ee507a..90fe58171d 100644 --- a/src/rct1.c +++ b/src/rct1.c @@ -1528,152 +1528,157 @@ static const RCT1DefaultObjectsGroup RCT1DefaultObjects[10] = { }; // Keep these in the same order as gVehicleHierarchies -char *SpiralRCObjectOrder[] = { "SPDRCR "}; -char *StandupRCObjectOrder[] = { "TOGST "}; -char *SuspendedSWRCObjectOrder[] = { "ARRSW1 ", "VEKVAMP ", "ARRSW2 "}; -char *InvertedRCObjectOrder[] = { "NEMT "}; -char *JuniorCoasterObjectOrder[] = { "ZLDB ", "ZLOG "}; -char *MiniatureRailwayObjectOrder[] = { "NRL ", "NRL2 ", "AML1 ", "TRAM1 "}; -char *MonorailObjectOrder[] = { "MONO1 ", "MONO2 ", "MONO3 "}; -char *MiniSuspendedRCObjectOrder[] = { "BATFL ", "SKYTR "}; -char *BoatRideObjectOrder[] = { "RBOAT ", "BBOAT ", "CBOAT ", "SWANS ", "TRIKE ","JSKI "}; -char *WoodenWMObjectOrder[] = { "WMOUSE ", "WMMINE "}; -char *SteeplechaseObjectOrder[] = { "STEEP1 ", "STEEP2 ", "SBOX "}; -char *CarRideObjectOrder[] = { "SPCAR ", "RCR ", "TRUCK1 ", "VCR ", "CTCAR "}; -char *LaunchedFFObjectOrder[] = { "SSC1 "}; -char *BobsleighRCObjectOrder[] = { "BOB1 ", "INTBOB "}; -char *ObservationTowerObjectOrder[] = { "OBS1 ", "OBS2 "}; -char *LoopingRCObjectOrder[] = { "SCHT1 "}; -char *DinghySlideObjectOrder[] = { "DING1 "}; -char *MineTrainRCObjectOrder[] = { "AMT1 "}; -char *ChairliftObjectOrder[] = { "CLIFT1 ", "CLIFT2 "}; -char *CorkscrewRCObjectOrder[] = { "ARRT1 ", "ARRT2 "}; -char *GoKartsObjectOrder[] = { "KART1 "}; -char *LogFlumeObjectOrder[] = { "LFB1 "}; -char *RiverRapidsObjectOrder[] = { "RAPBOAT "}; -char *ReverseFreefallRCObjectOrder[]= { "REVF1 "}; -char *LiftObjectOrder[] = { "LIFT1 "}; -char *VerticalDropRCObjectOrder[] = { "BMVD "}; -char *GhostTrainObjectOrder[] = { "GTC ", "HMCAR "}; -char *TwisterRCObjectOrder[] = { "BMSD ", "BMSU ", "BMFL ", "BMRB ", "GOLTR "}; -char *WoodenRCObjectOrder[] = { "PTCT1 ", "MFT ", "PTCT2 "}; -char *SideFrictionRCObjectOrder[] = { "SFRIC1 "}; -char *SteelWildMouseObjectOrder[] = { "SMC1 ", "SMC2 ", "WMSPIN "}; -char *MultiDimensionRCObjectOrder[] = { "ARRX "}; -char *FlyingRCObjectOrder[] = { "BMAIR "}; -char *VirginiaReelRCObjectOrder[] = { "VREEL "}; -char *SplashBoatsObjectOrder[] = { "SPBOAT "}; -char *MiniHelicoptersObjectOrder[] = { "HELICAR "}; -char *LayDownRCObjectOrder[] = { "VEKST "}; -char *SuspendedMonorailObjectOrder[]= { "SMONO "}; -char *ReverserRCObjectOrder[] = { "REVCAR "}; -char *HeartlineTwisterObjectOrder[] = { "UTCAR ", "UTCARR "}; -char *GigaRCObjectOrder[] = { "INTST "}; -char *RotoDropObjectOrder[] = { "GDROP1 "}; -char *MonorailCyclesObjectOrder[] = { "MONBK "}; -char *CompactInvertedRCObjectOrder[]= { "SLCT ", "SLCFO ", "VEKDV "}; -char *WaterRCObjectOrder[] = { "CSTBOAT "}; -char *AirPoweredRCObjectOrder[] = { "THCAR "}; -char *InvertedHairpinRCObjectOrder[]= { "IVMC1 "}; -char *SubmarineRideObjectOrder[] = { "SUBMAR "}; -char *RiverRaftsObjectOrder[] = { "RFTBOAT "}; -char *InvertedImpulseRCObjectOrder[]= { "INTINV "}; -char *MiniRCObjectOrder[] = { "WCATC ", "RCKC ", "JSTAR1 "}; -char *MineRideRCObjectOrder[] = { "PMT1 "}; -char *LIMLaunchedRCObjectOrder[] = { "PREMT1 "}; +const char *SpiralRCObjectOrder[] = { "SPDRCR "}; +const char *StandupRCObjectOrder[] = { "TOGST "}; +const char *SuspendedSWRCObjectOrder[] = { "ARRSW1 ", "VEKVAMP ", "ARRSW2 "}; +const char *InvertedRCObjectOrder[] = { "NEMT "}; +const char *JuniorCoasterObjectOrder[] = { "ZLDB ", "ZLOG "}; +const char *MiniatureRailwayObjectOrder[] = { "NRL ", "NRL2 ", "AML1 ", "TRAM1 "}; +const char *MonorailObjectOrder[] = { "MONO1 ", "MONO2 ", "MONO3 "}; +const char *MiniSuspendedRCObjectOrder[] = { "BATFL ", "SKYTR "}; +const char *BoatRideObjectOrder[] = { "RBOAT ", "BBOAT ", "CBOAT ", "SWANS ", "TRIKE ","JSKI "}; +const char *WoodenWMObjectOrder[] = { "WMOUSE ", "WMMINE "}; +const char *SteeplechaseObjectOrder[] = { "STEEP1 ", "STEEP2 ", "SBOX "}; +const char *CarRideObjectOrder[] = { "SPCAR ", "RCR ", "TRUCK1 ", "VCR ", "CTCAR "}; +const char *LaunchedFFObjectOrder[] = { "SSC1 "}; +const char *BobsleighRCObjectOrder[] = { "BOB1 ", "INTBOB "}; +const char *ObservationTowerObjectOrder[] = { "OBS1 ", "OBS2 "}; +const char *LoopingRCObjectOrder[] = { "SCHT1 "}; +const char *DinghySlideObjectOrder[] = { "DING1 "}; +const char *MineTrainRCObjectOrder[] = { "AMT1 "}; +const char *ChairliftObjectOrder[] = { "CLIFT1 ", "CLIFT2 "}; +const char *CorkscrewRCObjectOrder[] = { "ARRT1 ", "ARRT2 "}; +const char *GoKartsObjectOrder[] = { "KART1 "}; +const char *LogFlumeObjectOrder[] = { "LFB1 "}; +const char *RiverRapidsObjectOrder[] = { "RAPBOAT "}; +const char *ReverseFreefallRCObjectOrder[] = { "REVF1 "}; +const char *LiftObjectOrder[] = { "LIFT1 "}; +const char *VerticalDropRCObjectOrder[] = { "BMVD "}; +const char *GhostTrainObjectOrder[] = { "GTC ", "HMCAR "}; +const char *TwisterRCObjectOrder[] = { "BMSD ", "BMSU ", "BMFL ", "BMRB ", "GOLTR "}; +const char *WoodenRCObjectOrder[] = { "PTCT1 ", "MFT ", "PTCT2 "}; +const char *SideFrictionRCObjectOrder[] = { "SFRIC1 "}; +const char *SteelWildMouseObjectOrder[] = { "SMC1 ", "SMC2 ", "WMSPIN "}; +const char *MultiDimensionRCObjectOrder[] = { "ARRX "}; +const char *FlyingRCObjectOrder[] = { "BMAIR "}; +const char *VirginiaReelRCObjectOrder[] = { "VREEL "}; +const char *SplashBoatsObjectOrder[] = { "SPBOAT "}; +const char *MiniHelicoptersObjectOrder[] = { "HELICAR "}; +const char *LayDownRCObjectOrder[] = { "VEKST "}; +const char *SuspendedMonorailObjectOrder[] = { "SMONO "}; +const char *ReverserRCObjectOrder[] = { "REVCAR "}; +const char *HeartlineTwisterObjectOrder[] = { "UTCAR ", "UTCARR "}; +const char *GigaRCObjectOrder[] = { "INTST "}; +const char *RotoDropObjectOrder[] = { "GDROP1 "}; +const char *MonorailCyclesObjectOrder[] = { "MONBK "}; +const char *CompactInvertedRCObjectOrder[] = { "SLCT ", "SLCFO ", "VEKDV "}; +const char *WaterRCObjectOrder[] = { "CSTBOAT "}; +const char *AirPoweredRCObjectOrder[] = { "THCAR "}; +const char *InvertedHairpinRCObjectOrder[] = { "IVMC1 "}; +const char *SubmarineRideObjectOrder[] = { "SUBMAR "}; +const char *RiverRaftsObjectOrder[] = { "RFTBOAT "}; +const char *InvertedImpulseRCObjectOrder[] = { "INTINV "}; +const char *MiniRCObjectOrder[] = { "WCATC ", "RCKC ", "JSTAR1 "}; +const char *MineRideRCObjectOrder[] = { "PMT1 "}; +const char *LIMLaunchedRCObjectOrder[] = { "PREMT1 "}; -char **gVehicleHierarchies[0x60] = { - SpiralRCObjectOrder, // 0 Spiral Roller coaster - StandupRCObjectOrder, // 1 Stand Up Coaster - SuspendedSWRCObjectOrder, // 2 Suspended Swinging - InvertedRCObjectOrder, // 3 Inverted - JuniorCoasterObjectOrder, // 4 Junior RC / Steel Mini Coaster - MiniatureRailwayObjectOrder, // 5 Mini Railroad - MonorailObjectOrder, // 6 Monorail - MiniSuspendedRCObjectOrder, // 7 Mini Suspended Coaster - BoatRideObjectOrder, // 8 Boat ride - WoodenWMObjectOrder, // 9 Wooden Wild Mine/Mouse - SteeplechaseObjectOrder, // a Steeplechase/Motorbike/Soap Box Derby - CarRideObjectOrder, // b Car Ride - LaunchedFFObjectOrder, // c Launched Freefall - BobsleighRCObjectOrder, // d Bobsleigh Coaster - ObservationTowerObjectOrder, // e Observation Tower - LoopingRCObjectOrder, // f Looping Roller Coaster - DinghySlideObjectOrder, // 10 Dinghy Slide - MineTrainRCObjectOrder, // 11 Mine Train Coaster - ChairliftObjectOrder, // 12 Chairlift - CorkscrewRCObjectOrder, // 13 Corkscrew Roller Coaster - NULL, // 14 Maze, N/A - NULL, // 15 Spiral Slide, N/A - GoKartsObjectOrder, // 16 Go Karts - LogFlumeObjectOrder, // 17 Log Flume - RiverRapidsObjectOrder, // 18 River Rapids - NULL, // 19 Dodgems, N/A - NULL, // 1a Pirate Ship, N/A - NULL, // 1b Swinging Inverter Ship, N/A - NULL, // 1c Food Stall, N/A - NULL, // 1d (none), N/A - NULL, // 1e Drink Stall, N/A - NULL, // 1f (none), N/A - NULL, // 20 Shop (all types), N/A - NULL, // 21 Merry Go Round, N/A - NULL, // 22 Balloon Stall (maybe), N/A - NULL, // 23 Information Kiosk, N/A - NULL, // 24 Bathroom, N/A - NULL, // 25 Ferris Wheel, N/A - NULL, // 26 Motion Simulator, N/A - NULL, // 27 3D Cinema, N/A - NULL, // 28 Top Spin, N/A - NULL, // 29 Space Rings, N/A - ReverseFreefallRCObjectOrder, // 2a Reverse Freefall Coaster - LiftObjectOrder, // 2b Lift - VerticalDropRCObjectOrder, // 2c Vertical Drop Roller Coaster - NULL, // 2d ATM, N/A - NULL, // 2e Twist, N/A - NULL, // 2f Haunted House, N/A - NULL, // 30 First Aid, N/A - NULL, // 31 Circus Show, N/A - GhostTrainObjectOrder, // 32 Ghost Train - TwisterRCObjectOrder, // 33 Twister Roller Coaster - WoodenRCObjectOrder, // 34 Wooden Roller Coaster - SideFrictionRCObjectOrder, // 35 Side-Friction Roller Coaster - SteelWildMouseObjectOrder, // 36 Steel Wild Mouse - MultiDimensionRCObjectOrder, // 37 Multi Dimension Coaster - NULL, // 38 (none), N/A - FlyingRCObjectOrder, // 39 Flying Roller Coaster - NULL, // 3a (none), N/A - VirginiaReelRCObjectOrder, // 3b Virginia Reel - SplashBoatsObjectOrder, // 3c Splash Boats - MiniHelicoptersObjectOrder, // 3d Mini Helicopters - LayDownRCObjectOrder, // 3e Lay-down Roller Coaster - SuspendedMonorailObjectOrder, // 3f Suspended Monorail - NULL, // 40 (none), N/A - ReverserRCObjectOrder, // 41 Reverser Roller Coaster - HeartlineTwisterObjectOrder, // 42 Heartline Twister Roller Coaster - NULL, // 43 Mini Golf, N/A - GigaRCObjectOrder, // 44 Giga Coaster - RotoDropObjectOrder, // 45 Roto-Drop - NULL, // 46 Flying Saucers, N/A - NULL, // 47 Crooked House, N/A - MonorailCyclesObjectOrder, // 48 Monorail Cycles - CompactInvertedRCObjectOrder, // 49 Compact Inverted Coaster - WaterRCObjectOrder, // 4a Water Coaster - AirPoweredRCObjectOrder, // 4b Air Powered Vertical Coaster - InvertedHairpinRCObjectOrder, // 4c Inverted Hairpin Coaster - NULL, // 4d Magic Carpet, N/A - SubmarineRideObjectOrder, // 4e Submarine Ride - RiverRaftsObjectOrder, // 4f River Rafts - NULL, // 50 (none), N/A - NULL, // 51 Enterprise, N/A - NULL, // 52 (none), N/A - NULL, // 53 (none), N/A - NULL, // 54 (none), N/A - NULL, // 55 (none), N/A - InvertedImpulseRCObjectOrder, // 56 Inverted Impulse Coaster - MiniRCObjectOrder, // 57 Mini Roller Coaster - MineRideRCObjectOrder, // 58 Mine Ride - NULL, // 59 Unknown Ride - LIMLaunchedRCObjectOrder, // 60 LIM Launched Roller Coaster +typedef struct { + const char **entries; + int count; +} RCT1VehicleHierarchiesGroup; + +RCT1VehicleHierarchiesGroup gVehicleHierarchies[0x60] = { + { SpiralRCObjectOrder, countof(SpiralRCObjectOrder) }, // 0 Spiral Roller coaster + { StandupRCObjectOrder, countof(StandupRCObjectOrder) }, // 1 Stand Up Coaster + { SuspendedSWRCObjectOrder, countof(SuspendedSWRCObjectOrder) }, // 2 Suspended Swinging + { InvertedRCObjectOrder, countof(InvertedRCObjectOrder) }, // 3 Inverted + { JuniorCoasterObjectOrder, countof(JuniorCoasterObjectOrder) }, // 4 Junior RC / Steel Mini Coaster + { MiniatureRailwayObjectOrder, countof(MiniatureRailwayObjectOrder) }, // 5 Mini Railroad + { MonorailObjectOrder, countof(MonorailObjectOrder) }, // 6 Monorail + { MiniSuspendedRCObjectOrder, countof(MiniSuspendedRCObjectOrder) }, // 7 Mini Suspended Coaster + { BoatRideObjectOrder, countof(BoatRideObjectOrder) }, // 8 Boat ride + { WoodenWMObjectOrder, countof(WoodenWMObjectOrder) }, // 9 Wooden Wild Mine/Mouse + { SteeplechaseObjectOrder, countof(SteeplechaseObjectOrder) }, // a Steeplechase/Motorbike/Soap Box Derby + { CarRideObjectOrder, countof(CarRideObjectOrder) }, // b Car Ride + { LaunchedFFObjectOrder, countof(LaunchedFFObjectOrder) }, // c Launched Freefall + { BobsleighRCObjectOrder, countof(BobsleighRCObjectOrder) }, // d Bobsleigh Coaster + { ObservationTowerObjectOrder, countof(ObservationTowerObjectOrder) }, // e Observation Tower + { LoopingRCObjectOrder, countof(LoopingRCObjectOrder) }, // f Looping Roller Coaster + { DinghySlideObjectOrder, countof(DinghySlideObjectOrder) }, // 10 Dinghy Slide + { MineTrainRCObjectOrder, countof(MineTrainRCObjectOrder) }, // 11 Mine Train Coaster + { ChairliftObjectOrder, countof(ChairliftObjectOrder) }, // 12 Chairlift + { CorkscrewRCObjectOrder, countof(CorkscrewRCObjectOrder) }, // 13 Corkscrew Roller Coaster + { NULL, 0 }, // 14 Maze, N/A + { NULL, 0 }, // 15 Spiral Slide, N/A + { GoKartsObjectOrder, countof(GoKartsObjectOrder) }, // 16 Go Karts + { LogFlumeObjectOrder, countof(LogFlumeObjectOrder) }, // 17 Log Flume + { RiverRapidsObjectOrder, countof(RiverRapidsObjectOrder) }, // 18 River Rapids + { NULL, 0 }, // 19 Dodgems, N/A + { NULL, 0 }, // 1a Pirate Ship, N/A + { NULL, 0 }, // 1b Swinging Inverter Ship, N/A + { NULL, 0 }, // 1c Food Stall, N/A + { NULL, 0 }, // 1d (none), N/A + { NULL, 0 }, // 1e Drink Stall, N/A + { NULL, 0 }, // 1f (none), N/A + { NULL, 0 }, // 20 Shop (all types), N/A + { NULL, 0 }, // 21 Merry Go Round, N/A + { NULL, 0 }, // 22 Balloon Stall (maybe), N/A + { NULL, 0 }, // 23 Information Kiosk, N/A + { NULL, 0 }, // 24 Bathroom, N/A + { NULL, 0 }, // 25 Ferris Wheel, N/A + { NULL, 0 }, // 26 Motion Simulator, N/A + { NULL, 0 }, // 27 3D Cinema, N/A + { NULL, 0 }, // 28 Top Spin, N/A + { NULL, 0 }, // 29 Space Rings, N/A + { ReverseFreefallRCObjectOrder, countof(ReverseFreefallRCObjectOrder) }, // 2a Reverse Freefall Coaster + { LiftObjectOrder, countof(LiftObjectOrder) }, // 2b Lift + { VerticalDropRCObjectOrder, countof(VerticalDropRCObjectOrder) }, // 2c Vertical Drop Roller Coaster + { NULL, 0 }, // 2d ATM, N/A + { NULL, 0 }, // 2e Twist, N/A + { NULL, 0 }, // 2f Haunted House, N/A + { NULL, 0 }, // 30 First Aid, N/A + { NULL, 0 }, // 31 Circus Show, N/A + { GhostTrainObjectOrder, countof(GhostTrainObjectOrder) }, // 32 Ghost Train + { TwisterRCObjectOrder, countof(TwisterRCObjectOrder) }, // 33 Twister Roller Coaster + { WoodenRCObjectOrder, countof(WoodenRCObjectOrder) }, // 34 Wooden Roller Coaster + { SideFrictionRCObjectOrder, countof(SideFrictionRCObjectOrder) }, // 35 Side-Friction Roller Coaster + { SteelWildMouseObjectOrder, countof(SteelWildMouseObjectOrder) }, // 36 Steel Wild Mouse + { MultiDimensionRCObjectOrder, countof(MultiDimensionRCObjectOrder) }, // 37 Multi Dimension Coaster + { NULL, 0 }, // 38 (none), N/A + { FlyingRCObjectOrder, countof(FlyingRCObjectOrder) }, // 39 Flying Roller Coaster + { NULL, 0 }, // 3a (none), N/A + { VirginiaReelRCObjectOrder, countof(VirginiaReelRCObjectOrder) }, // 3b Virginia Reel + { SplashBoatsObjectOrder, countof(SplashBoatsObjectOrder) }, // 3c Splash Boats + { MiniHelicoptersObjectOrder, countof(MiniHelicoptersObjectOrder) }, // 3d Mini Helicopters + { LayDownRCObjectOrder, countof(LayDownRCObjectOrder) }, // 3e Lay-down Roller Coaster + { SuspendedMonorailObjectOrder, countof(SuspendedMonorailObjectOrder) }, // 3f Suspended Monorail + { NULL, 0 }, // 40 (none), N/A + { ReverserRCObjectOrder, countof(ReverserRCObjectOrder) }, // 41 Reverser Roller Coaster + { HeartlineTwisterObjectOrder, countof(HeartlineTwisterObjectOrder) }, // 42 Heartline Twister Roller Coaster + { NULL, 0 }, // 43 Mini Golf, N/A + { GigaRCObjectOrder, countof(GigaRCObjectOrder) }, // 44 Giga Coaster + { RotoDropObjectOrder, countof(RotoDropObjectOrder) }, // 45 Roto-Drop + { NULL, 0 }, // 46 Flying Saucers, N/A + { NULL, 0 }, // 47 Crooked House, N/A + { MonorailCyclesObjectOrder, countof(MonorailCyclesObjectOrder) }, // 48 Monorail Cycles + { CompactInvertedRCObjectOrder, countof(CompactInvertedRCObjectOrder) }, // 49 Compact Inverted Coaster + { WaterRCObjectOrder, countof(WaterRCObjectOrder) }, // 4a Water Coaster + { AirPoweredRCObjectOrder, countof(AirPoweredRCObjectOrder) }, // 4b Air Powered Vertical Coaster + { InvertedHairpinRCObjectOrder, countof(InvertedHairpinRCObjectOrder) }, // 4c Inverted Hairpin Coaster + { NULL, 0 }, // 4d Magic Carpet, N/A + { SubmarineRideObjectOrder, countof(SubmarineRideObjectOrder) }, // 4e Submarine Ride + { RiverRaftsObjectOrder, countof(RiverRaftsObjectOrder) }, // 4f River Rafts + { NULL, 0 }, // 50 (none), N/A + { NULL, 0 }, // 51 Enterprise, N/A + { NULL, 0 }, // 52 (none), N/A + { NULL, 0 }, // 53 (none), N/A + { NULL, 0 }, // 54 (none), N/A + { NULL, 0 }, // 55 (none), N/A + { InvertedImpulseRCObjectOrder, countof(InvertedImpulseRCObjectOrder) }, // 56 Inverted Impulse Coaster + { MiniRCObjectOrder, countof(MiniRCObjectOrder) }, // 57 Mini Roller Coaster + { MineRideRCObjectOrder, countof(MineRideRCObjectOrder) }, // 58 Mine Ride + { NULL, 0 }, // 59 Unknown Ride + { LIMLaunchedRCObjectOrder, countof(LIMLaunchedRCObjectOrder) }, // 60 LIM Launched Roller Coaster }; const uint8 gRideCategories[0x60] = { @@ -1774,7 +1779,7 @@ const uint8 gRideCategories[0x60] = { It determines which picture is shown on the new ride tab and which train type is selected by default.*/ bool vehicleIsHigherInHierarchy(int track_type, char *currentVehicleName, char *comparedVehicleName) { - if(currentVehicleName==NULL || comparedVehicleName==NULL || gVehicleHierarchies[track_type]==NULL) { + if(currentVehicleName==NULL || comparedVehicleName==NULL || gVehicleHierarchies[track_type].entries==NULL) { return false; } @@ -1784,14 +1789,14 @@ bool vehicleIsHigherInHierarchy(int track_type, char *currentVehicleName, char * currentVehicleHierarchy=255; comparedVehicleHierarchy=255; - for(int i=0;i Date: Tue, 3 Nov 2015 04:00:16 +0000 Subject: [PATCH 0949/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/german.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/language/german.txt b/data/language/german.txt index 357a497d66..76187b1b18 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -834,8 +834,8 @@ STR_0829 :{SMALLFONT}{BLACK}Fenstertitel - Ziehen Sie hier, um das Fenster zu STR_0830 :{SMALLFONT}{BLACK}Ansicht heranzoomen STR_0831 :{SMALLFONT}{BLACK}Ansicht wegzoomen STR_0832 :{SMALLFONT}{BLACK}Ansicht um 90{DEGREE} im Uhrzeigersinn drehen -STR_0833 :{SMALLFONT}{BLACK}Spielpause -STR_0834 :{SMALLFONT}{BLACK}Festplatten- und Spieloptionen +STR_0833 :{SMALLFONT}{BLACK}Spiel pausieren +STR_0834 :{SMALLFONT}{BLACK}Speicher- und Spieloptionen STR_0835 :Spielinitialisierung fehlgeschlagen STR_0836 :Spiel kann nicht im minimierten Zustand gestartet werden STR_0837 :Grafiksystem kann nicht initialisiert werden @@ -3789,7 +3789,7 @@ STR_5452 :Symbolleiste ein-/ausblenden STR_5453 :Andere Attraktion auswählen STR_5454 :FPS-Limit aufheben STR_5455 :Sandkastenmodus aktivieren -STR_5456 :Höhenüberprüfung deaktivieren +STR_5456 :Konstruktionsüberschneidungen erlauben STR_5457 :Stützenlimit deaktivieren STR_5458 :Im Uhrzeigersinn drehen STR_5459 :Gegen den Uhrzeigersinn drehen From 5f799ac6c4ec35e947168759c9fdc428f0765d4e Mon Sep 17 00:00:00 2001 From: e-foley Date: Mon, 2 Nov 2015 20:23:22 -0800 Subject: [PATCH 0950/1173] contain rating mods in pp directives --- src/ride/ride_ratings.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index c24642406b..696896d50b 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -624,6 +624,15 @@ static void ride_ratings_calculate(rct_ride *ride) calcFunc(ride); } + #ifdef ORIGINAL_RATINGS + if (ride->ratings.excitement != -1) { + // Address underflows allowed by original RCT2 code + ride->ratings.excitement = max(0, ride->ratings.excitement); + ride->ratings.intensity = max(0, ride->ratings.intensity); + ride->ratings.nausea = max(0, ride->ratings.nausea); + } + #endif + // Original ride calculation // calcFunc = RCT2_ADDRESS(0x0097E050, ride_ratings_calculation)[ride->type]; // RCT2 CALLPROC X((int)calcFunc, 0, 0, 0, 0, 0, (int)ride, 0); @@ -786,6 +795,21 @@ static void ride_ratings_apply_adjustments(rct_ride *ride, rating_tuple *ratings ratings->nausea += ((ratings->nausea * rideEntry->nausea_multipler ) >> 7); // Apply total air time + #ifdef ORIGINAL_RATINGS + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_HAS_AIR_TIME) { + uint16 totalAirTime = ride->total_air_time; + if (rideEntry->flags & RIDE_ENTRY_FLAG_11) { + if (totalAirTime >= 96) { + totalAirTime -= 96; + ratings->excitement -= totalAirTime / 8; + ratings->nausea += totalAirTime / 16; + } + } else { + ratings->excitement += totalAirTime / 8; + ratings->nausea += totalAirTime / 16; + } + } + #else if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_HAS_AIR_TIME) { if (rideEntry->flags & RIDE_ENTRY_FLAG_11) { // Limit airtime bonus for heartline twister coaster (see issues #2031 and #2064) @@ -795,6 +819,7 @@ static void ride_ratings_apply_adjustments(rct_ride *ride, rating_tuple *ratings } ratings->nausea += ride->total_air_time / 16; } + #endif } /** From 12933256991ef22673cf79d733184fd78e21426f Mon Sep 17 00:00:00 2001 From: kmdreko Date: Mon, 2 Nov 2015 23:30:48 -0600 Subject: [PATCH 0951/1173] decompiled sub_683359 --- src/interface/viewport.c | 55 +++++++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index f10ba0d4d0..355d333268 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -270,15 +270,56 @@ void sub_689174(sint16* x, sint16* y, sint16 *z) *z = height; } -// ax = viewport->x -// bx = viewport->y; -// cx = viewport->width; -// dx = viewport->height; +void sub_683326(int left, int top, int right, int bottom) +{ + RCT2_CALLPROC_X(0x00683359, left, top, right, bottom, 0, 0, 0); +} + +// shifts pixels from the region in a direction. Used when a viewport moves; +// consider putting in src/drawing/drawing.c or src/drawing/rect.c +// +// 0x00683359 +// ax = x +// bx = y; +// cx = width; +// dx = height; // di = dx; // si = dy; -void sub_683359(int x, int y, int width, int height, int dx, int dy) +void gfx_move_screen_rect(int x, int y, int width, int height, int dx, int dy) { - RCT2_CALLPROC_X(0x00683359, x, y, width, height, dy, dx, 0); + // nothing to do + if (dx == 0 && dy == 0) + return; + + // I have seen no advantages of having this function nor disadvantages from + // leaving it out. Kept in for completeness + sub_683326(x, y, x + width - 1, y + height - 1); + + // get screen info + rct_drawpixelinfo *screenDPI = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo); + + sint32 stride = screenDPI->width + screenDPI->pitch; + uint8* to = screenDPI->bits + y * stride + x; + uint8* from = screenDPI->bits + (y - dy) * stride + x - dx; + + if (dy > 0) + { + // if positive dy, reverse directions + to += (height - 1) * stride; + from += (height - 1) * stride; + stride = -stride; + } + + // move bits + for (int i = 0; i < height; i++, to += stride, from += stride) + { + // when zooming, there can be x, y, dx, dy combinations that go off the + // screen; hence the condition. This code should ultimately not be + // called when zooming because this function is specific to updating the + // screen on move + if (from >= screenDPI->bits && from + width < screenDPI->bits + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) * RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16)) + memmove(to, from, width); + } } void sub_6E7FF3(rct_window *window, rct_viewport *viewport, int x, int y) @@ -361,7 +402,7 @@ void sub_6E7FF3(rct_window *window, rct_viewport *viewport, int x, int y) if (abs(x) < viewport->width && abs(y) < viewport->height) { // update whole block ? - sub_683359(viewport->x, viewport->y, viewport->width, viewport->height, x, y); + gfx_move_screen_rect(viewport->x, viewport->y, viewport->width, viewport->height, x, y); if (x > 0) { From bbe2a347144e21e34991b90dd5aa83d946d7514d Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Mon, 2 Nov 2015 21:55:06 +0000 Subject: [PATCH 0952/1173] Fix #2151. I think this fixes the issue but its hard to understand from the original issue. --- src/windows/footpath.c | 6 ++++++ src/windows/ride_construction.c | 9 +++++++++ src/world/footpath.c | 3 +++ 3 files changed, 18 insertions(+) diff --git a/src/windows/footpath.c b/src/windows/footpath.c index 51309bc1ac..3623eb99c2 100644 --- a/src/windows/footpath.c +++ b/src/windows/footpath.c @@ -430,6 +430,12 @@ static void window_footpath_update_provisional_path_for_bridge_mode(rct_window * if (RCT2_GLOBAL(RCT2_ADDRESS_PATH_CONSTRUCTION_MODE, uint8) != PATH_CONSTRUCTION_MODE_BRIDGE_OR_TUNNEL) return; + // Recheck area for construction. Set by ride_construction window + if (RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_FLAGS, uint8) & (1 << 2)) { + footpath_provisional_remove(); + RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_FLAGS, uint8) &= ~(1 << 2); + } + // Update provisional bridge mode path if (!(RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_FLAGS, uint8) & (1 << 1))) { footpath_get_next_path_info(&type, &x, &y, &z, &slope); diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index d81b6e7c0f..c684f60c93 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -612,6 +612,8 @@ static void window_ride_construction_mouseup(rct_window *w, int widgetIndex) break; case WIDX_CONSTRUCT: window_ride_construction_construct(w); + // Force any footpath construction to recheck the area. + RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_FLAGS, uint8) |= (1 << 2); break; case WIDX_DEMOLISH: window_ride_construction_mouseup_demolish(w); @@ -2436,6 +2438,13 @@ void sub_6C94D8() { int x, y, z, direction, type, rideIndex, edxRS16; + // Recheck if area is fine for new track. + // Set by footpath placement + if (_currentTrackSelectionFlags & 8) { + sub_6C9627(); + _currentTrackSelectionFlags &= ~8; + } + switch (_rideConstructionState) { case RIDE_CONSTRUCTION_STATE_FRONT: case RIDE_CONSTRUCTION_STATE_BACK: diff --git a/src/world/footpath.c b/src/world/footpath.c index 943981c9ea..291017e930 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -344,6 +344,9 @@ static money32 footpath_place_real(int type, int x, int y, int z, int slope, int return MONEY32_UNDEFINED; } + // Force ride construction to recheck area + RCT2_GLOBAL(0x00F440B0, uint8) |= 8; + footpath_provisional_remove(); mapElement = map_get_footpath_element_slope((x / 32), (y / 32), z, slope); if (mapElement == NULL) { From 9bf40ffd8382c2752b036399d37d5dd7f6c75089 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 3 Nov 2015 15:20:25 +0000 Subject: [PATCH 0953/1173] Fix #1504. Correct curvature for previous lift hill piece. Note this is an original bug that is fixed in the GOG version. --- src/ride/track_data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ride/track_data.c b/src/ride/track_data.c index f1590b882e..5746f2118e 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -5134,7 +5134,7 @@ const track_curve_chain gTrackCurveChain[256] = { { 4, 4 }, { 3, 3 }, { 4, 4 }, - { 438, 190 }, + { 438, 438 }, { 442, 0 }, { 441, 0 }, { 0, 440 }, From d5688cdc4e9f5b163a8a22a9d9bfe9b55f54fe9a Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 3 Nov 2015 18:19:23 +0000 Subject: [PATCH 0954/1173] Fix #2189. Map owned area not shown correctly. Issue was caused by doubling up a bit of code and combining it with the next line when implementing it. --- src/windows/map.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/windows/map.c b/src/windows/map.c index 22179e1b98..163604d879 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -1546,9 +1546,6 @@ static uint16 map_window_get_pixel_colour_peep(int x, int y) if (!(mapElement->properties.surface.ownership & OWNERSHIP_OWNED)) colour = 10 | (colour & 0xFF00); - if (!(mapElement->flags & (1 << 5))) - colour = 10 | (colour & 0xFF00); - while (!map_element_is_last_for_tile(mapElement++)) { int mapElementType = map_element_get_type(mapElement); colour &= ElementTypeMaskColour[mapElementType >> 2]; From 025f36ec28247a4d1d769ae88813f0f83b891422 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 3 Nov 2015 19:20:13 +0000 Subject: [PATCH 0955/1173] fix #2187 Title sequence now maintains central position from script if window size changes. --- src/platform/shared.c | 7 +++++-- src/title.c | 46 +++++++++++++++++++++++++++++++++---------- src/title.h | 1 + 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/platform/shared.c b/src/platform/shared.c index a04fb90b85..98064406f2 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -31,6 +31,7 @@ #include "../input.h" #include "../localisation/localisation.h" #include "../openrct2.h" +#include "../title.h" #include "../util/util.h" #include "platform.h" @@ -312,12 +313,14 @@ static void platform_resize(int width, int height) window_relocate_windows(width, height); } + title_fix_location(); gfx_invalidate_screen(); // Check if the window has been resized in windowed mode and update the config file accordingly // This is called in rct2_update_2 and is only called after resizing a window has finished - if ((flags & (SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED | - SDL_WINDOW_FULLSCREEN | SDL_WINDOW_FULLSCREEN_DESKTOP)) == 0) { + const int nonWindowFlags = + SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED | SDL_WINDOW_FULLSCREEN | SDL_WINDOW_FULLSCREEN_DESKTOP; + if (!(flags & nonWindowFlags)) { if (width != gConfigGeneral.window_width || height != gConfigGeneral.window_height) { gConfigGeneral.window_width = width; gConfigGeneral.window_height = height; diff --git a/src/title.c b/src/title.c index 3852d844ed..a0dfdbf461 100644 --- a/src/title.c +++ b/src/title.c @@ -53,6 +53,7 @@ sint32 gTitleScriptCommand = -1; uint8 gTitleScriptSave = 0xFF; sint32 gTitleScriptSkipTo = -1; sint32 gTitleScriptSkipLoad = -1; +rct_xy16 _titleScriptCurrentCentralPosition = { -1, -1 }; #pragma region Showcase script @@ -222,6 +223,39 @@ static int title_load_park(const char *path) return 1; } +/** + * Sets the map location to the given tile coordinates. Z is automatic. + * @param x X position in map tiles. + * @param y Y position in map tiles. + */ +static void title_set_location(int x, int y) +{ + int z = map_element_height(x, y); + + // Update viewport + rct_window* w = window_get_main(); + if (w != NULL) { + window_scroll_to_location(w, x, y, z); + w->flags &= ~WF_SCROLLING_TO_LOCATION; + viewport_update_position(w); + } + + // Save known tile position in case of window resize + _titleScriptCurrentCentralPosition.x = (sint16)x; + _titleScriptCurrentCentralPosition.y = (sint16)y; +} + +/** + * Re-centres the map location to the last scripted tile position. + */ +void title_fix_location() +{ + rct_xy16 position = _titleScriptCurrentCentralPosition; + if (position.x != -1) { + title_set_location(position.x, position.y); + } +} + static void title_skip_opcode() { uint8 script_opcode; @@ -255,7 +289,7 @@ static void title_skip_opcode() static void title_do_next_script_opcode() { int i; - short x, y, z; + short x, y; uint8 script_opcode, script_operand; rct_window* w; gTitleScriptCommand++; @@ -295,15 +329,7 @@ static void title_do_next_script_opcode() case TITLE_SCRIPT_LOCATION: x = (*_currentScript++) * 32 + 16; y = (*_currentScript++) * 32 + 16; - z = map_element_height(x, y); - - // Update viewport - w = window_get_main(); - if (w != NULL) { - window_scroll_to_location(w, x, y, z); - w->flags &= ~WF_SCROLLING_TO_LOCATION; - viewport_update_position(w); - } + title_set_location(x, y); break; case TITLE_SCRIPT_ROTATE: script_operand = (*_currentScript++); diff --git a/src/title.h b/src/title.h index c856674fe3..890a6bdf60 100644 --- a/src/title.h +++ b/src/title.h @@ -47,6 +47,7 @@ void title_update(); void title_skip_from_beginning(); void title_script_get_line(SDL_RWops *file, char *parts); bool title_refresh_sequence(); +void title_fix_location(); void DrawOpenRCT2(int x, int y); #endif From 5b54ad18e983c432fac6c6da642ac09aa71a03af Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 3 Nov 2015 20:03:21 +0000 Subject: [PATCH 0956/1173] Fixed #2082. Sub_6D31A6 now working. Small mistake in track previous meant the x/y coordinates didn't match the map element. There were also a few other issues that presented themselves once that was fixed. --- src/ride/ride.c | 22 ++++++++++++---------- src/ride/track.c | 4 ++-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 5f3c4d5c15..b3d4d60c25 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1188,11 +1188,14 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par mapElement->properties.track.colour &= 0x0F; mapElement->properties.track.colour |= (extra_params & 0xFF) << 4; } + if (flags & (1 << 3)) { + // Cable lift hill track mapElement->properties.track.colour |= (1 << 3); } if (flags & (1 << 4)) { - mapElement->properties.track.colour &= 0xF7; + // Clear Cable lift hill track + mapElement->properties.track.colour &= ~(1 << 3); } } @@ -4306,13 +4309,6 @@ bool ride_create_vehicles(rct_ride *ride, int rideIndex, rct_xy_element *element */ static bool sub_6D31A6(rct_ride *ride, bool isApplying) { - return !(RCT2_CALLPROC_X(0x006D31A6, 0, isApplying ? 1 : 0, 0, 0, 0, (int)ride, 0) & 0x100); - - // TODO This implementation does not work because track_block_get_previous called from track_circuit_iterator_previous seems - // to be ending prematurely and not iterating the complete track. This can be reproduced by constructing a giga coaster - // with a lift hill (pre-designed one will do) and testing it. This means other methods that use - // track_block_get_previous could be faulty. It might a particuarly track block that causes it. - uint16 xy; int stationIndex; for (stationIndex = 0; stationIndex < 4; stationIndex++) { @@ -4328,19 +4324,23 @@ static bool sub_6D31A6(rct_ride *ride, bool isApplying) int y = (xy >> 8) * 32; int z = ride->station_heights[stationIndex]; + bool success = false; rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); do { - if (mapElement->type != MAP_ELEMENT_TYPE_TRACK) continue; + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; if (mapElement->base_height != z) continue; int trackType = mapElement->properties.track.type; if (!(RCT2_ADDRESS(0x0099BA64, uint8)[trackType * 16] & 0x10)) { continue; } - + success = true; break; } while (!map_element_is_last_for_tile(mapElement++)); + if (!success) + return false; + enum { STATE_FIND_CABLE_LIFT, STATE_FIND_STATION, @@ -4393,6 +4393,8 @@ static bool sub_6D31A6(rct_ride *ride, bool isApplying) z = mapElement->base_height * 8; int direction = mapElement->type & 3; trackType = mapElement->properties.track.type; + x = it.current.x; + y = it.current.y; sub_6C683D(&x, &y, &z, direction, trackType, 0, &mapElement, flags); } } diff --git a/src/ride/track.c b/src/ride/track.c index 8d12c0a5f2..4c41845eb8 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -4754,8 +4754,8 @@ bool track_circuit_iterator_previous(track_circuit_iterator *it) it->last = it->current; if (track_block_get_previous(it->last.x, it->last.y, it->last.element, &trackBeginEnd)) { - it->current.x = trackBeginEnd.begin_x; - it->current.y = trackBeginEnd.begin_y; + it->current.x = trackBeginEnd.end_x; + it->current.y = trackBeginEnd.end_y; it->current.element = trackBeginEnd.begin_element; it->currentZ = trackBeginEnd.begin_z; it->currentDirection = trackBeginEnd.begin_direction; From c8701ef01e8b233274c5659195fce11c81482ae7 Mon Sep 17 00:00:00 2001 From: Flukiestemperor Date: Tue, 3 Nov 2015 14:38:42 -0600 Subject: [PATCH 0957/1173] partially fix #2181 create common function --- src/game.c | 1 + src/ride/ride.c | 27 +++++++++++++++++++++++++++ src/ride/ride.h | 5 +++++ src/windows/ride_construction.c | 29 +++++++++++++++++++++-------- 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/src/game.c b/src/game.c index f603d93422..1312661de4 100644 --- a/src/game.c +++ b/src/game.c @@ -67,6 +67,7 @@ GAME_COMMAND_CALLBACK_POINTER* game_command_callback_table[] = { game_command_callback_ride_construct_new, game_command_callback_ride_construct_placed_front, game_command_callback_ride_construct_placed_back, + game_command_callback_ride_remove_track_piece, }; int game_command_callback_get_index(GAME_COMMAND_CALLBACK_POINTER* callback) diff --git a/src/ride/ride.c b/src/ride/ride.c index 5f3c4d5c15..9f522dfaf9 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -128,6 +128,7 @@ static const int RideInspectionInterval[] = { rct_ride_type **gRideTypeList = RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, rct_ride_type*); rct_ride* g_ride_list = RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride); +bool gGotoStartPlacementMode = false; // Static function declarations rct_peep *find_closest_mechanic(int x, int y, int forInspection); @@ -5536,6 +5537,28 @@ void game_command_callback_ride_construct_placed_front(int eax, int ebx, int ecx sub_6C84CE(); } +/** +* +* Network client callback when removing ride pieces +* Client does execute placing the piece on the same tick as mouse_up - waits for server command +* Re-executes function from ride_construction - window_ride_construction_mouseup_demolish() +* Only uses part that deals with construction state +*/ + +void game_command_callback_ride_remove_track_piece(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp) +{ + int x, y, z, direction, type; + rct_xy_element outputElement; + + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection; + type = _currentTrackPieceType; + + window_ride_construction_mouseup_demolish_next_piece(x, y, z, direction, type, outputElement); +} + /** * * rct2: 0x006B49D9 @@ -6287,6 +6310,10 @@ bool ride_select_forwards_from_back() money32 ride_remove_track_piece(int x, int y, int z, int direction, int type) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS; + if (network_get_mode() == NETWORK_MODE_CLIENT) + { + game_command_callback = game_command_callback_ride_remove_track_piece; + } return game_do_command(x, (GAME_COMMAND_FLAG_APPLY) | ((direction & 3) << 8), y, type, GAME_COMMAND_REMOVE_TRACK, z, 0); } diff --git a/src/ride/ride.h b/src/ride/ride.h index 0734fedc7e..5a1e38b154 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -876,6 +876,8 @@ extern const uint8 gRideClassifications[255]; #define _currentSeatRotationAngle RCT2_GLOBAL(0x00F440CF, uint8) +extern bool gGotoStartPlacementMode; + int ride_get_count(); int ride_get_total_queue_length(rct_ride *ride); int ride_get_max_queue_time(rct_ride *ride); @@ -929,6 +931,7 @@ void game_command_create_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, void game_command_callback_ride_construct_new(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); void game_command_callback_ride_construct_placed_front(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); void game_command_callback_ride_construct_placed_back(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); +void game_command_callback_ride_remove_track_piece(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); @@ -1009,4 +1012,6 @@ bool shop_item_is_souvenir(int shopItem); void ride_reset_all_names(); const uint8* ride_seek_available_modes(rct_ride *ride); +void window_ride_construction_mouseup_demolish_next_piece(int x, int y, int z, int direction, int type, rct_xy_element outputElement); + #endif diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index d81b6e7c0f..ac19ef73b6 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1670,11 +1670,11 @@ static void window_ride_construction_construct(rct_window *w) */ static void window_ride_construction_mouseup_demolish(rct_window* w) { - int x, y, z, direction, type, slope, slopeEnd, b2, bankEnd, bankStart, b5, b4; + int x, y, z, direction, type; rct_map_element *mapElement; rct_xy_element inputElement, outputElement; track_begin_end trackBeginEnd; - bool gotoStartPlacementMode; + //bool gotoStartPlacementMode; _currentTrackPrice = MONEY32_UNDEFINED; sub_6C9627(); @@ -1716,14 +1716,14 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) z = trackBeginEnd.begin_z; direction = trackBeginEnd.begin_direction; type = trackBeginEnd.begin_element->properties.track.type; - gotoStartPlacementMode = false; + gGotoStartPlacementMode = false; } else if (track_block_get_next(&inputElement, &outputElement, &z, &direction)) { x = outputElement.x; y = outputElement.y; direction = outputElement.element->type & MAP_ELEMENT_DIRECTION_MASK; type = outputElement.element->properties.track.type; - gotoStartPlacementMode = false; + gGotoStartPlacementMode = false; } else { x = _currentTrackBeginX; y = _currentTrackBeginY; @@ -1738,7 +1738,7 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) const rct_preview_track *trackBlock = get_track_def_from_ride_index(_currentRideIndex, mapElement->properties.track.type); z = (mapElement->base_height * 8) - trackBlock->z; - gotoStartPlacementMode = true; + gGotoStartPlacementMode = true; } money32 cost = ride_remove_track_piece( @@ -1753,7 +1753,13 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) return; } - if (gotoStartPlacementMode) { + window_ride_construction_mouseup_demolish_next_piece(x, y, z, direction, type, outputElement); +} + +void window_ride_construction_mouseup_demolish_next_piece(int x, int y, int z, int direction, int type, rct_xy_element outputElement) +{ + int slope, slopeEnd, b2, bankEnd, bankStart, b5, b4; + if (gGotoStartPlacementMode) { z &= 0xFFF0; _currentTrackBeginZ = z; _rideConstructionState = RIDE_CONSTRUCTION_STATE_FRONT; @@ -1783,7 +1789,8 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) sub_6C84CE(); } } - } else { + } + else { if (RCT2_GLOBAL(0x00F440B8, uint8) == 3 || RCT2_GLOBAL(0x00F440B8, uint8) == 1) { if (type == TRACK_ELEM_MIDDLE_STATION || type == TRACK_ELEM_BEGIN_STATION) { type = TRACK_ELEM_END_STATION; @@ -1794,6 +1801,11 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) type = TRACK_ELEM_BEGIN_STATION; } } + if (network_get_mode() == NETWORK_MODE_CLIENT) + { + // rideConstructionState needs to be set again to the proper value, this only affects the client + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + } _currentTrackBeginX = x; _currentTrackBeginY = y; _currentTrackBeginZ = z; @@ -1803,7 +1815,8 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) _rideConstructionArrowPulseTime = 0; if (RCT2_GLOBAL(0x00F440B8, uint8) == 1) { ride_select_next_section(); - } else if (RCT2_GLOBAL(0x00F440B8, uint8) == 2) { + } + else if (RCT2_GLOBAL(0x00F440B8, uint8) == 2) { ride_select_previous_section(); } sub_6C84CE(); From e177be305b93f7312dbd56f4b254e18393053511 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 3 Nov 2015 22:20:35 +0000 Subject: [PATCH 0958/1173] allow user data path to be specified by command line, closes #2182 Also changed default path under linux to be ~/.config/OpenRCT2. --- projects/openrct2.vcxproj | 1 + projects/openrct2.vcxproj.filters | 3 ++ src/cmdline.c | 6 ++++ src/openrct2.c | 2 ++ src/openrct2.h | 5 ++-- src/platform/linux.c | 41 ++++++++++++++++++++++++-- src/platform/platform.h | 1 + src/platform/windows.c | 48 ++++++++++++++++++++++++------- src/util/util.c | 3 ++ 9 files changed, 94 insertions(+), 16 deletions(-) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index dd28db7755..8a16578e6f 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -82,6 +82,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 5707164ac7..c08b462c63 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -543,6 +543,9 @@ Source\Ride + + Source\Platform + diff --git a/src/cmdline.c b/src/cmdline.c index 586d343f48..49f8c4adaa 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -73,6 +73,7 @@ int cmdline_run(const char **argv, int argc) // int version = 0, headless = 0, verbose = 0, width = 0, height = 0, port = 0; char *server = NULL; + char *userDataPath = NULL; argparse_option_t options[] = { OPT_HELP(), @@ -82,6 +83,7 @@ int cmdline_run(const char **argv, int argc) OPT_INTEGER('m', "mode", &sprite_mode, "the type of sprite conversion. 0 = default, 1 = simple closest pixel match, 2 = dithering"), OPT_STRING(0, "server", &server, "server to connect to"), OPT_INTEGER(0, "port", &port, "port"), + OPT_STRING(0, "user-data-path", &userDataPath, "path to the user data directory (containing config.ini)"), OPT_END() }; @@ -100,6 +102,10 @@ int cmdline_run(const char **argv, int argc) if (verbose) _log_levels[DIAGNOSTIC_LEVEL_VERBOSE] = 1; + if (userDataPath != NULL) { + safe_strncpy(gCustomUserDataPath, userDataPath, sizeof(gCustomUserDataPath)); + } + #ifndef DISABLE_NETWORK if (port != 0) { gNetworkStart = NETWORK_MODE_SERVER; diff --git a/src/openrct2.c b/src/openrct2.c index b1ccd332f2..d19fe73ecb 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -52,6 +52,7 @@ int gOpenRCT2StartupAction = STARTUP_ACTION_TITLE; utf8 gOpenRCT2StartupActionPath[512] = { 0 }; utf8 gExePath[MAX_PATH]; +utf8 gCustomUserDataPath[MAX_PATH] = { 0 }; // This should probably be changed later and allow a custom selection of things to initialise like SDL_INIT bool gOpenRCT2Headless = false; @@ -187,6 +188,7 @@ bool openrct2_initialise() { utf8 userPath[MAX_PATH]; + platform_resolve_user_data_path(); platform_get_user_directory(userPath, NULL); if (!platform_ensure_directory_exists(userPath)) { log_fatal("Could not create user directory (do you have write access to your documents folder?)"); diff --git a/src/openrct2.h b/src/openrct2.h index 2d8ac7daf5..73fe12f0e8 100644 --- a/src/openrct2.h +++ b/src/openrct2.h @@ -31,8 +31,9 @@ enum { }; extern int gOpenRCT2StartupAction; -extern char gOpenRCT2StartupActionPath[512]; -extern char gExePath[MAX_PATH]; +extern utf8 gOpenRCT2StartupActionPath[512]; +extern utf8 gExePath[MAX_PATH]; +extern utf8 gCustomUserDataPath[MAX_PATH]; extern bool gOpenRCT2Headless; extern bool gOpenRCT2ShowChangelog; diff --git a/src/platform/linux.c b/src/platform/linux.c index 4c76595791..392819801b 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -39,6 +39,8 @@ // The name of the mutex used to prevent multiple instances of the game from running #define SINGLE_INSTANCE_MUTEX_NAME "RollerCoaster Tycoon 2_GSKMUTEX" +utf8 _userDataDirectoryPath[MAX_PATH] = { 0 }; + /** * The function that is called directly from the host application (rct2.exe)'s WinMain. This will be removed when OpenRCT2 can * be built as a stand alone application. @@ -554,8 +556,25 @@ wchar_t *regular_to_wchar(const char* src) return w_buffer; } -void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) +/** + * Default directory fallback is: + * - (command line argument) + * - $XDG_CONFIG_HOME/.config/OpenRCT2 + * - /home/[uid]/.config/OpenRCT2 + */ +void platform_resolve_user_data_path() { + if (gCustomUserDataPath[0] != 0) { + safe_strncpy(_userDataDirectoryPath, gCustomUserDataPath, sizeof(_userDataDirectoryPath)); + + // Ensure path ends with separator + int len = strlen(_userDataDirectoryPath); + if (_userDataDirectoryPath[len - 1] != separator[0]) { + strcat(_userDataDirectoryPath, separator); + } + return; + } + char buffer[MAX_PATH]; buffer[0] = '\0'; log_verbose("buffer = '%s'", buffer); @@ -567,16 +586,32 @@ void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) log_verbose("homedir was null, used getuid, now is = '%s'", homedir); if (homedir == NULL) { - log_error("Couldn't find user home directory"); + log_fatal("Couldn't find user data directory"); + exit(-1); return; } } char separator[2] = { platform_get_path_separator(), 0 }; strncat(buffer, homedir, MAX_PATH); strncat(buffer, separator, MAX_PATH); + strncat(buffer, ".config", MAX_PATH); + strncat(buffer, separator, MAX_PATH); strncat(buffer, "OpenRCT2", MAX_PATH); strncat(buffer, separator, MAX_PATH); - log_verbose("outPath + OpenRCT2 = '%s'", buffer); + log_verbose("OpenRCT2 user data directory = '%s'", buffer); + int len = strnlen(buffer, MAX_PATH); + wchar_t *w_buffer = regular_to_wchar(buffer); + w_buffer[len] = '\0'; + utf8 *path = widechar_to_utf8(w_buffer); + free(w_buffer); + safe_strncpy(_userDataDirectoryPath, path, MAX_PATH); + free(path); +} + +void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) +{ + char buffer[MAX_PATH]; + safe_strncpy(buffer, _userDataDirectoryPath, sizeof(buffer)); if (subDirectory != NULL && subDirectory[0] != 0) { log_verbose("adding subDirectory '%s'", subDirectory); strcat(buffer, subDirectory); diff --git a/src/platform/platform.h b/src/platform/platform.h index 75e568da43..fcd94a06b9 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -138,6 +138,7 @@ void platform_show_cursor(); void platform_get_cursor_position(int *x, int *y); void platform_set_cursor_position(int x, int y); unsigned int platform_get_ticks(); +void platform_resolve_user_data_path(); void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory); void platform_show_messagebox(utf8 *message); int platform_open_common_file_dialog(int type, utf8 *title, utf8 *filename, utf8 *filterPattern, utf8 *filterName); diff --git a/src/platform/windows.c b/src/platform/windows.c index c3c4434660..6e60ebed66 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -37,6 +37,8 @@ // The name of the mutex used to prevent multiple instances of the game from running #define SINGLE_INSTANCE_MUTEX_NAME "RollerCoaster Tycoon 2_GSKMUTEX" +utf8 _userDataDirectoryPath[MAX_PATH] = { 0 }; + LPSTR *CommandLineToArgvA(LPSTR lpCmdLine, int *argc); /** @@ -380,25 +382,49 @@ bool platform_file_delete(const utf8 *path) return success == TRUE; } -void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) +/** + * Default directory fallback is: + * - (command line argument) + * - C:\Users\%USERNAME%\OpenRCT2 (as from SHGetFolderPathW) + */ +void platform_resolve_user_data_path() { wchar_t wOutPath[MAX_PATH]; - char separator[2] = { platform_get_path_separator(), 0 }; + const char separator[2] = { platform_get_path_separator(), 0 }; + + if (gCustomUserDataPath[0] != 0) { + safe_strncpy(_userDataDirectoryPath, gCustomUserDataPath, sizeof(_userDataDirectoryPath)); + + // Ensure path ends with separator + int len = strlen(_userDataDirectoryPath); + if (_userDataDirectoryPath[len - 1] != separator[0]) { + strcat(_userDataDirectoryPath, separator); + } + return; + } if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, NULL, 0, wOutPath))) { utf8 *outPathTemp = widechar_to_utf8(wOutPath); - safe_strncpy(outPath, outPathTemp, MAX_PATH); + safe_strncpy(_userDataDirectoryPath, outPathTemp, sizeof(_userDataDirectoryPath)); free(outPathTemp); - strcat(outPath, separator); - strcat(outPath, "OpenRCT2"); - strcat(outPath, separator); - if (subDirectory != NULL && subDirectory[0] != 0) { - strcat(outPath, subDirectory); - strcat(outPath, separator); - } + strcat(_userDataDirectoryPath, separator); + strcat(_userDataDirectoryPath, "OpenRCT2"); + strcat(_userDataDirectoryPath, separator); } else { - outPath[0] = 0; + log_fatal("Unable to resolve user data path."); + exit(-1); + } +} + +void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) +{ + const char separator[2] = { platform_get_path_separator(), 0 }; + + strcpy(outPath, _userDataDirectoryPath); + if (subDirectory != NULL && subDirectory[0] != 0) { + strcat(outPath, subDirectory); + strcat(outPath, separator); } } diff --git a/src/util/util.c b/src/util/util.c index 923c08fa29..a1c93d7ebe 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -183,6 +183,9 @@ int strcicmp(char const *a, char const *b) char *safe_strncpy(char * destination, const char * source, size_t size) { + assert(destination != NULL); + assert(source != NULL); + if (size == 0) { return destination; From 6c6cf27decc4ea3391364d86cb4dc3985f6e4388 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Tue, 3 Nov 2015 23:30:39 +0100 Subject: [PATCH 0959/1173] Update changelog --- distribution/changelog.txt | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 4adca07f93..172945e565 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -7,8 +7,31 @@ - Feature: Load/save window can be sorted on date. - Feature: Cheats for guest parameters like hunger, energy, nausea etc. - Feature: Cheats for park parameters like guest generation, loan settings and switching to and from not using money. -- Fix: Launched TD4 rides will now always use the RCT1 launch mode (that doesn't pass the station). -- Fix: Guests will no longer ignore no entry signs if the tile contains more than one fence. +- Feature: Cheats for showing vehicles from other track types and enabling all operating modes. +- Feature: Clear Scenery can now be used for sizes up to 64x64. +- Feature: The mountain tool can now be used for sizes up to 64x64. +- Feature: Built-in load/save window is now used for converting saved games to scenarios. +- Feature: Multiplayer (has some game-breaking bugs). +- Feature: Native Linux support. +- Feature: Console commands for fixing 'Name already in use' and banner count errors. +- Feature: Scenario and object descriptions are now translatable. +- Feature: UI stays responsive in pause mode. +- Feature: Hacked rides no longer have their reliability set to 0. +- Feature: Marketing campaign can now be run for up to 12 weeks. +- Feature: Day/night cycle. +- Technical: DirectDraw, DirectInput, DirectPlay and DirectSound are no longer used. +- Removed: Six Flags branding and limitations. +- Removed: Infogrames disclaimer. +- Fix: When placing a track, the preview will now use the same orientation as the ghost. +- Fix: Grouping vehicles by track type no longer interferes with research. +- Fix: Fix corrupt map elements when loading a game. +- Fix: Fix corrupt peep counter when loading a game. +- Fix: Launched TD4 rides will now always use the RCT1 launch mode (that doesn't pass the station) (original bug). +- Fix: Guests will no longer ignore no entry signs if the tile contains more than one fence (original bug). +- Fix: Right-clicking a piece of launched lift will no longer crash the game (original bug). +- Fix: Underflow in Heartline Twister ratings (original bug). +- Fix: Map window now display the usable map size, not the technical one (original bug). +- Fix: TD4 River Rapids will now have the correct seat colour (original bug). 0.0.2-beta (2015-06-21) ------------------------------------------------------------------------ From 800e80aeb3394e22b9585ca34b37762cf95650a2 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 3 Nov 2015 22:58:30 +0000 Subject: [PATCH 0960/1173] fix demolish track piece as client on multiplayer --- src/network/network.cpp | 2 ++ src/ride/ride.c | 20 ++++++++++++-------- src/ride/ride.h | 7 ++++++- src/windows/ride_construction.c | 14 +++++++++++--- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 6a23a8c0bc..faf75bc010 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -871,10 +871,12 @@ bool Network::ProcessConnection(NetworkConnection& connection) break; } } while (packetStatus == NETWORK_READPACKET_MORE_DATA || packetStatus == NETWORK_READPACKET_SUCCESS); +#if !DEBUG if (!connection.ReceivedPacketRecently()) { connection.last_disconnect_reason = "No Data"; return false; } +#endif return true; } diff --git a/src/ride/ride.c b/src/ride/ride.c index 9f522dfaf9..f0878fe592 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -129,6 +129,11 @@ static const int RideInspectionInterval[] = { rct_ride_type **gRideTypeList = RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, rct_ride_type*); rct_ride* g_ride_list = RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride); bool gGotoStartPlacementMode = false; +int gRideRemoveTrackPieceCallbackX; +int gRideRemoveTrackPieceCallbackY; +int gRideRemoveTrackPieceCallbackZ; +int gRideRemoveTrackPieceCallbackDirection; +int gRideRemoveTrackPieceCallbackType; // Static function declarations rct_peep *find_closest_mechanic(int x, int y, int forInspection); @@ -5548,15 +5553,14 @@ void game_command_callback_ride_construct_placed_front(int eax, int ebx, int ecx void game_command_callback_ride_remove_track_piece(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp) { int x, y, z, direction, type; - rct_xy_element outputElement; - x = _currentTrackBeginX; - y = _currentTrackBeginY; - z = _currentTrackBeginZ; - direction = _currentTrackPieceDirection; - type = _currentTrackPieceType; - - window_ride_construction_mouseup_demolish_next_piece(x, y, z, direction, type, outputElement); + x = gRideRemoveTrackPieceCallbackX; + y = gRideRemoveTrackPieceCallbackY; + z = gRideRemoveTrackPieceCallbackZ; + direction = gRideRemoveTrackPieceCallbackDirection; + type = gRideRemoveTrackPieceCallbackType; + + window_ride_construction_mouseup_demolish_next_piece(x, y, z, direction, type); } /** diff --git a/src/ride/ride.h b/src/ride/ride.h index 5a1e38b154..a94d6f74ad 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -877,6 +877,11 @@ extern const uint8 gRideClassifications[255]; #define _currentSeatRotationAngle RCT2_GLOBAL(0x00F440CF, uint8) extern bool gGotoStartPlacementMode; +extern int gRideRemoveTrackPieceCallbackX; +extern int gRideRemoveTrackPieceCallbackY; +extern int gRideRemoveTrackPieceCallbackZ; +extern int gRideRemoveTrackPieceCallbackDirection; +extern int gRideRemoveTrackPieceCallbackType; int ride_get_count(); int ride_get_total_queue_length(rct_ride *ride); @@ -1012,6 +1017,6 @@ bool shop_item_is_souvenir(int shopItem); void ride_reset_all_names(); const uint8* ride_seek_available_modes(rct_ride *ride); -void window_ride_construction_mouseup_demolish_next_piece(int x, int y, int z, int direction, int type, rct_xy_element outputElement); +void window_ride_construction_mouseup_demolish_next_piece(int x, int y, int z, int direction, int type); #endif diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index ac19ef73b6..e028ae3778 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1753,10 +1753,18 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) return; } - window_ride_construction_mouseup_demolish_next_piece(x, y, z, direction, type, outputElement); + if (network_get_mode() == NETWORK_MODE_CLIENT) { + gRideRemoveTrackPieceCallbackX = x; + gRideRemoveTrackPieceCallbackY = y; + gRideRemoveTrackPieceCallbackZ = z; + gRideRemoveTrackPieceCallbackDirection = direction; + gRideRemoveTrackPieceCallbackType = type; + } else { + window_ride_construction_mouseup_demolish_next_piece(x, y, z, direction, type); + } } -void window_ride_construction_mouseup_demolish_next_piece(int x, int y, int z, int direction, int type, rct_xy_element outputElement) +void window_ride_construction_mouseup_demolish_next_piece(int x, int y, int z, int direction, int type) { int slope, slopeEnd, b2, bankEnd, bankStart, b5, b4; if (gGotoStartPlacementMode) { @@ -1775,7 +1783,7 @@ void window_ride_construction_mouseup_demolish_next_piece(int x, int y, int z, i b4 = _currentTrackLiftHill; ride_construction_set_default_next_piece(); sub_6C84CE(); - if (!sub_6CAF80(_currentRideIndex, &outputElement)) { + if (!sub_6CAF80(_currentRideIndex, NULL)) { sub_6CC3FB(_currentRideIndex); _currentTrackPieceDirection = direction; if (!(slope & 0x100)) { From 0b7544dbce035a97c716937dbc2130e522111b30 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 3 Nov 2015 23:18:10 +0000 Subject: [PATCH 0961/1173] fix error in linux.c and double .config/.config --- src/platform/linux.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/platform/linux.c b/src/platform/linux.c index 392819801b..beea676cdf 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -575,6 +575,7 @@ void platform_resolve_user_data_path() return; } + const char separator[2] = { platform_get_path_separator(), 0 }; char buffer[MAX_PATH]; buffer[0] = '\0'; log_verbose("buffer = '%s'", buffer); @@ -590,11 +591,15 @@ void platform_resolve_user_data_path() exit(-1); return; } + + strncat(buffer, homedir, MAX_PATH); + strncat(buffer, separator, MAX_PATH); + strncat(buffer, ".config", MAX_PATH); + } + else + { + strncat(buffer, homedir, MAX_PATH); } - char separator[2] = { platform_get_path_separator(), 0 }; - strncat(buffer, homedir, MAX_PATH); - strncat(buffer, separator, MAX_PATH); - strncat(buffer, ".config", MAX_PATH); strncat(buffer, separator, MAX_PATH); strncat(buffer, "OpenRCT2", MAX_PATH); strncat(buffer, separator, MAX_PATH); @@ -610,6 +615,7 @@ void platform_resolve_user_data_path() void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) { + const char separator[2] = { platform_get_path_separator(), 0 }; char buffer[MAX_PATH]; safe_strncpy(buffer, _userDataDirectoryPath, sizeof(buffer)); if (subDirectory != NULL && subDirectory[0] != 0) { From a35472befe3a0d38dc3aea746f9acb32be62974e Mon Sep 17 00:00:00 2001 From: kmdreko Date: Tue, 3 Nov 2015 18:13:11 -0600 Subject: [PATCH 0962/1173] properly format function comment --- src/interface/viewport.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 355d333268..a7878405b1 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -275,16 +275,18 @@ void sub_683326(int left, int top, int right, int bottom) RCT2_CALLPROC_X(0x00683359, left, top, right, bottom, 0, 0, 0); } -// shifts pixels from the region in a direction. Used when a viewport moves; -// consider putting in src/drawing/drawing.c or src/drawing/rect.c -// -// 0x00683359 -// ax = x -// bx = y; -// cx = width; -// dx = height; -// di = dx; -// si = dy; +/** + * shifts pixels from the region in a direction. Used when a viewport moves; + * consider putting in src/drawing/drawing.c or src/drawing/rect.c + * + * rct2: 0x00683359 + * ax = x + * bx = y; + * cx = width; + * dx = height; + * di = dx; + * si = dy; + */ void gfx_move_screen_rect(int x, int y, int width, int height, int dx, int dy) { // nothing to do From d951bebf889804ddf2a39b5d10c384c55c297e58 Mon Sep 17 00:00:00 2001 From: kmdreko Date: Tue, 3 Nov 2015 18:13:49 -0600 Subject: [PATCH 0963/1173] move range checks --- src/interface/viewport.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index a7878405b1..62602ce656 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -300,6 +300,19 @@ void gfx_move_screen_rect(int x, int y, int width, int height, int dx, int dy) // get screen info rct_drawpixelinfo *screenDPI = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo); + // adjust for move off screen + // NOTE: when zooming, there can be x, y, dx, dy combinations that go off the + // screen; hence the checks. This code should ultimately not be called when + // zooming because this function is specific to updating the screen on move + int lmargin = min(x - dx, 0); + int rmargin = min(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - (x - dx + width), 0); + int tmargin = min(y - dy, 0); + int bmargin = min(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - (y - dy + height), 0); + x -= lmargin; + y -= tmargin; + width += lmargin + rmargin; + height += tmargin + bmargin; + sint32 stride = screenDPI->width + screenDPI->pitch; uint8* to = screenDPI->bits + y * stride + x; uint8* from = screenDPI->bits + (y - dy) * stride + x - dx; @@ -314,14 +327,7 @@ void gfx_move_screen_rect(int x, int y, int width, int height, int dx, int dy) // move bits for (int i = 0; i < height; i++, to += stride, from += stride) - { - // when zooming, there can be x, y, dx, dy combinations that go off the - // screen; hence the condition. This code should ultimately not be - // called when zooming because this function is specific to updating the - // screen on move - if (from >= screenDPI->bits && from + width < screenDPI->bits + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) * RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16)) - memmove(to, from, width); - } + memmove(to, from, width); } void sub_6E7FF3(rct_window *window, rct_viewport *viewport, int x, int y) From 2db198e7c4d89e0deae92ea96de8799d81defae8 Mon Sep 17 00:00:00 2001 From: kmdreko Date: Tue, 3 Nov 2015 18:14:22 -0600 Subject: [PATCH 0964/1173] Remove unneeded call --- src/interface/viewport.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 62602ce656..2d6fbbb253 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -293,10 +293,6 @@ void gfx_move_screen_rect(int x, int y, int width, int height, int dx, int dy) if (dx == 0 && dy == 0) return; - // I have seen no advantages of having this function nor disadvantages from - // leaving it out. Kept in for completeness - sub_683326(x, y, x + width - 1, y + height - 1); - // get screen info rct_drawpixelinfo *screenDPI = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo); From c40ed08406f781a82e972d65ae5bf55a34613a93 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Thu, 1 Oct 2015 13:17:49 +0900 Subject: [PATCH 0965/1173] Fix sha256sum generation on OS X. --- install.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/install.sh b/install.sh index eb19e49d5e..cc556be8d6 100755 --- a/install.sh +++ b/install.sh @@ -197,7 +197,11 @@ fi download_libs # mind the gap (trailing space) -sha256sum $cachedir/orctlibs.zip | cut -f1 -d\ > $libVFile +if [[ `uname` == "Darwin" ]]; then + shasum -a 256 $cachedir/orctlibs.zip | cut -f1 -d\ > $libVFile +else + sha256sum $cachedir/orctlibs.zip | cut -f1 -d\ > $libVFile +fi echo "Downloaded library with sha256sum: $(cat $libVFile)" # Local libs are required for all targets install_local_libs From aa0ab945ce99e66e2ff8f3b38c887db6b7416301 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Wed, 4 Nov 2015 18:55:59 +0900 Subject: [PATCH 0966/1173] Replaced backticks with POSIX style commands. --- build.sh | 6 +++--- install.sh | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build.sh b/build.sh index 90e2178542..6bdf0829f1 100755 --- a/build.sh +++ b/build.sh @@ -54,9 +54,9 @@ pushd build echo OPENRCT2_CMAKE_OPTS = $OPENRCT2_CMAKE_OPTS if [[ $TARGET == "docker32" ]] then - PARENT=`readlink -f ../` - chmod a+rwx `pwd` - chmod g+s `pwd` + PARENT=$(readlink -f ../) + chmod a+rwx $(pwd) + chmod g+s $(pwd) docker run -u travis -v $PARENT:/work/openrct2 -w /work/openrct2/build -i -t openrct2/openrct2:32bit-only bash -c "cmake ../ $OPENRCT2_CMAKE_OPTS && make" else cmake -DCMAKE_BUILD_TYPE=Debug $OPENRCT2_CMAKE_OPTS .. diff --git a/install.sh b/install.sh index cc556be8d6..fe2a71da27 100755 --- a/install.sh +++ b/install.sh @@ -7,7 +7,7 @@ cachedir=.cache liburl=https://openrct.net/launcher/libs/orctlibs.zip mkdir -p $cachedir -echo `uname` +echo $(uname) # Sets default target to "linux", if none specified TARGET=${TARGET-linux} @@ -104,7 +104,7 @@ function install_local_libs { echo TARGET = $TARGET -if [[ `uname` == "Darwin" ]]; then +if [[ $(uname) == "Darwin" ]]; then echo "Installation of OpenRCT2 assumes you have homebrew and use it to install packages." echo "Check if brew is installed" @@ -162,7 +162,7 @@ if [[ `uname` == "Darwin" ]]; then popd popd fi -elif [[ `uname` == "Linux" ]]; then +elif [[ $(uname) == "Linux" ]]; then if [[ -z "$TRAVIS" ]]; then sudo apt-get install -y binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 cmake if [[ -z "$DISABLE_G2_BUILD" ]]; then @@ -197,7 +197,7 @@ fi download_libs # mind the gap (trailing space) -if [[ `uname` == "Darwin" ]]; then +if [[ $(uname) == "Darwin" ]]; then shasum -a 256 $cachedir/orctlibs.zip | cut -f1 -d\ > $libVFile else sha256sum $cachedir/orctlibs.zip | cut -f1 -d\ > $libVFile From 36f5d089dfd6181cf495259a11b60e8c116d6b46 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Wed, 4 Nov 2015 18:57:13 +0900 Subject: [PATCH 0967/1173] Add OS X as a platform. --- src/rct2.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/rct2.h b/src/rct2.h index 0cc0d9c83a..9a98d84e81 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -91,6 +91,9 @@ typedef utf16* utf16string; #ifdef __linux__ #define OPENRCT2_PLATFORM "Linux" #endif +#ifdef __APPLE__ + #define OPENRCT2_PLATFORM "OS X" +#endif #ifndef OPENRCT2_PLATFORM #error Unknown platform! #endif From 96d71ac174d0ca74427c068307e4c9d94b16b1f2 Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Wed, 4 Nov 2015 12:51:00 +0100 Subject: [PATCH 0968/1173] Fix Bug #2201 --- src/interface/viewport.c | 6 +++--- src/interface/viewport.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 2d6fbbb253..8ca614981f 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -2908,10 +2908,10 @@ void screen_get_map_xy_side_with_z(sint16 screenX, sint16 screenY, sint16 z, sin * * @returns rotation in range 0-3 (inclusive) */ -int get_current_rotation() +uint32 get_current_rotation() { - int rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); - int rotation_masked = rotation & 3; + uint32 rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); + uint32 rotation_masked = rotation & 3; #if DEBUG_LEVEL_1 if (rotation != rotation_masked) { log_error("Found wrong rotation %d! Will return %d instead.", rotation, rotation_masked); diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 16b585f82e..af722d3885 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -144,6 +144,6 @@ void screen_get_map_xy_quadrant_with_z(sint16 screenX, sint16 screenY, sint16 z, void screen_get_map_xy_side(sint16 screenX, sint16 screenY, sint16 *mapX, sint16 *mapY, uint8 *side); void screen_get_map_xy_side_with_z(sint16 screenX, sint16 screenY, sint16 z, sint16 *mapX, sint16 *mapY, uint8 *side); -int get_current_rotation(); +uint32 get_current_rotation(); #endif From c3ec45b25f78ba5e11033eea215d013d770a1b6b Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 4 Nov 2015 18:27:33 +0000 Subject: [PATCH 0969/1173] Add more entries to changelog. --- distribution/changelog.txt | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 172945e565..2bbdc1ba28 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -5,13 +5,18 @@ - Feature: Uncapped FPS. - Feature: Ride selection in the Editor can now be sorted on track type or vehicle type. - Feature: Load/save window can be sorted on date. +- Feature: Sandbox now a menu toggle. +- Feature: Improved ability to disable clearance checks via menu toggle. +- Feature: Added ability to disable support limits via menu toggle. +- Feature: Cheat to clear the crash record of each ride. +- Feature: Cheat to set all rides to 10 minute inspections. - Feature: Cheats for guest parameters like hunger, energy, nausea etc. - Feature: Cheats for park parameters like guest generation, loan settings and switching to and from not using money. - Feature: Cheats for showing vehicles from other track types and enabling all operating modes. - Feature: Clear Scenery can now be used for sizes up to 64x64. - Feature: The mountain tool can now be used for sizes up to 64x64. - Feature: Built-in load/save window is now used for converting saved games to scenarios. -- Feature: Multiplayer (has some game-breaking bugs). +- Feature: Cooperative multiplayer (has some game-breaking bugs). - Feature: Native Linux support. - Feature: Console commands for fixing 'Name already in use' and banner count errors. - Feature: Scenario and object descriptions are now translatable. @@ -19,7 +24,20 @@ - Feature: Hacked rides no longer have their reliability set to 0. - Feature: Marketing campaign can now be run for up to 12 weeks. - Feature: Day/night cycle. -- Technical: DirectDraw, DirectInput, DirectPlay and DirectSound are no longer used. +- Feature: Added ability to save (over last file) as opposed to save as. +- Feature: Custom user data path specified by command line argument. +- Feature: Full UTF-8 language support. +- Feature: TTF font integration for non-Latin languages. +- Feature: Allow different date formats. +- Feature: Option to automatically pause the game on minimise from fullscreen. +- Feature: Option to automatically pause when Steam overlay is activated. +- Feature: Option to display all scrolling text banners as upper case (RCT1 style) +- Feature: Option to mute audio when game is not focused. +- Feature: Option to automatically place staff after hire. +- Feature: Option to enable 'mow grass' by default for handymen (RCT1 style) +- Feature: Option to ignore invalid checksums on loaded parks. +- Alteration: Autosave is now measured in real-time rather than in-game date. +- Technical: DirectDraw, DirectInput, DirectPlay and DirectSound dependencies are no longer used. - Removed: Six Flags branding and limitations. - Removed: Infogrames disclaimer. - Fix: When placing a track, the preview will now use the same orientation as the ghost. From 96a1f0c6f74af76ae0eb78dcf91707e5a786d800 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Wed, 4 Nov 2015 19:28:45 +0000 Subject: [PATCH 0970/1173] Refactor. Labelled the known flags and used functions for setting and clearing them. --- src/ride/ride.c | 12 ++++++------ src/ride/track.c | 12 ++++++++++++ src/ride/track.h | 10 ++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index b3d4d60c25..d2324ba2f0 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1190,12 +1190,10 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par } if (flags & (1 << 3)) { - // Cable lift hill track - mapElement->properties.track.colour |= (1 << 3); + track_element_set_cable_lift(mapElement); } if (flags & (1 << 4)) { - // Clear Cable lift hill track - mapElement->properties.track.colour &= ~(1 << 3); + track_element_clear_cable_lift(mapElement); } } @@ -4306,8 +4304,10 @@ bool ride_create_vehicles(rct_ride *ride, int rideIndex, rct_xy_element *element /** * * rct2: 0x006D31A6 + * Checks and initialises the cable lift track + * returns false if unable to find appropriate track. */ -static bool sub_6D31A6(rct_ride *ride, bool isApplying) +static bool ride_initialise_cable_lift_track(rct_ride *ride, bool isApplying) { uint16 xy; int stationIndex; @@ -4426,7 +4426,7 @@ bool ride_create_cable_lift(int rideIndex, bool isApplying) return false; } - if (!sub_6D31A6(ride, isApplying)) { + if (!ride_initialise_cable_lift_track(ride, isApplying)) { return false; } diff --git a/src/ride/track.c b/src/ride/track.c index 4c41845eb8..6ec6b8920a 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -4824,3 +4824,15 @@ bool track_element_is_lift_hill(rct_map_element *trackElement) { return trackElement->type & 0x80; } + +bool track_element_is_cable_lift(rct_map_element *trackElement) { + return trackElement->properties.track.colour & TRACK_ELEMENT_COLOUR_FLAG_CABLE_LIFT; +} + +void track_element_set_cable_lift(rct_map_element *trackElement) { + trackElement->properties.track.colour |= TRACK_ELEMENT_COLOUR_FLAG_CABLE_LIFT; +} + +void track_element_clear_cable_lift(rct_map_element *trackElement) { + trackElement->properties.track.colour &= ~TRACK_ELEMENT_COLOUR_FLAG_CABLE_LIFT; +} diff --git a/src/ride/track.h b/src/ride/track.h index 64d9ed5596..5690767666 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -109,6 +109,12 @@ enum{ TRACK_ELEMENT_FLAG_TERMINAL_STATION = (1<<3), }; +enum { + // Not anything to do with colour but uses + // that field in the map element + TRACK_ELEMENT_COLOUR_FLAG_CABLE_LIFT = (1 << 3), +}; + #define TRACK_ELEMENT_FLAG_MAGNITUDE_MASK 0x0F #define TRACK_ELEMENT_FLAG_COLOUR_MASK 0x30 #define TRACK_ELEMENT_FLAG_STATION_NO_MASK 0x02 @@ -542,4 +548,8 @@ void track_get_front(rct_xy_element *input, rct_xy_element *output); bool track_element_is_lift_hill(rct_map_element *trackElement); +bool track_element_is_cable_lift(rct_map_element *trackElement); +void track_element_set_cable_lift(rct_map_element *trackElement); +void track_element_clear_cable_lift(rct_map_element *trackElement); + #endif From b3c8a1d2b7c5ead9a34de32adc89bc96dbb506d1 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Thu, 5 Nov 2015 10:08:08 +0100 Subject: [PATCH 0971/1173] Correct 'Open new window' --- data/language/english_uk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index c577655013..4204c63e48 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2712,7 +2712,7 @@ STR_2703 :Every 15 minutes STR_2704 :Every 30 minutes STR_2705 :Every hour STR_2706 :Never -STR_2707 :Open new window +STR_2707 :Load/save using system dialog STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? STR_2709 :Overwrite STR_2710 :Type the name of the file. From 3be79fd738086e72e5e4a39a57f86cc1f8dc988d Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Thu, 5 Nov 2015 10:16:13 +0100 Subject: [PATCH 0972/1173] Fix screen location on resize/alt+tab --- src/title.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/title.c b/src/title.c index a0dfdbf461..87bf86ca92 100644 --- a/src/title.c +++ b/src/title.c @@ -250,9 +250,11 @@ static void title_set_location(int x, int y) */ void title_fix_location() { - rct_xy16 position = _titleScriptCurrentCentralPosition; - if (position.x != -1) { - title_set_location(position.x, position.y); + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) == SCREEN_FLAGS_TITLE_DEMO) { + rct_xy16 position = _titleScriptCurrentCentralPosition; + if (position.x != -1) { + title_set_location(position.x, position.y); + } } } From 68aea9740d5f22c33883a8a3c5af876bf421331f Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Thu, 5 Nov 2015 14:43:06 +0100 Subject: [PATCH 0973/1173] Update english_uk.txt --- data/language/english_uk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 4204c63e48..9b270fe6f9 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2712,7 +2712,7 @@ STR_2703 :Every 15 minutes STR_2704 :Every 30 minutes STR_2705 :Every hour STR_2706 :Never -STR_2707 :Load/save using system dialog +STR_2707 :Use system dialog window STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? STR_2709 :Overwrite STR_2710 :Type the name of the file. From ce06ee8681b05092c49663aa55bc497c0f6bd209 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Thu, 5 Nov 2015 18:02:21 +0000 Subject: [PATCH 0974/1173] Fix #1523. Water tool selection now the correct colour. --- src/windows/top_toolbar.c | 4 ++-- src/windows/track_place.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 154019aabe..7366514a26 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -2007,8 +2007,8 @@ void top_toolbar_tool_update_water(sint16 x, sint16 y){ state_changed++; } - if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16) != 4){ - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16) = 4; + if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16) != 5){ + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16) = 5; state_changed++; } diff --git a/src/windows/track_place.c b/src/windows/track_place.c index 12eddb7ee8..c879b4907a 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -393,7 +393,7 @@ void window_track_place_open() show_gridlines(); _window_track_place_last_cost = MONEY32_UNDEFINED; _window_track_place_last_x = 0xFFFF; - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = (-get_current_rotation() + 2) & 3; + RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = (2 - get_current_rotation()) & 3; window_track_place_draw_mini_preview(); } From 599c259603c87f2c8c000f1c1b7ce2c9a70ff16b Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Thu, 5 Nov 2015 19:42:23 +0000 Subject: [PATCH 0975/1173] Fix #1749. Rainbow road graphical glitch. Issue was caused by the image using an invalid colour entry. This initilises the memory that is expected to return white. Platform update palette also had to be modified to allow this fix to work. --- src/platform/shared.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/platform/shared.c b/src/platform/shared.c index 98064406f2..9c34a7eb6b 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -356,8 +356,9 @@ void platform_update_palette(const uint8* colours, int start_index, int num_colo { SDL_Surface *surface; int i; + colours += start_index * 4; - for (i = 0; i < 256; i++) { + for (i = start_index; i < num_colours + start_index; i++) { gPalette[i].r = colours[2]; gPalette[i].g = colours[1]; gPalette[i].b = colours[0]; @@ -651,6 +652,14 @@ void platform_init() platform_create_window(); gKeysPressed = malloc(sizeof(unsigned char) * 256); memset(gKeysPressed, 0, sizeof(unsigned char) * 256); + + // Set the highest palette entry to white. + // This fixes a bug with the TT:rainbow road due to the + // image not using the correct white palette entry. + gPalette[255].a = 0; + gPalette[255].r = 255; + gPalette[255].g = 255; + gPalette[255].b = 255; } static void platform_create_window() From 6684804e286960d25d37919e156be26653477127 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Thu, 5 Nov 2015 21:22:08 +0000 Subject: [PATCH 0976/1173] Fix small regression that caused a black screen when switching between hardware rendering --- src/platform/shared.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/platform/shared.c b/src/platform/shared.c index 9c34a7eb6b..71bbc88033 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -909,6 +909,10 @@ void platform_refresh_video() SDL_QueryTexture(gBufferTexture, &format, 0, 0, 0); gBufferTextureFormat = SDL_AllocFormat(format); platform_refresh_screenbuffer(width, height, width); + // Load the current palette into the HWmapped version. + for (int i = 0; i < 256; ++i) { + gPaletteHWMapped[i] = SDL_MapRGB(gBufferTextureFormat, gPalette[i].r, gPalette[i].g, gPalette[i].b); + } } else { if (_surface != NULL) SDL_FreeSurface(_surface); From 70ef8d6777b0ad4d0527df018d96f76d9e9a8d7d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 5 Nov 2015 21:36:24 +0000 Subject: [PATCH 0977/1173] add unicode support for windows command line arguments and resolve relative paths to absolute --- src/platform/linux.c | 5 +- src/platform/windows.c | 130 +++++++++++++---------------------------- 2 files changed, 42 insertions(+), 93 deletions(-) diff --git a/src/platform/linux.c b/src/platform/linux.c index beea676cdf..5117966ece 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -564,8 +564,10 @@ wchar_t *regular_to_wchar(const char* src) */ void platform_resolve_user_data_path() { + const char separator[2] = { platform_get_path_separator(), 0 }; + if (gCustomUserDataPath[0] != 0) { - safe_strncpy(_userDataDirectoryPath, gCustomUserDataPath, sizeof(_userDataDirectoryPath)); + realpath(gCustomUserDataPath, _userDataDirectoryPath); // Ensure path ends with separator int len = strlen(_userDataDirectoryPath); @@ -575,7 +577,6 @@ void platform_resolve_user_data_path() return; } - const char separator[2] = { platform_get_path_separator(), 0 }; char buffer[MAX_PATH]; buffer[0] = '\0'; log_verbose("buffer = '%s'", buffer); diff --git a/src/platform/windows.c b/src/platform/windows.c index 6e60ebed66..17f96bb738 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -39,7 +39,7 @@ utf8 _userDataDirectoryPath[MAX_PATH] = { 0 }; -LPSTR *CommandLineToArgvA(LPSTR lpCmdLine, int *argc); +utf8 **windows_get_command_line_args(int *outNumArgs); /** * Windows entry point to OpenRCT2 without a console window. @@ -77,18 +77,43 @@ __declspec(dllexport) int StartOpenRCT(HINSTANCE hInstance, HINSTANCE hPrevInsta RCT2_GLOBAL(RCT2_ADDRESS_HINSTANCE, HINSTANCE) = hInstance; RCT2_GLOBAL(RCT2_ADDRESS_CMDLINE, LPSTR) = lpCmdLine; - // Get command line arguments in standard form - argv = CommandLineToArgvA(lpCmdLine, &argc); + // argv = CommandLineToArgvA(lpCmdLine, &argc); + argv = (char**)windows_get_command_line_args(&argc); runGame = cmdline_run((const char **)argv, argc); - GlobalFree(argv); - if (runGame) + // Free argv + for (int i = 0; i < argc; i++) { + free(argv[i]); + } + free(argv); + + if (runGame) { openrct2_launch(); + } exit(gExitCode); return gExitCode; } +utf8 **windows_get_command_line_args(int *outNumArgs) +{ + int argc; + + // Get command line arguments as widechar + LPWSTR commandLine = GetCommandLineW(); + LPWSTR *argvW = CommandLineToArgvW(commandLine, &argc); + + // Convert to UTF-8 + utf8 **argvUtf8 = (utf8**)malloc(argc * sizeof(utf8*)); + for (int i = 0; i < argc; i++) { + argvUtf8[i] = widechar_to_utf8(argvW[i]); + } + LocalFree(argvW); + + *outNumArgs = argc; + return argvUtf8; +} + void platform_get_date(rct2_date *out_date) { assert(out_date != NULL); @@ -393,7 +418,15 @@ void platform_resolve_user_data_path() const char separator[2] = { platform_get_path_separator(), 0 }; if (gCustomUserDataPath[0] != 0) { - safe_strncpy(_userDataDirectoryPath, gCustomUserDataPath, sizeof(_userDataDirectoryPath)); + wchar_t *customUserDataPathW = utf8_to_widechar(gCustomUserDataPath); + if (GetFullPathNameW(customUserDataPathW, countof(wOutPath), wOutPath, NULL) == 0) { + log_fatal("Unable to resolve path '%s'.", gCustomUserDataPath); + exit(-1); + } + utf8 *outPathTemp = widechar_to_utf8(wOutPath); + safe_strncpy(_userDataDirectoryPath, outPathTemp, sizeof(_userDataDirectoryPath)); + free(outPathTemp); + free(customUserDataPathW); // Ensure path ends with separator int len = strlen(_userDataDirectoryPath); @@ -630,91 +663,6 @@ HWND windows_get_window_handle() return result; } -/** - * http://alter.org.ua/en/docs/win/args/ - */ -PCHAR *CommandLineToArgvA(PCHAR CmdLine, int *_argc) -{ - PCHAR* argv; - PCHAR _argv; - ULONG len; - ULONG argc; - CHAR a; - ULONG i, j; - - BOOLEAN in_QM; - BOOLEAN in_TEXT; - BOOLEAN in_SPACE; - - len = strlen(CmdLine); - i = ((len + 2) / 2)*sizeof(PVOID) + sizeof(PVOID); - - argv = (PCHAR*)GlobalAlloc(GMEM_FIXED, - i + (len + 2)*sizeof(CHAR) + 1); - - _argv = (PCHAR)(((PUCHAR)argv) + i); - - // Add in virtual 1st command line argument, process path, for arg_parse's sake. - argv[0] = 0; - argc = 1; - argv[argc] = _argv; - in_QM = FALSE; - in_TEXT = FALSE; - in_SPACE = TRUE; - i = 0; - j = 0; - - while (a = CmdLine[i]) { - if (in_QM) { - if (a == '\"') { - in_QM = FALSE; - } else { - _argv[j] = a; - j++; - } - } else { - switch (a) { - case '\"': - in_QM = TRUE; - in_TEXT = TRUE; - if (in_SPACE) { - argv[argc] = _argv + j; - argc++; - } - in_SPACE = FALSE; - break; - case ' ': - case '\t': - case '\n': - case '\r': - if (in_TEXT) { - _argv[j] = '\0'; - j++; - } - in_TEXT = FALSE; - in_SPACE = TRUE; - break; - default: - in_TEXT = TRUE; - if (in_SPACE) { - argv[argc] = _argv + j; - argc++; - } - _argv[j] = a; - j++; - in_SPACE = FALSE; - break; - } - } - i++; - } - _argv[j] = '\0'; - argv[argc] = NULL; - - (*_argc) = argc; - return argv; -} - uint16 platform_get_locale_language() { CHAR langCode[4]; From 2d62c356c3bbc88019b13ef12f8577d0189dfaf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Wed, 4 Nov 2015 18:11:10 +0100 Subject: [PATCH 0978/1173] Early out and report error if langauge files are missing This is a common problem if you don't set up your paths properly on Linux, so be nice and try to provide helpful message why we failed to load instead of crashing on user a moment later. --- data/language/english_uk.txt | 1 + src/localisation/string_ids.h | 1 + src/openrct2.c | 6 +++++- src/windows/options.c | 26 +++++++++++++++++++++----- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index c577655013..2602d64900 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3899,6 +3899,7 @@ STR_5557 :Stay connected after desynchronisation (Multiplayer) STR_5558 :A restart is required for this setting to take effect STR_5559 :10 min. inspections STR_5560 :{SMALLFONT}{BLACK}Sets the inspection time to 'Every 10 minutes' on all rides +STR_5561 :Failed to load language file ##################### diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 168aa09046..3e8cc5070d 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2146,6 +2146,7 @@ enum { STR_STAY_CONNECTED_AFTER_DESYNC = 5557, STR_RESTART_REQUIRED = 5558, + STR_LANGUAGE_LOAD_FAILED = 5561, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working diff --git a/src/openrct2.c b/src/openrct2.c index b1ccd332f2..64e4e71579 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -225,7 +225,11 @@ bool openrct2_initialise() audio_init(); audio_get_devices(); } - language_open(gConfigGeneral.language); + if (!language_open(gConfigGeneral.language)) + { + log_fatal("Failed to open language, exiting."); + return false; + } http_init(); themes_set_default(); diff --git a/src/windows/options.c b/src/windows/options.c index ed8230929c..98c76ca241 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -1010,11 +1010,27 @@ static void window_options_dropdown(rct_window *w, int widgetIndex, int dropdown } break; case WIDX_LANGUAGE_DROPDOWN: - if (dropdownIndex != gCurrentLanguage - 1) { - language_open(dropdownIndex + 1); - gConfigGeneral.language = dropdownIndex + 1; - config_save_default(); - gfx_invalidate_screen(); + { + int fallbackLanguage = gCurrentLanguage; + if (dropdownIndex != gCurrentLanguage - 1) { + if (!language_open(dropdownIndex + 1)) + { + // Failed to open language file, try to recover by falling + // back to previously used language + if (language_open(fallbackLanguage)) + { + // It worked, so we can say it with error message in-game + window_error_open(STR_LANGUAGE_LOAD_FAILED, STR_NONE); + } + // report error to console regardless + log_error("Failed to open language file."); + dropdownIndex = fallbackLanguage - 1; + } else { + gConfigGeneral.language = dropdownIndex + 1; + config_save_default(); + gfx_invalidate_screen(); + } + } } break; case WIDX_DATE_FORMAT_DROPDOWN: From 13e2f8e9ede58f308a1e5f9ffe0da6780c2e12c0 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 6 Nov 2015 18:02:27 +0000 Subject: [PATCH 0979/1173] Fix #2210. Reverts from a0909a2 that cause the up button to load the same directory --- src/windows/loadsave.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 78bbcc91fc..c3594396da 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -642,7 +642,8 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co if (!topLevel){ listItem = &_listItems[_listItemsCount]; safe_strncpy(listItem->name, language_get_string(2718), sizeof(listItem->name)); - safe_strncpy(listItem->path, directory, sizeof(listItem->path)); + memset(listItem->path, '\0', sizeof(listItem->path)); + strncpy(listItem->path, directory, lastSlash + 1); listItem->type = TYPE_UP; _listItemsCount++; } else if (platform_get_drives() != 0 && directory[0] != '\0'){ From daf95940ac4440c9dde0f047073d8ed6a458679a Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 6 Nov 2015 18:46:18 +0000 Subject: [PATCH 0980/1173] add warning message for two unstable cheats --- data/language/english_uk.txt | 3 ++- src/localisation/string_ids.h | 2 ++ src/windows/cheats.c | 7 +++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index b4a6590a51..650bbed9ba 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3900,7 +3900,8 @@ STR_5558 :A restart is required for this setting to take effect STR_5559 :10 min. inspections STR_5560 :{SMALLFONT}{BLACK}Sets the inspection time to 'Every 10 minutes' on all rides STR_5561 :Failed to load language file - +STR_5562 :WARNING! +STR_5563 :This feature is currently unstable, take extra caution. ##################### # Rides/attractions # diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 3e8cc5070d..f928c3591a 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2148,6 +2148,8 @@ enum { STR_RESTART_REQUIRED = 5558, STR_LANGUAGE_LOAD_FAILED = 5561, + STR_WARNING_IN_CAPS = 5562, + STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE = 5563, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 161c607d16..e905ac7577 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -36,6 +36,7 @@ #include "../world/scenery.h" #include "../interface/themes.h" #include "../cheats.h" +#include "error.h" #define CHEATS_MONEY_INCREMENT MONEY(5000,00) #define CHEATS_TRAM_INCREMENT 250 @@ -1030,9 +1031,15 @@ static void window_cheats_rides_mouseup(rct_window *w, int widgetIndex) break; case WIDX_SHOW_ALL_OPERATING_MODES: gCheatsShowAllOperatingModes = !gCheatsShowAllOperatingModes; + if (gCheatsShowAllOperatingModes) { + window_error_open(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE); + } break; case WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES: gCheatsShowVehiclesFromOtherTrackTypes = !gCheatsShowVehiclesFromOtherTrackTypes; + if (gCheatsShowVehiclesFromOtherTrackTypes) { + window_error_open(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE); + } break; } } From 31ab7c8b98df38e201e277bf6e407442ba01b8b1 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 6 Nov 2015 18:50:37 +0000 Subject: [PATCH 0981/1173] fix several warnings --- src/interface/viewport.c | 6 +++--- src/interface/viewport.h | 2 +- src/util/sawyercoding.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 8ca614981f..2460b4f9b1 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -337,7 +337,7 @@ void sub_6E7FF3(rct_window *window, rct_viewport *viewport, int x, int y) viewport->x >= window->x + window->width || viewport->y + viewport->height <= window->y || viewport->y >= window->y + window->height) - return sub_6E7FF3(window + 1, viewport, x, y); + sub_6E7FF3(window + 1, viewport, x, y); // save viewport rct_viewport view_copy; @@ -2908,7 +2908,7 @@ void screen_get_map_xy_side_with_z(sint16 screenX, sint16 screenY, sint16 z, sin * * @returns rotation in range 0-3 (inclusive) */ -uint32 get_current_rotation() +uint8 get_current_rotation() { uint32 rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); uint32 rotation_masked = rotation & 3; @@ -2917,5 +2917,5 @@ uint32 get_current_rotation() log_error("Found wrong rotation %d! Will return %d instead.", rotation, rotation_masked); } #endif // DEBUG_LEVEL_1 - return rotation_masked; + return (uint8)rotation_masked; } diff --git a/src/interface/viewport.h b/src/interface/viewport.h index af722d3885..d475b00481 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -144,6 +144,6 @@ void screen_get_map_xy_quadrant_with_z(sint16 screenX, sint16 screenY, sint16 z, void screen_get_map_xy_side(sint16 screenX, sint16 screenY, sint16 *mapX, sint16 *mapY, uint8 *side); void screen_get_map_xy_side_with_z(sint16 screenX, sint16 screenY, sint16 z, sint16 *mapX, sint16 *mapY, uint8 *side); -uint32 get_current_rotation(); +uint8 get_current_rotation(); #endif diff --git a/src/util/sawyercoding.c b/src/util/sawyercoding.c index 90abde0744..d73bda1fda 100644 --- a/src/util/sawyercoding.c +++ b/src/util/sawyercoding.c @@ -408,7 +408,7 @@ static size_t encode_chunk_repeat(const uint8 *src_buffer, uint8 *dst_buffer, si *dst_buffer++ = src_buffer[0]; outLength += 2; - // Itereate through remainder of the source buffer + // Iterate through remainder of the source buffer for (i = 1; i < length; ) { searchIndex = max(0, i - 32); searchEnd = i - 1; @@ -440,7 +440,7 @@ static size_t encode_chunk_repeat(const uint8 *src_buffer, uint8 *dst_buffer, si outLength += 2; i++; } else { - *dst_buffer++ = (bestRepeatCount - 1) | ((32 - (i - bestRepeatIndex)) << 3); + *dst_buffer++ = (uint8)((bestRepeatCount - 1) | ((32 - (i - bestRepeatIndex)) << 3)); outLength++; i += bestRepeatCount; } From 6493c83efc395c5c5f4fec03ced3c261aad1c65c Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 6 Nov 2015 19:13:29 +0000 Subject: [PATCH 0982/1173] Fix regression in last commit --- src/interface/viewport.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 2460b4f9b1..34a7aa41a0 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -336,8 +336,10 @@ void sub_6E7FF3(rct_window *window, rct_viewport *viewport, int x, int y) viewport->x + viewport->width <= window->x || viewport->x >= window->x + window->width || viewport->y + viewport->height <= window->y || - viewport->y >= window->y + window->height) + viewport->y >= window->y + window->height){ sub_6E7FF3(window + 1, viewport, x, y); + return; + } // save viewport rct_viewport view_copy; From 1d828591dca3145d95f0dcafb197f8ebd77d36e3 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 6 Nov 2015 19:40:39 +0000 Subject: [PATCH 0983/1173] Fix post build event to work with CommandLineToArgvW --- projects/openrct2.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 8a16578e6f..8f816b7700 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -378,7 +378,7 @@ winmm.lib;sdl2.lib;%(AdditionalDependencies) - "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\..\Data\g2.dat" "$(SolutionDir)\..\Resources\g2\" + "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\\..\\Data\\g2.dat" "$(SolutionDir)\\..\\Resources\\g2\\" xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" Build g2.dat and copy the Data directory. From 4df3d745a44b5ec47b2532a2a3128e90fad46e1e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 7 Nov 2015 01:45:17 +0000 Subject: [PATCH 0984/1173] fix g2 msbuild call --- projects/openrct2.vcxproj | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 8f816b7700..d575657eec 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -378,8 +378,8 @@ winmm.lib;sdl2.lib;%(AdditionalDependencies) - "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\\..\\Data\\g2.dat" "$(SolutionDir)\\..\\Resources\\g2\\" -xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" + "$(TargetDir)openrct2.exe" sprite build "$(SolutionDir)..\Data\g2.dat" "$(SolutionDir)..\Resources\g2" +xcopy /YS "$(SolutionDir)..\Data" "$(TargetDir)Data" Build g2.dat and copy the Data directory. @@ -410,8 +410,8 @@ xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" /ignore:4099 %(AdditionalOptions) - "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\..\Data\g2.dat" "$(SolutionDir)\..\Resources\g2\" -xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" + "$(TargetDir)openrct2.exe" sprite build "$(SolutionDir)..\Data\g2.dat" "$(SolutionDir)..\Resources\g2" +xcopy /YS "$(SolutionDir)..\Data" "$(TargetDir)Data" Build g2.dat and copy the Data directory. @@ -451,8 +451,8 @@ xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" Windows - "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\..\Data\g2.dat" "$(SolutionDir)\..\Resources\g2\" -xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" + "$(TargetDir)openrct2.exe" sprite build "$(SolutionDir)..\Data\g2.dat" "$(SolutionDir)..\Resources\g2" +xcopy /YS "$(SolutionDir)..\Data" "$(TargetDir)Data" Build g2.dat and copy the Data directory. @@ -490,8 +490,8 @@ xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" /ignore:4099 %(AdditionalOptions) - "$(TargetDir)\openrct2.exe" sprite build "$(SolutionDir)\..\Data\g2.dat" "$(SolutionDir)\..\Resources\g2\" -xcopy /YS "$(SolutionDir)\..\Data" "$(TargetDir)\Data" + "$(TargetDir)openrct2.exe" sprite build "$(SolutionDir)..\Data\g2.dat" "$(SolutionDir)..\Resources\g2" +xcopy /YS "$(SolutionDir)..\Data" "$(TargetDir)Data" Build g2.dat and copy the Data directory. From 10674fe439cb027c43ef418a6cbf9f2ab6c7c645 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 7 Nov 2015 04:00:18 +0000 Subject: [PATCH 0985/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/german.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/data/language/german.txt b/data/language/german.txt index 76187b1b18..f454e341e9 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -2710,7 +2710,7 @@ STR_2703 :Alle 15 Minuten STR_2704 :Alle 30 Minuten STR_2705 :Jede Stunde STR_2706 :Nie -STR_2707 :Neues Fenster +STR_2707 :Systemdialogfeld verwenden STR_2708 :{WINDOW_COLOUR_1}Sind Sie sicher, dass Sie {STRINGID} überschreiben möchten? STR_2709 :Überschreiben STR_2710 :Geben Sie den Dateinamen ein: @@ -3894,6 +3894,9 @@ STR_5557 :Nach Desync. verbunden bleiben (Mehrspieler) STR_5558 :Damit diese Einstellung wirksam wird, ist ein Neustart erforderlich STR_5559 :10 Min. Inspektionen STR_5560 :{SMALLFONT}{BLACK}Setzt die Inspektionszeit aller Bahnen{NEWLINE}auf 'Alle 10 Minuten' +STR_5561 :Sprachdatei konnte nicht geladen werden +STR_5562 :WARNUNG! +STR_5563 :Diese Funktion ist derzeit instabil und mit erhöhter Vorsicht zu verwenden. ####################### # Bahnen/Attraktionen # From 983436d4256a2310e24d57f2cda3a031096b4356 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 7 Nov 2015 10:04:57 +0000 Subject: [PATCH 0986/1173] Implemented a insert corrupt element button on the tile inspector --- data/language/english_uk.txt | 2 ++ src/localisation/string_ids.h | 3 +++ src/windows/guest.c | 2 +- src/windows/tile_inspector.c | 23 +++++++++++++++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 650bbed9ba..9dea1d3bdf 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3902,6 +3902,8 @@ STR_5560 :{SMALLFONT}{BLACK}Sets the inspection time to 'Every 10 minutes' on STR_5561 :Failed to load language file STR_5562 :WARNING! STR_5563 :This feature is currently unstable, take extra caution. +STR_5564 :Insert Corrupt Element +STR_5565 :{SMALLFONT}{BLACK}Inserts a corrupt map element at top of tile. This will hide any element above the corrupt element. ##################### # Rides/attractions # diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index f928c3591a..42619e6b09 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2151,6 +2151,9 @@ enum { STR_WARNING_IN_CAPS = 5562, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE = 5563, + STR_INSERT_CORRUPT = 5564, + STR_INSERT_CORRUPT_TIP = 5565, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/guest.c b/src/windows/guest.c index f0e18f6739..5a28c7e974 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -1184,7 +1184,7 @@ void window_guest_overview_tool_down(rct_window* w, int widgetIndex, int x, int window_error_open(0x785,-1); return; } - + if (!map_can_construct_at(tile_x, tile_y, dest_z / 8, (dest_z / 8) + 1, 15)){ if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) != 0x3A5 ){ if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) != 0x49B){ diff --git a/src/windows/tile_inspector.c b/src/windows/tile_inspector.c index 72a8b71993..354188e13b 100644 --- a/src/windows/tile_inspector.c +++ b/src/windows/tile_inspector.c @@ -31,6 +31,7 @@ enum WINDOW_TILE_INSPECTOR_WIDGET_IDX { WIDX_BACKGROUND, WIDX_TITLE, WIDX_CLOSE, + WIDX_CORRUPT, WIDX_CONTENT_PANEL, WIDX_SCROLL }; @@ -44,6 +45,7 @@ rct_widget window_tile_inspector_widgets[] = { { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, 0x0FFFFFFFF, STR_NONE }, // panel / background { WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_TILE_INSPECTOR_TITLE, STR_WINDOW_TITLE_TIP }, // title bar { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_CLOSEBOX, 1, WW - 150, WW - 3, 18, 39, STR_INSERT_CORRUPT, STR_INSERT_CORRUPT_TIP }, { WWT_RESIZE, 1, 0, WW - 1, 43, WH - 1, 0x0FFFFFFFF, STR_NONE }, // content panel { WWT_SCROLL, 1, 3, WW - 3, 65, WH - 30, 2, STR_NONE }, // scroll area { WIDGETS_END }, @@ -116,6 +118,7 @@ void window_tile_inspector_open() ); window->widgets = window_tile_inspector_widgets; window->enabled_widgets = (1 << WIDX_CLOSE); + window->disabled_widgets = (1 << WIDX_CORRUPT); window_init_scroll_widgets(window); window->colours[0] = 7; @@ -137,12 +140,29 @@ static void window_tile_inspector_close(rct_window *w) tool_cancel(); } +void corrupt_element(int x, int y) { + rct_map_element* mapElement; + mapElement = map_get_first_element_at(x, y); + + while (!map_element_is_last_for_tile(mapElement++)); + mapElement--; + + mapElement = map_element_insert(x, y, mapElement->base_height, 0); + mapElement->type = (8 << 2); +} + static void window_tile_inspector_mouseup(rct_window *w, int widgetIndex) { switch (widgetIndex) { case WIDX_CLOSE: window_close(w); break; + case WIDX_CORRUPT: + corrupt_element(window_tile_inspector_tile_x, window_tile_inspector_tile_y); + window_tile_inspector_item_count++; + w->scrolls[0].v_top = 0; + window_invalidate(w); + break; } } @@ -209,6 +229,9 @@ static void window_tile_inspector_tool_down(rct_window* w, int widgetIndex, int window_tile_inspector_item_count = numItems; + w->enabled_widgets |= (1 << WIDX_CORRUPT); + w->disabled_widgets &= ~(1ULL << WIDX_CORRUPT); + w->scrolls[0].v_top = 0; window_invalidate(w); } From 8d3655e0f652db7ebb7461081d16dfa06dfbee4f Mon Sep 17 00:00:00 2001 From: Flukiestemperor Date: Sat, 7 Nov 2015 12:22:44 +0000 Subject: [PATCH 0987/1173] fix #2162 --- src/ride/ride.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index bccfdc7615..d5e34f6b84 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1668,8 +1668,8 @@ int ride_modify(rct_xy_element *input) return 0; } - ride_clear_for_construction(rideIndex); - ride_remove_peeps(rideIndex); + // Stop the ride again to clear all vehicles and peeps (compatible with network games) + ride_set_status(rideIndex, RIDE_STATUS_CLOSED); // Check if element is a station entrance or exit if (map_element_get_type(mapElement.element) == MAP_ELEMENT_TYPE_ENTRANCE) From 2d4b30756e07656a15bacc9917971f835a25c33e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 7 Nov 2015 12:50:15 +0000 Subject: [PATCH 0988/1173] add DEBUG preprocessor definition --- projects/openrct2.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index d575657eec..e41e31ab10 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -366,7 +366,7 @@ Disabled true 1Byte - _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;SDL_MAIN_HANDLED;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) + DEBUG;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;SDL_MAIN_HANDLED;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true $(IntDir)fake\%(RelativeDir) From c9808823a24359c4f5013c562659fdace8a7a74a Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sat, 7 Nov 2015 15:48:46 +0100 Subject: [PATCH 0989/1173] Add notice that 'No entrance' only works in OpenRCT2 --- data/language/english_uk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 9dea1d3bdf..59af7466cd 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3826,7 +3826,7 @@ STR_5484 :{BLACK}({COMMA16} week remaining) STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}Show recent messages -STR_5488 :No entrance +STR_5488 :No entrance (OpenRCT2 only!) STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests STR_5490 :Disable audio on focus loss STR_5491 :Inventions list From c7a85c51148c00d577547118fa297ed5f8c0f45f Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 7 Nov 2015 17:56:03 +0000 Subject: [PATCH 0990/1173] add desync debug checks for scenario_rand --- projects/openrct2.vcxproj | 2 +- src/game.c | 8 ++++++++ src/game.h | 1 + src/scenario.c | 7 +++++++ src/world/climate.c | 11 ++++++----- 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index e41e31ab10..05dae3caf6 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -366,7 +366,7 @@ Disabled true 1Byte - DEBUG;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;SDL_MAIN_HANDLED;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) + DEBUG;DEBUG_DESYNC;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;SDL_MAIN_HANDLED;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true $(IntDir)fake\%(RelativeDir) diff --git a/src/game.c b/src/game.c index 1312661de4..c15739fe7e 100644 --- a/src/game.c +++ b/src/game.c @@ -60,6 +60,7 @@ int gGameSpeed = 1; float gDayNightCycle = 0; +bool gInUpdateCode = false; GAME_COMMAND_CALLBACK_POINTER* game_command_callback = 0; GAME_COMMAND_CALLBACK_POINTER* game_command_callback_table[] = { @@ -335,6 +336,9 @@ void game_update() void game_logic_update() { + /////////////////////////// + gInUpdateCode = true; + /////////////////////////// network_update(); if (network_get_mode() == NETWORK_MODE_CLIENT && network_get_status() == NETWORK_STATUS_CONNECTED) { if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) >= network_get_server_tick()) { @@ -361,6 +365,10 @@ void game_logic_update() research_update(); ride_ratings_update_all(); ride_measurements_update(); + /////////////////////////// + gInUpdateCode = false; + /////////////////////////// + map_animation_invalidate_all(); vehicle_sounds_update(); peep_update_crowd_noise(); diff --git a/src/game.h b/src/game.h index 286c21fb1f..f2ef77a7e0 100644 --- a/src/game.h +++ b/src/game.h @@ -114,6 +114,7 @@ GAME_COMMAND_CALLBACK_POINTER* game_command_callback_get_callback(int index); extern int gGameSpeed; extern float gDayNightCycle; +extern bool gInUpdateCode; void game_increase_game_speed(); void game_reduce_game_speed(); diff --git a/src/scenario.c b/src/scenario.c index 597c0d452e..18124dfaa8 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -715,6 +715,13 @@ static int scenario_create_ducks() */ unsigned int scenario_rand() { +#if DEBUG_DESYNC + if (!gInUpdateCode) { + log_warning("scenario_rand called from outside game update"); + assert(false); + } +#endif + int eax = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32); RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32) += ror32(RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_1, uint32) ^ 0x1234567F, 7); return RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_1, uint32) = ror32(eax, 3); diff --git a/src/world/climate.c b/src/world/climate.c index eeae821230..5692acb13b 100644 --- a/src/world/climate.c +++ b/src/world/climate.c @@ -23,6 +23,7 @@ #include "../audio/mixer.h" #include "../config.h" #include "../drawing/drawing.h" +#include "../game.h" #include "../localisation/date.h" #include "../scenario.h" #include "../interface/window.h" @@ -69,7 +70,7 @@ static unsigned int _thunderSoundId; static int _thunderVolume; static int _thunderStereoEcho = 0; -static void climate_determine_future_weather(); +static void climate_determine_future_weather(int randomDistribution); static void climate_update_rain_sound(); static void climate_update_thunder_sound(); @@ -114,7 +115,7 @@ void climate_reset(int climate) _rainVolume = 1; } - climate_determine_future_weather(); + climate_determine_future_weather(rand()); } sint8 step_weather_level(sint8 cur_weather_level, sint8 next_weather_level) { @@ -171,7 +172,7 @@ void climate_update() if (cur_rain == next_rain) { RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER, sint8) = gClimateNextWeather; - climate_determine_future_weather(); + climate_determine_future_weather(scenario_rand()); RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint32) |= BTM_TB_DIRTY_FLAG_CLIMATE; } else if (next_rain <= 2) { // Safe-guard RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, sint8) = step_weather_level(cur_rain, next_rain); @@ -209,7 +210,7 @@ void climate_force_weather(uint8 weather){ * * rct2: 0x006C461C */ -static void climate_determine_future_weather() +static void climate_determine_future_weather(int randomDistribution) { sint8 climate = RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, sint8); const rct_weather_transition* climate_table = climate_transitions[climate]; @@ -217,7 +218,7 @@ static void climate_determine_future_weather() rct_weather_transition transition = climate_table[month]; // Generate a random variable with values 0 upto distribution_size-1 and chose weather from the distribution table accordingly - sint8 next_weather = transition.distribution[ ((scenario_rand() & 0xFF) * transition.distribution_size) >> 8 ]; + sint8 next_weather = transition.distribution[ ((randomDistribution & 0xFF) * transition.distribution_size) >> 8 ]; gClimateNextWeather = next_weather; _climateNextTemperature = transition.base_temperature + climate_weather_data[next_weather].temp_delta; From d66eb70f56bc7db5155921a2394ce3e4f77a3130 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sun, 1 Nov 2015 14:28:01 -0700 Subject: [PATCH 0991/1173] fix potential overflow --- src/network/network.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index faf75bc010..6896ad320e 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -1182,7 +1182,7 @@ int Network::Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket int Network::Client_Handle_SETDISCONNECTMSG(NetworkConnection& connection, NetworkPacket& packet) { - static char msg[256] = {0}; + static char msg[100] = {0}; const char* disconnectmsg = packet.ReadString(); if (disconnectmsg) { safe_strncpy(msg, disconnectmsg, sizeof(msg)); From 3b639ced4765be7a954e64c4bfb9ae560c95ad0f Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sun, 1 Nov 2015 17:28:53 -0700 Subject: [PATCH 0992/1173] allow host to specify password #2072 --- data/language/english_uk.txt | 2 + projects/openrct2.vcxproj | 1 + projects/openrct2.vcxproj.filters | 3 + src/config.c | 3 +- src/config.h | 1 + src/interface/window.h | 2 + src/localisation/string_ids.h | 3 + src/network/network.cpp | 98 +++++++++++---- src/network/network.h | 7 ++ src/windows/server_list.c | 2 +- src/windows/server_start.c | 190 ++++++++++++++++++++++++++++++ 11 files changed, 285 insertions(+), 27 deletions(-) create mode 100644 src/windows/server_start.c diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 59af7466cd..27d2ee1cbe 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3904,6 +3904,8 @@ STR_5562 :WARNING! STR_5563 :This feature is currently unstable, take extra caution. STR_5564 :Insert Corrupt Element STR_5565 :{SMALLFONT}{BLACK}Inserts a corrupt map element at top of tile. This will hide any element above the corrupt element. +STR_5566 :Password: +STR_5567 :Advertise ##################### # Rides/attractions # diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 05dae3caf6..74c3166567 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -103,6 +103,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index c08b462c63..734c2e6363 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -546,6 +546,9 @@ Source\Platform + + Source\Windows + diff --git a/src/config.c b/src/config.c index a2d5d74d1a..5dc77248c8 100644 --- a/src/config.c +++ b/src/config.c @@ -239,7 +239,8 @@ config_property_definition _twitchDefinitions[] = { config_property_definition _networkDefinitions[] = { { offsetof(network_configuration, player_name), "player_name", CONFIG_VALUE_TYPE_STRING, {.value_string = "Player" }, NULL }, { offsetof(network_configuration, default_port), "default_port", CONFIG_VALUE_TYPE_UINT32, NETWORK_DEFAULT_PORT, NULL }, - { offsetof(network_configuration, stay_connected), "stay_connected", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(network_configuration, stay_connected), "stay_connected", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, + { offsetof(network_configuration, advertise), "advertise", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, }; config_section_definition _sectionDefinitions[] = { diff --git a/src/config.h b/src/config.h index b41965c4d7..e91bbc28a5 100644 --- a/src/config.h +++ b/src/config.h @@ -214,6 +214,7 @@ typedef struct { utf8string player_name; uint32 default_port; uint8 stay_connected; + uint8 advertise; } network_configuration; typedef struct theme_window { diff --git a/src/interface/window.h b/src/interface/window.h index e37b9244c6..7714153a70 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -450,6 +450,7 @@ enum { WC_PLAYER_LIST = 125, WC_NETWORK_STATUS = 126, WC_SERVER_LIST = 127, + WC_SERVER_START = 128, // Only used for colour schemes WC_STAFF = 220, @@ -629,6 +630,7 @@ void window_player_list_open(); void window_network_status_open(const char* text); void window_network_status_close(); void window_server_list_open(); +void window_server_start_open(); void window_research_open(); void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dpi, int baseWidgetIndex); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 42619e6b09..45483c0bc3 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2154,6 +2154,9 @@ enum { STR_INSERT_CORRUPT = 5564, STR_INSERT_CORRUPT_TIP = 5565, + STR_PASSWORD = 5566, + STR_ADVERTISE = 5567, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/network/network.cpp b/src/network/network.cpp index 6896ad320e..74f5994690 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -67,7 +67,8 @@ enum { NETWORK_COMMAND_PING, NETWORK_COMMAND_PINGLIST, NETWORK_COMMAND_SETDISCONNECTMSG, - NETWORK_COMMAND_MAX + NETWORK_COMMAND_MAX, + NETWORK_COMMAND_INVALID = -1 }; const char *NetworkCommandNames[] = { @@ -104,6 +105,15 @@ uint8* NetworkPacket::GetData() return &(*data)[0]; } +uint32 NetworkPacket::GetCommand() +{ + if (data->size() >= sizeof(uint32)) { + return ByteSwapBE(*(uint32*)(&(*data)[0])); + } else { + return NETWORK_COMMAND_INVALID; + } +} + void NetworkPacket::Write(uint8* bytes, unsigned int size) { data->insert(data->end(), bytes, bytes + size); @@ -147,6 +157,18 @@ void NetworkPacket::Clear() data->clear(); } +bool NetworkPacket::CommandRequiresAuth() +{ + switch (GetCommand()) { + case NETWORK_COMMAND_PING: + return false; + case NETWORK_COMMAND_AUTH: + return false; + default: + return true; + } +} + NetworkPlayer::NetworkPlayer(const char* name) { safe_strncpy((char*)NetworkPlayer::name, name, sizeof(NetworkPlayer::name)); @@ -234,7 +256,7 @@ bool NetworkConnection::SendPacket(NetworkPacket& packet) void NetworkConnection::QueuePacket(std::unique_ptr packet) { - if (authstatus == NETWORK_AUTH_OK || authstatus == NETWORK_AUTH_REQUESTED) { + if (authstatus == NETWORK_AUTH_OK || !packet->CommandRequiresAuth()) { packet->size = (uint16)packet->data->size(); outboundpackets.push_back(std::move(packet)); } @@ -573,7 +595,7 @@ void Network::UpdateClient() bool connectfailed = false; switch(status){ case NETWORK_STATUS_RESOLVING:{ - if(server_address.GetResolveStatus() == NetworkAddress::RESOLVE_OK){ + if (server_address.GetResolveStatus() == NetworkAddress::RESOLVE_OK) { server_connection.socket = socket(server_address.ss->ss_family, SOCK_STREAM, IPPROTO_TCP); if (server_connection.socket == INVALID_SOCKET) { log_error("Unable to create socket."); @@ -606,8 +628,7 @@ void Network::UpdateClient() int error = 0; socklen_t len = sizeof(error); int result = getsockopt(server_connection.socket, SOL_SOCKET, SO_ERROR, (char*)&error, &len); - if (result != 0) - { + if (result != 0) { log_error("getsockopt failed with error %d", LAST_SOCKET_ERROR()); break; } @@ -631,8 +652,7 @@ void Network::UpdateClient() error = 0; socklen_t len = sizeof(error); result = getsockopt(server_connection.socket, SOL_SOCKET, SO_ERROR, (char*)&error, &len); - if (result != 0) - { + if (result != 0) { log_error("getsockopt failed with error %d", LAST_SOCKET_ERROR()); break; } @@ -728,6 +748,26 @@ bool Network::CheckSRAND(uint32 tick, uint32 srand0) return true; } +void Network::KickPlayer(int playerId) +{ + NetworkPlayer *player = GetPlayerByID(playerId); + for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { + if ((*it)->player->id == playerId) { + // Disconnect the client gracefully + (*it)->last_disconnect_reason = "Kicked"; + Server_Send_SETDISCONNECTMSG(*(*it), "Get out of the server!"); + shutdown((*it)->socket, SHUT_RD); + (*it)->SendQueuedPackets(); + break; + } + } +} + +void Network::SetPassword(const char* password) +{ + safe_strncpy(Network::password, password, sizeof(Network::password)); +} + void Network::Client_Send_AUTH(const char* gameversion, const char* name, const char* password) { std::unique_ptr packet = std::move(NetworkPacket::Allocate()); @@ -846,7 +886,6 @@ void Network::Server_Send_SETDISCONNECTMSG(NetworkConnection& connection, const bool Network::ProcessConnection(NetworkConnection& connection) { - connection.SendQueuedPackets(); int packetStatus; do { packetStatus = connection.ReadPacket(); @@ -871,12 +910,11 @@ bool Network::ProcessConnection(NetworkConnection& connection) break; } } while (packetStatus == NETWORK_READPACKET_MORE_DATA || packetStatus == NETWORK_READPACKET_SUCCESS); -#if !DEBUG + connection.SendQueuedPackets(); if (!connection.ReceivedPacketRecently()) { connection.last_disconnect_reason = "No Data"; return false; } -#endif return true; } @@ -991,6 +1029,20 @@ void Network::PrintError() int Network::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacket& packet) { packet >> (uint32&)connection.authstatus >> (uint8&)player_id; + switch(connection.authstatus) { + case NETWORK_AUTH_BADNAME: + connection.last_disconnect_reason = "Bad Player Name"; + shutdown(connection.socket, SHUT_RDWR); + break; + case NETWORK_AUTH_BADVERSION: + connection.last_disconnect_reason = "Incorrect Software Version"; + shutdown(connection.socket, SHUT_RDWR); + break; + case NETWORK_AUTH_BADPASSWORD: + connection.last_disconnect_reason = "Bad Password"; + shutdown(connection.socket, SHUT_RDWR); + break; + } return 1; } @@ -1028,6 +1080,10 @@ int Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& pa std::unique_ptr responsepacket = std::move(NetworkPacket::Allocate()); *responsepacket << (uint32)NETWORK_COMMAND_AUTH << (uint32)connection.authstatus << (uint8)playerid; connection.QueuePacket(std::move(responsepacket)); + if (connection.authstatus != NETWORK_AUTH_OK) { + shutdown(connection.socket, SHUT_RD); + connection.SendQueuedPackets(); + } } return 1; } @@ -1300,25 +1356,16 @@ void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 } } -void Network::KickPlayer(int playerId) -{ - NetworkPlayer *player = GetPlayerByID(playerId); - for(auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { - if ((*it)->player->id == playerId) { - // Disconnect the client gracefully - (*it)->last_disconnect_reason = "Kicked"; - Server_Send_SETDISCONNECTMSG(*(*it), "Get out of the server!"); - shutdown((*it)->socket, SHUT_RD); - break; - } - } -} - void network_kick_player(int playerId) { gNetwork.KickPlayer(playerId); } +void network_set_password(const char* password) +{ + gNetwork.SetPassword(password); +} + #else int network_get_mode() { return NETWORK_MODE_NONE; } int network_get_status() { return NETWORK_STATUS_NONE; } @@ -1335,6 +1382,7 @@ int network_get_player_ping(unsigned int index) { return 0; } int network_get_player_id(unsigned int index) { return 0; } void network_send_chat(const char* text) {} void network_close() {} -void network_kick_player(int playerId) { } +void network_kick_player(int playerId) {} +void network_set_password(const char* password) {} uint8 network_get_current_player_id() { return 0; } #endif /* DISABLE_NETWORK */ diff --git a/src/network/network.h b/src/network/network.h index 2356937cdb..349f80a7a9 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -69,6 +69,9 @@ extern "C" { #ifndef SHUT_RD #define SHUT_RD SD_RECEIVE #endif + #ifndef SHUT_RDWR + #define SHUT_RDWR SD_BOTH + #endif #else #include #include @@ -109,6 +112,7 @@ public: static std::unique_ptr Allocate(); static std::unique_ptr Duplicate(NetworkPacket& packet); uint8* GetData(); + uint32 GetCommand(); template NetworkPacket& operator<<(T value) { T swapped = ByteSwapBE(value); uint8* bytes = (uint8*)&swapped; data->insert(data->end(), bytes, bytes + sizeof(value)); return *this; } void Write(uint8* bytes, unsigned int size); @@ -118,6 +122,7 @@ public: const uint8* Read(unsigned int size); const char* ReadString(); void Clear(); + bool CommandRequiresAuth(); uint16 size; std::shared_ptr> data; @@ -209,6 +214,7 @@ public: void SendPacketToClients(NetworkPacket& packet); bool CheckSRAND(uint32 tick, uint32 srand0); void KickPlayer(int playerId); + void SetPassword(const char* password); void Client_Send_AUTH(const char* gameversion, const char* name, const char* password); void Server_Send_MAP(NetworkConnection* connection = nullptr); @@ -314,6 +320,7 @@ void network_send_chat(const char* text); void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback); void network_kick_player(int playerId); +void network_set_password(const char* password); void network_print_error(); diff --git a/src/windows/server_list.c b/src/windows/server_list.c index fb10c4442d..0db84db62a 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -185,7 +185,7 @@ static void window_server_list_mouseup(rct_window *w, int widgetIndex) break; case WIDX_START_SERVER: server_list_update_player_name(); - window_loadsave_open(LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME | LOADSAVETYPE_NETWORK, NULL); + window_server_start_open(); break; } } diff --git a/src/windows/server_start.c b/src/windows/server_start.c new file mode 100644 index 0000000000..f53909b2e8 --- /dev/null +++ b/src/windows/server_start.c @@ -0,0 +1,190 @@ +/***************************************************************************** +* Copyright (c) 2014 Ted John +* OpenRCT2, an open source clone of Roller Coaster Tycoon 2. +* +* This file is part of OpenRCT2. +* +* OpenRCT2 is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. + +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. + +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*****************************************************************************/ + +#include "../config.h" +#include "../interface/themes.h" +#include "../interface/widget.h" +#include "../interface/window.h" +#include "../localisation/localisation.h" +#include "../network/network.h" +#include "../sprites.h" +#include "../util/util.h" +#include "error.h" + +char _password[33]; + +enum { + WIDX_BACKGROUND, + WIDX_TITLE, + WIDX_CLOSE, + WIDX_PASSWORD_INPUT, + WIDX_ADVERTISE_CHECKBOX, + WIDX_START_SERVER +}; + +#define WW 300 +#define WH 100 + +static rct_widget window_server_start_widgets[] = { + { WWT_FRAME, 0, 0, WW-1, 0, WH-1, 0xFFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, WW-2, 1, 14, STR_START_SERVER, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, WW-13, WW-3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_TEXT_BOX, 1, 150, WW-8, 20, 32, (uint32)_password, STR_NONE }, // password text box + { WWT_CHECKBOX, 1, 6, WW-8, 36, 45, STR_ADVERTISE, STR_NONE }, // advertise checkbox + { WWT_DROPDOWN_BUTTON, 1, 6, 106, WH-6-11, WH-6, STR_START_SERVER, STR_NONE }, // start server button + { WIDGETS_END }, +}; + +static void window_server_start_close(rct_window *w); +static void window_server_start_mouseup(rct_window *w, int widgetIndex); +static void window_server_start_update(rct_window *w); +static void window_server_start_textinput(rct_window *w, int widgetIndex, char *text); +static void window_server_start_invalidate(rct_window *w); +static void window_server_start_paint(rct_window *w, rct_drawpixelinfo *dpi); + +static rct_window_event_list window_server_start_events = { + window_server_start_close, + window_server_start_mouseup, + NULL, + NULL, + NULL, + NULL, + window_server_start_update, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_server_start_textinput, + NULL, + NULL, + NULL, + NULL, + NULL, + window_server_start_invalidate, + window_server_start_paint, + NULL +}; + +void window_server_start_open() +{ + rct_window* window; + + // Check if window is already open + window = window_bring_to_front_by_class(WC_SERVER_START); + if (window != NULL) + return; + + window = window_create_centred(WW, WH, &window_server_start_events, WC_SERVER_START, WF_10); + + window->widgets = window_server_start_widgets; + window->enabled_widgets = ( + (1 << WIDX_CLOSE) | + (1 << WIDX_PASSWORD_INPUT) | + (1 << WIDX_ADVERTISE_CHECKBOX) | + (1 << WIDX_START_SERVER) + ); + window_init_scroll_widgets(window); + window->no_list_items = 0; + window->selected_list_item = -1; + window->frame_no = 0; + window->min_width = window->width; + window->min_height = window->height; + window->max_width = window->min_width; + window->max_height = window->min_height; + + window->page = 0; + window->list_information_type = 0; + window->colours[0] = 1; + window->colours[1] = 26; + window->colours[2] = 26; +} + +static void window_server_start_close(rct_window *w) +{ + +} + +static void window_server_start_mouseup(rct_window *w, int widgetIndex) +{ + switch (widgetIndex) { + case WIDX_CLOSE: + window_close(w); + break; + case WIDX_PASSWORD_INPUT: + window_start_textbox(w, widgetIndex, 1170, (uint32)_password, 32); + break; + case WIDX_ADVERTISE_CHECKBOX: + gConfigNetwork.advertise = !gConfigNetwork.advertise; + config_save_default(); + window_invalidate(w); + break; + case WIDX_START_SERVER: + network_set_password(_password); + window_loadsave_open(LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME | LOADSAVETYPE_NETWORK, NULL); + break; + } +} + +static void window_server_start_update(rct_window *w) +{ + if (gCurrentTextBox.window.classification == w->classification && gCurrentTextBox.window.number == w->number) { + window_update_textbox_caret(); + widget_invalidate(w, WIDX_PASSWORD_INPUT); + } +} + +static void window_server_start_textinput(rct_window *w, int widgetIndex, char *text) +{ + if (text == NULL) return; + + switch (widgetIndex) { + case WIDX_PASSWORD_INPUT: + if (strcmp(_password, text) == 0) + return; + + memset(_password, 0, sizeof(_password)); + if (strlen(text) > 0) { + safe_strncpy(_password, text, sizeof(_password)); + } + + widget_invalidate(w, WIDX_PASSWORD_INPUT); + break; + } +} + +static void window_server_start_invalidate(rct_window *w) +{ + widget_set_checkbox_value(w, WIDX_ADVERTISE_CHECKBOX, gConfigNetwork.advertise); +} + +static void window_server_start_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ + window_draw_widgets(w, dpi); + + gfx_draw_string_left(dpi, STR_PASSWORD, NULL, w->colours[1], w->x + 6, w->y + w->widgets[WIDX_PASSWORD_INPUT].top); +} From 9acfd27735b603a696ecdcd5077a01ea3650564c Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sun, 1 Nov 2015 20:12:14 -0700 Subject: [PATCH 0993/1173] password prompt for client --- data/language/english_uk.txt | 2 ++ src/interface/window.h | 1 + src/localisation/string_ids.h | 2 ++ src/network/network.cpp | 38 ++++++++++++++++++++++++++--------- src/network/network.h | 5 ++++- src/windows/network_status.c | 28 +++++++++++++++++++++++++- 6 files changed, 64 insertions(+), 12 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 27d2ee1cbe..a177274400 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3906,6 +3906,8 @@ STR_5564 :Insert Corrupt Element STR_5565 :{SMALLFONT}{BLACK}Inserts a corrupt map element at top of tile. This will hide any element above the corrupt element. STR_5566 :Password: STR_5567 :Advertise +STR_5568 :Password Required +STR_5569 :This server requires a password ##################### # Rides/attractions # diff --git a/src/interface/window.h b/src/interface/window.h index 7714153a70..429a6ce07f 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -629,6 +629,7 @@ void window_cheats_open(); void window_player_list_open(); void window_network_status_open(const char* text); void window_network_status_close(); +void window_network_status_open_password(); void window_server_list_open(); void window_server_start_open(); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 45483c0bc3..a78cf7c0c3 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2156,6 +2156,8 @@ enum { STR_PASSWORD = 5566, STR_ADVERTISE = 5567, + STR_PASSWORD_REQUIRED = 5568, + STR_PASSWORD_REQUIRED_DESC = 5569, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/network/network.cpp b/src/network/network.cpp index 74f5994690..d887652989 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -779,6 +779,21 @@ void Network::Client_Send_AUTH(const char* gameversion, const char* name, const server_connection.QueuePacket(std::move(packet)); } +void Network::Server_Send_AUTH(NetworkConnection& connection) +{ + uint8 new_playerid = 0; + if (connection.player) { + new_playerid = connection.player->id; + } + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); + *packet << (uint32)NETWORK_COMMAND_AUTH << (uint32)connection.authstatus << (uint8)new_playerid; + connection.QueuePacket(std::move(packet)); + if (connection.authstatus != NETWORK_AUTH_OK && connection.authstatus != NETWORK_AUTH_REQUIREPASSWORD) { + shutdown(connection.socket, SHUT_RD); + connection.SendQueuedPackets(); + } +} + void Network::Server_Send_MAP(NetworkConnection* connection) { int buffersize = 0x600000; @@ -1042,6 +1057,9 @@ int Network::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacket& pa connection.last_disconnect_reason = "Bad Password"; shutdown(connection.socket, SHUT_RDWR); break; + case NETWORK_AUTH_REQUIREPASSWORD: + window_network_status_open_password(); + break; } return 1; } @@ -1052,21 +1070,22 @@ int Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& pa const char* gameversion = packet.ReadString(); const char* name = packet.ReadString(); const char* password = packet.ReadString(); - uint8 playerid = 0; if (!gameversion || strcmp(gameversion, OPENRCT2_VERSION) != 0) { connection.authstatus = NETWORK_AUTH_BADVERSION; } else if (!name) { connection.authstatus = NETWORK_AUTH_BADNAME; } else - if (!password || strcmp(password, Network::password) != 0) { + if (!password || strlen(password) == 0) { + connection.authstatus = NETWORK_AUTH_REQUIREPASSWORD; + } else + if (strcmp(password, Network::password) != 0) { connection.authstatus = NETWORK_AUTH_BADPASSWORD; } else { connection.authstatus = NETWORK_AUTH_OK; NetworkPlayer* player = AddPlayer(name); connection.player = player; if (player) { - playerid = player->id; char text[256]; char* lineCh = text; lineCh = utf8_write_codepoint(lineCh, FORMAT_OUTLINE); @@ -1077,13 +1096,7 @@ int Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& pa Server_Send_MAP(&connection); } } - std::unique_ptr responsepacket = std::move(NetworkPacket::Allocate()); - *responsepacket << (uint32)NETWORK_COMMAND_AUTH << (uint32)connection.authstatus << (uint8)playerid; - connection.QueuePacket(std::move(responsepacket)); - if (connection.authstatus != NETWORK_AUTH_OK) { - shutdown(connection.socket, SHUT_RD); - connection.SendQueuedPackets(); - } + Server_Send_AUTH(connection); } return 1; } @@ -1356,6 +1369,11 @@ void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 } } +void network_send_password(const char* password) +{ + gNetwork.Client_Send_AUTH(OPENRCT2_VERSION, gConfigNetwork.player_name, password); +} + void network_kick_player(int playerId) { gNetwork.KickPlayer(playerId); diff --git a/src/network/network.h b/src/network/network.h index 349f80a7a9..0b20f8fd17 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -37,7 +37,8 @@ enum { NETWORK_AUTH_OK, NETWORK_AUTH_BADVERSION, NETWORK_AUTH_BADNAME, - NETWORK_AUTH_BADPASSWORD + NETWORK_AUTH_BADPASSWORD, + NETWORK_AUTH_REQUIREPASSWORD }; enum { @@ -217,6 +218,7 @@ public: void SetPassword(const char* password); void Client_Send_AUTH(const char* gameversion, const char* name, const char* password); + void Server_Send_AUTH(NetworkConnection& connection); void Server_Send_MAP(NetworkConnection* connection = nullptr); void Client_Send_CHAT(const char* text); void Server_Send_CHAT(const char* text); @@ -318,6 +320,7 @@ int network_get_player_id(unsigned int index); void network_send_map(); void network_send_chat(const char* text); void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback); +void network_send_password(const char* password); void network_kick_player(int playerId); void network_set_password(const char* password); diff --git a/src/windows/network_status.c b/src/windows/network_status.c index cadcbe99b9..86652b435d 100644 --- a/src/windows/network_status.c +++ b/src/windows/network_status.c @@ -25,10 +25,13 @@ #include "../util/util.h" #include "../network/network.h" +char _password[33]; + enum WINDOW_NETWORK_STATUS_WIDGET_IDX { WIDX_BACKGROUND, WIDX_TITLE, WIDX_CLOSE, + WIDX_PASSWORD }; static rct_widget window_network_status_widgets[] = { @@ -42,6 +45,7 @@ static char window_network_status_text[1024]; static void window_network_status_mouseup(rct_window *w, int widgetIndex); static void window_network_status_update(rct_window *w); +static void window_network_status_textinput(rct_window *w, int widgetIndex, char *text); static void window_network_status_invalidate(rct_window *w); static void window_network_status_paint(rct_window *w, rct_drawpixelinfo *dpi); @@ -65,7 +69,7 @@ static rct_window_event_list window_network_status_events = { NULL, NULL, NULL, - NULL, + window_network_status_textinput, NULL, NULL, NULL, @@ -112,6 +116,16 @@ void window_network_status_close() window_close_by_class(WC_NETWORK_STATUS); } +void window_network_status_open_password() +{ + rct_window* window; + window = window_bring_to_front_by_class(WC_NETWORK_STATUS); + if (window == NULL) + return; + + window_text_input_raw_open(window, WIDX_PASSWORD, STR_PASSWORD_REQUIRED, STR_PASSWORD_REQUIRED_DESC, _password, 32); +} + static void window_network_status_mouseup(rct_window *w, int widgetIndex) { switch (widgetIndex) { @@ -126,6 +140,18 @@ static void window_network_status_update(rct_window *w) widget_invalidate(w, WIDX_BACKGROUND); } +static void window_network_status_textinput(rct_window *w, int widgetIndex, char *text) +{ + strcpy(_password, ""); + switch (widgetIndex) { + case WIDX_PASSWORD: + if (text != NULL) + safe_strncpy(_password, text, sizeof(_password)); + break; + } + network_send_password(_password); +} + static void window_network_status_invalidate(rct_window *w) { window_network_status_widgets[WIDX_BACKGROUND].right = w->width - 1; From 1e9381ef9716deb4dd6000968220e16086b0c20f Mon Sep 17 00:00:00 2001 From: zsilencer Date: Tue, 3 Nov 2015 16:31:09 -0700 Subject: [PATCH 0994/1173] master server list --- data/language/english_uk.txt | 8 + src/config.c | 3 + src/config.h | 3 + src/game.c | 4 +- src/interface/chat.c | 5 +- src/localisation/string_ids.h | 7 + src/network/network.cpp | 139 ++++++++++++----- src/network/network.h | 16 +- src/rct2.h | 1 + src/windows/network_status.c | 6 +- src/windows/server_list.c | 276 +++++++++++++++++++++++++--------- src/windows/server_start.c | 82 +++++++++- 12 files changed, 436 insertions(+), 114 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index a177274400..1032ba2d42 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3899,6 +3899,7 @@ STR_5557 :Stay connected after desynchronisation (Multiplayer) STR_5558 :A restart is required for this setting to take effect STR_5559 :10 min. inspections STR_5560 :{SMALLFONT}{BLACK}Sets the inspection time to 'Every 10 minutes' on all rides +<<<<<<< HEAD STR_5561 :Failed to load language file STR_5562 :WARNING! STR_5563 :This feature is currently unstable, take extra caution. @@ -3908,6 +3909,13 @@ STR_5566 :Password: STR_5567 :Advertise STR_5568 :Password Required STR_5569 :This server requires a password +STR_5570 :Fetch Servers +STR_5571 :Join Game +STR_5572 :Add To Favorites +STR_5573 :Remove From Favorites +STR_5574 :Server Name: +STR_5575 :Max Players: +STR_5576 :Port: ##################### # Rides/attractions # diff --git a/src/config.c b/src/config.c index 5dc77248c8..7244269e58 100644 --- a/src/config.c +++ b/src/config.c @@ -241,6 +241,9 @@ config_property_definition _networkDefinitions[] = { { offsetof(network_configuration, default_port), "default_port", CONFIG_VALUE_TYPE_UINT32, NETWORK_DEFAULT_PORT, NULL }, { offsetof(network_configuration, stay_connected), "stay_connected", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, { offsetof(network_configuration, advertise), "advertise", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(network_configuration, maxplayers), "maxplayers", CONFIG_VALUE_TYPE_UINT8, 16, NULL }, + { offsetof(network_configuration, server_name), "server_name", CONFIG_VALUE_TYPE_STRING, {.value_string = "Server" }, NULL }, + { offsetof(network_configuration, master_url), "master_url", CONFIG_VALUE_TYPE_STRING, {.value_string = OPENRCT2_MASTER_URL }, NULL } }; config_section_definition _sectionDefinitions[] = { diff --git a/src/config.h b/src/config.h index e91bbc28a5..120ee9dfb0 100644 --- a/src/config.h +++ b/src/config.h @@ -215,6 +215,9 @@ typedef struct { uint32 default_port; uint8 stay_connected; uint8 advertise; + uint8 maxplayers; + utf8string server_name; + utf8string master_url; } network_configuration; typedef struct theme_window { diff --git a/src/game.c b/src/game.c index c15739fe7e..bfeb6a639c 100644 --- a/src/game.c +++ b/src/game.c @@ -261,7 +261,7 @@ void game_update() numUpdates = clamp(1, numUpdates, 4); } - if (network_get_mode() == NETWORK_MODE_CLIENT && network_get_status() == NETWORK_STATUS_CONNECTED) { + if (network_get_mode() == NETWORK_MODE_CLIENT && network_get_status() == NETWORK_STATUS_CONNECTED && network_get_authstatus() == NETWORK_AUTH_OK) { if (network_get_server_tick() - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) >= 10) { // make sure client doesn't fall behind the server too much numUpdates += 10; @@ -340,7 +340,7 @@ void game_logic_update() gInUpdateCode = true; /////////////////////////// network_update(); - if (network_get_mode() == NETWORK_MODE_CLIENT && network_get_status() == NETWORK_STATUS_CONNECTED) { + if (network_get_mode() == NETWORK_MODE_CLIENT && network_get_status() == NETWORK_STATUS_CONNECTED && network_get_authstatus() == NETWORK_AUTH_OK) { if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) >= network_get_server_tick()) { // dont run past the server return; diff --git a/src/interface/chat.c b/src/interface/chat.c index ec783c1b4d..eb656b22eb 100644 --- a/src/interface/chat.c +++ b/src/interface/chat.c @@ -60,7 +60,8 @@ void chat_update() void chat_draw() { - if (network_get_mode() == NETWORK_MODE_NONE) { + if (network_get_mode() == NETWORK_MODE_NONE || network_get_status() != NETWORK_STATUS_CONNECTED || network_get_authstatus() != NETWORK_AUTH_OK) { + gChatOpen = false; return; } rct_drawpixelinfo *dpi = (rct_drawpixelinfo*)RCT2_ADDRESS_SCREEN_DPI; @@ -102,7 +103,7 @@ void chat_history_add(const char *src) { int index = _chatHistoryIndex % CHAT_HISTORY_SIZE; memset(_chatHistory[index], 0, CHAT_INPUT_SIZE); - memcpy(_chatHistory[index], src, min(strlen(src), CHAT_INPUT_SIZE)); + memcpy(_chatHistory[index], src, min(strlen(src), CHAT_INPUT_SIZE - 1)); _chatHistoryTime[index] = SDL_GetTicks(); _chatHistoryIndex++; Mixer_Play_Effect(SOUND_NEWS_ITEM, 0, SDL_MIX_MAXVOLUME, 0, 1.5f, true); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index a78cf7c0c3..c6192a913a 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2158,6 +2158,13 @@ enum { STR_ADVERTISE = 5567, STR_PASSWORD_REQUIRED = 5568, STR_PASSWORD_REQUIRED_DESC = 5569, + STR_FETCH_SERVERS = 5570, + STR_JOIN_GAME = 5571, + STR_ADD_TO_FAVORITES = 5572, + STR_REMOVE_FROM_FAVORITES = 5573, + STR_SERVER_NAME = 5574, + STR_MAX_PLAYERS = 5575, + STR_PORT = 5576, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/network/network.cpp b/src/network/network.cpp index d887652989..dae6b7cb7b 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -41,6 +41,7 @@ extern "C" { #include "../interface/window.h" #include "../localisation/date.h" #include "../localisation/localisation.h" +#include "../network/http.h" #include "../scenario.h" #include "../windows/error.h" #include "../util/util.h" @@ -67,6 +68,7 @@ enum { NETWORK_COMMAND_PING, NETWORK_COMMAND_PINGLIST, NETWORK_COMMAND_SETDISCONNECTMSG, + NETWORK_COMMAND_GAMEINFO, NETWORK_COMMAND_MAX, NETWORK_COMMAND_INVALID = -1 }; @@ -161,8 +163,8 @@ bool NetworkPacket::CommandRequiresAuth() { switch (GetCommand()) { case NETWORK_COMMAND_PING: - return false; case NETWORK_COMMAND_AUTH: + case NETWORK_COMMAND_GAMEINFO: return false; default: return true; @@ -254,11 +256,15 @@ bool NetworkConnection::SendPacket(NetworkPacket& packet) return false; } -void NetworkConnection::QueuePacket(std::unique_ptr packet) +void NetworkConnection::QueuePacket(std::unique_ptr packet, bool front) { if (authstatus == NETWORK_AUTH_OK || !packet->CommandRequiresAuth()) { packet->size = (uint16)packet->data->size(); - outboundpackets.push_back(std::move(packet)); + if (front) { + outboundpackets.push_front(std::move(packet)); + } else { + outboundpackets.push_back(std::move(packet)); + } } } @@ -378,7 +384,7 @@ Network::Network() status = NETWORK_STATUS_NONE; last_tick_sent_time = 0; last_ping_sent_time = 0; - strcpy(password, ""); + last_advertise_time = 0; client_command_handlers.resize(NETWORK_COMMAND_MAX, 0); client_command_handlers[NETWORK_COMMAND_AUTH] = &Network::Client_Handle_AUTH; client_command_handlers[NETWORK_COMMAND_MAP] = &Network::Client_Handle_MAP; @@ -394,6 +400,7 @@ Network::Network() server_command_handlers[NETWORK_COMMAND_CHAT] = &Network::Server_Handle_CHAT; server_command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::Server_Handle_GAMECMD; server_command_handlers[NETWORK_COMMAND_PING] = &Network::Server_Handle_PING; + server_command_handlers[NETWORK_COMMAND_GAMEINFO] = &Network::Server_Handle_GAMEINFO; } Network::~Network() @@ -447,6 +454,10 @@ void Network::Close() bool Network::BeginClient(const char* host, unsigned short port) { + if (GetMode() != NETWORK_MODE_NONE) { + return false; + } + Close(); if (!Init()) return false; @@ -508,6 +519,10 @@ bool Network::BeginServer(unsigned short port, const char* address) printf("Ready for clients...\n"); mode = NETWORK_MODE_SERVER; + status = NETWORK_STATUS_CONNECTED; + listening_port = port; + + Advertise(); return true; } @@ -566,14 +581,15 @@ void Network::UpdateServer() } } if (SDL_TICKS_PASSED(SDL_GetTicks(), last_tick_sent_time + 25)) { - last_tick_sent_time = SDL_GetTicks(); Server_Send_TICK(); } if (SDL_TICKS_PASSED(SDL_GetTicks(), last_ping_sent_time + 3000)) { - last_ping_sent_time = SDL_GetTicks(); Server_Send_PING(); Server_Send_PINGLIST(); } + if (SDL_TICKS_PASSED(SDL_GetTicks(), last_advertise_time + 60000)) { + Advertise(); + } SOCKET socket = accept(listening_socket, NULL, NULL); if (socket == INVALID_SOCKET) { if (LAST_SOCKET_ERROR() != EWOULDBLOCK) { @@ -659,21 +675,19 @@ void Network::UpdateClient() if (error == 0) { status = NETWORK_STATUS_CONNECTED; server_connection.ResetLastPacketTime(); - Client_Send_AUTH(OPENRCT2_VERSION, gConfigNetwork.player_name, ""); + Client_Send_AUTH(gConfigNetwork.player_name, ""); window_network_status_open("Authenticating..."); } } }break; case NETWORK_STATUS_CONNECTED: if (!ProcessConnection(server_connection)) { - char errormsg[256]; - char reason[100]; - reason[0] = 0; + std::string errormsg = "Disconnected"; if (server_connection.last_disconnect_reason) { - sprintf(reason, ": %s", server_connection.last_disconnect_reason); + errormsg += ": "; + errormsg += server_connection.last_disconnect_reason; } - sprintf(errormsg, "Disconnected%s", reason); - window_network_status_open(errormsg); + window_network_status_open(errormsg.c_str()); Close(); } ProcessGameCommandQueue(); @@ -722,10 +736,10 @@ const char* Network::FormatChat(NetworkPlayer* fromplayer, const char* text) return formatted; } -void Network::SendPacketToClients(NetworkPacket& packet) +void Network::SendPacketToClients(NetworkPacket& packet, bool front) { for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { - (*it)->QueuePacket(std::move(NetworkPacket::Duplicate(packet))); + (*it)->QueuePacket(std::move(NetworkPacket::Duplicate(packet)), front); } } @@ -765,14 +779,32 @@ void Network::KickPlayer(int playerId) void Network::SetPassword(const char* password) { - safe_strncpy(Network::password, password, sizeof(Network::password)); + Network::password = password; } -void Network::Client_Send_AUTH(const char* gameversion, const char* name, const char* password) +void Network::ShutdownClient() +{ + if (GetMode() == NETWORK_MODE_CLIENT) { + shutdown(server_connection.socket, SHUT_RDWR); + } +} + +void Network::Advertise() +{ + if (gConfigNetwork.advertise && strlen(gConfigNetwork.master_url) > 0) { + last_advertise_time = SDL_GetTicks(); +#ifndef DISABLE_HTTP + std::string url = gConfigNetwork.master_url + std::string("?port=") + std::to_string(listening_port); + http_request_json_async(url.c_str(), [](http_json_response *response)->void{}); +#endif + } +} + +void Network::Client_Send_AUTH(const char* name, const char* password) { std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_AUTH; - packet->WriteString(gameversion); + packet->WriteString(OPENRCT2_VERSION); packet->WriteString(name); packet->WriteString(password); server_connection.authstatus = NETWORK_AUTH_REQUESTED; @@ -820,7 +852,7 @@ void Network::Client_Send_CHAT(const char* text) { std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_CHAT; - packet->Write((uint8*)text, strlen(text) + 1); + packet->WriteString(text); server_connection.QueuePacket(std::move(packet)); } @@ -828,7 +860,7 @@ void Network::Server_Send_CHAT(const char* text) { std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_CHAT; - packet->Write((uint8*)text, strlen(text) + 1); + packet->WriteString(text); SendPacketToClients(*packet); } @@ -848,6 +880,7 @@ void Network::Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx void Network::Server_Send_TICK() { + last_tick_sent_time = SDL_GetTicks(); std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_TICK << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) << (uint32)RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32); SendPacketToClients(*packet); @@ -873,12 +906,13 @@ void Network::Client_Send_PING() void Network::Server_Send_PING() { + last_ping_sent_time = SDL_GetTicks(); std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_PING; for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) { (*it)->ping_time = SDL_GetTicks(); } - SendPacketToClients(*packet); + SendPacketToClients(*packet, true); } void Network::Server_Send_PINGLIST() @@ -899,6 +933,24 @@ void Network::Server_Send_SETDISCONNECTMSG(NetworkConnection& connection, const connection.QueuePacket(std::move(packet)); } +void Network::Server_Send_GAMEINFO(NetworkConnection& connection) +{ + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); + *packet << (uint32)NETWORK_COMMAND_GAMEINFO; +#ifndef DISABLE_HTTP + json_t* obj = json_object(); + json_object_set(obj, "name", json_string(gConfigNetwork.server_name)); + json_object_set(obj, "haspassword", json_integer(password.size() > 0 ? 1 : 0)); + json_object_set(obj, "description", json_string("")); + json_object_set(obj, "version", json_string(OPENRCT2_VERSION)); + json_object_set(obj, "players", json_integer(player_list.size())); + json_object_set(obj, "maxplayers", json_integer(gConfigNetwork.maxplayers)); + packet->WriteString(json_dumps(obj, 0)); + json_object_clear(obj); +#endif + connection.QueuePacket(std::move(packet)); +} + bool Network::ProcessConnection(NetworkConnection& connection) { int packetStatus; @@ -927,7 +979,9 @@ bool Network::ProcessConnection(NetworkConnection& connection) } while (packetStatus == NETWORK_READPACKET_MORE_DATA || packetStatus == NETWORK_READPACKET_SUCCESS); connection.SendQueuedPackets(); if (!connection.ReceivedPacketRecently()) { - connection.last_disconnect_reason = "No Data"; + if (!connection.last_disconnect_reason) { + connection.last_disconnect_reason = "No Data"; + } return false; } return true; @@ -942,7 +996,7 @@ void Network::ProcessPacket(NetworkConnection& connection, NetworkPacket& packet switch (gNetwork.GetMode()) { case NETWORK_MODE_SERVER: if (server_command_handlers[command]) { - if (connection.authstatus == NETWORK_AUTH_OK || command == NETWORK_COMMAND_AUTH) { + if (connection.authstatus == NETWORK_AUTH_OK || !packet.CommandRequiresAuth()) { (this->*server_command_handlers[command])(connection, packet); } } @@ -988,7 +1042,7 @@ void Network::RemoveClient(std::unique_ptr& connection) lineCh = utf8_write_codepoint(lineCh, FORMAT_RED); char reasonstr[100]; reasonstr[0] = 0; - if (connection->last_disconnect_reason) { + if (connection->last_disconnect_reason && strlen(connection->last_disconnect_reason) < sizeof(reasonstr)) { sprintf(reasonstr, " (%s)", connection->last_disconnect_reason); } sprintf(lineCh, "%s has disconnected%s", connection_player->name, reasonstr); @@ -1057,6 +1111,10 @@ int Network::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacket& pa connection.last_disconnect_reason = "Bad Password"; shutdown(connection.socket, SHUT_RDWR); break; + case NETWORK_AUTH_FULL: + connection.last_disconnect_reason = "Server Full"; + shutdown(connection.socket, SHUT_RDWR); + break; case NETWORK_AUTH_REQUIREPASSWORD: window_network_status_open_password(); break; @@ -1076,11 +1134,14 @@ int Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& pa if (!name) { connection.authstatus = NETWORK_AUTH_BADNAME; } else - if (!password || strlen(password) == 0) { + if ((!password || strlen(password) == 0) && Network::password.size() > 0) { connection.authstatus = NETWORK_AUTH_REQUIREPASSWORD; } else - if (strcmp(password, Network::password) != 0) { + if (password && Network::password != password) { connection.authstatus = NETWORK_AUTH_BADPASSWORD; + } else + if (gConfigNetwork.maxplayers <= player_list.size()) { + connection.authstatus = NETWORK_AUTH_FULL; } else { connection.authstatus = NETWORK_AUTH_OK; NetworkPlayer* player = AddPlayer(name); @@ -1251,15 +1312,21 @@ int Network::Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket int Network::Client_Handle_SETDISCONNECTMSG(NetworkConnection& connection, NetworkPacket& packet) { - static char msg[100] = {0}; + static std::string msg; const char* disconnectmsg = packet.ReadString(); if (disconnectmsg) { - safe_strncpy(msg, disconnectmsg, sizeof(msg)); - connection.last_disconnect_reason = msg; + msg = disconnectmsg; + connection.last_disconnect_reason = msg.c_str(); } return 1; } +int Network::Server_Handle_GAMEINFO(NetworkConnection& connection, NetworkPacket& packet) +{ + Server_Send_GAMEINFO(connection); + return 1; +} + int network_init() { return gNetwork.Init(); @@ -1270,13 +1337,14 @@ void network_close() gNetwork.Close(); } +void network_shutdown_client() +{ + gNetwork.ShutdownClient(); +} + int network_begin_client(const char *host, int port) { - if (gNetwork.GetMode() == NETWORK_MODE_NONE) { return gNetwork.BeginClient(host, port); - } else { - return false; - } } int network_begin_server(int port) @@ -1371,7 +1439,7 @@ void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 void network_send_password(const char* password) { - gNetwork.Client_Send_AUTH(OPENRCT2_VERSION, gConfigNetwork.player_name, password); + gNetwork.Client_Send_AUTH(gConfigNetwork.player_name, password); } void network_kick_player(int playerId) @@ -1387,6 +1455,7 @@ void network_set_password(const char* password) #else int network_get_mode() { return NETWORK_MODE_NONE; } int network_get_status() { return NETWORK_STATUS_NONE; } +int network_get_authstatus() { return NETWORK_AUTH_NONE; } uint32 network_get_server_tick() { return RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); } void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback) {} void network_send_map() {} @@ -1399,7 +1468,9 @@ uint32 network_get_player_flags(unsigned int index) { return 0; } int network_get_player_ping(unsigned int index) { return 0; } int network_get_player_id(unsigned int index) { return 0; } void network_send_chat(const char* text) {} +void network_send_password(const char* password) {} void network_close() {} +void network_shutdown_client() {} void network_kick_player(int playerId) {} void network_set_password(const char* password) {} uint8 network_get_current_player_id() { return 0; } diff --git a/src/network/network.h b/src/network/network.h index 0b20f8fd17..9fd433c4c3 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -38,6 +38,7 @@ enum { NETWORK_AUTH_BADVERSION, NETWORK_AUTH_BADNAME, NETWORK_AUTH_BADPASSWORD, + NETWORK_AUTH_FULL, NETWORK_AUTH_REQUIREPASSWORD }; @@ -147,7 +148,7 @@ public: NetworkConnection(); ~NetworkConnection(); int ReadPacket(); - void QueuePacket(std::unique_ptr packet); + void QueuePacket(std::unique_ptr packet, bool front = false); void SendQueuedPackets(); bool SetTCPNoDelay(bool on); bool SetNonBlocking(bool on); @@ -212,12 +213,14 @@ public: void Update(); NetworkPlayer* GetPlayerByID(int id); const char* FormatChat(NetworkPlayer* fromplayer, const char* text); - void SendPacketToClients(NetworkPacket& packet); + void SendPacketToClients(NetworkPacket& packet, bool front = false); bool CheckSRAND(uint32 tick, uint32 srand0); void KickPlayer(int playerId); void SetPassword(const char* password); + void ShutdownClient(); + void Advertise(); - void Client_Send_AUTH(const char* gameversion, const char* name, const char* password); + void Client_Send_AUTH(const char* name, const char* password); void Server_Send_AUTH(NetworkConnection& connection); void Server_Send_MAP(NetworkConnection* connection = nullptr); void Client_Send_CHAT(const char* text); @@ -230,6 +233,7 @@ public: void Server_Send_PING(); void Server_Send_PINGLIST(); void Server_Send_SETDISCONNECTMSG(NetworkConnection& connection, const char* msg); + void Server_Send_GAMEINFO(NetworkConnection& connection); std::vector> player_list; @@ -259,6 +263,7 @@ private: NetworkAddress server_address; bool wsa_initialized; SOCKET listening_socket; + unsigned short listening_port; NetworkConnection server_connection; uint32 last_tick_sent_time; uint32 last_ping_sent_time; @@ -269,9 +274,10 @@ private: std::list> client_connection_list; std::multiset game_command_queue; std::vector chunk_buffer; - char password[33]; + std::string password; bool _desynchronised; uint32 server_connect_time; + uint32 last_advertise_time; void UpdateServer(); void UpdateClient(); @@ -292,6 +298,7 @@ private: int Server_Handle_PING(NetworkConnection& connection, NetworkPacket& packet); int Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket& packet); int Client_Handle_SETDISCONNECTMSG(NetworkConnection& connection, NetworkPacket& packet); + int Server_Handle_GAMEINFO(NetworkConnection& connection, NetworkPacket& packet); }; #endif // __cplusplus @@ -302,6 +309,7 @@ extern "C" { #endif // __cplusplus int network_init(); void network_close(); +void network_shutdown_client(); int network_begin_client(const char *host, int port); int network_begin_server(int port); diff --git a/src/rct2.h b/src/rct2.h index 9a98d84e81..77937a0b2b 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -105,6 +105,7 @@ typedef utf16* utf16string; #define OPENRCT2_BRANCH "develop" #define OPENRCT2_COMMIT_SHA1 "" #define OPENRCT2_COMMIT_SHA1_SHORT "" +#define OPENRCT2_MASTER_URL "" // Represent fixed point numbers. dp = decimal point typedef uint8 fixed8_1dp; diff --git a/src/windows/network_status.c b/src/windows/network_status.c index 86652b435d..1aadcf2d51 100644 --- a/src/windows/network_status.c +++ b/src/windows/network_status.c @@ -149,7 +149,11 @@ static void window_network_status_textinput(rct_window *w, int widgetIndex, char safe_strncpy(_password, text, sizeof(_password)); break; } - network_send_password(_password); + if (text == NULL) { + network_shutdown_client(); + } else { + network_send_password(_password); + } } static void window_network_status_invalidate(rct_window *w) diff --git a/src/windows/server_list.c b/src/windows/server_list.c index 0db84db62a..aa9126b314 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -18,12 +18,15 @@ * along with this program. If not, see . *****************************************************************************/ +#include "../interface/colour.h" #include "../interface/themes.h" #include "../interface/widget.h" #include "../interface/window.h" #include "../localisation/localisation.h" +#include "../network/http.h" #include "../network/network.h" #include "../sprites.h" +#include "../windows/dropdown.h" #include "../util/util.h" #include "error.h" @@ -31,17 +34,23 @@ #define WHEIGHT_MIN 300 #define WWIDTH_MAX 1200 #define WHEIGHT_MAX 800 -#define ITEM_HEIGHT (3 + 11 + 1 + 11 + 3) +#define ITEM_HEIGHT (3 + 9 + 3) typedef struct { char *address; utf8 *name; + bool haspassword; utf8 *description; + char *version; + bool favorite; + uint8 players; + uint8 maxplayers; } saved_server; -char _playerName[64]; +char _playerName[32 + 1]; saved_server *_savedServers = NULL; int _numSavedServers = 0; +SDL_mutex *_mutex = 0; enum { WIDX_BACKGROUND, @@ -49,6 +58,7 @@ enum { WIDX_CLOSE, WIDX_PLAYER_NAME_INPUT, WIDX_LIST, + WIDX_FETCH_SERVERS, WIDX_ADD_SERVER, WIDX_START_SERVER }; @@ -64,14 +74,16 @@ static rct_widget window_server_list_widgets[] = { { WWT_CLOSEBOX, 0, 327, 337, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button { WWT_TEXT_BOX, 1, 100, 344, 20, 31, (uint32)_playerName, STR_NONE }, // player name text box { WWT_SCROLL, 1, 6, 337, 37, 50, STR_NONE, STR_NONE }, // server list - { WWT_DROPDOWN_BUTTON, 1, 6, 106, 53, 64, STR_ADD_SERVER, STR_NONE }, // add server button - { WWT_DROPDOWN_BUTTON, 1, 112, 212, 53, 64, STR_START_SERVER, STR_NONE }, // start server button + { WWT_DROPDOWN_BUTTON, 1, 6, 106, 53, 64, STR_FETCH_SERVERS, STR_NONE }, // fetch servers button + { WWT_DROPDOWN_BUTTON, 1, 112, 212, 53, 64, STR_ADD_SERVER, STR_NONE }, // add server button + { WWT_DROPDOWN_BUTTON, 1, 218, 318, 53, 64, STR_START_SERVER, STR_NONE }, // start server button { WIDGETS_END }, }; static void window_server_list_close(rct_window *w); static void window_server_list_mouseup(rct_window *w, int widgetIndex); static void window_server_list_resize(rct_window *w); +static void window_server_list_dropdown(rct_window *w, int widgetIndex, int dropdownIndex); static void window_server_list_update(rct_window *w); static void window_server_list_scroll_getsize(rct_window *w, int scrollIndex, int *width, int *height); static void window_server_list_scroll_mousedown(rct_window *w, int scrollIndex, int x, int y); @@ -86,7 +98,7 @@ static rct_window_event_list window_server_list_events = { window_server_list_mouseup, window_server_list_resize, NULL, - NULL, + window_server_list_dropdown, NULL, window_server_list_update, NULL, @@ -112,17 +124,25 @@ static rct_window_event_list window_server_list_events = { window_server_list_scrollpaint }; +enum { + DDIDX_JOIN, + DDIDX_FAVORITE +}; + static int _hoverButtonIndex = -1; static void server_list_get_item_button(int buttonIndex, int x, int y, int width, int *outX, int *outY); -static void server_list_update_player_name(); static void server_list_load_saved_servers(); static void server_list_save_saved_servers(); static void dispose_saved_server_list(); static void dispose_saved_server(saved_server *serverInfo); -static void add_saved_server(char *address); +static saved_server* add_saved_server(char *address); static void remove_saved_server(int index); -static void join_server(char *address, bool spectate); +static void join_server(char *address); +static void fetch_servers(); +#ifndef DISABLE_HTTP +static void fetch_servers_callback(http_json_response* response); +#endif void window_server_list_open() { @@ -133,12 +153,17 @@ void window_server_list_open() if (window != NULL) return; + if (_mutex == 0) { + _mutex = SDL_CreateMutex(); + } + window = window_create_centred(WWIDTH_MIN, WHEIGHT_MIN, &window_server_list_events, WC_SERVER_LIST, WF_10 | WF_RESIZABLE); window->widgets = window_server_list_widgets; window->enabled_widgets = ( (1 << WIDX_CLOSE) | (1 << WIDX_PLAYER_NAME_INPUT) | + (1 << WIDX_FETCH_SERVERS) | (1 << WIDX_ADD_SERVER) | (1 << WIDX_START_SERVER) ); @@ -163,12 +188,18 @@ void window_server_list_open() server_list_load_saved_servers(); window->no_list_items = _numSavedServers; + + fetch_servers(); } static void window_server_list_close(rct_window *w) { - server_list_update_player_name(); dispose_saved_server_list(); + if (_mutex) { + SDL_LockMutex(_mutex); + SDL_DestroyMutex(_mutex); + _mutex = 0; + } } static void window_server_list_mouseup(rct_window *w, int widgetIndex) @@ -180,11 +211,13 @@ static void window_server_list_mouseup(rct_window *w, int widgetIndex) case WIDX_PLAYER_NAME_INPUT: window_start_textbox(w, widgetIndex, 1170, (uint32)_playerName, 63); break; + case WIDX_FETCH_SERVERS: + fetch_servers(); + break; case WIDX_ADD_SERVER: window_text_input_open(w, widgetIndex, STR_ADD_SERVER, STR_ENTER_HOSTNAME_OR_IP_ADDRESS, STR_NONE, 0, 128); break; case WIDX_START_SERVER: - server_list_update_player_name(); window_server_start_open(); break; } @@ -195,6 +228,25 @@ static void window_server_list_resize(rct_window *w) window_set_resize(w, WWIDTH_MIN, WHEIGHT_MIN, WWIDTH_MAX, WHEIGHT_MAX); } +static void window_server_list_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) +{ + int serverIndex = w->selected_list_item; + if (serverIndex < 0) return; + if (serverIndex >= _numSavedServers) return; + + char *serverAddress = _savedServers[serverIndex].address; + + switch (dropdownIndex) { + case DDIDX_JOIN: + join_server(serverAddress); + break; + case DDIDX_FAVORITE: + _savedServers[serverIndex].favorite = !_savedServers[serverIndex].favorite; + server_list_save_saved_servers(); + break; + } +} + static void window_server_list_update(rct_window *w) { if (gCurrentTextBox.window.classification == w->classification && gCurrentTextBox.window.number == w->number) { @@ -217,22 +269,17 @@ static void window_server_list_scroll_mousedown(rct_window *w, int scrollIndex, char *serverAddress = _savedServers[serverIndex].address; - switch (_hoverButtonIndex) { - case WIDX_LIST_REMOVE: - remove_saved_server(serverIndex); - server_list_save_saved_servers(); - w->no_list_items = _numSavedServers; - window_invalidate(w); - break; - case WIDX_LIST_SPECTATE: - server_list_update_player_name(); - join_server(serverAddress, true); - break; - default: - server_list_update_player_name(); - join_server(serverAddress, false); - break; + rct_widget *listWidget = &w->widgets[WIDX_LIST]; + int ddx = w->x + listWidget->left + x; + int ddy = w->y + listWidget->top + y; + + gDropdownItemsFormat[0] = STR_JOIN_GAME; + if (_savedServers[serverIndex].favorite) { + gDropdownItemsFormat[1] = STR_REMOVE_FROM_FAVORITES; + } else { + gDropdownItemsFormat[1] = STR_ADD_TO_FAVORITES; } + window_dropdown_show_text(ddx, ddy, 0, COLOUR_GREY, 0, 2); } static void window_server_list_scroll_mouseover(rct_window *w, int scrollIndex, int x, int y) @@ -281,13 +328,18 @@ static void window_server_list_textinput(rct_window *w, int widgetIndex, char *t safe_strncpy(_playerName, text, sizeof(_playerName)); } + if (strlen(_playerName) > 0) { + SafeFree(gConfigNetwork.player_name); + gConfigNetwork.player_name = _strdup(_playerName); + config_save_default(); + } + widget_invalidate(w, WIDX_PLAYER_NAME_INPUT); break; case WIDX_ADD_SERVER: add_saved_server(text); server_list_save_saved_servers(); - w->no_list_items = _numSavedServers; window_invalidate(w); break; } @@ -305,23 +357,26 @@ static void window_server_list_invalidate(rct_window *w) window_server_list_widgets[WIDX_LIST].left = 6; window_server_list_widgets[WIDX_LIST].right = w->width - 6; window_server_list_widgets[WIDX_LIST].bottom = w->height - 6 - 11 - 6; + window_server_list_widgets[WIDX_FETCH_SERVERS].top = w->height - 6 - 11; + window_server_list_widgets[WIDX_FETCH_SERVERS].bottom = w->height - 6; window_server_list_widgets[WIDX_ADD_SERVER].top = w->height - 6 - 11; window_server_list_widgets[WIDX_ADD_SERVER].bottom = w->height - 6; window_server_list_widgets[WIDX_START_SERVER].top = w->height - 6 - 11; window_server_list_widgets[WIDX_START_SERVER].bottom = w->height - 6; + + w->no_list_items = _numSavedServers; } static void window_server_list_paint(rct_window *w, rct_drawpixelinfo *dpi) { window_draw_widgets(w, dpi); - gfx_draw_string_left(dpi, STR_PLAYER_NAME, NULL, w->colours[1], w->x + 6, w->y + w->widgets[WIDX_PLAYER_NAME_INPUT].top); + gfx_draw_string_left(dpi, STR_PLAYER_NAME, NULL, COLOUR_WHITE, w->x + 6, w->y + w->widgets[WIDX_PLAYER_NAME_INPUT].top); } static void window_server_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { uint32 colour; - int bx, by; colour = ((char*)0x0141FC48)[w->colours[1] * 8]; colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; @@ -342,27 +397,26 @@ static void window_server_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi gfx_fill_rect(dpi, 0, y, width, y + ITEM_HEIGHT, 0x02000031); } + int colour = w->colours[1]; + if (serverDetails->favorite) { + colour = COLOUR_YELLOW; + } + // Draw server information if (highlighted) { - gfx_draw_string(dpi, serverDetails->address, w->colours[1], 3, y + 3); + gfx_draw_string(dpi, serverDetails->address, colour, 3, y + 3); } else { - gfx_draw_string(dpi, serverDetails->name, w->colours[1], 3, y + 3); + gfx_draw_string(dpi, serverDetails->name, colour, 3, y + 3); } - gfx_draw_string(dpi, serverDetails->description, w->colours[1], 3, y + 14); + //gfx_draw_string(dpi, serverDetails->description, w->colours[1], 3, y + 14); - // Draw delete server button - server_list_get_item_button(0, 0, y, width, &bx, &by); - if (highlighted && _hoverButtonIndex == WIDX_LIST_REMOVE) { - gfx_fill_rect_inset(dpi, bx, by, bx + 24, by + 24, w->colours[1], 0); + // Draw number of players + char players[32]; + players[0] = 0; + if (serverDetails->maxplayers > 0) { + sprintf(players, "%d/%d", serverDetails->players, serverDetails->maxplayers); } - gfx_draw_sprite(dpi, SPR_DEMOLISH, bx, by, 0); - - // Draw spectate server button - server_list_get_item_button(1, 0, y, width, &bx, &by); - if (highlighted && _hoverButtonIndex == WIDX_LIST_SPECTATE) { - gfx_fill_rect_inset(dpi, bx, by, bx + 24, by + 24, w->colours[1], 0); - } - gfx_draw_sprite(dpi, SPR_LOCATE, bx, by, 0); + gfx_draw_string(dpi, players, w->colours[1], width - 3 - 14 - gfx_get_string_width(players), y + 3); y += ITEM_HEIGHT; } @@ -374,15 +428,6 @@ static void server_list_get_item_button(int buttonIndex, int x, int y, int width *outY = y + 2; } -static void server_list_update_player_name() -{ - if (strlen(_playerName) > 0) { - SafeFree(gConfigNetwork.player_name); - gConfigNetwork.player_name = _strdup(_playerName); - config_save_default(); - } -} - static char *freadstralloc(SDL_RWops *file) { int capacity = 64; @@ -421,6 +466,7 @@ static void server_list_load_saved_servers() return; } + SDL_LockMutex(_mutex); dispose_saved_server_list(); // Read number of saved servers @@ -433,10 +479,16 @@ static void server_list_load_saved_servers() serverInfo->address = freadstralloc(file); serverInfo->name = freadstralloc(file); + serverInfo->haspassword = false; serverInfo->description = freadstralloc(file); + serverInfo->version = _strdup(""); + serverInfo->favorite = true; + serverInfo->players = 0; + serverInfo->maxplayers = 0; } SDL_RWclose(file); + SDL_UnlockMutex(_mutex); } static void server_list_save_saved_servers() @@ -453,23 +505,34 @@ static void server_list_save_saved_servers() return; } + SDL_LockMutex(_mutex); + int count = 0; + for (int i = 0; i < _numSavedServers; i++) { + saved_server *serverInfo = &_savedServers[i]; + if (serverInfo->favorite) { + count++; + } + } // Write number of saved servers - SDL_RWwrite(file, &_numSavedServers, sizeof(uint32), 1); + SDL_RWwrite(file, &count, sizeof(uint32), 1); // Write each saved server for (int i = 0; i < _numSavedServers; i++) { saved_server *serverInfo = &_savedServers[i]; - - SDL_RWwrite(file, serverInfo->address, strlen(serverInfo->address) + 1, 1); - SDL_RWwrite(file, serverInfo->name, strlen(serverInfo->name) + 1, 1); - SDL_RWwrite(file, serverInfo->description, strlen(serverInfo->description) + 1, 1); + if (serverInfo->favorite) { + SDL_RWwrite(file, serverInfo->address, strlen(serverInfo->address) + 1, 1); + SDL_RWwrite(file, serverInfo->name, strlen(serverInfo->name) + 1, 1); + SDL_RWwrite(file, serverInfo->description, strlen(serverInfo->description) + 1, 1); + } } SDL_RWclose(file); + SDL_UnlockMutex(_mutex); } static void dispose_saved_server_list() { + SDL_LockMutex(_mutex); if (_savedServers != NULL) { for (int i = 0; i < _numSavedServers; i++) { dispose_saved_server(&_savedServers[i]); @@ -478,6 +541,7 @@ static void dispose_saved_server_list() _savedServers = NULL; } _numSavedServers = 0; + SDL_UnlockMutex(_mutex); } static void dispose_saved_server(saved_server *serverInfo) @@ -485,10 +549,19 @@ static void dispose_saved_server(saved_server *serverInfo) SafeFree(serverInfo->address); SafeFree(serverInfo->name); SafeFree(serverInfo->description); + SafeFree(serverInfo->version); } -static void add_saved_server(char *address) +static saved_server* add_saved_server(char *address) { + SDL_LockMutex(_mutex); + for (int i = 0; i < _numSavedServers; i++) { + if (strcmp(_savedServers[i].address, address) == 0) { + SDL_UnlockMutex(_mutex); + return &_savedServers[i]; + } + } + _numSavedServers++; if (_savedServers == NULL) { _savedServers = malloc(_numSavedServers * sizeof(saved_server)); @@ -497,20 +570,30 @@ static void add_saved_server(char *address) } int index = _numSavedServers - 1; - _savedServers[index].address = _strdup(address); - _savedServers[index].name = _strdup(address); - _savedServers[index].description = _strdup(""); + saved_server* newserver = &_savedServers[index]; + newserver->address = _strdup(address); + newserver->name = _strdup(address); + newserver->haspassword = false; + newserver->description = _strdup(""); + newserver->version = _strdup(""); + newserver->favorite = false; + newserver->players = 0; + newserver->maxplayers = 0; + SDL_UnlockMutex(_mutex); + return newserver; } static void remove_saved_server(int index) { - if (_numSavedServers <= index) return; + SDL_LockMutex(_mutex); + if (_numSavedServers > index) { + int serversToMove = _numSavedServers - index - 1; + memmove(&_savedServers[index], &_savedServers[index + 1], serversToMove * sizeof(saved_server)); - int serversToMove = _numSavedServers - index - 1; - memmove(&_savedServers[index], &_savedServers[index + 1], serversToMove * sizeof(saved_server)); - - _numSavedServers--; - _savedServers = realloc(_savedServers, _numSavedServers * sizeof(saved_server)); + _numSavedServers--; + _savedServers = realloc(_savedServers, _numSavedServers * sizeof(saved_server)); + } + SDL_UnlockMutex(_mutex); } static char *substr(char *start, int length) @@ -521,7 +604,7 @@ static char *substr(char *start, int length) return result; } -static void join_server(char *address, bool spectate) +static void join_server(char *address) { int port = gConfigNetwork.default_port; @@ -551,3 +634,60 @@ static void join_server(char *address, bool spectate) free(address); } } + +static void fetch_servers() +{ +#ifndef DISABLE_HTTP + if(strlen(gConfigNetwork.master_url) > 0){ + SDL_LockMutex(_mutex); + for (int i = 0; i < _numSavedServers; i++) { + if (!_savedServers[i].favorite) { + remove_saved_server(i); + i = 0; + } + } + SDL_UnlockMutex(_mutex); + http_request_json_async(gConfigNetwork.master_url, fetch_servers_callback); + } +#endif +} + +#ifndef DISABLE_HTTP +static void fetch_servers_callback(http_json_response* response) +{ + if (response && json_is_array(response->root)) { + int count = json_array_size(response->root); + for (int i = 0; i < count; i++) { + json_t *server = json_array_get(response->root, i); + if (!json_is_object(server)) + continue; + + json_t *address = json_object_get(server, "address"); + json_t *name = json_object_get(server, "name"); + json_t *haspassword = json_object_get(server, "haspassword"); + json_t *description = json_object_get(server, "description"); + json_t *version = json_object_get(server, "version"); + json_t *players = json_object_get(server, "players"); + json_t *maxplayers = json_object_get(server, "maxplayers"); + + SDL_LockMutex(_mutex); + saved_server* newserver = add_saved_server((char*)json_string_value(address)); + SafeFree(newserver->name); + newserver->name = _strdup(json_string_value(name)); + newserver->haspassword = (uint8)json_integer_value(haspassword); + SafeFree(newserver->description); + newserver->description = _strdup(json_string_value(description)); + SafeFree(newserver->version); + newserver->version = _strdup(json_string_value(version)); + newserver->players = (uint8)json_integer_value(players); + newserver->maxplayers = (uint8)json_integer_value(maxplayers); + SDL_UnlockMutex(_mutex); + } + http_request_json_dispose(response); + } + rct_window* window = window_bring_to_front_by_class(WC_SERVER_LIST); + if (window != NULL) { + window_invalidate(window); + } +} +#endif diff --git a/src/windows/server_start.c b/src/windows/server_start.c index f53909b2e8..752c7efd4b 100644 --- a/src/windows/server_start.c +++ b/src/windows/server_start.c @@ -28,26 +28,38 @@ #include "../util/util.h" #include "error.h" +char _port[7]; +char _name[65]; char _password[33]; enum { WIDX_BACKGROUND, WIDX_TITLE, WIDX_CLOSE, + WIDX_PORT_INPUT, + WIDX_NAME_INPUT, WIDX_PASSWORD_INPUT, + WIDX_MAXPLAYERS, + WIDX_MAXPLAYERS_INCREASE, + WIDX_MAXPLAYERS_DECREASE, WIDX_ADVERTISE_CHECKBOX, WIDX_START_SERVER }; #define WW 300 -#define WH 100 +#define WH 120 static rct_widget window_server_start_widgets[] = { { WWT_FRAME, 0, 0, WW-1, 0, WH-1, 0xFFFFFFFF, STR_NONE }, // panel / background { WWT_CAPTION, 0, 1, WW-2, 1, 14, STR_START_SERVER, STR_WINDOW_TITLE_TIP }, // title bar { WWT_CLOSEBOX, 0, WW-13, WW-3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button - { WWT_TEXT_BOX, 1, 150, WW-8, 20, 32, (uint32)_password, STR_NONE }, // password text box - { WWT_CHECKBOX, 1, 6, WW-8, 36, 45, STR_ADVERTISE, STR_NONE }, // advertise checkbox + { WWT_TEXT_BOX, 1, 120, WW-8, 20, 32, (uint32)_port, STR_NONE }, // port text box + { WWT_TEXT_BOX, 1, 120, WW-8, 36, 48, (uint32)_name, STR_NONE }, // name text box + { WWT_TEXT_BOX, 1, 120, WW-8, 52, 64, (uint32)_password, STR_NONE }, // password text box + { WWT_SPINNER, 1, 120, WW-8, 68, 77, 1871, STR_NONE }, // max players + { WWT_DROPDOWN_BUTTON, 1, WW-18, WW-8, 68, 72, STR_NUMERIC_UP, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, WW-18, WW-8, 72, 76, STR_NUMERIC_DOWN, STR_NONE }, + { WWT_CHECKBOX, 1, 6, WW-8, 85, 91, STR_ADVERTISE, STR_NONE }, // advertise checkbox { WWT_DROPDOWN_BUTTON, 1, 6, 106, WH-6-11, WH-6, STR_START_SERVER, STR_NONE }, // start server button { WIDGETS_END }, }; @@ -104,7 +116,12 @@ void window_server_start_open() window->widgets = window_server_start_widgets; window->enabled_widgets = ( (1 << WIDX_CLOSE) | + (1 << WIDX_PORT_INPUT) | + (1 << WIDX_NAME_INPUT) | (1 << WIDX_PASSWORD_INPUT) | + (1 << WIDX_MAXPLAYERS) | + (1 << WIDX_MAXPLAYERS_INCREASE) | + (1 << WIDX_MAXPLAYERS_DECREASE) | (1 << WIDX_ADVERTISE_CHECKBOX) | (1 << WIDX_START_SERVER) ); @@ -122,6 +139,9 @@ void window_server_start_open() window->colours[0] = 1; window->colours[1] = 26; window->colours[2] = 26; + + sprintf(_port, "%lu", gConfigNetwork.default_port); + safe_strncpy(_name, gConfigNetwork.server_name, sizeof(_name)); } static void window_server_start_close(rct_window *w) @@ -135,9 +155,29 @@ static void window_server_start_mouseup(rct_window *w, int widgetIndex) case WIDX_CLOSE: window_close(w); break; + case WIDX_PORT_INPUT: + window_start_textbox(w, widgetIndex, 1170, (uint32)_port, 6); + break; + case WIDX_NAME_INPUT: + window_start_textbox(w, widgetIndex, 1170, (uint32)_name, 64); + break; case WIDX_PASSWORD_INPUT: window_start_textbox(w, widgetIndex, 1170, (uint32)_password, 32); break; + case WIDX_MAXPLAYERS_INCREASE: + if (gConfigNetwork.maxplayers < 255) { + gConfigNetwork.maxplayers++; + } + config_save_default(); + window_invalidate(w); + break; + case WIDX_MAXPLAYERS_DECREASE: + if (gConfigNetwork.maxplayers > 1) { + gConfigNetwork.maxplayers--; + } + config_save_default(); + window_invalidate(w); + break; case WIDX_ADVERTISE_CHECKBOX: gConfigNetwork.advertise = !gConfigNetwork.advertise; config_save_default(); @@ -154,6 +194,7 @@ static void window_server_start_update(rct_window *w) { if (gCurrentTextBox.window.classification == w->classification && gCurrentTextBox.window.number == w->number) { window_update_textbox_caret(); + widget_invalidate(w, WIDX_NAME_INPUT); widget_invalidate(w, WIDX_PASSWORD_INPUT); } } @@ -163,6 +204,37 @@ static void window_server_start_textinput(rct_window *w, int widgetIndex, char * if (text == NULL) return; switch (widgetIndex) { + case WIDX_PORT_INPUT: + if (strcmp(_port, text) == 0) + return; + + memset(_port, 0, sizeof(_port)); + if (strlen(text) > 0) { + safe_strncpy(_port, text, sizeof(_port)); + } + + gConfigNetwork.default_port = atoi(_port); + config_save_default(); + + widget_invalidate(w, WIDX_NAME_INPUT); + break; + case WIDX_NAME_INPUT: + if (strcmp(_name, text) == 0) + return; + + memset(_name, 0, sizeof(_name)); + if (strlen(text) > 0) { + safe_strncpy(_name, text, sizeof(_name)); + } + + if (strlen(_name) > 0) { + SafeFree(gConfigNetwork.server_name); + gConfigNetwork.server_name = _strdup(_name); + config_save_default(); + } + + widget_invalidate(w, WIDX_NAME_INPUT); + break; case WIDX_PASSWORD_INPUT: if (strcmp(_password, text) == 0) return; @@ -180,11 +252,15 @@ static void window_server_start_textinput(rct_window *w, int widgetIndex, char * static void window_server_start_invalidate(rct_window *w) { widget_set_checkbox_value(w, WIDX_ADVERTISE_CHECKBOX, gConfigNetwork.advertise); + RCT2_GLOBAL(0x013CE964, uint16) = gConfigNetwork.maxplayers; } static void window_server_start_paint(rct_window *w, rct_drawpixelinfo *dpi) { window_draw_widgets(w, dpi); + gfx_draw_string_left(dpi, STR_PORT, NULL, w->colours[1], w->x + 6, w->y + w->widgets[WIDX_PORT_INPUT].top); + gfx_draw_string_left(dpi, STR_SERVER_NAME, NULL, w->colours[1], w->x + 6, w->y + w->widgets[WIDX_NAME_INPUT].top); gfx_draw_string_left(dpi, STR_PASSWORD, NULL, w->colours[1], w->x + 6, w->y + w->widgets[WIDX_PASSWORD_INPUT].top); + gfx_draw_string_left(dpi, STR_MAX_PLAYERS, NULL, w->colours[1], w->x + 6, w->y + w->widgets[WIDX_MAXPLAYERS].top); } From 74fe482a621aaf3be6fa496390decf638fd6d449 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 7 Nov 2015 23:47:50 +0000 Subject: [PATCH 0995/1173] improve game info json --- src/config.c | 1 + src/config.h | 1 + src/network/network.cpp | 6 +++--- src/windows/server_list.c | 14 +++++++------- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/config.c b/src/config.c index 7244269e58..f3040804a9 100644 --- a/src/config.c +++ b/src/config.c @@ -243,6 +243,7 @@ config_property_definition _networkDefinitions[] = { { offsetof(network_configuration, advertise), "advertise", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(network_configuration, maxplayers), "maxplayers", CONFIG_VALUE_TYPE_UINT8, 16, NULL }, { offsetof(network_configuration, server_name), "server_name", CONFIG_VALUE_TYPE_STRING, {.value_string = "Server" }, NULL }, + { offsetof(network_configuration, server_description), "server_description", CONFIG_VALUE_TYPE_STRING, {.value_string = "" }, NULL }, { offsetof(network_configuration, master_url), "master_url", CONFIG_VALUE_TYPE_STRING, {.value_string = OPENRCT2_MASTER_URL }, NULL } }; diff --git a/src/config.h b/src/config.h index 120ee9dfb0..0e3d7d560d 100644 --- a/src/config.h +++ b/src/config.h @@ -217,6 +217,7 @@ typedef struct { uint8 advertise; uint8 maxplayers; utf8string server_name; + utf8string server_description; utf8string master_url; } network_configuration; diff --git a/src/network/network.cpp b/src/network/network.cpp index dae6b7cb7b..e97892e946 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -940,11 +940,11 @@ void Network::Server_Send_GAMEINFO(NetworkConnection& connection) #ifndef DISABLE_HTTP json_t* obj = json_object(); json_object_set(obj, "name", json_string(gConfigNetwork.server_name)); - json_object_set(obj, "haspassword", json_integer(password.size() > 0 ? 1 : 0)); - json_object_set(obj, "description", json_string("")); + json_object_set(obj, "requiresPassword", json_boolean(password.size() > 0)); json_object_set(obj, "version", json_string(OPENRCT2_VERSION)); json_object_set(obj, "players", json_integer(player_list.size())); - json_object_set(obj, "maxplayers", json_integer(gConfigNetwork.maxplayers)); + json_object_set(obj, "maxPlayers", json_integer(gConfigNetwork.maxplayers)); + json_object_set(obj, "description", json_string(gConfigNetwork.server_description)); packet->WriteString(json_dumps(obj, 0)); json_object_clear(obj); #endif diff --git a/src/windows/server_list.c b/src/windows/server_list.c index aa9126b314..a941c24f6b 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -39,7 +39,7 @@ typedef struct { char *address; utf8 *name; - bool haspassword; + bool requiresPassword; utf8 *description; char *version; bool favorite; @@ -479,7 +479,7 @@ static void server_list_load_saved_servers() serverInfo->address = freadstralloc(file); serverInfo->name = freadstralloc(file); - serverInfo->haspassword = false; + serverInfo->requiresPassword = false; serverInfo->description = freadstralloc(file); serverInfo->version = _strdup(""); serverInfo->favorite = true; @@ -573,7 +573,7 @@ static saved_server* add_saved_server(char *address) saved_server* newserver = &_savedServers[index]; newserver->address = _strdup(address); newserver->name = _strdup(address); - newserver->haspassword = false; + newserver->requiresPassword = false; newserver->description = _strdup(""); newserver->version = _strdup(""); newserver->favorite = false; @@ -664,17 +664,17 @@ static void fetch_servers_callback(http_json_response* response) json_t *address = json_object_get(server, "address"); json_t *name = json_object_get(server, "name"); - json_t *haspassword = json_object_get(server, "haspassword"); - json_t *description = json_object_get(server, "description"); + json_t *requiresPassword = json_object_get(server, "requiresPassword"); json_t *version = json_object_get(server, "version"); json_t *players = json_object_get(server, "players"); - json_t *maxplayers = json_object_get(server, "maxplayers"); + json_t *maxplayers = json_object_get(server, "maxPlayers"); + json_t *description = json_object_get(server, "description"); SDL_LockMutex(_mutex); saved_server* newserver = add_saved_server((char*)json_string_value(address)); SafeFree(newserver->name); newserver->name = _strdup(json_string_value(name)); - newserver->haspassword = (uint8)json_integer_value(haspassword); + newserver->requiresPassword = json_boolean_value(requiresPassword); SafeFree(newserver->description); newserver->description = _strdup(json_string_value(description)); SafeFree(newserver->version); From 9bad4183a7584306ec876fb512e8327a27b6ffdf Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 7 Nov 2015 23:56:16 +0000 Subject: [PATCH 0996/1173] add default master server url and refactor --- src/config.c | 6 +++--- src/config.h | 2 +- src/network/network.cpp | 12 +++++++++--- src/rct2.h | 2 +- src/windows/server_list.c | 23 +++++++++++++---------- 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/config.c b/src/config.c index f3040804a9..40e83036fa 100644 --- a/src/config.c +++ b/src/config.c @@ -157,7 +157,7 @@ config_enum_definition _dateFormatEnum[] = { config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, always_show_gridlines), "always_show_gridlines", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, - { offsetof(general_configuration, autosave_frequency), "autosave", CONFIG_VALUE_TYPE_UINT8, AUTOSAVE_EVERY_5MINUTES, NULL }, + { offsetof(general_configuration, autosave_frequency), "autosave", CONFIG_VALUE_TYPE_UINT8, AUTOSAVE_EVERY_5MINUTES, NULL }, { offsetof(general_configuration, confirmation_prompt), "confirmation_prompt", CONFIG_VALUE_TYPE_UINT8, 0, NULL }, { offsetof(general_configuration, construction_marker_colour), "construction_marker_colour", CONFIG_VALUE_TYPE_UINT8, false, NULL }, { offsetof(general_configuration, currency_format), "currency_format", CONFIG_VALUE_TYPE_UINT8, CURRENCY_POUNDS, _currencyEnum }, @@ -243,8 +243,8 @@ config_property_definition _networkDefinitions[] = { { offsetof(network_configuration, advertise), "advertise", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(network_configuration, maxplayers), "maxplayers", CONFIG_VALUE_TYPE_UINT8, 16, NULL }, { offsetof(network_configuration, server_name), "server_name", CONFIG_VALUE_TYPE_STRING, {.value_string = "Server" }, NULL }, - { offsetof(network_configuration, server_description), "server_description", CONFIG_VALUE_TYPE_STRING, {.value_string = "" }, NULL }, - { offsetof(network_configuration, master_url), "master_url", CONFIG_VALUE_TYPE_STRING, {.value_string = OPENRCT2_MASTER_URL }, NULL } + { offsetof(network_configuration, server_description), "server_description", CONFIG_VALUE_TYPE_STRING, {.value_string = NULL }, NULL }, + { offsetof(network_configuration, master_server_url), "master_server_url", CONFIG_VALUE_TYPE_STRING, {.value_string = NULL }, NULL } }; config_section_definition _sectionDefinitions[] = { diff --git a/src/config.h b/src/config.h index 0e3d7d560d..fc070133f4 100644 --- a/src/config.h +++ b/src/config.h @@ -218,7 +218,7 @@ typedef struct { uint8 maxplayers; utf8string server_name; utf8string server_description; - utf8string master_url; + utf8string master_server_url; } network_configuration; typedef struct theme_window { diff --git a/src/network/network.cpp b/src/network/network.cpp index e97892e946..71d52ef82c 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -791,11 +791,17 @@ void Network::ShutdownClient() void Network::Advertise() { - if (gConfigNetwork.advertise && strlen(gConfigNetwork.master_url) > 0) { + if (gConfigNetwork.advertise) { last_advertise_time = SDL_GetTicks(); + #ifndef DISABLE_HTTP - std::string url = gConfigNetwork.master_url + std::string("?port=") + std::to_string(listening_port); - http_request_json_async(url.c_str(), [](http_json_response *response)->void{}); + const char *masterServerUrl = OPENRCT2_MASTER_SERVER_URL; + if (!str_is_null_or_empty(gConfigNetwork.master_server_url)) { + masterServerUrl = gConfigNetwork.master_server_url; + } + + std::string url = masterServerUrl + std::string("?port=") + std::to_string(listening_port); + http_request_json_async(url.c_str(), [](http_json_response *response)->void { }); #endif } } diff --git a/src/rct2.h b/src/rct2.h index 77937a0b2b..841aa697d8 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -105,7 +105,7 @@ typedef utf16* utf16string; #define OPENRCT2_BRANCH "develop" #define OPENRCT2_COMMIT_SHA1 "" #define OPENRCT2_COMMIT_SHA1_SHORT "" -#define OPENRCT2_MASTER_URL "" +#define OPENRCT2_MASTER_SERVER_URL "https://servers.openrct2.website" // Represent fixed point numbers. dp = decimal point typedef uint8 fixed8_1dp; diff --git a/src/windows/server_list.c b/src/windows/server_list.c index a941c24f6b..cd9cd9c46b 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -638,17 +638,20 @@ static void join_server(char *address) static void fetch_servers() { #ifndef DISABLE_HTTP - if(strlen(gConfigNetwork.master_url) > 0){ - SDL_LockMutex(_mutex); - for (int i = 0; i < _numSavedServers; i++) { - if (!_savedServers[i].favorite) { - remove_saved_server(i); - i = 0; - } - } - SDL_UnlockMutex(_mutex); - http_request_json_async(gConfigNetwork.master_url, fetch_servers_callback); + const char *masterServerUrl = OPENRCT2_MASTER_SERVER_URL; + if (!str_is_null_or_empty(gConfigNetwork.master_server_url)) { + masterServerUrl = gConfigNetwork.master_server_url; } + + SDL_LockMutex(_mutex); + for (int i = 0; i < _numSavedServers; i++) { + if (!_savedServers[i].favorite) { + remove_saved_server(i); + i = 0; + } + } + SDL_UnlockMutex(_mutex); + http_request_json_async(masterServerUrl, fetch_servers_callback); #endif } From 782d3e63b275b92579442b08db8423b1163cdd69 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 8 Nov 2015 02:12:12 +0000 Subject: [PATCH 0997/1173] add new master server functionality --- src/network/network.cpp | 137 ++++++++++++++++++++++++++++++++++---- src/network/network.h | 9 ++- src/windows/server_list.c | 84 +++++++++++++++-------- 3 files changed, 188 insertions(+), 42 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 71d52ef82c..47179d2986 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -84,6 +84,22 @@ const char *NetworkCommandNames[] = { "NETWORK_COMMAND_PINGLIST", }; +enum { + ADVERTISE_STATUS_DISABLED, + ADVERTISE_STATUS_UNREGISTERED, + ADVERTISE_STATUS_REGISTERED +}; + +enum { + MASTER_SERVER_STATUS_OK = 200, + MASTER_SERVER_STATUS_INVALID_TOKEN = 401, + MASTER_SERVER_STATUS_SERVER_NOT_FOUND = 404, + MASTER_SERVER_STATUS_INTERNAL_ERROR = 500 +}; + +constexpr int MASTER_SERVER_REGISTER_TIME = 2 * 1000; // 2 seconds +constexpr int MASTER_SERVER_HEARTBEAT_TIME = 1 * 1000; // 1 second + NetworkPacket::NetworkPacket() { transferred = 0; @@ -521,8 +537,17 @@ bool Network::BeginServer(unsigned short port, const char* address) mode = NETWORK_MODE_SERVER; status = NETWORK_STATUS_CONNECTED; listening_port = port; + advertise_status = ADVERTISE_STATUS_DISABLED; + last_advertise_time = 0; + last_heartbeat_time = 0; + advertise_token = ""; + advertise_key = GenerateAdvertiseKey(); - Advertise(); +#ifndef DISABLE_HTTP + if (gConfigNetwork.advertise) { + advertise_status = ADVERTISE_STATUS_UNREGISTERED; + } +#endif return true; } @@ -587,9 +612,20 @@ void Network::UpdateServer() Server_Send_PING(); Server_Send_PINGLIST(); } - if (SDL_TICKS_PASSED(SDL_GetTicks(), last_advertise_time + 60000)) { - Advertise(); + + switch (advertise_status) { + case ADVERTISE_STATUS_UNREGISTERED: + if (SDL_TICKS_PASSED(SDL_GetTicks(), last_advertise_time + MASTER_SERVER_REGISTER_TIME)) { + AdvertiseRegister(); + } + break; + case ADVERTISE_STATUS_REGISTERED: + if (SDL_TICKS_PASSED(SDL_GetTicks(), last_heartbeat_time + MASTER_SERVER_HEARTBEAT_TIME)) { + AdvertiseHeartbeat(); + } + break; } + SOCKET socket = accept(listening_socket, NULL, NULL); if (socket == INVALID_SOCKET) { if (LAST_SOCKET_ERROR() != EWOULDBLOCK) { @@ -789,21 +825,98 @@ void Network::ShutdownClient() } } -void Network::Advertise() +std::string Network::GenerateAdvertiseKey() { - if (gConfigNetwork.advertise) { - last_advertise_time = SDL_GetTicks(); + // Generate a string of 16 random hex characters (64-integer key as a hex formatted string) + static char hexChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + char key[17]; + for (int i = 0; i < 16; i++) { + int hexCharIndex = rand() % countof(hexChars); + key[i] = hexChars[hexCharIndex]; + } + key[countof(key) - 1] = 0; + return key; +} + +const char *Network::GetMasterServerUrl() +{ + if (str_is_null_or_empty(gConfigNetwork.master_server_url)) { + return OPENRCT2_MASTER_SERVER_URL; + } else { + return gConfigNetwork.master_server_url; + } +} + +void Network::AdvertiseRegister() +{ #ifndef DISABLE_HTTP - const char *masterServerUrl = OPENRCT2_MASTER_SERVER_URL; - if (!str_is_null_or_empty(gConfigNetwork.master_server_url)) { - masterServerUrl = gConfigNetwork.master_server_url; + last_advertise_time = SDL_GetTicks(); + + // Send the registration request + std::string url = GetMasterServerUrl() + + std::string("?command=register&port=") + std::to_string(listening_port) + + std::string("key=") + advertise_key; + http_request_json_async(url.c_str(), [](http_json_response *response) -> void { + if (response == NULL) { + log_warning("Unable to connect to master server"); + return; } - std::string url = masterServerUrl + std::string("?port=") + std::to_string(listening_port); - http_request_json_async(url.c_str(), [](http_json_response *response)->void { }); + json_t *jsonStatus = json_object_get(response->root, "status"); + if (json_is_integer(jsonStatus)) { + int status = (int)json_integer_value(jsonStatus); + if (status == MASTER_SERVER_STATUS_OK) { + json_t *jsonToken = json_object_get(response->root, "token"); + if (json_is_string(jsonToken)) { + gNetwork.advertise_token = json_string_value(jsonToken); + gNetwork.advertise_status = ADVERTISE_STATUS_REGISTERED; + } + } else { + const char *message = "Invalid response from server"; + json_t *jsonMessage = json_object_get(response->root, "message"); + if (json_is_string(jsonMessage)) { + message = json_string_value(jsonMessage); + } + log_warning("Unable to advertise: %s", message); + } + } + http_request_json_dispose(response); + }); +#endif +} + +void Network::AdvertiseHeartbeat() +{ +#ifndef DISABLE_HTTP + // Send the heartbeat request + std::string url = GetMasterServerUrl() + + std::string("?command=heartbeat&token=") + advertise_token + + std::string("key=") + advertise_key + + std::string("players=") + std::to_string(network_get_num_players()); + + // TODO send status data (e.g. players) via JSON body + + gNetwork.last_heartbeat_time = SDL_GetTicks(); + http_request_json_async(url.c_str(), [](http_json_response *response) -> void { + if (response == NULL) { + log_warning("Unable to connect to master server"); + return; + } + + json_t *jsonStatus = json_object_get(response->root, "status"); + if (json_is_integer(jsonStatus)) { + int status = (int)json_integer_value(jsonStatus); + if (status == MASTER_SERVER_STATUS_OK) { + // Master server has successfully updated our server status + } else if (status == MASTER_SERVER_STATUS_INVALID_TOKEN) { + gNetwork.advertise_status = ADVERTISE_STATUS_UNREGISTERED; + log_warning("Master server heartbeat failed: Invalid Token"); + } + } + http_request_json_dispose(response); + }); #endif - } } void Network::Client_Send_AUTH(const char* name, const char* password) diff --git a/src/network/network.h b/src/network/network.h index 9fd433c4c3..0c092fa1f7 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -218,7 +218,8 @@ public: void KickPlayer(int playerId); void SetPassword(const char* password); void ShutdownClient(); - void Advertise(); + void AdvertiseRegister(); + void AdvertiseHeartbeat(); void Client_Send_AUTH(const char* name, const char* password); void Server_Send_AUTH(NetworkConnection& connection); @@ -245,6 +246,8 @@ private: void RemoveClient(std::unique_ptr& connection); NetworkPlayer* AddPlayer(const char* name); void PrintError(); + const char *GetMasterServerUrl(); + std::string GenerateAdvertiseKey(); struct GameCommand { @@ -278,6 +281,10 @@ private: bool _desynchronised; uint32 server_connect_time; uint32 last_advertise_time; + std::string advertise_token; + std::string advertise_key; + int advertise_status; + uint32 last_heartbeat_time; void UpdateServer(); void UpdateClient(); diff --git a/src/windows/server_list.c b/src/windows/server_list.c index cd9cd9c46b..4201f2eef8 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -658,36 +658,62 @@ static void fetch_servers() #ifndef DISABLE_HTTP static void fetch_servers_callback(http_json_response* response) { - if (response && json_is_array(response->root)) { - int count = json_array_size(response->root); - for (int i = 0; i < count; i++) { - json_t *server = json_array_get(response->root, i); - if (!json_is_object(server)) - continue; - - json_t *address = json_object_get(server, "address"); - json_t *name = json_object_get(server, "name"); - json_t *requiresPassword = json_object_get(server, "requiresPassword"); - json_t *version = json_object_get(server, "version"); - json_t *players = json_object_get(server, "players"); - json_t *maxplayers = json_object_get(server, "maxPlayers"); - json_t *description = json_object_get(server, "description"); - - SDL_LockMutex(_mutex); - saved_server* newserver = add_saved_server((char*)json_string_value(address)); - SafeFree(newserver->name); - newserver->name = _strdup(json_string_value(name)); - newserver->requiresPassword = json_boolean_value(requiresPassword); - SafeFree(newserver->description); - newserver->description = _strdup(json_string_value(description)); - SafeFree(newserver->version); - newserver->version = _strdup(json_string_value(version)); - newserver->players = (uint8)json_integer_value(players); - newserver->maxplayers = (uint8)json_integer_value(maxplayers); - SDL_UnlockMutex(_mutex); - } - http_request_json_dispose(response); + if (response == NULL) { + log_warning("Unable to connect to master server"); + return; } + + json_t *jsonStatus = json_object_get(response->root, "status"); + if (!json_is_number(jsonStatus)) { + http_request_json_dispose(response); + log_warning("Invalid response from master server"); + return; + } + + int status = (int)json_integer_value(jsonStatus); + if (status != 200) { + http_request_json_dispose(response); + log_warning("Master server failed to return servers"); + return; + } + + json_t *jsonServers = json_object_get(response->root, "servers"); + if (!json_is_array(jsonServers)) { + http_request_json_dispose(response); + log_warning("Invalid response from master server"); + return; + } + + int count = json_array_size(response->root); + for (int i = 0; i < count; i++) { + json_t *server = json_array_get(response->root, i); + if (!json_is_object(server)) { + continue; + } + + json_t *address = json_object_get(server, "address"); + json_t *name = json_object_get(server, "name"); + json_t *requiresPassword = json_object_get(server, "requiresPassword"); + json_t *version = json_object_get(server, "version"); + json_t *players = json_object_get(server, "players"); + json_t *maxplayers = json_object_get(server, "maxPlayers"); + json_t *description = json_object_get(server, "description"); + + SDL_LockMutex(_mutex); + saved_server* newserver = add_saved_server((char*)json_string_value(address)); + SafeFree(newserver->name); + newserver->name = _strdup(json_string_value(name)); + newserver->requiresPassword = json_boolean_value(requiresPassword); + SafeFree(newserver->description); + newserver->description = _strdup(json_string_value(description)); + SafeFree(newserver->version); + newserver->version = _strdup(json_string_value(version)); + newserver->players = (uint8)json_integer_value(players); + newserver->maxplayers = (uint8)json_integer_value(maxplayers); + SDL_UnlockMutex(_mutex); + } + http_request_json_dispose(response); + rct_window* window = window_bring_to_front_by_class(WC_SERVER_LIST); if (window != NULL) { window_invalidate(window); From 0b9882b96fc49b29366edda5da972eae1dbddf32 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 8 Nov 2015 02:22:49 +0000 Subject: [PATCH 0998/1173] fix master server poll times --- src/network/network.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 47179d2986..4084075d1c 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -97,8 +97,8 @@ enum { MASTER_SERVER_STATUS_INTERNAL_ERROR = 500 }; -constexpr int MASTER_SERVER_REGISTER_TIME = 2 * 1000; // 2 seconds -constexpr int MASTER_SERVER_HEARTBEAT_TIME = 1 * 1000; // 1 second +constexpr int MASTER_SERVER_REGISTER_TIME = 120 * 1000; // 2 minutes +constexpr int MASTER_SERVER_HEARTBEAT_TIME = 60 * 1000; // 1 minute NetworkPacket::NetworkPacket() { From 301c7f53c1addf338a8d8e794b22f3676c6c43c0 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 8 Nov 2015 04:00:17 +0000 Subject: [PATCH 0999/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 7 ++++++- data/language/english_us.txt | 16 +++++++++++++--- data/language/german.txt | 4 +++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 18b06c1ae1..af8e93a3f6 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3820,7 +3820,7 @@ STR_5484 :{BLACK}({COMMA16} week resterend) STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}Recente berichten tonen -STR_5488 :Geen ingang +STR_5488 :Geen ingang (alleen in OpenRCT2!) STR_5489 :{SMALLFONT}{BLACK}Enkel bezoekers die gevolgd worden weergeven STR_5490 :Geluid dempen bij focusverlies STR_5491 :Uitvindingenlijst @@ -3893,6 +3893,11 @@ STR_5557 :Verbinding behouden na desynchronisatie (multiplayer) STR_5558 :Om deze instelling van kracht te laten worden is een herstart vereist. STR_5559 :Elke 10 min. inspect. STR_5560 :{SMALLFONT}{BLACK}Stelt het inspectieinterval van alle attracties in op 'Elke 10 minuten'. +STR_5561 :Kon taalbestand niet laden +STR_5562 :WAARSCHUWING: +STR_5563 :Deze functie is momenteel niet helemaal stabiel, wees voorzichtig. +STR_5564 :Ongeldig element invoegen +STR_5565 :{SMALLFONT}{BLACK}Plaatst een ongeldig element boven de andere elementen van dit vakje. Alle elementen die boven dit ongeldige element worden geplaatst worden onzichtbaar. ############# # Scenarios # diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 3525b557ff..39a51151c1 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -2712,7 +2712,7 @@ STR_2703 :Every 15 minutes STR_2704 :Every 30 minutes STR_2705 :Every hour STR_2706 :Never -STR_2707 :Open new window +STR_2707 :Use system dialog window STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? STR_2709 :Overwrite STR_2710 :Type the name of the file. @@ -3828,7 +3828,7 @@ STR_5484 :{BLACK}({COMMA16} week remaining) STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}Show recent messages -STR_5488 :No entrance +STR_5488 :No entrance (OpenRCT2 only!) STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests STR_5490 :Disable audio on focus loss STR_5491 :Inventions list @@ -3855,7 +3855,7 @@ STR_5511 :(UNKNOWN) STR_5512 :Save Game As STR_5513 :(Quick) save game STR_5514 :Disable vandalism -STR_5515 :{SMALLFONT}{BLACK}Stops guests from vandalising your park when they're angry +STR_5515 :{SMALLFONT}{BLACK}Stops guests from vandalizing your park when they're angry STR_5516 :{SMALLFONT}{BLACK}Black STR_5517 :{SMALLFONT}{BLACK}Gray STR_5518 :{SMALLFONT}{BLACK}White @@ -3896,6 +3896,16 @@ STR_5552 :{POP16}{POP16}Year {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {M STR_5553 :Pause game when Steam overlay is open STR_5554 :{SMALLFONT}{BLACK}Enable mountain tool STR_5555 :Show vehicles from other track types +STR_5556 :Kick Player +STR_5557 :Stay connected after desynchronization (Multiplayer) +STR_5558 :A restart is required for this setting to take effect +STR_5559 :10 min. inspections +STR_5560 :{SMALLFONT}{BLACK}Sets the inspection time to 'Every 10 minutes' on all rides +STR_5561 :Failed to load language file +STR_5562 :WARNING! +STR_5563 :This feature is currently unstable, take extra caution. +STR_5564 :Insert Corrupt Element +STR_5565 :{SMALLFONT}{BLACK}Inserts a corrupt map element at top of tile. This will hide any element above the corrupt element. ######### # Rides # diff --git a/data/language/german.txt b/data/language/german.txt index f454e341e9..552a91cf44 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3821,7 +3821,7 @@ STR_5484 :{BLACK}({COMMA16} Woche verbleibend) STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}Aktuelle Nachrichten anzeigen -STR_5488 :Kein Eingang +STR_5488 :Kein Eingang (nur OpenRCT2!) STR_5489 :{SMALLFONT}{BLACK}Nur überwachte Besucher anzeigen STR_5490 :Audio deaktivieren, wenn Spiel nicht im Vordergrund STR_5491 :Erfindungsliste @@ -3897,6 +3897,8 @@ STR_5560 :{SMALLFONT}{BLACK}Setzt die Inspektionszeit aller Bahnen{NEWLINE}au STR_5561 :Sprachdatei konnte nicht geladen werden STR_5562 :WARNUNG! STR_5563 :Diese Funktion ist derzeit instabil und mit erhöhter Vorsicht zu verwenden. +STR_5564 :Fehlerhaftes Element einf. +STR_5565 :{SMALLFONT}{BLACK}Fügt ein fehlerhaftes Kartenelement auf der Kachel ein, dadurch werden alle Elemente darüber versteckt. ####################### # Bahnen/Attraktionen # From d2aa7364928da59f8f00c294354079d14d8c33cb Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 8 Nov 2015 03:55:30 +0000 Subject: [PATCH 1000/1173] fix master server communication --- src/network/http.cpp | 4 ++++ src/network/network.cpp | 7 +++---- src/windows/server_list.c | 25 ++++++++++++++++--------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/network/http.cpp b/src/network/http.cpp index 3711694acb..ba6557578c 100644 --- a/src/network/http.cpp +++ b/src/network/http.cpp @@ -69,6 +69,10 @@ http_json_response *http_request_json(const char *url) writeBuffer.length = 0; writeBuffer.capacity = 0; + curl_slist *headers = NULL; + headers = curl_slist_append(headers, "Accept: application/json"); + + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true); curl_easy_setopt(curl, CURLOPT_CAINFO, "curl-ca-bundle.crt"); diff --git a/src/network/network.cpp b/src/network/network.cpp index 4084075d1c..eef553901a 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -615,7 +615,7 @@ void Network::UpdateServer() switch (advertise_status) { case ADVERTISE_STATUS_UNREGISTERED: - if (SDL_TICKS_PASSED(SDL_GetTicks(), last_advertise_time + MASTER_SERVER_REGISTER_TIME)) { + if (last_advertise_time == 0 || SDL_TICKS_PASSED(SDL_GetTicks(), last_advertise_time + MASTER_SERVER_REGISTER_TIME)) { AdvertiseRegister(); } break; @@ -856,7 +856,7 @@ void Network::AdvertiseRegister() // Send the registration request std::string url = GetMasterServerUrl() + std::string("?command=register&port=") + std::to_string(listening_port) - + std::string("key=") + advertise_key; + + std::string("&key=") + advertise_key; http_request_json_async(url.c_str(), [](http_json_response *response) -> void { if (response == NULL) { log_warning("Unable to connect to master server"); @@ -892,8 +892,7 @@ void Network::AdvertiseHeartbeat() // Send the heartbeat request std::string url = GetMasterServerUrl() + std::string("?command=heartbeat&token=") + advertise_token - + std::string("key=") + advertise_key - + std::string("players=") + std::to_string(network_get_num_players()); + + std::string("&players=") + std::to_string(network_get_num_players()); // TODO send status data (e.g. players) via JSON body diff --git a/src/windows/server_list.c b/src/windows/server_list.c index 4201f2eef8..5bbb4bfbff 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -684,32 +684,39 @@ static void fetch_servers_callback(http_json_response* response) return; } - int count = json_array_size(response->root); + int count = json_array_size(jsonServers); for (int i = 0; i < count; i++) { - json_t *server = json_array_get(response->root, i); + json_t *server = json_array_get(jsonServers, i); if (!json_is_object(server)) { continue; } - json_t *address = json_object_get(server, "address"); + json_t *port = json_object_get(server, "port"); json_t *name = json_object_get(server, "name"); + json_t *description = json_object_get(server, "description"); json_t *requiresPassword = json_object_get(server, "requiresPassword"); json_t *version = json_object_get(server, "version"); json_t *players = json_object_get(server, "players"); - json_t *maxplayers = json_object_get(server, "maxPlayers"); - json_t *description = json_object_get(server, "description"); + json_t *maxPlayers = json_object_get(server, "maxPlayers"); + json_t *ip = json_object_get(server, "ip"); + json_t *ip4 = json_object_get(ip, "v4"); + json_t *ip6 = json_object_get(ip, "v6"); + json_t *addressIp = json_array_get(ip4, 0); + + char address[256]; + snprintf(address, sizeof(address), "%s:%d", json_string_value(addressIp), (int)json_integer_value(port)); SDL_LockMutex(_mutex); - saved_server* newserver = add_saved_server((char*)json_string_value(address)); + saved_server* newserver = add_saved_server(address); SafeFree(newserver->name); + SafeFree(newserver->description); + SafeFree(newserver->version); newserver->name = _strdup(json_string_value(name)); newserver->requiresPassword = json_boolean_value(requiresPassword); - SafeFree(newserver->description); newserver->description = _strdup(json_string_value(description)); - SafeFree(newserver->version); newserver->version = _strdup(json_string_value(version)); newserver->players = (uint8)json_integer_value(players); - newserver->maxplayers = (uint8)json_integer_value(maxplayers); + newserver->maxplayers = (uint8)json_integer_value(maxPlayers); SDL_UnlockMutex(_mutex); } http_request_json_dispose(response); From 15f6f9b66a5819577e8b7d10e23de2e4ca5a5583 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 8 Nov 2015 04:10:40 +0000 Subject: [PATCH 1001/1173] remove git merge seperator --- data/language/english_uk.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 1032ba2d42..7dca2507a9 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3899,7 +3899,6 @@ STR_5557 :Stay connected after desynchronisation (Multiplayer) STR_5558 :A restart is required for this setting to take effect STR_5559 :10 min. inspections STR_5560 :{SMALLFONT}{BLACK}Sets the inspection time to 'Every 10 minutes' on all rides -<<<<<<< HEAD STR_5561 :Failed to load language file STR_5562 :WARNING! STR_5563 :This feature is currently unstable, take extra caution. From a1aa08b20942ecd34d52d93ccb86a6d950154849 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sun, 8 Nov 2015 10:06:20 +0100 Subject: [PATCH 1002/1173] Fix #2231 --- data/language/english_uk.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 7dca2507a9..186b6235ee 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3863,8 +3863,8 @@ STR_5521 :{SMALLFONT}{BLACK}Bright purple STR_5522 :{SMALLFONT}{BLACK}Dark blue STR_5523 :{SMALLFONT}{BLACK}Light blue STR_5524 :{SMALLFONT}{BLACK}Icy blue -STR_5525 :{SMALLFONT}{BLACK}Teal -STR_5526 :{SMALLFONT}{BLACK}Aquamarine +STR_5525 :{SMALLFONT}{BLACK}Dark water +STR_5526 :{SMALLFONT}{BLACK}Light water STR_5527 :{SMALLFONT}{BLACK}Saturated green STR_5528 :{SMALLFONT}{BLACK}Dark green STR_5529 :{SMALLFONT}{BLACK}Moss green From 251ee91bf671af1d82eea77ed2867c50fb9491a5 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 8 Nov 2015 09:22:29 +0000 Subject: [PATCH 1003/1173] Fix #2235 anti clockwise no longer crashes Issue cause by %4 not handling negative numbers. --- src/interface/window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/window.c b/src/interface/window.c index 90865813d7..8a4ad7831a 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -1389,7 +1389,7 @@ void window_rotate_camera(rct_window *w, int direction) z = map_element_height(x, y); } - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = (get_current_rotation() + direction) % 4; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = (get_current_rotation() + direction) & 3; int new_x, new_y; center_2d_coordinates(x, y, z, &new_x, &new_y, viewport); From 7a510f76e2272c12d9c2e692ca57e5fa5db7dc69 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 8 Nov 2015 11:07:35 +0100 Subject: [PATCH 1004/1173] Only play message sound in normal playing mode, fixes #2125 --- distribution/changelog.txt | 1 + src/management/news_item.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 2bbdc1ba28..7ad1a06df6 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -50,6 +50,7 @@ - Fix: Underflow in Heartline Twister ratings (original bug). - Fix: Map window now display the usable map size, not the technical one (original bug). - Fix: TD4 River Rapids will now have the correct seat colour (original bug). +- Fix: Message sound will no longer play in the editor modes (original bug). 0.0.2-beta (2015-06-21) ------------------------------------------------------------------------ diff --git a/src/management/news_item.c b/src/management/news_item.c index 044fe600bb..c3e059c761 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -82,7 +82,8 @@ static void news_item_tick_current() { int ticks; ticks = ++news_item_get(0)->ticks; - if (ticks == 1 && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 1)) { + // Only play news item sound when in normal playing mode + if (ticks == 1 && (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) == SCREEN_FLAGS_PLAYING)) { // Play sound sound_play_panned(SOUND_NEWS_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2, 0, 0, 0); } From 4e5b8a1a194653b228d129681f65210b04a79b3a Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 8 Nov 2015 11:46:11 +0100 Subject: [PATCH 1005/1173] Add South Korean Won and Russian Rouble as currencies, closes #2222, also fix #2232 --- data/language/english_uk.txt | 2 ++ src/config.c | 2 ++ src/localisation/currency.c | 22 ++++++++++++---------- src/localisation/currency.h | 3 +++ src/windows/options.c | 9 +++++---- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 7dca2507a9..7bb2fe1e1b 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3915,6 +3915,8 @@ STR_5573 :Remove From Favorites STR_5574 :Server Name: STR_5575 :Max Players: STR_5576 :Port: +STR_5577 :South Korean Won (W) +STR_5578 :Russian Rouble (R) ##################### # Rides/attractions # diff --git a/src/config.c b/src/config.c index 40e83036fa..493e501952 100644 --- a/src/config.c +++ b/src/config.c @@ -124,6 +124,8 @@ config_enum_definition _currencyEnum[] = { { "NLG", CURRENCY_GUILDERS }, { "SEK", CURRENCY_KRONA }, { "EUR", CURRENCY_EUROS }, + { "KRW", CURRENCY_WON }, + { "RUB", CURRENCY_ROUBLE }, END_OF_ENUM }; diff --git a/src/localisation/currency.c b/src/localisation/currency.c index d451a8bc27..b106cba164 100644 --- a/src/localisation/currency.c +++ b/src/localisation/currency.c @@ -21,14 +21,16 @@ #include "currency.h" const rct_currency_spec g_currency_specs[CURRENCY_END] = { - { 10 , "\xC2\xA3" , CURRENCY_PREFIX }, // British Pound - { 10 , "$" , CURRENCY_PREFIX }, // US Dollar - { 10 , "F" , CURRENCY_SUFFIX }, // French Franc - { 10 , "DM" , CURRENCY_PREFIX }, // Deutsche Mark - { 1000 , "\xC2\xA5" , CURRENCY_PREFIX }, // Japanese Yen - { 10 , "Pts" , CURRENCY_SUFFIX }, // Spanish Peseta - { 1000 , "L" , CURRENCY_PREFIX }, // Italian Lira - { 10 , "fl. " , CURRENCY_PREFIX }, // Dutch Guilder - { 10 , "kr." , CURRENCY_SUFFIX }, // Swedish Krona - { 10 , "\xE2\x82\xAC" , CURRENCY_PREFIX }, // Euro + { 10 , "\xC2\xA3" , CURRENCY_PREFIX, 2334 }, // British Pound + { 10 , "$" , CURRENCY_PREFIX, 2335}, // US Dollar + { 10 , "F" , CURRENCY_SUFFIX, 2336 }, // French Franc + { 10 , "DM" , CURRENCY_PREFIX, 2337 }, // Deutsche Mark + { 1000 , "\xC2\xA5" , CURRENCY_PREFIX, 2338 }, // Japanese Yen + { 10 , "Pts" , CURRENCY_SUFFIX, 2339 }, // Spanish Peseta + { 1000 , "L" , CURRENCY_PREFIX, 2340 }, // Italian Lira + { 10 , "fl. " , CURRENCY_PREFIX, 2341 }, // Dutch Guilder + { 10 , "kr." , CURRENCY_SUFFIX, 2342 }, // Swedish Krona + { 10 , "\xE2\x82\xAC" , CURRENCY_PREFIX, 2343 }, // Euro + { 10000 , "W" , CURRENCY_PREFIX, 5577 }, // South Korean Won + { 1000 , "R " , CURRENCY_PREFIX, 5578 }, // Russian Rouble }; diff --git a/src/localisation/currency.h b/src/localisation/currency.h index 9ed73bf71c..4cba80c1c6 100644 --- a/src/localisation/currency.h +++ b/src/localisation/currency.h @@ -35,6 +35,8 @@ typedef enum { CURRENCY_GUILDERS, // Dutch Gilder CURRENCY_KRONA, // Swedish Krona CURRENCY_EUROS, // Euro + CURRENCY_WON, // South Korean Won + CURRENCY_ROUBLE, // Russian Rouble CURRENCY_END // Last item } CURRENCY_TYPE; @@ -52,6 +54,7 @@ typedef struct { int rate; utf8 symbol[CURRENCY_SYMBOL_MAX_SIZE]; int affix; + int stringId; } rct_currency_spec; // List of currency formats diff --git a/src/windows/options.c b/src/windows/options.c index 98c76ca241..4609c5bfe1 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -36,6 +36,7 @@ #include "../interface/viewport.h" #include "../interface/widget.h" #include "../interface/window.h" +#include "../localisation/currency.h" #include "../localisation/date.h" #include "../localisation/localisation.h" #include "../platform/platform.h" @@ -773,14 +774,14 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* window_options_show_dropdown(w, widget, 2); - dropdown_set_checked(gConfigGeneral.show_height_as_units ? 1 : 2, true); + dropdown_set_checked(gConfigGeneral.show_height_as_units ? 0 : 1, true); break; case WIDX_CURRENCY_DROPDOWN: - num_items = 10; + num_items = CURRENCY_END; for (i = 0; i < num_items; i++) { gDropdownItemsFormat[i] = 1142; - gDropdownItemsArgs[i] = STR_POUNDS + i; + gDropdownItemsArgs[i] = g_currency_specs[i].stringId; } window_options_show_dropdown(w, widget, num_items); @@ -1181,7 +1182,7 @@ static void window_options_invalidate(rct_window *w) case WINDOW_OPTIONS_PAGE_CULTURE: // currency: pounds, dollars, etc. (10 total) - RCT2_GLOBAL(0x013CE952 + 12, uint16) = STR_POUNDS + gConfigGeneral.currency_format; + RCT2_GLOBAL(0x013CE952 + 12, uint16) = g_currency_specs[gConfigGeneral.currency_format].stringId; // distance: metric/imperial RCT2_GLOBAL(0x013CE952 + 14, uint16) = STR_IMPERIAL + gConfigGeneral.measurement_format; From ea5282f50870b14b978d315142798ff17614cd26 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 26 Sep 2015 20:17:32 +0200 Subject: [PATCH 1006/1173] Add support for Russian --- src/localisation/language.cpp | 12 ++++++++++-- src/localisation/language.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index eba6a6af0f..678d178e46 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -61,12 +61,19 @@ static TTFFontSetDescriptor TTFFontSimSun = {{ { "simsun.ttc", 13, 1, 0, 20, nullptr }, }}; -static TTFFontSetDescriptor TTFFontMalgun = { { +static TTFFontSetDescriptor TTFFontMalgun = {{ { "malgun.ttf", 8, -1, -3, 6, nullptr }, { "malgun.ttf", 11, 1, -2, 14, nullptr }, { "malgun.ttf", 12, 1, -4, 14, nullptr }, { "malgun.ttf", 13, 1, 0, 20, nullptr }, -} }; +}}; + +static TTFFontSetDescriptor TTFFontArial = {{ + { "arial.ttf", 8, -1, -3, 6, nullptr }, + { "arial.ttf", 11, 1, -2, 14, nullptr }, + { "arial.ttf", 12, 1, -4, 14, nullptr }, + { "arial.ttf", 13, 1, 0, 20, nullptr }, +}}; const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "", "", "", "", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_UNDEFINED @@ -85,6 +92,7 @@ const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "zh-Hans", "Chinese (Simplified)", "Chinese (Simplified)", "chinese_simplified", &TTFFontSimSun, RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED }, // LANGUAGE_CHINESE_SIMPLIFIED { "fi-FI", "Finnish", "Suomi", "finnish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_FINNISH { "kr-KR", "Korean", "Korean", "korean", &TTFFontMalgun, RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN + { "ru-RU", "Russian", "ру́сский язы́к", "russian", &TTFFontArial, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_RUSSIAN }; int gCurrentLanguage = LANGUAGE_UNDEFINED; diff --git a/src/localisation/language.h b/src/localisation/language.h index 4b76850447..9dbb1ff889 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -41,6 +41,7 @@ enum { LANGUAGE_CHINESE_SIMPLIFIED, LANGUAGE_FINNISH, LANGUAGE_KOREAN, + LANUGAGE_RUSSIAN, LANGUAGE_COUNT }; From b7a09cca0c1de89f2d24c301b972514d8c63c652 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 8 Nov 2015 12:26:49 +0100 Subject: [PATCH 1007/1173] Adjust Arial placement and sizes --- src/localisation/language.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index 678d178e46..4ed859df83 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -69,10 +69,10 @@ static TTFFontSetDescriptor TTFFontMalgun = {{ }}; static TTFFontSetDescriptor TTFFontArial = {{ - { "arial.ttf", 8, -1, -3, 6, nullptr }, - { "arial.ttf", 11, 1, -2, 14, nullptr }, - { "arial.ttf", 12, 1, -4, 14, nullptr }, - { "arial.ttf", 13, 1, 0, 20, nullptr }, + { "arial.ttf", 8, 0, -1, 6, nullptr }, + { "arial.ttf", 10, 0, -1, 12, nullptr }, + { "arial.ttf", 11, 0, -1, 12, nullptr }, + { "arial.ttf", 12, 0, -1, 20, nullptr }, }}; const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { @@ -87,12 +87,12 @@ const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "es-ES", "Spanish", "Espa\xC3\xB1ol", "spanish_sp", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_SPANISH }, // LANGUAGE_SPANISH { "sv-SE", "Swedish", "Svenska", "swedish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_SWEDISH }, // LANGUAGE_SWEDISH { "it-IT", "Italian", "Italiano", "italian", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ITALIAN }, // LANGUAGE_ITALIAN - { "pt-BR", "Portuguese (BR)", "Portugu\xC3\xAAs (BR)", "portuguese_br", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_PORTUGUESE }, // LANGUAGE_PORTUGUESE_BR + { "pt-BR", "Portuguese (BR)", "Portugu\xC3\xAAs (BR)", "portuguese_br", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_PORTUGUESE }, // LANGUAGE_PORTUGUESE_BR { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", &TTFFontMingLiu, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL { "zh-Hans", "Chinese (Simplified)", "Chinese (Simplified)", "chinese_simplified", &TTFFontSimSun, RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED }, // LANGUAGE_CHINESE_SIMPLIFIED { "fi-FI", "Finnish", "Suomi", "finnish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_FINNISH { "kr-KR", "Korean", "Korean", "korean", &TTFFontMalgun, RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN - { "ru-RU", "Russian", "ру́сский язы́к", "russian", &TTFFontArial, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_RUSSIAN + { "ru-RU", "Russian", "Russian", "russian", &TTFFontArial, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_RUSSIAN }; int gCurrentLanguage = LANGUAGE_UNDEFINED; From eed070bde016be3ce7f9a410cf134fcf0380f656 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 8 Nov 2015 12:41:55 +0100 Subject: [PATCH 1008/1173] Use string IDs for all currencies --- src/localisation/currency.c | 25 +++++++++++++------------ src/localisation/string_ids.h | 3 +++ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/localisation/currency.c b/src/localisation/currency.c index b106cba164..1411e21491 100644 --- a/src/localisation/currency.c +++ b/src/localisation/currency.c @@ -19,18 +19,19 @@ *****************************************************************************/ #include "currency.h" +#include "string_ids.h" const rct_currency_spec g_currency_specs[CURRENCY_END] = { - { 10 , "\xC2\xA3" , CURRENCY_PREFIX, 2334 }, // British Pound - { 10 , "$" , CURRENCY_PREFIX, 2335}, // US Dollar - { 10 , "F" , CURRENCY_SUFFIX, 2336 }, // French Franc - { 10 , "DM" , CURRENCY_PREFIX, 2337 }, // Deutsche Mark - { 1000 , "\xC2\xA5" , CURRENCY_PREFIX, 2338 }, // Japanese Yen - { 10 , "Pts" , CURRENCY_SUFFIX, 2339 }, // Spanish Peseta - { 1000 , "L" , CURRENCY_PREFIX, 2340 }, // Italian Lira - { 10 , "fl. " , CURRENCY_PREFIX, 2341 }, // Dutch Guilder - { 10 , "kr." , CURRENCY_SUFFIX, 2342 }, // Swedish Krona - { 10 , "\xE2\x82\xAC" , CURRENCY_PREFIX, 2343 }, // Euro - { 10000 , "W" , CURRENCY_PREFIX, 5577 }, // South Korean Won - { 1000 , "R " , CURRENCY_PREFIX, 5578 }, // Russian Rouble + { 10 , "\xC2\xA3" , CURRENCY_PREFIX, STR_POUNDS }, // British Pound + { 10 , "$" , CURRENCY_PREFIX, STR_DOLLARS}, // US Dollar + { 10 , "F" , CURRENCY_SUFFIX, STR_FRANC }, // French Franc + { 10 , "DM" , CURRENCY_PREFIX, STR_DEUTSCHMARK }, // Deutschmark + { 1000 , "\xC2\xA5" , CURRENCY_PREFIX, STR_YEN }, // Japanese Yen + { 10 , "Pts" , CURRENCY_SUFFIX, STR_PESETA }, // Spanish Peseta + { 1000 , "L" , CURRENCY_PREFIX, STR_LIRA }, // Italian Lira + { 10 , "fl. " , CURRENCY_PREFIX, STR_GUILDERS }, // Dutch Guilder + { 10 , "kr." , CURRENCY_SUFFIX, STR_KRONA }, // Swedish Krona + { 10 , "\xE2\x82\xAC" , CURRENCY_PREFIX, STR_EUROS }, // Euro + { 10000 , "W" , CURRENCY_PREFIX, STR_WON }, // South Korean Won + { 1000 , "R " , CURRENCY_PREFIX, STR_ROUBLE }, // Russian Rouble }; diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index c6192a913a..1091f29339 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2166,6 +2166,9 @@ enum { STR_MAX_PLAYERS = 5575, STR_PORT = 5576, + STR_WON = 5577, + STR_ROUBLE = 5578, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; From 6413052cbb6cf56f706e11f9a0b20862692b4e38 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 8 Nov 2015 12:49:25 +0100 Subject: [PATCH 1009/1173] Use language codes for Korean and Russian --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index 40e83036fa..11a5175fe2 100644 --- a/src/config.c +++ b/src/config.c @@ -142,6 +142,8 @@ config_enum_definition _languageEnum[] = { { "zh-Hant", LANGUAGE_CHINESE_TRADITIONAL }, { "zh-Hans", LANGUAGE_CHINESE_SIMPLIFIED }, { "fi-FI", LANGUAGE_FINNISH }, + { "ko", LANGUAGE_KOREAN }, + { "ru-RU", LANUGAGE_RUSSIAN }, END_OF_ENUM }; From 4855a53c224da0a6de1d785dc11942b3600fcc0c Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sun, 8 Nov 2015 13:11:36 +0100 Subject: [PATCH 1010/1173] Correct two instances of American spelling --- data/language/english_uk.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 7dca2507a9..7ac48f46d6 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3910,8 +3910,8 @@ STR_5568 :Password Required STR_5569 :This server requires a password STR_5570 :Fetch Servers STR_5571 :Join Game -STR_5572 :Add To Favorites -STR_5573 :Remove From Favorites +STR_5572 :Add To Favourites +STR_5573 :Remove From Favourites STR_5574 :Server Name: STR_5575 :Max Players: STR_5576 :Port: From e1b67eeda088d59b94db40c59b0eb35b5e44a998 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 8 Nov 2015 12:49:19 +0000 Subject: [PATCH 1011/1173] improve command line version information and add headless check --- src/cmdline.c | 40 +++++++++++++++++++++++++++++++--------- src/input.c | 4 ++++ src/openrct2.c | 24 ++++++++++++++++++++++++ src/openrct2.h | 1 + src/title.c | 20 +++++--------------- 5 files changed, 65 insertions(+), 24 deletions(-) diff --git a/src/cmdline.c b/src/cmdline.c index 49f8c4adaa..9f7a45427d 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -53,6 +53,7 @@ int gNetworkStartPort = NETWORK_DEFAULT_PORT; #endif // DISABLE_NETWORK static void print_launch_information(); +static void print_version(); static int cmdline_call_action(const char **argv, int argc); static const char *const usage[] = { @@ -92,7 +93,7 @@ int cmdline_run(const char **argv, int argc) argc = argparse_parse(&argparse, argc, argv); if (version) { - print_launch_information(); + print_version(); return 0; } @@ -120,34 +121,55 @@ int cmdline_run(const char **argv, int argc) if (argc != 0) { gExitCode = cmdline_call_action(argv, argc); - if (gExitCode != 0) + if (gExitCode != 0) { return 0; + } } - print_launch_information(); + // Headless mode requires a park to open + if (gOpenRCT2Headless) { + if (str_is_null_or_empty(gOpenRCT2StartupActionPath)) { + printf("You must specify a park to open in headless mode.\n"); + gExitCode = -1; + return 0; + } + } + + if (verbose) { + print_launch_information(); + } return 1; } static void print_launch_information() { - char buffer[32]; + char buffer[256]; time_t timer; tm_t* tmInfo; - // Print version information - printf("Starting %s v%s\n", OPENRCT2_NAME, OPENRCT2_VERSION); - printf(" %s (%s)\n", OPENRCT2_PLATFORM, OPENRCT2_ARCHITECTURE); - printf(" %s\n\n", OPENRCT2_TIMESTAMP); + // Print name and version information + openrct2_write_full_version_info(buffer, sizeof(buffer)); + printf("%s\n", buffer); + printf("%s (%s)\n", OPENRCT2_PLATFORM, OPENRCT2_ARCHITECTURE); + printf("@ %s\n\n", OPENRCT2_TIMESTAMP); // Print current time time(&timer); tmInfo = localtime(&timer); strftime(buffer, sizeof(buffer), "%Y/%m/%d %H:%M:%S", tmInfo); - printf("Time: %s\n", buffer); + printf("VERBOSE: time is %s\n", buffer); // TODO Print other potential information (e.g. user, hardware) } +static void print_version() +{ + char buffer[256]; + openrct2_write_full_version_info(buffer, sizeof(buffer)); + printf("%s\n", buffer); + printf("%s (%s)\n", OPENRCT2_PLATFORM, OPENRCT2_ARCHITECTURE); +} + static int cmdline_for_intro(const char **argv, int argc) { gOpenRCT2StartupAction = STARTUP_ACTION_INTRO; diff --git a/src/input.c b/src/input.c index cee459a73f..b8752736b9 100644 --- a/src/input.c +++ b/src/input.c @@ -1292,6 +1292,10 @@ void title_handle_keyboard_input() rct_window *w; int key; + if (gOpenRCT2Headless) { + return; + } + if (!gConsoleOpen) { // Handle modifier keys and key scrolling RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) = 0; diff --git a/src/openrct2.c b/src/openrct2.c index 60254b563c..483f0533f2 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -76,6 +76,30 @@ static bool openrct2_setup_rct2_segment(); static bool openrct2_release_rct2_segment(); static void openrct2_setup_rct2_hooks(); +void openrct2_write_full_version_info(utf8 *buffer, size_t bufferSize) +{ + utf8 *ch = buffer; + + // Name and version + strcpy(ch, OPENRCT2_NAME); + strcat(buffer, ", v"); + strcat(buffer, OPENRCT2_VERSION); + + // Build information + if (!str_is_null_or_empty(OPENRCT2_BRANCH)) { + sprintf(strchr(buffer, 0), "-%s", OPENRCT2_BRANCH); + } + if (!str_is_null_or_empty(OPENRCT2_BUILD_NUMBER)) { + sprintf(strchr(buffer, 0), " build %s", OPENRCT2_BUILD_NUMBER); + } + if (!str_is_null_or_empty(OPENRCT2_COMMIT_SHA1_SHORT)) { + sprintf(strchr(buffer, 0), " (%s)", OPENRCT2_COMMIT_SHA1_SHORT); + } + if (!str_is_null_or_empty(OPENRCT2_BUILD_SERVER)) { + sprintf(strchr(buffer, 0), " provided by %s", OPENRCT2_BUILD_SERVER); + } +} + static void openrct2_copy_files_over(const utf8 *originalDirectory, const utf8 *newDirectory, const utf8 *extension) { utf8 *ch, filter[MAX_PATH], oldPath[MAX_PATH], newPath[MAX_PATH]; diff --git a/src/openrct2.h b/src/openrct2.h index 73fe12f0e8..4642985872 100644 --- a/src/openrct2.h +++ b/src/openrct2.h @@ -37,6 +37,7 @@ extern utf8 gCustomUserDataPath[MAX_PATH]; extern bool gOpenRCT2Headless; extern bool gOpenRCT2ShowChangelog; +void openrct2_write_full_version_info(utf8 *buffer, size_t bufferSize); bool openrct2_initialise(); void openrct2_launch(); void openrct2_dispose(); diff --git a/src/title.c b/src/title.c index 87bf86ca92..56bb9e1265 100644 --- a/src/title.c +++ b/src/title.c @@ -460,30 +460,20 @@ static void title_update_showcase() void DrawOpenRCT2(int x, int y) { - char buffer[256]; + utf8 buffer[256]; rct_drawpixelinfo *dpi = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo); // Draw background gfx_fill_rect_inset(dpi, x, y, x + 128, y + 20, 0x80 | 12, 0x8); - // Format text (name and version) - char *ch = buffer;; + // Write format codes + utf8 *ch = buffer; ch = utf8_write_codepoint(ch, FORMAT_MEDIUMFONT); ch = utf8_write_codepoint(ch, FORMAT_OUTLINE); ch = utf8_write_codepoint(ch, FORMAT_WHITE); - strcpy(ch, OPENRCT2_NAME); - strcat(buffer, ", v"); - strcat(buffer, OPENRCT2_VERSION); - // sprintf(buffer, "%c%c%c%s, v%s", FORMAT_MEDIUMFONT, FORMAT_OUTLINE, FORMAT_WHITE, OPENRCT2_NAME, OPENRCT2_VERSION); - if (!str_is_null_or_empty(OPENRCT2_BRANCH)) - sprintf(strchr(buffer, 0), "-%s", OPENRCT2_BRANCH); - if (!str_is_null_or_empty(OPENRCT2_BUILD_NUMBER)) - sprintf(strchr(buffer, 0), " build %s", OPENRCT2_BUILD_NUMBER); - if (!str_is_null_or_empty(OPENRCT2_COMMIT_SHA1_SHORT)) - sprintf(strchr(buffer, 0), " (%s)", OPENRCT2_COMMIT_SHA1_SHORT); - if (!str_is_null_or_empty(OPENRCT2_BUILD_SERVER)) - sprintf(strchr(buffer, 0), " provided by %s", OPENRCT2_BUILD_SERVER); + // Write name and version information + openrct2_write_full_version_info(ch, sizeof(buffer) - (ch - buffer)); // Draw Text gfx_draw_string(dpi, buffer, 0, x + 5, y + 5); From e749c1a82cb950d0ad1f7b70af26fc3fe8c4a19b Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 8 Nov 2015 14:55:01 +0100 Subject: [PATCH 1012/1173] Identify RIDE_ENTRY_FLAG_15 and 17, fix 'Show all operating modes' cheat --- src/ride/ride.c | 6 +++--- src/ride/ride.h | 4 ++-- src/ride/ride_data.c | 2 +- src/windows/ride.c | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index d5e34f6b84..385a89bf3d 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3619,7 +3619,7 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * rct_ride_type* ride_entry = GET_RIDE_ENTRY(ride->subtype); const uint8* available_modes = ride_seek_available_modes(ride); - if (ride_entry->flags & RIDE_ENTRY_FLAG_17){ + if ((ride_entry->flags & RIDE_ENTRY_DISABLE_FIRST_TWO_OPERATING_MODES) && !gCheatsShowAllOperatingModes){ available_modes += 2; } @@ -3632,7 +3632,7 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * if (*available_modes == 0xFF) new_value = default_mode; if (available_modes[1] == 0xFF){ - if (ride_entry->flags & RIDE_ENTRY_FLAG_15) + if ((ride_entry->flags & RIDE_ENTRY_HIDE_LAST_OPERATING_MODE) && !gCheatsShowAllOperatingModes) new_value = default_mode; } @@ -5104,7 +5104,7 @@ static int ride_get_default_mode(rct_ride *ride) for (int i = 0; i < ride->type; i++) { while (*(availableModes++) != 255) {} } - if (rideEntry->flags & RIDE_ENTRY_FLAG_17) { + if (rideEntry->flags & RIDE_ENTRY_DISABLE_FIRST_TWO_OPERATING_MODES) { availableModes += 2; } return availableModes[0]; diff --git a/src/ride/ride.h b/src/ride/ride.h index a94d6f74ad..3dd78aa4dc 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -393,9 +393,9 @@ enum { RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME = 1 << 12, // 0x1000 RIDE_ENTRY_FLAG_SEPARATE_RIDE = 1 << 13, // 0x2000 RIDE_ENTRY_FLAG_14 = 1 << 14, // 0x4000 - RIDE_ENTRY_FLAG_15 = 1 << 15, // 0x8000 + RIDE_ENTRY_HIDE_LAST_OPERATING_MODE = 1 << 15, // 0x8000 RIDE_ENTRY_FLAG_16 = 1 << 16, // 0x10000 - RIDE_ENTRY_FLAG_17 = 1 << 17, // 0x20000 + RIDE_ENTRY_DISABLE_FIRST_TWO_OPERATING_MODES = 1 << 17, // 0x20000 RIDE_ENTRY_FLAG_18 = 1 << 18, // 0x40000 RIDE_ENTRY_FLAG_19 = 1 << 19, // 0x80000 RIDE_ENTRY_FLAG_20 = 1 << 20, // 0x100000 diff --git a/src/ride/ride_data.c b/src/ride/ride_data.c index 41cfe8ac47..c7cc940212 100644 --- a/src/ride/ride_data.c +++ b/src/ride/ride_data.c @@ -775,7 +775,7 @@ const uint8 RideAvailableModes[] = { }; const uint8 AllRideModesAvailable[] = { - RIDE_MODE_NORMAL, RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE, RIDE_MODE_POWERED_LAUNCH_PASSTROUGH, RIDE_MODE_SHUTTLE, RIDE_MODE_BOAT_HIRE, RIDE_MODE_UPWARD_LAUNCH, RIDE_MODE_ROTATING_LIFT, RIDE_MODE_STATION_TO_STATION, RIDE_MODE_SINGLE_RIDE_PER_ADMISSION, RIDE_MODE_UNLIMITED_RIDES_PER_ADMISSION, RIDE_MODE_MAZE, RIDE_MODE_RACE, RIDE_MODE_BUMPERCAR, RIDE_MODE_SWING, RIDE_MODE_SHOP_STALL, RIDE_MODE_ROTATION, RIDE_MODE_FORWARD_ROTATION, RIDE_MODE_BACKWARD_ROTATION, RIDE_MODE_FILM_AVENGING_AVIATORS, RIDE_MODE_3D_FILM_MOUSE_TAILS, RIDE_MODE_SPACE_RINGS, RIDE_MODE_BEGINNERS, RIDE_MODE_LIM_POWERED_LAUNCH, RIDE_MODE_FILM_THRILL_RIDERS, RIDE_MODE_3D_FILM_STORM_CHASERS, RIDE_MODE_3D_FILM_SPACE_RAIDERS, RIDE_MODE_INTENSE, RIDE_MODE_BERSERK, RIDE_MODE_HAUNTED_HOUSE, RIDE_MODE_CIRCUS_SHOW, RIDE_MODE_DOWNWARD_LAUNCH, RIDE_MODE_CROOKED_HOUSE, RIDE_MODE_FREEFALL_DROP, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, RIDE_MODE_POWERED_LAUNCH, RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED, 0xFF + RIDE_MODE_CONTINUOUS_CIRCUIT, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE, RIDE_MODE_POWERED_LAUNCH_PASSTROUGH, RIDE_MODE_SHUTTLE, RIDE_MODE_NORMAL, RIDE_MODE_BOAT_HIRE, RIDE_MODE_UPWARD_LAUNCH, RIDE_MODE_ROTATING_LIFT, RIDE_MODE_STATION_TO_STATION, RIDE_MODE_SINGLE_RIDE_PER_ADMISSION, RIDE_MODE_UNLIMITED_RIDES_PER_ADMISSION, RIDE_MODE_MAZE, RIDE_MODE_RACE, RIDE_MODE_BUMPERCAR, RIDE_MODE_SWING, RIDE_MODE_SHOP_STALL, RIDE_MODE_ROTATION, RIDE_MODE_FORWARD_ROTATION, RIDE_MODE_BACKWARD_ROTATION, RIDE_MODE_FILM_AVENGING_AVIATORS, RIDE_MODE_3D_FILM_MOUSE_TAILS, RIDE_MODE_SPACE_RINGS, RIDE_MODE_BEGINNERS, RIDE_MODE_LIM_POWERED_LAUNCH, RIDE_MODE_FILM_THRILL_RIDERS, RIDE_MODE_3D_FILM_STORM_CHASERS, RIDE_MODE_3D_FILM_SPACE_RAIDERS, RIDE_MODE_INTENSE, RIDE_MODE_BERSERK, RIDE_MODE_HAUNTED_HOUSE, RIDE_MODE_CIRCUS_SHOW, RIDE_MODE_DOWNWARD_LAUNCH, RIDE_MODE_CROOKED_HOUSE, RIDE_MODE_FREEFALL_DROP, RIDE_MODE_POWERED_LAUNCH, RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED, 0xFF }; const uint8 RideAvailableBreakdowns[] = { diff --git a/src/windows/ride.c b/src/windows/ride.c index 4032b18685..fff4c49b67 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -2793,12 +2793,12 @@ static void window_ride_mode_dropdown(rct_window *w, rct_widget *widget) numAvailableModes++; } while (*(mode++) != 255); - // ? - if (rideEntry->flags & RIDE_ENTRY_FLAG_15) + // Hide the last operating mode if the vehicle is not intended for it. + if (rideEntry->flags & RIDE_ENTRY_HIDE_LAST_OPERATING_MODE && !gCheatsShowAllOperatingModes) numAvailableModes--; - // ? - if (rideEntry->flags & RIDE_ENTRY_FLAG_17) { + // If the vehicle is not intended for them, hide those two modes (these are usually (or perhaps always) both continuous circuit modes). + if ((rideEntry->flags & RIDE_ENTRY_DISABLE_FIRST_TWO_OPERATING_MODES) && !gCheatsShowAllOperatingModes) { availableModes += 2; numAvailableModes -= 2; } From 4ba83b041849e652077c8031f6b151dd4caef38d Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 8 Nov 2015 15:01:40 +0100 Subject: [PATCH 1013/1173] Rename RIDE_ENTRY_HIDE_LAST_OPERATING_MODE to RIDE_ENTRY_DISABLE_LAST_OPERATING_MODE --- src/ride/ride.c | 2 +- src/ride/ride.h | 2 +- src/windows/ride.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 385a89bf3d..f71d2fe8f2 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3632,7 +3632,7 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * if (*available_modes == 0xFF) new_value = default_mode; if (available_modes[1] == 0xFF){ - if ((ride_entry->flags & RIDE_ENTRY_HIDE_LAST_OPERATING_MODE) && !gCheatsShowAllOperatingModes) + if ((ride_entry->flags & RIDE_ENTRY_DISABLE_LAST_OPERATING_MODE) && !gCheatsShowAllOperatingModes) new_value = default_mode; } diff --git a/src/ride/ride.h b/src/ride/ride.h index 3dd78aa4dc..a54a49b105 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -393,7 +393,7 @@ enum { RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME = 1 << 12, // 0x1000 RIDE_ENTRY_FLAG_SEPARATE_RIDE = 1 << 13, // 0x2000 RIDE_ENTRY_FLAG_14 = 1 << 14, // 0x4000 - RIDE_ENTRY_HIDE_LAST_OPERATING_MODE = 1 << 15, // 0x8000 + RIDE_ENTRY_DISABLE_LAST_OPERATING_MODE = 1 << 15, // 0x8000 RIDE_ENTRY_FLAG_16 = 1 << 16, // 0x10000 RIDE_ENTRY_DISABLE_FIRST_TWO_OPERATING_MODES = 1 << 17, // 0x20000 RIDE_ENTRY_FLAG_18 = 1 << 18, // 0x40000 diff --git a/src/windows/ride.c b/src/windows/ride.c index fff4c49b67..b04e0f2cb7 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -2794,7 +2794,7 @@ static void window_ride_mode_dropdown(rct_window *w, rct_widget *widget) } while (*(mode++) != 255); // Hide the last operating mode if the vehicle is not intended for it. - if (rideEntry->flags & RIDE_ENTRY_HIDE_LAST_OPERATING_MODE && !gCheatsShowAllOperatingModes) + if (rideEntry->flags & RIDE_ENTRY_DISABLE_LAST_OPERATING_MODE && !gCheatsShowAllOperatingModes) numAvailableModes--; // If the vehicle is not intended for them, hide those two modes (these are usually (or perhaps always) both continuous circuit modes). From ab8edaca16bc704674e835ad4791a3bc74fe8cb9 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sun, 8 Nov 2015 15:08:43 +0100 Subject: [PATCH 1014/1173] Update changelog --- distribution/changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 7ad1a06df6..37a315ef8e 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -28,6 +28,8 @@ - Feature: Custom user data path specified by command line argument. - Feature: Full UTF-8 language support. - Feature: TTF font integration for non-Latin languages. +- Feature: Added support for Traditional Chinese, Simplified Chinese, Korean, Russian, Finnish and Brazilian Portuguese. +- Feature: Added South Korean Won and Russian Rouble as currencies. - Feature: Allow different date formats. - Feature: Option to automatically pause the game on minimise from fullscreen. - Feature: Option to automatically pause when Steam overlay is activated. From 6fe2340dfe24edadcfb3da189e026be8144a6e79 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 8 Nov 2015 14:32:22 +0000 Subject: [PATCH 1015/1173] stop clients from pausing multiplayer games --- src/network/network.cpp | 13 +++++++++++-- src/windows/top_toolbar.c | 4 +++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index eef553901a..458cb0cfe4 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -1360,8 +1360,17 @@ int Network::Server_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& playerid = connection.player->id; } packet >> tick >> args[0] >> args[1] >> args[2] >> args[3] >> args[4] >> args[5] >> args[6] >> callback; - Server_Send_GAMECMD(args[0], args[1], args[2], args[3], args[4], args[5], args[6], playerid, callback); - game_do_command(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + + int commandCommand = args[4]; + + // Don't let clients send pause or quit + if (commandCommand != GAME_COMMAND_TOGGLE_PAUSE && + commandCommand != GAME_COMMAND_LOAD_OR_QUIT + ) { + Server_Send_GAMECMD(args[0], args[1], args[2], args[3], args[4], args[5], args[6], playerid, callback); + game_do_command(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + return 1; } diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 7366514a26..28d63574ad 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -286,7 +286,9 @@ static void window_top_toolbar_mouseup(rct_window *w, int widgetIndex) switch (widgetIndex) { case WIDX_PAUSE: - game_do_command(0, 1, 0, 0, GAME_COMMAND_TOGGLE_PAUSE, 0, 0); + if (network_get_mode() != NETWORK_MODE_CLIENT) { + game_do_command(0, 1, 0, 0, GAME_COMMAND_TOGGLE_PAUSE, 0, 0); + } break; case WIDX_ZOOM_OUT: if ((mainWindow = window_get_main()) != NULL) From 12a6ec2fef2b42a558035e70289c21f24dc9c122 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 8 Nov 2015 15:01:30 +0000 Subject: [PATCH 1016/1173] stop desynchronisation when placing scenery, fixes #2111 --- src/windows/top_toolbar.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 28d63574ad..62a655506f 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -1116,7 +1116,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin uint8 rotation = window_scenery_rotation; if (!(scenery->small_scenery.flags & SMALL_SCENERY_FLAG4)){ - rotation = scenario_rand() & 0xFF; + rotation = rand() & 0xFF; } rotation -= get_current_rotation(); @@ -1194,7 +1194,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin uint8 rotation = window_scenery_rotation; if (!(scenery->small_scenery.flags & SMALL_SCENERY_FLAG4)){ - rotation = scenario_rand() & 0xFF; + rotation = rand() & 0xFF; } rotation -= get_current_rotation(); @@ -1440,11 +1440,11 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (window_scenery_is_build_cluster_tool_on){ if (!(scenery->small_scenery.flags & SMALL_SCENERY_FLAG_FULL_TILE)){ parameter_2 &= 0xFF00; - parameter_2 |= scenario_rand() & 3; + parameter_2 |= rand() & 3; } - cur_grid_x += ((scenario_rand() % 16) - 8) * 32; - cur_grid_y += ((scenario_rand() % 16) - 8) * 32; + cur_grid_x += ((rand() % 16) - 8) * 32; + cur_grid_y += ((rand() % 16) - 8) * 32; if (!(scenery->small_scenery.flags & SMALL_SCENERY_FLAG4)){ RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint16)++; From 141705fe6b88e6ae8afcc379f934cab855de252e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 8 Nov 2015 15:14:36 +0000 Subject: [PATCH 1017/1173] disable peep watching thought for multiplayer as its client specific --- src/windows/guest.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/windows/guest.c b/src/windows/guest.c index 5a28c7e974..f52c018e41 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -23,6 +23,7 @@ #include "../game.h" #include "../input.h" #include "../management/marketing.h" +#include "../network/network.h" #include "../peep/peep.h" #include "../peep/staff.h" #include "../ride/ride.h" @@ -1083,13 +1084,16 @@ void window_guest_overview_update(rct_window* w){ else w->var_494++; - // Create the "I have the strangest feeling I am being watched thought" - if ((w->var_494 & 0xFFFF) >= 3840){ - if (!(w->var_494 & 0x3FF)){ - int rand = scenario_rand() & 0xFFFF; - if (rand <= 0x2AAA){ - rct_peep* peep = GET_PEEP(w->number); - peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_WATCHED, 0xFF); + // Disable peep watching thought for multiplayer as its client specific + if (network_get_mode() == NETWORK_MODE_NONE) { + // Create the "I have the strangest feeling I am being watched thought" + if ((w->var_494 & 0xFFFF) >= 3840) { + if (!(w->var_494 & 0x3FF)) { + int random = rand() & 0xFFFF; + if (random <= 0x2AAA) { + rct_peep* peep = GET_PEEP(w->number); + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_WATCHED, 0xFF); + } } } } From b929a27595b75d56d29818eaa8c4af22fd13ba55 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Sun, 8 Nov 2015 18:21:55 +0100 Subject: [PATCH 1018/1173] Fixed filenames with dots not being displayed completely. --- src/windows/loadsave.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index c3594396da..6ff5903820 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -600,7 +600,7 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co file_info fileInfo; loadsave_list_item *listItem; const char *src; - char *dst, filter[MAX_PATH], subDir[MAX_PATH]; + char *dst, *last_dot_in_filename, filter[MAX_PATH], subDir[MAX_PATH]; safe_strncpy(_directory, directory, sizeof(_directory)); if (_extension != extension) { @@ -701,12 +701,14 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co src = fileInfo.path; dst = listItem->name; + last_dot_in_filename = strrchr(fileInfo.path, '.'); + assert(last_dot_in_filename != NULL); i = 0; - while (*src != 0 && *src != '.' && i < sizeof(listItem->name) - 1) { + while (src < last_dot_in_filename && i < sizeof(listItem->name) - 1) { *dst++ = *src++; i++; } - *dst = 0; + *dst = '\0'; _listItemsCount++; } From 442cfef887497f89d3197892dbab996e1e505af1 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 8 Nov 2015 17:31:46 +0000 Subject: [PATCH 1019/1173] fix #2230, scroll bar colour issues --- src/interface/widget.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/interface/widget.c b/src/interface/widget.c index 801c5621e4..1142e055c1 100644 --- a/src/interface/widget.c +++ b/src/interface/widget.c @@ -853,12 +853,12 @@ static void widget_hscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i { colour &= 0x7F; // Trough - gfx_fill_rect(dpi, l + 10, t, r - 10, b, *((char*)(0x0141FC4B + (colour * 8)))); - gfx_fill_rect(dpi, l + 10, t, r - 10, b, 0x1000000 | *((char*)(0x0141FC47 + (colour * 8)))); - gfx_fill_rect(dpi, l + 10, t + 2, r - 10, t + 2, *((char*)(0x0141FC47 + (colour * 8)))); - gfx_fill_rect(dpi, l + 10, t + 3, r - 10, t + 3, *((char*)(0x0141FC4B + (colour * 8)))); - gfx_fill_rect(dpi, l + 10, t + 7, r - 10, t + 7, *((char*)(0x0141FC47 + (colour * 8)))); - gfx_fill_rect(dpi, l + 10, t + 8, r - 10, t + 8, *((char*)(0x0141FC4B + (colour * 8)))); + gfx_fill_rect(dpi, l + 10, t, r - 10, b, *((uint8*)(0x0141FC4B + (colour * 8)))); + gfx_fill_rect(dpi, l + 10, t, r - 10, b, 0x1000000 | *((uint8*)(0x0141FC47 + (colour * 8)))); + gfx_fill_rect(dpi, l + 10, t + 2, r - 10, t + 2, *((uint8*)(0x0141FC47 + (colour * 8)))); + gfx_fill_rect(dpi, l + 10, t + 3, r - 10, t + 3, *((uint8*)(0x0141FC4B + (colour * 8)))); + gfx_fill_rect(dpi, l + 10, t + 7, r - 10, t + 7, *((uint8*)(0x0141FC47 + (colour * 8)))); + gfx_fill_rect(dpi, l + 10, t + 8, r - 10, t + 8, *((uint8*)(0x0141FC4B + (colour * 8)))); // Left button gfx_fill_rect_inset(dpi, l, t, l + 9, b, colour, (scroll->flags & HSCROLLBAR_LEFT_PRESSED ? 0x20 : 0)); @@ -879,12 +879,12 @@ static void widget_vscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i { colour &= 0x7F; // Trough - gfx_fill_rect(dpi, l, t + 10, r, b - 10, *((char*)(0x0141FC4B + (colour * 8)))); - gfx_fill_rect(dpi, l, t + 10, r, b - 10, 0x1000000 | *((char*)(0x0141FC47 + (colour * 8)))); - gfx_fill_rect(dpi, l + 2, t + 10, l + 2, b - 10, *((char*)(0x0141FC47 + (colour * 8)))); - gfx_fill_rect(dpi, l + 3, t + 10, l + 3, b - 10, *((char*)(0x0141FC4B + (colour * 8)))); - gfx_fill_rect(dpi, l + 7, t + 10, l + 7, b - 10, *((char*)(0x0141FC47 + (colour * 8)))); - gfx_fill_rect(dpi, l + 8, t + 10, l + 8, b - 10, *((char*)(0x0141FC4B + (colour * 8)))); + gfx_fill_rect(dpi, l, t + 10, r, b - 10, *((uint8*)(0x0141FC4B + (colour * 8)))); + gfx_fill_rect(dpi, l, t + 10, r, b - 10, 0x1000000 | *((uint8*)(0x0141FC47 + (colour * 8)))); + gfx_fill_rect(dpi, l + 2, t + 10, l + 2, b - 10, *((uint8*)(0x0141FC47 + (colour * 8)))); + gfx_fill_rect(dpi, l + 3, t + 10, l + 3, b - 10, *((uint8*)(0x0141FC4B + (colour * 8)))); + gfx_fill_rect(dpi, l + 7, t + 10, l + 7, b - 10, *((uint8*)(0x0141FC47 + (colour * 8)))); + gfx_fill_rect(dpi, l + 8, t + 10, l + 8, b - 10, *((uint8*)(0x0141FC4B + (colour * 8)))); // Up button gfx_fill_rect_inset(dpi, l, t, r, t + 9, colour, (scroll->flags & VSCROLLBAR_UP_PRESSED ? 0x20 : 0)); From 48e3d70e578c72bc93e42dde9b13432847e3aeb6 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 8 Nov 2015 18:55:32 +0000 Subject: [PATCH 1020/1173] refactor colour maps --- projects/colour.c | 1 + projects/openrct2.vcxproj | 1 + projects/openrct2.vcxproj.filters | 3 ++ src/drawing/rect.c | 21 +++++----- src/drawing/scrolling_text.c | 11 ++++-- src/drawing/string.c | 15 +++---- src/interface/colour.c | 25 ++++++++++++ src/interface/colour.h | 31 +++++++++++++++ src/interface/viewport.c | 17 ++------ src/interface/widget.c | 54 +++++++++++++------------- src/interface/window.h | 1 + src/windows/dropdown.c | 6 +-- src/windows/editor_inventions_list.c | 4 +- src/windows/editor_object_selection.c | 4 +- src/windows/editor_objective_options.c | 2 +- src/windows/finances.c | 2 +- src/windows/guest.c | 2 +- src/windows/guest_list.c | 2 +- src/windows/install_track.c | 2 +- src/windows/loadsave.c | 2 +- src/windows/new_ride.c | 2 +- src/windows/player_list.c | 2 +- src/windows/ride_list.c | 2 +- src/windows/scenery.c | 2 +- src/windows/server_list.c | 2 +- src/windows/shortcut_keys.c | 2 +- src/windows/staff_list.c | 2 +- src/windows/text_input.c | 2 +- src/windows/themes.c | 8 ++-- src/windows/tile_inspector.c | 2 +- src/windows/title_editor.c | 14 +++---- src/windows/title_scenarioselect.c | 2 +- src/windows/track_list.c | 4 +- 33 files changed, 154 insertions(+), 98 deletions(-) create mode 100644 projects/colour.c create mode 100644 src/interface/colour.c diff --git a/projects/colour.c b/projects/colour.c new file mode 100644 index 0000000000..769592d27c --- /dev/null +++ b/projects/colour.c @@ -0,0 +1 @@ +#include "coloru" \ No newline at end of file diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 74c3166567..677c094f89 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -49,6 +49,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 734c2e6363..1b5b6966ab 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -549,6 +549,9 @@ Source\Windows + + Source\Interface + diff --git a/src/drawing/rect.c b/src/drawing/rect.c index 8da268b2cc..7b619c1d94 100644 --- a/src/drawing/rect.c +++ b/src/drawing/rect.c @@ -21,8 +21,9 @@ #include #include "../addresses.h" #include "../common.h" -#include "drawing.h" +#include "../interface/colour.h" #include "../platform/platform.h" +#include "drawing.h" /** * @@ -283,13 +284,13 @@ void gfx_fill_rect_inset(rct_drawpixelinfo* dpi, short left, short top, short ri } } else { if (flags & 0x80) { - shadow = RCT2_ADDRESS(0x0141FC46, uint8)[colour * 8]; - fill = RCT2_ADDRESS(0x0141FC48, uint8)[colour * 8]; - hilight = RCT2_ADDRESS(0x0141FC4A, uint8)[colour * 8]; + shadow = ColourMapA[colour].dark; + fill = ColourMapA[colour].mid_light; + hilight = ColourMapA[colour].lighter; } else { - shadow = RCT2_ADDRESS(0x0141FC47, uint8)[colour * 8]; - fill = RCT2_ADDRESS(0x0141FC49, uint8)[colour * 8]; - hilight = RCT2_ADDRESS(0x0141FC4B, uint8)[colour * 8]; + shadow = ColourMapA[colour].mid_dark; + fill = ColourMapA[colour].light; + hilight = ColourMapA[colour].lighter; } if (flags & no_border) { @@ -304,9 +305,9 @@ void gfx_fill_rect_inset(rct_drawpixelinfo* dpi, short left, short top, short ri if (!(flags & no_fill)) { if (!(flags & 0x40)) { if (flags & 0x04) { - fill = RCT2_ADDRESS(0x0141FC49, uint8)[0]; + fill = ColourMapA[COLOUR_BLACK].light; } else { - fill = RCT2_ADDRESS(0x0141FC4A, uint8)[colour * 8]; + fill = ColourMapA[colour].lighter; } } gfx_fill_rect(dpi, left+1, top+1, right-1, bottom-1, fill); @@ -320,7 +321,7 @@ void gfx_fill_rect_inset(rct_drawpixelinfo* dpi, short left, short top, short ri if (!(flags & no_fill)) { if (flags & 0x04) { - fill = RCT2_ADDRESS(0x0141FC49, uint8)[0]; + fill = ColourMapA[COLOUR_BLACK].light; } gfx_fill_rect(dpi, left+1, top+1, right-1, bottom-1, fill); } diff --git a/src/drawing/scrolling_text.c b/src/drawing/scrolling_text.c index 0e96e43166..72a7293d7f 100644 --- a/src/drawing/scrolling_text.c +++ b/src/drawing/scrolling_text.c @@ -1,5 +1,6 @@ #include "../addresses.h" #include "../config.h" +#include "../interface/colour.h" #include "../localisation/localisation.h" #include "drawing.h" @@ -88,10 +89,12 @@ static int scrolling_text_get_matching_or_oldest(rct_string_id stringId, uint16 static uint8 scrolling_text_get_colour(uint32 character) { - int edi = character & 0x7F; - int offset = 0; - if (character >= 0x80) offset = 2; - return RCT2_ADDRESS(0x0141FC47, uint8)[offset + (edi * 8)]; + int colour = character & 0x7F; + if (colour & (1 << 7)) { + return ColourMapA[colour].light; + } else { + return ColourMapA[colour].mid_dark; + } } static void scrolling_text_format(utf8 *dst, rct_draw_scroll_text *scrollText) diff --git a/src/drawing/string.c b/src/drawing/string.c index 97206c6090..1472f4ca90 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "../addresses.h" +#include "../interface/colour.h" #include "../localisation/localisation.h" #include "../sprites.h" #include "../world/map.h" @@ -509,7 +510,7 @@ void colour_char_window(uint8 colour, uint16* current_font_flags,uint8* palette_ int eax; - eax = RCT2_ADDRESS(0x0141FD45, uint8)[colour * 8]; + eax = ColourMapB[colour].b; if (*current_font_flags & 2) { eax |= 0x0A0A00; } @@ -1246,18 +1247,18 @@ static void ttf_process_initial_colour(int colour, text_draw_info *info) uint32 eax; if (info->flags & 4) { if (info->flags & 8) { - eax = RCT2_ADDRESS(0x0141FC48, uint8)[colour * 8]; + eax = ColourMapA[colour].mid_light; eax = eax << 16; - eax = eax | RCT2_ADDRESS(0x0141FC46, uint8)[colour * 8]; + eax = eax | ColourMapA[colour].dark; } else { - eax = RCT2_ADDRESS(0x0141FC49, uint8)[colour * 8]; + eax = ColourMapA[colour].light; eax = eax << 16; - eax = eax | RCT2_ADDRESS(0x0141FC47, uint8)[colour * 8]; + eax = eax | ColourMapA[colour].mid_dark; } } else { - eax = RCT2_ADDRESS(0x0141FC4A, uint8)[colour * 8]; + eax = ColourMapA[colour].lighter; eax = eax << 16; - eax = eax | RCT2_ADDRESS(0x0141FC48, uint8)[colour * 8]; + eax = eax | ColourMapA[colour].mid_light; } // Adjust text palette. Store current colour? ; diff --git a/src/interface/colour.c b/src/interface/colour.c new file mode 100644 index 0000000000..7a880c4062 --- /dev/null +++ b/src/interface/colour.c @@ -0,0 +1,25 @@ +#include "../drawing/drawing.h" +#include "colour.h" + +rct_colour_map_a *ColourMapA = (rct_colour_map_a*)0x0141FC44; +rct_colour_map_b *ColourMapB = (rct_colour_map_b*)0x0141FD44; + +void colours_init_maps() +{ + // Get colour maps from g1 + for (int i = 0; i < 32; i++) { + rct_g1_element *g1Element = &g1Elements[4915 + i]; + + uint8 *dstA = (uint8*)&ColourMapA[i]; + uint8 *dstB = (uint8*)&ColourMapB[i]; + for (int j = 0; j < 4; j++) { + dstA[j] = g1Element->offset[0xF5 + j]; + } + for (int j = 0; j < 4; j++) { + dstA[j + 4] = g1Element->offset[0xF9 + j]; + } + for (int j = 0; j < 4; j++) { + dstB[j] = g1Element->offset[0xFD + j]; + } + } +} diff --git a/src/interface/colour.h b/src/interface/colour.h index 27372884f1..5cb9b3bc84 100644 --- a/src/interface/colour.h +++ b/src/interface/colour.h @@ -1,6 +1,8 @@ #ifndef _COLOUR_H_ #define _COLOUR_H_ +#include "../common.h" + /** * Colour IDs as used by the colour dropdown, NOT palette indices. */ @@ -50,4 +52,33 @@ enum { #define COLOUR_FLAG_TRANSLUCENT (1 << 7) #define TRANSLUCENT(x) ((x) | COLOUR_FLAG_TRANSLUCENT) +#define NUM_COLOURS 32 + +typedef struct { + uint8 darkest; + uint8 darker; + uint8 dark; + uint8 mid_dark; + uint8 mid_light; + uint8 light; + uint8 lighter; + uint8 lightest; +} rct_colour_map_a; + +typedef struct { + uint8 a; + uint8 b; + uint8 c; + uint8 d; + uint8 e; + uint8 f; + uint8 g; + uint8 h; +} rct_colour_map_b; + +extern rct_colour_map_a *ColourMapA; +extern rct_colour_map_b *ColourMapB; + +void colours_init_maps(); + #endif \ No newline at end of file diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 34a7aa41a0..cb664d8422 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -32,6 +32,7 @@ #include "../world/entrance.h" #include "../world/footpath.h" #include "../world/scenery.h" +#include "colour.h" #include "viewport.h" #include "window.h" @@ -87,26 +88,16 @@ struct paint_struct{ */ void viewport_init_all() { - int i, d; - rct_g1_element *g1_element; - - // Palette from sprites? - d = 0; - for (i = 4915; i < 4947; i++) { - g1_element = &g1Elements[i]; - *((int*)(0x0141FC44 + d)) = *((int*)(&g1_element->offset[0xF5])); - *((int*)(0x0141FC48 + d)) = *((int*)(&g1_element->offset[0xF9])); - *((int*)(0x0141FD44 + d)) = *((int*)(&g1_element->offset[0xFD])); - d += 8; - } + colours_init_maps(); // Setting up windows RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*) = g_window_list; RCT2_GLOBAL(0x01423604, sint32) = 0; // Setting up viewports - for (i = 0; i < 9; i++) + for (int i = 0; i < 9; i++) { g_viewport_list[i].width = 0; + } RCT2_NEW_VIEWPORT = NULL; // ? diff --git a/src/interface/widget.c b/src/interface/widget.c index 1142e055c1..94557fa04e 100644 --- a/src/interface/widget.c +++ b/src/interface/widget.c @@ -591,24 +591,24 @@ static void widget_groupbox_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg colour = w->colours[widget->colour] & 0x7F; // Border left of text - gfx_fill_rect(dpi, l, t, l + 4, t, RCT2_ADDRESS(0x0141FC47, uint8)[colour * 8]); - gfx_fill_rect(dpi, l + 1, t + 1, l + 4, t + 1, RCT2_ADDRESS(0x0141FC4B, uint8)[colour * 8]); + gfx_fill_rect(dpi, l, t, l + 4, t, ColourMapA[colour].mid_dark); + gfx_fill_rect(dpi, l + 1, t + 1, l + 4, t + 1, ColourMapA[colour].lighter); // Border right of text - gfx_fill_rect(dpi, textRight, t, r - 1, t, RCT2_ADDRESS(0x0141FC47, uint8)[colour * 8]); - gfx_fill_rect(dpi, textRight, t + 1, r - 2, t + 1, RCT2_ADDRESS(0x0141FC4B, uint8)[colour * 8]); + gfx_fill_rect(dpi, textRight, t, r - 1, t, ColourMapA[colour].mid_dark); + gfx_fill_rect(dpi, textRight, t + 1, r - 2, t + 1, ColourMapA[colour].lighter); // Border right - gfx_fill_rect(dpi, r - 1, t + 1, r - 1, b - 1, RCT2_ADDRESS(0x0141FC47, uint8)[colour * 8]); - gfx_fill_rect(dpi, r, t, r, b, RCT2_ADDRESS(0x0141FC4B, uint8)[colour * 8]); + gfx_fill_rect(dpi, r - 1, t + 1, r - 1, b - 1, ColourMapA[colour].mid_dark); + gfx_fill_rect(dpi, r, t, r, b, ColourMapA[colour].lighter); // Border bottom - gfx_fill_rect(dpi, l, b - 1, r - 2, b - 1, RCT2_ADDRESS(0x0141FC47, uint8)[colour * 8]); - gfx_fill_rect(dpi, l, b, r - 1, b, RCT2_ADDRESS(0x0141FC4B, uint8)[colour * 8]); + gfx_fill_rect(dpi, l, b - 1, r - 2, b - 1, ColourMapA[colour].mid_dark); + gfx_fill_rect(dpi, l, b, r - 1, b, ColourMapA[colour].lighter); // Border left - gfx_fill_rect(dpi, l, t + 1, l, b - 2, RCT2_ADDRESS(0x0141FC47, uint8)[colour * 8]); - gfx_fill_rect(dpi, l + 1, t + 2, l + 1, b - 2, RCT2_ADDRESS(0x0141FC4B, uint8)[colour * 8]); + gfx_fill_rect(dpi, l, t + 1, l, b - 2, ColourMapA[colour].mid_dark); + gfx_fill_rect(dpi, l + 1, t + 2, l + 1, b - 2, ColourMapA[colour].lighter); } /** @@ -650,7 +650,7 @@ static void widget_caption_draw(rct_drawpixelinfo *dpi, rct_window *w, int widge press |= 0x80; gfx_fill_rect_inset(dpi, l, t, r, b, colour, press); - gfx_fill_rect(dpi, r + 1, t, r + 1, b, *((char*)(0x0141FC47 + (colour * 8)))); + gfx_fill_rect(dpi, r + 1, t, r + 1, b, ColourMapA[colour].mid_dark); } else { // press = 0x60; @@ -661,7 +661,7 @@ static void widget_caption_draw(rct_drawpixelinfo *dpi, rct_window *w, int widge // Black caption bars look slightly green, this fixes that if (colour == 0) - gfx_fill_rect(dpi, l + 1, t + 1, r - 1, b - 1, *((char*)(0x0141FC46 + (colour * 8)))); + gfx_fill_rect(dpi, l + 1, t + 1, r - 1, b - 1, ColourMapA[colour].dark); else gfx_fill_rect(dpi, l + 1, t + 1, r - 1, b - 1, 0x2000000 | 47); } @@ -853,12 +853,12 @@ static void widget_hscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i { colour &= 0x7F; // Trough - gfx_fill_rect(dpi, l + 10, t, r - 10, b, *((uint8*)(0x0141FC4B + (colour * 8)))); - gfx_fill_rect(dpi, l + 10, t, r - 10, b, 0x1000000 | *((uint8*)(0x0141FC47 + (colour * 8)))); - gfx_fill_rect(dpi, l + 10, t + 2, r - 10, t + 2, *((uint8*)(0x0141FC47 + (colour * 8)))); - gfx_fill_rect(dpi, l + 10, t + 3, r - 10, t + 3, *((uint8*)(0x0141FC4B + (colour * 8)))); - gfx_fill_rect(dpi, l + 10, t + 7, r - 10, t + 7, *((uint8*)(0x0141FC47 + (colour * 8)))); - gfx_fill_rect(dpi, l + 10, t + 8, r - 10, t + 8, *((uint8*)(0x0141FC4B + (colour * 8)))); + gfx_fill_rect(dpi, l + 10, t, r - 10, b, ColourMapA[colour].lighter); + gfx_fill_rect(dpi, l + 10, t, r - 10, b, 0x1000000 | ColourMapA[colour].mid_dark); + gfx_fill_rect(dpi, l + 10, t + 2, r - 10, t + 2, ColourMapA[colour].mid_dark); + gfx_fill_rect(dpi, l + 10, t + 3, r - 10, t + 3, ColourMapA[colour].lighter); + gfx_fill_rect(dpi, l + 10, t + 7, r - 10, t + 7, ColourMapA[colour].mid_dark); + gfx_fill_rect(dpi, l + 10, t + 8, r - 10, t + 8, ColourMapA[colour].lighter); // Left button gfx_fill_rect_inset(dpi, l, t, l + 9, b, colour, (scroll->flags & HSCROLLBAR_LEFT_PRESSED ? 0x20 : 0)); @@ -879,12 +879,12 @@ static void widget_vscrollbar_draw(rct_drawpixelinfo *dpi, rct_scroll *scroll, i { colour &= 0x7F; // Trough - gfx_fill_rect(dpi, l, t + 10, r, b - 10, *((uint8*)(0x0141FC4B + (colour * 8)))); - gfx_fill_rect(dpi, l, t + 10, r, b - 10, 0x1000000 | *((uint8*)(0x0141FC47 + (colour * 8)))); - gfx_fill_rect(dpi, l + 2, t + 10, l + 2, b - 10, *((uint8*)(0x0141FC47 + (colour * 8)))); - gfx_fill_rect(dpi, l + 3, t + 10, l + 3, b - 10, *((uint8*)(0x0141FC4B + (colour * 8)))); - gfx_fill_rect(dpi, l + 7, t + 10, l + 7, b - 10, *((uint8*)(0x0141FC47 + (colour * 8)))); - gfx_fill_rect(dpi, l + 8, t + 10, l + 8, b - 10, *((uint8*)(0x0141FC4B + (colour * 8)))); + gfx_fill_rect(dpi, l, t + 10, r, b - 10, ColourMapA[colour].lighter); + gfx_fill_rect(dpi, l, t + 10, r, b - 10, 0x1000000 | ColourMapA[colour].mid_dark); + gfx_fill_rect(dpi, l + 2, t + 10, l + 2, b - 10, ColourMapA[colour].mid_dark); + gfx_fill_rect(dpi, l + 3, t + 10, l + 3, b - 10, ColourMapA[colour].lighter); + gfx_fill_rect(dpi, l + 7, t + 10, l + 7, b - 10, ColourMapA[colour].mid_dark); + gfx_fill_rect(dpi, l + 8, t + 10, l + 8, b - 10, ColourMapA[colour].lighter); // Up button gfx_fill_rect_inset(dpi, l, t, r, t + 9, colour, (scroll->flags & VSCROLLBAR_UP_PRESSED ? 0x20 : 0)); @@ -934,7 +934,7 @@ static void widget_draw_image(rct_drawpixelinfo *dpi, rct_window *w, int widgetI if (widget_is_disabled(w, widgetIndex)) { // Draw greyed out (light border bottom right shadow) colour = w->colours[widget->colour]; - colour = RCT2_ADDRESS(0x00141FC4A, uint8)[(colour & 0x7F) * 8] & 0xFF; + colour = ColourMapA[colour & 0x7F].lighter; uint8 palette[256]; memset(palette, colour, 256); @@ -946,7 +946,7 @@ static void widget_draw_image(rct_drawpixelinfo *dpi, rct_window *w, int widgetI // Draw greyed out (dark) colour = w->colours[widget->colour]; - colour = RCT2_ADDRESS(0x00141FC48, uint8)[(colour & 0x7F) * 8] & 0xFF; + colour = ColourMapA[colour & 0x7F].mid_light; memset(palette, colour, 256); palette[0] = 0; @@ -1210,7 +1210,7 @@ static void widget_text_box_draw(rct_drawpixelinfo *dpi, rct_window *w, int widg } if (gTextBoxFrameNo <= 15){ - uint8 colour = RCT2_ADDRESS(0x0141FC48, uint8)[w->colours[1] * 8]; + uint8 colour = ColourMapA[w->colours[1]].mid_light; gfx_fill_rect(dpi, cur_x, t + 9, cur_x + width, t + 9, colour + 5); } } diff --git a/src/interface/window.h b/src/interface/window.h index 429a6ce07f..2bc6786893 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -27,6 +27,7 @@ #include "../ride/ride.h" #include "../ride/vehicle.h" #include "../world/park.h" +#include "colour.h" struct rct_window; union rct_window_event; diff --git a/src/windows/dropdown.c b/src/windows/dropdown.c index 6e3335e92c..2b471441e4 100644 --- a/src/windows/dropdown.c +++ b/src/windows/dropdown.c @@ -308,10 +308,8 @@ static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi) gfx_fill_rect(dpi, l, t, r, b, (RCT2_ADDRESS(0x009DEDF4, uint8)[w->colours[0]] | 0x02000000) + 1); gfx_fill_rect(dpi, l, t + 1, r, b + 1, (RCT2_ADDRESS(0x009DEDF4, uint8)[w->colours[0]] | 0x02000000) + 2); } else { - gfx_fill_rect(dpi, l, t, r, b, - *((char*)(0x00141FC47 + (w->colours[0] * 8)))); - gfx_fill_rect(dpi, l, t + 1, r, b + 1, - *((char*)(0x00141FC4B + (w->colours[0] * 8)))); + gfx_fill_rect(dpi, l, t, r, b, ColourMapA[w->colours[0]].mid_dark); + gfx_fill_rect(dpi, l, t + 1, r, b + 1, ColourMapA[w->colours[0]].lightest); } } else { // diff --git a/src/windows/editor_inventions_list.c b/src/windows/editor_inventions_list.c index 0a5975f1a6..c88b5ae741 100644 --- a/src/windows/editor_inventions_list.c +++ b/src/windows/editor_inventions_list.c @@ -760,7 +760,7 @@ static void window_editor_inventions_list_paint(rct_window *w, rct_drawpixelinfo w->y + widget->top + 1, w->x + widget->right - 1, w->y + widget->bottom - 1, - RCT2_GLOBAL(0x0141FC44 + (w->colours[1] * 8), uint8) + ColourMapA[w->colours[1]].darkest ); researchItem = _editorInventionsListDraggedItem; @@ -814,7 +814,7 @@ static void window_editor_inventions_list_scrollpaint(rct_window *w, rct_drawpix utf8 buffer[256], *ptr; // Draw background - colour = RCT2_GLOBAL(0x0141FC48 + (w->colours[1] * 8), uint8); + colour = ColourMapA[w->colours[1]].mid_light; colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; gfx_clear(dpi, colour); diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index bd3b37fdd1..f5eecca514 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -1269,7 +1269,7 @@ static void window_editor_object_selection_paint(rct_window *w, rct_drawpixelinf w->y + widget->top + 1, w->x + widget->right - 1, w->y + widget->bottom - 1, - RCT2_ADDRESS(0x0141FC44, uint8)[w->colours[1] * 8] + ColourMapA[w->colours[1]].darkest ); // Draw number of selected items @@ -1425,7 +1425,7 @@ static void window_editor_object_selection_scrollpaint(rct_window *w, rct_drawpi bool ridePage = (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS); - colour = RCT2_ADDRESS(0x0141FC48, uint8)[w->colours[1] * 8]; + colour = ColourMapA[w->colours[1]].mid_light; colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; gfx_clear(dpi, colour); diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index 9dd1d28e63..5edd55dc33 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -1187,7 +1187,7 @@ static void window_editor_objective_options_rides_scrollpaint(rct_window *w, rct rct_string_id stringId; rct_ride *ride; - colour = RCT2_GLOBAL(0x0141FC48 + (w->colours[1] * 8), uint8); + colour = ColourMapA[w->colours[1]].mid_light; gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, colour); for (i = 0; i < w->no_list_items; i++) { diff --git a/src/windows/finances.c b/src/windows/finances.c index c809ff38f1..006b9a76ff 100644 --- a/src/windows/finances.c +++ b/src/windows/finances.c @@ -665,7 +665,7 @@ static void window_finances_summary_paint(rct_window *w, rct_drawpixelinfo *dpi) for (i = 0; i < 14; i++) { // Darken every even row if (i % 2 == 0) - gfx_fill_rect(dpi, x, y, x + 513 - 2, y + 9, RCT2_GLOBAL(0x0141FC4A + (w->colours[1] * 8), uint8) | 0x1000000); + gfx_fill_rect(dpi, x, y, x + 513 - 2, y + 9, ColourMapA[w->colours[1]].lighter | 0x1000000); gfx_draw_string_left(dpi, STR_FINANCES_SUMMARY_RIDE_CONSTRUCTION + i, NULL, 0, x, y - 1); y += 10; diff --git a/src/windows/guest.c b/src/windows/guest.c index f52c018e41..3c5870e649 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -1669,7 +1669,7 @@ void window_guest_rides_scroll_paint(rct_window *w, rct_drawpixelinfo *dpi, int // dx int bottom = dpi->y + dpi->height - 1; - int colour = RCT2_ADDRESS(0x141FC48, uint8)[w->colours[1] * 8]; + int colour = ColourMapA[w->colours[1]].mid_light; gfx_fill_rect(dpi, left, top, right, bottom, colour); for (int list_index = 0; list_index < w->no_list_items; list_index++){ diff --git a/src/windows/guest_list.c b/src/windows/guest_list.c index 6302ff358c..04edb7f2ce 100644 --- a/src/windows/guest_list.c +++ b/src/windows/guest_list.c @@ -646,7 +646,7 @@ static void window_guest_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, uint32 argument_1, argument_2; // Background fill - gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ((char*)0x0141FC48)[w->colours[1] * 8]); + gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ColourMapA[w->colours[1]].mid_light); switch (_window_guest_list_selected_tab) { case PAGE_INDIVIDUAL: diff --git a/src/windows/install_track.c b/src/windows/install_track.c index 08130e8f00..a81bb58868 100644 --- a/src/windows/install_track.c +++ b/src/windows/install_track.c @@ -302,7 +302,7 @@ static void window_install_track_paint(rct_window *w, rct_drawpixelinfo *dpi) widget = &window_install_track_widgets[WIDX_TRACK_PREVIEW]; x = w->x + widget->left + 1; y = w->y + widget->top + 1; - colour = RCT2_GLOBAL(0x0141FC44 + (w->colours[0] * 8), uint8); + colour = ColourMapA[w->colours[0]].darkest; gfx_fill_rect(dpi, x, y, x + 369, y + 216, colour); //call 6d3993 (load track) diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index c3594396da..c732ff19de 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -532,7 +532,7 @@ static void window_loadsave_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, i rct_string_id stringId, templateStringId = 3165; char *templateString; - gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, RCT2_ADDRESS(0x0141FC48,uint8)[w->colours[1] * 8]); + gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ColourMapA[w->colours[1]].mid_light); templateString = (char*)language_get_string(templateStringId); for (i = 0; i < w->no_list_items; i++) { diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index 739122f782..5fc5406d83 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -777,7 +777,7 @@ static void window_new_ride_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, i if (_window_new_ride_current_tab == WINDOW_NEW_RIDE_PAGE_RESEARCH) return; - gfx_clear(dpi, RCT2_GLOBAL(0x0141FC48 + (w->colours[1] * 8), uint8) * 0x1010101); + gfx_clear(dpi, ColourMapA[w->colours[1]].mid_light * 0x1010101); int x = 1; int y = 1; diff --git a/src/windows/player_list.c b/src/windows/player_list.c index e342dc4325..f482781f10 100644 --- a/src/windows/player_list.c +++ b/src/windows/player_list.c @@ -269,7 +269,7 @@ static void window_player_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi { int y; - gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ((char*)0x0141FC48)[w->colours[1] * 8]); + gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ColourMapA[w->colours[1]].mid_light); y = 0; for (int i = 0; i < network_get_num_players(); i++) { diff --git a/src/windows/ride_list.c b/src/windows/ride_list.c index 92fd542508..b557ca0f1c 100644 --- a/src/windows/ride_list.c +++ b/src/windows/ride_list.c @@ -451,7 +451,7 @@ static void window_ride_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int i, y, format, formatSecondary, argument; rct_ride *ride; - gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width, dpi->y + dpi->height, RCT2_GLOBAL(0x0141FC48 + (w->colours[1] * 8), uint8)); + gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width, dpi->y + dpi->height, ColourMapA[w->colours[1]].mid_light); y = 0; for (i = 0; i < w->no_list_items; i++) { diff --git a/src/windows/scenery.c b/src/windows/scenery.c index f09153e7dc..f9f99c7c73 100644 --- a/src/windows/scenery.c +++ b/src/windows/scenery.c @@ -1046,7 +1046,7 @@ void window_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi) */ void window_scenery_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - gfx_clear(dpi, ((char*)0x0141FC48)[w->colours[1] * 8] * 0x1010101); + gfx_clear(dpi, ColourMapA[w->colours[1]].mid_light * 0x1010101); uint8 tabIndex = window_scenery_active_tab_index; diff --git a/src/windows/server_list.c b/src/windows/server_list.c index 5bbb4bfbff..e8935c65dc 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -378,7 +378,7 @@ static void window_server_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi { uint32 colour; - colour = ((char*)0x0141FC48)[w->colours[1] * 8]; + colour = ColourMapA[w->colours[1]].mid_light; colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; gfx_clear(dpi, colour); diff --git a/src/windows/shortcut_keys.c b/src/windows/shortcut_keys.c index b96522bbde..db3db113e1 100644 --- a/src/windows/shortcut_keys.c +++ b/src/windows/shortcut_keys.c @@ -240,7 +240,7 @@ static void window_shortcut_scrollmouseover(rct_window *w, int scrollIndex, int */ static void window_shortcut_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { - gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, RCT2_ADDRESS(0x0141FC48,uint8)[w->colours[1] * 8]); + gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ColourMapA[w->colours[1]].mid_light); for (int i = 0; i < w->no_list_items; ++i) { int y = i * 10; diff --git a/src/windows/staff_list.c b/src/windows/staff_list.c index 5156de4cf5..797531f490 100644 --- a/src/windows/staff_list.c +++ b/src/windows/staff_list.c @@ -621,7 +621,7 @@ void window_staff_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int sc uint8 selectedTab; rct_peep *peep; - gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ((char*)0x0141FC48)[w->colours[1] * 8]); + gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ColourMapA[w->colours[1]].mid_light); y = 0; i = 0; diff --git a/src/windows/text_input.c b/src/windows/text_input.c index a990d07905..48cbef83d6 100644 --- a/src/windows/text_input.c +++ b/src/windows/text_input.c @@ -310,7 +310,7 @@ static void window_text_input_paint(rct_window *w, rct_drawpixelinfo *dpi) } if (w->frame_no > 15){ - uint8 colour = RCT2_ADDRESS(0x0141FC48, uint8)[w->colours[1] * 8]; + uint8 colour = ColourMapA[w->colours[1]].mid_light; gfx_fill_rect(dpi, cursorX, y + 9, cursorX + width, y + 9, colour + 5); } diff --git a/src/windows/themes.c b/src/windows/themes.c index 01cba5d5bc..51694d493d 100644 --- a/src/windows/themes.c +++ b/src/windows/themes.c @@ -844,8 +844,8 @@ void window_themes_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scroll return; if ((w->colours[1] & 0x80) == 0) - //gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ((char*)0x0141FC48)[w->colours[1] * 8]); - gfx_clear(dpi, ((char*)0x0141FC48)[w->colours[1] * 8] * 0x1010101); + //gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ColourMapA[w->colours[1]].mid_light); + gfx_clear(dpi, ColourMapA[w->colours[1]].mid_light * 0x1010101); y = 0; for (int i = 0; i < get_colour_scheme_tab_count(); i++) { if (y > dpi->y + dpi->height) { @@ -862,9 +862,9 @@ void window_themes_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scroll gfx_fill_rect(dpi, 0, y + _row_height - 1, window_themes_widgets[WIDX_THEMES_LIST].right, y + _row_height - 1, colour + 2); } else { - colour = RCT2_ADDRESS(0x0141FC47, uint8)[w->colours[1] * 8]; + colour = ColourMapA[w->colours[1]].mid_dark; gfx_fill_rect(dpi, 0, y + _row_height - 2, window_themes_widgets[WIDX_THEMES_LIST].right, y + _row_height - 2, colour); - colour = RCT2_ADDRESS(0x0141FC4B, uint8)[w->colours[1] * 8]; + colour = ColourMapA[w->colours[1]].lightest; gfx_fill_rect(dpi, 0, y + _row_height - 1, window_themes_widgets[WIDX_THEMES_LIST].right, y + _row_height - 1, colour); } } diff --git a/src/windows/tile_inspector.c b/src/windows/tile_inspector.c index 354188e13b..e6e8122b24 100644 --- a/src/windows/tile_inspector.c +++ b/src/windows/tile_inspector.c @@ -318,7 +318,7 @@ static void window_tile_inspector_scrollpaint(rct_window *w, rct_drawpixelinfo * int clearance_height = element->clearance_height; if ((i & 1) != 0) - gfx_fill_rect(dpi, x - 15, y, x + WW - 20, y + 11, RCT2_GLOBAL(0x0141FC4A + (w->colours[1] * 8), uint8) | 0x1000000); + gfx_fill_rect(dpi, x - 15, y, x + WW - 20, y + 11, ColourMapA[w->colours[1]].lighter | 0x1000000); switch (type) { case MAP_ELEMENT_TYPE_SURFACE: diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index 8a4bd3a2e4..eb82afe2a8 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -887,7 +887,7 @@ void window_title_editor_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int bool selected, hover, error, inTitle; int y, x, x2, width; - gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ((char*)0x0141FC48)[w->colours[1] * 8]); + gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ColourMapA[w->colours[1]].mid_light); title_sequence *title = &gConfigTitleSequences.presets[gCurrentTitleSequence]; @@ -901,14 +901,14 @@ void window_title_editor_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int hover = false; if (i == w->selected_list_item) { selected = true; - gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, RCT2_GLOBAL(0x0141FC46 + (w->colours[1] * 8), uint8)); + gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, ColourMapA[w->colours[1]].dark); } else if (i == _window_title_editor_highlighted_index || (i == gTitleScriptSave && inTitle && gCurrentTitleSequence == gCurrentPreviewTitleSequence)) { hover = true; - gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, RCT2_GLOBAL(0x0141FC47 + (w->colours[1] * 8), uint8)); + gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, ColourMapA[w->colours[1]].mid_dark); } else if (i & 1) { - gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, RCT2_GLOBAL(0x0141FC4A + (w->colours[1] * 8), uint8) | 0x1000000); + gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, ColourMapA[w->colours[1]].lighter | 0x1000000); } RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&title->saves[i]; @@ -933,14 +933,14 @@ void window_title_editor_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int error = false; if (i == w->selected_list_item) { selected = true; - gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, RCT2_GLOBAL(0x0141FC46 + (w->colours[1] * 8), uint8)); + gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, ColourMapA[w->colours[1]].dark); } else if (i == (int)_window_title_editor_highlighted_index || (i == gTitleScriptCommand && inTitle && gCurrentTitleSequence == gCurrentPreviewTitleSequence)) { hover = true; - gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, RCT2_GLOBAL(0x0141FC47 + (w->colours[1] * 8), uint8)); + gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, ColourMapA[w->colours[1]].mid_dark); } else if (i & 1) { - gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, RCT2_GLOBAL(0x0141FC4A + (w->colours[1] * 8), uint8) | 0x1000000); + gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, ColourMapA[w->colours[1]].lighter | 0x1000000); } rct_string_id commandName; diff --git a/src/windows/title_scenarioselect.c b/src/windows/title_scenarioselect.c index 58dbeb6a29..0a2f57f157 100644 --- a/src/windows/title_scenarioselect.c +++ b/src/windows/title_scenarioselect.c @@ -317,7 +317,7 @@ static void window_scenarioselect_scrollpaint(rct_window *w, rct_drawpixelinfo * int i, y, colour, highlighted, highlighted_format, unhighlighted_format; rct_scenario_basic *scenario; - colour = ((char*)0x0141FC48)[w->colours[1] * 8]; + colour = ColourMapA[w->colours[1]].mid_light; colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; gfx_clear(dpi, colour); diff --git a/src/windows/track_list.c b/src/windows/track_list.c index d6ea9d5d1f..fc8b3187ca 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -403,7 +403,7 @@ static void window_track_list_paint(rct_window *w, rct_drawpixelinfo *dpi) widget = &window_track_list_widgets[WIDX_TRACK_PREVIEW]; x = w->x + widget->left + 1; y = w->y + widget->top + 1; - colour = RCT2_GLOBAL(0x0141FC44 + (w->colours[0] * 8), uint8); + colour = ColourMapA[w->colours[0]].darkest; gfx_fill_rect(dpi, x, y, x + 369, y + 216, colour); trackDesign = track_get_info(trackIndex, &image); @@ -562,7 +562,7 @@ static void window_track_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int i, x, y, colour; utf8 *trackDesignItem, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, utf8); - colour = RCT2_GLOBAL(0x00141FC48 + (w->colours[0] * 8), uint8); + colour = ColourMapA[w->colours[0]].mid_light; colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; gfx_clear(dpi, colour); From 20f21c6bf679b9da674b6839d15c004be148db64 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 8 Nov 2015 18:57:55 +0000 Subject: [PATCH 1021/1173] Delete colour.c --- projects/colour.c | 1 - 1 file changed, 1 deletion(-) delete mode 100644 projects/colour.c diff --git a/projects/colour.c b/projects/colour.c deleted file mode 100644 index 769592d27c..0000000000 --- a/projects/colour.c +++ /dev/null @@ -1 +0,0 @@ -#include "coloru" \ No newline at end of file From d1a6b650497515d1841c172d64bc27d627fc58a5 Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Tue, 27 Oct 2015 23:11:30 +0100 Subject: [PATCH 1022/1173] Fix supports error appearing when building outside of owned land This was caused by ride_construction_toolupdate_construct() pointlessly trying to fix the "building outside owned land" error by increasing the Z. --- src/ride/track.c | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index 6ec6b8920a..2523a7f34d 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3985,6 +3985,43 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in money32 cost = 0; const rct_preview_track *trackBlock = get_track_def_from_ride(ride, type); + + // First check if any of the track pieces are outside the park + for (; trackBlock->index != 0xFF; trackBlock++) { + int x, y, z, offsetX, offsetY; + + switch (direction) { + case 0: + offsetX = trackBlock->x; + offsetY = trackBlock->y; + break; + case 1: + offsetX = trackBlock->y; + offsetY = -trackBlock->x; + break; + case 2: + offsetX = -trackBlock->x; + offsetY = -trackBlock->y; + break; + case 3: + offsetX = -trackBlock->y; + offsetY = trackBlock->x; + break; + } + + x = originX + offsetX; + y = originY + offsetY; + z = originZ + trackBlock->z; + + if (!map_is_location_owned(x, y, z) && !gCheatsSandboxMode) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_LAND_NOT_OWNED_BY_PARK; + return MONEY32_UNDEFINED; + } + } + + // If that is not the case, then perform the remaining checks + trackBlock = get_track_def_from_ride(ride, type); + for (; trackBlock->index != 0xFF; trackBlock++, RCT2_GLOBAL(0x00F44054, uint8*)++) { int x, y, z, offsetX, offsetY; int bl = trackBlock->var_08; @@ -4093,10 +4130,6 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in } } - if (!map_is_location_owned(x, y, z) && !gCheatsSandboxMode) { - return MONEY32_UNDEFINED; - } - bh = RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & 3; if (RCT2_GLOBAL(RCT2_ADDRESS_ABOVE_GROUND_FLAGS, uint8) != 0 && (RCT2_GLOBAL(RCT2_ADDRESS_ABOVE_GROUND_FLAGS, uint8) & bh) == 0) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND; From b20a84498259c7865a8e868e4cbf14fe765db6ec Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Wed, 28 Oct 2015 10:50:12 +0100 Subject: [PATCH 1023/1173] Fix "land not owned" errors being overridden by "can't construct here" I'm not entirely sure what the "hmm" check is about, but it caused track_place() to return early when called from window_ride_construction_construct(), so I moved up the owned land check to give it a higher priority. --- src/ride/track.c | 45 ++++++++++++++++----------------- src/windows/ride_construction.c | 2 +- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index 2523a7f34d..5fd7a3f309 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1296,7 +1296,7 @@ int track_place_scenery(rct_track_scenery* scenery_start, uint8 rideIndex, int o if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 105; if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; cost = game_do_command(mapCoord.x, bl | (bh << 8), mapCoord.y, z | (entry_index << 8), GAME_COMMAND_PLACE_PATH_FROM_TRACK, 0, 0); } else{ @@ -1425,7 +1425,7 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac rotation += maze->unk_2; rotation &= 3; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; bl = 1; if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 0x69; @@ -1444,7 +1444,7 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac rotation += maze->unk_2; rotation &= 3; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; bl = 1; if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 0x69; @@ -1466,7 +1466,7 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 0x69; if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; cost = game_do_command(mapCoord.x, bl | (maze_entry & 0xFF) << 8, mapCoord.y, rideIndex | (maze_entry & 0xFF00), GAME_COMMAND_PLACE_MAZE_DESIGN, z, 0); break; @@ -1641,7 +1641,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 105; if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; money32 cost = game_do_command(x, bl | (rotation << 8), y, edx, GAME_COMMAND_PLACE_TRACK, edi, 0); RCT2_GLOBAL(0x00F440D5, money32) += cost; @@ -1847,7 +1847,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 105; if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; money32 cost = game_do_command(x, bl | (rotation << 8), y, rideIndex | (is_exit << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, di, 0); RCT2_GLOBAL(0x00F440D5, money32) += cost; @@ -1866,7 +1866,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac z += RCT2_GLOBAL(0x00F44146, sint16); z /= 16; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; money32 cost = game_do_command(x, 0 | (rotation << 8), y, z | (is_exit << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, -1, 0); RCT2_GLOBAL(0x00F440D5, money32) += cost; @@ -3940,22 +3940,6 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in } } - uint16 *hmm = (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE) ? - (uint16*)0x0099443C : - (uint16*)0x0099423C; - if (hmm[type] & 0x100) { - if ((originZ & 0x0F) != 8) { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 954; - return MONEY32_UNDEFINED; - } - } - else { - if ((originZ & 0x0F) != 0) { - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 954; - return MONEY32_UNDEFINED; - } - } - if (type == TRACK_ELEM_ON_RIDE_PHOTO) { if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_ONLY_ONE_ON_RIDE_PHOTO_PER_RIDE; @@ -4019,6 +4003,21 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in } } + uint16 *hmm = (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE) ? + (uint16*)0x0099443C : + (uint16*)0x0099423C; + if (hmm[type] & 0x100) { + if ((originZ & 0x0F) != 8) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 954; + return MONEY32_UNDEFINED; + } + } else { + if ((originZ & 0x0F) != 0) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 954; + return MONEY32_UNDEFINED; + } + } + // If that is not the case, then perform the remaining checks trackBlock = get_track_def_from_ride(ride, type); diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 2b088b2fde..7ec2ddaa13 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -3525,7 +3525,7 @@ void ride_construction_tooldown_construct(int screenX, int screenY) RCT2_GLOBAL(0x009A8C29, uint8) |= 1; - RCT2_GLOBAL(0x00141E9AE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; RCT2_GLOBAL(0x00F44074, money32) = game_do_command( _currentTrackBeginX, GAME_COMMAND_FLAG_APPLY | (4 << 8), From 6114aa5dac6032f9197e8a52c548a9d3a32e3930 Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Sun, 8 Nov 2015 22:30:51 +0100 Subject: [PATCH 1024/1173] Rename hmm variable to something more descriptive --- src/ride/track.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index 5fd7a3f309..695477317d 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -4002,11 +4002,11 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in return MONEY32_UNDEFINED; } } - - uint16 *hmm = (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE) ? - (uint16*)0x0099443C : - (uint16*)0x0099423C; - if (hmm[type] & 0x100) { + + uint16 *trackFlags = (rideTypeFlags & RIDE_TYPE_FLAG_FLAT_RIDE) ? + RCT2_ADDRESS(0x0099443C, uint16) : + RCT2_ADDRESS(0x0099423C, uint16); + if (trackFlags[type] & 0x100) { if ((originZ & 0x0F) != 8) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 954; return MONEY32_UNDEFINED; From 2e5549547016f4e290c10274f375dd86c23c0de0 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 8 Nov 2015 22:03:35 +0000 Subject: [PATCH 1025/1173] improve master server to POST json --- src/network/http.cpp | 65 ++++++++++++++++++++++++++++++++++----- src/network/http.h | 15 +++++++-- src/network/network.cpp | 27 +++++++++++----- src/network/twitch.cpp | 21 +++++++++++-- src/windows/server_list.c | 9 ++++-- 5 files changed, 115 insertions(+), 22 deletions(-) diff --git a/src/network/http.cpp b/src/network/http.cpp index ba6557578c..411d0f0c33 100644 --- a/src/network/http.cpp +++ b/src/network/http.cpp @@ -16,6 +16,14 @@ void http_dispose() { } #define WIN32_LEAN_AND_MEAN #include +#define MIME_TYPE_APPLICATION_JSON "application/json" + +typedef struct { + char *ptr; + int length; + int position; +} read_buffer; + typedef struct { char *ptr; int length; @@ -32,6 +40,22 @@ void http_dispose() curl_global_cleanup(); } +static size_t http_request_read_func(void *ptr, size_t size, size_t nmemb, void *userdata) +{ + read_buffer *readBuffer = (read_buffer*)userdata; + + size_t remainingBytes = readBuffer->length - readBuffer->position; + size_t readBytes = size * nmemb; + if (readBytes > remainingBytes) { + readBytes = remainingBytes; + } + + memcpy(ptr, readBuffer->ptr + readBuffer->position, readBytes); + + readBuffer->position += readBytes; + return readBytes; +} + static size_t http_request_write_func(void *ptr, size_t size, size_t nmemb, void *userdata) { write_buffer *writeBuffer = (write_buffer*)userdata; @@ -54,33 +78,55 @@ static size_t http_request_write_func(void *ptr, size_t size, size_t nmemb, void return newBytesLength; } -http_json_response *http_request_json(const char *url) +http_json_response *http_request_json(const http_json_request *request) { CURL *curl; CURLcode curlResult; http_json_response *response; + read_buffer readBuffer; write_buffer writeBuffer; curl = curl_easy_init(); if (curl == NULL) return NULL; + if (request->body != NULL) { + readBuffer.ptr = json_dumps(request->body, JSON_COMPACT); + readBuffer.length = strlen(readBuffer.ptr); + readBuffer.position = 0; + } + writeBuffer.ptr = NULL; writeBuffer.length = 0; writeBuffer.capacity = 0; curl_slist *headers = NULL; - headers = curl_slist_append(headers, "Accept: application/json"); + headers = curl_slist_append(headers, "Accept: " MIME_TYPE_APPLICATION_JSON); + if (request->body != NULL) { + headers = curl_slist_append(headers, "Content-Type: " MIME_TYPE_APPLICATION_JSON); + char contentLengthHeaderValue[64]; + snprintf(contentLengthHeaderValue, sizeof(contentLengthHeaderValue), "Content-Length: %d", readBuffer.length); + headers = curl_slist_append(headers, contentLengthHeaderValue); + + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, readBuffer.ptr); + } + + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, request->method); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true); curl_easy_setopt(curl, CURLOPT_CAINFO, "curl-ca-bundle.crt"); - curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_URL, request->url); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &writeBuffer); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_request_write_func); curlResult = curl_easy_perform(curl); + + if (request->body != NULL) { + free(readBuffer.ptr); + } + if (curlResult != CURLE_OK) { log_error("HTTP request failed: %s.", curl_easy_strerror(curlResult)); if (writeBuffer.ptr != NULL) @@ -115,24 +161,27 @@ http_json_response *http_request_json(const char *url) return response; } -void http_request_json_async(const char *url, void (*callback)(http_json_response*)) +void http_request_json_async(const http_json_request *request, void (*callback)(http_json_response*)) { struct TempThreadArgs { - char *url; + http_json_request request; void (*callback)(http_json_response*); }; TempThreadArgs *args = (TempThreadArgs*)malloc(sizeof(TempThreadArgs)); - args->url = _strdup(url); + args->request.url = _strdup(request->url); + args->request.method = request->method; + args->request.body = json_deep_copy(request->body); args->callback = callback; SDL_Thread *thread = SDL_CreateThread([](void *ptr) -> int { TempThreadArgs *args = (TempThreadArgs*)ptr; - http_json_response *response = http_request_json(args->url); + http_json_response *response = http_request_json(&args->request); args->callback(response); - free(args->url); + free((char*)args->request.url); + json_decref((json_t*)args->request.body); free(args); return 0; }, NULL, args); diff --git a/src/network/http.h b/src/network/http.h index 1cd567f91d..3df1903fc6 100644 --- a/src/network/http.h +++ b/src/network/http.h @@ -5,13 +5,24 @@ #include #include "../common.h" +typedef struct { + const char *method; + const char *url; + const json_t *body; +} http_json_request; + typedef struct { int status_code; json_t *root; } http_json_response; -http_json_response *http_request_json(const char *url); -void http_request_json_async(const char *url, void (*callback)(http_json_response*)); +#define HTTP_METHOD_GET "GET" +#define HTTP_METHOD_POST "POST" +#define HTTP_METHOD_PUT "PUT" +#define HTTP_METHOD_DELETE "DELETE" + +http_json_response *http_request_json(const http_json_request *request); +void http_request_json_async(const http_json_request *request, void (*callback)(http_json_response*)); void http_request_json_dispose(http_json_response *response); #endif // DISABLE_HTTP diff --git a/src/network/network.cpp b/src/network/network.cpp index 458cb0cfe4..3b916dda30 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -854,10 +854,16 @@ void Network::AdvertiseRegister() last_advertise_time = SDL_GetTicks(); // Send the registration request - std::string url = GetMasterServerUrl() - + std::string("?command=register&port=") + std::to_string(listening_port) - + std::string("&key=") + advertise_key; - http_request_json_async(url.c_str(), [](http_json_response *response) -> void { + http_json_request request; + request.url = GetMasterServerUrl(); + request.method = HTTP_METHOD_POST; + + json_t *body = json_object(); + json_object_set(body, "key", json_string(advertise_key.c_str())); + json_object_set(body, "port", json_integer(listening_port)); + request.body = body; + + http_request_json_async(&request, [](http_json_response *response) -> void { if (response == NULL) { log_warning("Unable to connect to master server"); return; @@ -883,6 +889,8 @@ void Network::AdvertiseRegister() } http_request_json_dispose(response); }); + + json_decref(body); #endif } @@ -891,13 +899,18 @@ void Network::AdvertiseHeartbeat() #ifndef DISABLE_HTTP // Send the heartbeat request std::string url = GetMasterServerUrl() - + std::string("?command=heartbeat&token=") + advertise_token + + std::string("?token=") + advertise_token + std::string("&players=") + std::to_string(network_get_num_players()); // TODO send status data (e.g. players) via JSON body gNetwork.last_heartbeat_time = SDL_GetTicks(); - http_request_json_async(url.c_str(), [](http_json_response *response) -> void { + + http_json_request request; + request.url = url.c_str(); + request.method = HTTP_METHOD_PUT; + request.body = NULL; + http_request_json_async(&request, [](http_json_response *response) -> void { if (response == NULL) { log_warning("Unable to connect to master server"); return; @@ -1064,7 +1077,7 @@ void Network::Server_Send_GAMEINFO(NetworkConnection& connection) json_object_set(obj, "maxPlayers", json_integer(gConfigNetwork.maxplayers)); json_object_set(obj, "description", json_string(gConfigNetwork.server_description)); packet->WriteString(json_dumps(obj, 0)); - json_object_clear(obj); + json_decref(obj); #endif connection.QueuePacket(std::move(packet)); } diff --git a/src/network/twitch.cpp b/src/network/twitch.cpp index 06fb34b629..fbc47434e9 100644 --- a/src/network/twitch.cpp +++ b/src/network/twitch.cpp @@ -130,7 +130,12 @@ static void twitch_join() _twitchState = TWITCH_STATE_JOINING; _twitchIdle = false; - http_request_json_async(url, [](http_json_response *jsonResponse) -> void { + + http_json_request request; + request.url = url; + request.method = HTTP_METHOD_GET; + request.body = NULL; + http_request_json_async(&request, [](http_json_response *jsonResponse) -> void { if (jsonResponse == NULL) { _twitchState = TWITCH_STATE_LEFT; console_writeline("Unable to connect to twitch channel."); @@ -191,7 +196,12 @@ static void twitch_get_followers() _twitchState = TWITCH_STATE_WAITING; _twitchIdle = false; - http_request_json_async(url, [](http_json_response *jsonResponse) -> void { + + http_json_request request; + request.url = url; + request.method = HTTP_METHOD_GET; + request.body = NULL; + http_request_json_async(&request, [](http_json_response *jsonResponse) -> void { if (jsonResponse == NULL) { _twitchState = TWITCH_STATE_JOINED; } else { @@ -212,7 +222,12 @@ static void twitch_get_messages() _twitchState = TWITCH_STATE_WAITING; _twitchIdle = false; - http_request_json_async(url, [](http_json_response *jsonResponse) -> void { + + http_json_request request; + request.url = url; + request.method = HTTP_METHOD_GET; + request.body = NULL; + http_request_json_async(&request, [](http_json_response *jsonResponse) -> void { if (jsonResponse == NULL) { _twitchState = TWITCH_STATE_JOINED; } else { diff --git a/src/windows/server_list.c b/src/windows/server_list.c index e8935c65dc..1aef7d1af6 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -651,7 +651,12 @@ static void fetch_servers() } } SDL_UnlockMutex(_mutex); - http_request_json_async(masterServerUrl, fetch_servers_callback); + + http_json_request request; + request.url = masterServerUrl; + request.method = HTTP_METHOD_GET; + request.body = NULL; + http_request_json_async(&request, fetch_servers_callback); #endif } @@ -721,7 +726,7 @@ static void fetch_servers_callback(http_json_response* response) } http_request_json_dispose(response); - rct_window* window = window_bring_to_front_by_class(WC_SERVER_LIST); + rct_window *window = window_find_by_class(WC_SERVER_LIST); if (window != NULL) { window_invalidate(window); } From 3f00ec42f14ada7c20013f4614b2731513427f5b Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Sun, 8 Nov 2015 23:44:41 +0100 Subject: [PATCH 1026/1173] Replace trackPlaceZ RCT2_GLOBALs with define for clarity --- src/windows/ride_construction.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 7ec2ddaa13..02de05c631 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -3282,7 +3282,7 @@ void ride_construction_toolupdate_construct(int screenX, int screenY) return; } - z = RCT2_GLOBAL(0x00F44163, uint16); + z = _trackPlaceZ; if (z == 0) z = map_get_highest_z(x >> 5, y >> 5); @@ -3313,7 +3313,7 @@ void ride_construction_toolupdate_construct(int screenX, int screenY) window_ride_construction_select_map_tiles(ride, trackType, trackDirection, x, y); RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z; - if (RCT2_GLOBAL(0x00F44163, uint16) == 0) { + if (_trackPlaceZ == 0) { // Raise z above all slopes and water highestZ = 0; if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & 2) { @@ -3480,20 +3480,21 @@ void ride_construction_tooldown_construct(int screenX, int screenY) selectedTile++; } } + RCT2_GLOBAL(0x00F440E2, uint16) = z; RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 2 | 4); if (!ride_get_place_position_from_screen_position(screenX, screenY, &x, &y)) return; - z = RCT2_GLOBAL(0x00F44163, uint16); + z = _trackPlaceZ; if (z == 0) z = map_get_highest_z(x >> 5, y >> 5); tool_cancel(); rct_ride *ride = GET_RIDE(_currentRideIndex); - if (RCT2_GLOBAL(0x00F44163, uint16) == 0) { + if (_trackPlaceZ == 0) { const rct_preview_track *trackBlock = get_track_def_from_ride(ride, _currentTrackPieceType); int bx = 0; do { @@ -3507,7 +3508,7 @@ void ride_construction_tooldown_construct(int screenX, int screenY) z -= 16; } } else { - z = RCT2_GLOBAL(0x00F44163, uint16); + z = _trackPlaceZ; } if (ride->type == RIDE_TYPE_MAZE) { From da6d382c471ccaa2273770c712d70a5d85f98cc4 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 8 Nov 2015 23:29:52 +0000 Subject: [PATCH 1027/1173] make server heartbeat PUT --- src/network/network.cpp | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 3b916dda30..7aa795a91a 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -898,18 +898,29 @@ void Network::AdvertiseHeartbeat() { #ifndef DISABLE_HTTP // Send the heartbeat request - std::string url = GetMasterServerUrl() - + std::string("?token=") + advertise_token - + std::string("&players=") + std::to_string(network_get_num_players()); + http_json_request request; + request.url = GetMasterServerUrl(); + request.method = HTTP_METHOD_PUT; - // TODO send status data (e.g. players) via JSON body + json_t *body = json_object(); + json_object_set(body, "token", json_string(advertise_token.c_str())); + json_object_set(body, "players", json_integer(network_get_num_players())); + + json_t *gameInfo = json_object(); + json_object_set(gameInfo, "mapSize", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint8) - 2)); + json_object_set(gameInfo, "day", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16))); + json_object_set(gameInfo, "month", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16))); + json_object_set(gameInfo, "guests", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16))); + json_object_set(gameInfo, "parkValue", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_VALUE, money32))); + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { + money32 cash = DECRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32)); + json_object_set(gameInfo, "cash", json_integer(cash)); + } + + json_object_set(body, "gameInfo", gameInfo); + request.body = body; gNetwork.last_heartbeat_time = SDL_GetTicks(); - - http_json_request request; - request.url = url.c_str(); - request.method = HTTP_METHOD_PUT; - request.body = NULL; http_request_json_async(&request, [](http_json_response *response) -> void { if (response == NULL) { log_warning("Unable to connect to master server"); @@ -928,6 +939,8 @@ void Network::AdvertiseHeartbeat() } http_request_json_dispose(response); }); + + json_decref(body); #endif } From 09cd007f3f4b9acee9cdacb46afcbf9b8ab6122a Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 8 Nov 2015 23:50:38 +0000 Subject: [PATCH 1028/1173] add dedicated flag to gameInfo --- src/network/network.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/network/network.cpp b/src/network/network.cpp index 7aa795a91a..eabcfdc06e 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -19,6 +19,7 @@ *****************************************************************************/ extern "C" { +#include "../openrct2.h" #include "../platform/platform.h" } @@ -904,6 +905,7 @@ void Network::AdvertiseHeartbeat() json_t *body = json_object(); json_object_set(body, "token", json_string(advertise_token.c_str())); + json_object_set(body, "dedicated", json_boolean(gOpenRCT2Headless)); json_object_set(body, "players", json_integer(network_get_num_players())); json_t *gameInfo = json_object(); From 03cbb37d8a4016924c46f1b4e4a85bdf34a89fea Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 9 Nov 2015 04:00:16 +0000 Subject: [PATCH 1029/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 30 ++++++++++++++++++++++++++---- data/language/english_us.txt | 17 +++++++++++++++-- data/language/german.txt | 17 +++++++++++++++-- 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index af8e93a3f6..9526dd4d75 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3857,8 +3857,8 @@ STR_5521 :{SMALLFONT}{BLACK}Helder paars STR_5522 :{SMALLFONT}{BLACK}Darkblauw STR_5523 :{SMALLFONT}{BLACK}Lichtblauw STR_5524 :{SMALLFONT}{BLACK}IJzig blauw -STR_5525 :{SMALLFONT}{BLACK}Turquoise -STR_5526 :{SMALLFONT}{BLACK}Aquamarijn +STR_5525 :{SMALLFONT}{BLACK}Donkere waterkleur +STR_5526 :{SMALLFONT}{BLACK}Lichte waterkleur STR_5527 :{SMALLFONT}{BLACK}Verzadigd groen STR_5528 :{SMALLFONT}{BLACK}Donkergroen STR_5529 :{SMALLFONT}{BLACK}Mosgroen @@ -3898,6 +3898,19 @@ STR_5562 :WAARSCHUWING: STR_5563 :Deze functie is momenteel niet helemaal stabiel, wees voorzichtig. STR_5564 :Ongeldig element invoegen STR_5565 :{SMALLFONT}{BLACK}Plaatst een ongeldig element boven de andere elementen van dit vakje. Alle elementen die boven dit ongeldige element worden geplaatst worden onzichtbaar. +STR_5566 :Wachtwoord: +STR_5567 :Bekendmaken +STR_5568 :Wachtwoord vereist +STR_5569 :Deze server vereist een wachtwoord. +STR_5570 :Serverlijst ophalen +STR_5571 :Meedoen +STR_5572 :Toev. aan favorieten +STR_5573 :Verw. uit favorieten +STR_5574 :Servernaame: +STR_5575 :Max. aant. spelers: +STR_5576 :Poort: +STR_5577 :Zuid-Koreaanse won (W) +STR_5578 :Russische roebel (R) ############# # Scenarios # @@ -4034,8 +4047,11 @@ STR_SCNR :Bouw je eigen Six Flags-park STR_PARK :Six Flags STR_DTLS :Maak je eigen Six Flags-park, door gebruik te maken van attracties uit andere Six Flags-parken of door zelf nieuwe attracties te ontwerpen. -[NITROENT] -STR_NAME :'Nitro'-bord +#TT + +STR_SCNR : Mythologie - Animatronic-filmset +STR_PARK :Animatronic Antics +STR_DTLS :Je moet een bestaand pretpark, gebouwd op een oude filmset, beheren en verbeteren. Bouw een eerbetoon aan de pioniers van de stop-motionanimatie, die de wezens uit de mythologie tot leven brachten op het witte doek. ################################## # Rides/attractions / Attracties # @@ -5908,3 +5924,9 @@ STR_NAME : 'Donkere eeuwen'-thema #TT [SCGMYTHO] STR_NAME : Mythologisch thema + +################# +# Large objects # +################# +[NITROENT] +STR_NAME :'Nitro'-bord diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 39a51151c1..a173125c84 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3865,8 +3865,8 @@ STR_5521 :{SMALLFONT}{BLACK}Bright purple STR_5522 :{SMALLFONT}{BLACK}Dark blue STR_5523 :{SMALLFONT}{BLACK}Light blue STR_5524 :{SMALLFONT}{BLACK}Icy blue -STR_5525 :{SMALLFONT}{BLACK}Teal -STR_5526 :{SMALLFONT}{BLACK}Aquamarine +STR_5525 :{SMALLFONT}{BLACK}Dark water +STR_5526 :{SMALLFONT}{BLACK}Light water STR_5527 :{SMALLFONT}{BLACK}Saturated green STR_5528 :{SMALLFONT}{BLACK}Dark green STR_5529 :{SMALLFONT}{BLACK}Moss green @@ -3906,6 +3906,19 @@ STR_5562 :WARNING! STR_5563 :This feature is currently unstable, take extra caution. STR_5564 :Insert Corrupt Element STR_5565 :{SMALLFONT}{BLACK}Inserts a corrupt map element at top of tile. This will hide any element above the corrupt element. +STR_5566 :Password: +STR_5567 :Advertize +STR_5568 :Password Required +STR_5569 :This server requires a password +STR_5570 :Fetch Servers +STR_5571 :Join Game +STR_5572 :Add To Favorites +STR_5573 :Remove From Favorites +STR_5574 :Server Name: +STR_5575 :Max Players: +STR_5576 :Port: +STR_5577 :South Korean Won (W) +STR_5578 :Russian Ruble (R) ######### # Rides # diff --git a/data/language/german.txt b/data/language/german.txt index 552a91cf44..8a048f6ef0 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3858,8 +3858,8 @@ STR_5521 :{SMALLFONT}{BLACK}Lila STR_5522 :{SMALLFONT}{BLACK}Dunkelblau STR_5523 :{SMALLFONT}{BLACK}Hellblau STR_5524 :{SMALLFONT}{BLACK}Himmelblau -STR_5525 :{SMALLFONT}{BLACK}Blaugrün -STR_5526 :{SMALLFONT}{BLACK}Aquamarinblau +STR_5525 :{SMALLFONT}{BLACK}Dunkles Wasser +STR_5526 :{SMALLFONT}{BLACK}Helles Wasser STR_5527 :{SMALLFONT}{BLACK}Gesättigtes Grün STR_5528 :{SMALLFONT}{BLACK}Dunkelgrün STR_5529 :{SMALLFONT}{BLACK}Moosgrün @@ -3899,6 +3899,19 @@ STR_5562 :WARNUNG! STR_5563 :Diese Funktion ist derzeit instabil und mit erhöhter Vorsicht zu verwenden. STR_5564 :Fehlerhaftes Element einf. STR_5565 :{SMALLFONT}{BLACK}Fügt ein fehlerhaftes Kartenelement auf der Kachel ein, dadurch werden alle Elemente darüber versteckt. +STR_5566 :Passwort: +STR_5567 :Veröffentlichen +STR_5568 :Passwort benötigt +STR_5569 :Dieser Server benötigt ein Passwort +STR_5570 :Server abrufen +STR_5571 :Spiel beitreten +STR_5572 :Zu Favoriten hinzufügen +STR_5573 :Aus Favoriten entfernen +STR_5574 :Servername: +STR_5575 :Max. Spieler: +STR_5576 :Port: +STR_5577 :Südkoreanischer Won (W) +STR_5578 :Russischer Rubel (R) ####################### # Bahnen/Attraktionen # From 2ee1e05408cd8c58689950cfff056d240253017d Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Mon, 9 Nov 2015 17:39:49 +0000 Subject: [PATCH 1030/1173] Implemented seatpositionoffset. --- src/ride/track_paint.c | 65 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/src/ride/track_paint.c b/src/ride/track_paint.c index 5d6920f3ec..235046d684 100644 --- a/src/ride/track_paint.c +++ b/src/ride/track_paint.c @@ -217,6 +217,62 @@ rct_xy16 loc_7667AC[] = { { .x = 0, .y = 1 }, }; +/* rct2: 0x0142811C + * Can be calculated as Rounddown(34*sin(x)+0.5) + * where x is in 7.5 deg segments. + */ +sint8 SeatPositionOffset[] = { + 0, + 4, + 9, + 13, + 17, + 21, + 24, + 27, + 29, + 31, + 33, + 34, + 34, + 34, + 33, + 31, + 29, + 27, + 24, + 21, + 17, + 13, + 9, + 4, + 0, + -3, + -8, + -12, + -16, + -20, + -23, + -26, + -28, + -30, + -32, + -33, + -33, + -33, + -32, + -30, + -28, + -26, + -23, + -20, + -16, + -12, + -8, + -3, + 0 +}; + /* rct2: 0x0076750D */ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction, int height, rct_map_element* mapElement) { // As we will be drawing a vehicle we need to backup the mapElement that @@ -331,18 +387,19 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction }; seatCoords.z += RCT2_ADDRESS(0x14280BC, sint16)[armRotation]; + assert(armRotation < sizeof(SeatPositionOffset)); switch (direction) { case 0: - seatCoords.x -= RCT2_ADDRESS(0x0142811C, sint8)[armRotation]; + seatCoords.x -= SeatPositionOffset[armRotation]; break; case 1: - seatCoords.y += RCT2_ADDRESS(0x0142811C, sint8)[armRotation]; + seatCoords.y += SeatPositionOffset[armRotation]; break; case 2: - seatCoords.x += RCT2_ADDRESS(0x0142811C, sint8)[armRotation]; + seatCoords.x += SeatPositionOffset[armRotation]; break; case 3: - seatCoords.y -= RCT2_ADDRESS(0x0142811C, sint8)[armRotation]; + seatCoords.y -= SeatPositionOffset[armRotation]; break; } From 501d36b16c25f751f79a0c6fb9fcdff0e4e1e4d5 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 9 Nov 2015 18:39:22 +0000 Subject: [PATCH 1031/1173] format top spin seat position offset array --- src/ride/track_paint.c | 65 +++++++----------------------------------- 1 file changed, 10 insertions(+), 55 deletions(-) diff --git a/src/ride/track_paint.c b/src/ride/track_paint.c index 235046d684..e95844c3a5 100644 --- a/src/ride/track_paint.c +++ b/src/ride/track_paint.c @@ -221,56 +221,11 @@ rct_xy16 loc_7667AC[] = { * Can be calculated as Rounddown(34*sin(x)+0.5) * where x is in 7.5 deg segments. */ -sint8 SeatPositionOffset[] = { - 0, - 4, - 9, - 13, - 17, - 21, - 24, - 27, - 29, - 31, - 33, - 34, - 34, - 34, - 33, - 31, - 29, - 27, - 24, - 21, - 17, - 13, - 9, - 4, - 0, - -3, - -8, - -12, - -16, - -20, - -23, - -26, - -28, - -30, - -32, - -33, - -33, - -33, - -32, - -30, - -28, - -26, - -23, - -20, - -16, - -12, - -8, - -3, - 0 +static sint8 TopSpinSeatPositionOffset[] = { + 0, 4, 9, 13, 17, 21, 24, 27, 29, 31, 33, 34, 34, 34, 33, 31, + 29, 27, 24, 21, 17, 13, 9, 4, 0, -3, -8, -12, -16, -20, -23, -26, + -28, -30, -32, -33, -33, -33, -32, -30, -28, -26, -23, -20, -16, -12, -8, -3, + 0 }; /* rct2: 0x0076750D */ @@ -387,19 +342,19 @@ void top_spin_paint_vehicle(sint8 al, sint8 cl, uint8 rideIndex, uint8 direction }; seatCoords.z += RCT2_ADDRESS(0x14280BC, sint16)[armRotation]; - assert(armRotation < sizeof(SeatPositionOffset)); + assert(armRotation < sizeof(TopSpinSeatPositionOffset)); switch (direction) { case 0: - seatCoords.x -= SeatPositionOffset[armRotation]; + seatCoords.x -= TopSpinSeatPositionOffset[armRotation]; break; case 1: - seatCoords.y += SeatPositionOffset[armRotation]; + seatCoords.y += TopSpinSeatPositionOffset[armRotation]; break; case 2: - seatCoords.x += SeatPositionOffset[armRotation]; + seatCoords.x += TopSpinSeatPositionOffset[armRotation]; break; case 3: - seatCoords.y -= SeatPositionOffset[armRotation]; + seatCoords.y -= TopSpinSeatPositionOffset[armRotation]; break; } From efb30a8121f2c7ed9db00d841bd77f19fe7e3e22 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Mon, 9 Nov 2015 18:48:03 +0000 Subject: [PATCH 1032/1173] Fix #2037. Issue caused by reseting the zoom difference before too early. --- src/editor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/editor.c b/src/editor.c index 76d53e952f..7b4b98e3cd 100644 --- a/src/editor.c +++ b/src/editor.c @@ -539,10 +539,10 @@ static void editor_finalise_main_view() w->saved_view_x = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_X, sint16); w->saved_view_y = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_Y, sint16); - viewport->zoom = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, uint16) & 0xFF; RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8) = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, uint16) >> 8; int zoom_difference = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, sint16) - viewport->zoom; + viewport->zoom = RCT2_GLOBAL(RCT2_ADDRESS_SAVED_VIEW_ZOOM_AND_ROTATION, uint16) & 0xFF; if (zoom_difference != 0) { if (zoom_difference >= 0) { viewport->view_width <<= zoom_difference; From 1bd665563bfff9e312f1b0cb5ecb6c9fd4812fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Mon, 9 Nov 2015 22:11:46 +0100 Subject: [PATCH 1033/1173] Improve memory setup for Linux DATASEG was mapped, but did not have its contents filled properly. It is now done as the process expects it. Extend memory checksum region to catch possible corruptions early. Fixes #2063 --- src/openrct2.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/openrct2.c b/src/openrct2.c index 483f0533f2..b3833ac573 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -501,7 +501,8 @@ static bool openrct2_setup_rct2_segment() // Linux will run OpenRCT2 as a native application and then load in the Windows PE, mapping the appropriate addresses as // necessary. Windows does not need to do this as OpenRCT2 runs as a DLL loaded from the Windows PE. #ifdef __linux__ - #define DATA_OFFSET 0x004A4000 + #define RDATA_OFFSET 0x004A4000 + #define DATASEG_OFFSET 0x005E2000 const char *exepath = "openrct2.exe"; gExeFd = open(exepath, O_RDONLY); @@ -567,7 +568,9 @@ static bool openrct2_setup_rct2_segment() } // .rdata and real part of .data // 0x9e2000 - 0x8a4000 = 0x13e000 - memcpy(gDataSegment, fbase + DATA_OFFSET, 0x13e000); + memcpy(gDataSegment, fbase + RDATA_OFFSET, 0x13e000); + // 0x8a4000 + 0xb84000 = 0x1428000 aka DATASEG + memcpy(gDataSegment + 0xB84000, fbase + DATASEG_OFFSET, 0x1000); err = munmap(fbase, file_size); if (err != 0) { @@ -577,13 +580,15 @@ static bool openrct2_setup_rct2_segment() #endif // __linux__ // Check that the expected data is at various addresses. - const uint32 c1 = sawyercoding_calculate_checksum((void *)0x009ACFA4, 128); - const uint32 c2 = sawyercoding_calculate_checksum((void *)0x009ACFA4, 720 * 4); - const uint32 exp_c1 = 32640; - const uint32 exp_c2 = 734400; + // Start at 0x9a6000, which is start of .data, to skip the region containing addresses to DLL + // calls, which can be changed by windows/wine loader. + const uint32 c1 = sawyercoding_calculate_checksum((void *)0x009A6000, 0x009E0000 - 0x009A6000); + const uint32 c2 = sawyercoding_calculate_checksum((void *)0x01428000, 0x014282BC - 0x01428000); + const uint32 exp_c1 = 10114815; + const uint32 exp_c2 = 23564; if (c1 != exp_c1 || c2 != exp_c2) { log_warning("c1 = %u, expected %u, match %d", c1, exp_c1, c1 == exp_c1); - log_warning("c1 = %u, expected %u, match %d", c2, exp_c2, c2 == exp_c2); + log_warning("c2 = %u, expected %u, match %d", c2, exp_c2, c2 == exp_c2); return false; } From 207e8e80085644648e4fb3cab433c7defe43bd60 Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 10 Nov 2015 04:00:19 +0000 Subject: [PATCH 1034/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 25 ++++++++++++++++++--- data/language/korean.txt | 32 ++++++++++++++++++++++++--- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 2fc92c4639..6364397fb5 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -2712,7 +2712,7 @@ STR_2703 :每15分鐘 STR_2704 :每30分鐘 STR_2705 :每小時 STR_2706 :從不 -STR_2707 :開啟新視窗 +STR_2707 :使用操作系統的對話框 STR_2708 :{WINDOW_COLOUR_1}你確定要覆蓋存檔{STRINGID}? STR_2709 :覆蓋 STR_2710 :請輸入存檔名稱: @@ -3827,7 +3827,7 @@ STR_5484 :{BLACK}(還剩{COMMA16}週結束) STR_5485 :{SMALLFONT}{STRING} STR_5486 :{BLACK}{COMMA16} STR_5487 :{SMALLFONT}{BLACK}顯示最近消息 -STR_5488 :隱藏入口 +STR_5488 :隱藏入口 (只適用於OpenRCT2!) STR_5489 :{SMALLFONT}{BLACK}只顯示追蹤中的遊客 STR_5490 :失去焦點時靜音 STR_5491 :研發列表 @@ -3900,6 +3900,25 @@ STR_5557 :多人遊戲不同步時依然保持連線 STR_5558 :此設定會於重啟遊戲後生效 STR_5559 :檢查時距為10分鐘 STR_5560 :將所有遊樂設施的檢查時距設定為'每10分鐘' +STR_5561 :載入語言檔案失敗 +STR_5562 :警告! +STR_5563 :此功能暫未穩定地使用, 請多加留意. +STR_5564 :插入已損壞元素 +STR_5565 :{SMALLFONT}{BLACK}在一個網格的最上插入一個已損壞的地圖元素. 此插入會隱藏其他元素. +STR_5566 :密碼: +STR_5567 :推廣 +STR_5568 :輸入密碼 +STR_5569 :此伺服器被密碼保護 +STR_5570 :索取伺服器 +STR_5571 :加入遊戲 +STR_5572 :加入最愛 +STR_5573 :由最愛中移除 +STR_5574 :伺服器名稱: +STR_5575 :最多玩家數: +STR_5576 :連接埠: +STR_5577 :南韓園 (₩) +STR_5578 :俄羅斯盧布 (R) + ##################### # Rides/attractions # @@ -3958,7 +3977,7 @@ STR_DESC :大載客量的單軌電車 STR_CPTY :每車卡8個乘客 [TRAM1] -STR_NAME :電車Trams +STR_NAME :電車 STR_DESC :復刻的懷舊電車 STR_CPTY :每車卡10個乘客 diff --git a/data/language/korean.txt b/data/language/korean.txt index ff1df96f43..11e08e4aad 100644 --- a/data/language/korean.txt +++ b/data/language/korean.txt @@ -3486,7 +3486,7 @@ STR_5146 :엄청 빠른 속도 STR_5147 :치트 STR_5148 :{SMALLFONT}{BLACK}게임 속도를 변경합니다 STR_5149 :{SMALLFONT}{BLACK}치트 창을 엽니다 -STR_5150 :디버킹 도구를 사용합니다 +STR_5150 :디버깅 도구를 사용합니다 STR_5151 :, STR_5152 :. STR_5153 :테마 수정... @@ -3575,7 +3575,7 @@ STR_5235 :{SMALLFONT}{BLACK}설정 STR_5236 :창: STR_5237 :색상표: STR_5238 :현재 테마: -STR_5239 :중복 +STR_5239 :복제 STR_5240 :테마 이름을 입력하세요 STR_5241 :테마를 변경할 수 없습니다 STR_5242 :테마 이름이 이미 존재합니다 @@ -3708,7 +3708,7 @@ STR_5368 :충돌 이력 제거 STR_5369 :공원 설정... STR_5370 :{SMALLFONT}{BLACK}제한, 손님 생성, 돈 등의{NEWLINE}공원과 관련된 설정을 수정하려면{NEWLINE}이 버튼을 클릭하세요. STR_5371 :오브젝트 선택 -STR_5372 :마우스 오른쪽으로 드래그하는 것을 왼쪽으로 변경 +STR_5372 :마우스 오른쪽 드래그시 좌우 반전 STR_5373 :이름 {STRINGID} STR_5374 :날짜 {STRINGID} STR_5375 :{UP} @@ -3889,6 +3889,32 @@ STR_5549 :연/월/일 STR_5550 :{POP16}{POP16}{COMMA16}년 {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} STR_5551 :연/일/월 STR_5552 :{POP16}{POP16}{COMMA16}년 {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} +STR_5553 :스팀 오버레이가 열려있으면 게임을 일시정지 +STR_5554 :{SMALLFONT}{BLACK}산 만들기 도구 사용 +STR_5555 :다른 종류의 놀이기구 차량을 보여줌 +STR_5556 :플레이어 추방 +STR_5557 :비동기화 이후에 계속 접속 (멀티플레이) +STR_5558 :이 설정을 적용하기 위해서는 재시작해야합니다 +STR_5559 :점검 시간 10분으로 +STR_5560 :{SMALLFONT}{BLACK}모든 놀이기구의 점검 시간을 '매 10분마다'로 설정합니다 +STR_5561 :언어 파일을 불러오는 데 실패하였습니다 +STR_5562 :경고! +STR_5563 :이 기능은 현재 불안정하여 오류가 나올 수 있습니다 +STR_5564 :오류 요소를 삽입 +STR_5565 :{SMALLFONT}{BLACK}오류가 난 맵 요소를 칸의 최상단에 삽입합니다. 이는 오류 요소의 위에 있는 그 어떤 요소도 숨길 것입니다. +STR_5566 :암호: +STR_5567 :광고 +STR_5568 :암호 필요 +STR_5569 :이 서버에 접속하려면 암호가 필요합니다 +STR_5570 :서버 검색 +STR_5571 :게임 참여 +STR_5572 :즐겨찾기 등록 +STR_5573 :즐거찾기 제거 +STR_5574 :서버 이름: +STR_5575 :최대 플레이어 수: +STR_5576 :포트: +STR_5577 :대한민국 원 (₩) +STR_5578 :러시아 루블 (R) ##################### # Rides/attractions # From 1f08f092dd3a4af7fe438c1ed518f00aadea28ff Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 10 Nov 2015 17:23:38 +0000 Subject: [PATCH 1035/1173] Fix #2273 This was also allowing bins to be paid for placing in a 4 connected tile --- src/world/footpath.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/footpath.c b/src/world/footpath.c index 291017e930..8a61f1e758 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -233,7 +233,7 @@ static money32 footpath_element_update(int x, int y, rct_map_element *mapElement return MONEY32_UNDEFINED; } - if ((unk6 & 0x30) && (mapElement->properties.path.edges & 0x0F) == 0x0F) { + if (!(unk6 & 0x30) && (mapElement->properties.path.edges & 0x0F) == 0x0F) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_NONE; return MONEY32_UNDEFINED; } From e6c08fcdf4af861c7cda2bfd99d877f6ede8ede7 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 10 Nov 2015 19:04:36 +0000 Subject: [PATCH 1036/1173] Fix #1539. This is an alternative to @warp-10 's technique. Sets a flag when using the clear large scenery to prevent profit when destroying large scenery. --- src/world/map.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 81919c5ff4..7b9083b36f 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -994,6 +994,7 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i firstTile.x = x - firstTile.x; firstTile.y = y - firstTile.y; + bool calculate_cost = true; for (int i = 0; scenery_entry->large_scenery.tiles[i].x_offset != -1; i++){ rct_xyz16 currentTile = { @@ -1016,8 +1017,14 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i } // If not applying then no need to delete the actual element - if (!(*ebx & GAME_COMMAND_FLAG_APPLY)) + if (!(*ebx & GAME_COMMAND_FLAG_APPLY)) { + if (*ebx & (1 << 7)) { + if (map_element->flags & (1 << 6)) + calculate_cost = false; + map_element->flags |= (1 << 6); + } continue; + } rct_map_element* sceneryElement = map_get_first_element_at(currentTile.x / 32, currentTile.y / 32); uint8 tile_not_found = 1; @@ -1051,7 +1058,8 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i } *ebx = scenery_entry->large_scenery.removal_price * 10; - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY){ + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY || + calculate_cost == false){ *ebx = 0; } return; @@ -1448,7 +1456,7 @@ restart_from_beginning: int ecx = y * 32; int edx = mapElement->base_height | ((mapElement->properties.scenerymultiple.type >> 10) << 8); int edi = 0, ebp = 0; - cost = game_do_command(eax, ebx, ecx, edx, GAME_COMMAND_REMOVE_LARGE_SCENERY, edi, ebp); + cost = game_do_command(eax, ebx | (1 << 7), ecx, edx, GAME_COMMAND_REMOVE_LARGE_SCENERY, edi, ebp); if (cost == MONEY32_UNDEFINED) return MONEY32_UNDEFINED; @@ -1465,6 +1473,23 @@ restart_from_beginning: return totalCost; } +/* Function to clear the flag that is set to prevent cost duplication + * when using the clear scenery tool with large scenery. + */ +void map_reset_clear_large_scenery_flag(int x0, int y0, int x1, int y1){ + rct_map_element* mapElement; + for (int y = y0; y <= y1; y += 32) { + for (int x = x0; x <= x1; x += 32) { + mapElement = map_get_first_element_at(x / 32, y / 32); + do { + if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_SCENERY_MULTIPLE) { + mapElement->flags &= ~(1 << 6); + } + } while (!map_element_is_last_for_tile(mapElement++)); + } + } +} + money32 map_clear_scenery(int x0, int y0, int x1, int y1, int clear, int flags) { int x, y, z; @@ -1501,6 +1526,10 @@ money32 map_clear_scenery(int x0, int y0, int x1, int y1, int clear, int flags) } } + if (clear & (1 << 1)) { + map_reset_clear_large_scenery_flag(x0, y0, x1, y1); + } + return noValidTiles ? MONEY32_UNDEFINED : totalCost; } From 026dba0348926fcb4988218b84423b69ccf00578 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 10 Nov 2015 19:38:48 +0000 Subject: [PATCH 1037/1173] Fix issue with last commit. If large scenery was outside of selection area it would not have its flag reset. Now it will clear the flag for all large tiles. This could do with improving at some point in the future --- src/world/map.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 7b9083b36f..252c9e41da 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1476,11 +1476,12 @@ restart_from_beginning: /* Function to clear the flag that is set to prevent cost duplication * when using the clear scenery tool with large scenery. */ -void map_reset_clear_large_scenery_flag(int x0, int y0, int x1, int y1){ +void map_reset_clear_large_scenery_flag(){ rct_map_element* mapElement; - for (int y = y0; y <= y1; y += 32) { - for (int x = x0; x <= x1; x += 32) { - mapElement = map_get_first_element_at(x / 32, y / 32); + // TODO: Improve efficiency of this + for (int y = 0; y <= 255; y++) { + for (int x = 0; x <= 255; x++) { + mapElement = map_get_first_element_at(x, y); do { if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_SCENERY_MULTIPLE) { mapElement->flags &= ~(1 << 6); @@ -1527,7 +1528,7 @@ money32 map_clear_scenery(int x0, int y0, int x1, int y1, int clear, int flags) } if (clear & (1 << 1)) { - map_reset_clear_large_scenery_flag(x0, y0, x1, y1); + map_reset_clear_large_scenery_flag(); } return noValidTiles ? MONEY32_UNDEFINED : totalCost; From c9de9aeee0ffcafc140ff0646bcd22418626cf87 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 10 Nov 2015 21:23:16 +0000 Subject: [PATCH 1038/1173] fix #2051, stop queue paths connecting to three different directions --- src/world/footpath.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/world/footpath.c b/src/world/footpath.c index 8a61f1e758..d72ed3b56c 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -1326,6 +1326,17 @@ void footpath_chain_ride_queue(int rideIndex, int entranceIndex, int x, int y, r foundNextPath: if (footpath_element_is_queue(mapElement)) { + // Fix #2051: Stop queue paths that are already connected to two other tiles + // from connecting to the tile we are coming from. + int edges = mapElement->properties.path.edges; + int numEdges = bitcount(edges); + if (numEdges >= 2) { + int requiredEdgeMask = 1 << (direction ^ 2); + if (!(edges & requiredEdgeMask)) { + break; + } + } + mapElement->properties.path.type &= ~(1 << 3); mapElement->properties.path.edges |= (1 << (direction ^ 2)); mapElement->properties.path.ride_index = rideIndex; From 54ff0b2045773390c760340021bbe5bfd70ae8ce Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 10 Nov 2015 21:28:10 +0000 Subject: [PATCH 1039/1173] ride_with_colour_config_exists should ignore itself --- src/ride/ride.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index f71d2fe8f2..bb7261ad5b 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5110,13 +5110,14 @@ static int ride_get_default_mode(rct_ride *ride) return availableModes[0]; } -static bool ride_with_colour_config_exists(int rideType, const track_colour *colours) +static bool ride_with_colour_config_exists(rct_ride *srcRide, const track_colour *colours) { rct_ride *ride; int i; FOR_ALL_RIDES(i, ride) { - if (ride->type != rideType) continue; + if (ride != srcRide) continue; + if (ride->type != srcRide->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; @@ -5158,7 +5159,7 @@ static void ride_set_to_random_colour_preset(rct_ride *ride) int listIndex = scenario_rand() % colourPresets->count; colours = &colourPresets->list[listIndex]; - if (!ride_with_colour_config_exists(ride->type, colours)) { + if (!ride_with_colour_config_exists(ride, colours)) { break; } } From 77699e99e5b7f4e132cebd6d9cc40c7a84ae8b24 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 10 Nov 2015 21:34:09 +0000 Subject: [PATCH 1040/1173] Final fix of #2151. Large Scenery, land, water now also force a retry of track placement. Small scenery, walls do not block tracks so do not require this. --- src/world/map.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/world/map.c b/src/world/map.c index 252c9e41da..72285dfd52 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1844,6 +1844,9 @@ money32 raise_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b } } + // Force ride construction to recheck area + RCT2_GLOBAL(0x00F440B0, uint8) |= 8; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = x; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y; @@ -1908,6 +1911,9 @@ money32 lower_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b } } + // Force ride construction to recheck area + RCT2_GLOBAL(0x00F440B0, uint8) |= 8; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = x; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y; @@ -1979,6 +1985,9 @@ money32 raise_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags) sound_play_panned(SOUND_LAYING_OUT_WATER, 0x8001, x, y, z); } + // Force ride construction to recheck area + RCT2_GLOBAL(0x00F440B0, uint8) |= 8; + return cost; } @@ -2041,6 +2050,9 @@ money32 lower_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags) sound_play_panned(SOUND_LAYING_OUT_WATER, 0x8001, x, y, z); } + // Force ride construction to recheck area + RCT2_GLOBAL(0x00F440B0, uint8) |= 8; + return cost; } @@ -3481,6 +3493,10 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in tile++; tile_num++; }while(1); + + // Force ride construction to recheck area + RCT2_GLOBAL(0x00F440B0, uint8) |= 8; + *ebx = (scenery_entry->large_scenery.price * 10) + RCT2_GLOBAL(0x00F4389A, uint32); if(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY){ *ebx = 0; From 2b02a04114c63dbc51a3994abd2b0aa405bfb7cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Wed, 11 Nov 2015 08:05:52 +0100 Subject: [PATCH 1041/1173] Use C++'s std::abs instead of C's to get floats C's abs() will only work on int values, only std::abs will get floats. --- src/audio/mixer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index fa692f1787..d8c4bcfb19 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -26,6 +26,7 @@ extern "C" { #include "audio.h" } #include "mixer.h" +#include Mixer gMixer; @@ -393,7 +394,7 @@ void Channel::SetPan(float pan) if (pan < 0) { Channel::pan = 0; } - double decibels = (abs(Channel::pan - 0.5) * 2.0) * 100.0; + double decibels = (std::abs(Channel::pan - 0.5) * 2.0) * 100.0; double attenuation = pow(10, decibels / 20.0); if (Channel::pan <= 0.5) { volume_l = 1.0; From 74cc03ac06e0d0ff576d7a1b6f6bdf76714bd02c Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Wed, 11 Nov 2015 15:17:43 +0100 Subject: [PATCH 1042/1173] Fix title sequence script interpreter treating parameters as commands (fixes #2284) --- src/title.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/title.c b/src/title.c index 56bb9e1265..1b8abc325a 100644 --- a/src/title.c +++ b/src/title.c @@ -80,6 +80,7 @@ static const uint8 _magicMountainScript[] = { static uint8* _loadedScript; static const uint8* _currentScript; +static uint8 _lastOpcode; static int _scriptNoLoadsSinceRestart; static int _scriptWaitCounter; static int _scriptCurrentPreset; @@ -264,6 +265,8 @@ static void title_skip_opcode() script_opcode = *_currentScript++; gTitleScriptCommand++; + _lastOpcode = script_opcode; + switch (script_opcode) { case TITLE_SCRIPT_WAIT: _currentScript++; @@ -314,6 +317,9 @@ static void title_do_next_script_opcode() return; } } + + _lastOpcode = script_opcode; + switch (script_opcode) { case TITLE_SCRIPT_END: _scriptWaitCounter = 1; @@ -439,7 +445,7 @@ static void title_update_showcase() if (gTitleScriptSkipTo != -1 && gTitleScriptSkipLoad != -1) _scriptWaitCounter = 0; - else if (*(_currentScript - 1) != TITLE_SCRIPT_END) + else if (_lastOpcode != TITLE_SCRIPT_END) _scriptWaitCounter--; } while (gTitleScriptSkipTo != -1 && gTitleScriptSkipLoad != -1); From 6a00482d1f3b265fb05aa39b3c151c061f7e7a95 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Wed, 11 Nov 2015 19:44:53 +0000 Subject: [PATCH 1043/1173] Fix #1834 & #2288. Non complete circuit tracks now save correctly. Issue was caused by a bit of code not iterating correctly backwards. --- projects/openrct2.vcxproj | 2 +- src/ride/track.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 677c094f89..75abfce101 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -368,7 +368,7 @@ Disabled true 1Byte - DEBUG;DEBUG_DESYNC;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;SDL_MAIN_HANDLED;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) + DEBUG;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;CURL_STATICLIB;SDL_MAIN_HANDLED;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true $(IntDir)fake\%(RelativeDir) diff --git a/src/ride/track.c b/src/ride/track.c index 695477317d..bdf5772f17 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -2654,14 +2654,22 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra } int z = 0; - //6ce69e + // Find the start of the track. + // It has to do this as a backwards loop incase this is an incomplete track. if (track_block_get_previous(trackElement.x, trackElement.y, trackElement.element, &trackBeginEnd)) { rct_map_element* initial_map = trackElement.element; do { + rct_xy_element lastGood = { + .element = trackBeginEnd.begin_element, + .x = trackBeginEnd.begin_x, + .y = trackBeginEnd.begin_y + }; + if (!track_block_get_previous(trackBeginEnd.begin_x, trackBeginEnd.begin_y, trackBeginEnd.begin_element, &trackBeginEnd)) { + trackElement = lastGood; break; } - } while (initial_map != trackElement.element); + } while (initial_map != trackBeginEnd.begin_element); } z = trackElement.element->base_height * 8; From e857f2d3c84edf5212f37cec485dbcb5f7456e83 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Wed, 11 Nov 2015 20:24:59 +0000 Subject: [PATCH 1044/1173] Refactor set_banner and set_large_scenery --- src/world/map.c | 157 +++++++++++++++++++++--------------------------- 1 file changed, 67 insertions(+), 90 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 72285dfd52..e909630b87 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1226,8 +1226,9 @@ void game_command_set_large_scenery_colour(int* eax, int* ebx, int* ecx, int* ed int x = *eax; int y = *ecx; uint8 map_element_direction = *ebx >> 8; + uint8 flags = *ebx & 0xFF; uint8 base_height = *edx; - uint8 scenerymultiple_index = *edx >> 8; + uint8 tileIndex = *edx >> 8; uint8 color1 = *ebp; uint8 color2 = *ebp >> 8; int z = map_element_height(x, y); @@ -1235,100 +1236,66 @@ void game_command_set_large_scenery_colour(int* eax, int* ebx, int* ecx, int* ed RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; + rct_map_element *map_element = map_get_large_scenery_segment(x, y, base_height, map_element_direction, tileIndex); - rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); - while(map_element_get_type(map_element) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE || - map_element->base_height != base_height || - map_element->properties.scenerymultiple.type >> 10 != scenerymultiple_index || - (map_element->type & MAP_ELEMENT_DIRECTION_MASK) != map_element_direction){ - map_element++; - if((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE){ - *ebx = 0; - return; - } - } - if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)){ + if(map_element == NULL){ *ebx = 0; return; } - int ecx2 = map_element->properties.scenerymultiple.type >> 10; - rct_scenery_entry* scenery_entry = RCT2_ADDRESS(RCT2_ADDRESS_LARGE_SCENERY_ENTRIES, rct_scenery_entry*)[map_element->properties.scenerymultiple.type & 0x3FF]; - int x2 = scenery_entry->large_scenery.tiles[ecx2].x_offset; - int y2 = scenery_entry->large_scenery.tiles[ecx2].y_offset; - int z2 = (base_height * 8) - scenery_entry->large_scenery.tiles[ecx2].z_offset; - switch(map_element->type & MAP_ELEMENT_DIRECTION_MASK){ - case MAP_ELEMENT_DIRECTION_WEST: - break; - case MAP_ELEMENT_DIRECTION_NORTH:{ - int temp = x2; - x2 = y2; - y2 = -temp; - }break; - case MAP_ELEMENT_DIRECTION_EAST: - x2 = -x2; - y2 = -y2; - break; - case MAP_ELEMENT_DIRECTION_SOUTH:{ - int temp = y2; - y2 = x2; - x2 = -temp; - }break; + + if((flags & GAME_COMMAND_FLAG_GHOST) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)){ + *ebx = 0; + return; } - x2 = -x2 + x; - y2 = -y2 + y; - int i = 0; - while(1){ - if(scenery_entry->large_scenery.tiles[i].x_offset == -1){ - *ebx = 0; - return; - } - int x3 = scenery_entry->large_scenery.tiles[i].x_offset; - int y3 = scenery_entry->large_scenery.tiles[i].y_offset; - int z3 = scenery_entry->large_scenery.tiles[i].z_offset; - switch(map_element->type & MAP_ELEMENT_DIRECTION_MASK){ - case MAP_ELEMENT_DIRECTION_WEST: - break; - case MAP_ELEMENT_DIRECTION_NORTH:{ - int temp = x3; - x3 = y3; - y3 = -temp; - }break; - case MAP_ELEMENT_DIRECTION_EAST: - x3 = -x3; - y3 = -y3; - break; - case MAP_ELEMENT_DIRECTION_SOUTH:{ - int temp = y3; - y3 = x3; - x3 = -temp; - }break; - } - x3 += x2; - y3 += y2; - z3 += z2; + + rct_scenery_entry* scenery_entry = RCT2_ADDRESS(RCT2_ADDRESS_LARGE_SCENERY_ENTRIES, rct_scenery_entry*)[map_element->properties.scenerymultiple.type & 0x3FF]; + + // Work out the base tile coordinates (Tile with index 0) + rct_xyz16 baseTile = { + .x = scenery_entry->large_scenery.tiles[tileIndex].x_offset, + .y = scenery_entry->large_scenery.tiles[tileIndex].y_offset, + .z = (base_height * 8) - scenery_entry->large_scenery.tiles[tileIndex].z_offset + }; + rotate_map_coordinates(&baseTile.x, &baseTile.y, map_element_direction); + baseTile.x = x - baseTile.x; + baseTile.y = y - baseTile.y; + + for (int i = 0; scenery_entry->large_scenery.tiles[i].x_offset != -1; ++i) { + assert(i < 256); + + // Work out the current tile coordinates + rct_xyz16 currentTile = { + .x = scenery_entry->large_scenery.tiles[i].x_offset, + .y = scenery_entry->large_scenery.tiles[i].y_offset, + .z = scenery_entry->large_scenery.tiles[i].z_offset + }; + rotate_map_coordinates(¤tTile.x, ¤tTile.y, map_element_direction); + currentTile.x += baseTile.x; + currentTile.y += baseTile.y; + currentTile.z += baseTile.z; + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode){ - if (!map_is_location_owned(x3, y3, z3)){ + if (!map_is_location_owned(currentTile.x, currentTile.y, currentTile.z)){ *ebx = MONEY32_UNDEFINED; return; } } - if(*ebx & GAME_COMMAND_FLAG_APPLY){ - rct_map_element* map_element = map_get_first_element_at(x3 / 32, y3 / 32); - while(map_element_get_type(map_element) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE || - (map_element->type & MAP_ELEMENT_DIRECTION_MASK) != map_element_direction || - map_element->properties.scenerymultiple.type >> 10 != i || - map_element->base_height != base_height){ - map_element++; - } - map_element->properties.scenerymultiple.colour[0] &= 0xE0; - map_element->properties.scenerymultiple.colour[0] |= color1; - map_element->properties.scenerymultiple.colour[1] &= 0xE0; - map_element->properties.scenerymultiple.colour[1] |= color2; - map_invalidate_tile_full(x3, y3); - } + if(flags & GAME_COMMAND_FLAG_APPLY){ + rct_map_element* mapElement = map_get_large_scenery_segment( + currentTile.x, + currentTile.y, + base_height, + map_element_direction, + i); - i++; + mapElement->properties.scenerymultiple.colour[0] &= 0xE0; + mapElement->properties.scenerymultiple.colour[0] |= color1; + mapElement->properties.scenerymultiple.colour[1] &= 0xE0; + mapElement->properties.scenerymultiple.colour[1] |= color2; + + map_invalidate_tile_full(currentTile.x, currentTile.y); + } } *ebx = 0; } @@ -1359,14 +1326,24 @@ void game_command_set_banner_colour(int* eax, int* ebx, int* ecx, int* edx, int* if(*ebx & GAME_COMMAND_FLAG_APPLY){ rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); - while(map_element->type != MAP_ELEMENT_TYPE_BANNER || - map_element->properties.banner.position != banner_position){ - map_element++; - if((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE){ - *ebx = MONEY32_UNDEFINED; - return; - } + + bool found = false; + do { + if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_BANNER) + continue; + + if (map_element->properties.banner.position != banner_position) + continue; + + found = true; + break; + } while (!map_element_is_last_for_tile(map_element++)); + + if (found == false){ + *ebx = MONEY32_UNDEFINED; + return; } + rct_window* window = window_find_by_number(WC_BANNER, map_element->properties.banner.index); if(window){ window_invalidate(window); From 7f541240e2e6e250e2ed6bf4d93574d862596e59 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 11 Nov 2015 21:37:26 +0000 Subject: [PATCH 1045/1173] fix #2279, make game remember save path rather than filename --- src/game.c | 18 +++++------------- src/scenario.c | 12 +++++++++--- src/scenario.h | 2 +- src/windows/loadsave.c | 15 +++++++++------ 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/game.c b/src/game.c index bfeb6a639c..27eecd0f97 100644 --- a/src/game.c +++ b/src/game.c @@ -886,8 +886,7 @@ int game_load_save(const char *path) safe_strncpy((char*)0x0141EF68, path, MAX_PATH); safe_strncpy((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2, path, MAX_PATH); - safe_strncpy(gScenarioSaveName, path_get_filename(path), MAX_PATH); - path_remove_extension(gScenarioSaveName); + safe_strncpy(gScenarioSavePath, path, MAX_PATH); SDL_RWops* rw = SDL_RWFromFile(path, "rb"); if (rw == NULL) { @@ -1033,19 +1032,12 @@ static int show_save_game_dialog(char *resultPath) void save_game() { if (!gFirstTimeSave) { - utf8 path[MAX_PATH]; + log_verbose("Saving to %s", gScenarioSavePath); - log_verbose("Saving to %s", gScenarioSaveName); - - platform_get_user_directory(path, "save"); - - strcat(path, gScenarioSaveName); - strcat(path, ".sv6"); - - SDL_RWops* rw = SDL_RWFromFile(path, "wb+"); + SDL_RWops* rw = SDL_RWFromFile(gScenarioSavePath, "wb+"); if (rw != NULL) { scenario_save(rw, 0x80000000); - log_verbose("Saved to %s", gScenarioSaveName); + log_verbose("Saved to %s", gScenarioSavePath); SDL_RWclose(rw); } } else { @@ -1055,7 +1047,7 @@ void save_game() } void save_game_as() { - window_loadsave_open(LOADSAVETYPE_SAVE | LOADSAVETYPE_GAME, gScenarioSaveName); + window_loadsave_open(LOADSAVETYPE_SAVE | LOADSAVETYPE_GAME, gScenarioSavePath); } diff --git a/src/scenario.c b/src/scenario.c index 18124dfaa8..4d94b7be70 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -47,7 +47,7 @@ static char _scenarioPath[MAX_PATH]; static const char *_scenarioFileName = ""; -char gScenarioSaveName[MAX_PATH]; +char gScenarioSavePath[MAX_PATH]; int gFirstTimeSave = 1; static int scenario_create_ducks(); @@ -354,9 +354,15 @@ void scenario_begin() } // Set the last saved game path - format_string(gScenarioSaveName, RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id), (void*)RCT2_ADDRESS_PARK_NAME_ARGS); + char parkName[128]; + format_string(parkName, RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id), (void*)RCT2_ADDRESS_PARK_NAME_ARGS); + + platform_get_user_directory(gScenarioSavePath, "save"); + strncat(gScenarioSavePath, parkName, sizeof(gScenarioSavePath)); + strncat(gScenarioSavePath, ".sv6", sizeof(gScenarioSavePath)); + strcpy((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2, (char*)RCT2_ADDRESS_SAVED_GAMES_PATH); - strcpy((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2 + strlen((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2), gScenarioSaveName); + strcpy((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2 + strlen((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2), gScenarioSavePath); strcat((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2, ".SV6"); memset((void*)0x001357848, 0, 56); diff --git a/src/scenario.h b/src/scenario.h index afc5f335b5..4aed2a22e9 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -412,7 +412,7 @@ extern int gScenarioListCount; extern int gScenarioListCapacity; extern rct_scenario_basic *gScenarioList; -extern char gScenarioSaveName[MAX_PATH]; +extern char gScenarioSavePath[MAX_PATH]; extern int gFirstTimeSave; int scenario_scores_save(); diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 572bc611c9..ca10ca179d 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -131,7 +131,7 @@ loadsave_list_item *_listItems = NULL; char _directory[MAX_PATH]; char _shortenedDirectory[MAX_PATH]; char _extension[32]; -char *_defaultName = NULL; +char _defaultName[MAX_PATH]; int _loadsaveType; int _type; @@ -153,7 +153,12 @@ rct_window *window_loadsave_open(int type, char *defaultName) int includeNewItem; rct_window* w; _type = type; - _defaultName = defaultName; + _defaultName[0] = 0; + + if (!str_is_null_or_empty(defaultName)) { + safe_strncpy(_defaultName, path_get_filename(defaultName), sizeof(_defaultName)); + path_remove_extension(_defaultName); + } w = window_bring_to_front_by_class(WC_LOADSAVE); if (w == NULL) { @@ -769,8 +774,7 @@ static void window_loadsave_select(rct_window *w, const char *path) network_begin_server(gConfigNetwork.default_port); } - safe_strncpy(gScenarioSaveName, path_get_filename(path), MAX_PATH); - path_remove_extension(gScenarioSaveName); + safe_strncpy(gScenarioSavePath, path, MAX_PATH); gFirstTimeSave = 0; window_close(w); @@ -791,8 +795,7 @@ static void window_loadsave_select(rct_window *w, const char *path) SDL_RWclose(rw); if (success) { - safe_strncpy(gScenarioSaveName, path_get_filename(path), MAX_PATH); - path_remove_extension(gScenarioSaveName); + safe_strncpy(gScenarioSavePath, path, MAX_PATH); gFirstTimeSave = 0; window_close_by_class(WC_LOADSAVE); From ed8e7c2d386a1369e44c6d0fad24e50e0609a002 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 11 Nov 2015 22:39:04 +0000 Subject: [PATCH 1046/1173] add extra server details on gameinfo packet --- src/config.c | 5 ++++- src/config.h | 3 +++ src/network/network.cpp | 10 +++++++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 7dbe386f49..647f59e4f7 100644 --- a/src/config.c +++ b/src/config.c @@ -248,7 +248,10 @@ config_property_definition _networkDefinitions[] = { { offsetof(network_configuration, maxplayers), "maxplayers", CONFIG_VALUE_TYPE_UINT8, 16, NULL }, { offsetof(network_configuration, server_name), "server_name", CONFIG_VALUE_TYPE_STRING, {.value_string = "Server" }, NULL }, { offsetof(network_configuration, server_description), "server_description", CONFIG_VALUE_TYPE_STRING, {.value_string = NULL }, NULL }, - { offsetof(network_configuration, master_server_url), "master_server_url", CONFIG_VALUE_TYPE_STRING, {.value_string = NULL }, NULL } + { offsetof(network_configuration, master_server_url), "master_server_url", CONFIG_VALUE_TYPE_STRING, {.value_string = NULL }, NULL }, + { offsetof(network_configuration, provider_name), "provider_name", CONFIG_VALUE_TYPE_STRING, {.value_string = NULL }, NULL }, + { offsetof(network_configuration, provider_email), "provider_email", CONFIG_VALUE_TYPE_STRING, {.value_string = NULL }, NULL }, + { offsetof(network_configuration, provider_website), "provider_website", CONFIG_VALUE_TYPE_STRING, {.value_string = NULL }, NULL } }; config_section_definition _sectionDefinitions[] = { diff --git a/src/config.h b/src/config.h index fc070133f4..58dae6b559 100644 --- a/src/config.h +++ b/src/config.h @@ -219,6 +219,9 @@ typedef struct { utf8string server_name; utf8string server_description; utf8string master_server_url; + utf8string provider_name; + utf8string provider_email; + utf8string provider_website; } network_configuration; typedef struct theme_window { diff --git a/src/network/network.cpp b/src/network/network.cpp index eabcfdc06e..8c566d4ff1 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -905,7 +905,6 @@ void Network::AdvertiseHeartbeat() json_t *body = json_object(); json_object_set(body, "token", json_string(advertise_token.c_str())); - json_object_set(body, "dedicated", json_boolean(gOpenRCT2Headless)); json_object_set(body, "players", json_integer(network_get_num_players())); json_t *gameInfo = json_object(); @@ -1091,6 +1090,15 @@ void Network::Server_Send_GAMEINFO(NetworkConnection& connection) json_object_set(obj, "players", json_integer(player_list.size())); json_object_set(obj, "maxPlayers", json_integer(gConfigNetwork.maxplayers)); json_object_set(obj, "description", json_string(gConfigNetwork.server_description)); + json_object_set(obj, "dedicated", json_boolean(gOpenRCT2Headless)); + + // Provider details + json_t* jsonProvider = json_object(); + json_object_set(jsonProvider, "name", json_string(gConfigNetwork.provider_name)); + json_object_set(jsonProvider, "email", json_string(gConfigNetwork.provider_email)); + json_object_set(jsonProvider, "website", json_string(gConfigNetwork.provider_website)); + json_object_set(obj, "provider", jsonProvider); + packet->WriteString(json_dumps(obj, 0)); json_decref(obj); #endif From 681723869fffbd287982efc0b323aa8444ec2bdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Mon, 9 Nov 2015 00:02:51 +0100 Subject: [PATCH 1047/1173] Enable display scaling, useful on highdpi screens This allows for NN-scaling of display, a much needed feature on highdpi screens. Scale can be set to positive integer value which will become a zoom factor for whole rendered output. --- distribution/changelog.txt | 3 +- src/config.c | 1 + src/config.h | 1 + src/platform/shared.c | 62 ++++++++++++++++++++++++++------------ 4 files changed, 47 insertions(+), 20 deletions(-) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 37a315ef8e..0b54cb2da6 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -28,7 +28,7 @@ - Feature: Custom user data path specified by command line argument. - Feature: Full UTF-8 language support. - Feature: TTF font integration for non-Latin languages. -- Feature: Added support for Traditional Chinese, Simplified Chinese, Korean, Russian, Finnish and Brazilian Portuguese. +- Feature: Added support for Traditional Chinese, Simplified Chinese, Korean, Russian, Finnish and Brazilian Portuguese. - Feature: Added South Korean Won and Russian Rouble as currencies. - Feature: Allow different date formats. - Feature: Option to automatically pause the game on minimise from fullscreen. @@ -38,6 +38,7 @@ - Feature: Option to automatically place staff after hire. - Feature: Option to enable 'mow grass' by default for handymen (RCT1 style) - Feature: Option to ignore invalid checksums on loaded parks. +- Feature: Option to scale game display for better compatibility with high DPI screens. - Alteration: Autosave is now measured in real-time rather than in-game date. - Technical: DirectDraw, DirectInput, DirectPlay and DirectSound dependencies are no longer used. - Removed: Six Flags branding and limitations. diff --git a/src/config.c b/src/config.c index 647f59e4f7..57530c1df1 100644 --- a/src/config.c +++ b/src/config.c @@ -197,6 +197,7 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, upper_case_banners), "upper_case_banners", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, allow_loading_with_incorrect_checksum),"allow_loading_with_incorrect_checksum", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, steam_overlay_pause), "steam_overlay_pause", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, + { offsetof(general_configuration, scale), "scale", CONFIG_VALUE_TYPE_SINT8, 1, NULL }, }; config_property_definition _interfaceDefinitions[] = { diff --git a/src/config.h b/src/config.h index 58dae6b559..fba4ab4779 100644 --- a/src/config.h +++ b/src/config.h @@ -167,6 +167,7 @@ typedef struct { uint8 upper_case_banners; uint8 allow_loading_with_incorrect_checksum; uint8 steam_overlay_pause; + sint8 scale; } general_configuration; typedef struct { diff --git a/src/platform/shared.c b/src/platform/shared.c index 71bbc88033..a98a4f98aa 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -65,8 +65,9 @@ bool gHardwareDisplay; bool gSteamOverlayActive = false; -static SDL_Surface *_surface; -static SDL_Palette *_palette; +static SDL_Surface *_surface = NULL; +static SDL_Surface *_RGBASurface = NULL; +static SDL_Palette *_palette = NULL; static void *_screenBuffer; static int _screenBufferSize; @@ -285,9 +286,24 @@ void platform_draw() SDL_UnlockSurface(_surface); // Copy the surface to the window - if (SDL_BlitSurface(_surface, NULL, SDL_GetWindowSurface(gWindow), NULL)) { - log_fatal("SDL_BlitSurface %s", SDL_GetError()); - exit(1); + if (gConfigGeneral.scale == 1 || gConfigGeneral.scale <= 0) + { + if (SDL_BlitSurface(_surface, NULL, SDL_GetWindowSurface(gWindow), NULL)) { + log_fatal("SDL_BlitSurface %s", SDL_GetError()); + exit(1); + } + } else { + // first blit to rgba surface to change the pixel format + if (SDL_BlitSurface(_surface, NULL, _RGBASurface, NULL)) { + log_fatal("SDL_BlitSurface %s", SDL_GetError()); + exit(1); + } + // then scale to window size. Without changing to RGBA first, SDL complains + // about blit configurations being incompatible. + if (SDL_BlitScaled(_RGBASurface, NULL, SDL_GetWindowSurface(gWindow), NULL)) { + log_fatal("SDL_BlitScaled %s", SDL_GetError()); + exit(1); + } } if (SDL_UpdateWindowSurface(gWindow)) { log_fatal("SDL_UpdateWindowSurface %s", SDL_GetError()); @@ -300,17 +316,19 @@ void platform_draw() static void platform_resize(int width, int height) { uint32 flags; + int dst_w = width / gConfigGeneral.scale; + int dst_h = height / gConfigGeneral.scale; - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) = width; - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) = height; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) = dst_w; + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) = dst_h; platform_refresh_video(); flags = SDL_GetWindowFlags(gWindow); if ((flags & SDL_WINDOW_MINIMIZED) == 0) { - window_resize_gui(width, height); - window_relocate_windows(width, height); + window_resize_gui(dst_w, dst_h); + window_relocate_windows(dst_w, dst_h); } title_fix_location(); @@ -421,11 +439,11 @@ void platform_process_messages() } break; case SDL_MOUSEMOTION: - RCT2_GLOBAL(0x0142406C, int) = e.motion.x; - RCT2_GLOBAL(0x01424070, int) = e.motion.y; + RCT2_GLOBAL(0x0142406C, int) = e.motion.x / gConfigGeneral.scale; + RCT2_GLOBAL(0x01424070, int) = e.motion.y / gConfigGeneral.scale; - gCursorState.x = e.motion.x; - gCursorState.y = e.motion.y; + gCursorState.x = e.motion.x / gConfigGeneral.scale; + gCursorState.y = e.motion.y / gConfigGeneral.scale; break; case SDL_MOUSEWHEEL: if (gConsoleOpen) { @@ -435,8 +453,8 @@ void platform_process_messages() gCursorState.wheel += e.wheel.y * 128; break; case SDL_MOUSEBUTTONDOWN: - RCT2_GLOBAL(0x01424318, int) = e.button.x; - RCT2_GLOBAL(0x0142431C, int) = e.button.y; + RCT2_GLOBAL(0x01424318, int) = e.button.x / gConfigGeneral.scale; + RCT2_GLOBAL(0x0142431C, int) = e.button.y / gConfigGeneral.scale; switch (e.button.button) { case SDL_BUTTON_LEFT: store_mouse_input(1); @@ -454,8 +472,8 @@ void platform_process_messages() } break; case SDL_MOUSEBUTTONUP: - RCT2_GLOBAL(0x01424318, int) = e.button.x; - RCT2_GLOBAL(0x0142431C, int) = e.button.y; + RCT2_GLOBAL(0x01424318, int) = e.button.x / gConfigGeneral.scale; + RCT2_GLOBAL(0x0142431C, int) = e.button.y / gConfigGeneral.scale; switch (e.button.button) { case SDL_BUTTON_LEFT: store_mouse_input(2); @@ -644,6 +662,8 @@ static void platform_close_window() SDL_FreeSurface(_surface); if (_palette != NULL) SDL_FreePalette(_palette); + if (_RGBASurface != NULL) + SDL_FreeSurface(_RGBASurface); platform_unload_cursors(); } @@ -916,14 +936,18 @@ void platform_refresh_video() } else { if (_surface != NULL) SDL_FreeSurface(_surface); + if (_RGBASurface != NULL) + SDL_FreeSurface(_RGBASurface); if (_palette != NULL) SDL_FreePalette(_palette); _surface = SDL_CreateRGBSurface(0, width, height, 8, 0, 0, 0, 0); + _RGBASurface = SDL_CreateRGBSurface(0, width, height, 32, 0, 0, 0, 0); + SDL_SetSurfaceBlendMode(_RGBASurface, SDL_BLENDMODE_NONE); _palette = SDL_AllocPalette(256); - if (!_surface || !_palette) { - log_fatal("%p || %p == NULL %s", _surface, _palette, SDL_GetError()); + if (!_surface || !_palette || !_RGBASurface) { + log_fatal("%p || %p || %p == NULL %s", _surface, _palette, _RGBASurface, SDL_GetError()); exit(-1); } From 6e63519bceee3a50f27621253cff50b42224b22b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 10 Nov 2015 22:30:38 +0100 Subject: [PATCH 1048/1173] Make `scale` a float There's no problem in `scale` being a floating point value, however, since it's only NN scaling so far, it looks best for integer values --- src/config.c | 2 +- src/config.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 57530c1df1..eafb2d0778 100644 --- a/src/config.c +++ b/src/config.c @@ -197,7 +197,7 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, upper_case_banners), "upper_case_banners", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, allow_loading_with_incorrect_checksum),"allow_loading_with_incorrect_checksum", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, steam_overlay_pause), "steam_overlay_pause", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, - { offsetof(general_configuration, scale), "scale", CONFIG_VALUE_TYPE_SINT8, 1, NULL }, + { offsetof(general_configuration, scale), "scale", CONFIG_VALUE_TYPE_FLOAT, 1.0f, NULL }, }; config_property_definition _interfaceDefinitions[] = { diff --git a/src/config.h b/src/config.h index fba4ab4779..1aae60d227 100644 --- a/src/config.h +++ b/src/config.h @@ -167,7 +167,7 @@ typedef struct { uint8 upper_case_banners; uint8 allow_loading_with_incorrect_checksum; uint8 steam_overlay_pause; - sint8 scale; + float scale; } general_configuration; typedef struct { From 516cddcf974ad2d0eecaaa9b71236cb7c3b74cb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 10 Nov 2015 23:52:27 +0100 Subject: [PATCH 1049/1173] Explicitly cast scaled values to avoid warnings --- src/config.c | 2 +- src/config.h | 2 +- src/platform/shared.c | 22 +++++++++++----------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/config.c b/src/config.c index eafb2d0778..916466eb60 100644 --- a/src/config.c +++ b/src/config.c @@ -197,7 +197,7 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, upper_case_banners), "upper_case_banners", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, allow_loading_with_incorrect_checksum),"allow_loading_with_incorrect_checksum", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, steam_overlay_pause), "steam_overlay_pause", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, - { offsetof(general_configuration, scale), "scale", CONFIG_VALUE_TYPE_FLOAT, 1.0f, NULL }, + { offsetof(general_configuration, window_scale), "window_scale", CONFIG_VALUE_TYPE_FLOAT, { .value_float = 1.0f }, NULL }, }; config_property_definition _interfaceDefinitions[] = { diff --git a/src/config.h b/src/config.h index 1aae60d227..951727ca21 100644 --- a/src/config.h +++ b/src/config.h @@ -167,7 +167,7 @@ typedef struct { uint8 upper_case_banners; uint8 allow_loading_with_incorrect_checksum; uint8 steam_overlay_pause; - float scale; + float window_scale; } general_configuration; typedef struct { diff --git a/src/platform/shared.c b/src/platform/shared.c index a98a4f98aa..466b911661 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -286,7 +286,7 @@ void platform_draw() SDL_UnlockSurface(_surface); // Copy the surface to the window - if (gConfigGeneral.scale == 1 || gConfigGeneral.scale <= 0) + if (gConfigGeneral.window_scale == 1 || gConfigGeneral.window_scale <= 0) { if (SDL_BlitSurface(_surface, NULL, SDL_GetWindowSurface(gWindow), NULL)) { log_fatal("SDL_BlitSurface %s", SDL_GetError()); @@ -316,8 +316,8 @@ void platform_draw() static void platform_resize(int width, int height) { uint32 flags; - int dst_w = width / gConfigGeneral.scale; - int dst_h = height / gConfigGeneral.scale; + int dst_w = (int)(width / gConfigGeneral.window_scale); + int dst_h = (int)(height / gConfigGeneral.window_scale); RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) = dst_w; RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) = dst_h; @@ -439,11 +439,11 @@ void platform_process_messages() } break; case SDL_MOUSEMOTION: - RCT2_GLOBAL(0x0142406C, int) = e.motion.x / gConfigGeneral.scale; - RCT2_GLOBAL(0x01424070, int) = e.motion.y / gConfigGeneral.scale; + RCT2_GLOBAL(0x0142406C, int) = (int)(e.motion.x / gConfigGeneral.window_scale); + RCT2_GLOBAL(0x01424070, int) = (int)(e.motion.y / gConfigGeneral.window_scale); - gCursorState.x = e.motion.x / gConfigGeneral.scale; - gCursorState.y = e.motion.y / gConfigGeneral.scale; + gCursorState.x = (int)(e.motion.x / gConfigGeneral.window_scale); + gCursorState.y = (int)(e.motion.y / gConfigGeneral.window_scale); break; case SDL_MOUSEWHEEL: if (gConsoleOpen) { @@ -453,8 +453,8 @@ void platform_process_messages() gCursorState.wheel += e.wheel.y * 128; break; case SDL_MOUSEBUTTONDOWN: - RCT2_GLOBAL(0x01424318, int) = e.button.x / gConfigGeneral.scale; - RCT2_GLOBAL(0x0142431C, int) = e.button.y / gConfigGeneral.scale; + RCT2_GLOBAL(0x01424318, int) = (int)(e.button.x / gConfigGeneral.window_scale); + RCT2_GLOBAL(0x0142431C, int) = (int)(e.button.y / gConfigGeneral.window_scale); switch (e.button.button) { case SDL_BUTTON_LEFT: store_mouse_input(1); @@ -472,8 +472,8 @@ void platform_process_messages() } break; case SDL_MOUSEBUTTONUP: - RCT2_GLOBAL(0x01424318, int) = e.button.x / gConfigGeneral.scale; - RCT2_GLOBAL(0x0142431C, int) = e.button.y / gConfigGeneral.scale; + RCT2_GLOBAL(0x01424318, int) = (int)(e.button.x / gConfigGeneral.window_scale); + RCT2_GLOBAL(0x0142431C, int) = (int)(e.button.y / gConfigGeneral.window_scale); switch (e.button.button) { case SDL_BUTTON_LEFT: store_mouse_input(2); From 80510c91bdc795328aed7e9f4a94ed46dd8bd81d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 12 Nov 2015 00:42:42 +0100 Subject: [PATCH 1050/1173] Add ui option to change scale in run-time Doesn't let user go lower than 0.5f --- data/language/english_uk.txt | 3 ++- src/localisation/string_ids.h | 2 ++ src/platform/platform.h | 1 + src/platform/shared.c | 7 ++++++ src/windows/options.c | 46 +++++++++++++++++++++++++++-------- 5 files changed, 48 insertions(+), 11 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 8460f2a6ee..5cacdaf8bb 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3917,9 +3917,10 @@ STR_5575 :Max Players: STR_5576 :Port: STR_5577 :South Korean Won (W) STR_5578 :Russian Rouble (R) +STR_5579 :Window scale factor: ##################### -# Rides/attractions # +# Rides/attractions # ##################### #WW diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 1091f29339..6d6ddcf95d 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2169,6 +2169,8 @@ enum { STR_WON = 5577, STR_ROUBLE = 5578, + STR_UI_SCALING_DESC = 5579, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/platform/platform.h b/src/platform/platform.h index fcd94a06b9..a8c4b260d8 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -100,6 +100,7 @@ void platform_get_closest_resolution(int inWidth, int inHeight, int *outWidth, i void platform_init(); void platform_draw(); void platform_free(); +void platform_trigger_resize(); void platform_update_palette(const uint8 *colours, int start_index, int num_colours); void platform_set_fullscreen_mode(int mode); void platform_set_cursor(char cursor); diff --git a/src/platform/shared.c b/src/platform/shared.c index 466b911661..bc92131204 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -347,6 +347,13 @@ static void platform_resize(int width, int height) } } +void platform_trigger_resize() +{ + int w, h; + SDL_GetWindowSize(gWindow, &w, &h); + platform_resize(w, h); +} + static uint8 soft_light(uint8 a, uint8 b) { float fa = a / 255.0f; diff --git a/src/windows/options.c b/src/windows/options.c index 4609c5bfe1..660d152380 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -82,6 +82,9 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_UNCAP_FPS_CHECKBOX, WIDX_MINIMIZE_FOCUS_LOSS, WIDX_STEAM_OVERLAY_PAUSE, + WIDX_SCALE, + WIDX_SCALE_UP, + WIDX_SCALE_DOWN, WIDX_RENDERING_GROUP, WIDX_TILE_SMOOTHING_CHECKBOX, WIDX_GRIDLINES_CHECKBOX, @@ -156,7 +159,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { }; #define WW 310 -#define WH 265 +#define WH 280 #define MAIN_OPTIONS_WIDGETS \ { WWT_FRAME, 0, 0, WW-1, 0, WH-1, STR_NONE, STR_NONE }, \ @@ -172,7 +175,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { static rct_widget window_options_display_widgets[] = { MAIN_OPTIONS_WIDGETS, - { WWT_GROUPBOX, 1, 5, 304, 53, 160, STR_HARDWARE_GROUP, STR_NONE }, // Hardware group + { WWT_GROUPBOX, 1, 5, 304, 53, 175, STR_HARDWARE_GROUP, STR_NONE }, // Hardware group { WWT_DROPDOWN, 1, 155, 299, 68, 79, STR_RESOLUTION_X_BY_Y, STR_NONE }, // resolution { WWT_DROPDOWN_BUTTON, 1, 288, 298, 69, 78, STR_DROPDOWN_GLYPH, STR_NONE }, { WWT_DROPDOWN, 1, 155, 299, 83, 94, 871, STR_NONE }, // fullscreen @@ -181,14 +184,17 @@ static rct_widget window_options_display_widgets[] = { { WWT_CHECKBOX, 1, 10, 290, 114, 125, STR_UNCAP_FPS, STR_NONE }, // uncap fps { WWT_CHECKBOX, 1, 10, 290, 129, 140, STR_MININISE_FULL_SCREEN_ON_FOCUS_LOSS, STR_NONE }, // minimise fullscreen focus loss { WWT_CHECKBOX, 1, 10, 290, 144, 155, STR_STEAM_OVERLAY_PAUSE, STR_NONE }, // minimise fullscreen focus loss + { WWT_SPINNER, 1, 155, 299, 159, 170, STR_NONE, STR_NONE }, // scale spinner + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 160, 164, STR_NUMERIC_UP, STR_NONE }, // scale spinner up + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 165, 169, STR_NUMERIC_DOWN, STR_NONE }, // scale spinner down - { WWT_GROUPBOX, 1, 5, 304, 164, 255, STR_RENDERING_GROUP, STR_NONE }, // Rendering group - { WWT_CHECKBOX, 1, 10, 290, 179, 190, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, // landscape smoothing - { WWT_CHECKBOX, 1, 10, 290, 194, 205, STR_GRIDLINES, STR_GRIDLINES_TIP }, // gridlines - { WWT_DROPDOWN, 1, 155, 299, 208, 219, STR_NONE, STR_NONE }, // construction marker - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 209, 218, STR_DROPDOWN_GLYPH, STR_NONE }, - { WWT_CHECKBOX, 1, 10, 290, 224, 235, STR_CYCLE_DAY_NIGHT, STR_NONE }, // cycle day-night - { WWT_CHECKBOX, 1, 10, 290, 239, 250, STR_UPPER_CASE_BANNERS, STR_NONE }, // upper case banners + { WWT_GROUPBOX, 1, 5, 304, 179, 270, STR_RENDERING_GROUP, STR_NONE }, // Rendering group + { WWT_CHECKBOX, 1, 10, 290, 194, 205, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, // landscape smoothing + { WWT_CHECKBOX, 1, 10, 290, 209, 220, STR_GRIDLINES, STR_GRIDLINES_TIP }, // gridlines + { WWT_DROPDOWN, 1, 155, 299, 224, 234, STR_NONE, STR_NONE }, // construction marker + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 225, 233, STR_DROPDOWN_GLYPH, STR_NONE }, + { WWT_CHECKBOX, 1, 10, 290, 239, 250, STR_CYCLE_DAY_NIGHT, STR_NONE }, // cycle day-night + { WWT_CHECKBOX, 1, 10, 290, 254, 265, STR_UPPER_CASE_BANNERS, STR_NONE }, // upper case banners { WIDGETS_END }, }; @@ -362,6 +368,9 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_UNCAP_FPS_CHECKBOX) | (1 << WIDX_MINIMIZE_FOCUS_LOSS) | (1 << WIDX_STEAM_OVERLAY_PAUSE) | + (1 << WIDX_SCALE) | + (1 << WIDX_SCALE_UP) | + (1 << WIDX_SCALE_DOWN) | (1 << WIDX_CONSTRUCTION_MARKER) | (1 << WIDX_CONSTRUCTION_MARKER_DROPDOWN) | (1 << WIDX_DAY_NIGHT_CHECKBOX) | @@ -761,6 +770,19 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* dropdown_set_checked(gConfigGeneral.construction_marker_colour, true); break; + case WIDX_SCALE_UP: + gConfigGeneral.window_scale += 0.25f; + config_save_default(); + gfx_invalidate_screen(); + platform_trigger_resize(); + break; + case WIDX_SCALE_DOWN: + gConfigGeneral.window_scale -= 0.25f; + gConfigGeneral.window_scale = max(0.5f, gConfigGeneral.window_scale); + config_save_default(); + gfx_invalidate_screen(); + platform_trigger_resize(); + break; } break; @@ -1363,6 +1385,10 @@ static void window_options_paint(rct_window *w, rct_drawpixelinfo *dpi) gfx_draw_string_left(dpi, STR_DISPLAY_RESOLUTION, w, w->colours[1], w->x + 10, w->y + window_options_display_widgets[WIDX_RESOLUTION].top + 1); gfx_draw_string_left(dpi, STR_FULLSCREEN_MODE, w, w->colours[1], w->x + 10, w->y + window_options_display_widgets[WIDX_FULLSCREEN].top + 1); gfx_draw_string_left(dpi, STR_CONSTRUCTION_MARKER, w, w->colours[1], w->x + 10, w->y + window_options_display_widgets[WIDX_CONSTRUCTION_MARKER].top + 1); + gfx_draw_string_left(dpi, STR_UI_SCALING_DESC, w, w->colours[1], w->x + 10, w->y + window_options_display_widgets[WIDX_SCALE].top + 1); + + int scale = (int)(gConfigGeneral.window_scale * 100); + gfx_draw_string_left(dpi, 3311, &scale, w->colours[1], w->x + w->widgets[WIDX_SCALE].left + 1, w->y + w->widgets[WIDX_SCALE].top + 1); break; case WINDOW_OPTIONS_PAGE_CULTURE: gfx_draw_string_left(dpi, 2776, w, w->colours[1], w->x + 10, w->y + window_options_culture_widgets[WIDX_LANGUAGE].top + 1); @@ -1380,7 +1406,7 @@ static void window_options_paint(rct_window *w, rct_drawpixelinfo *dpi) gfx_draw_string_left(dpi, STR_DISTANCE_AND_SPEED, w, w->colours[1], w->x + 10, w->y + window_options_culture_widgets[WIDX_DISTANCE].top + 1); gfx_draw_string_left(dpi, STR_TEMPERATURE, w, w->colours[1], w->x + 10, w->y + window_options_culture_widgets[WIDX_TEMPERATURE].top + 1); gfx_draw_string_left(dpi, STR_HEIGHT_LABELS, w, w->colours[1], w->x + 10, w->y + window_options_culture_widgets[WIDX_HEIGHT_LABELS].top + 1); - gfx_draw_string_left(dpi, 5161, w, w->colours[1], w->x + 10, w->y + window_options_culture_widgets[WIDX_DATE_FORMAT].top + 1); + gfx_draw_string_left(dpi, STR_DATE_FORMAT, w, w->colours[1], w->x + 10, w->y + window_options_culture_widgets[WIDX_DATE_FORMAT].top + 1); gfx_draw_string_left( dpi, DateFormatStringIds[gConfigGeneral.date_format], From b5c04a79e5698d08ec9f4b1d909583e8f0c53cfe Mon Sep 17 00:00:00 2001 From: osconnoisseur Date: Sun, 8 Nov 2015 22:35:13 -0600 Subject: [PATCH 1051/1173] Added buttons for "up" and "new file" and fixed #2233 --- src/windows/loadsave.c | 224 ++++++++++++++++++++--------------------- 1 file changed, 107 insertions(+), 117 deletions(-) diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index ca10ca179d..d9d9b5a3f4 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -43,6 +43,8 @@ enum { WIDX_BACKGROUND, WIDX_TITLE, WIDX_CLOSE, + WIDX_UP, + WIDX_NEW, WIDX_SORT_NAME, WIDX_SORT_DATE, WIDX_SCROLL, @@ -53,10 +55,12 @@ enum { static rct_widget window_loadsave_widgets[] = { { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, STR_NONE, STR_NONE }, { WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_NONE, STR_WINDOW_TITLE_TIP }, - { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, - { WWT_CLOSEBOX, 0, 4, (WW - 5) / 2, 36, 47, STR_NONE, STR_NONE }, - { WWT_CLOSEBOX, 0, (WW - 5) / 2 + 1, WW - 5 - 1, 36, 47, STR_NONE, STR_NONE }, - { WWT_SCROLL, 0, 4, WW - 5, 47, WH - 40, 2, STR_NONE }, + { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, //Window close button + { WWT_CLOSEBOX, 0, 4, 104, 36, 47, 2718, STR_NONE}, // Up + { WWT_CLOSEBOX, 0, 105, 205, 36, 47, 2719, STR_NONE}, // New + { WWT_CLOSEBOX, 0, 4, (WW - 5) / 2, 50, 61, STR_NONE, STR_NONE }, // Name + { WWT_CLOSEBOX, 0, (WW - 5) / 2 + 1, WW - 5 - 1, 50, 61, STR_NONE, STR_NONE }, // Date + { WWT_SCROLL, 0, 4, WW - 5, 61, WH - 40, 2, STR_NONE }, // File list { WWT_CLOSEBOX, 0, 4, 200, WH - 36, WH - 18, 2707, STR_NONE }, // Use native browser { WIDGETS_END } }; @@ -111,8 +115,6 @@ static rct_window_event_list window_loadsave_events = { #pragma endregion enum { - TYPE_UP, - TYPE_NEW_FILE, TYPE_DIRECTORY, TYPE_FILE, }; @@ -130,12 +132,13 @@ int _listItemsCount = 0; loadsave_list_item *_listItems = NULL; char _directory[MAX_PATH]; char _shortenedDirectory[MAX_PATH]; +static char _parentDirectory[MAX_PATH]; char _extension[32]; char _defaultName[MAX_PATH]; int _loadsaveType; int _type; -static void window_loadsave_populate_list(int includeNewItem, bool browsable, const char *directory, const char *extension); +static void window_loadsave_populate_list(rct_window *w, int includeNewItem, const char *directory, const char *extension); static void window_loadsave_select(rct_window *w, const char *path); static void window_loadsave_sort_list(int index, int endIndex); @@ -164,7 +167,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) if (w == NULL) { w = window_create_centred(WW, WH, &window_loadsave_events, WC_LOADSAVE, WF_STICK_TO_FRONT); w->widgets = window_loadsave_widgets; - w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_SORT_NAME) | (1 << WIDX_SORT_DATE) | (1 << WIDX_BROWSE); + w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_UP) | (1 << WIDX_NEW) | (1 << WIDX_SORT_NAME) | (1 << WIDX_SORT_DATE) | (1 << WIDX_BROWSE); w->colours[0] = 7; w->colours[1] = 7; w->colours[2] = 7; @@ -205,7 +208,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) return NULL; } - window_loadsave_populate_list(includeNewItem, true, path, ".sv6"); + window_loadsave_populate_list(w, includeNewItem, path, ".sv6"); break; case LOADSAVETYPE_LANDSCAPE: platform_get_user_directory(path, "landscape"); @@ -215,7 +218,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) return NULL; } - window_loadsave_populate_list(includeNewItem, true, path, ".sc6"); + window_loadsave_populate_list(w, includeNewItem, path, ".sc6"); break; case LOADSAVETYPE_SCENARIO: /* @@ -234,7 +237,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) if (ch != NULL) *ch = 0; - window_loadsave_populate_list(includeNewItem, true, path, ".sc6"); + window_loadsave_populate_list(w, includeNewItem, path, ".sc6"); break; case LOADSAVETYPE_TRACK: /* @@ -253,7 +256,7 @@ rct_window *window_loadsave_open(int type, char *defaultName) if (ch != NULL) *ch = 0; - window_loadsave_populate_list(includeNewItem, true, path, ".td?"); + window_loadsave_populate_list(w, includeNewItem, path, ".td?"); break; } w->no_list_items = _listItemsCount; @@ -280,6 +283,27 @@ static void window_loadsave_mouseup(rct_window *w, int widgetIndex) case WIDX_CLOSE: window_close(w); break; + case WIDX_UP: + { + char directory[MAX_PATH]; + int includeNewItem = (_type & 1) == LOADSAVETYPE_SAVE; + + safe_strncpy(directory, _parentDirectory, sizeof(directory)); + window_loadsave_populate_list(w, includeNewItem, directory, _extension); + window_init_scroll_widgets(w); + w->no_list_items = _listItemsCount; + break; + } + case WIDX_NEW: + { + rct_string_id templateStringId = 3165; + char *templateString; + + templateString = (char *)language_get_string(templateStringId); + strcpy(templateString, _defaultName); + window_text_input_open(w, WIDX_NEW, STR_NONE, 2710, templateStringId, 0, 64); + break; + } case WIDX_BROWSE: safe_strncpy(filename, _directory, MAX_PATH); if (_type & LOADSAVETYPE_SAVE) @@ -363,40 +387,28 @@ static void window_loadsave_scrollmousedown(rct_window *w, int scrollIndex, int selectedItem = y / 10; if (selectedItem >= w->no_list_items) return; + if (_listItems[selectedItem].type == TYPE_DIRECTORY){ + // The selected item is a folder + int includeNewItem; - if (_listItems[selectedItem].type == TYPE_NEW_FILE) { - rct_string_id templateStringId = 3165; - char *templateString; + w->no_list_items = 0; + w->selected_list_item = -1; + includeNewItem = (_type & 1) == LOADSAVETYPE_SAVE; - templateString = (char*)language_get_string(templateStringId); - strcpy(templateString, _defaultName); + char directory[MAX_PATH]; + safe_strncpy(directory, _listItems[selectedItem].path, sizeof(directory)); - window_text_input_open(w, WIDX_SCROLL, STR_NONE, 2710, templateStringId, 0, 64); + window_loadsave_populate_list(w, includeNewItem, directory, _extension); + window_init_scroll_widgets(w); + + w->no_list_items = _listItemsCount; } else { - if (_listItems[selectedItem].type == TYPE_DIRECTORY || _listItems[selectedItem].type == TYPE_UP){ - // The selected item is a folder - int includeNewItem; - - w->no_list_items = 0; - w->selected_list_item = -1; - - includeNewItem = (_type & 1) == LOADSAVETYPE_SAVE; - - char directory[MAX_PATH]; - safe_strncpy(directory, _listItems[selectedItem].path, sizeof(directory)); - - window_loadsave_populate_list(includeNewItem, true, directory, _extension); - window_init_scroll_widgets(w); - - w->no_list_items = _listItemsCount; - } else { - // TYPE_FILE - // Load or overwrite - if ((_loadsaveType & 0x01) == LOADSAVETYPE_SAVE) - window_overwrite_prompt_open(_listItems[selectedItem].name, _listItems[selectedItem].path); - else - window_loadsave_select(w, _listItems[selectedItem].path); - } + // TYPE_FILE + // Load or overwrite + if ((_loadsaveType & 0x01) == LOADSAVETYPE_SAVE) + window_overwrite_prompt_open(_listItems[selectedItem].name, _listItems[selectedItem].path); + else + window_loadsave_select(w, _listItems[selectedItem].path); } } @@ -482,18 +494,20 @@ static void window_loadsave_paint(rct_window *w, rct_drawpixelinfo *dpi) // Draw shadow gfx_draw_string(dpi, buffer, 0, w->x + 4, w->y + 20); rct_string_id id = STR_NONE; + // Name button text if (gConfigGeneral.load_save_sort == SORT_NAME_ASCENDING) id = STR_UP; else if (gConfigGeneral.load_save_sort == SORT_NAME_DESCENDING) id = STR_DOWN; - gfx_draw_string_centred_clipped(dpi, STR_NAME, &id, 1, w->x + 4 + (w->width - 8) / 4, w->y + 36, (w->width - 8) / 2); + gfx_draw_string_centred_clipped(dpi, STR_NAME, &id, 1, w->x + 4 + (w->width - 8) / 4, w->y + 50, (w->width - 8) / 2); + // Date button text if (gConfigGeneral.load_save_sort == SORT_DATE_ASCENDING) id = STR_UP; else if (gConfigGeneral.load_save_sort == SORT_DATE_DESCENDING) id = STR_DOWN; else id = STR_NONE; - gfx_draw_string_centred_clipped(dpi, STR_DATE, &id, 1, w->x + 4 + (w->width - 8) * 3 / 4, w->y + 36, (w->width - 8) / 2); + gfx_draw_string_centred_clipped(dpi, STR_DATE, &id, 1, w->x + 4 + (w->width - 8) * 3 / 4, w->y + 50, (w->width - 8) / 2); } static void shorten_path(char* path, char* buffer, int available_width){ @@ -599,14 +613,14 @@ static void window_loadsave_sort_list(int index, int endIndex) qsort(_listItems + index, count, sizeof(loadsave_list_item), list_item_sort); } -static void window_loadsave_populate_list(int includeNewItem, bool browsable, const char *directory, const char *extension) +static void window_loadsave_populate_list(rct_window *w, int includeNewItem, const char *directory, const char *extension) { - int i, listItemCapacity, fileEnumHandle; - file_info fileInfo; + int i; + int sortStartIndex = 0; + int listItemCapacity = 8; loadsave_list_item *listItem; - const char *src; - char *dst, *last_dot_in_filename, filter[MAX_PATH], subDir[MAX_PATH]; - + char filter[MAX_PATH]; + safe_strncpy(_directory, directory, sizeof(_directory)); if (_extension != extension) { safe_strncpy(_extension, extension, sizeof(_extension)); @@ -620,58 +634,55 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co if (_listItems != NULL) free(_listItems); - - listItemCapacity = 8; _listItems = (loadsave_list_item*)malloc(listItemCapacity * sizeof(loadsave_list_item)); _listItemsCount = 0; + + window_loadsave_widgets[WIDX_NEW].type = includeNewItem?WWT_CLOSEBOX:WWT_EMPTY; // Hide/Show "new" button + if(directory[0]=='\0' && platform_get_drives()!=0) // List Windows drives + { + w->disabled_widgets |= (1<= 0; index--) { - if (directory[index] == platform_get_path_separator()) { - if (lastSlash != directoryLength){ - // The last slash has been changed before, we're now one up - lastSlash = index; - topLevel = 0; - break; - } else { - // The last slash, after the whole path - lastSlash = index; - } + if (platform_get_drives() & (1 << (x))){ + listItem = &_listItems[_listItemsCount]; + memset(listItem->path, '\0', MAX_PATH); + listItem->path[0] = 'A' + x; + listItem->path[1] = ':'; + listItem->path[2] = platform_get_path_separator(); + strcpy(listItem->name, listItem->path); + listItem->type = TYPE_DIRECTORY; + _listItemsCount++; } } - if (!topLevel){ - listItem = &_listItems[_listItemsCount]; - safe_strncpy(listItem->name, language_get_string(2718), sizeof(listItem->name)); - memset(listItem->path, '\0', sizeof(listItem->path)); - strncpy(listItem->path, directory, lastSlash + 1); - listItem->type = TYPE_UP; - _listItemsCount++; - } else if (platform_get_drives() != 0 && directory[0] != '\0'){ - includeNewItem = false; - listItem = &_listItems[_listItemsCount]; - safe_strncpy(listItem->name, language_get_string(2718), sizeof(listItem->name)); - memset(listItem->path, '\0', sizeof(listItem->path)); - listItem->type = TYPE_UP; - _listItemsCount++; + } + else + { + //Get parent directory + int directoryLength = strlen(directory); + char separator = platform_get_path_separator(); + for(i = directoryLength-2; i>=0; i--) + { + if(directory[i]==separator) + break; } - } - - if (includeNewItem) { - listItem = &_listItems[_listItemsCount]; - safe_strncpy(listItem->name, language_get_string(2719), sizeof(listItem->name)); - listItem->path[0] = '\0'; - listItem->type = TYPE_NEW_FILE; - _listItemsCount++; - } - - int sortStartIndex = _listItemsCount; - - if (directory[0] != '\0'){ + safe_strncpy(_parentDirectory, directory, sizeof(_parentDirectory)); + _parentDirectory[i+1] = '\0'; + if(_parentDirectory[0]=='\0' && platform_get_drives()==0) + w->disabled_widgets |= (1<disabled_widgets &= ~(1<disabled_widgets &= ~(1<path, '\0', MAX_PATH); - listItem->path[0] = 'A' + x; - listItem->path[1] = ':'; - listItem->path[2] = platform_get_path_separator(); - strcpy(listItem->name, listItem->path); - listItem->type = TYPE_DIRECTORY; - _listItemsCount++; - } - } } - - window_loadsave_sort_list(sortStartIndex, _listItemsCount - 1); } static void window_loadsave_invoke_callback(int result) From e64fd158ab072938cde4905c6c3dc57a5a6d1530 Mon Sep 17 00:00:00 2001 From: Krutonium Date: Wed, 11 Nov 2015 23:19:35 -0500 Subject: [PATCH 1052/1173] Update readme.md --- readme.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 99733e8b68..7e9b97ec3b 100644 --- a/readme.md +++ b/readme.md @@ -5,8 +5,12 @@ An open source clone of RollerCoaster Tycoon 2 built by decompiling the original - [Screenshot 3, high resolution](http://i.imgur.com/yFzNyVu.jpg) - [Screenshot 4, resizable window](http://imgur.com/a/3GDuT) -[![Travis CI](https://travis-ci.org/OpenRCT2/OpenRCT2.svg)](https://travis-ci.org/OpenRCT2/OpenRCT2) [![AppVeyor](https://ci.appveyor.com/api/projects/status/fib6re830brysuo2?svg=true)](https://ci.appveyor.com/project/IntelOrca/openrct2) +Linux Build: +[![Travis CI](https://travis-ci.org/OpenRCT2/OpenRCT2.svg)](https://travis-ci.org/OpenRCT2/OpenRCT2) +Windows Build: +[![AppVeyor](https://ci.appveyor.com/api/projects/status/fib6re830brysuo2?svg=true)](https://ci.appveyor.com/project/IntelOrca/openrct2) +Come talk with us if you have any questions: [![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/OpenRCT2/OpenRCT2?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) # Contents From 075b98e209ed1d5f9893efcde45ecbd49e246565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 12 Nov 2015 12:15:20 +0100 Subject: [PATCH 1053/1173] Minor cleanups Mostly just setting variables to better define game state, with one minor update of decompilation where an `or` instruction was used in place of `mov` (in `sub_6CBCE2`). --- src/config.c | 2 +- src/peep/staff.c | 1 + src/ride/ride.c | 9 +++++---- src/scenario.c | 2 +- src/windows/map.c | 2 +- src/windows/park.c | 1 + src/windows/ride.c | 3 +++ src/windows/ride_construction.c | 2 +- src/windows/title_editor.c | 4 +++- src/windows/track_place.c | 1 + 10 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/config.c b/src/config.c index 647f59e4f7..cd6057d65b 100644 --- a/src/config.c +++ b/src/config.c @@ -1493,7 +1493,7 @@ static void title_sequence_open(const char *path, const char *customName) token = &parts[0 * 128]; part1 = &parts[1 * 128]; part2 = &parts[2 * 128]; - title_command command; + title_command command = { 0 }; command.command = 0xFF; if (token[0] != 0) { diff --git a/src/peep/staff.c b/src/peep/staff.c index 3d44d0cb53..b187d632b3 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -389,6 +389,7 @@ uint16 hire_new_staff_member(uint8 staffType) RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_HIRE_NEW_STAFF; int eax, ebx, ecx, edx, esi, edi, ebp; + ecx = edx = esi = edi = ebp = 0; eax = 0x8000; ebx = staffType << 8 | GAME_COMMAND_FLAG_APPLY; diff --git a/src/ride/ride.c b/src/ride/ride.c index bb7261ad5b..573251d0d1 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -850,6 +850,7 @@ int ride_create_ride(ride_list_item listItem) ebx = GAME_COMMAND_FLAG_APPLY; edi = 0; esi = 0; + ebp = 0; RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = 0x3DC; @@ -1194,7 +1195,7 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par mapElement->properties.track.colour &= 0x0F; mapElement->properties.track.colour |= (extra_params & 0xFF) << 4; } - + if (flags & (1 << 3)) { track_element_set_cable_lift(mapElement); } @@ -5562,7 +5563,7 @@ void game_command_callback_ride_remove_track_piece(int eax, int ebx, int ecx, in z = gRideRemoveTrackPieceCallbackZ; direction = gRideRemoveTrackPieceCallbackDirection; type = gRideRemoveTrackPieceCallbackType; - + window_ride_construction_mouseup_demolish_next_piece(x, y, z, direction, type); } @@ -6412,9 +6413,9 @@ static void ride_update_vehicle_colours(int rideIndex) { rct_ride *ride; rct_vehicle *vehicle; - rct_vehicle_colour colours; + rct_vehicle_colour colours = { 0 }; uint16 spriteIndex; - uint8 coloursExtended; + uint8 coloursExtended = 0; ride = GET_RIDE(rideIndex); if (ride->type == RIDE_TYPE_SPACE_RINGS || ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_16)) { diff --git a/src/scenario.c b/src/scenario.c index 4d94b7be70..6975421c80 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -497,7 +497,7 @@ void scenario_success_submit_name(const char *name) **/ void scenario_entrance_fee_too_high_check() { - uint16 x, y; + uint16 x = 0, y = 0; uint16 totalRideValue = RCT2_GLOBAL(RCT2_TOTAL_RIDE_VALUE, uint16); uint16 park_entrance_fee = RCT2_GLOBAL(RCT2_ADDRESS_PARK_ENTRANCE_FEE, uint16); int max_fee = totalRideValue + (totalRideValue / 2); diff --git a/src/windows/map.c b/src/windows/map.c index 163604d879..7c46d62645 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -1597,7 +1597,7 @@ static uint16 map_window_get_pixel_colour_ride(int x, int y) static void map_window_set_pixels(rct_window *w) { - uint16 colour, *destination; + uint16 colour = 0, *destination; int x, y, dx, dy; destination = (uint16*)((RCT2_GLOBAL(0x00F1AD6C, uint32) * 511) + RCT2_GLOBAL(RCT2_ADDRESS_MAP_IMAGE_DATA, uint32) + 255); diff --git a/src/windows/park.c b/src/windows/park.c index 6b32b71bed..91be02ae90 100644 --- a/src/windows/park.c +++ b/src/windows/park.c @@ -1053,6 +1053,7 @@ static void window_park_entrance_paint(rct_window *w, rct_drawpixelinfo *dpi) static void window_park_init_viewport(rct_window *w) { int i, x, y, z, r, xy, zr, viewportFlags; + x = y = z = r = xy = zr = 0; rct_viewport *viewport; rct_widget *viewportWidget; diff --git a/src/windows/ride.c b/src/windows/ride.c index b04e0f2cb7..b6f44dde0b 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -5341,6 +5341,9 @@ static void window_ride_graphs_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi top = measurement->lateral[x] + 52; bottom = measurement->lateral[x + 1] + 52; break; + default: + log_error("Wrong graph type %d", listType); + top = bottom = 0; } top = widget->bottom - widget->top - top - 13; diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 02de05c631..b3dae4b8de 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -2273,7 +2273,7 @@ static void sub_6CBCE2( offsetX = -trackBlock->y; offsetY = trackBlock->x; bl = rol8(bl, 3); - bh |= bl; + bh = bl; bh = ror8(bh, 4); bl &= 0x88; bh &= 0x77; diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index eb82afe2a8..41c2974acd 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -943,7 +943,7 @@ void window_title_editor_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, ColourMapA[w->colours[1]].lighter | 0x1000000); } - rct_string_id commandName; + rct_string_id commandName = STR_NONE; switch (command->command) { case TITLE_SCRIPT_LOAD: commandName = 5415; @@ -984,6 +984,8 @@ void window_title_editor_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int case TITLE_SCRIPT_END: commandName = 5426; break; + default: + log_warning("Unknown command %d", command->command); } if ((selected || hover) && !error) { diff --git a/src/windows/track_place.c b/src/windows/track_place.c index c879b4907a..85365c9dc9 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -352,6 +352,7 @@ static void window_track_place_attempt_placement(int x, int y, int z, int bl, mo int eax, ebx, ecx, edx, esi, edi, ebp; money32 result; + edx = esi = ebp = 0; eax = x; ebx = bl; ecx = y; From b5b1957f58b3af54df596d7c2f0379004e2a777e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 12 Nov 2015 13:32:15 +0100 Subject: [PATCH 1054/1173] Fix some left-shifts An explicit `1` is considered signed by compiler, if `int` is 32 bit long, a left shift `1 << 31` is undefined. Since the type of result is the type of left shift operand, make sure we shift unsigned int so that the behaviour is defined correctly. Also one fix in peep code, where it would use too big value for `item_extra_flags`. --- src/peep/peep.c | 28 ++++++++++++++-------------- src/util/util.c | 4 ++-- src/windows/scenery.c | 6 +++--- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index d1d06e3ec7..e714c8de93 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -4147,7 +4147,7 @@ static void peep_update_using_bin(rct_peep* peep){ uint32 empty_containers = peep_empty_container_standard_flag(peep); for (uint8 cur_container = 0; cur_container < 32; cur_container++){ - if (!(empty_containers & (1 << cur_container))) continue; + if (!(empty_containers & (1u << cur_container))) continue; if (rubbish_in_bin != 0){ // OpenRCT2 modification: This previously used @@ -4177,7 +4177,7 @@ static void peep_update_using_bin(rct_peep* peep){ empty_containers = peep_empty_container_extra_flag(peep); for (uint8 cur_container = 0; cur_container < 32; cur_container++){ - if (!(empty_containers & (1 << cur_container))) continue; + if (!(empty_containers & (1u << cur_container))) continue; if (rubbish_in_bin != 0){ // OpenRCT2 modification: This previously used @@ -5741,9 +5741,9 @@ int peep_is_mechanic(rct_peep *peep) bool peep_has_item(rct_peep *peep, int peepItem) { if (peepItem < 32) { - return peep->item_standard_flags & (1 << peepItem); + return peep->item_standard_flags & (1u << peepItem); } else { - return peep->item_extra_flags & (1 << peepItem); + return peep->item_extra_flags & (1u << (peepItem - 32)); } } @@ -8608,7 +8608,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) int i; FOR_ALL_RIDES(i, ride) { if (!peep_has_ridden(peep, i)) { - RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= (1 << (i & 0x1F)); + RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= (1u << (i & 0x1F)); } } } else { @@ -8623,7 +8623,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; int rideIndex = mapElement->properties.track.ride_index; - RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (1 << (rideIndex & 0x1F)); + RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (1u << (rideIndex & 0x1F)); } while (!map_element_is_last_for_tile(mapElement++)); } } @@ -8636,7 +8636,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) if (ride->excitement == (ride_rating)0xFFFF) continue; if (ride->highest_drop_height <= 66 && ride->excitement < RIDE_RATING(8,00)) continue; - RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= (1 << (i & 0x1F)); + RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= (1u << (i & 0x1F)); } } @@ -8645,7 +8645,7 @@ static void peep_pick_ride_to_go_on(rct_peep *peep) uint8 *nextPotentialRide = potentialRides; int numPotentialRides = 0; for (int i = 0; i < MAX_RIDES; i++) { - if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (1 << (i & 0x1F)))) + if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (1u << (i & 0x1F)))) continue; rct_ride *ride = GET_RIDE(i); @@ -8724,7 +8724,7 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) int i; FOR_ALL_RIDES(i, ride) { if (ride->type == rideType) { - RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= (1 << (i & 0x1F)); + RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= (1u << (i & 0x1F)); } } } else { @@ -8741,7 +8741,7 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) int rideIndex = mapElement->properties.track.ride_index; ride = GET_RIDE(rideIndex); if (ride->type == rideType) { - RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (1 << (rideIndex & 0x1F)); + RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (1u << (rideIndex & 0x1F)); } } while (!map_element_is_last_for_tile(mapElement++)); } @@ -8754,7 +8754,7 @@ static void peep_head_for_nearest_ride_type(rct_peep *peep, int rideType) uint8 *nextPotentialRide = potentialRides; int numPotentialRides = 0; for (int i = 0; i < MAX_RIDES; i++) { - if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (1 << (i & 0x1F)))) + if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (1u << (i & 0x1F)))) continue; rct_ride *ride = GET_RIDE(i); @@ -8836,7 +8836,7 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl int i; FOR_ALL_RIDES(i, ride) { if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & rideTypeFlags) { - RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= (1 << (i & 0x1F)); + RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] |= (1u << (i & 0x1F)); } } } else { @@ -8853,7 +8853,7 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl int rideIndex = mapElement->properties.track.ride_index; ride = GET_RIDE(rideIndex); if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & rideTypeFlags) { - RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (1 << (rideIndex & 0x1F)); + RCT2_ADDRESS(0x00F1AD98, uint32)[rideIndex >> 5] |= (1u << (rideIndex & 0x1F)); } } while (!map_element_is_last_for_tile(mapElement++)); } @@ -8866,7 +8866,7 @@ static void peep_head_for_nearest_ride_with_flags(rct_peep *peep, int rideTypeFl uint8 *nextPotentialRide = potentialRides; int numPotentialRides = 0; for (int i = 0; i < MAX_RIDES; i++) { - if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (1 << (i & 0x1F)))) + if (!(RCT2_ADDRESS(0x00F1AD98, uint32)[i >> 5] & (1u << (i & 0x1F)))) continue; rct_ride *ride = GET_RIDE(i); diff --git a/src/util/util.c b/src/util/util.c index a1c93d7ebe..bfccdfa706 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -146,7 +146,7 @@ int bitscanforward(int source) return success != 0 ? i : -1; #else for (i = 0; i < 32; i++) - if (source & (1 << i)) + if (source & (1u << i)) return i; return -1; @@ -157,7 +157,7 @@ int bitcount(int source) { int result = 0; for (int i = 0; i < 32; i++) { - if (source & (1 << i)) { + if (source & (1u << i)) { result++; } } diff --git a/src/windows/scenery.c b/src/windows/scenery.c index f9f99c7c73..fd42a10f44 100644 --- a/src/windows/scenery.c +++ b/src/windows/scenery.c @@ -188,7 +188,7 @@ void window_scenery_update_scroll(rct_window *w); * The same code repeated five times for every scenery entry type */ void init_scenery_entry(rct_scenery_entry *sceneryEntry, int index, uint8 sceneryTabId) { - if (RCT2_ADDRESS(0x01357BD0, sint32)[index >> 5] & (1 << (index & 0x1F))) { + if (RCT2_ADDRESS(0x01357BD0, sint32)[index >> 5] & (1u << (index & 0x1F))) { if (sceneryTabId != 0xFF) { for (int i = 0; i < SCENERY_ENTRIES_BY_TAB; i++) { if (window_scenery_tab_entries[sceneryTabId][i] == -1) @@ -246,7 +246,7 @@ void init_scenery() for (int i = 0; i < scenerySetEntry->entry_count; i++) { uint16 sceneryEntryId = scenerySetEntry->scenery_entries[i]; uint32 ecx = RCT2_ADDRESS(0x01357BD0, uint32)[sceneryEntryId >> 5]; - uint32 edx = 1 << (sceneryEntryId & 0x1F); + uint32 edx = 1u << (sceneryEntryId & 0x1F); if (ecx & edx) { window_scenery_tab_entries[scenerySetIndex][sceneryTabEntryCount] = sceneryEntryId; window_scenery_tab_entries[scenerySetIndex][++sceneryTabEntryCount] = -1; @@ -1185,4 +1185,4 @@ void window_scenery_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrol } sceneryTabItemIndex++; } -} \ No newline at end of file +} From 6723f51087b78078fbb4d62d73de549743f64616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 12 Nov 2015 14:08:32 +0100 Subject: [PATCH 1055/1173] Keep track of address returned by malloc to free it correctly When doing g2 generation on Linux, src variable was not modified in the same way as on Windows, which caused free() on a pointer that was not malloc()ed. This fixes #2219. --- src/cmdline_sprite.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmdline_sprite.c b/src/cmdline_sprite.c index d6e8ac2c21..5982135a92 100644 --- a/src/cmdline_sprite.c +++ b/src/cmdline_sprite.c @@ -264,6 +264,7 @@ bool sprite_file_import(const char *path, rct_g1_element *outElement, uint8 **ou // A larger range is needed for proper dithering sint16 *src = malloc(height * width * 4 * 2); + sint16 *src_orig = src; for (uint32 x = 0; x < height * width * 4; x++){ src[x] = (sint16) pixels[x]; } @@ -375,7 +376,7 @@ bool sprite_file_import(const char *path, rct_g1_element *outElement, uint8 **ou } } free(pixels); - free(src); + free(src_orig); int bufferLength = (int)(dst - buffer); buffer = realloc(buffer, bufferLength); From a0014eee0998d7e08167892db82bae3369237723 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Thu, 12 Nov 2015 19:22:08 +0000 Subject: [PATCH 1056/1173] Refactor set scenery and fence. --- src/world/map.c | 129 +++++++++++++++++++++++++++++++----------------- src/world/map.h | 2 + 2 files changed, 86 insertions(+), 45 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index e909630b87..f2f6f9cadd 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1123,13 +1123,14 @@ void game_command_set_scenery_colour(int* eax, int* ebx, int* ecx, int* edx, int int y = *ecx; uint8 base_height = *edx; uint8 scenery_type = *edx >> 8; - uint8 map_element_type = *ebx >> 8; uint8 color1 = *ebp; uint8 color2 = *ebp >> 8; + uint8 flags = *ebx & 0xFF; int z = base_height * 8; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x + 16; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode){ if (!map_is_location_owned(x, y, z)){ *ebx = MONEY32_UNDEFINED; @@ -1137,22 +1138,21 @@ void game_command_set_scenery_colour(int* eax, int* ebx, int* ecx, int* edx, int } } - rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); - while(map_element->type != map_element_type || - map_element->base_height != base_height || - map_element->properties.scenery.type != scenery_type){ - map_element++; - if((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE){ - *ebx = 0; - return; - } - } - - if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)){ + // Previously it would do a search for type of bh (set from calling function) instead of just small scenery + // Unsure if this was a mistake. + rct_map_element* map_element = map_get_small_scenery_element_at(x, y, base_height, scenery_type); + + if (map_element == NULL) { *ebx = 0; return; } - if(*ebx & GAME_COMMAND_FLAG_APPLY){ + + if((flags & GAME_COMMAND_FLAG_GHOST) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)){ + *ebx = 0; + return; + } + + if(flags & GAME_COMMAND_FLAG_APPLY){ map_element->properties.scenery.colour_1 &= 0xE0; map_element->properties.scenery.colour_1 |= color1; map_element->properties.scenery.colour_2 &= 0xE0; @@ -1177,43 +1177,50 @@ void game_command_set_fence_colour(int* eax, int* ebx, int* ecx, int* edx, int* uint8 color1 = *ebx >> 8; uint8 color2 = *ebp; uint8 color3 = *ebp >> 8; + uint8 flags = *ebx & 0xFF; int z = base_height * 8; + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x + 16; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; - if((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || map_is_location_in_park(x, y) || gCheatsSandboxMode){ - rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); - while(map_element_get_type(map_element) != MAP_ELEMENT_TYPE_FENCE || - map_element->base_height != base_height || - (map_element->type & MAP_ELEMENT_DIRECTION_MASK) != map_element_direction|| - ((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST))){ - map_element++; - if((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE){ - *ebx = 0; - return; - } - } - if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)){ - *ebx = 0; - return; - } - if(*ebx & GAME_COMMAND_FLAG_APPLY){ - rct_scenery_entry* scenery_entry = RCT2_ADDRESS(RCT2_ADDRESS_WALL_SCENERY_ENTRIES, rct_scenery_entry*)[map_element->properties.fence.type]; - map_element->properties.fence.item[1] &= 0xE0; - map_element->properties.fence.item[1] |= color1; - map_element->flags &= 0x9F; - map_element->properties.fence.item[1] &= 0x1F; - map_element->properties.fence.item[1] |= (color2 & 0x7) * 32; - map_element->flags |= (color2 & 0x18) * 4; - if(scenery_entry->wall.flags & 0x80){ - map_element->properties.fence.item[0] = color3; - } - map_invalidate_tile_zoom1(x, y, z, z + 0x48); - } - *ebx = 0; - } else { + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && + !map_is_location_in_park(x, y) && + !gCheatsSandboxMode) { + *ebx = MONEY32_UNDEFINED; + return; } + + bool fence_found = false; + rct_map_element* map_element = map_get_fence_element_at(x, y, base_height, map_element_direction); + + if (map_element == NULL) { + *ebx = 0; + return; + } + + if ((flags & GAME_COMMAND_FLAG_GHOST) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)) { + *ebx = 0; + return; + } + + if(flags & GAME_COMMAND_FLAG_APPLY){ + rct_scenery_entry* scenery_entry = g_wallSceneryEntries[map_element->properties.fence.type]; + map_element->properties.fence.item[1] &= 0xE0; + map_element->properties.fence.item[1] |= color1; + map_element->properties.fence.item[1] &= 0x1F; + map_element->flags &= 0x9F; + map_element->properties.fence.item[1] |= (color2 & 0x7) * 32; + map_element->flags |= (color2 & 0x18) * 4; + + if(scenery_entry->wall.flags & 0x80){ + map_element->properties.fence.item[0] = color3; + } + map_invalidate_tile_zoom1(x, y, z, z + 72); + } + + *ebx = 0; } /** @@ -4307,6 +4314,38 @@ rct_map_element *map_get_large_scenery_segment(int x, int y, int z, int directio return NULL; } +rct_map_element *map_get_fence_element_at(int x, int y, int z, int direction) +{ + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_FENCE) + continue; + if (mapElement->base_height != z) + continue; + if (map_element_get_direction(mapElement) != direction) + continue; + + return mapElement; + } while (!map_element_is_last_for_tile(mapElement++)); + return NULL; +} + +rct_map_element *map_get_small_scenery_element_at(int x, int y, int z, int type) +{ + rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SCENERY) + continue; + if (mapElement->base_height != z) + continue; + if (mapElement->properties.scenery.type != type) + continue; + + return mapElement; + } while (!map_element_is_last_for_tile(mapElement++)); + return NULL; +} + bool map_large_scenery_get_origin( int x, int y, int z, int direction, int sequence, int *outX, int *outY, int *outZ diff --git a/src/world/map.h b/src/world/map.h index e1c4ed0aa0..a1e803ccb9 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -287,6 +287,8 @@ void map_element_set_terrain_edge(rct_map_element *element, int terrain); int map_height_from_slope(int x, int y, int slope); rct_map_element *map_get_surface_element_at(int x, int y); rct_map_element* map_get_path_element_at(int x, int y, int z); +rct_map_element *map_get_fence_element_at(int x, int y, int z, int direction); +rct_map_element *map_get_small_scenery_element_at(int x, int y, int z, int type); int map_element_height(int x, int y); void sub_68B089(); int map_coord_is_connected(int x, int y, int z, uint8 faceDirection); From fe4d98bc833a177ba329ca320848ed3e4f168539 Mon Sep 17 00:00:00 2001 From: Cameron Date: Thu, 12 Nov 2015 13:36:16 -0600 Subject: [PATCH 1057/1173] Fixed off-by-one errors in string conversion --- src/platform/linux.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/platform/linux.c b/src/platform/linux.c index 5117966ece..68291e8d3a 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -209,10 +209,10 @@ int platform_enumerate_files_begin(const utf8 *pattern) enumerate_file_info *enumFileInfo; wchar_t *wpattern = utf8_to_widechar(pattern); int length = min(utf8_length(pattern), MAX_PATH); - char *npattern = malloc(length); + char *npattern = malloc(length+1); int converted; converted = wcstombs(npattern, wpattern, length); - npattern[length - 1] = '\0'; + npattern[length] = '\0'; if (converted == MAX_PATH) { log_warning("truncated string %s", npattern); } @@ -271,7 +271,7 @@ int platform_enumerate_files_begin(const utf8 *pattern) for (int i = 0; i < countof(_enumerateFileInfoList); i++) { enumFileInfo = &_enumerateFileInfoList[i]; if (!enumFileInfo->active) { - safe_strncpy(enumFileInfo->pattern, npattern, length); + safe_strncpy(enumFileInfo->pattern, npattern, sizeof(enumFileInfo->pattern)); cnt = scandir(dir_name, &enumFileInfo->fileListTemp, winfilter, alphasort); if (cnt < 0) { @@ -395,10 +395,10 @@ int platform_enumerate_directories_begin(const utf8 *directory) enumerate_file_info *enumFileInfo; wchar_t *wpattern = utf8_to_widechar(directory); int length = min(utf8_length(directory), MAX_PATH); - char *npattern = malloc(length); + char *npattern = malloc(length+1); int converted; converted = wcstombs(npattern, wpattern, length); - npattern[length - 1] = '\0'; + npattern[length] = '\0'; if (converted == MAX_PATH) { log_warning("truncated string %s", npattern); } @@ -477,7 +477,7 @@ bool platform_enumerate_directories_next(int handle, utf8 *path) log_error("failed to stat file '%s'! errno = %i", fileName, errno); return false; } - // so very, very wrong… + // so very, very wrong safe_strncpy(path, basename(fileName), MAX_PATH); strncat(path, "/", MAX_PATH); path[MAX_PATH - 1] = '\0'; From 8bcf2e1b8cdc7521d533ec792cb482c524f46cb5 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 13 Nov 2015 04:00:17 +0000 Subject: [PATCH 1058/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 4 ++-- data/language/english_us.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 6364397fb5..4e2ef366cd 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3864,8 +3864,8 @@ STR_5521 :{SMALLFONT}{BLACK}明紫色 STR_5522 :{SMALLFONT}{BLACK}暗藍色 STR_5523 :{SMALLFONT}{BLACK}淺藍色 STR_5524 :{SMALLFONT}{BLACK}冰藍色 -STR_5525 :{SMALLFONT}{BLACK}鴨綠色 -STR_5526 :{SMALLFONT}{BLACK}藍綠色 +STR_5525 :{SMALLFONT}{BLACK}深水配色 +STR_5526 :{SMALLFONT}{BLACK}淺水配色 STR_5527 :{SMALLFONT}{BLACK}深綠色 STR_5528 :{SMALLFONT}{BLACK}暗綠色 STR_5529 :{SMALLFONT}{BLACK}苔蘚綠色 diff --git a/data/language/english_us.txt b/data/language/english_us.txt index a173125c84..3f9cdf3d31 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3907,7 +3907,7 @@ STR_5563 :This feature is currently unstable, take extra caution. STR_5564 :Insert Corrupt Element STR_5565 :{SMALLFONT}{BLACK}Inserts a corrupt map element at top of tile. This will hide any element above the corrupt element. STR_5566 :Password: -STR_5567 :Advertize +STR_5567 :Advertise STR_5568 :Password Required STR_5569 :This server requires a password STR_5570 :Fetch Servers From 4bf9680b4367558cc65a2f7fd0e9b92c9c6f838d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 13 Nov 2015 11:52:13 +0100 Subject: [PATCH 1059/1173] Update lodepng to 20151024 https://transfer.sh/11TTTm/orctlibs.zip https://transfer.sh/y9wvx/orctlibs-vs.zip --- build.sh | 2 +- pre-build.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index 6bdf0829f1..d1dc442fa3 100755 --- a/build.sh +++ b/build.sh @@ -13,7 +13,7 @@ if [[ ! -d build ]]; then fi # keep in sync with version in install.sh -sha256sum=0a7b5ea46e9cb4b19000b69690eae0b75929752f7db192c78bd7ffb61d696835 +sha256sum=69ff98c9544838fb16384bc78af9dc1c452b9d01d919e43f5fec686d02c9bdd8 libVFile="./libversion" libdir="./lib" currentversion=0 diff --git a/pre-build.ps1 b/pre-build.ps1 index 539e65755f..a37f3d8993 100644 --- a/pre-build.ps1 +++ b/pre-build.ps1 @@ -1,5 +1,5 @@ #init -$libversion = 3 +$libversion = 4 $path = Split-Path $Script:MyInvocation.MyCommand.Path $zip = $path+'\orctlibs.zip' $libs = $path+'\lib' From 60f7d29c2e67b00fb415f26f6cc2e17344ef0b9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 13 Nov 2015 14:40:25 +0100 Subject: [PATCH 1060/1173] Zero the buffer for g2.dat Some leftover data caused the g2.dat generated on different platforms to have mismatching cheksums. Zeroing the buffer makes them checksum-identical. --- src/cmdline_sprite.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cmdline_sprite.c b/src/cmdline_sprite.c index 5982135a92..0e8f84a83a 100644 --- a/src/cmdline_sprite.c +++ b/src/cmdline_sprite.c @@ -260,6 +260,7 @@ bool sprite_file_import(const char *path, rct_g1_element *outElement, uint8 **ou } uint8 *buffer = malloc((height * 2) + (width * height * 16)); + memset(buffer, 0, (height * 2) + (width * height * 16)); uint16 *yOffsets = (uint16*)buffer; // A larger range is needed for proper dithering From aa55ca6b62b8abfa4d31858442cdb8b65c8798b4 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 13 Nov 2015 18:30:14 +0000 Subject: [PATCH 1061/1173] Refactor banner_remove. Fixed an original bug. Banners that are placed on two different heights that face the same direction will end up bugging out. This has now been fixed. This required modification of the top toolbar code in order to correctly set the z variable. --- src/windows/top_toolbar.c | 2 +- src/world/map.c | 52 +++++++++++++++++++++++++++++---------- src/world/map.h | 1 + 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 62a655506f..0d8f55b6da 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -2226,7 +2226,7 @@ money32 try_place_ghost_scenery(rct_xy16 map_tile, uint32 parameter_1, uint32 pa RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16) = map_tile.x; RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16) = map_tile.y; - RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = (parameter_2 & 0xFF); + RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8) = (parameter_2 & 0xFF) * 2 + 2; RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint8) = ((parameter_2 >> 8) & 0xFF); RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) |= (1 << 4); break; diff --git a/src/world/map.c b/src/world/map.c index f2f6f9cadd..ddc335e75f 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -260,7 +260,6 @@ rct_map_element* map_get_path_element_at(int x, int y, int z){ if (mapElement == NULL) return NULL; - uint8 mapFound = 0; // Find the path element at known z do { if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) @@ -273,6 +272,28 @@ rct_map_element* map_get_path_element_at(int x, int y, int z){ return NULL; } + +rct_map_element* map_get_banner_element_at(int x, int y, int z, uint8 position) { + rct_map_element *mapElement = map_get_first_element_at(x, y); + + if (mapElement == NULL) + return NULL; + + // Find the banner element at known z and position + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_BANNER) + continue; + if (mapElement->base_height != z) + continue; + if (mapElement->properties.banner.position != position) + continue; + + return mapElement; + } while (!map_element_is_last_for_tile(mapElement++)); + + return NULL; +} + /** * * rct2: 0x0068AB4C @@ -1075,38 +1096,43 @@ void game_command_remove_banner(int* eax, int* ebx, int* ecx, int* edx, int* esi int y = *ecx; uint8 base_height = *edx; uint8 banner_position = *edx >> 8; + uint8 flags = *ebx & 0xFF; int z = base_height * 8; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x + 16; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; - if(!(*ebx & 0x40) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ + + if(!(flags & GAME_COMMAND_FLAG_GHOST) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; *ebx = MONEY32_UNDEFINED; return; } + if(!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode && !map_is_location_owned(x, y, z - 16)){ *ebx = MONEY32_UNDEFINED; return; } - rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); - while(map_element->type != MAP_ELEMENT_TYPE_BANNER || - map_element->properties.banner.position != banner_position){ - map_element++; - if((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE){ - *ebx = MONEY32_UNDEFINED; - return; - } + + // Slight modification to the code so that it now checks height as well + // This was causing a bug with banners on two paths stacked. + rct_map_element* map_element = map_get_banner_element_at(x / 32, y / 32, base_height, banner_position); + if (map_element == NULL){ + *ebx = MONEY32_UNDEFINED; + return; } + rct_banner *banner = &gBanners[map_element->properties.banner.index]; - uint8 bannerType = banner->type; - if (*ebx & GAME_COMMAND_FLAG_APPLY) { + rct_scenery_entry *scenery_entry = g_bannerSceneryEntries[banner->type]; + + if (flags & GAME_COMMAND_FLAG_APPLY) { map_element_remove_banner_entry(map_element); map_invalidate_tile_zoom1(x, y, z, z + 32); map_element_remove(map_element); } - rct_scenery_entry *scenery_entry = (rct_scenery_entry*)object_entry_groups[OBJECT_TYPE_BANNERS].chunks[bannerType]; + *ebx = (scenery_entry->banner.price * -3) / 4; + if(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY){ *ebx = 0; } diff --git a/src/world/map.h b/src/world/map.h index a1e803ccb9..65071b8ab2 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -285,6 +285,7 @@ int map_element_get_terrain_edge(rct_map_element *element); void map_element_set_terrain(rct_map_element *element, int terrain); void map_element_set_terrain_edge(rct_map_element *element, int terrain); int map_height_from_slope(int x, int y, int slope); +rct_map_element* map_get_banner_element_at(int x, int y, int z, uint8 direction); rct_map_element *map_get_surface_element_at(int x, int y); rct_map_element* map_get_path_element_at(int x, int y, int z); rct_map_element *map_get_fence_element_at(int x, int y, int z, int direction); From 7aa8e6040e2a5ab5eab3ce6cb992e6999f74bdef Mon Sep 17 00:00:00 2001 From: "U-HP-Pavilion-PC\\Cameron" Date: Fri, 13 Nov 2015 16:08:33 -0600 Subject: [PATCH 1062/1173] Converted to sentence case and removed brackets from STR_2718 and STR_2719 --- data/language/chinese_simplified.txt | 4 ++-- data/language/chinese_traditional.txt | 4 ++-- data/language/dutch.txt | 4 ++-- data/language/english_uk.txt | 4 ++-- data/language/english_us.txt | 4 ++-- data/language/finnish.txt | 4 ++-- data/language/french.txt | 4 ++-- data/language/german.txt | 4 ++-- data/language/hungarian.txt | 4 ++-- data/language/italian.txt | 4 ++-- data/language/korean.txt | 4 ++-- data/language/polish.txt | 4 ++-- data/language/portuguese_br.txt | 4 ++-- data/language/russian.txt | 4 ++-- data/language/spanish_sp.txt | 4 ++-- data/language/swedish.txt | 4 ++-- 16 files changed, 32 insertions(+), 32 deletions(-) diff --git a/data/language/chinese_simplified.txt b/data/language/chinese_simplified.txt index d543ddea86..ae1c920458 100644 --- a/data/language/chinese_simplified.txt +++ b/data/language/chinese_simplified.txt @@ -2728,8 +2728,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(up) -STR_2719 :(new file) +STR_2718 :Up +STR_2719 :New file STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 6364397fb5..3c1c34ef79 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(向上層) -STR_2719 :(建立新檔案) +STR_2718 :向上層 +STR_2719 :建立新檔案 STR_2720 :{UINT16}秒 STR_2721 :{UINT16}秒 STR_2722 :{UINT16}分:{UINT16}秒 diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 9526dd4d75..7a5d3d50cf 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -2719,8 +2719,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(één map omhoog) -STR_2719 :(nieuw bestand) +STR_2718 :Één map omhoog +STR_2719 :Nieuw bestand STR_2720 :{UINT16}s STR_2721 :{UINT16}s STR_2722 :{UINT16}m {UINT16}s diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 8460f2a6ee..e18723052b 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(up) -STR_2719 :(new file) +STR_2718 :Up +STR_2719 :New file STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/english_us.txt b/data/language/english_us.txt index a173125c84..81e3d4c0b5 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(up) -STR_2719 :(new file) +STR_2718 :Up +STR_2719 :New file STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/finnish.txt b/data/language/finnish.txt index 8b80312a12..728bb8b0b1 100644 --- a/data/language/finnish.txt +++ b/data/language/finnish.txt @@ -2725,8 +2725,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(ylös) -STR_2719 :(uusi tiedosto) +STR_2718 :Ylös +STR_2719 :Uusi tiedosto STR_2720 :{UINT16}sek STR_2721 :{UINT16}sekuntia STR_2722 :{UINT16}min:{UINT16}sek diff --git a/data/language/french.txt b/data/language/french.txt index ee3f80705f..2e828d38b5 100644 --- a/data/language/french.txt +++ b/data/language/french.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(up) -STR_2719 :(nouveau fichier) +STR_2718 :Up +STR_2719 :Nouveau fichier STR_2720 :{UINT16}s STR_2721 :{UINT16}s STR_2722 :{UINT16}m {UINT16}s diff --git a/data/language/german.txt b/data/language/german.txt index 8a048f6ef0..d923316476 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -2721,8 +2721,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(Hoch) -STR_2719 :(Neue Datei) +STR_2718 :Hoch +STR_2719 :Neue Datei STR_2720 :{UINT16}Sek. STR_2721 :{UINT16}Sek. STR_2722 :{UINT16}Min:{UINT16}Sek. diff --git a/data/language/hungarian.txt b/data/language/hungarian.txt index 3479980735..afe4116860 100644 --- a/data/language/hungarian.txt +++ b/data/language/hungarian.txt @@ -2722,8 +2722,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(up) -STR_2719 :(new file) +STR_2718 :Up +STR_2719 :New file STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/italian.txt b/data/language/italian.txt index cc9467fb10..8c30072aa0 100644 --- a/data/language/italian.txt +++ b/data/language/italian.txt @@ -2722,8 +2722,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(up) -STR_2719 :(new file) +STR_2718 :Up +STR_2719 :New file STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/korean.txt b/data/language/korean.txt index 11e08e4aad..2ab5ba9175 100644 --- a/data/language/korean.txt +++ b/data/language/korean.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(상위 폴더) -STR_2719 :(새 파일) +STR_2718 :상위 폴더 +STR_2719 :새 파일 STR_2720 :{UINT16}초 STR_2721 :{UINT16}초 STR_2722 :{UINT16}분 {UINT16}초 diff --git a/data/language/polish.txt b/data/language/polish.txt index 48d9b4a71a..e982fb07ac 100644 --- a/data/language/polish.txt +++ b/data/language/polish.txt @@ -2760,8 +2760,8 @@ STR_2715 :. STR_2716 :/ STR_2717 :' # New strings (previously these were ???) -STR_2718 :(..) -STR_2719 :(nowy plik) +STR_2718 :.. +STR_2719 :Nowy plik # sec, secs STR_2720 :{UINT16}sek STR_2721 :{UINT16}sek diff --git a/data/language/portuguese_br.txt b/data/language/portuguese_br.txt index 6a263f8de4..b5a6da4df1 100644 --- a/data/language/portuguese_br.txt +++ b/data/language/portuguese_br.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(cima) -STR_2719 :(novo arquivo) +STR_2718 :Cima +STR_2719 :Novo arquivo STR_2720 :{UINT16}seg STR_2721 :{UINT16}segs STR_2722 :{UINT16}min:{UINT16}seg diff --git a/data/language/russian.txt b/data/language/russian.txt index 1216f8c625..4169a71f6a 100644 --- a/data/language/russian.txt +++ b/data/language/russian.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(up) -STR_2719 :(new file) +STR_2718 :Up +STR_2719 :New file STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/spanish_sp.txt b/data/language/spanish_sp.txt index 9c626836b8..45cdf99063 100644 --- a/data/language/spanish_sp.txt +++ b/data/language/spanish_sp.txt @@ -2722,8 +2722,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(up) -STR_2719 :(new file) +STR_2718 :Up +STR_2719 :New file STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/swedish.txt b/data/language/swedish.txt index 81e930b655..30960aa72c 100644 --- a/data/language/swedish.txt +++ b/data/language/swedish.txt @@ -2724,8 +2724,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(up) -STR_2719 :(new file) +STR_2718 :Up +STR_2719 :New file STR_2720 :{UINT16}sek STR_2721 :{UINT16}sek STR_2722 :{UINT16}min:{UINT16}sek From 557a89928c2d6463cd6404a0fde1042359fe80bc Mon Sep 17 00:00:00 2001 From: "U-HP-Pavilion-PC\\Cameron" Date: Fri, 13 Nov 2015 16:23:16 -0600 Subject: [PATCH 1063/1173] Revert "Converted to sentence case and removed brackets from STR_2718 and STR_2719" This reverts commit 7aa8e6040e2a5ab5eab3ce6cb992e6999f74bdef. --- data/language/chinese_simplified.txt | 4 ++-- data/language/chinese_traditional.txt | 4 ++-- data/language/dutch.txt | 4 ++-- data/language/english_uk.txt | 4 ++-- data/language/english_us.txt | 4 ++-- data/language/finnish.txt | 4 ++-- data/language/french.txt | 4 ++-- data/language/german.txt | 4 ++-- data/language/hungarian.txt | 4 ++-- data/language/italian.txt | 4 ++-- data/language/korean.txt | 4 ++-- data/language/polish.txt | 4 ++-- data/language/portuguese_br.txt | 4 ++-- data/language/russian.txt | 4 ++-- data/language/spanish_sp.txt | 4 ++-- data/language/swedish.txt | 4 ++-- 16 files changed, 32 insertions(+), 32 deletions(-) diff --git a/data/language/chinese_simplified.txt b/data/language/chinese_simplified.txt index ae1c920458..d543ddea86 100644 --- a/data/language/chinese_simplified.txt +++ b/data/language/chinese_simplified.txt @@ -2728,8 +2728,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :Up -STR_2719 :New file +STR_2718 :(up) +STR_2719 :(new file) STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 3c1c34ef79..6364397fb5 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :向上層 -STR_2719 :建立新檔案 +STR_2718 :(向上層) +STR_2719 :(建立新檔案) STR_2720 :{UINT16}秒 STR_2721 :{UINT16}秒 STR_2722 :{UINT16}分:{UINT16}秒 diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 7a5d3d50cf..9526dd4d75 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -2719,8 +2719,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :Één map omhoog -STR_2719 :Nieuw bestand +STR_2718 :(één map omhoog) +STR_2719 :(nieuw bestand) STR_2720 :{UINT16}s STR_2721 :{UINT16}s STR_2722 :{UINT16}m {UINT16}s diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index e18723052b..8460f2a6ee 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :Up -STR_2719 :New file +STR_2718 :(up) +STR_2719 :(new file) STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 81e3d4c0b5..a173125c84 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :Up -STR_2719 :New file +STR_2718 :(up) +STR_2719 :(new file) STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/finnish.txt b/data/language/finnish.txt index 728bb8b0b1..8b80312a12 100644 --- a/data/language/finnish.txt +++ b/data/language/finnish.txt @@ -2725,8 +2725,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :Ylös -STR_2719 :Uusi tiedosto +STR_2718 :(ylös) +STR_2719 :(uusi tiedosto) STR_2720 :{UINT16}sek STR_2721 :{UINT16}sekuntia STR_2722 :{UINT16}min:{UINT16}sek diff --git a/data/language/french.txt b/data/language/french.txt index 2e828d38b5..ee3f80705f 100644 --- a/data/language/french.txt +++ b/data/language/french.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :Up -STR_2719 :Nouveau fichier +STR_2718 :(up) +STR_2719 :(nouveau fichier) STR_2720 :{UINT16}s STR_2721 :{UINT16}s STR_2722 :{UINT16}m {UINT16}s diff --git a/data/language/german.txt b/data/language/german.txt index d923316476..8a048f6ef0 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -2721,8 +2721,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :Hoch -STR_2719 :Neue Datei +STR_2718 :(Hoch) +STR_2719 :(Neue Datei) STR_2720 :{UINT16}Sek. STR_2721 :{UINT16}Sek. STR_2722 :{UINT16}Min:{UINT16}Sek. diff --git a/data/language/hungarian.txt b/data/language/hungarian.txt index afe4116860..3479980735 100644 --- a/data/language/hungarian.txt +++ b/data/language/hungarian.txt @@ -2722,8 +2722,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :Up -STR_2719 :New file +STR_2718 :(up) +STR_2719 :(new file) STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/italian.txt b/data/language/italian.txt index 8c30072aa0..cc9467fb10 100644 --- a/data/language/italian.txt +++ b/data/language/italian.txt @@ -2722,8 +2722,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :Up -STR_2719 :New file +STR_2718 :(up) +STR_2719 :(new file) STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/korean.txt b/data/language/korean.txt index 2ab5ba9175..11e08e4aad 100644 --- a/data/language/korean.txt +++ b/data/language/korean.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :상위 폴더 -STR_2719 :새 파일 +STR_2718 :(상위 폴더) +STR_2719 :(새 파일) STR_2720 :{UINT16}초 STR_2721 :{UINT16}초 STR_2722 :{UINT16}분 {UINT16}초 diff --git a/data/language/polish.txt b/data/language/polish.txt index e982fb07ac..48d9b4a71a 100644 --- a/data/language/polish.txt +++ b/data/language/polish.txt @@ -2760,8 +2760,8 @@ STR_2715 :. STR_2716 :/ STR_2717 :' # New strings (previously these were ???) -STR_2718 :.. -STR_2719 :Nowy plik +STR_2718 :(..) +STR_2719 :(nowy plik) # sec, secs STR_2720 :{UINT16}sek STR_2721 :{UINT16}sek diff --git a/data/language/portuguese_br.txt b/data/language/portuguese_br.txt index b5a6da4df1..6a263f8de4 100644 --- a/data/language/portuguese_br.txt +++ b/data/language/portuguese_br.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :Cima -STR_2719 :Novo arquivo +STR_2718 :(cima) +STR_2719 :(novo arquivo) STR_2720 :{UINT16}seg STR_2721 :{UINT16}segs STR_2722 :{UINT16}min:{UINT16}seg diff --git a/data/language/russian.txt b/data/language/russian.txt index 4169a71f6a..1216f8c625 100644 --- a/data/language/russian.txt +++ b/data/language/russian.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :Up -STR_2719 :New file +STR_2718 :(up) +STR_2719 :(new file) STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/spanish_sp.txt b/data/language/spanish_sp.txt index 45cdf99063..9c626836b8 100644 --- a/data/language/spanish_sp.txt +++ b/data/language/spanish_sp.txt @@ -2722,8 +2722,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :Up -STR_2719 :New file +STR_2718 :(up) +STR_2719 :(new file) STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/swedish.txt b/data/language/swedish.txt index 30960aa72c..81e930b655 100644 --- a/data/language/swedish.txt +++ b/data/language/swedish.txt @@ -2724,8 +2724,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :Up -STR_2719 :New file +STR_2718 :(up) +STR_2719 :(new file) STR_2720 :{UINT16}sek STR_2721 :{UINT16}sek STR_2722 :{UINT16}min:{UINT16}sek From e2545599edc650574ad385fe29ebc2f6716a3153 Mon Sep 17 00:00:00 2001 From: "U-HP-Pavilion-PC\\Cameron" Date: Fri, 13 Nov 2015 16:25:52 -0600 Subject: [PATCH 1064/1173] Converted to sentence case and removed brackets from STR_2718 and 2719 in english_uk.txt --- data/language/english_uk.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 8460f2a6ee..e18723052b 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(up) -STR_2719 :(new file) +STR_2718 :Up +STR_2719 :New file STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec From 44e3e74a65d8a3f05768f7ba4c64fb5cd4e93d34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 13 Nov 2015 23:33:24 +0100 Subject: [PATCH 1065/1173] Change pre-built link to http://openrct2.website/ --- install.sh | 2 +- pre-build.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/install.sh b/install.sh index fe2a71da27..eb04f41dd3 100755 --- a/install.sh +++ b/install.sh @@ -4,7 +4,7 @@ SDL2_PV=2.0.3 SDL2_TTF_PV=2.0.12 cachedir=.cache -liburl=https://openrct.net/launcher/libs/orctlibs.zip +liburl=https://openrct2.website/files/orctlibs.zip mkdir -p $cachedir echo $(uname) diff --git a/pre-build.ps1 b/pre-build.ps1 index a37f3d8993..3e350d0c26 100644 --- a/pre-build.ps1 +++ b/pre-build.ps1 @@ -4,7 +4,7 @@ $path = Split-Path $Script:MyInvocation.MyCommand.Path $zip = $path+'\orctlibs.zip' $libs = $path+'\lib' $libsVFile = $path+'\libversion' -$liburl = 'https://openrct.net/launcher/libs/orctlibs_vs.zip' +$liburl = 'https://openrct2.website/files/orctlibs-vs.zip' $libsTest = Test-Path $libs #libs version test From d0332c81d89aec3488460784e63022271ba3b699 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 14 Nov 2015 00:08:31 +0000 Subject: [PATCH 1066/1173] Refactor and move wide flag code. --- src/game.c | 2 +- src/world/footpath.c | 197 ++++++++++++++++++++++++++++++++ src/world/footpath.h | 1 + src/world/map.c | 261 +++++++------------------------------------ src/world/map.h | 2 +- 5 files changed, 240 insertions(+), 223 deletions(-) diff --git a/src/game.c b/src/game.c index 27eecd0f97..10c4c61466 100644 --- a/src/game.c +++ b/src/game.c @@ -356,7 +356,7 @@ void game_logic_update() scenario_update(); climate_update(); map_update_tiles(); - sub_6A876D(); + map_update_path_wide_flags(); peep_update_all(); vehicle_update_all(); sprite_misc_update_all(); diff --git a/src/world/footpath.c b/src/world/footpath.c index d72ed3b56c..adc78bdde1 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -1581,6 +1581,203 @@ bool footpath_element_is_wide(rct_map_element *mapElement) return mapElement->type & 2; } +/** +* +* rct2: 0x006A8B12 +* clears the wide footpath flag for all footpaths +* at location +*/ +static void footpath_clear_wide(int x, int y) +{ + rct_map_element *mapElement = map_get_first_element_at(x / 32, y / 32); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + mapElement->type &= ~0x2; + } while (!map_element_is_last_for_tile(mapElement++)); +} + +/** +* +* rct2: 0x006A8ACF +* returns footpath element if it can be made wide +* returns NULL if it can not be made wide +*/ +static rct_map_element* footpath_can_be_wide(int x, int y, uint8 height) +{ + rct_map_element *mapElement = map_get_first_element_at(x / 32, y / 32); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + if (height != mapElement->base_height) + continue; + if (footpath_element_is_queue(mapElement)) + continue; + if (footpath_element_is_sloped(mapElement)) + continue; + return mapElement; + } while (!map_element_is_last_for_tile(mapElement++)); + + return NULL; +} + + +/** +* +* rct2: 0x006A87BB +*/ +void footpath_update_path_wide_flags(int x, int y) +{ + if (x < 0x20) + return; + if (y < 0x20) + return; + if (x > 0x1FDF) + return; + if (y > 0x1FDF) + return; + + footpath_clear_wide(x, y); + x += 0x20; + footpath_clear_wide(x, y); + y += 0x20; + footpath_clear_wide(x, y); + x -= 0x20; + footpath_clear_wide(x, y); + y -= 0x20; + + if (!(x & 0xE0)) + return; + if (!(y & 0xE0)) + return; + + rct_map_element *mapElement = map_get_first_element_at(x / 32, y / 32); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + + if (footpath_element_is_queue(mapElement)) + continue; + + if (footpath_element_is_sloped(mapElement)) + continue; + + uint8 height = mapElement->base_height; + + // pathList is a list of elements, set by sub_6A8ACF adjacent to x,y + // Spanned from 0x00F3EFA8 to 0x00F3EFC7 (8 elements) in the original + rct_map_element *pathList[8]; + + x -= 0x20; + y -= 0x20; + pathList[0] = footpath_can_be_wide(x, y, height); + y += 0x20; + pathList[1] = footpath_can_be_wide(x, y, height); + y += 0x20; + pathList[2] = footpath_can_be_wide(x, y, height); + x += 0x20; + pathList[3] = footpath_can_be_wide(x, y, height); + x += 0x20; + pathList[4] = footpath_can_be_wide(x, y, height); + y -= 0x20; + pathList[5] = footpath_can_be_wide(x, y, height); + y -= 0x20; + pathList[6] = footpath_can_be_wide(x, y, height); + x -= 0x20; + pathList[7] = footpath_can_be_wide(x, y, height); + y += 0x20; + + uint8 F3EFA5 = 0; + if (mapElement->properties.path.edges & 8) { + F3EFA5 |= 0x80; + if (pathList[7] != NULL) { + if (footpath_element_is_wide(pathList[7])) { + F3EFA5 &= ~0x80; + } + } + } + + if (mapElement->properties.path.edges & 1) { + F3EFA5 |= 0x2; + if (pathList[1] != NULL) { + if (footpath_element_is_wide(pathList[1])) { + F3EFA5 &= ~0x2; + } + } + } + + if (mapElement->properties.path.edges & 2) { + F3EFA5 |= 0x8; + if (pathList[3] != NULL) { + if (footpath_element_is_wide(pathList[3])) { + F3EFA5 &= ~0x8; + } + } + } + + if (mapElement->properties.path.edges & 4) { + F3EFA5 |= 0x20; + if (pathList[5] != NULL) { + if (footpath_element_is_wide(pathList[5])) { + F3EFA5 &= ~0x20; + } + } + } + + if ((F3EFA5 & 0x80) && (pathList[7] != NULL) && !(footpath_element_is_wide(pathList[7]))) { + if ((F3EFA5 & 2) && + (pathList[0] != NULL) && (!footpath_element_is_wide(pathList[0])) && + ((pathList[0]->properties.path.edges & 6) == 6) && // N E + (pathList[1] != NULL) && (!footpath_element_is_wide(pathList[1]))) { + F3EFA5 |= 0x1; + } + + if ((F3EFA5 & 0x20) && + (pathList[6] != NULL) && (!footpath_element_is_wide(pathList[6])) && + ((pathList[6]->properties.path.edges & 3) == 3) && // N W + (pathList[5] != NULL) && (!footpath_element_is_wide(pathList[5]))) { + F3EFA5 |= 0x40; + } + } + + + if ((F3EFA5 & 0x8) && (pathList[3] != NULL) && !(pathList[3]->type & 2)) { + if ((F3EFA5 & 2) && + (pathList[2] != NULL) && (!footpath_element_is_wide(pathList[2])) && + ((pathList[2]->properties.path.edges & 0xC) == 0xC) && + (pathList[1] != NULL) && (!footpath_element_is_wide(pathList[1]))) { + F3EFA5 |= 0x4; + } + + if ((F3EFA5 & 0x20) && + (pathList[4] != NULL) && (!footpath_element_is_wide(pathList[4])) && + ((pathList[4]->properties.path.edges & 9) == 9) && + (pathList[5] != NULL) && (!footpath_element_is_wide(pathList[5]))) { + F3EFA5 |= 0x10; + } + } + + if ((F3EFA5 & 0x80) && (F3EFA5 & (0x40 | 0x1))) + F3EFA5 &= ~0x80; + + if ((F3EFA5 & 0x2) && (F3EFA5 & (0x4 | 0x1))) + F3EFA5 &= ~0x2; + + if ((F3EFA5 & 0x8) && (F3EFA5 & (0x10 | 0x4))) + F3EFA5 &= ~0x8; + + if ((F3EFA5 & 0x20) && (F3EFA5 & (0x40 | 0x10))) + F3EFA5 &= ~0x20; + + if (!(F3EFA5 & (0x2 | 0x8 | 0x20 | 0x80))) { + uint8 e = mapElement->properties.path.edges; + if ((e != 0xAF) && (e != 0x5F) && (e != 0xEF)) + mapElement->type |= 2; + } + } while (!map_element_is_last_for_tile(mapElement++)); +} + + /** * * rct2: 0x006A76E9 diff --git a/src/world/footpath.h b/src/world/footpath.h index 23ecaac8f8..05c5ad43ad 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -64,6 +64,7 @@ void footpath_connect_edges(int x, int y, rct_map_element *mapElement, int flags void sub_6A759F(); bool fence_in_the_way(int x, int y, int z0, int z1, int direction); void footpath_chain_ride_queue(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction); +void footpath_update_path_wide_flags(int x, int y); void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, int *direction, rct_map_element **mapElement); diff --git a/src/world/map.c b/src/world/map.c index ddc335e75f..55d5f24b71 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -66,7 +66,6 @@ bool gClearLargeScenery; bool gClearFootpath; static void tiles_init(); -static void update_path_wide_flags(int x, int y); static void map_update_grass_length(int x, int y, rct_map_element *mapElement); static void map_set_grass_length(int x, int y, rct_map_element *mapElement, int length); static void sub_68AE2A(int x, int y); @@ -589,7 +588,7 @@ int map_coord_is_connected(int x, int y, int z, uint8 faceDirection) * * rct2: 0x006A876D */ -void sub_6A876D() +void map_update_path_wide_flags() { int i, x, y; @@ -617,196 +616,6 @@ void sub_6A876D() RCT2_GLOBAL(0x013CE776, sint16) = y; } -/** - * - * rct2: 0x006A8B12 - */ -static void sub_6A8B12(int x, int y) -{ - rct_map_element *mapElement = map_get_first_element_at(x / 32, y / 32); - do { - if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) { - mapElement->type &= ~0x2; - } - } while (!map_element_is_last_for_tile(mapElement++)); -} - -/** - * - * rct2: 0x006A8ACF - */ -static void sub_6A8ACF(int x, int y, uint8 height, rct_map_element **l) -{ - rct_map_element *mapElement = map_get_first_element_at(x / 32, y / 32); - do { - if ((map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) && - !footpath_element_is_queue(mapElement) && !footpath_element_is_sloped(mapElement) && - (height == mapElement->base_height)) { - *l = mapElement; - return; - } - } while (!map_element_is_last_for_tile(mapElement++)); - *l = (rct_map_element*)0xFFFFFFFF; -} - - -/** - * - * rct2: 0x006A87BB - */ -static void update_path_wide_flags(int x, int y) -{ - if (x < 0x20) - return; - if (y < 0x20) - return; - if (x > 0x1FDF) - return; - if (y > 0x1FDF) - return; - - sub_6A8B12(x, y); - x += 0x20; - sub_6A8B12(x, y); - y += 0x20; - sub_6A8B12(x, y); - x -= 0x20; - sub_6A8B12(x, y); - y -= 0x20; - - if (!(x & 0xE0)) - return; - if (!(y & 0xE0)) - return; - - rct_map_element *mapElement = map_get_first_element_at(x / 32, y / 32); - do { - if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) - continue; - - if (footpath_element_is_queue(mapElement)) - continue; - - if (footpath_element_is_sloped(mapElement)) - continue; - - uint8 height = mapElement->base_height; - - // pathList is a list of elements, set by sub_6A8ACF adjacent to x,y - // Spanned from 0x00F3EFA8 to 0x00F3EFC7 (8 elements) in the original - rct_map_element *pathList[8]; - - x -= 0x20; - y -= 0x20; - sub_6A8ACF(x, y, height, pathList + 0); - y += 0x20; - sub_6A8ACF(x, y, height, pathList + 1); - y += 0x20; - sub_6A8ACF(x, y, height, pathList + 2); - x += 0x20; - sub_6A8ACF(x, y, height, pathList + 3); - x += 0x20; - sub_6A8ACF(x, y, height, pathList + 4); - y -= 0x20; - sub_6A8ACF(x, y, height, pathList + 5); - y -= 0x20; - sub_6A8ACF(x, y, height, pathList + 6); - x -= 0x20; - sub_6A8ACF(x, y, height, pathList + 7); - y += 0x20; - - uint8 F3EFA5 = 0; - const rct_map_element *invalidPointer = (rct_map_element*)0xFFFFFFFF; - - if (mapElement->properties.path.edges & 8) { - F3EFA5 |= 0x80; - if (pathList[7] != invalidPointer) { - if (footpath_element_is_wide(pathList[7])) { - F3EFA5 &= ~0x80; - } - } - } - - if (mapElement->properties.path.edges & 1) { - F3EFA5 |= 0x2; - if (pathList[1] != invalidPointer) { - if (footpath_element_is_wide(pathList[1])) { - F3EFA5 &= ~0x2; - } - } - } - - if (mapElement->properties.path.edges & 2) { - F3EFA5 |= 0x8; - if (pathList[3] != invalidPointer) { - if (footpath_element_is_wide(pathList[3])) { - F3EFA5 &= ~0x8; - } - } - } - - if (mapElement->properties.path.edges & 4) { - F3EFA5 |= 0x20; - if (pathList[5] != invalidPointer) { - if (footpath_element_is_wide(pathList[5])) { - F3EFA5 &= ~0x20; - } - } - } - - if ((F3EFA5 & 0x80) && (pathList[7] != invalidPointer) && !(footpath_element_is_wide(pathList[7]))) { - if ((F3EFA5 & 2) && - (pathList[0] != invalidPointer) && (!footpath_element_is_wide(pathList[0])) && - ((pathList[0]->properties.path.edges & 6) == 6) && // N E - (pathList[1] != invalidPointer) && (!footpath_element_is_wide(pathList[1]))) { - F3EFA5 |= 0x1; - } - - if ((F3EFA5 & 0x20) && - (pathList[6] != invalidPointer) && (!footpath_element_is_wide(pathList[6])) && - ((pathList[6]->properties.path.edges & 3) == 3) && // N W - (pathList[5] != invalidPointer) && (!footpath_element_is_wide(pathList[5]))) { - F3EFA5 |= 0x40; - } - } - - - if ((F3EFA5 & 0x8) && (pathList[3] != invalidPointer) && !(pathList[3]->type & 2)) { - if ((F3EFA5 & 2) && - (pathList[2] != invalidPointer) && (!footpath_element_is_wide(pathList[2])) && - ((pathList[2]->properties.path.edges & 0xC) == 0xC) && - (pathList[1] != invalidPointer) && (!footpath_element_is_wide(pathList[1]))) { - F3EFA5 |= 0x4; - } - - if ((F3EFA5 & 0x20) && - (pathList[4] != invalidPointer) && (!footpath_element_is_wide(pathList[4])) && - ((pathList[4]->properties.path.edges & 9) == 9) && - (pathList[5] != invalidPointer) && (!footpath_element_is_wide(pathList[5]))) { - F3EFA5 |= 0x10; - } - } - - if ((F3EFA5 & 0x80) && (F3EFA5 & (0x40 | 0x1))) - F3EFA5 &= ~0x80; - - if ((F3EFA5 & 0x2) && (F3EFA5 & (0x4 | 0x1))) - F3EFA5 &= ~0x2; - - if ((F3EFA5 & 0x8) && (F3EFA5 & (0x10 | 0x4))) - F3EFA5 &= ~0x8; - - if ((F3EFA5 & 0x20) && (F3EFA5 & (0x40 | 0x10))) - F3EFA5 &= ~0x20; - - if (!(F3EFA5 & (0x2 | 0x8 | 0x20 | 0x80))) { - uint8 e = mapElement->properties.path.edges; - if ((e != 0xAF) && (e != 0x5F) && (e != 0xEF)) - mapElement->type |= 2; - } - } while (!map_element_is_last_for_tile(mapElement++)); -} - /** * * rct2: 0x006A7B84 @@ -896,6 +705,7 @@ void game_command_remove_scenery(int* eax, int* ebx, int* ecx, int* edx, int* es uint8 base_height = *edx; uint8 scenery_type = *edx >> 8; uint8 map_element_type = *ebx >> 8; + uint8 flags = *ebx & 0xFF; money32 cost; rct_scenery_entry *entry = g_smallSceneryEntries[scenery_type]; @@ -906,13 +716,13 @@ void game_command_remove_scenery(int* eax, int* ebx, int* ecx, int* edx, int* es RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y + 16; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = base_height * 8; - if (!(*ebx & 0x40) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { + if (!(flags & GAME_COMMAND_FLAG_GHOST) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; *ebx = MONEY32_UNDEFINED; return; } - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !(*ebx & 0x40) && !gCheatsSandboxMode) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && !(flags & GAME_COMMAND_FLAG_GHOST) && !gCheatsSandboxMode) { // Check if allowed to remove item if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_FORBID_TREE_REMOVAL) { if (entry->small_scenery.height > 64) { @@ -929,20 +739,29 @@ void game_command_remove_scenery(int* eax, int* ebx, int* ecx, int* edx, int* es } } + bool sceneryFound = false; rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); - while(map_element->type != map_element_type || - map_element->base_height != base_height || - map_element->properties.scenery.type != scenery_type || - ((*ebx & GAME_COMMAND_FLAG_GHOST) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST))){ - map_element++; - if((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE){ - *ebx = 0; - return; - } + do { + if (map_element->type != map_element_type) + continue; + if (map_element->base_height != base_height) + continue; + if (map_element->properties.scenery.type != scenery_type) + continue; + if ((flags & GAME_COMMAND_FLAG_GHOST) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)) + continue; + + sceneryFound = true; + break; + } while (!map_element_is_last_for_tile(map_element++)); + + if (sceneryFound == false){ + *ebx = 0; + return; } // Remove element - if (*ebx & GAME_COMMAND_FLAG_APPLY) { + if (flags & GAME_COMMAND_FLAG_APPLY) { map_invalidate_tile_full(x, y); map_element_remove(map_element); } @@ -956,23 +775,24 @@ void game_command_remove_scenery(int* eax, int* ebx, int* ecx, int* edx, int* es void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { uint8 base_height = *edx; - uint8 scenerymultiple_index = *edx >> 8; + uint8 tileIndex = *edx >> 8; uint8 map_element_direction = *ebx >> 8; int x = *eax; int y = *ecx; int z = map_element_height(x, y); + uint8 flags = *ebx & 0xFF; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x + 16; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) = z; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_LANDSCAPING * 4; - if (!(*ebx & 0x40) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { + if (!(flags & GAME_COMMAND_FLAG_GHOST) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; *ebx = MONEY32_UNDEFINED; return; } - uint8 element_found = 0; + bool element_found = false; rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); do { if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE) @@ -981,33 +801,32 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i if (map_element->base_height != base_height) continue; - if ((map_element->properties.scenerymultiple.type >> 10) != scenerymultiple_index) + if ((map_element->properties.scenerymultiple.type >> 10) != tileIndex) continue; if ((map_element->type & MAP_ELEMENT_DIRECTION_MASK) != map_element_direction) continue; // If we are removing ghost elements - if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)) + if((flags & GAME_COMMAND_FLAG_GHOST) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)) continue; - element_found = 1; + element_found = true; break; } while (!map_element_is_last_for_tile(map_element++)); - if (!element_found){ + if (element_found == false){ *ebx = 0; return; } map_element_remove_banner_entry(map_element); - int ecx2 = map_element->properties.scenerymultiple.type >> 10; rct_scenery_entry* scenery_entry = g_largeSceneryEntries[map_element->properties.scenerymultiple.type & 0x3FF]; rct_xyz16 firstTile = { - .x = scenery_entry->large_scenery.tiles[ecx2].x_offset, - .y = scenery_entry->large_scenery.tiles[ecx2].y_offset, - .z = (base_height * 8) - scenery_entry->large_scenery.tiles[ecx2].z_offset + .x = scenery_entry->large_scenery.tiles[tileIndex].x_offset, + .y = scenery_entry->large_scenery.tiles[tileIndex].y_offset, + .z = (base_height * 8) - scenery_entry->large_scenery.tiles[tileIndex].z_offset }; rotate_map_coordinates(&firstTile.x, &firstTile.y, map_element_direction); @@ -1038,8 +857,8 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i } // If not applying then no need to delete the actual element - if (!(*ebx & GAME_COMMAND_FLAG_APPLY)) { - if (*ebx & (1 << 7)) { + if (!(flags & GAME_COMMAND_FLAG_APPLY)) { + if (flags & (1 << 7)) { if (map_element->flags & (1 << 6)) calculate_cost = false; map_element->flags |= (1 << 6); @@ -1048,7 +867,7 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i } rct_map_element* sceneryElement = map_get_first_element_at(currentTile.x / 32, currentTile.y / 32); - uint8 tile_not_found = 1; + element_found = false; do { if (map_element_get_type(sceneryElement) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE) @@ -1064,16 +883,16 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i continue; // If we are removing ghost elements - if ((*ebx & 0x40) && !(sceneryElement->flags & MAP_ELEMENT_FLAG_GHOST)) + if ((flags & GAME_COMMAND_FLAG_GHOST) && !(sceneryElement->flags & MAP_ELEMENT_FLAG_GHOST)) continue; map_invalidate_tile_full(currentTile.x, currentTile.y); map_element_remove(sceneryElement); - tile_not_found = 0; + element_found = true; break; } while (!map_element_is_last_for_tile(sceneryElement++)); - if (tile_not_found){ + if (element_found == false){ log_error("Tile not found when trying to remove element!"); } } diff --git a/src/world/map.h b/src/world/map.h index 65071b8ab2..4c57e0971f 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -293,7 +293,7 @@ rct_map_element *map_get_small_scenery_element_at(int x, int y, int z, int type) int map_element_height(int x, int y); void sub_68B089(); int map_coord_is_connected(int x, int y, int z, uint8 faceDirection); -void sub_6A876D(); +void map_update_path_wide_flags(); int map_is_location_owned(int x, int y, int z); int map_is_location_in_park(int x, int y); bool map_is_location_owned_or_has_rights(int x, int y); From 954d6348b2eaa0a64c283032f48efb792bbb9140 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 14 Nov 2015 00:12:19 +0000 Subject: [PATCH 1067/1173] Fix change in function name --- src/world/map.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/map.c b/src/world/map.c index 55d5f24b71..bdff9b1e65 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -601,7 +601,7 @@ void map_update_path_wide_flags() x = RCT2_GLOBAL(0x013CE774, sint16); y = RCT2_GLOBAL(0x013CE776, sint16); for (i = 0; i < 128; i++) { - update_path_wide_flags(x, y); + footpath_update_path_wide_flags(x, y); // Next x, y tile x += 32; From 32b1171b2f945bb4bfa1f3ccce2c14df0d9b19db Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 14 Nov 2015 04:00:26 +0000 Subject: [PATCH 1068/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 9526dd4d75..7bf40cce11 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3902,11 +3902,11 @@ STR_5566 :Wachtwoord: STR_5567 :Bekendmaken STR_5568 :Wachtwoord vereist STR_5569 :Deze server vereist een wachtwoord. -STR_5570 :Serverlijst ophalen +STR_5570 :Lijst verversen STR_5571 :Meedoen STR_5572 :Toev. aan favorieten STR_5573 :Verw. uit favorieten -STR_5574 :Servernaame: +STR_5574 :Servernaam: STR_5575 :Max. aant. spelers: STR_5576 :Poort: STR_5577 :Zuid-Koreaanse won (W) From bdd29107e6e76a839d49c2e295e86e6d3c72268b Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 14 Nov 2015 11:56:13 +0000 Subject: [PATCH 1069/1173] Refactoring --- src/addresses.h | 1 + src/world/map.c | 59 +++++++++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index f426ed80e4..e4b4371a39 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -503,6 +503,7 @@ #define RCT2_ADDRESS_CURRENT_FONT_FLAGS 0x013CE9A2 #define RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS 0x013CE9A4 +#define RCT2_ADDRESS_NEXT_FREE_MAP_ELEMENT 0x0140E9A4 #define RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT 0x0141E9AC #define RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE 0x0141E9AE diff --git a/src/world/map.c b/src/world/map.c index bdff9b1e65..d97395c3f5 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -350,12 +350,11 @@ void map_update_tile_pointers() for (y = 0; y < 256; y++) { for (x = 0; x < 256; x++) { *tile++ = mapElement; - do { } while (!map_element_is_last_for_tile(mapElement++)); + while (!map_element_is_last_for_tile(mapElement++)); } } - // Possible next free map element - RCT2_GLOBAL(0x0140E9A4, rct_map_element*) = mapElement; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_FREE_MAP_ELEMENT, rct_map_element*) = mapElement; } /** @@ -538,17 +537,15 @@ void sub_68B089() *mapElement = *mapElementFirst; mapElementFirst->base_height = 255; - mapElement++; mapElementFirst++; - } while (!map_element_is_last_for_tile(mapElement - 1)); + } while (!map_element_is_last_for_tile(mapElement++)); - // Update next free element? - mapElement = RCT2_GLOBAL(0x0140E9A4, rct_map_element*); + mapElement = RCT2_GLOBAL(RCT2_ADDRESS_NEXT_FREE_MAP_ELEMENT, rct_map_element*); do { mapElement--; } while (mapElement->base_height == 255); mapElement++; - RCT2_GLOBAL(0x0140E9A4, rct_map_element*) = mapElement; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_FREE_MAP_ELEMENT, rct_map_element*) = mapElement; } @@ -3357,8 +3354,8 @@ void map_element_remove(rct_map_element *mapElement) (mapElement - 1)->flags |= MAP_ELEMENT_FLAG_LAST_TILE; mapElement->base_height = 0xFF; - if ((mapElement + 1) == RCT2_GLOBAL(0x00140E9A4, rct_map_element*)){ - RCT2_GLOBAL(0x00140E9A4, rct_map_element*)--; + if ((mapElement + 1) == RCT2_GLOBAL(RCT2_ADDRESS_NEXT_FREE_MAP_ELEMENT, rct_map_element*)){ + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_FREE_MAP_ELEMENT, rct_map_element*)--; } } @@ -3516,18 +3513,18 @@ void map_reorganise_elements() */ int sub_68B044() { - if (RCT2_GLOBAL(0x00140E9A4, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element)) + if (RCT2_GLOBAL(RCT2_ADDRESS_NEXT_FREE_MAP_ELEMENT, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element)) return 1; for (int i = 1000; i != 0; --i) sub_68B089(); - if (RCT2_GLOBAL(0x00140E9A4, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element)) + if (RCT2_GLOBAL(RCT2_ADDRESS_NEXT_FREE_MAP_ELEMENT, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element)) return 1; map_reorganise_elements(); - if (RCT2_GLOBAL(0x00140E9A4, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element)) + if (RCT2_GLOBAL(RCT2_ADDRESS_NEXT_FREE_MAP_ELEMENT, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element)) return 1; else{ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = 894; @@ -3545,7 +3542,7 @@ rct_map_element *map_element_insert(int x, int y, int z, int flags) sub_68B044(); - newMapElement = RCT2_GLOBAL(0x00140E9A4, rct_map_element*); + newMapElement = RCT2_GLOBAL(RCT2_ADDRESS_NEXT_FREE_MAP_ELEMENT, rct_map_element*); originalMapElement = TILE_MAP_ELEMENT_POINTER(y * 256 + x); // Set tile index pointer to point to new element block @@ -3586,7 +3583,7 @@ rct_map_element *map_element_insert(int x, int y, int z, int flags) } while (!((newMapElement - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE)); } - RCT2_GLOBAL(0x00140E9A4, rct_map_element*) = newMapElement; + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_FREE_MAP_ELEMENT, rct_map_element*) = newMapElement; return insertedElement; } @@ -4777,8 +4774,9 @@ void game_command_set_banner_style(int* eax, int* ebx, int* ecx, int* edx, int* *ebx = 0; } -void game_command_set_sign_style(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { - rct_banner *banner = &gBanners[*ecx]; +void game_command_set_sign_style(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) { + uint8 bannerId = *ecx & 0xFF; + rct_banner *banner = &gBanners[bannerId]; int x = banner->x << 5; int y = banner->y << 5; @@ -4788,16 +4786,23 @@ void game_command_set_sign_style(int* eax, int* ebx, int* ecx, int* edx, int* es if (*ebp == 0) { // small sign rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); + bool fence_found = false; + do{ + if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_FENCE) + continue; - while (1){ - if (map_element_get_type(map_element) == MAP_ELEMENT_TYPE_FENCE) { - rct_scenery_entry* scenery_entry = g_wallSceneryEntries[map_element->properties.fence.type]; - if (scenery_entry->wall.var_0D != 0xFF){ - if (map_element->properties.fence.item[0] == *ecx) - break; - } - } - map_element++; + rct_scenery_entry* scenery_entry = g_wallSceneryEntries[map_element->properties.fence.type]; + if (scenery_entry->wall.var_0D == 0xFF) + continue; + if (map_element->properties.fence.item[0] != bannerId) + continue; + fence_found = true; + break; + } while (!map_element_is_last_for_tile(map_element++)); + + if (fence_found == false) { + *ebx = MONEY32_UNDEFINED; + return; } map_element->flags &= 0x9F; map_element->properties.fence.item[1] = @@ -4807,7 +4812,7 @@ void game_command_set_sign_style(int* eax, int* ebx, int* ecx, int* edx, int* es map_invalidate_tile(x, y, map_element->base_height * 8, map_element->clearance_height * 8); } else { // large sign - rct_map_element *mapElement = banner_get_map_element(*ecx); + rct_map_element *mapElement = banner_get_map_element(bannerId); if (mapElement == NULL || map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 2984; *ebx = MONEY32_UNDEFINED; From 331d75e5f7738818c0306d00e3e777bc88fe22df Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 14 Nov 2015 12:40:40 +0000 Subject: [PATCH 1070/1173] Fix signs. Broken by #2172 --- src/windows/sign.c | 44 +++++++++++++++++++------------------------- src/world/map.c | 14 +++++++------- 2 files changed, 26 insertions(+), 32 deletions(-) diff --git a/src/windows/sign.c b/src/windows/sign.c index ad51f0f1d7..2599e7b256 100644 --- a/src/windows/sign.c +++ b/src/windows/sign.c @@ -187,10 +187,8 @@ void window_sign_open(rct_windownumber number) int view_z = map_element->base_height << 3; w->frame_no = view_z; - rct_banner* banner = &gBanners[w->number]; - - banner->colour = map_element->properties.scenerymultiple.colour[0] & 0x1F; - banner->text_colour = map_element->properties.scenerymultiple.colour[1] & 0x1F; + w->list_information_type = map_element->properties.scenerymultiple.colour[0] & 0x1F; + w->var_492 = map_element->properties.scenerymultiple.colour[1] & 0x1F; w->var_48C = map_element->properties.scenerymultiple.type; view_x += 16; @@ -272,14 +270,12 @@ static void window_sign_mouseup(rct_window *w, int widgetIndex) /* rct2: 0x6B9784 & 0x6E6164 */ static void window_sign_mousedown(int widgetIndex, rct_window*w, rct_widget* widget) { - rct_banner* banner = &gBanners[w->number]; - switch (widgetIndex) { case WIDX_MAIN_COLOR: - window_dropdown_show_colour(w, widget, w->colours[1] | 0x80, (uint8)banner->colour); + window_dropdown_show_colour(w, widget, w->colours[1] | 0x80, (uint8)w->list_information_type); break; case WIDX_TEXT_COLOR: - window_dropdown_show_colour(w, widget, w->colours[1] | 0x80, (uint8)banner->text_colour); + window_dropdown_show_colour(w, widget, w->colours[1] | 0x80, (uint8)w->var_492); break; } } @@ -287,16 +283,16 @@ static void window_sign_mousedown(int widgetIndex, rct_window*w, rct_widget* wid /* rct2: 0x6B979C */ static void window_sign_dropdown(rct_window *w, int widgetIndex, int dropdownIndex) { - rct_banner *banner = &gBanners[w->number]; - switch (widgetIndex){ case WIDX_MAIN_COLOR: if (dropdownIndex == -1) return; - game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, dropdownIndex, GAME_COMMAND_SET_SIGN_STYLE, banner->text_colour, 1); + w->list_information_type = dropdownIndex; + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, dropdownIndex, GAME_COMMAND_SET_SIGN_STYLE, w->var_492, 1); break; case WIDX_TEXT_COLOR: if (dropdownIndex == -1) return; - game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, banner->colour, GAME_COMMAND_SET_SIGN_STYLE, dropdownIndex, 1); + w->var_492 = dropdownIndex; + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, w->list_information_type, GAME_COMMAND_SET_SIGN_STYLE, dropdownIndex, 1); break; default: return; @@ -335,10 +331,8 @@ static void window_sign_invalidate(rct_window *w) text_colour_btn->type = WWT_COLORBTN; } - rct_banner* banner = &gBanners[w->number]; - - main_colour_btn->image = (banner->colour << 19) | 0x600013C3; - text_colour_btn->image = (banner->text_colour << 19) | 0x600013C3; + main_colour_btn->image = (w->list_information_type << 19) | 0x600013C3; + text_colour_btn->image = (w->var_492 << 19) | 0x600013C3; } /* rct2: 0x006B9754 & 0x006E6134 */ @@ -433,9 +427,9 @@ void window_sign_small_open(rct_windownumber number){ int view_z = map_element->base_height << 3; w->frame_no = view_z; - rct_banner* banner = &gBanners[w->number]; - banner->colour = map_element->properties.fence.item[1] & 0x1F; - banner->text_colour = (map_element->properties.fence.item[1] >> 5) | ((map_element->flags&0x60) >> 2); + w->list_information_type = map_element->properties.fence.item[1] & 0x1F; + w->var_492 = + ((map_element->properties.fence.item[1] >> 5) | ((map_element->flags & 0x60) >> 2)); w->var_48C = map_element->properties.fence.type; view_x += 16; @@ -521,11 +515,13 @@ static void window_sign_small_dropdown(rct_window *w, int widgetIndex, int dropd switch (widgetIndex){ case WIDX_MAIN_COLOR: if (dropdownIndex == -1) return; - game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, dropdownIndex, GAME_COMMAND_SET_SIGN_STYLE, banner->text_colour, 0); + w->list_information_type = dropdownIndex; + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, dropdownIndex, GAME_COMMAND_SET_SIGN_STYLE, w->var_492, 0); break; case WIDX_TEXT_COLOR: if (dropdownIndex == -1) return; - game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, banner->colour, GAME_COMMAND_SET_SIGN_STYLE, dropdownIndex, 0); + w->var_492 = dropdownIndex; + game_do_command(1, GAME_COMMAND_FLAG_APPLY, w->number, w->list_information_type, GAME_COMMAND_SET_SIGN_STYLE, dropdownIndex, 0); break; default: return; @@ -554,8 +550,6 @@ static void window_sign_small_invalidate(rct_window *w) text_colour_btn->type = WWT_COLORBTN; } - rct_banner* banner = &gBanners[w->number]; - - main_colour_btn->image = (banner->colour << 19) | 0x600013C3; - text_colour_btn->image = (banner->text_colour << 19) | 0x600013C3; + main_colour_btn->image = (w->list_information_type << 19) | 0x600013C3; + text_colour_btn->image = (w->var_492 << 19) | 0x600013C3; } diff --git a/src/world/map.c b/src/world/map.c index d97395c3f5..a0115997a5 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -4780,8 +4780,8 @@ void game_command_set_sign_style(int* eax, int* ebx, int* ecx, int* edx, int* es int x = banner->x << 5; int y = banner->y << 5; - banner->colour = (uint8)*edx; - banner->text_colour = (uint8)*edi; + uint8 mainColour = (uint8)*edx; + uint8 textColour = (uint8)*edi; if (*ebp == 0) { // small sign @@ -4806,9 +4806,9 @@ void game_command_set_sign_style(int* eax, int* ebx, int* ecx, int* edx, int* es } map_element->flags &= 0x9F; map_element->properties.fence.item[1] = - banner->colour | - ((banner->text_colour & 0x7) << 5); - map_element->flags |= ((banner->text_colour & 0x18) << 2); + mainColour | + ((textColour & 0x7) << 5); + map_element->flags |= ((textColour & 0x18) << 2); map_invalidate_tile(x, y, map_element->base_height * 8, map_element->clearance_height * 8); } else { // large sign @@ -4825,8 +4825,8 @@ void game_command_set_sign_style(int* eax, int* ebx, int* ecx, int* edx, int* es mapElement->base_height, mapElement->type & 3, mapElement->properties.scenerymultiple.type >> 10, - banner->colour, - banner->text_colour + mainColour, + textColour ); } From e7b58b737541d02457e637b02f824f005c07b83f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 12 Nov 2015 10:55:47 +0100 Subject: [PATCH 1071/1173] Skip closing network if already closed Fixes #2203 --- src/network/network.cpp | 11 +++++++++-- src/network/network.h | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 8c566d4ff1..2c0f55047e 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -438,11 +438,18 @@ bool Network::Init() wsa_initialized = true; } #endif + status = NETWORK_STATUS_READY; return true; } void Network::Close() { + if (status == NETWORK_STATUS_NONE) + { + // Already closed. This prevents a call in ~Network() to gfx_invalidate_screen() + // which may no longer be valid on Linux and would cause a segfault. + return; + } if (mode == NETWORK_MODE_CLIENT) { closesocket(server_connection.socket); } else @@ -1398,7 +1405,7 @@ int Network::Server_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& packet >> tick >> args[0] >> args[1] >> args[2] >> args[3] >> args[4] >> args[5] >> args[6] >> callback; int commandCommand = args[4]; - + // Don't let clients send pause or quit if (commandCommand != GAME_COMMAND_TOGGLE_PAUSE && commandCommand != GAME_COMMAND_LOAD_OR_QUIT @@ -1406,7 +1413,7 @@ int Network::Server_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& Server_Send_GAMECMD(args[0], args[1], args[2], args[3], args[4], args[5], args[6], playerid, callback); game_do_command(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); } - + return 1; } diff --git a/src/network/network.h b/src/network/network.h index 0c092fa1f7..e8c4809bfb 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -44,6 +44,7 @@ enum { enum { NETWORK_STATUS_NONE, + NETWORK_STATUS_READY, NETWORK_STATUS_RESOLVING, NETWORK_STATUS_CONNECTING, NETWORK_STATUS_CONNECTED From e885056229e7bd2a152dd860f05db65157d32a01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sat, 14 Nov 2015 17:36:32 +0100 Subject: [PATCH 1072/1173] Fix exit code handling, sprite generation Make sprite generation not start UI --- src/cmdline.c | 5 ++++- src/cmdline_sprite.c | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/cmdline.c b/src/cmdline.c index 9f7a45427d..0b0eb4b232 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -121,7 +121,10 @@ int cmdline_run(const char **argv, int argc) if (argc != 0) { gExitCode = cmdline_call_action(argv, argc); - if (gExitCode != 0) { + if (gExitCode < 0) { + return 0; + } else if (gExitCode > 0) { + gExitCode = 0; return 0; } } diff --git a/src/cmdline_sprite.c b/src/cmdline_sprite.c index 0e8f84a83a..789a86fa0a 100644 --- a/src/cmdline_sprite.c +++ b/src/cmdline_sprite.c @@ -1,8 +1,29 @@ +/***************************************************************************** + * Copyright (c) 2015 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + #include #include "cmdline.h" #include "drawing/drawing.h" #include "platform/platform.h" #include "util/util.h" +#include "openrct2.h" #define MODE_DEFAULT 0 #define MODE_CLOSEST 1 @@ -397,6 +418,7 @@ bool sprite_file_import(const char *path, rct_g1_element *outElement, uint8 **ou int cmdline_for_sprite(const char **argv, int argc) { + gOpenRCT2Headless = true; if (argc == 0) return -1; From 13e43b779bedb323ca7f9ed98cac48439871525c Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 14 Nov 2015 16:44:03 +0000 Subject: [PATCH 1073/1173] Refactor large scenery placement --- src/ride/track.c | 4 +- src/world/map.c | 413 +++++++++++++++++++++----------------------- src/world/map.h | 2 +- src/world/scenery.h | 2 +- 4 files changed, 205 insertions(+), 216 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index bdf5772f17..d6f5af362a 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3523,7 +3523,7 @@ static void track_save_add_large_scenery(int x, int y, rct_map_element *mapEleme direction = mapElement->type & 3; sequence = mapElement->properties.scenerymultiple.type >> 10; - if (!map_large_scenery_get_origin(x, y, z, direction, sequence, &x0, &y0, &z0)) { + if (!map_large_scenery_get_origin(x, y, z, direction, sequence, &x0, &y0, &z0, NULL)) { return; } @@ -3703,7 +3703,7 @@ static void track_save_remove_large_scenery(int x, int y, rct_map_element *mapEl direction = mapElement->type & 3; sequence = mapElement->properties.scenerymultiple.type >> 10; - if (!map_large_scenery_get_origin(x, y, z, direction, sequence, &x0, &y0, &z0)) { + if (!map_large_scenery_get_origin(x, y, z, direction, sequence, &x0, &y0, &z0, NULL)) { return; } diff --git a/src/world/map.c b/src/world/map.c index a0115997a5..833c95d729 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3132,207 +3132,195 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, sint16) = base_height; RCT2_GLOBAL(0x00F64F14, uint8) = 0; uint8 banner_id = 0xFF; - RCT2_GLOBAL(0x00F4389A, uint32) = 0; - if(RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0 || gConfigCheat.build_in_pause_mode){ - if(sub_68B044()){ - rct_scenery_entry* scenery_entry = RCT2_ADDRESS(RCT2_ADDRESS_LARGE_SCENERY_ENTRIES, rct_scenery_entry*)[entry_index]; - if(scenery_entry->large_scenery.var_11 != 0xFF){ - banner_id = create_new_banner(flags); - if (banner_id == MAX_BANNERS) { - *ebx = MONEY32_UNDEFINED; - return; - } - if (flags & GAME_COMMAND_FLAG_APPLY) { - rct_banner* banner = &gBanners[banner_id]; - banner->flags |= BANNER_FLAG_1; - banner->type = 0; - banner->x = x / 32; - banner->y = y / 32; - int rideIndex = banner_get_closest_ride_index(x, y, z); - if (rideIndex != -1) { - banner->colour = rideIndex; - banner->flags |= BANNER_FLAG_2; - } - } - } - rct_large_scenery_tile* tile = scenery_entry->large_scenery.tiles; - sint16 F43884 = 0xFFFF; - do{ - if(tile->x_offset == (sint16)0xFFFF){ - break; - } - int x2 = tile->x_offset; - int y2 = tile->y_offset; - switch(rotation){ - case 0:{ - }break; - case 1:{ - int temp = x2; - x2 = y2; - y2 = -temp; - }break; - case 2:{ - x2 = -x2; - y2 = -y2; - }break; - case 3:{ - int temp = y2; - y2 = x2; - x2 = -temp; - }break; - } - x2 += x; - y2 += y; - if(x2 >= 0x1FFF || y2 >= 0x1FFF || x2 < 0 || y2 < 0){ - tile++; - continue; - } - rct_map_element* map_element = map_get_surface_element_at(x2 / 32, y2 / 32); - if(map_element != NULL){ - int height = map_element->base_height * 8; - if(map_element->properties.scenerymultiple.type & 0xF){ - height += 16; - if(map_element->properties.scenerymultiple.type & 0x10){ - height += 16; - } - } - if(height > F43884){ - F43884 = height; - } - } - tile++; - }while(1); - if(z != 0){ - F43884 = z; - } - RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, sint16) = F43884; - tile = scenery_entry->large_scenery.tiles; - uint8 tile_num = 0; - do{ - if(tile->x_offset == (sint16)0xFFFF){ - break; - } - int x2 = tile->x_offset; - int y2 = tile->y_offset; - switch(rotation){ - case 0:{ - }break; - case 1:{ - int temp = x2; - x2 = y2; - y2 = -temp; - }break; - case 2:{ - x2 = -x2; - y2 = -y2; - }break; - case 3:{ - int temp = y2; - y2 = x2; - x2 = -temp; - }break; - } - int zLow = (tile->z_offset + F43884) / 8; - int zHigh = (tile->var_6 / 8) + zLow; - int bx = tile->var_7 >> 12; - bx <<= rotation; - uint8 bl = bx; - uint8 bh = bl >> 4; - bl &= 0xF; - bl |= bh; - uint8 F43887 = bl; - x2 += x; - y2 += y; - RCT2_GLOBAL(0x00F43892, sint16) = x2; - RCT2_GLOBAL(0x00F43894, sint16) = y2; - RCT2_GLOBAL(0x00F43896, uint32) = (uint32)(ebx - 3); // this is how ebx flags var is passed to 0x006B8D88 - if(gCheatsDisableClearanceChecks || map_can_construct_with_clear_at(x2, y2, zLow, zHigh, (void*)0x006B8D88, bl)){ - if(!(RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & ELEMENT_IS_UNDERWATER) && !(RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & 2)){ - int b = RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & 0x3; - if (!gCheatsDisableClearanceChecks) { - if (RCT2_GLOBAL(0x00F64F14, uint8) && !(RCT2_GLOBAL(0x00F64F14, uint8) & b)){ - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND; - *ebx = MONEY32_UNDEFINED; - return; - } - } - RCT2_GLOBAL(0x00F64F14, uint8) = b; - if(x2 >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) || y2 >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16)){ - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_OFF_EDGE_OF_MAP; - *ebx = MONEY32_UNDEFINED; - return; - } - if((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || map_is_location_owned(x2, y2, zLow * 8) || gCheatsSandboxMode){ - if(*ebx & GAME_COMMAND_FLAG_APPLY){ - if(!(*ebx & 0x40)){ - footpath_remove_litter(x2, y2, zLow * 8); - if (!gCheatsDisableClearanceChecks) { - map_remove_walls_at(x2, y2, zLow * 8, zHigh * 8); - } - } - rct_map_element *new_map_element = map_element_insert(x2 / 32, y2 / 32, zLow, F43887); - map_animation_create(0xB, x2, y2, zLow); + // Supports cost + RCT2_GLOBAL(0x00F4389A, money32) = 0; - new_map_element->clearance_height = zHigh; - new_map_element->type = MAP_ELEMENT_TYPE_SCENERY_MULTIPLE | rotation; - int bx = tile_num; - bx <<= 10; - bx |= entry_index; - new_map_element->properties.scenerymultiple.type = bx; - new_map_element->properties.scenerymultiple.colour[0] = color1; - new_map_element->properties.scenerymultiple.colour[1] = color2; - if(banner_id != 0xFF){ - uint8 bh = banner_id; - bh &= 0xC0; - new_map_element->type |= bh; - bh = banner_id; - bh &= 0x38; - bh <<= 2; - new_map_element->properties.scenerymultiple.colour[0] |= bh; - uint8 bl = banner_id; - bl &= 7; - bl <<= 5; - new_map_element->properties.scenerymultiple.colour[1] |= bl; - } + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && gConfigCheat.build_in_pause_mode) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; + *ebx = MONEY32_UNDEFINED; + return; + } - if(*ebx & 0x40){ - new_map_element->flags |= MAP_ELEMENT_FLAG_GHOST; - } - if(tile_num == 0){ - RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT, rct_map_element*) = new_map_element; - } - map_invalidate_tile_full(x2, y2); - } - }else{ - *ebx = MONEY32_UNDEFINED; - return; - } - }else{ - *ebx = MONEY32_UNDEFINED; - return; - } - }else{ - *ebx = MONEY32_UNDEFINED; - return; - } - tile++; - tile_num++; - }while(1); + if (!sub_68B044()) { + *ebx = MONEY32_UNDEFINED; + return; + } - // Force ride construction to recheck area - RCT2_GLOBAL(0x00F440B0, uint8) |= 8; + rct_scenery_entry* scenery_entry = RCT2_ADDRESS(RCT2_ADDRESS_LARGE_SCENERY_ENTRIES, rct_scenery_entry*)[entry_index]; + if(scenery_entry->large_scenery.var_11 != 0xFF){ + banner_id = create_new_banner(flags); - *ebx = (scenery_entry->large_scenery.price * 10) + RCT2_GLOBAL(0x00F4389A, uint32); - if(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY){ - *ebx = 0; - } + if (banner_id == MAX_BANNERS) { + *ebx = MONEY32_UNDEFINED; return; } - }else{ - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; + + if (flags & GAME_COMMAND_FLAG_APPLY) { + rct_banner* banner = &gBanners[banner_id]; + banner->flags |= BANNER_FLAG_1; + banner->type = 0; + banner->x = x / 32; + banner->y = y / 32; + + int rideIndex = banner_get_closest_ride_index(x, y, z); + if (rideIndex != -1) { + banner->colour = rideIndex; + banner->flags |= BANNER_FLAG_2; + } + } + } + + + sint16 maxHeight = 0xFFFF; + for (rct_large_scenery_tile* tile = scenery_entry->large_scenery.tiles; + tile->x_offset != -1; + tile++) { + + rct_xy16 curTile = { + .x = tile->x_offset, + .y = tile->y_offset + }; + + rotate_map_coordinates(&curTile.x, &curTile.y, rotation); + + curTile.x += x; + curTile.y += y; + + if(curTile.x >= 0x1FFF || curTile.y >= 0x1FFF || curTile.x < 0 || curTile.y < 0){ + tile++; + continue; + } + + rct_map_element* map_element = map_get_surface_element_at(curTile.x / 32, curTile.y / 32); + if(map_element != NULL){ + int height = map_element->base_height * 8; + + if(map_element->properties.scenerymultiple.type & 0xF){ + height += 16; + if(map_element->properties.scenerymultiple.type & 0x10){ + height += 16; + } + } + + if(height > maxHeight){ + maxHeight = height; + } + } + tile++; + } + + if(z != 0){ + maxHeight = z; + } + + RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, sint16) = maxHeight; + uint8 tile_num = 0; + for (rct_large_scenery_tile* tile = scenery_entry->large_scenery.tiles; + tile->x_offset != -1; + tile++, tile_num++) { + + rct_xy16 curTile = { + .x = tile->x_offset, + .y = tile->y_offset + }; + + rotate_map_coordinates(&curTile.x, &curTile.y, rotation); + + curTile.x += x; + curTile.y += y; + + int zLow = (tile->z_offset + maxHeight) / 8; + int zHigh = (tile->z_clearance / 8) + zLow; + + int bx = tile->var_7 >> 12; + bx <<= rotation; + uint8 bl = bx; + uint8 bh = bl >> 4; + bl &= 0xF; + bl |= bh; + uint8 F43887 = bl; + + RCT2_GLOBAL(0x00F43892, sint16) = curTile.x; + RCT2_GLOBAL(0x00F43894, sint16) = curTile.y; + RCT2_GLOBAL(0x00F43896, uint32) = (uint32)(ebx - 3); // this is how ebx flags var is passed to 0x006B8D88 + if (!gCheatsDisableClearanceChecks && !map_can_construct_with_clear_at(curTile.x, curTile.y, zLow, zHigh, (void*)0x006B8D88, bl)) { + *ebx = MONEY32_UNDEFINED; + return; + } + + if ((RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & ELEMENT_IS_UNDERWATER) || (RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & 2)) { + *ebx = MONEY32_UNDEFINED; + return; + } + + int b = RCT2_GLOBAL(RCT2_ADDRESS_ELEMENT_LOCATION_COMPARED_TO_GROUND_AND_WATER, uint8) & 0x3; + if (!gCheatsDisableClearanceChecks) { + if (RCT2_GLOBAL(0x00F64F14, uint8) && !(RCT2_GLOBAL(0x00F64F14, uint8) & b)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND; + *ebx = MONEY32_UNDEFINED; + return; + } + } + RCT2_GLOBAL(0x00F64F14, uint8) = b; + + if (curTile.x >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) || curTile.y >= RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_OFF_EDGE_OF_MAP; + *ebx = MONEY32_UNDEFINED; + return; + } + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && + !map_is_location_owned(curTile.x, curTile.y, zLow * 8) && + !gCheatsSandboxMode) { + *ebx = MONEY32_UNDEFINED; + return; + } + + if (flags & GAME_COMMAND_FLAG_APPLY) { + if (!(flags & GAME_COMMAND_FLAG_GHOST)) { + footpath_remove_litter(curTile.x, curTile.y, zLow * 8); + if (!gCheatsDisableClearanceChecks) { + map_remove_walls_at(curTile.x, curTile.y, zLow * 8, zHigh * 8); + } + } + rct_map_element *new_map_element = map_element_insert(curTile.x / 32, curTile.y / 32, zLow, F43887); + map_animation_create(MAP_ANIMATION_TYPE_LARGE_SCENERY, curTile.x, curTile.y, zLow); + + new_map_element->clearance_height = zHigh; + new_map_element->type = MAP_ELEMENT_TYPE_SCENERY_MULTIPLE | rotation; + + new_map_element->properties.scenerymultiple.type = + (tile_num << 10) | + entry_index; + + new_map_element->properties.scenerymultiple.colour[0] = color1; + new_map_element->properties.scenerymultiple.colour[1] = color2; + + if (banner_id != 0xFF) { + new_map_element->type |= banner_id & 0xC0; + new_map_element->properties.scenerymultiple.colour[0] |= (banner_id & 0x38) << 2; + new_map_element->properties.scenerymultiple.colour[1] |= (banner_id & 7) << 5; + } + + if (flags & GAME_COMMAND_FLAG_GHOST) { + new_map_element->flags |= MAP_ELEMENT_FLAG_GHOST; + } + + if (tile_num == 0) { + RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT, rct_map_element*) = new_map_element; + } + map_invalidate_tile_full(curTile.x, curTile.y); + } + } + + // Force ride construction to recheck area + RCT2_GLOBAL(0x00F440B0, uint8) |= 8; + + *ebx = (scenery_entry->large_scenery.price * 10) + RCT2_GLOBAL(0x00F4389A, money32); + if(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY){ + *ebx = 0; } - *ebx = MONEY32_UNDEFINED; } int map_get_station(rct_map_element *mapElement) @@ -4190,7 +4178,7 @@ rct_map_element *map_get_small_scenery_element_at(int x, int y, int z, int type) bool map_large_scenery_get_origin( int x, int y, int z, int direction, int sequence, - int *outX, int *outY, int *outZ + int *outX, int *outY, int *outZ, rct_map_element** outElement ) { rct_map_element *mapElement; rct_scenery_entry *sceneryEntry; @@ -4211,6 +4199,8 @@ bool map_large_scenery_get_origin( *outX = x - offsetX; *outY = y - offsetY; *outZ = (z * 8) - tile->z_offset; + if (outElement != NULL) + *outElement = mapElement; return true; } @@ -4226,21 +4216,10 @@ void sign_set_colour(int x, int y, int z, int direction, int sequence, uint8 mai sint16 offsetX, offsetY; int x0, y0, z0; - // Get the given segment of the large scenery element - mapElement = map_get_large_scenery_segment(x, y, z, direction, sequence); - if (mapElement == NULL) - return; + if (!map_large_scenery_get_origin(x, y, z, direction, sequence, &x0, &y0, &z0, &mapElement)); - // Get the origin position of the large scenery element sceneryEntry = g_largeSceneryEntries[(mapElement->properties.scenerymultiple.type) & 0x3FF]; sceneryTiles = sceneryEntry->large_scenery.tiles; - tile = &sceneryTiles[sequence]; - offsetX = tile->x_offset; - offsetY = tile->y_offset; - rotate_map_coordinates(&offsetX, &offsetY, direction); - x0 = x - offsetX; - y0 = y - offsetY; - z0 = (z * 8) - tile->z_offset; // Iterate through each tile of the large scenery element sequence = 0; @@ -4726,20 +4705,30 @@ void game_command_set_banner_style(int* eax, int* ebx, int* ecx, int* edx, int* banner->colour = (uint8)*edx; banner->text_colour = (uint8)*edi; - banner->flags = (uint8)*ebp; + uint8 bannerIndex = *ecx & 0xFF; + int x = banner->x << 5; int y = banner->y << 5; rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32); + bool bannerFound = false; + do { + if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_BANNER) + continue; - while (1){ - if ((map_element_get_type(map_element) == MAP_ELEMENT_TYPE_BANNER) && - (map_element->properties.banner.index == *ecx)) break; - map_element++; + if (map_element->properties.banner.index != bannerIndex) + continue; + + bannerFound = true; + } while (!map_element_is_last_for_tile(map_element++)); + + if (bannerFound == false) { + *ebx = MONEY32_UNDEFINED; + return; } - + map_element->properties.banner.flags = 0xFF; if (banner->flags & BANNER_FLAG_NO_ENTRY){ map_element->properties.banner.flags &= ~(1 << map_element->properties.banner.position); diff --git a/src/world/map.h b/src/world/map.h index 4c57e0971f..e791efb8a9 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -387,7 +387,7 @@ void map_clear_all_elements(); rct_map_element *map_get_large_scenery_segment(int x, int y, int z, int direction, int sequence); bool map_large_scenery_get_origin( int x, int y, int z, int direction, int sequence, - int *outX, int *outY, int *outZ + int *outX, int *outY, int *outZ, rct_map_element* outElement ); rct_map_element *map_get_track_element_at(int x, int y, int z); diff --git a/src/world/scenery.h b/src/world/scenery.h index 2dc30ba3e9..7f68bae88b 100644 --- a/src/world/scenery.h +++ b/src/world/scenery.h @@ -68,7 +68,7 @@ typedef struct { sint16 x_offset; sint16 y_offset; sint16 z_offset; - uint8 var_6; + uint8 z_clearance; uint16 var_7; } rct_large_scenery_tile; From 8d2641a2a1b62f0b0b4edbe8aa3055a710076c55 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 14 Nov 2015 16:45:42 +0000 Subject: [PATCH 1074/1173] Fix mistake in last commit --- src/world/map.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 833c95d729..00990645e0 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3188,7 +3188,6 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in curTile.y += y; if(curTile.x >= 0x1FFF || curTile.y >= 0x1FFF || curTile.x < 0 || curTile.y < 0){ - tile++; continue; } @@ -3207,7 +3206,6 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in maxHeight = height; } } - tile++; } if(z != 0){ From bcd14ad58647fc4d6353fb49d60ed08a3f3dc288 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 15 Nov 2015 04:00:16 +0000 Subject: [PATCH 1075/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 4 ++-- data/language/english_us.txt | 4 ++-- data/language/german.txt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 7bf40cce11..ab3bd77c11 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -2719,8 +2719,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(één map omhoog) -STR_2719 :(nieuw bestand) +STR_2718 :Eén map omhoog +STR_2719 :Nieuw bestand STR_2720 :{UINT16}s STR_2721 :{UINT16}s STR_2722 :{UINT16}m {UINT16}s diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 3f9cdf3d31..94ccb3de73 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(up) -STR_2719 :(new file) +STR_2718 :Up +STR_2719 :New file STR_2720 :{UINT16}sec STR_2721 :{UINT16}secs STR_2722 :{UINT16}min:{UINT16}sec diff --git a/data/language/german.txt b/data/language/german.txt index 8a048f6ef0..d923316476 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -2721,8 +2721,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(Hoch) -STR_2719 :(Neue Datei) +STR_2718 :Hoch +STR_2719 :Neue Datei STR_2720 :{UINT16}Sek. STR_2721 :{UINT16}Sek. STR_2722 :{UINT16}Min:{UINT16}Sek. From 97fc78a50662516c61db383d2de2501b093df883 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 15 Nov 2015 08:45:50 +0000 Subject: [PATCH 1076/1173] Fix safe_strncpy being unsafe --- src/interface/console.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/console.c b/src/interface/console.c index f9cb170361..730e30c94c 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -188,7 +188,7 @@ void console_draw(rct_drawpixelinfo *dpi) int lineLength = min(sizeof(lineBuffer) - (size_t)utf8_get_codepoint_length(FORMAT_GREEN), (size_t)(nextLine - ch)); lineCh = lineBuffer; lineCh = utf8_write_codepoint(lineCh, FORMAT_GREEN); - safe_strncpy(lineCh, ch, CONSOLE_BUFFER_SIZE); + strncpy(lineCh, ch, lineLength); lineCh[lineLength] = 0; gfx_draw_string(dpi, lineBuffer, 255, x, y); From cd07fd5d4eeb5398a89861c04d4dea19c5927a52 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 15 Nov 2015 09:12:19 +0000 Subject: [PATCH 1077/1173] Fix #1565. Construction window now checks to see if it has control of tool before canceling it --- src/windows/ride_construction.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index b3dae4b8de..f6704d2175 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -575,8 +575,11 @@ static void window_ride_construction_close(rct_window *w) RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 1); // In order to cancel the yellow arrow correctly the - // selection tool should be cancelled. - tool_cancel(); + // selection tool should be cancelled. Don't do a tool cancel if + // another window has already taken control of tool. + if (w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) && + w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber)) + tool_cancel(); hide_gridlines(); From faf5d9a04389614c958fbfabf769e87c6bb288c0 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 15 Nov 2015 09:55:01 +0000 Subject: [PATCH 1078/1173] Fix #2301 Lanaguages were not falling back if there was a translated string further on in the langauge pack. This issue was caused by operating on an invalid string that was masked by a cast from a nullpointer to a size_t. The code now will not set the string if there is a nullptr --- src/localisation/LanguagePack.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/localisation/LanguagePack.cpp b/src/localisation/LanguagePack.cpp index 4a532c3c82..5e7d3dd64b 100644 --- a/src/localisation/LanguagePack.cpp +++ b/src/localisation/LanguagePack.cpp @@ -71,7 +71,8 @@ LanguagePack::LanguagePack(int id, const utf8 *text) size_t stringDataBaseAddress = (size_t)_stringData; for (size_t i = 0; i < _strings.size(); i++) { - _strings[i] = (utf8*)(stringDataBaseAddress + (size_t)_strings[i]); + if (_strings[i] != nullptr) + _strings[i] = (utf8*)(stringDataBaseAddress + (size_t)_strings[i]); } for (size_t i = 0; i < _objectOverrides.size(); i++) { for (int j = 0; j < ObjectOverrideMaxStringCount; j++) { From 485705f1cbc9c55f14f4f8337056476aa637b72c Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 15 Nov 2015 10:05:22 +0000 Subject: [PATCH 1079/1173] Fix incorrect parameter type --- src/world/map.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/map.h b/src/world/map.h index e791efb8a9..d2db49fefa 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -387,7 +387,7 @@ void map_clear_all_elements(); rct_map_element *map_get_large_scenery_segment(int x, int y, int z, int direction, int sequence); bool map_large_scenery_get_origin( int x, int y, int z, int direction, int sequence, - int *outX, int *outY, int *outZ, rct_map_element* outElement + int *outX, int *outY, int *outZ, rct_map_element** outElement ); rct_map_element *map_get_track_element_at(int x, int y, int z); From 8953357f854664e5f249d740b00cb29ec5a0dc03 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 15 Nov 2015 12:30:13 +0100 Subject: [PATCH 1080/1173] Add Czech and fix some typos --- data/language/czech.txt | 3929 +++++++++++++++++++++++++++++++++ src/config.c | 33 +- src/localisation/language.cpp | 3 +- src/localisation/language.h | 3 +- 4 files changed, 3950 insertions(+), 18 deletions(-) create mode 100644 data/language/czech.txt diff --git a/data/language/czech.txt b/data/language/czech.txt new file mode 100644 index 0000000000..f8f311ccf6 --- /dev/null +++ b/data/language/czech.txt @@ -0,0 +1,3929 @@ +# STR_XXXX part is read and XXXX becomes the string id number. +# Everything after the colon and before the new line will be saved as the string. +# Use # at the beginning of a line to leave a comment. +STR_0000 : +STR_0001 :{STRINGID} {COMMA16} +STR_0002 :Spiral Roller Coaster +STR_0003 :Stand-up Roller Coaster +STR_0004 :Suspended Swinging Coaster +STR_0005 :Inverted Roller Coaster +STR_0006 :Junior Roller Coaster +STR_0007 :Miniature Railway +STR_0008 :Monorail +STR_0009 :Mini Suspended Coaster +STR_0010 :Boat Ride +STR_0011 :Wooden Wild Mouse +STR_0012 :Steeplechase +STR_0013 :Car Ride +STR_0014 :Launched Freefall +STR_0015 :Bobsleigh Coaster +STR_0016 :Observation Tower +STR_0017 :Looping Roller Coaster +STR_0018 :Dinghy Slide +STR_0019 :Mine Train Coaster +STR_0020 :Chairlift +STR_0021 :Corkscrew Roller Coaster +STR_0022 :Maze +STR_0023 :Spiral Slide +STR_0024 :Go Karts +STR_0025 :Log Flume +STR_0026 :River Rapids +STR_0027 :Dodgems +STR_0028 :Pirate Ship +STR_0029 :Swinging Inverter Ship +STR_0030 :Food Stall +STR_0031 :Neznámý obchod (1D) +STR_0032 :Drink Stall +STR_0033 :Neznámý obchod (1F) +STR_0034 :Obchod +STR_0035 :Merry-Go-Round +STR_0036 :Neznámý obchod (22) +STR_0037 :Informačí kiosek +STR_0038 :Toalety +STR_0039 :Ferris Wheel +STR_0040 :Motion Simulator +STR_0041 :3D Kino +STR_0042 :Top Spin +STR_0043 :Space Rings +STR_0044 :Reverse Freefall Coaster +STR_0045 :Lift +STR_0046 :Vertical Drop Roller Coaster +STR_0047 :Bankomat +STR_0048 :Twist +STR_0049 :Haunted House +STR_0050 :První pomoc +STR_0051 :Cirkus +STR_0052 :Vlak duchů +STR_0053 :Steel Twister Roller Coaster +STR_0054 :Wooden Roller Coaster +STR_0055 :Side-Friction Roller Coaster +STR_0056 :Wild Mouse +STR_0057 :Multi-Dimension Roller Coaster +STR_0058 :Neznámá atrakce (38) +STR_0059 :Flying Roller Coaster +STR_0060 :Neznámá atrakce (3A) +STR_0061 :Virginia Reel +STR_0062 :Splash Boats +STR_0063 :Mini Helicopters +STR_0064 :Lay-down Roller Coaster +STR_0065 :Suspended Monorail +STR_0066 :Neznámá atrakce (40) +STR_0067 :Reverser Roller Coaster +STR_0068 :Heartline Twister Coaster +STR_0069 :Mini Golf +STR_0070 :Giga Coaster +STR_0071 :Roto-Drop +STR_0072 :Flying Saucers +STR_0073 :Crooked House +STR_0074 :Monorail Cycles +STR_0075 :Compact Inverted Coaster +STR_0076 :Water Coaster +STR_0077 :Air Powered Vertical Coaster +STR_0078 :Inverted Hairpin Coaster +STR_0079 :Magic Carpet +STR_0080 :Submarine Ride +STR_0081 :River Rafts +STR_0082 :Neznámá atrakce (50) +STR_0083 :Enterprise +STR_0084 :Neznámá atrakce (52) +STR_0085 :Neznámá atrakce (53) +STR_0086 :Neznámá atrakce (54) +STR_0087 :Neznámá atrakce (55) +STR_0088 :Inverted Impulse Coaster +STR_0089 :Mini Roller Coaster +STR_0090 :Mine Ride +STR_0091 :Neznámá atrakce (59) +STR_0092 :LIM Launched Roller Coaster +STR_0093 : +STR_0094 : +STR_0095 : +STR_0096 : +STR_0097 : +STR_0098 : +STR_0099 : +STR_0100 : +STR_0101 : +STR_0102 : +STR_0103 : +STR_0104 : +STR_0105 : +STR_0106 : +STR_0107 : +STR_0108 : +STR_0109 : +STR_0110 : +STR_0111 : +STR_0112 : +STR_0113 : +STR_0114 : +STR_0115 : +STR_0116 : +STR_0117 : +STR_0118 : +STR_0119 : +STR_0120 : +STR_0121 : +STR_0122 : +STR_0123 : +STR_0124 : +STR_0125 : +STR_0126 : +STR_0127 : +STR_0128 : +STR_0129 : +STR_0130 : +STR_0131 : +STR_0132 : +STR_0133 : +STR_0134 : +STR_0135 : +STR_0136 : +STR_0137 : +STR_0138 : +STR_0139 : +STR_0140 : +STR_0141 : +STR_0142 : +STR_0143 : +STR_0144 : +STR_0145 : +STR_0146 : +STR_0147 : +STR_0148 : +STR_0149 : +STR_0150 : +STR_0151 : +STR_0152 : +STR_0153 : +STR_0154 : +STR_0155 : +STR_0156 : +STR_0157 : +STR_0158 : +STR_0159 : +STR_0160 : +STR_0161 : +STR_0162 : +STR_0163 : +STR_0164 : +STR_0165 : +STR_0166 : +STR_0167 : +STR_0168 : +STR_0169 : +STR_0170 : +STR_0171 : +STR_0172 : +STR_0173 : +STR_0174 : +STR_0175 : +STR_0176 : +STR_0177 : +STR_0178 : +STR_0179 : +STR_0180 : +STR_0181 : +STR_0182 : +STR_0183 : +STR_0184 : +STR_0185 : +STR_0186 : +STR_0187 : +STR_0188 : +STR_0189 : +STR_0190 : +STR_0191 : +STR_0192 : +STR_0193 : +STR_0194 : +STR_0195 : +STR_0196 : +STR_0197 : +STR_0198 : +STR_0199 : +STR_0200 : +STR_0201 : +STR_0202 : +STR_0203 : +STR_0204 : +STR_0205 : +STR_0206 : +STR_0207 : +STR_0208 : +STR_0209 : +STR_0210 : +STR_0211 : +STR_0212 : +STR_0213 : +STR_0214 : +STR_0215 : +STR_0216 : +STR_0217 : +STR_0218 : +STR_0219 : +STR_0220 : +STR_0221 : +STR_0222 : +STR_0223 : +STR_0224 : +STR_0225 : +STR_0226 : +STR_0227 : +STR_0228 : +STR_0229 : +STR_0230 : +STR_0231 : +STR_0232 : +STR_0233 : +STR_0234 : +STR_0235 : +STR_0236 : +STR_0237 : +STR_0238 : +STR_0239 : +STR_0240 : +STR_0241 : +STR_0242 : +STR_0243 : +STR_0244 : +STR_0245 : +STR_0246 : +STR_0247 : +STR_0248 : +STR_0249 : +STR_0250 : +STR_0251 : +STR_0252 : +STR_0253 : +STR_0254 : +STR_0255 : +STR_0256 : +STR_0257 : +STR_0258 : +STR_0259 : +STR_0260 : +STR_0261 : +STR_0262 : +STR_0263 : +STR_0264 : +STR_0265 : +STR_0266 : +STR_0267 : +STR_0268 : +STR_0269 : +STR_0270 : +STR_0271 : +STR_0272 : +STR_0273 : +STR_0274 : +STR_0275 : +STR_0276 : +STR_0277 : +STR_0278 : +STR_0279 : +STR_0280 : +STR_0281 : +STR_0282 : +STR_0283 : +STR_0284 : +STR_0285 : +STR_0286 : +STR_0287 : +STR_0288 : +STR_0289 : +STR_0290 : +STR_0291 : +STR_0292 : +STR_0293 : +STR_0294 : +STR_0295 : +STR_0296 : +STR_0297 : +STR_0298 : +STR_0299 : +STR_0300 : +STR_0301 : +STR_0302 : +STR_0303 : +STR_0304 : +STR_0305 : +STR_0306 : +STR_0307 : +STR_0308 : +STR_0309 : +STR_0310 : +STR_0311 : +STR_0312 : +STR_0313 : +STR_0314 : +STR_0315 : +STR_0316 : +STR_0317 : +STR_0318 : +STR_0319 : +STR_0320 : +STR_0321 : +STR_0322 : +STR_0323 : +STR_0324 : +STR_0325 : +STR_0326 : +STR_0327 : +STR_0328 : +STR_0329 : +STR_0330 : +STR_0331 : +STR_0332 : +STR_0333 : +STR_0334 : +STR_0335 : +STR_0336 : +STR_0337 : +STR_0338 : +STR_0339 : +STR_0340 : +STR_0341 : +STR_0342 : +STR_0343 : +STR_0344 : +STR_0345 : +STR_0346 : +STR_0347 : +STR_0348 : +STR_0349 : +STR_0350 : +STR_0351 : +STR_0352 : +STR_0353 : +STR_0354 : +STR_0355 : +STR_0356 : +STR_0357 : +STR_0358 : +STR_0359 : +STR_0360 : +STR_0361 : +STR_0362 : +STR_0363 : +STR_0364 : +STR_0365 : +STR_0366 : +STR_0367 : +STR_0368 : +STR_0369 : +STR_0370 : +STR_0371 : +STR_0372 : +STR_0373 : +STR_0374 : +STR_0375 : +STR_0376 : +STR_0377 : +STR_0378 : +STR_0379 : +STR_0380 : +STR_0381 : +STR_0382 : +STR_0383 : +STR_0384 : +STR_0385 : +STR_0386 : +STR_0387 : +STR_0388 : +STR_0389 : +STR_0390 : +STR_0391 : +STR_0392 : +STR_0393 : +STR_0394 : +STR_0395 : +STR_0396 : +STR_0397 : +STR_0398 : +STR_0399 : +STR_0400 : +STR_0401 : +STR_0402 : +STR_0403 : +STR_0404 : +STR_0405 : +STR_0406 : +STR_0407 : +STR_0408 : +STR_0409 : +STR_0410 : +STR_0411 : +STR_0412 : +STR_0413 : +STR_0414 : +STR_0415 : +STR_0416 : +STR_0417 : +STR_0418 : +STR_0419 : +STR_0420 : +STR_0421 : +STR_0422 : +STR_0423 : +STR_0424 : +STR_0425 : +STR_0426 : +STR_0427 : +STR_0428 : +STR_0429 : +STR_0430 : +STR_0431 : +STR_0432 : +STR_0433 : +STR_0434 : +STR_0435 : +STR_0436 : +STR_0437 : +STR_0438 : +STR_0439 : +STR_0440 : +STR_0441 : +STR_0442 : +STR_0443 : +STR_0444 : +STR_0445 : +STR_0446 : +STR_0447 : +STR_0448 : +STR_0449 : +STR_0450 : +STR_0451 : +STR_0452 : +STR_0453 : +STR_0454 : +STR_0455 : +STR_0456 : +STR_0457 : +STR_0458 : +STR_0459 : +STR_0460 : +STR_0461 : +STR_0462 : +STR_0463 : +STR_0464 : +STR_0465 : +STR_0466 : +STR_0467 : +STR_0468 : +STR_0469 : +STR_0470 : +STR_0471 : +STR_0472 : +STR_0473 : +STR_0474 : +STR_0475 : +STR_0476 : +STR_0477 : +STR_0478 : +STR_0479 : +STR_0480 : +STR_0481 : +STR_0482 : +STR_0483 : +STR_0484 : +STR_0485 : +STR_0486 : +STR_0487 : +STR_0488 : +STR_0489 : +STR_0490 : +STR_0491 : +STR_0492 : +STR_0493 : +STR_0494 : +STR_0495 : +STR_0496 : +STR_0497 : +STR_0498 : +STR_0499 : +STR_0500 : +STR_0501 : +STR_0502 : +STR_0503 : +STR_0504 : +STR_0505 : +STR_0506 : +STR_0507 : +STR_0508 : +STR_0509 : +STR_0510 : +STR_0511 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :A looping roller coaster where the riders ride in a standing position +STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements +STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides +STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track +STR_0518 :Passengers travel in electric trains along a monorail track +STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water +STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. +STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them +STR_0523 :Riders travel slowly in powered vehicles along a track-based route +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track +STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower +STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops +STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track +STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track +STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops +STR_0532 : +STR_0533 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids +STR_0537 : +STR_0538 : +STR_0539 : +STR_0540 : +STR_0541 : +STR_0542 : +STR_0543 : +STR_0544 : +STR_0545 : +STR_0546 : +STR_0547 : +STR_0548 : +STR_0549 : +STR_0550 : +STR_0551 : +STR_0552 : +STR_0553 : +STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience +STR_0557 : +STR_0558 : +STR_0559 : +STR_0560 : +STR_0561 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects +STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills +STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' +STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity +STR_0566 :Individual roller coaster cars zip around a tight zig-zag layout of track with sharp corners and short sharp drops +STR_0567 :Sitting in seats suspended either side of the track, riders are pitched head-over-heels while they plunge down steep drops and travel through various inversions +STR_0568 : +STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air +STR_0570 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground +STR_0575 :Powered trains hanging from a single rail transport people around the park +STR_0576 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections +STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists +STR_0579 : +STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes +STR_0582 : +STR_0583 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions +STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops +STR_0589 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track +STR_0592 : +STR_0593 : +STR_0594 : +STR_0595 : +STR_0596 : +STR_0597 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track +STR_0599 :A compact roller coaster with individual cars and smooth twisting drops +STR_0600 :Powered mine trains career along a smooth and twisted track layout +STR_0601 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions +STR_0603 :Host {INT32} +STR_0604 :Host {INT32} +STR_0605 :Host {INT32} +STR_0606 :Host {INT32} +STR_0607 :Host {INT32} +STR_0608 :Host {INT32} +STR_0609 :Host {INT32} +STR_0610 :Host {INT32} +STR_0611 :Host {INT32} +STR_0612 :Host {INT32} +STR_0613 :Host {INT32} +STR_0614 :Host {INT32} +STR_0615 :Host {INT32} +STR_0616 :Host {INT32} +STR_0617 :Host {INT32} +STR_0618 :Host {INT32} +STR_0619 :Host {INT32} +STR_0620 :Host {INT32} +STR_0621 :Host {INT32} +STR_0622 :Host {INT32} +STR_0623 :Host {INT32} +STR_0624 :Host {INT32} +STR_0625 :Host {INT32} +STR_0626 :Host {INT32} +STR_0627 :Host {INT32} +STR_0628 :Host {INT32} +STR_0629 :Host {INT32} +STR_0630 :Host {INT32} +STR_0631 :Host {INT32} +STR_0632 :Host {INT32} +STR_0633 :Host {INT32} +STR_0634 :Host {INT32} +STR_0635 :Host {INT32} +STR_0636 :Host {INT32} +STR_0637 :Host {INT32} +STR_0638 :Host {INT32} +STR_0639 :Host {INT32} +STR_0640 :Host {INT32} +STR_0641 :Host {INT32} +STR_0642 :Host {INT32} +STR_0643 :Host {INT32} +STR_0644 :Host {INT32} +STR_0645 :Host {INT32} +STR_0646 :Host {INT32} +STR_0647 :Host {INT32} +STR_0648 :Host {INT32} +STR_0649 :Host {INT32} +STR_0650 :Host {INT32} +STR_0651 :Host {INT32} +STR_0652 :Host {INT32} +STR_0653 :Host {INT32} +STR_0654 :Host {INT32} +STR_0655 :Host {INT32} +STR_0656 :Host {INT32} +STR_0657 :Host {INT32} +STR_0658 :Host {INT32} +STR_0659 :Host {INT32} +STR_0660 :Host {INT32} +STR_0661 :Host {INT32} +STR_0662 :Host {INT32} +STR_0663 :Host {INT32} +STR_0664 :Host {INT32} +STR_0665 :Host {INT32} +STR_0666 :Host {INT32} +STR_0667 :Host {INT32} +STR_0668 :Host {INT32} +STR_0669 :Host {INT32} +STR_0670 :Host {INT32} +STR_0671 :Host {INT32} +STR_0672 :Host {INT32} +STR_0673 :Host {INT32} +STR_0674 :Host {INT32} +STR_0675 :Host {INT32} +STR_0676 :Host {INT32} +STR_0677 :Host {INT32} +STR_0678 :Host {INT32} +STR_0679 :Host {INT32} +STR_0680 :Host {INT32} +STR_0681 :Host {INT32} +STR_0682 :Host {INT32} +STR_0683 :Host {INT32} +STR_0684 :Host {INT32} +STR_0685 :Host {INT32} +STR_0686 :Host {INT32} +STR_0687 :Host {INT32} +STR_0688 :Host {INT32} +STR_0689 :Host {INT32} +STR_0690 :Host {INT32} +STR_0691 :Host {INT32} +STR_0692 :Host {INT32} +STR_0693 :Host {INT32} +STR_0694 :Host {INT32} +STR_0695 :Host {INT32} +STR_0696 :Host {INT32} +STR_0697 :Host {INT32} +STR_0698 :Host {INT32} +STR_0699 :Host {INT32} +STR_0700 :Host {INT32} +STR_0701 :Host {INT32} +STR_0702 :Host {INT32} +STR_0703 :Host {INT32} +STR_0704 :Host {INT32} +STR_0705 :Host {INT32} +STR_0706 :Host {INT32} +STR_0707 :Host {INT32} +STR_0708 :Host {INT32} +STR_0709 :Host {INT32} +STR_0710 :Host {INT32} +STR_0711 :Host {INT32} +STR_0712 :Host {INT32} +STR_0713 :Host {INT32} +STR_0714 :Host {INT32} +STR_0715 :Host {INT32} +STR_0716 :Host {INT32} +STR_0717 :Host {INT32} +STR_0718 :Host {INT32} +STR_0719 :Host {INT32} +STR_0720 :Host {INT32} +STR_0721 :Host {INT32} +STR_0722 :Host {INT32} +STR_0723 :Host {INT32} +STR_0724 :Host {INT32} +STR_0725 :Host {INT32} +STR_0726 :Host {INT32} +STR_0727 :Host {INT32} +STR_0728 :Host {INT32} +STR_0729 :Host {INT32} +STR_0730 :Host {INT32} +STR_0731 :Host {INT32} +STR_0732 :Host {INT32} +STR_0733 :Host {INT32} +STR_0734 :Host {INT32} +STR_0735 :Host {INT32} +STR_0736 :Host {INT32} +STR_0737 :Host {INT32} +STR_0738 :Host {INT32} +STR_0739 :Host {INT32} +STR_0740 :Host {INT32} +STR_0741 :Host {INT32} +STR_0742 :Host {INT32} +STR_0743 :Host {INT32} +STR_0744 :Host {INT32} +STR_0745 :Host {INT32} +STR_0746 :Host {INT32} +STR_0747 :Host {INT32} +STR_0748 :Host {INT32} +STR_0749 :Host {INT32} +STR_0750 :Host {INT32} +STR_0751 :Host {INT32} +STR_0752 :Host {INT32} +STR_0753 :Host {INT32} +STR_0754 :Host {INT32} +STR_0755 :Host {INT32} +STR_0756 :Host {INT32} +STR_0757 :Host {INT32} +STR_0758 :Host {INT32} +STR_0759 :Host {INT32} +STR_0760 :Host {INT32} +STR_0761 :Host {INT32} +STR_0762 :Host {INT32} +STR_0763 :Host {INT32} +STR_0764 :Host {INT32} +STR_0765 :Host {INT32} +STR_0766 :Host {INT32} +STR_0767 :Host {INT32} +STR_0768 :Uklizeč {INT32} +STR_0769 :Technik {INT32} +STR_0770 :Hlídač {INT32} +STR_0771 :Bavič {INT32} +STR_0772 :Nepojmenovaný park{POP16}{POP16} +STR_0773 :Nepojmenovaný park{POP16}{POP16} +STR_0774 :Nepojmenovaný park{POP16}{POP16} +STR_0775 :Nepojmenovaný park{POP16}{POP16} +STR_0776 :Nepojmenovaný park{POP16}{POP16} +STR_0777 :Nepojmenovaný park{POP16}{POP16} +STR_0778 :Nápis +STR_0779 :1. +STR_0780 :2. +STR_0781 :3. +STR_0782 :4. +STR_0783 :5. +STR_0784 :6. +STR_0785 :7. +STR_0786 :8. +STR_0787 :9. +STR_0788 :10. +STR_0789 :11. +STR_0790 :12. +STR_0791 :13. +STR_0792 :14. +STR_0793 :15. +STR_0794 :16. +STR_0795 :17. +STR_0796 :18. +STR_0797 :19. +STR_0798 :20. +STR_0799 :21. +STR_0800 :22. +STR_0801 :23. +STR_0802 :24. +STR_0803 :25. +STR_0804 :26. +STR_0805 :27. +STR_0806 :28. +STR_0807 :29. +STR_0808 :30. +STR_0809 :31. +STR_0810 :Jan +STR_0811 :Feb +STR_0812 :Mar +STR_0813 :Apr +STR_0814 :May +STR_0815 :Jun +STR_0816 :Jul +STR_0817 :Aug +STR_0818 :Sep +STR_0819 :Oct +STR_0820 :Nov +STR_0821 :Dec +STR_0822 :Nedostupný grafický soubor +STR_0823 :Chybějicí nebo nedostupný soubor +STR_0824 :{BLACK}{CROSS} +STR_0825 :Zvolené jméno je již používáno +STR_0826 :Definováno příliš mnoho jmen +STR_0827 :Nedostatek financí - potřeba {CURRENCY2DP} +STR_0828 :{SMALLFONT}{BLACK}Zavřít okno +STR_0829 :{SMALLFONT}{BLACK}Window title - Drag this to move window +STR_0830 :{SMALLFONT}{BLACK}Přiblížit pohled +STR_0831 :{SMALLFONT}{BLACK}ZOddálit pohled +STR_0832 :{SMALLFONT}{BLACK}Otočit o 90{DEGREE} po směru hodinových ručiček +STR_0833 :{SMALLFONT}{BLACK}Pozastavit hru +STR_0834 :{SMALLFONT}{BLACK}Disk and game options +STR_0835 :Game initialisation failed +STR_0836 :Nelze spustit hru minimalizovanou. +STR_0837 :Unable to initialise graphics system +STR_0838 : +STR_0839 :{UINT16} x {UINT16} +STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16} +# The following six strings were used for display resolutions, but have been replaced. +STR_0841 : +STR_0842 : +STR_0843 : +STR_0844 : +STR_0845 : +STR_0846 : +STR_0847 :O 'OpenRCT2' +STR_0848 :RollerCoaster Tycoon 2 +STR_0849 :{WINDOW_COLOUR_2}Verze 2.01.028 +STR_0850 :{WINDOW_COLOUR_2}Copyright {COPYRIGHT} 2002 Chris Sawyer, všechna práva vyhrazena +STR_0851 :{WINDOW_COLOUR_2}Design a programování - Chris Sawyer +STR_0852 :{WINDOW_COLOUR_2}Grafika - Simon Foster +STR_0853 :{WINDOW_COLOUR_2}Zvuky a hudba - Allister Brimble +STR_0854 :{WINDOW_COLOUR_2}Další zvukové nahrávky - David Ellis +STR_0855 :{WINDOW_COLOUR_2}Representation by Jacqui Lyons at Marjacq Ltd. +STR_0856 :{WINDOW_COLOUR_2}Poděkování: +STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth, a John Wardley +STR_0858 :{WINDOW_COLOUR_2} +STR_0859 :{WINDOW_COLOUR_2} +STR_0860 :{WINDOW_COLOUR_2} +STR_0861 : +STR_0862 : +STR_0863 : +STR_0864 : +STR_0865 :{STRINGID} +STR_0866 :{POP16}{STRINGID} +STR_0867 :{POP16}{POP16}{STRINGID} +STR_0868 :{POP16}{POP16}{POP16}{STRINGID} +STR_0869 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0870 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0872 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0873 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0874 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0875 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0876 :{BLACK}{DOWN} +STR_0877 :Příliš nízko! ! +STR_0878 :Moc vysoko! ! +STR_0879 :Tady nelze zemi snížit... +STR_0880 :Tady nelze zemi zvíšit... +STR_0881 :Předmět v cestě +STR_0882 :Nahrát hru +STR_0883 :Uložit hru +STR_0884 :Nahrát krajinu +STR_0885 :Uložit krajinu +STR_0886 :Ukončit hru +STR_0887 :Ukončit Scenario Editor +STR_0888 :Ukončit Roller Coaster Designer +STR_0889 :Ukončit Track Designs Manager +STR_0890 :SCR{COMMA16}.BMP +STR_0891 :Screenshot +STR_0892 :Screenshot byl uložen jako '{STRINGID}' +STR_0893 :Screenshot selhal ! +STR_0894 :Landscape data area full ! +STR_0895 :Can't build partly above and partly below ground +STR_0896 :{POP16}{POP16}{STRINGID} Construction +STR_0897 :Direction +STR_0898 :{SMALLFONT}{BLACK}Left-hand curve +STR_0899 :{SMALLFONT}{BLACK}Right-hand curve +STR_0900 :{SMALLFONT}{BLACK}Left-hand curve (small radius) +STR_0901 :{SMALLFONT}{BLACK}Right-hand curve (small radius) +STR_0902 :{SMALLFONT}{BLACK}Left-hand curve (very small radius) +STR_0903 :{SMALLFONT}{BLACK}Right-hand curve (very small radius) +STR_0904 :{SMALLFONT}{BLACK}Left-hand curve (large radius) +STR_0905 :{SMALLFONT}{BLACK}Right-hand curve (large radius) +STR_0906 :{SMALLFONT}{BLACK}Straight +STR_0907 :Slope +STR_0908 :Roll/Banking +STR_0909 :Seat Rot. +STR_0910 :{SMALLFONT}{BLACK}Roll for left-hand curve +STR_0911 :{SMALLFONT}{BLACK}Roll for right-hand curve +STR_0912 :{SMALLFONT}{BLACK}No roll +STR_0913 :{SMALLFONT}{BLACK}Move to previous section +STR_0914 :{SMALLFONT}{BLACK}Move to next section +STR_0915 :{SMALLFONT}{BLACK}Construct the selected section +STR_0916 :{SMALLFONT}{BLACK}Remove the highlighted section +STR_0917 :{SMALLFONT}{BLACK}Vertical drop +STR_0918 :{SMALLFONT}{BLACK}Steep slope down +STR_0919 :{SMALLFONT}{BLACK}Slope down +STR_0920 :{SMALLFONT}{BLACK}Level +STR_0921 :{SMALLFONT}{BLACK}Slope up +STR_0922 :{SMALLFONT}{BLACK}Steep slope up +STR_0923 :{SMALLFONT}{BLACK}Vertical rise +STR_0924 :{SMALLFONT}{BLACK}Helix down +STR_0925 :{SMALLFONT}{BLACK}Helix up +STR_0926 :Tohle nelze odstranit... +STR_0927 :Tohle zde nejde postavit... +STR_0928 :{SMALLFONT}{BLACK}Chain lift, to pull cars up slopes +STR_0929 :'S' Bend (left) +STR_0930 :'S' Bend (right) +STR_0931 :Vertical Loop (left) +STR_0932 :Vertical Loop (right) +STR_0933 :Raise or lower land first +STR_0934 :Ride entrance in the way +STR_0935 :Ride exit in the way +STR_0936 :Park entrance in the way +STR_0937 :{SMALLFONT}{BLACK}View options +STR_0938 :{SMALLFONT}{BLACK}Adjust land height and slope +STR_0939 :Underground/Inside View +STR_0940 :Remove Base Land +STR_0941 :Remove Vertical Faces +STR_0942 :Průhledné atrakce +STR_0943 :Průhledná výzdoba +STR_0944 :Uložit +STR_0945 :Neukládat +STR_0946 :Zrušit +STR_0947 :Uložit před zavřením ? +STR_0948 :Uložit před ukončením ? +STR_0949 :Uložit před ukončením ? +STR_0950 :Nahrát hru +STR_0951 :Ukončit hru +STR_0952 :Ukončit hru +STR_0953 :Nahrát krajinu +STR_0954 : +STR_0955 :{SMALLFONT}{BLACK}Select seat rotation angle for this track section +STR_0956 :-180{DEGREE} +STR_0957 :-135{DEGREE} +STR_0958 :-90{DEGREE} +STR_0959 :-45{DEGREE} +STR_0960 :0{DEGREE} +STR_0961 :+45{DEGREE} +STR_0962 :+90{DEGREE} +STR_0963 :+135{DEGREE} +STR_0964 :+180{DEGREE} +STR_0965 :+225{DEGREE} +STR_0966 :+270{DEGREE} +STR_0967 :+315{DEGREE} +STR_0968 :+360{DEGREE} +STR_0969 :+405{DEGREE} +STR_0970 :+450{DEGREE} +STR_0971 :+495{DEGREE} +STR_0972 :Zrušit +STR_0973 :OK +STR_0974 :Atrakce +STR_0975 :Obchody a stánky +STR_0976 :Toalety a Informační kiosky +STR_0977 :New Transport Rides +STR_0978 :New Gentle Rides +STR_0979 :New Roller Coasters +STR_0980 :New Thrill Rides +STR_0981 :New Water Rides +STR_0982 :New Shops & Stalls +STR_0983 :Research & Development +STR_0984 :{WINDOW_COLOUR_2}{UP}{BLACK} {CURRENCY2DP} +STR_0985 :{WINDOW_COLOUR_2}{DOWN}{BLACK} {CURRENCY2DP} +STR_0986 :{BLACK}{CURRENCY2DP} +STR_0987 :Too many rides/attractions +STR_0988 :Can't create new ride/attraction... +STR_0989 :{STRINGID} +STR_0990 :{SMALLFONT}{BLACK}Construction +STR_0991 :Station platform +STR_0992 :{SMALLFONT}{BLACK}Demolish entire ride/attraction +STR_0993 :Demolish ride/attraction +STR_0994 :Demolish +STR_0995 :{WINDOW_COLOUR_1}Are you sure you want to completely demolish {STRINGID}? +STR_0996 :Overall view +STR_0997 :{SMALLFONT}{BLACK}View selection +STR_0998 :Na této trati nelze postavit více nástupišť +STR_0999 :Vyžaduje nástupiště +STR_1000 :Trať není uzavřený okruh. +STR_1001 :Track unsuitable for type of train +STR_1002 :Can't open {POP16}{POP16}{POP16}{STRINGID}... +STR_1003 :Can't test {POP16}{POP16}{POP16}{STRINGID}... +STR_1004 :Can't close {POP16}{POP16}{POP16}{STRINGID}... +STR_1005 :Can't start construction on {POP16}{POP16}{POP16}{STRINGID}... +STR_1006 :Must be closed first +STR_1007 :Unable to create enough vehicles +STR_1008 :{SMALLFONT}{BLACK}Open, close, or test ride/attraction +STR_1009 :{SMALLFONT}{BLACK}Open or close all rides/attractions +STR_1010 :{SMALLFONT}{BLACK}Open or close park +STR_1011 :Zvařít vše +STR_1012 :Otevřít vše +STR_1013 :Zvařít park +STR_1014 :Otevřít park +STR_1015 :Unable to operate with more than one station platform in this mode +STR_1016 :Unable to operate with less than two stations in this mode +STR_1017 :Can't change operating mode... +STR_1018 :Can't make changes... +STR_1019 :Can't make changes... +STR_1020 :Can't make changes... +STR_1021 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_1022 :{POP16}{POP16}{POP16}{COMMA16} vagon na vlak +STR_1023 :{POP16}{POP16}{POP16}{COMMA16} vagónů na vlak +STR_1024 :{COMMA16} vagon na vlak +STR_1025 :{COMMA16} vagónů na vlak +STR_1026 :Nástupiště je příliš dlouhé! +STR_1027 :{SMALLFONT}{BLACK}Locate this on Main View +STR_1028 :Off edge of map! +STR_1029 :Cannot build partly above and partly below water! +STR_1030 :Tohle lze stavět jen pod vodou! +STR_1031 :Tohle nejde stavět pod vodou! +STR_1032 :Tohle jde stavět jen na hladině! +STR_1033 :Tohle jde stavět jen nad zemí! +STR_1034 :Tohle jde stavět jen na povrchu! +STR_1035 :Local authority won't allow construction above tree-height! +STR_1036 :Nahrát hru +STR_1037 :Nahrát krajinu +STR_1038 :Convert saved game to scenario +STR_1039 :Install new track design +STR_1040 :Uložit hru +STR_1041 :Uložit Scenario +STR_1042 :Uložit krajinu +STR_1043 :Uložená hra OpenRCT2 +STR_1044 :Soubor scénáře OpenRCT2 +STR_1045 :Soubor krajiny OpenRCT2 +STR_1046 :Soubor designu dráhy OpenRCT2 +STR_1047 :Uložení hry selhalo! +STR_1048 :Scenario save failed! +STR_1049 :Landscape save failed! +STR_1050 :Failed to load...{NEWLINE}File contains invalid data! +STR_1051 :Nevyditelné podpěry +STR_1052 :Nevyditelní lidé +STR_1053 :{SMALLFONT}{BLACK}Rides/attractions in park +STR_1054 :{SMALLFONT}{BLACK}Name ride/attraction +STR_1055 :{SMALLFONT}{BLACK}Name person +STR_1056 :{SMALLFONT}{BLACK}Name staff member +STR_1057 :Ride/attraction name +STR_1058 :Enter new name for this ride/attraction: +STR_1059 :Can't rename ride/attraction... +STR_1060 :Invalid ride/attraction name +STR_1061 :Normal mode +STR_1062 :Continuous circuit mode +STR_1063 :Reverse-Incline launched shuttle mode +STR_1064 :Powered launch (passing station) +STR_1065 :Shuttle mode +STR_1066 :Boat hire mode +STR_1067 :Upward launch +STR_1068 :Rotating lift mode +STR_1069 :Station to station mode +STR_1070 :Single ride per admission +STR_1071 :Unlimited rides per admission +STR_1072 :Maze mode +STR_1073 :Race mode +STR_1074 :Bumper-car mode +STR_1075 :Swing mode +STR_1076 :Shop stall mode +STR_1077 :Rotation mode +STR_1078 :Forward rotation +STR_1079 :Backward rotation +STR_1080 :Film: {ENDQUOTES}Avenging aviators{ENDQUOTES} +STR_1081 :3D film: {ENDQUOTES}Mouse tails{ENDQUOTES} +STR_1082 :Space rings mode +STR_1083 :Beginners mode +STR_1084 :LIM-powered launch +STR_1085 :Film: {ENDQUOTES}Thrill riders{ENDQUOTES} +STR_1086 :3D film: {ENDQUOTES}Storm chasers{ENDQUOTES} +STR_1087 :3D film: {ENDQUOTES}Space raiders{ENDQUOTES} +STR_1088 :Intense mode +STR_1089 :Berserk mode +STR_1090 :Haunted house mode +STR_1091 :Circus show mode +STR_1092 :Downward launch +STR_1093 :Crooked house mode +STR_1094 :Freefall drop mode +STR_1095 :Continuous circuit block sectioned mode +STR_1096 :Powered launch (without passing station) +STR_1097 :Powered launch block sectioned mode +STR_1098 :Moving to end of {POP16}{STRINGID} +STR_1099 :Waiting for passengers at {POP16}{STRINGID} +STR_1100 :Waiting to depart {POP16}{STRINGID} +STR_1101 :Departing {POP16}{STRINGID} +STR_1102 :Travelling at {VELOCITY} +STR_1103 :Arriving at {POP16}{STRINGID} +STR_1104 :Unloading passengers at {POP16}{STRINGID} +STR_1105 :Travelling at {VELOCITY} +STR_1106 :Crashing! +STR_1107 :Crashed! +STR_1108 :Travelling at {VELOCITY} +STR_1109 :Swinging +STR_1110 :Rotating +STR_1111 :Rotating +STR_1112 :Operating +STR_1113 :Showing film +STR_1114 :Rotating +STR_1115 :Operating +STR_1116 :Operating +STR_1117 :Doing circus show +STR_1118 :Operating +STR_1119 :Waiting for cable lift +STR_1120 :Travelling at {VELOCITY} +STR_1121 :Stopping +STR_1122 :Waiting for passengers +STR_1123 :Waiting to start +STR_1124 :Starting +STR_1125 :Operating +STR_1126 :Stopping +STR_1127 :Unloading passengers +STR_1128 :Stopped by block brakes +STR_1129 :All vehicles in same colours +STR_1130 :Different colours per {STRINGID} +STR_1131 :Different colours per vehicle +STR_1132 :Vehicle {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1133 :Vehicle {POP16}{COMMA16} +STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} +STR_1135 :{STRINGID} {COMMA16} +STR_1136 :{SMALLFONT}{BLACK}Vybrat hlavní barvy +STR_1137 :{SMALLFONT}{BLACK}Vybrat doplňkové barvy 1 +STR_1138 :{SMALLFONT}{BLACK}Vybrat doplňkové barvy 2 +STR_1139 :{SMALLFONT}{BLACK}Vybrat barvu podpěr +STR_1140 :{SMALLFONT}{BLACK}Vybrat barevné schéma vozidel +STR_1141 :{SMALLFONT}{BLACK}Select which vehicle/train to modify +STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} +STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} +STR_1144 :Can't build/move entrance for this ride/attraction... +STR_1145 :Can't build/move exit for this ride/attraction... +STR_1146 :Vstup ještě není postaven +STR_1147 :Výstup ještě není postaven +STR_1148 :Quarter load +STR_1149 :Half load +STR_1150 :Three-quarter load +STR_1151 :Full load +STR_1152 :Any load +STR_1153 :Height Marks on Ride Tracks +STR_1154 :Height Marks on Land +STR_1155 :Height Marks on Paths +STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} +STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} +STR_1158 :Tohle nelze odstranit... +STR_1159 :{SMALLFONT}{BLACK}Place scenery, gardens, and other accessories +STR_1160 :{SMALLFONT}{BLACK}Create/adjust lakes & water +STR_1161 :Tohle tafy nemůže být... +STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} +STR_1163 :{STRINGID}{NEWLINE}(Right-Click to Modify) +STR_1164 :{STRINGID}{NEWLINE}(Right-Click to Remove) +STR_1165 :{STRINGID} - {STRINGID} {COMMA16} +STR_1166 :Tady nelze snížit hladinu vody... +STR_1167 :Tady nelze zvýšit hladinu vody... +STR_1168 :Nastavení +STR_1169 :(None) +STR_1170 :{STRING} +STR_1171 :{RED}Zavřeno - - +STR_1172 :{YELLOW}{STRINGID} - - +STR_1173 :{SMALLFONT}{BLACK}Build footpaths and queue lines +STR_1174 :Banner sign in the way +STR_1175 :Can't build this on sloped footpath +STR_1176 :Can't build footpath here... +STR_1177 :Can't remove footpath from here... +STR_1178 :Land slope unsuitable +STR_1179 :Footpath in the way +STR_1180 :Can't build this underwater! +STR_1181 :Cesty +STR_1182 :Druh +STR_1183 :Směr +STR_1184 :Slope +STR_1185 :{SMALLFONT}{BLACK}Směr +STR_1186 :{SMALLFONT}{BLACK}Slope down +STR_1187 :{SMALLFONT}{BLACK}Level +STR_1188 :{SMALLFONT}{BLACK}Slope up +STR_1189 :{SMALLFONT}{BLACK}Construct the selected footpath section +STR_1190 :{SMALLFONT}{BLACK}Remove previous footpath section +STR_1191 :{BLACK}{STRINGID} +STR_1192 :{OUTLINE}{RED}{STRINGID} +STR_1193 :{WINDOW_COLOUR_2}{STRINGID} +STR_1194 :Zavřeno +STR_1195 :Testovací kolo +STR_1196 :Otevřeno +STR_1197 :Porucha +STR_1198 :Nehoda! +STR_1199 :{COMMA16} person on ride +STR_1200 :{COMMA16} people on ride +STR_1201 :Nobody in queue line +STR_1202 :1 person in queue line +STR_1203 :{COMMA16} people in queue line +STR_1204 :{COMMA16} minute queue time +STR_1205 :{COMMA16} minutes queue time +STR_1206 :{WINDOW_COLOUR_2}Čekat na: +STR_1207 :{WINDOW_COLOUR_2}Vyjet když jiný vlak přijede do stanice +STR_1208 :{WINDOW_COLOUR_2}Vyplout když jiná loď přijede do přístavu +STR_1209 :{SMALLFONT}{BLACK}Select whether should wait for passengers before departing +STR_1210 :{SMALLFONT}{BLACK}Select whether should leave if another vehicle arrives at the same station +STR_1211 :{WINDOW_COLOUR_2}Čekat nejméně: +STR_1212 :{WINDOW_COLOUR_2}Čekat nejdéle: +STR_1213 :{SMALLFONT}{BLACK}Select minimum length of time to wait before departing +STR_1214 :{SMALLFONT}{BLACK}Select maximum length of time to wait before departing +STR_1215 :{WINDOW_COLOUR_2}Synchronise with adjacent stations +STR_1216 :{SMALLFONT}{BLACK}Select whether to synchronise departure with all adjacent stations (for 'racing') +STR_1217 :{COMMA16} sekund +STR_1218 :{BLACK}{SMALLUP} +STR_1219 :{BLACK}{SMALLDOWN} +STR_1220 :Jen východ +STR_1221 :No entrance +STR_1222 :No exit +STR_1223 :{SMALLFONT}{BLACK}Transport rides +STR_1224 :{SMALLFONT}{BLACK}Gentle rides +STR_1225 :{SMALLFONT}{BLACK}Roller coasters +STR_1226 :{SMALLFONT}{BLACK}Thrill rides +STR_1227 :{SMALLFONT}{BLACK}Water rides +STR_1228 :{SMALLFONT}{BLACK}Shops & stalls +STR_1229 :vlak +STR_1230 :vlaky +STR_1231 :Vlak +STR_1232 :Vlaky +STR_1233 :{COMMA16} vlak +STR_1234 :{COMMA16} Vlaky +STR_1235 :Vlak {COMMA16} +STR_1236 :loď +STR_1237 :loďe +STR_1238 :Loď +STR_1239 :Loďe +STR_1240 :{COMMA16} loď +STR_1241 :{COMMA16} loďe +STR_1242 :Loď {COMMA16} +STR_1243 :track +STR_1244 :tracks +STR_1245 :Track +STR_1246 :Tracks +STR_1247 :{COMMA16} track +STR_1248 :{COMMA16} tracks +STR_1249 :Track {COMMA16} +STR_1250 :docking platform +STR_1251 :docking platforms +STR_1252 :Docking platform +STR_1253 :Docking platforms +STR_1254 :{COMMA16} docking platform +STR_1255 :{COMMA16} docking platforms +STR_1256 :Docking platform {COMMA16} +STR_1257 :station +STR_1258 :stations +STR_1259 :Station +STR_1260 :Stations +STR_1261 :{COMMA16} station +STR_1262 :{COMMA16} stations +STR_1263 :Station {COMMA16} +STR_1264 :car +STR_1265 :cars +STR_1266 :Car +STR_1267 :Cars +STR_1268 :{COMMA16} car +STR_1269 :{COMMA16} cars +STR_1270 :Car {COMMA16} +STR_1271 :building +STR_1272 :buildings +STR_1273 :Building +STR_1274 :Buildings +STR_1275 :{COMMA16} building +STR_1276 :{COMMA16} buildings +STR_1277 :Building {COMMA16} +STR_1278 :structure +STR_1279 :structures +STR_1280 :Structure +STR_1281 :Structures +STR_1282 :{COMMA16} structure +STR_1283 :{COMMA16} structures +STR_1284 :Structure {COMMA16} +STR_1285 :ship +STR_1286 :ships +STR_1287 :Ship +STR_1288 :Ships +STR_1289 :{COMMA16} ship +STR_1290 :{COMMA16} ships +STR_1291 :Ship {COMMA16} +STR_1292 :cabin +STR_1293 :cabins +STR_1294 :Cabin +STR_1295 :Cabins +STR_1296 :{COMMA16} cabin +STR_1297 :{COMMA16} cabins +STR_1298 :Cabin {COMMA16} +STR_1299 :wheel +STR_1300 :wheels +STR_1301 :Wheel +STR_1302 :Wheels +STR_1303 :{COMMA16} wheel +STR_1304 :{COMMA16} wheels +STR_1305 :Wheel {COMMA16} +STR_1306 :ring +STR_1307 :rings +STR_1308 :Ring +STR_1309 :Rings +STR_1310 :{COMMA16} ring +STR_1311 :{COMMA16} rings +STR_1312 :Ring {COMMA16} +STR_1313 :player +STR_1314 :players +STR_1315 :Player +STR_1316 :Players +STR_1317 :{COMMA16} player +STR_1318 :{COMMA16} players +STR_1319 :Player {COMMA16} +STR_1320 :course +STR_1321 :courses +STR_1322 :Course +STR_1323 :Courses +STR_1324 :{COMMA16} course +STR_1325 :{COMMA16} courses +STR_1326 :Course {COMMA16} +STR_1327 :{SMALLFONT}{BLACK}Rotate objects by 90{DEGREE} +STR_1328 :Level land required +STR_1329 :{WINDOW_COLOUR_2}Launch speed: +STR_1330 :{SMALLFONT}{BLACK}Maximum speed when leaving station +STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_1332 :{VELOCITY} +STR_1333 :{STRINGID} - {STRINGID}{POP16} +STR_1334 :{STRINGID} - {STRINGID} {COMMA16} +STR_1335 :{STRINGID} - Entrance{POP16}{POP16} +STR_1336 :{STRINGID} - Station {POP16}{COMMA16} Entrance +STR_1337 :{STRINGID} - Exit{POP16}{POP16} +STR_1338 :{STRINGID} - Station {POP16}{COMMA16} Exit +STR_1339 :{BLACK}V7sledky testů nejsou hotovy... +STR_1340 :{WINDOW_COLOUR_2}Max. rychlost: {BLACK}{VELOCITY} +STR_1341 :{WINDOW_COLOUR_2}Ride time: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1342 :{DURATION} +STR_1343 :{DURATION} / +STR_1344 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1345 :{LENGTH} +STR_1346 :{LENGTH} / +STR_1347 :{WINDOW_COLOUR_2}Průměrná rychlost: {BLACK}{VELOCITY} +STR_1348 :{WINDOW_COLOUR_2}Max. positive vertical G's: {BLACK}{COMMA2DP32}g +STR_1349 :{WINDOW_COLOUR_2}Max. positive vertical G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1350 :{WINDOW_COLOUR_2}Max. negative vertical G's: {BLACK}{COMMA2DP32}g +STR_1351 :{WINDOW_COLOUR_2}Max. negative vertical G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1352 :{WINDOW_COLOUR_2}Max. lateral G's: {BLACK}{COMMA2DP32}g +STR_1353 :{WINDOW_COLOUR_2}Max. lateral G's: {OUTLINE}{RED}{COMMA2DP32}g +STR_1354 :{WINDOW_COLOUR_2}Highest drop height: {BLACK}{LENGTH} +STR_1355 :{WINDOW_COLOUR_2}Drops: {BLACK}{COMMA16} +STR_1356 :{WINDOW_COLOUR_2}Inversions: {BLACK}{COMMA16} +STR_1357 :{WINDOW_COLOUR_2}Holes: {BLACK}{COMMA16} +STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs +STR_1359 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minute +STR_1360 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minutes +STR_1361 :Can't change speed... +STR_1362 :Can't change launch speed... +STR_1363 :Too high for supports! +STR_1364 :Supports for track above can't be extended any further! +STR_1365 :In-line Twist (left) +STR_1366 :In-line Twist (right) +STR_1367 :Half Loop +STR_1368 :Half Corkscrew (left) +STR_1369 :Half Corkscrew (right) +STR_1370 :Barrel Roll (left) +STR_1371 :Barrel Roll (right) +STR_1372 :Launched Lift Hill +STR_1373 :Large Half Loop (left) +STR_1374 :Large Half Loop (right) +STR_1375 :Upper Transfer +STR_1376 :Lower Transfer +STR_1377 :Heartline Roll (left) +STR_1378 :Heartline Roll (right) +STR_1379 :Reverser (left) +STR_1380 :Reverser (right) +STR_1381 :Curved Lift Hill (left) +STR_1382 :Curved Lift Hill (right) +STR_1383 :Quarter Loop +STR_1384 :{YELLOW}{STRINGID} +STR_1385 :{SMALLFONT}{BLACK}Other track configurations +STR_1386 :Special... +STR_1387 :Can't change land type... +STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} +STR_1389 :{OUTLINE}{RED}- {CURRENCY} +STR_1390 :{CURRENCY2DP} +STR_1391 :{RED}{CURRENCY2DP} +STR_1392 :{SMALLFONT}{BLACK}View of ride/attraction +STR_1393 :{SMALLFONT}{BLACK}Vehicle details and options +STR_1394 :{SMALLFONT}{BLACK}Operating options +STR_1395 :{SMALLFONT}{BLACK}Maintenance options +STR_1396 :{SMALLFONT}{BLACK}Colour scheme options +STR_1397 :{SMALLFONT}{BLACK}Sound & music options +STR_1398 :{SMALLFONT}{BLACK}Measurements and test data +STR_1399 :{SMALLFONT}{BLACK}Graphs +STR_1400 :Entrance +STR_1401 :Exit +STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction +STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction +STR_1404 :{SMALLFONT}{BLACK}Rotate 90{DEGREE} +STR_1405 :{SMALLFONT}{BLACK}Mirror image +STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) +STR_1407 :{WINDOW_COLOUR_2}Build this... +STR_1408 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} +STR_1409 :Entry/Exit Platform +STR_1410 :Vertical Tower +STR_1411 :{STRINGID} v cestě +STR_1412 :{WINDOW_COLOUR_3}Data logging not available for this type of ride +STR_1413 :{WINDOW_COLOUR_3}Data logging will start when next {STRINGID} leaves {STRINGID} +STR_1414 :{SMALLFONT}{BLACK}{DURATION} +STR_1415 :{WINDOW_COLOUR_2}Rychlost +STR_1416 :{WINDOW_COLOUR_2}Výška +STR_1417 :{WINDOW_COLOUR_2}Vert.G's +STR_1418 :{WINDOW_COLOUR_2}Lat.G's +STR_1419 :{SMALLFONT}{BLACK}{VELOCITY} +STR_1420 :{SMALLFONT}{BLACK}{LENGTH} +STR_1421 :{SMALLFONT}{BLACK}{COMMA16}g +STR_1422 :{SMALLFONT}{BLACK}Logging data from {POP16}{STRINGID} +STR_1423 :{SMALLFONT}{BLACK}Queue line path +STR_1424 :{SMALLFONT}{BLACK}Footpath +STR_1425 :Footpath +STR_1426 :Queue Line +STR_1427 :{WINDOW_COLOUR_2}Customers: {BLACK}{COMMA32} per hour +STR_1428 :{WINDOW_COLOUR_2}Admission price: +STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1430 :Free +STR_1431 :Walking +STR_1432 :Heading for {STRINGID} +STR_1433 :Queuing for {STRINGID} +STR_1434 :Drowning +STR_1435 :On {STRINGID} +STR_1436 :In {STRINGID} +STR_1437 :At {STRINGID} +STR_1438 :Sitting +STR_1439 :(select location) +STR_1440 :Mowing grass +STR_1441 :Sweeping footpath +STR_1442 :Emptying litter bin +STR_1443 :Watering gardens +STR_1444 :Watching {STRINGID} +STR_1445 :Watching construction of {STRINGID} +STR_1446 :Looking at scenery +STR_1447 :Leaving the park +STR_1448 :Watching new ride being constructed +STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) +STR_1452 :Guest's name +STR_1453 :Enter name for this guest: +STR_1454 :Can't name guest... +STR_1455 :Invalid name for guest +STR_1456 :{WINDOW_COLOUR_2}Cash spent: {BLACK}{CURRENCY2DP} +STR_1457 :{WINDOW_COLOUR_2}Cash in pocket: {BLACK}{CURRENCY2DP} +STR_1458 :{WINDOW_COLOUR_2}Time in park: {BLACK}{REALTIME} +STR_1459 :Track style +STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track +STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track +STR_1462 :Too steep for lift hill +STR_1463 :Guests +STR_1464 :Helix up (small) +STR_1465 :Helix up (large) +STR_1466 :Helix down (small) +STR_1467 :Helix down (large) +STR_1468 :Staff +STR_1469 :Ride must start and end with stations +STR_1470 :Station not long enough +STR_1471 :{WINDOW_COLOUR_2}Speed: +STR_1472 :{SMALLFONT}{BLACK}Speed of this ride +STR_1473 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1474 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}Not yet available +STR_1475 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1476 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}Not yet available +STR_1477 :{WINDOW_COLOUR_2}Intensity rating: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) +STR_1478 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1479 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}Not yet available +STR_1480 :{SMALLFONT}{OPENQUOTES}Nemohu si dovolit {STRINGID}{ENDQUOTES} +STR_1481 :{SMALLFONT}{OPENQUOTES}Utratil jsem všechny své peníze{ENDQUOTES} +STR_1482 :{SMALLFONT}{OPENQUOTES}Je my špatně{ENDQUOTES} +STR_1483 :{SMALLFONT}{OPENQUOTES}Je my hrozně špatně{ENDQUOTES} +STR_1484 :{SMALLFONT}{OPENQUOTES}I want to go on something more thrilling than {STRINGID}{ENDQUOTES} +STR_1485 :{SMALLFONT}{OPENQUOTES}{STRINGID} na mě vypadá moc intenzivně{ENDQUOTES} +STR_1486 :{SMALLFONT}{OPENQUOTES}I haven't finished my {STRINGID} yet{ENDQUOTES} +STR_1487 :{SMALLFONT}{OPENQUOTES}Jen ze sledování {STRINGID} se my dělá zle{ENDQUOTES} +STR_1488 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za vstup na {STRINGID}{ENDQUOTES} +STR_1489 :{SMALLFONT}{OPENQUOTES}Chci jít domů{ENDQUOTES} +STR_1490 :{SMALLFONT}{OPENQUOTES}{STRINGID} is really good value{ENDQUOTES} +STR_1491 :{SMALLFONT}{OPENQUOTES}Už mám {STRINGID}{ENDQUOTES} +STR_1492 :{SMALLFONT}{OPENQUOTES}Nemohu si dovolit {STRINGID}{ENDQUOTES} +STR_1493 :{SMALLFONT}{OPENQUOTES}Nejdem hladový{ENDQUOTES} +STR_1494 :{SMALLFONT}{OPENQUOTES}Nemám žízeň{ENDQUOTES} +STR_1495 :{SMALLFONT}{OPENQUOTES}Pomóc! Topím se!{ENDQUOTES} +STR_1496 :{SMALLFONT}{OPENQUOTES}Ztratil jsem se!{ENDQUOTES} +STR_1497 :{SMALLFONT}{OPENQUOTES}Na {STRINGID} to bylo super{ENDQUOTES} +STR_1498 :{SMALLFONT}{OPENQUOTES}4ekám v řadě na {STRINGID} už věky{ENDQUOTES} +STR_1499 :{SMALLFONT}{OPENQUOTES}Jsem unavený{ENDQUOTES} +STR_1500 :{SMALLFONT}{OPENQUOTES}Mám hlad{ENDQUOTES} +STR_1501 :{SMALLFONT}{OPENQUOTES}Jsem žíznivý{ENDQUOTES} +STR_1502 :{SMALLFONT}{OPENQUOTES}Potřebuji jít na toaletu{ENDQUOTES} +STR_1503 :{SMALLFONT}{OPENQUOTES}Nemůžu najít {STRINGID}{ENDQUOTES} +STR_1504 :{SMALLFONT}{OPENQUOTES}I'm not paying that much to use {STRINGID}{ENDQUOTES} +STR_1505 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} while it's raining{ENDQUOTES} +STR_1506 :{SMALLFONT}{OPENQUOTES}Je tu hrozný nepořádek{ENDQUOTES} +STR_1507 :{SMALLFONT}{OPENQUOTES}Nemůžu najít východ z praku{ENDQUOTES} +STR_1508 :{SMALLFONT}{OPENQUOTES}I want to get off {STRINGID}{ENDQUOTES} +STR_1509 :{SMALLFONT}{OPENQUOTES}I want to get out of {STRINGID}{ENDQUOTES} +STR_1510 :{SMALLFONT}{OPENQUOTES}I'm not going on {STRINGID} - It isn't safe{ENDQUOTES} +STR_1511 :{SMALLFONT}{OPENQUOTES}This path is disgusting{ENDQUOTES} +STR_1512 :{SMALLFONT}{OPENQUOTES}Je to tady hrozně přelidněné{ENDQUOTES} +STR_1513 :{SMALLFONT}{OPENQUOTES}The vandalism here is really bad{ENDQUOTES} +STR_1514 :{SMALLFONT}{OPENQUOTES}Krásné prostředí!{ENDQUOTES} +STR_1515 :{SMALLFONT}{OPENQUOTES}This park is really clean and tidy{ENDQUOTES} +STR_1516 :{SMALLFONT}{OPENQUOTES}The jumping fountains are great{ENDQUOTES} +STR_1517 :{SMALLFONT}{OPENQUOTES}The music is nice here{ENDQUOTES} +STR_1518 :{SMALLFONT}{OPENQUOTES}This balloon from {STRINGID} is really good value{ENDQUOTES} +STR_1519 :{SMALLFONT}{OPENQUOTES}This cuddly toy from {STRINGID} is really good value{ENDQUOTES} +STR_1520 :{SMALLFONT}{OPENQUOTES}This park map from {STRINGID} is really good value{ENDQUOTES} +STR_1521 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1522 :{SMALLFONT}{OPENQUOTES}This umbrella from {STRINGID} is really good value{ENDQUOTES} +STR_1523 :{SMALLFONT}{OPENQUOTES}This drink from {STRINGID} is really good value{ENDQUOTES} +STR_1524 :{SMALLFONT}{OPENQUOTES}This burger from {STRINGID} is really good value{ENDQUOTES} +STR_1525 :{SMALLFONT}{OPENQUOTES}These chips from {STRINGID} are really good value{ENDQUOTES} +STR_1526 :{SMALLFONT}{OPENQUOTES}This ice cream from {STRINGID} is really good value{ENDQUOTES} +STR_1527 :{SMALLFONT}{OPENQUOTES}This candyfloss from {STRINGID} is really good value{ENDQUOTES} +STR_1528 : +STR_1529 : +STR_1530 : +STR_1531 :{SMALLFONT}{OPENQUOTES}This pizza from {STRINGID} is really good value{ENDQUOTES} +STR_1532 : +STR_1533 :{SMALLFONT}{OPENQUOTES}This popcorn from {STRINGID} is really good value{ENDQUOTES} +STR_1534 :{SMALLFONT}{OPENQUOTES}This hot dog from {STRINGID} is really good value{ENDQUOTES} +STR_1535 :{SMALLFONT}{OPENQUOTES}This tentacle from {STRINGID} is really good value{ENDQUOTES} +STR_1536 :{SMALLFONT}{OPENQUOTES}This hat from {STRINGID} is really good value{ENDQUOTES} +STR_1537 :{SMALLFONT}{OPENQUOTES}This toffee apple from {STRINGID} is really good value{ENDQUOTES} +STR_1538 :{SMALLFONT}{OPENQUOTES}This T-shirt from {STRINGID} is really good value{ENDQUOTES} +STR_1539 :{SMALLFONT}{OPENQUOTES}This doughnut from {STRINGID} is really good value{ENDQUOTES} +STR_1540 :{SMALLFONT}{OPENQUOTES}This coffee from {STRINGID} is really good value{ENDQUOTES} +STR_1541 : +STR_1542 :{SMALLFONT}{OPENQUOTES}This fried chicken from {STRINGID} is really good value{ENDQUOTES} +STR_1543 :{SMALLFONT}{OPENQUOTES}This lemonade from {STRINGID} is really good value{ENDQUOTES} +STR_1544 : +STR_1545 : +STR_1546 : +STR_1547 : +STR_1548 : +STR_1549 : +STR_1550 :{SMALLFONT}{OPENQUOTES}Wow!{ENDQUOTES} +STR_1551 :{SMALLFONT}{OPENQUOTES}I have the strangest feeling someone is watching me{ENDQUOTES} +STR_1552 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a balloon from {STRINGID}{ENDQUOTES} +STR_1553 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cuddly toy from {STRINGID}{ENDQUOTES} +STR_1554 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a park map from {STRINGID}{ENDQUOTES} +STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} +STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} +STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} +STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} +STR_1562 : +STR_1563 : +STR_1564 : +STR_1565 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za pizza from {STRINGID}{ENDQUOTES} +STR_1566 : +STR_1567 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za popcorn from {STRINGID}{ENDQUOTES} +STR_1568 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a hot dog from {STRINGID}{ENDQUOTES} +STR_1569 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za tentacle from {STRINGID}{ENDQUOTES} +STR_1570 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a hat from {STRINGID}{ENDQUOTES} +STR_1571 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a toffee apple from {STRINGID}{ENDQUOTES} +STR_1572 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a T-shirt from {STRINGID}{ENDQUOTES} +STR_1573 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a doughnut from {STRINGID}{ENDQUOTES} +STR_1574 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za coffee from {STRINGID}{ENDQUOTES} +STR_1575 : +STR_1576 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za fried chicken from {STRINGID}{ENDQUOTES} +STR_1577 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za lemonade from {STRINGID}{ENDQUOTES} +STR_1578 : +STR_1579 : +STR_1580 : +STR_1581 : +STR_1582 : +STR_1583 : +STR_1584 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1585 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1586 :{SMALLFONT}{OPENQUOTES}This on-ride photo from {STRINGID} is really good value{ENDQUOTES} +STR_1587 :{SMALLFONT}{OPENQUOTES}This pretzel from {STRINGID} is really good value{ENDQUOTES} +STR_1588 :{SMALLFONT}{OPENQUOTES}This hot chocolate from {STRINGID} is really good value{ENDQUOTES} +STR_1589 :{SMALLFONT}{OPENQUOTES}This iced tea from {STRINGID} is really good value{ENDQUOTES} +STR_1590 :{SMALLFONT}{OPENQUOTES}This funnel cake from {STRINGID} is really good value{ENDQUOTES} +STR_1591 :{SMALLFONT}{OPENQUOTES}These sunglasses from {STRINGID} are really good value{ENDQUOTES} +STR_1592 :{SMALLFONT}{OPENQUOTES}These beef noodles from {STRINGID} are really good value{ENDQUOTES} +STR_1593 :{SMALLFONT}{OPENQUOTES}These fried rice noodles from {STRINGID} are really good value{ENDQUOTES} +STR_1594 :{SMALLFONT}{OPENQUOTES}This wonton soup from {STRINGID} is really good value{ENDQUOTES} +STR_1595 :{SMALLFONT}{OPENQUOTES}This meatball soup from {STRINGID} is really good value{ENDQUOTES} +STR_1596 :{SMALLFONT}{OPENQUOTES}This fruit juice from {STRINGID} is really good value{ENDQUOTES} +STR_1597 :{SMALLFONT}{OPENQUOTES}This soybean milk from {STRINGID} is really good value{ENDQUOTES} +STR_1598 :{SMALLFONT}{OPENQUOTES}This sujongkwa from {STRINGID} is really good value{ENDQUOTES} +STR_1599 :{SMALLFONT}{OPENQUOTES}This sub sandwich from {STRINGID} is really good value{ENDQUOTES} +STR_1600 :{SMALLFONT}{OPENQUOTES}This cookie from {STRINGID} is really good value{ENDQUOTES} +STR_1601 : +STR_1602 : +STR_1603 : +STR_1604 :{SMALLFONT}{OPENQUOTES}This roast sausage from {STRINGID} are really good value{ENDQUOTES} +STR_1605 : +STR_1606 : +STR_1607 : +STR_1608 : +STR_1609 : +STR_1610 : +STR_1611 : +STR_1612 : +STR_1613 : +STR_1614 : +STR_1615 : +STR_1616 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za on-ride photo from {STRINGID}{ENDQUOTES} +STR_1617 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1618 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1619 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a pretzel from {STRINGID}{ENDQUOTES} +STR_1620 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za hot chocolate from {STRINGID}{ENDQUOTES} +STR_1621 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za iced tea from {STRINGID}{ENDQUOTES} +STR_1622 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a funnel cake from {STRINGID}{ENDQUOTES} +STR_1623 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za sunglasses from {STRINGID}{ENDQUOTES} +STR_1624 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za beef noodles from {STRINGID}{ENDQUOTES} +STR_1625 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za fried rice noodles from {STRINGID}{ENDQUOTES} +STR_1626 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za wonton soup from {STRINGID}{ENDQUOTES} +STR_1627 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za for meatball soup from {STRINGID}{ENDQUOTES} +STR_1628 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za fruit juice from {STRINGID}{ENDQUOTES} +STR_1629 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za soybean milk from {STRINGID}{ENDQUOTES} +STR_1630 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za for sujongkwa from {STRINGID}{ENDQUOTES} +STR_1631 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a sub sandwich from {STRINGID}{ENDQUOTES} +STR_1632 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a cookie from {STRINGID}{ENDQUOTES} +STR_1633 : +STR_1634 : +STR_1635 : +STR_1636 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a roast sausage from {STRINGID}{ENDQUOTES} +STR_1637 : +STR_1638 : +STR_1639 : +STR_1640 : +STR_1641 : +STR_1642 : +STR_1643 : +STR_1644 : +STR_1645 : +STR_1646 : +STR_1647 : +STR_1648 :{SMALLFONT}{OPENQUOTES}Pomóc! Polož mě dolů!{ENDQUOTES} +STR_1649 :{SMALLFONT}{OPENQUOTES}Dochází my hotovost!{ENDQUOTES} +STR_1650 :{SMALLFONT}{OPENQUOTES}Wow! A new ride being built!{ENDQUOTES} +STR_1651 :{SMALLFONT}{OPENQUOTES}Nice ride! But not as good as the Phoenix...{ENDQUOTES} +STR_1652 :{SMALLFONT}{OPENQUOTES}I'm so excited - It's an Intamin ride!{ENDQUOTES} +STR_1653 :{SMALLFONT}{OPENQUOTES}...and here we are on {STRINGID}!{ENDQUOTES} +STR_1654 :{WINDOW_COLOUR_2}Recent thoughts: +STR_1655 :{SMALLFONT}{BLACK}Construct footpath on land +STR_1656 :{SMALLFONT}{BLACK}Construct bridge or tunnel footpath +STR_1657 :{WINDOW_COLOUR_2}Preferred ride +STR_1658 :{WINDOW_COLOUR_2}intenzita: {BLACK}méně než {COMMA16} +STR_1659 :{WINDOW_COLOUR_2}intenzita: {BLACK}mezi {COMMA16} a {COMMA16} +STR_1660 :{WINDOW_COLOUR_2}intenzita: {BLACK}víc než {COMMA16} +STR_1661 :{WINDOW_COLOUR_2}Odolnost nevolnosti: {BLACK}{STRINGID} +STR_1662 :{WINDOW_COLOUR_2}Nálada: +STR_1663 :{WINDOW_COLOUR_2}Nevolnost: +STR_1664 :{WINDOW_COLOUR_2}Energie: +STR_1665 :{WINDOW_COLOUR_2}Hlad: +STR_1666 :{WINDOW_COLOUR_2}Žízeň: +STR_1667 :{WINDOW_COLOUR_2}Toalety: +STR_1668 :{WINDOW_COLOUR_2}Uspokojení: {BLACK}neznámé +STR_1669 :{WINDOW_COLOUR_2}Uspokojení: {BLACK}{COMMA16}% +STR_1670 :{WINDOW_COLOUR_2}Hostů celkem: {BLACK}{COMMA32} +STR_1671 :{WINDOW_COLOUR_2}Výdělek celkem: {BLACK}{CURRENCY2DP} +STR_1672 :Brakes +STR_1673 :Spinning Control Toggle Track +STR_1674 :Brake speed +STR_1675 :{POP16}{VELOCITY} +STR_1676 :{SMALLFONT}{BLACK}Set speed limit for brakes +STR_1677 :{WINDOW_COLOUR_2}Popularita: {BLACK}Neznámá +STR_1678 :{WINDOW_COLOUR_2}Popularita: {BLACK}{COMMA16}% +STR_1679 :Helix up (left) +STR_1680 :Helix up (right) +STR_1681 :Helix down (left) +STR_1682 :Helix down (right) +STR_1683 :Base size 2 x 2 +STR_1684 :Base size 4 x 4 +STR_1685 :Base size 2 x 4 +STR_1686 :Base size 5 x 1 +STR_1687 :Water splash +STR_1688 :Base size 4 x 1 +STR_1689 :Block brakes +STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} +STR_1691 :{WINDOW_COLOUR_2} Cost: {BLACK}{CURRENCY} +STR_1692 :{WINDOW_COLOUR_2} Cost: {BLACK}from {CURRENCY} +STR_1693 :{SMALLFONT}{BLACK}Guests +STR_1694 :{SMALLFONT}{BLACK}Staff +STR_1695 :{SMALLFONT}{BLACK}Income and costs +STR_1696 :{SMALLFONT}{BLACK}Customer information +STR_1697 :Cannot place these on queue line area +STR_1698 :Can only place these on queue area +STR_1699 :Too many people in game +STR_1700 :Hire new Handyman +STR_1701 :Hire new Mechanic +STR_1702 :Hire new Security Guard +STR_1703 :Hire new Entertainer +STR_1704 :Can't hire new staff... +STR_1705 :{SMALLFONT}{BLACK}Sack this staff member +STR_1706 :{SMALLFONT}{BLACK}Move this person to a new location +STR_1707 :Too many staff in game +STR_1708 :{SMALLFONT}{BLACK}Set patrol area for this staff member +STR_1709 :Sack staff +STR_1710 :Yes +STR_1711 :{WINDOW_COLOUR_1}Are you sure you want to sack {STRINGID}? +STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Sweep footpaths +STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Water gardens +STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Empty litter bins +STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Mow grass +STR_1716 :Invalid name for park +STR_1717 :Can't rename park... +STR_1718 :Park Name +STR_1719 :Enter name for park: +STR_1720 :{SMALLFONT}{BLACK}Name park +STR_1721 :Park closed +STR_1722 :Park open +STR_1723 :Can't open park... +STR_1724 :Can't close park... +STR_1725 :Can't buy land... +STR_1726 :Land not for sale! +STR_1727 :Construction rights not for sale! +STR_1728 :Can't buy construction rights here... +STR_1729 :Land not owned by park! +STR_1730 :{RED}Closed - - +STR_1731 :{WHITE}{STRINGID} - - +STR_1732 :Build +STR_1733 :Mode +STR_1734 :{WINDOW_COLOUR_2}Number of laps: +STR_1735 :{SMALLFONT}{BLACK}Number of laps of circuit +STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1737 :{COMMA16} +STR_1738 :Can't change number of laps... +STR_1739 :Race won by guest {INT32} +STR_1740 :Race won by {STRINGID} +STR_1741 :Not yet constructed ! +STR_1742 :{WINDOW_COLOUR_2}Max. people on ride: +STR_1743 :{SMALLFONT}{BLACK}Maximum number of people allowed on this ride at one time +STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1745 :{COMMA16} +STR_1746 :Can't change this... +STR_1747 :{WINDOW_COLOUR_2}Time limit: +STR_1748 :{SMALLFONT}{BLACK}Time limit for ride +STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} +STR_1750 :{DURATION} +STR_1751 :Can't change time limit for ride... +STR_1752 :{SMALLFONT}{BLACK}Show list of individual guests in park +STR_1753 :{SMALLFONT}{BLACK}Show summarised list of guests in park +STR_1754 :{BLACK}{COMMA16} guests +STR_1755 :{BLACK}{COMMA16} guest +STR_1756 :{WINDOW_COLOUR_2}Admission price: +STR_1757 :{WINDOW_COLOUR_2}Reliability: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1758 :{SMALLFONT}{BLACK}Build mode +STR_1759 :{SMALLFONT}{BLACK}Move mode +STR_1760 :{SMALLFONT}{BLACK}Fill-in mode +STR_1761 :{SMALLFONT}{BLACK}Build maze in this direction +STR_1762 :Waterfalls +STR_1763 :Rapids +STR_1764 :Log Bumps +STR_1765 :On-ride photo section +STR_1766 :Reverser turntable +STR_1767 :Spinning tunnel +STR_1768 :Can't change number of swings... +STR_1769 :{WINDOW_COLOUR_2}Number of swings: +STR_1770 :{SMALLFONT}{BLACK}Number of complete swings +STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1772 :{COMMA16} +STR_1773 :Only one on-ride photo section allowed per ride +STR_1774 :Only one cable lift hill allowed per ride +STR_1775 :Off +STR_1776 :On +STR_1777 :{WINDOW_COLOUR_2}Music +STR_1778 :{STRINGID} - - +STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume +STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume +STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume +STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume +STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume +STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snowman costume +STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Knight costume +STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume +STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume +STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume +STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume +STR_1790 :{SMALLFONT}{BLACK}Select uniform colour for this type of staff +STR_1791 :{WINDOW_COLOUR_2}Uniform colour: +STR_1792 :Responding to {STRINGID} breakdown call +STR_1793 :Heading to {STRINGID} for an inspection +STR_1794 :Fixing {STRINGID} +STR_1795 :Answering radio call +STR_1796 :Has broken down and requires fixing +STR_1797 :This option cannot be changed for this ride +STR_1798 :Whirlpool +STR_1799 :{POP16}{POP16}{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1800 :Safety cut-out +STR_1801 :Restraints stuck closed +STR_1802 :Restraints stuck open +STR_1803 :Doors stuck closed +STR_1804 :Doors stuck open +STR_1805 :Vehicle malfunction +STR_1806 :Brakes failure +STR_1807 :Control failure +STR_1808 :{WINDOW_COLOUR_2}Last breakdown: {BLACK}{STRINGID} +STR_1809 :{WINDOW_COLOUR_2}Current breakdown: {OUTLINE}{RED}{STRINGID} +STR_1810 :{WINDOW_COLOUR_2}Carrying: +STR_1811 :Can't build this here... +STR_1812 :{SMALLFONT}{BLACK}{STRINGID} +STR_1813 :Miscellaneous Objects +STR_1814 :Actions +STR_1815 :Thoughts +STR_1816 :{SMALLFONT}{BLACK}Select information type to show in guest list +STR_1817 :({COMMA16}) +STR_1818 :{WINDOW_COLOUR_2}All guests +STR_1819 :{WINDOW_COLOUR_2}All guests (summarised) +STR_1820 :{WINDOW_COLOUR_2}Guests {STRINGID} +STR_1821 :{WINDOW_COLOUR_2}Guests thinking {STRINGID} +STR_1822 :{WINDOW_COLOUR_2}Guests thinking about {POP16}{STRINGID} +STR_1823 :{SMALLFONT}{BLACK}Show guests' thoughts about this ride/attraction +STR_1824 :{SMALLFONT}{BLACK}Show guests on this ride/attraction +STR_1825 :{SMALLFONT}{BLACK}Show guests queuing for this ride/attraction +STR_1826 :Stav +STR_1827 :Popularita +STR_1828 :Spokojenost +STR_1829 :Výdělečnost +STR_1830 :Délka řady +STR_1831 :Doba čekání +STR_1832 :Reliability +STR_1833 :Přerušní provozu +STR_1834 :Guests favourite +STR_1835 :Popularita: Neznámá +STR_1836 :Popularita: {COMMA16}% +STR_1837 :Spokojenost: Neznámá +STR_1838 :Spokojenost: {COMMA16}% +STR_1839 :Reliability: {COMMA16}% +STR_1840 :Přerušní provozu: {COMMA16}% +STR_1841 :Výdělečnost: {CURRENCY2DP} per hour +STR_1842 :Favourite of: {COMMA16} guest +STR_1843 :Favourite of: {COMMA16} guests +STR_1844 :{SMALLFONT}{BLACK}Select information type to show in ride/attraction list +STR_1845 :{MONTHYEAR} +STR_1846 :{COMMA16} guests +STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} guests +STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} guests +STR_1849 :{WINDOW_COLOUR_2}Play music +STR_1850 :{SMALLFONT}{BLACK}Vyber jaká hudba se bude hrát +STR_1851 :{WINDOW_COLOUR_2}Cena provozu: {BLACK}{CURRENCY2DP} za hodinu +STR_1852 :{WINDOW_COLOUR_2}Cena provozu: {BLACK}Unknown +STR_1853 :{WINDOW_COLOUR_2}Postaveno: {BLACK}Letos +STR_1854 :{WINDOW_COLOUR_2}Postaveno: {BLACK}Minulí rok +STR_1855 :{WINDOW_COLOUR_2}Postaveno: {BLACK}Před {COMMA16} lety +STR_1856 :{WINDOW_COLOUR_2}Zisk za prodaný předmět: {BLACK}{CURRENCY2DP} +STR_1857 :{WINDOW_COLOUR_2}Ztráta na prodaný předmět: {BLACK}{CURRENCY2DP} +STR_1858 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY2DP} per month +STR_1859 :Uklízeč +STR_1860 :Technik +STR_1861 :Hlídač +STR_1862 :Bavič +STR_1863 :Uklízeč +STR_1864 :Technik +STR_1865 :Hlídač +STR_1866 :Bavič +STR_1867 :{BLACK}{COMMA16} {STRINGID} +STR_1868 :Can't change number of rotations... +STR_1869 :{WINDOW_COLOUR_2}Number of rotations: +STR_1870 :{SMALLFONT}{BLACK}Number of complete rotations +STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1872 :{COMMA16} +STR_1873 :{WINDOW_COLOUR_2}Income: {BLACK}{CURRENCY2DP} per hour +STR_1874 :{WINDOW_COLOUR_2}Profit: {BLACK}{CURRENCY2DP} per hour +STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} +STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspect Rides +STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Fix Rides +STR_1878 :{WINDOW_COLOUR_2}Inspection: +STR_1879 :Every 10 minutes +STR_1880 :Every 20 minutes +STR_1881 :Every 30 minutes +STR_1882 :Every 45 minutes +STR_1883 :Every hour +STR_1884 :Every 2 hours +STR_1885 :Never +STR_1886 :Inspecting {STRINGID} +STR_1887 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}{COMMA16} minutes +STR_1888 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}more than 4 hours +STR_1889 :{WINDOW_COLOUR_2}Down-Time: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1890 :{SMALLFONT}{BLACK}Select how often a mechanic should check this ride +STR_1891 :No {STRINGID} in park yet! +# The following two strings were used to display an error when the disc was missing. +# This has been replaced in OpenRCT2. +STR_1892 : +STR_1893 : +STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sold: {BLACK}{COMMA32} +STR_1895 :{SMALLFONT}{BLACK}Postavit novou atrakci +STR_1896 :{WINDOW_COLOUR_2}Expenditure/Income +STR_1897 :{WINDOW_COLOUR_2}Ride construction +STR_1898 :{WINDOW_COLOUR_2}Ride running costs +STR_1899 :{WINDOW_COLOUR_2}Land purchase +STR_1900 :{WINDOW_COLOUR_2}Landscaping +STR_1901 :{WINDOW_COLOUR_2}Park entrance tickets +STR_1902 :{WINDOW_COLOUR_2}Ride tickets +STR_1903 :{WINDOW_COLOUR_2}Shop sales +STR_1904 :{WINDOW_COLOUR_2}Shop stock +STR_1905 :{WINDOW_COLOUR_2}Food/drink sales +STR_1906 :{WINDOW_COLOUR_2}Food/drink stock +STR_1907 :{WINDOW_COLOUR_2}Staff wages +STR_1908 :{WINDOW_COLOUR_2}Marketing +STR_1909 :{WINDOW_COLOUR_2}Research +STR_1910 :{WINDOW_COLOUR_2}Loan interest +STR_1911 :{BLACK} at {COMMA16}% per year +STR_1912 :{MONTH} +STR_1913 :{BLACK}+{CURRENCY2DP} +STR_1914 :{BLACK}{CURRENCY2DP} +STR_1915 :{RED}{CURRENCY2DP} +STR_1916 :{WINDOW_COLOUR_2}Loan: +STR_1917 :{POP16}{POP16}{POP16}{CURRENCY} +STR_1918 :Can't borrow any more money! +STR_1919 :Not enough cash available! +STR_1920 :Can't pay back loan! +STR_1921 :{SMALLFONT}{BLACK}Start a new game +STR_1922 :{SMALLFONT}{BLACK}Continue playing a saved game +STR_1923 :{SMALLFONT}{BLACK}Show tutorial +STR_1924 :{SMALLFONT}{BLACK}Exit +STR_1925 :Can't place person here... +STR_1926 :{SMALLFONT} +STR_1927 :{YELLOW}{STRINGID} has broken down +STR_1928 :{RED}{STRINGID} has crashed! +STR_1929 :{RED}{STRINGID} still hasn't been fixed{NEWLINE}Check where your mechanics are and consider organizing them better +STR_1930 :{SMALLFONT}{BLACK}Turn on/off tracking information for this guest - (If tracking is on, guest's movements will be reported in the message area) +STR_1931 :{STRINGID} has joined the queue line for {STRINGID} +STR_1932 :{STRINGID} is on {STRINGID} +STR_1933 :{STRINGID} is in {STRINGID} +STR_1934 :{STRINGID} has left {STRINGID} +STR_1935 :{STRINGID} has left the park +STR_1936 :{STRINGID} has bought {STRINGID} +STR_1937 :{SMALLFONT}{BLACK}Show information about the subject of this message +STR_1938 :{SMALLFONT}{BLACK}Show view of guest +STR_1939 :{SMALLFONT}{BLACK}Show view of staff member +STR_1940 :{SMALLFONT}{BLACK}Show happiness, energy, hunger etc. for this guest +STR_1941 :{SMALLFONT}{BLACK}Show which rides this guest has been on +STR_1942 :{SMALLFONT}{BLACK}Show financial information about this guest +STR_1943 :{SMALLFONT}{BLACK}Show guest's recent thoughts +STR_1944 :{SMALLFONT}{BLACK}Show items guest is carrying +STR_1945 :{SMALLFONT}{BLACK}Show orders and options for this staff member +STR_1946 :{SMALLFONT}{BLACK}Select costume for this entertainer +STR_1947 :{SMALLFONT}{BLACK}Show areas patrolled by selected staff type, and locate the nearest staff member +STR_1948 :{SMALLFONT}{BLACK}Hire a new staff member of the selected type +STR_1949 :Financial Summary +STR_1950 :Financial Graph +STR_1951 :Park Value Graph +STR_1952 :Profit Graph +STR_1953 :Marketing +STR_1954 :Research Funding +STR_1955 :{WINDOW_COLOUR_2}Number of circuits: +STR_1956 :{SMALLFONT}{BLACK}Number of circuits of track per ride +STR_1957 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1958 :{COMMA16} +STR_1959 :Can't change number of circuits... +STR_1960 :{WINDOW_COLOUR_2}Balloon price: +STR_1961 :{WINDOW_COLOUR_2}Cuddly Toy price: +STR_1962 :{WINDOW_COLOUR_2}Park Map price: +STR_1963 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_1964 :{WINDOW_COLOUR_2}Umbrella price: +STR_1965 :{WINDOW_COLOUR_2}Drink price: +STR_1966 :{WINDOW_COLOUR_2}Burger price: +STR_1967 :{WINDOW_COLOUR_2}Chips price: +STR_1968 :{WINDOW_COLOUR_2}Ice Cream price: +STR_1969 :{WINDOW_COLOUR_2}Candyfloss price: +STR_1970 :{WINDOW_COLOUR_2} +STR_1971 :{WINDOW_COLOUR_2} +STR_1972 :{WINDOW_COLOUR_2} +STR_1973 :{WINDOW_COLOUR_2}Pizza price: +STR_1974 :{WINDOW_COLOUR_2} +STR_1975 :{WINDOW_COLOUR_2}Popcorn price: +STR_1976 :{WINDOW_COLOUR_2}Hot Dog price: +STR_1977 :{WINDOW_COLOUR_2}Tentacle price: +STR_1978 :{WINDOW_COLOUR_2}Hat price: +STR_1979 :{WINDOW_COLOUR_2}Toffee Apple price: +STR_1980 :{WINDOW_COLOUR_2}T-Shirt price: +STR_1981 :{WINDOW_COLOUR_2}Doughnut price: +STR_1982 :{WINDOW_COLOUR_2}Coffee price: +STR_1983 :{WINDOW_COLOUR_2} +STR_1984 :{WINDOW_COLOUR_2}Fried Chicken price: +STR_1985 :{WINDOW_COLOUR_2}Lemonade price: +STR_1986 :{WINDOW_COLOUR_2} +STR_1987 :{WINDOW_COLOUR_2} +STR_1988 :Balónek +STR_1989 :Plyšová Hračka +STR_1990 :Mapa +STR_1991 :Fotka z atrakce +STR_1992 :Deštník +STR_1993 :Pití +STR_1994 :Burger +STR_1995 :Lupínky +STR_1996 :Zmrzlina +STR_1997 :Cukrová vata +STR_1998 :Prázdná plechovka +STR_1999 :Odpadky +STR_2000 :Prázdná obal od burgeru +STR_2001 :Pizza +STR_2002 :Poukaz +STR_2003 :Popcorn +STR_2004 :Hot Dog +STR_2005 :Tentacle +STR_2006 :Čepice +STR_2007 :Karamelové jablko +STR_2008 :Tričko +STR_2009 :Kobliha +STR_2010 :Káva +STR_2011 :Prázdná kelímek +STR_2012 :Smažené Kuře +STR_2013 :Limonáda +STR_2014 :Prázdná krabička +STR_2015 :Prázdná láhev +STR_2016 :Balónky +STR_2017 :Plyšové hračky +STR_2018 :Mapy +STR_2019 :On-Ride Photos +STR_2020 :Umbrellas +STR_2021 :Drinks +STR_2022 :Burgers +STR_2023 :Chips +STR_2024 :Ice Creams +STR_2025 :Candyfloss +STR_2026 :Empty Cans +STR_2027 :Rubbish +STR_2028 :Empty Burger Boxes +STR_2029 :Pizzas +STR_2030 :Vouchers +STR_2031 :Popcorn +STR_2032 :Hot Dogs +STR_2033 :Tentacles +STR_2034 :Hats +STR_2035 :Toffee Apples +STR_2036 :T-Shirts +STR_2037 :Doughnuts +STR_2038 :Coffees +STR_2039 :Empty Cups +STR_2040 :Fried Chicken +STR_2041 :Lemonade +STR_2042 :Empty Boxes +STR_2043 :Empty Bottles +STR_2044 :a Balloon +STR_2045 :a Cuddly Toy +STR_2046 :a Park Map +STR_2047 :an On-Ride Photo +STR_2048 :an Umbrella +STR_2049 :a Drink +STR_2050 :a Burger +STR_2051 :some Chips +STR_2052 :an Ice Cream +STR_2053 :some Candyfloss +STR_2054 :an Empty Can +STR_2055 :some Rubbish +STR_2056 :an Empty Burger Box +STR_2057 :a Pizza +STR_2058 :a Voucher +STR_2059 :some Popcorn +STR_2060 :a Hot Dog +STR_2061 :a Tentacle +STR_2062 :a Hat +STR_2063 :a Toffee Apple +STR_2064 :a T-Shirt +STR_2065 :a Doughnut +STR_2066 :a Coffee +STR_2067 :an Empty Cup +STR_2068 :some Fried Chicken +STR_2069 :some Lemonade +STR_2070 :an Empty Box +STR_2071 :an Empty Bottle +STR_2072 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Balloon +STR_2073 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Cuddly Toy +STR_2074 :Map of {STRINGID} +STR_2075 :On-Ride Photo of {STRINGID} +STR_2076 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Umbrella +STR_2077 :Drink +STR_2078 :Burger +STR_2079 :Chips +STR_2080 :Ice Cream +STR_2081 :Candyfloss +STR_2082 :Empty Can +STR_2083 :Rubbish +STR_2084 :Empty Burger Box +STR_2085 :Pizza +STR_2086 :Voucher for {STRINGID} +STR_2087 :Popcorn +STR_2088 :Hot Dog +STR_2089 :Tentacle +STR_2090 :{OPENQUOTES}{STRINGID}{ENDQUOTES} Hat +STR_2091 :Toffee Apple +STR_2092 :{OPENQUOTES}{STRINGID}{ENDQUOTES} T-Shirt +STR_2093 :Doughnut +STR_2094 :Coffee +STR_2095 :Empty Cup +STR_2096 :Fried Chicken +STR_2097 :Lemonade +STR_2098 :Empty Box +STR_2099 :Empty Bottle +STR_2100 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2101 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2102 :{WINDOW_COLOUR_2}On-Ride Photo price: +STR_2103 :{WINDOW_COLOUR_2}Pretzel price: +STR_2104 :{WINDOW_COLOUR_2}Hot Chocolate price: +STR_2105 :{WINDOW_COLOUR_2}Iced Tea price: +STR_2106 :{WINDOW_COLOUR_2}Funnel Cake price: +STR_2107 :{WINDOW_COLOUR_2}Sunglasses price: +STR_2108 :{WINDOW_COLOUR_2}Beef Noodles price: +STR_2109 :{WINDOW_COLOUR_2}Fried Rice Noodles price: +STR_2110 :{WINDOW_COLOUR_2}Wonton Soup price: +STR_2111 :{WINDOW_COLOUR_2}Meatball Soup price: +STR_2112 :{WINDOW_COLOUR_2}Fruit Juice price: +STR_2113 :{WINDOW_COLOUR_2}Soybean Milk price: +STR_2114 :{WINDOW_COLOUR_2}Sujongkwa price: +STR_2115 :{WINDOW_COLOUR_2}Sub Sandwich price: +STR_2116 :{WINDOW_COLOUR_2}Cookie price: +STR_2117 :{WINDOW_COLOUR_2} +STR_2118 :{WINDOW_COLOUR_2} +STR_2119 :{WINDOW_COLOUR_2} +STR_2120 :{WINDOW_COLOUR_2}Roast Sausage price: +STR_2121 :{WINDOW_COLOUR_2} +STR_2122 :On-Ride Photo +STR_2123 :On-Ride Photo +STR_2124 :On-Ride Photo +STR_2125 :Pretzel +STR_2126 :Hot Chocolate +STR_2127 :Iced Tea +STR_2128 :Funnel Cake +STR_2129 :Sunglasses +STR_2130 :Beef Noodles +STR_2131 :Fried Rice Noodles +STR_2132 :Wonton Soup +STR_2133 :Meatball Soup +STR_2134 :Fruit Juice +STR_2135 :Soybean Milk +STR_2136 :Sujongkwa +STR_2137 :Sub Sandwich +STR_2138 :Cookie +STR_2139 :Empty Bowl +STR_2140 :Empty Drink Carton +STR_2141 :Empty Juice Cup +STR_2142 :Roast Sausage +STR_2143 :Empty Bowl +STR_2144 :On-Ride Photos +STR_2145 :On-Ride Photos +STR_2146 :On-Ride Photos +STR_2147 :Pretzels +STR_2148 :Hot Chocolates +STR_2149 :Iced Teas +STR_2150 :Funnel Cakes +STR_2151 :Sunglasses +STR_2152 :Beef Noodles +STR_2153 :Fried Rice Noodles +STR_2154 :Wonton Soups +STR_2155 :Meatball Soups +STR_2156 :Fruit Juices +STR_2157 :Soybean Milks +STR_2158 :Sujongkwa +STR_2159 :Sub Sandwiches +STR_2160 :Cookies +STR_2161 :Empty Bowls +STR_2162 :Empty Drink Cartons +STR_2163 :Empty Juice cups +STR_2164 :Roast Sausages +STR_2165 :Empty Bowls +STR_2166 :an On-Ride Photo +STR_2167 :an On-Ride Photo +STR_2168 :an On-Ride Photo +STR_2169 :a Pretzel +STR_2170 :a Hot Chocolate +STR_2171 :an Iced Tea +STR_2172 :a Funnel Cake +STR_2173 :a pair of Sunglasses +STR_2174 :some Beef Noodles +STR_2175 :some Fried Rice Noodles +STR_2176 :some Wonton Soup +STR_2177 :some Meatball Soup +STR_2178 :a Fruit Juice +STR_2179 :some Soybean Milk +STR_2180 :some Sujongkwa +STR_2181 :a Sub Sandwich +STR_2182 :a Cookie +STR_2183 :an Empty Bowl +STR_2184 :an Empty Drink Carton +STR_2185 :an Empty Juice Cup +STR_2186 :a Roast Sausage +STR_2187 :an Empty Bowl +STR_2188 :On-Ride Photo of {STRINGID} +STR_2189 :On-Ride Photo of {STRINGID} +STR_2190 :On-Ride Photo of {STRINGID} +STR_2191 :Pretzel +STR_2192 :Hot Chocolate +STR_2193 :Iced Tea +STR_2194 :Funnel Cake +STR_2195 :Sunglasses +STR_2196 :Beef Noodles +STR_2197 :Fried Rice Noodles +STR_2198 :Wonton Soup +STR_2199 :Meatball Soup +STR_2200 :Fruit Juice +STR_2201 :Soybean Milk +STR_2202 :Sujongkwa +STR_2203 :Sub Sandwich +STR_2204 :Cookie +STR_2205 :Empty Bowl +STR_2206 :Empty Drink Carton +STR_2207 :Empty Juice Cup +STR_2208 :Roast Sausage +STR_2209 :Empty Bowl +STR_2210 :{SMALLFONT}{BLACK}Show list of handymen in park +STR_2211 :{SMALLFONT}{BLACK}Show list of mechanics in park +STR_2212 :{SMALLFONT}{BLACK}Show list of security guards in park +STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park +STR_2214 :Construction not possible while game is paused! +STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) +STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled +STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} +STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} +STR_2221 :{SMALLFONT}{BLACK}Park Rating: {COMMA16} +STR_2222 :{SMALLFONT}{BLACK}{STRINGID} +STR_2223 :{WINDOW_COLOUR_2}Guests in park: {BLACK}{COMMA16} +STR_2224 :{WINDOW_COLOUR_2}Cash: {BLACK}{CURRENCY2DP} +STR_2225 :{WINDOW_COLOUR_2}Cash: {RED}{CURRENCY2DP} +STR_2226 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} +STR_2227 :{WINDOW_COLOUR_2}Company value: {BLACK}{CURRENCY} +STR_2228 :{WINDOW_COLOUR_2}Last month's profit from food/drink and{NEWLINE}merchandise sales: {BLACK}{CURRENCY} +STR_2229 :Slope up to vertical +STR_2230 :Vertical track +STR_2231 :Holding brake for drop +STR_2232 :Cable lift hill +STR_2233 :{SMALLFONT}{BLACK}Park information +STR_2234 :Recent Messages +STR_2235 :{SMALLFONT}{STRINGID} {STRINGID} +STR_2236 :Ledna +STR_2237 :Únorna +STR_2238 :Březena +STR_2239 :Dubna +STR_2240 :Května +STR_2241 :Června +STR_2242 :Červenece +STR_2243 :Srpena +STR_2244 :Září +STR_2245 :Říjena +STR_2246 :Listopadu +STR_2247 :Prosinece +STR_2248 :Can't demolish ride/attraction... +STR_2249 :{BABYBLUE}New ride/attraction now available:{NEWLINE}{STRINGID} +STR_2250 :{BABYBLUE}New scenery/themeing now available:{NEWLINE}{STRINGID} +STR_2251 :Can only be built on paths! +STR_2252 :Can only be built across paths! +STR_2253 :Transport Rides +STR_2254 :Gentle Rides +STR_2255 :Roller Coasters +STR_2256 :Thrill Rides +STR_2257 :Water Rides +STR_2258 :Shops & Stalls +STR_2259 :Scenery & Themeing +STR_2260 :No funding +STR_2261 :Minimum funding +STR_2262 :Normal funding +STR_2263 :Maximum funding +STR_2264 :Research funding +STR_2265 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} per month +STR_2266 :Research priorities +STR_2267 :Currently in development +STR_2268 :Last development +STR_2269 :{WINDOW_COLOUR_2}Type: {BLACK}{STRINGID} +STR_2270 :{WINDOW_COLOUR_2}Progress: {BLACK}{STRINGID} +STR_2271 :{WINDOW_COLOUR_2}Expected: {BLACK}{STRINGID} +STR_2272 :{WINDOW_COLOUR_2}Ride/attraction:{NEWLINE}{BLACK}{STRINGID} +STR_2273 :{WINDOW_COLOUR_2}Scenery/themeing:{NEWLINE}{BLACK}{STRINGID} +STR_2274 :{SMALLFONT}{BLACK}Show details of this invention or development +STR_2275 :{SMALLFONT}{BLACK}Show funding and options for research & development +STR_2276 :{SMALLFONT}{BLACK}Show research & development status +STR_2277 :Unknown +STR_2278 :Transport Ride +STR_2279 :Gentle Ride +STR_2280 :Roller Coaster +STR_2281 :Thrill Ride +STR_2282 :Water Ride +STR_2283 :Shop/Stall +STR_2284 :Scenery/Themeing +STR_2285 :Initial research +STR_2286 :Designing +STR_2287 :Completing design +STR_2288 :Unknown +STR_2289 :{STRINGID} {STRINGID} +STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} +STR_2291 :Select scenario for new game +STR_2292 :{WINDOW_COLOUR_2}Rides been on: +STR_2293 :{BLACK} Nothing +STR_2294 :{SMALLFONT}{BLACK}Change base land style +STR_2295 :{SMALLFONT}{BLACK}Change vertical edges of land +STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} paid to enter park +STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} ride +STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} rides +STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} item of food +STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} items of food +STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drink +STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} drinks +STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenir +STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} spent on {BLACK}{COMMA16} souvenirs +STR_2305 :Track design files +STR_2306 :Save track design +STR_2307 :Select {STRINGID} design +STR_2308 :{STRINGID} Track Designs +STR_2309 :Install New Track Design +STR_2310 :Build custom design +STR_2311 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} (approx.) +STR_2312 :{WINDOW_COLOUR_2}Intensity rating: {BLACK}{COMMA2DP32} (approx.) +STR_2313 :{WINDOW_COLOUR_2}Nausea rating: {BLACK}{COMMA2DP32} (approx.) +STR_2314 :{WINDOW_COLOUR_2}Ride length: {BLACK}{STRINGID} +STR_2315 :{WINDOW_COLOUR_2}Cost: {BLACK}around {CURRENCY} +STR_2316 :{WINDOW_COLOUR_2}Space required: {BLACK}{COMMA16} x {COMMA16} blocks +STR_2317 : +STR_2318 : +STR_2319 : +STR_2320 : +STR_2321 :{WINDOW_COLOUR_2}Number of rides/attractions: {BLACK}{COMMA16} +STR_2322 :{WINDOW_COLOUR_2}Staff: {BLACK}{COMMA16} +STR_2323 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}m{SQUARED} +STR_2324 :{WINDOW_COLOUR_2}Park size: {BLACK}{COMMA32}sq.ft. +STR_2325 :{SMALLFONT}{BLACK}Buy land to extend park +STR_2326 :{SMALLFONT}{BLACK}Buy construction rights to allow construction above or below land outside the park +STR_2327 :Options +STR_2328 :{WINDOW_COLOUR_2}Měna: +STR_2329 :{WINDOW_COLOUR_2}Délka a rychlost: +STR_2330 :{WINDOW_COLOUR_2}Teplota: +STR_2331 :{WINDOW_COLOUR_2}Výškové značky: +STR_2332 :Jednotky +STR_2333 :Sound +STR_2334 :Libry ({POUND}) +STR_2335 :Dolary ($) +STR_2336 :Franky (F) +STR_2337 :Marka (DM) +STR_2338 :Yeny ({YEN}) +STR_2339 :Pesos (Pts) +STR_2340 :Lira (L) +STR_2341 :Guldeny (fl.) +STR_2342 :Koruny (Kč) +STR_2343 :Euroa ({EURO}) +STR_2344 :Imperiální +STR_2345 :Metrické +STR_2346 :Display +STR_2347 :{RED}{STRINGID} has drowned! +STR_2348 :{SMALLFONT}{BLACK}Show statistics for this staff member +STR_2349 :{WINDOW_COLOUR_2}Wages: {BLACK}{CURRENCY} per month +STR_2350 :{WINDOW_COLOUR_2}Employed: {BLACK}{MONTHYEAR} +STR_2351 :{WINDOW_COLOUR_2}Lawns mown: {BLACK}{COMMA16} +STR_2352 :{WINDOW_COLOUR_2}Gardens watered: {BLACK}{COMMA16} +STR_2353 :{WINDOW_COLOUR_2}Litter swept: {BLACK}{COMMA16} +STR_2354 :{WINDOW_COLOUR_2}Bins emptied: {BLACK}{COMMA16} +STR_2355 :{WINDOW_COLOUR_2}Rides fixed: {BLACK}{COMMA16} +STR_2356 :{WINDOW_COLOUR_2}Rides inspected: {BLACK}{COMMA16} +STR_2357 :House +STR_2358 :Units +STR_2359 :Real Values +STR_2360 :{WINDOW_COLOUR_2}Display Resolution: +STR_2361 :Landscape Smoothing +STR_2362 :{SMALLFONT}{BLACK}Toggle landscape tile edge smoothing on/off +STR_2363 :Gridlines on Landscape +STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off +STR_2365 :The bank refuses to increase your loan! +STR_2366 :Celsius ({DEGREE}C) +STR_2367 :Fahrenheit (F) +STR_2368 :None +STR_2369 :Low +STR_2370 :Average +STR_2371 :High +STR_2372 :Low +STR_2373 :Medium +STR_2374 :High +STR_2375 :Very high +STR_2376 :Extreme +STR_2377 :Ultra-Extreme +STR_2378 :{SMALLFONT}{BLACK}Adjust smaller area of land +STR_2379 :{SMALLFONT}{BLACK}Adjust larger area of land +STR_2380 :{SMALLFONT}{BLACK}Adjust smaller area of water +STR_2381 :{SMALLFONT}{BLACK}Adjust larger area of water +STR_2382 :Land +STR_2383 :Water +STR_2384 :{WINDOW_COLOUR_2}Tvůj úkol: +STR_2385 :{BLACK}žádný +STR_2386 :{BLACK}Mít v parku alespoň {COMMA16} hostů na konci {MONTHYEAR}, s hodnocením parku alespoň 600 +STR_2387 :{BLACK}Dosáhnout hodnoty parku alespoň {POP16}{POP16}{CURRENCY} na konci {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} +STR_2388 :{BLACK}Bav se! +STR_2389 :{BLACK}Build the best {STRINGID} you can! +STR_2390 :{BLACK}Mýt v parku 10 druhů kolotoču v provozu, každy s hodnotou zábavnosti alespoň 6.00 +STR_2391 :{BLACK}Mít v parku alespoň {COMMA16} hostů a zároveň nesmíš nikdy nechat hodnocení parku spadnout pod 700! +STR_2392 :{BLACK}Dosáhnout měsíčního příjmu z lístků na atrakce alespoň {POP16}{POP16}{CURRENCY} +STR_2393 :{BLACK}{BLACK}Mýt v parku 10 druhů kolotoču v provozu, každy s hodnotou zábavnosti alespoň 7.00 a délkou alespoň {LENGHT} +STR_2394 :{BLACK}To finish building all 5 of the partially built roller coasters in this park, designing them to achieve excitement ratings of at least {POP16}{POP16}{COMMA2DP32} each +STR_2395 :{BLACK}Vrátit půjčku a dosáhnout hodnoty parku alspoň {POP16}{POP16}{CURRENCY} +STR_2396 :{BLACK}To achieve a monthly profit from food, drink and merchandise sales of at least {POP16}{POP16}{CURRENCY} +STR_2397 :Nic +STR_2398 :Počet hostů v daný čas +STR_2399 :Hodnotu praku v dané datum +STR_2400 :Volná zábava +STR_2401 :Postav nejlepší atrakci co dokážeš +STR_2402 :Postavit 10 kolotočů +STR_2403 :Počet hostů v parku +STR_2404 :Měsíční příjem z +STR_2405 :Postavit 10 drah zadané délky +STR_2406 :Dokončit stavbu 5 kolotočů +STR_2407 :Repay loan and achieve a given park value +STR_2408 :Monthly profit from food/merchandise +STR_2409 :{WINDOW_COLOUR_2}Marketing campaigns in operation +STR_2410 :{BLACK}None +STR_2411 :{WINDOW_COLOUR_2}Marketing campaigns available +STR_2412 :{SMALLFONT}{BLACK}Start this marketing campaign +STR_2413 :{BLACK}({CURRENCY2DP} per week) +STR_2414 :(Not Selected) +STR_2415 :{WINDOW_COLOUR_2}Ride: +STR_2416 :{WINDOW_COLOUR_2}Item: +STR_2417 :{WINDOW_COLOUR_2}Length of time: +STR_2418 :Free entry to {STRINGID} +STR_2419 :Free ride on {STRINGID} +STR_2420 :Half-price entry to {STRINGID} +STR_2421 :Free {STRINGID} +STR_2422 :Advertising campaign for {STRINGID} +STR_2423 :Advertising campaign for {STRINGID} +STR_2424 :{WINDOW_COLOUR_2}Vouchers for free entry to the park +STR_2425 :{WINDOW_COLOUR_2}Vouchers for free rides on a particular ride +STR_2426 :{WINDOW_COLOUR_2}Vouchers for half-price entry to the park +STR_2427 :{WINDOW_COLOUR_2}Vouchers for free food or drink +STR_2428 :{WINDOW_COLOUR_2}Advertising campaign for the park +STR_2429 :{WINDOW_COLOUR_2}Advertising campaign for a particular ride +STR_2430 :{BLACK}Vouchers for free entry to {STRINGID} +STR_2431 :{BLACK}Vouchers for free ride on {STRINGID} +STR_2432 :{BLACK}Vouchers for half-price entry to {STRINGID} +STR_2433 :{BLACK}Vouchers for free {STRINGID} +STR_2434 :{BLACK}Advertising campaign for {STRINGID} +STR_2435 :{BLACK}Advertising campaign for {STRINGID} +STR_2436 :1 week +STR_2437 : +STR_2438 : +STR_2439 : +STR_2440 : +STR_2441 : +STR_2442 : +STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} +STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} +STR_2445 :Start this marketing campaign +STR_2446 :{YELLOW}Your marketing campaign for free entry to the park has finished +STR_2447 :{YELLOW}Your marketing campaign for free rides on {STRINGID} has finished +STR_2448 :{YELLOW}Your marketing campaign for half-price entry to the park has finished +STR_2449 :{YELLOW}Your marketing campaign for free {STRINGID} has finished +STR_2450 :{YELLOW}Your advertising campaign for the park has finished +STR_2451 :{YELLOW}Your advertising campaign for {STRINGID} has finished +STR_2452 :{WINDOW_COLOUR_2}Cash (less loan): {BLACK}{CURRENCY2DP} +STR_2453 :{WINDOW_COLOUR_2}Cash (less loan): {RED}{CURRENCY2DP} +STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} - +STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} - +STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} - +STR_2457 :{SMALLFONT}{BLACK}Show financial accounts +STR_2458 :{SMALLFONT}{BLACK}Show graph of cash (less loan) over time +STR_2459 :{SMALLFONT}{BLACK}Show graph of park value over time +STR_2460 :{SMALLFONT}{BLACK}Show graph of weekly profit +STR_2461 :{SMALLFONT}{BLACK}Show marketing campaigns +STR_2462 :{SMALLFONT}{BLACK}Show view of park entrance +STR_2463 :{SMALLFONT}{BLACK}Show graph of park ratings over time +STR_2464 :{SMALLFONT}{BLACK}Show graph of guest numbers over time +STR_2465 :{SMALLFONT}{BLACK}Show park entrance price and information +STR_2466 :{SMALLFONT}{BLACK}Show park statistics +STR_2467 :{SMALLFONT}{BLACK}Show objectives for this game +STR_2468 :{SMALLFONT}{BLACK}Show recent awards this park has received +STR_2469 :{SMALLFONT}{BLACK}Select level of research & development +STR_2470 :{SMALLFONT}{BLACK}Research new transport rides +STR_2471 :{SMALLFONT}{BLACK}Research new gentle rides +STR_2472 :{SMALLFONT}{BLACK}Research new roller coasters +STR_2473 :{SMALLFONT}{BLACK}Research new thrill rides +STR_2474 :{SMALLFONT}{BLACK}Research new water rides +STR_2475 :{SMALLFONT}{BLACK}Research new shops and stalls +STR_2476 :{SMALLFONT}{BLACK}Research new scenery and themeing +STR_2477 :{SMALLFONT}{BLACK}Select operating mode for this ride/attraction +STR_2478 :{SMALLFONT}{BLACK}Show graph of velocity against time +STR_2479 :{SMALLFONT}{BLACK}Show graph of altitude against time +STR_2480 :{SMALLFONT}{BLACK}Show graph of vertical acceleration against time +STR_2481 :{SMALLFONT}{BLACK}Show graph of lateral acceleration against time +STR_2482 :{SMALLFONT}{BLACK}Profit: {CURRENCY} per week, Park Value: {CURRENCY} +STR_2483 :{WINDOW_COLOUR_2}Weekly profit: {BLACK}+{CURRENCY2DP} +STR_2484 :{WINDOW_COLOUR_2}Weekly profit: {RED}{CURRENCY2DP} +STR_2485 :Controls +STR_2486 :General +STR_2487 :Show 'real' names of guests +STR_2488 :{SMALLFONT}{BLACK}Toggle between showing 'real' names of guests and guest numbers +STR_2489 :Shortcut keys... +STR_2490 :Keyboard shortcuts +STR_2491 :Reset keys +STR_2492 :{SMALLFONT}{BLACK}Set all keyboard shortcuts back to default settings +STR_2493 :Close top-most window +STR_2494 :Close all floating windows +STR_2495 :Cancel construction mode +STR_2496 :Pause game +STR_2497 :Zoom view out +STR_2498 :Zoom view in +STR_2499 :Rotate view clockwise +STR_2500 :Rotate construction object +STR_2501 :Underground view toggle +STR_2502 :Remove base land toggle +STR_2503 :Remove vertical land toggle +STR_2504 :See-through rides toggle +STR_2505 :See-through scenery toggle +STR_2506 :Invisible supports toggle +STR_2507 :Invisible people toggle +STR_2508 :Height marks on land toggle +STR_2509 :Height marks on ride tracks toggle +STR_2510 :Height marks on paths toggle +STR_2511 :Adjust land +STR_2512 :Adjust water +STR_2513 :Build scenery +STR_2514 :Build paths +STR_2515 :Build new ride +STR_2516 :Show financial information +STR_2517 :Show research information +STR_2518 :Show rides list +STR_2519 :Show park information +STR_2520 :Show guest list +STR_2521 :Show staff list +STR_2522 :Show recent messages +STR_2523 :Show map +STR_2524 :Screenshot +### The following need to be reordered to match SDL_keycode layout. +STR_2525 :??? +STR_2526 :??? +STR_2527 :??? +STR_2528 :??? +STR_2529 :??? +STR_2530 :??? +STR_2531 :??? +STR_2532 :??? +STR_2533 :Backspace +STR_2534 :Tab +STR_2535 :??? +STR_2536 :??? +STR_2537 :Clear +STR_2538 :Return +STR_2539 :??? +STR_2540 :??? +STR_2541 :??? +STR_2542 :??? +STR_2543 :Alt/Menu +STR_2544 :Pause +STR_2545 :Caps +STR_2546 :??? +STR_2547 :??? +STR_2548 :??? +STR_2549 :??? +STR_2550 :??? +STR_2551 :??? +STR_2552 :Escape +STR_2553 :??? +STR_2554 :??? +STR_2555 :??? +STR_2556 :??? +STR_2557 :Spacebar +STR_2558 :PgUp +STR_2559 :PgDn +STR_2560 :End +STR_2561 :Home +STR_2562 :Left +STR_2563 :Up +STR_2564 :Right +STR_2565 :Down +STR_2566 :Select +STR_2567 :Print +STR_2568 :Execute +STR_2569 :Snapshot +STR_2570 :Insert +STR_2571 :Delete +STR_2572 :Help +STR_2573 :0 +STR_2574 :1 +STR_2575 :2 +STR_2576 :3 +STR_2577 :4 +STR_2578 :5 +STR_2579 :6 +STR_2580 :7 +STR_2581 :8 +STR_2582 :9 +STR_2583 :??? +STR_2584 :??? +STR_2585 :??? +STR_2586 :??? +STR_2587 :??? +STR_2588 :??? +STR_2589 :??? +STR_2590 :A +STR_2591 :B +STR_2592 :C +STR_2593 :D +STR_2594 :E +STR_2595 :F +STR_2596 :G +STR_2597 :H +STR_2598 :I +STR_2599 :J +STR_2600 :K +STR_2601 :L +STR_2602 :M +STR_2603 :N +STR_2604 :O +STR_2605 :P +STR_2606 :Q +STR_2607 :R +STR_2608 :S +STR_2609 :T +STR_2610 :U +STR_2611 :V +STR_2612 :W +STR_2613 :X +STR_2614 :Y +STR_2615 :Z +STR_2616 :??? +STR_2617 :??? +STR_2618 :Menu +STR_2619 :??? +STR_2620 :??? +STR_2621 :NumPad 0 +STR_2622 :NumPad 1 +STR_2623 :NumPad 2 +STR_2624 :NumPad 3 +STR_2625 :NumPad 4 +STR_2626 :NumPad 5 +STR_2627 :NumPad 6 +STR_2628 :NumPad 7 +STR_2629 :NumPad 8 +STR_2630 :NumPad 9 +STR_2631 :NumPad * +STR_2632 :NumPad + +STR_2633 :??? +STR_2634 :NumPad - +STR_2635 :NumPad . +STR_2636 :NumPad / +STR_2637 :F1 +STR_2638 :F2 +STR_2639 :F3 +STR_2640 :F4 +STR_2641 :F5 +STR_2642 :F6 +STR_2643 :F7 +STR_2644 :F8 +STR_2645 :F9 +STR_2646 :F10 +STR_2647 :F11 +STR_2648 :F12 +STR_2649 :F13 +STR_2650 :F14 +STR_2651 :F15 +STR_2652 :F16 +STR_2653 :F17 +STR_2654 :F18 +STR_2655 :F19 +STR_2656 :F20 +STR_2657 :F21 +STR_2658 :F22 +STR_2659 :F23 +STR_2660 :F24 +STR_2661 :??? +STR_2662 :??? +STR_2663 :??? +STR_2664 :??? +STR_2665 :??? +STR_2666 :??? +STR_2667 :??? +STR_2668 :??? +STR_2669 :NumLock +STR_2670 :Scroll +STR_2671 :??? +STR_2672 :??? +STR_2673 :??? +STR_2674 :??? +STR_2675 :??? +STR_2676 :??? +STR_2677 :??? +STR_2678 :??? +STR_2679 :??? +STR_2680 :All research complete +STR_2681 :{MEDIUMFONT}{BLACK}Increases your money by {CURRENCY} +STR_2682 : +STR_2683 : +STR_2684 :{SMALLFONT}{BLACK}Large group of peeps arrive +STR_2685 :Simplex Noise Parameters +STR_2686 :{WINDOW_COLOUR_2}Low: +STR_2687 :{WINDOW_COLOUR_2}High: +STR_2688 :{WINDOW_COLOUR_2}Base Frequency: +STR_2689 :{WINDOW_COLOUR_2}Octaves: +STR_2690 :Map Generation +STR_2691 :{WINDOW_COLOUR_2}Base height: +STR_2692 :{WINDOW_COLOUR_2}Water level: +STR_2693 :{WINDOW_COLOUR_2}Terrain: +STR_2694 :Generate +STR_2695 :Random terrain +STR_2696 :Place trees +STR_2697 :??? +STR_2698 :??? +STR_2699 :??? +STR_2700 :Autosave frequency: +STR_2701 :Every minute +STR_2702 :Every 5 minutes +STR_2703 :Every 15 minutes +STR_2704 :Every 30 minutes +STR_2705 :Every hour +STR_2706 :Never +STR_2707 :Use system dialog window +STR_2708 :{WINDOW_COLOUR_1}Are you sure you want to overwrite {STRINGID}? +STR_2709 :Overwrite +STR_2710 :Type the name of the file. +STR_2711 :; +STR_2712 := +STR_2713 :, +STR_2714 :- +STR_2715 :. +STR_2716 :/ +STR_2717 :' +STR_2718 :(up) +STR_2719 :(new file) +STR_2720 :{UINT16}sec +STR_2721 :{UINT16}secs +STR_2722 :{UINT16}min:{UINT16}sec +STR_2723 :{UINT16}min:{UINT16}secs +STR_2724 :{UINT16}mins:{UINT16}sec +STR_2725 :{UINT16}mins:{UINT16}secs +STR_2726 :{UINT16}min +STR_2727 :{UINT16}mins +STR_2728 :{UINT16}hour:{UINT16}min +STR_2729 :{UINT16}hour:{UINT16}mins +STR_2730 :{UINT16}hours:{UINT16}min +STR_2731 :{UINT16}hours:{UINT16}mins +STR_2732 :{COMMA16}ft +STR_2733 :{COMMA16}m +STR_2734 :{COMMA16}mph +STR_2735 :{COMMA16}km/h +STR_2736 :{MONTH}, Year {COMMA16} +STR_2737 :{STRINGID} {MONTH}, Year {COMMA16} +STR_2738 :Title screen music: +STR_2739 :None +STR_2740 :RollerCoaster Tycoon 1 +STR_2741 :RollerCoaster Tycoon 2 +STR_2742 :css50.dat not found +STR_2743 :Copy data\css17.dat from your RCT1 installation to data\css50.dat in your RCT2 installation. +STR_2744 :[ +STR_2745 :\ +STR_2746 :] +STR_2747 :{ENDQUOTES} +STR_2748 :Bar +STR_2749 :My new scenario +# New strings used in the cheats window previously these were ??? +STR_2750 :Move all items to top +STR_2751 :Move all items to bottom +STR_2752 :Clear grass +STR_2753 :Mowed grass +STR_2754 :Water plants +STR_2755 :Fix vandalism +STR_2756 :Remove litter +STR_2757 :Force Sun +STR_2758 :Force Thunder +STR_2759 :Zero Clearance +STR_2760 :+{CURRENCY} +STR_2761 : +STR_2762 : +STR_2763 :??? +STR_2764 : +STR_2765 :Large Tram +STR_2766 :Win scenario +STR_2767 :Freeze Climate +STR_2768 :Unfreeze Climate +STR_2769 :Open Park +STR_2770 :Close Park +STR_2771 :Slower Gamespeed +STR_2772 :Faster Gamespeed +STR_2773 :Windowed +STR_2774 :Fullscreen +STR_2775 :Fullscreen (desktop) +STR_2776 :Language: +STR_2777 :{MOVE_X}{SMALLFONT}{STRING} +STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} +STR_2779 :Viewport #{COMMA16} +STR_2780 :Extra viewport +# End of new strings +STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID} +STR_2782 :SHIFT + +STR_2783 :CTRL + +STR_2784 :Change keyboard shortcut +STR_2785 :{WINDOW_COLOUR_2}Press new shortcut key for:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} +STR_2786 :{SMALLFONT}{BLACK}Click on shortcut description to select new key +STR_2787 :{WINDOW_COLOUR_2}Park value: {BLACK}{CURRENCY} +STR_2788 :{WINDOW_COLOUR_2}Congratulations !{NEWLINE}{BLACK}You achieved your objective with a company value of {CURRENCY} ! +STR_2789 :{WINDOW_COLOUR_2}You have failed your objective ! +STR_2790 :Enter name into scenario chart +STR_2791 :Enter name +STR_2792 :Please enter your name for the scenario chart: +STR_2793 :{SMALLFONT}(Completed by {STRINGID}) +STR_2794 :{WINDOW_COLOUR_2}Completed by: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} with a company value of: {BLACK}{CURRENCY} +STR_2795 :Sort +STR_2796 :{SMALLFONT}{BLACK}Sort the ride list into order using the information type displayed +STR_2797 :Scroll view when pointer at screen edge +STR_2798 :{SMALLFONT}{BLACK}Select whether to scroll the view when the mouse pointer is at the screen edge +STR_2799 :{SMALLFONT}{BLACK}View or change control key assignments +STR_2800 :{WINDOW_COLOUR_2}Total admissions: {BLACK}{COMMA32} +STR_2801 :{WINDOW_COLOUR_2}Income from admissions: {BLACK}{CURRENCY2DP} +STR_2802 :Map +STR_2803 :{SMALLFONT}{BLACK}Show these guests highlighted on map +STR_2804 :{SMALLFONT}{BLACK}Show these staff members highlighted on map +STR_2805 :{SMALLFONT}{BLACK}Show map of park +STR_2806 :{RED}Guests are complaining about the disgusting state of the paths in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2807 :{RED}Guests are complaining about the amount of litter in your park{NEWLINE}Check where your handymen are and consider organising them better +STR_2808 :{RED}Guests are complaining about the vandalism in your park{NEWLINE}Check where your security guards are and consider organising them better +STR_2809 :{RED}Guests are hungry and can't find anywhere to buy food +STR_2810 :{RED}Guests are thirsty and can't find anywhere to buy drinks +STR_2811 :{RED}Guests are complaining because they can't find the toilets in your park +STR_2812 :{RED}Guests are getting lost or stuck{NEWLINE}Check whether the layout of your footpaths needs improving to help the guests find their way around +STR_2813 :{RED}Your park entrance fee is too high!{NEWLINE}Reduce your entrance fee or improve the value of the park to attract more guests +STR_2814 :{WINDOW_COLOUR_2}Most untidy park award +STR_2815 :{WINDOW_COLOUR_2}Tidiest park award +STR_2816 :{WINDOW_COLOUR_2}Award for the park with the best roller coasters +STR_2817 :{WINDOW_COLOUR_2}Best value park award +STR_2818 :{WINDOW_COLOUR_2}Most beautiful park award +STR_2819 :{WINDOW_COLOUR_2}Worst value park award +STR_2820 :{WINDOW_COLOUR_2}Safest park award +STR_2821 :{WINDOW_COLOUR_2}Best staff award +STR_2822 :{WINDOW_COLOUR_2}Best park food award +STR_2823 :{WINDOW_COLOUR_2}Worst park food award +STR_2824 :{WINDOW_COLOUR_2}Best park toilets award +STR_2825 :{WINDOW_COLOUR_2}Most disappointing park award +STR_2826 :{WINDOW_COLOUR_2}Best water rides award +STR_2827 :{WINDOW_COLOUR_2}Best custom-designed rides award +STR_2828 :{WINDOW_COLOUR_2}Most dazzling ride colour schemes award +STR_2829 :{WINDOW_COLOUR_2}Most confusing park layout award +STR_2830 :{WINDOW_COLOUR_2}Best gentle ride award +STR_2831 :{TOPAZ}Your park has received an award for being 'The most untidy park in the country'! +STR_2832 :{TOPAZ}Your park has received an award for being 'The tidiest park in the country'! +STR_2833 :{TOPAZ}Your park has received an award for being 'The park with the best roller coasters'! +STR_2834 :{TOPAZ}Your park has received an award for being 'The best value park in the country'! +STR_2835 :{TOPAZ}Your park has received an award for being 'The most beautiful park in the country'! +STR_2836 :{TOPAZ}Your park has received an award for being 'The worst value park in the country'! +STR_2837 :{TOPAZ}Your park has received an award for being 'The safest park in the country'! +STR_2838 :{TOPAZ}Your park has received an award for being 'The park with the best staff'! +STR_2839 :{TOPAZ}Your park has received an award for being 'The park with the best food in the country'! +STR_2840 :{TOPAZ}Your park has received an award for being 'The park with the worst food in the country'! +STR_2841 :{TOPAZ}Your park has received an award for being 'The park with the best toilet facilities in the country'! +STR_2842 :{TOPAZ}Your park has received an award for being 'The most disappointing park in the country'! +STR_2843 :{TOPAZ}Your park has received an award for being 'The park with the best water rides in the country'! +STR_2844 :{TOPAZ}Your park has received an award for being 'The park with the best custom-designed rides'! +STR_2845 :{TOPAZ}Your park has received an award for being 'The park with the most dazzling choice of colour schemes'! +STR_2846 :{TOPAZ}Your park has received an award for being 'The park with the most confusing layout'! +STR_2847 :{TOPAZ}Your park has received an award for being 'The park with the best gentle rides'! +STR_2848 :{WINDOW_COLOUR_2}No recent awards +STR_2849 :New scenario installed successfully +STR_2850 :New track design installed successfully +STR_2851 :Scenario already installed +STR_2852 :Track design already installed +STR_2853 :Forbidden by the local authority! +STR_2854 :{RED}Guests can't get to the entrance of {STRINGID} !{NEWLINE}Construct a path to the entrance +STR_2855 :{RED}{STRINGID} has no path leading from its exit !{NEWLINE}Construct a path from the ride exit +STR_2856 :{WINDOW_COLOUR_2}Tutorial +STR_2857 :{WINDOW_COLOUR_2}(Press a key or mouse button to take control) +STR_2858 :Can't start marketing campaign... +STR_2859 :Another instance of OpenRCT2 is already running +STR_2860 :Infogrames Interactive credits... +STR_2861 :{WINDOW_COLOUR_2}Licensed to Infogrames Interactive Inc. +STR_2862 :Music acknowledgements... +STR_2863 :Music acknowledgements +STR_2864 :{WINDOW_COLOUR_2}March - Children of the Regiment: (Fucik) non copyright +STR_2865 :{WINDOW_COLOUR_2}Heyken's Serenade: (J.Heyken) British Standard Music Coy; GEMA, BRITICO +STR_2866 :{WINDOW_COLOUR_2}In Continental Mood: (Composer unknown) Copyright Control +STR_2867 :{WINDOW_COLOUR_2}Wedding Journey: (Traditional) +STR_2868 :{WINDOW_COLOUR_2}Tales from the Vienna Woods: (Johann Strauss) non copyright +STR_2869 :{WINDOW_COLOUR_2}Slavonic Dance: (Traditional) +STR_2870 :{WINDOW_COLOUR_2}Das Alpenhorn: (Traditional) +STR_2871 :{WINDOW_COLOUR_2}The Blond Sailor: (Traditional) +STR_2872 :{WINDOW_COLOUR_2}Overture - Poet and Peasant: (Suppe) non copyright +STR_2873 :{WINDOW_COLOUR_2}Waltz Medley: (Johann Strauss) non copyright +STR_2874 :{WINDOW_COLOUR_2}Bella Bella Bimba: (Traditional) +STR_2875 :{WINDOW_COLOUR_2}Original recordings (P) 1976 C.J.Mears Organization, used with consent +STR_2876 :{WINDOW_COLOUR_2}RollerCoaster Tycoon 2 Title Music: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2877 :{WINDOW_COLOUR_2}Dodgems Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2878 :{WINDOW_COLOUR_2}Mid Summer's Heat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2879 :{WINDOW_COLOUR_2}Pharaoh's Tomb: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2880 :{WINDOW_COLOUR_2}Caesar's March: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2881 :{WINDOW_COLOUR_2}Drifting To Heaven: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2882 :{WINDOW_COLOUR_2}Invaders: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2883 :{WINDOW_COLOUR_2}Eternal Toybox: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2884 :{WINDOW_COLOUR_2}Jungle Juice: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2885 :{WINDOW_COLOUR_2}Ninja's Noodles: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2886 :{WINDOW_COLOUR_2}Voyage to Andromeda: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2887 :{WINDOW_COLOUR_2}Brimble's Beat: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2888 :{WINDOW_COLOUR_2}Atlantis: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2889 :{WINDOW_COLOUR_2}Wild West Kid: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2890 :{WINDOW_COLOUR_2}Vampire's Lair: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2891 :{WINDOW_COLOUR_2}Blockbuster: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2892 :{WINDOW_COLOUR_2}Airtime Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2893 :{WINDOW_COLOUR_2}Searchlight Rag: (Scott Joplin/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2894 :{WINDOW_COLOUR_2}Flight of Fantasy: (Steve Blenkinsopp) copyright {COPYRIGHT} Chris Sawyer +STR_2895 :{WINDOW_COLOUR_2}Big Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2896 :{WINDOW_COLOUR_2}Hypothermia: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2897 :{WINDOW_COLOUR_2}Last Sleigh Ride: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2898 :{WINDOW_COLOUR_2}Pipes of Glencairn: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2899 :{WINDOW_COLOUR_2}Traffic Jam: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2900 :{WINDOW_COLOUR_2} +STR_2901 :{WINDOW_COLOUR_2}(Samples courtesy of Spectrasonics {ENDQUOTES}Liquid Grooves{ENDQUOTES}) +STR_2902 :{WINDOW_COLOUR_2}Toccata: (C.M.Widor, played by Peter James Adcock) recording {COPYRIGHT} Chris Sawyer +STR_2903 :{WINDOW_COLOUR_2}Space Rock: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2904 :{WINDOW_COLOUR_2}Manic Mechanic: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2905 :{WINDOW_COLOUR_2}Techno Torture: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2906 :{WINDOW_COLOUR_2}Sweat Dreams: (Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2907 :{WINDOW_COLOUR_2}What shall we do with the Drunken Sailor: (Anon/Allister Brimble) copyright {COPYRIGHT} Chris Sawyer +STR_2908 :{WINDOW_COLOUR_2}Infogrames Interactive +STR_2909 :{WINDOW_COLOUR_2}Senior Producer: Thomas J. Zahorik +STR_2910 :{WINDOW_COLOUR_2}Executive Producer: Bill Levay +STR_2911 :{WINDOW_COLOUR_2}Senior Marketing Product Manager: Scott Triola +STR_2912 :{WINDOW_COLOUR_2}V.P. of Product Development: Scott Walker +STR_2913 :{WINDOW_COLOUR_2}General Manager: John Hurlbut +STR_2914 :{WINDOW_COLOUR_2}Director of Quality Assurance: Michael Craighead +STR_2915 :{WINDOW_COLOUR_2}Q.A. Certification Manager: Kurt Boutin +STR_2916 :{WINDOW_COLOUR_2}Q.A. Certification Lead: Mark Huggins +STR_2917 :{WINDOW_COLOUR_2}Testers: Dena Irene Fitzgerald, Scott Rollins, Christopher McPhail +STR_2918 :{WINDOW_COLOUR_2}Clif McClure, Erik Maramaldi, Erik Jeffery +STR_2919 :{WINDOW_COLOUR_2}Director of Marketing: Ann Marie Bland +STR_2920 :{WINDOW_COLOUR_2}Manager of Creative Services: Steve Martin +STR_2921 :{WINDOW_COLOUR_2}Manager of Editorial & Documentation Services: Elizabeth Mackney +STR_2922 :{WINDOW_COLOUR_2}Graphic Designer: Paul Anselmi +STR_2923 :{WINDOW_COLOUR_2}Copywriter: Kurt Carlson +STR_2924 :{WINDOW_COLOUR_2}Special Thanks to: Peter Matiss +STR_2925 :{WINDOW_COLOUR_2}Engineering Specialist: Ken Edwards +STR_2926 :{WINDOW_COLOUR_2}Engineering Services Manager: Luis Rivas +STR_2927 :{WINDOW_COLOUR_2}Lead Compatibility Analyst: Geoffrey Smith +STR_2928 :{WINDOW_COLOUR_2}Compatibility Analysts: Jason Cordero, Burke McQuinn, Kim Jardin +STR_2929 :{WINDOW_COLOUR_2}Lead Tester: Daniel Frisoli +STR_2930 :{WINDOW_COLOUR_2}Senior Tester: Matt Pantaleoni +STR_2931 :{WINDOW_COLOUR_2} +STR_2932 :{WINDOW_COLOUR_2} +STR_2933 :{WINDOW_COLOUR_2} +STR_2934 :{WINDOW_COLOUR_2} +STR_2935 :{WINDOW_COLOUR_2} +STR_2936 :{WINDOW_COLOUR_2} +STR_2937 :{WINDOW_COLOUR_2} +STR_2938 :{WINDOW_COLOUR_2} +STR_2939 :{WINDOW_COLOUR_2} +STR_2940 :{WINDOW_COLOUR_2} +STR_2941 :{WINDOW_COLOUR_2} +STR_2942 :{WINDOW_COLOUR_2} +STR_2943 :{WINDOW_COLOUR_2} +STR_2944 :{WINDOW_COLOUR_2} +STR_2945 :{WINDOW_COLOUR_2} +STR_2946 :{WINDOW_COLOUR_2} +STR_2947 :{WINDOW_COLOUR_2} +STR_2948 :{WINDOW_COLOUR_2} +STR_2949 :{WINDOW_COLOUR_2} +STR_2950 :{WINDOW_COLOUR_2} +STR_2951 :{WINDOW_COLOUR_2} +STR_2952 :{WINDOW_COLOUR_2} +STR_2953 :{WINDOW_COLOUR_2} +STR_2954 :{WINDOW_COLOUR_2} +STR_2955 :{WINDOW_COLOUR_2} +STR_2956 :{WINDOW_COLOUR_2} +STR_2957 :{WINDOW_COLOUR_2} +STR_2958 :{WINDOW_COLOUR_2} +STR_2959 :{WINDOW_COLOUR_2} +STR_2960 :{WINDOW_COLOUR_2} +STR_2961 :{WINDOW_COLOUR_2} +STR_2962 :{WINDOW_COLOUR_2} +STR_2963 :{WINDOW_COLOUR_2} +STR_2964 :{WINDOW_COLOUR_2} +STR_2965 :{WINDOW_COLOUR_2} +STR_2966 : +STR_2967 : +STR_2968 : +STR_2969 : +STR_2970 : +STR_2971 :Main colour scheme +STR_2972 :Alternative colour scheme 1 +STR_2973 :Alternative colour scheme 2 +STR_2974 :Alternative colour scheme 3 +STR_2975 :{SMALLFONT}{BLACK}Select which colour scheme to change, or paint ride with +STR_2976 :{SMALLFONT}{BLACK}Paint an individual area of this ride using the selected colour scheme +STR_2977 :Staff member name +STR_2978 :Enter new name for this member of staff: +STR_2979 :Can't name staff member... +STR_2980 :Too many banners in game +STR_2981 :{RED}No entry - - +STR_2982 :Banner text +STR_2983 :Enter new text for this banner: +STR_2984 :Can't set new text for banner... +STR_2985 :Banner +STR_2986 :{SMALLFONT}{BLACK}Change text on banner +STR_2987 :{SMALLFONT}{BLACK}Set this banner as a 'no-entry' sign for guests +STR_2988 :{SMALLFONT}{BLACK}Demolish this banner +STR_2989 :{SMALLFONT}{BLACK}Select main colour +STR_2990 :{SMALLFONT}{BLACK}Select text colour +STR_2991 :Sign +STR_2992 :Sign text +STR_2993 :Enter new text for this sign: +STR_2994 :{SMALLFONT}{BLACK}Change text on sign +STR_2995 :{SMALLFONT}{BLACK}Demolish this sign +STR_2996 :{BLACK}ABC +STR_2997 :{GREY}ABC +STR_2998 :{WHITE}ABC +STR_2999 :{RED}ABC +STR_3000 :{GREEN}ABC +STR_3001 :{YELLOW}ABC +STR_3002 :{TOPAZ}ABC +STR_3003 :{CELADON}ABC +STR_3004 :{BABYBLUE}ABC +STR_3005 :{PALELAVENDER}ABC +STR_3006 :{PALEGOLD}ABC +STR_3007 :{LIGHTPINK}ABC +STR_3008 :{PEARLAQUA}ABC +STR_3009 :{PALESILVER}ABC +STR_3010 :Unable to load file... +STR_3011 :File contains invalid data +STR_3012 :Dodgems beat style +STR_3013 :Fairground organ style +STR_3014 :Roman fanfare style +STR_3015 :Oriental style +STR_3016 :Martian style +STR_3017 :Jungle drums style +STR_3018 :Egyptian style +STR_3019 :Toyland style +STR_3020 : +STR_3021 :Space style +STR_3022 :Horror style +STR_3023 :Techno style +STR_3024 :Gentle style +STR_3025 :Summer style +STR_3026 :Water style +STR_3027 :Wild west style +STR_3028 :Jurassic style +STR_3029 :Rock style +STR_3030 :Ragtime style +STR_3031 :Fantasy style +STR_3032 :Rock style 2 +STR_3033 :Ice style +STR_3034 :Snow style +STR_3035 :Custom music 1 +STR_3036 :Custom music 2 +STR_3037 :Medieval style +STR_3038 :Urban style +STR_3039 :Organ style +STR_3040 :Mechanical style +STR_3041 :Modern style +STR_3042 :Pirates style +STR_3043 :Rock style 3 +STR_3044 :Candy style +STR_3045 :{SMALLFONT}{BLACK}Select style of music to play +STR_3046 :This ride cannot be modified +STR_3047 :Local authority forbids demolition or modifications to this ride +STR_3048 :Marketing campaigns forbidden by local authority +STR_3049 :Golf hole A +STR_3050 :Golf hole B +STR_3051 :Golf hole C +STR_3052 :Golf hole D +STR_3053 :Golf hole E +STR_3054 :Loading... +STR_3055 :White +STR_3056 :Translucent +STR_3057 :{WINDOW_COLOUR_2}Construction Marker: +STR_3058 :Brick walls +STR_3059 :Hedges +STR_3060 :Ice blocks +STR_3061 :Wooden fences +STR_3062 :{SMALLFONT}{BLACK}Standard roller coaster track +STR_3063 :{SMALLFONT}{BLACK}Water channel (track submerged) +STR_3064 :Beginner Parks +STR_3065 :Challenging Parks +STR_3066 :Expert Parks +STR_3067 :{OPENQUOTES}Real{ENDQUOTES} Parks +STR_3068 :Other Parks +STR_3069 :Top Section +STR_3070 :Slope to Level +STR_3071 :{WINDOW_COLOUR_2}Same price throughout park +STR_3072 :{SMALLFONT}{BLACK}Select whether this price is used throughout the entire park +STR_3073 :{RED}WARNING: Your park rating has dropped below 700 !{NEWLINE}If you haven't raised the park rating in 4 weeks, your park will be closed down +STR_3074 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have 3 weeks to raise the park rating +STR_3075 :{RED}WARNING: Your park rating is still below 700 !{NEWLINE}You have only 2 weeks to raise the park rating, or your park will be closed down +STR_3076 :{RED}FINAL WARNING: Your park rating is still below 700 !{NEWLINE}In just 7 days your park will be closed down unless you can raise the rating +STR_3077 :{RED}CLOSURE NOTICE: Your park has been closed down ! +STR_3078 :Plain entrance +STR_3079 :Wooden entrance +STR_3080 :Canvas tent entrance +STR_3081 :Castle entrance (grey) +STR_3082 :Castle entrance (brown) +STR_3083 :Jungle entrance +STR_3084 :Log cabin entrance +STR_3085 :Classical/Roman entrance +STR_3086 :Abstract entrance +STR_3087 :Snow/Ice entrance +STR_3088 :Pagoda entrance +STR_3089 :Space entrance +STR_3090 :{SMALLFONT}{BLACK}Select style of entrance, exit, and station +STR_3091 :You are not allowed to remove this section! +STR_3092 :You are not allowed to move or modify the station for this ride! +STR_3093 :{WINDOW_COLOUR_2}Favourite: {BLACK}{STRINGID} +STR_3094 :N/A +STR_3095 :{WINDOW_COLOUR_2}Lift hill chain speed: +STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_3097 :{SMALLFONT}{BLACK}Select lift hill chain speed +STR_3098 :Can't change lift hill speed... +STR_3099 :{SMALLFONT}{BLACK}Select colour +STR_3100 :{SMALLFONT}{BLACK}Select second colour +STR_3101 :{SMALLFONT}{BLACK}Select third colour +STR_3102 :{SMALLFONT}{BLACK}Re-paint coloured scenery on landscape +STR_3103 :Can't re-paint this... +STR_3104 :{SMALLFONT}{BLACK}List rides +STR_3105 :{SMALLFONT}{BLACK}List shops and stalls +STR_3106 :{SMALLFONT}{BLACK}List information kiosks and other guest facilities +STR_3107 :Close +STR_3108 :Test +STR_3109 :Open +STR_3110 :{WINDOW_COLOUR_2}Block Sections: {BLACK}{COMMA16} +STR_3111 :{SMALLFONT}{BLACK}Click on design to build it +STR_3112 :{SMALLFONT}{BLACK}Click on design to rename or delete it +STR_3113 :Select a different design +STR_3114 :{SMALLFONT}{BLACK}Go back to design selection window +STR_3115 :{SMALLFONT}{BLACK}Save track design +STR_3116 :{SMALLFONT}{BLACK}Save track design (Not possible until ride has been tested and statistics have been generated) +STR_3117 :{BLACK}Calling mechanic... +STR_3118 :{BLACK}{STRINGID} is heading for the ride +STR_3119 :{BLACK}{STRINGID} is fixing the ride +STR_3120 :{SMALLFONT}{BLACK}Locate nearest available mechanic, or mechanic fixing ride +STR_3121 :Unable to locate mechanic, or all nearby mechanics are busy +STR_3122 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guest +STR_3123 :{WINDOW_COLOUR_2}Favourite ride of: {BLACK}{COMMA16} guests +STR_3124 :Broken {STRINGID} +STR_3125 :{WINDOW_COLOUR_2}Excitement Factor: {BLACK}+{COMMA16}% +STR_3126 :{WINDOW_COLOUR_2}Intensity Factor: {BLACK}+{COMMA16}% +STR_3127 :{WINDOW_COLOUR_2}Nausea Factor: {BLACK}+{COMMA16}% +STR_3128 :Save Track Design +STR_3129 :Save Track Design with Scenery +STR_3130 :Save +STR_3131 :Cancel +STR_3132 :{BLACK}Click items of scenery to select them to be saved with track design... +STR_3133 :Unable to build this on a slope +STR_3134 :{RED}(Design includes scenery which is unavailable) +STR_3135 :{RED}(Vehicle design unavailable - Ride performance may be affected) +STR_3136 :Warning: This design will be built with an alternative vehicle type and may not perform as expected +STR_3137 :Select Nearby Scenery +STR_3138 :Reset Selection +STR_3139 :Cable lift unable to work in this operating mode +STR_3140 :Cable lift hill must start immediately after station +STR_3141 :Multi-circuit per ride not possible with cable lift hill +STR_3142 :{WINDOW_COLOUR_2}Capacity: {BLACK}{STRINGID} +STR_3143 :{SMALLFONT}{BLACK}Show people on map +STR_3144 :{SMALLFONT}{BLACK}Show rides and stalls on map +STR_3145 :{SMALLFONT}{BLACK}Scroll {STRINGID} left +STR_3146 :{SMALLFONT}{BLACK}Scroll {STRINGID} right +STR_3147 :{SMALLFONT}{BLACK}Scroll {STRINGID} left fast +STR_3148 :{SMALLFONT}{BLACK}Scroll {STRINGID} right fast +STR_3149 :{SMALLFONT}{BLACK}Scroll {STRINGID} left/right +STR_3150 :{SMALLFONT}{BLACK}Scroll {STRINGID} up +STR_3151 :{SMALLFONT}{BLACK}Scroll {STRINGID} down +STR_3152 :{SMALLFONT}{BLACK}Scroll {STRINGID} up fast +STR_3153 :{SMALLFONT}{BLACK}Scroll {STRINGID} down fast +STR_3154 :{SMALLFONT}{BLACK}Scroll {STRINGID} up/down +STR_3155 : +STR_3156 : +STR_3157 :map +STR_3158 :graph +STR_3159 :list +STR_3160 : +STR_3161 : +STR_3162 :Unable to allocate enough memory +STR_3163 :Installing new data: +STR_3164 :{BLACK}{COMMA16} selected (maximum {COMMA16}) +STR_3165 : +STR_3166 :{BLACK}(ID: +STR_3167 :{WINDOW_COLOUR_2}Includes: {BLACK}{COMMA16} objects +STR_3168 :{WINDOW_COLOUR_2}Text: {BLACK}{STRINGID} +STR_3169 :Data for the following object not found: +STR_3170 :Not enough space for graphics +STR_3171 :Too many objects of this type selected +STR_3172 :The following object must be selected first: {STRING} +STR_3173 :This object is currently in use +STR_3174 :This object is required by another object +STR_3175 :This object is always required +STR_3176 :Unable to select this object +STR_3177 :Unable to de-select this object +STR_3178 :At least one path object must be selected +STR_3179 :At least one ride vehicle/attraction object must be selected +STR_3180 :Invalid selection of objects +STR_3181 :Object Selection - {STRINGID} +STR_3182 :Park entrance type must be selected +STR_3183 :Water type must be selected +STR_3184 :Ride Vehicles/Attractions +STR_3185 :Small Scenery +STR_3186 :Large Scenery +STR_3187 :Walls/Fences +STR_3188 :Path Signs +STR_3189 :Footpaths +STR_3190 :Path Extras +STR_3191 :Scenery Groups +STR_3192 :Park Entrance +STR_3193 :Water +STR_3194 :Scenario Description +STR_3195 :Invention List +STR_3196 :{WINDOW_COLOUR_2}Research Group: {BLACK}{STRINGID} +STR_3197 :{WINDOW_COLOUR_2}Items pre-invented at start of game: +STR_3198 :{WINDOW_COLOUR_2}Items to invent during game: +STR_3199 :Random Shuffle +STR_3200 :{SMALLFONT}{BLACK}Randomly shuffle the list of items to invent during the game +STR_3201 :Object Selection +STR_3202 :Landscape Editor +STR_3203 :Invention List Set Up +STR_3204 :Options Selection +STR_3205 :Objective Selection +STR_3206 :Save Scenario +STR_3207 :Roller Coaster Designer +STR_3208 :Track Designs Manager +STR_3209 :Back to Previous Step: +STR_3210 :Forward to Next Step: +STR_3211 :{WINDOW_COLOUR_2}Map size: +STR_3212 :{POP16}{COMMA16} x {PUSH16}{COMMA16} +STR_3213 :Can't decrease map size any further +STR_3214 :Can't increase map size any further +STR_3215 :Too close to edge of map +STR_3216 :{SMALLFONT}{BLACK}Select park-owned land etc. +STR_3217 :Land Owned +STR_3218 :Construction Rights Owned +STR_3219 :Land For Sale +STR_3220 :Construction Rights For Sale +STR_3221 :{SMALLFONT}{BLACK}Set land to be owned by the park +STR_3222 :{SMALLFONT}{BLACK}Set construction rights only to be owned by the park +STR_3223 :{SMALLFONT}{BLACK}Set land to be available to purchase by the park +STR_3224 :{SMALLFONT}{BLACK}Set construction rights to be available to purchase by the park +STR_3225 :{SMALLFONT}{BLACK}Toggle on/off building a random cluster of objects around the selected position +STR_3226 :{SMALLFONT}{BLACK}Build park entrance +STR_3227 :Too many park entrances! +STR_3228 :{SMALLFONT}{BLACK}Set starting positions for people +STR_3229 :Block Brakes cannot be used directly after station +STR_3230 :Block Brakes cannot be used directly after each other +STR_3231 :Block Brakes cannot be used directly after the top of this lift hill +STR_3232 :Options - Financial +STR_3233 :Options - Guests +STR_3234 :Options - Park +STR_3235 :{SMALLFONT}{BLACK}Show financial options +STR_3236 :{SMALLFONT}{BLACK}Show guest options +STR_3237 :{SMALLFONT}{BLACK}Show park options +STR_3238 :No Money +STR_3239 :{SMALLFONT}{BLACK}Make this park a 'no money' park with no financial restrictions +STR_3240 :{WINDOW_COLOUR_2}Initial cash: +STR_3241 :{WINDOW_COLOUR_2}Initial loan: +STR_3242 :{WINDOW_COLOUR_2}Maximum loan size: +STR_3243 :{WINDOW_COLOUR_2}Annual interest rate: +STR_3244 :Forbid marketing campaigns +STR_3245 :{SMALLFONT}{BLACK}Forbid advertising, promotional schemes, and other marketing campaigns +STR_3246 :{WINDOW_COLOUR_2}{CURRENCY} +STR_3247 :{WINDOW_COLOUR_2}{COMMA16}% +STR_3248 :Can't increase initial cash any further! +STR_3249 :Can't reduce initial cash any further! +STR_3250 :Can't increase initial loan any further! +STR_3251 :Can't reduce initial loan any further! +STR_3252 :Can't increase maximum loan size any further! +STR_3253 :Can't reduce maximum loan size any further! +STR_3254 :Can't increase interest rate any further! +STR_3255 :Can't reduce interest rate any further! +STR_3256 :Guests prefer less intense rides +STR_3257 :{SMALLFONT}{BLACK}Select whether guests should generally prefer less intense rides only +STR_3258 :Guests prefer more intense rides +STR_3259 :{SMALLFONT}{BLACK}Select whether guests should generally prefer more intense rides only +STR_3260 :{WINDOW_COLOUR_2}Cash per guest (average): +STR_3261 :{WINDOW_COLOUR_2}Guests initial happiness: +STR_3262 :{WINDOW_COLOUR_2}Guests initial hunger: +STR_3263 :{WINDOW_COLOUR_2}Guests initial thirst: +STR_3264 :Can't increase this any further! +STR_3265 :Can't reduce this any further! +STR_3266 :{SMALLFONT}{BLACK}Select how this park charges for entrance and rides +STR_3267 :Forbid tree removal +STR_3268 :{SMALLFONT}{BLACK}Forbid tall trees being removed +STR_3269 :Forbid landscape changes +STR_3270 :{SMALLFONT}{BLACK}Forbid any changes to the landscape +STR_3271 :Forbid high construction +STR_3272 :{SMALLFONT}{BLACK}Forbid any tall construction +STR_3273 :Park rating higher difficult level +STR_3274 :{SMALLFONT}{BLACK}Make the park rating value more challenging +STR_3275 :Guest generation higher difficult level +STR_3276 :{SMALLFONT}{BLACK}Make it more difficult to attract guests to the park +STR_3277 :{WINDOW_COLOUR_2}Cost to buy land: +STR_3278 :{WINDOW_COLOUR_2}Cost to buy construction rights: +STR_3279 :Free park entry / Pay per ride +STR_3280 :Pay to enter park / Free rides +STR_3281 :{WINDOW_COLOUR_2}Entry price: +STR_3282 :{SMALLFONT}{BLACK}Select objective and park name +STR_3283 :{SMALLFONT}{BLACK}Select rides to be preserved +STR_3284 :Objective Selection +STR_3285 :Preserved Rides +STR_3286 :{SMALLFONT}{BLACK}Select objective for this scenario +STR_3287 :{WINDOW_COLOUR_2}Objective: +STR_3288 :{SMALLFONT}{BLACK}Select climate +STR_3289 :{WINDOW_COLOUR_2}Climate: +STR_3290 :Cool and wet +STR_3291 :Warm +STR_3292 :Hot and dry +STR_3293 :Cold +STR_3294 :Change... +STR_3295 :{SMALLFONT}{BLACK}Change name of park +STR_3296 :{SMALLFONT}{BLACK}Change name of scenario +STR_3297 :{SMALLFONT}{BLACK}Change detail notes about park / scenario +STR_3298 :{WINDOW_COLOUR_2}Park Name: {BLACK}{STRINGID} +STR_3299 :{WINDOW_COLOUR_2}Park/Scenario Details: +STR_3300 :{WINDOW_COLOUR_2}Scenario Name: {BLACK}{STRINGID} +STR_3301 :{WINDOW_COLOUR_2}Objective Date: +STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR} +STR_3303 :{WINDOW_COLOUR_2}Number of guests: +STR_3304 :{WINDOW_COLOUR_2}Park value: +STR_3305 :{WINDOW_COLOUR_2}Monthly income: +STR_3306 :{WINDOW_COLOUR_2}Monthly profit: +STR_3307 :{WINDOW_COLOUR_2}Minimum length: +STR_3308 :{WINDOW_COLOUR_2}Excitement rating: +STR_3309 :{WINDOW_COLOUR_2}{COMMA16} +STR_3310 :{WINDOW_COLOUR_2}{LENGTH} +STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32} +STR_3312 :{WINDOW_COLOUR_2}Rides/attractions under a preservation order: +STR_3313 :Scenario Name +STR_3314 :Enter name for scenario: +STR_3315 :Park/Scenario Details +STR_3316 :Enter description of this scenario: +STR_3317 :No details yet +STR_3318 :{SMALLFONT}{BLACK}Select which group this scenario appears in +STR_3319 :{WINDOW_COLOUR_2}Scenario Group: +STR_3320 :Unable to save scenario file... +STR_3321 :New objects installed successfully +STR_3322 :{WINDOW_COLOUR_2}Objective: {BLACK}{STRINGID} +STR_3323 :Missing object data, ID: +STR_3324 :Requires Add-On Pack: +STR_3325 :Requires an Add-On Pack +STR_3326 :{WINDOW_COLOUR_2}(no image) +STR_3327 :Starting positions for people not set +STR_3328 :Can't advance to next editor stage... +STR_3329 :Park entrance not yet built +STR_3330 :Park must own some land +STR_3331 :Path from park entrance to map edge either not complete or too complex - Path must be single-width with as few junctions and corners as possible +STR_3332 :Park entrance is the wrong way round or has no path leading to the map edge +STR_3333 :Export plug-in objects with saved games +STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data +STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles +STR_3336 :Track Designs Manager - Select Ride Type +STR_3337 : +STR_3338 :{BLACK}Custom-designed layout +STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout +STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout +STR_3341 :{SMALLFONT}{BLACK}Game tools +STR_3342 :Scenario Editor +STR_3343 :Convert Saved Game to Scenario +STR_3344 :Roller Coaster Designer +STR_3345 :Track Designs Manager +STR_3346 :Can't save track design... +STR_3347 :Ride is too large, contains too many elements, or scenery is too spread out +STR_3348 :Rename +STR_3349 :Delete +STR_3350 :Track design name +STR_3351 :Enter new name for this track design: +STR_3352 :Can't rename track design... +STR_3353 :New name contains invalid characters +STR_3354 :Another file exists with this name, or file is write-protected +STR_3355 :File is write-protected or locked +STR_3356 :Delete File +STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ? +STR_3358 :Can't delete track design... +STR_3359 :{BLACK}No track designs of this type +STR_3360 :Warning! +STR_3361 :Too many track designs of this type - Some will not be listed. +STR_3362 : +STR_3363 : +STR_3364 :Advanced +STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups +STR_3366 :{BLACK}= Ride +STR_3367 :{BLACK}= Food Stall +STR_3368 :{BLACK}= Drink Stall +STR_3369 :{BLACK}= Souvenir Stall +STR_3370 :{BLACK}= Info. Kiosk +STR_3371 :{BLACK}= First Aid +STR_3372 :{BLACK}= Cash Machine +STR_3373 :{BLACK}= Toilet +STR_3374 :Warning: Too many objects selected! +STR_3375 :Not all objects in this scenery group could be selected +STR_3376 :Install new track design... +STR_3377 :{SMALLFONT}{BLACK}Install a new track design file +STR_3378 :Install +STR_3379 :Cancel +STR_3380 :Unable to install this track design... +STR_3381 :File is not compatible or contains invalid data +STR_3382 :File copy failed +STR_3383 :Select new name for track design +STR_3384 :An existing track design already has this name - Please select a new name for this design: +STR_3385 :Beginners Tutorial +STR_3386 :Custom Rides Tutorial +STR_3387 :Roller Coaster Building Tutorial +STR_3388 :Unable to switch to selected mode +STR_3389 :Unable to select additional item of scenery... +STR_3390 :Too many items selected +# Start of tutorial strings. Not used at the moment, so not necessary to translate. +STR_3391 :{SMALLFONT}{BLACK}Here is our park - Let's have a quick look around... +STR_3392 :{SMALLFONT}{BLACK}Holding down the RIGHT mouse button and moving the mouse is the quickest way to move the view... +STR_3393 :{SMALLFONT}{BLACK}To view more of the park, you can zoom the view out using the icon at the top of the screen... +STR_3394 :{SMALLFONT}{BLACK}You can also rotate the view in 90 degree steps... +STR_3395 :{SMALLFONT}{BLACK}Building anything at this scale is a bit difficult, so let's zoom the view back in again... +STR_3396 :{SMALLFONT}{BLACK}Let's build a simple ride to get the park started... +STR_3397 :{SMALLFONT}{BLACK}The white 'ghost' image shows where the ride will be built. We'll move the pointer to select the position then click to build it... +STR_3398 :{SMALLFONT}{BLACK}Rides need an entrance and an exit. We'll move the pointer to a square on the edge of the ride and then click to build first the entrance and then the exit... +STR_3399 :{SMALLFONT}{BLACK}We need to build footpaths to allow guests to reach our new ride... +STR_3400 :{SMALLFONT}{BLACK}For the path to the ride entrance we'll use a special 'queue line' path... +STR_3401 :{SMALLFONT}{BLACK}For the exit path, just an 'ordinary' path will do... +STR_3402 :{SMALLFONT}{BLACK}Right, lets open the ride! To open the ride we click the flag icon on the ride window and select 'open'... +STR_3403 :{SMALLFONT}{BLACK}But where are the guests? +STR_3404 :{SMALLFONT}{BLACK}Oh - The park is still closed! Right - Let's open it... +STR_3405 :{SMALLFONT}{BLACK}While we're waiting for our first guests, let's build some scenery... +STR_3406 :{SMALLFONT}{BLACK}Here's our empty park. We're going to build a simple custom-designed ride... +STR_3407 :{SMALLFONT}{BLACK}First we need to choose a starting position... +STR_3408 :{SMALLFONT}{BLACK}The section of track we've just built is a 'station platform', to allow guests to get on and off the ride... +STR_3409 :{SMALLFONT}{BLACK}We'll extend the platform a bit by adding a couple more station platform sections... +STR_3410 :{SMALLFONT}{BLACK}The icons at the top of the construction window let you choose different track pieces to add... +STR_3411 :{SMALLFONT}{BLACK}We'll select a left-hand curve... +STR_3412 :{SMALLFONT}{BLACK}The curve hasn't been built yet, but the white ghost image shows where it will be built. Clicking the large 'build this' icon actually builds the track... +STR_3413 :{SMALLFONT}{BLACK}Now we want to build straight track, so we click the straight track icon... +STR_3414 :{SMALLFONT}{BLACK}Now that the circuit is complete, we need to build the ride entrance and exit... +STR_3415 :{SMALLFONT}{BLACK}Let's test our ride to check it works... +STR_3416 :{SMALLFONT}{BLACK}White it's being tested, we'll build the queue line and exit path... +STR_3417 :{SMALLFONT}{BLACK}OK - Let's open the park and the ride... +STR_3418 :{SMALLFONT}{BLACK}Our new ride isn't very exciting - Perhaps we should add some scenery? +STR_3419 :{SMALLFONT}{BLACK}To build scenery above other scenery or in mid-air, hold down the SHIFT key and move the mouse to select the height... +STR_3420 :{SMALLFONT}{BLACK}Some types of scenery can be re-painted after it's built... +STR_3421 :{SMALLFONT}{BLACK}Let's add some music to the ride... +STR_3422 :{SMALLFONT}{BLACK}Let's build a roller coaster ! +STR_3423 :{SMALLFONT}{BLACK}There are loads of pre-designed coasters, but we're going to build our own custom design... +STR_3424 :{SMALLFONT}{BLACK}That's the station platform built. Now we need a lift hill... +STR_3425 :{SMALLFONT}{BLACK}Roller coaster trains aren't powered, so a 'chain lift' is needed to pull the train up the first hill... +STR_3426 :{SMALLFONT}{BLACK}That's the lift hill complete - Now for the first drop... +STR_3427 :{SMALLFONT}{BLACK}Those curves are a bad idea - The riders will be flung to the sides by the lateral G forces as the train hurtles around... +STR_3428 :{SMALLFONT}{BLACK}Banking the curves will improve the ride - Riders will be pushed down into their seats instead of flung to the sides... +STR_3429 :{SMALLFONT}{BLACK}No - That won't work! Look at the height marks - The second hill is taller than the lift hill... +STR_3430 :{SMALLFONT}{BLACK}To ensure the train makes it around, each hill should be slightly smaller than the previous one... +STR_3431 :{SMALLFONT}{BLACK}That's better - Our train should make it up that hill now! Let's try some more twisted track... +STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve and station, so let's add some brakes... +STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow two trains to operate more safely on the circuit... +STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! +STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... +STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customise the ride a bit... +# End of tutorial strings +STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape +STR_3438 :Unable to remove all scenery from here... +STR_3439 :Clear Scenery +STR_3440 :Strana 1 +STR_3441 :Strana 2 +STR_3442 :Strana 3 +STR_3443 :Strana 4 +STR_3444 :Strana 5 +STR_3445 :Set Patrol Area +STR_3446 :Cancel Patrol Area + +# New strings, cleaner +STR_5120 :Finances +STR_5121 :Research +STR_5122 :Select rides by track type (like in RCT1) +STR_5123 :Renew rides +STR_5124 : +STR_5125 :All destructable +STR_5126 :Random title music +STR_5127 :{SMALLFONT}{BLACK}Disable land elevation +STR_5128 :Selection size +STR_5129 :Enter selection size between {COMMA16} and {COMMA16} +STR_5130 :Map size +STR_5131 :Enter map size between {COMMA16} and {COMMA16} +STR_5132 :Fix all rides +STR_5133 :{SMALLFONT}{BLACK}Adjust smaller area of land rights +STR_5134 :{SMALLFONT}{BLACK}Adjust larger area of land rights +STR_5135 :{SMALLFONT}{BLACK}Buy land rights and construction rights +STR_5136 :Land rights +STR_5137 :Allow lift hill and launch speeds{NEWLINE}up to {VELOCITY} +STR_5138 :{SMALLFONT}{WINDOW_COLOUR_2}{STRINGID} +STR_5139 :{WHITE}{STRINGID} +STR_5140 :Disable brakes failure +STR_5141 :Disable all breakdowns +STR_5142 :Normální rychlost +STR_5143 :Quick Speed +STR_5144 :Fast Speed +STR_5145 :Turbo Speed +STR_5146 :Hyper Speed +STR_5147 :Cheats +STR_5148 :{SMALLFONT}{BLACK}Change the game speed +STR_5149 :{SMALLFONT}{BLACK}Show cheat options +STR_5150 :Enable debugging tools +STR_5151 :, +STR_5152 :. +STR_5153 :Edit Themes... +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 +STR_5157 :Unlock all prices +STR_5158 :Quit to menu +STR_5159 :Exit OpenRCT2 +STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, Year {POP16}{COMMA16} +STR_5161 :Date Format: +STR_5162 :Day/Month/Year +STR_5163 :Month/Day/Year +STR_5164 :Twitch Channel name +STR_5165 :Name peeps after followers +STR_5166 :{SMALLFONT}{BLACK}Will name peeps after channel's Twitch followers +STR_5167 :Track follower peeps +STR_5168 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after channel's Twitch followers +STR_5169 :Name peeps after people in Twitch chat +STR_5170 :{SMALLFONT}{BLACK}Will name peeps after people in Twitch chat +STR_5171 :Track chat peeps +STR_5172 :{SMALLFONT}{BLACK}Will turn on tracking information for guests named after Twitch chat participants +STR_5173 :Pull Twitch chat as news +STR_5174 :{SMALLFONT}{BLACK}Will use Twitch chat messages preceded by !news for in game notifications +STR_5175 :Input the name of your Twitch channel +STR_5176 :Enable Twitch integration +STR_5177 :Fullscreen mode: +STR_5178 :{SMALLFONT}{BLACK}Show financial cheats +STR_5179 :{SMALLFONT}{BLACK}Show guest cheats +STR_5180 :{SMALLFONT}{BLACK}Show park cheats +STR_5181 :{SMALLFONT}{BLACK}Show ride cheats +STR_5182 :{INT32} +STR_5183 :Base height +STR_5184 :Enter base height between {COMMA16} and {COMMA16} +STR_5185 :Water level +STR_5186 :Enter water level between {COMMA16} and {COMMA16} +STR_5187 :Finances +STR_5188 :New Campaign +STR_5189 :Výzkum +STR_5190 :Mapa +STR_5191 :Viewport +STR_5192 :Poslední novinky +STR_5193 :Pozemky +STR_5194 :Voda +STR_5195 :Vyčistit scénář +STR_5196 :Pozemková práva +STR_5197 :Scenery +STR_5198 :Cesta +STR_5199 :Ride Construction +STR_5200 :Track Design Place +STR_5201 :New Ride +STR_5202 :Track Design Selection +STR_5203 :Atrakce +STR_5204 :Seznam atrakcí +STR_5205 :Host +STR_5206 :Seznam hostů +STR_5207 :Zaměstnanci +STR_5208 :seznam zaměstnanců +STR_5209 :Banner +STR_5210 :Object Selection +STR_5211 :Invention List +STR_5212 :Scenario Options +STR_5213 :Objective Options +STR_5214 :Map Generation +STR_5215 :Track Design Manager +STR_5216 :Track Design Manager List +STR_5217 :Cheats +STR_5218 :Themes +STR_5219 :Nastavení +STR_5220 :Klávesové zkratky +STR_5221 :Změnit klávesové zkratky +STR_5222 :Načíst/uložit +STR_5223 :Save Prompt +STR_5224 :Demolish Ride Prompt +STR_5225 :Fire Staff Prompt +STR_5226 :Track Delete Prompt +STR_5227 :Save Overwrite Prompt +STR_5228 :{SMALLFONT}{BLACK}Hlavní UI +STR_5229 :{SMALLFONT}{BLACK}Park +STR_5230 :{SMALLFONT}{BLACK}Nástroje +STR_5231 :{SMALLFONT}{BLACK}Rides and Peeps +STR_5232 :{SMALLFONT}{BLACK}Editory +STR_5233 :{SMALLFONT}{BLACK}Ostatní +STR_5234 :{SMALLFONT}{BLACK}Prompts +STR_5235 :{SMALLFONT}{BLACK}Nastavení +STR_5236 :Okno: +STR_5237 :Paleta: +STR_5238 :Current Theme: +STR_5239 :Duplikovat +STR_5240 :Enter a name for the theme +STR_5241 :Can't change this theme +STR_5242 :Theme name already exists +STR_5243 :Invalid characters used +STR_5244 :Themes +STR_5245 :Top Toolbar +STR_5246 :Bottom Toolbar +STR_5247 :Track Editor Bottom Toolbar +STR_5248 :Scenario Editor Bottom Toolbar +STR_5249 :Title Menu Buttons +STR_5250 :Title Exit Button +STR_5251 :Title Options Button +STR_5252 :Title Scenario Selection +STR_5253 :Park Information +STR_5254 :Create +STR_5255 :{SMALLFONT}{BLACK}Create a new title sequence from scratch +STR_5256 :Create a new theme to make changes to +STR_5257 :{SMALLFONT}{BLACK}Create a new theme based on the current one +STR_5258 :{SMALLFONT}{BLACK}Delete the current theme +STR_5259 :{SMALLFONT}{BLACK}Rename the current theme +STR_5260 :Giant Screenshot +STR_5261 :Filter +STR_5262 :Wacky Worlds +STR_5263 :Time Twister +STR_5264 :Custom +STR_5265 :{SMALLFONT}{BLACK}Select which content sources are visible +STR_5266 :{SMALLFONT}{BLACK}Display +STR_5267 :{SMALLFONT}{BLACK}Culture and Units +STR_5268 :{SMALLFONT}{BLACK}Audio +STR_5269 :{SMALLFONT}{BLACK}Controls and interface +STR_5270 :{SMALLFONT}{BLACK}Miscellaneous +STR_5271 :{SMALLFONT}{BLACK}Twitch +STR_5272 :{SMALLFONT}{BLACK}Small Scenery +STR_5273 :{SMALLFONT}{BLACK}Large Scenery +STR_5274 :{SMALLFONT}{BLACK}Footpath +STR_5275 :Search for Objects +STR_5276 :Enter the name of an object to search for +STR_5277 :Clear +STR_5278 :Sandbox mode +STR_5279 :Sandbox mode off +STR_5280 :{SMALLFONT}{BLACK}Allow editing land ownership settings through the Map window and other options that are normally restricted to the Scenario Editor +STR_5281 :{SMALLFONT}{BLACK}Features +STR_5282 :RCT1 Ride Open/Close Lights +STR_5283 :RCT1 Park Open/Close Lights +STR_5284 :RCT1 Scenario Selection Font +STR_5285 :EXPLODE!!! +STR_5286 :{SMALLFONT}{BLACK}Makes some guests explode +STR_5287 :Ride is already broken down +STR_5288 :Ride is closed +STR_5289 :No breakdowns available for this ride +STR_5290 :Fix ride +STR_5291 :Can't force breakdown +STR_5292 :{SMALLFONT}{BLACK}Force a breakdown +STR_5293 :{SMALLFONT}{BLACK}Close ride/attraction +STR_5294 :{SMALLFONT}{BLACK}Test ride/attraction +STR_5295 :{SMALLFONT}{BLACK}Open ride/attraction +STR_5296 :{SMALLFONT}{BLACK}Close park +STR_5297 :{SMALLFONT}{BLACK}Open park +STR_5298 :{RED}{STRINGID} +STR_5299 :{LIGHTPINK}{STRINGID} +STR_5300 :{SMALLFONT}{BLACK}Quick fire staff +STR_5301 :{MEDIUMFONT}{BLACK}Clear your loan +STR_5302 :Clear loan +STR_5303 :Allow building in pause mode +STR_5304 :Title Sequence: +STR_5305 :RollerCoaster Tycoon 1 +STR_5306 :RollerCoaster Tycoon 1 (AA) +STR_5307 :RollerCoaster Tycoon 1 (AA + LL) +STR_5308 :RollerCoaster Tycoon 2 +STR_5309 :OpenRCT2 +STR_5310 :Random +STR_5311 :{SMALLFONT}{BLACK}Debug tools +STR_5312 :Show console +STR_5313 :Show tile inspector +STR_5314 :Tile inspector +STR_5315 :Grass +STR_5316 :Sand +STR_5317 :Dirt +STR_5318 :Rock +STR_5319 :Martian +STR_5320 :Checkerboard +STR_5321 :Grass clumps +STR_5322 :Ice +STR_5323 :Grid (red) +STR_5324 :Grid (yellow) +STR_5325 :Grid (blue) +STR_5326 :Grid (green) +STR_5327 :Sand (dark) +STR_5328 :Sand (light) +STR_5329 :Checkerboard (inverted) +STR_5330 :Underground view +STR_5331 :Rock +STR_5332 :Wood (red) +STR_5333 :Wood (black) +STR_5334 :Ice +STR_5335 :Ride entrance +STR_5336 :Ride exit +STR_5337 :Park entrance +STR_5338 :Element type +STR_5339 :Base height +STR_5340 :Clearance height +STR_5341 :Flags +STR_5342 :Choose a map tile +STR_5343 :Automatically place staff +STR_5344 :Changelog +STR_5345 :Financial cheats +STR_5346 :Guest cheats +STR_5347 :Park cheats +STR_5348 :Ride cheats +STR_5349 :{SMALLFONT}{BLACK}All Rides +STR_5350 :Max +STR_5351 :Min +STR_5352 :{BLACK}Happiness: +STR_5353 :{BLACK}Energy: +STR_5354 :{BLACK}Hunger: +STR_5355 :{BLACK}Thirst: +STR_5356 :{BLACK}Nausea: +STR_5357 :{BLACK}Nausea tolerance: +STR_5358 :{BLACK}Bathroom: +STR_5359 :Remove guests +STR_5360 :{SMALLFONT}{BLACK}Removes all guests from the map +STR_5361 :Give all guests: +STR_5362 :{BLACK}Set all guests' preferred ride intensity to: +STR_5363 :More than 1 +STR_5364 :Less than 15 +STR_5365 :{BLACK}Staff speed: +STR_5366 :Normal +STR_5367 :Fast +STR_5368 :Reset crash status +STR_5369 :Park parameters... +STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. +STR_5371 :Object Selection +STR_5372 :Invert right mouse dragging +STR_5373 :Name {STRINGID} +STR_5374 :Date {STRINGID} +STR_5375 :{UP} +STR_5376 :{DOWN} +STR_5377 :{SMALLFONT}{BLACK}Saves +STR_5378 :{SMALLFONT}{BLACK}Script +STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command +STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence +STR_5381 :{SMALLFONT}{BLACK}Stop playing title sequence +STR_5382 :{SMALLFONT}{BLACK}Restart title sequence +STR_5383 :{SMALLFONT}{BLACK}Create a new title sequence based on the current one +STR_5384 :{SMALLFONT}{BLACK}Delete the current title sequence +STR_5385 :{SMALLFONT}{BLACK}Rename the current title sequence +STR_5386 :{SMALLFONT}{BLACK}Insert a new command +STR_5387 :{SMALLFONT}{BLACK}Edit the selected command +STR_5388 :{SMALLFONT}{BLACK}Delete the selected command +STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence +STR_5390 :{SMALLFONT}{BLACK}Move the selected command down +STR_5391 :{SMALLFONT}{BLACK}Move the selected command up +STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence +STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence +STR_5394 :{SMALLFONT}{BLACK}Rename the selected save +STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game +STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game +STR_5397 :Can only be used on the title screen +STR_5398 :Cannot edit title sequence while it's playing +STR_5399 :Press the stop button to continue editing +STR_5400 :Can't change this title sequence +STR_5401 :Create a new title sequence to make changes to +STR_5402 :Failed to load title sequence +STR_5403 :There may be no Load or Wait command or a save may be invalid +STR_5404 :Name already exists +STR_5405 :Enter a name for the save +STR_5406 :Enter a name for the title sequence +STR_5407 :Add +STR_5408 :Remove +STR_5409 :Insert +STR_5410 :Edit +STR_5411 :Reload +STR_5412 :Skip to +STR_5413 :Load +STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :Load{MOVE_X}{87}{STRING} +STR_5416 :Load{MOVE_X}{87}No save selected +STR_5417 :Location +STR_5418 :Location{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :Rotate +STR_5420 :Rotate{MOVE_X}{87}{COMMA16} +STR_5421 :Zoom +STR_5422 :Zoom{MOVE_X}{87}{COMMA16} +STR_5423 :Wait +STR_5424 :Wait{MOVE_X}{87}{COMMA16} +STR_5425 :Restart +STR_5426 :End +STR_5427 :Coordinates: +STR_5428 :Anticlockwise rotations: +STR_5429 :Zoom level: +STR_5430 :Seconds to wait: +STR_5431 :Save to load: +STR_5432 :Command: +STR_5433 :Title Sequences +STR_5434 :Command Editor +STR_5435 :Rename save +STR_5436 :Edit Title Sequences... +STR_5437 :No save selected +STR_5438 :Can't make changes while command editor is open +STR_5439 :A wait command with at least 4 seconds is required with a restart command +STR_5440 :Minimise fullscreen on focus loss +STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. +STR_5442 :Force park rating: +STR_5443 :Speed{MOVE_X}{87}{STRINGID} +STR_5444 :Speed: +STR_5445 :Speed +STR_5446 :Get +STR_5447 :Type {STRINGID} +STR_5448 :Ride / Vehicle {STRINGID} +STR_5449 :Reduce game speed +STR_5450 :Increase game speed +STR_5451 :Open cheats window +STR_5452 :Toggle visibility of toolbars +STR_5453 :Select another ride +STR_5454 :Uncap FPS +STR_5455 :Enable sandbox mode +STR_5456 :Disable clearance checks +STR_5457 :Disable support limits +STR_5458 :Rotate clockwise +STR_5459 :Rotate anti-clockwise +STR_5460 :Rotate view anti-clockwise +STR_5461 :Set guests' parameters +STR_5462 :{CURRENCY} +STR_5463 :Goal: Have fun! +STR_5464 :General +STR_5465 :Climate +STR_5466 :Staff +STR_5467 :ALT + +STR_5468 :Recent messages +STR_5469 :Scroll map up +STR_5470 :Scroll map left +STR_5471 :Scroll map down +STR_5472 :Scroll map right +STR_5473 :Cycle day / night +STR_5474 :Display text on banners in upper case +STR_5475 :{COMMA16} weeks +STR_5476 :Hardware +STR_5477 :Map rendering +STR_5478 :Controls +STR_5479 :Toolbar +STR_5480 :Show toolbar buttons for: +STR_5481 :Themes +STR_5482 :{WINDOW_COLOUR_2}Time since last inspection: {BLACK}1 minute +STR_5483 :{BLACK}({COMMA16} weeks remaining) +STR_5484 :{BLACK}({COMMA16} week remaining) +STR_5485 :{SMALLFONT}{STRING} +STR_5486 :{BLACK}{COMMA16} +STR_5487 :{SMALLFONT}{BLACK}Show recent messages +STR_5488 :No entrance (OpenRCT2 only!) +STR_5489 :{SMALLFONT}{BLACK}Show only tracked guests +STR_5490 :Disable audio on focus loss +STR_5491 :Seznam vynálezů +STR_5492 :Nastavení scénáře +STR_5493 :Poslat zprávu +STR_5494 : +STR_5495 :Seznam hráčů +STR_5496 :Hráč: +STR_5497 :Ping: +STR_5498 :Seznam Serverů +STR_5499 :Jméno hráče: +STR_5500 :Přidat Server +STR_5501 :Spustit Server +STR_5502 :Hra více hráčů +STR_5503 :Enter hostname or IP address: +STR_5504 :{SMALLFONT}{BLACK}Show multiplayer status +STR_5505 :Nelze se připojit k serveru. +STR_5506 :Hosté ingnorují intensitu +STR_5507 :Handymen mow grass by default +STR_5508 :APovolit nahrávat soubory s chybným kontrolním součtem +STR_5509 :{SMALLFONT}{BLACK}Allows loading scenarios and saves that have an incorrect checksum, like the scenarios from the demo or damaged saves. +STR_5510 :Default sound device +STR_5511 :(UNKNOWN) +STR_5512 :Uložit hru jako +STR_5513 :(Rychle) uložit hru +STR_5514 :Vypnout vandalismus +STR_5515 :{SMALLFONT}{BLACK}Zastaví vandalismus naštvaných hostů +STR_5516 :{SMALLFONT}{BLACK}Černá +STR_5517 :{SMALLFONT}{BLACK}Šedá +STR_5518 :{SMALLFONT}{BLACK}Bílá +STR_5519 :{SMALLFONT}{BLACK}Tmavě fialová +STR_5520 :{SMALLFONT}{BLACK}Světle fialová +STR_5521 :{SMALLFONT}{BLACK}Jasně fialová +STR_5522 :{SMALLFONT}{BLACK}Tmavě modrá +STR_5523 :{SMALLFONT}{BLACK}Světle modrá +STR_5524 :{SMALLFONT}{BLACK}Ledové modrá +STR_5525 :{SMALLFONT}{BLACK}Temná voda +STR_5526 :{SMALLFONT}{BLACK}Světlá voda +STR_5527 :{SMALLFONT}{BLACK}Sytě zelená +STR_5528 :{SMALLFONT}{BLACK}Tmavě zelená +STR_5529 :{SMALLFONT}{BLACK}Brčálově zelená +STR_5530 :{SMALLFONT}{BLACK}Jasně zelená +STR_5531 :{SMALLFONT}{BLACK}Olivově zelená +STR_5532 :{SMALLFONT}{BLACK}Tavá olivová zelená +STR_5533 :{SMALLFONT}{BLACK}Jasně žlutá +STR_5534 :{SMALLFONT}{BLACK}Žlutá +STR_5535 :{SMALLFONT}{BLACK}Temně žlutá +STR_5536 :{SMALLFONT}{BLACK}Světle oranžová +STR_5537 :{SMALLFONT}{BLACK}Temně oranžová +STR_5538 :{SMALLFONT}{BLACK}Světle hnědá +STR_5539 :{SMALLFONT}{BLACK}Sytě hnědá +STR_5540 :{SMALLFONT}{BLACK}Temně hnědá +STR_5541 :{SMALLFONT}{BLACK}Lososová +STR_5542 :{SMALLFONT}{BLACK}Bordeaux +STR_5543 :{SMALLFONT}{BLACK}Sytě červená +STR_5544 :{SMALLFONT}{BLACK}Jasně červená +STR_5545 :{SMALLFONT}{BLACK}Temně růžová +STR_5546 :{SMALLFONT}{BLACK}Jasně růžová +STR_5547 :{SMALLFONT}{BLACK}Světle +STR_5548 :Show all operating modes +STR_5549 :Rok/Měsíc/Den +STR_5550 :{POP16}{POP16}Rok {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} +STR_5551 :Rok/Den/Měsíc +STR_5552 :{POP16}{POP16}Rok {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} +STR_5553 :Pause game when Steam overlay is open +STR_5554 :{SMALLFONT}{BLACK}Enable mountain tool +STR_5555 :Show vehicles from other track types +STR_5556 :Vyhodit hráče +STR_5557 :Zůstat připojen při desynchronizaci (Hra více hráčů) +STR_5558 :Změna tohoto nastavení vyžaduje restart +STR_5559 :10 min. inspections +STR_5560 :{SMALLFONT}{BLACK}Sets the inspection time to 'Every 10 minutes' on all rides +STR_5561 :Nahrání souborů jazyka selhalo +STR_5562 :POZOR! +STR_5563 :This feature is currently unstable, take extra caution. +STR_5564 :Insert Corrupt Element +STR_5565 :{SMALLFONT}{BLACK}Inserts a corrupt map element at top of tile. This will hide any element above the corrupt element. +STR_5566 :Heslo: +STR_5567 :Propagovat +STR_5568 :Vyžadovat heslo +STR_5569 :Tento server vyžaduje heslo +STR_5570 :Hledat servery +STR_5571 :Připojit se ke hře +STR_5572 :Přída k oblíbeným +STR_5573 :Odstranit z oblíbených +STR_5574 :Jméno serveru: +STR_5575 :Hráčů maximálně: +STR_5576 :Port: +STR_5577 :Jiho-Korejský Won (W) +STR_5578 :Ruský Rubl (R) + +##################### +# Rides/attractions # +##################### + +#WW +[CONDORRD] +STR_NAME :Condor Ride +STR_DESC :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air in Condor-shaped trains +STR_CPTY :4 passengers per car diff --git a/src/config.c b/src/config.c index 763a0d163c..e21031a26d 100644 --- a/src/config.c +++ b/src/config.c @@ -130,22 +130,23 @@ config_enum_definition _currencyEnum[] = { }; config_enum_definition _languageEnum[] = { - { "en-GB", LANGUAGE_ENGLISH_UK }, - { "en-US", LANGUAGE_ENGLISH_US }, - { "de-DE", LANGUAGE_GERMAN }, - { "nl-NL", LANGUAGE_DUTCH }, - { "fr-FR", LANGUAGE_FRENCH }, - { "hu-HU", LANGUAGE_HUNGARIAN }, - { "pl-PL", LANGUAGE_POLISH }, - { "es-ES", LANGUAGE_SPANISH }, - { "sv-SE", LANGUAGE_SWEDISH }, - { "it-IT", LANGUAGE_ITALIAN }, - { "pt-BR", LANGUAGE_PORTUGUESE_BR }, - { "zh-Hant", LANGUAGE_CHINESE_TRADITIONAL }, - { "zh-Hans", LANGUAGE_CHINESE_SIMPLIFIED }, - { "fi-FI", LANGUAGE_FINNISH }, - { "ko", LANGUAGE_KOREAN }, - { "ru-RU", LANUGAGE_RUSSIAN }, + { "en-GB", LANGUAGE_ENGLISH_UK }, + { "en-US", LANGUAGE_ENGLISH_US }, + { "de-DE", LANGUAGE_GERMAN }, + { "nl-NL", LANGUAGE_DUTCH }, + { "fr-FR", LANGUAGE_FRENCH }, + { "hu-HU", LANGUAGE_HUNGARIAN }, + { "pl-PL", LANGUAGE_POLISH }, + { "es-ES", LANGUAGE_SPANISH }, + { "sv-SE", LANGUAGE_SWEDISH }, + { "it-IT", LANGUAGE_ITALIAN }, + { "pt-BR", LANGUAGE_PORTUGUESE_BR }, + { "zh-Hant",LANGUAGE_CHINESE_TRADITIONAL }, + { "zh-Hans",LANGUAGE_CHINESE_SIMPLIFIED }, + { "fi-FI", LANGUAGE_FINNISH }, + { "ko", LANGUAGE_KOREAN }, + { "ru-RU", LANGUAGE_RUSSIAN }, + { "cz-CZ", LANGUAGE_CZECH }, END_OF_ENUM }; diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index 4ed859df83..82aa446a54 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -91,8 +91,9 @@ const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", &TTFFontMingLiu, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL { "zh-Hans", "Chinese (Simplified)", "Chinese (Simplified)", "chinese_simplified", &TTFFontSimSun, RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED }, // LANGUAGE_CHINESE_SIMPLIFIED { "fi-FI", "Finnish", "Suomi", "finnish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_FINNISH - { "kr-KR", "Korean", "Korean", "korean", &TTFFontMalgun, RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN + { "ko", "Korean", "Korean", "korean", &TTFFontMalgun, RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN { "ru-RU", "Russian", "Russian", "russian", &TTFFontArial, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_RUSSIAN + { "cz-CZ", "Czech", "Czech", "czech", &TTFFontArial, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_CZECH }; int gCurrentLanguage = LANGUAGE_UNDEFINED; diff --git a/src/localisation/language.h b/src/localisation/language.h index 9dbb1ff889..3adf76de0f 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -41,7 +41,8 @@ enum { LANGUAGE_CHINESE_SIMPLIFIED, LANGUAGE_FINNISH, LANGUAGE_KOREAN, - LANUGAGE_RUSSIAN, + LANGUAGE_RUSSIAN, + LANGUAGE_CZECH, LANGUAGE_COUNT }; From b7d402cfbe5a26450f014ba1c219b90a29261f23 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 15 Nov 2015 13:55:09 +0000 Subject: [PATCH 1081/1173] Implement right click scrolling for scroll widgets. Think this had just been missed. Its heavily modified from the original to match closer to what the rest of the code base does. Fixes #2052. --- src/input.c | 85 ++++++++++++++++++++++++++++++++++++++++-- src/interface/window.h | 1 + 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/src/input.c b/src/input.c index b8752736b9..6a8706a3e2 100644 --- a/src/input.c +++ b/src/input.c @@ -47,7 +47,7 @@ static int _dragX, _dragY; static rct_windowclass _dragWindowClass; static rct_windownumber _dragWindowNumber; -static int _dragWidgetIndex; +static int _dragWidgetIndex, _dragScrollIndex; static int _originalWindowWidth, _originalWindowHeight; typedef struct { @@ -180,6 +180,83 @@ static rct_mouse_data* get_mouse_input() return &mouse_buffer[read_index]; } +/* rct2: 0x006E957F + */ +static void input_scroll_drag_begin(int x, int y, rct_window* w, rct_widget* widget, int widgetIndex) { + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) = INPUT_STATE_SCROLL_RIGHT; + _dragX = x; + _dragY = y; + _dragWindowClass = w->classification; + _dragWindowNumber = w->number; + _dragWidgetIndex = widgetIndex; + RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_DRAG_START, sint16) = 0; + + _dragScrollIndex = window_get_scroll_data_index(w, widgetIndex); + platform_hide_cursor(); +} + +/* Based on (heavily changed) rct2: 0x006E9E0E & 0x006E9ED0 */ +static void input_scroll_drag_continue(int x, int y, rct_window* w) { + uint8 widgetIndex = _dragWidgetIndex; + uint8 scrollIndex = _dragScrollIndex; + + rct_widget* widget = &w->widgets[widgetIndex]; + rct_scroll* scroll = &w->scrolls[scrollIndex]; + + int dx, dy; + dx = x - _dragX; + dy = y - _dragY; + + if (scroll->flags & HSCROLLBAR_VISIBLE) { + sint16 size = widget->right - widget->left - 1; + if (scroll->flags & VSCROLLBAR_VISIBLE) + size -= 11; + size = max(0, scroll->h_right - size); + scroll->h_left = min(max(0, scroll->h_left + dx), size); + } + + if (scroll->flags & VSCROLLBAR_VISIBLE) { + sint16 size = widget->bottom - widget->top - 1; + if (scroll->flags & HSCROLLBAR_VISIBLE) + size -= 11; + size = max(0, scroll->v_bottom - size); + scroll->v_top = min(max(0, scroll->v_top + dy), size); + } + + widget_scroll_update_thumbs(w, widgetIndex); + window_invalidate_by_number(w->classification, w->number); + platform_set_cursor_position(_dragX, _dragY); +} + +/* rct2: 0x006E8ACB*/ +static void input_scroll_right(int x, int y, int state) { + rct_window* w = window_find_by_number( + _dragWindowClass, + _dragWindowNumber + ); + + if (w == NULL) { + platform_show_cursor(); + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) = INPUT_STATE_RESET; + return; + } + + switch (state) { + case 0: + RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_DRAG_START, sint16) += RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_LAST_UPDATE, sint16); + if (x == 0 && y == 0) + return; + RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_DRAG_START, sint16) = 1000; + + input_scroll_drag_continue(x, y, w); + break; + case 4: + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, uint8) = INPUT_STATE_RESET; + platform_show_cursor(); + break; + } +} + /** * * rct2: 0x006E8655 @@ -221,7 +298,7 @@ static void game_handle_input_mouse(int x, int y, int state) input_viewport_drag_begin(w, x, y); } else if (widget->type == WWT_SCROLL) { - + input_scroll_drag_begin(x, y, w, widget, widgetIndex); } break; } @@ -325,8 +402,8 @@ static void game_handle_input_mouse(int x, int y, int state) input_window_resize_continue(w, x, y); } break; - case 9: - RCT2_CALLPROC_X(0x006E8ACB, x, y, state, widgetIndex, (int)w, (int)widget, 0); + case INPUT_STATE_SCROLL_RIGHT: + input_scroll_right(x, y, state); break; } } diff --git a/src/interface/window.h b/src/interface/window.h index 2bc6786893..28862b35c9 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -382,6 +382,7 @@ enum { INPUT_STATE_VIEWPORT_LEFT = 6, INPUT_STATE_SCROLL_LEFT = 7, INPUT_STATE_RESIZING = 8, + INPUT_STATE_SCROLL_RIGHT = 9 }; enum { From 7ba9ea2574a5f5ef45a27da753f49a11ceefd363 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sun, 15 Nov 2015 13:58:51 +0100 Subject: [PATCH 1082/1173] Make OpenRCT2 use iconv on Linux This makes possible to run the game with non-english locales on Linux Fixes #2300, fixes #2268, fixes #2267 --- src/localisation/localisation.c | 75 ++++++++++++++++++++++++++------- src/localisation/localisation.h | 2 +- 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 9e6f349513..7e131093b0 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -20,6 +20,9 @@ #ifdef _WIN32 #include +#else +#include +#include #endif // _WIN32 #include "../addresses.h" #include "../config.h" @@ -835,38 +838,80 @@ utf8 *win1252_to_utf8_alloc(const char *src) return (utf8*)realloc(result, actualSpace); } -int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength) +int win1252_to_utf8(utf8string dst, const char *src, size_t maxBufferLength) { + size_t srcLength = strlen(src); + +#ifdef _WIN32 utf16 stackBuffer[256]; utf16 *heapBuffer = NULL; utf16 *intermediateBuffer = stackBuffer; - int bufferCount = countof(stackBuffer); - + size_t bufferCount = countof(stackBuffer); if (maxBufferLength > bufferCount) { - int srcLength = strlen(src); if (srcLength > bufferCount) { bufferCount = srcLength + 4; heapBuffer = malloc(bufferCount * sizeof(utf16)); intermediateBuffer = heapBuffer; } } - -#ifdef _WIN32 MultiByteToWideChar(CP_ACP, 0, src, -1, intermediateBuffer, bufferCount); int result = WideCharToMultiByte(CP_UTF8, 0, intermediateBuffer, -1, dst, maxBufferLength, NULL, NULL); -#else - //STUB(); - // we cannot walk past maxBufferLength, but in case we have still space left - // we need one byte for null terminator - int result = strnlen(src, maxBufferLength) + 1; - result = min(result, maxBufferLength); - safe_strncpy(dst, src, maxBufferLength); - dst[maxBufferLength - 1] = '\0'; -#endif // _WIN32 if (heapBuffer != NULL) { free(heapBuffer); } +#else + //log_warning("converting %s of size %d", src, srcLength); + char *buffer_conv = strndup(src, srcLength); + char *buffer_orig = buffer_conv; + const char *to_charset = "UTF8"; + const char *from_charset = "CP1252"; + iconv_t cd = iconv_open(to_charset, from_charset); + if ((iconv_t)-1 == cd) + { + int error = errno; + switch (error) + { + case EINVAL: + log_error("Unsupported conversion from %s to %s, errno = %d", from_charset, to_charset, error); + break; + default: + log_error("Unknown error while initializing iconv, errno = %d", error); + } + return 0; + } + size_t obl = maxBufferLength; + char *outBuf = dst; + size_t conversion_result = iconv(cd, &buffer_conv, &srcLength, &outBuf, &obl); + if (conversion_result == (size_t)-1) + { + int error = errno; + switch (error) + { + case EILSEQ: + log_error("Encountered invalid sequence"); + break; + case EINVAL: + log_error("Encountered incomplete sequence"); + break; + case E2BIG: + log_error("Ran out of space"); + break; + default: + log_error("Unknown error encountered, errno = %d", error); + } + } + int close_result = iconv_close(cd); + if (close_result == -1) + { + log_error("Failed to close iconv, errno = %d", errno); + } + size_t byte_diff = maxBufferLength - obl + 1; + dst[byte_diff - 1] = '\0'; + //log_warning("converted %s of size %d, %d", dst, byte_diff, strlen(dst)); + int result = byte_diff; + free(buffer_orig); +#endif // _WIN32 return result; } diff --git a/src/localisation/localisation.h b/src/localisation/localisation.h index a4551fde07..ac255f5b91 100644 --- a/src/localisation/localisation.h +++ b/src/localisation/localisation.h @@ -46,7 +46,7 @@ void user_string_free(rct_string_id id); bool is_user_string_id(rct_string_id stringId); utf8 *win1252_to_utf8_alloc(const char *src); -int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength); +int win1252_to_utf8(utf8string dst, const char *src, size_t maxBufferLength); int rct2_to_utf8(utf8 *dst, const char *src); int utf8_to_rct2(char *dst, const utf8 *src); From eaa2d10ec462b340a7e06c2e885b707f6f2ed4e2 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 15 Nov 2015 18:11:49 +0000 Subject: [PATCH 1083/1173] Fix #2070. Incorrect highest drop penalty height caused incorrect calculations --- src/ride/ride_ratings.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index 696896d50b..d296e1ecc8 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -1788,7 +1788,7 @@ static void ride_ratings_calculate_wooden_wild_mouse(rct_ride *ride) ride_ratings_apply_65E1C2(&ratings, ride, 16705, 30583, 35108); ride_ratings_apply_proximity(&ratings, ride, 17893); ride_ratings_apply_scenery(&ratings, ride, 5577); - ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 6, 2, 2, 2); + ride_ratings_apply_highest_drop_height_penalty(&ratings, ride, 8, 2, 2, 2); ride_ratings_apply_max_speed_penalty(&ratings, ride, 0x70000, 2, 2, 2); ride_ratings_apply_max_negative_g_penalty(&ratings, ride, FIXED_2DP(0,10), 2, 2, 2); ride_ratings_apply_max_lateral_g_penalty(&ratings, ride, FIXED_2DP(1,50), 2, 2, 2); From 82498c4a57ae5a61a62ab8816c5839f82b010419 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 15 Nov 2015 21:05:30 +0000 Subject: [PATCH 1084/1173] Fix #1922. Corrected invalid viewport code. ACTIVE_VIEWPORT_PTR_ARRAY should be iterated along checking for a NULL pointer. To indicate the list end. Removed NEW_VIEWPORT macro as its description was incorrect. --- src/interface/viewport.c | 3 +-- src/world/map.c | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index cb664d8422..0bb8560dc1 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -38,7 +38,6 @@ #define RCT2_FIRST_VIEWPORT (RCT2_ADDRESS(RCT2_ADDRESS_VIEWPORT_LIST, rct_viewport)) #define RCT2_LAST_VIEWPORT (RCT2_ADDRESS(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport) - 1) -#define RCT2_NEW_VIEWPORT (RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*)) //#define DEBUG_SHOW_DIRTY_BOX @@ -98,7 +97,7 @@ void viewport_init_all() for (int i = 0; i < 9; i++) { g_viewport_list[i].width = 0; } - RCT2_NEW_VIEWPORT = NULL; + RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*) = NULL; // ? RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, sint32) = 0; diff --git a/src/world/map.c b/src/world/map.c index 00990645e0..b75ea436d6 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3432,7 +3432,7 @@ void map_get_bounding_box(int ax, int ay, int bx, int by, int *left, int *top, i void map_invalidate_selection_rect() { int x0, y0, x1, y1, left, right, top, bottom; - rct_viewport *viewport; + rct_viewport **vp; if (!(RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & (1 << 0))) return; @@ -3447,10 +3447,10 @@ void map_invalidate_selection_rect() bottom += 32; top -= 32 + 2080; - viewport = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); - while (viewport->width != 0) { - viewport_invalidate(viewport, left, top, right, bottom); - viewport++; + vp = RCT2_ADDRESS(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); + while (*vp != NULL) { + viewport_invalidate(*vp, left, top, right, bottom); + vp++; } } @@ -4308,7 +4308,7 @@ static void translate_3d_to_2d(int rotation, int *x, int *y) void map_invalidate_tile_under_zoom(int x, int y, int z0, int z1, int maxZoom) { int x1, y1, x2, y2; - rct_viewport *viewport; + rct_viewport **vp; x += 16; y += 16; @@ -4319,12 +4319,12 @@ void map_invalidate_tile_under_zoom(int x, int y, int z0, int z1, int maxZoom) x2 = x + 32; y2 = y + 32 - z0; - viewport = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); - while (!gOpenRCT2Headless && viewport->width != 0) { - if (maxZoom == -1 || viewport->zoom <= maxZoom) { - viewport_invalidate(viewport, x1, y1, x2, y2); + vp = RCT2_ADDRESS(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*); + while (!gOpenRCT2Headless && *vp != 0) { + if (maxZoom == -1 || (*vp)->zoom <= maxZoom) { + viewport_invalidate(*vp, x1, y1, x2, y2); } - viewport++; + vp++; } } From 9f255e5045e8ee32c18dc6bd065dc151157cc254 Mon Sep 17 00:00:00 2001 From: Cameron Date: Sun, 15 Nov 2015 15:58:22 -0600 Subject: [PATCH 1085/1173] Use fcntl.h instead of sys/fcntl.h --- src/network/network.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/network.h b/src/network/network.h index 0c092fa1f7..70992b3feb 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -79,7 +79,7 @@ extern "C" { #include #include #include - #include + #include typedef int SOCKET; #define SOCKET_ERROR -1 #define INVALID_SOCKET -1 From 9cbc1afbe22b738fd63b9f44257e4180aa068598 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 16 Nov 2015 04:00:17 +0000 Subject: [PATCH 1086/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 4 ++-- data/language/dutch.txt | 1 + data/language/english_us.txt | 1 + data/language/german.txt | 1 + 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 4e2ef366cd..e5a3b0a375 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -2723,8 +2723,8 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :(向上層) -STR_2719 :(建立新檔案) +STR_2718 :往上層目錄 +STR_2719 :建立新檔案 STR_2720 :{UINT16}秒 STR_2721 :{UINT16}秒 STR_2722 :{UINT16}分:{UINT16}秒 diff --git a/data/language/dutch.txt b/data/language/dutch.txt index ab3bd77c11..3d98c7d8f9 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3911,6 +3911,7 @@ STR_5575 :Max. aant. spelers: STR_5576 :Poort: STR_5577 :Zuid-Koreaanse won (W) STR_5578 :Russische roebel (R) +STR_5579 :Vergrotingsfactor: ############# # Scenarios # diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 94ccb3de73..eb610ff85b 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3919,6 +3919,7 @@ STR_5575 :Max Players: STR_5576 :Port: STR_5577 :South Korean Won (W) STR_5578 :Russian Ruble (R) +STR_5579 :Window scale factor: ######### # Rides # diff --git a/data/language/german.txt b/data/language/german.txt index d923316476..0bae72fb23 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -3912,6 +3912,7 @@ STR_5575 :Max. Spieler: STR_5576 :Port: STR_5577 :Südkoreanischer Won (W) STR_5578 :Russischer Rubel (R) +STR_5579 :Fensterskalierungsfaktor: ####################### # Bahnen/Attraktionen # From 2afed6a4dea8fb12400a60e28be4a6a338a5fe81 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Mon, 16 Nov 2015 11:04:00 +0100 Subject: [PATCH 1087/1173] Remote obsolete date tooltip --- data/language/english_uk.txt | 2 +- src/windows/game_bottom_toolbar.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index fc5773a30c..423a56a2b5 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2294,7 +2294,7 @@ STR_2286 :Designing STR_2287 :Completing design STR_2288 :Unknown STR_2289 :{STRINGID} {STRINGID} -STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} +STR_2290 : STR_2291 :Select scenario for new game STR_2292 :{WINDOW_COLOUR_2}Rides been on: STR_2293 :{BLACK} Nothing diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index 75abbaa634..c63c6e4599 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -69,7 +69,7 @@ rct_widget window_game_bottom_toolbar_widgets[] = { { WWT_IMGBTN, 0, 0x0208-WIDTH_MOD, 0x027F, 0, 33, 0xFFFFFFFF, STR_NONE }, // Right outset panel { WWT_IMGBTN, 0, 0x020A-WIDTH_MOD, 0x027D, 2, 31, 0xFFFFFFFF, STR_NONE }, // Right inset panel - { WWT_FLATBTN, 0, 0x020A-WIDTH_MOD, 0x027D, 2, 13, 0xFFFFFFFF, 2290 }, // Date + { WWT_FLATBTN, 0, 0x020A-WIDTH_MOD, 0x027D, 2, 13, 0xFFFFFFFF, STR_NONE }, // Date { WIDGETS_END }, }; From d3329b74a5604196f7c4c0baa026cef1928afa78 Mon Sep 17 00:00:00 2001 From: janisozaur Date: Mon, 16 Nov 2015 13:59:01 +0100 Subject: [PATCH 1088/1173] Comment expected cmdline_call_action results --- src/cmdline.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/cmdline.c b/src/cmdline.c index 0b0eb4b232..58b233db03 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -120,13 +120,19 @@ int cmdline_run(const char **argv, int argc) #endif // DISABLE_NETWORK if (argc != 0) { + // see comment next to cmdline_call_action for expected return codes gExitCode = cmdline_call_action(argv, argc); if (gExitCode < 0) { + // action failed, don't change exit code + // and don't start the game return 0; } else if (gExitCode > 0) { + // action successful, but don't start the game + // change exit code to success gExitCode = 0; return 0; } + // start the game, so far exit code means success. } // Headless mode requires a park to open @@ -202,6 +208,7 @@ static int cmdline_for_none(const char **argv, int argc) } } +// see comment next to cmdline_call_action for expected return codes struct { const char *firstArg; cmdline_action action; } cmdline_table[] = { { "intro", cmdline_for_intro }, { "edit", cmdline_for_edit }, @@ -215,6 +222,19 @@ struct { const char *firstArg; cmdline_action action; } cmdline_table[] = { #endif }; +/** + * This function delegates starting the game to different handlers, if found. + * + * Three cases of return values are supported: + * - result < 0 means failure, will exit with error code + * This case is useful when user provided wrong arguments or the requested + * action failed + * - result > 0 means success, won't start game, will exit program with success code + * This case is useful when you want to do some batch action and signalize + * success to the user. + * - result == 0 means success, will launch the game. + * This is default when ran with no arguments. + */ static int cmdline_call_action(const char **argv, int argc) { for (int i = 0; i < countof(cmdline_table); i++) { From 3889f5daadb8b01cf426bd0db330092672840020 Mon Sep 17 00:00:00 2001 From: TELK Date: Tue, 17 Nov 2015 00:56:22 +0900 Subject: [PATCH 1089/1173] Korean font change change korean font from malgun to gulim. I tested it is displayed correctly in korean os. See http://file.telk.kr/rct/img/gulim.png --- src/localisation/language.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index 82aa446a54..1e6ede56aa 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -60,13 +60,20 @@ static TTFFontSetDescriptor TTFFontSimSun = {{ { "simsun.ttc", 12, 1, -2, 14, nullptr }, { "simsun.ttc", 13, 1, 0, 20, nullptr }, }}; - +/* static TTFFontSetDescriptor TTFFontMalgun = {{ { "malgun.ttf", 8, -1, -3, 6, nullptr }, { "malgun.ttf", 11, 1, -2, 14, nullptr }, { "malgun.ttf", 12, 1, -4, 14, nullptr }, { "malgun.ttf", 13, 1, 0, 20, nullptr }, }}; +*/ +static TTFFontSetDescriptor TTFFontGulim = {{ + { "gulim.ttc", 11, 1, 0, 15, nullptr }, + { "gulim.ttc", 12, 1, 0, 17, nullptr }, + { "gulim.ttc", 12, 1, 0, 17, nullptr }, + { "gulim.ttc", 13, 1, 0, 20, nullptr }, +}}; static TTFFontSetDescriptor TTFFontArial = {{ { "arial.ttf", 8, 0, -1, 6, nullptr }, @@ -91,7 +98,7 @@ const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = { { "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", &TTFFontMingLiu, RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL { "zh-Hans", "Chinese (Simplified)", "Chinese (Simplified)", "chinese_simplified", &TTFFontSimSun, RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED }, // LANGUAGE_CHINESE_SIMPLIFIED { "fi-FI", "Finnish", "Suomi", "finnish", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_FINNISH - { "ko", "Korean", "Korean", "korean", &TTFFontMalgun, RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN + { "ko", "Korean", "Korean", "korean", &TTFFontGulim, RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN { "ru-RU", "Russian", "Russian", "russian", &TTFFontArial, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_RUSSIAN { "cz-CZ", "Czech", "Czech", "czech", &TTFFontArial, RCT2_LANGUAGE_ID_ENGLISH_UK }, // LANGUAGE_CZECH }; From 5d1c1b44450b7e1aea909a50dced2f5407509cdd Mon Sep 17 00:00:00 2001 From: TELK Date: Tue, 17 Nov 2015 01:21:41 +0900 Subject: [PATCH 1090/1173] Update language.cpp --- src/localisation/language.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index 1e6ede56aa..5c1bacd1b9 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -60,14 +60,7 @@ static TTFFontSetDescriptor TTFFontSimSun = {{ { "simsun.ttc", 12, 1, -2, 14, nullptr }, { "simsun.ttc", 13, 1, 0, 20, nullptr }, }}; -/* -static TTFFontSetDescriptor TTFFontMalgun = {{ - { "malgun.ttf", 8, -1, -3, 6, nullptr }, - { "malgun.ttf", 11, 1, -2, 14, nullptr }, - { "malgun.ttf", 12, 1, -4, 14, nullptr }, - { "malgun.ttf", 13, 1, 0, 20, nullptr }, -}}; -*/ + static TTFFontSetDescriptor TTFFontGulim = {{ { "gulim.ttc", 11, 1, 0, 15, nullptr }, { "gulim.ttc", 12, 1, 0, 17, nullptr }, From 3ba35745c8df662d1012a4e26c92039cb58feef2 Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Mon, 16 Nov 2015 17:50:52 +0100 Subject: [PATCH 1091/1173] Fix length of max scenario name in scenario editor --- src/windows/editor_objective_options.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index 5edd55dc33..0e1e763bc9 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -407,7 +407,7 @@ static void window_editor_objective_options_main_mouseup(rct_window *w, int widg break; case WIDX_SCENARIO_NAME: safe_strncpy((char*)0x009BC677, s6Info->name, 64); - window_text_input_open(w, WIDX_SCENARIO_NAME, 3313, 3314, 3165, 0, 32); + window_text_input_open(w, WIDX_SCENARIO_NAME, 3313, 3314, 3165, 0, 64); break; case WIDX_DETAILS: safe_strncpy((char*)0x009BC677, s6Info->details, 256); From 994dd1f9454ac3b2d351f88c54be83dbe5ca758f Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Mon, 16 Nov 2015 17:56:51 +0100 Subject: [PATCH 1092/1173] Add string ids for scenario name window --- src/localisation/string_ids.h | 3 +++ src/windows/editor_objective_options.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 6d6ddcf95d..5b7ed3167a 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1802,6 +1802,9 @@ enum { STR_CHANGE_NAME_OF_SCENARIO_TIP = 3296, STR_CHANGE_DETAIL_NOTES_ABOUT_PARK_SCENARIO_TIP = 3297, + STR_SCENARIO_NAME = 3313, + STR_ENTER_SCENARIO_NAME = 3314, + STR_NO_DETAILS_YET = 3317, STR_SELECT_WHICH_GROUP_THIS_SCENARIO_APPEARS_IN = 3318, diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index 0e1e763bc9..d1cc24b9ea 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -407,7 +407,7 @@ static void window_editor_objective_options_main_mouseup(rct_window *w, int widg break; case WIDX_SCENARIO_NAME: safe_strncpy((char*)0x009BC677, s6Info->name, 64); - window_text_input_open(w, WIDX_SCENARIO_NAME, 3313, 3314, 3165, 0, 64); + window_text_input_open(w, WIDX_SCENARIO_NAME, STR_SCENARIO_NAME, STR_ENTER_SCENARIO_NAME, 3165, 0, 64); break; case WIDX_DETAILS: safe_strncpy((char*)0x009BC677, s6Info->details, 256); From 292b67874f6c7588b2ba00e969d2d53060cd23b4 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Sun, 15 Nov 2015 21:31:37 -0700 Subject: [PATCH 1093/1173] Fix #2311. Water no longer is able to be raised above existing map elements. --- src/world/map.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index b75ea436d6..1c14179b58 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2326,18 +2326,18 @@ void game_command_set_water_height(int* eax, int* ebx, int* ecx, int* edx, int* } rct_map_element* map_element = map_get_surface_element_at(x / 32, y / 32); - int z1 = map_element->base_height; - int z2 = base_height; + int zHigh = map_element->base_height; + int zLow = base_height; if(map_element->properties.surface.terrain & 0x1F){ - z1 = (map_element->properties.surface.terrain & 0x1F) * 2; + zHigh = (map_element->properties.surface.terrain & 0x1F) * 2; } - if(z2 > z1){ - int temp = z1; - z1 = z2; - z2 = temp; + if(zLow > zHigh){ + int temp = zHigh; + zHigh = zLow; + zLow = temp; } - if(map_can_construct_at(x, y, z1, z2, 0xFF)){ + if(map_can_construct_at(x, y, zLow, zHigh, 0xFF)){ if(map_element->type & 0x40){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = 0; *ebx = MONEY32_UNDEFINED; From c1ed727067d67f7459f8823af13c314093cb9f07 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Mon, 16 Nov 2015 20:19:58 +0000 Subject: [PATCH 1094/1173] Fix #2305. Fences now build correctly with shift. Issue was caused by failing to reinitialise a variable and reusing a variable name for two different purposes. It has been fixed by nameing the variable and also initialising it. --- src/world/map.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 1c14179b58..1a317288f1 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2952,9 +2952,10 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, if (!(bp & 0xC0)){ uint8 new_edge = (edge + 2) & 3; - bp += 2; + uint8 new_base_height = map_element->base_height; + new_base_height += 2; if (map_element->properties.surface.slope & (1 << new_edge)){ - if (position.z / 8 < bp){ + if (position.z / 8 < new_base_height){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; *ebx = MONEY32_UNDEFINED; return; @@ -2966,13 +2967,13 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, if (map_element->properties.surface.slope & (1 << new_edge)){ new_edge = (new_edge + 2) & 3; if (map_element->properties.surface.slope & (1 << new_edge)){ - bp += 2; - if (position.z / 8 < bp){ + new_base_height += 2; + if (position.z / 8 < new_base_height){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; *ebx = MONEY32_UNDEFINED; return; } - bp -= 2; + new_base_height -= 2; } } } @@ -2980,7 +2981,7 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, new_edge = (edge + 3) & 3; if (map_element->properties.surface.slope & (1 << new_edge)){ - if (position.z / 8 < bp){ + if (position.z / 8 < new_base_height){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; *ebx = MONEY32_UNDEFINED; return; @@ -2992,8 +2993,8 @@ void game_command_place_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi, if (map_element->properties.surface.slope & (1 << new_edge)){ new_edge = (new_edge + 2) & 3; if (map_element->properties.surface.slope & (1 << new_edge)){ - bp += 2; - if (position.z / 8 < bp){ + new_base_height += 2; + if (position.z / 8 < new_base_height){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND; *ebx = MONEY32_UNDEFINED; return; From b83e57023070821c125b524c8a481cc1f58e2ad8 Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Mon, 16 Nov 2015 17:50:52 +0100 Subject: [PATCH 1095/1173] Fix length of max scenario name in scenario editor --- src/windows/editor_objective_options.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index 5edd55dc33..0e1e763bc9 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -407,7 +407,7 @@ static void window_editor_objective_options_main_mouseup(rct_window *w, int widg break; case WIDX_SCENARIO_NAME: safe_strncpy((char*)0x009BC677, s6Info->name, 64); - window_text_input_open(w, WIDX_SCENARIO_NAME, 3313, 3314, 3165, 0, 32); + window_text_input_open(w, WIDX_SCENARIO_NAME, 3313, 3314, 3165, 0, 64); break; case WIDX_DETAILS: safe_strncpy((char*)0x009BC677, s6Info->details, 256); From 0f065cf4a9585c177ee872ffebf4b251b29181db Mon Sep 17 00:00:00 2001 From: Alexander Overvoorde Date: Mon, 16 Nov 2015 17:56:51 +0100 Subject: [PATCH 1096/1173] Add string ids for scenario name window --- src/localisation/string_ids.h | 3 +++ src/windows/editor_objective_options.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 6d6ddcf95d..5b7ed3167a 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1802,6 +1802,9 @@ enum { STR_CHANGE_NAME_OF_SCENARIO_TIP = 3296, STR_CHANGE_DETAIL_NOTES_ABOUT_PARK_SCENARIO_TIP = 3297, + STR_SCENARIO_NAME = 3313, + STR_ENTER_SCENARIO_NAME = 3314, + STR_NO_DETAILS_YET = 3317, STR_SELECT_WHICH_GROUP_THIS_SCENARIO_APPEARS_IN = 3318, diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index 0e1e763bc9..d1cc24b9ea 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -407,7 +407,7 @@ static void window_editor_objective_options_main_mouseup(rct_window *w, int widg break; case WIDX_SCENARIO_NAME: safe_strncpy((char*)0x009BC677, s6Info->name, 64); - window_text_input_open(w, WIDX_SCENARIO_NAME, 3313, 3314, 3165, 0, 64); + window_text_input_open(w, WIDX_SCENARIO_NAME, STR_SCENARIO_NAME, STR_ENTER_SCENARIO_NAME, 3165, 0, 64); break; case WIDX_DETAILS: safe_strncpy((char*)0x009BC677, s6Info->details, 256); From 5cd0ab7fadeccbd9a3aea66d16ddb638a511d5be Mon Sep 17 00:00:00 2001 From: Kevin Date: Tue, 17 Nov 2015 00:27:29 +0100 Subject: [PATCH 1097/1173] Use fnmatch to match file patterns. strstr doesn't support wildcards, so patterns like '*.TD?' will fail. This adds the possibility for more complex patterns. --- src/platform/linux.c | 39 +++++---------------------------------- 1 file changed, 5 insertions(+), 34 deletions(-) diff --git a/src/platform/linux.c b/src/platform/linux.c index 68291e8d3a..9491556700 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -34,6 +34,7 @@ #include "platform.h" #include "../util/util.h" #include +#include #include // The name of the mutex used to prevent multiple instances of the game from running @@ -198,7 +199,7 @@ static int winfilter(const struct dirent *d) name_upper[i] = (char)toupper(d->d_name[i]); } name_upper[entry_length] = '\0'; - bool match = strstr(name_upper, g_file_pattern) != NULL; + bool match = fnmatch(g_file_pattern, name_upper, 0) == 0; //log_warning("trying matching filename %s, result = %d", name_upper, match); free(name_upper); return match; @@ -229,39 +230,9 @@ int platform_enumerate_files_begin(const utf8 *pattern) dir_name = strdup("."); } - char *smatch = strchr(file_name, '*'); - if ((smatch != file_name) && (smatch != NULL)) - { - log_error("Sorry, can only match '*' at start of filename."); - return -1; - } else { - // '*' found - if (smatch != NULL) - { - // some boundary checking needed - // skip the '*' - smatch = &smatch[1]; - char *match2 = strchr(&smatch[1], '*'); - if (match2 != NULL) - { - log_error("Sorry, can only match one '*' wildcard."); - return -1; - } - } else { - // '*' not found - smatch = file_name; - } - } - char *qmatch = strchr(file_name, '?'); - if ((qmatch != &npattern[length - 1]) && (qmatch != NULL)) - { - log_error("Sorry, can only match '?' at end of filename."); - return -1; - } else { - qmatch = &npattern[length]; - } - int pattern_length = qmatch - smatch; - g_file_pattern = strndup(smatch, pattern_length); + + int pattern_length = strlen(file_name); + g_file_pattern = strndup(file_name, pattern_length); for (int j = 0; j < pattern_length; j++) { g_file_pattern[j] = (char)toupper(g_file_pattern[j]); From 3a8b25a0eeab28349623ceeb9207e2f4c3f5ff3e Mon Sep 17 00:00:00 2001 From: Dom Light Date: Mon, 16 Nov 2015 22:39:40 +0000 Subject: [PATCH 1098/1173] Sanitize audio.h --- src/audio/audio.c | 50 +++++------ src/audio/audio.h | 117 +++++++++++++------------- src/audio/mixer.cpp | 20 ++--- src/audio/mixer.h | 2 +- src/editor.c | 4 +- src/game.c | 20 ++--- src/input.c | 4 +- src/interface/window.c | 2 +- src/management/news_item.c | 2 +- src/openrct2.c | 16 ++-- src/peep/peep.c | 14 +-- src/rct2.c | 4 +- src/ride/ride.c | 78 ++++++++--------- src/ride/track.c | 4 +- src/ride/vehicle.c | 88 +++++++++---------- src/title.c | 6 +- src/windows/editor_bottom_toolbar.c | 4 +- src/windows/editor_object_selection.c | 2 +- src/windows/error.c | 2 +- src/windows/footpath.c | 4 +- src/windows/install_track.c | 2 +- src/windows/map.c | 2 +- src/windows/maze_construction.c | 4 +- src/windows/new_ride.c | 2 +- src/windows/news.c | 4 +- src/windows/options.c | 8 +- src/windows/ride.c | 8 +- src/windows/ride_construction.c | 10 +-- src/windows/save_prompt.c | 4 +- src/windows/scenery.c | 2 +- src/windows/title_scenarioselect.c | 2 +- src/windows/top_toolbar.c | 16 ++-- src/windows/track_list.c | 2 +- src/windows/track_place.c | 4 +- src/world/balloon.c | 2 +- src/world/duck.c | 2 +- src/world/map.c | 12 +-- src/world/particle.c | 2 +- 38 files changed, 264 insertions(+), 267 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 02f67c061e..d6721f347f 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -94,7 +94,7 @@ void audio_get_devices() * @param y (dx) * @param z (bp) */ -int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z) +int audio_sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z) { if (!gGameSoundsOff) { int volumedown = 0; @@ -164,7 +164,7 @@ int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z) * * rct2: 0x006BD0F8 */ -void start_title_music() +void audio_start_title_music() { int musicPathId; switch (gConfigSound.title_music) { @@ -189,7 +189,7 @@ void start_title_music() gTitleMusicChannel = Mixer_Play_Music(musicPathId, MIXER_LOOP_INFINITE, true); } } else { - stop_title_music(); + audio_stop_title_music(); } } @@ -197,15 +197,15 @@ void start_title_music() * * rct2: 0x006BCA9F */ -void stop_ride_music() +void audio_stop_ride_music() { for (int i = 0; i < AUDIO_MAX_RIDE_MUSIC; i++) { rct_ride_music* ride_music = &gRideMusicList[i]; - if (ride_music->rideid != (uint8)-1) { + if (ride_music->ride_id != (uint8)-1) { if (ride_music->sound_channel) { Mixer_Stop_Channel(ride_music->sound_channel); } - ride_music->rideid = -1; + ride_music->ride_id = -1; } } } @@ -214,7 +214,7 @@ void stop_ride_music() * * rct2: 0x006BD07F */ -void stop_crowd_sound() +void audio_stop_crowd_sound() { if (gCrowdSoundChannel) { Mixer_Stop_Channel(gCrowdSoundChannel); @@ -226,7 +226,7 @@ void stop_crowd_sound() * * rct2: 0x006BD0BD */ -void stop_title_music() +void audio_stop_title_music() { if (gTitleMusicChannel) { Mixer_Stop_Channel(gTitleMusicChannel); @@ -251,9 +251,9 @@ void audio_init1() int devicenum = 0; audio_init2(devicenum); - for(int m = 0; m < countof(ride_music_info_list); m++) { - rct_ride_music_info* ride_music_info = ride_music_info_list[m]; - const utf8* path = get_file_path(ride_music_info->pathid); + for(int m = 0; m < countof(gRideMusicInfoList); m++) { + rct_ride_music_info* ride_music_info = gRideMusicInfoList[m]; + const utf8* path = get_file_path(ride_music_info->path_id); SDL_RWops *file = SDL_RWFromFile(path, "rb"); if (file != NULL) { uint32 head; @@ -282,7 +282,7 @@ void audio_init2(int device) config_save_default(); for (int i = 0; i < AUDIO_MAX_RIDE_MUSIC; i++) { rct_ride_music* ride_music = &gRideMusicList[i]; - ride_music->rideid = -1; + ride_music->ride_id = -1; } } @@ -292,21 +292,21 @@ void audio_init2(int device) */ void audio_close() { - stop_crowd_sound(); - stop_title_music(); - stop_ride_music(); + audio_stop_crowd_sound(); + audio_stop_title_music(); + audio_stop_ride_music(); stop_rain_sound(); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = -1; } /* rct2: 0x006BAB8A */ -void toggle_all_sounds(){ +void audio_toggle_all_sounds(){ gConfigSound.sound = !gConfigSound.sound; if (!gConfigSound.sound) { - stop_title_music(); - pause_sounds(); + audio_stop_title_music(); + audio_pause_sounds(); } else { - unpause_sounds(); + audio_unpause_sounds(); } } @@ -314,12 +314,12 @@ void toggle_all_sounds(){ * * rct2: 0x006BABB4 */ -void pause_sounds() +void audio_pause_sounds() { gGameSoundsOff = true; - stop_vehicle_sounds(); - stop_ride_music(); - stop_crowd_sound(); + audio_stop_vehicle_sounds(); + audio_stop_ride_music(); + audio_stop_crowd_sound(); stop_rain_sound(); } @@ -327,7 +327,7 @@ void pause_sounds() * * rct2: 0x006BABD8 */ -void unpause_sounds() +void audio_unpause_sounds() { gGameSoundsOff = false; } @@ -336,7 +336,7 @@ void unpause_sounds() * * rct2: 0x006BABDF */ -void stop_vehicle_sounds() +void audio_stop_vehicle_sounds() { if (!gOpenRCT2Headless && RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) != -1) { for (int i = 0; i < countof(gVehicleSoundList); i++) { diff --git a/src/audio/audio.h b/src/audio/audio.h index 7c3030903a..6ec60fc572 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -25,20 +25,38 @@ #include "../world/sprite.h" #define AUDIO_DEVICE_NAME_SIZE 256 +#define AUDIO_MAX_RIDE_MUSIC 2 +#define AUDIO_MAX_VEHICLE_SOUNDS 14 +#define NUM_DEFAULT_MUSIC_TRACKS 46 typedef struct { char name[AUDIO_DEVICE_NAME_SIZE]; } audio_device; -extern int gAudioDeviceCount; -extern audio_device *gAudioDevices; +typedef struct { + uint8 ride_id; + uint8 tune_id; + sint16 volume; + sint16 pan; + uint16 frequency; + void* sound_channel; +} rct_ride_music; -#define AUDIO_MAX_VEHICLE_SOUNDS 14 -#define AUDIO_MAX_RIDE_MUSIC 2 +typedef struct { + uint32 length; + uint32 offset; + uint8 path_id; + uint8 var_9; +} rct_ride_music_info; -void audio_init(); -void audio_quit(); -void audio_get_devices(); +typedef struct { + uint8 ride_id; + uint8 tune_id; + sint32 offset; + sint16 volume; + sint16 pan; + uint16 frequency; +} rct_ride_music_params; typedef struct { uint16 id; @@ -57,64 +75,13 @@ typedef struct { typedef struct { uint16 id; - sint16 panx; - sint16 pany; + sint16 pan_x; + sint16 pan_y; uint16 frequency; sint16 volume; uint16 var_A; } rct_vehicle_sound_params; -typedef struct { - uint8 rideid; - uint8 tuneid; - sint32 offset; - sint16 volume; - sint16 pan; - uint16 freq; -} rct_ride_music_params; - -typedef struct { - uint8 rideid; - uint8 tuneid; - sint16 volume; - sint16 pan; - uint16 freq; - void* sound_channel; -} rct_ride_music; - -typedef struct { - uint32 length; - uint32 offset; - uint8 pathid; - uint8 var_9; -} rct_ride_music_info; - -#define NUM_DEFAULT_MUSIC_TRACKS 46 -extern rct_ride_music_info* ride_music_info_list[NUM_DEFAULT_MUSIC_TRACKS]; -extern rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS]; -extern rct_vehicle_sound_params gVehicleSoundParamsList[AUDIO_MAX_VEHICLE_SOUNDS]; -extern rct_vehicle_sound_params *gVehicleSoundParamsListEnd; -extern rct_ride_music gRideMusicList[AUDIO_MAX_RIDE_MUSIC]; -extern rct_ride_music_params gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC]; -extern rct_ride_music_params *gRideMusicParamsListEnd; -extern void *gCrowdSoundChannel; -extern void *gTitleMusicChannel; -extern void *gRainSoundChannel; -extern bool gGameSoundsOff; - -int sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z); -void start_title_music(); -void stop_ride_music(); -void stop_crowd_sound(); -void stop_title_music(); -void audio_init1(); -void audio_init2(int device); -void audio_close(); -void pause_sounds(); -void toggle_all_sounds(); -void unpause_sounds(); -void stop_vehicle_sounds(); - typedef enum { SOUND_LIFT_1 = 0, SOUND_TRACK_FRICTION_1 = 1, @@ -182,4 +149,34 @@ typedef enum { SOUND_MAXID } RCT2_SOUND; +extern audio_device *gAudioDevices; +extern int gAudioDeviceCount; +extern void *gCrowdSoundChannel; +extern bool gGameSoundsOff; +extern void *gRainSoundChannel; +extern rct_ride_music gRideMusicList[AUDIO_MAX_RIDE_MUSIC]; +extern rct_ride_music_info* gRideMusicInfoList[NUM_DEFAULT_MUSIC_TRACKS]; +extern rct_ride_music_params gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC]; +extern rct_ride_music_params *gRideMusicParamsListEnd; +extern void *gTitleMusicChannel; +extern rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS]; +extern rct_vehicle_sound_params gVehicleSoundParamsList[AUDIO_MAX_VEHICLE_SOUNDS]; +extern rct_vehicle_sound_params *gVehicleSoundParamsListEnd; + +void audio_close(); +void audio_get_devices(); +void audio_init(); +void audio_init1(); +void audio_init2(int device); +void audio_pause_sounds(); +void audio_quit(); +int audio_sound_play_panned(int soundId, int ebx, sint16 x, sint16 y, sint16 z); +void audio_start_title_music(); +void audio_stop_crowd_sound(); +void audio_stop_ride_music(); +void audio_stop_title_music(); +void audio_stop_vehicle_sounds(); +void audio_toggle_all_sounds(); +void audio_unpause_sounds(); + #endif diff --git a/src/audio/mixer.cpp b/src/audio/mixer.cpp index d8c4bcfb19..1edda91bc7 100644 --- a/src/audio/mixer.cpp +++ b/src/audio/mixer.cpp @@ -530,20 +530,20 @@ void Mixer::Stop(Channel& channel) Unlock(); } -bool Mixer::LoadMusic(int pathid) +bool Mixer::LoadMusic(int pathId) { - if (pathid >= countof(musicsources)) { + if (pathId >= countof(musicsources)) { return false; } - if (!musicsources[pathid]) { - const char* filename = get_file_path(pathid); + if (!musicsources[pathId]) { + const char* filename = get_file_path(pathId); Source_Sample* source_sample = new Source_Sample; if (source_sample->LoadWAV(filename)) { - musicsources[pathid] = source_sample; + musicsources[pathId] = source_sample; return true; } else { delete source_sample; - musicsources[pathid] = &source_null; + musicsources[pathId] = &source_null; return false; } } else { @@ -880,7 +880,7 @@ void Mixer_Channel_SetGroup(void* channel, int group) ((Channel*)channel)->SetGroup(group); } -void* Mixer_Play_Music(int pathid, int loop, int streaming) +void* Mixer_Play_Music(int pathId, int loop, int streaming) { if (gOpenRCT2Headless) return 0; @@ -888,7 +888,7 @@ void* Mixer_Play_Music(int pathid, int loop, int streaming) return 0; } if (streaming) { - const utf8 *filename = get_file_path(pathid); + const utf8 *filename = get_file_path(pathId); SDL_RWops* rw = SDL_RWFromFile(filename, "rb"); if (rw == NULL) { @@ -908,8 +908,8 @@ void* Mixer_Play_Music(int pathid, int loop, int streaming) return 0; } } else { - if (gMixer.LoadMusic(pathid)) { - Channel* channel = gMixer.Play(*gMixer.musicsources[pathid], MIXER_LOOP_INFINITE, false, false); + if (gMixer.LoadMusic(pathId)) { + Channel* channel = gMixer.Play(*gMixer.musicsources[pathId], MIXER_LOOP_INFINITE, false, false); if (channel) { channel->SetGroup(MIXER_GROUP_MUSIC); } diff --git a/src/audio/mixer.h b/src/audio/mixer.h index 3fe66b4816..4b2aeccbac 100644 --- a/src/audio/mixer.h +++ b/src/audio/mixer.h @@ -210,7 +210,7 @@ int Mixer_Channel_IsPlaying(void* channel); unsigned long Mixer_Channel_GetOffset(void* channel); int Mixer_Channel_SetOffset(void* channel, unsigned long offset); void Mixer_Channel_SetGroup(void* channel, int group); -void* Mixer_Play_Music(int pathid, int loop, int streaming); +void* Mixer_Play_Music(int pathId, int loop, int streaming); void Mixer_SetVolume(float volume); static int DStoMixerVolume(int volume) { return (int)(SDL_MIX_MAXVOLUME * (SDL_pow(10, (float)volume / 2000))); }; diff --git a/src/editor.c b/src/editor.c index 7b4b98e3cd..7b566001ca 100644 --- a/src/editor.c +++ b/src/editor.c @@ -60,8 +60,8 @@ void editor_load() { rct_window *mainWindow; - pause_sounds(); - unpause_sounds(); + audio_pause_sounds(); + audio_unpause_sounds(); object_unload_all(); map_init(150); banner_init(); diff --git a/src/game.c b/src/game.c index 10c4c61466..26b21f0956 100644 --- a/src/game.c +++ b/src/game.c @@ -275,7 +275,7 @@ void game_update() // Update the game one or more times for (i = 0; i < numUpdates; i++) { game_logic_update(); - start_title_music(); + audio_start_title_music(); if (gGameSpeed > 1) continue; @@ -549,10 +549,10 @@ void pause_toggle() RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) ^= 1; window_invalidate_by_class(WC_TOP_TOOLBAR); if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) & 1) { - pause_sounds(); - unpause_sounds(); + audio_pause_sounds(); + audio_unpause_sounds(); } else { - unpause_sounds(); + audio_unpause_sounds(); } } @@ -601,9 +601,9 @@ static int open_landscape_file_dialog() format_string((char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, STR_LOAD_LANDSCAPE_DIALOG_TITLE, 0); safe_strncpy((char*)0x0141EF68, (char*)RCT2_ADDRESS_LANDSCAPES_PATH, MAX_PATH); format_string((char*)0x0141EE68, STR_RCT2_LANDSCAPE_FILE, 0); - pause_sounds(); + audio_pause_sounds(); result = platform_open_common_file_dialog(1, (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, (char*)0x0141EF68, "*.SV6;*.SV4;*.SC6", (char*)0x0141EE68); - unpause_sounds(); + audio_unpause_sounds(); // window_proc return result; } @@ -618,9 +618,9 @@ static int open_load_game_dialog() format_string((char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, STR_LOAD_GAME_DIALOG_TITLE, 0); safe_strncpy((char*)0x0141EF68, (char*)RCT2_ADDRESS_SAVED_GAMES_PATH, MAX_PATH); format_string((char*)0x0141EE68, STR_RCT2_SAVED_GAME, 0); - pause_sounds(); + audio_pause_sounds(); result = platform_open_common_file_dialog(1, (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, (char*)0x0141EF68, "*.SV6", (char*)0x0141EE68); - unpause_sounds(); + audio_unpause_sounds(); // window_proc return result; } @@ -1020,9 +1020,9 @@ static int show_save_game_dialog(char *resultPath) safe_strncpy(filename, RCT2_ADDRESS(RCT2_ADDRESS_SAVED_GAMES_PATH_2, char), MAX_PATH); format_string(filterName, STR_RCT2_SAVED_GAME, NULL); - pause_sounds(); + audio_pause_sounds(); result = platform_open_common_file_dialog(0, title, filename, "*.SV6", filterName); - unpause_sounds(); + audio_unpause_sounds(); if (result) safe_strncpy(resultPath, filename, MAX_PATH); diff --git a/src/input.c b/src/input.c index 6a8706a3e2..c68a1562e4 100644 --- a/src/input.c +++ b/src/input.c @@ -1021,7 +1021,7 @@ static void input_widget_left(int x, int y, rct_window *w, int widgetIndex) break; default: if (widget_is_enabled(w, widgetIndex) && !widget_is_disabled(w, widgetIndex)) { - sound_play_panned(SOUND_CLICK_1, w->x + (widget->left + widget->right) / 2, 0, 0, 0); + audio_sound_play_panned(SOUND_CLICK_1, w->x + (widget->left + widget->right) / 2, 0, 0, 0); // Set new cursor down widget RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWCLASS, rct_windowclass) = windowClass; @@ -1267,7 +1267,7 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi break; int mid_point_x = (widget->left + widget->right) / 2 + w->x; - sound_play_panned(5, mid_point_x, 0, 0, 0); + audio_sound_play_panned(5, mid_point_x, 0, 0, 0); if (cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex) break; diff --git a/src/interface/window.c b/src/interface/window.c index 8a4ad7831a..8bf9e8efe1 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -397,7 +397,7 @@ rct_window *window_create(int x, int y, int width, int height, rct_window_event_ // Play sounds and flash the window if (!(flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT))){ w->flags |= WF_WHITE_BORDER_MASK; - sound_play_panned(SOUND_WINDOW_OPEN, x + (width / 2), 0, 0, 0); + audio_sound_play_panned(SOUND_WINDOW_OPEN, x + (width / 2), 0, 0, 0); } w->number = 0; diff --git a/src/management/news_item.c b/src/management/news_item.c index c3e059c761..f83f5d2ca1 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -85,7 +85,7 @@ static void news_item_tick_current() // Only play news item sound when in normal playing mode if (ticks == 1 && (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) == SCREEN_FLAGS_PLAYING)) { // Play sound - sound_play_panned(SOUND_NEWS_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2, 0, 0, 0); + audio_sound_play_panned(SOUND_NEWS_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2, 0, 0, 0); } } diff --git a/src/openrct2.c b/src/openrct2.c index b3833ac573..8c920fcb0a 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -635,14 +635,14 @@ static bool openrct2_release_rct2_segment() */ static void openrct2_setup_rct2_hooks() { - addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0, 0); // remove when all callers are decompiled - addhook(0x006E7499, (int)gfx_redraw_screen_rect, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0, 0); // remove when 0x6E7FF3 is decompiled - addhook(0x006B752C, (int)ride_crash, 0, (int[]){ EDX, EBX, END }, 0, 0); // remove when all callers are decompiled - addhook(0x0069A42F, (int)peep_window_state_update, 0, (int[]){ ESI, END }, 0, 0); // remove when all callers are decompiled - addhook(0x006BB76E, (int)sound_play_panned, 0, (int[]){EAX, EBX, ECX, EDX, EBP, END}, EAX, 0); // remove when all callers are decompiled - addhook(0x006C42D9, (int)scrolling_text_setup, 0, (int[]){EAX, ECX, EBP, END}, 0, EBX); // remove when all callers are decompiled - addhook(0x006C2321, (int)gfx_get_string_width, 0, (int[]){ESI, END}, 0, ECX); // remove when all callers are decompiled - addhook(0x006C2555, (int)format_string, 0, (int[]){EDI, EAX, ECX, END}, 0, 0); // remove when all callers are decompiled + addhook(0x006E732D, (int)gfx_set_dirty_blocks, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0, 0); // remove when all callers are decompiled + addhook(0x006E7499, (int)gfx_redraw_screen_rect, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0, 0); // remove when 0x6E7FF3 is decompiled + addhook(0x006B752C, (int)ride_crash, 0, (int[]){ EDX, EBX, END }, 0, 0); // remove when all callers are decompiled + addhook(0x0069A42F, (int)peep_window_state_update, 0, (int[]){ ESI, END }, 0, 0); // remove when all callers are decompiled + addhook(0x006BB76E, (int)audio_sound_play_panned, 0, (int[]){EAX, EBX, ECX, EDX, EBP, END}, EAX, 0); // remove when all callers are decompiled + addhook(0x006C42D9, (int)scrolling_text_setup, 0, (int[]){EAX, ECX, EBP, END}, 0, EBX); // remove when all callers are decompiled + addhook(0x006C2321, (int)gfx_get_string_width, 0, (int[]){ESI, END}, 0, ECX); // remove when all callers are decompiled + addhook(0x006C2555, (int)format_string, 0, (int[]){EDI, EAX, ECX, END}, 0, 0); // remove when all callers are decompiled } #if _MSC_VER >= 1900 diff --git a/src/peep/peep.c b/src/peep/peep.c index e714c8de93..2cc1bf15dc 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -392,7 +392,7 @@ static void sub_68F41A(rct_peep *peep, int index) } if (peep->flags & PEEP_FLAGS_EXPLODE && peep->x != (sint16)0x8000){ - sound_play_panned(SOUND_CRASH, 0x8001, peep->x, peep->y, peep->z); + audio_sound_play_panned(SOUND_CRASH, 0x8001, peep->x, peep->y, peep->z); sprite_misc_3_create(peep->x, peep->y, peep->z + 16); sprite_misc_5_create(peep->x, peep->y, peep->z + 16); @@ -1029,7 +1029,7 @@ int peep_update_action(sint16* x, sint16* y, sint16* xy_distance, rct_peep* peep litter_create(peep->x, peep->y, peep->z, peep->sprite_direction, peep->sprite_index & 1); int sound_id = SOUND_COUGH_1 + (scenario_rand() & 3); - sound_play_panned(sound_id, 0x8001, peep->x, peep->y, peep->z); + audio_sound_play_panned(sound_id, 0x8001, peep->x, peep->y, peep->z); invalidate_sprite_2((rct_sprite*)peep); *x = peep->x; @@ -1141,7 +1141,7 @@ void peep_update_sprite_type(rct_peep* peep) ) { bl = 1; - sound_play_panned(SOUND_BALLOON_POP, 0x8001, peep->x, peep->y, peep->z); + audio_sound_play_panned(SOUND_BALLOON_POP, 0x8001, peep->x, peep->y, peep->z); } if (peep->x != SPRITE_LOCATION_NULL) { @@ -3161,7 +3161,7 @@ static void peep_update_ride_sub_state_20(rct_peep* peep){ return; } - sound_play_panned(SOUND_TOILET_FLUSH, 0x8001, peep->x, peep->y, peep->z); + audio_sound_play_panned(SOUND_TOILET_FLUSH, 0x8001, peep->x, peep->y, peep->z); peep->sub_state++; @@ -5265,7 +5265,7 @@ void peep_applause() } // Play applause noise - sound_play_panned(SOUND_APPLAUSE, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2, 0, 0, 0); + audio_sound_play_panned(SOUND_APPLAUSE, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2, 0, 0, 0); } /** @@ -7523,7 +7523,7 @@ static void peep_spend_money(rct_peep *peep, money16 *peep_expend_type, money32 RCT2_GLOBAL(0x00141F568, uint8) = RCT2_GLOBAL(0x0013CA740, uint8); finance_payment(-amount, RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) / 4); - sound_play_panned(SOUND_PURCHASE, 0x8001, peep->x, peep->y, peep->z); + audio_sound_play_panned(SOUND_PURCHASE, 0x8001, peep->x, peep->y, peep->z); } static void peep_set_has_ridden(rct_peep *peep, int rideIndex) @@ -7851,7 +7851,7 @@ static void peep_on_exit_ride(rct_peep *peep, int rideIndex) int laugh = scenario_rand() & 7; if (laugh < 3) { - sound_play_panned(SOUND_LAUGH_1 + laugh, 0x8001, peep->x, peep->y, peep->z); + audio_sound_play_panned(SOUND_LAUGH_1 + laugh, 0x8001, peep->x, peep->y, peep->z); } } diff --git a/src/rct2.c b/src/rct2.c index 560db3ab9a..80ce5c8ba1 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -326,12 +326,12 @@ int check_file_path(int pathId) case PATH_ID_CUSTOM1: if (file != NULL) - ride_music_info_list[36]->length = (uint32)SDL_RWsize(file); // Store file size in music_custom1_size @ 0x009AF164 + gRideMusicInfoList[36]->length = (uint32)SDL_RWsize(file); // Store file size in music_custom1_size @ 0x009AF164 break; case PATH_ID_CUSTOM2: if (file != NULL) - ride_music_info_list[37]->length = (uint32)SDL_RWsize(file); // Store file size in music_custom2_size @ 0x009AF16E + gRideMusicInfoList[37]->length = (uint32)SDL_RWsize(file); // Store file size in music_custom2_size @ 0x009AF16E break; } diff --git a/src/ride/ride.c b/src/ride/ride.c index 573251d0d1..a0afb3d27f 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3278,7 +3278,7 @@ int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint if (screenwidth < 64) { screenwidth = 64; } - int panx = ((x2 / screenwidth) - 0x8000) >> 4; + int pan_x = ((x2 / screenwidth) - 0x8000) >> 4; int y2 = RCT2_GLOBAL(0x00F438A4, rct_viewport*)->y + ((RCT2_GLOBAL(0x009AF5A2, sint16) - RCT2_GLOBAL(0x00F438A4, rct_viewport*)->view_y) >> RCT2_GLOBAL(0x00F438A4, rct_viewport*)->zoom); y2 <<= 16; @@ -3286,12 +3286,12 @@ int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint if (screenheight < 64) { screenheight = 64; } - int pany = ((y2 / screenheight) - 0x8000) >> 4; + int pan_y = ((y2 / screenheight) - 0x8000) >> 4; uint8 vol1 = -1; uint8 vol2 = -1; - int panx2 = panx; - int pany2 = pany; + int panx2 = pan_x; + int pany2 = pan_y; if (pany2 < 0) { pany2 = -pany2; } @@ -3331,20 +3331,20 @@ int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint } int v32 = -(((uint8)(-vol1 - 1) * (uint8)(-vol1 - 1)) / 16) - 700; if (vol1 && v32 >= -4000) { - if (panx > 10000) { - panx = 10000; + if (pan_x > 10000) { + pan_x = 10000; } - if (panx < -10000) { - panx = -10000; + if (pan_x < -10000) { + pan_x = -10000; } rct_ride_music* ride_music = &gRideMusicList[0]; int channel = 0; uint32 a1; - while (ride_music->rideid != rideIndex || ride_music->tuneid != *tuneId) { + while (ride_music->ride_id != rideIndex || ride_music->tune_id != *tuneId) { ride_music++; channel++; if (channel >= AUDIO_MAX_RIDE_MUSIC) { - rct_ride_music_info* ride_music_info = ride_music_info_list[*tuneId]; + rct_ride_music_info* ride_music_info = gRideMusicInfoList[*tuneId]; a1 = position + ride_music_info->offset; goto label51; } @@ -3356,16 +3356,16 @@ int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint } a1 = Mixer_Channel_GetOffset(gRideMusicList[channel].sound_channel); label51: - if (a1 < ride_music_info_list[*tuneId]->length) { + if (a1 < gRideMusicInfoList[*tuneId]->length) { position = a1; rct_ride_music_params* ride_music_params = gRideMusicParamsListEnd; if (ride_music_params < &gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC]) { - ride_music_params->rideid = rideIndex; - ride_music_params->tuneid = *tuneId; + ride_music_params->ride_id = rideIndex; + ride_music_params->tune_id = *tuneId; ride_music_params->offset = a1; ride_music_params->volume = v32; - ride_music_params->pan = panx; - ride_music_params->freq = RCT2_GLOBAL(0x009AF47C, uint16); + ride_music_params->pan = pan_x; + ride_music_params->frequency = RCT2_GLOBAL(0x009AF47C, uint16); gRideMusicParamsListEnd++; } } else { @@ -3375,7 +3375,7 @@ int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint } else { label58: ; - rct_ride_music_info* ride_music_info = ride_music_info_list[*tuneId]; + rct_ride_music_info* ride_music_info = gRideMusicInfoList[*tuneId]; position += ride_music_info->offset; if (position < ride_music_info->length) { return position; @@ -3388,10 +3388,10 @@ int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint return position; } -#define INIT_MUSIC_INFO(pathid, offset, length, unknown) (rct_ride_music_info[]){length, offset, pathid, unknown} +#define INIT_MUSIC_INFO(path_id, offset, length, unknown) (rct_ride_music_info[]){length, offset, path_id, unknown} //0x009AF1C8 -rct_ride_music_info* ride_music_info_list[NUM_DEFAULT_MUSIC_TRACKS] = { +rct_ride_music_info* gRideMusicInfoList[NUM_DEFAULT_MUSIC_TRACKS] = { INIT_MUSIC_INFO(PATH_ID_CSS4, 1378, 8139054, 0), INIT_MUSIC_INFO(PATH_ID_CSS5, 1378, 7796656, 0), INIT_MUSIC_INFO(PATH_ID_CSS6, 1378, 15787850, 0), @@ -3456,9 +3456,9 @@ void ride_music_update_final() int v9 = 1; rct_ride_music_params* ride_music_params = &gRideMusicParamsList[0]; while (ride_music_params < gRideMusicParamsListEnd) { - if (ride_music_params->rideid != (uint8)-1) { - rct_ride_music_info* ride_music_info = ride_music_info_list[ride_music_params->tuneid]; - if (RCT2_ADDRESS(0x009AA0B1, uint8*)[ride_music_info->pathid]) { // file_on_cdrom[] + if (ride_music_params->ride_id != (uint8)-1) { + rct_ride_music_info* ride_music_info = gRideMusicInfoList[ride_music_params->tune_id]; + if (RCT2_ADDRESS(0x009AA0B1, uint8*)[ride_music_info->path_id]) { // file_on_cdrom[] v8++; if (v9 >= ride_music_params->volume) { v9 = ride_music_params->volume; @@ -3471,14 +3471,14 @@ void ride_music_update_final() if (v8 <= 1) { break; } - edi->rideid = -1; + edi->ride_id = -1; } while (1) { int v8 = 0; int v9 = 1; rct_ride_music_params* ride_music_params = &gRideMusicParamsList[0]; while (ride_music_params < gRideMusicParamsListEnd) { - if (ride_music_params->rideid != (uint8)-1) { + if (ride_music_params->ride_id != (uint8)-1) { v8++; if (v9 >= ride_music_params->volume) { v9 = ride_music_params->volume; @@ -3490,17 +3490,17 @@ void ride_music_update_final() if (v8 <= 2) { break; } - edi->rideid = -1; + edi->ride_id = -1; } // stop currently playing music that is not in music params list or not playing? rct_ride_music* ride_music = &gRideMusicList[0]; int channel = 0; do { - if (ride_music->rideid != (uint8)-1) { + if (ride_music->ride_id != (uint8)-1) { rct_ride_music_params* ride_music_params = &gRideMusicParamsList[0]; while (ride_music_params < gRideMusicParamsListEnd) { - if (ride_music_params->rideid == ride_music->rideid && ride_music_params->tuneid == ride_music->tuneid) { + if (ride_music_params->ride_id == ride_music->ride_id && ride_music_params->tune_id == ride_music->tune_id) { int isplaying = Mixer_Channel_IsPlaying(gRideMusicList[channel].sound_channel); if (isplaying) { goto label32; @@ -3510,7 +3510,7 @@ void ride_music_update_final() ride_music_params++; } Mixer_Stop_Channel(gRideMusicList[channel].sound_channel); - ride_music->rideid = -1; + ride_music->ride_id = -1; } label32: ride_music++; @@ -3518,28 +3518,28 @@ void ride_music_update_final() } while(channel < AUDIO_MAX_RIDE_MUSIC); for (rct_ride_music_params* ride_music_params = &gRideMusicParamsList[0]; ride_music_params < gRideMusicParamsListEnd; ride_music_params++) { - if (ride_music_params->rideid != (uint8)-1) { + if (ride_music_params->ride_id != (uint8)-1) { rct_ride_music* ride_music = &gRideMusicList[0]; int channel = 0; - while (ride_music_params->rideid != ride_music->rideid || ride_music_params->tuneid != ride_music->tuneid) { - if (ride_music->rideid == (uint8)-1) { + while (ride_music_params->ride_id != ride_music->ride_id || ride_music_params->tune_id != ride_music->tune_id) { + if (ride_music->ride_id == (uint8)-1) { ebx = channel; } ride_music++; channel++; if (channel >= AUDIO_MAX_RIDE_MUSIC) { - rct_ride_music_info* ride_music_info = ride_music_info_list[ride_music_params->tuneid]; + rct_ride_music_info* ride_music_info = gRideMusicInfoList[ride_music_params->tune_id]; rct_ride_music* ride_music = &gRideMusicList[ebx]; - ride_music->sound_channel = Mixer_Play_Music(ride_music_info->pathid, MIXER_LOOP_NONE, true); + ride_music->sound_channel = Mixer_Play_Music(ride_music_info->path_id, MIXER_LOOP_NONE, true); if (ride_music->sound_channel) { ride_music->volume = ride_music_params->volume; ride_music->pan = ride_music_params->pan; - ride_music->freq = ride_music_params->freq; - ride_music->rideid = ride_music_params->rideid; - ride_music->tuneid = ride_music_params->tuneid; + ride_music->frequency = ride_music_params->frequency; + ride_music->ride_id = ride_music_params->ride_id; + ride_music->tune_id = ride_music_params->tune_id; Mixer_Channel_Volume(ride_music->sound_channel, DStoMixerVolume(ride_music->volume)); Mixer_Channel_Pan(ride_music->sound_channel, DStoMixerPan(ride_music->pan)); - Mixer_Channel_Rate(ride_music->sound_channel, DStoMixerRate(ride_music->freq)); + Mixer_Channel_Rate(ride_music->sound_channel, DStoMixerRate(ride_music->frequency)); int offset = ride_music_params->offset - 10000; if (offset < 0) { offset = 0; @@ -3558,9 +3558,9 @@ void ride_music_update_final() ride_music->pan = ride_music_params->pan; Mixer_Channel_Pan(ride_music->sound_channel, DStoMixerPan(ride_music->pan)); } - if (ride_music_params->freq != ride_music->freq) { - ride_music->freq = ride_music_params->freq; - Mixer_Channel_Rate(ride_music->sound_channel, DStoMixerRate(ride_music->freq)); + if (ride_music_params->frequency != ride_music->frequency) { + ride_music->frequency = ride_music_params->frequency; + Mixer_Channel_Rate(ride_music->sound_channel, DStoMixerRate(ride_music->frequency)); } } diff --git a/src/ride/track.c b/src/ride/track.c index d6f5af362a..ff7bf11948 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3047,7 +3047,7 @@ int save_track_design(uint8 rideIndex){ // Track design files format_string(RCT2_ADDRESS(0x141EE68, char), 2305, NULL); - pause_sounds(); + audio_pause_sounds(); int result = platform_open_common_file_dialog( 0, @@ -3056,7 +3056,7 @@ int save_track_design(uint8 rideIndex){ "*.TD?", RCT2_ADDRESS(0x141EE68, char)); - unpause_sounds(); + audio_unpause_sounds(); if (result == 0){ ride_list_item item = { .type = 0xFD, .entry_index = 0 }; diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index 62edd5903f..4f66083e0b 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -75,25 +75,25 @@ void vehicle_update_sound_params(rct_vehicle* vehicle) *(j + 1) = *j; } i->var_A = v9; - int panx = (RCT2_GLOBAL(0x009AF5A0, sint16) / 2) + (RCT2_GLOBAL(0x009AF5A4, sint16) / 2) - RCT2_GLOBAL(0x00F438A4, rct_viewport*)->view_x; - panx >>= RCT2_GLOBAL(0x00F438A4, rct_viewport*)->zoom; - panx += RCT2_GLOBAL(0x00F438A4, rct_viewport*)->x; + int pan_x = (RCT2_GLOBAL(0x009AF5A0, sint16) / 2) + (RCT2_GLOBAL(0x009AF5A4, sint16) / 2) - RCT2_GLOBAL(0x00F438A4, rct_viewport*)->view_x; + pan_x >>= RCT2_GLOBAL(0x00F438A4, rct_viewport*)->zoom; + pan_x += RCT2_GLOBAL(0x00F438A4, rct_viewport*)->x; uint16 screenwidth = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); if (screenwidth < 64) { screenwidth = 64; } - i->panx = ((((panx << 16) / screenwidth) - 0x8000) >> 4); + i->pan_x = ((((pan_x << 16) / screenwidth) - 0x8000) >> 4); - int pany = (RCT2_GLOBAL(0x009AF5A2, sint16) / 2) + (RCT2_GLOBAL(0x009AF5A6, sint16) / 2) - RCT2_GLOBAL(0x00F438A4, rct_viewport*)->view_y; - pany >>= RCT2_GLOBAL(0x00F438A4, rct_viewport*)->zoom; - pany += RCT2_GLOBAL(0x00F438A4, rct_viewport*)->y; + int pan_y = (RCT2_GLOBAL(0x009AF5A2, sint16) / 2) + (RCT2_GLOBAL(0x009AF5A6, sint16) / 2) - RCT2_GLOBAL(0x00F438A4, rct_viewport*)->view_y; + pan_y >>= RCT2_GLOBAL(0x00F438A4, rct_viewport*)->zoom; + pan_y += RCT2_GLOBAL(0x00F438A4, rct_viewport*)->y; uint16 screenheight = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16); if (screenheight < 64) { screenheight = 64; } - i->pany = ((((pany << 16) / screenheight) - 0x8000) >> 4); + i->pan_y = ((((pan_y << 16) / screenheight) - 0x8000) >> 4); sint32 v19 = vehicle->velocity; @@ -221,43 +221,43 @@ void vehicle_sounds_update() } uint8 vol1 = 0xFF; uint8 vol2 = 0xFF; - sint16 pany = vehicle_sound_params->pany; - if (pany < 0) { - pany = -pany; + sint16 pan_y = vehicle_sound_params->pan_y; + if (pan_y < 0) { + pan_y = -pan_y; } - if (pany > 0xFFF) { - pany = 0xFFF; + if (pan_y > 0xFFF) { + pan_y = 0xFFF; } - pany -= 0x800; - if (pany > 0) { - pany -= 0x400; - pany = -pany; - pany = pany / 4; - vol1 = LOBYTE(pany); - if ((sint8)HIBYTE(pany) != 0) { + pan_y -= 0x800; + if (pan_y > 0) { + pan_y -= 0x400; + pan_y = -pan_y; + pan_y = pan_y / 4; + vol1 = LOBYTE(pan_y); + if ((sint8)HIBYTE(pan_y) != 0) { vol1 = 0xFF; - if ((sint8)HIBYTE(pany) < 0) { + if ((sint8)HIBYTE(pan_y) < 0) { vol1 = 0; } } } - sint16 panx = vehicle_sound_params->panx; - if (panx < 0) { - panx = -panx; + sint16 pan_x = vehicle_sound_params->pan_x; + if (pan_x < 0) { + pan_x = -pan_x; } - if (panx > 0xFFF) { - panx = 0xFFF; + if (pan_x > 0xFFF) { + pan_x = 0xFFF; } - panx -= 0x800; - if (panx > 0) { - panx -= 0x400; - panx = -panx; - panx = panx / 4; - vol2 = LOBYTE(panx); - if ((sint8)HIBYTE(panx) != 0) { + pan_x -= 0x800; + if (pan_x > 0) { + pan_x -= 0x400; + pan_x = -pan_x; + pan_x = pan_x / 4; + vol2 = LOBYTE(pan_x); + if ((sint8)HIBYTE(pan_x) != 0) { vol2 = 0xFF; - if ((sint8)HIBYTE(panx) < 0) { + if ((sint8)HIBYTE(pan_x) < 0) { vol2 = 0; } } @@ -331,7 +331,7 @@ void vehicle_sounds_update() Mixer_Stop_Channel(vehicle_sound->sound1_channel); label69: vehicle_sound->sound1_id = sprite->vehicle.sound1_id; - vehicle_sound->sound1_pan = vehicle_sound_params->panx; + vehicle_sound->sound1_pan = vehicle_sound_params->pan_x; vehicle_sound->sound1_volume = volume; vehicle_sound->sound1_freq = vehicle_sound_params->frequency; uint16 frequency = vehicle_sound_params->frequency; @@ -339,7 +339,7 @@ void vehicle_sounds_update() frequency = (frequency / 2) + 4000; } uint8 looping = RCT2_ADDRESS(0x009AF51E, uint8)[2 * sprite->vehicle.sound1_id]; - int pan = vehicle_sound_params->panx; + int pan = vehicle_sound_params->pan_x; vehicle_sound->sound1_channel = Mixer_Play_Effect(sprite->vehicle.sound1_id, looping ? MIXER_LOOP_INFINITE : MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(pan), DStoMixerRate(frequency), 0); goto label87; } @@ -347,9 +347,9 @@ void vehicle_sounds_update() vehicle_sound->sound1_volume = volume; Mixer_Channel_Volume(vehicle_sound->sound1_channel, DStoMixerVolume(volume)); } - if (vehicle_sound_params->panx != vehicle_sound->sound1_pan) { - vehicle_sound->sound1_pan = vehicle_sound_params->panx; - Mixer_Channel_Pan(vehicle_sound->sound1_channel, DStoMixerPan(vehicle_sound_params->panx)); + if (vehicle_sound_params->pan_x != vehicle_sound->sound1_pan) { + vehicle_sound->sound1_pan = vehicle_sound_params->pan_x; + Mixer_Channel_Pan(vehicle_sound->sound1_channel, DStoMixerPan(vehicle_sound_params->pan_x)); } if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 3) && vehicle_sound_params->frequency != vehicle_sound->sound1_freq) { vehicle_sound->sound1_freq = vehicle_sound_params->frequency; @@ -382,7 +382,7 @@ void vehicle_sounds_update() Mixer_Stop_Channel(vehicle_sound->sound2_channel); label93: vehicle_sound->sound2_id = sprite->vehicle.sound2_id; - vehicle_sound->sound2_pan = vehicle_sound_params->panx; + vehicle_sound->sound2_pan = vehicle_sound_params->pan_x; vehicle_sound->sound2_volume = volume; vehicle_sound->sound2_freq = vehicle_sound_params->frequency; uint16 frequency = vehicle_sound_params->frequency; @@ -394,7 +394,7 @@ void vehicle_sounds_update() frequency = 25700; } uint8 looping = RCT2_ADDRESS(0x009AF51E, uint8)[2 * sprite->vehicle.sound2_id]; - int pan = vehicle_sound_params->panx; + int pan = vehicle_sound_params->pan_x; vehicle_sound->sound2_channel = Mixer_Play_Effect(sprite->vehicle.sound2_id, looping ? MIXER_LOOP_INFINITE : MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(pan), DStoMixerRate(frequency), 0); goto label114; } @@ -402,9 +402,9 @@ void vehicle_sounds_update() Mixer_Channel_Volume(vehicle_sound->sound2_channel, DStoMixerVolume(volume)); vehicle_sound->sound2_volume = volume; } - if (vehicle_sound_params->panx != vehicle_sound->sound2_pan) { - vehicle_sound->sound2_pan = vehicle_sound_params->panx; - Mixer_Channel_Pan(vehicle_sound->sound2_channel, DStoMixerPan(vehicle_sound_params->panx)); + if (vehicle_sound_params->pan_x != vehicle_sound->sound2_pan) { + vehicle_sound->sound2_pan = vehicle_sound_params->pan_x; + Mixer_Channel_Pan(vehicle_sound->sound2_channel, DStoMixerPan(vehicle_sound_params->pan_x)); } if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 3) && vehicle_sound_params->frequency != vehicle_sound->sound2_freq) { vehicle_sound->sound2_freq = vehicle_sound_params->frequency; diff --git a/src/title.c b/src/title.c index 1b8abc325a..bf2d8ff5a3 100644 --- a/src/title.c +++ b/src/title.c @@ -125,8 +125,8 @@ void title_load() window_staff_list_init_vars(); map_update_tile_pointers(); reset_0x69EBE4(); - stop_ride_music(); - stop_crowd_sound(); + audio_stop_ride_music(); + audio_stop_crowd_sound(); //stop_other_sounds(); viewport_init_all(); news_item_init_queue(); @@ -505,7 +505,7 @@ void title_update() for (i = 0; i < numUpdates; i++) { game_logic_update(); } - start_title_music(); + audio_start_title_music(); } RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) &= ~0x80; diff --git a/src/windows/editor_bottom_toolbar.c b/src/windows/editor_bottom_toolbar.c index 4416c40895..8e466117f9 100644 --- a/src/windows/editor_bottom_toolbar.c +++ b/src/windows/editor_bottom_toolbar.c @@ -336,9 +336,9 @@ static int show_save_scenario_dialog(char *resultPath) strcat(filename, ".SC6"); format_string(filterName, STR_RCT2_SCENARIO_FILE, NULL); - pause_sounds(); + audio_pause_sounds(); result = platform_open_common_file_dialog(0, title, filename, "*.SC6", filterName); - unpause_sounds(); + audio_unpause_sounds(); if (result) safe_strncpy(resultPath, filename, MAX_PATH); diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index f5eecca514..f9a00a06b9 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -973,7 +973,7 @@ static void window_editor_object_selection_scroll_mousedown(rct_window *w, int s window_invalidate(w); - sound_play_panned(SOUND_CLICK_1, RCT2_GLOBAL(0x142406C,uint32), 0, 0, 0); + audio_sound_play_panned(SOUND_CLICK_1, RCT2_GLOBAL(0x142406C,uint32), 0, 0, 0); if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { diff --git a/src/windows/error.c b/src/windows/error.c index b93d15da65..c6489d3651 100644 --- a/src/windows/error.c +++ b/src/windows/error.c @@ -138,7 +138,7 @@ void window_error_open(rct_string_id title, rct_string_id message) w->widgets = window_error_widgets; w->error.var_480 = 0; if (!(RCT2_GLOBAL(0x009A8C29, uint8) & 1)) - sound_play_panned(SOUND_ERROR, 0, w->x + (w->width / 2), 0, 0); + audio_sound_play_panned(SOUND_ERROR, 0, w->x + (w->width / 2), 0, 0); } /** diff --git a/src/windows/footpath.c b/src/windows/footpath.c index 3623eb99c2..0456bf11bf 100644 --- a/src/windows/footpath.c +++ b/src/windows/footpath.c @@ -768,7 +768,7 @@ static void window_footpath_place_path_at_point(int x, int y) // bp = RCT2_ADDRESS_COMMAND_MAP_Z // dx = RCT2_ADDRESS_COMMAND_MAP_Y // cx = RCT2_ADDRESS_COMMAND_MAP_X - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); } } @@ -852,7 +852,7 @@ static void window_footpath_construct() cost = footpath_place(type, x, y, z, slope, GAME_COMMAND_FLAG_APPLY); if (cost != MONEY32_UNDEFINED) { - sound_play_panned( + audio_sound_play_panned( SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_X, uint16), diff --git a/src/windows/install_track.c b/src/windows/install_track.c index a81bb58868..b549785c57 100644 --- a/src/windows/install_track.c +++ b/src/windows/install_track.c @@ -159,7 +159,7 @@ static void window_install_track_select(rct_window *w, int index) w->track_list.var_480 = index; - sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); + audio_sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && index == 0) { window_close(w); ride_construct_new(_window_install_track_item); diff --git a/src/windows/map.c b/src/windows/map.c index 7c46d62645..29fbbb79a7 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -1289,7 +1289,7 @@ static void window_map_place_park_entrance_tool_down(int x, int y) if (price == MONEY32_UNDEFINED) return; - sound_play_panned( + audio_sound_play_panned( SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16), diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index f815181b43..3fd6efc81d 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -371,7 +371,7 @@ static void window_maze_construction_entrance_tooldown(int x, int y, rct_window* if (cost == MONEY32_UNDEFINED) return; - sound_play_panned( + audio_sound_play_panned( SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, sint16), @@ -509,6 +509,6 @@ static void window_maze_construction_construct(int direction) _currentTrackBeginX = x; _currentTrackBeginY = y; if (_rideConstructionState != 7) { - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); } } diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index 5fc5406d83..4fea00da60 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -688,7 +688,7 @@ static void window_new_ride_scrollmousedown(rct_window *w, int scrollIndex, int RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_RIDE_LIST_HIGHLIGHTED_ITEM, ride_list_item)[_window_new_ride_current_tab] = item; w->new_ride.selected_ride_id = *((sint16*)&item); - sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); + audio_sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); w->new_ride.selected_ride_countdown = 8; window_invalidate(w); } diff --git a/src/windows/news.c b/src/windows/news.c index 25789b147d..623c6d579c 100644 --- a/src/windows/news.c +++ b/src/windows/news.c @@ -147,7 +147,7 @@ static void window_news_update(rct_window *w) return; window_invalidate(w); - sound_play_panned(SOUND_CLICK_2, w->x + (w->width / 2), 0, 0, 0); + audio_sound_play_panned(SOUND_CLICK_2, w->x + (w->width / 2), 0, 0, 0); j = w->news.var_480; w->news.var_480 = -1; @@ -239,7 +239,7 @@ static void window_news_scrollmousedown(rct_window *w, int scrollIndex, int x, i w->news.var_482 = buttonIndex; w->news.var_484 = 4; window_invalidate(w); - sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); + audio_sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); } } diff --git a/src/windows/options.c b/src/windows/options.c index 660d152380..ee607fbc48 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -552,14 +552,14 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) case WINDOW_OPTIONS_PAGE_AUDIO: switch (widgetIndex) { case WIDX_SOUND_CHECKBOX: - toggle_all_sounds(); + audio_toggle_all_sounds(); config_save_default(); window_invalidate(w); break; case WIDX_MUSIC_CHECKBOX: gConfigSound.ride_music = !gConfigSound.ride_music; if (!gConfigSound.ride_music) { - stop_ride_music(); + audio_stop_ride_music(); } config_save_default(); window_invalidate(w); @@ -1095,9 +1095,9 @@ static void window_options_dropdown(rct_window *w, int widgetIndex, int dropdown window_invalidate(w); } - stop_title_music(); + audio_stop_title_music(); if (dropdownIndex != 0) - start_title_music(); + audio_start_title_music(); break; } break; diff --git a/src/windows/ride.c b/src/windows/ride.c index b6f44dde0b..88086e816a 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -4433,9 +4433,9 @@ static void window_ride_music_mousedown(int widgetIndex, rct_window *w, rct_widg for (i = 0; i < countof(MusicStyleOrder); i++) window_ride_current_music_style_order[numItems++] = MusicStyleOrder[i]; - if (ride_music_info_list[36]->length != 0) + if (gRideMusicInfoList[36]->length != 0) window_ride_current_music_style_order[numItems++] = MUSIC_STYLE_CUSTOM_MUSIC_1; - if (ride_music_info_list[37]->length != 0) + if (gRideMusicInfoList[37]->length != 0) window_ride_current_music_style_order[numItems++] = MUSIC_STYLE_CUSTOM_MUSIC_2; } @@ -4550,7 +4550,7 @@ static void window_ride_music_paint(rct_window *w, rct_drawpixelinfo *dpi) static void cancel_scenery_selection(){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) &= ~(1 << 2); RCT2_GLOBAL(0x9DEA6F, uint8) &= ~(1 << 0); - unpause_sounds(); + audio_unpause_sounds(); rct_window* main_w = window_get_main(); @@ -4579,7 +4579,7 @@ static void setup_scenery_selection(rct_window* w){ RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) |= (1 << 2); RCT2_GLOBAL(0x009DEA6F, uint8) |= 1; - pause_sounds(); + audio_pause_sounds(); rct_window* w_main = window_get_main(); diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index f6704d2175..b3e06f650b 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1594,7 +1594,7 @@ static void window_ride_construction_construct(rct_window *w) return; } - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); if (RCT2_GLOBAL(RCT2_ADDRESS_ABOVE_GROUND_FLAGS, uint8) & TRACK_ELEMENT_LOCATION_IS_UNDERGROUND) { viewport_set_visibility(1); @@ -3554,7 +3554,7 @@ void ride_construction_tooldown_construct(int screenX, int screenY) zAttempts == 0 || z < 0 ) { - sound_play_panned(SOUND_ERROR, RCT2_GLOBAL(0x0142406C, sint32), x, y, z); + audio_sound_play_panned(SOUND_ERROR, RCT2_GLOBAL(0x0142406C, sint32), x, y, z); w = window_find_by_class(WC_RIDE_CONSTRUCTION); if (w != NULL){ tool_set(w, 23, 12); @@ -3571,7 +3571,7 @@ void ride_construction_tooldown_construct(int screenX, int screenY) } else { window_close_by_class(WC_ERROR); - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, _currentTrackBeginX, _currentTrackBeginY, _currentTrackBeginZ); + audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, _currentTrackBeginX, _currentTrackBeginY, _currentTrackBeginZ); break; } } @@ -3626,7 +3626,7 @@ void ride_construction_tooldown_construct(int screenX, int screenY) _currentTrackCovered = saveCurrentTrackCovered; _currentTrackLiftHill = saveCurrentTrackLiftHill; - sound_play_panned(SOUND_ERROR, RCT2_GLOBAL(0x0142406C, sint32), x, y, z); + audio_sound_play_panned(SOUND_ERROR, RCT2_GLOBAL(0x0142406C, sint32), x, y, z); break; } else if (zAttempts >= 0) { z += 16; @@ -3680,7 +3680,7 @@ static void ride_construction_tooldown_entrance_exit(int screenX, int screenY) return; } - sound_play_panned( + audio_sound_play_panned( SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), diff --git a/src/windows/save_prompt.c b/src/windows/save_prompt.c index 0321e20a66..1b05645b3f 100644 --- a/src/windows/save_prompt.c +++ b/src/windows/save_prompt.c @@ -192,7 +192,7 @@ void window_save_prompt_open() // Pause the game RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) |= 2; - pause_sounds(); + audio_pause_sounds(); window_invalidate_by_class(WC_TOP_TOOLBAR); stringId = prompt_mode + STR_LOAD_GAME_PROMPT_TITLE; @@ -212,7 +212,7 @@ static void window_save_prompt_close(rct_window *w) { // Unpause the game RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) &= ~2; - unpause_sounds(); + audio_unpause_sounds(); window_invalidate_by_class(WC_TOP_TOOLBAR); } diff --git a/src/windows/scenery.c b/src/windows/scenery.c index fd42a10f44..ecf4eaed73 100644 --- a/src/windows/scenery.c +++ b/src/windows/scenery.c @@ -795,7 +795,7 @@ void window_scenery_scrollmousedown(rct_window *w, int scrollIndex, int x, int y window_scenery_selected_scenery_by_tab[tabIndex] = sceneryId; window_scenery_is_repaint_scenery_tool_on &= 0xFE; - sound_play_panned(4, (w->width >> 1) + w->x, 0, 0, 0); + audio_sound_play_panned(4, (w->width >> 1) + w->x, 0, 0, 0); w->scenery.hover_counter = -16; RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_COST, uint32) = MONEY32_UNDEFINED; window_invalidate(w); diff --git a/src/windows/title_scenarioselect.c b/src/windows/title_scenarioselect.c index 0a2f57f157..b4a4d1f6f3 100644 --- a/src/windows/title_scenarioselect.c +++ b/src/windows/title_scenarioselect.c @@ -215,7 +215,7 @@ static void window_scenarioselect_scrollmousedown(rct_window *w, int scrollIndex if (y >= 0) continue; - sound_play_panned(SOUND_CLICK_1, w->width / 2 + w->x, 0, 0, 0); + audio_sound_play_panned(SOUND_CLICK_1, w->width / 2 + w->x, 0, 0, 0); scenario_load_and_play(scenario); break; } diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 0d8f55b6da..c40c5ea852 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -1479,7 +1479,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (cost != MONEY32_UNDEFINED){ window_close_by_class(WC_ERROR); - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); success = true; break; } @@ -1507,7 +1507,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (successfulPlacements > 0) { window_close_by_class(WC_ERROR); } else { - sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); } break; } @@ -1518,7 +1518,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_POSITION_THIS_HERE; int cost = game_do_command(gridX, flags, gridY, parameter_2, GAME_COMMAND_PLACE_PATH, parameter_3, 0); if (cost != MONEY32_UNDEFINED) { - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); } break; } @@ -1542,7 +1542,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (cost != MONEY32_UNDEFINED){ window_close_by_class(WC_ERROR); - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); return; } @@ -1556,7 +1556,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) += 8; } - sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); break; } case SCENERY_TYPE_LARGE: @@ -1579,7 +1579,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (cost != MONEY32_UNDEFINED){ window_close_by_class(WC_ERROR); - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); return; } @@ -1593,7 +1593,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) += 8; } - sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); break; } case SCENERY_TYPE_BANNER: @@ -1613,7 +1613,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (cost != MONEY32_UNDEFINED) { int bannerId = regs.edi; - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); window_banner_open(bannerId); } break; diff --git a/src/windows/track_list.c b/src/windows/track_list.c index fc8b3187ca..76c837569b 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -158,7 +158,7 @@ static void window_track_list_select(rct_window *w, int index) w->track_list.var_480 = index; - sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); + audio_sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && index == 0) { window_close(w); ride_construct_new(_window_track_list_item); diff --git a/src/windows/track_place.c b/src/windows/track_place.c index 85365c9dc9..38102c2370 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -541,7 +541,7 @@ static void window_track_place_tooldown(rct_window* w, int widgetIndex, int x, i if (cost != MONEY32_UNDEFINED) { window_close_by_class(WC_ERROR); - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, mapX, mapY, mapZ); + audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, mapX, mapY, mapZ); RCT2_GLOBAL(0x00F440A7, uint8) = rideIndex; if (RCT2_GLOBAL(0x00F4414E, uint8) & 1) { @@ -563,7 +563,7 @@ static void window_track_place_tooldown(rct_window* w, int widgetIndex, int x, i } // Unable to build track - sound_play_panned(SOUND_ERROR, 0x8001, mapX, mapY, mapZ); + audio_sound_play_panned(SOUND_ERROR, 0x8001, mapX, mapY, mapZ); } /** diff --git a/src/world/balloon.c b/src/world/balloon.c index 62de010dfe..b1e5cfbd1a 100644 --- a/src/world/balloon.c +++ b/src/world/balloon.c @@ -26,7 +26,7 @@ void balloon_pop(rct_balloon *balloon) { balloon->popped = 1; balloon->var_26 = 0; - sound_play_panned(SOUND_BALLOON_POP, 0x8001, balloon->x, balloon->y, balloon->z); + audio_sound_play_panned(SOUND_BALLOON_POP, 0x8001, balloon->x, balloon->y, balloon->z); } /** diff --git a/src/world/duck.c b/src/world/duck.c index 9f75a65ac5..a5f6d2d7f0 100644 --- a/src/world/duck.c +++ b/src/world/duck.c @@ -288,7 +288,7 @@ static void duck_update_fly_away(rct_duck *duck) */ void duck_press(rct_duck *duck) { - sound_play_panned(SOUND_QUACK, 0x8001, duck->x, duck->y, duck->z); + audio_sound_play_panned(SOUND_QUACK, 0x8001, duck->x, duck->y, duck->z); } /** diff --git a/src/world/map.c b/src/world/map.c index b75ea436d6..9e6519a358 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1606,7 +1606,7 @@ money32 map_set_land_ownership(uint8 flags, sint16 x1, sint16 y1, sint16 x2, sin y += 16; sint16 z = map_element_height(x, y) & 0xFFFF; - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); return 0; } @@ -1629,7 +1629,7 @@ money32 raise_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b money32 cost = 0; if ((flags & GAME_COMMAND_FLAG_APPLY) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); } uint8 min_height = 0xFF; @@ -1685,7 +1685,7 @@ money32 lower_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b money32 cost = 0; if ((flags & GAME_COMMAND_FLAG_APPLY) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); } uint8 max_height = 0; @@ -1808,7 +1808,7 @@ money32 raise_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags) RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = x; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = z; - sound_play_panned(SOUND_LAYING_OUT_WATER, 0x8001, x, y, z); + audio_sound_play_panned(SOUND_LAYING_OUT_WATER, 0x8001, x, y, z); } // Force ride construction to recheck area @@ -1873,7 +1873,7 @@ money32 lower_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags) RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = x; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = z; - sound_play_panned(SOUND_LAYING_OUT_WATER, 0x8001, x, y, z); + audio_sound_play_panned(SOUND_LAYING_OUT_WATER, 0x8001, x, y, z); } // Force ride construction to recheck area @@ -2030,7 +2030,7 @@ money32 smooth_land(int flags, int centreX, int centreY, int mapLeft, int mapTop // Play sound (only once) if ((flags & GAME_COMMAND_FLAG_APPLY) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { - sound_play_panned(SOUND_PLACE_ITEM, 0x8001, centreX, centreY, centreZ); + audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, centreX, centreY, centreZ); } money32 totalCost = 0; diff --git a/src/world/particle.c b/src/world/particle.c index 1636b3ac42..27fe0221aa 100644 --- a/src/world/particle.c +++ b/src/world/particle.c @@ -71,7 +71,7 @@ void crashed_vehicle_particle_update(rct_crashed_vehicle_particle *particle) if (waterZ != 0 && particle->z >= waterZ && z <= waterZ) { // Splash - sound_play_panned(SOUND_WATER_2, 0x8001, particle->x, particle->y, waterZ); + audio_sound_play_panned(SOUND_WATER_2, 0x8001, particle->x, particle->y, waterZ); crash_splash_create(particle->x, particle->y, waterZ); sprite_remove((rct_sprite*)particle); return; From b736de003e2558be95cd4d5789714c5ea2b7a1d0 Mon Sep 17 00:00:00 2001 From: Dom Light Date: Mon, 16 Nov 2015 22:39:47 +0000 Subject: [PATCH 1099/1173] Sanitize audio.c --- src/audio/audio.c | 310 +++++++++++++++++++++++------------------- src/audio/audio.h | 4 +- src/openrct2.c | 2 +- src/windows/options.c | 2 +- 4 files changed, 174 insertions(+), 144 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index d6721f347f..32d6f999e4 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -32,25 +32,28 @@ #include "../openrct2.h" #include "../util/util.h" -int gAudioDeviceCount; audio_device *gAudioDevices = NULL; +int gAudioDeviceCount; +void *gCrowdSoundChannel = 0; +bool gGameSoundsOff = false; +void *gRainSoundChannel = 0; +rct_ride_music gRideMusicList[AUDIO_MAX_RIDE_MUSIC]; +rct_ride_music_info *gRideMusicInfoList[NUM_DEFAULT_MUSIC_TRACKS]; +rct_ride_music_params gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC]; +rct_ride_music_params *gRideMusicParamsListEnd; +void *gTitleMusicChannel = 0; rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS]; rct_vehicle_sound_params gVehicleSoundParamsList[AUDIO_MAX_VEHICLE_SOUNDS]; rct_vehicle_sound_params *gVehicleSoundParamsListEnd; -rct_ride_music gRideMusicList[AUDIO_MAX_RIDE_MUSIC]; -rct_ride_music_params gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC]; -rct_ride_music_params *gRideMusicParamsListEnd; -void *gCrowdSoundChannel = 0; -void *gTitleMusicChannel = 0; -void *gRainSoundChannel = 0; -bool gGameSoundsOff = false; -void audio_init(int i) +void audio_init() { - if (SDL_Init(SDL_INIT_AUDIO) < 0) { - log_fatal("SDL_Init %s", SDL_GetError()); - exit(-1); - } + int result = SDL_Init(SDL_INIT_AUDIO); + if (result >= 0) + return; + + log_fatal("SDL_Init %s", SDL_GetError()); + exit(-1); } void audio_quit() @@ -58,29 +61,29 @@ void audio_quit() SDL_QuitSubSystem(SDL_INIT_AUDIO); } -/** - * Populates audio devices. - */ -void audio_get_devices() +void audio_populate_devices() { - int i; - if (gAudioDevices != NULL) free(gAudioDevices); gAudioDeviceCount = SDL_GetNumAudioDevices(SDL_FALSE); - if (gAudioDeviceCount > 0) { - gAudioDeviceCount++; - gAudioDevices = malloc(gAudioDeviceCount * sizeof(audio_device)); + if (gAudioDeviceCount <= 0) + return; - safe_strncpy(gAudioDevices[0].name, language_get_string(5510), AUDIO_DEVICE_NAME_SIZE); - for (i = 1; i < gAudioDeviceCount; i++) { - const char *utf8_name = SDL_GetAudioDeviceName(i - 1, SDL_FALSE); - if (utf8_name == NULL) - utf8_name = language_get_string(5511); + gAudioDeviceCount++; + gAudioDevices = malloc(gAudioDeviceCount * sizeof(audio_device)); + safe_strncpy( + gAudioDevices[0].name, + language_get_string(5510), + AUDIO_DEVICE_NAME_SIZE + ); - safe_strncpy(gAudioDevices[i].name, utf8_name, AUDIO_DEVICE_NAME_SIZE); - } + for (int i = 1; i < gAudioDeviceCount; i++) { + const char *utf8Name = SDL_GetAudioDeviceName(i - 1, SDL_FALSE); + if (utf8Name == NULL) + utf8Name = language_get_string(5511); + + safe_strncpy(gAudioDevices[i].name, utf8Name, AUDIO_DEVICE_NAME_SIZE); } } @@ -94,69 +97,86 @@ void audio_get_devices() * @param y (dx) * @param z (bp) */ -int audio_sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z) +int audio_sound_play_panned(int soundId, int ebx, sint16 x, sint16 y, sint16 z) { - if (!gGameSoundsOff) { - int volumedown = 0; - int volume = 0; - if (ebx == 0x8001) { - rct_map_element* mapelement = map_get_surface_element_at(x / 32, y / 32); - if (mapelement) { - if ((mapelement->base_height * 8) - 5 > z) { - volumedown = 10; - } + if (gGameSoundsOff) + return 0; + + int volume = 0; + if (ebx == 0x8001) { + int volumeDown = 0; + rct_map_element *element = map_get_surface_element_at(x / 32, y / 32); + if (element && (element->base_height * 8) - 5 > z) + volumeDown = 10; + + sint16 rx; + sint16 ry; + switch (get_current_rotation()) { + case 0: + rx = y - x; + ry = ((y + x) / 2) - z; + break; + case 1: + rx = -x - y; + ry = ((y - x) / 2) - z; + break; + case 2: + rx = x - y; + ry = ((-y - x) / 2) - z; + break; + case 3: + rx = y + x; + ry = ((x - y) / 2) - z; + break; + } + + rct_window *window = RCT2_GLOBAL( + RCT2_ADDRESS_NEW_WINDOW_PTR, + rct_window* + ); + while (true) { + window--; + if (window < RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window)) { + break; } - sint16 rx; - sint16 ry; - switch (get_current_rotation()) { - case 0: - rx = y - x; - ry = ((y + x) / 2) - z; - break; - case 1: - rx = -x - y; - ry = ((y - x) / 2) - z; - break; - case 2: - rx = x - y; - ry = ((-y - x) / 2) - z; - break; - case 3: - rx = y + x; - ry = ((x - y) / 2) - z; - break; - } - rct_window* window = RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); - while (1) { - window--; - if (window < RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window)) { - break; - } - rct_viewport* viewport = window->viewport; - if (viewport && viewport->flags & VIEWPORT_FLAG_SOUND_ON) { - sint16 vy = ry - viewport->view_y; - sint16 vx = rx - viewport->view_x; - ebx = viewport->x + (vx >> viewport->zoom); - volume = RCT2_ADDRESS(0x0099282C, int)[sound_id] + ((-1024 * viewport->zoom - 1) << volumedown) + 1; - if (vy < 0 || vy >= viewport->view_height || vx < 0 || vx >= viewport->view_width || volume < -10000) { - return sound_id; - } - } + rct_viewport *viewport = window->viewport; + if (viewport && viewport->flags & VIEWPORT_FLAG_SOUND_ON) { + sint16 vy = ry - viewport->view_y; + sint16 vx = rx - viewport->view_x; + ebx = viewport->x + (vx >> viewport->zoom); + volume = RCT2_ADDRESS(0x0099282C, int)[soundId] + + ((-1024 * viewport->zoom - 1) << volumeDown) + 1; + + if (vy < 0 + || vy >= viewport->view_height + || vx < 0 + || vx >= viewport->view_width + || volume < -10000) + return soundId; } } - int pan; - if (ebx == (sint16)0x8000) { - pan = 0; - } else { - int x2 = ebx << 16; - uint16 screenwidth = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16); - if (screenwidth < 64) { - screenwidth = 64; - } - pan = ((x2 / screenwidth) - 0x8000) >> 4; - } - Mixer_Play_Effect(sound_id, MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(pan), 1, 1); } + + int pan = 0; + if (ebx != (sint16)0x8000) { + int x2 = ebx << 16; + uint16 screenWidth = max( + 64, + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) + ); + + pan = ((x2 / screenWidth) - 0x8000) >> 4; + } + + Mixer_Play_Effect( + soundId, + MIXER_LOOP_NONE, + DStoMixerVolume(volume), + DStoMixerPan(pan), + 1, + 1 + ); + return 0; } @@ -166,31 +186,33 @@ int audio_sound_play_panned(int sound_id, int ebx, sint16 x, sint16 y, sint16 z) */ void audio_start_title_music() { - int musicPathId; - switch (gConfigSound.title_music) { - default: + if (gGameSoundsOff || !RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) { + audio_stop_title_music(); return; + } + + if (gTitleMusicChannel) + return; + + int pathId; + switch (gConfigSound.title_music) { case 1: - musicPathId = PATH_ID_CSS50; + pathId = PATH_ID_CSS50; break; case 2: - musicPathId = PATH_ID_CSS17; + pathId = PATH_ID_CSS17; break; case 3: if (rand() & 1) - musicPathId = PATH_ID_CSS50; + pathId = PATH_ID_CSS50; else - musicPathId = PATH_ID_CSS17; + pathId = PATH_ID_CSS17; break; + default: + return; } - if (!gGameSoundsOff && RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) { - if (!gTitleMusicChannel) { - gTitleMusicChannel = Mixer_Play_Music(musicPathId, MIXER_LOOP_INFINITE, true); - } - } else { - audio_stop_title_music(); - } + gTitleMusicChannel = Mixer_Play_Music(pathId, MIXER_LOOP_INFINITE, true); } /** @@ -200,13 +222,15 @@ void audio_start_title_music() void audio_stop_ride_music() { for (int i = 0; i < AUDIO_MAX_RIDE_MUSIC; i++) { - rct_ride_music* ride_music = &gRideMusicList[i]; - if (ride_music->ride_id != (uint8)-1) { - if (ride_music->sound_channel) { - Mixer_Stop_Channel(ride_music->sound_channel); - } - ride_music->ride_id = -1; + rct_ride_music *rideMusic = &gRideMusicList[i]; + if (rideMusic->ride_id == (uint8)-1) + continue; + + if (rideMusic->sound_channel) { + Mixer_Stop_Channel(rideMusic->sound_channel); } + + rideMusic->ride_id = -1; } } @@ -248,22 +272,22 @@ void stop_rain_sound() */ void audio_init1() { - int devicenum = 0; - audio_init2(devicenum); + int deviceNum = 0; + audio_init2(deviceNum); - for(int m = 0; m < countof(gRideMusicInfoList); m++) { - rct_ride_music_info* ride_music_info = gRideMusicInfoList[m]; - const utf8* path = get_file_path(ride_music_info->path_id); + for (int m = 0; m < countof(gRideMusicInfoList); m++) { + rct_ride_music_info *rideMusicInfo = gRideMusicInfoList[m]; + const utf8 *path = get_file_path(rideMusicInfo->path_id); SDL_RWops *file = SDL_RWFromFile(path, "rb"); - if (file != NULL) { - uint32 head; - SDL_RWread(file, &head, sizeof(head), 1); - SDL_RWclose(file); - RCT2_GLOBAL(0x014241BC, uint32) = 0; - if (head == 0x78787878) { - ride_music_info->length = 0; - } - } + if (file == NULL) + continue; + + uint32 head; + SDL_RWread(file, &head, sizeof(head), 1); + SDL_RWclose(file); + RCT2_GLOBAL(0x014241BC, uint32) = 0; + if (head == 0x78787878) + rideMusicInfo->length = 0; } } @@ -275,14 +299,15 @@ void audio_init2(int device) { audio_close(); for (int i = 0; i < AUDIO_MAX_VEHICLE_SOUNDS; i++) { - rct_vehicle_sound* vehicle_sound = &gVehicleSoundList[i]; - vehicle_sound->id = -1; + rct_vehicle_sound *vehicleSound = &gVehicleSoundList[i]; + vehicleSound->id = -1; } + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = device; config_save_default(); for (int i = 0; i < AUDIO_MAX_RIDE_MUSIC; i++) { - rct_ride_music* ride_music = &gRideMusicList[i]; - ride_music->ride_id = -1; + rct_ride_music *rideMusic = &gRideMusicList[i]; + rideMusic->ride_id = -1; } } @@ -302,11 +327,11 @@ void audio_close() /* rct2: 0x006BAB8A */ void audio_toggle_all_sounds(){ gConfigSound.sound = !gConfigSound.sound; - if (!gConfigSound.sound) { + if (gConfigSound.sound) + audio_unpause_sounds(); + else { audio_stop_title_music(); audio_pause_sounds(); - } else { - audio_unpause_sounds(); } } @@ -338,18 +363,23 @@ void audio_unpause_sounds() */ void audio_stop_vehicle_sounds() { - if (!gOpenRCT2Headless && RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) != -1) { - for (int i = 0; i < countof(gVehicleSoundList); i++) { - rct_vehicle_sound* vehicle_sound = &gVehicleSoundList[i]; - if (vehicle_sound->id != 0xFFFF) { - if (vehicle_sound->sound1_id != 0xFFFF) { - Mixer_Stop_Channel(vehicle_sound->sound1_channel); - } - if (vehicle_sound->sound2_id != 0xFFFF) { - Mixer_Stop_Channel(vehicle_sound->sound2_channel); - } - } - vehicle_sound->id = 0xFFFF; + if (gOpenRCT2Headless + || RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) == -1) + return; + + for (int i = 0; i < countof(gVehicleSoundList); i++) { + rct_vehicle_sound *vehicleSound = &gVehicleSoundList[i]; + if (vehicleSound->id == 0xFFFF) + continue; + + if (vehicleSound->sound1_id != 0xFFFF) { + Mixer_Stop_Channel(vehicleSound->sound1_channel); } + + if (vehicleSound->sound2_id != 0xFFFF) { + Mixer_Stop_Channel(vehicleSound->sound2_channel); + } + + vehicleSound->id = 0xFFFF; } } diff --git a/src/audio/audio.h b/src/audio/audio.h index 6ec60fc572..ceb42682ca 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -155,7 +155,7 @@ extern void *gCrowdSoundChannel; extern bool gGameSoundsOff; extern void *gRainSoundChannel; extern rct_ride_music gRideMusicList[AUDIO_MAX_RIDE_MUSIC]; -extern rct_ride_music_info* gRideMusicInfoList[NUM_DEFAULT_MUSIC_TRACKS]; +extern rct_ride_music_info *gRideMusicInfoList[NUM_DEFAULT_MUSIC_TRACKS]; extern rct_ride_music_params gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC]; extern rct_ride_music_params *gRideMusicParamsListEnd; extern void *gTitleMusicChannel; @@ -164,11 +164,11 @@ extern rct_vehicle_sound_params gVehicleSoundParamsList[AUDIO_MAX_VEHICLE_SOUNDS extern rct_vehicle_sound_params *gVehicleSoundParamsListEnd; void audio_close(); -void audio_get_devices(); void audio_init(); void audio_init1(); void audio_init2(int device); void audio_pause_sounds(); +void audio_populate_devices(); void audio_quit(); int audio_sound_play_panned(int soundId, int ebx, sint16 x, sint16 y, sint16 z); void audio_start_title_music(); diff --git a/src/openrct2.c b/src/openrct2.c index 8c920fcb0a..4bebe17b65 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -249,7 +249,7 @@ bool openrct2_initialise() get_system_info(); if (!gOpenRCT2Headless) { audio_init(); - audio_get_devices(); + audio_populate_devices(); } if (!language_open(gConfigGeneral.language)) { diff --git a/src/windows/options.c b/src/windows/options.c index ee607fbc48..95778854e2 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -852,7 +852,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* case WINDOW_OPTIONS_PAGE_AUDIO: switch (widgetIndex) { case WIDX_SOUND_DROPDOWN: - audio_get_devices(); + audio_populate_devices(); // populate the list with the sound devices for (i = 0; i < gAudioDeviceCount; i++) { From b9d48d2f9b74a99d4709383d5e9fad63d64dd730 Mon Sep 17 00:00:00 2001 From: Dom Light Date: Tue, 17 Nov 2015 00:42:23 +0000 Subject: [PATCH 1100/1173] Document audio.h --- src/audio/audio.c | 42 +++++++++++++---------- src/audio/audio.h | 79 +++++++++++++++++++++++++++++++++++++------ src/rct2.c | 2 +- src/windows/options.c | 2 +- src/world/climate.c | 10 ++---- 5 files changed, 97 insertions(+), 38 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 32d6f999e4..e3606baebf 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -46,6 +46,8 @@ rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS]; rct_vehicle_sound_params gVehicleSoundParamsList[AUDIO_MAX_VEHICLE_SOUNDS]; rct_vehicle_sound_params *gVehicleSoundParamsListEnd; +void audio_stop_channel(void **channel); + void audio_init() { int result = SDL_Init(SDL_INIT_AUDIO); @@ -240,10 +242,7 @@ void audio_stop_ride_music() */ void audio_stop_crowd_sound() { - if (gCrowdSoundChannel) { - Mixer_Stop_Channel(gCrowdSoundChannel); - gCrowdSoundChannel = 0; - } + audio_stop_channel(&gCrowdSoundChannel); } /** @@ -252,28 +251,35 @@ void audio_stop_crowd_sound() */ void audio_stop_title_music() { - if (gTitleMusicChannel) { - Mixer_Stop_Channel(gTitleMusicChannel); - gTitleMusicChannel = 0; - } + audio_stop_channel(&gTitleMusicChannel); } -void stop_rain_sound() +void audio_stop_rain_sound() { - if (gRainSoundChannel) { - Mixer_Stop_Channel(gRainSoundChannel); - gRainSoundChannel = 0; - } + audio_stop_channel(&gRainSoundChannel); +} + +/** +* Stops the specified audio channel from playing. +* @param channel The channel to stop. +*/ +void audio_stop_channel(void **channel) +{ + if (!*channel) + return; + + Mixer_Stop_Channel(*channel); + *channel = 0; } /** * * rct2: 0x006BA8E0 */ -void audio_init1() +void audio_init_ride_sounds_and_info() { int deviceNum = 0; - audio_init2(deviceNum); + audio_init_ride_sounds(deviceNum); for (int m = 0; m < countof(gRideMusicInfoList); m++) { rct_ride_music_info *rideMusicInfo = gRideMusicInfoList[m]; @@ -295,7 +301,7 @@ void audio_init1() * * rct2: 0x006BA9B5 */ -void audio_init2(int device) +void audio_init_ride_sounds(int device) { audio_close(); for (int i = 0; i < AUDIO_MAX_VEHICLE_SOUNDS; i++) { @@ -320,7 +326,7 @@ void audio_close() audio_stop_crowd_sound(); audio_stop_title_music(); audio_stop_ride_music(); - stop_rain_sound(); + audio_stop_rain_sound(); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = -1; } @@ -345,7 +351,7 @@ void audio_pause_sounds() audio_stop_vehicle_sounds(); audio_stop_ride_music(); audio_stop_crowd_sound(); - stop_rain_sound(); + audio_stop_rain_sound(); } /** diff --git a/src/audio/audio.h b/src/audio/audio.h index ceb42682ca..48a488a52e 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -29,11 +29,11 @@ #define AUDIO_MAX_VEHICLE_SOUNDS 14 #define NUM_DEFAULT_MUSIC_TRACKS 46 -typedef struct { +typedef struct audio_device { char name[AUDIO_DEVICE_NAME_SIZE]; } audio_device; -typedef struct { +typedef struct rct_ride_music { uint8 ride_id; uint8 tune_id; sint16 volume; @@ -42,14 +42,14 @@ typedef struct { void* sound_channel; } rct_ride_music; -typedef struct { +typedef struct rct_ride_music_info { uint32 length; uint32 offset; uint8 path_id; uint8 var_9; } rct_ride_music_info; -typedef struct { +typedef struct rct_ride_music_params { uint8 ride_id; uint8 tune_id; sint32 offset; @@ -58,7 +58,7 @@ typedef struct { uint16 frequency; } rct_ride_music_params; -typedef struct { +typedef struct rct_vehicle_sound { uint16 id; sint16 volume; uint16 sound1_id; @@ -73,7 +73,7 @@ typedef struct { void* sound2_channel; } rct_vehicle_sound; -typedef struct { +typedef struct rct_vehicle_sound_params { uint16 id; sint16 pan_x; sint16 pan_y; @@ -82,7 +82,7 @@ typedef struct { uint16 var_A; } rct_vehicle_sound_params; -typedef enum { +typedef enum RCT2_SOUND { SOUND_LIFT_1 = 0, SOUND_TRACK_FRICTION_1 = 1, SOUND_LIFT_2 = 2, @@ -163,20 +163,79 @@ extern rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS]; extern rct_vehicle_sound_params gVehicleSoundParamsList[AUDIO_MAX_VEHICLE_SOUNDS]; extern rct_vehicle_sound_params *gVehicleSoundParamsListEnd; +/** +* Deregisters the audio device. +*/ void audio_close(); +/* +* Initialises the audio subsystem. +*/ void audio_init(); -void audio_init1(); -void audio_init2(int device); +/** +* Loads the ride sounds and info. +*/ +void audio_init_ride_sounds_and_info(); +/** +Loads the ride sounds. +*/ +void audio_init_ride_sounds(int device); +/** +* Temporarily stops playing sounds until audio_unpause_sounds() is called. +*/ void audio_pause_sounds(); +/** +* Populates the gAudioDevices array with the available audio devices. +*/ void audio_populate_devices(); +/** +* Terminates the audio subsystem. +* This appears to be unused. +*/ void audio_quit(); -int audio_sound_play_panned(int soundId, int ebx, sint16 x, sint16 y, sint16 z); +/** Plays the specified sound effect at the specified virtual location. +* @param soundId The sound effect to play. +* @param mode If set to 0x8001, play the sound at the specified location; if +* set to 0x8000, play the sound at the center of the viewport; if set to +* anything else, use the value of mode as a relative position to the center of +* the viewport. +* @param x The x coordinate of the location. +* @param y The y coordinate of the location. +* @param z The z coordinate of the location. +* @return 0 if the sound was played successfully, otherwise, soundId. +*/ +int audio_sound_play_panned(int soundId, int mode, sint16 x, sint16 y, sint16 z); +/** +* Starts playing the title music. +*/ void audio_start_title_music(); +/** +* Stops the crowd sound effect from playing. +*/ void audio_stop_crowd_sound(); +/** +* Stops the rain sound effect from playing. +*/ +void audio_stop_rain_sound(); +/** +* Stops ride music from playing. +*/ void audio_stop_ride_music(); +/** +* Stops the title music from playing. +*/ void audio_stop_title_music(); +/** +* Stops vehicle sounds from playing. +*/ void audio_stop_vehicle_sounds(); +/** +* Toggles whether all sounds should be played. +*/ void audio_toggle_all_sounds(); +/** +* Resumes playing sounds that had been paused by a call to +* audio_pause_sounds(). +*/ void audio_unpause_sounds(); #endif diff --git a/src/rct2.c b/src/rct2.c index 80ce5c8ba1..7781f5af7b 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -104,7 +104,7 @@ int rct2_init() font_sprite_initialise_characters(); if (!gOpenRCT2Headless) { platform_init(); - audio_init1(); + audio_init_ride_sounds_and_info(); } viewport_init_all(); news_item_init_queue(); diff --git a/src/windows/options.c b/src/windows/options.c index 95778854e2..6fcb3a819b 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -1069,7 +1069,7 @@ static void window_options_dropdown(rct_window *w, int widgetIndex, int dropdown case WINDOW_OPTIONS_PAGE_AUDIO: switch (widgetIndex) { case WIDX_SOUND_DROPDOWN: - audio_init2(dropdownIndex); + audio_init_ride_sounds(dropdownIndex); if (dropdownIndex < gAudioDeviceCount) { if (dropdownIndex == 0) { Mixer_Init(NULL); diff --git a/src/world/climate.c b/src/world/climate.c index 5692acb13b..ed1cac08d2 100644 --- a/src/world/climate.c +++ b/src/world/climate.c @@ -108,10 +108,7 @@ void climate_reset(int climate) _lightningTimer = 0; _thunderTimer = 0; if (_rainVolume != 1){ - if (gRainSoundChannel) { - Mixer_Stop_Channel(gRainSoundChannel); - gRainSoundChannel = 0; - } + audio_stop_rain_sound(); _rainVolume = 1; } @@ -272,10 +269,7 @@ static void climate_update_rain_sound() Mixer_Channel_Volume(gRainSoundChannel, DStoMixerVolume(_rainVolume)); } } else { - if (gRainSoundChannel) { - Mixer_Stop_Channel(gRainSoundChannel); - gRainSoundChannel = 0; - } + audio_stop_rain_sound(); _rainVolume = 1; } } From 9300c7d372a6d0ab4fe3b8193844a363de50bf9b Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 17 Nov 2015 04:00:18 +0000 Subject: [PATCH 1101/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/korean.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/data/language/korean.txt b/data/language/korean.txt index 11e08e4aad..514c3b3fae 100644 --- a/data/language/korean.txt +++ b/data/language/korean.txt @@ -2741,8 +2741,8 @@ STR_2732 :{COMMA16}ft STR_2733 :{COMMA16}m STR_2734 :{COMMA16}mph STR_2735 :{COMMA16}km/h -STR_2736 :{COMMA16}년 {MONTH} -STR_2737 :{COMMA16}년 {MONTH} {STRINGID} +STR_2736 :{POP16}{COMMA16}년 {PUSH16}{PUSH16}{MONTH} +STR_2737 :{STRINGID} {POP16}{COMMA16}년 {PUSH16}{PUSH16}{MONTH} STR_2738 :타이틀 스크린 음악: STR_2739 :없음 STR_2740 :롤러코스터 타이쿤 1 @@ -3915,6 +3915,7 @@ STR_5575 :최대 플레이어 수: STR_5576 :포트: STR_5577 :대한민국 원 (₩) STR_5578 :러시아 루블 (R) +STR_5579 :창 크기 조절 배수: ##################### # Rides/attractions # From c1fe54790165d5ac7006b213b47d63b69da733c1 Mon Sep 17 00:00:00 2001 From: Kevin Date: Tue, 17 Nov 2015 12:25:45 +0100 Subject: [PATCH 1102/1173] Add FNM_PATHNAME flag for fnmatch --- src/platform/linux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/linux.c b/src/platform/linux.c index 9491556700..bce343888c 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -199,7 +199,7 @@ static int winfilter(const struct dirent *d) name_upper[i] = (char)toupper(d->d_name[i]); } name_upper[entry_length] = '\0'; - bool match = fnmatch(g_file_pattern, name_upper, 0) == 0; + bool match = fnmatch(g_file_pattern, name_upper, FNM_PATHNAME) == 0; //log_warning("trying matching filename %s, result = %d", name_upper, match); free(name_upper); return match; From 063a568a7294d28a324e4aeb5abc10fb5f3af775 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Tue, 17 Nov 2015 00:16:54 +0100 Subject: [PATCH 1103/1173] Searching through rides now also checks their type. --- src/windows/editor_object_selection.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index f5eecca514..c59ce1910a 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -218,7 +218,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct static int get_object_from_object_selection(uint8 object_type, int y, uint8 *object_selection_flags, rct_object_entry **installed_entry); static void window_editor_object_selection_manage_tracks(); static void editor_load_selected_objects(); -static bool filter_string(rct_object_entry *entry); +static bool filter_string(rct_object_entry *entry, rct_object_filters *filter); static bool filter_source(rct_object_entry *entry); static bool filter_chunks(rct_object_entry *entry, rct_object_filters *filter); static void filter_update_counts(); @@ -333,7 +333,7 @@ static void visible_list_refresh(rct_window *w) rct_object_filters *filter = get_object_filter(i); int type = entry->flags & 0x0F; int source = (entry->flags & 0xF0) >> 4; - if (type == w->selected_tab && !(*itemFlags & OBJECT_SELECTION_FLAG_6) && filter_source(entry) && filter_string(entry) && filter_chunks(entry, filter)) { + if (type == w->selected_tab && !(*itemFlags & OBJECT_SELECTION_FLAG_6) && filter_source(entry) && filter_string(entry, filter) && filter_chunks(entry, filter)) { currentListItem->entry = entry; currentListItem->filter = filter; currentListItem->flags = itemFlags; @@ -2010,26 +2010,37 @@ static void window_editor_object_selection_textinput(rct_window *w, int widgetIn window_invalidate(w); } -static bool filter_string(rct_object_entry *entry) +static bool filter_string(rct_object_entry *entry, rct_object_filters *filter) { - if (_filter_string[0] == 0) + // Nothing to search for + if (_filter_string[0] == '\0') return true; + // Object doesn't have a name char *name = object_get_name(entry); if (name[0] == 0) return false; + // Get ride type + char *ride_type = language_get_string(2 + filter->ride.ride_type); + + // Get object name (ride/vehicle for rides) and type name (rides only) char name_lower[MAX_PATH]; + char type_lower[MAX_PATH]; char filter_lower[sizeof(_filter_string)]; safe_strncpy(name_lower, name, MAX_PATH); + safe_strncpy(type_lower, ride_type, MAX_PATH); safe_strncpy(filter_lower, _filter_string, sizeof(_filter_string)); + // Make use of lowercase characters only for (int i = 0; i < (int)strlen(name_lower); i++) name_lower[i] = (char)tolower(name_lower[i]); + for (int i = 0; i < (int)strlen(type_lower); i++) + type_lower[i] = (char)tolower(type_lower[i]); for (int i = 0; i < (int)strlen(filter_lower); i++) filter_lower[i] = (char)tolower(filter_lower[i]); - return strstr(name_lower, filter_lower) != NULL; + return strstr(name_lower, filter_lower) != NULL || (((entry->flags & 0x0F) == OBJECT_TYPE_RIDE) && strstr(type_lower, filter_lower) != NULL); } static bool filter_source(rct_object_entry *entry) @@ -2072,7 +2083,7 @@ static void filter_update_counts() for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i) { filter = get_object_filter(RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32) - i); type = installed_entry->flags & 0xF; - if (filter_source(installed_entry) && filter_string(installed_entry) && filter_chunks(installed_entry, filter)) { + if (filter_source(installed_entry) && filter_string(installed_entry, filter) && filter_chunks(installed_entry, filter)) { _filter_object_counts[type]++; } installed_entry = object_get_next(installed_entry); From 504f551eecbe73591854fb014a205a76e9f65283 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Tue, 17 Nov 2015 09:18:03 +0100 Subject: [PATCH 1104/1173] Avoiding the use of strlen --- src/windows/editor_object_selection.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index c59ce1910a..7dfb58b102 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -2033,11 +2033,11 @@ static bool filter_string(rct_object_entry *entry, rct_object_filters *filter) safe_strncpy(filter_lower, _filter_string, sizeof(_filter_string)); // Make use of lowercase characters only - for (int i = 0; i < (int)strlen(name_lower); i++) + for (int i = 0; name_lower[i] != '\0'; i++) name_lower[i] = (char)tolower(name_lower[i]); - for (int i = 0; i < (int)strlen(type_lower); i++) + for (int i = 0; type_lower[i] != '\0'; i++) type_lower[i] = (char)tolower(type_lower[i]); - for (int i = 0; i < (int)strlen(filter_lower); i++) + for (int i = 0; filter_lower[i] != '\0'; i++) filter_lower[i] = (char)tolower(filter_lower[i]); return strstr(name_lower, filter_lower) != NULL || (((entry->flags & 0x0F) == OBJECT_TYPE_RIDE) && strstr(type_lower, filter_lower) != NULL); From 68b0068a2282546db55a768d4b41eff1d69a5166 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Tue, 17 Nov 2015 09:19:01 +0100 Subject: [PATCH 1105/1173] Resolved warnings --- src/windows/editor_object_selection.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 7dfb58b102..eb943471d8 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -2018,11 +2018,11 @@ static bool filter_string(rct_object_entry *entry, rct_object_filters *filter) // Object doesn't have a name char *name = object_get_name(entry); - if (name[0] == 0) + if (name[0] == '\0') return false; // Get ride type - char *ride_type = language_get_string(2 + filter->ride.ride_type); + const char *ride_type = language_get_string(2 + filter->ride.ride_type); // Get object name (ride/vehicle for rides) and type name (rides only) char name_lower[MAX_PATH]; From 6d3eaafe2fd2ef2f988a730478147bb63edc4472 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 17 Nov 2015 19:04:43 +0000 Subject: [PATCH 1106/1173] Fix #2327. Fix no entry signs. Issue was caused by mistakenly not stopping searching for tiles after finding the correct one. Mistake made during refactoring --- src/world/map.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/world/map.c b/src/world/map.c index 1a317288f1..d1b53ad79e 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -4721,6 +4721,7 @@ void game_command_set_banner_style(int* eax, int* ebx, int* ecx, int* edx, int* continue; bannerFound = true; + break; } while (!map_element_is_last_for_tile(map_element++)); if (bannerFound == false) { From 72b6a1e74b1681cb62aa5aa4f363eecc24f3d4a0 Mon Sep 17 00:00:00 2001 From: Dom Light Date: Tue, 17 Nov 2015 20:01:30 +0000 Subject: [PATCH 1107/1173] Add parens and use coordinate_3d_to_2d in audio.c --- src/audio/audio.c | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index e3606baebf..3082fceffa 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -111,26 +111,13 @@ int audio_sound_play_panned(int soundId, int ebx, sint16 x, sint16 y, sint16 z) if (element && (element->base_height * 8) - 5 > z) volumeDown = 10; - sint16 rx; - sint16 ry; - switch (get_current_rotation()) { - case 0: - rx = y - x; - ry = ((y + x) / 2) - z; - break; - case 1: - rx = -x - y; - ry = ((y - x) / 2) - z; - break; - case 2: - rx = x - y; - ry = ((-y - x) / 2) - z; - break; - case 3: - rx = y + x; - ry = ((x - y) / 2) - z; - break; - } + uint8 rotation = get_current_rotation(); + rct_xyz16 pos3; + pos3.x = x; + pos3.y = y; + pos3.z = z; + + rct_xy16 pos2 = coordinate_3d_to_2d(&pos3, rotation); rct_window *window = RCT2_GLOBAL( RCT2_ADDRESS_NEW_WINDOW_PTR, @@ -143,8 +130,8 @@ int audio_sound_play_panned(int soundId, int ebx, sint16 x, sint16 y, sint16 z) } rct_viewport *viewport = window->viewport; if (viewport && viewport->flags & VIEWPORT_FLAG_SOUND_ON) { - sint16 vy = ry - viewport->view_y; - sint16 vx = rx - viewport->view_x; + sint16 vy = pos2.y - viewport->view_y; + sint16 vx = pos2.x - viewport->view_x; ebx = viewport->x + (vx >> viewport->zoom); volume = RCT2_ADDRESS(0x0099282C, int)[soundId] + ((-1024 * viewport->zoom - 1) << volumeDown) + 1; @@ -188,7 +175,7 @@ int audio_sound_play_panned(int soundId, int ebx, sint16 x, sint16 y, sint16 z) */ void audio_start_title_music() { - if (gGameSoundsOff || !RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) { + if (gGameSoundsOff || !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO)) { audio_stop_title_music(); return; } From bbc58830f399585e689a70c3c217396b8ddb2e44 Mon Sep 17 00:00:00 2001 From: Dom Light Date: Tue, 17 Nov 2015 20:07:39 +0000 Subject: [PATCH 1108/1173] Allow lines to be 128 characters --- src/audio/audio.c | 52 +++++++++++------------------------------------ 1 file changed, 12 insertions(+), 40 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 3082fceffa..dd7daf0bb9 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -74,11 +74,7 @@ void audio_populate_devices() gAudioDeviceCount++; gAudioDevices = malloc(gAudioDeviceCount * sizeof(audio_device)); - safe_strncpy( - gAudioDevices[0].name, - language_get_string(5510), - AUDIO_DEVICE_NAME_SIZE - ); + safe_strncpy(gAudioDevices[0].name, language_get_string(5510), AUDIO_DEVICE_NAME_SIZE); for (int i = 1; i < gAudioDeviceCount; i++) { const char *utf8Name = SDL_GetAudioDeviceName(i - 1, SDL_FALSE); @@ -119,28 +115,20 @@ int audio_sound_play_panned(int soundId, int ebx, sint16 x, sint16 y, sint16 z) rct_xy16 pos2 = coordinate_3d_to_2d(&pos3, rotation); - rct_window *window = RCT2_GLOBAL( - RCT2_ADDRESS_NEW_WINDOW_PTR, - rct_window* - ); + rct_window *window = RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); while (true) { window--; - if (window < RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window)) { + if (window < RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window)) break; - } + rct_viewport *viewport = window->viewport; if (viewport && viewport->flags & VIEWPORT_FLAG_SOUND_ON) { sint16 vy = pos2.y - viewport->view_y; sint16 vx = pos2.x - viewport->view_x; ebx = viewport->x + (vx >> viewport->zoom); - volume = RCT2_ADDRESS(0x0099282C, int)[soundId] - + ((-1024 * viewport->zoom - 1) << volumeDown) + 1; + volume = RCT2_ADDRESS(0x0099282C, int)[soundId] + ((-1024 * viewport->zoom - 1) << volumeDown) + 1; - if (vy < 0 - || vy >= viewport->view_height - || vx < 0 - || vx >= viewport->view_width - || volume < -10000) + if (vy < 0 || vy >= viewport->view_height || vx < 0 || vx >= viewport->view_width || volume < -10000) return soundId; } } @@ -149,23 +137,11 @@ int audio_sound_play_panned(int soundId, int ebx, sint16 x, sint16 y, sint16 z) int pan = 0; if (ebx != (sint16)0x8000) { int x2 = ebx << 16; - uint16 screenWidth = max( - 64, - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - ); - + uint16 screenWidth = max(64, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16)); pan = ((x2 / screenWidth) - 0x8000) >> 4; } - Mixer_Play_Effect( - soundId, - MIXER_LOOP_NONE, - DStoMixerVolume(volume), - DStoMixerPan(pan), - 1, - 1 - ); - + Mixer_Play_Effect(soundId, MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(pan), 1, 1); return 0; } @@ -215,9 +191,8 @@ void audio_stop_ride_music() if (rideMusic->ride_id == (uint8)-1) continue; - if (rideMusic->sound_channel) { + if (rideMusic->sound_channel) Mixer_Stop_Channel(rideMusic->sound_channel); - } rideMusic->ride_id = -1; } @@ -356,8 +331,7 @@ void audio_unpause_sounds() */ void audio_stop_vehicle_sounds() { - if (gOpenRCT2Headless - || RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) == -1) + if (gOpenRCT2Headless || RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) == -1) return; for (int i = 0; i < countof(gVehicleSoundList); i++) { @@ -365,13 +339,11 @@ void audio_stop_vehicle_sounds() if (vehicleSound->id == 0xFFFF) continue; - if (vehicleSound->sound1_id != 0xFFFF) { + if (vehicleSound->sound1_id != 0xFFFF) Mixer_Stop_Channel(vehicleSound->sound1_channel); - } - if (vehicleSound->sound2_id != 0xFFFF) { + if (vehicleSound->sound2_id != 0xFFFF) Mixer_Stop_Channel(vehicleSound->sound2_channel); - } vehicleSound->id = 0xFFFF; } From e9b7e416359e3cd736d0b75092babb9f3548ea9f Mon Sep 17 00:00:00 2001 From: Dom Light Date: Tue, 17 Nov 2015 23:05:24 +0000 Subject: [PATCH 1109/1173] Refactor audio_sound_play_planned --- src/audio/audio.c | 123 ++++++++++++++++---------- src/audio/audio.h | 47 +++++++--- src/input.c | 4 +- src/interface/window.c | 2 +- src/management/news_item.c | 2 +- src/openrct2.c | 2 +- src/peep/peep.c | 14 +-- src/windows/editor_object_selection.c | 2 +- src/windows/error.c | 2 +- src/windows/footpath.c | 4 +- src/windows/install_track.c | 2 +- src/windows/map.c | 2 +- src/windows/maze_construction.c | 4 +- src/windows/new_ride.c | 2 +- src/windows/news.c | 4 +- src/windows/ride_construction.c | 10 +-- src/windows/scenery.c | 2 +- src/windows/title_scenarioselect.c | 2 +- src/windows/top_toolbar.c | 16 ++-- src/windows/track_list.c | 2 +- src/windows/track_place.c | 4 +- src/world/balloon.c | 2 +- src/world/duck.c | 2 +- src/world/map.c | 12 +-- src/world/particle.c | 2 +- 25 files changed, 157 insertions(+), 113 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index dd7daf0bb9..68318df050 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -46,6 +46,7 @@ rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS]; rct_vehicle_sound_params gVehicleSoundParamsList[AUDIO_MAX_VEHICLE_SOUNDS]; rct_vehicle_sound_params *gVehicleSoundParamsListEnd; +bool audio_get_pan_from_location(int soundId, const rct_xyz16 *location, int *volume, int *pan); void audio_stop_channel(void **channel); void audio_init() @@ -85,63 +86,87 @@ void audio_populate_devices() } } -/** -* -* rct2: 0x006BB76E -* -* @param sound_id (eax) -* @param ebx (ebx) -* @param x (cx) -* @param y (dx) -* @param z (bp) -*/ -int audio_sound_play_panned(int soundId, int ebx, sint16 x, sint16 y, sint16 z) +int audio_play_sound_panned(int soundId, int pan, sint16 x, sint16 y, sint16 z) +{ + if (pan == AUDIO_PLAY_AT_LOCATION) + return audio_play_sound_at_location(soundId, x, y, z); + + return audio_play_sound(soundId, 0, pan); +} + +int audio_play_sound_at_location(int soundId, sint16 x, sint16 y, sint16 z) { if (gGameSoundsOff) return 0; int volume = 0; - if (ebx == 0x8001) { - int volumeDown = 0; - rct_map_element *element = map_get_surface_element_at(x / 32, y / 32); - if (element && (element->base_height * 8) - 5 > z) - volumeDown = 10; - - uint8 rotation = get_current_rotation(); - rct_xyz16 pos3; - pos3.x = x; - pos3.y = y; - pos3.z = z; - - rct_xy16 pos2 = coordinate_3d_to_2d(&pos3, rotation); - - rct_window *window = RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); - while (true) { - window--; - if (window < RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window)) - break; - - rct_viewport *viewport = window->viewport; - if (viewport && viewport->flags & VIEWPORT_FLAG_SOUND_ON) { - sint16 vy = pos2.y - viewport->view_y; - sint16 vx = pos2.x - viewport->view_x; - ebx = viewport->x + (vx >> viewport->zoom); - volume = RCT2_ADDRESS(0x0099282C, int)[soundId] + ((-1024 * viewport->zoom - 1) << volumeDown) + 1; - - if (vy < 0 || vy >= viewport->view_height || vx < 0 || vx >= viewport->view_width || volume < -10000) - return soundId; - } - } - } - int pan = 0; - if (ebx != (sint16)0x8000) { - int x2 = ebx << 16; - uint16 screenWidth = max(64, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16)); - pan = ((x2 / screenWidth) - 0x8000) >> 4; + rct_xyz16 location; + location.x = x; + location.y = y; + location.z = z; + + bool success = audio_get_pan_from_location(soundId, &location, &volume, &pan); + if (!success) + return soundId; + + return audio_play_sound(soundId, volume, pan); +} + +/** +* Returns the pan to use when playing the specified sound at a virtual location. +* @param soundId The sound effect to be played. +* @param location The location at which the sound effect is to be played. +* @param volume [out] The volume at which the sound effect should be played. +* @param pan [out] The pan at which the sound effection should be played. +* @return true if the sound is in range and should be played; otherwise, false. +*/ +bool audio_get_pan_from_location(int soundId, const rct_xyz16 *location, int *volume, int *pan) +{ + *volume = 0; + *pan = 0; + int volumeDown = 0; + rct_map_element *element = map_get_surface_element_at(location->x / 32, location->y / 32); + if (element && (element->base_height * 8) - 5 > location->z) + volumeDown = 10; + + uint8 rotation = get_current_rotation(); + rct_xy16 pos2 = coordinate_3d_to_2d(location, rotation); + rct_window *window = RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); + while (true) { + window--; + if (window < RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window)) + break; + + rct_viewport *viewport = window->viewport; + if (!viewport || !(viewport->flags & VIEWPORT_FLAG_SOUND_ON)) + continue; + + sint16 vy = pos2.y - viewport->view_y; + sint16 vx = pos2.x - viewport->view_x; + *pan = viewport->x + (vx >> viewport->zoom); + *volume = RCT2_ADDRESS(0x0099282C, int)[soundId] + ((-1024 * viewport->zoom - 1) << volumeDown) + 1; + + if (vy < 0 || vy >= viewport->view_height || vx < 0 || vx >= viewport->view_width || *volume < -10000) + return false; } - Mixer_Play_Effect(soundId, MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(pan), 1, 1); + return true; +} + +int audio_play_sound(int soundId, int volume, int pan) +{ + if (gGameSoundsOff) + return 0; + + int mixerPan = 0; + if (pan != AUDIO_PLAY_AT_CENTRE) { + int x2 = pan << 16; + uint16 screenWidth = max(64, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16)); + mixerPan = ((x2 / screenWidth) - 0x8000) >> 4; + } + + Mixer_Play_Effect(soundId, MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(mixerPan), 1, 1); return 0; } diff --git a/src/audio/audio.h b/src/audio/audio.h index 48a488a52e..8c8c977d25 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -28,6 +28,8 @@ #define AUDIO_MAX_RIDE_MUSIC 2 #define AUDIO_MAX_VEHICLE_SOUNDS 14 #define NUM_DEFAULT_MUSIC_TRACKS 46 +#define AUDIO_PLAY_AT_CENTRE 0x8000 +#define AUDIO_PLAY_AT_LOCATION 0x8001 typedef struct audio_device { char name[AUDIO_DEVICE_NAME_SIZE]; @@ -184,6 +186,36 @@ void audio_init_ride_sounds(int device); */ void audio_pause_sounds(); /** +* Plays the specified sound. +* @param soundId The sound effect to play. +* @param volume The volume at which the sound effect should be played. +* @param pan The pan at which the sound effect should be played. If set to anything other than AUDIO_PLAY_AT_CENTRE, plays the +* sound at a position relative to the centre of the viewport. +*/ +int audio_play_sound(int soundId, int volume, int pan); +/** +* Plays the specified sound at a virtual location. +* @param soundId The sound effect to play. +* @param x The x coordinate of the location. +* @param y The y coordinate of the location. +* @param z The z coordinate of the location. +*/ +int audio_play_sound_at_location(int soundId, sint16 x, sint16 y, sint16 z); +/** +* rct2: 0x006BB76E +* @deprecated Use audio_play_sound_at_location or audio_play_sound instead. +* Plays the specified sound effect at a location specified by the pan parameter. +* @param soundId (eax) The sound effect to play. +* @param pan (ebx) If set to AUDIO_PLAY_AT_LOCATION, play the sound at the specified location; if set to AUDIO_PLAY_AT_CENTRE, play +* the sound at the centre of the viewport; if set to anything else, use the value of pan as a relative position to the centre +* of the viewport. +* @param x (cx) The x coordinate of the location. +* @param y (dx) The y coordinate of the location. +* @param z (bp) The z coordinate of the location. +* @return 0 if the sound was not out of range; otherwise, soundId. +*/ +int audio_play_sound_panned(int soundId, int pan, sint16 x, sint16 y, sint16 z); +/** * Populates the gAudioDevices array with the available audio devices. */ void audio_populate_devices(); @@ -192,18 +224,6 @@ void audio_populate_devices(); * This appears to be unused. */ void audio_quit(); -/** Plays the specified sound effect at the specified virtual location. -* @param soundId The sound effect to play. -* @param mode If set to 0x8001, play the sound at the specified location; if -* set to 0x8000, play the sound at the center of the viewport; if set to -* anything else, use the value of mode as a relative position to the center of -* the viewport. -* @param x The x coordinate of the location. -* @param y The y coordinate of the location. -* @param z The z coordinate of the location. -* @return 0 if the sound was played successfully, otherwise, soundId. -*/ -int audio_sound_play_panned(int soundId, int mode, sint16 x, sint16 y, sint16 z); /** * Starts playing the title music. */ @@ -233,8 +253,7 @@ void audio_stop_vehicle_sounds(); */ void audio_toggle_all_sounds(); /** -* Resumes playing sounds that had been paused by a call to -* audio_pause_sounds(). +* Resumes playing sounds that had been paused by a call to audio_pause_sounds(). */ void audio_unpause_sounds(); diff --git a/src/input.c b/src/input.c index c68a1562e4..68fe6541a9 100644 --- a/src/input.c +++ b/src/input.c @@ -1021,7 +1021,7 @@ static void input_widget_left(int x, int y, rct_window *w, int widgetIndex) break; default: if (widget_is_enabled(w, widgetIndex) && !widget_is_disabled(w, widgetIndex)) { - audio_sound_play_panned(SOUND_CLICK_1, w->x + (widget->left + widget->right) / 2, 0, 0, 0); + audio_play_sound_panned(SOUND_CLICK_1, w->x + (widget->left + widget->right) / 2, 0, 0, 0); // Set new cursor down widget RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DOWN_WINDOWCLASS, rct_windowclass) = windowClass; @@ -1267,7 +1267,7 @@ void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_wi break; int mid_point_x = (widget->left + widget->right) / 2 + w->x; - audio_sound_play_panned(5, mid_point_x, 0, 0, 0); + audio_play_sound_panned(5, mid_point_x, 0, 0, 0); if (cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex) break; diff --git a/src/interface/window.c b/src/interface/window.c index 8bf9e8efe1..ebed32d5c2 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -397,7 +397,7 @@ rct_window *window_create(int x, int y, int width, int height, rct_window_event_ // Play sounds and flash the window if (!(flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT))){ w->flags |= WF_WHITE_BORDER_MASK; - audio_sound_play_panned(SOUND_WINDOW_OPEN, x + (width / 2), 0, 0, 0); + audio_play_sound_panned(SOUND_WINDOW_OPEN, x + (width / 2), 0, 0, 0); } w->number = 0; diff --git a/src/management/news_item.c b/src/management/news_item.c index f83f5d2ca1..563703eeb7 100644 --- a/src/management/news_item.c +++ b/src/management/news_item.c @@ -85,7 +85,7 @@ static void news_item_tick_current() // Only play news item sound when in normal playing mode if (ticks == 1 && (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) == SCREEN_FLAGS_PLAYING)) { // Play sound - audio_sound_play_panned(SOUND_NEWS_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2, 0, 0, 0); + audio_play_sound_panned(SOUND_NEWS_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2, 0, 0, 0); } } diff --git a/src/openrct2.c b/src/openrct2.c index 4bebe17b65..54bfdac002 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -639,7 +639,7 @@ static void openrct2_setup_rct2_hooks() addhook(0x006E7499, (int)gfx_redraw_screen_rect, 0, (int[]){ EAX, EBX, EDX, EBP, END }, 0, 0); // remove when 0x6E7FF3 is decompiled addhook(0x006B752C, (int)ride_crash, 0, (int[]){ EDX, EBX, END }, 0, 0); // remove when all callers are decompiled addhook(0x0069A42F, (int)peep_window_state_update, 0, (int[]){ ESI, END }, 0, 0); // remove when all callers are decompiled - addhook(0x006BB76E, (int)audio_sound_play_panned, 0, (int[]){EAX, EBX, ECX, EDX, EBP, END}, EAX, 0); // remove when all callers are decompiled + addhook(0x006BB76E, (int)audio_play_sound_panned, 0, (int[]){EAX, EBX, ECX, EDX, EBP, END}, EAX, 0); // remove when all callers are decompiled addhook(0x006C42D9, (int)scrolling_text_setup, 0, (int[]){EAX, ECX, EBP, END}, 0, EBX); // remove when all callers are decompiled addhook(0x006C2321, (int)gfx_get_string_width, 0, (int[]){ESI, END}, 0, ECX); // remove when all callers are decompiled addhook(0x006C2555, (int)format_string, 0, (int[]){EDI, EAX, ECX, END}, 0, 0); // remove when all callers are decompiled diff --git a/src/peep/peep.c b/src/peep/peep.c index 2cc1bf15dc..bc8dc47b31 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -392,7 +392,7 @@ static void sub_68F41A(rct_peep *peep, int index) } if (peep->flags & PEEP_FLAGS_EXPLODE && peep->x != (sint16)0x8000){ - audio_sound_play_panned(SOUND_CRASH, 0x8001, peep->x, peep->y, peep->z); + audio_play_sound_panned(SOUND_CRASH, 0x8001, peep->x, peep->y, peep->z); sprite_misc_3_create(peep->x, peep->y, peep->z + 16); sprite_misc_5_create(peep->x, peep->y, peep->z + 16); @@ -1029,7 +1029,7 @@ int peep_update_action(sint16* x, sint16* y, sint16* xy_distance, rct_peep* peep litter_create(peep->x, peep->y, peep->z, peep->sprite_direction, peep->sprite_index & 1); int sound_id = SOUND_COUGH_1 + (scenario_rand() & 3); - audio_sound_play_panned(sound_id, 0x8001, peep->x, peep->y, peep->z); + audio_play_sound_panned(sound_id, 0x8001, peep->x, peep->y, peep->z); invalidate_sprite_2((rct_sprite*)peep); *x = peep->x; @@ -1141,7 +1141,7 @@ void peep_update_sprite_type(rct_peep* peep) ) { bl = 1; - audio_sound_play_panned(SOUND_BALLOON_POP, 0x8001, peep->x, peep->y, peep->z); + audio_play_sound_panned(SOUND_BALLOON_POP, 0x8001, peep->x, peep->y, peep->z); } if (peep->x != SPRITE_LOCATION_NULL) { @@ -3161,7 +3161,7 @@ static void peep_update_ride_sub_state_20(rct_peep* peep){ return; } - audio_sound_play_panned(SOUND_TOILET_FLUSH, 0x8001, peep->x, peep->y, peep->z); + audio_play_sound_panned(SOUND_TOILET_FLUSH, 0x8001, peep->x, peep->y, peep->z); peep->sub_state++; @@ -5265,7 +5265,7 @@ void peep_applause() } // Play applause noise - audio_sound_play_panned(SOUND_APPLAUSE, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2, 0, 0, 0); + audio_play_sound_panned(SOUND_APPLAUSE, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2, 0, 0, 0); } /** @@ -7523,7 +7523,7 @@ static void peep_spend_money(rct_peep *peep, money16 *peep_expend_type, money32 RCT2_GLOBAL(0x00141F568, uint8) = RCT2_GLOBAL(0x0013CA740, uint8); finance_payment(-amount, RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) / 4); - audio_sound_play_panned(SOUND_PURCHASE, 0x8001, peep->x, peep->y, peep->z); + audio_play_sound_panned(SOUND_PURCHASE, 0x8001, peep->x, peep->y, peep->z); } static void peep_set_has_ridden(rct_peep *peep, int rideIndex) @@ -7851,7 +7851,7 @@ static void peep_on_exit_ride(rct_peep *peep, int rideIndex) int laugh = scenario_rand() & 7; if (laugh < 3) { - audio_sound_play_panned(SOUND_LAUGH_1 + laugh, 0x8001, peep->x, peep->y, peep->z); + audio_play_sound_panned(SOUND_LAUGH_1 + laugh, 0x8001, peep->x, peep->y, peep->z); } } diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index f9a00a06b9..b1e561c15a 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -973,7 +973,7 @@ static void window_editor_object_selection_scroll_mousedown(rct_window *w, int s window_invalidate(w); - audio_sound_play_panned(SOUND_CLICK_1, RCT2_GLOBAL(0x142406C,uint32), 0, 0, 0); + audio_play_sound_panned(SOUND_CLICK_1, RCT2_GLOBAL(0x142406C,uint32), 0, 0, 0); if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { diff --git a/src/windows/error.c b/src/windows/error.c index c6489d3651..bba3cbece5 100644 --- a/src/windows/error.c +++ b/src/windows/error.c @@ -138,7 +138,7 @@ void window_error_open(rct_string_id title, rct_string_id message) w->widgets = window_error_widgets; w->error.var_480 = 0; if (!(RCT2_GLOBAL(0x009A8C29, uint8) & 1)) - audio_sound_play_panned(SOUND_ERROR, 0, w->x + (w->width / 2), 0, 0); + audio_play_sound_panned(SOUND_ERROR, 0, w->x + (w->width / 2), 0, 0); } /** diff --git a/src/windows/footpath.c b/src/windows/footpath.c index 0456bf11bf..da68534d30 100644 --- a/src/windows/footpath.c +++ b/src/windows/footpath.c @@ -768,7 +768,7 @@ static void window_footpath_place_path_at_point(int x, int y) // bp = RCT2_ADDRESS_COMMAND_MAP_Z // dx = RCT2_ADDRESS_COMMAND_MAP_Y // cx = RCT2_ADDRESS_COMMAND_MAP_X - audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); } } @@ -852,7 +852,7 @@ static void window_footpath_construct() cost = footpath_place(type, x, y, z, slope, GAME_COMMAND_FLAG_APPLY); if (cost != MONEY32_UNDEFINED) { - audio_sound_play_panned( + audio_play_sound_panned( SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_X, uint16), diff --git a/src/windows/install_track.c b/src/windows/install_track.c index b549785c57..1b631782ae 100644 --- a/src/windows/install_track.c +++ b/src/windows/install_track.c @@ -159,7 +159,7 @@ static void window_install_track_select(rct_window *w, int index) w->track_list.var_480 = index; - audio_sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); + audio_play_sound_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && index == 0) { window_close(w); ride_construct_new(_window_install_track_item); diff --git a/src/windows/map.c b/src/windows/map.c index 29fbbb79a7..daf93a9e71 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -1289,7 +1289,7 @@ static void window_map_place_park_entrance_tool_down(int x, int y) if (price == MONEY32_UNDEFINED) return; - audio_sound_play_panned( + audio_play_sound_panned( SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16), diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index 3fd6efc81d..da13cd7a9a 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -371,7 +371,7 @@ static void window_maze_construction_entrance_tooldown(int x, int y, rct_window* if (cost == MONEY32_UNDEFINED) return; - audio_sound_play_panned( + audio_play_sound_panned( SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, sint16), @@ -509,6 +509,6 @@ static void window_maze_construction_construct(int direction) _currentTrackBeginX = x; _currentTrackBeginY = y; if (_rideConstructionState != 7) { - audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); } } diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c index 4fea00da60..fc9d702cc6 100644 --- a/src/windows/new_ride.c +++ b/src/windows/new_ride.c @@ -688,7 +688,7 @@ static void window_new_ride_scrollmousedown(rct_window *w, int scrollIndex, int RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_RIDE_LIST_HIGHLIGHTED_ITEM, ride_list_item)[_window_new_ride_current_tab] = item; w->new_ride.selected_ride_id = *((sint16*)&item); - audio_sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); + audio_play_sound_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); w->new_ride.selected_ride_countdown = 8; window_invalidate(w); } diff --git a/src/windows/news.c b/src/windows/news.c index 623c6d579c..0df430e2de 100644 --- a/src/windows/news.c +++ b/src/windows/news.c @@ -147,7 +147,7 @@ static void window_news_update(rct_window *w) return; window_invalidate(w); - audio_sound_play_panned(SOUND_CLICK_2, w->x + (w->width / 2), 0, 0, 0); + audio_play_sound_panned(SOUND_CLICK_2, w->x + (w->width / 2), 0, 0, 0); j = w->news.var_480; w->news.var_480 = -1; @@ -239,7 +239,7 @@ static void window_news_scrollmousedown(rct_window *w, int scrollIndex, int x, i w->news.var_482 = buttonIndex; w->news.var_484 = 4; window_invalidate(w); - audio_sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); + audio_play_sound_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); } } diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index b3e06f650b..f54adae7ec 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1594,7 +1594,7 @@ static void window_ride_construction_construct(rct_window *w) return; } - audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); if (RCT2_GLOBAL(RCT2_ADDRESS_ABOVE_GROUND_FLAGS, uint8) & TRACK_ELEMENT_LOCATION_IS_UNDERGROUND) { viewport_set_visibility(1); @@ -3554,7 +3554,7 @@ void ride_construction_tooldown_construct(int screenX, int screenY) zAttempts == 0 || z < 0 ) { - audio_sound_play_panned(SOUND_ERROR, RCT2_GLOBAL(0x0142406C, sint32), x, y, z); + audio_play_sound_panned(SOUND_ERROR, RCT2_GLOBAL(0x0142406C, sint32), x, y, z); w = window_find_by_class(WC_RIDE_CONSTRUCTION); if (w != NULL){ tool_set(w, 23, 12); @@ -3571,7 +3571,7 @@ void ride_construction_tooldown_construct(int screenX, int screenY) } else { window_close_by_class(WC_ERROR); - audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, _currentTrackBeginX, _currentTrackBeginY, _currentTrackBeginZ); + audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, _currentTrackBeginX, _currentTrackBeginY, _currentTrackBeginZ); break; } } @@ -3626,7 +3626,7 @@ void ride_construction_tooldown_construct(int screenX, int screenY) _currentTrackCovered = saveCurrentTrackCovered; _currentTrackLiftHill = saveCurrentTrackLiftHill; - audio_sound_play_panned(SOUND_ERROR, RCT2_GLOBAL(0x0142406C, sint32), x, y, z); + audio_play_sound_panned(SOUND_ERROR, RCT2_GLOBAL(0x0142406C, sint32), x, y, z); break; } else if (zAttempts >= 0) { z += 16; @@ -3680,7 +3680,7 @@ static void ride_construction_tooldown_entrance_exit(int screenX, int screenY) return; } - audio_sound_play_panned( + audio_play_sound_panned( SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), diff --git a/src/windows/scenery.c b/src/windows/scenery.c index ecf4eaed73..8ca4deebd2 100644 --- a/src/windows/scenery.c +++ b/src/windows/scenery.c @@ -795,7 +795,7 @@ void window_scenery_scrollmousedown(rct_window *w, int scrollIndex, int x, int y window_scenery_selected_scenery_by_tab[tabIndex] = sceneryId; window_scenery_is_repaint_scenery_tool_on &= 0xFE; - audio_sound_play_panned(4, (w->width >> 1) + w->x, 0, 0, 0); + audio_play_sound_panned(4, (w->width >> 1) + w->x, 0, 0, 0); w->scenery.hover_counter = -16; RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_COST, uint32) = MONEY32_UNDEFINED; window_invalidate(w); diff --git a/src/windows/title_scenarioselect.c b/src/windows/title_scenarioselect.c index b4a4d1f6f3..cc20a5ca8c 100644 --- a/src/windows/title_scenarioselect.c +++ b/src/windows/title_scenarioselect.c @@ -215,7 +215,7 @@ static void window_scenarioselect_scrollmousedown(rct_window *w, int scrollIndex if (y >= 0) continue; - audio_sound_play_panned(SOUND_CLICK_1, w->width / 2 + w->x, 0, 0, 0); + audio_play_sound_panned(SOUND_CLICK_1, w->width / 2 + w->x, 0, 0, 0); scenario_load_and_play(scenario); break; } diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index c40c5ea852..cc90a70c0c 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -1479,7 +1479,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (cost != MONEY32_UNDEFINED){ window_close_by_class(WC_ERROR); - audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); success = true; break; } @@ -1507,7 +1507,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (successfulPlacements > 0) { window_close_by_class(WC_ERROR); } else { - audio_sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); } break; } @@ -1518,7 +1518,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_POSITION_THIS_HERE; int cost = game_do_command(gridX, flags, gridY, parameter_2, GAME_COMMAND_PLACE_PATH, parameter_3, 0); if (cost != MONEY32_UNDEFINED) { - audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); } break; } @@ -1542,7 +1542,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (cost != MONEY32_UNDEFINED){ window_close_by_class(WC_ERROR); - audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); return; } @@ -1556,7 +1556,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) += 8; } - audio_sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); break; } case SCENERY_TYPE_LARGE: @@ -1579,7 +1579,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (cost != MONEY32_UNDEFINED){ window_close_by_class(WC_ERROR); - audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); return; } @@ -1593,7 +1593,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) += 8; } - audio_sound_play_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); break; } case SCENERY_TYPE_BANNER: @@ -1613,7 +1613,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (cost != MONEY32_UNDEFINED) { int bannerId = regs.edi; - audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); window_banner_open(bannerId); } break; diff --git a/src/windows/track_list.c b/src/windows/track_list.c index 76c837569b..092fd3e6cc 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -158,7 +158,7 @@ static void window_track_list_select(rct_window *w, int index) w->track_list.var_480 = index; - audio_sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); + audio_play_sound_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && index == 0) { window_close(w); ride_construct_new(_window_track_list_item); diff --git a/src/windows/track_place.c b/src/windows/track_place.c index 38102c2370..799b649560 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -541,7 +541,7 @@ static void window_track_place_tooldown(rct_window* w, int widgetIndex, int x, i if (cost != MONEY32_UNDEFINED) { window_close_by_class(WC_ERROR); - audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, mapX, mapY, mapZ); + audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, mapX, mapY, mapZ); RCT2_GLOBAL(0x00F440A7, uint8) = rideIndex; if (RCT2_GLOBAL(0x00F4414E, uint8) & 1) { @@ -563,7 +563,7 @@ static void window_track_place_tooldown(rct_window* w, int widgetIndex, int x, i } // Unable to build track - audio_sound_play_panned(SOUND_ERROR, 0x8001, mapX, mapY, mapZ); + audio_play_sound_panned(SOUND_ERROR, 0x8001, mapX, mapY, mapZ); } /** diff --git a/src/world/balloon.c b/src/world/balloon.c index b1e5cfbd1a..a8470f0491 100644 --- a/src/world/balloon.c +++ b/src/world/balloon.c @@ -26,7 +26,7 @@ void balloon_pop(rct_balloon *balloon) { balloon->popped = 1; balloon->var_26 = 0; - audio_sound_play_panned(SOUND_BALLOON_POP, 0x8001, balloon->x, balloon->y, balloon->z); + audio_play_sound_panned(SOUND_BALLOON_POP, 0x8001, balloon->x, balloon->y, balloon->z); } /** diff --git a/src/world/duck.c b/src/world/duck.c index a5f6d2d7f0..bc50dd2fc0 100644 --- a/src/world/duck.c +++ b/src/world/duck.c @@ -288,7 +288,7 @@ static void duck_update_fly_away(rct_duck *duck) */ void duck_press(rct_duck *duck) { - audio_sound_play_panned(SOUND_QUACK, 0x8001, duck->x, duck->y, duck->z); + audio_play_sound_panned(SOUND_QUACK, 0x8001, duck->x, duck->y, duck->z); } /** diff --git a/src/world/map.c b/src/world/map.c index 9e6519a358..479325e033 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1606,7 +1606,7 @@ money32 map_set_land_ownership(uint8 flags, sint16 x1, sint16 y1, sint16 x2, sin y += 16; sint16 z = map_element_height(x, y) & 0xFFFF; - audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); return 0; } @@ -1629,7 +1629,7 @@ money32 raise_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b money32 cost = 0; if ((flags & GAME_COMMAND_FLAG_APPLY) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { - audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); } uint8 min_height = 0xFF; @@ -1685,7 +1685,7 @@ money32 lower_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b money32 cost = 0; if ((flags & GAME_COMMAND_FLAG_APPLY) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { - audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); } uint8 max_height = 0; @@ -1808,7 +1808,7 @@ money32 raise_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags) RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = x; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = z; - audio_sound_play_panned(SOUND_LAYING_OUT_WATER, 0x8001, x, y, z); + audio_play_sound_panned(SOUND_LAYING_OUT_WATER, 0x8001, x, y, z); } // Force ride construction to recheck area @@ -1873,7 +1873,7 @@ money32 lower_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags) RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = x; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = z; - audio_sound_play_panned(SOUND_LAYING_OUT_WATER, 0x8001, x, y, z); + audio_play_sound_panned(SOUND_LAYING_OUT_WATER, 0x8001, x, y, z); } // Force ride construction to recheck area @@ -2030,7 +2030,7 @@ money32 smooth_land(int flags, int centreX, int centreY, int mapLeft, int mapTop // Play sound (only once) if ((flags & GAME_COMMAND_FLAG_APPLY) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { - audio_sound_play_panned(SOUND_PLACE_ITEM, 0x8001, centreX, centreY, centreZ); + audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, centreX, centreY, centreZ); } money32 totalCost = 0; diff --git a/src/world/particle.c b/src/world/particle.c index 27fe0221aa..fd421892e4 100644 --- a/src/world/particle.c +++ b/src/world/particle.c @@ -71,7 +71,7 @@ void crashed_vehicle_particle_update(rct_crashed_vehicle_particle *particle) if (waterZ != 0 && particle->z >= waterZ && z <= waterZ) { // Splash - audio_sound_play_panned(SOUND_WATER_2, 0x8001, particle->x, particle->y, waterZ); + audio_play_sound_panned(SOUND_WATER_2, 0x8001, particle->x, particle->y, waterZ); crash_splash_create(particle->x, particle->y, waterZ); sprite_remove((rct_sprite*)particle); return; From bb62b7561ad75815317362ad7cc611d1bfaea5c3 Mon Sep 17 00:00:00 2001 From: Dom Light Date: Wed, 18 Nov 2015 00:03:15 +0000 Subject: [PATCH 1110/1173] Replace some uses of play_sound_panned with play_sound_at_location --- src/audio/audio.c | 41 ++++++++++++++++++--------------- src/peep/peep.c | 10 ++++---- src/windows/footpath.c | 5 ++-- src/windows/map.c | 3 +-- src/windows/maze_construction.c | 5 ++-- src/windows/ride_construction.c | 7 +++--- src/windows/top_toolbar.c | 16 ++++++------- src/windows/track_place.c | 4 ++-- src/world/balloon.c | 2 +- src/world/duck.c | 2 +- src/world/map.c | 12 +++++----- src/world/particle.c | 2 +- 12 files changed, 55 insertions(+), 54 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 68318df050..f9e0f30ae8 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -32,6 +32,12 @@ #include "../openrct2.h" #include "../util/util.h" +typedef struct rct_audio_params { + bool in_range; + int volume; + int pan; +} rct_audio_params; + audio_device *gAudioDevices = NULL; int gAudioDeviceCount; void *gCrowdSoundChannel = 0; @@ -46,7 +52,7 @@ rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS]; rct_vehicle_sound_params gVehicleSoundParamsList[AUDIO_MAX_VEHICLE_SOUNDS]; rct_vehicle_sound_params *gVehicleSoundParamsListEnd; -bool audio_get_pan_from_location(int soundId, const rct_xyz16 *location, int *volume, int *pan); +rct_audio_params audio_get_params_from_location(int soundId, const rct_xyz16 *location); void audio_stop_channel(void **channel); void audio_init() @@ -99,33 +105,30 @@ int audio_play_sound_at_location(int soundId, sint16 x, sint16 y, sint16 z) if (gGameSoundsOff) return 0; - int volume = 0; - int pan = 0; rct_xyz16 location; location.x = x; location.y = y; location.z = z; - bool success = audio_get_pan_from_location(soundId, &location, &volume, &pan); - if (!success) + rct_audio_params params = audio_get_params_from_location(soundId, &location); + if (!params.in_range) return soundId; - return audio_play_sound(soundId, volume, pan); + return audio_play_sound(soundId, params.volume, params.pan); } /** -* Returns the pan to use when playing the specified sound at a virtual location. +* Returns the audio parameters to use when playing the specified sound at a virtual location. * @param soundId The sound effect to be played. * @param location The location at which the sound effect is to be played. -* @param volume [out] The volume at which the sound effect should be played. -* @param pan [out] The pan at which the sound effection should be played. -* @return true if the sound is in range and should be played; otherwise, false. +* @return The audio parameters to be used when playing this sound effect. */ -bool audio_get_pan_from_location(int soundId, const rct_xyz16 *location, int *volume, int *pan) +rct_audio_params audio_get_params_from_location(int soundId, const rct_xyz16 *location) { - *volume = 0; - *pan = 0; int volumeDown = 0; + rct_audio_params params; + params.in_range = true; + rct_map_element *element = map_get_surface_element_at(location->x / 32, location->y / 32); if (element && (element->base_height * 8) - 5 > location->z) volumeDown = 10; @@ -144,14 +147,16 @@ bool audio_get_pan_from_location(int soundId, const rct_xyz16 *location, int *vo sint16 vy = pos2.y - viewport->view_y; sint16 vx = pos2.x - viewport->view_x; - *pan = viewport->x + (vx >> viewport->zoom); - *volume = RCT2_ADDRESS(0x0099282C, int)[soundId] + ((-1024 * viewport->zoom - 1) << volumeDown) + 1; + params.pan = viewport->x + (vx >> viewport->zoom); + params.volume = RCT2_ADDRESS(0x0099282C, int)[soundId] + ((-1024 * viewport->zoom - 1) << volumeDown) + 1; - if (vy < 0 || vy >= viewport->view_height || vx < 0 || vx >= viewport->view_width || *volume < -10000) - return false; + if (vy < 0 || vy >= viewport->view_height || vx < 0 || vx >= viewport->view_width || params.volume < -10000) { + params.in_range = false; + return params; + } } - return true; + return params; } int audio_play_sound(int soundId, int volume, int pan) diff --git a/src/peep/peep.c b/src/peep/peep.c index bc8dc47b31..0821ef9c89 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -392,7 +392,7 @@ static void sub_68F41A(rct_peep *peep, int index) } if (peep->flags & PEEP_FLAGS_EXPLODE && peep->x != (sint16)0x8000){ - audio_play_sound_panned(SOUND_CRASH, 0x8001, peep->x, peep->y, peep->z); + audio_play_sound_at_location(SOUND_CRASH, peep->x, peep->y, peep->z); sprite_misc_3_create(peep->x, peep->y, peep->z + 16); sprite_misc_5_create(peep->x, peep->y, peep->z + 16); @@ -1029,7 +1029,7 @@ int peep_update_action(sint16* x, sint16* y, sint16* xy_distance, rct_peep* peep litter_create(peep->x, peep->y, peep->z, peep->sprite_direction, peep->sprite_index & 1); int sound_id = SOUND_COUGH_1 + (scenario_rand() & 3); - audio_play_sound_panned(sound_id, 0x8001, peep->x, peep->y, peep->z); + audio_play_sound_at_location(sound_id, peep->x, peep->y, peep->z); invalidate_sprite_2((rct_sprite*)peep); *x = peep->x; @@ -1141,7 +1141,7 @@ void peep_update_sprite_type(rct_peep* peep) ) { bl = 1; - audio_play_sound_panned(SOUND_BALLOON_POP, 0x8001, peep->x, peep->y, peep->z); + audio_play_sound_at_location(SOUND_BALLOON_POP, peep->x, peep->y, peep->z); } if (peep->x != SPRITE_LOCATION_NULL) { @@ -3161,7 +3161,7 @@ static void peep_update_ride_sub_state_20(rct_peep* peep){ return; } - audio_play_sound_panned(SOUND_TOILET_FLUSH, 0x8001, peep->x, peep->y, peep->z); + audio_play_sound_at_location(SOUND_TOILET_FLUSH, peep->x, peep->y, peep->z); peep->sub_state++; @@ -7523,7 +7523,7 @@ static void peep_spend_money(rct_peep *peep, money16 *peep_expend_type, money32 RCT2_GLOBAL(0x00141F568, uint8) = RCT2_GLOBAL(0x0013CA740, uint8); finance_payment(-amount, RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) / 4); - audio_play_sound_panned(SOUND_PURCHASE, 0x8001, peep->x, peep->y, peep->z); + audio_play_sound_at_location(SOUND_PURCHASE, peep->x, peep->y, peep->z); } static void peep_set_has_ridden(rct_peep *peep, int rideIndex) diff --git a/src/windows/footpath.c b/src/windows/footpath.c index da68534d30..fb16189460 100644 --- a/src/windows/footpath.c +++ b/src/windows/footpath.c @@ -768,7 +768,7 @@ static void window_footpath_place_path_at_point(int x, int y) // bp = RCT2_ADDRESS_COMMAND_MAP_Z // dx = RCT2_ADDRESS_COMMAND_MAP_Y // cx = RCT2_ADDRESS_COMMAND_MAP_X - audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_at_location(SOUND_PLACE_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); } } @@ -852,9 +852,8 @@ static void window_footpath_construct() cost = footpath_place(type, x, y, z, slope, GAME_COMMAND_FLAG_APPLY); if (cost != MONEY32_UNDEFINED) { - audio_play_sound_panned( + audio_play_sound_at_location( SOUND_PLACE_ITEM, - 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_Z, uint16) diff --git a/src/windows/map.c b/src/windows/map.c index daf93a9e71..b932d36c1b 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -1289,9 +1289,8 @@ static void window_map_place_park_entrance_tool_down(int x, int y) if (price == MONEY32_UNDEFINED) return; - audio_play_sound_panned( + audio_play_sound_at_location( SOUND_PLACE_ITEM, - 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16), RCT2_GLOBAL(0x009DEA64, uint16), RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index da13cd7a9a..a3c992b76d 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -371,9 +371,8 @@ static void window_maze_construction_entrance_tooldown(int x, int y, rct_window* if (cost == MONEY32_UNDEFINED) return; - audio_play_sound_panned( + audio_play_sound_at_location( SOUND_PLACE_ITEM, - 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, sint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, sint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); @@ -509,6 +508,6 @@ static void window_maze_construction_construct(int direction) _currentTrackBeginX = x; _currentTrackBeginY = y; if (_rideConstructionState != 7) { - audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_play_sound_at_location(SOUND_PLACE_ITEM, x, y, z); } } diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index f54adae7ec..1ece93b7c2 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1594,7 +1594,7 @@ static void window_ride_construction_construct(rct_window *w) return; } - audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_play_sound_at_location(SOUND_PLACE_ITEM, x, y, z); if (RCT2_GLOBAL(RCT2_ADDRESS_ABOVE_GROUND_FLAGS, uint8) & TRACK_ELEMENT_LOCATION_IS_UNDERGROUND) { viewport_set_visibility(1); @@ -3571,7 +3571,7 @@ void ride_construction_tooldown_construct(int screenX, int screenY) } else { window_close_by_class(WC_ERROR); - audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, _currentTrackBeginX, _currentTrackBeginY, _currentTrackBeginZ); + audio_play_sound_at_location(SOUND_PLACE_ITEM, _currentTrackBeginX, _currentTrackBeginY, _currentTrackBeginZ); break; } } @@ -3680,9 +3680,8 @@ static void ride_construction_tooldown_entrance_exit(int screenX, int screenY) return; } - audio_play_sound_panned( + audio_play_sound_at_location( SOUND_PLACE_ITEM, - 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16) diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index cc90a70c0c..da8c8c4110 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -1479,7 +1479,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (cost != MONEY32_UNDEFINED){ window_close_by_class(WC_ERROR); - audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_at_location(SOUND_PLACE_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); success = true; break; } @@ -1507,7 +1507,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (successfulPlacements > 0) { window_close_by_class(WC_ERROR); } else { - audio_play_sound_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_at_location(SOUND_ERROR, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); } break; } @@ -1518,7 +1518,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_POSITION_THIS_HERE; int cost = game_do_command(gridX, flags, gridY, parameter_2, GAME_COMMAND_PLACE_PATH, parameter_3, 0); if (cost != MONEY32_UNDEFINED) { - audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_at_location(SOUND_PLACE_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); } break; } @@ -1542,7 +1542,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (cost != MONEY32_UNDEFINED){ window_close_by_class(WC_ERROR); - audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_at_location(SOUND_PLACE_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); return; } @@ -1556,7 +1556,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) += 8; } - audio_play_sound_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_at_location(SOUND_ERROR, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); break; } case SCENERY_TYPE_LARGE: @@ -1579,7 +1579,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (cost != MONEY32_UNDEFINED){ window_close_by_class(WC_ERROR); - audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_at_location(SOUND_PLACE_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); return; } @@ -1593,7 +1593,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) += 8; } - audio_play_sound_panned(SOUND_ERROR, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_at_location(SOUND_ERROR, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); break; } case SCENERY_TYPE_BANNER: @@ -1613,7 +1613,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (cost != MONEY32_UNDEFINED) { int bannerId = regs.edi; - audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); + audio_play_sound_at_location(SOUND_PLACE_ITEM, RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16), RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint16)); window_banner_open(bannerId); } break; diff --git a/src/windows/track_place.c b/src/windows/track_place.c index 799b649560..e52fedbafb 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -541,7 +541,7 @@ static void window_track_place_tooldown(rct_window* w, int widgetIndex, int x, i if (cost != MONEY32_UNDEFINED) { window_close_by_class(WC_ERROR); - audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, mapX, mapY, mapZ); + audio_play_sound_at_location(SOUND_PLACE_ITEM, mapX, mapY, mapZ); RCT2_GLOBAL(0x00F440A7, uint8) = rideIndex; if (RCT2_GLOBAL(0x00F4414E, uint8) & 1) { @@ -563,7 +563,7 @@ static void window_track_place_tooldown(rct_window* w, int widgetIndex, int x, i } // Unable to build track - audio_play_sound_panned(SOUND_ERROR, 0x8001, mapX, mapY, mapZ); + audio_play_sound_at_location(SOUND_ERROR, mapX, mapY, mapZ); } /** diff --git a/src/world/balloon.c b/src/world/balloon.c index a8470f0491..88fdaf320a 100644 --- a/src/world/balloon.c +++ b/src/world/balloon.c @@ -26,7 +26,7 @@ void balloon_pop(rct_balloon *balloon) { balloon->popped = 1; balloon->var_26 = 0; - audio_play_sound_panned(SOUND_BALLOON_POP, 0x8001, balloon->x, balloon->y, balloon->z); + audio_play_sound_at_location(SOUND_BALLOON_POP, balloon->x, balloon->y, balloon->z); } /** diff --git a/src/world/duck.c b/src/world/duck.c index bc50dd2fc0..1e500247ca 100644 --- a/src/world/duck.c +++ b/src/world/duck.c @@ -288,7 +288,7 @@ static void duck_update_fly_away(rct_duck *duck) */ void duck_press(rct_duck *duck) { - audio_play_sound_panned(SOUND_QUACK, 0x8001, duck->x, duck->y, duck->z); + audio_play_sound_at_location(SOUND_QUACK, duck->x, duck->y, duck->z); } /** diff --git a/src/world/map.c b/src/world/map.c index 479325e033..e23eae101d 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1606,7 +1606,7 @@ money32 map_set_land_ownership(uint8 flags, sint16 x1, sint16 y1, sint16 x2, sin y += 16; sint16 z = map_element_height(x, y) & 0xFFFF; - audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_play_sound_at_location(SOUND_PLACE_ITEM, x, y, z); return 0; } @@ -1629,7 +1629,7 @@ money32 raise_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b money32 cost = 0; if ((flags & GAME_COMMAND_FLAG_APPLY) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { - audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_play_sound_at_location(SOUND_PLACE_ITEM, x, y, z); } uint8 min_height = 0xFF; @@ -1685,7 +1685,7 @@ money32 lower_land(int flags, int x, int y, int z, int ax, int ay, int bx, int b money32 cost = 0; if ((flags & GAME_COMMAND_FLAG_APPLY) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { - audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + audio_play_sound_at_location(SOUND_PLACE_ITEM, x, y, z); } uint8 max_height = 0; @@ -1808,7 +1808,7 @@ money32 raise_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags) RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = x; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = z; - audio_play_sound_panned(SOUND_LAYING_OUT_WATER, 0x8001, x, y, z); + audio_play_sound_at_location(SOUND_LAYING_OUT_WATER, x, y, z); } // Force ride construction to recheck area @@ -1873,7 +1873,7 @@ money32 lower_water(sint16 x0, sint16 y0, sint16 x1, sint16 y1, uint8 flags) RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint32) = x; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint32) = y; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Z, uint32) = z; - audio_play_sound_panned(SOUND_LAYING_OUT_WATER, 0x8001, x, y, z); + audio_play_sound_at_location(SOUND_LAYING_OUT_WATER, x, y, z); } // Force ride construction to recheck area @@ -2030,7 +2030,7 @@ money32 smooth_land(int flags, int centreX, int centreY, int mapLeft, int mapTop // Play sound (only once) if ((flags & GAME_COMMAND_FLAG_APPLY) && RCT2_GLOBAL(0x009A8C28, uint8) == 1) { - audio_play_sound_panned(SOUND_PLACE_ITEM, 0x8001, centreX, centreY, centreZ); + audio_play_sound_at_location(SOUND_PLACE_ITEM, centreX, centreY, centreZ); } money32 totalCost = 0; diff --git a/src/world/particle.c b/src/world/particle.c index fd421892e4..4d2a9b7938 100644 --- a/src/world/particle.c +++ b/src/world/particle.c @@ -71,7 +71,7 @@ void crashed_vehicle_particle_update(rct_crashed_vehicle_particle *particle) if (waterZ != 0 && particle->z >= waterZ && z <= waterZ) { // Splash - audio_play_sound_panned(SOUND_WATER_2, 0x8001, particle->x, particle->y, waterZ); + audio_play_sound_at_location(SOUND_WATER_2, particle->x, particle->y, waterZ); crash_splash_create(particle->x, particle->y, waterZ); sprite_remove((rct_sprite*)particle); return; From a07333aeafaca0b504825c1f2e357339f76c890e Mon Sep 17 00:00:00 2001 From: Dom Light Date: Wed, 18 Nov 2015 00:11:31 +0000 Subject: [PATCH 1111/1173] Move memory address documentation to header file --- src/audio/audio.c | 41 ----------------------------------------- src/audio/audio.h | 13 ++++++++++++- 2 files changed, 12 insertions(+), 42 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index f9e0f30ae8..ad7706c221 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -175,10 +175,6 @@ int audio_play_sound(int soundId, int volume, int pan) return 0; } -/** -* -* rct2: 0x006BD0F8 -*/ void audio_start_title_music() { if (gGameSoundsOff || !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO)) { @@ -210,10 +206,6 @@ void audio_start_title_music() gTitleMusicChannel = Mixer_Play_Music(pathId, MIXER_LOOP_INFINITE, true); } -/** -* -* rct2: 0x006BCA9F -*/ void audio_stop_ride_music() { for (int i = 0; i < AUDIO_MAX_RIDE_MUSIC; i++) { @@ -228,19 +220,11 @@ void audio_stop_ride_music() } } -/** -* -* rct2: 0x006BD07F -*/ void audio_stop_crowd_sound() { audio_stop_channel(&gCrowdSoundChannel); } -/** -* -* rct2: 0x006BD0BD -*/ void audio_stop_title_music() { audio_stop_channel(&gTitleMusicChannel); @@ -264,10 +248,6 @@ void audio_stop_channel(void **channel) *channel = 0; } -/** -* -* rct2: 0x006BA8E0 -*/ void audio_init_ride_sounds_and_info() { int deviceNum = 0; @@ -289,10 +269,6 @@ void audio_init_ride_sounds_and_info() } } -/** -* -* rct2: 0x006BA9B5 -*/ void audio_init_ride_sounds(int device) { audio_close(); @@ -309,10 +285,6 @@ void audio_init_ride_sounds(int device) } } -/** -* -* rct2: 0x006BAB21 -*/ void audio_close() { audio_stop_crowd_sound(); @@ -322,7 +294,6 @@ void audio_close() RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, uint32) = -1; } -/* rct2: 0x006BAB8A */ void audio_toggle_all_sounds(){ gConfigSound.sound = !gConfigSound.sound; if (gConfigSound.sound) @@ -333,10 +304,6 @@ void audio_toggle_all_sounds(){ } } -/** -* -* rct2: 0x006BABB4 -*/ void audio_pause_sounds() { gGameSoundsOff = true; @@ -346,19 +313,11 @@ void audio_pause_sounds() audio_stop_rain_sound(); } -/** -* -* rct2: 0x006BABD8 -*/ void audio_unpause_sounds() { gGameSoundsOff = false; } -/** -* -* rct2: 0x006BABDF -*/ void audio_stop_vehicle_sounds() { if (gOpenRCT2Headless || RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_SOUND_DEVICE, sint32) == -1) diff --git a/src/audio/audio.h b/src/audio/audio.h index 8c8c977d25..77c6915522 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -167,6 +167,7 @@ extern rct_vehicle_sound_params *gVehicleSoundParamsListEnd; /** * Deregisters the audio device. +* rct2: 0x006BAB21 */ void audio_close(); /* @@ -175,14 +176,17 @@ void audio_close(); void audio_init(); /** * Loads the ride sounds and info. +* rct2: 0x006BA8E0 */ void audio_init_ride_sounds_and_info(); /** -Loads the ride sounds. +* Loads the ride sounds. +* rct2: 0x006BA9B5 */ void audio_init_ride_sounds(int device); /** * Temporarily stops playing sounds until audio_unpause_sounds() is called. +* rct2: 0x006BABB4 */ void audio_pause_sounds(); /** @@ -226,10 +230,12 @@ void audio_populate_devices(); void audio_quit(); /** * Starts playing the title music. +* rct2: 0x006BD0F8 */ void audio_start_title_music(); /** * Stops the crowd sound effect from playing. +* rct2: 0x006BD07F */ void audio_stop_crowd_sound(); /** @@ -238,22 +244,27 @@ void audio_stop_crowd_sound(); void audio_stop_rain_sound(); /** * Stops ride music from playing. +* rct2: 0x006BCA9F */ void audio_stop_ride_music(); /** * Stops the title music from playing. +* rct2: 0x006BD0BD */ void audio_stop_title_music(); /** * Stops vehicle sounds from playing. +* rct2: 0x006BABDF */ void audio_stop_vehicle_sounds(); /** * Toggles whether all sounds should be played. +* rct2: 0x006BAB8A */ void audio_toggle_all_sounds(); /** * Resumes playing sounds that had been paused by a call to audio_pause_sounds(). +* rct2: 0x006BABD8 */ void audio_unpause_sounds(); From 92a30e0a3220e4638f4b6754283c03c0b573e3f3 Mon Sep 17 00:00:00 2001 From: Dom Light Date: Wed, 18 Nov 2015 00:20:22 +0000 Subject: [PATCH 1112/1173] Add missing return documentation [skip ci] --- src/audio/audio.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/audio/audio.h b/src/audio/audio.h index 77c6915522..3bfde4a2f5 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -195,6 +195,7 @@ void audio_pause_sounds(); * @param volume The volume at which the sound effect should be played. * @param pan The pan at which the sound effect should be played. If set to anything other than AUDIO_PLAY_AT_CENTRE, plays the * sound at a position relative to the centre of the viewport. +* @return 0 if the sound was not out of range; otherwise, soundId. */ int audio_play_sound(int soundId, int volume, int pan); /** @@ -203,6 +204,7 @@ int audio_play_sound(int soundId, int volume, int pan); * @param x The x coordinate of the location. * @param y The y coordinate of the location. * @param z The z coordinate of the location. +* @return 0 if the sound was not out of range; otherwise, soundId. */ int audio_play_sound_at_location(int soundId, sint16 x, sint16 y, sint16 z); /** @@ -210,9 +212,9 @@ int audio_play_sound_at_location(int soundId, sint16 x, sint16 y, sint16 z); * @deprecated Use audio_play_sound_at_location or audio_play_sound instead. * Plays the specified sound effect at a location specified by the pan parameter. * @param soundId (eax) The sound effect to play. -* @param pan (ebx) If set to AUDIO_PLAY_AT_LOCATION, play the sound at the specified location; if set to AUDIO_PLAY_AT_CENTRE, play -* the sound at the centre of the viewport; if set to anything else, use the value of pan as a relative position to the centre -* of the viewport. +* @param pan (ebx) If set to AUDIO_PLAY_AT_LOCATION, play the sound at the specified location; if set to AUDIO_PLAY_AT_CENTRE, +* play the sound at the centre of the viewport; if set to anything else, use the value of pan as a relative position to the +* centre of the viewport. * @param x (cx) The x coordinate of the location. * @param y (dx) The y coordinate of the location. * @param z (bp) The z coordinate of the location. From 64159d83d0e936307b7b054f95f220ddd789e816 Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 18 Nov 2015 04:00:17 +0000 Subject: [PATCH 1113/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/czech.txt | 466 ++++++++++++++++++++-------------------- 1 file changed, 233 insertions(+), 233 deletions(-) diff --git a/data/language/czech.txt b/data/language/czech.txt index f8f311ccf6..6770dc07d9 100644 --- a/data/language/czech.txt +++ b/data/language/czech.txt @@ -3,86 +3,86 @@ # Use # at the beginning of a line to leave a comment. STR_0000 : STR_0001 :{STRINGID} {COMMA16} -STR_0002 :Spiral Roller Coaster -STR_0003 :Stand-up Roller Coaster -STR_0004 :Suspended Swinging Coaster -STR_0005 :Inverted Roller Coaster -STR_0006 :Junior Roller Coaster -STR_0007 :Miniature Railway -STR_0008 :Monorail -STR_0009 :Mini Suspended Coaster -STR_0010 :Boat Ride -STR_0011 :Wooden Wild Mouse -STR_0012 :Steeplechase -STR_0013 :Car Ride -STR_0014 :Launched Freefall -STR_0015 :Bobsleigh Coaster -STR_0016 :Observation Tower -STR_0017 :Looping Roller Coaster -STR_0018 :Dinghy Slide -STR_0019 :Mine Train Coaster -STR_0020 :Chairlift -STR_0021 :Corkscrew Roller Coaster -STR_0022 :Maze -STR_0023 :Spiral Slide -STR_0024 :Go Karts -STR_0025 :Log Flume -STR_0026 :River Rapids -STR_0027 :Dodgems -STR_0028 :Pirate Ship -STR_0029 :Swinging Inverter Ship -STR_0030 :Food Stall +STR_0002 :Spirálová horská dráha +STR_0003 :Horská dráha ve stoje +STR_0004 :Závěsná houpající se horská dráha +STR_0005 :Obrácená horská dráha +STR_0006 :Dorostenecká horská dráha +STR_0007 :Miniaturní železnice +STR_0008 :Vysutá jednokolejka +STR_0009 :Malá zavěsná dráha +STR_0010 :Lodní dráha +STR_0011 :Divoká myš +STR_0012 :Překážkový dostih +STR_0013 :Automobilová dráha +STR_0014 :Vystřelovaný volný pád +STR_0015 :Bobová dráha +STR_0016 :Vyhlídková věž +STR_0017 :Smyčkující horská dráha +STR_0018 :Sjezd na člunech +STR_0019 :Dráha důlního vlaku +STR_0020 :Lanovka +STR_0021 :Vývrtková horská dráha +STR_0022 :Bludiště +STR_0023 :Točitá skluzavka +STR_0024 :Motokáry +STR_0025 :Žlab s kládamy +STR_0026 :Říční peřeje +STR_0027 :Autodrom +STR_0028 :Pirátská loď +STR_0029 :Houpací obracecí loď +STR_0030 :Stánek s jídlem STR_0031 :Neznámý obchod (1D) -STR_0032 :Drink Stall +STR_0032 :Stánek s pitím STR_0033 :Neznámý obchod (1F) STR_0034 :Obchod STR_0035 :Merry-Go-Round STR_0036 :Neznámý obchod (22) STR_0037 :Informačí kiosek STR_0038 :Toalety -STR_0039 :Ferris Wheel -STR_0040 :Motion Simulator +STR_0039 :Ruské kolo +STR_0040 :Simulátor pohybu STR_0041 :3D Kino STR_0042 :Top Spin STR_0043 :Space Rings STR_0044 :Reverse Freefall Coaster -STR_0045 :Lift +STR_0045 :Výtah STR_0046 :Vertical Drop Roller Coaster STR_0047 :Bankomat STR_0048 :Twist -STR_0049 :Haunted House +STR_0049 :Strašidelný dům STR_0050 :První pomoc STR_0051 :Cirkus STR_0052 :Vlak duchů STR_0053 :Steel Twister Roller Coaster -STR_0054 :Wooden Roller Coaster +STR_0054 :Dřevěná horská dráha STR_0055 :Side-Friction Roller Coaster -STR_0056 :Wild Mouse -STR_0057 :Multi-Dimension Roller Coaster +STR_0056 :Divoká myš +STR_0057 :Mnohorozměrná horská dráha STR_0058 :Neznámá atrakce (38) -STR_0059 :Flying Roller Coaster +STR_0059 :Létající horská dráha STR_0060 :Neznámá atrakce (3A) -STR_0061 :Virginia Reel -STR_0062 :Splash Boats -STR_0063 :Mini Helicopters -STR_0064 :Lay-down Roller Coaster -STR_0065 :Suspended Monorail +STR_0061 :VIrginský moták +STR_0062 :Cákající lodě +STR_0063 :Mini helikoptéra +STR_0064 :HOrská dráha v leže +STR_0065 :Vysutá jednokolejka STR_0066 :Neznámá atrakce (40) -STR_0067 :Reverser Roller Coaster +STR_0067 :Obrácená horská dráha STR_0068 :Heartline Twister Coaster STR_0069 :Mini Golf -STR_0070 :Giga Coaster +STR_0070 :Obří dráha STR_0071 :Roto-Drop -STR_0072 :Flying Saucers -STR_0073 :Crooked House -STR_0074 :Monorail Cycles +STR_0072 :Létající talíř +STR_0073 :Křivý dům +STR_0074 :Jenostopá kola STR_0075 :Compact Inverted Coaster -STR_0076 :Water Coaster +STR_0076 :Vodní dráha STR_0077 :Air Powered Vertical Coaster STR_0078 :Inverted Hairpin Coaster -STR_0079 :Magic Carpet -STR_0080 :Submarine Ride -STR_0081 :River Rafts +STR_0079 :Kouzelný koberec +STR_0080 :Podmořská jízda +STR_0081 :Rafty STR_0082 :Neznámá atrakce (50) STR_0083 :Enterprise STR_0084 :Neznámá atrakce (52) @@ -90,8 +90,8 @@ STR_0085 :Neznámá atrakce (53) STR_0086 :Neznámá atrakce (54) STR_0087 :Neznámá atrakce (55) STR_0088 :Inverted Impulse Coaster -STR_0089 :Mini Roller Coaster -STR_0090 :Mine Ride +STR_0089 :Malá horská dráha +STR_0090 :Mini dráha STR_0091 :Neznámá atrakce (59) STR_0092 :LIM Launched Roller Coaster STR_0093 : @@ -514,30 +514,30 @@ STR_0509 : STR_0510 : STR_0511 : STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. -STR_0513 :A looping roller coaster where the riders ride in a standing position -STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners -STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements -STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides -STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track -STR_0518 :Passengers travel in electric trains along a monorail track -STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners -STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water -STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. -STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them -STR_0523 :Riders travel slowly in powered vehicles along a track-based route -STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0513 :Horská dráha se smyčkami na které se jezdí ve stoje +STR_0514 :Vlaky zavješené pod kolejí se v zatáčkách houpají do stran +STR_0515 :Ocelová horská dráha s vlaky držícími zespod tratí, s mnoha složitími a otáčivímy prvky +STR_0516 :Pozvolná horská dráha pro ty kdo se zatím neodvažují na větší dráhy +STR_0517 :Pasažeři jedou v miniaturních vlacích po úzkorozchodné koleji. +STR_0518 :Cestujíci jedou v elektických vlacích po vysuté jednokolejné dráze. +STR_0519 :Cestujíci jedou zavěšení pod jednou kolejí v malích kabinách, volně se houpajících ze strany na stranu +STR_0520 :Přístavní molo kde hosté mohou řídit osobní plavidlo na vodní hladině +STR_0521 :Rychlá a mrštná horská dráha s ostrými zákrutami a strmími svahy. Dráha je předurčená k vysoké intensitě. +STR_0522 :Menší horská dráha na které hosté sedí nad dráhou bez kabiny kolem sebe +STR_0523 :Hosté jedou pomalu v hnaných vozidlech po určené trati. +STR_0524 :Kabina Freefall je pneumaticky vstřelena nahorů po vysoké ocelové věži a pak padá zpět volným pádem STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track -STR_0526 :Passengers travel in a rotating observation cabin which travels up a tall tower -STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops -STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track -STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track -STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again -STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops +STR_0526 :Pasažéři jsou v otáčející se rozhledně která vyjede na vysokou věž +STR_0527 :Plynulá ocelová pásová horská dráha schopná vertikálních smyček +STR_0528 :Hosté sjíždí v nafukovacích člunech zatáčejícím korytem nebo uzavřenou trubicí +STR_0529 :Ocelová horská dráha ve stylu důlního vlaku s věrnými důlními kolejemi. +STR_0530 :Kabiny vysí na ocelovém laně které nepřetržitě jede z jednoho konce na druhý a zpět +STR_0531 :Kompaktní ocelová horská dráha na které vlak projíždí smyčky a vývrtky STR_0532 : STR_0533 : -STR_0534 :Self-drive petrol-engined go karts -STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders -STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids +STR_0534 :Hosté sami řídí benzínové motokáry +STR_0535 :Lodě ve tvaru klády jedou po vodní kanále, splavujíse se po strmích kopcích. Žádny host nezůstane suchý. +STR_0536 :Loď pluje po šírokých maeandrech, přes stříkající vodpoády a po vzrušujících pěnících přejích STR_0537 : STR_0538 : STR_0539 : @@ -556,36 +556,36 @@ STR_0551 : STR_0552 : STR_0553 : STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station -STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another -STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience +STR_0555 :Hosté jedou ve výtahu nahoů nebo dolů ve svislé věži aby se dostaly z jedné výsky do jiné +STR_0556 :Extra široké vozy se vrhaji střemhlav dolů za zážitky úplného volného pádu na horské dráze STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects +STR_0562 :Hnané vozy jedou po několika-patrové dráze plné strašidelných kulis a speciálních efektů STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills -STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' -STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity +STR_0564 :Při jízdou po dřevěné dráze je tato horská dráha rychlá, drsná, hlučná a poskytuje pocit „vymuknutí řízení“ s mnoha „pocity beztíže“ +STR_0565 :Jednoduchá dřevěná horská tráha schopná jen mírných kopců a zatáček, na které je vůz držen jen bočnímy kolečky a gravitací STR_0566 :Individual roller coaster cars zip around a tight zig-zag layout of track with sharp corners and short sharp drops STR_0567 :Sitting in seats suspended either side of the track, riders are pitched head-over-heels while they plunge down steep drops and travel through various inversions STR_0568 : -STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air +STR_0569 :Jíza ve speciálních postrojích zavěšených pod tratí, poskytuje pocit letu, jako když se vrhnete do prázdna STR_0570 : -STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track -STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash -STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders -STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground -STR_0575 :Powered trains hanging from a single rail transport people around the park +STR_0571 :Kulaté vozy se otáčeí dokola tím jak projíždějí dřevěnou klikatou tratí +STR_0572 :Lodě s velkou kapacitou jedou po širokém vodním kanále, vzhůru poháněné bežícím pásem, zrychlují z prudkých svahů aby obrovským šplouchnutím namočili všechny hosty +STR_0573 :Hnané vozy ve tvaru helikoptér jedou na ocelové trati +STR_0574 :Hosté ve speciálních postrojích zavěšení v leže pod tratí, jedou přes zákruty a obraty pozadu nebo čelem k zemi +STR_0575 :Poháněné vlaky vysící pod vysuto kolejí převážejí lidi po parku STR_0576 : -STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections +STR_0577 :Vozy s dvěma podvozky jedou po dřevěné trati, otáčející se dokola na speciálních místech STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists STR_0579 : -STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft -STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes +STR_0580 :Obrovská ocelová horská dráha s hladkými obraty a svahy přes 90 metrů +STR_0581 :Kruh sedadel je za pomalého otáčení vyzdvyhnut na vrchol věže, poté se vrátí volným pádem a postupně zastaví ve stanici pomocí magnetických brzd STR_0582 : STR_0583 : -STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0584 :Speciální kola jezdí po ocelové koleji, poháněná šlapáním jezdců STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station @@ -893,55 +893,55 @@ STR_0887 :Ukončit Scenario Editor STR_0888 :Ukončit Roller Coaster Designer STR_0889 :Ukončit Track Designs Manager STR_0890 :SCR{COMMA16}.BMP -STR_0891 :Screenshot -STR_0892 :Screenshot byl uložen jako '{STRINGID}' -STR_0893 :Screenshot selhal ! +STR_0891 :Snímek obrazovky +STR_0892 :Snímek obrazovky byl uložen jako '{STRINGID}' +STR_0893 :Snímaní obrazovky selhalo ! STR_0894 :Landscape data area full ! -STR_0895 :Can't build partly above and partly below ground +STR_0895 :Nelze stavět částečně pod a nad zemí STR_0896 :{POP16}{POP16}{STRINGID} Construction STR_0897 :Direction -STR_0898 :{SMALLFONT}{BLACK}Left-hand curve -STR_0899 :{SMALLFONT}{BLACK}Right-hand curve -STR_0900 :{SMALLFONT}{BLACK}Left-hand curve (small radius) -STR_0901 :{SMALLFONT}{BLACK}Right-hand curve (small radius) -STR_0902 :{SMALLFONT}{BLACK}Left-hand curve (very small radius) -STR_0903 :{SMALLFONT}{BLACK}Right-hand curve (very small radius) -STR_0904 :{SMALLFONT}{BLACK}Left-hand curve (large radius) -STR_0905 :{SMALLFONT}{BLACK}Right-hand curve (large radius) -STR_0906 :{SMALLFONT}{BLACK}Straight -STR_0907 :Slope +STR_0898 :{SMALLFONT}{BLACK}Zatáčka vlevo +STR_0899 :{SMALLFONT}{BLACK}Zatáčka vpravo +STR_0900 :{SMALLFONT}{BLACK}Zatáčka vlevo (malý poloměr) +STR_0901 :{SMALLFONT}{BLACK}Zatáčka vpravo (malý poloměr) +STR_0902 :{SMALLFONT}{BLACK}Zatáčka vlevo (velmi malý poloměr) +STR_0903 :{SMALLFONT}{BLACK}Zatáčka vpravo (velmi malý poloměr) +STR_0904 :{SMALLFONT}{BLACK}Zatáčka vlevo (velký poloměr) +STR_0905 :{SMALLFONT}{BLACK}Zatáčka vpravo (velký poloměr) +STR_0906 :{SMALLFONT}{BLACK}Rovinka +STR_0907 :Svah STR_0908 :Roll/Banking -STR_0909 :Seat Rot. +STR_0909 :Otáčení sedadel STR_0910 :{SMALLFONT}{BLACK}Roll for left-hand curve STR_0911 :{SMALLFONT}{BLACK}Roll for right-hand curve STR_0912 :{SMALLFONT}{BLACK}No roll -STR_0913 :{SMALLFONT}{BLACK}Move to previous section -STR_0914 :{SMALLFONT}{BLACK}Move to next section -STR_0915 :{SMALLFONT}{BLACK}Construct the selected section -STR_0916 :{SMALLFONT}{BLACK}Remove the highlighted section -STR_0917 :{SMALLFONT}{BLACK}Vertical drop -STR_0918 :{SMALLFONT}{BLACK}Steep slope down -STR_0919 :{SMALLFONT}{BLACK}Slope down -STR_0920 :{SMALLFONT}{BLACK}Level -STR_0921 :{SMALLFONT}{BLACK}Slope up -STR_0922 :{SMALLFONT}{BLACK}Steep slope up -STR_0923 :{SMALLFONT}{BLACK}Vertical rise -STR_0924 :{SMALLFONT}{BLACK}Helix down -STR_0925 :{SMALLFONT}{BLACK}Helix up +STR_0913 :{SMALLFONT}{BLACK}Posunout na předchozí část +STR_0914 :{SMALLFONT}{BLACK}Posunout na následující část +STR_0915 :{SMALLFONT}{BLACK}Postavit vybranou část +STR_0916 :{SMALLFONT}{BLACK}Odstranit vybranou část +STR_0917 :{SMALLFONT}{BLACK}Kolmo dolů +STR_0918 :{SMALLFONT}{BLACK}Strmý svah dolů +STR_0919 :{SMALLFONT}{BLACK}Svah dolů +STR_0920 :{SMALLFONT}{BLACK}Vodorovně +STR_0921 :{SMALLFONT}{BLACK}Svah vzhůtu +STR_0922 :{SMALLFONT}{BLACK}Prudce vzhůru +STR_0923 :{SMALLFONT}{BLACK}Kolmo nahorů +STR_0924 :{SMALLFONT}{BLACK}Šroubovice dolů +STR_0925 :{SMALLFONT}{BLACK}Šroubovice vzhůru STR_0926 :Tohle nelze odstranit... STR_0927 :Tohle zde nejde postavit... -STR_0928 :{SMALLFONT}{BLACK}Chain lift, to pull cars up slopes -STR_0929 :'S' Bend (left) -STR_0930 :'S' Bend (right) -STR_0931 :Vertical Loop (left) -STR_0932 :Vertical Loop (right) -STR_0933 :Raise or lower land first -STR_0934 :Ride entrance in the way -STR_0935 :Ride exit in the way -STR_0936 :Park entrance in the way +STR_0928 :{SMALLFONT}{BLACK}Řetězový vlek, pro pohon vozů do svahu +STR_0929 :'S' Ohyb (levý) +STR_0930 :'S' Ohyb (pravý) +STR_0931 :Svislá Smyčka (levá) +STR_0932 :Svislá Smyčka (pravá) +STR_0933 :Nejdříve zvyš nebo sniž povrch +STR_0934 :Vstup na atrakci v cestě +STR_0935 :Výtup z atrakce v cestě +STR_0936 :Vchod do parku v cestě STR_0937 :{SMALLFONT}{BLACK}View options STR_0938 :{SMALLFONT}{BLACK}Adjust land height and slope -STR_0939 :Underground/Inside View +STR_0939 :POdzemní/Vnitří pohled STR_0940 :Remove Base Land STR_0941 :Remove Vertical Faces STR_0942 :Průhledné atrakce @@ -957,7 +957,7 @@ STR_0951 :Ukončit hru STR_0952 :Ukončit hru STR_0953 :Nahrát krajinu STR_0954 : -STR_0955 :{SMALLFONT}{BLACK}Select seat rotation angle for this track section +STR_0955 :{SMALLFONT}{BLACK}Vyberte úhel otočení sedadel pro tuto část trati STR_0956 :-180{DEGREE} STR_0957 :-135{DEGREE} STR_0958 :-90{DEGREE} @@ -1223,8 +1223,8 @@ STR_1217 :{COMMA16} sekund STR_1218 :{BLACK}{SMALLUP} STR_1219 :{BLACK}{SMALLDOWN} STR_1220 :Jen východ -STR_1221 :No entrance -STR_1222 :No exit +STR_1221 :Nemá vchod +STR_1222 :Chybí východ STR_1223 :{SMALLFONT}{BLACK}Transport rides STR_1224 :{SMALLFONT}{BLACK}Gentle rides STR_1225 :{SMALLFONT}{BLACK}Roller coasters @@ -1245,13 +1245,13 @@ STR_1239 :Loďe STR_1240 :{COMMA16} loď STR_1241 :{COMMA16} loďe STR_1242 :Loď {COMMA16} -STR_1243 :track -STR_1244 :tracks -STR_1245 :Track -STR_1246 :Tracks -STR_1247 :{COMMA16} track -STR_1248 :{COMMA16} tracks -STR_1249 :Track {COMMA16} +STR_1243 :dráha +STR_1244 :dráhy +STR_1245 :Dráha +STR_1246 :Dráhy +STR_1247 :{COMMA16} dráha +STR_1248 :{COMMA16} dráhy +STR_1249 :Dráha {COMMA16} STR_1250 :docking platform STR_1251 :docking platforms STR_1252 :Docking platform @@ -1287,27 +1287,27 @@ STR_1281 :Structures STR_1282 :{COMMA16} structure STR_1283 :{COMMA16} structures STR_1284 :Structure {COMMA16} -STR_1285 :ship -STR_1286 :ships -STR_1287 :Ship -STR_1288 :Ships -STR_1289 :{COMMA16} ship -STR_1290 :{COMMA16} ships -STR_1291 :Ship {COMMA16} -STR_1292 :cabin -STR_1293 :cabins -STR_1294 :Cabin -STR_1295 :Cabins -STR_1296 :{COMMA16} cabin -STR_1297 :{COMMA16} cabins -STR_1298 :Cabin {COMMA16} -STR_1299 :wheel -STR_1300 :wheels -STR_1301 :Wheel -STR_1302 :Wheels -STR_1303 :{COMMA16} wheel -STR_1304 :{COMMA16} wheels -STR_1305 :Wheel {COMMA16} +STR_1285 :loď +STR_1286 :lodě +STR_1287 :Loď +STR_1288 :Lodě +STR_1289 :{COMMA16} loď +STR_1290 :{COMMA16} lodě +STR_1291 :Loď {COMMA16} +STR_1292 :kabina +STR_1293 :kabiny +STR_1294 :Kabina +STR_1295 :Kabiny +STR_1296 :{COMMA16} kabina +STR_1297 :{COMMA16} kabin +STR_1298 :Kabina {COMMA16} +STR_1299 :kolo +STR_1300 :kol +STR_1301 :Kolo +STR_1302 :Kol +STR_1303 :{COMMA16} kolo +STR_1304 :{COMMA16} kol +STR_1305 :Kolo {COMMA16} STR_1306 :ring STR_1307 :rings STR_1308 :Ring @@ -1315,13 +1315,13 @@ STR_1309 :Rings STR_1310 :{COMMA16} ring STR_1311 :{COMMA16} rings STR_1312 :Ring {COMMA16} -STR_1313 :player -STR_1314 :players -STR_1315 :Player -STR_1316 :Players -STR_1317 :{COMMA16} player -STR_1318 :{COMMA16} players -STR_1319 :Player {COMMA16} +STR_1313 :hráč +STR_1314 :hráči +STR_1315 :Hráč +STR_1316 :Hráči +STR_1317 :{COMMA16} hráč +STR_1318 :{COMMA16} hráči +STR_1319 :Hráč {COMMA16} STR_1320 :course STR_1321 :courses STR_1322 :Course @@ -1356,39 +1356,39 @@ STR_1350 :{WINDOW_COLOUR_2}Max. negative vertical G's: {BLACK}{COMMA2DP32}g STR_1351 :{WINDOW_COLOUR_2}Max. negative vertical G's: {OUTLINE}{RED}{COMMA2DP32}g STR_1352 :{WINDOW_COLOUR_2}Max. lateral G's: {BLACK}{COMMA2DP32}g STR_1353 :{WINDOW_COLOUR_2}Max. lateral G's: {OUTLINE}{RED}{COMMA2DP32}g -STR_1354 :{WINDOW_COLOUR_2}Highest drop height: {BLACK}{LENGTH} -STR_1355 :{WINDOW_COLOUR_2}Drops: {BLACK}{COMMA16} -STR_1356 :{WINDOW_COLOUR_2}Inversions: {BLACK}{COMMA16} +STR_1354 :{WINDOW_COLOUR_2}Nejvyšší pád: {BLACK}{LENGTH} +STR_1355 :{WINDOW_COLOUR_2}Pádů: {BLACK}{COMMA16} +STR_1356 :{WINDOW_COLOUR_2}Obratů: {BLACK}{COMMA16} STR_1357 :{WINDOW_COLOUR_2}Holes: {BLACK}{COMMA16} -STR_1358 :{WINDOW_COLOUR_2}Total 'air' time: {BLACK}{COMMA2DP32}secs +STR_1358 :{WINDOW_COLOUR_2}Celkem ve stav beztíže: {BLACK}{COMMA2DP32}sekund STR_1359 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minute STR_1360 :{WINDOW_COLOUR_2}Queue time: {BLACK}{COMMA16} minutes STR_1361 :Can't change speed... STR_1362 :Can't change launch speed... STR_1363 :Too high for supports! STR_1364 :Supports for track above can't be extended any further! -STR_1365 :In-line Twist (left) -STR_1366 :In-line Twist (right) -STR_1367 :Half Loop -STR_1368 :Half Corkscrew (left) -STR_1369 :Half Corkscrew (right) -STR_1370 :Barrel Roll (left) -STR_1371 :Barrel Roll (right) +STR_1365 :Otočka kolem trati (levá) +STR_1366 :Otočka kolem trati (pravá) +STR_1367 :Poloviční smyčka +STR_1368 :Poloviční Vývrtka (levá) +STR_1369 :Poloviční Vývrtka (pravá) +STR_1370 :Sudový výkrut (levý) +STR_1371 :Sudový výkrut (pravý) STR_1372 :Launched Lift Hill -STR_1373 :Large Half Loop (left) -STR_1374 :Large Half Loop (right) -STR_1375 :Upper Transfer -STR_1376 :Lower Transfer -STR_1377 :Heartline Roll (left) -STR_1378 :Heartline Roll (right) -STR_1379 :Reverser (left) -STR_1380 :Reverser (right) -STR_1381 :Curved Lift Hill (left) -STR_1382 :Curved Lift Hill (right) -STR_1383 :Quarter Loop +STR_1373 :Velká Poloviční Vývrtka (levá) +STR_1374 :Velká Poloviční Vývrtka (pravá) +STR_1375 :Přechod vzhůru +STR_1376 :Přechod dolů +STR_1377 :Otočka kolem těla (levá) +STR_1378 :Otočka kolem těla (pravá) +STR_1379 :Obrat (levý) +STR_1380 :Obrat (Pravy) +STR_1381 :Zahnutý vlečný svah (vlevo) +STR_1382 :Zahnutý vlečný svah (vpravo) +STR_1383 :Čtvrt smyčky STR_1384 :{YELLOW}{STRINGID} STR_1385 :{SMALLFONT}{BLACK}Other track configurations -STR_1386 :Special... +STR_1386 :Zvláštní... STR_1387 :Can't change land type... STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} STR_1389 :{OUTLINE}{RED}- {CURRENCY} @@ -1402,17 +1402,17 @@ STR_1396 :{SMALLFONT}{BLACK}Colour scheme options STR_1397 :{SMALLFONT}{BLACK}Sound & music options STR_1398 :{SMALLFONT}{BLACK}Measurements and test data STR_1399 :{SMALLFONT}{BLACK}Graphs -STR_1400 :Entrance -STR_1401 :Exit +STR_1400 :Vchod +STR_1401 :Východ STR_1402 :{SMALLFONT}{BLACK}Build or move entrance to ride/attraction STR_1403 :{SMALLFONT}{BLACK}Build or move exit from ride/attraction -STR_1404 :{SMALLFONT}{BLACK}Rotate 90{DEGREE} -STR_1405 :{SMALLFONT}{BLACK}Mirror image +STR_1404 :{SMALLFONT}{BLACK}Otočit o 90{DEGREE} +STR_1405 :{SMALLFONT}{BLACK}Zrcadlový obraz STR_1406 :{SMALLFONT}{BLACK}Toggle scenery on/off (if available for this design) STR_1407 :{WINDOW_COLOUR_2}Build this... -STR_1408 :{WINDOW_COLOUR_2}Cost: {BLACK}{CURRENCY} +STR_1408 :{WINDOW_COLOUR_2}Cena: {BLACK}{CURRENCY} STR_1409 :Entry/Exit Platform -STR_1410 :Vertical Tower +STR_1410 :Svislá věž STR_1411 :{STRINGID} v cestě STR_1412 :{WINDOW_COLOUR_3}Data logging not available for this type of ride STR_1413 :{WINDOW_COLOUR_3}Data logging will start when next {STRINGID} leaves {STRINGID} @@ -1442,38 +1442,38 @@ STR_1436 :In {STRINGID} STR_1437 :At {STRINGID} STR_1438 :Sitting STR_1439 :(select location) -STR_1440 :Mowing grass -STR_1441 :Sweeping footpath -STR_1442 :Emptying litter bin -STR_1443 :Watering gardens -STR_1444 :Watching {STRINGID} -STR_1445 :Watching construction of {STRINGID} -STR_1446 :Looking at scenery -STR_1447 :Leaving the park -STR_1448 :Watching new ride being constructed +STR_1440 :Seká trávu +STR_1441 :Zametá cestu +STR_1442 :Vynáši odpadkový koš +STR_1443 :Zalévá záhon +STR_1444 :Sleduje {STRINGID} +STR_1445 :Sleduje vystavbu {STRINGID} +STR_1446 :Prohlíží si prostředí +STR_1447 :Opouští park +STR_1448 :Sleduje výstavbu nové trti STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) -STR_1452 :Guest's name -STR_1453 :Enter name for this guest: -STR_1454 :Can't name guest... -STR_1455 :Invalid name for guest -STR_1456 :{WINDOW_COLOUR_2}Cash spent: {BLACK}{CURRENCY2DP} -STR_1457 :{WINDOW_COLOUR_2}Cash in pocket: {BLACK}{CURRENCY2DP} -STR_1458 :{WINDOW_COLOUR_2}Time in park: {BLACK}{REALTIME} +STR_1452 :Jméno hosta +STR_1453 :Vložte jméno tohoto hosta: +STR_1454 :Nelze pojmenovat hosta... +STR_1455 :Neplatné jméno pro hosta +STR_1456 :{WINDOW_COLOUR_2}Utracených peněz: {BLACK}{CURRENCY2DP} +STR_1457 :{WINDOW_COLOUR_2}Peněz v kapse: {BLACK}{CURRENCY2DP} +STR_1458 :{WINDOW_COLOUR_2}Čas strávený v parku: {BLACK}{REALTIME} STR_1459 :Track style -STR_1460 :{SMALLFONT}{BLACK}'U' shaped open track -STR_1461 :{SMALLFONT}{BLACK}'O' shaped enclosed track -STR_1462 :Too steep for lift hill -STR_1463 :Guests -STR_1464 :Helix up (small) -STR_1465 :Helix up (large) -STR_1466 :Helix down (small) -STR_1467 :Helix down (large) -STR_1468 :Staff -STR_1469 :Ride must start and end with stations -STR_1470 :Station not long enough -STR_1471 :{WINDOW_COLOUR_2}Speed: +STR_1460 :{SMALLFONT}{BLACK}otevřená trať ve tvaru 'U' +STR_1461 :{SMALLFONT}{BLACK}uzavřená trať ve tvaru 'O' +STR_1462 :Svah je pro vlečení příliš strmí +STR_1463 :Hostů +STR_1464 :Šroubovice vzhůru (small) +STR_1465 :Šroubovice vzhůru (large) +STR_1466 :Šroubovice dolů (small) +STR_1467 :Šroubovice dolů (large) +STR_1468 :Personál +STR_1469 :Dráha musí začínat a končit stanicí +STR_1470 :Stanice není dost dlouhá +STR_1471 :{WINDOW_COLOUR_2}Rychlost: STR_1472 :{SMALLFONT}{BLACK}Speed of this ride STR_1473 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}{COMMA2DP32} ({STRINGID}) STR_1474 :{WINDOW_COLOUR_2}Excitement rating: {BLACK}Not yet available @@ -1554,16 +1554,16 @@ STR_1548 : STR_1549 : STR_1550 :{SMALLFONT}{OPENQUOTES}Wow!{ENDQUOTES} STR_1551 :{SMALLFONT}{OPENQUOTES}I have the strangest feeling someone is watching me{ENDQUOTES} -STR_1552 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a balloon from {STRINGID}{ENDQUOTES} -STR_1553 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a cuddly toy from {STRINGID}{ENDQUOTES} -STR_1554 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a park map from {STRINGID}{ENDQUOTES} -STR_1555 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an on-ride photo from {STRINGID}{ENDQUOTES} -STR_1556 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an umbrella from {STRINGID}{ENDQUOTES} -STR_1557 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a drink from {STRINGID}{ENDQUOTES} -STR_1558 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for a burger from {STRINGID}{ENDQUOTES} -STR_1559 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for chips from {STRINGID}{ENDQUOTES} -STR_1560 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for an ice cream from {STRINGID}{ENDQUOTES} -STR_1561 :{SMALLFONT}{OPENQUOTES}I'm not paying that much for candyfloss from {STRINGID}{ENDQUOTES} +STR_1552 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a balloon from {STRINGID}{ENDQUOTES} +STR_1553 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a cuddly toy from {STRINGID}{ENDQUOTES} +STR_1554 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a park map from {STRINGID}{ENDQUOTES} +STR_1555 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za an on-ride photo from {STRINGID}{ENDQUOTES} +STR_1556 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za an umbrella from {STRINGID}{ENDQUOTES} +STR_1557 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a drink from {STRINGID}{ENDQUOTES} +STR_1558 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za a burger from {STRINGID}{ENDQUOTES} +STR_1559 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za chips from {STRINGID}{ENDQUOTES} +STR_1560 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za an ice cream from {STRINGID}{ENDQUOTES} +STR_1561 :{SMALLFONT}{OPENQUOTES}Nezaplatím tak moc za candyfloss from {STRINGID}{ENDQUOTES} STR_1562 : STR_1563 : STR_1564 : From 0081fb84353d9a7c8436d094f17a7402788e0d85 Mon Sep 17 00:00:00 2001 From: Harry Lam Date: Wed, 18 Nov 2015 13:54:22 +0800 Subject: [PATCH 1114/1173] Update language.cpp (CHT font) Microsoft removed "MingLiu.ttc" in Windows 10 1511 for no reason. The alternative, "MingLiub.ttc" (which support more characters and existed since Vista (https://www.microsoft.com/typography/fonts/font.aspx?FMID=1772)) is kept instead. --- src/localisation/language.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index 5c1bacd1b9..c9ac95611d 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -49,9 +49,9 @@ enum { static TTFFontSetDescriptor TTFFontMingLiu = {{ { "msjh.ttc", 9, -1, -3, 6, nullptr }, - { "mingliu.ttc", 11, 1, 1, 12, nullptr }, - { "mingliu.ttc", 12, 1, 0, 12, nullptr }, - { "mingliu.ttc", 13, 1, 0, 20, nullptr }, + { "mingliub.ttc", 11, 1, 1, 12, nullptr }, + { "mingliub.ttc", 12, 1, 0, 12, nullptr }, + { "mingliub.ttc", 13, 1, 0, 20, nullptr }, }}; static TTFFontSetDescriptor TTFFontSimSun = {{ From 55fb03fa7589363d71c1c58389830b53f9ec4529 Mon Sep 17 00:00:00 2001 From: Dom Light Date: Wed, 18 Nov 2015 14:01:29 +0000 Subject: [PATCH 1115/1173] Replace a call to audio_play_sound_panned --- src/peep/peep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 0821ef9c89..57c2b46867 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7851,7 +7851,7 @@ static void peep_on_exit_ride(rct_peep *peep, int rideIndex) int laugh = scenario_rand() & 7; if (laugh < 3) { - audio_play_sound_panned(SOUND_LAUGH_1 + laugh, 0x8001, peep->x, peep->y, peep->z); + audio_play_sound_at_location(SOUND_LAUGH_1 + laugh, peep->x, peep->y, peep->z); } } From 6c8c5a157f61a8e57705f10e7455aefa23d36d1d Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Wed, 18 Nov 2015 17:48:14 +0000 Subject: [PATCH 1116/1173] Fix #2335. Increase land window size to show price correctly. --- src/windows/land.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/windows/land.c b/src/windows/land.c index 066c435944..f97044bcea 100644 --- a/src/windows/land.c +++ b/src/windows/land.c @@ -45,7 +45,7 @@ enum WINDOW_LAND_WIDGET_IDX { }; static rct_widget window_land_widgets[] = { - { WWT_FRAME, 0, 0, 97, 0, 143, -1, STR_NONE }, // panel / background + { WWT_FRAME, 0, 0, 97, 0, 159, -1, STR_NONE }, // panel / background { WWT_CAPTION, 0, 1, 96, 1, 14, STR_LAND, STR_WINDOW_TITLE_TIP }, // title bar { WWT_CLOSEBOX, 0, 85, 95, 2, 13, 824, STR_CLOSE_WINDOW_TIP }, // close x button @@ -133,7 +133,7 @@ void window_land_open() if (window_find_by_class(WC_LAND) != NULL) return; - window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 98, 29, 98, 144, &window_land_events, WC_LAND, 0); + window = window_create(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 98, 29, 98, 160, &window_land_events, WC_LAND, 0); window->widgets = window_land_widgets; window->enabled_widgets = (1 << WIDX_CLOSE) | From c4ad2346e3e44448eab8d9797d9797d3711b3e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sun, 15 Nov 2015 23:54:33 +0100 Subject: [PATCH 1117/1173] Fixes for building optimized binary on Linux Use `-DCMAKE_BUILD_TYPE=X`, where X: - `RELEASE` - `RELWITHDEBINFO` - `MINSIZEREL` Only works for GCC, clang binaries crash for now. --- CMakeLists.txt | 4 +- projects/openrct2.vcxproj | 3 +- src/addresses.c | 208 ++++++++++++++++++++++++++++++++++++++ src/addresses.h | 201 +----------------------------------- src/platform/platform.h | 2 +- 5 files changed, 215 insertions(+), 203 deletions(-) create mode 100644 src/addresses.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 3664d6f6a1..3eba8200d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,8 +61,8 @@ file(GLOB_RECURSE ORCT2_SOURCES "src/*.c" "src/*.cpp" "lib/argparse/*.c" "lib/cu if (UNIX) # force 32bit build for now and set necessary flags to compile code as is - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -std=gnu99") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -std=gnu++11") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -std=gnu99 -fno-omit-frame-pointer") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -std=gnu++11 -fno-omit-frame-pointer") set(CMAKE_SHARED_LINKER_FLAGS "-m32") set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}) endif (UNIX) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 75abfce101..7811e240ca 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -28,6 +28,7 @@ + @@ -508,4 +509,4 @@ xcopy /YS "$(SolutionDir)..\Data" "$(TargetDir)Data" - \ No newline at end of file + diff --git a/src/addresses.c b/src/addresses.c new file mode 100644 index 0000000000..0e9f4d3a89 --- /dev/null +++ b/src/addresses.c @@ -0,0 +1,208 @@ +#include "addresses.h" + +#if defined(__GNUC__) +#define DISABLE_OPT __attribute__((noinline,optimize("O0"))) +#else +#define DISABLE_OPT +#endif // defined(__GNUC__) + +int DISABLE_OPT RCT2_CALLPROC_X(int address, int _eax, int _ebx, int _ecx, int _edx, int _esi, int _edi, int _ebp) +{ + int result; + #ifdef _MSC_VER + __asm { + push ebp + push address + mov eax, _eax + mov ebx, _ebx + mov ecx, _ecx + mov edx, _edx + mov esi, _esi + mov edi, _edi + mov ebp, _ebp + call [esp] + lahf + pop ebp + pop ebp + /* Load result with flags */ + mov result, eax + } + #else + __asm__ volatile ( "\ + \n\ + push %%ebx \n\ + push %%ebp \n\ + push %[address] \n\ + mov %[eax], %%eax \n\ + mov %[ebx], %%ebx \n\ + mov %[ecx], %%ecx \n\ + mov %[edx], %%edx \n\ + mov %[esi], %%esi \n\ + mov %[edi], %%edi \n\ + mov %[ebp], %%ebp \n\ + call *(%%esp) \n\ + lahf \n\ + add $4, %%esp \n\ + pop %%ebp \n\ + pop %%ebx \n\ + /* Load result with flags */ \n\ + mov %%eax, %[result] \n\ + " : [address] "+m" (address), [eax] "+m" (_eax), [ebx] "+m" (_ebx), [ecx] "+m" (_ecx), [edx] "+m" (_edx), [esi] "+m" (_esi), [edi] "+m" (_edi), [ebp] "+m" (_ebp), [result] "+m" (result) + : + : "eax","ecx","edx","esi","edi","memory" + ); + #endif + // lahf only modifies ah, zero out the rest + return result & 0xFF00; +} + +int DISABLE_OPT RCT2_CALLFUNC_X(int address, int *_eax, int *_ebx, int *_ecx, int *_edx, int *_esi, int *_edi, int *_ebp) +{ + int result; + #ifdef _MSC_VER + __asm { + // Store C's base pointer + push ebp + push ebx + // Store address to call + push address + + // Set all registers to the input values + mov eax, [_eax] + mov eax, [eax] + mov ebx, [_ebx] + mov ebx, [ebx] + mov ecx, [_ecx] + mov ecx, [ecx] + mov edx, [_edx] + mov edx, [edx] + mov esi, [_esi] + mov esi, [esi] + mov edi, [_edi] + mov edi, [edi] + mov ebp, [_ebp] + mov ebp, [ebp] + + // Call function + call [esp] + + // Store output eax + push eax + push ebp + push ebx + mov ebp, [esp + 20] + mov ebx, [esp + 16] + + // Get resulting ecx, edx, esi, edi registers + + mov eax, [_edi] + mov [eax], edi + mov eax, [_esi] + mov [eax], esi + mov eax, [_edx] + mov [eax], edx + mov eax, [_ecx] + mov [eax], ecx + + // Pop ebx reg into ecx + pop ecx + mov eax, [_ebx] + mov[eax], ecx + + // Pop ebp reg into ecx + pop ecx + mov eax, [_ebp] + mov[eax], ecx + + pop eax + // Get resulting eax register + mov ecx, [_eax] + mov [ecx], eax + + // Save flags as return in eax + lahf + // Pop address + pop ebp + + pop ebx + pop ebp + /* Load result with flags */ + mov result, eax + } + #else + __asm__ volatile ( "\ + \n\ + /* Store C's base pointer*/ \n\ + push %%ebp \n\ + push %%ebx \n\ + \n\ + /* Store %[address] to call*/ \n\ + push %[address] \n\ + \n\ + /* Set all registers to the input values*/ \n\ + mov %[_eax], %%eax \n\ + mov (%%eax), %%eax \n\ + mov %[_ebx], %%ebx \n\ + mov (%%ebx), %%ebx \n\ + mov %[_ecx], %%ecx \n\ + mov (%%ecx), %%ecx \n\ + mov %[_edx], %%edx \n\ + mov (%%edx), %%edx \n\ + mov %[_esi], %%esi \n\ + mov (%%esi), %%esi \n\ + mov %[_edi], %%edi \n\ + mov (%%edi), %%edi \n\ + mov %[_ebp], %%ebp \n\ + mov (%%ebp), %%ebp \n\ + \n\ + /* Call function*/ \n\ + call *(%%esp) \n\ + \n\ + /* Store output eax */ \n\ + push %%eax \n\ + push %%ebp \n\ + push %%ebx \n\ + mov 20(%%esp), %%ebp \n\ + mov 16(%%esp), %%ebx \n\ + /* Get resulting ecx, edx, esi, edi registers*/ \n\ + mov %[_edi], %%eax \n\ + mov %%edi, (%%eax) \n\ + mov %[_esi], %%eax \n\ + mov %%esi, (%%eax) \n\ + mov %[_edx], %%eax \n\ + mov %%edx, (%%eax) \n\ + mov %[_ecx], %%eax \n\ + mov %%ecx, (%%eax) \n\ + /* Pop ebx reg into ecx*/ \n\ + pop %%ecx \n\ + mov %[_ebx], %%eax \n\ + mov %%ecx, (%%eax) \n\ + \n\ + /* Pop ebp reg into ecx */\n\ + pop %%ecx \n\ + mov %[_ebp], %%eax \n\ + mov %%ecx, (%%eax) \n\ + \n\ + pop %%eax \n\ + /* Get resulting eax register*/ \n\ + mov %[_eax], %%ecx \n\ + mov %%eax, (%%ecx) \n\ + \n\ + /* Save flags as return in eax*/ \n\ + lahf \n\ + /* Pop address*/ \n\ + pop %%ebp \n\ + \n\ + pop %%ebx \n\ + pop %%ebp \n\ + /* Load result with flags */ \n\ + mov %%eax, %[result] \n\ + " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp), [result] "+m" (result) + + : + : "eax","ecx","edx","esi","edi","memory" + ); + #endif + // lahf only modifies ah, zero out the rest + return result & 0xFF00; +} diff --git a/src/addresses.h b/src/addresses.h index e4b4371a39..7f2622284e 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -650,55 +650,7 @@ *P = Parity flag *All other bits are undefined. */ -static int RCT2_CALLPROC_X(int address, int _eax, int _ebx, int _ecx, int _edx, int _esi, int _edi, int _ebp) -{ - int result; - #ifdef _MSC_VER - __asm { - push ebp - push address - mov eax, _eax - mov ebx, _ebx - mov ecx, _ecx - mov edx, _edx - mov esi, _esi - mov edi, _edi - mov ebp, _ebp - call [esp] - lahf - pop ebp - pop ebp - /* Load result with flags */ - mov result, eax - } - #else - __asm__ ( "\ - \n\ - push %%ebx \n\ - push %%ebp \n\ - push %[address] \n\ - mov %[_eax], %%eax \n\ - mov %[_ebx], %%ebx \n\ - mov %[_ecx], %%ecx \n\ - mov %[_edx], %%edx \n\ - mov %[_esi], %%esi \n\ - mov %[_edi], %%edi \n\ - mov %[_ebp], %%ebp \n\ - call *(%%esp) \n\ - lahf \n\ - add $4, %%esp \n\ - pop %%ebp \n\ - pop %%ebx \n\ - /* Load result with flags */ \n\ - mov %%eax, %[result] \n\ - " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp), [result] "+m" (result) - : - : "eax","ecx","edx","esi","edi" - ); - #endif - // lahf only modifies ah, zero out the rest - return result & 0xFF00; -} +int RCT2_CALLPROC_X(int address, int _eax, int _ebx, int _ecx, int _edx, int _esi, int _edi, int _ebp); static int RCT2_CALLPROC_EBPSAFE(int address) { @@ -716,156 +668,7 @@ static int RCT2_CALLPROC_EBPSAFE(int address) *P = Parity flag *All other bits are undefined. */ -static int RCT2_CALLFUNC_X(int address, int *_eax, int *_ebx, int *_ecx, int *_edx, int *_esi, int *_edi, int *_ebp) -{ - int result; - #ifdef _MSC_VER - __asm { - // Store C's base pointer - push ebp - push ebx - // Store address to call - push address - - // Set all registers to the input values - mov eax, [_eax] - mov eax, [eax] - mov ebx, [_ebx] - mov ebx, [ebx] - mov ecx, [_ecx] - mov ecx, [ecx] - mov edx, [_edx] - mov edx, [edx] - mov esi, [_esi] - mov esi, [esi] - mov edi, [_edi] - mov edi, [edi] - mov ebp, [_ebp] - mov ebp, [ebp] - - // Call function - call [esp] - - // Store output eax - push eax - push ebp - push ebx - mov ebp, [esp + 20] - mov ebx, [esp + 16] - - // Get resulting ecx, edx, esi, edi registers - - mov eax, [_edi] - mov [eax], edi - mov eax, [_esi] - mov [eax], esi - mov eax, [_edx] - mov [eax], edx - mov eax, [_ecx] - mov [eax], ecx - - // Pop ebx reg into ecx - pop ecx - mov eax, [_ebx] - mov[eax], ecx - - // Pop ebp reg into ecx - pop ecx - mov eax, [_ebp] - mov[eax], ecx - - pop eax - // Get resulting eax register - mov ecx, [_eax] - mov [ecx], eax - - // Save flags as return in eax - lahf - // Pop address - pop ebp - - pop ebx - pop ebp - /* Load result with flags */ - mov result, eax - } - #else - __asm__ ( "\ - \n\ - /* Store C's base pointer*/ \n\ - push %%ebp \n\ - push %%ebx \n\ - \n\ - /* Store %[address] to call*/ \n\ - push %[address] \n\ - \n\ - /* Set all registers to the input values*/ \n\ - mov %[_eax], %%eax \n\ - mov (%%eax), %%eax \n\ - mov %[_ebx], %%ebx \n\ - mov (%%ebx), %%ebx \n\ - mov %[_ecx], %%ecx \n\ - mov (%%ecx), %%ecx \n\ - mov %[_edx], %%edx \n\ - mov (%%edx), %%edx \n\ - mov %[_esi], %%esi \n\ - mov (%%esi), %%esi \n\ - mov %[_edi], %%edi \n\ - mov (%%edi), %%edi \n\ - mov %[_ebp], %%ebp \n\ - mov (%%ebp), %%ebp \n\ - \n\ - /* Call function*/ \n\ - call *(%%esp) \n\ - \n\ - /* Store output eax */ \n\ - push %%eax \n\ - push %%ebp \n\ - push %%ebx \n\ - mov 20(%%esp), %%ebp \n\ - mov 16(%%esp), %%ebx \n\ - /* Get resulting ecx, edx, esi, edi registers*/ \n\ - mov %[_edi], %%eax \n\ - mov %%edi, (%%eax) \n\ - mov %[_esi], %%eax \n\ - mov %%esi, (%%eax) \n\ - mov %[_edx], %%eax \n\ - mov %%edx, (%%eax) \n\ - mov %[_ecx], %%eax \n\ - mov %%ecx, (%%eax) \n\ - /* Pop ebx reg into ecx*/ \n\ - pop %%ecx \n\ - mov %[_ebx], %%eax \n\ - mov %%ecx, (%%eax) \n\ - \n\ - /* Pop ebp reg into ecx */\n\ - pop %%ecx \n\ - mov %[_ebp], %%eax \n\ - mov %%ecx, (%%eax) \n\ - \n\ - pop %%eax \n\ - /* Get resulting eax register*/ \n\ - mov %[_eax], %%ecx \n\ - mov %%eax, (%%ecx) \n\ - \n\ - /* Save flags as return in eax*/ \n\ - lahf \n\ - /* Pop address*/ \n\ - pop %%ebp \n\ - \n\ - pop %%ebx \n\ - pop %%ebp \n\ - /* Load result with flags */ \n\ - mov %%eax, %[result] \n\ - " : [address] "+m" (address), [_eax] "+m" (_eax), [_ebx] "+m" (_ebx), [_ecx] "+m" (_ecx), [_edx] "+m" (_edx), [_esi] "+m" (_esi), [_edi] "+m" (_edi), [_ebp] "+m" (_ebp), [result] "+m" (result) - - : - : "eax","ecx","edx","esi","edi" - ); - #endif - // lahf only modifies ah, zero out the rest - return result & 0xFF00; -} +int RCT2_CALLFUNC_X(int address, int *_eax, int *_ebx, int *_ecx, int *_edx, int *_esi, int *_edi, int *_ebp); typedef struct { union { diff --git a/src/platform/platform.h b/src/platform/platform.h index a8c4b260d8..0cf3c727ee 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -183,7 +183,7 @@ bool platform_check_steam_overlay_attached(); #endif // __linux__ -#if !(POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) +#if !(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) char *strndup(const char *src, size_t size); #endif // !(POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) From d037b937d8bdb5ca58900f8adfdb69d12749599a Mon Sep 17 00:00:00 2001 From: janisozaur Date: Wed, 18 Nov 2015 21:57:01 +0100 Subject: [PATCH 1118/1173] Fix VS project file --- projects/openrct2.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 7811e240ca..2d78655e37 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -28,7 +28,7 @@ - + From e05475cb385d1a6ea28759a13de3867bd4db0a96 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Wed, 18 Nov 2015 22:32:23 +0000 Subject: [PATCH 1119/1173] Fix #2342. Accidentally disabled pause mode building for large scenery --- src/world/map.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/map.c b/src/world/map.c index d1b53ad79e..8f4f588a45 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3137,7 +3137,7 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in // Supports cost RCT2_GLOBAL(0x00F4389A, money32) = 0; - if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && gConfigCheat.build_in_pause_mode) { + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0 && !gConfigCheat.build_in_pause_mode) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; *ebx = MONEY32_UNDEFINED; return; From 67b6aa7513341a2b8b3b3faa001a90837755c542 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 18 Nov 2015 23:19:25 +0000 Subject: [PATCH 1120/1173] fix #2330: Clear button in Object Selector doesn't refresh item list --- src/windows/editor_object_selection.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index f5eecca514..04bda016a1 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -861,9 +861,9 @@ static void window_editor_object_selection_mouseup(rct_window *w, int widgetInde break; case WIDX_FILTER_CLEAR_BUTTON: memset(_filter_string, 0, sizeof(_filter_string)); - + filter_update_counts(); w->scrolls->v_top = 0; - + visible_list_refresh(w); window_invalidate(w); break; case WIDX_LIST_SORT_TYPE: From e9deafa5df763c24c2cc45ab9fc640c4ec3a894a Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 19 Nov 2015 04:00:17 +0000 Subject: [PATCH 1121/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_traditional.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index e5a3b0a375..5c443dcdb3 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -3918,6 +3918,7 @@ STR_5575 :最多玩家數: STR_5576 :連接埠: STR_5577 :南韓園 (₩) STR_5578 :俄羅斯盧布 (R) +STR_5579 :顥示縮放因子: ##################### From 562c9cb68e315eb35fbab45862efd26c84b2d2f6 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 20 Nov 2015 04:00:18 +0000 Subject: [PATCH 1122/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 85 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 3d98c7d8f9..4b385e0bb9 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3189,7 +3189,7 @@ STR_3184 :Attracties/voertuigen STR_3185 :Klein decor STR_3186 :Groot decor STR_3187 :Muren/hekken -STR_3188 :Borden voor paden +STR_3188 :Lichtkranten STR_3189 :Voetpaden STR_3190 :Extra's voor paden STR_3191 :Decorgroepen @@ -4973,6 +4973,12 @@ STR_CPTY :1 bezoeker per stoel STR_NAME :Tijdmachine STR_DESC :Bezoekers zitten in een speciaal ontwerpen bol en krijgen de illusie dat ze door de tijd reizen. STR_CPTY :1 bezoeker per tijdmachine + +#CC +[RIDE7MKY] +STR_NAME :Springkussens +STR_DESC :Bezoekers springen op en neer op met lucht gevulde kussens. +STR_CPTY :1 bezoeker per kussen # End of Space rings / Ruimteringen # Swinging ship / Schommelschip @@ -5625,6 +5631,12 @@ STR_DESC :Toiletten in een gebouw in blokhutstijl. [INFOK] STR_NAME :Informatiekiosk STR_DESC :Een kiosk waar gasten kaarten van het park en paraplu's kunnen kopen. + +#CC +[INFO1MKY] +STR_NAME :Informatiekiosk +STR_DESC :Een kiosk waar gasten kaarten van het park en paraplu's kunnen kopen. + # End of Information Kiosks # Cash Machines @@ -5929,5 +5941,76 @@ STR_NAME : Mythologisch thema ################# # Large objects # ################# +[GLTHENT] +STR_NAME :'Goliath'-bord + +[MDSAENT] +STR_NAME :'Medusa'-bord + [NITROENT] STR_NAME :'Nitro'-bord + +[SHS1] +STR_NAME :Rijtjeshuis + +######### +# Walls # +######### +[WALLTXGT] +STR_NAME :'Texas Giant'-bord + +################## +# Path additions # +################## +[BENCHPL] +STR_NAME :Stadionstoeltjes + +[BENCHSTN] +STR_NAME :Stenen bank + +[JUMPSNW1] +STR_NAME :Springende sneeuwballen + +[LAMPDSY] +STR_NAME :Lamp in madeliefjesvorm + +[QTV1] +STR_NAME :Wachtrij-tv + +#TT +[MEDBENCH] +STR_NAME :Krukjes + +#OCC +[LITTERPA] +STR_NAME :Vuilnisbak in pandavorm + +########### +# Banners # +########### +[BN1] +STR_NAME :Lichtkrant + +[BN2] +STR_NAME :Lichtkrant in junglestijl + +[BN3] +STR_NAME :Lichtkrant in Romeinse stijl + +[BN4] +STR_NAME :Lichtkrant in Egyptische stijl + +[BN5] +STR_NAME :Lichtkrant in mijnstijl + +[BN6] +STR_NAME :Lichtkrant in Jurastijl + +[BN7] +STR_NAME :Lichtkrant in pagodestijl + +[BN8] +STR_NAME :Besneeuwde lichtkrant + +[BN9] +STR_NAME :Lichtkrant in ruimtestijl From bd262d9c59017c8413b2fd3559b3231a6ca3721f Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 20 Nov 2015 17:12:26 +0000 Subject: [PATCH 1123/1173] Fix #2308. ShopItem was accidentally passed into new_thought instead of thought_type --- src/peep/peep.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index e714c8de93..287848fe4d 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -1768,7 +1768,7 @@ static void peep_update_ride_sub_state_0(rct_peep* peep){ } if (ride->price > peep->cash_in_pocket){ - peep_insert_new_thought(peep, 0, peep->current_ride); + peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_CANT_AFFORD_0, peep->current_ride); if (peep->destination_tolerence == 0){ remove_peep_from_queue(peep); peep_decrement_num_riders(peep); @@ -7983,7 +7983,7 @@ loc_69B119: if (value > ((money16)(scenario_rand() & 0x07))) { // "I'm not paying that much for x" uint8 thought_type = (shopItem >= 32 ? (PEEP_THOUGHT_TYPE_PHOTO2_MUCH + (shopItem - 32)) : (PEEP_THOUGHT_TYPE_BALLOON_MUCH + shopItem)); - peep_insert_new_thought(peep, shopItem, rideIndex); + peep_insert_new_thought(peep, thought_type, rideIndex); return 0; } } From 5ef10f5050bbc3494e4d4eae6b12db558aa01778 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 20 Nov 2015 18:48:40 +0000 Subject: [PATCH 1124/1173] fix memory leaks in JSON object creation for multiplayer --- src/network/network.cpp | 44 ++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 8c566d4ff1..d4f2e2923a 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -860,8 +860,8 @@ void Network::AdvertiseRegister() request.method = HTTP_METHOD_POST; json_t *body = json_object(); - json_object_set(body, "key", json_string(advertise_key.c_str())); - json_object_set(body, "port", json_integer(listening_port)); + json_object_set_new(body, "key", json_string(advertise_key.c_str())); + json_object_set_new(body, "port", json_integer(listening_port)); request.body = body; http_request_json_async(&request, [](http_json_response *response) -> void { @@ -904,21 +904,21 @@ void Network::AdvertiseHeartbeat() request.method = HTTP_METHOD_PUT; json_t *body = json_object(); - json_object_set(body, "token", json_string(advertise_token.c_str())); - json_object_set(body, "players", json_integer(network_get_num_players())); + json_object_set_new(body, "token", json_string(advertise_token.c_str())); + json_object_set_new(body, "players", json_integer(network_get_num_players())); json_t *gameInfo = json_object(); - json_object_set(gameInfo, "mapSize", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint8) - 2)); - json_object_set(gameInfo, "day", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16))); - json_object_set(gameInfo, "month", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16))); - json_object_set(gameInfo, "guests", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16))); - json_object_set(gameInfo, "parkValue", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_VALUE, money32))); + json_object_set_new(gameInfo, "mapSize", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint8) - 2)); + json_object_set_new(gameInfo, "day", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16))); + json_object_set_new(gameInfo, "month", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16))); + json_object_set_new(gameInfo, "guests", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_IN_PARK, uint16))); + json_object_set_new(gameInfo, "parkValue", json_integer(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_VALUE, money32))); if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) { money32 cash = DECRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32)); - json_object_set(gameInfo, "cash", json_integer(cash)); + json_object_set_new(gameInfo, "cash", json_integer(cash)); } - json_object_set(body, "gameInfo", gameInfo); + json_object_set_new(body, "gameInfo", gameInfo); request.body = body; gNetwork.last_heartbeat_time = SDL_GetTicks(); @@ -1084,20 +1084,20 @@ void Network::Server_Send_GAMEINFO(NetworkConnection& connection) *packet << (uint32)NETWORK_COMMAND_GAMEINFO; #ifndef DISABLE_HTTP json_t* obj = json_object(); - json_object_set(obj, "name", json_string(gConfigNetwork.server_name)); - json_object_set(obj, "requiresPassword", json_boolean(password.size() > 0)); - json_object_set(obj, "version", json_string(OPENRCT2_VERSION)); - json_object_set(obj, "players", json_integer(player_list.size())); - json_object_set(obj, "maxPlayers", json_integer(gConfigNetwork.maxplayers)); - json_object_set(obj, "description", json_string(gConfigNetwork.server_description)); - json_object_set(obj, "dedicated", json_boolean(gOpenRCT2Headless)); + json_object_set_new(obj, "name", json_string(gConfigNetwork.server_name)); + json_object_set_new(obj, "requiresPassword", json_boolean(password.size() > 0)); + json_object_set_new(obj, "version", json_string(OPENRCT2_VERSION)); + json_object_set_new(obj, "players", json_integer(player_list.size())); + json_object_set_new(obj, "maxPlayers", json_integer(gConfigNetwork.maxplayers)); + json_object_set_new(obj, "description", json_string(gConfigNetwork.server_description)); + json_object_set_new(obj, "dedicated", json_boolean(gOpenRCT2Headless)); // Provider details json_t* jsonProvider = json_object(); - json_object_set(jsonProvider, "name", json_string(gConfigNetwork.provider_name)); - json_object_set(jsonProvider, "email", json_string(gConfigNetwork.provider_email)); - json_object_set(jsonProvider, "website", json_string(gConfigNetwork.provider_website)); - json_object_set(obj, "provider", jsonProvider); + json_object_set_new(jsonProvider, "name", json_string(gConfigNetwork.provider_name)); + json_object_set_new(jsonProvider, "email", json_string(gConfigNetwork.provider_email)); + json_object_set_new(jsonProvider, "website", json_string(gConfigNetwork.provider_website)); + json_object_set_new(obj, "provider", jsonProvider); packet->WriteString(json_dumps(obj, 0)); json_decref(obj); From 5bd3b8d6afa9b3d27bf499a52bd5da37906615b8 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 20 Nov 2015 19:41:27 +0000 Subject: [PATCH 1125/1173] Implement util_rand due to rand having a poor range on some platforms --- src/audio/audio.c | 2 +- src/network/network.cpp | 2 +- src/rct2.c | 3 ++- src/title.c | 10 ++++---- src/util/util.c | 18 ++++++++++++++ src/util/util.h | 3 +++ src/windows/editor_inventions_list.c | 3 ++- src/windows/guest.c | 3 ++- src/windows/mapgen.c | 5 ++-- src/windows/top_toolbar.c | 11 +++++---- src/world/balloon.c | 3 ++- src/world/climate.c | 3 ++- src/world/mapgen.c | 37 ++++++++++++++-------------- src/world/particle.c | 13 +++++----- 14 files changed, 73 insertions(+), 43 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 02f67c061e..a70b6da527 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -177,7 +177,7 @@ void start_title_music() musicPathId = PATH_ID_CSS17; break; case 3: - if (rand() & 1) + if (util_rand() & 1) musicPathId = PATH_ID_CSS50; else musicPathId = PATH_ID_CSS17; diff --git a/src/network/network.cpp b/src/network/network.cpp index d4f2e2923a..0d67273cd1 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -832,7 +832,7 @@ std::string Network::GenerateAdvertiseKey() static char hexChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; char key[17]; for (int i = 0; i < 16; i++) { - int hexCharIndex = rand() % countof(hexChars); + int hexCharIndex = util_rand() % countof(hexChars); key[i] = hexChars[hexCharIndex]; } key[countof(key) - 1] = 0; diff --git a/src/rct2.c b/src/rct2.c index 560db3ab9a..571a7e696a 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -47,6 +47,7 @@ #include "ride/track.h" #include "scenario.h" #include "title.h" +#include "util/util.h" #include "world/map.h" #include "world/park.h" #include "world/climate.h" @@ -79,7 +80,7 @@ int rct2_init() RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) = 0; RCT2_GLOBAL(0x009AC310, char*) = RCT2_GLOBAL(RCT2_ADDRESS_CMDLINE, char*); get_system_time(); - srand((unsigned int)time(0)); + util_srand((unsigned int)time(0)); RCT2_GLOBAL(0x009DEA69, short) = RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_DAY, short); RCT2_GLOBAL(0x009DEA6B, short) = RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_MONTH, short); if (!rct2_init_directories()) diff --git a/src/title.c b/src/title.c index 1b8abc325a..0bd9c0c6d9 100644 --- a/src/title.c +++ b/src/title.c @@ -524,24 +524,24 @@ static uint8 *generate_random_script() int i, j; const int views = 16; - srand((unsigned int)time(NULL)); + util_srand((unsigned int)time(NULL)); uint8 *script = malloc(views * 8 + 2); i = 0; script[i++] = TITLE_SCRIPT_LOAD; for (j = 0; j < views; j++) { script[i++] = TITLE_SCRIPT_LOCATION; - script[i++] = 64 + (rand() % 128); - script[i++] = 64 + (rand() % 128); + script[i++] = 64 + (util_rand() % 128); + script[i++] = 64 + (util_rand() % 128); - int rotationCount = rand() % 4; + int rotationCount = util_rand() % 4; if (rotationCount > 0) { script[i++] = TITLE_SCRIPT_ROTATE; script[i++] = rotationCount; } script[i++] = TITLE_SCRIPT_WAIT; - script[i++] = 8 + (rand() % 6); + script[i++] = 8 + (util_rand() % 6); } script[i] = TITLE_SCRIPT_RESTART; diff --git a/src/util/util.c b/src/util/util.c index bfccdfa706..890423e0fd 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -220,3 +220,21 @@ bool str_is_null_or_empty(const char *str) { return str == NULL || str[0] == 0; } + +uint32 srand0, srand1, srand2, srand3; + +void util_srand(int source) { + srand0 = source; + srand1 = srand0 ^ (source >> 24); + srand2 = srand1 ^ (source >> 16); + srand3 = srand2 ^ (source >> 8); +} + +uint32 util_rand() { + uint32 temp = srand0 ^ (srand0 << 11); + srand0 = srand1; + srand1 = srand2; + srand2 = srand3; + srand3 = srand3 ^ (srand3 >> 19) ^ temp ^ (temp >> 8); + return srand3; +} \ No newline at end of file diff --git a/src/util/util.h b/src/util/util.h index 8eba3a2b3f..23ea66c2d2 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -44,4 +44,7 @@ char *safe_strncpy(char * destination, const char * source, size_t num); bool utf8_is_bom(const char *str); bool str_is_null_or_empty(const char *str); +void util_srand(int source); +uint32 util_rand(); + #endif diff --git a/src/windows/editor_inventions_list.c b/src/windows/editor_inventions_list.c index c88b5ae741..a8396b77d1 100644 --- a/src/windows/editor_inventions_list.c +++ b/src/windows/editor_inventions_list.c @@ -29,6 +29,7 @@ #include "../world/scenery.h" #include "../interface/themes.h" #include "../rct1.h" +#include "../util/util.h" #pragma region Widgets @@ -344,7 +345,7 @@ static void research_items_shuffle() // Shuffle list for (i = 0; i < numNonResearchedItems; i++) { - ri = rand() % numNonResearchedItems; + ri = util_rand() % numNonResearchedItems; if (ri == i) continue; diff --git a/src/windows/guest.c b/src/windows/guest.c index 3c5870e649..2a9eb29bdd 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -35,6 +35,7 @@ #include "../interface/viewport.h" #include "../interface/widget.h" #include "../interface/window.h" +#include "../util/util.h" #include "../world/footpath.h" #include "../world/map.h" #include "../world/sprite.h" @@ -1089,7 +1090,7 @@ void window_guest_overview_update(rct_window* w){ // Create the "I have the strangest feeling I am being watched thought" if ((w->var_494 & 0xFFFF) >= 3840) { if (!(w->var_494 & 0x3FF)) { - int random = rand() & 0xFFFF; + int random = util_rand() & 0xFFFF; if (random <= 0x2AAA) { rct_peep* peep = GET_PEEP(w->number); peep_insert_new_thought(peep, PEEP_THOUGHT_TYPE_WATCHED, 0xFF); diff --git a/src/windows/mapgen.c b/src/windows/mapgen.c index 2c46c69e47..03cb6a5e18 100644 --- a/src/windows/mapgen.c +++ b/src/windows/mapgen.c @@ -25,6 +25,7 @@ #include "../interface/viewport.h" #include "../interface/window.h" #include "../sprites.h" +#include "../util/util.h" #include "../world/mapgen.h" #include "../world/scenery.h" #include "dropdown.h" @@ -716,8 +717,8 @@ static void window_mapgen_random_mouseup(rct_window *w, int widgetIndex) mapgenSettings.wall = _randomTerrrain ? -1 : _wallTexture; mapgenSettings.trees = _placeTrees; - mapgenSettings.simplex_low = rand() % 4; - mapgenSettings.simplex_high = 12 + (rand() % (32 - 12)); + mapgenSettings.simplex_low = util_rand() % 4; + mapgenSettings.simplex_high = 12 + (util_rand() % (32 - 12)); mapgenSettings.simplex_base_freq = 1.75f; mapgenSettings.simplex_octaves = 6; diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 0d8f55b6da..ec8aa31f61 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -34,6 +34,7 @@ #include "../network/network.h" #include "../network/twitch.h" #include "../scenario.h" +#include "../util/util.h" #include "../world/scenery.h" #include "../world/banner.h" #include "dropdown.h" @@ -1116,7 +1117,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin uint8 rotation = window_scenery_rotation; if (!(scenery->small_scenery.flags & SMALL_SCENERY_FLAG4)){ - rotation = rand() & 0xFF; + rotation = util_rand() & 0xFF; } rotation -= get_current_rotation(); @@ -1194,7 +1195,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin uint8 rotation = window_scenery_rotation; if (!(scenery->small_scenery.flags & SMALL_SCENERY_FLAG4)){ - rotation = rand() & 0xFF; + rotation = util_rand() & 0xFF; } rotation -= get_current_rotation(); @@ -1440,11 +1441,11 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window *w if (window_scenery_is_build_cluster_tool_on){ if (!(scenery->small_scenery.flags & SMALL_SCENERY_FLAG_FULL_TILE)){ parameter_2 &= 0xFF00; - parameter_2 |= rand() & 3; + parameter_2 |= util_rand() & 3; } - cur_grid_x += ((rand() % 16) - 8) * 32; - cur_grid_y += ((rand() % 16) - 8) * 32; + cur_grid_x += ((util_rand() % 16) - 8) * 32; + cur_grid_y += ((util_rand() % 16) - 8) * 32; if (!(scenery->small_scenery.flags & SMALL_SCENERY_FLAG4)){ RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint16)++; diff --git a/src/world/balloon.c b/src/world/balloon.c index 62de010dfe..6db5b5a0a0 100644 --- a/src/world/balloon.c +++ b/src/world/balloon.c @@ -1,5 +1,6 @@ #include "../audio/audio.h" #include "../scenario.h" +#include "../util/util.h" #include "sprite.h" /** @@ -68,7 +69,7 @@ void balloon_press(rct_balloon *balloon) if (balloon->popped == 1) return; - uint32 random = rand(); + uint32 random = util_rand(); if ((balloon->var_0A & 7) || (random & 0xFFFF) < 0x2000) { balloon_pop(balloon); return; diff --git a/src/world/climate.c b/src/world/climate.c index 5692acb13b..5448e8b27f 100644 --- a/src/world/climate.c +++ b/src/world/climate.c @@ -27,6 +27,7 @@ #include "../localisation/date.h" #include "../scenario.h" #include "../interface/window.h" +#include "../util/util.h" #include "climate.h" enum { @@ -115,7 +116,7 @@ void climate_reset(int climate) _rainVolume = 1; } - climate_determine_future_weather(rand()); + climate_determine_future_weather(util_rand()); } sint8 step_weather_level(sint8 cur_weather_level, sint8 next_weather_level) { diff --git a/src/world/mapgen.c b/src/world/mapgen.c index 6d89306220..4650b4307e 100644 --- a/src/world/mapgen.c +++ b/src/world/mapgen.c @@ -21,6 +21,7 @@ #include #include "../addresses.h" #include "../object.h" +#include "../util/util.h" #include "map.h" #include "map_helpers.h" #include "mapgen.h" @@ -126,7 +127,7 @@ void mapgen_generate(mapgen_settings *settings) int x, y, mapSize, floorTexture, wallTexture, waterLevel; rct_map_element *mapElement; - srand((unsigned int)time(NULL)); + util_srand((unsigned int)time(NULL)); mapSize = settings->mapSize; floorTexture = settings->floor; @@ -134,7 +135,7 @@ void mapgen_generate(mapgen_settings *settings) waterLevel = settings->waterLevel; if (floorTexture == -1) - floorTexture = BaseTerrain[rand() % countof(BaseTerrain)]; + floorTexture = BaseTerrain[util_rand() % countof(BaseTerrain)]; if (wallTexture == -1) { // Base edge type on surface type @@ -172,7 +173,7 @@ void mapgen_generate(mapgen_settings *settings) if (1) { mapgen_simplex(settings); - mapgen_smooth_height(2 + (rand() % 6)); + mapgen_smooth_height(2 + (util_rand() % 6)); } else { // Keep overwriting the map with rough cicular blobs of different sizes and heights. // This procedural method can produce intersecting contour like land and lakes. @@ -200,7 +201,7 @@ void mapgen_generate(mapgen_settings *settings) // Add sandy beaches int beachTexture = floorTexture; if (settings->floor == -1 && floorTexture == TERRAIN_GRASS) { - switch (rand() % 4) { + switch (util_rand() % 4) { case 0: beachTexture = TERRAIN_SAND; break; @@ -235,7 +236,7 @@ static void mapgen_place_tree(int type, int x, int y) mapElement = map_element_insert(x, y, surfaceZ, (1 | 2 | 4 | 8)); mapElement->clearance_height = surfaceZ + (sceneryEntry->small_scenery.height >> 3); - mapElement->type = MAP_ELEMENT_TYPE_SCENERY | (rand() % 3); + mapElement->type = MAP_ELEMENT_TYPE_SCENERY | (util_rand() % 3); mapElement->properties.scenery.type = type; mapElement->properties.scenery.age = 0; mapElement->properties.scenery.colour_1 = 26; @@ -310,7 +311,7 @@ static void mapgen_place_trees() // Shuffle list for (i = 0; i < availablePositionsCount; i++) { - rindex = rand() % availablePositionsCount; + rindex = util_rand() % availablePositionsCount; if (rindex == i) continue; @@ -320,7 +321,7 @@ static void mapgen_place_trees() } // Place trees - float treeToLandRatio = (10 + (rand() % 30)) / 100.0f; + float treeToLandRatio = (10 + (util_rand() % 30)) / 100.0f; int numTrees = max(4, (int)(availablePositionsCount * treeToLandRatio)); mapSize = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, sint16); @@ -336,7 +337,7 @@ static void mapgen_place_trees() if (numGrassTreeIds == 0) break; - type = grassTreeIds[rand() % numGrassTreeIds]; + type = grassTreeIds[util_rand() % numGrassTreeIds]; break; case TERRAIN_SAND: @@ -345,15 +346,15 @@ static void mapgen_place_trees() if (numDesertTreeIds == 0) break; - if (rand() % 4 == 0) - type = desertTreeIds[rand() % numDesertTreeIds]; + if (util_rand() % 4 == 0) + type = desertTreeIds[util_rand() % numDesertTreeIds]; break; case TERRAIN_ICE: if (numSnowTreeIds == 0) break; - type = snowTreeIds[rand() % numSnowTreeIds]; + type = snowTreeIds[util_rand() % numSnowTreeIds]; break; } @@ -392,15 +393,15 @@ static void mapgen_blobs(int count, int lowSize, int highSize, int lowHeight, in int sizeRange = highSize - lowSize; int heightRange = highHeight - lowHeight; - int border = 2 + (rand() % 24); + int border = 2 + (util_rand() % 24); int borderRange = _heightSize - (border * 2); for (i = 0; i < count; i++) { - int radius = lowSize + (rand() % sizeRange); + int radius = lowSize + (util_rand() % sizeRange); mapgen_blob( - border + (rand() % borderRange), - border + (rand() % borderRange), + border + (util_rand() % borderRange), + border + (util_rand() % borderRange), (int)(M_PI * radius * radius), - lowHeight + (rand() % heightRange) + lowHeight + (util_rand() % heightRange) ); } } @@ -506,7 +507,7 @@ static void mapgen_blob(int cx, int cy, int size, int height) set_height(x, y, BLOB_HEIGHT); while (currentSize < size) { - if (rand() % 2 == 0) { + if (util_rand() % 2 == 0) { set_height(x, y, BLOB_HEIGHT); currentSize++; } @@ -655,7 +656,7 @@ static uint8 perm[512]; static void noise_rand() { for (int i = 0; i < countof(perm); i++) - perm[i] = rand() & 0xFF; + perm[i] = util_rand() & 0xFF; } static float fractal_noise(int x, int y, float frequency, int octaves, float lacunarity, float persistence) diff --git a/src/world/particle.c b/src/world/particle.c index 1636b3ac42..0b754193cd 100644 --- a/src/world/particle.c +++ b/src/world/particle.c @@ -1,4 +1,5 @@ #include "../audio/audio.h" +#include "../util/util.h" #include "sprite.h" /** @@ -18,12 +19,12 @@ void crashed_vehicle_particle_create(rct_vehicle_colour colours, int x, int y, i sprite_move(x, y, z + 4, (rct_sprite*)sprite); sprite->misc_identifier = SPRITE_MISC_CRASHED_VEHICLE_PARTICLE; - sprite->var_26 = (rand() & 0xFF) * 12; - sprite->var_24 = (rand() & 0x7F) + 140; - sprite->var_2E = ((rand() & 0xFF) * 5) >> 8; - sprite->acceleration_x = (rand() & 0xFFFF) * 4; - sprite->acceleration_y = (rand() & 0xFFFF) * 4; - sprite->acceleration_z = (rand() & 0xFFFF) * 4 + 0x10000; + sprite->var_26 = (util_rand() & 0xFF) * 12; + sprite->var_24 = (util_rand() & 0x7F) + 140; + sprite->var_2E = ((util_rand() & 0xFF) * 5) >> 8; + sprite->acceleration_x = (util_rand() & 0xFFFF) * 4; + sprite->acceleration_y = (util_rand() & 0xFFFF) * 4; + sprite->acceleration_z = (util_rand() & 0xFFFF) * 4 + 0x10000; sprite->velocity_x = 0; sprite->velocity_y = 0; sprite->velocity_z = 0; From 5a9a372100a83ac5f1c25184921d1279d654701e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 20 Nov 2015 19:54:43 +0000 Subject: [PATCH 1126/1173] change branch name - this should have been done when branch was created :/ --- src/rct2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rct2.h b/src/rct2.h index 841aa697d8..5e3ce17ceb 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -102,7 +102,7 @@ typedef utf16* utf16string; // The following constants are for automated build servers #define OPENRCT2_BUILD_NUMBER "" #define OPENRCT2_BUILD_SERVER "" -#define OPENRCT2_BRANCH "develop" +#define OPENRCT2_BRANCH "pre-release-0.0.3" #define OPENRCT2_COMMIT_SHA1 "" #define OPENRCT2_COMMIT_SHA1_SHORT "" #define OPENRCT2_MASTER_SERVER_URL "https://servers.openrct2.website" From 1ff2d68061aed48b22e401f0559e6a0fb6615577 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 20 Nov 2015 21:59:55 +0000 Subject: [PATCH 1127/1173] implement track paint shop implement track paint shop, part 2 implement track paint shop, part 3 implement track paint shop, part 4 --- src/ride/track_data.c | 34 +++---- src/ride/track_paint.c | 197 +++++++++++++++++++++++++++++++++++++++++ src/ride/track_paint.h | 1 + 3 files changed, 215 insertions(+), 17 deletions(-) diff --git a/src/ride/track_data.c b/src/ride/track_data.c index 5746f2118e..17efa05e0a 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -5499,14 +5499,14 @@ const uint32 RideTypeTrackPaintFunctionsOld[91] = { 0x0075C9D0, // RIDE_TYPE_DODGEMS 0x008A83E0, // RIDE_TYPE_PIRATE_SHIP 0x00760070, // RIDE_TYPE_SWINGING_INVERTER_SHIP - 0x00761160, // RIDE_TYPE_FOOD_STALL - 0x00761160, // RIDE_TYPE_1D - 0x00761160, // RIDE_TYPE_DRINK_STALL - 0x00761160, // RIDE_TYPE_1F - 0x00761160, // RIDE_TYPE_SHOP + 0, // RIDE_TYPE_FOOD_STALL + 0, // RIDE_TYPE_1D + 0, // RIDE_TYPE_DRINK_STALL + 0, // RIDE_TYPE_1F + 0, // RIDE_TYPE_SHOP 0x0076190C, // RIDE_TYPE_MERRY_GO_ROUND - 0x00761160, // RIDE_TYPE_22 - 0x00761160, // RIDE_TYPE_INFORMATION_KIOSK + 0, // RIDE_TYPE_22 + 0, // RIDE_TYPE_INFORMATION_KIOSK 0x00762D44, // RIDE_TYPE_TOILETS 0x008A8CC8, // RIDE_TYPE_FERRIS_WHEEL 0x00763520, // RIDE_TYPE_MOTION_SIMULATOR @@ -5516,7 +5516,7 @@ const uint32 RideTypeTrackPaintFunctionsOld[91] = { 0x00768BAC, // RIDE_TYPE_REVERSE_FREEFALL_COASTER 0x0076C5BC, // RIDE_TYPE_LIFT 0x008A9C08, // RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER - 0x00761160, // RIDE_TYPE_CASH_MACHINE + 0, // RIDE_TYPE_CASH_MACHINE 0x0076D658, // RIDE_TYPE_TWIST 0x0076E7B0, // RIDE_TYPE_HAUNTED_HOUSE 0x00762D44, // RIDE_TYPE_FIRST_AID @@ -5594,15 +5594,15 @@ const uint32 RideTypeTrackPaintFunctions[91] = { 0, // RIDE_TYPE_DODGEMS 0, // RIDE_TYPE_PIRATE_SHIP 0, // RIDE_TYPE_SWINGING_INVERTER_SHIP - 0, // RIDE_TYPE_FOOD_STALL - 0, // RIDE_TYPE_1D - 0, // RIDE_TYPE_DRINK_STALL - 0, // RIDE_TYPE_1F - 0, // RIDE_TYPE_SHOP + (uint32)shop_track_paint_functions, // RIDE_TYPE_FOOD_STALL + (uint32)shop_track_paint_functions, // RIDE_TYPE_1D + (uint32)shop_track_paint_functions, // RIDE_TYPE_DRINK_STALL + (uint32)shop_track_paint_functions, // RIDE_TYPE_1F + (uint32)shop_track_paint_functions, // RIDE_TYPE_SHOP 0, // RIDE_TYPE_MERRY_GO_ROUND - 0, // RIDE_TYPE_22 - 0, // RIDE_TYPE_INFORMATION_KIOSK - 0, // RIDE_TYPE_TOILETS + (uint32)shop_track_paint_functions, // RIDE_TYPE_22 + (uint32)shop_track_paint_functions, // RIDE_TYPE_INFORMATION_KIOSK + (uint32)shop_track_paint_functions, // RIDE_TYPE_TOILETS 0, // RIDE_TYPE_FERRIS_WHEEL 0, // RIDE_TYPE_MOTION_SIMULATOR 0, // RIDE_TYPE_3D_CINEMA @@ -5611,7 +5611,7 @@ const uint32 RideTypeTrackPaintFunctions[91] = { 0, // RIDE_TYPE_REVERSE_FREEFALL_COASTER 0, // RIDE_TYPE_LIFT 0, // RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER - 0, // RIDE_TYPE_CASH_MACHINE + (uint32)shop_track_paint_functions, // RIDE_TYPE_CASH_MACHINE 0, // RIDE_TYPE_TWIST 0, // RIDE_TYPE_HAUNTED_HOUSE 0, // RIDE_TYPE_FIRST_AID diff --git a/src/ride/track_paint.c b/src/ride/track_paint.c index e95844c3a5..bf4ade6109 100644 --- a/src/ride/track_paint.c +++ b/src/ride/track_paint.c @@ -1065,3 +1065,200 @@ void top_spin_paint_setup_rot_3(uint8 rideIndex, uint8 trackSequence, uint8 dire } return; } + +void shop_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement); + +/* 0x00761358 */ +TRACK_PAINT_FUNCTION shop_base_functions[] = { + shop_paint_setup, + shop_paint_setup, + shop_paint_setup, + shop_paint_setup, +}; + +/* 0x00761160 */ +TRACK_PAINT_FUNCTION* shop_track_paint_functions[] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + shop_base_functions, // 118 + NULL, + NULL, + shop_base_functions // 121 +}; + +/** + * + * rct2: 0x00761378 + * rct2: 0x007614DB + * rct2: 0x0076163F + * rct2: 0x007617A5 + */ +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); + + RCT2_GLOBAL(0x0141E9D0, sint16) = -1; + RCT2_GLOBAL(0x0141E9C4, sint16) = -1; + RCT2_GLOBAL(0x0141E9CC, sint16) = -1; + RCT2_GLOBAL(0x0141E9B8, sint16) = -1; + RCT2_GLOBAL(0x0141E9BC, sint16) = -1; + RCT2_GLOBAL(0x0141E9B4, sint16) = -1; + RCT2_GLOBAL(0x0141E9C0, sint16) = -1; + RCT2_GLOBAL(0x0141E9C8, sint16) = -1; + RCT2_GLOBAL(0x0141E9D4, sint16) = -1; + + rct_ride *ride = GET_RIDE(rideIndex); + rct_ride_type *rideEntry = GET_RIDE_ENTRY(ride->subtype); + rct_ride_type_vehicle *firstVehicleEntry = &rideEntry->vehicles[0]; + + uint32 imageId = RCT2_GLOBAL(0x00F44198, uint32); + if (imageId & 0x80000000) { + imageId &= 0x60FFFFFF; + } + imageId += firstVehicleEntry->base_image_id; + imageId += direction; + + 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 { + uint32 foundationImageId = RCT2_GLOBAL(0x00F441A4, uint32); + foundationImageId |= 3395; + + RCT2_GLOBAL(0x009DEA52, uint16) = 2; + RCT2_GLOBAL(0x009DEA54, uint16) = 2; + RCT2_GLOBAL(0x009DEA56, sint16) = height16; + sub_98197C(0, 45, foundationImageId, 0, height, 28, 28, rotation); + + 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); + } + + height16 += 48; + if (RCT2_GLOBAL(0x00141E9D8, sint16) < height16) { + RCT2_GLOBAL(0x00141E9D8, sint16) = height16; + RCT2_GLOBAL(0x00141E9DA, sint16) = 32; + } +} diff --git a/src/ride/track_paint.h b/src/ride/track_paint.h index f020078c8a..cea5f99250 100644 --- a/src/ride/track_paint.h +++ b/src/ride/track_paint.h @@ -6,5 +6,6 @@ typedef void (*TRACK_PAINT_FUNCTION)(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement); extern TRACK_PAINT_FUNCTION* top_spin_track_paint_functions[]; +extern TRACK_PAINT_FUNCTION* shop_track_paint_functions[]; #endif \ No newline at end of file From 7474515e5c8b7d0b12569cbc517e892eda9b1f84 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 21 Nov 2015 04:00:17 +0000 Subject: [PATCH 1128/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 4b385e0bb9..ea1f4a7336 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -2291,7 +2291,7 @@ STR_2286 :Ontwerpen STR_2287 :Ontwerp voltooien STR_2288 :Onbekend STR_2289 :{STRINGID} {STRINGID} -STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} +STR_2290 : STR_2291 :Selecteer een scenario voor een nieuw spel STR_2292 :{WINDOW_COLOUR_2}Bezochte attracties: STR_2293 :{BLACK} Niets @@ -3498,15 +3498,15 @@ STR_5162 :Dag/maand/jaar STR_5163 :Maand/dag/jaar STR_5164 :Twitch-kanaalnaam STR_5165 :Bezoekers namen van volgers geven -STR_5166 :Geeft bezoekers namen van gebruikers die het Twitch-kanaal volgen. +STR_5166 :{SMALLFONT}{BLACK}Geeft bezoekers namen van gebruikers die het Twitch-kanaal volgen. STR_5167 :Bez. met Twitch-volgersnamen volgen in berichtengeb. -STR_5168 :Zet het bezoekersvolgsysteem aan voor bezoekers die naar Twitch-volgers zijn genoemd. +STR_5168 :{SMALLFONT}{BLACK}Zet het bezoekersvolgsysteem aan voor bezoekers die naar Twitch-volgers zijn genoemd. STR_5169 :Bez. namen van gebruikers in de Twitch-chat geven -STR_5170 :Geeft bezoekers namen van gebruikers in de Twitch-chat. +STR_5170 :{SMALLFONT}{BLACK}Geeft bezoekers namen van gebruikers in de Twitch-chat. STR_5171 :Bez. met Twitch-chatnamen volgen in berichtengebied -STR_5172 :Zet het bezoekersvolgsysteem aan voor bezoekers die naar Twitch-chatters zijn genoemd. +STR_5172 :{SMALLFONT}{BLACK}Zet het bezoekersvolgsysteem aan voor bezoekers die naar Twitch-chatters zijn genoemd. STR_5173 :Twitch-chat als nieuws weergeven -STR_5174 :Zal chatberichten op Twitch die beginnen met !news in het berichtengebied tonen. +STR_5174 :{SMALLFONT}{BLACK}Zal chatberichten op Twitch die beginnen met !news in het berichtengebied tonen. STR_5175 :Voer de naam van je Twitch-kanaal in STR_5176 :Twitch-integratie inschakelen STR_5177 :Schermmodus: @@ -3840,7 +3840,7 @@ STR_5504 :{SMALLFONT}{BLACK}Status multiplayer tonen STR_5505 :Kan niet met de server verbinden. STR_5506 :Bezoekers negeren intensiteit STR_5507 :Klusjesmannen standaard gras laten maaien -STR_5508 :Laden van bestanden met incorrecte checksum toestaan +STR_5508 :Bestanden met incorrecte checksum toch laden STR_5509 :{SMALLFONT}{BLACK}Maakt het mogelijk om scenario's en opgeslagen spellen met een incorrecte checksum te laden, zoals scenario's uit de demo of beschadigde opgeslagen parken. STR_5510 :Standaard geluidsapparaat STR_5511 :(ONBEKEND) From c6308dcb41b0012a7dce905a56a74e62ab3a2a47 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 21 Nov 2015 13:40:00 +0000 Subject: [PATCH 1129/1173] stop ride window from opening when there is a vehicle crash on the title screen --- src/ride/ride.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index a0afb3d27f..fd31be73d6 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -7150,9 +7150,12 @@ void ride_crash(int rideIndex, int vehicleIndex) ride = GET_RIDE(rideIndex); vehicle = GET_VEHICLE(ride->vehicles[vehicleIndex]); - w = window_ride_open_vehicle(vehicle); - if (w->viewport != NULL) { - w->viewport->flags |= VIEWPORT_FLAG_SOUND_ON; + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO)) { + // Open ride window for crashed vehicle + w = window_ride_open_vehicle(vehicle); + if (w->viewport != NULL) { + w->viewport->flags |= VIEWPORT_FLAG_SOUND_ON; + } } RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, rct_string_id) = ride->name; From b147fd3a903ca3c2796da6d6c158bd6cfda9a145 Mon Sep 17 00:00:00 2001 From: e-foley Date: Sat, 21 Nov 2015 17:22:18 -0800 Subject: [PATCH 1130/1173] make speed affect upward launch ratings only --- src/ride/ride_ratings.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index d296e1ecc8..5b04920885 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -1903,7 +1903,16 @@ static void ride_ratings_calculate_launched_freefall(rct_ride *ride) } ratings.excitement += ((ride_get_total_length(ride) >> 16) * 32768) >> 16; + + #ifdef ORIGINAL_RATINGS ride_ratings_apply_operation_option(&ratings, ride, 0, 1355917, 451972); + #else + // Only apply "launch speed" effects when the setting can be modified + if (ride->mode == RIDE_MODE_UPWARD_LAUNCH) { + ride_ratings_apply_operation_option(&ratings, ride, 0, 1355917, 451972); + } + #endif + ride_ratings_apply_proximity(&ratings, ride, 20130); ride_ratings_apply_scenery(&ratings, ride, 25098); From 523ee273554d96e57ee4d91a0404042c85756545 Mon Sep 17 00:00:00 2001 From: e-foley Date: Sat, 21 Nov 2015 17:27:05 -0800 Subject: [PATCH 1131/1173] add e-foley to contributors --- contributors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contributors.md b/contributors.md index 5000298a47..59f4d1006f 100644 --- a/contributors.md +++ b/contributors.md @@ -53,6 +53,7 @@ Includes all git commit authors. Aliases are GitHub user names. * (halfbro) * (Myrtle) * (nean) +* Ed Foley (e-foley) * Michael Pham (nightroan) ## Toolchain From e7655b059abd0c037d365d68e91a8456f7516429 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 22 Nov 2015 04:00:18 +0000 Subject: [PATCH 1132/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/korean.txt | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/data/language/korean.txt b/data/language/korean.txt index 514c3b3fae..99792d746d 100644 --- a/data/language/korean.txt +++ b/data/language/korean.txt @@ -1132,18 +1132,18 @@ STR_1126 :정지하는 중 STR_1127 :승객 하차 중 STR_1128 :블록 브레이크에 의해 정지함 STR_1129 :모든 차량을 같은 색으로 -STR_1130 :{STRINGID} 마다 다른 색 -STR_1131 :차량 마다 다른 색 +STR_1130 :{STRINGID}마다 다른 색 +STR_1131 :차량마다 다른 색 STR_1132 :차량 {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1133 :차량 {POP16}{COMMA16} STR_1134 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} STR_1135 :{STRINGID} {COMMA16} -STR_1136 :{SMALLFONT}{BLACK}주요 색상 선택하세요 -STR_1137 :{SMALLFONT}{BLACK}1번 추가 색상 선택하세요 -STR_1138 :{SMALLFONT}{BLACK}2번 추가 색상 선택하세요 -STR_1139 :{SMALLFONT}{BLACK}트랙 지지대 색상 선택하세요 +STR_1136 :{SMALLFONT}{BLACK}주요 색상을 선택하세요 +STR_1137 :{SMALLFONT}{BLACK}1번 추가 색상을 선택하세요 +STR_1138 :{SMALLFONT}{BLACK}2번 추가 색상을 선택하세요 +STR_1139 :{SMALLFONT}{BLACK}트랙 지지대 색상을 선택하세요 STR_1140 :{SMALLFONT}{BLACK}차량 색상을 선택하세요 -STR_1141 :{SMALLFONT}{BLACK}어떤 차량/열차를 수정할 지 선택하세요 +STR_1141 :{SMALLFONT}{BLACK}어떤 차량/열차를 수정할지 선택하세요 STR_1142 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1143 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRINGID} STR_1144 :이 놀이기구/시설의 입구를 건설/파괴할 수 없습니다... @@ -1208,7 +1208,7 @@ STR_1202 :대기 중인 손님: 1명 STR_1203 :대기 중인 손님: {COMMA16}명 STR_1204 :대기 시간: {COMMA16}분 STR_1205 :대기 시간: {COMMA16}분 -STR_1206 :{WINDOW_COLOUR_2}출발 대기: +STR_1206 :{WINDOW_COLOUR_2}출발: STR_1207 :{WINDOW_COLOUR_2}다른 열차가 탑승장에 도착하면 열차를 출발시킴 STR_1208 :{WINDOW_COLOUR_2}다른 보트가 탑승장에 도착하면 보트를 출발시킴 STR_1209 :{SMALLFONT}{BLACK}출발하기 전에 승객을 기다릴지 여부를 선택하세요 @@ -1694,7 +1694,7 @@ STR_1688 :기본 크기 4 x 1 STR_1689 :블록 브레이크 STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} STR_1691 :{WINDOW_COLOUR_2} 비용: {BLACK}{CURRENCY} -STR_1692 :{WINDOW_COLOUR_2} 비용: {BLACK}{CURRENCY}으로부터 +STR_1692 :{WINDOW_COLOUR_2} 비용: {BLACK}{CURRENCY} 이상 STR_1693 :{SMALLFONT}{BLACK}손님 STR_1694 :{SMALLFONT}{BLACK}직원 STR_1695 :{SMALLFONT}{BLACK}수익 및 지출 @@ -2281,7 +2281,7 @@ STR_2273 :{WINDOW_COLOUR_2}풍경/테마:{NEWLINE}{BLACK}{STRINGID} STR_2274 :{SMALLFONT}{BLACK}이 개발에 대한 상세 내역을 보여줍니다 STR_2275 :{SMALLFONT}{BLACK}연구 & 개발을 위한 투자 설정 창을 보여줍니다 STR_2276 :{SMALLFONT}{BLACK}연구 & 개발 상황을 보여줍니다 -STR_2277 :알 수 없는 +STR_2277 :알 수 없음 STR_2278 :운송용 놀이기구 STR_2279 :얌전한 놀이기구 STR_2280 :롤러코스터 From e528e32ec0cdf84043ff1a7d3e81875b719a53c1 Mon Sep 17 00:00:00 2001 From: Harry Lam Date: Mon, 23 Nov 2015 16:26:18 +0800 Subject: [PATCH 1133/1173] Revert "Update language.cpp (CHT font)" --- src/localisation/language.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index c9ac95611d..5c1bacd1b9 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -49,9 +49,9 @@ enum { static TTFFontSetDescriptor TTFFontMingLiu = {{ { "msjh.ttc", 9, -1, -3, 6, nullptr }, - { "mingliub.ttc", 11, 1, 1, 12, nullptr }, - { "mingliub.ttc", 12, 1, 0, 12, nullptr }, - { "mingliub.ttc", 13, 1, 0, 20, nullptr }, + { "mingliu.ttc", 11, 1, 1, 12, nullptr }, + { "mingliu.ttc", 12, 1, 0, 12, nullptr }, + { "mingliu.ttc", 13, 1, 0, 20, nullptr }, }}; static TTFFontSetDescriptor TTFFontSimSun = {{ From cba189c2de20899bfc37abe7fd575b9bf4a06ee8 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Mon, 23 Nov 2015 18:25:43 +0000 Subject: [PATCH 1134/1173] Fix #2326. Fixed research bugging out when going back to object selection --- src/management/research.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/management/research.c b/src/management/research.c index 5873493565..83df0fd6a1 100644 --- a/src/management/research.c +++ b/src/management/research.c @@ -417,6 +417,12 @@ static void research_insert_researched(int entryIndex, int category) { rct_research_item *researchItem, *researchItem2; + researchItem = gResearchItems; + // First check to make sure that entry is not already accounted for + for (; researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++) { + if (researchItem->entryIndex == entryIndex) + return; + } researchItem = gResearchItems; do { if (researchItem->entryIndex == RESEARCHED_ITEMS_SEPARATOR) { From 0c3c9d5400c4c1c909b7b7892512d6a502a4ad07 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Mon, 23 Nov 2015 13:07:18 -0700 Subject: [PATCH 1135/1173] Fix #2352. Do not open disconnected status window when password input canceled. --- src/network/network.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 2c0f55047e..1b5a57db30 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -731,7 +731,11 @@ void Network::UpdateClient() errormsg += ": "; errormsg += server_connection.last_disconnect_reason; } - window_network_status_open(errormsg.c_str()); + if (server_connection.authstatus == NETWORK_AUTH_REQUIREPASSWORD) { // Do not show disconnect message window when password window closed/canceled + window_network_status_close(); + } else { + window_network_status_open(errormsg.c_str()); + } Close(); } ProcessGameCommandQueue(); @@ -1120,7 +1124,6 @@ bool Network::ProcessConnection(NetworkConnection& connection) switch(packetStatus) { case NETWORK_READPACKET_DISCONNECTED: // closed connection or network error - PrintError(); if (!connection.last_disconnect_reason) { connection.last_disconnect_reason = "Connection Closed"; } From 271c7be3b5cfb41d422d05aa36a3510b202ea967 Mon Sep 17 00:00:00 2001 From: JarnoVgr Date: Tue, 24 Nov 2015 16:16:31 +0100 Subject: [PATCH 1136/1173] Updated readme.md links Added forums link, removed voat link (no one used it), removed link to 'rct' subreddit (there's a 'openrct' subreddit link) --- readme.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 7e9b97ec3b..809885ac87 100644 --- a/readme.md +++ b/readme.md @@ -143,9 +143,8 @@ Translations are in progress for German, Dutch, French, Hungarian, Polish, Spani # 5 More information - [GitHub](https://github.com/OpenRCT2/OpenRCT2) +- [Forums](https://openrct2.org/forums/) - [Facebook](https://www.facebook.com/OpenRCT2) - [OpenRCT2.com](https://openrct2.com) - [OpenRCT.net](https://openrct.net) -- [rct2 subreddit](http://www.reddit.com/r/rct/) - [openrct2 subreddit](http://www.reddit.com/r/openrct2) -- [openrct2 subverse](http://www.voat.co/v/openrct2) From 235495799531fa82614f7b3abc277acf30081ac1 Mon Sep 17 00:00:00 2001 From: JarnoVgr Date: Tue, 24 Nov 2015 18:34:04 +0100 Subject: [PATCH 1137/1173] Re-added rct subreddit --- readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 809885ac87..6b395f4abc 100644 --- a/readme.md +++ b/readme.md @@ -147,4 +147,5 @@ Translations are in progress for German, Dutch, French, Hungarian, Polish, Spani - [Facebook](https://www.facebook.com/OpenRCT2) - [OpenRCT2.com](https://openrct2.com) - [OpenRCT.net](https://openrct.net) -- [openrct2 subreddit](http://www.reddit.com/r/openrct2) +- [rct subreddit](http://www.reddit.com/r/rct/) +- [openrct2 subreddit](http://www.reddit.com/r/openrct2/) From 83d183954a27af106d01dcbc4c903c89c2b90ee9 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 24 Nov 2015 20:10:03 +0000 Subject: [PATCH 1138/1173] Fix #2337. Fixed footpath placements with walls. --- src/world/footpath.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/world/footpath.c b/src/world/footpath.c index adc78bdde1..dcaaa23102 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -890,7 +890,12 @@ static void footpath_connect_corners(int initialX, int initialY, rct_map_element direction = (direction + 1) & 3; x += TileDirectionDelta[direction].x; y += TileDirectionDelta[direction].y; - mapElement[3] = footpath_connect_corners_get_neighbour(x, y, z, (1 << (direction ^ 2)) | (1 << (((direction ^ 2) - 1) & 3))); + // First check link to previous tile + mapElement[3] = footpath_connect_corners_get_neighbour(x, y, z, (1 << (direction ^ 2))); + if (mapElement[3] == NULL) + continue; + // Second check link to initial tile + mapElement[3] = footpath_connect_corners_get_neighbour(x, y, z, (1 << ((direction + 1) & 3))); if (mapElement[3] == NULL) continue; @@ -906,7 +911,7 @@ static void footpath_connect_corners(int initialX, int initialY, rct_map_element mapElement[1]->properties.path.edges |= (1 << (direction + 4)); map_invalidate_element(x, y, mapElement[1]); - direction = (direction - 1) & 3; + direction = initialDirection; mapElement[0]->properties.path.edges |= (1 << (direction + 4)); map_invalidate_element(x, y, mapElement[0]); } From 46924bc9eb5acd233bec3355fc4dd783b86e97fd Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 25 Nov 2015 22:31:00 +0000 Subject: [PATCH 1139/1173] support unicode currencies with ascii fallback --- data/language/english_uk.txt | 1 + src/drawing/font.c | 55 +++++++++++++++++++++++++++++++++ src/drawing/font.h | 1 + src/localisation/currency.c | 27 ++++++++-------- src/localisation/currency.h | 15 +++++---- src/localisation/localisation.c | 30 ++++++++++++------ src/localisation/string_ids.h | 2 ++ src/windows/options.c | 4 +-- 8 files changed, 104 insertions(+), 31 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 423a56a2b5..55dfe85182 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3918,6 +3918,7 @@ STR_5576 :Port: STR_5577 :South Korean Won (W) STR_5578 :Russian Rouble (R) STR_5579 :Window scale factor: +STR_5580 :Czech koruna (Kc) ##################### # Rides/attractions # diff --git a/src/drawing/font.c b/src/drawing/font.c index eaadbd1901..886af5bf43 100644 --- a/src/drawing/font.c +++ b/src/drawing/font.c @@ -126,3 +126,58 @@ int font_get_line_height_small(int fontSpriteBase) { return font_get_line_height(fontSpriteBase) / 2; } + +bool font_supports_string(const utf8 *text, int fontSize) +{ + const utf8 *src = text; + + uint32 codepoint; + while ((codepoint = utf8_get_next(src, &src)) != 0) { + if (gUseTrueTypeFont) { + return TTF_GlyphIsProvided(gCurrentTTFFontSet->size[fontSize].font, (uint16)codepoint); + } else { + bool supported = false; + switch (codepoint) { + case FORMAT_ENDQUOTES: + case FORMAT_AMINUSCULE: + case FORMAT_UP: + case FORMAT_SYMBOL_i: + case FORMAT_CENT: + case FORMAT_POUND: + case FORMAT_YEN: + case FORMAT_COPYRIGHT: + case FORMAT_DOWN: + case FORMAT_LEFTGUILLEMET: + case FORMAT_TICK: + case FORMAT_CROSS: + case FORMAT_RIGHT: + case FORMAT_DEGREE: + case FORMAT_SYMBOL_RAILWAY: + case FORMAT_SQUARED: + case FORMAT_OPENQUOTES: + case FORMAT_EURO: + case FORMAT_SYMBOL_ROAD: + case FORMAT_SYMBOL_FLAG: + case FORMAT_APPROX: + case FORMAT_POWERNEGATIVEONE: + case FORMAT_BULLET: + case FORMAT_RIGHTGUILLEMET: + case FORMAT_SMALLUP: + case FORMAT_SMALLDOWN: + case FORMAT_LEFT: + case FORMAT_INVERTEDQUESTION: + supported = true; + break; + default: + if (codepoint >= 32 && codepoint < 256) { + supported = true; + } + break; + } + if (!supported) { + return false; + } + } + } + return true; +} diff --git a/src/drawing/font.h b/src/drawing/font.h index 8d6868e12e..9290a0ee6e 100644 --- a/src/drawing/font.h +++ b/src/drawing/font.h @@ -43,5 +43,6 @@ int font_sprite_get_codepoint_sprite(int fontSpriteBase, int codepoint); int font_get_size_from_sprite_base(uint16 spriteBase); int font_get_line_height(int fontSpriteBase); int font_get_line_height_small(int fontSpriteBase); +bool font_supports_string(const utf8 *text, int fontSize); #endif diff --git a/src/localisation/currency.c b/src/localisation/currency.c index 1411e21491..defa1262a9 100644 --- a/src/localisation/currency.c +++ b/src/localisation/currency.c @@ -21,17 +21,18 @@ #include "currency.h" #include "string_ids.h" -const rct_currency_spec g_currency_specs[CURRENCY_END] = { - { 10 , "\xC2\xA3" , CURRENCY_PREFIX, STR_POUNDS }, // British Pound - { 10 , "$" , CURRENCY_PREFIX, STR_DOLLARS}, // US Dollar - { 10 , "F" , CURRENCY_SUFFIX, STR_FRANC }, // French Franc - { 10 , "DM" , CURRENCY_PREFIX, STR_DEUTSCHMARK }, // Deutschmark - { 1000 , "\xC2\xA5" , CURRENCY_PREFIX, STR_YEN }, // Japanese Yen - { 10 , "Pts" , CURRENCY_SUFFIX, STR_PESETA }, // Spanish Peseta - { 1000 , "L" , CURRENCY_PREFIX, STR_LIRA }, // Italian Lira - { 10 , "fl. " , CURRENCY_PREFIX, STR_GUILDERS }, // Dutch Guilder - { 10 , "kr." , CURRENCY_SUFFIX, STR_KRONA }, // Swedish Krona - { 10 , "\xE2\x82\xAC" , CURRENCY_PREFIX, STR_EUROS }, // Euro - { 10000 , "W" , CURRENCY_PREFIX, STR_WON }, // South Korean Won - { 1000 , "R " , CURRENCY_PREFIX, STR_ROUBLE }, // Russian Rouble +const currency_descriptor CurrencyDescriptors[CURRENCY_END] = { + { 10 , CURRENCY_PREFIX, "\xC2\xA3" , CURRENCY_SUFFIX, "GBP" , STR_POUNDS }, // British Pound + { 10 , CURRENCY_PREFIX, "$" , CURRENCY_PREFIX, "$" , STR_DOLLARS }, // US Dollar + { 10 , CURRENCY_SUFFIX, "F" , CURRENCY_SUFFIX, "F" , STR_FRANC }, // French Franc + { 10 , CURRENCY_PREFIX, "DM" , CURRENCY_PREFIX, "DM" , STR_DEUTSCHMARK }, // Deutschmark + { 1000 , CURRENCY_PREFIX, "\xC2\xA5" , CURRENCY_SUFFIX, "YEN" , STR_YEN }, // Japanese Yen + { 10 , CURRENCY_SUFFIX, "Pts" , CURRENCY_SUFFIX, "Pts" , STR_PESETA }, // Spanish Peseta + { 1000 , CURRENCY_PREFIX, "L" , CURRENCY_PREFIX, "L" , STR_LIRA }, // Italian Lira + { 10 , CURRENCY_PREFIX, "fl. " , CURRENCY_PREFIX, "fl." , STR_GUILDERS }, // Dutch Guilder + { 10 , CURRENCY_SUFFIX, "kr." , CURRENCY_SUFFIX, "kr." , STR_KRONA }, // Swedish Krona + { 10 , CURRENCY_PREFIX, "\xE2\x82\xAC" , CURRENCY_SUFFIX, "EUR" , STR_EUROS }, // Euro + { 10000 , CURRENCY_PREFIX, "\xE2\x82\xA9" , CURRENCY_PREFIX, "W" , STR_WON }, // South Korean Won + { 1000 , CURRENCY_PREFIX, "R " , CURRENCY_PREFIX, "R " , STR_ROUBLE }, // Russian Rouble + { 100 , CURRENCY_SUFFIX, "K\xC4\x8D" , CURRENCY_SUFFIX, "Kc" , STR_CZECH_KORUNA }, // Czech koruna }; diff --git a/src/localisation/currency.h b/src/localisation/currency.h index 4cba80c1c6..ffa400828b 100644 --- a/src/localisation/currency.h +++ b/src/localisation/currency.h @@ -37,6 +37,7 @@ typedef enum { CURRENCY_EUROS, // Euro CURRENCY_WON, // South Korean Won CURRENCY_ROUBLE, // Russian Rouble + CURRENCY_CZECH_KORUNA, // Czech koruna CURRENCY_END // Last item } CURRENCY_TYPE; @@ -50,14 +51,16 @@ typedef enum { // Currency format specification - inspired by OpenTTD typedef struct { - // Rate is relative to 0.1 GBP + // Rate is relative to 0.10 GBP int rate; - utf8 symbol[CURRENCY_SYMBOL_MAX_SIZE]; - int affix; - int stringId; -} rct_currency_spec; + uint8 affix_unicode; + utf8 symbol_unicode[CURRENCY_SYMBOL_MAX_SIZE]; + uint8 affix_ascii; + char symbol_ascii[CURRENCY_SYMBOL_MAX_SIZE]; + rct_string_id stringId; +} currency_descriptor; // List of currency formats -extern const rct_currency_spec g_currency_specs[CURRENCY_END]; +extern const currency_descriptor CurrencyDescriptors[CURRENCY_END]; #endif diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 7e131093b0..237f22f36c 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -345,9 +345,9 @@ void format_comma_separated_fixed_2dp(char **dest, long long value) void format_currency(char **dest, long long value) { - const rct_currency_spec *currencySpec = &g_currency_specs[gConfigGeneral.currency_format]; + const currency_descriptor *currencyDesc = &CurrencyDescriptors[gConfigGeneral.currency_format]; - int rate = currencySpec->rate; + int rate = currencyDesc->rate; value *= rate; // Negative sign @@ -363,10 +363,15 @@ void format_currency(char **dest, long long value) } // Currency symbol - const utf8 *symbol = currencySpec->symbol; + const utf8 *symbol = currencyDesc->symbol_unicode; + uint8 affix = currencyDesc->affix_unicode; + if (!font_supports_string(symbol, FONT_SIZE_MEDIUM)) { + symbol = currencyDesc->symbol_ascii; + affix = currencyDesc->affix_ascii; + } // Prefix - if (currencySpec->affix == CURRENCY_PREFIX) { + if (affix == CURRENCY_PREFIX) { safe_strncpy(*dest, symbol, CURRENCY_SYMBOL_MAX_SIZE); *dest += strlen(*dest); } @@ -374,7 +379,7 @@ void format_currency(char **dest, long long value) format_comma_separated_integer(dest, value); // Currency symbol suffix - if (currencySpec->affix == CURRENCY_SUFFIX) { + if (affix == CURRENCY_SUFFIX) { safe_strncpy(*dest, symbol, CURRENCY_SYMBOL_MAX_SIZE); *dest += strlen(*dest); } @@ -382,9 +387,9 @@ void format_currency(char **dest, long long value) void format_currency_2dp(char **dest, long long value) { - const rct_currency_spec *currencySpec = &g_currency_specs[gConfigGeneral.currency_format]; + const currency_descriptor *currencyDesc = &CurrencyDescriptors[gConfigGeneral.currency_format]; - int rate = currencySpec->rate; + int rate = currencyDesc->rate; value *= rate; // Negative sign @@ -394,10 +399,15 @@ void format_currency_2dp(char **dest, long long value) } // Currency symbol - const utf8 *symbol = currencySpec->symbol; + const utf8 *symbol = currencyDesc->symbol_unicode; + uint8 affix = currencyDesc->affix_unicode; + if (!font_supports_string(symbol, FONT_SIZE_MEDIUM)) { + symbol = currencyDesc->symbol_ascii; + affix = currencyDesc->affix_ascii; + } // Prefix - if (currencySpec->affix == CURRENCY_PREFIX) { + if (affix == CURRENCY_PREFIX) { safe_strncpy(*dest, symbol, CURRENCY_SYMBOL_MAX_SIZE); *dest += strlen(*dest); } @@ -410,7 +420,7 @@ void format_currency_2dp(char **dest, long long value) } // Currency symbol suffix - if (currencySpec->affix == CURRENCY_SUFFIX) { + if (affix == CURRENCY_SUFFIX) { safe_strncpy(*dest, symbol, CURRENCY_SYMBOL_MAX_SIZE); *dest += strlen(*dest); } diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 5b7ed3167a..bc2bb1b397 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2174,6 +2174,8 @@ enum { STR_UI_SCALING_DESC = 5579, + STR_CZECH_KORUNA = 5580, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/options.c b/src/windows/options.c index 6fcb3a819b..14f072530a 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -803,7 +803,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* for (i = 0; i < num_items; i++) { gDropdownItemsFormat[i] = 1142; - gDropdownItemsArgs[i] = g_currency_specs[i].stringId; + gDropdownItemsArgs[i] = CurrencyDescriptors[i].stringId; } window_options_show_dropdown(w, widget, num_items); @@ -1204,7 +1204,7 @@ static void window_options_invalidate(rct_window *w) case WINDOW_OPTIONS_PAGE_CULTURE: // currency: pounds, dollars, etc. (10 total) - RCT2_GLOBAL(0x013CE952 + 12, uint16) = g_currency_specs[gConfigGeneral.currency_format].stringId; + RCT2_GLOBAL(0x013CE952 + 12, uint16) = CurrencyDescriptors[gConfigGeneral.currency_format].stringId; // distance: metric/imperial RCT2_GLOBAL(0x013CE952 + 14, uint16) = STR_IMPERIAL + gConfigGeneral.measurement_format; From 99a91b11c52c2459d16e33b4fae63f27eabaae9c Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Thu, 26 Nov 2015 16:36:36 +0100 Subject: [PATCH 1140/1173] UK: Fahrenheit degree symbol --- data/language/english_uk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index fc5773a30c..95b9afb293 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2221,7 +2221,7 @@ STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park STR_2214 :Construction not possible while game is paused! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} From 7ea0e2d6a3f01291b4fc9a02866b4c04ba4ca4f3 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 26 Nov 2015 18:28:52 +0000 Subject: [PATCH 1141/1173] improve language load fail behaviour improve currencies fix bug in supported glyph check --- data/language/english_uk.txt | 2 +- src/drawing/font.c | 5 ++++- src/drawing/string.c | 4 +++- src/localisation/currency.c | 4 ++-- src/localisation/language.cpp | 5 +++++ src/openrct2.c | 11 +++++++---- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 55dfe85182..ae11c8b0c9 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3899,7 +3899,7 @@ STR_5557 :Stay connected after desynchronisation (Multiplayer) STR_5558 :A restart is required for this setting to take effect STR_5559 :10 min. inspections STR_5560 :{SMALLFONT}{BLACK}Sets the inspection time to 'Every 10 minutes' on all rides -STR_5561 :Failed to load language file +STR_5561 :Failed to load language STR_5562 :WARNING! STR_5563 :This feature is currently unstable, take extra caution. STR_5564 :Insert Corrupt Element diff --git a/src/drawing/font.c b/src/drawing/font.c index 886af5bf43..d4b3b08090 100644 --- a/src/drawing/font.c +++ b/src/drawing/font.c @@ -134,7 +134,10 @@ bool font_supports_string(const utf8 *text, int fontSize) uint32 codepoint; while ((codepoint = utf8_get_next(src, &src)) != 0) { if (gUseTrueTypeFont) { - return TTF_GlyphIsProvided(gCurrentTTFFontSet->size[fontSize].font, (uint16)codepoint); + bool supported = TTF_GlyphIsProvided(gCurrentTTFFontSet->size[fontSize].font, (uint16)codepoint); + if (!supported) { + return false; + } } else { bool supported = false; switch (codepoint) { diff --git a/src/drawing/string.c b/src/drawing/string.c index 1472f4ca90..e1416ddf1b 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -881,8 +881,9 @@ static uint32 _ttf_getwidth_cache_get_or_add(TTF_Font *font, const utf8 *text) bool ttf_initialise() { if (!_ttfInitialised) { - if (TTF_Init() != 0) + if (TTF_Init() != 0) { return false; + } for (int i = 0; i < 4; i++) { TTFFontDescriptor *fontDesc = &(gCurrentTTFFontSet->size[i]); @@ -893,6 +894,7 @@ bool ttf_initialise() fontDesc->font = TTF_OpenFont(fontPath, fontDesc->ptSize); if (fontDesc->font == NULL) { log_error("Unable to load '%s'", fontPath); + return false; } } diff --git a/src/localisation/currency.c b/src/localisation/currency.c index defa1262a9..1dbd267e8b 100644 --- a/src/localisation/currency.c +++ b/src/localisation/currency.c @@ -29,10 +29,10 @@ const currency_descriptor CurrencyDescriptors[CURRENCY_END] = { { 1000 , CURRENCY_PREFIX, "\xC2\xA5" , CURRENCY_SUFFIX, "YEN" , STR_YEN }, // Japanese Yen { 10 , CURRENCY_SUFFIX, "Pts" , CURRENCY_SUFFIX, "Pts" , STR_PESETA }, // Spanish Peseta { 1000 , CURRENCY_PREFIX, "L" , CURRENCY_PREFIX, "L" , STR_LIRA }, // Italian Lira - { 10 , CURRENCY_PREFIX, "fl. " , CURRENCY_PREFIX, "fl." , STR_GUILDERS }, // Dutch Guilder + { 10 , CURRENCY_PREFIX, "\xC6\x92" , CURRENCY_PREFIX, "fl." , STR_GUILDERS }, // Dutch Guilder { 10 , CURRENCY_SUFFIX, "kr." , CURRENCY_SUFFIX, "kr." , STR_KRONA }, // Swedish Krona { 10 , CURRENCY_PREFIX, "\xE2\x82\xAC" , CURRENCY_SUFFIX, "EUR" , STR_EUROS }, // Euro { 10000 , CURRENCY_PREFIX, "\xE2\x82\xA9" , CURRENCY_PREFIX, "W" , STR_WON }, // South Korean Won { 1000 , CURRENCY_PREFIX, "R " , CURRENCY_PREFIX, "R " , STR_ROUBLE }, // Russian Rouble - { 100 , CURRENCY_SUFFIX, "K\xC4\x8D" , CURRENCY_SUFFIX, "Kc" , STR_CZECH_KORUNA }, // Czech koruna + { 100 , CURRENCY_SUFFIX, " K\xC4\x8D" , CURRENCY_SUFFIX, " Kc" , STR_CZECH_KORUNA }, // Czech koruna }; diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index 5c1bacd1b9..7e22900aa5 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -173,6 +173,11 @@ int language_open(int id) gCurrentTTFFontSet = LanguagesDescriptors[id].font; if (!ttf_initialise()) { log_warning("Unable to initialise TrueType fonts."); + + // Fall back to sprite font + gUseTrueTypeFont = false; + gCurrentTTFFontSet = nullptr; + return 0; } } diff --git a/src/openrct2.c b/src/openrct2.c index 54bfdac002..46f26d1fe0 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -251,10 +251,13 @@ bool openrct2_initialise() audio_init(); audio_populate_devices(); } - if (!language_open(gConfigGeneral.language)) - { - log_fatal("Failed to open language, exiting."); - return false; + if (!language_open(gConfigGeneral.language)) { + log_error("Failed to open configured language..."); + + if (!language_open(LANGUAGE_ENGLISH_UK)) { + log_fatal("Failed to open fallback language..."); + return false; + } } http_init(); From ceeedc50cdaa3a843f7a7bba4b09e3640f97149a Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Thu, 26 Nov 2015 23:38:24 +0100 Subject: [PATCH 1142/1173] UK: Missed occurrence of the Fahrenreit symbol Thanks to @e-foley for pointing it out. --- data/language/english_uk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 95b9afb293..5e04bf96fe 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2371,7 +2371,7 @@ STR_2363 :Gridlines on Landscape STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off STR_2365 :The bank refuses to increase your loan! STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :None STR_2369 :Low STR_2370 :Average From 9b1e1249c3129dced962090ab80d7f316793adbc Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 27 Nov 2015 04:00:18 +0000 Subject: [PATCH 1143/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/chinese_simplified.txt | 4 ++-- data/language/chinese_traditional.txt | 4 ++-- data/language/czech.txt | 4 ++-- data/language/dutch.txt | 4 ++-- data/language/english_us.txt | 4 ++-- data/language/finnish.txt | 4 ++-- data/language/french.txt | 4 ++-- data/language/german.txt | 4 ++-- data/language/hungarian.txt | 4 ++-- data/language/italian.txt | 4 ++-- data/language/korean.txt | 4 ++-- data/language/polish.txt | 4 ++-- data/language/portuguese_br.txt | 4 ++-- data/language/russian.txt | 4 ++-- data/language/spanish_sp.txt | 4 ++-- data/language/swedish.txt | 4 ++-- 16 files changed, 32 insertions(+), 32 deletions(-) diff --git a/data/language/chinese_simplified.txt b/data/language/chinese_simplified.txt index d543ddea86..e6e1d54475 100644 --- a/data/language/chinese_simplified.txt +++ b/data/language/chinese_simplified.txt @@ -2226,7 +2226,7 @@ STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park STR_2214 :Construction not possible while game is paused! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} @@ -2376,7 +2376,7 @@ STR_2363 :Gridlines on Landscape STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off STR_2365 :The bank refuses to increase your loan! STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :None STR_2369 :Low STR_2370 :Average diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 5c443dcdb3..183ea7e5c1 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -2221,7 +2221,7 @@ STR_2213 :{SMALLFONT}{BLACK}列出樂園內的表演人員 STR_2214 :遊戲暫停時無法建造任何物件! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID}, {STRINGID}的一部份, 尚未返回到{STRINGID}!{NEWLINE}檢查是否被卡住或被停止了 STR_2219 :{RED}{COMMA16}人已喪生於{STRINGID}的意外中 STR_2220 :{WINDOW_COLOUR_2}樂園評價: {BLACK}{COMMA16} @@ -2371,7 +2371,7 @@ STR_2363 :土地上的網格 STR_2364 :{SMALLFONT}{BLACK}開啟/關閉土地上的網格 STR_2365 :銀行拒絕增加你的貸款額! STR_2366 :攝氏 ({DEGREE}C) -STR_2367 :華氏 (F) +STR_2367 :華氏 ({DEGREE}F) STR_2368 :無 STR_2369 :低 STR_2370 :普通 diff --git a/data/language/czech.txt b/data/language/czech.txt index 6770dc07d9..36d9d08486 100644 --- a/data/language/czech.txt +++ b/data/language/czech.txt @@ -2221,7 +2221,7 @@ STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park STR_2214 :Construction not possible while game is paused! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} @@ -2371,7 +2371,7 @@ STR_2363 :Gridlines on Landscape STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off STR_2365 :The bank refuses to increase your loan! STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :None STR_2369 :Low STR_2370 :Average diff --git a/data/language/dutch.txt b/data/language/dutch.txt index ea1f4a7336..27cc379f91 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -2218,7 +2218,7 @@ STR_2213 :{SMALLFONT}{BLACK}Toon lijst van entertainers in het park STR_2214 :Bouwen is niet mogelijk wanneer het spel is gepauzeerd! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} van {STRINGID} is nog niet teruggekeerd naar de opstapplaats ({STRINGID})!{NEWLINE}Controleer of het is vastgelopen of stil komen te staan STR_2219 :{RED}{COMMA16} personen zijn om het leven gekomen bij een ongeluk in {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Parkwaardering: {BLACK}{COMMA16} @@ -2368,7 +2368,7 @@ STR_2363 :Raster weergeven op landschap STR_2364 :{SMALLFONT}{BLACK}Rasterlijnen op land aan- of uitzetten STR_2365 :De bank wil je lening niet verhogen! STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :Geen STR_2369 :Laag STR_2370 :Gemiddeld diff --git a/data/language/english_us.txt b/data/language/english_us.txt index eb610ff85b..4fda09c04a 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -2221,7 +2221,7 @@ STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park STR_2214 :Construction not possible while game is paused! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} @@ -2371,7 +2371,7 @@ STR_2363 :Gridlines on Landscape STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off STR_2365 :The bank refuses to increase your loan! STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :None STR_2369 :Low STR_2370 :Average diff --git a/data/language/finnish.txt b/data/language/finnish.txt index 8b80312a12..f36f052215 100644 --- a/data/language/finnish.txt +++ b/data/language/finnish.txt @@ -2223,7 +2223,7 @@ STR_2213 :{SMALLFONT}{BLACK}Näytä puiston viihdyttäjät STR_2214 :Rakentaminen ei ole mahdollista pelin ollessa pysäytettynä! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOU1R_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Puiston luokitus: {BLACK}{COMMA16} @@ -2373,7 +2373,7 @@ STR_2363 :Gridlines on Landscape STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off STR_2365 :Pankki ei suostu korottamaan lainaasi! STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :Ei mitään STR_2369 :Matala STR_2370 :Tyydyttävä diff --git a/data/language/french.txt b/data/language/french.txt index ee3f80705f..82aaa48471 100644 --- a/data/language/french.txt +++ b/data/language/french.txt @@ -2222,7 +2222,7 @@ STR_2213 :{SMALLFONT}{BLACK}Afficher la liste des animateurs dans le parc STR_2214 :Construction impossible durant la pause! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} sur {STRINGID} n'est pas encore revenu à {STRINGID}!{NEWLINE}Vérifiez si il est coinçé ou au point mort STR_2219 :{RED}{COMMA16} personnes sont mortes dans un accident sur {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Notation du parc: {BLACK}{COMMA16} @@ -2372,7 +2372,7 @@ STR_2363 :Gridlines on Landscape STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off STR_2365 :The bank refuses to increase your loan! STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :None STR_2369 :Low STR_2370 :Average diff --git a/data/language/german.txt b/data/language/german.txt index 0bae72fb23..afa61bc290 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -2218,7 +2218,7 @@ STR_2213 :{SMALLFONT}{BLACK}Liste der Animateure im Park anzeigen STR_2214 :Konstruktion während des Pausemodus nicht möglich! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} bei {STRINGID} ist noch nicht zu {STRINGID} zurückgekehrt!{NEWLINE}Überprüfen Sie, ob es steckengeblieben ist oder angehalten hat STR_2219 :{RED}{COMMA16} Menschen sind in einem Unfall bei {STRINGID} gestorben STR_2220 :{WINDOW_COLOUR_2}Parkbewertung: {BLACK}{COMMA16} @@ -2368,7 +2368,7 @@ STR_2363 :Gitterlinien auf Landschaft STR_2364 :{SMALLFONT}{BLACK}Gitterlinien bei Landschaft ein-/ausblenden STR_2365 :Die Bank will Ihr Darlehen nicht erhöhen! STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :Keine STR_2369 :Niedrig STR_2370 :Durchschnitt diff --git a/data/language/hungarian.txt b/data/language/hungarian.txt index 3479980735..74069cab84 100644 --- a/data/language/hungarian.txt +++ b/data/language/hungarian.txt @@ -2221,7 +2221,7 @@ STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park STR_2214 :Construction not possible while game is paused! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} @@ -2371,7 +2371,7 @@ STR_2363 :Gridlines on Landscape STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off STR_2365 :The bank refuses to increase your loan! STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :None STR_2369 :Low STR_2370 :Average diff --git a/data/language/italian.txt b/data/language/italian.txt index cc9467fb10..eb538b1c6b 100644 --- a/data/language/italian.txt +++ b/data/language/italian.txt @@ -2221,7 +2221,7 @@ STR_2213 :{SMALLFONT}{BLACK}Mostra la lista degli intrattenitori del parco STR_2214 :Non è possibile costruire quando il gioco è in pausa!! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} sull'attrazione {STRINGID} non ha ancora fatto ritorno presso: {STRINGID} !!{NEWLINE}Controlla se si è bloccato o se è entrato in stallo STR_2219 :{RED}{COMMA16} persone sono rimaste uccise in un incidente su {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Valutazione del parco: {BLACK}{COMMA16} @@ -2371,7 +2371,7 @@ STR_2363 :Griglia sovrapposta al paesaggio STR_2364 :{SMALLFONT}{BLACK}Attiva/disattiva la griglia sovrapposta al paesaggio STR_2365 :La banca si è rifiutata di concederti altri prestiti!! STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :Nessuno STR_2369 :Basso STR_2370 :Medio diff --git a/data/language/korean.txt b/data/language/korean.txt index 99792d746d..33e23a30ee 100644 --- a/data/language/korean.txt +++ b/data/language/korean.txt @@ -2221,7 +2221,7 @@ STR_2213 :{SMALLFONT}{BLACK}공원의 엔터테이너 목록을 보여줍니 STR_2214 :게임 일시정지 중에는 건설할 수 없습니다! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID}(놀이기구: {STRINGID})(이)가 {STRINGID}(으)로 아직 돌아오지 않았습니다!{NEWLINE}놀이기구가 멈춰있거나 Check whether it is stuck or has 상점ed STR_2219 :{RED}{COMMA16}명의 손님이 {STRINGID} 사고로 사망하였습니다! STR_2220 :{WINDOW_COLOUR_2}공원 등급: {BLACK}{COMMA16} @@ -2371,7 +2371,7 @@ STR_2363 :땅에 격자선 보이기 STR_2364 :{SMALLFONT}{BLACK}땅에 격자선을 보여줍니다 STR_2365 :은행이 대출을 증가시키는 것을 거절했습니다! STR_2366 :섭씨 ({DEGREE}C) -STR_2367 :화씨 (F) +STR_2367 :화씨 ({DEGREE}F) STR_2368 :없음 STR_2369 :낮음 STR_2370 :평균 diff --git a/data/language/polish.txt b/data/language/polish.txt index 48d9b4a71a..071314a9ab 100644 --- a/data/language/polish.txt +++ b/data/language/polish.txt @@ -2247,7 +2247,7 @@ STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park STR_2214 :Construction not possible while game is paused! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} @@ -2402,7 +2402,7 @@ STR_2363 :Siatka terenu STR_2364 :{SMALLFONT}{BLACK}Zawsze wyświetlaj siatkę terenu STR_2365 :Bank nie zgadza się na zwiększenie pożyczki! STR_2366 :Celcjusz ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :Brak STR_2369 :Niskie STR_2370 :Średnie diff --git a/data/language/portuguese_br.txt b/data/language/portuguese_br.txt index 6a263f8de4..b3e29cc507 100644 --- a/data/language/portuguese_br.txt +++ b/data/language/portuguese_br.txt @@ -2221,7 +2221,7 @@ STR_2213 :{SMALLFONT}{BLACK}Exibir a lista de animadores no parque STR_2214 :Construction not possible while game is paused! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Classificação do Parque: {BLACK}{COMMA16} @@ -2371,7 +2371,7 @@ STR_2363 :Gridlines on Landscape STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off STR_2365 :The bank refuses to increase your loan! STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :Nenhum STR_2369 :Baixo STR_2370 :Médio diff --git a/data/language/russian.txt b/data/language/russian.txt index 1216f8c625..d731aec1e8 100644 --- a/data/language/russian.txt +++ b/data/language/russian.txt @@ -2221,7 +2221,7 @@ STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park STR_2214 :Construction not possible while game is paused! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} @@ -2371,7 +2371,7 @@ STR_2363 :Gridlines on Landscape STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off STR_2365 :The bank refuses to increase your loan! STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :None STR_2369 :Low STR_2370 :Average diff --git a/data/language/spanish_sp.txt b/data/language/spanish_sp.txt index 9c626836b8..787a788e5f 100644 --- a/data/language/spanish_sp.txt +++ b/data/language/spanish_sp.txt @@ -2221,7 +2221,7 @@ STR_2213 :{SMALLFONT}{BLACK}Show list of entertainers in park STR_2214 :Construction not possible while game is paused! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} on {STRINGID} hasn't returned to the {STRINGID} yet!{NEWLINE}Check whether it is stuck or has stalled STR_2219 :{RED}{COMMA16} people have died in an accident on {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Park Rating: {BLACK}{COMMA16} @@ -2371,7 +2371,7 @@ STR_2363 :Gridlines on Landscape STR_2364 :{SMALLFONT}{BLACK}Toggle gridlines on landscape on/off STR_2365 :The bank refuses to increase your loan! STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :None STR_2369 :Low STR_2370 :Average diff --git a/data/language/swedish.txt b/data/language/swedish.txt index 81e930b655..a5ef9b4bb9 100644 --- a/data/language/swedish.txt +++ b/data/language/swedish.txt @@ -2223,7 +2223,7 @@ STR_2213 :{SMALLFONT}{BLACK}Visa en lista över alla underhållare STR_2214 :Konstruktion är inte möjligt när spelet är pausat! STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) STR_2216 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}C -STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F +STR_2217 :{WINDOW_COLOUR_2}{COMMA16}{DEGREE}F STR_2218 :{RED}{STRINGID} på {STRINGID} har inte kommit tillbaka till {STRINGID} än!{NEWLINE}Kolla om den är fast STR_2219 :{RED}{COMMA16} personer har dött i en olycka på {STRINGID} STR_2220 :{WINDOW_COLOUR_2}Parkomdöme: {BLACK}{COMMA16} @@ -2373,7 +2373,7 @@ STR_2363 :Rutmönster på terräng STR_2364 :{SMALLFONT}{BLACK}Sätt på/av rutmönster på terrängen STR_2365 :Banken vägrar att utöka ditt lån! STR_2366 :Celsius ({DEGREE}C) -STR_2367 :Fahrenheit (F) +STR_2367 :Fahrenheit ({DEGREE}F) STR_2368 :Ingen STR_2369 :Låg STR_2370 :Mellan From 30b6718532353715ecf031ef7ccf2c3eeb00667c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Sat, 3 Oct 2015 18:48:16 +0200 Subject: [PATCH 1144/1173] start of OS X support --- src/drawing/rect.c | 1 - src/network/network.cpp | 3 ++- src/network/network.h | 2 ++ src/openrct2.c | 18 +++++++++--------- src/platform/platform.h | 5 ++--- src/rct2.h | 1 + 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/drawing/rect.c b/src/drawing/rect.c index 7b619c1d94..ab68699560 100644 --- a/src/drawing/rect.c +++ b/src/drawing/rect.c @@ -18,7 +18,6 @@ * along with this program. If not, see . *****************************************************************************/ -#include #include "../addresses.h" #include "../common.h" #include "../interface/colour.h" diff --git a/src/network/network.cpp b/src/network/network.cpp index 1b5a57db30..8f48eda7c6 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -31,7 +31,8 @@ extern "C" { #ifndef DISABLE_NETWORK -#include +#include +#include #include #include #include diff --git a/src/network/network.h b/src/network/network.h index 0e94b479ca..56260ce5f2 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -76,6 +76,7 @@ extern "C" { #define SHUT_RDWR SD_BOTH #endif #else + #include #include #include #include @@ -94,6 +95,7 @@ extern "C" { #include #include #include +#include #include #include diff --git a/src/openrct2.c b/src/openrct2.c index 54bfdac002..31167ee178 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -40,14 +40,14 @@ #include "util/util.h" #include "world/mapgen.h" -#ifdef __linux__ +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) #include #include #include #include #include #include -#endif // __linux__ +#endif // defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) int gOpenRCT2StartupAction = STARTUP_ACTION_TITLE; utf8 gOpenRCT2StartupActionPath[512] = { 0 }; @@ -59,11 +59,11 @@ bool gOpenRCT2Headless = false; bool gOpenRCT2ShowChangelog; -#if defined(__linux__) +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) void *gDataSegment; void *gTextSegment; int gExeFd; -#endif // defined(__linux__) +#endif // defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) /** If set, will end the OpenRCT2 game loop. Intentially private to this module so that the flag can not be set back to 0. */ int _finished; @@ -498,9 +498,9 @@ void openrct2_reset_object_tween_locations() */ static bool openrct2_setup_rct2_segment() { - // Linux will run OpenRCT2 as a native application and then load in the Windows PE, mapping the appropriate addresses as + // POSIX OSes will run OpenRCT2 as a native application and then load in the Windows PE, mapping the appropriate addresses as // necessary. Windows does not need to do this as OpenRCT2 runs as a DLL loaded from the Windows PE. -#ifdef __linux__ +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) #define RDATA_OFFSET 0x004A4000 #define DATASEG_OFFSET 0x005E2000 @@ -577,7 +577,7 @@ static bool openrct2_setup_rct2_segment() err = errno; log_error("Failed to unmap file! errno = %d", err); } -#endif // __linux__ +#endif // defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) // Check that the expected data is at various addresses. // Start at 0x9a6000, which is start of .data, to skip the region containing addresses to DLL @@ -601,7 +601,7 @@ static bool openrct2_setup_rct2_segment() static bool openrct2_release_rct2_segment() { bool result = true; -#if defined(__linux__) +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) int len = 0x01429000 - 0x8a4000; // 0xB85000, 12079104 bytes or around 11.5MB int err; err = munmap(gDataSegment, len); @@ -626,7 +626,7 @@ static bool openrct2_release_rct2_segment() log_error("Failed to close file! errno = %d", err); result = false; } -#endif // defined(__linux__) +#endif // defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) return result; } diff --git a/src/platform/platform.h b/src/platform/platform.h index 0cf3c727ee..085fe0c645 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -162,9 +162,8 @@ bool platform_check_steam_overlay_attached(); HWND windows_get_window_handle(); #endif // _WIN32 -#ifdef __linux__ +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) #include -#include #define STUB() log_warning("Function %s at %s:%d is a stub.\n", __PRETTY_FUNCTION__, __FILE__, __LINE__) #define _strcmpi _stricmp #define _stricmp(x, y) strcasecmp((x), (y)) @@ -181,7 +180,7 @@ bool platform_check_steam_overlay_attached(); #error Unknown endianess! #endif // RCT2_ENDIANESS -#endif // __linux__ +#endif // defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) #if !(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) char *strndup(const char *src, size_t size); diff --git a/src/rct2.h b/src/rct2.h index 841aa697d8..a7d8904734 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -28,6 +28,7 @@ #include #include +#include #include #include #include From 119ca58cc740f296e2cf7b5624a27109be2ee135 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 27 Nov 2015 18:01:45 +0000 Subject: [PATCH 1145/1173] Add check to prevent exceeding the maximum number of animations. Probable cause of #2381 --- src/world/map_animation.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/world/map_animation.c b/src/world/map_animation.c index 0ce1832451..18cb07daf0 100644 --- a/src/world/map_animation.c +++ b/src/world/map_animation.c @@ -49,6 +49,10 @@ void map_animation_create(int type, int x, int y, int z) { rct_map_animation *aobj = &gAnimatedObjects[0]; int numAnimatedObjects = RCT2_GLOBAL(0x0138B580, uint16); + if (numAnimatedObjects >= 2000) { + log_error("Exceeded the maximum number of animations"); + return; + } for (int i = 0; i < numAnimatedObjects; i++, aobj++) { if (aobj->x != x) continue; From 691aec5035f7f39634b0a16e93ab19f1a2d14522 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 27 Nov 2015 18:40:37 +0000 Subject: [PATCH 1146/1173] Fix #2381. Map animation invalidate now called during pause mode This was causing the number of map animations to skyrocket as there was no way to remove animations caused by ghosts. This shouldn't progress the animation only remove invalid animations. --- src/game.c | 3 +++ src/world/map_animation.c | 13 +++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/game.c b/src/game.c index 10c4c61466..9b872c6a47 100644 --- a/src/game.c +++ b/src/game.c @@ -269,6 +269,9 @@ void game_update() } else { if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0) { numUpdates = 0; + // Update the animation list. Note this does not + // increment the map animation. + map_animation_invalidate_all(); } } diff --git a/src/world/map_animation.c b/src/world/map_animation.c index 18cb07daf0..ab45491527 100644 --- a/src/world/map_animation.c +++ b/src/world/map_animation.c @@ -194,7 +194,7 @@ static bool map_animation_invalidate_small_scenery(int x, int y, int baseZ) if (sceneryEntry->small_scenery.flags & SMALL_SCENERY_FLAG_IS_CLOCK) { // Peep, looking at scenery - if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x3FF)) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x3FF) && RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0) { int direction = mapElement->type & 3; int x2 = x - TileDirectionDelta[direction].x; int y2 = y - TileDirectionDelta[direction].y; @@ -324,6 +324,9 @@ static bool map_animation_invalidate_track_onridephoto(int x, int y, int baseZ) if (mapElement->properties.track.type == TRACK_ELEM_ON_RIDE_PHOTO) { int z = mapElement->base_height * 8; map_invalidate_tile_zoom1(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0) { + return false; + } if (mapElement->properties.track.sequence & 0xF0) { mapElement->properties.track.sequence -= 0x10; return false; @@ -450,7 +453,7 @@ static bool map_animation_invalidate_large_scenery(int x, int y, int baseZ) * * rct2: 0x006E5B50 */ -static bool map_animation_invalidate_wall_unknown(int x, int y, int baseZ) +static bool map_animation_invalidate_wall_door(int x, int y, int baseZ) { rct_map_element *mapElement; rct_scenery_entry *sceneryEntry; @@ -489,7 +492,9 @@ static bool map_animation_invalidate_wall_unknown(int x, int y, int baseZ) } } } - + if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) != 0) { + return false; + } mapElement->properties.fence.item[2] = bl; if (di & 1) { int z = mapElement->base_height * 8; @@ -545,6 +550,6 @@ static const map_animation_invalidate_event_handler _animatedObjectEventHandlers map_animation_invalidate_remove, map_animation_invalidate_banner, map_animation_invalidate_large_scenery, - map_animation_invalidate_wall_unknown, + map_animation_invalidate_wall_door, map_animation_invalidate_wall }; From 674ff839bb1e4eeeb8054b2636f4329106630155 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 27 Nov 2015 18:54:59 +0000 Subject: [PATCH 1147/1173] add icons to server list for password and version --- resources/g2/59.png | Bin 0 -> 176 bytes src/sprites.h | 1 + src/windows/server_list.c | 27 ++++++++++++++++++++++++++- 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 resources/g2/59.png diff --git a/resources/g2/59.png b/resources/g2/59.png new file mode 100644 index 0000000000000000000000000000000000000000..df841457066aa674a74375828249dbe7f47cec68 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEa{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXZEKj`94sMo~Mgr zh(>VokN^MeS>E6OFVE_HRB)0(s{xOwvJ+!RBm3kP3^yw@)B+jV?){f%kjS|z>bcUn Q1E`b1)78&qol`;+0HLojR{#J2 literal 0 HcmV?d00001 diff --git a/src/sprites.h b/src/sprites.h index 95194a2a70..3d75810080 100644 --- a/src/sprites.h +++ b/src/sprites.h @@ -392,6 +392,7 @@ enum { SPR_G2_SANDBOX = SPR_G2_BEGIN + 33, SPR_G2_TAB_NEWS = SPR_G2_BEGIN + 58, + SPR_G2_LOCKED = SPR_G2_BEGIN + 59, }; #endif diff --git a/src/windows/server_list.c b/src/windows/server_list.c index 1aef7d1af6..75b50e7634 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -410,13 +410,38 @@ static void window_server_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi } //gfx_draw_string(dpi, serverDetails->description, w->colours[1], 3, y + 14); + + int right = width - 3 - 14; + + // Draw compatibility icon + right -= 10; + int compatibilitySpriteId; + if (str_is_null_or_empty(serverDetails->version)) { + // Server not online... + compatibilitySpriteId = SPR_G2_RCT1_CLOSE_BUTTON_0; + } else { + // Server online... check version + bool correctVersion = strcmp(serverDetails->version, OPENRCT2_VERSION) == 0; + compatibilitySpriteId = correctVersion ? SPR_G2_RCT1_OPEN_BUTTON_2 : SPR_G2_RCT1_CLOSE_BUTTON_2; + } + gfx_draw_sprite(dpi, compatibilitySpriteId, right, y + 1, 0); + right -= 4; + + // Draw lock icon + right -= 8; + if (serverDetails->requiresPassword) { + gfx_draw_sprite(dpi, SPR_G2_LOCKED, right, y + 4, 0); + } + right -= 6; + // Draw number of players char players[32]; players[0] = 0; if (serverDetails->maxplayers > 0) { sprintf(players, "%d/%d", serverDetails->players, serverDetails->maxplayers); } - gfx_draw_string(dpi, players, w->colours[1], width - 3 - 14 - gfx_get_string_width(players), y + 3); + int numPlayersStringWidth = gfx_get_string_width(players); + gfx_draw_string(dpi, players, w->colours[1], right - numPlayersStringWidth, y + 3); y += ITEM_HEIGHT; } From 843999997b4d3d5e28cc68350780f92545887864 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 27 Nov 2015 19:17:35 +0000 Subject: [PATCH 1148/1173] Fix #2375. Issue caused by invalid z coordinate for invalidate. Also fixed a couple other functions which were calling with the incorrect z value --- src/world/footpath.c | 5 +++-- src/world/map.c | 10 +++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/world/footpath.c b/src/world/footpath.c index dcaaa23102..ee57d5e0b4 100644 --- a/src/world/footpath.c +++ b/src/world/footpath.c @@ -1347,6 +1347,7 @@ void footpath_chain_ride_queue(int rideIndex, int entranceIndex, int x, int y, r mapElement->properties.path.ride_index = rideIndex; mapElement->properties.path.additions &= 0x8F; mapElement->properties.path.additions |= (entranceIndex & 7) << 4; + if (lastQueuePathElement == NULL) { lastQueuePathElement = mapElement; } @@ -1842,7 +1843,7 @@ static void footpath_remove_edges_towards_here(int x, int y, int z, int directio mapElement->properties.path.edges &= ~(1 << d); d = (((d - 4) + 1) & 3) + 4; mapElement->properties.path.edges &= ~(1 << d); - map_invalidate_tile(x, y, mapElement->base_height, mapElement->clearance_height); + map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); if (isQueue) footpath_disconnect_queue_from_path(x, y, mapElement, -1); @@ -1862,7 +1863,7 @@ static void footpath_remove_edges_towards_here(int x, int y, int z, int directio d = ((direction + 1) & 3) + 4; mapElement->properties.path.edges &= ~(1 << d); - map_invalidate_tile(x, y, mapElement->base_height, mapElement->clearance_height); + map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); break; } while (!map_element_is_last_for_tile(mapElement++)); } diff --git a/src/world/map.c b/src/world/map.c index 8f4f588a45..e86aaf5483 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -4263,7 +4263,7 @@ repeat: continue; map_element_remove_banner_entry(mapElement); - map_invalidate_tile_zoom1(x, y, mapElement->base_height, mapElement->base_height + 72); + map_invalidate_tile_zoom1(x, y, mapElement->base_height * 8, mapElement->base_height * 8 + 72); map_element_remove(mapElement); goto repeat; } while (!map_element_is_last_for_tile(mapElement++)); @@ -4367,7 +4367,7 @@ void map_invalidate_tile_full(int x, int y) void map_invalidate_element(int x, int y, rct_map_element *mapElement) { - map_invalidate_tile(x, y, mapElement->base_height, mapElement->clearance_height); + map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); } int map_get_tile_side(int mapX, int mapY) @@ -4510,7 +4510,7 @@ money32 place_park_entrance(int flags, sint16 x, sint16 y, sint16 z, uint8 direc update_park_fences(x, y - 32); update_park_fences(x, y + 32); - map_invalidate_tile(x, y, newElement->base_height, newElement->clearance_height); + map_invalidate_tile(x, y, newElement->base_height * 8, newElement->clearance_height * 8); map_animation_create(MAP_ANIMATION_TYPE_PARK_ENTRANCE, x, y, zLow); } @@ -4547,7 +4547,7 @@ money32 place_park_entrance(int flags, sint16 x, sint16 y, sint16 z, uint8 direc update_park_fences(x, y - 32); update_park_fences(x, y + 32); - map_invalidate_tile(x, y, newElement->base_height, newElement->clearance_height); + map_invalidate_tile(x, y, newElement->base_height * 8, newElement->clearance_height * 8); } x += TileDirectionDelta[(direction + 1) & 0x3].x * 2; @@ -4582,7 +4582,7 @@ money32 place_park_entrance(int flags, sint16 x, sint16 y, sint16 z, uint8 direc update_park_fences(x, y - 32); update_park_fences(x, y + 32); - map_invalidate_tile(x, y, newElement->base_height, newElement->clearance_height); + map_invalidate_tile(x, y, newElement->base_height * 8, newElement->clearance_height * 8); } return 0; From 4eb55ac1563765a40c22820b7a9fc4ac66c1a194 Mon Sep 17 00:00:00 2001 From: Sam Parkinson Date: Sat, 28 Nov 2015 10:56:23 +1100 Subject: [PATCH 1149/1173] [Linux] Use system ca certs bundle Curl automatically has a certs bundle on GNU/Linux, so providing our own is not needed. --- src/network/http.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/network/http.cpp b/src/network/http.cpp index 411d0f0c33..29392b73d6 100644 --- a/src/network/http.cpp +++ b/src/network/http.cpp @@ -116,7 +116,10 @@ http_json_response *http_request_json(const http_json_request *request) curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true); +#ifndef __linux__ + // On GNU/Linux, curl will use the system certs by default curl_easy_setopt(curl, CURLOPT_CAINFO, "curl-ca-bundle.crt"); +#endif curl_easy_setopt(curl, CURLOPT_URL, request->url); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &writeBuffer); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_request_write_func); From 859684142a09cbbce9a85798e06eb03355561096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Fri, 27 Nov 2015 18:01:22 +0100 Subject: [PATCH 1150/1173] OS X platform implementation --- projects/openrct2.vcxproj | 2 +- projects/openrct2.vcxproj.filters | 4 +- src/platform/linux.c | 768 +---------------------------- src/platform/osx.c | 18 +- src/platform/posix.c | 774 ++++++++++++++++++++++++++++++ src/platform/unix.c | 78 --- src/rct2.h | 2 +- 7 files changed, 810 insertions(+), 836 deletions(-) create mode 100644 src/platform/posix.c delete mode 100644 src/platform/unix.c diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 2d78655e37..13d1c0ff54 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -85,8 +85,8 @@ + - diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 1b5b6966ab..d32f0f5439 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -300,7 +300,7 @@ Source\Platform - + Source\Platform @@ -825,4 +825,4 @@ Source\Interface - \ No newline at end of file + diff --git a/src/platform/linux.c b/src/platform/linux.c index bce343888c..f5d062e5dd 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -18,756 +18,40 @@ * along with this program. If not, see . *****************************************************************************/ -#ifdef __linux +#if defined(__linux__) -#include -#include -#include -#include -#include -#include "../addresses.h" -#include "../cmdline.h" -#include "../openrct2.h" -#include "../localisation/language.h" -#include "../localisation/currency.h" -#include "../config.h" #include "platform.h" -#include "../util/util.h" -#include -#include -#include +#include -// The name of the mutex used to prevent multiple instances of the game from running -#define SINGLE_INSTANCE_MUTEX_NAME "RollerCoaster Tycoon 2_GSKMUTEX" +// See http://syprog.blogspot.ru/2011/12/listing-loaded-shared-objects-in-linux.html +struct lmap { + void* base_address; + char* path; + void* unused; + struct lmap *next, *prev; +}; -utf8 _userDataDirectoryPath[MAX_PATH] = { 0 }; +struct dummy { + void* pointers[3]; + struct dummy* ptr; +}; -/** - * The function that is called directly from the host application (rct2.exe)'s WinMain. This will be removed when OpenRCT2 can - * be built as a stand alone application. - */ -int main(int argc, const char **argv) -{ - //RCT2_GLOBAL(RCT2_ADDRESS_HINSTANCE, HINSTANCE) = hInstance; - //RCT2_GLOBAL(RCT2_ADDRESS_CMDLINE, LPSTR) = lpCmdLine; +bool platform_check_steam_overlay_attached() { + void* processHandle = dlopen(NULL, RTLD_NOW); - STUB(); - int run_game = cmdline_run(argv, argc); - if (run_game == 1) - { - openrct2_launch(); + struct dummy* p = (struct dummy*) processHandle; + p = p->ptr; + + struct lmap* pl = (struct lmap*) p->ptr; + + while (pl != NULL) { + if (strstr(pl->path, "gameoverlayrenderer.so") != NULL) { + return true; + } + pl = pl->next; } - exit(gExitCode); - return gExitCode; -} - -void platform_get_date(rct2_date *out_date) -{ - assert(out_date != NULL); - time_t rawtime; - struct tm * timeinfo; - time(&rawtime); - timeinfo = gmtime(&rawtime); - out_date->day = timeinfo->tm_mday; - out_date->month = timeinfo->tm_mon; - out_date->year = timeinfo->tm_year; - out_date->day_of_week = timeinfo->tm_wday; -} - -void platform_get_time(rct2_time *out_time) -{ - assert(out_time != NULL); - time_t rawtime; - struct tm * timeinfo; - time(&rawtime); - timeinfo = gmtime(&rawtime); - out_time->second = timeinfo->tm_sec; - out_time->minute = timeinfo->tm_min; - out_time->hour = timeinfo->tm_hour; -} - -char platform_get_path_separator() -{ - return '/'; -} - -bool platform_file_exists(const utf8 *path) -{ - wchar_t *wPath = utf8_to_widechar(path); - int len = min(MAX_PATH, utf8_length(path)); - char buffer[MAX_PATH]; - wcstombs(buffer, wPath, len); - buffer[len] = '\0'; - free(wPath); - bool exists = access(buffer, F_OK) != -1; - log_warning("file '%s' exists = %i", buffer, exists); - return exists; -} - -bool platform_directory_exists(const utf8 *path) -{ - wchar_t *wPath = utf8_to_widechar(path); - int len = min(MAX_PATH, utf8_length(path)); - char buffer[MAX_PATH]; - wcstombs(buffer, wPath, len); - buffer[len] = '\0'; - free(wPath); - struct stat dirinfo; - int result = stat(buffer, &dirinfo); - log_verbose("checking dir %s, result = %d, is_dir = %d", buffer, result, S_ISDIR(dirinfo.st_mode)); - if ((result != 0) || !S_ISDIR(dirinfo.st_mode)) - { - return false; - } - return true; -} - -bool platform_original_game_data_exists(const utf8 *path) -{ - wchar_t *wPath = utf8_to_widechar(path); - int len = min(MAX_PATH, utf8_length(path)); - char buffer[MAX_PATH]; - wcstombs(buffer, wPath, len); - buffer[len] = '\0'; - free(wPath); - char checkPath[MAX_PATH]; - sprintf(checkPath, "%s%c%s%c%s", buffer, platform_get_path_separator(), "Data", platform_get_path_separator(), "g1.dat"); - return platform_file_exists(checkPath); -} - -mode_t getumask() -{ - mode_t mask = umask(0); - umask(mask); - return 0777 & ~mask; // Keep in mind 0777 is octal -} - -bool platform_ensure_directory_exists(const utf8 *path) -{ - mode_t mask = getumask(); - - wchar_t *wPath = utf8_to_widechar(path); - int len = min(MAX_PATH, utf8_length(path)); - char buffer[MAX_PATH]; - wcstombs(buffer, wPath, len); - buffer[len - 1] = '\0'; - free(wPath); - log_verbose("%s", buffer); - const int result = mkdir(buffer, mask); - if (result == 0 || (result == -1 && errno == EEXIST)) - return true; return false; } -bool platform_directory_delete(const utf8 *path) -{ - STUB(); - return true; -} - -bool platform_lock_single_instance() -{ - STUB(); - return true; -} - -typedef struct { - char active; - char pattern[MAX_PATH]; - struct dirent **fileListTemp; - char **paths; - int cnt; - int handle; - void* data; -} enumerate_file_info; -static enumerate_file_info _enumerateFileInfoList[8] = { 0 }; - -char *g_file_pattern; - -static int winfilter(const struct dirent *d) -{ - int entry_length = strnlen(d->d_name, MAX_PATH); - char *name_upper = malloc(entry_length + 1); - if (name_upper == NULL) - { - log_error("out of memory"); - return 0; - } - for (int i = 0; i < entry_length; i++) - { - name_upper[i] = (char)toupper(d->d_name[i]); - } - name_upper[entry_length] = '\0'; - bool match = fnmatch(g_file_pattern, name_upper, FNM_PATHNAME) == 0; - //log_warning("trying matching filename %s, result = %d", name_upper, match); - free(name_upper); - return match; -} - -int platform_enumerate_files_begin(const utf8 *pattern) -{ - enumerate_file_info *enumFileInfo; - wchar_t *wpattern = utf8_to_widechar(pattern); - int length = min(utf8_length(pattern), MAX_PATH); - char *npattern = malloc(length+1); - int converted; - converted = wcstombs(npattern, wpattern, length); - npattern[length] = '\0'; - if (converted == MAX_PATH) { - log_warning("truncated string %s", npattern); - } - log_warning("begin file search, pattern: %s", npattern); - - char *file_name = strrchr(npattern, platform_get_path_separator()); - char *dir_name; - if (file_name != NULL) - { - dir_name = strndup(npattern, file_name - npattern); - file_name = &file_name[1]; - } else { - file_name = npattern; - dir_name = strdup("."); - } - - - int pattern_length = strlen(file_name); - g_file_pattern = strndup(file_name, pattern_length); - for (int j = 0; j < pattern_length; j++) - { - g_file_pattern[j] = (char)toupper(g_file_pattern[j]); - } - log_warning("looking for file matching %s", g_file_pattern); - int cnt; - for (int i = 0; i < countof(_enumerateFileInfoList); i++) { - enumFileInfo = &_enumerateFileInfoList[i]; - if (!enumFileInfo->active) { - safe_strncpy(enumFileInfo->pattern, npattern, sizeof(enumFileInfo->pattern)); - cnt = scandir(dir_name, &enumFileInfo->fileListTemp, winfilter, alphasort); - if (cnt < 0) - { - break; - } - log_warning("found %d files matching in dir '%s'", cnt, dir_name); - enumFileInfo->cnt = cnt; - enumFileInfo->paths = malloc(cnt * sizeof(char *)); - char **paths = enumFileInfo->paths; - // 256 is size of dirent.d_name - const int buf_len = min(MAX_PATH, 256); - const int dir_name_len = strnlen(dir_name, MAX_PATH); - char separator[] = {platform_get_path_separator(), 0}; - for (int idx = 0; idx < cnt; idx++) - { - struct dirent *d = enumFileInfo->fileListTemp[idx]; - const int entry_len = strnlen(d->d_name, MAX_PATH); - // 1 for separator, 1 for trailing null - paths[idx] = malloc(sizeof(char) * min(MAX_PATH, entry_len + dir_name_len + 2)); - paths[idx][0] = '\0'; - log_verbose("dir_name: %s", dir_name); - strncat(paths[idx], dir_name, MAX_PATH); - strncat(paths[idx], separator, MAX_PATH); - strncat(paths[idx], d->d_name, MAX_PATH); - log_verbose("paths[%d] = %s", idx, paths[idx]); - } - enumFileInfo->handle = 0; - enumFileInfo->active = 1; - free(dir_name); - free(g_file_pattern); - g_file_pattern = NULL; - free(wpattern); - free(npattern); - return i; - } - } - - free(dir_name); - free(g_file_pattern); - g_file_pattern = NULL; - free(wpattern); - free(npattern); - return -1; -} - -bool platform_enumerate_files_next(int handle, file_info *outFileInfo) -{ - - if (handle < 0) - { - return false; - } - enumerate_file_info *enumFileInfo = &_enumerateFileInfoList[handle]; - bool result; - - if (enumFileInfo->handle < enumFileInfo->cnt) { - result = true; - } else { - result = false; - } - - if (result) { - int entryIdx = enumFileInfo->handle++; - struct stat fileInfo; - log_verbose("trying handle %d", entryIdx); - char *fileName = enumFileInfo->paths[entryIdx]; - int statRes; - statRes = stat(fileName, &fileInfo); - if (statRes == -1) { - log_error("failed to stat file '%s'! errno = %i", fileName, errno); - return false; - } - outFileInfo->path = basename(fileName); - outFileInfo->size = fileInfo.st_size; - outFileInfo->last_modified = fileInfo.st_mtime; - return true; - } else { - return false; - } -} - -void platform_enumerate_files_end(int handle) -{ - if (handle < 0) - { - return; - } - enumerate_file_info *enumFileInfo = &_enumerateFileInfoList[handle]; - int cnt = enumFileInfo->cnt; - for (int i = 0; i < cnt; i++) { - free(enumFileInfo->fileListTemp[i]); - free(enumFileInfo->paths[i]); - } - free(enumFileInfo->fileListTemp); - free(enumFileInfo->paths); - // FIXME: this here could have a bug - enumFileInfo->fileListTemp = NULL; - enumFileInfo->handle = 0; - enumFileInfo->active = 0; -} - -static int dirfilter(const struct dirent *d) -{ - if (d->d_name[0] == '.') { - return 0; - } -#if defined(_DIRENT_HAVE_D_TYPE) || defined(DT_UNKNOWN) - if (d->d_type == DT_DIR) - { - return 1; - } else { - return 0; - } -#else -#error implement dirfilter! -#endif // defined(_DIRENT_HAVE_D_TYPE) || defined(DT_UNKNOWN) -} - -int platform_enumerate_directories_begin(const utf8 *directory) -{ - enumerate_file_info *enumFileInfo; - wchar_t *wpattern = utf8_to_widechar(directory); - int length = min(utf8_length(directory), MAX_PATH); - char *npattern = malloc(length+1); - int converted; - converted = wcstombs(npattern, wpattern, length); - npattern[length] = '\0'; - if (converted == MAX_PATH) { - log_warning("truncated string %s", npattern); - } - log_warning("begin directory listing, path: %s", npattern); - - // TODO: add some checking for stringness and directoryness - - int cnt; - for (int i = 0; i < countof(_enumerateFileInfoList); i++) { - enumFileInfo = &_enumerateFileInfoList[i]; - if (!enumFileInfo->active) { - safe_strncpy(enumFileInfo->pattern, npattern, length); - cnt = scandir(npattern, &enumFileInfo->fileListTemp, dirfilter, alphasort); - if (cnt < 0) - { - break; - } - log_warning("found %d files in dir '%s'", cnt, npattern); - enumFileInfo->cnt = cnt; - enumFileInfo->paths = malloc(cnt * sizeof(char *)); - char **paths = enumFileInfo->paths; - // 256 is size of dirent.d_name - const int buf_len = min(MAX_PATH, 256); - const int dir_name_len = strnlen(npattern, MAX_PATH); - char separator[] = {platform_get_path_separator(), 0}; - for (int idx = 0; idx < cnt; idx++) - { - struct dirent *d = enumFileInfo->fileListTemp[idx]; - const int entry_len = strnlen(d->d_name, MAX_PATH); - // 1 for separator, 1 for trailing null - paths[idx] = malloc(sizeof(char) * min(MAX_PATH, entry_len + dir_name_len + 2)); - paths[idx][0] = '\0'; - log_verbose("dir_name: %s", npattern); - strncat(paths[idx], npattern, MAX_PATH); - strncat(paths[idx], separator, MAX_PATH); - strncat(paths[idx], d->d_name, MAX_PATH); - log_verbose("paths[%d] = %s", idx, paths[idx]); - } - enumFileInfo->handle = 0; - enumFileInfo->active = 1; - free(wpattern); - free(npattern); - return i; - } - } - - free(wpattern); - free(npattern); - return -1; -} - -bool platform_enumerate_directories_next(int handle, utf8 *path) -{ - if (handle < 0) - { - return false; - } - - bool result; - enumerate_file_info *enumFileInfo = &_enumerateFileInfoList[handle]; - - log_verbose("handle = %d", handle); - if (enumFileInfo->handle < enumFileInfo->cnt) { - result = true; - } else { - result = false; - } - - if (result) { - int entryIdx = enumFileInfo->handle++; - struct stat fileInfo; - char *fileName = enumFileInfo->paths[entryIdx]; - int statRes; - statRes = stat(fileName, &fileInfo); - if (statRes == -1) { - log_error("failed to stat file '%s'! errno = %i", fileName, errno); - return false; - } - // so very, very wrong - safe_strncpy(path, basename(fileName), MAX_PATH); - strncat(path, "/", MAX_PATH); - path[MAX_PATH - 1] = '\0'; - return true; - } else { - return false; - } -} - -void platform_enumerate_directories_end(int handle) -{ - if (handle < 0) - { - return; - } - enumerate_file_info *enumFileInfo = &_enumerateFileInfoList[handle]; - int cnt = enumFileInfo->cnt; - for (int i = 0; i < cnt; i++) { - free(enumFileInfo->fileListTemp[i]); - free(enumFileInfo->paths[i]); - } - free(enumFileInfo->fileListTemp); - free(enumFileInfo->paths); - // FIXME: this here could have a bug - enumFileInfo->fileListTemp = NULL; - enumFileInfo->handle = 0; - enumFileInfo->active = 0; -} - -int platform_get_drives(){ - /* - return GetLogicalDrives(); - */ - STUB(); - return 0; -} - -bool platform_file_copy(const utf8 *srcPath, const utf8 *dstPath, bool overwrite) -{ - STUB(); - return 0; -} - -bool platform_file_move(const utf8 *srcPath, const utf8 *dstPath) -{ - STUB(); - return 0; -} - -bool platform_file_delete(const utf8 *path) -{ - STUB(); - return 0; -} - -wchar_t *regular_to_wchar(const char* src) -{ - int len = strnlen(src, MAX_PATH); - wchar_t *w_buffer = malloc((len + 1) * sizeof(wchar_t)); - mbtowc (NULL, NULL, 0); /* reset mbtowc */ - - int max = len; - int i = 0; - while (max > 0) - { - int length; - length = mbtowc(&w_buffer[i], &src[i], max); - if (length < 1) - { - w_buffer[i + 1] = '\0'; - break; - } - i += length; - max -= length; - } - return w_buffer; -} - -/** - * Default directory fallback is: - * - (command line argument) - * - $XDG_CONFIG_HOME/.config/OpenRCT2 - * - /home/[uid]/.config/OpenRCT2 - */ -void platform_resolve_user_data_path() -{ - const char separator[2] = { platform_get_path_separator(), 0 }; - - if (gCustomUserDataPath[0] != 0) { - realpath(gCustomUserDataPath, _userDataDirectoryPath); - - // Ensure path ends with separator - int len = strlen(_userDataDirectoryPath); - if (_userDataDirectoryPath[len - 1] != separator[0]) { - strcat(_userDataDirectoryPath, separator); - } - return; - } - - char buffer[MAX_PATH]; - buffer[0] = '\0'; - log_verbose("buffer = '%s'", buffer); - const char *homedir = getenv("XDG_CONFIG_HOME"); - log_verbose("homedir = '%s'", homedir); - if (homedir == NULL) - { - homedir = getpwuid(getuid())->pw_dir; - log_verbose("homedir was null, used getuid, now is = '%s'", homedir); - if (homedir == NULL) - { - log_fatal("Couldn't find user data directory"); - exit(-1); - return; - } - - strncat(buffer, homedir, MAX_PATH); - strncat(buffer, separator, MAX_PATH); - strncat(buffer, ".config", MAX_PATH); - } - else - { - strncat(buffer, homedir, MAX_PATH); - } - strncat(buffer, separator, MAX_PATH); - strncat(buffer, "OpenRCT2", MAX_PATH); - strncat(buffer, separator, MAX_PATH); - log_verbose("OpenRCT2 user data directory = '%s'", buffer); - int len = strnlen(buffer, MAX_PATH); - wchar_t *w_buffer = regular_to_wchar(buffer); - w_buffer[len] = '\0'; - utf8 *path = widechar_to_utf8(w_buffer); - free(w_buffer); - safe_strncpy(_userDataDirectoryPath, path, MAX_PATH); - free(path); -} - -void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) -{ - const char separator[2] = { platform_get_path_separator(), 0 }; - char buffer[MAX_PATH]; - safe_strncpy(buffer, _userDataDirectoryPath, sizeof(buffer)); - if (subDirectory != NULL && subDirectory[0] != 0) { - log_verbose("adding subDirectory '%s'", subDirectory); - strcat(buffer, subDirectory); - strcat(buffer, separator); - } - int len = strnlen(buffer, MAX_PATH); - wchar_t *w_buffer = regular_to_wchar(buffer); - w_buffer[len] = '\0'; - utf8 *path = widechar_to_utf8(w_buffer); - free(w_buffer); - safe_strncpy(outPath, path, MAX_PATH); - free(path); - log_verbose("outPath + subDirectory = '%s'", buffer); -} - -void platform_show_messagebox(char *message) -{ - STUB(); - log_warning(message); -} - -/** - * - * rct2: 0x004080EA - */ -int platform_open_common_file_dialog(int type, utf8 *title, utf8 *filename, utf8 *filterPattern, utf8 *filterName) -{ - STUB(); - return 0; -} - -utf8 *platform_open_directory_browser(utf8 *title) -{ - STUB(); - return NULL; -} - -uint16 platform_get_locale_language(){ - /* - CHAR langCode[4]; - - if (GetLocaleInfo(LOCALE_USER_DEFAULT, - LOCALE_SABBREVLANGNAME, - (LPSTR)&langCode, - sizeof(langCode)) == 0){ - return LANGUAGE_UNDEFINED; - } - - if (strcmp(langCode, "ENG") == 0){ - return LANGUAGE_ENGLISH_UK; - } - else if (strcmp(langCode, "ENU") == 0){ - return LANGUAGE_ENGLISH_US; - } - else if (strcmp(langCode, "DEU") == 0){ - return LANGUAGE_GERMAN; - } - else if (strcmp(langCode, "NLD") == 0){ - return LANGUAGE_DUTCH; - } - else if (strcmp(langCode, "FRA") == 0){ - return LANGUAGE_FRENCH; - } - else if (strcmp(langCode, "HUN") == 0){ - return LANGUAGE_HUNGARIAN; - } - else if (strcmp(langCode, "PLK") == 0){ - return LANGUAGE_POLISH; - } - else if (strcmp(langCode, "ESP") == 0){ - return LANGUAGE_SPANISH; - } - else if (strcmp(langCode, "SVE") == 0){ - return LANGUAGE_SWEDISH; - } - else if (strcmp(langCode, "ITA") == 0){ - return LANGUAGE_ITALIAN; - } - else if (strcmp(langCode, "POR") == 0){ - return LANGUAGE_PORTUGUESE_BR; - } - */ - STUB(); - return LANGUAGE_ENGLISH_UK; -} - -time_t platform_file_get_modified_time(const utf8* path){ - struct stat buf; - if (stat(path, &buf) == 0) { - return buf.st_mtime; - } - return 100; -} - -uint8 platform_get_locale_currency(){ - /* - CHAR currCode[4]; - - if (GetLocaleInfo(LOCALE_USER_DEFAULT, - LOCALE_SINTLSYMBOL, - (LPSTR)&currCode, - sizeof(currCode)) == 0){ - return CURRENCY_POUNDS; - } - if (strcmp(currCode, "GBP") == 0){ - return CURRENCY_POUNDS; - } - else if (strcmp(currCode, "USD") == 0){ - return CURRENCY_DOLLARS; - } - else if (strcmp(currCode, "EUR") == 0){ - return CURRENCY_EUROS; - } - else if (strcmp(currCode, "SEK") == 0){ - return CURRENCY_KRONA; - } - else if (strcmp(currCode, "DEM") == 0){ - return CURRENCY_DEUTSCHMARK; - } - else if (strcmp(currCode, "ITL") == 0){ - return CURRENCY_LIRA; - } - else if (strcmp(currCode, "JPY") == 0){ - return CURRENCY_YEN; - } - else if (strcmp(currCode, "ESP") == 0){ - return CURRENCY_PESETA; - } - else if (strcmp(currCode, "FRF") == 0){ - return CURRENCY_FRANC; - } - else if (strcmp(currCode, "NLG") == 0){ - return CURRENCY_GUILDERS; - } - */ - STUB(); - return CURRENCY_POUNDS; -} - -uint8 platform_get_locale_measurement_format(){ - /* - UINT measurement_system; - if (GetLocaleInfo(LOCALE_USER_DEFAULT, - LOCALE_IMEASURE | LOCALE_RETURN_NUMBER, - (LPSTR)&measurement_system, - sizeof(measurement_system)) == 0){ - return MEASUREMENT_FORMAT_IMPERIAL; - } - switch (measurement_system){ - case 0: - return MEASUREMENT_FORMAT_METRIC; - case 1: - default: - return MEASUREMENT_FORMAT_IMPERIAL; - }*/ - STUB(); - return MEASUREMENT_FORMAT_METRIC; -} - -uint8 platform_get_locale_temperature_format(){ - /* - // There does not seem to be a function to obtain this, just check the countries - UINT country; - if (GetLocaleInfo(LOCALE_USER_DEFAULT, - LOCALE_IMEASURE | LOCALE_RETURN_NUMBER, - (LPSTR)&country, - sizeof(country)) == 0){ - return TEMPERATURE_FORMAT_C; - } - switch (country){ - case CTRY_UNITED_STATES: - case CTRY_BELIZE: - return TEMPERATURE_FORMAT_F; - default: - return TEMPERATURE_FORMAT_C; - } - */ - STUB(); - return TEMPERATURE_FORMAT_C; -} -#endif // __linux +#endif diff --git a/src/platform/osx.c b/src/platform/osx.c index 4f08d128f1..c1928d0f02 100644 --- a/src/platform/osx.c +++ b/src/platform/osx.c @@ -18,19 +18,13 @@ * along with this program. If not, see . *****************************************************************************/ -#ifdef __APPLE__ +#if defined(__APPLE__) && defined(__MACH__) -/** - * OSX entry point to OpenRCT2. - */ -// int main(char *argv[], int argc) -// { -// return 0; -// } +#include "platform.h" -char platform_get_path_separator() -{ - return '/'; +bool platform_check_steam_overlay_attached() { + STUB(); + return false; } -#endif \ No newline at end of file +#endif diff --git a/src/platform/posix.c b/src/platform/posix.c new file mode 100644 index 0000000000..917f27ff4f --- /dev/null +++ b/src/platform/posix.c @@ -0,0 +1,774 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) + +#include +#include +#include +#include +#include +#include "../addresses.h" +#include "../cmdline.h" +#include "../openrct2.h" +#include "../localisation/language.h" +#include "../localisation/currency.h" +#include "../config.h" +#include "platform.h" +#include "../util/util.h" +#include +#include +#include + +// The name of the mutex used to prevent multiple instances of the game from running +#define SINGLE_INSTANCE_MUTEX_NAME "RollerCoaster Tycoon 2_GSKMUTEX" + +utf8 _userDataDirectoryPath[MAX_PATH] = { 0 }; + +/** + * The function that is called directly from the host application (rct2.exe)'s WinMain. This will be removed when OpenRCT2 can + * be built as a stand alone application. + */ +int main(int argc, const char **argv) +{ + //RCT2_GLOBAL(RCT2_ADDRESS_HINSTANCE, HINSTANCE) = hInstance; + //RCT2_GLOBAL(RCT2_ADDRESS_CMDLINE, LPSTR) = lpCmdLine; + + STUB(); + int run_game = cmdline_run(argv, argc); + if (run_game == 1) + { + openrct2_launch(); + } + + exit(gExitCode); + return gExitCode; +} + +void platform_get_date(rct2_date *out_date) +{ + assert(out_date != NULL); + time_t rawtime; + struct tm * timeinfo; + time(&rawtime); + timeinfo = gmtime(&rawtime); + out_date->day = timeinfo->tm_mday; + out_date->month = timeinfo->tm_mon; + out_date->year = timeinfo->tm_year; + out_date->day_of_week = timeinfo->tm_wday; +} + +void platform_get_time(rct2_time *out_time) +{ + assert(out_time != NULL); + time_t rawtime; + struct tm * timeinfo; + time(&rawtime); + timeinfo = gmtime(&rawtime); + out_time->second = timeinfo->tm_sec; + out_time->minute = timeinfo->tm_min; + out_time->hour = timeinfo->tm_hour; +} + +char platform_get_path_separator() +{ + return '/'; +} + +bool platform_file_exists(const utf8 *path) +{ + wchar_t *wPath = utf8_to_widechar(path); + int len = min(MAX_PATH, utf8_length(path)); + char buffer[MAX_PATH]; + wcstombs(buffer, wPath, len); + buffer[len] = '\0'; + free(wPath); + bool exists = access(buffer, F_OK) != -1; + log_warning("file '%s' exists = %i", buffer, exists); + return exists; +} + +bool platform_directory_exists(const utf8 *path) +{ + wchar_t *wPath = utf8_to_widechar(path); + int len = min(MAX_PATH, utf8_length(path)); + char buffer[MAX_PATH]; + wcstombs(buffer, wPath, len); + buffer[len] = '\0'; + free(wPath); + struct stat dirinfo; + int result = stat(buffer, &dirinfo); + log_verbose("checking dir %s, result = %d, is_dir = %d", buffer, result, S_ISDIR(dirinfo.st_mode)); + if ((result != 0) || !S_ISDIR(dirinfo.st_mode)) + { + return false; + } + return true; +} + +bool platform_original_game_data_exists(const utf8 *path) +{ + wchar_t *wPath = utf8_to_widechar(path); + int len = min(MAX_PATH, utf8_length(path)); + char buffer[MAX_PATH]; + wcstombs(buffer, wPath, len); + buffer[len] = '\0'; + free(wPath); + char checkPath[MAX_PATH]; + sprintf(checkPath, "%s%c%s%c%s", buffer, platform_get_path_separator(), "Data", platform_get_path_separator(), "g1.dat"); + return platform_file_exists(checkPath); +} + +mode_t getumask() +{ + mode_t mask = umask(0); + umask(mask); + return 0777 & ~mask; // Keep in mind 0777 is octal +} + +bool platform_ensure_directory_exists(const utf8 *path) +{ + mode_t mask = getumask(); + + wchar_t *wPath = utf8_to_widechar(path); + int len = min(MAX_PATH, utf8_length(path)); + char buffer[MAX_PATH]; + wcstombs(buffer, wPath, len); + buffer[len - 1] = '\0'; + free(wPath); + log_verbose("%s", buffer); + const int result = mkdir(buffer, mask); + if (result == 0 || (result == -1 && errno == EEXIST)) + return true; + return false; +} + +bool platform_directory_delete(const utf8 *path) +{ + STUB(); + return true; +} + +bool platform_lock_single_instance() +{ + STUB(); + return true; +} + +typedef struct { + char active; + char pattern[MAX_PATH]; + struct dirent **fileListTemp; + char **paths; + int cnt; + int handle; + void* data; +} enumerate_file_info; +static enumerate_file_info _enumerateFileInfoList[8] = { 0 }; + +char *g_file_pattern; + +static int winfilter(const struct dirent *d) +{ + int entry_length = strnlen(d->d_name, MAX_PATH); + char *name_upper = malloc(entry_length + 1); + if (name_upper == NULL) + { + log_error("out of memory"); + return 0; + } + for (int i = 0; i < entry_length; i++) + { + name_upper[i] = (char)toupper(d->d_name[i]); + } + name_upper[entry_length] = '\0'; + bool match = fnmatch(g_file_pattern, name_upper, FNM_PATHNAME) == 0; + //log_warning("trying matching filename %s, result = %d", name_upper, match); + free(name_upper); + return match; +} + +int platform_enumerate_files_begin(const utf8 *pattern) +{ + enumerate_file_info *enumFileInfo; + wchar_t *wpattern = utf8_to_widechar(pattern); + int length = min(utf8_length(pattern), MAX_PATH); + char *npattern = malloc(length+1); + int converted; + converted = wcstombs(npattern, wpattern, length); + npattern[length] = '\0'; + if (converted == MAX_PATH) { + log_warning("truncated string %s", npattern); + } + log_warning("begin file search, pattern: %s", npattern); + + char *file_name = strrchr(npattern, platform_get_path_separator()); + char *dir_name; + if (file_name != NULL) + { + dir_name = strndup(npattern, file_name - npattern); + file_name = &file_name[1]; + } else { + file_name = npattern; + dir_name = strdup("."); + } + + + int pattern_length = strlen(file_name); + g_file_pattern = strndup(file_name, pattern_length); + for (int j = 0; j < pattern_length; j++) + { + g_file_pattern[j] = (char)toupper(g_file_pattern[j]); + } + log_warning("looking for file matching %s", g_file_pattern); + int cnt; + for (int i = 0; i < countof(_enumerateFileInfoList); i++) { + enumFileInfo = &_enumerateFileInfoList[i]; + if (!enumFileInfo->active) { + safe_strncpy(enumFileInfo->pattern, npattern, sizeof(enumFileInfo->pattern)); + cnt = scandir(dir_name, &enumFileInfo->fileListTemp, winfilter, alphasort); + if (cnt < 0) + { + break; + } + log_warning("found %d files matching in dir '%s'", cnt, dir_name); + enumFileInfo->cnt = cnt; + enumFileInfo->paths = malloc(cnt * sizeof(char *)); + char **paths = enumFileInfo->paths; + // 256 is size of dirent.d_name + const int buf_len = min(MAX_PATH, 256); + const int dir_name_len = strnlen(dir_name, MAX_PATH); + char separator[] = {platform_get_path_separator(), 0}; + for (int idx = 0; idx < cnt; idx++) + { + struct dirent *d = enumFileInfo->fileListTemp[idx]; + const int entry_len = strnlen(d->d_name, MAX_PATH); + // 1 for separator, 1 for trailing null + paths[idx] = malloc(sizeof(char) * min(MAX_PATH, entry_len + dir_name_len + 2)); + paths[idx][0] = '\0'; + log_verbose("dir_name: %s", dir_name); + strncat(paths[idx], dir_name, MAX_PATH); + strncat(paths[idx], separator, MAX_PATH); + strncat(paths[idx], d->d_name, MAX_PATH); + log_verbose("paths[%d] = %s", idx, paths[idx]); + } + enumFileInfo->handle = 0; + enumFileInfo->active = 1; + free(dir_name); + free(g_file_pattern); + g_file_pattern = NULL; + free(wpattern); + free(npattern); + return i; + } + } + + free(dir_name); + free(g_file_pattern); + g_file_pattern = NULL; + free(wpattern); + free(npattern); + return -1; +} + +bool platform_enumerate_files_next(int handle, file_info *outFileInfo) +{ + + if (handle < 0) + { + return false; + } + enumerate_file_info *enumFileInfo = &_enumerateFileInfoList[handle]; + bool result; + + if (enumFileInfo->handle < enumFileInfo->cnt) { + result = true; + } else { + result = false; + } + + if (result) { + int entryIdx = enumFileInfo->handle++; + struct stat fileInfo; + log_verbose("trying handle %d", entryIdx); + char *fileName = enumFileInfo->paths[entryIdx]; + int statRes; + statRes = stat(fileName, &fileInfo); + if (statRes == -1) { + log_error("failed to stat file '%s'! errno = %i", fileName, errno); + return false; + } + outFileInfo->path = basename(fileName); + outFileInfo->size = fileInfo.st_size; + outFileInfo->last_modified = fileInfo.st_mtime; + return true; + } else { + return false; + } +} + +void platform_enumerate_files_end(int handle) +{ + if (handle < 0) + { + return; + } + enumerate_file_info *enumFileInfo = &_enumerateFileInfoList[handle]; + int cnt = enumFileInfo->cnt; + for (int i = 0; i < cnt; i++) { + free(enumFileInfo->fileListTemp[i]); + free(enumFileInfo->paths[i]); + } + free(enumFileInfo->fileListTemp); + free(enumFileInfo->paths); + // FIXME: this here could have a bug + enumFileInfo->fileListTemp = NULL; + enumFileInfo->handle = 0; + enumFileInfo->active = 0; +} + +static int dirfilter(const struct dirent *d) +{ + if (d->d_name[0] == '.') { + return 0; + } +#if defined(_DIRENT_HAVE_D_TYPE) || defined(DT_UNKNOWN) + if (d->d_type == DT_DIR) + { + return 1; + } else { + return 0; + } +#else +#error implement dirfilter! +#endif // defined(_DIRENT_HAVE_D_TYPE) || defined(DT_UNKNOWN) +} + +int platform_enumerate_directories_begin(const utf8 *directory) +{ + enumerate_file_info *enumFileInfo; + wchar_t *wpattern = utf8_to_widechar(directory); + int length = min(utf8_length(directory), MAX_PATH); + char *npattern = malloc(length+1); + int converted; + converted = wcstombs(npattern, wpattern, length); + npattern[length] = '\0'; + if (converted == MAX_PATH) { + log_warning("truncated string %s", npattern); + } + log_warning("begin directory listing, path: %s", npattern); + + // TODO: add some checking for stringness and directoryness + + int cnt; + for (int i = 0; i < countof(_enumerateFileInfoList); i++) { + enumFileInfo = &_enumerateFileInfoList[i]; + if (!enumFileInfo->active) { + safe_strncpy(enumFileInfo->pattern, npattern, length); + cnt = scandir(npattern, &enumFileInfo->fileListTemp, dirfilter, alphasort); + if (cnt < 0) + { + break; + } + log_warning("found %d files in dir '%s'", cnt, npattern); + enumFileInfo->cnt = cnt; + enumFileInfo->paths = malloc(cnt * sizeof(char *)); + char **paths = enumFileInfo->paths; + // 256 is size of dirent.d_name + const int buf_len = min(MAX_PATH, 256); + const int dir_name_len = strnlen(npattern, MAX_PATH); + char separator[] = {platform_get_path_separator(), 0}; + for (int idx = 0; idx < cnt; idx++) + { + struct dirent *d = enumFileInfo->fileListTemp[idx]; + const int entry_len = strnlen(d->d_name, MAX_PATH); + // 1 for separator, 1 for trailing null + paths[idx] = malloc(sizeof(char) * min(MAX_PATH, entry_len + dir_name_len + 2)); + paths[idx][0] = '\0'; + log_verbose("dir_name: %s", npattern); + strncat(paths[idx], npattern, MAX_PATH); + strncat(paths[idx], separator, MAX_PATH); + strncat(paths[idx], d->d_name, MAX_PATH); + log_verbose("paths[%d] = %s", idx, paths[idx]); + } + enumFileInfo->handle = 0; + enumFileInfo->active = 1; + free(wpattern); + free(npattern); + return i; + } + } + + free(wpattern); + free(npattern); + return -1; +} + +bool platform_enumerate_directories_next(int handle, utf8 *path) +{ + if (handle < 0) + { + return false; + } + + bool result; + enumerate_file_info *enumFileInfo = &_enumerateFileInfoList[handle]; + + log_verbose("handle = %d", handle); + if (enumFileInfo->handle < enumFileInfo->cnt) { + result = true; + } else { + result = false; + } + + if (result) { + int entryIdx = enumFileInfo->handle++; + struct stat fileInfo; + char *fileName = enumFileInfo->paths[entryIdx]; + int statRes; + statRes = stat(fileName, &fileInfo); + if (statRes == -1) { + log_error("failed to stat file '%s'! errno = %i", fileName, errno); + return false; + } + // so very, very wrong + safe_strncpy(path, basename(fileName), MAX_PATH); + strncat(path, "/", MAX_PATH); + path[MAX_PATH - 1] = '\0'; + return true; + } else { + return false; + } +} + +void platform_enumerate_directories_end(int handle) +{ + if (handle < 0) + { + return; + } + enumerate_file_info *enumFileInfo = &_enumerateFileInfoList[handle]; + int cnt = enumFileInfo->cnt; + for (int i = 0; i < cnt; i++) { + free(enumFileInfo->fileListTemp[i]); + free(enumFileInfo->paths[i]); + } + free(enumFileInfo->fileListTemp); + free(enumFileInfo->paths); + // FIXME: this here could have a bug + enumFileInfo->fileListTemp = NULL; + enumFileInfo->handle = 0; + enumFileInfo->active = 0; +} + +int platform_get_drives(){ + /* + return GetLogicalDrives(); + */ + STUB(); + return 0; +} + +bool platform_file_copy(const utf8 *srcPath, const utf8 *dstPath, bool overwrite) +{ + STUB(); + return 0; +} + +bool platform_file_move(const utf8 *srcPath, const utf8 *dstPath) +{ + STUB(); + return 0; +} + +bool platform_file_delete(const utf8 *path) +{ + STUB(); + return 0; +} + +wchar_t *regular_to_wchar(const char* src) +{ + int len = strnlen(src, MAX_PATH); + wchar_t *w_buffer = malloc((len + 1) * sizeof(wchar_t)); + mbtowc (NULL, NULL, 0); /* reset mbtowc */ + + int max = len; + int i = 0; + while (max > 0) + { + int length; + length = mbtowc(&w_buffer[i], &src[i], max); + if (length < 1) + { + w_buffer[i + 1] = '\0'; + break; + } + i += length; + max -= length; + } + return w_buffer; +} + +/** + * Default directory fallback is: + * - (command line argument) + * - $XDG_CONFIG_HOME/.config/OpenRCT2 + * - /home/[uid]/.config/OpenRCT2 + */ +void platform_resolve_user_data_path() +{ + const char separator[2] = { platform_get_path_separator(), 0 }; + + if (gCustomUserDataPath[0] != 0) { + realpath(gCustomUserDataPath, _userDataDirectoryPath); + + // Ensure path ends with separator + int len = strlen(_userDataDirectoryPath); + if (_userDataDirectoryPath[len - 1] != separator[0]) { + strcat(_userDataDirectoryPath, separator); + } + return; + } + + char buffer[MAX_PATH]; + buffer[0] = '\0'; + log_verbose("buffer = '%s'", buffer); + const char *homedir = getenv("XDG_CONFIG_HOME"); + log_verbose("homedir = '%s'", homedir); + if (homedir == NULL) + { + homedir = getpwuid(getuid())->pw_dir; + log_verbose("homedir was null, used getuid, now is = '%s'", homedir); + if (homedir == NULL) + { + log_fatal("Couldn't find user data directory"); + exit(-1); + return; + } + + strncat(buffer, homedir, MAX_PATH); + strncat(buffer, separator, MAX_PATH); + strncat(buffer, ".config", MAX_PATH); + } + else + { + strncat(buffer, homedir, MAX_PATH); + } + strncat(buffer, separator, MAX_PATH); + strncat(buffer, "OpenRCT2", MAX_PATH); + strncat(buffer, separator, MAX_PATH); + log_verbose("OpenRCT2 user data directory = '%s'", buffer); + int len = strnlen(buffer, MAX_PATH); + wchar_t *w_buffer = regular_to_wchar(buffer); + w_buffer[len] = '\0'; + utf8 *path = widechar_to_utf8(w_buffer); + free(w_buffer); + safe_strncpy(_userDataDirectoryPath, path, MAX_PATH); + free(path); +} + +void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) +{ + const char separator[2] = { platform_get_path_separator(), 0 }; + char buffer[MAX_PATH]; + safe_strncpy(buffer, _userDataDirectoryPath, sizeof(buffer)); + if (subDirectory != NULL && subDirectory[0] != 0) { + log_verbose("adding subDirectory '%s'", subDirectory); + strcat(buffer, subDirectory); + strcat(buffer, separator); + } + int len = strnlen(buffer, MAX_PATH); + wchar_t *w_buffer = regular_to_wchar(buffer); + w_buffer[len] = '\0'; + utf8 *path = widechar_to_utf8(w_buffer); + free(w_buffer); + safe_strncpy(outPath, path, MAX_PATH); + free(path); + log_verbose("outPath + subDirectory = '%s'", buffer); +} + +void platform_show_messagebox(char *message) +{ + STUB(); + log_warning(message); +} + +/** + * + * rct2: 0x004080EA + */ +int platform_open_common_file_dialog(int type, utf8 *title, utf8 *filename, utf8 *filterPattern, utf8 *filterName) +{ + STUB(); + return 0; +} + +utf8 *platform_open_directory_browser(utf8 *title) +{ + STUB(); + return NULL; +} + +uint16 platform_get_locale_language(){ + /* + CHAR langCode[4]; + + if (GetLocaleInfo(LOCALE_USER_DEFAULT, + LOCALE_SABBREVLANGNAME, + (LPSTR)&langCode, + sizeof(langCode)) == 0){ + return LANGUAGE_UNDEFINED; + } + + if (strcmp(langCode, "ENG") == 0){ + return LANGUAGE_ENGLISH_UK; + } + else if (strcmp(langCode, "ENU") == 0){ + return LANGUAGE_ENGLISH_US; + } + else if (strcmp(langCode, "DEU") == 0){ + return LANGUAGE_GERMAN; + } + else if (strcmp(langCode, "NLD") == 0){ + return LANGUAGE_DUTCH; + } + else if (strcmp(langCode, "FRA") == 0){ + return LANGUAGE_FRENCH; + } + else if (strcmp(langCode, "HUN") == 0){ + return LANGUAGE_HUNGARIAN; + } + else if (strcmp(langCode, "PLK") == 0){ + return LANGUAGE_POLISH; + } + else if (strcmp(langCode, "ESP") == 0){ + return LANGUAGE_SPANISH; + } + else if (strcmp(langCode, "SVE") == 0){ + return LANGUAGE_SWEDISH; + } + else if (strcmp(langCode, "ITA") == 0){ + return LANGUAGE_ITALIAN; + } + else if (strcmp(langCode, "POR") == 0){ + return LANGUAGE_PORTUGUESE_BR; + } + */ + STUB(); + return LANGUAGE_ENGLISH_UK; +} + +time_t platform_file_get_modified_time(const utf8* path){ + struct stat buf; + if (stat(path, &buf) == 0) { + return buf.st_mtime; + } + return 100; +} + +uint8 platform_get_locale_currency(){ + /* + CHAR currCode[4]; + + if (GetLocaleInfo(LOCALE_USER_DEFAULT, + LOCALE_SINTLSYMBOL, + (LPSTR)&currCode, + sizeof(currCode)) == 0){ + return CURRENCY_POUNDS; + } + if (strcmp(currCode, "GBP") == 0){ + return CURRENCY_POUNDS; + } + else if (strcmp(currCode, "USD") == 0){ + return CURRENCY_DOLLARS; + } + else if (strcmp(currCode, "EUR") == 0){ + return CURRENCY_EUROS; + } + else if (strcmp(currCode, "SEK") == 0){ + return CURRENCY_KRONA; + } + else if (strcmp(currCode, "DEM") == 0){ + return CURRENCY_DEUTSCHMARK; + } + else if (strcmp(currCode, "ITL") == 0){ + return CURRENCY_LIRA; + } + else if (strcmp(currCode, "JPY") == 0){ + return CURRENCY_YEN; + } + else if (strcmp(currCode, "ESP") == 0){ + return CURRENCY_PESETA; + } + else if (strcmp(currCode, "FRF") == 0){ + return CURRENCY_FRANC; + } + else if (strcmp(currCode, "NLG") == 0){ + return CURRENCY_GUILDERS; + } + */ + STUB(); + return CURRENCY_POUNDS; +} + +uint8 platform_get_locale_measurement_format(){ + /* + UINT measurement_system; + if (GetLocaleInfo(LOCALE_USER_DEFAULT, + LOCALE_IMEASURE | LOCALE_RETURN_NUMBER, + (LPSTR)&measurement_system, + sizeof(measurement_system)) == 0){ + return MEASUREMENT_FORMAT_IMPERIAL; + } + switch (measurement_system){ + case 0: + return MEASUREMENT_FORMAT_METRIC; + case 1: + default: + return MEASUREMENT_FORMAT_IMPERIAL; + }*/ + STUB(); + return MEASUREMENT_FORMAT_METRIC; +} + +uint8 platform_get_locale_temperature_format(){ + /* + // There does not seem to be a function to obtain this, just check the countries + UINT country; + if (GetLocaleInfo(LOCALE_USER_DEFAULT, + LOCALE_IMEASURE | LOCALE_RETURN_NUMBER, + (LPSTR)&country, + sizeof(country)) == 0){ + return TEMPERATURE_FORMAT_C; + } + switch (country){ + case CTRY_UNITED_STATES: + case CTRY_BELIZE: + return TEMPERATURE_FORMAT_F; + default: + return TEMPERATURE_FORMAT_C; + } + */ + STUB(); + return TEMPERATURE_FORMAT_C; +} + +#endif diff --git a/src/platform/unix.c b/src/platform/unix.c deleted file mode 100644 index 956828364e..0000000000 --- a/src/platform/unix.c +++ /dev/null @@ -1,78 +0,0 @@ -/***************************************************************************** - * Copyright (c) 2014 Ted John - * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * - * This file is part of OpenRCT2. - * - * OpenRCT2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - *****************************************************************************/ - -#ifndef _WIN32 -#ifndef __APPLE__ - -#include "../cmdline.h" -#include "../openrct2.h" -#include - -/** - * Unix, linux and fallback entry point to OpenRCT2. - */ -// int main(char *argv[], int argc) -// { -// if (cmdline_run(argv, argc)) -// openrct2_launch(); -// -// return gExitCode; -// } - -/* -char platform_get_path_separator() -{ - return '/'; -} -*/ - -// See http://syprog.blogspot.ru/2011/12/listing-loaded-shared-objects-in-linux.html -struct lmap { - void* base_address; - char* path; - void* unused; - struct lmap *next, *prev; -}; - -struct dummy { - void* pointers[3]; - struct dummy* ptr; -}; - -bool platform_check_steam_overlay_attached() { - void* processHandle = dlopen(NULL, RTLD_NOW); - - struct dummy* p = (struct dummy*) processHandle; - p = p->ptr; - - struct lmap* pl = (struct lmap*) p->ptr; - - while (pl != NULL) { - if (strstr(pl->path, "gameoverlayrenderer.so") != NULL) { - return true; - } - pl = pl->next; - } - - return false; -} - -#endif -#endif diff --git a/src/rct2.h b/src/rct2.h index 660536a691..4910528dbc 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -92,7 +92,7 @@ typedef utf16* utf16string; #ifdef __linux__ #define OPENRCT2_PLATFORM "Linux" #endif -#ifdef __APPLE__ +#if defined(__APPLE__) && defined(__MACH__) #define OPENRCT2_PLATFORM "OS X" #endif #ifndef OPENRCT2_PLATFORM From 7909ba1f3b74e916aeab33320185ad094f240434 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 28 Nov 2015 12:10:17 +0000 Subject: [PATCH 1151/1173] fix #2390: Not fully implemented UTF-8 currencies in building/landscaping/etc. --- src/drawing/drawing.h | 2 +- src/drawing/font.c | 109 ++++++++++++++++++++++----------------- src/drawing/font.h | 2 + src/drawing/string.c | 6 ++- src/interface/viewport.c | 9 +++- 5 files changed, 78 insertions(+), 50 deletions(-) diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 45baa09cdf..69d8c85c3a 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -134,7 +134,7 @@ void gfx_draw_string_right(rct_drawpixelinfo *dpi, int format, void *args, int c void draw_string_right_underline(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y); int string_get_height_raw(char *buffer); void gfx_draw_string_centred_wrapped_partial(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct_string_id format, void *args, int ticks); -void gfx_draw_string_with_y_offsets(rct_drawpixelinfo *dpi, utf8 *text, int colour, int x, int y, const sint8 *yOffsets); +void gfx_draw_string_with_y_offsets(rct_drawpixelinfo *dpi, const utf8 *text, int colour, int x, int y, const sint8 *yOffsets, bool forceSpriteFont); int gfx_clip_string(char* buffer, int width); bool ttf_initialise(); diff --git a/src/drawing/font.c b/src/drawing/font.c index d4b3b08090..47003f4bef 100644 --- a/src/drawing/font.c +++ b/src/drawing/font.c @@ -127,60 +127,77 @@ int font_get_line_height_small(int fontSpriteBase) return font_get_line_height(fontSpriteBase) / 2; } -bool font_supports_string(const utf8 *text, int fontSize) +bool font_supports_string_sprite(const utf8 *text) { const utf8 *src = text; uint32 codepoint; while ((codepoint = utf8_get_next(src, &src)) != 0) { - if (gUseTrueTypeFont) { - bool supported = TTF_GlyphIsProvided(gCurrentTTFFontSet->size[fontSize].font, (uint16)codepoint); - if (!supported) { - return false; - } - } else { - bool supported = false; - switch (codepoint) { - case FORMAT_ENDQUOTES: - case FORMAT_AMINUSCULE: - case FORMAT_UP: - case FORMAT_SYMBOL_i: - case FORMAT_CENT: - case FORMAT_POUND: - case FORMAT_YEN: - case FORMAT_COPYRIGHT: - case FORMAT_DOWN: - case FORMAT_LEFTGUILLEMET: - case FORMAT_TICK: - case FORMAT_CROSS: - case FORMAT_RIGHT: - case FORMAT_DEGREE: - case FORMAT_SYMBOL_RAILWAY: - case FORMAT_SQUARED: - case FORMAT_OPENQUOTES: - case FORMAT_EURO: - case FORMAT_SYMBOL_ROAD: - case FORMAT_SYMBOL_FLAG: - case FORMAT_APPROX: - case FORMAT_POWERNEGATIVEONE: - case FORMAT_BULLET: - case FORMAT_RIGHTGUILLEMET: - case FORMAT_SMALLUP: - case FORMAT_SMALLDOWN: - case FORMAT_LEFT: - case FORMAT_INVERTEDQUESTION: + bool supported = false; + switch (codepoint) { + case FORMAT_ENDQUOTES: + case FORMAT_AMINUSCULE: + case FORMAT_UP: + case FORMAT_SYMBOL_i: + case FORMAT_CENT: + case FORMAT_POUND: + case FORMAT_YEN: + case FORMAT_COPYRIGHT: + case FORMAT_DOWN: + case FORMAT_LEFTGUILLEMET: + case FORMAT_TICK: + case FORMAT_CROSS: + case FORMAT_RIGHT: + case FORMAT_DEGREE: + case FORMAT_SYMBOL_RAILWAY: + case FORMAT_SQUARED: + case FORMAT_OPENQUOTES: + case FORMAT_EURO: + case FORMAT_SYMBOL_ROAD: + case FORMAT_SYMBOL_FLAG: + case FORMAT_APPROX: + case FORMAT_POWERNEGATIVEONE: + case FORMAT_BULLET: + case FORMAT_RIGHTGUILLEMET: + case FORMAT_SMALLUP: + case FORMAT_SMALLDOWN: + case FORMAT_LEFT: + case FORMAT_INVERTEDQUESTION: + supported = true; + break; + default: + if (codepoint >= 32 && codepoint < 256) { supported = true; - break; - default: - if (codepoint >= 32 && codepoint < 256) { - supported = true; - } - break; - } - if (!supported) { - return false; } + break; + } + if (!supported) { + return false; } } return true; } + +bool font_supports_string_ttf(const utf8 *text, int fontSize) +{ + const utf8 *src = text; + const TTF_Font *font = gCurrentTTFFontSet->size[fontSize].font; + + uint32 codepoint; + while ((codepoint = utf8_get_next(src, &src)) != 0) { + bool supported = TTF_GlyphIsProvided(font, (uint16)codepoint); + if (!supported) { + return false; + } + } + return true; +} + +bool font_supports_string(const utf8 *text, int fontSize) +{ + if (gUseTrueTypeFont) { + return font_supports_string_ttf(text, fontSize); + } else { + return font_supports_string_sprite(text); + } +} diff --git a/src/drawing/font.h b/src/drawing/font.h index 9290a0ee6e..de7abc298b 100644 --- a/src/drawing/font.h +++ b/src/drawing/font.h @@ -43,6 +43,8 @@ int font_sprite_get_codepoint_sprite(int fontSpriteBase, int codepoint); int font_get_size_from_sprite_base(uint16 spriteBase); int font_get_line_height(int fontSpriteBase); int font_get_line_height_small(int fontSpriteBase); +bool font_supports_string_sprite(const utf8 *text); +bool font_supports_string_ttf(const utf8 *text, int fontSize); bool font_supports_string(const utf8 *text, int fontSize); #endif diff --git a/src/drawing/string.c b/src/drawing/string.c index e1416ddf1b..cda6348f9c 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -1324,7 +1324,7 @@ static int ttf_get_string_width(const utf8 *text) * * rct2: 0x00682F28 */ -void gfx_draw_string_with_y_offsets(rct_drawpixelinfo *dpi, utf8 *text, int colour, int x, int y, const sint8 *yOffsets) +void gfx_draw_string_with_y_offsets(rct_drawpixelinfo *dpi, const utf8 *text, int colour, int x, int y, const sint8 *yOffsets, bool forceSpriteFont) { text_draw_info info; info.font_sprite_base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); @@ -1337,7 +1337,9 @@ void gfx_draw_string_with_y_offsets(rct_drawpixelinfo *dpi, utf8 *text, int colo info.flags |= TEXT_DRAW_FLAG_Y_OFFSET_EFFECT; - // if (gUseTrueTypeFont) info.flags |= TEXT_DRAW_FLAG_TTF; + if (!forceSpriteFont && gUseTrueTypeFont) { + info.flags |= TEXT_DRAW_FLAG_TTF; + } memcpy(info.palette, text_palette, sizeof(info.palette)); ttf_process_initial_colour(colour, &info); diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 0bb8560dc1..78b9c5ad12 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -2221,7 +2221,14 @@ static void viewport_draw_money_effects() do { format_string(buffer, ps->string_id, &ps->args); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = FONT_SPRITE_BASE_MEDIUM; - gfx_draw_string_with_y_offsets(&dpi, buffer, 0, ps->x, ps->y, (sint8 *)ps->y_offsets); + + bool forceSpriteFont = false; + const currency_descriptor *currencyDesc = &CurrencyDescriptors[gConfigGeneral.currency_format]; + if (gUseTrueTypeFont && font_supports_string_sprite(currencyDesc->symbol_unicode)) { + forceSpriteFont = true; + } + + gfx_draw_string_with_y_offsets(&dpi, buffer, 0, ps->x, ps->y, (sint8 *)ps->y_offsets, forceSpriteFont); } while ((ps = ps->next) != NULL); } From cf1961b725e663cdd2b2a6cf007ded7f0058b301 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 28 Nov 2015 12:24:19 +0000 Subject: [PATCH 1152/1173] fix #2385: Parks created with scenario editor do not have correct initial temperature --- src/scenario.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/scenario.c b/src/scenario.c index 6975421c80..bc36a8eb3d 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -21,6 +21,7 @@ #include "addresses.h" #include "config.h" #include "game.h" +#include "world/climate.h" #include "interface/viewport.h" #include "localisation/date.h" #include "localisation/localisation.h" @@ -809,6 +810,9 @@ int scenario_prepare_for_save() if (RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) == OBJECTIVE_GUESTS_AND_RATING) RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) |= PARK_FLAGS_PARK_OPEN; + // Fix #2385: saved scenarios did not initialise temperatures to selected climate + climate_reset(RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE, uint8)); + return 1; } From 60719da852b802ae5e7c0fda97936ae46fcc3c33 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sat, 28 Nov 2015 13:33:23 +0100 Subject: [PATCH 1153/1173] Update changelog.txt --- distribution/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 0b54cb2da6..831a348e90 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -54,6 +54,7 @@ - Fix: Map window now display the usable map size, not the technical one (original bug). - Fix: TD4 River Rapids will now have the correct seat colour (original bug). - Fix: Message sound will no longer play in the editor modes (original bug). +- Fix: Scenarios created with the Scenario Editor will now have the correct inital temperature for their climate (original bug). 0.0.2-beta (2015-06-21) ------------------------------------------------------------------------ From 767333f0b4da099beeeca4b386bbc23cc7f7b3b4 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sat, 28 Nov 2015 16:46:09 +0100 Subject: [PATCH 1154/1173] Fix typo in changelog --- distribution/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 831a348e90..3e0d7cd52c 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -54,7 +54,7 @@ - Fix: Map window now display the usable map size, not the technical one (original bug). - Fix: TD4 River Rapids will now have the correct seat colour (original bug). - Fix: Message sound will no longer play in the editor modes (original bug). -- Fix: Scenarios created with the Scenario Editor will now have the correct inital temperature for their climate (original bug). +- Fix: Scenarios created with the Scenario Editor will now have the correct initial temperature for their climate (original bug). 0.0.2-beta (2015-06-21) ------------------------------------------------------------------------ From 39cc16d137ebd5ad76d279230ad533308341b1a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sun, 29 Nov 2015 12:15:47 +0100 Subject: [PATCH 1155/1173] Plug memory leaks, check memory accesses --- src/interface/window.c | 5 +++++ src/openrct2.c | 2 +- src/peep/peep.c | 1 + src/platform/linux.c | 2 ++ src/platform/posix.c | 12 ++++++------ src/scenario.c | 4 ++-- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/interface/window.c b/src/interface/window.c index ebed32d5c2..bada6d28e9 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -940,6 +940,7 @@ void widget_invalidate(rct_window *w, int widgetIndex) { rct_widget* widget; + assert(w != NULL); widget = &w->widgets[widgetIndex]; if (widget->left == -2) return; @@ -1032,6 +1033,7 @@ void window_update_scroll_widgets(rct_window *w) widgetIndex = 0; scrollIndex = 0; + assert(w != NULL); for (widget = w->widgets; widget->type != WWT_LAST; widget++, widgetIndex++) { if (widget->type != WWT_SCROLL) continue; @@ -1073,6 +1075,7 @@ int window_get_scroll_data_index(rct_window *w, int widget_index) int i, result; result = 0; + assert(w != NULL); for (i = 0; i < widget_index; i++) { if (w->widgets[i].type == WWT_SCROLL) result++; @@ -1251,6 +1254,7 @@ void window_scroll_to_viewport(rct_window *w) { int x, y, z; rct_window *mainWindow; + assert(w != NULL); // In original checked to make sure x and y were not -1 as well. if (w->viewport == NULL || w->viewport_focus_coordinates.y == -1) return; @@ -1287,6 +1291,7 @@ void window_scroll_to_location(rct_window *w, int x, int y, int z) .z = z }; + assert(w != NULL); if (w->viewport) { sint16 height = map_element_height(x, y); if (z < height - 16) { diff --git a/src/openrct2.c b/src/openrct2.c index b3c97eda7c..6a6692d8d9 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -178,7 +178,7 @@ static void openrct2_set_exe_path() if (bytesRead == -1) { log_fatal("failed to read /proc/self/exe"); } - exePath[bytesRead] = '\0'; + exePath[bytesRead - 1] = '\0'; log_verbose("######################################## Setting exe path to %s", exePath); char *exeDelimiter = strrchr(exePath, platform_get_path_separator()); if (exeDelimiter == NULL) diff --git a/src/peep/peep.c b/src/peep/peep.c index 03a7544a22..e2ec99bc05 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -6586,6 +6586,7 @@ static int peep_interact_with_shop(rct_peep* peep, sint16 x, sint16 y, rct_map_e /* rct2: 0x0069524E */ static int peep_move_one_tile(uint8 direction, rct_peep* peep){ + assert(direction <= 7); sint16 x = peep->next_x; sint16 y = peep->next_y; x += TileDirectionDelta[direction].x; diff --git a/src/platform/linux.c b/src/platform/linux.c index f5d062e5dd..7f9dcca4d3 100644 --- a/src/platform/linux.c +++ b/src/platform/linux.c @@ -46,10 +46,12 @@ bool platform_check_steam_overlay_attached() { while (pl != NULL) { if (strstr(pl->path, "gameoverlayrenderer.so") != NULL) { + dlclose(processHandle); return true; } pl = pl->next; } + dlclose(processHandle); return false; } diff --git a/src/platform/posix.c b/src/platform/posix.c index 917f27ff4f..b048483e5a 100644 --- a/src/platform/posix.c +++ b/src/platform/posix.c @@ -95,7 +95,7 @@ char platform_get_path_separator() bool platform_file_exists(const utf8 *path) { wchar_t *wPath = utf8_to_widechar(path); - int len = min(MAX_PATH, utf8_length(path)); + int len = min(MAX_PATH - 1, utf8_length(path)); char buffer[MAX_PATH]; wcstombs(buffer, wPath, len); buffer[len] = '\0'; @@ -108,7 +108,7 @@ bool platform_file_exists(const utf8 *path) bool platform_directory_exists(const utf8 *path) { wchar_t *wPath = utf8_to_widechar(path); - int len = min(MAX_PATH, utf8_length(path)); + int len = min(MAX_PATH - 1, utf8_length(path)); char buffer[MAX_PATH]; wcstombs(buffer, wPath, len); buffer[len] = '\0'; @@ -126,7 +126,7 @@ bool platform_directory_exists(const utf8 *path) bool platform_original_game_data_exists(const utf8 *path) { wchar_t *wPath = utf8_to_widechar(path); - int len = min(MAX_PATH, utf8_length(path)); + int len = min(MAX_PATH - 1, utf8_length(path)); char buffer[MAX_PATH]; wcstombs(buffer, wPath, len); buffer[len] = '\0'; @@ -530,7 +530,7 @@ wchar_t *regular_to_wchar(const char* src) /** * Default directory fallback is: * - (command line argument) - * - $XDG_CONFIG_HOME/.config/OpenRCT2 + * - $XDG_CONFIG_HOME/OpenRCT2 * - /home/[uid]/.config/OpenRCT2 */ void platform_resolve_user_data_path() @@ -592,8 +592,8 @@ void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) safe_strncpy(buffer, _userDataDirectoryPath, sizeof(buffer)); if (subDirectory != NULL && subDirectory[0] != 0) { log_verbose("adding subDirectory '%s'", subDirectory); - strcat(buffer, subDirectory); - strcat(buffer, separator); + strncat(buffer, subDirectory, MAX_PATH); + strncat(buffer, separator, MAX_PATH); } int len = strnlen(buffer, MAX_PATH); wchar_t *w_buffer = regular_to_wchar(buffer); diff --git a/src/scenario.c b/src/scenario.c index bc36a8eb3d..8a6cd24f97 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -359,8 +359,8 @@ void scenario_begin() format_string(parkName, RCT2_GLOBAL(RCT2_ADDRESS_PARK_NAME, rct_string_id), (void*)RCT2_ADDRESS_PARK_NAME_ARGS); platform_get_user_directory(gScenarioSavePath, "save"); - strncat(gScenarioSavePath, parkName, sizeof(gScenarioSavePath)); - strncat(gScenarioSavePath, ".sv6", sizeof(gScenarioSavePath)); + strncat(gScenarioSavePath, parkName, sizeof(gScenarioSavePath) - strlen(gScenarioSavePath) - 1); + strncat(gScenarioSavePath, ".sv6", sizeof(gScenarioSavePath) - strlen(gScenarioSavePath) - 1); strcpy((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2, (char*)RCT2_ADDRESS_SAVED_GAMES_PATH); strcpy((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2 + strlen((char*)RCT2_ADDRESS_SAVED_GAMES_PATH_2), gScenarioSavePath); From ed21aeb3fc50d049ff4e1682844ac056db56fd1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sun, 29 Nov 2015 12:16:19 +0100 Subject: [PATCH 1156/1173] Take care of strings in POSIX platform file --- src/platform/posix.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/platform/posix.c b/src/platform/posix.c index b048483e5a..98cffb1bd7 100644 --- a/src/platform/posix.c +++ b/src/platform/posix.c @@ -261,12 +261,13 @@ int platform_enumerate_files_begin(const utf8 *pattern) struct dirent *d = enumFileInfo->fileListTemp[idx]; const int entry_len = strnlen(d->d_name, MAX_PATH); // 1 for separator, 1 for trailing null - paths[idx] = malloc(sizeof(char) * min(MAX_PATH, entry_len + dir_name_len + 2)); + size_t path_len = sizeof(char) * min(MAX_PATH, entry_len + dir_name_len + 2); + paths[idx] = malloc(path_len); paths[idx][0] = '\0'; log_verbose("dir_name: %s", dir_name); - strncat(paths[idx], dir_name, MAX_PATH); - strncat(paths[idx], separator, MAX_PATH); - strncat(paths[idx], d->d_name, MAX_PATH); + strncat(paths[idx], dir_name, path_len - 2); + strncat(paths[idx], separator, path_len - strnlen(paths[idx], path_len) - 1); + strncat(paths[idx], d->d_name, path_len - strnlen(paths[idx], path_len) - 1); log_verbose("paths[%d] = %s", idx, paths[idx]); } enumFileInfo->handle = 0; @@ -400,12 +401,13 @@ int platform_enumerate_directories_begin(const utf8 *directory) struct dirent *d = enumFileInfo->fileListTemp[idx]; const int entry_len = strnlen(d->d_name, MAX_PATH); // 1 for separator, 1 for trailing null - paths[idx] = malloc(sizeof(char) * min(MAX_PATH, entry_len + dir_name_len + 2)); + size_t path_len = sizeof(char) * min(MAX_PATH, entry_len + dir_name_len + 2); + paths[idx] = malloc(path_len); paths[idx][0] = '\0'; log_verbose("dir_name: %s", npattern); - strncat(paths[idx], npattern, MAX_PATH); - strncat(paths[idx], separator, MAX_PATH); - strncat(paths[idx], d->d_name, MAX_PATH); + strncat(paths[idx], npattern, path_len - 2); + strncat(paths[idx], separator, path_len - strnlen(paths[idx], path_len) - 1); + strncat(paths[idx], d->d_name, path_len - strnlen(paths[idx], path_len) - 1); log_verbose("paths[%d] = %s", idx, paths[idx]); } enumFileInfo->handle = 0; @@ -450,8 +452,7 @@ bool platform_enumerate_directories_next(int handle, utf8 *path) } // so very, very wrong safe_strncpy(path, basename(fileName), MAX_PATH); - strncat(path, "/", MAX_PATH); - path[MAX_PATH - 1] = '\0'; + strncat(path, "/", MAX_PATH - strlen(path) - 1); return true; } else { return false; @@ -543,7 +544,7 @@ void platform_resolve_user_data_path() // Ensure path ends with separator int len = strlen(_userDataDirectoryPath); if (_userDataDirectoryPath[len - 1] != separator[0]) { - strcat(_userDataDirectoryPath, separator); + strncat(_userDataDirectoryPath, separator, MAX_PATH - 1); } return; } @@ -564,17 +565,17 @@ void platform_resolve_user_data_path() return; } - strncat(buffer, homedir, MAX_PATH); - strncat(buffer, separator, MAX_PATH); - strncat(buffer, ".config", MAX_PATH); + strncat(buffer, homedir, MAX_PATH - 1); + strncat(buffer, separator, MAX_PATH - strnlen(buffer, MAX_PATH) - 1); + strncat(buffer, ".config", MAX_PATH - strnlen(buffer, MAX_PATH) - 1); } else { - strncat(buffer, homedir, MAX_PATH); + strncat(buffer, homedir, MAX_PATH - 1); } - strncat(buffer, separator, MAX_PATH); - strncat(buffer, "OpenRCT2", MAX_PATH); - strncat(buffer, separator, MAX_PATH); + strncat(buffer, separator, MAX_PATH - strnlen(buffer, MAX_PATH) - 1); + strncat(buffer, "OpenRCT2", MAX_PATH - strnlen(buffer, MAX_PATH) - 1); + strncat(buffer, separator, MAX_PATH - strnlen(buffer, MAX_PATH) - 1); log_verbose("OpenRCT2 user data directory = '%s'", buffer); int len = strnlen(buffer, MAX_PATH); wchar_t *w_buffer = regular_to_wchar(buffer); @@ -592,8 +593,8 @@ void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) safe_strncpy(buffer, _userDataDirectoryPath, sizeof(buffer)); if (subDirectory != NULL && subDirectory[0] != 0) { log_verbose("adding subDirectory '%s'", subDirectory); - strncat(buffer, subDirectory, MAX_PATH); - strncat(buffer, separator, MAX_PATH); + strncat(buffer, subDirectory, MAX_PATH - strnlen(buffer, MAX_PATH) - 1); + strncat(buffer, separator, MAX_PATH - strnlen(buffer, MAX_PATH) - 1); } int len = strnlen(buffer, MAX_PATH); wchar_t *w_buffer = regular_to_wchar(buffer); From a4cb2c55d15f8d6e60baf84b6208e841734cfc61 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Fri, 27 Nov 2015 23:03:12 +0000 Subject: [PATCH 1157/1173] Fix ride create on multiplayer using scenario_rand for colour causing desync --- src/ride/ride.c | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index fd31be73d6..5bcf23d81f 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5111,14 +5111,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 +5145,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 +5232,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 +5260,12 @@ foundRideEntry: } *outRideIndex = rideIndex; + // Ride 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); + } + 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 +5276,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); ride->overall_view = 0xFFFF; // Ride name @@ -5462,7 +5479,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) From 518b19156afcc210f029c07f4a18990bf95b6fd5 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 28 Nov 2015 00:02:45 +0000 Subject: [PATCH 1158/1173] Fix vehicle colours using scenario rand --- src/ride/ride.c | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index 5bcf23d81f..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; @@ -5260,10 +5263,12 @@ foundRideEntry: } *outRideIndex = rideIndex; - // Ride colour is calcualted before applying to ensure + // 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); + *outRideColour = + ride_get_random_colour_preset_index(type) | + (ride_get_unused_preset_vehicle_colour(type, subType) << 8); } if (!(flags & GAME_COMMAND_FLAG_APPLY)) { @@ -5276,7 +5281,7 @@ foundRideEntry: rideEntry = GET_RIDE_ENTRY(rideEntryIndex); ride->type = type; ride->subtype = rideEntryIndex; - ride_set_colour_preset(ride, *outRideColour); + ride_set_colour_preset(ride, *outRideColour & 0xFF); ride->overall_view = 0xFFFF; // Ride name @@ -5465,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; @@ -6760,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; @@ -6787,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; } From b1c8275ec0ba93953f5f9b96290286493148aeaa Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 28 Nov 2015 00:39:53 +0000 Subject: [PATCH 1159/1173] Disable tracks for networked games until fixed --- src/windows/track_list.c | 8 ++++++++ 1 file changed, 8 insertions(+) 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 } /** From cae7b03bdf000c654851d641710f8c5b79b79af0 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 28 Nov 2015 12:43:02 +0000 Subject: [PATCH 1160/1173] Fix #1717. Fixes fix ride from failing to fix safety cut out. As the code to fix rides has not been completed yet it was unknown that safety cutout had so many flags requiring reseting --- src/windows/ride.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/windows/ride.c b/src/windows/ride.c index 88086e816a..443c7c921e 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -3457,6 +3457,19 @@ 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: + 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: From 4527aa263e79acffa68b2253881346de18d89c73 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 28 Nov 2015 12:47:08 +0000 Subject: [PATCH 1161/1173] Added check to match mechanic fix --- src/windows/ride.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/windows/ride.c b/src/windows/ride.c index 443c7c921e..559a85f569 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -3458,6 +3458,8 @@ static void window_ride_maintenance_dropdown(rct_window *w, int widgetIndex, int 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 { From 0909ba8ab45bb3ab459b65c8ba6e13bae601b820 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Sat, 28 Nov 2015 14:34:22 +0100 Subject: [PATCH 1162/1173] fixed #2226: resetting screen age when quick saving --- src/game.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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() { From 5d489782f7de3efcab66dd0d183e9ed4c6ebef82 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Sat, 28 Nov 2015 14:54:12 +0100 Subject: [PATCH 1163/1173] Added myself to the contributor list. --- contributors.md | 1 + 1 file changed, 1 insertion(+) 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 From b9f7f6f4a2723d8075a59007d1a48235c7a9004f Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 29 Nov 2015 11:03:43 +0000 Subject: [PATCH 1164/1173] Fix #2395. Fix pressing construct twice --- src/windows/ride.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/windows/ride.c b/src/windows/ride.c index 559a85f569..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); } /** From df1f5bad00fc7fd0640723c11587c214dd709156 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 29 Nov 2015 15:08:48 +0000 Subject: [PATCH 1165/1173] fix #604: mute toilet flush sfx on title screen --- src/peep/peep.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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++; From d985e1d3d75fd0852c311ee0db52a02eddbc270b Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 29 Nov 2015 15:37:03 +0100 Subject: [PATCH 1166/1173] Update title sequence for 0.0.3 Add three parks, increase some intervals Adjust one interval Update title sequence for 0.0.3 --- data/title/openrct2/alexfablelake.SV6 | Bin 0 -> 808412 bytes data/title/openrct2/bigfoot.sv6 | Bin 0 -> 484675 bytes data/title/openrct2/faas.sv6 | Bin 2424998 -> 0 bytes data/title/openrct2/gymnasiast1.sv6 | Bin 0 -> 552177 bytes data/title/openrct2/gymnasiast2.sv6 | Bin 0 -> 1418726 bytes data/title/openrct2/netgrouppark.sv6 | Bin 0 -> 1185034 bytes data/title/openrct2/pfckrutonium1.sv6 | Bin 1477390 -> 673559 bytes data/title/openrct2/pfckrutonium2.sv6 | Bin 1654179 -> 0 bytes data/title/openrct2/phann.sv6 | Bin 0 -> 687858 bytes data/title/openrct2/script.txt | 119 ++++++++++---------------- data/title/openrct2/shotguns.sv6 | Bin 1033881 -> 0 bytes data/title/openrct2/triggerdeath.sv6 | Bin 3213150 -> 0 bytes 12 files changed, 46 insertions(+), 73 deletions(-) create mode 100644 data/title/openrct2/alexfablelake.SV6 create mode 100644 data/title/openrct2/bigfoot.sv6 delete mode 100644 data/title/openrct2/faas.sv6 create mode 100644 data/title/openrct2/gymnasiast1.sv6 create mode 100644 data/title/openrct2/gymnasiast2.sv6 create mode 100644 data/title/openrct2/netgrouppark.sv6 delete mode 100644 data/title/openrct2/pfckrutonium2.sv6 create mode 100644 data/title/openrct2/phann.sv6 delete mode 100644 data/title/openrct2/shotguns.sv6 delete mode 100644 data/title/openrct2/triggerdeath.sv6 diff --git a/data/title/openrct2/alexfablelake.SV6 b/data/title/openrct2/alexfablelake.SV6 new file mode 100644 index 0000000000000000000000000000000000000000..b48dbf132e3a0287675b16867f511bea08d28334 GIT binary patch literal 808412 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 z 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 z+0e3~Wkbt`mJKZ%S~j$7XxY%Rp=CqMhL#O28(KEBY-rigvY}-|%Z8Q>EgM=kv}|bE z(6XUrL(7Ji4J{j5HnePL+0e3~Wkbt`mJKZ%S~j$7XxY%Rp=CqMhL#O28(KEBY-rig zvY}-|%Z8Q>EgM=kv}|bE(6XUrL(7Ji4J{j5HnePL+0e3~Wkbt`mJKZ%S~j$7XxY%R zp=CqMhL#O28(KEBY-rigvY}-|%Z8Q>EgM=kv}|bE(6XUrL(7Ji4J{j5HnePL+0e3~ zWkbt`mJKZ%S~j$7XxY%Rp=CqMhL#O28(KEBY-rigvY}-|%Z8Q>EgM=kv}|bE(6XUr zL(7Ji4J{j5HnePL+0e3~Wkbt`mJKZ%S~j$7XxY%Rp=CqMhL#O28(KEBY-rigvY}-| z%Z8Q>EgM=kv}|bE(6XUrL(7Ji4J{j5HnePL+0e3~Wkbt`mJKZ%S~j$7XxY%Rp=CqM zhL#O28(KEBY-rigvY}-|%Z8Q>EgM=kv}|bE(6XUrL(7Ji4J{j5HnePL+0e3~Wkbt` zmJKZ%S~j$7XxY%Rp=CqMhL#O28(KEBY-rigvY}-|%Z8Q>EgM=kv}|bE(6XUrL(7Ji z4J{j5HnePL+0e3~Wkbt`mJKZ%S~j$7XxY%Rp=CqMhL#O28(KEBY-rigvY}-|%Z8Q> zEgM=kv}|bE(6XUrL(7Ji4J{j5HnePL+0e3~Wkbt`mJKZ%S~j$7XxY%Rp=CqMhL#O2 z8(KEBY-rigvY}-|%Z8Q>EgM=kv}|bE(6XUrL(7Ji4J{j5HnePL+0e3~Wkbt`mJKZ% zS~j$7XxY%Rp=CqMhL#O28(KEBY-rigvY}-|%Z8Q>EgM=kv}|bE(6XUrL(7Ji4J{j5 zHnePL+0e3~Wkbt`mJKZ%S~j$7XxY%Rp=CqMhL#O28(KEBY-rigvY}-|%Z8Q>EgM=k zv}|bE(6XUrL(7Ji4J{j5HnePL+0e3~Wkbt`mJKZ%S~j$7XxY%Rp=CqMhL#O28(KEB zY-rigvY}-|%Z8Q>EgM=kv}|bE(6XUrL(7Ji4J{j5HnePL+0e3~Wkbt`mJKZ%S~j$7 zXxY%Rp=CqMhL#O28(KEBY-rigvY}-|%Z8Q>EgM=kv}|bE(6XUrL(7Ji4J{j5HnePL z+0e3~Wkbt`mJKZ%S~j$7XxY%Rp=CqMhL#O28(KEBY-rigvY}-|%Z8Q>EgM=kv}|bE z(6XUrL(7Ji4J{j5HnePL+0e3~Wkbt`mJKZ%S~j$7XxY%Rp=CqMhL#O28(KEBY-rig zvY}-|%Z8Q>EgM=kv}|bE(6XUrL(7Ji4J{j5HnePL+0e3~Wkbt`mJKZ%S~j$7XxY%R zp=CqMhL#O28(KEBY-rigvY}-|%Z8Q>EgM=kv}|bE(6XUrL(7Ji4J{j5HnePL+0e3~ zWkbt`mJKZ%S~j$7XxY%Rp=CqMhL#O28(KEBY-ri=|DFxQi{p!yR0TJl9(77&o6HsG zH3^J3a+AC!pOc_`V^G2}XZM{_BgOJQiOAMwnJh)}9{ICW)yju*a>jLz?2yIJPQoJ$=^@@Lwqe6G}y6RIU$S0$rKel#lAJF+^OVg5%Qxg{r`x$XkV$e(1) z5q_*gV%ISK`3d<$QgVzg%QxDhjc&hlM7rbB&*}w>Q^`IF#T>~b<-B$otd&nV(h-x+ z)EG;94NhccL@HUTIpU0t92p+czm@KoL>*?j@R_Wf>Bw!7;Kl{=eutk4ua3-b zD3XA4RNCc(j=XGEa?VIlVr*Q36=`$K#vNd&+fwr1Ir)5CqFY$gpF}T^vU0O)wNfq- zSNAR1(`UBr7cwFvRkBL1ky<$^CcAm={HiEZ&BUc9vG2iW?|+X(mr8Mo1RaruEbrWr zTtEU@`A_yPAp=rmHt#XBcT?m;a(+PMVzYhatj#3(@L-nJf98dQa;q!fs*Xv*!P?j` zzRyvtxlhQrs#vtukjrRK8lEaT0SA(t^!>QjSU{Cx>!9GU>8JOio-P?~M8*?;RbHXpEr*B;MRO%;zIX3Fo%9 zHnMeRC*&$A6(_bW7Cmw}9hD|V@Uh*_;E=>?<>I*9g+=tpJ7V&+guFc_&o;?xj-=wc zW*<$)jt28l--VOb>&4zu5@IoBcqONj!9f1EjUn>Oc@%K z=})I+ZZDSDlc-F$w>2M<$(Kq=LL8~Al|=vEp}`}EM5^V~Q8|+pbz`4Bj79$7()M)~ zY(SA($LA$@_2Mo^-obwcoc_IXJ;P@#VTp|f<);#H_y;UxQjVp6nO`20({plsPAvq_ zkgS?WV@`sZ-oA_s^+?QVby=a7r4>JIzyIpR4FRbr<`I1Jcz%1C1l0uCc>W<22}-LI zIXSX8$i5UyXgX$nAy2@zFJ_k`Il1U?22Y!PSc-yDawPoAZ+*~M@m>TXAXzG3 zldo0DU9yE?u9pq+6Xs^jxh=j)Vg`n4V-g9Jk7R|_Un1A5F^96U80V>$x=oQMZdoO3 z#hDrfiN4A+He$`&)S5?ty&3X@7Y=sHWLN&nNtHYDHhxjfI3*|Lx@FZstDJS%i64>q zNhw`E3#{X}_DK2Gm;s$wQf4HWYB0*$^>;gR3LC`O{lAsyoZyAR2YQK@N)42YYQcR2-skw|$Y#8bf+aTHwE z$@Zzj&KN5SOCS<#ckaerOH#?zk*fQ-asQewjRPGEfg=(6&n zlsy+V&y|VrUNApbcbBms?g_T#c4^l z$X^&|hkK=*2We#-$;D-QITI<{0~I34~&UyaKD#6i5cBA$fz!UsWlphup_$-mc>D@jQt9>FIoCz{b(*`b>< zMP#05N+Gx+z`))eX@A0z5<^yRubkfyIV$JN8CZ@t{7LHH#q!vou$4Oc|B*k+7x-oc zgtadxGnl}MvS103$1Uw&k}@5)9N#1ly9~P+nw^BfA7#$oBN_ak*rVwI9r#NO{2T_k zAHr^{9v^xoUz~|)_#QAm^bdMNANwam#}}m7k!8*yUsW|Rg4eHA9J!i z*UN;BgYq5q&??VE8I9+n`kcdgA01;g%MU??y0+?{bKuhn{^{@l2b6czJ#RAJsf(@t z$#Rye9piNQW^Po{@kW>M$HXnuu%3#bgqi}3D86}<98Ss)GJCsQBzSKp!;MHIQ#y&U z<>ZTuU^kC>MV!+Z{TwM9C1#29(5g|X%;B|Dh}ot~I6eBbdwE=@Hp#5G4rUU6bhd}E z3K`^Cd*xI2-Eh+vWkDgtVVW1q42=^jWlB&+2jwfwrO$zt&gBQ^x692r+1M;`%w>yI zeg8{0$)skfXwtAIN5Cb~(U^R5NV(?0D1l@k0vS$EN=eTI+1muT}%l1pOaLFtdnf~cH~wRALvUT91J79n{w zIbq;xGV|cA2_`cJ(Bv(q9W?Mkb2Z_jf%L1S%28C;VNMOoP9FKHL|H0$=6xXLTz>d- zIoXgS`Z17xkxVXNI^T-R>3LMg2@R|hS5^5Yt+@U{o=_2c!zcrJX!nT6!CIXok?>6? z=Lfjh8z5jPa~)ku9bhad|M1uGS7wCYVIA)$ru#!qev)hHxy+Fpq>5#nEzda;Q^?2!CJoJ7KgkJ$5 z{(*fk#`zKmZ6JVKzC^B*TR!iPx$115T+FabMx#do8Sh~X`-KAfE@a3{B@|D~&k92( zxrxD->>fsQgDO-z(t3 zv}T#th^K`OB=nMCkY5+P4N$l(Be^$Qb09xx4fDo$HrC7xHOe~{6foyA36X$#UExZ2 z7tbq_WWW4ILG}>_+Ka>eDko0?T*=E4M8VZdz}k&6-I28XaE#6FP+%Bsmg6??)dbHO zjyqAAYcTgI34C?gOHp|Fh@3fbpo;*n*_vY&;!(aBERxd!q{(udY*Lem;51X^kphl2 z022&(od$0@>fo@<3}V4WcwH0^+>22(Vic8aazjp5HTB|vf0F9&=OYN1p$K~z(J)ZW zp++BsH>){# zx=@DA0~z$8f(?H-BUksxX^tG6Xu=8-bJ$jYk;hHgPali^iQjqB!Ya9ESRVHhvUpJb zoguu$GPgM+L$Ll4IV&ZPy{=V4=5{VAtv1kzQs;B7{zJw#uZoqNPgI?gM7BS3NRvD%N;(TeYGwCIsDl`q zwP}pX=ScfciE1)_q95T^)yT)=A{Q{%9mZd;fEnlU#oKanwn|Ed8RyHaW0}!?BQp|a zomlYI0rI`pi3yLFkj3(Qqn_$8s5kQ>27iu*{bzVKL?SuF8b1l5VRafis}X&d70k&W z2^kv!lXY^^66uy#zJ8~aZAL;$$g~*dQ#>jqEoepy{KsKIzf_CG`H7n&8M)#a($Ucg zc0Whvp_9D9e8$)d1(c)z#Ci+>*2*eJzR98~lg|!9fFR&rFJvAf5IT*merHZL=dhI0 z7-POe76E`S$-`shWAQe{6e($zS&dkafxle5L!ZfD$#Fm9#YA^!kZtOgc_H-aK+2qa zJOq#&8^{%1D`z%Jp!m9y@)Pr6M?Qwzh~*ifq@MxDNBKQ+^dPJdk*DzPi>)hTgL-IW}c*G&J5>^obVosDX$D-o&gnPOr)FwRba&f9=R}sk6H)A&!$TPia z`bJNaK;rRxo*W~OJo3W++GVn4mP8zurBptt8DB8Ymy3uPvLn}C@a+9pC*(JNc6kRH zgeno287HWL`;bY)m}^wl_htGd_QHO7-j)A!Qbt}gx`dOH}_mCk7CU?$IF^@dwAa)FC)XN^DtM33=x!Uo+b{7il8SM&&b~mspV_E^~gRE!JC- z7ba2~;%`#Dh;%$Y3d~liwlTx(+oP&YjKySgPkz^Cuxlm!q;F*S0jmZP@YsJMP8f%% zKmza_VqOrrxtNf$5Xbxqhq%M($4I{(-XK@Xd>>Lj>4!1Fgr>k5zT`?t4u@DM-s5nH z*9wq2KO>)W{S2l~YHevw=)TC_9?WY_Pj`~_ZHdRKh(DijRB^nLkH@M? zUO2c@{gW^&9cYy>*^rb!hB3{$^(Nybs?WVAW}%s%mJaUsF!PE*`FG5?PwsNaGdAGZAm&vQd3S9>z7k`RRc%nAL}Al=;;X3N zp4h-zoShlXq5sL^0`E?bumI$~;R!YpD=R1@|BQ37>N8XxnTA!5NKH_B@WiWFudBTg zYjA#qAJpi4Mzcg2^ruwOK2C0JcjU`s#J2g=qPR(_ypW+qCXL2!@*j(J|3=e`S^4zh z#~DyE$d-oWJ-IyUW8i_ONvhUR~nUx51>6_)v?u^=eFVi7bAe%zSGFNr3H zk){KIi)d`148%?x4Aze%eG(xNr5 ztmlnPG%)Jq#_a|Qzb&gDppk2zv4ptXXgj=v0Z#$a|Ms@s#n7rV{V~c_+DBj|YHp)*t zh;a<3~d* zdty2=qmf5_f|8=;GNoLCSs5EbPk%U2D}i=0gkl(K;KDNuLDl&LmGGtVvkgHJc>$S^ z3_65UL}?YSJYH>xX`Y;ykU&nF93TZ2+OJcOQt!zy!0?{!JljxFQl=-c+Y2byIIz(( z!*b8ERynQ)+lsJbrj{`|Cx0ai*pFpR(LKvu>qw_OSJ8UGkwnoIsZCXFdM%ukP(ykN(CwNhpXs!Dj-X^^<3)$0?y#)uVBXjx3$VAB0;SUy_3D%I3ble$ zk75P{w`UR>Oq0bm5MB{-Ly7zxd}ybFb_DGwApe$=x8;l=wo*=80)2V<>1F{GPI39I zB7#5}G~%gwnkGLZ1=5RVAde6!RZvbl782%=!56fqaY*npiGNLd?b1Aq2Cd~@bnhVh zg!Vg{53J7Zmv=YH6}?Th7;cC?%QZ>HC9G`d{!ECy8o1U zq`p%zhB+|mS!Uao)R^G?vbg-Xj>tU=rnkgY&)VU5k^8yIL%(eE1NS0SKNGmKZ)_U% zoCTWv%`zG5AJjp;(ETGB8R+SdUlllrl(mQ<7NV+pPp2;$0|x$8=ne^;ss)=;4Xqkw zsV3K9zEPre@D)6dSQT+IAa^4YqPq?exclYsWNVCbeI`Y|=+~&w#O>#6LA9aXvLt}7*%0>;i zu!caBalsIoASv0vUbI(us>}#WP-aYG|AvN0p;OL`%I(9E0OT0`g67~z=M7-5$xhy* zF$_4Z$;t6S>Z2jTil}Dgl^NLseoSNjLpfQkb1>=N(-Jv0h?zbf#PH4bge;3K@yl$8^SsT#l&LtP6Z%P(H%~7qgU|W`WOUfmLa4H%hagPybD( zAG^Tkym5i6V)B>tge7iE%01{Ieh-D15{j01{K0w|^@VSdQEQ;Gz|mOcRBwbQq13bR zte)IwMtFo!R|Mo}Z}CsXU>0c+40lL{ux@BBI(P z!0t*1rBHD5KQiH8W3O$DdkC43HKj&Q4hjQr8O9)h`K-oMSzR_gE_{D@(){Y-1 zZwkj&{k*vK8hN*)p{sJ~a*bR6$ih8kWD3n8T}Jr_Ot+a5HfowlBXy-!r(j;=kt=Y! zw};=33bAW*QH zTfV7*-KP_BB6VDoM_y|3$hmyhPZmz`7W?ys#r`GJc+G7?gQ23(yJbUD;`?8U*Wq<@ zj}aHXD#d1byH!`1my{n(v|-H*0>}6ns}*D@q>^vF!uXn|VJDe&P$M`sNN1DhZC@}( za1?JVW?_#9AC_b3Juu)`WZGLH!yJ~Z5qcyMOiW8?KiG<>oK&!e#>7!(dtT4P3UDbC zoL~!r6l_EgcK%J;y;_4dh<)3U=e?xhGz0@>@3O6|cUESl2AQUK=~o)72O(bzys+H~U7XshM`3#q0_kjA>xtA~ui?!c07 z_f!--V5klImwTHe>L+gLrl>?T5+Aq!WEv%9T8|VPxH*3EzPPqFk*_iGB8|qZ!~nepC*`&G4x|d z<^E#;TS;XFLtW(!H5HV5{h{8eL+xd#^Re>!oSb8f+(EjZGd|XF`U|~ju&bi7!VLDy z-e7mcfbR+Hr(QXsD3Q=pe7i zvNky*C+nMfy*{?YC}>!s4L_B`G3KNU^N*x#drT1z!L784pGZ4YJXUyyN3bE?aU@y?No)c$)rS1FTR z4zZj%jof_}!^C~CfHQ*faXbR!?ee6Z6JYceYzQWMIjc=HcfTwe&)plSMd{*g+=f6S2zmrZ32duie=(?M~ke77UNpPwHRFhHt789I#>kRKdjA87> z1XwGrlzfb!=s4!puZ5fqAa_ctmVkdFnr~^3Q4}*s2?b+KdHShwFVwm`&m&-tNN}sR zR|aHgG}c3t4QQL4u+Un1n1J8;g&rf`!mR&kwZyY+SJu&-=E3+`s{Iwq&*{kl;F-al zB+Pd;%I=)>v8Y>Uz!q4Z=1<@6kHlH}k}3-OYiRYeQ-8O&luirg?S zX&~z)@~X~>T6WN0poq45h1tp_RCmvUKx#+YDJb~b#+7TeNVnRD_Q$9#DYTm=NSQo} zCoa>NvYg1MCWA!q)9$q9%rd4;Ze$wN;$V)PROcj;mBb+yOu`5`3qzTh6zz$2(9f&o z2D0VlM26kfoI~67otfP3XJZ=*38Sl*agi3(SWRWQrw%r!+lC9+j2@%Rd4YMr$gI8Tu&RkWo1kcZVV=_OT~JL6Yjhp9R;LSPTG zO^V#In%@K1S^>6lW?Yive;)kqiZI<;lQ5{@{2+p)${iXlGl{0da?!rsy%G*CefCRR zC2%D|rJS`JaNEGCfL3iPcY{R5QMp#b{$bX!g)r`Oax|NhucJzBVUo0oH<_ZD!eONZ zdihp`BZV5g@5AUEmuPzj%M4Npznpdp%RicgHW(f=VQ3jx#LS-J6jOyH#%qXtWe&JjHwH zUy<@b&z~U5q*UTa6&TkYuCyl;eX^!T4=SAFErTM<0L$=5RG!JnlZq@uEEBnctG3nj z*$!qms)qyGhtLtPmgnX9D)Qv7Lspfk+&t#cMDs_ zk%s=HC-0(dhgIHXq;wj}qr|pZ>1Lv;Z5L@5c(1={Z}O2s zskSm-idH%8xaei8+?4bIDH_nffWfv*Y`Fj_XSt5%&&`D$-f0eKuXr}!@LDe(8D&%3f!1lT)E z^{3nxZz8xhn|+FG_qH0s%gI-U$zo38WAyt!R;)XHzQ5BaFgSHjugV@~u2V*3Q5LBD zu_{~BN4h08B+tJf-{$~;=cM%zRj!%sF&^wffEM0UTro z?DyLw=u{HNeA1+?=kORLN1RPL}Nd@)y54>miqQxVyxRw(@U328vAxkvrW)Fj1nGFl4Z=P=Nq1GMcYDVaV4d3})C!UL2NkGDaaI9; zhUK&F(`12XBWrDg96CkV;Vn( zDKSi=wbXn_@Hs(}o)8iQ$={vGHr;d+Puz!x4GyuYX9wxFh+y>j{g}&sOlLn%$x->z zkf4m_vnkI`~+$#iM&d36x>Rn&-Sf#o=jz(No0$!=?@uP2JtMHolA5rOfK{47L#qO45l5St1mH-ODAkVckEkx!x3 z#63?K3cZf00447?!1{GjBKZ{yps;$0Ard_lI9s;qmZ;Tz*_H2jR%fCf7ngQ5fIj9B zXMiG;20fu(jxw}8Z6>WHQi{Z}-Ehj;ntX6l2NXTGMs7+r`H?g;|0pDSR-4>I+hWtT z8jL)vb&;G>iuQ2Lti@C2kO67br@-ReMy#@xYwMNqP0n_zjRnO0%xsqUXA=|kfhm*EF32CXAOrwozuO?(U-~mZxC6e zCj=HCL1jjR-!=^`uBMake8%SJC*W?NheQd_dnuKdXbz{^!`_h;0->o@`Q z(^LjL=2RQ*j(@72TdC8S7ga_`j}aY>?(IVX__;L88PpP^-kuKLHeVcegG;n_-@hn)&~p-#DL4F24d*curg%7|iaKE5U%B;2mbo6lAGJ zldGgwqe<;sJnOJuZs%tR);}RrIRrNy@Nuct{Enn3bR9Is(EpEDtnssm@k zN9$VUvfOARv-+_-%cP7cCs^U7dMY-gF@zIC=ib{Bk73KlQ%rlc3MBq+4^2i+f+AUkMo>=A6d>It9_ASHxW<6dswmRz zi6UM=;h$kP8Ux+@#{?8;3`GTv;cWQ;t#_*0(6Sh$-dcpRTOuFB;)dwZ9+l>l{FE4{ zN;l@`Dlnv}LxiJhaJTBtu(mxhU?!MiTk26E_LrlpeVzI z9n;vNC=;Ur@ISW65BT{)JaL7;DG30pfU6^hQaGyIF`lPki*HKQR(2Ck@G!E|=r#Qc zDRr@0bUDK!ION!}R=KE#7T{0tUEE63@r_td4dUjN2ot$$H_HRjrWWkf_>@c{YMRG$ z0yvh_Q>0kBfQi;>7+X#Y+GxA1Fd6GOiB$XH#PY*@7^|9z$<)h9!}koTke8>?clgtM z!k^~)d@wO0A2*TuNAs;#CKpelgr11;Wwrd49O&*~=r~y@FP#+aY2B{VotTfUj;Y^$ z)s-^_QBE$_{HTcR(kMvmZUu1iBK>@nWcl1to}5 z9pVswmh$Ibd8tRv0aBQunYeDTmz#1chLnyo=f@3(W~Ft6rSR{?c&9)0A5Gk0enh*! zUy?)?`+G{t0d%tX$-M+u{jDwdq?}FeQXOk@pfHW+LsB2l5x8m-Q>40lWvjmy?0s>o zR2O#Nl-xW*-7qXsU5iU+`QfHCJG)ttaH2;f=Kl~N$eqZMuYz4 zH=GWFrbaF7Y%Et&dUu-p0^qPVc{?V)L3YQ~%AKs9-;@uqWg~EA8FdAin2?#h^3Rf& zU;$OK!(^jeRl+O>8T*(-n{koHNsCAjc$jbKzt{%?ff5xew9-)kXU@aWdr3*#`DAv&S>&v~Xg}y_RC@c`y@2^~SDs?Sx&0-D zr7SoUGeKfI&3Q<&cMWajxpOwLcRxBcAa8e&$2s7E48>G0?S$)64pBmMLe(5Ly<|ew zT#7k;qz!2CeBm5Z=Fku^G=r(c8-GQW=S0oPeTA{DypSD~aoYjOV7_*Kxv8D+$9xNJ zy~UsC!eb_?wev}`8SFFZQRz5-zlF}mT`3Dgd-Zrz=`}pshi~73B?OxN+?C6h^~q&5 zoW_dCGp1)mW20N-*a(rVV3Z`S)Le0%btHu?yCa3k|e`SyaKm2R~tD!dPz=% zng2~z*RVt*5bwGep{mS(kb8|V>-S&wEc))<7imX9XqrTb4V5*nP!JDfv6~VMd%%Q; z&r3Ps;TJ%q@kC%|j+OhQuxMq7_mkB!quuFlIr|0qYatuB#HA%%E>6?}Wm6=95@VnY zeO2@Xk28>;_yHnfowyc+alLO;_sSJUQlwCWCukn96lMHTdHo_;t?}^r1RgDEIz$w; z0kuF9NUBm>f0ZT?h3y~f8NQ)G?f0Cc!on+>0+qZeKGDpNKg>05g!Fb&=nB0d!-xRS z7)YB+l!YC1n716ZsoK)KP;jZ$wkk0U90kUejdcg#WvjL6=Ckv|S&mt*DM)00rmTfq6}G*Zm?My?0ACg^=teb>G+kK<923u2NI2(c!^FaNL`bF7k`FUY4%^vn{Nvs-M3CPC4hmjjU; z$wGi!@02M*3)vHGV+e6I_)8ViW-J3~jzVd#4$Gehu>*N$4OSZ>ktrDcLm2&6lJa;? z_QeoF?vnp56n=amWV$gyV$&pHvnnC~;IQB?%jJI^x{B8Jm|`lsA8#J__i`s*kU)aP z@~1JAOooOf)vwFp3CgYhYJ3niLJ{5bco2OiaUnCV~&?EqigZ58ks&QS9`q1 z_dd)@Jb=C4o|EsWA6zKUssE2FLQ`2-y$>LS7=Zks3-KFVJc{sl7T<29xMDm3NvQ2P zT?{XRb;=12#s#5Q$1v64FvqlXsD3PWjlUN6_-nDz3u9IO_~D@Pm1<&S0uxq&VJy=7 zVkRp9WVka%7BFpa$5;c8F6P|8kP$=h3e|!t@kA$fzNZEKfthX`m2jW5)DX{TpVK6{ z+2ku*nd6fw>Bz}*8pXXRUrwTa;+n#Is#*W<8V;DG7E$Lr$TTAiehPK2K=C6CO=sWPrs}7O zX^bMs={fR@VOcQHj~kFU#=HV(sE^V@IVkLx)RKcowD9@9lw4h#Y?aM5N!H>#mbA@F zTRy|Cf6~!YYTq>B`+Ma+!gseRS*IeXs=X>18{|*+bTcj8_J`!5svda;bk^v-*P!2R zMh`IEaZ{Z<^eNYU!;jrx=cH2}{00oy{TCykUiR4IxSKilC?DW%E7?*b=f$BmFHvSOSCA=V zfYOkY#W_t_euB%panI7BI@LaB;PN5Ol`(Y8#;-Q)1%3Yw0J>6sVgR4BtNM9AB`xRF zlmfmvusKD3!>lt|rXN+0_oCSM`c|&T`gDW65+WWySw_KpW8|wSA&tBG1hGKn&P=by zuC&rl@*yv{XNXF-I>;6c-ILwwf*T^m=6to!T4@QuJ4n&tRK1fdAf{tk9!D zd!%2%KOf=T%Dm$Us;c|8%Yqh8F263XmqYO{vk-`di8mYWMO7Fz|olB&RpycUMP;2dST$9j6gk`$m>!^vrrgnl|9294Ga0 z4UcDxqX{)1EuOLAQHm^dK(?9=NYenvXNjgbujX|?7I`%m(*gM|HZGFyfUF>nnM;`C z=sko*Cr6MEOj&oILp-5kAeY|(dl7U~Q)!9j_<2%i_F@*fvm!3KXVg!fVYNG15rBqq zjq1e6!t^G$Kk=uLKf8%pPLeZmKSRWX*uMW2`*sM*Xxqgn{GjU(eYt$u>wUf%e%Lod zPm~L{Ft$r%@-X&PnU#v1yxgrLpoQr#t{n8BXHk+p33vjQo6@$aaLgpkTFx!rBU6u< zeA#p{QG`(BIel2JA-iamt2pvANcGfmF5LLxk@bAg@s)#F=68$-;#uSQi2>i*HA=Do|uq}#l^^%W6+R;@l_XRQO$7D*s z40spXwHXv@W*0R0Y*5Y_VWnrwYQ4_x3P08~a=T8t3C>ll-LHWc?F(dZAt|ry$Rpi329- zeTzXbH=1^vI!NM6EYK`DTb(e}O^d(8p15VThM0&r<|?-N%=3T`w@*pYcCKPO6?9Vt zb{YLuDiN3~C`Tx>9Mr;E2&Dkm3!8qP7^AzqgB_PATsdSmoGwm+Z1%iNs-fAe>3mYj zUBa`1&mtLAVl+(Nb@o`vXol>a&_*6*48bH2&fE;ky9qXu6o&olpYmRf&N zi@09P%2wat?wQuIC1R@aNM>J)ql+N!`0iSXg$T)C&ZRj%lT5l!x=z|cC)1XuY^G%!_9;tk5g}!fAfTZjOi^S&!GNF%C>Bsji%MA3X;}=5 z7&hNfwh2{Q{7 zK$D>8`5w1~55~aP7;%(jRl&9p*>|-stxitaFR3$R?2IJYL9N~6(u^@F==irtlvtiv z7*d>h!BrQ@G2(8VQKB}w`x=pTw{wnMb(7p%Jqw6Zwr7gI&N9O;G6-XX&ILKQZ@EZw zOF1F>wcxG?P{$&OvMEX_$t8u4S?ZgExm`JWvz?c*NAGfN3>4G=YjX=jO$iLV$+a;c zItZgCAVg){B0|NA{l}a3my>p99PRN`C?CBGq2`{b?N0`+5zf)}>2=Tt!j6EcDN3xA zr7=}1>mJIAHgQ9oZ;(chvUF1rT`8T*kNMj9XvvE+*R<{afiwSxO(=Tv^8$hYh4Yrc zCxps9&Q2MCY;~yON_O-HMTnp$YhS|Z5HxUJ;JJCDV}eI7#Jh1sJ#e1@D@GAz+t6aS zkv|}*0@~TO<4{{OeJ5XWNOCr6B;!W-N6_wzVm4H;pGCTtqiuZv$%L1kYTA68IV8hw zUZOd?4!qtuwp#l@=3v)*l#{@h1=KfO(I^@SVGktx#ewW6$&)Pd4IJMHWIqH?BH0fQ zWFNMl7PAI|SJ0H?TT!dfvSSe*#sO@s=K^*%!oG5X) z$Ifh|GiZQMaguA&sKB*vpR#ugwmWvMK_g(JliW)CD$w&7dR}SNT|gLaeJn;9V2naJ z#;7U77^ji~m0=9kBX@8pqak7ypp0c(VSU}u{0LeSv#)|Nsu^+(>G@MJ!*%S3E7+3` z-(P-+*X!w<3j8X*ztdW_ftU`!WS;SI(EY&jNOXu4Jt`gaV;BY zg&dU&QEq#1DZ2%iaVeK(GXO%eI>TYGV zwOKnp%;;LUo7h77@gkssN_$~JH~Tp$(`xRA-a)V~nb!hP(r<9`iv_O^1M0Q~#12i; z6*9(%c%9b+UI%Nr+%5;CoC`~Es3Y?n(Ek{-QwtEq-xd^aVs@RQFu%xAR#?y~eSUBP zCj}?q0T$#=YYFFnNerg*x}VT1SW({|vlx{sE>T;@VZfcX8A|8GWw~0L*pV5aixyPWm1B0&bweFO9wN{E zwjbLM5G8N@?1%nEA0%JT5h3}`pBL2xcciN_Dj%JkDWsaI8KZy zQd#Rbf-k3N2xi+5yv1~ibTkAnQSf1PC#0TL@qIJ|Tiwb8&iXC>`!fH%uH`<|1+B~D zs<>75HT&S>%HOU4rOHeKp`UZC#Z1Rz`SSNq9FaMXU@vgtT=1~M?XLtbHmB{bAn=6l z_y4jsqmW%S3QRpmYplqt?OZzpF8FYnIa#fky=4(QgFaY55-r0?&ac|8_2Flb+R}*a z)28a{328ygU)U3bpAP729GwGJiqz^ZCHf*~mX0UtkPY@mw#k;l6X3MP;#tBMWhTt! zB9M6&K5ow-^n9Vh^6tiC4pP5J8$~Ifbq;P5sy+cr+}e|45mpDMu(E%neHgTby3iXL zCPLN@h`|iVTtj}eY-Z(szqIYMLCC#|iqTi1>Qy;Y*W$a&cUrw=k$jjC;L9sBxZihDDj4ja@wu&|6P*`&hK7t5jD*KZ1&L ztz}7MfomAyat?uo)S$`)xTPZ4HT+N&zb2W-1H6wLs<8Vo$7`Y29oOO-Gg^IG%V-W) z)9AW8cWsV{XyLyRamy3<8UZ41}B;G zA({4=OJi5jnJhBRqk9?PuQ9-uQlZR+*z%6_iizxFC$>8AteOxb>5f+m5pfk3W63^h zAo_+AEo{I(vkgOg%PvkM+4hunbBq*~y02$Wz{p(t^&V=!K3(GNihJEkT=**I_nckW zox<))@rBU??`luOmrdulIH)_$rLld~=z9nHVW*y!CD$d!MSyv&`1vKsn2FIEgsq{aT%1&3TqD}2i<}t zj+O$vZC`JZdpUwGIP(8OUulcF;!8a2Ja-qnBke`>H8aF^HPF!ZRpK5* z&gV~b*A?`PCkxo#A6{2dv)*oQ3x>=begw{J98#Ms8I6!+zdE!l;fh67Jk=LlwFdau z7UQ;0#$_q0Y@rfhnW&blyw})m7f=t0(=rmWbK4`$2JUZH)=4^|_z8Oq7n>KLfSx0p z8?mV_rRj}8l}goj#Dw2(VBONgD9B#?SBQi_3QY0XUC*&MzXE3k?2q_|7T8vS2g_SN zhjEjLI1l!n;L0xxuKak1pvT~@YxzAmv9Y!uC*}^}4YKzjz?L`*8{@FlSU{9?0A&_> zuFl%{jFf$YJ%Oq($db~lI`;V?YrqxrVuuzB~gnaJ4buZ1aTG-6kkPx$L*NP ze7o&Xp32|m{MrdLTgtC_(gv=3nBlNIpR|`v$=R4p|K@(ZpmK{?o85^w;|Wo=FCn(j z--kH+_1nUn#pn`fW;6lNDH{lToLcz@Q(bZRY?215Anq70Ok#mGOuZ`33RS-au-YSq zjgA=Ll9IvERQ=N>Y&oL|o7o;)09tVnBvVcoKIG`GwM{$mVpQEP08@c-=nyRr{xPfKpJ4|=#crwZc*t5YGo z>~&s%zzUhZdHtdV!dJX$uy!N0$kE>Aapyk*QC<_V7r|8Bc2N=utI2_U2p_a>^{Jid zhuyR@;qG^Ud!1Ye(nojyq;UYtm_@pFcK4s9Fn+yV-;js${-Pb8Qc^k1bF)FC4{#b1 zCQ`AZGT%zHImXBSW3VFEPOAc$+oHe(4sd-<&+|D#SiV4{nARcnud*9853r^@g|hJ} zE)z8!=f|z+kF6xUx$e<1o&1Rl+)-O|h*jja5|j_-jTH}EzD3FmutDhgNI%ROyc-+g zgCz4;?e_RlLeR>VM`{0Kj4tqjW`4+b)cC=rPa~thjSD`^aTtB@vWb9}W%Q$d2>L=D zO$^zn9(1*h@~mv9gOEBkv9cV=;Dv*HfedPqlBV$}Pkp4%_FdV*kDqPHHa=vI73AsB z^zyuk1)>2Z{ik~@mL=uTs3-gdqH>}P=a139th#yMsOo&wm6&PQO&6lJF8$# zdpUaGGq|o?ar{%jSsizdu^Q~+b8&Opq?7M!!2bR~fWX6$H2a=3g08TR#t3?*?w%<1!$C$O-n5-kc45H|k9VIO zp$_*DmAp0_`$X1GHo3s2Mqz?l*HVlHk>^=7BKP}yZjgvq8mCjMu*($vG#zeTWYw=E zZ$&$tSXCh;t1b`3{Wh%>64%$blLhQ?4-RQO!TgBOtLKBp4}d8>TmaKJw_gIL?XgnF z|JqGK$pr!3psPyUA}XV4t=5B??PQ>Ez;5i;lUcg-6A*uC%FZs>84b(1#0OFxKB^<% zSjjJvGETf7Wj!b;>0~fGN?qgY9M*a8$%}OcAICDMGNCG`j&NdU7jOvp^uO7tT*wn# z5uCv_!5R3r7tUa+ofRUu;{p}mwp%(Jy0$T{k#;8JcN$Xjv&&|MLBXutY8hO7% zmOak?(m}`B_k-JrLY7D){Vs8wP^;Y(-o~)n4sbXwcSZbd*VI(h?>D)E&#WA|96R%) zZ!xMkxB;9W|NIh01BdJ@z{~FdrXwAvc07$Gfu>K(;{4yTZ??D$>3IjHOL@fDa&cvW zpo+~zVJ7v!$%^b)N*o8Ei>VvVso-Sv&$jMOT+FEuhjiHgNtKV&~|T4CQ! z(!IvcJ*RRqxM%InLGJc%1zS}(qlJXv0f>o_u-yuSgLuUPB3++SY_ZBVigN=tP*0I} zqnu~TPD!_t68bgqV*w=*>reo#mSgI*16>(ph35GE&_$iA_nd@yh)Ht+zYhp~j8);{ zRCYd-A3p)9pYnD07p$RsWZ14~b8M_?U(I<{y|}~lrkw4N;;;Abl=)`dyOK$}1hk}%AiN~>U=0cWSLe-OV9Gm0vjtfdWzrZ6$z zB~+*LF{O-xsRP$}cQiJxBUs@yAGvCvKpSxQS_wlHdB`#abYqeok|}gks~yLzv8@09 zTfI=xj5C{A*=Lovox|@I&Wb9*n3T};1J&>gDF|63E?{Mn+GGuPBz!qM$a#&}gS4R* z?CEok=e~z9ixsE@y5lBx^jeDMLR1RJ$FxxcJ>K@IW2Wd%XzzoNuQMGg1^9Bl#jgCU z5ws`RK{(X`eing+z69`QMa8f>6F1667InKU>lz2F=i^OU%78VoXretjAk|jS*_@s^NTgmXO|NF}1Yon(E)%6duO71j zV)Mi+97&%0n9X_LPNhiEi#p`vJX%(dVpF1^*DPYIx>)DNzyEjEZHH#m_6P8yyV`>P zLZzIl6~%Q#VthYuDf$j9&`6Hhg<1Hb`079<&JR=~tqS*2X2v8v6wYW^n2_=CFVWNdB4K&3*FU&R#BR{?F+#s;*JS`hx)Y=9(a7U zT->Vyajy@=Jwz5T%rfFjteqayqbv~?{XaHnM*@vK`)Z7~i%^ZJ>g1DWE{`1q+*lf; zupY7ekX_K2u`As5P5_PowO-G2+VA3*KCpurmUz;hh!o{TDJOvnr07q{=~deAkalN$ z!&}-Cy^Os3fRv2{5zf7mfH?)7EemyI;pO%PP_w06+8+hdJ{w58$Vp31V@F8hAF9Q! z%&h-U;Vr(m)woR+sPyO+PFfA3HLYB@QFO^qBK9ikoU!jq-evaJB{&b=aQSe^>3%q* zu530WeoOgah;wVG&v>l*UGn=~6Iy>8I{8*lmqe3T?f9|BvJ%<0pe0^SZhZ2ge z?~D5Tt<(;d0l9Pa^GwzKR*^Zb3{do;PS`H;PkC~Gvm?%1U1A56(nF3Fvu(j_9S!JE zGt_7GY9hBC8o*{~AYtZ19A2!~#@9ez?K59m#wisZ*8>$tqwP1n+Epcc{gqgE4s!^;E>1>@du4dk{My zKCcdRcsdYVlKLtt{yA!^!&`k+d6Hv1d~Ky*%_zBwD;4#d)w|-B0#yTh*IH%P#yYWG z(;(KQ?zGRUf6CMhxxv}{`P$Qc+R>GC3G6-Chb|boTadOurcQ#A?3To%6-qIv9Qyp< z@!IocwCnQpcEf{&Rf}tb>wP%bBUDy5ykQWW#el3tE+<9?4*LN3pa+V&{6Td&(UL-B-&;fvX z!=#v;4Tdk$-ioiD>)Ir!?Ysk^VR-WsC;?u(wMf0&r^GoZC0XU1b>7~N6hc~{#+mco z1V$@BrRSeX`JA2_e&6L6(U7ajZ_->ktIdkRZrl??`LJI{#(z8_R#0}F}17NRLDu<&X;-6DVa>SC;6ZNmGZCpNO z`xdR@cVYR`y`sR+2s0I4P*{@}ZmEtj^fkS*H-;~udlq*nchKC}Yn46yeYR#Wl25eS zkCN;i!QFdrkb%jq9|KxJEJ3pj(z_$}0ZBBT`Z_fXXs!;W+^zFbcn z-xGg82T7U3ZwVd#_=Qa44D&OczaQiL{UWTiV%XPhZwoH}f57)8(ed}A0WogEad-7m z%)=k7EBApS=3#zGeM089-C`@fGoWX2u%kYss%Dz^PUDG845xn=S1>q|$l8y2;Ecas z=S5elPK)M1uR1i3-icVYoQ9UiBzZ3IgmMJ@VtB!38;mPA1Keo`B0E$ec3uOv!NYvb zUA>5YK(TcHV7FC5h)oHa1|o7Y>l!7O{+;+-ApG~}k(cm6wL=3i8V8G8E2@81+Rhb* z@g2zmK#cO*EH}B#{M+6GL1!vPKQ@B{b@M-q?A3m}AC;a1>?>*eej{q|6DCdvU|oy; zpN;JHjkZ{!Mc)7PZBkNYVi4*41Wo=aBdzLbFP{Umxv&oLl`Dxxp2pbjZ)y>b;4{|x9$KM@`YQz?5A;!%SI#j5Gb=%cR zdIX}jcafer3WGlldg9cAIAIL_3*34e-4r1|F-r^9oX+F_t9oSbyZW)uYned4j$~}H zy?szUb5EDGG(6MzommCpd80iZm;cg(iOvw7Jy`$@o?&e!1e)yq&1(!=o}{dPlkQDcu? zlgy$XT2BEXGw4bn52b8HVU|7PihJ|yS73OI-XlGAPHA;R6_F$AYTbT!17$1wN5fEr z>OPf7TdyLBp0jJAAP_*H`a0K@KM!^8hRLd`7}h#j<=~;&AK{$+Yg#GjIEZCV1t4Tb ztT7CDlS*Yhm%M!P_#enJJc1sLB}{NRs%vcc95zso9mXbVA;)VGdgUsK`q#Q#RZt^R zAXS}B+`F9Q{1B%An+f}+>>L5eR-rW_c4Zg9SK0ZcK*#ykwQ_J^CGp|_HULd^Vp(oFExOPxY(bahGF8I+ygBvF|aVQ&%_)`55bf&HMN z8*hJ+>bdJvVSavjF|3nQx_Q4r`TCejU*t5O*QE0z-ypcyT5OV=?^EZ>6lF7mUGcn}nOnpnV?K?N=8WK4w`s$#_xTLSZ5o$)30IoS z(_}b?5bm*SPjI6R0emSA_l<%E&U;_>A*(n7H||VXIPqv7%(TfY-(knXtreYFbq{P4 zIDPDw)f3d*Gbax8D@(3TMS9;GA7zQD#{bIK9l~~@Zkx3?qq^nXL@;w9V&WtRRDV!LOxzmW z^gY2%`?|GKr_?tKoD9r_$}L& z6gBkE#gr@pAjjv*OVx6(RBOlagNRQ)7rDKt)2BHv&~-5LX8|tZJ}qA&3Pog1{yy(`dONqBbk7GO7jtGD3g8N4x>iB#D=Ugm$9{E zBmzqzAu$(3HWsn>{X7d&o!qlj8Bi+D>1;#U}kQb%^kIq!p~tz||<_JS1Uv z>%N1@NP**+ho-O+K$}Ybhz}TN+O5=YJ1Pxd6xj0}!M*QJE}-b-H~&s4@EN;^(5DsO z(45g)+t9%;iD$6EnUN00sRCBwP)b%h20HeJVD1yZ)QxC-OzUAWb2yq<~kz(!7#{U#sd$ zq{v7Q;opzcv(;|_JxNQka?ZkAc_N@$$wyr>?#Je?;>T1}w!>go57?sn-Ky(f1;>yL zj=_%?k*17?fkX_4PbU{CNL+e?L#4kRjyI3y=QLlm(Q4ZNh5BrvXw_@6`1O(iU5v%@u5@1s-xXcAtoc`6%k&U{i)X5n(kBqRhvo zZ*8D0;Gb!&$LFkQ8eV_LJ+EwL-wN2H`_4@7_9fC{R!UM0Z&DP9@R^!db5x#(8pI@fdcLi#_HBjp!u|Cb3LZq@u<&tdx=)N%l6`yle)bk{t z(`aD$+QAi0Hn$^h8jJ_cp+AbWq{%c^*e{ay)n+iH(`FGY?<4Ugm^jyZqx@Rp)6fEK zC5#eMtxQ0VbfMB&tARt$UIskz0@w1=!0&w{X~?PZz6@O-r;ZZY zFxlzy6Xk0)_{HQ{%#h?!g*}aq#YwhqWrs{!dxn4OWvBYt94Q$8KbnW7r#29KR17;F zmr+_IALf^>ic!8PVwa~!284rqoF;$2q{-JK^2@2&b~}^xQss4+a#59CH?5w+n<|$c z={l@yfKI-j_NVJp(0PrZozj%`3bCriKuIMAYfC53ieGGxkh{X)P-!T>0Q;sM>VKvm^w{>rz+iy^N zlH+327606I4Fi?O;Z2VNiFUdbT0vVw*(MdCQo8!*l5MD47`#GuSr>K-i#w-j9Gt)b z9J$2a5O;oS5`k;&X-6hW!B0SZy_k5mQ0GUu?0uD2hV4FdR0^myaLY)q$2&Vvi>qv% zM!biCX^YFr)AA&%26O;_TJVL0%UnU_T>ic+r4$4o53nsJl(g%D!}I)`8Q?$%)3nBK zK-zt=qR(Rf{W#I4wv^}ptTNzDyRG&n?m{Aza9TK1u8Fh*au5`udk#6Txxbq!J*?z5p+4EGpQoQof zO@yAWIOVX4=TK_u2~?;V-nPPC$7OfHRJh@@0IKj7DpJ3ULLLDF5)!8kZG2g)db%FA zDLMZBWVMOsx%Oc0&~P*epFWvK_MTzn5+pilmM zYgRPk?MYfUYV6gLg|DYW?K3G=kZ@?QXiqavnGTz2Gpq2e4SxO*k<S1n@T@MeU3Nud>!Lq2a0|T>G@~%_LqGodWu9b5K@w0(J30?cQy7*I|f%p+-DQ;ZC`>*lcu{@V@lM?V{W~t+Bw3G z9UdKWIrg!6ZOd|nk&3Wf*sTf~<-+}=(smk`)&(W;CG>UlMC{w-1VpPIyCbQ0#xE^h z_6=O!OH@7!AOpPlVchk$-kjYjG#CbD5_F2#z1Y_be~XLQ-FAmg2|A}y`j#R#t6mVD zUf`}3yk{`kC%)`C4jy=Zl-nG)4j-ps+n?$H%C38E0h>LwNSvNS(KNX4|3;j)mw>5_ zx{2=yEZ%|ARvy(Ivbz`b*sqc{v6)1+$TQrDqOamPt%BW*?AwE9o=mkUEpvMgR@v0^ zRVZ!It!q&rH{mep&p9QYMIsR`NXxS@;sI6amK<=GdXD01r{2G|QMoV;9SofMw}@Y# zt&lxt`JALWwSda5Oz^1vHfZqp8%lm39pdPfzURcUKhiyyz+)0svbk1JvvVV5*qZVgveOv32G}_%x z8Q~y#a|JTJOi^T0AVpoDbU=zy3KJ3q=s0TFW6}K_X4#o`^P)E&9&s7RC9<1O8Y311 zE@o7bY5f;x8(`E-+r-4bFm?77MhP;=nY z>1XWJTQ0Ek++d%l86FJo_l3Zs144ygP66N&`zk$njm~d5(ky`!#Gv(xSgv3B=dl~< zcN4oHnOAReX(e7;ZwXCJ60ND&+mD7Q*>SaZ>1vl*GD8|0+qPfn0{mCrwq0iHR=s_v zOWN#r*%Gy2k2>1zhCHe8?mPlfG~sw_qPd7tg6=ytERkQ6R|YlSAZl%Jw|fiOrf%0a zEG5|CM{AAmTlx{c$HnVo(spN~-U%;bzzK#+`K2yyAG{{mSR7lzn&UHM!K5C?64^Wy z=fa<6E06PGcQ+1_KKNC4Sr@l&fuk|oG_XMR7d)sZ5I)UF-i`}0QTu7s zzOaN=Mfo?JLjdE*DO>J;>*RLh!nS0vzXPyn|hq_p|+7<_;m z2GVl+e-7CM-T$w7fvAaw72oQ`-)V6I{VtCc>{N%_oj#j&HUK%|0IRoo*L0Cld_bb0o^W(>OrYnHJbmr zy^y8BB~8b60{wt@0I$1Z=U@lNdYsxEzHQ&8rpbn*)YTu6zzZUl(LS~S{w7tb1Y*c`xm#`@&25C{n)J5Mj5P6ylAk-+!Z@-@;iU|eCPVEwyUAr28mJ&0e&eCASn2XUb=us z#7@=p>1ece@W4jY;P0j$EXBY zmZ{0>>jhB>ju(J^=)_O?@JM%FZ;hsLpTcN1Hwl$qPGgg?@a7J zBZ5jbcR05nweK;8!gOZ}1ivn6T^WYgQ~(~1p#N{$*HT<9ua7ya{~NW2j<^m(3sY9L zs<$%Iwa~S^)a11P*rWG-iG52|IexoUFQJ5V3^!jAejaJdgL3*+0+5LBIGGC_Co=(P zQh}l@)8gGL{9k<;hXyUAwh6**RMIPHIKZ6@31 z9!`al;nLCGnXEbHGepYVuTjsaT_ajTq|9CINWRs6(`w&$oXjk_db%8f4ws%L%&#(L zy&Mj#TMxNPGfeNd8(7|mb6A8r++|gZ@J2bz9ce9VI4V&Ad0WAUXYL9tS5`mf-| zAI5{o%lR9hTHqgbh)bT%2y@PZo&B+Lo_eZ>n?Pnjz<5hYY}?++jcx}~{syb>%z1>z3NUlRwsPPxs#T=y?gL)gU~*6hk$w4ywws+|Hn~heV#?lT_0d2Y+!o837qi5Xv3=qy!?06pH$9-<2&Fly4Vf_`&JnjR> zT&1jau+!MRjMLLDgDFY&B}5>aD(zudxr{yNQW&`-ygmMI4q41^S%h_{%VPeJ^8RjF zRI_K3)Nmt<$KCy%;vxSzcXtoH?Th(u6_971eY%v&Y$#?je0~jjPc3Ma7FOrAzyf!7 zH6K{C_&)@Pa0(2E?tk0oabP8aJy`!GU8kj)vZ33Jq(_xV*Xu*S7lX-;eMTM+<=-c5 z&o;~9Jp}QJ=`!Yz?qdVhWbJR-iZ;D-^{upcna|+N@G0;1LF2na_@KgY&WE*!mJ+W7HNR={}BIFD!y(udOOK3ro-oT+dhHaje?Nk^>g{0(> z!MgWbQ`EC7TQc_WbbCGyx+%_hFR-`v*0$qDy#1AojKWeBypNOii`R9W^GHZXa@Tj* z9jz@`{ufw{gy2D_FJJ1dh5&Gl#(Xo*$=}407lF-_T)D`|&9p*t<$~kdY6^6$rD04j zh>j;~oXanH+!{JY?8=qhZD@U4kk+=@ejFf&b|9V2sP4hC_i&9@=05)MZiVcB2C2q34hvBu-mkg@<@A}+ir7*!S@mQX1aXG zx%@h(2JiUB=96rBGsx#FNK_f(p0a{V9Vw5ugMy0bar@An$!>fEXAC27^XTZCPGj~hVlS_oN9^eDkLfgsSZUu+9b4;hJxC1UT)%>+>ZAz z@TNzE0EIW~PZHjW`|bt&?%)h=%&JA?w=J@T>14gAL)ssL>v|GnFjeGy3!wl3a0WZz zuGp3J!b*~oL(zyPe+b#2q)zTJri!b=6g0B3lE~MQ@6~1jPuM-@2)iFaipT+Ya&lCg zjTyEEIlCizh+XO-IA7cyLB>JeGG1QHhOm!+EFE5B9F`5g24lzRLD@}#&zK0ksr?9F zaXrS^ zuyZnP9Eh7l^)DYr)~r&azl~S3;a;2iQ1U%&?~QRh$?F?7M|$}<9AjOW{vYM7p`KpL z2>N8})AnH_kMt@ih>gK*`)07|DfWtNu}_J?ycPzt4HTSlQK5p^G&LQD1Xo$!3FQCt zC23lb-UA6PDsv2A?%+6Jdyu5~zRS%n9L&Nw7Jb7|a2T&xyVC~O??=4Ql>QL|!`=)C zxerPahzaqCPki&@d7ApWVe9wSBJf_w>Ux%=lsSNK%3~vyPeMV)e&ZL~j1dYdpq=Zm zhLdr%Nlg)@J-dqM}uGK&81?!f=8 zm;aOT&$bPzxaVz`@OyV`a>vO;ii%U!JxCAX^CnJjKL4G>1k|xiN^BRjdS^GZz}}v} z?M}9HKXObL7Vx+_i-Ja9KeBdG&`jX%f3CWSw#Nh}rmQstfE}t)q=fua5HUE$xSX}$ z44Dl3o5l0t`moTk_>JWe8pKH3Fo~0g>_QE6{4U8^1N_xPB=D5R2SYVjpX) zfDabYHOk=f!48{yT%Na?4U5Y2j(0|{?rwT4i>&o;N{e}2W4Fo;oXi+Iw7)=VutUG4 z*JfhTEt?;K;EAqQd4~A!J>LZT5`gf|HIQ2e+m^Joq4VALC}|FE`~8uyJMOF8;N43! z%`>2x182iBg%&&c;XiX#sQwM6j@u20(?GWPQQRq}R@ z;@q|0_Fb#g#64@&%{<4Y_!mAW5<4QMM$maFI|IRyV8CtL9rp`B?*!MEroOre`Rx!r`^5 zSjlke_GEeOWE{%y!*bk8XYwyFP9mZGtTF!}Zod`9aYS*o&Hu9zvfi=y46v}WjXza{ zr%`Gp$G-`wKeL3s5mf#6Nyc@mi?f=81lKp!fAsx=t)Lh36dFJaKHL?pj zvh%5~AtTr6<5(W5!>KRA;T@QQHm52roEvV!9GA2yU=98d(~jGY4%$3f5v;U!rm?ldz7_#9 zf3~8p*E&6;u4H(j$FrWuv z=1+6p0e>IQBVUN>0Q7Z1)rwP4znHuJiaacku0I6zn}UN_9NfQK>LfPP(|JGV^2-~( zv915ReSAW!M*vs!Wr*p=@FhO7tLcQ{4c>0T>RGpK&$w;-k0(*xs2u>ZflE@$&AtS< z?e&oP%H?3gM+I&Z9@oI+&u9AFdN~S0gB0Ky=$tF`e)R|3s{nnd0L7jvLSpUgA@NkO zAY<(z4{QEo^=-Duzn<|`7vAo}->~*LYU_dBGNea9@9-yM?JN$zf#2RV(5=(3L)enq zSidIiMphMjm{~29W>!7CM?kUoXXgVeP?Dz7rP8`K8ml8jJbQu+e}Ib(JpkwOmd&9w zfHB0omg96DB+JDFd^x&1?`jx$0N!<$o8MD4JT9@3PP9w-jm-%PnSl%NeeccQ3Yf&N ziP?;S0ZF@pT~f17|2Wh^>%uj z2erOJT`|0o11f*dt+?2#X0?sV4saAoa6pMvv6A?JPut&ytkB%TmpqxYWpS{W<1)FU zbM39clzq1_LXJN}jBbGHka+TCU}}Wq>YJ6~yWX35qBHA>@gH&`ho^>|6{zjR*?^C9 zz}nip?+x#8KK~5NRMdu_SbR0m{FlApL00FIn(wGLd^AVPvSKd!fR+5tv6f{pUWIES zJ^5W5KZFj-wAA3>MBHYt>Bb1!@mCgeJ;If%)@%aaoe^v9NX(D*_wjU@4GplkrjfSk zW_*mJca+keg$nMpUgFy;s$yQp^|!@cpob430Eo|?9_dmHsKt|Z_&p5uz`G}LC!Yq> z^JBaNB&iSXek_o~!JC3F-!QsVnWyv>?FjeRy%t>kbO(bXTxVShte&~!UG zz&Pve(Kh>q_l16=$|sDlhm-q(GwkFy;YNyejVX!+eo@0e;mm|{pGq=X62^X=1Ztpa z?-d12c>(pVLlp{Ty_FM4a-$8RG3UMqmR?5bQ8 zJ%667?^}Pvqu-<7F5+N9of?on!Y3U|JdRXs=P==YHa1eU z7nYmhCO(A!5>WD4pm4$rYsWz_&uLS0{M;34RGU+(0;vk|vAvd~npdhR6IeL5)j5b? z!2kP2ON)nW&jEf3%eEmH_|qq_L-buN=w!^~@Lro!u#>yaXrWC|Jv({#>U)#8tSQ#e z+bj~al3&$9uC~cG)${YNVt4ZbHeQPb40n)Cj0m?}Ot>0EY8Ic`yMqnT-#dw2@H@z| z4j4}4OC_&=1Oi~lvkNxYP7mCYG@&NVi4xTwJQRkL^PP1`SF*A?s}=MQGV zw-z)*B88V{ggK1q7_!`Y9#?QM5Q^uuYH1kR%dPhGm+q)e7ZrB%)m?3FozI+vpK1LO z+C#4Iq2WIR4{&R65I)C?KLxsb=n4jd>1WcZ|LDyXQ1KhIi63~xWNf%tbB9j*rf2|`3% z-xmM^uD(vKEqJpyV$4%I$kp#}V{+j{|CZq9)#|Ej&^Nbm^WzApy7@`0@5uR^e;?t) z?1+$ORp1~(UTFQ4y(&N;N{%RdHR+wl1m`O}fcj4r7&yXhZTf85{(>{i*aoegtb*iL zypscb1M5GfZHRODj`p{|O4n9L*-PcJe^O2I0@;5&)@B%w_Lr}O5g5w^&GzI4s(C3f zbRIyU_%!rCoSWjd=hG0Et?c6|Tp~i)*HY!K{x;l?4#7JB4q-IgVO0AWYwz?7`9nCn zIBM}RCd4uRx^%H1bOdAkLB%Vy{Q=rjBX-dM5bs6*%-Z;n`S}K_e{f0<*`6AoBOLS> z89#k(>Co|w*vxbU&xflFCJ+|G)!a^Z2dH(KgM^t-@*?2{BT$Rh`>~oMaoBF4e?%xK zl>Dtg0Ysfjc1H)4(!sq-as89rU1_gm?OJAMRFo|Z)i67Sy+?*lWz(F%-%H@&ujCwYC^(V6+~6xA2+E7Im`mkE3m^*)xcV;0QgO`F47G z-R4KX_vvZ_x;P!zOXm+e=hhpk9nA|N5gSumY3E||eo;kTK@)(Z5Tw@jaU@S)MIYuf zrH!!iCq8;oW>SRxy0mV@W11@&N7Gh6?+Ai+nr-id&5Kq4iCu``)c8Uy zN-6SnjCDbI*@ANk68@kiS9cpnqSIX0^*#E@!Bb;9xor1ndOyf^0d>IIVYS!0*{}!F zBT8%B7>#P}7&3pUsftHBu?sg#qQn+89^Dyc_O3rQ;5hI$2jGV?_GenHIZvuxa${o( zF|7Ab_ED^0TMOzxUQ2N|=uFeC`VbBy1#ug>1*OA%%(Hn~%kcuocL1%{d~IODjb+qM zg#vM}?e3_ZiB?^7VebYS{7bvI%!QH7jIvW$NL6hI<_9?G8RGLO68gbU+f74|oIo+P zjc%LSy3T7g=n=*1C|Q!&xx_}vJ&6sqyKgajKV<*Lll9ok$qv3^tWWPX5jtWYMeGeW zWxIB*<@S6kd{mFE?AsUGBtI(}ayo#8+Q%clZbzt=MKRkF2_qPByf|VoW+Ea~qWgdn zTkAVlDu!5PGXXc-9}xKO2WRo0;4J)#GJ*D}rSLy4h^^3yRB+tM?BXJ!l{v_h4-pv` zZPZ+#kh1gRRox^m(3;}PrSMU^A5XrJ%ziN*s?t6fY0eBLG2-eD3`^HP*pBGmOj*2O z*E`WSF^*C2vNv-1xG|d!Q-kt_u#Y$QlE4p(NY>!|3`-td3v)kb;e?bmFVAwYYg|U#w=?~+c zDye#BY@?Ra)v)il*tzirzV7shnz~jx_`ZYngvRfwZ81A;z-FW?0fy0djoynD8owWJ z)My9Cm}PYu;EEXS!MMeE#($MbbB4jAl2v*B;ROC7?|JR5fePp;L8-u@&f&E=mA}NY zFmW<>$7PWJXchylZ`@>woKMwZ^Zbrvb!g&+$&bCo7x%QQoF~%oHGat|#NU*RB0-fN zvsJ^=y)-PXP^fv{`Mn*qtfnu25ger2F7DaCw38(`GkptI+;AEJ*b*%kGG=pTGi}7x>6Q^{ zib@}Gm`$U}C5u;4zJ|6;WDs0`w>(|@1YQEXsvV4RxjA}MeHlYw)xDc~0l)d;NHcQ3 z(wMid0oR|1lM{03L&bl{jTP)hBtLoTGR~+Ym~tdo zX>uHGaV>uxXk~?-?VeXj#|=x1!k4_$x=tDtL#Y zaYxnkslI7@X6>Saea3anoMt`Ic-S>W{1LktPPwuDRA#sfe)nxXWc(Kl=QA-l@gN90 zb~$uKHZd00^Dl#%ZX9QKD51a(596zg*McRhk!qQ+bZ3aAS;@t}pX?NpF7f-FLi(j} z6@I8s@OgcEWXtr;5sp&8gSfMR4|YZfpRAah@6$f0)8LCT_A0wB;^=0$e_}I2-v$_Z zuV8FJ^l0@$J3^-b}7gGvfGT|Fo`ng7<)C_B#42cg_$tz%7eOYob3DdTKA zMDAb;r>D&peQxeAPEYVZN!+YY9V+yG(s->#Y2hzaIyq>X8_dlY;l zd_XLr`0E^zcFI5~EBdzMznwWUvaNEl_d-e_Ck1El3)Us!e_mr!9aWs;FJA1)DTI(G z*+5ema^Ck6e=VAfNW<$#$HdtY*taX_fQMDpGEF1S#6q`cvP1h@D1t+_d9?6g-d(j z4ZB)InAM`S@2NeoK^uF1ru%-REaU{^to4+U32YT;vg1k;PI!<;AF;zf_Z4-bA4jiA zndrl8>>`GoP=0xh%9{snZ zrJ9{55WZB4*_Oe$t>tA3&28^NkMNm^(w1X%e1JeZof4|+jESM+e}?pYuz|CA&vxxb z#k)PeTo(3(W3OX{F0_?kKJM@LLlu4Pbib%-nqKDySkH91R3|P*xs-bYX4s?YOYD#I z{yU3CL3c#){Z`W<7DnZ982h8+Ih)h3M(}5Go;GTA)7gA9_p;P?L8%jZZN$DgWdG6D zx4%ob)tKlV+YmtTEwthzOSx6iaWY62-L*u)?e$I0s9oIh9kI9^6+7^4O?dLZG(ZvP zJ&rW6+O@>yOSH)80VxuUbpA3>@gMNLMRH(gch3tc*eJyMWWw_y?YL4lVp?|(W{O{1 zZxAD{Qsz?1HoQfP^c;XSyB~4pbmmO3lD>f&zyyY#wVguWb{xKKntYq~`;JP3qbds- z`v-dpm}2Jh&*9?vS>NXPzm(FG9G7aH)VxgUV@rPPx%a77;1C9Z*bZLK!y_{F#ee^# z@!JkmdRgJ_e?wnz|GTLpsGubU^X#XbLarSbRNWD7NgMCZpq@0k1T#pL$1;sGB|q3L zh&{uuQNd8|y}d{el?_3;_srU3F1F$3s_2^N3}h#>V3hYlCP32mZ-md-KZ$Gn(lvos z2L~a*43|;uH&-cDgxQ~T&@2I!G^t4pLR!_*UQ9f^{h!)T8(78l5B%JIfzCTtjAM35 zb(7yEl=uCw2OxL9ZO9Om{96laoWj2ZZEz$v@3FM*^GoUm%4)*1zP$Y@j%%2Ur%G?? zupK&VoNI}}5){WH%;!5ydA!~m39@JY?ejy10^`m9<$E5#+eZee`q#lI{H;_sjxN~4 z>J9iB3ZKBA``&;ls|FN(ni)py8Uw7%WvP@fo8BNvMpMf{+BSE?^`xynfgD#%AR9TX zgAukX&l%TbE$#Ei9o;40z~DgXl9Ny(0IL8>-dDU>Uk<#+K;^b#8T|~$U_Ev9-@`7C%Z`A_Z+u{0st%nTX_qS=7C#tA5 ze2(LcpY8b#k-lc}gsvxaeU;_hJr~pBX|`d&M{Yfwb;GuSyR@>jZBtGoc{E8Q zfKo)QZ6zc5ekPFHaiI(GMEO3@{bJzRTR84!yF*^gg{ybC^R>1WMr?gS?NokEjE2~|emjw0;0 z+!*Q0yA75l@lh_sPqTyyHILden0bLuc$%N4nnBN2)XK%}h26mxL=RuU^|bR2`De6p zoaz2-RdN^4DfF^t$KAiiBfX*biW}>J7mFy)?Az4F8`zE)nFU{~)jgs{?l!WEJ2;PL z3)237*+7vRu`0)nY^Reb<3=KoOqBKRB`;$0lTbgr%6JS3qcqAbSHniR|4)=B>;Yp zeB34WhMXKS|CdU(e}2U(ej-ypD%Pp`-C{9d1Ol+s=Ty=8cM|MbjV6T+D;MF@Z+CU9 zen$v>(;lFH*;exDbhZN091RL!!JnY?pYr_oRpPCFf*fAO{oXB*Q*vc zf!0TWFd-MA<{j3Oklz4d7}ZrV(~%K>?{8|(+JBPZ{%}9H`ndP!6mCulzdYKo9I2jn z@FhG1A-3sy@lB1gIQ(kIjo~!F>8W}gz|$)UZiUeDvu;{FJO%#*O+lI2d_WS10U`Jb zM}y_x?^Zz0bn?eZ6HD<8C^Mbhu|5q{J*%e@wEhaL;Ofy701idxHMJUSytLX&teSIE zf3LCo@$8Jy%*jlx-pz{hi1sdQfPMkcyi4l_{_!E_@1iM4pts->w%X?l_94%Lkr>}^ z+Z9UwPOooohvymTQYu~(`n%`sxd!zrwP?H08g4ke`aG9c@^@op=iH{&lPq+==6!x( zBhJeA_N82e8%Nrs2rR!y6z zEiOdLV2cQD;2P-{Z^a9_q@#9clb##k?NN-l%3dT+WbOTAmK#c9S3xXWkEj>LY(qg0 zC;tsr2ob?Nq(9I1rguCvSKw@2G)c^IZFz9))v%Hoq|veaG-zq98>Hj8UO zu}K9E>Ctlo9ZEr~L@wUxn$|%ubNG56!PW)UovoPmaYHs0^`Xk;+!Y9E7JCBFL`-tf@y?L-x-;=ujfH2 zW;*dzlAOc4S128yu5q08%8&UW-S%NpbIE#c;N1DVoQ9dVy7KjzIJ0Z0(&ovq9}9wg!m(`sLwzVG*y|E++`D@AL-AqyN!c{A;5RMZjWe&RZ13ef zihzCC>N$WWZcN;ZU$*a+{Sv#1_2i0SpFD}JRV#S2m1wB4FhZz7CXix%hH#)Ho;AADX-_1T-Eh+be_x`=K zT_)k(8}exc+K-GBu&^)QnLh18zb5dx`g*PIrmA(eeF2SeLF`=L?+e0c71e*1Ye z`lOV-TCj7_=;e&d7x#wQ1ono_i~`Cvfq^BrDd}V>xn2r_-Vi2#6M4DQzAVnBq{zX7 zG|wUa*6zHJT3~f99J<-t8S#fWLkFmJ`hmIU3R?Yq(T+_bWt zT%-ls|H)y2wW(g9F(5bd=!J2`i)mB~HX!EzGn@LcHCgv*YaN z4tt-+hc;TL2jBCY%xi=CTyd=_8k`jjb3$L8wkssGS`nJ@zizkZ(!x;Q(vR5UHSWm> zg)HU^MxTxTaKW&qGTv#zqZbN~Hbv}yX!hn6@mpeCPK`Y{5{9kCeRh1*PVCmiO>{+s z@au-latsnSV7@|PwZz#52TD5l@c_&S8DxJ0?B3IiFYLzCNGcA{j?fykPmksMp-x$q zh0S^#Mx#AZHIM4*(UM>_^E`)0jwabqtPaZY2sq95z<{f4M?mOl8X9&n3(p;=AR>y5 zz=c0LWaY*VS_&yfx?&K?o_iFgM0OSO%Ost0$I0G#7aN~p; zKiguXSEdWLQ^w*e5(so(*iee}E&&}IcjX{0k!XjKjcQdGw>gen>08`BkSuJ+*uZgl zHf=ZmAYi2jW7i>jPDFud;~?!g!HIr06B`oUhpc3w73+n7O4<88e1Xe7KO07_1kp+` zhS6bi&pF`lHQnkf?1(vr34E4QseneDeT!=EDq?QT=8crSN7luw3uwSsno->F9muy( zh@V6{hO}QOjsnO(fejSC8kX>bCs1YKx7WCJ)k8g5+G*~#ht*^7EMRmuaD7=2ByvP%D`^hrlZ;&Kod=8WH$$* z0oofy;@M4&n*VDvz|1P6u&INdfy*bbCW`_SJ61kngo(O%AnOZQ_zsicxN z9Kb0iKGuH2z28Ui#W&%&MQOwx0`&tRhGOP1+{PENzxa}-Vv*#(r`WCzs0_OTj)4u` zj#<0=WX}0#5sh1Xy$RWBta`fL-fUNNVB|fmRBlJ?{5E@%`S|o1q-VdPCVEtp9XLK7 zjqq?N9%CBbLJ12hs=j$O8ZB-hSy{jU+^%Hps2y8;v-K^m+lZ|nLCdVV=BLQAiOk=y z$+>VD)*(*J-=Jj@)6Wssk%+axfDbhHW!55LzGOOE>~p+GydY!IqQvMY`vgJ>)F(B!>rw~-W-+`nM)GcYh-@c5XEiaF!OMco>@sJZs+NSq0+U!e?R zi*+s3xy8NVN|0pIVF*oDR{6)_!d28iM|DuitNovEECkEwZl4c)@wSOXqo4e33Mjys zf)CcJfP^bnKmtowYG-RT%|ffKVx5Fs>Kpsjo5DsW{^1KeO}e1RM(<-sG?SpY970{f zBYjz04hcg$&WcuW#UEjUkz{;Bg12h9TJ2iZ(C>fv2&z^9B=@IOf~ zb%A$m^{f-U{A8x03pi7B`0N1|m?T8aQa6neDWJlX^4LtLq)h zYpf{pE~xt%Bt?W>G?~91-$1DY+&Q403^e(5!E9Ht-jQaEcCK|k;=kb@nRq+noYe-7 zH*i*4A`W~Mod6LF&kOS@HHlI6oy!|E*46QQr>SLg-*! zNvEh!QVK%t6n;ZJu;Rmr7@;F@nmslayd@;7O!=EA`k<}NC{?~|iJf`Q$+mC?;k1}5 zi@qecsN|}d?NzSa(lwCE5-i`fckAf^e1k9h3|VrkqLJ)4_RytQkGAm~zql`L*B%G9 z+itM3-A-P~`TJ)nr???KR;;_BH9x*FyMV`fg-9>~GhYeX%JQ1kdgb835@up>f=`6y zj_A&V<|8Z_`71GHz8#Y2V#21ob4KZ2UwF3Ch_e`pA6a4JrjsFS^>f&Kbu;nwOn%`5 z1^Z#aLG2Goa20Aa##g8*ZUt?> zTIRyiE_GhLZ{yp-dG3F>%RY_rC6`^nxoQp&6kY{NM4M~SJGEfdG89B$98KYKT!&3* zv5VUL(k2qESZ;XZ5}!#{@dhvdo^rzKv!$rsz`1(zc4yp|(2FsE9<=r}3^m!iQ9GrA z0~kT{PTLwqgr5{vu9)4*G5z*@?XVaNeAlh}rv$jr=!ia_=6{kFvRU3;8)Q|>E^Jeb zbLlW6&#sfQ?j47ddo(q&J-2Ion0%Kk^I25tLG_8Man034E0l zW2PW>sPmD6wmDGK=_f{~=}Ljs=zt?=)_NlC(w`76X;X@YTZ_aF17wm&4%@^bOQcZy zwCr4~2C7l{*YgCmcS(@n=P6QR^m5TdaVFyelnHO@9$~Nq zf4ev3Z~fz}7<1yTz~wuT?v{6}Xs2^jI@j+z6!vkKe?@>c!|?|1+)iUQH;mBianNEy zp>n*q_EC;gP6274wS>}g;v7b<@GL|kaX&!1lzrag#u!P(Z5mn@7Z`1a*4|=orR)!d zd`s(!h~3<(SnDzhUAAq z2Fz$a_+w``luM+(3Z-f6^<-e$3H>|k4vHHdeNI(7$|Oh&Akm4I%=KD4ZxeglGqh0Q z=AY)}Gra%!X0&eG$0Kw*j_U8eL5tT%ec8pcKd6}dw}{9y$fN1@l{f`SpHU6+NpFc+ z*rQ;p??n3DXhvvr?N?zwrS*IbdNucsvH{O7Zi!WFFD~~B{7q4FD~#HZ4(DPA821-0dZ+2yZIB4nN5%MsFEEl zW`yh3izfd5Yq!5f2QpDJTE&Xie$y76LNeAM~0#>z4 z1KOMdRLa+H#M(bVH79d|e@2-Xl$x+&EqxBTMR;~TI^Ws64|Hqnph05${ypeR@Lc7= zPVR37a_=vUilU7lvEL1(JurVv0S;dWO9&V(xJ6t_o!49F+oSBGI{QR@TddvfVw#w? zGgOnDJe>oq!5cfmUu?#8c=kytyR%@sL-=#eFWBQSzv-6dhL%h#{##xo)}<~(sZa+s z1N)!>t{k8bFqY3s8Yx(RU zAe6mC^%Kn%(1P8gUVcDpou5SZiwFK-&#jBJ+k?8};QhL9xjTM`+KNovkKn6x%WIfg zJU7D*4^IHccCYSQDVQcv50ZxmwC8mU2X5@JgZuT9wS$ZEg*%Fd{4j)+CRyBi8XWyw z%q>pk6x2#Rxpe(sa+ZefF!gIqu@8#Tx8N5){+BZruBO zM75C=V+{jV*}I|{W&X2G=!lCggDcIfYN7f;K-;m45@@QKeRF);6#iR8bHz@MD@t2! zL*1s>?|yjoBpbDhTo{JfXv#N5j@F$q=-y8Ly92CW;lPS)zrb1@_;Flbn5i#EEW&~vwj zhy6fgbVtMDpJxRtE!gCbf_k+!Y-%NeRxAp&@BWb^2dj9^o7*pC-7h+Af7bq&us4B^ zyR7#ACrguQx=l)#NhvUG0n;L7x}ejtO`$*vC@E4%K`}+d6s{6LAw`rFTmp)u)hj{0 zniiB4P+Cw3i!f;s0wM+k34%IpQG;s=6$OR!e}B&Notd=a@Biv=xnA3ud7iU<&gU#o ze<@kfRgAYIhI3r)1X6VE*8FBiJD>fboq8}P7wu*`A(@JC_Xh#Zw0MvCHBj6xeBBoQ zDnpz6T2=5pu=(IXt*G)xX~@gMkOE?@4xQJ|!P7(AR>XEQ`KOBT z6+OeZKs1CaKwJXy0yclQ@-`=nZQ4z|tdT~&YV1>P1OFfidrT#PVS5SZcdLqCq$FPJ zOr);kS5)cn+A`n8={8Cd1?}&R(HTAilh-An|cH=c{W6b?%v1@&n}RISP&9 zi!l4qlwPuhovAs1tK#DWqc;9KVrh=rP^mxK^^t&91e$oEs30UX|SNSQ}x<>dBJjH^lvD@oVVf~lp4gUHgkOh$!j z?K6XTs8b374na4TNZTbT8C!{q6|aQG7Xa^B;v{dI7Ka<$Nl6=3T%R$mme z*ZyKdv>8+jsTJyf;kh8+ry0K({`52`Tlg#?Rpl$whU}t2K~lLu$vBONsozR-_@}`^&xhNF5$G4z_uuwUyG`S zSY91kFd-+r_b%qreHBe8LYaH~yl1n4TI5sMGB{p-z6_q6t&fF3{uiAcU4fKIkl80w z$-R0HE9a@fxZBFtw@d#faQtEw5LzadI4)6#G0fr1r@&3@&-qVDg4T*i?ins%QHBDj zofVMWA24jrpYzbh(f6rm2~?uSFJOT7+hEx|%Unkn?n`)KIvZK684(oj*J|%#_W*EO z&u%*hH{14!0NopiMmnw+6qW)uq~rI~ohjoEIv&=EZ?L){5Xaaa*Me=9Qdj-cKBAgx zOT>uU425}?zJe4b zYu}!My;1nfActQfjaF=&1p75QQrmglQ3=}F_7ce5#hrqvtpZDzr5Lv+xz-ZZO`+Gi z78ROjOA~f=i?2`x;ikr?iaWE)V>MVMl1-}E4RGsY+nVJfSH@g6Vy3&zfqT$)LV1ln zA|j?0BIdCoClPEsulL!C=~x*Z`!Et4XhI_={eV*v4SD+s?rgqQG`$6!Tsg?zEu1%W z(C8Q^A}7!w7&Wj?zV;(%-M8}gKY0lFl?^OK+GM9a@~wL>fA62GE34UwPLI!08$Srl zRWl6T)SL8DeKn5FIlOqDRQ@$Cm&RiuB8C4;q$j~s)Db;tc1dz`vCc)EQnYfJ$s4c} zbhOR3e{J@POVLQA2a%?XBlO2Y!!|YJWBALv-COJg<`tENX)Eq;Ju`VIi;7rymOP(! zr1~kVLHGCB{<#j!<%jecLlaM@19i}DDKcA0Q|~sr8T;aP)Q+fkyIhRksIHFnR@Tag zI+?o+UIQ#Jg-JS`#+5C0`hdLVEV31V{H1t}c3~<__P<8EMmcfO?!j!J?PuHb*#tL| zu0saCjH(i4NCFUJo$u~U_HZ9}Y2kPs#{MFzbRtP$9H%i_Lsve>zBF6|jzA^Udu{$e zSuSP|;R>@)`!c#m-D%EY&_hl$G%Oz^M7V}4NdP`ZS*jaQ`W+x)h1Kk|H-Ln?1ZezJ z4(xECI}L9juoN8x-B#G;Q6beT=0GRdLjEQ=Kn#xhp+;49z9h z^wnIfiG<)IOwqMRX+BX8WNrH@2|Ud4ab-_4u4032xBz=USA7#7!Av>&ix0>P0@iHvJ=!wiDTnEycUkJU8%e)KdZ8nTAFF4AUJPPu7|8_eG`}ua(?$$}YU72boMK^Y@ z$fs? zOx}JBBDm4&el9|X)52p0QESMHLb49LqLWXW(29Zm!~UTn+D~yXM;9n;7j^;q(dR{F zHSbBld_sttbvFpAWCJE>b+0j>6*Nls!(;8UuwbxlE!En8q8MeY*q_|qk!KC@kF(a} zPBSCqTjr!DhacCu)n;s@MxjQL%{|}a7dz}H*en#_J&T`vte9ttTGO!qI90;J%f~$^ z`C{;2Z{AL&4u{d-Oe)_T_O$>2C$7UR7{ZCGXV*7TlA7+u-H300LE5)C)0+!{aYtKZ z@bMZi(s*C~LV%p6XS;Jia5eRn4SQH@@GS7XL=2=ISBov?t}WKJIV;aAMTK#;*v_LM zZ`SdWt0cb!#TlQZLL&$H!f_BzeO*@F>QAI zh8BAlGof4!-7zk78#Tx=re!pOb%bC+nruk>wu0Cj35*QZWih+PPUSn*-JrnPa9KPm zaXIFFWc0kX+c$|^5$l&b>>UWG_ofIF{0nuXp3c#a2MX;|t>X2GBRHP%d3?@pif<^{ zX-J(|&B4zt)vFRs)HLb|7qjpfBD@WoyDxkg?v{8yGv7-mI-V{Rtd5F)Nwt<;>}-)yN};M(vjX`_I+_B38qL z94E*uG^F*bd`e+W%S3+$7W>w2fO($huzU{#$womE0paA&A?tWwjOzfS4)D*Xm zDpd$t!7()Tb(Gbjjs5iQ;plVfl1c881)gr>yDgQ@hgXIg`>Z-mSr+z%i|FoASDeMt zP3fliO8dLlFCa4S1f}sU1DaQuy@@A?;Bt!>@k5~D`iwo2w_B5&(f$Tz!5d}!&UxT( z<>9%7#?BsvJ4ksRlf)H%1m%C-y5tbH0*(vW&&;rl8lqS<57AEJNq9OZKtk@*7v04b z-rjjLK1ArKIG!}d7A_++d|!|3oPr8`Co0qa7Xlw?$6>fCNk`#uTWxl4WcybT<3cUt zfFWxk=NC$vQ-p;m0eh`78o_%{lDf@xWTeeN!j|O;Buj6_1SH{|BE4Q(2Qz+Be&_)lW) zzs=A=9?t@iV)ptnVqZbnU}ns{8i7xXN%Q;LIr4+UY-RcdEn#Eb*6V|u3opoU+6qiv zAq_$A&vHqRXk%3x3tjBz`D%o_@c0sOF}W;#kM*y&~5xKnt2;pK8m@g63L(5{@535 zXm7EaaB}fm)ppPTY)%^?u@X)?kU76}4_}VCM?7D@xGi|r{v5Xdm@-p%-433KsELNJ zu7jS z-m$U+Ik&1aQ%UN!J$*$^z$VE1LU-(Iai&u4Lfa$v^L6f)C~AXvc4(b#8i_5^_o`>} zIxaCyD$eHME_zMYL=F2mjvvUeFC(7awX|9Np6|0e75_2%7Mn}O1pC{#xd2*^BZwSI zJYSi&_fw2+qIc>R&fOg=Vb;kuZg_K(Xw7o$)Hy6KTs+1FPO~GRh25P|?;)#^l+Q%HY+=e)XFjy3)An&^2f~{N)hS>SL@jV+Z5XNITkj0tGDdy3m{o z7_8e{LTrlLacF!lxx;4k5m0<2XERmFs!))YJJ+E6oJRY2*6NA)TxjYIh%m{f!Lg4`BE?4i}5HuwkTjjTHuHF~gLESxhZ3_On2rSB*QSW*t zFj!^tSavgi+H<#9W@)31Fz;1!J@9Y>a)#k4C@Z2g&rf2!j13rG!4a@c-@x#wfxxtP1}*NDJOVK`!; zy<|<#AVIpZ6FWh=$%d@<>8(O!=@e>Fpl+^B#htzIjXuye2k@7!QJl)z4_1YRJ~1A@ z5lT5RI&FC7dAuNJieDb*&&I)Se%faRRcq|5mS!cR3n8UvsN0j%C%WIUdu$W|BY5$$ zn@LfU{5#H1(>?)iawta~h6C2lllhytBB9k!S-hJJg_}+js=vVEaF9x@D~3AVhR4FR zn{jDd2*HY9Nj?#j3tlB?^9T9Y;|$(nP-Bpjp7>5VN_{j-O$-yYF@f7?&(S(w*=*U+ zXmPpU$0Im*Nq>b)A5UJXC%|xQwRTnyvU0z6XOZK8&1-5V>>rd#2Rbjw4>)Qq|DqhU z=GUM}thIKC(^y=?3XZr>iY}`-IZH*>elNhbU=bY%+`|CZ?r)$@+J(O2<2VM#w+<6 zu&P>ZTKOKL___LGJr49fRcH=tBu}ca#lvX9!T{Hf;J^3Y(3JyC=<*et#o;{wH``5H zS1%3SZCubkF+B^4pj8naolHpfbL@3ChmbdX9yMsP2E-reh+;3llw>p=lYArEJo_U7`#8w?kuFYPZM#A@ROw^(=Js`M`0jn=#i8d* zsl`8Nf7NF)b|2%FqUi74-|k$FS{K;|*$9+Jm`RF`OpmDi`kN3E7{evJ9O9J>WSdIm=q$&|;3c@fms5$zQ}B?i<;3UI_uG`gW{@c`#e3S{t^M|3xMAA7In_u1;`-hdJ^{4M*+NRuW6#p3@k1HxBIIc%6IkZcoxTBrere zTvezdF4YEv3IS79-54x{yHb;6cbi?^%dY=m*cW)tN$swbb85Wsn*~`HNyWWHtsZDG ziiMHs%C)c&=O)&IRt_Ru!Q0jgs4bpmQxH&)VTDxK30q~H| z{)bTg2@g+ktg7h4bkwtS)D3#6)TQhbI8hG;+qrtx4#r7+_bnwxZKvWx2~4C}eZ6)7 zi^&4uJ_3CnCQ7^8(oz4;QP;(_?)7{1qE8NkLCXWmq|L{wV&D&y;;0d6C6J1PzGAOv zzsWDNdYKY`{Ep|W2-B3Y&?!};P+XR?V{@2qfj{|~tMp$$#X9PVI0m}Gnr&Jy_?!M; z;?j&lYQ1Eh9iB$r$1q5#wwxTP*5HQ4GoRxx!bdY5(n6M6Bk#3DaID@YZItU;IHdCS zi}M=n$PkIIXhBUOPU>4RTqYM9vEU1UVF)STQk<-ssy9@A=Ti$R3A_Tw`BS9&QGPn! z=$qOS8~{jEGM`D5x_{%d7QglUGl2?@IwXj!lBprp$8)<<~i1o`>X`R zqwcf*<4H!@tqv2Qr&|5Su8l|{*{(d+AzAwzQRygw&Q@^)TF@lSc`}N$GGnXqtgdp* zc>(D`Gl@9@-a;R>j}YorimDh+x?!;3vGh2P25Vb& zTwrHCvFWZz#OI3!j`o*d;fEdXyZI#rdZfn1oPebUdVtlS9N@uU*Hcmt$tvhdrW)b`!5j^^w3$EL*;s6|BQjE+%CyFww*-$#x*zl!g za7}-O^NnQ=VCP~yT6qinY%7@d#ChCB`wspl*EY^(4CTL(qqU;4wB^^lY#D@fhsyYsx0p009 z$Zx*DS!D8Z_}G(i~ktm07K@#!_z9s$(CfXm(` z0}z|qy#Z`UKQVH=Wn-;awO>s5&QE+peUQnw<^s73$bp`cN!NfJ6Pd!kt$X6HJ zVle<*0J7iAcj`6vgY>f9LNr)5gDUd&`&>6X$x;8_01A2s9YIpPIchZ0B_cmJM&hK>p@qgs~%FQL)X zA4M(^Hh};Th?uMVIws;wO7T7DJOTcgz%*g_d$fhh>bD82J8iCrSEXlZKI1yS((PXH zfz#A5vK5oUABW|)@jIU8vjc>?1C3ANxp2;yhui&3*Lgp?K#lkZ%{hAOKmJcb<@Bdw zIjwcDuWxaR_eNU3XN?pzJ&V5{HYa3o?-i;Wu;PrWcsTZ2Klaw>*kSuBVpmRfjh^Bf zxqdYz(jh;%R}WEHSib3szaumPtW>qfQx%Ft2l4{Lpv|1uVoN#u)g0)OqSzae`kz^5 zf$r1n{s}5&?NJ$gxeh(elHC^TTo9>#GmpIRA`Q6yPrP`Z;SM8z2j89>;qlZspeFK`fS&GJl+_aG%VV@F?0c3&yA}=bTxw>TeJ4)GYD&m9gwxM zd?sbp^(jdnzZxXpweF_1=#?*SliX|P_ej}e8TkF9>Kj|^c#eJI}w z&25-a-ZlQOnn^|FOAeo)&-O9^z%a!^&(h|A0)JLVsqpup)1}C~kgi-?2>v#facl`4 zvL%Dx_*$gv54IJf|L6P$_TeXR17m?AkRYHK?qA(g;~1xysTq**_Jd(n75<9iX&>!0 z`*8P&-Hm`1sz+JeKS}y%mQ3&x9Vu%!pB9>AYxwNQ1x%F-Xb?oG7B_s|p#6f`>l4Uk z*7Sq#btyx9^?2^&NB+jjd#FldsL#e%Tn2uZ^S<-PiQ;a4j03VjyYZ zx~PKWpgyekui(LRuO|SV$Mv}TdyH>N5$eJS=b*FdAEl{+hLD7vK)93lI3C{uXaQ)} z@tPWiVRegN+5`UOgASr}HKT;|w`;}t7(37_N>OHKA;Atpvlf@ETJFNp|{zeq8Yz{e0frBk2l%ua89S^Y`jIHveiE5L=FD$ z48$^NeoTbx34Hh&%Uf(&4_@l`Np~!G6GgqZIr`{~p7oi7?~i5D__n8DE#k@oa2xnQ zjXP}gO7?|Y2U1~LkBU76Hxa|bY>7z5$eLqRXHn{4}|-3z}+^g)_T}tNqB*t z+xG&*i>~t_%gYbh35s?fj}Tq~;f!3EqEn`=x(M)U*tJk_ZsA3XS7TtPid2i8jH@3& zwtBfiVjiHDG_1^YS6;6w2;2OPvD#eYetWVs`|^2g8W%qm+5&JwzNm9H$mT3dGyEK} zG%7F89C_@d`eGD~#MJcK<(nX2H;pVHKI@|10e?~iH_~@th*~IrMn-?)J0lzozC_)k z6$$96L28EVUk1jb*dT4vXti;ivRLnO&5TZLRc+|?hNRWyc~#X<{3kedh?*37{r)<> zS2^9VO;0JEo7susiICgnDbVqF;4=RGRr2e<7zlFKky9NJwp|cUxZkfKWLtyJGj`L! zX_f88gzn3J;2}_C>AEL%vv3qvfMa3p@W}dJBw(8UTMXh1P zvY16)TS;PVl^X|ED;M+U*d}ARarJ_|KW158Bz_;_e~7>IDw^KyR(==<+HL1-wzKng zRVV4~VfJLJ)9#b%QiK@Bw^RJGfizZ5x+ra*!(Hs+2aKbA?GLs%j>5;eh|#St!0XG$ z5o2S;zRww)iuXd0gNHMuX#EXd*|6@B<|1lD4!i& zU^V~-%4hkS>VY8}&e~J+TI~IJ^HK=>Mkk?@3d^NFO2uJ#UgH6_`+wGbM z=<_bHOT1a&bFd1f)<3j;lC3N@!W@z1U8)Gp$MAiPj64ykn}}zVTw% zSn?SAyHH&-t-cLHFtp(*hM$VCzm~L{dSvN}Wlv!0SM$?e%3D`x`nw3CrX3hVIBVb& zr;r8nfi#3Dq8-u6zZunx-mlc+oQ)!-mNBEYgO3QL&K{Ot%kWcifOYBH?z78zCk^Wn zkrle)*SXkFakswrW{SxrKKlQ$k$NJ>S89W8!#^YYK91^_K;y<_HnaI!!;|n&&6vy|9NX#^w32&Gvxc3%;z;Hq1+~&7Gj}kl0c<@?1hSfrR%!f!IK{u|OE||@ zh(gEk>AMTymJz=Y*J8B{?w79Mf-uWmHV8&7kz4Ei0`7?}AQV*($`f{{^hfHiWd8oZ z%cqFcviCjS4rwK-&-V+cQVU>pE3&Pm6ag#$0R7GESi`7hXWCnn@94$!X(1~J$ z^NU3ERdj&S0+@|F{*&26+S{8`VJalKxwE@7^h^8`_rT=-DhSu(Y;mF&H3`DMHtKmp z-=y#4Gy-$HxDkQ5t8uzZ0+<7L5!e<`zmdZW4@#r+Q+kVMK2nd%I&^(U3Il;tKlWaz zQC+w=y(k^>nS^I@T365$v*&;|SrUtibc>zFxnJ%_T*aj38U(*AV>jjP0u|dtQ00@Q zRw&GVO^|!Enzw?+&y!$y`kNXdZhu0;uoPFPFo&zNve9?Hbnj*Jk_mx)8T(ko#F`A{ zuq)PBw%NNyzUC)CCpvkUYX!zuksKU^s|V4gh)_SGAp#J4ebLeH&EUbqWV>-E2f6vH zjIK&@mDrbaHM+kr;aHA5DXrS-2Q<`NZM%v({|1Rn91VEYzCgFY>QoMPBj3C$&9_fl zr)U9nk+b1;bPX661JJx%&(j^w=7N(mR4HZf>K(~h=x0afG4;Et22;lAiLOap%ajLl zAb)>8B`UUk-XYB=zzUMQuaNSp`J3v56FcW+r z3u{6faJ)!vEGGnN9U&0+q#>=lJ`XGFu@x$1SOqYwlUAla%#^A39(zV0w-&q`f!sQ6 z6Qg?L+ooPoJBgE7bLpG<8q+frt?trbP`-%vs8bc750&R+&icj60dnFO@P5 zc8#c{W>*A1L)<}~4FPjog>u~u{FmkA0=k77ER96P8tf!$uy$Ody&kiv^(w)hf%%KO z{f)R=`U`GD6`-N+&ud0Zs&Iu3+W(NqKfG&trurS8;y2 zA=^fdHdK(g@HN`o{0&=OP6hI3nyku3Y5YyzE%qWhs&26`9u)dsrwQD?%+iit`+Xl@ z9p9D+XxhZB30(Faa zKMjk&J7aV5)(_OVpFe`CI_bn$cAQZTq2-|hJ+IOYA$PllQ}ewqbi_B?KX%&hG|}%u_a}t5 z`>v8%&RXcLF!c_NibcIcdX3={zDoh$CtZv0!_B2VkX)__x$6yzA@}=3HmVW9{~3$T zrzH1z)NDgjN!@ZS@r92{bb|BS>J{f1XVNN%-+}PP$mn(#Vtj338+~o*1q$tQ=v3xf zk)s$094kyS)5K1++e-dlIzAyjP5>N-(XU6>HPO@5;q3iD)^3WJ3meZPI;40KJlK#4sXSjBaH4(^SLWIzxGuf${j?o?|zhEeB7SM+pN5( zn=87qVs6^e0Y)UiYv&vOeKfd{YEwOS5t;AH9|yMdr}aMl3b=%KK(nZ^Oj z%L#d?z-)VgTWHVWgVib*T4KN9Ezr+LDiA7GGxJ>dn0_w89sijCY~R@uP(J%^W6U=Y z2h!c*y5??ZN%U);yHb_uD*EQquJ>S^QS(~GT)%(Fp3d5*XK?DXIQ5TPtdkJ87Ob0r zG1l_x7~3o^Sv4JEmRhYaK1j(S{R5p!s)H$?-+*?a|-)Sz=~8d!2nZtpWcyD zg+|Lt0z*Y}Adi9%4}}&RWwQAAPf?$&u%m}lP4*$gKa6Srei-XkHgf>VdQpQ8-zj7l zOL6vmDZl`UEPtQ){Cl8%42(2wA7ZoAE;c#^a94x884fg>Mn2{n!pD~4$S9Yxk+ zn&Nnh5|UO%-b*=Jbc!0%tlvRl!kcR=uav(OG*3hdO)+T^^IQ$WHlR7>FLO?EDiHE1>D6lUA8-Exx7s#V;i%RG^68gn|{No6Hfed^{Le$a{94`>=T1pa3TP-Y7-3n zTEq#S63AUZ_rV>|a00n+!+&(Qgod50MxFHZ&={?)CMF90DxR#*Iv7jVj(dg(b-zO&b+{K_~Hro{3;F-vK3vTe^c`!ZJq2Nf!lMfsl zIl)O}P$G6lb#gzmTHi+dpsKENPH29@HslLOO?H##1yW;lwA=y}@o@-nPLA$Ve}W|x zX&-PEc@X80itOicz(f7jR;M9>n{b0{U)|ne&+W8W_WWYm)-NE2ODgeOa2uo20qU{F zg|HtHdx7ApwN;I_d@b$)QGX<~X02!ml5XVE=HS#nDp5bcF0Q?o%7z;C?^tlu5Or9x z%5m5h4HEBP;!bgeh5q5%DA_cAG#Et@h0hMVsfL!vbVaBnJsZQ==Ev2hOu^O zs7^d)%8<3b#nynJ?vL8!K<2FQuBTcasu?GYURynugG&c zQ5ne`UlYJhK=y*Nu*bp#Wtfx4%{S_k^`2B?aK{Yr8UuKIMa{R8}SY0=c z@moE_c@Y|;n+xe2eo+-7;(b$NSo59`r&E?NUprdK#Lt+%7P$rB-Fy}?b8P;$cr-Uko#CH{m^Md|83V zdH`)S;1!2wSEP@Cj^;v8^8TShoWITE{LjFU3U*<3HT0tVsvzcn7nSAb(uP}w1 zHK%@HE--dmD8#A!47t_(7Hre+*6AMO#6!S)H^o?m0UdE6P1p(mo}DNXXHK>~mSWS}pP|7`GMz zDuel?3;X~M{hf>*mbV{b-G72FLEi1i8}`SS6)`}~6{MBHEbr{^Xk{#iw&_~z<|YWV zW3z4g4zib2k*=twDkDYLrp2jT%!5~I^#lB!QxSg}YI`@^&2)tc zHYIHJrWpKJ1qJp3UDwKqALQrVowuj+2MNqVw2PZBI5l=p)PZoSWZjK)S_c0cll{PS0iwTfcczMau3iibgj zt78L{X1cwl8q48d0Ob$h6Dugf>g?PThd)Hkc6HqR-w+SVw{jmYe3XRu@z-9aBJWA<|usLBT|!)gWVyUF*^{KfBKA|UR495V*x zImj96)MeCdwOs?2?%_H-t9>$*sem?t&)BO>rBdZY`MI(=6U(@O@?qj=t5AZxLEe7k z)jE20#9^*RG>73ATI}N(Mk^hLkm6pS=EHY!pmKG#Tpx;-SJ_j|rYOOg7qF*T6*r<*5t(J;7Jg9mx^|@ZgwQZGBzfW)h zcUjdyKs!qPp5q3diQAv@XV`00rdOBY6uV1KF(mmD@aX76YbVDMW4|MC*I%Ll)}j86 zyR##1pf~C}9y@;r=cjTfpLlq{J@$kKfD4}ChkpFmLDcdL;W48zgihNhKajV-$u`E> zPerzlw_979(G0sQYh7{=upQJJARU{nI;TC2sjYV41}hJZxB`5w_HJhYR)&tGu-xmE zA=32<+pk~9?;YncXh7I}EIqVL7eMLoj+on``T} z`GaLg6C8{Y}9^a21VU!q#S( z-L3Y?IvmW6lyZ**6-7G1LhfJ?R;lh(&UXO%@Im*I+Pk|Xfd4N#0^G#?l(+zBiedY8 z|DasLV>T1^r&!C2l@^`J8{#x+MUx${$)dK^Y9i6&2Ij~3)_pte>;`+bRbs!mu?}`F zZr3Tf9YpF7k09W;44u2iIlhwsf_FHls{~iD9~O<{ZYDYM2J8u{5PVAus_YH z`BZlSsS@lL%_Z|s@oyRRclzTwJXSdGcN`FH!8lIiN{ZY^B~dZJ|6g!7Wdv^6KFV?} zJM0UQz)^j&9aO(*57n)(C1sAS3Wl%PFVB%8selu8-(TjEKFj{;D=S0Yl9aw0h^k5W8rv;YSW9%Q%cJ{G z1jGNbr2ozy5Hl*iIWWQzii)l;xBzWx1szkid=Vya&_3Nnbi5P?@CnZK1HQB!T+F4s zgf4Wp+Mo0G-9~thM^KJtHeG~H)NAoWL`D>Tb7xxyKgb<0Fw4)bt7I5kn0yDy_Q8^YixIrlC7G@}=j{oiuz zvorShyj`gTFh!8)P8N`{I@X5J1TW^bir(=+c!)Azx_4GGg77YWIDA%U$n*w=V$vT? zQo0$izUls47&MBid9Oz~f7+G7OPDR#=veY@q(8|f^l%181c$3l56`~`vz5{q0zGj| zzq5J8-?E!QoRFjQ;1^4LnmRt7?ia}5xaD4;fMJ2eX)b389O9zD|Pn6 z)Us7_brb4s9M9Rw1k#-yZUq0vXx^$r>mERuOL617yCia+9zez;ecfmk{bpOEj2|o5 zhc7Ey!Bg(?XVUqh7F2NpdTL{uU7>L2{_YFSc9)>FAP}8-{p!ifQ{32&siZe_S^ZiY z*N(pX!vn-UCa=IYh4O}%@8+mG?_>ma)jTfsGS<|mp`Sxa#8OYN;PTeSyq&L+!@2g; ztTY{um*V#T169CHa%Y@S-$^MS?VKjgfeqQ;fq6;%Fq01rByVlKwpl*;l_dA-D3+Ip~G0?(FA z?AqCj+rQ1Kg@pB+r;`Ba^-BKvFt>Mdqn*^iSCoT)E=TxJvj{pcA2g^w%N;Dp*dKw| zpKO{%B>fV7{MP0P~ zK|?6xFsWY+YQN3%YELcH^B(ql__XdJ#@~wq0aFLVOgh%)QO=}~-*v+YtY1?E!=+c> zYz#D?vt2QdfU4uh)T)|b_shqc6!v&dNpY`jU-cn>l;4D->%+BG*;&mzz6_=LPpXm4 z^dV1eLHh0VXplvDkH+i89*sjNapX~*8apJ#sk7i-PXTfx<_^ZAjk{2FIDfV5+~N%y zXX47q03sgXTkiZn0sB)7^RhuH{56Vj5!+wr)5>bdcj`3+cY50qQXX_=BY;7yFS%R;%MPtwM30)PH~Wu43sgXksuGRq^ije$2~=4eG~? z0KVRQKgcaruqLPGG}N^4WY!X!K`_h<#7CmVziG0tY?rU(t7wsmdwjooHj_g%U$>z? zJiUFzb=cY{2=_2rHsGU`wdC zY1h#wg4%OD&u^&F&$NiTk07lx9_}l9&y!voc}BnFCv@@d$vDvacM2! zFZeg6X^s;Lpm@8(j_H%6Nxng_$sT;$T6=#8<-VEtYnmYJ&)T12^x}Pb5d?0U<))$O zJZ8}PM`!HDE0lJ zXYHaZbmMUFMIw8WeEX=4J9;JUB?+Fr!zSaAZAvwpBP4ijn;lu5dejBqLOvkD9~ZJ2?dCuIpwSwJV%oTZJKJy!YDLhV-EPerY+i&-6^Q_7~)8-KnKAkWb=sacaM%VkM_m z+&(ByGul4b-;HfQOzYg;{EnF_q;5q{bF644(l&k5&p0Zy^>&*`1C}>i zzvjj*Gg}Us5fnVMU&U3we99(w=X_h&PXl(X_ddkrh}4A#7TVHbh@NYtBsGEIiVI?@ z#8k2n;xi4fj!bwCck}(9#eJ9Fu-p%yeJ@p7f5Y;2dwAbHk28x91RY9bvG)}vq(_xq7XNTZvE9^LJC%Q`fd{4~Vz@4EVm&qc~xlYhuNME5O+G|q^ z5B^zQDl2+k&4iLExb9>8(fq*W1ho|+XtosF32|T}4;`aeWG%33i3;SFi z_d_p)&yy}kJUz|99fo!UsjRmF)5?cr8GIwvOqXGG7E#WqTzGump!RpYWb z_0kOE;1{W7TNHzYnxzBFaV^H6+9ns%T`5=Cc9}Cpwp=!C3jBg%Ej}@NA95mXqvvlyo}d z-g-Oxd*!X0+*QpK5S6D$5Kc>sBotayl_^B(=yA&)f7{aI71h=x=c`;l$dSA7KstykwQW0Ii%`g?c_TDxd z-;!#uYZ~foQo2}vgw(^rZ(t4_pmK{+u*>Z6Y-1psxJ7zr)jm4SH&ykEkME_m?6EpR z#}6ncoLn4&EbdDt8jMrs^a{8;$v?cnD$w$UE!92oea2aPw^a60jiashjveE?1vu^_S_kH?Y%S_>{)uQHCpXJcj(ww z`>}^(FE!E{+CF3tAG_KXAvpzJSp_f$2RHjFtkEz1EIYFUrGK zG_8*1e7bQsGFb@~7dQ!98K!kCi845cwh$N&e=wR9Y^vkTmV%>hLJ7Tar z>CvX{w@EO{dI!CbI|G;(K=v~(;)A2{#?U^Xr;V1VfH2jb>KP2Sdu(BC5!Lhe0+&jA zY-m~wdu$B$w8$adLgwTSY-J1^6O9_&*N#D6>hinzB6smJn*9kI-3|I002vHxv(Y_z z5QV!y-LG;0L%X4_cm8?r|GF2NdSs=sDLj ze$%^0NS?_M(8;*yB0`OAyhfk?q9@+=u`32}w)@(R9X2X&n|9hAflbY_IfMN2KR_rW zl>jr}>4EcFn`?6JJoH2}8)sJ#rZaXPSJBE_xOGD3zvMC$$&@9(2C=|vRC%&Z{Mj9L zEB-8}tSjxNj_juodNW-m>ZnpP-HecSjHQ*1>bjV;n8<_8_GOP` ze;HY1%teVudnvP)v5!Z0@aL24`5qM5{rFWSKc4bMHZbISZL*QkM%f=?dcY3ttR2&ZD&ley-aIP#;sH< zQRTc#?B$q&*iOg@pyUlyYzhAB$P9YKvdmv=-6pg(z9UfR~ylb7PzG+VG>0_om&)ct57#FO+K-Fp(K{ zci@v@qSJlH$DJ7M>9$ZouaJQk`r|#a7bs;#fgeY4Z<|dh=HM^-4eYY;0^Xjz7C#qe zuZ_ye?}XT49ay>9E!EnnrRWp*|ufBiB=KHhh%L7+TUZ>bM|)5tsyf`GQc~3!**ZBF3a0f$^BwT{3W|( zdAjkgRLeTft68{C^_Psc@#y-YDx}w;j%qtRn$C(u;mkC{hGucH6@1s#BG^1fn{D5A z2>VG21SL-KW)J!^kcfhQaYK5IeW*Y**{_S>{l6rru!>H)bg4NOpMECaz`3CoABfbw zEWzaK<@Qq6-e2F?V_)Iy7vL8PV(&)kCnNQ5=dC$-yoc=ZoH_}Rxo?-n>^ixh%1}hu z9wr3(i0YH|_Qh^VoT{-yfTG*y^9v2+D0^N)ugLZAFG>LZw=VOI;1bC^T4UrLk}#@g ztFs7gC+Nc`4Qc$b81FmUc-%E?FL77z?|;Dw>fFn8uBdzPR4D~w2mZeu!`H(8of^=8C1qf7)4hqH(%C~#sNpgoqy1x~b^ z*=h6>mTEsUT2y+PY<-1FyX5Uu(Y8V`6JfP*x1vkxU&c#1z! z!2lQuS_JjTReTneW@2KXxmV+h|JP+749w$)m<-I1fItAk1hfDAKY@14>M|B6_}8I4 zUqYwh)q~3?jcerVBHj@Z>eWMy082$bR`;NfDu-b1^#P5i3^LZ2QPTwCz})KVfx z*ga&Q%G$B5c>i^1#rb^84P3=F^8X3j1wxvVx381T-$5K|hJ-}6p~FznSktjA77sm! zXh20P;=0Lhs@1T<7_H6O-5J`f5MkjaG$0k0dfjC!2g=)MJ{{FvSm||@V<2T=r*Z=^ ziw!Itu*m{J*Aec^?0IsY-Nj-m2Tx_*VPGhsrfD2tC6hp&#hxa9Gu^MCcYGq&j4k{h zU-4mKpY^l>%+(`5p?z31{%dwe%sxO1$(Gekw$=unef604jTByRa_Fi&u#?X$1I;fB z;uk)u(mEqjjq(NiJod#CtFd*E8OQiJce;u zan+Xn`%;%x|1#Pj?bOYB=-vS{Zm@_dmC}g_f{Kz13Sq5j2)zwWQju1IX>lvytH^JM*`&y&CDq&3bYN)nST)_-L`(ssgSic&9>dKF9Kj>hMX z=i-ji1ofDkuZbr{%&)~;Z7~Uo3VjpoqsqTqV)oTWmhP9^wNf5ZE>Y#tLnWVV#wuTH z%u@DfRPRQtv^v-(?yEtH=?LX_Y24H3q(_}OB2S^0US)}D1Np|%jBOJSp$c{;3Owb! zx5NU9m@K)<{*N=?2P{&lCmU^GnC2m86*#Y?+vRzLd5E&^$u{4M*C)^_p{)b)y}CC% z%NT7Hue`8RM=JkbuTH!qR!@T(t*9~kC~Mvu?88i^c45pfr%4WrYcpqJ&2NBg;IjxY zZ`r1$#W{@*r52Njlmh^+PCDVNy#dbUueCI7KEf*A`2^Xnf;vZ$r5<$-<7z3+NWXr$ zuMBIp>~im2ea%D5i$HmWmMEtfvSXyl!^PetC(?4TFS9V;JYK7#+sgnp3jg9&YgM%p ztx%lctaD>Zb8793CZeuAn2|EyG>yKTQSc$5H-}YCWCaH%1z?UR^Tug)wa9dHCF}J_ zn$QcX9Gr$v$Ff!ayF^B61K}_yMR$> z4(wGtfS9z{mxBIy1|yqMn|A6Q36yehqmEqJv+gF}j>&OFC5`fj2|P*45ke^*N3k>pWQLQ@n%eX8w5h%{GG6 z*j|#Sgq5>-{nn4Yt5PW$GM;UlBNu%sj-+}*^%qY>8bVGV=LsGmr|>XEzL5YoC5OlQ zYoC;R8-?ca_VuWg*_%{U>OyhA#cgN@D7neTb+7GS#={gO5+<(eN5`nltHH3x4f(g;WTz;< z403RuEd~_F$(3fe*0u%DB@(PAUS2y$$PhY5!eYTHC;qH<1$ey~5`HRfrM#$-cW93;Z^kbSS5qgx)If4lt}g ztdajG09X8|1aY^IOfjN9$PrN7F;fNf(y#z)+avcHbkOP+&cV?4EJpH23$!3{5v7sNv!<~7W|d= z=&>~7@EoXKv3{h2`92WDQ9B?(ya_{533aY%(HaZIrcldNY`T<2^{j0Y2lO3W*f_rQ zOYXDbL7KUUW14dmg0raelo-zbp{%Dr-du;6^~O;w@ty>tX40$`DE!l5<$%v?-yu5) zgtoi_;)B7F_2RG#Y=F9J$3+_6#dUKL0f!vy!ak0aw-a%aZAuK_gCkom$o8;3tS91M#si$d zgP_qhkX+zyqB;;YO(F~OCBxAxGrw}!*~4c6x!c{5{lg*m0jSgaVzine{{jBKdNay~ zNL?I?t&|H_fzP>-{~Ro5>7mjLOe%W2Pm6{hM%(z{CL+ZTbb`y86w#?m1{lLkL4BA;M?M&zm?ZRpA4$LAsP zNg5@^_V+FVMLV&uchx+&-i=rPGz<3vJrhe@nYb9cCslqD_uXR~r%~#t(&Rf^M=z25 z=S7c*m2*8DeYQGq?xz)=Z$#U}bC4(b(Q{mdKuQ>#;OKEX88MgHCHS_tJXAZ=@!z@% z*&=Y5FTG3l5U>Y`n4xs-y=F)n>WswlWLuN5)&0cln^E*jlH5&je1Z|L+DoLGd3y_f z2aHAr%0dN#OSl3YpAfkAS!3{3N;n7xZ^rB32mTIVfix<#PG1W}5=ft_JvXktc->bfZ3()Y$w4La- zkV|uL@?f6750bS1ClWRG-^VzBFD2>yOBb1%-^g7xd z*RaXgw^#q$rCv!-dnxJSDyp28ao+|?(DRUZ_C31g_grbK^2Tbj_ z^I36Q-$TuxR6hS=1vIk1w)@Kl6xxJHqf9~3dp%)p{Q}K z9)&+ngHgrUo@m0Vf;+F-Mb{aBKqs@=YeQ%+%Yo`fzNz(=pLcz9-hkU;k#uMN|1PP< zZ@MGbI!i!mDCQ`B`4dxbQDr=ruW!nv8thhZ=>P{FSA4F1Ukv-(4Vn$OTdpn3edI#? zf)~Dy!}?rY0$y8Fh0W$=+;5@Elhu%P8XsH{aH&<%;>F*`3)GO-D!b&KQQi~n4R1!d zh~}%ch?MB z8F&N~KDBDdrY}z(RYv^&;UFvspooaj12kPx&*v0MmA?kBpoM?Q<78v1-G2_*W*dh* zP^(xw#T{6;t?0Bzz4u5SEF!ME5Zz_)9?K&Mi$NGs#TZ{Z#1naeyB=pxyv^?|XHL5Z zTh9i_!o7*aXDBe7O_2^MJ>(#02ei+|XzzHekgSsUC}MS{!x)T-iwu zwbz2~&rzCaZl{N|z=v}6AlUDYSkHYZ5qwJ>a`*#^G#BrciL6BbOS{l5L`*voBac>>Uy)gWYa{XfYNbaJ^)jtOuItcOBwYG z`?)dDDXLc5MMJ9AKg@ql+HKhMKyl`A49Z@Cif_nRUA{5YEY{6r8Bs1Nrwu(A_Ep^$0kv}(~^=aoAIIuWE%H*II4`L(>VPW-Hn>1|g-ov6Q{fP(&`42c+ z`xuCe)3&AvyErjSlCnY?PxQiNy=zB%Uw2zH06{Tp zjdgA_R7RIOKx_ z?XRm1#W3*w#VOq;@w#ohfTiGjOIQVqXvG)Td&_{Uh*mW=Bjic*dpOO2;tE}w% zjdk|#`tG8WyADMMXnh02p+6~sXLv%Z?3zp2NVV;sXbv2>IMT<}j8Vts{Jfs`OpX#p z3kqHvJ@2}pkdDEo3<2dK&~U*O{e^(Rr9<{^UYmh8;|$Qx27e1aXwPicieuG z?uYn(izMNF8P(a)*U;3IlF1)8ug7y?d8~4W!a@Hdq zfLCJ2Oo8$Yq;Q|iFG+f$HE3S1>2 zPtH@oQDmw{D`s|EP0j^A#eUY(j1KkUH7D2)C2tSlU3NGDk`jjg!FqDYyz^+S`?KKD z8>z=rNs&Y2aXki!QS_HZj_X~G*ZG<9Xc(~^xks>&j0j&skH-uN&bC)0oc5wk$QQhL z+$Fz|+z{hV*pCEA-%av)kdfff>7{sLq}ac3`}PE1xB%KE(ot;}GdJ*<$?KcJpIjEVHUP);^ja>K&&^w!tX@RUI`2 z6bucRs0BXl7nGxxW8)uo@WRXVLnJd(a{ShKjwn@S|I^XV2|m5k_Q%jm7)In&J-5IL z{shAyv_;2KMD)AD+GSmY>_G4*O-M-1u6+w0a4lV3^l&&wGLohpZ#!6I&Nb<6}z}FR|=UWg-X(j-V5^@=zjSk#ZS98^`A> z9|_l>9)Y_C%DUUMDiGHm_8EkBg0OhKlLk-5L^Gq&ZBrQ5n&%D^T>sUE*9O60#ez_~~%Y1vpMDQT4th24fhrW&qahhbFvRtL7W*xt+BQSeM_~4aS9HQdLgCG4Oj}u6 ztBodaLH1&971_&d(~w=3wTCH1wAhb?*Hyil8Ex@e1OojY;qELF@Cyh%OzkH_4})q& z%*s^jcYmSN{vySn(rV8p6Es|Y(SDh+VaU0_InUC!*J+S4YdTQ)un*tO&NAs+e68wSy=k<7(};crl3OBzSDG7kNRy^ zyInOU4&vP*;K4dt9{$0VE=)1-K|0O`ukHkQQkD*Go~MAv%hG9QNTDgWyQtT;p#ItL z7VtzD^{tVpz1ysXA2xvmShIcqrg`HM@2x`L3kYsRcNIdTc>_C_Vk2kj2TesePmFpi z=Ve)OsF-&z#~#~Hv@h^%M_}bYY36w@`+Zgqdq0AQ?=E&+Z=$j9BMFw7i?sUrUDampaVt zLG)!&25_YX^VVG&Z`9E_Na(8Pe|U(#vT5ooyRe&FC1mH9dVo6yf2jZ$K&%E@tL!e7 zkLK7xc(~pUJ_O}gJ6LIV9W=mRldW-eSw6SX%GbJqqwo(bcG2?v6tedYRXQjdL`#x(Ah>yGMg2gWP{V=tn+&}N0y&agSLQ0WUj}y^yh_(i8zc4DB{TDXfM$y4y zWz)-he<&_ywoO3SS84F?lvTD^g$bT)4=27K|4LdOHSH*%ZAR6f&1gIAD+oMIbKq|` z6X&JuTz$UQMn%uV~KlW!&K+!byih8uC{0q;PZ$+)GGmp_|GTA5@-e zqw=68;>g1L{oFsqofqZZpC@J<)}Lb=o0zB%_wDSnM!d1>IxMn{&t$vE##46s4qMUf z9S@0g=pFBZ_T%AiS-Jfl5Q8tD-C#*Y#DqP7l21|VP5^Nn`+Kx_eAS0YdgiaP1HQ(a zkc|c4$~*QP8tynD6yFvQ%ppqBnwyw$(h|Y<;vx(Elf0rrtI`@CvS)7CTgF*Oq2X5T z=j+aq*J>R{#H1hKR{rm(k!7XBIPmK*IB#YS@BH<8e(qG;(1GSl&kqO7L@REJj$toVm*h)}K2VWPhT_>g?{{%Ntjqr)%XWE$>BKbVGbTmbAbfU;B zN5!)mb&%unW*8*?(Dt$%i@Zjx=Aku#Kwd#LR#7cHD4|SsBC!@t{AZ7i+H7}{uHIPO zSm?T+BB@tQ=PC4_u5PRDSc{AI)w5mXty)Psxz|}Zt>Gynz1m@oG5bcZU9Tl|KfZP? z-+5r*)TR56aP%vP(s{d~QEv*I&XNRa0re6e2ULr4B|bjgnM52M{bYRcpP-}`0M1|L z^b0Y1Wa~Lh$kn4qAw%crE!J3`i_t3AZP};2yJv_)F$d2WonkATkkS-)kyowm5$ z-e~RSG!LET&i?Ws`~mw)uR1Gl>9Qt~a)3+JED3@g@(uyFU{17hUm{&{2M; zo@-bFswn_@#v-H2DZRIm+bj15kS`nVBRKrHXo~=C&iAqQVc6%rrL%Js;FHlkdIzkeo6RM{L=Z6S3*(P-? zevLuiMG0FMi`0J)`XW{~MpxiTl9VdXhB!A#q#^*?fW1c z_+a?wBF3S_BGspJpfj!(k;nzk2Fq=$>$fd!+S?G^pWy5W0(x8+1dat}uEJs6pC!#` zC)a_l|3^}YE5g|@Jhsj1#BBXo-6-6^Hp^tga|3j`rLbCtfMa_M0UtT3OoZfh4J{&h z8^dtyBo&wB@P0I8UuRxF*3xQyfpsU}^f~|i30n727(OO{ut0n*%_Pkb@8IXc;Anjc z7A9ievGI0|=7QptypE=k=AzQd4jujlFkVsZ<3;ja#N^L8zFs4#jmY;Sh;{ONUy6>u zMBcxI=KHdCN0FL)M^6Wcr)o~5t15Eup14HALU}4LA2ND5eY84?F@H){|_ zg_m`lJ5`*KQsJc^?^CCqkj75#TXfA^LbY`qlNj=Kup@MA5-SM{n34&08!YJn((dGB zT~hY4R(zW4J82tDEC?$#dtI)#HEV}9rJ8LUCaKpqO0aGLXP@1ytuIFhUGLM;+ZE#) z_>of-a;IbPoE=>sXyxFauusqops|7LDTE!k=h4G>obB~e9?xfK8*JI2HQT7XMNQcs z@uS}l+9)1f3cs(N(ywn7S=9}~@g6_tD`I(NTjO#b+*v}kVT~@blJ%p#iQD6?d^SHz z=uR(Waddn<{0sf7F`jZD$UPF&-Jxfn&B)MdyvyFBJtZqqMX7qUr^NQF<7bSKrvI}6 zU*SB>92gDCS^U`v@%e^EWp`&hzJYQI*lxU+QeofKt$QCJr?-s~nwD-wAm@*M=>4ca zt6L)Q@5(&gv)x*(FZp>>7{!XbLfYv$_(*U~`-Z$GLPAfcT&PM-p^No2N+$8ynhop8 z_NGBIKS9x}k_6C@xp6ta=D1fh+iQ9IriA^p{V-dAGwR2ddqL5ayd_FgLThYIEz*0O zo|2^r+tw8vI`u{Fx6ltn3eBaKriAEQ4MNP|iHMhPKn5&a!p-MkdMG!`eB-+iP69dSs(mmF*|Gmh^Bphb|Ul4)r@ZnNKXa z{P8M6RS)Jcf!BKGZnKYNEw^6fRyNQjV&3J89UQYgmZ8gaR4nL1MbFJz8#Qs|xwiY* z0Bs&=1Xq^ZlYa2Wc*OAkW9-f2_Mq*MOzklYLLez3BJQ6-${;&vQPaW3Q>Lx);7D9{~{8qZEIl*`M#dp zjKYX1v(wiA=a=|H(~=Z4g$yJ9OrF$-l*XX~p%++_^;U!M4`COH z1=?@&W@ObIje_h>>jk8IvDaIhFNg+U{8zx{mN(ir^7bDD^zYhl)9rCSS81cy$ka^) zT_`t@$kIG7_G9QBWEM(^BUORI1jZ03A9ip>ICTxeR*K1>RHJ3(;>zk?UYod_{nk?W zMUs1pHuaUCtL29ok+l)Az)v+!3zl;%@~PWq4UP>$Pc+ zc5htQtT(VL?s+!TMe8~x-|bdYZ2Xf~ORR990^r^?Hk!KrGizi}aJd=~r(%kAbi_ z^0r~7eZ=}LjUKUU)5iputR2!9rtQcXt@eA!J}wEJ@LQ(yM#S`YkE! zQ{Twqxb||W6TUYi12SQu*qD#q*{zz%fX|`ni+Y(dl*QE7!O^yop1|mE{F6Ukag_|% z`Gp+C=e)hZdd+}6+|O8JndJNr5IzomA6xGRJOWnKsxVhXr#NP*$i04v(~RYM?bM^`Lw;D9Tax>TvbCQUV};-FAJq}eG^xEj;{3Tmcl3s zAP3RvA#^ksW0wM-ui!L;?)(1Vgm)%d{q`Myd&K&PvFC<2C4~>DcF!w@q(u*P2!jbEH#jKuF#@~Yr%G6RVJ@NC zz0)X+sJv5*EJs+#Ul$m=Pl!nyKCzE6v^=R|w3UyT%6LMy*&c5eym$osY_&d!1F6O* z)7GW_Ioc8H^cQY6fT;|6M+9JCTZY+Y@UN zz@SxjyU$bcGUE}-`^cSUb|(9A+8!LTTC66PwO+JU1A?}5D(pC>8eXMfyOxiI_C4DiGT*Ynu60p< z@=Ch#my6vl%QKS23~L4?Zyugvl_cFP7cwk*dF7NY;h)j|g>RFVW3AqCs)u($@XKqQ z-@;K6_H^L)n>Ma1u9k!*hy`?riR_^OWE6*ZVqQC(D|g_}uEqJ!X|t>O(T3h`dul(@lnT(l0H5`tV%zN2MmsofIpWL)QZ2aME^o}k zjambR3{fkojygV#tlRV~iO2Kyd@T_6qX4LfkXEz~wRa7Z_65cbdKCw?&iG(^MdSBR z@k_}mVq1N;tMmapy`;TREE-EfyhO#K%fSlSXCA7rxAvjdtGNqZ5trD zUV%LGR>}K_^Xv_kic096w3Yp&*&5EELAiSzCQJoXJkw|R&&S|XzbFe<_A9!8qOQqZ zL$k07k46q^4t7$1(qoa?_Lcycz0k+Q;OP-?y~-VO(TE8vjH=4G)aKpiHTFlp)RxAO z4TOH|pF7dtrTudl(USFF^oD%$VJiuS41?(n+1Zz5AP>+jJy)%_coRZPF z#maROGct+WVivDKy!#08bbwZ?g}6Wq)jyY8@&mM=L1e*cNTB-EBjR~ z;rmw*rM=UZPFbk@#v}WP^~kaT=WCMs!KW^vccxrEDd;l8o0zbtu+z&5Ow|zg%B?m6 znB>p@2O=sqYMn;OUC1%id5Qa`CE%J(&{N9Z!dB>erdoD74`prPa`=(D9Nv5`J()w@ zx4In8NbhLegOWoCs}E}1YOUKmB$=i@uD9fIh5rqKz6mSG>juylqLTJ&&kX+n+Y6BI zOdD6JoeEj^L~JAXJc&w`@}z1Zo&|;V@M38Db}P%bnI0)k`J#-Z`fq($$O(N+tqb@D zH2~0sOI+8BP}{SF89$8K+2QOI?0ZThuhK4&tRq=j>L$R%xM8d7j)Pe&gL)DA{K7zyODiYmyP*u!GZ zuw9E9poeyS^4xQI?pXs{q7Cs@^%(wo*5$a9JQz8yM2WnTe+1vLg*D^Y&y9UKtIm6z zHNiF`kW+f?RV7X#Urf;Z;_2e7P5kDiT~_I*S2bSHa~lE2DQCzbFR8Uulf4(&qYY%u z_T0@?;H%W}F+4;fVNKovUfnp2XCiA@73QT{3Km+K;tn=ZTVk?^c~)Y+EOh9p!{M_s zQa%`mLms{(Cf@ZKN?g0xH~Im&M|EMG)3I@Ga*jW$bP4FDV4m^HlkBY6J1u5VKk2eQ z+)in3q`o%xNu`{ZAX7Rc0?1xaVqeK<7xxW>9*Fjz5beHJY-ypC^8}2>pKQrf$Wn$h zhgOtaNRdvDi+M8Rj9mm`6?omQ@vu5P(%aZ?RQesMbfLc*Q&pvknl|C6$Lc$M4tk^q zBH5}#X%>_wU&@pM1cr5p6Z8Cqixh5+$ahD|7&hxN-b2H5IvN6Z1!+UrWX@)K>8fO< z0{~6PY7hE+jih=~+P>^D$MgHC`=fFwVYm!|KBC3Gn`gg{=v@qNTM9TQ<(qL0*aOvU z*@6S9{|vJOyCQ%)*unLTfOs}Y!q8kFcjSyB#wOOn_sqhhd{v=VNe+3KD8`0c*+)2E z^KlyN(@!qLNxR>ha>fJnTo9vpZoe8pb8+?u5jN_Y1SDHU;W~K9RfJfhJtbVKUem

xRk|`9Uf2CT0Ke@PL9#KzvXS*Ji4ZKqWAN*r9OR2BD|jiuOCz%cpSC~%4j6*mz1=Nuq_MOs0z zK6X`tvxoMb5hA#+LVShl-Q&LM?%=Cp6myBk8*^z|Ro+xcDY(iaZ}o67u%f+?n|9kF zT(~Oo2qjKQ@3gCq>s8)q&5n_%`9tbx7lB6$E=$-;G}*q@fqf{l`|q&(Dl1LrK|Rtd znpMBdM{!$1$yznl(}CpzUWwu2u9&@1N5Xg-3yA1QNQcmBLoC~V5X#}&5q66tyDZ10 zB%Urd*jt^@SFs2Rtd4dU6;9*qVzY91@&l>hyFMQl#=x3M|D#6DafF?A$V|8lbRqnt zEZcp3Llzd41>E*XxRPLv?exg@j_gNpKWl%+g01dFI^BY)x%^ou{%0ezQLRWh_PSHu zbcNv%KcO%otS6{sLWD3B4~?T$TkSXaX9``lD>;p`0jfe^QYcKGEf&-g@*;3Gbb_e0 z_&j|=Jmq(ci}_DtF%O}1sS>rTixsMkiYoC<+YR~2fNfR^%j7F+6W{z{vjD&!7$fvWA_yF zI<7`m#c*D>I340*&1=ru(l5X^$KwIwZW4xD=2vi$T+QrPk~1jcJUPP3fMUYvMcN2c2(PmN$&HobuP;a(D)- zH0JgXR^54XkZf4GAzr;bI3rE_Ph$IdCppbiz-@Du<_$4I-t+3wiR_AiExZC{V!M4t9El$#?=o930aFCfi3g{tXp?%!{pfQATW3~TqBRx)VYt zY@I*I%Sgd|{@N&ECH$%iZ0g(Af{*Ic@=h>eU9E?T=~E)R3jiR~bh@_u*b6G13ubs>af zR}Z3r54~*r7W0yTaeu;Kb4AKabciL138rr(Zz+`+hU))=YKC^uyuwo)jBI?KaHc(4 z?vHUO;_*S1eVV%Xh3G^J5qvs>bR-DUB^rbLvJ#bXvgkyZ6MNU*9Z9M<1H$%b?6)$< z5x^g30$c=Bz?9eyo|w?SQDf|MEY0z3eibvw#s~fm^T^4Ojj{G;>~bCgmSawHsnZLB6G+u_cO_g)cq(yCXtpY9Frv! zc->xSodEhx##Xcem65vrRuH}}LN-aJF) zhrst${q{vQ-~9!fa6`&2@R4VN%{)9mhhk&iE-78E3Rzd&cGd(Fx;hC@dOTDwZ_c(V z5nXFP159PR1e*(+kc^Rqlh6s}7*T0?DNjT#V+zRMJUgqqq%&tNh$F-Th(qy8ro%tts`V- zw`jWjg?1a2h4zwDc&#JOyji8G_o&M#w3}*wJx;766Ao6N?^*$GZ%H)RWqJF3)VU&R zLA2qqblr^~)lQqz-eDb0LBh48IIpVRd~1WAMdUlhSxBV3;O`J}IuiI1tW%905J&AT zJ}?t!V<)(n-w-p}qxM$Bz1j}%^(5tCdsmwfV{^v=IKE^j+M{?*vd|o4Z^;2Wt`oWu zh9b4T0OH4DE8Xn{nCk5in>&=BZ5zT`rZVyBesAf$@!;!KKI%Sz zaX1d)K2UErkcY+Pid=t{wkAb0-ddOA*AisbfDUhMeP9)KHl>RTcd5;2Bt$@AlM2#D zueBex5lxiZzJqdcuPsDCA*!Wl(O*TNkHVt=6R<2;bmkhYOJ!NP5L6g>OA7nWP{wh* z0UlF&M`Wku?9?vXT@ej9DMTi7{79Up;NdHSAtO+KEkv*JTyvbMJmxIE5`;6@ zp$-4tA$;QF6a(yaEO}oF8YJWcu=hh=02*p=Z3l;j%Bdt@xk8rKy0)2su9_d}$Ws8| z*O0HU2*4h#BOpb`Vk~@$<7#9OwRgV!@HZeMVWqQr`2kYNxi-_C{PSoHPJYm}`z0q| z8;&8Lh8ZjUkO)yG>o6CsRPeIh_P(dLj{y z?0ADjoxfGWD^%p=(6%VP8xyS_^)j<8_Uk)Gw%Fq3{M{(Ma~f6=($)hviT7>NaIHKA zN976!0rM^c@k^+kdZIQ%zL-JkOYNmWG8%icP_P~2@30AtdJo6+FIyr|HN#z<7HVI# zn|Z@cJ-^EvZr>Ff2lY!B5jxA5VggfSASQP&Q~-xGF+=c;$1Peade zia*2t@iX|m5Pa0y%YQgFaUg>4*n~G3svkp%dJgILHu_oXM_Oe_SMlD_iXa2A{|?uq zz8*F8+b<&#{@=*J&anP?SALy4|4(H8dnmxS=_U65O6^mu2Y^yIr^tS~)PE|&w@Thd zxhPk>aHd*=2J|51MlE-Su=zsWo4C)EyqrjDc|JfiI<28^I`D-o}ip(ekjk+wT9&>==gb;?J`um(&?F#RZRaoAJyObD{lcXg@t+r{(QS?%(dF-UZ=^0a>l= z)h^m@Q9fw@(P4Xc@B^*{jls`foD6Zt(-gb?cN;Tg~GXn&P22qH04a65&;UY{naM-{vVN?i~~Kw3i(Doto1sCyar z2ltb4K0k%uJ(YetDq`fSkv+(Itp@yG9?mmwG3*|oF8iL32E3cM@Aypcsdf`}@yy^* zLK8ZSJDLYOxOv&42jeN1A(Tw_+Z*o4gT+9_ka8}i1;mO_M8yMZ{rbOg#YKp9ZI)%+Quq-u+5$qLU|1=$rUBv z4~vb4g}&Y-+p(HH4)(j)Bei_-yU50o(4P;C&#vh#cmSWHLF8#CC&Ve$s#t}wvHG9x zq(2j@f55HabqSMMH8}+IYrI6#map!R{M#1HzlaWvSp!=dG)%)uo~^6f+Ic2G4QxN_ zu5UOww)!dr3(olVfPDtS1!uek$*L)-;g;_Q&sa(T)75CF=WSCcGhAbvvkZuGi$O7u z+HJXI&v+K>|F>SrjN#MDEyIT)vQ4`mY3vO`0r)!x3jwtJOb3E`>&?~S{AAA(NI3!dG8>n)4}BYr*)tVBu@^IN&R|6n86 z?(pPmi7G91{E9kR3d>U+n}u<)$@7+VE_=!@?9K zzq5uRXv+Idf#!1{Y(bjqou)oZ!IqgJ}bZmF`*5H0LF z%F6j`Df?T?N07ITnD%h1Jhifnp9SGGwVp7Ca?eTtnQeCT(#S)&k+fruTN1!SNx=4FHCH)mYIKvLFM~PX_ z<85a%CA*=jLP|RPZqB~3#s0Q((p>0OqPK>awGM+XUp*`(T?|?l^!F=i`@W2o11@P4 z@&Lu{+W{_ZR*~qE$wGEU(5sXssM9VdA+bj(V4aD%ey79Ei)^(Ji2qTz3RoKltEXid zC$$SQJ?D1tE?tR2_r`pUM549`@FWTFJ)(S$YK5@rVu+ZY78pss+85KlA(r7J{Tl&% z_MXZb>%wy3Gx@?I>EMo#UdoiSNZ+4f+yQtR#Q3_9oK-o{o&;`Tfsj|tz}YJje&4eP zzg)G-%Fm0!!pv4;rwk|yN{K_7YVUbSUcuJ)>gRGcYPGK`*tPY7i0D(>wuUY)s2Ob{ zB3LK;G+7RBr!0J>p3vS#X8s=O*xrr0VIIfh#XyXu1?8fEddeJxaaZSW8>zOI7Q|aR z&T=Yi_Uu^hAk>`W%{umKHoHe}qZ? zkWlN_{r0qiu=g42L#cN`A4ta(g5JlUt>M%2z$D%tU2FHG<1j2nTPC3CI?9~tkP?Z( z`=GtdI^9diyuLGmWDgI*h79u<;_{iq&`Mw?ASavS80SIkFGx{N6g)cEdSm?2tlb~VMBVre$j6~pV49;;Eb~n z{12v6-l;8dCdwmm;gVsGbd*r(OdN#p6MUMn6G!$%CGStP z78p)rOEDdR?3&mqt00~rb6Y|v-bTddM{I*yw>sIk$7F{FTIFC&y!GaSTK^>WOlnDk zG-rG<31gPIBGK*97u6(|RTMhXF6NEGBr_(vbqhwK)BXwZ2VfGu%>yV8&+|^+Xl!;YLMLvuJtR?f=uHgA*dzuu;> zC(x(ci0zx0qDskvQ763vS)Wf&;CmcsqYEv75C4*S$EO(1Pw~)i+vSO#bIa+yyBkkD z6;Iq6d*TvB+Y@EQ_Ldd%;_&YFw?R4-Ht{rnCq>$W20T9a-x6+_lTpv}u7n(Oja&0q zMYf54_}3h5InTK~hxmGk@KUW9{(gbUD~H=L@jrB-skJzaNwA<2(cTSf9_7 zEmI$SnBF5z@GVPL1G%-`VQ`O+tGFe~;;2I+Jqb&x$t|q+-Jl4#s~N5K5d`1D34%bc z4B4$P_zUo2Q{FlPqBw!AB*!_RDA2eUY9|6HriG@(ahB@A^gTfE>lpU~sRx%rGl3T0 z;0~J9j#C@_gUPH>i<(!%Kc|9ly2TlMzEgXDptgcu5&y3*fhW5UD0?E4p47q?IY*3# z<rL^9>QD# zz0c7nFm6LUguc?%_{Sj>Nl>=(>~SnzK^VMC2VR*$!T#gU0+Lh9I}v?2kHmIgWj zM1!svL@RYTQ6{QPHyJPnjwhnh8|A)g?ScWjCbIt`or)5Z8|=0sg1i)U{v9baxzro^ z3!<6K_4F+(^iRWZy2s(TN~@J{eIV%cJi^8|Yw7g(GwO1X_7TLM3+SX&Ob>EiMMJ#a z!E;Hk6p&0NSL3u6$0^lyVtY3~A>6=a9Q#5Yg1{gQD&AlzHJsQ?qW}lBYE3rPC1neCaMG~q!4dZiG znev5VaVABh8k+sp4z)C?LWk#?i++Dp%V?!g%5;5Iqm(@lLAqr~&l4F%A=-ubnZOO)y zb`F_I-FHCL&)@`8zwL?cwAR*16~0vzc5M#qf$QhxiPWaDM2XkT{XpN;wM zo5Wn&f9PQG;ozeV78eTMG-t6o&vsH1$Re)<&fdft*vT*Jw~Fmnxhb}D_*SvqO15R} zb9DPK!B-p4r2=g@ZZMnZ`XSPZL$Pz`5_|MHPQJl$a%s5+a_iLA^@irMJxWW3g9Xb# z%ud(j;vF3Yw+-36L9FFiq>%#3RgJ;N(8BCc`3#L9$GcI#;*?()Cm^BwC0O+5bcVSicok(uOE)g)I@zjMjp`h>CgWML*_e2f#)``%zs32lv z?jRIhi!j6$k=KfRo@ca~^IjwQ`iF?f3DL-4MR0A5lsLgK*$o@?)Z^wKbS~3ePMtP{ z;+%RQ&D@3rh~|KgDHI=T7xn6u<;3^bG!TJ{$Ku3jCr}2poi!I>RL0o5(3a4?3FJUv z=+L@nUK;Hd$G@B?u@OYr{q`R^*jbsFd@~1!P$Uum#SA+H-X`^CMB-fhX;*4kaLQRU zzU|dv7|}O8!)^gcISNqyIB)NAj7Tb;`1RMnKbm!=h0d;Ns4^7*l55VPtP0Z+8-0J+ zzEpcv^Yv~;BQBk2#|Zc?*+M5*JImA8(E^($ee#mhv=rE2h)!+BmJL?F)uumSWhrTP z@-6{m-sc3rk2XI_^H8I$qJI<$OGnyLs@1V@tsjR~;AW+LTuZU>EynzN)m+lPp zG{SO7&Zy?m=F{el*uD=*wJ(P5gY00SK%RLh6wee?dfa>|0(Bd42Nc;BegyH@@qW;Q z;U?`0XZc8e9XU5I;A5&%(sH}kt=eoL(YQUAtUH3s{K~LrVpAupttGiyy3i%;e{`0> z7+VhMVKpMHPxjXV%QV^xcyf&nCIGwcX+*KPp6Md75W=$ zp?-oKSqAW5VAA_^b-kn=V)HQaO)OpD^@OLmJ&RBO0VP#<)Z$2RjolXev9CFn6uS9- z??C8n*5N>CV0$fcUK5|9Vq&BDN( z2@%~HM0CLxg1e6zt*L>h1oNw^Bk-sI3=0L|J~EL(i;|y8s{MTTI(R>WnZ|sf@S`yq zMJSU3-cYIm&bL9o57TPzSHW)fFSOZbiCT+`hoE|S;SGr44;%r{{T&pS1ZuH9uhfRbNlOb7xp2sX} zZ0{qAJobHFoIaLG_E_3iVxkhBr3gl*7(&#BGxjk3H6lN3$kSM-gNWA(Y08>H#6pz| zgI)rM5uO@5P=a2Pvqx4JbI^G{RB|hf%0P3muBSEUV+fWp23iC=%FbWCjwQJ2=@BGe zAK}!dr(pk*-b9rhB8aWBq&5uG@F%SF2BIvF*0mq9c0o&IUvCnna~oDz&1773r9D|M zUsXYK_1i?AAKDjBqEU|*Q2**u_Auv$7y0;gYGGBggW|zhJ}+A`hfEl%N!= zeCNd25`?L?%Z7=KIeR|pD$KTC>0Iv(TqmdR<5gAWu0jzBR%>jZh8&jh8>>4d2zFX5 z`F&;cTs1g~-1^f+#H6~M8pHNS+PSOs>VB@AN{b$Vr* z_<|U)xCGiivWa;+SJl2pXbS04W3}lE4wIg*B$cT@RAt(La&cM zL#+4lG6Eigil5!@55b+jqF?`}zr=1ZVJKgjmFM?=PRP_0>+J5)6Kqzo?}5O7k73oy zTNQSLz6|jmxuR|5>$jjov5!;OO4DA3CI>q}(CS#_XdQ}2%jmz@gq**JjsJlC=eYDo zZQ9L6Ksl|ADm#*^Ote3B*xO3cPDF-wGl~5s!i7cJ6!%0iXa!s3kz%c9G&oEgw$-&W9JnK% zY_g*Be<*5m*ku9bAWeC(c$<%2tT=Vca9Z06q!OQ(6<365wf!C*xotpqhjNoAo!X;g zYD1|jA1s_@;{;S4^wSiw9_ooWP`9LeHNs6AijN9~P0`)&BivYbwTSL;ja|$XJl{RN z0kWI>>Zs@ppXt34Wj)Dn7ko}uy?c^9u}u9Ng_+(O-Wugr|Hg4}8GPp>K`?T-U1>Gx zZT4ujJ3)|CaAnDo+JQd)ySbEa>NZAgltBHMc-)_Ok2~-_knCe|ImNXL<2BV93Ywat zqH?WUww`rkjN;05mo;{|Hv0;DM_eja^~TO@w!%~-I?=>Uv7VHb_u9BB*vv3jyH!1x zLoj{6#If2haV~>_PZu^!7~D<)c$yW_*#U~biL-VVvJqLpC~%ju3btWz`) zS4G}%##RwjNQ{dne5{&2$6&vjySuvWC3R|@41#*6j5o1)qrcV(M87u6D zc*xbVLng-fAa--GnDbh@RxPNP;n4PG4}9nF2(^GTcqXFki@8c`Cxl{H+m$z@BCk2s z_d-gM>H)}gk8O3uA$4liNn+9zyWe{0&J&nu6?kKpWI9e8R>cW+Ko-Vjj90h|uHt89 zr&g&~inL?r3_DETu>(@HpdC%~QI`sPunrulq-}IR>>}&v?ntI(l6PXR;v=fXXHiP{ z9~`wHL=`|tx9WYqg7kYOLs^E+gPHJDqZtJ&uWRNE~q4p6O7Up>O4CwGXb};95 z&b1?#vQpM*E#UtRHkDTMl-=Et6jZt%Cf<~^?-GUmg(5sb=hYAbsn%6nC}5({)ZmFh z>X8VbgZr?x5YFB zmJ(>TBk9BXY87$xbYPUq2|6%J)C#EA*20=+$U11Sd?%LNkDVpP7AWLLBjfg(C#r;e=BJu#(i^YwWnf-B#Sv z4%&FA2>Iw5(OZu7!H(m^RRx;S?$0N7ZQ?S)P zAofV9we$sVD;}z4msoW_(aFy!Wb+uMwoev#iw!w-G}-(Q`9Vs-mJ2%vK4W1g=wHAK zU>A_nq;yBmM*Ag zrLPwMyE+T7!V#QWf`tRI(@WWCk8=v!_GiWy<)IX~h)}<8CW17VzWRS%V$bN1NiOag zyv4b#W3tLE&U8BSJlK_*&}XcYZ1VHPSrBJ#4qu)|xdjmpH5FBmQp#QvU6-m&p$wv% zKp;LNL$=%&a?rF1j6gQqqRD$smSsJ)m_~n#;PR)9_M^Pr=jH2McQS^;3;t;;DW!(Z z5cSg4vfn!gbZ`+-%*nPtiIqGv#(PE~_OP;TQgO$@lZ;s2*H_ZfMhBblwRrfm%b9!w z|HF`f^5F7^R4NEA|JMz?;Ev?aoq#3af}wW|i(RZ!FC$dL3v^Q9t+Ts&`PRa4YXqSS zTWnt5j`iW~Cz%H8@g4ToMstk1jvYEtYntk$b6w$a;kIs1FYk*a60Uto+A@}KYYf)*sY2|wqnw9+?EK%YhS!R z+^FR&v(=8@#2>*n)T?-%B(9~8Y+L*c5nTmo8^53`fo*%Tk%i8g6`&@^z{kH}-D1PO ziDyW2BsA}MDWZO={j>|q7A(6@#i-sDTQ*uo)p5AH)hCgka@2cXgB@PTqI?rCpA)AP z6aXfP?_T&}Ek&G8w+s{?0xye!Q^8SOk1Xmt3~Lkv33loKk1!i$EE8I0r8LXqbJW}x zteN*suJ2~}kDUeFjGy0RJ0b%Q#7cfC7Ojs?1y}P8v6{a?#r9)r?)bV+YXrYm+K6A% z;pS)Ay`DszmZbYrAJ_Gnn)(7o(9-?c{t zvOUp_QTGh;&?15mhTgdQM0T}z=&4(1zNUe_jf?`V*pLz0GsYflK>VwChcdf%!1~z~ zm8#Do$R3EEfpCcPeKh=n6tcLn9;{HB-psgVdRQo`N`SC0_D?5>I;HJ=R67~=6V_LU zMH~PhK1^k=VADZSiuzuTdr`UpI|P?b-e_fQK&$$wSl@r_Dlm@H(GZZr_O538Y;UN8 zuv>OmhmO?mW5*>lClTzNl@P9#dV>;Yn-}PO@pmG-4hKdQxgSP(1V~^};CCkkUqa@V zx3dJ1M)rfF?T?iE5PJD?z+K^RzQ#{GxBm*s@6*8b(>gx>G~VE_L^6+kL)LpiNmtj0 z%I+v8UYuw?6t>Q#T~}kU-)!UmC=7|*%u2xuu9B4RBz%YELDaljDFAPF6-{`=&_^4n>*=n7oKzXO!BT?g;k24-4z5X8wxz-)9&mTDu|8+_1n##J+oHex8%PfP#-(88K>TfxgOt zgBMU4d|8S8Wf00h_{y*|u)M~Sy}33)VaK;P5T53=Ws5g#_^t~0SZvr3dQb+Z2}!Mr zP!?8)i{#^p-uQ<&WD2kXsoyLzu&8}+2pB_8&n9^B9vc2HJ5UJ144Oq++I`}QuK*F7 zfbMJLX(_+Xy9{X_w(dHfaVFS59sds~UO}J9+&cL?vG*E-?orW%*|T`;-C#Bq&ChIy z5gq2VkH>9Gp_|3-RvXh}r}w5kv$iK?!wAKRUOvHsE%f$EQlDEHb*eqL%5GYMHruQw z?%pEJ0!9-yyJ{S?o+e~B57^NzE|!-u63KM?j`(B$Ed&)(<}`eZ`U^I^3%%hc5t^8viufF2Y|u< z1}2c1uM3+R0+LX<;t{4d?NxL*NuphA%>y3L6@Xp^ zecmU0)bJq0ZT82akT$G@3wkwzeqKUij!nZ5*ks^8#Jr(TH~aoJB;@bY_4)b64an;i z-thllve9w8J&tpo<8Y9QJ_d2X;lIu7$S4LxkabG6 z*(R$xPsg6haZn9>*MoyrpX!41b7|#PuKZRUb0S=CL;P7z{MVE167AE7^9s~!RH=>V zx4fmJkzeGwUNs>4lH! zzQgIBDY^@6rnhthe{N2Wm)=a!Of2&)soi+%Z7sD8fTB-={t|xycsIiQ%6z|)?HKhg z7V71)U{r03gq;S%2SHId$xK%#%c4r{+TKj7?Lx%-I`n_RpJHFd-#k3wIUrM9e=zE{M^ zFlLTL%d2wn1N5j#zSdqEu+GT7t@`b*n7MyoOeXNs*#IcMj+wh+t-ZC(ZV1NyMZ9u8 z1S=VobNnWL8(o%)(t;j52}K{(u}ga^slXy4v?{59u*6hIJW%xt>h*n;TTaY)pkJk5v}q zwKA)?0SQv7tU>(~(S-4LVCuge;iOCL!x_!C8#17c;%DnGkbUOS?Y9X#KT==uZ+xZr zivn9( z@beGx6zw_N*vkJEhi%MllX;&RKg6eGu?G15VD&C0QXSqhALWOZY~lA<(wo4;^Z&Uc zp%q&bobl>59EXk1^5rGAbiktYVQD*jMk}LOb@oaxPdd!Uy{#SE=-MvHm8`%drOYR* zGU+;0g?wZbes+rd8-$mtQ-i9l*S8MG!|iE%C^|3u81qNtj=cr~+AtTI!?x{PFl$BT z-|IBr2@4SW1QwAeHf+ic9PZFL%NttkCRx6E{9ia&oWaAfQ;Z6Mnz6K|pq$Nlpov_$ zqN%t7frj5p!x@;`nZfukNLzES0`z&%-N1)F20_HC#BXib!b5s&Tt3rLvb+PT>$P8; z{AEPL8h+CROQJh{9fEoIfeZmwt^Hn7u!Q;Kp(s^#+c@v!il!P3wWN10;;==Pz3)TV zP}a#dIXHc5%;_+bkFrm;#$G?B|9VV*wZDYjH6-{9613 z5jV78eH0H+oXo^5c4-HUY&=wONe0H1TC_1 z$H`7%%~>1KJ1lSeN`eY0(a?=eb`Rk}x6Pl@fNB*0ShgJhT~PD=f|^T~lcw}8Q&GiH zm=bJ})wKwE^=b;8e1EaOXvpA|7Ee_9%sM0@OJ{OH7s?jcl$dh$Z8W+x5c6a7LJ_pg zafyDKVaQbj*?NHa3111}l`{OO#IP7>wPwTY5Gpz>=?LfANuWTU@crW$ z)%&04soi-p)Et#r2 z5F)aiq)qGUVL+-i2_rCnGZg{W0TsMQ#(H>SL-2gH84vtQlS0?=dg|JlXE)w_l|9hL z9LdJYd%m)O@{`n`-TXtoeg%KzDUbCq(D!+)S7<2r#VnHU%@lHlL?Cdgg|6T`+_MoT zE$EKytw^mTO~lr%w&!H{jspq6BGNs9$maM)+cj@r_7Vaks<^dW#wNmAH}HhlT{7-H z1psCjEz(ju9=%wX36d`@Ad8i>i@*p9r9rAow2qw#3a~Z`3RT^x z^-hFx%WC1z8%$&$9wTj%>)K2~p)2?HwL2P|NqLEI2goTVZbu1&=px96;tDk@luMu& z%CnWiiD=-GfxN8zX8TLKf|(hiE~tbk1wPY@b5nT~TNb)b31&yFp8C1UBXZu3%GN8CW z){)0=<)@djbf;yQ5reFNzQmIga%)N6?3mJA8(5gTwa{?-v~zkX_I8NVc(u{Cv-*q| z;LWRsh8*$cWl2r9<^bHf>;xTbZA^PHVL}j-;MI|eS*sqG% zDy^5Pwik7$_toJIXX@nGNf_LsP01OxFSiLyy+dfzD%(Ld!CvcGvcmRhQj_YRK+9q9 zzMxImsu*ngHF|vvHwToBkEYrSt+`3sBm~-oyzmd{_|SMn14Z%s>IgLsL#*c`%W=e# ztxd+q`o@H41tO+H=}DrL#Hp)bpMUL4eFut)Obx=z3aL|-iDQvJsSv0|w`6Z>C8Q9z zk_lMEH?is(yMO_5-u0kCjIuT2gJ(n0=phf(iwF8rqmkCFQI+>w@UuQnLB`p*HF)3& zgV-s=H(nK{HM|=!vhx6(CSwH-8VW`EhLDHv8AoJrb21ee?F;#U$1R4Tzi}#`iKz@b z|Fq|}nr~BvFb;Dzv#ZYz&hgQcZCb1Jw>=#n;_R?7yjP=}tQjmzf%R%Pll~H;-A30m zVtQV@n*43{UO@jwG@0MEu&iN6N1>DK6|HL3<9RI?@vKkfs0F948K?uu&C(ijB?9a1`)BXk?fG~PF zjz>5P{rwWYX@+N@p_4f5fCY`nS!Hm=>#RH#&*KNwctnUz?Oo4AqC_dPogY#!*uuB` zT4C6JeaW0XnG&=@2ByB2WwtHqv2*e^p@WgeD(x~ZOQcVze$vXMHhe~EUi^>n}? z*XjiUT74A^d5S>CCyf;hvf3aLh+3!?jHU9*zg8-a6wUd_e@$7xo#D-BD|Lyu%AY}j zfu6w+h_sSJ(mK*R5JK}8^a_Z*zrhx{s%q^)G~50_GGFf{{=k4^<<&TTPNOCBwptO`QSiS#8TXINQ4`If15w8a z+3&V=i~Nbi151^8Y&mt2hRGz)8L$kencgB?Ztm z(sJzkoIF*%yDnAB-W z;$elZ;gdN<8YF+QO|Qp@&rlrQz13zvK!j4IZS@t2tD~&#ffZi{EAL)4Q-5dQjD6T| zF9&5`6uQ*@+S;%%XJ@VDk6fe~pg+LkuEdmKLqHhINxo-ejwaMu2dfPu+Ou&viR3c& z-!mA3Er(A+TM~eGUIQ#m+DPyXNjGX;V@IOos#*wAPls8c2c6X)Y)3IZdaS*V-|z3{ zC!NjZLDA7Yk3xla!)9cNF?Id}pbX&}87u+~l2ih>3&pTZE z)_kF>Ps9{gpk1zF3nD%dU&28wFD6WlOkiWkuc(eI>ZSuxid_x7Ut%@Qd>!+Xjl?Y9 ztxtB_WyECrv@jrmh&#w82xjl0m@LjQwCA(xa?$;W{gxrW1#CY{>oD`qp^kD8F&VgB zmu#B$pS5nV<`!$~RG6#k!5R|oe4%`x1H)4j4WUV|ty|2V3po9^x=cUe*g@dRUONC) zBm4}g8edltx~08%P-DxH?M*=LW7=V~_o+SX)VA^kGGp<`6Se$5dXjN5*B7G3Gf+Mq zKq^k=i?=qG8osZ&^WM^`0(TYrM2Y{vr*R`Wq6NlwM~OAbs8i}!LZ!@io_t>8s~_bw zz3Rj+^+d|UZH$04c|=ylk`&pxtg{Cw-==`Mhc_z4LS1ZKD2r{E%DZzRvpt72k1W=; zA8|ULjp;0?a21`Az5T&lFO}-@V!>r8xj6jak_!!Kqrgh5vM5fmXGwkkO#^m&gyhP1 zCTuZa%8p2?wlqU9jvdSWmNqQ?XMVOVDqYU-!?T_^deU6NV5E8w6SCH^IP>1Vr1@tk zG!rceHHf3fy~Lk!Rz-!kfT5@bZ=44#-|mL+T%1+?&dGjBWJePFKsb3-1z)O;M7EGB z2HnBVQrq<2M*H-p1r$@%J-t(t zt!h+WeQ=_#K4mK%Osdul9K>JJXjiFy+A;HWzEq|Kbl&TOvCEp+k{Eh{cRA1X8rQzR z$zH?1QB{TS49@XH;K&y*JfrhXk*63^F2l@53N(v#T4` zg?pFhTS&*P1Z@1jBK=6caC7g_!>*Njhjjym)Mxs7nR(e6&DxKGZ|uH?*|jkgWce0E zb}o?hlWx@Rg=a%n?Qbpz_ajnz2gi(+hSb?ZirSL)OQN=~4lkH}Le1MMQmdW!nu<`% zp2lwrRTC+Fh}phi&(L(KkZp;T*4dYOX*>0tlP`P&DY&Xp8-8z64?S$Xc__ywe41-h z(`48^O>L@~Y{4>ivEdWYXAWrjl(nX7LPdN)5J$Ek>Z?NfN87S^)UAPwB0pB(R&L(@|aJoBBBt%u}dG=2O_as*n2DpxxAnk+l1jyxn2Hzb zmgC5}e0YaGV>??A$Fg7m6BOY9NC+g~z>7vD$&!IKI~mx?L!3h$Nxcy)x`;^Nnn957 z1(A5Iiz}BkN?1L8^RhyYA0+mxB$(a0y32D`@HB7TRQQbLLe*|X!h#S?mW?l zT)D+`d{bc7T6`dnsfHiiV2n-FCU8i&!aO}O0?uD>)~g&?EGE3`8qh@c9~@z*A3|0+ zpG0ml!d}62cu;$hDhWxa-`A^oDIpIo>|ML6sqYTUPSbY(+fR-Z+W? z?^uYT_d+v|OA-7FkVu;S;;4ruwSxd-E7)+G_Z>YekqMrlUT%OFlqHzVubY4s%;*i> z66~&^Ue|fZKxGNYS%;Ydek!&FqkZdTWV9O0wYAuRt{i^HbN4tN*u_<#jmQ!epwP-M z!a1wXHPiUrH3)E>ZV~-SB7w2|Tz40bVjr|~qggMqZY}Zdyhcp_{1sQC8b~|tca9q@WM!Roda71pq?ytkJ^DV$spj3R(h>`|= zm2L>C`D-*L;H|-dI*^N3!S|Ms)ij1DkO3&rPXT=deP28qj8@vb?sfh7K(zPn0hj*FsS;J1YsS>>()AK;7g#yhcNZt zFiZ?WiZi-$rd7!TxHp(<L1Zz+t*}=2G|6K~IcyR@RnmUQrKS zq=?BF+Oct4k?e_b3R&|Lz3AAF>UV?%$~ zbrH8%l=%jb9r>7Lz!n7;S<6?B_M2@b_Wa8acL2`E=FtNu&Y65dn^7uq3)$1%b&GPP zQ5R=y710qstIQ~}e5J9)O1s+WY_8M3lN+G^f@na=|66u8yFv4IadIXu;$~(n+XLx* z(C9T>OG@(`PR)Z%wX~DzxQrfO}rq?ShLK6P{u9fb&AmyBM8L^^QJYOs@m)^n2 ztpHj;G3UE+N^rQl&QiUY(oj&1h;g^sSF@T~`a#Cc!Mkidtxpch8f4ghf>tOsNP%Yq zKOpoC)FbNn+K=#Pi-+U&nSwE-z^EI3i#M2dRAzR!?j<#*L*GJuwN!@)Q z8z?Ndu`!@8K8iSWwmdXRhAL`;4nE#8(3`b8*VWn)8GE$fE^4syCOYA%!Ys4jw^MxI zM5EM)$XC3m>{1TmVnkAfMP-uhR*IKa*Wl&u>15x2x+GC$A4K*D*FMDGR;+pn z3>#rPv8Id+;4?hVuX*Q7Ied|4X03At`%ybF_VqD)F=~{wpgch%1ygxKEjOafch~WE z&q1;eOxP7sFBl$iP8doXjbn+dJ+|~JK23A6&UIrP>f`>%-E4ei33o_wBHIPLBLKO0 zgfW0#c>js^=hcv*(0^Q5>{B15Z86`6V%N*W4;9Y=KO6wC(ryhbjiAEnS*y~(J5s&W z9KV^d$|gHFAeqNi)hP;VM$UKTC5ZePRj}C|67+?kckB*2H{vw7UV>hihZj*|q{o0@ zZqo7HLMF6|Ol2=JYrJ4F{z1tLr+ioe5-;wO!0#M8zB5&1j?UEmktd1c_k(b1X2 zVRi*dUIM(TT28_qU;Xj}_L00E$zkZMDMROHI6+qoF`Y)(Oeh#QWF@S*Gto3Za+=*|Pj4ZvH!WECi z;PC_vj_WQ3HTuCoyYKO;l9yBT6XvXw?9~ybi#n*8;Lncfra@xj+t-w*Q1<uOzdEN`>M~ zreMmALZlNK&gZ7BR>#dR$F0mL)F~!AsncRo!|pB(4cFO`z5HIc=3h$NEk(5NleXJa zqX?Y@grd}DR^bJTK77&wO|iT{?^rLNg_Qv3*bN2l_KaUx-)t=0ff%p7^15oH_-+s; zqwifx`3X6_MQ|*YyxltF%gWRt`Z8_p?<4)y=;a^a;!?Oy4X{7F0A?Jk;*tJ2RzYoE z9r2^>03TDtk?-3sL66rmPVpz$7(an`2`Pt5410k&N^=?&)Vo9b#5ZVIfCRw)Zo(LJ zeFBt)S2zMG-(h}IVtymdhfFBol>6<(MBN==yrEepV&sBesg!-5R;h%J><-$U>4;Vt zXFoG7P2{)2vpG1c>Q}$Z_^EVso{Xk{%4;>y9GZn{!=|6JQMk#<^Xd`uo9vf&c0~4g z8>cCsP*IMrla!AonjVsJ=pK==+9+>->n0*oKLt`37bv&uo~f6-w+#pTZj3`WsCAy- zmbUL^f%i@#YWrg^RoCKd+O^Qy7je9Xs-$Oj57Yr!=ZXy^UXRqy>$;RkUZ8>`G`}DS z9}_$g5M%(YU#NPGtlO}Svr%ZN$jg(@wY`F!2VyGETRdldfM+%DBZM;aj^YpGWzpox z3D`D<_}xnt$$>3M*h1QYH+13I+UW?kid3X&LS;!Wsnw_{ss~md z;Ce2K*Pu;~<;>>^swekr=}FB740Tj8S!2fsgM+3wdfj5Dn9&zIqkXbm0zT3XaeMX_ z#}Y3X>4F{E>;$;PcBjDGqOkBEdRMN9MOsH@YjI$&cG%ya%gT+Pyq~oo@j5d|#07?1 zi4(uL(RR$+j|5xYWw~W7#9Lq&Doc-Vz-IfntqfWP2F<(wMyo%nDNTqp$d#@reMnlI znO>hvS zj#KF>4P)i}kXnRFcy20nc5+kS2HOeUXth%&t0zhne;0})(Dy+*jb@Y%_4?jGs}l6K zL-M#GnkNtf)CseRI!b(zl1Rk zr#3cWX(#t}yv7i@`2pJ~k$&a>>L?kPT1`7er+S0P%|&Y>b#)dx&u+F;B6YVw=%+D4 zho-zs(+O3t>x!g(FK<^$kcBU9Qa)a<5X~mVCC9LuE2Bv~|8yMl(Zp$Y)#3Htz*;XF zwiHBV^#Dxb^Gjzv2c2_4{62pRg1i@wlcth5@BFM&dLXtyl!h${`IxU?R;o!D5~_?P zuDipp&gj?ScKKU3afr((2DB~E6w~9eXl>mGL(~R=U}gcu*$Uw$Q_1tKzdKBbTk@D zc7ot=d*-c|6<3!U059aT`PaDj+rN$i&W+}u4g=j0|dPA(k7ox)x7ew&7g_S7%cCnVeoCevSkI4p?BnWLos(P*Uef$aEiG;EN|MocnU>Hs4gFdgZQBiRUs1mQ>Vy#xwZvdYBSquWZtwzH^F}{ZsV2O zJqT-olo?wZi+eS>75&0plp$0t4xX5?QhDKj3?Njcb~lXXcYmg@#2%xQrkGzQp?H0x zs(JT7ab$S{3%b`O+yF7Vc(=%i21ve8!R8)V^|y#&W)s3)2Mn?=f8!m1SLgI|8ZQmo z5(<3;BZ50__GY2qsQMRQiax-3{StjSlI)XXM1{wCh0oOauFGla>!Ilk&=Kd?*xG{F z+cRjl7iMS}Yoo-UY392*?vR*Ki!C?0DA>VH)E$uy$x$VA%HuE+lV-9&8{f~2IICbz zpDe_ou>GFD_A+m^u_WHAE|QbNax=-d^Cj-NYwx(s78t!A!9DWAHk~(7T0K7=&&ORlnHX z)z9THZ`yuE+k^S$CQRED#1hlyp=c(%l}OhzY7`4&D!=8SUakWI zq1vhtyrrPw*u}Wy6!-Ef1Uo1Qe1dE`?h<;{W04!^4AW5F!OnB9FPx>0$7exO_K3G6 zFXmMXi_pWwf;OR-kUGvTTL+9da%BNH(>0m|dRjCqHeb?Dtzd>yko+*=<^3 zxg<5V=>a^`7%g)GVKqouzovD8Q^LH$d?)+}#6Uq9$jpVbriK;t?f1{rmJ^V;j0Hk=n>yizt|!Ey}XPnzr|vPp#IjLB$d8NWH0 za;SeC54OI={)~#J$vB$%?fpu)+=FF)SfBM?UL2PYpp*H>kHhxb1I-?EHbi@l=dcpi zs$BLnvUBk(o1)4@4_NcUS{pS^! z*)omRsN0#Y4+`%5r!SHt@adn`^l(S7^}slJfDQImPowqb?M4;Gn}J&&Rx4YVgCk5; zPD~PdcGQbyrLL7^N!qFQ2GB^VQH5$ZOudO_{#Y!c6})bHZ9o45Y_75UVld!)d;n?U zGS3x`cg37aDWDi&$TnAluGdC`HrPFHvv)FHBXbPQi^0wCuXAc{YNP?CB|Ki*^IDsmQ|@o(3FzmlPSSb3TDZpFHk?a$muDK@A? zl`njASv$hnO)7PJ9RyrMx6Fa4B5R9?l8aN|#Al@?8X$tEq}?0m1s7!L3Cw)(*}UXbW!Nw z@Y~Zj;1x!nTV)ry1Ns!-Pq6V-@p!78l~Y3&A}}SsPf$bA=rSa99?kRTS`T-Bsq|2u z)O@gwCrAOrn@|`LcGaYa#lBm9TR9Tb2nT=?widzN=Z1Ja#&7HR09mOlXO6S0bSD!| zj^{sG90ys=&h1M{ti^3#SU*sVI-XSYjL3MD6%F)5aWB|dVP2GYLrdE!q^zgioL?)~ zYi}rDP?zeL?I>(<-Zm|i8fai6jf=05Dp`Hl7$t~x4b7-#oZ#cj&otyrmL+TNyI zrFthl_?E9lGX7>iR)JT;a$}Vl#S57#BSq!j^h1GXI&pyCW$)ql5>F0#dFKSTLzj1M z2l|cUn;rwm?MD;q`UmZm)na@9%M_hM+tXn-lcFxqg@>)l+Z?S+Jak>2{_G0hUt*<$ zS4CMeOpxehbtx_Dsl3-ZIBFRT(m9j+`SCZg6bdaHN#)*{3guUI!bYq8Y$lKA`9zw})62-?CW)2v)Ho=%a zF~uMeMFQ?V8;%eh3xP+=w_e?f>C*YP=4e>1P^Pqqa3TeF*&&D@U|$qQ3@Sqh_BWi! z9w1^IO@;lZCiBMNmUjA(Ho!8Q0+Elmg+l}c(S-kL>{@@$cFOTv7Og{vH5gf*^0s?^ zeU(m*lzQ%Pa$#F}3pd}I>})RHg@|%RQ(ZrA@i>1E{#I)({M%ei`G{S%oZZCP-esF% zZ%*tbvs5xX%F6nMX!k^I5^Y^l-l8LF18`@tM7vbf7e$+?)R{JgE5Zog1grtqS=GGF z@3^8hYw6Ec2;XUOE#AmWN{d@!KQxvfBE!!$!V*2jcsoTg_9S~CM^hH@^8Hzj{|oBgyZF$~;;;JO~T&-TnL8I<-Q?8!gZ0f(H9c5iS~ zo>Ssj?-Uo33GAABIA5Z}pzNy1o)@?mnv&a{=pVv}V<8%Vz3-AfTs7Z)vb;{UosQ(s z+a3tn9?GsrZP&<`ScQOj8l|+cTTSO*jqH0mP5U{L#&J9+u(}I;AB#>0?SI%yobSr| z;_gaVH58cIlbQsOs*tjDM7Z`U{=;AsEcnC)z0WQTeP@+RsA+p>k$5m`RjMGgEHrJlVcpMewD08Y z8)QGw{w5$;x_}BfC^WZ;ONfP&D>Cvl4%}&XhHjlbe6>l7+qvYjqK${~m&5q5(uNy4 zPein>9sy}`WU5~-VUbk;vPTbfX$=gD*`QyiqzlKxaM~y}fbT4vSRR8WD&xflWdd_6 zikOf(auoOV4A@!ycJd=F_5~PyK?gBUp*!;!H2SlR_8B!EbP|YP1mx3_wEBYsrwLKZ z=ncc4Wtud2)K2>llNDW^#AkP70EzHq(<>43+WI1`d=aDq*v~esYq;ywQ22X<0k!RaL$ zBT9zls3AJd+0;J!I?w@7Sa+5Z_AB;E9aijRYjX5jri|JwVM>AQiUkojqe8zyD9pA2 zXH|*8ea_!4&fgDsLfJAO?H?e+aQ=Q;`LT_}D@lIajb2SIIbs+(5qI&1AAiXUYcM+#lefZfe$_1c_Y54zh%@QK&2huQcn z(^>=Hp_%Cb?ZgPTqts9F&#wG)E%lilZ1*$_FTruqg}EV6z9g(1BPE&6zd67TA1JdG zAUx^&D{nfdo}ZFbYvMsvXJhwWfs4B&PZ&(AOI?J4AT}-Qc-gLsQC^SA+X%)N!tLG- zTVZs`ID*oom0o9wm7Cd7wHI-gZ5yy(_FFs3++-JwBM=*b6)U#i|Du@;pO@a;7|x3? zp)EWYH(bHFE4z`5KJTh2?M7@a#?B4Yf}H$@uUkZciy|HU9XFjb$0|ugwegVxSNSHS z_#mu~=g0MggUXMmtF3H|Vx-Z^j-R+Rq{gNCFA3j|Brp1Ze4TlG+-0@@XR=P3E|bzF z=>pT1N{RxZAWT_gN=pq`WLma>T$}sHL{rSiMb3 z5ezknTW!Vb_kWFx-HGlV#5ey0GL^tzNKA_DT@l9moU;!*`Mab=3YQh^9S0cq;VN>W zlYkEl#@B+sB!c^unf#|PM&agv1-LvWX&V|*q5xV;2gq6_ZAaufv^WHY@_r0b`GW$f zszBG~hx0n$b&-l=TqIJZ`G#@)(oFSvyxG+*wR*x1QyGkC0cnc=XNosZ{t+6>wT<@N z?KUmNPPay?eiE!7@{~7CNpiPw`|1=p6|;REU4!9u_hx(bsA0U@RtHUe1SCjJbL=d=GS5UbM@pY!D6J^IcVuXzrvx>c9VyI z8?*_*9WldNdy$Snl(>)hh|9y8mRDcBKRUBpty-Y|ySG>y=NjFPEZXZ)yIBWyJHsCJ%4uuk2M=JYSJj zpaZ5F@R5u+v0%O(!KGiD=Chy*j2N7O{%?$A3sk^6N%fzwN67`Vw6aV5JrxY0*N$dA zD~n|vlIjmo<~%S6jRT?yjy)MTE1YcdJXi}s4kvKP=2@$6-q3a8DFk3~4Z&>*+*|qDC^U+GF$@^w< zd>jaCwk(;u+)jaH!or{Q@Jk`G6SVH@jXnvyBg_OD zOd8mvJnzMBrgxu2(%Y82dKSKyyle4no~Qj~0y-)@Iy@tSS6tY-1`fZ*Z19qdT@tGw zvQ_o0dvFeqhQgnq=(i>9X9at#z9rJQ1A?>lp6+j=@hH=hkiekj6SUlL4ffA6AFq8p z@I-hVZn43-DO}_u)iu@fL!p!p>Ha)o$vva?1)s4u8!K0J#Fq0xLNt0OR%nG zHebefnqAr#CFHGk`NMJvV0(&_y-95HS|N{}CFDCSTm`^NDn1eEfBWcPrlD$u+eueIw!{1Ev|8Dq%WDC-@3+~KsF%h^Yx*Qtd5m` zuO^%n@E_v>6KXH)wmLNsf5(=3D@KPS|4b?a{Kv5OGY0A(w>{UFI_aZBH`#RWCqo10 zqJe@L?b2p@S`#+q62r@;km-@H!x^qY(cI%)!+TuAOKj56qFq(_{>}2^M2I%3w~i&U z!9{eD{$&$E6UO04?+lwe@*d*(;zfjObGadYXNrcxNm74LPbB^~NK|g}o5At9>0W zl#H)QmEsR=tqCe!)pgtJ`jLV?xw?AgrqMhs_ZmW&o8Ii?Zw|>1fS9qsgVZMKB1u9y zIpMpQBMP_He8f1_#V}AcJ){eKc?_GNUDRcMwTq60;OE+p()KCsmThH{hB&^igCM%N znT&ArZF#o+3YJNbq3f}zuKI}TyI|3cHoXx*Y@$WGoA5h)&B3~W``n#rwB5u zS^QR6;XGfZxT6S2{KDy;PhCcI2YcCYF{ABq{B6`$<8b#$*;j)cZY0i3Ex)H@fG0BN zX_8W?jCw~Y=BM4;F6CCdt#bRdNxce-7G$T`_qu`I0u(Ajj<&tRdxXW)Ik} znj!=l-Y1T=Q>0mM9cl5J4zr9p$AY!s z%~qK$2Aj7!#XF%@6o;d88MNtOMcJd6@}dW0VlYI!nxXN#Yb@D>i>&Wg%C*Lt(*d5sQ0>K+*Z3sn#Z6kRHt7d*b2@-@VF?! z#dpMN_4){!L%GZCr-OwcntVJH#8e(j>LrC;_cJNpsq+>r4Tp~Mh^pCNZ})U+Csclt zk2`+|y3NgV4pJOV<>Y46l= zkI|GZii5a1qp@Y_j*!#zB*~P4EK8+dbVJ@wFs6cMSX23>Q~d@Bh6FswB__&_Uut6{ z;IwMUo3&9Z=(B7qUq6kt6s46-4%FynyyFWo)}5%eGM}{**YidWD?b!Cu>HUKK?(fP zz)p%SH7a%qTW;`cf=65T@3Je9d=Tp4-10g|`)@LepBC(zf`hMrb{jVo3=Sg$Rc%8` zDB@^~Rzmz_Xb^z-Go+L2?7NOl@zG&Ikq&~JFto<2shhO;BJ2*UD23L)^1C<{6REoh zdMn4$L~9TCYS-qMk*pOpD9r*2!F$;el$Pit%?Uo3z0zuH!b%F+WV}^+i8UvU*ivVo zj@UUV`(YAs{{}h4Vm@(%HNOsP4*CeG8heuOdk(Cl$t_!}O=72Pj^a2xtw=%WKd{~F z8?=z;dP4hihuf2`3b)_WDs9!l@{0(&ROND3yRctj<4R_2rfc{`97F-Nn>A#dy?ugN z|C-`8rsOaVS6@(`yQ}A#+O$Td4Ip1=YwdE(7c55D8HTV#PrNl_7pL_eMkjpWhQC>8 z;IS_nBZ`>oD~LPRX?wvIo)ok{ToD6(6v`uuK8da`@o41nhT{_v3d7G<2OaIp;bTrcJNAJV&t%$n$7BzE?qdnSBi( zN|10uzPFxtb2#;GwrVFrfMOrnUwr&E%%g(GKj-hi4K8?)3UH>XDdt=Z*IFCF>&lYf z>$e-plGhNfAgrAzJ6^0-g7Z$ESZY?m9w^|sTUx2dLwr_@=0YJpX;bL9v~)WqQ_hDI zgML}tff#F9`!;+N|NW!+Rado&DFFKI7zhf@$87X_O6mFu%Ff6xt7 z0Fcb2W_orPYUmKzj?%ol?}-;mkj8(jT3p+)S@YjkNg+u=ItM0Ltyzv~boybou0W3< z?9P_>X8Q_=QLA00Ti}*{SAq(jLCq<-{I+1H)$1CNh}(4!`B2f30q(J0cQ*t|qQ+Cc zL-WtQ#9s$kB)Lb@z+ywI<~_yX7&ys_?0i0G58!!okJryowz4@u-QRUdIEXA=mMsWl zW~!9-45FaO>2h^yO}4wW4CN}oB437rrL(bZA7SdOBI44}&7M;t8aXmuhW$;QA$7vd zKHv#Z-E`c(r9DUGIJz1Y>|^vH?};MZ*`X1U$7vmikdEFe2cP32tQrpwUZfUWT!Qpr zjq5|BdQrJgUKa$EWsMsUJn>wx2O;ow^6j;+QE37Ih&F0%iE{A-m6G^mA}zm!yK$7q2fw zKD1Ob81CZoeAiD(b^R)?5X-w@0+-Ccg>s z{-r&fDpeWi2qDg$B6kg_6tq=83nOl8K%e?S#FC(4eW7T7D-k52V;u)a#S7vouSkVF z9k6i)n;!`F$DP>o5EePI3uNL=?-QK^u?_%^3u`IG(%D@0(SZfvxC`q$Y4R!KOBAxH z?NUR1fggjWpD@)YWv9#09_jBym^1cW^;Cqrjns)e8q@y1_KHly%(2?&czB-i);6n< zAg}BNZJ89&GDe{ySwuK*c>)D{X^q~N?-&uNmIZ+-L}S;=@nSM;Us? zKgX%QmAIg!%_4e>bNC53d~<3|=*S#(82JDMG_%i!bOaXTx*1uYDWaEgzNZ&1w^y6- zHf5USf!^;Cm-TUu(^1~GNMj$7$q+)Bk`0sQPPU&PF9Qani_J~+un;)KJvLWhwo$WP z>TSBSMSi=xL-K410&{2!(h($DRbhTUaLA&`ht$cr7xiJmvLWE`C8zm53dABhzw5l~ZReW#G7c~-V(dAAtv1@fx%V)nh2GGuS3wOwgBYRyM? zd`qJs3Q)72g`Nh_?@ihl3(fYdGLwt#07wmQXPAMDN?k0K$jReEwB8TIM)9N_d)K14$UME0x zV8uyg&WWeNXoCtKm?PWPBjxqi`h)}n@aj*sEhI51JFv|uTuX=Q1k7|7qAgQh06KjK z+5W&57w98yaw2~-9jVS0gOu5t6o|`ybws#uKw!Ztuh=UMM5OO=SBLScs{*vJ*P|>% z(tst#4XAm$R$y8^9l`je@;oA`zP9`x+Ds7FKXcASijOuCdYn^fNuW zy%wp5y;qP`cfiS+Q2!LNBG^7k`SBG@Vj?hX0rS)CA(~G6eDNVNrJNd(Xh-O@61vFw zulW^BCtMyj<#4`+5C=?PRKJbQVd4&5lU-xcZT9)Fro*%K+{H9Iu}R%8F-vUj!~&kQ zIo<@I+TFGG+EoyLhQhJRYx-Ik!eO@%j7Nj6nPQ)41zWGlA@@Ajj#*pnxo2m6%S`0{ z>p0~^(438!Q@vKZ6kv;%ik5jK_6fN#Qik2|wg&;h9+qVFgpcYv+yZs+lKU>RNUYHx zhSpAOc7VUQww;6W{+(^^_I8jRF8P-+F)D@kp@~79xm@>ZYb*_L1~x6~t0#6@r#r7z zcw$)`WNnp=BX67^)b8k=kFT>UoAsR8`;n$L`@RR{OilDi@Qmr`D$mP4!0uthB&KViua6f;41+t0{-( zI4Oua+1JzV$&}wFl9%Zkc)g%AFz7874LsQBeXuRCE@4&M1JkzKApa4fOS7Ha-y+Y$ z{wYG z;T%^tv!ca*(5nmo;XFDv=V(6x25z%8BwKLw^xoS+s6rBQ}mWO}vJBtp;b-0`L8R)nSV|T)2Cj`Ud7f z_>~~(((YVlO60pQCQiFRKpMSAANeR9ky;cKE!TN{H& zlFXmOXu$IMTpgoOfCJU42U;S>buQT2t_-u>i$lO^2zrxDIxD30Bs9s_xA=^C zcBH?_r$Ch+{78}Im2+)0{Eh^pHETjo{-VK|4yjJdoEB8!)SN=ekq?c;$uUzaB?>tfzMTa@cS zthL+!?-U3!Sr&=8Tpv*trNfn87)wjd&yp6zjD?CQUv%`1o+qVg%<2jkUX!Edc^akl*2KS(e)V5 zzMu-i36bEvQF}U!_Qz_SqkQ8`cTg_GMRQHUL1+Uc8P2}2paiA$^!)x~;*x}|qC5u0C&8~V-KzV{>;MPP@|vB{vAeCB7r`5wA$F22Z1Ti1=pou) zL0C(grjoz$QHQ{2MAVfQa4hW0WbjC32NZ~~z0j{9e6;1n?sjr2FX?97R=*d5LwUN& z_?XaKk5v%9T5HfI5x8N=r`X9@ujZ8X+>Hja1}*-g!0}qyu33*~*CR|A2xXVKPGS;p z!xA#K8_3vI&3e1x-;J=}eiA~2;VU$;2tdeR_1eZ@!HzpoR!f!R=W`{9a4lq1#{g>Ik$%l0;^f;wLixT$!3Nzf}JVIv`7>troT_UuECzQJyn^f8W*uO{-7GN0iH zie}~B>?OjKoF9@JvG04hflwUxWmw&JVXGWANx|qV$fY%@@QsKjB*@)v$m@BI=@E@+ zyC;531JQSJY&n-acWmvJ3wz}qv0F|EM3&(c>;*E6$JrS zP;Gx}wDCd;I@6kzye7hp#clnROfS`D$2)5QMc>iuuZ;z(6HM?L%@Bof&U}q3998v) zGq)sky9)~SDEkxkL>;x6f2B0yxVkgc-4=gjrd&vUHb!hHV>J=IovetXte+3ogJl4d zuD7?lu{siQ8uqx_@68*T?u#Bnf*<0+^b(!P0M8ajx7ywVY%Y|}CL(}!Wi!F!Y$e@yhVM}!VYrU?mI#@W@W9t9mE?N{CYc4PyZQ;jL97_wVF zfOxpv4-TVQk$ezpe&B3ApTzVyH(#Y4Uk!GiTkZ9fI7SxrI85Wn^0junwdsSU*OB_0 zY;=~-uRf28UJ3>z=EQP4$t*75b?6kg%)Wa#^A-9l%6Zfi`c;t61-HeO(?Ih;ce+ z`%xZ%T0ldRJ>trl8#0U&r9E1Mq-A zyTTU%b*lvnL{yPjv7j*?_WuLmgmH8tFs*Ea@;G<%srq8beX9)>lJ>|+1^a}X?Phxj zx)V-1$42%?)gx4Kk2dK8;R0U5*!MSp^}X0(pBXU|XyJoAio$SOdw5K z)s-ziVQ`R(ehrc+(Jys^j>rD0QFWpx3VTe~`QR=s9r zu2{|?`|<7e#|k~rZ5|j@_Qob{|Hf8`z8TS13F`7d_JthjP1N@?_D_)5j&8DzX9!cW zCETA92ZO#i&yMsE8C5(3WOlpV-T-X!5;fgV5`m^rd(SkmXeHnP>MI=+rph6EKHDu@ zo`9^j1pNa+jEf@hcuUAH349E=L*&=n#xCv-7xqL)%6?P=gp-^fK$zDy9TDaVQtR8} z-j<|5yW+;>AhFtaqb9tuZq_Z@YTxG(@P3OtyYN}=;TG;;T|E(jn*d#d@Zs8S;lqgz zJa^oF)1zz11u_t&{Gk_;JDRu!EJjAL+HdW*deEKq7&3oX^WB00al*4_7; zm*-_;OOg12eh0T;9VG&BcixiD33k3~eI#`md6q|O!?5ro`7~elJ}Y=Tt}@~%3d&D8 z&+6K2QIFG4#u=ZRfrGao-y%f^Tj=`$exGDa;3&eI;8FMv&%!15oF zw&(yhTrf)7Nk{g7g7w(YK%#X5=bl^4Hg_SN9iGm9ukBW;$R*J9i^9&r+V(L{`2zfa zC@*>QdixS)-{Y3ArR+wmzN#i;Qvil3m7;f9a$gBvDnHjHyIzkn7m}xCW`ZJxH&?*k{Sb zeFNClr17`VJb41&?awf|(I@{y1xE2oC{|zVbqHA1xw9y|04?4opb6G)O!XUxg2R?P zyVf|2hxJuYY|s$V{ks_aVuCVztJr@+&ioOs>3n23BPf5*Gi#YvFXe8==C`sFGGaHR z>_qQGylsm7+y2EI`>Qy7s@>mUMrW@eTpdsDl?nZx6yFP+NItA@!fwd&!vPvta-9Sw zdfMzj*zbWkI$d5(@Rrx)a#pYky|nE z!yxI6?RXOM5fwy8K|fvW!(%BxvrSFfo^IJ$h+YTqU1?tqY65-M4XMW@d1cK$?-j4J z?b+^PLz<9bHm#)^gE}99i?Z%s>utd6+(NmKNJ#~O-5P2Jp!U&k{&19yEepW#3j07i zg|yQ&3SL&8d-g$JY{#3%nDc5rM|nu_Vu`kO#GqxSiUDtHWz=e$nC;NUsBfjBL`q)O zCEK{DCOyy*0o(d(5~c0OY(D)Qwz?AolI+~(?h$MKvRffyU+ zB_m%BWT-ZrXYhvuYY_oQ2>%2^=qNbv;@TR`y8e#n95=Qhh+lGX8aczNCZblhol8I* z>n-aj3j1&nYvL&nT^Bopw}d7v2+f0>iy_z#m96nun6JQN5uw4;+ENL(dL_nb+8ObM z8I3ZWx4*nth6h*l@=z7XdND$yU^QeXCg~?lx$yqlo+V5PT-1?tnl&OfTDBbbhVcqe z6k&q|Y7M*ydOqH6KRdE3bk{OhVa1v^q+y(wtJN+}l>zP5F9&r_m*-wc){~cZ^I|*1!;=|pXi!Bh@Uy-pI zB)8sO)s0xn?ow9bGA!_EDa5KX0qdOB(ktLQZ%vR>W_h7DVUv@Lw=c;pNA0@++7bH` zL20LLoI=!7MLb-sDz*X=^o7bhxX{N7NVxh6mx4{JIe~C5j$2lfO)a*$P2CA zv9Xbt3_*T~_!y{x+4JV?f`JyhPn_n-_5w8LiNQvV5bIN%=5<6-!>n#lufV&)QKneb zqtf*VxJRX7T$1n_?w+71#rJH@=X|kRc;+LvQ_Z4`dlx62m$bJantSecXkmm3Hzdi5 zv}>p3Jji{>GSkFg9{=QSrmM6!5k26NAHieXGd#|R8R)4_@AaY=RIxbITwS(dbtAFYQbpe0B^$x%qQiNKvio4h zdC}uhvdt($^k%C&5AGhPU?Vn1`*przUx?U=O1C!Qh+b=@3wP8|q#5qsDdXH>k6@fv zEQ6*kBcQ=3{nQjEptVnN2LT4Gy_cT-YwB>i2howyj2{cV?yE9ab2id`4G8yh338Qz zY?tN9%Nd;rF{0BQ4V?|)kO=F82SCx^3R{!QbFWuAPe121>Q(^tl> zs0bUgi8x=t&`!xSu6HN7+ovM-{UxkYhu(Y#|CYhfLGNA&kDmQJyg)k@rMerEOH`os zDJNCq*)h_A-AXwycuSlT+_b$ci#qe3I>x25Ii6_s8$-ge7 zHS-M>OglVV>iCA?G;R?hcihGVSIqv@07$-_0>eQgW2*o@Xq-F1$;lq}g?DU`iDseU zgsw~x;{KM?`AtwU_#7ku9V&1O<%$I^v%!AF(UYl?XcbDmUEEb>f6UgugeGU~q^1P6 z?nH1vHupuqj-XNqpEneBZNN@fA=P?#JARr0NlcAkcFW-FB)bofJd`I@jHx$ra*hol z@7kO;J&JQ8nN#!>Ak%%U;rW|n4o0;MrmZ?*{o_o={!RnHfd2i2k3WXiX%{6+IO%K2?25#NuBiRH@t^;Qu5f z@#?$6^3$2G>X{r1weQu0lKZoD%R@+D#K?xm&}?wNR$2A8v+Kqc@G@7x92w%U^Qenp zoxBld+cOdS_Hbe8!=Pob$O?BEJGV#9a(+Z3gc(g5Or$XvB3tc#+Ld5HXAc)E0{@Jk zT!YZ*jk4Pc4!R!$HbV-RjgM&0rgjj~F!w$kYwFuVpaP z(R*7~RTgYW5+ieen7;iSw$I=0>pw1b0sK1KH=uJgqE;pYQ;x|A1}Jaja!}wn0aKm2 zEl%pqk=5FZIUhi2&FnyU8f|Q2!S+_vzKEobt!-RmB{1gIN43~Ist_FU zsUg?L2m0!4s2jYhsE_*~yhk);>~r)tlF++C4(p>{c^u~onddJ6i=XPV`|?|*k~7mx zAS7&j&b~HMB`-rIwaUv?l40N7?q3eCdn|o4YV+5G)zCj&Q$Rh->|dAL*aWuhBu9zI-zYTJ&=$VR<&npr7D6)U7cXXcN+0d!@&Abxavx>c}1eqXeVTvp4W&;8CaxJe& zr)YWWY3v{aO;Cm^r2}#DpkQamb#@Z!-)@hn873QM1FyKCD?1pjn^$w6qd8WCYS_Qf z>dm)O_Qh+0tN@meBsB+AS)&Ovi*{n=BIiC}(^9yoi!?nclK<3fn;4i2So_EnC@!ZX zvy}g((9`b##1(9P+kVd6T5=nR4s@LRo{qMvi*<;XvpMz_0-^U%z{!oER>VsSN$ZOS zo%B5fY)5SAA7f)f4gW)qe-HOnJmqxXzz2!$lQd~UQ&+$V+nZMctAa@gP8N0*Mm}>FBr#5PxQewy=Y5_DfS35{LR^|c`FC6W25ZNr<|cc z&3QUu(7qL62vzh>v(0?JicO~mTC9lW+lViT?)riqqCuhr7Pz};q0_C3$#@A~mlb4x zve7>P3iyXmoZlmZ`#Zs^H82S6>qWu9=2jJZ@ZroHZ-^0y^OThrikrKxcJ5-NhHbQR zgV8=~QE&Tz;e4Q^s4iS#AECnJp$UCI?M=ZVS*9#1+dxerO@(1@LSDf^pB`>q3`%n_Nz#=%@Lj35BjlR*kghJcs_ac*H- z-CImu5{#ZE2=iS}>VvWG0Gk_)BuBI-nY3QBV{y-TGss6tmOGu=EkODukEG33HBi*h zj}sf$rGSh?=$;ab@lJ}KvDl^J5@}#r*aIZrTXAEo4Q2)_2#HZV6SUT5doez#An}BV6`@_Z@a3eqXbV@%;I+|X(3_VD!)}uBFq}I;VbA5ui#U|>O2^M-y4Kp zy81cspm4)A`RZ=@0re5#nlV=~che-Xt6zefVIQMMtzr5O{dQ zlP|+|oS7i=fsP&aG)N7O^r@vb)P&3y1I#@*>A`93X+N_`@ntjpHl=(|ofhL}jtnrL z?z0DW2{8F97Tu0W`o3Vc zihT!5N2}v#pUSAK{yYzTcR5-ljC_?X5codRXHShhmu6er23`#E&^nH^JG>swLpc

aH+8{lch?1PyQ94+Vve)l&ReU*ysr~=BtzO;MbHQyr8{F3T(&7Hd;f_y3+Pn7O zA8}n{c0Js4ebyTs?w;UqZ5-||Ba;{5300VtVLk?j`~TeCv;4-E;O?Fa?v5NMyt`L8 z-l-V`Gu?`|5u`{Cn#_5ZlL=X7_^2Y0t6 zxVwGB!>#9N%hL9bf_?WRF0SrFCwrbLxZq^B2Paz{w*&w4WF?6!0WlZ-A1B+Qll?q6 z+4I544l7;TBb==@ZGU19!bhB~{6lB^Ioo=Jvt@&`{Tu8k@*#4=_PfoWs;*!F7HV%%Iy-S#QP5s99k|Sj_&+ zZ7iq@g5nKU&A`$w$QE6jWg0;GUXb#=pj=1e;-!>tHg|9`t!V}OV$*S?d=a`Y?f_da zb|~yU$0jJ@5q=(YCOsT%@%?ib3G{)eW7wDyU^+Nd6$|Pj^=#<|!_!MgJHm`F*j=0o zt0Fh}JzR}TPCKe|N-67GCs3!VFhuM<%HGs0z#Wby-}s+(gISviw`LEhht~@ST^st^ zupw+Qrbt3x)|_VbHt`Tk%0<^gi_zl<2jQ;Dk}~sEE}lW+FLI!LQ1bgFGKQt`sEaoa`n< zC{23sMJF15kFvKM$+(7|agQa6LDR_Hu7pg~gF+yAIhI__;*KQy8z?97N*RzuC##T% z5|z@fDp5*hW{A;^8A*1O+OeJo{nPqWL7do-ZlyCvqnhwp5N6jJ1{9809@IdDoI@m& z%4@-o8)~*Ce6K4)Sc;H$=aQZeXvL2g5c5UkuiC5e3lv3ZP^tZW@E=7n7h>K5b(<77TQ6SNii+2gFOq2w>F#?OQCLQ~BNXcWV4ET*Nm3WUZ_X*CN zF0RxVSp*wL5o{`Vdx8iq%QNl8a^(=E;$aPlCO{W=`vZaQ!Q9NWnVtO6C$gY7c}h{m zx(HAQ_c+TN#4*cbr~-peZl;j2{S|sFRTu)U;>WRStb=d7<5G@@*v}*ORfHVce>nx- zXud0i=n~#-I1c)!!{|6j!9&P&lL%KAN*O1i??}9^5{7dXJrk=Nn8|sQa~`8oNx6&l zt3joN(vRMwtIi9MkJ}}Xy_vep_)JLiNzUj^B$>lGy&&pQ_UGO_H?syNk43oZ^mgp; z)KKi{F7sP0d=Vh^yn>YY@Bt+R(IyROUaJKnGi)L_ouce(BfQ6HcLo;hS4JPoB#6~h ze3)?%$rGUT;iR2au=*F30Ucwnpv76y3!g?^wVjWT#G}f74pjCts|}FXGr*g10iUpa zK=7Pq3^|U7v@rnb$L?)a0?ETv|7N@PGV=Lq#Irb@`G70)O(W*F21y83+p`RqFI8RF zr_>_6t3aX>ysN;oNrMWLFzm>U$_GKMxVoPqk*La}+kK zDDg^hsUPF0wYV-3oaDU0UV(q8r!K_l9(8)Z#u?mqt%rmH|N3K{yLRs{LaNe=0UFOod$*q z9>%DBhI~I|wb*Uf>SwM*#1JF0eQI$Wg#82s`ov$85~*|?tZ zYm=Hrf&Q5toL(vL)edP*<#aUDbCL6smTHlbH$ZUosqf!9+eXLBV>V@wKbSCN^Mhx+ zFk#EEFo{T?M=obNvh}51rn-dBM$vFCV5(gtbo!G_gIvRLca2l@E|h$iqm&gZ-&E`T znKWEI&H-*@2&|CKT7SNd`b5mG5vNsjxE)Hr#L*urumujq-h;>^Co#9NQyLQViOj)% z({LOcl9ZRVF?Y*DjAZ6}5hF6-#D%`wIlnG4%<0+)1Rgm>9M==U8$J-r`>E84ih#>^ zIhWU?A9B#eHnSLb-45asCI&_1{|@&~x}zq5a&W^A8YuNlSCzeqvD&dth*LRVfO;P- zE(2s!&1$Ik&CK`P)m>xl8yS1zUaZ8yHnt65=MVuqz?NN|11obV zwT8^;6mRA4Cir;B8;wB=2W@lg*&MP5mUY^z`6(93E<^8dg3w&r7~Cd6x|aH4ChOff z*;bG-gv?uW-UpH9Crjk~q&*2p^K)2vm4=(na~ZSwiqu(@TtDh4_rr{>u6~1 zX}8yUA|a=rc23if=K6e?-1Q)hv8(M0rs&x?8O~O7m%HroYr9dXPA$62_eF2_&a3lO zmArLf1~FX4;SNjMUjujb8Zxcsq6@P_0bfr;rf0@kmSG3ebk&5IJ}=G9z}H}TA$_Kv zbf_^$WWH?g+xrbbGuxqJF+g3af5fu_f$<{dlr4po_4bU&6r>%`6&poaWn$r)1w}MY3M~T^ciXUQ9&~@N-X{t_03PA)zLk34AakbQLMyLwUJ!( zGSaj!XX+uVIMB{xMYH-Q&q&Emu?Sj>iQRCT7Fiuq*Y~XJ?@^`o=WmH8sc`e|y)MYl zV(O&ALEoe^_Eq|i+%E@n9->f=dAKYbgO;+)l(HA^i?y~{a7RN8Z>8er!vcjK}3YGRiT ziS8;<8H689CI;b0MHqf~i~E>x!>~q!62%8J-*P%flPV7Lb+&TJ?N}>qnf)c4cfdoD58+@Q=bE`zbBu4Z~u z@=p6BQ)qbNOu${{108ifAZP)GWHke@RN1Z6u_$t}t^XybS??k*Q9vW^4#KobxNrwl zt5&+kX69(T$S8BXlYHuKJlIF&%|-ZGrV6>PU#=RVqAxW%lQko;Fub#XnaZv#*{B(8 zx`E*bX`Xu9F@zMMk>c7lPdz=QvY8txdEOUb^*5{n5kHxrbGX)k3kWFI=Z-7ojB)Se z$4Wg&>R+O{*7f%{v@Q>8B zk=NZDu|r5nG4WfM5|fmZkb0-S!pKT{yRBPV`?(Hci_apH*x`Jdbl|4GTcBq>R#e2wXx|@`_Y3Dn2DDPx|f(y zB|$tE-VM`O%P&_Dn8`ugA}@iS0Nz0fbVNO&o-Q(KNf5<6pHg_59 zDYNS$vdA*W0{}g0ZM%@qyeRNI8lRpP(P+Z{c%FnEyN&ZfveY$jJrOb}rNV7kW8D)H zyT!ING*c{UwZl~-^7oyG!zp=KT2w?ZD!T_Rni(XR`YrVr1>w|aPY>^;nNbuUB`4d8 zHL*>S+>@Q!f2SyJqoZLG@OlyvwQ8+E?IsD=9KL-^*y zhiC|NqPOLvc++zGRYHl9gt*0aWPM`1K|J1qVMc}n^W;O9HF+p5GFkfiOS)e-)={fH zj@s{HtjxRrQ5&p=PqmTa17&i#bhMY{Iha2c6QF$0yP2v5{VI_yn5i5ssX{Pfc6`@< z)LIx5k0ir>Sa-OExHYOpGS`{inp6MJX!XP1Yjtfl?u%;Cp3l^c!VH#e;g0r(ezE)a zg&N|@kxB6(*r<(3Eo^#HIq|E=2fWU@>s3m}gzVfNl-z?N0Rj`ww^T2GjWYJY~oW))iOuU;oR0O#Wx zT*9{ci(#Xe18HI)sM@r_%FeYaqQ;azG=n+bN%r>`itYmQTpaW|>s@** zM!j7dIw2kfmPIB~J_@TYHU1jdf#?jtEw~${-;~Kh_LwL~_%>1GFwm3a%!HBk@jN(B zPA%SzOp-=+pw{wk#F67z8XHHnzi1vu3K%{hX}6Fbz~DCsuY~CR713dtBCLK7SNfMo z657l4CRrySX$iWVwvLM+I~cN>Op~4>OH3j0{{^2kKR!ffP_P)c0x`lCk48viA~Fi< zIvA-QNAoAN>RIDv8u$d?c@{J%0zWTowj9A2o8u3UzY)&heDl}^M~afa{0@DADMgH)F!Fwr_xS_SZd3-a!mJux_lAPa-`(tz!Wvz_6SD0LyclSe0c zMHEaYXCKRPbB7DFo72Smk-V29);8mUdgw5`WC6h?U%a+p)B9LpmVxlWTwOn}q{2{1 zGpjZs`&T%RRKd1mj)|%kzh=LMwK=ISw+M<}XjSIdjSb2o&Yd*Hz3$%lb^^aS!gexT ztGlKK0?`tfl?BW~b+zZAAr$JBc$C2~YW|bcd>1f@XfAE_pr6E%=@=1)Yj3c5DQbr+ z#z@(odGQ)hD{CLyT%*RTdhbIzl%`6q`M!my?{a&NxA=li_U-dx0^u{lGv@G?Dq`H2 zv`!wJ2_g86u|Rdl57?Br2yOH19!k4tZn&<2D?JE9cqkB7U+92GECe0Lt>BNKQ$0wx zg>rpwPr<^4pam!MDg1}X^jKk2{X~D6S*>CVst?7)t$p)TC_Vd|!?t?bl$cXV^Y)2-@YWZ_EOHGcH;ze~3{>+E| z_r|avL_o4o8BkN>DL@#UsbD@p%TV4=OewHUTD|%!FhE(_M5VoHK4A~C z;sTP`fx;`?;2<~c#6rSxn0p=G^i!nLL>%*Z{A(cQZ+nw!0Z%E~;QcmrhyNyI?^(G* zztbLU^WGgdF4{}$r8w_PGF(&aD9?y`l^R?Q79HB>`Fz^g2y2{ScD@TGf1D{J!FlC? z(%Z1lP`}w{6c*c&%a_>+9onLh5%JUPt)-+wK}QZMOh-;TSHG~)zE`j>)L^&%NK7KT zRdl`dBt=wK>XYl`lgj$qC_LO^x71NIc>}bbiRa~wfn=k;;hS$`iCzhw3z&upMD{22 z(TsD9Cfa~T9KG4ilZ3r#gd1ji&^sDzef{sPU35=A!P1;4R-qVdY01N31+J20kO@hy zn%ZD{qs69*Y-*N_(5*0D3a*+{g6b>8TXV2$lBbeLri%SP-66Q-~rcVvroiT678An5T+T z`RZ`rgM^>#cpXqpSC(}T)%RaC7ljqfGlUckO8`!4G@Cr7_opRtU4=Dc?K+Z+y9IcA zdXX&nQWvckqX&D+%QwZApB6dLqMC{LDGJcbus2Z$`h6F?3EWg|0i*E_7U}~H51uSH z6(L~!g?v;Za8rkR>s>i9<|I{)n-;DaW5$f6V0OCUTLbb zZ-%Ts)++QO>fxjWDk*-C1slWkjV&NXAHeSzKi7%VV{E~iEacv~%`Vh)u-pLg=7@(4 z0kq;|!)(nX>#yfer!9@FJX6KrG8;3#GLN@|=Ev19{qKq<3j z2({a>H$A{qOO{AI!ex54#>|d)U;IllrV9}lwy)C*AU`~NfH#eER-LovtuT+;if^ng zYeP0C5pW%i)K<)8*L}oZW{ui<5~F!>yS$a%Sfx06JF;_Chy9~qKUuL1i?~Un`q@Br zCtk&ulko#OM>_TnMtSbwf_}+c*!GExHa~`S!vQjApXVOKl)fn3gTI{N84_)sxv=l~ z&#tt4>;heBm^)6AmdNu>-yiBl6PB-mt*RxR<%PpEU7(1qkdIx4>AZAk@u47n7?TCJ z!aY+?N;LxJ@G_P*{46N6cG}wlbC%fU*+5HwiH};*!qI)R>mJ}&d8=-Ug{xho-Poha zyXe9mO74G3u3KUxI+yWJp*|h1@Y}<2~kT7h0PCtaq?$` zlf? z_MB|Q?h2WkNHQF?!#*jbZUgCUMsXM62M5)(uO3w@`l+wVozze#^*)?`Vi~Wvw7kfD*e41ka>SgaL=1S=E@fa(7?3vWZFji;SgP)NU=K^ar z{wkDUYOYbnI9Sd5IK_Z})nSY^e!nm47&r|fhT1U6(K>>bXF}*|mhjgV$R1`P%D1@H zO7W{R$hbYq`ll=IziB#OqWCDJS-ClT1u$FjAx51^{$Gc3$FxEX<`o+hm``26i`-y& zTJg^+&%3+sxr%1a3+!);;}NPJWqJXmnU@Tk?L9L7OPYwPOFn22!5o{m_X{?wsRfU_ zpG^!+be52smr5ErDF{9mx=Fq6F#^jQv2E{S)bdmaAI5afOZG4UKo^huT&1U@9Ir&4 zr$h04hwmP<%2h-Z2agtk1+s<@(%2Ec-nTZwxFOIT(M2H8&&f;?-ro>rN<(XxV!Q+hdnDGa4rMR+O2ieali7+&5W7t|!)7}OJ_j@Wi(IOoq7*$$vk;+CM07Ki zBwncz9a3{{s@9%w9k6-fhD*#?JKu^KYZ2%{Cr2Dzw&;PQ@4niq+k9Wa5L5T3J3t;(e^}E~Zf;}pPc7Q*Cgo0B}@B(aEmV(`f(tp~~ zp3e|UvKWd8F)J#JXfUC9?O|A2drZT zz)jSwJzc7LRzmPMrAl?Sh-zZ9ZH0lz{=cVKd+!im;_*m75|B+=eZju3osb{1-r{C3 zESkrh&Ag6+H2~LH>$7$Tk$3#Y-bty61$baL34McPHU7wVZ=H5Pgg^wE5>U@re_0+` z!+b}AjY&J5?n{YzME88BTUlX+{mr%eK99Q+VcgZE+USQif<+@k+sALaPhf40m1AK( zZ;SC7I*IL(&FK!O*-l?OGA3f5R7y~}nGN&M^-ubGi8XJ5eZ|F|Ddb?c$e?P=FLYr2 zM)4^>YeTY0lbQ)f*7Nm|qDPM^+E`wpWU$Y#<#GX_SO;C3D z0Mz&&^=!;33iUml{I)hdXY}ZbWgP5b$#Y5~eH0(ydnqcdfsj-!mo&&?#(L0$x9dny z&Sj~@zU-1xAi~&eJxg@HZSfoa3lCyPzNCVGl^swL=)IVmMWEa%S2~@aB?el89WvY% z7=T(it~fP$WKdO7Ps0KwP(U1ch~@2*90B!uxHy`>0jcf2gQi1-MJra+ne;no+&N^^ z+a$HT?``yTwwov;+n^bMbtD>s8EFR}yy?x8r51quThRhh9>_p4Lx0kvHMVOUy)KDlr6m ztCW_4@${=xXPcF^(fRd+(^%~w-1Ijwx*+|Cg4B0G-uy+3`1*MeQ{fB6)oE8nyTc`m zm)ZLzy_H5JJx?9Y13&1`?H#|W)WG#tx|2IoL$*qt&?{oQUz-RvoyCoiC}PA=wqEq^T#C$54+K=Jit)PJEr;Peir3ugJaC`Z+R zY;okdQYjM0nSuAM595vz$^V5;@3*;F(Yr+2s+or|_L5tsFJ6jhEQ{>8=jvzpkR9jD zR*7)|=oB(~W+fDD9JFo34}{5VO>h(V z>)U<3m%wL|qgv@Gt0GlT5MgyWYn*$P2e^(wg1MHrn9H z2o*xlsBfn+b|-Q26q0l-(;!({12YqLPQZDpDDdzRI&KU0l3tg)1+<|MTH|JDAJ-Tc zmJ^8|7WaaKDrY}(K~}Nl9K6qE*fv47ZkGov>f`%Zq54w8Xq8>}0pTIGs^5Or+P2J{ zPs-_^fgc-IUg)1>lUQ!?Zeu1oBu}MNW0hS+GV~bf2+zP1iM%HqfPbm;4P5Gb|8&5=<6cDJDb?3 z6Y7K~C#9srsExqGN-Vr9t3oE4!5q(^*)vzPO%t5F--l&|!(3NYO`2>!a;S=yI-p3; z?>`F9Xop4>k3ci(&X0gJER15u%U)4kP0=6~=%{U^sVu-T(2ExcA^wo$l`Z?HBdtU) z!#h*CjZrL`iNqij1#Xi9t2bvOd9vzHEa1Yb(0@SPY$=R#5Bo~ky&$VJUSF$7;!z48 z{%-ryb1k*h7feoeQau;)Fe1ozCl#Rf8_vtQDZATCpgaPa;M4aM^2+o^UgCQKgG_MI zH|0_RtqgjcFT&ZVWqaa~jpnPf7E^4pc#iwgQ>n6O zch|lUAV${M$rd}KO+UckbpR9ilNGS3$VS9q;iMG8goipO{|B)c z)=AOIqm87s<(R#hIWP-V0Z$v@RSCm)@u^Df9HDwy^XcOmM~PbFpdHt53wm98M~UJC zo>TOz*yuj!6-xJ1fvipl%~$Y$3ljBBBA9$;Kzp_QrRFM^+6}=v#Uz={G1ja}I-jtz zL~-QujR{#Lc0EgBDS3@&6D&&=>*$Ru<7DN`QmNEc%OecWHF>B0 z3UZf9GV-^nn|z~iEYAW$wch1mzlOpk)O++=if(a}+V!EWGE2NRY{xYaNgvWHm}Xsw zJhCY#taZk!O4D}V0xInLB;R8uBQu?#?=t<^Aw!7 zxgyDGbCub(3Ti*J-_w@A9H2tk`UZ7Fc0{`PhGT|A;pjeGWH<9-V2vvw@KpG!0{?jh zUYH@|y&K|@a1W6VQ=UqCipUNLZp2TiAOCmFbsfAZ{dr-H?{)@uHxW8i4uyir?4qe^ zq+01dbvL17DV4eoB@b61p$Rgn>Jj`ekB};PSAewU>!m0#Olzt~q&1sKYV<^xjh?!V z>G?KZAi?m?4*KO{(D-JnX2&qTEg}cFftH4o`(LlBx3We<|m?tc|!j0|eP9ba1 zhk2;n^nG_KTiAT+wupD^Xins>PK1RlzuKzJDbaMb=^0hB4?1F{7%4vV2 z)FoMqqwVPC3%p^dpgz#g`{Cn@NqeSXZ_sO!Xrs$EuMlCJT0VVaaRYQBrjd>%@+^B< zws&Yy4JS9_xfVcXXmZ2-uH@jNk$;yZira(zQ2@oC@L7qljyJ_k?(WPdNK$#-g1oeP z-_=%*)md8NV%IKaClQz(mYWjF<2UsR=hX{wd4~>iqB48knTNzd-%wM&82NS(`+ZAm z?k5!NhC=tbOjK;m)0?vPTu+Z5-cJ_I6V1E+uAoTHxutbyU z9p|vZ87YN_+JW+%Yhqq4p2c38sm{b{eDAO#*1*L@u7>-tP6|1XD}A1UNTZ7wSjG7V z+re918As0z`YSZ)2!PhtW7E!v(8##|Z4rB-MKfzB1@Kv1;ofIkss7e@KWmZ=+;**R z^|?zq+S^wDpn!%f_?3@?>Ie$QqKH->?aceAUwOUVvozc@Ej|+0R0Cy#@++XN z)$Mrz#NIJYu3juXL{_)K$iGA+t`*H>u(0x11>p8lE%s!{`*+&TDJ<6(@e6Q=`KF+!#Hv(Pzlz|U*6S6-v9~J$rPRzAOtGq7fwdD1j78W7@IX%+b*LH;yRb@h z?d^0u9HcDcscNF^1rFDQhr*v~QxFkQWdTP&#=gU%%RRDo`%5L!jnr@bk6vBAsYY#J zKeHGVUuMT<`1%j{Obo>Uu{(SjFI-`$K%fT2QB3U9(0f~28QY^xTGB);Z-u4+I>N$g zbbJEbgygik!PGc%7n$mN*yd9sko9SOxJDX14Gk*L2QVt?(U8EvNul)KJy;0G+0J+2 z{S!GrNqAce7VUu@ab)4K9!9n4<(ZkqCS2N@X$1us-5xX)1nYXSc37o7zzEq;5NClA z`Whp4QF$`QEaVz{%B$@ncsH^56A*e1rcaX7I zc^xQlWv_xH_zzJ^GiQa`D$E>MUXTmdy7Gw^zdjG>*DC5VhE)!_)&ij1#}-yFS4dy zl9x-G?H%Ty)J96`Ju_kP0|JtT zvR(~yu{r!)%UQn{ApV}Bfv^;JNLK7)WqD1uO%{6OGb6{z*QCPM#{Hbtj|QD16)-r8 zL{LIxh+jLK>XCs4RVn_>WZPXCTXU}xnx-^LkctcFUj)?s_(}?O5tTXai?l7nCSSjh z{?;*Q2)RbAkb&BX-uO2;%iLw8T2Q@=yQxei`Yu%A`J`q+N)<$EBJRRn6m>d^dNJ0sVBgz>#9l-{ zpVp+~S5ea=K^ELN5!p*>Wil1w{-US94{<$_MQsP8rk&y=phDOiL)cK9LInd4r%=yE zx^{S6zrVBbdNRHx9JyF|omJ=~qmgwQjUSO>5zs4#IngnO8%1%8Q=Bv(i+RE(L|Rc( zTI$PzvCj<&-n-5wwr|p4XQq>v1M4h%JYRyudN&O0@Mf4ZFh_ZBhDnV^IS^Q$ujt>U z8RmNa;?KOt)(4rN*|im>gzSbvATK%;JO;c!hh9d57;v7G`8bwbeEfoA3o{FR&tH3C zfJzU9Kc4!d-ITaHU=Sjr7m zqfsSz>}kRTp4na^HPO36N2ZC^DU z3)!t(6INJ})G-mg=1YX6QGq)`+ta9ikl+Pt@@Pf!U+1$*vf4_7G~WevMNv={8%>p@ z`os$n;5OwJS%3?3zlruGL!c} zhw|wrYIYE(c6mDl1@QQ`DVySEwDkQZyQu-?y@Y>c-ZBKgMr^{vOpI0Z;3j8|eIE+5 zdA?{=#!^c>RXNZJJUw(LUV6bI(L%-LXGpX=#CPWuI-z07{#Xj)VYXD&0cw1n^8EE|vHvgQM`@E^~q0nK!| z7robNH^*=(R}`mvZo<|kIi%8HO^y>SHF2jGhV9kZ&3A~{c53Iv{j^uNkjdcV2_961 z8RN2C&K1>b9eSi=f8==sP$~>>4d(PJ>d_CvS5Kj5}$387wu(JUZc7h7GP)2{pgIihfdvE8jR+-$jQ31?r#4d6(d z2khv4&uTUnsqH6v<4RGeF@f6~w=B=Jv+B{>Z-nCM^9bsO3o^Kzw{25WYc!r#w11;L zP=d7?6VP*h-KC05Ggr~i;feVm^AxovuHg2Sp5_3{itME<$2W(CRS*u~KI%z$}&N>1m?>-Faqa z7W7W5B|!E5(``M8PI3|~b(D92e3ULsnh!^8He@4fv?pTwcVSF|^|Rl15)Z?i3^({7 z_meGnr}syFux%8VsTlZ%^;_+iBZG&QB+eCA6I~+TijG3&&0h?9dv@n0FpR38N`m(g z)UYz&VXdaxaYQwA6nJqoCaye&uUE*|>x@g6Enwaa?*$Zd{@=)0Qwfa(DFR1F4E z4T>K=1tso5zj?@DY^+W?yjv-2$C2-G+U*mfk0{vY zIUu#7@#WR_XGJ>Yb_R&pB%48jbU#G28E*cp71gT6#=V2x_?OV#WtgB-2B6?@8%xN= zPt&w@_54|rn2%ZPRGQXyE)O~|!&PNRMYz=RU}V8I~j`&wXr*FERiO~UM#-)H|(uI#hVoN4#m*UX$Ii}d43FuXOI zbA{id74K;C>14YBymx4I#wAYPDs_a)!s9c4|gz6jYXZ!$rOP#xJT4L7* zSi0>gyzlZ?ZqjsHKXp)%t>b6>Z7xyrO_o}zuTff?XJG;T9eyfp9&3l>R-ZU(7q^m4 zqyK7i&rWa=(b5#257Ve^$ogb!9$iRW_^w^A^R@bV9ov)hIPvbGwML}&vJ0p$JR*tv z?wJd$kG^1Y%lWKXzG7YUaGO)?77p8W$6Q%-^6%{y*-@-o-|Cn@osBmuFopWke%6=v z|CY_v*Nyf!b%x9$zYotIj+7yot4&10McYKp zy%dRQU?xqq77=fmY^krrs!P;$WZQ^OEF&TwA&qynEk1Orbg)tfhkI?JHDXpR>(QMk2(QAfcgJo<>zy>h_MCo&IfDV{ zEiMaMem^1V#ZrOw>E9WycPazVEDi)?F?M#J8G-*J)}21|DyudtuJ5WoG0)~Oiw#In zES^eXTN@d6^Fz=(%a*pT%{3|JJ~qJmKM0&hV*t7$&zb>-?XtQJ8YEx_{$_)DEe*Ca$VKfc( z9vbvkwoAi@1aFS`Yh zct~^=za=nAOK!Tq&8E0osG8M|2 zc?w3e(}j23_o@~rN#5Jm=I58dnN_l$<6TX^_R3I z3c7-wPPEa7KQXdx)&~qhOZc$e+&T*<;}6SueE-Z{Gn0hE$W}Um+L$yjeN4ymjPREC ztrt?V<`VA;_J}&2)U+-#kU7aHr^O)#qX!(tZL{B*d_lIMa4}cMTaVrE?tivbOOyDZy)Ad?_GF1qmHE5o?TJ|fjiwPOamNo8 zWXn$eRVQx>b!*ne-Oz_}Y^k)0dj!qM-Sa)}C5u@9fV`hl2XmusKLQC`e`V7@C-T7T zbnEkz$On#LVYs*38G-F1RUecO8El4vwstR7*l07Br^}j}fbJi*IP9z4*gn3r-)xn( zKJUknI@yi#_k{e68(;j0$}8IK%)uv_9&H=u<^xt#zxm!Ol?*lM+7hkHc=K(_NkweP zKVO@#`q{dq8~GC@U+ryk`?LzX{S=jL!+rIn?L#d2h_D^LbbL zjbXM9*^K(Vc{hdi8#8Rf^3lvGw@q*-vsastc08r;U3Rv?vT?{Efy<)T-n4Z8{Z($4uq!7H!VX3V&fB$~|_{w=f&M(luH zw16hL&TO9Rr`mcMEB2d;80m3~o@wpHwToCedfh#~t=@@?ufEsPciG{%0%A&Qs2fdp zAD`+rp6m;^$yT-taxWQIB2&ceNaHS3#Kn9? z29nJEuPu)E=yA7RSl^_!o1gmqi`8RBoJDS3@;<$Drdwz93*@%b_dnFpPxiEVk??#w z>%4VO+?2-nL*4?qv;x<}vbsMm zc0cK7KLi?u#@fxFerf^vnZb?5cG1?B{-UkjY;xS+z0hOcnkj|M-qZ`;o^8syn>Z&T z4RaEKA*VtvA{ZLwwrL~TS;sjeAMzKtaD=QC=ZvMn?$(Ooj-NXi=={@{^9h`y)oDF1 zGL>|?seZY9wXHZGderUVPh{T8NHdm81L&J*ddu&arXRfWgN#7E9kqSh6uS$8<1IVP zv;$W5CWsDq-ejhVPY?eh&S*stgg=>Ys2W+-WiN$PfT%lj2ki6#-pAQqe$a$rD>nr zmbryDzAE2#KV`AdB&y}aRuO3~wyau_@NB@1w=#}kGI-fK>J;C8-Nvh5$nX2>@woEP z?mf3x+;xpcc|WnxVxhfU=j3{{wL7~g$4c&mWzz(OA8Fqw$g?K9gH4h&o=%$|ZFk${ zw%2RLIXrzkNBr*|_dD*SWi3Z$V3ajk_U-N4H=kBJ+cj*c<($$ehFWq2jC2e`w%VQG zYi~0v+!6}6{*u9YtyMjNLB^^GYWiOKS-n!FL?p>$X$NZ1;m3I^WWvKGVrZe|` zj)pkKZD;xR9m&)Aq~zd1Jc0naUTZfz??QVH36@R6+cX9>*zt+Y{);CPG|~lTxy|jQ z^h@pG&ly+-UcI{((Ce*u5Z3W!xX4-`gw$gfl-od!V zjNt?Gp@aYfKHb14?6|qg$9FU54<-a~R!k~gq)%+p-=5#K_l+1_V6|B|(?PC|3vAgw z<9Jik;zc~bB_v&$HFrVlIv$j3^h$1{>8mF&AmT^F7(v_Iv_WVF%^tOJddT(#3Sgd znY{vvK20)mru)Rg@qF4k4EcxHdEn9H*e|Ay?b^c=qYvKkG+Qr+JV>wMij2C zUueVVN_@|`J~Y4B7wdXD_tJ@yy+w-=N_L^&iVXZ~&t?q1vyW?)-R1;&$Gl>*C4JD& zHFR>WVcZ38wNs|mEo^(7sGcln8yj%gztL~ILb|59t;V>IkK)e{-C6j54B4B{q-=k4 zUp($m>h4xImbci%2ajTTz0lUl_2y_hp<;t)_gLcNT_;#muC>qX zmj)}+Z#9k0P}}aO_1q@&Iymdi&EG8Xcp5{9~3HrJL`U(+>>|K(l=Rd>FQD#S+fXBLeC~{n$MXO*hRVnU&lF zthxFbl?MI6@;itTxrBT^xkWeK{p~|d|5z>G%h&#Un_aGH-SpEo9uCmU7(RUrPo(?a zo}93n=$>FVR2xI?tw}cyZ5LN;uN#_UyOvSYbY6`2n|v9js|Q!eL$-X}uPqZ_ZnGG14`6=~`rpTmLFT zM~lOzv1A%gcX!>N<`C83yEEBNy1Mm8X85%%u=Q(^A6w__^J|fdd{LUdJ6cix7_<7g zm+Or8vap;~0DY$2ZN8{~h81EuEx^wcBhGHyomA{%w_`uIJP$Ngj)4X`H}J+{6_v7IkOk6LJ{ymh9y>!~&O#7G{C4V#--i$D($ zad1&+J-9SiXf;3!(jIm9okFBW1#Ig}a+WWN9a6IPx0w%TyvBKv>myn@R2B(#K^)P` z(w#}~uI>}!*%M^?Z5hm+=EqZ+-{wmlG|`<(OPj@5O5s=u_fa|Zbs%#o+bq9x=Qaz@ zCbM31y=A^n<$%3))+~jgof1 z9<$%f#fuo&Ikf1adh^cJzI^{7(L(te+}^RkPU5b>Bk&iXxG%GJ^f7nO6xZkHzvTj$ zd2Vk)HL_N0a`wBi{0w;d6hHrc!sfp=)=i!6z(1qDuaY&#uDW;GNMajg z?{`^mok^YJ%Xv645DI6L!L`)Lwk7UQc3#s`^&H^(ti2WEzw|YGUGezk_GFE>JDIj> zHPr0Lp=%S!659>xJJ%6+4=bpdv)zS0O+#e#0tY!Jx!)5H`jKNJ&aw8kEt$klc(j!T zq!TIP%xADXVJPE>?|~zyGU~B2wjN5}<0B^Wd2}}$ zOSWa*zl6gGN8K>KMl)qz#?to_bWr+ZePf;*VPzyt%3L{;!qGLh zVleqDmG}r1&U?W9aC5FN-c%kp#Vbf2(1Cd>ZuPl*yO^ZJNJ2$>McXNkon|l0r={BV z9N#V5h(`xT*#*pO_u!Y<%Q9*Ac;5^%rY<&2)y`AU=YGw;2dHx2o z9;fsC>ns|~KO{Ps_v|8<>#XH62z`$dF&)%d^ZR{7b0@Q}RqO#a(AEq8#eSmSb`g)_ zOO$L+rjGpv{SJFjT+b{%a@|KP9G^&ZV+RAGt>)US*frJGb(ZQloWaKSK-opL#5kKW zp{(L|ps&6&+uc3Zwg{L*-;>zp*$M7w&XsTl#9QnmYQM{^{=+?*JO4S}BldN62;XY& zC3fGub%-7P>@;-EK2t1P@Rqo9Cb_qG$y&ExgC0%8X=O7fQiN4Fu{3%FLA@Wy8*}a8 zE-!W7bu>wYiQK@^%{L@1%K~(83?JzO-;oxG+etaLCt@P{c?yJAzTcnc+suk|Tzhi< zPG@^^nY(9!9WTO(ZDS+a1fq$$oiJpx>!5FuJ$|?MBeNO6t-;h=hqi~7<}NtGgf7~Jn|?V1Ip2<|aBuYhHQP;DZM9}6RZ43bjj43df@Rut zo2GaW>(e&uu-G3kO5;~C+W z%v@->q;t${jznnQMo++U+jd%u|NIoyW+7cYOR?a#zR>M=j?8GyQs4Cjv)GV=S%RvA z>G%}d>Ut(_-Iyt@owOD{S#PINSa&CY@?qczy9UDxK6YnzvgNRYJkM0_koG~~YW~`e zAP(Hb-L`BT=$pAErEQDyVeYV!R`-GJ{rfVxn@!o&v>M5y@zy|H?@*l)53*s{7W6)_ zys3#h1C|L8>A~H7JP*#O zyg7dk;rrBeU;Xh}1XZn9Gx0}bcj)2|XbS@r+4}V^j4r&2hk&BXbYc>UJi>;?NtAvyTiMz@S7w5atC#HO5>~G7w&RQo;R@qvRHf3g>(n=@!Y?7^st{>qx z|L4R7BYf|@fEAtXaXX2X!A5QyT6k@Ghql#J%yP7Ho8>5&oqgq$`UBHB+rC0?YZiaX zm+X2*Tx$`Z@g3L_ONo2aigqfOSJQ+2$=7b*%-H~DeR(!}Qy0y)BKkXUk!E%&o4p5_ z`Sg2>-Sz!6uX;+~jaIM?UvnjD&NR~iQ`38xst??~1FqLr4i7QqkF9r|bi4NR*vUj7 zPil}4_eZrY+T^xd$HHjGlPCO$s-Z zV(D^E`la~+oFxALEY1Bs6Y^&5Q_0@iPSmS+xWH{`$Dcag?X_mwo#r`(;(gHN z=}x9}jCV85bI*6T?&*5Av4uIM^NIQ~mP=}zK}$Q4AA66@JdV@6``!HX7mSpI3Kj`-+!kXw87=AggmAV;q*ZT~Gn>EdDI=XF=t-v2z zV2PHYj%RnRwYxQa_02;tO=A?cH^*b~>A;Wmy4~n{lgF_IYpCaCuUIQulj-H}wj^rr zb9c?H!{|3!ZS&ZrrCV%6%Xn5ozjDX)5Wr7pT_E5K$3l7RQ0e$grqSoGooc-g<-jh# z-Dg|kvBMoa-EMHT((Pfh+f&{C^qdXdZ7fZB5z7R3>wx>Z?N9tP%LGy?y*7h(`Lx-2 zct}z@Y%29#r~%U&Cl(PS+A=DBvpWSsh7YWD_T z&b@f2_h2jaf%FXry0LTG-fgnUoR7fd=FC?ee32j2qonD9qj?-DJ7L){Ni&?-?T(x~ zn1bKg{cXl1yM%TSYjm!@V(%sAWg&>|;DAgzj=v zCiBrcu7lZfL)z`_oU!R6f82FKeB%+eq1<}fznSc4hz*8bpE4m?(8kEiIC91Gq4~0H znIUp|y&53lj;XipFx*`2p6hpqFR(=_imu(A*-hd+UE(X}cT~<-C%AubL7G+0gBH-) zfs++{{^vZN#mWri1Tb~o%${O<&;LPEs>#+Qs~p=w!dGMbc#|C@{x(+598)TO%(L(0 z4zT;9f8ZL&e!0ue8{g<-;XNqw(h;PCWwQH@-%~+Lc+elHp;iXNfXO!Wclg8NZKwNE znRnlVzi>{!`&>Pxp>Egsa}TWfjRK59ufW8xA- zVc(>Qc07TM%x9UOFJpmfH8mNvS9dCVMakfpzb2i2Fvx#pZk=d&#@CfyxMXFTI2f}< zM47ftYtdbxfl{Sf+i~I@9p*V$vX; zZnL_qdoOIach+se7&47tSjY4iGA3`^2GllUFF%ZQ zjG&cU?EdO#{=nsY%TFK{TqhfWd@7GI(jvLR>l!U}be}uZZ)>{aOn+PBTwh?`NAC+< zXO7~I>&|rRArpKa%x}QsuYD+a#I)i^$TRGucp+mKM1#h+V&2Dqw4b!*dJ@3cs1ne5So z`ikpTQLQq$Ucl!atU?)W``uUS((Y^F%AW4OQ|n-5xl>Um+d%2!HM&{cjka*bLd7x5 zor=1U>o8aqPM=0F`w-81%dzfIJ2y@OaCGZ}gJkWY8?Ok%@P~B9wPsUpE9s7Gc(zgI zZv;C_OKRtqSEOIrtB{W8MX-#Rwma>#&$YR%{Y$_b7%fTv%ygUdyQgiS89~dZ+8*Et zd{4bA)UF3QaDrV9bgY*@|5jQxwFUJ=i8&dQE)DC%S09y z{&wTpZrexLxonXRJ70-NMp{vtM~(8iy?v=CGxSIJadSVbC%a0euBV4+pI_*4&)QD3 z|4>a+EU4r%m8mu*ZOJiaiz@##ae-eGo;zjoXqI0O^Ne>yQPu(F(CUJZWY#iCz{p|w z=HL2wa!o5-oo~L?SJ65QN`tBMT2tO&x%1v0_x)wAQu%Oqqnhg7XWmjWXkWyHz!@KR zW4}A7Zi15uN46NXG&}SK!V!D_)WHMpZojASbF6q7NqlzbGn4F6D~9WpxkA%wk9D3| z5Wi<>PvViS?YbBmfp3Fj>ix?(t=}FDwYLFHm<=xv^tmrCZG*S@0{)QpOXcN^)Becp zzWjS$&pkks|27@2$qe{K&dhH3Q#u>hhkRoTK9Xn0Bu*?4?N5@=&FLDExNB!Jv~dIF zk{OfT{&U->P^X*NoX|d*3V7GGO)l44WB%Zz&8!K(j{3`T=@Ec!J?9|P@g{kgsu>~%Oq zYv+u{G~7Y)c48Rf5DTfJw$^4#az{;K(Y`tvaJP@vrt`eH#@t7vKlP7h27$V@>&n*}&_ZN>F2_AiWFl~u(3^W0JW?%2B8zeI=a=kJ^| zb}+g*j9UEk2zMO8L_N+v?B+4d_SVC!?Ij&=55zjHh1n6PhD_BI`K$E+W$l)duob23U^*1COXuqwy4J@#JnW}n(h8eYH zjOTnwE^w25N$P#EbQ3O|GS!~*dc;j0yWIWE4kr2e$!FAjHQin|)thvE^65ncdSbN`k=i-4Y2}AiBr~5f$ zzAtM^Utd~l6eQvzi>inAHvLQj~>CBkBO<3IHb3J42 zm7lg}Ewy!F{3gwu>M7kVe(k%M3G|QtBAGkX>BJtl#em!Kps_UU$-VBmo^FC6jBUpito5eOGvhLm)uAnf zfA4;8FTr@a$8AOjo#0me;iexI>?8aL;(^)ton+n2Bdy3L16FU^Io57UR;_Y@DVKwDDo@+I7Gialn?P)+jF8cei(sVisz}?kv$b6=aF# z4e)2{aDL(|^)8FOh~htO1MP7Z2eIq2&S|japsk~m4oPv@#NghvkgvVZJ$y!Mn_8c* z+K-bw^Hs~G?~7^4_8PPw(rH-dj9Ivtsy(Wg>#413{cS;YaS7n9xI`6mW=(tKBx={9 ziSc9<*krnbJDBwRjQ1J1cIkDeOydJrafcF@j%U#0Wk?BMCMQl^;%1UV`r3fIW5A8D zEZ$GuHcPX34YGJN%=cLtkK>P8hqBK(jK?;Uq3)A>(q2>jC)p0Tx7m0xFqh|OpR>7p zeDI{)>K8H;jG_FD;%wfV#q<6e1!fcOk>viiay{e=+FV?3fQ#zwZ)-2R{q0fTCN?A^ zWo=^VDY?V#F6)F(sjsnqj5hJ{9=klKeT4lbF65a!jY?t@KEs4NausR-8szz$$R)fXXZy#lbv>xdZNaa+H%<9J3JMJ=Fxe zK0&z(qs}CfTs}c*8*gm>J(Qnq-TWDDld*&2dAAp;?3}XGoIF3i+qhO|XG2ZBq&TupO-Klj6zdW&> zzG~MD&Ge1_P3rFO3GQzLZn~|-Zy|fI+*-VY6fXMT*5doJ(CP9W{4ee=)2AUVEMIB4 zE+1aLX(LR%7H1c(4QjTXcvWl`2>=!VHo~z(#_xPz;9LIc4A)kvtNRecFXb*d7<<~} z&=KJ&QC8Bve}|!h+}_D%7DjV=(PuP|nc92^@d~%O_`Gj#J8K7*RaK$Cl*68--)o6?Q>_WDC?aax?4=2L0 zU6*|FL6qb-{nqs?+WRUqYg_NA-nHwQ^#ne45rM>c7V4cw5Z5-F#S_^f&Pfy0A`vOb z@4BrQaq*rh1%_`LQy0_rl~|H7-s3MHMYx>wT%CK|#9ymYkx%zy?z_ItJl%COg*@=gt0bKFJabnqvrb+%!*4-UOw*2wP&k| z)pwz@hMDX}T0;CPztfU2b(nLBw$qXdZY5Rgot9_qz<)W$EoKucm!|nzn`*JaH1ejd z^-lZQG{4Ez-E@+Uw7)i%1ia$iZ#J==3FecGrIfhK*p>6M0>^8Khj{ZaEA+5px zv2eyFpZRWHKd*Z51vt_QFn}kxK}k<0jli;b@RCl>i!=@&Wqk=RFx{Qi@6f8& zm5yQnA2XiGX)sH5E0yxS3GSx@ZVowt$%Mvt5smvvouR{$RCfDw_lPBQe$z2$*%qMD z7?3A9t+XYg+m4A29rk4@=_`kUZ4{}jE&6$5%(OvG!Fy3D;^Byjdd=+jXr*!+MXQ=W;X=!_$nT_R?t!QWkR1b%`DCd~bl;f2@uDi4N4)8smI{ z{BMpv&|besRnkfo*Es)nD}YS=LPS zGU|_G0e--Ki&|ec3Z(*5=FzH;sp@ycMpXGPEP`3+-ep7Rh1|IM%>5R%bn~T%(O4)C z1ueFTgxO&A=h!aUd1g|FqV<-pou<35PG#dN%MQYYtxez2Ix=^Pe*nkv0KV`rXU#~> zStC7_5zpLs4{F>l9+*UPWbI23(5lhXdu(U#p~T`EAd=T4xZqnBogRk@4dZrZsi_#?Va|x{18c6$#Seq z9Zg5uVxR3{8rX>oL0VIDLWsv+pnf(YcUbQK>r7}fyV-m_*dJ|Y-Zc|!XWrfR4qPhd zc3W9e->s0egTJ>jQ*$@l^T_-({p>u8IL=NPT*GAqT<$!$q8yr^?Q{x5!g%JlBU-9v zi=kWN{>NAJkthNB=?FK2Cb71yfESa~9NkA~`Q8F{9zHR}&G#W`YhC%F;_~UX|M17e zjFk0wxBE@*2;N%HZQyl!;~Nu~n-InfUK7lGcMRj<;Dq2aIJPCIPHb8C{3*K~uAm(q zON6<;HDyKyLhhjs$}llFDVQfkZ{SI(qd`aWw6D{}zK;&7M9XY7{JGdA;jBQc%r=vnZJ;nyrKQ5pn4_0C?mAIEboPUHLf&Rm+Ffgi@ zCFEe9e7qgwrV3ddu|PS>hsd9@3^GRy*6^}})#TubA3Mt(+ZiY8tK(QxZoZHrt~$51 zT>P`IzkB%aHqLJ9$Jw>5$riNhYQQZ<3asp&vMlnc4_;R%I;>bs7M<<;^S?G`!2QN_ zcW$qX>oxGSto~^W<=i;db$!X+_DGqYTI^4t&01hR?N}BubLY)m8s?wDG_fM5%Q?hjCnkBc zx7p#>r9G|Pr~3(=7tZYOV>+Ei?D#fg-AM9}H&aXX-84KNTH~O|utemU0%IVj+gT<^j#J1G^zgy{x){5r$zL--P z!>tbe;U$~)qq%iCpRhxeWN_SV7wd_CHt*pfP2v^R)CqfSYj1np!6LM;Q&x_UU0nCP z<8Aa@V3+pIY$JU_6#6$ehZl?wxO;0qbuv@svZLoDGBu2ypYU7j?S_*n{BRC0c3gjS7^Om#r+JCRTN4 z*o&8DTi-jKG9Sjq9E*0y))3_kZnm?nLj*i5TUjYunUkpu1^#>?o9-A{@8?+B5_cL$ zwjy`JP5XD#v23+EcQOH?MGhVAfC2UZkC=4i{=DgM>aw}!U1FBUZA3?%?iH?#u2&!5 zRAZ3_=> zZEsK@dq~`q5;N6o=5{AaeaL!Gr#p6u?FRl9U47v^BA>c+e1j8c7{~El&Khv%4)`=J zU;Pf(*Shh#j-u>N2!EFxhY=)u zm5=q2#CyIM^plpSaJHq9N?6(1MafScOd!P80RBVF5L{B8)cEwGZojba1izSO1lFCLXr>*v1dOsf|!y^IKBZVqaO? zBvfnb>SMmBKl;pM$!WvcEPL0Rb5h42Nv_g3+7GvF>z{3#MXqJsn+!yeo6d>c^Jn<5 z&Np520KcJ5zA@mQ_sOV37%FUH+uLc1xw4JJfOy~e*fc0EOEl}JK+E}vN zxz@#8Oyq;%of$$c(Ekm;WY5O$mRxL)<{6up{?Oz8VhfpZBkkHq%LWknT7|K#f6+8{ zhawY5I=3C`;sfjoiqCTAK83P=`+8lfZ_^-sxhdCy z-h}W2kGc)6wJ*K(h`eAPn-*G)lHJ#Yw{^ZLu*z+tC&9U@8QchN~N38EPtmhr;I_Y;u zS;mQTzU!S~1c z%Fom(LF(yW^qsvD28h3zxwG2^p0m||U%iBCzu;|K{rd=@V;cSDbdr_F_+kDQ+7oxr zk)EE(;nz3o`vpdPoFYj4E7J-ZMs`m3w+EMb?t%03;AZY5A*V; zN6n;=hxGjHq+_;WBBTzD4~$@ZqdzbEz3xPkw!5sh|Z znx5Te^R~P0nYOqYpSU@#%KGAtv>|J{tJUY!*58gRH|%666J4ieQtg@1k2i7+Gpg^* z^y9{z(Ei%R zCqFjM`JUu%>i1b_8|TjW{313Y3`G{dqm`XI%{I1OWrN&V#0ssetSC@+zVnBV+h(qX zKC(p7;be2(8cAq!e~-@q&T4CE5UVT`6fbqTJ=)^R-xg@k^(`vU`jHQhY&F;Awy-Si z4i-iq&B$=EzpSF3cE&9;B7A10``W%vDBzwV>~Wp5E_7!uY?QQ|#c^9~OR5g?znx^B zkhX8O#U1g9TP}{L5OC8egOJmh}f>+eh8Wwq6y3%V{u*MqJD{WwH7fPM_RK14Tyt_R%^qPd_OKsScy zCeV$bxgok4G#7MJh;9Mh1iCpyw}Ng4-4dePK(~Ny4be|Pw}Ng9(e0qyKtBo5JkU=- zw}~6{34UcY*E>(Y>I%LHC5{KF~d&dqZSa z<6h8xA-W%QA83Av*Z|9o$?fj`5IqRGAM`+oehPX3^k9g726_!3G6v52v>5bui2ek6 z8}!Ez{TcK}(4Ru|7to(Te-6<*pg)8D5~9C?{sMX@L`y*Lfc_eycR_yzEmku_d)*w{WnA(fc^`5e|g09j)3<8 zAAA^?Y3H}vKNM70Paz}5Xh~9+UUKfvwjyF3$UD#Y>1unI75vjiPWzk@*0WYo_G#_> znU3ZEj3I7)BahbZI+sWGc@0qKlJ;T7r^tSd&uc9IOZIs&r~!&Xlz<{o93sv$yBL&& zC<7&+G(>jiQwqvLWMVM`0Th-{C*ilCK3vsBu5u&v~Yk<}a(OA%$ptV9|`_BW4zzZN)&;E%S|>#I4zYDW>xO83(7K@YLbL&BJ<$3g8V_0@v_XhI z2HF5LK13UW#)Ccmvk+|o+6=ULh_(c64%#9_ zY-@L0fVK?LR-i3G6GF5#XaZ=f5Pcf76=>@aeFn5O=+hzkEa=mq&xB|j&}TrO4bkU7 zp9O6bq8`vTpwES9ThQk~Jt5i-)C1Z!MB9V51#K51vya<>whz&cpzT3Bgoy11y+M0|_6pHHpuIqQhiG5W-k^O# z^hMA1RVhSQiu)$ zeF=16hzMvA)qNCIt(-gbZCeU2OSDJEJR-h9R@l) zL|*|N4*GJ4z6$y>=qn*Q0`wKoS3@)v^i|LiAvzLt1ZZlAjsi^u9T}pdK}Uj)3end< zM}dwG(bqvogT5A`Z-BlA`g(|t0ev0xjSx)(eFJn%h}a6|jsZ;z(Q%+@pkqUHJm^@^ zaUnVZbR6jT5PcJLJm`cFeG7B~=$j!r5%f*aw?Z@>^exbdAvy_kB4~PuOdd`LofM*z zK_`K}9ime}-v*r=qVIrC2AvWj-mv0M0evS#r-8l$IyFSSpi@Doh3It9X`tQ^odN0v zogShyL8pVx2+>)fGeBpC=xorLptC}B4(Ke<*&#X?bT;Um5X}Ic13EWE=Yh@z%?Q!? zpc$a^LiAnGd7$${^gYn|pznt0`=IZFz89h&fW8O%eu#bu`ab9fA({#L0qBPzx&ZV; z(995B2$~7HAVe2|E&yE^qKiQnf-VZtC7_Ey7l-Il(8ZujLUbAE640d~ngzNPbXkZl z2VDl56{0IZvp|=J=t|J#pesUj73d1kl_9zsbS3Dj5d8>r73k^^T?4ur^rH~X2K@+h zO^D`zt^v&s(Y2u2pgAGB4m1aJZHRshx)yX@h^_}+2l{b{ZUFrlbbW|!1YHlhAw+XQ zH-K&o(M_NmL32ZNGiWa8rV!l%x(Rf1h;9Yl47w#mw}EZ}-5R2wfNlld7NXlhw}E~V zqIsa7fNl@b9iZDm^FnkdXddW}5Zwj319WGI?grfnx+_HYfbIg_9in?dcZ2Q;(S4wM zK=+1dKImT1eIdFZbRTGbh#mmV2i+f{2SN9P9thD-K@Wf)4AIX(4}yLgqK7~~1^p~U z4}*RNdMHGFpoc&Yhv*T|!=SzpJqqdrJrbhFK#zbP4bjg*kAfZx(Jw%cfqovMUxI!P z`bCI-1^NZ(mmyjJ`X%UBA$lD2E6{=v{Tj3Y^mvG#06h-+b%=fg`Zef@5IqTc0`!{@ zJq7v==*bZM7W5?OsSqs$Jq7x0h@J-h7PK%#&wv(!o(|Eopr=94gy=cYGoWWf^gQTU z&~qVr0rVW``4GJbdLHybi26YUJ21_ zpjSYzhUj(BtDx6H^akiP(CZ-@0KE=+BSecpZ-53u^d@Kkv}k!$yRWW~a$jBAeRXN~ z)ur86mv&!W+I@9t_tmA{SC@8QUD|zhY4_Eo-B*`(UtQXLb!qp-t~~9&y0rW1((bEE zyRReBA3OS`Ww?Y_FS`|8r}t4q7DF6F+ul>4$X`d!1juLh&#u31E=_q*DCv7H{&86taeM<-gWYk6c^EHW`RtQKPzu6ADy?YEmMLo^n&CTOh?jRUO(8XKauL1RJVLbMKO z9BAzjtqWQkv`&cD1FZvEH$>}$)&;E>q76Xnfz}Vvc+mQw4MJpBU~K>zAEFIG<3S$_ z5!=AE`)X+S)zI#%q1{(QyRU|JUk&ZPc@>K@&o>HE058s}Ow}v=wOU5Pb%;HR#hJ;(C(|D-B&}quZDJC4eh=f+I?|z15abe@M-MK)7TNTQ-~&lb^`4jqFq2c zgC>UP^Pq{KT|%@gXcy4uL$n*{^PpWrv^!{5&~7360%$kT?jhO(v^(evA({mG0%(sA zaUGd0O{`+~k0qRF5yg7yp1{-FIplS6a> zXfkO35Pb=>Kj?rE9SAxA^ra9T1o{%_zz`h_IuLYFhzPt#f zpyNR&gy>tK6F}b#(TSjMg1!}^>7Z|cP7KjWpc6sUL-cLXbkIp5IvI2l=-VMW1@vvu z$szg<=w#3-A+oo(oC5kzh)x522XtzPdO@dxP7BfLpwmFTAvy!p3pzbSXM#=#oe`q5 zKxcr?4AI%3GeKvC=p4{lptD1CF6eB~IU$+>ItO%ah|U9@3z`w4^FcE}=Y{CIAnCpu z+I=;&`)X+S)zI#XI}-SYKMcR&1$;y4z8cznHMIL`X!q67?yI5QS3|om?#iHCmxblJ zoN`?TniZleK(j!Xhv-Vs<)AA(C(|D-B&}q zuZDJC4eh=f+I=;&`)X+S)zI#%q1{(QyRU|JUtAYLHy_r0HMIL`X!q67?yI5QS3|om zF2La%J{Jx|FE9{22YNn4FM^&2y%3^)&(C(|D-B&}qFRo_cdHj3%=V4Fr zzdWjcgZ>ku_d)*w{WnA(fc^`5e|co*z8cDXMYylV@a`*G$R#?%o%@QU`{K4g{(i^u zf4_ELR5PeEM3^c&_w`}-Wxo~i(}fmmEdN`k#bOg-gH9%{I$gYiA z6SP){#(~xXjSUg6?9uLvx6|-jYlpwJF2A)lXq^zP2U-U-tow?z`--&t;&MhlaD(t~ zeT=^)-B+aDSESunq}^Af-B+aDSESunq}^Af-B+aDSESunq}^Af-B+aDSESunq}^Af z-B+aDSESunq}^Af-B+aDSESunq}^Af-B+aD7w-+EVQ&{U>>X&>+kv(Z(T0YsY4;Ur z_Z4aP6>0YsY4^qJ$|&;8uXE7I;O((WtL?km#nE7I;O((WtL?km#nE7I;O((WtL?km#nE7I;O z((WtL?km#nE7I;O((WtL?km#nE7I;O((WtL?km#nE7I;O((WtL?km#nE7I;O((WtL z?km#nE7I;O((WtL?km#nE7I;O((WtL?km#nE7I;O((WtL?km#nE7I;O((WtL?km#n zE7I;O((WtL?km#nE7I;O((WtL?km#nE7IaZeMQ=RMcREu+I>aZeMQ=RMcREu+I>aZeMQ=RMcREu+I>YI<-Q{Az9Q|u zBJI8+?Y<)Iz9Q|uBJI8+?Y<)Iz9Q|uBJI8+?Y<)Iz9Q|uxJO>QuSmPENV~5{yRS&Q zuSmPENV~5{yRS&QuSmPENV~5{yRS&OuSmJC821$o@4n)NE*jQ-#nOH80vkrWVcl1( z-B+yLSFA5Rj9mjQ7A-%znifk;j18;BQb^1fOqTy8(_$GY0i_|zK`AH;Q2~rE7tCdcV+YCM}}X1MZWw<&?r| zRteE4kaS|gU7W>epho;4H6Jx__ zu>vCRJj}HF%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m z`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY z%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+ zwEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m z`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY z%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+ zwEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m z`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY z%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+ zwEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m z`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY z%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+wEN1m`^vQY%C!5+ zwEN1m`^vQY%C!5+wEN1m`^vQY%C!5+KFWP%+I?l(eP!BxW!imZ+I?l(eP!BxW!imZ z+I?l(eP!BxW!imZ+I?l(ePtizzB28;GVQ)H?Y=VYzB28;GVQ)H?Y=VYzB28;GVQ)H z?Y=VQzB1*$a@q`$g z`h^zz(4~i_#R?N+!)mb-lJlpE@SPYHr~s8AYJy5o6`~QK3e*hINKg|rB19{I)R}SmGD(Su|?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzPQ_v zqi!E^U-oXXik|{4_MuA;O^Y>6j18;BM%b^ZI}a=EzAEj$D(${1?Y=7QzAEj$D(${1 z?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7Q zzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$ zD(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1 z?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7Q zzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$ zD(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1 z?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7Q zzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$ zD(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1 z?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7Q zzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$ zD(${1?Y=7QzAEj$D(${1?Y=7QzAEj$D(${1?Y=7QzAEj$s*iGCm3Cj1c3+itUzK)W zm3Cj1c3+itUzK)Wm3Cj1c3+itUzK)Wm3Cj1c3;&;xvxsQuS&bGO1rO0yRS;SuS&bG zO1rO0yRS;SuS&bGO1rO0xvxsOuO{xR8s2?17rJU#_tli{tEt^rQ@gLGc3(~HzM9&7 zHMRR{YWLOD?yITYS5vz$Uf!kLS5sel$k8vf*oR*DWm;^6iLqg|*hq+c-&a$+ucmfi zP3^v#+I=;(`)X?U)zt2*sohsoyRW8pUrp`4n%aFewfkyn_tn(ytEt^rQ@gLGc3(~H zzM9&7HMRR{YWLOD?yITYS5v#MrgmRV?Y^4YeKocFYHIh@)b6XP-B(k)ucmfiP3^v# z+I=;(`)X?U)zt2*sohsoyRW8pUrp`4n%aFewfkyn_tn(ytEt^rQ@gLGc3(~HzM9&7 zHMRR{YWLOD?yITYS5v#MrgmRV?Y^4YeKocFYHIh@)b6XP-B(k)ucmfiP3^v#+I=;( z`)X?U)zt2*sohsoyRW8pUrp`4n%aFewfkyn_tn(ytEt^rQ@gLGc3(~HzM9&7HMRR{ zYWLOD?yITYS5v#MrgmRV?Y^4YeKocFYW_dI?kPz2El{`oz1a%R@DZQHhO z+qP}nwr$(yKDK?%-91+Cr*+4gE9&tV^QAKD%ZMEDpA~Ljk#PHpgxgmn+`b~=_7w@Y zuSmFkMZ)bX5^i6SaQljc+gBvqz9QlF6$!VmNVt7P!tE;(ZeNjb`-+6yS0voNBH{KG z3Ae9ExP3*!?JE*)Uy*S8iiF!&B;39t;r0~?x35UJeMQ3UD-v#Bk#PHpgxgmn+`b~= z_7w@YuSmFkMZ)bX5^i6SaQljc+gBvqz9QlF6$!VmNVt7P!tE;(ZeNjb`-+6yS0voN zBH{KG3Ae9ExP3*!?JE*)Uy*S8iiF!&B;39t;r0~?x35UJeMQ3UD-v#Bk#PHpgxgmn z+`b~=_7w@YuSmFkMZ)bX5^i6SaQljc+gBvqz9QlF6$!VmNVt7P!tE;(ZeNjb`-+6y zS0voNBH{KG3Ae9ExP3*!?JE*)Uy*S8iiF!&B;39t;r0~?x35UJeMQ3UD-v#Bk#PHp zgxgmn+`b~=_7w@YuSmFkMZ)bX5^i6SaQljc+gBvqz9QlF6$!VmNVt7P!tE;(ZeNjb z`-+6yS0voNB0p z5^7(+(7qx+ZePDV`7QFp_Vr7!ef<({U%!Og*DvAr^-H*Y{St0pzl7V@FX8s}OSpag z5^i6=gxl9I;r8`QxPAQ+zVwhszsO<{|8KE`Z(;0*Su7Fxg#wrG{h@D9pCv&FP@*Xr zN`#V3DNquWY)XZap%haZlmexiqEIT7W{N>+P}CHMqEO6~4#l9jDFYOT(oGqmbSQ%< z6O;kUXvz#_gff}3K$)P-rmRqAD2pi@lm*Ia$_{0PvYB!~*`VyEoKSWshbb471IlU2 z4dsM#nesrnpxmasP;MxXDIb&v%4^CG<%RN@3PAaw{HB6XeyD({5L5svXeta9gbJC8 zK!u>frlL?`sEDZ;R0Jw&Dh?HeikV74#h~J*l2CD|gsBu%0xD@L4V8pSnaV(=pwgzY zP-&=)sT@=WDr+ham4(WgDnR9+@}`PVd8mS^5>x@IXsQfVgesY;K$W1%rm9e7sEVl? zR0XPPst#3!s+np))u8I8noxD9hN%`*1FC7N4b_Bdnd(5bpxUOoP;ID=sUB1Zs%xqb z)rIPr8bI}+`lg0ZeW-z{5!3)`Xle{Kgc_NeK#icrrlwG1sEMf=)C6j3Y7RApnweTa z&7kI{mQZu3g{c+P0%~b$4YhJD{TBu`^@aMG20;Cw{-%LYe`tVd5HtW9Xc`O+ zga(<0K!c#crlHVaXozVTGz1!I8V(JGhM7h{!=T}&kIgf^MBK%1b=rmfIsXp3nZv<2E~+74}nwwZQ7+o0{HozQk@ zhiMnI1KMfY4ef+>nf5@tpxvgu&~9jtX&2irlZhd=!oeUbObtTIu0F$j+stC$Dre;lhASKgy|G?0y=3r4V{Ee zna)6`pwp(a&}rz5=^S(hI%_%)orTVsEo|#@i&!Fd~m(X+Qh3OUa0(xnB4ZVb3nchIJpx36i&}-<8=^gY2dTV+Qy@lSH zK0xoF_ok1~d+3Ad6Z8T4X!;C&gg%+RK%bz`rmxUv=!@xB=nM4qd-`8|-}{HqSLlEI z%FiGCUw<&V^q>8~|NMjh`9FU9_GR!Nfxm)(X!>L551~IY{R#9(&>x%r6#8T6PfULX z{R#A^ray=N6#6sMUqF8b{kiEcp+ATI!t__rUqF9p`fKPfp}#Wy4fI#gUz`3G`fKQK zOn(Rc4fMCBzlZ)7`n&Jx|K&IT577VkyZ;CL`|t7F%kq!l-$Vak`X}fgpno*|GxU$p zKbigo`X}h0P5%o0GxRT}e}n!7`d8DxL;ni>o9REGe}n$r^q=0Zve+-*zrf#~ z7E9zM{^f^RED1^AU6J_xp>Kb3$xtGcWJ-aOpkz}jlnkYq(x4P5)f9zNp)^wrN`s=N zI246qrgSI<#Z4KYIFxS62&F?AOqrkzP)1W`C?k}~lm*HJWj1AnGDBHR*`O>?R#SE; zE0oQY1Ih+vH|2z~Lpe;jpd3(6Q*J0Hl*^O{$_3>%<%M!Xc})4BJWyU!ekd=L&r|@) z2jw>vgz`fLOogBVP(f2+s326xR0Jvn6*d)x3PVLq#h@ZkQB!fKC{)Z;0xAX-H1F8m9H`RoyLp4mbpc+t3Q*Edw zRLfKcss+_H)rD$9bxif3I#69xeW)%}&(r{_2h}$F2emhKgxW(LOr4+(P)Ac|s3X+L)CKAUbvAW{IzwGd-JmW| zS5tSWE7Z-@1L_8KH}!IL;S^@VyveN6qJK2Tp%f2c3i z&olt)2lY1%g!)4ROoN~S&_L5*XdpDmGz1z14K@vh217$k!=NG1P}6W|C^XD80vZMl zH;sgbLnBP1pb^kW(`aZUG|Dsv8U>9ujfF--V@%_qG0<4kcxWs%&NKlU2aPvPgvLV? zOp~Aq&_vT@Xd*PpGzFRjO*T!1CPPz9)1WEPRMT{5Dm2YB1DXa+H_e2mLo-aXpc&9i z(`;xaG|Myxngz`^&4p$|b4>G~InZ3wd}uB-&$IxV2hBGvgyusFOpBle&_dHf{Xd|@Av<2D(Z8mL%HbYxX z+n_DbR?~K9E40nD1KI{{H|>PBLpw~npdHXo({5-dw9B*y+6C=4?S*zjdrbSFJ4ns#w$Dkw7QPXkgD0Iwp z0y+jAH=TrzLnln9pcBwZ(`o1=bjoxFIt86JorO+AXH4gyGtgPndFU*3&U67f2c0)v zgw8`3OqZYw&_&Z_=puB z=pppT^aOeYJvKds9z#z|&!8vJQ`2+kDfG6(a!tE;|+`baR?JFVNz7oRi zD6(a!tE>JXYDH?+`baR?JFVNz7oRiD6(a!tE;|+`baR z?JFVNz7j(1DLNQZ16ocZX3{V_OH)Vv< zp$w)>PzETYDKnH2%4Es{Wr8xBvO<}mET(Kw7AUJJJCqg5X37C&gR+})LfN4lrd&`C zD5ohmloQHj$^+$sa+~r(xuHC!d{7=JuPHy27s_WU0Of=7n+ihtp#r8tPywi*sW4O! zDr71G6@m(zib92Dg%{* zN}I|;rJ*vWa!?tltf@Ry7Aj||0F{Hvn<_%(p$eu-Pz9)>sWMa%s${AHRe~y;szQ~a zDyC{s6{xDII#d;^W~u>IgQ}ZqLe-%frdm)9sHUklR1>OYssq)6YMbgpwV^tudQcsx zuBkp$7piA!0M&!)n;Js(p$4W#Py?u;sWH?LYGi5xHG&$OnnI1CCZ=Xk6R4@FIn)$t zW@-U7gPNOKLd~HTrdCi3sHLej)DmiCY6G=`TASKJt)Vuic2FCrt*JfK7HVhe0JVeK zn>s@6p$?`_PzR`^sWa3O>SXEyb%HvZxI3zHdYk$}y`es)eo!B%uc<%O7wTsk0QH0Vn+8Jtp#i2r&;V$l zX)rVp8e|#*4T1)nhC+j(A*Nx_5NN1rI5ZR*W*PwvgNB<%Lc^gErcuxcXryU0G!hzR z8Uu}jMw`Y$qoFaTanKlOtZ6(n78+-o0F8sjnIr0p$(=@&<1FuX*0AD+GN@SZGtwNwnCesEv9YI7HF$!JG2$rX4(O5gSMM? zLffGord`kuXs2m6v=iE8+5_!^cANG>yP-X%eb63guW3KD7ush!0PTbJn+`(zp#!Ev z&;jV6=`eHAfX1W1ggRYxyLf4@ird!Yr=%(p5bQ8K|x&z&UZkz5x zx1l?xd(a)|uIWB>7rJM90NsP`n;t^bwIrJ2IW_kfVgPxmSLeHTWrdQAl=%wj3^b&eydIPG$@P__Owv z7;ayQ;r5jnZeNMv_LUfJUy0%Nl^AYciQ)E@7;ayQ;r5jnZeNMv_LUfJUy0%NmH4yv zl^AYciQ)E@7;ayQ;r5jnZeNMv_LUfJUy0%Nl^AYciQ)E@7;ayQq4t#+YF|mTuf!j> zuO!y;hwUpV*uIj&?JFtVzLLW2D=FN*lEUpPDcru2!tE<5+`f{+?JFtVzLLW2D=FN* zlEUpPDcru2!tE<5eCc7*ZwX|v#P4_VTNX?H7RG*<#Zr(Y#x?o-L*KGkDwGVRn9`sW zDAg2&QlT_c3`&EdrZ^OZVy1K`2E|Popg5Fn$_S-H8BCd=3{XZ>W+)?+$&>}k1Z6g5 zg)&1~Oxd6;P*ziRC@YlBlmp5JWjE!7vO_scxu6_SPE&3uCzQ*S2g(KIHsytKLwQX3 zpgd4sQ+_Bfl+RQE$_M2)6@>Cb1x$sY0#HFyVW=Qf$W#O>1Qj+Fg$hGOOvRugP*GEH zs3=s-R01jn6*rZHibEw#rJxc}NmFU4Bvi^&1}X)WHkE}+LuE|mpfXTdQ+cQ?RL)cZ zDhHJ}RfNhz6-8`pgK@pQ+=o|RL|4^st46KHH7Lz4NQ%o z22ev&W2hn2$kYUC1T{7_g&IRmOwFJsP*YQLs43LU)BU^P*+oTs4LXX)C1}UbvN~dxId~V4TSnb15AUU0nk9xU}zvT$TS2R1PwL~g$6@IOv9id z&`{HGXeczyGy)n14L6O1hC?Gvqo5JcNYiL&Bs9u21{wv8HjRZwLt{+ipfS)`(|Bks zG|n^u8V8LxO@zin6HJq!3D88-WN0EZ$utF;1Wh(gg(gE&Ow*t#&{WfOXeu<#Gy|Fj zO*hSirb9DKv!EH!Ow(*=CN#@52bu-VHqC`*Lvu{?pgGW7(|l+yG|#jEng`7{ErjMn z3rvfk1<*p%VrU_>$g~7n1T8i#g%(3gOv|7p&{ETKXeqSJv;tZNEjO)%mP0E{tDqIo zO4Dj+CA7-423iHJHm!wLLu*Xypf%81(|Twvw9d2vS_iE+ZG_fC8%&#^4bVo@W@sa{ z$+QL91Z_5Lg*HQ5OxvI>&{orSXe+eMv;*1(Z8zyuOVexUCG^Vl26_d(Hob*jLvKv)pf}K4(|hPG^v?7FdI!BXeT3daA55R1570-` zXXqpJ$@B&K1bsGrg+4=HOus^3ps(N4@9it;XYDH~+`f{+?JFtVzLLW2D=FN*lEUpP zDcru2!tE<5+`f{+?JFtVzLLW2D=FN*lEUpP>1XXLDcru2!tE<5+`f{+?JFtVzLLW2 zD=FN*lEUpPDcru2!tE<5+`f`R?JFtNzLIHQNk491$*koM+gEb1eI6RHl?Fx7%;Ks8OZp_))FQyr)lRNGV+ zstwgK)r0Clbxrl5x==k+1E?NU-_#JQ4>d3~f*L>#O^u<3P$N?ls1elI)D&tAH8C}V znm|oW&7r1HGgAww8Pwd=5^4^$FtvhOKrKzJp_Wi9QyZui)Y{Y*Y7Mn9wS(F~ZB6Z= zwop4$2dEv?-qaCl4|Ongf;vDQO`V~RP$yFts1wxL)D`Lsbuo2=xJ9ZV^@I9AeNFwLzED5Y0H`0--!u^F z4-GI4f(AeXO@pC<&>+(gXb?2mG!z;P4KWRahCoA2!=a(jFw+QV7&P285*iMTFpYvn zKqF0~p^?xi(->$JG}<&48V!vxjf2KOV@>0svCufv1ZW&I-ZT*!4^1#lf+j!{O_QOC z&?M6oXc9EpG!>c*O)*V_ra)6o)1j%*G}8=d8Z_NB6PgaqFwKHyKr>CVp_$Mu(;R3P zG}|;6nhnh{&4cDZb4~N1xzIe*0%#sI-?R{#4=pe)f)+pvO^cz0&?3_kXc4s7v=mwl zEio;FmOx8Q%b}&vGSdoZ8MNHA5?T(eFs*`CKr2nFp_R}o(;8?MwA!>5S`Do+t%KG; zYfbB+wa_}#2523$-n0=~4{b1Qf;K=KO`D;O&?eIsXcM&Av=!P6Z82?wwm@4=+o7${ zHq#Dh8?@cD6WR{#FzteNKs!ylp`Fk!(;jFSwA-{7+70b7?Su9}drkYHz0f|>0canz z-*gb#4;?Taf(}3jO^2a_&>_HPa2~8g$)s6S@xFFx`S~KsQadp_|Yx z(;es*blY?nx((ei-GlBxcTM-9yU;z;1Lz)f-}Df=4?QqFf*wE*O^>06&?D0m=n?eT z^b~pwJuy9lo48jrh-s@sDP;uQ~)YyDhw5b3Ym&Pg`mQwqEKO|h^ZJ< z1S)DO4i$xpnMy##pyH;IP;sb)sT5QKDrqVWm4r%}%0Q){(x$RdX{d~;98?A>YbpOi%i+NQctZK#f^9#jXaYpM^`h3c6aK=q*driM^` zsDY^w)BtK|Y78}m8kw3vjiAP+rch(3iK!XX1Zrw(4mE|EnOZ>2pysBQP;;n-sTI@$ zYH4Z>wS-!k+CZ(K)~2>lYp9K>9n=PDYibX*h1!`qK<%LRrjAg1sDr5!)B);f>I`*+ zI+?maouJO9u25&Fi>Vvb1?p<*4t0gPnR-CopzfxgPS^i?^@Mtv`ar#) z-lo1#Z>W!{AJhlxYw8d6h5DHWK>eWprh!m@Xn<)DGyocC8Vn7D2APIHgP_5tq0nGx zh-nx!1R81@4h@BdnMOdvpy8&G&~RvkX%sX98fh90jf6&-#z3Q>(WbG`XlRUS95e^ z+6--kHkr0So1o36tMKmri0La=z!@EbO1VNIt(3z4w;TXhoHlz zqtIdKi0K$~1UhOu4jqM#nNC2*pyQ^K&~fO5=@fJVI%zr$orF%A&OoQ2)26e~Y3PjU z9CQXcYdQ~|h0d8SK431-fdw z4qb(=nQlPWpzEfa&~@mB=@xVYx@o!%-GpwL?m)Mo+orqFZRn2a9&`t~Yq}5Jh3=Ui zK=+{griajd=z-}G^ZdTDwMy@Xzw-axOQ*QU47Yv_&X9rOlzYkCj8h2EJyK<}XUrjO8j=!5AK z^a1*4`V4)9KAFBipP)jjHb*`Mktdh3zP}UY|08{hO(HlL0O=zrtDBwD4QtKIiQ@T+)z#^mnjdF3(9TE3+0CLnDRk+puDF1P+lmXsQ{D@%5N$N<%bHG z3PA;+f~LYyL8y?a2vi6vY$^&BhKiVqK}DdVrs7ahsF-sRPswYH#WYwTC*GIzb(vj;78~N2rsj3)BhfZ0ZVihPs%#L0zD(rtVNzsGF$= z)D7xx>Irp+dYF1aJ)oYZ-cV1dm#Gib3+ip^3-yNjnEF9|puVR5P+zE@X#ms@>Tend z^@j$S20;U$fu_OGKxmL@2s8*9Y#Is;hK87iK|`RSrs2>~XqagPGz=PU8VL=DMwmuH zBcPF{(a=a}lxYk!3L0%13yp@xn8rb4ps}X$&{$}kX#zA38gH5ijfWdBXqssTG!2?=nh8yZW|(F{GoYEK+0aaAmT3+& z3z}`33(bb+nC3xqpt+{`&|GMqX#q43nr~VN&4(747C{T3g{H;OLTHg`3A6}WY+4E} zhL)I?K}(>ersdF5XqjmRvW73 z+HX1t?S~GS4nYT?gQmmKLFka_2y_TKY&r@ZhK`tyK}VpYrsL32=$PpQbPPIfItd+z zPMA(XC!mw2)6hxil<5p~3Oa2%3!R3}n9f0GptGj)&{^o5=>l{PI&ZoNorf-%EAxaMd*_03Ump&Y`O|vhOU^dL06!wrt8pE=$h#UbPc+0x(Qu}ZkTRCH=vuQ+t5wu zmgx?33%YH(3*Cn9nC?M$pu48~&|T=B=>c>Px^H?2-G?5S9zhSFho;BSL+Fv|3G@hh zY#;UYK4%FQAvE*U(GomFW%i3VLmN3%!Qk znBGBeptq*?&|B!8=>zl*dT;s&y@x)SK0zO#kEYMiN9dF33-k&4Z2Ag)hQ647g}y*v zzo*~ZSL)B&S8BL@rH0#AYPfx+hTB(axP7ID+gED1eWixmS8BL@rH0#AYPfx+hTB(a zxP7ID+gIw(+E;40eWixmS8BL@rH0#AYPfx+hTB(axP7ID+gED1eWixmS8BL@rH0y9 zYN&ms(Y{iD+`iIS%OAF{v|#&63%9SdaQjLNx39Et`$`M9ue5OcN(;BIv~c@M3%9Sd zaQjLNx39Et`$`M9ue5OcN(;BIv~c@M3%9SdaQjLNx39GDrH5(1rI5u^zu)9}*C<~O;lpV?nWi#b~vO(ERIic)O4pS~D2b9y48_EggGUb7CLAgzNq1;d& zQ$8pUl-HCW$_wQ)6@ca(Nr0#2vsswfhs|jO;w@FP!&@(s0vioR2`}cRWsFqszKFF zHKFQI4O1$J_GSz`>I?NV4S@PV{Y?X*{?Gu^AZP$I&@>nt2n{j~fd)Z?O+%r<&=Auw zXb3daG#nZV4Ks~^hC#zkBcb8Y2-7HN1T@k#8X5_WGL3;oL8DD$q0!J7(>Q1hG}bg8 z8VijxO@PKh<4qHx@z4a*BxnLO(KH#F2u(6gfhIwdO;e%C&=k`&XbLpdG##1>O*74a zra{w9Gok6w4AU%V1~k(&8=48tGR=WzL9!PnG}kmAnhVV{Er8}h^Gyq( z`OpH>B4`1$(6ks@2rV)#ffhlFO-rH0&=S)!XbH5`v>aLrEiz%8d?dhGOdADL90z`q1DhD(>iDkwAQp9S_`c+ZGhH6>rES>_0R^>CTIh+(X<)b z2yHTLfi^*#On`bqwAZvB+6(P79f0;h`%MR-{m=o^A?N^f&~z9&2puvVfet~3O-G@_ z&=J!y=m>PwbR0Sg9W$MPjzPywC!yoe3DYU)1a#7L8afG`GM#}=L8nb;q0`VA(>dr2 zbk=kpIt!gMU4YI(=S>%(^Uwv;CFlZl(R3NQ2wgH=fi6LpO;@4I&=u1)=n8bzbRD`1 zT{GQ)u0hvLH=*m$4bv^?26WSO8@dVIGTni0LAOnJq1(_M(>>@8bk}qrx(nSiJ%H{( z_e~F>`_Kc^Bj^G2(DWF32t6`AfgVARO;4f6&=b=$=n3@H^c;E$Ju|(4ov%5^w#tqdJDZXeSqFU?@b?}_s|E^C+Gw8 z(exSm2z@erfj&W>O<$qU&==FM&==_I_w;-FO8Z&+N(;BIv~c@M3%9SdaQjLNx39Et z`$`M9ue5OcN(;BIv~c@M3%9SdaQjLNx39Et`%3#+`$`M9ue5OcN(;BIv~c@M3%9Sd zaQjLNx39Et`$`M9ue5OcN(;BIv{3s>3$?E(?JMoa?JLS!{;+*TgY7FCZeP)G`-+C! zS2WzdqT%)x4Y#joxP3*#?JF8?U(s;;iiX=)G~B+T;r0~`x36fpeMQ6VD;jQJ(Qx~U zhTB&(+`gjWOAn*JrIN+czMt!FSuFM~jQuc+#gQl*AN&5$w=9+p#h|z;0~CkSO&Otd zD1#{zlmW_U$_!48jrh-s@sDP;uQ~)YyDhw5b z3Ym&Pg`mQwqEKO|h^ZJ<1S)DO4i$xpnMy##pyH;IP;sb)sT5QKDrqVWm4r%}%0Q){ z(x$RdX{d~;98?A>YbpOi%i+NQctZK#f^9#jXa zYpM^`h3c6aK=q*driM^`sDY^w)BtK|Y78}m8kw3vjiAP+rch(3iK!XX1Zrw(4mE|E znOZ>2pysBQP;;n-sTI@$YH4Z>wS-!k+CZ(K)~2>lYp9K>9n=PDYibX*h1!`qK<%LR zrjAg1sDr5!)B);f>I`*+I+?maouJO9u25&Fi>Vvb1?p<*4t0gPnR-CopzfxgPS^i?^@Mtv`ar#)-lo1#Z>W!{AJhlxYw8d6h5DHWK>eWprh!m@Xn<)DGyocC z8Vn7D2APIHgP_5tq0nGxh-nx!1R81@4h@BdnMOdvpy8&G&~RvkX%sX98fh90jf6&- z#z3Q>(WbG`XlRUS95e^+6--kHkr0So1o36tMKmri0La=z!@E zbO1VNIt(3z4w;TXhoHlzqtIdKi0K$~1UhOu4jqM#nNC2*pyQ^K&~fO5=@fJVI%zr$ zorF%A&OoQ2)26e~Y3PjU9CQXcYdQ~|h0d8SK431-fdw4qb(=nQlPWpzEfa&~@mB=@xVYx@o!%-GpwL?m)Mo+orqF zZRn2a9&`t~Yq}5Jh3=UiK=+{griajd=z-}G^ZdTDwMy@Xzw-axOQ*QU47Yv_&X9rOlzYkCj8 zh2EJyK<}XUrjO8j=!5AK^a1*4`V4)9KAFBipPtbIkp z?JF8?U(s;;iiX=)G~B+T;r0~`x36fpeMQ6VD;jQJ(Qx~UhT2y&)V^Z0ujr54SB$m% zVf%^&+gB{yzGC6_6$`hoSh#(~!tE;-ZeOu*`-+9zS1jDVV&V1`3%9RWxP8UK?JE{; zU$JoeiiO)(EZn|g;r0~^x35^ZeZ|7|%ajMo1?4v7g>plAO!=TZP+n7hC@+-HQ~=5cQD~X{aPr%2Wm_1(i0Hg-SzZOy!_5P+3!Xs4P^@Q~@dnl{Zy{%0m@Qm7oexMN?&{ zB2>v#1*!y9HdTcxLsd-Gpej&RQ+22+RLxWass>dz)r6`;HB7aj8cO&1oji3flLsMg@A=Jp!1Zo5|HZ_GB zLrqN0pe9gLQ*)>()XdZZY6dkowS<~OEljPT7Enu5Yp5mE%G3sG1+_M{g<3;xOzogH zP+L=bs4dja)B$P-wKsKy+Cv>oouCd-M^k60Bh<;%1?mKKHg$zMLtRYWpe|5XQ+KE< z)Xmfb>IQW;^@O@ZJxslz9#BtHZ>T5K%hU(z1@$)dg?dAMO#PrfP+wDjs4vvdGyv)c z^*0TK`a=UugP;M>K+|AoAT-D{1R4YlHVuUaLqkl%pdrvu({N}gG|V&t8U_tFjf93n zBTS>95zt7}XlNuf$}|QV1&ub1g+@bTOyi(2&{)%WXe>0&Gyxh1jWlLsLxCpefK)({yMmG|e;vng&fb&4i{yGfcCf8PH7AY-lDl z%QOd?1uS_UmQt%R0CD@?1P70^o4YG@_2%CrVr1+6x%g;qmr zOzWUE&|1@aXf3qPv;kTNtv79i)H8?g>FN4O!uHW&|TAg=q_~6^Z>dC-8Vgi?n4hukDv$8L(^mEA@s=f z1bPHLHa&$NLr+Z4peN8%({t!4^vv`EdImi=y@Z}aFHEnX7tl-7Yv?8P%Jc?$1-&-C zgcl^Z|MYy*GV?-a{WupP&!WN7HBMBlOAi1^NViHhqOYLtjk4 zLSLY--_!5yEB3SY6$`hoSh#(~!tE;-ZeOu*`-+9zS1jDVV&V1`3%9RWxP8UK?JE{; zU$JoeiiO)(>}TyO7H(g$aQljd+gB{yzGC6_6$`hoSh#(~!tE;-ZeOu*`-+9zS1i=N zVxjgGr+vkK+`i(h?+`i)B_7xAe zuXwn9#l!6@9&TUpaQljf+gCi?zT)Bb6%V(sc({GV!|f{`ZeQ_m`-+DzJ&gYrC5y$r zANg-tEd5&;`(YN#fW-M^NdNxOw=9+sN{2F-GC>)jjHb*`Mktdh3zP}UY|08{hO(Hl zL0O=zrtDBwD4QtKIiQ@T+)z#^mnjdF3(9TE3+0CLnDRk+puDF1 zP+lmXsQ{D@%5N$N<%bHG3PA;+f~LYyL8y?a2vi6vY$^&BhKiVqK}DdVrs7ahsF-sRPswYH#WYwTC*GIzb(vj;78~N2rsj3)BhfZ0ZVi zhPs%#L0zD(rtVNzsGF$=)D7xx>Irp+dYF1aJ)oYZ-cV1dm#Gib3+ip^3-yNjnEF9| zpuVR5P+zE@X#ms@>Tend^@j$S20;U$fu_OGKxmL@2s8*9Y#Is;hK87iK|`RSrs2>~ zXqagPGz=PU8VL=DMwmuHBcPF{(a=a}lxYk!3L0%13yp@xn8rb4ps}X$&{$}kX#zA3 z8gH5ijfWdBXqssTG!2?=nh8yZ zW|(F{GoYEK+0aaAmT3+&3z}`33(bb+nC3xqpt+{`&|GMqX#q43nr~VN&4(747C{T3 zg{H;OLTHg`3A6}WY+4E}hL)I?K}(>ersdF5XqjmRvW73+HX1t?S~GS4nYT?gQmmKLFka_2y_TKY&r@ZhK`tyK}VpY zrsL32=$PpQbPPIfItd+zPMA(XC!mw2)6hxil<5p~3Oa2%3!R3}n9f0GptGj)&{^o5 z=>l{PI&ZoNorf-%EAxaMd*_03Ump&Y`O|vhOU^dL06!wrt8pE=$h#UbPc+0 zx(Qu}ZkTRCH=vuQ+t5wumgx?33%YH(3*Cn9nC?M$pu48~&|T=B=>c>Px^H?2-G?5S z9zhSFho;BSL+Fv|3G@hhY#;UYK4%FQAvE z*U(GomFW%i3VLmN3%!QknBGBeptq*?&|B!8=>zl*dT;s&y@x)SK0zO#kEYMiN9dF3 z3-k&4Z2Ag)hQ647g}y*vzo*~ZSNvz~D;{oN@o@W!huc>?+`i)B_7xAeuXwn9#l!6@ z9&TUpaQljf+gCi?zT)Bb6%V(s_|Mu`JlwwG;r0~|x374(eZ|A=D;{oN@o@W!huc>? z+`i)B_7xAeuXw0^#Y62Yo%R*~ar;VVEq~a)(u3_QJ>0(1!|f|Q+`iJo?JGUpzS6_( zD?Qx4(!=d5J>0(1!|f|Q+`iJo?JGUpzS6_(D?Qx4(!=d5J>0(1!|f|Q+`iJo?JGUp zzS6_(D?Qx4(!-Y?rvDZri^ad+|8H3=!?!T@!z`8&N#{c&!}o{2WwA_91}LK`Gn5g^ zWXb|%f-;-3LYbi~rfg6aD61(uloiTm$^m7AvYT>3*`XY!Tu=@urztm-6Ut@E1LcBp zoAN@rp**I1P#!3+DL<4K%4aG7<%9B@3PSmz0;WPx0jQv1*oE_GE@<&WU2yHf-0M;LY1K^rfN_XsH&+tR28ab zssUAls+(#;)u9@uT2KwBrl~em6RKsZ1J#0Ro9aTfp*p5|P#vhQsXkN}s%L5d)r0Dr z8bbA<2Bt<(1E`^?G1L%hWNHF6f*PBeLXDv&re;tRsHv$r)D&uFY5_Hanwwfe&7l^i zR!|G5rKvU45^7~?1GR!$o7zIHp*E&=P#dVNsXf#dYG>*IwS(H5IzsKC4yH~}2dJZ| zGt?34Wa?v)D`Mx>H&3wx|@1J-Ju?)UQiFHr>Qs86Y6E^ z1NDM>oBBe%p+2U5P#>tTsXx>g>Sr1N^@IAG215Oz0j5FF0BE3TFfrfJX=XsT&C zG!>d=ngLCNrkiF$)1eurSbFo905Zp*f~`&>U#4X+AU;nrB)7 z&4cEf7DDr(1*S#N0%)OWF|-g`WLg3(f)<;WLW`j#re)9)XsKyAv=mxqS^+JCmYY^W z%b^vfRnQ7(rD-*^5?WCp1X+5+ST4&k-t%KH^HbU#64W>=d z256&cGqe%fWZD94f;OABLYtv2rftv`Xsc;Ev=!QB+5v5YwwrcB+o2t%UC<6_r)f8| z6WV3k1MPx#oAyGxp*^O3&>m>7X+N|V+Gjcd?SuB44nq5(1ExdJ0qCIVFmw<)WI6&J zf)1OGLWiLvren|%=&0#9bQC&fIsqMnj+;(G$DtFZQ_u85g={$56I%m27orBJsE<)#_3#LoZ1?ZybGISBTWV!-ff-ak`LYJW{rfbj@ z=&I>DbQQX0x&d8-uA6Q`*P$DxThI;Yrs+0x6S`%(1Komdo9;rlp*yB~&>iTm={|H9 zx@UR--GlC%9zyq_2c}2R1L&dYG4v36WO@QUf*zZmLXV**rf1L-=&9*B^b~q#dI3Fy zo||4m&!HElSI`USrRg>F5_)BN1HFP?o8CgNp*N;?&>QHj={@uodT06oy@TGHK0@!I z52jDhhyRbU`wp%m-Sadr%8BdC%g%`p}LU`{zNWy#XorFiidyj+_-h=QG z-XlB+C+g15c67|l-rDJn?Vaep?>?%U*a+gwkJzZcsL#ohnQ!KK--8}Vptnlzp|{XG zr4r~J^j_%$^d2fv`Uxt5K735Swy$!ZYhUH;_EpYqU*+ufRnBf-_EpYqU*+ufRnBf-&KzRKC{tDN1w%GvF! zoZY_4+3l;G-M-4%?W>&CzRFqcD}we_?$hlng4yzu?JL4;UlDfuim=;Pgx$U(?DiF5 zx337heMQ*qE5dGH5qA5Eu-jLJ-M%91_7!2buL!$+McC~t!fsy?cKeF3+gF6$z9Q`Q z6=Aop2)lhn*zGIAZeJ1hLk}a|Kas`CeY`Z3X0gc9F!sqT7KKExoo zRjL5RLgkezLgk?fN|m4rP(`K6P(`ScQWdBYR9UGiR2izG6bDs-sw!23szPx})uA}3 zno$1gM@;1E?NUU#THfA8Me~2xiwS-zJwSihe zt(DqBt)Vtb?VvVLTc!3;Td18<2dEv?Ua2G09_paf3F-iKRO$?MggPm8fjU8*mAXQm zp)N|@pe|5XrS4EysGCv`s2kK>sVCGO>Y>yN>H+ms>J9aTdMWjRdO^LF`a->-K1%(d zK2Tq!RH!f1Pbm%R2c;^dL#a@jQhz87N>>^Hr9=Id215Oz0ZN0Q0nk9D!O%cxkkSxn z5Hwh6C^Q%vqBIN|0u5Cf4h@BdDUE=JLBo|sLc^gEN~53=&`71x&`4;M(imtIG+Jpa zG#VPCG!7aAja3>CjfKW3O@PKhg{CRZfTlsym1aWIp&3fEpc&9irPoN{gTc&_bof&_ZaDQWmrbTC9`}Erzm` zmOxohw$f548(N~Y3|ay$Ray=$g_bF;fR;hal~zK_p%qH2pcT+crPa_%XqD0$Xce?t zX)UxGTBEcMS_7?BS`V#-)+ud()zLU~I2p*(1x(gA26v|s5Uv>!U4bO<^C9aK6D9fS@k9f1x( zhn0>(hoK`%$Dkw7QKjS1QRtY`3FsJfT5w(&>1LS=^T^~omDyyorTURU4YI(=anu(=b;Nqm!J#KMWxHoMd*@J0dxtvtW*eH zh6(*zGIA zZeJ00`--sJSA^ZZBJB1RVYjacyM0C2?JL4=UlDfuim=;Pgx$U(?DiG$x%L%dx337h zeMQ*qE5dGH5qA5Eu-jLJ-M%91_7!2buL!$+McC~t!fIa;R{M&ieMNk_eMK@`ezJW< zn(ZsnZeNjh`--&NSESv(BJK7SX}7OPyM0C4?JLr5Uy*kEinQBTq}{$E?e-OEx35UM zeMQ>sE7ERXk#_rvwA)vt-M%92_7!QjuSmOnMcVBv(r#ao_CpUNT{*H?#K)^fX%>qr z4P&3oV$nz>OHI_r8fP}Ci8LFZb z2UUTpDpiB3LUBsfp*X0TQVpmYR9&eiR2{0JR12yB)l{kt)r4v()q!e3wUy$b+E5*( zx=-s2)^bsUcJ!YM|5zY5+AKC>d(3)C6h_r6@IpQlKVE&7dYwQ>ErmQ>d9z3#b{?T&X409BQG| z3TgqhRB8>igjy-Jfm%VWmD)nBp*BkGpf*rjrS?!;sGU*=s2$W^sUy@L>Y&sK>Hu|A z>I`*+Iw^I5IzgS4xKsc?od~#n^F&`8`NE?C)6G4q0|fN0rgbs4fTY2 zDfNMRLA{mwLcO6rO8uZdP+z4~s4vt{DGller7EREsZg3ye<%$~R~i7NL;aNoLj9ou zN`s&Q&_JcZ&_HOA(hz76G+1dUG#DD9Gz=O74OJQr4TXj&jev$h!<9xt!=VvMqo5Jc zNTt!xNNAMO7-$qUT4^ja8XBWC4jKcERT>YCg~lmOfW|@Nl_o;tp$STppb5}KrOD7l zXp+(tXc9D8X(}`snxZrfngUH#nhs5crYX&Ura{w{W(o!fJTB5WJS^_OqS`ICRmMN`(mO;yvRzl066-uk1 z70^nh)zC_4mC_n$6|`DuEwmb1qqGiM1FcnB53PmPDQ$q(LF<(^LhGRoN}He!&_<=r z&_-yJ(iUhFv{`8@v>Do>v<=zQ?Sb|x?SuA0c}n}CJZPWN0canzU+EyUA3C6P z2s!{AR5}bDgbpbkfet~3m5xG(p(9Gipd-*xrQ^_1=$O(8=ooZd=_GU1wG4xvLE%X|Cqx24X1HDyx550xnDV0F)p!Z52p!ZOT(oawc z^xsE7ERXk#_rvwA)vt z-M%92_7(ZL_7!QjuSmOnMcVBv(r#aocKeF7+gGIBz9Q}R6=}DxNV|PS+U+aSYG097 z`--A{MSi+{MKN1`vVBFF?JLS|Ur~1Zin7~Rl-<6f?DiF9x34I>eMQ;rE6Q$PQFi-^ zvfEdb-M*si_7!EfuPD2HMcM5u%5Gm#cKeF5+gFs`zM|~*6=k=tD7$?{+3hRJZeLM$ z`--w3dKl#*$YPNnFDRv1EV?v|eKL!AkSJE6=#Mul&0=0C8uBRlAP?kK@?f>M1b0jj6e0ICPoS852=hZ-m~f*L># zl@g(bP$Q)zs1cN?lnf<8NlJ~OBq&)a1xkh*D>Z={Ln%s4p%kczQZuLt)KsZC)D&u_ z)BZa5K>IQXJ>Irp+ zdMNdRdO$sudP6;-UP^tSUQlnPzEE$dk5WIV57bvF73vH1Q%ZySL8(gVP%4zB)E`QN z(v=24=}>>Aflz;FfYKmn05ni(Ffc%_NZ zcxZysBxnLOQE4(X5t^hl1)2m+R+X*M(ynx&Kh&4OktWkR!|45c|x29&8Z7s`a@D9wZBKy#JmLvx{dN(-QQ(0rwZ z(0pit(jsU9v`}d=v=CaPlm#t<7As{#i=ix~B~TWWt+W)%hL$KTgO)%`m6k(Gp=C-d zpk>fnP( z+5zQ2xk@{sTxf^VE@%g|Q)xG}6WXP;2igVgR@w{ghW04sL3^ORO8cO_P@d9$C=c4F zbO721?N>So?S~F19fA%(2bB&(2cbhsN1#K{VWp$cVd#j`G3W?%ROvW$6gsAK0y+jA zS2_tDhfXM+f=)mul}-ItS%LXO+%FXQ6XS7oc;{ zd8LccdFX=DCFlZlQRy;t5xS&Q09}GED-}YQp#r5VPytk^bQLOut|(oDu0U6nu0vO$ zYf3kuYtVJ2o6vRWhSDwQ26R*DHgprZrE~|n1>IJ<3*Cn9DBXkZKzEhyLwBKjN)MoW z(0!$c(0%BEQW5k3dZ_dWdI%LMJ%);)M@mniN6=%Xr_f{QiPAIZ3G`IyIrJ2Irt|`O z20d4L2|b5iD7}JSKrfYwp_kArrPt6as95O@R1CdVdJDaV-YC6;-av1a-a~JpcS?JLS|Ur~1Zin7~Rl-<6f?DiF9x34I>eMQ;r zE6Q$PQFi-^vf5Xa)xM%>Us0cKU(w8#pKM>zX8Ve^+gG&RzM}2+6>Yb#XuEwy+wCjb zZeP)M`--;PSG3)}qV4t-ZMUyzyM0C5?JL@DU(t5^iniNVwB5df(RTZaw%b><-M*sj_7!bE^f1~*lEtDvUTaFTn5Q(1eKL!Ak!Thu&&L~;W-%Y+ zfxJq7$P4+D0+0{#D+M7x6i^C50Vt>x0|lXwQY;jLVwB25F;J{h1t=COuT&8#4^>dA z1XX}4DpiImLY0)NK$W1%N>!oCP!**(s0vh7sTx!jic_i%#X;4SYCzSX>Pj`C>QD`( zT2KwBrc!OFCR9tQ4pa-OtrQQ{hUzHQh3Y`@N(oRrR9C4UR2NE6st+YV^^_Vw^`QDn z4War_1Eoe#1E`@=BGeFSq?80Tf)bUIp+qQ2sWFrUB`c*s$xvgZCQxH2MX4#20yR-; z1~q}2Dm90iLd}#~K+T}$N-d%0Pz$A2Pz$J~QfsIs)Jmxh)Cy{?)D~(DwNYvZwSn3y zwTIe5?UXt|?V$Eb9ijG62c=F>2dJY`XQ(68NvR9e3F@rW73vIiQR)VDfx0Snhq^-D zlzKqjpzcaNq3%!*rCv}EsHakIs3+7*sSnf(>aEll>J9Z#>Ie0K`YNSDeW89zX;42X zRVf`xh0>JzLupXD(f}wO>aR2q>JJT28Uzi11}Y7P210|BhCqX$!Ae7+!O#$;VbBn0 zsM2s~C^SrI1T+j9t~3%F4vkP61&x44DvgFlLZg(%K%=11N@JnX&={q0&=_c}(s*br zG)`#(G!7cCG!YsPO;DNyO@JmUO@<~yla!`Flc32;Q=!Sw6s2j<6lki_bZ9CxO=$)+ z4Vtbr6PgaqP?`nJfMzPqhGs&ulro@M&}^klXf~9gGzZFnGL_~+na~`idC(kauF`yH zE;LVR0W=Sque1=F4=qqy1TBCTDlLWrK>MKmN(Z6+&;g}G&;jV6(qZTzbV%t4bO<`EbQC%a9Z@<49f6K2 z9fyuW$COS$$Drd%C!yoe38hoe3FxHKY3L+$O6d%A3OcQn51oe2D4m7QK>14NpnT}8 z(s}4CbWZ64bPhVNbP+laT~N9NU4SksU4||~my`;iOVDMdLg+G7pmYT)fC`naLWR&3 zrEAa?=&I6n=qhwg=>~KSx~_B+x(?k?x&_^UZYte|ZbG+|?m)Mo+e&w#+t3}Qd(a)| zuF`$zE_6@n0dx<#uk;YQ4?R#Sf*wE*l^#J4p(3TnP!aS<=?U}*daU#mdJH{LdImj# zo+>?uo;F=SnZ3=gb4sRVily;u4Gy@yJaeu7G%4f(RTZaw%b><-M*sj_7!cnujtRUuV}k{MceHw+HPObcKeF9+gG&R zzM}2+6>Yb#XuEwy+wCjbZeP(>`--;OmxuNh{pt4QVYd8a`|_CW%VW1MkKMjJcKhw=a*~zC3pO^4RUmW4AAl-M&0_`|{ZB%VW1MkKMjJcKhw=a*~zC3pO^4RUmV?XrJfP}Ci8LFZb2UUTpDpiB3LUBsfp*X0TQVpmYR9&ei zR2{0JR12yB)l{kt)r4v()q!e3wUy$b+E5*(x=- zs2)^bsUcJ!YM|5zY5+AKC>d(3)C6h_r6@Ip zQlKVE&7dYwQ>ErmQ>d9z3#b{?T&X409BQG|3TgqhRB8>igjy-Jfm%VWmD)nBp*BkG zpf*rjrS?!;sGU*=s2$W^sUy@L>Y&sK>Hu|A>I`*+Iw^I5IzgS4xKsc z?od~#n^F&`8`NE?C)6G4q0|fN0rgbs4fTY2DfNMRLA{mwLcO6rO8uZdP+z4~s4vt{ zDGller7EREsZg3ye<%$~R~i7NL;aNoLj9ouN`s&Q&_JcZ&_HOA(hz76G+1dUG#DD9 zGz=O74OJQr4TXj&jev$h!<9xt!=VvMqo5JcNTt!xNNAMO7-$qUT4^ja8XBWC4jKcE zRT>YCg~lmOfW|@Nl_o;tp$STppb5}KrOD7lXp+(tXc9D8X(}`snxZrfngUH#nhs5c zrYX&Ura{w{W(o!fJ zTB5WJS^_OqS`ICRmMN`(mO;yvRzl066-uk170^nh)zC_4mC_n$6|`DuEwmb1qqGiM z1FcnB53PmPDQ$q(LF<(^LhGRoN}He!&_<=r&_-yJ(iUhFv{`8@v>Do>v<=zQ z?Sb|x?SuA0c}n}CJZPWN0canzU+EyUA3C6P2s!{AR5}bDgbpbkfet~3m5xG(p(9Gi zpd-*xrQ^_1=$O(8=ooZd=_GU1wG4xvLE%X|C zqx24X1HDyx550xnDV0F)p!Z52p!ZOT(oawc^xw=a*~zC3pO^4RUm^SSorvD=r&ZeJd|eR=Hm<+0nB z$8KL9yM1}=_T{nLm&a~j9=m;ctoG%x+LxF1<@t2`@-ka~vVD2Y_T{zPm)CAzUb}sH z?e^uh+n3jFUtYU?dF}S)wcD51ZeL!zeR=Kn<+a_T{zPm)CAzUb}sH z?e^uh+n3jFUtYU?dF}S)wcD51ZeL!zeR=Kn<+aQe~(jR7t4{R0*oAR28ZWRZ)tAsz6nhszFtuIHl@P98^uI22>5Iu2d7M z4%JYq1=WCRD%FN+Lba6YK((OSO7T!_sE$%ys16jblmNv;b(QKtb)f{M`cMK?PpJV^ z52~-!5ULL~P-+A8be7?vQi3^3^i720yTzGl$t^* zP!pwQP!p)BQgf&&)J&-b)C_8_)DmhAwNPpWwSZbGwT4Mzo z8>p>Pd#EkcPN@Ub4r;H|5o!;0Q0fGAfI2F5hB`u>l)6Bjpw3ENq0UejrEX9csH;+U zs4LV>sRz^z>aNri>JIf#>IL?2{z?O({?GuWLC^qbpweJyAT&s62s8*9tTYrF3=L5l z1`UCRDh-E*Lc^3sK*ONnN+Y4+&qKv`8rnS_Cat%7zw0SxQTwEGS!PDU=N@ zQCbEqftD&Qhn7OilvY5?pyf&{q2XeG2tX$`arTCKDeS`DpHS_iFx z)+()s)^bP(DP9Z)(19e@rh9fl4pwmkE&}rz5(pl&Xl&^FS z%7@M>orlgs=aeo$=b-aS7oqde1*J>S1?ZyEW#}SwNvQz31YK4tgf2q`N>`u)s8H!D zR0v&Bx&~c=t}0!Ju0q$8Za~+d>q(C9QThI;YrqXTbCUi^b4s;8;t#lW<4c$?? z2i<}0D&2?fLidy&K=+{gN)Ms?&;z9+=mGRl=@Il0DpGn36+w@bo_T{zPm)CAzUb}sH?e^vUT>J9c?aOPoFR$IcymtHY+U?70 zw=b{VzPxt(^4jgoYqu}2-M+k5`|?`t%SZe2e!6}6m@PlqzIsP||M5npSu6aQK>Ri5vrtA1*!y9R;mhBhN>vVK~s7KS4x25p}I=-pt?|kQhg`^s;ATdst46q zY6#Vb8Yne_8bA$|5}}4rBc&v$5tOKu3?)KIN{yi;C|M~5N`@LMHGvvKDN0SD6sU<( zGpGsFRH-@C6l$i_0%`^|S8540hgvALf?7Z=m0CkBp;k(5pjJ?8rM6IOsEtxPs14Ls zsXf#dYNylzY6rDf>Ik)mIw*C5IzSzjIzt_yPD)*%PEcp1u25&Fi&8hJ3)EGqJJc2G zrql!K26b2J33Z2hDD{GRKs}XuLp`BhN`0VSP;aHaP;aP@Qa`8<)K@7L>I?N#N`v}A zsY>ZkDwL+wA4-GLl?FiRP=BR?P=9EE(jaI6G*D?UG!Po3Gz1z14OSWo4Tgp&4TFY2 zLzRX@L!n_xBcNf>aHWyZaA<_mC};#UQfV|a5*np61{wv8RvHV9hQ=t3gT_E(mBvG3 zp>awRpmET6rHRmZXoAutXaY1*X)-hsnxr%ZngmT&nhH&ZrYKE=ra)7brbAPqX-YGo zY0z|~nb34-hSDr(1~gM?HZ&8OrIZ29f@UjaLbIU^r8!Url&Lfq%7o@9&4cDZbCu>p zbD?=k3!r(>e5HlZd}x8vB4`1$P-!u=5L%>^1ucRWD`i8Ap)92(P!^P}v=qvQmMATQ zmOx9DmP1RSWlAfcWzce^mC$l%h0-c$1+-FWHMA01rL+cG1+7+E3$2FMD6NCmKx>uO zLu;XRN*kbc(0Zkf(0XWt(k5sFv{7j@v=Q2*v<2D(ZC2U}ZHBfeZG*NzTa~s$TcK@A zInXv}yHYN+9m-MK0p&osN;{!kXou1+Xa}@YX*aYJ+NHDy+6C=a+6(Q5_9*2+d!W5a z`=Gs0p3;6O589`60NMxbS2_sohYlzmf(}3jl@3D(p+ibXphM7MrK8Yc=!nuW=m>OF z={R&0I;M02ItCqAItd+zPAHv%PCzG>PD3Z5Q%Yx`Q_yLpeCRZEM(Hec2Fh1D2jxR& zmCi$Fp>s+XpmWf9rHjyc=z`KE=mK<6=`wT?x};P9U4kwv6+)Mx0;MZZ0aU1T6)J?T zC|!fDKv$KnLsy||N;jZu&~>Go&~@mB(k89i&|{^i&|~O{(lh7@ z^i=6N^b~rg^a6SYJy&`OJ%?T>y@FmqFO`a+m(VMv*U&4dSm_N^482x*3%!QkD7}N; zKyQ`aLvNvXN+r-c=)KYh=si@T^b=G9efXGuZC}36wJ)FDzI=B3^4aanXSXk(-M)Nw z`|{cC%V)PQpWVKEcKh<#?aODkFQ47Me0KZteXf1^?Dple+n3L7Up~8i`Rw-Pv)h-? zZeKpTefjM6<+IzD&u(8nt9|*b_T{I2`99sg{LGf0Y+rt}efjP7<+t0H-)>)iyM6iX z_T{(Rm)~w*e!G47?e^uj+n3*NUw*rN`R(@Qx7(NBZeM=8efjP7<+t0H-)>)iyM6iX z_T{(Rm)~w*e!G47?e^uj+n3*NUw*rN`R(@Qx7(NBZeM=;p@)9wC5!n!Ue`*qSfDhF zeKLy$5kHGz;Ny)-vsefUKtZJ#Cfnt>^K(SDHrHW8_sDe@@r~*_` zsWMa%s-#o}ssvS5stQ$xswl-lRiLU$)u5_SoKkft4yvY91F8m9SE>nBhiWL*f@(lD zm1;vZp;}6HpjuFErFf_|R7a^UR0oPzN`T^_x=Qt+x=?~reJBB{r_=zd2h~?<2-Sxg zC^do_Kn;}=p@vW+r6i~kl&F*pB|=F`jiDqcSt$idh8in1ff_?8N==~@sEJZDs0q|m zsX5dXYNpfzY6dk|Y6&%mS}3)GT0kw8T07FaZ>Wz_Kd2AXS1A?h3-wbA38Vikv#wd-0#z140#zSMFaY_@Q zanN|BiO_gxg3=^t0yI%+GBgpIq%;MZ1Wi_&3QdNlC{2T=KvR{bLsOw?N;9Bo&~&Al z&~#{q(ky5OG*f9dG!vSolmX3xW-Dbvv!M*7IZy_asWcbLgytyCgXTbUmF7cpp?OLR zpn1@IrG?OZXo1oqXaTfPX)&}ATBMW(ErJ#+WkZXhETtt-7L={D6v~E{C@q7QKueXD zLrbA$N-Lmc&~l}f&~j*n(kf^Lv{Gp`v=UmSv<6xQtyWqKt%lYpt%KG;Yn9eRYoT>Y z8=!U2dZmrfdT4{vCTIh+QE4-@5!$4*1=<8{R@w?}hPEhegSJ3hm9|4$p>0Yz&^Bnh zQZBR|%2C<@21|3&A2_1({D4l{%Kqr+>LnonAN@t)`&}pT7=rnXj=`3^x%2zrELR zb4nMWbI^IEi_m%Kg3=}E0(4R7GISBTq*MT1f-Wl+LYJWer7KVYRH$?nDuk{mU4yPb zSCy_qSD|Z4H=t|Kb)}oob?AoDE$9YxQ|UHz6S}2z2f78_R=Nw_hVCfcgYH0gmF`1# zp?gXXpnK4LrH9ac=z&rZ^Zy@TFBZQUjegy1?=_}u-jL_ZeIbreFg0H6|mb^ zz;0gwyL|=h_7$+(SHNyx0lR$#?DiF~+gHGDUje&)1?=_}u-jL_ZeIbreFg0H6|mb^ zz;0gwyL|=h_7$+(SHNyx0lR$#?DiF~+gHGDUje&)1?-0&2Aq#9=KpxfE6rlT(lGYP zEEYlntdqfyH!96yF;EZ+DaAq|C`PF~6a&R7Re)ll@=6t<@=yh(N>Bx;qEcn3B2-DK z3RDTItW*`M3{_EzgQ`GPm8wBip*W@LP#jcEsRmRHs;*QMst(mqss+`6YAV%+YC^S? z>Oi%i+Dh?IZK#e?U8oKeuap4ALv@wvL3N=7rTS0;R8Oe^R1d1J)DWr6ETsZw*ODb!4< z1=I{`uGA804z*Bf1+{=$Dz%1MLamhAK&_zGN^POmP#dLoP#dVNQhTT^)J~}b)DCK| z)DdbAbx`UAb$~i5b%r`Zos_yjouJN2U7^lU7o~1c7pSXJcc?4WO{oXe4eGAc6Y382 zQ0fKsfO;zRhI&H1l=?uupx#P-q25p*rG8K!sIO8g)EDZflm_*KQkBx7R47fUKa>Wg zD-D3sq5et(q5jYSr9sdDXrR(yXdpC5X$Uk38mu%F8Vn6l8U_u4hAIt*hC;)XMnJ=$ z;YuT+;m`=BQP2ozq|#_;Bs5BC3^WQFtuz)I4UJJ62aSQoDvgK6LgSPsK;xkCN)w^+ z&;+GP&;)3r(qw2NG)ZX+GzprlG!>c*O;MT#O@XE=O^2pJ)0AdF)1c`}Gok6w45eAn z3}~j(Y-lDlODO}I1qX$!Oo+N`t{+6-+`+6HZbwkmChwnE#Ka-eO{cBNcsJCvie z1ImGNm3Bh8&<>?t&<<#)(r#!cv`c9Zv2iN=Ko?&=I9$&=KgU(sAf0bWG_4bPPJK zbP_raolrUjoq$d%orX?Arr=ZhH`Os86-l%7D3pvOv2p~uh@rDxC+=&90k=qdC}=>_x* zdam>mdJer%dIi0JUMdwsFQHdTuc22^vC;hu%W(luDp? z(0ip1(0iyv=_jZJ`tULR+P(sxYhMAoeFg0H6|mb^z;0gwyL|=h_7$+(SHNyx0lR$# z?DiF~+gHGDUje&)1?=_}_+0x6*zGG|x37TRz5;gp3fS!{V7IS;-M#{L`wH0YD`2;; zfZe_VR{IKA?JG$83VgbK1(_{B*}j5i`wH6aD`>Z`pxwTLcKZt2?JH=vub|z&f_D1~ z+U+Z7x38exzJhl93fk=}Xt%GR-M)f$`wH6aD`>Z`pxwTLcKZt2?JH=vub|z&f_D1~ z+U+Z7x38exzJhl93fk=}Xt%GR-M)f$`wH6aD`-FTFzEbbvB1ZxVQCf%m4>lTX0aF~ z$Pya*c%#xR77K--7^U)13>2$W0g8pnD^-NbLlu-NK^35iN|m9CP$i`*P$j6cQdOuj zR7EKcssdG2ss>es;*_dGaZoj-8c;Q;x>8N3I#ffc7E}YOsZ<-P3Dr`n1J#0RE5$># zp*l)+p*m2!QUVkY)m5qo)rAt2>O%=oJ*5UvJ*d7?L#RH~K&cVb0BWd|2sMNnDJ4OT zphTr)C=p6hY78Yo$x10uGSpb93Dg)$QECdMKuwgIK~12hO3k6BP&1_#P&25xQcI{g z)IzBh)BsJl{6s5{g{sTb4(>Z#Nl z>IwBy>I3zHdMovXdP9Ab`ayl5zDlW3U#Oo_8q^O;RZ53ap){rbP#To3GyqD6`YR2D z`a=Vh20;U$fl7m+fzTkOAGI7&HVLsx%xL3Jp^l0S$wOD~*JPLnD+% zK_j4%N~58X&?u!b&?soM(pYFTG)8G0GzJ>0G#(lYjZ>Ncjf2K3O@zin6O<-F6QGGo zlc9;wB&8|PBxthIRA@3ZMQIu|1)8cf9hwSFQ3GrBF7sL}?kc1X`-J99jx3Q(6HngO)3;gqA}q zlvY72pp{Cip_R}or8UqhXtmN>Xf?D(X&tl%TC21kS_`dH+5oMC)+=p<)*Gqgo%8?*)5s0m2#o&P>#|LCLA!kg?e-P4+gH$TUqQQl z1?~0~wA)wkbL}f=x38exzJhl93fk=}Xt%GR-M)f$`wH6aD`>Z`pxwTLcKZri?JH=t zuMq7k`04f)Vz&Hb`wE%uD`dB?klnsQcKZt1?JH!ruaMooLU#KK+3hQ2x37@hzCw2U z3fb)|WVf%7-M&J0`wH3ZD`dB?klnsQcKZt1?JH!ruaMooLU#KK+3hQ2x37@hzCw2U z3fb)|WVf%7-M&J0`wH3ZD`dB?klnsQ_CpUtEkfR356JR0*m8RaB}BRfH-jRe>r&m6fVOm7yw1aZnYgs!}zm zDio(w9g2ghDb;|gLDiLNLe-%fO0}RGP)()UP)(?oQXQxkR9h(?stwgqsteVD;*}Dh zc&M&YJ*X~}pj019fa)nVfa*c@l^R0zp$1BgpaxJwr9`M9)JQ1_Y6K-JB}0i&l2T(R z2})KNDhCki3TB$A68fv4|4r&9nRca5lh1w}~fZ9Rrl{!N0p$Y~&Q>H>9D>JD{+WkHLe z#Y)-GVkk>#36uq8D=mexp(RSope4{!rRC64XqnOqXc@FzX(hBATA{QGS^=$8S`Dp) zRw=E4Rza(k)qozezq9kgC)BeWjcptK3v0Buy-3~huqDQ$r^ zL7SDfLYtv2O530<&{n1G&{k-hQVz5Y+OCufZHID{c0f5$uF_5@7uun;3)%tgRN4*g zgmx+Ifp$T=mG(lrp*>1@&>m>7(mrS}l&7>G%7gYP9f0;h`;`tt`=J9$hoA${L8Zgc zLFkau5$F(fSm`Kq7&@YK3_1cGRXPqGg^nqmfQ~`Ol}(Eu`n$ivE8gyOhCUhOTp>zwn0o_!( z4c&xpDcyl?LARCeLbstiO81~U&|Rhb&|T=B(gWxobYJNqbRT-4R0KVM9x6S89zsP* zkD(&yk5$1QMW!v5;MYwo_8=1TrC%%z5nbzw!}MK0R?&V|SShx?QJ*8Q=_eNp!3>bWcb zdUIj3zlVJsyE zT$H={VMmg?n!D0{>v3(vocABUEoAHS1@7xaw{u^HJ5cCxN#0CXIipOqzs^l{xv}o6 zd+hncRe z+nMA3?2=2Ge@Js*=kVSoiLNlUJICes#Ft!g57Kj7Sni-)Z&*@ccaHB%pG)G$v&rAN zZ#ORfYgnqw35$0RQaPhPC%OZP`L1c%oDID0;j0u^P{!jt2eWU^V>iEyLzw$A%zb-> z!)fYrbKF-PNnu!lyOHWDx<7|AX#W}>!#NbVZ~58#7k|yU5q@NN%8%~byb~Zre;eis7{Q-ha_w)@ zrazn*LmRmH#EYU${%>RWIEW_sYF?Z`@l~?1~HAi=+8R zH@N4I3s)RlanwD_{bzSS_FMkqSM1+-pO~LnWbO{;jSAmC=y}mxixNDlKW@3+{+CG7FWBF6Zs#dZ}?x_ zhfHq6hiP1?zq|0#i~8^3zvIL3Z@ji_=`a5yyixd9KmN=SguCC}-B)_8=WRU`=DzwT z_stjXOPqP9SKOZIjAtMB zLzsKy7=rGu9Ov_&!(F4xvm1TGyt2;yS6BGUCnb!V>r3A4cMR9>UC%HVUGyaf`^DGp zPhT+T-@kTWop4`gyFd1K-_?tAaoov6I7)vpZ~OhRunjIEi}&-SyXX_HO>8>5O8Sm@ zInhNWFvvfC$E4BC1-^H~esDA0ZxXnV>V3~)w@h%evfcRD?`D*B1Kgj#3v*pv#CIFq zpdY{IvP2!{Ru2E(MY?ZG-=LXm@V)Ek>SS>xA`)C(_ho`hc5S{Z;KFuKcS-I~2~1Fp zzY8mI|EbtDat*)dg0@J=cfV&eTpic?dsi=;3s@t8k8;F!%mwkT>-XH?Q8SLaYS}LC zgezB%DJ>;|kqdGxKG&giOCHFX<-V`yzWsp#`eTCoOLo5d-EltNUw!ZX$+akUzw!L| zt^0-t%O#|qNOTd$`6yQ@-SEqLtS>d|G7i6w`!12sl(%kdo~!&lAMd|p6>)lD&XeW7 zoZ)`>E-}pWv-`$-`{jY7c_&7aRAzEB~5Xz54gAlKY3!1FGVx9xrjp z-*Z>|Q0!{`;2OA|GqPM0_g%Vc;kqR-Gceq3-8Z~dJJ*~cXzzYk>^itm>DHaxKNY(! zzm8mwxY8@q>xAp=nk2YB{as&It8~x(oacLP$ntEO?rLYb{)K67psQc{;=!)Q_uRKp z-*e;sHo*-)!9?MS$#NsZ5}3BimF{6|Hn(-`apsH~>29K{l;Ebg+TXirT<*U!)Qph( z`{S4HKlYb>b7py?zx?Jezxi|7Unbaj;d#H@z~N!sAOpFT2C$O}r8CMc*FWElbS#JC z^11eLu9~YE=F-NvQC~mXJ2>VmH=0)sV4DdX_D~LKe1V(FDm2OsUgSFExG6(i(?w(Q zr@C?N%QttG!rbVBSl2(#Gv&v!v2JRfo0z+Z`*>8?jAV}+e9IG?>iM>S{f!B0?k0K5 zx*=tby0o%xxbyzVy*jaZyc-bzt&4f&2C@0zxQ%XV*qFqy?rubTc0MvJZc*8i+htwl zSl2oBTTiSTlMx%~SrO+(#j}$kaRt9|!`rtg*x&|#>n5zoEfc%Q<0i2@P5eWPf9}pL z5az;u8IFGs@5;RL+pjn^mf+HLCF5sTvgqfd?rUlg-;h>((Y<|(|35>;Ez^nVrgquC ze*4Qi7l;27^F%kssy`<+)p?2-z;O)Q045`ESojy=3!D90_>bXV@EPTV7+23rH@OI$ zaEsUduUE_qpBJ9}%LV&_PsNw6ObN5Xq^r5t7pA!1r?A;qKmIa<|LB_V)hNu(aI;+5 zIi=t5VqBN&F7}2ipYf$9%*}E0u9xD?CZ*e#W&Y5Wy`Yeo9phY zF!wjUIsPTy)o_gq-G94L=7)^1440DR{%hlcvYt%$4;f63?ZZmHR28}(T!*XfKZP+3 zbjghS`6s64dEq<5zxsdKd++$Tt1IvSt5KPe>&Q)Vmu0{*##pu~GF7%Qwy83qm=X|O zrph)&CfdZN1VMO$Ovoa#3u}{*DA^PNDTWke8?Z@RnUV-L&+bUtWCdw6SvuI~d4KNx zen%r)B=Cgi_xk<8YhEBr^DXzBd+O($dvAQieP@+w?Ekl)x8g_Q!Y>s!V8*q4u4ann zB9CatD!X{6oxBOTzoxN$OKMrXTx>13Q|l8gBc! zp|rI-J9!cgg_4=AstJ-d4{vZbzh0ZPRefBJujt~1*Yns5+gfc+yUmRkH6$gSJZG6L zs|C_YKx=!xDs?+8L@k-PUH&mW1lSk^5NOagW z30=hXT-9Rp;)TnqY;ADt3Ai@BCXst-NA9I_dGWgH2D`SpvI-ZBlR2xjkfGef=fb3} zOl99ZiEFR1%be_8P2jw$b4y?+z64{h?Bw3~f_RY~5-+UO4V4wT_la_wKf^P>%GRL9 zc6FuAo5OY2Ct?1jeM$85!fvr}EF-;^hhG-hr2+TWcUVK0=pDxw*Ol3EXgZwO>1k}& zHxqd><4MAftIJ_`=ayu4IP)z&i`T#jyEK_7udPIV>N~bDFq=CE4qsS?2A|wz7efXQ zxip9$9{-{>Ch%of1q^L%nVtNSq+=JOa?{?tC1t0_?b51dTSLr$b;1^W=2%`)ZSj15 z93G&gMYbv_IV-b;opwnIU3cQPMFf^JZczyP<4Gyoiymn@14V;Ps5b3#)JgySnfKnz(D)yIZ?pNn_9m z*D?jX=X$)W%}%B&cjAjz+TspW>5TmqaWvFxV(p@#Rb6)Fvv!>fPC0ffpU5OM4fXbk znuDBaIKt*(%!+L$U*BEH_m?YDzc@j7acP3|<8)iIa|?}mj{D`dbY^E2CLbR^gOtBU z8ldY=O4^lO8vE&1UqTp!5l(3&ZWga;V*qPg?W}bT>zUrWt847?>Sn0AI9&&+*ConY zQ=R2ynBs(;+}a2uXBObbg9Pa|H#*%h!PFR`oNN*EaUts4xdnzr zrg3ht1wNeIsGw+O0kd-{pM$Eql0D_yn1!otT9OepwY1qa^>#Xu4Psf%EOl6Ykg&5- zLESDpaV0djqA81mWeILti=V2pndM~}jOG1yL;2jg#FonHx|K$x_>3aL+mIQ#-&+qhU>cpRkL9 zuFjIS7$aIj&Xur4U6(|6IJwIrf`?nzAc$jxFcn*DC5cO>XTin|#Wt$ShExn$1FDrz zt&(gYW)muGWG8Xagm$h6_+A~LxcZ~Q|#=(;1%`s|`7 zZ1EY>?6?cRWr?}W`P&I%czd&ZItkw-N%63JD?H7T^G6e$g7ZM5y*al# z;v7eR!@2R2*b%&P2$0I^h;tVQl2HL?d*a6o#<_$ge{&yg+^r@(_&es-8g`0oYu29)82z=2T9xjPhr|<$F!n| zTToC?n3c4(gYm1t^Q#BujI{&X?N{U&qc(P|V?s}5I%6{z4pt?2%bev^2g50} zaD~@bI3)=?kxBUx9tvnj=H{)wSTp@@w(xO_ZM)|;->bF)Y3*Pg5eDvj4AnTXTC!wRPdKQc;%-h z3Vs1{fq6fS7v=|>-(cY9tVHJX2z2qt zbbA|?U>LF~<-}J{yTXn>zQd*!+SiA?`hw+e3g!P3gUY|N2`>`^CN0)xciVq1yTc0b zT=q|P-HEfFvRVIVmtiI>hrE~v2F{7ln=4en3cp&vyr2$8sb4^ zOQa#YtZ?!|#>?eVj6|OrBs29ql=lS5yX>omZS8s*|^6ceDcb@gAC~f!jRS<716si z{(cS-l@A@_08%H}+as*%<@Zv4PVP+owB`{uApbjBXvtmqDfO+#Vi$FOsNkQ9eTgp_{`t+cHP@rcg zS(S~vf>8AMC3f&LC{8S|q<3q1n^C8m(QHRG+9;|zlpmH^akb5?vGbDvbxqq|+W!Q$A+UKjbL|jBWzMkWRxzH# zBvF*4)%08Xm4V&I;3hgtUsXg-avUO#bt*W+3a7-rO-%mAZqn1C6ZrE;a*0s{Nw6!e zx8@rG5N7^}3Kx{g%3l&$d4-2;KAVRJ#PW;_S)D}T@<@Bc>Uk{Bw8O*LFi93W*#$qa zd#%l{T7ugwv>oz{!y?b9`u}48_WpEsOO#`L9rqP$$1b~zfuGL*!Oj8RJo0=b^g(DJo4cE%EH?k5V>U4YgW z(xnrlrL6nVLYJGVNn#%jL`-04I_RNF`4b!7&P%Y-E$gjl9c6KH4LRAP?TrKoQoXI{ zz%rHxM41Cf%eM0nd9kbEi;0V%$Jl-1+OC=HH0?@ zup5q20oQS{^3(;ceBaCCUG!hDx^89W@)`N|i(rK?Cok-K;)h6BWg(Tl4@-Fmv87$) z@1hIgxz;+sSG4JlXUn1DiY;sAzi6L+5cC#$cJ$d-07B;k)F)Pv_mtSJmN$V6fK!v< z&tsNY)M{np?GI}UcH9oeR7PkVvoBcQuDtd<8y3HJ+TEv)Tp9zB+rxkXBl7`#V%>d> zd36YWUhwrZcjP6mvh_#cuX8ZC0u^L&NRBHm;}w1hYGKUGYSflI80e{&xhi%Q^dLS4 z&{rBLmun?Et#FIYu`?Vf*UL@gPP6=Z;z3#*dfJA?hGbEuqu-A~t-FZgn`~Si5YQVI zzr#kawm(!d1Np);>mCH=lp#kOZ-z<2Gu!ZV1T~B5?10TcOaQd@4glIG7a@w{#@k&Y zY@XP(7&h$}vT0nqD| zv3qPqO?olb^x>z-+7s5DD9P)!)3-R-$|z11+OyoCu{yz;&vZ<2lK>EW2cJZnZL`d> zX4>#plPZ7D&Rm9%{B8I2{8d)|74-C?UB}u+JB{3u=Zvu-=W{=Hx>iC7Aa)`HJB3F@ppO2@`ZV&KAJA$xa(Fc!gvnmniiFc|UUsDAHI# zP{OnjfD$KYA`}QcX2ToNM3IpE(#;{-k{9QN^ijs*a~vNFjMogx$KQro*TYz+d(z!| zXzXx&ycwsC@q>vq(EXM4V%yjeJOxMM2t<*%c-CL#;_Qfv3uwZHiyihCadFJ*J`(Fs zY$kMCIScZJVe=w3-Xr_k&qi6`d>NF2pflK2vb^%U8;TO@iX3{8O{uWqY|U|Mv5j{w zR4h-J6t%$dar$0-#fRSkVA> zat~rDi{z!U#6@ub<)rfS^qk$DK_)BVWx2H=jE<93kgL**ciF}Q;w7pr>HJ>n%H^U| zibrNb3m3950FNzb!%{U{J}exu8cn{?&R)jjS*uiemH_T+D7AGBDtKAE0@AX zpF=W7N;1pNoN`|Y{(tvwjWlsUqQoW?IRbn@r(6wbAI4=s^ALuWV*2*tBk(%DAWAxt zF6roXeEe6IQQL++B&K*}Tm%v!sU#BaxWc|!wWOnnI3l5}!`^JOH(KrWW_zvC{-@sl zvJ$1WbhZ7t(*9HiJZFCh?Dv7aN+mw9zQF#QzRSRV8`ysZ)(e3y3%Skt@Ucolrs5~! zVaW|s@E!7x;x_#7w}F>Nt)^?X0`DA?4c-5QTkMi#rexO)JkSQa>u7?5aWJ!j?#@I7 zTpGn%+FhywZR}pT%?h5{HK8|QSCrXH&Ii}PdmB0oOFCzHGqsF7WG~|UFBw?5ljNUS zUcMTSvaBzaQ7FEium5KcVOMfOvx2I0zUTf3=bQmrne^n^PXJ=Nkh(ye&l*a8XreZIvCe#J=^6ZLJXB`!*4y6yZ(t!^-8+ z*~(=CF|Ov;qp+!pgDj>%sNE*CYZ{6+)~rLIFSYL`R35tgL9#ZMZ5oY)u~fEh`52=p zhaVS`3#-ZNB;44+bl<+B0?}+6Ggon#4M{MgiaDR_-KrX!y_BTbluyvbo)l|rS!wMuDNAH3ehq`CGhd|HgnpoGR8zQ zMjN`0zUyo3cWaLL4aJ=Y!A8{>&D=gpC637G#~}VQm8lgGmX7V9>wRfzk>%a2bQ!)5 z>#5C@q2LFSf}r<3nm zG1|IpyJYDD+)<~hdOgIf=uB6%Nx7Di|)gk zCvkBaZBhImm5WnWunV>SU#)H2(7o~w8@ZZ}`QO{zO4Z`eeUMb2?G22{N%>;@*cN2? zIHc!QbVhx{YZy!MIabjrV1!Ot0P0|Yyxyoa8}8V+L1y~lq*wT6 zQvtq!j}vAeKl~Uz?+2$O%tR1Dy02fBgBBYqK99JbX?iV`<_XkvsoF@I;fC3C#b#PQET^dwLvq>+cE;#isPPU_Jh2d`cn!nY3M&s?Z(S*bD`rP@p!Rt-y$a1Q zvWJnXJJH_2K8GW4;lr)%cKs&1qs2C^w|g4w3w3sHt$ne^{;|sLE4S994Y@zCF9r5b z1Z5Njn_S#Fl}DEQOrpq+lJ75knTZ2w3aH6`Wo59;@>f$AT~C@MBR_rlU6GN8B%5_K z%u)x$dBiIv6)u&4YxgkTBDYYbIC#W{CoTTy!i_65g(oKMt)$%&l-aS7vdmdd@rBO! zGQ?n%osM6$*byEt8g6-enC39m$T9qFHD^vb%7$tZ|GbA-u(+g-`^(Z6?|~qy3?pvF zP|7)D_jAG*RA_+H&9|yN3-WNN=$k9+d(;2Fok6+_2X%Q<&5#>An#eJngb z!T!CgVv8K@XBDO?FP`>%b>>m$Y1eYmYCu|WGgw~cMnjOs4 z5Z+J4N4>%L)|>+`l5^W&!#En9dWU@3#>|`Wf_)KwKNi^QDXSZ0BPo;}i&uqdz;pe6 zRVLrdFD%S^MK1Lr1~L@@Y?8}noVj-{l~4u2Nc8UPVDQxD2zAxZhN<7QFtqb8@boy3 z&kbHiXn{`!Z;koR_B~|J&iMQX*4{N?tzxr1o1+=^0St3~U^VdzjhIA^l3^BNIAec2 zk2xtF+WI3sE`}m!wBlMm6_1)B20V=hwKnLuM{PmFRzpt}rmjHd;o1jPCbg9UO{-I# zVQi(INhT%NE$R|9V4+nh2x zr2^MVO1gziXPh$>JTQu09)Qb|XD6r*9U%+}NKY@}UGcWQ7*`g7;}k!@NZ(N94)~}6LRUe|`5O|X0!+dP#yXqV3<(x|oyz}; zUL0zIbyzHZqir{^6EF!{2B}Q4Ome6&E#mKztQ41rhQNg^R>;~fK%X0kW#8Q`Arx23 zGQBJ;upwx!oCtZ(7uH5`cecdq;2)}vbX~{>42%X}ay^m8ry=LDK4iBy)fWlct#MdSiUXOLHwqUG!LfRB34{Wc>Bcdu(1chwB_7 zNZVP++atKAK&eL5-RFym-HtKevGWnGzq>yo>;yTshrTHWpNZ`vt-DxFfeREtlQC7(DRrDMFGT36LCW^A*@zC+hU7o@MMBVSXd4A z1k$!$&}`!aR-k$kmz@QPRhGZPhJ8Auua30m{m27_8aQd%Rh>#n*@1xLK_ag zXV+FuAHE)9$qeHeNSx~CuM*<{g?Wp#wz_yd5i24Jo z5I-16Bl=15jTk=(A;BNmW$!<2AF8fB9=aA_K%_M;qh!kRw{<_V`4LLnlhk)YQ82E8 zMV{I@ORdzkbB=Rb7uL12bN1ot+FtKw>`mjZLK=T;pL~BBKX?y@8o;UZY2xy?pnF?a z+jt~$g3Wp!9ZM1jOlRJTnyoNr+78)Q+e-6^($Kb*;}0TKQb+GL*PQx(3Rk%|UC)Pf zb$m2*C86s+R4#M)L$Z}N#i=R*4`K7S@eycx_9Is%z!by7aqamn-Nm?PB4;~kLXyYx8oGCIHzC=BJ0dTm2!Td*j zV~n4qs=Y{Zw$RfwK=uY9O0H}lv+;tc!YFUIi{F2mK9t!|;}0fdHIs$CXH|86Y;`<; z4}$l(=lS1oCM%ee1n?Q(yq>nL{$S;!Fd6&M*D3ly!+vDfenj*op$~ibq~&$z^%iez zjU$GW?a1eCSS3n8b9;xI2G-Z4I zV|6k5OXf!rXo`fYjv$-}v{y5AiPi8C66| zX+vo@`P7o&nN`H*Yta3*>6(;X-)T2=*p2PhxXISB+-SXhs==D->>p~?x#mi~KGhrs z0MZv#d|b9k%RnyQ7P`bm*sQ~B1tS{u{ww+i=wCL`NxJ@(GQA9uGwXlNqdj>DR~f?@;P}ktgNQGO(N8< zL%z)F`0!&Q-El$NCM!4vY6`>N9L|TY*js?cAgr*W?1%pp<#nzZCyVV2ViNyNCWBb# zPW$0UWHKf|H8ys0pE|3Hf^He4!h1Hawjno1q0|ThV5DHV6{wtK`5&q6C=fC>FvkC> zo9+$P{vk;W7Yz*%b)XiO(-%++3i4^A!=(j?n)>i))(vMAA;B_QEcDJ=?h`hv4+s%! z23@p5@`Bj7@;@c99AO@0_I{?>L+Sp-j)_Pc!-AE8o%tWip%p^fRA`K0^_WFvGSBrs zA59#cAPNWDt}U;2CKV{y0Y!bnO&f!13&*@Db591+9aq1N$TnJlQo~xx|xNdcWok!&%K@ z0;$f7-_lM*(rfKJ?)Udiptd-mP=Zm(SN}0SCjQVa^&g{vtR!1m z4t44f7|JL15tEm{w_$nO8I~VfT|}IkI|pjt2hY&7q0({}BoDvO$t4D5I9S~XdT~cj z#GVvA64EmsgA(?{XAKIm@%6xNgDr!5UyH(KKCa7Gn*rq(S)OuaZ6(a=Ak3PU8)jA6 zJxlB-&)|iJ;uydF*B#@QK^&v(=YdeVf{>XadqMC-!H#_U6y3WCb?@$vTLcq!UXf1h zmcD^*(RVxdM^*^HE2r$h=P9a^3?!!(`OXf-1ld;IC*w=wBj0r)!2pEICp+6EqzKaY zt@fjsN9__<;Y?=`lP`Q>bKWf>#N|?+p}2`@Hl0wg0xT~+5Z`j}&p>=j08r<$6_z^Y zgCspU_?@S2o2bK-KW=M33hIVK61@6(pXDv(pB}oKY7MJo>019C@LK+NDBvXMAr$&&xo+lfTQ_WL z%OIn%tv1BL3QAZL_`vBit!NZ2Ui38qbGfA)K4aYnf3+e2*h-aGsx3bUzpKE@42r+z zV9TD!jx3SOqWSxKi9|Pkq>=4h+(sbVlb+TmDf{87{f)CU3=p#2!^!*%xRb zQ@7F&pKpL9mXHznF0y$QI11L4{B;5gA+W*d9$RlkAArC?Ts|u&NGP=l$O939`#Osc z6{-n}T}!gW^l2~2V9U10wr<7|PS6U<5!z6b{9F-sOY=vFRSt$0{Wvr+pSM*JZToup z5AFyRgVG5X!~pK{dJD84py01*cCPRuw)E4~#pv2&Q6$mY(A=qW^?_X3Q~~6z1t1j1 zaAyu)`97G@KIZdBqK#-{ogEg@wr>df!D$PZ!u_kPisgOf`MeDqv%cX<+0c<>xzmeT zuvKCCEf&wE%^8=0zM*}HmO#_-v%)5gKd561`zzG^mFmYn)csJ@AwUiNh}hplop8Qg zq4@-3-k$e`khqEFhy%C)W)^5W8^d>~_R2KWVIGNaVsB6*zPN6BK#4Y+7>lT1f zWSSV*Wc3g6P*=Kt-1iNgZ>J**^bFAlVKK_~>jHr+1y|4qdd89tJFC#{UFnL*-^3$w zwx{+vuurBa>&9uc8e+dC*B{zxPj1TdC`+O1Ghvxc*zu!Ai3p!!K}AzTJEh21=t#6l z>!_RDZofZm#t|&9IKlOrOqBkgPg~;D0s}$%FLKkB72uzAnja`NIuMlT#jl9q{E8uq zY-E}30gMUkf(m$6LXX{?@vd8IIIGySy{pd&P6=o?D)vorEGH1RcCr^gU__E8i81tQ zO=A~C)t6}x%hs2NB7KA#mh7)Bvng<_zo)an_UpI&-org1A>;*DSkp(LV%owFul5)$ zM+EYMuGp@PTUS5N&b?s)&M&2R-fc=n2OJonWrKUSE;^a$(~Ex~<3F#TLSG-=;(Xf` zcGE{iAKZGc4=NG5o~>56Z8c^@-c12!0}hS&QqFr!MeE)H=AZ_WHjC42!~oi;;SCy} z+_!Gl!ne?}v0g>b9YA!RDyHBiPg;cj#Q#*NyByx_Q@j zN(XKVCus^o~(1RAhHz|T{{~!@`v9v6P47GM>Zf zjIs(jyJ0jtf_W#3T8OI)kk+yNu*-D3Rtk-ER?{W6|AmRgExE3h;{pfw?xvTJC2o5) ztt4Qx?gRVo%&x@Tglp|U9Y(~q>{TPRjd_(19jxSHx{hZJv`-o5LU!i*6 z5*9bN7OHCS8Ozr$&BjKa-doX|g}3U$d`7Lt12(=n46mndp4S*7HRmqUjLdVaHp)jh ze$6&mN#)4XusU*t1gd!l&^u01qd(st1&5RoXs{jRW~t^E~%(F441R9Nemf>DU7RyBAR z{5|@czq^lqeBZ8K!osqKLUc;{@voK$nJ^98vzYq_3PTjS9=L8d*NB}{Yh346hUDXKz0&yAjo+b*b%E9_ z{ECB%ZJ}G0*G=w1bjPDP?y;(J`4#qSHL}(e+E>e5IQ%oL-zFOtHnJWSHL}KOWL*k% z(c+NS9`@G1)+V>JuJb!9H&(BsWAq<+cD{OpYagV?kMk*wHpHKVD?)!oYd*HEBDRy_ zuQuSllYW-pE~0mHzwxz@ z;{4?yu5tBY^d)Ck9oKRhH_zq>h*h5WjAOA}DU0*$GkqZxODCu2aoyR$TGn%ISd!RM zcp>~PJgZb&JywJ(y@~o|p~YHR=y2W5Ud1dor*2cOJzSChJPV2^g)3zX_Sj5|7d6@# zc2L$RV(bg+R}l{+(xyUXP%xw*VPk&rz}GIpqmWhZHAIn6;>5=?5pm*UnTR;?|1X(Pos?rvde;wrjA{Jm25t=2{dz5OTfXooi*(>tJT6?Ri50G+*NIb&o?}0BWsckR#R)k z8fz`SwS*-n^bhBktbdLt<|UtJJ3Ii;j=IgYovb$IJ}cUkUf9sd;;c_p z``3`PmC6?d7Rx0J44V{}hb~Qg_9S!Lc z8_vNnH4Ji0Cj)RKP%#`Clxf$NRB2wR1?7e1ZV#8IONW;xdF)7t9HFoOos$%qAHT!G zU}xL?fRk?uZL$_Y#~DSTHPAMZ*KYhPsZ)1#3KVdxgD5RNmum~TtVieRt>li`9qKC? z=DIX!s4#YX+|JwCPM7{-_t)RK!vHDn@nLW7uIIM0Qy?t`DnhVh8OU}ab5fA$?En$x zO&QBS?+`X#j8UWCkKPd9sa)1YNmRQ_a9r;rtgt%RW^c-;P2?4J>UnQD6u!Z}1hIux z0OIf1+dJgMk(*wnU*u0*`Ucx# zzQy6@6vamSV-R{f9=fxEQp*_1T@$GMmD4^u&c>yAPAQuz3}rMNNnz7l+4$#*S~_>e zav_(eq3A7pTSLik3eg*s_+I0r-gh0jJq%ta3Uek2=V?>wn%?OcsGTYfu(FMe>p+{4 zbcFqxVZFwt>aVBEUHz!Mi_HzX>KSgvGWG5qZ}YAaE6MaY-W%O*O_tV#r`a@eH_T-a zY4INZYCY5>@b_{)nll@>lYvyQg}Hw@wTa=}oN?oQ-Es0=4rh1I*A`hx-csZqYw_z& znnpch6n}wTo^1X<)@~fDs;3BaOxkwxWOjxC(o*5UYL6mvW{w5h1D%QNo-S06bwnAYij!+QyAacAB zX=6+}rKtBQ$AWGrb-l2xkiHOPt{ah)a=4j6ELDY=>}Gnp8*#Tp2HBC|jkg23HZnG< z3#~2Oi6l@s(M~IG@^Kr1Zbd*Q!pw^`kQ8rV3epVkJ>CmZX~)A}E20bC_N14&SM)y3 zO^$GGO2a`>I@!h`|L-6&@9K8uGNq~s+#b(o)I=UlGq*Op>nL&Tb7PP;p+zGZ;v~m1 zx(Os>V>$5`#)$~We;cPwCNG8a;+%N5C$r0s?J3H8bX4dq6Z)JgAn4M7o*LbsNhNLM z=g(9{?X9Dc@VAq6eNEAnWK!++X7l8T{9sPC!yz?1|A+bRhChcdocI z5~84=(DiyZw7P9-56Pi4!8J~r#qR;MdZ8YS*6E(s%W^19?c`=>s6t}PM6S3bNrrz; z;rq$`;-x1c!n{u!%?@~;r(Pnb_GRp?=Jk!KuFgkVt^Ae7MF)DSL#@yeByI*FBO+Wz z_;;LZz=cjUx3+B(Ll$Q*_#I_n`s<`A2$|#1b|{vKrJ27Cy?D0~ zNE}UX(%fNIbXKX3v{wrw$%D){2*DFPo8>-jnvj`WN}DBAUcTrkyjk?2Sx!dw%o7Yl>)OD9vzQWf9*% zpCd0N!eyEKtNPz`yH*RllYKx;uha`Oe)8T7U@zAcMzrwK-MmyiToIQfT4`hAbnqdQYtCed$%%U}v(V!H$wrETN2v46JlU&Q2l4OqO`frU*WtQg}7{YaK&% zd`T0P@e?__>oodA&t^lB3)s}|QkwR!Wapy>y3((s%jHHQ%EnBWRt2wRP5ZT+&uN#} z)(|bS)7t6WTFVJ?C-ImQ*oTf&cd0BdO~2H!rLBdHx=y9F;}bl5C8zs+k|5GQ{t8-O zud#+E9>*b)yyd#SRA+}>yQyV;L!Dh*Q^hWiXX)tcQ+dRRJa#Gj|14n-vBkDHlj_{L zrLDEuPT z96XJOYB1v91#UQ(uzBg_eCn+}1K%!fgV;JdUnJU!q@!vn{94TU1vR|xXx?>X_HBA! z6EE!e`W+2*D;fMT%;Z8YK8{5!--tJX_4;w4U8o;*tb|K3^7Hw8k|{d3iMcwPN1n-}#VD~!a}kLU0tETT zXS(4@3rwl2T~GI?qjkMe8 zHo9tcyc)GQyMCpef#}zAvNXFwBf_#4Qnea49xwY%hx7VF!xv}YnsR!_1FCB(wWZjx z+_Nwwc8Qqg2wuihmm>_HbtL0IPq9-t2#-%KpB2dPX&GsKM*5%We)Oi53+X(P?K;63 z#3fdHoa4CXwFXqpSmq%Mm852pQ%Nd$m9irV>@@AbU5>+?fM98Z1m`|?+$lI?Vm6!2L_Ed-M$L8n4kaZMmA}t*RG<+_}Rt z<;+}m;>5mmcH-Q;^*+*EUt8wqO-^MoJd;;B1=SohSi`~y@7@MVmbc;6 zj83NKV2qA8IZR|UkDA7#lr3mmz$t_olWnq_KVlTDk^iT%5ABnf#IERkS{KEoduf$i zIIC2RSb4eAI$G1JZDos~MVNxD)a%TzB2gdJDNi4U9gEDA%#$}wiVb9#l-fszX$Dew zAU0FBX%4KN3ps}%pNGNt1<2}=sAR-llq0pJwPB^r#`bU`5D$@QowOXYDuY@IA!9Lx z+8tI4v0N<0I7TS$)u_@kr#>9i!HUJu;Dq?8EGfTn$K!@U6vW+XL(cf6HdF{oM>vV@ zkM7d(*-*`z4sIrz&9JFy_mlUo_}ZlD*Bmlzr6uC?PP)A`o;NZZF8)(|A>m_mgER?d zCvKeIGBQ50aOh_WMqVC#rZ7=jaBn>~?{~>}?!P-;@`;~(Huja9E_(56MMHOd_V|$l zb*w4WHbG={Oz#DDK_+x{&e?^&?koxVUfwRpMrU?)w6``l+9@tfu`@WF+WFjbxcyu{ z=h=CL2%B5h)vv5wR$WzDmQ3)#Gc%Jg{bvY%lHDP#mJJdlG1ke14hCnhWun_&AKi91 zkB3jj`8nG%K@M68e6JVA4lkY^PF8y*wz|Msq7G-3_)XwRuWXgR0zc6Y>=%Cn&CxGl zP5M!3O*riilwu~|9mo;K{4&dC>Bm7dI`` z{)X*=to3prncidb-Cuj$CGPT+yH$@#yGJ(Z`E*pfa9~ziBhXkFm$$jOsyYoCeT1Ok zKyn;Ov6o}OrVfnFdMjPI%qEp5-~}ia)XQ)S#1hTBI==41l^UB`*#svi27^ATcgtq1 z7Mr?P+awI9kI=IZdZi1O)GGcqHZa>_ewB95o&o@i!O(2^=mlPoQdCdVfm}X2mPR{p z%bH|?m>b)l#}QbDPQ0Hmub@&-FiN=&bJOn#+vXGZ%N>#2ICCw0HHpXR4; zx^P)dH6j>fndZmk8HWM5Dde7BBL0Q1d8DP0cvJ825B86)$aq-TPM&nf&a@vPm+qDqbqcWKW-(jBDeXu(RY_$>o_@cf`++N2iwxvQXBxfLm))1$ zQxeHRu0VFk%KC=0$q9(9h&Y?F0jD_2V}#+L?9YfJ4x~*x7557M^x7k|xDt5MztC~Y zW1GF(n^&)x$zBh9pgye|UVdbA@7i_saA875jCg*u)F4L@nw&+C2E5OZu~7J9k_w{r zGNd&(HgG^lcx%VkTQ{s;Q8Tj)yw|0(K3yi%afsD6(T$TBak$Wu(22N^yyx+M zc|hU%fH*vx4Tqdz(snvC=tjVH&(X^>p5W`yGEwY=;^nRPPjCcB9?bi&4?(eL_QKas z@w!1szJFc)iiMJPkGqGHqWI1c{fr|T;an`&xi{HuEj{<$uZ@MWlsnEz+uT(5limv! zQs^dBg8mnrpG?wte1uY;lz0IoF42j^q`wv*+mP09^deP~MmVRkgGa`^)bYqa#pm%G zPmncokLyJ<^l<&|+zdY@QTp9^8t!VPs3Hwq+UYf^XWQF0u3lNYpq$3|tO?q2%Zi0_*|nd?1@Vh?*l(V-5OAJM zfN&4d$wM}@tFx<<_Y!pM3#E$(DK|BKni>_*a4{H_&U6u&suN#;WRx=M?>{A$VTr#B zbl^jL&%c0KrQ3bOnlU(s|bjA?dfdQpM{6FH7#mypgiq+Hs#JFe;rx_sUB>Fi!P?W%=-X zq4QPV^&KEj&(SEZ-u4!#-=AT}>+V_a+JTL>KmONyeL2+$j^Z(J-yQn`yGOUTGyspx z;v`zVjTx7ir#c_!WXgxDAhvWoXFy|mRj_&u9=~Dl^f9>Nn%ug~t?|zIGA9E26lOlC zG$Ez^;?&eHPTT+KCMQoX#^-%!l^3V2;jF+dFHE(A3zLk~*mSB732@5eyhgfTkfJ0=yW-`ivNG zcO*%?JN!>d+3h=AdRlvds5no7-vQm_w8q*dcP=CPWa_~i1 z(Y`A_hy8)D8$=428=pdXVaTUz+Lm;Ql-D znPdxZYr1)?>LeJfLTv|*3lSAEy}l;ezf5i}&y^X)Qe`^DURO!!jPIB(%-#B|FVnrh z1NHyp-YgoS-+>t0jvmg#Z;k(3ybAOAVJXt)%mXNboV24oOV2DW5j8y_H5=@0Pmf9x zkxy_GQ7-mOcsG6w6nT15g^rr;keIZiCS|Xw{;BekIQc)DFe#oID>!NlRh(Pn@5IN( zFDMt&0zOg@X7T|7hLcex?bkP21Tn1$D%NFa=MH2CB}n-N?=?zfQ#|j zU+9ctKN%)8u>qY z+rELR_2|Nn`Kn;>yMD`8+T)1_`MYk;-X%YWvDPp`dI!TK6naNNceztJrBw1J@+-4L zL}G5ALqBZ>nbUr?HqAxE$`B$nSJoysF@RGbp5ZLZUAt17k7FeIo?pH)=c{!4@GGMJ zk@u(mwfCo9h>V}@zn^-K#~co7xFAGhBB1g(!DXFxOj`>;n9ZxQgOf6%aPKA$EDi*~ zBaRW7Ir|)OZ0`i&Z!jzru#UYYEaKR!fRoy~+08xrH{_W+zWkg4i!8pz9>+R6m8f(&I9_>I&p{C2Z zU*#TOdD2iWqX3{v+*%f)uVXm>zzWyT*!px|C!xdVWTGC^mDT}GYmA{D$i2L>uslW|on2PJ_h z2?6cCXaVVGgh;8#CM@?N2IwnM^}Jc-u`8&}wcDkx+GgiganHa4kB3lw^`^-QF1%V~ zi!#8*3t`MXtCm$)0~c2+vK!@G}_vG6r!pA~+YJ6y!7mp%z4zlDsNZ zP>ij`+`>g=upJ(n?)~NWo;)rW?*(GaKVVKA#Zal4$nMn_zgB-id1>PRlh0-UPhTU% z+vk;kqOE}=PBF~AQhVo--i#kW;N$*=f6}g(?%E|T+`wfWFEiz?d^~<0zAHoymg@LU z4k_Mo`x2Lvxht`7{x1$N(N~HZ-8IUB-9LQZ%2z&de~#DSW#9KDVQ!CO6L}6Y5dC6Ce|r8SENUJ;;W&Z-mCJja zf~A~>p%OJ2G~w7Z_UV`m!g(}pVmB>617j5x?4n|eN-b6R-r3HZsFo^6QcnIji4m4U z;b_?HUQS&S^2ed}Hf>oGf<7~}!t;P^y$x0kK~;pK(l0&RyMr=rMn)MBo4O#Es4S-! z`pS-8suHf8m@ne0nxa%q-pc`js5JUBv3-+G0W}990G8d4z=*d8Vd&rs8UzranUAz? z07}KS;8?ml+S^*zuc}=DF5m!YIy=TE-0KFzhgFq}N^;zKe|V>gB~j`F;tZ>*D6cxy zdK-i|z?XzEpn1tK2OB;1K3Xb4CHq`s$yn|1rF_=7!p8kRf?7J;{~a4(*}# zD*$>9Uj880ebLVpg+OI?lze$8cn*PMp0bgo&=nZij}SZjUI4L>dz8!P7?CpGOU;Q@ z`3Do%{Th>d0GY&l$k}f?x_sxR@R1Rf;4{yxZwzBjJ>(bhBM^RvVXBwHJ=oVMy8{=P z>LQm-C{SP*aMzEBMN{_gPB~=53w88ySswE^ixEhi#4w-F0g#RJ^U=rl^N0gYX*)aH z9%*5k4rp!@BWj&&%CdTJFswXvJl?JzMtTVV@%_`bb0s{f15H?l5RDM9+s%Wf^M6u$ z;R^*ig&rV1UH{GXkJnaDDP@d@Ho{AMBQxeKe%&C^RlWW6X=oF@m*=2G~ty^txXvkLZ(pgaii^axuNU4 zOm}^Wk%NzMOK2+b9}4zUin-8v*z3aah-*uQ#)d$df@1DUv#kmH9TgU&skG42v8RE1hmDopJ?)Y-sBeE?mOhZMN zGs(Wb%tkC-c0hS60)ZppSYuu^p-aX*)z!ACv&AMeBTiwaRcq+!vX^*{@E3Kk&9QkL z4?DdUF$=Y=4~Z<>*|DX|ngsjWBvi(xpfh7btr2XbHcAd;xSzONTH_?->4v+PeS})m z1dWyA2G1W%Yf5vp26lV3`G%B6`vs3nQ{a)(KtotNa>6a8xxa%)`cl2jwT_kDM{Amx zG?xIUQzXVoo75;VNrxKa`gf6$+oUn766I=)gHri&z4O6xRdP#WlXoj+N_nP8U0Pe1 z0Sc)Hb=NW>)9=TUN?pdBS&2$YVS3P6zc3)x`T5#%n=D(`uQHiX zVV?2&5~z>NUyr`TZ(rI4_$3?-0L_)l5@IEYPS}(B zdjXpMl(s)kTu{k&Zkz3$Pt0ek(sVj^XVmPRwq8E}#pkzterLZ++kfv*w=2wAZp?WZDVCWbK+s_H~@ zp~_n{7lHgpq!z95EBNYz^&}5*(~ql!><71;d+%fS=A9FJarwPJOaAhKD_0*r{E4T& z`I9S7d*REs|MQxnf1GmPjN?!FEI(quIsTL}_s!tvn4;jmru$}J@RMo!d-!$sNBpQE zNB-i0;G%`kRm8Tf88dI-#ojG0SRUan{5SlG%?c4 zscw=b1P2GjYSPGQce3Ce6l$Ytv12 zFghbm`KYB?0*F8$4ESk5-;pGY4irQ=uY#S%O+;-OK96aVV-5Wx5)vgdz7I#-_eDqr z8Y)WpRyN6vZ)Fn@7$u^lzRH1>47;qjcgN}rSImWKWx~EGTS=)>QcbdQx2C-kHy6Uv zUEZ>uc_vj(5^t)v{sQ8soxZ|?UwA`*5 z*f%)N+bmeGqMOocy$D@k^ovjiH9P8MC%}6FXX;EnO&Fd7&uA56x-?-p*KPOT(YtN# zG{TMkhP0@I-*xZvDEfrc9z=M8mX6FtP0yY#G$Ac8A^qHhD)sr(63gqCQ!6W> zdY3O;r`cDZX||UViTL*)K6T*=a?%pMi@Ln^swF({80a_z21M=JA{?rjUDpW2d{3fJ zN`VoQlJ9cQiFqt)^ zx5l-Qj?D^*pVU&QVjcCApMQ1rljY71W({5VTmGz1FTMD{lDumt-g?dpKl{dye)^lo z`fZ&nIUwPZabhmK5OGgv?R=RhTBIQvR?&kFaaBC#x+(T%qXy3ZZE&~=Xjr!H7H{jM z*Bj8uf3QzAT4SAEw@fH8@a0vB9GF|bC>A> zm{334K{5@YiT3ip)JeY@fd^u^LXiDJ4QK57ZC%qvTC#Bo9|!C@Q^(_*>t*U>lg~t; zW$OH*kf_O9UDaw{KAP1K&@6p8o_@BI{fo6Yq~F@P&f`-XWYJ+PU~_-ha}zZJ;pC)+ z3meqX&Poiwd?jn@T1NRMJA`BT&j2xUJGq4ri;D;XJHtU4skQo!bKh z@Pgp$7&*4CX)j~<|JK&^po_Vtu1Nq~zpWe8)O9~j0!4EdjlYorlBIL(mUqdqbXuX) zXf-SCNXf*$7B1{|SAv&8*PEuLX~%1*vl$pt!6MQCSyMUu{t}6n1PolE;+yZik<&Vr ztdVB_{n92x^0ok!#BQ^h@g->N97YEgP5VEuOhBw52j`D${SG zL#^lW`Yt!vh{g?-}NzVRXrY~(;PZ;^qE%-fOBF$d`o&EBqi_G8tTEFeS z*cM&pZpuEwJ<&Zr<=&w02`2EN4~&M(Q42CG6+dC72fm}axvv~Ig{9CiRBN$$ZdsK^2PhsWs~5)V z8gFgs8;q3^gv?@qg0dLG%>NH6l- z?()it5;^|B%i>f1flf@jtw}=L?IbwmM(IQwZX@R0LyGFLN(Yd+)Wf|1ab^{xTVPVF zz4R53I(*&v@URGjUiuzM=jkahZ(g^OC2Cw6)u(y8_(ZIl?n^zZAt_P{drq|)h3;cU zClz$+=mKD(gn@mSE{0H#jTq^zcqnli;o$VDBA>P91slRqOOIQ&BXHlzj;onxg?E@6=slgO4t2ChsIlX)8 zZ|PmrN2GZDm85}sr&3l_Pja|@2-b+psm>;+cs3UF9kKuXs&4siZ8ajH+w^L} z|44_B8Z8gd;V*sxP!pDm1-Ulct+Pc>$21G%UET8PS^J@M>{Wl`p@XU2 z|E<N&HYK?Z0&GjUE~&9Rk-9C3Isv+Vw|lH#Cd?n{r~KWd~qP~D9&C%+x2a)LJd`})33 z%`IPjfb6FY1UNn5n1wuRPxo&&^KN`URC1c!8Lmg`U43K~33h}Ay+_$xTcmjJQ0b;s zrByYe;27bHL%>n`SDey2RFL2P6h8>JS1h12+|OXgtt%F)w+nob;tRm6AFhKz1r;{w zkQLv4SEVja6^9kU5L8hbGBhowKG*u@1aW#2{wd-(TybOqB81mXU>^&{gt9NCA<=^FeX{!N5^Y1 z132Q;y~us3+l)nVTnaw;@&=j&2smZ-0In%;+4p& zP6jQ?2!cjRZavb8EBAYOl}em@B-H&CSw&j^hOGJxT>^W%J}a%bZi#9M#5hsa)-9o+ zvagkwRLQBAR8ApPVb)2i&us{ax;oKc<<^q}w~X;!`0J_mUCQctcT&aHS(4V;mK;%4 zg~3I7X5iQ5x4jAutib8nY z_AxHlp#&unt*={&ruIu`xF-oqfPKKGIBYQC)ccv_30R^ay?nvsO0{97bHsB~manek zmxB%d?20InJ=Pv2KaQ6nt6}rCN<3~O8f}tduLto7ap_;qelJK$OR9Yfu>O2C*uy`tl zNDu4XqPF?H_Kqoq@E^11kfzFYyffCc8=@O7$II{~d%e9M(@S8PI@`0Y!t7S(_Waq6 z7j_M1e}(U!>!`kB zK4#zHkfX2hq6c~HKhh2Sc{+n{;08hH0vI)v`JU z!%jU6%Wu_l0^}ao1R!`U^X!Wo+K|O>#sbu%hE0G4{bOm|V?p{CM;e7qXxIw}7;SZ2 znuJH0(&rXtX2Vfus(L3NlO7Etyf4^z*HvGC^+i_oZL>IMFcS=r4sAKx$5p|qFKq}~ z+!flKhDgW<3To+W;(fZD&Il=N|8Fvj*>w>Mb;gt~ik3s%;@+wtmOzf-OZc~ zT6&TGur%k7xfcxn?<6lkUJ|c#IY+ADMbq-=<6rOH9*{XR#AN!F&VS$WttW5fEpz;n z1`xDkL!A}Yelp>RNkKVL-_}=mJ$~0GpS*F-p3i`oDfrue zJ@ap0GVqF|8>|>n@Z7Tx=RaQNhMx( zQ`^0HW6zgD4hBP-hUi>BF(p?N{L7L|f4KA7%c+hnJ00UA;p?v5pfrgSs?ueBso>d{ zzkdJCtDpYjrH8V;#|Qpg^1(0t@Ktq(QmF3!Trlvn4m)r*$^~)t>0Dn9uS)X!<)y6aX@U~ogkaX(qwiK93af5 z$YD0rA{c`(8`T6nW-}^^!&rQmi`mHiAFKigckGMVP|m|u4Vkh8(=kB;QD$OQDQ^|4#)L`5q7@i zpcl3omcV72WVKbXJIH3H0`2Zo5@u;bAN@9tP7M?j$Ya87i#ZaHkKaD_HOqAHp102` zA>)fy{^ITxGK{}~i?q*iI1UFlh^HuVP$6MvRFygCEbTVzH$hgOn3EZ+NiHWh_Nym7GiBeEHhD12f;_kLuxr0n zYvojjzE1CR%c?_6Z6QN)K$AAjv;yXeY!ZM{=qMY+27KKQ9g$W5hNbzNM-4>7Bpyo( zZ94T5``LC7H0{^UC>S|gFumEt(6v7*z_2`%Ejrx_;Y}s=7gd`(S(^>ao1YV<^*|K~vZuW$>3X46nM!XO%6~^Q*hA z<%uRIzyRb5UhekI0|n3TcOA>hou+$#t%gv|H53GPLhzgLO72ol@WQEdq6d`49KX}A z-vXFIHVavW2q$@J!=q5r1vDqov;Eo_eG^Nc>m&B)G0|fEn?vcFrd{mD&BeA!*Zc8n zgrr}QL-}KH623Rj4jSp)J^@MT-vYWTbtLG9!v<}%!-gSiSjcOqL*xa>-(PZDA!VBH zU=fx!8=v%ls=M~+D9bbdC6JlHDvXE_5M_WW16G+(TSjf|AeRJn zH6R|N+u8&Whk_Dr658o8C`#<qO~VI?H>v0 z*@JffNVb>77W?e)_dMVG%}j12*o!?LH8b;Fp7(j5_qktiqk2C24IDC5z|v-(qqhJl zJ0Szkqxu72{l85&woX$>C*n6rH|_u3H|>uEru~aBb_bgFgA99l{bW~jqa3d; zk4GT0Ux2CnP52I;g8BOdbdUqkOdf@*Q42Mr239sr`+Ja?gi7BG>|K`n-sqe5*FdUM zqA$StfVm24or>L^h?5*5-=p=%7!gxJkqL7hjN=v1OKyh6%&gVBfFC+OXw2_~h5dQp z<2EO1!Rm~WD1=G**-e7oE%d3ibl z-2IDh$?wPWoF)GNmSmRvR^O7}fQ8YLr`|+Mo{3Y`oS2-)=CP(bQ7YdIA&>1g1HK3g zMlwg6Y7zqtcz!z${D?&!DA_v+DWWWqx=3JHm%fPPa`uA3SNdyUVecz#@%0+ty2X*u zd{LYv`l8qiC)+B4T$w`8!d=R2k-Naui8)A}n1wupnP?y@)7i0Xh!{Rahi2((G|?(4 z<%+=VXRf$2bO?A;B_K_Yvv3O_caClWV40 zL5q{ilw_%5q1JFFz>?`OVb!4zth=UbR;vYg`^ZECi07L(18kif*N|u30@T6CsF!mg zyaG_IWhH%(S}#B@IN~1X#<#7Y$g+G(x;0!ams!&FEaa$JYlv){gF%3^nOc;*S@%4r ziH6Eh^M3nU^-)u7YOaQgI}9aen^;gDTWWyDM49t47tXd=tz67d`V1z}O_iIi+|RYg zQ7`^j0b&HoVe{MQG^NEXBtnovPS?zAN7x8b!b%JO^`3=j#o#(uPR8M}BqU4Yu`FBW zUNdILa7@moTk=TWu3NyNrM{*riF8Uv`6#h-52Z`YMo?Juc`ijh&$2ln`&npaiFS&x z@ECWoSLVFXdbz33Iq!|y)KRIO7OAJUQf^P>>wSl5IqX1oRAy}en<hcQZ#YKs?cfcP_`^ma8$$y%*L1U;lQ zO08veu2ISZY)0uLWDH#Ba_#~DSiudkZx{^IpBSFjKY&F0Lv#0dmmfM?PBv^m(eTjc zXbvB*!8x~|U=84p#rR57`S_bA^YIU=mii9$&k_!wW zcu;}jNTc!=uhmv;`kp$tEjq0p!3c4e*T~M9y4cPI->oru5nHR1mL8zK1CW)wtv%UQrbj-(ZRM zdu{Oe9*}&F-*;GkWd3Jp$tTfnnTSIw8&LqCN*T#3&Wgi)-i_KEN}F8P?aRGpV=9z4 z6V)5NB!K7V0X(A=eS`=}ISuvXFL3dY#`~BDNa2?SXh0m(j|S$!bE0+$YP9ne1M72a z*>}F7jVKOS(hQ^~@{Qu{`UBxC9L+2rCZL#MaF6-^Am&S{9K{*y(6 zuK#b0(ccK2~v%OMfGyLY~+HOR@ zcFYm&3)q50?+zYz8pWgb3i2I&{@(C6(5RzOLD88=I5A+)nn9+VM}=g*TB(W+a2hyL zU@A@y>v01#D*}A|*j$P;f#tQZr4nEpbK!FNwG_Z}iQTrPI089jE<|o)!}G_QMWf@(Htgv1!<^$zUy16R12~j6NWIhRmy4)#(+3zXPSK zViIpDYm(_Pnbs&%P%=V%W~$2TY8&}{lsa*#bNkAVq+X_<0p6)PyqZP^y@MS|508P8 z0H>mLXN3aF{5!T>PRk`8gbMIO&jVav%(kD~;KgSLD}`t>NH4+?A*ArkIT>Dxn*ci` z5}F~964HDL{=vzZgEvj(efn9C2QnP zGX;i9M=jhM7lPMKuZ+ogwP=-JMiL}~GFUFXz?ZR?;hd&J73DIcx-f-(#bM!IqCtbE zUdK+BG4~Sbs(sx}5$}*pMa#hC#=Hoh-CNRGFbQJF$M||1n?)Em!d1 z$;|g+c4UmrE@qts7>=e+Yjn@KMx2!Ug;w~ok00G=Z^QZXEBZwGe%5}NvIMIoswkDw zZMdYYtTfMW69; zi$>66ungf6+SE3Zg5?M>4n7740pb)W;j7?4p0d7VM?$W@658S7zQ`Q8Zhj*0s&JBy zjlpm|u-55R5G{_%zNk!=d5|2YVlwJr!!}skB-e7rj!hh~0S&ALwer&prfV=>jaOJr zsFqs6bWY(>NjxM0fkQUH76+{1kAi#<;e%@zEw-3{j$C0}z8LGXx}Z|{NjSj6O|Wqj zWGY#o_9;MP$pdsbtjzd|F+C1eVC%O8(iPUrwJ_}nIOU#Iu-Zf%l*>ZJu0j_uxr;C; zx~&(RxiDNV0%H+ckbw}iBn}}I^O0J->6!|;4!zje8>zURdxNe-HR%Y>oGRsDbC;tA zNEXt=f~!*z?4se%X7f1waWo0LqFG-wosQFg;s`0fDqXIb66Rl_?+6=|htw@+#wxSL z`C=lJ^O{)dbQ8$tTC4*;Y%mkeD~W<}1s%myYwKx#^=r?}M{&@?bEo@qU|;EX!_%b}r?SPW z*Y(NAdq5l1X{>I{n%++sitH#ab9x-9p zs%Mp-;@#Ry2~fB~(x8+Sglj61Dn)(DzI?q%)4-{E(CnsFE5qpb6U z@*rO;ZBZlzN@7-Lr{*-sB(RAV=T7q;m>X=%f2!@EsjJ|nG#Fqqy#2;YPyT(9s>c%F z8W?_e=!&N}H-T@h2j?9z&Sa~m3P zT-pYf#L|WEN$_d1_|?^NGXw=TA|cC)CB;g6noG|*C5>Q`Q<4yvcYY(~r2%Z3lQ-OnMSqnyA zLl5Z@nmc_F-DDK_hVG7TYN7Zq9UVPD*`@fKN@zD28a&^b<^y*Wd%P0&IC`e;N3`X* z^bj)H4Plss^Hios07KRxMx|CggJ^U8GnvQiun*SN@{tJ5cP1N3(hK8@k|{kgwn3^} z@S$9B8JpnR;V~y8ny_?KL`J&8< z3uhhxwYY;`L3P%%YP-G`Dylxz-AeV6``g)srh5?mQ%BH8a%0 zjI!A+(Fp~Sf|M5@*WF$iDOPL_)%`Yb3xlB0+|LG-nDYc^1F4X0#pF`HcQ(lES=FYk zdTYRrgJqva5{VWRl3kb5WI_2X{(6^2vG0U~=|^{z+Mezw-y3JwkuZasNT0z6-!W&G zky`o7_rgpxHVWp|3Neig!f!s^fPhrufv$~+%#gAsMa~bdkNhP%(u}j?Mem;;Fs=uH zGlpU&xP8*|=Ksc&6054T-<(BmpBygilS77ma>%ex4jcSbz~v}V_M5|peR2q~PYxsB z$0Slk$O-J66^r)q(C1);hAM$oe$gG^V*o~cBYPjbmmH)4N>fNqg>L}H$q%%ns}9C- zRkE&FFV_cS2ZBvAX`wOLL=(^XNPdoIXN$CdX&!)u;EewzZ?X)m5fc4*DS`(8FQ>h4 zH)5Cst4Ey;^wV%Ph{|Pi!`8oJWp8V^@R`r}S3IOypJqXO0TFVJF+bnL)iL4y8eA+}Z@`R>f zPpBDUv;)s?vEIoL5zjd%qk+$YsVo4VRSP|elmr`jeX2{|eHS-*75>{E#;_oIqS(KX zFYe}xF$Y(?Kf-ot@L%~LR>gA*hI5kqRaHE^iS46dJU7cFE0vmike5=1^=jS^N@;bQ z{1xNT^i*N;1lEJ+F@>~%@9PXu?}c|_1Ig1a?MHLF4w?5>r}{^%p7JB8psEA#)PWp( zgycYnNYX2(577vRPgHl0wJ28okCzZJ=Fzs2FxxCTg--(-z(WhndgaoL#UOcf?bNsy z|r0>hNRaKSfuGr2+LBnbh8lrZ#9k;*&z3oi~e;Ljr|QfbfjbgyRYiyS&yvdr4b1H zgB#o_cnG^elZb~k%1+Ih>K0*GcZ^=>r5D4(vUfZ0ymY7*Q67JJzl0NVf%+5-;n zpi_}6@2vOHObM|KTfqtPdK`N7NWzD)+B$pue|~Qnet?;@uIHwLyak%hB%oW zst>27^fdH!D9sFi5D1pMYZ*~)KlYVUfd^bn-7;)o(|I7WT#wsMZzW_BbL?hzkrK5o z)nZ2=D14O1j+Vf!N-_4<-sS;q#$0$q1REefk?sAJaGNpaC?Ri?AeMZ0GqlRB{TCXz#!{e zej!q;-U(NMkuocbH|c5DCmKzV6_I(NCXIO(<1NVvH*i)B!ByD1u?AajU-&3f*&rgW zU-0HLl@3vV46npJe*IKyEnvqgoOc7j+iT8ckpx#mO5i(LE2ocW+HO~m-?eyO>7(Jl z1IAAi=L$p)%31Y@vGc>CoKxy^kbP86&l`;HnPH~2hEckrs759q%l2BOkn?F43vlj( znTPbJ4C!zaAK1frFkDiAINzUx6Y^1xlRpI)uQx2d^Y1c@bBel4wS9+ZC-!p|E`JEU zLd0vbukuIk2;3rW2i^_eidX*L=uUU&=mBg43Cmcxy;TK4k)`I^Rvg>D+VeLaMe)6i@GhtK}%`4ru{@NK|-u3v+n+m@i9{#_Z zKm3ExEk(h9$#BsI^Ulm;ANazo+b7F8;TOL0#`?|{upC_kX&$r$f(BiKy1}(@*qvX7 z4s>&zSsqhTY=nJ}zL6OZp5NTQk(_(Mu2USx&0b{=%ef<|>Em`i9GthtTxavu(7^cf zAaO7PC(*!-cP;;J%)k$98_$k^)&`3k?*?^ng1sBmVFSfC)1}@}S6z{edBCx29J#z- zR?v?xx6+XhM>gi(7t2Nu1%DVrjz0QL4YHw*?kKJn(?t?eQJj%A9@aY4quFn|T8`>yqH)%bkz2#(iUA3(AQ;1x5M(xZ9_ud`grq4dn z3oiui8V>lyc5)mG8#!VU3xHYGhnJK?Ox+?MBhGEyd$zCHGAxZbsSF8NJ}Re-uoJ#b z83BWR`)9BH+jp+boiO4jh?RPiCQS167cF@A=Vre*-@#Y1fnd0+{yEk8eeX! zP4};T#P`X(~O#A=HTLF1=iJY zJ`h`ivKc5zK(j2cbJopn@B|tcDMR-{6kN)k3^(11?m3J}xifCvJ@b9Ci#Qu%V89~V zZwtcl!8@*|OO3SeK(qdyHc@>bC$)sOG}_%Vv6`H;8nlCXgy`nOmbTF7@5TZCw0ezi zlgw(6iUlB3SgcFwwYH;Vq;w3MkKTD41D6p*yZLzb+^CLBwIfYSRd)f68=4k2v&*{o zS&LF_)(fm=T)-@w7*1Kh0X|F(cRYy$cTRBVv7}S70ol?6yYUXiRc%XcqFDZNc z^p0!;sjT`j)OoS4jM@+4Z z1`mWb2s=7Mk)Itof4v3Au}s%Y*LAmbZHR3X?o>_U1oAWGHni@{tnvoQU(<4|FITO$_Y# z8h~q)u1KNW?T>@5Fz!S7GLtnp`M~(H=2#&N3kP4%Ylzk6vgSce9QTHsspUGCY>`^- z*h4*|t>%C|hQ}ips@2@jt>$=c<(cJ|=3S-f%1`P~ZN=e-bGwztg8$QW&sLljbZ>Oz zK~tWe=3&SV|F6!_R?`GqNm%?6p;-P;1$rxl5X5^Mr8>XV?v1TraKK|LV(}&XO}jV3 z?t$&7-}t}3WLMj8_!Ih|Zhb1-Fki0S3fY$kb3y@zwksrf>WC%OTmaX?W#wpwzC#=_ zg@b!4S7Q9N<`+4t*9Yne(O39YuS?J2SN0o6+UwP>(KlaWugHdi7{G9W0k}}is%L0{ ztzs<#%d#pmO$&m!G zv{;^)dY6D2T0((09L%E;fuOQv6rlN`7ig-0az=w>itFS;Eu)D|Fh3wVZ)>mz1qxFU z+|oQG628B(+_eR(Q;0!#TD1bW`$!!MxCRI?s)iFX{Gf>r;^B#s;wkVKcOQptw)&bk zpSJU)#yYESiAX=3ke5(EHyh4){!-xX9x`MK&5 z@=?V5I06j_vz|scLKkE^N;}^wCr%S4i_sA2aL*W1pwspYOhIRG@Nf>n6xz7q{4JL$ zv<6He;0YOCqvl~gQ)tU$3aukBh1TJi!m(kQLckL;`Ai|`VLAd+FokC(f~H66_f(~n zE9CJ7J%ALPxolw>CK>1O1(*=~9%#Huwr}4fp~) zarg*9gI7Z@a}1C?3FF6bP=ogyXQIzO%bA9QAz%)qM3Q^%5#o8~x#pvI(8*PYVh0{5o8jKdv$d*VSHOf84TB4 z9&ww@JS5YR;Ej}_DGX1etE`5}vP^=VbNPmW3&eRJu*NKt@WRXCslu``zsrxT4&W1h zdz#$y-{0MG@IY@RoQ_#e!9-h4EglW0aBNX|#me~+Wg5jV9WE8F9hwQUk^QvhDY zy`Cg-O*ACMZTs}P<6H}B*73$xzPYW4Zsylegz$p;l%UHOo7#Qec=nH>_ww7iB*9r@9BlZ6TS7e8fomHA+6p0Sj->05P&FHQ7zFK+f>*zm=2rEgzn*%I`oj(I+FUBY zb|Kj41$ZfZ^?SpQfhWRqj(S&s(=PWR&g!A`dX2g>Vsh(A+1St}CGF_(vZEb-j?MKj zimRHFGVc)cY%%?}N;agVrX2=zkt|I&z@xCqlU<#%tul%t=Pk0cBPRFm!A;Rvg>0|r z_{?EhU+k6D)z`L1=0~PS<(@_I*;uqah8piQE``g%Yj0jDp7-hSr$1S)?D2Pi5*f~5 zQ4UI|ZUasw}7)MlpSzt85PKV zLy$rJUz!YV2N{5bFSN4*FriNzfQ`Qs6aWgPep4me+EHu<*GL$^b>^Rnnv*TFZKAlt#qLWF=c|j*LNGB_B-nQYNjW{|nctg`j zq}tpeCC%+pbx_t;C*b{-`_PFKqM*xzJ9S4ib@dH3U>7B2*W(yUO*EF37a*nKjP4$BIWhpW~@P0Nx3tklP`fw?L}i4F(*O z)v7zRgEh-i)Z&m=AC;0CNgt_@wKc`EX%4vWE{unbcUKoAlCry6cAhWyR>-;uDKHV) z9yh(A*69s-WN_{PyR42k)yTSZomURe949Z7$n2})q_!s6^aNQ>I<+5uEjB;;Xb?dC zHKd(KX=hw)8kf?oD zi2yh+CY(0`UH9OmuYfkb6VcDRDGg{V$o2+VTV5lZ8dM;Z0hf_yo-V71$d1JMxODe? zq;Pm;vb{Ko82*_+9NTuAxd0F^A&4WH3l)L2pvsLi7X~Revio?M7pbdgiq=J?6y{1< zR7o>Y4H4(lrhI5^mO4kf>)G=IaAyrZKlQ#+n;wf&dnUS6vW$)X_#hDsEPlI3mh>eA z+)N4B4dbg+ww#pJC$XQyX4i|M+HDrL=noH=9~)g4c? zv^RTF?#a3suy|{i-0y+El{NycB%9TT8lS;zEWA@0JRqD%2+vYc`m>`l%a8!6X&oK!*~&f>Nsg5v8G{FadUC+v+t2I{ z`l~be``^b3lCdH{I7U_^JKhs7x=b~>(K7V{JwUtES9#V4s5mBTP*%czWSirdAuH?H zR^ryE+^?z20P$2F`H^)c*_Kt7qSTczKs6FKKoiJ#LDH5& z3Tdet)6kGApz$$EOF(KO9+1LKIT{f!+Xu<`*XrW3CIPLEs2zoPCu$d-op_Ic65vFy z@lJZ^)p-ZF`A&ExV$d$Cx@A+Bq+vQXHG*xe>jOCVcggzd8oBQ+*|q8j^1CL;+NwIa z$3y6LjijR~xwnp%>4OnCt<#Ba*&LPXrYL69PmfhDkah8jCbYxZjjPep1}ctRg+#FW ztD)i~D^pQWuy1zw4VHbQLus`JKFjyO?Ej*)I$4#x-Keu7#H&GXFvg+QeHLikjK$OA z!}!3iX4%#u>6*i`w!Kj{rJ>`m-yIk4wZsIZ@{MKlb?+C9S+@(Q6|h1;QFG!<6!@dM z@%kN|$OOBuL++_>u1EG4+`>v7+bfXbo@_#Qm$e5GsYoHyuUd9-@Y0&%q--o-sp@E& ztRN=$msLQ^#{nxgRscOUji$Eu}fVDanIUa+iKLFqwFFsh+e-FIC zqynIYi_Z{yH*z*&U9$0nY&i-NzE@^z^h&nZP?g>b9F2IGc_va?vmbw=tMQZjE9Vtdt)Wpn@o@#+CCX2>l%ya%{q;ee1~p6f5q^XG@$ehY68N)DaW z1;B_BjYaCxMIjqg$#wg|?sly7?o@!|EOuTBl>zXkBEvbX;jg|TFTy!`a7~#7xaSev z8z|^u?HR+pUhZxtH`~!5n;Q;+>mDEp%a)3o+6r0UA-gKXdlYucR_{S!lhvB?NhFJQFvbgjRT7Vp@qVt6q);_st6?`)?r7JG z#zr6oP{M+2u=^~KtNP-okJ?aj?YIwdBOy-Wv{giFI%5e>c2muXT5R64*!-3G!THg{ zYdQl;u*Q*e$F4KTq9qlS6drVk(fNdw`7RvUCsgM&GDvq%6A7r3kuw-i-7ckCk*3?3 z$s`j{0pls4Z9}9Ou*E~QMZ4Qh5(vTCmLAuxCv3Nh+FGntqpjY*_jTRRB*3=6uifA8 z`}+RzUH?!op69ur`@Zh$^SKW9^$fm)ZTHo4M?|M7)Sa~w~5VIWXtcc{F< zzW>JP`SyJqhG)rozWBMDuhQ|m_UyQw@$b8$@Vokccl_?}o$rXeE7jbyll#Aw*!`I5 zXZ5^UGM{hUerdbPv8(6qS>g}3UG?KbDz8|vW6$I{|L_f1|?JX^bH?7;$yEEkvcgC-tEb@(y z=Bxe>uD;?vd4IZPc#b^(k@mYPtz5lR*8k9^$6uBEyVh-*@s%=v_`IK;Q?Ac<9lGZ$ zGyUN|efInRXy;$Bd+W{q@amf<9oFl64(&)?(H9Qg-W?Emb8oZm-?R^3TjP$mTlV{( zKe*vBk#8@s_IU0Mc?U(_TChp4f8-10XQ~{t`uR|N!#T2ldwT8u+<#4Ax?Zo!zo&!o zF8cMx&#Sy)(@fd#@4e7lW!JMp?epdPUz;n}H*eTDU)Fbj;2)agdI~&z0{OC8eLA16 zs=ggNSnf}$oGgMx;Y3E%J`oqhg`LN!9*ZkeO z-}M(Pm?zhFt!|$674Cob^@F8q&-1UI`E}&{DOa2>@SDTU)A6+r;}G`Q=aU5V@zt;&Dgs(|4&pT=}7EA5eUtuUWF*zK*lE>htqA z?(8U75x#6o=UXzLy;aroMgK3CUGtD!-&u9_4q4BX3t!XyzIFSio}H}c&5uoQ(ETXb zG^?BI|Mu}F9dFka3v@rOzvkuT^88(08`YkV#;>?c{-Lr=K*ZliuKJLmhgnwQ- zZ{T7XuX&(D?d$g!u2R0)wPJU**yq2T^{0Px_xDtp&-2YcStj${^=Qj%Sx;=`ulLA! zJu5zNn%GO{5@F9I(Go5HuBbIw^R7Zj-c{%!x*r1JLaJu?26|6F~i$eU-bxTgpG{OC6mzbW#r zO`W=*vFYE8sJv*!&JM1B{@T`CRNk;>fjnQlVD?9>ykN$rf zPndYsQQe=Gmg=r`{_x1c@fYg#ROh@7=6l^xJaio|&?q)xZ710xLhJ@)>LH^U3{R@9OIndkuW`?0e;U$9B8Fv!}lN zZPjN>v)aR1SJy9eWyR~CzBBwjd4BJPL-W6a{%_tkajjh6zG#!$>-wg%{zGK(XEOh1 z%0Ky--rur&=Uwyt;f34Y|1B%OxMvsgKmYEsC(TL!_`b|~3kr0+wI9CX94lMCy2_eue1c>SxaW zp)2e2@6LZQ?#lZ7ec%1pDp%ev_m8{w6|4WMO*)^Se!8*J&d=`G(wDj)v-ey1pL@RX zCB0tNr}y9V>E1i^dTfr$(<2K%EZ2LwntLSv`|Use(=2l4Fx-84^*c}6`z`-Z|HQY-U0K(2#`ROWtURpmyP$mhH?7>Ma?8)I z?X~hol_UGw->|Zs|5=eG-&J|Oolon$l@HnLSL^+M{^Tv+7rA4@QQhBv8vnELIa&B2 z^~vP&oV*A5pGs!dkIL}ZIa3d=5xK8wxsJDZ$pu$i`9+oIhi=(s;BAr+vU(-->G4uSF~W?o8F!CcFLx|FNP|-~VXij-3y#+1CE?FW+kA zVU=6g9P1M~-PJsA=b|~`R^R^n#^hz;*OtexIqvz&8E<^=JI6g=`S5cO#zgL$c}VT; zf=k~&;>v12zuWoxbyl|XdEsYg&9L^eN%?B$kH68T*XLWj`JcY(hgNP;{jT%g`E4uP z=bQVT4OZT$`uV#hUAKvRg=WFF)nVs-IUs>;0N5PnP*SUS1t?$|J6<^L=>svTLloM%O#;iyIGExkKe&e(&DdR^FxZ&oBPt zKU;Z7wP+(CvWe( z+?7>-_dL1Q^2L%q)!(N+e1<#!KGom($G+q0vrqN+tIs`juI$g|`7bIz1Rw0a_Bgrn zu8)55b9VfEjqg4`^pP$rAJzGt`uC}aa@WP5^w=j;7DOP1cM za%{zJ(f>Z(V%Xuk8JHzR!K{@^kHVi>KLN>0WEE z+x4z3oMY{&VMPk9=*=JuKK_J54-=t z%8jSU`rdr@Yo%7U?_c!F#_?9R^I!0(non5y1IkxFe(hB2-`2J0dS9MV_NrcwEmL{? z;D`HEPVH9t?mMqNB>UU5qM&yT@z$DGcd5Uy^78N>uXCcg>uZ_MhOQmTUp*^U%<3*U z8lHb{@GKqgq5@ri@fY83*K<*UuK(Rhj|AlTof~#5-<~o3rd1;E+EY;7J^yI;jJdCW z{5ZL?9e;TJH9PEetB?M>hCXTK-D*#- zuKmylto)M76BB1FP`P)Gj`y1#)4wP0zjfVFwfCYo4^I+#`-(#8x)AfZKkDw1-pZD#X)gQU*?QTEi?U&^Kof}@%{AthcXZ4TDNq_h^=b!TY zs7!qN)<-w>jLPgs)w=uFjmq2n;k(Pa=8Vca{NaDEKcMlJj4yb*_@)b*bJy1(U;o%g z9?Z$j$hZEcr70)3AkW+Vb~q=08u_ht3&-W;&md>}e|lj~mi@o$nZQ*!c^&f8>C-em zq+X)>@;-CEU#{=kvwNP@lWx8DTHW8i`4->zCMUe0`rmHtxh?;FE??XHwxMW~y}rc8 zZ=G*_`FeZ5<%8F&emUaGik}axe(GH-H|lWBPx{^}ecMwV$T9d#%4&*P`;VpZ?>&>HE5d z72lt~`0aaLS+92{=2`!_y;<$Ky>peu4}CLjyj5}J*$eglC3bzohd-ZmWu0$VZ|Myx zZ?Jg2G_W}yzwztp1GIxEPMWQ8V~L2-8fV7sUJ7( zc}>?de}&dV_LVyK=>6bvFZNgd$g`VAW$ypeU0>Gw1+ROtzyJLG8`l4CKdSou_1eV` z>->7HyzASuekIR$#QL;;H?(2>&qrm(`$o;r->3Iqv`O`qf6*zHpDx;@`#EFlsek8Q zS3Ybh*=hOxqD|`0OA4-7sn=Hr^!@J??z8$^ZSm|0TsGHUw|v*TrrG+V)ob+rEBn3Q z)$1+x`QA@FZvAhIeSY(@SAK1;+vmGhKD*e;_W8H!KDkWg4R-%tPsA_r|YovG3dN@^AfYi>E!-emcs&Vfpew>)(p*z3ooj?<+Q` zy@XbML-~#TOzq{JfB&~U9skioI-eyQUTm}SODZp0e(otMw^;cP>6q7EFVO2tE1v2U zdGAbXuj~GpykF(mi}SjE;ty|Gw?O$3JgB|rf9swpG9P5s-}o=i(0pa@%y~VV(Z?@# zKebV=Z!NI((V4%VtocWJe)Zg4aQeso;i5sgZsld+^lSUpihSez6>}w?J@1+&E-{ae_4$8~yx;C;%Wl2@_UXU>*F5S2ySC4}TljmRx@IUR3tzvnc2Bp; zy^Z?(^0MGoSJwC6cU4EJm5=K6?$)!iSJvnM{;cob zqH>Gn=l5s27FgNx-OO{VUU6l8eoH9uJ1g7yefK9#>s3x!ez{?Gc%sNXT`jY_Qq)IN z6JN8}7tE9O{r>6eeJWSIsP*jG`K2FFdHW`{$HccEKg-JVw4VOX@kOr_4*3CzvrDjug;IldvkIMfAaHNE?MZxdS3Ycif8tyTxH|M#}D_fcI683hwq#H)W=;}#|ySS zcF>iT|DRcN^}o9EHn~4^#+JViKFoZoY`i(%*F4e69oF9rZ4Fs@m&(7o<+iYuhg5!| za?PDqeqQDEFBEUIvaM&`dE}OxtZeI9=lyZz3e!o^Z8k5&BW%Q?BDtYF9MYmU>`qJkZz@x*1h>pdG<=Ktb%pPiYLx3|oheB{xe-f*0J zXYAQ)ugb~0s^&~Sv-yMP==--@{hdCz^e$Icds_JP$R1bL_4gh*+qkmM_qi{WK9?J> zr)y2+p5bHX>Gi5Ls{hI7_Bkqd+3~Ns?W$W`xkv2r_1j+kb?*6HD~`@x+B5%`qjK-? z+?T%k(axOQ-Mgl;=DXMbTTUh)nCyJD_`xxGP31-JZ{9Q}2g9v=ixerfK8%}uZ5 zo1lD|CJ5obi&qA6f9Y_4}P(_qyUIzWeb?o&Teo?v?q!v;DU7#>Sg7 z`T5G9d}K^sQ~AO*>&$WTwnev`wsTCzzP|9-nWJ*ooXH#a)r`(JjXqbt{=+F_*Ms5U zdB6QpPVOk1Gx?#Xww*gBuc`c}3;t=vm>dl6+xGAGj>?PXOrC!01J94iYbt+!_nOnj z%8#w7{Ivg@W8?i~P37DvUmdl_Te077 zU-sJ{=I-B)d?5L5Dkt|WSyMT1)yF?HGl5Da7)=A@%PnSIyCU@4J=WAy?M=#lGiGeJpo>$D-u2 z#++bI?kIa{?z1(r= z>LQg>FR49#@Vsx_s515__WHdqpMINrUB`Rqp@+WY%4*;L_Uaw`a`V|c6Z`qd*!uU* zTvPe|^!G>Y4S8Gg`G;N@yFVDd`i9?Ll9TsrL|+g7YR9O2Gxl)k2c!GBchQ>4Uo8Ad zT(4Kn(es(F-n#1+SJryZ)NlUN-rVzDOXf^|dH$4p#^hyHZ$1zh<^Nl;_s<5pK5=p& zk-LBA6>BO_+4I`XIeG8Qg5B9GK7Y5$Rde(_XwKTtuRi(t|J`yv{y)9W^5Fxum$zBD zL-}#bpTD!&%F9%K^3ApLtURRh8+q?5u=4XNZ+qyMMOL1p@}14se8bAt|9&m~sY|SE z{cqt#*&!?M())k>z{1J@yVv_aA!#HvYgzxV#WN56-S)0`;UenF5kX7cb%Gi?=`W~E61)=kBE<)f8yK! z&r8LuH$DH*j;+)~&oh%>9hK>c>pJB7{iwXXV8>Obt+-6&?tlvF)HNr3{l-ySzTmn4l}1a!`>v{^J?ZV6=1p3^=uTJO z(OuB8yLb0@wz%@_)as4*4D3mTUAcGjV+Hfe-e0)Jm1k{Q*WBCq!2EBy^4+Pf&bgIu zUH4;GK4s6kqjP@s{1^I0<*w@8PrmWKU%B$GRM)2P+28)kW>?;M*UUY;uX_Cxt8>>k z&79Y}?ybS6a&p(YzVM2v@B6eX-?MW?-`soF2jAz))m>fH^MC*Sc?nnEy|ru4j7z$< zeJFQ5)ti6nbC*81J$JpQpt<+W)?~ny=kJ`~xBIu>Ip=a$zL)jy{>7u09UVtL(sM=M zT&b6@xci#$c*#$CSL}F@ez&(@S@-nG`u0wzNqVaJN8^}Jn=(^uyyl|A<_qRLv%Jro zWBzD1nr+_m;~uA!I}*k_a>QhfXZT>I;gw*>Z=we?LH_@#peGQ1H|R9{KIjjG`Ga)u zso;cw$$BfiChC|TQ)IR{#%EsYG8w<$WP_QvgQ0+l1~WnKdN&x*{{}Pf>YsW{Ngk8Q zyc4wdzRRd`@4G>--tF*z{0XD{LH;DloB6-oJ@(2Q!Gh88gPB)Oke(0bdriW>aL{q5 zI_WP?HC<<9LV3Aq{yA78({v{t%mf-uZo2L7Wx8^|$%tBX*`wpgn6iX-gW(fK7r|uy zAdQ`)nPA-a#PU><}^NV(x}Iq?tkZv ze;R$`pGP3C&?#YKM_hVoiOwNdhbaGw4z+jyzO+?KUv$>-&Wr~t!s+p6Kaf&^rywxlU7$1W<#~icJ&lrx$@(L%*+ZShe zcak@^Fnqg=d@N>4qsJIwp*!?S898kdo?JS8Ulz6P7ye8{MRg9epFrq2(nno7p347ybnS5Cp zYM#OyWbVu&T4#zA4pUy-W)evgO4Z@VbWJ7EtT?4@5Ir>O6VAv%@{cYI)TA(-6OHBV z_hcNu3)YC!oG{{>XUayJVrW&iV`0=(b~lzDX!x5`qZwZ?c`O>rh=0(o+$ zY^0eMP`gO_;#m`o=d))Kws2o8C8p6~{Ak#Tn(_?Ki!#wvY05MP*@ZCw?@f8lG_g6z z)h`TAuGx9n)kt8!x6$2Y z+1gB!7dK|q;yhxZL9r3u$|TY(usWDhD>aK`pN!92$GQgV%s5^9BY4MkMme9H3sYLf+4-;w z6G*F7I9P>8_gm1~ZI-LG2EF~x40Ml?vuEQRRETkSn-WpMGrKSJqS^qt&&5C(zyVrb4L=R%rhai$i_fZySzm0L&(asE>Z(w81^Nv z-bCwVPV5PESj-l~qB#TQ2G}6zt;0w_cJr$G4zU2R(E)U`N*aoGKc?Vd%IxFJpahVU zO=E{C&tvjp<*w0BGSf02H^u%0CN{_4++?OQ#aS5>N>`g1d1yakO<{Tln{Z)ae11{< zLb=_WhLe_em^`jBQP%FWWaAezVk4oGDw8pzk!v0owx&x*NV`YZoNgQSoku7FV9Z1q? zmw^Jf4D~EH)FR9dYr~%kGchnBcGL$82HSuZ+g8f0o0+bt2)E%GG{Hfq`N~w-sTR8N zC;c(NWQrRia>uloVgd{H*0nm3K~oYn6L@E1JR$}ZgI8GH9M_K&VUrOU8Gnjdn&tH} zL~*LFA6MTKh1)7k<1$kK=kTQ5QXi>~7$5IQU^0`<@-!A}Srk1_Y4=1@Y+bdOwr{>p zxvj2W-Bc+$VSD0=4~!rEq_=kZk}Jj9DxqmjQF5LumkEtV+G<`0+sM_(%bpJYMf-Z) zjTl!*6w{_`h>t@HG(%q{2ZEg^fDLOnFdZq&6o3_v4^=jIGbK z%N_?!HqR`CKrj)pwnm=9>@dMVSS(~=fZ!qQ;NLK9kk9ORFdy57KPwm)LSv?46+)3% zg>2aXrlKiilon&C#Fnn8|4yxiBb}lJ8~2 zLVR_znaQTlVE&>PSj5bL33y`@b1qJKQ1Bcc@i5_j2iq8QFbNF-L@~25&^qz{Apbyk z$mGYxyU9FCB%8*5D@;{In<+>~bsK~>f%Rlo4O3y(Mes4trp2T*k|<7DO^LrqGR^%a zd%zS9MjWQdm|1KadMm2hQ45>3=g91LLS}?Uf0IGI8pK4xBY7G$svTwA%@?9*m3d$# zL?wAbIIJ-!*!7Ebh(?Iz?4DR0u_=U^62(oE@D~lJ9dT!SgE%~fh)Ympih-A2Vw3zr z1VAL(rYs>E5QeS@5@Dg7q}|JWwqvCuOeCfunp{lifo&3F1dOZqXzoo zo}*G}5Pi%xEm2cd*Q#hJMJHHk8%7w$Zxs%*pWY*q98DpZC8C#&MrquDAq<+y78gqR zW}>O~*Aj;EOd@LLwlnp1I4NT$%bpHn{6x{#FE@&(4vEcI5FA&V(}lS(8O(l=$0CD~ ze#uWt%@)nFK+}v04Bro41zV5z)xxMgWjYMrBEb_C+fzE*EWY*_ z_IB7>5;G1$P|!Uy&F<6Xo9uuCqVoqlsAvX^D(lBoBWAPc5Zja_OmZ;s5*>@&z=cp6 zw8;2y^?(5b1$@2it0zJkI$D-FxxxihvBv_2I~O%reR+qOw9HH-9EC$?31C`5OeAOh33KWr zDFsBENv9fdhU`xkTQ^%+SUHKk23Gr0TRYL7@UKZ#1DTDY+U1eNdJ~ADpF%S|VRl86 zQIn1t|I$M-(-{l3=O<;HsKj1i#*}4Jj%jTPn<~-}$ixP7L|JhM0L=EP0&q$4to+{brBXTwtgrZ!t;Nn2B$UY+L1e2UJ8{P<+5+ z&X34*5@P*`AsB3++NAp{gM>@s_i-Eeb@dwDrNeSldCc6%(3NbW1S#A%Nf%=z=kVCc z;A9%BbwI_GDNhB>k35lW9-Kd%GtTT;)*K@+^DpK8RHGU1BVQIEmdfH5Dxf`P?=lH! zDd;yxn*M^1y7f38)oRLz%%l!;sc_YdIQ}bp0K3D$N`TucFajgYGA}z70;Xx$Rw9}Z zk^~uTQu4wxOT}v;n+!l88K4acio^&vbDIOuQtaI}UaKI_x6}mV z0=+g~yOlQ(<~T+W$15Uf7EPEAi+aeMsB+Yq9^aq`h)A04&*%lp6-?U8J_3{(8i%9p zQVKh~N(@1ecaT6Ml=*C`d7hCI4H|G#IN;)cmIH^az`s~2MgXyBJgUE zpqdR*RGTvVDZ1A}ChnJLM+=xb!>L}WBo5-=bJ5)|_)P)_ z765wFq?TALYuYR&3Q`;gT}C%bA}Q-{#W7LUKvNm7;8Ds+l0s0MU^J;4h5C88xHiky z9VNmu<(`BP(m=h8jAN)Xd!n+tV#v-Be2V!HnB>JLRSEB2di2Sd{$LOn5!+c~);_b-&lpt7>PCswI zEU8^^u7Iy@J?APJB+_Z<+&>5)O1GicLsDo|O8z*rNXw1U_hYn0V0hhxA=XMF@E zxq)WSFsQO|=7}ED4KcBhRzDc-CQaL-hph{N@JPJ{aoI>DCAmr~mPm~k9CuUy!!#37 zV86ISA}usXya^!jqDj_4vM7ns44YbD+TdB^bc`9lNB$JjXjEzzQECKvgI;wo@(8f? zrF>0;>K1tq28rpegdIS$M4;$T;oy@(-G0)Bw#ZVA6|}giF{P(n9J1Lg34fjhu%<=v z$^cHbkrcjNijFzJy2l@sc{mq)kC2rzbJ<8Ov!BO1Z2fMQnF9`1vCx#jX0RukWq&u< zCs!^r`Ss`seZ(ca$M8!NIYUT!I&5MLP$e<;513*_r>!2MPcm-mKnaR`+#&i{!qx^; zKFQ)Vxrlffy2WWW8R%l^#~}B zP~)3?#5`^CMveX^Q{^O#uYDEy5l&@_(})FXu!qLf-}oETjJBA-FAY&pqG%@NckaRZdD*qFTyz#GT1a13hU!+??w$J+t3kPD{sh3peRUaTb}NgKvA5B zxQ6j0^eq(UdprpN3&$+zKs?4&V*b2VYl;DKIRZko1u+R(tIhk(_)f{s$&_g^(Alt7!HD34oyo>s zdrt_eLouq9F{##RI$zPIt3p9U4GB-g+rPFMTHpz96Z_7-`ce_CKaqD~|9bwS$0gVS z6$hLT7;w-JR!AmRag?k*A;u|eD7A!3ql5ne4PP@bf6hQ%a7tqlx z0ptO3he=*dj?!q#>daZuLAti$<{X>)5jzbE^is5XZ!Tnb3gup7JR(Rq{)$s|aVw5^=(&!j@#%x=Wp< z@(^Vl5>je76C@`UzTp|Nc5$#g6M}0h*TXg5igXC?w*_B1CE*a9PQ;-;*AXUJnZTS- zwVCWsaCM@jh;5RU-)Q`L##GQ|N-<|l3W9-8gkhGNKqy9CEfw9TE9#>dl}537m~<3x zJKVlJ$#l1{Y!2LDEi#e`BjVD5Z`M?k@>C_EUk;23n@ve;)J%+;mQ}G@vdtJJE^gwK zg=j-+y+<5LwZkn3oh&YCBQ}ftqAO z5SA?%N_c3(rwJPlV(15qmmHs3sT{4rL&A@?R@$8mhazbu6wYYg4to5J?*{WSIEi59 zEn1k63N!D;*eHbVf ziG~IHtP?_nX2QZcq!T`ggULq&W?K8OaD(wzMTJrVjqMJHY+f-@d@jq*8(e7&iB6== zOdc{*>ym6y{(!l?M~S4utlF50#4wI19@SjJiw?3aW_%k5EybOogmMSCGoeOoY43o9 z&;5{w#F-%;yVx;*2SBJxsu81HHOPEZnvI$tP*|@pla99bn@hy}D~5;^nxke2VDL5w zDO7FB2PF0E7vg}I+6Ag1UL^xN$B#+H6?i@JS>9Y)oi#&VnMx;wGa#|C&gmuwG!vk> z3WiGOX4ERov5Kc_9}x&{b`p`xB`IK_Ezu+9ivvLl#010y-_((kX0KZhGdE$6Q-o}a zjTCvuHGl<4+1D%S!z@RM?O9H^(qlvWy)nn6LJ5yK>uQ4PtTO5c#Qi4CQ7>E*sw0T5 z!|F)d3ZqQxu}92!{-B7wq?3@HGen67Q;v{{7i6VmT(XL~9<6j4lWaAEmJmHAdkjP{ zxWpfngz{4|IpTJFG&w^x*?u$BG+mg@M)~4hghWd!#KEtl(3g?`+aAEwRPQ4imT=BQ z`^V0M*=R{kwP5BktyDOI5KfAR7Hf4|yGbbPghvt}6~{ELNl#7j*&2P5v3a4~6fZ0{ zH&WyyunG;Qnv-S|)xao+J}c{RVwPQuS1O^+K8Z8%tNz%al$s|W4d>Mg-L!JLr7;c8 zASq@5cg%BZ*SALuMseLrvnpyX!}%r5e6v94k8;9in{7mIX=Cx_T+hp4@JD8zd!nhvZvZY37iNnUK?&~E4QJnx}0!xV&$vGt`sG~$iNk6qx z(^t1?gH0)sAd9m+(UCnNs>py}G{vcb20!*_2TCGVf(K)@9!_e7lR!B3P|+6grfP)d z(&9{0haKibca3JxelrWk&{=8EN-PXY+=dm3w-nf=U5=)zsN3uYd8HTrFOK?7CNKPR z!g8hbq{tzt#A&QnBBObdqeJ&vu(o-*qopu8Yg03kBC#x3t73tg6e)q3PQLHKi^Q?X zx-jH}jm4!X5Hf{Mk2$k~d}loO`JJP!W{+Dc6QE(tg7xF05b{gWF=1=;NZZ!*R(8FB zDhNJr95^ph#Z#0kOU!7G%E@4UAezPz(H!KBuo6s@NXN6P8J5yxlk%ZPWvPU)lo#$Z z#0ZmwXe69a_nOR66yXpmIiB`v%@2lU@)bwNSdX$0tf%7%IAJ{olMtp_c`l*x$?+q( zWVg^v+7D+D8={JF5hY_s$aq*r=wvoR#S(8hIuPl=akJr|CQF$LwKQdjYD<$dlJX*m zene9zDbARpxY@F_&5=5A07j4#$Vq6(l%qa01|VB;l5J*l(wwQ*Dp}u*eiQ6BJzGWb zcqGiAq7EDMra(dw)NhW#M^UCvSv;Pi%t~zsTfr~{K2)4357qI?MqAt| zH!tw#d2uPyM5HgERWPLvCxHP?BP$_Ju{nsi`apY=9Oq6OBbiN-7=b&##50Xalivh% zCYu`u9FsH)%<1OIK(jYWNy!(hF!SmL;^JF5!J;|nRP*dgB^cIw6XY^K(JGaypfGBw znPG#n3UgVrnO*C04cr0OKqD^KD02iXbKqaH`1<9}(Qe3Jk&`+H&8dQjH|m{;@zoO- zL@*J_;B?ZJWiDRWTs@gTfPxMxAm< z&}F=XwUS>m{Vg_nfKW_Xa%E%08%~7X#OdYW1g*mdCC>S85rpuz3HY-Fj#3TO+AOo8 zV~7b!71QL$wu%+dPq@rXuIKjn%BUH)N_z0>^r)(m78{nga(&d4`y~2zYWFR};{ua~ zQm2%tHgsEH5-}kZZQziQWRI$d1)kT#?`YZZu_M zm;3vqKL&p-R9ISTBPdfmTwQBvU@P3HW87G+L!hzIfD9S{+K|4u`&*ANC(Rja%=xW` zn2w-^1P?@RZayHImVFV8)aD*3tiV_%>>xu*i>pPS)ME%N;6GE^bVQ=Slnh#y@-;({ zcx4Xq4#bIXsHe%`usNhKPwTZV)CHEU8p{J~vRhD1`5rdVVxN!!{DIvbY$Hd8(j2Bh zo>uiD_j$wapn3qK1tx60y}>pPS>})+MQ~&vt;~2r+OK94i1L2eq_wsYDxeJj>k!^p zTp?u^d}JwM#A&&@CfYvrxC8Xt6Hvw(ZOqs`m~dl>LY|VCW|LFlWX%mQOO1JQpaHIv zV5X7P6Jg{#!)9_d^XKp+&z$a1$I|Xi>Lh4=E-}ip%Y-mtK%y`@n#d34Mdd`IJeFW3 zvkZw4#{-F^2_#LA^h&V@=ogr2skBXsCPZk|{|N^qq0r_VWkw|x)xoqBmYN;PG(gE` zYjj)es|AwY9#{citZgEuEG?&11QtTTa^~*Hi9yO^;|Y(ptZ6*)hTHi1=Ugv5l;J-v zrub_u+_`M%ZMPFTgh8P@T!p0!jTaWGCFHALfFR8D2I!)X!bXV%1lqG}`GP|dZ4!br zLd|Pg#vaEkai|Fl^AtzR5-3#WHBwsOw1TKvu$HKmQ?}M0Wj#smH8)l_W|RHN&d6ZG zCNL#2P~R-KzRVCob5bp5aTj9_(aL=2H@FjO0}(d<-j<7{(*e2dv2@6rFBTW(AXy#MTHsf37Im^P7ciA46{+ExA|x` z$_Yyt0FbF9mh|^fe<6hf(VmFRZrmf8gy~6v1l?N_{E?bexRq|asbZ=DFUNKj;>zd) zb;#E6`yg6QO#AEBQd|#sx3b^~G+||gA9#cb6GN6HSgYJ7nF|lm6ecnF;-GYiH_AO) zEn`$E&1;EG3TSdIMN1K9<0KCr`wR(;AP2%gqvI;Yhj|lfk|YV#lry|81hCI=seww4 zIXy=Wcc_+ZQD&l4a%wn)vf)=mRg@!$@sBu%9dl~!*=7!-Z!xDi=69+mlb>J{ryRrJ zrA283`gLhT$bs6tc^2k~!5A0Fa|CaJb`IAi6p`c117S^~FQtPlm-yVK!N_cLN*k&< zp00YtWU|5%x*I0r@iA|r4r}37DRH9|2}sVXc2}Gg-qsM%ODY%p7g=x zq7F_IlC`P+z8!xavI> zW(nx=vlrmv#^!!d9F;O8cqJO>uh8T>w9aLTMyD5s@KhgxR>D*q=qQz1V@P~gIjXJ@ z)YoKvE3=(Ie`{j6X}_UBK0%Xs0iOkXF_@9tCA9DCzr0`S5nzb4o&aMW0KgvU3M37a zA|;O(qgWg){gwk$&hEq%8g=%Pt^L2U?dC|y$h)D?KYfa?Jf!3xh-kpgh1X#>=MpQw~ zvA9&mhw5qu2p@K(BH%J53(2?c+sW?JtZSNgFmW*DjMQP9LmoMz#AZrNSvM|zJ;{UM zQk+{SU|rr(OHh(nO8~`@5oBRn(~0KFJZVQNfeu^>;3b6B_{S*x;^muyc40esg!}-L#XFsAB$%J<}tdU_#~qTc_|UQnj0Dp2g&rF9XyZODCf2 zuV8vAY8}P2)G~B3x6-+Es+lz?r3o-Cr3scI^Uz2uOQV89nk50g4E$#@>n)tgAr-v5 zTEOeUNN8lB#~>}HwNM%hIYB2i%KCr``FJyx(^Nm+75-(0KCQ9(s0l+lI3F{cN&_bx z{dG-)M0}+V*8vyZaImrl3AWJ~l#hKC5w@s(&k@2&DCaprtmK^Yh;m_{D9{4#QHif4 z=L`@t2KO^{0=-nEKRO^xlwehhh#glYQAIn7os(vm6t+!GOwL4zWpU=999$FB5g z=uaDJvfQ$VV4~I88Xd0Xm=73Hq!LJuHvvF)M9vLRiyR7ZcxuvF0iY%W$+{XDQNk+v z%GJ>&v@(lTwrig^5Y{P_X|s$84-c}8h`gG|61<@#eR!BbXJwP7kQUGxwM}gfunjA0 zEd%fwE){g@q!a}A4FsJdc^%k;Muq@D4Z?a{1<@qUsa=?Q)@Ds;Bx`mZ;Da5DRq_|! z2NZiu)lq?SJ>LTnEt+ya!a*~w!)FL!h6eTl_yk*VSeyw?ne0MSy&!l>$hTs1()af@ z`lXll1zH!usidl{_QMf~o1?9Gwk{iH{pwZqeB_QMb*d7sNW&`eHlB1e-e&WI7ImQ~ zV1p|2ByCSnpmxZ2!+d51?<`Ka1?hCLF#VFA;RIdx7et*A6H$+;HDS42_> z5Cq^|35rS@K<^X-nfV&(667&-8PH(}C`(5YP7aZmH47rOx(F-WMyzd*a1O%YZigVS zj7Wo^dRh%2&`qoEOH%L#lK^yW59gpc=;I)Up1tLx=M|j8Vk2@KDCv9Qe%e{Qb-1q3 zU@gz3WOv2r8!Mz6lCzsZiZz4;`ZWVJ7(nW08zH$|Wu*>I92q3cv;jO{u-S584xG7g zoKKccg6B9u>#aE98%)FTN3JaRF#s=L&1J>;0!RFmnw)rFQ|O(SSRay4IzVYXD5>w; zA$Jxv06|| zJlriPikpc|f=anLU%G)nDFwYFR0Wy{LQ?wCqBMsQH*2dwz$@)~a%bTP{?qk~X2MbN zp`WObSC-Q>(`U{d2#SMrBDkMuz)bY)$GQ7QaK2QqIq%rV(>m-qLdfy;+31eCr0Au{ z*2+4(;w@PkSWxZ2(D==?_)J=D*-ipsHvD8*4z`-W$ie&DjDsJw6fufTni{2Z!=!1z zfY`i)@q<*a;(T`>Vxu{{I1a|x9H}LqGmVj#*YldVM7m3>rDJBOu0OF}JnkTkw}TOB z2!eVDqbpj4SDC7OOTlgkRK+tMaHP4M0GQJz*E8Lb3xGMwEN=h@izpD{o=|}|hu9hc z>^|^X*sUlX5a6Cc*ob@Cl!T(^Q7Cr6?t&qA1ST(3H@Sv%tu#N~PpJE4IPEJBGx zj*3b~T8}aBCdf_9+D6K4_?NATC@rH2p)Y)H#%qEew68~T(vbl0ip6+r2U}aeK-NSD z*uJ6x2Eu>)^`nduDIH<+ZGsY9xu;HSYd~6SDcvnI@oDu^5Cx z|IOp#zxjA=x+sNz%!tat@dfNt+;YA1mvBamnuy<*x@h=SUD(M!Z_gtYiw0l;FWpm|uBJgQ&9q(#BqMU}bEQCCix5FmoH~*_1rhItPUXZS&?qaS z$`4G=6gMjg%@uz{YDITh! zroODkZ(xpTcu}gqk{}!hR9~~d-}v_P5FcK2m}&6}PmLUH9_Nz5xS#8BPk);*PaZ*U z0pvvx4Ld>wQK{Q$D^_qoklaYGniRQ09d3Rs>Anl*`Bbw;!3?xd%f*>P=bK9tjZ*0X z*pt-3O_134OuVdBxCOO>mULP<&E!iQ08%>z9dgX4XdRI3vNcLtxGxr=wpL@h#7H*F zx7Vtz*Pi-2gwbV747X*Im6@B(V&-JswZ()--Spi>OE_7uBt)~>- z@*RbzUx0UiM=1V;X$5;EgcQ;bA2ns` zC9F->A54HkA7K-9 z7s|Pn1j7e8A8M;*!wGC6lKW@r*&8AEU}L0{M&Us=stI4AnVc~9hzIt^j?{HJ*1V-` z74oK{P3+OBAe@N-l^|g@`-7FcL92K;e0g!V*7RcJAe4=?a=e(6(;oSf--nkd)I%2R zmR%MY+M^(IQ->!>$LueCw2Hw-{3n)qY6#>w;|jLPnWqmU zL2>%&6D#ZHJesv6@G!LBV@4kIE6Eyr9gTD9R3F*eDQgD-xS<)fAi#A(xCN>7`|!lH z;=GX#rCL`?NC|~%w5OjalGum=Moa^&A?|{7QVxOGk~$)jgLR%T?J`*@z2JJrA0-++ zQp3NAFdf0zgeE9B;Ws^x^dCmKvL)0!)b??)pco^sFfV`|f2#>6@}%CmQY-oNNgf^^ z1om>s{X%SQ6nl)CU3FsnBy=p0W515@GCplw*@*iw`8XZnffGFndBX^ix}4hJKaw?G z8W=|QJN?in$3ek5`93Bv5+7`BXIz@4@M4+^wjVG~3ftFAaI|7$N;=I8tHk1yWU@)s ztB~Y$bB~_IcEI@fXm1pKXk*#RItTsIYt{)s)aFA;IgrDr?-O>hV3_(bqKun;|1Vh3 z?sPaOmRTuhLh@-b0vsUn+Uua(JjHiLDEzG??N#I7E(HnwUf`Hen)*31B#8 z(Ew&7J5Py7c zY1Z+Ef4Y=EFn!2AP9B#K;6_EyZ7ZeiO`HoWCd9N~fr0ian*lDA!UH}4+r(E$v*{e^ z5o?W_>Ft~=qNJSdo5wLu%>Ss3!NmO40Yv|z0{}4Uf1M+v{BP^06?}?8zzR?_-I>Jo z1PD218a(IpGrfa#jixmzP`NK2arpjODk_ERvHb~zZcKptQ^N$<@umTBYWm9~x>QUm zAKJqDQ^H3O?XiJ6X~=1*7auS!?f`)-!4Lsh2tp?Q3IGNF$icN3Z3E`Nlye?a)SBaY zv2gGm^ku^#8+bK!n5iUDxcCz*AxRnu>qyfXP!BkRWVg%KOXaAup{^$Gm0sJ>Nc+Jg z50B(Rve6;B&1hYdV;5XQ2&yb?J1oaQ;kcYCCD!{B>#?PLtsB~o?v3)BB-*^06emI7 zWT((QKp6EB!#$?gMTPWW8gI&a0+&Wsih;yK%Ouh)wVEt$tmh1=o;0scOvp4`$fY`L zbs52_2`m-*=V*}77HvlR`LP3juqRd5w*x!3=?RDQJ!#4}8RBxOX3+8FMJc)7>;I0S z+iJp}gZe8c877+$V=b1zCO_5_wK;~hc2g*vNVsJSkYFJuMxvij)Wc=sl7<@FBKxgb zJMjMF8tq%N*0^S38)#il@A@GKrdDl@DXws%;hp!8iQ8DUqPYl#`CL%FYC?|V6#K3EM zLPxGQS1gZl^dHSdJgsQ5Rso%#6ve_+89G`MUQE3oQ#VC}j_`dcUEb48i?>FM9lqCC zNBF*74Ba@=xI@u!+K}|{&^_^AY?-#!T;YK2lN!iSxTDn+)(gKo0aGHK*^+#k^s!D; z#+;7EgVH4%OmoLlG88EV4mPc_K@XN7e*YMnc>z18Q3xH5G^J=7m6!+nJ?+znO=;UP6TgixGBWKHp;6Bc>;}pDdvfp#M1qI;2cRd!VQ*VY|ViD3`3T-?Db%T z^0`(iE{;g8POImnGM7Z)idk*a&;S(% zV5CMzeF1kN0m^KC;y}Yee@%4+{V;1(OMQ<5S{tMw_2=k%DUY9(XyQ1dm0a1}x6BmB z*!he^TxUkb+}lh@J{-C!sqvS(f`g=5zF1ff*Y1nTfNnK@P=b^G?v#gOlvZ>Bm|`Y9 zoUG}K_M9UzQ+eb7^*<;|bg%P=8!p2Y@*W(oAV+izX35%^yeX2-1-y}eYbOmQLOw0W@Hjoz6c_an7!3Kh!eNmH@sHPaLX8|7@G zG#YaAGwJS|ZH{8tWFHcKG2$@C)kjP~O6a+^m3BFj5$%-9m(*?%?&64F0`+(7+l#3epkBhn?w!2wmF2)l$V&=MnO$*$9i`mWA($!h z@GYFy3Z=cWvfY-+q&7$l8L*bh*Ccex`DJT(XtGS7IuY#>&5AuwwAQp@>bFUuW&Hi* z%^|`XYPNCd(U2+tISB2tz)0c~UNc?JEK5e3ZNz5syD4}{eg`;{_=>6KVA5RNCtftH zqtQIT3lp8va{@MfPe92>liQMO#Xif-#jVs5s2TTQHc#Nx5gM7c&E2%nU!x%t!0uL)tSeKsoP1pj$3`=l}}Fr2dc5|Z9U?d9U)e# zlI(rPhPM*N%g;~@#yvIFZ7ZFXbdp%#=p5%8HT|i_LGlY;n8ALkZ=x)=BNqzBCAi~y z;ZQAKsR8La;XzSf5hvn33flraf`0*=^@uf?QjZJkx785awAJ$KUlIVw zNyT)T3ogml;z*O_>se~y{BoCdtcIUc!L%`{<%dvt&7cFZZtWmxJs70InY}!QM$-L!Ud0Tj!Qj;Z z8t;pnUYS)l?TF3O&1vov2T01~H3#|VyuV_APr*S#_;S99Uqzz}tt#!rDOkR_I7&6X zI?_r^YXcvu4bgTF!7k3|z$nr+&{jry0{19jUuZ#$8#*4u?3sdC^`;dR6elP05&NSv zd0RWz`j7FBp6f0C@_bu449riZN76RpUS% zl~^sxNPUCP-1_vxp6X^~}1}nX9hNI4j)fIIAP*{+1&^R*;PO8o0o@%L`ZE4Pvl(Vy`&Met& zzqRM&Y8>Bay74MM*)-kYn z17_loxwWHWSw-OFyCWL@(#Xfi*YdFy+fKtGkv`e#ge>X_5ikry`L=*`RT&w+7o)7i zUreI%kTqW=cgLfQUuv>gUR!l0K^!A71qZHGq$((FYQ+2!cP-s6#R)lC_puxNC=;!( zM;c<<0&{9&C2m~e@L6=&hiQ;zD)iXTp~qgMc!GnA6G9hlMmpRex?B{WTQa;s)yKk; zz*|x&P^U!@phYP;VEi6KWKNj^YW3p%q@kYugl=d9^qOKvx)%6ZL(a^7Fo^x;K5KCL zCBgv5{X+HscP5!i$SOr~$~MgTiMD;X?j)LBn8xCiPDHElCv%e@F3{$FI-f?`4m(jZ zD=%r_F*#dik&QG(nQWWlix8s;_on?~d@oGsPXwZ$T9?X?jgTI6czKO~ z7HQ9Zqo39F9~Tj5_;33wA~rcYCSO&M*T_#HqYDl2=Ye*1`Yz6mk|iS9Sz9_u^YU&P(~zI;iZ+0`sLl&!|WQYBHC|PY7x)Hr;{P^W&|{-0UHor=||r+z`?Iy%c8#ieFIQS z+A-m7`8^(!;%BtLU?w549|g~py-L?ogT$UcsG~Yv=Ui?kHpCOsL_l(OpSK~w?{PQ` zyGMHlJ(o*fE&aOY2MzMeGU!!*?zuvKNGIgw=MO-)G_6rI#F@Q}eJqcKi1icNE&ob} zM@Gm4Mn9*!t$8?ySnK8W_p|s6&!wj`Y~V)*KZaH|(Cy-1$k9d*CI126fc*v06cI+5 z;6keHTRWYUC)Y`8f_Z$d;{IeRZ7FVWezI>L$DjX~E|xd#FRw|?9AN=YmMB6#&}pmX z*MngL3j6Yto03U#Z3>A*>WGcgrPkXH-AbHJnd&g>pKO0VO+bsjg!wCJqZ4!v>aU36 z#jX2b533n|54W5J&Ct6knetw~jm_E*QYK1E3;umAK!h$i({O6})`M!eCj`N(o#C++ zk5k3vmpYB+i!o1@K2_p$r{CO1|0ia^#Ce$s*Vgb%6ksl6*l3+*-P>@A)TZ*dnNY)f zL~M_bJZ6y)NKVC6U`QnoWm2E}sUe>SxW!{3QvFFQ=o6--2Z7&}XtOSR?QxN}b+iS! zbMGNOTt5IvYWN&P9X30Kj~+utTa9hcGPKQ-D8NKIE^)=B}G6we#4iK&+k zjNBg|s2&oMlOUmBq%GnwBeI7<_NS-c@GENv@QqtgbPeBm@O6VgV{&?J#;IxY$jRd+ z(p^LfTxxvLtktj6lM#zlQ+6O(iE4 zv^a4wuR=T~GpuW+7x{j-yO?z9PIC)*2b-4U?3EB2o z_?`QCH|_b>{P{gW^!4E7B!v97fnX|E)Z)-n&Z)GdM%975xn3jQ`hJsFpJ1bxW9ZAo zZ1~nven)pkOl(;?KRx(#`DpAh zhD0Nd`iuJgNC+hA7h?CNWQq}v)%dJD&MwI}9TV5;oIn!C6vm%*+RTp}jH+2bYL~ct zRjk#GqzD0tEpLzrdeI~LdFEz5u9nNOkDC1s)+BLI!dMLYjPfeF#iSb&UQH~@Ks2iS&s?F@asv+;Zj{VAP0?TlNzE8qT?ZHPT`xD z0ZDQJr64kECM8xKRzN0+G{B14n_&gKavVUF5SOo6Bh6^k#(%a>G$Be6SMv(=VFN$= zOjI6`pixTuL#rZYQeRuOL?6fBL?4l^i& zTS--}jhfT45WL`_vgy&PoI zWY^AijSv^-)eWlUqg@QA zXv|I94@M@Djn8v?StpQfNDhIMj@wwu>gik6){m$sozkcQc6Ik!6U(quk zr2--p?N2Mg8Ah=i`88b*<74ux_nhq#{mSo_(_MQdri=r(KQz>?4zz@xHXh+vR~`|! zP{dQSI9&2HQnW9x!%q1&%8cU|#Q3F%K0YB8e%Pxd-DxJ0AEH<$b@7ob|Y zWzyU*IVOqp{s@mBOJV%!K&m;HW^r}Zm`ln|S|PtA(#Y2R6$<&hOAi$Qj_Ccca{vybF?>R_Hdi@wD2G>=V;Mi&R%MHM?Z^{*)Ho+GGi*}T1_JzzSYf)FC#Oy--o!w z*Mp70wS;PlVTrUwNA4%H89Bw3ABrJAM#ZF%xcB0W1DqxO{flsR|5B~v0R8TJ`b$p6 z0Id~t08K%5g8kh{jveK9h@=O6GCobf8Wkl4z)BR)Ez?{WpbJ+jWpaQ*b1CKE0EH@_ zTR!I@`FSxZ_ge%HG~rvtvz~c91|W%3LvV6RQsUQyxr>C63oxe*Q31;% zz`?-^UQ7Xtp5UFOkD+z)et}wb^kkqNmhV@ng8{P_ zYlpKDnoK)g<0#F@k2#YGVk3>xLxh@u9XkXaB?WdtX-m#IZCsb3bfl0wOc!YcQ+8c( ztBozel#^IbY>WMEmSVL0o>U`)5DO`e__@4b3gAy}N|*qDUXZ|oXPRG2rCLs%ennA- z!%X5j^NeI21LcnYSCBsdC{sY28YXTd zZ0hJ9+WZ}P9Az5%HzghwPbF3<)maaQ8}|2ePD8W4?e6)1ID5C?xX$a|bMNj3xuEPFENg@HyA*dM_u6;W8)V_DIAY|lGbLWEBRs6C)+?_A3H&IYi=bNHL{OoxrXnmte-^-&VChXqV7-g@ z_r?k1R17Qlhiiv4U6#Lx3#jQrwC#GtXbQQQ;_+;irW|<*gGww=S45C>%5pxy2A6&1 zJVL0fi8hW7qJ$t&qkzzR-+@NroW!YFAR(4T$OmSDm=mG>qSD<+ZSMxW$P(OFVL94| z!SC8EByotxibSGrQ+h?Zwk8#TSRaoaU;j779h0!*P)#M6c&0bj3h;NTY8JZl=g^oX zm=_63mex~?wxd^h+_d~)g~$X}EMHB^G8Ib6UTl;7!QaUs)JgrDev*JbLY;QhMlR~! zQHxZou%JqOQ5*o7rf7Jf9816v`j*0q0{7Vmm{dBd zyYFXt>(%H)P-@3cs9~NC3wexj@wEMSmUqcUn?Cb2ki9D&2#(q=v_VY7O`)|}dl(DA zj}x4yu%|tU@FfLNQ)(&$J&2I(NZ89Vze5(trC~XjtE?V8tLEh8>7?E52CnkXK>l{G zJL@0wnM!CR7kmpqTY6N}Kj(i(@JynO@T2-sdqRLG5lJ#!Snryo>CzFDCD*=J(|$O~ zD{zps=|Z~@Fy0@C$?@x>PCT86NLUs3IS)$E-#MQ$kI0iRuxdIhcMGHU&W>&5`%~o= zG@=q`O|fZ;0Kj5RU^^N7uM-<>u+Vq;gkxj!J59vRRCS8NH_n_7RP;l&{N~*Gk~W|O zD^Jp$W$0t`6#QMjJjeXNXs|CIym3D-F$3hXECyUX@D?J1B5Ek zKd6*3`8>D{R4|94WQfmiS8x#LxZlVIX#l{RNg1Xyq3w%uJ#dh249hcpA7ZD%oGi*F ztiM6o-e9lbvO8ide2(OTV*e~8I|m6x>3 zStApSI=_j~g>`OQlcAQG_^3;PGeCrx?H`cm{IH~{>d&GQx+y9Jyrz>VlH`s~ze6I> zgS=0M<<8JbF5+L3MzA8dmAM`)CCr=(9cvHd9cz8sZ6`@`Z&Ht2V=r%clVnq6-@#q? zlWLX5XUxF=+$+Y^;d#s|)Q&d^b%~k73()B!0N`zMZ@%1a;WVJ4P69Ay;3g%F5^H_f zsQnRQnpc{lwxhRyxl6>6onCq*_Bk z6K2RT3hTz`nGb@Dh@UMAq=#FIjd>nOApP%KDD>(NSFSyPINDAM%uK|aH=2(hVA zvWc-HEQ6qDY>34z2|XhIt9bnt#xHiX{FrS7RO<*AK$Mz+3u&3%N8mSQRD!sSfk%ba zA*LcZ>M|1sC+dboBGVKo0KndebMLT=vBn+`aULT&aaUYgP7b_)?Roh{uID>ip1u%x?w%mEJ!9;2^|k^Fz960;J0U(maqz zuzn6AGxCDp^9HK4f$Q)D)I;4h)in}h5r-*{z?AdCko&dMa(Jo;@nN?Ra8?}lnABc+Y|(1DlE@TEnggz5bM)GV34pa ziXc<|JYY7F3iD^oe(tghvzPSkb?G`|-=bQV)|H!uSphBy^Yy6gq88Za8r<>hTH&Z> zIYqYA?2(TSVUKa;GWQr>CS4*sCIT)JpK$yJAd`ZhR9mKn^86eSAD2q_HGnqJQ@sr; zk=4e3o+9vI)kcHjReSObi}C)-c~viAFS-+xz&~MdhT}p;Dmbomejram9k)XFwn|Gd zC&IS)znXQ(?9?h65lAvP$`naxvRwBq5k>(NbO7lczTxl#X6R7_yc;?0Xc9*5LP3rt z#lLOha6ez-OffNxevQB)anMsRFDEQXs-#J$PUVip0{Q-`jHPH{{r9!$mU(e z9@rC&kyj6gL>C~<+r#)uuK5a<6f3>Y9Yn;1Fi^mylOP6)eAiMW!p{y8yB_cgSzey^9b8@V*zECvHcXk29ZBXDtT+iqIgp8b z_QZ4OqNH=WJC!<;eUVy4q!2_;k&9`}sSNo9CTZJs1mq+QtzOV}OcBl&42HYt#8B*p zkA=wAApX~D7u&(y^e^8isQH@o^TbS!mqIIC7f6uHDDV>!WVGj+8>*G6ZCB`{LWlj(bUD*t`?x_QtDy-h zkU1C%K4LS)`%H_!yVplddx}4PqEcJrvy}0b30$TE>0BbQt+Kr5ld)Fa`TL9<#Vl0O z@%`y4Q9Wz_FuyB_T)a0te=E&V<Hheb%(??EqUgf+RuE@CU?dG*G&gDQBgm~j*h zuO@Rbi!oEs&gVL8KUfxTX0C&yc|#0&;c|m`oBD;=~Os_xbu>xP$rkJYSFOOPeSSH7S~%)O4h zOUHOgkO<|F>IwHWvfneyvvmwsQTz%U>q|`B_WD^MmXTlu@U?ypN-}(5x;a&&5*}sHZ-;n>6}-w6S1Xu zuEoWHqkt-mW~PSe$WJXH=&}H~i{J|{;46Oz3=FS^>>W%j7xRk)S&UUg z+)B9zN^7Zu249qubyxAmQ_27S#;nc%ncwryu=En}*w5SkI4`=x-T8m*h@fCFUP(9_ z8}4r}>MeJ%c>Vm*BNy9hC@Xap0)_>|j>H87`($*+#^Dh*F+&IiWv$1T%JdFIHcK<* z1-95Jb1Z(~bfxSN%}+&{heVlu3ZBD?A^Ql8r~1zrAD_B(ey*YY6?%Nz{j`G)Ra~&0)kBVSaQf)aF-He z!Nj|M8_{|9G=RN>OLJaW>^_}j8-L_F)tx7qAtK0Cew89^#NXXX%`O{V4-~w1zA-2- z5!_AU6b|A{!=zJ>ylc4>c5LB7D0}0)lQMhiJnGJSFZva!AJ-?cf1J zi(=S!qCezrL?+S`@g`R%W7Z=Ak*rmY)QvY?;-8k3pJ^iANl?1M>`+jqNmk)r6e}q- zV9K%o#P0UeT@_gDJE~fQWL8!x_$o2zSNm@jeqPhXNB!FfeS3>)W1nl|b{CAQRl~SO z!IVCVZMvg{=jq&isdE@@*aPo(%$z7QwBnV9Q!M-;H>tEG~|E9ql zH`fljMkwae(R{lt3Ne+Z3x!vNU-pz)>Y!pJ980plLi{N>>R|0+u$+WQ4&Z1x+^Q+ihNWz{qt%ny(Zux{p#+!dNhS8NPfxe(*J8bdq`Ha_u8aN-)sAt%3T~o(U+Mr0 zU7x>TIZfE`fV4-cCFLPfPVFYbO${vBO``PYXX_X3HqTm;I!n^~bZKj7hGK}Vd0?=y zCOXz(fp(P;W~u|{BVJQyEpo~;1Vo;UWHs$4J^MtNZ^I!TZoN#XM5ok9h6(v$d2tga z5!u3W0p2_k@g#%K*OX15th zQ7a=3M2~NaG14EP=ro)_^ySJ@&johp9J@JzrWg3=O>w#jy0;3dL!2^-TLty+^NlRM zkZ6XEOs8qy)s2wC5=!0nREj7GgvB)`kH!?Q&#qNHsDiQ~fbK+{@WI;&bG0F-De~~{ z6Iq3&Fw72&K@+J)Vh2aVj*h5dZFaBP`I439#K>*W<#fX4!yV4rU7NdbN|P$~UIZP| zCI%$;F4;z+hg|Ia4vot^$VdG>+*zSC zwlz1ouu)^3e&HAiQM>|Kh7Z~MshwYzg;1LQ1Shs&he$}uJ|qQr--087*olE4CHX~m z=w}yo$Q8*+?`YXH6|(=Ho);`6mO|nxQ(>Jiabu5AN_2~@nr-KOBhX}QI+=Fh@pF}h zL8Z_%(d+|D*ojQiWyNJkJ`%s@dJ;fSS5dVa8koM3(4tZGHC48<&c^` z5?b*y+NE5T_Zx5EmfHVB3J90#EI*1LaZ z0@pG$k*c%pvei~{V&wIHnb)mBd8p%9*dCR2%ED0;)P;+3X%4a zHAEbnS3Nt`m;OayC1am+%R}9_b{Bm(h`3(24AB<;KyozGVy0)LQ-Ew z+3Hyj#>r}cpfYBS#F#M~*z!BJWCV1Unod?DMD&yVpevI8X&X=8%m=)SF8yu(->Lq3 zpu+|#$^1+pb=tv`6b__~2iI_l>K_bkg<7yl8;N76i#hSCZx;@e<#2N|xO{`ku1;#VZH-q7 zi>tkJuD&rjTNBU>*BX=MDw7kmeM-Tp2E+DPMk`*6Pr9*1L zZ-1l2+XXG4!8z#h>@2FtbSrTtJVXTOeVC1N7za!!O+S9tl2j1HeJWyuJ~2ZHWp1*7 z@4@EA^a#J&v7{i0ZeCowvtKHKWAKi@lm2X}q_Qq&RiW{TlK45ja7 zZIL4j7NK5fj_O4C+J5MCUYu*_!a}d$_{HP+TozC(HqcEwl3qlnyEWOStrETMI!r2_ zS6`)K^p;uU-RYG=b}|GR%d@g^h-}FwmddIZq*0%xmdxhP?o33sF-dae1^d(j@;WqI zU3>+d2_&+)Bsi&C^X0)BpV`r_vddwKpc*Sti~~SO^@q(&Tw6z;0dSR$U|A7C0Gw5j zh$^M=eh2NQSgrg!iRHBJSED@8?ur)Az-vFcHj>tP|b{oXUH>s6=N%(b=KCT)bg1mCB<_f#d7j7Y9B z_jK-55#d}Sylkl43j!H}leE&bba;#O3Yx`r)=u3lyv6G`32)9R4unO<0Kp6z6&w}n zNx@M!R|tq7bUaws?3!j-TUuZ6^g8mpgE8!qOTBf=Rv+w2FcdyQXlKQ&QHsg3$9I!b zn9LOdcjXojpX)*NF%O%rU)mTy=hL8>NK?#G z0a}0$ZRuQvXLdmD2hlZ?QhK27>b5i33bUg=18c>-qjwf~6hc zc_~~?M(}*}_&}tuZM*Cu%cO1J&fhB-OJ?)|>5&Vt)R_kgV^yMho03&Xx@GPXTS2O+ z1oy|bDVAW9l>JW{PyTy;h`e~elIvZN^_`+Sw^el2ZiW>|0GFKMk^~uUqX*GK(neOr ziZB3!WQ8Jad^QDRyrdzQTd2`KyRRX+9d3eAJ=iUoFAEyy82=f=EPag(+S$jWeyH@M_@f%XbIXK;l*7m%MsL9xeN> z*WQfuC!X&V;+UD6nZ)Z2#8618|j8^vjO%DR~Mo<1E|C^g)4xw{bSiD)7h2z7A2fpY2MOjvg&ID|^ zIw@O5@|j7J(S$e=Hq7S|(7&NBX_1W_Usc-V(SmAk(Gb5QZ_Wil5kGYZvGX9e9)47^ zF)9ilTZ5<5ENOdQ46JloGAnYh3J@JCuf&DP7`W_7?4R`{wmN&%_NHerUb-Mx%xC~u z$bm4|RS2Y5!)0bmUgOp7@!Z1RixCg_+SGaGW_&BCAFWXit=#Zf77fB9PK;4lzNV?H zHq_`!5jc=HjXNl0#{0GF>OnfuR$Ih<`L?!B)Wj>4bvW)+bCyEjHSz6YVPZhws=^o= zn-ac_=evflI<%&+CXt)5u*M+CO3t~rXQ>C29XKCWncR92FlF%}Srn9~EPD%(CmcIL zat5)LFUn+XGOO@UXoZ zkoD+TIO*v;grutF2N*_Tk02^4mWg2yA7Dc263%5CbpKhty{+OJUVv%>)(5^hlJ|}s zZeE1?gGs3DJ71Uk}cj&}1ctj~-FbfmAg@T*%0%+&#+jZr7ZYF>)v5)UVehvuxfrq3kL$3mGQb`(y>=AGKYxR=OJ5 z(xhb^fAP7fVwfdB#yQ+{y#|=m1!g4``MEot%w><)aXn{`1H~?~iIpgn6&@2jb>{nG znx$VUNGFWRYC-u1QzkBB)y%HXuKS0uEglie!beyp2nkpu;y%+T-0DoNuJGxkcF zft4WD5Y5fvft_$xHF)B@LTDj5Dgo~7F#`Qv50!QoJTe>=}10QkL|8mkbS%= zDW6u)i3|Dz_6exj;t{LH4J3U&XJ3sM?PXF*$T^2zYu9D(kaVmd52ne8hqN=a6tH2O zSpf32k0YtEnh&PdqLQVu{dG|)O5wA$N2}$e$(@%iCHcI?}R^~*GtEyT!b=Jm< zXVIL{r`jSD(O3r89LsT6OWYE`@NnUnpjcFvYtRSlkXkywyS1a>%P;n4v6 zT#5MJJBI#R5InB0UzUU_Vr-0$Y8rjGX3CUW(QBiXIcl8$H^U z1)3Z0G+;0L)^kvfT*x_701x6iH|W8>QO2wzq5O?v^m@!6OK+4plSl;&4zj0M#C!NC zDhOb>BE`sEZ_%ck%V?w6AwN;na1=bS1^2N2LeA*XyzTyg?$5>5(alb{tEe1f;y*T#;*0G{nJL!^AxM&`EWvi& zs-A%ydjvSUShAOR2#-fb+L8SrmLW!}z_qtjUePRnR^qBW5FGKrCPq1I+tZw`6_XR1 zupEWpZw0&v7RuA2ISDKNq~7H~8;+o44^oS;%F83*E1{GA`A+krnbt*syVJsoY+n;p z7KL0urD*$Re}lE(xQX+=10QcGg8z^|ycy0AJSt=7Rgx}@3P+@|;W-WBt>Cm_d}E}7 zngK*K@mwULVz%^#VB)s~B7TNW8hzS5eQDflV^<`MgDQ~|H-1j2m=lKHZZqXcb`ia2 zc7W$Lx(_yay|6wZIZeg<{g+oIsV<+VSVl*Pn4U?oSY11?5owrB(u^_arPxgXq+qFuN2JmF~{2jc7G)xu=!d^ zJa@nSJZgnZBDt7=RaPXJ@camcfVjnDa@}}m1a|<0l?&@mF9L1t5A)LK3}_3+qNLYi zO+qJ(x75)hD&0YN35iP#{{NK<@sIPv%5OknmwI*L?-HQ++x)KxL&eAxM*|XEa5bGO zF@Fs;f8C)+;eh2N+V@d$fRtBo*^g&iN*#hh?wExxWuD*oWLqN>8VOgW@#}n2_<>;J zTMVfuV$62D{KO)XWZR_=fNZ<9iYOtd_}#!{j(E$6qF+ONwDK36Vj5ZL$aG@ST_EGD zZJY^ASBCK zO#ICD%RlGWzvq_o{`Q&c2j zNpcZ2gvFC7Q_xS8Pc(%ndd`c@{7r|$1)h+2Ny%V!g|N|Bk}n=4ptH<0c}gws{4nT+K10GnbUp&k0Ge0wbCk z`!UvuT*^kYE}X9L^Otpm;K{2}5F#?c;t@N7D#cV3d{plqQIqHtLRvD9C_uFQ6%MgI zP4~8%7jsC6>x8Nip)2i-{gNtx#VcyFYm*`$ponU6yhM3B7){7QdZC!Z@ps~~X<7pT zwY*Td{r7pA($fF+Z`GB}LosP~;9hU%@7(H@^^|52c)~s$$M@Q=kMT&hblp7}qRGS5 zf5^`a%LoP$q@-jv!py@dwI`$CcT~QN0k@o*bJTc4caE0`X|X+IgFlz3SK`n;wkYRn zgzhxx$B7DK|GZnlh52MFTS41S$Fz^L50o0V?6x`32?A5HUG++EMS6s4`O~(~E36G> zCnlJul@Rqr6;m4R596)SSCy5QuGsK|23NvC_Hp7l-0P3=we_xzHTJmI_*BI+Qm}DH zOe}@LO;{O_q?E6-yTZa=j9pw>DC1EGa-FqI`5bhBGpO{>3j{%8@du}p=zzoLaWXq) z*EVJK|6E~k3Oy9g!q79@$G$#$uxQUl-pjEMl*$kZpIn`>$EyujLMTOG-^dhaXq3i6 zxXZw?*7lhR!VxyM#`0&*uW&f^3fuNy%YB0K29G7nB4S66)aNE(6hIlTI;QwVOB`w3 z+qz#jehSM88MdmMg&HcOt@R5mtj?{=)S_J|#IvlOU!ZMi+H;vXUHClmPG?G2X^JP+ zFh1vZc5OYZ_VOiedYqcso!IT**kxjgD4Sd#Qn@V4&+$t|v{1*Fo0J?_cKNV96sSO( zt=wsY!7M0n*dB>U6cavY(p@-i;gNu_*;{-kzYA>Fso)Yov)2~l^8@w@?1*n9uaWP9 zQQ$xr9O+i=wGNPXl2GG#jLc186Ay}kiEX39d?7>O3QcGxR1rf$hY|jvyas-Vo@4)M zikjr_{2MJb8Q~cY1df}+vIFe^Q?6o6Z|~@{u>bc4ZU0F=v4jCtC%ymr#~Xt$TYLEW z0d-9izcE+(Y4{vgn1EVx+$U?uO6=q-J}N+6^cPHcjav>v$%8HFH#S?nNmRs7@Mrk} z@T*^Aqofs&N;pRI(*zG#D)xSttxw4(B(+zW;0G_L5ox7r&mWZFvmr4PE>TQE3;^i% zSoYJlF-f@2o{~{UJ$Jlq3ycMbb+4#$WoFv4k?P11>%pq6(t;YC<_tlHTsfTh8E7P` z22R0#;VCRDWdTbAzA40I&`SP*(+WH(W_XRh7kR86Wsv<`FW@j_*IoH`+5*aj_C2vh z`&=WXelMYZF$0AX_vDK zL3<{6x%;#o0G?0{una!&-37};T>Si+G|P36g{`_uMLq09lBI?WG$C#!b)B|uL_xpQ z6&)k0!_A+F^w;TSdr%ZOBvg+#FT?loDfo#UiS+9g+euH+5#I4dHgJzEj9x?7Dc8Ff zohn3yr)*nc_Gs503EtE+e6|_JDvbiW3&h1ViaYa6FwwL((JtN?_hby+n6vL4>)QI7 zo-B(n4sTrYrpwpiEr}k2Kq&S&m88WZnn=pirH@YsauBYs0%-_P=P?y06F1iPr+KnO6f<*DG|FhMt?%B)_@ zGj~Josy7-ipyO%>n}%cB@11=YpXf(wj^Gx#+$wcD}c!a>Mt{XbKy(*fxJ;6zA3PJ5ekLSjlD;w&L&D3KXjZhk7R)hQ*XoV1w zJO#4JrDEWtovq<%s823ujoH+t;Uwcg79D5vmM&O%`YD zwMe!ghH@@QlhNJ`=Jt&UHOet%5Wa(8D=O<6yWSE6LO>FWMkJb2OwDFosgeuG#r9e( z1!3|RC_qkN%Hpbs(28z1YbHD(}Y zr~Mr;`%Vy2wHA9BCl=lbg1j=iPUUGnWyED#)Z%4?^oluICf*xDbUTmw_9myw8sY+MpV#zndfTZW=5 zjQmgi8fiJ5Tf@nJ|6VoyAM)>qYNRzpJfH3IsR2&*qww6M&K3TcUWFIU(t9+iXr@@B z<(GWMXHJDq@W*n#wR#f}EZhJDWQOVwvZtfKz*P^1bnH>)+do@YH)9P!+@IYd)A0nrI7HM2rrdVOTKMp7}qQ?)V0wq&9PkJMFcoAR6Gt z38a`Ciw3Sh1C_0k*^p$jZvq_b@BfVnBhDhBD6(Cj3D4Q98VAf0WUiF!wi}?C^Z1&* zPv5huD+?PQ#t#;K03+RT3X(1hAZ$lfHlo%#Vy}5*FbU2q+8gn-9gb4C*p25HQc3;T z4S*2|M!<_Vdw796JPL~cImZ8GL52owp6Fx7D^=x6!*+8PcU90KF&%zj3APNmwAYZzs)Ln7QI_jd^1*OIYD|;`~l_$7_^eG)#9O~7-vsMZ^ztCB& zKqE4@;wV9%qJ-Bfy8FWcAAzqv*|pA!l@?Vj6r^A z`#d*b&u)4O+MNcwxZpklqfZ^bmaz2Ah7{@Ul)TUn-i+i6fDY~0v$WaVF#;Q4lfa`& zZyI8fR4c(yp(Y6JfU|URd256fiIvu~CDJ`Z$T92y?;)ddmMmZfn$dUlT7E>FYtv;#WeG+XFF!N(QOi=8ft^!GTkiwtb#Y7$~!2tWM$7A1GeRU{>a}$^Ju07X6^IPCkUnsZoiZYs)@Cw_3Ih%J4N0i~M2w<%|Ia}{T+o=oV z79pd1w3hUbj9xfRBo3hC9LMT$9sa(z<}z2f5#Tm7)ewBkplIy`x&~&db@v_H2=9td z^dudnn?EnBvWr1a0ZI<**r)H@Iqwg2Yy12pTu3vZ9I1dgO=lo@BnVthd_C3?ztGCM zy55fL73`Kr;p=UC4Yl{+Dchfg{x58WpHtjJ;B)ULTcJ1|=o#ArJtd%r?7~b!S1<^F z4)m17R-Q_c2T=36A|8KU1Uf@yk<&k|TV!7xUt#;y&}IwYqNPn|?Oa3{Ra{gMV|>k? z)|vIW&V;-%p%+lYEoJpVabG4m?;*~~qyQ%YrMWaTFgkeHPj&Efg!o+dTpkm+Y3IKI zVdEy@;jp-%VCN{Z0j=&3n(l&5*Mv^zR3n-{9@Hjyn=*gHzwhA?Rm`^QCLk&SL~FeN z2O^tf)=OZcAO#o{P=KCvg%uPlz) zS0m?cv4%HoE7+beBFOQtJ7pfsKoafi@hPixs`s+kY7JRnjW!{Q4Pay>j*?gZ1x{o# z0K;?wO(?#GyF|Fy4o_qx@ByUb`7FJ|6@OrbgbkERz?M{bU;E+KYhTP+@L0O$b4! z>#=&;bsGzbXcPTlXK~ZKL7}N&xpIGANHoyQo?406s`E6DUMVtjaw`Sk$s&~*I6=r+ z$^K*Z7{#Pjd!`l8LYK=r-?@{EUJ4sfLsYoLdlGbLGKq&oz(Wu|j^Y-qsDUij&qWc z0H{E-FD1Ma#e(3cN>sJdL8KN&6Mm!sCS+L9m+vDJP%Cn=g(2N7hQvRW))D?&gVI-z zzGjc}#+>q!QlwiU68wlGau&jIfgIFm?M0x70E{D%fbIa;wo}1brn@-|p@VyqunJOp zaqdMHQ;5?{0B3(dj29$K=CSOm1PXwT@_XW@IB79o<#7if-${WMaiJ?9Cuh=J!8U#z zZxmm5F`=U`aVtE(hE#SNg3v5`yogU3lC`*Xyyzh=`g)A!-h&r=FPW7>97gaa-UdIa z4@#Mq?C8UCpz!QsDK@>%s5T7Dy(ugyO^tH$D*M-n0(+Y8APU^6L3-Du`#7*uNcrFt z#0j&!#SMHdzn4q<%!xQnduH&b0g<=414KX0j{`xtt=VIn5#dbYq>{^kV=L4Ok_Ky` zmyl%_GuEcxA+LhmoLbV;aOy&vxrFk=Y)8h0pM#QoMpV6`AlfXGq6AMRyFbqI;oqpT zM87A$X(gbTIm2wL>wTUyv4tg#({JL=;M(a6_HCvqgF-|`dGKDsFFen=(wF-{^dy~t z%Yk+K89w3`d8Mki>1D^LsCmW_qyUy25P)#ZBe2kgi?%FQ1mren9qJsu^L!F}3%;sOuQRo_Z& zLUAT2yekks%hmXe9qo0(!%#yh076X`Q)lPy*|L)E4Lkn9xpKi(xznG?fZsT^`tA2| zCDSmnJ;|x(XofAV1X6Lk_X}XBaIvXphSAeRqKi>zV;MO}n@%H>=Z??T01vVmD&V?} zw_zH_&>OfXPz(DiNLiBmGu~p4G-Ye&L}Z7?WnfW850#PFnB7ejg1U6v2657u9Z8>P@;MnlCQ+lAuC4&KX6R}-tZNc;wH~@?}dd{ikEn%)GRA{ zB3h_7?$lXTp7C%{5d^chVGn^L-bjYKH!D6?>3xso{A+9+~Px+>6)}=uJD4(?sx|7S$^nQuBS{APA(;5@cs%fyE+{rqx@J4q_(`WQ2Ly|;NY7slh2y6JsW&_a z@)Fs|PGFc6>7;o?ncWJlj4K4s1f{N&fT*oJ6KlKgI8W$IZ^{S9tK!A+b1Qvx1G$!I z;I*k7LIH4{)go@A7kQZqYUK{n8}j}7R~^{6K;Oepy=dnR7d^K1qAzZF67L5OrW=B{ z97vzXH;IY$=w3-salYqg67&LQr2TM@+dcjDx)YbdQxe(ogxN<(7FF%{gUUfAn!eX? z904wM*ClPhD1oe3BDQuUXe5{X9+w0!a?R<31m97P&1+sQSEZsPt^88wjVqm|-J3oe z2Mrk)QgPXUbc}sMQ?bO&{xfFBmbn!hkmJKGX+5z z8dW-mHel_Vm)AZZLi(cZTrY$Zvw?Hr(QaU03T$S)K$vq628saIFEm#Qi>Jj3LINF+ zDL7fENs(w-;aJ4-fQFEu>0Ds@0vmYSeqj`UMJ3MP3{Yr=M_$%doTEo@XdQQ_nO$7R zd9#s~3O*u1|AnAjho}V6dNm}-X!n3o8+PYYBq3Un)|qr*dDnMyo>UQN7v_nt{9 z@|HqVQmcmE+d>~ss}|P~<^g*PzQ2Pg%o~IDGXFW8pHgw@s|_vvn1eHnZyiJjy;hoI zT^Dn}CWVue^gyn`5gquszDmIdnNGMM+ozF*pi*iYDhpdpgBI|+VQkOURPWIH{FY*A zh(r4R`q6MT(Cq*|budCX!Nzx58rde;Fu(NLCHN~5pY^=H1+Y=|6B|Ud75G40z5t8^ z#i8Ds3^H%YIg9=bRfg-+Ioz0^R)Cf-3G$uJ?ORW9m<_0MlV3r7Y@}SM+gYx5D}eR&vO*gg z)gHmbf!gLJT+}<(gUH8kDayfe@b2(1*(nckkXg3kDx6Ur+=8BNAntC@A3tI{UWqL? zPkcd6ES%^!h;9-3Q}MzilHQ;0ZE`t9*eqX{D{mhv4(g(bSQl~sCILfm%@0qTRbH zFP(Ya9%7m3BpoO5T?*`rMBXkS4qJY;pT~zzy{1uC&mdvORfoa{!K?_Gl%BH5rrw#o zssf9=^!{MsI&0*~B5knV9Vi5ZSv#VlM9kO7H%1E9I)~V|h>rO9L22#tgS;8-zAFLb zB_ZuUJyPPyshxZeP`z-+l?190zGvc^JT}BrmA}-Wq5d3xDX^Yev*AhVA#~zYUQ`=) zUE~h;X_B9p`yK!>iJE9E3rC13XhHxNs!odOHd0JrKWx2_Nm_1v3J2x;IVI0YH$llg z-PG%M?FD4jA9#y+?k$o0pYmVRJ&2zydH}bF=CGX>Z|tY%sDiEsTO`s>9 z$QY(xtbSknq8jQsn1HOj?vWZ)#a;g~AR@u?*B=gwv^lfv$_Fgc$U zl+wUP_)D3#LV}^a*9J3(D!ij9iAh@t>51Oq-TVq5YtyQ`d^jGe`qlc z`g`Aa(S93ZM^0uJVEPoM`-i~9X+Bo7n?_|lA85!_bg#-m=BxgI6#yNQ+EqXV4~l!S z_QST9O3AW=_d{_d$zY$ZTduDA1iBA)wtHqxV9>vh>ijU7gym${zYy4Ia#SUxZ$a1G zyGnq#xL$q3z7$~+U=qY?^(hL?$x;C$py~@O1qU7&+U+p}?4Y9B$cZz40l`!Jn8#NY zW|2W6^g@%!xOSDTQ05xt0M=!;_>|jo)x%^O!1s~4fqKLy24oltw&!KhO2LI9%}kvQ1Wm3vWyw|SSFdS1X|wv>fMbBVZ1_kCI$ZhP=vfArf=KS zw_|!E>_6(Nz)q?W{Z9kCJ8oyc`RM3dhc#?O(cw|_@lN;$h%IUrz;2j16 zc5A0?16hNveK|96f#VO7o84FLZXE3{P`nT-AdkVA#KZ(IcGBCa`B)#+yWN{sRvSdB z?5>9~ctZfLC(%HdN9NR#fCv_nj)d1&c#re0_N?2u?P*3Hn~`6z;5vVUW1xD3r;>n; zj(A0RqNR|4VIy|y;1IAxdBSWnZB0rtY}g7aWHBEHXKQp}Cf(t|1Pm=6_X!Gjiskvp`h}$vsq;YN@+NHo<$&9-);! zw&5Za_>jloWfNXtkILsEdm)fhASEc~lo%B|!W~XlkJ@tz1vuDYbwIQxTGpyzVW3CC zuJ@yF{9+nZYX!XFqj^+Qy0-c3|KKdrgP_QTTZCbhcV8sLg}J^Utj6cdEZS$P+zDg{ zV0oEI-84KrLxq$N>0Y#l;`8=6B$RWKw^wResHaRmT+mIhs}TB*i3jT{AF2A@UsdYA<)k1 z!3Tl!?+fhuu>q0(w?bMW9w8FoI6n4l<%;85gj|ET5Kz=e|0( zVLLAanH_-rw|_rk8NwG&`z@VtXXpJ&lo@kv%RMR?f_5c^KKCciT7k@v6S_VDlor7wq|^r?7*--o+6u`$~G zF@|CT-1;+4;|U&n@ysFZa*Tc_7seP-I_kmq#1coC_Ag%DygEVo^z!t3h@}bTS9i{` zPrRzESioUs$t~}*J>88f*qpNMD{We_9TR%FKLy>Ri5tEp37#J2p3_K0&8x?nEOR)QY^f%p!0)3PzGcs+hWZc+giZ=ay{jIa*o@zy2t*ZT4Kq{r;N<34?ENfle# zo3?;+FmOzapKqquMi`Vvb&&p0pTg%+JCu$%QGut%ofEf`x4=_et2y_kzva%*k9rUe0`D_H~s&sc4Vr= z6O(&~iavjbiQjTXXlusI4(4n(_gUdS${VpyGNI%4@M&};^~kW`sntm9V)@dLFMaZA zD5A`cP<@hdPWBpkb3(cMhREqaFF`UDcPu$(RjwtW|fw2LWDu-2)qX5GN{A;WhiI+2O2gIl1PCMOk;Mm0};c1^F(6peZR|YJRPW@^`%Z4T-Kci ziEgBjBwJ|3{p##exAKie8g~~Ql5nPMz#-`pAPJ=xNIt~;us_XdeZaGCa{eF_^jSIfs7SnZkRSao@=v4Fuz5{q`yB(e51BE{Nw< zx4(i8z z`F@6`sCR<8wC+Yw|Lq>At3jk0p>r#a>Ti%JjqTak(R?ofPY68OTzP*FQG~#9h7pk( zhxMppyFlet8j3~4y|f+8Kn!=pfZW)!>SL7sK4k3&NE!@l?Fr-bTi+OhNf!c)T2%|0 z#LDp;8I9U0OzN=ev`KA??Jr&p4t45^I?u!zsK63c@ntqWnkNUk1Aw& z3mq?;5vKDcRQcqgprCkOZ#{B-*+V=~d4A64vo21|d)4s1GFDCrwUEkw5lwmn$954$ zz(5XNFvi8@84Yjv9_tFDWZ4DoFGuRj7-vSz+x9`iCDY=tC?-UhsAmGs+QUInX)o7# z!0Zd~brQ#~@G{wweQMC&Qo-Q>z?O?Grpg!BSq$7Bf^zG_GG+VE@>CjC4Ke;soxS=x z^~&}kIHYBA8{*iO`-J^<5S_)^S7*qFkKY#l71F%e|YOwkryvevD9S!fkbDeJ^*G zz=PedzHPt8o0G&4{uVpX&b?hbEifOh>j{VmkOYc!LGrnvP~r5hDq4NJ*dHmoD=Jg_ z+S>dv#BZ+9dvCwH-urEP7~ZdnXH$zP2w&U_UbZbV=)x z+*pPqlivAKZ$apwN!B-5vTyX3q>==G-ttZFEy7>22%se6*pQweu}%*~GTBv`sNGRz zk*cTIzB`VNdc2L85-XodDtw!=3lA&y%**~%sN7uOpw;lr)ghK!1V-*y+ThjSat{o# zdp@?kjjVM0iGarJR;js~w2&R1-ham5B526!dOaP=-Ep!`$AX4BSP=~pw9%@stZXo%5fVu&;kHtEtpQ2|`rN16#m-z6F%_Q_!=FnCzL)w& z5PTx{M_`9C300$bj;9GzI<^X}J9w-Cs!V>x?xr)iZ=(Ez-X%L&$AqZ+i<0bKQBFeouf1pUkb&~668y*c zSvL?{i@C`KEGy=Z!5|Mn@JIDJpeea#XZHvf_QFX#%XyZC2pP2iP&XW?3AKL-LvSFL z8-SI=3{JdckFG&%!>`(N(#L{p=p;m&rAk6Oi5mdNd^AJAJXE+ER_yT|_9X4CdR<{= zw+Ts30mb{uGO;$aH?Y4xPJ)0?%l8Itr|d$eJz+1p%p>JzVR?K;!-k6Xk;sN)*c(Vd!G_y1+q(=Grm7Mmm%Z$F$6)B@>MNsN0KPM> z$H?FRFa4)@5Zxcbdi~)X!F?OrAiJe^M-V;|1u-$4)8{tmrX}E~S3iBzt9t^FS5NLK zP2FNg(R`WFue@!a-HT#ewR>3OZ59&d|L_%F-gX>%7aKZv!zxdVzsA={ILHRN0k!{h zo%Yw%esaqbE8H@%ngcS|NNg6z$K#I<+z%YbS;T2Ve)#K>{UzcvqK5L_O3}80x&l3W z$?#}a#Q{ZwGR>#?;w4JU)@%Fitq6ZJsB2Xdi-1|-#sl`9mJGsO)|d#CT`$ZNI2G;W zdjm;1D8hd4)r_{Bd$VYYXpo+I3~(BA*N7p=?ks*kme~+oy+J28os}`hqqB0O@mToj z) zR4=Wr@o3P;#m3XFIFCkqP=@eKc*#o(&-3&ZnQh#TJyGIgAhzJmh<(v>521GAp^tmU zuY0PcK+ZdVPcA?gOlq@LV!*Bz`K{Zs=O^nPpIB8}tGh;*(SOk3pol8+GpNR+mE-Ov z-C%(V0KYtwD;8Y>Zky*U>&9oL=N4dm0{b(<%s2(Y4IG-&b*xoB^B^d>{rZ|^JJ;~k z3Rm3^pjGA8e!$c00(Dl>4!1=4jgIZ?xE)&Uq9<-Lnp;f9vRXJM zvyNB<(ur7&qT41%__7Zs@h0ZP$iMwiMiwIQ6lkG z;1!?Iz3!aAB3+lW_V}u8oA3N)@1+Z(f(2Q+o9vsvY+``kY28W}8n=Ge4iA*)g)ItX ziXMR)B!(lfy)4gF94{O#9Iw6!v28^qpq z>*FltW4tRFh{7ejzo8bPJdDjq#OnT0iGqD}VaP@ol-VMg1L`P_nm9#-b?mFktK_^a z{_dR8-WaD>uOcTRV(47g#@4W1UJ+XeUQa4`iqs9c*&#`Kxo%YP^mEj21h&k)`kW{2 z;frfo=m8DukKl;l*K~Q+uT4^jHLl_wvfXd70|UNFmEaQ75@Qu({wj@Jr&oZ>FJ&m0 z4q0gxCvEeDlEeQb#n@YlkV>A)Mx}MDV-y#$6nlele=!O)N4+YO4)`5}vG$d?FZE2y zK41gfBCR#gW5KtSG$r;#oO4;y0VEITj=UV7%2!>S^PBibUFuf6WQjym@1q2Gx)8pG zi#D+3v-Sq;`O|@&r^K{Ml~g{*q&?O1RrXK zs1R7H>{?nRit$v%g{Y8{0x1znBTtEcK)C(80&oKSLV5+4_u3T^$=`}dYzjlYWuwIE z+=)Eg9&|qIb9lSTGVf&>`6(Ny93wwnWy{cz>E2Ce#mJJZLNy85Pb49G1*QnhZ%e7( zv#|iAC4E%-8SP^3RB)|KWbk^KL+&0@G9&E7N%X#`yyGz2^WiRaf#ue!eZPTc@VxPU ztM=K6u8nr=;|)7eJ;$ecQ_;FDy%~Ce%9Dp|7r;)VWdvPlxA?P!?+MpV=mRpP+6mwiF73ll$TjMs*pyV=T5HRS87+9N!6%`i#^Avx{Y9cB{h>!wL-FzG5cwsl9^;S z6r1%UP!PZ)nut&kx2v;RA3_y4H+VzIx7?Kd(q8kF8=xC<-w9 z?3UMzZhFm|y)ba{)?QdMxhs}Wcm2<1vn;(%(2^TQ=&q6k1#c0$>wCL5`eE4Xq`4ur zdE73sdEaoG#|8$|cuIWA$(sH3gnREeNrc#r%LqPs)P)3~1(w_$de{jxVmewnO`wlG zB|by%BW!LZ2xil z-f^rcF@iiIhv!Eyn?^DmB86CY!vQZd>Igdlh|!pHvOd?OpKY&eg^yafgv#)`1UDeK zamB`TA{_7P26azRt;aQcHSRWv_#TtC7GYTcI|Xa;@wUEgq^dY$r6;XK5>u(t+rHRMv9q3~!8O zI>2t5XVLR%uUuj}fB2rma{rY78F!-;j_ZGkvhRf8WF>v10*2FO77z-R6`V-Ra&!6^ zq6j$X$dDU1m%lM02$(}O`nP)aQ1m*y=BZfJWLSzqoKn+Jx#GBbaCRz`d_N2@-auv$ z%?Z0*6qEktq+V!&FzZIizDcGAdC(0Xzh>WMZM-gfH#a4Oab9;;UORVT%S|VAPqds{ zLIIL{ehn5jewmgy!i{KG#lD&8-}tF(%?@_sPXm$7aFLUqj}>gNiIqwM?`?)?FUsns zEheK4`#5f|s(EfNUu$4Ic3cm@OY{MQ8QF&-lzPPN<>^hMH*so<(IZwLmnmWETfGpg z7h&`^f`%wcV!2miTl!tu%RII;L+ouJ<_xCn(GXucn<-@GGI0j+MJ;&h^KOT|#%L5f z9Kj-Iln;;rY&YojtigIcQZ|LO~_~A z0VHASLl$m8Hm=O`h#gPZZvOfH0HdQMSZDb6QU!)~QPxla-2^VgDz@qF2k zavBmcQYU2V_$N<96$9`;|SZ-QuPJ*i_I>J)PD2 zWC+2Ue{k=8A@Dc6uOpirkzDV~?UUEpTQCrB?TS1defo|0!4v7)VTmTj(^{7P*Zwu` z`ZiBrX=j2oe>GK-xr>w`EsVRRql}{H_5x>xGIT)G!wy&gijR&qRZY3$j1+uyGRE?C z7?Yn^K1Taw?P12gpL27^HjaDLF!^nze7}HJpY-`^oQPE@8RLqI&k2(7B_{M0>bKcc zx~F(Ks@Xz8^RJ(kIi29ukJ&E<_HBJ@=ls!zIQ35MdeY0v!5c6eucDKLynyIjY&)*{ zH>^=8QV-}0N+kJ`%EV=TH>vX*%f#+uFO7uACnom^+$@>gBn##y*LGub>#mY2y3pg{ z2OTIN)niir^~;D&NW7HlI<>!~HkQ>~!G7>klsao}o?2uc=W0kX(TwNaS~Px0<|$Quipkz?(3FY9sbsVo9yOr>F5FS157HYPIsRF_gILq7 z4K;C(cU5hU749T0kWX8AftBEkWj?#HJ|>!1{7Ioh71Y$VrXTMlG=jD(H>G?A=C7kQ zRkgZe92_se*POTnK z6ImF3Uq(-4*@(>K0h{?PP<-ZKJTMRc+lRQvPw*%1uuZ^m#;;T^^$>##dWVdxP<6uE(i8IC_ZIFU@-ZXndydo zM@3RdndI%`tDu;>aaH!J6F*}SlltAPtl@#(9j}T`f~FJlzatK=t&=r-E#;*$~qy2Bk9ACj3;o1G^lBo7BF`7K~)-S zBUs{xBlKpEJ=xhx1;NG$%B6%3WEc=}S*l+pGR&n44C%&T1t>_f`)B!9`~{#; z{=#VMk}WYQh&J{>y)Xc#CewC@DE1c2Blcz=E>$9Nw#@Ye<4eMLdR@J{#p5Og);2K; zLvP#XOVG<)*$%cr-bZJp;YK6%v))u;ET&J>{udp$pN&z_b^tnmIM9h; z+o1)TK{%0~na=!al=BM5zr7jR=OUGS+}^Nnl<}-4B?%E#lP$_9`KreVFn;&)F@*^^ zHw3TfEKi6IP41`mgg|1;vd68%^(Qg}lmUKC#O6gD`3Kn)JRS@|n<|B^bG)~s6jU-y zI^t`n2;KqCQ`QB{=Z5$wU5?tjLy+IjQS`&CXq=<0rKQTZQ$K9|0}TDFS+@hdpyK~u zdHsj0YTgW}uUpfjr_H z*va`Ik|zv)D8|61U`B&Z1m0h=AqUkI@8z=f0H2tE)Oi1kXXLd!M44;lm|qv<7I3t`g1( z!HAN4uUxek7LA!^L=-Bp-vqL08URkY zq~d9o1np_~4_>Si*qCStv#EQ$hB0bpsc@m>yn0kd)6*^xzJWj}eOopOe!VamKxnBL z2vR2i9QVQi$X`>SHUJ#I5#tpLy&izezHJka0?!q@E3)N7q?00ah3&yi z(3gzEIm!B7ig1BI=(-2D0chPx5KUbCEsZ`9K+ji&PPeb}RxJ{&1)YG|nDcsh_IPJa zE_k7Q*pH~FO3`w`zA>9gu3+j{+ zW|fbutJE5iA?)@X;#0EkkNf+21v-HcZwc@|Kl1L9HpP}6WAB&(2~gUHVa87|COp=- zdO$-bn>^04At2kv+V%sEj%Zs4>yot-3{uN{N##*OP)SIAR#2k?FrrFDjE!T>Ajx;$ znj`)w@U3SqhRYd^8fJZg&XHJ&;4d%v5OQ`!XYZ~q5vfd$AR6e1GmkBAh0XutJyT+o z97_BXD!YD?|6d#yv*)a%LbTx^5+1Tbwrgh4$`>o;$y1zls}EJ!>??9nH&eGS@HO6 zun109ZbG16T?vdUz@ACBu#UCFQOo4x3<%vK)k7CO{Vc=pZJb z(6yEFv7^e6!1jadd)H|aF^8b+)X`1&E@UcyHtTKStEz^)G59QXmicsB$aBfx!m#B*un$AQB>88+>U zXb`?c&SO3vw<87$-ZpW*M5%bK!2XH~_hc>U8g|y&yj+%Q)}sXFR*QWO_SM#o_3igGcjY2EfKok z0I-w|`4+dY_h00zyhv{HGTh@koHZKw^CwHp#R^1u{;DVhB~Xuo<(dj`fr!$zM==Ky zEk{J2EDQ}hh|TlCWuEbB5TDVTp##t;jw?rb38*gvL1Ll477nFIv&YZ)D8TA@Y6WTW z5g^W<3Ah`q&qHl$5q!&mGDrBKnX5d@V|6BO9nM>cONG3U?BOsBQ=ZLt^!^SZ{IH*-nr2 zE^wb%@7brlQ^Hi=q6Ab={D17dd3fAq)&DfK|2U>|$uO=kY+E!bL5o z>TgI!x;9}hg0ZcPI*J7IgdQhrCIP9H5%JpmYsXY(iXGKfcy!5X8({Imrl^Yh{0LUG zm7!%<(R9JlMJS@c644iy3oBFz3U5!?Kf-sna<^qpHo)gLS{;;3+!-dYL@Vx<%E9I` zP&TUV1&?58F=7%xOQ)Fh-JLLl*{K%6&1hUv?Cwy3o$}K;^p#g7KfWmf1b3)7;ffZO zv84p%tYa6v3T5M#9A^`9f?D;Qqo!v}%9kjB^E|}T47?St8=k2ig}{F*cEA6U7$1}; zxSU8gC;vLQIr(waT)Z}U6zlz0;wsfQs849Pw+*eXaxl#3IlYEWwDY%!wZc%#IX$Q4 zz*mziFmY8Y8U#ETq#&9ESj9*O3{)!SflIk1wIEehHz$T^*-f?Rc1ui-To$vgx`-bB^?CiYuC%E+} zGb+#O=@$N0sn3?cgyu(dA!QM|DL@3g5@ZrU76gz$0&vk~C%3e=;F%${oXj5_O-$*x zad{SzZw^08RfPX(hQM`%y=Gw$Wap7oOYQEg3L)ci?aevT!dy!Os+qFHv2n+svvwv` z7;bxDr48(PbuAyw*=k_3NT#EJeL-OFe%oWcFP$VJ+hRLnL7l$?x=*2*)np|Jo&3WNcx zH9yQ2>DKcf0{hpSF=m&GxZ2p>>M-Pfgs7hzrc@7P^aShL_RuSG0A zWrw>e#k52O;~ElYI9bU?uAVz#BTvMsbd(8}s2NRT6zA_1vUzD~IZ0fnRVNrp)^x7J z`!{L(Zqjkc#|oBq(TrlkZa4+;_^?=Grja@{HJ`lV$f_M|A)#7`ueR?DSbB2hvYdTR z*I@FAMgn7bx8&vEdnnR6IM?03&vedFGAm;Ybf#sOo1Br?r*B`>yr^Ro` z*01GILZqD{vo4QUEG8xqefhZu3ehh2^4Z3z^}82g>{&gcL}bi!v&oK|o4Hj~;k83% zgXWfF`?64v#_o6oPvLSQ8EI!@3q>LTnVL%$Dio)X-0P|tU^7p&FA;umU3~+B`=T+8 zzr(24Xz$PA3>?^&-*r<1a3=BP0@&RlBJKh6US< zFC~{aT;A+yu^!lq(Q4J%h2cbnD;rnP;qm7oUQR?S8V@8UY<;Z=T@DMS`R5aGi!E-)Z32uWV;f)8W!u?2(0+nip?p_ME&9Fw@jg0ijf4$a-5h;M z0;M)#55A<9>vmGc;ryWc5!ey+uAbmm@-hH-WrJ(KE>F2%c@fgUWqACZdkH64!DPTz zeO;D-6ZH-1k^s$31wXQ2NGs0Q>WT$s?qGv`1u|0B!93Gaa>Y6_C)|yM%-K0j2RHKW z8af*=CwJLXM$=3nl)U?~W`!LV2>sn1z||&9FSu=UkCHl3A$QHEo9}gX0JudFE0x9h zzvDX_Y$g!nKzO6f_x{}jsvi(hO8y?V2kL2;xqO0E9NnimjB!L2tIEUFU2vn?t`i!* zYGJo!o@f%GnXxI1Nr0zDXVEen;A4_L9YnN^U3Qxa^F9vvh*s<&Qz@}Z6?w>Hv`RWm z3aViuqx~R+Jdi5}!_! z$bJ~2D~SVu`KTadlYJDb8@6dK#$3Otw~>lXqpaSi9;}cg2qktYp)709lQ58cnBAcJ zE)<=hfr?ICwi*N{_(kcW*hBUs#wKAH;o6*?@9EQGYl^N&JR+9lPG&DHFzS@!q_eN-4J;M)!CdpZ%ir*DqT^Xg)2`hmqqCbG1`X3 z^GnMzJ>4kwt}L3-`$WWtbWYY^=K>>&w27_Ya|8WMhNiR1a+9u`$?OwH27EhHj6JMr zQc`FK6?@&% z<8Ra2<3`3mqRCKVv0KYy$|=Z>$%xV>Ua|*5N)DY0zhu za)QN`Gfw9xR98At?z-CnmAmz=S~;gn@Ue@ik5mp8D%$h)1DxPey5ml8G1W(ho!wR; zlw`WWj@G^SD|s0@XH#i`tf*bejZxXgdKa0picIQpbt^Qf4&#dWIRz6e)-B&(y9d%X zPy4dVKj6TaA9_MrT|-mOR<&7J zrv9=19+Tq(cG>}}b=@w${q)Fku;8{OR^G71_CuR^38tKr?iEetkjbsMRoQVGVO%9f zb(%XYu(-nRis;K||KLrkDx?Yy2vW--s4L$p1S%6AaM4_LIfDzy7=O;71f7trn?x}M zP(eV|Y$hAPE}<0`4`#R`Yp?1|A^1Gxq{Se#d=6S~Y=QYX==m`}#qx7@W0nR>PRsI% zDI-o`?*mQ?UsYl2!bcl-QvEhI!NWsY$`~r_EVVgW-lm4N zOEzt6fVB$1vNzleckO7>XpL)4Uyw$#OY}W{SX1O1_tx3q$E@tJOb0Lnm<2@%^o192 z1;h%Xu%ExXSg`s#CL&LOOvz(vedMK+uj&A%!Q?4j{b_dI(!lH72<@KMf~Ca1JY>h z5JK;SEDle=cvm*SchmNCzPTsTA{Y7wQx6=6cx*WjqN%daR$lnyKG}jJY+D2qSP^=f z!imlZe-F0wgaj5_FSKEW*K@w(J_Yqv8M`GVK+2N}Ib=co!AzpQX%w>DX6~cEYH}F_;0as;^yF;547!a+ z7eL`iH$94MqkFR=$#T3#;c9E(26O=>{#bsa8-6Yf^r^rUs&lzJ@F zpoh;W3SwhipF$3zFvPJHa>ZB~7!hkCde3EMk11a0LJn=?Gx!vB!gvmQZVX?6$Gc{2 z&6Ht&htrv9ZK>bnLijT0R(J6_?KmEuaAQa%k^7}l!%6=b_1_L0Tnjv8Brm;SYdE0` zwlqmRQV87YTGebp`IDB}oV5kL^k&qh5287w&}Q+}3s;{q;oGH1*oGEvrX=5jf$Lyn zatqp89wpI>gN;u_x70_d{$hnwl-W(QOrLBHm)S^cezId*_m(Fj*1{5^V&(^>mmJ?q ziKpcSk}mUWr}CK66>Ri_=(5)3NcLYO%;jtbhTxo$v$h@EtZK7$`C=2!byo@$Xd&EO z2M=hlLiH2N7+qB-n@9=LOP!kBm@lm7_k<+Wfk^h47b+g66yR4h1+j!`%8^Nk3XWmf zE-l@kr7DZp+i$ShN-8)^@cb7u*%kd2Tu72Auh5O?zu~6d3TuewyeZG!r249|0R@6L zK@KCF1aKr(77h`gl~X`*F>kkf%c6L_E63abE4Nlr0F5@ait1`;?}1IxREtfI^+J`O zc={$y1nJq@Gb!Mn9?RQIs@#2eXmmksn9Gn+W?(J4W1Gra64Rg~JA?iV0M^pMM{dIR z`*KTbg;mdsBsb*2zm!X}a-61gcrAAAC23X85q0Z!U`O|wZ`!T#ekAD2z;!OJ3zkP& zw79+v3r5z*Wl-+uV)#oKSdM#m{4bH+Ww%LTP$gwp2wWe^>lg0@F8RJuG>y8L2Sq0` z)sA>mcV8&)wh?)?hAK%rAYsXc5cV;@1eb8K0z3hZwh0(1lRBhESRJW-Ml%~DV!AE$ zt18h#?R>wbq;=ld_2koFMAn&;A*zy)l`*J|W*vtG-yc$(=Zj~2nNvf1Tbj18n;a$S zb+9|H+;R!Kj2Lp0pi|bvrN}MT+?2OGBZGEQ*yv11U7UTL@l>uHUHfqXs^>~`bZ~8! zCQawr6b*X4lTy)BxjKD(lmA;$>ig`7Oj?-|JD{5|*&kxZOt(Q`q+dVDmMaH9zgpZJ z)NPyY;?dO0?4b@VzQ z|IvRTH{n8)O{_cxW-lPD0M3)in0mQ=&L-3KS&>{pE4@kG9r7)x5EN{3u3IS=Fxc9n zjIF_{8FE_!3(_lYM=#CLrg77y!28X*cwg5|^8t5svCM%uqo!c(f57me*NEExE}nxQ zPOL6sHi9}6EMm5=1un?j49HP~sLri`L8{B4rVP|0NY)CCd2S92rok4_bKN);Y46Yn z9EF1Uy3|-se7}6F16kdq3i&7D^y}?TvWgQ@7K^3Wh3laDVVKP_znWj{f5$Tu^ zA(vIH-DNe8ZL-%dP)-vz>oDaa{1QZidvp1Pgn%)8sJGOXCv@t2N-ZCwJMknQK+dA@vueG3xq$)8Oh45!ch_{a zCLwTRqh)VeaawbTqz@dxw1N3 zQXTg-j~1$&)on|5dzlWgxCMNb7@@vOlc4G1SMgFpiFn!-HD5}11^mlL+`PITYuYA& z65OrOXymP~XtG3ESyYWBS3J32RaKlZP|yqfHbrJWLYhSc`zZJJ#Z@?EYsv$A(u-;A zPh^K(yD3URRv$?283EEQ+$pt84`a+Cf(6vMe~A6M4K>g`-MS@mL!xYEqP#Lup45Me z?2q|tYE+9*(Biuyjd+myz#R0MqF;B=<1CZ-`QRpM6-1RKBX6_u*~S3RJFxaG>u+j! zni_g~vs+0R7r{!-H04q93`!ji0(*7Fm%WfnX|HkvZWa`kZwv~0`p|jMP^=k`YVbj= zgI+305T@gBk1r?(P`9zOn{-m2>80ZNV7UrDz&BD;bu+8GYkk=^1aF>Aa?k1^MARRi zvS}Ni>~H|iv9(cHpO6)l=iI*v)nzWIJ(5+}6Re|~TzybBcXv;)VlW`v;J>+x93e+o z5ojd46g|LjKlBrEjD>b92jMI8c3W$&WEF}uZvs>{g-}4Yt2)I;De{GMjOF**w!X+? zY>UG0l3oIf^1jr2>@CCf|kz;BRbIPrZ9)m(AQUd*kluk4^-(kQ;p}`0Usk~TFut3SWuR$V02cc zytJ)yAz^bE62gZ=|1{>htV6W&4@uuk13@E!pnT+ZbY;m;ZC%C|J!yM52D!q>!**8K zLlw4YWrgi`*~A_!fYTX2Hu6+$+7uPa;6CN$ww^z=1kVKQuXsvduziI-4Sii(VS9M4 z56GRIR<_E=h^n6atW1&Zk~6JbN)dpGGn8P78!StDx7#L06}5TmjX6ldryDUKfcjlb zZ0^>)nL;dg!nCk%7k!u7q^%5xa{0K;ELVASvZ@yDYMAO_$`eYc_$2~Egn6|suRP!T zzhidz#e+jFWL&Sk{*AxXn^TUR>mOc7a4}c*sjUhA^FK@e^Zx{Ys6mV1v-cJM>ACQq z^2L98>fnFs4gaZ-Na#oP6I!W%^XifCfBk*&pLov6uX5zCHYfhy|NXxm`2Wui^d%zE z*oR*#k5t+vc9}(nEjq|;mcw>TpN-!I&ZKsBf}wvJvd@xD=9+_{_O_!ex;U}5-fZ2l{(FVsZYHgi)Gqr9fow;l zyNgEXkcR5sT(Ar1$}U=CJ$BT8S8^%QH!S`kvZd*~IAim8Nu`TVY8lZTkQ{HM;4R&aMq zyG^P9kXKN<8Gh3Yp5ap-W^d>1V%EVwLT2JIwj_oYE3Hl2SZ;gmuU5Uy{b=4SMS4bQ6!}|TB z{Q}ElcKrb14foLcF0f&U^S`a5V7Y?L>fE-*&apZ3r|=5)D*Kn&!dsj*HnrGw=)4OJ zWHYua!xb5}(xQ80l-0TTzNq!5?2;C{t;yb(8MV;qaIncF@kN__m4&Vz9*ii%#9tUs zwA6s@U{~(ZIv2B#BrzKb9B}WyBt`RkHoLgle%I{XCEaWb*u@-wzawq6$qjC4Q_bR& zwT)^dZ;#mB5I`KW#AW0#<6#%Y@DNDg z7>8Lu%vB)v-9G0qRHL6oM}O(FF1E4X7E&=QL~KRD{ua6125^>qQzy4SRW)MOn7+J4 zs>6vbu?yIX$FRi; zN}K1RW=c_Wwk1{b5DyB2bf$g1|Ou8@` z**_T(AFi=8SnXos)SDAP>s&WROQaGBZ^Mn=wo7*>5~?QJKkPa7YgK_`3_KmU%D!eN z%_|92@g_TE&|3DRvRq2TT@znRoI2Mz9`6=~jyJ9Xz$}`DFm-~nQoc}zI?*qygvNn{}OEu<8RgOUB9twa!?h>tEpZ9H1arlT9C%fP5c@dJl&B=H%)TOPv|uQfR3& zy`>TyKWO96O19aG^>2Ug=iYh*u81~qX6HXz(vyE`vI!2ciHZO{Qyh5EMf)w@KBRw71#Ooz|${3w(Mw zqmX-;i{w-#Qj6y8?ipca?)cr+zUIk7B2e1TDN)>S_A@b3m zLjkQe$>CCqEv&bpq=3mXKeyDkKJ^qkR79p>hfH_b>Wy}#&EdFh8M)+gI6);UcoAN9 z0l2hGxKyy&Pw#tbljeLMn48i9UlEsdSTIpD?k5&^z%-|sgkI3pLg6%HWe~dFUHcn) z0H-O=YIYf&;m~My15fk16b}~XjMqc#*CO>?ydtY9K`3W7Y2g#BKCl{(Noq#r16E(* zZARqp)0P+xNquG1eq5uHSbVW1&O=v;h#2og@B34g36$BJ*?P|f4##?yu~TacwxwVx z{0uG-`q}BDc>q>`r}2Ft0G`%^ryViM)25H{w7~zN&g0LL|BiqXV0jTK2wp3otj53k z?3Wm%2c+pN>c@??h7vip9$Q5*=Gb|JPVtlcH4j<54y&cTL9?DJOT?Crz+}2;sblC# z$mSbDl$^l9x{(EW3%!CtK#uZap=fZLG#$N#Z z*d+=q+N}NT*7TV3-RHW4-FgeV^(R#L$%36&3nr|h)HZbL1bv6>*R+|8c^2~c@!X$Iuj`su@5)*{L(7EHt8Zan%NHtt8F!T-dm z-w7Zc4={bUU~|ORAzveWz25Wn!^iOTZ8?2unhtL=+a0>ey)>^*R{ z*eZtM=drc7S-GghtBHd(XX?D+LKy;KT_JNza3n_K%xLthy!Xayo*rtAaJX74- z1BqFzc09m2VQ6qPY(B43ziEp1uLPSHGiV>dKV*|LWs?lvP>(IfqR+D4f7S~*t9&fl zgJEWx2uH-C)|O_+dg?m4`B=x~9H_Jhktps=F^eg>LV;4sAPilDJjF0nRm;s%HMST7 zBnlxS%^F)WOaYfw9BH!@9%Ezuw>k7*Fa`fD(uq;ds~aHrGE5slxeGvfsD${=9s?(b zhk-lp=tStgUwAi#5AjhgsW!65S>jzohXEZnQ_3MUgN5S4$w7+UGbAsH2(SgvG?AJIzG_jE_ zKRyV8Y#W6P_6uR*DFVIOyq~}(-xjjNf8)ktJd0ps^#`mD`|Gy_^N=P?%W&jU+QYZa zdM$qJ6SHzVJ4C)oO3V(bWWdLWd^0`v9WFb&x6erZLhSo4l;`Do`)R=@=9&p!zY_eV zeJR7ng?82>cAe2%tl;0jhiBU3HsApeXey>=*c~-0Zk~t{&0KC)iRmo`1!p@H{18$H zD5w$qiLQ}bA&UJL*8WJ3{t-qakC@})EFQ5JnC|j~h$3|H-7seeu>e)~u(oq#UD9qAKi-uuVNn_v>gZy#PCy29Os&N`6&dy^)r%zFwl|LNe0s5!> zxsPX;1_*r@2z|h2E6M`V&)nN>#v|^)BbJqTM40%81iMIO$Gswz zT{}!uSZAuVSs86sdmkl~adx@is}pR0PnR<8TXV#;ee6_A8b;DmmmJ}-ZJx*0w=^Fa z-(94!(5Euq4=oFKDn7DP5AkcoojO^RdS8v~Z-OJSaFN6m7ILJ`9i1Vylq5(8>{w+; zBqHjO%I2TfB zo3ej&3DlF5bBFCHXgP7@$Qb&I6PXesKvfw2%Mg>F*AvqIX8%Y-<5=*AlT8@?!`w&F zOdD&srL!s0&TSGHJNfxBmYC?PmT8cn341q^To(jn@My2>7;cGR7T8sax$*wS#Wb)` zq`if3G@u(+Wl%@Spq?GF@3NpaZ%|jja^K79HWut71(zG`#i;U3PL58F`c?I`vhGp- zM^V8gNBNTENY8@>9+(5Ai*_|hVVUgvPQaGMHSi=i2}W8yYAx+`TH3}T))GS4E;i}k zT{f!#m5gKTzm&0OU7Te3LDCjU4|Q6_7*l6an0kNF)RQAi`X*mrT#| zkg{)ab4s1PM_MfAY1NGLK*%jUnsB^=aW!(BM|$V6UhP|(_AOzZUZs=le{CN(4ixO~ zj5jXiCV*h$^!#^-{B4~>o$V=#*dz%x_Opm_%;qKRUO>q5X}7_Lq~kjT-yd(B4Q7T9Mt=SyOh{ z(>}uug8D~N)Tg4hWk?Bg>Beazps6En>8h+}j`2#--?=WcI@aU3K!l!OH+_+hb8G6rMk^HmW$-tW_~uVJ59*P-_b!pN5)Ap7)1_UW#Y@Hl16 zHq9v6rir7rNl?MpoZ$EAxL5&0&7k#7u2A=J{PMX*d$u61ru>ulUgxn@ArYIFwUhLL z{d@udMyzACPm$_qGd2-g(wKB=xr;>qv;*NTjjfN%o{)=OKhf{g@vx(~ol#s?JImU0 zz%pMe2v5W!SeM_Wy`xv8Je{vXJa%a(yEJ(uPj~Du;#zJiBCepE_S@vr^tLfsI`n}r zs`LAFLX0;O7_tv3>$~AKsYbiMV5@8U*`~AYJb(p)qx?0qnBz+NmN+^$#gKW|q5)MFqXr4D9-NXFiu;`iz# zzo^BpFZ+9DZ_{*{B;!HY)xqAXQo<=MHGBimy4< zZxXj4yt&W%*(Y!1-@wYJMeHx6q<{fibgNa(BWQ(NbS1HmKhDUk=$1OUPTD(;zkT(# z_d!<0K9wYkvMB_^picAqbc%*dV7TZ#SK3L9OinQ-FywZO0eZwcB|vpd;1yy0ssPsc^P*Xe*)9}_O)c`_&i`<~PNUe&8u61V1}slU&LSF50u_0IQ_wyLUVS@Ep>;OA7nWK>9X+TM(t zrFa$JTN-Q!pX3Zr6Cp;47CNTH9fLNa#f)9es6 z@RDZG;bXk7Xj0_|*Oa_T@nw{Al&zlb%G9JCf#!Zo+I6M+D#P|AzfoV13yv>tR3%5f zQ&zB8n$NIV2)F1pc;G=MMMH1QW+5Isf0o~@GkpE+6&J>4v9NHn#xBaH4r{m0!~wh6 zuC1X#(Rm)*IV)niqn(v%=Uso=n`Us+uG{dl{WhKXs;u*bBqn}z=`NKf^(o18Mu_IG z=650KL_OZ`4(@uQHg+6Vs-nzUuTDDC$#pENh~{IdIbVfzSd_LXQ%VxX8dNDs7){OX z&BL-Jd`iZ2cFaD~M{&F?2*odAMVCaV>;7FYdP2>)9X%}K8)HoKGhEwB6`v1h`B0k^ z?5uF7Ud8vkHH~EnW9$jx*!Tv&Rf}WfcQGc=!nOUGwXKDjvbImg*RZhfZW2DNwYq~A zr99^BNZ#$$?d%mdkCb@doLBNb0Da`~x!V&~tWgHCb7jh`i? zFcy>YyR+m~oleDM1|?{sjqrofZihe(uVsfqw<`^IW5_xBV!u~%=L$Qt^wr(Y4I8kq zS9CnStlDjp$ienf$Ez5#Pr+CW`!jmjfa(xrWZkeXa%0C;;#h_sby9>xMONOc3xtls z!taSRuhVAchb-InFeoD38L@Xigmf!vV3#p^fZ-HV8-e#(u81rQh=)g7BpZ%iGAuxAh8e#cLrksYzPZM1 zeNDQ>PDOXEW5h#yDtN`K3VxJnb~DdlceUHyHl@wn$N(x}V&F~|qDiL9C1f};a9P%# zl8n>HU+Dcac4_0IOp3KLC7|)8_&%=r^>Rgm34y3)Aew-Phxo+G7V>zTyqCk%XX+0;Dg!Dn$RqK2hIOuy0eJ^Y3Mdw%Ry9adxIH%*Zwa;k=(s)M*S(AET@TcEmi}jy>+k^BiVf=xE2; zI2`S*cAC@F#z4qwx>)1;(a~26ILmZBI)5Ve@vT-Yc{T?~v-bF0%1x1`9AKKV<7jXd zdXw4u{rfCV$F*kMvli{zewS7D+6kj{xlU+&4s${>(p5E#*OZLfO(wR#%>6pHxnO@) z8f11wV5kqX9n9KsHyB$#u&HLf&f~l5D3aGVi-fldjb_f}a+AXrV!9dHn^)>~S z8bH9iMOMx94xSD;M(kVyt)x6B#&d>TY!^&Kl-mbT>^cne&Vp?f(3mX?-BC~z71SgU zGwr;Q!3e8xqV_mv+jl6}#^jV9wSz-xJJ zLK+@Fgs2ULLCpPdyT6N?*oVng7!9;{SWOFxe$IZKWh6N*9b-WkDlv~jB%wbt_53LTXbfVYWnFqlv0fZ=0g%FG{P#hX80JJY!B7h*ASyM}U z0|hS$EIVaC=_8WZ@u>LKrYY5d2*xQp>`8~T1d?ltf#f`=Uug=Q^+~#CcYsFc zBUpXGu0^sRH~CqYjMr)zv2l8BL7tmP1%jQB(xX$MN<#xKZ#(GH_(SxxPp?_ zGHcsl%@v~}OO=bA=QHyub)FZaN)qFD9a2f1KVmfOa-{f8!P*NwiY^&7(om?}b}v7d zwmP64_{>EaOB8Gkqq1E)cx{PYC;SA_w5r3( zkQfawMZ;HMyDKAh-g>lqehtA;=OaBV_uE~V?ydFqP{F<$;4+|`m8_XoJh$DZWqEA! zI88Ce?Z`mMOHxQ13$)DNd6b$cx9!*~Y;K?(4mLl}I?Hx32k%JGmz;)I2GY`s*sQB8 zru5rQ1&h_&hx3R$4wuCTs+n)HRl@@3KMmN8f#>>}yf{?tBEU;=DN)$TSIpg6Xh(ST zEsSns6_Oq$O|?4|b04WPyOwuGBKBJ;{DK%TqH0Lde-8)3p5$Z47wi`WC}5AcL`Iv? z$PK-bG?4=vucIr-Or#r#zL0_FgC`HmtBBt(RVh$22?!mHkC`bOK`Wb-x9U`3l)7)Ilf2KuoqhtKLF5&Nnf~^^Wj$DQl{6dio?9&%px<%)q>CPekm4jHJVxc;oubn*MHSN;=El&WEafKhIpjpRL3nU5Worpu5q#a!uLqH#OyZN{d=H?Kb#Sd>lwPe3z72w5PhqV4Qs z%ICg)PfEIPLYZ`geG=1LwnEATh4=2nkoOu`0aB%4g%OTJdovax^aNugJ#-0|vDGoA zCrjo>bI5jo#J*kNeLjtk=9_fRri2kDrA9YC>ZjUU?37ZkEgc^X+*Tsauv2E)>+X9W zGhj!wdCq&f)8I<3A{HH7hKPd%pL0d%FDL~jk=}#ZlSZ(@0a9+LJHnYNPWB#|s)we_ zBeqVKx+cc{D!D9L>I+!v4vgvV1^bGJrWWSs3A0nS^I`aMsQ|le=-kP2jGa2!cxeAO6hSsr9c>RNZCgT1_6EK5pZ4?C7s$ zxzp{@R**R|g!m4nM#g7rN8@q~%KyuI-R}&0-8LZibwJcbkmAeG>l&tN)gLyY)Ed10ww+Qrh^@ zVwN$MuqAp1~mSmH`w5+}@8trPT+k>ue8A zndT4)fwa14UUAqP0j-QPD2h3==hA`2n&uo{K=YPJKC8; znjw)Ld-$3Y?-zl1%5?_u8Bh7YleOJ0rNKig| zk+XX{xB1w?YEH%`vj@?^$$E_n<3EC5DDUT6cN(W-aK`~_*(Lb`fBd@h$0=+;F=f49 z270m(sKS1*tIMhjN?E^zLp~fFCQ2U+xs_nf4vXz;wHB-Jv2vkO)+%0M(*vYm^qOpr z*;#3n8B7b6+f#_V3Xvg#?=D=4&%UjtwuA`^e-ax0uggL3gMe9Yi|cv0B4og?Kn17R zafFn&c7^PIj&sE!+Q1%cUFM3c6YTermGiT><6$;&-(!z(dMoV`nV_si`OdX9;LSWe2nXx!wf{*`U>PD&qxe8WAs-eW zYNjGM^7|o7K&rj5uo;Vbrwk??(6#vl($4blE`Fh9y?sB>L*QqKi zY&ObX37hZT!^h6Fn%=_Q`?~DyK7Q5)*jnF@Y(4H+Sf@W0rpbR*ACh+)EVtZ;kokyq zo$Aw{kLWQRQJ;%lT}5ZylF_`bv+YK)6|S(dxI{LK=b~I`)tqj$OG6E|*y*K6N@>Lr z+^vLp7i5DE}8~-WaiKc7imQa1xW>|4`Nq+C`WY`wPc9;~>QCE-vDc`{j>K>?o!Q-x;t@2#*MX z&$;XMf}by57BLiTfDL%YGwej08-&I$5Gewz`JKa>m%x09b}qWp%m>$D^yNLNd(;b< zc{KrJsgU?Y+BhjF<+-CX?TQyf5(hw+@(_w*;+yG`s)p*Q&jipG{k@x?eHRmyF3HZP z-P~RvEcdMpi2C$%+G?9K(Rv>cV?|eNt#iec$zED%l2n_io?~1xx~r7?e9HmP?gO^^ z0{)r|mp{f0r`yxrSQiNy$dEaR>Wn1;<>ES&0PnVOZ5$>o3*}uWc^|1lvn>&OvxL1= zU4#l6nh8HcS9qY==BOBgvbziGHl75T5fezcpSkU)O~9GHs_I2t)(XA5O-@) zSn7g@&#;f#&if*oogQpQwSi-P+e!OJQ1*gA*8B7P$ct8^;n%)xG4ju25%>02tyD7v z8I(^d*6Xq`Uqw2nSVijHWp_mEj}rGSq}=Uc0Y%k@X|_Ml79U@*|Mm=zYhhey@!E~l z4Msq32qS>e*K+FA~T zd7xb*)s7$Hm{CD>hF^APq~6Eu`&nvs!r2a3!c6A$Cncc<7m=#m!%2YD{#h_1&kU9a zip4j4wn@{tb=cl9U=@9>AkkYj8Bxv&+)CZgo9u_`aXh5nZZ6md0`imhfwYdN(rw&! z0?stBzCT4w@nsbl=(4PX+ePzq0{6znalSDQvx{)TS%+^on?MB~rIlS} z*7l50=(31ix*mC2Vz#6X$1Ijh2KgD?05n{%OMLd6P5U|#+S|_BXF%qfoNHG2DksJz z92y}8K1!lKR5z<2zl6=b;A(&0>26z__}-0Yaw~!o%Xji8l4*6Iw>U?!NCLLWRwvj~ zL|)a0PB{b`B}X&#a?(r}M>eqE6+Vufs5sI|^2KGF3L_c2OwFs9eUjtia62}gV}pY{ z9{rNd2VmiLOIuRKu8L5%9gmq7sdv@BKzZX_JlRpiAuntILt^K?)VbB?VB@VK1l_!o zcy%DLQt81+!0#3vLcoLI$4dzQ0JkYe14uKEFM_Qu_Y%fjCYN02;^os^P?Xo?ZXO%` zmw<;_POK+n0@^8N#s{%ZH6m70uJ|8cF#V&CL&GQlPnqm`zKcdZRDV@AAmC~I83ryYsbV)!pO1JwkE*U16?CgSC#jyK&OUKD(hsqB|-JDawxM7!(gX6Rsi;&X%{Lz@W^v+);OA z|4u|>?_zszqh`=&pC)H?T$ZHnFWmMKv$rsS<^#%1vXwelCn5X+%ZesPT7{yQ@lGL8W~Z)FVqd#?VZQ|1TxI*E6I#LLj! zv8~=m&+Nv0RUCLkIP|KO5O9`Y(j|!}v{_vULsyo-5Keey#NIA-XL=?ncW$COFtvAA-Y)7=_j=8q_DIlP(8Zp|hxjvp;ZA804gM)& zcPPbb^=Zfp&MbQcskb3fRk|5qT|6oeQG=J8U0T4^_jI=UI9YEeBGsXwXFv26SDZ7? z{z<2|&&7;Db+Ans&NE^-sLo*y-Z#S@z%-+F&z^3Z0Ka)#*1k12C4hB8VrO`DLDiim zJZtLC9bI-2JU~VDduWEOp}hQds%@*gfD-rLL2HhU0I$?99{+qk;vF>^py`3zJ;!O!Agii~7djPh7P4Jh0-iv_&Qf zZ;M+m0cO}fgM{kc++fplL-rlt_q!7s7u_$`dW0WAfWnGH7gY%SMui2!wnsfqN;r%IzG8$e7c=3%pESdV7}=g`ye6zKbG0$Au2`zE&m+~I}z z{hZpX5&!v~-JgSORkbR**v$ty=NJwYgCPVN3Yi`^qP*aOiyOZP^Rf4EoJkeDt2AO5 z4;4P1Rs1&!#|-U-f}QH%s1P(wf|RU`;4@3+D>y20q2=|ITSv=Xj^ZP53UwZ*S!@zY zC%x_HN^PpHa%~D$uWNNgn8;Xy zU}|NVFh%Pyax|ZOpCTiNGr5xHyTK|J;sGQT@!|LWs9 zJ1;VndB6Rt-riWSzs&S3F-%E6WEJ@?*>z9nHbS@`Ey9u->&Z@wrcF-js1r_2_lv&6 z07(sIVw>W5o>ok?H+MTp1=bf~Tawe!h?+vP-LE|DJ$r36TD?1K|3@NLE=pm>7a}Cd z+C>DUIeU7oiGZ_&TvV05Hd}0|l0-&VXRIf*;sjU6P#-kZ3n%A&80S5KUG1aA;7Xh4 zy0L|TPDF2Ep@-qU{qo+vum%sO1Gj3ujK65Db4fSbJC!f$z=I3UfhSShvDw410h>Eg z%KedxweKdFd;DH2mCgXge<=Gbv)@^@iVfdY0tYvIFQZx`j?2=$=N9ao{I0IOT`otB zdLji^sz9q*R?+Q?x_0)k&Vhf}>$NS$QLPx06Ukoj;(hSqpY_;Z3-*UjS}P;Hef7|= zurzX8-8>s2%k%sn)h;Y8=?0v59PDs@LDj$`T@4Am%G-OpfvX@8Q^7;G-=TKkMRqma zsutGyXQ_8B?0*K6M^4PK<72Aes!ukl&6dezBN(h=?>8J6$y_(Y?9x8k%|#ELh(^;0 zdbp3jJw_Iu3)tZ;5nd9i7Z6iJVKp>!_m&^5dYeeuntSURivDR+u!f@Y-Z#v;%7@4daH!kh-M(fCH?h$jD=c)|L>wchw z<`UY|Vi(uIj_NoT;p7v)(1lCS)eC^!`DWI*I*?C;3iu?I2F%q77>3!`kCM+P-V;aA z2i=jFp07GXH&`14n%_F?`8lmW`DBxevqLOkzf`NIDhRbx>}%U{uGDbhe+sg3s-6Vd z?RRywgqVA-FxP^D=N4K;;uhD&^6eDhi_GG2g2YGA=PwJI&Ts>qEg=N)`-m*QKLdeZ z2NJb=k!zVOa&fve!Y;KaJu-OJoQZaiE2`vO+1laHnJ%<^E@)=E&{7p?whR06=DPJ~ z9VFkF{M2GzKt>A$6h_Um z^l3`kfrQaUO5QGrmLX;~Qj^ApmmE5ZsvD?+!$eEFAbL|Vi2l^+^)xW57*iBPbvr^I zt=%A_xyD75x}c7Ih-Q)-PzWlW)OCx2^j(tH7az7p>?(!P_h|MZu3JRfd|o;WAHB54 zfQ@T9ucSCaBAySJ;w`mx#LrY6Hk`HzL6P%R($ZuQQe0XZ5las8QcU+g$CB@{%A9A( z_%0l2k2q3jx;SRiT8#0>$##t_IA!MtRkHL!s!awpvXm+;K2@dB0?$8#$u&1)0{?M9 zbUjU67Q?r_H#X2`7iK~c??6P3ZL4>ET9|r=Q3W0~V_00MiN3BMovOE!)vOPxa3&0! z0Y?zO^s~pm_Z(r!YTI@M0QFY+T_E7)WjD1HKJs3eEssbzk?r)j7&n|HQpmma!=tERQ=lR3XR z^8n55k9Or5b~-+HF@@=qC;_R6OU!pFTN_|2SD69UDgJHIzc66-tlC@;3bjtvRC%VMf7L+l5+i%ITyLybL|=FSWn z_0a-%p1sT@|AhscNj44-z!AADgWn&wy%xOb&)E>vBA@`3wrCUu7#Ym1^yH32Fb#Qp zs|Is-TC#mASKNWG%Pi}nlRTR}Q(wO{Xm4RM{SvsDg3mD;K*ElGIZbWC>9 zNX4@jldUgOSziyM@wpccJ7?a|VBwQ=kl9A)or@vAa#~G*Fp}|{qPad729ZxYP<@4R zZa~usBW|pmFv3xX@=%TML&O@_8T>%R-X}G_KZdo&@nvVd<2eAk%Q`XMcj6m@+9{%a@bpE1TJ z{+y&UFyQI7K+rnFCWZr>nQ&gyb?Num1upN@v4^f5sSc22CELs_PfZX+;9*AE|Qeo55+oZTXm+3MTN7m*Dy|ob9@YAYJTR013GKC)5*A%FAr_D;8b~%vsrfd z42sSN?4l?~(21BSTp1Oi&>rbEZ66Wai&%flsB}~8pf(7Z-ijB6siq|;U0Frg23<(l zWSD*@(={~nBlZCq@&{w43#Ed)d6NaQ+m{tu-p#x-Cy_L6qTWPTfJ!Ogg7Z55NK4q7 zICRoE6=D?(yE$Oub((LrbHC~|YA-&*>~RrhMc}e7HDOG1(4KMKmlHX;b4{h2&}0*t z&7_J@=%p^W7ecRKIa_6;=sqsyy(*Gps`pbUJ?N zYq>{brE6a0nqj&MK|Ox*dOOZ@oQ=L5kGvnDh$ctOSWaDBUKA3dPAJ#_n)+4ip5`$J^X1qqjngLWcw}?#_!noW zx{+LxWhI%s@%tJp87Civ8MvX6LvYoRZUfhh9UB^Boj1nY)sMb6Vi(F5JG^|#b8@Jz zVD z^$uya5+fzrwc22uZe3v)UqznBx;f=D=%`sl25MsK}uX_Joq#K*S zsQYv|+m+E4>k3Dp_U=H7oxwbGIR2#UxYo<}i*JdZsrHQjL02htoaCYet?*WG0@(TN30IA2hmd73?!Q`PFBZCIMhR#zjfD|rNrmHE;!l$Fv|uaztI1EBQ8 z$RPay$W*JGehGE+T1Hkk$wgt$kv#t@vCXpAHYA@L0fa`F_b8+OWq8ph}sdXOH z7uG;lAaclc!q_+&mHJMDj;zkJvw{Nb7FrE~=w~~f&ZA#0ovxMO_ZONms~Y82AGV2I z6i9a3_)fyZ+5+-V<7&!O)*cofDbLzKlEpYbXRLa8EjS0|XVOlU5T9h7>^Q8Y8A&+F z9kIfquZ_rcH_M`LhS{`pX0ccf8N@O_P6%KH-%>e*GC|Mk(jg%*b37Nux`S2~!``AR z{fPgFMf;Glb&BQ4EUAcO7^ig=kq4}N7ee@8@@E%Jwo2{D-YnU{rE2Tp7xe!6-+ear zlt=;7CjUHyjf0@)bNmtzl_*>WanF58??iR(2sH- zu?_1fi1fNPmf~V4ILt5xL6k8af@oI}sQ8S+Oo&uAmBN zoM5X$uRo0eW{bw0PG^r}^82nB5cM-l;l?Yu0AvD;_C9j<)#&p=^f_2y+is98 zkGEzH$EEG$yY04}J$&+sto>dgr*bA&r@N7NjvC30?dUyuo)*|?u{ziMjWUATMl4d` zfg;)otLTr4+1|vo>CP6r#b3(t;G z2KCiT=z2Oj^lFn1$KoF7-f* zti9e;7a8eod+|z6f6fW2>hV2d?Y_RX!bx`?vmKIdW#E`;+u{uL6bQpfGR%+>$t=fY z(N^w32<(NSaqJ1@k(X$4$Tx)AB03=@89&TLsYvv3VfACL!Id$_o{S*U!f<4bHqHoN6Z0!)cnd++qWJ5Z0?o{1N>R<9Pw6l4iIyN z#JrzQgB{(M^+nm=luF454qVZ(25;>B=$(h0u>5w&@1Uf z!(2-V%p5$NphCg;9RrjJW)#Z=^|k~R){mkKn)%X+46v0EzUN$J>l~}_2QvQGh10Lm zVUb*});xa5W;GH%cG$Dsq!pSe+3c~Uwm3@Mzb83*20SKg89n-SP7z3iLu@Vckj#t zkTn6jec4I-yFgl(VpSJ#)vpjkreZ9QJ74@*);@zTdU~4~VYko-y#wS=*W6vZ-!eXC zL?kH0FkJT{pqj_w3mrKxF7&jLF3wWr|a!hszCgGz;>CK4qLWtug^ANyBwPOWS;Ed zr1s{(JOA$3K^AT&nXd|Do@8Hksq@hceqAHJTiVi-G9Rn7!+aasDq6YaXQ8l_6Yju{ ztEE>CD2B1jSQq;{ZijN}WWQz%8tV0K+8f>B1vg?)iyDKYQa{GLd}}1WEoepe*a8Ft zS=~XYIx5b=AUOD z9~nNxa6x&-&yo-oQ*AB2%|74Z4N3F{*8nPOwC#Q#>JdbX=5+}5r>Nl19&)(eCm)v4 zQH#h8D^_Ll_|Db9sa;&bt0N6t!d!94Vg=$wKm}517PPP5hlh&W9 zU8z3%Gah!5Mc4sVN1LZhRAL`8Dg_ljFdj!>Kr=+R{s~~}3>LAy-A>dyv86E|zb@$7RfU4^@bM}P0xX_*Ng>VncqqHU1pJ-UmImW3k z%h4!F>7f-5Jj^mqfxA)QZ%5FCAjyI@ zfU8|HQeH*nb-;R!VlDK;5_xy{mWxX$r+>(%FixA|9LmTz`w1Y;4ok43x`~>(4N*78 zY3{XmLNj_@7P1oDsuXq8>(!!e8~gjj#H*~sNp)l|cCymJ=|sD{HFksTem0;rJjuJoq@LH9i5D=rR^Rf(V=i?E!A{XUx*hdw7>v>GW^{ai`PT z4mYcZ>3joArtCOq&lmCo(BQ?xyX>mHc8tV4$KJW4gxVnA80&1Wvy4wFskibru_rcH zqr8Rc{d^+gZjNFRcj_XYIKv`gRBXcjPGRjc^=MGo{YfiSFo{{qx(+8O_DJ5ou5jF? z#m+^AwH`c!RC<~Wk`loLyMlbO7Y!PsGSf0mgw5dE4iq_wf#vZWP@HKO zcB4j8=*R2>S^G*b7EBhMVWlL|k%2mUeLn2_xFp&g!g!cu5>Mxv0cWkmf{xzIBb>n4 zINVilr%_qV*vD&_qgA>Q9?)C?5C3P1;ow#`0Zz@J*!p3prj-y)>1U+*!wgwz?PP4BGbv|x2Iad6! z-aYm!@0)~;k@I1r!3Xua^EK2A=pT4-$(bevES}> zCvBfrA&;pELSl<_n_+C?A)B7!sL=5`BSv>5R4#=enzE5Vxir|^pwC2~VFeiUHM@~S zBoD$I9tl7w<*fNqMgSyoqe4hRwSWe7pJ&-B$9LcW-{T;W4&NU7KrufXgvnGJ1<~2- zc^D_b(VDrA^jP~a&v{t0+L$|HC^AMZwpb*19a?U|V$O1J8PUgd2^L_))gAQBv1XcR z==bHE4M1bV+gMb*S6a?aVX=AdOUSDZ`5v5pO~PiZ*cmIv!&0wWv3vp8xF;`&7g} zA@se=6$f<1rK_-?&+1;l^DbA~)y965)(2V;TSazPAMonk;}WkhE2;Ap5mz9@L~kr{sF;imtcG_P5pRO{VXr0o4OGWsK`h z!4!413cgq5ZkY0dQS%U^(_$8Wc(pOu0=llViY}iOPjZr7MwO`OcVKJUK2MNzGd#B( z0$s-B#qLBnm1dISca4;%PV(kQY3^+i^*cT#`}=gvCbySPo?U|1EynP!;?6^&rPbwOG4Mq5zb9tiRGA4ZS66qXiCaS&9!TfI9?7Emc4xVo-44Yp_v#!O zVxL5fIK0x}JIZB4VVPP$*zJL^ua{mY7WiK`*!_9%{EVl44dlsE?P5I#7kGlPLh4wN zHt?lHzp||NN9-ve6$?i4t{5|~@md?VQ)R4w!3aLY&rZN=KUe5Pzl$X{w4hk3n={~r z4rhH9T4P346CWT;1}3}-(-z`7d!Z8b4<_P*VTr4p34h;Ju~-N20k@47@`&>p_l%|J zUaLs03yn_8s@RR@J+v?x?@8}avxE*2d7)3e>PWq=kcVIFjJd4OcGlQ?{li9AsQq0| zVBXJV12J_mKk8c0wjQ@5rKwl zdZ|SB^`O_gMFcGVtmgp?4ium0mhF`0RW-KN9f`GTe*?B{r$TGsVsjq5Y93v_FK<4#hA0ZUse*|TM;Ckr zeLM4op1t>sbf(Wi%C)6g*;K3pU8(}B3!XIaeHzE7UElpLHu>oyERDxgZzIr2U}eXc$gsMz=PW;tn3F|M-XZ=8!#qU5D0xu$g8@-py~=&VhPKA zWx+$Q0!|8h#3>n&4Z2*-Tg;t!qx)Fr=N{A5bP;YJZ-~QQV0OcvGDiMR3F5 zhE|t>u4RN$D9krEN9+qqKflNYgLS$DPQgbYd|E&bFW_RNf<-mo-2gpA(Z#Mcx0B$v zDRpksfts7GA!LZe*Bn(BTe-9|~^K;m5Os;)-0OcDdt- z2`6-qeV+_cGJl6$0vATuvXvC=^LupoLLH z+Ym+af>#Q&cj&>h??>!uF{g~(&pSR=UW-aeWGD37`_Sm|^}23njnC;$AA90Y<+2pt z*_JAFZu3R!ZSE>#)_TN4JNN1G4h7oStUaznHqDjczk~_9D0{UN^8llIQsgpWa)zjL zahSShcUV5DvQWPZr9ZQ+DL85DSWP(lbUXJ$$g6^6w>Fv-=2h^x$gQ^-|^0h8mXNt8MN zU+eXu5QUF+m~=5GvLxRnl26UBYWtI$Z2#N`snwqFL(~cvqLL6DXXB!FLX1BFSLv>A za`#K$t~tXm`?;=Jp{}~(tb`iuqYlT1 zW8Lz!j=j2V85FlCm9r?Ysm9==36HWu4t_@2)YpE_3MF9#*Gcjl-0r%PV&0gD8Qw@% zoHXC zqzaYi<`~L%hq6GD>d?0~SXp@9=~z7LAxB@o#N-`gE|=k356A#JxN$@yl|LZgr2Fi- zD^tz+(ngRQQXjM^{PjfmtM69Ux?#1}QIain6uq_a82W>(Yhp1GA?t$aRQnjXrWgYooSdAt z3oNtP3YuZ(N>*JuvH@9L*n7pydXc*^k4yx{0jUUqgsxR}`jIO8P{h7@cWa~d#DL9< ztYw70wjw9Fnzj22N;5r{@%{BFkaMoaQ46*$JO|$#-oQFzgrA>?Wr~^$Lnc}d@l*`z zx3U6GjwY8;%$M(7085r8U0+=%)|PUpGS3N;nZ5gZ?ZK>l+DE;E=SF!w94fP|X54f4 zTFu&Zkve9Tq`wCulIvDs%R@X5v09u4Y}` z*935K6{ji1y5o)Zb&2wDte{vhPABjbtg|Rc2Y)FSE%mLfF5Sb=oAdmCUA+n3PFKKA zb?&GS8v>Pfe1@0}j`*Iks*=Enm8m?gbkUXVZqFO7>kZD`^3DwJw`+^;=Cg_ovO(d< zdGa?BjZr4pUNSOAlnyTrncT**%YBr-7I*WLItYZm6sEsQ`>qe5^rVxAdTf8n9o;_4 zVpm4{EuZ!!x+X`v#;t zw38M}S_&jAZP=%>g{`DOA+3NZAcQ?-kx&W*L`=c27SwB6xLUxgDTsuk5-L{2nh5LIv{7;&hGiQ69*IC{OTkDm7-xdvx{awN3 z@e*88l~lg%@fY2{DBS}7dN!scyNmF31sR-CMksX9N!n3Z#`~28m>JgxJ_W&R`7L*( zcC1WG&Q5q#FvCzEN7Pl4TF-xMCd>$O{&xujC3%Tu#m^B&??O30&RNgcW297$n#IyY zUY8I5R<%YFYgmbYLafn&yhzEK#lnUOrksmo*5k=6zdtZ0${NqOieHu)V-3+Z@TMF; z0I@^F_UlISooz=&d+VR)tcpk0!aVnKucF3YRS_pJu8paZQg-teq7~+T`GEgoQbLV{ zZ-mLg+YnTlKQ{ofc{rg~!Vd$oxkP=f*5(2u>lz;Er0B{|TvkU*_dG_7qQ+_U6?K#1!m3b z#0&1T8LcB!$_KPsc}OLGL}p0uO;z`Dh`=UvvCYNTqNgx^QQDUfx8Khohj0(~a`tzI zk`VVckDp(N%vK83N zxgc&;{>)L_w{tR!Bi*-fGJB7B#Guz5_UDnqdbU(zDYNH^#JsuZ+~od^_MP?BzVDN% z8X8P8t)yn&UU;X<-Zi$zl?m2-aLL(CHY3xGjXuG-Mzpn06m*ekBgD?@y`37*D0Skh zjy9f(d|}g+=D#648unA6ACH`ok&X#oIfh!+X@yx(Q6QX&_Md2x%Sk>T>8a%vx6pqu zx*UA+GzFn4t%$^|OE2(XQ#T*^bHRWc2tWm(BXW5Md$m&79Hx}1dnZ`g3I}xiHoWk} zwHkDN3XhaKJ}IOM&q|xBPb1pju#wtO{vBI{R0Y51s4U$r0Z@HEKy^|Sc)T|<))h&f zDt1{;+r7Sjhk>QDT)s!Z2MVz&=0U1#i}lM9l{&wpuu8uqpFDShs_{xiG^ylmkp;qT zR#qi7Jejadw~9i3%0alc9&y3G9R{)}ZnMQWJXuF`3)vXQir5N`M#v)rextN4MfFLv z2L^{i?(#XMgRLSw4RE##c42fg?MPRfrUUC#G1Vc|s;0b1X*9LN&}TyE`=|G_99lut zy!cRWEB6lC-TfLU{~rz!wZUEH=gE&F+ONVgmWfDh(F{*6f0v0%AIY2Qbdf2(FV4$X zH^l|5FNTcMCL)Pp$jhV&o*A-hqO@?l50pQqsU%Me=SUXvU={5_y*xvD=pnB$0kb>4 z#_HSv)--0-ryCG=mS=|LETDI9s9JN=p+DVd$vaiLgMUHXjr^gjH(zIV`6$mp*rlr4 zpDyVI*){saBQCdqnE4DG5{yWNv`^;L_A}2VY`;<$%k$)E^1TOLx$N97|PtPCQzj9LDOK@RgHC4WR_>ixK&`gL0_3=bUSLjTpi=t8f+keO2|wZof~3a1Ln zj8NbULsrv5CF^e!D9&qWOews6v*t* zy^5E#0I{3U^qH_Y-u~ccDW0+)&tqSzAhDCM)5X_Yq7+gRGXZ1fcsbah`UE}zD0^?# zj%!mZJV1d9911LVxtGd;84FE?h2JUmsS!n{$!jOs*BVFMrVE7%se5Trp@Kzgx2NiU zS^~#8KTI~i7Fky-gFFjg0^w9^eG0Y9G)Uo$hi)6bK_a|ZQno`fi*pm8lO4}Vv^tej zwAeEQld}u&1<{44!Q{Qs#p7%Tw?G>@_=$p`7rOs`7{ira3jz#RmOOB~oz!U0d4s)p zR9UZ{Jtr@nCLKa0PFQ0L^7Af`IB4%V1~gS$K3kH(J!olrJQ}bq=;1FJ-IRhg4}^DZ zXe`&ZZNp_6Qnnx^)y20z8dX)snrkR3Lda2T!~!4`Wyn-_)DbGLSa%n@NOvQrL~`xn zs%h)UC&`J8_E@35EVVj2J-0Sz&09Cxc!>Rt9eJXvsolN;Vhha-4@PRxecM&1X!IOB zTtBWmP8*lva?+I0$MEGEa%eB>$1-Y~TLC&z9O8s;D4=^Hm|AT|qPq>U(EOW`6V+Sw zu&XtYdfJTlAa2$Mjl+mRZ#*g2nCQ3qE zo((dJM&CQ_ z-xwr(H3S<1L&5!afN+c2LaWosGp<`!9z&bwje+wE7xzb2xX6XRTl}IWn zS8JJ@o=i6w5M6#3`YL~_PagRu9w|;+k4!cxpc>nu96(DHSP=c@)SGHDc0}-CoS#=M zkRW4c?Sfl2+B@!+KLg7}OK4ZQq(6$bvo6%HP3B;uCnxUXZ-528H1(gLgb};8tyLJ| z&&4ytOWr8&iTm5}4Rse|S4I`f&29?g)3x(BPG zzTEpGX_+08wBv2TNH4|uDkToe=TGXj4>w9$W+*V*P5-GK{ND z#3ZKiH<@lO8HALf7zoI)-DSRj2cs05mq&KKo8BJNi(fzWiGA^#lXoF6foEwkMq(6* zFpa=K!WBD&uqYGV0+y!vsv!1ac-QSMJju`AtjE$1%GmumTTJJRi;Kl~Z`R>VTHEvY zutuXm#!qCK*@XBw9YyHk6XAhq))wK@LE)$o0V zN3p&Ne)UJO*iEoWqbw)nY&?*PoLV`b5_miBVFk4&P^tz>f0wW`LiGCnJgcuW4jTK2 zgt)yCdp<*e&ccx4XAR19|`H3SE(ZdGPe0(iS@djSkrUJvp_9p0hpBXMr_A_MM1Zf5nZek5f(U z4Ca=_aq0ksWhO%438wNz<=r0yhG9|!d*9$NHeY<|&Zq)m1bm09eC3N9*zGQAc(b{% z@dfRrb+)ONjPN0HR^hBXX~NN?ksfamUFS-yp=Oln`d~i6X*$~wC?nG$U zb~cYFDAf|N=hQL4sNs)&thXsT_r24@LrO>|2D%n8c4y1QW)3D_vpYBTIupkJHBqT8 z5_7TCxhY48E$>eR`1EZ_2Hbd8@I)Z05(V#%E#|illyYma<)mhyUqYAi$sdKl`yUu~ z02Vi6xzEsp$=Oc=usAQU($Op)KN+So;soYEq)IL9yUpgu_Cr0c4GY>m_Ahd6hkY1l z4i)+JE?{dU;HeT2P{C;t@3FrSty(&73EMElk@l^%-Vt*WnvNKtFs+W*b#00*`!(6_ z8IeT;TqNk68Xfcd1JA*sseeg`cPz6b>7`&d0MONI7Xc)-Myu;ZtXIi4WlA0sx_3Bt zpMq#N3R=vOJS_oT0@joro~ZASHfGs$xL00z8S1f)ZO^p^^Q(FlSJ5!| zI+~#$@N&X_v<%C8sf0rrrSOGu|LY$liR1jY`m0^$Sz_9lksKypdvF8oIX9~u3yET_ zuXORxit#(ZFCSFMjB}>jULI5)vdZ=d3*6{RI)KyM#m-h{E0r57ISR{Iel|*t4>sC= z%OJzsWu-ZavUHYAv892stW#s_NmiaqH|kx}#Y{C2JNCo!+V?vr&~3p%cVeZxsbcWY-MZT1 zFmpHxZL!Hz+ZG;6A`+=Y1JVQS;M>U-PsgnEc;|BactlAXrb{IbxuV8CuezmK^RJgV zi#y)#Y};zLG}>)*3*0*+eP_XT^!8E24TC*z#^^?KJ(DvUf}JnDaZa?mSrhprim7)r^Hpa1OizA&wv-}m?byL>P{WjA zX$;o=LB}-bS!IB($GUt+5QD-7E%Irg=c9z6Bvj+PZd~U}e8{ve))#lr4cY@*Ez^w8 zqPpk+%6OYUgkW`jzO%N`N^3*bNQ&|*i>s8k`&R2(+8{ovZr9Ivv9&JlQmeuDeH$5X znhp7tW!6xn$m!v9UJ@_!SO2He41$} zT;7V|9B6NRJc_2uTXS#}-+a>a5$#`gtB9kxq7?0i9C=RHo^SlKc)GrxqcrqDgQHgq$8fw_vve5J&G+y)8= zEHvV*#3kR#*iE?}D`EfJM@Vo=5=q-SQmq=%16|DaR_4dj7t2iFJ$L$%5FTNnknYO% z_C(G0+uTt9nGdF3SZ>Pki!M+mnWR&YWf;IIN+mq*0hef(v`S5jyrcSUQhl8rCF zD{8y1!S;9;>nBbkXqWG>6?Lpttj1ndgZwgKufRp8>=*NBRFzX#R&lm*c))H!+^rl< z$=TbyosAe-m6TOhQAG%{*>wZdh`cPsi*)3XFn`Cd@IDd>CdOE+4^)Ip1>_Gpn{$U1 zZ1B<^7dMeZ}T>${4!;~pW46TgwoW+nvN*#Kczba7HX^BRye`_hYWuhaw?Q zldZxLRp=MijhQxu-C1^#LeM7_f{HD7Cs4qU%$ICJJEmJvOcb1#(8$^+f}p=Du^;7I zW^%}L(alHs*ei29P@-U4+sho3*B^A`*VO?4>$<#ImTwPIFc*)E#B_Z0&;dRN6ZA!I zqx_V35_cEYx;`%oYX+bWk3FrVi!(JLGsDjBS@4|IbAS78ObK;1H`u9UnMj=*H|R*5 zb3YFVQZ5AFF7S-mld#_)p&IbNF0s$F6+^wBW3PYCjHsk5xq_*JnT5%EK4eZEag}pS z2`!!0XCnDJLZ2ufW1|6}acGjCNhcg#z%W|RFc_K5lgXW~${%ZRl>an3$3!|w*?As$ z9#G_YPr%cWh|g*u;8lfc`Cy?sjun98NfN&nqWevFZ;)plav`q%gNQmAqZ|jUo$q=) zp%~TD$fi6Q@g88mMIEtHy-Fj`j7ObfO+w@552?;cJF4BUcnI-RuF6+w^(n$$D^03@ zT@}5__Z+#dB$D63ef*vnNykXy8zpc^kTQ0eFo)v`#p|aCUgA9pOTx)X!(;-r) zmhY8R={tn_q`RD$4#q_Iy#TGRCpc5doJcQ-?wF#QlIBSgZBDS+U{+0ugmBvG)>)uA zRQjJF%gl$E3Wu#fu(FO3m*+oRp3h01C>;(nMsd46jXf^UFW&8PGnkM8s9~~avR;P< z(5S%j;JF35!d0c<$!OT0F@akg)KH#&nu7lu%*5nRr@l{*U&a$lvcw7a`$!mBip4rC z(@_^x^-Ih!UKF4#Dybgws=tc6E0)|t+F}ZguNEjAuo2C#m-6abEo-FsAFz|$?dlpW zD`WKHpRYe=n!*X?a@-X$AJ7wR8bxbL+ZXr`S8J{LRn(@^d20~y?z}Nxi;SC7c1KRH zV9Fpb38Y40)DCV!GIk~MtWD$2SNizqFlQHTM|@uF2?AzqW*k=5x%%q36dTO(IGLjg zMO{t(FLYRV8W9|@3uqc&BO15TX2yN5>+>@{_$0b~T$S=R9Ik^ldte8U^shwEFJ=e@ zf3a^n;b_^KfNc~y0rxe^3k`YO#9U9pniSM(X*{0Qh4G!)o66BY)>GV6pB^H z^@2zmx4>wUXL4W;A-Z|idZN8mnx!{F?}FI4*gog7{7JG98_$+{biB4)h-3miU`ER( zYA~z}*E+DRRrJiK8m*VYo-6>c?zCjrP+iu}XtYX>4S}u`w8&D3`SN2AsLpJ7&EsY} zf(lrJnbDqFlYf}UpD$q?NSzCtz%fudf{T0YKF&pi_of;(5s`|g1uBFKfkX{W{5(;Y zd7PbC8{y5ON#(NWLs%-Wy2bLSuU(B*Tfs-?SI!IhGCh2)(lgwm=iVu~Fl zNvC4Yv?g-^2@SR`L*g*FL{pN_t}S#Wt9W6nk33UnRX(}I(?xbfOnf&WaxH^McO>k! zgsqSh4$t#E@nttyKHy^P^+hfi=alp1hF7(QdLr+IGYCE*hUQJS0cyCA)8hz((Q1^0 zXLbkOA3tbkdmudnQ6S@@lHy*EGoO_B9%p=xK;7puTjI8R1G9IlR=j(vz}pEpUm_pc zOo!OoYhBIdi&5><6PBgg*LbxYTA~m~p9Y3dXZ$qRAThmhgK8swe@NrI4Rqlc2;K`) zdS1H67T2yFo8js9O1dfN=N&7Z$kiI_nVr=1&5<2ZiFlu@_JO=?Cri0Hu2@bZWlAGA z^m}yDbt4&Ly{z}$X}7Z2P3zWN;k4?34Rfd2LkVruzox+R$CAOecy(93My>9i!KW?N z>TU~qoLaQFyDr6P_*Nn82CE8A%5QWiyJr{^(5yG!+9gRS7lvk|o;KfmRIFGsJ80)| z=pa0-@p+f>nII*TxOyWYe=Xu#JtI7>icZ^%+(@p!gdgc(JMm>n>m%8jfo2-&S@qLP zyKPA~f3*+)E=y=8JH7q>y1oWisyA3Kv2P{>&d{rr`losJw{-M;kx1l6ka#yLcgwFp9pg-e!9{`Pb5HY_$J{ z(Uw3o$YlB87j;x+A)oxFq&=lVuL6a3-2PbH2b0?+EYIMib82+!-O6_PY&VqL#tt58 zeS|=><9ao>uVd3dJz8 zrtrIzmr+&`M`9YWBm9E^zoX9Mem&+9s^-bw#K*R910RlV9>?QtAMq za=V&1|B8jgwg+7hC&1os`N_?+)2q`tC|x$HmtfaOAG zU%$`bKop$5=)q}s2~KSGtSbKXH~s50!nKL!Q@l=j7J;~u)#995$&1zs0l{!oY)7u> zP$;PG&k5Zv6g+B5{U9cuUPy#B2DMB3-jTF9dB z9*0WcZ@m0qmZ`Kj+FmlMqjPTt$NY0(7$*SSIun}0ZAsgljIM;85Uzx^M|rfZrLR39 zc9E9{1E@pKr`4`?zNRRDMw>oJ#+YQx*G%NkqdqUFcwCqydReh-B+&`5;@D@6ReGGg zRdKeMt=WM-6>yBNxPTMZ$2NJW(xxg|Vj-aiZ~n8~aim1Iw1`+f3y|Qm{$d$^)DIHq zeBAe_-kN0r7Af+uS1~Go?9KDze80w>FC|20v=eA?`e+0e((%OamtD^LBqz2T4LXAi z1_<`Rg;M)NPP4zyiE{*s2ra-13M8dH2!R(g>AaMfODqaQ9)uyATO5bVUUJDZgnFXT z{Zotx@t1^+EW>cO&&$?9X~s~{zO}($b@*Wi>ubG4+~dbY+;uwPHdB_$(US-+WN1|a z$npp`h6~CyR?c__S|$jkoo%K3sBCYEyzwD7;I|_szh4Fn04uW>pdiZ$g!8)brxR>q zClRR|y7h4M{c^FstJJas8UhNN`=o94&ncw|KvS(UR(FiH|g4- zX6S(tYA_M{1oMS{_avLYzqHlnKzDRW%Y{dikHu2lp0_oSUi7+o83521WpmCy&L`Zy zV&xrt9c=kT&T6W9ej^g|gA$Y6Nij2z5)^ngu^Tk_WA!R$*(akx_Oro*A*YgN62^R5 zuGv>GD)m%$=SCDpceN_MnKr)N8e>B83IrAo{tVa7lpj;}*Lg6Ini#0`B8K1gs{rBm z_1e=pI|Inys!2-~X3dtoV;C=FL9qcP7v6L_JhQg3RTNLSE;wAP7(HWgXu0^vzg;`)`T2--5)~I5k%m!l5InxB+trv07kVN ztG!2Q6WTZdRH8a<#fejdXaAOvS_K{6qDg6bMeqv%eNjHQ>W0~dG%rVM;J@5hR~ zQ{D^zl_q+^sD~ws-mJek1g7<9@9#{JDqH@Ir5VBid)9Gd`A?*k!+Lcx`IIi&A$&o! z*Bv0yRNnYtNVWl^ZH(L#rE?`?g#Rpn1o~N%8vHDgxMVIXh&7*IZ*N4Q=~62t^HAPMVz3iUo}-5KrIYarjiY$n`g&+=Z6nw>u6Ab?W zXnqNNi0hAf^zWg@ev-f1iO=MS5pSzh{V1=?hMI+{FzZbaFIu)@Iezo5x9E7piIOoH z%b1FTP$;zb3x)QdY_S(C`)Tkk7V)bt;wom!f{4BfrFx~*p7hCFJ6dQucc|JOGt<#D6J1QnKZ$RnSF-yP9#=;t-u z9L-p1Jtms4;`bb{S&wv6ThynkX771z&>5|qwmRP8#8`lMU>+GI8!~&^g+1#N_Gou} z2#nW;h^6kVF{)aa%|?lZC~LYbxy;BB7iR4fkYQZn4Rwx1k~Qj?+{Tyu~Z9enz$dG zmeR8Npcdm{VxI%M@U;Tc`KHVDKqS{9$>mL*22_Sz?-6vA;n{H7#)u#lGmGj6#{}~~ zA%D@C{P5o;to`LH#|Z=6gW_eij2gLTrF}Ez*s&VZHuy}82$iL}*2W2uk)23q-YjpB zCp!5vGG)kZ^CPY>wm4&`&vY;Ui_(3H+IN(g z>h9N`cfTt(+rJ-c(tg7Ny&V^lJrM}oddW(*Am{Ia<0%&KiuPtjsvOM*95J{ueG3pbpxmZLmjNSbXhOwN+>l{q3*n}+JcW$G7 z_wkVG`55ueVM(ndVFzE*lz_b>U*o_b-gXG7(_QU0520E9aMiWL zF4&VUST@q#2NYK(<_IWyN3NQ$Qs+$16i&lyMdYA1l~ygq;G3@~^vzFyde$nrGBD)m zyFAt7;QMj8Vv0ujfyjJui=GTE$=I~I?w0ZXm}s~dH9P>nw%sOV^x)Lo^oErwPAXJ| z(X#4<$Cfg_NOUi%KPsJh7a+4Xr;JgQAGhOz8nv2ebKFdCWVS4FzZ*?gGN0x-U?I|z zB&*nsTl(SRY$9W(KZcwzv+tXi>{T~{REdQ+WExnh;gs1hELR?Q#B!XxOlF9NSp>6if|f03JZm} znVqtuT#rn4a`0S%-&OgdRLSn$4c7b%d?Z{eOWOy!Z@>6E_WAVx)%maXd{1@A9P)u- zn(9LY8G*GUmt^>qS~@Z$Tb;I0$6ty53jFVRMg{c-|0{>+n7pD1bcR0>-laD38V#BU91($$gZq&%*1K}3>|3%}Z zXefGKs0u8O2bV(|ELCfP<@n#125mDTwB=zQy=^cKZ#c(+ggMM|{#tFMEkPG66Py{N zps4eLq6SA4)8TitK{Eqgi=rb$(a2c7rikV@BB~>rR((WDO!}~HwBP)!2h!b%+cMA= z$y%$jaD$Tkq%H+j7?^pTq~-%`Q!8QSYrH@;JU7+gsbg2r#!4HaoVbSPf~(`mity88 z;agy&j_dEWR5#Ke#Am*fAJTn+Ky+D~y^^yJH}$S$c;&cOb-!}1V(sMZ#xKyI?=!9` z|0F|?Z;)cb2Wu_Q(?`O_De0GtOvwSu;j|t_cJ3MU7dY4FT=ttKJO63?ER676hvc55 z5uI+(>;9TU`WOpZo9}72Ga9`aOVFRzwG*%YI;?$JfhDkU+ znMN8x2y12neP73M4;3iZB_4zhBKS$iOQmBDxQ)|fGbESp4c&J7 z#>2{6wlm+vIGR;02iYBDWtV78l106$v+9~=1m@(ebxf;8g<1NjStUcP6C+hz0N%WIcc#`*Q>2y47 zQZt5|{F_;ar zk@-isqQ&;`N=0g}oxq3TT0b3D>I+F{v77UGys8x3_EZTEG~#xk4%~DRppQk^!Xr60 zDdSzCiS(|87%=DV4TyMJpOqgx>nCZ1UT^qqol8vQo__y@sx-%CtZNxsw(32hKA3df z5QpgBp=Yh?{5z*{pOnJXvH1cl#OR?upE~2ZNPBqIq1uO-9V!*k?m^G9VDMefKXKo^ zp)>0Hz2Fh*(_ri%>a0l570Q2_lsuoVP_Nyh0A-Db*b|%YiFQYz7>26o&?7FEOozU+ zLxTuW8*C!*yCe?G2L}~TwTq9-Sals5wsF;{m{jz=9xqu2c=Ue6mU4z8XRD-ReDGM; zGVv-EYniXJhpV}ln`<*IE%(kIzIA?7A z0TTz{!Ef`DtK9Z9sZ%3_Nqbh<;(YlngTuPbbgBFmP#9HcyBI~sV|Be?9hX-24>_j+ z`Btm$oQTQsTcvEmEVgoWgQD7QK*Ug=arNb6IlCZDdW9ubeWnOym8rR4{B&a|rwLH; zdBalrMV@xz)?Qqm1q_vQ3>7Lg`tAWk{lJy@DzA=6P-pN2d|&UU`qbTz|5-KeUD!Lh zyO(C{r&VmXa^UWKGR$fl-(r)R0PG696K7lJFT0Z2qRXgPj2R?!vaD5(20x7p>daqs*q@mktZ^moE|k;X)Ys%DrkIPK2!)wlfEZQk17RGGR)^Oz9_5s>C1;C>d)4Zrl=fqHu@_{A;JSD00;x|OjS0hX zPHS&WZXe>jHxGqX5f`r6?*Y^x!Fea_ZAy;S_S`9UX^866X6fXP3f>SYU=6lg6Mqt% z^FgSaxyW)DE3M0I0$>D|l>T8#%y)`fBI)XC2}AIuPGvOsX}aiu$(|FjZ_(aaP&2-W z^(`hBOH;3cEMg&&ws$Nzw9A~%pbfeV!t+tb2_kq4Pn)Ll{k6n@CT6VQb<%}@d zYlfAF;-6l4YPH?4rpcxv=mtF=I!RB~#6`sCfn87n_LZC+mZNGiTh!Z_hURbZnn}B0 znz?FbD5W#-Q{(J-+W#>CiSGbllDaQHr{0eCeT`fBfs)~=fS1L#xyq!c25Dq@e%_5bi7^&i z!jIT4m|WgK{oBGXyI;<(M#h$euZlIQgur5w>w(c5I&De(eir{F?9E$sgZ@_N-Zoi5 z_6W_BX^)5VG9&h5qqw5%A0+5Dpv{wc!CtS1K52jVoyR2-a#Ick{!+n&XBWF|T&}O% zmTa>Mrdk6vm4dcs0%w#WMx`KUl+Nr+>7{oz8sPM&*g}Y6j&v+dYGCdOEH+3u1Hb!c z+7AmMpom7zknPV$K9#e^pv7Y~(a;-JNwU`QHlvl_2Srvz(Xt_|0LJu2ktXSv4!&at z*W25!OTFD0>GJ2U%jK+Z$?N!gjT#~=8PHj(LGBv8V~0<&+F`Ks!QJ$x?vXxmsL-kb zW5oPhiR0$5#)Na(WF?JcNuGZd^cw^y*)$Z5&X*M2^MrGIf;6g zRfb)$_q&Ye!jR=XQb_XGvegf51+7o(w6fgBA)O@spJ1zFXw zPlNH>y)4L=%vYpjL=*n!R!iz6k+gR*flY3>+_ptS8RGag|9`mhU$vdn2R*FH?oh^a zgLP`~r0{SrcW9Ncp`9LQR!r~qrmD6uhc{?P%J&!-M4ATNY1oZYX^gVTD8Ri(#ULwg6A( z>zvjR1IrJ)<~r%kN^|ES9h}TGd%1}(Hys{vq9~c~gmaM^zOL5r^_Ryo{R0sFgIT72 z7+GzniUmEC*M)}(87oSxDU`7hzj%>ecDt7dq`v8FoU*wC(+L>_#i~!NGs^$a8D-}e zkM<46?ht)sup|*h9`SAgsdc0g9wUvWHJn++Xh$`ogz$UJwKLpgyL)2Ef9sLw9n>w! z1*u1I+34+yeQ?D0c>6-wQcMwrIU(rwuL+ZjI92|$$WNYiCxXmkRT>z*32{RME7#i(7f(m z`%iw<36^E-=`fp|%#5cn^<0P9*KXx-feiJ`AuBK0k0%kz+AVo89hjpx;%cXN*wQwk z%Q>fT(X5o~HhF1YKpnU7X|Lq$b3n3{$zED%Bat#3k#$?w_IO4*;}s77d9jTVbHmnN zmcZkuCLEQ074RKSP|bG-`yC%0CAcFJJm{Bf%JwRTP$h^)+m!3Fsr^_&gMEiIx1zu) zWOmV~r^3-r7<1A-8f12b7jsiuthPyRr7WFgNoSgyelivH}rS`{as)A_lBk%Y}doJ=>O&C+<@*JP3$YNHhsuHNtyT^4bcj-IF1`>f6;{QxvsxUeRu~(5k5c?kLh)?rNJd)!s+_e`bT9;Xl zo9hf}Z)>ty>#R{RbziTNGNG;H39d2!^n==Gqp$JJqt_ocW5Zn?AS2LzK%akdVIRs1 zd$=-zPnVpJaLX4J)kiyscGUE*Tgjb?l~x*Rqr<3;W?Ay3VcUDq_6p!-J~B=0=eCuH zRB7_lSnv#_q|2 zxF9En?FSx;uK52Iid4)i%1&5gdxj{BjL~5fsJ_Fc)RgUmQn&O|CFN&lR|BooGW%GL zho4%MCQ15atI!5bAfV2)k974!75xDbWQh|cO;8`51#y&z=8;~vn4l`+$!rfvFWC|W zT)Z4IFw3VYjR3iX7M2knh#_>pfFj8d^YCwviVcUO@w-#Kwdd!rU4e@k;+Au0~ zkM@nI<)LqKVo~2jg|2SE)P%7%{zNDokgl<~a}p`?6Zm78sns;%MCRDnXE`fXjypz5 z{EI8GGV1O+YOT%jkA4B&#+6MjhCI<|pIqM%)$(aa2f9WzryP zi|Zt9658UVK~)k`&xLR2@mHmpk3P#|vQ-}obC%@l{_ zfnysV4&#mGEu5%WgDRuRlN;>nhZ9+z$;?-W=R0^kG-`z{MVVBG^hB&k~(rn9)?+UBaastvOw?cxRGZ7N^XM&Xz4}qvY-KsV_}`^lKQGEs;xHd>^_4;oAI4|DIr;G9?-#4pATkrzT|7FxR1q9l!{!VF_|RPs|J z)0Mx41s6-Eao3v%;xYdVJ$qhkKk&Tboonp3+X*Nr*s38$LqGu)~c)h5y}6_ctvVBK&SfttFa9iJ!- zn$;x2YTLKP7B(r>D-bt0UikN}@xoZRAV&>o!E@=5Z>6Y{SiCBgzvEn6m_+zhVG@C7 zsX;@ROI9R3Rg#8Dgm3j{bJiLr5k96#gc}un3#>s%HeAPDthPeAU;><1oHo#}pgYsn^k>oUJwsfP z->9H8p7~%->3puyzE~uwS^;fVzm*p*&+3K*Vz@L6l_b|&`5(_=cax6lYAb26Lz z$RT0C6L#339qej51hsADZ*Jy0bRrYS4$?Yexf+@-;XSwuw7oz*y;*5w>)?P+R}}Ao zF#*Jn9piN+N|2s=BD0y8zHS>g*{vlTI)HY&MRy(k?LqZGwkGmm-J#xY{dBgp8UBq% z`?l*U<2!D|mjfK2n_pcKj`fO!Go!o70^AZ53;-Bt~lUaz>XO z-f4#jL8k1m<%G-p6XeQ+o5_O>e6#)>C`a7zNzQ>ZMgjB=1#6DvD1hb%6M2OiPpb=x zi|S_Kxi#!K;4!uv>vGXm{4?Zp%KnVzkqSR1t)bx1k<$8XnSH`b$p`qcSGq-payhAT zc`!f6zm@BSoM%jTTgiH6-En19$B4ViWy&jSAGLil23a5}53f$xSq)5!1^prAD@gey z-w+M{D9RE@n2oc9m7zW|L~mEWMW^7Ze8_Z1fTJ`KdK;Pus<(|^W@YW(?vN+Q#z?uA zlYVQ$=q13l)J|;DS~!oQciW^6&l-~%nV#NC{W`(wJWXu(q}ZD7M7((`??bwGP?^{k_PUK~DXs-2nrL z{ka6A?nm@n2s}Awe~vb+n4PSeX2cOpzeyON@PNs9JMyN+9Rg3#ZFCKILA||(Zo9Hw zBR@7-Wud$1*X;G1~3l(-YOiuGRNUD`jX zE)07efgWqEETy0K_JqBEkk?s+(H9}(i5>RCw8tML{5=w$goJ<3v5V@VHIyQG3szI# z;oLx1M_6y*=Q$pA?kHtBy5zwZ%y;j4$b0GIJ3fIBjlYp0TK{+pZ@2lmplI&EgN~ zd7;4j3_ypD*xMPZ%n9VrmB|5tIh+-KvZ9W>*fx@ouV&W9lWpT2byibaT6akEZVNd9uZdUWbx*uvB(B1+KFZFh<6!m z!tGvH9@L;2m8pgB*yCk!ShtfG)mAe--r!Vs?&C!^$lv-{(LQHS;1NX~Kep(-^D zv#O^Xna)5`;?K7NvYFa$lW5D>PDe(;aQ+w;zKQ)FVKWqa)6V^GxL#*)bz_-8YdilKJXd3z`?Co8-L3WrvhF)ptC^jZN;MYK<7o*rK^zqq|!fur~`e<-5 zw7Vb!qexo}%$YT!+XYKm%hZVLw1e7w|G3*V*>!q0_gsa1PLfW&FI3GBKOp3D>{$7B zWwncJU+)a*t=;_s#onOBDg*C5kl<%;CdM8!i~D`0#L#&2s2v5q&Br~Jv)#Ld5{`w8 z&G#&cu!%b40}}NzmlN=K#vjVwDS?KzrKq2M>h0s+B!N_jx|R%GlRhtzfP^W2%j zW*tc!s@FExbr0sSTOB!iv(@@mEQu;fzG^WEo1D@?MD=9yC6GdS$R!k)inUXFhOLoP z?V15NmN3g@shAe1;-xHb!uyc(6>e>WID6EXR{6T-s_v+otcVulb>i_Rt1Oyr#J>ts zGXLYV(LC=wk_b}i!9`CX<`cPnc~r$uO_W3^p7rp+lnAx$HiLC(GH6D1q6G!Rfgn3|jB zvOXkPvDx<{DUhh#mNcQ=3jX_f-5jQnpwDra!UYYNDViO$H!#l0 zoxb8%2d^Bp;|Hw~H)yrv5LQ<$e+F%NpH6gZkLksPHHD*kLhocv{x`KDRf{JS*sfC z(V@9TIA&e-^nzK4@><$sbD{K%&lUC6-T&K?@wTwXo{K>e@RZq{frl-_K z)_%Y8q08qXZYWKzcSvw5axv2h(*;y2wU!>@>X-HSO6omnx>Tqt(H)&=qP^_%d*KOU z()HdeQNoElUxQh+6yU(8m};u!Lq4CgBYfoOr}oLJ80~1VMUKp1OG<++REFj2nsHLO!^j_y>R+|ytVXdg!<~P#<1bk7!?=mKzoC_xQe({7S)bCYd1#R zws67+>yM5UF(ZLF@rp8_CJUo^Ku1di+s<(x`vtRa3M1!XiwIq62P5<-3L{!hwm&KB z^DF;R>w8@T%K1~AWo+_D0+hwfpRNi7#t>hlwOxaF9)5br47oX3h z>WaB(t4_cYl#P<#&}`a%cm;=BK2oLB=i`kNIp(f6U&==NNDLF07U1RY(l)C&_h7}! z=M#2n6NQgLNs~flxzCY>NTO%OW@f7G7dbn?gXKGRIXKN7E^H)n*2g9_M!aHo6fKqY zka6slhEE8f_`x*dM?Gozv$zQXe08UomN3V|^AH6Ve?IthRCeaB@<0oX z4Jv-Z9)p`qFzUH>YJH8OvU73Apw03axr7+`74-B&OfGchZY7Yc>$U&L*_XRQdDyBk z7DNkW1z#!6Pu$x;mg|Xt3$KU=!SaO@z$GlwMi~2G2QC1SsGZRn`Q(Vpb2{<_&h-2I z`Dx^V&-C>A6nuNZB(bMmlulNjikos(?F7UMkC(P2!0f&))-b5fhCucy$lBZQ>7bq8 z1%3XE@H3RrFyr6pw~AHkPRE4*)OCp_&JnAtG1p2RYNyE$x_jRmtwx8jVohiU3g;&8 zvHsf1KV13fHTyFYq-5}Qs1!M1EaPO`Mk1eSTU8%U)segDcWk9{ial?Pn00Zw`1QI|w64wpnafT2mBd}wSg>}+rrL{c^rZ9_jf z<7@6?vDpdyfZj6qwdjCCAGPvM4Nsp$-jSep(+HEG$4Hq(ky(rlF|lbEA=`T=^Y}u; zO74$p6OSqa{~Jo!(k8mT^1stWqjCi%zJh-jQ041X8HKHyOPn8$r&friGci&)Vy0H2 zRIXV7IO47`@S3%n+m)O3Y;BS|AhxBXx5JL}5h|B$p3Am-H2oMY8EUDf%>LKKd!4!I z)zMYsT@}1Ix2_tOtg#wiqFTCS?sax_i_K}G=_$#U(vVr=?-OY=^wU)=QSZ35mLGH6 zgD6>;b4(LpEVFxId<WZ+_m?^VSo7X#z{91(?iF){#D{sFj}1~+c-oVPMzXEfOy!YTG}`YcUV9UAhy zc(t!n4e3{YG3RGr_>YaLDmb+~uU7e*ut`H#D(+E?vm?f&zQE}hpPHz*!yG#=180O; z)xBL?&*!yuOB7hj?EOs&;0qbOs7PrvaF#W;wNn4t3W^1#`L(;4!I@hq|F%&ptaK(Z zuKw&%#=bl4^mfr~XDs8Yot0(^ss0bPeF7d)VsGaFoIV5&(U!~a=?hI)W2GY!y5M`K z)^;@RTo#qs?OO$18tU!qF7oReLrt`g3p|s38etp$KpY9$$hdk#w3bTXsP^fgE%cMy1~xXwR5W1eP|n*s>-&Gq~t-U6m*w zzy?7y69!lpA5r!9D{9rWjtzw8<|9DEcb!9ZYw1x+g=Wk(LgQ6179E+qy=FS~EUYx? zXHg+d(dDhAe%^vAo;*6C?8=Gk@x6PEI+hQ&Zh-*6p;M+q6(kE<_uK; zI77_83*|@X`Je35s}m<`7yrpD4neXUQET`lJt0PFeBN2`V6}3^BoD};*Ku~J zm-8QKv_9?``zQlnT@`pG`xWtM%1yk+DGUA*1Xfu*k8^hm<=OAO5S0>x{?xs$Mq=D*uXK-e z!S?}!SrN0nf>k}sEM<$vH+Ey=Kf5tlZ<9FBg^O0R~8>(Xip=K$*IY+x>lZsSDuo5jX=#qWdwRI}8 z5ndM4`PLHH=UL{7-=7?o6|UIIlw*wo%vJZ>CvU?c<}})NB&@5h;ni0=8(SXVshB#E zM~xVeLS+w#l@Q8q;@%DjbTt)zKTXmM?BEAzQt+eA4_+pOeIlguDWm~R`huL|C;Nw; z@WPRwZKW91+3*x=Q2C0tG0qR$v@$G(m1zkIo)?wf=;^O97VL6YSp)tQo1y%x)PAdu z_ipZ8C!jRE>)lO}fa$FzQv9d9PFg6jte&=ela)J4YvIC$c!6-beyzXNM@#HeIr~5u z)YQmDRRdC4WvbQ(HT7a>J0)yabda~k-dAfQL|4CDpFcjx%muA8znQ=t(DhkhG#Ec5 zg;QO)+0o+V(ZL>vS)diHK8fd3fz^7UujrgxJ~FEG3&UP$3*f@A;+2>po`>h+{GQ<%%cCXrHQ|)to=y}gRRCj`N5)*0O5k{it zU|e~Dg6YUX=&^(fCX;BbwzU8X)#;o?dc(36{Dx<0lo9Q%HI~hp6uL8h(hf*Lqtqh;`iaqoM%e{1Do8u|$r7cJ8o!a8SWRsya_0aTz3)x4>HY=1p7ddR@rrU~7*4*XDMs z*vco*wwD{5X%e|8L!3&Cc1DZ4UtE{XcfW2UVu*gOwgoZ$ywdT<&CGHrY8)y{bS$|i zwcME@4|8F8r|xC7rRKwmZvRQE&z~J!r%PQ6o9z6Iombb53?H0@8cMCB5dXTcw{P>C zb?0aV6^ekEWYE1!4npBS)IQaLP00X|hlXD_lqY zkvL+V)rhV_;)&Ue{XbECHTFx6c#fj0$BQCi8h$TZ2pQ#3Ak?eS`+AHgYLLKaMPHJz z3!3bMK*tSs{wyXpONdHUoX;J`z5WVi^p#!&|C{wu0)VNH^V9O(As(s{pdN4X`{Yd< zV(iG^M57l1(Ni9wzANf?G2ORax=Uv5zMfnZ6R&hxha{^z)+v#+6Kzi~Tn}!vuRGh| zubcBWD_F`&6u-u$8i#Pt(_eZ+Y6>--m1!XD#VK|?bA6flc7B~4?1EX0{OHVc+#5M6 zjf2HGkuZ%WUTC0`^`AI$tfj-U(?s($x?7_pXw4C(x%9QBWJ?EwtpvA}TD);w4{cQ+ma+lX5SuHhPYx5qW^;yODs(pe>GTKgh*-U|P^u#!WdOe7FpuA>pj z?{eb|T~j}2aDxIwtzC!=Yso=+vKuMHD%^^@J&>}`LIagt=w|^sn>8jF-RZ1r;J4*a zXPUql;Clyqlxs26V)TAuVHSX=a_v)3aD1>$|L2n_Zm22sz?5-mh?Zc%6Bi%fj+ zimg?)8yNTBR@KIMNjS(fE*$w8Bb8uN`AEQnbL#D*jt3tvVBObUu(@!9`Qeq?9CXBa zitC@=_TA&`>%xICgfG>2Dlo8@@zk!3*!x@nLOCa(9T8Tn@mKU54&wZyc4?EH18}Of zi)YbZDYvV*_vKaQjc9BSJnJ(#JDw0l+0~fe`|$B9&En4Vu1|YceoAn>9Xf^z;&<|O ztcl3CACbXqFMh=+Rt(cE-4IzG_q?FZ?~c;2AH|H%X~ug)AJ z>x71s+-taRUQo zC9gudX%w3vo!#s?t$UO~k3{Pp%}$S0jb%srRa$Zct-8&ct%_JkQd?~Ywb-;KyV$Ys zrL&l9D7SV-ixS|&NBE948I5l&ScT7>>|Kx6=I9RN9SJ~-Pg6sP@zVNJ(8!BgTjAjWUaD0zB$N1 z97qamdaaWHlwGh^sf$~(TdX@{4$md4`EJhmurs=4Hb$M!nk3X)zj&7wD|W<+Gro^q{!9 zt7uAA_=Aj$aO_yKuTG5EfEC z;hI_stE|WN^1Pj2z%c1HbAW!Iz zZW&>RM_Cmt$8ji89NiR@c;%p7-tT|6jU@0aS__X@lF7PB(jVtrcjS29k&Cas4j3u1 z*<(p>r)G|;@~tYBD^5S=)d<8GC6Z);Ruk5t8 zF5-};cq+;IyaMAo6W;cW&N5fp5E^W0w4c5_4q{-AZZrX%_Vfcy&u-ixOjWCEz2n*; zOdBY~4p^!WzKAE~2kmP?x+@-zZoi!!rMb76szKffkCEn%C`xlsIWQh10`lBSQg`4Q zTkRkew<0Dy!c|C>RZyG)>vA zZL2-gXit*r2nk+gX7Rt%$#hh1Tb1b8%t*oqM2ja^zGH{HeIjEJ!*l!H$6fY>Lp>&DKzs+7aY{Q)@|b)(gpgTlWn_bd zT{>*n4_bSF?*_XH>C`$|RT~Y_e1q>eH)G#n+f51J+#M1?Gv1#cqA80-I|1Ew`I%*9 zwz6>EKq;V}3;dgPujn^c7G`MfcCk)HRZ^euJ%MGCeM*64vb8B{UN0hi0%C5409nC4 zv@K0YW1OIEe%6+EqqZ33JMka5VF3QhC5-sP5S*Q{$Lc(wTwTpT8{YE)N0q|~P7iFi zyQ*vrT^s6Y=RazrIhtDWAG49Jp^Lm7^Zn!P7#A)&#uS!?RHsdt4!ib294}%2jWm@L zaJZAP&HGuClxU|#mRU{$XYY%H;F7JL{htv#l^YcJaEZxysn9Ion$m8As*a49VZo^hLKw4{uf!h^pf<9W1rQ5v0_I4Y6!3nBHv9 zL%}}S6D7CLxI8_;Y=!+raxF(9=VEiq3+mYAJOc67g9Y6e4P7jxzDO`WXjcu|H9?s6 zhv)LKw_0@;PaGf^Z?|t|bUNhwflQpNDX3O2W7^iehWdD33$VDi93VKvPaNOkZecHXGrubsAo$anVKUj(el@XVnmP zi;QJ1<6+g3#Lzo-K)q!mk?&sf0^Vhvs0+gO9pI-77@-a#V3gvw1n}t zl%3ww-OS9_shzy-nckk*xDJ7_Q;yseZZj=PaM=2Rm#xfSqN{r`Rb^K+*+(*Vz)JqY zDoQv^$y!h&NP&n*hPKJR0cURiHt*HOr~>|=K}+09-6To>-~O+u^=8Ehx^dh)WIorkry z;2lukbhR5J=3D31W(MXvE&!5tIH4rxg-uN9M|VIeYItLJeU^+_8d?=UcX`ePsVkIR zDc1v%EFI$4+>b!g2<@$is0Ia7T!a!u5s)OWwR)wkVn#z;Op+kWYK@6(X|ktWlGU^9 zhi%jr!3MR#xxF9Ftk4dHlXC|%qMZ&50#(|2o6ZG;E*oLgB2)n_sD=y^t=#tRf`*4%p;NH_Q%NH8{ljt3uG^~g4{jXkI zl(Wr@3MO^xp|yE4j>F)GxFiNY)IP7wH!XKrLGOjus7)v_Z&w5_p(JcuU7-QGdm_Ba}I-6kB4rPV!%$ja?vnWMLPz;+Ppz$lh3Yiv5yLMsNZx8n4?}iBzUUtrQ*;}KRO%J z#tQvNHPZ`ff`1GmtGsuXX^G>EG?$P6Fd+vj{%2!0>#Hu;a`1!{c!J{06ip7y7h$}@ zJMAx{w)Oc!n!kp|#^-iuF@>e_vH*?`VypaG79<93Rlf?ykB|T+F{vGtrls;2B`y?7 z4CmNR2uLxU;~uu%_$A2EU4)VR2*HBX+Q8IBkNSX&s9k8;s`%ZF@W+nBzN5*mK>}q& zrozskx1$LCq_;9#FR+LR>vU4^L*-1?=)$Jl+xSyA5q z-v`e0j))>Q>|GHo*w>CR8ck8`*t>!ycEuK3G}yahjV2cCJpn7msHjn~qsccRrih6~ zQs;hObIvZyXZQ7c-2c8vRWfsi`Gw_KWTyv1@+kVuKI6p>V)phi8|fTaF_GlR#m%C4R_IIxqWqG z@C41T=AeK7k?x@XRK09*Y&~(zA>-;vi+|Xxd-dO{Uaw`)eM`* zqI>M$;@x-FeydpyeO(B2(=k@l;g0QdZ5PKh*m(AI?N{zNtNwgsSN*7tRkR2-CO1x7 zl5uVwoB!l7O_3WwcH3BONc2fp{>Dwznaz6`*KQ{2EO$QETD3iU=2beFm|N$~TQkP= znmumYI3a4bjE8H>*!_H_ZJT+cJ2Bh)Hq9F?dxQU|S(DVOxp!v#sC%=qX){UR)H9k% z>c+;Q`rE!XH`i#*(z{_I&8uae75tCtYMvh6Jzbi4eKwIBv^S804sE7urEj!_JZnz9 z->mxb_R;0p?wG&xGLYvgcQ@^<_R;>Py(X)()afSfVKXM^QlS=z1+Ep2n}2laHgfJ{ zOoKJ`Jdu-|1@DpWjsEYO1@F%~mUT1CUBZ|%+kI%aCyVQEJ$s_I8q=G*zQ=ZE)qr7c z{RyXPPHHquHPRjS-&O}_)}fODNosZ66Sc_h%w{OTIqmyuUezy~q`lZoy{~?5ebkux z@Y(g*I#kxdl1N}~`~JgKlFM}0iZ+5eQtmuvLQ9KAVTnvTqmT5>xc{QfLz-wT|NhN< zyWp<&Q+l><=9Hf4-ZQ7P@J)47l1z3pYvFpsTQqIg)V;-bU7`)0n^RkLHW7pCQ|G#! z^f)Jr%^L;gpm@w?h~5>G(qn- zPwDxh8x-3^`$lMJ^hnK}fdky=_VzQ3hn?8{IJ;g1*YikzKiBPGC$vv(W_M0)UT&so zeeIOpG;QvtNrxOseQ~qdYaesm=8ic!qx;76GmEsp*L5?ERcQ_r>w~0m(;u%Nn^hm$ zUY*X<5l1jXcbD`WCc0PC>Um4`klFPG?uybI^Fcr)BB3AVjy2jIpbw*6)&AqVUyR}D z(6F-vF0x8J-ka7|f!&)$ud8#JWt;BRNGBgU&rItBrr+g`FD8j;^}pA4&m0=;e53EX zFlzVc4+j&;gaPt^wVFpmtv{~5V64tt++oG}!<#3!Xk>Tirrz!AZ{|fhtk2wFJ}Khp z<^oy!*{+xBF`VOdSl{ae+C43yXLNr1tVQEi>OneYc83+iMA!eP73{?NraBwYe(I0} zR|if@=^+j6z3#DY@|uAwr)l2k0lkeiRa(E?hN0KE<`ZjAyV%a){Ot3N9PaOAU~s+A zoci2Z_4)0Ybb)5l8=58G?U}5%b-psSs{e1cyG^f|u>G1LIbA*XDi5sFL)lojFn4#8xx9`L=q{ne{483%i;_cdbPyjIEDtX4Hkv?y0%A z-W|NxpH#Y7I#;jTb%Q=O>$NG@*5NY^c3DgthYhrG=$wAFpUBeCP0zWB+dk;?50+{+ zr_)zA+wza^n$Ve+_nK+>up?_d8*}%{J{{S<>+Viov#Y+R*M4_ozsI%u@%DjHcd>kUt=FFHhvyKbx1a;M`9&6n=G zBhQ;rKUURO-&OzG4LH(~gr;G3`)D>fQ>T7zi|2+LmE)VCIg=!8=Qjs=ZL!`~dk8m^ zG=pThyVttV(b8z6?$7>V^Vzk`c0T(_?z1mDdt805j+Jt~QAcNvL+jHtlJ9w8PG=-v zdsyr+9YCd`ljdm8&7sasXDzq*9oZ~?yN#=F8Czf3%%F?)awn}!KkIDvW@>$&>nQua z*|jbzYlYIYnKWu~{=nZ$Cu$kd8dpzVuJh7kP3#()JKYbFYY)|KUmhkmaO(6)7M{oD3_xA(DM zbC9Ilo9AlPT6FRuZKWFD+~A>Qu>06g*EHN=xm%?cZEo-wpr>DS4}w^ynWCF@#oSGi zW|BKTYUvFRnjoF|YIY5-|9Xq?O)HjT>jn0^!_29%J63v8xLe1#cgFO-AHp4`yUE@` z7c-kNm%0PlZ%NjQya9`u`%=Sx9XNCPs_iSZg)GxwB}gpj%HBDC(Zq;+voy- z+hbiNK67*JTbe$%x@+EOuI1VbXkzuAQmtjjY5E@4hC)kUf9J#913UBz$q72K^#3SF z)T-8o?Vrr4b-X&cJ(-ub2RE;$?f1ZG|Ib&aPx-Wci)Z%{d-p@S+oY`}s2OxQ;E6i2U3EbB$hXg$bKygDPV2P(u+N*j#ed%nq-yrZ`py@2XNcM%_j-|q z+as6ma7p)gtnRiP-)d&rFZGbkS@orwma+9^nq!w}{+!?5w(D#DOb1M-)vYA3jvclk`10n={&oHC_E@9e zHZ$xqc|y;Dpf()CbzrPVZ_bCC z-EwSelPiv+FE#(V`KHZgeu0OfI{u7SnOE=QY29eGPp~#`HXBz;@7&aE?=~CD&ejHS zlG|*A(`!!~#7UY@f4fzCvPayJhE}xpZ8_b;OSJ(RFrRpv$K3f7>y}QhHg$)(k58>H z9$R12?7^$;!y_DVhXas9;)v|O~WCb#dj9igica|UR?RjuHLZM3?dD7C$W zsjKgMzuk1{n&dgn0ywSq+jyNfQ+8`-$Mt`FalQ9j zOT%&_w5Ii*yamP-P0_fGs@Z)xz}A?lCF)3v(y3c+{+|&w|=ve-prjKyE)hy_Haz+ffMb?)QaXVxh!}9;!aT7&$2zcK3XSS zOSnDs74F!meaJhsnb_y+$(@4`cc7>lxl?_m?p)E8l(>GtT~6AkOAl}#HvjzCJ^W7x z_zT{ATMru9IaYMw>ozF+KeSN2(YX4OvGtu}ocLbdzGdv``OD`$+5s$5x2Dc^i|DX{ zZiBL(HYlB;i@G^egH=}6*R5^J)X8MLi}zu8&Scg+F_pmnm8*u2qaXty>g1E*;BrhWF`o!4|O zK_tx!G&}RJ^U@S|nBUwr)-kr3%|>N!?StCqW7$0I+&SM>%H;&baT6dy(?QoqW``QM_^)cGK z&eSWozN~j1Q=hCC|Fp*i=q5%tEo&YSz)TMr!3o>QSl zME!9;&8PwM+$Xu5WAhZ4*yzE<3NOx1DJP4Ub;69+6(Z_VfbvmO%bKL2Lz&p)odqq!Sr;bspuqI)yn4|lrB zYTqC+u|B1abyZ>2=49oXarJd$>+73k?FQ|c_4o|^pxZD1eu2B)dfzImNew=$BCSL2 zR<|DVjM{IZ)uX4nkLjB;<+<)AU=1GCh}b7(K=ay@^HnoB7jZvQbR8rO3 zJ?@4z-=<^3k2Gly_N+zqz|MVdI)d!J@2wf~Aad8Hee}F$qE;VQ-#NCvwwb6Khf65k zCD@)F^V?eW$7>pd8g4+8wtF&-5uNi(9Wx}CYU`o(N9V|oA2OwTY3tI`rvKDFK5U;M zw=Xkm?fjoMlZ(_lXmU@iU+Ou_T&-D;X1MiefZN}7@2N`%Yg2XM=x0-g)z7$X{2Lmz z*W98w|B&(9?kr4#Hsmus4@O%*oo8z6CtPbb?!xMNzj^ghv+C=b>v=cbt@o8`DxcJc znWXtQ+r4gR#u)duq2X>1HgNm|w_T4G8`)e8T11;@w^<)BxO?i{8K$PL_ncc!yD#S( z13KIFst((?q<_=Qy3@5K>a`^5812^PU}~4H`r6|Sn5_Kr0gLz%D z(_CAn*&*LBuD)$-{gY;<-P|mRM<3EGh|flvDPPv__IGAEVc?W&L>gnARyF5AOhSEz?*U!<*tv%#+VlT&q~w2VVf z-7xC5*6Y>xHdC;PTanxYW^_-Y+Y#;9j7!;0>yh78fBf*~YYRKISsF0Ad5D~jUYGh* zJ7G8UDVbQ0(DC0I8v1n9oci`zT1d5&RP`-dw6rOor-jOmZPmT&U)I}4^<{dkK=Tm% z_4RDV`J-EPvZFCJbv3qgny=%O4chx2Z4 zCDd+i9NpO{46d(jmaK8In9hJX1(_BMz ztQqPwamqDQ&eV8_=JLRR3DSpVoo}BZzA>OaXjXl5dy;O`ta;kq5Y@A3`&`?(?KMUJ z(%k8J7^?O|UF}_wJ4sy-j<@V;Ba8P^4v)~mR4SSr{dxXW5$D5n1-36SExHO~d7Fgk% zt2Yh0G*2DYZf8`_x!~aD(=V-ilH8|X*RAo*Is3z1^)27k0~y@f-VEBB+8(r3ry9|8 zi*}#Qz&hO)q(ilyz31&3sx(%&X}Ke{JDP3Q$j;vL)d5=C=GLFJH(I?fLunZd21d2# zIBcku6YZ4?{nZoT-&fcolL z^^NUC?M^LfZrt7jJzKQHht=;_ZZP#11I8Vy1?9V)W1eQv;AIoEl+AT}n9dMLZ3o<% z(>}M=#;kMwroBCj>d~{FJh49ga6Qg#b-mEetus5*zT(h*U!-Et)A=yh~w?QnPMed!*DyMhKuH2XwN zj#iBkZq;ym{mW{va`LL{Xgz0j+iR9g9=@vHki334pcxl zZAT`<$JK|9tsiX`t-FRd_fCARS=xSh;9G9dirjO6ztIBb6nVAg&0e$J#OR{nWm?fR zA;TuW(b*@Cb%V${6XMQiyjAMq^E4sCy8-pqZweMpSXbx2ZbE*qF~V+{+M<~d{hpQF zl*IMeyVe?1AEdEVm-Sq$-KpOd1x4Cux%1GTGq$+dXe}`8PggAJL4)MN z&FScI%?spryQ}+j`+LpAJ+0AU?W3{n+;+#p7#6?x{2&; zo)`XfmOBpXyrA2ShH#h=@Aj*Df9?5?)iCaTHC|?{?sjq8fu9Z6?N0Rr&CSy~e$lf( zb=*Iw{`c(qmzq5HB=xRgJ-Zlp7UXuAQ@h`AsTZJh4#he{pF5X2wTID_&SP8C+gCcb zYo_KTJz3Gss`cHpG*UN9tN%c)X>djSn9KS>1QY0s_!cq z{`QpUGUs)HE_5E=(Vu(A)|a>k&HQ|LJ>(GGZPK%YIY~2Xb^WmmX4jjy`Dd6LW80kP zxEZzBJa=Jf!sMPYMoII+PMv$Y#{sr4bat*R&C>A9TrZ|1)Ze)-3plEmM=LQK6uD734KQT+L=LQDcbN7JR zBkL`@>haA+SyS<)=JlX@vDx(mk%!xAjhfndEp@ioPS=g7m(q4>s=JhaV)t=a&(@##SbDGjw(J!B(fu#< z>Y}UuO0!|v!8&}~MR$nkFa1DIMR3QG&9lIx3H7M`2k6-Ajyd&xv+AF>w_*3TQDfQm zesNx;!_@Au4#`MYF}XKH2_6B#m}{&(3z#4=69QpM>UX53)42b zXy{h^XY>Xqw=8YomL;7TFJ7P19CdA{2Pw~g##G+}uh`wQ=SDN1rF-^{_-37n+6o^w zw!XJHSH5p}{c6uJL$@;Q<;FefA;;QPxj8V<-3KtY*YXp%hk9!k^ejJVb30;l@yjef zZZoFQX^V7DPrfy&bDey{W^z7plhZ6do3@X+j@1JzzT2}>>oc_1Y8`lQKYdF5?MXU; z@$~b}Ek)skTK8zQU0xfNE#}n^&Z>Xfo+tNfzp|$O`=#?&iVZaSb!~l}+s)S7(VBZ> zwNshYOx5M?xTCHn$u9J=-kIH}Tidz=u5ry0rLSItB=x6%=1tdT*ey^yH&bvy{kzFp zp7v~(rw4zvnOE=9Reyakbdy5teS3 z)NpbgVJ)Qdxn^4{Rg*X>LaRu&e%Q_c?A$`@kLD z$$Ia51$9DoOvCA;n)z|Wociur_5JNn|DZno%wf74t@{?cXY}cp98t>$YAET)CSedk#%D(^OnDuKhG9t=jt3|8ooG+HR*lZ9v_n>1tk@_T6SO?r{4( z&5q%phuVuz+q2QGQa1$XFiO%DYatw@BM%*M9#;aNj8UAgB(w(K1HY4shpXnmWu zqn*(^-)}zY$9h(a+YYVhwnO0nt(Jk)|Ap%d-SNlLZajf*4)NT2Qs`kTdRqF*I=|Pk z-kkc8S@lEh@AzT2%y$OwJsY{Fe020+bg#{(ra}ke6Wb&A8s1*4d7I+o4LidTTg`wy z{g^uo+D>OdQb0{sd#m|_=F^_6!zK5<4sE{INB68Foj|znRYIVBlRlWXihF-^l{Six z9#TKt9^UoHhPpYX)qRVedwk&EH2h(ZyYu|2&Q`HAB0y4onFhUUgE)8cu%6Sk4cr3U zKA5XLz0$kcA+0cfhqO!c(a!07v|-IhTYGPPar$6`+A~~Vov-OS!p(4fw!6mGk2Lf9 zQ4M8WS?@;bzS?uKmd&N~7jB$gkJiyk^B9q4R*z_|4`>_U!XxHzM#W5k;>Jbf8U+4g$1^F5RNHXY;Aucs4ip7iqrYuR33`?|vZG zTle$@@2h3=iK+F|v+Cp8pYL&fzQeRg&HsSUY3@(e2YgFoteUUb9Z>arx~$UHYvyFP z8)>%3u}`n?z4sKyT5!u^U?0syIkFBw4PR@hVNIehfLEc{7!By z+D&)2T%r5my05b=@>|_MqJxrQpKZMGW3{jS#2(rhtm{^*4+qpw&Z_TefA}Z#;a{7f zEut0=x7%`~NGIu|A3j@OZ*vy7*8Cm1zFPN)8TY#Ho^LjCCtxG>9E0v}R>$f=QlFwv zuMelQseu|jxz)@H_i{H5JiK%3`S58nJvQ7`O{{dD%%auXU2sE6w-9^I_|w@Ef; z)lalP=ac%JQ}iY8p#L|aee9R&7w)3pwfJm(TK77feCo~}7P-7$)Qz`U%9%*iecTti zyTeBIS_U+HUOVY|ZYSL=0ppv``Fq`(<(7cqo88~iMJ+%Gt zp3=wLdxq{L>p2J7URx-UPrXO`3PN*^&^|1>Tr+7geX?F(VxWgB)tmSF5(nvgE~$6- zy1&BxnveEhJu<|7h0FAOg{Qc$aQ{=AZNI+6LGDY`XIy;#XMARsd!f7A$3Cskc#b~N z*Ym%^GxQaX(YN{&jXY@|=1l6K`A(N>-@e#@NzHz>XF(k`M&}%@0qt3>jg+>D|9G+U z?H$;B#E+VVw0r$oy!+d8i-ErDW%aqXXn%LV(9ui--OuP_>7FZ{RQ1eRcS`beeNvs0 zOmiQr8OAcZbM!S#UtT>~m*RCq*)qX- ztZwG3CZy138`Ug$2h4E`;xp}U?HBrZCu)eg=Is9ZI&{~wX6#A&aGTApFKMqK3+dJ? z5w6fcPbg~Ek)h2e)WX+U#}})&?y5)5p4I&c^`|tK)@yHl5;xNhZa(8W|Em|KxDnyXw9o2r;0f#h zAsnCuSp8Y`Y3kEWe@=b6`m?4#ul}t1bEdzb{+#;rroX8Ey!s2KzohC{WbMptG{ac>*}wn zzh?SO_1Dy2H~kIu*VSj5{-*j&^*2m^OZ^S?H%-?`SN*2?Tc*FQ{+9Z0On*oHH|lSj z{;vAl>hG97OZ^@7cTIm!{ay80roXQ~OZ`35KTv;9{e9CvRDWOn1JgfJ|3Lji(?3@K zQ2is*KT-ck{bSQ-tADKiiRtdt{1f%rrhleBTm94CJsu?2Q&ZOftOb_C->HA5{#(=k zPyM&*zcc;!>c3O}Khyu9{(tJfH+_!!@74cc`XAN*pgzZRJ;J7*qy9(J|D^s$_0LWJ zv-;=ie=_|q>VH!Iv*~|T|FimEO#edtFY13aeXjan)xR+POZ6|*=l1S8{rH=@TxDSW zW$%B`hUxG6hcERX{$~1D>VH%JyXjx6|6Tnn)BmCVmHOAFf201j`aevcr~VK1Z%qHE z`ZwzHO#heqJoSH?{%`evs{hOM|ET{<{okhlSN-4W|1tf4>i<#yZ||;i6&2P0^{$cj z7P?kA@WBP5yQDB^=A1z@wIH9jtv3AHOGJ8%@Vr0jx>fI=Ox*dTetPb}1y*upooc#C zZ1w(W%_4VkvZd~s?#@m;b>DOyeQ2!1KsV-ofpscU57a}`WA#uyGCfg`)ML|A^;kVI zT`wrD6ZO>eTs>9KOn2{A%G7hyOZ8m6FuhVQ)JxNymXzw1=?ke>>Vr)mqCQxCA=BO4 z$QDx9tA-c&-iE3VQD4~fMbsBoA8Pud>O<8RF@2c&BI=8pzL@%=>cdQTL$-&hFJ`)K z0InBPA8z^*>ciC+H{Cs}a&h$~On2v=OQdUGxXZi~2%c(DK`iknytFK`CO6n`9uW0(p>MN?RWcn)V zE2*z+x}LsVudJ@8r!6pDtEsP|zN+cY?pIY`&Ga?YS5sfzbSIswtFK}DTIy@4uW7o@ znCdmv*D`%=^|jPTnm$T>r25*Xk5*q>eU$0zsE<+~ZThGM9`lhCLsc)*jndzIWZ>HX5`WEV4>YJOsrTXUTTbRC;`WEV2n!dIAmg-xXzK!}; z>RX$>t@_sL+n7F9eH-;{P2Wy^TlKM~e@lI=`gW$fK@i)if6Mf5tA9&N}dgllqS8-!Xk>_3xsE;>&KlSnI` znSOx!e(L+1exUmP>Iay9kop1Y2bzAc`hn^PneHBjagh4KrXQ+)u=*jUAEthY`k|&D zu70TcVWuCUewg~*(c^S>L-pg-k2n1U_2bolX!?ojKU6=#^pn(2P(RW1 zlhsdDKgsk{)K5}B+4NJ@PgXz0^wZQ&Q9sr6)74K^Kh5+r)K61C-SkQ7r>mb~`kCry zs82HeEcHq1XPSPt`kCrynSPG?S?Xt-ey;l2>gSmLBlUCC&o%u#^>fvKWcvB)KT z^b6F_Q$OGI3)Rn8zrgg1)GtuK(DWaxU#NbO=@+YCr2b>mFH!%o`o*UIMEzp*OH7}v zeu?@|Outn9C+d?;zf66y`lY5{u70WdWu{-Dewq5^reCRkx%w5RU!{J9`jw_%t$wBY zRix2jK3zs2<1)NfJ0)%4rdZ&km|^gGmVQ@`ExJJoMj zzr*yOs^6i0r|Ea8->Lpn)9+UQsrp@}|4jWZ^}9{~x%%DeKQsLv^`EK#-1K|Zf3ALy z>G!GMqkgaH_p9HlexK=6)$dck-}DF6?^mB{`h)6I)gLhZA@v8;A2j`8^#|1-GW`+t zhtwZ7{ZaLY)gLkaG4)5(A2t1P^+(koGyMtm$J8G;{Ymx5)t@l^DfK7RpEUhx^(WPz zGW{9#r_`S|{TJ#_t3PA|Apz()PJG=OVg*T|5AOL>CdW9Q=e}7bL!L8pEdn? z^=H+eGyMhi=hUA!{YCZX)n73ECG{87Uo?G&`itr>nf|i+OX@RB|CRa-^_NY5Mg3*< zUzz@E^TjyQW%}FdZ>j&r^mo*MqyDz(@2bD8{*LLh)ZbBm*Yx+)-&LPw`upm$ z)Za7x1NHaR-#7h3_4n03F#RL-57a+2{bThH)ju-*6ZMbOKQ?`~`p4>@nEt8yC+f3J z|4eT^v0 zTz!uEA5H(0`XALlH~r7*pR51L^uMV8N&U~J|5g3Z>VGl)3-!OK|JC%l>VH-L!t^iI zzfhmsyZg@kbz!)F^B)A}um7Z9^!MJsNMH2V`bB?N|H|}#sDGvYwdvoef35xx)90!G zL;V}m|Ed0s`aIMBr9MynpQis?{h#XpGW|d5|5E?A>Hk·of|DXDQ)c@PN%lrrR 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 JnZK@N{{gyjH~Iho literal 0 HcmV?d00001 diff --git a/data/title/openrct2/faas.sv6 b/data/title/openrct2/faas.sv6 deleted file mode 100644 index bb7ce80cb79cc5bc92dbc92a53cf07d2898f987a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2424998 zcmeFa4S1CGmG^(oOp=)dFp~gbco8P3A>dn}t&OeXJrnXGwKVocV{6?&EgP}5h+P}l z#@;h|nScn$S{taVfm#}Dm&LZ*MQiOOm=O9XvfXE0+-KK@cGnGd>*8+fVqbEe&pG!b z*vS6-csd%^F8Nx?we5D@&DJpFYa`AH|JWv{hv_uQpX8= zIF#Q}w7KG;Kwk6@o_*!L)_!c|S2}1P{lVwHsO|LL{XH)2&z|??e+b+h%HOx9Wr?7Ldg7#0Z+idOP zJ7<1PfA3qf#oC`pR=hH4d2eazeBYR}GOF`EKfNb7`2iiTcW=uQUGFso-~Q0#-~V^p zI{u?YMdc3{ZHa#Oin_y!r`&QukF96r`z}>^-hOA# zJFUH`XpgqHmR~h@@_O|5-E%4z_b%Dev+&19+HJhY8us_C$&1dsY@pTJPgX9{{=d36 z@*n5w-?yn~fA8kJ=-1!>y=N!?{(oEB^ljzQuc*9E7vFu&|LOJV{5v*nS*Y^-a{Ftg zljpbJ*HvD+h2I}MzUj|={q^jh3-L{UmZQ;tV>3O{`aN|GQ`EGjbVqMQW zzWNt0|E}?DeY`i1ACyMEX6Z})c{ziZ9n3;I~!W5GZF@Z|pbd&j!r3bn^? zHQe&Y=lZ=X*+{<-ZC>&y<8OTSYpvFQPT!J! z?DtQ*iuUHld-S1i=0%tMUx~dinqE zdUNt9f4DR+`Zve^6%-)^z?=bro2-}~)#*1qJWcW<(Gsqc?}{^BK-ljWEDeV3lc=`Vct-MRK0ZEv~i z{^k(=w_|5R@4h8@(JNm3=H9dIy6CsQxGsCPy*B!zXTEyB-``*F3$^e3_2l^`xBcgj z+IqiGz5h44w(*1Kj(qbTzx|5+{=({20l&S{+E-n6o) z#v9#m;kW#@uP>jy{=)D1ZGS!Q`kTvcI(Pru{PmRm)ADowey#o9@^7zw*dOndwRin- z_<6s5v9)UteE+BC>fg0#rS2#CnRk6=i~sz}N|oo1_YU4O`T5CheZK3-;XRLjbM3C# zr@r?&U;kPbKf0_Uy6Azc|KM!9F8c4wUjJ|Y^9}m^?7wOG@{Tw4pWXO{2Tq-9{Jw=p zP5%o^I{tq0?{BxQ^F6R+^TJ0r74&z3KVcd5bsfJ?Hc6 zRpoW(zyHw>t^cw*Yu`KL`vd2E{yqNlk8WEL{ZD>3d;8&(FTG{H$Bwy-w~{A^V|M@4*&c2ug|s3 zKCfMQ(zloQ)Y*D_=fCmLx!2QW@^CwT_>X@7eb)Z(OK#dW`T76qwm*NL;m2oQ`HS1% z?tFT_+m@U%`!DMK>47)3XU7VQs{HW__o)0HpSAN{)=qA*{eJ1{N8dmG`>p)`PnX`c z(f{4ow{QK?Wq&kzJ^t@2_v?7KKRWGEYp?Y2;(OnBKIpf%*nIO>e6#MH{nz-<|HoI> z-fPdV^XFSq+!VF;8s9(c&Xl+KzmNLo^W`efZ#P_|^RGH@=_RJ$OZqCeEUAcYS+~<) z&pLnn*1UgtkN^Dp3_ouD!@oS=+8fr{c*9Tq$=l}Z)_>E=MH-*1$?c(sK1Zf`|&`@YpH&bI5K!F~Ul`d$4e|8DEq zIc)o{{qQF?=i27a?mlmm?@xC6@>^7Q|DR3nKe-+HJov=g^gK=uS1i!;cwob*>EnS< z?eEw2?v+Qa{j(Dvx=!1VZrX3{A8%T)!Ec|sK;`+DpSb-e6YW%9^i1~B!HG6}^^azM z-thU+O*{{OeDI2uXZ!EsJe>TmPCUPd^SI%IQ^(tSJ|74a{I|*L|6T3z{-2`%tFLZ6 zIQjYU-`Ded!N9lc#@iccACG*}{Q17e_Al0a%7z~mzQtdd{C4~L{^M^9-!Xao$!%Ys z3Ju@3&iaLqkGl)aAN@SGXPy6hgPlkB^248gOMgAD-AnBEAMW{q+0WJ`zCPE-SN@%@ zf8S$8l?Rab1&gjSzGrRZ{j+P5CSPkK@AJR>j`{xikJ@-2A9?Mmx6G&f>plMOBX`#| zo%8oig{FV~e|-6r$-n=uw(WP*mc6@K@4v0ub*I07Umvgd+26h;-{Jqh*4F!tt+C$8 zEqEKOy3gK_JN{NllL}$)HXPkJu<4u0v z^y^9Ae%sf4S=GylBcQ?I$d9J-n z@waX5Pq*dTw%&PN|Fk>THvYBxAMg0+Th^oY`BC2|5_PbVpq|@4Ke15Rz$-hr->+}0|FaC=9 zv*Vvm{c613Li?d#J+SJW&+ql~@1ytL-Dc14Z7_L!?52P3^4mVXec+AdZ;Aiy_q31S zYrp@Kk6C-+QPa=1_rHEP*S7I)TQv7wxwgr-eA_#E&bgkVLOZW-KAiszd%noW|G_Px zb?1D3lW#A_{(kE+dp_qcR&~FxWb*UBZ~tBbzn8%8CGdL*{9Xe8Z;(JZPveWt6@3Gv zOV&KR{`=N0_2Ys3)nD%L+kSrjAAa-P(#dyrPA^7wymj{d;QEEN6)s`&i>Za{KMnpZCewL?pXis z*g5A*`uyp$%U1pAIe%w8z3*8&`%Bkd{+Nxo&R@?fxBlJ5xwfrm{;nQ>eX1`T*3SOg zMcH?bucxcDXiw9D6W2|&mlf@~_toC!@%8m?TDRnAY4rc( zH`2G}+QvWE-#V|{+D~rzy4uGNR<53LcD#zYy-yX+J=jGLt(e<= z;mwzwZLgjE>aRZg!-@9Z;YD|C82jFM`_bgu*#{$2mrbm1S>@uNyz%Y8`0odnt)2bf zKlji7ef;;1ov$qV$~~*vCa-7w_pW8HEc(_*{$h*uU-pXWZ{A(*Xs&JgdT_}7XKSx} z#q?wC|CsITQ~DLtpJ`jF^6Yo?NA+vZL!Vt~ZIf5g{?8n!Dz&fH&zWx6#2^3J%rgs-cUyeNV+LRTVZ(O-AJ*Of1soVdgPuu!?*UtBS;~mMrpJ;clT)E^x zYv(u4K0g}0rtq5b$-5ixzc1agSLWV+?CkS-(e*D+k4%34|8#pA`|ntCbk7d*_nBVz z1KNJzvHg`>H*D$26n*up+U_aZU#a&)6@St3+IU;@U)NlI$&J=txn;?go%(*xFK{O;WsM|VHk{@(xU{TF|p{N0?< z-j3Z{7Qf@A+Iw>CJv~M1_RkM&_>1v&ni|}VwSAw+wJ+GRp=Ix}zb$wn*ZxX+XZNCi zS$5CgjJJ0d9bGc@+o`|HwJ&;XXXXAMF8|FJa_xOv7B1fV!;jwl;&^-KhQ8=S>t=jB z*WSNl=VRr&>!*G+*RD+OExcrB;vZL!|GslzxZ<0auK0Yez2wm)efyt2_HUV7`)iM` z>|0bY#MJON3Q+oLkl0@{@Rn^nUNC` zICUgb-x2NzkA>Sp(kypK@1P`xWOA$ZG}CRUoSi1+vFx*hlm7 z0!bCfP`wR(hdq0z{rDiW24ZsF8Aq~G;z+S<&&v67!I->fj+Ayv!f8xNoL!bluuB4t zObbX%rku!h$UIq68P1aha#=VS4d_D|M@m96U+x-{wmAh=AsvXn3$)8@StHXVn8}mn znV>vd$%AL4I3U|92W6_{ISkejl9U%FH({VAfDmyt73-r}{`kr+wdqEK^)>NiLqZm! zo|h!#L0$Otns7*_IC9L9FV!*9c8T))9=Sx9n#dlKkSi}FJ(*b}#cq@xd~!u)ywa5i zU76O}$000{OH(pSvMqTDiJpY$FaQA;Td@nVF5##`fx2K>BJo0B7YN}tM>SU+T#@x z?;4VAUGjLH+*2T9Sd|pC$^B+WH_+-gGsLJ)(O6y}FJnvmX|0)NKzj3K+mMuWNkN_3 z^Mm{pI8q?n3gkNlauY2Et*8%YB%Uv+AvRg3R*j|JP;Um!h>uTL;Qgiu*_;v0HxtBs z(2FLlC)8{9rgOsQmT(DiS^gYi*8@56I1)1KL<4M?RrKyrKnIYpF}}l zR6{cSXq&@qtOpB{S%HISraq=SNUMdZ2G0n~(n{jjKk)ycTr<_^l{{?>L?0IV)37s-5~Nv-5`rHQeh^So39HW8RF2K zECRSpF6mTLuV|OHdF=1fd?|3SM>hLpf$pNqk@HkicNMfa@^W5fUR9+`b)<~(ovcTX zMV$ex0LbOU(`F#AtHsk5fRu`WykG6Z_OjJK7P%;_sK5arqBI*%tAwt7q(-sum>a-y z;*OlOvkuAy$!gzhP*PX%)@>O#o3zcNU77-)~B`b;-uY9=7hGfc^up!tzz8If?EWD^sPq!IU~iab4x^9ssc z_}!`D0&{{>qTzIIH$gep(l56sbY@gXO^!a@0AZ9x;%r9`sc?${J@& z5H$mf`sJj|?5~$+TWlH(x^2EI(-I0{7Xm*oBgTZxYmtfs&VlnXLnt0Un2Xdrx^pgL zfU=SN&r>W}5Ro29#7K0Qz`#jp}^v;$*4-6W?x9g%~cDT{-ybYz?5am*dVt`fED z!;vGIn(A74RzO@;jh_8UCw7a(9=!Tqm2&&glw9@GBsq&%ItB#_SpVhOoqs;CC~1 zN_JlwH+WP2tYYVhxb0Wct`Ue+GN(%|b!wg(d%MUrn2$L>rD9XmTkcaJh;>U59ChAk zrYR-QRr*Y%FsD}PN9z;XEyD<)67~vmDAxr&#<^=4_1uA3j-f?u015fG7(i3F+X?*UnzzW@Ceyv>LM!VF> zd-AaK0$M>Sft0n{I0Nd#F~4*^bLRkXxy%f7>yq#AqODGwy7)BMi*e)_ds*`!u~A4~ zLhTRq$J=G22YC5*oI`=V{rGs@F#nb&x)i z+}8&NwCM(?_1I!@iOl+-lRb1;_GJO`q;dtdP=4{TC7|+60b4-JRHY=yHdrfTz>mTU zJ58!ZaQ;|aiR+uRdED)6pl3%?Idw7m@M#RbJ1A`h$`Ty8uSPCRYM=9^BPml)D0y9s zy4=C;&>tuVK40>@^`4VrmRq}892Tm)NiqMDvm{wpk>dc*swSYgIXqi_48g zqzFH{mDAx6(tebuj}|7CXFcrZ%YMhVCsaiu$qsqJogi-MIr1DmIjE#;3vfo^6LQMT zCg9^o#^Y4L3(hWt6RlNyH@AisN?6s$S5^7(zzWI2>7*mo3agjZ9&ukfCdoqWd5^Qg z+=#`J?7PxGF!qdQ+1O8Gc|<#7T>?-a2*g6{yUm}9)txX$Y!NK9C0||-JR^1et!c#b zl2@q_dNkNUB-x86adybbbTrW@kHqSIGeMm-)+~WIFxPR5T4ZL1kQXyXEz)+iBS2@9Qi zKP><%l_$GcN^aH*QnEE+bJjCDqULxrorWJ5hN>zz`eX}@)DVC^23X@hNiGOM4jQE( z2u2zs=#sp4+3rd4G~eL|@bJw+NWs5^ivqtLDbH7vepyX=mBh<2FwGPtvI_d@YWIk= z;cPomS;7`2oWJRA&X?GU}`W*F2=j3h!a z5;vXdt_f;*D8mSO((b5Q!hf$A&|V?caX@WX^C?6i0X=yp4gsTsvKC=?$ws_SeoQtD$-+R4 z436Uy+LANf8u?^Aj?iqvR2jv9UP*e;B>bw=4`q2mo_uyzh^AUBWPZwz5az!FmqvmXS3Yd^4Gt9cDK<*&(_o^#_STK&Az3GVxp6F~;P`eD| zlm+EMk|8uFTU;PG`-9rtIf2@T`tavxz7LddS1x4_}4m-VR{Uzlxkh)VZKyf&Ie z!xe7p<0`%K8U;D|dBaFE;X_ohBx0-6OiU}M;d9>sDQi~SRJv0Tt-~L68)`^lz%u^_ zT%{~I;9)s;u=CtDp}QZDPcbOgLT1K1JQQbz(j_wobzJ$F!!bqw4jwnPeG<1ZE#^-W z0WU)2tNrvu$(f|i&ke*2r0;c3RKF71cZx|hMgFA7Cp;<1mtCB;4odDJ3%dYf)hl|6 zN{SLQL5Z(L#BIfGJPox-$5JkFdzlM%xo9^j`*@>B<+K`E;0l^G5wn`NSzpbYUJ ze!Y^(N+s?}I2lVyCOJ@3E>9CuCza%m!_Uj^phkmxuvsvu3ixT$pi<$-2y4li6aA_Z zgLytrMKBuU%tEwij-`w6ClDsaxop>c&l=s_AYx?*- z+XOI*1QvNWCs~*3+N)$|( zew{Iz)`XfHght^Zp@6akbZFqNEC7SQuwC{1C3})2;DWZ?qeg@i;{ZU1VXwCxj?_?t zV6I;wQp$nE>(<|4y%*SGqUQJw9 zxlRql4|X?|JE+d6@x_cIZy*~>q;S0Im`V%0U`*P>js{>#cHky9=!5Lwdf&Ji(;XdA zimHSr;RBxRj%I6>z>K3d``6^FE$R9;U6V=69KkO4kZz;hgK9Ohugf$#Q(F22 z8w%&KUINAfb$;y4mPa<*=&$?&a92Pa1F+XhT)kvt){pDhiXxqqmbc4;b;=~nzq0Hl z@{0ypU@I@?!V5Ia7=NJ$vKZsRkZ_grG5|nIYAML&=)H~xIqVFfyriBLRaQo$Iga!o zn71^iv6dIVFxI7!2%yD$mEn{x7k!=xYa%3;aJh9Stq~%xQE!l^9e})zs)3luWg>SP zL%n^#Fp06!-AxnFy2FMVX8so?o>ZP$Bikd2s0Fnw zr5O}^UXP#5Oj5S?MOee*A&qwPLS8G^r7md&*`6YdjXCWy&69Fia8)zDJ7G z!nnk=;$UBuWC2jwewt%_N@k_?GOfUqez;H@*P!!dC~??p9U!Z2v8f@bcFpL@y%tRw zFYJ(6LDjdgTkSLvH^l--$Z$8@6o^TlBB$myV8B@wlFX^`TFVoSP0%Ow(i@b8Lv9L^ zQLav(bJb_&w|N{L_i}?ICO`vtr>UMSti};ZDsTuoy2_nUXt|&Z60SFv%enj_vM6@e z+cGZ1y@HYPT=uChS|Ej>WT-k{4U_&Fsk-1(X{H-Y=i17{lx2aJep`1wysle@*WzKD>3*g&if^a4@zCu zk4-)B)sM%_SZ_%{LOHjbRB~3UDPcp4{Z4cOnZv;oM4^O+0EKzKOcSB5Cu^{aKon1a z7&QXS)6l|Gj))0?#!kyHi7IoMm>Zq!#%g>Gn!?Z7ma@vUJY?v#;6Xs9j^tmZ!vkuW zzhU?Vd8BG~)u>^z!ZN}VP7=G<+c2e`7Ch%-SPt_j=?Xsp*KjdpLHD(`EC`HYo6*TG zaP|$%N1?kNn5~st>Xh_Mt?!xuYEOZhq`=wW_6D3a+Q#h*d$!#%XpjUp9W^3(NCWU2 z7}}fy`D~ZuPlr6tL_WJxI6cdiWtUnuL$I+qY;3hA)L0Jy1V}>EG?*czE0FS#9-#a@ zqH(%{6Wm&g3epq6B!ww($dq^ht^r|;uK+#=>d9%-6~xE-Pz$e~t25sSA_?F0*^n&G z57y}|75$Q;iFq>rxc?d$U0CtAu1oD$k&8=&HcgeVW%lHwWjXv%^#t*Q+yE!MG>j|a zk#WV#D23D*pk4CVm0l}E3{k-@TTdBa>R=-P&n&s`x1bbVj#PSzuo6nSP1BN1hNN3Z zZ2%uhk2!i;WXiZ>aut@bQ3Ys?!n)a@0W@iMT&t6-(b=!8kv$>UVEau{=P|@|2Dw?n z`K+NC042@O2=jHl&&7JHp>>XQ2Tz2+&oGGsM?TWWbsHwolkJA4I&|v{%6&cE%y&(8 zeUCbBN`B<30br^lB4s0bYr*|{uQWrwV&Vp(JyPB+(-OUvE8wH>PkGJdTp|$6M_7^D zBgHQcNKs`sYrDBxVIu1bN%^mH<|I@j?h-H-7%tap!a+q_C5>`rgOo(zn0Ao++`+i? z8quH=)wwb8Il_U)x_>(BS&41utVZz_I7~N zrR{N9(2sJMtjh*8NEw_EG1nZZzMo;8k5B1U#i9)A+B(@@nU-?U_87HPHDeocbgGnXTuHGp=n_wYDwN|)eEMhZ_f0ou<7Pb5!BUcZ!S z0O7=mND@{ol4WeJfmBa;bXe{8Ji-dd zfGg3EZ`{T0`CxA&{Tt*_k(tI?#t~pnQ2l{W~2L{aKU`y9f&_ zIAf7KK3Ro;&L|42Bl$(Q4rH+w`B&DW`I}dr6-39iesDmv0#}uBwjp@|aT!s= zqG~#nj~jKc+$(;~c65(}_d%dF9Vj8oHs@9`r?o)h(Eza~i+I)Z;|HuL6a)3 zWla8|P(MCRKRn@OTB1#EAbm zNZF05qqJT9-D@mXSvJCs;lT+>?5vicAk@im0fU3U2RRWB8^Y8F*s}RJ4|3g@FCS*_ zi5Qg-%^*vggc8n)U@WXMIEIZ!JtxBUgWdH?dJJ(;zGSDQa`A7VvkBIs=BYl!};(^M57fJ1qygREJaOnh6k;BLJ^|aMR})a5al`_m4yu` zd3MlrZOD0oqd)BudmL8+tZ~6CHB5yqE`(EuouOzKgdC(l5|YUIUGX{zse{YLWL2OV z2Y1rWxH79wLP?mEu9paBsNS90iEjSTZykl1~ zuispR6}z4!Vdw1zKfSrBv0r6C6nfE-u$5Su?J1+lCS&t(ckZDBGMPakQIwpSKHu7$KO^eHJp;&A-CAZ^nZ2cH} zCf&`Nlp5f`%ueh%yOf}FI`4#XCDb>dHr__){y4Q3DQ;)<<_0}4Ipb(;w4SWtmz87b zw2Y@EAPh|=U$tDLH+-p9X64ReDT16r|B`CSr}o5*Hy&6pXuK1TAuy6YZUQk6s-(=SEj zM9x=QI$%^FJ6@nMkz-uV=;%>a{ffwnxRer=-%4&?Qs}z{b9kl_^;|$W{;@%QTNCbJ zP@W!=V_k9suP|r@0oR6lT$b{_4C;vM28z=_h&gUT)Ly(*zG9Cp?;c$BYE7$|M|+<+ zdj-#w(hRgOWPX*tIM$^azoI49v5cu-q9BstiH0Vk+DtB4 z0IA6=>(SdE zsX4R;z&4rR8t}RuvTHb`HoLH_Y^-faMmY=y{MQ~0gh;lnsFKa~l2>0BS;1(rAjv<% zq)-huWi|3i5`}sqcXiI#?_A7EiFI$t9@y3ReF&w~k)l{6w5sfOF`>U%WfatJCaXfO9bV1B zOoPg-@RE+p{Ij?zMkt!Jg=Rt@UeKp}Ftxj9Du`L{R& z=~3SkX+}skL>#KQy~gp}gkKM!PJg4^W)Xe1#WuANIe}-zhZT;@lPhkss%(@X#67JQ z#N$!2#1Bi}(2g#dTT`vTUKmrI*W}$a)l~IqT(LI77BuEb>yBJ-J;~7B8i00$9a+p= z9Gb$cvd7Ytj&5M*1*{urK{-JBumm9r?bYCZ7}VUVcSGv+=2pSWNQ4e1$Zt|O(~*>U zL~~rxw*=dWs2~Ul<(GKfL48{YOGFX)|6Nvbp&O&(Pm7Ie%~Y^A(wU7Ch+}*(gtbH zOOCJ@rQYiHp-RSNU?D-3sgaNdJfC?^WxFKre7z%}a<$B4GYV6wQ+4W8es_j)<$Q&v z4n`OqfC|BB^0d&tQ10yqX_}NX%1y4v*<;{pbvBp3G-c_iDxG`Ht=~dx9lGf{G*^?9Hz{L3ODolwO27S4$W1UQqHiTY)tEs|s0+ zNHm!+QAyfU>BeWvMk#ZEIy1cy=I>2gA6tmbYe zbTjN*zjD_VYW~MY9iD;Yn%ohfaiIQIsnOE>#s1rULz=c#3a%*~SG@HtGEEJ;w;$x_ z8GnKDH{rL^7LC1gm1m?d04Xa`!ZT;oo3rAK6`t`}xQSP4;&N{bYF?(!PlBC#`(A|g z&4{(^NR4yAF_;y8E#bJbz?Gko8(mu~c{LdKLitg>BSR}>GunHf%6^1G5 z*_YA)BE(BePNQ~aX-Z!}10OrN2u4B3*J5$ zPM7iMY$GXSa-HToU`3Xux1MA41nn(uQf~jNgp)H0M#ShcT}A@vV7%!H9uK%uoM0!s z*jcFw@)GEu-j*s($gjvbAhsSe59D?|P>96#pd|=2pO?B0rL-@)nWIz(AU4aPV)y~J z=4VU-6hB}O<4<-eY#MyXuOgbi(Vc1LT3@KVbNrn(mJ9x1cJfMCHe1D+t@&vuvA*TX zHoNCD=THLHy^>55j`1Gi4uyZ^I6qArRKjE&@34EMot=?MIgQ$$;-nYq1(;eb^aI|5 z*`5w7sgKG`Kdy#&%$Cgqlnd0H002teLrJL3K%)SQ_r~(uh5@OL^e~fjLVBoW;-Srr z$&BQs2}XdO#As7(BMjxm+RAUTC7 zh`BAj=etYOIImaV={@>ihk;@0x_1^g|d^#8g> zpZ9+#h=e??DWu9BvxQmcWvk_dZE+_KspSrM{rP&OZrT0@ovrPEKhdI zeh`G(%?uZ+zGCPNprbnECx-FvN*s=#K&c=WSIWYKoi2_LJvba0l2CiJy0HPcUhOKA zi7H1JlTA-%M%Kzrguo`ae)P~ zxFbe3-WKJm_NL@2r&V2QN?ran{;bMSHZp0UY){aUg3fp+{#A?54fycEvsw~2$;a)L z^iY%<6{SksWk#h$-Pq!EZ`!o8n0qMHh3)gs7Jj29TIgE2m~7wCD*u3iZ1xmBXUdN{ zIH@=qN+KkXWn))4C(OGmN>nKu=&gyn6x&c2AqD#SD%X8(oVqww3cFIp%%_?wx{GfV z%tzZvh;g$lpQ+7Qfr!tAZuea^rew5TYDmxZ^-C|8Eh>UH7q5Q@32aZT=#*FclycZH z>FLlD)k*R)Vt%wqyC8h=;<1qvXT5icYF>b=hF*?odsgiaL12$vT3d|TkY30+ZdE!* z)*9FJ9k!x&zSO16Tl1d1=0mq72jCzH4MU;oMG^+Cn<#D%rnz5mT+h66K?=k^zgd37 zfVTuVxj9q|sFz+FsFE2UWXjFafI{tTneR$|y}X`duHZVnys18+xGn*Jy}jA1RX(O^ zI!eveyK7aBWk-Csoj~59F}d9Q<(=&TPfsGhGCy~*ZmuvE&jiz|GxF=OnoMy}sM5SV zh{iz&ZosA9jY};zTheUGFU@ThByofWWIF#m_23KVRJS+An4V+5_PG4ozcOf-yQQ}- z+f;4gKLe|uXVI$7Esf((1@KPmo&IjGT*~^L!{)LGKM!1Pw)(~qRWTmSetuk8VO5Ocx zXQfpl@2Uj%04E0vXw3E2BdGH9OOdW2<0f43}(OI`HrO^W{)hV4g1$0vss|NMab0z#R`ExjbjoPouC&;>*N|G5Jt1i?>a~ zuLmF#)h9JJ0z%z{+|VP5Zf?bEaVB_JB%J8&v4qG+z}35Km+&EghE9K_2Rm?68#8um*lp zcL7&a_w&gyc?XnfmSf47;AtJjk-DH!9~=d~i&407(wOPlQBPHKKyDOrbW*I#9cM>m zN8ARtM>_OF8n+L$G-E`@jPP*4QZ=r`A?=uIChrkC>_j733XD)U_G*ce7?&X|e6<$6 z!ZUQz`7vpVn6zu<6bW!k-;~M=fOBj_lQJaZfg?_2)(}5-hc#m}&EZ^*t6szKhzOb| zqWc7-#QcUv%YlicjMd-B)atVz8j#@OpcbQ905Z)^R7q6!kc3I{QL%RE=>}NKJjGD3 zQLh$XcM^va4Vpt|aG9T^@YOC}bQMd$B5y{LP7C1-gu&XqZ*e77ptC3JrF_V;!EAP-H@B)t)BcY*~7Ud12a6Jl`?alrn7BpFx@2m1y+1W<`PyFLA#q zVWZApafdBLS*JUa@mhIjKZOVsLddEpkE(&pX!+%|Rz1@v)v0z!n7TlZER82Gr4tQJ zTAa0*K(p87O#-`6=-nkB@0J@eDE0c#4dcdK>lqi<3|5OxaJ8q0UWEdXcv(@dq#F+8 zkXnd~+l;~kgs^EQE|3roj{=@4n)Zt|lQ56s@SpIr6UgKCpemPlLSI^i8*8{jU6GR6 zW@Y-wg4)(!j>aq}BL!l2zf~Z;aiLdTI<}>I zGWvam`{HNGkR_a8C<7~;CIqFUtHwYdI@!RO{|S>78U1vDg)hpj5vy69il>(=B}5Jt zLKBI)?siTdmO!PJp8FisdQp3n49uhW#JH;AypboL2{n!1zT}9|{SYCTcGmYeZT{WM z>w5RX`y12LlRoK=4tGNEWQtd*X$wmg=gY$>_CJGY1xBqT5*Bnr!b@uGNy&0dYyR?- z-jN6bB<2zG<^?VKvGN2DLQu27+d8EROMdP9st@ zZoL`G;uEN)4y4lP3LHQIV}2_pNg$u%o;gF^v=IttYK#gBmI5}DS7GTQcDvgmAARsq%Tv$V#R z1y@P-I|E3G?#%a7O$-I&0g1Oq55qkQ(|UKup;|zij1lYiH9iU*t?fMjKy2ck8sc**( z^h;#G?2~cynq(eyh~dP^VACXTCLvU{v|>Aei7>5ZJACLBj#*Xp_V z>dDOMXjL?MA=fz1vj9A>PKxlV&Wtg>9Gh)elEL*Fxc^E{_rc>?(mV+vmi%B9AM zJ~G6d#i_t?2}ZL}FS(zWzslptC#ybtm6LTU%3laou%Th@E7ON zeWrG=FPG92N(;uj_w`OpD{c!?)2S!*p6UA2NqH5@1Tmi__lsPeja5G0cM^t=&VjHe z97bxwY8SyJoaj)ar#Sg8yo8u9eTr>B**5g&9kxU03&m2<_>wZcbuk-d|b#8jt9 zOwGgw`jjx;NSeJ|J)apS;p2N4&3roPO0Ur~WEjs+PB{0&aZ83cZ%!G(H^$_K_cGwGNBQS2O@NwrnpG;PCbf2MxFYDH?r~p zO+l=}HkP5OTlL!Y_AD5(0vlNE;LDO^K1$8JL;Y&)r`=o%m!}>cQve8^v z6B8Dn$YP{0114iz5I*iI4)-2zRpElajryIYcW9>5L>s`iB+na_68y2J%xsXtsYr_k zU#y!6G&jQT)HXRL=rO9`%DV#8I@$*1omvy zxB)CH>0m7KJol!l2?1Vbu7|oBwRFjttga{SuU}fny^Pi#bxR)aYl^`^gd^!W&yi{a%F&spVAsdK-Vc3 z_s8v&bNS1mP)VytmA$2WDt2XmO^b^(G-y?XFX~aLc$yCmgZ>^N-kG>7SnD)5i`HxM zgYBdeRpg0X=J2VEfp$szFa%bG$?Xj)cfG^81>A@{!i||K(6;1ooxXCW0Vsu0n%!|5 zTb$;bDElEw8O-a2;G1KHlY-lKd))OkvvU$Zm$BXe^1HPRw-ao_t_EAQk~w&W?8FK8lA=bEA{ja`vg zVSGMEu^5|WrC87$CF!3Y)$GFjI`hE^e9#6eOjau?D@JRyvImtd#PXZuUm-k)TrHa) zbMxU``tHwk27Zt)Yg8$1(Tx5BPHLRC92=)CDGzEJynedUB#{pzAJlrM$-dV!0p*Sh)%qQGUhW*}TtvkqgaL=;vm zbe#(vcGSBXaGqDKSojo~)$2VJ9>2khg@A<1Y@fDB#p#w2N2?^4a`46Ww4*XseVhe` zjKVlr=#{QKchFHRUJ;SmJ$1d#VvP-s*#WG#ku=zNB$(hb8By%Oqr(2&Dwi`AcR7GS z4N3z;YHiu#5MRWiHbjor5cchX@&MO_i8H$t%xlLT$7U--%vP%3xSDdCjpNwNNh=9B zWy}_EOX+>RAGd0S{Ff@xRppEDl5NO^8UW=TeM;D}oZVsq%=6AP1RJAjQI~O&aprYB z=cb7)%x0?!!-4qaoP}fnm7ZWm?rDYPGRi4?RW)zdy(6#a4y_Tr56%>BqBK(houY{V z#dgmq{=2~*%~;Rr)??sljnl_DPcIf9&=v7~@)Z*;zJmM=EQ8wJ@M6#-hykqAzCaSA6 zF*3%WGxQA$=z=GE)^ozCZjfLw(A|NBy|o~I`>@~l-8jNr zUsw=*Sy*oN-_>>P*{=6U{16hH;qIYYs=k(2_%SYje_TUUzG;6lgAI0%PceCe`jfvy zYJ<*h@PqyajWeP8dYoA-?h)^VN8C2di6Vc_#iT5&V*S2bcPtfgxJlUxWlUMr9>bTs zD2H`B?rszl!>xIJQeyElGh+N{O;eaLs8iSLE~RN$ftvCB9%<_KX-nz)z=&EcTumxs za${khzT;2aN-o%yciSolRUHcBo?!(NN7m0^-JAsE#%CPD^mI1nc)ChQFf~P#a`igX zEWu3aC_#!|mV7+M#_cZDDhcd`e|;m#ml}Fe&_oKGi@{)5E>^S*5)=sOX`;wVeSi!r z^-&9JarM53EN7T;B@p0?U;3KnJXYG_#JN7qXFZzbz%1^7-NdO7hpn{xH26iLP$!Eg zdTC7VAK_$B3yn2ubegaQ# zpF9E2P?lKSk)7jN(Q-gEs|Oow9@0RMkg%0lMN0f3YN)K#6sca#t!<2{o10HwyC zbvw8aKE|gT>y|(d@ZTI6k&mIIy8_$+@y$fmgw|47(|;McbZ(uWfEt7ya3q*;nu7Xu zEO|UZ8Ha;|?+x4}iECE~F??yI)Su@PGjFfPK#I7*FXZ&wWXVV>5tp+11mv?Yk=EDt zW)Xq9@{rpe&yZ;Gj3-Vc+(xPgogIB_x`4YIbFXt{>HuYX)wq?ce1vOSFHzZrZhzhg zOISU{Q)rYUGtl?y{095zfKoc7{bNl-`J|5fCrBMY0_)e87-K}f4{QDnKM(#(eT#=5 z)cE^$LjeC6NnI#3KO%KnQ!`%56w<3vcx*Dbo(w@kjaoIFJ4fOYv@EEe10JXs-Faj| zw6_M-)ae0WF~8d!1=|cz*JZ_q3ns(K{$5 zl>HLepCgoiL_P{adB%}mk_t!4J56#6NNfER(!lMG6atRO{o~vL5+RT=5Syl0uU2 zzgR5cDL#?&-wOUsxTGK&BKurO06*S^bD&E*LLbu4JHYfj*cTT?X}8)T0Zlr|uR-h} zw269piPqjxRoQIc=_bcPHjMOhmtD99lqEsp@Nq@#Yc2;r;-_i2QcY3qWBIw4N%~^Q zt*6nw10?$pMjqd02CdO^yKmaithL6s0Yu|<47&hpt$13KD`mLTLWV5)_TUa?FjtXO zPe7o{6{*D=#m({$aTPvl!|CwW^&yFSXkV%a@o|S>;KdPJi3P@9ISNnpcx#We7DKXa zPlD+Nx7qeh!ji4Q`bn*ZH5G=!*#-Rs>7wik3d)VOUdfS&+~~>k5KF(#gLD#O=24i+ z+W@??Q|4%1`4iII>T#pL>V8=(@fF=tKT|7FczdP_K@f;5hrYs*DhYpHgTAspo;PMxZLj3`At%I0 zijD{5L|}&v8W4w*T ztm7=LAx6p3noG}elR9*)s8vS@v7De=O;5+bFJk@e=WvdUS}~lvh$D?g5k#2 zRcuW40JQo!0+KwO<$VpFe7lPeICUe7nO+pT4M-@c`Hd{(&pl55gdy(rA!ALp3K zW>D;+#HG01YIIoRxj9QrRRV6%%^s2Cje2DUCw+sJX=ajMMIPJR)Je|22R3bqnPU0b zn1p9FGo*SL(U_RKoQBNg7p=cO|J!0(kp-p9XRD}kq1GD1p9J$1xT$2=uW-RK!NF_O@{ zj_-4C^0#7S1A^r0_0leKtvR}JzoST^5M$scy&rzr>Uq-nj}*BX>+O4Wn0Kq8)%8X* zbJ=>mqsy7kmHZ8wfiCVYEE!gM(2gM!S9EgdsKj)cSzAS;sjI1um2uwld;PxM9Q){{!ZSj@t4CH zbh=rPp^ywP!yNQ-DpM85SQ@19Ft;U@(##tMJ_|g>yyQZ!MEu&}i;jnm&ku5G>ki7y z?6uOEjyjdxm{j6G-Z|n)Z+D9{2P^Mvc~Nd_0m8V%M6p6KP$f8w{5yw9COhjjecs4% z_Y%)EbDPcblqcFDNLS_PSch}DV}xDw)n@Jyjz>PgO?=TyBu!EWVyssFHn|w3Fr^kO=08 z2fjCGnK=HlEvV?0``Ab!IUi#l7@B)J<7thX)+OBwNG_7CO^nu^Rw9zxkv`l^;wVxV zhhAv@$N2nd6b9^}f~GXU-6k(Vyq-L)752}z)UsHu8Z}pq{4Ksqhj~XJCAZ>a@7EVH zeAZDQ*P_CVY2}Qh>qrK;5EMsqLAz2a%ct@XhQ>*H#6*jvrBY71=CB%+>wi-PT2!A1 zD_@H0`Yb8TwsKclnxWE;P`zwVmKP?lqSbiP1Wx4BdV`y%h(UguRUcGng78=pb-k;3 z6@@vpC94IDQ7)j6`cp}mM6)L^dOM84kb&Xiy`9YUkgN6A%U#?}htAX^Yu2QVEiK^m zMoiy>wVD&#)~mBV;zb!Y#!wv}TA&_I=Ekwg44D@p$R~YKD9zN7|g>k9_8u+Dzf4k}*`0|f$>Z{1aGSf^?L%{J^Px+0jCn&NgYxEs) z&Txr%y+oXI3>|KD&Scs2WF6RNZAq#$z4vY zvuV6abvfs~-wMC6-UPSb`UW$zW0YjA+=e=tjmR`urN)7jtA4`Ph?2f4+*xf*shN}1 z;-ZUP2fAd1!D?0cSfADbhj2>dqAUT$$47K53h9ZwNl5 z3RM()9G_UpjLu zbuq8v8m3pT=XmZ%hTN3OtgO7>b*j2O+l9!~tdulPbd;s_x{E^nW{|%KlMW)D5Rac# zYB?*P^^@eIxiZ^Ro4==t>oeSxPU9H<9Z}^RFU!^h~fM-VRbu)~2s)mvOt9Rjrv1B`d^l zTh8Z29F8gR8XpYKV%A%dI|_N%#e7OsEzA1sj)$Ac!zcd(LH`wEB5`E9aic^XOMej!%xL?L+b zjISZ58+T;QuTfB~m+6)!Pd5DaZF)JHWO*!2^1QQ6JIiyUDhO&2@Fv5aT->eRv>^nm zV5wzXG|umprXBh@MvC$E%OuTdS9-Oo_y(wmmYKcSxWkwM-yqN{l<5|Eu%$vX)RBI! zhoH~caBRd+(P*dryfqVoq`Pob_y*@tW&T`0tu{3!?fRVy_p}m@iD5$tcn06i;qkN{ zGy9x9!lSwheT6^%|Ma|nE9Q?~89#p1xxg5Ft+S)LioF&&v4eU+JU`e!>>ZYQ4*GqP zgpvH=dMz55ZXt{#vql>#Ax9IlJD#+|G}+x^i8oc+avQ-bV@O+ING-g}K#59K!-zDm zXrMB$NqQUlSTbj(L@5xJZKJBo1Sf6h$27Is&zFY0tfG5L^Q>EB`*CEKM~1`g8y(Rc z*?x}k{iK(m%hX>v6g)@dDn1i4>Qe9S=Vh9;u!*j$JjP4sWDvFMuxfq0I}qolriIhB z3%ie3$y6e|;y+@zX>xwEpQus4)^8(lm)Ju6I6;ptxK`pddVPx$Q_jkFW+>?PKdFwy z9QpWZ?Q>A(wPbtt_v#B=S*c*TJPz}cRl{T!B{0|v&({V%w6I*Q@w|K|-rc;RpNhnkT}VJ9NXflqx=3A@vN=8A4PbbID%)z=!&=Uil^96F7rkpQ%srnxR>{}KL;B)vRsBfF!o z=oP$~eP(1X=@w!ILh%eiGtPSfpqmLaj}y`A087XI=D885%!%gn0S^T098#*|aTy%s5H6I@QM-5Enbq)JGRClpjNHRN8<<2gEu#By zD8(B$VYx;BTB%f5uqD9HFYvuY25>||AIRbQgX%Qr%f?uz1`RJM=*4Wv13~sM)6qd$ zqNB{LqJv1AFIj3th|xjXuE)5P2^WJ0vNl3z!gLJ%@d3?Z#=-$2e1+UOnUt(mOPCiX z(i0{{p-KF)i8}VwOuU-am(d9Uh|re@(X<@h)Uas)D_D}daEQAu<|C_beA?BN^pyiu^ zt!y*m19Bz@E_aTP!!Sce_A@*B7>?XZN;3H~e9e0v+AJ>`v_s4S!INOJ(=#w_Ckc2lcJH!t==bmI&H!KJ==@ zqTPIjT})t|LZE8V6VzCz+qz=u=w`NQfE;h>+p^Rp>_1^!FM{`7i3U2gm{&DbW3J@H z^M!IK9zkb{Ujgb6(N~ff#9dehKzF>(+HW1Lb6K`3hj-9ePDtORn#K`Mus+mNJ^V#$(1-c|t{ zoG&)2Ek-_W+mJ0x{VOxpJRI7P-ZBJV(D+Ti@e^NZTNl}-85!6gb8egfbmqIW7R{EF zrjPmL3*juIQFZU==t2c=FwhyZ<-m~gc;5gCy6l5iMphWQMd>D0e zvN`>J<~HjCN7@-1!jM#)Xed5|-eBs)JW!8vXhhU)#^7zbGT)_S0F=CZ zSdgBuM1r&~+wn|xMqj}0em>}bqtjo>IYLxGh6MZ3h!AthqT~IM4ew`g2`?x|i%Q zGo7{S5E`mPU4}sR-u`J#ul`m->w1?mSh9=S2u}4JC@imhDFiyNLeYc~KIr)}I_uRS<_AqSOGAa>91DM3WO(OYY-Z-(qVbHYl4bk%840kutR^A{K!Ht%naO zK0TQ!K_CTJ?sP%jo?~68x4dY#yU)?Ww*X5ZNG7<`qW)C7{omJY7tu+fMHi*Loi(u* z^Il)bdE(Hp#-dGEn;lZP5=g2}5)gdc-hoYZzAw1}gb0}xG1NdWl|KwHag8fNyibiG zp)@4rXpA0FdV*D{MgVau@(!p{?m%_tIjnY$hwD)&S53+)i(Blq*=8jbPTI`_*jK@$ zaeDy+%)V`lF~Tgi((^8ZEkFUX!p#_eBpmBI8KPvELc24iKcK0#K*{423B{n4?>KY` zgmzv_2{f_x*Al#R`(NmX&p28FQvpD}o&ci+M!hD`1Qh%AnEg4(=);Lp<5fVaCK-GA zvP{#pZhb7xwjA~2c`M+lgYK}6Lxv4gyYPJYk>V@__9vhqwjtoWgoi3K^`;y{gBaL z(|7Q};Iumg3ROVU95D%HWinIy32IfK*jj*XC;?8&)6j||iwXpa+TmKy8WImC= z!px){NKm0ZW^estcGo}V%k_@|#tFRYC(krCVi#X=k&n0&GFV@67kk;k^z7cYP$=~t zT6nE%i*#UdlkKCZ>QyL!{2sfH)|+ehU09eU2@cct`*`)7$wE^hz{vb9vEb$*%J$hH zkbs=z4_&kUEldE6bO-UC=8zUJ!;Ig(7XZQ|Cm8&GNOg3;F+Cgl94XhU0l}IAKQoRBg@0^dmlz}-^3b8-=Rbh3!-OmXB!voXG1kU2D^~H093j& zMeXnElYGM6i?j8)FkmHvr6Ns^A;`DNGwZJ2uy3c_I;8?aB9hH5UXm}`X`KZsUsl&j zcGsecb@e?wpfRvbVWhP83oNPe$JEYvQozG>GLEGK1)Zpcd@YHRCV;2-JDCDQ3flr61y7H*T4*x zW(6pWv^}gL9zkyi0A*b-=dC3YfFl~sN_55v%I(r(Y_@GF+Xt4%YXGDs%ejSzD@ZTA zN!rr{8|!KI$&BwnJ~S-R zOvb;Hl%|qxtOA}aTcE_7mBl4mUZ7iY^@WvOJY8+f0adDX?dYrxgQ(M8vm9&qx2Ss% zWIAB`@>38HtToznvE1$A!KejI06C@qBMZ%30bUi`7fRKl%4}Q9&@r45rOS}FfYNPA z{zV1hV6yfEzZc2$8%Uu!&?510Lcw&*@yjSU1v{J(>S)sO%@r5pfwTT{SKt^5f4zj` zJR(kdPjA>u8yWA(TtLo{YG#!QEW4kw+*NiwW)^pnU43$t2v`Q6OHmm`hHVWVhrWP4 zb=3PXRo>-=+EHcW0df`Oc65buK2aQSkee3B#bgorJ46yO4de1S&@b^}ies$=wRc^! z&kIb& zmSOAZe;u|8+3uZTkH!Mk_=TMcS|>QW^FmPLG-JS0#AA{oLNDkzYZQ_*$9YohJz z45(bpT2eE(olPPRPd?YH(Lg_ouJXqb=++Lzk>wb$7Z3DgRYB35=cDf9MP1RE9+8mS zOx*T=N8$ayT?u?Ov=a4WM3yu4(@VzoXR8-J3JLck&1 z0oDu8$6fuAW3yF5wyi|ds{e`xwF3eyNpU&UqXSQ5_fmZrxp687*fJO=&<}`mzRWm6 zqqv*QVGa<9y8Le%?9Y-=s7qopm~Yz7BtVR&k5QL|l&_E0K6Elp0AmcIJ~YQy)@)Pf zIUQm`%RgE zC%@8nb%e?4Xmx8sa_-O}&Y^V$!f_*=B%sF5*s&pFCoNl|GK5u-w)B)y7zK|&DNn#b z>*9+3S;}#8$O@CZ$^I*@PmBElNKjZWgE)jv1_~i0&MlBkP3!A~YGi+mPXPLFy^&7* z44P#f8v;?M$o4;LRUMB1kc*OZ&Xk#+FHWz#7xw?*8Ey2;WQ$x*c#dnyDLsT(>rExknCv4%@;7XXhe~5fDKr4)~#11vZdPsHc zhpii{q+$i)-i_s8Rm;M$jmnC8_2(W8Nxk~>i!AsR0&OZ$)Y3tEQS@j(Y~x$&+3PGk z1hd|)MD;)nB$-wG;K!N`9y)M3=){{G<>v8Tdp^?fOIRB;p02Ok!zbv6>d!Ey&Pyz# z-UPi?rsqAwG8#W>WT=3ea&}x{WxZx+tTV5tf5>t*u|R!2%Z(n;i}Gmo(+P2&pur$w zM6M#7Q1vr8FsL}5L!B7iCe`~dJweq)x~W?})mRHt^FV47zAhnXxdmBY$1^k2K(US`=xG{8;c|W9a}bEeC|0J3j6y-^Q%B>OROqX-gmAiL$N{ z`W|X&n0ps!uy~BLq0{{D5^s)`!KubpKR9nss2b$)C|O~mvgk10%!Rc3wG-sUC47ul z_{~1@eYE84R9|Gj;6Gv7_D_g|)>6k*PY!5(N!VkLrSDO=0~8$3vMOhU6JHNJ@jI+B z0kkUkB*U8%PGN)OY{A0y7n#GxnqFl$)kYy>7F`B-7smM&a7Oo-yf=R>n-vdor-&ao zhV$9-)xolG%=L(yx)sHSuP*d{@3gulAZWE5O}1^j4r&FBaWe;hil7Ye=gtA`GA~=7ZIX9J_y^;-bXlxJq@N`KX%OZT5DdNbvSAmQc}{{X{BAbTDd$&I5jDQLWUGW%-P>y4y`t;Wd28}v3lhO zv@yhyY7S3^$u!GSwK_1JdoVF}nr|ohOSz%;*MbrlWRNW<@v5zF)&@d}wxZpFbH(L^ zG8IW|wna{$O~k0-Kwz;N&?NXBgc@_>7e{8a zW?GcXoSIm|8cMXGxP;HHa)*XyQX@1P*o((}y6!+H$jM75q{Aco+@ca!0c*QnJeFOk z1+nxgs%pvwf?%7i9*cC8Ib3ON4Za8<<-`n_M$D^Q75~~7H%R3oMhc>=o{{N&l|^i3 zfxAE>N`tR9*#IdKFQKPAzSVE-Io3Qmbs0V89EzLJ%{2Vf><6wY)W6as$#J}~j&kK{V}?)36cY}Hw$xPc_pYus%q2`VXNfC)wv zT$2q1ojuh|6k7xX?mC!?mYfKS4FP%mse%;bzM#7+vOK!ePbIpmFmC^un4JXSyD?95 z+{izg1DkfTGwZXcEG}03n?UVcXrJiXYO{w_^W=w+CAOteghuGJYX7;;sU>=xlQnL) z!PdvD?>1X4vT{T7zyb_|y%`SrmndM!j&w~Ypa7lB$uHYtSSps>+6fDdp;fO`TI}C6 zfhk_GhipeEGazO9$=Q8b+S7>D@(gD*)+kA;G=pBR95zHCwUoDTcRgdR4h-^WNtU37 z@8Tr@n&>OBj3}#w-AFD(I?X!e2keX3@`ETZ{o}VM;U9E;@oh|Li3@=<;k36|Jk9$< znQqVn5Fxp<^FWV`A&;wl)wJKQ{8nIVQ%Pe+Rd~|sF(_J=tJPzfPNu^P$nItup%fGy zfMe+?s& zI-h={C(AU|2c^QlyYKZR_O@J8M;MMSN#|4a-SU9L0crLr<=T%is}8gYW@9UJ{$|=D zDBvd*a#I!Y1hpb<_Ga?{G}ZBDJI1eHCTUWf)7L|#fi+Ebdlhe_u@ap-*-u{Fv|n6z zjWyB0U&SG6^K}%2sAy@w=$oPYPhVF5&M!rl%5yJz1H++KyfzrMf>q?TiRd#3+}!Pi zV^PHSx_x3DsN+fzSFYK}iiU&dpqN8M~(odBZ_f|esK=Th2f4p zPIed36Xx8{F&T(#53wP%eZqerHPU_Epn>}+Zz91B z(;*p8KG}c`#I~nQlWCN|oD7KVpcy7p|7)0Y*=Ho2VswJ5{LB7`NO}AlXnx04tZT~sWvLH2@c7G8+JPSeOi_50m05e9T;YPO96t0Ra%r*0L)P9lrj0s&MTR20 zW}nSoZeqbX->pH-k4-(M8k_xjh|2#)+%JH7+-AnU9zTKroR}~ zl>+#Gn1QslmlC9cpj?%K7q*yhz9>*6In}35+h^(i2JaP$Wz>R!OE(3JG9?6lygNZi zbXU3dgWXqnuVj~}!3S0Q>`7k|;wvQ%Qy)^m952U0&7(RS7+v(YJyx=T{$8JE&$MkK ziXN)+5*xU=V!Ox*#I|8+3z#9)0?qHQ*_J&y9Tp`;JUv5wGUOgg=qnMc&Nd) z;R+tcrnlN(Dz{W<*Mn;9+_gGo;Xr-a25{t=|G-2#z*PuUoQcI)fExaWA9Bt6|D;w4 z)xF7n2}oyQrD_tH=2>tPe*YQV4E&-E!cC$%|BM|JFIyK~!H^vkl=vDZ zgL5puSQoeV+9kn;+xxQi)BPOvjCZL5MC^2{=RbDGs;ybc2sB-uvTcRrvI&gx56bvG zSwC%l_P>wWjuEJ={U+0NW@ZR1u568C6Y0s~WXg>*YM*TTzNI#38f)69bbuOnAPKU| z=+PX2YYqewT%{fgGMpcgJ^xWKfXmYqUH7DX8h?_RAN1J+T<26#M$?fv*>yjXdrFIf z=iN%mem3XgU(ph}_&dYZd6_O7Ijv!uXxaD3aO&x>?!_!U6>FazxI@I_LocPgG}?N)GbRE)UYaE5HJK)jz(Hv z=3>}8scK@6%O&HMCp2qF<3MJ=Q!EDJTqhwe>IjnZan1gm1D9vXb7-3Nv18SEDw?Dy zK}3{5$J72OmF`a%LJ5VRwKjwi?W8v$k7V>T4nFDLq$mv?K~Y;gbrK!tz4s}ED$ zW50#Jr;?A7AdNR*QcEQ$Xh?Egl`zj5x@ry`+C#JWTeI= zoK7`)axqt0TB?Rm4L)O4J+By87Zqn<9b{th@88$5hebzny%`ekx+xZv{(BBlg;bTY zSQu&pc>7-6b(r>^hXvHv*et%Balg?!Ze}nPzElXN#`_>2xwo&YsI5hFd%Bj(P8;>p zfX`?7WR2N8%YQt@|300^h7^*5ftO_H)(2I`5>Em+oL_*0L&A-(O}8e{=WE< z(`9)Uf&f2>5vxTvc@dZ*mwfO_Q1M_>F_nOdzUzqM6izxAsJm?68j`3ih~r>wsT3O#mUQAyVkLx!kl z12BX$iIH1GRKY5&Kph&m5fy4)*QGPio|^)j#C6`H=;WW<#}pT0UnG&KMMd#E6p)9^ z?&2ypOM>94o}HP;dej>!nLFo=tmNmo^@3^d_G2c1LWz+=xaEjPFQZuXvFe%a7Q3oS zG;L92Ex>hY+pYbw+Z#xdDNN@l$09&Hj3VdhO{~XyKSP-Ek~MBu{R3E?zl?-GbfRwO z+X1i`DxkmCUbkpI3@@powxlh3*jZQCyp#_TE%3>_=!^QtQNgb(bM`8qLxQlx2R^>b zsi1`_3FNH2LQ@;uI|s>eX^?W7 zrHtjlKgE$q))r5hX*B41?D)}$SMX&xu#*F}H%^QmBIlN4PoM)1WWeQh0s;!5ju-p_ zupMH^_u#NK#<*q&QI#~DLXGRrg`2a>eT+jpp8LeFkRb<44HG;lsx zrov|f+AN;L!h0Jjv(yK#U$zkO!T)Q2(v}2q^%< zwYD`{F3yyf@LJp9<_tGOl8=&-8TQBmt6Yh?ZH=x9>F05x_xA6L0114Xqc>m)hZul~ z*BngHgW$BzALt4Ne9Z=l@V0PF8DbYu@SAAa;}qQK!}mKK@dU}O8Bq{#2iTSrGPK?P z(_#p9sAisD=NuHM_6X=ee#NgC5nxF1t)uo@+$*KZj9tAa;BGPz&V&LQ;Sso zlu|A&!-NsX374G5Xc7#+C{IFR3$M$;z%NX}Ff{7hD3WlZHAqJxrzb?t`IPy#fxL_r zvWklJgW^!30edP5lY(YwB*=w`mn2%3{CRgK$nDuhR6;(X$-CqizlExF+<^9e68b@e z$zxe^4!IkkD}KoG+OgO=aC8#1V4JJJfD+zZniKse8FmS}zK`o)IMxbV z5AphkyKHlL9~n@*a1ce_MANeI{zNI`QohK5obfuc;2alVMWR=UaVUPoNrWAOP+_nW zS7fg6L^$y1iL({OA@>HEZnn;ELuK2RuF_S!;s6fyW2?6(iDN6m^I1&}Lm=K8Wb6S1 zSg129jhc#c40$?;EiA@bHQ&`Vk&@I@5B-&Su-{*%V;4y;xrGoKYD1SGIw@TqLUy)O z4u0Zkx|L$OteaEz+KfzDs@?I#I<@-~U@8feJ&Bfbhp%~zbz$epwOB_x;(**!NColX zOBu$QlA7$mjES#7{*WqUH%f}YMw#`Ng8joZ+b=2G#0s|aLL%gIREvrzOoXw(ntn{` zK4K}H>G)Q0wOnHCP2BI%p<)E&&s)~1HD7(KhdaepXZM*o7Mo3fxXW*4XdbI2(*|73 zYSwjd@hv*-lw!7N4Cq2i59d=TX1#svEHg|iFKV$eghk3UUC7q@duFQoDl9agh3gz& zaL{;5nS-^m{h4Z1o*QJS41rl@frneQo50#xvL`U=xyUAhlPYwR>A5=(tI5f81a7}U z`K|^YfFT;4A+q*Q^)`;koW1>MK32{6MmwCfhtSTK0y>Q&8((M5BbL1V487Cg5QY+< zB8M6a2zzkFu96VesJ_p$gr0fP71*C4aP27ZUCQjMV%^yZ)=&!mMF%$4VBDisugIQK~X_%lLkZ=R-JXflN9d$7)4ATR+7&IqT9ihL)^z^fCDc<;2KwWITrgX=nn=^b#e> z5HI;&#FU|_USRds#9GslU$UymKeFkt3wcaYQR^75FQ3RFYg~9*>bKuss?<2>x5wmb z$bay-W8g?f1xtRb=Bi41R7>9;bFW_i6zXRq{04cXsxkn(&~a`bD&ZLSO%?0|P4pJv zxNN1|qOExW(xWifmx(d|f;Oz1wUM_%ALJX+jI}*A+Mnn`F&EH8tffy~rcUs6-uq{591Yv|+)Slf zBz5o@MBH?LB2plL;@Hezo?KoiY9mF{LFAfbn~uInR*Mi2E@7O^hrI&#PA)^-X}}Q}}l=QnNvH=;FnIW|j)@wohcer>56t)MF7H_9xfukAzHEJ~1U|W3kK%2FQVD zhP;ici~hbIRbpudD*#EDCktM9n63}KE`ex!32f88`rUV ze)*=UtZ47!o&4UjlO1|6N{y57-8tuqgukARYQi3S-5=rr68F+tMzRAbP+P2R;DvHW zDkyuV2eU;e5?9%3c8|nDHK8c-&#S>*WmZ)azV=8e9}lS0r+K9mm4oC5kTG7KSX|qB0TP^{FE^oX*;EJ z-HjSOtrj88!mR{aoz~eYMbKRKWmU6jR1AEQYJ{oj8$3t;4!6W=zoS?nW!k<)?UNSc z0ke;%VSDJB&v!v|UY+J5hrnv!^wmok8Bj(J0IWWSd+nCo5LhH{FYX(3l0RRs6x@mi zE*C33FnUzr3ke}{DO4$US+JT1qh%VksuIGD!1PjVKLB@FNNTB)&YYAXGBDRq_^meX3Or!QbUTu(D?M3|E(%<*sephMz1w2Zh(2_`|_n-TZja}kBu$Qe~L57j$5 zfrYve-UbBucXbFtfSJ?V1E#o+K;Bt_K%QPkAZ(695YghhQb@1u^zheQ6c(FJYB zBMX?>i{zcv{qbMn0Ey>?f>^eO-B<^gLaZU@g|j`%*he{B3$Z#%Rd6K0oqlCVW0mpfz^fjTdF_>skom-Yyy*bNKAT-q# zM8nBh5|jcuQM<%p=7TtC7e=QsTr%%XQ08B>hrHl9% zV;qt4m3jB+1H9PVI1Ed1k~q<8m(iC=ghJYwE?ML*=tq;dAWeco_%E&MkuoMdvD=OR z3qkLQ3j+JFO#q-_f{ zv~+~5)4k`cLzbOt4jS&tvj2L8Wp{fIdGUCIytu678m6~x@R}VKchL#`ff^#9z{(>0 z1nkqogJ%=cNk3sjd)Z+%&BfS0*v-a)3rdO1Wtb z?_ANPAP&p5n2S3r>A|wn`J6;!Dt%cRoFpRbWCTP?cD7ox?b*D@h~try0~dk@8PQ@- z%28ToBl_g5I2Z9FS5$Q_0*TuaPS>f3j)aPMD>*p8g@lc$+x#SbqLBd5?hJ-ZJ`N+! z0NHaVQaMFOI?-V6Kq;>GqSW+tYCW0nE7o!f?OXD8wnKnTJrI_t$`DZs32pCMSjukf3v8o(du}S z=vn>BXe?-?=p9oDNPC1>UJ3-ZFbl2y<;321*^4$oURbbXf05}$F;si1{k^4pu_vd< z#X5}R-}FaW?y z)DJ5y+F?LvhTxjnqs58_*)fbU#5^Sdv|F6=!3|UNxIea!i9)D#DQPya7YTUyi<=Wx z;M~+3qq)3t96;IiOsVKrEccliEcY1!&~$mRQtT}9F&#wB#1F7QY2lR+ab4sXm1apB zn6^jh0?yWRfXp72xIa5Mr}&}J1B8=DIXQ<)qe;q7kE0w_bkk|~>**RZ+khuL*IVuD z%4Xb2tXuQ8!@+EfvCY=IKt=XX5N$L7c*xDZR=Qs`bE~bRT+@{#*n3ZpJV=-=zM5=e zk4ohLU`I1LBK;mu@*@&q$NM;p;1rHXkLi5iJCmt_$h6YFW@3OY)C2Yn(cL700B=d; zb|i}-u&=mB?T&CJaq)%O?UA!w>GpKp1WD|O9mQ;?a%x|RFX|`FsFe{tBAyj@d|I~> zM@fRvRA`q|y>@e-+B_&KBMVNr7w2Ad*H5c?yw?&6!E@WmHd6Lp2>h5V>8C4wczc_L z#-PbfS0@<^$8jt~pK^v;*5#!f;mjCIF%oupHvk$i6=B=w`0ZG!X1AC0=4Chjfd&%0 zkaDA`Vt}`MWV>bP(L|%U3y~Bn6}srkJRiFxiI5lH;QSu%XY&;Stx8RPVy*6eWkW;T z($^E@i&`9}qL4RRcw-=(X`@iaoCwUH~q#a1foEJ+kFX3_p!;Uqk<}Cw}A?> zNUno|9$|v-77|R5iVJu`7&yKv>)vv=obVW5`lfuR_o&KGh@X!KMPg_b`6q~XiVyU? zo9wTqm~M)&DdCc4p@&G2f`p-4dXx&0lFEaNU6Y}9WUtc%y96F?#?qhQrVU+e&XekF z$fYcHGmrxCaJ~T^cqgYMLj4fK8`!#-oUI^|^s@e^b)LkOebv#}E=>QgqfEr7fFl57 z?CHCr!kmTp=LCyQP?m1n2PQfCoYMw;z<8wi?or!CwtI+9&oi5EgB~WeS+YxG@CANU zcy-Fw4u~Oee@OqRHhRy;ju*ccc-D)6$m_i0@i~3|x*Gi#d`}ms#qf6WPOuQRx1XT; zbL@e9EfvZFu+>YR#yz!ZzHgYVL|U)e=d;~ptCn=$PbNhuPQljmI8vAb6pNx5V$0Ds zb$UbRAGh0+AUZFL6qZt^b@(KCgC4;s+QW_+A`&CuBcTI0p&sOTO4dE{s6(u@2CUnU zcntQDygXF(V!(WNH?kiJv3-N|hh|TI_@)1jkb$K7din#XU_MP9Ow96t2i~eBYYN}x zLE1%GzQm$!ugb~Vt@Fl*ZR=!LJwpivaWa)BTiq9*2#NhYFP3?OFN;XiuXnXs7m^qZ z)$8f3%IZNGDCOb1fCBvEC3KrByc&!4D}q2Xvm@$##p#X$`#0peJRIh15gv^Ux)j+m z?6(A(lP*@W1eHd6#0&@kRS)$$P`8L6@Wt#? zJsuhOKcu{(xNgDir-ObT?QWe@`11MYNJVb#vnco!QIYagpxZo1sMr5*Z1GkXQ-k&_ zW!86>_>fxHAbq*h0lRX^%~r>3SJQxc;ADR5!4s5c>dDXCUGfLK$IUd+5~h29O7?%& z4kDFXPy!r;d5#67NJV1i<#I&nKtzW{E_7b<(*P`B-pVscpz~r+KyIs}0<@$;css}W z$Dfci(K=}d$pmSGPZSz>3J1FC{d<}yYsw4wxDYa5 z(2w7;P?)I+*<)7ldx2#~sKc8;>7`@4Wl>GB+!h~<38lGOPen4uz?bGe#W&XvZ~*?4 zm3%wq91t6cX(gmSTC&n_1&cBNd_&7y*>aL$IE(nEuwm(fLv^@11?)F|Wi(gN!Kxcj zj27ldxb9gQ&dJVI|m~hx`RjR8GAd{pr!@ampAQS!vp>i*6*c~RKJOK^nShU9p0sK$}OqXX7TmaZs@L)mw%J$#+- zZ9&>MQ%l*KTxz7QvPV@?DUVV{LNyje#7ztCGo9-U3#3V+jhC*Hmx?*7alY`?3vMs) z)$?LJoZ={e(ZM`+EOYey^g*Cv$;x6+^J|nlm-{2)mWvv_d=q$XHeEXg?Lfn51dbS zACGq}$%RlBo(!iRNnZ^{1!Q)J=!nAuf`tlG049{T(SII`qDE6|viQjt+;kAf7kIOc zIR%z=C;7UHNP_JPggpR8Cf$@e2_XejV8&b7p1Ax52m$oXKAo$czx-?vM+O|DDRghO&%e&!yklSTDl z)0*fC*^#t~kQ%+79|9x^O7;p(E*j|qIUXjiKA}rl*V}C;INWb3s=O5l8PcAf5{>I7 z_qvb$QGS8Nl`*Oaifl+i?_pPG!2I5pZ&^l7RVQpsjH)}CAUbmTdjrm)%q%&d@~PA6 za8a_G7KwH!f;>Be3iw3L4iKjBnSvebM_yu*{AQ$V(8S6;wgIu!XoD&8^}v_DRH#(yKn zNEuY2>p#%v#emnKrVnaTZlS-OVzuxW&SR9yB|FW@+A$$%_tS_rs<0^a$B%=C@r#x2 zi~?8T0`;%Kh?h#d#@yWKqk~Bous7>@LEKkV0p-o2)}RgQI*l|>NKnBS4#?vx(B89G z7QS_30>abS zup60(F%I`BeLQgG+wtIpz)GDL1EP^ae@SR&j7SNqC}krRO-R4RlMl3rKqof4RU4o% z%MU~90u+)M1Wp`bp#>wqjgDxgBLbMN&Pfo5`GY!((ahD3&Pw~({IX?$F9sChb>FN` zBXo`>PvJaS^Eun@S(Hywz{tB$X>`JR0n4dJxs{509b9CiSaxKjbRpS&Mez`w=15kU z8xCx$6j?`=BNr@PrCH9p3&vqu)G)XbsbPmp{r0#Q#e+gy@w)pHwYskyRo+mVWe!$D z(T!&fRs$Gu0-}JDh~~DiAGlyQXWB+aS?l)nBqS*0$O${#RYi{Y53o zysYQ~Xz5A{D73&yJDE;$7Iyd8rvH!!YFSf?wQ!I`G3TkKZgGHE=2V~kLT-~XFq#YF z0yVn8YZWVhevIlIM7`D9yOsFU5w#aj)<(|LTn*Cir`oX{Qqfa$PI9kv}*@w3Pv}vDw zzpU|7kr$;8Ki@wLv}c4OAkSj7%-gPI1UwNhQeo2h3iVri1>quHv83KfT(*ue%-1tW zMc4?2bKE(UI10(_QX*GS7#Vl~pm=9JE`2OgbQbeF4Fa)^MJuD7Uzx*fP;kOX7lu7| zC=$wRe@e$TYrhA~=$Q56~o`Md1?(^7e301B$hjRr|FM`c8W^ZH~j3UN^+N~QwgJdDs?kD_>j=i`y!TxnDq#pi>y zV4W^<9vrdM=^pVam3iS_M{inE)`B<*XFmxaIDV6b5QJ+=;2ZOb`I)c`kS;7$yfsDC zU2~@CCMLcG*HMPb8=f8j#Ym;uQ5hnS7oni2tQ4|Su1JFHFijrS7qB}EGx#d!3Apw% zdPq_>;&f7LQsco6lBgg)2`Ik6LA!k}iEp(`Uu#2A#4ID z@I^<}FU_&mXi@hCv!xbccSm@5;POS7C_0qf9pO;y#Rawvo9N4j@+x>~6#6W65)pyi zmw99%ZPi74YQzbjWGQ9U91;o%=VznjwVk#>qDk&I>Hi#pnkqEBwuJjGbv0(i*2MU_ z)0(vOKg;-0Ec!pR1JA~JV87923L`Wb;37MCVs~(JZ5a~4iR^Wm>$U$f*9gD zByn!oDlEwcJDi$b$XRsGO8oE>C7O;?;nE2>bewew-ITiu%xWOGKPTDv%mwvsfcDg+ z4+WLiS*cRl9wg31rolB2mNCgXkWlY2X&ebovZ@fn9T;%`(_dA-vY~Af8?`LF*LT;+&IE zo?szhb}$2^*F+vPyC+J3VMarw>O%}E3aB9>ji4tlGez(r#)x+V4)=jJi7N4K@ZcUv zId~GMnQzV`?FY3+u_M1g3(jQ&SHQaS`P>wTvVoVsXao zN5F>h0lTl&-lEO=q`d+s)s{r6EXIJf#6p)C{W>7x@{z5ii6}Eu=<+nifz&SfOL5&e!@t*zRF& z@=sbuw74@J5vP z`Ww--vuGlg0sH6p=~WNI@b|xl1@f*^lh`RH6$-~Xa(cuIPMbtrT!UuPhcaV*9Ea7d zhlcxZz@gk{r$%^oW>i(X@TCr!W^L6zZgtD+A>dVX#UsW@6N53Qu@pkt=(6oIqoSp-U2V~=io1c9HmXXTaRFGvTfWqC&tR-9ve8B`@N?NGxWkw66WFy zIu_9V$~sXCDX*;^y>6$KTtakvj^*?_Q{}Fp)iw|Au(`>l&PXufi z@m92sW+4{J8R3M9Y7OFZw0$d0^zXM@K<=EAHPBD)@aUY^6WF$i%A8CJ)Er4BaI+g7>gM`bCfU`^VBapjt1A6KON+Ay`g+vqqob#0_<N^18@;za5l*1snf#Y+7xi}4vm;5!d{^i40H|> z^Mi;u8Z5JX%sVdIuACjtxHSY9gxSR!#V$fne0KA!H~JDd z!=El&b&l`6feIs|iJ*5DCa>TxlPxb@yOv*K+XxR-_z0fVB8&`#d=x zvY}uk=D@8g>JNk4K6j?^VAD`ySurWwk_V3^4;CeK&e|hHXjIFOz|cO*H8p}R>_K#q z0Uf>p#pXhJjvOSGf;V1Z2D{PM6oL)cx8usQ7^u2OGv*fvR3Ja5$AYkDX96Ck9MzkG&duxUt@LOh!sC@e}e5A=L1WS#PxY9iyIJO=|5whTLO{pFf;RV z1;*JApM8My9QpEMFefzRWj}_zwcvVupeN6Jfi!qa1fvk>#tjHQl=(r(e(6!LW+LV58n^jmao7Brx78o1GSBz5^q6jXgN1Xpr8b&P1aFjOiUovR>4Hv5ls2T zk##Su13j~$!AlwLVXWi`MfXE;{mQ-p5xfVD*nwp%SRL_&kX=fxaE=Q*;6G%ST4jxV z`Xgu(Ic`&Z1#;ws>Ci6qyxwuYZoW=tVp-5vjWHr?u6fape(q`5P!LS&c-*TNdq7~N zA>zc*<0EoJr+{6DSSS$PPpP&A%zdX~ALooI!SFoW0Dwb?-c0ZqjvesnA~5Q`gb~u+ zsILN}$|Q-di%>teDcNRix25R7R1iV}S@pGLsSDwpWeI8QwC|(2hHY(6(0j6*uIqbr zJ_m?h#0&OOn)$LDmz2-V{QT~URk(T+wjYqi^Uchv)e#(k>r@@Tp>5R2OdQuVxbiH} z4c&{xU@M!vAxfJ)pMbZKl!&j_G_%dNwr~-t{yqDU4)(zQGlHYG3Pe{X(}Q!?%F77B z!g}d~1CodLwyB-6-m{Lsdspag`!Ij{MG72DhH^8><{Ym!yGw_=Bu8-`?c> z>HTx!=+GfVX`B}Orq*5=(|q$Y^t_k;Vlw5FKaq;%80rCW)B{}Nx_&8=fxBk6h^xSn z)~I=YHO-G?nl6z_MyIE{dhPqsK!oR~(eiJ^Qxwl@xGo}o-f9cu6!C3 z3vvc80@d$|FS3@Px>TR%0;qM^;HX7J7fC@z`NY=I<;W2LisUd2l)>S2EZms4O;Ol0 zpA~@Q8`20C$fN5)%sd*ifjrhP3G(Jyf#Q+aHiUwYdfGbn3)zRdaN%Iq)=A_AR^Gve zN$7#IEdT1EpemWVJ>ZI+>7h_e)>+;ZMz$-q!{rt8u#OuiGLlS0fxYq!xs5gUaEFEw zis8HJh)y9X$d6!wldcTQY2pbexz#*I+#sFE)tBru7>6Sqq)uURz@M^Kb^S6X5w=tNqV>AGd-(d9AzHY#=X2#kNDsT1ET`D5X`>D1|tP(n|B79cmminiC@?Jm-Zv2;7|jfw)@C%_{L;QF5NaRf0>t% z3*slBlrY7I`;~eA7A3Bx2Myk_ly%yd9jAjBk*Pquz5$ zt{zA;O>(FXz~dt!B}?XcDT3Q5kzdVTFQP^Awxt&VLs~JG(GW0==B%hR&d;v47&8#> z2l6m^0F<;^E(r$8zeuRu?m)U-&WkAUvcm$Rq6m;b#$7*J0+MJ79AS`vD0ZB!H7gM0M!mrGt}pK30mEbA)XyX%&E=lrkzBrKnRZOn9Kd z?$t4)^0uX$q=Ix=!;V`=1I}GpR9ZYJvh%cLbxe!Z5v0-4Nv<|bG$-~08L-%XdtpDg zFGEWOTa%#0pGQ*czQCLz&NuS_I(p>v%cNnnBC%4f)-|*?9BlA z|0dk&9yASjg`0&4)g_lRj#5Rjo>@Ku2Kz92NpZukbMU8FgjM*DtlUT7K&|Tm5SCpN zZN^1ArikOa6}uyi9(WQA!G0@c>#rACnca3*-_0t;YICSHUE%d9Qou$4YIg!XUk;~1 zaXmoI+xgv-C@*fBnLMKM?e%=ft|q;8fvy6)cVPcny%Jijhk9$Z=e?CTzAQS9k#;rs zxw}v^PA={jyc6BXKY=&-!!rVzT0+zyyyRPsjp*3-|vP3wb(n4 zgO#=q3kGp)qYAvo0e)W)jw5HfeGnv8dc6x`2f5*1LpzCdB z7HlKcG`eqbvo&F3DpO2k<#3F#kc{yO#^@AyzRZ4ywfYd?$oG#xllT{h`2YPGeSC(6S_l{>Bq3Kf&1_RXHIGronlEz zI!%G0SFFeMd2P$o^=;86CPRr}0P><1*{an52w9aRK5VNFFq)U7=7Cn(x{M$g;d(#^ zElGLyxwE2Y&Y0adn5EPK5e_|l>!~DQTsoz;j&7+bLUqd$HjwG5q4EAW z3t9&W~lsRtY&nMLq zKZ$MgqV|a;DG(hzrQc-Hfv=KVUKVduZG~2%@~DN<>)kDuCNZZaXMfvjN3=WZvFi89 z1zo1XdWm}Ujc~hZ@-|O?EN3bfPjNh~@vbe(eN;&d;iZ&>uN?|^S0CsnBCN?CEyeHn z`QR*mg%q@0uYwlK(eglk6%vZCm@4XwBQ%A~v;ze!*vLW5cDEBYz_I5A46x4p!%+{n z@rSa*e1EP^X#qP5PW5Moo8_Xls$Z-~z-|GoD){Q9@tx(8nxefMya6G|TRFhO*;VX4 z*F~Ng&DjGw?pwxyJEPT6oc?*+A0dF$+vwL+=L$24Lc1cdpB11~aU=n?Pc0)M`vv>x zM7E&Nr$ca49RUF)Q=S~B1-iKWfS?l$oqvse22kv=Mk3ANJCq%x%w;Y*ptyAzJ7t-* zD<)OJe}?T5LW&yzX@dX~z6n1_piaQJqg1WN#F>heusn7J8qAYLH0sO zQ9wJ{2x8T+^1K=a@lg~6iDD;OJo#T#*-o{khofm#-$N2(|+9}jj2hg zFxJkpalL?!OX{QAcJ z8gagM-d9SB>V!W>Gsmj2m6Wuh}IUMwWD2xaV@PG;0sQ2*!~FX@~pR z?d4ki?&{6T>i9$EQ7P6?eI4V)L3@0kcrHo_kx;&FtNjRYejQ}JfV^`ruhdR>s&9Wl z$d%nEqTILN9^aqg|IgF(oVD0*Z%4K%KO8>am$XayPF>q4z@}4yE+L9HraFBJjL68H z4)osXJjX@9qa=`JdzeS-`o=`IGLiBEqTio_sUWhkWxv)r4KgQP_#->{97KEt=oqe5 zk*FIWN1nu$oOk7lihK$f@(;RmdH?82xFGy-PC~cs98@$zb#e}m^3fFkC-?>Bw55(; zI4tvCY=E_FX|`3!t{T=k_;>-|g9A3GEH|vM-yem)HW!8aTq!-kQABU#ye&UL8C0f} zg?n05;a8NWrO^I{0BSui<+ioV!Y(HlaY6ALlRe#BU#>veP4P_6f9 zb0f6VgoK|L_ka;{_AXmVGOG6YdM0&(pI|8=Dzuq|NS+HoI-^RSIVq1CZ5@+Hl!6tS zS^z$X!Nln=@}}=5Dq7J(+sU5)gp(F3uRfXz>@oa)=nM=7g&Qy>pNK_QX5+J5*~}Mr z+po}fGoH7_6T3NqgJ>l0q^17rx^T4SRY!nISysRu^$G|8o4z(N5tSCwvSTDcA@zRH zvUV*Wlk#1)p%LLQ?92)vhAJqaXq5kpWW@HZD)Iv4=)%7D(M~U~GauRi-Zhk4sHLkt zQ-}rB;lq9sCH%JwcTET9+Q1lUza`Dl!oGTNG7}9f)`*=Dz5&{UHzJnx0k%Qls{_=b zcP$ITC5J%isMZP1_8A<~2G}a__zi^ItE{Ytq(sQwwq!@JE8{%ynaP$ZJJhPQr7ePA zm(<^ea#N_TUfamr5(Ksb2v!GgEFZTlu}0;9qc)ZGi~}av&dFwOeNm>jxjA^F6@;*Vi`9_?f8$bh#U z{NWg*ua2yv3VcE^x`H8fD?I#f1G^K7klk+Q8YNg_*sLOx{BnQe?nGGM#eTms66YCO zt;?UQU|4Ehtn8skZ9W_Ef`b|9o`5ya*hyV zDDxA9BZ*Ds>^H4;nI&ve8|L4FfTG)uu@b)n{|W95*bfu1ix}3WlbS$7)@u%wrSo8Y@I~f*LT5eSWJ+smmIjb*S2&DL+lLfu$=wc zJm7(!bOl+nojZf>P>l~yB48U&TeKLEp0B2$D}FTMKf1KyN4B}~tF(slx3&APNNG%l ziWj*OGZ_ky!em1mPmR;ify~sWldE}PtCS2ztKoUJ?-#lU@ZBi++zs|CdsI-9Z!V?+ z4$mvov&haE&_ep4Oi&n=e^Lwc$3lYF+ZpZS*jLegoOpYnK#MH!-VspK`x&w2h6PYc z$uS!z)kgqMi7C80)nY#n8SPy!QAcX{#T%Ok@YHc|rCII( zmgjk}qWhWDzF>43e9q@GeS%FWzAv$*YBj4}27NlTgMUZd$f_gag`NvCold0@_Tf!F ziBU#VJT=uq#R_@32qj?Q@;N(Nv$gCuoEs0?Dq@nItRB&VhtdhWb99G+YmfB4d!$kZ zKKMEboemJrjZX3NQZp2Kr+pkym{PH@$2b4|HM{$ctm~`Gd~Pl;kb|iyq!vo^dPxZz zSXoFO>ss;DgLlwe94&VlH!25m^ydoUIe%wvy#7j@y_CQ8He1y+%e%GTjTa9tzxZi} zz^K%84k!?faf;%^mUB)b415I*5)JB`nf=w}Z^nEOp7=7;mI!?!(v?MU>ZE`W=#q|A z{yGk>+1}X}x^}XE$kwg)y?E~=E29g?&tqYNDJK_I!`d3F&Vr-&3?s6hC85vHf_GbT zAlyU55U%mRT|&BovRo2QYyvEc^Z5kFx{bZR)BZYGhO>7ia25|`l+v1BwH;!D+9dMJ zzlObMili8C;lQaQ`>o3BsFD}s%~cMflC>mFecTloVZ)hGhZUmE?mnkZ*X8jMPNS(; zL2>NEwI~t=u)m9JD|E=2-s!exDTvLpk#`e#p2w&CSg3%ay{#FEVl#q4SWKRvPfKh+ zJL6gjZeyco@o5txTfZOob)b%yhXw*RgcCxtn)(x0Z71SAtdJYWvUTWUIYPwi;hv-K z5BGqt9|mAoa-5b1Q+_oUU8A&!-R;P+0Bg&f0=_Sq2usO_W=9*-xn>VtABphrZ_g(gX{W8aKF;ept%oZ5 zzM>YaXT^dYWH_CJ#Lni)i5xDKJgk-9S>d3=Xz!Z>_%=58nmvBQ zpmI6pwZX}fuV73OCp3xgrYzR*mV4T{?%}_*@ zkw`Wj*)mL-HN=}|381HA+qk5jvKwL#mrT2lGLF!{CMATP$6$C$mvakW8&iQSzYZ2v zu=G_<*XTuZl2iSx-I__LDwU`aMQ@GB_h5u(WxM>TN)gjSqJ6syteSn^1Gs*Nl)=wlvD9IXP<|33bh2u;eKy&?wryKa-)`*JaaGa0*RL(-yE zz9Nn*QbQQB0hu9=QbiB(~N-GD(1Mqb<()SIFrK(al%fG+>ZQz`3csB$^St zy8v^;xgn{dO8Kwp77nPDl9wgz%zq8%dzcTnFMG zbp}xXsNEKjuQiUExO>8W+yc7oZ`FORw+^-1UK%Ud2LXq2zozUntX`e}z6}C=^Rh#S z!nw|Wvx;avR*&lsuGwGI32?lyXt3vZ`C*T<@IC3_e5szKvT5L?e6SY#FKwweDr)|5iC?s+noqP!1Q5EKg6`rix#u@5+2*GF zkaZ;5WQMvQfl_#CqB#q4n;$De=e9~Xfn={vHuq`N^M(# zq3tk^@?1}-@ypiUIVz1ZrFNRS?3eKy3J8C2oZa;|^v7C?UDUyAXtE)?ZBwQKm6O&4 z{XkXi7!PFpb5B~!Kp0av?|HymW~W%=IL9*}@Wf56+7Uh=!wb8af6HPNc3bzq^7AwG zUt6}zRxS1rMj)GKCBM#=5?u2Bf}Yvr(t50TM(}h?gdC-3?SD&pC8M)-y|yc1Tp~fX6E#%f zM^6)s*bOtKL=c%g8L^s%$RKAb*$90M=4$JxRP`3lp{gY!ICb|p-m39gm0FHnOvQN; zT*(Njunw#2n|ZjZJ|aS~U)bib`-ND1-fOc>HHp#joI9R!L>1FO`%%n(aF$6-%@ekZ zvjWB7Y^<<-=J!IT6s5fAiXx2pR;&8bC`b5)f~$@7f-5m82we@GBbtYd4Bb>BFN6>5 zh_SaV@+|Q7@JD&ua^2M0z6mK%)lw4jQCcrfBtM{$YoMfB`v-MNSn!s)<8fVqInX6DcLe%uU;4-KCAz=>8 z`^|>O*}LpJI*~P8>$Im?`Haz%f*~~u*$25BN2K>xgoku_5eHz2{GRqm&!H!-9o-h}HqeXHD{HPq`ik%@;n)_U|zTO!ERGnqJz2Bk>eZ2#D z`=(Tl_vqsJw%@|n984)OduUoGoV#SV&~jud8tu$?6MIk&m$oH_Pxsr3yW3`45*GkkAzJ9P zUHi^cVk-v)U6yzxmw2dSR%l zMdk&;>#6?=LMX1Npg~0wArm0ES>bk8&#ByhF z3X^H+_n-4XO8tQ#c|ddYCyJU9pOjlMt8@sQIl#1-QO!1C?#09)o z!V^zK0~YltzjiJB&yP8ncteG7p=5`e^>_l@gS-HNjhaWtC&j-v229P=dL>2Zb^8R4jOUPly546&KqQN{X(f zAi}UG(FOf@9jAsEqv0#j?qNR%l-nE?m%gmz4K6W`onk|+6m6Jv4T%2>Eoy(ovK`=+ zg|zp%dTNYyA=N{7i0$D>Hs$P>G!rT(`8UrYvp6M*FV)qH*Ly;~u&1YA_irlc8sTmD6(Eq$EISqhXNwS6H;H#zK-UOXll%PP%@Ogn zFMw*Ra&+XGeBbpFh_c6nx10A%c+!nW%yyTF*?j@T&J#NNIBxKpH90ak26`cpMWAU; zgUqkaQ)J0cUt00guQHS{xwQ?9XWxviW3iD3 z(UQ$>yffG;txGR+pie@@GSFe9!DQa79UGd zAklrv+c|Yy&D;I4-8t08K?Ohj1KPkJ`DDGfBsysBB9nIy3Lo>%>lbgFQ70st@^C*X3a0kC-AK(C%<+44!0hcIB8_pDw!&Wj~WtLB4?eGqI z286D-S4~bySukgT*%sJzK6kv{P5LgcjQr-xik|x=pU{Fj*EqV zlz5M`D3_v^i*EJYF!!k-ig8u@-0f-ZVXa@30W7zJIDr~p zhrGG8&*JCOvP3B3I8fAk1@_LQP&$)<%``)0JoYXil2B^d%o6R>O_ zxt-(|=*30}gvEdfUCTRRDG^kJghz8?0l9!Zy>{3A%-D zEl*N3pYANF<3RT^0iN;}rTZWBYC|*LJjsEWUxJ4t$ggs&zMaA~7d#co*=Ln`jO-AE z!Z6A67@wmsj4|plx|L+wGCT#0cXhMd+3ISxMGF=Iw>ruOV+Yo;p)wsbG1#;}VcWEC z0AEK%0K8o+_ua#O|B_GcPL=nS;RJZB$#xShI0*K6?~qYK#-3%nr+H-_!wfTub%Unt zfxw=cTkz%y0ZR6h%l2>X&p>Gan9p1W=SX2giPGvl#paS9V}Hn*;5LC9N@qLE#9Q+< ze48nI3@4g%dz9@{xPa@7{&6hz+ye5f;@_<6xbolGvzXWho8c|2*rz-^i6pNk2knoS z?I;ynest=mO$&pqs7-?csDyHK#&Ip~16bfts4|(iwuHvG0YXV85jzRr!U@6`xe-Y5 zsCjOHJwTOo5pPA0v$JPI4Nf0bS-=4KvHRTIImc=yq{VbRG*wOw*m@L(Q+oJl!|a?B>vzbI_wS-E;f9+yung^t1DOeA}l)7m;RCo#dUv+Zes-E%tNGt7NE%Cr`(vlbXK~ zi-B;tuM&^r{PR_|(|uM|$CUJ{5RmPzqF9njd<|`XZbg~SW*+EB)Ri=_LbU%3Q)v;OFfChuSq?>t`Ss%!eT# zWCS>*EW`mxqCgZKO+wjCKitvyp?ozfKjdzu_y6+VHNU*t9FkR7=YGn8<`_5LKFCiq z;>{;4Lt?m8`2ZZ41gIhEqQI+|Os9Y6kcqlo4Hcv1j92WCu`(3nQwCGBk_tHKpnZ+E zIZmTtx>;J{;OD2*R6?1ox@f-Q(dnj1UNkuvJPvNWM<{!o-O&u%d;lo&Sd4a*SXILL z;&9Z(5X6oCo6&Fa5yTv=Dych&S_829+pylH>s2t%!nE#f*Zy%K`^i^w!EBH1mX1=_ zm3M(-ajs{=tIz(S1!76ovO8C>9sRajiTSl8F@dB#l_G6#+Wwa|w}9Xuj0h2d%`>o^ zS~*1JbmJfT9BMR|ectV3dkQiFFo{C6i-4u;HDo@2un~n?wtux-F13#)Y%_Tnx(({v zgrzk32Q^H60VXu3rGN~zTyDOhn3YD$aLDd7L!2)+ihTO~%qeQ(`N zilW-p15WV?gubfe)J47f0m`$5LTk2zBgcdv9H<$T?geS<-FWW)0U~Ab-kQCL`utkt z+;f!#j^zkaO-oz|!FWm3LI-Qv!)AQ>Izbxr)uqq|yCABaB@MWPUfM&}OpzK-sc2Bv z@0DFpk-U<&O3EkQ6};?-mBL3sL~onXqmFS_zP1uRa$H!1(T!p_N*nQ`{V7qNG+#x- z{V|Fx$7z-gAegYk5m#sFoF%>zu99vZ87~kWd#$9QHv9fSKEK9g`70n&4*-L??v}fv$ zu<+o~81=hJ+Rc8p^7tSks zN$f@};z6+p1!>AEWTp+~5btO~;Dg09>Im->iPJ+1JU0gnK{+;_+X)s%6$+p=pRBDs z=|>M%y@i>Czp$LRJsui$fONfLxnguSPBWRgeonlL6y;FA;wJqJRc8{%Yk4xd zPl?-p54VW-Nmqd{#iNm*ET?R|Xs!ET7OL?*TNuW|hZQ9~-=}5{XN#nvhN_4~ zt}FO!Thw*{w~~G+*5Molw-oJv9#H50P1bj}%srhIidYM@I=VS8sEk{SK}8F`R8$M! zXR^A2iUWhhN%7=rnH*kZhRv556-8b{LBA5G!x0*}O*eru#q&sOQIy6`D_Z2La?@5I6`hm=!rf?oNo_>?n0fFY{IEM__I?FtWsstiG`ejmw zsqx$U^;;dLtM*W;q$Sqx*S_95T;>I_35GtY*GE4;n7U-GTE*8Ofm_a6JG|)a85bb% zCJ}7+fg*c9qI66j_^$9`S&M@76(Y4X(^x(Ctq-&KA z_(3%Uk;JOZi5Z3VaM`w_7CPpgx1`h7_gf}9dyY<>Ij6u4Qy=1%^PzMFTO3Q{=TF;4 ze4QEbS=Kr0vvG$S9xds!6wA+f$0iXuYzZYA z&=&alxfSX~-4E33yY8rSGs_pf583)*8>fBqA7P^tYPX1+y(Iz4`X&b%XM3g!6)i#{JZO?(Z80ltB zey>_CP=lW%ePtM>)eKu6;VEE}4)OyWXi6z?+8pGV*h>Z5UF3#l&B7`t?Ec9Kd#i#1 zq)W~n#fNBII)Ilt#!n$(gvRuG*i$d*q4I=UUyIdy%hm@O z!8Ihgnwp>*hret8mIw}xwQhrzV{CdWco7@#jclmpU)e1Il~p$5>nFwe$7VX+qn zYRG+KfQU-i6VnD)0dJNY-}N!F>7x-mGJOI>XEYX7!8ulG*5kCOr2+^u?wU3$wBI zgTPuDWJ_qqVJ-6TT=+(SgYZpr5_1XaZ(=ZT*B`pcMRGWndjk7%u6`U9wRes$Uc?P6 zwjlN1FR_JRr6gl)#yR^6&Z_z%=>s(@r>b5*ECyM+fPSrJ?b}hKfc)8+bly#g-o!(B zJ(#omOSAPnEAwRpWk@f}r|V<@^w*M;+-%!q-${*e5T2ZsIT9-6%PvW+VxvR5bJ05f zdlv=rniG!v#$@tow){K=wKkiQqP%ZS|zXH9(wg` z!n|}>0E01+6Wj=6sCAc4r-ID8Wbz`o7&*ElekAQezFz;PN$2vqELaCJ@SC+{i)_8f z5-bRhKk7KcI|7xU7yDOH=3Yf^FhLbYvwhhbFV6DdyY9gxK<`DFl;bs(R*Oi+0M@?~H1^i56nlom-?VNWs4 z8&3Mf{PA4&s;-fRtJL66e0300NAR{@NK+&8EII|SCd56*+WFo=ak~xnG!e9E_Jst5 z&mZWuY1pr86jU5!1E_oon}tuCR@+DFv!zPOnfS5`s(@MtRJ{Q^n($$4QB{)MWp&or zbpTJOt5eb)K(A(7FE`jw$^NE)s*HSgss#2&>-grEAVSxb0B|U<2Xl2=#2=m;Sm8K% zzB3Llf)u1Dj@c7Hk+@4qxDb?bE?LtHsxGQ?cn(j)Ai8u1l%ocAiJ@YJ6&{B|%q`fa z^9$lyXxOY{BEE`WyIP#dxMEjHnJCu~>4=X&F~dN*0}Z{kNk|lLiHnag`)TV4?D4t5 zGE#d5-7#Pvrp5g8;MIQ2<~@#X|SW z--T1Vf`o*Z7J$;kjiu;KjqC14x56j;@q?1XwL=q$lAmU{_N>7At~>%&;c!l$|Chuq zw7B>C$RH@X7AvCG0OvZE1;F@fU|lYdQIv)_)}Z<5nuDyN;LQ>;_#&)?}nn7M{>%`LD#7 z(-GH`<3vG#{(jU^!TD`sbeCC_wsF;7v$&h;_QV{zcP0LD%rdQ_4f39IPQebtaWOjr zO-$Ia1&SB#nE1iz%C-s8MTC0qPqh$#oC|)Y=uNGsFc5P(OVe`-8faCi+rsLB!yVUIsXC&1z7Dvn(>nC7MjbPl^i>+|@SXRVPFdFrnb=6w$^!Q1D{E z-JYr1=y9%8N!lmMB-%xw-75Db$6U0b@gq4^R)2Mjb0A;ZP)q{YW)sVa-P{6{z~Rdg zN{l-uawNf(I+FcXLe*`kx%PNy--AlpiE-OQ{}o)s#YQeX{kp9?Bi;L8Nlw)vX_~{- z-p^57N~*4|!~0wVSChMhKYN9G)6DqUKfv;KsJ-jo5JW;jaaLOgRbzg}n`x!rpB+xL z5JkJH^!q(vlTa^;rH9yWUIUK*px0#dmgum#J0~av_Q$KNA;zjjgOUL+U9kf^?OK)F zV})4?R5^T^fr9$Kw)zLCRuDy|j} zsB{dpZHEX8853V3?d40Xd+H)EZ)FyM2fRHu_Y`?-zJ^ zdz9zh%0dD!%g^%%Avr5Jn;Fxuw4`lO4vwRN-H=bom3JWO8;}B5m7K;`sN~ud9vH-( zJ*dO5NQ3s0bZqsI2Y@n;A+qS8X`l{`A&vSxqqKQ7IS4=P5r(h3{>vot?NG$ zrXU5afx1Fzo%>eNIVrS34ZQPfRdm?{M9%!RmHtyDg zTukQBxqbq_W&U@GDWzA7ODJs(qqYLK-8i5NBku*G2N6Oi@v@bZTJTVQKIkRVz{p;Fs6g^tCu51SdpM}V`v6$<@4m>Adod;OY30GU;9vPHaK?+XZhW`^- zEyj}z?7R4Vkylq4V5%tG>fpyBO>^vrEyFGBj{UheAiMh-3X-L{-A3I7k?vm1U_jDC zmR13?Q#}v#zEJ?2jRs4ssy!1}8t44jymile0o_T7gvvOaPF8ih0&x^>ZaAjs3W3#- zMyTOsX>L-#vNmw3F1>!fDlgcn4nwPTjvvN7GT0lMzN8 zw=Mcrzy}jr_+jBqIg{`hX?xBV6^jfTH{uXrsAVLm0g53CFK|d|=W)}tfsFcO&v)%N zw6}bSvnmYuJV=*NFm(g5Mf-+VE6>~OHCQo&w_2{uM$3=9G9IUV6$(RjnoyW8U_K2j z++$w>2)FPUbpF;G6?x$VhPPE>Blgw(h+O}YlP%&Qu?(9sT<0ocpS7Yb5$%=-(%(?7!0VRkLn8uHIV(-867gtt)}OvrJwW zRDc@b&^*ex{)>kO?bgd`GWl^Azp2|_kJt;v ztvxGd05e&r@xF(hkH7IgvrnfAkjbJ9SoD%%?xw8Su@rQ|JjQ93PiPF5IkU#Xr0qWaSaHs4PCFsYy@uU>~V8TK9 z9RR>9;P~T#wQu7qqP!^weMy|U2D9e4cH4KC?NL&u96nV9b5QR53FTb<0M7(UxL{8d zb$nbqxn5^wt~$cTzo*(3T@Th@7T^jBy0q-G*R`qy>*gv8)D&XpiFP&b&?QH@fadQh zxnHz^oI30iD%N2l&ENRVo)PY=kvaSK+%vRwk-R_=wF0NJ$0w5gi4i%l)6sKqNRGab z^t4^qp zJfNdOHhmL~_4+XYbdczkC#1eLzoCGc16B?o<(R5? zNTx|cJ}r@SG=xNYWCEUX8$4tJ8- ztm9)66ZCLwD=jBZBC#!*M4r^MVK@Gn){4D@7*-Un@T0p;roGu@V7rmQ*CQY%2dygx z;0Gac)ciqT6Q-$9kK4Z|S}ip}S#s;dF?$`N>O)lDka8 z7x8I1W;BBP{n!}Cs5LR(LJkb~#_^o<#)HmeJyUWd{qlfD!T};LG43Q+!ouF!6Ir{n zEP$j8PL7HTL4&JA-&JjN;D1@xg8^2Q!?+1^-T;kmisLPnWXTjZJl)OIed05ROS3UbS&(lw_0D8Fw{ zJ0(y4xy0EY;v;lAvimR^eKCN1XW8QO&%d6ue{%g{`lI1aGTe&J#lE?okc^oNna3t( z(+bR)8_Hvc$ZBwFOD3F6MfqknUE&FdpQH*DCVN0ac&U#iR~82!k1QQU7d6Aq?IaiB zQ9mdYHXG*ek)sM~)_I|%krJpO<6%!{+eMijP*!OpzeK-D z-$~VylFf&b9`tks&fOJ6-$vcG$WePxa82!3-C(@4*@1P4jnl=^OJU1ZOhGdr2p_xP zW#E_qEkXMA?SKg0=5YHLQXCGQ#t64lG*IIbI|>tep;8rVDcL{>$GWjiDbzym$H4Q& z5&MV2oA&2zk{g$5O2Uurx=e|PV~-TKxd@Kj^d) zH*}4Jlx4e1W`?Wv7VTf-sPUw?ShUZ#*%rb(Z77mNTdQ455b#7@wc05@#Qp6TT0s-} zN%&~&#wos%?Mm6b0nPb5mtUwf({55*2wq0@cb8x{tP6T-Xc)WTw)RS&TAK_lLN(}=%+(}>oAzdRZd>1_^K(2z{B zIb?<%)HK^8hTynC=WO(qW%za%rhX2LJ6}=O-fh*a_z0rr<|TcuFKrHzI_#hTR{R0C~2XT|(YJR`eGGyGv&tlHN3Xkl*A z@-{}K{F{O+GL9UbAoZN|S}Nq^iNIbTTecP$1#bRd$u}PY1K_gz&7sxseP~2-8?e8x z$r5-fq6y(dTWJkT@E{4+vF7)3=)2OY-{|XgX&Y zKuzUh&f!I@kVFOnwrGp94L@R`==x%HzWq zUe)l^m2j|K#1A-}-8;MNdISd1#P_vXU-WZiZUo5tpKNLzSry#8fNG;T2gq zfL+qJd`HQm(RE_u&n`ata&AZ z&!0`I7@7c;EY@kStg`#x%uTEX{9x$I6S5A;B`whX7R%f2eIyI8T5uw3>&yo4<}zW?Qztd?-olE4JJ;(B_1g+!^bd+*@hS@ z;Zouf(Hc%x>{)UexWteeI|2F-)gI$_?`Vl?{YyFq|4fsDD7yn6T8Hf_avjpT1$@Vz z{YNTNo+(Q?A0o*RnCOy?r)dY0k%dNKSgLF!^L-LBdPxs^4CkI_d@QC0`27zU;8||N zZak0AY1y_sQ@(^kIKsz(Q@!h+t8zuxNVDq8pomjuU$I5IT=nsnOYRlX+U z>2k>32S6@(LQk-XU^FGzXE}xxma;tCigIsvH8F5>3zd((lEerFtB;}Wi_KDB)#1M> zxaSjtzr?xykgnU=#7M4Ab{nbPq;!zN@Z=^kMY+#^*5~pqpBfz2miL~4#kndGM7*%bN1*Q z+u0(!&t?`Z9oR27JZvxP&fC-Ff}Q326B719Mj$%L1B=(it$q3 zs5;zf+Wx7ooR;o+R39sHt5`=HZ6moNzIIiY<29(1ryj+ed%<5))RDw=r7np2Pf1u& z_vD=PyxN?=s0yM$t>>DQcoBfyOaMr4@C7H^3Wr;{B`^UBt@m|(sBq>p7WCR5pmY>sJOY0g z7^KAG1XrhdxRX*+pbzS|p&ce6v?T5H`J8%8pKrNBtk<_3KPPZ{r@Bm#DH3vcG3im% zMK;<+U0U#2*)epS%u5&ETwu&+eQ@S4F&zFkBBky2!hk($n+D4c2kEq|OV$3HbSRPJ z^ljsb1G=%{?}GEzR#&%~P(nqZ%yO4m88J96D3~v+gb*4iv zE4zq0u{~D1ox8>qer#jz#BHaJJF2Pu306_y@;*HRB#hTn|V_is}J{q}vtmaC*| zAQ5}Jwm@hpw1*~#yyTQh1xD=?Tq2tl&OVH%*UPxri~ru$U~wNad(^Lse{J(pgfl$* z1Y&bRtqqS3V~!I^mgWHu)AMggvQ1_|>V-KGlREl=i^D>j;X;OoaDOhcJO%sR+zKR@ zC5Tq&vWm=uSzbdD2i~b1p&9|&yH@M~%EPo@sf;1UqffsxQCdXPW!htl!-^HRg zzs04{=`2l=hQK=t_KBQVu3Fc;LXfVNRErgXf-*@;J(vg^e$uc(dlVsGr9HxXL`NnG zj#y&H&x?+rmR)EBKx+17(*NAmJ#rMeq`}Shp9YkL`OORv^CAu)!Y{K*PfHJ|69%jZ zezL>~ffn)2(=d^vHQPR$BuTS6?e4biypCeA2ZqzwIl@q*G&EXaKl>y06BWzHrx%wta!Ud{Zpv$oC)lc!>XYM$_`@Th^t+Ri0Crx)>L zrjs>9?Uf~Zk8lp+5wH5ZH&D;H*H!sn-Nr%kO_v9(KnL;SI5}!w)g{~)`lGyixg^|s zPV$}wy$5eh^F88Jn{jiTf$9`cbA8+3QAbE9zMY_9mcz&bQLP9(ovi2Gd-3ZHk$uJz zZegWab!Eksy=g(9VidOgOvbMhQFztrgS`(EK{ zuqh|K8gEfrgYg17n6llz2CYAtRoX0OovHcDmyQ7AHa+I$ zd*t<2k}PJyyYW1gN><>tw@jiMbwxRFsA$PPp@E6p(I@I4U35L1f+QALK5} zDYXpL33{2^HJMmid3&^sgA04?e3Wp-U}^NFbFs4gt)8?HQEwRM=fcdnnt;%5ju%JM z_RoOI`IJGiN?Ybt+rfnYqrIJnD#U z*M+I^0wBWTk)dOtJ5_CU#0B@7+w*hY% zQJ^!^q>O=Ky;ITQbIzPbM#EEBhZNs?Nc6Z*$4(S`M7yZB|08;l{LyE|c`#FUV=TSYnnA&$R8HWFkOLkmUo{zXd!Qe;00E&J&BfPGPphzj7##% zkabMQd+j-$rB~VRC^au=6tx_Ij*6#_yqBjQ(9AKDn2-ifCC=Ai<&FA!;)j%~Xut7* zd^_;}lD?EK)D`k()~VZD<*eXzK&LqC6DypR%CS&KBI2yJXHnOcI?noJh<+Yn;YO=# zC@ZGHIY%62eKA*BLs?IXv%c}coE5Wp8c}L;){&Hi;6YT!2k}*Vj#NHR7P(7Vlg#&U z@3g2mtJG=#1GPU0C1p$ndkt}`aj+1LuDj;qc1?F07h`3)gwrmF$fv! zz%);x1)Nur(jK_*`W(MU@f|6-4zqRGE*CbiBAluBuwB4tgY9zi(N^1y82kTWx4(sxecP~)aN<`@ zs2adp@3&WBx$=v`bGLAsN?Oi)(e?17a^13XZ3Ch&n{b#wFCGlI=&KL)tMz<9{n^ocLK#CZy4WmBkV2Dr@H-}hS@)=1txuY96xk4(mO z$I5A3y;HsmgQLS*X?)kL@{3Z)7=1IMymaQc#ktZN_XC|XPb7f=NkfCjcpwy(}Y+!9VWP1we28gT2r~I!k zBOt9_&Mpqvx>~9>D|{6b4}Jb6 z5!)TbjJ07QTRiyw&JaLfo5o2aox{r;dPGx&(zgeTp)@WZwm&L>nKG_&KBKu`w#|L6 zO0FRL8XI0j^8x=Wff8pCjn3FSEjDOS9?STBy@LwhoCHMnRQAy(uvMDyC5~NGq|$)) z5QUn>YtqT{r1eHnREgCQzU{7i_K5I!rX?p`9pma^Pm%r+{rDCV7`h_|_GdEo*-JIy z%r09$T}Sgm0tsYf9D?QBhR~j+O3emRQD&nW?C6@d2NCh^0DSleBcvE1H$z-2>J^+V z)X1IF+{9-%U`UV4GH@M94$3ZI+?z8fGXnub(l_VipXsbyF+#qIPkDBad}|dBI2vA7 z&rJ%wqDc{PxDd?oLsp0ARC46b3n6zXHmH_NJB=K9yNeW6hSYG zn0fn5(mt#Hf#d~-^(d)M$f0 zXOU>fX`L;+;N<0qFk!hOXKPXDtMTARn-5wA#O0nu5|JC1i_v@%Gq>`D7C@Q8SMBPI zmRP#ywGg>+Irw>w3w1(FauI;SyJ!@?lZnDXyCz*fPDq|hx^PB5%Kf?O+K4rC`W(Ug zVHWkz4b>QpVOLcIB}Czemrf37b?FSR26K(L0S-it&~Y!?HdjMhhvbdZ^eJ6Y=G}lO zLP9HX{~L4R~c%*`@2AAa5x~P+f3yT5$7q^es-^NZ<0QEd8!u zh~^z3yaQa%W5?PrLdOOj$@7AXSbkU@9hD02rFl<2Y~3Hk^RDuN?Exx=RAgzJfZ2A~ zuR!i{Qyiw6ef~{`XUL0;ID*ST$r~bgWTi4>>Sr-LudXvB?p0@RyWn1=j*7QJ<~|up z&!SQwa~b>R)Hz?c)!bC_HQS6!WM>MYjs;$hr)TtV=LH;Tx#; z4=5^FkT3mh3J5E9+nABY?lL6~!LQgN@&iv5qE+tw{hsbBr|W%7f%PxH_ zh>aE9_9- zN?ABJGSNf$Ukm{RyCc|DuVNpLy8Qpn3%oo@5(_%d3HrOdT`qFKgp1N2y(1$E`IpwB z)~^2}CnkvzRbpCT_^=45MMLRiX6lnEYWBhl>1;nQ`v|O%7{$UMm^%8pY1I=%4)~jg zU%&^+@NZem&m6zj93Ftj_%qGnhq7yi-{taKouTEfDzl;w5K_&FJjTd0%Df}Qwh5aa z$m!Dud!qW3E2*H3JRNLRMaFGC%yxzUZioLyw&`7{+J5UO`ED>ivPskg1aGF*t2UB@ z)`70o`u{35&fs6w?XO>=n*;8;42#I=5cv8mnccpe*KhMToCQVis~+m($HQ64ehmZ4 z*%Xr%Rlx!+Hp|Z13)svkBwKMNj*C1{F5+r0{)|ca`ySl3=_66I|zs?}Gm7p7pjcUO?|P z{_~n=Z7nW1@#`KbId37EQ8x3<)O8y#%6o&hGor5FUvkDB5T>=jMBsfJFlfC zaW$@72B(LK-mHhvUJD0~bMPr?2l$!DMWsU+cOwJx=(#%he(9y;~QC_R4Ha`}@ zbR)4NUbaC=Ir8UQiDP?qi$AElj6`Q4SMXE?MO_#J|8|^LCH;*3W~|(#v)r=j$Sey` zfy+LR37~+iG3SWNp5({O`4`}_IIcgK%YHG?tF%!obLL00HWkl{=4PTz9CHCEuj@JSI%q1a)*c=P}S=478Dl`NjfLpB!a&KG=5L zqvOUJ4owVO>j()fiE(?(ldIL|OhM8noXbhBp^#%5w~p;1tty2wx*a6!yl$6w=a3pJ zXR|$h;YnIEmI+!>G#@6$An^`cfUAWpu-k5o!a$#Zp;$bfGsop(epyGES8aB5ev4>8 z&`@JXumu+!vB!iR910Lb7teuGjS=Vp0IYJolX@(rCSpgbAg8z>Zyd!mCV_4K@GZ-< z*b^SPLGZ;msrXPqOe{oD{%D>?2ONn&ao+Hi41hS&N?P$_@Jx5K9M5!zN{>k0x@R^= zNLrAm;euV~vS~S4kpcrhIlY4|mVci;IUlQ3Be>SRY})|U=0!LzrcV|KFVynVh0NeZEQ4gT>u$X`I3i)F;u**$)jFoOhgXM zhVCC4%ZWtU8KPuhniU>}4T484p0nM9Jtg}d5HsQ6Aw@7nzG_b(H-R&4h}SgDF_bSU z)wOZag|s&KksrZV#^lx}+0mHO7_QZz7X9l_Zaf#4mKG%&ovb(KDHOH7peOi79?_iH z!&KS6p6eT9%4b7?7u;6%Du7a9!yTeTawvlA;S;Hl1j`v>UKK^v9Df9>>NQ`PV#J-U z;Y#5o_pZ$F@i3|wnH-~PAqLwhNj~48 zjFnG^?FV9l*Z69@d-UBy2T{{gYuu+p_7BItON#K}vK^x0(rRQE%Ab0dee|G3b@rft z|4p?r;p3X=XHIB9H55g5fj#iqMgB`0n60?pz^`a0-UD;$OJ2QK0V7=Vej&5yBAm;% zKX${xrDjT5K};diFBL|KOvo9QqJm9vEwktj2-;Q#?>2N8dRP}FNE3PmHiediy{@ti z$o#zkM-91HffaK#kD4>JOhxUL(R$63#qYg~9&mI=XvHC^rX)x8k9Eme>~aRDn{6GQ za{X=CV5Eodx>bwbmg^4|YFTk4ZkM-M^+_f&wg{w)dUeVNqE>jLsnUQnSpyKF3IIdH z0C1U`qXZ)84o?bDh*%(aD=)~9dTBW&T&m~rRbFu%Zen94rT=kHVBKEy>b?t@eFcYk z8y6e~RZ{f)PBP^g8+-Z?jP`;xqS73itr;oj#yoDDlHsHuLhCt4ku*pyiCbd9oxF+{ z>Ar}e0cl(@8W;uIi4O!)6@(T?;g_TMGY981@=>ur4STtZC7A3<+MfNkuCEYs_zO_E zlQpf{p@7yKO?#|3=B|*zsD?s8gezN8ro|nO{-kwfGgAZ*?Hc``0{c3u_Lw`u`u%HR zBRckdiUD%-xUK89E)ccRDeAY5h}vZAK#GAsy~1szTS=l8xl!$%{Cfm&bXwglemTHd zcRHN4M~YJy2RTxk+>M`Iwj0AidqX@G%98Kh+o*Owh>()EKjcbE(sp~=Q(oYM0t$nbc>l}iGDQGHIQP-{oXy-3+SaF$I zD@R2AERyWtyIo@1I_4!GRLA$->ngN7wrE4eI+=YpXsg*505K|NkU($iX;pLS`a z%L&?P$A1QsIY8)+Mgy|T;xT-1lgKnlo}zL0gey|J8o1-DiK48K!Ih|8ChDNF)3H)P zvzC>pT_td+lDB*hF>c3`qi~E|Ee%{r^1ifnSeTId?GD*47);sT8sK(Xq9RRFBP!zR^qq|Hd~Zt7sRqH~ z1UxZmkJj9kcF_QwmzGS`p@`JY~xukJKw{9DpN=jX(*bLCElo28n==^B#$hT*1X1 zs5D!%=?k3vk$NyVauB6SD)c+YodIY@>u_?rXdOrUkxAP7!A*GNZ83pqob)BzaX`i8 z>B7V)e}C*BU0#SkgX{Tw6JrF+!NY=oWy&8i_VqC<`&nRyH;ZM)=-w9Vw^NLjDbP^R z_9I~^!-r|ZoeGuLNvHlsX9mot6isNy)r+7c8i{vCjwCdjDoM=lgC)z4AVoZ-MCmtGu+PzFZ=NS%g4F0Ec&u-pVwj+%i zgegGU8P;7RJvL6go4rgoYEA$l2>bfPcv2J%l`<^7iUeI$dovVY^?0MdnSgavRePGt zL4B$oXf7}w8x-(4#_5fk3xtXBgr|Gd&@tbe&}?|0(9NRea|9HelPWF;DtYLvZ_JI@ zx8$p}TR0AYf=x*|E^0IO8&0tgah;AA9{1_#$!kurz=!H^v*~aWC%LvJz|P!`L2;za zZnJi2scAP2sW>tc2Fbq>I&9-eNd)7o>mY_~_9q-UD6L3wzg(kTWtv%9P2avgL)n!lWQ5@m zkVa>ArvTm#s5(a+_uJ7Kgv4p2;Zfkxq8+-#r-Wo4O#)d583;jqA81vY3T}LvAlV{{ z_ZWQH(p|F=t#nbIHQ<-gKPOpp^&)MPvb;kqHs9V+0sWMJqBWqC5t+qaU$3rEJ6$Zh zFF$~+;GC$2sK&r{l&v^WPtMRo->5>peuLCK(502LGt4J+BNr?NoTF?DQC85jP3VtYEv0)Rud zFgA0k4dSMn9!l?u#_hi7fj~zJ7hK{WgT>}hM*x}Jq#nO}yL+esj~8e2xrJI9=!%L1 zug0onm9ALuEE%c&T13whlh%>pXdm?mJ=O-9SC`#C&%SroM*0JfwlrlId0l6%94_3Y z>BXA8z>eS&$CCivBK9zgnBQ>Vw1IWONoGfvGLb)y7tK*u>%rxQ`y1B$jp*}Wv%Kp) zA&ByM+koN(%mu9c???ESL(Pdvxy_tX258%(A*txUKpE+g(F|2b8}X^L~dYPvX= z!YZs@7*mGNOT7qlLH@eC1B1Zdk&#RO2VT_^Vjc8?lJIKKbj9bKs~iCD;n03RT0Iq^ z)j_3Z=L~OlIz${FDGDyqev~6Wj8REOICWPOr+%KV?&Kh@VABh!i=bt$S_F{-8HFsP zBx1CJ!=xUfaD=CTq+SD(qAEf;wyA~4K$3++8(i?UVUHt3wZunKj3uwk!nE6axgD6w zhS(^$3#hRaAhIvwH(vx3A_Y{(_N7;XNuEu_N}Ji(sPw21VC9?W@sTEa1XRt+u3jhw zK;O0-bw1ZNMyX!vl+-$mTSmEFEqUU0N(n>CDLMLlcXncuq%a1&7J@i8B?Le*V}Ku5 zenccjAPm#D=RiK`ZIk=(y-soB?kz4qEZ){|ieEuR$u2kw+P4pSx5O^xK3Iea7wFLqn_oTj7QQ)nOl&dE~P~Zq~xEf_#&CXo4z3dC{lI;Wq zp305YkYr1qtOyfz<53%3!GQ;{>&);)5MUDtI!`riA3T&0*FmG!NzSAkC#+r?32b-@ z4;;vz-G4VaDK*l%*f|_eUhja7(yQlnH&r(x&@h8jjn>dDC+*Xr8*ZIF3IJf*DIA@n z3oGLtv`nQI*cY(n6jEY7_hJM?^6{?NbkwEc-5ScG(WOD%hQHX0f8IF^9aJTAN;Z;J zY`>u-@R-=_mqKE?UJ#QVjp7{Z2 z@5@UK-}BTe*dv4#MGED6=Bn^r0FR>ro+$WL{POk4>pT%Jk!9-SP0HvjM>t*M$gyO3 zh`-CRY8~KUY)TXGrf&u7j#1!&pnBEIzh!6m6`sxucI#v?Xd6hfO|v&(&siN2Oca-# z4JH}d7o1?JhiLAfn;pqiTqQNvemKu^0YCRa&KL*TlT~rKuejVD1oQxgLp|Dj0`Q*G zXbgCdIw*r#T?;kd730!FnSDRibH@tx8nh2c;8Mm=rs=A*@}o0nM6Z^pajyq zR2KWLAohS4`ABfTb+7>qEa_;UQtFV%iH!;L3su0R{qph4iI#~(>i|GA{!~fPT@kxHF4oooEgq>AUah<=JXw|+xG;|6pnNVBhrYVJ$RV;Lc*@3TI*l{;2|)1^77X2Q$F+FbMUbEQbz z_$pl%Sgb^V36KUG-G!0`p7W6&xh+6J&<+ug1(*YTW&jH#v^Of13G&O=XvEIK{eWgd zOqMlnjnM$urENvfs=5lTSe^LI;OaSM(gas!dv)0kMHc&i^A-pZaX>r=rcf{om+X}R z+n(tU(Cd*}7II>-Sx2B#%^pno^=d|UAr0!Gk(7gRE3oN{+cP>9Mpgj?em$_sxq?J( zI_hQJM1q7nn+sr)-@hHeG+ZEZ-J@f@xdt}m13JSVPOf}eyLb}3C15BY4oZJC^weYg zfyCrK;W4)(Ed|eB@U2?%9S9{c6PxR*AtNy5Oa$O|*#@`5vdhlp+S_`UMF&T*jzpXZ>jU2G99I&OiTH5)E{ad^%-VydcT||eyU|CP9coadQcZYFhy6Y zRvR3co)Ry(5Aqc63pI;Pc6VrphH|s6ZE-;_<85FYI>#uxL&8o3d(Lm7GM}WP2E2)4 zHb2rHx$k*UUQGxR?wU1Y-LsfnR}PD#Oz=*1=cV=HC7Yj1|{< z2=_ESgj#aJ=`}t=T!V02TF7RCuxy(zOG!UPZr#hs5`Me^8_$5WP-^beV)p&%z)~DN zG6i(>WaqP2xjviIE33N6$eiZ^e0VsROLgI}y$VA?sgWcuf}r73tdJ=#_-=u;Uc)+J z*a}@}Kw#H7@c>DdnYY#p<%|1MZFYMr zPPh6ZfDumN+w#)(9ggxgkKdVpxAF&29DybSa6A!k3Iiz1e-%u#kfPk*hGy)+u#wt- zS=mY7!FgJgYmo228`?iDM>MWME`3oJ$R3XL`y7N$z^7LnglQi5c@Dxt(?O{C7}2eG zuWf0-K$^XWI^j~nuj+=)n%8gJWVPikx)#7_b5`9AV_RiaXyg=W1 zYSOL*@~k-UM%O$Xdyxse%}yxMAmmOn7SFi}!#Jl#$rJ_xR7yO>W3DbBVC;*Ncoi?_ zG0b*ifCt$X)v@c*HsGYo7HG76`!nqDIFC|M$9d@*F232T39Eqs+ThPnU=?bm(F4;3 zq3(mLAn?Zmf%^j~fIz-V0AQKl4a;JmMO^+Q0MbRr_E5pT`IsW77$^>JWd#?e(krkq zt<+RL=T4GLN)v*G89Nif!e7KO_<^{PoP1HuJmP?1u)-3Wj+@I-xz~z2v2UMz zBBuL_cLX+v2TiU647|@t?R!A>u-EyPUpvlUY`lSTl{4h$!@N7+5A&wT?co4SvNhjX z*7YzBNy}zHo{@DI>UxBQ?vSX9hh7Z=OC|M-(IQIKSTWN>pw&$?m z8gHYW?X|GD*kgyN0dRwIRa%@sleMVP&+2`RYt-~#JhO7C+FP1QYPrwv<*GG*f7w0G zQ|^!OJ^lETbd85>t^td$BX%@AuzR?zj|i>LCbU2-EY!70Sr#5EU@CgSLOJUWl5b+j zAI!RAi{)sQ-8n1M9yYeI)HLmOl>rDn7vww&GI|>pCl)D7JO{2-2@R5+AAK)2;7?GJpf>LjJbA>MU!XVNpglaA^W5E?N`J;F z*N2lM$-SJjdGhZ}~XwYavP^Nb6(UxIzQ6 zbc{U#5;6nZlA+yFUl8_=*}FiDG3y>A0fal8v$c~dQtX-+74s>-bk}0|GxDRaAVOPTHGz;V6r4I}$@{8QIxN>h9%h$pxE|Z}_d<1Q2Z$1mc>dE`580s1y7!O`s zw#V427C;wjctbiLQ{VHqylFsIido*rNeyh>nA#1$FiejWH6-Qs7@q|@2HA~Gz#;ul zkV$H>gl>8w8syY4NC{xM1GPOghU@yQ15*XY3MN+a`cQ zxWfDfxhTL~sz{@4j(?dY$q9h(pq>{;;pWmL1aKYttodsp@Tf7Vnhf$|bl;95y-;sK z|EUIypI6}2hjAZaI=0N4uMGI^r!RvZjX3_{1uC0h|$=CK0JQQD-SUeoH+b z0vx)NegJvn{0=3BN+;mm0TM^l8josWZ`Nkj}L83Gguoz zO@;uc(nNp#H<8NwASkSEWhd?=1DKq-L&*9rV##ZdXs<~e_vPl!s75P4?^1NwG0 zqT_;Y^m9=Rgh@MB9xusSM|eHwsd{Srb+&W*JRCc9WpKcL7_))v%Jgx0E>Fx_M@{U= z0f|_d6g}Hh(E|X=v}Su zt={ig;z5G9UXPlUM&F@{kb|Jr#V>-i4OmA3WAm_Udgw*4V+Z!Q&${+2xqovnuGql3 z3uqW}j6{?f37?=Gf(|KriwXlZnr^@5d_z}VX4 zX)J-fPFh`p8?$Ix)`D1$w&g7AWZo8H%OSKQn$WZzQq>a^qD380znChpLe^K{5)-dv z&lat#JVG^-!sG;6Zt=AR;Pg=tjslA}!SwD{HLP$Yh;&h1wk~;8I}_AHmjs`XzV3?K zxWtDA!&(1W&{}XsB7Y?S!6xE8qASdz_Mt9M(dR(eO}Us;5+8+>86QmU%eMq7uM}{6 z#0vJq#b^=tg2}Io1-LZMD97_%@DU&L)iN+^)Q~&q+npPR zl{yt*eVXI2qAmgAglCj*f#H%d0cHNT4cp;?*T1idh2qH*cpXPpcGRp{$vop8aRTq=v zsN%~T2JBX$1$^)&JObJDJmuXyTqXr9a|r{Dw;|>do-hLe54R6rh9wI5zNYgmzn;LS zE@5pCbubU}D~id1nV#D6^6FuGdypr#*q4eNlbYSWl)w`PI&x2bhbJEjZ9`aPxzZT_ zG>D)DNPFJ?u1?_IL-XjxIJwEgrPyYPvG6L&@jO~vIyW3=tn}(wSJX|vOD#_r)gB9*a z=+`~xE0bA)z$J-tBk6(9 zbcv7@B%OK$XuR3V^J<#X!BrhHey=p-Qa@aG1DMNCaRjge`YnThIb@y6E>*ZuLCC19 zzETW~V+qPuFQ`uT{Tuq{!Iy7d_MJ(YJJKQeYgsxn+J+K5Rb*k~4 zkHEPgRD>7x6hakB8v_+L#oiRM7{g^)rLo5VnC77-P9hA{$_Ogl2=cCmf>2;!DZki7R5S?x3%u%jA08LtmiV zCDabm*d|7C>6Q)Gs(kegziQUGRoQE2C~=&6k&m2rwIbUjbH819lSKt z15W#ts*7Y`3x>DBFud}?Mn%`Bx8WPW9RxJ*sx!TZT`|hr*jQC7-o>HHx{BB_zS&g? z4Gn^7_;oTR*TnNv>})B5T$}9wUbb5q0QZo8DQ%zC(Xa#u{qf^!<3OkI+$6)Ri85mU zE-4(7(o4^WZj8h(pL90Dhb0gER5Je*nOOTgc?>D&i-o!KJH32Loi`nRS27iT>;uJF zsqLMBS}+jSq-!>rH5Ab9oSgbweX!at7({p z#WHy#3u48|cu<)Fltu+2C4G+-ndGyK6r(X;&-5ikK!NQt4JLBPjyPZ`hed1nxbe65 z*c5yz<%x2}lpl7|UBadM>_9;rsA3>zozto=cYy1artpiGVS zE6h%`2%r<=ceGoYLWcmKlY;mKJm#%^`=jKEwjLKLVD`8Q|EJQiWFLGsYU>lFDHC^E z!^1fC`-A>`1r2zMJ{kSz_!K-W6gz^DoS%IUqgvo0Fsn0%Aa1_#4sXo97RohFwa|oT zU&Q#`$FY29Vz)c5=w<}~^pS31kIHlOF2=Ug5IrGZxX zmqe>dDmwoq5#x%N<;1;hc7l)cZ9Fy#7$a$aob}x1Qww1&2|NJKp@SY>wvQ3K7dF=< zb$^-qG$4a`=n&DbmQiZoBdU*|#clD3#MP^q`WDQ@ho2mBJwe^fqsarlgo^6nzqD&r_Sk2G*1yjx#uWJ{gP* zpv*SgI=223(;%A-*niuFjcdh|X@3{m_Cb_EXJvjNJWpeR7TH8Kl1HcQuBCA@3;uHM ziq}gQ3jHkZt@eU4K_7^r@iyMLDqN_U)J#1(zQLG5E@Rl;ql~sXk%b^}^Gt4`^M@uP zvHck{K@Y6Vq_lP>WWSBTE2^4CaZs>4s={&j9$bFLzERTUpZ2%30A(6ORc6@3oyke3 zaQCtvzemQ~rtG%#RjUsuyj-L40x_oO142HMQ+o&?>wN9!Ic|XHzXR^u=Zn$|RMvDW zRQ`|yjMxVIy?zGdM?#nEuMbSI(d%|=K4eK^+WMtQ>pqr4wG{e`7+jAmM|_0hZf6jW zQxj7Pr{f3izz+;kq5gS8z+3Jd;@i<}ebhQ3C(&yg1?%lXEP}C! z=)V(u(Z}MCUbcgBsZs#USLv(*X}3{`KF^)E)`gzykUQ=0bEDQCOcjpX}tT~l+eJA$?rsOJmmFu|G8vpU$?|I7yRKKmuvjI@l0_~yZL)?dhlI$? zy4-d$ahkw5?K_F~{XP4X)Utue+dv*e;&ZM#OPaIRp3?PG7LJMOckQZRcC5eh6kxT1#-XSS9H55?k}lW4xHXUESvtQeNtW{+aj;rXJ0mk z-^nA#ntt;9ji`1V9=aw*4|1qx_n*=EJT<6aHfk&$o#R>)6*v95cq;sG7$(@mX2NEl zs6RTgvTTWX=-|JkFN^OrJHoS`%hdVOn^4WYxn*mL&5;LpBHJg#Ebqu zRN%lvF%9@=k$gm_GDmRyixK4@#S9*2wx2EO!7@)Ux+B0JwZ9MaL(Hbeg|q9c-W zYO-34)}Rk)4=_yM9Vy1&_(G5&xZhI0;Talt*Po=a&-bb9lgKM?9p~#|p=SHB!gKa9 z=$0Zw(W`@}=mVdxbn9*(5+^aV_h3oibeLI`2uN0Eznp05+3pTft7 z>Sg%*ySP=S6zVJyo1M?#X9L#lsfw!Awz~sA-JRk#WeBkpe}o;|rD)*oL<4S|6_7lc zP1J`K7hNCB_UOk;h}lQ+4#sc`8$Y-f8}C1O$zFw74H`d4YK%ESP%fyhzj1uJyV-%D z@lynT?WfmgXZ)A52$mRN;wGfp*LdR_sYg1A*ml};@k2N|)MepjoL1=lhM%mM=>9{j zGO1xtgc7d#p>bhFS&ENtIl*2zQyn2M6$T|4-?no#!!E+)Hk|}t;PfJ&ysg9{j>1@xoNl|KN|DD+=rjSA*EAg470#X|QW@wkdy2|dl%rCv<^VB7FZ~Ow zgGATaN~TJ+Pt>S8!Of@c8t5feDIiwuVdA-e;S#;OKwNbDB6GvIS?8Gq%DX?y$Z&C@5Yq*w}=i9*TJVuG!9| zGa4Oz>MSft^7MI(i!T`eQ;7=DKf@6mnv)MceagDZBRm}2u{KQ17aQP=`&w^FXr-P9 z(n9T;vr$m+mD+dWrG9tAQeXL>Un-?HW;Zr=f)HV3o~uTf%w+qjvx9m;FCQ6+D-Dxa zAtf2ONLua@?;jerOUn}ZS#oXJykr+WjxD)t$p}$VHiHVp`7A|yi{6{+xdo-rCd8<0 zQ6%=Q=AAI%)2^_L_&40n>sv7ZX%NJd16lDbvzz@Fp#s6F+2P#-N9W=}sSM^++1&rO%-y@=z5jD;-k2NUP@F zRGyn((iVkVp?eDNb?J*O>y@ZokIb^0Hl!y8(!qM~cMr#(w2LRQ{mh~ulIe|*IWs~>_ z$AbD8Dnw0~%BjBF6Ukoo$`c7Q#QGRq4{a7X;Jn(Lw-g-I5soD5iui~z5nU}1h#3{B zzw1H!!c=7Ms0=YSqlX2x+n$gsNJ+I=7S{ry%|^rM`mEhtS+th63qV91rB#*LmHsAiB@QWzI}<(W}Dj7uyzw zA6Q$`sP^hTWhT4S$w{$kc_v?`2NfX@WzqnB4N=MZ7Y$iv6#Gjc!}l-?fvJ~u>&x5C zsLKhhz3~f%3uqI#2nUc|8MWluo}e}|mZ>TdWj4dcNOU#5$u{FY+nWxOFST@HYG5_J zl?m+BD?wO#&z=W>lq(U{?P&@NM2mF|0!k93%AL>Q2{!`Hj=5s}OrC(RJK{9PdvW$c zSWxHr8|l-wQc#wx;fVvn%eHFymzWHP{6~oOdVKorMtmAB^19A8ye0b$hOJmDm#cVm z%HkT)=`a@~_jF_H#ZTwY3YK68BkM%LqGn1ju|jcRS;b3`YOY`d+SvxgYTmZhr6dcu zCj@_*KnaI{hN2JxI(*SgD%XFlI4-W&;na$w{vv+{94~6n>z@gs9_-Tcw z=M@G*_7%>OZwYjs8mg}t&UPQH+fAv8-ZcSAB>QrQSbdjOdI8h|oWW2d0PIQdvmC8P z*du0UG_iL2y>KTow)X_FF{|Q>*0MJE-@-Yp!>B^RYj)7)e=TdMZwLj8%|wBO??lY} zcWA#VVR*)VO{<2kxSjd!%!WzWMr#NwMo$VX!ozbA9mx=i*sv_T2EfVCXbHK!qlz~*X4rtqXv${uv zIlK9WLNwYXeiG9L#B*n#Y}3L)R(U>9%O`F+MfwOP&g^r1Aa`O{m-1t&mt?Tngdkj2 zs~ZOzg7y2A7nvUQ$!8o5_qtsY;gNFwRp_wwTiw{eK}k=RILjVE@790o#8o~usG1^v z{al2Xq`vH9;}?H#iRC;euobTu_qK)|2ngySCY{$Ecq4+?p)xbh4V3UVD8#(1o`^jhb-lV)fa-q}vr-1`-^c(G#vt zZ1vvD#~@bo#G9cz?FHV`h${y|b#8cxHt-fLBMx{hUKb(vzRG3)UR5RIww`#{D z)wM7HK`~;TRQRd+e!B**Bws9G1}E+CREs@?SHOM%L07-C#XiaZ^LV<2cGDc&;q$<* zrGwGxL$I@Dk=lpjaJt)Dl`sJVvBnbwlXVVBTFTx|R4GKKbR zOk8p`JQhj?;wfLS$~YC?@u!5cyUo`y`4@MCg{g{i^N?Mdx47F2r!nzNvj$3N1UXy( zo{+(+w&koGzfW_E)up_7*GO}55NmM+B%6(dT{!cYB)s-srQI@l(Ui?`Si!4XR)zw? z2-_1VAR=Rh+uRq~HFG1p{ln*HRp795GIyBQVX-_R^lxxSD6PBXLe9$8Mc#Q7b7iAE zta$}zqDN25^0ZmKy)PHEhfA!O%+fME(>y?ZU z5+6UwyJF%hWr;#^eWh#9_BrVO_#qzN(@n;SMcqZtsquvgrQ>G(^NuCaR!nG}ls^$V z-f?#5V>+}WL8x-f*jrT>oLw4D*qssI+(auR^67~dX&v=P&dDG~;!=PhlBDvV*Fs5d zTz#FBO=HhMpBU58jVmAlU;3f>xa z9CY{2uw&}PK&`ZT`PG-#xiF^GXImq72Ps8Ym<1u2^%<-6bBa3#S?5!6jDgx9^6Z>u z1YI&J2UIuC4mmgEm2*_75FKJ=_cR*E*MCAW^&J?2Z(_tanQ#~!MUANt3q5XPdJ0DM zj-(v@y55M#LDa9G=XfDfEp_@-a=fH0Kkp5Vq5(TjN|ISA{FvdgjUVs9kr{+uI;LOa zQ{?qR9>p>*4^E=W_Gpt`Qsf(L$tO$p z5Ip2(sB}q4uTRLnT(5N{`6|MvwL!ut%Xn}l3#(zND=d%6!TEW77w_!Eg9I`W0i>v% zVE)3uC3t}SfV~@*g^)45mOChkM7V3Tb2g!CMn62vQr6>_`OKoF#+2=< z2QtwZlUO_PNbnk^ZFQo-@wp;jB%cwTtD_h`O$>LjWW$jz1l}J4IFV%^rbd8U3n%S9 zyiw*_1U9%|o6#lgJ$_ElxnCP zO>!!~>keEr`%W!($!MN0 zQH}D^Ps^Lj`|t+dj_Q45s+z=m`+V~Cg+1*m>;di8oHzFo+<8-gz)#tmsembsh?V<= zF}v=XG8el`Y8lR!0=A%GHdk1QLKc<7x~|-@UoUTq%`H zpXiqT_yBKEJ*{gPVaJ4B`P~s(!YrV@V8u#jQK*Otn!O8g>w}u@pBc!ArM0LOGL0Jwiv72cx^r3Wk7FMfGsC{Ltkx~@4wf|$$s<+w zTer+8M-nsEWJx0xDO@#$yYqXIb*yOZJn059z-J|VclAcPF&9q|P-t~zStyo8qizaG zZWf)GX@z$n1Y{}9$-IVZc9-QpbPk1euhGK7;h^bmT1xm(#*jv)(=uDd-m`KGvq7dC zZ-*g6oU_WB*tz3#Kj+y6xgPzDhZIWzMqx3lt4cNvMe(nC-tenT*y9sAdEMpN_;vg& z+jt>AL?Rk5eBDp)!yq+W$wa0ndm68=WcvrXy>*(GKP(pSPDIO&WFqe6^@t@K+OEU) znIm`s-Px(gp2Xlt8#IuC@@NlSQ2c?=J-BrTt}*q<2ekn^e7bvWZ(|U%yKQ~3+g6g; z;UFNi1Qg;_hvxc*d%h-gyK*(md@gc zan(p}L7Uy6WZuL>4%s3%w-=tBN)UxiKATRSY1T`4n)`4`{=^2h+vZ}U>|h{0W=)ft z>AsrY>~#w6Ams99tLf}7^A9ewHy?EW;MX;;Y27=(FSuLzQaqZg7wySOyYsNEKAXs; z>=oo$+6nZ7Mf=Aw$}#jinS+-8axQ1rMfiu@4&ZOR3KM_}FZXfJcr{sS z?PSSckMB41+nu4~dtC6lhVYx@J+xhDKz#4(Af9V|1@d`eeD_Jmc)o@;VtGhs;O~0D zCFw`z^sN)~X76f1du;=<&m$&-!sTlnm#J;k_r+NwA^A<@A&L=t35qj6=DE;z_9}a; zY73zBJofhxR8K;=p-eP=YBx%EL`K`WAi#GEAdlPG6e7n=4`rk6t+_Ygb>jyg5e+oB z@$Z+E2YJ`VKgY-8PLpB2YyCYR*3UBW&oIxf0)#-vcIB7{8br(rgE7JyI!Y&JgVB1< z9-k#nxbPBof?w1H0MgmLL>xIg)9ac22Z07p+h2jj1L+@wU4enQC&)NQ88a|mi{L#T z3U}Hf!Ki(rg5Vqr!IoR7BPuVTQxRKm!cisJJ(gE`1-P%pa37)kO-MTaC2)V^sEqGt zRb5|2_D8GhCY!qcK|VuH0_|-o+A0(mahzL-Lq zicUqm2L1HZLn2sC;I()nUITv8qC}MaNS+scvl<0Ox(t$aXKny~Y6qL;^b7gLk%o3f zfA;XKdPev4+gm0ND|i6E+gK)aOeswCV0sgwy!axX8wlR; zbd}{8_AA83?6R!(xLdx7Jew_?fVVdDgb4(V%vJ?9Lg;_|lyB=CuNhxxS{7-o=yKV< z#-W|D`&B^xGaqJyPk%l*3gLom-5h}WCB8i4m>7AwVh!GgK=Fi)dRa24oe_DY_DWO&NAU{H@nv*ZN>2}ETgQCj9@S47z-J~7ejaR z99GJMc3phX&iFw{s6PoUK87NA0D~CTYxcFs_V`DW|JBFvf$_I!?rFDDF!4;*rJ8-2 z5-FV}RGd3YQ&`v9bQ-yQ7n}BnFbGLl z8?-VzPu62v1stfmz-dxRYf|PHCI<#z;&M}cMocXSCqUsfAWB(gp{5g6>==(U zdeJK(HzA>ujNQn~Uw{wLg8~h3g7!%>4?zkt4a_ED-UsumY#fi)UyAqfgd87E?PDDW zf}SgG0cvlIPK5o5$MZ}L{9}4cio6ZGh%{Y#uhptJi8 z70s@fHf|+?Z4eIEfiZFRXvp$EQN|?aS)&)j64n|ofkgG98gmlZ7v`{6kQg+3Q1n_{ z9C>ZHCR!-C<069)*?KN2R7v@p3`4G~zeb|M+7iSk7_n zADLU`x-i>^4^pw(v`jmFP5$u8kQ+DKh6jh&{$3g*c*BiN3mRGOFoNmH)~!|Z6!1k} zi)?FD=a~{Lyn+#V1;Kp&*{Q=cydx(B{|w8JYAV|en+H&U`xV}HRIwk*TX#T{7&^w0 zdbH%4K#G`hJbp<=oWc{%_&3F&>ifV)%Lq3NTnvBB!Wb!Zre$u?vwl+TffX$l#U($0!{vE~vytmvOPZv_88RNwmESyCH?D3*G)|3CmFCS#9;gpnP^wGkmvPA6go{stb) z>k>I^-5M9bzMZI}>s-a|WWX%K3T4CZBMN{kQ5NwgdWKV8M|}mn&D{cLz=95f{a z*iqaF`@L3+!g`9)%nju4ijm*$I-ETu=%299Oxcyq*a}HVf?ns#>@a7)G6?*4^#a~^ zh9380jAi1H!?(k8>!=YI-o*$87WPL<)NBLS(^FZswq6ftO!7$nz;bW4TQdsWVSoMH zsk;O58--;jwbu(h5V+e5st-g05HG%H+cLXF2f{lk)~BA~5y=f^m==aIx1uY@cEml9 zfYsbFG=gpb3YZ}VoKULuzo?nZ?~Yq%NxUCg^GCQ5T=Dr&$ZV)OB1_SExZ-_;v`VzV zz~tE&8fLKoa)Y=kZ>}j)x^q(!p#@ljGa(mZ*PAN~Xv-iFMzb$bdTeJ-^8uT5=Vgkm z#%gzvC`l*5$9>7!X*Gyqn~1a5e?!b+BH1^oYP<0pAmg!wy(7WDh>)I+#VMgn{HBkr zy(z;Eti6l9=3PDjn3C zQy0TzN&ql36yzY~5yW;?IzRBY={CXL{{*I8+1+)BbEydXlbxmjO}fZNvcFNZ@&U)Td})rQ@8THZ&3*A%WRWQM)9KqBkl>lljlK9WZA-T67Hb_6SF^|daMj*)ZN1sL(g*DwGD?YH23IaRZygWf z{9Wj&>&b-!gELSlxv`Mq<;GLL&Qs6(Qx!`hsPl;#s_Rctx@fISD26(ydHh=s)Sn0n z_qzP-IM26X7WW53vs#bbNw0|G_ycgl8=CE|&jF7yb2jHzm~l*2)(oGb_pa25K-o*jdaE(AiP*90(lM40`{ zHX_m!)w&ETNgPaG$fCP)_C2>yK}nPu-W z7;SzAB6HDdO`uCXMi+z~g9W;nZVSZ2syY*?=Sm4Oaz1$tAcSKrD@hzpoE-P()!3@q zKF1{uyg8aUtpHWdJrkX$sGRFgzMi7q)}W{fU)Bl?)UKui0~s7%74qiKiUxUp#NBZ5 zq0<37`6w}KSCCbNLYABeMb&5?rP6KZF){-bdKLfu98MK`fT`66OzmvI)KiCTA2@Yp z!ruO%g_gC#YV5;AK7*>U<5deufXpx4pwq5pC)t7PAEY*eXsDs?G8RS5KHCk%VE?*z0iA5%8^-ozBy#M z+#Ej3A8rfXy7L5u^%V|gJ$yN+ZUGqT2;Bg%4|V1O>et#%@)V{2w}<{1cMk8a{QR?Y z$T(_s*F-YKbi$A+Hv7ozj9S(3?}*w}qnR9JxgF6mUOhj#q)xU__}wZB{Tl z$UY9uTRHy95s3U?ebYF;c-MaH7p2~-b(~OOPDSbthSL-=F}4@?lfHze#SEDD6Ts>4 zvy`-YrdBs7{j2at`D<{L8z*D<6YUkl-+i1riK*jEEK9aEa1ga#1Hv{H0lvPx?^hs- znMQUf8nw;TWl`A}YU2Qw60F%0B2{DRMAXHw1)aJMMImewY2z5Zz;%q#WI?QeKM+z>&51Y=un`O8+MNyBwvB+_ew)BL?k8+ft`1p=R#aDzxuCztnv!>fRosn|{D3opDFPrK z6x)S*;^+b+swVcxQEjG`_=%%Z*W85=!a2;-PX3eGrC?!63#u>W;^qaKM-Y#DwJ=OK zp+qYlGiSRmITOS#D}W=YLNmg>tO7xdSR#ufUq4-MPlz7&U(8jw%CHFi^NgcissVLH zo=*%d5NQl$boWd~5swO_#kL1=L?VkQ15Lq>`yC5}0t%^~A}b%%3si9;#}RA&TCjXp zE3vJ0pr=F~M&yTh`4D?^5%Jj8N-#VmleA4fS-HCF*{MED^)=k4+k>-?c+BkGhAV)>)=>1oXxlWH((~fT3QMCcxC{DNA!1y*M z@FWnlPrU)NWU&jSOkd z4nuAvXkHqkK+C(A__l&NeO_fowd#si;8eb^DWHt7q1*XY8z>yMhve(D6@w5>yK;am zW_TXrbu3)0G~>48%*DgONwJiYJxL|SB0dIPIwnlxXG%jli%rP0AncuJw#C3V!Ry~i zRZiHXDi679TLr$y*+0&F4jL<{aSz@!m3l#L7G0XLTSe}l2$tBP^FIf2d0NH~r$x7I4cD(alNOXcB?FwpjF!*n&8Gb=9_AgNH+Q+TKDn zMQtFY9$=fUY~atIu@?B^J#(l+AWMzU!j+b1WWB#mcrrSTVtsQQicYFQLM$%NYS>91 zB%roF;^Kf>>^hsisbL@!Se`Wxhe9fp@g@ALCaDiTbHzUNcFJ(&^td(OiL(6lAfLvN zoF^%s;z4_&cwQyV7Ga>g!)MfxEHRNWn}c)T%>g$xGWPf|N+@tSUo^y*j7`A>$>ygK z0Zr?4q+oGX+a1~upu`74+e$jNm(SW&oa@)989h7FjZcU8zLVA@6!|PTfQg77l1SU_ zY>Hyj>v`4Vk==_C%`lLKo!77-zbVg`=r;Ry*=&%D^=sUDSJA3{GP)BGMGZ5sc|5kV z0F=xgf8B^EHUY-lP~ZD%H1VB2?Or3ks}5D#(J8j>3R`TXDAvxI8r;lO}ufr;hdUrh8p^{OD8@lP_CF58OZJ zu`bbo?zZIMWbIvoR7`-0FaiumfcSBg;)h&nvMjv zY6tn{gi2`q8)3d8%T3~ED4qiUS=Ot82W>ODZj`K1GmTFWVH|?xjwz%dB7_MG*)ITp z+T*8SY2|c^eLEo0IZ;`rzv{rab-CsJMG*$_7zY?*%#Dxd{vM4DFPY*Wkwm5_FL1_I z1{YT==4|)LKjcF&Ns-zfa3C_(zWI`!AlIX+YaC6DGWaj)EwYXZo*VXdJO5@1%RbyC zODP+No&D$Zo^>P2AGf{WP;>8L~*mG{!})g|-U1ks}M!S@7mmKJIfa^A+K3Ro)S;p)~&^Qr1b zsg#*iLiaxGQ|=~P;Q+!X82rr}cIF~d*WZE-Mr!uhD^*y38E-I9Q}8RNBpppfJW0EK zLRRv_-0lJ4*8+j8MVw>8^)=-Z6PDR4kAbkueX{8$K1HRx-g+?AJ;3A20Tg zBmi7VinsbHq?BG#B_(L2#{y953{8rgi-mYC)Oj)_iXA{5JvBOB%`UsogW%pNdwxQn zWPh!|7+bf9TJNlIpP^)COCaH-B*rX5q=K?*IaBxLQjBB14AD>U zA>-90=)nrD?R}X(pv4Vx-;`lRQWHxldmw4eG?-stek*oV*;ST+V!q{d2DxP48>BQn zw#bi#Qmfb^PaTs(`x;lTyD3JN<0xKMZ=)qH^Y3Fr3WA3UD;n-s!(+`$ z1{az_dq~T7020eWi9m6J7s27@0+zmIlwk&%rF~H56JaRWE#0=GQO3ZF;;3gzd0y=7 zy0KiuSpIN>vE+VYPZ@CIh@0oS#0}rVIqT0y*u7?H5NShl#sNbq>?Icjm=Ml2 zfw7VqPo;yN0Pj`?o*TY|31G8w3CRhG6=#p#*5WJrYn~(NI!J3`T%zcI0m%`-4Oy~@ zy;9fxAIws-Qkl@JK6~Qn*&GlaK9ps6U zhWQAsi(i5D2~_l)fa`1FASq!)lT>=X7%0i`?`2v&pyeARmD@Jd1*mVewhUt4Il|h0 z5ouFX=+ZFhpB@5BJ(;q(@)ZlKD!S9Asr+=^Lsdu%>)Rki%=S)8ahZUpVpn*O4K(F^ z4P$vOy+;hfK#R5TpXp!dqyBUHvN-lf9$1VUIn3>vMP)}YskWyN>scyR0vyVcm?g-I z^Omc-Wlfwub(BVm>{_F2*VwZC5oi8TfHdD{(CaH}0sgl+zY9F`@nmSnA)rG`F|TWY zEEoHl3#SLrUM_a$sVS0gpE?%68U zUK`-%lq11tna{|Dh*VvQz>V~AeE-~VfV;=%1$(xqlg zHRtT<7EJ=g6v$(4N{!nOv8hoIr{ji`7n*hY#Lc1P5Zq8p#df=YTGn$Q>V_=Vr?(bM z5J&1G%h{LMa#l$-b+Q+0>&7r8I7zic6yOQ}l6d%{0`7^xKgViutb>W3?l`{+f``M_ zKAEYiqWWd0w^P|@vTfW;do4%*k!K_bd9O*-5xUTm&a+_d!934^$f?)|=8(rG3TBip>!NzE zo~he)&p-z19uPb99@5?YY)TUk4cB;*@2f*Vc`uEi@SpACOq^Apb+Zel(4zX>-`QEL z+r9z(>cb2g!&%B$SFi5wkWa#a6(6?nC5x&dY}A7N&Z6y`wBtqMgF0MKjqgPelySxA z+P0<$LoHj8EpiYr0^EUqAoMFp-++$z?*PEQ9*y+B`1#3{&0yPPJb zCTf+bUc>O)G#-Rgb{@i>Tj{YyDlF_*&`*Vh5LgiE*u(!PO-~CEe40L(4W^MH0#2Kn zYH9u%LN!M;W{Xr3#s-qbTr`gvna5%@8sF=eezQ0tF}EqRk4TV(#pcL@TXQ)SNjv#ar=uy-F?%&DSR=# z<00VQwkKC;liGwO>eX<@ZxETrj|=S1s$MsB)SgcA_j~P}3bWq@i@_eel8)4dNUaWP zyu)@U`|Q6WMDGfzB-v{}nu1jDUwbR`->SB^bBZFvqMT6v zj;c&9&)aQ(0?EYI_KO+cJj_bBL%xQLFJP;`RGM?^>s*7Eqht$IzI5kV4obD%YQ6P) zVP281P4u%3+LtU@AwM|+pyY*JVic%*wcW(GCzS8_hU|oGN}OAf=bCU)8s&w9ib$BF zf}h;V=I`OEon&7@7`EL$0qxL@gc?D^)%c2SRZGjYTH*MZ|ANnYgF3moiafte^$%rI z711QujjLd9y?9T6KizEs^8^lH<-56_#yRgz+)u;P;+BAqF9$uR&k|oOR&bcMao52S zRTt4A>P_^>>iESXyK`Ah+VkZ_`+gN<&~-G27pZdWe6Dwj~QFl3g;$t*9+=PAEv5drf{ zBwB{p$!$exvmy)UwJ;hO@e7_}mNUM6#@3zjed1>^t45=Rb~Ib%vJc zU&@hK)9yv$pO1Cq=|HJ`3_e@VA$Z@Fk+WF%>l{NIO@w*3kuz3K(D z0LhyLBtTF%Z~03ui@_xVI<_PImVQrQw+o?2W5cf`WZU*y2JL@yF%r5wJY|17ZvPDi zU$FBxpv0f6cmgnrAYeZySAKiI0M0TmV0cYavA~gaz*DCVu{mjY1nB18xkDt&9Y=7u z!I7rJeBlRmU?--D&A8F|4k9wEB#@9~+Wz+n3bT`Wl}WJ{FdHgOC8BfLWxoIUbA%xZ zSlYo7VJZm0$k`HpPNr6o7|0?iqxD)$aZAy$Z0BSYh;;fIaPe|@7L~)-kn(O4Rlw0c zI@h;*g!q+N-5^DQBLy0GO?Z1RN8AB@a$j|b`4tzAa?REfLydZn6Gw;ugg9iA;fzlj z7^;S|1&X3#jCf|rHsRQZW7)wBbEso%fFqkehX-D_mDAQa&-nHi{m$7H6t^;N z>umA`fdhfry9Ze)8p!0WIV$C+!OkPS{CbJgxix8t8q1nyFYYafH>tC%Y-rph@f+Dd zkdd0DO%>8pXmQ~pTJ)+zUwDyRxQG_Rn3T}IgtOnl1TF^0^p(^a*9maMBnPO30a|+v z6D8%}%@Ux#z%_j$zo`TX6e=X2$)w6kO#mFs;AJj5h=H@mA;y4F7Tm4FLO%@~USThW z8UUH%PaD2Df_qcL&?&k5Y3me*G{u#nx6OVOF;7TFs50~?>hTvZI+r z+Op--{-$-??L7Zx#^-aeZ(}BtVv!ftE-ags>YpIdoogv6Lczw$M#+KS6ZBDyT_#I; zfR4y*LsNEe!osxXcrIr~6_r?`!yZtN<5+yfnUousXs=zdYB#iUJb9ImAVo}0T2A%?2ckw0DK^dXM>k=ca>C6v<@#_ zz)K&ANl8L|9barqF=v0|AR zvTHV&1F;crxNqvp(x}B3g1r3`piUvyB@Jl#ztdO875)GiALDbmg(k29p7wSt;U*~w zxRA;uNqL2Su~rx9<73D^sv77-H3M%pRAMZEMQG#an8ial1B_xUfEYg^fy^ZZ4X@;I z3AErOXqX~;n9*)RM9VoSF~CfTekXidWZawW6~a*4&I?HTPzM`wHh;@PsA86{y*1+3 zmnj8)tb=4o_CmrQ4m5gkuU$W$uq`G0z7?YWTz)MgvGB28045xa@K0{T^xrLj*39`` z_8+AuR7%$E9#OgCN7$Pkq1}fqAA@5er!{5&FW}z*nlGYy->BpnW^x_cm`cR;0)I#% zj8KK0V}FS1e-io|D>%o2^C}Fj1 z$zcy@Jp8!OKqqUSZCYmfLTGKhGmPA#oNItIgKY{c_Jv+quRS$_yF={I_hH?&8?SOc z>{MC_qpblja2sdgoa+rz(P{dnI9L3Q411<6xYu15V4Gl+9A;u_5^#PE-A;lhTe;pI zrvkA|>nucH1tiq|BZs44apfFJhI)MOF6I0|KQC&4{UPY6@)z$LALJdETzAOnqKl~V zVev{Gc#!}@asx0N=vEljKpxk!wO`4 zdJXr-=&^~XPUU#W$Bb}6u}o|`?i|Sy%2)_ftzcx|T&2Lb9|7;6DaS{aAhJ$2&}l8; z*oYh02Z?kTEkRtV_xq?6NweT@8|t>bs?K{jqH$zKsk4-}Y8@*ITz*im@Lt#)2MW#w zJ|Fc8bVh9ndo#^Bw^?VJReOe7A<5$jd^Sgn0a68S&u-KcrXrz&JJJ4UYz8w`Q3aJc zB>e|4eJHUanct|0LuRNj%e!0M2CpvKO&if-JrSVt6}|_>6nAxSugX`T5e{*WPaT1c z@5*^wNeBS4^0;=1*_pAhV3&!Dl-pBgD}Rc)=_v^9Y+Js2&Y(&-k~=DrbU-9Du5}15 z0RI??vVAMB54N^~y)Su^pJWN11xJ-SC%w|5(B~#(f4s-q&Ju3CmzS3j^$tk#5)4P= zu8;x?=Jj7%B<81wn`BkobJIi;E2TQ~i z1H@6N`i$K`l?Ibxg+|*-gJ&5x@A1xofV2JWscuPVGUIbH8Z|LtgGK8?zKSY|vCh1` z5rK}p0fAg59ynLWD_pgG9^hc48wtkN3tgvb6e;+8q2efEp*N+|aJE^E-VFT9qyZES z3A`BGSo+qOL5l(Dfw=6RK}Qu0w5Y^x>+1k1PU1pG3%?qFPJFob_Yd@z2q7t7Bbw0^ zB+d1ZcRZQ^mPdyKRr!$wBR-dDL1RRb(e3-qB<0;lk@rkA!jXLr$R_UjI*=go-a%mF zN--=6$^_E1GXYxD)(HU-f!6F54xP0P+Yj^n`51q}h?^Z1n+7ElRPzRBkO_`s zmkKg&V_D4LFXbDiS&{e948^_O;+#}q*@X_|QVcwjkim*D6+s$_{d{r*Mmc&>;83?Y zhbcntJ0bzA9D%n`G2`g+`Ctg~?i|7r+^r*x`7fRqgGx)KM)f_xTqP_KC6r|M`S9)b zr+K!XtN^Lh453Sr6llWkFY%9HV58Ta~$7N4+@~M@G4#;?5sMYzf{a`)k(@>u`y= z{vc3Y8oy)bcA~AGZkVu}38^A1z~$4q$&y%(EjrLkJs`bC?D)6ce!8AU=aj)`pO)>@ z0a>R_&D`grj41oazP&akt4LxxMM+3MQ8I+RhsfI)-!4N7>oV1x*M)nYGk7t8XUj?4 zY#)7KPY|k(*|ibBDF?vAQPEWZQbxEo*K98|hv`IaR`Ey-801ZwRO@?dm`%-2s~~g*l3Ns)O7&`9s6wEE9|4_Zc318q z+_ZC13~)Jw!Pu3TY4U>HIHGvG(u6I2+2x$Go0u`YgQ!}vA3OQOW{W!FlcBcUnsm#b zg{~)NDx)E6wu?lZ{7;N4>>>3>UB7+0LPbgBnT@R!FV{KmEuPP902yKaH|%j7t2GWR zSg?JIw)hJ%MuANOV;Y?Rss`ecxAmB$nd&Pv58WnL0o0@zv#jMoUh#J*C`)7D`57|9 zS~Dx%Ztt74y@4G^^CJZP{cyWMHk7pe^l+X9hi=CU=nnh#Jj-h|9vu5@f@p#ZNKeTf zW*`$W0sKc`|Ga)5(cP?$uO+9<*k*zoAIe0iNKPDjZrXj+4*M%S!1{U)`Y-AHwEH5< zMKdrGa!lO=4CIh;2D^%U+>KNSeEmNPjr*%Jvwl@(m*r2kD2RFD zW88f+;8zs#6E-Im?q>K2n3S0oE3wmF;R>1kmgI)P_|lY)*^Iv;3mM1f;xvs45z@u@ zXXqJNbOHB|PN`4GbkbwPQ-H0;1t2~%fp5R5R2Q}mS}Ua}O$!+;ipN>%m5wZXPP=u3 zcB`8?)umI>?5NR`6~i52K_IyMod&(fQLVupzkMW7tfhm_t>ImJ$bmMkWsMYwb~7dy zGnG`LOSbo7*2v+mEvmC$S0VL?a^%HHi2I@b)e?IE!S;oeH@gT)Z0OzUc& zy?DbZyR0STbp#ccNR;B-Xj5Llwlsc6BaH;}Bpj5lEMS{(UpekS%g9k~?jqf!G1X0J zRkI`&A|#s!alsM{w^+413HutcSWrG42Vysba)v_TAT~Ozs44C17~;(IjA&Eha-8NN zynWHBUfdN2)t&4{pb~d6s;yWIKn7i3@`5MbQ-QMru;#G9--QHKF}i4^vaS!0SYkVy z{=+O~_zEhw5!NY4pgc+DD^R&+yC6+b%ntkG6^W$kQWIgm-(D!L1C2lCcoAEBO^j?F zR!v4!n9O1!Hrp3nrewQ6N8P^T+$Rr9_&1&7(YlAwX+jwKUr?n_c<%m{Sq@{*##gxj?fch`drp{)Zed^@m9{B8L@Yb)%->`zc((8BEl`=$srW{29G`d2yeme;3M)A`5a_K4e8B0^`lsezqD;? zQ$q%7FwzOp62;C*#AQp${v-k2S3#dV{CZp&v{1OHXX>6B8I?G(Bh>ieqJ44#^bxN= zo?cDwz_i3ARG-na6*-Z&S+$!$2GaFxE{nS(u5I zv@QVKBueaUN_P@dU_#Xczwc5oOf_*tiy?-H@*5uWSC*Q@xxCwDN4iEla|mNeuw>hd zwSk&UCdN3NsuUvHO+gASF=8CHph3mjX*GeBGG! zkIEQeOEz)y<`RcagtQ+=td4q?2;HG(Za_vGfHPtX!BXLjj4>HW(1v&DQhA4{Pk=7` za1b#>dXMOmUoLLoz=XdU2O3l`6wugrpW?N(s$gd6^(do1-#HtCGmM#H?n)e3ASA+Bhgw~V)tZ3xj`O(*E8O}4TLZ7*0B)&gdm z^daL4E9dMUf*tI}D5smDs5!9vhwC{t&tfI*CS+pk3M27B6nKiIX^Om46m@WA5??qa z$wZt{)g{S+YEkXET3x0L6&wl4l!)JYS^fal3LDiY2_?_*WC+kqml$n;TpyJn=;Ayq zK8DbX1VRy52QFIsKv+|n<3TE?{n^|)=veM0UOj7-nTEyx-4IE|88}>w*!s@=RA@h> zcENH}2~``Q6s(`V*`!3)-o!tAdrWAP4y{7D4KrcS5NakN1*I91!{Y;tb_t_yHl)M8 z(x(t>C}s+$>@UFM8Xv&KmBg$rzrgIU6jt?q+e?{sBbomD{33B?4z+!vF6hDeDEqCvU)R{oYbWjD z=Dhuf7P1T7U{5YqWk;USzDKnYEvralIT+@`2WU9oeTiu!v9iaGY5vt+0UyY@5f_5D zAR5~Q$MAq8d=!g0Yb*A6H<@2Pv$b3l!%+-!$x;H>lg&ri-N)&OR1n6uRrNgW@m@;O z>y#tLVxdG30T!JZ7*O}dY$u5!RF5s{R}j^Jrt9e$>E>CT`rzMJH#@aC?W$tEuvFMGgru`B-l-9s%m0P-V>tO)uO#E zGhi=-a1B*aYqJrO&Mu3WNvoJ`Yt$e+-VZQw;wdV3dP$Gj2FjnG0<3mClT;hvPA z*qKtM1}c3yI2+lv(etZzDZ3EcqL(Aj5bbGa2Op0yc-UsXz}8a~rIdHVgNKxZK` z|8X!3E_CZz-HAFv&kC?}c7o5HnHEhrB0`TNN5mFa8HwpH{ z;&S;ATVI#jeIO2DImHWY6Ttc^2O`Js!6s?JsnySH?x6=9r^84PMrgFj1O;*|?Y zmQPi%Pop|UBm*56Q6qr(1M75$M%;7Y0D-y$!Ux@|^Mr7X)uC@Iu6sD)+vURM(BrAN z4*K>$CSt@Z|2m~jOygd%m5{AMiF0*<>)aZ!ihP|ns^cDn>KTnd|a=`n1>a;5P z2;=Ss@P<;EYFK~(8Y!~!ajo2YK5Q>54|8g1YrtEm`eh=gTtg z`EE^6wHCH4D{T3<6LO}T#sWnxPkGdW1ET`O4W6n zJxX8Uv>hcT6A}KX^RR(fRx)i43BL~{9MytRGjII;y-s?6*b>bmj&DQV3m2Cn@33I2 zv&}5lJqR2@g(m@%o~!aLNac_SZ>ne>J@-@~7>|-a2P517OGpGd-is%#NM2aa=sdJ& zs~6d})pUEy0W`9U5JXF_pp-qU*25?D00~c8o>;z)NXUTFd^zfnz~QL$@lyO7yju@H znfrT^<4bak_lCYTZ?ZoNS!esSAnzgeQzw<3iBMV3m4Hs7)8$_b(ptfGq}RQjRpc3L zfWWesXDpmlDKvMAPpMXr93?Id<(R!tdw$063J%qykPHfIl(~K*O28&_Mwg*OTxpJf zo1j@zIAOa1ip$o4;+~5@!Io_b8c6Z)JZRi`5h?h9w+>-d*rVaHV@3Pxu%bD}3X2+G z;d7V)>0bmEdKU9(^en8vMYL!{IIH&Y23&|t^CG$L+{IVcdfAy^>737~{6}!n^NtIuVK@{~JXd7PX;4W@#LBW6N@htvpo3or8!Hty_FvOMt+)9%tN(OYN=kMM7#TxJz7UTIy3o3G^DvY)-sC?JlPnmqXLMjf&Z3n zr*1n1=Sir7S9xCcbJa%KGc}IR@|+QJUo>;2J#@nMof;%S8O0pZ35eWz)xv~Z%a^cf zc}j(BTn%cTb7foSLfO9`hiN328WZ;ej_N~*fU5NwdhBE5d0O7=FG^ z07G@2rFW(dObqfzse(`I01O^OXDE%&PIW2Mun2k4&1d*Gyd!CpFpjTn)O+d__bDiO zx06m2LW_YuyP;t)d{W4j$w>`=!Ie&7A5mF2znkR&(zlbd-i$Qg+kqT6C{`?>S4498 z7(Z%NI_m0_hV>>u5H9Xo@p@YJ%;PerxQbRA=p9tEjZD7k6kEp`OcrPRCxiS19gWWi z1V8OgEXFX_f&pc2{WwSKI1UP{B=8n+bUm?)3xR()&L=gRS#wXuEL z?GK&t{Q{!*N+v6IkVzii#*8Um3zi_>GL|fINb0KgkxTt{gGUI7sWXwANnW*TS9i8} z&|g77zB%Pmt^@UuK^RwEP{qdj;-IB&AZ&PEvB1^#$Lf!Xk|pp>HnlbZa1{EKWArSI zq70ycVx0y(^<;8h9Vr`fF01KW3zk(d@U+zq%-by41o@T@QP=QWwfr|wV2Aw!o)bcq zA?Bna(%xn%2)(;G+iBuc*L)1UN_>xI)jV6pUfBC!F)PrfD*h#<@3mxYHLv`#)?q=5 zy+{%`z7S=S5U87|__Imm$=Zv63L}X)YenimnF`g|sk$4Azsx@9eTQT2NQHdo9bTKi zA1rGTcgTz^jAjD{$NS;wsX96KQ8`UHGGqaoPYk|W(5rJJCIA{>u658N& z7H3q)mN)n;Wbh)NHPPU+TGzt_@Cw)08Li)h(b8`R5%~PSMrnP=ql5D>@7)W0bVP&z zCIW72*{0Gdh%FK*k=-!zbKKUk*Ku1@uVc1&wWm>H%O1NIY@{3a32`u+X`{s&#Dg^W z>*oERDS2yZbr&%~vow5) zrAX5Gn7v|fmc!hd7rS*k(iI14U*|nhoy}39%VYFDL2EwD{>czHlO$i?NpV?h9Cn%K zqalxy`~OXy{kCY$QX~GctyYNw?Mcehyqey8(O3gJ%(o9HV<2>SgQ*Uu=-%qfB{I~U zk+s8A+g0*>I;SFvWQko9Lo@{Qt6dZ$lE0A*$!UL3t3446+BeO1jiPa3p^V-x1`NK? zu45SJ#R>D^r*~z?O!TnW^qT#M^Y!Q&5k{(Yi}kJn!P0v|a-_56s*AlMUU_2ou6gGq zq~jbuJ~6~3o~iEMD8aNI4Th{uyMk?1u4ACzehl~w+P)%Js!ebotSs%7=r0@WmUdNc zb(6hT4e1;1nAD=t0MNB4Kj1v_3EIq_Xs~?{{Iac`woCQ1^-t6_V3F z6Fcpr6n|9QZGSWM6I2Yo9Ghz3s>(5bD>_t{^WMmPV}x((JZv{Jl!BEH=q@AgyGCTN z$diiCx1>|lPPh60+$F4K?Z4YUh_)t!O;UD^xIS`kYP0eF#khW?s579Q_I4tqd* z#4)+^_*jyR_BqN(78psoZqF@U&&}oINm~S}!r-S&<_+n$XPh^8qVNVoJ1_!gaC*Nq1|TZF8qP||@d z$ctKpcFgdpu;1@innCQ1a^chbcf^&CXZTW&Dah7XR5i-KR~b{cD3UiZSOd_&2KxM8kRtVDBVUx`%AvU7CR zKExg+WGy}A_dtPAD=@MPLh}osP0(v#&Nuo zEw&2^&M$y_0>?onnA|#dYEe9dccraqI?uy@q;PMqeA3e_zTs!T63+6D(iuxU!=O8P z)URy3c_di3%=f&(GGl&YYkW%(IggGpZo*x9fH!T!;-r(fAT(MeNqS+lcL&r+QZrT^ zl)a1Q@=gxjV|t<_{DDdPEw3_~Vk`@V19p45q>6&g+GI?3PS$n;v)F_6i_JCj zSwf*4OfQ7wCU;pf8fO7px(u=4NZY2^gj0&>795sD=a$sk_Gk*!(u3Ko5|xc>VN zx_uY1p(tT))o%8`6n-FzjOJ%nE3 zU$7OdZ%HL8dh)w@vL=$fWH+2j>may$5nm21P&pM^lbDL>jf%{b>93+D=@ zbv&TGFn0H&Q{Vw=74d_H!~g8sG-nV1GK-_u;G+W@CdYvQR&00jhGK|lgW*4hLPe?z zjIZiTQSpQcO=_}AVl01_{X3oYUvg>3)6tKkHA`i8!lW_B!fdU zYAolDa~`-uRZQ-M$5l)iNSJEd%uC_kLVZ;?Iy1h|Aml0L0Wn_Gz=0d_YJGIo5O(amVy0 zPSxD-U(+!BW*?JZdOnc#{wSTjEDghaYu5hPMM)umrAAP+$Y;Ol?ysjfiwoihf<7G8 zl}t3sx88bQFTv~g+kY%SKaIiuX?j}=D3EzJl~asFpRx?@s%^ptryRCLM*Z*8xNsY| z5o|Fov-*zp$45&xbMNFyMVVXe!BzXz<$~5o^%6gC_1&B^wJ{x=ea^TUv#%OIs>U$) z4^%ZfO&Rlc#Iw_%leSj=zvN-gZ4vX&5)Yc)O?iJ;Z0ScsdpxemW+|*uJk#7?(MdB&{p<&e%ue0i&P~{Q$Nvf&i z07Fubb6#bPy%i$ zvSjb!|GIu+2~I5JpAJ7`Czk93W8Hc55)Ebm2K;TVCz02~V7=#;{@wr2=S6xRD#-J^ zA1-Tcb=&z^4(MT*-fHi#R%WRkqPoNSmHiXGG>5ri#*pK)GlFiBQ$B&tT_sGq;+njo z9KUHnA%&a!W>7+7B>XSMqbN?fCcln6j0REOjlbpDt@`8B(jI{qC!z@;Wk4meXGchz z-JdySDX|h?yZC#J*l#QP&$sC3HT~QXso!4f=b6RRMZ1zN!Q^~1)mM>~uj~^?J=7kyZcHO+yDkveJbKnY$%vRsGU*=bE2=NZtg9IC$Rdp ztO}HFBa1^Qa+u--dFY-GKwGsBk0Q%2^VgG)Rj`Ql^U-{^Zl9dPdql~;Tpbz|=6rwA zZl1JBVGfWJP|5T!X$;^FIlv*8Ce+ZlraCYB5l08)2qdsxZx*GQt6K)-Vd9h~`KK^Z zWt1i_?a5G)aCP5IZ>bLpLofmiDU+uN7wpWg&JlLo6NG`56nxkJ{B} z9E!9(P)$?CVMcR?T8^J_^KJIKCj%;3Y-f=qQ`R#gZpj;@6H!Xip38^GEQ1Q;YaSb+ z58yI{DSuEr)Ospny9zH9nN(C`;n)Mv+`R@gln;tbcWgPfr^RNGmWb`$-bJq+*>ng8 zx95t7w=G)~uGp2r9SZT`3ot=C7n~Rj`dM)&s9CBn6Gl4qqVnw<*tx13lIk~(L1 z*h0GD2a0yQyWgJc0U84JYTP_6bMn*3QY#HoU)Hy>oIwOp7WkMh0nfnC!;W2zAh6IL zyD2Y9UP!jUsZ@Pw40x-!!HVMx&JH${2;-qhZVrOkPNSIwy7q)*8AwCIASRJZ^w=-r1&Stm-JU&?jvFF){@SJH%w5yuH6gh51b> z0+__9G1?mVH*Lw~*H!2|>lHdh-z01z$C4jbk>_FcB@~&g=O&C)XlI^HMa10n#ticX zgcU2JeDB>0C2Oe^`ZjBHs;5um8O!)4a?iD9H;4RM_A%m6$Emk@oTEjcHK6qK1!_dAximmY{BTY)?t@miWmE)>QXdsmtnz#GzIta{R0OnIKawbMCVd zj}F-d0)d2WDzmK=+4YiK3Q&u@YI8V}-negw{lP?PP8Kbs$Tll?|7LH31)huKLF2E= zphNmY#m_A1?`wn*zp`#q4rJ;RQ!C#1Kn^)m(gPTjid)|$XN{ko;Fn5i<8bCJt4gY3(dGh+TV zprnu8!R)FIkqzdM^n~Zn&sqn+uG1MA@@GH8hVm=SagT~zR6`GWrREb^NqsLHS{AFJ z=xJuQU%2amoh*6q0_t=I#XQNQ%CoxXqc=l~&@|uCQwzGMtp-b#;Txi5)IpKKAHn|zLOIABw~_ed`|!zS z9z465J9(NeMQU!kl_Z!MImB{O#g%@3X=~l+s{i+N=M)Zt#?$YxcgRSS8Y1Ne4PzgQ zc=#nFw0wnwT*bq?xO(E@^jPbvGFXUY&!C z;=&?$CuZ0kO+=&hG7?F{Ep} zWY4S7VQn1BD#|t@DHfeB(|lUVZ|0J0J}}V3Qcif-2UUGee9gWi5%%~^_SMKdjX4{vZ0yU&byQwi5=&~imoP)s(MLXX+4p_LBX zOQ9@lFIVirZ&$KJ3P@L-hYTDP#|@GcrgH?l|;ngLgk2=GS;dIqN=mC0gH&HB>z;<#6EB?3W+5{p`z6g&IczMP{{3^|6!Lbu$`#$sBLU)4M549 z#|~`AM$!pb@3M{yyO)CtdIW`kOkB2^dmk~;ug;NzXLbp`HLGsR*9)>bmPppsm2x>mCAG=A z{vu7G9+=OMF4eKw@8eh^BtG$rm2V22ZqR-GxuLu8%1vJu}RhkFZW(B*j_Vn`JtH1C8ys4$bk zeyv;7!KJ};WdDTKw6-CgR)#%!kZ_e(S>if4_}W=sLgdBP^aN+ovRxGa%=mn(2{$n8_IN=IcR@t)C)Fpo2Lp(nEMM{)ASOINQu$6^Hm{0cr7J5Kap4c=%K z=gw518Q1*OH3~ePTa~Z+)AW9vSfvNm=XDip5A72i$bEzgqMJ`7y3!MtWw!eRkjcsB znA-ShIxBA$&Bb9LKF!%J_uAAZ5|sZRWA7d%S9Ra{o>OnVP)W3;LK33dyh?I{8z(^p zw(+TMb$1cl&^TBW595*@aA9oRieu8utj4GME!zl@iE%T|h2l<@S9@}Y5qH*&g>MF* zlH5(RR&2}vuv&MmAq{H{BmN;GzSn6olm6Y$cb{rWU?($cnTJuGefHV=w|~Fy@B4e~ zSj`p>kwY>_e+JGnpnm$FvYUikU(N#fY@@3X8wI%P`;=zLI}3v&5Frxb4_N|wgema9 z?dWDV3pQs*T?Haa;ZmJXYK$&H1mXbX&jnbEoNb>Q>>bZdkJ&m(R2T_-&)KQ)BvjDA zP_GotWi>)Clb(Gx^E*_@>67B1=Z1jh?JYO(3&O?A!etS!diG?l!DuYE5|k}^C|1No zufvfuoH{DD>BU5w|B0ePL4+!#n7@p+9|yf0DA*LjDTk|ue%9IomA8vs)cGh(^QG$B z^k4CfUQ)Nf58Rkle*5N?5Z&>8Oaw}JB!D`xLxY|@7T8AAGg*d!sc{7SMUEJ!t7Z8m zs(KaIM9oqHPUATRERO(GF}#6&0~9M|%Xa)Ni%RT^bw;cXIvx5-e`r6ifZcMpli5R6 zkzb{L$zDB~-{GCIuA*&;H0lk$yL7h7f*xD7>R#OoEL!D7jtRSt8q0h3b7o;G-#zHP z!<8(Qam&EX2u@L*fSR!m@fKTL0R+TEiBa0 zlGDt;gy=0`Vg4q!90{N!xGmJe>tQ1-D!ulj0o{lLrXlM?FB_l|?_?YmPyYe{*E5zM z8xa?BNvP}?W$3Eb{i9f}CC|aZ2nm?e$xTI!{7ZLV86nR={4Ey9X|cWCIDZyGsIn0 zS{6De=tR?*i1Xk#uV4%9N1${p3Tney2fTuaEYHBU%MEl;xr4bc7!vG_GbG71Ln0>U zydg{ycjkA7Vj>`1<2M@HA| z2+w;XOM19$+Ypb~j_hd7XH!KV8-i$$pSK`?&saaP{}=m#emrkKp8RL*M>qRSJvv$P zY->@n8(RuItXgDV;L!{|YMHJdqRgXsaw4iJ_a{OEu^3}D_45KUrPE)1!X9x{YD zHpQ18oz#{!>?+#fP@yH7E1o=u3H=k>K>dVms%oX)N9^=b{*1>_u@Cl*(VUtvaBiFp zWBXp>9LNL}?6Y_xtnRlQENX;(Dq-4yqoc-OPch*y*&5L>9ydn}ZH!9InSno#2UjUrSEGG5y;M9A_D z(D1`Pt&8}4bqBtuj)e;l%Pn5JLb}8m`$3+XM*m8Cq+YN;RT`l#xPM1-ux+YR_4?=W zA~vIWoaMT4Z_%?TS6XYdE&H{h9MOt|Ap`q2wjK9B-{<|thws~~qlAd9Jq5tlZLF}Bq+EV|Ck^>Xvf+4d>b0BuToyjtr%d~=!y3}0 zo;_t(E-LdiZcfM;K8kB;k+2;ZiFF8tpbKK!rx&Z325PQenzC1sedp}_jDvxXf3Z0t zYKzs_!*4Nak{;esw0CGB=AyQl(B9-7VZcQHK2(bYbwyh!`UvL->}wN~d)p>l!26qScG^~$bFNF4);h@ROx&{0BGWV%l6pO`I!OrBNajM`k^Ya%B z6zv3-0+o^6qV$2^WKtl@>Y|7?^x|*x^7AIeu`p;r8d5ey4;&mr{>LyVt9Av}1+*ms z@Kk^s4nkp2`!*z4bGdzuc+RP!DJ4`%oWOdwa5wLgH#T0d`{ct1-iUpi^dgDD zR_i~+?Cua%kVbQ>Z_yL|lQu9N1`M15VIS~D#I7FV0w=-whXaO)Jbr%{g@!#@&{xJ$ z-5CN0-S$*P{%QYna5+DtVc=t^Yy^WB@?$Lf=6)KdyQkA*d$Hcwfz zS`9Sv-L7w7Gl)4d(HLC#n3wkkNrt(T_x4JL=)+*YvNxaTvv07*Tc+%9r+F<9N#;@3 zaP0{;e?FINX^D57!&W-032h!v@38G`_1i&2k2!Av1WsU`L+cv$iZqXPF^H_J`3k>V z&62drN9fK+?lb}tmz4Rhv?9CpL_FS?A!j?`*OMv4?l3wRy-sSEpR>o?XKU!)7b|s^ zo%@dD4Jkx{b5)^Lok#Y0YE~0n>j8Uz@01AL&ab9OB;^~$;5Zj4=V?0J>SK=#R)*Lp zl2rJ6D<8NH7HI4i?6%rhtX-1q2s|wQ?am)}-JSSI`B`G|-uCA0l?8ih%AOyv?Jskc zW5!;3pIO7B0Z>}otrzY2umGe!kUgvvF0mBKJn9ZdM4mltMJCEw-f5qgO|v~A(R?zc zBi7obBzeawMY~$w(oApB!W!m>XvmGtBHzp%ynXdP;CNcgv>{(bM&21=W0C1;bl~M! zv5l>qgo}zL{vHA-UimasXR5c*vac$32ckGvFAs5#VQ?WD%$gqL z5@V4_yNSXE( zDrx1jLKZH_<>?xt%|C8$ou1Re{(y-LhiJq6O-)KIVJJ5kh6RA+VNZD~g@^C{ZG zFv}Jqzbia*ld=V(fDt~;kLjAYPQ7rlmuHG8OntW}x+NTwMP!0wj{9&^4lsfQp3&yf zac`DeJAtdT2llH$-LQX}ZrqCx9-fv-ZkoVodir<`mC9n_vR^6MU+5$FqH8?CRi5x> z636FklV`7ux9F`KFQ7AxaOs>0itMnA>xi7HcS!x^zOwFvj*a718<1@rJESni#kSG% z*bQeJy$FSVv2i>a8%L~7Kc`#9vBDm+I#ib0Cxc?E4Jp8=J;HFZlP9_Ec+y5GZNKo8ZRJ#b;$ot*-Hat=Dw~PTsGx`0_m-ZU)e7j1$N|%k6hR8k71Vi;Rp1doh$I)e7xLXb zZQpK4(zk@RqhuQbHsUI;#@7}G?dXl%IOaV#b<9Jf+FPM@Ps4h%V;eZmBxvy~>H>11 z>IQZq1qg!_I@h+bAT~NvCn>pzYWSFzzG^u5I_8|+0q+2Ndqr{OcK5+#qyL*&$ zml1s{`6W@daM$YsZ-*S#Fnu86MniV8i-)&XdD%Tt{sq0 zAu0ysa&a+MICh1*W$c|R{Oh(pEQ2W#FToG&JG&ZpJt>~lmQzhChGjyhXUNhQx~xki zbPe3DQJP%&vOJ$mEZ+Z0^-4`)puf>VX)C&g30=WtvtpKqp&jf7Z zgm>1d@7-LN3KWPJ3g2k!O1e|I%+W`A1m5eU!4>eT%RZSGwks5pIADb(`|Q#n-WwY_ zHZ)bUTXjXnZcj0~YoLb46uP?}&7=*uv>S-YFs71p`^P|73m+4i-JrUNJ}e-a=-W9w zcI)u;Y^6vM;b(IF_N@W?cY#CK9Wvz#+o%8xr6m|}3^Mlnz2@7tIQxA)^50jt?_q9R z7u#LuG!4M?r3z}O&8(C_4?qNySc9S)Ui{reds8AH&kjKVnaMf8q2no z(R6Y#ci2IojyF%d{fsJCQ~7`;#4Pfug7Ry2eT4a8)(_Y%NchIVvMdnG^J;(<37t&` zN*p2d6cUrEtBsZXRu1JfZr-r0G)LyGar6??q3Xm(Y@rx0kwsGvyMxVGy}f|r++f?c z^p2u;j+{m_mt}JLaR-Ehc`IWzzu)k-K$D=LbrJ%^FH$EDB7UHzNL- zaXsfXYOV!^gXCNa@{1R|W)#UpJ7Cv>7HIpb5F z!Sq>jRj&ioMwzdG=}7 zX80T<@c}ml1aD5iLT+h5-+e4~W*Ekquis$#Wq{aC=zqJtLBT|$wk@v)GaM?G za+a?|6{H0@WHufGJU0-lC!klZq$dk~v9i?U^J!apZF8-SZctjJ$c9ZcdKe?<7BN3y z2_u%7EjI!b3*7nE8xvT0qW&8BaV#v#CShN3nM!0V>Gu%Ty#FbV0*!HI?amn;6RK=E zul;qg2Rq>WxNeWC2ol0W0w9cVCo2v!IbzmNfNy+Zz0J{0Y6 zmDxRPFlX`2kSUWE#KF6ZXoWgjk`**FhAEaqxV~li5pp6huJRfLmp0JGu9749Lre*v zZ;HHJ6xy`>LL^qO=kTgE&}s7cZ+1`)&`i>1G82M7sYmyU)Z3wt9E>Bw=stm`vFUMj z(4@}TZwLfEC~X0j6K;7(D9S+(%q%%BWd~bWvU$}&Z7rYW_lH?BB+`2yY*GxMKaX05 zq5(9~h!%$eJ@!31eHPbfky0OM0kiH^>%vH&mAQ)G5M9jaMZkCXh>B}BWW&>38O~L{ za4|rjxH;y-K#KE-!Qr^HjbbHoY_UT=1=J6Vz56U!YG(^C{XN)+Xu7aZ|luwoS3qQNMyK0=PQWk z#kELf4*x??H$}jYsrPh`x+%BV&7xKV2q<%sjhAEdGKF2cBT>rpUNH&GrWaDwnjJ$9 z527_Vy?MTo+Y|!w93Jy5gHF{~t=gw|Q8gf@DS-~x8{N4l2G(mEm*k7RkX?dX;T%>J zR70hUg?%tksf5PNc-*2O#^oPL#gap<_?lAXFu`bLVAyn0`rf%}I!IKaa`7D49PS)?{KY!&ed_=@5MAmeB)cM9aL^=-6a9Nk8Y>Y4&(w~ z7%0kgx<{E?%K&}?hkbslOMAei4suwbq2D^zVB##3B_49`Jb)&!Muv+a~Vzj>5RRY^@64s4UyeAvo=I{VT8OkZw?YB{`_dl{1Va`j7zTxdd;b=tm?4n zAV}Qx+XO49XX}+EoKFJ*meZ3xO#@x%$0hyvqwdGA4EAa7!D%Q|vV~UIv+`oW`lA5h zyfSiKKHfstHr$(M?e3Xs(S<7Z^Sp!%5K5`+u*}5US?mwvGvc3n$H+^+A&`?R5CqBy zd!!wNBM&R=yip;!aS0l8ex5mRs_2)@WEHdPlhGH#?T5w&@^oLQ zp>b=_4mXoY)8oaBv@RdfM$Pxw#AKRcK?kkq&&(;KBqpQUK{c9qMzZN<Dzo?{npnzSidjBhpVcNpwVsq;&G`><;qaRN0& z18@o+`&zDZsOm^k&HX@tX{ccz2q5o%PY~9j#ZkB@P~Ka{rfzbIHZ2AUMa`6efX6sM zbj1jTOdfB!BX!IYb^G~Q(tJ;{o#?&%&{&d>>DJdW7#Ax|Q578YH1Sr?dbTr#nRzJ@ z2x3mvJyor4Y!+f*#(AU+2>(Ye5}GGtA9U(5kAeU5iRc7Uo%cDhBOwQ-2h@=nUgCV{ z!ab{vcKme$9Z3(KQ@vH8bbkx& z>ABEW#{?Pv8f*=68|Kc%49G2sSKCfR-be>X12|ZTj|n!)CIMeu_Bnjc3uD7Ywz7+B zX|VYup5?qVLTj@YL?bGzMUim2`vc3-@a&Gz;itr`E%$H^uVFx4z#cP7be8i1^?ut1 z?4cr(k9%!3`&n!x5t){fBan(7|b_F)U_MKe@|Djf}SD_q` zV`y+bj}x`%_4NA3M@|ud;%;m}TEid};Ay@UN8JuaP%#koO@d z5fG66|A|U;qT99vVPn!?K{hugXpgwa_ufUO4p)I>6N>=tq)jVB;C6O${VVKk){l5W z4CuJRs-k0nuy5v0^Q82Wyf$~8gZn;HKkoJFXm%;X>YlTGh-K&Tjd8b&_-+N4BIPc} zl@j&G4O}*Dzbzy<<~Rd<>gPP6Oy4V%w5+v)%fDF1%P|$ypSoJELtcxmQE&h(@iBS_ zG;?DGONV@SP_es-!V>%{c*8D7grp8d7rd}$`%3k=IREt_3X!oCYWPA*O)K3G$N>Sm z_}IG~=5b5UOrh?QE==i=pr9g6Q!28SF<(YtwMe!GnxJ?RL%D`JwNOKfSqZE|f3dqx z+lp%X>U6Wv1hP%nWbbp@(@_@{^I{$N(z!#b0Xgo=K6B)b>y{MA$O-qSEis%Il_$7Sa z15-5}6(yYrZ)%-;9VtmDaz54KVn3H|g6^_E_G5R7flfO1N$<1=np{cf28B#)^TVqF98BM zvtZQXB>1A#f_CF*G41$wqsNMapn282IJOYvrURdiCn|GuBM`CVbHd>ap7!c+sZyz1 zS0+WSvhyx83zhOHVxB#~M!hY%Z49f-K+{f@^IaTtcS>gF59sDVxBcjhQTMWG87JSK z)%~xxVj?y7!e#VzL}eq^KwnIgVi%8&%Nf&H>$1{y%%zK3F1rp>6P&EsM{p|3>c8@z zEjg2`BIRsM90#kTH7QjtVW5(BML7vyn()7RidIa?_W2)D1-zwHjDN{8kxcFllZ9P& zC-d|~jpLzC@H%D6ENAbElAwci+s{d0vu+0(IaE1#03;ZMe$PlOM#SG-MTFwoUU7yCVQAU-(5Hex?t^#*-(?=HI3 zob;RRC8@p{eI_K`4K%BHVU9nAjrJj6e1K+KT4-0IxoBNY{O*f>KDzevFA$SE=;ebDF(56A zGI=EKDAMXuu@HqSXfnz7Up`ICd{4McuY8CUJ85W6d@zUPxtO?4U|P`xL0d@@;`uOO zNk8OFa!!~8JO@?fvHR)G2&`f`H;%~sU!E9UvSmi=vU_Xx53VV0lVkCuN7bedRD-$w zm7Cj^I@59Q4;cHjpd&|To4s~`k0#MtCAEYC1CpT#1@c8K^;q{L;`Dq%ED6Anr|%=c zX z(1{k5*^kj>r~iz6_mb5BXFW8$Vj>~av`2DP0k1NgOoU=Dy1iVoKUXOW=rMFLd<9cB z?nGp+vFtDENN(1Ptj=mbYP0fWRqa-&J7~6N z6CB}XcI>nqaF3iZ>LOTHuT;#V{K$kaUeOtsuO9|lE|wX@!Mh8CjQ-|9des>Y!sfc5 zR9uW)836;#lo^IxJ*LoN3LJ3H%^2dF zYQ6xVt4Qdi-)?ZlDZp9#Jg4D7;sxL`giG3E9iRuP7NfkUEWM&`)99moIcN%WvFBHm zOgOhNb3*W$XVQ`F6IVRL*e^+*k$AzStz^EP3s39iqixM5;GEHu3I9vD>PY8tYJ)q$ zT9kf7IH+i!!Ask0_sm*(hUT#x;j`p4urVnmKkV|*C{NAl%qsWnPJHGkbWh7+zR0VD zBTG4ZB@m|CN@Z1O`F~crK@XNr{#$VV%v_k zCZN$Rbvl5o;Zy-kuL;N(k7zyWma=uaabVWc0c+67x4N?jR^^oKU&-E2J(OL`2c>~s zf}tOWkZ6Xib0F2h5`EU|w_O2L4#gSJN+Dg0GN@9J@|Q}sZ7%**2P)4n4Rva9!Qywk zme7x|@^$o4M7^db@j~D-1Fx=c*t#(?J%D&_AOu=fL&)sz?pwH(Px!K|N{<{4% z;P^+VqCJW==lf@E@I$&x`&$9Ytax{Us{?9D?FSXBhE^L^E(0qg94N66!*o-Dk*M3C z56R9VNjOb0wv5}5l}X4QT5Q>`tQhj?&Nn_d9NRA(G1)`b0n`C?>Y7v)imvr6mX7<+ zcd}S12W&g{SMb8M-m`d^C`d+h&1b!6sckb#FJqXA-o+`Fbph|8q)A?@+QF!`7@X?2 z>ke3H;M4(Z+X1yk*}dl8DfnDWj^m7kS+E4+K(gLy_74>uOd+pIbkEIe|66_TB(;Q5 z_$J@QYC6+Q$X#qIr>z|nFZ}XW_e*-QjPQ>P#*_aK*a6e2UR6A=ulncN<`df)$KGY>sOGDj+KRYRtXoK zjRt$FaK57|pOf5)f*Q-#5S9)*oZ#jn3>7+ZJGu~kw5{c%iTdqOe+UOmlE5{<)>1tf zsw>{q!RyEkfSs`Ejou1~?+j|a5or#A@Ee_H+tMRHB$srTVAOBzwoO6)tuX-G_tm)& zzmHqv^m`07+3DLI1??!}t@alL95yQeF7kIf%>r4qZFX|Mk zMFv7XuPc(I8o6DndVT)9KV5B13fz-Au+6?ne~A6q<250ESGzhAmEAb!bet{E^;Zl7 zAATpMaBUQ7UPK0!xQ9x8l`f1h#R#aoh=nFR?SeER=+0#U1$-OI7fjGR3k<8hW%mLE z{$Z_MGcSd0kWrA9$a8A>cK;{h8(^muE+~sEC-ibF?DPY%CG5ogQNy#f+)Vo1JSRJsX+j$>!m{70oCe{F_~q;M@-!XnQ}zK-#dH#Y zQaA=yN}_?KjNJUb5_7%`)Nh*|=c}5qk0N_(q;D0{ceXyCwRDP;r&eAt7$op}jeqM+ zi$33D|GG-gri#6S2uy-Ry3@LsMp-^D0HZbwxQR)=Zq=^qYP5-9ykom5m$$FOy8Qzt zPjSyD`4X;nV#Be;q-}e4+n`Kwf4-kiITSOmRLGY&4GP?3KOVAjvAtL(i!cui(AfKj z_23Mjbdde1oil$K5ii>J?MW-DTMZXiThcq7P1mx?p3)+3e2#V8lyt)oCirKEsRsJ- zD^?r?L&uR*AUuxf48r&CkJ(4?5e}<0#_|Y^BVUxF`sVYYEpzyGTROCF51U_i^c*FE z)jU80MX}$k%y^+oP@nBtCIOUZsV}si@#C}B)a2YT%g|b zYy193-P-E)W>*Kt^?uLFx7)<|oysOlvx!!Ekml5Qfr%xby2T(*oDtImt9rSmiYUT@ z<%R^yi#0I)n!n(eh8*!4Sh)wz)wa&YFWL(>ODt#o8HP#PrC>%!s@AMl9qt89SL`$X zg#Fn9>OglnY;oOa3eLqqSh->@I){Txi;0L^UQsc}tBBPLV|77nSZBcZIiz>9U824; ztYZ&%^dKy)({u7fa;)LyQr`Re)oMl6k@bowb$N(RW#6&jJQiK#vXR`Nohtqk(jxX1u#F62<)pI^~}V~l!2i`dzOrsrns}T&T9bZ zv0D8d^*lbpr_fQL7(z;~iM@_s%jtIBMt9~vpl4&+cBW5f6bp+`7UPV0#9?=?F%@)w zf}V28rx{|tSKqNda=~A?>>V_cd;Rzv>Z>I-GR3ZS*;Nb+7`l@P*sS)v)??p+zg2|A zKg}uM>IKR0czQlr%`EYzO-_sLF3Jt~iRi~N25SwkWn_fcW@;Q2^4_b?ts7-KpOyFJFs);W*IL(71hKQo_z~8E*?D*aiso-& zN5wc%=z!=bIPW)MsTZf4w!I`HdaW8G;e`b%?iASzN3BE+4^$mG{C&pWswYOqDdnU- zbw#2};PVPf2rJcP2)}trFPVE*te|#Et_2?`eifpy7$(Nkq3|kQe_=DAV)%}4pz5m8`hc3qq*V&Ra4w^?MVtIK9&0TyQW;3$C z;grbrn8d-dqb{q$Cfb7d9;# za~S*y)xp?kZb}J4M8>0D9PQBIS~tlx zM(D&@YKq;}e47&X=UKqEe#71*j>~$!f);WoOf>q#oQam?rvM(Vab zP2|BB=lSjK3sBtUi-AeaZeKd>_!Dh11UFKf?{M62UyR4W${d_yF~@ytKzU_{aDSP17x5V@QVS~4r9;jN<@1%Wj7@3yZ&*zEkSPz4!ITTHTw_tf7%9A zB72*K z^zqKPtfIzkXjrN7^W#3paM)KOPS|ZWy{GK0+7|X-gK?7XhU$sic#U!nQ+)*|2eJU9 zNATu!VBhUM78o?zh7c$7vNGvBGi}Pu67g9>PIh=XDtX}sQg$Yjr$>=CU?V1_m$w`U z7-KjH%YEILj}|o|73&G?TDUiKQD(ySPs8mb?bb`tI7L?eko{0`FOnTy%umsR2^D0G z+m#{xm(Xp>G9hk&%do;1AUgdsP9n(X!dGA^LRJ_Z5xWX$#nwokH3Zj5Q{ zNT}*fo!y_nMEz|rImDy()9G|UeIa~&q0{m|a2b$}dVA43<%J1Vu))mzCT9UVmZQS6 z<0{a^GRZKDfTg?_olT;KN7%pa%|{zv|E*yRpxtO5sjd5pQQzeBYW68dCp%zzI0O93C25H$dBTZ^vD+TyD(YhB05I>WvX2G=ua_-1>*V&5V}jg2 z87iIY$^xpWPz8Q&_R8U1bF9b8I(rT#HL8hbNe9Qv#*tm$>qQh^S~t5m13~(=0I1v? zs)iOd>!Fa8!vE&SbgrwLyG5yGY z)5Zh$dSCfMw}cMCwQ8)$!`1T$E(UNn27(m5q5YUlZp5>h5Xa{%v=sfAPz zkZjNcn;taFa_nyDX}i`5IHMm6>?80I6&+Q33vV9_Ua|e0nVNk&(6AoYQhvH$NhqAr zKKmR7M?Emd_@tkr8{UI}-W{;Vg@5eI7HOlg)x(46!(IM~3uL1U6VApsbv+w;4j-|? z?V8^q=GckNE;V8Lgd% zHst&7&1;xxmcX;5vr@pJM3$ysvkCI0?)JD1YKr44f9F&7M%v!Owa#XW*$kvUAvmgr z=<#4b9I#jVxeKdeQ6C@8763hPtufaFZXa08jlo?bcGHbHmWSpJGuD*@Wd-pBze7@U z$)3K}j?A!dZ2FzRgLMJ*$3c(X^tuOhhb_Z6%#@EY`^UBVuzpvfQ=aZTQ;Sr$D#)Vs zWSh4-(BeZ%TtfzUZ;>TB;9%INdf7vq=DWFnOGZAlzeB3tnzA2Hk&!JF1BltdCJV&C zD%a;JQoNE;yGbmcW<6)ao)3oNHc_t+QNrdB!0#7qPnyov*3&vB+O5BG$2+i*?x7*X2Jcy!+Ig1I!BFXgGj zN1PXvV0V<6Mmg>gdP$%wh2Tk#U@d$)?MO|MW}7(9Ym{gE{ie%{INWCSTOwUHd64Dy zBQj2Gca!NiLVs34cNo>8kRA3MoE=airqmF{$Dymf?UIFEk9`uieXOJ^Q*JDuWlUgD z=Vpc$i|{3uKO+A=20-1e*&oyqg%?;DUY|*5cRsml`@04YU}VuC@N(?7-acYZE0mcpztkzt@j74ttNsJyI^U%h)gno3Pm|*Ee%OfU|W+#h%F5 z^B&vs0b+Cr=x)Zt+dNJ&CFaJbMGs_9G2?DoRL?T zj){CIHw0WYSY`WG#K$RZ=cz_y+sl$Sl3dv%a09JL3$Zb)eN?fW8j@$6#-~NTJiShvN2?QnM^0j{#45z`H+j%vMtYqz(yf zhXtVkAtl|1C#@0io<4suOrjtx88rAH+eHsN+(J$^ojBt!a%hQm1$Ks7v5~){QaD zV~Hl?)W;q0dDu-!yR@iYEu?d-HIsK#4Q{XZzdM}d>RWJ-8(P9r*(xO$%$b9IzW|cB z5d$Tg5r}9*u;0!OK7JOQah?r>sSRa2x2(8KrM5kqIDi=ZA^>!wGIla{Zn{KeMy93| zDiE<(8*)^i0(o`&Pn4+*5NmkP?*oOuF{K-QNuUM?#F4rNe4-K!d~+)|eoxsm1AbsO;5egLbFo2`SGUWzJ&Ee9;1@ zZu`GB)Nk$BV&E3SE?XGl&7X4w&rX5T~@BR6U`uP*? z=k#Kwam8IIv`Ou$Op?P`%%va2V!$fB6C%XHDmjgPcr!EOoWWZ|et2X;Y1tA+LgwfpCyZ|+OBL4THjj;5s?_Z-NGeVA zA?9_}s(;sM&U=gYL#&<3e`x{?xZ>6FTLKjekj}blf3kA|+OkQkH7Ej`=)b?_K#<^iH_l}= z4?v_LvhRX9f9FjOfuJV%ly{w|{~CtEDINxyB-BU+#1uGnrf@vw0?)2vF26>@!TaMh z&TE*^^@x|t+uhoOd0Vz8FtxZV0)RQ2fwQpN0x}mKc>}KNbjm zA&fz+tQWI~pom)!2R+P61dB0?K%%J+BH?WZN3uI*k^ z)2Z0Y5dkx>meOg->pWL5q-CqR$lO5cZc8SZE2a4Kt~SX>fvxnAE06UV)>Q0EWf3s7 zy!vQ_*(5=pZU};8Q3zYunA?Op?{@i?yipp)Dori-ufM#$pomIU?1O`@Mutg>O)ER_Ln!N<`75zh#@d6IgKYlKFQ}Yu}JE=$u5!6 zt((v$#>(-qf60*rGcwI^gl()lnMJJC0r4w-)gG^xP)5%t)WWE3dmLGW5-t)ayd%<+ zbFIaQaqIT?Y$MjTNZq@;7}7`GmU1H;=DTwp=*buDreq#!&$(cmz%z-68SjC(SC~3? z1m$ml&aFCPsHm2Lk13fV`fqIWn#tLPW-gdqAT+>%HDCHF2Y@BY$T%VwHizco@T-lzJNBY|p%8oHt)u)#-j9tcnj^rlc6 zkVMHp*g5M?`$i^wt!L|xa}Zb9s>uEo>7znSd+KbLs+BWpNa2v`2!L^?E}4UrCaF5G z^#=%VI;2X}#hzOwG@i2!ffRT0F6im-%8?ulx}`(Agcwsul1*Lj*@*eW@sJk#fZ*+y z;r#+mf7DE$Mim#C0T<%UwMbtq7Wh5i@n8AY ztpO*=by5UTyQ-mL!7F=M0Hz?kYg?Z#ya77a*Cd?03gOnPaB_5|WJ{Fm3K*!&NWD7X zm$1EP7j8AEFtS`3zB^Y>x&|3eb9Pm{@jRXdYjf4AjSynSwR@7B2Z*|DptaN>-_X8* zYS~=yW<=7^R3NHMK-f*XBI-J7S5E?)J#^C=Z1y5T2@@)!5bX7Bz;od9O(?@v2YP|N z-&YkrH4zzuKfECWp16oLyi%;8PkCqy4khB0-NgowB|4oE5LddZgRUD`z`_1GyarkZ z+aT+GM7b5?Hn`qX#rY;6CNif#c(RX2_|5g~ycMUZ8)2;Hv(vbb_wm=8{Phff9c0TY zsX>>;(5c$`KWHdNQx$~OTb|{54BuUR&39jjlf6hXH2M$bfGd~1mbR$?03DE^r`}fx z|8&5N+)XcUjKShMc!)o~YJEEq-JZ4`EZcr?OlLFgNnI%96S5Xb+7Zwi!r?UF=6Vmu zZJmz&ylXCP1#a!l5&cJSK%6$Jz7YUOsa!|zTLeWw-6kKp--~663ziT*Zkd&q#(mJ6 z$%=~;h>k5%(9~2);OZ;l)#)-Hl#-)_zN~aOuKiJgLILPhmMLGn6ZOW(VI^Tlppc{;nE6N_o|8?qQ zW{dXpIA?y^6B5uZC70rNmoPd&b5}vT7ZH^!u!-+mPYR$yyqD$d>XQ{tLXBePAPk(5 zySz`mjP?Y`goXXdDoi*s3w!~l1A+;hN>guHrjLNqOF%4mZ$oevBT+!Y6?SZx%@3)_ z`?LByZJQB}3`aU3V-w5SWRrJrr^2jRKOq&^bYTOole~^3MJ%~%Bl~tBGQk@;HVgMy zI}TUs!p!t-m`@L92>hZdSF@Y^$cB=g+eCGT^x%Hmw6@}_c@2RvmDaq8#cW9u{6v3o zuyUNjZbHa_{o#}Xt-gIXW1q>O_odelha^0Hu~8=+hL*ZL55mVNiNIV3NSnnPCfVlJ zJXT>NSqeQt2hj6Nm+!fS3xSn!DeEvV5GM=|Q&T#HnzX6*Nb_~z;E)#4>6nMnF%xXl zTdWfw-FhEv$6m`C#kjr9GIxNx*f9HXNG4eTvPcS_cfj}`Tk`kGS?{Zh%EuEzT=7YQ z;l5UdAT#XPRq*_Mg+blD91QSJ{=^PDN0abtPFPrm)A~pA{Vn^3psqCbbDSB+#Cq8XvKNS8us872_cQldA}R1|4})OdnoEh2%i}9P~6Bm?a4jJ z$G{$F;~%X=tj|k?YNZRgU7ctsF0iJ-qJ1RbQ0pCLv#1x#0O~=O= z1_%UX@&Z#|u*YY3`@Z5V`{`d<2A4P@a#Hl_Mz7XP*a~8~fK1L*8+sqxPNo_)wfyoB zXRKc$=ul{qk0jd_=~G}xJ1~p3v`!DbQnjM}9Yo874Hp%F)E7yl4te%n z(Wjd&P245FOy%t_tWfbz2nZYv&Iw3JaoF$8)O8x#N?&q^f3rGl-;=ZS>8f>=BTJUm zM3Z;EF&yA}6_w0!(lcELOdeBPfp*zT@ba~wniu9sp_@B)m=`n5e}j$ZC_oEy4v@40 zJ6uRD+F$ZLc@pHcC}{IqBXo^2?*SV}UU&*Mkr3X^FO$ZX3iyOlu^QB8Y|9)qltO~9 zAG2L`_)*9*065T-LtvM>NSFFR%*bc-;rrMb&ct7G>cC`?ZD?b4y!H&UyQFBvXryPZ zRr*ZPc2&JODQNUpw@n-qgY(23ui36ui9s)xI>)?nZa|0;#*<~Rd>N$IcBCaod&G)V zdr6wPuj_Zul7zDuRmX-(IHWHM0<-g&Nx?)x;Cj#Dh5*K^+TP7QbdH*}%&J|z!(;2q ziJ_O_dV}#&T}!TvLufAjF!FT3NjbdqPA@Da?K^bHgY{9aA^UI1tHW|iY3mX5ClSG~ zOBwKd?Bwt`U*?`K@w^Z-nKBps+7Z;9-(nrh{C1t;?q~7~&7pwIcNZr*z?#~DpV%mS z0Hk2`?VB^?MZ-QWl7|&}OBNir0$CDmaTz;LVW(N>7ESGGk`<{r0xEqGdvP6o{y~K| z&V*-FHoggchbH?&*c$bQxCETN+{2wBe9ku=#@sy zD)c5XoL!t=4%Bx@^~7x5gHV)+KgGG8C{aHV!8&$wJuMIJOjsQUIyXZ)#lN1H5caB#*wqU=S5}gaOe#(m7NqaHUu1S^&Y@wnPq!$H> zeQ&qkX_zH157@cPlSe7w_X$zgF+JgmA>JX{L+2AzQc4l#kY#Xi+?7(0pKirOXy;b# z-kq5J0Q}(C(Yt$Ql<^m9v3BAaQfKqJ9V}fIxn2N! zvtD@7PdIe?O?+R5U$QPQ0$_p4Ll%oHO<*{tqiMg45SMiU3xmR032d(;<#b}@a*CxH zIY#oY%W(yC60m5@Gt2~%c{Z*jTn51F2q3Ji3ZHrK5Xb>nh6H-9hv+0dyoY zjCIw`Za75iXUXzgw97q%3iRoxq#1yiv%%yGQ5PB6-)9$FTUJw zvK|%)#1#=E^)$Paj8KTHgjcp@>TDz8^h!nag+MAoi5r2NUB|Jq9n=Z}1GS>8lEG=U zO4`9;c%Gy!AM}b^x(L5se-VDYfi@KmzcOM{09IS(qbD_*{p@y~H~JGGwVN$5E-YIN z^)+~Uq5Cq`7{XT{2hbwxYlQV9-i$y(m;HrT!^p1dJv69RBrL@thf^Ut8}j`4tT^J0 zay`W-O|(yNKDpEq%^Sbji!lzRRgA1zb>;03#ln0$4v zPnlG($gQ#!Uj%d?2Xi;UTg*Bi*cGzZ{T1~ff3tE@hWWKbJ}2P)l+PS=qx3$14R*ie zy%%=l2hgMut$X5P(0z4`y3g5IT4ZoD*7Kams}Y1O`;^k2gKt0FM&00c;m#=pal2>z zO8tdg9tzd){b1czhOA5S{i5UslnsXJ=YVcRGvbzQUg5ySm227&bsGJh^X~DK?4%fz zSSVQLB5Q<+BaV(Pf(s&~7iu2CC;}nAt4!L=Ri%LL7K`dYKhs4fjI z+1Q0P*|-~DY3C4xfL+$6rg5cPJ@3iw)Usq6=-Fc>t>7MfQj*DOk{BtM8yQ^BAk`u& zWgpm*f}H>?RBVOJt%ubr+jkrM`yP^l$;IK=>-XGE>K*_T=W|u$;bA?2nG^H|QSaT+ z0KBUajQf2V0)zwS`dgvxTFlYC05H#wKlt57`uxaScxIh`%h1(;p&f!|=-qq<+H}?S zX>1zs6G?D$(Gwf>MB{KHs)Ig@Ql;@yu_;B){H7&=rH4-XE7r9Pdh{1PJAjmu`*+Dw zIMh>Fq%CM)F^8}Q%Yb8+^m0(dy0Ko{a;U%C_6GHU_w5AmEf03bZbSryIJAttzXfUR z=^GyK&_k>wYxTSK1=7XCD#IkVdCIxnT;@8q6(|%W1H4;Bj(2ic7I`{nwOa;7QNpCS z06T_C7+clBnE)G%#)fK`t_ke`R+_T+2@WHNwZ3-!rdm|oSg}p`33;VhRLGw}Eer&y zNC6(So_DAQUtli{C@$N{A9e5-$Se4(#0Z&TT_ojC{x)$j$KkT)=w6mOSF~$GtGFy+ z2aHv(1Zt5b;ntW@zexH-Q+}Q>wC6bG7(}`IH+7m3=V44#4>yrOoUlCFsbX-McnlC-ltUH|ils9kpElk@2{qZuLR;>qJPk>)R%x(bAW-bQG)l*Ry|R9}uV4Loa*sKVMk}OZP|_t5001I8;@`Tj`83Kp?(+T_E~;-LR#a zHMg6w^obLdfH}Zlro5>PMs|XDbMK_CsTZQM|6 zp-!qLfv$eUkusXd(jeYdG=W@`90BXVuEub<#?R{ln7gjhY$akrw;8<_(k}A-8dG4$ zc7`g7%&%auk3y}6n2Lg3!J4r9x;LZ;bAV|jbG8ro+AF@SNO5Rr+lHklSl=H)m>oqo z^z+aA27Ba&yAx;jCoDlfc@xTo09^KF1+d&sq>j(|;zA}}Q-nZ9?xtaD^^}32WJy5S z9ayVS`3!98ce5(j!UH260>s0GKPU{g4he+Q;M#!XP#H`WSC3q()Q!<)OK>z_BR4*;hs>7$6_t{`6rl{y02E?Z$iVi*eTwEewU zc61GfmXMhD!q6DY!d-LwEtcyDD}`?(8vZs`w*}0I;C6eFgnP)3$TVlX@e0&jA4SEB zh{^gG?9E^Y7VXmXqIFF|2$9>jSfYZ(;iQNP57Z4p8DM+oQ=+}f#nLDqX~c$SDp;QIWDxbn~u#Win0!EdnmAZ^z>Hyx)9oz><+Ey zLB;Vy5|z)mOu~vDR}&AsIC{D~T2LF{6zy(Yi`xoUh!8PTKFK^oeyD`DSTb$#mzEF? zE`qjnWN#d=w&FaFLo7G|8;e;N-g1(2&=XgV3~s9n32s7Z$9(sV{1_##3G#DzK=RRE zpFn%;n6e*C*{85da8bSu*X&z5uPy_l9`_4HA~Y#LBGvMRqHQWNRl9sC64sa(dggXx zAosa;6)?zdFW@T!o=fKfWTgY1w=jY2kQ#PVDujW?h1*I9tUFJYEJEJPnv-=3Rwztp z4PGREk_tvd?bgKwgE|7+vW%a6HD3@{pX?1;4`0E0e`z)m5vH(RA|VrDOA3Z8qri6i z%_O_>q)d1dxapr|upE$oi--e9RR<&iTsNXF+_cehwG{r?2&ZR5NdKy3zGHWt{9S3( z)RJ|L6xa%g^pVP3>xjJ*Sf;M#YM|RN;uPe0h8UX{+DTTZAJD<0W@VZ z0IGR7!WwWD!o}qqked2SCh(C8GouE-E|qICc8|HQTCNVUn+araT+ zkZj9(!wuWm!p&GFr(*|Te{UXGJDwvva>AP2fGW6b0TrGIp}5|wEnMz#ITahxvRIJW z%J?C>RfmJLks&UyLV^|QIgE)9ZEGEN$F8d{xpWJJf&JQMU&!U!{cSA=eQ{ zROkbQ`nDIe_Q4X7;jCv0%XN%v{sdg;;}ly}CTeK*7(VTu1-YhOYgzW(xocx?znS%r zm5Epiv_2rv`e+PViw1lODig|QayU)J;*`!S)-vYZfm(QhdY@N0ATc>XGBi3=lpdQk zVShx+QcHnKUH?hf5;)G$EJAC6-8v-YTZk`$4$aF+Ad+;)(nS<6=gN`15BE%=34pEN zn{>G>?hBX>wztlr%0{e!T{)omC77?IeZYJ1R4L-yQjS$wRqUDgY4!m4Z@Ph~C043d zx9^AZTyfE9EBpMkyMg#uF6rSu*I$+dh=Gft?WJqb_Acgwx{ml%Sl`P*IDEll;ZHo> zYCP2}k1N5zfda?vUg5ai+kpd3rcvbm!ly4xa#8@OXYkfjzddcYq^Buw!wzQc2ygvH zMzp@bI@kG-?EKS={eUT6PoWDL8vZBAYrvht2D}%@-tK_x9ROKk1Z+;G$m#e!mL_~Z zko^TSQMK+8VJHNugJfrgWGUnVM)kJ%jG6KJP>7*Ra2fbAxHaBlvC(Kw_|6HJ+G0;a zTt@!Yq0vn8lhEJvLfh)k!nG)W!3+ zOD(UV+{mo8jKg3Jc1HI;zBc? zv{HSK@H?iw`|L>^jXvjR{BP}%F@)dOSE9+el)+(8msT)=oGTw7J8i3+i?vIvw|l2T z^84GKZM=U4{JsSoKtcG^C{i50<1q3X;`0^o@E5!(``je{{|2a8HuxEistRk5aw!t& zY~6XgNxf{{AE%lv`krzH%P=|`#QwvamI@bEf&Nj*#tN!q9bX>{-&HFi9@_XZvZwM* z)~_)}c6X1@v9+5BH}&fG6yyYU`68DME8Uk{8g)D$>OFLP?iPCq6-Ear$Jryo<7ndt zTw~#BS`G1OzL-*cc2)fKgTjG&D|&pKN*^E5{4hqyPjA?T5qS`Eu}lv>_#ra*gN1R>2L610~TLOBhIR z0pjk)k`6arbUqK+uV>jcrOjRZbbih@!z*&wlqQ~tAAJGyUFXpvDayG7o0M5}hPjf0 z{&Om@l)_?pfx|?B-KG){xXV`>SSYX#LL;D<^C3_pZsA3HwR_gG&=x!{gSWhHgXf=H z+^z7Jz|qh;(}z{Gb|bUi%CDG#(q} zF?4F&`RsZ3LiCy&fn{#Ws9^9VlP=WCw@NKUpN` z%4L)8>(3~3T;sqEc=pC`CxqlSE3A=lK+d{&ic6kZhn2kF6Co{%>2gaugfk@2@0TrG z5~6n9=7-{{tPeO|t>0PUwNzcMEGFiAQ{gaAvIDy;gWUwzbVQQMP;|8~TJ#=o*+D_3 zF3nKQr6IEcbAivCtR}g@k7x6;+99@H%L=LS|P# zt4c#8%IkOrO}DGawX8}9?M(Ck>HV~0C^sHB%~8iLHFd8dd2FP9)d;!GLM$M%6eB3| z2KAq)IB0jX5FpWyd;tU}Xy=QIB6l!g&&e_z?IO)Lz-)CO`%R6 z+qMHt#g_mISux6y@xa&@weR3n8(R+9p&l`*w8t%X+624YC*bjiI-jx`pL+^hDi2?yE6-pgaY z&QtHCZ+8}w_YbXF*&orxS$reEsM|FQ_Slr|8L;PR zj+9Z_>mwO^Y|s_V-;hxh;^yB7`JQA3F7$t%&IIyJg$H=EUN(VYJR6k2%bZom922r_ zg1ISgYw~Fd=-&tc6b=;td>8=u3h-{cATsvQq$hlLds^40RbVRRJOc9$!Cl&sjBKmR zGImJ-RyckA+44N;*OO_CckzH+g}>>UXS4iC5p4Z#*Ix%&As!%_t*o$AisN5@#)6U2 ziBfWMquu>f)e6VRN)GKVM=RpzQpwIlAwI{dT*idl7QHY%Y43#MCiQ`zP-I=i-h&L& z8Z&~Kygr6@t{fM{=s`>uC7)P`gpK|wId13SVur2Q;uldX=u?LmAFs6$kGCoUE@&2c z8KSgAZuTR4&j+!2k<9$5dl}oSqGIO_XhLOHfz-kCBLA2&nNnPY?(Ur^%*V8<+?XRM zbk3C4#@%T*+E5lL=V7D7cbr%%s>KCex2(7ofrxhzZ_Q`Mm*eGLeiG)hEF=CimfGe0 z5(ew_ie!NM#e%P&8hIyFqQ<-#=He4*}D|K_Fnr^W9Cq+D2SihI8^8YL2L5 zPh8c7st9Z=sW{B$xp*OK_W8j9W)t-U$HE4%vw=1wOy4M-wJl}4yJUoxnc5|Y-|vJq zyQxuMjE>ixUScC0JGp8@JIQzh^BwBX_0oDn5S|^@O|@*t3yE&jX2tGv#*icb290?j z6DVQA(Ret}g@aryFf|+6+sc@@Zkk0gzf0p#U8HE@xA>IZ_R*OU;-jCi7nl@RaHwF9 z#UgGMsFrQxN}_?RFp*o}?=0P9b20xp%!h!_irU70Q5q$-@(iFJ zVtX2ek9_hjUi$?b&SR!_*q*^$V9%G1`P8>p?Y44z(em^EKV9!0C0Bjj`JPk#D!ov* z9<4$GQO!dXIL1w8j7v5bpQ?Tm18F6WC~Ob6L=0(TLz*}tP3~=cs^5wMiNwaO;DuXj z&0?ClHj!o~a*OLB)h${y85=8eC#1FRgtYvJmbiZqd6MBavu?ES=etjJBd}*>B|%c1 zbAFHg+xxq}`|(@kQu84e+54;8I?f(p-~_6Yal|nr-<7kdqrGfHwsRT#-aJy^F{KzM zPi+kJ6g|LKGzK1{kyn-3d|3}DZ<%k~4V}&DAhH*W0ysaiZ(t}E?JAb9_*ILK&2Vi1 z7nz-!CN1?ftBc9c&iD0Jal;gSzJi&6C<$L|IKx0{hVJ1wsP?~ME9-&?ee)KEZZ5CO zr_e=^=@4juFlyinS<5!Q6~zA#Em`7I#?O0Z z7_c`B$J7%|cPYLp$af9uVq<(Ca(^ysN7;+|xW?saoL?WaXUFZET#z0rwK!y%aL`q3 z3j!>O6!iRdk&z7q_?ytou>Po}uDXab$aMJM%!*y%7_mVZv5wy;p$Kv>9}9+kD+2*L zN7k1+)=NgrzH^#{PNYNgdm^eZ1>z?dD-MtDRoZD+w^_6lK*5xGThMWeiD%IW-19hw zUQ`g@$)Ws?5`i#?7Gh+>ZmdA+(M-gFV^_2G#c2fY=BAkJZfhDZ$#2*gN301&RbNY$ zNuvxfwaUkNS{LI`lT7VI4}+S+T9gZ%j`~9FF7$&A0_!H!4aOk|P$hw4FQS-!2^M<; ziB@(H4!VEuu8@kO)dWkdV~u_Dv`KMq??^VP;D;4qtx;C4Sz=j)h$F3yg-syV{$Rn* zpEeu6S?%K=a-4PE(<{fl$mmhO(|nIpY|mT{wtl6?uaQRNk>ed){z{>Svuh8DT{}Hj z=N#tda7itoZ^?wCl5XcGNh-wb*^e&4!1q`o@|TOV?24Wwj##1*Pm7PeW~x zRLjv^{avZX>E3GDcy3gDL6cV}fw(T&4Sex(8ju~)2GPv&9H1m?8*VMzI4pehDZ8uS zxbIK84R|2WVi8nL3SFFFLa}(yHo{QRlVHNm1x`vy(yfiCh4fdg_=oPh^|64S`xH+8 zfp-2-MU>=KDf&0M(8-H0Vf=FiVj`6q>J+t2l5AWOKPSC^H8hvLG0AM@bD zw7tmq{k(D21BV)Ug-jZOUh5hJphftcPjJSqYnQ#(t zba=7D8i`~@9Ga>uQy9^e;NWmyd@QDe5NB_tm$P(8P=RiS|Le}9K`#rN4VO`htZM79 z1M|gfWIG0JT?XnF&1#>nQ@3Y;VaC3kDihX8kDLnaRm$L2?Bn+OaK6C6=sJ!4XvHDF zJu_=v6NlSb=jM&jlIaAnd#nVsk@8|ye1~}z+TdHtKr9S0UJ-=Qm6agxIBQ!eh|lmm zjBbp^hm!8qws>O%oPqXrjf2uBnz%N4%o^c8B_v7abMHko4)O=|IU>cp4ZNz^go5 zYHZHi)o4n%@V-OU1p>w-m=s4kiU-|-=2!|A)*`RLv}wC9hu@$t4`4yC z9KVUs06v>-soQ>zRw`s-WMItZan#5A>ix6d4AQAGvc=-KyO>;IaDADg;3aFBv(IEn zF_7(dUlG|f`|46;Pe*Cg0ewUiXbm|^F+zgp6IsJ>b(ZLYba{O&xVB9RFi+?D&*)Y` z{1sl5Gb$Rc)fXpE>1N3ctRQ1hV3-zMh*Y!$;iah(^&PqpNQ+K_xJIjDgInRD+Wa*0 z#gEy8MfBH7IkvrgGp@!Qld^o{E0NcMh*46efXA!2%5?`UI?$*S4%;HWYzyoj}{V zuvoX3@y(+b+^Gm4`2AcYA2*^G~Dy|w4PblZlePzmv+2}q0nDDcA9R5_X@zoA=KK#K2p zx;M@e?QrHRWj~#UIfZgdFpTpV=ahB^%Lk*v0gAY$Xdb$RN#Ey~57y{B!_`dtx$SeO zZ!)7%+a*${-eXaPmEEnAJ=cBD%5EZYr{J zWYZ3(YT1NqxbRk|czpED*s2;vBqZxM13nkc)qr8+X*)e`_d6zh(o+d;^nw-Ev2x)0N{A4c9qi4T>st|%l5K8+)~Z8F^KYLzY+you=~dnAm^x? zL-B~)d|wt+a)a{j>j#5rg8^tHTfUN0Ii^q>xh3@e3)Si;o2GL=8PH&QA;ve@Y(d`t z)~w9&6lw!=@&uQ*6cUw7sFn>mh(kR*N%-)n1R~0<951_%g89-UT~0#L zYVZ<0f^Ipa3FZyT1u@Ibt0Pwn_+}6dF^-l7u@09Af-l&mxjOV%;P@G&MN;q1#$$K^ z4RYboJ_r~UQpZMc_E=8NE{>Af?G@XWmGKn9>g|{&h1LNh=Ss-T)9(c0;xM<|VfRFS zSqtXB7osykS9RTfu{es+u3iRQJqpZ_X_ig2PoV9835Rx!8TjH|J6ro_!%uoI@DtGvYP`lJp8*21u$w7hsNV zskChchZChVOBgTYZp|S`RSPem)DKm8=#yn(B`|0u*Duu>@C456$nA6gqL`UcP z(b!~Pa!3T>4iiJAbto7qgvCm&QCKmunFB@Wf|)fAYiNzbdW+@0oWsI~ZjFRcQgK76 zJm~iH?)H#SpSc5R<-)>$i~E54F)9Ee*lIkA1ch-&zjLd@KhLVx@g@o90dYD z8=))F7C0~0T;h^*wgawEj6T{F7}=E}s9Ouo+Rwnqu_LDGxtW*&^`n_FQ3Tei656bo zn=dECmYnT_<9(qt=N}}(81mhQvfbUskzZ)SBm>*ZVS3o=0u`I+mRVt^4R(Eb+0xv% zCS#{&A>1Ct0loojEd8Y?V|LKmQoU1@_U3u{4fa@Pb=K+}mR%7MxiexN{GRA% z;!RB#CbK`YgZ$Gsho{CF*a29b5KnZK*jm?vaw-gYAHy{K;LOkcCdHecZ4dIN1gTlnNxsMFj>@?#Xoq7bffajxP&pIU}77h z-7OG|KqZ(35r|~!sb?gnf!m`Hr^m)YC21-t5aJ~HY%yt#13gqoiX+zG%uAfx%V@3{ zWCokhndWfF;wLQEZLnM~oVF9=_M~^u8Q<;E!)Kb&o#FI; zwP!IVMcf3ulY?M}VJSmyX!QdqcejBzhn_W7@*=^jSl1Q2QW&a#CGg6QtP)hm(w%&7 zMX(Qyq9NE7gUaP;$lLay${?DRs6=_!Dx}fR)2lykb^}qib+qbHmMUdQ$uF}B_No2w zBmfb|-VR-4yWXK8$+a^hy+z?0s)TSaoDK^)#B;%*H4!A7gF-l$YELs9&=0g#ZlTXc z35Qm+Od#DP$co2(J^dl$U@)a9;8VE;65A->(5*BuU1G2>&0Ewjbf`&g(686oZGwHB zSSu(nsj2%|J=^9whMDpq$7njuNO|w{?tBwZIBO@Ebr|j z3ALg%z(&dsT(HMatHn@?egvkPshX%yE< z*g9tBr1EVJeJ_DsVuYPUcmTb1A)9shEzAvb>L|!I0)xf{gX$ffQ@c=Jl$vy&XkLpD z@y5~Ngd+oL6`ATZRxPmq2%U%IEZXZCpYx$=_4PM#pq$a;n5l=0~t7!UK05PlO9zj>C`6wybwj-V$ zsm^A+9WC)!;CfqFsxT%#d~ffOh03I#xBbI}?UD0#zDuJ2ou8=XcCln-kF~9j^)fYf z(g&uPWf%)RL`Z3S#v0=iM&WQ|$ML7tf<iP^P#2OmFpI_nIDPzOk> z$;&H4^ur01cBifu|CMc1U207GB@t2%*9Q9al4&xV7f9*MQlZnY@di@EsG?T6O}CMM z$tFjPR9GkKW2D&#+8F*10YnNUUMzTxv%e(u^e^?Z&WEY)Pc_SD0vfJY z02&~?6myHEcq6`Y4==sGj7AZqjWS}AyZf8l2>x1Rc$LAIo6i;q?7`~Y2__CIlsqlbWzu!8W0M1 zP$l6*oq<<68P#-@j<|!U3JL>POHtn*EkzG-|P1;@T4ibI4PYNFf(Kz?F@sE8Nw(36An~sO*g-#$IxSx%nr7UoV2p@ch4mH=)XMgjfFXEk-dd-o0TBL6TSf<#nwgzJ_~!TVv$1})tFM55{ZMtzaBOo}eXg?cA~4`QO= zrUb#|FGFymCn-cpRUNt1g|@A7tgfm{NSd2MVGtIlV4ou}$dUia#iUeN>J|NML1$QQ{ocp?FUg;>r{HE%74E%Vn{=1q%syl;wgM#oNS-7RPYpy|foIU7j0zASXf|9_xbjYiVaj~Y9)N{< zsm4OJaV0>b(%@=2TX#b)X+oQn&1T^f3Pq~kXccui=L47@o~-20*&M4c=ymim=!HuE zF!*Z2x&yx&Z+guxEg+GPo>t497fAODDT+rgxX3C{_q4WgLh=gmGKHZ)Pw#=A8c_)m zq|pue61vp7uCzzHmCU#Sn2>& z^IM!UX&^ZTA0OvQ9?B;B>+H9fD9`IG|9%AdwhK zPE#f1;juDw3lJ6S+ZNEBB+8eWCG&cdP2O@01J%M?o|yqG){g*76c+H5xb(8bn5rJR z;q5SF>!UW%wP`v%^+gR52!!*d7K++yuL#5bsPHF|{;Nb$E2mq-UC-jcNDIr|GQp<6#H zui1{@)Qw4_RZ2w7Kw^45-WQarR24UcQ9~zHGxQJb;*{^{!NAj{P=%(f$?|246f3l(bb3y?FJlwg70Be!v0^Z5a8mpIxV;1o z=ET%1NM~b|B{&h69bPmLUd*h4o+6rh*0}fY)dxX4o=eW<-R*R1i1{fsje9OBzmCoz?v3t8T;}4#n6Ku*+w;ha%r;{W zciUi;&)FV58u_EWdbBTjwCw%d?A94pLJv&!vuKF}yg!(a zZO;KcC*>#46>sIkpRCLzANoVryNQ9254@kVe!SBLdWtz>F*GD#7x4$xjynb8G-A85 zXn3MAlhby)kW4IvE6VJ%wQfm_`ZyLXwOCcTAQzd81G`14S*=; zY*$P6RpFJ2A=5&(*#6W9kc9|vm8BxP$q@@4D*)m~dn6?)X6RZuP98YCD&aLo=X5n; zlHeUdvP(M($+YoI-R#lP8Q?&`j$dETCmCH;5Q}@;(z-jMk+Py7Qp9fpYKH)#J)j^P z9Mo>??Y5OunrjS{RR0ZFA<#}ny)rpfOauYB@)UrbE7U;_7_|(+ujN2gqdMOK+fWW! zCt%Z*=eOj6BdQf9HLA5@L`JyhXSa-!;O%ze`P97K!|*^EjU{=;WET!P`Y7pshw0%j zg=NqObzOT`(Z>PkzCppCy9h{n9V(jhF?~PM(PhO7lq1&J2DYs_nHi~{R^Q4^eG0F1 zUMTXbyxmx=JJlf2(o^4s9-FqF>$+@_8+LJ1n&NOYJ2xVyO1JY)>%x-FE7*J)`(iCo ziuF}`(MR*7AZy&hVY)sN59_2IsJrp>(%P%i9iW_O?~i_~VE2({C0+!AewX5QPQVO*F+hr8Zy)Csim#$mIq|7_6;g1ZZ9i+WPcB z_RKWfk`EWFbP8fJF)m9xOToe3y{%HMr7`U|-HU$Vj#n5y&PF}JHE)*vn%&4<$5>`^ z<151MVBGfRWgXowM)X!8;jvAm-ysHm1p#T^m(IO7X+Po!6!OPr z4hXM4Ltz!f5ss}a_P$6%EwIRqwjRLqSgd4ZkyE0b6chaSeRJ|YK{lDY)rXVQ51xx` zXIa=r>^X;*)`dDIshPFlk-E7}2@D093gAF2QLlyi15vsi% z)#jvM!-Etak9%wlhkQ6W6t%RdZDoQkFM7C2q%$Rrb$JC`-mL=q56!@N_cIFxijst} zmKB(Hfs?!P3&0z;zeyD->lo|S%%G(v*4v4U{dhX!Cz#Yf5FqlruNJ$#y2PDJlXfLp zA26s)GRFmQdn`z=aZ9#;md`d-*_mIB6%!*$)577cM=Dr01;r-7*cE$>S@g4ATkJQ` zCOLdf(p2Z=q9JZO28cklL5>Seyl#r4zzy=!qZu$#U)g>mHJAJ71NpXc8`_iKcmI;# z1HO|dWI}CSFIQ%zd|rf*5TQ@ua?T8DG%0?W3?`S2XkdY|$Vy`tfDkQ#yjqp>)e91| z#zJJMh5{L8$AIOTW`laU$jGJ_)CPW%Z4CR87*M;+5m<(UB{Ws{S`+!LXD}#~rEh&* zO#6~?oS@ZU4O;DGI1Ma@@Y$IfJd+wf&fTCOtJT+31oTj(FA1al zs&w-z(i>bwdYaf}Zz_TF9HB8L#($~l3aq{!^H`%^6YZ1w6iBRiTRsq~1`)4PQuTl_ zzofZmZyKlR@uCL9yz2_M!Td$3+s?U0AImt(5BhamVppb2-HWg$_oSy$I)bu08mH*a zz?Zg0+yUUd`gwURZxIVpVT8nknLqsl`pb z!$KLRTK9`Cfx!0qRn+(1YfJ~6SIJc%R_BED^y6hgJ=;>L&SJzQO&Dd{w4_=~kU-To z)0C2rU%?o@T8{&^Zb^ZHpGI=CZ%W|;Nb0_)t6@Zyx2OmL2mmi4CJsXoH{W5O05Ud?_u6=hS6qp~YO?bohm=pO-z(S{aR70e=b|L? zcr*fnYNrQSKpLCwRK#;npxcjl)bBQ z(r5jaon0|f*}PH~e&Oh_3`vKOa;VTpgnK!z+cT%=w+>$Bp&`sb7BvMGB%FqE*c989CHwMaFfFiM zWvf3)^sQ_sQxTu|SQ8;mxq84F$6u+&MePK8k8tE(fySB+Mkk(oMFMb%!% z*dljA_t@7#Vg)u>jLJ-f zRrp1`<93k@mZaz(UK`bsVN;p71=gXVtXdoC`>9)ts+)eH5V9Kd1KFy zMN%anW{v(wu*w?kKW&eXi#^!m5bSNQ60CT(Qa3yjk-poUKe~jcv_={MvaW!5tqPH` zB2^aR%d4aja&i)L7IQ4Q%SAfYxlsSGSzE^r~7u@MO%`|ErS zjXjVD*A{{}}6aNw3B+Nq|IaS$l@J0s9KrOhEv^*@Rcq0?cH%K#)nv4kR{TD9CD;CJo^wBu6R1;{ zoG#b2_Y49Llvaf@fmh^xUUw@!&M*_~wo**9F*psNK@rJGP3ba|e^zC0^+k#sRlB?g zt*<){P*8li**3x@ zw)a@UhNv1GVMDseF^f5E#o+bIHYmGc?3=%cZX~vOGH1^+tWP7l)porkl|c3cc=oVqpIOFIpAoYa|dM{Q7)s zt+=p?)a<{rn*)q`-T^UoA^QaCs18Aofxa^=sHl@^*c?}R#h2?ZEVl>L#4=3h z>zL(e5G$NWb#5-m4)A(?Z(Fh&)A_!Lek%pgFMzG<9F?tnIlYVT5wIg{X9AL%%ew=z9lz4@YyfWeMX2F82 zO{VF~15t=CM7BFU&Wfe(%m~~rEPJCi<;;Y-2`nB*f#_vdq@8 z+za;JX?xXk%=WzQY~WGCl>{nZbu9Y0BhdYq!%xygy#MYR{8UOtl4DkB2MjZ?9YJET zaR`9ZROdaM>91&q8#5|+7HFNa|HeF7EWF_eg|~yYnA}el@&sprB>8X2=J2Jn_LY>5 zU$$%;nG<14Vn*mQ^1((t4ynS%H6Aa9n^s8V%5mE@u6E^{2ZIa18x_c>mPt2dYsYk2 z5@2~cn3IR>VDhzNr}Bu3h&qJbg` zU4|)gZ4>kz)^A)DrfJrbbf^kn7i)bVcQDWi2F;_)$5-M7d;2ube!iH&ut>uPoQLCl zXs2Db#dBh&4$sq7NKP!1g*n1m(OuE6@%XnXt*t=D3E5#M_JGj*x-vCBI5eE0Vr7_t z-)LLL?Yh9;1y9H52Hi+8ZP!;pZ0S2?n}8Ehuhm!C+$%2G?;~}T2wy-Sl!BjIdaw_$ zwULw6W$Wj7*}6IVN`|jp52pKKwA5a;=}F6-${iP3h>`14UknZaKW8!XwvpfOrS#8s zgI9_uMCBau@hmrNsrpQ4WqXd*4yHo8CTghK^-Y5m_!7uuHXx6ddb?VGeQg7~1j|V% z7k@gJrznuaYt74w!T>tw6bzZ{MIT)_1pGFWin46k4!ANpGVnj_#rteiniQi!a83z-j^oTg zGWPLH0Gu^``z1c}K2M~Es7RD^~&N*Va z>{UZ~~N)o0ib6wG}EGOKY-Yv0v3a3EA{Z90iXdknV2?&5^+ZoRdv8T>kEnB zB90;Hym3*YaR$zX(|4{2DA(k7vk7%lM)^-Pp!*(CVUXII1mC0xb8=PH;1o+O+) z+8b5cgXWmGkeeZH5#F_UHS3*ZvFnY&eNeJEhU_tlQAzCw-`Z2^2WoKF$+rVoqq3 z^2#nskl10gl)%DHW_K>K-Cr7Btd?VODmZ$aEBhEIr8J>Ipp2)%NbLD!G2MZPY=pjA z=4kFhi+mNWY?U5puw!Z73F08)Hv&E>i`{ch?0Wn9CHvnw7U6|u+c-K?wwq%HPW$2A z0hJ*_9nGA=R|sL!!YUk$nA-1hZDtmgu~M=kVD7Ob|C8UHD@u8zBFK~rq-T)`zegK4 zniJTUR6Zk697{IJ-TAAysvYi^zBC%D>VilRJWkGdG6agkkexRSx1=?eb zk==>@*pVVE8=cnr$}ownkiN!FEf9bj6MLPM|JRy>>?TS6*`7`the*fT9*=EjbMOwB zg}*Dq6x7p2v%s`HbO}q#o$w%&U*1oP6jsq;Z^&ek>`pGsTi!Fv8ryUkzzJ{Tu+J~d zdfET@0{?tDAVD@h3`jEeO2UV6#7+Q5*qS3us{j_c!MFwTB`8Vd_D{kAG?N5})RSFw z06IjbY}-lOIIsjYTLU6=7hDh!>4T(9VaD660jF3vSfjjqH@<9H5|%_UIRw#FMw4ofVe=$yG4Fc@^R*4Gv;S5zVsw`m98dy1fF-5!Cu) zA^q2R*LwP>jAbVB^=(ZPmzrATv292p&-G1qmPa`Q!x?^;`m&G)mrYZdEm$q`l2oaJ z5=*2v61M7_IF&+9&3RzTa}leE)54iaNw;L(OMew)(GFh7L3#YKLi9YpkKp&_Dtd*g zoqvG@w>jR3e%@(OC(gu!Mf+AHD8xz?df*X)GDmbfXNmWd8VXHjU!qWm-JVVGjP45A z6D%I2){-;)W{ePQ&f4vby|K#0JzoYp`yXrvN%soMPrBKeNDUMEeAlxEChCOXYbXC^ zY7chOog~mqIpOw0wYp%Q>a9=C7Mk$iMFZ$#5+$u;%1V>?rKEhEl5@d*MGfL#)bZ%{sgzhqw%x4JpOzM}M^Xg*mvdGjq5_5yR zbrjj$`WQV-6X@Idx$A^w$h;GMRRN2IFzwINfN-%ygfzhqW&7ZHu_3G_8L*$$^NB4U z^yg8Q{(L$0(Z^vV3ZM&pekImcU9tneY_M$2#c9uUUK?!Hw$4sc2)jBl^+r;}ji08c zS<@^mJ@%9&PP#y&oc5p#Bzdj{hiGU%rZyQadU#gDYzT(WbICnp)B{`qe`UGhHe5sw zUgn)Y&VfQ(Qd$xgn3V7or?5InAk_~tP&4ETRX!ii4Yud1&T<5O7vv=G3W@S-k!}r! zIMfxGg-1w7*a=lnd;1bjYlqcmlrOYil0d+0R`6lufULqHI>Jmywpw$M4lOxaGz25{ zg)En2mQu$G8inW6WFvCnrK&%!WcIDL6+eg;)w!73n#lHhuxw$UL>-^YNxf>m+5Wy7 z92R2>6U=+cleS*S1r!4An6E()uI9{LhCn<~pawyf1VQe&9D?*fLxofII16z0t7Pl7gVfUq+N(>&McUTVuu*B`gawq5~Yq zVa0X@?BKrivfbR=w`9K+K^<5NkpZRz&lv%+Z~+hDm+Z##-dmmJC30KrTiG`{@J7pD znX+3tvze$o5Xl6-k${(2re2Wc6#G32c(>z<+4-S8fhxx}RBXv1UMc zy0AH5KMNO}QnT$?rFlUy+s*CY%wf5I5SzAt5|wsHy!?ZmZ1FUYzUz5bRqS27lwk_O zD!Xh5$V6;IZ=P;k4oC!Pj)JVnY!VCNKs?-bI0kxv6uI}MQT7Y~LF1B?sT8ag7jHCR zgkLR^Y(!gfT+ct5t1Br97nX)MVE`<`T%YJx0}WT|&aC7LBMfT&ZHmuu-V~y+o{AR6 zUpMdW6PyP+Z(LvHz!I68;A-L+EQn=T>n>0_)n!MpSfCpp99^9VeAUnm;s4##44^e- zvSbG7+9V6@dHQ}wY2;3S4gj(xE9F)y8O(6Ojj0F>%$PjWxf@$_~D5w$e@K{L) z3vNN<{)H5*3RZ~WDg|p3t5QqBYGi5Te|qs=x1AUNe~kfVPB+>;K$@OLyMjAGop#xM zIlkFa!#CO@`w8N~s!%{H-HOtZsvZ^GscKK9FF3m_vnS=|msw-Qntc7PVf{+>PHgZ@ zDsrYY-aZG}a3?;%l+S{^ zE?W+a#zMP%=Oof6p*|rZ@eqd$d34Q~vcFKv%IZ8k%oi^9^7;ItF0IM3XUvM!$yEQy zz7Z_@*U`Q1EP>AcLhjcdSC5V?a`NoEMJz(Z7TpUo;<-NF ze+#y#Tyx%#d~G(vVi%~@`?W=Eb1R887-x=hc9xsJT zZUe~E(a*0xnzIv9$?Pdg1fvHMAyZ?;cW2mkWVN=5!`bb2r~r-8yc9?|?@f+}`U@PA zb^8(Y9r8~Ey8`H#Z%o59fo!V7hC#sEJt&MdZPh zYt6^l44?d2avrh?G-40*8fLDnT1O?4Lwi`+iK+-Pn-z2pc%4}_nRJYr0EjUdZf?kYi4U~XHRzb?$q7Q}7~I0r~}1hWkt7HV526QrzY*J#JHovE!SExzJ6JVwEXDmA&*858QkMMTX*R z9OYo1q#09y%U?z6HnI}GPpVjvvy<`^Z>$-vACRHNZp-$PoYrc`n=cHN#2rtv*k2`L zJ}4?XAzsF??QCh&B03wy>agTSbrfg_V4f}2Yme%b?zRo%It?HR5D7beEr3&&(^{)y zJy88}3dp~Lwra-g!*~TNQT`Y^1ZK!;^LxP+PQ!pR8E#|D$?UM*oz0Aj3v`EGssJ)# z&dT4gm_ z6XCftKhR%L;~1W4CxI#wn0xv{+^Z{r@iZ<@pOSnXvjfm|bZgf#rK?;C7HDBsWWOG; z>=_ojrA}ro<{>5#QfRGF$}1eP--ut!*fX!|UKHL=nmcN;V9~jHyQE6!{}b8I6_iJG zQ!cCZla3dMqK_@~3b3CK_VG5dgaE5N?d<|??cqRk5Ybdhov{0Dx`sS%%vzzD9sxog zOl@1DLMTh)hO!#&cr4J(=1!`(1GGk}EO{85C`3Z4%pt0^lyZ?O)Z?i}m~lbP{gc_% zP4-Y|)dq@4DqO_t?O*oQl(=90@*rOBsFgW2jY#}J@YpKPViy9PCMglZQ)*m(Ini=y zoa?ugbp+S4-(x(NoOC(h+2F5w1`-J6(T2v*-z84RO37@5a{Z@ zfR$twz3mR+j+1dPL1IhE9tb);0JI58RIM2ZevH{k9Yr)SI06Z494Lk02oC|NM@)k< zoXOQ&7Z4(2^O+3&F_j0z#zetPjifgIZBzN))n9vrf# zo5Xau&0$ckiF`Qok%E?L_AEslP{Z?YyY|2q786%S7Er_xs2sB?OIaqN)yMy?y zVAp!Z{tiwG$2<=D8b%?nvu_q`nl0MHTPS!5eS@FGiFu*6Iq0nfRE&9Vd)bg%m_7Xl zN?x(;uo`wEm{VgRZ(U9q@TA5zVmn5#L}Yoys8r;>9vRs~@=Lr48vR-sc3pGu+7#~U_1GOm;K+xq zD(q9(F)b~PCRfW)yOTU&YmCs(wz1z^>lEd#_mKTU4x*^C1hn8<~|S^tz`OuDa(NQ3!7L;8!MUE_y~D`j?w>=(Xqdm8uRjL@!MO zi-9dh%onSyfx_w_ zv3$VJ0*AODOV=k$CxC!d7K780rW!K84>-~s@Q<7%$Aj=P5GDk>mDqFz6XosDQ zWF&*geglJfaJW1%-po99sRRH8>RA&*ygex7Z38W4gT0gSm4a$4P%l$_v}2UOi~aZ* z$H@Mz#F?*?O4~!z9mjsap1bK3MLOrjn$HcT0P_@b@(%^%$Zy{uwEVWjI3+H9y)FJd&&kYQOkC9d&~OxGPSHQwlEluGWN%4du4jy zk1yDX(;N>VMKOB@Qp0T?OX5P}2_HH+;4xw97p8Jm}kYMX#5}~rlX@lLBleIj~vQ@Qx226lmmB zYaDUt+>VZvV^Xp(ibf`vjNCF*~BuK=heADRt(WTFIw`O%J2J39j9(Zx860* zR%*sBGnO4u2ykm#DCuowm2T&vrjEF)jpt*uCb4AhMRXI$rrC2T#5i-3yURmvu0jE9 zVl^swQy+)e>e20$hi0XPNcK|1nWdOXIb_f$mZ__Vt%f+h(Ql^0lnS@NycD5@Twy{*}&IjmG(R-Ob5FCNGE{Y%7 zG2Y%SikD1OK@_ATacI=V9V<X%N_A_jSymd2Wh~obYy}q=oh4#qxomzs4|QVHfw? zt-YA?sn&7Zp1fIQKkn++UVUrwYTL4eu}0T}2bphAo1LY~n&o?*E$d&61}J^*D!b5V zsWP|GrDZnzSlZic3lt|Omvak!VE@(X8UzC03gjn{{Da7GO(gQpATwDzSG5L+8)7z? zb;#TJH>ufF_ulGkE^Bp@_I8!^QXx$wTQj;m|~j56umeCW}jj0y1^ zyJ1nERn~*F3SDAz3CN?M--F`^JXWBojdoH`^yp|@m56nS=v`%>uJVSX|A=>3l|Fr+ffYubMAD&FDC|Hiac7g z_s8TkCr;qD?i$%eSF-D5@$0P(vK~AlOR|{@ujS?A>^h6;LGtSz6<|KvSHpvFRMeZESoT729d|!r*SqCRDe8nA)>mH#SV%cNw zFTRQg`Ua@WTy=v12Drh61|+;e2^MW#W$U@uzS6C*Uu&ha$sZN2k%3i8cghuYTP&`F zPP6ebWJFX4c%*1QjtT5x#{FkyL@-8b;xy0xhD@zZY>65=3`ltrJB^O@x;`b+E#uu| ztY?|);kq`vzn(rp&MGP^{ShoUbxZ|JG~>9IvtQqf$e+ah91cW_BZE$$7gr;C&s+e! zJd&7mu~vyIn+uEJ$OdJCvU{?b-!AIp49R9zSuND0^1;u?{MRM6I0>=TJ224;>r{Ml{ewN^75Lar?Vo%S(Gmq{I>Lh z9YRNfFi_Agr3*bMz+ujyXGQ=+4=H13Jk!+BMh)Wxgi2FG-p)3S(?>+zi(2@vHUje8 zh7qsjM!e6%+-ps%J`~JvyQu8pNFtJ##(3s@A#+O0oEYM5_762fT<6KN?w2}tmtxb& znYTZkE2t9dC5aevd8M>7I`!q)Ha1Ula@SE#M}FTT$Mtsr6vz1;dviTnEvqI^tefA3 z!PZN&;TGWCp)8cQ7)n2=P3l(rUREl9Ojmz?V0xdz^uCvv-U(bKClMVKw+OP8>`nAg z>}K^d?j$A7=*xkyB{3e}f2JoQ*=4w{8k8w|!6@nxEb0x^b$_RhkN^}m@)R)&j4Z-a zSC9u7%hY;2Mcd@YmcRiPZe^Y#CIUpIpgHe+h5Z$!m@@q9KE=6b8`%HpW7)965giv- zg2fz`?Tpx}Jp`{42lKI22XoM`1a_Lb=3jPsF_fs}PdSzRK5rS(CAD}U1yLpUg6CTz zYt%45B@-QWRc$%VB7QNjziqUiH$?Ugk$hc(#t>I)f$lJ7Q8o`R*;c*HeE@m1*Qv@F z-UfljfRQWwutG;xhp&TFOXCfCK!I+0kv*-EcVI3e_VqS`VG)AJwr;OF42?PW1bYc> zPad{qj9o0WIyVA=B>ToQkMmA^g&ZsM$OuyqM;zJSxRA|cy(vDLr;PmEOx_+R{w!%# z$jP-tmJ_0wlXW zVTlmsFRSpQqGBmL4Q7A{s!26(JBzgp6vsF^exTB~>ek+}YDehbQIxvBEux48FHeT< z{SOh0m@|!ZiWhlxq=DP^iMq)A-CZmP(54WcZ#W> z5OaBXedI=R`)Q3ZLSTQ*uHU=F;TLfR(^cb@bt6;lz7+Aw2dNjStb;*zE^KrDl4U>^ zT{cdg7jlZ|RrD?;gw`oF@WZ4sw@I$i%0HKtsiMrWoVugwXdpoFi9x3QA{`MfkGHf^SU+)VXO#1rsr?$X;U1sVg3I{NK zZr7|iAx~D4l5at8tSFf@c5%dp;?T;NxiEMgD%iC#URon%2}r3#674f+-y4-mWp9s! znhwSuOEsEC#2D)Kf=nVtH;tJB6ZCf5{sOKbq6O8xOQg6A=|*5svD;2|SsES*d#_Zq zQV6C!B(t}HOVv=X6E!pvjp1bo*Wh-tK^E+mHW+l9o_MNiH{jPeGxoO=!q zGS&;cRT;f%-}haudDjgr>vp)wqo)2UQMFDg;{Ii5NwBs9*A9KVV$^R8F^)PE(yedk?*=8JuuOJw9#fwFclj0GlW(S}1e} z{h8<@OSe+AyL&n^rKq-Z_I-zkFUAY@BqTR|4j1gLIoKc;Q!IBWiJa%htWa53$uRCp z0f1iDO_4;Q1cB*~zdaONcuKbeu*^8CcR7))6u)p(=^Nf}h?)G~%7(Ou{c^lVD|k@U zv_XNDW>Fo}k*4=Y+7=-d+gxSXJ@%BK!?f~k2=Taw&#f#eT;r;gFnl9D2&ouADWc_- ziAn7Pf|BU;c3zoy?7S?MwbAPI2#GDJW}G*10UGvrxFjDV1z>x;Rh?4BG%ApZH92tl{ zPldO?V%S^UMqf=T=C@_n^T>QQLf|h{wGRKOm@bwI0qfva9Jm9mgf;eEerkquvSNQV zCp+ESxWrQl@WTfV)3P^>ai49D80VL1Doz91PuLGJk}Q31B&U8|mWu!@c@|;))JU*$ zz&;yh4o_AG?eqPdt}V=FSGH)s3s$u~?iBNZ>li6uaxID8Dp^pHd&hzJv?o4n-wz~K zIYUuNZp656UlVAT#(o1o^Dx zOkk(DjXJsgP${fz7z@TzXeT`eruF9}c#ki^2mJPT0%(sqF4|sRK>4q5Sl>=n8OT7@ z>VlX#nxQe^t-C204LmGo4_S6DjIro*sX0OH%|V<+ zBXM^r#}S+N7V3rF994%eR^?me9FuhFo2~AT?DyF3B4cev*v6&dQ4`zjdpN!sPRA&V zM{U8pc#i_X4J?I>ClPWm<{L4c<0BUN&DrPXWxF|tba4t4BQscq zOdP87LCR^wOX!c6aR`MI9=i-D5KVrei}7?ToZt@dujQ^Cp+n2`u(UUN_wks)Q33AF zCc>ox+WUHR-+2jdBt3VdBD|};<-=$#V@*ojJ{P+WJnp3T1PL~d#5ie~DNn~I)mjFK zoD~|vcE~e!Hau?|$Caw~5hDDPO*zlES5*EogDs-;=WJ)fd_(q~z%}q}v^U*ITjNgk zoH&6m{5F~Q*z4U`?#oSd?jt5zcEO{-*a)%SSY(B-X+=jMCIcd5qOv}CUlkM*N}R#} zoU_ZWm25*XiR;pWfd(7iHHwuav~))kk@3|II<|h1dohm;aVm7Q6S97 zGz?B-P(X0cD6wA-3!>dQ#O;mp3$WR?{Y-2bHdw#jEpA5AGe?r`85_;gh9~MRkmOCc z8>(i|Grhc%wk+ArHYHUK;aAAIK-SHv>lW5y)Q%KKG8MO@l!*){2~5O(WDLJEG=Ucy zqHV69fL07-K~o7RTf2m&6B+rgG=D^23>MoZ-MLx!Ke3|oSj&oFs1{YWQi&Z23H=fn zZ#5p-C_dNSL3u#W>8k3Xy*7zZO$fO0~61lJ_8kR-hvQ#psH^MfkpT}uC_q7fXZ4lTc*<`$>D(yR>!;& zaKdgvuhp@yuaDs+=8Hq@)X~TdKT}%`Z{LUIm-|>La$U9Vl~>s$E+mFVs`Sli9}Nxr z5vXSdldn5uRyG_d+Kq&0eYds2|G`^o^u;U|qhbX1?<>7CKB{>lfRLQM61@nl;8gY6 z#*JH+#yH4hJS7edi?kiY_TO2g{li2)+8QH!p`Lro^7b-uKUTD!6@5!wb1NeCPKr(1 zX1aRzr4ic-*Kjnjb(nL^O{z%|;%Cw~;?z@~hq!yL!wZ~vcd-Wv_o}(MeCqAx#9U{? zn6-LOp0z;HF!V9aA#@vc7T~7CTh$iTEIqg-7P^xjt&g-lwOxd(DN+%Tpa2L&>`hHj zXIa@=UK{e?ukBTq-7(#t84hVrizzlr_e1|njJxBi9%(vXe|rOP0??VSw}vLgX4b{M zTK&d}X&@{1f|@zoP_``$Q&HjdK_qjJjbF_TyMYs2f4R9oz<_G@J~dTKIIqSmZ-dQSuYhx9)M-1fEfEjxD`g#00EXasoAZob~ZyqOxZ@o(;ZsEqm`qcdHV7E39dbel$yW@X7f=kNnn z(a0ShJ$yB)pTZ9;BC5xj6}4)GdZluQh$Z%{jRY}>^Y?KdQQ8C&hEnCk%LInZcd{E# zFerg;@rpTrv8cp!N;I1o%hfaE?!Wt0XwMX2GY*>RB-cp|?jmZDEdHK|{L%KyfQ5Fs zBg~X1vm+eL7B+?a^4hrz7@-*Uy-pq^4FlNWJrogji7KoIQ#ty191H#|$RZ)v^I7GV zeUJt3?D``l!6(q-R=Ln=pT$S`_0Bc7u=Q~9gB# z@CTd#Xydf!pgngv=2(lhpTy)j-R`vFP^K+ViJ!s*fHL3~5Ma#qjBG_N5n)9WyQx0wrJ1=JMTL|NW6qMbX?#9>F?>!w1|Hxm!hx94^0=FH{p0uP#EGE? z;Qe`%2c;Cjd;qInNolbB_I@?tA9@h11`Qty%rFmT#4D+Q0~rX~{<-EPeT7;7fwRep zVFgfi;Jhs;=G=(MW`WNBg2k4vzG|@xIZmNHwwjby%bgy2MBaHf66cm#a4R;lzf}E`;i(n zVv8tdz#ywh#Z)q+5tS{k+T-n6`!@D?<4Q!9E1+{2zgUIw)!D55WC+#h*yBH;?YBV1 z#@0ML&&Q<$aI7n(tPtS6UfH=gogp<2g~m=7+j}}$eK#80*{~lbUmit4Y5JeU=yB^O zdQF?Pi?zb~qULb?l_=XymHG;~toM?!)|a!ESqWP-1@>GPctk0nb)MiL17E5 zGNyRdD&GjD{~@bfvFvo{)oG2G?~ybVS!G0Unv z=_v?G|1ux@S+*Rj9xn0rpKx2ynB6%l2m7ZYd|$?r5WEpRm{@sMtewix0XMfKai5Od z;$vo4FYLjtXV)z5Z=*~}kEo07AwWq?giYm^Ux0y^rK-rv!VzMsnn9ZVWu42n)xC~h z`0|CYQ?{+t2ZJ8*{j$vHo{YVf1}`kyRi}D`h}Nxa2q>XumAPH##?~+Gf(ScJ_xC)pTXR7L(qEZt<5@h$RhRzJ>Hk@gTTiTp8O z?bG?Hs>Sq{A76-}A`;&jWq2x`T4vSW#%^+~;aQaYtoj7-Kr$< z=nuH_uV9lu;LhcW9|`7at~d#3=f~~MZrQ~Bs|jbfx=;RsC#7K-FOl}pXpNU!#%*=5 z&=1M4d*`%udsg>b;@FGU;)U}V)At*#ZNgvrc%z;4zvUYbdA|1%H^2v8_riL<_KXL+ zX#w;y&ZzX#c{--@@Cmoc6}Qs&gf#|$-8rUmMR}YjnYY}mO5z-Jk?WlRAGXhC$FUEU znosKPXB*;rm=8=qkK6(Ha-24QjlS*PnnwYT zM2XgAZ%3v_D4po-Kuqs|W{#xXQDW{~jMp#;m~&R{U8@)>5l85pD{doh(3zhHHrSarS7?I;0u zeuhEoHnl$tI*!dKm#$!&io*z6qWGqt<*A7kT$^g)SYx;sI8pKfx_lU*KXQW_8Y9*u#O_ zo?~7rP~O*`jqHZJ{ZSHtor$FRBozbuF4=FkDrM+C=MlH%=G<+2jFDZJ!3Kw1-hP3@ zoaQLs$t#(@^a15I8T$ijtel2T^#lCEH2NAWSRY0ML7!3_;L)aP@7p&QG6^Ev%(9weTXc zr8F;=+sDvfXZusM>IsyeTvcBXco`)xZE7xE&>q}Flr|%Y+8&gf!c5Wo82+@Js-_0f zFSt^OE}xPk_}h64suwRLjlUm5+rvya% z!&!lJyV@^D|9r$;6Y~T_;Q~Ih-|d@1%}y$=cD!n>r4VtzVFo-~^Rlc-YP3JL^TSfv z-v#@W$tP5pw_jEzl$PPf+j$3*=cCsry6o)&x#iC$9vNR7W4)It-y+Bxiq4}k!BIo+Sg_kp+q>hss0a)4f-8Q!Ei3?P9Ru;W`(N+jj$Lk9 z?viCWjb#ZS!x3Pt0KYwtugh~7jJLgBd5=HNU!8UL?G`s!cVKbwPWTZ|+{3NlvL!RO{;-o6 zs$z!T0W2joEWG=^*v(W{XWkq39Q=@xYFRZ>p1I3MhGeA*{+7p;fqa(yo`i*UNTf)s zyAM==3Q{ouF}^7c@LW+anxcv}=?y1kwWlwfR$9+(lJz!)B`f@ND;dTN#~yA=j1RdR z4&Sy7*^KAMK3xnta5*qO3dxQZ7st}hEE8fw8T?qw9MbHn6dvaECB3dVjb$9rGjY|O znPEUT;FdFeOQ3NPwfP~ehdo?h62-fHCKyCL**W<HzgO;_e;hesw*xmXxM8q66<(5@v z;$s-H`h?muoG9`d&FYJ}PdlDAKd)A zx1eEYyDaBO{%hHm6Zx}sOP=~HpFPKedzC7%DfB>=vU3!jTT|u6Ts< zEZGtAl2T&|OKwbVE|eKWQDa`%8Cdt^7|@>n18Z_4sWrV-8ti0G$*oAN371i*IOfVE zRrZ!uYjPxJ4Gu+Y=hfN*dI)YxUByu-8RwZo?=3&+2*tH zB}^5`3FzbtL&Nn;%AW9A7laKBFk-L9_@f242Ia&W5FdNza%(^%a~u}Plo&OgL^)P` zfePJmM7$+Pbb3|}M!KJ9o8?B>HVz;TIAF%&iF=n6; z(R$%>%nG(-)vSD+_>0U+x_p^ciK|o~Ftpk2r92q$^Oe!@iE!?*jQr1lU> zp{LMow-)SBhy4S*!DIfz=i?9A3R$)`Iuk)Gc&WlY9O@fTM4F|l59w$#)LQ-j*?af+ zD64D#|Cz~UCLzFtOPC;+NmNWwF?hkj3r+$g0V@uu7`)(sl?K{s&>oC!v6BEv=&3Yl zOQW?Itku{m25mK9OD7;9T91uYIkBg;LpaA1+w--dwKUo`>-S#knL#|K=llEr`|7JN zUnMj1>}T(_*ZQpMUYjm;M?nvrdmQ>x#Muziu_|KPVmajqQ0S8m5{7rw zS_4?c@?S&Uv*T%TB${i^oEIPS&!>&5nVTmLFZS@?Z36C(D=~!7lC1vRt7Rn$-w*gdCs@nj?r6V%cRR*`aC7}_j@m59R zmCVw#82P6up5#KOs*Jk$h5CAujar>l(4(tu5b=G%tJ*_@RzGrsR+(@V*!ihCqSjlt zL=+EC30Ya6aMBZ>Xd|t@5hg80?4UuLQ{P|lB-t*t$|*sltUXQJg(r`PclDyq{3zUmp? z=h>VNYkjt=!lfM{$cmOtsRM}`RovH%*N#RBwt(hP3x~y5qviqdr}3)29*Z1mfZV*+ z6A>6fop!HsSg(Ss{T8=Do*`dSyYY}cz~Q~LtJ1+-M!n3h+xT??%Q&Okbc=#$mt@8< z$2nB&srM4)piQItKF?^EPYiN=bRUI`4JTv#O{j=QxtwM-9`crh3g?f|N)7^PV48Ht zA_7U}Ey`0$k7l_~U5!Ujeq^P|MO#X518E;h0!dI{siAVnR0OvG8%rsSW`8#(rZSy zsu|M`h}Or-p=?k1DEJgY4`?>(SF6ZI^K+|bo4{c+x)c%Buz--w9AYL;%OKZb!u3wO*Z(>qOOs9fDWsY1 z6b{%}j(&`DRG6QRggTU z@;;+Yj4gf40uLnqxBhBb!;&UwTiYLf}=L+o8v zK+7^b>aifyny34Ef*9OP!dH<7&Q)ig5vM#32--XZQIeZN4YhjpOLfIjJzbCc?!@Fi zuqIN321#Z9tVn6A`sw%}T@0!+i0H8vZVciA2X^#Gev?eA z)Ob+2sgOOOxX(ZzMbeWk{5^|NZny7I1@knn#C0o&O-bZiK#KRFGe+!P`UQV5x99Dt zN~<;S5UH{#(@}N4*d@j6{fc+Z>Z6fKvN}F_8O_}&oK7s6+=T7`L1dS76Eu#I{wBdK ziKfJ6kNl)rO)|cAOA;n$)zDc!F8i{z1DV%F{AcV0y6qjY_M%9-EW=ukVWC<*6bx8* z@^t@)?29S{3>vJxVA7RB)gI3Tbk{T8!N55-6m;L+V5*^1k?vI0P_C+BVfuoAW}4iY z*8Yg$=Ocw2W+kQS%hI?Flp^I(H6IUw!fNaW8|Ti+ zn6)UznZ%l!?MGS;RhgmusJE^RK{|g)f(w*1_u~b6uCO9_86BsTz0ay%5E%IBr&m1-o_U+!~_C)nbhrn8Fxp)`LJnMwm?jIVDO-|Xpg-ao&`RqMltx;A%qA3a zivCbon_&9GRU3qyV3LX5veNAvv4sWJ2RXl;UBj7$PPqgo>uJz3s52zE>5xvk1*+^A zk&EZ)H9`(LNe^u=^e5W;`!t1J;NWasf&nurQSUz1-9Q0&<0+4p%yZl)NgK-{_sQJ2 zOz z$OlI(U7&VwR)n(j7>v+|CW&y`MN8DVhRM|i6HFVJs?nQ4OdU)OaZr7M4fj&k^==4$2Qh-BJicW3$B6S16N~Ugmlu5{OFiBWmgkGe(r$JeP=B z;t2~n-l6gR8u$swA53zi0hZV#u8X&b3Z$dm8&`i5nw^qhG>goZtA5JXa@aVrrM68a zA(^I);N|*~h^i6m=c~XGvI1(0j_EBrrw<;;(C6+Y_!N=x^)g+}&rDkNV#vgh278n~ zUrbhgsvc)A;*p5UUiGCYgl^FqB^q-y6v~_hMbPu4&e84_ID)Bzm8NuvU#rp?*QgPW z9r1;F7+A|(EC9CA8-ENWAj&={EJQovSB;*X2u zDP}82NzST@$czXv$`*zq(@@iZ4r*{4yv9P+v6KpebgF=^L<2RUfVTB$QiE_5%H;%# z1x*3KqbBtFnpvg*Kz=mA%5>F%mzmHepDSG_5Lei?+Q*2Y!H71w#`VxC2{ zrLB&*p26aNK9rr8^87d_3z!goD{PfTUs(@IiEuT6fm+>03e`2}Tq{v6(WX@?HTG&B zX>?S1qX<0(16ODc52QDCs){%fd5y>6vlK^78C*cUR0XBVBxz-N8$HqW=ViQMk4B!; zTH~PVj02eQ3H8LTQzvSS^`q6hu>E8kMyv5_$E3~P$p@GU5~`1o_2dCvWp%9-s)tn_ zad|gHe1c>?Hb)Jm1ORjiJ9UrVbI8GGa1MiA)sre4>Uk@hn-r}y+pdV6tJbl5XU7G^ z6cE&Pmg2h?Hv*#OJMp%iHlfYa`#!JA~XA0oF^1Zi~% zty#eltw?5C9`>lOKIq!MQzV-^Yv*@sPqA<4Vkc>w>V~bG+Vyk_WR0lP%!Nyo;*v2i z*wqug>#F!=j2$X0Q%@oy_f<&ld<^LJ3S%@sArA$E>5jIAVaVAYZ6GQc1QLg1;JW22 z608BJ-dLbcr6&$;h@lX4QjZ<($f2rWy4(m-SeywQrB#-m=5ZbLVgjHIAfQZZgwffQ zsSPBO)ovHl~fWh^y+Epe<^D4H;t*M?EtD7BpKqq6pCN<<=p(0;ZQLW^d*BqBy z<9xSS<;bV!U)Y?83e#Cy$fQw$ZY5!&#o6R(Z_~ib9E^+X#6@P7_W+8sEC{m$2-}dd)UR`bOkB(i%gXLWxam_+9LSmbvDcJ#LYEpikTMW%BJT4W?Ogg}u$-L`s!5 z+|camzA9;|)M2^H!f{(RC>G)n;p7sQX!F<&!Cyz~m2Z)IxXFTcBrG-|4G8vLCipTo zux37q^@6wr0}SSthq*0Yp#Y;Kceq@STjehyX_edDQ5 zX-MG{PnG=Np5k6t-lWIoZK4}>qLO#0w{}a}|IbAIAao3-4f!HkgR&fdKyLxr>r?3C zf=cRJfVzdUt31ANi>y`J8MQ_wG$tas#%Yp6%p7I(!c*|?FUoHJraNU{ulgKGuu2Q(x56U!a zaKeEjmO=v<#V1ucvP#cxPuIPx%GLfZBsP&=&c0n-5F09q^ZNX-EH7c8ZTdsZKvuI3 zE*vXkVotnffK(|%-Yy|f$svUFFumOiVoZNF>DYQWMMxy;QK%rM9z>!Al=@zYNA)VW zx0{j3Oy)=iXq9ymdD7!%e(1QO;khPfK|-$4X*H-sUCH^<(V*J{5yeys3Q+e%+kJQ$ zDAxpRiz)BMEP2CmZ2`CK{(L>>h@rwhZ;C68vFZ4ClNNwK%s*yX#8XxSTOWP`wrFyI zk?Q8cV}Q4N17fU3FZLocC=*C}cs99#g=rwz@*cUpNw!rgSnN!jbZb~ASh68o<{AWz z&^E*30k<2_%`yb5#9%voDufX_0wEQ`Dtlx{6D4vRniXn3Z-eeO?2_!+`dR=EM4M)oSb{C^u-54>Rm#Z~_h95~b$r)oe90tWM!8jv3a?Rq6>m zs&8q;6qOZ#jnLyY#h@5$NS%aiPKY<*sg4}Q=D_6fGu@fZH8iTS-XT^`tX7~_NX;#$ z%A9^(VIG^2RHJI$VA2U6)icw9INBVGSvGoV)lqpZzAzL?SEv)g1u6=(5>X?txmu(G z^nf>M=((8cGjpt&KSd)Ey%zWAL0PU_n1}-}-D@{K6cN>gS83_)g(N&$OBOG>kZUXJ1E(9UVhR@ z=_^+uuZqa&ks4}B0?m}Ut1eam*lEQKU$*QO67UIo1>aCbUk#Q}+F*Ij3>LFjwD0WMuy%kWuP^59JLn+! zLVjmCGtoYTi%j1SN&a4m^b!7(5TMNom*Eg2uScLHGXc3Y4-k}btr1Nq{rEt6T`f+7 z2R5pa)e+9JBL;Ex08W=#NtMubTTFp#BwL*%R-n*8R|b7u%CkyIGU98J>>%j#OpvYg zr2z3HG%&46J^3}+QoWxoCZxpS2#+~XosKd+GQmAy@)Fb14tvzadZ|O;VE9Wqo&5yN zsC;56TO;mL@F(a@i!VYdD-O9n4}?*Amlu&0o&y6P_ACcqT) z(dk*78l@u)3^sqW*4Gic*3%HcsMB_;*MJw^9j;hOnC)XJblnD%LM>`Makxplx9xDF z^d~IaO0fMN^9oj=eX?aM;=|v|&41AREYipiH=HVi!!i~**~$OC%XbZYs*MP4XBwts9roj1$JMehEUaaY zK@s3;dbT+pG0)K`?yW|Hz{V9gnJKBVETk2RY7l~e0X3quCuWnh(dH=aFcpYvHj?-o z$s130Ax2;2~csOKfgI2bO6^VHM7Dv0dJWh1hj14syAW*inANJ!A)9TB4UbQKU!gFF(E za5sUE&_O|V+_=o+LInOm8v*Gsr7&}nH7b=Xb3-LlvTqS_>8->6K^r9vq$9qo9A zlX6!`4lV#8(fP71!kJ>k>7{ac{*We2)CptHPk6$_GVnGb5Qg|zrfIU6bVZXEHwVfS zUGo)ht6}+l(z8h$6+((QKhE^ujI#7rBgGS#&gbRO{6v@T&zguLCnhtSgxXQP8Rxp> z?h@0pl?PI>(bpSW5yPIBlrc7J4iQxKgb%83sK&dRL+<*l%FlJ^b=U*g#E9+JHL^x= z)z4V~`Zd_*grW%T^IFg0F&}<@T=@~bfGWt4?>cxJNOYbZP@UgIC<=#=@^M-tS1{30 zCeF_xh5Nhf^$un&HoJ`gK*pvZJD=*FSwa9{PpCJN&ce&2~ z;n~+1%pzD^r{>+F2?~TG!q6^(Mn!PqFVU9Dpu_xHZQspG3|sYFdwOvM^?9OE@9)sW zntJPFu}NlOszA56Y>i`sUs0rk06-q4&J2e(rFLys&?TfCP#q0ny@_O(NH;f4nEK|5 z$wrULy%x{B8ll!8LV~*^5aB59L2Kx(=WyLa)=L^VzUXbig=PCW6&5O2+qptss%X+l z#WBC`l0#dxE9V%(yj+_{Zz8>{2`2{8qsaYwI;3{X#Dj7d>KFxpeNP^c+qoAI*5zWN zjCQT;*o%D=lU0hdgs2N6@{$L8JFihUT45tYv}*uQUIypwfGz%eI{I!+G(4c|!BM?TMC{^65K zg`NU1XPH?h@AFp=&+Dg6_R<|@&Vwnp8_Fy(i+;p@yxbvu9tsv&cN*7vzsoHK-V)se zpWZ3*r9d-?V9t1RmRig-jn?zI8sRo1Q3aLRjY?718Dz$eHz3&$N7wsN1FI7TBiV6T z8CO*ShO3yMs5f=O&OS$;QY)iDTi{zCnewoIpluTzF*G9eh$XC_S0meyaDW6Wdwry{ z1oIvTpiwaY-v%0#6S$WeQKzFb^HmKqvl)JV7i&X93!@AtJaLrNK{5|7cXoT_)&o)y zE8#ubTnnhk3#ys}LsdkzAy<@6ETHIk`TKEnXR&0l`-5}wh4P~s~ zZfnAXrMVwnJirSwEtEiU&P*zXGy*6WV*yM_ka6#52bI)(S*1`Cj}qUw)4Q1hpRMMSL#7qdYDAu_hi_JoS7;>;&shbF8lp{H29n`|WqbfS< zOG3OVuKjby^PYY1He^vSR6{|bPXlTBazF=QQ;SrC-?x!AQ6cq_F$eYeh)ipbaEC8g zfsk#IS)qm9HV90Ckx}l|=MG>CF=I4HT;J5BF8!$}aV^D_NC*p@nF%^+5blT*R~xKI zKC5JFK;WscduicD$&TpB35~?nFu5MPH%4J1QK?z)HSkQi{#N^gwq%(Fx+9_~t1Y}f zbD=&+7F{#Izzf$jQ0g!_!eSuCR9-uxbk}GS6yUW9DKNT~Ya3YNd}qpd3{e)!wm0Zi zJp9_iD_I z8i3tR)O8}iW*s1pA2yqLGTR*OZHO*^uSANG-`C8&*pn@<^VxDUUhY-fVzj8Z&o~t* z@;-Jm=&%qn@;{=_N)gH{;;tpSsGhA;S3|FEpZ zdOqRP+iltmz;EBdHBuyjRz=tt=nRb#{a9oywh9d%AcDCdP1e|0&kdL#Z!N5*3|8ua z?36a$XT_o%8_-RI?Jz054IxiBPNAwQ1UOWiG-Yym9&*8fYAW>z4tdL0Nx_1U9p)Ju zEC-C#gjWv|Gs3(BI@>g6)HpLmKv#vRk z9|9agKoGz503I0!X*huORHSU4>Cr=)(<5!lGm1%994G?_v8(m;yhh)rYNd??H@Zcz zu%`#ac$?8O0SYy~nC8Sy*c#0wLNBF8(hgy#h0eu?Ydf5Xy??&W(L=yyYbSk`Kt!|Eu z1I$pcs}w63)|feB{fG})KEhU{MEO(Y7$j8@J>SEk?aC+`xOq&L&P~X;rZL_CZqe`4FBWrO0r_ER}JJJoOd-Swp zcPuWRP)y;@ssc7n1`R%BFf%yf7N69;qJF#8f-E;N_wYU>dY*l^%@E>odpAGYVPC1E^Sl8=fxV6A7TE**j=e|& zL7(CPwiKEa9I$vGvHfOH(JkcXjub73dzkzrRZg~t*lV1zZVV_}5$LBI7dv%dNdhq< z@W)PQn0RwlkP`(iiy+4l2{viUeQZOU7Ee+4OTTcHjQjdgHGKfUM&bi8yylo*?SgDZ z)Mcqvv$mpz6ZUbfr-4U2D!|h=< zwp9}J3R@OA#oy4{C;);upGOm@!CGzsM#jgN$Q22+uA1w-jCcyjpg7ixe5F6;oI+ZrIV8_U+%wd$4C!tn59+it5oV}nN%UjFZyP>6I&aa0ApvmzaKq z1X=XAYG<5K`LEyTr{r&!9Bk%1jtc;%tBC;V0DRt_wpPwi&R~of639_U3ts6c?o}Qw{mGr?$lsf+-$os4i1$A zCUtgr^bjaq0zXS>nZCwK(-?CP0XAsW}6g=k1;&F@vwR< zj7>Ee!>lr3;d9=@GX@`)~=+#Z2bdAABL%Q?)EZBeHr4 z5f;3Uq_#?jo*cs~a0BoSi7tzGu6JZCRv&8NHY!=1TBwY$+37?1G#&SbRdjZd)Q8ok zlKmRy2M?+p;z__PPP@hHFacGq;T{oC&~V4*@-o=c<-pI$&oth3P;Na~-@yJx<~MMJ z1t;MOCt^=)SM$wQILKRqav1}(sWF9_tDLRqut(Zm>?@Ho5YMtrT)eZ<#A|FsQ{;^@ zDMT_WKPENl&`*Y=JgsRCLlbTKI?)LwK%tUQU$2&Lb`y*cZaFA)H91a~!$|?$CFDgi zklzUJ1P8!DIWSn^49A(t5khps46}8kL0y8CGf#_6orXm|i@<9sJ{AM@l*?Rmg;#hX zBORGvVkX3`5Af=(dTiOt@*fes!p*(VtDpBAqEu)%@MD(1EIF(~#FTE2tCe5E%StJ7 zrgC+Bjrl3K0jh2`tI}}#**|16L1u)0-5MM{g6zfXBp8yOE&h0yg~B3i_pNIh%90H|&GLSwMmUx;oqMrn7zwH6C(qm8 zseTs>+hiXx$Q=9ngi(Xfd+bFNSY^q(W*Hr+)M8Z~lHandmA10yjm*rX(k25XoA{1T z_t-$)7Fyv?<}k;8F^dV2m0^e9JKS8g+4nbJnyCEwH=ma_(jz|VqBJjquS9<*#@oh! zGb{(QlgD>AvrYW}a)Zk`zQcw;@7niF+hdDjqD+?$U$aN&@S`1egnPfu6>F)$zR=$> z)=vB3HlzLHhnv|er6Vmt7p!ceh}TCsg}r5^ErPjdeHbI~_cR{j%iHa3b8LjSjZl2@ zI7C$vO3!uLRKAa+~bS_7rbF%A6Q@4F5e3oy-!wr`cw_od07vv+T8V zPUXtKV_Hg;(QdIVk$EU5-<#ef{$`q52Mno}*aUXk^40Ftb&l9$O!FOkWsgOzlx6r? zlaX0ZFrKhA?>4$_vxgoxb#$*WIxi{UX`hj3zdNonBSY}{N(jV@X4^9PcDarEj(yj_ z=M0~3Q#wv+&!*duJxzbkgY)cfp5VEAjl?^QRFZvxZZ?yEs2gl?-NyC1U_#!^9FN$e zx^=UvPNm@Jw34KkC^G$lZ;TO|apy2|elFQ(=)>>Wd}o++6xbd!hb2Z={#>KKyGR*T zQ-qa9J0|$N&1t2*y~${{)4qD#<-GT8MUov&i4a8qHk2MEnq!N6hr#%aXZ4XZ)sNU9 zm1)ACu-Pe_7udV`Te5G}m+v;(@?4LRWu6VY(>`BmlUiBNN_KPzG$bvk;<;4lFSbL)wj6WXVc~#ER?stV++x!$`V^9lX{0g z_=dsx$u|4R24k;xiE8lO^M~!V+r)RiO@uF-j4%Z@5uUp}jaS?FIZJrWhF)T0O7``J z#yeE1pSL$LE>G;Y#TW3z`#MQRJz+CAVngtof-3vP`}Wh_`uIHi4ZnQeeks|sVznu~ z!!wM*Lp#%Smh57s8oaokZ`Rn8{5@jd|J}$k0C>WO8{onoZ#Znfot1vWjPwimWTc8o z@Lz%953iqR8?@ivl+70>-1ivq`H_aQn4M1JaC(MKhka=t;uo*+`4}U;bPsPg8jRS~nAg3waQ@_T2H{P7!jmWLVcmk=Ds%S1ejeq;@7wP1>^y$S z-}(dFIUd`Yo_~WWlG}|fMr`^#P|31SWxi7s2%BK^)5QKpOkBoYY23myb8JS8rC`V~ zyyS61o_CEG6~lQ2Uoew*Yymy|qS@YBV4pVG&zIONr`eDA#l2~{*~yC-W54}$UiLjH zdE?O~yl|F{zTCcKCOr7AJ$r%|Y%?Ovu!-Jo!}ah4zdd48Tw|{qIqXi;eqLaY^EE%` zh4YM@D?g_9nfk>JdktUDVYKHhP63=Y*>4}WVI(_G>9hY-YW@!_+?eK9*eXU$#CV#Sy$1E0Z618bFwBYHt+7uwq@U-f+jyAQ zziX6Q?lLC>@NRzfIG^&b{r0kKhT}5^e#Zzn!(PjG3~|IB=iBG)9oan8!+$$?k^4L^ z=8q=+IAXuxeYZE;A3L&V7_;s+U4*;Cf#P=KmPX*3jBQvyy?pDDV#o{DT7jFHzt}KEn5lWqNBpG4wbsFGhw7<(nN86kHLO zXTz<95(*FHb9ipxmA9Vww2TW7;>{S&7jHj3rbf$m29uuF`rdlYVP^SeKX|Np0fEky zIW#>LPmbgakaoOIIz1zDeV=7$^~S)O-UQP;M~d5tM9%6y)~)Soh-QY4J5t5@k}(Nc z93Y16OL8QmORA5`=ww5^WR#JPl#c?ed+flTeR1bS$*$%^m5lzz8**)!10I=^ZhGPF zi~rL{`4&-589hv8R<`_-_%~D`KYuBa>l}`jjM7{hw2=?1<>#Fp_44nn5?swOwPz&~ z9g51B{HToEE>pt9VWVY3t@O!L+RT0r+FT{a8LKQT-K|iJb_=A*ik+y_9qV0MKD*@= zS@`sq=}i>yO9p)lMx?Y(ewOBpMNgoWnMeXVUBN}YM%8P*dx*Rjs^TsABp zM4->NgVOHjcnx!iO0bRl#){+h$B#+_bmC~-chLTYVCR9^!!@ zpV`F%?jM%3wN>dQVL4s`6CDe*vAE}H>=MkEkn)f7FL2I^t9U32!URa^{y|28g!S@A zUipM%47Si%3f74AY5|WKs(oVcsTYS(EWyE3S~i3sx)IeUNYer?}KY)%FBTi zuK*^aP_a*X0%A4goLvlawe7aAbP=X-Jk)R}Dl``;VqT$V%Y(|0N%}{H7 zK*=)ebEu(F9f(E+V3TACOI@&uXxpFQS_y&2P-Jr;Bn|ofP~`kl>b`&TWPSpbFp&Zr z+NzwSiDW{Quv|M^mQ>I+)2pQo`SKVfxv{Uag<7K=E@28OzEpLPSyM*&btK@#V3Pm` zA;vJ+csVbLrjoLwlE14hF6YLflDER;6cT|jc`kdKb$?kMB$~*GQx;J^0=pEKNH(;& zkwMzU8L#>iS z%1*9EP5lf6dQ26-A0iSc^h?XIWK|1QI&7sBKl)Y4d=>c34P{=%lvrh;P|g8+yQPg~ zKOvhytPD;Gp83`jm&nA)a?q>v@<@Hgh*T+$z{goKkk(AcNGp5Bub$nBg@Hb5m2(E< z>;p3M(SV$PhJ1Q2XJS#I@cDy|GDSXZ(FzzurGnj|*WMt@zpIx>_o&V`$t?}ae@IrW zR$76QKDdq>bxP!dq};J$HB{<=HA?(44jf_qm@INP@-Y;Mh8UBqWv6^NybD$T9`CFO z0jluE@2jN~gld9Ef+U?k)F>%vIM*3&)-MMXK-E=saU$gL7r8E(qUtGbgN#Gbs6{;fuh+Z z`Eu*V1w%AH#d!i3p4!!_0FiuLa;ci+i@ls_Co-CFBFyZ(L zf(whN6q|mTBB2U@tLNA+e)Sy8HE*ug%3N7YL;uS(^UsqTRaOd;REvQHqoL$0YW0qn z7hB>o#W_YL_5-{;j*a86vMR%oIteEO;PNF$F>WK>p8Ph9ZWIm_d%RaW&4g4Zqi=GK zGacBZqZgesslGfPa*bwg^^#pHfxcq7`s@xsz~}{uuYzLtK(U*XvP~(r8IZshY)?~6 zt-8~+*L1X1I;+KJR^9o31x)^gZS9px>=V{LUCK~Bj;bCCUjvismba?_YtSwU} z98)Z@gh=O^@`Ys*Evh>vfz^w!8)m-xn5x-viv7Eh7l)(JQpaM(4cpVtGJf&cmsTxR z!63Iz&B}58r_Z4s?}bBb`A23;_5135CnBaGvVse_WLQsvtMjAA(pWFMGzNC2 zYp2u3*35^pPj$#ON$GB>S&jHUi{6Vw!^X)9a8;ZLi?!;`Kd*Tct|y2Dv)fFE#42?ZPCZ2SiE%eu>3?mxe!b zR`vZyWo%5<-+O8+6=PT91o_prhB(8;eg?X_iw$UjGF5o4FT~{fq@3|;{+Vk z4)UPPIIU0C`$@HJt5OCkAm-yDD=TD0zTUX{BVCS>rBhB%c1n9M zaEweJmbno*;Nt#mP*ACoG9lL(S=unWv6zm_IdAKUKbSYHfU-A!RPuUR!?g8EmiuRF zxl}F$bG_Gm=%ST92$|pMmb=4<(R=c>;ORAcXv`sxhgp9JLX64Bn4r3cvO~G8b*NRm z!%CI2e7iO-sd@u!;+zpn%Ef+*2uU;LGGeZ66H&Nd9}PZTMZ_t z!!-*H8t}lfk=qb9;KWp!G%U^S@*fZf27)?s{x&R|hvgdi zEew2KSbot4d4RbPBRwuzOU=SA#=UB&49@BNzq@J~WwogQ$ffz} zoMsL`D}n7@HR_|zbf8GZ>wvYQ!Kk@1zBu=-Cq8r5fBGB@ty_m-&TOvz$YIGdWP%sp zE0t7t;ftZZ0^~)D{^?vak zrK^uex_By(-v^Vni)6Ww_&49^kI|9Y91)o@EWc-Tj%~}3gKqdP8;bgF0V?xqSjZ!{ zq@l8$LPjR}O#l?Gndrrf&ohavQ#QzImp`k;b7oSW4&zonN7LkZ)Ky|jw=>lsk4bBm zbhZZLG5B8NSs!9odF68SS5l@&P1!c(i|63d-@YjepWuehkoYd>mn>Qd1%&%DJuL}Y zrtkL-wIHLxj03N}^*!|SO|xaKfN9qZ$SqhjPdoArZpm`BRy|JU^aSLKbSR%Y#}4WV z9|TtIzuTDBm>45qt@x5Mc|Z!gWlaOFJbW$*H>g$O)H^)yZGZMb7@D2ZUF8<31OE&_ zR!Al%J*nC+D3+cu`<5$DIgoz3T;`WcI(51?wN^{^4IHp~BL_`CW4i?Jf!d>Kci`YG z_<5owDBJ{~V?hqTwEFc%W(jzb`JR?e`AtN=FTV2GuHna#{!D@Zu990QGzlE0*eW=T zqT_~J-n7B3I=XISLPl5<~I)mEsQe3>h$@v^H)7XeiCphAP^Zjo=)hG+URV-fu z)TutrH^mk#mD2{3-h{kP=&{xJ457#yhMadI@Hh9jmV|%LyhcVX4OHA4SqiEhXJl+4_zZxim_t-iT;xzHjv7V@t4Ml!~QeBs| zm%*cBIC~_eNjIn@(OuB$QKfkX)*136*L7)^q7s=>vNyh-NS)GY8ll@d1@VsAB`hcx z==HG;ow_lfA@_^5lJMH|vjM4u2@S`vt5$*oASmnIU3Pi!PW0xt;x)CWQ`>1-OaXp%1QW z=P)L5xem7e;xNG_4|HA`P#a?hcc^r!J}5yQxK@OJ9pvNvBS?9^9Pis#PXl*3tCbt~ zEaIXj#ALOr@CUA)i>XNj^D1nJyIAe_zKEBP&pxI6*x|+%h8HmSZJ^5-UW!sq_IvWd z5`e<*R7VS?*--(^rLXwj_(R~pbcKm^fd7PV02AfRFi=xAD5n)CkZ^U<>zw{1L9f55 zTX2=|@B0WL;2rD$_?SYFnBG{voZA@iUjE!!Q z>Fu3zSBS1#|wY}_Q7HR;IXEjVjqLbBRIY@cFZ zV*~MSHXE6O7%EfGC>szeF{>!Mt`8PAPC#Kq%4FjG8f%*^-d!4goLY==u7=FXyvLF{ z`Aes)jMg$ha5a?Jr@nK0nm9sq<+w~7*64%kQgwKd3K_mcP8%lL^*(+p>7fsx_H;Bk z@KdkuU;y+vNuji*blGCbP&XRodO@kYFqnKa0b6-w3+!m(aVn9f$%S(P@)#Q+zT=Yov<&Pf{T;nUG3|(tenfuQ=@M>5{WI4*wL!6XJDs zs{)YvAAdktZg(Tu(~8kOxx^zgTvqA@KDM%>lasPD34VN2URVmTEXuIGmqeJf28UYv zS}-71QB}Usee9Pig|W(jtuGw!UM4OR=U@ZNHk52i5f5?@~3coA|gL>YSCAVL0NS; z79M4@s|RG!0a@@UJEJgZnX{lHlYzO8p=V`uot)N4azi8^ZH47n-6d~U$nhr5QKRF(urw<7|O#n$co*jGTS?7M&*XFUz zA$YzofOjydE9D&ganLv(@vY7}yyGU+_jN_UMV7}6HlIN|g72}rSM_xc5*d0KWgvfz zShf#!u!LTPd2Ga$n4M$T*iR`gkd0XU=%Tcn^v@jManKQxwe|J2OaU<9$Q;27l707U zU}$_bPIivbLyFG<$40RixzdLz5|<_tQwiA-mUG&%sb3;66f!uNoNp*zGQR`87_@9( zsJd6;0r}mqtQ;l;@g7r}AC{vfGCc-Oc*7Z>uh$<8mmNP=++9(}#$~+uqp#gcLXoJ@p>ZUNRBPOiw5pS|1a==xrYI63O?>qARFXIZ zv)4d+?CFoQ#P?Vt0;zvpV?wj=tg)T8*2}21T^0|5BA-%7_NPYM zD}jVRgC1jm+@A`k=(6d|H)3VM18w^dkpr(N%ginN8N3gHep?HgZq_{r-KGAkcte=M@d^tDAw8xOSc6v0coh$r-t zBT#6}NkWokN)kU>Z>p?-Z?8nHLz&Kq+{KY?>=_UK_!!vgT;lc#nQ6(2b9O0Cp6T?` zGDU76F0E7%uZCrOYhTesO;NeB&46ULOD=44BbH8<9IsJxepH`a7nJUxd^Rjc2#c&{ zReRN#PZG__4wjBfJFA8H6dSRT$RfIemj!u3Yk#RNY zBux3mde_itFpo@B%kE~$CCCcOj7R%pc0^%1LJtI`JrR)44NKo5i|5KOD{zG}iZq4t zAP-!lgu)M-B#-v;I#VIP!~1h0%Cc&ElqF>et}0s@O|WH?FhANCy(i~H3u9%Ve#|d^ zq>4D>4UjmEHIo|dC-$UggF6{NS2?{}W)PW?_@%T}=}>g)hF$-PMjeY;2L8^(NDIYH zN95)6fW>FNruhWg2YnAVWN;vOPA|N3J#4p3dm;~oTjfoJFw7|rYBK0@< z{jdgBUZgT&vn&kC2Y$#!2qR=sy&MU?xA*1WzES$bY`J`~G%A)4kI3}W_Y`ziLG3Io zoCRkwrKw75Op)JER{x%|ezulQn!d4+YlBJ&ZLR zzaA$Mjqj`ke{n2{Z1~}ieoto!GIS=|@LR2z=lI04?i|KVs;3s=O{{5Zof^f{s@d_7 zb2JJ!x9vOn+qa%rBsq&Ua^r;nrw8RyaJQZqS0UO8GOWvj6<)Y|HnM$VzU=e@<*I|; zf~rqJ0y99zv3--siubwV5{}42E+x!Y(-`I~z=Z5?qAQ`f&vSSA(M>5*oNqj*ZoKDN zhrkSDsnEa!&!V74HF4YzMqQDK5qS)s`Emmn-JNdibyx7xPS$eARKo;P6Sm!YrQ5YY|N)hO|^` zhQ3IM6^+y2xavW`{9dW|Bx!Q;vl^2MM3(7oXK}QBFaa_lMXozmgR> za`R+b0x9o2NR5HoFExk{dU_@ZaHtn-R%`tZ6!lLa4`6!{BTPZH-da{X*sS%H8lalV3RX>Py-tC)DG ztW7(1wb15CSFnsW+V^D%v_Z0>1G0>@UIwo!V`06#O=Xteen%wy0U1@t`X^c}9Kre& zo?UUNM*D9G%L8R4HFA!dBG`^>`EjP-N~xjWsv4@L7dN1(u8OLmut!GSb5aADl~?i+ zGIbsFyjC5%y0A7QmjPc`Zp9D~b;hj8LNKBpa&h=vDVh8z$oc>lgnOaoyN94Ktb<0Kldm`Ym7uc2KtZ#(5j!?H*tj*|$qTm+jAmB0~qv+teo`12|= z5ear+lZ9GaD9n0=_yg`O_>IE46aybnxxTy`$E$CI{Y;ar2A5RJlVNob-VmB9OYg!>QB_J)2#V++^1Npl!X}7Dn&o{Te#(F zP0XGfNCFqrPJw zm^|c8nV&LOvM|tFk>ib>yg7de+wh~bAl>CcFy#4P5EyOfF&@)!(#kHmLla|YxxMj{ z2Wx>VFvc4w>$~3{Lg=1`dJn)lxdAz^Sboxp0?5?-c_b?D#g0vB!w1+e6JLEST*fUM zY5_iltL8{DXc=^3B2OoXe0?H;zR~>pZi;Ef?2_KE>MpHfIWwhVE=~iZAQWBQ~^oisLDgT=XeZ_%h)&C^7&X(FmI z&b$w1A5GM>ULyf+Q1D!}zgGEam$X(H{riMVN93{`iinPNsvi@_6tmb@FJ^RxQ#Kfa z<8mb{(Mof{`Y;m<6`LP?nkG+Qu0XA;;+V!xJPCnTD}SIkaxwct2^M!oN4r~dbtby2 z+{*GkLsi8XZ47dD5}t|5Oa+E&DLD%CmeOV|kPe+(rmfZ5+e-GnUdJQ3YMU`4I^+t- zrJ<80)i8HIAKEJr^rJ7S)R9bPi`M(-~#S1@e(h z19DxmYgo#LQFA{h0ia=KmSR?WJ63y?S!qOxpg}5$6Clit5NG5NG{ATzhf}1wMVtI_ zw@EF#_}^J-n=GFz|D_GXy&lxnZh0JvEg`U!Y_+)3k0Tlz(X^x$xQ57a6yob8Bsd_G z4oJZ+E#blNK(OGZTLA}0ayqm?K>{F}xiTk5fSUAtc=k-N(>F6V3k=_!Xb^LLOE!< zaz?!yKDj2%K^1P*9yI^otM;6W$pi$v$jKdC|gGm=t2V&CCJNOVVECloys{%uwgjY9!^o{L+?W4}(1W32xitPKE| zPe^q{UQmk#cCiAj1Sy}(G4~Oo$We@|%J#PS(RN~$K-7DVW)45^1Q^#x3;|_(T5nRL zl?0-rC0f;i$o(gjTZxrGY@}Gmw8%$Y%2K0%siU@KUimYjjAVE3?~sd$-}+r~3z?G~AoA3PGCrBile`o91bYpK6W$~C+E6>9%qN#RX98t?w>7&r8Xh^0L zA8o|YEK`M>MU^>`nj)Eu3_b_Yp1Bol`a@{XE|s{2S8LqEJ3Qp=OK=pSRBpD=CG`bk z$ri}4-0YDLGEBt&4Y}462xi^qXgKZ>ISnH&sYI9{-))hI=(&t5B5HFN+3WvqKW@@?ep2lcIVY9>`+XNWbCe3$#a>u1Ps&unphOl1{hu*zee!xzBsm@#djZuC zIAgf!0R(tMN&*Ld>2ar1)J~pkX;R-gXYM!40ne+!ctp#dYbU zJ|W5A{7L{k4&aCVN&H^|bhG7qwY)q_+md6tA#1soU%x}jNB~!0I%gFTJ8zK<5Ncxz zi^d=?2-+lhQ{m7`h|#b;${|#Vv1ya->nRuqNetFL1t0upw;pgWC7-7wtWr1V}GGeoh}4@i;X=yld zS#O7u=bUcHbF2IxlEcJW9tcC70@d|3Q4pFC?&0Ry%stybXbOHribhMT`OOqoh`)XN z+PbV@Sc6S1a#NA?)@NQk~wfYMi)J zGF4`XzZX(jndXH{f#a<0;{T$o3w&GkJTh{FV<9i4!Q9EDLPp7WFeL|0*$DSW*{u6O zq1(*n`2#`9xR#i^rNrlzU^lQzJ*h%wCrGM8hnkXvbEguJw92-Wk&g{V zUWh=iIYk2!@7X3m^15Wd6&mhK1rqw8ss<8VOip-1u0u3MqO%z`BVT?F9&6*mM+}cQ z8Xlk5N7XD`GD^#116pQuk=lnb1z*$WoMEEkI0%n$SmjtP%O55?4Y)%;hbf^9_r?`j zy}hofGw5LF5W0j&U-Qd9*MOs!D5B*_U1$hCaoD+GX+67N!0GSdy{x7v8%{|TTdOP$ zpir!MC(6>TkfM67=bS18Et?@LC#O!{YE zQTUlV)CjvJhnAHvfilQ+1X_;~E>l@4PSP(H;;lfo2A~3`G0NPULXg6(oyb7#oQn!d z%B%q?Yj10pvo*edJXJ|h_zUs;aI3E09KdCy$?swzVMpdC=!Sdys8}m?ls`P2Wio98dwAzoy!j9nXf0BcFW<&TgD>hePy#`sa78Ey zAx3&*Zu|gJY_Ui_!2|Z&L-as(amgvs1HVQO5>%65-N6*Tw(WaL9*i>xU3KC zQed*J4u4B7EA9`<4ZyjyKpBoO9eYw8g=TYkf*y)!p!(EK4P+-jnW%N#%jmr>UIrJ9+W?|$yoqO znpc9b3S~A)IXj`*pmPT}ld7}MAiknfburF3(Kr9IcOr^LB76f#6sV}HO>{B$0?7@v z$>p5c(cpA;nnvGa<`wnwqoiD~8KE-NQH*n5fJ!yf$LAbNjjp3*N5oI!B9{-ztAzyf zA46&uqeDIjKrW*B*uPtW6Am=J^6Xnrlycfs2d3=BLFeQVXS6&JVYsO`@_K6VBzwr0 z3TV%xSXr$B57ADwP)-}RsN`*~6fxI74-Fy(BQmO&t^TE))4_<95{j{?U+GmYKQT_S zXnz7a&P%FYqLKas4fPZ)A%v!W);elTbc%O-Tn)5B3sFL*rDalSUc%K3Phd(}XDt$$?9PlX7c!?4UUFvO*!Sa_4!!5rfQj?U0 zVM5jDXmG9_F}*Mt%}H}ospLHJ0;JN&b{=-mPF2nGkmea}gFs58XB(a4z|1D!R{E}ng_Z?ARnma%2Yw*zazTRjr^<2nW7D>!4-q7kGz%v@5ob*NZ;lW3#{ zn(V^Lg&-lP-6aXR#Oc+D1kzR3O2|yDy`~dCSSm}EbL^Ccn_7LAipga< zC(=9K{6US|l45;P{`%w>{Pkewt10T z^~Xf!!&X%M=%I?R`dBo_wpgbNQ6$qwck79{Xe(@EA>OhVq2NRE6jt0kOdGbz+)r%O z36hy`kifl*ES1#E1PE;^1w(l<$~=VgF!;}`mCP05&3wH>v()R zMy=T8m>7{?Mp?Xv@Fr!2=fDZ*thPnC7qtOL8ml8?z#)|UTk?y?hOOp%WmcILq9ZT<>7*dp{nrzk zw0^f81s$UnArwgJUgIa3sjrTem9W$~^&l*OJIC*!0a*vPH<9W{vft~q3`Ea^NpV}S z_LHY*=AwQAl+xl>6NNd?{GW{^m0d$$XYE@0=9Qhl(_@I$n{(`m9q4U z39Y@HU{&A2xE*`axcy(lv?u-MsnGT-8rhpJIa}*l4`JF?{AM-s)oE^oR_DX{Dh>;Z z(Reh~GQXKb&`juaU1^&IE&L2=CiV*{^iZ&_`LV(Yl4lfoUMA+yTTlx@f1w$V0|u_7JZ52k zs|8o1;5uoDd0s!Hy7Lg&%EpXuiMPmO$K>LO$5e9#)EraRE@x?sCVUiKE+y?6rJ8Y+ zjBy9WCppKDab;f}J2(;Eo5oPGeTUW@HMJx)XJev+2lR!@`$}lew-pDq$^-_TJL5_O)bf|b)UNP!7Ji@?%Or?!ddTAB%8zfpV^;W<>AtGp>wP?6@TCsQn?8am z2(BW&*`QT_W-hnKa76whKZ@*HLEh$PIF=G}Jxj`p95h-XOMf8cTQXmC*qncXVHw|^Q^Z#y<`gL3o*Co4ScAX|vT41jR&fLwb(Y8r_BaLFf_1WJDk?)@yS zHBdbMy-z;a%Ot0n4>2!oG*7LTn+RRO7uCfaddZb%hony(%@>2PR*w8E+}j#nji%95 zzTQGem0flajM|9V2d&GZ(ig!MP&4Qc!`dI>aybs7%|)%ZcFEl?`vn7`RG|3fy-%hK zUkDI*b4vSpxn`2~BD@)z%&*4SN~n6TM~kH^%-ZDYxhM+4em_7Djfz}WoJ}ATQ9rII)gRqq9~1DxJd^;QN68znpR3_;|#R5uRR0+ ze_HO&hs}?{&FWq%uWWJ&lg}DWC{J3;*gSEf=c=#IE+syOz3fdekIAy74fZ7>nrSte z^|G`GzY@9JrW9!$k+to3PnbN#2}sJ(_Vya`j-fbEvm40qF~T>n;qfZuScrU=CL?1V z@MTh_2BMsAnw|i2R%-E-+Jl*p37_i)tBV;M-M;5RBeb1`AfP^;bUyYDXFnqZi5CAi zb7$T#W?&8`D((=hb)_a?bLG4tJ^QWkuDfegmo|rKO8~CD=fZm^!Zb7eQB#3g64tvO zq_tc@!Hgc&QsCQP%%S@K7<==;D9dyGe`d1GBy1Bvm;lNUTqZ6sfJ>sHL)?Pv04@O+ zMqC=PYH(}RT7p&$+GW7D2A4Xx#%eXt#h|TDu(r`w4K8i4whp1K!S88LXzg)a>izp% z&pQ*)({s-6&sOrz``*vJT=#V^&!GwXhhpIA5zBN#c0u`c0D5-s71@glkdO}!{}A?D zI%fI18U8x3+U2UaLVp(s(j&Wmqn39rm8rHHNm$E>s}G=GXGos#k@hAGk1KfJm*7HE zNAR5OYW;p&qW0w`^_~UEUVAdzviy0t-ihxq^v`Fbl2*R1y`{Ae?Xy4KN3fwr#*Um9r&fontIO*^(i@sPM`USYGHbs0xgMO(N1!t3ki?45i| zhZ+ZW?qBtWnqBwREE!pBm30g_qEdZEuILRzJVaL=8aI-vQ#3=4us;%4^U+W<_Qcnt zb`20de2~@vWe832gyQ3jD9fJcWz1mvGleKW9vE(r2*lR*sa#!RQ@c=K#C51IS5uMg z-bt%%Pz2X0HG0etQlm-oFhVCs`c|ub*bE(A!gSe^1R2(U;#lnB7ar6+N_kXSh|m)d zImh3%gg}L-z-6~b>^xe!S%;tGqK7blRgTlGB(RM@GfV8#teT|`YH__P*Px0olgOnB zl%>@3%5?4GJ~?`9&GrXSie3gVAcJax{3QOoqSpWp*?!w&eQ%b3KuiedFT+~P7*2~Y zHQ*0k&tZSxMqt@_UB}>tuusr!9YKl!ZqC?FbuI=nABel}D92ZK4U9Wgc> ztNz`XP_wUbhfl{o-Isw0l^b4Xk(cq&af(uciN|sp492 zrQaUN*?`*3zQ)i5_H}BZ`BU=d0^T7H8PJy4GeaWL6UA z#Ks;_G(oC4y1NURF+UuVGe!=FQu1{jzDxNVH*?)CFVgDC!fVZZz>chE`B2zyu0h9k z=nBt*I4qoN#ff7mRBZ39wDq$_@*9D+K1|sil_K5wg&*EeMb=28iDk&av@wC!^a-a&`_|QnDP~ zeMIzV;kAk(!>+B zumN(Hq}L5v`g=fU<)|0!(S3rp+aI|cZCX4HsfthO7_fezt(xG#AG>-;pY@7fJHW>WUg+8_e4s8t_o^J*&>v z3QdT3!#X90NQZ@KwBoAlNfC0JknGZ-iD|V;di;-MZQ0{?7xO!va7&D{d_#=sv9!WDeQ2wTLN>!K8WXQLo4`2 zkGw`>$2*OUVZh&OiM7}wx0>a=-Vk>YD}wl)Fq+(Id=Z8!2>dCy#&E7d;` z7CKJv3r@bTw;B-vI1YunmQ^p6bHl15Nf|Yg_tKtF)e&@B;{|I8@Y~j5pRHh9DjO7? zz*c>n^D&$K+qH)4%eG(^0Ry7@bO6DF&<`2JavH4(ysX!1{ZYc6_prbuU?18s+0ppC zUVOl2ZC-`*E+8pc@uLz6jWHJ3w1tuyf&*_>sL_QHI5q1p<(?E`055xb4IsKO7258j zPWK5`SJ{u-|GLWm zJUcO!Hy`(r7}r_FZQSFI3@^~esmbNm>&X19ozZHgJA<>H`pRsa?75n6mXRDeK=gjx z4R*QwZ$gd(Zs#KzNCIrk0Yi?b#kZynja}>bL!b4EmCZPvq1v86_LSM9VIFk6uN$ZY z4AG1V`I*N)GQ0`Hy#6txdB;uOD*lJLhpV1wkVa}qtJF>n+Zi=>YMcNNEIPV-TkHYm z+LP8T0=to4N))nXtgWzjN|2nDTrFR4b%D=luBYL-=;+3Hj_yna@}i@o$(K&~8k^5n z8w>5`=Wxl?vb>JpGXr*im&3X%U5ILJw2qWj$Lxo~xxa(1Yjaa1qcKc&f;g&2Iob%u z@g~)h4drK#1jdLO{Pp67FJ>ISE}p-^x;8s2cl}@d39gY((0A)lPjdVEg}p zrfDhmnb>90A45AxJqNa;DRqv}jGfsvY9?Dmy5GbOKnr5U$(mv}&`X zJ!h$Hs}h0aSrR&m13AY0fh?SA3=N_+VsHh=QxfXbf}iv4>{<5xNoq5|{cWT#O7M08 z?oY^{9+O_2g>!(P6xg1l01u;e|LguaRKMQmQ0xdhe4x;a^f5TC2Emndta+@j1>|5VV3Z4t&?>Hrb6IBZM2y!8-Xs>Roqqxk+YA;uNoZ_5dK{{zgE;iVj$Dvzw; zFOfs>R4Oc!S#h%BtD%iW4&~h z^LN0q8*Xo8I`+3zLyA_| znX!61`wL0_X>?j^HVzoUTb~oKH{0!UN8t*0!b;fsA$ufePxraQ%M!(1J4+>ls1A1a zrL83mXWr7RL?jD=KP_)(`|R8}7zParK$`Zr6;=(CptJbImCvv#Zq#klz{ZRgJaxr^ zc5Bd3!)tlP;EgRi_vC!x5c2y-(P5Qae71S+s7LYP6kzs3gLXtFuUxV1r zfXf-OS?z5twq(0?CbVqA6=5#2X|N9G+0-~Mmm07OdTdl%6O=Qr9OYOmton6AX=#gU zEn}^`G3V8Sug2{DOjle>vct{`w8ZT6sBX4bPIV+;qYfdRoU>D$iqrI0=bG+Ea(d)q zYl!ula}KK-)t;6p_F0f;l#)Mx!@h>`0N;oO@G^DPjfi8bMSC`EU!_v{p~X@;sI;OA zcOfTqEctsSp#qK99*MpCt$g{yw;2BY_9>K2R8gIv+f0eYZ!xQgcqaz!~lXt|0~ z^#!l&98ovG;sCtz=c=257%$!i2k*1J1~Th5Hm?a;1x+%zpt<)5dmxS+-+qq=zLrih zB5|FK$ocx)B$ryBUEfJHxqTT?hi03X2;E+7Q^DmdasXcld4y~f!F$E;(2JFLl!P4? zwIRvkngSNJvSfr%75!Z7ULKFAYd{M*YAH3%?AOF`w$)29HxvprO1CRrrRGx+p{Om_ z16IN308n?)pb-@N=3W%iMXNV==RyBlHO49ncq0KDjhw`9O~fTq zw}We1xCQIlU^@l~uh-iHcZ(nwwR@|T=O^zUjo1{w&Ai91yODSy#5ediZy0=us41#x110 zG>vT9D=-52EcDrFUDoWg73sP!Y&Z(@1!I*FO!f)lh~a9BsA@UgY;_ z?3<}#)v`%dOK(#Z+4C_QbadNSke57Z-<}UV0(; zOSQGydIx2@gk*V>g)C3*w~GjdCwQh1)?30tMpP7t?kWnjq9D38!BwP+Nt#G34c}Y_2oiSd z10T2!&IA79rZ(myx8;Akm)MxB+;pY+Bv&~s5cZkD|>ma0j~G*ZZym=`W|jNl^20xf?aMrv+n z#_QnRn$XyhnvMR4>K$7gz}ltGacr>*xCK=Q!dt9v^<5(S>7;mPc44gDWwdDUIUX@} z5p%=suHZ{d7CyL`BmD?{`dZG$^ffJuWXSP6R%$nR5GRQVldKJKAT42CoqFK_z}K4E z1P#~);wV=S9aP(E&mh%Z_#jZk2eF-H^rGY3zK9SK03TlET`M`H>`@wq0a}OUN$)B_ zZ0gw>YZnJ>Qm+jm<$F{y58LJ@Ys%XDb#{G*{Z9XxHkgmXey38E9=UGsjJ&1j&+0=> z#@d$zAp`asue8l`#%GDKaO@d+J-U`PcL_fNeFSQK_%{&4SO_^H2bGUhe*dxbR^HFL zxgdlG%Aepjz%ZeeM*|dsT4Npz?iYZ|*pL5?dvctd9}+rvxE^(Z5BC({;604iEEd`C z_KF;#OK!Pd0Q$Vky75%rkeHS9%1A8SjS2OJwRp$1NOrMLXBG@MSM0R`?t2RE((7n^fd%E78HXL3o7y8_0^gy`te2^%MbXbY605#c0AxLui5RDvy zObL4NHuGI%N{d&Mo#0_@$9Q@TW1>T%i{}scHrsKJ zTuLnCkKnFn)mps3W*v$ym!(Y|V}RU}P@U5LbF@;vOGT}g0h$6%bNd6%Mel61u*w3E zcb~o3Ny@Z`9Zw(TRSAJ}xyJKt3T;l*QKkYjQV=2(P&1S$)U#6>j{&>~)SEkoF)eLU zDQ|&wpx40-LR`42W<|CenS|``nxVgJTGF2EaxEWepAPC^9|S~&cKS5rn$AZ*`K1gM zD?!eY?3?@6r^Q~2Vyvh)9ugrFEx`*y! zyJARr7ukh_p~=BQoT`}q!=O-@^EO&z42jJ^H1vT5c=sR{_*Y{MMJTM$NmN zBoE79doH%2Fx&IL#eJ=>hAF6)X7l0x{6-Pywuo>_aR0=GaXEWNMZBwRLmhp`JGPN&O5c@d#?$;Bq06}5 zpjXqIgJ8X*y%0pw&3RPutj#ZPXKm4=vvojR0UQW9GUX4pX$w}=YA<$^QueY*wB#|5 z^*gVM9tF&QGL!n~iiC2eG=wB%FxQ*)lBjQL(TubD|D{u3>ye#ypdi&7*ZfH323PMm z!usP}s(@R=EB*+R`4;b*vMarTh0T0DU?`Nsa6Yn4?mCuNyG1Mg3(%b@7)_iP(&~d? zp1<$Xs93=94>MNgwH|dQ!njxih<7>$BIDmWOz)!|hyoMISLMViuSdslxVnJ+v{_0vg}b69>R>LYy7ja7r(t4(-|qbXB18bJ}u}8i=&&kkS!i zyc!EbO>T3d>L@-WYcmEgYzV0U! zFSmx6%_AFEU*Og#G4wXSeS_;b=!}u&L@+btiM0Cd)PR+jaQBE7A;dMwV z&?kf9gb=!avs)GUEYR?dh11Swk1kyty)ew>a>v()bdk6zoHg{f+? zZhmn{4whoETJ`7HWGcbVZX`uq?2+58gPRokiCr()+_X1Vcmi1lAv6U8;;|B)nc-cL zbLYFJeGQ6@>?BZlf?3JGyagHW0&!TGhey`g8TEE@18)PLwFS0Q3*yf2qkRM21CSla zv5r*>#^H#%tQ~Bj-t;_-buVPO8!Eh*$nSP%Oe9xN^`Pz-4rqp-kfTA&+cevoA-xBY zj9I7h(q3*KU?Og3x>kXncGix0K=;}jrs78C<$yuE#JCS>iVWICIs3atd+#8AWp<5B zX|`@ptYRWT39*s;NoF&&jQJI7Xt#RMxMC7Vn`yT1BxxHg?*F1kJ5dHdOcS}WbW{TnYDm(xtModweNHAN%P@Mjb)(V{Et$_`phMyZ1)sOHi=VEe0J z0w>u$%}8ttaXn#=dp_tC%D%Y7(-`3PHjpn^-=R$-Wkm;cq;t;R>K?YQr1+L8)EzEe zSTEGkkg)S(3Q%8Bc`<-h43``(YO(!V?3$zL(!6^HvZMT ztwJz8_H$StqEcwp0q<~+nT^HOsJ#}hbx$^!4sKi1YDWS%PT-X+r$DlouiH!FQ06~Kj5zSVZs61ZD6%8F9Ch3BtCO!5q^9MUT7 zF(HWb5ad2>YO(*+;l?^GN{cAg;w|aw^l@|}`s_^Y=!&-JXb<_wCEeG-b>Ji!wjxj?9TOA3TzENwaKz>gRne^T&{!lMwe)&%y|L!a+LpZg!VPIGUXIqxUfOQ z1P5Fk{2$$mm-YLgB>-h4F&O;NpjGCP&R@y+j;XT;A_!3;B7gzMdY-{yc}oHnV)Cxr z!uOd?9dGSIWhGg3Xrh(&4>bit9a>hkw~9(Pxgc}+0B<@Mhq<2tjXA^9u`S1tdh3lGKfwbv|V2V9b17#4fj>=8A^BQN{M^Y z63EN;aM+u5QcacygS~7_vkk?CJs@?RGx#Ms|2V|~f=Cpy&F{)Mc!P(mbQN}1xV~xm zEbo3eqU}^}Ky%UdNDJZggNs|r@J*Ulc~YrS#apZ37>*aqjhRN~Y-IU2)G*Db>0?0;kjLX$C`Nmh zTV5VWVEEOvK^2-U;(VhVm1}LP7i#N8U{` z_PN_U5{}IaJJXrSKHaUHhoh+qhT}~kc-#LTQBHfMxb1~Ch- zo>AqkrovwZ;+m|y3_BJ;YqU*yJ2X$}cMER^KD!C*QLvzWt9(6g(<-P@B5$hHE5~+_ zHJ8h|G!Oww$?q2TyH?*1RP?*dDa>i=Q~FO=1z9Y?Q1#=D|D%`YqzYRK)j2X@ckFIM zg|*zf&kMEzlZNkR*bDC{E5fUkGFj6^kw^sIBGvxrxUlb~)ybPgb#CNdIP`ODai0ib z?L#`2g4)vkywaNYIoO03RS7Hk%BJ8?vk=1pmxCa1ZFLiIRQ=W07LY8fDFGnV{N zIO%IFR6>=5k~pk#RWr~BWIRyr1|Af$y?qvJ4^o!y_;q>JmM&bVt$@Jh}_3O^x*3iz_B6)+C>|%tuqhvtmrS_M zqngjm)v0&s19=wPGMI8Zd+MAy?J5@`iTjpY<#zaSl@wVQS?%zKmY6&|1m+OIfs-Ca zWgpng!X=dZTlr=b=Ne?>vYfr~jh5fxMWVkX)R-+(nhTJpzL&Fw6wxeUr)Jfp)221~ zW!jY}Af{n6Y-tWcAGzr!uw98wP1^*b#=Lk=d)>Ek{0TT{US%acn=Dg`yF>>GeTR^% zsm6!c7Xkfg%RpGUaG@X3ONB#rLn9&@D)ektfZ`8$1Q8vC+OSq18ATA$uRZWe$D8@_ zIlJ}4u(A>IW3#GTZs5YZEv?(0?f1p8t@C-^TaeW-rN+%C?!wM`YplmP;eEcUNy5LO ze8rm=Z5l>zm+wewz98>yINJHS33gXZ@H%4%*{G2AR7JW~R-0&5jqLCOv3e8BK6S+a z8W7Y4K6E@MWMPpe*iAw#x5UWC9EZ&>Dml~@Zxgmz6SF%mD{R#Y6=1Ig*!*r4OK|XapH3i# zL|NL5t$5wwHwA1%yK{+*qws6z^686O?XsLTH%VDO24iHBmxQW7!E01*P)`cpHsBnN zxtXE>x(OV@=3YCAm0iLPd_PiG^zeg4z()=BiCls#I=A;GtXjb-(Smbr<|S zrnsN>9c}2TY_PkjPwxvCtggwzy-K6)v0h%)q2I+cJ9_e<-6o1QRM}iCHbxcrF{ERFb~PS-PwVwh_?MTvFoh{Ssm2a; z?iV@RmnfC+hILY&OZFg6l4n;7`(k`0Zk%v#hkd<@-u6;b|5>8m@Hn4%9w$TgCxXWz zKJQ|MI8mI-2KbRm;R~Kdr9@1E_WKOy%SHIdzCze@E7`w>Ke>QAv30o;YB^%apSww= z1V4HIL_5Ac$1Q3+Yo%SD?ehZH0+`&MV0Sek=9nbBxhG^ zn=cDW*FxQ=cvf-h>m*zcdnQ|1_sua}Yr#~beZ7Xryow~r=pVM!no&yTuK~^>$ek0!pJLAHz8XwI22fa?NH^hg>q|Bi7Ly^HNNi&;%Q5P4Z(| z(x~sy7E_H8sJw6-cP60a!Fr2Mt73|;cB$VMV@V*GgAlrRA_xM0yJ++$?4qrZ zC?xr*SZ%1^HDo8DPjr)2?dyE_^9W#_hiU?7#>gsP-#`fOvhnVi@0Z{5**A_ul;Taw zU8>1otYb_9;n2nvc4+tY9n_Q;*1utgGu30I z^>$m~8fi)(uC_ZT50hOnRM3w0K!2Czc$2860(+Z)I{nPFW$?j$_HNxmR*y?M7CRAx z3*t4%u%oTLYJ&MNZ%3&67XPCA<3C6spfjlw7VaPKj&y`~;~-)V_#Nc#kp9dj)!ODl zmW`$nqlbatbUFno(|`f2KCF!hnnEg5_+^hIHk6X+M&~%^qXdtuvO}%-iBsC!$QB1| zdP2*4B)%dBxdyw;UOJEf2TR{mL6hQ4SJ= z2@m{2p|5IJ@_9Q+xz}0skR4ZVKWgAdN~RG|F1ED=&z#S7*kW~kD{i&BR+5^kT_X_v zlnb+%n788!wQ@1*xLjD42wOqAIU0JxHM0}7H2+Tdbgq?WUbfqd#nV#>A?|*~g~;(Q zg)o1IY93(8k30DaNUm3S$dnY*j07~gV#jB}(rDjkXv3na1_BD+=j z=lj%rW`?_c2yD7SSaVf{ZbrIL%YE@bFZa6{nFp9{YPHjwtrTdQ3WnA_bwwB~NRE{W zfK607dXC^E2~ukr7qv1Y;UseEQt zYb?OdD->pxyKMVdO!RQoM88pEM|APh!{x+UJkg?ls|Vij8Rd%!;hU9uyC9B%t+PEN zu>QpFG|y&QflXdRd6r($4fb7Y*Pw&5FQQS#muaf#Vaa-3%xs481eUUT9nlOy`sVN0 zYGLXaX^O>-gNG9u9b+>^jLjyOYkp~fJ}2s*$id}NqjDg{Gkddfr3O1NnMXYf`rr0J z4^w)Fawv|r$-ABNRasts3ViKcW#6t({EtXsTwKh}H*3g#%IwJ@mm>7p5d*e>pQ6A@ z?Ajt(WN3B6zT|I4vqd@Vqm)V@LjMuS;aUkj-~JSH-Kz37X%EkMH-v@xh216!PCB2! zil;!S#OX}-*djqKoR7FpC5`;$-k(%5#Z zxP3csHD#W+fpL-|_LUoWTZOJ~)d2QJlAM^Rb=Y6Xuj1nI zR+TGTi#+bTY%XPNg4SjQEkbq)7O2diUPe>?!h<*46>#1=cVz*^+E8*^ch076%WTWE zLVaVQ?EmpqOPbJ#DfaCEBxDF@ILb0DoR!8GO6d!%uy5q(0&Lgi z+AUnoR6!+SzJ02($5tEPYX+yOENzTUW;@~5$yyuU~VIx)c4p5^RKs)w2Ek)-MrW}Au65w`krfvDAXc)a4~Cc zJXq(dMac6x8`h?%`_hXdBW&u}j3sVvzr>~_X507^U*-yUe&uzBC>i^^{&SVV!}I7? zsXbsJIiEG^t12h{C}r-*5mhLtWbK-q-H>TqMl0`&#dMi2MJ%F<^VC3Y7iBRSg}1@= zInJ8vvU#rtG9g}aY716@6o0&cGU_nQf91aAR!iK1#+(J3R_x`_Rc(A^ND$^qS|r~3 zk%q?J)9Uztj0N%er;&wTVx79{Gi0QP^m|4O~k&MwM}*QeIb$g z_KCXGN?nO1ZF$(JbPg!&?Q>mG|0pTl=#Kd$+JUGY($UjbEkP zwlXZU8OYvNRQBKso3te2VbSINa7bRNd#6T6X*E?TPf?I^_lMx%pye@W1;SRV{84Hl zo)1~*phsgAI^H;=aD6aKv^ze@_bsxWG36-UrQikMw;;+Pf6npQ*l37$Y;Qs4TuLDR z_ExCv(C&^e!fm-DpZ(QhicY7}gVn$+cfjAti`~bXjxL+p!Pnm<-I;)a)HES%q7N%F zrw!Qe61EA4S5>%6p-nLjBMh+r$*H{`Mwry@Ay43n2J39U(ODel@~`6b?TqBvj;P*IXLLPM-M(?#ecwLghb1L|BTh0L8Uz zK$XEtdIdw5ScgK1aPO<%(3`KyS`=JAp0dW zC0aMwWZ$bnQ7di3kXn$*XnP{isue7rbx7hI=#rd65|bRwXtB9A4WGiAAqcJnN(HtI z+xEOo&hy^y5x|efrj+-`5m*K1NiPAyWIN(ZT(3ZJ0q~uB|l`V-(V1Yo~4!7DqHKquy zzGmh1c2^OaCw+WVxvDCl1zYa1OdSPiP8`E2vF)>!jOrtMvFTEH+aJ~;(JX)Ept<^K zPZSOO3dfS?5olcfzw&DHok?5#m+XkJ?QBPaH+!Myrvw10T-?iN3L6=saXJmQq2^St zYYBnwV!E$$9FMk86mj|ng)$=TEh1QzwmJTA3Pe{b=B^+ ziq+*Z#SzbDFW2+gW9)R+)h}9pTf z1GX2%@|?|Cylg6>`n|l6$IAL6I5Gmbsv*gAtIt{D5U%<|Qn|Y@#lyWel_L?0kG!NQ zL_pScF5;5PPX_b^9YCD`*-7CBzKs#)ZhX%^Rsw$%I?&UmpX#QYdnZAln|~@@AsbOA zj&n)Zpp|vtH%8ZQk8@b86fUbv3kG`)v#qQKQ|ho%2C*LKn=~Aqk9noGYNI z%x9MS?DAgK&kD@sYBXa4_&e?>e$@ytolhvA)#B)=I0>)F$8P}Ta~#~lCbj8lEfBY6 z$2!BC9Sud96+rXIZ@9a2XH<1>SAkuul9qTkGDc5rR;dKi*T57eDR4J@)%QpymZbTe znjGR`KY}dpW`$o@Qk&pSfg&Y$4;v>>-!1~mZX=00b(@WSK%o=~Q8r5S>LRi+?4cs3 z#p+X5F+bsUZhHIRHiU#&gyHY0;g=bHcVYtCeFwt=!wRi=ig=D(?#mbvBG1DG2dl>(7L`Ji@yHMTWSvi%-#|)qlcMTWpDGZ;9BHr7Z^+@g4|L1Kdtu8}$mBm>Dd}rX9 zwiV4b@_L-nJ!^?(f5Iz&%gUANp{>zg`;_fj&b!!~@Z#bWr)a(AEP`1gl4t?XRgo%^ z#)k2_|3vnmMEMp5-PEgpXcdm|aJqVDQ=xA~O@7E%x=V17Y7Hag;p}dEPGVU04iy!N z@CT2wqZQ#xTJ38niYoxkmy2ZTrq0_Ic#)d+$27pRmrX+g*SVJc8|9#36k2U(Z_1O# zlmFMcKq!+?Q9mGD0=lAAts>|M`!(caXkkD-Ao7&sND8v^uUwPIL_~y zueR9qoKfi^;J<9YR+2}ySOxlD!>4nt1zFyZB*au@-nQar?jT3l#}4+AJldk8&#ydM z%1|~*ep)-pjv`czL=---c6kfn_jugMQV;x=06qkM7rO7pzbAXMy5LrnJ)F`$bp%{M3?Pc3q`s~^6 zV6Cl5abo56Ut#i|5!Tvg|EL>I^DKCtdbmcKESj0yT>nmzv9q_>zU>?Ag@3HUR2>lS}w+@1G%_()~9lepWO8a>HJ8Lb}!e!XpH*v1NyUS9o zG*oyT`~B+i97PftaBeY;N&OQ+2JK?*o6jvjA11XxHS^kn_+#u;jZuX~_$Ud&;=jBm zFXdqOTtcG(A2cJeyA?R>*7j*kQGEfwv4apr7!b^__0d#HgTdpxf~(bBGWhu#`gwLr zy}i>w6a~C3g<80mQ`gnEe4iIe|LCm*+o?_zUH|p(R)R%})$^@D6dzucwtASs%1g3I z+Y2f~!EkMu59|OfAiKAF!MT=!fwH#4P~-y6xS@_LdI#GgaD;!z3ui=m5{|GigVz=A zw{yJvfL*QcU^N%aq}DgiZG@~N!8Jdz>Q-nUyg+kych<+oMo^d8x(k?vtGc;G=6rdJ zJ&eBw)FK#ipFlL^SReXj>$Ua+knw(vTS+B``9#cN5LoC*hBDoAUcPe~-iS=M#pXEm zsM}^&tnXk0HV08)On>TTPWH3CVyjy(wegEZ4Nj0$U`tu*#W#fNZG91yEdZ6VO2bE@ zSPI5-InV>HCGZ$5NRaF&1ZINB%RWT)OO97io78@zmADb7wGKQaP_sS-I7TtKn-o|! z8-8!DeNe{+!<=v}t$e%R7>>Y(I|GTaVegWlBfTysLad#-cuRMy{k*+c_$v(Vh)Q%~ zJ678_ek-!+Qj!9Pw?)QT^#7HTB?i zT|X4Cp>_(D zTG|`chcIQsJVfdBA+(WzM;h!uz_`!xj`yK|O=MMo6)xcFO}TcB5eeJqdEje7Qz9QO zwMedA(=ykrZ^T)*@om&KN{d(*g++t}9(TWEi_J|TLz~b^A8Mhpfgb~$Au23GS3Hi= zvIAm~Hnz^ecU`~}=etg^@G|QASy0_>9WHd6#jX?I=vI=c8DT|NKIB7yf5UEoD?8CR zmrq4?0JL9F-U#6gb}622S&DP$r4p3eW<<*k&_%-?k9M?Rs_Sv7v;j@p{y5ux*V$S1 zwx$6efCu}8|I&$|Sj9g`PF`(e#7Rv}*pECzb-934Y=XknmqObzaQLitu@XQ+)Gak! zq{W$FHF$#!Hga8anuSWbqa%7A=(IhCD5r#kaABJ#QMQ|Aa*0DLVoz*Q6GHw`d_mvUsfqrpgNaVpNtV zj<>yCDo%?;Y49ob`ktu*>S>OIQzO`Yhv61`|h1Aan8 z^ztDpZ2RPeb$Mc2%(A3UTqqax*;#E63xQPJE=;MweA@}11-XIOM&(7=^1qK||5_lg za_hlt9^}h4g4o8_EoFsZgN>kVP9J+M(bAS&VL9*=exkrG_`}eDw&LozATQ?19VA)R>pIsOEHz zc2{h^JwZjds#p=$)oN}OBNr0-;=?nljZal~oBZI%HFl6Xiz(O9_*X?!yzNtLi99VH zcG+Ca%A&}lw8I{&>Eci}YKeP)8?yTs2f$_UxjuD6ew$g5D2iQ3=Rz^8vlKyxLsVs2 zu@>UZVN`)nQJ3`q%7*3tBLRF2r*uu01tD1<6 zx;Go&XUEjreGS+SS`)JL_S!m<4#_!`SY?V#DhpH(TItJuF2h;pL>J^iw+zV&iqIxB>DLU+k5fJCV*wjJk9&nE zwcL&9ZtU+=0}3~?T2*UK*|4Dg&s5He*j?MTzU}Ak0t&ATx{J@$s#OgU%6)G288GT} z5S@)$zaiFwMU~Ld+(-ZyS*J2jXwtKn)hX3I5_N{9^$BbWje-)D86Z@Gs&IC|~wE z*ZeKk3e4Z{E>Qk4NLbf3%5nTqqrf9A=EVX!A^72+p$?Y&iWm@LL8XZRDb7W95etyg zB!$XwnxB;W_#sQCt9k4zRHtUt!CxvESg1PbzXVM_?zRU0g4LBH)PtuCZaV&nT2e_X zR6OG~zLaaKxkfReZ~@qH1YYHFDclBzF?PtFRw8$;nnlXVZYOGq<^9bAwx<^&i3F~} z1~(xxXjHBTCK?&E4bWd>rCuI~0~2ZOgE4H<;f}Q@XJ6{3y0rY{jtHL`Ugby2N6=rd zMJoKV?xOgJgp^$6V>>oylW8k z*~+gOmzzVIid^dJ72C#$}Q9cmHeK?-0)$1x-?X#=tLF7kE zQ}z@i7p~=F71mN_r?B>h);)kUs? zA)9G4*n!t%t_&L@MfVvK`nY^-lg@$$^6On^=~9fPUWT5;>FH$8@=kU+ z?@@`*E1}lH*^U4Me#N0{Xs9bagy@u;Eq|&T=wP$9XtSLG^a)!z!GUT72|BV3(17UT zd*XDW1}6IyUn#gGJ?{#zezlTBP!X~{M~nQ&Y6*V^_zZp3!s)dYMyu4wt8DgJt;*@5 z2CX3J$Ft3Nm);%H*|VUd_fo-rXAIF_&)+d+k#xJ|!^8&f;%~>YAMeP%#ZmL`1QWWv z7O?Th$KvE7FY?BY@GErkmdG#P#kQPXn6vrc%@RECCwSrsGKBzuYE34+Ks%5UsQb#iJ(bUNP-*`K`aidh zOakT$3Wv53RW3ti{BO9dNUhbmn+-0_5QZ@Q<7`OUvDv}FkA-)B<5a|DtvNpK7K>(W zOovVEA`1LQXp>AJ4Prs?j?&`9&b@oJB?r=6r zkR!`VP&i3y2bpT8lhhW~67A$&aRFM3a2b3+qjoxf(1DVu4CB&!R%{UhyDYG)llR~# z7H|P+0~oN@?r|(%R$U~wqVOvGL8Q7K5hDA<2jw|H%Zw>dt zF9jcuj{f(%eoMoJ1fL9tsCOuyk)qwEHY;nf+BPYO^C2g3cXO->OHvW94hlt2L zss4^*yDt3agK9Nqv7|kTCz9Q$2wno&RwEC66&!}fBgl|gV4-xvjUI(^8;ZP3wGm5e&<(MnH`|Sc~%2~0b8#2j?2O_&H zrs5=*1)K>FL}|0ejhI9~*ZUJ0?)_maY`x_g>`&TxFjjoQl!7d#=8#(nvgojHHj>qh zvrA$moSJJ*;pyJr)dlfIyu`|@`N%{-6v(+Xr}(%xudmA@=^rIegL%U$i5!h0;)&A6`qvRCJeEqnaPk`G&Oq79TcjyZt6N#?PTf-6P#ZmK9}&hY?IrnEh?_%DSX@db z2@~Rc3OL!3Hu%**y97}ChkSKEwtSoBB0dnlYQvpW@iku4An+A9a)EF>m!Oa}uGV71jxqXHj$@19bgIY2|m>&u1(kmx4FlynMPy<=xMVCRIiS#&w&teum`@a zjhq)s_2C@WZj=2n2s&TP44wbJs4b%M-3YJY8OtWOe47TnVlw|Hqi3?;KFHZUYL>e! zBCL{3*sM`NDLSt7n}wZ7qR&L zK}RUhq*(h*`SUA}fC)OUf;yFE_(}%oIZL@#Iful500QH|Gr&M$d$BJ=q?p#;>!k67 zbY*8DrDq96cP>Vf5hI=1y~VpEJc!{`aHbe3)5>eC?0Wo0_jgjfi}owrl;fp6$o9-w zF;=sqb_1eg0UYmpOI9l|@6JeLR#-nl75t4DD1EQ7nURdr&?$(4L&Itg{xsj;2d4fj znmaez>coCJ8lw&p050@hG$z_O>J5y*ahBAEQJFceohHy~Guthg9xCWdMARKC>Yu&m zMG|%HM^DQvu&0Hf_rm??8r5VMd@t5iZ7KTykMVd;EY)T4V(|78Bt5W4P?iHf2*?uO z*~XnNU-4-~zaq{e^0vlxOZceU_u zyxpUbHAiWDbNAhs5v}`!(8$tW<;7j+RF#S!=MYI*=lTt-l;B6%=A%Ts&*kCVyo03x z!^8G7L@|nw8J>uE3F=}H>2BRS$7ZlE+v5ugD~|X$;tJ$3nli*o_NDteC6Ad;B9A!; z^I}Ulmx4fULLhbWDQF0xrGp6ULd%sGIgEBvt=;Q*iUX0serbNKY?nK!^EjSYwf}IR z23v_Useu4n@8=|b?&Ea!>tNi!jSkOj0;wGOnVm`t8l4S)>MjzR=eOJF7NodmE@T%V zn;hg*hcG>_UN%T&;=m-vaJO4}G%}vv)M-^fH)Vh}rA6#!qN%VJ@s3thGpK^q&$WGE zlz0yiLSld5OG+E&dt4lUg3R(7JT^6`_DgLuQ+ zkblVE%e^=@ie{^F|BBML9=!-}4Q={xrDMf)oArxs7sGr{1Z?nB-nX{kWD8q$56WXe zy47G#45*V*t;Q^rbRb;@Z`>_yY=N!u?9!)CRg<}D3`y9iRG%#KgM zU9f{8qD`WY#K4nDoJzku-e9u(r|sR zi$P5TyyN8I;re{8)u?G_vA#cwC9bw-+W8CxscRV8^!w#LS?i(xntUxips8?u`LZhcMK$nryw zNSi`XoR+^B^umO^_`Wo-r?Z7ctM9OYIgeDo#637Ca>;^s*>&x;pHQMo0 zL@v{`OO4cJ-blM$$zULh6D=*?GdAeVW_nulM5k${b6f+*MHJdhn7tn&QCZ0WHmwzs zriR3Dvi)@s?}v|h!IEtdk?O`f3I=X8bG?O)HNmXKGAL4F8{;9vM)WQ#zf}?+$(*!} zYT?PHygT3yS)ClWL!2SihV1;hW?0yLy;B_y=G8UnrS2iH%6Y9^8)Fr;_B! z-bSREF-~v_tiCcsl$I9$&us49_~SkpggfbDJO+#>q_j8U;^JuT%Ayug$cTh>kHgCx zJZraWjN$TXnDF%X+be^%H(0Z*gqoD*0!qhjzu{F{?`Rl$&?(i8+R8WAbqrmEh4G#< z(S)DDJe*h;Wa3cW|=QJtXOr%WPjF9i7Vkpz6N^#aLv zaK<$$>&$WW1bX)}9eac)Jd@{^9A8zh2rd9b`$eyWdD$<;#+*U~I*FZ^tr0|d9-`zs znJ8XB9V6bdyTe9>%W1Oa4b%;~7NVn!;w5{uJ(_C6d=D|#d2?AmvqkkbxxrQw;%3sA z_aH&v6)%?)>YC-NemcxiEhN!*>kDcnv}6x9DUVI9t~72XQCGcOtHx>)Nhw=kU4eq2 zc)76H&bTy#I+ZHy|DuMWr;!}iaNPfk=(J#}$==T4wK8ZB(#c3VA|v+J*5eW3cE?kN zT-;}il#1(rLcPDi>o4_Yi6=U{1mu9IBU~ij?4y!-B@+hu&urgX&l*dzMqW~;oXNlI zs^b#33#1a)E)cYa)J7v&4g|4EDv7r}3KupCVz?AL7)!rSO&jFuOU+Ti)gu!up3XS^ zI@A=~Y!2~0Yx`ww6ibG;i+nCEjn-5SSL2s6e%$5K=|?~V?I;X7Wl3UugdQ8gV%tVm`}XCQJS4(uE|iOxoqbb95& z_J(6xr;<*(YdGp(@A>qd|GgibbOs7IM8wy8b(fDewJ;ti#BR?Oy}V_hkqyj+tGI~s zQ(!W~_RAVHQCAZ?-BC}zFyn^^?e{qwsjH13jUTI97rM#68S;Go#dp=_QywL*Zh+bx#p&#bIL_TG;Pt2k;?Tce#2`Yhj4NXO*t19A5L-s%Ac&cd!XV?s~9rgI~`0az1gX zl{3uH%j%$oQ!^dtySY|cfw)q#e6Ye7%Db4YA5`J6x2nOC;IK0yuIcMC#z^& z*w+sFVr%2{g3}$3b>8=^FT(SJR|g;cQVl~uOTD7WYU=1Jnk-PPnmB~(xXhT_wjXz9 zI_<&?A$gL`Z4TIVN!yR2$>!m07I8vG5Y7~F#WstTz>k#UN+<+_k658YS7Y)_AWwvU zb`0+=Uf?Cx=Vu8Vm3FUkmZ|ntsyi*Z3j7;MD*p4^tmZe&>l+uKN5X&;il*Q!=3X_T zOv@HUu)Xr2x?{Q$A^Qahh<_~Azb;L0+}~f^oIh54$>>5C#Bp{L3Q%SYFwg}-)hl=d zqZtQz`|*zss_8+dqT$i!_yy8#XFxBr!W#kCcH_f3o9wJKu7>>{Ei9#Kr%v}8c8>F_ z!`tv!)Ga2=J|!wn$@&7l{D-y`^s-d90JmGkf`4E`oS84#%KJEU7Tw*LA^qaEEEEZ& zuz?fprrO>tbUBYa#zrpg0gh^(m+%qVi8!M*EVw*S8~(L`vTyfS+pRf!NZat=07xW~UXsk4S0bV?pI*)TC#ePF z(eloue+w*|ZbO8VhC2DNsmVcemz*#7!Y(9Q^3D#V0U&~P{U!h#-HVPVGjwqGWsurtMoqU8gytpnK z1_khWPv9B9!(AFvMB^@#9I1|(S3ae8HeaA{?XxaI?l%i7U5*$0cU{g&xdZCQe(5qe z;|wfMUg6}vv>2z5P4CU}tLMQx1wYTmLB!?Sxv!R7Syk4;HADVdaz#42 zxw!-ze@bG_d4O&Y)+~KyNB9ZL=;%-yVK7VGWq(Duht%N+6W|omaQm>4_hk>hmDZ{6 zB)cmr7qxV1p>xNtWOPr4*t(-u<#p}=R=(IH`U|VAw;2su&`ETF#lIZ7PInKgG^=it zPXv44_4;;pif$sy%Kp2)9e+G_{@d`JR3cF{+aE`Y%AAm~scD;#K!PM7Q7e7jpG6`; zU3apjsI(~JoUiMSl^*hyNQBxb%hTmC-SrJJPkcd z4Pl59OCL`ig}0|#`i#&1-1_pf<-fYEnvx&Zd7k_7j{|_p1DtJ&!pbY{X~#CptaY3B z+5380!e=`zN&QHNW;w0T?7<8s8?%x~5*8dBx9i@vFb2inha!||xplU=aOteN zlj!IvF|r@;(%CZa=C)0I*lsts!G!K#1Kp-e4|H`~9j|pt9_phKaVfJ5+iz(x%NE)& z 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%0AGr50n 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 UG;`rb43+_++g8Se2Z^eIy{}%sA{P%cE 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%0D$1Ccn}7Pa$sw$rgv^f5FVeu@? zhEt~~T(y6Her%cj(jJs@XGYBMCbLOevns)8kC+BM;f*vFya%tI6|vP?BgQ_@mU)E7 zp(%opa4!uXhqY18T{(p}^VljW_p;n%U&)R1)7_V zD%GxqSfB#>?D7I`(lv%RQ=uPU1*)XoIp)4}mD-WVd=bRXwP)~WcqRa;Xj26BR~YJC zzIa$rh-DVFpH^f(XAwII|4fZ%ab zOYh;;%ZAWp9KfQ3W~tAk2Z!AhDA7Rd(@;A=Cr_ z=Z~2l<*Wh-mmF9K1|VFW1HLq1Vv8T5^8g=JkO)gHUxA<=GBp$%ECoH)JMVoAKd5Q9ZJ=7r8g`!GlSeG$Z{oX%g;DQsB)c zoDGbN-dx2g2AhzqDfg=eAyulhG9ZjXe~#K2u`M8sDfec(8IZZ*em7lgcbA8zTW5a| zkToo&7SgUYXwewxR}B`1T8|0tfGMA$#d#_3t~dxsUB#_$sR4l9x5k#REtcGadut5{ zH38&%W6RSTSMDo>8UUs+H95P4`?c!Kz=Fb1#oce4hfPy9=!dG8Z)ol% za+L{FK5cn)Z=Yd8v}N>ernxkCCMh)`K+B?SXz7+_cxU@0v&H#)xCqx*x2Y z4#c=+7|?nue$IOA9ati6d_dc*Kq3>M)LM3$4I$uIzz3#=iZ*;y6xOt@zY68eF0O6LU zAherWhWEg{H{_RLGkC^KT;Pd>y7qk`X;Y|4JJjRQ6_sgr-#1U>JW5lZwcM@73n*Eb z2kt9`+&5%a1kZ{^Z>yHgvV3@8y&;a{W>F^H?Y5?Rv0M6sSZH^)QY2ociI%>@o`w5? z-(}1_kX4P7L1vrpv)?0S?fsQ{4F7w!kZ|v>e!na|;GZ8cY9-vA=8&|PaI)*<)*~O& znUq?_N!8$4mnjIAeVJuk6n8Ckgl(}%0ga~;huLH2x!8$7J$5whucEt`10hzOKB)$f zAB^1PP;)H2TLTCm*l!3m0TA2y-~ojI{*Y%@4krF%IZ;ROC#qkeasCgF;a4YwKaj;s~`4n0=$z_<937H zJ5Bk>l09Zz@c=|fs$<)ej?1RqFdEEOylsG`)rZ~8ys~R0MD6tfUj^X9D+aKlD+~7cNJKq1<%>ZhTYDy` z-h)dZ#z2HuqK!8jFDir7wM zF|)x5XqL%o?f zmqlLp7R&O|RGGsbJh%*yavu)?8Qv?Bo-JwhLwLBKAM)={*0l7#KC=_G)F3Iaq@T} zVR%gA8q|I!7#D7 zGq}aHkI&k%aiiuN%napTM79u~9@_<&4OGJ$oi87K`+oF^aQ%FFLkj?Sc;5k3X+a1) z64H1)D&hTDB)ELZ(!m&_hYCxnfw%^M<@V#2Ib_N!wa-PkFe)1bM?6V+C*eLH z@`C3oZwBQ(TlI!K4v}ChvBw`p05pZlzatZ92zUe-oSc7QJWA3p*oM=kps>($yw|t9 z07g7Ljc5>^%9k&Uva}jPiOO>+_eh9IS$}&Isw-A?+YTBsvd_L)@7gBaK&jC0W{d3n zk0Zj}5{jU13DnMj?Sef|nKUKbpM(#4Xk`nvbKjKXmuj3o;9Fz+9aR0(8W3s%$oDQ& z!T;I5LZ}HKI%{okpCGWjKfaL)yO_v58gh)kI5f0mpM^_|br))cZOsPb2jCN41Hfn?6DjwXk=-?z@6wXZ2TnkF11v6W@mKb2IRaH? zzb<2To(2^jm4yDaajJiGk()(N&&o6SvgIgxOK!Tq;D!*qM&$*$721oHQ3$L)Vn|!7 zs>QA3yJMa8tgrLES>NJhB>87^>Dp&~FOt;e2iOD-pt^gQ!!@ zn9%YecmQ8r7{CGaa{hK<2nW#1`MVWD=nk0{(sP_J3lxV55^6P7+$kRkn|QhC3y+HD zVOw6|oWx?o)q+&Ez<@EJ&KDjIp4?$iVyL4w;i;~i$~34f62p}2cbGtUuAN2dcI=n_ zMu0_zBS>0DDXwr!DTo?jvh-wStw(n=9c*Y5ho#80az;!%`&lgxQ4E)D*cFAqmeyNfu{QpgSB;h}R&} zl);=;7W0V}o@imEZ2$L*0wAte^G=wzg+<>ft(dSiRj&7xJ%&(4?=konY(1*1I%-dQ2AdVy-weHnwtj_W zNAL&I?py37KgqtmKJSy0FuvLSlUYh!3se2n9DdtU=A9*itoArvQTpc);W@4t ztm%;f4WOsozf@Dfi#h>@UgCOvRl>0#XI*{ZPTgn&Ej?+%E9dD03?NXJQ(n3`v+pbn z-~e7Z-(48OO0JwT=YqE`;_p=-uQ!-HqxH^Jfc`G|R}&7556{7<=`shy3e#f5f2&wk zl#CVU23|QIpr_QfiK)?6vcimXj!ZFUG)G9WuG%v}1fknl4qjpb-7XW6r%}kwxuD9f zJ*FTU=nukr_ADBIQgwob5@rxa(Oz?$F=RUXgZlGPq{1`&e?(SA7@$aB)=EwO(>C5z z;-2fUd(K}u!-3Fx>inPJA&FZzH{M`QnTx56|Lyl}ZLW|sQdg`>dA7#((;wh^n(J-m zv-@vTCCdE$%zOZ~*GKF5BjYGIwSmg@xS$5G9>}>{s12befIRFtR@MTZ-G8vq9-1@q z#^9QcSe27I7;5<`Q*jCR!;m$w02+%`V;()v6^ujK=#bB3$tV4hafG*z=F5VI(dhn5 z?AczDMUr&?9oX!3{WLnH=yIqwJCKRCOjW|ZI}}yxN|s#Dl%pH4nzvT`9o7>*I%1?r zxF1I<|F|{0Jdb4j#fdQgB*ecdav7o_I8-(|Y&4e5_0x*bBlCDUIYpK10?_HRQJw|p zs1Y-*KEW1~{&tfm9w#`&IzvvOLE_W5!NX(iWr3(Up#X!jyx4u}MRHT>t$LnF( zjHNx(fXpi1qBHO{VW|iFRVY@P;lPzO(@)g}O{rb|K~d6BRt??!)$eU?RE6aOhe$fNO%O=3>zIGOny3+ z1kRd$VZJ4p0~`S0*I&EH`Um7A9NIv95dh7xTHZq5pCtr=Y=cHQC^Isb&jjFrHx$Bj z`3Qx=e!{eAe0US(+nx!Mbf5{2pe6}fXIq8kVW@#(@P{DPm?lfvAv6FGm7cM=_ z*rmxFWSF^-!`L7xkdZ`*(GEAIilH*nkHK_=^*RiwEv`{LbiI>qtR#yjq1HKh_@Tgg zJFd(4ZcKpI$K>Mn%Df-RSxw$i_J+6PV8fnVFu@={poDmt&q=AS%sZ zUuM@-z)b_#aK$CtgjN!kGHKh$@_A(h5(j7f4J$BU z=>?_j#1KGP99ptL^s_4_diR>h4w+DJY)Q4fwN29ATp;>*vathf*xDaNAImpB?+u2L zSp*}gmbV7e@^D|L2}WH>6lh+?x(`LL(OgNlZxjI_v=$h)47z(*!$kX?-6^_ zF;|yChBjAtvaYCFRJeL7lX9mL8pZcOf>^YzsB~R-w$d4G@@SZyW+K@pVY0%c2KN#J zUnserek5PLrF>}KJd7?qqz(wX=52K^nErM+>%an-xBg3`>*o)GK));sp!WLgzRNhcJGO%R z^W`Ccba*`=53LzF609>2+zqlRl4?Y27SARzqt#~CC2zE^Uk%RVIkhsU)M*9_rb@De znv20O1C)4=U4eG?u%I=dp;uwS&VCK+8#E?1)yywnVVsZB<(KH~VKq;u-7B;9LYHwU zH^7*rA>n?-q@gumdD@LyPxY&$nCqmukrDt58?VA0)99I3o7QeF>1u#Y?bedThT0ev zH>c>Dnli=D1K@!44Q2K1vb36`phCN3fCATa4scw!$RFm~oV|Bs##0JSf|x#cecaN+&|fbzx%V*E6{Vy<=4bz!xni^*KG+X5?gmt@f-T-FTjgcNzZ z={rneZ~bs$VzrAxd%7unf_tEf)h>?Q6oq2N&JU4DO871bA8HMkDP(OROx~DeOeW8u zyR?52oG#vhBD$casC?&;dCj8 z+_vX*jqqzT_>yW)qD}=3Z-UjAH^~^!h*H+5#4j7|3Ti0^P8P-xEN#NiMt(KCzSxMr zr8={+m-?3C`Zq6hqz9_2PCRq@LI9dFwStrR?v==GYb^kY*vi9aoIPANB}UT*uBf&C zKIZEKWBDx+Te_?;^BP_ERxxI?dW$tHDVfDWxiUOre%M{C%-9?8YVg-WlNk>1mJu@3 zmkHc(vEbW6^;~9l|3oMeCRkSyAVT4m8MQT6)jz?rT8c^yZW=T_OMy6wd@2j0ULA6A zi^;&C?wAJm>lORP>-G_@5(F#Z-X7xI)-RVAt7|BqEqmMVu+?DurtsQ>r&0ar^T9wo z4dr)+t9YnfJBZeRT|3ZbG&s$adsp~eWB;Pv*9#A71l&+e*O*^#&c$)ffn$*Tf&ki= z29Su=ET^l9|JL&I`QYZOeKFO(Hx{^Ab7cUFtlu6p&l$lR(1F1lNwooC>9^<#nC4b@ z*P?z$N~quVVoLowFsavws5`H0%j!RnuIr6SO-rYXtayXj7??+0{W6clZCPx5pe0-f z(DJ5$VWKuoQRp)L39o??htI)q?7_<0Le8{@6V(q_iPL*RL<{|t;-%ECQ}$mF;yy`; zS!l^v9yD&UU$=%RdJE330coQ5hICAaW@TFh$ug6U3r`liIiR3iaeo8$nq2q?Z8w36 zyM=|>eX?{gYTkr-XNY-f5e{hM?BRkAWyrf?E9S6Ums~$sUVOID`b&AZx9u;0+Qw&I zeKrX@0hCi~Xz~n+Ih)j1V_rd09W=O#0}=yCg|*D2CWH76ufeyRF$|MdqYM^xo8-qI z{(xy#(TwT#yCN4ri!I4DfoypRn2vE3-5px%aCJnIz~=*D_@}-47J}!h zd>tiyAA7&O$aBp?z)Wnfz=N#`ueI<`Mutv^0R)>o3Lm_wFx%+8fBLM`bAzX$R21U}j;TuK$#~Up&Y$P5q(U z9#bL12%J>3AWwJ5!SH^oboo#g?)b1>2dMv!{zMUz1DNdwGwzca7WggG`t4HAbw!19#YS7()Z4GH(NGRwIBaZa@z~epe0Yk-6Y6H* zE=-jw$>Wx+Y6*KqCrRzN=Y98}J=jo^Jq7b)C*}JLLBo!fJ|0r2vtQ;I4|qe0Wrj?I zSd3@KY{@`k>`P_KIlm4&!YbXHk1fkF|K#!*WB~xR*9W|}@EifKi0Bo4LxfskxZp#EZuV4g30O46S*PtSHmTN9qJ1auam6MS6nUKn{`GR5CEDUwi z3>boT4RI~*Bby5cPI53JMR^Wqju<_%U+XU&-uhx>{d~H3;L{|3905>!eSHC?N)gy8 z4OEk8K85~d9)PB-zNXn03j(WswgN9E^u?+MyXecJ(Uny^q?bcL?xB5P%KxdU5o0JvV_8)T1)o2H-3R(*05+=T zyLB=MMGY2}#8U`YHusn3k*iVUq5>lp+znnX0zwQK21p-!^S48vdeH4oO6f~QW=-n1 zTn*i!*erQye=`S*JSrr+|K&%a!M4(pan2r{&@JUEBET_A?%=C)cCbGi0Q{&O`nVX7 zqt`+G?STWp;;cN)qJL+1L)!FWXHj?gkhgTD<-QiNLt4zn?Z^i05QDZtLWSOo2@n(; zsu&h2w<84AXeyY9QD;_h8b}O%S#a2PJs!&^B~>N6Qo2gIjo@v3+~I5x^J&oMgWxl+ zD$n@*lIx{OUkNHqYRcGXKQi#R;pSNtX0%%*x!H=hdrI;shKl}nu+ac}Lh|NQ5gWWY z6BKuK86&Wv(K78u!VR_d2cg_TR)*Xtq~3th-f&o-jgwYIcj$S8o9GS@TdEXC#(OV31$|IS;>&++K|1ra+z2wKT>b{A}!FZW_zaP>9&F-ZaS;S;S z76--W-e`O}Lik3L@h*D`vhs+1O-a}9Gxk_IUkdVlExF)(#O-FRcE*r%DGj)EjQUJBr2mBnl`{98FFmL@IMc2>QbaJ{3cP|ija?%b76=j;Wq=P~+Pa~jIlo~h)Gy6p<>3)vm)J`AYv>Xz-7xx`Nu)g_tY5Qo3H@*vULX+b;f=2LVo($0^}Cp4bs#vh$@2WZE2paG zflQ!p;lYHeow0y0_dTBtm;y(`!)Jo9HiWkNMtX2tOoka<#vbVffF1#|wml?gh z=9Emz!@`S+eW?qUy>mfw<3!OIj4c*>rCi+#ffr}r+T2ymTP@Qdxn1o$aAI0z&#n50_aIjU1a1T$?41$avNo*KCWn(fFsvq3_OU9lg3wn=xInNA%g zHzbcW;a-xHA=RAk_k}-o#tCfON~DvM%4cDR`Ep)WC*i zu|getu@VW-uro@jDzB*+^nzmabj74)2O$1nHT^^4gUFeo0kfb`w3$#ql5V3481ZUa zAG2sxI-;jv@!6EVR?#5z%u(;n$-5cIcvm6p{}!4rGhu2lU#Z zTrB_i*t18Mo%hQ8TF#e>&fYHw3mn>5na3f%w%#}w0@w2bVp>~@st>V>M(503KjGI0 zd`oO4S7gX`WeZm43xO!wO`0FsTCUwn?stx_;ddqj~E5Q|^_< z9;j&eWu!Ap0^$M6)Wzz-xHu`Mb+1Y zS3!G!kZ(WdVM-_T90S*jcY#DTJB;@(Uc`>kcS{1pr)7 z29U=Z+2{MJhNN8>dYG*y3TSRvwqLD%gl>ug9U^j~iny;YQ~xqBqn8u-xf(YB}GokVtTso!zfuY~dd^+9mG~x;?wV)USj-AmSh7PU$dfpf{^B36@E^ z%VU#1GmH!m=431fO5d%0;i%fD22P5*a!0K02-we$;hHNA<3zwR)+5m@% z(uEYWV&k_&%pEAvlT%cAD#PyHY7$@YId>I-jG8s)8NlAXGQ1kR2%u%S8u~H;YYuz6 z^w$hMZqbJRa3n)Mt73tg>{0C!FUEgwn@89PT^9wA?+L7~WysJ~`vjpT0Q(R+{4?$K zK-&@!V2}3D>+70pH!fobSI=2LU+sOh#R3Z)))+ETA2sFxLC!d-mI2gUlc~9O69CL% z&Ui3d2 z4qIkeCWNhnAY~CdEE)nz0fDl2SYy}-pfn!-pxz$-tVvc2h*4Px%b?2K4-ZbS^WS8Q7@x$LBwW1 zXQju}rGB2#9+$K@(Kq4GXhg~H{a0QQ)Xk$cw2M{05%SHrrvK{&;|k|=R5@S z8TbqRLNJW#B0GR4&Qf9aF?~f5-&iOFHnJE}VE zTq|-X5;QHPqE*E5PJa+80Pm^?fXDMPkshf>um=c9wE^j7nj)FY>i|Hv@YzGc6OD?t z@`iz6zN@}hH#~uAz<{wO;SY#;X{oOpgto)`dLGRiWLgwlQdXNnX4?hWl~k=5SZ@% zuMxzMU1$TiaeZ&>fb>xJ$(dwk3i1R_LT_6RLQ4UyMDtJb?H_K?DvEua= z)14uz(xkOX-hiOcbip8vl5`VnNL2;&>7=DLGn%iExkbD213FWlAj- zFSWq$jIco%r95?{CjKiAW`(kozgPslI)Wqn(@U5$vNKJxbQn&4xRl zY!X2UV7ab?b>tSKZ3G~aKH>96V)_v}C?Hf1EES?#jd)w?8mcMdiApuaR405Zb%hD{ zQ%2(vGZ}1O_-LNn{&aoYLhJ*=rH%?2j~g~G2eA-bkE$kI9=yfCguVy^l|?d?ueOK< z9`S9$x?n!|7BLpgC&Tt{$^>Q;;x}Dj5W`d0O`fLDjLpfCD^f2MUT@W7^u++G2M4oQz|AINutS;vlZosYD|c4&G=Z8kpjYv!S*NM3zp6!l!>S8 zca1_GIWdQ`Si_xX!$H5kDEb8(fL}8U0+|?lwSpxNGCse{Fnlx7hT)q-F3CXYOGfG- zbM2uNpLh!KDY=0;E<%rJ6E(Zx^)>%6<*UWyT1p|&-ASXzGxb_}Pen+YKMPs+RuGf` zFuW0qAz)e{Y|IQ)3?f&J;XaoLN&roTaDO9&q=iw@+Zo{yn8+S5CcR$}q}3Q^bzOUq z=@Iv1iTo3+h}z;{qW1RTbh8fe%Z<7`B+`-*=>#BrtEi{-{)=aXWD+ekTgFGZ7!(WN zUTEJjR-;*>7_>7qEyl6K{Uong#J%LTY0S?*% zF)Q9zMN^R}`%PAIY{SY4pR8Dgrk9v7m<8!MA8{u=*9dh0U$X#seyBk>|3@tdO8+Ac zF^&pG&j?Z(F6-`Ubkz z&zm}uV^y0!vhK;?2}`HI`h6*`7AYKxy~D+5OOmy}UZ=CeiOQxd<2&&9H$?AED~56p zB`Q}3K!}!azi9}eUz@1Bej&?9lhvjbD=Cb<74KP6TUkpfD*o zDmWFaf(*yhR2nj86o!X!R`hqU~`8|LrOSWz`C!A8kSJ zpLCB<4UiLNV5)+)z@f%>gf7SoQK~({rDBXHB}`9M(<-u8&?;i_ahE3gbahu@4d(j6 zFh)O8-9LA&qMB3_*qT8h_(O~l3MR((T~p7i)f_;aV4IQ%(KE)EX23O);Ejrt!fwhz ztVw=P1XN|)8J09Z{BPmQE9n|ZZP`08;jWxvee0?*{svuj;Rhv7M zIK;02MKn=E8WR2w1?8L=g;eyCbUHr~tZq#|puuntXt73VXIV1hVIUc%LFMIIhx|d- zaGVfQQ3w%F2MEQRZDu^9jad>?h|Xh{7Nlao=+r(8Zy@MJe)lsc1SNpIzn``#9!BWr zEg_gP&)e`zO@jT4Is|YjbaTj1Otb;bK=&}wyi)y3p&1~-kqN#~X@rCph38NpZm*sxgDVy~GzMnc0KJ_*Vm<>aG+g5j7ZsK)@ujv;Uhg0T~F7j_LOYq1q_tILfa? z4Z#qi6Y_#GEszj*xBNo{R|qO#IiSgbRMTaqS(9@AX^gEgA3^x)v00|Z5Z%8lSuMJX zTsoPkthnS1hX|D~L#YwUn86Py!8DKp+l3Yh3C}phHW9U?&!$@It?(IZ*-Xpwu^EZ> zU-yz~Bq+1TLJtgC{Z9o@?Qln0LwHq%Q038U0ft>V&@C+?j0)(DM9nQOW(14Zt=ymIQ!BXryak=dJSgIk+KskQ`+^ZA zi9tj8#hGvrdSr?>XAfAEUw$3sL*dyu-q$-b!SA*A@(J+x9IrQwPUu%gO(*m-ek{i& zhUxWchKG>0*UA`|I*)N6sMH*{J6-*Fn@XfH+JbZw#^Y3x)&nnPShU<;M6Euq2gN9J z1iiv2mcSa)W4zlnpD^_9iMJCoY=Zb40d(F zWY9ink~RSwo7L0L2tV6p+63GOilQYJ zwV+3I4_4OKs_&esm*}dhF;^;;p1cev$YEOtgm_SqgIkI-kQT%Xffb#~BHOispp2%W zdYGGeGt}6=Z3KuO&4u{R0Hn8wo20^G{3HW2tYfvQ+}RRJH9BzJtZ&_?v0k>R`LAh=(5B|^+a`k2v@{N+ z_cOc$j6r7AX2dirre53-AsvXY7yUpbKWw;vP$)ouYrz3D->Mc+-!Na~fZzd+W3t-(t2F=mSazJFn44)>b_ZgQ-0+*D$TyBM%|0}I2Dq@5tK7>>2P z{ooK!R06_xw9MCgf}jBCw@Wd5WA;TfbLz7$W`BVvEW%F#hB%_IdexAneQhYHG)#k4 zXVKQ7g6Cv>fccYij|3ayo7K7TFnxVazu7vQs%(G-_dyXvw?LwYOUI!#B6@So<3{Li z>Z3lwBa9J3fn})(fzGfnluTXO7C$a=C&cr9yy;5veR7QNQbXuJ9;>Q+&WO*^?GV4# zC+%@)f|DirITU|VcRCUM8U|TjgK3zBX?!uOi|0r&Y8g2pSJz}*O6GYa%MjmYp!LzC;q>D+d4B<@%f>KDDO*T31vRw6Mg9Q-;V5-eglc zwWCWyYmN~?MRJO3E!nY3IUd({^9N;S`T=I?X(R4HTQx*)$`(yeiq>aLEk4%hNIyTr zg2==CZAQ#UzGA;RUWgx0G_h>c^JGLqwEES z5alZ##In5pVMdt!WK8OPgx^z?0TOHnwFs~Rzm-HUH&p!U$j#LuO>NxeMAu*Y(3da~Lctan4mAi^AHvD44#DjRPN@gL?uUMh3m9tT z0SboR+0VkM76gRs@l@qxd`5^Fzb_g=1V)Zv3w(N-!KVnfhXtRGCwLhzZwcbVbh`M; z46R`tBZ>OWcj7fhXo8Glq!WN4q+`6P6b()q=!~qmbRPo*HKjDnqwt zg^7mvg+`Q?`=|1vucJb}p_}s0QGTg$V2&%Q=?PR+11WvYjhAZ9s%HG56lh0`!0Z+~ zqq7YIL1YA9Bwa@~rY~U62y;i@d-+-hyAY~Dx(De`>jqS_{oq{7+(pMK6{tAExnP6( zEXWRnfRrZ1{2B<=TzpBJoojc6tmRCyB!NZcWT6jL@7 z6~sH33R!q}+@h+iIVpn>VIT-N##4N5jbAgx-40+=#2HW)8E0gKF) z!P+_4!@Ou+Twh>19vIGW%5JBh)Kg8ZsBbssCgMS4Rh7!b(63C4>n?dQWz)JwTyChV)Cfco z`2-*2EO+y@1@SrkF{_NQ75oYDg)|8cwwPt#W3VjD0?GoFLVeR@S-?Q|FxC)15ed47 z*8!4A$1se7;YULJb|gMQuhEu_0EZL2W_A23OMbS=M*%B#iG{C?v?D#9;H!rg%2`zG}KI+@@? zR95(YDAA0V+yz$F>n*LP$8ftjHeIo{qOTv8ZX(XjibLfv*yNO+7r_{25_|@vj}Mef zf03Tx)#+kNT&ygPiK83v2SdURpwYR6ZYTN~@4ysqdK%R)Pex;5(r(o4AUeUjp`^`~ zKpEWGj|mgTz-GENQaQ9KYuUxqp!*Xp)K5zWRZ&Sn%>r#7 zI@cNi+~i^i))C|ccR}Gwf~+uy5q_?-SC1nq%4#okMu5JW>|BU1g zsGjT(3}rmQ60MVF_9g zY7M72)IwB%?=T+D9KK)>xG)L*feFM|crDae2^U#bqdMhtgT5IsY;%50l=3ws+B+z$7EuMoZ!V|oq|LWCq^t$tx)=yrx5Q-nou zm+vvUJR}{1mSTmk{F?4Hv|V;kx;!~*G=YIHa3Agy!+>$hks~;4B4WC~GBZAf8xK?v zl>5Ii_an`P8$5irzz1C-C;>F7a#F6dH5T|~FA!7!g_^jsFQqSL4I7=#2vQO+$f6;$ zo2*9<8CnM3M9?LTBPY}h1A&ml+oMoK=!jG`Xc9E75YuU%(~L6H>sLfeQ6pj+N^w$( zmSzlBAf6!iq(0H2=VVsb8p#rgo-889D( zl566R;yrC?o_&+z&5B|13*jsRiAruB;&({VAWRo-4Gk7kNX^lpIEZV8XV#e}rr=1-GX-*k|lEyFXA{c>w!CQz{BmDd* z8b!!1DHV|jXniKenP!L|A?@X-9iV!nWBPKMX-aI5-x0q?5e$?&La@M1tw7BK}Yyd zDuOLo97X_6fWhYy`X)-CvrGLRJ2+gBH`Vlpm0Zw;%m2QcSq0}SRa2=rKX8Mf1kj*L zm=uT%5|{G=1;8XjXV|g)ux$h-0B$AyQF{nz9-T+eE!{>*U)Iv1A~}qw_y9sC#*8IS ztKw6h{%5g%FVhNeavrH?Gy&cIvEcxaS;ogIC9S-U65)49C6#l1M&EWN3@5^mk%s3g z2l|u3dqD4}0r!GvIL>>Ia{Nl&Oak?MVNl$epBVNArvjUTy-gbC80Cja<7{uk!bsRs zq2?iekF-x572${S1~{Sv{l935m}Emz?WL5U`4Re=NYjTj(ICDttxly0KR1LLQ8KxE zW!BIa%cMo<7hWUO0{qenppE&kV)831f)b$B>j8i5j4&AFRAMx!FOrN4j+zvf4N1VJ z%go&+p=kUVX;NsKocv;pZD@fV#U>-}7_AFr@Cmc_oT26Y6Pz^*-mR=Eppg(iRtg(| z`+x($C(;no!UPLoe~rVQ-xzG3heq+^rQ>rn&EeDh7>ZZ&Cd%Ihji4z%ra!tUvJ(`W zelPl&oYG&FETlNG=P+#Eh>Tz^G60ep33@LqADgE5RZ_F|0Ox`sj3&68JY5mgAH*lp zhrxef2*Zi0OzdNbRkLQdL4HU~o_p)Tj8+-XAFB|Qstw_f8cNc{82;oQK?$H0 zg-T*JYRB+rj}Yns*p>Z7whq>d8g5}QQQ0jAN#ufh-KWgzxnR)zkYHWdiB*lHIfdyJ z!(H?VcQKgK-x7s{GeSS|!og1Kx`(BtzlvW#ui}PjK(AmL=m0vtz|em)R1eUTV`87` z-?=vkX8H{nWG~ZD_J8oF!l|UWwuM@dw2v^qfeIDJPteGSAbI>z6Cs><0u_;ysoYZk z;UWv76POtEBSdA+d3HW2h+DJ$d*pl)9q7n6+c zW1N#>sMEr&W56Y0`4~3q%70r$Py$%51^u5d2$sn0)jEI^`Vv)T>|~Hb&(S(Xg)ruI zXR$@-5W@51gqgK+79g~PU+a-6D2P^u8qhFALQrwSt7v}`ARY4P1UHe3;^rPB)EJu+f9pNhW`P1 zkES@=pN#P=m)XJ=%g{+KI?%Yr4YK8kKQ0mDf^opuWI_e!fKHDKy@AGHfb0jC8sAwh zc_h|6yYfBJzMX~BRa$WrPV>Sj`7u~bb$F`jWfRv{xuR7BOdJ$0Z*TTitK3RNHZmdX z8><{$Mg#cuB&(}&mJaG6r+q}|7L;zGo3=Ix6Pg3H!=Ip!IT2PsXP|syGN91gn5v@* zFMuzh@vONO;|qJLe6Y6#^{8jhkMxQnyg9w8I-xOak&3P}SSjp;EUI*kTH{9G&S zCyC%HI);oTP=UhH1%ATS%#?>M#)6-szaiRA{2JB?Ph$Q(A7gjLX0W{w8oUGsjaU!1 zhCz=DUot8B35%H#9f1Jmbs0qXK$rF8gfe6aHg8kt*p3bL1)84}EI85{0tymB=ku-Q zM1aRks)V#!2MDzWpl+XOXH7#HS-b?)33Caxz$~(x+)2zlLW}{S?ua7N34K!r#)Ua& z_1L-ErutL*EoOX$SvsgkNjcF|+4uqz^ezVD4;eZql?q*eyzn7fmmLZ7Yr3W%%8c={ z8vGD!N$VAG3cVJGwE6>@2D1#Y}U^meTSRhJB$P!?r=J?F6 zhA3tU=3{idbq?6OF;EWP`5Lh&^0PmP>usOcA1k^QKYm z=^cVSz+MtSYu-(at4Q23guPu1p}p1hUIQUI0gdSs3Z0BqBB>c@{kotf{E)e$89~gj z;q7DSmdWlz3C>2+hDqdwNfdc%BK(-HEG)s&q$a`~K*10)CNIp7>%s)!lZGca6w9TI zWO%Fqs zZ+}OxWQvhXSl3iU*AKAx!~ynDVi#>XrsokZPAYMI8|gL@Gh$UZ>z z@S)Uzg&>MR{X*jgMWg{WheH`ju(DEr=m&NCG`8h}I!N z$OFHgt(n4j?Gz%(N+1Ia1wGmyeq=3x`s}Nwb6XQbNHm9_1c2t-2n+4&Up_gnGL5KLr zct{r^`^W^AHlnF3G+~L!DQrE8kMU~pY=YMdqJ&dO;QUdpyN(Mh$tS9|6R{Z|CsfkR zc%ZdNh+)N(Mvuy@xW|jHtZ9Oo2Nb37*^|Ac+5(1ziDzQ^FfqUoA31^rpdqkEjo-oW zY$ox8@2z;WYBXbo%Mc)EpJ3@YPTkCFdwN#aA!Qj^P<@ zT1Z6rw2+L$V9Wz!p_INRkPdP@l@kgy%Qk8p9_pRaI4vF;t1N-wL&#G0RD27tv&DE| z%~t;b12aFIXAg9a5#(XiH7x=f-xlhX7>0-6LL8j0o$D||aj!hWd9?t#%kl0^^!c?2 zN}q$#V`?&DcE(+*ak4Q&DClm{9`G}QB1_g;c&jtOps@4dAoD)@Thx_a94LZ+2#c%< zVSHTphoM-7b1=-jn0){mX!@3>3xwMAiW+SH7$2EKrUBoApG*pXc_!TpSp}nf@8I|t z{6jPWg}bP-Z!kK>%WpHNx(4`EQQw@tvjUbXeUDXJWgj%A`%4VX9uih9zeT`P5SEIb z@<%vlBv&J#*f3}KmyrY)T=7xSuxRlq`gy65PTGD@=$C8egbdJ44blqnW2Z1G7(w4e ztw23Yk%ulZt zpTa>wr$@#rSKmswSWvO?W!Yy!kF8e~6^vvfok(oKdfO0R*Az=%K_$)Gai zh3ZWzOy=g=$?}+jH9jKdFUjAc0Kn)6gY9JKA}qUAfuID?pi`JiD2gp}E$ABgDWNye z1?UaJ_Drg>AzGjOPaCQYKLE}iOjX_74HT)1(?WUYLAt2dR$V&@ULH;8cXyyi*6!eQ z@!}}V3~G)r326)hb2ufWB3bcm(Fpa79^YQ4>1Z9%p8T-PMW@do)Eu6p^c3gm^JBpH ztT4QRDLt32F+6DL4EvM_-C+^8*%#?kGsZ~q>1@UDK4)~tw0zix*4Q}Iw()sOKbj9u z+?1Abts{h-)d~}8JV$e9>i{an6$rvKCL924N=qYx`_qEovPyr2=D8^H1w-j!7KjL- z!jk%-DbvREFR=1{(fH7`4y``+7LDTLyNtXS&IV~JT1BBh8{^>?4Aw14zw{;1u4xo~ zDPAClRt<|t4P(e#f;DzzcMEAmP+Bt02#SbE2cwps7Yz&L^LJ+81gAI7`@{>vg3wcL z>>guOAp8Mg^YA><4A2~)Wn047?ll$!MzvX1wl3PI^p;Bs;eY*T3WmzzY$2o*xp)mm!SJ)tG=3~?=0xoQ$W8Rtj9 zW<;#cI`xnMwM{)`%lLGGP3mDoJFSdrh9_B}3{XL7ikN+IJ`Z`e7Pmxd@Cl}2;Y-140)qCtcQFEo>CewT*yeGlDp&( z=NI&BD8h&L;L!c#H{aD5z)78e~#q9%!J<+WZZR zD#QhqBIT8|JT8u7@_C`-q9 zZYC`*s?2Q{#m7)wQyI|%*>;vq6dk~K5k3sqJI6J#;R)U@GR~J-m0~y($Zs%3*&ZfS zyh0e}bAYfnL{s9hQx+tq1K(8vsOLb_Jr3p_ z6M(ic^$RkFdd8SmC~4oA9@h`X*lLE2C?;3yQ}hFvdWo`zJI5_{Fe~B;t;`z!{knt} z8ZPM;KbfpDhzR|l&K`yn`dJHnY79XfbBxdN#T+8A;k#yv36ur`d^%CGd!II;@2?#d zDM&&5d|rRT*9_i}(I6B{#&ohkmmsQH8EHLhI6DNIgJVq|D1yI-xaUoY|G4#ebQd^0 zR|Vk5k)`LW5R`RUjDA$$W zES?&QiLOEn3%XaDHEh6CI|MV*f8;IShWO+tQUwG|AaOVa7{Ro-Q9z@g#pd`nv^=(s z#8Y@#6aO3K4I@aGMh%BBSvv#bK&Q+-B=ShAl38KAGkPzLXECLVlk5>sR4#LBZ?ERB z+MOT~>tS$?GxY0r5!g#Q0%*Z2yl+2bWs*&*_M3A#4n{JkLQwh~*nLho0+ommxNSCQ z8k#md#;b3cgq{@C=w+G1pWoOy5gDjuEzunxQ^ogjKAW1H<9jf(6Z+mi0 z1=mYiLsvq49#$r~{S%zHCR3c`8ro^xfF@^XAqd}qI0&kYgdsb|mvNL6XyX;bWeiMk zl?!&4PjEd5F!P+e{MA@{9}z#xr}&s%F{T&RxK!{r(So^{F)S=Mr^Q&u(Mp+n`uFOd z4vLH^8B-++1qG!7^&e{C!S08Gjg~yr2>(EAocFIb5R?FX;VJ}=DfewfC4@Qn zw?q4F)pSc%&-R}>g#HA_=A$BF8aFZwK|%b`D9AcKb(voDL0|(PG9I&WK(hj*%nJTL zV=KoblIC~{9^uu*91`p3gxGM%7j*<^OK^^J3sGm9N#RaR_8s^+Ua7N25UFx;TrO7>fOu{!7gbb%&g!TJBS*D2%qIu>6Hhz*R4kI z!1flkfuIzUZhH|vpsbRTatulYGcQ?ATy22Bc=EL3!<_zVOsBOKE#;7_E6 zg6R3fve4uqR`bAE^a5I@?nk1-OHYX zckCeuLI^XSs9bh7tB2-r4ck>#9Q5m7iwU{ppuelJy}pUCvhFZyq%lA(8acDD%N>MW z%4{7b0?#p=;9~P=u=y>|JHidw>O?%~wldqmZX!BB-c}_%;QZA(K*$zAO_zX&cpHph zjc+2-7MS(KX=;BbVQ1SRAl7a;%{d_+QvpSX5x(qVWCi^qg%B>Jsu&AR?WJ9Vb4h+y zZe~oLqJSl=HS&Vt30!bL#)tDJ6TBCzBpg7PPi4cV2B$dRz~9G>#6p@KzCsuH2}}sg z%pG6?GI(k{nK4rmS_}H(MqPF{5tIOJTzt8QJA~nCn$1=PYU+zG_w)dvzE)u=VrzT( zjj*>0ppD`dr>?ygPl1Izq@_v0!08~b&E=|1CPeFuP#?yE&yy*f5D-C)RM%M%a&f!+ zSlaC$t!jP>(r_9R+eWWKLTSjsw`eRfd? zu%87$i;gKv{;ee!ueBg30a`wuvA}V1$rznC5%$%J0d9#GqSBrq@?{`7c z<1T06fG*Oi9Zjfh0QA1h3GIP(NdQ@X#L2(-ATnoI0w8MdvyB)5My%E0q5KD)YdIzm&?IEkzH-VrG z0-<_RBDH$gZ-db5q28?*?Q7wxxIN?{z@at+sI{E-%DT8Oz|^}&)2vT|R6|G{;^zI5 z;`vnbv<3Jb3OJOgYyiRc(vWA241;~b5yDPvm&k?%Q%ab8T^PH-anc(M*P}t_WvzGE za8&>+sCD~|%?~;wT%a6>rB9lJ=Edz1LP3wRk0WLKT9xM2YDO~HMnO4YKZ2^rx;@o9 z$_0XQ2n|;hj&2u0sYrb1&6@-Qv=|FwV0*KyV^I+KXwgW7 z=h@{PV=Td$F^>$Zaz+3)T@&q;`Bwv$APa31M0cCpLwk1aMeKJ;{R5JErfM8j4j` zC#(uQYb-g0_@W3Ds3KFmArP7i_kkEc8{=SS(l89nbc9Y8hS3Ms8<^0yYGe~!n1Xim zF4t3xhN2VtslUNQX%_-XbCN&w7#*6^q>?1I|Wo!$b15*$ox|X&E(&DQ6Vgj^AVa^E$O5 z(m6{+I#^#o-6)OGXR8ZG@=Nh%FLD5L86usk+L>f&HNux}NOOagpfi0b*E?1*`g}u; zJJ&K+i`6J~TB&iSJ{V=i^L#@9%dkH=-xk14S#jK@PfXe(RAmmKn&_=LyMJqA07IwU zsdSy)r#wP1b+gP-%mpGsGAp21dXNhS8We9*m_=+S{5#P)1V_zCI1sS$MmL2(|$4&;jtAk5O>%Pw*zv zAwdjTBL;w$Kt;-I74Nhtzf1v8za5U*)a?qw7U0J@6@OQCRx&8czQ)g55dMf;(LhH> z8+cQ3r!B@;6>?ne7QklYIX6D+-3EYW%3i6VO8v2&-S-#>N&uV$ZrP0A>k2^$0L`CN zq>k@vA3+JA@!c@ZR;M!VVu=Om=|7+Vz~~2qZEu?!RUp&?z#h_OS_gPnx_U(u01eHp z!gRcSKo`;n{XwVzR9!bC<8RGdkMp4>hoDvF!R0h~y5Yc<_5QEPF*H4ds|*0&STAiL zxMV#TM5ZZwzS+8tde^s%ptNTT z>wVZCgo=)Y$g{j$^4o^)D+tOh(-8hh<0?QUEvXpvXIvsE0W?*p_gOCxQ~-B) znl#u6>2t~)l;J@QL;EE)ncm5B9(z283UsvR=Us zp()mbL8u(`LrnuHNe`u^TGD&iV}v?@uUG*5*`fYb3xaaNzvUh3kGMrp#*!-5`R z3R->Cch;L!55XPl!5$nv!((ayCF$h=pLdMJ490l89RwwSv2{ehanHYPvtPFzf|pxI zzF~`?OrW()Q=#5Bn@3Or)U)2VJVvNvy`lx69oBjSeA@_00NiQ&g1-n6`iV1uHsA^8{nQyj3E+08>V_8EcUo|RHIz_Cg6b{E zrKA@<2BDMNL5}@S; z^ef!8-(UdHd`qMabC@?xVUs5SRqa>%{yE zcfacIZHM4pdEqwO_Laqj462&h29Y+bLH7zTwF01Szb4TBgZBv4#`bbGfDeK8AFC03 z2(rAvdZf~vg|0s4VgRijfQL2k`J-1{03_QA zwEx;RLO~VDBhdbvzX%b&Dc6ZnJqon{;fye#isan}+7bF^iwI7kwupogZd3w{fBAt> z0k8?>8|_q8uY*}*dDYFiai;B$nDCG_^&d(G3%!uK76+qpW<459rRMwk(%TijjX z=Hc5O1_-qXpf3K)%eq%JkWt&Vu&o1tcb9c<=YZfCOfq3Ku3=ch?d@AZP!=%|&z3Af z2JPTELJh!T6@QBc4>^D1c2r%iwqIkwM_&ifX0=WwSFQnK(qposq+7tM>`~Ts{n+m z0MzZfuVKV00Lt7@nYq;_ZdEmm-TgqYa_Szn0G?msw`VPaat8)RpKdl*-K!}CC4gp6 zdV70^U=PqM0gS6lhdtk>vaV_bA^Y~*xmjhODu9;!0_MKf7_6%Ln)VTt02=MXRXJT!l(&2wjmsS%U_?ux31w}GIn+L}ex zBm6=zimGq01Msw{`bIkhPm8K?dxVhFdYF>)>|RDW(jLHrTUvF`maqV{a{|M;V0e@T zL3sqD<#T68yG3aE+}WEvK~U@rd$aH7&W=$J!2{MCa72JTGzcUCpH~(DI6Xhs5kQ?j zH(oO|&Yd0S8-i|b$J+vUw=pb2Z?Q#Cx=$_BRHS!8^9V|S`lX~3Jw~wZV-S0KPO<>_ z!+L`jggVxPJ(wXzt4m2Is{k6ATgBQGOG&4AgW&8LPW62$>9htzXn!f`^aco(i5{t6 z(R0OmXS9P*nP{77Fj((Q-w<@x8?ptkupSH|soX+WP}WIkgDrrP^fC~Bw!wZ_%UaS| zEg&cXwAq@x=WMSLY5~r%0{F6key$ZkS>JAz_0DsRU}J6-V^FZ(`Q9Mdn44}4Nf)dK zdl*(_=*p_(TN{l)Go6o8NX|n@H9}AVxLH8Ipe+PtED5{kVDdu$5G24w_5dC}OLMV3 zf-*U5j`c2S0iik88+L^NduUNrFRg0dj|KG0st}aR3=saPahrP4W5ZY$FcQrz2oApNABETM+R3y1==yJCJt(x1r9RR%BHuN3` zgt)5a*3`D4_qKwdj3r_BCF{E3`#eXe0eF8EfFG>)fhq()SZ~xl0-y0uJJnVpe0y5G zq6vUz%}sp<$^pPT)=N7eIItes{{^LS>?>r{Tj4;4AB88V;e3^ zdl+}QyXvND043>>)?`{D;-s6KK~MrXZ4v*ZX9y0lIs)t=ue3If0Pd9S8(YMcMS!LYR>Ct(xEMie zmwOny(7xaTA*o8BwML=d7u!Wp0%(|ryL?3ez?U2Wykfn(9TB`@y?kp3I_tq6Y$AG) z?!0+r(mibfxG=YSYXLkz7;|4Of^wHQMxS;nx;Z6>_cw*01aLSQ^MH2<)3&QI4@v+Z zS?|j(hR`1C6wSq}y=so2l>P`dzj=2o#bTxs;MzX%cfiZg&mR~miQ8DT(`K)XK< z_(+Qg%2=|B^}gl@LS>>O^k^-B=d3qbi_i+|!5)fEr1w};07}xEhVW=P~U=22`{aq74-9AP?(pvufj7tP1fTjxczUKvk3gG*Gt`CbM!w-~0 z@Z#~!A1Vj=uiCsc2Nw==HyvVB;?Y|Vz1XYJefaI@r(?GZfOEcsju z2+C#2x-H_*dyP;#4KG*$eAy!Y6Dxu*Tf~3r8bL{_j$6bxc+D>Zt@gblP6zO> zyzqNBLxAB8D??%DK=n2^?Kf!N=H3lB2N8co=p_#TlqK6g_#SA#tQ>+Df%YGj2!kF3 z+J9;t!BwFB|LaADnwxsPylv>Q=0)W41UjsN9p@{}17w;DwEyZgLT#Y^H!FZIf%f06 z2)+c`|8R}aTA=OIiws7P$C~sn7iTe*fvPf$EC*#QueuZ)E=Rf0rdS7S=|zT`1zW%u z)GK-a@n)9Ibf+ry7lHPF{Y2nd{+|4{NDFo#nOoxr4awclU|;Av6yjdlp07FFZ+2q9Go zLs4L;znlC>djRD=Qsv@vEo~<(0RG%fev}2F?rw7H)#05N8EUpkcy%wC*v4>-dK!@9 z4Yj^FED#195nvC4>h=MjR~7&`JwMhFpxqse+JfBcahz`mI>7O^0G7MS+n$BD*diz| zCwI9Y#vtw!nn%c}IH{iXPV^X|Y8L=&(n%Hoe^_tOf>6hLum{uFT3t#ySq0F@+$z@Q zxbZwfr+9l%&^rkwJa8+GwK`eWt!1cCPDbXqENObB$nQZWUutu-^IJ zAlR6jZVX8mtOt7-ZaQ@{{PSBIjiBwj$y1FGOz&nl3!N7k+6`BAO}e;+X@JYgD);GC zt#4n_0)i5t?vUZID+JhsohG@+87{4A-;V|K%c>A;*KQ5x2I03tt8a6UpajqySGeEq z5rQMYI{?smk)hG<=MlHl0DEXskvcCjxZeHzUbnO0nv-DnRkZp(&k-d_da2kU*H z3c(N78+DJ+d66OFw4MajOSThCeyE9Au;C;v->|CZ=Rv^Eiwxr~4{u-H-aOk)bIsl4 zW8NcFv+6a~050z)ZzdeRwi-d1Kx;PEU?-*OF3IxT<~ElC99C`Zwf&P;BYYJ0q+o| zZ4>ARC4i5t_hlDDXpi*@E)dkL2ZNYYTtfd)y8w3PR#BwRiwy3<)kpl8hAP(knjZ+2 ziSE3}P!otj_%rnzZ#pkBxbUCfXj@e^n;5{VtKV!JK?%@#k-=4tKIO|SSdRmK+ZO~& zEcs*|fY%qrey0w>>x*KaY7RjeOWL#E(;gz&(CTWldCh5c)oo1=(UJ{of7b+1w~x_} zw3a_V;}Ss$ps51A?|Ffs0_eQRP!j>zs?v{qng*!eLgz&Wcfs~^Ue7_@X36KhMwqSH zH}rxPz?X|+e_}=O<)YZ1x<*ivs^b>%R?Zrz_Qb+Bl&nGIi=zL2-Zs>Ek)c7hAeNGT z>5U#a*F1ma1OU<<@MHnK^CE+~j1-}{x;gMV(B52!;B}z=o8}N&2(*9eA%boA@;e=% z^CCkHUBEer_^b0GgR9j4kF6`J%csx&)H;GPiZlZ4&Wj8R-wbQub?45D3Xf4q0yvU%Q=FW=@E;nuY{vrdt+L9?Wu~RkF5viOiwqIfgA9}y zv|NgzB#fF6$t;_Ph`KcFJ@@k#ouGOi;KhgB)`T7Q=Xa|SlmMEmAZbw>2uc9+?y$vv zAsEhWi5-BacZV&tL-6$Ou+D=F4R;Hza6JjF#xPsCMo?0cW3ezoE4@K*BE8Oo40ysb z-%yi!cosrae(cVdXAD>QJuwxZ~A1A9j4>B~g=FWo*l!xXQ z)O#>@tx{Ewcjt>GlFow+4JRSy$0T6x=gq?K?tUOx0rsc`@OpbCDTG$` zo$u`(!nExgNv{Mj_MLYgWSFVn2m2bIC!zBogR%f%r04tlG7Z)pn0>Vfod+3e_wsZe zWUxyZYVw6cYW2w8^K>3$sI97Y9%QIaJUb6ExUja)gA9!;RS63t`Exb-Q5J-{tI4g0 zc{>j>__>sHjCvY8SV|gjL||G z18CkorgyPDf)W6u&nma+RjqGd(gK1KppNy1T_GS~YH=1i4>DAYq4OX^vYorh-{neG zonF#$vu$X^EduPJ$)u$7AcO0x+d2<2R4Ak9bnW&B+^Q;#z~wZltinNe9%N`7>Rs7z z79jk#NU!rCg9~H0%3&I`xK~H3(+&s@0PqhPylUS>q}O?n!NojZ+r%t%9%S%i_p|T} znTFF)$9gb`CXC^Rh5%|-1$;rhS+esWg9~%(JjmceNZD##?L5d}clFsPtA*tKa?dRS zz|UKBZf!h-&Vvlpd61!T((swan$&d8pp~p!xIgOyLKVOrH2|Fl8SGfE^B_ZGWB5Xi zCN=SBg}h*;^B{x!%?8e=O7CuM8W3oYyS$Yl-x@;aK?cWD=n#Io^B{xA2ij1pIC-ysa2wvY4`&4rX%2?8#^`7<+!A4g*4>IJ%I)*l>@NJz38BEG^ z&TfC$x}v(gC${q-L!%Y9AGa_Epq(aG4Lc7qxG;sExSobq561k|HNuE$W0K>+n9hR? z(k-aG!q3~B0~lU|Q2Q5cA}9em4>Bl2VKY#@!uv@G;eNe&v%0X!dw}Y5^mBCpUI*Hn z>kzySw13kaLJNWRZ#_h?3A7{hI~}0&AVWGt2!Tw@14H`Kv^Qh~QHs;(yxzptdbXY^@K?axWot+06T$sYYx=8c$2KN_j zOs(3|5a}jcJe1UVkin%X{Lg6?ApC)bSCc4@&@V_vdesR*3DC^`{4FgZWL5hkw5m`z z#+9fY*Dr_|EMgQ}|(u+)UATQ|~F%cOdnzaykvGDdS)pw-%;g%?O&_D`ZJ( zp?Wj5>v&=6_7K4qV37{sSD+oH#cqax(GRzHq&G}U+#o0c)a!U*TG}>3LACu~3zNsM zG0<$)MT22l*5&NhwDvb_g=u-qBEsC~8gpux+`q;!qN?N7CJWlUo>GO$qt_T}5h?&S zk1=S8YX9H5`$s4ormdTt2Cc~*TVdL!NdzT;W=DEqMws^Hu>>Kb%3}-~DKDUF?T&#k zxqXZQn%|VFRuswUHHNq{zQ|U4f5kdpn6~qBn(bzJd!Ne-VcJ1Cg!an|VcJoNFsQ0u zxLU^xQ$$C|Pk5`U`ddk1TCD?wJO+?=F^6f5t%$UkQyA8K6tY>thUlT!Jzr=;Z3Y;7G(u1UG`{pCOnbJ4pe*vh;c}3)mwyNnU~hW>&#rn3 zQ*RZ5yT=$b_nQ~Ow5|#u)J|%vC!SU1g)r??1>pIv`7qTy#^CZGY%?<2w}~ONa{NC` z`!#`}yi^66KW$q8c&%3mP5}Eefac###$oEK9YWn>3~e2R4buU&0HNlRwgyMS!gOFQ zfO5xqvkNd9D9_v17-s4#RR=o`LGz@h8m8AdA}9f%`R+C^gz1ph5R?GcgRo(Gy$=Yb z%AWQx_16H1qH3=)7*>X=b%Esi8US_-&W|y)P*gqC2B6g#33G3ws)u=qU<+`#4&Yx= z^$0gZ!03ltt}wj84T2J&QBk$|*BJN?qpZ@}EVh86YTSMdp=OFCla70x!*ry5`y#c4 z@CQ}-zq^`eLV=(J(A;v~QLQ2<0V;d8!gRDR2<9e_Fukb`z}r1rVR~~Ng139N!gNe? z2+AsnJ?jlPBETLzP}O6N_O*ylrKIBw1SNph2I(E|3PA|~;j1X4h1VFGA-%9hC$v8X z^$<=}0ATbUsM1La1SNoL)*DnIz#fKLs*+fil015i!MT=X^B9B2OG&4yWMnhV%`YXL z)+9pnOG$0L#^7dA@(g1LzOmk!27+&_H`D+D_K;LYdIjv!R*~L@1^_LZ+q}7OtDWUH z!r3YSPZrS6Q6bovTg4bax;ZzxdTz@IN&pM%o#ziiWunio2k@BnlJy9+#U9whu$fmu z_?afMk}$osF+f9et5};hQ(uZnd5T~IaDfS+`4sA1Xd);9T7DNZOc%LBs7$oYJgZsn zVh<216KyjM+9iG?466VttOtV_X=cmKyh+@bssNOv2bbfD^e$^1K?wl6UyzGEZ}SPk z1bDj*fS3F8!}Jat1ZB;wY1VsZvj{fkRxt)U)_a$y2sY+6VgfW`J=nu&vqgH;=r1<` zl%zKd;kRgR?{_~{gAf^^#B%Y^J%l> z|G6AO>#TQ`ON7>0FWnph>><-s&Tw^?hDCHg*U-n*BY^OS8dm`-4%)_jUZX}(0%)#6 zy=&V*Py(2nC9m@f!H6ZVw*&B$^*(He;3?~6nnr*NiW?&@@1k=JpW_fIpih zKWafxZb5H(v*e9#5tOkc?7rxp&=zEVd$Vr{I>0Aw0leHIev2)Fa#u`~Tf}c|9zhub)U)2FJVvNY zv_1`=wgC9UdgB&^rdSUKp>)uO`@GF9fRgl3T5=@4+r2?>2KbE6C(y(6*#<+<+79*Z zXn>#uaK(C`YX?C|s|M?R-Zuo@+;X-6?pP1@(AYEFX$znvy$pn(b&SO77-OOZ1SNo0 zo8NxHYlK>WFIoXKKMsA|WkpZ|w06N=n7-s1VMJA!RIuLN-XJ)$UcNongFO_~n^x{= zG=jDd#@yQoL770iIT&+aTL?wUQegyvYU z&@KY(VN#J;Jyg}c=EK>WhpP~j01*CY3-#fzxJOU|XpW)YS3N>-1b74h{vHSXTB9Mf z&3cbELTH=yCfh=gtOt9rn+1LYJxq^z0H8Ft#~lE?dJQ;CPdFgNRXg3AIu7{tRuGi2 zB<#LqJ-PA?&kzF7s}2kU*S3c(N7E4oKev0ezmpSC@^ve6p=TXPfEHpKwG9tZq( z!y#bwN$Vc2W|w20Y>1!)(DDt#)$g>2pahVt_mqzaVxpgR0Pu|UA`Spb(zAa99sXga ze(m$SEdi+WXRV6!p78;p3gCM+0AAm*7N+mlASe%tYpq0jKWGL)37|QU-VZ%PZ~*v` z0PycM;Bdc-5ooSC59Tmi<2;{r0ibTb(Q&{Zw~e4I0pK{`bN(WP>3L^>@IdXsm0)J^ zHi2by9Nj{JGIh-p9aE-n(XukFphXnE^QJVVse5>wmQsioZ>0VD=^gY>N<_}4b@Viq zC`fTyLR&BEo$aEP0|AN@>ALJFt)=u9>fKUaO}FOh3VLHdJ=~vNP0{{^o&a3$GcVkI zA*~8i7j>6=C^)-?c3w$$%$K^dqtm0bC_sys9&p>{4!tXijy?3 ziB^`b9;NO+>Wb2T!l3|dGxyNr>A(}TWPmOsT6xQJbXq^Xju!2B&Z8fA{qL7{2dOK7 ze=pNFG0>k;H_L@6co>~T%V-dC8o`KYG5vdhepJYh(r>a9Nzs1vFvSNK25IY_L0WYa z?c7gmXs~Y~+e<51HV3=}*_=SHpsl`s+L(pJB4Nt)Q!FqT*qEF?`N#t@&(ND5_z(=fwaW z9H4_3DoEWA)3VFMgS7LJMDbqQE4@DZygMC$W_~tJDTpOachW!Tle6?t ziSm<>OCSB3qJvb7V78Wq1_4XG+tAUpGi2MBrJ3w_o~84KJIb_88MFNaT~2R_)8FHe z&u1c(3(@u5he3*rQ&>QH4^|Xb$SJU!2+JRPML1GJOtXI30XdC(=tu4}y_oI6Y-bjn)L{wAoT`5lR(}yt0`V;fliml(7qH_3Hp#7$8jklE>1t6gsjP zBHDR?-W2Gg9d2G%oGhU2Qa@|cLJVWsiYE4o3SA0dZvRcU&C;3@JvdoNL7;b2dXRFg zOtfSWB3pvrM$kXXE}=qzg5l&AI^n7^tu533^k=$+4(g}BXD4BBfsq#>)3+Q4xuZLb<1I=ay%F#5Q{oFzc$Ynmb z`RQwD%x3(oEVMGf0)V9~g}Q`8u)b}6eA7L&=q6h7L8#idP9qA(Am|X?ifbTg@wHXf zbwrtV!;l_bU~$kA6sjPD!_YaltrC5K{zDf*HNR4#50)U1UxODQ5GWE0Bm#jfhN-WC zS!S2gAml+^5XdEWVgNUn=`|60Cmq^Puk=ERHiySCxUZcYqDT)#S$_gQfaYvC0Y6#{ z!G!6n^jE&+v1^q62FSaqdp;8oR(90$U%CB-lkxXs4xrmtm8g3+i02@>RacyHX`D`@ zSdq4;bMrac`G(C?batFJLS4Xl7t?mMb%ZXY9bjB^(OhmLjJJmtZM&Uf}N-@MB%{b2piTx{{+jI>0Puy19V7~<}mEFv%+HV0OkZ@IaPz}))AW~K`d|RYaK{4O49o{+=x!DW zOgSE*5>%xRe6zjan>{fZJ22lYWJkj+me;-=ZfHdwrjY>IlrV&oCE3I&I8KpEDGEM@ zM6L}->FS^vuyoRF8FURELQc->x4+oM^lQ6Bv+;&3=_AkLxQQs!&xpO>C`=ueJV1l`2HQf+k zC0~xYU3_!j2t>3!THN_qA`R*i>!l@-&Dm%qN5Le8lQDWb%xGFSUR^ZW zy@ifp9f2M%ra8kiZKge_YunTT1wk#{%Hdl^9U`wg4+d zPa%)F3=&%fW@k}2FpuHCXPT0#j2=ZRHwEYr+NT%sTleKTw8ZK$$ZRq-31wN1 zX1hYP?d~*EpjUFVI2XrMy)8uJL-gqYeZ8L|@w4KXcBuLD^!j^f>FuN9UDPICL8Uc|_(|_q4jA@q=U0xbb(F5==@j*5Wj^4UxhhDmKBMnAqWPlcBm@p3c zM|t%uody1V6F^_VIM-5lFVx}&`dXkkgIErF0nR{h(u)}GoZ~3H4j*BT4_QaQ6~=KD z3>PZGRxJF>&J<0AvR#{h{EM$Zx!$mz9!k*hG5R260E5RbHMW%^bAM6 z+tL%6H0>PNOey*#z|)9v0vOpbf=5QEzZ3>9AG!&_ZG2-_&p3i^I2=gqOVjjzHemQ< z_?u;~pgT~L{4{*dj-yBRKwK-)w^3R$OyQXro%EVKNI=L7B0d2Uy8;qBw?rRjiCqhl zKrEOuB*szQPPA*72D4Ncprs}9M# zOD;fQ0}b2Aaa>oCeu}PMN8L$Ud>n9ko`y@lD^5>K7bIoWRiZbSmaYE73&+AUv0P3MP%pqCj^GVQ6fk<)0l{vZ4qHdt z-MkEPxf^1*w2zf=>lh`AM1?)+y{FLNZX=s1oH`b9!#>~tBD>jD%>56-UILU0(+CE$ zsw{r}Fxro8^Ws9(6eN3po=z>%#>`L(=KC=GUVN}$XfhMrF%jA! zndO;ThM1s03z(H7=;tubL&Nk+9Fy_`Lz5{s83uFCN==sO2#7HXZJy;Q`*k8AdA!J} zfmN5cgDywXVFQe zSsLP$?M{SbJ+w%7fLCI$UkHGn_8z!-6K#`Z_xBRVN-@OMNPHkw zKr+W5bA2>PXO?J>@5kRpKca_Drg(_9f@D^8F(bm17ohbl8At(Ue&D~$J$WeJ2k59U z{S`tx4eB}!E2AK|pH+j6JSh^jc;7OJr4$z?zPpH)ZbT=9ScZg!vs6Oa)aHF&*g((G zsq5+Z1a0UEp|6kdaD-S2w0o&QxoOZbZ2Dy!}ilkEJ)!R?`^6u9ve|Zr&$AF<9#X_&MuL59E@bgbu+a1~$?M`e8;d(T$Pa zhaL(bH2G3L#vg?sw(dbN(M9_VAV0b&yO5<|nWgfY@6ijp!NvU(o_fD9{krs+eyc)9t6B>qk-wpAciXa9y9i}%-gU&=id3~I|XffvizI}6Pwg}+})aETSIjIdXtrI)DQvNat!=b2S${5ZTa00oqi08#1&n zLnjOsCQxpuqe0(~rj?9?)DAEq#d= zpDZHm7$R(uxWYNC=?fn=O9+PcTSs3KTsKNzhq~@PK3_8Q<{(-m68vw{hV}GX3a+Nd z1>Gf(Av4`wIFrqkz>hCaBae^Jnb4eqI#uiL8`cXThxKrBx~Tjxg>RZ1;v99K03?!l z7G%wAuwp%J8(aRu-IwhB`=tQ{S{Ia|oJ;7J7*CM)qV0mny_VAmB>uhtvgMuWuNfp4 zE1*-|^pR5cv2YY?_d%ljS+4l(gx`ja!%h7NB32HE=)HjcCN14W2SR$2_*J-P21=SE zS}ZB?)uk&d?1igXI&2NyE1(Mb2y z_g}aR{`s5(=u!fwojOP7BcgdAK(}n6bEMZAMUuI;2=T@9tmlEv-=-~bg28h9cM-a^ zbrLNgT3K46HFLCjBVBwoQhDe(6=hMYH!vE&?}NFAZ-YW(rg&C~j-UD{2r@y7`YF^4 zHxQ$z`Y~_I>HYvjzm^UU(V+$I?m5{3T5{Ia6nkzNJpEobQRE6pdu5om4Io(v;TM?* z(H>=P3*rb-HiW1Ng@&$DPgkZuzmC(rwDiaWWZ<`oX=jZ-jc=kc@W^7KNEwbUKtoHf ze8VzMeHWGAxO8v!ab-f<0X~yY$N_MV>|HFT)r)Kiy^yVN8^;gQbTCK&@No{H?1(9LgY;Vu)fx#aXk&2BuniEOj4< zo`G-RJ2xC0qQgf4^lfWHM+ z-b1gVu<%(w0C_FSw3?1osZo7^w(Y+!wItSViNG^REMt2h%T@>YZ z%sfg{_ny|OfpuB=F6qBFEMSD?c)`>YB)X4GdRh<2b$t1;^S(#FY9K$a&L zqqHQ-lS@#ZL;<1un!pBH^j=hBmxBQhq@}3bp&I(D0_sN0HXJwp7HsnjVE$X8mr+t8 zZ7s;H7+5gOYujG1@OlToXOGSeCx-XWImaU`T)7$7c5KaWbeV-8{4Pelbab)tM zfXz`7jBDBD%ho{($TCnoSyM#fx0ddL2=%%Wq9X)QvUcz=owA-jl%N|qINBL5VuG3I zy=<4qpHV>AcnvKYGAfVfBU#%zN-0rddkf|@IhWpu$%aiq7;IBtW;H;mL_|ePMrNSG zLKEOH;(fIJ&0K3cfP!~&`Ei#Rf^!aJ%yo|wN9ex=I&W|o4Mb9q#N(Vh=M3Qxsw=P1 z_GPXK5oE_t|`&yO5l%M>CuxREKy~+X&MV*l#MK8XEF#jcK;h(V3}S|zX2B=4*?}1 zpREvYboE3j@@(%D_rh(lR}jH9>MW~h5hCke1lE&LcHxU}I;9^I7Jcsik3PK);n}&% zXr4#VKL^#mfgXf31`TO!&jmA7{+N#c8K*}A!|+$ffn_=2c+)0K_P`t+J4HuNU}l&m z#mZSEKx;sA`GtpRoLetvc$B7-Y$~u|00+`jfpN?I{Gc} zVO6@l3gs|#>qxZ8G30Kj39>I*okOm@k*@2fbCEjT9>HXujwlk$1=A9F6S9MaNsMeD zi`)rgUe0R&`YmM&l~Mov^(5y6e-B_%&zH2o%Y0CI%-Ayz2X2g?Rz15ywp&YotjZ4NyD)A3=+6c=l3s0b~#d$Zg5kh^e1MVJIr-U`>x;@!q5I@QV?#+7}&| zrgWHIF4K8slptP0myYVEO}(@>37G(453p}A6zT7KW%E$r(f8AuD0S_Q9)SS%Tt_P* zk1Q5kF>`x?cQ=e+;<}%I z3S}RH=n+p>R*A0=3lXsTXSpWyT4dIUoo*PV6_-wmdJrV?7M2Lx{43~GslOLZ>>i{0 zrV&FKYgex#Fdn6qy)=b-^P}`N%0-0Z=o`HW-P$fpg}w#$l!6ss_b<50lMud~K?D8t z92c9RB{>x9Fmn;82F0Fvn7X8PEV&#%TLeBVVS#2HeR96^c#%$m!y2Kb^YCgR7}?Zw zzjze$GqfJ!1rvS`^4J=b`z^v*hb8nH^m-*ou^U>!%jt`dUBTDyM4!sTl)0ujn5=Rm z>3VJiA1s0S2y#3dQ5JMy{BfAb)HAFy>-)Y3-G_kwFbp=?DvEFSh#@-VL zzpfuaVGxS*B{rchE=QNRR3$4i(v$9pQ2sbt!P$7QMB8&@cP_u32OHUMTX=tj9fMH1 zB>~W8v?~tglV$1i>A3auvjkG1?%j9^sn4}Ku(GdJ>j!iizJ3u=hQLBWSi zLwC-E+MPlN_R~UtmY#+qz$;7vtiTt}}F|IBe*#sWGoO_xi@&VeG+=x;O&xFdmYhoey{U+W&-wpd++bh zR`SgAoX=U_=Y5t>f$e-^=ud4}nuxTpbvu&r%}HhHYw?Yy+Gm_k4WIUNAPU~+*r3+( z-XHKjMV<0y9A5p?D7f`c^0bXM0O}h!4qq28yU*c`U{e2(zh;$Kd4J^KB-;TFF|FG(b$ujc{S*N}{dqBoi?Ng_-6loWNczO{>p||CYyXFJ97L6tO z(<;-Jo(_^ftq7lkt_(Qfx1;ieo%Y#9PateJ8O6yshK$VYks0mK{|z~)amD~CPxr}? zMwyf0?T%P3Qb)2I+|#BZwh!$PCW6NENN1LUWAW8)ATy66K6`R;{iu^3~g@S+5P#)Pt-~A8Oq$a z5WtasnU3F0z;RU)tq{YCLR8`98z*Di7nI9`E?l|BppTL2(}=(T&s@oQN}_`kQIXXzg>tRxhzBCyFUX=QNFXZg)V;@GQ;RsEe#{njP=zd$@V+Y@L%DGNirY9CjroM95aMLh~^GU}<^C{R#NS4&E_Xj4T=yEyBW zJQ*i)irP_28vVJSzrD1I7at$w06lV+*8H#~Jf=(Lb;$usE^mW#yPGgE(BYGt5RuDc^mgf_@24wT3ZCFM&Q3Czh$Og-b^~gNF zbq2bsiUoSvLuZ!EB5e})-BQ}f_aA1sa185vWOl(SW&4*z+*L4;)xrj5WB*WxtC|sm^poo`qhPQ%4^ndpmf2qaHU# zWv3dC!lQ{2i-^;bbNrZj$TCV&)g#C4BIcnU`}e%H_t$IV;=Gw>yt?2?97-15DU;c7 z>O60P3zQ2E^7c8pQfS7vK)52g+>(ziobN&s|96xKi;_TrCHpBfo^m*4C9hJu2Hv*H zi&?2t#&HBh%L%AyUkHu3k#ldA&GM4kOjP_WV6s4}iN>tA;U7qE@!tfj=>UA3%K5XZ zaMqehKG6r%#g_xir-{q%%~~u+O_tRa07TDNqQPXj49!@fW;0%X+AAGh8BS%5md*XR zzk(#%^5cef^5VNR7$q^HGyNLT=g7DK45XDoQm5hm24`e;k53yQ49-1=pNFtNosSr@ zBk67A`4rE4jTfF4mXl0Wew&|~E5!|nZekF@6?FzAwHy690#A2KB5AcQT$YwkA~6YQ z|B2!{t(tEneTt_f9N?j*Q}oKu(Ux3jfTVGCjv~<} zltCzFhpSCVFt0q37{DvkA@3CTqP;=tkPphKIk-{?Kxa{mtZwC(%lp8F`}2l$t?hyl z&%f}%L_??1F{P6hx5-K^j1lE_Btx4Ua98*kmoMD8$s54vo?v=RW^ zT0f7*WM6#m=w@<&U&>+cJ{k#od6TgYd74zsA(r1%(BVX$$-sPlr+~iNmc?NKp_tC z{Y@5Tk+R@lcw}9!ljvT~v(@ljP%+=_B?_62))k;n^8YT&FkbH(s1c)|6~YUf?Nx+* zkQNNf3Dt6+=6UD!P&zqBR-^q3_IV;0T#PI!`^w=|FGlr~M$ zIA|q{OE&Vf(gv;5#K1IBjTlG&7-b&>Yno6dz$OJJDE?aN6{ml>D*Df%OApA5Vw#Bd zwrU=e1d18%s{>!yLZ=o|W8K;h+Rzlsl-m3N-C#KCKGw=$I zbaQCO?neHkM6nr9B!--VxRg3MyB6gx3h+`>f^tn*p0=Z_6sEx?Ll9OC-3i*`Isp_P zk7>tqzJ@b|*C{o{1?rK!2I88wH7nsPVeU5+0F-9tQw(ZPgW6+0#b?dLm3*JH51JVx zE+~dH0K8Je8LP1+gRdAag$jVlIvx}-y@!`=-DuXh`!d|0Hn^Efz zNr-D@Y7i$ph#XCsQ$?>`V9PdiXeAjfZ1V|VQ#^MBp7S2#E>j28m z&-K6|5NtqECBTgYWpI=1Z&Q^j#Z7gaBXh}DP#IQa8IGZa zaBO+QPmBVx{9Al2L#-ONB5@9%+)O=v>ArQN`S2 z&CfeQy8nZadpMs!*H_d834L*TDV-m8EC$q8P0a@Mj$vT+Q!jib4iTCLn`+ zbxUJvAiaRdcDBhc8g>MTH)q#yHau~`>Wl%kmQb?%`#itab zDU3A(4?NVxW%Q*6^LznGnba0@yOnrS2;9I|>ZA&l9Y3WGk>j&{^)W)k$GF5(ppw4u zrR1(0$OnT_7lPZEHHEh*LZSf92TouK$IuFluQb7q+6IQF9>46E#I;PbOor*ZDc z&%rAZ40j~ev${HLsMG5J=RjQ|q#t?Z&U*alH1%j@(irGNPaK?FR#M};1V8;4*~>DT zveA@Wv$fh%4*|tA@5K0Y&L2gox>cU4q&T!MEypX!DWH2N`JLvSV!lcXLva10eGpyG z{#*(YGU86p*vNA$6@)D*mTs*(s)CHcpmmIJp4v*#YBo(w3$d*pq`=rt*zPIBQ`o%| z1%#amgdj^M_DDG0oR;y*@Av0A2`WDj=L;M3`%MBkk23kSd`QG0r&{tP2h%LmkAz|^ zZ~&uobCfrC%3>P1TkDr$DQ`$1Ph01bha)juf1Wfj{RC6CXX)&)jRj=ki4p`7 zLn{Inf;i9-xA_A^ahqZCArCljC+va7;?N=Nfmhjs4BaH4JCwrHym4D-bCQQ34!Q-; z$(O~a<0hLM$+u)iu*)wmMDyPDe!S~41opHgHyV=}B0D1>-&_a5eLQL;QCRZ?x0%+d zN@V52ECTqP=A2nRx!ciUV>>ujXDwQWmtlly?~|G+%+DnXn7jwys)>SM9$5$uEC}%L zf&1!Xq;OHg^p9WoRS0W_wmn<<-K%@#nKs=<<<~g z0?jg$nH?pki}Eshj5n`I$cvVouN9#%;V90W7fz*?*C*#3LXWOP+m7H*k|Hzv1Gf`e52#9K@V5ct%qPf`&W%0)C!eJSpn) zg&Y{4oGPSNBxN$*TNG|mq474`czhE1v<(p z7`8uy98b0smnhS}Yi)w2B|Ml3Kg%5oCR)X{F{uEp(omF$X>M3fH(A0tJRV|7Rq5oQ zY{)3!FoLr1o?pw;T`^1A+g9iV%!gWE&ZwMtKL$KP%9p61h^4M{9F?DuMO*$0rpA)l z5vXcnG=45k+&|tQE6!_Dl@vduV>QZbmw|g8)X;n~)_hEJFD@ne#$D$E%q}b^$m^^! z=Y9>xt5FCu*QpKOb**Z|P@GecW~JMjh{1|nrV*&;*&1Z#m6K@Dc*{#Y5#8A(;UvFD zF^B^)3Uq8wTAVv~Z)~vrEzg#-xA>OhZ*?T_)kby3r!ZsHqzqCcFqe{TBO#XDBo?hl zCR;(d2qfT0+ajTsIHnepz`DXIC`a|T;gtmDAq1|3mJ`36D|1zI%#?;*THQ{^;*=gjNCXH;s+mssPyFr1S z2Szr|$NpXhC;Q~rB#FF2k9G&P+7TPYp;k5_#@v!j3Y+>!x0Itg1!3_R!lF`shF?K~_sP?sxRZf49Fs{u!KlN; zopE4+JL*g+X+19hwW$&elu4<{5GDcmk8Tk6LUFlww`i4mg#w%ys#PLa_5c#5LO-?~ zknf>elntTkDwW*XVT($mw@Eh@&V?*wJfYiXPgmlIrYNvELEVrBCQ3++&sjAn9wCO-dswyYr@6)L@SGfuq=lCsN4p#UG-YH-dYaIu5!quUTw#9$7-XLCSCbv;nmu)%a|C< zFHbpR8}ue^g~y=@#H{8z(u)S4L)O(s2jhnb@*m3wkIM7cHPr|~YjCy}6nHsL&9>9# zw^Z{}CG|etCS`#pzDuJtemqted4~xS+(d!@r@*Pe+@IH(4UZrgyIu9nnW`DzXr)a7P zKR#M%NvmODCYk(aHAQ6`=<8eCNWWt5+mN(hE3pT!Rw>mzxRLYa2YGlKgj#zm!&f~3 zxE(S8ZvQ1sJCHXYj%?Q`vo}VHHzfETXxbEcvx0n0n%5z#DQLc$!)ZYxUXlF8!A)Zx3xsHp!!V<)o<7gytHgIXIk_V=e4I(oHOvP+D24W4fsrx6pi2+`sqN zTJ^b@1FnD?9FAMP2-kp~Z0izQ^W5n4Y*#0e{u53DMN$6Xvs$^bRsKeMaSEp}&kJfX zY7(p07LED{7SksOdqSCiD<^0F3=bd4^?q&7J64188xS^=#+oBvV6#%_N4QEh8MiPW z-5O{J&HL7ca^_e*il9814ICrzp4yaQvOsjB$fT{)aiss<0$>5#F3k^F{fj;@XL((Y zudCGdmow;H;jatH16?4Sq9^!}TEIS+2oKefBZqgjj@m%iQ0)RG|G+Fv94#;`r-DeW@ zuHOj)aizh$YgMDC4s>{!LAC(H3^?JA9$BzU>es^k_?+sK@Y469y;rbWgTUk6@#N+X zUh)W&L!6uk&4<^@g-}=MMQxCwmlE0DC!LyTzT!u3$&PD3)sqNcux?;@*QT)a!xgY0^09YjquMiTO|(~J!}Q&jih>PEJzF1KRoUb6w(bE1)r0VARBP|@J%7GG9JJqw;&0(U+RL=(gbMt z(&^Bfk_TgQMM9npxBBZ>#0VN6*hL2~tlkEkns!R*;tZm-Cmp~6Um`b_qvm_jW=$_u zS8lZhQ_eRUqZ~lXV4fuGxyI}9Rq$irWmksx7%8_kqrNbrZqt*Qkhx>YE3wPFR3hsR z$nrGV6ObpEL8Oefr|YRZ29mg%XK^_mo^THso~%Ol2B>!>`R#ZMdTGhwz8LdOV>0-h z#o9cjc+icQ$hlrNeKA8~8@FvXf;O`d5b8rI=Yw~c{ft5qo$*g_=j1Ffuo#G{bxWU| zsRh^)nbfDV-^zF0Sg)~keMCOfwxNBtdk;i;O}95@LSUgpYB4!U%~GdeK#xW#{M$Ds zp*k@tf72Maz%S`G$Sx?KWyr)mD$wZY`7xI$+u2+}6I z-qn`(*Hpt+ldu*NS06^d&Q*EBN6JSqJf`6NKvaHd!^I0st=}n&w0*f=d(S*%ukGpX z41eycHsX5{{d35mm=tYpYD{#Zed3CNws0B9jL{Pm=IBd6~LvGX!r4T1kB4&EeR zH}Mx6EGEe6eG5TlZz!~m+KH=ECWUHSe2NPtmZ!Wf-I4{GbO9)@17?hoZM1#)`BHzq z7hLQ0?bx>miigBi=M{Fz`B!m7<+OFnukF5W&fdt^-B;V&Kd$^kZFW6IXUWK7%cZ%; z5S7|zWQyJ}#C>$tp>btYodRicgmFk*n~(Y$uqVDAwX1>f;e&JyP@2#bj%s|I7+~2G zy^LvWf081~{XGK>60XpuPAyj#$e32t7jd2Fu!6;zwtiY|JxXw$71YP{AvKyLPa<@3 zq#q~bs|M)k0;bCrMai)Kier(>UVB96QHlbZg(!LgB3t}jqZd?o7F>3dUl!BS?UG?J zrJQM%{85AxEkYaHEm}%l5df(QC9e& zJQn91Pe39UD}L-w#bg97h|f7*oUuN#R)@|A<$ZH;*z1@A??RQU3PxEQ&|btFAA?7` zSdn85c2l7&&mWcL`ML&@$vKv}rdRuN;GoyC+Yv(pvFiUdCe+}l-RIC_Khlwg2~{_| zS^RI~qr()X6ega=X)rhgo|kj9-)xZFQLp3fYNDH{*uB>!4_nfs?PfnIE)H>np%*s`!&Gar^2)hr+K$*n{|?E_dhssv$2C?Z4PjAIAFB;$&p>OkFV#Ra$c``F zB|e7L=6IaSbQV=eT#Gj1aj&1_BqVvfbBc^kdYD^vX8Xm%G9kiv5GPQCb1FQ^W3LdH znWdImAk)=CeKOZYzUU%;7aPaM%Y6^sUS!FIY)Q#*bPo{G1G(4ApWG2zA`0ut5e!$+ zo^Zg7J!@N&Q$fDE|2Qh##<9D7z^#1}*xkO(Y+D*}hAwP?+$HHXgO<*A&{+}cMSFCo zLfgHMUyU{`9E((yPigLvE}*S8!GS*x_K?0}7rpwGRXSa#oXTk;S3h6dBXg8hf*DoU z6*6H`vl-VWV1B2sUW%xDttLtawdi$oR7Ppb+dTZ1pD<(3GNj~Azf@*qOGGB>EW^*W zvn!?t1j=I5jf|rGzXiKP4F4H0MGc?yX5~&D@X+LYazr*Mno!~m>r^@To5e??)tk4= zNI$uaSMAcEiLq6h^f=Qu@#G(-dY9L^b7FW|>c>iH4FXc``Z`z`rD_%7XRT&=zk`gz zM83~V_8%me94zoqKOY9VYJ-e43Oms37R8*f590YI?<#)LCa=-hVMb#^81T;;Lya=u ztR}0q^|jQZPMeigalY1)O;Ld7Zc1UvL&$s0duHNXss4em&~bWSaPplUm52zyaU#^U zTJ;ijZdkQHrbdnA?X<^RKAlc$ykHdpzI!wFnE=~T*`VkIw(8`ZPu=C*t82Kfl(~}$ z7!chH00fUfKco@MIkYD5vUaQW*HQVEjRi&m`_PV2hQ{ah!aXv1*IJx+4oRsMKcOO_ zF-BZFc2iPAaNx~iZFFG-PMh_YMDgtIEHAqt2#C&2g*G{;(|v>0m2~0uf2i!xSukf- zu5pz2X4e!;|DXwRbhx?#zosV>|DKhh0D+5e7BxgFMV$=_dHOMxkDhXn7)PXdy#sPv zTo>!csZmAJVaWW9oSP7Lzi0AuH%`IHUZnHQY9upyh~7_`!7h{k4YxSpCO(pZB*4a0 zFyt^=e1l0ec9Y=`9nzt!Y})7y)%GZ|r_3Jk@u1TkZ9pYph|Z{xpV{mq!<#V7Tb~q~ zcg*Ci#(&>j2~-meQb-MHx#eu1oEwz0!vp|N-qGFPC=WB&9+NgDuxt6HXf9jE+H!lR z6q2)&tMQ*)o$CP2^)x)^9o-Py(VeG(Jn!ge@}*NgD0OVL5$_>>4wpbfB+n?${defPq?sZajA619#85q&qm?q2rv#~&T_XpiTAL>(6W=d` zV6dxE=!7$Fb`u8Z;{rozbBQkhF&z{mVMLiBAPuAQVvsB_P?u0`XY&ht9UREPE|aO+ z6J1s#p&+()xZII5c7^x7Vs+$t#vir^y6}94+@RLP9Ea|`$VH|@5~-`q$l@3ov2`0E zmgDgP{c1_L^GW7Nba|;1#=%fQ`Ihkkvns4KC2uxSA9TsM&uE%f#Xb*vx5C5Ec$I~Vt-$e$jQ4xEK?fZycU zo|6F&gIU)j<1AFa+F?*^sZ8t1^&;&Drv(vQLG#8ZI~%c#V|m5V(4Py!x~E2$Sw60Y zY3odV5Z1a3PT`PR%-7P^rL~y%w8(H9E-+V%A*0zKLzVkNk$ov%(U8IOe}ux!AwOCq zCj?|`il1ZlCf#4o!JA6Vhl;U^A7ZkL>{0`xxC2Cvt zm>xfMg@+sXP;y8a-Yc@`el06}Y?jR_OjtM)5~fh5^yN)@mtWpV(7`I*^(*G`8}XO~ zqFQSCjzNc$yt^x2f7GX;0q{ch>}CkuowsPWZP70y=tC@;OyM!s0Cwm^ZQi2K%!a4~ z_|amYEVA>~6L_gcN7ADBzMl|ditpKmV z1*f`6+xI0kLdMjitjORcyqecEAy86a{erV{kJiXoo+IDqfD#0gAv$(an1#7?`>S4i z?ECWx`SA2VE}?yduzo%re5$MSRaYxyVY965$RP0}$uhR8u5$hcShm6K9t~{axIv&^ zxlkF(`XtI*5OP3H2Fb4|i9x|-bw`T~S)@7FVcN03yAo2gSk4Po%LV_G^#htJcvb9ehx8&tcb9fn|xM^o8VGz~8&Q9p<6r6cugC-&w2>h{G zxxgV8g~2drkPFhZ-K?;x83~=mC$8Darno`t$AXO+EqHF_adNvyP{SK|MbGNS{=+$6 zIE3ucs_3xFjSks0bI=p`a0)O-ph4}b<~;l&7iwM%dMVU?BCo~4ek0|LDAu=fj8e`p z{&x3Y5u7}XGoFZnbkj&$kW?>pT)(0J{>bCbP_B!P0fMVqTz=n21?Yl0f|?uo!{`xN zrJQ|R0qS;SjVj|jNXZ-R8epUw=J7eahO*8nL3Ilm?GGZhbK!FOWO7roQ5Nl$mZ&b9 zF#T(n%2-&3#WE($%f)--;&vI7tcP;ul>;1Wu~dFQD0Me#t))VWYAw4Kd>v-@pLE4F z#+qfZt1%=C0uWyuWFehhf2WJXBj2;+ETiHy{Y6aEeHo`mF1C?auXD~mtwuGaR1`hsrVT#ma?Cv+P5dkLWejn_RA zM|DZjig_P1{QHx$D4Skb%mxQ_MU#5yf!=2-o^#X{S$xn6ElO4Ays~jbZ2*h$c;)X@ zH(eoKJP8NykRy81o3}S?^hz;JGPt0bTNHaB4vTN!VuPw~uh&nXeyhZ4?YnvKe&L;Hh%6%O7UiKwQ2w#X9BosssBuurce+cBW(NJ zkG8e)#!ZeEjOt$bn)HQN`Ph;xEVG|(kp$RJSFEm#R-2f*LO58AyijRk9t2}r&?TtiPY`jn&$1sy0*!_9>VL* z^6-61kSn!&yA)+djSKi?H1yaOxoI`=LJ{Lcw5wihSldsoScP^^U1|DNG5sEM^f0-*Uk@pNfhD6Eqd=Z%f}H8kq_7CLt0(&6SMvUDKNWF!-%?u$TwMC%`u(uo510mhqt50_C!{Y7Z`B7$&u;&k^>9GW>y|rSKUM zao3Ifa3}O!KxR*tPb;XJ6pST>e2aPET*nA5vI1!Nb7iDvwxsP2&OK2bJJM#Oe^I?- zivw8OZ5+pLx!BTatkL=w8xoG?YCkO$??f&MHJOYS4ZhGOrY>b}xXBcJiOGr&F5^hQ zMxTCQ$&k+aW&Sidp3O=f0uRC@F+P&DJ`SYOCznyN=>hmkeNv$TyFd)(YNLZn`OQwG zdJrGD^7tUsUq~-H&h4KOLKNV`tNcz1PAGhWhGBr#NmYw59w1yWgw)1TFenpDW;3L#zcu3g&ZIm0r< zSUC1Hy&kR08d?=U0(}(JI`D5Gh6)HdA_tX^cy?R`y_FBKZq5VYf$~TB4KR#%%_#r{ zkFGKIc#d_!WgN?Y$2}QN&It+anWm4r*nxX;aqu=qYfu*1Y4(atcR>)8J=ujgOUmGUW;nT%CrbV)qeL9n2xXD`nf(=Zgx{M|FCi!Fb6o+)@VCGOWUR~#) z`M?-)MmYtL_O-q87_l9er598nff290e+3^ru9|p4)n%f#@ctK`bR`;kG46~AZ|55C z+nK1b-ha+TDe)(KE%`WhyXh;QhPx{vj=4YQ#K<%v+A@kmU&D{XfmO@$yhG=$5E3hH zFk`P=W*hbjmz>pvgICPoWSP#UHxa@=EcsMh`0Mk)kPH>)4FK3IhovQk&A1KXA729i zm_-?3vD&kppH2&zDXjWTK>X1|lXvz&?lG%@6K`i5s;I1cENjS%5oro?M zrbIi&0J#O;h^GA)>Pq=mEowFP&=hcv*&lEbdMASwtIP#?cgpK6q)dm&>GWY<8&z7ICy?Fu2~gJc&Dh9(E`a;nPo z0~L!kpcQOd)3^&V z(2WsESOeqr^T^G8jXLjgrg~WZ+IF!ux!IooE$-|3 zYM6pb)oec8ncc3$`7k@+`yTyJW+kE03#z4&J^Z@LHRoMxv+_b0QnwTDRjw{XGYXd$ z#}*Mz0q&o;Fw~NrTEx3fwngYW-q%g0srs&YW;n&~5xRuy4LWpsvlpy)iXDPTx;c+> zp0(@ky{s*IVu~J65sTryhD`ZPcI?KA67qT*DP;$nL<^p@S--{Q^eABdqnOl3S5zqH zsfLh*^jaMmJBj+SE}Ah`|G#wV>w09P9VkfU_KnYLxxv&srb}0tOBHZyc*W;2nY(z` zxLjioEbQXz0YhF3!}(fvnCn>HZ&O<7AAs(3&S=8Ckgh)PWcmA69TjsK{$b*ptgc6$ zgfK4C0mQov1Ce&_8KC#k4n%>8WXmmO6)ux%*TkEsN$L2{M^baUJM>W_l_3p z-qEwM>-_9Ouf++^wmGBI+xNaM?;Xl2QD*n^4=f`8ASIa8mM+*z6bp4Ir&KJ5ec;_5 zY6OiRZi@q8I6TabZ8)XZQHLho2z0Hhr-_xJ(-n(dWmEIF)0c4c6y>ZOfe>{ACzu~=L6r^+ZQ z!NzV>in!Prd!?D16uO9AugT1mJytk}EQ1glhXJu!iI#MKcWzhY%sSJwuY+P`Ed&Z% zFl+diw;|($APy_D@yKR5w_3he!`r}T?S}2t1#wF|Y2QHi0A$B;tQFdVF%3}{Hi0d) zH$4ku-2qu{h6*nu@|)cmBgoa`I_`BzkIwKDa&!=Lz0UTgN$)`rRlBuSx^qgy?sObV%mAH59 z{n6{fXmjadu>IvQfg@#00}>leT#w3A zwhuasvM(<290s`U4dipTHtVL5!n^~TVVtwQx`*v6alU0Vb%!hFRV(VKiOSND2B;gg zyy(Iz21*W>Hp;P$a(zr@#Bjn-kS|)fKBK^W0R&@uC>m4L#=oDHwFstNegW%4RPwGJ z|0(yFNd>M(+iT%k4`+jEZ}-N8%m8rA;guxrWRJ*RSnGXeyDGVntJgzJ8V^&XNSm0; zIcp!4tB1{Q;(j>p!iAK4oV<1s+^sgsDy4E8&tHR>)H5VFq_w)ogdoyRko&g2QU0oj z8)}gNEuvV9y`-zf!O@j=%6Yn@E6}J%d&1Wy>AnfBbCzyv-bFVIX|4K@+oLh7T@m`B zYl&IWHN8v8Dq5+vM4Cy+7nBar6J}%cq{P$~vq1d@SyYX613jMWp*(rD!Ig%g*VQS9 z$(jyI2!^1$!CsxxZx*L0*gcMuWwDOE6(qDvsvd?P(X7t|ml}t1-h4F&KPbuasnw&Y#KnPL0UJeuStZB7gzM+IQlx>?MI3VzQ>&!f`;x43j2BWd#{@ zXoR@C`szL2W?fcwloplNnIJQ*hc}#Jib``;5pa4o3b{KftN*WH%R3%OfdY{% zBL?DW(8<^_HWrD^D_3pDWe}Y>Xt_BE9b1e=4fItX?oGAol@eQ0Dv-D3F`qr_q%~O@ z433Z?4bm4@>;b83oWUFD{8JPM2qFQ7n&y`2afY<=|{lJYsj+qZ|LC)81Z5by!X}CUI8< zC&NV3lTy|g=dHEi=nLn|jpg z?9<)Dc^H~1XE^p0g1!Ckam{J3QEq!)5V21rr#&D`)JvB3@ky&KxM^9~0ynK!pDi=( zC|cvXfJ}67oTMs9K08;A?w0vvWy!5Fs7?n$AxbM{lcg)rj=%uRXf^kdGJ-LbtzwX$ z6KC*P7WGSs(%SA?`F>EOwNfV8X={oVLi_R59$9bEfPu?;=A>d-0@Ya-l{*i$q1;;TL+1sPz@&k@ z8IHg^sukf?+)UQgQzTLXZ@$+4=(v!drL>bbhU%>5UO4o#BEL_Bu=W)lOCH_Q{VPpt zKIdSgc2p&>P^cc#h3TsLpjVBOqxYYXg@2s4wQI%~e7*2PJV> zYpQ0T56F0++$}uFD@Vc8H+d+{szZ5Ihv6t0f?A1y$I^SK!*Ca=P<{?L;$4Cn{_2w! z%);o)7DnO!56QISUiH_FzYWsTwarKQ%*Ajv{?Qi9^l)cQgBFaA=eZ}*T#27Z^W3nm}uJfqmGp&gBE`6z< zMRxbb&CZ^PF{gv&A|&y^3MttOKdvQ3)9_s^hD8Ye~9zbPZ%B0*Sl;fmm z7m9N|GBR1tQTRs5?z1D&AEMfrt)?^+AWwbIl6e%-Br0cTv`HtaYw`3ULnG7*pB;jY3`^RMjZGDeOqvfXj759;9b}MP7N^s&_v4^yO>$ zd90`)TTHA!AV+b93BmleJ-Q*!P7JBLAKZ{vO7PL7`P|NwHVtu%9U1ihVkEkPduE$Z z$3MpOmKe1$!(sD_njGpCZ^OH#p4lCf6()3r3b0pPY<`#GML78T77&ObQI<4dD|R>d zI+tu~GA@yE6n^a@K7D>duCk<|UX^7(7$Y59?kxueZ`5*w_N3r#UB=-^_9`W)DQ?Os zxeE0PtO6Db zb>g;5wjoZ8XICor#rO)$IN{7@`C&P|?QT;4$x6N9alWxVPMYjb2_A#^?Do4bQJl*L z_>mID7d(whi82Yg-)A6S&ci?U6~dlN!MGrQae=6$Td;D9{`f8Q z*{1wPN++y<`>5ppTlp%k3s(Ax=TfVAR8Ex?@8Fq9rId{Jn3|9>QE>B7t?Zu8)h^8q zW`;Ib)ioEpFzHy0K2qD5fe!7)8|o;|MUV*ri?2BuqtJGMvo*Ajk}IKaAB}=OqqyYU z>^~jTnATxEGF16%Gr|qXF#-Y*rX0%8mr7A;2LONbTQa(yC??lO6$YYBgKI%H+RN>e z+ssg0N2}B$pcGoNAI{06>tUZJ*K8nluwo$xv5wxDw?di;4VS(|j33L8M%_bOOeIF3 z<%QYYnShpiswFVCoGHGlB~Dq0C4pcjAawgemQUD_u`@vc8U=EyA_rLHfY7VlPxl?7|j_u*QHW`-o0%I-c>j+tA`25P=mb8uW-qf&z2=cQg7q)5C zft%E*L-SjjT#Vi~g?UB5JVH-}VN6^;@Ag%4V%yEl)RgB{e<;(K>JfLftj}E|O$o%* zcBf`xvWxq2+R^0dY88t&3FuT{M?Fxdi<56H+W*_F$((KKT80Ps7K zPC?2vU;wH1=|%*dLMqho%N|K=D6XO#Y;n#fD?BdG^d;~UXEi0s7JKB#s4nkO`9-O} zB#FHttmrgzm9(6q-R#KCMYyI$xVwXRt@l5d?MT)(ia*XXskKtuiRJb-u5N&YaBC58 z1Jf`Oh~+YRPXnBd3qH3*Zp>X#@~Q0Pmc$qaga<;cM}?pVMsm1)?1D{s(+X`){xU0f zLp*_CXUX&^>AVwpy+U3Z(~K2t(=0?@_RMWK+&FXRT&gs9oP0x0*~VNwECj2t*gpdPaI?gp*_~xLz7NLs>IShmGEpmo9N4ld@-T<*cMHWJ2w`>0SIW?b2zBUH} zJ5obfLwT{@jC6@E_r?Fb-DPHE9%i;FAqyJB4K$5=yqlj}=>rRrW2IeS6D=LRPeY5g zn|==^(!9q;dIjowa|?j&>O67F5)bgS8$I&(Y~^d52WhOyuzOlQlk$z?V&@eKv({X; zeHtb@O>3e*3d;0WUV5OMScNB=-zC++8$P3GAt8L1rrsuqV_=)*a6ha+@jJz{nO0zv zS6`N;S9F8@RGM_q!PpnkDD6ns7q_!yJrWX`sCfcQS?!K!h9Dhv`}T;BI!20Oac%E3 zLZe}9Mk`~p!{nNm_t57={S!HuJZg{yQarCC6V}vVA13pJZ9)IrKIj2T??ev8&^B4K zbG|&o%a4YyovGQk=@b7gQWzRm=H|yivY$eEw$G#poie>g=JHb%SczS`RTgPl-LNn9 zH-p)t>~l~`B@m(i2xOYBgszj{hfKGsdYhDuXY3ooeEh;869s23C9vWtP^w`p#FI%` zXIqzwTshAi`|sOE3D)!?yeQwR=G$>LV|rLzbG>Xi#MKlL&2TjpIB#7fI8?4~Qq&-G z_7WWyD*GSk*Oh`R6x(E_0ZXEJGlSAx$%mCSb2W=v)Nc8`L-VDICMmvSFK;z^mc4;- zq(;f!MGlOb1nxfYpxm8xedG{a80`j$?Sa+KxW4hDb=>*g_7D^7VO3FKkF zKbkT(TSOHKDjB)nl3UWX%V_0&J)bVqrHDn8bDlbo+e%qXjl$mG`b*B5>#}*T8ZseX za!eyuffQeuOBr6As(6!q5c%MR;YiN=9_<0=~`=hRo|62u! z&pDPXbh)(XT`zNt$2^&0jy5dcY!}=^dq?wnuSn#7s3Tc5d1|Y9v(Jqqfm6-_OX7h&-rBq)xukE;Y9)v1FxW z6GzB^8mAQ?Y9=9|M<4}V7cZprj z*-PGSUzW$46{akejAIf=z>GCQ{B6Dbd*+8E#+wxq}=@#IM^du3|a$WLQ0;G&%^T}3q9z;7=<2h zm{GV+m?hdBpXK}JOMggn6#G)}obQ_(;E=!L_@pA>r5)Q|kU5hQh_fjHwe3CB@%be% zwd|EQ7gBUOn;xthX1QI?7GCTD)^xPWm}b8IUe%r97)Y=lVH15=kvXVuM-uW;0$qD>Hang8 zt$Tu6jZ@#(sM|aK0~w4#9{**@@hYWiT``oeallkFFNiUaCLyJ$fmp%)S$QZ+Li#av z!6^Y%urZazJ#Eon-hOY1%s2s&qYXz4lG}~?XXJw3G;0nfJn+PLgoDTH9*GxFobdOY z%NvE(D|Wh6{l7Y*f;2C9C#!Sn+3yy;fx*By$>Kn#_l@43^MCz(*%X)+CgRz_uc?>`d2 zPsgS-?++ueV$PFZ0))wS#J9L!f#S-khKwCK8LM}d@54)T{iM`7!|8;sR4HuarJdT` z=&Py(ZE0)H!+N*ck2QYY-GdK(&`f3DfHJAL%4xX3#|)KUbOH~C$>v<{GEoQ8;uw}$ zJo}W6AOe zG_Lv|S#9&3L|gpjGTkTrO-S%oJM_Fn08o_++xbjx#xoG6)1VtQr+QsQ2s9Vd{gC5$ zqLHGA(KjfR(v-c3V3kgZK$WpB2L|O!`s#91BE9^DjoUx7X>8L~d&nwQlgs2sJR9s> z&mm8;(^;>6(M35Wn|TJ#Xcd-d^Cdy_c2Yz=-sT`-wm>SBmzB~aTNzz)1jTYorY>AI z22uTodLf&Yb^38+1aPf}#8L@|vBW-H^;e{F_hO3E>^7Adh{Zu(Qtu@o>vb;5B^7-S z(Bm-xbvR@vg&X)bMwr|1Jx5Cc{E_!KTbo|en{MtO34t!oF?5A&N1Zs%MXkM3*o@yO zwZuhrjD(84jj$mw3G~WtL3M9+G@(xh$VcjRzB{fClWfo5Eu^KB)7*xIzLTE?p@2Ao z6#C?IbW)o)H{P5bmJ>}4?e;Di0!36S_vy}g4>_R;X6%pzMm@z9&{XErD;#olht|(> z%;W|%V>tLbY$$%M5nwvsP(G`|(NS?yyrMpS8z`US;1)JjoAyMGxD`3g7~YhCH^8g_ znn!-a-JSgbt$Uja>_RPRDep$cXsgXyErE2_Foj79+y-CuGm?o#DSjttAs+T4sO8vySi-0oSBvEH~OU1()N|6v{qiBa-L^gyyROGZ+eO!v`qGso& zy$^1iR}qV1_$@(xnc;UMCZOFt7#1M+QA=Lbn%YCTmSL3>2MLBRZy^@Y5v#cFNR`vl zd*x?(k@^a(@YHZ@5ug} z0N=u(oA&CTSdJr{Mpy3?D)b4|r;zfq2~gh~$q z|803klRUD;a?t-qKAmeV$nyGBLQGX=WeEqb)k{t2L*nG8B$fKdn2- zP9{{9AqodryQmTHdpd4pi4A@W03Ql|=b7)uzsEW<9q>kD(!}uj{CgSIw^w$>^!~_0 z^S!Vf3p>JtLmA#`LU+d6nhAxQY_P-qNDaF9Rj#x%zUz3~f=)DpweBw664=OFUC#r7 zn7`s%u4HSFB@bAxd6Wsluiwo<;$8+Th%BK6Y7kqFPz)#K_QLMQPI;xxQzaYYoLG_k zw~xH1R1%%?x5z-6C!WRH!&N3~(ahXhUHv3u7wnc}nzqUQ``{6;m#3GLI{2kHH*2S< z-sn%Z$WK>8KZNJ#tne`-gqHNxY3*hRuBw7dhKnC7z(6!sgf?(jL!2 zB#|!T7E_qi-w~uoF5|v=YsFHS)Ew2!Yb(SbB4_Iul}`yDO@graD>r6UIoLfH)zN@2 z8<5z28aU+krm;*>{S$s;2O)~kqcFe9K~pIW22b${rdG4O_q#Rp#d21)d|E>k1-vbR zTDYH6*Q;;&K0B2D)?NwLubn7*{n!6%C73^7J>LUFao|O1tA`mZS)Pf>5l|T#3^)1s zz-G__viqb1oGWPdGSDeJE+o65%0u7l%Ss$tJqb^hQE?^d}>dh@`&Q~|eWB6-8ErKEU zaRt1F^`T$3TGxI6GCmKQl~l?wpMg2_0t;=)P^SB(o$p+QHzLz*l&MBNBHglbYcm_L zIfxu%`jVMBIaZDcZAe@p!xkzvI9#OyTgp-|zQJ29Tl1)FE~t!E8V(XgHyF?4Ko6Ui zz*Dgxg=8<{Z3!Z8I}p_y9IrxcQv2;vU`Cua8SoHA%{n!}F^b9Eq``Q`X*j-M9SUG#)?zV*dqA6ea%MI=*m1x9vnr`3tHzms! zD{h)*_HQgkYAqR^0OLv&esT(y86Y!M+k%)Mr)gso`encfW-0TdeyPrkHJRhqWM{)c*7`oqDjlt{-(tUlRsd ztQ)KlCdD6i09$g0CE*O&ZGvmlmhPTj%nyYN!#{g%D3d_(d9tY{N17eYGY@Lel zx|k={nNBg^GV1#oP~9ONE_9oPZc@I{tR&NBgjKCspg|qVx=`UtKN@H9sem2;?H80c zyf}k{il?_Mg*kM$3d(FVqU8qYqQf0eG&f?ZTXCth0gc@I6x)3_%lXx^u?8Q22m6Nq z(t@B^#otR#UMWMAlNuA1=WRnZxqzzJa1B$Jd%M$c_^fu30zg8*EH#|3i!;G$@CMtY zY_pHICEqO8yHdS%KILQol9JOqLcH_i>}ZS0(*x|yv)JTrME6TpA6pu#E7US$`CF)1 zv`}F6*;+K2Z(|L6R&=2L8xn=*WI9-`UR(Ihq6II>;te`5Rha7+qq00=m>gwNaattY zp6Aw|Mle}YO!-y&#ENyd@hB6uFUH{X3*8h|^qL#)nUE3n8n{X`D9O(x7)MSY)0us( z5e&9R^EK9VK_XrcRTELVF19Nt6ocx9^k^Hu?q@4)vor<3f6co`rQzWxzUG`d8I)DRmj8Vk``27qEw>)e=0Uz( zr*I1axwub1#-4f72XhHmES3Pht++zy~_BU~`{hb0)$CYQL?V54RF>MxaGiXSfN|VO&Ul8_Gm- zDQ~U?kVP9xv_rwUG8o-4YNwupw`xAR`~B%OJ6%)^*aMfJr(<6BqM8L9?ZMc5N0f?i zdA=g7SF4#(49lzNiw{q0ZG4P&x2Yf8ACw8&SxmW(#=ml!;^pXkOXN9WpULJzQW!uU z?q+#1*vg@7*Cp;6A1u-JXr_lvAta zff{UwEazrUEk!mrzmbE`B(k`-1HYzKs~-+D(wf20sA5y>;5(C{Tt*VtR-A=q)zfG^ zDc;ec&nn2YtTMY|OrVA`mbd$=<>&eM!f~0x`SdJh%|arF-M#;mi?q&5qlscZgtrL4 zFgwodd}nk;3|{Hi>M-#O`3`j-XRljFQeJfq1yT|xQ~88!_+p^>ou82!30 zfNYfWMz{Q(vLcJPZq|nN=VfRUPP0J@rVhoTJ!ChmbsQ%Dz#C=6Q=w}ezsjdH9a<26G{dR zvf5#ykwLPD{u*)Hc^nQ*Noxm;VZ9!1g*-du3NzKE%TMm~^QpeIPPDv~{(4=c!Y}Jx z6kn5&lB?{O(<~Xftd1tm(Yi>5`gux1F?lKqf-RK{f085)9G1lcmPuEuoXf;p%wz9L zn)46O3jU;&H+LDtgZqawi0p>naBfo%x)F`NNY*YVj|=-8Q-^L`tHrv7!E#yi1L1OW zXj3Iu*_BcoWo5|L(vCCanvmS&z`_8Q5F?ro_;4SF=StXJWg8rF9X*Krs5>stF>+yA zKGtF_g|Z-NT0Sm`%l$f{v&i&Kan>;KUI66AC@(sk(8W=cuEyxU%4%KYS{SlPGLap4 z^mrM+4Jp_UBP>l;PVQo zwQ#njV89y&zjLL#UUvdN-Fe!sSa?*u+WUo~=i$=qm_Hu7pV`--m0X{83OLDGq5 zoA^6=cSvW?hmJl%3-*RIU)qH4*m22gs$+%%QrC!)Wd-Y&RA}!@{w4mgdGZh$qF_6I-uZHx{ z<~{1$v@;ys;qQm9#qNED(PaL{2Q~IB4kM#&P<-4ds6!>T ze(;J(OD?gb?xz`o=R*WfJV81a08p(_q!(xhQUY~fla=SP>1HbJzefLOM#v;!zMybu z3(?A@w~+r0m*uaLh`HI|iZo#e)1NJUsvWxw9Ne#X=Ut;BCTq3$xZ5OfF4O(#cz%J_K~el@!-J! zyzAHP%O&_^I7Gb@@r)Ghb|j^+QL2)vAjXHB$=%JNdMrtccz+Sll22YxZdT_aH<@w* z7w!@tzLBaf7IDbQZS_kLiWJPXyS$mgM4PY*RLyHlP6k4t7Go^rR)8#;<;S&THA7{2h=fz; zTH|=S&kuG%{4-u+ejP?y%_hRdi{7RX@$2_ym{51)ykPC&w! z$h3&GMpE{cbf-MN0f=JPpC+3X(`f#X?6HFri@A-lypa z8KMhDO~@ikd7c(VZ5~_Q+0+ZTvT3qM1_(sczl>U!cXz3Zyp{kSn#jY}7Kc{6DICx& z=H0k_6%9^yUM<%m}U{Lr^%-73TA~}OB!)~LBYE)m!=t2(9-Q_iz`1g zS8MO)k8&gP&KfXgqw5hy%N%kXdsvL`m_Av&7iZeY3yGvQ)@-Yw2jEQHMqNs#Hh~&l z0xh_UBU~n3{)pLUs3Tc6n>?X0tq2nV7u#AeMK1|g*0fw%(+`xnnulL)&?;NN*I#MLOzzQowSTJxLd3xy_la)gyhK$W z&S6ux+8=|Ub;``p`R@qGd@A3y@EW$U>@dr>Y0%3j^S>8*CcETIOSWjU+*N+XDslBJ z974%PpDB@Y%QHa5hg+GwCadrI7Q=TNv~$8tujzsXCdI~ zETL$#LL?a>(wReBybFB27)~)~ijgv{yip2o#&5LU6X#uYzrs3;m$o6>&I)C$rUc{` zM8^U+-uJeQuE4x6ts1jRx(KS^Z^S_9d!tP9r!@^7jTksItmgP{vt6BF>OZ5oGXn`D z_62B+c8~yYq3;4ArHupjzz7^?L6r}cnQGc;TnU-fB%V}XPG9^=-Laznl`XH6sB=Gh zO3ea$ng@E%-H)!Ln(Tt_z?v#0PXGU@HqVKrnk-%!ykixT9@nl=mII#vWC`~txzpuF zhmPnMhgn3PtleDSx>Ko5?pvr*-T~(O8ZB@87R7*JFa&yCcYQavPDPM z45jhoLw8^Lb=@C?Muzq(JMJ2%s;T&FgGdTnwr*pk1V73)A5FwNO&-q8J6H-Z+$XOh zia~tLz(mAbP#3*Och6B4o58M>r{?BX9Px3)706>WrH_~FOm()XJSIJhJf|G1O%khGdV%xNPHeP09ZqowG&rb}ua)gpCvgwsc~0{W z4{WmQP$u;NU>p3r#4mlk&Ou$Y`=_b!%qF19+z;(!O3OLu==H@ z4^-RKNY2?`+8*Avr`j~`>rY(rT$1b$7vVu~&%ikc_dmG9X%<*g9dR{~+MR}$Vx*$kd+kdB>B|$o87gpJiwtbCJPW`la z(jDBeHLWpe&3tuicXM20cKh8>lC4ne&)lT6*?t9WlJ<|@0%NeuuAh?-+hclq9j?GA&Wm*q3Y1WR=2Xnw$8^VNe6Ml zuR;Hizn{H0R!y;0xqofxOZQ%Ywgxu6r_!O~+GhQvo5irmBLNdU75Cj*P_l)oy0h{K zkhU5e-p6I)U>yxssuh+qC1a(aI^~oo_QPr4@3bch&1Q}7=dBYL?gBuOGW&D_ z?1C8#5ls^PQ3L*Dq3Ue6+sPaAdRs#$@sSc`<)}{H({AZ*)~QO4$Rr($hSfBNl$z`N zoegT)#Th4$G}q^I?M6;Ji}bxBl(^O&?%*0S$g90^VQ>g*L1Jl?+@i1r_ihC#QCwIr zO;ESlIc%ltTO>BH2Xd42%KHTz{IP?wswBUXt+%nvVi>W+mqC_OhV3gjZUZfv$ns-6 zk+e)ujFP_w;Drf!;eDOBJ>6{#TKy9PnDbEeLiXS+=4szbpkco0$qjfY(wF5k^_uZh z^jxNCmKveU{84tZg26x*C0bhCGdASJW_qXkiB3^Z=eQ=G3oEn@Gy6k;L`5YB+q8B- zntB4m$@b47v>!U=aZ9EFB2|rd90=TK`g#i!Yl2y8$iPU6owSFH2+>~{`K^@rDEg$W zx{Y5ho6`2S+ffQwj9l_<}|eE!l@mN@J6&D~(x6)MYPkRbe%Oq?j#mdjWzV zd3kEFoN;9ab}E(Gf1;kIr%^oCh~59Y;Iv?>#a_;#wK8xJ)X9iC0wWI4)Z?mfhr_8t z&h9fsO3C%V!rtHD_$$3$;)zZ!adPmeBPuLgm;6sBr#_7RUDr9J7)_90e})7(3oBbuorEV87rX0i=8Wkd+VRuzh0@ zGArq*88APdYIdzJk!`mhg-L0YcC03*+BL^*h1sTgRo_;gp>Y?v+}E9pw8V3fC^$mx zTvcqAEjAld(87FAJD7`P-E#H5_Cgbb&njJ3IlO+;x>l~v8EnF^TMrg)@=F^9PUkBK%(P^5DG}*3$&E(o34$L>^s9lclm%6Ngb97aM)s_Veyc zx1FECBu}zqTLX4g(heeNvTbCVMGTV>1T%$P4cmlDphwD4B_x9Jj~JmtRbz4)E>DDi zwt#aB7kHZS`B@A{rQNBRrOv)YcBf6Nz`v0sN&@+tihQN)z=&j`EA6 zZTMN(twBEfl&CNz8wm9CKhkTdWvOk$-EJ2O{+12%X1-)Q=W*UybYEcx^o!ZKp-32p z4J@|n8~d}s<^1FV8@0R-cU1knn2*pN$QiA7;qmD<3uLJtSAn?ZMT!wFEgFW3To=rx zdB*2-;~P3qdR&6aI89Rt6DcUO5V2xYR%B0hsTbW0yB?(daBtZQ5pJ{ctj0f0h=(bJ z(r~Ctph0bmG8xaR4ryi)OMT4%2S0X`#t-21 zm0Q!)Kv_lJrtFjzP`M%lgzV52_M2i6gbyyL(gfaevM7vC`K<++(f(@iP%uA-K+NI~ zvi(pqY|p8&Q6nFi8%zwHLp8jIG?&|#bEL}GDpvX$2@QOXD4ElmHmg*gyh;;ZT$K%t z0_eO4(2TdSOJj;)+;c@ovSa3@PpO^F7a&~wum_X-&B92RPs{yxRnAGN1MAVsIkhVbqU>&Mf!&VI2md#$4|S@LhblO%!Y}w zxda*ismPl19J>7&v-F`IuV=bbp%IdZSk3Rqo)de7r{V32U5Zhc;?hUj_+t&LUIynR6A7c)OcW_B^O=m*b=rgk6eIwNTIuinStt_J zx|8iirY%7+z_&QB5Agrq;2Ff8zYEwcSps(<#$7oy!w0zJk*;LBP&X!q-7%03&%{g?x8Y)8%)=yc(b%x}6rEn?g**Ymg^=D4(7#;r-C+8ePL- zXBGh`Vi>mavr4>)l4PxGFdYJqFWCjtKeX2quFm0yUvG7&E1T4f|Dkz-J)RSTSbw4u z!>(0@?6aNMix*X*;W?3~2}3i8_4s;-0iV9cT@Q#wo9%^qw#k)+d!3LD0Lw5^o0Z&a za+bnQ|DHF?Y80NgCuo%4e6U3wd+YZ*H-vIaw3o3_7Lza zIfP+SECc*%HQJtR>BBzzTl+JQlt1;gT2g*U=Q-}?{|(?&9_(aO5LRAcPY1GDX6-w@ zYtQhwglju4Nqr)hgu8iM&s3MMS9!yf)n=nle?j93{>fsmLKeG3p$Hv8d8-@L>_Rcb zOBzB*-qLXdCZHT&=>z*_me=~w?#dvt4OS9Kf`a46?cLiJMxglnP=qusTW4DfOJ`M` zL`6@D5&d{eXUn|JZCkn6KAYP>LTAR+_uHEixvOj!GrrY!O!JyhoM5n<3zIK(pi*{@CK-+sbM17n60t~=`w%1`$ zpp(;zB6(c{hGN2?&*{VfVJ;8;-@LrfbHNW5a^n_ziv+tDys_}Aueagpt@k|>g?2U{ ztKDZ)=(s;jRARog)h+eKEzn@+4_O(*Y=)ZAqZ}-HwDW7;w6g#l&>5fIg~_L z@H+o`E=oPr(VZETh@a#7(du0cupBHx*kX(Jm<4mT#1XE~PTqjOHA1)sr9vY7*cOsR zXd*zTnVfOU28G>EkxOf}dj}v>)OOSpb3}di_cl%pet9cC^h}QbkbnRXu|Kq^Y5^vy zX^7iY--mVrt7GiRPV80XfCW=M_FkSTG-#~nQHP77wkO5+4vk_tZWl}fcmm0~vV+m~ zwmmJj?spKfT;_KX1j{ndCINGl%puki!2bQ^z65XkOJ3vN_SQmWylOv-t$eRbm&X*^ zbz8+W9&n=_hXG#!;ZWM2g1pQ7VR#qbO-yJab<{PeEdpR2o#2$`N|h|J^HF+>ccuF> zs*uH{_kz6j{Yo;NX(#wMuWjWQnTRwYXLfun=eGM^4jt|Ue`EPTy)5NEt0C4iysyVL zG%#2cA^bLIO0?h=;?3X`mLnP}FSVF!%m`)V6>397M5KG2=j8X^lF^v%u@|oyY6C)P zk>OBaRgxd786Y`5-OcQql;r`+@+m9N0irZ`nD2#}=aQ?$6PI)IWdJCFC}(-Jkv4l9 z73xScN10bAh9{zCQGawci7?GVPpDS1#+`OjI?JDs5G@GfEN4PW7^&LIXpUA<*+H2r zB$LjJ`0aNsPWJvdjRPMx%tlKRY-J?MK#-Cq`F1@`Zz3F4D_P6 z>=G2RT&=HTjzOi2X8}VNt@9cF>xaQU`HO-i=@AO)$Hfz)tIPgeZ~sa- z@BAA1KQT1Gbu@U;r7BZL_u|VqKMl^-==ejMl1A*a%wW)fJ;G5HI+766z6j|}`8znkP4F^#juq%?)=ay8m%~p#X4s0ZQUat#*}!yR;$$p z|63JX{6U0SPS8Hm2hUP-wxnNg8~?xDLM*&fd$mFx&SWNwjat8X@OD>(MAr+X@w(t2 zL2h3~q-0b7qJ@C{+z^B6L%_6|mqHk}-Q#-H;ehraHdzKzp!9Cyxv<=V4F)J5E_JLP?5Z8TdQXihr3zj${( zpd8f3|Jfh7fx7ZJ}c5vK&oSx6JH1Lahet}WfZxkhU-N^JQw`%V*G z3jS%_XwWvHw9XfIqP0fZiLIP-90q^1ihqudaH6t+k z4tqa^xA{}&-mT#=a#ls!ShG+E{lvMWTRHP6`(~#Fl)WG|c~c4>zXn0B*W$N5Qf5~` z9V9_>bs1C5k=wP((JOliG3j2l+Efok>^N**yS>osWx!SoIi+fBWTx&_0_veyt^Ea{ z{zc4=fci5~@MDEM)$|W~?#k(2QRN=if6Dz$*vg$+G`9jG~6x*xzA_wbu?>Rg&SfN^%!9rNvgd8jP>-rop3If3W>T#>D6 zhPff~8u5sA#NLEYqk3QW3;D8MWVIXMRqA8A?To39IMHikZWhL-YDpm{>Biio?S6Qq z0=-CE^4~rdVBtkQ#Fy!^a^~Rg0W91oJTQ5A>JlAe?<7)oAWfEuHO%fI!Lee9BZ-xsVa97BV@38~OB6aT7nv`Me^?`e0j4qRed|YjE>`}*9%C?k!&mPn;@z^dxE-bnKJWxK!QUzEkzvcZO{d8WZ5f7Uu13vJcz?g*F6i#;wLc zI2KVco6P>vv%8rd&FyvorAGFv*1O|RbGgHP_JA_0=!jA+U=;z{I6Gn<%{bt`!CTvyoX0m4d@MLvW52qVrP%ov z5PA;J@H~3SvT$KY>{+3GVniF2-RS)>;oH{{Xmnd1uhpXW5o*uNW7R6`YW}dxUaPlJ zJ@(y<$Q`MX*lB7QS4_2a7yB= zp%FnuoL7=`bFw&aqzi{{uK?q)eTp1y-nHDhZG9zKJH=-Q4Pwvn8$BgAJ?RP^A5oL? zo$8H+3+rg_Qn$f*;zCCc7Hg5e_(7JKda|9^fhQnm<3;P1(1PhxvSTG!cm*irbk2jRb61a{=bs|1fJN~!5{CA#B< zyg^1mq93>SQ^C(6O7Ua{F_%}-l+kA88M*l9KKK}Acy_`x#u$*=sbmKqF3Nhyvs}g! zCtwt89i^hCryH{&AOxYh_7m%GP>2nEuKb2ro+p5d*msb#v%o=YLi5(^6KO6GXeN1l za?IP|t5)GJTgeb-{@;3Dqe_)m^54pEY~L9`Ql81#4T99(wO?Q5Wq7c5H-*JN!?5~5 zr@Rlm+9RI^PupRKB*Z>S@Z(C?_)@zpwCz3@435>3uc`nq?2S^d9kwS2iEYQfVPPD? zAWB}r-~&R`Zgs&RJ{qRPl?|UNV(|3ivBLFKVB7R=uHwjXOj4Me0>UO&^uWx0yuOxQ zb{4fv8|hzCp3gmhq@k_xOqv55tnKz0@8oRX7mj)HnIC#loQ>9SEKvl*|?qGHZg6J8d_7| zx9!&=!!f?&Z9E5*e=BG6? z4_lXm<$fq%K7?~stsYzfnPt5A#@19T6YPG557X+Y1+QJzPixx2ym$=wl=)YzXYGr` zV?9y!NIlJ?v!-yh{H?LWJUHD1rI+*G|KzCnZW%b?jX<1lJ>OH{`um&h3a(Exi>`mP zJq^?Qq&Hg#_nCkK)=yavCoRXHX16Q%U*Is1qp0HG&FXAz1Db_aJ|d?9oSwa-n0(IV z`AiH|T!L?i1I@;<+nmd@p3&7PVpNEyHk%LzuLk%fqs;5ACS2sQX%v`5>`GL_wc?J^ z%7Yw&%&vhr-|NP#jcWiMxz4MOMjYI*ypNYhm&B|b*IAn314`ft-Z(O2zEv%J1iy+Y z#|398dhXUa+1@DB|2u*D{x)2X8VW%#c6-JcZjiPIT5WUIUT(I*Ovxfb0H(@3XLIiH z<{H@8W-En@GA~BxR#id7JP2! z%abBsVrTTxvE$!hkM1HmI^FJBJ|Z4p4f(1&U4v@^jYok~l9{aFH2)!~+Im%-Z#@Hn z2>4pLXH+&;F<-;xP=EV84ecjQ%_-Jz9*FkCKPUwd;&OWlBYP`365NH^oa2E8E?#bX z>h1m>!h%Y>NL2!tr|q4zrMX)$OyaVIyWSoxjA5;SU;#y*Y)FE~!+}s2#SFypGxCfY z?6>165l9N7<46jcVvo#w{iS;eG8L4SJ_Bb=9gp8IsptAEbAiL~OWS5EFH?E%J6bTI zk=+$W+w!&4A!?7!`A%KrIPBkTvSjBCo0j3EKeOq)to@B)nL?<(o&c!9f8-ba{b`h1 zW6FYA2N`a&nGQP-`8whutT@cdXKO6Mhua85!oyb~u`8B)BS0<=*;Ld}%HD*Li7m_Q zi=K-&VBHbhzsDYp+hMqPWQSxkQVAqz1m^4s%S|bdx3!K0#zC%4a_AWJXE|H zb0pk#*Qrzqd*3;-Ar77jS<@T~=5el7|M+WhKDgdsZaqi3Y~x}A&8#R)I#hkGO3VS5LMlTXx~u!m4ANcTkQtVn@y8hj!iD4A96 zD4Ve*8>}u2ft`%MlEYWv98*-v5NhM0g8bWnLqJah+=|X?w4)Rzjsm3f48mLW*4|^Y zM*_j0!gDY1XOHDDgXqMags~_pE(-QXvByneo8VVKV`x$ccG6OGVl@JNr7bCzC!_~! z@r;P!zQ$|>r{vURrUX$V=A(7{)qI~Ee&-`)kG9`(5+Z*N|6INzngay<3Opn=nVmGy z3DcI!Av}Oj?BC5;fY%F=%LO29qoc&`lX8(q|d%Yw#&~<>o6zz2ktM|{<1yT((a}3Pys49oD7FO zsoBq!9IGNl7mrNT6kNMmaD1!w7HtgEh2ZW_?Tp(jz-EOtwFm>HgCaqs@ijp^55od` zRy@9ryHREd3rKNsQ!j`D#6%;Y${ z)~q3~oykp>6A4hrbtvR84s2+3Z_;5oqJfm&J3eC8D%<5Ly*yM%uLFy9dHX(W#QSzg zCoa#e4(*yqRdLQ&1iJ*>qx_(t@UGL4VN#GFd-vJ1a22a{Gp-IMj+5|J50!|?en+VK z-X|6;7Q$2j280@s&=jIDhC-Mw&DWmvv1w`Z=XgEn7Ymx`6YjNJqJAL?qX^*V3i$oh zy(o^*9S7v(v>i97vfWaSf}VQ~5Z;aTqCA_)HP^TDMUuT3U%I{A&bncw;M>qcHi06# zSUk3!XrS(PE&s~0Nsb;>!79$c(nV&LR0A+i@_GY__uQFQ4qWHSRF z1`h?wk@JJ0AB_}HdQ)S~WY%-pp6;Gq8C%2 zm;-W3X}$H7Zw}f9;Bqy)zJdwM0AI?`1A(l^SSWDo5qybu!E7C_dgIynPp!7Vi)HFm znVli354V8t7VEK#ZH@F{yb?xFQve75!1}(A6jurf^bpr4`iqYBkMdaPE zZrqo#3#xw(0@gFK=>%*$71?=|L$h6$<|U`t`%(-wjc^bZ4x8O${%(^NjNBW?^k<>I zH`02XkGd*e;|-(wCK?&CbjaRy`%bSS?a^dM65n^g^yudde%ot(3~t`KY4=q^mMeaU zEq$Ho2k4M$Tkmzw-_&YlUGnZmX6`;{XH}qY(4tEey+}xmUi=Yx zzaO~e1JN#Y+D@{vHf0r_&%2tyo4^$uWd{zEy3FAk4{PyX!)qBdWP4HKYwabUUE;%G zlemZ5aIa<*6eQ_@1iMRb1?~{s_#%Hi84)UNwhyQCvxlaYLqM7|wWxd0X5_p*E6;Yv zljulq&5Bcz$5bFsVb2S6O7cP|bU1(YIaTlfTj`S5V6Yz2l&&0x$k@}89W+g&VO>k# zW@6LxkZHA)Pqegs%O5j;0~lV7-Q$!c<<0w+!F=5go@W;{LCErHwk>393x*aS(M$jS zZDe9|gy>bwGnIVZAnKPGLqn|nH6v6)<7xNlb(+Hov=601xAS4P>w)8kV>{<-*x&vk zx6{+6tg8k7s{*K0U6s(XFXKB9EgxdH+Ydr4+<< zs>R=iPM=|RN2SGzoK)zGLCnbpw|0Dllcv_<0V?K_F{!rix@w9qwY$EU)X1Q-0wYbO zu`jA@NssL7Z&6A=bQId#7IXc`YzmhU{+NBmW)$q}W;OAJtx|1O6>T=LRs2H`;S=+y zSo~#<^mRA|i*X+ViXupcT4TDP%*FOD$Za{r^n@z@Rbfi+e_kX^t!HAZ`?CopMcPP_ zck}Re@bFL#t)NHYJuMPh0(@_x)Xhz#M9{>KZ=CetwYIGGaI_`{g*;`6!%-ISVhqtB zh-5%Vs7nh6ekfJ*tW?bzyKs}f>Qv1N8Pqx{;B|r%EA7l~xOI{}27q#6!mcmcQe1GJ z%vFegr1!(hVhx=0zdL=ZDcw(&k}9)-4HmvSLmS=}nX+df3(}%YBkfh8WyC!!jYeDUgCuo#(mZH2` zG?bF?v?SQlir#*>MEQ^1U7hqb{gSZ$xVXhyYz*b4KwBytSZFs>)`>OpzsAO}M%z@l z{{k?~;FGs3BXhJ;t(yM8t_&Ia(zyW(5bKd1MghT=S5zj%VR1*h1 z8rf5kR)q32w9-hphKm+OTx_|Z74P|f*hJY4Z`D}|<9hl{rF~cMyIAQAzx5^bhvlZ& zk8}8j*LefJA zD3QQrtCf{w%y)hdF4Bta_REKnB;e&o(Mk8OCf)0E3)W`$j$LWgLto@;qYefVbTV z9}idU34)Vj!LzwPYcbf(7yD$XuM@-8<$rPSP5uh49&x8`)F@s~|-)D(%zm)oDyd`9&vcZb_rS z=NVFn|7GDGLZ}5^%>xd4uEx6=jSrCQwuNmzyN2tq`j~qNy9P4l!m4t4Wdu|CG}hvwoGr`QZ}=RSZpG_J z6LbKopc5(c5%nkILc2mqS`$)*wZ#~dGWzIkTKDCAxa};Erat7wWLIe-Nd-0osKb9D+UcA2BYY43ydIrlgLYp# zMBj*-Z5+-dLT>NTq=fwhwyqH@<1#RN+fFrR)J+xuvw;&7s;%_3`7j3|xvP`u73syi zsy}zY*^x6L*`8sjHYL0%Y^O(P<#g4FRV*jv-rpIvdvf;RfPWQrwGS2RmTP0s9`pJ< zMP;s;!`HzbV3Vp3&?nWJ9RGT+S-gRCOkId}4rW#WqG4S@=lAVh4lTASkqVPCquQo8 zlkzP-d+%^z4NKZ{KRjrD$d09^vZ)H(zhoLQ?se7yE2TuN19H5_YN&+d*k`*Fo@@Wo zNC5{?nxfeYtrk&JoW=kOFHXbNf>xdqJwJ!lZM6vvTQ{{~4NCBgr#gXK+2=~HUZqLg z3(`WH_$Vr-S(?K~3}WBXe3GDT9I$D*lrQ8{`Bf$Y#nO0LqYLBIdKCVIJ{F@LU5wEZ z_R8KEt>nYtA;f43cZtysL`p~XAV%cd^I67=&=zP1ZB&eQN7&ACXslHSNTyct|IpkO z(8FtsnnAG$lV;T8S4H6Osf0=-FSnse64DkyvQVzk<%^K&h4-FoXw_GxZMI&RX#UZ2W9_VAmS*9SSfKED#pN5Tfj(_qdu&| z(Qu0W6txw78}K)HNHOH z%H5*ps}ci%V&SaYqWAl@C|pvFD(PXC6hGJL91S{@Dz$*(=PVTT^zXB{$ClJ{K-QM!?MW!JmPE&ac0z>U4o?6lqd1Tfc9CyF-{~Zu{by(=I9=Ax9zx|& zs37ogFgO!m@{4s5s_}jX3pkQHAz5%XF^-? z%4;Z;E0ovJnWOR=p)1JyCAdAVDDhzFt5zM7WW*P?wFm5nVLMgw4pg=fI-zE6^mNh~ z*s&8R9qF zkexZWy$$eb%$dB>JQ;$K$v7377NCg}5i%|hs^ih$4pvspr*WzK*OrCiO1Ye1E2dd8 zU|o(G=in7-THjKaRq!H4@aSJ)%V5IQL~E$%R&{54Gq${yrM6~6J3cHtNYCRLPG*B$ zFie8n`&z4ZK2d;C-1tQGZR#qU3-noghuSt5hvgS$iX%;PWfN^E0Gb(^a(hS z@K8R0-)1*ZMIOYzk(O52g+)8^`g{#-jJFZi%u|_#G~8ugIx0yC4MBAwTr3VYSrqc^ z5>7=9;|I{9;^-{qYJa<@mk;kn9z5f}-j14Qk2mp7WvZv1;YP-uB~fLrNf#~+TCUQ* z)1C3m+1oN_Da?MOg6k9ve2Qv`56P)wRpmJ+@9f0e^QDz+miOF2K@;b#+IIq&lQhG|3*k__10CB2goF7FLR(A=Zd3x)nVqINht*g@+WUN9DJo__s zw2vpOZiC&+;AfxwM{iPDUilm|7vs}lANS8zwGujKQjfXKSMEgqs@`KP}1)BJZxhj z(NE&mr3 zl95D5DvUO_sSPBBb39)dF-r6MOhWEakLLLTkf{<Q!!p;E+xmnZZmv zO?a^e&tOlZW|2|2;g+=fv-TH;K|0U5CQg`Y z`g`sE{;X&9&i9f)9$jp-N-sZwFaeK6Txk7zuTr|7LX-qjjcJRkSpkqr^g71{*z=-L zjB+x5sWQ)I;GSChS`SyNvMc6u{c#Wr(%bP`A6l_$DM~2%`}dAN1F9fU$IYJ zOI#3v_FmZ%0ydVqB_J6;)f2G(4xfGAr>cJvGRKB?d09RC?#62^0hwP9tOC8bNM_i$`Ky%1Y?FXvbYY72r&pl){4!b z(m#P>RPcDe)>Xy{wJNu6x*ap)qHsjYO(&QOaSuMa)BOAI8-Xv$lkf=fM_xcW5!0OH zACBe@tprPD*vxnBp_KiafHZ-My`l?46idbvJNXMz9EAR|LC`cn%?t5zD`sexy)j@% zQL_xXyP5rW1clG@suaRu~H`H6DClzgF5YbgnV-h9@ie`8Li*67E;=hQ|GNh z5aa|9?kNzDOyba^`Z-1lha`%nz_DKp#-_Rd^ZB+Z}hd>v|h>^hBq&) z>Dv9hGstujQP4!g~E;eW352+-WYMdlCBv)b^a0zflg4-y$tv&4_x zJ;OE$=9mFh&juR5j zaM;2ESo{yHed&tb^)D?ad37dB8s%60csDMp8eC6;Fhi+=;OvijUjyI3m@bPbKlV_^ zHnFUYqAO^d%_5^p{G& z9M6${a^{-ZvCgSKwYO#UDh5rZ3od=3n|v}uWr)(t$)DpmrvR4naZBbwZLgr)D}h@{ zJGn>$B$>kJi@aum?R}ezlv!N6Pcu379fd$0tOsV6XNni=SHnXWK!UqbNCsoiban!qRpWn7NoeiBgU-06yD05V!5CF}VBRfj3cQ%Npe3 zO@P6$L-zNqX5CljEp+ZuGzv2a-^e`>wMpnHKN=}3lxi92N7AiK5cq&BQMr9FXPI0_AwW%NA8ZidJ5)fWk}Zr3YW)~0 zb+ZdmtIohLdA|^%e&DJG&f@ooP@7ah!v`0j;R}$|2^2PNR0qh7VLPo5qAti=Y*6`7 znS(ks-K`w(O&5}By2a`EuT44oJi95ggqO>?qPSTR864uz4@YGItaCqQt9WrY-ooqc z3&M|XzC~`I`4+VHg@~dDMN&!_{rNo>yjIryqsl$Sd@eP zi{q#@`x+NI&qXm@pS4ft?0Xpp<(vzal0gaSWNvIV^?_~|Ne;8%E>Xq=3bG(zek@b^68{%{w-R)`ayK2dFF35?1au2u zk$-q}jx$Aw!0=FNZA(XerOzIESdP8xnr{p317O_c>p{I#uvdkyT4vf?!UHgFf#!Ge zGrH-_{y#0RDl`@bFh-3iQE%E{tPLGo*%LdL@e_EVOBvQHHW z-QN9YemP&ud+g$m<|<)|XJVrufgcMHajW$9=ZW*0JL6-McB6U{{he7bt?}#0ht2uv zm4{KWd3FVIB&TEovw#sN)m$#q+vB#$Byog}}X3&}Ov3UO3vOe-zt1KJS9M zAM!nY^#Isp20wf<*JZX7B#HudJ?YemBWDvwRlZ$~oQ{5CZ{7s{z@L-U(e2ebx%Z zq$$I~1Rm2wN<^5Elv}Td_a|`HDb3g|JC-TbAws=Gvn8yofvX%yq<17VY2(1(Y3sJB zA$xC#W30&8nK@r4q26;g`32IgAiVD*jvBQ)VYu1CamX38R1_B&Bn#?}F$8&97WbvR zJMg;mp#H`3U4E;}XRn0u*D82x5}1VwSJaxQ9`1f&o(| zVUj9@{T&QY;zw_2MUkoAJK8C=@}A9|#xH`c-Ls1VxNq2XaK}oC*M!`Vovd~3qj6p8 zQSi2`Bi)O1-GsI6SH*sGBNGPgBwmSOH$Dize5adsQxevT9Wu;;6a3JPs2n?xDve!y z-U|$YWpU)9^CBTg^@uNRqguJaLAQrpin0m5YjdRP*KiU#pcqb)LuIyLsDDK?BuHH7 zY^xKfg(@A7MTR>EG7_k^chEZ12@fWF8A)lKPS2CW$?a7}GW?P96;h<3VY*)i`k_`e zIlNc8{h4-qmWH@?k5+P6nelM0R`qqLKy<$*!g{pu8HL`}Wr!1nw5%>Jic?j>?(<@# zZ#tvIY$1o)!zm7y<)&7`JiiJQ)u=J=yu89jB_| z>eQgUpT|!tbz)Mu-GQb$J}M`>7k`vj^*vSGwd5F3;9sRMyI|Tjz<@<3D=F)Stq7!A4){~7;A7D) zNV#wiQ<_UP2cpm+asXc$aj&W=U#X{z6Ys1-&XrYLD|2)+N;#(LrJE!a zhuoXDD((IJ2S0cM6~Yk+*X$XYA6c2y4qe^R*LFPZBb(-pfZC>&zm%(tRX&nwKIASd z-Kfjy9PXetc$vQ|kHcNj`LwXP%-ZQn)&EZu$AAIyK<63@vxLRJxq^=}lu)~sAlD0V zi&g#hIT@O&>@I5seYW#AD%0-KNd3%y2PL6{ukyS#VH8kpfPQbWTnB9E%<0Y^|~vpR9DgPP8}a z%8pxK9NHY9^xchC28th99Uj?e1`b(1mMr68VSCVJ8QTeFCMwHVx@fs55eRiVLcFdN zBXf>wwf4CIZKMpNho$iD9P^T^an`Pohk>RMymEZ{evD3J!fR( zhMOdaC}53YJ_nRoL^?HKE0 zu2Od1}vQyeL#LIZD!i)+T8VHr#iQO0-wRkO80dks<`z%Ia`sXlVf=sx^E{p=cT>q60bhi zh7hG%n4I{L(30j6lvb7v$-Mh2mtGGj9!XF(HjL~+Go<*?JxKAz z}Y{eTTR<}c;IQO}uJp&HZ;hbmL`cSu< z?XlQa%(Lq>A6A@tCwfG=*(JC~BMR+G&x*mguJbqg$uTFX30_I<(W2Ag(CP9lOyOQnKSwpx^Vpa)A1OSLco z8toq;!oY-PQ6Ce0e6~C|Z4~`*i$1bS>u_MRk;rT;&d?;AT@>T5dKJ(7=0^sXdo#dB z@V<&bgk|PcZ8jl)jqkP>DEbW2+Uc_+s!!k7jGvOnVJ^i5t{Q?GM?#Hx7~~h7C=W8T z97l*ELc5EFVzQ0R;2B79R)Q?WHKqZ-uyj!4&U+9~N02#JPC_w04Lor;X_(=J)!}fv z@T=h}YVQ{xru4x#fc(&E3e(4vv#^*~n?vf4uLTJHe1oMuXt=Q&G<3BF4IQHG!v1MA znyry9IH7YhmU}Q}~&RJj}r5&s{B;qjbAfa_8skd^42F!wrhg}4Oc(;XdK<>%g*YX_z z0%Y^zwvAV^(|M+deb*Plt0xS?ebF)=9;eie{Itc#uzb@3xmL93>5Tkr)aWo*eKDi~ z$m3@wChy+(r=Q`jo&nCO&f=xS$djpLxCh9U{JuO_Zt_kaF6V!Xk9AF}rjN*lDZ(tr zT2iqxO)(gn#I8(VhDgJOiAi1*jUSf+1acvb*k(0pIH=&tBuOPUxMcEC&GhV%X!0e`aHeot*}OAkTNU+ibRUN))$WPv+uw%nO;r~Rq3+2z3wCy%@= zZx;#Ri_z!cgHo%ZR7xnnKLS|^6?d<dEC0yw^6q-bp4C?9-akK)TMkw)qe^$Kwl(l%$4tXvnW|4;nd>|@b(${NW z*ro0Uh=M!6!|vJ!baO}g<+Q822oOA%;@D9*e-yWVu}xmgyiF8M5`l!$ec*l-jQFA9 z_uJHEJb@olwLfCYN;v1&scY~y^Y;#UJK^{;y6)&Vhpn^)UH8A}y7{0hLL}x=ZOKo$ zo(~u5bQY58D%YJ94e@l1Ln=O+Q*EDuB-wULAw@2uzI*`97-;m;>4$4}!%wZOMnf7W z5j=mDKROrdU^UEdvKRVss#Hb>Nq+5d4C4&Mqab>`Y+U~$ipWA*^HH{z4|*{m zwXqZGx37uX*P5WG|NgHtt>V>SDdGrosPX)z9OPj8B1YmE?9_o|RV#rV%akaq$fJYa zvmdnC%giHAf*vdtSV%`iglo&Kh<38oZ*|g)R#J8Hf3HF)bgZlMyE{-EG3Gs zn}g=PuJTrw>7bHjgOE{D&RQ?hhwNOW zrxT+|GJVi~M>1XM($A7UQ@+s4rYm9iBIMUFRjCr`A*AQxtUXo(kNg9nIYvp-L0E-` zDdr5MlKU2Rd2UrjEPTu$|6kFfltk4v7}YUC1RPHc;a|8K%&JG8S`I34IIE(X2>-yI zo(EF88rfNl?2LF;^GD$9|0~g6lpGbw+|dW$kGhqCd^`t`z)V-}#tKrWU0b7;<0WN= zjw4&x6Sp@TiqZ7ZY=`Nw#Q*}GEoj%bTChVtx(*0LRrTJ8K^Tb1`PcLhs1j9s)G_*j z1qrYEZxr_m4b*TyZ^o?fwmnp0-pH2G*FxJ<-21zWws%A|q77tw?dywnsUv;5Jg9pe zwhegx2#G&=P$x@&)a$hOpi)chd35TW1W_x$UucMOYicQeC@iYYSQ)xE4fsOZbd0c? zuQ#WV@DP=}@gZss4p?pTn(cFOJEqN%;P`REkJk7wE`1E)_z=f)oL!U?eDn?bqq+r| zDm|i9FAKpLPXdt%J@TjUv)|3zV%2EvAw#`Ld;x!K!NRD2!>tw}3$hPpO+C6J2Tkf_ zhv9Rn=Kr_aNIBTvoOMB&bDUWWNj2Z zU;1$n>HkNu(l7(?XprJH8Omi)Ez|d z&V~%r`IC!t3?fu>NPno1UWR7n4ZtsSfFOD$&^Ig{r2O*nYS3N_;>LusctiyIDg@(K zyh)8hB_SChO1u!F#6nSDBeEc2I+d`<{IfC4|1(f9LkcH8g7RNuC(RpDfzPWLXmoc|?07@yb&9fV1Rpj3OE5#dS@a82H8s=p9FO;h~?8vV647 zF3;I^7uP+91ij>`6WJjsuxf4Ryk0?csn(MQR~N_@2z5G?<_T?jTi*ot16O^8780#`D-0rZ z9lxxd7nl9}qd-LBlYs~;TSeec>d+VQ#jSijX@RyBU#_@{W75;w&p=~%E7gHK1%*N{ zKozyc>~{@XkSkAb#jxE$GH$?r8bwFHL;fe?LYEkt$ZPvwSUV_3U1bZEsvP@5zJ|vg z!gwtKpx`@oZB*WZygrBr8&&P?V6o>HZvg-1IMqf#8>$6MZOv&}{(4ri?SF)+k}Gyk ze-7hJ(O9mDgO*RT%{Wk>hdLKX2pvz|Alt3p+-QaiVP_fVLwex*3FcR)_XzY)@~3`M zCvuJ(=mh3pH&Rx$P1U6Vme4}0n_S`8kvK}sf)Thq1w3@@a=LFYY7=hVMipp{m4*1r z69lG(`H_tS%I;~8&sFyCC_c#jIh&X3#f)EKljqpotyU4D5SCohv3aWr^NRu7KWWFS z%rImA;qW?Z;=_=8L&$!MleyNX9gv)SFN_!_(efW36B z-Q8uMUo=v)pn+%^%cWx!Z#{UoU37V<$$raGJu`k`(TsPf<5_Z5VVxk&Jdl2U>l`Vd zMYaaD>&QGjrf5A3PLM^cQVZAl0{ z?NW?L3l{6>>!{~o7XYyF1$H7O+Fi^PE$V9vz$UKrcqGZ#AWqpF2_2U6QjFH+K$1P! z^m{!2ZpbHfEkw`ZByXuZ{0PPdNsgxG+{la-=$@$j{@aSW`b16rPrw1C^-W~GD4nlonOD&1#?X-+Q0R#9u^HU$g z0dV!p8R_J~eGUhx@^FCd=+6-xfNUBUuO|@;*kVdg#V?d#*=Eu|vJWv2wTeTVL2@8^p@5T6}<) zD$KR7vUgfJD~V8;X)KEG^$tB9I&aq}BV3wI^thEZ3A{lcpMjpSif>=q(u;$t9X}J? z?urDw_y|1A9T)LjG1SzhA;lhuz|k0iRWqsX%h?xQvY7M)l!1>&dB(B|6@v0*XsXYG z36W;zTX-5bU~`YLBjUYQlA@S_7lErnUI9HJzm0MQ^!+p;S9iPE?Nt8Bo;78zc>X07 z&;K{D8#jWv@!Vf-IaiJh+Z+AaetQm&^w^KWp4m@^J^e8&iF(~aHj41f)z2S)x@KQ2 zgOa6IHO#FSZ}Qpk9X8zKL^n+-YbAH0@h(T-hD7%#L@&`8;FhqV2!b01EUM-Ku!L|$ z2{qK*`xo5%6oSyt3If_AmY6S7=+(~0~2QF9#WtNLF^{PF&t3TyQ@h@cmoVV@_pp=;#0G!Qb zIdj7{Yuu$w?*MsDFOebtF=kQ}OFN zA7bDl8HoHdaEa8~6no?jejOyu|2oOdk{@fv|ILbAa#F{_#oxgODROaaQlIOz&-e2e z>*12mCTJFQP+5}~z%QVzz>P}E*nT?^>xmn%dS$SPFpx33GPiG8*J`D%66ehCukyhs zr!ru-LC(^WvFu4E2kFKOOO=i70QwEu%vKx>|EeU{$ap|6=`QI zE~ad&Jw5gE~P3npruXGk&83 zYFF6LappPFQXDcXk0pO`1G}dFH|Qg~M*Ha#`~x_^FHoeA_Z?eiwQBAvK`InvsfE@2 zXINXm6#Et8k14>OEImVLvN=1CPz`tI&vxW94OV)$jn(vRrqn|NDike%{cZ*2!<-(V zfv;o~tT$`nnzh9BnUV6C4}#UsvjI;E%4h$*Y1aN5mf)X{wP7Ei{}@iY(q?q<|3|d| zM*MJP9qTG}i<>wsr_-{A;w=i<>yz_b{8a?X~gnXD7A)hX+B z$%@^CcRAPOs7#w*dn{vd#Btci9}o$^uZQ1hZ`D$zqe8sdku1)OTlP$}i6TJRN4e_0 zlWo3yk_ADG_itpp%QuBt`m>bS%u$qF?q-qWx)j&+R;h8SRe|Q^;`{j+sk;jre?pEQ z-_(zma@P3=Txy#WYz+bu8pRMt=fE_`4G!(hlF(RG@Lp=QWab>-@(t@k{5U!tp-v1@ zD8;NJnEDJHRQ)h*ifH_EBpYr}oL+2Sd-T*9y+B?#;oi$lH=Z`;2##(|D?3?*IF}XL-5V zO<)A-xC)kY?n17ROo_E5o1-c`MFF!?!U@>E$w5pl-U7+NlH#F8d58KHlCt+uqSu^y z>bU&~pZ2PmRg48_s|Zc9)BlKkTr!&q4xa)`Ys>S{0ejv%?in2Sap?7v5!O=eK79V~ z99}(6#J6mRf+v)M#~p_>3GZxAB3Df z>?8BchOGq3{>8#|8WjAPD@4UQ{v0=DGykyAIXn@^ZZuA6eHPo$roBLQeHn|gd5m48 zDaJwfO2?5TjB;0|1N&NV$Y&*Bo%l{}b=0;+t;!HqzSO>&UkStHQ;32V(vxxg5XFHN zcqH_tr)=3KlAVAHYO^P1>?1k(HjTo?`k!(3Knnr902~qv{+LR;pQK`8wiL^l)S#Av z)#pLP-%eOl)V=}$TAQXKv%wW)uJI!3lA6KXhc>C&&T+*)nY5Lz3eLIx-V0fMp{%t! z>&RWp^?j}|tAbzG)Zc1Q?`)@CgYy4J!j>T~OnE8fM&q`)J2&Vx)@|sr6E~v!OP%gl zH7=bv0jKzv(O)OcPiq|o$6hb~XXP+fkQXRchFM()dZf~3Go-@lkp}BaB)#;JQ5ZJ4 z!Gf9>7FHO<*+xl`EPN+#-=+tGpIv4NwW_jnw3aock;ks%)p1?(fEhcS-7B+CW&B<3 za$8Eb1*2W}UZ_moIr}tC{}B5n@90!~fIN{BzscK=u@&7wW3Iw!yqqMg5&oA;4yXPP zFDcx?YlcIjLRpato|p6{Gc;F_dO78^O-_oYM?^Dh<+(gMx3QRXt z>s2L(5dre=nqUMQa5qTMCfmQj=#R7n$Q`Gyvv*0fp-f{^=%d$5U`U)1hWsD4XPJk(e}+OF>};CB74twEUP zL~Dp92<>L_!Vz+37EEi$S!q~2PO!`xzMRbN{!$P`I~BL{>Eh6d@r>vIjB50epqYm^ zR?M6O3!yL;Qm;G6t9gFY3h1|30y# zG5=>kJFs?{|Ffa_FhBAfH&6SNU4FsdwNp~|8bDxz-;sZ{RrnuhkXP1GXTd}dl0AUf zW}W%J9gP9UbORxM{h&%I7Yv2}5@elBa`yuvQ%)YXX+ zDGP=)%3tmED{5?A0PSM_vLVt0s_0lLf=6?l`Z>w)SgY;Mcp|(qNi(7_3kSU;AjxJ_ z*eNPQ4gy_Rc&AO3?3aayoD92S7o54$PUgaf+AOxIP@i}@xM@>cD|+pk1i)!k6zZHa z33k+m=Av_SW5iC&+IQpDnsMc>n;7?*Q9+EUp>#~(NMn~|PZ}OQo)EzW>Fk;`%+OOl* zol#VHGo^P?udU0aYW(ZBhh0P%<@aeOCmHcPoU@q^TyC>j0nuP}OqMR4{K!jdY~j}` zxds7^kAVUlM?lw9X%}e%*)d+J zFU(j*Hg$B?{9e0Bm^zimW89pgh(L7Prf^$mo!a{%cJ*x}?bOp-h5J!iVX2RnxFAAz zS}Dy*%0H|^f@VX5|MHIubacbYn54f3T8*POD9fy z^3I2FI95!vui~((y5&FUD6z)15+Sih(1wai{$+~PAtjV?WB(yy3-JPz?+ew?RrHEx z$qWZT&yb#a!wAfp2fdEdz$^K(y8tsA=@Ejj61x=?kv0Gj{AA4 zWMemufvfU)L|MGoimIdpB1m^zvLVZzTuzVkGmFW2zL2D5w~0LYs(lV`egfhM@pb!KVa%B1SI_PpU;(pX!}A*J-I`c% zfhPGytOP7OosSSva0}pu87GD9HZIE?FTC9R_FX9AJ8WDdszQS53JVZ7zGn>R$?45d zCRZJN_efUC4Wr@=E*|J7BlSW%_T3;vxB18g7HJId8Tj!kdd>NeNqmI29wOWl6t{F6 z!r8_kKf4e$`5Qw0DCO=B+Y!LYm(xDN8{g!prP1usMMZ{lK?2;;XuBwc2N`Y{M*3Y+ zl|%o5aPA>FSWXTWBHW_(pyb(y+6j&Jgf?jwPDUXgvwM-snYvA*G6;aDr!j-a<{i>YyV6Vb$o`Z7I#j=F zc7^LyM0SN?xsE{JBVwiCroutqI9GNw-?8UvtvK29(-$GAJ9*CI{A|w3j3KP}0k1qM zV?T8Wd&(}uu7HZG`0GjpC3MuywbEpq{Z});B5RitSIttD)>W8X=dE|PeBFjxe}%^q zv`(tEmvpcEX(Ba%YUhPT&wul9-r}q>`)vWaQkmSF$dIa)_(YjpzF>l9bobJP{T=j7 zaQ>s2)S#=xC<&I$S#8QnLu=b3^`M|ZMRb#7nG5+m!Qwq#iHI9UJhskrIdkBadu3}c zMhYvs$uW+&oXdv!dB%kH*{e=nz6*YdQ)cJc6y*>~u;*g{v1<=Sz7lSr|T!5xfuD@B22T5%HdFNe#j*#!;(5Cv9g;w!0Yt zD0*TY&|RaNm7)x1klAK$6J+N-=qszk_covmFy(rgv zuoXv#?IB&duLx+jmGzLV+BD!$_L((GzhI$V$=Ht{$6fU++%8OZ;30E^(oVHAt01v( zGiPg)(Ilr$XX$>`3Anl8iUE$0y@veY^bR^=MCq@Rv92PIJ2v7P)yXCy(6m+N8`Xzpj!^*y`y%GW0+$oR{5|J$6@1?4phD_Qrl4lC9MVgz)Xi@4!nPmKwgPVm=wGeGZgYaS z_6lc4w>2iLzdSxoc1y@tiXcb5;oH z@@805ATO!#QMz-pKgLWS<9d{v6esX=uMpW%_J|=zYqS$(cS}8+B8z+@<)IWYI$Qmb zHwAyOyl>7>*KB|Dy`K`)AFonlJXlhu`cY8vUED=%gMiO$0`Xp-hlpQ~+KV3UfuP_X z6!LQaO>0|9MN zin9}GwG;nexj*KqBV)HY^K=gb48pN|M=rG#Gcd7dn+_Re;XF8YB|GLObp_k=!+QU0r#0HkO@IY7=@rQ7 zM*#cEkf=g5)TtIfV<_u^wR2+_=Rm=Gyc>oLXM2$f!DfX4`IGSVUeOx`0#vuSf#iY<+eW=Jf{UL#dh{w)WmWPm6x*P3Cm` znHPOBXWpv0$7uODZ=M;-M0Dj0yDL38kEeW{nt9NKxRR=S1XJ7`CJil8O=Mj&>}mx= zQo%uRE1Ztl`Y;w^g4Nb5p~=GYRy#M-K!zb{cEac)WeP(va93velJlZEcD2lx$!QJt;g&hz2h_t9C&CV)S#vw;69Lx_rlJhZF;A7TnZrq5kZUodV;9KTF7vW=8 z!49W_o~wotT&1?bkdR6+Yz6Kz9H>swV;a0v|Bbx4*PiZ!=qOsS91nA`C=~qWO1~BK zfmcS6PS^sog~gf2{l=&+ZgZ_XPbn54r2r{<=pYLBYd1RQq@0tX2D?||#@@Nk!sqWK z5^Q3oKf`a*lbY+|8Ne_gHr&ddZiZh$aMilz)z@L}e!8*=CHY#GTJQ>D6R#Ddjj1r* z&E09|%faqnbVCm|*nW--?6nu7s@=*}(?g2D$3O%g%~2$R1`~R*H8)`2=h+;X(5UMH z0h?8ga4P!t98%j0Agips=>0!|p^s}xK41=cjF zzy*W#$Ds*TM3Z%Pe1qN8Dq*-W1%bDJbfZfO+_u4iHS9%Q2=RX(Ef`9Z0aJg|j#9za zdz2F;mQ~hFz*WFd^zc=ENnwi~`)+UAyVzAxyU&xtZp|JUJ0Q)zb32GFqnk%|?2JJM z8`iKPvXxuCCmv~Hl*er$45l#ZvSz!!2W=~s9Il+;Rm#&6yq@(e8c_5SA)q+<-?wm0 z;uL?36m?#~leqm!mfj))mi)m6oW>$JM9FGiDqoyqcnpvcb0vxhQp4wV9YiqwSpE|5 zHEoog>nz@aFNty*3bwz(Y@pXw&-r@+jj4mU%w~1$kLt(vfx>#w$aj$35t#q2#ukY! zc3=oF>-5A;yyRV4;Z!L5-u^-$81TooSwTco38BJER$u4*!3VyT^bTAZv`;(uV6Wrk zD$f;ckc0zVGd^8-(EynymJXZ%H0Dc^I6uMf3DV9Og? zR7=rDvczK@muc6S_zST|lk?eWTX4AR~ z_Fu}jW~B0gO1NFqbMQ()bdv=1HeAjw*>2F14H6VkpAZi&WO&nT5^d zJ-@&K?g4F!16*O7cKvFlX0F0NjFST#ElsG5(XUnqca@D9lad6%ep?j z%dVA$ZuFj;L}xMb1ewhk!v%v%6$mKAuowUW+@A^)a;btsE(=%zF`b^Tjd}<{P0o3d zuYsvP1}Lol2;p$$ey}U2jzxS3SYHYgMS8 z&2vs+;y;)^=SO0yh9-$vzqH5OyjvZTGf7nS2`7Z7+9c1U2GD~2TD|T==S}`4tJ>+T z>OS~UNJUjwERyPoV55ZHxs%`VcUSFVM^K&M5K;kVF_$B4$8E7W%+vC9IE}&mVRrpl zXz8jpc!n~Y~8QaqC{z(`CRZ_hZ&qg|PnDauUXKl0<{1~gvo7g&_uL7J^rx=6LfJ9f?TpV6C( zFMbwP>^H)zMj#DUVl)c(IgqDT6YUASu8UEpJ20WaWKfA^0BBJlRP@+V@N%8n#ves# z_kzvqG(y!eY3p|Ng50NjLUwN2)-~AGj&i@)HbtFFARlpWn7iN?&D>3#+NaT_-^7dl zjFOQ`1?0*t7R=m3)g{0uW+VjdMG9`J)hA3fj#eFP=e08s>g=QZu=HhBCoOXt-Q=Z9 zc>wEa;B|%=E4alPG>O3q%E3oWpN10M|0cS|z3ENA=bt8Uemc}^*D2388ff8KpaL1* z=~Me=oBbkVce#@Di)c7WxICY#=(yCPEyfEQ##qOU1+2S{FWE?ve4^XCCH^Mj?BC5* z_!6p--rV%I*4(SSui9a@#AG0%#=PEg^wge^%BAe)I5_FN58q5G?X*y7r^)V4-#17u z>o`Z6%N-;#+?+rj8|*Ps1L_#iFCWM6PL+ziNzfBTbc>a>St{)g6+3qYbUDP9F`+im zjN2)!M<&-%Y2Iyt4p(AVsXX*QsL*7(V8)hShRyX5*@&fed1P>L3Q?uSNm5kPl`aIetIyn<)&1`()-xm?M#d-UMU2W zZ4TXH{*B%CYCoiPkrIv9bLgjW_xjpFf$Gw@%09Q%ZLqxd*y5$y+wu;H8q$nmKp^&= zPA~1xa$A!N5_UGp@oY^W8QQ~bjw8Uw>|7d6g0%3LjQ*dBS&UlQjqQYCez!Dwt!hEs zx)w4kD^(3LE@!Cg^eJCQsno6V4gk2=dQg^sMeSj3uE4De>3ooQ87qZi8Q{^O!8KMf zAMpDwpzm>Qwk}-C5fJT0=^vojS8JkIwc0fe!h0)f?Yj{&o%y_w{78yVI}nBEOcUqv z(QlyV$(>~7C_4ZjWXU+X-rRwrPhFSQWWsv@JM;K#5lfz;jz3*==jTAL2Zex z&FlR%EFpG8HqGm*E$p(h$&Pf`IRkvxxhZlBRfM{s93yZB$Gx7T-LIFmH+E{rkoq60XSLlr7v))=#o z1xkEjjepPD9-5muM5w58V?;PIE+^)=rA~g!VdD|nq{3B(yFLrLBR8eByXX-jCmiyS zzER5vTqE4!DmXr-3A>Mg`YG?lw6k8(>#T(hwCj5vW%9DkjPmsgo-XDRjP@Z*bVp4) zr68~E7+8jLITqmOs-45c< zIsx-gYPFeeH0gXhx#8BdWk#%v6)E4oH|uStN;?O--_Z$rII3CD+~iSsKV{%4T_tsqyaOmQN|t( zSFQ~w>`Je(2IG zq<9!AQunT9Jq~6P5!${24_+OT4t|$1?K1vXO{eWghT0);vu!L$Yuro`w!Nb?u==sD z5>Zj9o!=X@iMyzP^9WW4KsVfEdqwRS6h^c2*%>CD<^XO~#s!#L7%c`A!_I&XyZf=?n14Puv5p!&>b^a0RvYIn1Cz9vh#4|e7bs*4@J+2v>BnI z?w#Va6!TZwPIw1Y^-DMLlZ&Y;pA%W+u@8{^jog>|C$xj>*MNAIsiy_l##I$Ac# zZ3VLI%qqMr_}va|;0~e9cDTyd*-hw6M_{khj=auI+X*v=h*%3=cE(h@+4VEb=7mJR zac7p;#JXr8>5cw=!wzrcmSBSW>hLjiJ%G1hIbD9S3>vtKcL>>s_$XJjwl-=6%rY}x z16Ltt-W9Mjxipnd0s88_8BGaE>ZOb(0Z_l*>O>XhC7i67A$1HPwPX1&=eM>FgPQC{ zF3xqBi`BfRXKFez$C}rHKHVpC+=D5K$GlvKB2B9=MiDAigjGD8?667XLk_qtYqg3` zhdd5zeUu_br%Vrr6q3-RvtxUUhIU*z9mM4iuxt%9Ki!$(w}~^t?UGU{gsh+$*^VmL zVCm*wKLm-TdIpz)og{4b8H%9cNVjwW4xET)#_T-LS9wmHfM##Lt^_&p7m7>$sX$_( zNPf7ygE7V2>|pDSzBnbHHS?uNC)Je+c*|ek9|Gm2GxQh6qK9>7T^o zBP5xWr}(&f|#KhH`&|61som@ zh`hCl^DEKbyE%55&%QB|0Se)j-^W)orV8O)yK^sLy__|aea3Y@$X5rHoOYHb8PWZj z)kEvLm0igbMAp+}n+dx@@w<76;~Tnp<}F;Eg=pdyKH0lE*z?bzu}bQ#ouPFut2&HF zKuOY`DJHNfwLM);R9~{!MXl4?>{3lf+}`gEM?_8Xqkq_2^Xy#=1*uarszS8ls!TtI zcWTz7Dc(TmRJm1BI=%BJS4`!QcjY_xpmTg9JOyuBhqB{|C)=biEEYnIM`yTmclIJS zGKh9SB0m8R#fkAihR3^k*3-P<@q~E=j?i%w@R%(o{+G>u3hx;1;Ot6KlZNQ;-C_5x zL1k{OMV95LjcN>?%G`)mS!5;gj6@>__+sm=kBQ3+*2t>tO$X2k&HXNTO?HuT?uPdH zcMS@o-7G@FeE%dnkPAx%j1{HHFNIp^GDz-T0yES6^;S4L6m+|60tl)z&EY)K=4p

_u_f05&-JZ9X+#61mh8>>-(n4CqCj5Ehd9Ui4dz=?KS zW6)k}w;#Lmn2Ln`Hf-zb?XNz2lPan6IMSb3IwY~V3VJ17r%D5?Tl*|ZJzM{d+AK!8=5%?9zkU^7Bi%#Kss7XkBlJLG8g+`Qr=Cd7A< zbtQb5*N83H{^YkWu(YO!yh5PkDD`KEwKPZX21M4E;phJ%iH+f>tMgOvaHnwEir?C!9QmwsmZ9eNd&Z=&=Jv+21h~?}Zj9H1d)bIhCF+P*p zIfi;!g^QjcLJlVVpu1KH;2mq7>aC>gkbk&ak>y_$`ze=jGKqiH9WIovXuVs>2WjNb zV1{lR8zb^SU#eOQ?D-hsWonBxwStyZFjY@I%pBV%9kZhb2o=_3Y;T&=<(0<31~G4| z>=#6qi!FMg79myh#I3xhK;P}<{UQ4}MQLXT`tokjdgIzj@qX0Zr#I}Wr~(42+Zi#2 zmp;y#1h;}9@!Yg4 zO#MGXfMQkOV~cC7OLZ~y)vsDl06@HoB73N>Sy2<743)T_6PeK#M@Zk&pFE1)X&z=X zYgbEK$ok^e)nMDAxT(d>)Fja#@*?F;cFWIiC1G^Rn9}1v%J;Iw=)yqGA6VfK!oFjj zkDF6z_j@gne8yTRtCu=dd480px7K?W(0T&(i3KBm6RJv4~ zXFrzTi`K^-f^x{rWra(})OJQ3XOMjF{h6I@*Smi_n5h5tXm=Ev*3uS%`x1Wp;;Q>9{zvZp>o+jzi z(rC?1gowJ!V^Ows+~qSQIpAW*-pI$S<^R88)&k`(qfTY(nN-AkSaAwD(FR_=&P6E; zpa5OfHu{x3ZmWi zYsn4X2nt?0v;KRT_1kLc2bV-H1YpXnw@M;a!+g(&N*vc%#=UP+xdc22|QsA zb&o(Q#^i-O$gs_4$0}t~w5i=H;LfhgOud7ihuKkx&_Eeh*uMww$^0xeV^$WxBlrO- z1%CTpU#=H3*To36znK>~0KJy@l3dU?drhXW&EfMOvzw;fAX>K2bBo=u9(l?{-cuT& zw5bs23@A;?RgP(+uEai82t15yCdP9RqZwSZr zm$O@^o$pvjoX#SWRc$0f09i2L#Lq|l&MuSP*2e0MADnxGxWOby2?`Ml&S z^f)S^E;U9OwK1f+dl|3rKCrEFShftPVA%+pcd%F_J9&Q4Ka1J(<;;E`*2agIu%bYRwfOmp1O<^2MHLL zy7~l{QW>p0W1;jcWWVm>LtJE68KvqE4Fj46S%fJU z5%&62TZ+>TZ0KLLc%wkp*SLCj*{T?EcCq~K*wF##S40RdwXXwC+QdFwItSVA-_7SIJLgntJ^Z-S+tmgSn=MYrS8 z{P_k>9_!-LU9riVu`;c080YknVVoK_%f>*|z2Dk_wEI}W?LKT-QQ@zjd_K%Sp2>0u zMY7ipLUObE4nuRg1ThVGTW-<*bf@G1EzWn0+U8=Q8AWy zgRcz>F#-O$IpvKTX88CAc730ri${@9M>uz_=6L~oB`(<@p(_bbz7r>%X=|ezAax37 zg={dt9$mO9$oq|#X!_nr*fm*p;HElhxqcaaiBMG?Cu%F(UjMwB77Ga0cD&Mu$(?GQ zd)oDzl3amyrveiBxqkZuQ-_s(mT|knkOI%n%J%n`yw30{FTsw^?^0v7ZD)m9bCfy4 z`On_5W$UUJWmN&mMOSHf|4j+L2Y}7g=30jEuj30lJ0K~)u$orQ9GphK3jldMnF5vj z+UO%|B4pf#20V7K2(eV?3wPMRw2$)#T#Z@qgZh3xG3q{X2A}A&mAN{L@nh{`ZaUVv zEBBR`>nqQ3x15&L@tnE7^OT&n7b$4a75-sY!F&dkPKgR!=#sk+j$w_*XZrczJqJJ` zr3s~CxU3~yajzxQ-^R$k<-Cy{cQ;?W7g_^GRnqD1M%SAY<`deSnX@TOU+A`3?1@Rr zEi_@n!YguBN5!~vcEOf=IDDOGn= zn+`ah=F(+O*%vVjR!EJa7@B2YIt*1ZwNKPVOdetuC3 zSB-1?bB9ar!m7%7c6Rw8lM3ul`6SF{HJ8{oQ#J=^%aSG94&p=;%E0i)%wxMBa^P4SP`0UrQ%23wWzS4<6qig z&?#?*j-IE(%?(fUR+oKO94Ql_YV5%}h~;`XQn(8gXb2~{b^FUV+U4FgL0l&ROh?N= z)Z2SF7Yznz4n@^ce%JzXZhV}}OG;}y3K;+FN z2-KVBXpsXDe_}5Rx_9#smSs=3LB`_9pp}lV7Q43_^4g{Zuo9KlE;X#}Ky=#geMAN` z+7UT#LDcHr)?gBr$dGJU)^1~4t!hWJSEX7B$>aw`>XDcCsZjODR>%$+HX87fpOGG> zUCPS9k$}T5O2?rc6L`6x`Cu$G&s`;|qs*#zlz#IzenOS0Q${LNkIF&^R1D{|{l0ZR zTheVCMnXA;iaD*0XKaGYI6lS4L}`5WLOCy;#|gx6bRJA zweoiLvC-=T3o*dA#kawZtGBY-e5CdGu98|@3r+h|)z-NwZRKk&X@+NUO(c`lQiFQ} z2PFnc&b+v5X^E=PV!ddnCf$9HtN9G(5k+@p*?fzg>=YeAQD%aTOyTzgfZU2c>;t4= zb^`;c`N#qrJM587M@RaaxWCxTzglU#6+>~~kDi~*Z{3|Umq`iX@7)$_X|{4%%fHyK zlDkp=74|bmfkY#OxRK@LVS$C!S-UJm{{1K{C2r7uR3CS|ZdmEX@NV^qwk%BNx|{F= zKR0W_Bz#+ zF><|)|1s2;vWpyI1{tr~Z2Q#Texs#Ycwy}BGUkA+Zl*-52P9oiEanaGeL#f59th_( z6qOus7W4LRvWhG+R$9>`72NRNY3!-W5~VrpX;1J<3#g?^nUXhZ@TO+5G~`0ej1H zqc=p^wqTQk!bwbR5yf3Nuno&%Qvu4EwPm{N9%d|T<)ebv@zQ6%3f?WI{Dmlmksrm! z(K-I-QU>9$^KOVdd;z?N=QAEuW!6f2Bv-|ML>xd^ZQSzEGVJfufaVG^!&Isj_N$2T z+g3`6tbHvRGCxd6!^@Cvq|-hHw>LM4B$;GcEFurbT`Uly?A}dR0yzSTA{GWC{@mpN zo&rid*2&@UAv+z0$A+A&IR`tMtfG$MqTB4dIqNu-$hnIv|4;9lOV#U%E}}X&Bj#v^;=Ir2FRCQJ|(rGEo;NKANmBV(mdQ;fW6|()h?fY2k9OM1IaN<2>4e-6_OYI-sG4^XHXpX3k31RwvnO?M&X7LX=}d&fXnoH&VmA z#||YEk0|{%la09L*)zuHhyQ$whaW&*mNS9)ajR=`!;OyTbboB+e$FxfFGmv}`Rwiw z_%2OukjHxn6Ulp@G-3$U!MQPR2WRYc@ijw~Z-go4R5UHRUIV{Qw!Qi_A{)l0h)aWo ztoS$OcbYcvN3_x!rsTNi8#!lcmVIe3L1+G$wbkZ{6>CBl;G|t&CXL>;X}i3Ax4uj; z!7*0krA=38q#-3zHEwU(@2DqwfJ0V(8B0(I5>ff?XgjD2wREB5!Vw<`+Zc`SLe%?u zazy>LIjZpu+v;O1GgDgDth`4F5u#7eY)0!dcVQMjLr|LMT@@Uid9o3xS*<9jisd0AEVA};EnV##>QAsQ# z5KX&W=`tSd4^VK>hkclY>N_tYlD{}^MT?ggd3y+NRY;A`!j;S&1U3J_h13o!Wpc`2 zqaYdw;u3=#AL&5iXs%*?8q1&rp~C3tUCxJ$p|(K9=Y>@4v_g=Vc{UQXeN?^DgKBnO zPk|QF2q2S3xbl1Tany`8fpn#i?+Z=>f|?vt#xs$dfYR&h@o`p}9riawR-F1YLC}oj zt<*Q`qtfHl2>+sZjxvqllsY~NKHb9e!3236{|8J*58D3;vxJaxkR;GEN~#WEVsuGw>>+k9&_yR z3KYS)C(+*RyY%W|ZyQ5RRH$LXpTmb=rzu?xyul%SiRlN}SEtKZseQiw!Q)IEYKDgA4oznq2?jg2)}^h zeW%3~ZpFp1p7^#7abeSt1`&JsxQN268IGFkA5l z#esWN5b^_QX2NOa5rd=!o_3mff>8YMmuY5Lq>j++nVw@ii=i_vXC0V2ByH)COpe~@zaN6c8kA^60A&Dc7;rx0kK!o7KAihk{ zGiXZKPN?UNBBEC#h=W%^dk+09Yu_Oj1mvEs9R6nM&sRLB6^3(?IZJ9p&~e{iXv?Pa zM#OI7EFvRn$kd~6&b3fYV8m-K<&L!fLlZca;;O*D6u?o2z6-a8PxRukO0iEyF64 zY>EbfMbm<5mjry>CM6WVFs3Rb2UM%QmrvW-Rn%?~qBITiBmK^}o{J^1$r*0+uWV8} zNqb~Cg;GuF;1AVA|FtL@m*97S0&%Pqb1|b0^tln3<@(&_;gwxF+Se`=0298FOg4SX zd&jIK+J%UO0^%~bhcMTh*djZoRe*9YI9Wx~LbT+8!1Y2QH6C$(Vq%s*U}*ZrrJr1_qK2HWnD~0fbH>`r;jjW7ZetYpF&H+V8R~hv(FXm;(i0=T%H! zIOOKc(M8=;g_iHyOK7#zy+~cR^pNrV{Gws_O;!kUFpmsV@ah|C+yxAsq-=DP(D|S0 zFg@R}TM_mW30rgKYAn;6NQ%yQcUMquqoX6<%ue6Mox$Ue$rDq*6>~?u-`>JNgZz5F zf9%LSb$5wR9ig&c>q&7jLS@8!&81}aF-`-6@vOS-7TV?o`NDGZkLEsB^v9C`b9g~r z(`i4zd^OU8d%hj1hM9tx8{H*i@8i%qU)i9J9c`?;a``1dWLL&G4gK@^FK*nFD&(pRh=U0gIIh|uNbt> zB&%K0<=fCG13qR*MX&Z+gB3N~2F%nQ+{59Kdw4b&@VS0%#(1+w2K=OPG^ZwVmE#D8 zyz*H1M+|t02E4k7dKaxl2*>dC=dc;Wp`KR0{#NtHC?0OL@P>Qew&Nb-4mC-!=qchk z46sJZ>akod zNcmrPuwhMm#20pksi1q^29`NQkORy&_wS_ps*ODR$Er~Fvco@Rtn!%-)+AwU?!>0_ zD$RK+*}Euj8gG@$7vqFn7vpV1R+_Xnl{3^y4eGwgf>Rb!sPor)R}L<^;=Vi*riKcO zZIN-ikLS0;=Uc&tx-QdQ1@QIuJKui{GzSE_^zdX>gAh3kE6;r!fz5pgg9$QS8BX$u zUT&{r{>JUTZYTP`<}oPUg$f+_fzN&o-335MI`X#Yo>m@&Z1zVsIJDJO)9txtTfQJ< zPbx^DjbKDU3V=lamA2{(tv{mtzGgoQ#R9U@$_iOw4CKdSBf4L%to6X>?E$8;pmlrM ziQJKBvL@k+qaYe)9smo^P+GOZ=UhBssBWy=VrKp{bR6L^)z`<$itSvd_dmBd+jk98*|^_+fti1a8811-3# z7j;p>d548vEx~(3XSvIQK-^_%Q;83Q`EWA_VOFImPsVbkt-)}R_ZcZ6@VO-paAe+$ zb8j{utmLnp00Fx z>?g>XNHVYyUA!GAYQE%CGu7U!T1+;;StDaI$_jBBQ>ru z?=syE-GN2PzOsR;vl-@)56KYqSBwP$FbG4t-ZZ|lxcviXPjXAlPF7>)ld>ml^L++= zR$6VL4qqqntrZMY zL0~1U@}2jZ-+nrThs6cv%*)fRlA;Tpr;sAdC|vMh(ajXkQ&qA>>%)*s8pd1*{D(rB<-L%~q43~%ekb*>m1M^joo!wUMHQDNN6 z_4cQPXH;_bHPl|PW&2Oxy9A1yX)h-=!Lf3s?gte;f<(lQ?W4dc*L=~^#alUY>=p`e zGzk|2m}~D+T#?x=u0T)}V`5*YbV`LfROLUhbK zI~f`Mg(Nm#m7gDcqC|}jF60VM@o@1o>wE-ZmDs3}0(^pvrno)S3EwNUa|b;@nOp)3 zDKluK&1&L`8DM~9s~PM`t*W4*|O%k{pCLC+XP zOK{Yio#<5ok0uZSNyq34q!ULL=x}-`8&%%$2TWxXE=!l|{t@+|6zhMh&;C1;F-%jM z45h=QnA9%alTLSX;D(95jkGXBleae3l}awN1zwtl=q0DkBAGMcC9Zd{EMYRMAJoLjIqCVyQHQVpSgML zry7wErTEyN-0JFSvstqqb@sW$wsEO$N4JYxyM}y8XMX7H@j%}gjdr`a37_akZ36Zv zVp-s2FTf(bTr4M*te7vP;Cwa40a?t7zV&&%7bSMw;NhWDw%r9`d6*<^(UIf8iaUB->L5Q%3qb8DA+C@_G= z8KWq8sg-Ur`QE&JVB?Lgd?h$|07E)YMWF5`_Fv z#o-7B#1>!gLw_K&2_6X)>YUG-!#Up4$zAvLc}i2RGUeMX)@WRW8ty7e^N~H6MLehW zb&p7gQ+XcqvO~K{7%>@E1-Di9!}%V-$F_2rGAp@QJNqax+n4bRNxn02`#m6u5{{Bc zfv$!HTqM_y@;dp*q_AMRv4&5)93H?S9c&oUbiaL_V7dpzxy_zlz%>eRg{Uvr_0-z; zVScYoCfNnlXP<>|_Qj1{Vuw4Lc#<~UqzEVLgJC?LlZ@*)D8tw~{KrsxBzA-V*Y!A+ zaU4xyd}x0APWKeEGj=K8-U<`;7;-rU6Eh;1JG@bC2*yoCq@jyo!C4ngtsol?f1j%e zKx@v1lk~Nt1RE1RZ+rkMC#6~Dqjj&TmOf~ku`NqtxG16G&Wy(JoEo=(rEIAZ zrSE8Q3dBpEQJ!LDW+kAE6xMa7sg%DR8isEKcg$>T{~ksfm(4Dc{s6MPvNUHmh?24-Ri`U zUDvBdM@v#?))Tc8y)a6^)J;|Kt ztgii>R-BZMT$0)1P_g|Xmrod{N|ldn|0t?55rdmT*P;#?_tM#uwh&k77QB)h6?qV; z;{`oH;z1DB{M3Q4i29fwUwSwT!^4$t&4ztqcUkA@nM^L z66&yZlf&nF=@lzl^*Fwo_+Ty^jZ3cFKV%Q8lGv%q3#iFLj`aau2VZ9b3sGR7b=x9g zgL0+gzD3JMGzU&R^DOcVW==M{w28nBkoOh) z+^)Nqv>4t|j{3%ezrk%n$|ZREpU=7YS9^33O}2gl7_K48`%I zI3M`v7A;`wCMdODWfTJzOj&i(6{a68&8doDs&)TpZECR>k(H_}`bRP~8=LK#ZrfUK z-*)`wtt6jDnka>dM}uF+QSnH|F4^VSzhT@bt$gOGA{|xl7Pc zONl>bMY>!OTvebZ&cSIG#1u`;=mzv52kfxf<-(dU$eG-O_QL$4jdZeKTc2^E)j0@mJ6N12zJ#3qsWe2M(0PKl|8?4) zV=h8U!N5CUYE6~%`h$a;0@4JD0>=?}2RcO!>VvaeU0V>Sy9600mIU`fRh(U5z zW9?O!v#MFjoWY}Ldpp-ZGV|e02yz7i@jhrQ{BWf$5EW5nGl>8TZPsQ!;vE|mhX8)c zz8=?7bGdI9Jhh;_2Vid+)E!xFGY71Kc0ZDBevbzBs-FXGi#b!wuvJmLH4dkH@?swg zXL7Y$URtkNdHevn>ZL+^*HO>KC;WIAW7N^7k)dIZ$7hEo{pY1%S`r8*ir2z;+|B{+ z)lW3r?IUD}V`@LehaU-8V%?7{v*NWqb+tqb2T`3jH~spt88*YG5N+jT1CX86XAJMtku&fCe$aF`1pmGuV@5lGb>egtVMtp57+fL4X($ zg~`4s%~@^@gS`yQSgT9Lk5U`3cR?t)DWSnjGpyt~F`uX0SB>Ysv(?V@n2D|Hw1ifR zhumf_GJ#Zzm1be4cN$`^8uSP|Wis9X zEBq^6p;jv3f8cZoO4u)f_>og#s=;C%a#-Z?&a^gr<~-1XQsxV6bTb-uqPt5c4OlhS z7R{NzCX^4M-mtfvBWIq=nw86~RN146)IGwC)?8?tp!s$X$B6WUEq=uBic zNX+RLy1CEf^yqxVWz{ktl&k(oYu?`M8ey)pQyOtUM3^5+T>phQ|)cbU(s?r67Bt;hu-6-1ee zcUe6HXAse)i0FEcdw3NgUBSCWN6gJu%*`3h&Cf(r&MKb^Lmpprf`gzMzJ3C})zPhg!6r&w{$)vINFl7|E&f^Wc+LsH!2(mAWa`vU#M)#(9 zkxCnz;*Bea#4MCvGhlbc?Tp;T>8(#=Sq{`%0SKIwHfRAYR$OM|7D4i%4j^m3r_$&-mSpl50ZiRFIjDg+nFw&02UBPG?{BZ-wg@sy*Zm}LIF z!p16IT9YP4#l_+F$_agj;h78>P;~pXn)f>0yEw!KSD+wJpTyJl@8O$Az?2>C6UO9@XIH6YNkRM8HttJkJg7xldpPt+F z>!3vYPKx$<4Rn8%RoyzmC-6D{g{HUY{OW`xE<@8Dkl5nQB<=)RxGt(H?LcS+nm|JC7**j#_i|^+n)5w8L0R$ zngINp&tsf5t$H(PAhH71l36H=nwft;kk%!fQgO0vi18zZ6JC7%0*u{R)5$R5G#4vl z^O;L`oQPnCq>rv2=D?^u>fQH?deAOc+M#jQ2c$<*9Ey2MoVToZK@3@r>;@}a6>PD+ zmzo_9P2vKX=n&a2Ht2Y!?hQ;Gv*h4_%V`YkMgW7G)&`5P~`wn{HxA?c$G0V8Z7B#{%0?@xv6~HIFYHQJ(g)X5AI?8L!n^Elm z71}xs9+hh^fMtge^E#3?y_=IZUf7)zi zk$!8>Mse-D7c>Gf8_7Wxw$4#It`+p@4%QP&)MxEl)T>F9+$W$-sB0DmyRDJ*re%jw z7jk#B7L2!h32;*F1b3AA7nS}5ZhPi#tp!5SD#L4%N|hEobkl#qTnUsd!Wn9{^HpgjD(Y0RN5@X8#g<6V&bAZP&NwP1 z#*qv>)7ZiSt}`7lD+*HDQB0G+(=*U3tU|SgRpJ5gNcikp{_mjumb=)8be$#%hg3(fcbni&<(u*XeMid%@VveCOl~5kZ#p&6dBP(Jm_xY;iR%>!}wvCjCuPZs7UA=pRo{lDP3L>7y{v#0r?8`Nf!cidluMteoSL3K6*r<++SEOc z1CF>bIw37PPmCtgE537k^zk-~V-lqi~ov2h3{8Dtj zC^e{f;AeS+A=2k*-D}Fn)h$e+Jnz)fZ(XKt5WAip0vpr3-X_)C zkCKXx-^J-B&>IY+GP5nKX*btYA;20ruB_d_{dx?_C}c-@Imf~rX5BwGFo!CRYF4}z z_G~67o}=EebG_B9D>u-8lUNN zbBPKIa@e$_&HOj{&R#q|lzM0L8*763= zZMS%b<~?B6_P{{}QBS){AN13_~YxO42aoYr(#%zV73t`9I-tP2Tl>4g^Y4H6=i&k&)QG+SIJ{ATod|T?p6!juMOUp;FfU4f93{0jL}um zO7{@)aD~lOwb!4%tXnUX#y;lj-uz*Qzpp_>&~E*XcFXPC?I<9PO&xou`t>F?sM4UE zxcdF>nr{BLBtP*0hnE7P789`q?2ZhqYlzaUlkBix+-b*&Yz!^om-)8j3v47R}le?xmv-Nzydg`5y z|E?SxRSsUs(^`*l#O<8;(;52?jW9l<$d`3(qaGFwt+Hd9xuxBtsC-u7%vRg)sHFfc z+yKZpTJs8k27GZl!4{wWsLDU-WT^jO+t%D5BF?*<^Df4OjjD&jF5T1)&?vJh$({~p zazH0c%XQ>mo60J_DNDaV!T96cPoXb&+(&rWH0B*P`v0ZHNpLu2P9B&sjNVvZik`5OVg;M1R3`DD`e57`VvbgAsbDBc(BP?tu$ zv-yO5c^L{uGB&nP?j;1-^lH?e%pv zmC9`~C<8kdSlezl?vkb;*4>3kFsshGT|Yy4Y4Nv$>I_JR8F}%m&q|Q=5+IA@%-yc?S zZBbb+BE;zkvL>pwG2nc>Y0FPXnob5QY8}Sb(jXD)RQBe_!l+xzAqM4p#sW-K-kui- zlglV*O441Uv0sdC?#N)22DJjdC#OsDxBM1dT!#8C<^awUNed#aDFCHyx)Imx2hQ)` zM9mn2$ogz~eT*X+T&RM!ZtwCzA{-P_0qKzq6p;E)I*;GlC~ZLy?&95!9#H=+^vSJ5 zTnX#2e?urAfL$qbHIob@sbS@N@c9*#aR-48Ggvi=o@t?up znd#0FS8sg>wfrpU9}e0XSq-yi2n*}H?NGWuI+Htd3$VU5Zswp!fbslKbXH+ev?;sN z&9vV`yBW^mm@9;&{tU8Oj~e6_aAuG%R}1rz+1y3R>ONe1u-5oCoXTZ3C2Iflwd_## zg6aMEb|R6;pcQTju5E}|2?26Kx49veU>_OIoUi@EI&~gEE%GC>589yg zDa2DLI%AzE{o*z_5Gd6e4wkHAm`wl}hDckKW|*v<%s2nphU%4XzLHWB1*l86c!46V1!&MjBA`zDW3BxytroZ>NGpkn`og~2ZjBjR;Yx_6;a_OE5aFRB z`aSpxR@4R+)M3=oaywZ|XlAl6C8#>jPe7NNi5&K|xK1e6(!a%Q*UPM!@=o4e1KJjl z*9Ti-pZXH*ojqIIO3r`k`Fh+oH~k{SP-bTgg7)URn|`tsze+apz}~bMOkM5KV*E$1 zX)Xlt;CpsynnPW?bjNX0lYA*h|4?yOVr9edKT+{NTY6Lng__j!J%19Vc||WFXQ931 z>q=R3%A&M@B<#u-UwjFZQtT_!xmZ86F#+z;J8*;9+ifC|YO@A~#3?J{FR5KBMTs7^ zA{Nh_mppI!hk*{J6Gboq#r#A$PpQ~t^-LYAr=2>Za=q`&`j`Y`!+?4GE0Z+MUkWi9 zoaM9X7{uoBrEVV`e`L#5wO>LarJ|Q7{JG0d_gDdjG7p^&;St|u*jvUP>7&HEH8o8JHFy6?gakTCAwa0 zwOfb^=(b$MIAQ zbpmo$CTRiTz-R(J>b)%)X$KuP#OZSVZwyLd7Vq_EjEwxZH1$X3iVUJb$^oO;7cHR7 zS0o1@=BU7!Fjb)di5eo$ojg2ou*c`_``*)_@9B+pO%nt(M(zbR`J&wRg%4j;poA5J zvfBs)v*sEdFYUC=o@;X36hg%9d!oK+0$v6nwIeSF63Nj<#IH=p0niXM(AL81?%j;j zRwBz@^|_LZ(G78g^C9?#EIMY_Q-J|v1xddpSV1Db`$-a?(TTaj0^Q@=5v(v57_krW za9c=CHsh@J0JMGm4JVqK1lB1S!w0AeS*gA<2Z?X2<~%gR`v`k=1yCViVWw0TaH7{W zoO$@m(-~<)g`X9`?clE$@pbBUXv(h!xL|~w^qTbD6y}WV7irQ6^EmAQ>MPhxXR{FK$9<$+@bBLV}{#$93ejXnKt-!3scK5K;v;RiVFqjtA&fGx4(B>9? zv_C~vrCI^5hqZL+F3C|0uwB%E+Yb|k1X2n*uU^h=nnl=nfvPH*dd{)k>qQ_>Es)gz zBPkf#0m`O~MWwe>k>@deC{H_Y44C1MOI`U>Zf2BMO30+>+|b285_!e|+v=;ifVk6_ z}Zg-kqHQ_U^<~1@B=^W%Nu5z8|!jD5hMVC@|^Z$(7+(a^WBb_?p-=~2wI#;c; z(U8C%hp7-9W6iS1A^QVqFuq;}>u=o2@w`j7Xt>UVtqR!%%#z7ORI%N_fXVlxBj}OD zX(?ie2s{GOY;l&2n{{BUJ>7~-%$6gerceL|**4ZlkQMN?<(k+0w>@jHOVMH$rTCw zfg}El9oCI6KEOVSa4P3|iM7Z|-49Ni5++Sffe|6CR)ZTl90_@|!~Tm%A(^)SZr^E) zbA?`1olUkqoAkndBCR{@A?^j~ks(!L>!ia``=NI)T$;R)!y+%rliLV`D+ku}q^ut6 zGZH%el!|hW7j@qFMjIH%mD$Q#+gK86iZNG5HSk2|y@T_HNCeuH+f6=n*?!gB+Gf8e zrx9yFI1>SJDIZZ&ARZ)nv?`e7bh{N?(tBd1X#TX%vH@+M-HtyzOyr|XM+JhxA!9e* zsDI{hR)Q*HR9I_RszM3xtUIhvRJO{BSmCg{K z>fjWrQDmF3ZH4wVN+n<3y}3a(Z!J8i^gpJtdPtfH-q21QNtSC+wyGyHPp0|m2t=&w zmOg-s-jd?a|BgfsMz}k>rN?nopQ9&>F3pq_WSHl{wf2D{D7#`d*E|1w ziFJdZqo3yaGzZqW*&tb_asfJXSE0Ghj;2~*&e?R*3=s+|t>9hnkGTzPA=(yblqXD1 zD_7YnkGpvuA9lDZQ*(LK7>6f6@ia)2@Q{m8(1E`_Ok~1dR2$W~c?$v~*X4IbP$mQ= zqs=sVEOKQelyehQoOtu|lH1^eMrs`$9wDCgYVaSmhDJ)@AglHsMEU0+u3XHljUwWw zu?kSHT`5<6)V6!H9P)x?hSI&jrp#svMt-MeI?8(p4>_c^4o=rArxqGv`{~<3o0YO7 zpl;*#iL1dcbUMP#*=$Dz@F5@C$&0AMuLq-qB^-QRWrInqSS0LI+m56wI&CTzHl81%(c{XN~ZKQd1Y zpfF_r!}))kJ2g6-cX-!f4S(6soM9Uj=vu(pB&ZCD)<81eu3@8^vd67=X!Nu$&{iW- zxxkJmPUiGuNM(5yhIOR9vUTI_s@}+mWA*^kuNiYdltxB{ZmW+4RP$09e3_9FMt=YNirR zrZ^S@cZaMoO7JOVk0D!_$je|cFEW`Vkk^0`Ou!UnM((%Z(rBBg`P#$Dwxq~ioWZ4k z;T{}J*fS|tj@YkObS&kqx#8!#mrzx^{G3OoJq^mLfK0o)W5g9mFaUF}HoDf9G=e~h z?S82tBn)CjEQ_TOnzuflNUZ{m4q2j$k8xFa>!S8OSMKMk>78K!Hd(`FY~kikn>Co{ zj!tzon!4%h>)7?Gt3|>iojAT`yIm0G(h9dK#I*7 zJ3bS^T$~IvO6)BBrQVu9rO{13^Nlz{{LJ;j?Mn!9gp1Ky9hKA|Ch3%N`2!837P~On zM!Bw~7ugd?y72pFR1sjE>m{fhK==;n0^N%<5d+SD6mbKlU`z%}P-s_d2Ikr%l|m=8 zxcXbXIK?6L7K-Ig%*ZD+r;*!*Hg~|{YtrqJ4%ihct8U~n6?ptU?qH7ky6}$!d~Uec z=}LB;FB-CT!65ZlFBEh0z zer{5qY)Kg_0n#ByG48C$!B0+|Z$&B)CuJ95>7%Pehr=*f0RZP%Km-~-Eo zq51$rM*2kZvpcyHY?Z=6(;uBL4+l>afPh^;f09XH_Pr*E4C36agiY6>NoC%JswQ}} z-V?Y`PEhxX%va&;dCf|9#${vCoxP+x7m)tS5WE*Rd1c}UGpQ0}ZTmE@wyHLqXTZiL zn{}TSIroC7Rx_^$VM|v3KvpmHa(T<`3Sxj_`^_-4NvZv*&rVR$=H8^?!wj;FS!GQ) zdOPHUD39*6J)A_SB*VOkSJx@s_yKThegmo`NqvP+Wvn5r7&fF6LG4Tw&89j{BAPnY zegg^8ZWz)jR+wCBB{(D`^oEnq`>LRyA-DS*XNu>e)oM>!=v}r6wxT!TiRUUe@>>y_ z+jXXh->o`JXVTos`Ykrq)%=$F;;!ARNrm*>&{ga2O?aMnf2T)d)s%bz?{+P^CE@&2 zqnOz}JZ!Id82yTXb+(B|c)~59eU9{ZIHt0Rkka3ncco7EvGF|$!n%Pzhyn@C{5gtr z3L#ueJ`Yar6et?7l9qG~j1E__3p}X~1p_mf4}IuVJKbHgOE_k){MWA@1DWJ-PKo}e zDteS?oLtrcU^_K6o$i{ws7#f!N&roM?BO&LX+6Br37YuEP+vRKY0;9+sl;Y00FM&% zxy2o4NkA>w@r?;h4jC2EU31iSGvS%bs{J!y-)@gI+rQACRUI6Y3UP$(?Ve%mRH3bd zMsP9y@1PJ85y>f6AYpU5_yo23BP2Ht!Lrk9$l*V2`?qn?RIc%u=d?(0?y0QJ%RMtSsaRTKD2Pd5Fo-q*83qFpxk zg52Eo8XwIM%RMSrHxU(*Ed?XE5P$O;t576ajAmtO>|ODoR!zjbk$%4IHW5*2rYVxK zPoOt_)-OE{+Q0MQZJ84dt-ERm{%_5r4J`v${Hmp0P^P*D@TOk4BNd$eB0$Vi?g?hj z7r>J&uQ7ye0@{4sfNYk@O8ddYMZrwYOpjE+)w>XHnR+SJEyyK9iC#d7+9_4^r`o8? za7+a%q}01df&5(^gI8dPAV8|18GsAruFKSgdaU5N$)5Ha+g&q?>vdv&H--0EO6oBe zi&O@u#V-onl_mR$wi9V_sir~~-qYG6^^plWRr;e)Pg{%6f`~;*U!X#m7kkpP*DC@4 zN*3VDzR&mJ%ub-IFUmEO1_}QkTu<~kvESXXWLHo(?1+Ea7aa*;;&1IlMhkoHOcN5q zyabX;hb^?ZvnwS&($IDVelx?i2leA*tev%f8Eb8YZo%t*t9D8$l$X+0nWH~7SshYZ z!R3)D`YPQ#nNBEd1p*~h@J&*v*4=^Ct+ltdTUenWbZ9P*^WJdxZZ_iq>&ZJLG?Jx4DVmu235W2xU2&CjJr{K{BUX+sq@KeH z?(Icn6NHt4+Rf+>;yQ3C2I)wEQ{0XZlHX3&Xp}@4jpoNGd-J9fE}mh9;AL3b(XN04 zaJT|H6!sbOC77MP{d*@7T%S`WZ;a@ik)BN4D2lSBFNrx^j5Jt_(}INRQt8a*?VIi6 zXnvlhN1GHP%F{Fb-b}(ZoheQ8ENv(L1qitkr9rpgifqX~Ol5I-moay}g10*!%aV{eI#6wc+B)DCyJ)bjji~K}T1~C3achIxb_ng)&|Yn@+K$?Ke$UtY zGZV14_xI0z+(Wb zaiBt)SEJ8C0-E_hZp+J+U{ELInEcdYTco5CGd3TL^v{)No=}UNKdzELlar-QZ zgJ_ho285Cx*%AjS2%D4_$uy=j`)EyqyG&FxhKscdQV%Q?79AjvZ}RhJ*AH2!x@MqT zY-=e^Rl-`EZBfG7>rb$RF4nS0Y@>5z6)o{*f;03i>Kd1)g{^@*wPT<~pa_#~TWg3F z)}dbfl|?q)@#dp-VyklCQ^vZ@7kb~NXw{=wq!^G3`zyve?I<&}<4)pRuUIQ*`Xl}_ z*lo{rp?R+C@nhS+c`U8#yLkNu8y(ED)l~({>6=1UQAhGnTm%P&zszj#_1XkAWll`H zty|+)g`@y~=lHJG%z$b3ayKaxTh4v>i);uTtgx@Q+x=NGF&`02Cg+WCb`j15$K*I= zd???|UIwhh(#0IuCs*t37CTN*TL2Zfh9B4HA*dV~(Csj}2YVOWlDk@L?Q3rOGmhvcHf;%Et}Z|4`-j?>_);2$WvZ42AW zea?_{*(=hprvxOZ!@BlJR^Yw*NGfWs3{Q9J* zEmeu*-558ivWagF6lSoLC@8pYh;*vLCU|iXycR!5OQrJHbL8$y5W<%eHmTV*c<$>* z44X*M65lN3TZrERP>rf)uG(+}^>V`r-_HT%!)f|}?>i=zjUvwD396C!Qv}c=BZpqw z(&BsJ>v&(tVi)pv2xY<~`$pc=|BToC3dx?n&x$9-o`3j@rx8yson{+YhKC^k%+ob+ z<2(d8I@`w2LeLzdMx6Elj!)E@>MBD-){O}+i_#7XL$Di8rv-MrRkpXa6Rde$wQaO< zFm299GDzsyt~w?~?w4ek*WmEh>t3GS#`#nbMZ}5PIr{@zEJ@%A;POv&r;Je*Q4!qR zadN~%cw=b+h0Or%p!X4u{+nCZty zdcZFwn;sn#+98PWl0jBnwr=F3ib93J@m30+M4yU)G`6wW3xAl_7gm~&g0=B&j~ z?^DpQGxgUChOpYD{CCIl9nve+pxGyR2niBA5YNW2FgsE>5#Il|(53TenyxKDWr)9+ zg!iwK_b+ajbBjD)YrpKHust81-G{odz-hSQ+gesz_<}{RN6XC)akS&5OjNBc+}NpF zhB}IaC`o9~N9n0YxIJbUX|`jN3jl5z1c8|0I&#iY0O0QF7;MB+{_apO0NAS#093{7 zyM_6y%KtTKG|YhROixBe|6q7aoQWtJay|qel(y&$sPd-MI;S5rY1c^z`*NgOK|Eer zi<@Fle2;aiDEj;OEGEg&bKO2gLNFm&GJUX`zY{zWXBD#oYR)MQJ0U}!@iMJ!^`KdMqm?F zY2bDRoL0=a$<0NbW6$-wy>q zkd(~3SC}@X^sQ0+JIc-a+o#(pq)o!oiC`z3`_-FW4B^4)0PwG$xyQMGh>mQBz zodLcag%W_Ms}X@-2=D_dENxX#AbQ)JebK7FFj)N7$5wHnwaBFU{+B5Nl!Dlll-uZ0 zCqHrJA@7!*$&1mQ=2MMk7Xpzm#>kxXV;HXQFC-HWpg1D)Jdw3V%-sqxM>9Dv*T{%T zcE!(r5Z6=(hmAE!?#zk4*1(^x)b7aPOe)hwlyo~ci0xNxijqs5S^G$71+-5=iV+t|Yl?+hMqzX!dFquZaS;$#BOV?Pwve*k zbXx#2Bp3EO@19w4OGGX{>O2@>lbd4_qSQIE3ilY?e6LMqS{*Csj)}nd$a~-0(z^J zw^bWjcw<2yNa|FI+^i#_qXtRsjpdbMkzUsl9u{f&6NS%S%4eT(`NyeE5{T$rd$WZE zBM%Yzk!ek<0HUW5G|^0g^z`GLeOWX0pF{m;a?y}c5EsQo3%h#;^rTg8S~396F@-45 zp+Qfyt%EK(Q*_B)x@-M(JLm7(WbPXM1Q@&B_U1{irtR<_m$yeq+gtbm#PA;@m{CfX zgHH9zUhP)B_pPR?zT~F1Wb}9kcX#5A(WX~pyc88D< z3v&?khxn9N3F4|qMuc&ZV~5r{nC5Fi2xY+p0vZ>uImG!K4!0aw8{3Hr)vUpkVO7EjO`lTgV9;ulP$5l z%y?Upjd6SjqqHK2f2}p4^no;{*GslmB+0=E7m%2nAqHqVt-6qIiBrkVh;qp)sNd0M zl(6ztGb>3bdHYoXcqvGTuSJsZ(lH?WQDfMjA73dV8mW!atuJO<&=0b3AF;`M_Vs$A zPI%A5yia{&(k8Wt2i(thqrdHk@Ww~b;KK{|s$cTMT%^Mnr&-{3+Pr!{2e=26nd6)p z4;6HD;sn3voU^!dNNS(WMGzC`^;9wx*Ib^o>} zA*{!JZpBuV$O1w&LMq>q9d`OxwB{Hhv9!(yYh!-xSi?ffnoU+Qd z_HL|Xz`h=|!$cXf(Akwh*CaH)Mv_2QB&icmqo|0%)V?px-1g3r_lYr?u{ z%7RhJ<)}|U`<^60x{DzE-25&3TPRLsM=*(A?QzQrgsQP1J>ne7zRoJOC63;D5bt!W z6{S0TXua-QFy&B;@7ZxpNCOn3s*a1b(AE{M8co7zAypV%xqX!Z&^y@y=DA`pB0$5# z|NaxvP!ERI?UXj=Q}h*X5g8W~2eb-N6?3*k#KXQQN&4IdyESYlrpO6{t>F~W@Spgx zqsJnwbA48sC8GHR_fsZt|3MD`dXKlw!n|nI_m_rkT)o{FQJR!OC;_f4QoHJ!oK5$3 z-kff+2x{fGsY%uZD6)xL9ko(AgI!=#063PZMB(bm8rwVyy*o%#Qg6jGJ__!=JGz+{ ztljb2J3qvtA44^8o?TLB$L8$zywrxWd1b2qKU;#uI^3;Go1BB5#s|nj7jNMAkWVw> z>2Ue?U9}}WK!YQNKlM!VJTAIWp9VDHAQ8F!_1v-& z)klZ2g@|uHH7_TW->A@zgQ~Gs;EIC?YemwNMFNBvZ*%$t@o3=gE4!OXp^xu@h^cXs zs8eZz`CqlWh|jB}HMh4}HTBq@VFfP@6m9C$IPY&*#jtLQGG)?(QyT5pJqSlm?RxIl z*JA3xpRg&S#-<$niWnt!K@>t8R2qF3!!%LZbwALwgVztg2l6FU7191yX z^eLYa*;4*X{Re?@?8S70(2v?cI?q@DM3lkGM_rg#P@Lkx+}D42@0&}=D`w2J6=PBC z(rJWvPuVpHXo<5!!My6M9vSyDNzq*d!yC^+As>_(B)&PNeRUo)yak0PSw0LWHtG&5 zX~i!Ib=up_L^>0;N^OHZ60%hq)2H(K6r2EJdIym{-W}qCA*UC43(d*+eU{`anYZDEq|ZHxH#SR`+3^9EIrPo0;QPy38ldjts6Vmh!jj$=>t?}iq8&SjhQ zQHZAzK%*xx{gEhGw+q8S0P7)yUvk5cDy*dW>2_bT&nNLTqtaL(7Z`~plqN^y4JIey zQigHiE*EFCHxb=O;KtzQSrNaM;OLX&2tIa?VWkS4LQ&+Rcp#u=q2tk>MSRs6Lpb=D zYZh{*I*ifvb-Bxx@KP!H_zdwf?Xr3JZyQ4X@&K>mWm1S_pRQuuJb@7JUxP5rUu16# z`sn#qEL1Kib!lJ5-KaRCpk=5@J^=upH_ij_8#O{^QXRd2FiD*oD%!+UMt&wNhI52K z7>_=SOo#h~|NEy^5+=4vPd?^%PZ_pnJ@0jLm||wRo!e;t;~3wM6C`HikbHxjqu2(z zQj1WC2^LNu)i{tJxF1=3&JNANV;Dx8=f{ZIrrKI?(N;}*3DC2f*OgUX74%>TbrEtV zc`t^1vpQ%Ci8Bg{Zy&;U;e*LB1Eebs^ZS`<#cr(OHYrSoUr*;v4zZ$^bOVw08?$<@ z^Dxqvc6)iHn5PefU3Z4pu}#IeoIgNyYQUg1vu!jE@ab2R+?d_N4aqR;Tai`*`N%#? zc_=y7*!pf;p62Rw*6Ct}5m34Pt`UHO7_p^M))}r$j1k2iH3P0#lJ`{&FW%09j!VE5 z%84g=tnI8HL2}j>E*2sVkzsmQD=)4iJ;og2_$XtduB#ZgxOo=;CBs~5OPcKXc^E=O zwLeCxAgXE##8|?Sq1J0-N`W+Stbk*zw3u*?D|>tFib0I@LKMc8*0(qaevE9%?QOnR z4mS|DDfw-*O2mJRe11QyFl%oDz_rNi+2O*hgF}PX@Kb~|-v`ee<1>o`Y{&S-7%RIgR@6zw(I+T$e1P~~NyCjAvWtFdyM%ulm9W1#iq0u~eNGo< zCVKB&^h(!!ieaOjH%~NRyYM{w}&A@YZ-HG+96hV+0!vjKc1!^u^wx3JXbwLtjPKEw+IM{ zXxarGD+KZfhdMeD$G#E=5ki8=g;X~4y#-{PwOX}vvqu}_iz;?}|IL~7$DLhm>uNbG0es6q38fPkNGGy*&4WZbdCW^Kcjf0)W8Iigo!y;X z`uQ!)MV=^dIE)iSk3oLYg6sH6(uC$lD!i}TUCp+2o=r=#LR4e{bxZO#iX;DwXyTqb zs?#O?R*Km>h5SJ%@dsSOpJsR|P_!Q9)6G&taVSg3T#0pZgW)O*=+ld4;R?>nWd4e9p1}h3%maBQd0BoIA9Psq& z*EOzrs+}^E2oFj|POrL_Py9AyF5(_PKH1LiG>!FNfI@sp+W=H3^%qM#6tGhA9$t5whp6#walLb^`&5(%1c&?SCV>HAB(O zpKV!ZqivSNxCUvTJ)$}u6z(T|tj~fpP_8L<-D$+-OQ5Q^E_=1t)~8WLzPqG(+pO9b zX;C^Q9@6f#S{;AB%$enFRvWR#L|jA@}#Gu)YLUI>B}_;#G)G z5rWwt#HZPATf&)#Lz&NZO1i1Pj7h5>96Wrhv*P8Y8HQ{Lv`B-*eW^>K>;FSG-i zsQVM=&|a?j#G~vo}>8dR~A;1A2RR2VVIBLaFFUE17l@R0VC;>3B@l_QWkjqi4T%nr!fH4%5; z-sHx`@{oE`H3p0mzMIiX9XuM{Iarw3k@hhK^5dYMtP_Ba`AmnJeHx4qbW2u=#Hf#y zRA&c1v%MR7xWmu~FiSN)+iw*hsN?;U?N?){%wJ)P_&6eh$9-L1roeYd3#JnJ729hx z_bzMFRa%nZWjnWvm(w$}#xJL6{tpScGwx`#^ zUYQ)&bJkfrhX*X;B70o{6#V@tL500BqD!}ur4v%#leId>Lw$uD0y()Nwuc% zeaf@CT*Yekk8?Ex9P&mU8^P!XU@`UYqLCs*g9H-=CkrLsUB8@YQBBKa+}ZI~z0J)n zI*#P;>~gYUiD=y*=eL9bXNX9JDHUakZB$=Bh6VxsIOdP-%+D=~Q3(%ceHO>q6oXUm zjWCPw>!rk@D9$H!F$t(M$>Q0y{Z{>0bI`6wKKE9e9htL7nYSl7v|D|x>y_9{LgZbj zi#hg{==HT(yD7VBIpYVmc`QLOmAqy-#>=8$N*KU*oE(~tC7^lNPUvvm^|CZf&PceF z0ozO%o+{Yp1;p>)UWxmr`krr>YpAk`E|ZD^q;f)~%Z5tAZYcU6?YL=n!8|*>j)!08 zFrD)eO9$Ut4Wpn=q^X~Gk;FTT^U?0nEWDt`Y5ecuEX8hy8AAM86!ebw)NTqY3Q0S5 zv#Th8sISSl%{?faLuACSHDpO6!VnP)MY}^WJKr3z`D~|9AI-7cz--(ryyUCiure@* z_Cy_o}CUb_Br#;h(Ju;O24J55g1wfg2g$-eyyl(@1D<#Oz73eRp?P2qIO9 zJIam9;+m9UR=Et*l@-V#aP#t2Pik&+vF&w3+CDwCX_ft@#ZGKhV4Xk^(?c~BORGQx z^OA@VT7PW!4A>f$*7f)txP4eGF>k9bWfrJ0PoEg4Yt8(3#JK&bE}pu+_81_1Lpu; zo;S_g+HF{y?+FgLgt6J7E8iTq@LCRc3=Jry&QDb+ezzYI`hI-jDxg(^{Jynzhv}<3#wo3bY)& zk6tA=qyo1TLPZ%yX~Q8mr-F>(Gdo{>Moj~F?uFEx5_$b#q#gR9(cbm)*pFP!Uj?Qs zZ5G7$iv783y^rW0kBUQLsGS9iH^1z5UY;`(>>TA-K1k?O=?H&|xIjbP{>he9F!*WA zj`PA77aaS7#Kr>|wHlV$ob8=<_@EUL40806Mys#Um)3N|QR`aWXuIR0-;lYP6erTG zuoZny76;YZU%IgXC3Y4zCCkBn!VX$Dr{po0bN7)$W_`QCPYL5WPBvVCKiwLN%Wp&& z)tc;M^WbQwkcK92IuL6~zd~+-eEE@x%QPdO*dLKJP>i}Y(9_19-1~FrRUS+Cin`Bg z*A1D@6?OdcMQ+zknM5Nw*^c87&7WfSpcla$4I>nLlC@LC4vlG=2wTV6EekDo8HTZgr1ZiHS#A^<-Muk;3@S>s7=hOYYec>`4d z@)6G8ao-IIX8yp&k|t&NuCxb_=1tAiES9Dpb6g*DtnFhTY7GSkaH7}nu2VXc$xiY@ z<%!`;*uoh`%89cLQkbV~E5Z>mPAzLy)SPW*4iy`)#dMIk48y173%vafm~k(`j5|^r zJ$^k8D23!p@3QQRuCi?-S&n{0mqg97q(3MvOKV?~&0!XJWC6>uP3#uWaDQP>r<$6FK4>~5(+ z(MqW^uw}t>X5Dn*@KlcKZKrq(m_dl0PRE~&pss3ook7@KnTUo`ycQSm$oJ8?1G&ky zL4}5bl}~jsGj)o!q^W>BUPnp8!&mbe1AT4mBP z&<4B}fD0rOWfB+j;KS?PZHy`+{C*U%(8}mj1?;n7mG2oXX|t70ywl?JDOl64p&JuH z=`}hT-yTRxBuj^LBvd4;JH_fmD!Pa>oKta&c(+^K?oGU9Oz%=n%}FF@_YK@=-5XJ^ z;>`p;`Bl6R+OlcH?5g(ud=O9|y?Y(Z=qx7uJAGJwm%GPf3VkIMa)?k2O*%&2E1yKP z@hePG%-iXcd}!;&&L^#MoupCPBKL7+%(Xg(kjUXNh|2XmXr|{gXA1<1u2$Q^thZW^s z5-vPx6j0GGp2^r-J!<&I79{*Y1x%9%_}#UQd)kXUW^o1ioEJA-Fn@~WUMG$Q{KmxO zwlkzz^S^Z8O7{im7%h0yce1{7f8OX0`pBf)r91*v>O_ra43pGR%}vROmWyHh0wB~9 z%-X}Yd8U2V$_sFtuVp8N?V5FhmHFnpU$$7*hwdiWt0hc>@%T80W)!IKOSSw2w&8Ui zcP6{nwVCWJo)(c6DKtgzCBXDrw4$gg5DOpm)@g3DvzzR*>0fO80AEBt zKA#Mn%(DZn`5E#(!pb?U*|qk75Zn@)Z>2T26VUZB7?yQ^k(L!LKwCc&t`ms|+c8rz zE}HhK@jl!nB3nS~#AkLzFY0pww)`wx81t^uWns5V(?Kkt7?Fa75qC5inG4y#0)5WY zFO(Culv3I~)C=R#hio2vxPPQm$Qy3-Ux(9kM@sW|1apJGF76zDa;?x$Z#9w| zP(NW_kWWhQVuBN5snA|GOzU4!i`HSg=2Tk~w!^w9qiYSw^MPqF0#yr1#iO5C&E-N=5u|NN7nUBeXv$a>@6WOe?fwHzT90ISDJ9Cm7 zH%1tBQjRh}86q#v@s5qU0Np(A@$Nzt^$-5~3GwwmwdV!VKdVV6am5KRy{U=Z9`}ge z98b|IHs<_2XM5!axFsjMv4~D5Ez(fU-S<-atEF|Wtn3COUPjTPBV%!rlqEwYnkt=D zF2dj^GD?o3g=OBFDlO&oSjl399)i+5FMr zjcw(`P@ilgEg591_R61gvn@#9)_XkcNn__NemZdUD4f!}WpRm1^I(35!q$5M<`D%8 zKUPizVq6z;c>uXRmu*>zhzXCP7UN-~Yw8CYi1@}2TWyBbaO%@+hm;-kDbM*WFMJ}# z{lnmpSGd3gt<^gEoHvDwt6tp<@-?66jQ)^+5*Wv|8J9tI!`do&#fV|eqBsFxcRNgeS~ zP80Vpq?hAHJCUkLBO-Jujl1(c2C6iY)I`F&$GeRMJ{b-+^i!ChHOgv`BR6H~?okp5 zlBhgTA9O63`|ZdkTQkpYs$&A_33e;`<^WnT%gXF;ea>EmL6WXg->Dkkag#Cj(PaO# z=hPon0YEIF$9qIDQ)VM(M`(jgC%%B-YNCQodI#iRUsUhF(aXo`!oFK}it<{z@APs( zg`29`AJgr}IiQJ%4hf?4Uq|;A^I{KWyJ@}%0b#tLIzYsO4jd=uU)<)2#G`n9Txbjr zdev)q(BF|0jumv^F+X1X9496g8rY-jds#FL$I6?!Xt29FguIe}q=>^`bU#mlm_(czv}U5w*X!+a_*MvmKjs1T;Xhps&~7X@r9I zp6#kxNha4v=%p1$l|k-SpV(*P5dndd7B?bnmogu=#(vnzD>cD}pt96x>l*pBL!4K^ z{ltgcI#X_BfX`L$H_|6V7>R*Bv>}IXrGU8DE63d}ZNa{Jg6XZ;@!~SP4vysnYH}Nu z@tx02lVho5e2Wg(O(?V2F-D*$$Uoo9{9mFkS8(-k|G6^Zv{J6*?eQux*|NE?J?2$E zMsIl~;0^d&2=EcAN4LE;!asYTkNX|6_>6s@GUe<+r5$)UGD3(MjaQzGX!>!sUEq^u zhYk8Bna38AgCk(~Af!JQb0G4({9kRJ7z&En?;RtNKEDdj@ z$X2v7#tw045NmtXvbzf)qnn+TNkxEHI;@mSH0xvV+E4AM4(HqmJX|deD-;hAc*xC< z@TaJN)QiVS09IRNbaUelezfPxApWsi>puRSp8#&2*ktzt*mBJXalassw??-7dW&!* z@AW0TI31|}=f37@u@5!dtcWk(PuVU(8VjE&O*>pg^o4(OxqLQ`gvX8DD030n!Vsp% zt;dCMX9u81yu>{8oPJCyMiDHb0u57y{=3C`jF5a}>-#QXgDNj{&^VV-p*L3xGMxV+FG+f(^@ z5pP=}I#XD_*W0#!AjGGW);iDr2&2quVEnv@rN*w#?XK!ueh!W5jNtxZT-p=SJ=EREvL^z_7^64>iKc z;4ezzn$Dh}PQ|}hTv?m8j|L4R_w>TjUit>BRLPAs=Gp6Gi#VCme3Y5r;AJ*$7iVZk zm3?*JJwr?z6=1VnDLi^+$}Hfw%KY+k0SzLti*kUk6=eNvHkrZ!aN7N7%oAym+Em4U zJ`T0QK8f1g?Eh*28xyxt#KQGTtO%=exg9H9&QioR#OOT5NySedW{{^gi+ei!~JdRgt0rzBdV$}_Mb$lY1xqYSnlx1Z@D zW{En}(OfHeMEX%4eDp_F-$HH8j^4hah2;Mw20m2P*m$JSQcp#6EMim|*TJ7+GA>d^ zKL?kzw=E*1^Vw8VNX=KjEg=E4B7nTnuxj?^W%-Z#`nP}*swnHUkz!Cu7RX9A?@a^! zrpjI)K$oi{`$_K!wpHAWS1h$~cY{fGpd@97wUfS7 z*|LXXYpkfz#=;&%F=u#7_XoKrDc+kj}^YzKH9N{hkcLAn!?mZy0&=#iS<#<=XP;EU+8+QW*u(hsxe&O zCa66I(o+=qO{GyU3Y^JHaVWN-*;Y-&cP8F%N>ql;Wya2;w#^Df^HenQ_KU!=lC zJ(t9e+n&*4MGH;ir7*&(a@CMg`g+n-cFKBf;tf3T_9bk*LPhq@5lL18gn6@@PAUfv zWQ^>Ho3W1RLby6FOZ3=F|~hV4b*653pw0i$0zk>74e0vm$HOOO}d$tI7@sq6j3^;q;|O zmpSgE%asYM?E^{svTK!q1Eu^&1&F70A^L`R@sn}F_!uEsNyYHPp#v>GVBvPVm{o;Z z?DPVxWJlaV{h0ePh5OK#vVoKmN~}rKFxKQ!G;EO&)DH!r^~_RR$bNa+1IgQAqQoz$j~W`AFNx%PR+x%*4_N7IK5J^N3xL4`* zY0+tO>mlO+B_r3_!zibna;kkJih(Gke~+YH7N4uvMq6 zBx%KqX1%W7JVFS-p#aX>{KYVee)Xg$j9k|7YwEV!dxiUicjo+6gK!1X1SZ7YqJvSB ztR29JrVJ|Dl}8)Gs#XO$iR9PX(LD;}K@U%g+5|TqWro~=Hgy_lZ_Uw`v_^SxXE)Sm5oVM;=DW9vz9HuU#i*0AKHG(1Q{+#b&$p1BZ zpGJfi2sUJa5a6ueW`m+H-GDi}72)UkO9(Jf?jVE%)%x(9^50t&$b1P^)CM62cdKbl zBNHmIleGE|^#Kahfe6^RR-$_1P>;TYpxjP+9~3_Aq%X^6NJSR)X0@B%FI#iaTl4^j zeHbLvW_^%KI&y-|j@q0GpS_L?AF!*2ZM8_4z{Hsv`$yEOyX|xoErm4}VpS$<{3BP? z+ll$6wC>}dqn5wi&eLiWRvG6Y5Dk}V@mG-7vGy@tphrjS>Xc1tlI@MKTx`oGv6)b> zulQ^kzndGb-swW!(@6b;TiQ5+sWQ&~vR|xbl+4Q-%d{1xsn8tjCosU>;_A2*M`M|S zc1)kp?Q$@d+1|JmeX%n$dvu4m-kEv8%-Z!EVDE*E9fr2-J6&z{OVIUaTlDGuN8kY2 z(>ubP{Mi20O%$S%xQprc2G6I5NN8Q04^qithK&um5KYBD=Zg0GIbZ*8;)t)g042r; zxd?F8{U2T!OYPKoV3#kt+z|k;GC? zH6Eb49dw~vB%DkkC`}J+>pry6%^5gemGRH!(d#DIcW-_~rEzJ99E6wmogB00omA>U zYD82TN&C>?B5p{WPog$89){bNb}QYW*q`Vv=3DC=&NB!P?VYY;yrzgGBIuEPh-c6h(DDyOT}bEWfK zz3u!=7|p2>2ENl?XhCY&x+i5H{c$vB67MvMlf>DMPGCmYxVcv2sPBEmC(UlOSO*$} z8%mo$6>4UyT;%O%Hn?d_5BRJaW22r*3Y~RGRXAH40PsYMv|8yoMVf$n1`srH-X8<} zko@!IJ{RU)CauZlmF9hg{3v1}W?9Tn0up3x@9nSv)1BFktN9`P5VOw%-H$zKCF}SN z;?W_hqhGx*)Pp`X+sTc_{V7GhXFR56YE6@>w0l<>?%|*^`=kvN15QG}3dqOT6S7m_ zq7t4Pw!Q1^Qz7vJOG+nHC7|A4|&3TUzTT0WkwJWOsTC?w3Be;b4XHTQSeu8 zH27@S4txuL@$hiL2ZixLD2?+%qwT;Zds)#6`F0v5Pv-BC*DXXFZKkc&D!Vzj-)AGd z@Y6P>k7N3!9U8O$=emMJG69qakY7W#F*DLf)X0$Xj>cC}yMWfw&)`@`-QK1VCzx$r zGCOi^Hq6){4OKjqM|ZSzBj=@=IVeoEz17Mk>$Ml+c)5Sr+tEg<*lkewhOJD%EFV)( z(M97YZ-iRb9Ci--hzB825Y~Ey4!5ZHL#>#aYSl0XW0iwy?2B2I|>@^yK*z7#AQ*4qhg^))!<7rEoNn`_G;t$Ikhx z`l=aDSA%&f8bp4Y408dOkKnl0io5f$WyhY)G+3Vh=%p!lwy0*i`mIO@t@QTQE7~PB zbSlu0mB?lzvOj1$?y}@wd2X`QQ~>W?0w^ny(iC7j1SSY+HgA5frpnZkD-{z^mBY!k zo3kAkEWy8w(GUkl#X?J8*=FN+wODntkfaEI)xlHsxVwA~OM1ZqU7Fz_gmQL-s!1^h z2){Zq%HcBpFC~NHm2PimNZXQL0wDiJYaZl+pJ^MHk#5%`+Ar_5zC!`v^lf+Ay=$<@ z5q{}lVGnWMu{v76mF-@{G`>D`2rpJXEsO^%NiI(-#2afrpEVcK>Ou-(w0XKH$If1; zj^H5tiHfWbC7+V+PT=!k5`dgS#70WsUtcH?VKur+TUj3p*CzxADe-Susy0r{!|?_ zj|$jdJ;+&H=BOs8dAhKY4}Y#N({G0p-+kGYu$36N$sPZ7AI0jZ%4ov)j|Lbb&6kj$ z>|eoNDTTYI*TYzUOhuEA`Qm+t<9RV*MJu0lcz%9q3)h3AxQb{LhnYUtc}g-Kc4Bl52TC+|EHmD9_Iv%Pl|fwx0AY z!E-2|i;0q5-(b@;d@pFLNI+;7O8|gd`C)t-skABpkAY781bg&!)?QWxpc|9^^hLl*!nT12`!2JGRi?ChlyRKvwjjV!b8ltMn2hT%6 zN&{__!%K4OmZ|SPKh*yajoQ4nj#UA_y32z$yjEl4}|}PdvZJ25c5`;q%W65eH`RN(H_7W}2TbvPatO zZl%{sDj%}+?)-WkAGlYmTG9|f88!nmYq?o$jYDhR(|icE$DqW3Np{@Fp_4aucQyOB=6|ojp7s^WEM?!`*VCTF2cPk0l@W8XX!XphGT4 zNv7E!F#(PCK@1UYKs;RDr%)rjs5%`~I#YMF+tzHWN`v56Sy2O)D&v0@c{Da5#bh{NLxh(aHwOyoWM{}!!5p4on zXq8MKOA_58HMt`3f^YI%(KzIJk}qCxL`U0nIil7PN7QP27hF-6ziQ>k?;R#ubDpTz zikv5kCGF}MsA@TOo7%>RBU+=>Bp@%uepEa1X~@t14fga6@XNQ`txM#EM9tSoyTWqk z>+ZAUni%z^aDJ?i9Fe!&xnz~|$>q%Xv*kdXsDqm;!~_pu7$65Qys_&WVq71NW3dH~ zOC&kS8k-e`=2Z!ZH-w%%lkUMUzuFGZq?voPgHws@u{UR2J&IBaK2(pIRdsbpPmcOD z*BrBB!w7JWu2BF@d8lxaWZ_2o#ogo%zKM|K%N~b4KV6{1k!GM2<>|!eO5OnHCk&j# z+?;A@%06;tGZCd$tgVrr?2mwuItO(JZ$8vT8N-3Y9U}!tN1frDYlw~qEIgR*^-xa| z(0l;+d&Y|r8`3F=ri79fknvR#ip=0GaJ!Z_+q6c3<`>|>tGXe}l-O)ndwl@F;e0Ib z6ZD*U#^-wb?P~cghYPP`-95jJ747zgxdjO9&|B=v8eGYJc++F4qd19CJxFtVLm3|? zSkxlVSK(*ADwKlQcv6G?QF6lY{2DFY55q${Y-TotM3+1^i6#Q~SGuXf;*2z6S4LCSlWdyLYZLCjL} zENX|_W0EoXp3fBp6B)~Pb%vUKlVGEpk8p%Qgg57j&gO^GyU-EnPr-ZCW!r2e z$5^BlLK`&XK@pjoh?@D|6HzgQehlGGpLPTt<%8Y5d98i174Z<9PNx8)+8}Yd7G{6Q zfMT>^q#)+?Ys}AKkt*$qVJEsv^g8c#7zP5nA<=y=Z7-zk85$0f&guSuM%nDC&Y_GQ zB#w6zFV)suj)alh0T1C&jwG>JE{`I$p9D0ld5%FhXKpOI4S_&5VKO0$+naNe`MDOQ zWz`!Vy);B-bzb=pafV~0oQamJK(q)eFtSn3&d5Utj_~OtovzOcIM{DH0A^hpZ_?6k zqXs-aio+zU1=DFR9ySu|eB|j}8msZeG?BA7_aVD9S=UH{5NsGq+0VjSK>13e{XXqJ zc|T?XC_oKs$gpO8o@fVj@!=u*zankKS|PWid=-{|fgPs1u2^edbS1cZ925a%06&U# zj1=-YipL?zfw?)i3q;9~AC-yxln1eiP4gHW^YfeR#X9gKg#a3J49uU)Flna|H=AY{AfO@gAWZsC#R|}^=`0V1@NuZfUe@A%1gXO3$kO4b@NMnu=?F4~_2U`|lJCAmXbkyL+P62Yk zk?V!cIFWPfTu0CH1~Pn4kB-vyVur4+sbHcuCR!yC&$(9T1ummY{^?Z@gHJpr$k zsLW?`c~ux?vtj0_SJDD5mPq#H?4TUp^$BPk3#AEuG@;EUP#T{`*eTcYIrON!2JZwR zR(kLUyXcEHsH>u{$lF%_`j#$M;Vz@z0C?0atPMRF;KCMWT~%^6le+qNb$3%<7^&}k zjyFC+S1R>23$}j3O)8>s#+WKM$RhyNnumOaS}BN(o!-W4kXrXcZi;d>N?a9;!JoLK zE~Icl_5k~(F3Pd?SkeinN;#WY^q0C%NP5!gmjPY%zH3jaBMG}u?E@b;>8PO0FEa~_ zNQ*f@8va_Ck#`_QhdGWZAyyXHn1^zvS!8oFFT>B{O zN4Lt*s?eA zHW!FOJLY+jWU8;MzERU>y42d=Uzl%tK1t2vJw^Z5aFmzJ!rSi^Zh&LE-OVxM7TmHgJYfmTPQpx8uxNzRxAt)I~V9AP2Ei5V8LN!Dq4P5!c z7oFCmfV@_m+JN2MCm~$XuVFk@HaucgZpEqq1>BRhpE{7JYz&<$xR|U0?z~+Y!+VC^ zCN`uO$VnpC-eNb`U~NCa+rx_W$kf#$Q*(9V3>XZN&+b8{4i*-Ca%E&$rh+i3{Pr0EP|BehC}%w57C>Qg*kzu&(}4*=vB1El?w-8%{Jp!)v%{E^yM?npO4k1g{fW= zR~KbCsj0SKUTaF8fAk8Xk+Y`Rw_L<_`ye>%VI$GW$i=z-zuQ{s#xw?o$kaU6&I!0t zoOWjrw!tjht3`4s$CiwDS;&W&h#e_lv!sOZyAFFbEgGd7mHvi!o^KmK2!B?S)`Rx& z6auzkv}I$$Gqn5K-f8RKrC{V0sY>flxI70F-nZI<7^%2|kr_l>$oiWwFC!EX@*CJe zg{nM&OdP*ITFH&p)319|yg47#&kJ^Wmh}W{X#$=kh5d!D&dsbW(cPw;q2jKJxTd}4A%8|~R@;_rfI}n+0`g9E6%Xf}njiTA&sFmG~ zeg$mMXAMc2gjFg5GLbrON^iljPJpJH)r9ErwmF7oMXUl?7;A_*=}WePHdYd6l-Fk^ zl0!bp+37hd5`QHlp&`ZD(@DrAIM%26AC0a6h+a%*^(lIhBZMDiFQ}CBXAD4bY8bfN zwF;e^o5tl+2!F^R+=eUNYSdFD1r5v|W7$600|h2`dc?<&s!ada&}^hpl2?$u2h$rs z4Y%Y2Rx+Hq_vt1P%oCo)>)jo>iv6fOKQWTST#7-EAHF_ITaXLsccKLOEJo4l7*dEa zT#{k6wuGH)IdTBkatN{ZrFq;C{rFKnSj{72geZGNt8lCkYl-3kOf18cpR@^EIx}`9 z6`CZpnIRuXG%`)`Wn0ulc?(TR;F_SPUThoClnW)JNS4oI6IO;CBd#3OK^@~{RARfd zYKfs={FGzAl@U{T>*ejZjf5diR9*$SA}hRO0v{H9dUKM)M|JXX>l&FBH>vYqLA(bv z0p9KEWX(Vn16YXcE(+W68M~&@&Q2pU;cBl38M5O+9u-}RnKcn4lu{%}{W8aMk{Kfdu1exp3jGu+THvL zg$4dplDt+g7eyv&+(0OqRy;3Aw1czMO1eymlzLOJ-4 zZT?Jb0mJ6rv7%|5)h3gVKNam8LccsO_RpAY_Jr4rj*O-#4}t_|ZqSx)wKHKh=lO)# zs0*{A<4z`e6Sh{FaekY#C?otGoVzoI(Hr?rZ#Kqk3t){Yl%b!&O2mGDfGq`k)5 zOgC*WI?1I@=M;$jPjI2Mi}xH|weciLtm-3g1Zxucy}}lBv=6Wm6BYbgVO+*B^0;x> zme@)565GMVduacGY0moyU}Xzvq@CDLn`~^WcgrkJG`WhOc!M%+(u$LIy;>E!d=6Et z9PY(-m)Qjw`#OGMB|h|7Vo{7i1<@X{u8m`)g!%jJ6lMsec+3;B(9E%FZv$C*4<7Zg zG^9786Z>LSP_;*5@vu^ZXuVPcVN$4_H36RWsw1nEED|TyN{~~z1WsR@y$?2(0;gU? zU=|_i_U3k$i|zCFJOT*OHcsrZ#}L&Ti3+F^eZGZHj$l&G=Zax4&)D(vhyaIH?2@-r zm5Pm1lf~N=47NqB2z<)%Dmi|D#*!}XR`G^*-kh7o9xa>TC_vZp<(sW6j%wilYUr$E za3;sXkAyMAOgYo3k`h24kd zq2cVY=C6K0e|@K|u1$vR$)NRkan85)4w4p?Cun2DinJivS7S(lsSpmw6gY)<<#%*j zy4$VHg~iAH(=C5kh+{w7jub!@;3qqp6K+Rw2E7SUJ{?IZJ@EdhMF7&=X*yT1^C7VW z8KTlN;53qh*$q;Suw0(ASxxrrJo|!JE+4{ZUXAjo&XXg$;UucLLKEylS!XN4Jl{c* z(b6`{o{b+UPV{YvCW1mKo%9d(IrW8yC5{;e10{zAd5?*D1cRU?8 zT1GI^>#VX_f=Go>F(|&|3*8v#IUo@icIIW;9BvPqMxN$-s>kl~xt3}oCGyT?`2hN5 zey{j;O+DT4#Fgqo!BV^$z^egC=StOITMv=(W>El@NVWpsMzEOG7>UXYcbjzKK=e0HyFkK7!P@m=pz6jAL8n?EQ zI%14xo}QJxUy;G}w@`lBtXUZe`FiMz@rq7dL>NHp7 z;=Dp7yTIerN&RKs`-`4{JU&oF4xf7bcJ66B-DzV7K?3r5*O?et9}V2W+uN+X)%I`E zErd_x_&}xWLj!hwi+#`o4C6WVHDGM*bA0ygW~oar%b&{#JTTuN6`ycBBJFwWZAFbD zYVD2frV%EkW0Zs%HG}Y4;GE;^=)CDZ1PSr5O)){&Wq>?NmLcnultGbAUvaruYO^kK7|3K0-_ zebUZYn?Gxd<8l}ZKP>m8axj4uBwClBAMIYL< z?Qo!-824Y+!>xECYrl5Pp);wyWL!{0YaNbr9e)}KS$~j8B~})bmQ9bKWgp|m*zp9H zKFZtd8{VKY1UkmXUZwSHsmkH_`aZLLt8jeqhB6QXOL7ScCtTQ)aMugWM_r{QbUC)q zIIXH8=M=Q;fI{R2E>$o~b4UCh{oX;LgbOfASqRaj_esy=9VJ7=r_x97#_?74oE7t7 z*frkr9pv7qfdy+XsCdT>-u1B~_=p_A9rM+PIbS#rv}$eUgrhy;*@{bWiOPFrWVdN- z1YNkF1#=8n-w7}?Ky!fTmwQ5bq#+eY7Zjt`xoKHuV8FK#uBdm{!aw`QN<{?ZoKI{K_4Lbq~I%F^IQS#qanF@xn@ zX7{w}Qr%LkMU`rFdeC!GnY8`0+xpx2$x33NNw_o7?M2^cBfjf(~;X?DioZ9;NP7O0w@pFf$?Mfhz>ra~l? zywSR6{MI(uR@E@8FmvMnejSEX0ZMNDRKNZSVY8O@4-FRH#_Efmr z0~Cq*_cO&}XK{rMW4Bigp;c;h#835f^OhC1y;Y=*uPg^C%W+#C?@|2)C*4oZuw#I^ z+$lih7Cvc=DsgaT;X5s84sgL|0PKNMBdsz&)yzj_!;Fg`D$lXr)K%*rz)u! zZ|Sa>O>QGZek5k!@RVUW-fXnc*S+xAR2zukFmGj9DTF_2L1N@>uE~NzA6Vh=)9spj zdWnWS1)M)RRY9^}Q~5Z>t$h*hN5^s!1t3Bf`3XnW7T%K5IWg3F6aA*Rb z80N<`U>TqFJmJZH1M$3V2?a3E#YH<_Tmqf{jG2JHb`VX|-%_K+808brVf*bX9HIIg zzNQ3BdkRsdZz3xdGxK!tYT~~Tb-3+mJ6*{-8(Z4j7LM4MYkZm&O6EupYb#zwdGwSR z+=B@oBV33n{oPG=`(V{?zIEoLp)wytm9hY6VbEoUMV#R0d*`ps@&77;sid@NirtBK zy_BbR^Q1R~kksNAin47I@{$%_Gq`*SSxXqg+5WclcKBQL$XHd2mH;@vlxuzMVj z^{CI8q8&sY26FKmUgHNbNYxRgz4=tL9*g7sIfdi7MWf zHb0#NRS^3f01XRgcGHCLxw!i&IStqnNGf>l zqO!K1anQ0TXSxwvnt$+R-f%yoXZ>phq1dCLH}Z)Q$M) z#jhNXR&u4_QTuno|ALa{EJz2x?pB=AR9X&iE6<0yk}y%|)fz=1lZJVj3M@vJlZ_~q zo7~YJwi`F{y5F%o$XtExyGFY87TeUA&X*Epd^_DWZH)wAz*gISx#M{YwDKGN8+ez; zPk+oVX(MQ2h&gNSc<5bC2qbD-6x-v`Y-_@5-;5_>_7`IE6+RN{{=8kqM(6;cC5Aba zVaGEqa>4yU|C6&bh1>lV107R>=-S8q@mDSUv_&?qTdVfy6RiyXtymj-F|8<{9I_dH zTh~=3!F4}mJ_UOCr6(x83(LV#v1e7#uGfC+#wU|o|7+jEIDZ*ZWEhIMZ{S~<2U zKD#^SN^RAylAT24&2}0kTw6N0F-RNmMqx6XzozBYzXm!Z!f3;?rxD6lK{N3DkEGX| ztNeYQSKMi-T1#dGp=QNKxd=6R#PI{4@oeWmAZ(-4nS9oaU`E?x2u zX554lHp|%ru%Fj@&PLIYpMqudb7h9>B4Pef5myx{H8nu)W`q`?chXHz>?lww>+^{D zh2pdyF%MHgB=jyJ+5^hPv7iJVlkM^$vN}y-&m;IJEl^7mvrwm$rE0u*3 z0(sZQ_e&R;g%CB&Q!=+;9?EmZ01u-E^0(8t1GpJsTZcJVRd44}ixJD^&&cRqmb+%{ zUrt8#z+4IDa)>zuj0YPWrA9t+b9iZioDBiO=atD7cHOgAB?oaD)0E#+?2-8C|7qxysg`b`b&5 zyJbbrq}WO}-|?cwn57Ui5IBtf4xAwLCf|@EAV?yub`tZ2n>)EtV@M=3@fE=uY{)u_ z+xR9lCfeL@l^p*|h~z6&7$@7z2-A~bVwF#WTX#MD2-Y3Bw!8}B{YIg1{x%yRh5y-2 z#}aCs&uE+49h4=%>qKyzL{OLI*Y4^IpadN;d&c{6m-a@5cH6v~^|E{qdJXlhcg9nXz z1yv=KTSmg@a({9ZwbHaqL&(VEWfyzj$-645e^#br&2h=vifGbr`9g*z)lv5 zYs))0z9Kq3Xjp6E#4n_~g^S>9MO2x{ghrbPIMT1vXX6=LP5zB!uF2U7d#l4yD^rMN z5}61sccD0zxO3aiZNGG6)HNp~Da2SSp=`;Jz82Yj>(E-#BL1MLR||(K)Y36j2Zkur zXkR9mD8E11(}^LwVt@+@*DgR{RUeyXk()6@Ug7cJPIny+z|N+(_jZ!DX?dlWjvVeI z9SJ_U!H(*KLriDK5?M~&mb>E^?-J@>6%hiXZ(e}vuT`#5iHi<`$lbugD4X7lj&yK=9c$4TpdQ`9Np%J{8mN(B{r4 zVJe9sLT-|hkXiJRShU%!&nFglv}o0YMxv(qyZV0jFdph97X3v#Fc9}e@RenD8{5mHd!!Xt z@&Bu`nw*zaOtj`+l$pGKi3PaEoYp<02&87^Bbmht8+)hysE}K5Z_tbBBe?}ll_j)d z`1)GP?dvXYt?Y`+jwT8Gke>JH$1zHP9w@#vDaKHU;zHkMkJ-r1id^Tn90? z)Yd8z#fnayWcN4(?5nB)l@f@$RW2`R;>wRIFcdPMf1@O;s?9Rpl<#IcH3YXGO=^}q z9Bcb(7Vdd*=T|n3#1#kI0VqOrdlE`R{U&mGrFEnNSW@ib3}1`J7gZ;N^ny2I5$!|~ zp+Y|UX0zQgVEdLZF;I43ev7`Wl%@J2k_R4}@i$jE6yt$VgyTviq18u6t zKb#~K_4Uc%j<8!k5KjYZUnBMKqqg63JPkK1u&^`ggZwxVbYMgx%{F!$Z@I_NB4S_< z5#(QCY8I0mC)aHbZqU?Lq!I|}ZqPHMO|$HXYK&qk2{|RNYn-#~$Wkr*7pY9CO`nss zzl(84U2_~n%K=q2mVEUhQA3@ zYu}@2st%B7cxMP~o!=Fiu#{)==2D(hibQ&_aZyF2?8hJ=?|)d z6!wpDHHrLU-cmHa@>LZii*b%qhTHkZ^{o*^{bNsd*c6zk31@db!9~Jp^a#*Qsf;H$ zSD-lE7qUuh3b$(v|J;L8k==y#^+CJ8+sQi-Pj$!iL+J9J598E_ng@}=ONPJ@m%#ok=-Rj7-2;!BtmJVhGqfC6#6cm5ng~p z4szLi&IWH$7}sX|rI8}u-!@O0_QIl4+RUS(qL|*$@FE58}V%f;o%XKU@rsT&uzVt#irmrj*=&Yzu`R=mQU`INaB z5#d4A_MMa!HPVe4=XV|uaha=9>+6u1{>G87wFwxUi>~rnjFDF1th8CxDB`kL>;1(fZO02a2vF0pe{kHjcW(3 z8fkkwAh(TLb#M)~)@8#UaUhG`E6=SBK2`-se zcQ^=s>%*KV<<2@y6HMsR6YuFqsaSohAoG?E#7Y+6*`0 zk5-u`9ODFCrTdW(Q)S~QM$p(H0-wMjH}9Yfj*B=WWL4B7G+D4&$;0yXcX1Qw33vsE zvaGRQvwWUyv!_}V^lrieJ&g=cq#--3YXpjW&(mP1e`ZBKHS=tck5z$_Gdnx)H?%B3oMNd{uc%UpOzUsh<7IBpXDmRkmSe(vmNLZ*D&=g_5)d(+FX**{;CSMo>suwSu<7H(oDRMRsLUI!T&F@wf}C}b6%ilW z3vVgQWhXPy32+=B+fyWZQW)hS6(+C6R5I?Y2Xpi(b({Od)a39Yn0~}i%HI2j_|}Pb zyJsg|25uIr04iFA7h0kPmx)Y591wLje%|hQeQgDC9%T}chN!lwz&LX=LieM2HwyIh<^{Br1* zFnrz!qInHjZnSZt^^EAEwZAJRWB<(9HD_yCZ zn!otJv(x9;Ese~;W9SGv*g~7MJ@G&rIhi+kv4uWfy(qWA02s-e{ zJcgoVKr|yP`Z~+4w7au*dCalMFH!-CMn^oh6e^IFFD-6TekcWzlmJqlglIcphM@aM}(K?GM_v-n{3~b84#-bgAFInkU^KV#V ztLh|)Cd$&(LHDwBO7l+`vG(Ym@c(2z>~we*e(_~~T=&Ekrl>LOk?yQu1zzYQCBKi! zN-Uz<@1zbi5m#fW7Xu$shdlRDcb%o`H`^N4fv7^XgWT*T1n+0N0N9KDueIbQGwrZ| z1^%36^tqeCl|xVj5rsEn-G%b+-s*!pUA0C*Zahjg z$Z~Y1nfIU4GKAi5R-~7Sa$QH+)o3JA)oQs}!x)<&2ZU5Hya-u#`+A4n$M^>Yx*(Nk`1=H}zCRQ8JFT_D-U*Ul4Dk9nZex&q z-9o#2I%-wEeQ>?^*0aoq8Dhr>zrkXpJ|2U+HXz=pM`?SFBERBV%vIlwitgLHIy2L% z8l0CfY?9LUcER=KE9Vz7_hF1eP7{jPKn2=?Cj{Q`MfkHxH-|6MLd*c|Ipx@RudMDn zd8Sw>VF@MledG%6guG!W5TA+pG=$7;hq%zjXyMR;e5m14^+(;p-6`gfPa{A(L(ANT zg-O4$2SrEz9YwRJ>!GmH^&uB-9IS97Y_HNR$&v5XEqNU4iQHzu_3D=VP!O6sK^k+< zP>KkYLwB#wg9yh9JH@yF%drtspB3Qfertv`&XO{q7Vmq9#?gWZ#0vf}21&7umDL5P&5 zGv@xJ41$_h&vTt*qj#7;LvXW?CoEr+l{R4VBgiV?WOaZoA>3#LQWQ;tSv|qNh5a~9 z_CvB#9b%~`t&K6d7$hxCctKcW0gfOIMyvMs4HBsi6@>Mn8`?1*6upjA82z8RGB%-s zGQ_%pDhUkt-wo=T~jzbrnL}uD*KGtZbwE~JVl-pL89TTK zPd7KYEl4w6fbzFm{^A`6UbP%-HV} z1f4ni$MV(oRxpN4GranE7pB1WA_PVhfwKcS$DqymuKl>Jm7=b9K@%A43mWo*;6wRU zl989UzVRplNk~6j{4$<*a=oqdIF7rlC^^iHC^@_6mydo!>*y<-97wrt{2gJP|DfgOI9wxXR?>gJwWsHkG?js9~`<%v0cZJ|l zP=bS-3pb??CD;yqfo=J0+GSDjHK}fogiA?oz$C5msZi*VPFHuqR zdkNk@(!b6OMA11h~=NQq7J_lL^M%EgHFNjM4WW?GQ4iKRy7Z+=oKxYo|zVHEyucw zUwO2Zhb{5-;cGNntHAD@tWvUXH(C&G=W5)8dQDY#39PTR&AlC-cq(OUo!Tq`osEeh z$qVovC)($+3`-f!Rwr^pQrhWLb=cWx4>Ew^vA|v3Jg;Vm!ttE0q-Lg@JIw%2?f=_4 zpKL;zZFWSws>hy0LO;sd%ZwibNU!q2ZT)UfWeD2NBxx~ zKtmgHnd&+RTI{K~1t7u54(-*%esI)EBbKC*J&2vICj?Wxm$6rH;3)}dDbQ%46~E>h z*YFoti}tUgJuKa<;t_xvGGy_kZ8Qp=PF_vuL6TFZJ1B zvbcn|ceMEwm^)2kkjp-9kkkNLgCi&PNsxiP)y>ujm6TBZR9nJG<1SmCv>&IqX*<;V z<(zo6>Uguxi~l~Hu~5`i**S~bkmjNti^V;03>lgu{fTjeHvoGuiucT3{ah~C8Rx}Td`L{lux*W7b z8Q1|OM|wZd%^%Mf{FUcU`ji*!1B|uudCN|>TU}ys4ONo#=>%)2AhEiEaI8zY9zO39 zg0r<>?Gszx?8b1(RXGkV0d%EHXRFdZWJ<Lj_eV#XnjIMHpN9Q3Uo<$p?ud`9&pEua_G*5g%J3x@>8Lb{uzuOxPX@2$}Dg;>8 z)8g$vBz_A)eR~u$S7mtN^MS?b|rqU*#*bzshv+#LqW_SdJKm(%n>q0k}`^v1zbJR#ed?(uK*C8 z?DkQhRfTnOWG09~!!i4;&njDL6_{lHP-Ay7-8q#JT);<%X2^Q>~H7o!Y41Q)Ys6Esyr;&2Yk)^PUc`RJ`G z*_L84Hcx_(niVlGjLC0d!!K?Erbc+~ZUTndUi+?V!Wo^k+epW^*?o1^MnV|97-vt% z!h&gv7PydgMrm-AZh=K^ZXMU9%RWLrtK4-v3SvspR1g;QE(RrGK^Mv#r}`}b|88qv zb2QXL*Q@-v?Cm+>3`vPf`-v+#xyemFOW?F*6x{rbLO^w~dOgl=FSY=S`XCM$Rk1S~R%a-gx6EbUxXh}NI#2Sa z+5XJHDtRo=BrEE?Br3-CaI0&=uQO!??jZ$%qq(y?rrCywJ->odg+epMrMiJ94B@~_ z_)YHyKFba4M}7MNO5DJtDHMFZ&HA#ovsq@R76%$n#)X%i(FyF3tcFv)ttx+e3&m;% z)*i0KTBkOvYOPR`Vu4Y%_7x;Do@9OlcW2xXbqriNk#?VhvpnDL>h~Od`xd5GwA4a` z;BpuCgiBuhjEZ@b1xw@N1U`KnjS~pM%AoTGXuF#TdyO)>g4eYPE2ebqG)&F5E@i1H zlB!T4$`AWgCs~eS7D}}ialDnt;EXIkr&_Hk6g6k_L1YuBJ)`cWei@vo2b_S#`+l6W zmC9cHgp+MhVNtB#b35^{I1vj@V8qJvZad?oDr>AolX-pZUbabYXVUIAQQReEVNA;t zSJV@>QEo5^(FCHCN%Z+(ib5;~rpQ`(kq0m=GrCx;CGH(d4 zKk8bL_jQ3%pkw`JvN%OK85La=njZlz3xl*}oo2;Q4D3z`7L-CZ3BS86M;t-Jlg@`v z{aA+iN)5{#Exiy9Jc6WO!cI)uKNU#~kqk}v64Hw}-v9UJgHx4d;B^m~|D!6hO=U#_#ZUP9laax|?@yH2p zILi-Jl(4$d?gI>d3no*UP(|Meu)==ZD;h?*owQ{;(>nRn<*KIvUbpF zdiYuN=s;?h?{)OVXi~;X7`NDrbtJAnEECuq9n^3()&^gN0^S_3ZlY8_TFp zB0>0hB?y}b!DU}_3Bqbm!>FXoGN#-{>Fc@F?L#|&R?zux^nsO-CrV9C9P38)?Os-(d zCefYX8sIN&pY=BRD;dlS|IgzpdW+x-ea>yGSI)~1rAQWcP`d)A8HJUf$RpDb(muP| zXBBS#)im-kzNnJLx(ow52Q9Fj87)FkBl&=mja=|V;vjLa$iCxmX5^QQT#Q0AY|ar6)F%``}h8E(o! z2gmaM~(>ZBjxt-Bm2cTc4d}}WB$HHic?ol^()!ej_Q8l) zDi(84Khb56aOMYKyjO|od{0Q9i`>;@w>398_XzbDWl)$2 z_Aut0KoTc@#&&MVzlZPA_QxG|b0YT#q4wM>ibqn3x8}%KX zzKAf^SV$B*&j%Xq41OzG*5pB?|_QGc-@2 z8I?Ke1)EUQ532vQ9Ur#cbuqh0ckK>)Dq++AeXh*X2%6nESKSKoPq@s3bG7~O$#B5* z`;<6%S4>jLTUhrUJA4lCx}?gc4048V+Kou*Mj4R_Spz+=X%Z!V4+FKd3n7$oE6Cy5 z^aKq7w9$TnaS)j*O@j!FMQ_qDk^Tp7A!=l}vd5m2?z9Vh8Ne$zW;E+#t(+rfe!fkJ z%&Skb*aTzoHgBr%k-nB1TV27=&K;6+rDP`e?WE?~4sDk!&)PO1O9R5fHL<-eM>Ak5 z8sPw_GiKf;8nqa2v_jj>cj&6j;Bql6fN#fI&^QY<@#1Z^xY3HCBou5%LMj)8=Ddcp ze>7z!?TDyk(yniwgWF?H+7s@2tr^7B9_;3%X+DOHkq?StWqIiPY-$=KSlaHaY+KCM zjTqSwC#s6^{;VC4(O(}l2my-cG1STx+0J)$ zM|ZWjV6RSYycNawju}GzssC~DXn~xh;Su{_SjM_ix$b^?=O%n65rh9;2Lkd|nX@={ z9zx<0c5Js>eRdS$76cl~=5Js$R+!jxB^8hnmT_U2$pxT{>e@i)e#k|Sqqw72vBEik zMPdaX#pdqr1%_f;&NVPi$+#=fx|S_<_EYK&UPSpB9-v#ND*qqhxHt3uKg-&W9VYAo zx@6)K)|i@BPHAi%Kd96`wl)Rj5^KfE++fFX5?@7=zGM_CIu@s8Ew(xw;@)|*`B^?b z-MD9q=47)eIlNXsK6zg&>F;YUYkcAgjDz@yUj_L86l(qglb}YZW+{`V)0BeW)OW7F6>RhEdH_SgY%z~vF(wms)RED=M1O-3%Oi*w? z^MVu<9MAjbvR2g9oADgg#uyM{PgD?77?AB(XfOakDN7O=cxcW=1wN+wTM0-zucI{&s0VzmC4weN#)GVZ>dW8F;lE5JAP7k?4^M#$*iINx7< z=qEXrI%WY%57{Du#u&EdFCi`<%gQn09ifr3ruv7kvai=L7+$qqM}%=Do{v&l$gTaH zv74aJiRQ;dZ?Z-6I07z6zbcyMQ&74Ap{$ltOaRGLgJkGDBktY0K)&_KSx=G=t<6=OopF!AyIStAtVPZgZ z`Qa&Rx}n@>%xmEIH1#b#I*d<13Wl)7hQgK_o1gj&Zl>17znlk zUyDy4MGd?boNHfFA8~e*x{QnG*~@#T7U;TLJcs(1l3`Fcdkx@^r-1jfG(xSUV=#?Z zqwjLq){)2Tld&%Y1Ao&dzPbH%x*^v^I8-%L4}6cEb>qJk zIVh0xiX1W(?ak%5X2HH725$p_r8@KAyIk2D)$1XKAZB z^oyixLLc1fl6Vt6&}$i~;}r;2MZ>$r=5e2>pH;s{s*PwG$j1*Ag2uh4y;79m=Jd1J zbs8r1SXUx=9zq?_j2-`%W}ulI7Mih>PyzymfUaqSm8`LeDHm{qh_lmo_-zG?3Rl?A zM%2R8pu8M)=&~}unm73mbrWhb3jcBw|H9Z5Z6O=^7dq3g$Wb6uN?L<*IMk?b$d4v- z>-cM~I9l{0^@5ezZuZD$eKccFut{^!x}TO4y)U4pE`*SYBbzMLzzR52X_R#?%i1eV z1Ja=%Qn6BBGl-7)!3<@#F|k*F$c@w?@tZ!C7;dxp7Mp)J;}-mDIR8>hOP?%|`M0Sl z@5k;5+BLr^Z!|x^-VIF|cKW2DDOcHn%iZ+Tsqi4p7P!L~ZL!jB=@az{_4$ICDL!lq z^M;SH9l|Bx%Q~$>m_YFN2U!2FW;!tdPoz_n%RFuS&cPyn+58XXThAxOEwC_%!D$V- zikT_&>7k2sorl_nHRA&J5C+GT;aw^SKMO-HE=K^=%edP!zynR|v2KclEU=c;;61jI z=kDvmpns)3S(&oK)ZbYGaB-dJRd)G}%($?!7Sy6bahfWGtYmI`Te(tihr8PY=JMaI zGBP!{lY1MtH5o!p4r;Q$t+3Y;k8Q{=TN6!Zi*snEMw@tU>UCLHYvJ6vWA~w3#D(==|zu``Jy7shUgZLW4$tnE(6)JQ{ESrJWk40yADVImu$-+cCd znwwCfxcZj_lXTYh^SVjiJta!+_-nJIf4WwoNL_4X(Oh7!vlfk=5|g1DPB}jJQ=9uy z&Z0Ts!C!!eM|kWC@CgxYhz7|HbRcS$7 z@^M?L{!H<8v-US^TuMCRpN4r_>VW^r+z5oB7<_Rr5LR*ZlOxsmZh}QjX@O87D{w6$ z59D$F>12fTZcr>+SFNNfF@_3Hq)kB+l{PkjJD~2~*ppp@r1x3p5a1e)93X+HekDB_ zM&BDzZV$dKZQ=@-ldxv-kOMULGlV?r0syfPb?akw$ZVLVB?OiftNV+bDE2F00S~c5 zamyaB%QUn{DK=b96EKgQqdaw@eVTLQKH7xa{17kX9Q0p5B8zkqg_=Td$|8x5E3>S~ z%W)2)%*P@f-9DYGGB;*xP?ZO8RcA%D$NNn68uoNUb8ffOHnpLDNJslV)_jeXd=A3B z+O`?_dKcr@M?u-sVuyKDt;Z{IzL_C6SBVyXDj0&#R;@=2sn+3OyRD`v6^w*CbuTm; z+3Cf*+^dBlgU0pph!}|`5{WyW*?gDQ$v%F=G&%GVKqt%KR6zO6d ztoa2UE(V;T(a2wNu-!$-k7c^n(f0#E!Zd>Oq8L6#5Brs`uNMb>OgT|N)fOPb=VgHWx{(ShHYkL@rN$_3qG z7ke3KUU3Dc!vWNNq$=mw1cH*YVYk!aPzwrxAQpI0aBdUuU4@ncr}7%^ij3D4Ih>dI zGj@9Co-2Yy!xh@SvR({}U59Hf11O0%SIzjxHc&Z2BT8RI&jV|sZzX#-J=*u8q<#jbP<>6Gd zjfs|$QmrR>#nM8oZk(@p4LL)z_~414Sb1CU>MVi$4zhhQkIe)WXpe6(wVqyHmghrA zbF}pGLhSBIYWjaYWm8+6-KDo3JHCC{pMPnK9=!mfN2jFv4~gd>sz||bJ?i?$4IrVn z`D3r)Scfw13|Batt%l9Z8!>&Wzj2+lLgoKhs8CkG!v){NM#XVt?SL&;H@D0l&*s z0mjSiQZGI(1(AGYTivj=7c%Ai33|XLR`qjU zKT#gn>)>APU6wexvv5nw>)+13@ZT$`-Smg7aSq>Bmb2m^6==-P`P=(d&^uD5%=tm3XIKWUAAQ@3qEx z#}Dnf_?15H*B^oiFT*c;?YbG8(oeT8{xfM;=ByLDGdjm8NKUT-xu6%0DY?Ooy#^OR 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%0D>X& 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

w5GT0P~6n7uE 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%0Dh8x<@B&f0 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

Q@ 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 CwjqT8 diff --git a/data/title/openrct2/gymnasiast1.sv6 b/data/title/openrct2/gymnasiast1.sv6 new file mode 100644 index 0000000000000000000000000000000000000000..916823ef7a2f7fe421c89da960f96e04857f04d9 GIT binary patch literal 552177 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

uZ!VzxQ_}dhtzXW6;&544V)HBTB!U3`I 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

_6069 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

pJc%rK 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⪻3zfcy!q4;6~Pk- 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 )J$Zu5ShEIc3eu>sR&#QSkmbEvsL8kF$H>&Sc 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


1|YcCFXe)&N{RK7{u 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 z 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%0AV@H1`G0&?Fkm@97 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≀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 o-u%U?l#U7eKBKHWSy>-IL_8|vjnvLF zv{E4t3^w2HqDA!4 z%;Rs|(`UB2+Rxpt4S@cfMp6$&P@ui);ky1Lk)@hGLU6QR`7zoJyrwz6+f~Cr8)0z$ zozpZj_pVaedk&!3gg~mt4eq2J?I5PK+af$tC`%sIY^@uE5>NXs zTu&vRdQG$3&%H`%q03oeYqlG!*+)2M)=N3lJIP+T$T8I90#GCHc6ez=9TUpk07C^IWRVxypFXG)A%!tY4$YxfqL~vrOGMu zD&$+ev5r0Rt@lf{z93)X6-FY`P0L`e-)>6t1EzEYJWsMWLDAwx=ktkPL>;$LAZ@j2 z^R{i|E*l)puOr(R6q=@~xFNm9pZwV&a^e0sJfLDZS8y%{)nm2*8&hUG7UllcXR?~C ze!)@JhmaH|7WGW5LP=n7h(s>i*3pB)JZx`}*q&owj6v}9T`NQmG?2Fm%`&`d+nQ%t zL2{i1m9Na1W`7yX+@7{yCRd@MA!RE0i}Tf{zgtcfOqR2UL0ZO1fBkr;X)AkuD{q&V zH9f@}iT9!>>^`?~jeTU)TBrLPS2(u&&{GAgxY^XHB^+QZMNyhII}_!B?WEE9O~f0T zgtO6$Q_#QPWF5XD6S`km)&CD)c&R?Z7&<>xEX2zDC4CUA}Wh#;|eQr0r(v$NoNJ=HnPbX(C0|?XOL;wBRy#x6wU__LdQ7bNCU%bs6X4+jVYFL5Dc5@^4EIf~-NNgHunrq_;5nf#g;j-Lr zs)D$Ph&ot#DS&}(xs-(kcDV3`KM0|8>50qOkPY*LI250+PsVh1OVaXU2a z;2v)gH%r(or{da%7qp``=h`2GIs^KG9Hod0$QS?d!1O5lDpV;>-gm4TDsIs!xCKAaDZ+>Xbo z@|w;M*wsVUh9I7lYM+Mxjac5X(;)~Sg1-&eTA3~B?D(-mKH9WqW${yAKM^kr0fCWquuLn&i^@Ke|PS+UYyi=3#wAiLld@H!Rt!{><;s0PD9NW zhoGxnmdZ=_=8;HzV%^aL@*i1j+?%g^SpI{X54?JzOE=Q3!GGKl(OlsGT#+=ki25D4 z_F0M(o-Y zh*#57=Iuvq(qQi8f2fzAyFowXzkFf)Q Z-xWIA%59CNDB>49yvR-6Fr{6;gy-@mQB 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 zGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKR zVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~< z{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?x zGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKR zVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~< z{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?x zGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKR zVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~< z{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?x zGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKR zVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~< z{WE3#GhzKRVf`~<{WD?xGhzKRVf`~<{WD?xGhzKRVf`~<{j*`Me>SZ3&$0g5Q0t%f zx@@TR&xg1Exv>7Zu>QHQ{<*OJxv>7Zu>QHQ{<*OJxv>7Zu>QHQ{<*OJxv>7Zu>QHQ z{<*OJxv>7Zu>QHQ{<*OJxv>8EQ0vcb0J?r?X@ArH11@DZV5@9@aAEraLw5s8exBWc zp||=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u z!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ z`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#> z=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u z!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ z`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#> z=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u z!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ z`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#> z=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u z!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ z`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#> z=fe8u!usdJ`sc#>=fe8u!usdR`sc#>=fe8u!usdJ`sc#>=fe8u!usdJ`sc#>=fe8u z!usdKTK{}l>tA5~^P$$i=ymx}>t76S{R?6J3t{~WVf_nX{R?6J3t{~WVf_nX{R?6J z3t{~WVf_nX{R?6J3t{~WVf_nX{R?6J3t{~WVf_nX{R?6J3t|0>q1K<>0CfG((*CCX z2VBN(z*gD*;L`R3hVBMz$Ir7HPZ(tN$|-Yp8_BLHs3;6 z|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;* zLRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMo zSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy; z|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;* zLRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMo zSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy; z|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;* zLRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMo zSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy; z|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;* zLRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMo zSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpPy< z|3X;*LRkMoSpPy;|3X;*LRkMoSpPy;|3X;*LRkMoSpQ;J>t76O{Y$KWG1U5(y{;H) z{mbF4e<`egDXf1ftbZx2e<`egDXf1ftbZx2e<`egDXf1ftbZx2e<`egDXf1ftbZx2 ze<`egDXf1ftbZx2e<`egDXf1ftbaMw`m-B=t{+<3-?aaL%h?UsD%&5to$Ut<-3^$; z&kt+;OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo} zOJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&> zVf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C z{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo} zOJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&> zVf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C z{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo} zOJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&> zVf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C z{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo} zOJV&>Vf{;C{Yzo}OJV&>Vf{;C{Yzo}OJV&>Vg3I|3INh+Y#s(oyp#u z6C-$n22ar7?wVl1gKL1`?yd>$?jGC;9z1Dh=63E_d&d~-^L=kR_x|Vu&p*F)*Sc%g zi*vSq_Gj<&K4}tSRR0j8`iB_RKg6j1Ax8BNF{*!vQT;=V>K|fM{}7}4hZxmA#Hjuu zM)eOds(*-4{X>lEA7WJh5Tp8s7}Y<-sQw{F^$#(se~3~2LyYPlVpRVSqxy#!)j!0j z{vk&753#C$h*AARjOrg^RR0j8`iB_RKg6j1Ax8BNF{*!vQT;=V>K|fM|B&}q|B&}q ze~0QH@^1BavLxi)>hHY2`a4GTcZ}-q7}eh~s=s4Yf5)i)j#2#`qxw5W^>>Ww?-hBoU-!ZDcV^n{~sQ!*o{T-wFJMUJ1z6~JPzx%8G zz3l&5e!;f^-}z~O*!8{-c=y|Y!o2>yKkM%p)!#9yzhhK?$Ef~}QT-jG`a4GTcZ}-q z7}eh~s=s4Yf5)i)j#2#`qxw5W^>>Ww?-hBoU z-!ZDcV^n{~sQ!*o{T-wFJ4W?)jOy>Ww?-hBoU-!ZDc zV^n{~sQ!*o{T-wFJ4W?)jOy>Ww?-hBoU-!ZDcV^n{~ zsQ!*o{T-wFJ4W?)jOy>Ww?-hBoU-!ZDcV^n{~sQ!*o z{T-wFJ4W?)jOy>Ww?-hBoU-!ZDcV^n{~sQ!*o{T-wF zJ4W?)jOy>Ww?-hBoU-!ZDcV^n{~sQ!*o{T-wFJ4W?) zjOy>Ww z?-hBoU-!ZDcV^n{~sQ!*o{T-wFJMXRj&U>rB zOZ9i&t^RJ7IPX?}_x;u1HLAaBRDai~{;pB|U8DNDM)h}%>hBuW-!-bgYgB*NsQ#`| z{avH_yGHeQjq2|j)!#L$ziU)~*QoxkQT<(``nyK;ca7@r8r9!5s=xbg_2=6Fa{ar% z+TY9muO)^>>Zx?;6$LHLAaBRDai~ z{;pB|U8DNDM)h}%>hBuW-!-bgYgB*NsQ#`|{avH_yGHeQjq2|j)!#L$ziU)~*Qoxk zQT<(``nyK;ca7@r8r9!5s=sSgf7ht~u2KD6qx!o>^>>Zx?;6$LHLAaBRDai~{;pB| zU8DNDM)h}%>hBuW-!-bgYgB*NsQ#`|{avH_yGHeQjq2|j)!#L$ziU)~*QoxkQT<(` z`nyK;ca7@r8r9!5s=sSgf7ht~u2KD6qx!o>^>>Zx?;6$LHLAaBRDai~{;pB|U8DND zM)h}%>hBuW-!-bgYgB*NsQ#`|{avH_yGHeQjq2|j)!#L$ziU)~*QoxkQT<(``nyK; zca7@r8r9!5s=sSgf7ht~u2KD6qx!o>^>>Zx?;6$LHLAaBRDai~{;pB|U8DNDM)h}% z>hBuW-!-bgYgB*NsQ#`|{avH_yGHeQjq2|j)!#L$ziU)~*QoxkQT<(``nyK;ca7@r z8r9!5s=sSgf7ht~u2KD6qx!o>^>>Zx?;6$LHLAaBRDai~{;pB|U8DNDM)h}%>hBuW z-!-bgYgB*NsQ#`|{avH_yGHeQjq2|j)!#L$ziU)~*QoxkQT<(``nyK;ca7@r8r9!5 zs=sSgf7ht~u2KD6qx!o>^>>Zx?;6$LHLAaBRDai~{;pB|U8DNDM)h}%>hBuW-!-bg zYgB*NsQ#`|{avH_yGHeQjq2|j)!#L$ziU)~*QoxkQT<(``nyK;ca7@r8r9!5s=sSg zf7ht~u2KD6qx!o>^>>Zx?;6$LHLAaBRDai~{;pB|U8DNDM)h}%>hBuW-!-bgYgB*N zsQ#`|{avg2yGHeQjq2|j)!#L$ziU)~*QoxkQT<(``nyK;ca7@r8r9!@Z}oTITm1`D z{oQw~f8i`~->v?I-(UR;8`ZzCQT+=W)xWS&{R5qKCLt~?SC$0L*%!6WcUZgIlK&B zR(W~6EM87|1-u+yUU@~lJYGS0EM5VxsJs$h5sy_~8IQ#)DX)T8!YeDUidV*~D6fWB z!K*5-j#tI2DX)Q7!>cQg!>i*pl*i*W@Hpi)@i;tQc`ZC1uc^E?UK6jSybfLqudTc; zUK_8YydGW$ud6%(uZ!1HULUWACn#@#C*bv!H^l4X4U{*+8{iF#`cf~v7U6gmj zyWm}wC*oc4ZpxGJZg`^d?sy`eq`U{7gm+io6Yq}qP~Hpgf%jD28}EttQl5G%xgv+x=COy#rjnfNT_ zbMRUCY~^$D+4vmg^YA(NT;=oex%fQg3-EdPeB}%A`S=3mi|_^bLgkC`h4>=nOYlYb zV&zNm#rP8C%kU-mQsv9>rT8-CEAVCba^)-W<@gHatMC>0O69BZmG~;+m)BTIK8UwfH*a>G(Q)z48ovJ)W+71D=j&DBp-@;2V^0!Z+X>m2bv3;+vFj z!8hTXm2bs2<6D$(!?)mDm2bzl;@gz(z_;PsmG8v2<2#h^!gt_1mG8!P;=7dZ!FS=i zmG8xO<9n3v!}s8OmG8&*;`@{z!1v+%l^?|S;|G)VPqz>nd_m7m0q<0q7#!cX8Qm7m5>;-{3K!B63*m7m2=<7bqg z!_VMnm1p8-@pH=0}=~{HF5T_)Ywl@;mq~{I>Ee{5F0^`Ca@D zo~8UAo`v64ejmS!-&6hozlYyf{t&;9KT!S%e}F$!{uqCVKT@8JKf)g?e}X^8vz0%^ zv+*a&pW#pNr^=t>Pw{8UU*OO1=gME=&+!+^U*RwCm&$YSm-s8?x%ewQNBQS?4xanA zf0S3gz;khV+ds)Gzr;Vszfk@w{0sb-%72aj691L*|H6NT|62K%_^#!KjD8?{#X3Z_+OO&4gU-N zSLLtqzv6#W{&)Ou_-p0=z+dBkSN>1@@AyBI{|o;I{!iuq#{Y@`OZhkWzwm#*?H_r= z^WW$$tisQ!MV z`umOQ?>DNy->Ck6qx$=e>hCwIzu&0-exv&Pjq2|=s=wc;{(htS`;F@FH>$tisQ!MV z`umOQ?>DMHe~Oop9P;)^=KAM{@!zffIJy4aU+w=f+5fe;d>c^s?ZvxYFNR0q zMU@xFi{izUm%xkR#g&)Di{mAfm%>ZnC6$-POX8)JN8_dN(#m7-(s;D;GI%r|qr5C0 zgO^cW4lje3RbC!1ik5^D0i&wxaDzAiB#AB6L#$)kH%B$d&@XE@o z;+63#%B$g3@T$tI<5lr$%4^`&@aoFr@alLCncyc>*Dp4*T?JO3CbJb33z?w4e|PT1LckI26#i|jq!$f zBjru-MtEc8P4UKf6XnhDCU{fj&GDvqGvzJtW_WYuE%D}f3+1iw7I;hLt?`z4E9GtQ zR(NaWZSmH48|CfrHh5d*?eVsFJLMhlc6fW`9r5;f2j!jc4tPi9o$-!%C*@u6PIzbK zUGdI%7vVyr1#`ct54mU-?3OKE6QtB76b9Q2Anf zA-+iY5_}Q9Souv zzpVT!ei^@_{2G1*zpDH?eigr_{04pvzpnfyejUG|{1$!#zp4B-eiOf?{0@E#zpXqA zzm4Bfeiy%kXDPpjXW@61-^cIb_mn@t@8S2AKg93j50pQ`AK(v_KgJ*8kCbQQkMPIJ zpWu)2Y~@e!Z2XDxXZRERsq*LeQ~a6o7x**$x$>9zbNq$!SNIG3rScs7CH_izF8&J7 zQT{oegXg~OA9>Z^Z&ZK3QT_c!_4gaq-)~fZzft}DM)mg_)!%Paf4@=v{YLfo8`a-$ zRDZuw{ryJu_gmH9Z&ZK3QT_c!_4gaq-)~fZzft}DM)mg_)!%Paf4@=v{YLfozqk7P z-&_3yRDb_>?wO2b>L%0DyVXDN{^}nvs(-+!{sE)<2aM_;FsgsRsQv+?`Ui~aA26za zz^MKKqxuJo>K`zwf552z0i*f{jOrgSs(-+!{sE)<2aM_;FsgsRsQv+?`Ui~aA26za zz^MKKqxuJo>K}Nw`hSv_={oT4ulE0#?9bPDd>i0@dwz#Qz3&6w{Wc(s*K;=ref!lc zJe*gD;$g}o@Gv}Fc_bc=M<_3XN8pjlqwq+)i1MO%5j;wHF+2({s=PQ}6fdT{1YQg; zuDm2(9511~6kY-^sk}5^5-+7Z8ZU*HRvv?w#-o*&!K3jQ`E9*b8}UInj&S5{sXuZ&kwUJb8;S5;me zuZmYwUIVX&S63c~SI288kH>4^ams7rad^D)T6jEOQ+aK?CSFT<9lRD^TX|i)HeN@0 zJ-iNHS9tX^@kBgHc@I1Z@2TijP-55g(6FP@aZQz$Yr7giplNluyRf@JY(2 z;FIvl%BSL!@hQru;ZyLb%BSN~@oCCu;M4Hw%4g!!@fpfz;WO}=%4g#<@mb2};Ir`A z%ID&<@j1%p;dAi0%ID*A@p;M@;PdeL$`|7E@de5k;S2DE$`|7c@kPp);EV9Z%9rAc z@g>Ta;Y;wP%9rCy@nyH!0tOZ^Ab# z-->U>wcPQV5@4$B|-;M9YcPZb4@4|O0-;3|Y z_bA_o@4@#f-;eLb_bESs@5A>iKZx(g4=6u`AHWYPKa3y54=F!_AHokSKZ+m5k0?Ke zAHk0*KaL;8k10QaAH$C;KZzg5PbfcypTJKlKaHQnPboixpTbWoKZ~En&nQ2KpTW;6 z&&1E-=aiqv&*7QMFW{N@dF2=J^Y{hjm+%YtMdg?Ai})qwSMW>tW#w1#%lH-L*YGR& zRpr<5tN1nLH}Grtb>%nl>-Y`jx9}VIP35=ooA@o|cko;IZRJ_`ZTyb%yZ9YEOZh!K z3%{%UK7JR!r~Cna55KScA$}i!p!^a30Dq|bG5!#Lq&ypcgg;jP1b>WYD}Rb-<4=@7 z!=KK`zwf552z0i*f{jOrgSs(-+!{sE)<2aM_;FsgsRsQv+?`Ui~aA26zaz^eWM zqxuJo>K`zwf552z0i*f{jOrgSs(-+!{sE)<2aM_;Fsgsxz12VP-s&Gp^$&dKp2=9I zVlpkgTm3`dU;RUk>K|%U|4^g)hZ@yC)TsWUM)eOhs(+|a{X>oFA8J(pP^0>X8r474 zsQ#fw^$#_wf2dLYLyhVmYE=JFqxy#$)j!mz{-H+o4>hWPs8Rhxjp`q2RR2(;`iC0T zKh&uHq3>4zPx3O2hrau({XZuAzZO5=1_a)o_u(*J9(ecLfN);VT_Wu5SF`X4ULA&q zE04s(@d)Kb@CZCoc@!Rr7g1gmFM>xYFNR0qMU@xFi{izUm%xkR#g&)Di{mAfm%>Zn zC6$-POX8)JN8_dN(#m7-(s;D;GI%r|qr5C0gO^cW4lje3RbC!1i zk5^D0i&wxaDzAiB#AB6L#$)kH%B$d&@XE@o;+63#%B$g3@T$tI<5lr$%4^`&@aoFr z@alLCncyc>*Dp4 z*T?JO3CbJb33z?w4e|PT1LckI26#i|jq!$fBjru-MtEc8P4UKf6XnhDCU{fj&GDvq zGvzJtW_WYuE%D}f3+1iw7I;hLt?`z4E9GtQR(NaWZSmH48|CfrHh5d*?eVsFJLMhl zc6fW`9r5;f2j!jc4tPi9o$-!%C*@u6PIzbKUGdI%7vVyr1#`ct54mU-?3OKE6QtB76b9Q2AnfA-+iY5_}Q9SouvzpVT!ei^@_{2G1*zpDH?eigr_{04pv zzpnfyejUG|{1$!#zp4B-eiOf?{0@E#zpXqAzm4Bfeiy%kXDPpjXW@61-^cIb_mn@t z@8S2AKg93j50pQ`AK(v_KgJ*8kCbQQkMPIJpWu)2Y~@e!Z2XDxXZRERsq*LeQ~a6o z7x**$x$>9zbNq$!SNIG3rScs7CH_izF8&J7QT{oegXg~OA9>Y3)TsWUM)eOhs(+|a z{X>oFA8J(pP^0>X8r474sQ#fw^$#_wf2dLYLyhVmYE=JFqxy$h)j!mz{-H+o4>hWP zs8Rhxjp`q2RR2(;`iC0TKh&uHp+@x&HL8E;d#iuwd#isK)j#w*_e{nzwUTM+-Rd9q z{^}oQRR1ue`iB|SKg_89VMg^2Gpc`>QT@Y=>K|rQ|1hKahZ)sB%&7ihM)eOfs(+YK z{lkpvA7)hlFr)g18Pz|`sQzI_^$#o($qxy##)j!Or{$WP-4>PKN z*t^yLle|ptVekHG|BuQ3uO+~@0ikc-58!a``+#@94T#|N+&#kIel-h^(q*b-af1c)SK4 zr@ST}hsP_gg~#JHmDk2=;X~YyruHicuTyM@-}!YytVSScx$|k@^*L|ysh%~cw4-k@(y@AyuI>{cze8q z@=kaMyrc5Yct^aG@-BEMytDGIcxSwe@@{w+ysPp=yer;Kc@o|YPgLF=PsEdy_rR0z z?#g@O-SHmEd*MCsp2~aUJ@H=3lkr}7Z{>aP-gvU|zIZa;M|nTI58hXKf4nc=Px%16 zAKqX2K)gRbK=~ki06tK83O*1Yq$ zfe*unD<6pu$44k1g^$2TDj$uH#78L~gO9>TD<6xG#>XfhhmXO>Do@47;^UN$$H(ER z$|vBd_;}?L@$vWshhnDP_&G5omlllXD` zgz{7P3H+q;)A&jJl=3t9Dg3nZv-oNJjPi5%8T_pBO#Cc zQT@Y=>K|rQ|1hKahZ)sB%&7ihM)eOfs(+YK{ll#4A7)hlFr)g18Pz|`sQzI_^$#o($qxy##)j#aL)j#aL)jyo-ANHMlCS#c@$+Yxt^$&l4^$$0yf4EWo z!;R`6ZdCtpqxy#%)j!;*{^3UT4>ziRxKaJXjp`q6RR3_J`iC3UKisJP;YRfjH>!WQ zQT@Y>>K|@Y|8S%Fha1&D+^GKHM)eOjs(-jq{lkswA8u6taHIN%8`VGDsQ%&aR{u}( zGVO=I`>XvwCi}mZP`(Wad;2~CM|j@{y!&lHB(LYL67lw{S$Gj%9f3zGkHRDIBFc;6 zMer!)#qcP+sPf`?QM{P)5_mDZxbl*CalC}`Qg{ixr1H{uNxYQuXuK3&T6qj!8jn_9 z29L&Ll$XV0@G{EF;bri$%FE+r@p8&5;N|f0$}8gK@e0ag@d|iF<(2S?c&zfucr0E? zc@?}8URilnyfR)zc{RKWUR8N@yeeKzc@4Z8UR`+{ULCKYJRYxs$0@Ig$KmnHYvJ*D zP35)mns_bcb?{nvZRK_G+ISu1_3%1)UF8XQUA&(1`glD&L3sl_0k5yTAzmMEpu7>@ z0B@+gG2Rewq`V2<2yd*sDc%@wqP!X21aGRmIo=d+ro08-3~#QyCEgrwp}ZB|0&l6j zHQo|$rMwN^3U95vE#4Y$qr4s725+mpJ>C{?r@RB+4sWl#Bi~1Gu{#J zq`V8>3Gb}DE8ZFJqP!d41@Edn5$}q3Q=Wu(!xNQv#}n}+b#yf2=N_fg&t?}PVM-XHIa_ftLq?}ztSJ`nGZ4^Tb` zAAk>3o`Mg=2Pq$n55iNF55ZIL!ODl?gYhBChv7r;p~{EjL-AqCN8rQo;mSwi!|@Ty zN8uyzk;+HoBk@tn$Ka#z(aOi-qwz7y$Khk}vC32NvG_RUd^f%m-=%yHz6;;2d@sHm-=lmVz6al{d_TSy->3Wlz7OB8{2;y`KcM^&egHqH z{4jnHKcxH!eh5FT{3w1HKcf5?egr?N{5XCTKc@TyehfdZ{3L!HKcV~-egZ$K{4{3zkp}r=apZ?&*K-AU&1fo7nNVe zFXES!U%@Zomz7_|FXLB~U&F89SCwDKuj1E~-@vco*OlMIuj4nA-@ziRxKaJXjp`q6RR3_R`iC3UKisJP;YRfjH>!WQQT@Y>>K|@Y|8S%Fha1&D z+^GKHM)ePWZ}ksK|cL{|KY{M;O&V!l?cc zM)i*{s(*x0{UeO(A7NDg2&4K(7}Y<*sQwW~^^Y*Be}qx}BaG@FVO0MJqxwe})jz_h z{t-s?k1(o#gi-w?jOrg@RR0L0`bQYmKf$m%>XckHJgh(aOu<(RhsVvUm($MtM2B z3|>}wdAuxMPI(2q99~{|MZ7#-L3u1*0k5dM5?&FHRbCm7#VaYVf>**TE3b-I#;Yi= zhF8I>DzA=L#j7c=fmg$;E04pg<297W<2CR&WUJI|S zye?iFucN#kUI(wMJOQtZ*Hc~}uZJfnZ-6J@^_4fo>*EcSH^Lj>4V5>>8{& zjg>dW8{&6T&ro8v8%x58WCEtR*%TjH&hx4~QCt(CXM zTjOn%x5L}uZI!pj+v4q%cfi}>?Ui@L+v6RScfvd19hG;+JK~*`cfmX1ot1aRJL6rH zcf-5jU6m)|UGZ+plkjeMqVn!|BA%qY2cCp?SKbrvj`vXB3-5vVRNfo!iT6^TjQ7HO zEANB%#*>xz#gp+q%KPDc@V?6X<9+dd$_L>6@czmN;{EXf$_L>C@PW!x@PYUs<%97- zc#85NcnUsP`A~c?K1BI2dB4l`AB>?K0^5@d;~sH`DlD3K1%r* zd=x%f`B;23K1TUCd<;HTc`7~@AE$ggJ`PV+J^@d~$19(RkH;q{Ps1nR6O~WGC*o+_bMe{u9Od)yIrv=V^YOX(Jmm}UdH8(g3-S5*0_BVF1^7bci}8i{BIQf) zMfhUnOYz0{66MSACHPY1%kic7GUY4qW%zRCEAi#{3gxTt75GZ!tMQfiD&=eNRrqS< zYw^|i8s+QoHTYWP>+!YtI_2s3I()tI417JFu6zTYj%O&}h-cs%lyAZ};2V{1#y8@d zlyAW|;hU9j#W&+ylyAeg;9He%$G76!l<&Z|;oFt(#JA%+l<&fK;5(J?#&_bol<&cJ z;k%XZ#dqU-l<&j$;Cq$t$M@pz#P{O|lpn$m;0Ki-#t-6$lpnzl;fIwU z#Si00lpn*7;764o$B*L2l%K$l;m4Jq#E;`Al%K*+;3t)z#!up>l%K&*;ir|K#ZTjB zl%K=T;AfR*;%D)5%FpBH@J!_w@J#%?@{9O+{DSgJ_yzo;^2_)|{F3r3_$BK|cL{|KY{M;O&V!l?ccM)i*{s(*x0 z{UeO(A7NGh2&4K(7}Y<*sQwW~^^Y*Be}qx}BaG@FVO0MJqxwe})jz_h{t@r3{t@r3 z{*hGwi0|Ap8Ou~grlohQf8_hCf22|UBaP}GX;lA6qxwf0)j!gx{*gxYk2I=(q*47N zjp`q1RR2h$`bQeoKhmiFkw*28G^&53QT-#0>K|!T|45_yM;g^X(y0ECM)i+0s(++W z{UeR)A8AzoNTd2k8r472sQ!^g^^Y{Ff22|UBj2t5pXB8>5&7<~_Wzjd|60QNHX!2d z`wCpd`##{^Zv&!uJ$IoZZ@-#_7v^^<g3V223mGFvqtn$iuEM7@@6}%E&S$S2wGG0Y_HM|O5Re5#1Dqc-_4ZIp& zU3nZ{9j~E09_EFudlozULS9uyb<02Z>YR6-Vkr3yb0b2Z>+p2-WYG9ycymEZ>qdG z-V|@9yanD2Z?3#0-W+eCycOO8Z>hXB-V$%6ybaz8Z>_v7-WqSCydB;KZ>zjL-WG4C zyaV12Z?C)~-X8Cuyc6C5@2I>p-VyJlybIn5@2tEl-Wl(ryc^yH@2Wfz?}~R*o`iS9 z6P0(z6Y(VFJ@6#FyYilRcf5!4UU(0@r}Ex-PrR4%WV{#NTX`S6H=eA#FP@C|QQi;l zgZEY5AMcCzQ$7Iihxb=L5buuPr;`upN>z(rzxL-Ps67xpNUV$XDFYA&%kFYpN-GNXDOe9&%$RbpNr4N=O~|t z&%x&^pO4SQ=P6%+&%@^{Ux?4g7bstZFTfWnUyLur7b#zYFTxiqUy3irmndI`FTs~8 zUyd)umnmO?FTdTCJH8d)rhEs!4d1SOC%zrup?nv<1K+89H@*|!rF;**3*W7LFTNY!qkJE}2j8oF zKfV{=r~ClE58to+Aif_zp!^Vi06(bwFn$m}r2Ghe2tTa+D1I0}qWl9x20yDj6F-ZeQ+^&l zhi59kfM??8m0!fq;}?`)!Y|+#m0!j$;+K?P!7t&Lm0!g#<5!el!>{01m0!oN;@6bl zz^~!gmEXj#<2RJw!f)U=mEXp1;Y<@fL`{I2r*_+9*- z@(1`m{J!#s_K|!T|46I)M;g^X(y0EC zM)i+0s(++W{UeR)A8AzoNTd2k8r472sQ!^g^^bgS^^bgS^)Ev8kNnO(ld()qWLkQ+ z`WJbB^)F&n{~|{9FJe^xB1ZKuVpRVkM)faZRR1DI^)F&n{~|{9FJe^xB1ZKu@^1D2 z=!{CMG{`iS_$R^{Y+N+WQ%-Xew3UB86T{SNW&>_DeY- z|B^q*`4QDW{OId1F3JQ6>PJ) zd|!0CAaUE$#g!|$8{*|c#zHCJmnN+6v-7<7OA)jyQHY<$V`5VZ`J~_uR z`CMvNxV^lMnz_Vj>}gfsjq{i zs{AWMLL`FCd`**=@8w|-{5v4y<>v+Eu>37vddlNKOyG+Py!5XDcKK;f2Ff3}-%9&} zQieTYxHx1F`FlVfN{twqE&rWIel6X+cU_TF-W$e$o@_NVajuiF|`|EgFBh`se^4m9W z%wT^mN>Tn^y*%&9RWy}8DBTNkxL8$F33%5qhv}+RiDA6`{;icYkS_vq%X`;|V0rE1 zYHd`Ijbc?(ylLQ%^0xqcSR*w?e)^w{^wxDj5@cjRYJ2bd##`PN=~7TOdut0wDPq2N z?!T65G5p6L|F>&w(pQ%l0zdIKNtZGI`@W4*NpAP#O*eDyg{?@&g^{>Cmx_XXzGX3irqf%tk>#vwy zy(=t4^5kTH?X7l3(D(lXKCX-5lK&ei@qtWaZYwJ%eOw?xjKc5l^GQ3l?dt1h$xIRK zeP5sKnwYu&iz`#Vk<<^rlAl%#l6q`!L!b1O$GJ={f6J6=Oc9NOWs(HvauxhIQ~oZ6 zGB|Tj16*!nys=m^j}(^2(!jfgY|Q0=Hp%3o?U*5FBqL20%CSWD{z1Gnl79u*mb~8b zjNbaxlPfdz?r9TfX44ynHIHayhi@ z%5a&UD~qMRH1_e{_PNr1MkbdlW5*|}5^|-j)XbDu(maE;jY^Y*>_m1ZGhW8X@c@@= zkmU18cUhgwe6TZ`TBJp`7KxdC%#}AnHww{GUcTl z&)@)mnZ`-}bE5o)G0bvfYdb43O z?><_ro3|AS639)zn#m@=5^fr$7MPnG}i$AH%+oLwWe*^@mI@r>7b0O->p|`j3fRmA{SW zqPiB4Cvxw+cWQr?SK7$m`GhaOOwGe~J@w|PXMEEu%jI7_xxuaL8=ri*K^ikn`CfC- zFL*C3B%~YPB6+v$AIbbgIV67w zFbsdiH}LY?fGpo2pG{)!!U*?sI8|0%{TCM#0^H3JgLgssWbVWYqp~WZvl_XCl^1R0Sc>Qb%o-t9D z7Rr@e3CZNl{vbpCek{O#va;XEuLG&P}KoME0}16*7@ z-uzY8WiUohqy>AO=V<&4c@>b?tJJdJ1%sCYk zB{P?2g7qANB#ud{{LRM{_XBSWlI0h<`^3rQ41Yg^k&{1-5yn2Pl|1qMTm|cIwta=f z*W~{H*F?t5ALHeB=j5A0%aE$^D$tiNZmp*ONQtAz2#k$3K?7)v(sdb zJWk{W`|o%Lj6V-2=RmG>VyGv0kK)@hIKhmfSZ7Kx!fT8`{ZB#T+Z8i>F49HG|b@i@GHW6Tp^vLw@*eD@HTX>^rd6wGR2=wAMejA=qb_Lj=554!!OZYfiEoJc}$PrH$Gi_{67=H_m|zRa2l<#06L}ID;~mYrBEQIz zU$FnbWL7UMdGbk(a^E{TG9UBc625WqKFCN=s`oJSLpG{_Fw!PuaWMIj93BgPDZzOp zD6f2+mxKC)XY#>8$v0a*>Mq}_!hGGBJ53x54|&2Q|MS=0-|mf?CC+R@v-}&hyU-vcM0dzV{*Klca6YNyjAcDYrz|dmJw;Ay2u#eaf*8E?CIt|5`o_ zJk2_oJX=2LE(NPFPkmIBwSD>{=AowhSy0I9nY_&}!TbuMXEKuC0>GN0y7Q#KCKUe> zmq)!MK2{a@lr#U?rwpVY%wo#&e=6mF#G`N9f-J16L~^X9dUrmHRG1~To=IRfbBCM6 zrSrW{rCp)Q(!M)`twzCM3HnU|_KrW@R+*pgieXi)rPfm}a(VN)rGkWbJ5f(Qt>lx2 z2c@F?_){*fU~iA(Q~`b*zi+^Po>JzT-tof-KEN>+|NG#R0cfbA@R*dHI_2$L(DVAdXob@Fx2rjra?3l zr4+5qEcT08(q*Ez_1(VRv%d04W$AxVDGTN6C=WFLJ ztB(xuMb8M%xfU!Xqoh?-0e_UFOpJ2;3!-IUEc=!meeNUa*R1}z71Fza3|o+qCu)XY zMnn~m;q||4CjmC$&2IfOs5foH$Bl`n1a2%}f6hZ*H_7k&O3vkEaU@gNeaXu~Ws6vC zf9b(-8!dyb%8=|FR^%PG1#gbqC{Af_j$5qsjLV8D#9oz3VKS-kzpI)O_)jufz8A~5t~FKWq}So@K45yCH?QPoTYx9q zE8mFZ`Kg5XxL_LBlArQiJBG)zE4(Tn|MDX#n-?a z6Ki?Tx%_(854`u4i>>Dq-v>;JbtlJj;g*_wUMk1Oe*HNg>81p25BlH-%iI3!+g<bdwsFIo`QTkU{5U=+!Kq_Jcm=hf}0aoUeeCVTNwYkJ=QFK40=;X8vqW z;P5xs!U`F(Phx^TOku+8=Pe~c5~BF{akX&J2W;68=^j(#hfLr-dB-5$oG3lAyd}u6 zEb0F`i>V|i(&yb$`~?beypyx|)YI>r3=H;O!mIngULa+H@+U-d%c)T(D4(~A;J06R z?yVQbu+Gu3DKaRQ3#Yt9zi#`p{A|RS*OFMkds)u^uJRWjuqnORpdm7V$ErSA$C&w^ zu!??JQvREup&v>)R@G8cqJ!D5{`^FgHyVkHPv^nYWJzpx^MI zKg*jwdh+8th5X$Ahra&5qr{$gtMbSG=dBf`Xmoz>lVOhpe?lTlihliNB6q>Oe(x9- z$ZjSBvt@Mrn}7H!K8U%wz?+N9J6YbM24rVtN5}HZq60zvB&4qyk0m@~aaZOlmQukq z4PLWiqBkD0B&i##9@Z@Q+ogFMU3a1kOlKsF4nD_X`@~9e3va_xUw_q{cd(Y?Q7k9uUs zF>u&FHfUJ-3?_f6zwO&W^I9r=^nuiCpVG|F2Jv?9fHjix^}Vqc%uyL3J)@XK`tkhq zpJTSo{}U-+Fh5Ta35>0#y%{AV_#s*u@aL2^x)s@dL zZKHx^K#X_6L`nBT(tn%u*q4#z9lQDyy_fN!s62<)R7;nl_7<=aNmq7@n?VOUE8hLprI_e&!}_RDz*x@-@*SxWxFP2Lo z9|z~nq!=9Q^Yhs$M9O}~a^E~w6kyYna=gv>#23mSV;4Dg|G9F4zum>!D_MWP3>o@n z|57<#eFk$iNTv%3$`m=wNu`O=f{tStp$wLPxF^Sbn&mRTPlAs2>Pf`lJ8T0*vuYSqmq^I}p z0&&c=jM75hlM!#p&XR$@C@|*D?ho?rD1E<7@oqyh@ai$?A1C#rMWP0$FthD3eoZSw1ns8a13;WFMP{nI6?fmHa6jc0hqHjCqUL~-7u zL%0|@AT7MDZfNJkWmYZ&6Th${aa+qtUPcE@ zJdH_5R18ab+Qur&UlwyDL&}+HyUC1cs-6+I@c0;&eaj(s&bt$?q%uxK&BOfCEFM>C zm-7SwQ;_djZWzv~$M~j~olbb3O{5D&aplhMczLjzn!V5JeCh~!Gy`YEVRx>L3#**g zSW#YbYn7E#a61&WobXF*^=+PUrepL4Y_YJExCY8O26wXHbEf07g^yE&xY@?GQ88Fx z89Obq71sT|J$yu*uGvE+6};h~UA8CSbOjQy#4>6fH|bQ7?T+W(kJ*h&v2Eju?Q^M_ z7Cz%&EcMfi?Mu{>2)Y)+=6sg3OqC0A{c|Yfz}&;!i=<>Hm^%gLPK~RPHQ&w_t8UPW zr5p=WTfEGoPd{p@y}SAj4B9zqUoEl0wpL3yhn1KZ?~j=Wb@}mu#^#jT5R#B>6${40 zW6oF>k4w0$1OCJ0L7&HH8ZXzO$L{lYw33mx;P07;a+Z}bzllC~qb-Q&Cdb~}mOq5v zrmhW1koA~%ymL-vEJarYxam0Z^jdQpY5gUZzVkD<_8Zaa@ai*;uG~XC7_jxAUG$$) z#$#Ot81!+Lii-)qNO@x=)sB2BE0gT@tKex=WtwI61b3J-_=POw6q%P{=}}AD)wv|A z*KBUweymD-O833hwwt0I>pkKT66{+<@_{pGzLc-;Z!b~l9bx1xxSPs}!N z6rw3P{w@Wofj(gtB4JBg%cA6e`BoMHb%KE&sf(9#0os0gIv4Uy-10-RCWt(FZEol% zKU}Nz@*)`nO!IBK@3|1w#A}hvDseE!!mChLvJ({FGH<4wbj@-*?U0pLrsVa}5o)zB zHQN_=*xzrlFVxw6HTLt&l=!)xt7-jEz|{QL3h)CxWK}# zv_9@#NgZnwWyNkgdhwit_Savt8wQ@8!hqM>=!Zg7xer=SsfCaAhr~+ekC0Mwfrx=S zc8>3h3h=NXWRuoyMKq!`W6D-3Q7M?kGY?UpiW6*P*wiGCKLd{^$J1f%O_miAPnIxC z>}JZ9lf#yMo7GaswpoFJjfl^d8xfDOuD4$9gnYP!9u6clN14TBC!#4fF;ILN*0^JC z5dlFV0!mtgSq%h~MkMmNE)C+N$meqj`Q$OD$fs{odw+(Olu=R%o0&(UbUw9)X_k}v z%uhV~tEk$J?Jc9sDWvzT?3g$vk?N%7B$*+BD@8t1xqh<*?za|Bqt{x2 z$hBHg+HDuwr~)T)r^hX4JR%&y6jHANNdr$*)5)%Jf+zRWg8bJywZ-K4dYhF_I1@>+ zQr0U_TPgTEsI7Y{bOZg*KYRXj@)ZF>@!X(UL=mh7m`EyGtlDN&6blUi4mM8Pldvim72hUzNn;(ysVsrA~@5J7g zV_k=FU9~(oErdzJ=bqtv95NTwJNpOT1?vmn@^CcMVCy8O5AV*dJ6L6eF;M_&An6|~Z?*lZd1R&1i+`Z+s%WWiCZ*kk`yLjM>Z zDmKcsi_(Y~?uG1$tiv(8V5ybWEwRVTHS;h66WY78d+(jpU$2Tfy_!===GQHm^EiBT z1B}jGME~K|VjJDjI5qr|1U%&Y$V#WCZ$@^g%~1lI5VtTLt?x2<`{~v%Sces@Ma{>Z zDR%;9B_})SNqB@jGqwk}oHrzm3)NOFO|kLAoX8)7(5HgU*id1oi)-VMMnW<68&#AK z+-&nIma}qG(ujFSITN^+=Rcni$VJZ3!DR%J*Tw~guDRO}e_H+U=U$6!q7L~*!XNlJ z6#ZQNF40e35c^z&%Y@EAFsWV;XLi}x zS=8MB)y0`bapZbtQtQ8lRF)@9AbcXEK`y_KuAmSoLJFv_Bjdnv{WB_!Xr6~LTrF`` zEHpme-_hK(0|iJ+sf{_hF^tTvE{Ho_OeEMD+!ynOHB#V-f#j^;6h#>M3HFcHD!t|e z_H>SrMVbA$lRgOHtBX4AG&nymolGHBV*4#i37q)WQ;lSMU#&X z4>w{1j>HLe=?5YaKS*>-BoB2V1rC@b!rYvPExfDKMnhz2{OG;)$m48TB6@U-K=Gto z$}Y0-qdjkSM9!h~Rnwxc`M`)K!R+4ZJ*>Ut$)S!yQ?7y?gi?B><+r%2Sl&=i?LyZOm0ga{E!5pAn#qbGuV& zLY?AZ*8ZM5v)0+KX7a@J#-I%Vo<=~?>YN{(s6vhV*$N?ZU7Vfd=V-L6t4}+KzXE9b|tLDis zsA0DhXRESK5IBz#&!2ZZU+4mvv;05?cbtxe&QdwT7F@&@vNXG)R2j)x3_~4xe#~Zf zS!IVUYAf&~TnAv5?U)nH*Pql^gf#Y3AX1DIGBDmx*@rj<*xxtwTZm$lEg3V)nxG<#Jcu zOw7G@xm|LIx=Yl>I{#wfk(o1*_c5Hccv%qm+`~jHJ1^^Y5IPAgCCxjDaJa8_E2#*mfp~v15qr9iwe@ z4a$eGrrY>gf^-rv!}@4^OOnruxi_Gbm*B8A>CT8d1|;>cjooCGJ&&dxr4peu@AZ(9 zJXSI_-rr}V+9~ZLrl2a2(Y2U!Qrw8eKpT;@2%L=*4==XNLzZ5+)IJim`=jEoCwPhAA7vB2#l&h>s@=s2EqSN%H{b^+A%jH>+Ql-af1x$tl#Jsqrj2~XZ0bWxJ-$)0GTxm>& zy%O}g%9m9^+Z6-i4-2$wBGZq)^Odjs7OrI+523+p2$wEXCgj+bBcTSg18VDpZ7aF8 z!m5`W4Yo5N;upxz3CjjN(Q{^+t3o!oS_1-(F-=q<)0}8p>^O#Lv1PQOnGddPs_{*eNaMQ%*S<93oSZmj*srME@SyJ? z>Dwfa6^@Y;MAss_Bu(NtJp^>E*3K)X26d#m;UP+`mapsl?lD3!NDJ~FVh7Dr}+Vvdiq=ixJU%~H}GD&?DrEvWo> z(V}nNeYKU=*|jw`ccuI>;S=U(TBg-^Wl|aSZ9s8zlVv11?WZ#;k}d7WgvP^YX9Y70 z<57sBFUsBS+kpjCg=UYi1LzJ)EjvK<+!;`{!?3g|FCOo+IlcugNJn;WVhQ4)jxB%S zu;o6x@2j`t49doh@s;*JoKzM>ZC0+#G-dt{@z|IBBIYd;>w-hh*}{4LafpqRV<`)hO2G%EF`hhZz_?T z&r7bPhuCmVTN;xHS{@UgPC1O3%OzB#T%Fctg$288=55UH6_o{8l)Rp9qzTC%h4jLu z8BTNde9Lwz|6t{fJ50n7f_U;T6N4RzcA17GW4Fn%$ z9O-0Nv8oGD(ERvSTYJ0jq?vp90-Gt+jJHy{q{%FaAD1G@T9pY4 zc9>*%AcJ;b0s3AYBZAcr^x5Aaco z&LV`S;DX&Ms;#lH$u)QkyEV<(Ey}ChMlFsA`h3h}UJGvIN({?SgnoX_Y+>BSjOU_J za4V;e`dvRYHkvVtVxrCg@O~m`B!+Gj#*6KkVWOajcQ;La_E}49B}m?3ksXzmy9ooe(KgV0$5vi52T>dsvb+Z+ z(Tgo5pAPtvv4@|DcE^+C+9&up`~lGEv*fc}UpAGY@yTY9RTK>nh1- zaKqldV})m|oHe{o)s6%HlAr1V2sFu4^s z5Ks7}nVc|1&sixpnYPi0Q1@5pvAUVLl*2~jtLMV1Hab;6{^;iTu`YnQ=bb10?UY%>hK`wlxr6$4(9eh5(H%)Znt7miJIFGQ6l1n@r;oHafURV zTn|@h6o(c8 z9<}7pSZ*ch%stQN@C}&DLB{xcznI4PdzRf{<6F?iux)Ish&9&Qr#s9p^ivywvncj5 zpA)gbgf8~oZ{#?**jq{H`r&T+PRrhkYx<=9+Cd~fyNAt*Y)%@q(;lV`FfRm$Zxf&* zV!tK^F6aPEu_CtAQtq(Zl{VwoBC{g+v?$W`$$ za`Z&Rr8QQ0hvl~69Pv(5i2t*YjMpc$Evu-wAURv`q1qwtZ>YjseVWLf8a^p@ep41Jl3JYUx%z!JS%(-xSt9; ze>sYKF1RlYXuqW@T$s$S)ybtu;D6HnrQjfCmZH!t1@MWn;I@j|h$#*??zDof2-7UP z)h)-|Jyb|I<#NzA?nv|rnFaQoUSS;0tc0UQi02m8ec@GZQSg61+|iVQSKkuaXVD59 ze`M3PO-dHO3)%bn$!giuEf7!;uz_@(MH}J!PS%UmnXO35`kSnWUuk3aZm9o7rNL}G zY2iu5$xs24yAWxQsdi!Gd(jnOKzC8@bAiGT2;wcp_zZ=C) zggIu!#;XS#fGU=z+n7v@B)uwFISwvU$4xR+mV7#vJjb3?uQce*>>}lVbBy~M-rj4(wRh;Cg~xE?#HQ58s)bpDhl0V-nfof5X#uTu~M0 z6RSR;C@elKQ=B7do}Er<$HG};i`3!*wz3-w+rSbhs~ThBs`|5aNFmAMVuI8Rmn`nW zz8rNS?)*Krwb}*;t@?06fN!zW(_q$p*nx3yDc?3g(|+qRvbgkay#2B?Dsm}^zs#;Q|d1cX-7ra zW#aHQJww2i7a&Ra!1c)LmGE|^Zz#sDo*l#>H8yj(T>%&$zYS+OxaH3VAnQmb3tK7P z?}D?{n_zH-{kNqme!FE4B~e8Twx%-HMg3Uu$4yiNNx^S$;YW>I_S^6&U1B!ylPhZ6*9J#k1Yix5ikUG-=8m|se zw8K(I1i|S}EK88dGj`$3lr6Nb59tp4kGhj=1#7hQ_lSfQ6sUh!qQf z6~2raW*!CL!yaQ6Wn$k?50+w649?@~Z$6>eH4^UW-nq|Gp0%koy2y*pjoQUW7~R=9 zh<(6P7qtWU#=Payp&XtUt;N8dkGrI}8lhN|9^Qok7sN!W$2CM!+L``rDx)G6%P@Q(^E|y_nbN412#j4Jr;S7JZEt3WPx)Qit zTVITsCA3M9C)Ho*$ot9=d0gvhOZM12z|8r{1%$X^3z#5oqD>h|+;K-7=Lviu;wCxb zZaSfeLWw-p3j)uOA}v~6e3&SoBN2wRpnc51KPD)gl1k8>pQo(F5vQJdT`kB+t=~*P$0?K`QJ(=B<1zSPk@^mU?1Fv!xQlEtbmE(LqTw#hqgJ2D z^K$G8n#Ow0a8Ty|bKG3ZTRBJ@lBnUZ>waEtQgazX$876r}s6nFZw~Tzic1w@fXpL%VRttIH(_LOkxe=~-(}wUHd!wD9i6_#(YcPCTIYm=S{{ZzZEG)} ziwaw_+-^8TXy@Zgf58AJnCbuYTW`$%yUSkau;c7YXt8IStgErM-o909k5uchMwb(5 z*Cbwx6E2A*3aF29@SJi*3qMCjcCBT#vZ7}{Y?+%l9pnhdizuO?qIxi@QfG}aMYD_I z1sLFJYvs^Ek_1_m$pp-ATt$a&K4v96=6DT&k_YyEY#AXX``I&edecPkk$AtcvRfcy zX0yjfW-HeUwPuL! zh>-eeiZu?XgPZf&s}qJ^z=EKlcag1jUYqub&vI8m?Q$%?nY`&n%%s)2fc=7s0c~pd z1YnFhTbXtfW*)@M_n667p!ny9?V5I)x)C*(_U$0RDY1->{<>I4yW{k!Rnz#pXb{`^ zF#?aEL@%O6M=Y|xCuOH+U#hf^WEe_Za6Qg3`e=w?E-e#e?@P`zW;tG@C)sulY!kpN z1`NYerZ6W?M@zH+aW(I;t;!nGBR2Zk3n^gGzf{%`o!y6j%#Zi$)Bp^LkJ7hj5~feD z5|IWAA~pr^%i@uG_e;mMkJ}RT?&KWjKFj() zb5M{$z>BmZlg3j?P6D>*vBJL0kOl&wOqiQg+BWw&oxR$GT+DNl;?-2IRAToq=KN>e z_x=()>iMY_^XH(Q-aR~#J;)|H_U9~75Nvgf< zur{|BS>rTRIWRL`8qIUsxkCitVHRq4M=7NdU*xf495fviMQ$b+`XogWho_-1B}+q= zd!l5Xz zWH+{{_|%G1_>Jq)u>A}YZ1bSqT$k8>_DSZ!N?%x8lSjZj$x1mJ)yl8ZaWRUrw?O`Q z)lS8aaiQkky_QFJyTXc9&AvXWV)QR~=2^r>*qO5UDjNMWX8}7ojbgSC%2fvZDA+?; z!Ii`mBvU;0Q9`ZQF&9lf3nL46T7DX@D0T72rvV;;^tXs~Wk8jvn5A^v=q$;HUAI!z zY|cInK<)R#SdTKSFFEX?3>bgRcgF8{u6ywFfb*ZUTaci6k|3Y&y*}G3*gy%_D~a0k z@En;aYz9X@+w$0-;d-l>z8YWwOfRJ`<%-d6iTv~{yqaeZ+R_}e*HaQJY;Ll=wo514C+Cw|{GGTx8g7?T{}il;U1>2Cd6HxJ z4*QQbb`uWc_dhs(PY(EfQVGKCr~H|;m6`$B#Rm!wqOJ(B7FuL+_9dt|*Gx!?P1WPQ+VQhdY?M;9ZUQi90Dh_6C> zX|MX)>tyH&XL`>Qkb;w#0~vxdf$p*u<=l%pjM{QFCwi#^^*AzgcQfbkr4F( zQ!S&;BB%Fu&%C0OA+pJ!!**kgLapszX&1HGN6IO5;Yy{6IlMW=6<5N& z-JOzGBf!3UQ=Hg1_sOe*Mj@G8_0N4_a;kY_>f!uh+n zrJB41lYQmn-FdXwfojuxOPvyS8KS?zk*3K7o~w~5K=v7j>P^(q#|bwn@(wwkMeV{5 zq zeQrGswFnteiz>Tqf3~ta(LOekuBRMbxt0xGG}L<9=zIO2x78Flds5DNQ2+a3d*5bD zU1tOYN_5HoGhAit?;z)Y?gBz0K23S+6skmkLz+`k@4 z(m_YkY`2f*+Z6qNV;b|OJGRe20MgNWRtzEtaZ#fP%SK%TXrML@QMf*X((sXc zt4SbuS0@!!@?x8%A}3XQKcwSDyFSLkhpPNPS`|7Cd7}XFe|07DP7<6)C7>`5A$YHC zMBWqL3UBnAq?oHHdf^#eW=yih8jvao$+OwcWi^9>+3*m^ZoP<|@>OZ}x{HBsK;m=b z$+IJV&I1Iza%x=8G8MXZrb5@tsWyylV|k11BvOb_&XZ5~gSCxJk-sC9#|BEd134Y4**G4eHWYGJb(jC0X{xE;7YYn4)wJ zLgPg-pdceYUU0EXW?>sHEH;$OHrv#0JlH17Yi0Ayw;Jz#x(;N^8X96sW~=u=GiS&S z+EqXDxzDuFB6gPu=g-*{DBBSNqs*m*OPo6o_`AM2G|=ALX}N68%_tcl2#VUZQ32N2 z>Tl;NZM58~Nt;ypStr_k2nXv?yBABeVSsy&a}cfKYP?(Sn_ri^hW zLYl*>PzG8VwmYGSwrZlq6qYd~ULkc;l(!;5RpEMDIr{JZ4?$i!Y57S-x~Cmg^?$;B zzRx1vC^pgfgbf@S{S!8NQEq$~iJit~fMa3%)rM6n!=wbuM0Pb1f(jf#2NMKktS{WI z0^R$JSx4^Qh$LXRJZMuQ1Y%_=$I_cDeP2CiBz1l9N}D*&D%OC4^L@&g zxRrmi8m!fi5REY zE|J5V)pAHTmYr_%DcXdw=%w~u`w zT2fQRd)3ua#va}42x0Rxl7YR?kbTIX#o^T~O%BSH>_IF3R1f-OayDhz-gKM0C~D_w zeN?^SWCG%~cUhfViUdodAnkNhEk;*0#Cc?eHppa6c2$w_uo-wN!X1^@%5b3;a?g&H0*()LRtu{z$@OI?hDh^y<)2g0YwZfyEbuwa`M?}v$zwaEu%QFhF*>@ItvC7JCklvT+WuO)k8alt_8k41>hIf3h-e~DI6!)eWP3)3FjXbwUK<`8rN~K zfel7=_~a4+cvG22lrlb|)@3+h;x)RnFXHpHLpuDOpb6-+chII8^z&?sM6INOC|{v&gF3i_Pn> zl#@F!Lb0eO>Hr>G2~o{9DvwMd`%k7qEEce;;fC)g$;I08fyknriBN7MV$PtLZJ7^u z`VGH6)DhCu@xw}_^^3G~EVI`x6t;H@OdSK;U2=N&urVYv(DdgFJo9wF=K&jAwlpWWN@0O3MV^%GKPNVZ`gWq zDP(0BiCmGT4Ux6%T|^N7H+;1o35fdP2PA3?IqQHE!IWq4Q=7M~O{@~*ZPFTz6+K-x zUVYj8ZNpsEDdcb^P% zF0gQ>-y;GeE5nv`V&raz8RTsXF{^dDfrLDbBY$pCFrus=wd%GDYXXpLMFM9Z9N?yc z874_tU$E1G9XC{A3XMXgTpIT~)Uk|c#sW58;p1su4$fYPjvWteO z6lRQ?Z}W<6@pqUizTZ0|tx7#;3Np6qqeGolMDk|)s zmV=-AMj8$}hn^dUU%r2#08cFP?`Mn*z|)wDQc~NH&5c^>iWMCxl{Kxh;%ju=or|~8capJp{5pZJiyQoJHf{Xw(aQbL1(Hxui zegXwQ;1v-edsBy@thuFclTPRJ_A{I5?0lY-(S43;+3ue@1{9l8xvh8{pFe*5up&VI=HF-4#YP( zoCr-}`+2E~QbA+HNyrbVH7zRmpGzJXU3`X$l*5X+Bf&Ix8@d`)J7%!2Q@n@LC${-q+UcQI0{Na0{$IG#{FBc z>-zsOGS;i~n^YV*9^QI6LiXyV^fIQ41^?_aA}~&tb;eFWk+^*}I~|Bp2%<^PtV_F6 zWO7=H^&*uXCv0?x+Y_bxGU1*j`+nHEP|r+pr@%f7kFiE<0RarR;jeK(K*OjZ(FU1J z52POxNF}MSBiu@4ydhL&QIdmiW>L;74Nio_4JS1)-RE!6G^PXgeessDIBOwppJNLa zhY$4Nq8xKmYBz*#wQcd`8HYB)*tGS9I$yWMKim-^LS87+t#CHj@ia6%otLe{Xpmox zqB=n#ENFl8#q_xMIUB3Pg%#kf8SPnP--J`>A?Bsy@r!@b>7W7f$=JpcTJbCQRDF8Q zqq2L0KD|u({^4)p_J@4=P$oXqhYxMRhqmBD|L~!2{4g%~FkbpFCi*Z={xC=QFhBY* zZ~QPf{4h8CFgN@#H+;9;uz^zM)trd;7JzTy9l(ky>{U?}uBDU5(G1oS>aw(FLeE-9 zi;XR(tesM^q?#IFcyn7x7tQOvjUiBMd#mcJx@f3)CDpZH1}eH~oMk;@9nV_J-m11L zD>+jAOq6HRsoY%M)$|}EM7g(i)w5N5tE?(ov8f7t%MlAT9#IRcq^Z5Tg-3*$&EEPh zwnJ3aw=|V3DcN+SWC;)9ZNh0(*CU&cSbh}fT3$&#o4p!1m?K&heZWeho%CWx?c3BH zW!?{3>?mVAXeAeZv*hTf_F5>v`smobp|Q_U+~qta4(u?7jcMdi3CP>7`tApgKsZEM z$>#3zr7*-hdTU-qe)qDyw{fgON_1Hb!)Ml8R-UzVMY~({Ca?x5Y3zE?yrzo1(XRRV zEgeTTEvvWmF`M`1Th$T9>aVhVT1jawY8_Fv1&Bh+UPoKh=EKYf;BKS}W;X8aUQ$wJ zY0M8;fA?RnwGL!qMYy)Mzba@9XFmSJTEmQ(n?w*&$Aq?5d?UT-Cz6pIZbN z0ZuW>T8=b=FzMgK7@HegHb*n)MP=r9MLD*yyk1Q9j)+p;mtM=k8JnZkUEeIJJ{qmh zgUTp#%*d-gBEbOhA39Rs0Zo>_q-Ee4D=Avi4AFEr<~Kk^OIt;?o%O7p^MJ)3)YhDZ z&su&3zkBs9CvF0rbkpK4Kq&dZBE zySL&&3iDMQlpeLle8((Hf3VA99eF(#T2^8$`BPgsJJljBN0@19$5QL)s)ZuNkR@p9 z-fQX0O7c3Mk$}`b8-1{G0NjpII`2d?QtCqpM{3JLc43!ySyp#_xz!%wz|Qg(3iuhd z1Gg``RUL$}YX#lO{O2u}(uTx!SX3uq#S3YwLmn?X(LXy2M~$^yrU}&gn7;T@VS1?C z?KC*`ZNJZXr$y``c#bAek+)`mVlY*z+r-8y9qW~Q*bCMD=FUfplh;sL++J#`mbt7rmb^7$Y~{_v4gN8$tQ;$Z_hU+UFW?!xUnXdz)m3*#XQ2uiemq|Qt2D^RfA<_++Pfuu37s#p7LA&_BfJ^C- z?8W~Bvvp5=`>+khYt(m2unt5)w)U_&zG$kwVpWX&r~_h45Bj02#TP)Dxjy%?Wzbr{ zq815@JU(s{TE&6;?-lVv0=yoFkb$_pqH|QHv$ZC6tP6$~h!yV8QXa>N^~@a{LQE%v zN>+X^>fYG3aRt}Npn3h@|c9#kNKXLGz7NB^_rQ|SIo6VSLE zY|v?}*t{3J4p(M0ZV`<|Ha}Y5&ZMT=q(^xmH-rv%oQPFhNfYElX~w{b%8K%ec2?lr zSv>qS_xMWIh0`AEDoeP9qk{Tlj5LW!Os4&Z#X%)CW8U;Tbf(yYKxtiv%j%vht2#buO^rpubi4uQ*C4B7wORqF{`ee zbB{`DoY*28PW>9oVcH~{$aXJHYaA=&Q?aawQIHP4b{9Z*ps(zPSJzcC*THKwq4>hY zPj`8}-ndkr!TKU9wKcr5J)z7mdw{q6+x%ZTA2BcUuH^53@ObCpbk;ZVF!R6{uv5%l z8?-zu0)hsS1INC1SIx?ba{9r%$PI1_U}EugY(`+rgHSM)MK1IX!Q$yQ%{#y&r0pr5 z<{3dV`}x;vQtwwF9Oa#M0?dew^AP^R5-Y864?4g_79VSG#0PGf2M2UTVq))j8R_Vi z8~u+Sr`qVWNbUP{wqpB|a->3v=PvlE&LH#c88cXpCt$f#<}9U>Tb5H974wj z^p88zu@DgZ3Od|x@lT)6JKEpYrW61OKyUn~zT>fNAUVd@ylH@rwTy^~guPe~__h5H zwEl|6^u@awd&U2H)9nQJ+lzevQk*v&jO7DH?`PTO#2x7zk z*InLIUKTH^#JD-)%qxi4+kD<{Z^_)esc~T$tjmGTJUzIPcNI%4+(B-=Lg_X#O{^6Y z)h^dOeTM2@xUM@6VoZJ=*Zhw^-EO~W;oKV;j$U7`wl9O%{)4NyY(U-mf3n|b>=O+6 zn%VZYD$sXoATg<0%U}*S{OfvtGQI=cj$JDsP{N0v&|Cx7KPL1XH&T9J#4*vb6cN-LD zhQ71w=&ru(f3w|hmW8KZw)?HJaDLhD!LrD-NZIa}%Nk}}Ix~_pyZ8D1M|suDU0sJe z6044;_=-MBg6@p2Z@Xkg=V6)_Vr0*8r&umy3-Bsl-ck*uXFYNLHSCb#9b-VXKgq_L z+t`l%S#V!>0JPb`@jhST6uhqjx%>xk4h`R6i~R%k&G?C91Q~l;n|EwsSIm9jdha4a zX#i6GX|`MOzHAU7H`>S9KYl&WuC?ppb}gK=Yxr}(KFZ2$F4A$=*E8-X*dywX{3%}2 zyp@B95@X-Txf4x{{uRdGt=k*EhNu2ACnbET4v5EgPWWylYQ2pid7(7}-oPWTfuQvq zC%q2xE@Rj7#cZ-%r4ura9d3u_HMX|Cwi?{bMy7WY$0u)MyVVv3ZG;4$+%E(FxZjbx z2RgZHSF_2wcYFnG_6ZLiVJK+1JP`&^M zCasw%FAc%tP`^9~CL)yU=sywbBG&aO#-O=fg_u*h0dQF(SmWH!+TLG2^28cY*tib& z|LisJEn$>?;a&Kr6_`;uN-pQc-XqUH{@t3*S3UE%yRO)9d=b+jjgLJx78ukdO7Dh+p;*%ThYn{(eXNoL8V<&WVIp5 zKtJ4XBfXd4UXCWLwu?fXFMO_5HXueWf;}pU|P#Ecf^=b?5>| z*k*uMUd-)Fok@8Qv2$9~%81fSsmjINdLjG!mT;Ire4txTTxkufoq8g+h~3rb@pZn~ z#*r7hwygzWX2$;g<+fZeZM}d3#d&tF_}9*H>+v17w7#y^F6=p6)v}m*ofGFJ?*m;O zdBxlSJSj246+FpTjcZsrj8koVprNnh+nBRDv8IX{tPQ!vSrI7nIcV4dL|`sj$Gf($ zu@kVkyu25&)_D=y1_geNmwdHZK~tkm;iVir2J?3l%0=qs|l~_e5#x{EJ`>w z*+7{ID1F()) zpcw0&7)aO<17{-qmiMI^{l@7}FzD~eL=#<G&dGA#5GR)H!$dWyE4xBSH$gd?pw#g@3*!5 zJ!I8)rSP4b9hXS+uRt&RtOw=F3uU_F9 z`-Cg+BVFL1Q}wA-p8#C>)5it~J}uCvh5B=*{>h8$`s{4|snkEQNPSo){w&r%v0i=JG~El#oKF|% zPnG_;M4y)G&oce9;X-{}u8$Y#(+d58=e=${wY0q~1>ar5pZzR4%)V}-{}n%S621Pc zMA}xwc>*WS_^tv4p*WT>r81hRPbJpwOx)c9^5zO+jMJ=P4!WkdeN0FDO3*`>N28y5 z-=NN^BeIWmwd3jwWJLV{bcRtam=ma{UV6-t{j4}#QTUw&qxdc{!d$NOhY*xjgG@o; zgJBx51!LXHACQr*S;-7k7GeZ$;??Ue5Sp(6oDDcTE@t<&wMZV%;PQFQVvaKH1O>|A z6`PD@_6o+bFrvId#CcXC1}K6QY!9y!u*s$6MH$@bhg{Cya9lepuJv}y?c$gQ-oDGA z2PF!<5(-I&4j4KOcF&DN-)vXd;Lv9tCMqd(xc8$dGo4IT!7=7Smokt!jAw!>F+h4y z*4mES^Rqk`8@dd`l_Os4YH#(Lw$xTDMT~hwFsz5v<_WJM9iyuB3PtKoY7nQFNY~IH zz2_LoAX5_DmrpL8BeCm|2F0X7J(^ie8q^~V>X8OfM&o(kT${&lut;?WW~)5}Zl#h^ z(ZDqB@~sE8DxaOKEOBfn>SW!$rww#918jEYZ@@+AR92Ds)oR zBr&YyMVs8AvR84FjU&Pu6R(SD4ne>_cGhDk{fE3c|o-R05Q)5p)6Uo~<}pC3yFwCqKa7uC5rnXMec#zuU$aC$Drbm)&V+IU8LZ^uc`qZ)*+4$u<-M+29mWv< zBWrlbnZqY#5BV&E_@uLlhh!4@MmF(~j3R$!6c0J8ct~cE&$5e$oMAlV*m}sBM#f>+ zz1W=i&A(3f9JB_R)&0JO<+(i?BBs$aE;Hz7E-FJZy?!Rj%vJPBXpK}r`a;?b4-g;N z;VTXD?i|Rzy*szm53E{*fbiUez$2Lz)ZydSz;e0^yW98f*ur_Xuu&_+q%?0%C*#rZ zS4>VmTgkugo$lB`na-_&h97=wIGB{?lu(S|rtM3MLlh3A&!?+w<8E~t4e3v}weH+h zQ@yB!C?YY+ookoO=lBdJWNf2fL?C#;{(~r5N5kaf#Z!*aZS!aRmN$m;-JRY%srOkE zXX(C|yb^YeQrdXwILziH1^cgqAAX^k0vy3!C_ZTO-lp@H&K;eIrZjb$O^qFcwG^4u z6Ug@;#`8Hn!P!d{wp2|W%hOoQv_TseV%cPNp4wjJ5MtiUo@G03;?h|ZW> zH&+ou(kK!0)zaB{ko2|+UTnx==Unwv7$5M;Z=>9+!X}dzfvNhBD!_>X)r$XC@IhJ0 z|AAvD`EZDsnj3m}^6UEk4i0d;UUf4^^V@0cT=p+#i?X{M-_rM#KgQkes{`&ij!KPu z(A|8{-kwKCAjc6n(AQ3SkQ*OZtqOw2p6i2d5{KlVxTPbVt!87DS3|x6`3%_3Xd2oz z5L{!04uY;Fm2hq&-vy|Ql3!}oREbFGU5 zh9Zv!qNhbXo)jeR0=q}Q-M61v_jQWr`(6BZz$)EmMTG}kfY@0b^6%ovf4=PGwR!ui zD!HCKREbO#aoRGaGA?*K{&b&syRvGa2X8ejev1!$TKRo*<4WSYi)Pi zxjsVR-{^j^3?(dvYY_N;T-tSt5jDklth$Pz=ni^Bw}<~r7toeJdTbHQ;@vWZzr@5O zt2LovpR>FvG&cRqeZl)zkC)a4dg%H^@=hGZU0S}r{WjB z$DZ?-2!_9y5dO*wc4AERS5|z#>;Rt?VRgDxpi_|ypG(|dVwt{+I-LvL?_6M~bAeB7 zUl!@rw>X^sgvS{X@Q6>oVV65_oOsKdlIElxClq+*VI^UA$)Go#*O|D>aqjNF%Qb%} z;VdBjOK>KpzUA?@+cA6>JURj+q))0pi%GoI10Mp5dLQMqLcSbf({^|_q@Y_K+2b|T zNkT-pS=3C^j&)I4fV*r1{q7QmRM8S_$0!99xMp8K0o{tegK|G3DF`mDI(hPa z!&tI?Ng8cX*WmHT+K=`2?H+?8rBAn2x>f^IW&b$S>Ue_aWrzbO4bXb(0HOG*%BhI~e8r0o`8Li)$^t`1`$TPP=j*Ox~j26P6P#$kM*x^F+n z)%k`zh+UMgDKJ(YQW1;>B%`Fn09-+p$hayeZMB5R?DM9V7_;;jJG!6iZg!-bS9mJ3 z;H6`8!>V^>bHJ7ku?2oOC#(S9qNd==p$P(ZBxdJeGebFVyq|NB+gqEgbW5#GRt3)G z_njo0yuFxC!1P76R!|0u*(Z!!A9#rXH~oqBn+RRBUg^m>yMMpQxjQOZC)e|&--%&^ zfK+$C<8fYAV!i$6Auy2Pq~UH3Y< z;)EgzsI$9zT);v8&6#MfU!AH4Nem&9~=jQjib zC_TF8ho4#OBN*QFCUIJZ|MNiNXH6oQ5YZ9GNSrdM6n|2UiAgD0=Gnb^cubeOu&4LI zE9QEu(}a|8F4qyVeZ_#6p@iEJc*>0&YR7Z_;flGBcoDgu`{k<@b;1pwS(9}*p3Y8r z#Kl{SiHdHsjG?^zRY5KMy!ylp9oEat__$oOZ65wv^(eJWPL`=j^5kLK(0x$$O`vyod%Ofk0nVW7? zr~m|W;zfWVOvBr(*;`JMu!ic(6v%^r%PUnRnkYVyvAI!Bn#F)O2^i4_od)OLkDP?6 zJ~~$86>ln>N)7;6Rjbaa`QSSor3xzWq?8ffvNw+LItxm0&VOJdu^UN3Im722#u!Ft zVu&}rG}?WNG`)t1f@AVH=}Cv!&pJU|%&CWjo57J|1b(ICSBD%2+?yWzg7GSM>4mGr z#uOhp;G*&eB`s)(dy=oP_u%bj!DxlAQW!6#_4AvLE_g6er{b)74V9<)t9aIrLz;_Y zDiZz7>`gFz1H3)Yp`xyLNkuQJ(O*|vLu{fE4>F>%I;Yf{8o5c23N3k>fvcKQe$#l$ ztw6K(uUb@2;0?yo>h9r((Fv!Ph2lO9r67@fJkz$fRpA^0hR0TLLw%U`^?|*Lt}H z7!{v>#rLl!9($L!AT4>DF~rEbCh5K&-Pb1^RxEMbZ@h)DB^b=VEjgA7=Df5;R|n%U zXg~#xEWZ-7&5^#}Q6jQ>kk5f4T^6fi#aw2cTz$*AWcp7wn=ny4bO7eRDxlMw_8Rj# z0Pp)hGD8RV1{eGh*%0_FcE#Kjd)cvSiT$rgcqM*05AYFMg0f|~>_RHi|J7~vzCIIQ zd~6wJJ;S0hoxXj}oPv1j5$(d_y$t@9N&Jp!{;|;6zq`F9>3$O&rBDZDH0&9QOsLnn z;-+e~0rJvkR|$`NGEs{DqBkXsCQd|V3%Ge07^MFMVsiIog*d_Uv;25UO-MjLC2r@ zs^#y%FhHdr52$iI|Aoq90a_3^-#(9nuNC#Az8K4RPDyOf-krT)XHgV3Wa;=R!UA` zIJ+>xccpiEM?H=dlTC8Mb;MhcN*ybWT9{6I3fVWIcb*W<&Q{+ge}jX^e4`Cpd@<(6 z-zav36$26;%Y5m^scyPG-EABsh-{=i-%j0A0LSW;8i}RxJD1><^>Auj-HI7$?vylw z>gLjN^^N9$HuigyK|e^f%|b%yCd5ste}AL1@dNdbJ#EwXslv8{NIa34oF=PlQSMP2 zNnIP^bEj0-)@)qMAT~WjOg`QUs*0NSTXBgZ*>CI8cz=5v&2#mO;w4s+5u!aJtZgYk z?caff{XL3lbo<}niGQ>|w6|IR)cN$7rex4}rOsKQ2IMrJtv=THeqw%FDG&sVtRA#i zn@z82M&N$SqXt0N#_rXKq}#{^ph;VII1u*N98ggO9{#Om3L_x)Y5MSNJKZurgh-QKy$?@ z{R-7{y3MMGgTktj5%$OY8J4sSG@-22IpOd0j4Bu%l=G<-kq`2~a`>ivqDWT-byS%f z$hPrKR(yhWn%vY_&2R#zoNjZEsj(O;uQ*{dkAd!<7Qnafk$l*cqSy)M5KW9D|D~gy zrnt$Kkbnk6g{ZY&;};?NS#Y4$+T<`%BkMVnkDZ9oGQ$&&7f5^E~~W9@1mz73pfx|B`nO2L4aAT2MGbNcWJR?!MMWP1%0k+`Q0dum0+- z{~G4q0%hql!)5o(ShIVutRYf%&&)N`KVP=HEd0yK=RNs(+A(LgG!OLEGJnQpX@Y$Q zisVoNbzKqxy|4^IP0U9P1RfQt@j^gS7lR7&p`(ID`4C+p4#5rjh(m|JpgD6%gFtml z=}iR9lsJuym{kTzwOy=2i{Qlx0IJ}p;Ffyq`gX8P*Ca5AAdoJl-*XXWy^5?!?TWK} z@QKWM2a^NNwPOn-(fwEndZmIg2CoTh00&YuE#J-@-)Kupf|;vhGz{ApKXJ?rvz|86 z<&6PgNoXZxsHiQ<(Ce~RhAR5!?l?nOnvD6jM&!*eFIvWbtAGqTNF`HS8utM?RjlUz zo2x3y8$g6y6z7VS0za)5zKSZ>-feX?Af+;y?Gjw?VSorbw$xHNyCeWxtpl1BG_|ZI zZX37=Kmdg)VOrK!l+e@fSO2Pa-%i0?%8Ph0pDqJv+hJFPVAL}BeYQ1dL(6pJZW^+p zSI3+ZF!5xtr$m)VQ(r~7&=A><>7`k`bDIqF}Lx_hg^~g;}>;ciNEJ#AP$J&2JLM@N5=xEqJy%yM?)b zl39T-jsu(ZG2_=Gbk~3y6WG&-a0d$pY;~_EQP@33p?>`F=hYTo(da8?b-8=|txX_rIvR@+A_^neV(d4)KH ze{LfV$=J%Oa*(>Uyqf~;sX=ttN!<{%<>=`7&S@o}sO&Ri$r4ahcWR{qNC)!uamOOE8sZT3otP5^$jriu8pzwc*9AM(N1nbde)k#zft z7gWa>3ebJ%>VZ8s^3E?8#?tjWJ7peX;K@lVgrmC`M6U3io(A?!5t}7agrT;uU#j!P z&zHTJ&2&ZuUr<+L6Hz`ZrtRr>D4jGrSKeW|?)E#yw`({1|0?wuwfoau1UHieig35k-HB{5vS%aVDPm&uJcxLL}v zYmPBZ(Jz&-Q4$5-vPhlwcV(8WIq?OnKUCM0q6$Ik{#jvb!8SlEB$ysz2r`4(v|8Z??1Jd+~9Iqzn9!Ote3o> zNK&`Wbbrg--*WeNmis%~{gsJzU0sDP{Lq8-MJ~8pH@aXHGK3p+(Oz6!CgL0tw+88j zA7A1B2|kX22ap%Sn^cs9oV1`^{`XeWY?Cpm6NKgmtnMq5FC*ac_cqo$5FHCCui$jj z-PmrWAS-Q((Dtz5>9$#0rcRnQb#|pSoGkZ&ehzfEwfIQo@`0YrNMT-a^Y{(xR$1Ya zkF0K4vWoeOo$T&Iv56*io~i4P-??g5rhe+dwbld7Qt4~B3=y4e+qk5nIJ582rnU1^ zILud(&p`LSrmZ*0?wAL}lP7DX1N5T;GJbhg2soAO`0NmHDzw_k7RfbJn9St(VVlr~ z#EnDZ#sEVs2R5o{IsaZ+PO_6!M)4_-Roo_idI)GJ09;IXxX16^vXO@%v;o$zflLBG zDE8df9Pu$oF7ZowOw6G#{BXhYx7b+Hw?YP1D+@Egx^ytVEp^Nd(3npc5HoH~hJmi_ z?HvB_ooO_ow{Do=)_+KDlH-Xz4yIA!vnsB=p^2KBTN$SgT=j%Eh1Um)K5BywM#^%L z5b7U+-*{8qQ}oQCPqidHP7k?xyK3pdRg_fU{UUnJ;|TKS@GeGPY)p`tO+pYMPxp%e z6|UT&diSu3Z>`gP!H@WMbVx*Cy)-h{x!QD48O|QMa7yAz#4!X32@8_k)Bdto8A=pb z`1C)O$4O9SKSYz3dPU)?w%9Ktb&G6%l8MU_;2)S?mf) zH)XhxGoA7Nl@EXY=sMymYV_1C1nufS+jC8yp)$8ThNDHl%K13~MQr#sDq5Kbb!O!O z+LhQtsPi^E+$sE>snXV9+yp&h`r_t(|Du83b{oUXbC$c}5)T4J0c=fAM=-=4I-9(z zkpWZUgVvzl0iAV=1G4b*!pSd6K4NVMF&>Vas&Kfp@=mY_ECCe_m7Rlhod_ebG|vAy zcE+0$#IP(PVThRgVZ^js_9qyi69QBi>xWnUM~Hxz%V-q8DE2!RFok7$1oo9Kp}Ru{ zqSHaNbQS#}pZl7vvf=DF3&tf+YIuETLL%V9-5R-XsB(t``d0LMXDADFMW_9evc8Uw z7b&gp=hZ2CfRl_DeX+QENG#mjsF);&G&rGPWQ3OSE_9dfPY4Y%A=_yA-@T8#G7t$B zkex&fZ+x605w7($#Ko8|62rNOTnZ0TOsLE=H%)hNn??0UV@_GJ!A=E;l#rA zMD_T{NU;cfX8#Yr{FFpLVJ9p@l?diBLbLw7ofsh$vJ)~Bw7i^9oP$t^5eJ4@2?{BH zsg;lia}v=rWG0qKti&&d8L|)lQ5h&QYV{XLH#QOsBd&jGe=#_&2HTVK*{I6BNmswMb>`6Tl3`QUc`cA*H?g_?a#;YQI z2NzE`U=bOPw|S=tP%8H%*>yM2Yu;_@>G)np&yWLf2xI4AwG4i*-d`t*V!H2cUBsCY z$z-NehrM*VA2ABSvvKB$M&N~R%1k)>6C z1zJ8aJzc0P!nA_BQLKHboFFI44EI4JD@M zmuUTLOId`!y-mONPxzl-?W>9!Yk+G2b+x^b?)y6%<* z0;BU!Z8JRJ_8A_~MneRaN@ZWidNvnOTw*(Qat~lohW-EB`xfXp%k#`%lBF4&OGY8s z;~O3fwnhfyu^nI(ZsQBqn2=fs3KQB5Bi}T(3>x3?m}U+m8?eG|i70I>(oI)zwvE{I z>=B&pMrqTtBj2QM8jgH6bmeWbJ0tC8<)k?~B5jyZ;&-3t{r-PubhAyGw8+UJvE|V} z|NnpQ_gkccm*LOqZMd_8}ar27ZA4GfHi18G(R}DPLlMG2qqQc zDpQsP%yANU;Xo?RIytX`Qw@T^tqRS&dBCuyXe$L0aH(nQ&0P(EjS+u^EI@u*A`kG7 zuxygJ?0FysXa+-ln}$lJwUG;3TUz(83oEvKq2XmRexZvp)!L`Z=-ZML5O~@6i^0=P z9|L>h?^z5udmUdWKQ<)mfwOfvKzS7Be2WBDuUHBT6`h7@HcPT$I$7wL&MU_LDZJi2 z-~hh$dcys{TkmR@Al^14t9{si?a)NRkZ1&RFtVaURx0A<2M+?cJ~z+{=jwK3KNDlj zQ?AM9eBLp{yg4>ZpfL;;Dfs(V{Qs6D5#=0#Wk3ExUT!)5Vy+E;DZGK)UtUvy$ZK)x z(qe8m-A1hXe#V(2Co1_N5_a_LH6-=%C-7sIjF~0)k|orUCG=uCd;2Wx8Pf1|jLTGP zH4l&Kf}z2`8h#ssijby6!E|>)Z9zvtwU(O%*D6@%*~StdfjV7R_3cwF8y)?GF=zyo z=_e6V297#5{MUbS{7bFJ^EDOAx7J{uOY-J9?|c>7#=#nh$4}a@$>MK!xU2Ys4pYm2 zp9)1m{z)T>{};Dx+ptu{|D+@*%KvFu_mYcRfwG^6xEUES?Z0f#HKOmd=bE-i-62vs z!}K7i3rlr?na zLy7)q0$0JjBKBkKive`*S9cP4yOzU14ya;{sVndkY{_I2Gf`cW)b}%W$}}d^D%p&L z2IL;p3fFPCfL~U*K^|N6gX(B_)#O5htPRK=UJ2%{%oqkFbfNy?ldLBjLp1?WE(U|E z@c-MuT`LK8tLWo{4=egc?vJS0L+RmcX|f)qKYMBEAExwYW%>R2vA3d7hEwLspwId) zSNv}sFaCXP^r{fuku7YM(5a%I89Mu|KgZ~zn&g5JZA^yY^%z08xXmw?lNW7%W*V7K zPm=jQHTkETA9E~z5^q*&@=vPCKXV(sfGkA6VD;H4Hl19sbslyKR-fQAH46>@ndt~R zat1BTa!nYrk3?}blWWuR<>j(vRzfi5s3|qZ|D-YfMWHW|`4Y>Y9B=wL)nNS80b_&h zj{JY3>F4MXV?!OwU(FO7-6~Z(QCVx-{({e8j6YG|qVX@8tDu|&k^2UKGNfZ{%}T?6 znW8_1c1_x%UmTWFRIf}R-PQNmYZtmYZ>q%2+5!VQ;tHYDd(acApa$sc|?mV zUv|vCTKzSJ^1Iw4$=0-RL&>==8FI)VO18{e;!a4ZyLAH3Yn{PtFJqyM-lKn(<*sfw+QA!|)0T zR}u1{HRjt7E1Y77>Bs8dCmx~EAs2{<+g{TDbS-zVN1T&K@)@vF5d}i0eUNG;3lJ$H zp$HuaasxTjUn*i|qa_AmC9+@Ip^36K{REi;d`@SsG^{;!y&G|IJeb$uHu@dbW}7}vkboIT4rJIn(tj1_*W^Gb5R6G`yxy1hM%Qy_ zt!erMk?c9Fd=>Lr3P9tZ9A(Jc0*L|-UzcA6Z_4a6E`77J0|O&I%buRR}i zv~!yauE#6&6Ws>Q$Pm@yF5!0EIJ{X-d53rGYHO_ZmW}ZebYwhmV>NudH4ENBhdb8; zGy&f$v`dkDsx9-;vHAi)`9qd>lQ}@nf8-nz@(9p0{gb!3{LHJ8d0HOnE8&q7YMlDW z54axAKP(?vWZ#)p*3Zu*M+_NLND!18$n_=_GtNYgb=jc{(%j^x#>dQF$>$3RI;R2iJU00J!$ZyJSC@JD3r!Y!F zQ93i8+f2)}D!Sh);S(JWWAh1F*~x_!UhR!9BpzR3_$2ceozFb5pd36hnNg1N9!8HA z8KqF)nyiw zsRG^Qf-Zm#ti1F#V?X|-bwTMKQ@xRxVB}xa9;2$1M4Uz${D}62&%^~kbm0K=DV{tA z&bPG?8Q<72lWD-W-evoTNj%nTJ`SJ#t!rZ?0+~wa#9o+5Oa2#-lAUQOb8^C%y6zie z10R7dv{~yN?gu7ME|jyXfAcA24ZkU zC3oD;16DC68%`{MoD7PLiIl7W_WncEQRh&UZ7Oe#lFh0T#Er#$K@t{gl960NyHy?~ zxR}w4r<{hXOrOnv9)(XB9tB6S7ANKYl-)bH+k3bgU-_By>S+8U9K`oih&@A~`4qfH z2)>s4LC4$Ih5$>H<2uj@)5OQ{Jne4MrJ-XFuCFP(TADeB@?>4ns36^sB4YOUpd=ix z`Ti&XDPzc>ZkQ4)Pp}#o3kU|h1EC=3!=afsgB(kit2FA_F&LjnfwkdeEjFB;tWBg=cXIE!oIob`b6g|NWQ+ONVI15a` zMJc!p+UQ;$g%iY*D^;m>Hy{iWD-fW*p?PEx!c{ls@BVS@fyX>>s-VgZ>43pud<+OPCe%u9HT$vxM%pTo_WevJEBAwyD?+Dd7OuR-`p!hqFk_9qJ zEtGa%{!Yv7e~b-&A1L$`Y?3Un2`lm^vPliPu8NEz^PmA8R{00eQ|I0kc!en>B~6-4 zol(jdUV&z(70O^KCdFC8D^K(DpJ9&@MhsHmP=Is96xhjzDW|LvUEVzlPh;xp1U43P@hO5SH2o1k30giVx5SQw**VoeK_UD9wJ z_ylb7CvxrP(JgMWiCt#MG1_d3EU*bmw0&{7BCQD6Q{ zoX`ZS)Y-6UHw)u*f#r6-%J2d{FfZUV(lIHSg~0#xg3AS5!aJBQ^CREngtw} zN<@T#Mx{Ueo&Nc;6_5SfBk$CK3RuPnwy;VoRXE;#KHjxWK5+E|FnOL$A9h9$uZW5Y ztU*6ITKUyKz$f2xU0a2X<2eSpSR9pY7Q69Mi=ACoveczms&+`tTtzdFyo@IRPGM9{eQDQ zx&(DD4L~We1XE9`u#%@Wuw(r!ex!@2ir#oCi}KwOkBo=CP2JKm zSRFIGyl}Yv3J70Sd2?}F&pzlnPIpAK+mZ&nPiE&`kVzOl7NM(*Yegf6i zJ5gD^2Lq_%m`;5_4nhO($E503Nj`~kanAd0(i&+~D$Xtfj_YONx4~QL2xsNlOn`w5 zAYoePGXk?O*X)uBwV7Wc`oZ=GXYf=bYoqOV*nvXz7M+nDm%aJi5MC!~=9}A(56i4zZ(f zmLWx8TcwT(P;#yWECRhnhsxL7a*-m`S-@ zyqUVi?hi9@nq%SF{lRg#9EQsw;Yxr^au6ig(+#qinbx0kIyv0M1`DL$>N%;314~Cv zb{vkPv4li&W?4UhJ9Feb2asc0HoC5MrDaE#sp2P=k9q2D+=T5HcJl?3m02K`94OhQ zSnG6Rk<%Z5u?+0H%-X8{vx^wDC#Vbho-y|Z1m$5~<@)}g$=<;7-mv@HhmqAZ@1 zb9HVmZe~x9*Tr!5)<%NZ8?dHRcrs>Y14p}+jvqcb0nRq1_~Q!W0n`ul+BR&Rn!^dZ z3a40iRa2tOOq)IBmU2J2o!}!UF@nC2@ulQdkqieFePI0fPhJ9HvN;xA1o0Eo?zsC7&>on`x`Vb7cgb31m9 zqvqCQ{btmhc0(x37qt#&;@ethKw7)0a!h@HBRJV~EO7?;Jy0OYLQaWoh0rw_Th%ZN za+7B50pHuuo}+IZk#lDClV2%tW-33m9`ud0G7)QZ-RIB`@|d>8Ksb!Pxfc(wlcZ5N ztFc3xOt$+G@oh)rOs8;q=-!6V&ieV$-;9--@xm`6O-`%;N`DihmcV? zoCV6Xk5M@6JuRm5O;&6JNY9bnrlrPFw>*e~N}u`$1jrkW+sfXG=7elTH981@!yP!g zn$oF!oOCn|bM4u;nCO!S6u9OI2$P2MQ-?!$bxV_(B#bfE9$VFLK%mY;#>*o&0;XfO z6t%ne;KrYFv<(M}vzf=%HA%dZF&3sFhzDBi!VPw#PEwj#Cyyf&qN;2Hc$>!os6T3} zn!<=~N71mM3_6dBhH3_KNyWm`Bz;wXB456UQJF`H*dZ+a;mNt#ZRhk zobljX8MCsWG3q#wfr7d*R6eO9LsD^wi1YB~qXq~&=MZ*$Hoqk8W$O$0 z5=&@+kcV=*cIb1IbX;hRYhtAPOT2PfmeqE6kXcU>PR ztb$+ivW(36&YymrU1sjN&J{Wiay;SC+Kb&Ot#xqDgmB7i!>Yt zJ?%6qNX@4fTf@kQSd=MObe?U`F4q8Zm&Y0!l=Pk1jS=E##**8dZ;v1B zjxrDw)yQ1C;RuY+jmJxg>k-@SAW;FU6<(mEFHJlQUwIgj9xlP|BQrr83I`U-bbx7} z%9xW)`M~wtWdvJ52r%I=`H{1U@CTTb?CK=7Owgo2nj>WTFmBc?VvQ6$u)dLuwujgD z<480Dc1a8K-V&Z6zEvm;Qu6AqmL}}YNCVwe@xrrc2+C5>^in(nhSUH8yI(&w z)66e0jmLqo;<03KzO5Guj9XL-=APJK(AT*k&JQe9v&CRkuC zmNC0>6E+jhGQN_Pg|EeVknFJ#GatA|mA(LGxKdAITEe6pg7#F>s|IB$>7@S7EWb4l zIrkRb47slHQ%mV*EIz%hbl$x0UN==#m?K<5h5|ooAuDogdRg z%X6;L@iS)5vKT?f&|rU0DExW?5^J@cJKP!eS-M zfZ$}%?@HsuWGsFXmc9)70q?3)^Gsg@#z;{TSOL%e9_(g5H*mo<8&Eoi4d6FO(*aEX zfb-I(K$+Dc4ww5$0G>JtV$RvPaK*>pdELg;)8Jj45ukd>VB)~j`9DDG6`dDco+=Er zL_}lIbO&O7&UKbq_Fopr%z=Q=y~LQcR6C=}5Xat@oc^Z+V-@Lnj^nmYJ7E}^AR{_d==ZkYozb6g_N2)Y9?(cJ*>2*4Nwg1F@400YfIn7bA2+{*(I6?EPQ#Rtd}xI}U% z5E>rh$FUrGlpSI%LX;s?{jqbx6i+jbRm?eOV4&yKan+jPwFHQYh0W6;&rwCc4f1S| zpiyZZNYYya1|`241OW1BeYP`!hd~|>Gq??^px{W*ozs|(f(Sd6g*P_E5tJi+U2;uA zMK4VwM|JxP0iNMS85l^7l)l4)H(eIhsAuF zBV-!9*e!zu5u#CmMq2VXMA4xqCam}v_z`?z3IWr83h=}k1%XbiLA=D{T>E9Ma3QK+zj6^M@76MvxpO93F$ zBcj#EX2*yln3}|i2oTWb{5ZH7_|M*lFx-IM;R?`^syr2yzz^pr<%l%H@*3>a;1i{X zjWOEkD?~erG$+_rX!|#14ggfHRDf2lu;J$Wv5KiN_>q1^mvLsn1mp+G1y4JrFp<*= zf-pJKuo=gWw%&OkhS(T{`RaLhe(|xZ9Q*N?uDNVWD>iy~^gehOjK{4Kc0CnAC;M(C zhnUWWPic%qJ@bF(T=Sf&x%HI4k~kgXLRoG>0|fUUe=<R})g25W`f@Wd`JWoCJnYmZyGA z6Bk`@JyF3>T7z{Byh@@v1K*T*$4(4Wd;p^L1(@c=2NVl zuo#|Yi_0ALH@-+*$o!xGKx# z^B|`#f53G$pU4jqMUT_m{y&qZm`{t@p6CJMCb@k#guZ@43 zEt+@2RZ)hY3$qhT-}YbP=kIVK0l{SH;2EWbi^m^d%L7DeDn5y2y*H~*o;@R(=dHAa z?!kWdAG0=LR7mJi`TSf%7@lZS;I?6wh+(T778UQoK1raMRPwVr;7xe_O!frT6)nNk&-2qURiYJrQ;uW7-QIV zgV|bp4{f%)16Rr2%HF8{2Zvem`7`#0e%Upjv+*i&KlmTt{IhSK`lI8|9y)f|F ze{F90QZMGsEEB5_Mi?^T#^3rX|AK{&6?{4Uo z<2T}f`*)FMcFR}fOMStLZLk_&%SA)Li`dlazO_p>ctyvMgu$JQ?|cCwuDrFDqu zACv#y6_v8aVHuF`iX3o{y`B(ntU-Ra46nCC{tu20j>*R`RAsCYn^^XyKvlm2Z?RQR zxc6yn^0aRdRNN)|a|lS9yJTA@LX~)`JKYnJodF!+5es==_Df4cy1{#Rc4+W0a*q~j z@<2!rj8dVb|xg@2DK_>Lkx747LOb{EBm4zIm{gx^vRQLvAd^BQ@^=Na%}cVf8Ii@Oe_H-q+IHE>IS#25LUbnlqWa`KZXS@Xj) z-7kT9ZYg&oLh@8Y#enawvml{OAm1MG1?9F;iKS)#K(8e`bx&HdEp=mL$me%= zc4KJHc1(M0B`=0+(=(hG=KvU#HJ}~_fWHEWqlqX?C@6a}ARB1&6m+q&odiLT0f=$8 zY(=2ovQM^$WY0P4}Q4CbU^%Vc9bvE8E?n2xi9m+$lNi$wbaaUX6u((y~DI zH+cMEuQ4ib>{@q6xC4~kCatkhLn78;r4!QJX2~;FbjIpI+TIUMw@e_?;FI-bVazSv zACOoe8wmt`J-rbcUl8ut^Rqp%aMlwD8)DshB~h!+n!sd)P%q)8$i_g_%b6%!^YB>O zY~dW0TB~Qb-*V@IF)Bx~`gcJc-r1gQh`UKSzvT(~I}$UV&D2@B7bf}Wby?d~tbk=Z4Q zSc1+Tj&|7Qx5DsHEVmqXJD#50HKRSfP1E?vMNdy7j2k9;D2OZu>EC^$BO?bAJtBvn ziKYl?_k@Zj6i&#F{A%@>2aKl|DfO7Ww#OW%$2_zByc?z^qkFrYLl>PV$w>G2OQN*6 z+E`SW4$1!BZaNt`Fx%5Zs5no^Q|IN-L*I~{)@<3@)Go~|4|zmlo{+?wV3>pLa-iFN z{^dH^-{T2*yzR1QbqH4EWn2bqOIkakZ_&&Kr70MdXBxcL0>4{gZh=3z)q{A$J;TC{ zJ=Qs?uz9ezG}wr1u<;rwHuRbtZn8ka=ExUHS+Fb8=_d7%UU3WT!#-*8$svExA2|QA zY)ycIp-`aVGD!GQrr>n^rxqkNp!^5={SqVIOUUoy8SCj4B3`f{3P^q(s7(h{EuKaP z&RO8*lqjme*|fzt!vSp70uCQ6>^=|^ zR2{TQLJzSs-UWlaH4#Ry$&S4M^AtNk1h>h90Qs{8N_u*{MM8!yNyue01b&&GkN{F` zb_5}RZCO6FT9hS?9Y&n5F>3KciL(zr&4D)S_e_WqjWa~Cg0jsQ2pJIdFc3fkMqk`C z-!OB*Xr$HVHp-orc*e+q^>VO*l8k0Hi19vehFAd89fwQN7?lYPEm80cYMo^*Tm`aHdIFy)tf;ix0sBv#!Z8nnE!Eg1EL2fCW9 zFhHyxd8R8m;QmO1`4^So&ly$t%gu&doB=%_b>Hy*X&jqkjC?nILy&O1Z}{sFd0ZZI zdNy=7%Ke57kx+UC6=HM^<0#p#rx^d0fW@`9IJ~6gNzh#zV|Jo3R4|a zg-E__3wfhw-Cmy@_CXU~8f3s>Tp#fuWqK0UG)lmb5V<74U2v zP=_%l=Imq~e4AKLSoVieL#e)Ecm<#@9HNacC3WFl&IZH4YCuJ|-#|59 zkaw!w=8SL+r^5@2;ta^^9IE*y$a6_@vw$~*L8}RPLp0Y>NNmQ3K=T&A<~32`tZB{l zgMeX(cTGpcnc!YunuhDGbDR}XnjMBhJP*Whpd&2@+GSm*Y>%NMmF5<6!@*kq406QC zyrum(aWf%18pwjg$3R2N(9nhqe?@4B1k*WLI3*umMsm0@(EYkJ`{faT2r;0iO;#py zPKbhXq>aoGZv!6&{Xii7gAJkVe7~I??lL*LnZSuRU(7h)DYL6tBBS5~2>A$1%To|T zA8L%7vXI^V=ev8pkcPJ0AqVoKZ_1hmqaD@OfId58@FS%$+z_so=Gjo62LrO*Qc_-3 zHv2=6Z|+C6)MI*^vJe?g6Q5`b<-rJqIS$gHa0QaOk%L(F_d3R8jnt;vqi;B-#3xVr zHIu^PtVUE~<=tJpp}W&pa_+ zSrFqTbPXS6sS85aAQa(tAH?}#bqibJ7`9WMH+MU%gkr6DN}67!Oh=?;wiggAJ#DaF zTn={kbRhS#QW{HbN^Mk0>5*NNOiJwxvMJMhH^}C}C}T?f=r16d_a6vWc;#siw&dU& z5}z$C?mAEE0q~==CVE5duvD7QdovDi8z$WEjsrD>=jaCP5E}5Hgd`1hmnpqaVsq3l2P}EovPn1yrP*TDg*K!fxT1-;Sg}_e zmQYTazMpjsEMtu`g}mPjskUQ0m}RYS=t53~ICo1JWtXgQaEmq8;WI`Vlnlh`8h~bd zP_^7tAmwJzGEx`1qDiSiU%^cTL6IfBlx0o`5(2wqUqe842Ib+DCn0<40R%hT>i5Rx7I4EYk3u=3QEP0l%TZKM1q#2a&4$(e-$>#akBVA29#2283C zNDeA8!Ilk3tbi*~lqq}K5?wLaZ7q55M^_sn|0_VqPc+J{MMAERkUE^O z2s~$heh9GkK?o{aB~a}O!miGt`nr8kwxX7##TSCRld!yEr9Gq4941qSQxDlJSrG7j zvbn`AyS!I6PZn_Xp<}Hn>Pr+7d(?Ft1aBgs znGgYrwJYVOm4Z{`Q=&HR@j~PWJ#dTob$CWsvQ0;ogl~X~6GbMIiX>9Tplgjpm^Bjq z$u$y!!WT*C4YzQKM2**3~hbrAwyMZ*6ZK$ceGKq+i6L>TZ5$n@1G*EId z+EW*t1g0uD`7gb4VDIQSMvOp-f)8b1AoMFh#40D`nPWJyNi+Mq=n)p&NA-V900S%%~8n) z<_Jdz7G__Xu1=Tu(dnEgbz)>Wrdkqnqaw2zD70-K<2l}!5-+)9g)$9;~N>{j1-o%yzJ3< z(%Y>`2Z?zD-QE~nPI<5)SAk6^lY|e=)CiygEJ9r$9$?n{hZvf}$**_BI@7Yf6P+H? zI@*A)k+?h)%|P2C_2Df5Zr-=kI#=RHE~`o~*DfdjSFXXJ42%-y*sej&#aoMibmNHm J?=8Ig{{ubLleYi> literal 0 HcmV?d00001 diff --git a/data/title/openrct2/netgrouppark.sv6 b/data/title/openrct2/netgrouppark.sv6 new file mode 100644 index 0000000000000000000000000000000000000000..4d8554ce80def97e6c547819bb10169245be3749 GIT binary patch literal 1185034 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 `yJO!$lI4i7Csis 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 z zSstQa%axktS_mXkfNK@KM&Mk_dB}8#poUJM5GAbCl+bVWL$`G05yOs0MIF?duGVl zn#P0-Gp1mgN|O@{V7Bn5&&aMx3DoE3mT;@`I82?zhj;+w=0eVobv8OHh75{DD;<2XMrlr2Z4`jVaZNr^X!NxO~ zG(KU%rqgiWTm34~;m%xd)|tXlrl83E<2T!`a;FAuu7KDR0i^uMrraJ;0(O zBW!TG&-&%W^>Z*z3^{TGyEnz8z^hryWW6uG966$UDU|UupY`8ad1A26BZ50oAmA$q z?9S4!nIq|^IA^b&qWPl^(hp{4$I8$Hb<}hevN(Z6NN<5on)__tUoHY7_ViT|YP!0l`l zhiZXn{7K+B%&SFcpSMJ5ovS0^KxP@9Ul`p0tIXSZNb_ebNKKC+T;5uRaHT zvPs9#?}Pd(os%v#KU^L~m(;oxtFzxmxrN>8+~-SO3|JbP4f}G%K)&a@yhRR|?XTFb z&;xqQ=M)1djND|s4?2iY`&n`+HqKi>6w3vpS)<+Z$-r+vIv^UH=9{4XF~9tM;zU1F zVA1w_nr$^y7|G@cZOHquBXbY~-aUJ%k@wjS)`TOxC1jfsSZBAI>`C1VLvk0PJet(> zb=o-*SJGD`+~8|_B82sZkOy@FEusBC6=nVz;mEoH+B*Y2~*kx&T_M*YZ_t_@B&_BD|B&)O5M&Z@}rdnmJ}MldBjU3g!2e<4VvQME zOyZum^cs1vU@mfC0{PdbQueiQry#+Ta^B53+3a=wpF#D!rkvar*H643uD=)UKTLfy zbvIC-6sTjDkbd6cTk!siaH?Gt=-~Ak43Nk^7xp>wbS0-9-h}#GIjCGGR;SsSWB^{_ zYIv1vu}O0NK<+KYZ&BN|1DVgBMfVH+(hG8;uMY8p;-}gw@UL&0wl)}Yh<(#G8myfG zuz7v!2^B7)YU^43Oq>@CCOh2`&XA1fSx=|#K}o(l9S1putWl5s?=bbRM*o)P$RhjQ z$T)oDs=MrGwl4@rNVRD8O!Vo;?28Oy=d{V@r%v6p7@x8cWFHKI_lHw9@>tGV={01? z<6Mia63~nKJ_@=i+lV+2r7@qvv>|4erma$AhBM35LL{rp5-A zXRRuiGM$Mzh@7ai1`lF-T=Ry$UXP&A{HrS(fsyeGUM?frq@$f2ZJJtPL#on6jeO>8 z18X~v@{=y{r;E)jb@G0$YQdB`(fbI%*3l-mKFaa7m5gLIbm;F!K~XQsi{c3Sqj^OS zPNm$e1|b;~_+}CtQpJ=cAja_Dxr!-=r#Jxp#yo`GQDOgMuXhzNFLBSlqTWJlCNxmhIO_DyX9O=O=me+(-`I z+$BI3U4BFUg%2fTT&aD+UQt43^D6Wt32Ml~U=EF>%)U~TlK-OP%V4uJ6;d*=gFbLB z!r2e&5oxzn(80lb?|`!sSnjNzENV_1{l1TiLGht5FHsW7~+gl;}`*K%J~yK; z^p8D34%|uoiQJmx_FV!=&L$w9op(dog)s=N?ATfai1Tw>L!dU%(3jcOHN=tl5Bsgt zorP^Ly0;GmDh`D076z|Z24qXabxpItFPsMa)G#FUbBBZJN061Yu(npS-Lnq&+6Z4_ zg1y3a)O(SS{xaB8Ug#H_sQ0G*katujx5Zn6lz|M>ppr~ekaAE*yDf8j;Q%^|FVe&= zM=E^pf^E5wxp$ELxWR@$9a|RgxM-0%BP~4dbq~SgkUvAL9Va&0zy)fvM5nKI=)oR@ zVOsJ&PvVl-iIW~G#0CV~m2`Pw)M6JKarPl{*LLv4rJRedhvrA}I;w*!R1yl^v~?KR|2)hSX(IQ=&x3M?y}oc z7aN+z(EhyOW`cH<)72@7Ze9T@*b;8~HvVj{Bp1KU`ZVAHLB=aY)6WvY-#R7fv>PW! z+8FW2F-V~r0_bHPb6EHxiA&3L0`1o6l;`v6?x7c5N#`uj<`TDVF4Y6L`6#3oGzbnn z7gCG30R(KEevdOD?df>u411Rx%GVt>-0QI6D#(Ca_DR~xw{-x14jP_G)sg)&0#2N4 ziQo%31s*y>$QJ>1l*1Kai5Fc#kAq(2#Yu@KJdO{yvQFm{0TyU{mr>?!#AL`cIamOW z_Uu~&0t;P0w##03I?)DPj3oQs7b_?U{)XMOX0KoaEbx^Kg!vJ0G3CP9pOjHOK+cG$ zZC6cEU}8gkJdm!`x^j{HE>XTDF>@0(kXe}bHfBrq*TM;}#%Mrbf-ZGj=b>0VyRc;4 z8LmNc`Re5?DG915z1#4DqFJAU+swOHl`BQZ#Et;yh=i$)Z{%(%nc?VLK^0cK>48O- zu(T@^a41Uj8&|!0p>mNO16pX8bDhslWz5jVA=m22l9LZlItrC6h%FF_z8UJ;!DUz9 zItg4(^g%`H{#)V)z0+`=>(!PKtX^0UX{X=~OH6%`<+3fB>M8tHYl>oo<1HXdP0(Qn zhw6hwQU#V9wOGEA>YbufJ3Uj-h$n*9HYCA_Ls%UoUtC}F=lQZw^lU6uBgw_}v_JQ~ zq9b+sC-R}!@6RxSfcFwlq@dfCftY+`ORUs6hf>%X)9!MAwm(+Fo~8>iz~tx2Q3%Qw zn7|fLh7qcP1Y#_-Jm;$yD{3I&q(H>6#U^qvOustia|6Ih9AtuI$Y%da#r|W}F!~1^ zxAP^B+Af}^8L(k!?(=lnWmM~V0py5&?n4-9G*l>A0W{fU4m(B$M>Wg63P=b=cIRla z0zJ;>W1twZEF=`f!>8R1Ke`=$d>7`!X8o8r$dq+*{M-{dfGr-=V(+%S99R~JO|sd@ zzcHj`G+@0M<*xXq>!`P|2XGF@=dC}4laa5OW>C%yQ60gU-u0_q!0M284Hwy3T*?_f z`I+5xn^V)O&c^haBS2uc^mX9-NrbG%pn{Ck0#+LFO}!6 zu}2E5#}?t}6O3%p4Ro7c|6Ig3G7Y|Ay&rZ(cQC0*IJV)3Du<5j-+>>HKk#FNqPvj7 z4ni~}R!wtO@hCebLJaMc&sOm{G+skxJ=|eOH9E_*J&DpEaV~ub6b)Nbv5X}D4rY)S zPf7G2OOzUnV-q|IfJeLSDx8Wq$7!bSB7^qk*%?`at&iAeu2^va@69hsrgc{L);JPS zIWhK2BS@>S&;l^#t;`o)E}=!hXT$=r`HAMdky*|QLR($Du@1EGur)?sI4*ne$^iIs zbtDNz;adj>(4g`|*S)C>x%j-}Cs?LS-RQcRmTTUO?Ig=q5U^Yxs>d&qzfnyOB`EUu zXq-l3iL9vtBb478g}kFFe8ycSZUFGG83lzv0N+Wrnk#~bEc4Fo}q5d*M<5kC_~^q=e0D>-Cm zBamQf1p?uH8N3p{U<)Da-{XKsaxBL$lDoD|EpTx5RKvDimZnJUl|EuZkbGg5YekxS zFpwvnsso$>EUpe8C>4Z?$S*UBK0DK7;Y&a%JrpSopK<2w+&l;AI)jELIP0yb%nG6f zZ2flTdB-?hx016ngKkV#kf_ULKo1TTZQ!*^h7I~|zzTgB#g~rSVsWvd?uHF1Jo372 zZ}1&#_Yx*aUM3n7K>t%W8K0~gc?dM5h)LMH3G;6zKhsJmmLx}zj0fZj7^y)27yEVp z8lAk#h(A!XPttX_!p|HbZMrKHui2j3l>|NUu(&`1btLWnYD(#W9k7X+GB&IG&0?uOu-o}c8ax55fY93$K=ch} z^Juy2x}Ad}`_7D_|7bZ!$9hhPuQo|Jw_}c?m$}xUsA;O|k6M{y3=vdAFBF0(c8G@U z>pR#>P{g9zniVV!WH~Gv+gfp9zXUv?_SRD7dNqHGJ#pM+#9~L1INeQSQWEs1J)8IP znm*#*oG3b914#b&1&R)K@r zAF?7!|G)1%PjjD5;j(z zou9%-7l^7L$=>yF0*9>Qvij0U4cwdET~p?O5H?2<0OP&bL<5ax-Bb3Uxjk7duaA^0 z#C^~bwH&`qoO)l{($T>b&`YlH?j~Af6si;&3TH?76=<|j@*!8A02|gYe`~)2G%U<> zMl1-l0-(IIm<&jHCqlBZ5hkFiaFDQb#@>!36=Wl<6tGELWW1;sg_)6@ODsOqc3^aAjjZ=4t8sA&0LR@RI^x?o3B9C?bsDog6?nFAzmv! z#r7%1-qB#TL_dsy27}l!c6@vgQUC`53x+uU(^(?hgD%Nr6@W!@qYO6$!(w|P^U^-r z@~f#NGNh{KP{8E|1uRlj{h337DnLZw5rRd+6~5U8r`e5w%Hlq|h;c0?%|Ri`#I~7W z;80=Ed3ixXlDFMsKW1$N3Ka(mwGs3n+;A_hBac+r^^wflzQ-*cq;kO77{$Q@Y^ky! zN24$H^8@ht*Dn%D#WiR{$C`!~+XM{GqlZZG>8&t*5|7J+saz7_MZ7a6S8VZFrZ-kC zp%vxdS)>qi^t7vJajUz)n(pc`8D)kB8rftx&*1^AGmqKAJ@nYed9odLld&{ZFgqr2 zr!l!|o_6n&v%U{o_vMOTc$b&RZk^Gjyq?uLnSbv*R0W4zNMjkv7Jgk>$bGah;zE;; zvZ}BW&*DLm-GG08+Z8fqLY(X>kAv&(9dm4ZnHNhfBx;XpCmZWwtPlG)?b+u8%s?XW zJ^5NV95U@T71&wOI2We*yHg*MsL?1op5QCm3HCI$!7P_#m0=ausXkEkp|Rb<#I2sT>AJStScR4Du|Ffc zWHWFfbR<}mGqUp-S+|!?QkUS(kqV~DAUh+u{bhcMM489|!(A#cvc6EX0Y12F4^lD@7_u7%aNPp|F8P9!>T_s&DS*C=MRkJzco!G^ z>(O&e)9t#vX;V6daW4}W`e+9YOT~!R;&2v&fvaiNTXuRm`6U^~4HvrFH-3Umzqp9G z%q~FfUZs;N^v5t1=i#y}ixOTqxYc=?MI5>m905!zY%oHxeB618*`!`_d(Bgw_H zqSL@c$oqB<@NwVS*vUaFA$?agc8^YWNojDNnqbMnu`DvPff~dOxtoqCN6F1Cw-*HV1+@-hBy*0 zBM@o5h?55bIK1+c-9CMyYFi~#m}SY1%Hn{k0ZZ3;+}U>|e-9g(_!X{A5I#O2nc@#_ z+9UM+9PRWw7v0Ad^SjT($@ide*&qzj-5}=X3n3)MzA#gueZziQZA}4Ht>^~q&7{pM zZLy!O?>%b&?F%Uucw=iWyGUY_WUm(4CGQ!)x{#u`6hbn0kyqvaq~VP3V)kEnFSGxp z9R0n_epZgyMtbhB`p6&t&6e3uGEq|1FpXpWx=R5*O+YVA!MQX@-DUSz$#Stn*gIcY z_j8JBcEH1S=O^+DSNIZ;9f!}Ty4(^=$F9Wkh)TQ-{!_``PETECJ9IE^QXGxM=u*-n z?vKZ2b>Lt3Y;2MBeItg=10k!#zD3>pt^ns6@!t>-*+`z%8p%;dpwJE)2}FP&CIlAT zfWYdQ^#SQ4dDtwLO;QR+y8|%Ti3e;pWA1jTsxtO?h+E?y9h0vp*4Rw%|NK@c$moV% z1PZ3oI)s&wL|{Nt6#HFUow8xX<8r5Rd-Nb)#T_tJz|ODpw0l(ttFeqksp|-a*fg~q zh57)msuL2Ly7uEdiQZnggsUtCZ#;7%H{(OH8o{PuB%7Lt9`&@>)p2UA2 z!Drg^GNy`G#loF^Tv)GZDhg@%WhLFP>IrY%vt0+HPd1F&VNaTI$+gUkx}`YUHTXPB z;0)GHP`e%!tY?tVNd(2r4v;4M{ee_QR@>W(uwh>{Qy3eRnM&c=_yoit`iN5>`}1c1 zHAA$C9m_Zmy5iefRM`2=MAdUGiCfm1ws>1Yl&C{Tc3 z{Yr7`EQ!PRTP~$eS_qfDQroiK$=h7Emmcnf|ItKdzs7b)+3jpcLYbX7GNT6xpVoAd zuCT%zukqrdZ21R{#UnfKZus}xWAXjG*Sm$`^6)=PisD8V-i6XvcZr411AHn?QK)*u zIn3#N25LETJ?R*(vvvj^v*{}oXn98ALs7Y3DqBu)q~Sx(z7ybbrGQIe&r2jZtX3n`Qqj`OGbry~_Q`upQ0NuExs;J}tE}?lks_0Vm|bMWI8P zao`aGoNv$&p7?L>V!dakaN!O6#eKi8{o=pX#VHes;h+%-$&T^lm@zsDS)j`k^)M6; zMvUC?xp`-?e63)=?_xh$Kb}j*Z?U!JHLPQCQ2E2(m(#<<2^MD~CDB2ejls$DV_7)# zqW!Bss@bbb$4^5s^4MS&#GqjlgcK#l7M1_L#pO>#F2A?%&HtODU7YO;&6`etC5U`} zLO!4Ps$u`%0+1RmzmN?v!^q+Pz+%qhL+_o(=SB)!9v?uMU$w8uVSbBDW7FrqA)i0! z9DV~F&vAW4p$nL45zIjN6IIY1 zemUV402%2}_AZSODms6Do&vkT3hxF>naeGpUVjge`9E)k1ead>N;GU2=}gq6HRVv@ zk~q0SW8b-T>?bC-o~v6cK?N#6RinnKkqXz{9o@%Zn4r=uURy`Vi$&a`y!I-^OI8Fs z&(R70&xg{XB?GmScA+$2f3&JK@CY$TVBenib4oOS(Z4E9Zh^1FqBi?oKm}SbQr#!q zw}))tgylFiIEi4EF&Z z_FGZlJX{N*T!VNm7dTU?DyNCf$%~&R+MlvhP@Gz$zWvEerw8RDh1H0af8b)}7hJ6T zQ_l?rIHzd&$JLpF{eWm0AfK|=c#?S+D;GJ{ZIDVpz*+@U)<>`6kUc$eYuMa!_po{L zPFuPV*^->L9Pl(@B>PMz5?N8NSHP2@_-Op?rVEzNv5^k{pb_?7h1iY6*R}|IKa{v7 zzjoIk`>!|cgZ*o-D|;x8&6 zcr!)@=~hc&3yA=i`vb!7LCmBxz$5Uhcs}d|<`dRI9rvf}DoC*7YE^e8Jia*IjjaZ1{FHqjh z@IKu*TH7^I|D?5<;KjFWW|EXcmO&C{FZ-`JxrbfIkm2Pt>Uinv+OPKc zrqhs>lEoaF4hBX8EQF9}OepbrHHj#8K+U4y|3~<%fwgP~Kcv23xX3#pk;{OW#C`I9a9C1G8lIK=J$m~?A0ZLi5%)CaWe;zeRs;zhEYv|b>bnjWomdKsAt&|QkBMllV! zI4L8cclkJH24w6Lp(QFXF1j>4`dCTWc=q3V_WLE`K*vI!yM}|ehuDnjbMwuYv2@f} zqvy@S-w>M>v_BQg&gTr%P!WR>{n9$aP}uGkTx0>*@tE1S>XE<7pH?*4OZE*bF2&y! zAL;Nfdg+PWm@Foc#>rJrZJ$4I^c><+>ZXKNfKk%xZ;`x|26BoYWMTJ^N0sMzfL?H{ zySl;^R2XGyPNMd9OK9hLQ5<8BfozsVKi#m9v_iQLP!s*YR-x&vScThfG7AWmNY|_< z89rePRf^FiG9Ix}3`D0DJ`ltJVnk8458{spiB53c^dYp~zlX6re7ijSwlwYSVcg{V zgmK!qntM*f$n5`y*&uV zF{{X+IGi@aDvnvl+-O5v**GNDm0bQZc_?mut(?6l+t7puY>0F(;Ta3=Y8lRq?m^}q z!|}XXE}^Z9&9tFZJA^x~nZpvReB&EqLg7~z?T6)>8l66;a4O8tTg$R2A9|~p z3uo4>B;1+DZ1yrkW+%Hka4Fb^=c0VhtuF&5&s&lDrDxBH`8{<4F7MJhEUw}{S=d-c zoU8?^3F5aea;aL#YT~Z)k%-~1Bw~;_q3;S?w7TaRA{33A-X?#(2w`oApX)fw z)3j}^Uh9X}hFHeSq;TY>@u2;UFpM7ul(#fVlp37|n(6rf%BBu_Jc}ynQPqGqWl8YX zcbC-WVQo|ak*-8GeY>#nR!_&c-(jUErH9oqhxj@+fQ8DUQ)IB+%oS(auKJX5=$zM2@YJ zP!#w%Vy*Y?2D#1LqmQpiLJ?~5ZRA()o}PVzC)zZ1B|24hIbR{sN!1~n_Usc%(X+$z zV>wVt6|B#5J{80U%+(xFCp~sjy(&?PBF6h29ro;X`e@=+UCc$AE>YtI2!E5@iN)Nt zNO~jL7f-it+U!-ytZ4|V;jT624J^&_NOZIB^c@xv(Its6wvKj(%zUh zs@pWc(2fw(bvTJq%9lnN;3SL7gLSL~Du^V5a@~e1k;~s_-(vxp7ealI!H@$eSZinr zEu4sjy#13Ojgbyn#_Kq%?}zVeqFZF@-Vj2;VJqbdrwIFAB*`lI~j&1 zb?-_I@9GETSr+dfRv<+Mp6%Iy$uSg7Y~Q)`3E{(K2;Dz~0v$&ba)6X(W@g167+$e# zfz!fA)5T-Ea@S}A|hI%1>*zU6h+8c`so zYmv&?@sQh8&e_=#Zwx5#L`7UTMC+;-mP9mOV4`)1)VaQ{5=wsYvbO|~G^Ebs4iTE; zf!=Kho%gC4!ZF|X$Adm}c-T%SzxnH%KK?wRLNm8QK1Bej@dL>1eRb)870N0k0kuGd zf-25He-Zgl0AfV&ps^GWu)8a4`g=;D`rCW5R%)hl_sE0vsrsM*F~uu%*wE>%oy9Q8 z{J-pYHLfI5E`pI{zx(obr0?>A7g5+fwria)I#^loF0akO1bGc;NbaRFKrer6t;N0z zQ^8xzm$>TBnQmy#;JDLRA?N283z)GKm+}8Nh5@ORrOn+8`_eU@q2X z;logkn>N^OYa#O{JexoYPUH(4$fBqWB?iwSgH$tn7Gc4T#n%g-nVb7#|dd>%`2B8(XYUPZ6ii^h? z$pQa^QUux>JO<4vf-08(|DVze8%OIE+4yARurKy~r1FBg{VhaZK)WuP@_13%6j&UE z99=eABAbYl0+QEU2(K_!lld_$){rvQQ}m6;mRevs_~ku}BiWa`3Ook9e0AMIv3cEH z(`@K}6WY#+NQmuFR9DE8M*~VPa10`}VqeC>ir$rmh~ahYk9}Kx%byZ2jr_nLX+Hs_ z*0H)^$*<+?cr7EbO<1TW?Hlu4GuNig)DOl!a3b(3k4klSKf+ZxW;iyFGtAX*PCG_65{oDI9ATQV%NDY?u8WEu2oOlCnJ+mwK3I>+=D96gm&2rrFM%z3>ux zY~_#d4@gi937|)UX}rlfp)9P0C|zM0pa$LZO5`p*lm;%TA+;R1;c9rJ0DM0h| z2rg?jP|GnQj)1Q$kKaewLN{ zCqmy+4P+YAbi0fQ;*pHK%Z_ddYW&#ammtW=A>^nV5Z*&z#~P_TU1pXj0>_orRbsjV zccDvosPrAqN=oX1H!Tq;39RWCRM-%U!CG>oZ-vx+rujz@~Iiv@#lSA%n`P|fY^u9R3^SjfiM4x0zt{Dl{ zkVjd-G1FrIKcm6JmK7C_V##fRF4bvIjqr2$q_W%(;n@sgA8X}m@&sMJ3jmY1;NY}C z&}Ovt5EQ^BX1GHzCgV-KlhVphc3(@Aq`~zqX#6#?ycR5#aaDcIHRh*cZ-pZaFyfWz zYmQnD59wL?T>ykM+Y@#?0d5ytc?ID7=8Lrbp_Nn+*pc_H1w!ZlF_#`I@$QfvadKOx z&0516HA6Q+k^mqU$yK*72@Wk(p8>e2xzi1u7Ty>Izpl9-%U?EP`d5 z8U$@LFkn{(ZXQx?%Vq|e0-H(iHq?S!vM{~&>*9|p5X^2B2-G-EAMqQS3deLE%6mEwpE*>GR*db$7VGWHkH@lKkF`#?F+OzhB&~oGOmlcpH zXHU=R3O)9(dEtGl$xeVn+4Auwn2A$50{B94&YliAJ1fI^-^l>s`bw@EQh2it(vR}V zT0w_pPKF&Q#gxop^$Iw_mv%ip+izcB z4q7Lj`+K4k?krzt@)+Ni^!w==IM-EM*NHb1k}%vHO`O%2-oG(Tg#=U|lm?spGx&kQinxZrv|~>HfUE4dvB=;N4*5 zYTde)ys%^C+_LU0g=24M@E^_7+0AT&%X=fZRCKOHR@)X{9^&2V=fF$w!0xLo z!F%go`3!3ZO4IR^rxEa@__B>x1mIE>v|MB{c5x#v{cK%0yH+j%u?#9A!fs+KyxdK#jf^T(` ztsWBUAyRimhDMA~>gW92NUXRVs&PSa1YtZsulwj;3o@2d-a^*0()4Y%f7Eln4e>Iu zTi^iyE!)>3nMW@Q&3Oc#MZ&i+?&o_I6bx-b42`$xBvc^~%P`%5Pv#gNz}uc>XS$Gu zH?dO@O)_;#aCZD%R`qT7)tP}BL4!icebx^3kbkuFl@;q9_1-Dzv1dz4f))E+3dO(y zysd^YtnzM{<~|8e4K>hR=|C>o#O0y%1Z$fUIcKXAGhwMY0z>P#!Ogn6@KRul1=fP^`6kD*)u4q8`+7g^4v#ks*-j1O(@Z_DVLbM6T#i^jAn)p2q&x6 zNZY3+0_O6v&U?5@GD?F&j3PW|Uz`tYf1nr`zPTOK8+`NjZYUfiQQobSU2eg2RxOIr zmCK8C5*+jHl6lCGw*Z|4*xe9)iNR@OODaxxY-GuDrtOH&$$rY@X{sw&Jx9xsMsYD()(^oC^F$r120@8zml z`ej(M^Mz`qz+$pY2(sBazo(Psb{4GtiHgT38_O0|52TM%`#+T@XsRVS)$sj*_dg^j z1-y+^e>`2Ea)G|cbOUSs+7$@#>HLz<+tSd7ZX*e?KX;B|LKz3NC$w}GvJJ|gvtvry zv;^x@O3A~y$Yiicr0QGxv*}oIg3R7OCRCnr3atr`DFUcUGdJxtnFBAY%)xIvMI~UE zyU4B!>~pUuN$_YTEiZKs^o=gQl2WotA+z;NU>aN z(Ie#vtdW7TT^R9!h$>rGP4;r1U4rQ@{2SSOAsFM9zwGXeC_Bq-#?g(F8xaEUVpW5> zL)@iO-P$Th5v5ws`&gq=8GEKkA9}-lniaS&zXZ|TImI4U-w^0yWx&Mthyoa6k$7RB9ATi)rUB%tFNicFoYdDt`1<3&gx8oxc5)b0O z9UmvTNYY7#DW zm=9!1L}VY?AS*zzl6fbae3sH7z{j>~e}a`fjvs^B`lBaFOT7nORY61PM%Ct<8B7Q) zRdGNLcLT;rQ%VM3r(cP%#$0aSxix<3Gc0vPRISAo7;mjlSkHpk;}X1)A2^V=%;CO> zE^ANSl7I|06Oc`CBR+Y5vikXL(B_Q!gMyozQq=h!+7&3GS^Gp3Y|}rmfRET=9!CiM z%7}{NJ#bFy`(0rXj8>6Z>~r^oeNU0b)5%a!Ru+^gCO)rDkm(9xc9}YfF59EEn}z;2 z77e$7czi39`TltJv*hSj?b78g(KP#9d3*A5%8o%ETi_*$VaG`E1cBDfQagGIWK;d2029W2cANKneS_A~TFNP}wLp#J`Sw z&Ttya?bg6Ss-8iFWkI=9VCJSKSPU?O@!C`DyIh^3JI4BYe@T5%fkr}I(1ZtI?FLic z&zc<{>CD;QRG6Cz>>3@WSPUJg(OJp=T>UIPn%AK7ssF@J@ecaP&{7R>=+#LNB=azB zNTyzdLV4uF?}lDNr(_g(?f}AiE-9Wxoz?)b{Ktgs$N@YoXKz$`so#g`5%- zcygaS=UWM2bJhdffN*AN`2!A<(9K1kLvbJnlf1&4vEyGBLu;@)Pe9xsM)+l5c|H)Y zx+VNBuappzSc@F`LOBC!`DOdVMYY@L^tKe&e3l+uxL#(}Q#x#D#vX`pYxW#E*F=$Z zL^wy9MbfMEn&(0pZ&`T=0IX=Kz|)O!P|t0B=cEp{=Lj_$$!W+$6+kESlt_7#lbu?u zG;!(;0~@W&8D*&$(CpaZQR6TqvQ)fV)ZJQ;YokQpRODlE)UquWTaxZlwC@v~P5 zs_dUE5<;x3$LFq%p7ZGwh+A9D%~B;)X19|(<6=xf)Nyki<5XM1@o=Gb zxishGO3#Tzrcn<`3xk`i@hg$!b@h5UJ7$kna@S$viDkYGC2u5&T-39vL)!jmYqfq| z`Ar;qigv*O7TH-h2vIJ1?is#$F@!TL(c zPJ_JJ2C4Ld74J4qISHvOeE?FanZ5&RWrHe;t{r~P-> zS-W^k&$xs9K!0jQHIRs;1EXQ^#9-LvWfdfp?fdamCM_P$3?6QaGvNm1Xk`$KYS#OGv* z8&(;3fF-A<*u#OHeklX0*Q{0K>va!2=fQ#-Wwwbi9#Pf(89PD?G^_5fQz95+^A~w> z_JUsQQn+-sxWq}lcv{66o`zICXSF3A$PrHP%%@oxxG!wgCywOo*}8R3DfPX)G8V_^ zQnqin-+JO&bQ)(i*{d(B6ZoqbdROoVw|l`}Sk$*!cd0h?^RG>if=E_MVfI|@${8Tu zPjWJB(j9`>9%H;~t(Dh21Fxzw(+vkiJATZiOEqPAa`ga)Z$)+r%%KS0fCl}YbP$@__3E^#*w$}Uv|$1Xl+Otvn} z6;d})0fYAW%S{0Poe070^>rboi?LTksu)A=zBC7tHYli&?uwO`iPIyOAynL7Ug5Qp zK~)QdcI^WElYl4JKyu&ydv0WWOlbad_&+I~Oe3ZG@frJHn{aO3aL{H(wd&|6e#Kr> z$ab7DB7ZCVeuibJk#)a?USbP(=wI&Om)q&(I$N4^gj`X3vg(pN6Ko+aQ(CLt(Vl#l z(0Mz*^n!JVayiBV3XY@TnL^hcI7h7o`Pi-D^JiqaK;7pTn^4CEfVx>$NphP8uF*lo zFg)?`2-_OnQ{v<0>}V0OCMj8iMOfRQH)4Y7U@#l|B8Z z{CPZC{hMTrOvTNlSKUbdR*a5jf@C42C$e@l884L;>@wkwpWTd=ha}IRU@TOQ_;)rp z%ei*N!CCwyfDnv@g%S{kjsKLHcPVjAfs3#YNAWC0a~ue<+&Yg-5|c=XUIEKsJ?job zQua|f_)|8L6ZQ0G;x2B_?wXl7IniO9<(=d_R*0c z`hcID6Chm(_(Esy%t!`28X|=t%|Xa9xOuV3d#A0hGHAz_N<8b5YBfy|D!w)l#mWjG zMW3m*R~n!*C8X&GX*Ol!f}d4yB_vv2hS;P4oTj_v33qQ?aVP_BA;7&lc9!(vRn_v_ zTk+jG7Ake_D(ZBQ9)jRCQd`!=%!Xn0X1Y?#9{Xx-R3%d!1E}7xH03?a?PZ?VtWFcDUj|<5HbO4;i!oWv%UGHz$#<#3$h47iB3?rN)W_ zq%ZVB;iLuF7CzPf0a1s)>e+94Onlg~e1hqqY5LYy(xEu7$u-zFix~4>@VK*U2<&J zesNoi(e|RQLYeM$v@uth>-E0iVeOsUu3@`5n{sJhjY>gO-<|Zr_vll?*^b=>OhlQQ zc{p}~rXGtm-iYe6ZaUvb|H z4E@d*c>R_VB76$zwA7+a5(lr&!L1^AsSg zD_J2Ayp-DM-EseS>Uxe^rYitXbpOSb20EG_wX zjo=m)d3`Np3$xG_kB$C^(b8IKA!n~;b5vr}iMQ?N9vK@iv+B6QGu{T7+!3UVZshzl z_xxtL6vK5K1-<6Sb`SReuCBP5tQ%%08`8iy2`>eYc{>PfxUqq1Uf5uZ$tawlSGeJ*J9F<{?DCie190<$loO**sv#283y3WVDU=M9y?)2huB^F$sgsW zEIS?8J#4+1w400=2z|&;D+$%drat96(uOgX4`J<|gB=KjzeLz}Sjj#f#&QqQRJ&1^ zHEHuo8W-nfiJ+wkAOIO$NTU?~iGa&?WhH&=zD7`@9On1ZHc%v71&I%VTQsg`xblz8 zui;;66M|}3^JCOd?VIQ9@pFv)OUkrbQC1^)60C3=AM@ywO0Ye2mk*tz>3y0XtxhHr z>7@EFXb#&MaON6O6b0O2`(~DO4!wx2)ueSOOtshe=k9s^>!2MT4E370-9!MdCW(2e zQX`3JNf6g!{qHEx0rw*A-AD!I=W9WF&VDmT2f^$Jw|!%%F#O6$aPiS04s)^BVYA_& zeFqU2tP&t9GxZ?WDgauhwm$C{N6Y5F^d2ND0-LDbbtug$h+<81G6ESE_ArSWqyS!l z+%izZ1OyPN#i_r-SvNB9JwSzRa@TU*~vz=&OSnKgI`RbRjv0^)Oou-0lrl*ulI+ z$E{F7hb*yn_?HTx{DmzPIesUKoJxV@*@nZ4AcZ?wWSF2{Vjo-hVxgq8zJ$hvUhE^K z_0{VPvh`-l;xNyRM}m+RpS*km`|MJ{pR*@Lgi?N%hFL?j(Tx-CwBzuo=Wf^=A;0{T zcNyxFCQkJ#;!I_Gl3ozc5gycs>pWVG19+wQ*kzL~WxinddYabaF3vCqU7XzTvYoFH zBKn|H-LJED{1@=$eyOb!99pSeF1#zG!HM}?x9G0xgb})IY(^-9X)R6?c@V3NEvr`mmXOu69*E}x+rVNzvPezbm>7B{6P z8GRGWX2wd}&@x3*_DgsJBt0QXJCO8A7f5IAehQpiIc4n-v>-Lek;|Yo`>5Bxl$S%W zC)MjU8{#8gJjc1p%)tXatKeuGiMl;~pWqco@cGEC@M%v9Kkeu>7>LmI80;x00JTGl zdsR4fvdk(DRl?7bjrH542Cz)*L-!`)sy`J%4h5 z^L9xDv*)GniCRZlsb8s1^V-kZ%jfI|IBal|qYs>ke8plDt03hG1?`MM8+2gHlVW@J zF+rout%pTqsPb@8s)T-?T2YAW92g`vpm~M~S?BDVPSv;x!fg!@&V|D>;Q2YqF>!lC z7|a^?WEvnG*vq-warkrthdJm#gAe=|jo_Yr?wqxrvmaJl?e$iBiP1(Bgr$<~H9uh= zAxB<89S{@XUPE~TxhtP+pzZxW(BerlH1FnJHqo}-x{wF}wwz4sPE%KnLVT|!f?!6o z+TjwlTu?}E&vCY3i?gvS?+UNK1YI4|TiB|mz5tg<++}EP;`%FUED9prBw^t-#Ky|0 zu!Hv74yH~X!8y1E>?k(@au^rMe)^&?bL2TiN4kb{buTy(Vck|W{*=u=HqIrU#-EBP zDJGQyQ1W8BiyV?((96G~#<^LvsSCo-i*nc0j2_`H%iKo~+k^yHgrMi81H{t{r}+V$ zT5~_7J1H9W@!0Ks9#QIkAF4Wc7+XZc2ucA?i?a8w)nl?}KIBqjRLX;vl)*}q!BWT< zOl=F!$bPFT^id4jPD$^@`wX=++Ey%;Jv%Z8*XyTTd|rF-F^aEtSels@2OR>LIYF*a zrekqc{a)>Gv$jbOJdYLZ^#ZTsvCv(c3`m)l)GnwAfdD~p(_>u7!o($^M)_9b-XU{WO!zx;)SG~|5)In0Lp%+y^j@-0g>26U8v$wPypG~fy z8lX`dlu=F0k+i*y4wY@IxohHWhcOvG+V~O2|CZey9xbsABp1sx8eh;pyjFwUQpqSOYW^wVV;Qiifl&qiY-oQubS zV?DW|uAyWv>rq`+0D9r-+^jsgC4V?BDWTJA~8>xR&N_%Y5z)eV^ z0Z5Rv#+^X!F0gy)bP%;us3%a;{1TV;+s|K~k1(kvr(+hmSEp{{fvmhoj{_M1_{#4W z91>;S;0H&A2+iOyaDKWL*^}tp2gf9Ge|x{fy`P#Q)jb+H`!7Y;=D}+ox?>jt3VVgi zk5S@`m9$@#tg>&9d24YgkXX$_*dZ4rQuoir?Q?~M zeLE{&p^K*k4j08__*NR&p^ikQ;FPm=)TP9h-x>49I26OPz4Jup1Bqb39&!MMi@j7P znUfhNWtcCHi4RP2(cCw$Q7S{7M-cB8iZ$-Q&r0KS3YCFnxSe(8_pM$Ns+Kp?kx;hf z46!|?qla16K0!Ik*Bx%JudUQ9Q{%hydQ-dz4qkZ}&{lBv81Kz?zf82IAxuAFC)$OO z1X_N|)iZXMt*c@&2T+g1V6^w!S#AylwWC^k+Z6(7sgR4-h_W4Up3K{^JOnX?>flxF zXBgOUl9T7tB|^;3Afw)65cFiP&&e~Sr~Ru5wmi@m<6d6%1O@)sICM2(|BLF2HP4+; z^Zdy?x#+&(6lI_j6U3s*=Z5xa1`JqvvU5u9M3{H;!^8xqv%G&yj9vE?5}3j2)EV^# zJCvE>NU)`t%0ipCshYA<15?uN07Nr&fXbd+^6F_09gJyN;<=>cmYsN>*T`}1x0Y6W zvUSksfQSt=%w7gJYn^9w3|jjEzcxO*a&ly-FoaJWIpPu5E)4otEX&?~?WIKz3Up=} z-*Y`G8g7ecdDC}gSkfKsZlK-dCfbR*G|(=jlBNNRbej-ty+NTG$3PpcqgrGbQsNyH z&vI&=m_;38UBN9awEE2ZmI<0QM%QZc%ZiMgIf`-JTd)ULgnGEF*LfHBM+v|4yjn6? z3GT2ttBf%XS;&Ut`Y90;2NI@A?4K8)6Qn?uDMYI0t79?MuwVGd3$B5g0ypwitj zPYjRn+0n4%ty!>W2yq#<7NIoLHVT49ce@Azo44!olL_4qNDBSBGk$eI7s={53->Pc zizM`|P?x?d`|5KD!p__Vb;n)!=JHJqcmM<(ge}VIz4c3Zm zsRFn$&BV2`;;tWfLcAu_kcT9B8Jig9u+Yg|^Mugo024>sF5otL!JuS1H8sbmn@Vv; z?8oI6qL2%jkHFwC1u zFtB#bzN(zlkxSegUU9$M$L+zkt1Wo8do7Z<#p6l?CwF-W6e*zc6Nv8KylEfB3pVFF zy2}y^TYGKJjx5Y`-C1iLpuWc;Cib8LDvdy()AVZs8zRz%K!PDe;A53wsiIQx*C8&< z6hfKkh6=G?f)$p(dt@*im>p!Nk{GCNpDu)gj}4%fwSzHOw;kY<3>>=0?#twPhRskk ztFE&PEE&E+q>tSp?waS9&+`NO$!y~v1%rQ;eBurmd`DTPO<4sisM0{kY9o#37hDdH zWsjiHX(@`$NEDs!ZIS5VJFxJTU_e9CQ=Y@Kh$<0u25Yi)P9Y<(y-@+uhzB9V1US!3 zlPG@}00?X9aAZ?H8hZ!Zvq=h_(tb{($*LlS##j4*QVzWr4o7G()GIW8X0&p+2sCr|t(TRcB$Zdhp|;v8+7a z0p3Hr0z2{>a3@#NHl)L*<92*1W8FmRf;(mhZK0hLG~XA2YFD6HL++-E8Src33_id< zKB(yo+!y6s;6Dc%DOKF*jW6(&f-EBVsPAu4!qov@CYd<1M@gvG^xfAMfS_5vpPQpm z8XYKKl)t6b1lh5^1JL1eDMUrzDBSXeG`}@F7X8)$Kh;0x`b`K}`gq!VER$XXBxCFV zAd-kbypA6DHh?^?jN&FhDk`@7u1yb=$MX&*@3A97#I<;)_4;&1;&$=hdm}%OQ22A& zFcCHijF|?ot055s7H&Cr`vb8+Ig-P-MZmQ?lxE<>%_O4(6D*YrJ$pn8G^2ACr|OVI z7JaSz6dW;OxfT%8!cSz?eqqU_0@;SR=%Q_}xmoc!jPfU<+$_VFQhTPYbyf zVm@BE!W-*IA-2FPaH0}HAUtZ(+ULFbDU}zI7!GKNG&?v#07;%$XKWW4IK3o}dQIAk z)3SGx+ms`Cx&u=pCSK`s-UCozRam$#qYoWhEwcG|d2Cj1j>RI@eY7&SKp^Jei0D&y zaYlGFKj_-20%fkfp{Y4cAk-r$5vFfeG4gvX_e^yEl=))LfKn>+GS^`$26Ytj`Lntw;q#*jM*5Y`t1CaD0Br*q}f_*5pM61Y38Y;YWk$C#UZXuAk;XIv(X zh4Z*}r?qmf;%^ZP#+Gu+$TYaiBVa6X8#|bKVT(5KzPLTe2@WzqW;T@Ur9Pgaomz%u zf`1uLSD4j6vAEUFln3f5SE5oA-d?gM5i||LwHeB5yGDXc`fS+Dua9sG*tiI=66_Qy z`3c_7RZA^pm@CQciV^kMhibZwBYt`4dZjRxS=NT(@=9du?>T+u%zqwp-!6_=Q>NX? zM&A4Ui<`-hIcry&75YAQX=Lti5RkgCuF+B&qb7Z;YJC^9f{o>78@j3@GqM_oN&Ph0 zAHQv^QKLk7tJ#xSaz?M$aMOlw&nw-@FfxHWFnen&*FB{^!#^&MGA5N>PIzI}&ms)d zf$|(#?b}BqagK9w2(n0nD=n03tHg;$f(iBZV7dqFzmkDwMs#rx8~7;h;Z!yB!#=Bi zB&oPp*Gd+e#>ZujXvarxeMMV8-U8(bv(*Pj0xO?zM*=DXe>$M@sjK5Nu`uGN z;pIA3=}^8vSENG(J0{IXqGu>D9VW{4rmSa<*oA55Ra zO;QNxwTGe0xDhG+Lch})O?~cS-}iAk(q9&oKKCUVAl{HMwQt-gFJe+WqE}AqICL4) zgLW+EYzc>oH8IU8vZk#OzF1Q+vZn15d_Pzd;NdsgV!LXYmrS?2CbO;^Ta1@ZJmX6yG`2UTedhB0Xhm~hNvzRN)4;C9WpS-s) z4}@n*c6ME)ImrGaJH>BwyNO`ls!Apb94~Pz1J>1tE9RmYWv@SP?UPKji(h5Fiu0>` zbb1jO>>PIVsU8NVBwLUuw`A4u&#KL)Q$1zLfDATASmGV2<= zNGA7QKBytdb>DW89c5iw;; zglk|3VI}K+mfPjtrU_-m$H1aOA}w6P&B1CZ$#F9_Unj-U7qm41=@hvF0IBKQ@$|c{ zHa$FeWT{1N&jFGsfZRLNTy_sGTFbRfAFpXUz~O%}AMbFfAys;>Gp>I2J`-VnntUW~ zhiJu!!@M_^Tu{EP(}D>w5yUX83U+QGLj-<}%~znKtVknK-VT8=4oL(oa-pk%UJ?W2 zuN3p@Kf)|+JcFEzr%`BgbOXaP3K7QH}nf)xev1k z`^M~BYqg9c)@>EiVGve!U?(b!nd=Dt+2dm2%}89Dx>j#)O~xe4Rj#y7QhUpB~QeHvYJd7*7A4N9FLQ5 zdA`lqoHEScIyR38#s-Xw^Q1Rt47~ptRy&%+!Ex^G<3#^5dCwMcXi@{~sPO>(XB{=D zg_tcj%=YwkbksQ8q80b9G+3unh~%GyVGqac!l=iDhwvSDdMWlizW7AS!=Q&lk}4p5 zunGux^nB%Y&^rW~r0F0Nu{~8r)ju|r8e|dL4VB_KkTx;5% zZ!7uc6E@z9n_QG5Rb-1)QI^dHZj+;Im@p>DzDIq5zd4V;5j%Ecgr{RG2|G+wY!^DQ zCTulhT|VXvv^ijcynLgj91rKq%+}H{hx5{@?cXR4sx}zQ$?bIUdwKw!cyc-$Qap)Q zEjKoct+?no&Gz2Shll0SPaowZD1P0qXP#a3>iAc8C@&klC04=jA_3<6^bE)zW()jS z8tCPFuK9+KgylJXJsdbjsb*vbDWui@kJ5 zMFLy}-VWTVF1}mK)-7jC^|_gxYFTu>3smEZH`dvH+YXm{KR5ofWDot}{b+XDt|vK8 zx|L?}ovvBj;(OCL(54r!2@Nb(x@o_|Zr+Xu!@`4*O@pI$fbdQ}b`@?wz~Za_8z}g; zul>nJ+t*TO=1VdCN0?`?LiNJ=JX(kqz3{;d*non=%Y-YNEC6sAOhb)@4J(ZF zm~_w(*z+SFADY$6@of%;VhPWFadz4>l6a{v!mx7gHJ3hpU z%AL>W5d8!D7Vamn2M`2PNRLZpJ6>_%A&&B0f!UyS4`KND@)A56KJIajC`KkurH&^t zle~Z^0aTrcz-irs&^S2B*@2D0tIFLy37XIy6~I1vQ^HM$MbQ}ub&7o(Lt%ajWT4p( zdNF9n7IWDBu0CtaM<_(e6rVEeP$*XOmB7eOW$2M$!yrBgc-phk(>mPI?K$LOoK1YO zq+K>&&ZG-L?I(>Wpn*5dw8Zr)kO$-dt6~lJiw1FlHT+Nmf$|vb(mMg0x0hzbc)l{O zB^Pm^A@#btsBZ_DT^DbV+IKwQj?DgHMej>@1(l}2Lm7mJqQ2~AiGVKhe9^^(Jkhut z(16*f4ETO1vXLCtl!=|KwyQBA5;$qK`&z4LT7@Q^@qxMyeb$ijMwEaDx+6#!yJ>s2 z1qman%O@!NW`Gl`k+0?4hJ+n~42Rx1djP`O){@4ObUbSBgt%)?gLC+mfTeO_1*@5S zMMjph(UClPax!)}W|4i@hc@PAY>%`cvEru9%c3MGK&8vS{-8gnqfE%&`^c|0ZQq&x z>s|&kyh0>VtDG!*bY$`0odIsRAQU?<*^&%CipOaduYq4tJkBnH#>Pq-_w$_NDbadA z-`2{oZ{U{HHnMv=hM}?y{^fjlqg~fY=I1n-k1NjRvFHc^)B&* z8~jfNIuE;@#1n5IFW_Bpy+=a(rydJ8ja6aV`~wuAL;n6o&h~jSXMfP)OZrNn=Zo;d z67#$$lzi(M>#g}v^gdDnSbda+JPcV1h|MdhDPct)q$&*9QGmeYM0A-0c1%PFg&Khn zh*RcfDt0hs^Ln|CMOkW045fwJgAWZ)L}Vz>?WwlD!_^9o(Qe25^D z_2DX<3A({ym7#*18xBqO2~NBr9go4;bz(D?c0lqe(h>1RG9Z4r5ZEKrOiX1#RX89P z!Dt_N#D5B69En?8(2%Hi zo>Ll|hiOa4(o2-~F%dT`SA=80>_I^IzL>~`?Viv^d!7tYC(RZtW@2b%WC-h_2&9Qu zp1#7Mue@eQ@RqI(Q+^rJwRc+0{dH{6o5+;(*VeXSKOHQlM=&b%0F5LarjM@CDKEW@ z^Y^PYOaFiDy?J<>*LCOrzE}uQBt=Np0%|cq%90^jmZ8NK6FQIk<+Gu>@IYs z3q46|B(-(sbM6aLi%cu;>ERJrm@{KFnAx$>rfA@L2M&|Bb3iEwyC+7mck4bwpZ ztANi&bY7B;6}!S0-JKy!;8*^1yjRwn4q>TKpvV@^3dxFo{nG}zbzlf6C`NA7_E=4e zOOx=ZL|H4YhS%9SlS^c*$P`kcV5ZhbRBw&)Mgww&n$A|fay_ffqeEW9FvDgHMm0tf zOj~9>&HDQ$BmZ2&dQ{<8*7K-Jr3MMl56?i-)-Wk-wN=UmCP5|e{f8a$l75v`Oy-2G zoj}EnT>Ps#3epL|tdH_xXb-C_SGN?jfG!F7>?}7M^(9q9ffra1B+9WAc0e!1wlWI9 z(3GraL0Yw8jmS7N8S+p?A}Escu^dGSXp#|pH$f>rh@*0-2B^+Zp6e=|;Yn2>6J0}Y z>|wWPz9g$vn_S~h=2hP*Sx_hN-b1w;M!*-vy7oGbVylI9=Lv(xkIDUOL%PV@L;gvi z{W?9{4)tXxg9I~eiAqP3Q{+{S*)Cg0^||p9-`eeZA`v*}sswPYbol6C&cP+JE;&QA zB+`edL~#d$$pqpTc9u@VE@yqSNWx6QX3+8yqNJd&;CU`|DlyxjNSAePY$&Ckz;d>T zR;BbvtE2*okvoD~xu!^m0_8x^H%=?$c`+MU5U!t%fpaMum0pH)r5LFXLyx`>)^(ox z|B4^o)j&Hk4j$IEM1i)|^%yI#B9B)A;|MPb4H=!6CLp9VUsM=`MqqfZj{CJKGYskJ zbUvAi&}C4=f`d`y>^^qPOYmQ^>w2Zdk-gwwfHpTVm^=Te&F^i}jz4RHP|ID$;H&Z|&RJp~^_|($(#e7qh(At<&mm;MiN<6b({OX_@AV zY_=Yz6@h*MD~{Sq_Op#y^0_hO8Ve2SnuQM8;y+Tvp4%;^`V%;5S6|*NVXG>gS&an) zDTo!D*pvcCaG#dZO%AJWvLc42G{?%`ZA`V(IMphP`3Bj;aur|o8B~tCUl%Zz@6s_| zQNTaP1)8?rScHBfn}Ec6JX6^>Pt=npTmW?ItWrvK>eWdA6N_XyveHRwL=C|hH4I+6 zYqK;ht;?@MY=|o2a+7?JEdv8g=rtsibe*Q+F|=96c8`3tD0@k)q@^i?WU87)s+`hG zev(_EfsV+|JcTYUw@=6sSA0dyGVJnYHwsq!r*mXPlpk-I5jVmqnVysy=Opet3+hQ<-tIBV4NKh5 z$d8@YP|IU38(GX&UkMIGSYwm)$T`+BUtzEL#jJUT?;8d3@ny#cU-}6kjdgz|Unx+RCComCg zuU1R48R*7(R+s86=O;_-aR((Cc^@W6!X@WXhcXi06lG}$D(p9QmBwA;T8j&bq&42J zI))y$^p#%R-IPXaYe?4`e zvp^97U~1uFK8#$b>>C&{ajoB@G%JCkg>_YL8=e6v2F2ltG{Xvn0n zqyZI(u}!K&^vx$fIl%2$@+7v4Qx!7OOy&TNo>I6bxD0_}Jgi~i!CaznMtjHv0}D(- zh#ebo#imL)pHp^4e@#>{RokwICjm|^tb3?p1FonRKzvaZSb^$#d6zpV@1gZ|9Q_$A z(`-BmQV>vIj%*uUauai^g1U-Gj%=i&O8Zndn+S^FX%TP=P@WN|8FzoU2#2r;>7+VI zw5cjIc__9qBSZz;kiOMeB&sze{etK;WP^4F$;wQl_--iaKFH(Rf8DjI z?~$rDf|BI4brGGk*s>(e49kQ?ly6j-+3Dn|Ld2?cG$5*cUBc_rg%n5RyQL)Cju@2l zFly1Y&oPk1ShtM~E+Z5ppb&Mjz27oKRqT1+vszZj)NNukw3vUbw#vHl?6?h~l`4@; zf1gS-2_yAVXP;e`dx^!gH7Ew>(GtgwDQ|_AJPRiQfgvS<5>%5`ZeW+AK?2=3X#h+; zk;)hJGD*mVoMFzjD*jUN-g;wnznYCzw2JbXONdqyxAo}}@_GLT*lk!QR&;%?p>8QCc4 z9nbuRYe2hJm0y}LMx|}cWYgFLCzt7Ninr;xWzRRsA2!K{$HX3&XED$w8)=p)kWEBgRPsGqyL4DXnnNlnvRwgtWCl_TvL%)_XSDeBu38P$ z0z27d5$%uaHPxXxJ`#{5TPLfkEVNBisY*Ns&S-;bb46K(^^$oCYan4;({zXD+!qit z=u{O7sp#3;PwcWy$KxQyJB2fYj^J@S(dgFCa&I=%m}os5BXFcf$x<#R!GebD*WeAQ zA_+y^CO{cT^7&8+VN^kKR?F)Mxq!;p8H1EGGF)MD=KQS|43j1b!QV?@4hSWt z5NcGacPX%vw%{{cxtGDvg(^3z_@nZ+Ucm`@{?NRmR(9Oayoyvr@6{wgoLNj|L& z;MP*(G|wRY(p<=L2hf(#dMy^m7;^Y`uc(c=Zv|uh=vgfqqXtPbqK7x1?UR-ekn8DP zvFB*KQFoS+whRBy9D%gDHH7F7ifDM=yecTSY~-;>Q%QM{st`R0((?9r++`tRcLK49 z#i3w%{1_cAzoP3N_kKP|8_c(k%QNFm(h&@Y_ybnUTLMwb`^g_3lLN={%#YtOh~pzk zhe2{a>y!bTn7kvRl`g74e@KEk?W>4*Hon)N^B4SbpFKO;D_?=bdyXfRh)^g(k!dk( zQtN;k@C3h$DLUOXP%&R%Byq(jO00FfN-0hkdI!7SD;pGNcJl5A$!k*mD&?GB5YBsYR9NWz#j75-Xx_y{aira_I(eSC zJ=`Ij%G5v=9y%)9ume7-i=Q^4I%Qbh_30AP=^av?BOgB}&6-?ogB`8s^|Z{BjQ$)O zXv*YE>eielM79AFdWVfX$XuBsxI`qN9jt;hFhrtMA>-|i7W{HBVagw!lNNpUcG;Y# z@mG*E9~hcGk7m|QR_9J>vD3`e_&m~FS>erIj&*%-+jW;sh%kKlL z>xx=>?ay&(z*XXfvto5EmL~PpT)aL$U+ywPK^o8CT2wa0;)Pz)*Xp5;D}Dq~qc)~S zr^JB|e=a0m!Y-X)po#|DTx5X#D4u!jP7sP1x7L_{q z@qR^l8+ICW75oftdEl3_3gP)|Kh%MD^H`K-HU}kOeuUWEnUKe4Wx`|)lYpF|QSCsn zku6CA7+efH&@Y8%%4Z9hf{wT$TFQu zOzhjBsO$HoxbZ3VCP2~_JYPYiwFstU)Sql+0Z4>WD@_qvQe`a~U>uNR`cNNGzU7=# zO_OC!Y1>e?emW8#NJ(ed=}#+~0+&tcr~#V$$N05k7*T?vWu->@vQ z4J)B39K3Fwiq6G6&gAO18qTD{=CLL|^h5GGFH|+G1KzaLR1r{XawEm8gs=LwNx3;7 znBh7wlI_(Bky=D!!T7wUP6yA0UL&1YkdLrDQ$qmdfV9slCMg!KJGKIcdAaq7f+4?D z;PN|mBrPW)Ole2Pkh3o0q9FyWNkvfrQf}=wpmizU`8~V?c@=Hn$q!HH4;%3IuotwR zU}1L$X*5aN=cx7vz&LLQcilILoW7frms{ z90~c1_(2-QLUX;NB?^Sdu{_sPT;?64p=Q`1mY80Ph;DzH7!M zFa-MdGh#-vtIi~S1{$^w(R2n}wMzl+egO7BRH9CEUA#}LED!-n#j(8_wXRBeMXopt zne+ya5s>W#Mb~>r9LC#~t!^Qz=*siwNs8RTr&1SHQjg?Z1X%N6-O9K+3dywNvA`Tl zvQjk2>Mmy$J_!A&E0HzfDU@#+O`(rIc$b3xW^NLUXa#%9g1eClg$EmWm6n-B**QZ{ z*Vzk>x}rk-I6hM!?hqJ8t-MJLbJzqvnr|rW4|9m4l2ZPDJ=;+I5*^UCS=HV$F&npd zq9j4~tr1%SzY#3wU=(RGgB2v={uJm5SJs8!;G%L2V^h$j3qzD}a-z!7O72kD8A{>E z`%|NU66~#*H!ShT6|$ubH;(->{05smy!9w+N?kQ-AC^&w8x8=jatS7PcrK`J;q3G= zBl1zs>Brw-65MEu(o-fXM4%QZE)!F;hb*cJP$~|lljzL?bbwqvR|0*%quVik6d0;D zsFC?$JF2wQgWu{KLROvtGfiCzz71yjb1>5ljJgs;6}rA^$@&6{68aLtHtDtSGVm6_ zoX~~rFgeV=!n7l2hEg8laV858qQJO}iyo?R{+{MKPB7jbmn1q)s){Ezq!RfAlvv~P z$go9o)AJ>!Bh6Xg%y6uz>!ZzynR~)QPiEv~FB`uQkRs`c`K-)kF%w4UGrUSBsao)c z3Pd-r-2;`-BF-yMX|fPS4AiQYggHYTqCu%(zC zW!EMV%{Hw@kZv}I&%GdrhfhbO8YyBS8-YMj(_mnk_og<1O(1cCv)#q-^f`hnBP6&ZUw!7HG4MvRd&ngKFrJ*;G5tvZ(a7j&D zw?8Q{mA@ZN7c?SP)X{>R&T$k-)=@FWV$-w*yE!&fOl3+HsqhRJl{;0_#`Hj&t=k5Y{ZJFpiSUft8> zZ2^(PnL(}i)=M1O!eASTizMuPHZ_8~A5~UJtjsPDM0~C_T~W-B9L9*Cc0Q#idsg`H zoU?*B!^?JMm3z?xEH%egb`&w=Gr+#mB1bHbAc~#OH^Ub zs>$Rs@I;9+3aOF&C{MZ;aeO2ZF9h@jBp4kh;vn{T2sWg3uCIk|xP)?kf50;x6FzxW zyaPtZ&h$Hpk;2(hbOc48Sh0xQ!6>Mz)G;PclWHo(#^nWeh1oGDB+rkUw5!T?kA_sO zd!D9IPi#IdV{u!p{icLp&M9iYWw_V8z6q778mER7_x8 z)tQl5LebL}u!FJM*zkbd1SheR@tA~sYUtfe4Lt-kj3;u9z{O-QtVGY;ZRV01ucc`P z506mgdEFIABF*a1Kvw|?wnH5U6;v8;D((bxYEwISLva6qE3@n}G1#yL32UPVMDhBP zRI>(E))w|-`hgU)r;%$JQ*Rn6=qB~{@ewlFWKzwANbj}F%rj( z7j1Y^>a0(Nl@x;2E{WRG*`+r{hz4-V1eZDux8X-?=a{%wojCgYub>P(fQoC3T5BEb zqO_Er9Rx|zx=JB7wrNGy6rA8q31IC{hI{058e}d3^NuU+RpQ7=3AzSl_QJ!z9>LZK zOzXW+pdRLUpPuIKR~+O|R&yQ}Q<-!oQxK=z2=B$24_K}*&w}RKN@Bo9aNofd^2lFK__%96ewu&@=|tmA$y=#KGoBoWzH83BWhNkq>K5K7nK%> z;bUBM1Ldbb6;(9UjH`t9Y5}|!y)Tz{Eo*p5t8z6F&p^j}t_mFp@dcDRUKly(ISo+! z3)V98IXTI&HT1U^;Wc{tVu-cyDKZ=s8z>j~B40=h=>^2mFby&qtckGGnVCXUPljs@ zPHZ4{N}jF)Oph}#H-IY!mtH7R^BpY#CQa5^5Lq1z#;{v!y+`GFMJ?TnX35KH7{`gC z4ek`dk~V94G!eHI(l9)U6qpGr)UPoSh%Y;t#&Y5rMZpbDo_a*Q`8IMYc8V3zCavj# z7;7cQC+uCchh&{qvMT7%7WMFh;pwK_I<^<8wKe(D-2KsX9JZR(%B{t$(@!v;$zgQ8 zc_5C+PBv(JH1cRfvGg+w>1x>$BK2^sEc#f@fFECGY3s^bZcO}+9`E%8u+~i+YU3^# zz>sWQ%z%Rw#gR#*vuccr1~`<}PX=JB0?`LcOT!)(hTR52`jn4>kXr!k8FrdeP?b_y z&cI_jso<-g)RK-kpBk;x2AJWZ!7R?Sgw&|qt;m^{_$TrbN-W8!IeX=Q7 zZHYncqkV0C)K7g0bJJc>{8vTDU}p}JFbv~TfQ?+L+pn__eH9gi;`IzG*l3ZfogB+@Hm4^_XiaM^Nb(_5+6@IJd}e^MX4P8Y8Y%^5|Dy)+SpD%5yDBQ0tYl3C+g{ndLw~PYf0m zyty+MlM-WEbkl-fowH+vFLNIKN9C5r0)Wv3lEz7@W@n6#kM8RP2#Z1LFx{l~bb9p&yC7 z%?5PGWG$Z2BAHRhbNYksyIfsALPD-8>&C-CM3Zt$pTkQ$QJYyvS2d~f<9vBb`q_wu zp5P}X2?dL4S(8EhJcpB*kST9A#c0FhP9?1UG3Jsy_5u02V^xfz6C;XUbOCsTX&bW| zJJoecU4_ya36FktoGho%?ZGxhN{7#mYI=s!+)QjP#@7~9Vpvuhiw#)Cz&W~} zv8!5)(JG@e;x9;6ZowbXYeMY#J`Ebz17xcv047)FEQhz#0d1GjB?uRQ|EmSB#59{pxdt^!ec<(D=9@4mr_;D zim{&>=Mj^G5x1(La_02BHep52m>pcZfqi zn4-t|Od4`c&i2|arB-MNBfN8z!@ErXVRAFyv1Ryiz47i?NcOR$O0Wo!AI*~!uY3y0 z&pWQtkz$3sbWwGnwemlixMxSHP`BWAlN0=QClbFyfroTe2~ip_?nKja%)wEVdx@j< z46$xULa7rY@`{TC@(uEej}F&-qkzdol>J9qb)seV9POE&94}@=S>VC05mBovE6LWd z)cA0m9bp$u^wkTwGb7;qC=P&Hd5t?9{R#LFHZ#V6cYA3PaMq0hY<(^Wbf(iuGHak zUlf-1nHp#(9{b+X>%(kW$uk84l)-RitLG(Ds{Fo=?I0+#aU zc|KQ$aWcibi?g8qnVd69e7`xZ3s}Kjo~#khljl=>4>Mz{swqGizeb3NFHKp@*^RQ# zQV+JP?!fQECBy?wEgeu)lOV8`q41_0=QZ}r2jIR0Z++4-%>=KP$0vr9HJ*k$;5i$e z*#s2RfP6B%$Q$gF4_FiQHl6Wq=cw}tgP<|YK4A0utI77~X1N2+^z;tWM6ILVLXU)j zhgsfDC{kzG8h5FhyVT8H9Og;$+~(q(_jv9`mg?dQ3?*`xTxn70!$pB1^`p@oT>fER zIu5Yl7LxFP_H$96c#P9AyiW`d)hHQ&(c%()DSdHL+gV9}B{Z~6!V8Q+@L~S}^}5h}EAv81SC)k0;Et-a zEjWN1Z~#6WfWL!P;Yg69r0Dm~LOYtIp-7xmmr*L>jOf~4ZP?>a_e!gB6T}DXL&x=& zaFqLXvXWJQu&au}zULwkC8S&gqYQ6{858SUAV+&u)<$D00MbiJH;88_(z%;zLmd?L z6l#`wyl5{G=tXD2-L-UmpL{)sDH1hl{VPQpWkySvG5rZhA2@XOn$w52jbaSP&W@+_ zv0HQBus&KqYM@=V@isJTJ ztt!PPm;eu+%e<^ozzuljoA{2M8JZ4gvwvdJH;KgcNMBB_R@jb}b@i;H&1Yzm8S9yp zSGn4nRfw10VEy%1CM z=GnEV7l7y|k!r-6o?66u!04#)02O(4f(Iqk14O1NX|B$j=Wx9{AJ@yrxOTXAUQ5U@ zqj{$GBx8HYjhN>_OFmZRTlY9*+3m7xb79A*{(6&~Fpp)F8qeh`9cEdmteKeQ-h@Q* z_@Md*Y0Xn=qy>$vRQP>Z_kcc0!f;s6eZ!%bBs^XMIn{5lvcvuY@e$R6C?1-DH+c}; zN6C>V^sKlSQpxmW3iJu{^xAFTqiZP@s2`X)ehBM)!FZGW2G3NKVqOm z-N2{Gm9anG)zg!{?jHi|8*bof)?6ocN{~342JCyNmYz%#^Qb&B`JN$gbCWWEt=!W> z=evu_5OwRpZmwi;D#k+)49Lgm%}q45g7LM2Hj-IwFy8$^5D&RijIVMCy~4awa|L$H z@IW}Gm{SBc{oGG;aQlpMQj*<#N1((&fgm@rTz&;9w+)wvbfWMA+SgbGhS0)RYa<1e zosvC1c8E!YHj|Xvo)-&w;BD$3q^(aL&!=?5>(+7JXNZr*nH_IvzM7)ZCB2aCD-dh# zVEt0Gt~C3Wn))8;B$mfzR%YYfmx3as?pk=Ef?|^girN%1gf(h&Q~(ULuBT}kL=#g} zcfKA7o0sEf=$guzm`p?q~oh$Dit8@E zjp@BXNutkMa)E&u2YVA5A@Z6%xLiZ5(eW_bNw~mG)@<-1Oft5+omqA)0h8=&R4D@P zrAQfALCDk6{2Yasw)=Xh05ak>@!g7y8u2SKs@URz>1mGT;g>4c8gR_S(f}irpRN)X zhM?gYz&LKAK7Ua*#8Pq-$q;~^m6p&noLt{P$LbFNM}YLk1~}Spz{W{~aSbpv7+1z- z<@yH7QC6j0kAcQzFbzr@bGA{Uev(!$k-@OWcN>!a|7}d8zFr}%%|O~SmqFTSI+`wI zfV8u2bj)htS(N(t?FnCO_M^vUq+e)2#QM)zUtQiYH3D1)wy`G`*m^D5x4iT$~H zkxz|C1de0%5ZrVuwwI)JMyHI1fn|GyrW@eshyiE= zqI^ASpyJ>v-7McTkuEwGucWf{zk9?txFlNw3-k0YL43B&?^+WxHb>{yGn`InHp!6A zQ=CxnvC{*E4CF$w>t+-~`3FRjk;@bk6fYpSZV{)?f>Ie9EcMG73-dlu_JE2VdG%h< z)5BAPoCpJ{r0l832&zkmTt!p}%%>ko%kIsr#+Ce7taKK4(T;oArQiv6I$8X#w)l<# zxGDt^9UWSZ2Q&kwiAHd8pTMPEgOfD_lPVfq3Y1ODK&gO8**>DMt(pN*rpr{L89Z&H znc6+zg)&Aslmernj9|_Id1MyG2vJD|W*JHRHjxNw*7bm13dCpg(JAbWf-!#L(|k{j zC`kEX(cfzDPfMFs(v#HsH(;O^1RHi(X<#7TJmpwzh0nA!BclxeLW?e7dv3`yB79QJv&&H zz>ji)_-8HbmIQ)zXcx0Sw7WKIc)tnJa@#BCDn;gkTJHJG==o=Pu)o>K_BU& zGrBcmnUy{#Ew7V1ic;WgDa1xtpX3gJg>i$HLA;@ZjCDv6RQI=1Qawy@WI(evu}~CP z!0`Byx)`X{X>}qD^mF6BD?s=dD@WCKLh+)0mUE79O}B4Us3(B4BDNUros;$yMhory zdZc#B5jv}GI)Rc3iEseD60TOy%isP6BLQE9_Zg(!tba@!J#E4 z)&7V3wQbY}NfqG0^HcImJ{9ky|4JgtpiXn&$JoWjoX~n7_>6l%hUVQ5CX_ zAd2=&+(hx84}A5&8+pR3lEw z5bd4(*J(8q*<6rslxY5}eqCzNG4dX51KQ-!2baM}Z*YcuF_uh79xGuU)L+pAWfBnQ zbnx0TYFMD9Zj7no$+=2v>o>5rbwQge7mLoqEETO*YOw}fg9JoBEGXSAVPG58dD0A+ zxm2gC)8d#t@IF_!9M)%j6J@6MiSz*ME~<38sL(_3y!=|)T**Ur z1Kv3rSV2Hnm!d`Qixcv*L%PY)Bg`XH73eZF39O6{<?mK+rf#rK^ z0RdelbvW2ErqN@#pjfHIbcFN;erHd;FsBo*?CsOy8?v=Aqe?)#+2t~>y{)c?i$naP z_5cI1gOp*O_oAXC&b<)YUv_oF@NtFhG`b3MmMTrv+*y_^Q6+u?tz!bdm+qACAe4xWO z7|d26lATvY?O@Wn0=CQg;~#+9t1m-s5CQY{1cR$l>5U;@<^P;Xqb?{iM-7oa3c&gd zG%G{{Ah`_2kjlV61FON8-{@lhZ}8?ztzKxNa<;2kDT84 z#hhL!2y*fdkd%L-;quQePWq)!ro{OtV8}o5;`|f;t-Q_GuZ*>prC>;Ig4DO`bg22r zKWF2;u?+CN8ASia@MOx?Yoz9Lee&2G@x=ryW-DgoD;pA_HhC$`I($GNLA8OMLU{(F zxe-;9F>Jwn#y6BbJgH_I){WkVE}L)OX3~AE#8G6!fl1bGZT5XWCmHOQ?S4l}{3%|_ zmL_)h@!#VOq(!zak*{H;ZmL^39=fFtf55?M+1Ss9(@9MeuE4BT(Eb{W79OnDrr=82 zf%H!o_4#n<3;^4s)3FPy*Iiosi`L8-o@X~v75}RR89@!C$Eq`W{Vo;}A?F!qSwjXE z+@T&9|Ftgzxz=n7gej35p^#%tQ%f+MgCi0SL|noPn|p%4t-e_W)3#HV65i%Ol>xt5 zbsS$x3&3|%bwKTbFCjls;-mH>vm%gp7VQyUk&2ba)rBDXBeU{KATZg=2@5gBK(G_0 zspLfnMhx>HIH(XDe5z17|ihQ_S1Xo%jAp&Q17g%EGR^bs+t z@gfT4q!u26n9`YqD1`an=RA_tM)2eQKt9A(!xT7>Q*&WSfpHF*F_&(Vk(_Lx)UiV2 zt)511z(Ao@&QeK9qcxpx@Ux3?=?sDKVJApIrJG`hLLl20rh(uR2;xDH4Bu#n|MztXh>L+!@q?!!ymCo_^zoE@+S-P~StdV)GOBx$ zpj_Zqj{2msY%cOcEke!KLsW;L1n3E&1ZWd_^%f5}RT=>?elo&g0*1l?H(|Ls<}YdsOW$*` zkz`8R($bvw&>#%bEaQroC0hoTX!E7G0(rOsSEShhOHD;ig%y94EeO1P$Vcb#yO|U{ zzhnhijKm4BtmJ)6%pUIYrQK6qb4LqL>q>2p8(Ju1U?WrSLLP(E3qtX^622E@0IiXNu3XA0r$2rg?q-*tC#8ECu`SGTx z0tl)4V8P!25N%hx7sReb6?}RWdgP{*G-cCnMw@7Jr(^k$X81$+Zu)9#&EtK5*Jb!) zt>6!Px}?u}g+W{=xjAwva!pm~9C5fKZkhMr9%H9U*sinhaR{rd>U(Pmf!yO1tLEDB z8?Q~7D`C<8xhvg$8C5Y_eQC`~_`QL-8C{zX3jx z;NTj%R>V-1%;xO^SuzO3<`}3PgqIE@AyM-11kAU~ft>c@G0Q+vw<&L>9F1=Xq(@>} z6S2`bmSdw93ynW5;2TwbY7ZUj=U>h5&>J+ik3zfvqMJ|?->oa66Uw{3AkB1TPt)HK zq$I8btQ={33$MThFySZC(n>i67SF9R#Yk9dtk#V<>}q1KpEmJua29cCUgUxe^5^p@ z)y$9%k~aF_H1F~^RAwVWKWQNVl~U9Ai&}<7!ZD9j4456%J}n$}!_?yAL$qE6>2^gp z(8jAg0(YcbdKaXRj3uzKF3-4jvaazY8FeF8d9E;3Ii>nU7oV}b^Bqc?k^9uU=v9vy z?x=Ne%pT`}n;>^b-9HQUG|ptCq4q`?E8|R5J2)$=)s;Xpl^h+wsI>S)K3MeVD{G_5 zZi6F4IkMJIQjguL`@GGDT?p=I=dLF>zh-IB>tmPrNKz^9>NLLPxT?EEh1`+N08JY8 zH!nMlK(bgMz&~PL&0)aB*ruwa6tQ>KsxmRhS%%_?y+?XGm_ejJE|5n`uK~m z@fYzFo0Et_pY*Z8UcHAlU)tu#ngMQbd=eX`%z#z00e^pPp@=LAF4twaJ4!~LDTpwd z%ri5PBAu6+la0tHJj=J_E;>gYT+JxyLQ`#TOUmLf+oUuh$l*tTOZIc~+3ePrd^Ex5)q&ia7@DQNk>bopq_3tozA~i8Q)eD2kry~w~ciBb7VAe-0mxM)d3^jmt zX2Ik5>{{>OKt?5~YqTDIHOkW}&W7k1C%2iiRdAw;7&arFnJ(Qs^Egv*knoCS`y@tk z3wHsWv}B0sUZ*o@$xaU1UPD!BKZkHyxUj<(gzF4FEI3pdYIK0gC|pTU#xI0m811Aw zcn~f?*2SoI$;}m~SsvRNveFrT4qMphl|)j!qS$G8CO5;0XwT9Ec33v`Lo5M+TvYnP z=;2|jOpwcNhy-?~K1efps6?HY+#sB+ihqM{>TqwvP&XFvSlod(NyIF=Zkf##lv0KQ z6Ct|{Kxlu3R%PS3@+mJt#b=lUHH+0Xc%gMuvK_RX8}xkN#+Z4fp2kNkzmItZga5cf zAVN{l!6dt7V^Jb32Ym8b%HyVryh%Jo)QLTs?f%w~O2FFXd!s|iVg?zzl`REv`F|vU za#rk_e2#&0$8xD;Tm=~K{?^6&OZKC>i>-*4O6xu`1~P;XO$&;@c448xPX? zj7ZLR2+`cNO~V87@<6hD0jpmdX3pJSQ(r(m z|D=mSw))wS*zL->V@TugkpiXhuZM;Mknr}PR}P>a!tD3SP=(*cg3q}rc@mJoFOZqT zFN~)1{5z?hAf+CFtMMBxsaytcpe5Mk1T&}){NU|t1`k$-aSnD12hIp)Z~{#Fn6 zDSi+thYjwhr2^>fXV)iw20wBsS0eDq|`Mz+s0e>Z)tKBLi48L#(@GkUee?j)n z9-S*HJ}crkYn@i-nAk;?ze92iUcY19ZuHIDhEW}@ax)cK_CQ-Gi;u~}QA?fC^?>>? zypNa?B?tWXgX&D!YD$^wMMcQgGV>5M)aQhwrl*K996Z@5V1GnW{0#C(KayN( zhHFDTmB~RK3euab$uZfed6OL`e|WvwAf{WxqGr?B_}C{^8lf52YD9e9Wu_&+JlE{e z-K4IL%94!yb6;1A*g{wEj(&GB1vK6&s_&_?hnM3fNypBTvQA;}iHSIO`Fv5%MfIR{ zfWfEq3k?nP`7R1VcNVIOTT09LYZ{|{-tK3qK0&a_{|i&l!(vqg^0;vVY$o(74*>5@ zKW$Or;w;qYY;p~v_SqPJkt>m$Qve13(*Wq$8R*OvXs)~LR=p9;cYx;elw~VbTfuTf z=gYucwKOCbg7#}7Pa{t24hmAtRt^WUDRSCCHuz|c9BEuQc$wo_j$SNjhWl<%=m$%S zIsL@ZGq(9Q(q(6j7a*6BDyv)JmUuH0`(EYy{0yO1oRfi_$)V zpO=m5B2k<6T484Hx64%`f_ZD0{t>8F)*~gFld{V2>+9urtpQw!t+34nXnNwFq3KkW z0QR_re}Y*^H+a`R((kU^_po>0JogPa^RNzcUpDC$txYVmh7)fiH>H+j39?E1IHxw) zCjPacqU4oJxRG>h!BNM8^>@J@%*iL}Ls$e&>8VP%hwhubBk4KCVY8ig>vI&BQ*s8! z)AAavKMr%b;ofFFj#zra2LcWKgY%Gy)9H|hqr)QF0Wyh;MQMM?Z~aoba3l z9;zx-gsJ+5lK|tW(G5lbLs&8kgiIBSk6W_=hFg=q1RmuODll}JF+qFDc|a!Yy#&^J z^KyNzssZk;RMI8^6$&PF0QSI>8}R&y>cb^dkj}#H=PjgfWE0k52F2E9AkAr#aTd03 zPD|#O@AbY6%sZGyv{_(7IT;~h80GHhjj0js ztDbOqXEx;l1dl2r+q+i)xJpJ?>zId;yznT@hQ{6H+%bvPEp_#D) zE#4$UZK@*mZE20+*-uZs18oK9EJD8;X!8yD@;N7&BaK*}E#YMvu*yAKu*!Eg%2$fh zQ%8!JudJ>}{|VXQ2LLdd_~^nYSehCSXx9ci7GNQmpk>0Tqo?%{uOh{v z4MPVqv$_+|R3+>nRq$OD3{Y>3oF21D+MD|I+4-b1H>_T6pBe{Mp|?v(tA83?)lTvm zAzwAd?^%rW9XllH6Cr<9ojulihcJKHKAK3dho0X)o6#Rg8+zq6js-jBJav1zqUC0L z<<3(foSubuoOd+$a-G(&-6&1B918jJUJ+9#^re+Kmwi)wTMFsx&J6TCB?5ns7+76?*Z#^@U0;s#%7`D(tL2iItM*0@1<4&PQL zwZS=sHvZ7N4bj#Wx8cb;Y9I(+vm0cD=g)%jyp$rZUq?^hn_68Q5l(Uosw4=3~bEY^zmHS5uSBo5SP54l5q zt7|%rq+lN;%bLP+__;CGC+HRm%;H*rZm3k>SvQ+O0Rl_aQ@0x!d^exOic?p74@cgw zi&pPW`!$x0rUsmnUg@3%Uja7aDP?{m)JYZ%w6Oy{AbW;>5^>7UvqmjKRV9WTZaoW{ zUdA&uFWfj{MpbRnT1tZG2|t2)jO&~9i*E?-NMVAP;Guc}lm$&qFFr+31=pP4AnW65 z&Yw_d&6!MKkkev-Z;~n4$ekRRfWBr_?O41zMCgSJTlZWMNo5Q-EQz50b6@beSQ(hb zlAY(U96;7r)QGIT%*3)a0~__pmzU34I`i_@v3Yr$JUb#Rh<)SmmIQgvTu|J@uH}*#uuR7*5`*Wz9jQ+F4vWjsNan&YsIVB-gX~* z)-S)1`rdhSVE{e%((8C^Tdr{>57wZ0-|3jS+N^X&2i#e{Iw->o&K1|U{J`rO+s4y% zY%jgsdu>_cRORM{r=-&<@ZS2&GM{ER{RYE0*oU21c*2 z?V2%dD_I3zKTlKz6@cDp!e&=lm-NECtj6(c^B}scyIn_;mkV)QH6*WesfWMA#A2EY z(JeZrT!$Vll%~s0w%D+C3eMBxlM`SJ6u?MpLZopMmhzAx4w(wrM^JP<)*n2EPGBQ~ zkpSJLTy#fjfWwZG>2L;)(=8vfZ%k`A)0< z+cEY7iT}qF9MIi?lf@lzA%|JW7JdhntIxBbx~=FKG)TJu5b5!YtpR-#-E6}v29;Nk zia!{YkHh}Vrcl-J+EwN;ksbb}*MU}~B-pc%mb;jetev44)Ut3py{6zi8_e(*08w8q}R!xJ4I2MUiI0u

1n`&4`97l?-e{XL;2w1HI! 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%0AFwV$rJiC)OczPHUl*DR&vIu~DM{(w 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

fV!-LJoX5g5Q$^{t>!7Cx~ zIAo#}*yGq1Y{djs!pzHIUm;RE=fV=|7hg}VaPR*k>`cI;EYH0^lXVgjm>|m}AQ`|V z2+Dxlpr8Y&gslu}HK5kuQUl%MsjYG0G+@=}=`v{5s9gr!;?g#>wnlC1gu29~ZQR

W>Ab}`VI@%TXJ!xFq1 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%0Ap@1^aLx(@c%eqgtS?13C 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 @>j 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%0AZ0cZGW) z-*F7KH2}hETtV=ql$7tVSu!2s(*Mt`h|FyR47avO1{K?_3Vh(aU}F-mEn9WYpnZ)= zA-z03hArT-d>M&pX=0FWxeQ^PzzKXdXX_OdXu4&O0BKJ02%*=Rl+PlNA=YFzfkxkg zD9iWbuusKQzJ{&BpC5qUAATK#~~Lf4ZV zBK8lLn;nf;xt+5pv~}l2Z@lK*>F6HpDgZPb|AF=R&&^-4NYpu>;uw?jD_f9yiGR6P zf5jIy!84ZHE0F;{d5@@5tF#b5+DKil3{o1j(nfAA6!$2jxufl1r@gWtDX1!@TN>Yjp!b1ZH;x&$r z-Y*yrR+RF;)ac|B!GmHG3S*Qw9a$LTv6W`}J~qU0Py)b9P0t=mo9;oH>-fxPQDO}* z0|2#R4271}06bCo+_Aja2ci(3r9rTN0*YLohdh29BY^Q3s3UhApygG`VXIGrL@coS z6`LV89WCPxKj(E!u=A~smSHs+iv{eK3NKNpaB2~O_uIqMTbl5JmG(=|pkAe;F3z_3#CH?j<^x+Ur)*uxCLU5)3;7betj_Xw=@Y#XQKZfJXd*mSI z<2NZBBUd?s@EBieMVNZv;c!5uai-(axn2FSW?kvf8=~7~z4hWin8vp*xwodurh|OZ zhQ3xYK?xNF?~k-9wf^p+;8$!P5mjoqCioa#|5Lmq7&D@a{3iXSdFG%z1h`lO6%==| zY~dqQq0w&(X$o&a#6>(th?xo#sm_lnEjJ7!3mLN`8!32qdN%c;;9V8n0-#VpyrPw?f!k+&9bUpUSaWwf-@%wrd;2Ks%h`)6hm*i}L)|hk++22__T=x9Ci72M#@>uwJU>8fp=2Mk8?~=7ew4gp)pi?^PsT zsB#|`49h_4CNpaSld^>*taGvZvIU=?CXj(36E zUKSQjtEr^S`-~b#NOcK(j-b~WVhYUB95dTXEyKtLz;jW!g`J3zAtn&FZR~&^`#IVlBAf3Rs_gmQ@ zNy$QPnFM=|GottgfO+nv0Ks3R(8SD;5M#+UeqPlVe`!Q!jJb*{xBeFPbgvC$oI-Xm z>x@G!VHa0~@V>D0c-om(79s(X$~SO5vaR->P98Q)I0TL10pW0#+tGjNt~JBWdH4qtd(bMeFiJC680q={5zTt0z=|! z{F2lw0No&WQ-p7f+NbO6>$R>GM+8!FgW3y3_yOr5%FED;6FTkC9ArC8<(1X^$?HRf zS;+Jm*$wL1?}PSQ#x!J16|dOE#Fr#)CjP+fJQ#GDx7mqU&$wcz+DWr=Sh7 zqD?ZSk!HEw^KK$3V{SP4EB;U>En;*o>V&V2M;j-j;%so2lcn;+zad%F8h-9Y4c~MqzTs*oQkc zb?_*uN9b?2pdPz;<;&G?p&>Q04~k1C)#Sv!&PV5}?SyvwR(mUFg%MqZ5#0(L*^J@X z@k@2M1nl|8&f8CZ;p*-`=c5Hs4Vin2mFth4>fHT`WWcA3w-3 z1VQGFDdt_y2yTbk)j{h)ebzWTDu=Cr&&D;`yzQAdP?~w9h_u0N#nu37q*R}DdaW(d z3XR%&`&Sz*hJw2o{ikvvx*a{XrNORlU`_$L@S^=sN==Ehf?+^gi(oIr0o>z>xIPS1 zn)z%8pCeANwm)0CVjgpBmL5M`2w6Es&qb#%3TJ5YuSf9{C-^27#6|+@F5_LR*w2DT z8SR?pZV0nlFZMR~FSOe2{n#R5(Ro4{5WI+odl2bHSHA`1c%Ex=XO5=sMxyU4 z?Y2~d2<tI6f#|aTAWlGWy3Wnf= z_uEno0vV8jIAMu86HD-(m(&GqiE}MF#JBvS(a-#7MP=u=l6t+74?7q4aF6c)I&EQ# z92%2PH9{QxeLhtenHH>q_WeH z@~1)X<%6ce{|}Snem_*`I~Ep_Oh*WNdl9?4f_YR0G@!>^4Tni7Y?)vZU$`v%LQtb$ z^`g9L!N)(?Ajk-qZmhNV`&5!sZm$jz+6C1|#4y?e6b_`0;k3B!FZ0>&Ah=gdZAB>4 zBOGWhgpM{bjRGj;IFvbPC3RBvOMgQ&od=A+LH2pQs;-M&-IE-6I7)_NN`SKpt1V$w z>Sg@|9>=0?_gKkQ7@IL^LTqQ;hNAZ?}!NIg1lPp7TeTz~@vL_PPx=ewD<{ zi*dH_8UAFrNs5lrh?=BcwxTv9i!AEi7=jHr99#7hFy1nR(PlG(r1K65gU~B6QWP}E zT4lI%>X@skK$2gM4v8V{> z{@#Or8Y&X*R>XAVrvl)~nex5=kUJf#baf9JUZ& z^N(mSn})DrL}ePEOP_A#0!0Gx^L#vW!qF3Dip5zwGlRO02rGy@3iRV@4=b*rzDn_y zv$3CL~{`)e-YQvNm-spmZ87=#fReUc)|dZJxs z0;c{O`KCsG=4o)(d{iU!3L{1?z5AZjgy}r*#$*avk@y-F!j2#+xF>XD29EM?E{!-g zS=6JWgb94`WLq@MQ%p&bXwr2#0k<_ycH~Uvo(!1J-3>xcNrHU2;m0}qg?7>%I}51WL@BNyB%1H_I^?^o8sPE! zc7!y_@5}4?Ob5j^dwI(fh&#~_E%+$5FT{0O;t!CX@J!y33sTCgkW9f`O&a1)m|s=g zk8K;*s&VX;c{^(GY~IyA>0>1aqZ(dyXmSOPL~W)H!=>gXAxFHACQi{V*2%}A9sRBx z%{iNbOyG}vsC$X429qVnYYGi`VNoG@aU2KsbG~F!qts%-2+N^6{bBkmn>@N$2EbC4 zge7VU%Ax4DNSlXdw8z_Uj$gou%oM>bKJU0XYpTOJl1TpDFYo@*L|YG;ou3E0_Kr=j zHr7pDWnZRP^#uso!&K@DUcL+W`$1W=U<~nkzG~XfPv#lLTXO^#DZAUJ5dR;9Ln3}~ z2@^Urk2v~yTR+eFcL0>#)C}S&6*sVODRBWi;I)KLshR&G(|voF%5fgiiGM)T=6V{e zcw!B<;2M&dag?tG!R+MwVBVh~5pfFP>1JCE^PbR2dt4cbhJ;jL2iy#tOf62BqMGPN z;HHskzctHe)p;cj>^|SVj#Py#fOB(LfC=cwSdA`uu9G+RnDR1U(DiyI_-i^&V%#%$ z&*J_L&big<_gh0xG&pV5uS2&(Wt`44%R5zCx4w{(SkP+k?YI6`9rvOoKDom2;Z>l8 zX5dh}ANMWjR%RqU$2iCg+FO!RzYdt#jZPy^AggskqwUBln`}J*0x#*gcc|TU=;=(NE>AaoxOqAqm6F9q~ zU|9$Zi_>wA9g>98?gfD=3wk=n zZs0?iwrz_d_EF%}Fv-qCn9jrUMHA*MV^ zR;X01^n=js$B&@d_aSc$w|Y~Dl(T2APXZX^M_E)WCe&t%vA7ly0Kc>{a~y8t(A8XssYB!K*j4g4_^cI zbuXt|&kR15(}jQ!Su|)RiHCG23^#jfHq!Kw?kihxU)aQ80W<5Dt^8JH6f1%J8YmDH zUo7UWj%(B4XSwqe$gln~qaE)-g6IXTcB+*Tns(0St&uKGOr*ja5d9L9X>Q5{msmVYA+9-6I4?R}kn%-4T2%;h(5(^v9FZj1 zO6?+f!^aR^i9Sdq-u{Z+97#M7xM~HU-1bVXNo9vxS3F99h4tIs@P>=ID zg30!9y+^y`9cZk1lW68gL^d;Ql}3v8d#o?Qw3B<>*gSIa#5$%A9jdfk?W*xy=G}M~ zX&w_e@@w3v2{6f#OEm@&YY_4NMSCZLi|ms`bqA*p@s64zN^z)7?V#j4(+^b02(uX&g#WT7v9@@xkZ(%={$feQk#Bbx1PJ+#jSM1` zyti#FmwCHD_1&5T41cQIQb*Vl!~iorC-o8`uJZ080aT$;(S>7Q4hCM-2~X&DepAYJ zOFo!+pDzGE#}AF`1NmBc)+X$?s-9M%Uv#=OfBnZAy#{r;!`~XI$X;GydmSjJM3m4H ziKQWHFGSg{id>#19EeA|sQbzFA(dM4%^*Zj&IAe|b33g8G(6Z&eyR;EOGnfrJuMI4 z-VLbUkn%Ll68m8{&!9s%^m{PMRvM=1_&4K{R=i|TY{2rdc7cbBSz;f^ksvyH!R<)X zU~p$>Ex-XDi)%iInGIxag>}T4F5;7TxT1o4TY0{~P9zQ@RdQ-d!b@`LNwpx?N<}J$ zAG`1A;Z?-*KwGWUz`6flT3-Y5#YhYlA-kWEdwH4oZ7*37SCE^)`3c;yy#G!- z@L@JqBZx6Ds_*mm+~o82poqtZAhOmJvhN(!jua3ez7>xd%&3G}FRBo+42fDd*FXS- z%y4y^_^eVXe4pL2l_}zZ1So|-0xuFfUtGjLqK>9Ihjed+^rl!v-%qM19eh6{-N3?o z(6KRH?U@|28r2rb#TnNR|EfDioPUO@L2Snk{LoLm&(W5RKzonk z`sbq=zZF?PM?(sNNUnvqCJfNlQ|h&yAhP0=uFA1*=K&WB`K^EEqKq|eZ(w~7%^)~` z=GqM;xsyTK7H+6Gzduf)`Y4+oh5$DYM*Nbrr^(u8dV}ih*S&A;A{?s$;}$IaV{v%r2E>hwJk)ylm0#==Ns65T^svql=oe-FBeP%aTX8*z#*R z%rbi@Vc$lP4&!bFo42=(*u4EzuNH5w29J~^eDk)l?4JpCZ)Z5s_PGDrfsTPFGWp@w z;sZ0Si>vZSjPOR@;8W<~6dtk#VIP74H6?%mrXwRr9ARH?0SAoAA0CXM_#*a8yS0xh zjG^E|+pueDU=VCM2@QIlOZQsDu95-~RYP@Lj)iN?*=-2Qiv&)$*@ub*mKGzcK|72A zCA|QcQAysnCGNk-FJnx)>^EL0a3!yOJgOd49>O_|lF2)8R~Ip3MrGI^vEN1;ni`T^ zJ&&`_;c%)6Jo%4YGm+=AqiiYDi5L*|e(Bh&yfG$HC1OwVRc@RS6sm_I3ex1`G249c zuz9A1v?!CcGum2U#uRS7<@TBCM8AY_w?b1a;~uL~=6Mz_mT9{DK6QSup>Cc3Kwyo< za`Wtwh_)Im7J=EIfa`1wbk@$=-x_Oj8cSA*+gQ}22yU>~Y`%)StKku6rtGhc zB!*YWNPn~);>vBVM3h8COg30cHDv_TqHRzwDjrQWXfG1rM%m$nuL&2zq3GH@*tYys zsv#F^q8Kfu2q_!!bC?C%<7Q`9%_I3qRjC)iXttte;dhWgpPg+*EY3IDhL8MepZO^_-8-o9sfZ69D0(HC^jR2%8VtNMOa;rqR&HFZppQX&-;x1CaDsj zIW-Y@Qh@!Gn5=XRhZRKRZ+V!umTdjWD4OOY&8U$ouA&%a3JOw2x}>U)*G>+{Y4w_vE=E7W0NOg6 zLmR(M5ZgXaZG;YuHaW} z=tOIYioL#$EA|j4_}v_Nas=}*MeQg^F2w@Q28jmXaJWs0;K9;X>`Z6!O$}buq@_x{ z0ojdOU85f+#Ac<0aLDiky$nm%d0AoP9Xolh_8b&vJ@P0JH~9!^l4N3bfcJ8Kd)^?& zf)AgGBB%;Nt-}54#6I;fyOmHTAA!_glcvsp27?U4F3Vmu%;Ejt)n#cDVm_(05f4TI z)ix{5N@o`M5QF6;eU5Ioz4gq_qi>zeR8HfBM%%`&a137;U6$(*Og4vsK``%u%gk|e zB6YGa*Ko_G@p?mkZNikf$ygC_+Sbj4 zvG_Co*=$`N??Tf=AS=ppSw{niB0fNCH4;6hntoAi*9VFqPhKIp$0E8?s_xE^{~WbT z)g_yo$tVR9*aH7Ux}3k5i-%XeDRav*R=bN)epG0a6o|I)b>lBVi6DHf^8J{P=Q(|{ zV@-pYzGw}YTYXo-tb!?c{H7K=CTE{$NP&0nWf);RB=siTXp0$#X%%P_Ze1bbn|v}r zRqcmYwGc4}Y7l8}vSN{W&4tp5BRT(BD(^1N+vLH1LwU4Jsg4&>?SSL|JzhT%_xg!9 zAO}=&be0^;B%!;p&ghld%LUKUz;)k)6nvSu%Yg9&vK!O)TjEihiWiA#jW{WwJca5} zT=`gsy6}0M1a?o+maz)^)sRk~-fjDG28+S!7&Z9(gD?6`tbx{CI>br*$&) zU3x*FeuL1Ghh0M!#lmCb!daMM1cVTjG+=?=h4vVJhdsTr+H({1qhqOJAv7Hg^U;Zqj z*pejm*B9GHdFAVX?Ns!>&$IdD&xK{X>+|+vKPEIN{XbPWCf*BjDA_9WJB}at1)n@U zXZvMkE~3ueH7kMjRlY#!?U*7dDG8AII6^5d^*zv?NBI(yxO83^<_mB!si4YzZ;zKJ z%?VohP9ngR>HS_;H(wd1Qk6c4Id^!_=cFtpx8J0|;d3h9n}f{D1l2~PVhW&&n=!kY z4v;!e!^TX8iXgjQJ7D8xGSnwl7v|RaJ0?MoZrS2WHHY}As<91YQl8{O#jIWq2opO2 z726)^ZUZ#@-8RLnlhJspbd2MFQjwvCd#yCJ6JcmfX;-whfv@MP^7)ItggP;&gbd4a z4D8NfvLWz1f^V|0fond!(TdmiD}+2Q?n}8yR1+T^&P$HWurVy%>-@*MN@=vjh{OTi zFP8F(&tt<8j>8ru%X1D}S@(6Nc1Orm6L5rm=L_lhJp+j@n zyu1Nbx3&rK{LMZzz^z&hi#;t7W(^uRC_vf=t;P`wbD%wRTBLzFdvV=WEV}G=c;Y=` zU;mGck~7K0B$VW8j`N|vJF--|Xx-5N$|p?^9C3vU;&4!p1o0kO8(?fTf!esN#a~7{ z9L0VepR-fQZP?>5`64!8jZrJh3d9y+arwyNST6>rqg`&eLY+=y3l;~{dpM4`r;!n2 zWq9JCEN7jR*MK&6rwQa=Zsn4^msMZ7BvqOKd?*`x4ev)XOE`ZB2+L#B(22j! z+f?m`Wgw+0ZC`6_s+mX81uL{?$WoOR<91|h;?%daTIE%cHDj27!obEgBsb=dr@|YT z@IeaSKlMuaG2|VTKPbiwosHF7Y7<)VuRheOsnM%TaBxbhN4MLUOKfsvjYyQU(X{)A z?8m+R9Paw1D6Pt;M^U1!yI+a!UjZbY#=0uLYAOIWB}W=fVPb_awh5A3JH$bq@@9Vl zlHSUhA8m{1AH}Iap>Xdx@l`@yf$l4Z=qJA5JR3vYBJHQE`8u}%CwKDjcdLGQi5N?EGf)4!!{71?o8KP~37cwMZ$FA`RTDAWH1Var;yJ}?Y&52H3A3L=*g(d`jQ z=m{~?5G%+dAXc(4Qx&{ska~YX+)87>FfI4O#hXcKsc>;K@@N(YxeV2qf&}jCL{Ho> zl;G}f2pvVxAy!Z9MN4hg3&5>POZ&!Wdozq52xNoI%5Je)-StutisKfB(yJqM0Kd};HWfIlHT+=eVCTYcXCIz+jNkbOC#Z{l% zj!U_Zms^ZvqP*bG(9k;F9e}wax`1q2znQzcWH9%RO`L0+M9998wo$DpB7E#t>Uk#? z=-5xVL}qdmB$2CiYpR++)cw7E0R%ZUg>`W?5#<;mfsr7Wk|Vz=w*lo9Z2gMn72n6U zGf!6PF*_1erERR&mw%j)w%*PdQHGU4g|D;M?LH{SOSl`V${UlMrldV2v*y-Lz&TIR zn%6%gxMCEPyu~s3p^iGZgTGy!8~K4EzAdYh5c-OgLuEPTr4Id1091Zt&dI#b?0phts zM>HwY7}M;aDC|(7q#L#Lz+FMvoVj_lAZy($fOI8T1LfsG$%kwnMcrC|`#wJUcxnGE zdc5`uC5-27gPw>xvH$9c_+s;R;Ks3hdK-_e$a2r692T1yWuhFVwHQvS(=zhS%ML4! zqsTYd_$^Y8=|IqZo|Ra|n_rLif6mI}QqPn`P~h+J1X^j^d4sp?%@|Bcv&`j@^a-Zw zn$$_l+0jDHOqM?V`>ysB|5SYvicOzF$dhdaLkxH}5|JwKoLNO%H)ntG?b~d_EKBa7 zfB?yBEA|qozX~rxNpyDDRO%1-*N@-yqeYy*DiGFU{?$ml1%co&H0pm=mcO0T1AGBR zuS#)Y;h_^k(eSuLU>JmQo7A1PF`0qRq6uJg^g-LtWD-0csYD^73!ka5uVn1(JM644 zv1;u@N4->TR!PYg3j7g`XgZsk)S@q*`cnBuNNjSsQtW=NX)sLW98UtbD$Cb~(rf{B ze%md`|JV;w$VL=afvlh22_8A6Jt>iTJHT;od>e^#P z)n9wx$DR&q5{QA33!!v;#2DcwZB38?*b8`A#05Nz-I-d zvC}%kz-zs?%cOCu2}+jcQXfj808&6S1;CAsqhbk31*-*kt2rpnSI8JDygw6ZaCy`z zb0{=Yt1ntwj@ob;n4)ao5o&hj`vmXc~D4+c*4bhsg^fg&V*;>HdZum1c4MlJ~MpS3(P zX@v{)P>gRyAg6QF1V^3kn4sXbt00e`rWk>SV?`bXx(lvYk#W#>-McHN{0=B=Wl$N= zff_TGVboSjN*py+3{4&Goma4i3uqYcl#@;FnGd-JYBI5Y{sGnf^XW+Xs9(l5>q7On7Ak%oX&%c;#gP9=6xD9W$UgoQ)VZrdWs~#gia{6%U^WB7 zqiA5zCnFc9BM&|*nq!Zflq^tL<-SXGPu#H(0gxWATg5Ft(Z;be$5MVnmh88>M+re} zTJgN+g}_U$Z*H;T2R8LP(RC9m?0D9duDJmtv02c2VMN8gKjkz32<`cTTZKNYcEc(h z%HYkc@^aX9^IoCz(+qFEAMfKrF%NG8H11R>sp!!RR z`0kBz?=qx9gS2HM=6gyq%HNDmbn?wRn7^QLd=FDvbSj>LM^m6Sweg9s-NphCK97-# z!T>Wy+b7ZTY^(jgvjZjZ1sZc~K0M}ie6CLOD1BHNc54E|S43o{ci{-GAz4Q?-f=&T z5pI6;SgSaHDeJUGLE}c@oJ)DbvO(VF{Gdb|EUdwD=RnL|;iq!eNzP73*b&|%sMPvZ|t{&wjTvyo=e7Huor*-(r$b(M8zGg?enI7eUXPtjGRyb-0hD((Wqcx?) zUAZ9jIL)1oiF36ViX&Lb^r0((>q=Rn6w)kQy*9LI_NY9kTz*bBNz3 z*?vM83(9SYJ8Hsk!HXw`TgKicS8Qf+#aub9~h6nr_2Nzd5STr{ZA$q!v` zv5(QRT2BOF8;Fg=Sm}3Y^ld{L>VJ_W^A+SVzORVD;Cx_8g6f@|9k2Nqzh@q7x?!so z*CehrbX}#yYV54a`n)J%*6Zz>g<~h%5#>K zm9Pu(<R-z;t zzP*VQqsK`f;OGVW;MpkrP{q;;MM{_mYd;aiCq48}ocL72sVfE8U&Tf)!TU7S$50yx zgH#g_N)34;9J5-qntB=vxW?LLgSj19mOQkApXJwHphP!9XR41BnBZpO7!dS@;FhrY z(-S%0RRWkz(AWiPbspo0%HhV=iO#Z z!hrH7sk}Xm#mGlMCEgR>?bN`I5GFn+EebnZhaz zDn8X4yc%Rsg?pF6E2z7R&045LFuEUpY4;8#9l0t5(c2V5Zc{9JM;)PYMFW5NzH9Bf zn%w`Zm1HKkCYz%}>}#!6Y_uEiosNKgsM~>&hE6!$%KJn7-!4b`$2@JUQ2_C$eG-*l zlCYRvmxRxCVkIoPbq=cx(QK-mD8zU~7QkrHu z!niAgwVf&LNuB03{uf&`U60u;ZbBySAE6_^=QIBV(D(;B(sT*;^66n0%dy~N&uZ_t zhoTz!r=E;70o0p$lB*#1AEKo75Kg)!-DnBe07XqdOSGF za(_yjN(gm z_C&6gFAyoW5jdE@+YAq=y%?*BX^pklrFDr;{3q5pPa19yQR6ylhS8g0m-FsaMj)bT z=XnWM&Rx!bd+eCCr7DIRnafC7=yG~oK&4nIxg1#&q%(~#pU`VZ^vmNsacGSzy~GK= zH#y*g4OIymB=W+^hGSbWN+n#NgAq~EMfP%|kjDT5k)!#bq%qWH&$NqPpp@G3eRXzf z&ORRx^W%sAQjC4pt0Uq&(E_aE5K9fDF5WA*;9q&Wh8^??P!8G>z|mWh_J!ds56-Rx zl2{h5JBF=42|4ue0_yeua&Unny}ChRTK5i@!m}jG3mKif$f!1vQB`)09F2w=E=h3+ zBLZoe70vGbPc1148biV<19+Nc{_JUc14k3Ew|{QN&;*UcA6gP4amOmS2O@36k~q{K zL@Cs>-r8MT2zp*rvMWdHXbtk;iImmS)ey6xopLr2+e4W31K9dGS`T@sZs2o3JK2`4 ziLh?q2ztD&I^nT&ujeto>89oD@;0g)@FG30GpY>o7=Lrgylz7-nbq<(#MePB+DEYC z!1Un4AWO`(l8cbGV?ZOs)+mVgQ9{(iC-k>i_2#{RJ*5z)p&mnx#7U*LW=JubkD}^A z1Z;+5G84FL1$b54Va~|eOBfU`%NUGo2Ew+>%41T*!ywu)Wj8C6q?=0 zVRndj9BZ*`MhNCTX&ciXa~^XKb$@uJ7UDCo3(lHC{B!rsy`6(8x1I>8X{<(!VtlO4 zy(%`Uw2!$I=JO(2>3dR+8c+G`6Jbt|pTKN@h zvzBMC4Xo~B-t~N-aRBrY#J$*>z6fY;B_3olZra0N8(#f~UnsrSsFR|}MypIJ7{}JiPZ+d|?1>dw0`B3yG@@_&B z^6o~|DXVl5zA3G;iY419tzjr$(&HTP@#Xd4bhgvQ8e z<-j8aJ7s2_!~ZPBFij;|IY}vqqE>rCo;l5}fg^F8ALi4$9qE3Gx=|tBP5dq%Nj-ab zr1ADbXODdq&~mPC(5UmvLQS}r=b?yobdT4D%FU}D<-au? z!7@~f(F42CQ}d2`Vnuro+-{{>2v|Ys9ei72tUV@(Qrt6(s@yK|lxy_k*>3x2 z#y(j`#Aw^D<(tdxNdSS|QW*#Mcl(vkQ6Gx9ull9!MSHT$loGV_vZV9)+9@hf>uPsR zz+0(8ZC*ahyIkq5{{gyd28D+N8(dS+*%>7u_<0yNtGlHKS!*k{;sJDr5v)8UG%t_& z75blG;D^%)lgKqr1x(P1_NrS;cOyZB7<3 zwc4gEh`Rz5^)1R|&NSLeaRfrTHEaDtPv6)F#Mtk8+l=IALqH$=T4Sab_?cNy%mP z_iRPCTI@26$-`atcDH>9g`n{TQ}P`GnVkKkL;8?zRC1t+psFV6#VBXkgl3}D_AV>V z%AU@CJ#Q_lZ+xW9X*MJhdYUJBkR$yB5#oels%?2A4BRS&50?V*2*kb0>R>WQ;QR+_ z<|*Y~<=*DI9qw$T4ozI@iMFDbw{%kJn<;9*z_qo?A&N7gJ(|k^r5w4)l8BBUJO_=tF;(EeunM_hS;OV)i6lga&pm(b$8q z2nD5qQL-r*4+>%H`5+)IVekF<8s@`WtM*C{r3%707orUulH|gPQ!3OhM!jiNq9BR* zaA*={q4EW)?FDBZSy2?g+CO=@(%mS@W@xdi`+4dl*@$~>oa}41Hq&K4xZOE~7tyGD z6f)yZH9q*{EHrZF@SGPUzlqsXu>T#&BRS&Hv!mQ&-$-q5pfh);h&X&sMgs)bxD+)EGXZQlO5nOP`|S*Q;~Jp124yIv&U~>J zRL>EcCWq|piAg|X`Dfij+zs(fm&=IUpF}L9ZB9fv)=gZam%%Mta`uj6wyy*GG7XW2 zNFJ7j{T&<8)@oJ!4nbIh*g(^Nfr|Vt@O3r4lfr9D9Irje?Q_=6HK!`1BWEM!c)eOm z35OVNEy_A;KWyQJhs!-0JfK-{R3=v}K?qrLdTp=Svh;$AL6v^9_DsUZTSNA6C?UQa{30QavLmQFKmjKqk zB|`dEPR32$ko)DJ)vJ?q%(7GcO>6*f=WdBI7s0|*U?)Pc_0j!6)U@yC;DV5?>=VPi~Xw+bu0mHI(Tc9s(>79 zQ$pqTEwEmH2l&2i*X5`H6uN(tygDF*`!qogc&F6!Fi|T=1EVQf9IXnU)%H4dOY10B zaOX>`<0i&;0t8bVH>wO0(=wMG*)lB{>;#|93hW$r=W$@$@nyHYAFNVKiH`_*LAKLe z1i0O*UWJQn1h6$Ka6{aQ|7@zn?$%kX!|HQ*s1hGrnd!JS={A;SfQ`gA*w_1*9)zN_ z@V@Si4A~D9PF#T}n#|z`Bj) zo$Z7m%4u^9`!QNXwy=*XY~c#(<=3JeeYUPs9!M1al|I}w?r>}hga_sFxh~8JIUbtn zJ;&2Pj>iX1$ZVAW@0)Fm=)g(}LP+{*DN>bP+Mw}CGkX(QlPe{pxfv~%304QJuzX`o zbV9s%3ru#mWP`0`b%0IYu5c4@R!dStRe)o#v@>4JS0I!T>=gdo!$Z0> z6dqQHeSNeT`xwnJwH)AYKRpK4L~6}6Lw2CTfxeyW)r-{%z%r&OqlNq>!a*-?PGvYtIc zaclrD!KRJkUzBp{|GVM!|GR?y{rvoXF6BK4O=#olL)BV$@s5`xy&jJF62iUbQjlQO z)0$ zm=8aM-Y47AEe)8N^Yam;a)x)z@Fh6VIWv1lKhRt#d7Lh^P&&0=r5iKn+S9J;Q?C#a znX)y$rhJYaGoy%FmlZCQi>2I-uO4xEOoZejQPX8#4)Zj#0ZO}DT)k^);7p^`aqd$t zD}L{2$;rDoyX7yvmMznfaKtsy&lQ)6pw=a=(v#pnsq9C9^cA`eEC*({E0tFYzgt7zw8KIA+s^jRSior4YHR%My% z!04UsfN!3!#I%Bl@?dW1GnzMr_VjaAX9v|Fy?d;7?n0IA+~s9E&!ROd260}MOXVcT zaVl3@rorFR%#!NEYvs- z;?(UnnV7tOC~Oo^QRA(M>oZnd+XBEv1>VToGX!H^2{VuTa5X=hV>*Y|Kx}Nb9Kbnh zqt#2|k@^uN)|-Zam8~(k$RwDlGLK__5MQM_H4`FYf~PsPT%+RG<^14xMQ4BZkflFOvWsIle=-Dc z~ImI3Xy z((OEg@f_?9vUL~0VW1fSgcHkGQnRYk4|@)N=}DJj5}~ZnRi9b@Mm|x;Xf4RlcFX zFuW!DwvM+A79s8Pc<3_A4JTFu19wXbT#kXO^@{f1$Y4LjeirMdf=r!Wuq=*|a-^3j zZY%PL`LxJBOWy%J9L4FC+WtnR%-WWk+K&|Ews1f#WI$d8X}y)m+2h)w_b2P_3hwRL z8WciE;tYgPig)v!m&JJy*|IpUAkTViM!c@BFZ5q4!GV-H??&uV5cPsYyza0AZ41=1Lx(9J0^BDG(z?5ZcvE zl#qWCOSsBTBUHozgv!E~d7%O-Wr^{_>>Pz~jJ4yFX(IjpU~YG-ee-{-N>d>RU*R%( ziC=gR_%pC{zBP+MM4z?Kc>Z0xpeOr~Zq1nts(0Cw1^pBz-$!lVEHR)ccWO+7{XT6c zHX?_ZT|456#ifDwxX2x#4TRuPtF95dHaxW6khpL^Mds3W@ zQyl+l8ycZdBL;nfW{5SK(9R*t=>Hce=Ok47(?AVJhX>&sn3B_QZ$n}yVJ3tYcSi&Q z;R9#;PZB|SYG@uM-MAL{AWPn}3sTtwZI}vrDr&v`|qgbw& z+hld#=5dVI2mcsbEO&QyAdo@4o0?0f*ul*@FAwGf4 zKtLn#dG)(;Rut@eF3#U-tH>yXm*jFvMajKii;CRH7ZZNDEWRuyDN$kjgPh1a6ng*4 z1E`0zcj;Y)?Zw@`Hs;CpUWNkZ4Yz+%9)$W$ApAN?q&VQ}ntA&y`p~yDv4ZM-An;Jt zz&kc=k_MGO*lKrP%LxXKZxF|)<|4U02Z81K_nJ{rdSKs~GLk-|nXfz@=%r0C^<@=k83&Lhea5tm2UFf-}-upR_$sm18gQu`-^~er!Nod_cgGw5yvw zxCuwf5zvdgWYCL0gMno2%!K2o3OSp=VMGdBzFWN*_6IQM8dn$6N4)Cid$R$9b}BLR zZd^wN&Jdsz;htQW!@?b);|C>H=O) zSAYz4jr}!)DrlQvcNz-%Z+32-ZO_@I0gdzr7)798TIerPYe&@DqOHo-i6)^`g9zaR z6y;o*x1aPOu@yW$9Oius5Q7w8W4v1>W~qV)36{kLT=aDGrVKeTXh3%2bEpMFdC6y6 zQSoR+38i-AiXygLZty7K46X#R^#uFk=^NxI>*S zyKGjlM5#=iNbUA$a2rx)pG@xEQ$=_fwIiGDi>>ftc3luHwJKWr1fR2n3wf>Ig|7j< z5)oM1;nqZP~*=MT)h*qZn(f7gWr}Vx=@4aCG_nnVYQY-q9S`S3S5V3 z`?p_*x%8cs|Ku~vK|}Mg!f|_XWZtseTD;$3YcX-V?IF)5)vnd~(UV- zK8nxc-AeY_D(1n4{R7p#T30|@0o#{i9V)f;c88P4KR~W)x#^GP?0h~CPxu?$TMEDs z;Z4dXi58#@@CeoVV)2IBJNUwPtoa{#zJWrDEP1xI#6mnn3<1Zoqb=GVG_o8z?iq2; zjDo#>o%mP)Zi|gB%Cy=z1?Xv0^5HeAemQUt3*To)ap0>l!iC~iw0s5%dm^793TI+x zrr&;o8T^7KOvnnlfk+|@h8jhCgCXwPh2)h-98lSA=291XXf$K)UXAq3cH6?V?NfWe zPU-($S^H(7gGnpoHA43*WU8hL_cs#>WC#zX|3rt^U=-p=#M+npoDse$jlsk;B=arI z?jQ?~WpF<^2ZtYnfDS~`9~1!`d8W3xXkYcbYGyQP)W~bPv2toV)FzQE=>7vX4^ey^ z!>W$a^W_epP)fk(v$?^LMV=4sgvctgM-JHe;R2jQ7zg#DBNxh2vQ{2go$DFcennjf zE|q34d9K-J#F#&p;&<%aTD(Ft>r^}JFKygoB5R~`y`-~@bTFw&H3aU#IB3XR4=_Tq z`J*bsV@Wti&o*2`{G(}mNf2c_Z|b{7uYN6Wv-0?vPSkdOLWMOms3`IZ8b(M+JnCgF z?GG*IEOEMQzXL~Tr^8%+ucPZKn<#gwF>(M*^d%KkLoa~?RWr$@a1$36Vb$02^HoFq z0{qTVfQX;rR+a%O&PQX~I-K20M4GWD*g{!t)vL`X)#>$WyKHoOtyOqft(28!K7{}r zaCiAW?OP}8`c6B>at3f2;mqWp$<%y8=QjbcI0V&GVjs=f**GY1q#v}o0Y^HO%UASF z5LBf36Ijyks5562=(g1wuNc+C`;WFO5eJ5gfBY6dq(w7@z{>XrmS9%m7+!UpMDho* zDhxM1&g{Z)e;_6LKGD$k2VRF=!vPV|tJ-Fo-QYB-jls*$(G2==b_z!R671hC?<&+4 z541w8{zL8F4wKTwU;Gw9<2srj9^nO!FDN+y6P&qM873_8OgI%_IXqe+H$7#nouS1!i!@&7Q-Y$`GEtD43+tA{u+%g>}Z zfhjdPMUQ7R@ORI(+hKwOPIxG9Ql0Ne0F93er2#Vfg7hi`#%+C#0U8($%SP%>#@+*a zm4m_>NBM>wp6g#30^y20gJcq0ZG1MSZX!EtxQ%lI52uiOu*JTfo0i*aJa=03z;*+Qcvfmp(~(9YG!z)G$JJ3xYg$g z{K}3z4oPfE+eQ1##nHq+IXsiHY1=8mx-f&hQeiU) zWF_`-LceB;ObW=BV1WGtd4BQlbfQFTHM?Z=`|&u6Gi0VIG5%V5ZY<_|c9bpfaFw5vg#uQmxs*eCy&BE)0O zo^UCJB8-3&5F#FN`dpi~2$_|2sQ5+J9xkQ^Yy2*2f6)HkZ5uR&b4dQ?Kh6D&XHp17 zILFPsR&^a~Mb2ipy}tqb5~FyNb-XdQ5^6KtA!9$8>N>uuobvzvcbR&PfYqwlcbR%y zpC`D8+MgmkFJ?EAzT+LR0HSHz)HWturf`# z&$@SfB-ApR;V!WCg+W1nqu*6XQMl2|HuESs?Sxl(rcvBX)_O9$&B*j;iUOPp)g=9o zU+6NLs&t_}*i}_aAm5U9wyW{FB8D2kf_r35P-QPpqGpziMZcZ1pQ!>FZ1H&mtwCNm zS*xj8v1TA=LtyUK?GxU^u9voP1ogH3^-KofATRVG2cL;_qc)Y8yK5R_qyy?yHgFlq zKnW&+c^(xT5(M77O*<(VanMG*V|F4AXrcymKM#mGE#+MZOEjQcq{zkCy5zfT-TFq* zt!!P+C36L(Ar;uV<7Debil%NTC{4P=C9{tg8DZ+y^V9eA0-wEJYfI1$8LpH^@FV6L zAa$RU!X@&Z@@hdS-5qlSw>}2wMIId}%2NJpVNL`~aE586YG zR#AigvR|$y-Os=bZpUQHwi6)q+4q}hhD1j`&Npm>-&^Bmt?6CZ4pDUEux(-J*FZ!r zR7chQT)Q*$f*(UR0kDH1BKYYJ0>4$3Sb<)gf2zGFFmJQFdFM1ne=;BYLYf;nZ3`V4 zi8wbi@P}Ui%CD(%O`%^_l*kEaV6unu`(WfA#=i7c0Za_tWV5yKLRI$hcA|^X*3&Ct zd|T@AHA?3bg1kumEX>>^T%7k&$tukI60RYw3LAw3ldq}G@%q+Y2I6f?H))nZa@ z1fxmc!3f2WNK;X=0y5}!z#7?*MZsM1kIKACgK3H$x9f1aCaDESQ=8GAsb^-aXl;&Phr4a6Mq|}5c@beLMGC4N{ zmW>mutVWC<#R{LI5sINKg4T&tM55T!7sBHWcx9-{8vdFtw)yNcb0XlUC}wFp0t+S~ zTbv^7z$P4YZm0&jM2*scAUspJqnB&!S`iJhh4c&5rXu7D6C-kkDhv#UXN?j8VigZb zCpM@^vC4j3Pd&yMyLw3KpOHdTp-i{*h5El5=LVuXD`yvqE&r|EH#OBTGYE!vat%e5 z6YX^Y=Nt+i^ADonHF?q$58LE^+CEdb`NiUbfPaYLfwsP^ProTPHHsv7OY`c!H~T=g<2TGc9pXf4JcTG_Z5JC0TAZI9*yUy;&P8!Nh{24m+}&Sbj#6{? zvVR$IUtVXs1J$^BDMBu>wL{@*%h~XRl~G%yxto_n68J>yrlptygzcpKaC#PWN5gzW z+KMwxfD$a{Gkj2$Th4$nk}s5IY;AmI-+`Zgj!!O*q7_x(IEuWhZH5HGUHNciTcltm zVxBypfR9eAxA{n2lMM)BP-M|DNHA+Q;S=R$#^FJ}ZKD(r+@i}7@8wE(bxj(G`FAZr;ffAf+Vdxm z*(0g=q0)h!T*}HmiZJVljEe9ATb@P==K%1|Qc22dE(LFj<|(A)0tXW7FSJ*w8dVcU z=0+(dje?>+%+rF^(eOg_L^lP~C@Z~A_X+;3W)0TMXw1^}I84pCZY~$5FxNAn4}Gy0 zzjBm^M+q;nvD)1pAbMqPUOVPXoJn9Z)YbdG3hpa+YBj+iLBwz?QuuflkV%%nnbogS zId>dyd2`Oz2r`KFZ;D9@NqDl_Yk1nEz>N;IEC2bKy#0(+^k&@XQiVn#fgWSihDhTX z9C@)Y0`pg=fo$j|z6#1@bU+%v={rvMaVE;4tkS`kdlbohoCB7>FyKdHLH;C<(>SG& zB|`Cgato~N@aO4#XXTq!I!TJ=6AZ-E?y{CsSkK#*cA!6GQ2G$zQ7QW@iGl_)=QX@h zRnCq@-7_d&wt+H{Xj5zxEj`@=L4EBiw+(A;=e?S@Z{~5Uzo3@uRCwc*sfMQO#ssL)6YV9jMHHr&=2`mGLd;v_=esPT@Y z6>9+^{4JFs%+t4*ayDnNVA5=E0_U3v{Xi!kg}^NyQ8*QEksn}pOAY2B*`@B2P|Y)u zrs#I6jMJ(!q{gTCFX_2Pj^H@%jX1u27EXLK$FjaU8vh$ z-Wm&M>XcatQv`d652zASbU>Yuipi)ROd^YVve3vv8a<_3CB@qN{JI9}T%5C7fukdc z9n%dJAyKvy_aXyp?d7@$6*hzTU}1hp+getmPv_f$gbhU7VL|wzwOHS5VDAW-+!a!6 zU4$>p`&5u)c%_ovt#(-#A1L7J<5H3-cZ5qQl@JeJM=gU8;<=as9LpU3=}*9dc)9C3 zd6R0p2_AfT7(HSZsUWTuB|x3Eh98!{%&=9PrfE7>9AuA!61%D$*exHZv(Yi*)g6}S zB^Fx=nrnCT)i7VG9OkYfWE)g1_&qjZInRrJ&lnQfb7y z?XDVZ!w1my6N5`aRBfy5$=VFs0eONN%AQ@qZUj% zFB%ciw!h7m4AzQ+0`KI;cZ0Z4fHQ;UQ!x?BvP%8oUSk`szw|S3lXJTW- z0ZIv(o888I!tzTvK86!AAg0Q$uD7Szs2RYsyLABSx7y(SR%6p#k%ROEuyiv=(FJb# zD|JX=2+q7l{&EsgCrUvkDC`gs;rhBkad2I0?HgG-J34PiV#_-;e&dCd zW`_r+-0Px})alI5^=E?~tBlP|qnwpM>7Xu3d=Kk5TQI$&PU|o`Kgn+s^LpBIbBb>$ z&2uc@mw0}`=XUYYfnU1{)b=qNNwDf)bntc}balb3JA^%x+fgdF-qp@~`l!=Izs}d7 zZ%8MAKfY`p}2 z{T{G0B#+N;!4aNQ@8%5UDf2M6`TNM_eO$Z^E|;jBkc`7&dfNdx z#&>znlP*ip?HxG2Fdy<4*PDVtyVoW2QM5;r5!y#Gr*k?BdPSQ`GHS341XGx2LqQgV zI>lpLB}+QOEsP2Ci3&jh85sA>eRoporiP4S#hrkFu2>Dp9ZC^UuBJ#DtMUdY;PM!v z`n!FDNcel)`ZW8*Xm6D~gaFnNbxeUP8X^NwL=?F7cf`WCVkf2tR8est673VC^Q@pO zhlFx^qYptvJtdLtdZVl0;xycDME_YGtD8J)w!%g77}i=MS&K*pIpB%5M-kA)Df?;z zV1EsFTm|(h><6DGmJrTtSGIR|E3uE@zM45{K2uv_5D8zcWJnbOW~m)FWZ$f#;KueK zjt!b9RV?jjColaki0rrQ4#suJvit~|#0@MQVPZe`uUb|`3?Vk?Uh;g7T z5cd5bpug}2Haf|*NN6b9DS4drT>yp+1bn=ye@sfQmxiLMiug`KTJU z%f%dN+?HnI608??JY!dHZQ#L(28XYjsyicgf1~xJ26*8ZGRA1kLHY-YAJmd~0FvaJ zR2Jv#`&^Mu@~8=_Yp}~fpTS|ZC}<6LNX0b;ko-d4{yT4Hs|I6T$_{KIL`u+Wf#uH) zQ^<@=i%?JA3y~h{bf)NN2}J)gTa>b7$zebJBFClCE9241!fZuOTqU)HKok0zAMprK zaGs_hc$D;RDtT3OKhwoK(gT^+l$8})cyYNUEq0vOnW7wL1(k$QWX9YXE@ipE;1AjQ zb5FJx@db&e6EGBA3^&Tz6A{$rAeSQ(ONOD6rlf@~1t}DJthC~dd@M>h`$uBv6B7~* z8nPHf_GGvdw%KQD6za(^nVY0pg!ZGcIF)1tDN5eakGqyBn(AH`&*Gb5lM1On4{I#qeS7{x%SUk6=Ng7{5Yb88j!A7gfoS3Zun&Ul|ir@Nmq@!C3NVmY!hWirCVA zdt56R@7I0#WzP1rY9oif{&G@rPl7et-Q+es3y|uz92Zh z{rE@iwkq6l50`eCsFM;`7iJwti8Bcs(3ZyjV4cbINR%QgA}VFqt0&ntes}5t>;w=3 ztdC1gEIG?&1)~<9cb4@jev{%Nn)o6Z@?{u{`?X_l{Y1Nb5bD6g%w!Xq7RV*!8`dZ( zGe&Gnx#Ft{Sz9|G=M|*g38txDuV~??i%7dOKF8zCAfY5n4dYD2 z(o~6?xXxdT*}b{{N7$Rk$6Z(Z|1()9Nta3JGHDB)ZZw4!rlr8NY}2wdlr1eNY1yVI znxbA)+=7UvbxU!%DR3d+!nEKef?k562Hd7)3knz(HAT=#aS5Q1D###(^LxI|=QC-! z%lG$RACG2cKA-bG%j>+(@)lc;dc@f^DNe2#@-D_)$=vli8f z0Y{J;6(xTrtBp0(8z9$)W@tih$LN<(PVMtNe0*Dvx*{0p;w_J%gsbTLaY!b-JEd); zolM(7ov@2F>@?jD!7M3R166W%_A!f5dXU>~sO2m9sikq>l znpPFoJF~L13?^zrsdTG;&FI29oXVvxh?#IB5=4sxF{gmmyk~&S$OZ8L@AP3FKDbjk zxNMRgrHE$|8NdWf4~{UEh{9w^n>^2{u~-+LWW^re2@pb&+gjjas_YX%o^vl)A^Jgeo}8U}cnjpM&m5Fy7dVSD9#^!mGGk z{yhUCaI88M6!H4uVv$QimE382Y`PZ71&#f|?XFukDhPvA{dOcZ(QQiG@4S9{pS0s2 zgaXmp(6Q~1buUmud7F+!yHRYN3Ni&1ZBoRCN4mJ8sU1n=x_i^|C&xU7C@3P^@?}WG z1(8G$@}-$bb7sR6E9g@t>s@PGDBn3JOE>;=ESNcTq=VuSNqCU@9FGN(RZ0Y>shwF7^23cp6r%DHvXy=e>G@A+ZUiA+d82z`JY_rh%sr7?EXEYQ#fa zi0rVmiDpj1>SOLa!^-Xv?mfBxtc$-R&t*sR=VqVUIsYN z`!^BvNnLOXHnE_@R?{gGM9Us)-YMM(X2wYUZ;fvbxooWCoM-OTBCijpK@r3}zTl^_ zj#1utgVhA90dI$x>LJn;?7J-vIM#y*3oVrWyBfXZKg-6) zind9KV{QUzRMZ4sVh~5!%1Sh0P>^^Gjgpcz}m4Rj=6p!XW6L6~Q7E$PLXa+v9g=&DgZAd43>}Si!*Rd|YHZMNZ4SIipvfIUVgReH7+9bmN!O2{6LjW!UtXK^oOT!G z=gO-FK?U#3W_a@BgW~to-U`ZP!TVc5Bca+wuJUGPJ6(b<=M;nH^t>ukcjb*4 zy+OcHH>j-0C*HD0sY>vq8zc4-G<{sG^E8dFfF4(4JyoElfOQ6b+42~-MXPi5S9IL0 z;sp0w_!{SF#`+THr^R+}(Jl66gEm>asq9d{gZ3<`T1Q~p;KaSrO-eGpBj8vDxOgveVTsI(L8oUb3IG+SNMpV76-~SDJAJf}G#X7#Y|IjV;%aoBot! zl!A{GoGPj|o2p##WVbeCs4>1X!iX$wBs}L`B(^7&k}>D8I0eVoLXTZTo{f#i>}O^y z3e85!PFOfHVa@nIPUx#Vbu! z;IVN4i^&oifz&8tU2ib$u_E+;ybLKv`9?d)3z^V+XFucpf0Nny9|3%o@uRj26<>^G zJ`NHH5Yrma(+j>|AY70y^Tc4ORxmlJsN-~ z6r@%YU?ybvng$c41!WdpjgU!Nbn4gR$6^x8fAKu;ptBONwTCsZP6;y*YI>4#o5ZqK z>eE2BTurP;WyJ9HW@zM-$^@7C1UIaTwBYEpthz7+r*Rhex+30&y7*cp?QIkO9_Nj| zALG~Hww8I&E+-p=sEIQW)R^bE4&p^F(IwUoBc3kWz zrhzA0B350r4;39v-hw$!FQLh)%d({bD0*taO0(r|G!OJ$L{JTQykcuN#MY_UuSTGL zM7K0AeKjwg<&;=t&O1|z9%FBA$k5cFc;J&z7ESmhR8%|J%8=;cbq`tX=J0~R8eK1n zC$Wp$pmgiR-#sAL@jKr7JEguJjlH$`*xS{KR%#rR+blmVtY{`#40}WqDv9Io12SX7 zXuxG8RUO*=c{g#yd*8~W0&^pST&WQG?_*Gn>w|JtKxQtq-<0)t*nbcVd72>e9Kzhg zsW(=RoD{`+5BBCBNkN{Y(!PS{;GsA6=Qx~Cb-^Ab?5XE1PispbviN_rwUCsT$zxP8 z7aQ?b&`j70x)b~DZHE2|T*ZUJNz>g`d5S%xbgghY$kamd6zHljN2_jMv!^2eg;6x`n|OM zv^PKglwSGp_|f^97|WAB0$04%r@mSo5tZgbFLbP27Y=?U6ZHDx8Hstj)YUL?vo&09 zGfAgoABBjdXi+3|0}|Lpc#XC6`drzU+90`Lcy%4$TN-_QS>a=D1j_m6$|P|HDN-`$ z`L&Nv`%!Y;m~%{u@S$tT7(R=KJl;;EY>6ahs&3f;{0=;U*IY_e|IAja57tDX|Egwu zPxs@2Ow)XSX&hvqJS6H+8V$X|eZgBik9+}jTha$gMxH)g$peBBli}WaK9n**eu?R~ zwBW#w6)yq;w7HQ*p7D*sGcz0-ojEoS@&lgs=R6N(?uUf}R`MNR=~J1zlSupziZJE2 zOuN-Q!+t{8sFVIgVWT}5vL}?*-P93p2RQw`Sl^`m21nu=V{R5vj7r;Cb=gaFp_7+M zRZ)++wZqQ94m6GBn}as^=AdzOo~r-Vv&G3GE>Bj62X$tc%hxgUML}**Ltn!M_`9er zAy)!#@wPczpX(l52Kw<0<*skHMq+z;s$_gLWfSh^MWV&gB)O!Bxs-_h zZ1M2AT^47-)+#(2i?YjM6Cbqd*cWl@i>k|rzSXh$WjK&i7`DVG7WZ29`;}6@HrG~j zNAQu=ti#eQX*ua7bL%{hX1IPK-*sUhmAV?ORTFJCAM^Ywgd_`|;F+%i%Aga3uYhgh z*+4#P#7^>T?cH)GsO|giryO%DN50UGL~VOY6o|(!_#(yicNSw#4xIJ^NE7_%RoKx4 z1$GDXVMw15tdD%r^>r~mb-%u{=uP^%4wrp^x+b9yskJjt3hm+HiZ?o8b0HZI=I}at z#R+Y0_JRZ*+wU%oru>vmMM!21IbIf!io*8v5iPwD4Uv46Eaw|p_#pdUMhytFRiBE8 zM)fJqZJ5XmZs*``0XeVnS(+5_T`P;tlr*mNE3ln*z9*86^RXcBEsb_lErwmfkHH8n zoEjtV%~RNBgK`mxg(PAEZ4cnh(SBXwztMZ3>k8eOYjU&FemoEf;`pYZiMa;8yVSxQ z-mieeme(e#R_xf6w+VfsJr1R9_c}Yb14gBaWoi(qkLvZCk;bn^?Vdm-evh(#B*u;u zwdtrur%R+*%XtbGQwZCXbEOsZ1GvTxb|M9CSYT^n(Rz#U6n&`W@{H|CnYy$z-7B6x zORLVkq=e&$5Y(0S_gaF zgFHTD3+=gPTS2bcda6IjW6h0OWP<~aAoT?Z<{4b?vVy%LSGEP?D!{KZ^Am_=YnnGD zN$xfmif_R>ETYdl>0$&)Rr5m3fh1(xU+Z6~Mg(m1Z8NH1okeTNQ(E@93gUopr=qya| zAzN8Jq-3`a7Lc+`*$~eo$Qx{}-X|xUwy0kWw?VKQ6}b%+k=wXHj%tcr|I>2)b@t>V zM3gAL|1sJm2ZEjm_V6OC!}!jCQy#%L!!Qr$5Gol*2FT)@&)F8E+@NxEA`lOE#XUoS z-AmIip0ykhr$+vnNB~nB9H2T`70&eL?By6KUR8W9I%uuhq?UxA* z8~0XM{(F6x4bQI*v*B*OV*{_)B@8*k2J^ZBbe#P$XJ2U(A^HG=DsvG0GwMNAGOX4x zjuu@91UQ({Om)LhyP^VKuqLCZaKZI}nXlQmX;=@j%-tA&+{(6M`FqBCej42W@rEkR zFGX_*apfI$Yfj)xPEf5sj_AJOch}wweKywjGnGtiy8UTjFmQhxGZ7(#WTbHgk9MAd zdBIxYx73C;teCK~C!qPtCv<%O8o&va0zry% zdy$W13bev__HqMMPXRWw6bjM^JpsHM?DkD&3409@Jf?l)r_-v=necE*?34tKQ95*S z1U02_o?rdhi`YZ#!Qci2Lo+-kvDPkx2DVgxX(ejbP5ydY){TarDGd*9+iBu~E0i$x zveiZX>SwAGDyW%IV2e20xpb!sW!-jSxfXrEgV3+oPCm@toik|LePKzjRptA!#5#LV zs;L>56Pul`?+x zf=kW3T~Vbx%$!yARs+PPS2`Z9{&|omIFwpgyC{ICf*uA>bDrQ?lkN6r1akRoDnmc+ zvpQnx*oqIW+nK5zAK$l%1l1C@2Jcgr1GD@Z4BLsMIcY_N)GQEg{HeG%u?o^F=`0)a zJs*GY@tze}NB8Ek@HWsfRmeOuMr6uI^(U+OClU5T4HL3h%~u2O(B1|$d7%NYK9TjFlgQ)O(gNmLx_62&YQ(mhQlz>AHiS(S5L&PlQ%fo!o>OsR@;IK( zYb7*vW8CkKY5HF!v%o4MP$6C~yLUHD-MhHFcs2kBH7MXG7ua{gjQ0m90#cBlWZ_4! z{OKz9lV5^@mY+N=@C>twNk4Qs)L=r$0c}vkQ(q*QStAQPW>YY;P);xdKN>5irzTx|1$GW-s{(||<&EE#n790!&?UC^& zBK}0MBcY;2-odNyO!m~{wb=8|f{zb+WkGt8%vuFKM6MOVuvhhBTlpv&F^+LfwxX7) z&zSERMF{GN90-k~%bQlRJmDos;VemEb^&kNgqy4Z(f5LYd6>Z%n?>nly2O9n{RABu!Q>7fNg5$phvle zPT9j}><^iDlu%oSaOw=PAU=o>$e4pZ-L?=N7D3MhVO))<{!Z&JLRz`@<1v=%M8(@vx1k%aq68-QN%o|I|cIeZ_rx=VGbRU2PVBDj8p91o?y zqild21bj@%q2Sl^H{P3EwHF* z&9ay{7UTHp$fp4p!x31YRN4xp66zS^PRtnQ(z;R1P2e{sq^ydb14U6b>6WTz$5^zT zOfG|X_R)BtKCh(BBaD22?w5-RKW|%BHscQTA)7kF@$Jw(WmU{%PVPkM`_&pSgQbTY z)FIj_=yy%$P#cJj>H>psR++bj#FmHj68e&eAt7A9n&WAod+b6-aSLTcig^ZbrxB~4F?&6|k;&e#j01gMo^Acnqx#3(; zW}tHih|vs*>IQUfDe1h7)B1BWVMvp=*e=s4hqCNX+>WibmOLr*BKefCz~GhV(*F4*X;-*<@z8atpzI6~W#uHS zgmy0<#1mA7cQ5br4zG*^RIUVv6oZ){t6F3gS=o!Om%&~Jf}yHTaTalVZdrVYKm7&U#>KB5 zf_fYkV~~y&6-ebgy93q8x8O5G)NBLAiTB5e3~uWc6jQs-ckwn9G(qINA^7v2Sa$4Q zf+T3H)V*|eG5_ha$O6q2>l87u;Q8iJX@0;*V!LMe`O>NfeEHk_iQVnszrq z)88YW$$0rQU^l7JJWo+*E;vlMe2PYi#L=quR4E}9kb|mEs6+Em&c>~<@laX(a_p%# ztA*GQxM!Nuqt8@Ce@ur_qm>c=Ucu)~#G`8h0(9~(1hg2^m9uKb9yg*RG;xRZnGQZP z)uKHi``XuS75&h!ZP`Z9)DJN3Ghv}yXT@n$XiaRk#P=+7?I(YII|Ce5v}zE8;PDPw zz#XX~^3GD92J9_y_*p7aE3Foe_NN%tD(Od!z(_0c#tU$>?OhRQh`MF0*5UEQI1pyW z7wAs0>>jK19qqc0ytW+}s+!Z zw1gvm&~p5JrqsOC*Q?a1+fM54%JH->CFpKNZGHv7n{q%svOB^!A#{`0ZgZCbvIee| z0moS`w7^c(a-Co4vGA>QX3)E>IOvem%i_@=09P#z;0Lh4Rkn(36mnqsY%cbg zXSHRv1x}Xg#=MAqwA{*fvS#umtyEQ!^=`86_X|-Sso1H;x)!sE=S;BAe42HVM^>v& zQAM%#eDA(E2375XY`4l$sD?ezO%L<)XY)DG8qF64O!HWVub^(4opAmmkJS=}xNstb za+~r8vPhA2oM784LPPdI#+Ll|oyucO3qM(Et~xX@L8ks$X z;LC%Vh-JiEfuPgrLs3qpK#w0k0ke}ItI&Lm-Q>#={vRb|ykw=SX;e;QJ2uIgUCt$F zxG}Db|1H8fdDMQ`E+6(sDCVjIQ>k+F;-e#W5Q}yPNTp@~2K&NXYMSPzme}-owmX4M zLo(1NqkS@e0t(WVqU+H@)RW1w`v`<=u?_tJ@3u4@qZy}>m(h)yx)h7&KplQ8v;L+V z_56&x-1Tx4u%YoYk4owR(a(Qq!ykxNG+0C9`AyPAmI9Z zoPNX3ow)-ooJ5;O%#e;GnNpmu&-dF6%*0qFsQ6EwMsboa@k?>H6D=8B($1t zux2o({PNGh!cl&T3UGgfR0>PkOAnODmA{WjF0Hf^|IVFW*oFu+H9pfaYBdDAPP=J% z8mUdzPD*x^lw_@x1Zhf3Fqn#!htyg3-TXa(t^=vxZ1hLn)j%yphDu&PNiso z3+dNZ*Deb+J^->Ifnr{jDlUKbF*IX*K{8?gd!z2K`6SJ!?n9Q6UnbI`?-wO-A>Rat z5f8JTG*mTh8^HPN-e#KF%FzmpXU(@T9(HxpO0|MDC2i6aCSHi9UU+Xr8yxTOvv2c* zN&a@6cJWqPbq=Vo%Q_tdme`bL73ksw5=M8qY4dGj_?3&skAl7JgiU~T=$2CsCFAi62$^q_{IQGQ;5Ja$0IeQ zOc*(hS7_kp`7Qy$Q$2GWpUZa+=cNU;o*l%BbYX6y1uG#)02DmSD;R%h2AI?mkprUk zg&4$S*s!+~qc|5u_>H=79=9hloucJR%;XU~&2-!5)MSFxz<2Fnq-O)ge~DhM=g2TJED8Zqn9Nw;Zmkc(rB{8uL>ef~U0N9Unx{;boN>E76* zb1-v7ET+o-k+K`P@xiLS1&vE%>j@TWt_%k2Pa&p_nq5_H`6u#re1uO#tD~p)aE_1L zxH+~m!XK;x4LJcv~* zyC<&2<1491B46roP`FQj=X0!Bv?&3{JgC9@Eo9hjyl7Brepc*9JYoxj4wcWkaJF-h z>wwW}Iv;6+0JGWw&XS3)hpo$@01OMZ?GO==N(C_h1H4m!2572@hWC-EIEhrO<^?dO z*+-sXx7wBbzIr_lZj(s8$2;Xu(=oFY6q2&vuE*dGHMnZ(XOt(LjS~L#J_#q$` z?>o(6c83=b2oSHKKxQ%@|2Mvn_PK;$iV0i*RI1p_Z+j|4Oa3__RC=%ry{K#9L0+b< zZ#1vziFT>Y>uAe1?7y1TLjurKWJd9nwlxSQO>ZL9PwQ$9(!qpG=wrnAOd^L@q$JghfZ`cB@|sw8j~1rQn{uU34$MB`W51+B82QLa(%+*8xJ z(!NWiZb3WBJM6q(L=kw`MyV7&op z@_k}j9)4WAODSpBcj5cAL$FWvOLfR}LLB|8XqOe)*?BAlF4otCE2)xNNfo;{&gE@~ z+r(z^EGyx)RnZ>DPueWiFAw59D(G6R@V3^Ik?=y)VHsUEmqplk=(Yh`jKgo>KjE-@ z7xIakox_&Zrp`l93nbFSD|Xm?&H1TqDGzGQS;Mf^!rFP~QX=rSJ|th2pINvnOO931Eb-#pKp^#tm8rNCD-zHmm-N>vL(e@0N}GS?&Fa4bY#%d zNuLvbbK^hQ3Rk4MJIl5X9jGFHBeW4$nEET-Ycn$?P#vuwLV)W1=|!)qNW1^g6)H-J zWv7-B^gn*hBkd@qjQu-YArLCTCE8R`Wz}Ol+i=4O&>!a?>?*m`^NNW$STT)PV>}~RM8HhlkIvs3+RK!HRzF}J)v&nrd_U6Y zz^!;r0f!;vQQ3|yPIG>0a@gCysKwq)GYBLP`kE|;4zY+7r5|zJiK49L41ZkhvosK{ zw6c@Mt}Q7F!o`+bx)B?B840F6VyFr@y9u0no*k`3tBfbDd48y_&Sd)5XPvD9(J_jyX;iu2?;g|xU7cYtU1%EIGd;{Z#j^I>xS1%N%N=>IhpiEd}^V5hTxd)ro{nyonTxU)^6s@p#_lkK(7To6T=D-DT z+S&;j2j5VxB|R_?MTpALKINaHOe#6xy>@;UU|}5@=jHk+KNTXQEiMhe5$seAOpm5U zx1ryi*v}{I;%S2fk41J6aAjcClE+-83_7<|;e9%Jy!?rswN zoQ1t~?suEp@M`1Y3aW#h{OI9Xrff;rK7d^<6AATqnM;fG#EX;7Y}EzR_(BppD{WQB zp|Q{p3tmv|?M|B(Z0{QsAt#gBtxT5geIo14_!L2nwdlwQXB&9SD{OT!EYQy5g|&Sr z*yIDltxJB!lh5UO9WT?8EQj;rI`SP-gF|du(}tAUG2*fZBD`#j;#UphyDdH38tgob z{&**SOZ#}hTDuQ;aXFri(NbQR#>tS3QDeg#!}(p+ZF9TTolk6))qJgp@AwH8d<1$D zLmXMekwIBUd`N6CA2idSk>Hf9Z1IQy7<|lBRp;*A#PejxE8r+;7+EOnrCoa3CeTK@ zxB-EvB}j?MedL`Yr6vdK9mT|W{D>9=6%X9-h#^iZXlz{lVi7B6D6C2FQ((mFbq7Q1 zUlFl^PGG#_tvBU47Sk_-r7#ghi4My-m0bfc;}JKPepY}2GbrUZl6h`}fzs_XDNrae zK?Vag^&*<_0|N9c@0#>*x|G`X7qA)6(eT`3E79;F!SFcE3^#`sqpDG9SKMEvAY=-` z1o@Dw$XQt40U%=@%J5C^o?DdV0K9Ssb{pVn8i6j1K{^tz3AwqTazBhSCBc}H;gW)& zHR_|Sc0#kg6p^~@!#a-UeFX7y@I8trZ)iY%0%`IQfh2BBLUSa&eqXvUr^$}vG!O=M zQVl47+ukc$V`~~CITNi&$c}GoX$BVuf?zFpQ0ACI0&CIb{G>SB@o3@3a9(UZe&BQF zl%?BBI&7kEcWlvs_bOovT+43zUq3{pa87va`r!)8hbbs$@1z%kx|G5f{cp*;0PKHd&u#Hk1 z+?K+7{?2YDEBP+NO2+~tWEJEV+PX?MMJQRnQn&w|8ME@Fb#6ENPRJd1nW&~O2YN5p2 zHY>r-eSFlfY4>KOT&X4bF2`mxj5#(tLynfDhlyRhfBExvOa>5t-2UN9nl!Oqkv-~5 z=6(P>Z4dY55QjM-M7PV=N^iFM%L!E0oMHqsKLE(61^hWihuy%z2D?hMV?gBHF=Y0$ z?KxT`bsg`Z#?t2jY^T~6gDdH6T$Z*V&Eu@0N_d{Grg_Re$=o*E(!%rP@d{`Vg{i=T z=3zlhu4(1d!UW}fQ9d2~(6~)*Jb#q&By%>&bNZvL3C}u>{IW#(jNlT3P}3hW+_4D8 zL<>5C8M}#B(8KSI%UL;8S9~+3TD8G#$NLBwEUktpuC>Q!HTUUOl@IbnSE5JVXjuX1 zSF}IJg?!!&e8{JvaZ0m!n*XSOY7(c0m~=Es9~jVWk>-R? zXi@)K!}eHPsKZ-1JIGwQBh0L+NQfC?R}1cB5+B^9cExz{g@6>@;cx#2sg2@_*S=tk zqufN}8SKq?oC+KN{QWIHf8!Z!&ANC1!7{wW;RUpzUMK=QHY^_+29gO%00$#v#jA(i95Qen>Pcb^aUblat3Lmz9@~Zv1z*Xe9kx&61S&l;w#odKx|DsLUCYaVlhp7{N+dOrzXXAHi zGWn}fD++@T!-H&^-P?Js97zVCgm?f+PXaOOG;{@{p_WcC%xItVBg&x zO>M#6itWzq%x6hKtNuUErVr@SGssW zc8hhC5JqiLaI3oAsx~R4P%1w^3@Ypcj#)#*KCRRzJ}T3Ajt6bw%TRTM^GhJvvJUY& zXRiZ(w%VW?<1!Ks4+ov`Zfndmc~83VlS1p>q9u#?+lQe>h0Q&>+{OcnC|`+$((Lpo zl>-kYD=)4DL3wzsdIByZYt{YsxdJA*&p`$j64=L0E}31hz5=51kA&7kX-gkt{7%Zy z=AkU*|G0FmjJ9-5bk-Do8_Qko{vxUK zU*-NLUCp_R8IdE?HtLd6Z^1*76s~kX$q`;_yw0Ks3mq2uQ^Q$l^ViRKq<3tvv2^{| zNS{d3R{QZN5<6891)|qGaDt6Kio^ehtSGJc>KcBAx`Epi%NaLFR;Pp3ukUZMZ?v)L zgnr5_=yV&8a0LPi)aEscEu-lndwGDTh1=js?@->7b*pMqt?691MP1$0-kt8ktd4sd zO!m6X&XPW#R-$`?)a9MBSiz{7uj`j<3Ra=jc+=@Uc$n@ya9_GP){_K#j%FSoB>(rg z4mA__r96;BpCT;3f&s_}%ddD(IQ02&sY?IRCbIu> zS{pszML-ZhYD7^DVT5re-jtXCf-m6p)l=EW`Fq_><9bi1d+NVuKnv-qi!F&mc%N*`gaW^X|5Okqu%YR(? z^G`7wA$s&>j8Z;!g*1ViYCdb9&)9uyr3KpdGdEshH*9`^w5?zbIbQX!%{jp_t~Y+N z?>n0~5$-o$jc>gyLfquk)f-V!gs!T=FFuyj{ATD{TPdf!7KaJ7DG9H}K0yMKZ(*_l z-`b^0>~RU+a?l&G;<5=kj%`Je$GivcdIa7>L`Of)(46Q(QvJ!50*K7z>oe`VwH~GxsKTdUXNRf@>p@Bt}UEyuK`kzXlE^oHoLIdDK!Ad zy;vbt1DNMgA-1*K$;8x+1z9f3fcj&pLSBx9iJwE|T6>js)z~jb2;L6ZN5Wjz1MG{< z_E?tfI891r&$0f@;%*{$6|rf=rbn`y>~}HRFrxVQ&H?7W>_%-X{tYl}C0lMIToaM7 zi7A>O0{^l2VUs_(z`v;2OYU&e!XE@$wQenf$aLl$Vk+r!#OtUeTfy$o#c7y6J* zrAC;6R4Z_X??b!S6znPm)gl8coe{aiagDNp+O4=$^5b?Yh!LLTd>p`KZ>rM@xB5%? zf)hCVFhwPDv?#4`Z`idzcAT)@7aj3jO3l{WnV)LU@zr4q9$~{0S(|j#1r&?E?oD`i z@PG$2;bjo|HwQQ~&)Y9o6W&bcbJ*mP~(P@!O!X=iEUhm!wzUs{P7YX&kwi#`! zj`_0cR|xeo{bsqmsZhSv_Fm6O*HY;Ta`RxNi`E~inPxmdNNW&dy~C}!oftSbgy-6r zI%r2UQMO2!O-*rK$rC&duX+4vl#kSuf+mS!gcP9~4p}oWxQ95>CTKpLvyTnh<-9;A z0^qXyi2a<)?#niiGk#ClBCD|tufK1mMll_@ISB6VhC4zcZ;1lGSS2I&hHFUo)s)RV zpbQVXP_-nWbk16=$@@b)KCsF=^pb z6>m^)OGoW1y1~OMYS(3`GX0OmPr>Z;{;6qxDHs!uIr`E*BvfUoH*3rY6Z)@km2w9U z6ekFyE)OHeO@3X1@I)Tx`D@a$!GgUgb(!4Sjda2a{8nJ=R2~jSL$X12aGtYi;_K|- zRqr8dIyE$)ejN61$jL)EVaa;*HGmVxuMf5&@xI3`2-op`L?(1#>>TUo{WtfYe}jT( zjdDbvz|$%_VWSKr*aW(DNJJ<3swj}Ez1)e<3e1TBnn}P^B~gbZSbNyK(J=-vJbqGi zlvBcqo?vz=XpHMBS_$2CIBc@-coC3sW1lMnhlYH%A)kZ6?PSMGB%db;dAOLoOXxbJ zlK^hb)(6UX%vH=@V@yxmBU}Q6Xqw_j9mEYE)xHp`f<@vLJJ|#CnUf-rr)tl>F{keA z)38A%NDit#l1O@SGO>3eVOD=sMpt(^#I`dDYP@6yAL=uxdenc`w_q z)j)Q&J(i(?jCU$^kj+BBr`mNv2bnwV*R`bm{2{7{U*ynMjCJ9raD1o5nNy41+tu$4 zWHy^7i16d=1j%e_Huq zzx{3ne>n=Kn^QvoNP9i>ySDb*>L-j5-+d2?rmv>vvbnuhmecv|D+*AxkfPUmjSEnW zfj8S1xO8WK3@DX40u83n!Sw%MywHKJ3jrv(CVwCXSac*X@n1Ph`5PdJSjw|x;ku)z zqA->}^m7{Ta?_qn=`Yf&jnPa9<`F=$ebgqzS!GyQ5!_Tj+dvV=MgV9VJzd1@+NQ{o zIGJ?6?Z`mfj%(q^50WrGjV62yA}umxl|@AJSB!dcA!++sH?~qsevlwA+M;0_(y2q0 zjdjz6lkUJLVAHABikS34;67&a&|4mQW@Bf1keAF*xlfK=YB|xOi!l-LOADtGT<`b7 z@R`vb@)o@e-YkJUf)d9IUITj{w4I2SlteK>fZ#uo$RTL*Z#57R!;?%^@6j1;WwtM4 zN40x&)HMc{m!ZA$9olEtVIeyK-E}#!6o9_S&=W_gD%#-70B+(L z-h(&)nPXz?rkDVj zUvtvzrBQOI1#J=gRWrr)IwE>)7U50qVmOa)`lG0bW=!Q)jOE_Gg&OmHT*PIBQqT`G z2@HQ64r5TfJ|zw!Yl^M(tf3^}N<-c#wzeRy5g^ba#LywPyObM0<1MgR_X3y#Z*eFE z1aCMkzO9|HlST?RcL0b8w%u+me|4moviUQ)%8bXCW~@XML899QTyAQedTs`Z-dks7FE++;TSnR=)N)WqhdR7V^`NoNQpiHX~bWbO!1Qo?EI zAb2FxG{wAPM>k#$<+lqxsP4uqmSV?by;1J~-lS$wDWWYT^E$Oi0t%a6RZ`ZUf;3`SK0UNxn%K5GN_lWxqhy zWOVn5tAw{ACROGG<+1#d0YqB0RQszN*o?=lkXZ13x5hSdM4m=)&*6DZWD@wxZn~+g zEY)s}c$m=?FW|j*b-JwOALvIpm+xsYuq@&p?6wdxP|&mT3#VcU8h)o*jsRp4P*Akg zP`^txrTeoI!aWJ&{4Nd4JJgcGZDMock)Y0X_yYTa%Yr;^Q5Qi_tEg1~O05=wCO!u4IYHY1F%r(^TM|jW z1ZQ{I*28ECqI58UQqHl)^~gP+m7FPs(wS|7GQ!yvO%x z)kI*ww;%V@DRxNO`Aa%AZ9*G%1a*xoU5G2KVKcyXtIQ;V#ZfUD$DeAqdcv$`S}0_k zqg+dNlfZ61+lkJ&oTeX`VBdy#?%=oYEhH~D!h4R#O16y|&Xh=-%EX6uD=kA`js$Vl z7xD5B17J@|TRx3+a6A<-nT_0=5$;<%L#bE!Vi7XK;jHkxqE7d4y`jSPn4DH;bqEV^+*a2AMrMjE0KfSgM)mjqQkU z_Lc!IkiQd85aYn{TeTy)RvRZe=aHO^M)WcdGMkK(`*i`gZfn#q@P1W8qb%)Fin$G3 zpp1%Tv7J_y32p>xwAXO7r%=Y=@z9F75ql`3vbX2kyLT?5@suBpTD1n5@fnTMiL$(% zisa=zSt)$CE^J=vHJr6R!Lu7y@&Xe3{m~Sdg=wj^Tgd!}b_nYal3J+N>&4(Y$j<_%Ur<0i&pzvGu%686Ssq#HGo=YA52gV?&AG_%oxKV2;i4A zxfasAe&UdTvCbwbXSHaUdlhn?+7+Zt08W|&=>6y9e-GN`>;uxlx2mZ~kq@M>zc4;I zxO^drm+_PdozT^EVnN2zO4_<}CD!Rb+(2%D4wiwq+n7_}NuQB4#J&s@gMW(LYe*B$ zwPc0_bbnQkce`YmtsKKE)NI9(bM`P!Wo@=1#pkhNxeYIrBbXYlQFkJr8z~xrS~2^# z9-IcSlQa68Jr%Pj3pS$eyQ83(@fS!X=)O}~WUBRnJG(KJBdt?wxHQ|kir~5~mbU9W zln}N#^O_RzGqOHGJKPhsQA*nliZq>Aqk7`gUz-7VW52T$e>`br4ZW@(BLU zJ>1Cizw3&1rH;eZ-_mWT=)E0q zAM=d;wWFPGr#-}>(@=8M$w8m!c@u&Br*K9sl#dlz5wDjHMtVMP za~9hJJ@xkQom<1f9;-+ilwxOuL^YW0na?IXeQTFSds_MGcunK;U5K`plnkS?&6!#C zx-awX>dSay*YYWQh@TXaxH_10OunC0*V$FJVLv{L}lrym6(nhvj{0uFk;b)Y0<3Lp1 zQ#bCVatCdE$Nu^rL|ApuX~)J%_QX(*xgV*G)%6rA(@8rb$Uv`gXK*@fyqtkLhpc{- zNBHXizv15CPnn2*F&0^n;cI}kgTfEmhEk_(DC2XM+)lMSm;?&E!IoA$0lh2QYv7$C zb`~{mJifDj^S zb?#U4)RZC;^*i=(y<;Rb>pkSu)s)v`92&j2nA;qD0Z=d)kMBy8*1kf>EVmyP=pR$o zz1yBXy;Q}-F1D%HC7SgzX7!--pk=sdV2@A0{;jkl<7h%zNfW-1%7uCm4|-1zZH}cz znQ~R+O)$AS%d2va(L7<=DD|Wj~~_Z7xWdhnL`#W>&!8FAR;+V^%4 zjo!9jG2|Oy>aWZ8=-68E}HQSvzIJ1&pU(=!CtC(A@lle)wTa-NfY z2k&|am-9IB>S#f<)K00=0Rht6amNKVG3e4*f!RPS+8OOUxY}`RZBr>iF3QLzN_+OT z`60s})scA*?8Gn*+tK0c7-8I1ha*CDWUZ>#uWWjE$t14tVfMM4)fTB{ZtbHKm&W>4 ztwd`oG5DAH!7|%cu$h5K_MtP$u`~nNa1N}6fYWGq0^f+Uf7K@jZ-z|l=ZiTp6>dXW z@TEA3($4Y5U?lv=y0Jx4jNa!CBw698Y=+Og-sV}xx4{x6j;amax4#V_c6SiBXnLWf zA51>;+e_@i0`GE^@1e`t1@uDrEQdDtvnHr^CzwGo!dLO_)-VTLUAY~aab5#^86?M0 zm-(F{B6^U=MKB>3<2XN5u#W`t$N{YiEd`|*j-n>XE=jrkCJ%t5Jm(@2cYnc^U+-OY zju;?rqwB2M<j$p_q?O0leBP{)4 zOhsKf2iZSLy3v{eN~%kpy98Ah8QV~ZW&kFw;<)K$Ioe;Y)n#u7Z;%)!MxJpQ{HDb& zN!z`x$#$E+3@WQng@+C-1Ofa4hw+gXzp?rH6nN<@Rsx~sEh%Qh63RJs6)*Q*r)+w+ zm38U;kA4nPrco;-9>(#Ai1B)jBT2qdCQ?$1QZb*tD5P-2R2A(!3#abVu^&bTJLr!O znjfykOvbYY0cx&py29aRWz3Uy&4&kS@dP&#`Vgt||c-mNV(;X$+;9!1Co>E>if()DM1K)6fqagkE z3+I1kvlv_W5)~ty#Hli~BqiK32nTpN-7iW*25+D4Maflt*u$6HM9z~EU#AUp;_I3` z$@HtNZDFT=xYUl!#N!SqyRu^Q29x{gv@j}8YynXa zk20Y=&Ri0>PDH{O!!xcHd7IfQirwdn9ZdSVoacR4V;i}xIQ{cv8rtkz1>BmD$7TFy zFM-|bReuw5#ep_v5yM0~j2O=qJ&ZfqZ1P0b4dkpk<#&{bp#d_iR3?F?P^{9fxhQ)T zD|$Kihnt8Ac34ZJC)7tF`1Z(1H>3xfSo`c~S`fRjmG9b}Yvem8G+xJhX&|sWh2zY0 zN)X467V8=J+6FnZ3T*8U=J?8+gCq?C5ro9>XK7Bb2P=KtWDm0eetck-N_>%$USGDL`~?f%56V|I$pBw;Haq5@po`{2`<; z+*cxL&U^;OCW5ZPF{2HCrZ&}VhhsF?;5Y=b`XU{j)TQ#xl@TQ8WI{y)Gi_MC>SYb zb>0^3v4zxs0|kk-gj*#lOS2v4>~3tZ<`&jx*%lHtT1b}Lz7$?1h^`Uj@G`L%|5C8e zI$!l(Vm%HdFBOrC*k-G*q_x|Ix_tvQ4R&9*JGFOCGe4(~ErDK2hiN7@=0?Xx6Q8CCdx6A3NU5MLxlV}fGU%de zThYZy>SCxnFxj1)Zc?og6D^H7J4s`wH8kMn*WEKRDP0<{4ds{IUsr1BgdnG*m1!2DxnItouVj-tSt`=Xr-%4 z6WB)!H_n!9wDoKBTz&}d6Oo^?4<*eDl zuT5=EdxoMuiEH@Q%MtL6d_M^Fh~+k|&sI}63xe-9iiOY6n@u}z!MldO!ZGCH1}UZK zhVhCxC*W45BZP9hkOX6<(u?~5ED28N2lix_o#@V`TNV^F9xCn}M3Esm7#6?h2A-wB zP4~RXgm+fuP`l4=!sEa7b3b3Ceu>`aEyT=&4C+VZoQN$uX^^qY7NTLAM zFANca2W(oQv$xYF6I_@mknz-JIs#(AQHXF4IMk5K>^-BDae~W$judh~109**p*1#0 z#_+NYw=g?r{}d{DgmN~Rq$T63venkmP^3xpc()QcylwkFyzSipl6iJIaR+I+PocrE zX{@1!S1vi**~!zrAwV|qFn_0S88T|)N`)ZEiRn^t|c*%nI=o6;NzN2J=hcE`rbDY|3 z06=81?5}aVx`?NIQW*?vX9&;MqDlW7Jew(^qkME3>>0B&akWRl^>tViZlH8$*t5=r z=Sueko$s#Y5m3oGs$?Pc*?@LdM_f^!f0%v`udtItpecUW98#0F4Q44hQ6NkXpQ}C6^`0j-#FLz3&K7?G=2`j zJYBHAt5f9nBt8V7teVkynX;|KYmLYJSazn1P*IoE>qS_=M_5&j4a%9g?aYl*U&fR4 z_#Nm$o6+$?dC}!?<8!$w5QNg+DL2b9m=zX3j#Yq{64d9P#J&Vb|7>J5)Qfs*WtDdR zz+ga%U*h{tv=UezVO#{pYOV*Hd|^nsA+SozVTD@ptZuWFxmp~LT0|K@kJ(3t*r`h@ zbCjIMhk2_D;V}Y#dKk&fdfX?icoCu1Ieho8dHY<_kd*U1O&~{VSfYDc@TV?;4{MTe zE16*0j+OvIKoYpqEMXzcXG#~2oYiX4=AfY{7)~G1gDKwhVy8h@X6QuHipIVf?h#jz zB{as#wKk$4BS<>nL$euBqC$ro==OAMOC<4)~!YWp`CgB%f_4 z+Enx)Mb)6wZ|aEXsabF5G_lg@jp4c&Ox!*|Rz+|fpTctaZ zKWqazSn`m}8n0hQ$-rxHD;coqJ4+R6-x@HX{Dsm?F;7 z76qJ@az_vWG$aIub7&IZS6);>&Bc=@&S)3=XFB+90k`n3$~fsmpe?`g;ksvu`@$y< zWp$ZTl`R^8164I85ws5OK;RaKRW+fE(GZ^$cm=nbHzKE#E zPsoRlDN)MA911A+penE8n=Yp?e|u{LV#BAT#3nDa@qKpv*q9W`_Alnp9tLz-damvD za3imJL$FY?`SPLFOLUj@ycE2)mDP`EcfojjSd2&q7)d3B2BgqwpJMtn(jSOmwHM@X z;Qz)7@&$}*ueigD{(nbLZHDN8j&xW-C|9ROY;(%0-~?E{(2}x7@Yyj)K$V9_f-2jw z2bNY-WHoo;AWmgE=wACR!6k#Plv)y2po&xN8k&X(yPPhL^jN}6LlNKnEDrBvHfE$< zB{0JqvKp9a4t(j@Ku9VE^Bqv?hbL?^(#Uo2N!nD1FluW1RJ0?tMz@zNqvb^j-wo6N zh2>9vhxd3@V?!ukQ>Y0lfLvT4f!&k0i*kHlVh6ax`x2_zs%aB9u1RL31)rji%c8Bg z>q@E<753r)byj>%P2*6XeKlu8?lab-2N$kkLWFD40Az+m?I2Fe(U^U>B%CAD<)OHuN zW)=lJ(3_Ao+~Z!f8y;U?bS-k=6lmY05LHiCd)yxD#f47lfIV-Z+ZeZ|7KKM*I0*%r z**0~w;2mytox5%P3fsx?p zFOT__tz?YfdBY^JwlkoXLx(Y~U5eISrMB;~OqNwwc+&AjcEoedl&>~$Lm@Qb0(7f& z*yMf!Szd7zT3Ian0*x09Dzw-s9i<|4A1QCRNVo~I=oVTg)WXy(X(-s%*q6QNcv%)s z3&)O&2t(~^Nufw*MM3%QVR>3Ac689L;>uA`9DNEOaXH^$S4Sv83ntaj*RN6cvSg1f zmw7DlP`eYDyAS90FMAC0xQQtH&dvKL^X}2UVDr9Jw&zi}%NT1X)(n zGhNws37(h5XolctqrVvP9={v0jh+tM9^r37@Wn3WOlj2RFRm0<5X+<#>m&yFp6MtJ zJ$?mk-Kq`vp{vkb3V`~&O z^RS$aCp^r1TV*lF1z;VWuH0#7wUbZ0W|y{Tx74qdqAzh1Q{CTatVmkGlbNmAaxw*qVcv?B+<8&wj8kCA(0*pl9rwB zGGc&TF#5F6SnBPJQClU9KHaXTL*ZF>q&x~T@dk|nJYLwKapE4X;p)sGp0bh~rMvG| z8;6qcn?ZOzSCND_VDe7=3CdlL2XyR37=jB3<#;<}(b1|V( zg6meyX-3=zWAwZAD#ZnJ{}XljiuI#`%bgeL_Ib;)7UY5ZAV71k>@GO=98yIrRI@&j_zJxr2A^9kTJPp6U>~xG-&B z9<)ybE_%SF*PsRku8+{OKf(Y;rbSID8iv7%Zo@98_%PV= z#8UfziWj>za+%4A2S(SqlrsN}?3dv^FNf86miUTOBEEJit4$3npM77qyddgu^jk%k z`)?3W^2+eFmn*6#yvH(Ge&Etp+CL-x!L=Qe@wcops7LeOw)x|2n=>A-TnR}L63g6G z=SJ|&ZLov7W+8+kA2 zmA-v|UjC>eg*KG?MTAUhFY-bIf=5Lz?A5?cN7PWvMlg&~wT z2r60Y)7WE(JEQ!JZr|M+!p_>Pt`M!akM*MQ;P27EaRM6Q0*nva3caX~|~fgZB)&LZLdi|7WwbN8S@U?2;fk$@lY(`nFO{DcBIMVRnD;3p6aD-PPSt%T~LK!&Ea%Yy5GJNDlOT-9g=Hu6Jo`-Q;E ztF=_bF9bdt5`64J;EUCOa?)Hom}cMbLg24*B%27GPZ!*+Q!9z$$7r%t@w5XeZ-t~o z^fwjkBAyGs_9g4J0-0;0ZZdDMDKzT^?PnPr+IhDWTX)iy^nS0IIsjl3M~x-+G=XIKBcD6%j{EW*_NU&?b}TnRtBaXpU;fJ8@u@b}}b( zA#GTkObq~^4keaA=^7PnhJ;08GoI-I9^WFy|>I>C-huLlb)+EC^Au@v;Y%<VG;*fb0;fyk!rEOhN5jJA0| ztCKvahHb`mHERO+YSGs9c6r3Un6VG>2vBecb7xQAax4_ve$e#tv zjgvweVJE?AeramNoBGRoC5bnY#Fv-^sIX%oR@@?-#1Gm`QkLu(Y;!kWYqOx7tZXHw z;mGfYJ^=I*k69ANJ_#cM+vG*`gnO?`iEMJ?SECp};h7wKL224J`$?}>)U40ggDoEB zFQN(Jh=}GO3$grg5ZtUB+i-Ezw7@qtwWITKFZaw;a8rNk@qF*e=~TO&2ITt$!pLcT zk=hC#Co`BF)BfdSnl8pf77%hI3>0JRPUzJ!cE+I|Wjjw6U`54m!r;U#4$=Sm=$ z{v=4AIVvIV>dgfi!kIzS3D+=E)rzE`R3{*hP)`^j+aa1MD!1W1Cr|16rK*0J48+|! z*AnE?nzqlk^Uw{pY8e;xq9PYbON51AL`$BIv2w&-YU)Bu)J7nKNs3vhjo>t*J@V&$ ze4u*;-u$ozEoZRmG6-3-Du5q(5v7EfhV#bb&3|gu)$_~n0VI}G7xPO1h5 zF}?R;dfD*p{GZS{*UoV%J-<4o-`RAYX&P3%s@V=BzBH-Lp5^SS@yFUJTHdTRNL(M< zZH?U>gVNfsp|#`fHqst0%Hm5wNB6`%>SjayVM(}>5&-e_TB^&@1H;_GeR(iWf+x9w zV=C?N%m($_oBfbp4mWrTnU0{elkE;sK7YUt?+WpUZ(tjUlQvPLq)v~Z>%6&|rTJaM z7EK3q2MTkmlFv<4TYVt)U5xR<`jACH1lh8nQhB=E`=1!!D226h-1`k=w+FF(Oz!=; z0kRe1tDCVMEC%@ybY`$ySJLDJY0byPzO|>EgnM$6YZ_E3n!QxJ<2BwJa&@!)mv-A!@;6@-25<;IDw_Q#I;*PgLENPINUtdHL_g_ryjVBbrt^p8>Tr&g{^5Z0Jc0C6cyE>7+E;pXX6(CuSy*BOR}OMn!0YnKL)79oYd7!9q(vvrs)Apok(T%l z{Rw>mGrqy$_bHq3)<^R6pTr8Yglt^FUJPwDYS7My2GQWxNrv8n=3+EU&M^xqfev6Q zrOLoG8#ijBakaM)##k_KZ#UxP?&X;*Jri2QQ`J~7-wbmPcUGGI?p}MYDbwzPo$}*?og)03TXYYO5!Ja8CO-n|Qlq&lD zye96kM-!{dcT%<3-lGCi5Yo$wvD;NT0`8tK>#yg$WA=KpJwmd=2hWxy@OfHo_?R2R zt$4(5Fx^zJ?|E$v5cUg8(oEfF)o}_!+gJ)Qg~GM+5FXM8HjjbvY*Z)p{a}Za6Mm=n zGMgK-EounM1j%Y7ylU!9c*uxP9Tn&a8*d*+9d^>|SXGoZ?6N=d&0>N_WC~yK`bY<| zmLZ%jv8b=Q+!_Y(6OMhq5bR>CrJaSXguOOlWRFeSg+SnOfey4?20@%s+PHSd4M7yY zI4l^gM7rNhTWga@mvaC(XLC#o$!E}uc1E2?iRAn2tA#Auq2x!A9IZ%7F_M|FK;A-_ zK+`EO9~jD+s0UsRao1b9;yB^GjPkz+^3U3F?+E1lK^VwCS+o}-Fk->%eTxG5-Cg*o zGP{*$;&IO*Q5%JYIU9)%f?!OTOl8v&_*a0bFpAoNwY=sgaBd$2AbsRHD)Niaq(+5pO7^N%2Qml zn1g%)WRYg?d}aR}k{+7xUMGqZ4_UXf69 zYPV$?z{@em8cen(c^PQ>Mr+5#H3^#3b;4G^f+D`H)_`|A41XUegPT9U*P`|-_L32;3W+vqZ9; zsORSk_JJ_WE6gvJloLr@Ps%uL0FOmQvzrbvpwM6UB4UZ|TvD?ZHRB%0K? zVc{DOoMIi0V!kZS?KYfaznElQ<6yIbPOIaWjKUEf>UMgj?6i6ahj?wl zD*BWnFXIF5vDs~w=x)i7tl10ch_DlG%vmM~O~`Y!WU@&_2vDE$B@?^&QaMmo^cnCIIkD`TUL1KlV`fWLL=tg%Nr z_9SdsHGvlz?QHeKbL)_D6D^0lFH82?xIv{HZ7ZjcgSOBThCT#H=X7W2nYu}`Ri_=H z{K-=9V!7|zKMS_OrLq8z+m;w=VqH0}#7#!+^iqHv>B_LWjzJrjp>yOj_Fk=hTf^o{ zVBqi`>d@oDxP&vZxS((#e<|e*-6n(=q0(7{7s=ClA(ffxDzh8cew(+^Om~1Ym$zMw zD+tM*edXY9>Ej%Is&Yq~ADm8(fsXjra$ac|>TKU+)v-+lG2&AKPg0cv<-~R2gn`Otn`6@~F+Vyx&+D$_*v6L=%J)iWsz3lO9bfpA0lOMZm{we0vdrmKm_}ngMom(>>Ga!R=P+|8gMtvXIbO zZgX*>@RvRXaC#8dw5H-&SA&@SsEhE%y`g09$EEEn9Z*~z?ScD5`=TACE+R$zH2r13 zUU`tR;>Ksi!IYN>F4&A1Y0$OEU#n40SE?GPN`nhIpxfSJFAsGNbYcio*^NpJx<*{U z%qA`?Yc>E2vQ>lvap zW-Q}{tWuZWNFQxZz;JP45tzIj7s1cO9=(H}lBGUA^$n)LU!s;* z@J>sH2JoTH)O|JGbTNm~fkX;JbtB`7+MJQkj+@yu9EJ;}Ld2 zpdilcz&pG4YU9lm+tvlD4~7Ha_QS{$uGNigSa5AQJE}9{94(k7|FsmLdFV8|=3SP*{F$5fsK!4ss=~(fcH52>+#& zrI57AnYiZ-(+RVs)re`l$a@;V99vWzztWC^2t+WHxWpW)<1Cim#oDv6J6L%$L(a`c z%o|V!SyylG3ZLQ{zQVAFvZ#KhCM{m^@`Im7h3gNAQXr0c9_5TE$uUZ&Fw2WBb_YAs zrngI9=!c(T3+>@-t^&Jz9S)qeV%n(5VWP~J+W@`3 zsfN}TDe(gd+&6^=-XDqZsTHN>#ATegx{AcDOdP}d?Ofh^1wTZ%p(q%A!vsr2tJLp( zz3a&fKuMX8ON9;r9{eES%(JL}2Ax(_`1BJvVU5-Nul)^VmEHv(6Q5w^S^TThEX#CZ z4(6e%@HMSmjgH}*BVpW!uw#T7XGD)C&g3}sRRmxek=6z*%b#2-Gr^F^lDReUED9%MLGrwUTThXrx!BZ|81#~);oJ@&&tu+b zyY08tk~z<|gLch2cI0GvuW{?pH6Q49y6u!knm$GYErY&^b49gK_QP&^0ru|$Q+L_% zNMs$^^Y1K^qH#$b6W;dS(7{*V*P#zBBcnhjNtF{mLHTrvR#d;)Aek&+Ia1TGmcYvn zgtY82d!~)pb8&#nq}A$jp_io}k+N{w5`jB;&07ZECHq$Ygz8KZ$3*)Q*<*#BPQmR} zHI(s#7y~;cRdQQu`w@Wgnsc|?L0dQQjf`!moRI6hLn~w%xL5;r86M?@0g2h48}Jy_ zf@J4OPwwf%HA1Ut(CBCqJKef*iUy6yXwvov5NAQOEYzl2ND@|Sxelx8;n{9C3${{E zI1I!;DHt>=*Bg2l8U~+?NKp#7lt=*F7YvU{z*K+3n+CYXm+uQ_0=zox^H&QYTlZUn zr{PQ0L$Mfv43hc=MBL1Duvu+@Zy1~8tSs9V#(xqjj&KEwOK_ww2oI2uEpR`i3VANN2$w`#H5Jf_1 z-y?jd(F@{5ilQL>xQVouEj6jruMO4)kou(}{YO0P;FxpuupSSzfW=jdu3;QtXD8{p6z}m!k-TJT=^JpP{H`N%OnXqB$+7Pb-emBRhcH)mabd?MLw1W zg@trTa8+G7k~$D&ADb`at&+_^+nD#v*_f3jJ|vj=9$3#?DwCnH`BLxUJy&BRfr6lMC?vnM>TBwd^?$56#+Rj8(+FyEf4@N(F8rJ30p1pht$DkSJQ=}2MANv)3p41d%qD?_&ZgKPvN`s3D|Yg*M6&vqLAbH;@3KyoJ0%YJKiSd zOeqqazJ=)?m&CM&t>fAV35zR2dq_^6dl@Yc$4#`t^mK} zkEH;oN(Aaptzj@T9|Y8&WXL5-o3o;&#?(*(xauiGH-{9+S=g5@5NeUN|2K4b`ySi5RV#=-#wc2S0}cq;D(sL*kuAR#BXH&2d-Cf(9>m&ebq6+#}(4&&YC~@5h#ysx|5g!s24V*T+(YhK^ zoiv3IRi@K{#p$(0ulo{fani>stbD@m{%od+Uveo4d~n&XP3op!xdZgkK_kmy z_zx84UZ|UT^?3`Q;y@O(GzUyspg5FtT~hHh%0cBmA^#C`QN3X0nXr%bX(!7t-C*|p z8CRd@eXe(y*4BoT-#Cr>b?iQmSQNYhJQgJrS)j!KTsw4|oullZ5_QD07%;oapHG71 zUJP$rl03#X+3Xhb*K*L zOgDi~xfLF)3U#=ZZ(PbtJlf@E^RXKg7*4cNJu;d$+tt@-&lPNj(?0isxC>2Fl-=s0 zI(VP?s0zy<2qib^%MX3Px*3*_P<$o0I_a~Z1vkWP+72!NDZvo)Y(z3XK1j2I5|snF z5Cs?7o>wwYwMS0mAJFJr_!HpI1KebO17RqW`LIl8lHBBh{P@9qKxJ31%MRV~Xx)ZT z7kt>TPv!yCh!m0t7wd@Ro2?0!qaoO#Goq6|r>ZOtl@#ifI z;j|LAJE>M{S;tp6&9CDpzg1v^imG2%(M}8yEvR>*k_1_;t0(YtK2R06vQB8$5A4XH zqD^Dgj#O{1EuswC?irkL2LU;N9UM3qJ(!PSqpP@|Hqw6RG2qv4B_DQ*s{kO1&}q|D zoizjk+T~`l7Gg$TcDV$kw1wEw2MMCar}<%P9)@xZ`oM6rd+y^}W}{&%yy-_*KO>yew1w>~N@B~i!1RQUP>4)zz3Gx@>iR=Ad2%xi zPKyIfRu8{+xs5*#L6b5;{D9c-*4=G=sI)&l_|t-Sufa2{93 z2LS4~1Oj1c+D-oDm1)Mk zXRHgGnj1F=kP6u_+9=J`eND)O@3ay%B9Gw$RR=yNYU*62m586mlv5!k7 zhA`t`wQpM!VC#bhq7z9T2p@&$0v*vhB7DA5p`_6gMe*eEj)s&}A@xSl(jtz(Wfu=5 ztMuXG&#xtpI1s%L9x4d8r@;Q;K7b&HOtBw10Lx=|ggq5q!akY=Rv84{&$td;3hdv@ zKu+OfQ+*)}`Er_)69JZ%GzBQ)Fr16FGfgjeoir2X^aK&CgNg_rHIhi;jZTz|1BLhz z-+oS;U7WRwY=KxZm!Ft`fIg~W)E*S!atP$#7VPWzXXG)Byn|8;)2Kl_Nz~c?dCVi$ zBtY#$RA>L&Z%SSPE*mGv_hu(7&&rssYF1NkiA}GX$2NO)tSXM&j~$MBs1>-Qu>_HX z{p;jS_m@4)$>|i8HNEctg!2WUuVid32En zlKZfFnr5oj(mVT9{ZDA}jG+4?Z6Ix*Y$np#Cyvz4_FJ3|l;`{n%JAEm{i$F(+;JWT zB5jKdjq}Dxcbf-+D4E!_Yj)#rP= zKc8Bg#J{UMubw<4Y-^s`qOI?x7Rgb?JFKE)A9P5b>h{45MU{PG$gZcR%55lnH~c@v zha8->zZAr0EWrIGN%Y|}&;%>rNugxGYVD&P)F~?xaT$lMv^>9vApeI)9UGKpMFT>@ z%QFNhE4%=qYNhlC_go;njxnysK_9+L1i41;!5n49(?bF2b*@X~ZD6h>GOQ4z*;L6> zob{T4Mi8zM4SU8R>GXSNtp&~Fo+!3RAY{&$a^C8(PrHdW9yp-vvvs8w zjFfc&koX!z;j8+*Gcv#$M{!Rod>5-r(U2*47Fuf&#&eNAT!n=3R)nf=gl;U_D857> znvHcFMP2<&@0vXU1sMeMisbr&eI(7#P8Z4LQB;>JcoaRJ9?`sw-)=R%t?^deCFeb2 zb2BAJ_m|<;La#ew_R7|2AI{2OJ|D4Xy6uHP98Gu!BIrd#P|)T-@t64slA2lq-!at^ z253_pqDt-URrBsIR@sl4F0@p_cBR!JI)^W$L$ncKb((HwzfW2%hD>&r_?+AH(cdsz!L?7 zS`d^t$bJ_iTa#8e@;s1VQ0_X^VP)+eI&Lo7GA58=fYu7JzvW8tK!SUL7$t-%ig@ywqo3pzgMoJHY6qCt^r=}XbNbE^fJ|{uHbimfb4_u zglEyH+6FbJ9}F+lMne`>mJ19G!mx&k=%5+f-Oa3r(ls6AB&~KR6dA zYi?!Bt6A+l#etfg?tEk1cy%R_W4u+gBJXQDqdRSm6lx*09&JYcFh)9@!HmbfjVSh^ zf$m{$O+(J0S3$&4>-GN9r}KJs<@yc`z)?s-4QnGe$kL9AsA{V(f2Pkm_|WA68Fsmg zuFpq$yly)WT~c4}q5?=p$}|I_n!d$^^8ZksjL?HI(+T+0^$#}ID0W}57h~ro(l=Fw>17PA^9(^96-f4;Df z@G`BR@H;=v)hZGN%plBhU5PM_Z*ALzNGieSiVjH z=Tnpj%GmpBA66TTVhfq{TOi?bfso~eW@cx)WmRd?V1{Q9Z&FoLBti2Yf0`+B(YwXN z=^5y*krTLA%*w!cK0Q-U{q#=$Z<_ahfnbKGXP8)KHQF3Ig2~`;dgdb>(H}VNI|QbA zw@*{eJu?@oXD5#P4b-z<$oDln7X3`};Pl@5ISqxO%fMB%3WFdHoZe-3)j&Lm_thx{ zS_)zxLi+J6L4TexWGJQT;%zGZ`H** zSAtejCg_7h-AD27M=&`3CV6tX{k6c(R%O_1gp!6P-BuGDc`eK&&`@4dU3cuY<1uI1 z(>dLxDE0~LX6a~CBpzOswLewcV7(qHykEUtr*t}R&nR7Lk6_Pj0nzd;Ct7yk^W>&D zAhDITxYiy)F)>)tA!B}Xjx`X5Vc zh6~#vO_u%d?Vnb`U9t4Fy({a&m-5Yq6noYWJj@%W)8t@?eEwz1M zCVWY2PO35Mog!@*sK&2pDLADh1fm~7);A3zTl%b-LI~2QD#m99hp27fwpd@x3h#&V zSdq4b1T_9`_gdurB~&Cpa6THbH$)u7X#w@59Jl=cr3~`k!#7GYFP+W6E!-CQ37d1V zus;rUciA0%+7569=LoCOmawm8J?I@z*6<}%;GBZp2^+bC*#5l-%RY0&lD}2@4H|DE z#jAPkH6f6=Qc>?qJoM5~qq0r7leZ(f9Je}wAmO%tLk3>LmyG4juH%QbmLS_DjaL6>qknn&tg-~;v=&C^~6zvEb04m*HGuWjNV>~kx( z3Wt-{pTW(XFkq9(8ngDfz1@sJ??`(uNnP<~)a(xwZ`{{RukB}B9k-j}f$SEdLq~gq z=C9w;okI^pz|0V`-W3_(+sVM6N6y~#nC8=h%S3E;%4&|{l{^Ixa8xUQrkwLT#Dabm zkXcpHV+VUD+uz*7EH)xG{PA#d>$!Yi;WF7PU$8nX!&Xgn=(UVuv!Z5rf z9GjAjW^uWrz}Fe2;H8B>T@m|S6Q(nQtSN{xR|P{Goo&5INbNgOhWVawX*&Nuwt`0q z_M+W(b!Z)589kV4ym+Tbw^N!O*{u!kY7xa`4tTMrTWebLi|2xZ*aSYR95Nz;qa9-- zJl9%>YiZ>dygdg;yEEV+{^&xukk?xsQ9IuGB~ehshjT@=!YvU2P~w0#&BhW=p9#iD8(IQ!m_>42l)Pg-F^6KUkkjUd8W z-fbwJ+K9Cyox^^r%|{&wXObNWL!1VE z??+KsUI=}lZ1gSu+nESw3Bnmp#3rDyr2!XDJ@{Epf_~!e?N+yy<=6rylEHm85~dr^ zaOj?N^s1M1W56+K`(iVHay`n9iuB_&Q$tqC^#cT^J84x)+6Vnq!X7GEEWrwxoW0)p z*c~=cd&0)sjAo38TkQF(tg zeXdX1rQNvLk+!{ws6u77-=5-j#SFlBl&;D4zCb5kblG8)KOKvBr{;NJM5B89+PHy! z{t?iBRPhrZ*gg}6?C1mnh*n;Kv;K}vN8yS~Dz6JV3GLJ(eR`v)2?o6-8x$ypc-SLD zg}@}1f&TsnZ+TXMrZoYNgBaQ@06^2|8wJ9R>fg{!@cnJAX&w85w~BUg5ls6u!aAv; zC+#-T#IaYb4%nDfiO)X;7#_3oc>}U}*86I=Q7^O>-JU9U&~UTJ;+df!*52p_F$L72 zl+!_oMmZ|&XC+Vh4!LHJel4loeVP+8Q;^Pd^pV}Z)qUG-^48Y941l09mPu_dng(;3 z@cEp76M}Ex$rYVYCn&&M-3)bwbq~EI2Nx{w2P0F<=&PrGvaFDsJXLgp$FA za286$&E_?xIX?F1|1Q2~88~|>AQ}d7n_Eg(7*0%CdD5@x#1iPaS>PDtCwz>0_*6#^ zSgO+ctA%a~-$t@Bg^yqgLFfFf1*_=Wrqu3JSmiPs$<2lt{Kq2S%S0N*4L25V;@#;c z*d`z_#*S~?Zi!yuG#>zjxWYgxcae$`RGUgaRRo)5`REQN!^EO9ZY0scMDVHDMD{cbcpNWGF+mdD# zKt`j~-{4(Z6VkxUJ^U3vkK(BWv3R>3PtQDU(u+i2wPqDqD%M(*h~kSX8oll0Do*-2 z%xL_O(#tRI&1W7*lG6`%XSJ2;3ykr&|@a$m+<~N{!(^^wx?y@mxacXG#rot49heR8{)Yp4-|^Q?R&*Z~ryN-i*|w5Z97H zzRW-VREK>Mg=pi8Ub9mp>btpssCqHAVsIvD#& zC`jT0pQ~0^HN58oAJW_t(3s0tIiIVT${Jj~%$0VJ@|S?be43_UBFz+Zr5QSvs2ccv|g9Setg%bV%iOUgZcY|Co_6??I1~UkwJztCSq-_Tqd)4AGIZ|5HRL^U(*NQ`Snlif0eDlc-c1@i-{GM*a zU)DKX_*sy$5y@cuh)oD{r=V@T2${%K38NifT_)Bp`Rqd~{X~6y;AZfP#s>sGi>iIR zjaqmX*DdTRE^~N2+W)!rN#la-eZouNHphKIQqYPttqJ)eQuq@eP3ggnymn zp!z(@4hL(Mu)x`t}o2BLtt1b>k0Kpo2L#tgO7_lqzicVZup6XFgk<+O9i zVQoar0k|a-Jz+sGc4kFlIGvpudX3xp;0izzeuHb;jDH*&NT-L`52I-cu~!8KlIAUU zsaiSFe%O^m1>Qm{_SN0s*hyX3$I0ve_vPTxnnhs&WJHlR`E?k{l(ePmLyW1*y>(am z)$~5288-wz6T+((j&?Ux!+CF8yXPeThMdds*Es#3@H^D8_OtN=qJSoLv;#RvU_L0) zzu5@vQV-_|$Rr`Hi0jHvzLGE4Hr$Xjodkm?%^XblDzHlNKR*Z-f#t0(I+!ZER10bs zOg#iwvrEe;XvGLcp$VJ!ImL2B@?uvZFc9F`7MqcX^DqC;5gW`ziN4R%=ET#EaLt$= zf2qC(CR)2^s;OEe5yF=-j{{(BdxR$B?iQgMC&cXHl?7WZZ!wVwg6+3Kn}i$D%B&Vz zyF)7#tJb&JE5#Zv6Z{E&63VBE7iFG48LbuFcaiNkp4~VD9K8xY>o9%>CYE$D?D52P zCjlG}s@#n2U4$E3H6TDeNL-KSd5>zFmb1}XI$X5_q0F#v47rE&>(TqjiKe2Yn`$BfN3Ns9Zpnz*3FRyRiY{4%TJ#J5&FLnm>TQ7lmIRU0u~UB*>S_Y`Y) z`0quL~t3r|;d3$3^03$EsY&Wt+ z8ww{vD%ApjXp3uXN=-z->gC|p$zkK&$jk?J%p00^;CH`+#E(YDNo?q3;mO=<8-~R? zls%-f_NyW9Xs~Gm*w`ei9fTDrMmq-Vz*d#EWcs_AFqE8wTL2#N;CKLB=6^7qbaC{d zG42K%36*W`2Z1M(Ik#Foh1SPSQhwPTFIZWJCD(5@odjpzAa)!oOa{c_scbEUdO=K7X8AI?>K8KIbz zC$ zon_D3e$d{pBON8*q4m$=-%(S6j}WtWTpFASj3yLOjbMSyHd<8AMK8QA6Aid;J`(bK zTqLf_7FI9|G?nlaV`(ELBMPu_SWr(ftL@K2b_uus^8F{Hy6sr$nFWlY`(&cxV;FwE ziOc(#g=yHxi|mW=`Tn6c6pU<}4y?Ze9@m3y_OpeAs}7s8us)M)`t`j}T!#Y8vTKNs z+6pvljB!sVy#RQ-!A>-x>=|eJ%k3aO`3caPJiu|aH^weQZ*+VQbi&!3v5MFy7`wNtzC zl+|`)iwtxf-}+k&y{%xc#^&+!gvUaX1fEod$DcLLWJ*z^{Xsa%Iuqyh13-Yy!5 zW1B98Jxc5CqBaA^$nej#B<{_LmWDb@2i@v3f`KR@#L;A>ypX30htL$$;dbzkwHr$V z4BOoZR)J@S`P|vSp)Q{()v5nE%>z)aWTZhth#-$}1qKY%7(cw97E{3nCQqMzS$}gj(J7sW+27F|FbezPgPM{I}J{B!`0w zm+IQ~KjTsMQ6`X#+L7x4%H)9pi_YE%8gxBMuJDhB!n2{I= z&--NPSNuPJD~4#Iy<>Jnv24IT(2ImaUSgsZ1Hw^_E>8+>=K#(W$hwyL0KSNNG^?b` zaWl`6Awem@79o;kB;By9zdMg-^KNwCwr&#(HuKh;{Bp3%Fvbnn#8HxiH9Si9dW@c* z)4iir6dXp_O$C9!TfjZPgrCuWbO8<9!nj>2zeTCwH9*~UlDBi)IjK%08FJGN z>1;qe9q-1Vj6=b|>lBz+(Dv~_nj}?G!24b}tpCLuQ1%mZAk;yxWK~x9WQ=S96;Zk< zzG>kA=j1T>>kC<^#CwcSAPT@ReL1h$D-HI8g1tlW*Sf&C>7Y}v5!J7=6^)$c52v_DfW^} z<452^r(T^*K}+gNQ*RHtk9-wT?d>CD{ANu*r#ih0FX4l<1=hxqI)X!3Du@yW_wrHI z^lSM9i>u=8^QV>x+l#Kx_FF|Ae0>}mnw+di=Ny|A8|=evE$GNMLT^cY?B$fp$(zU7 z`%64SxW(=x`yn=rt);_&*j7ZICwACJlPbwyS`?~ELi0Wa#u#Czcq@KIZPkv)zIon0 zc9d>QC*MiG5*2izf~SmW{;n3F|IxuM+rP) zWtSX$&Bx8IERLjOrHY8a;4EJwL;oi5R%!0$?og>OvVUj=%%=aod%L3RL!BMHxUQqVg(Y)%?%d9y!*y(;p!#a1(PLugZl7lr z(+GSZn9(2SDRzd3bv19E%iC_Wa@zem71bAFiO(nfW3yxqLqzr6y02)55Zo~kbp-Uh zD*0kcCfC`bJcpF(NMOUx`W*9V(Hs}U0Dc{xbcypEf#z!EqZ2y6q~^`BcE&GGtjQlP6Muh542>Bx0!sMQz!MT7z9fL?I1;Pqp?i_J0~KRDeRHp z^3m8Lt(ucx<1V#80qWBYoP85Al}k&##_8XTB-dGEQZ*{<7#2+4elejvwI*c17#b+n z?TRBsYS#63Y~ajXC^w+>KDFxCi!KP<*}m@14x*Pv?rgbKLwCZBu@{E#+?~eHT;Xob zhcwd~_*Bti?siLUwT8_d;6nK{9ZWDzQx~Ic%WqL!g-?@dtg_g8d$n2a{WgiANuf|J z@dEfLhJ8RaY``WYbc5m+DoN=`rqmFx9Z~zl^(WmO?cR0uiJ_v@*hbTQv(#e@_<1p8N)+R^5qn)U8n;BQRLk#j^(eO+_V_i`7slFQ zeYj-D{O_dUXE+AGgqM;E9DgzZ{0?`5!rCa#8+R7n&=>f5F68CPvmOK(qYfT4_T4Ut zyuv@cq?6XEcI`v`7nI>{6@j)W;?0DyXGg9V3T|DmoJPkOc#0r6E?V6A1nj z_+p$Lt%;g)n{i~!(lwE+GX4u;>-c{~>3|*p0o8*Nzu{|UR^Ak`G-Z2s>>UqPtgUIE z!tySRSk(u1PM{IfaTxn>=H&$g5A6ryyUAv^VK6gWGA($zm#9iLspFG0M%%Pb;GoCG z?8I&AdK{yB&+-;+a6XKaV<|vIKzry?5#O$Or_v$LbCf9aZ%H7p^K%J=k_7~yB)j;o zN%nq<{-?R_F%N~C4cp|KSgEp@uTDrHDO?Do2!l4)VKV=cG=Ttb!W&~TDM5f?+L(_j z&3lh+wwmD9Rjg)mm=c{jh*AfgKu^niG~_Jd<=Bt&7nz+)ijl!_sgT6^k7zpS;74jFA+i_InokyRv^{HAH^PCPks_do1!i7v zdJ${Maz0Hm)lT3+uhkcKY5&M7^`N~Kw;7_=$E(~q3nSVh`P_OvGyfE6!%aMMx!KV( z<@W^%Zo)MHtrZb&7tI1-WGpCzf7C46;$aLbXX+tRO@auk&u+w}=4(U8n&@sAAxtdi{?OR26dl)E-W8Nc!el}W8R*2(hiQsFh zXj!YY*HgR$@NDlSFNxN^*{muEjeh0!NUqf6zh$RVtY}^>{`c{BWo>A!%}xvvJ6oVE zA|7hnXvC!cHOdBgQV@J@RwGbqhPS z*vPH{+mwa%-|pV67ldA9*rFT)uzMY4=B-v}wG75OxwcIhb^_ivp$ph9kstDzmlQPj zIm9Qej^xI9D8Np+IP7R~4LzM(;JCd7>u9tgxEY3G;Y?^ADDE@(c+nkkrqCmO>OP*w z@2mUxP@<|d;dDN`s1B2x)YSKi`b#F+W4#4?WCy&@0p!Q@W5q;6j6*2pRK#^hjGeMw zD;#=l1qhy0Qi-r;qDHb48$iI`q*GJ$BiFDfsKV~(fsB=9Y|d((ww}S%10(&ol_8tf z)W(F>>a`J=wRBTZO?Q*1!<}IdO%97Oh*c*QxoQk?KS=A=GD^@0h#U++OxFMNTWDL| ze=lpOw{}E1n%d7fdi^$xVdttcHMbV+Kq#-v&}n7dFrT$4;AUVa3HpOi%1C?yOakC-QKI4BMfPzcfM)W-;|VT9%J07fgt zY2tabPHvEI{59@53%ntK4W&q6=_!N)?;!B}TeYuvOtp16l6qdqc~A; zc_=m1(EtoIJDevXh@XND=ImL9{=Gyd5+^Qsl8?~^5Ku7&`b3E>`~}0JJqV*cZ))t3A)2iaMJZ;NoW;|83ybQl$rH1x{c(_JD8V>nGah$UOqr_)E~)dI={PNjdOQ z5t+fFd=2A1o8%X25wB6swOT~#V$cQSt z9UUZ6{hUw{DRHx>I4Rn+*G5`-am*trDdFZew%8b$QNn3UhS$VA>R$&1-EG_3eL^9q zkK$OEPZ(aQ8*XOQHl!)ub)#924vXi&g|H>bwb3np&+FUnAtr|&!ed1Zfq1li79X(_ zxA?Z26P*k~&!_Z7Z1Mp6ne&!t$9tkA12(oDGpcAXzbMI|X`sZRkM9*WV%=DP3eZ$m1v3&&5%pWt#(Yqn&-KP40u}+Xw9s zrdGG?IksyfwKY-z>Snw0$&0jCmI4@a{k7nLS02!K9j^7jJ%b>B zB4HUG1QEYF$BvEI+Hefy3=KF57FH=f-h*INE_O_0PJ*yBFDpU9mfU$GGLb;mj=5y zkkc@MFz-yJ5rZiJx)K2opSAL~y(j6xBqiGX4UZg8g=+>@2a#hQM|Y|A`AoJ`g&ZV| z4#lXzxV@5=f!S+R*dUWzhFngx6}@eCx|_+KO47z}Df0nLvC{VpH4WU;NS&@)4QGFU@u*vxgQIKU{U6StH#?Msot}9tgai%qhMPy?pDT+m&rZVT&75@_AL+OpE(G z)>B+1pI2i)V+{kE@-9AHrv1Z(^y%Xxd`KuRD*bB=ci)dY`fkDc3XN+c1iY6+iY0~5 zOKeQqL=i064jYljS3P1+Ba`)z*mE6hbBLhK9Txkg(!m+fNj739og@QK@?U;tmAAE0 znHfXO@v8}@_|*h2Sl@qMO%N>#UC*?t9Dnr5cBHMO_)?nkngl1v+s?5C&5Zde*;2>q zxxLOXsph2+x|P1XYgl8w##q@q^D>a+2y*C3>Z9clouF(|&Qyzis@eXEGGwWS{M!!V ze_v4G4obD}J_0mICbXn>A9XZ)%6YtM2Prj?v~~#~|BUbcEm^j5ZY>%O6Ugp z8k^gf4>GPL>4^=xRTu zL>64ZZwSk6E?7mQ{TQ>kwL$gkz-qK3{!i4)3igHyEuTV^ZGqdbZER7cWd=W~iI}4- zOYO0kLA!oYtih>&4#IjK1^D|qIKqlZW)MG;j<*z6FBOe)@FH70H(;r&ft{smnmVJL z7UM9Wg0g{JnO}-M-}XN)3M#nKnUpgmlac&r6!;a-57<|`?3f<1u}9Svxq7e4NsD$~%1bAtNT@1}0|qEv z2SJx_vqFaf3%mk*YGlA}kK138^4mC$)cZxg;|LV-6-w?6;kCZb%%+>rl~@Lk5VEod zq~fu~FFHc{nGn+SRz5J?PO`|qG!`V};~XI^K(~dERFfUd5ctm%7}OR(Nw_ZHK5-SbAvryVe||6jdcA48(S1VQtjr|;r^PVR z&VY?+*+{lvvw{xhyYcNwkG1jI6kXJHeOc5Mi)o6q#&8vOKrCXNYC?M)<(%JO&!I21 z^XdS;F&Nj);$r7$KR#cx|4f_fX<6Q0Oy0Iy4h{E zfV6<~{|WWi75L5+k7&n`5W{Er(HDUZ*B7+FS8W+z&?u|&j&vq;8;ze;1c?g<xc?{w8|lKtCR13{*FTKhIP_Jw-lM5oEUz zVz7j?UMmP ziv3?Lnh8PJ%Z{4KNLbr^S;_@+DX%9h$siChc?`#*n-zT&!IBCxjIat&z(3Miz&4vU zj@c)LxGsfAOQ88s!A2B%oANC=8=13%HeveS&_G{v-R2F1sIofw(xWJJmZa3(Sm0+@ zK`J4n2UMCZp|U=dW*ao!pOC^jayH!pE$j3N-jUH1e-WiNi|v&4V>!=rC%9S|kG01# z;&N^lO0CMgWU+^Df8sj02XR>QlyVSgf9|Euofv{joyt*VT^J0F zMo$LjavHSEBeEB=DyOd+h_Ze=CsA>`Eh3@bgy;5t6`Ti~2ymAu$LL19K3oP1J4hTL z_tyLO{!~HsB9!5G$RHbO>t{>JYXrzLd#=D#2<6U`2>Y3k$w>03X_Py8UWM{>X6XsC zEEaqRPFL4F|CDn$27I2@8#+FxgcAbNNU5N8&^cC_1es5@dMD%i9OeuobDT9l)1XoM zv}?tCyphaAV5?YYqVXut%l@E?q{?CW1!-P7D0r%xGd5%Mwk0qZ0N0`0V{qPyIOry* zc2?c7A-~l2@vRIi!qLhHn(VX)Tx2jd^s```P@ba~*YO^XtlVyt25j;0!Mi!FDFvL? zj3+08{0R;4GS(rmTMrj$`nw+{@o)r@kRVj*Jjp7WbiqhzHs*kN@N(NDjyEq-0Qpxt zQf15v_ww{oimpy@WYtxRwz1!v%~M5`fdZ|KT&kTE&A2If3AEwY{BD{v;g26w{5XU!{&P=hknr!o zt^?vKe;*xj?|BitSJDgM?D^J?xG^zs6_0MR1tV7<@nAiEOh@DOO? z=F6U7MQTL9r-^+rT6JS6%iuE!&vDQMH!!T#M^yy)YLU0Jx6_UwZqu=Zn459-ZeO17 z+NxQHjJ1R_wllS5lU7htb@prGeEh~V@=e&Re7ClYjtI8HX>_}87xazt5%?SUhS&uW zdRrO8!XQ@S7b|r05dsnSNsR!0w+-jTt{>Fm8wLB0qtLtXnYlew-$rr{(LUXQJltz8 zz&>h<0I|OkJ{tD|7ODTP=LLM}f^NBP&Ss9W0 z9eL5DJv`K;42{@r$vJzX` zKU?bjEt@JRCAr*=3}}6CvuJKGg6sH4gm+2$HCl&zaZC_M0PM^_B5M5oe8Cp)FGoF*h2Xw^4r?$yK#@k5T?yEy0nINuUJG0aar$tboM|OY1 zmt4X#6igqM?JVfFTXQsxAe#g2@9fYi*b#VBP}s-8N~A<>=|U|wF*#|~pAFmpaSHU5 z(iHHaS~9Q+lod~8{3O`@u~$HCpx?_boobcL6(QAMnN1bOctv|Q(w@0q?*aAiATYU( z4@(9k`IvEBa46R?fb002Uz3U#6 z13FH1uB6{*ky2dcP5*N<3)DnKEr25*(s6V5&~dH!*afiBki9DJGv z9Yr>yv4{6y%nuUgzmsJbsE2%5RG;Lsu!3R3JNl<hPoe@_=Hz~0qnmfh>7OjZB}$al^+_Y`$N(z;0%N|D&-^Vvl?#ZdFWNi0sr#0~ z0Op*vA7|a;2TL!nw`1ANfM}W&0@X&3T)~2;Y0u#fs*+?;Z^i;708~ccB}`<)B;91q z97ZYg%HJjUuBU9|mG?YjNWD^S2Ee6`rxsk~1S! z>$xE2M1B!ZNFN%Q2ync>KHgQ9hl8zwYsZ#PB(!{}GRo5~@viG2&mRM>@S-87Gh#>1YB1ZlxMQ3@j8GO$pa^7IdY2gN_p^GDXswrz;@@#MId6TRJl zxfv#h3$y%k5?jFJNKkS>toOrcy=GH$b~z>9Hn(HmBN@=wdl@qLINQ;Z$+8t}>+pUh z(drXa${Dufx;=KhFF=0Sj@RfM%IDaIh_&B6gMWk}x20*BiP`;uf9VCg_aKlrY*brI zJM#O0ME9>mWYTN)su6X%U>H2=h!m{T{;$a(HIl%gj;;ooaMNGyl^U?aztPGQRg5i{ zmd0rm-BV$k0sgQNLTb9BdO#AhDxC}3 zXj8vrGZ9$}VNRDwCKveYBRPZphwOV@x{Ug_=xv`(SL~q;7nMKT!_GWA2Z2BqbJsdk z9P}mz?L#!hs6}zqhL}TEFg!WzzCnBO&v=864dK_k_4?6(1cNE=wZFzF5&au|xS3$| zJYJ?z`#Ag6mod*xy@T39zeO`_^8(0d$@k+RnZuB3#sLUX@!BSSG8jVOeoVR@X7iV% zE(trv;b|*Jp`rd5C)#ht@*eLqo8sM6v~)QKxC9vtlN^I-WQL}dG8ZIs2$E6I^|VF9 zdeymYxkaI$8lk3yYgUE;>?1UAJHbH@6DnVUmj&_0feKZ%VrlyWOBLjpi9%e6+;9NF z)pt+Zk1>h7G=j*s5x+QYAR~1MGT8&)!b9y~pQIfZZx5_tj@qVi*lfh}Yt1;2sBbkW z`l6{`Z&GFOi*yB?kq4K$Q9S0i?|dEaGOPh3VXa1E!PTO3e$quK=H6WN;C`}{KE$Dm zcMg>j#2C+(VF1+U2fZk2Q7wn)VURs*$ryi+RiFX7r>O?+uhNcgv>~CwI5-G*Jv~PV z)mlKcYH5wZTwh~woNq{4WWPwq_gavo7xC+>vK@T06JX6k>QCBRZ3se&JEOMAy@Ib? z+xnC)NT`KnfHA}~$R6sUgdV#akbXN%%0?9bi^}18f)s8P#t^kSf||0}6J!pv3;5g* zd@|)TX+Zr^ur3ZjQ-qQKT82{<+&>P`E~jEJqDgu{zsc;ECXo48`FYy>D3UPPjN^~sWvHP z$04nXr^CI>mTc!G!+w-mtGy#lsrx}=@}UdphjOE+?gcYX&WN7@R+(Mo@c)V}3d&s- zga_T?@L->EGS$o`h8w!^2Zs<^G&7spHlXptM`=81@jAFqV3u#NvTl)CK8NO)aUIPD zT0D<5zfYR~A;7Nm=W5rA;@?6|Q0yU#1R(KqP4;ZP-=Z88t z1adJJoV0e=QVDsOxPLtSZ$dx?Vfb_sSt_Y6qIhX5i=if@mU6=(6q7fsKZPiAd0571 zHk8C}mjn}lfgL>KsO=svHHVRM3WBKEv!wbd#YEMZOUe3)?prGf&|`>6qwNHecg-(X z1hY7?6#7w<V@D_D(xEr=67CKjpr%Y_nCbmjwVGJ}mGc1a%c=^xOdEA+))V zJ=MtlNi6_JIm+q|z~2x?0Dr&&qk`|l;pX*~DUTLOHF2S@=q8g5=t@zhGyhs-atS{7 zL~YFt8xwqvP2ES$N!-G4W5RMOd7MVl6QFxNZd|PYzIRsw5F@x(=OkB^`Sh~OYE~kg zL7Y?2S#wvK3UEMSloFp~PzzrFXpf=C_K^Ot>pf2ZEiG;)8d5!JA=J!p|49kyblqo% zRPsG^^8;?dzgY+r^rVLCOgBY@DX&paNttyP?3jX=2)=92r}wmKNG3^)2GHmQc(0?? zzg4umiuT7y2Lnnyo)`*GUHc-Of@)g#yl@wcvIp1w=L+B=Ksh9eVp;f zcEF4%6|ygQOW!I)P%I4MpC{$5qG07Yl=;rPz36;*nnV$@9V>+ZwkV;qz~ko$@&`C7 z=G%(JwWtNVmqQ%6M$ARYn-)>eTfmfM$wumgh+v3+`lgMFwjzW{6iC;w*`r{e?r`ej z%U*6DYVvWHYA8R(8&hK`G2QSBtb#Ly6Q8Ot+Fz-Va>}^)Z@EKQz0mYqX zyoXK?%g8^=vlZaboF$eHG#TGNc*x>DE zss~)lS7syz#O-&ph07{eC%wlC)1bRC;f0YgIUcz8a3@2IRVtoM@|(z3@?*M*%=#DO zF6Ke;o#0?%QkqbPZPZ2V%t4PN=WQD(*n#jSc}@M)_fiy-98^}Xcn(6mXQ{mAiqIHr zN0Szm6&q5R`fsHPhp-daOY5Ra77$qXQ=_Myq}uvf!7x~xJOn8g<}idbrpOwsW3^Q@ zWbr1OsIA{haGLM4Z@l-6+U!7fHRaUenw4Nmt3A@%Y6BQG1&8(q%WKy#qo{7Q46w*o zn$Rob(=AUSlMDIoMtKCRKrLjmgDCo)V3SE`1(E;Vc(N#%Vd1VqT)|qKLL;VELawT_ zs)V(ziE!x-j!XlPPHO({`kK$agcne2%sU9_-~36#I!ej|)WM>S*k2+nr7z46h#k7O zBTi)5X}Ui8K?d|@`F^m#0+dG}z_95e$>Em9SE^=XIMeWq0iduisUGrq@}5#b-GeAx zo2M1Gx?{YG4#zXO8NLK4v?T4)J~(fdxNC>|!!{iy1W&N(M~u-JJYuCy>}gkC(M925 z#9sANx^Ttmrnf9F1&l8C>fH(s~Z(G>o)VqO7t%H|Bv4BQO*#LO86Q zL`1zhcc$?&0Tf+@m-XE~35e)1zBa{+5IUA1pQuYH z(#nqmy$*}9%>56zEiUe$P|~T_!*Mh!@DooZ9!Fn+2VI=DQM#!Pd%$m$dpWU5I8=V) zS$kfJ(~!}05`N>yE}aEDLX?@piOo_Ha!y|)u%C9Y(p8~6N_R~Kb)+%${pEP2nJ?l| zAmzgg*)>-&QWvrxvr`hGS$sL*9BoD>M>nGG6`05jdlowJ`%V^p3M9xYRRc@sQ$t!N z`ix8FmfF6oZb3!(5}SImEh8|! z>G6Mos{XisN}$PZezUZvfBb5*#juddAV-VA-(L*=?Yu!nNDBXB9#bB>=F0Kk?zOHa zUQoSvt95`v&ol+AMn2WXb>)JR#(imOYR&Zo#L zAj_W&6U`SQIm9S{^a@ddro_P@t@xu0W*G#l1arCs0|p+4hnl6P&5KK=o)=X5;wN#7 z0Z=Lz-+)^S#1haAq@Io$iH{p^6*r63au-GRgO?z@d9ln&+t8sLpBG8 z+ktBf9OLW0@ddy5D=aUM-LKTb7cR#H#)^gu{USPpld$4}wNw*-M4UXb8Ah|5Yc3)& zn6D;GzNo8D1F0;G$=s=hd}y@&AcT#-Q>19)B>e8|auj84ZgGu?sbZ%0fJ`!=hXmX57AkZz;#byy2{PhsO0LtXIzngu`??j^@FYMM$J# zq$%b0PDC)__i}udMX<=>o=BkS(}7F_aa&MWxqb}|J%3ti`6S8#=j3Tb68|SNMF`>A zhr^yFje1Z{$~*MK1blpBBEU;6_&s>f!0piyywdM2l_bE9*Sq8UJt0uDgVK+er5_D* zuXq{o_=JPU_jB&{&XaPCRV1UI9FH~Ce%@s>3ieAf?OkoHK~|Ay@HFR`Bo7&*M8d}A zm0T3GV`vpf3Ys=Z%2iPrxf$wZj!h%@dNJ?}=}8Sn!*Db`&14lk<`4M5Y@Va9v@gI( z=}xxSfvF$ZrS!Z9zU20X;(3Xk@i0r!1{p>ku{et|hcD-D{a*i?&#u zPgc&GBq36Kmm<9tWScCQWOJaaNqOEjNljE};zj_)g?ODU2>6MZo6ogGKm`Wpukm>0 zJhDc*UK^TE3Rf5Of0s70o~*v)N_9SO8?=)M5Kxw_;Ur;9WYv0`wq8;}cTRulW@<`R zw3JlZ)eS<~16a;33`_B#tz{5#>Hf;gkx7iy{Oj8=oh8_-j|q#w=SuZ?5m#-ZI5h49jjSL23%Dn`l zTIPp%Ozn`X)k_Lm-8^Ggf64Mr$B)2DtSi`I5l`0s2p%G4751_}U2r)KgdUPUl@jF9 zYFgQXc1&gcP}stxdge7Tbd`+7Q~A=B;|*u}Ml#uw5GI&_NKNGWWJ$?_9oTgUC%jPl z-T=0eG9b>gLn|BwiXD^Z{2vV4yJTyP;Q@MTA5j%r9g`HLf%~Uv>-kwYDhekQxq_-@ zR>7+}Ytu4rg0w~wzEsxyb+cVYR~$JV7WhXj@EOuUBpvKy`5hkU1ftVlw2_Y{@;r5R z`RRZghX6X7Kq(KEEg9gUs^1+!22^EB5K-u(R@pVU>JXgqQ{fGe;}UfmyXI>Tt@k=X zucikoXqb=*z6D9dQmn9x~bi#MnukjxvC;5?44HQUx(b7T3AUig}7 zdS02iju%l(wtcWBqoMac(!3=mgjNMY(+D2BONJrZAv_#}cF2Dtw4d@Vi}{X(ARldJ zQuZbMob@l{)+8|#+wh`w;AH3-XZFtkvT%U;Bjvzy@9`&1+`z?t{4MJ!xhN4($M68_tQplV8U0=v z+5R|2B@ighK~wBj2PWhB+C8%qdA3=XwzS^v0=hg*SY3I1!M9X|jJ3yR20S^-LRg)P9w)cAZne72oQ!Y!<}iwzw_!=qt=O8?Vfot9_I$T}f(EIqi>099 zb%+%>(O#m(2fXilLjc^HY47@Dj33K&awh#ojZ`jdirqp7eI4;bb)pZ7+EnswDo-D> zCDe&x(ix@jBsi2wn?Y*)NGZXYov;MV2F-l+^*e)d(LX@(VfwyS73F}|c*sTZ9??X) za#f%!+Szij=nGetscAApbR`zSlF|`$ISHEpvEjEAsb*9n_?Q^vDo@5~eQ-n=6+osL zlZzTCg{C@f+g_;*>vML4g5S1pVm4xTUa}cEK06&QsZ}y_JZd#fdur!*wBtK*BJ~lO zk2U8}5{yG51u{*aJYSr5Ev`SZ*F9A~XRNL=+R+NZI;vH* zk?)m1#HDMsD1p`)oIoxmry3{&*H9On;e0+=doGs|bnHdBGXyDkxvZ78sjnm)RhIt2V&O4+4^FtFT67&`m{KlXNylpRSBl8eJFjBlT9X@neOq1D z`I*t4upJ5Ot}ONh9X#RRIqp_z8k*0!2P>^)m~nTL>22NN4ac0i&k{G_Y$`SnY*@WU zj0~P}pU^Yjo3>3^<*cvhylV>9ik2TA9QY+f57msXF4)`N*4sqzNO9zuG;uU~6Mt39 zVOz%mE|}FtyNAeeulJ5To#hj}JTiKEzk zf(2|JSW@g^p76blRXo4V+l91x)pHm32?*W$!WbYi20KK<4p(`6S9VwsyK%!XT7ni@C9 zTH>iD75eGYOVxSr&kj`hj3J&>QA8H6x(kES?nNich*1AhBN6JmA0o5dH1#P5Y>XCz z=!&l^Q#OOnN=N%(ARd#1RKHmFtnFxMCGbZYE!uz?Hm96rYz&GM%gT-%z<*Dyx1*)K zz>U%@{9~-nX_#b*;0DCy-tY1xk31LfC>~~z16anZJ|}*v#-2tbzKH&bG!Ae^A})O< zmL(C}I6^#8zhI5qb0h?8HQFSH9yS386qVgC9)^&1Y^c%pYBx_Gg~UhHb=v5p~Z=*XB&A2Y`>##pQ}@q}9sMvFXYGsg1{@@F zZxIb4pQfu>>2!%>n8?2oTCTNYyXXkZ0R2wqcN&Lpv|tp%#ujbGc3X*BR2DXa@dDw~Q#AIGXJDqfXT27pNr&RUnCM|UlJhYU_tLBXJ4)WfeZNjXKj=A6Tgr!7QsAbVIWajv*Bhc z@$7Rj6FZe1F8G6JNf16 zYp&!()I<@ddAce($j2Ott_VJLc*Eh>NyVNnu>L^=)CqQfI;PZC zM^f}0Cj}uaVnEP-YX#_dRL#JkRr&zFstQ-}m*sme2LMmhbiv z8y|1YsbU~!%-Y#M+TI4V<33)9?xPJEcKz2hH2>n8Z2DhV7VP^*7)P>?(7Pt?vWjk^ z>S?^Jg6cE4{wt%T18IsM6edw$hU_M3O7_$upZW*f@O=D9<3J}f3Qu>#bHHA0Tn~-X zgigWz9;HmH)q8_U?dc$4OXyasY{9P5HoO`)->7ZH+5}fM!l}KgO#I)FkSU<#_osYh+nh!;>r~2 zoh11v3ecJz&9w1!65a64H8Hq1YV zCK0Df1R>F`e7FN|qTQIfh&_KrcthkZK8>@B!hzt@sR6jHup?BF_(cW~f(Vi&KwmDJ zT`GB0u%Zf9a8EpB+{=o0Yfa90L~y6s7Pc#T)=w2_bA*Qi_hixY3)bG@?yZw8w10(F ze%C%;U<6v$_$WRrDQv6GxA>^l-qOp?CFl8Koz}*7E}-ofNO5P{>Ff%z$`INT_R-b% zZRTXQJGIFK%6Nw0tt?!Ym;+&IboC^`+i95KIKac){7_f#k!1i8d+0V@2c;HlHElTF zi5L1H@CK|Nyt8clkFA!aDHj3TPrRqUkN1n&VL}#KfWh;A$Pf1M*Fkym4!(6OANKvi zkbl>7%5XiL>w!AUF?J{`0Vt#T)C#-O0Xu&$+INbmV>a#+nvIe?sf)srSKxQ0!u4ad z`1@7pMs*(3Zy@ejlV3ZrfwxiannBkge7FEJVn-Zauc?(6T-pClq(IqqAq=v(j#|6l zEdO{5k{64a#aU~I^mVnPPyQ5o`_9$>q{3SIN2*h^&0j|SqZ}EW6o!@M0+Ehnl z%FO%T*CGyiTpaPo?X?zUe!UW6+|OO4j>&8UQA}w7)Y_azYtCTwe#(h<3Brm^>M6OF z;C~!V$6@dPJRYjLb!({}X_>HFX-Sgb@nWs^(6XMu*A(Z5-4p4A)UxFANTl*XVP(X{ z@hB#wSaz0_f-d-SB7@UlZwm8ZD(ZrtmA?M}vjx5$x9;V*UJ>1s{_K4kkY1YzX+itD z80kOq!@mp@`Ztvu>~+Zu5aQlv949t%D{uNjCIW|2#xcO|*j(T;&u60){XGODQWYxg z@4|PziUqO(wiwJPqCoM3GPqG*n4E9&cYTXr@M;+UunQ^CBrrBrUTs z!n;+&f{Y`QJJ@{-dmljqhP+29HUwUK9drgGt97?jA0M{|4c()T%@V2tiih+2r#R>{-tb|Ggby zsPtU-ZgmrqKV9t^oj`;;X@kn2z zO0Ezgf=VP1a}4d2wa1_K%w7{AZ*unM^Kb7c2=D&Yc@57B?~CwjuW_+q%VxX1H$xLN z|EiP`GCR&E?h2Zqaa73QDAJ&`I>0v|q+?+A((W4i?GEX72G)-k84g&DIqUi2vZhx+ zxD$LEp9*Pjb|KNJh#_yEiCPjWDrn2O%9EgOQdCuuIz zZBfWx9t0n?GqTCbH`|;=WWsfZkK2Ia9__I|4t0mizlwjD<44<9wnGZM3fS%9>*vcG zd>#ka3V9_B7!LsZViukEi`FeSd$}&o{2z4w4#L80f?WrO~Pq0-ctjiDBY@ zWDDH}v{HC)_f?KOuf>O!c+0@o@vSE~(3#_T%;UVcoZWdkW$l253P#=e{TaPIBibT% zVFsV@zwQ!{R6N)tlRa8!r3F!Fwl`gk-%8V!AP>{WXT8)=hl<5;wzWXca`9P3!ogBR zv%Q^l$|?&j?{34%uIZq%uYkYPqk+z!YgfGKeKtSr6CZ3?qqfZ=s@RiY{zZ5zp*96+PrbNX-|#i=TGU?e1WECbpXR6o+by5I&Pi&9=~ zZ&2ewJr@t5^>%57u~YOO(4zwCL6`9%Vm5N(;eQ6k8~r3AK=HT`?!tH8iT&wmr28oSjB)F0%k9RtU+qs<9O#nSu8PSOzTDz2`_CEpj8p&^ z>(!XEGzJn5_TAt!Xft}dXdf-wal_=xM~D6W*~mthz%BvCU<{<@&uVSpbD&JGclS61 zR`Cpg)f@0(&H??&hk`yu+2L~j>DfUXkcp2i3VRsHeeWm`F}%d$GLYm%mICZ0Rb7(D zv%>#`C^1;*QPqyJmqC*|GYH+GjYvvNkK%jZWjU$sC(HSlMrf3A5Ck2agv(d#O4Ydj zY}W>5(#z5JR*w$zd=S42GaIkQo6($=^@1<)n{8Z#%$Uu$nB2Y6-e{EJE(62gz*DZk zL+tV!G<(2wv^(RyhM0=Q7MWTJ-ogh>MRc;Fh8^+jhC;8>I!ppY8|}sh8A8A zBHV0zdX&=Q8ka?fRK!{JH_4`s;HW<&!jve|PFQ}xlL^0&M&{cx!ke+JVbCV9+=GdC zdT?k@6-!7xor@1++&(9Ps2ZYV*`95-pAp5o?R}@xqn&JX?&2?;IcT{Rdi7~BMF%kl z$7FfXZOvNdOb(HZMe1OZpJe{%Kpj*){%AmuJ~Xsin3p0ro6z>NoJmw^B%8a&(Hb`*;OJtAJbYw$iI_+y%!5>OEDbPzPHhBb0d~ed4ht^yNZ9FPLqOEWVFJNGyQqZ)4Hah`Wfe*r_#!SY%lepuxEbw> zQRq}MnBjEG{yv4&3@3^4QtkEDMl7Alf{Qu^UO3Ho(On2?uG{Y10xVzMy@)9M|^iVa%qc z->s+{!F`sGOcv}`1>3nWn)$|5_TH=tlc&pwhH~-kpbb#xRkpbv&HA(*gZWSz6C*=I z1p(IKC)!YQrwd>?v`9o1xg}g2;=%SAn=sZ=q1cjuO%L`{pXy-a6Zq>fP|h~f5isfG zyp{JW3vFvf$UG6{3@-PIGCw8R3VaQBST@f`vJ$5!Jq+}7G)j~yehb~2Q1U3cbKEA z2=_n|7BTu=@>O<$y8Z*17MC)LLxaMPm&}CoQs?Fyhje83f!R80X8#{N8e&^jj@!gV}vz+TKJ zC5_Nwr&E}KDtwN~-0lu?=5i89^g6gglK~uu>>Gi6l98k|hS0Q1gv-MQu@XmUR|VT< z*kbE_IR|#llm$RUF}P-{C=8a&jPqujQ zz1NDGyhHkyIm{W}R+qHy^D~hbqW(NZcZ}GexyN^pn&in%Tj&aJacNBz|u1ogt{)cvTdS6~Lqhf(pUX#iX0tkkCRl4sP;NZgRH7MeY zF&flxTCrUvEsWZW(4QcxOyY1^wQqS9j?DeD-~@Car;l;byiU(I^C!8aou>+%e+DvHmy z$+6bK7F=q$xMx-*hUeFo=IL1Qn|R&w4hZOO#upG_vsZ0)+TvMJRB5}oA1slqK@67>%%i@%Jj)f@(EgraJZ-=rCE7P4~<)MAg9J@5| zA-?sIF88K1E=o<#CBN#^!nv9lk(}MoX0?y;Giht3R@4ByJA>m(A@Pa>AV998?|uL9n!0`yVLaNR0{KlHGB+A28nnr1%aGEaaqaZ0y~a>M zzF_Hu0KzSV`()f&Y1LM3pP(>Gc?~3)l8n5{bFLN}J!KDfs);GMeJUIMBBFc_B?zvd zYe1vw0(7J$vj559b+q$>6}bqm*h zFZp>p?$Fc{>vUJwv9z@1A$9x0<@Qu4Q^ceOyURahf_28YO_^Z6gU?a_=kaN~JAo77 z5{QH&qlL;yqtl0n$Rwr-H(zUOuIF<*-7YTkYUWcoTU9fg^{sW#Scll@VzN^ifENy_ zF__3@ZVrHg|vKv)q4@o!H}14i`aU*q#L?wBV|nBl6q*a&L}`4viM57~ zVI8-7ggK(X?ohzDr#D$56JGrBO{Zg)L9B|rJu8sFnWSrnl;{}ytorkLWGs>f#`2M9 zTv|b-00GoP(CM)h`d;lhWCe(Lo7jUH8KI!Gmdb(`KhS~g)e;29@fJ|h0HMAVA)=Cj zA9Rs`2_|muQ?LFl3~;Qs_ql?x)5`wi^Q2&OXq8JKS|qFbb!Cu=@^=L6v$?Ig7qj^y zv1+sn>~JP`p%%n;u0WGA-VdVoKL)?b6S&AM4I$DAZI``;Qg{OyUoRfNIUUP+f0oVh z2CXPFeG~`t=uNG4jTE-A9I~t1;sEMX88On*#%JgjQ3iUUq!x5N|EnD8L^~(XnN9-d zO&b9_euH(1z|jkchw76ETD|F$u!bbjENjyvsK?qpIraQS=?PY!R#m$l{t>>@&R;FI ztlF>6dI#~TDT)j0gj6c22{Gak=^o;dMPmMYLQNkF!pl?`j7~?AGgI*-s(Z+tR@G&> zI1=cx@>ZDJ(W0FuO6wbtWlb4-F6H?ZqQX8Z*r(UL>mEv_%p@eOaxT=j`X23t5T9)4 zAgC4NUGmHYIl<>t@1uE)+ZCbM#EQy#%)Vp|Nq0l>}>Chel2K7?qtkJ<;Z`yphL=#VSjoCAzF zm4uFdz((!YFurDhp_&Drls;gC2#KPcw-wYWm8n=Z}m;>hZGom&Y? zjRkwKkV8%X53OwZQnkj%s81o&X!Ko7{7k3W(TR8i$Mg(3l}UDtp~=U1#3~4B#u8et zS?LX#HRuo2QnOBmw>=ftD2P8Lf@jWvOs&1Q~R*jZgEhur9x`p{d(8b?j+Jom-l# z2lyu4;3vkjbv4g8TBUUr=5rS7k$l*j zuN*79?(b%I*Pp|ZD!la+Be4BWwdZ|NztD{0>5BvkFx40i|j7EOfGNN^;ks* zryMdjX_|$CBK%!02i>_QIXFm}i{G;;gNV`PFn~YQ#w1pAQ%y#I;53p`Tv5t01*;tl zmJ+gt&o#GOnhWyU2DNuANW2AuwYCIAJs3g1_vd_&qLBqBtFupbt6h$a;va!MZ>I1mjUh`DffF z4r#WyI&bxRt!`kYcAvxO6xD?`fyGfCyO}P&xKx0z!0S$w?G}dG+lbr)sgg~I-1{R& zv7*`b7xV{l)Z!9KXZe5PFir$f1UrKiwtQ*GW>Ed?qL<>?9$hLoisHE=Q7W`056Y5D zBbXvG#uME3`bFut$m!IUoLk%ytyUjo$veH&_BQFHN^PggRB&#G+H>Bd@O3Y}ZvOw< z7=lAMFnYOdAcU`%IIq(gkJ|kmsMvV2xN&5}ImMl;5R_J*eLWz&j)Bcs!`q%p5hDo7 zWpItHE}D8RgMb;If!Q3YTqm1r%}7y>j718=kSq_7f342gTLk6ho)TAJIKaJKgJB!Mv)issCtt z8vE@55k75o#3pp<<%LmLl-|!+0&_Ehy6Szb1_vttGP|u)vnp@HJiUj|Xg{C}zlDcBAe4ekl0qr<+ev>=6i|v97f-g0%<$nx zK1;T6go^_oGi!NdI$1dDh`}aeKB2Zp>Y~Gg@7t^ic07_8u&=atko^`d4$ME#mduJm zH{R`?T;zBnKV#PWL&`;nkKp%dJQi8$K{2>|iQWbclAoajc43Cgp! zJ#J;2`3XBcWwB4tUakdH<2l)&GQjIGv|Vkt06M zTiIX-Ir^k-G^kY}Bhn^BHa%$H?R5`v30ff!;bFd>fEcyw$Ewa3Wq`qWXwE;}R{OtO zwKX&4cXxW=h;9`X!_ng@Sl4^2mtMr4A|1|yQ9v?(E=hQ{4Ov$roBw0=F*~$i3j%Jetbx9(36IWiX8)jk~5 zpO-h;sS!4@6x zAr(P%bq+H2O%=K?0i6i8hpmk5gEvAP6}X@F!InMEc49n*5hRgn1dXVswlLln5wB*z z0pb}_ef9~aQKa3vgN5|n7QSmA_Ddr~gIoa!YO7rSYCS2r z2NoUdwZ(MU`(!eo1$lVf{-SLuq7>gFpdVMN$UjJDZ)+A);TI1M9yJ$oCQ6Dm!B3HZ z?Kx$6+GlycuuB7pWGo(xJg#(u`39_ldKAtJ^`w%>R>%7vYOnTke$E|!2e5D-GN~!i ztK1E#a>+$|p$+q@-_jIX4&Yim?*3lMq>Q~wEJbmTIW?%A9oKA=o2`9NQkg5MSoT8@ za8*5sg*iBsrJ7^BxDW{p=O?7ALY-bWso&nrUri%=jOO^bN%qO2?Zt!C(kg#Za1SsJ z6T6Pq@oUe2pF7p@nDB|O#H?)C9cG(5%(p=o48xM$o&sc0x#&{9QQ57lM6v)-f#Bz_ z4}l4mW=ytEYk}t|SJHwA#OBLSxd*uwa6a}_okH>)e!<3r>OUdGx=7aT*8?+yE*zCYxQLMs_-;;mn z3FN*XdaW~o+_?p)+UmB$6HP`$>74cEc={xq_u-ImSr!nj5;Z<5^Q1G&?#QYqqqG!r z%?j_bEYfG5u&;X9?y&fsUZ~1hN4eGep8Y?#3bqqRFQ?xjIE9e{R+7+YO_w%7&Pw>C zt+$!-0;N@uB4m6OWLbLb>UT8n1{vZ!$(}~3d-(TL(ftM+Cl|FqT6a5Nl@$RA!bPWE zvuER-1$!fs$349@i!um?m{HsUx7Z<#c2tU==o4@u3i0vd-Y(j=i$vLnk*uW`*q)60 zCr;}|&gww9wlr}yhYQm*P<+G$Hb@M>H>zVuzWq7f_Y-ilaov}OlTpvm-2^w;qZCrq z>?0784)wnuuGz+c9@JLpS3#9QS2?_ehn4x!GB)EQv@gjY$qsJYhb~WTl<6(B+Bpfk zvrk^SCdawGO2V_>K3MRJ@({vb?FU>E5m_%6t%?SD^nz=K13Ia<9bI_`!|O+RziP{Q z1eV`_gq+kP-2B&PX2ze#z^y&E-2-YkBnaGJd_H z2yEM84UIPb2_Gc=X1GP*$Djxs2ZFaoX+wK@*kXmq2(SKGJkT#<_LYL|ZR|!4_fa-z z&29=cVSXbmH3>UZ3`(<=v0Ei#Paz1l|F`i)n-5~^cSjt-rue`h@vBCa*ImkKdK=-F zWem|gz)pwn*vTUXM%zbnxuwOa8|8 zE+u@8oN|vf99Sj7O=YSPUz@YpIZTsCz1Y`?%tC{%5-0sudJrGHksk(=HV@o$r|zAd z$r}|Z&GPk)U=Zba5202SzyQlf`R-JI+10Ace$p149HrV@^wYmUr!PkwNANh}A*=3H zUb7We?d}YAin}M@3tMehQ0|L)^&YK=5A^KGccjAx!pdIp)m2oLyfguzy-wbt7p>gW zA!XpVYNZf|1LCi@nnA`)T^>Ni*HLl$)e2N{q8lmU4B{P9ge3LhTm2WIRW!5Nj!xhm z(yjRC{$kxQ*mtHaqtOM^kcnhbebO2%BcsW^iD5TBpf(nLQeKZv{7R41t0Nt45zzom zY}X3z;{BXUL+_un^qP^LzM$*)dS5>O1jnxxE6RFDka;kl1<3!8Y^kqO zEwIyu6aUoE&_Tzs{3VF8xU+ey)weKm-ea~t#YzBg1zWvR-LG-dF}%cRmu-$PI<&` z8zkPjlX#7{|C#K>FQ}P{&ajh#wy?>&Z9;dBVknI}rKrKOP&i(97V}`^1IV@w82C-? z@Cb%@mS7-rcKjxTL;LOVg8kgf;qL{V*O?M(vndS5wel;9o}Dg?|Dmb? znE5V*!eZeE8Hp&f3_g1#q7Kttem6r|F~JJeCzSXfG1(6D%ES`+4Xcd^+DjB;Hr58mhcusizC{Qy2K#9 z%{OC9d1~NrsEO@VY}-*06~L9ed`8!fHqf^8TP%2KNhHZgt7-qxSpAz)E9%PP8{HL^ zAZvI?v^zGkU?@-!T=FKry=Ivmab%QF%zC}=bi^^DP0|&Q+hlYvy4c_u&5Xp>0* z`&7FxZAR{~37xj6lMk$n1guarY`;FlN4w5R>6XoWKgL*1L{j@!958~3@U45r1n_c? zqa9xtE4(cYMlCJ^{0(cg*V~30Re*r{QpGe!jMkz!JWb$Yv*&_ql z7|{Mn{!8am&YRA5KndmVP~s+(XSe+npIMsR`MaCO7JQ(9gohFk?qq-M1t`W3diiM2 zY__4>8^Ua_bZN(WQ2E3d^|ie=Z@10evC^}>wCvEQcUD^iY)}RP(9rqfA-3^ChT%M~ zNl6rc=eOTNJ^(DVVUTv@&w`o`^-kI=KsSXTtD$;njw&W|7NBS;Ls2Gj>|cF%$+bfu zs-t+ly>20zUatu7RX=@C9$Kf+svlnIPD@*GrF;3XHXBlXEZB3=jHNn)F!DVQBPqH< z#xRA}iIR8v9i{FYED?MdFrd z>J_wj9fi1-mpmptf?7057FVV1YJqLHi)qaKrA3U)p6ZkQ*W(3R4^wez!n#;zG4*-ykRADR|l3v;y%?iL2vj8uPQ~*n0yZ0nY&2O}Wq5vdY+7D3sa0m4WO^*Z{ zN;*LYLGK%Q@8l@;=sn(tzfzy?Ta_1Pv^xC^)x*^7ra`t#aEL7TWvfO{H&(bq-&n@S zC%AZbOIsK!GIEKxc607p7Vtpe5RcZ!ck}d51T)Qi{$I#4UgItbqB}_<0vHA=brLlr z5y(|YZjXE;KiME9L#jq|lDypVX8uUcr zXqJN3%BxxGD7$#?&hAx*t2Ladj9Vh@R7eRB`xu~o=^pg~ygEY9cZ}exI&M90jYNJo zNDrjl7W4rmF_u5Xt+~(|-$ENec>QA725`Q&0Vr*J3G=@UnaRx_L+)PJLy@PZWKVbT zBj1dutMUOMkvB>UGlSd}-$E4gN-0nmX#pg{tlIU2G*w zBF$qZ%{?hwOHL}=dI}JKbjp5Purm;5KjJC?tz=p%FJ-m11>c&@SuD*2#euyoENKH* zjZ|PNzPDvuQ1-5-?7h#<$DM+Rz4CpIm6s~ti;>(fdHHX0x;m8O^4ijjd7tK0 zzTnBz2+^#Ex6XuX7`1W(kLXN%#6Zb5tTHIy1)s=$*FAxSLg1?1BX2R_3**Kq3W$%J<^N=wdG_B z%fJG=n(f0WX+37EUDm2q)BnA}lBnd__WsK@qij9I$h;=}UO{QtFVv^T_{|dtXm-SU zGkiu2aj}a^oB6rNVu%5p8d`kzKAF%V5pq=2hVuHy8JuU?pnU=fV#I+*w%Ak9p#y1$&BP!-$&fx0zIHHWpy{ z#&(<9Cu$nEr7`Pe3yDcLgL#+7#8+qd8vEYn+XLEZSDGJX(rRb^zNQ#Hvnv58tq-ifrgpQ$0GecWSa-K z9#i?<4_dq5y7)mL`V|0M;19>9kny2m=&*@4X{69=HvKjm8)X8X9b;Yo)cN&i=~v%j$vNYvuB&0=r-}%9xv4 z`U8+selFZaHD@>l55`$647z&9jc_^%EX5bAapp%Sr~Akl*^?IQzVBM zZEBt$8Me7S{MxU(NKCX?S9(%Xjg91d6NTMUg+#%Y0Nv%0=wG*2MgJAz-nliDZ1Z-@w3WZ}nqVvfEa7|U*za}W;O-BjJG z>#~Jg)Ei;Bqq}Mgc7=z4}cg*dF+)+nV}!vZc{BqB#r%z~?G7$p)>#D%2|I_gq; zfO5V;d6GUugPzI(aMVSD+GGv@yu)}IaDK`Wo?FeLZ`fT8%$q%ma83o`y3v3%Q2JO) zDeYSjt*KL2=Yj-<^4HbN3jYErDnj77jVsH4N2%j!TS&Us3FeZzoQxDkc)0-79-Rrg z@k&iH32OAi-FxlO-8P*v4bCC}w4UkyS^0mOsjeXX-yycI20~+;FzrcvHQWS+5oYlL z^aV1uw{1OZO$&CV0C|MI%Ln-4WELt!iNj&yOf@zT&yC`4{iB=S;cDHYy(b8GLTRLf zV_}2Si|UBheZ9dIb1NvTtMac^HOvTv8QgRWY@~!V{cO&CcIjuzs*eD`F2gK)mo`9_U43PPd7WAVq2|JgrUtM_ni?EhJPHkU$i8CBhy5#npC^3$~WL`$CDF_ zD70~%9Lp#c_pY5^ur-BfjdspV!%uXU{3DgNX6z!NYz4H{MSObSK6saXtqxT2L&)RP zaF8wrxe83vuUta=Tb>PCLXX#S|7~=H@<>g9-K5F*Ynfk&qFf$5o<}Q+y8@7Wg$v>b zI9>_jESbqPz(9rlF=Rv9GA&;2ZpA#54_|7BAq%u3NzkA@Vw_zR+tYz6hTfBTBG&wr zwWRPlW>-lhb);C_oIDDQDVL3$axjnnKQTJ_gL}Ofa<6xsHstVHZ!QV@f-d#umBzJ3 z*!WyWC*8~RTdfX>!5Z84lEr>*(hsY&|YA-vMJVk@Z#9IqI$d6HJTD z?uElu>%YF#slX~xfsGlEIx(39Z8n3jahuVNaJe!EtC}naK94M*(~_NhIX36}7<#(F zRa#*+-3+h;~?T?-;#~+)F=ki%c=5f%;MVcAv)G9;WNPjjQAn zL1^R+4sAqLH0#iw>f)oF`f2(*1=eD>J(07O2jT3DZA+92toQeaU8OWT6!%I3OB435 z9wa)@Huc{JD}4XJv0LhuAnmX8b6-U4kvlj8X%vO4x?c$>uu88tr@h`>3Yb3kH`Z0k zk^6n__w%77L$sAnP|PGo+J=`FMT+@;J5#NJ<5A~RC5Ap!^??o>LJmX3M|uJAir>+M zaNnjRs`2|^=i&5*B)cqSGyF+BAclS5W!bx2Ay>o%_VSD~pn(D-5VaK`OtQqT(q!;V z$Pt+U-?oUlE7BOSAIfcjfIyf}ZyIXt54r|dxFB930LlQUhnEfV?1}bq#feGwH=3fa zhHBUIoCsVUOPU2KfcpXQM3AT(w zI&2y01e=Yd)0Xe)ORM_N*&28-G$EMnOV1%5NrxXv4+Fyi< zz+trZ5fT>LTlpX&G^1Us)Dv~j%N-U63NFPV;0NmfY9PV!mK!NdCm_lmI?w^`I9EiC z`$D71o@Jz2C3LwaesJO1K$939`(6)0d{(wDY$jD?y95Uj zY(A^*w2StLAoV%nN>!g@TVie-TpxAbOJsd@7{^_0_DTK+=1az*yz>)0Di|5Kt)Fv! z*S^)QC0c?ES7RLoNWw5uZYN`5*Gi*fhB9P?U{Y@sBiikIH!CzDN%w>R3K}8PLhAW! zkbF%cJ>XBvVTp@ud0M1QQdfN+-N{s#o5rJf2``;oWQ}0yyYYY8RH6`xjZCp|Mb9W6 z5%Qe1IV`X8qhy{k21Uq6M1gqSsJy5MIj)^7qpB#JFohWDIDuoW?X>Y+6{*VV8p7li zd2l_2lgJ21*@i^^7_*Loy(^?pe>V9QpOOp&K<+69$VVqrxgiISpCde6PVTwRmg5^* zr4`@8{p}{l2IOwKFi)4w#dcQGswla5Ep3tgn?rQn0MWAtWt(r$_OS ze{mnFvSPpyU&$Z*tIa$kY@OuenTfy$z^m?I@4cuz1&T^E@IXpY*UoB&gsTA~q^muz z;QVP!w}w$g#WTRrTGEg$*+&-hc%F^m1$(7zBi)p}y8SC7o_IZbbFID+d~m$Lk|KR4 z5Mv+bUqq2^W5Qx-7$fyL~Ljp;F<}MPvkEM10(e(|RE=2h=S+nFS`GtD*c{bpP z&tT>!H<-5b)BslpWP6r3OtaLbu@&q_Gmw@(>TAo%dpe)g93L%2G4O>4l@vV=? z`qsyKUPZpp@sE0UCb8nHZiwf+)7!%!+>6?ke(2jXC>8eZAyCy3RSc^6{He6v zYw{a*w9 zO9=vpFb@qo*5>3<_9?x}mtI$@Fe|-{XX?K8;2P3Io>_|?f`HPcdK_+0DZ~?EAfP76 zWEuIAfbo(X{qW`1eX zX18~>(oY3aY@mFu(xq1Xy_p;)h;q*ZM>r?Kc8U^CJR#YLV`^aKE6p}X`@GmmTTyq# z#78M-gj+Aqbpc==l%__)PJ+1#a-Sy*oPhs%%A0ML4it#OS7fl?nKu*5<}00C%a4W4 zHh4uEZEQO8qP`TmqDYVD)>Cg(q zaWuwq2A7L?kHxQotwZ>RsijQXYVe*xnFk$3KUyduFD=r*^cru~oF=S96&g|!46w04 zS2-Kuz0aaHsGjl<kk_pEi87l@IUY?m*WEhLpc#L=+s`^ znYWvKGby!zmGvY#0}5^>wvk3$jsSauT$(g8kchYFZ3_fKTe<0amjrn6G@QsK84P-y zn6~V}Ia32~_!3{VRJ}(Z1E#d{JqQ%{NK0ijWiyA#vuk82Wuy_LfVy#XL6RQ}r(QWA zA_?r;mW}wysEs?Eh48!sv@|i{K_SMMyAV(eo7n7dV8A;m9)c2?S^Yi-X2T z!O5-suWG`Sp&eKK4eesbZaQEb9Brd2nISXQZ><{$77P$0+|y#sF&pKjF~9Slv-rj1jw46RlHpkg}e4JAPMYw%q} z&ACV6;od~^R~1@pfAgk!Kx3dnfl5n^GZ%G2?x=2#>7`->X#%yDcZ#;7sJpFo?zU$; zagk$(qZT5(C+>*o_$G9wtZt;hzn@@lDMm!|c3&6oLvVOb3zJcTiXdw|&9~Rh=JiXM zuvi$O(?JC__WbqsAmJzRi#KRrk(Z1E+8}Byu2WTFrT1j^^->q3B5|QyA&cu&i@^ic zfU3sf0JJ0E90?&Cp%eyrM2@5dN`K*o8X_*|2P8hyX8c;ih!CvIf!ZN41W=8gL}*d& z@>Jon*HQXwXeDa0H3?lA$^ktnzya|nP#rEaTuU@NMTk|C6LXM$3<-4bxC(w)`wW?` zDerSY_!a;BMTDA-XnHs(FtIR7k3k(r0)NW+DnodLNJKI-D*j$RIg@-;6l+*C zy!9HnLYemFUEoe}186Bp&=gWuW6hjKXntLWh%;bII-OCN2uV~UxA9QGYvN;W3|r6W zvx)%;cHvBdY+=cPIU6gzKK|+vR)@HmI z+?3SRht(|3QjV*%OIw5|&O={@3&H{0BHg-&_jNqLd-mCa_3KVpgz}q=s76|_;~qWd z!e>?Vg-~KlD#;=>=%1lnC&I{+LM-fKCZ9uccPxJ(~ zrMT0|+VDJbT{DQFYz#&i>rs-k37@}cmkT-n;Art_bn*q{@zugy!o?%@?F^g~|8!yl z%RtxzDm_c&>`*yS-!_$cY4jc((o=x6Q{r4HCd1L(>Kz$x=azSTc5IS43eA#m&gpB8 zFFVlJ3A`mCFBsx2W^86awVdfr^s^8@a-tbR$bpulkA|x^@HM5*8!ymU-Cm2oY?pRg z4V|Hn@WZ1wS?wm9w1F45>nKl6*ZYs~Qu`uyr|ZH6E7V2i_e!@>+fL#%G44r}^Xdj0 z(S>m;Ni}7?1@Vb4OlYEtxFTH3hqQd-eEh~)H0ot_rJ1yVNM4pAn4<#_t>3$ubDf1J zv!g4d0sM9xow@sAxsB)hyG@BS8Wrh;>nNjb;R@iUwBSzm0O-rTI#&-&LrVtHg{gKo z(ev9vP8uw7(9j<+?=~)^-tA(XLplW4TEqk4HU+1E1D&aMWv^#*e*o<)TvGtXZnl<# zl%NA!n1&9_7GkIl5Cf?&gH~W*c7_6>>=#O?(1Fcz5msD6YYBfvlTX^-bR9@WFiBel z#NX6XauLy^tO_zgB+K0KMUS6Zk)pWG9O2WU!&zRH16laj3p$L*P5KoQ$H@}_8X6n^fFTngV^=~?s?j{n7uu#B&k#CzKL=nEA$-tPic zmpN`!Z@|0ub(o=o{gA5#>7Swl)%_!@Dp?ked+asJkvYW;p5I9zz!h_q0Q?%QH6*HG zr}DB$?nN&~S+du8#@feku*8O#c*Z&(GF#`lv_fY^K&DWRf(P;&v6iD2N-3U(1~>>q z=<1Ur2g6y0C%q`AVFvA=Lq??$pDrKqQ9f}b1?Zqf2pyQz&cCU0X{?RE#I8;0#lS4{>JD0-3ALSb2pRe{dcCcKV840O>j|eM)URQR@N>xSo&VE zwFMm*hE+Nlm*{%HWoeBf6kuD!@k3Q!$iX$e4&8d2gNP10L2$rt4^mQ6C#iQ2VLiy$5&;&>?2hi~MsDkXb;~Yyq1w_xJQ9cIS8VVd4U~)chLmfH--9Cgv z;rpB3FSdfqevSoC7q9+StDNDoNc=@PgN!9#EJXyt2(5+2z9~L2ZU~axQqlx3KBZg3 ztE6srMSxXuML0wDPzcT86t4CRKAuDy=8q$$Gq?b9 zSno9`utyAcQ)^o~6%H-|HN4nk4|b?&t%f`08Etw7v-nKG{s6s}ASmSBBD#`aa>`nzC(EDNF}B!ME?75oqfQ22#kINzgJs5od|OORecn#nlZXHAm4#r!!eRfs6`iRiBVQqn%i`8ykXF{_NO@2%}=8L{Of0xC5NA-~i$kyo5)Uw;tJ(OZ+(*}POm?~A}prU*D+RMc^a;<`jOCKeg@u(%lMlM%Vm7c08Vd5Fk3th3w~1}goB`^jG1q#~QUNwI*q$!F7i1R+y!A!YSNe(Dj@ z_ahTlNVuQuZl#r_<)BuUwd_TTSX4a=q}&itce|rJrb7`^M)3Rr2I?Fa#Xek~L~$~r z81WYETQbxVF@VO1laX;8`#;a~R7MWkPPS#Ud;qgNE%J>Dk*hfSZ%4qiRY?}WNcUgO z+n2_O$j=~_Q_^-z!9JL9)&C*Qhz00I5s^5^Ll{iQGrKCZ)3nh^g}z1C&aB}B&c`{G z5CaaJ4%V&w#)Ysfes4BS0}7PGo^5`W^Qh9s;_Etn7~6V70)EI7&6D}-jdb6h(vG<5 zM8N-TFh6MDb?Wi^8T<4tHPA|vco{lx(CdlC;G!wE_F8%;$zjdBay)n0&c=r~_tI#J zujccG%!!b=j`I|r_`55Dqqo@dJXDKrkw0XVfsU5Vg94>B)-%d?^9&F|llGneB?eyu z20|X%R(Uf)G%cp(4MAmsqirMY&8g+Dgc4D>vOgC92NUd&(D5BDdP!aRx3G55QttLX zDjb}w|V zcR>o=)DEQV$Nb0RAS>nfKA^Mj%h`J!G*IWjMt{Ta?`QPhek!Ne0;{=OsdPcvbk;+o zvTy&J(VUfe-UvqO=|*rTHd5$b9X4kmg-m1=qG8v79G@kB`x7GL=Xpy8pqXj=ZRiBQ zM8p6jDQSF^peV1N^bzP!yY}~B*ph|!FU>9RHQj0P=zEQH{b>Qg)(CGc37 z7hufW>K*y@D7;_7#;nTD#&(Xg%mJgaCtW?XuZ4ARv_-Xy@W&sNJnkT>!a%!UJh!Da z+nKieQ#<4m$&Ruqk;ftBG+&H!-}>zqZH1qDt7v!9$4#nxo}HQ`50Wyp?6D+L*ux`A zu5f{f#^~OpJ44E{U(dszh~B7|6mS4Bb`{pBXX$#E!CioQ$>2Kl0lKLVq?kwn6lH-w z5fm7k@npMwL=<~V&c=~4ukq{l`Wz_6+7Rvp7zD6laL10;@>8&}4w^iNX>o19YOA1s z%Ix9b+aEw1{s(Q?U10B1Y7@r%90dtfAw#yLT__g@Hb&X zWo5tGYEcJ|o<_nv-$Mdg>)iV%N0WH-D+3G-2RDGN?uT>voBasu*i0nKXZZR|*x0Yo za5$u<0Mb$6SoG087JUwEH5-SxeaZ8O2a)n*2?WI;HVlOqvPvdp#Z_ACbHs#xj|;y; z8fbLJc0bEmVH;t;>+LR(t3}7+<-%o8byzEF44jZ9MtsI*!Pu)8KbT?yw|ISWPtVZa z9mtP3AWrsv95SixYLgfQQZgJ(#HRO(atfjVQPk+$d%AUdNnGd>ce zQ43hECKmoII2xKK#X?em2y&=<-A#UzK_#ifYSdw5lpt`67DY_Vpe1Bad^n*YsZFhM z^4ip1J8~fSeA@DY!}kxb+GJ%|#U6DgECyAuXRmFK=p{NG8|d4j20v=&Mfkw+pwZXu zr!f^Ve#7~vqU!-ZGn#01uV;5MZ8;6w?W|8*HTz_nd0{qoj9PQTw9%)9kI--59<${D zlvRf#`y9Oo>sM-);r;3>D^2@51}I%G{O(57Y_qkdbwX108rsYAl^FXUI)Q@E+X_i} zuDZf!eFW@wJnuFR1WPS~UoGbGK$qK5JM`D}D!-Q%N6VU%b`}RrAM;tXX;ECcxtTgy z48sZLc{gGGoACu-5&T8dH9}NRRM7Gwz~IY7h1RTg&x&oQ`(QEVRwc8y9MEaMjkKZHdl ze9h?2;dTsfLdpA|9b`m*LJZGp`xm8`c7(vGuj9#|5*kwNp@|Dw({?&-ya{n2Q}RFuWl$_-xb<>|X{>nS@?;wV!rP*$`$;o)G{J;X!WF&dgIs)0St z@h(D}d?SE<~Iy94x*PsHa-1$X?#mXXcco8h*NUQ31 zkd!3qKdT~)cedcReyP7gqAe7QYtV)xCWKxPL zcCJ1@1;@r}t2D2qRn_Yu(ZW4em>`}0*K;%wZS_e8prXuZPP^<=OJVbG+G|8TSHS z!rR+X6E=I*Zi!Qa_J)NsNs{J70d+AurIXntDZ@us7?gs1#M6u`k zeCpof6@z_Vr^3EfU2C@u$-GR&Iw@nk)g}iUz1mzPkCE1tU=r~lAPX)It~2o})DS_J zVhm&fM)2|@;AD?~y<7o6wWX*e>5K?Oa@2m7vtJGaVycsT_Q&KBGJ~Ef@(nQ*;zP-sSD?C{afYIzQPh!bp=o3afMckdCRfi~; z3~xc;T_-{3Isgb(Sj!KTg?<1psV2RxR^`6&Oq@Z&^TZDm9=?MG{b!2=aa90>#H1$E zZzZhh>zzy0n!iKsn~s4V z)_#M)7Y6Mq(SmX%@}z^RY?YC&5)>@o8QE&nxSQAP64W0FY~}l(;`B}~==-Ujqq*f4 zr&$SeXXznjHV+T80Ld$cJvt=NZdQ^iSw0*IC~+k826*U)zQF!Om{TpV-=N4KcwA-2 zk}6c%Iphl8&A=uFvheZ>M{pT1VX1mL`Qbg}ZR7Jj(1-DKxDO?+*0ph5GKX2HZxfyP z0N$>JdZ})GR~@ykG5x1u}nku2@L@q#$We& zt*H#*%16Fiv^7*4BFHwyUKoXktZitIkY`wPC!_80z$(^WWZNh=6+M0YLFgm@MWxuU z@GtY0;(AU#%g6gS()%tR=}RGxbh%_QrNBGy#`(?TZyuxi%;+75Q{r)9b#SU5PCq?cpxL*-i3%9YIho?Z9iLP)Mto?KV33xNG7=~RHORE(+5 z_jAJBP8m=QA7>%d?~wLa@P~9%<%a0!e1#6g z2mnrFx7s3fTagIz3h#3!g*lgoWK9=*Ry;iZG-zjV^~WY@SZ#IaP|rgc$8p+{<*&;>HWSH#05Ba?Fo$y=pnKi zdVMuZ$&{%|)3L&A-trR%C6m8ra+DbQ7A46(`*n+zYxLukh9U7xv)YI4ws80(+Ui%g z#$dOoo~`onux>b@RDV0T3kOKf)VUZx)~G6cc3v^n=~C0*$tA!byNgj z{h)vKCunCYeRZiQdA-j*IKl3n8@l{vDvioIcnU9xp8QH+YbkohpqS!5C3%L&ji~Lx zJ+S~bD8GGDCIB5_U+m#t6anhrg%v2%( zrB~&}y8%u-($Bm`XAYW0_dngmXI4rzKee1Wjz;^hq}u3WIg$)kINE#Jg8j~y0v)z< z(DDiKZ1Wnjr0ZR{8(5s7@G>-d+utwRoFY2UMR)+e4PzWzOQcykPdPT?5;&b3NQ4|B z&Mn`>=XbHEOFmL%NdNvIWW4R)U(R>w`_Gqq3|3u!+s1W+leT&8 z=pqzZ>I*SDd;qob@mZ>Io#@6)jIC6cZQNo}NcrZpQ_d%-!)p#Nu8P<*Hcp}RU!@h< zh=ZsHm2lF(vEP0cw~YmRUK=ddu?skp9))O9Q&R}3>ihLK?Kx$2M2;&7qFdGR`6P{T zM<&MbB!SeO7Qmv=SQ>~~>$PEF%HXoRQ}MjD(Oic;(c_U!=;C+LA)=g{N5ZWmp>bp6 zBmam`n8=Ep{GcUqjs)!;gp0O_Q}Ccl^3EdOaU!%^JRP<)RcK>U)mCw1Le-G~R76lZ zE&v|2|0+ln9f3zcHtTI+;kne=&^jplRZFe%V*c%7U#h@wsRDA+U>hHDjjBq&<~!7~ z$^?BoAMhqaw)@Qrb6Igqjxdp6fQQdyhj8%F2$PG$NtTFV<~&tc;Av_D#~^_Z*a-mS zMj@7E5nCNo(?xSB*sX^NLjh28n6kxe6Zd*jvxuT?5ssBm7%u`eCIfqg&1|Xj&t& zC5?nPxY=9zSQB#YOXLsx`Y^0eoeaKWU_Em+Y#z&d*_ zL$OVy0)p8N;7VXFaitF(JQL9@QGI2h^-^3sQxIC)1(s#)j(C~?5SCY_D&V z2_!}HbVJ0fDkv{878PF~1b}TWm^(VL2FW#U4xSIiWLcf-;y6-HFGU8??Cc7w zi8t)FbHF%yT(E6asvd90Bk&}}K1Lt4NkE>k*&fnZpxgbm62(>s0zUq766i{#`vzLO z-=-BH4g`tLMu$36&`k-<+~dJ4B#kb2BG#Nirw-W%dG3U~P~wsS;%j*@^MdJDw%d#ruHk6rr)=#2 zv>RMIYNzHw7sqGv)B87jN;zQD(hDuYuAE_lAt!6}Mj!g(2+s^LqN5ma90C56K0AxLBUv-L@Izcd!R;a_xlnlI zMnp*Dlnrf1{+%#Hmlmf($$!Q-gT*9(d68Dt9C4tT-ADcIAsYOE1u-k9#}_ELaI!(I z3l*?YsRu8C-+z>*Pe;YSbmH+o>Mm;U^{A*lioZn;OL*(A^!D(&SG@d4vXeBPN8u{G zeRB{gTu?|v3W!X)+EU23Sa!fF(qW;Yym|XwT&dS8QBZg~r&Ngj4En$|)Igq?fWl`L z3(C7Y2XKP#@nWyh>(6%_izjVO@v39}YIS^kgBsR8EsI!zApQfJSYRzhp|6Q*S^H6| z-Y_1GXQ{+J_wWlWRf*Do5rBhasn`2TtM1;;k}noze-gxd1iULlL}LsaAT4UQidUbI zA;9p1@akDewu$PvOcuJB3HRR2;4ZA_gBJg&opAUEIp*28^e-c{ie|>wYisNQ_G0V` z=#vYmpu8Wm4;So^vW@gT^jQxTbFyDKzpXeP_TY6b$N6!C6`!`xzEi9r%u`9TC4_}! zaLTgv47P5u&S%#wS5avl#s`gt^INp&6-{-Cq^{5zGw~{8x9Es-XyvZyw@|JxMRyMd z^>$22({4lsI4cnxc-!4Vik|`%6bm7wQ_Qv1&>;P zXNUbs8%9^8?beK53>=S<$9{Snqn_0$_|s~xm_6B6docX1)s$)8waohuJA8EEqqLQY zIlWMZ4PH^_>onf00)}f!&oI@Wxt&9HR@+v-d{3uq5Blv}WFiEBB`_xih?BfE?dJM3 zD^G`Yl<2;lTPd8Br3R_A$IRbA1Q_J8Ta$ zpqAJ_0ZtN_M`JQv>NW24WjPgCCuKzvV7|OQ2!XG92z*`bpa>=_!PF7vCvjzp`nHcB zV8rcZ`*|Ca6SF>ofY_WJfxMf}kxw9A4fhRNL!Qpzy(_Kyz@%ek8*#9zxQ1V{wT7QTT=pR)Gi#h#)c6aKQFkjf=?PJq-%z39i8XiATQuM3S+{2U|62 zZhf!TYGoMH4UaTf{A5_Fg#H974;1VZ5q#<)`0x~UFHdV(z zS;grC7$t)1<^7xTc3F>(H`a+^6s;;PyErt_SEtUu7jy+=h6P+Hx|zU&HZHAJE86~B z@CxsmH3cNv?Px|5hV(`TOf(tHwvBgj$G{|D(5HPwf|`2+2`&;`G#bJp4l%;1h)#ZM zJt4>@2U_t9*NP_k2PKk=r4@4veDJHosx!Po5OBCSje7vp!!Ob3qTM(OwiqJ;3G5Nq zM7iA#=~32zF4vB271ESLbYF^ysy27~ILl;mh(_B-k3_-#t)&s^+#m(nTS5l5pN*Os z_{Gh{yYKKkIy=LRV1SpKqI}@nRxyMq?fL}E&5F>FtktlkNg6hX{~;Lw4ecF%-)2lO z7U@!J`m&X8@m!$MbAh{&`q)rB8S$vyF?e>&qMOR>aL~`yszEatZ4*0ia0`Hgkrt?Q zaZcrPYX2``Zyq0KS?>SOOwweswUe%swzSiQk`@Y6s4#^B(-vq-0jD66mMz7jq;;E$ z%Wx1$D`)_PDToFXot7;uN(v$=DohGWfOBp~Xv)nf_@3G1-+`n^B*^GsUQ^ZWki zOPXiy`?|07b8XL&QCV;0BoYHBD5G;N^k*o$Ezi|=~d zu!D{saU36#YF@e7dRcAil9?3a1L~CC(dHBc40$ytv)BURo+YP_W%Tg$Ha9!@U51VN zeD83u69s+N*-7wyIS|CiHo%#0pcyY!{jVDo!xwOa(!D5yvr|!8S>jyt2)7e;1mccX z@QRh|35849*E2mA2+rTsY~O9NpAmXTKyA?qD*%pT_KfE%TnnGHMeHX9yI~6f;Fsuw zPcC4Ci+TYF}D%vNCXp7&%c_&AqR;U-SNbMGQfw0QfK&j&36tsfE zNUai{4G6ypY>as8{6Mc=g`Na1p+Uhph7+A*cp}+MamZA0NX;NBYN+5W-0w73YLea8 zPHlwHWJ?}pU+r@9GWh=g(J2h9;o(PGL0!GUb0KgJm*GSN?OPf9&QPQKdiycfHqqAw zZ{io8h^DNvz1NdZWszbu&N7h(X5t6&6A$3^@5?H1^wIT0Kfvi>_Y|(fQLaGONe&pP z@O2R*(jD;N^^;cxUUmhVb#~-HVRObdcEUT=DnYmvG6byFOSXOBv|}w0tVnS(q!?)N zlWj*r^%H&Za9M^J>VLu@XNhIy=rdbduI@NtlHFeUc6q9iu^H>3#p6fXcBw-q zj1AhMMSF{(B_%{5hKcwVu0!Mc9ov>kN)}u26IO}CFo!`!G7cdooLX59!IX?7NWQkt zR8utD07)v$#23}wFBKbrC5*K(!!>DlCUGj&#IgwPAZA`d>SNUeZ6=*N#>96JKKj#d=9X9RfE=0snq5D_a z9+bs_-K`1||B~fo4mQw`wLUG8eHJugF?hLqe^nxU58g_Kqg(sDUE>GE_)zHZf{;_H z6e&x+#CBw)CX&#nC>>!VHEeGg7i)wH2Ld;V3TKH5Wkg9o#5`7jtaL+=4ef1w{`uXk z`6W0*VK(}8NUF;nIhcnkVdf=tdF5CMSIJ*4ETwrpUn_O>tWYtM3<(`ilseU*^hSs! zt}eMxSdyRcufI!H<>#VG0ItM3!mA1nRE{(!&?@V=htp6nB2P>H6$f$?un>7ABC6du2`yd=q;sf8uO}KSCtyse$p?KXI#l0L zbc=|#XV4d26;gHF3aQva6dw!wszX~ps> zO45b>(aIOO(aN`@Q~m*Mn8!K5UtELm=eh}P*>?+N(``hmSE6nv6v$H%tsP;HuaLTl zHpH*9niM3>lH~_awbo)dFdFlHt}3VB?69ezJtJTe7obgXq1?oN%+vHbZywRTpcly2 z9uQYjy;ty_s&2UgH+HzXWo&_qy$df*;dsw+Ee-A6(%#l?OV)GjuiC_1c>W9XN>#IU!#UI1g;zKGf6R_>v;cRHE+x?kew0dg(ire_Un+RrCx4&D!oN)knB zW^pBS5WagDs;01sFgN1+WiD&`%=)~`RUO0}6nP*!q^T=mzgq2=u9k_r@Swj}W+Zgi zqIHPBY?o)`H@X4OJOMu22ZSF-V~Xng<&w{k-*a5k9BddzI=CkeBqD(4HC#7@Ehure*$5AnI&5uT` z1}X{pt$b5q!%nT`xbG8QaM~<;BO0KxNAI%wZJW~3K>N&>a^cMh6?ih=^{hDkAlTPa zyRk3f9RHlUABw2*_BJ)(EE8q%Xx4@l>Q}K?l%y-g@I4DC^N_g>Fu@Xg3o4tJy)Dbzb=VsI zkv&}qBpCy6gl39A;9}En;1x=pG;wd?7G=bya4&oB$ioy|qrD4HoyE1Fd;Us0VQ053 z*=38jd0n%(@mED3;_#D`h?5=J*ngLF$bWa>-e5T;{iE%A^y&}dPJ?_04I)$in*BLp z|16-3{2lETZCPJ|TA6RbH@z(JEUIPF04SA_~@HxvT942XNH&6gqa>!j@K>@>vG| zJ%K*kH}9`1r*vico_?!Y^ztMOfb6qH*4aq)1Sxj?1ft}2fLxg2@6gjt7<;s^7MnE! z>T%vIQS>{ie!G(m0s%Q}%SnC4QiIT!iU(mm2il~f9hH@fpd>1$=@=4w>x#INzs6Xc zoaj!2%9gyp`B$m?&j-Tkn8puM?V;fxV7t9O4sk5Aca(p+q*_R%m-6C#~XF5sNB2t%6Ln z7tp%|&?Q#c31h6c8X9cAFPhxS3J6V#CIj9NqFIFkX((vcj}{0YnX#Op4u6h|8f*@< z10p0yQei&h#^s)^2CWfVmot`Hz9VquAeSV}7Pk*lGlVhmh8EzmhnBp65Y}<)ZB|a? zi=;!@Zy{cNcR~eky4L~DSlZ{V26R zis>|%Afn|4fS*ao;X7;Z^CFkELEV~Ill>swz;`GWPFlJu4TSruG8KePE8X6Yx0UBe zv1M<9bKen&xe&WS4Q8pVAN$XHzo;$qZ(vhw5u?qdR}{~|REwRPVzG>mdrik<46!W< zC0S?9g8tI&{CG7NcYA^&;u3%F!%TPmZ&`usTPV$cs7I-lGbIXQjJKWv%{K~TY^PqO zCY!Sn)iV6(m9i~|(^V|%l9x*#3JlFa-snm1?{Qhc=@A?h7sMQw0OzWS@eUp0fjb)Q zdofo70EvE$D^C%C{Z3T?5{&Oqe1OQbrEJVhe}?wd3^+&^kXN>yI=aJXHtI)}kn5cU z1hOJx^Mgs{mP+|Qip?1UNNB7Ipjr?$H?X3tpUYT9O8^?=0|~#?sLk~u&%lbQnmDD` zN4IKX&2-g_t?$fTg*SR5zuybURli{cIL&BmS0%oMNZ^mo&J{NG!=lRkQ=vn~r+}{`*s@%Lj@0KGh!)!+8eF@WDP1?T(8AMHX*iC+5CoJq0_1nJ} z=CQ8FQ}{!Y3*|V$lm;wQkYCZb@Q$2#AgzuwE6!8B_ruiQ9gD{=^Pqlgfg5l_t2NS* z?d=eofnS0000u)K=8U!LovF>(+;*oKeIVGM)A2KBYyVps6B?WV4G;igW2Vo!z{S-$ zz#m>AaUBwMP?wGD+LfauC=)1k8)9ZvG}vqvVW2OwCguDQ#v$Atg93w8viO(M(#T3X`ncIz1SF#Fc#RC)vzQ_eW z%cb7(DvN(4rEoXL1qUsD<~6 zRro32=DWv%%sRhI}Z^!axV$`*Roz0h|F+p z27`c0r4dIh1(eCDL~wL(V;O#$M3K1JMyKPVOy^u@?DP|36Oye?6BGq$Q56BmY!%CJ zTxf&f`hu<0ZGPimifi1g+oK_`$*3z|wE%}S7f^@`6Lx@8h`+Ed#t)^W5l5q6Q-zIO zy)rM$FuaCiF0!+-2vKhX)R|9dSX5E$%+@pz7ck=1xNA29pyXw&jFn-t>THMGAa^|W zMBs+kYUc7}Q{BYRckq@Z11Um82Nw z?#khq%eizp(e}3Jt&BlfO^}Uoa!7E#+pf;>xYe-^qRIwx*CW7G!g2v?`X~;2-3~}t z8~dReunPBS@TWFSh8pn3a13T~lnIuOSY%^c1UO?5VR!;{Fy0ml?bp$M9)K6hRUX>M z^D~C$n>tRJhF*GEvC;1F*9QcM#}JwA^W+|dUFel?b}`QRkhF6>w|ig^-KNikVZghL zu}(vPjc3@%7z~$;a%+ko;yviN#3uZBlo2xEmZpzL+vi&3b~guY4>M3}#|@8-!4a4gG?AqtI-{o&OEvkfjbnhJWBsxP{ncrW_Ss zz+EXhM*}>(*HeH1Km*@9M1aa5%09QbCfA-b*Jcyi=OYfXT9VFh=ORXiD+H&=GZ_>O zau~(4t*p1ZH0$rX2+K`jyIDh9npeOF-vrN2Qb&!8n3C5#s!?2!MHU>=OT!lFGb*X= z`N4shZHefB@qj&sDTSt6V;;(PAf*CC4Z?Y6PEY{;kWyN8>8$G%936aN9s$}ip84RV zAsA096n)3=K$!INs(!l*74T{cF@>_@(-<{Jeq#UYlOcDxVK_hw!mJ|glBIHvQ3DR% z?d)afXC+MFHJ@!l26i;|GWu3RIu@Geh(6~O>;WEs8ms`&>2|H^=88RMHu82DhzOT= z>7kEp=Jns;DfZZMKk~#wWRXN*y_%SleurUY)GCNudwFjzO(q9)7~ikoo|A96fq$2` z54I>F5}PwxYnYF4T<|v9Ra|g7#z0O|xju2A7bzUZiND}?TDVj>+@M@}w$Q`<&eO1G z8j%sRQdx}r!~k0nnwtdtk{u;uuIbqK^6e=QesMwkKth0xd9*8V)B_@_jX8|YE9!%f zCyXj2;D-~i4J{}+Du5}QO*FQ1Hy$GGhL+$bXT_{Q9qPO8IE(sEgd(B5lXB%FDawXe9qBF(cj+f7Pu*-r( z)Ps8f_W5C(dKVf5A{@%EpFy50CMDTy(|6iR=P!+*cU53G*eq4V=@ztL#cI&noNw^>=DEZ1y}->B7+ znY6vNQf1?wk-SwsMC^%*cx`B?Evu+fo?00AZ2K?YU)sTYl{-DzSC)4+@#mFu4MWZMLe7i;PILI+&9w@ZQ)v5`0EIXp<+p85J5EiL^BEg;G|c3;c=BW*%OT4>1-Wn;e=}PV)_QicABZqGPf#IC{L7F#fKuA5U`n;Kbp_|Ff`JIm>Q3ht_ugCuEk^D@lKun-IUA zCo2_D)FF#eZsLna5WhA5Gcb3mUUaGgrn@mp+{FG)u)Vx z!>MmXsmcY2JH6N@W^ny9=fE_Z?XV_Q(ux=Gmn)*!N>@7C-0#H>$E~o%XhsdVtA*rj zsspO*hmp|}p3_VrO}yJ8ULNQcM~&lgiqQ)E&@$1Z%XMP8ECNxm z8TszqF8eqcLO|dluboENNYYbi*6>tDB?~l>j`|6|+H4BV0!J z)temm+JaRz3RJic_RNzC0`+v(a|T1x8L`5!S%<1L;HP#}C+w zUZTrM_V_?Sg7T=sBLGf8icDlYTGzc$-j^ zE8%8pTNOoChrNY6@eCd?6BU5al8!;(jf!xJn8Jr(r$?+I;(1e$W9DqT-#OI}q+#QB zM~+@M8+4&HP7UIrv$3J%LugiN)K2de&X(eF@mAORS|ScUn&1{SZ5pm#X)AIza;MEK z5FApgDKi8Ind#DAryB(hws4Lr@^~EC8pS*?d+oM#@^Ou zGW_MoWHFM$S~xXrtMn(s8`(H9R@AC6A9E4*6XaGt%21O-_lvgshCuZ@NbcOIDW9_z zA#JS|pj$zoSY@)B}d3M}Ns@MyR7A|kHJ`gb1m zT7_(Rd*ck8>qLi_+-qE0;7cjYGUr{-W_b1+IKmc-Wcz zE{{65#$0bEdO<2!{n|1df8C<+w!&qJK`DS(lJ>46!ND-Ilfw+9P&TK~pJYJ7(FI6{yPf5d|4z=x~C#;}wqeW!uq5u)z^;6>V;j8lWd3 z?@}U=sMvs|pUuvcx{P_L;P8}0xG_xKRRBM=&W?70)--7@uio%k+0jU8NBOaiATggH zmwIAx3Lo7>eW~M#wEDUEF(|=gO!Vcx(U>?>xt;38R6`^6m&&}3c!udER*@1ef68os z=+{IgI@hP=OZ|)`ZKL3oUA&OnH$q96tqt3Rf?c)(mugKQ=^9cBk_zatkzXCfZ=xmp zvJkM6SKVU|5McBWmUO5jZ%4qLkGU>h2ZpC5>t~0bRIo{oYBSb?!oOC?O69z9%6Q@gX$;XK9|_KO60Hy;6-wQPq+2 zRb!LNvL~SzD?BV70>IWd67NEQyKzw-MN;Po#N&l1t!a&>K;G7%7(6$kBFaz5k?>&o zXU%5dNCa7YJ<#GIP%n|$cY(zh949R2D^ieW`Jz!SoGlMUn9jgUj3MI#QmjI=dx0){ zyS!nLt6)VW{b?cy3wSGwUrx&W>R>n9iGBj75K@9olXm?-e%R zmG^ozukF?#DN*JHVqcmyZBKz(P3Uqs{>1*hnul>J+QG63Zm-syu)SBL@0bCTDBa^h zVj#)_S~aaAp2A>kZ6*2b_iFNa>TCMcoojz^%t3h|G*(+mN+rsk!u+IT4?%z;$x2T+ z=+yibWr>3TwP-rr+gui%ds=IVYOpfEBqj8bsrM#BXGh=>yu6vp7@Xxc`& zkgEzGOTAmSTQ!5aTAOUkj(TguE^|(HXMxHMq1qo)KgJBab6lTV4N!LBrUt;&0L7_h zRk#$)aq!zP#{oFqX*&r>A^~p%S67k11&;9YbTA7UWT7!EqM05oLV{cdo*tERB*?cp z_u)k6K75}-d~WYl!)V@qJQh>l!vZQWQ?9zo>*_DVK&h+0G&LEy5X$Km7J|my#?( z%eK!hrfD(E+aAp7r5~g7l#tP_i^@%%BPke#FsLyb@V}k@_1!kc!=qiK?UoNj0Ug{f zCZ+y4+Xy%DB~%PQyw=9e27+3LTU>2_=~mI0?tQ$om(Q4 zIoNRH%`{9Tb!b^zr}Su%=0N8b0wOD>{fsymVQ zAJM&7uwQ4LS$utXGI|@!w|!(L~(4Ry(TX9?fjBldigqSGWjCf=Lx&H*?bX7%DDjD^Y*8(}rpuD>1)^EzEQi zU{4OXoK%284uny~0?oIu`)*XKS62(r7G7_)6sOX2g^T2s65h}K)epI3Q2yZq`^VK? z$hh+6JJ1(vk@#mnG68q=82Jd=emB}1ft%Cgk9kM=hp;`Fwc}&qR%fRur=#&(Fk92s zR;m!3zMDD^ekt4KdJ*ef=#vOea0S<6MB#Of0fHiKb zf)jX(xou{Itn66F0iy+~%-Mvxo3$yg@&w-*h-ktcBw5YT?aa7Ufi+&#YnuWotc6KcuzLL=dLgE; zYNHcm_k`gvA%@m|j2kAghYRARAup#}o2y8N)Dz$t$^$MzZHy5QB#ZVd+_9j|S0&am zJ|r2``}l4$@3Oz2OcUmoP7Ub@`h$O!gKGF5s*$SxL4wB`*}Dhf z|Dl}q0i3lub9WSO&0jdz(gL-Vp1ot@VL-)z@dgG6N9768ag4Dag!i4^JNqVCJP3CO z2-(sED4bIOId0P-XeheX%JW_u%2ZmTQ2`#Tb|N)ffK|Z^e+aOqqDA&e;26?u=H33x zrPb7@&=mh7oD#~*EoN`a2K$P3UwVGA!`5V$PcN8;fY#xs)2uvib7q(WtZWdw&*90W zCtUBL%R-@5!c95rBn<^6x(gItwA)KzeB=ywIR$6*4-C#O*eeQo1B3~8;2jStE1QA} z6Vtc_8c+aNJLh=btJu2-;ezS=&3~Oq0-`>E+Y)Yxl@gKMJ{ZvYHG)Mt66ypZl+huF zRo2|cf8ZBVE9@x%ve`U88;RZXyIOO?W$*bP^J{8j&L!>*4D@%}NJjw&A>?fW!QwCx zT+lo!4NL%bvzj2=QbL*Crt|AHtfEp>*eYQ-q}6V0ECozQAPf)U|12rkcIOy_I_3SO zq_|&@NY0%o0jsP(eOy|m$W_df#Z*;`?DX`J7UT_)u8Z!0tTo%y)PUvI+nRnN1B;D&S;Totx2PXxe! z%Rb+-yCbv$m2=?sTcMtYTTNEk=7^+NJQh_#vKQHUcW|ejIVyySqE=~0!wo+KKMQ#O zllJ)5=Xz|R7BmDamv?ZzGpu%oE#mEqODn&<)D0DQfY025cDC9<{=qNztGfJ0fJoqd zehkd_KI~F5!CUy_>#6VO$-UY2a&l2h^KnROikP(Lu~;WXOIw2(&s)#m!IZAQtW-&M z3T_hf>q(GO?|rDuvyhx}*(JhPIv}`o#C4CJ)DWh9s6>Alnl`_JbKbUKbb>REJgUdi*q>$TTm~$}6UrT6_cnA78 zhha);)i!~d^1-8!!*PScDpJTIfRuAR>(OJ6diA(T9p~p%iSf%Z0KL*C$j}h~_{qE) z;%u^mu27Kt8*TidP)POdHd9FV0>Z@Eh+!+gtXiRS&_zP;+_JlHJm)8d(3EAjR*;Msa1ArI!bQIs64*Hui6kOHy%IVr>MM7W~r=9I6axMQz z6medflf|!SbdIN)SDWUodD}b?p~XAVO_e!I?v(!bY6l&NRkt1^=~~5TpKXp?bRJiR z0*q$1$5jiX0Ehi5n5r&>_&ut0S91T;s7${N#dKZ)X>}UAIDF{PThj4ImDq@jiSJr+>Md)6|`41l(&@woa1s)db@0t z+aA0OM^qYmzD>+Rhg0ATn}H#+CBtRfkE5_zjYqE7WkL8UF2jaDR6xBPmu+_JCe#QO zRUWu`%Q`z_jny(O*K72A?I_6xm+@8bI1R1t!MTWhIhJzV? zAy6wpkx6NIjPRVv{oVfb7(fEig)t6luYk;cxorPIrpqoWUZlIkLDN=ioRg%>D+d z%!@`?&sT=KX(3465}sNWx3h_RP{T_;Bndq&AiNo~qxHzs;Li`^7QHZI^Xboo;y912`%yl|KQ zaT1?Ez`qMxHCU=Npb_<{&Y*%FPcT`^k>g=vvDaCdi{L49UV;Xd(WWPtAFbi*6Hvua zW1zRI8ytaxR*e^X50_vsPxL-hDLOIX584s)@TV!xqQEB2Zj+*&l18zNwqsLv=OQj& zh{FEshrhc$Y^P=W)~((}syrRHAN8X`sJXV#G))*{c<~g2wu+1j{j&H=;28WwfS4eW zR?w)YUAxfwX~3)uwuk5%V@0!1J6!s_wDw>o`SfIL&>B4cb8&dyr8q zE8*mW?KjDfBrV2wMoXbJZC;E%KY8WS^&6gg?v4fu_@&`)C3&h>T;jc=auz4+6)(1&ukT&Df~kr; zp7wR+FksQmWI*;a`gLopvbanL^=bZC0G{uRHe2UqxPPO^yOzIO#r4w;ctTR%pf%_N zn_93-TtMJY(HjwYw3KQ^!T?iLz>0>gs;s6#SCyd&-gdNR(ZZ&<)!%XO(shD zpF$WSAyyQM8t`47fS4@gn0FK#4}%!WYC8+RCLZI>f9nV04s5#v5a!I3TS2fEcM8_Q z(Nn{~m;!Hu8ufP+ad=7>tI+w9+#>8mHcqRgK#53#ePosKl#){IN_8(Oux9IhuXO+ z%AoAD7KK%~!%-SL~st1a>s&p|(^^6iNs^K5zYFK~gxc9(|CDbI|*I4`sFJ%6KyLdhI zl~Pyo$nu!OsO{;6dM>>kxoK)4t!4 zd#VGFJlEq%DDWbay=Z$&+f)0~;6QB79&UY7K`7dVc$+bFyYhP@8xUVL5jM&lTA0PS zsw;QABLlg$am6rdxJIj5ha3yAkCQ`B$NAWoH=r^MFWprz(n5H+&;wktE)Xsgf}FR@ zOGxSpr@40Fu89)P53A=S;{nG(&G6h2;y?I#HE5w_5s2c^$d(#Wj{)57&rz_I>&aPJ z!t=$T2x0T64Nb0HZp{x_DekwWMPRR=lWjf`56sbFJ}m@fPf8K1U#)XWvN0Z5fHuYznXS1$2*WoK z+ze!R+FoL&71!}cnta-E#e9TDv{(#R@ORxVg8OVT;BkWjR`eep$`nU|@x{Wxw$9Dr zh*!w$%6ZGFzHlm>Y>8K>gaxCMj_h?RO~8Z!dn%>!^t9)i-$c^ndCXUr2Hg?#20K-a z(&p7(jFu-hgWsDZ7u2%z_|8G;CVcHPi}u|Pj&Wp38N^%pAU?S&4%!`#_z4#3$aE2` zS1_(1Z{Kf+mK#z?!>#f{TU>y$8n0f8;Amn3-TV{WoCi+wPfr|#)g~aW({oVj^>*d4 zCfn&6X))z)uYEsFm8IJET^}L!T9px;Kd)p-l2MVin%137e9b;7csYoc4%0Y5o~|Ht z@qa{)rCt31#jV2B?f_;w9o_X{!7fBWpcgMAyh{e+Nf)%nHrlj)PJ|<)qgA31(GTao zQDh${B-#O1vN+bwDY0!}>s$eAO84u5?csRUSb%DNFtLCNv3i@mFSce>`$FGxv0^fIWM~eSGep_+)FNn{f(TM_>5oS z9QASye5i6Y$t9UO8RM3bc;65UC`VZ>#}m%!H@zi zy{9E3JOpC_>yU?k5_Qp@x9{c9784=zO27$#Z=ygY!^F5WD$D{A&nd5=`` zWV*5aWrZH4ME{Y^DgLNWbo#K}(z!vDNE@JXQF)~w7VI==b3)Fck&X0q1G$0l& z9F;`Ai)H5it!VQ}NzrI?_P%1rcoSA#6@O&n{E-hcPlcp#z}#uWQ!l=V9_@!PS@o;} zL~AG8GOjARBuI{V#?<*xP=wB0EFP}ju_w#cj(Gljl(Xt+XISQZXj-Hfdi10^~efw%at}`o~Ct&!rCEf z2Ngl_QB8Px<5D(?o5y*Ea{4GQHe`|yqb`m`7A!I$JhZDLV3*=0@oqnBu}#TR=rWnV zh+>Q?eb;A6K%vVeA?$e2o~9FZp%p93h+6(`wHK+~u)KIw$qo7myzm|$9D{s`zn=!8 zO66e>fIOE?AhZ2;b)%fNz)7DWpLTjbgw{Zc zNp`Qi*L)}6cJ(#kB)O-luByZdcndM;V(I<@im#Rdb#~IO4m&g_Tu~|W-?Ds``i<3m zi>>vteA~JIJvp4(R&?hxf@;s^`s7jP6K_7v&CjGh`#9@MMv+f#T;@K`1(+gW^zOV( z%328hNY*ckBA7{FdM`>Nrm)Soec1P$JOHpbmqulKmbXC;^3Jw7NOVUAWhNbSoiIAQ zXD^d_v$OwiQi&incLLHp0D-;8WmS?>dBX$#Lz$V?ms}uo!NiDpw0?LH2M%;t#LaJ(Sa9Jqc^&wgwM zaE>nT0Mjb|g2>*Bl%0UtbKo4Bw;alak=ZA1q%$LE%c&xVT>%4NsEIhDKzh7>KfE7I ztEh?(MS?HP<{wiA>1ImY1V*Hp63eB}$_j%vub(V>wp0DBU}X0P5*wOfw2>*iV0>WQ z&Rupw4uVc_gC#12>Qt)!GDyuGQCz6FR{4`lF>#-wI3H%H=T*t)KrFCQBpJ8n#vO=2 zmS29wW|3?y*fGxH^`X0BaoQLQ>Tn$|0Ox>$%8IgWN}U9Zbn0?4pO53A4FJ?G)E@b% z4MGiB#KLT=9@xN5lPI$V4U7WeVN{-5L7494PhNFF2`N=5-iEn`E(0DKbDPs*4-j1s zo4xS`#5`)TJVLCl5F9hRwWAG5Ifhb_dp*Uz4WmudLO?AH3;-^m*cxL*xAh=1B8%We z8sn?eeegjgNj95`isP%Q*0pCcc65?WN{ub{hXoXr?D8DLxftXRpfCIOAk11Yng?79 zxW7s)$PtLjF3AGDv{R(J*VF|)zDQa1ud#YdVUVaKH%@{rV$GFWXdY9s)YR7 ztO>SFHS8HDcB7S4YE+c_Vzs6jeI75M9S2P0NJ=~$gx!&(+LKSiNN%o31jR4JwuX5< z(hT)Ij2Ov_Df}v$q6Hsbi+$8+38&Z(fFK=ELV(oszGk1D^A-D%CIyn2+h935^%P56bPU`}4u*MO6t5O!>v{oK_&o$qR%e#ythnhrRf zQRud3T;yJr#E4EwU=RcR1ch+|P*w9(X=fmsc5V*?=yoB4NT0v=QO*xk)*1cbpXs-2RwwG;hz}_3ga=oFdr;oH_H}E<^za6_xfs9JUciK~J zb`loL$z(bBK)s9BR+lOOXAli>9#{1Mc2R5BDQ+#x*zJr)LnytZcl@sFp1Y%p6$kRR zX8VG9nzZ&v1-9QXA&+z5LVg8V*Kd}n;+-qP29XdZETOFHa8~Po##fddImRk zZj7A?xdmHPQA(>#VlrV766)2#{wNBlM&Ucw`x0QhLtE_Xf-OnPd+oGml78TkQcK1T0wYk5r`x>Z-eG2(Usc#ABe0aQkZ+gL+T1liVQ@=oHv0nkQXo4>bd0>Q! zqWw5vd5g_Mi3Pp+w2zru26j_+u{y}zug4eB`(Fno#>2H2*bJ(5Chb8zbnUkFIsKqN zv^k0%(xlo-?3h2gpVqT(hSlb5L}RN{iRGl?(F~!8%P@KKi?zk)#SEII286S!5yJd= zf9+5o9_(ZC>Gf!wr~gGcXvkXBR}Pd#1?2oMEmCvx6dVz;T~0kv2NG#?V~e-=Q%hz< zZ9FMouUdR=oqf|+4vdp5=h5ZKYzCA%OpUi`9T?x&nk+#bQ55bS2{a^S}7!I?`odjVKQLIBb7J*w)c^)kq>NxB`&p zAWaiIk!IBUZQ(|KIRlAD+o)z6(`0Q6Vib8`3*@SlSuMTg^qlrt{p<$vM=cIHRivYx zG#~Vp!mzX9Y2YWM9Fx71&e6u-Tn|rQWUE&y;mqVdyp7^ubvLqG1YLRqCnDKfW>5UF zYOx&xn#31d5dFo0-fhVJQJWTyz2AaN4J42_+idwf?Lhx?hRV(wJGnUrRSJ62gWDCV zT!ABXsQIbyHiq2^@3L-%ohZ>XY;iu$gYv+LSeH3ftU;5$*I;4>j6pBZ4z&j^ST z{)i`523A>gDAm)>5fk#z#*-$kRgRdA^oD9)?VdD@_8fjvX6l_t= zwQZDvruR8$sX|j=-`F?aS(?`QX3@y)!{a5r>PIHp5aHF>&3LGc(ba25yZ8;NOf;v{l$+ZFaKOT@kG= zXqndFg{oDAZUiSGFHjvIIT?N^Ln+dYE=XPE6y8N(KnhZi)%YEjGurQ-JkElj4cM=e z*7+q*wKaky@TvzFB>D^*n7wU%#@$g9huwZ_;?dJwJo*7A(5RKWo1I46MM%CkW!L2F zHD}wgt*_X!uzg*_*LA&b*bc>IZ3;v*dK{xRy%RVkhboVA+fiwpptp+?Q6NWH!X+(a zKntB2NhTlwNSj5M2fIKxxb{p2Q&Z_Zo1orm^^$b!VW(%zjeAZ1Xdd*pM(*VJy7 zA;&_pSmEl-S%x(5S-x6#fd|@-Mh5}(1R$~kv_IsPAs|Catc^G$)LSfci`6CVfIP{l zD4(;_yoRU()Hu+}X~r7h#dq(YX8Q_Kv>;7Zsd+6ss-8_M$|}X^8V;{Xs^hbTEa!A3 z?dqb%zne#N_G#s2o^gy%pM4W6)C1IySaR#rni8QZU-E1YnWl>nbp{am3WwF4Mg>(b z5u_5OE5FF9M4a1Ov038$;~>g_3qvkZCC&eTgpMthIs=&g5&Z=!5g@Zl5aPf`sI1M* z;Xb%Z#_g}-^*0I#sVayNe6GBQ_LaSMS;79GmijzMeIed5TtP&eKNb#ezAKv~xTX}h z-=1&at+t`9@aV7Sh8UaO$ww|b9v?c_2d^82p4J?x&;V}E!(5zt#!mT zmpF1fjQqFAkz<6i0Eu>7j0Ox*siCDD$K`zpvKC)%0VMcLAggzZ2Uf4Awq)ftDg=a- z28X9^Rp2bT_MT8bV`KoOgr?^2^C79fIA-5MbUdu)wK^ha=Q*yl=_`#7Przsnw=oQ9^!NcDle9#PvYoKDMmBm`nWY9xWd~0kk|odEbY95au04wXfOpNdWlapq7j|1i}0aLQ*Z`U?N?h9u@Q~_E{lMhvQph ztlCf0LLMYPFj#;rpc9A~{ddWmpb6zvh?7ObXomz~$c8Ou;`P8lGBn{6a8r7{sNG2=##*u7c%Q_`+b zeM5vhLx~&E8Je#lL21R)-IcJ0g1zG~_T#mLC}ofW$Z~Y65)sp^lJSOFTZN>wBPd6G zSZq!avL9>ZgXEVSPDMd!OJ_l7%$>V47GX69y=VN))Zyx}T6{|QV`9H;@+7te|0cV( z>?Qu~&m2u&=6b6s3iC5FHN;dwJnD))A;| zlGkiT*p4d*6eaedWbd&gZ4jw|3;8xG+@7e|rwe|70owxj3EJ;_C!d^c#~~U#i=2gU z3l~lj{C2b`by@q|9RZa7Q9AOA-Qa*T-B4K6MIZ{-j@AR9ut-NyR_Jedty%#2{Wyq}_LVNBP3oZtRa!XL z2d*f2tk)*dccLPCOM8!K>o0f>uml5b;0MU9i824_|LGTjA* zmn3lormP)yFFx8OXlHNEU`>dKc`dNAkxCgei^o-6nw`Xiq9aWG)T;1*ZEzr9|J(!c z!*4JQ#J+qwZuDDrZrARP&Htf80H?Gi(C8WjtiI?z@#-Kw0*|d;@$c;cqn`V1<+T$_ z^+r>dQmQnsh*VbF(4buYS8?dEblc&RFNZKLZ`skA-4-T2c!tfKhb0@?7{(u>O?!|F z3)`QpQIGBncs_VV5#+ks{y9jSLKO;U*OPG@LC8AXtWf8p#!K;Fl*NFmKs}u9kwvU4~V-#WB@Dp~9^| z%0E}mI~Q}!>{ZV7%PK?Zm6v^c9}#s_Exp)}#D1?= zwI97~BtKla?}vH4Ba5i1YJ1bY-Vg-(ExMtLTU{Qqt1`9@G@{<-X0D^Abk01UEN4|= z&heJn#A4n*NCj+*WF<1a(z35Rg4gVOzox)2RX(iz==1Glnl}AH2v*S5p0-$(|Agu` zaZh+m(M0$+2K9okbHHD4z6+;dK`5oNo3xE9%=7$RClEnd+6x4?uoO3HlJv&xBjQNbV~ z=QjMyqaOe7j|wS<7@W$ZzQLo)wYi($ULPVM@}{*x+B(jAz0F*Ex_8({CD%Nm;D9ZC z{%L#GJEHPNXVyJ;fiIQ+k9R#+6Jr?90e(EP>^iJOd>$pF z+ci)Mv}m?1?{zXc79F{azbNn*sGhgn3wTdjzw60m`@d+k#9$*-@v}pOtps7>LGk)S zc4GQpUi3}(EqlA5TFSS`2BTVy*S*Yp&sUr6k2G@Poy9mi*$j4iJX4PY&Qi9$w!nML zikN@AUdu#*hQz?`B@`Wma!>)y{d|q zaE6KqXXM}CQINSvP?TzYdk>LlnWJSUq`~Rs$=w*B&`ohtgj4q&wQ>0(n;e0TO;E8+ zq;HM3x4G}|DrZ(Vg`T{xq+3dLr7yJ?@0DqJaX`oBu)ZpxJw!YU;x z{i0b}t*1qX#dKlOJ;S?BOpBcGW`2qoOk3uqXn)Hw^GVxVu(woh$Wf8g(N3= zIt}moBL{t#o4@0|EnYH&~@J|&1Qkm^a4WHdqF{>UXph~24%0R(?+`#|! zwoD9R>c>uA_FaVZdwlN89Q*sBG$(#BxjW&J^$T`LNlJ%ls#TsJIqQ0TiR#|}Q%*nq zQT^-M=|0CL)PwLef2!E$Ju**964d83&n(pa-019#> zZwHx*u8D4Zcb|D;Pp>Dp5m1AtV$fH(xz=~8I!_dMUvBN;fewMc^$8s7*KAh9+PyY{ zVm##9V$1wOl^|6J2hft)3sA-wL43HTzFsXT{*`^wEz?POV1R9Kae5RNa>(lvk@q{I zIPheE+RRdhBV*r7^ZTQ5@JaiC{tkJ?c=tQkt&TK-?!8R+#=Qq1ANFJqPGXTfEX<|k z1KrAX)pfAt!;U7tZrjwcXgC|skO$ABr@m|&nEgE*z8Vn@C-GbudZWviK@Be70U%;6 zvu$f3Aq4ObAE{1Nq3*%3`8XA*?#Su|dH5qgDAGOlbrJ=?=ZMRrD2||r(1jx6a;U*5 z9(_131ekr8R@Z1{00IT*P;1XRhhEh&Ucb!K)<&^zAn(!PI!A}QshklVnxMk~9O%{S zR1UXQavsgUq1U8CNTMW(y7NC=0%c0F%dv6{QvN(yyj+9Kv^66begCTkSm zd1nZ1POrh9%Xm@3x1# z-OB1L8E-N?itVQtG>$vg-0d*4Z}O*PPc{($3NxEvY|5QK@Lc}kXddKf@3;L$?>Q6vp> zAK-csW<_x50n6q=o9`sZVpPOBY%l5GG!)BZ3juKlmwVNU5wYT|hNz2g9wxqN@mf!< zq7ftjcV(rh|Fiqu$|D{gM6L^%Ftk3!)qp@~n_BJ< z%gT3i%3AwbZ#+#or{-!`*bOnZ6ma(xcR!L-ex_h&IX-A4ACVGL0&LplFpvrD3jQq{ ziZ%lcAF7=lf1wDf&Q-1@^*CCx^(|MuMb9lBfW}7v5eJwVM@+|j(Pw-PsO^$j1sz0+W<2f1yJ3L!0m^t#4FC}}tW)Oq`qjcBGT^Nb4P@+740UbRAc&VqUorn6 z<^Vw@zhgGOUmKYFvl(X+7ybI1#LrD*sNs;O1T>N!v&=~PK&zTb8?ZHs?Ei#tiYTXvDC2PWQjQTmqbvzO75nIf zG}de6;q7^L?lwE8jW-$*@P^Em86%GZX=`L)isWIwThkCFhs` zM}Uwy&>`LN50YmeTFR@(g&-G!_Z6tQ^->ArHew-B2GWgP=*A?z;BD+Gm_b8;kkykD zr0l`NII7^3@IeC;*GjIzBT0K;T73XmWr{hlW& z?n;Fu9Xb1 zoueL4Vq3Evo1u0UJ1{>OmoJ11A8YPgwxCg4wl9~T!X~Px)RcrtJc#>tWVG@R=+D^z zRDi`ALk|0Uz?p#`aDTo1`MURv0!r+WVb|b24+xH6M#)gJq$G|BAoO9>F#AcUI*Jb2 zfss}}XM!f!fShO&h>gMuG#uWknt!kfJE%EEY_h;Z{78@WwBR>A*eSDS5>x#y9^SEqMOOtfN$oouZPd zWlV}XS*_<5{7ukT-W-tX9|7;U#OUGgyUzOO?P0fL(ZPDo4G7a|>@ZG1y>72C0KfL%~-%m-slCO;pG@zDE?xZCdYu=M!I@)SPXn z0G2~{r2Uar_TbIXO}CDB6`nkfCk8Z5(aS1TrIGG&h(WX#;)@HnwMUO z2;V1Jf=|4%c`YS4w_^sX!+bsN4L)myPMWS+;|8Be=3k;9&W=4+1bm{Y)yBwM_n9#AoO>QIom9U}&f2jyC8sQsh zai{*~0`b!R?8BOT@jNizLzyXq(jB=I&%QRFqZxx>b$a#FnnoX6V`DDhBbNHKGU(ML zvdXb_l~8j)%rJ+$T?Gx(fo`~C5&STd-#&}sca9s*losrAO!NT%11x%%~I2x2|!&XLK9i@PeIM$AG)sYW#!}2V`(`UssftFTp0Qpmn z7T+a;kab9j78B5?wxCzO@}0D6jBK&-X{Q|Ul)Eh0sBsTk3wBl-Doh}k9JS^gBUHT> zKR8OWX($zZe$Q$V;S(-Uz)|`xI^b`;I7%>y)0tu1p^(?c^&4dTF5JoI3XF|Y7uSi} z44W!>29(sy!gTqmDhB2_9QYur^;dtzju0vM8dFVN<;Z0qy|umD>wBFNlb)dI zx8DsB4NFbr?WZ`7c9lv6x8o}*p&Yl_Oboma0#PPtXY@l0`HXA~^F`!kb4@Ha*5kC2c9hTAj zNSvan3p!hIPe#DD&BGl)Y9FYMh!!%VGiTcsB1TtQyal}gSJn_ucY8u|q9eyhT0d8# z1spZdF||LJwnM%51WQ4@GQbpDof3Nn5fB0Vo+!CnmS85eX=x z|MH9Ud7uw!A?%m9?39AUq)wbsX5p3|dj$5@x|wHHXZ0kdP6a46Y(k+1V%y0dpP0q) zx7ko6%nEc2=@L869~@d0f6>Cf{GkG=sk(J=7rJs~0R_&Js*B%lODl18{G+SgTzoKobkj>e6`GyJ$}O5Q_Pw58&K2)c3fmFOlp z50 zix?*2JMe#_YyDpUa9k9al@;uN@o}91%)RvLgx_DLG2ycm-a}ff6}4Vl8OGX$fs~ z`eM}C&VH_1I315N=1`Pz4#pyI(gb=8P6V+bZmIy=3 zc7lM*Qg0r#`Zf^!4{;)ic?aocZOHawd+~Me)Ul7fC&gQd^z>5!Z?4Jx@g8oi) zVFZLNP*jG2CMN2i_0o^?H+{;2Q3A~s%<4ln@p7-5$)BNDr0KH=CMn?G>rEvS!u&KS zbqK$fb_R>`v{&tbguPO*!>M^{#$kV0P$w>(H>6_%(lEXSy@zuPY$FZbI0(ie3A>9Wqm&A$DyZrPuQ-*r@|-p8#2&lBLYZ{y=D>y) znIfQ^)9LI9Iw$p!ex5%hL&Uh^#eDV9;fa=yQL><|DbE(z$=i&(#=zSo&z|7fT>&&D z;l&oOYK4dn?Tjan#Q(`YOxj#Lc@M=2tX82^(^eo3&r=&0n%M73pzG`bR}MOZ)1%{M znTYB7T($3RR{;5p{doVU*GQ~PFC5@})*VUf(Nc3a6^l=tOG7O6{R-_Ll?nDYMuB8K zlSXX>9ilf5lPXO-hKGM7khCyY&*<6L20HZY+Y&^1@7wd}Uz#3h8cen=vvCu>C{{De zC>}1ivr)ce^BIXcY((qc zJg0Rr7H*EUw`6sx$LXx77Xq=Q?6_C zYD;P|qEm8Xu~uK=g_(M7j}15B6ZO*5JGG&TiSh`Z#~9i$fW20zq&O=HU;3 z4BWklQvM%xYK>JsTbt2N;Qk5Sexa+VlAG*};ky0g^{Co$$L)A#XJ~W#g$(-+452L)0iFSGkg_QU?1saDD>^MSe;$%Gx_aSUFv1n z* zj2_jo^N*6YHnOi7E6~k*l7w=(`D9Ob+b+gcIH#FLkG0)au?z{aGa9YxQvqt|$qohV ze;fPxqsda<8w%W;nRej$(Dn+ncO#E_150Y8y)U;X()%m#2{yJ>k2;vOszl3PtENGv zo+_dD6saYa12~1m#w1{EL>TFeZd*Y|#sxNYv9*CQX>dXm(1SGjC6E=bIU~Kjy0xE# zOtt>u@i;A;$plJ*PtcVy{$3KcGYLU8)ph?Jz}RZwSJ!@hc8^th*qYPdAZsMImhrG` z9-u5kUFSdIbQviQyj&taiyqBTTkh^L^mX=+8*Oue!^=mhw?|N0$<%$IYZ|a4WK&Ds zWVw_~#%>++8P*Upj(pXyD0RDu0LwWd7`dBSZPh`dO0 z`x=Y52mg$-S}V}j`+=_NP;ColH!CHfR$yi#8J zG-BI85u=8@A4KQ3qscLCoURRqV5CZ*z0J|&YDbf|a7{&%Rd57R()0ncG&A!2@cEs& zPTPx$%V>`qIzARiU~F)LRh&>sGF<>eG#`kfEmA@v%M#{rB{y8GniQw}Ig(Qg<;+r~ zKrwxjeKlbp6Vertj%l!CXx1d->WRqXpzLUGd%j@15fQfGD1a#p`!}pgDRwytsdV1W zC;w^xsJA~Rq5WbvlmX6@e3a)A_U3KPax%f1EAoile0PQ!GT|=q#|A531RaA% zjG;*5LsMn`2F#h{!+Ce(3WN4N=iL3TkE`LzyV(p%Q=LyVop&rj(Z+PH@9M7o3E7cb z8rK{8UQNi`B_Fr7(PdsCA3mmQ|2|5amX9cW6~n$RY~Lx^x7?P$ymgbI$|ap|0}nLX zsD4;ri1*PT!&GLDm41VuqCn@rwP#qfu|2mupP=&rBGaq)9l&lc}op&2DJ(u@dyQ=>o4G2fMS=Px4UCG{v@F537T~67n zh;yv8r!yD_DrN6v!*c-mfq(Y^ys5ELog1v~0`)bH$K%)h&{c_yRjCucMk&Gz5BfWp zMNJ4!sj(joGBIrzeTQE=>hG1r`yo&fo^1^J!!9Xu!qFf;{QuWLJ7nT+Z_2~ZP-vfk z)&EeiuM%T2=Rwo)gN#uaDDW3!8hOlG$dw*|zzhRIso+^%C}q15ALDRMcX+eWrbZ*Z zyniIHLr5)%#ccGPl?kOSI>h=g2iYaoAu#g$A(%{@umqi{}cn0YSNn|XB(@*bJX zhJan|d`EQlb!fMSsum-+Q+2=kx{h&AiJ zs_j}Ct_V!Uz0c++uHoW~1YEvq4GEh{Kg(p-1a||Pm3y~&_hxKs6xTE0!ITtZlj=P8 zPxz2`(4R5KjzF_?=v=ol?4vQ<>=s@5xr+wuOW3u*NvDn_u%2X<$jt@lU7Q+x=73JZnJmNu?|=aYJ3q2QK7*gvF^Tp{2nk5i^|mc*|hK!(;E`ZGTo z@baBURjSDe1Di#R)Wclm0?rbmsI22l=D5>nhq93oaZ+(a4(WTK2W#l)k}Q(?q~8bU zo&<`hQ62>92$O|g*^k<>inoX83+5x_J?g3asKy6X5PMeIU*l2GXI*a%<52V#jyFKQ z&))41+utewD_RRk{G}x(kki9vI0GuXFdmmbMj)&=-GTIALoa+QUtu@JZC)EAT-kmN z_d6owIBPP#st)y^#2X!EMZx^+K2Iaq42!wS-rC^R!R?iciT8UMoC-%5&I0P_3@(*K zRP*KG4AjSmDv^I73B3QxDKH!GO6d`jO-%Bm9Zk@<+G$FIAcR>1R2u|4@U?%jS zz7RF0mBaf8T-(nF>&A(NVl$WpB8SrCyE~EHxvp?4-G(tfVCN<5oYh_g zwawKw6kc`%J18P7ow_$;L6^@T>2j1O#U?S`$I21yzi_|V4y0-{`ib5DY^Uwi)Xbm_ z?d-)tUW0V+&DmYxrUM*a`vY~~TrqsfU&>G5Y64i=GCGD!@vR=Ybd*OS53yLU8;O;o zB;a-CEPj;KPpCxhMb(ES;q1>(AS02jQH#Jp$i*fIn^I`jZq(yyD5xnmo7sjq^_q$r zE26~flQt0vbuLRWN!Ng17IU6e+*bapubzOM9$n7(QW7URCMg2mNoCBV?qGv(QnMPx0KiRZA>*`)4uJt6S|v9vkBKBoQ-F$paBf zcNM7e>j2>zV@n|RS5B+e7FkxcP$@E{HK6V-oT?s(?3Hl@Amp(HmY+e=HHzq*=*QPK zHPA#5)5vl|Ybgj*BYn*(+sqLJ$ZCxdp-_~y?`L$en%KG+JAkK=qhD(8x{lb3?S%mj zV2!ju6~P+fQ6~HNsId2`n8kH?$V&&DfABI|#guf|u)HOCV|r)Cre%oCe4ALL($L|} zRJ5yAa9jddVW&~2hH4!Qqf@|@Wi_V)>dKbm#|L4^~8A2R4fxt)RlrNF~);vGJ+YhYWQ z@KZ^gP@Q;_YY(=ubvCYpJpmI`C{_ga#XcVUZr--5IO%TkMQJ&7*QO?<6C#flV^J%Nq1c*YCVzv8kBjNBRwR`WUj-RTHM z0{ysfus&!tV+Cj&cd@EpFowh62>-2KEE1m0w5&)6#ScT8mFPn>5;O>77qBb6&?5LW zK0iz6g09*RS_`UjvAr{m)Y1pMzu_}cTfMweMld1?ikK!(p47Q8BCrL!@EW=@$4<`M zPf~!A1^}*$P!t1mr%7TI)j@c!Q^Zm+aTu^tIx|#-5UL2dmq1?te3y+P`TwxjQBdbR z$ItkHJja=y=TK1y@qz-A523{!rW%m|UwFObCv>5nL77R!1uzjNW@GYUHn%N1*ki$^ zY-eV`IZIJBTUzH{lzbgwUD9gLHoJp~Eu& zOmB*LK?;Y_E?Gpaz>Ijv#;CcY$H(gNBFT z-Q{cv%dK&Jwgnwh`2Tl%C2r$$l)WfMtDsscYze~7!pw!Sc`oDDw5?9F(jiTdsqeed zOV{NoFqnlT^?IVBfjk_{WJmO{^*yZ$!k)64*@(nu!rD9=)GKTE7^5VSpgwy9fwAv4 zOOYsO50Ig%P<8h8PGshyjXI&_Iw9rBgQN=eOgE)t9n=vuON%DNHxr`JeE~u|M^Jrs zH~)POEbp=VZ5Hr@@e7?DcM^XDH~7r;@;&w2Tr1KySZ$N1LvsqIHPubX`VNH)#l);s z-qR-Dh#5+-fMGSMKE-^r``Xj68SIF`Y_uJGgjuJUwVKzJ54o96$~X<;IwEVrvwNGE z$&);X?n$gG!&<18akTY47R>P5vL&M+z#jHWPV2>8AL&;QIX5E{QekK0xWKViS9qMe zErDoGtU+p9(N)y_Ybx;gZKUu?iLmlr&KIVt*8lr@G^>)i(3C*;Cl~3USy_ed5U=Q|Pg}Rjh$gFO)D>6*Fa`PCG z>fy22P)^#;j{%+Q8197x0{0-OXYn)-X^WNiXrt8@Hwbk13K5C*AY@3}lTrwc z>%qPD_5>(4Efu8NwN-_MKniBU2HX@9)eKD|5+?-pBJpWM^;Ce$hK9pNbBfAv4Y;wJ z>#Tla5SMt5kei z7RaGB#}j-fEaDZ-UGCKWij3R&8Pa+IlHpd>gNb)>*3T1mM~gdyS>SL$WgTf7HWce- zqM)6hq2kLL_bnXESplp{*SSg|3R@H=!et7OKY>u+lygqv<^-T@q;16@n_- z!?rMIKOyKEWj%_&n*tav)Cf1Ri9OdM?RZcArq}_ji=U&YY(gH)yB8HaF#*AcXv|~o zh@$I7u)LUoyZtvKPCv&n|7ymJaHu5nuc8+n9@-}yi z3=LQqMUXfJN#}?_EGxf&C5)&>B^nMSUVkR*OyPI2JH^4aRtFzIA|j@Ki#u@6@=MNH zmT)O@1xjGb1$0`M3p6Y z1;j=p#tUVBj6Z=ehH=#^1Mz|*0AnZl*r)1jSuU}jojhvM3}QX_Y{*DL?=f~_%x+Id z*gp)^?EC<7bv1YS2*>d;0**TEK9*cd*0e!;_Y%0H!8UnS-7AI3>#Li6Uoh9oGPH77 zFAbUD!0y?kiPoZP;^nSD19bpPoB)vVct%gq1`}}gd;y!F_d-UoxF}m07S38N-4ok* z^}xmqWJ2@m5A4jeTj@(m*1LLhM$?@c+fDmOfY4B42r&6r{u~(m zO%(hC9^&OCDB*(!>r2c|@;BZr!fALL7~CYlfn6g46y7&CQQ-P7wB)2PxU^V$5am`0 zXjxCz8oGf^-YlYuh5BC)IMnn*d+(7}6?*aTD*rxNWbsAM?tSR<5aue{xt~O}PT&)s z2&nM>Dt4p7`!xjw+3J@notS4;LFMagXd#2|@esFJ<#kYj*nW!bXZEnU()Iy-LG;h>xG&9n z`jg|IBkMS!=PX*AjB!6WfpQzQ)g}NoV>|-V=i5BX&r+EAIDUJvErE0K96$i@jl4%5 z4iw}a^A|kmi#wjL-HE%Rg^VKXUPf#?^7TZw^KLYl-*{U`?XA|V}C%*{ug0Nn5 z4}rlTeZNsBM<7Lj&wuhx$xg_6<$9fian%|Ym*bc|#e@T=4g0M->g@kbvi{^8;&9{v8tr~ zxA#7DG8d=byA6cHmvWf?LrSA5W%(M1vy?Ue(4nEH6I6OkaFeI%;|?*;fQy5-8Ks=i z^c*}v&PJrHvf_=J17xIJ1Z87C$4@979=cd>2x=TxrCvyuTAYYiScUMM(P*Don6^ep zP}-EO8Rsai_%=Ke58)>90AUVb3wT5oi%It;HTwq}z3qk+oJ^p8zAZ}FE>2*cxQ8Yy zSs8ga=C>Fe5e_p)em^C5LlE~Ax~M04LMuz=m_@`UTrJ%Ksm8%NuGV5Bv`OAVynD32^Bd@ z?_Czzr8zr7J6~RgOFzp`hf@MHXUt%!$MYF0Yjyiq0YsojvB5mlR1RS=Z0$u1$G39=HW|mLvUg6R z#?J3S7kCrqar;%1{US_MN_#p!y9fJu9_}$qf(F=o?*8pI1i_W*~yr2r&e+c-l}axe5lXswK;jW{X+_ zJub|c?~YT0;$(GB#_D)@dz31qJnNE#ssL+Jg+PFr>+Z_f)C{r3z6=88r8QiaW7#Gf z>XDfq+E!viPn5~Qg0B`yqN*eI{Z4Fd7aKp7L)j76rTjkPs)ZKYGYK+1@PyErF6qaN zzp%$%K`(^iGmk-=YE=~ZBzjevrO69Lugj~+I! z#ma;j$Md06()N=m>2TSRV<`?>tTEod$5@@jeMPjYxq&9g3Zkrb3k{-*1u&~tG^t+| za&<#(j2n2dn}|oslv4U6?6a8*9J;*HzkF}+jci?m5Q+!v4rf$DA`P-xR-K#K>$8&EIxG*;TrJ!r8Q8`>YEuEyt~cA_%JwgRlJK~Jgn*d8(V2`(L1 z>+<5$tj22VTwXkc;;{WQG~nVC+{t2c?CriIy#+IZA93}vRkw}(qzTGHa#AQ z?YAScJy_K`tfp{dJVUimohd z_`8745AE8Vwa6AKJj_H?TQn7vPo?k(RVH;h@2XAUE_nK)5BGkj#6rHc#xnR;m*$K3 zhOi+_DGDGiuQKy0e1=W-=(lk#xX$mP6eN=z`S3eOK3qWrBUv~_vH)%vWj8rfFgHQ1 zv*s778ewWoGv6m;`={r!4p!{n1g=nChf_Bu99YH9q>W2ND5cqLVbRv)f-4CsLwaU7)}!KP ziMJay`_*-7VWDA_YWW^Sb;O~obStRIO?luU9%AiaqedT5v+We&8A7)~=*>pFNb561 z7Ghuc_pT2j?DawDc^6kn>Con(yZ@ezbUAJ{LwKb!f5IeugSB60<+^tYhDljx?D}4{ z+J&sN6;MOv`v~}Y$^VAYgwRbmgD5wjY~fKtPGEFWeErAR5=!$A?7_Fm#MR3M`febG z@o!4@TO-EcY(Ud&I7bAlG!%Fi){z2vOrf6M+Xl82Bb%_4n-LxLnEDy8j*P8*M>q8u!@=-Ced|zX&c}Kk56yq5kq~1%B972w|qU`T~?0{>tYpz5rVZHyKumb;t- zJORZ!bnk^RH?O&fQeM@O%miDw>+&phO7eiMiZ772;=Jn$Py-cZbCU_4A~+gOAz)hq z?k&2bY>0f|GCaZOvuF>6N*Zya1lBC{{TkkSbNBxIcV$VPyXzwj)<@fbm z1AAYsS^rVHYe4)8_nxe2!gXlE0r7;N$Rm@62JQ>xA}IV&$jmL*wAxXE)3pJH<@nC; zTh8X4%6(|xUSehdG5vWD;fABzj!t0gT!7_-9#uMxXpFu}bnZ~sA`yKii$axzJ3!a> zapEMbHVIj0m;qYg9ml3E-e(;!8~g|YP|NiX8?cQ|`jNFi)8j+FHaD5_Tk#A}Qfrqy z2+HxNpFv#{ex{SD7u_lRfK$)|H^=R-oYVt*f2M`v}XbQ&=jYSF!UD{(KCgH`;0(2!LFjaAP5?;F%e|M$4tG1Wo5` z8c+6Wcx$;Q{B&y$zpleEOy2CXCH%{WY)G%7<7Qkf0eXU9@cdZfHT+X zm`0bzouQ9w5b38CcP!DikAh#jDo-`rFZlk^zU)`*hh0MMfBMB+-ArTVVa(7j=uRDK zKNsCP{~FzTc){eCe^g5xGxH?McS#&v%4Cf}#Ft<{-|P|BP}ZI6JD^aF9OXK3OOT6E zPVv8uv?%e0TR~@S5A9g*rdcS6T(6m!zr^UW+tYR1ixJ-|;7gT;TZ9W36IWf=OfpWB z0%UJqC6dy{g@4fa@isi}(W`37W#5etaNSdok;^sn-!GnwaxB#A4@y0GCifeycSV7BB_R10Ec3h4+3|_CI@d>_v1(t2dzOtS zywD}9Bb_!E(Ee?V^Om0fFB{vDvX$PR&(NNKi?RAtmjgI0{O~~-;t%Zk9Dz>fx~=#v zygGjRjA1)CbLz3hYE+6hK;4PS5Yi9x12sf#d+C%qo}{ABuOPc+p-t?&(GQ)6RUbC^ z9>g^%U!+peiJX3$+xXXlYM2LEGTR6rfvWaIJi&gS)5^jnmdR@&kQ{Cugr+zQXZJ4t5> z1vmdMe*FWBd}|Uc;(s*ek0%9DqgM3SE!dXQtsnEQ%QODQ5bz~D$qM2}%R?^xie)PJ zcskKT&?gf3BZt~2B=D!>T2u0G{b2oIqYL!D;N1IXvA5d4OD_z|u}Eblr}OQ~4p=64 z1otEQY3J+Vm9XMD0BSk8G_q{_$>a&-6-q{8m2K3_akbFNspVS%5 z!7+kzG}>5R_WtYy&{U))wS3V8rvCH*JK^;QnfEz7X_k=@mI9z@%B^g&Q7)B8QSb^+50Vmq zfc?&c`75>g^=uwf_d`tGCz|aM0>1U=#&ZhWvTWRcg}c^W|8?Fo-0TQGeJ((PcOtP= zzs5K&j`$}ai7d%0-xy+Qxl63ta@xh|8?5QqWHSm9RycS6TRdLLm8kw+Qmc}LdS#a{ zae_cy>mfzp{UnZJMh~~<4q{h=V+Zbq0+dN7@cN@6HuBg4SJ!66D@7w^+NA=+H}MgW z6|cJC_dT$;l0&!=k@=svv|v@?5F`PIp0(RbHwEq+xL(Akh|O#YGHv4n)=nv?E8Gdu z4_8gnyAI=WGMMq7Xn=FaPgyW5hmVMRkq&=a74ou+B-gWcs|)#C?WzDuT}=uH_5YskxX|yP;QpEG#NLB8lw_*eF>@?&w_=;; zVBJgn~- zradG3|D$wIi!H~CxjFTp;;QD_am4r`JwlArE2$0=+bqT(24Nuj@f9E01m?-e@LkP+ z2H!b@Khln#7{q(+aP47Z-zevSf@|#s9(=&E4}Y4_*n*#BT9t5;9mQC{FLG~Pn&{?| z1ONr7x?d(;N@P-?mFrv9V{f$BIY67$Nutv)5U6F;=Ml(z44k?ECRY_TD^Vf$lrT#)=q5OnDp!H_Z6=6 z?h@>m9-}xPxn-p_R@z~cv;5qpRLywiduS7xSa(vcB)N(ESp)HDV{-gSh=1CMBGdYk zMXiXsrOF#vN~i^bTG2Z040FDbHtr6>ES&g>K-GWcq{^R|M~aN%8MT1$Q>CPP{*F`> z@sJIHGDq@lv^7c~qTr>0_O&{MXbjUA>~Idh3%F6u-^vKqWKa6G;g_@nXsZ)wIWKSm3WkSznJ48b5%ul zlhYZBi=*WSx{Yc!`Mi(Y5lx)l2%G2nK;`Wf;hfK<1r_4(c2#$%P(@S9jm7-ueh{|p z8?vN#I3%FP(mhIL22e~_Y<*EKs>5~y?|Zx_aQAnk^}7MM?SLM&eAoK^Zh{r{4e-j6 za^x-Uv+{*) z3Tk4CXxEWKBBCWvGG_ypPD#*R9g1iht#Wdw2-qg!+aGetcXMUG$k}5!JFMKN?LM3x z|5qg=x0SC|ghlHj7Db#KP>10wHX_gU<&ex{@b!s4zk9(Nxtt&0M5oi(MOHS6KR`{$ zk)+(_v$j!>m-e{}qO9o$m6zEXfZRY@y}Fu}3TI|yR55Ak?sabn9wXgv^j=AO~g zgtkBXEM2osLyP;L%@W;=v1>Vm_EtN-#Y!5P+Cr-A3$QFR>0OvdzDadM&bIqe4W-+0p8axKAD`r$)xRjZcrzHF=EPm+YvCJavjyyoB9;(y4tv z&PADVTCzGaT=^Mndrm>o*|)0|i{L6078N^$eQ!xrj5&dU~c6yxW+$sK)wQFzaODnjpW$lSyAejMMx z3VWJg0nnX!8xPv4kL*z_(_BV9G`VYEYr%@h!+2C-oNBVqj8cDAFdr{*qp$nFZOc$0 z7A3T});Ya4o56YP#W2fDEZ{smbc3P${;CRZ>+(Ti@w)qM0ZyG-xqVPq3?{{9f@-UF zIP<1gXkxtV!bVYcibFu`WkU4l3)aA1FJ?V*139R{yv>Mfn8!&Gr|?vQJ4#=SeoXu| z3RkN+2Qki<+oyW!4+OpI^Hj*)1>15OL9IhJ6sHfNOeR*qb<1fk@S1i2HcTrX>1+Md zt*l45&Q(r&9QLIS;GY35Cd39cv^Z>nA%UB*36Cx5t z?s;QBAYxF|XinEdQ7iS#wNs!4R+{3p8mviT0*2v(#mp{DVe8+*f_z{ba~gvrf4Rk8 zjp^wFvmbRYC65WfX?v#_04LO4~wF);<#u$3RpcAQ0wdpD{#2HS}2tDLqdj<)R>N=oO{* z?PLNmViPi!$n=<&y4&M&Q zfxyl&suE7*TnxebyNUVA$S9ZFW55({_F_rFie{CT+!pRa3RaW(dY+S5PnWi*08EVW zYD?xI)hdD+*~Yz$ZxJa9XbfSkIf=7gC(Jp51DqUB;0TJ;>4=M$s7F~ zSQ0$Iq>0dB&!ZAj`sHV$Mqmduof%8OSuCa85(VSuz7w!hT{Lw`0VxK$ZErk@d>q7m zuIFp7+TrjiXp zLUWxE)V+aL4wNE@^*$Z^C+9b>LZ!6#)!I7`2661~*kq-CZ|vZZYwc?GKUzI>o;^IF z!6H3_K%xa4k#smB?n(mgBN}!5SkPe!_>7HvH0xd-_If@qMYvRQuz}O98n9ouaEXGz zcXO^Xd3>F+fIp$$uPGTz*l3=zQ{WJ>ny~ocuko!j;&we5Ff z_VX^w$OfL)Wj_H5w%bmst$Fhn;M5edQN+&?RaMnkB(KsROD}W=0RH6tJPkHiLS&sx zqxyyCD1l~#Go*v#3X+Cm7u#|xp0`?|1&fQ=?-vGd3P`$Yg9P7ucN zKT8mnuzzC4a$D!zz_GFe6XO@57fLP=CeP4+JR--R59I`of+R}iwpBE{iYoqeJ0%&R z=4CR3S9aH8WDxz&aRT4AAwrR#lJM^j$_oBb$?tc#dhzE!Yqa79_Fn@ds9u9AOqt(n zuz^tmL`Sz{EM~hQ5{?k&p%c44Dfbl0H%0xYZ>EvmJV?P!9y*K~5iT7@=5DU31Q`NR z`wyRw^BB>c&Ix=BG^CARA`KXUGZ<<^+}2kn2;2ynKmi^zSS*uIO=uSZQ)XX>pBV9H zh=jH`Y!Z5u-Y?_+T?BCr`*=Y^#hVX>5ZI*vGr;p)aVd1L=N%YPqwWWdH!lKR0}qY` z6V3o0oD8}a#gc)e^1uOmv}#qM>)Eq(h={sP*Gf^u`yA7k$P@g4ziukzi>3zRG38CX z2ZKl8sRr{VRfruRvZ&9#g7wtwxSoYn?M~kN(C4@qc}R6Mz$GwRtwDNG$QS*>7T_8< zd#0RoW=I9$L^;t2@dfvNvg6DlC;a!4y}F3%Zr6%5h0Vw8JXb08T0e48-s{yKu17=q z7=qnfV43z~hTo^^2b54GyAS~|CS&55lFhu8Zll69tfk|gS2*f%Ou{v=D973twlFw6rb(9<%<%5e>xi<0E0C}?&qSvv!nv~(o3 zF1UMyu+-Boh#+EeK*4v8%aGBJT)uP^&mJAHJ5`N5;SfyZ0LX7=K}X2J{C%Cd@HQQ9 zVGNZLN2Ok%xy&n)x;Q}nX{EIVSh#l{mlyn_jKphtGxP8E9=E?9Sz~x2a)#g)m=uOt zv6Jy|DShneG!DX!>17t(a76oy^mE$5xICAd^uUUZ=s_dlo2pMSW=7MqC>0vh3e5<+ zRLqB;?6bu}VP58RqqC6L6PHOAoQH6laIQbK7GH8`;JxYH3!G*VDkYLtNmHOv@%oMc zUg0@K)#KR1?ViwodcIxRjQx|=vz0P3KK~+*`~ig#%+5paUnVAON-9yzWK?PXP~c^@ z&lTLF_fek3dYdpjuRgMV&l)dVq=NYMS*@F7fi`@swq|J!g6?LR}rS0?^L8XXa<@N)BjAjm8WcIDi;aA zA$G+Z?q1c+BFdJEXI@cf%hiT*Id}i<1P-Z4b09wBT|K0GxBWa0@T_3czi$3!+o_9B z1nx($%ha01;4XCF6b~IaTqtz3oxtruP~=oQ0VBZI+(|SZ1S9*UQLc%XmKRijY35VL zC}*?-CxL4Wa1f+Z97?7!d18>D_n-p>%UB;yv6$d-vg%k`9W2Zxz_7?Z*Z&{IK|ln* zHYn&Gzkxg?YuG3=047=%vkICM*7w*2U8I;x^6dPxG6Hw7#Vepw1A@nYMC?DUC-dwZ zAcXPYv{Vv7s2UuBF)G9XXp}X`s5smNFy2pk@EPlFb7LgywD(TRz?5!pT(^@f*tyDV z7Qx3??{={GCL47%Q7au@{h*??oGH!fSDlOQ|J_;tA{?M3{*>OHex%kl-xP~8#VaCT zt~RIxgL@vzj_E7UXpqsI?F$Q2PZSjtujBV!e?MrL&}clN5m*Siw%lIriMCivw#MFU zbGRtL#S@UeYd;LD)c$Fd9<#qztWsFus3sYq|B9MJ?4CCQ#|6emeTeBF&axPH11Og1 zt7*oRZ(bP!9C*`{rbVkQg?mwL?3lra9w=SfU`=o_ix4Oe6fAXUa68z&fCd#57PAWV zUxw^JM}{N23I+c%CBk8Vq1S^HOww||80g2XH0})#Ey}xSpoM=v)WP9t7=W5vYyYsjfQeUm%|xbWF@mwy+T-XSIK3Tywb- z<@whO0 zawmZB7Ybu>qLpl+*iObewAdAgY5sk2h>;50?andg{0RvSSZs1jjPv9I5iZF7GCld*dvaP_502?VGTl%m! z`6c4y;BVBLNdwO36eI@~2>q}u-#i9!n1Il|%`QYa<2Mr6Mf(~PlG4s3c&*7nhm>gM zZ-99ATKRP^Zu*0U0$~r=@R3^_OX0q>y1+fA?rCjt#_ z&oPD%@35PgF&C4AaEUhy*V$-}O~XL23P@loUkIK0%WeI|YKO!#D(KPC4R5KQVCYYkf zQ!dn-@NM1uYF=Fv7G{QDc@0@Lv+Oj*xBt$5dhl<{*Q#qa9 z)tG(V0mXAT`SaR%CBcITpV!IU+h%7GOnC=G9AS5aqy5NDC4 z>Zwd`u+dMjP7T7o<#^j2%Qzusj^%V;V&JhV13BC4JjOm1SS*Nd_5zAPe;?74Fe8wU zfRB;5+qq}2IYq{UD3hWmMHG4z1||V`HUi^N>9EpS&9Wa~Z~>J&gl>B^1kv#hU5n7G zwRYFP#Z-FFbhO>#_iqp3R^PS{dQ}ATM?&9YFq~do1#aNn_`&wVlyUf|;xOs*NhH!V ze78faBCzvJE)*c4xQbs3Z*!IPN(PI3jsV6*KFf9XbMK!0n3f=J#bwrc?c5Q9O8VPa z>(m@hqGn$7!Osoc0r!d}gx zDfw8^ZeQxHA%#?dNa*P(S&1ZM!DT?mYC%ZnLSwcgOWB>yVC7akBZ&fs9Fl4BGEo5V zd+5S%@Svkz|87LvpNd`f=vALnD}qvaR@)~b!`s8Ix8|4J74bT?upENJkIZ|5Qp;eM zF5-y@zh!T-=mL17DVWFuPeYL?go=b!=Q`X*2M}-7m6qr9cF~INF0zsOc5txbD%65B zc}|q{`=~wjWakFr_LZ{(h{0fT&UG_B%TWMvZFfJXJ`TQw=;qN5<+Z)`qdKJH`*^?; zbBsAaJobSYGhTal5@{F-x>mg3na*)GoUm#a`mmr|Nh}|0ANNBm*Mh?bqCl(WecoiT z@@vDSCkrR^9mhU*1v2bhDHKoOTavb)G=x`(btM-;n%<$T zLW{FklQ>kh$XE?)fZi4Z!8v)at94MB1p9PMlh9U!O@@OQFWZ^zvJ3m{1F%OJ-NSA^ z-KJ+CBq}+`xct$!Ic{Ib*{yC4%3Wm2vw;EUPaF|75wT*VYfQtQixSe7k4soKLy@h6 z1^*0L%cNT;=@w`P3sLUp_2bMG+oXJzX8kfP-Qcegnm+j?-)wvhGQ>v9tIT)qmN%6o zHsieMC;c|L7je19Ze;#}{75K(@BC|X1#zj?7g;!>;4PZ&sN?l{$%-|Rqi4y37+yd~Qi+@ez>}pSSGQ_v3 zq^esEA#Vl%T^^h(&mN;A(GMFLW|l7tE>$C z!8g$*pcQL!5%`mvO*91cEl7%u^VrGb+`+tpBo5+H4MiDd*E*7_($y=w3;3_~${PP$ z$|_aCppibQ8~lp1rni8vVmMaPJ|FB=Y3{6`JI}0j+Joi3;fFr_mm!pwb;hP;ONbm((m9bA3z}1 zgG^sc{0AIm5@BAEC?yUEX3E~x(C@Rr!r!ntAVX(OqnLq`NCSmV`Sdfl0WE@{zF;`i zUk}W}t4;3^iVVOucmI157zEFux)_w}TYzWrT9;Paq(YZMcbH%kzLQ9D9K-e1ndA8vFY164?)haNFio(^B;(XYwLxe{5vD8 zitP6}MWPDFm}-kQ+vjK zN(^|D5GJ1;vtkI_9I7xB<-e99FWl-Sf)_9g*v-3w=`M?S1Cri%2t359~zNo zNj?AS61y0RV=OP8D~^eBWKdU}P5 zIoZ;W!VrxQpZtgEEsu1p*9x{!+9zTe6)*|(XUMUR1tAx=hZ zzr)$x!PdE8+V*%lENL%<3NeI|>u-dz8h5vr3c_E@?q|siyUX2TRfai*SsMzvYx%^#<31HL-F#{27a*DN|RGhw_k&AR%{Cew9(Ynt4pBHUjE zjqq)(I(t{jfIfKtrsBkmbnYOWMmhJk^W__3kpPf&QalWUE~AOM!cCCR93-KO<0pSBt>0jIs(3A-`oqGHEY@WZ52{y2jn|iP&fP zG?}zRd%cyP^pY+P8ix^=^Hr4)-p67hc0r~+yN`vHg!|>v(ulT)3weTQqgRW+nO(QD z=X-M^7Ou%g0>pd8gbUrMVlltM>wY;4-AFKfkM^BOn`^%ot2hSuCsV#7$~R=oe@kVa zN)#VJBu6 zMsF3_AenN-2JCJDOYLOI#RK*=XTPrTXM2Hm+<=cHDV|)&Yr;rvvvP*3XzP5DvAXN! z#+07r(NL?I(;Pr08Cr{kpFN;_+qLuY-NnGPAzdyu0H7RH1<5@*o16COwZ~Mng_67X zL$^k-BJfMN^R4_!3X0*+wwK{~#0S$|nCR%`PK|Jna{KGfjyiU!a(TeUQ_ag6s4|;U z%{By}+csi@l>5%M7j%4xyZu>sQlK7>Bc7vkP)&0&hygo3($Bg-*M!7Pys^-iq>!?a ze+g@p6L(;1G6c-I4A)f5)=>NmIE41w768qmg61)l;t(y|$VCGXgOnc+#tU91Zet$9 zTgs`Z{CgZ}>dIg*NBErq1q>_rh;no{?8$*nzfYHscrA;CLe_t4)GeR@^)Q4ti((lE4s<~R?eOLH zasw8llv<@5WEx*#N-o>^8E2b@Rel?j@xf6PG&kFa;#cmYYAow;;3y5G1_v;I!+`+2 zLx^ArAYl1p2;hm^-)OSg3CMYHfJ;i1w7H_C0wo_Nu+B?xypy=qt}p6pwVMP3Z6( z5rGVjkfdgz;yST#l)HMZi`Vdzn>dnEyc>VpCeumlVq13#Fu0BjuhEpmdfS@_`7OJy zm1(55OXfkWYLN?;W@A1s&*Sk1nrva%x?Nn5CL6`?MnQv#T&&91iCUbe74AO)4$v!_9+kp7XGuG|s^|m{1RUJ2;$5jlqZERMEZyk=Y*Dm+mqQW25 zY|AZbX2KxkbLjUOhkpA6emwLG){CO{g&`eS;)9dk*u^}+&3+K*`jh9}o$Z3=sK7yZ z-5xh0>U}xe+GUNNeO$u^&*qXpmE$!taKQWa<3vm|9|;(Sg*BjLY+X3Vm%=K}m}N!1 z_))dx-=C*2csmnx7PDnMNid;c%gc$F$+2M96FyKhrRe%As+c;qsEjQYJ z?Y&gRB2efV-0U%6fG-uE>S~v~P1XDA5vtI?=s*Bs%yR?mbTX3Rfq>UIJzQZn?-Ush zabnQA_;Ho0pClP}>C_61_4IDj@j@&^qy;sHvkJis+XiGf!b77TD>sGLH)y7tRb8y1 zI~62|hfwela$5Vf`D9j_aQ@ATW#6TC?rQs}f%M8&UF;b~u zLKu7Aa~P%5sWMt&a|d}JOe`1NgdIP-FlwPFU%SsC+ud4%ljN(p8w>|EjAXWV!;yN- z`58`{e*q6B6Sl-@FWr|ewenYr%ygOs8y@xQ%(%Vt_IK>G3$}61MSfN#gZQf3oJC{B zNvuH*dxq;K{{2^*5gP9ZzAi2H-yxh#UmYcP$8p=Q0dD{OCE(G0xZoGk!ahZDF*NVy zY5fBQzexbPnBB{8RbaJX*ZkLj5o+wV%r@~WcYOwT4LCkqCG%0f>gd3cjt;zra{q$< zdUw6v4Rv$2%9~kr_*^%H`~q*VTPZ$3(HfQldsVl|7&NcpZWye!poI#X(de%F8}eAE zyh^Km9b=kov`Ra~L8XWCEQ2FKIE)d>*$xzc4(x+Z!Y1zlvGZGsk@Q|%8>aySTTS=ep*}eSy zNz=>EXHb}SiJ{rm*20;udBDCX|vASS2~=|DR6&cX|TuRX6PfvQIFwArRb|MZFntl zGh4XSsodQ?R+*!2Q1I-Z?tQ9z{u^Bv^4U5xzQF!N{#UsQDu%S3CEhYf#a^Y2Z6z~Y zlIK!y_KY0TL5Q~%HU2bK>xTkpPZ05O@ba|7YH}=OY=DET?X%<4hFY`6(da!SL4KNj zH*a6l!%XuSSIBwb1;aEYO_lv zZ{%OMURdsw8JZ)uj0Wg50@P|#?t;q&+QL%S|YDkltV5i zndUB=;wpF93%G30s#hi0nQG&faY5vDTtQ&3YZ=Jei2YXG-5TiQUJ>%(b}M6o0PRLA zJp6exf5O`&HhsYD`<6ra^ENK76La>{oCw%|Vcv4B)`V05RGKx@V=VXeNXUQygb)(& zS?>&B!dIX`_r`2l+#YwZ8~MH-q~iLFcHW~}xa09*c?>GAFEWresygXJE6IrtMEkEm zJkG_N(LC2}Skrv?$Yowu6Zt-Z3mV@eRabB2NeObF6WJSA>U3Sh&q!>6hWFdjOgGa~ zm`y}wSRV3W2)CW2%bwq`HBeNwcY{eQ?2ZPzO`ammPod@0Blc@=mWD!+gIJ#rRD0X+ zeA--~2^XK$Lm+hBiieL_O`q<409AMK$DFtGOkemb7NDPg&lxIZpIDRREsz)KqiFJ8 zksih=*rFL;qNWVdQO9k%kK!hda{wEk4fa?#)+G!xoBu3D|2lkq!K16UC}>mrl>1*o z1+v$V+zwt*D^ayNiM&A?n&uj$pG`R$?^z(88O^%Nkcz-=dWTdp{S9t=w1uJ#kae8E zF!h@%JJX&+#1A%M;0JPcXHISOpSRi`DngSkH51*6b*~8n-v)4kZfMX7TXP z5b;(_VW5m$*ow&V`vA_#0MpV4MP?4Ql>@*RP|N_pLoR)ndo1i3ZG9fSQQG=_%+iLr z7~&7*og%yPXN2K+uJ3vni2?hWjNDUVWhUG`X!wzm|C9y{if8n}b7~xTgI^+bcRci6 zZ1=Zl%%Pv2KdWdZBXO%|5sp=4PCEAWTzV0NBPf>~uzN2@W%e{1Rts?9;_7?2i zNAL^sm~|>eIG*ts=zAP*esZ@%ZU@M?DEh>>=n=iL^`zkPESBK!IRb45X}f0MY;`FuE9n{8>mbAWxiGP#y>gf zMRD8i>|BiE9!kF&#lQQbv1*{9v2&2=V&FqC#HCP8yavveM+9tF5ub>v`F1v8yM#Q+ z*$B&6Z``}uUpvH#X?OHH6LJTK1knXWFzIISdqaYhh~CtEQQSSW5OUl*#*E;$*p_?y z{x18T$1%vZY2W{}0mS%&Ml9T`f^Kj9H_N7)uUI<5O|xj^I`&?^nviLG*5b%UFTXBq z3AGYA$V@Ojgm|tEn>|?UUWP<4mH~L$hhCI)atdDRq1SPCU_ETN z&)Zh#6*~&A5U9LsPtlOcG}Mr2wM(h>%O*!Qscy;Z1R2TSyMiuDV>46Q`OJSHq?q}3wig?V$=Aja?D{|rHjv2x=4jt#d2)N_>;geX*Jg9 z_C43NLjM2uf3z0ODCl-oif-WrIRB%3)NgWh=|eC%3qak+8)(=^_N|qb1$zpVRilIR_TM~pPwgP zfy03;E5x-}{_2(p*4T}xCz$_?*F7qap9pX^Wnw|T-=M_o5S#14fo5JCI7k)72e?Ao z?}YDfsVU^??4JzQT~o3XjBLM0Re&2V7(c zZ=#HNNUEdVu!&&SZt1tOWfyHr>iQV#>Q3Z-^i+0nm3JZuVCOmqhVBN;Ve#lY*-Ty76cHFPf@>tVQ!buVorx#+2(2n*eUqybhUrm@Fh|ob)e6~GTZ%QCXp-4L_kMiGU>Z}Ppv7i!_KaL} z(GSgpC>5F6A#Afkf|1dgsGsf?rR)_5-;Fi>1$n)kJ?Eu(zF;pD$i13gsZ4kS{%9{> z_Dv~sI2x1Ko}Jv%TF*|A;K3P++H*jwi@kBlg}^W9ct)~g-gY1u+( zFvq!%AF~Xd#)+JU=RcPE!*n@Om)PTK{ymGSeHXZ%f$hmne#zSyq8|-oxI;6W#r7DW#Q4Vzgj(N9A=1(Ag(93}=rfq_XJ2Wm1iV$WkeK#eNP^9B@TT}dQwIWUa$ zdNMypouq+3mmb0q{HDhbT=O3@R=G*9@BXmdO)H?;nF~Ei9D)UFbZ-*F2T=`~?INXE zO1{Y}T)1<-UDs(WrWZL%5s&9V9Ut01bG8828ngRGuvgThwuYLNE#Y)nZ-`o&LIfI% zMPpZkvmU|$G{nh27F#)TK+S@9Y#=ShB z<%+EU{3Dq-vr2B$J?5nsspsbUvJkpl+q{ejulTl#p2OXYZL!ngdIDRlm>`J1 zB&gFSC+4B&z3#$qGmW>`!u2)#tt4fS#8xh3hf6*xA6d#V2J#2pet~bLsPL;8{^Rje zCu#)nlybUm9umwh$*&nReF+N=PzO*>^FayrIMk02{y;1KMuwH^QJHo&^_2asovQYn zMI#DaR(M5a8F4fwSXb4Dk5?~8XF5T}HND6`w+CthIez)rxDcOi93Iv3 z3Mw|?>xv!iT*t?eKjx&YF4F72FWONQWBwSXTXx!&Bx~kDv2`eU*g@{F@_^pg_^C~} z%;FJ?G;)XD>vL2Q<@z%Fq8bZ>X41{3sGasL#BaE&>KKOwFBic?PebZ2=SM%wcBO+q z1l^5D*u5&bgX^`?f4+7dcn8hKIDE=Dh8bJM4jK=P;Ho(kpQyi}_W*=HLpKdtZpj zy(C~8{TIVI1paEaRrVrP-_CU*ZM+|j(M&ZLDV%@GCOnIxAEfg09B8q*^td3=fO}VM zA)>Bo6YmGy7H}1*ziJTBp)!8|kiEPG@aOV1EGFP$l!uTiOug9Jj%?7@X3!LBOPgh` zx09GSnhkVOY$WizhRUg?uyXP-35ShLafpoC6W=$GwsLnsD{irGRl{8U5)61ePOQ#J zNT6j)g~!-}ZTPgy#w(9h5B&}Kc$LlW&8Q?H>Jl*=5Ma0mW> z(h+gUWWUh|yTDN}0i$X?UxCok`~$Espm&HaofeF{4-e`(u}9S)?I#_f^Md_6!FEw0 zl)+`5^iYZG?Yb{*MQAWFEG1=BVZ1}t={2?hd5C-aZBjy_(TBZ9h{qtntnQb?o?fL{ zAVfJgiO~V;r}FFkj^}HfEOe18M;5mDMRk*N$iUeS^e#w1iB4Q6?@!x8lwZAYAGa00{xdL_A5lS+=f~ zP}rOf>VJ?I7!{R5)* zBN`RHwNzzh|K^!v)b`r1J-^IZq_AIa=PjB?i0{X8CZg8T&h2NEb=2&uFWN+c;Wy-o zCo?(T=PZYClmzo$dg3AX(DAdxoQ3>qzf`|WgcKCq6A~sa`~O)x(F$RJ|J?~|*|5n* ztoKqepJ!#2cFh2S;TgVrosbjIb`vbVO{Vl+On&2fyU~7_NDbBrjNqDiGlwL-UntNb z2|xP7JZBxn0{sYAvVf5I zqvD+(w~EIBvYS~-C_RA3Jg%2KE8Pup+*<9$KIfMw``!LzV*`~-(E@!dS{ONFR- z|FWw$3+QrU;4aL+0(?$jwoZWcme%%U^=`)l3+uNiR4hB&7G1Q|O5EE?%w|B#H)CdT z(Kq>{e@Ep8x>QsUv5PubtKQ4G);({4Z$|*!M8GDv9qQ|`CX~%&HQ}C}&>t4oNI*?H zD&BtJBJ6=mh(RH^nTZ_0<1j;>1pEy5Kbvc&@~_a-_!2057iV!GXMe`UMLS%=!gp|j zb}BgwJKDO0>@$mfQilNQJ3!PZ|AwfLe-8AJe*WbxQh8os(e-;Z^wcoOxs{04OHpg) za*`9A(tnywsm#EEpD4vrw$T+%N%(mw{bHs_@XIk@`D0$voixT^&K)aXctcZnKWvjJ z73*w0MF*VE)&^b(@QfUFd^Nqzm?=i2Rpdy2{2g!pfd&Lz?ihOpkrZ%GOmWx{E~2;z z+=F&GD=_i(d}B9oZIb3!c$-df^@7i#_I=yl_^p5WHhYm36Mme{P2Ga#I?tF?M^{9+L*RsgTp&fse`$#9I%|dT-iekw>h=(Kgeo z-PQMDFNWHY@^U}bFv#qoD&ohT_4@|nMYQ+Rw0Ez2eG&-?F9E+K0gnJt6Y{NI0tQUL zw_IkAWw?qH>|XIAkH@v5AAxxZ;p__z^m6aVa(x+gEvt9Gg76lO_b+_w2M+T857xgT z#Cu^jp-!0pe+BC_Hr7UItc{4PJUefZ)N43hiobn3U&}!@+wloE81Md2qZ{ng_{i;O z{l}f%qiY~AP}>K`#?{YRSl<@0dv9d>yG+j~E}Efq^yl3Ef9PS|)jlUND%TIcrmod; zERKk)kUf-TN3|`0-5}_sZ$$d2P*?5tkhu(!|(B0=Z|Bdv4M&kIDW_Jk?Ovy3Vl!!Cfr>OBu2@<2FHHRilJGEpfbp5?E(4 z&{&m&jj&O}V6ay7XKf{1M3mq2>0j;;zJ}J4aeMeRJM)KN47oyP37^EX324#YV$~=Pr4#qRKHeFnBNDxNOdm{{lTN$Wy%h2&Qof zc+heFQ}ItM04Km$ychQzh?C=WXEL1F?PS)2ywK3-OvULcI7l^Oo|Y%tPM-4g4H5p6 z0>y7(uW%NXAK8UEkTJYS$5wF{rQBq-Ds#KrQt}%1ToZ|>2{;W5lgst8qm|sBQ=poC znh&?i#^Ni85vm<-P#?I+tYwf{&UMzu^b+w4SkA9YmplUaLFv&HMClg3=u!gzn|UIeRc|w0J2@UsAVSC?8n$rz!k_|0^<7oaDO@m`r|%gl)@nRktdcnn+b?jL zH(GJF!$6vfm{n%^V5faKXV0pKwaB_f;Aziwi7kZ0HTY+Buo5QK(G0tGEPWoh*my=lZJoz!QD&BSFN83+pqjY67HXuMy2ptzD@X+iA6`b&zR0 zB?h|hgmw%-bk%uBB*3Kb*>&AE<{ADW?b=L7Z*4$n zC9{7EHed;taaW7G>n@4-PucXafi4YtIv#|a4)F?*{h*GkzKB!E5Ui;fpNAz$dgWsw z3sdtWWW%#pgiC+IS;eBQ91i=R>&Wc zYUMPZLWCSNn}wZ|4PmdpLBLOK>}$7&yFjoRn}MtI#QXb1@*kplKg}U-c8anWe}b%v zMh@zX8Nh>cbVnRZA7pKefFxvo-S*T_chG~`J4J|4yXRzD5@13&YApX8C*ji~Ryu{h z3i5$b*o$Ay$U=r*gD}O`$=c~Xu9;Z7i)fh^GCW(`9|Lhw3{g5Iizc_p*wxs&wp1Gv zW3NsCAz2njp(n^kQAII={n5MLn+x02eW_-3tOpN+$0S!9gcjgJe2VN+?t4_46Y)6O z9g=|<^%4cj{wG+uf5q)lRExzZ%XPiZBaDO8v@4s!Q)V`NV9e(I*AY%~l0P0uC&aWyCsIiU zuY`QSWSRfzR+dG{E^n*iSclqQNOOhd8vPQkcE90rb~k@E2Lo{|A!_i@Y{*TVE!+^j z+o#8#tA<^!uD-CzVgTyl>p8$50Z?NJH#w0gV2QA5*OJ!*(#j(-pn z-9c<*6*2*5c$%RypIA??haB%uP|7At;HPl{h-X4YKIb#2jip|&uiF-OBM%-qgpVxU zzPT}^!VXG(h?&Pz!1f3y@EXE!6{g32=>?3Q9ekame;z6Lh@{2$?ZF5bGL1-jF*D{s zbH9Ecids;m8QA`#((ndMWktM8Y$?TXZ8mY9bxvZ+cc9LvhK6H0r4gk(ftR&s1({E8 z;p^Wigi5cv^3BDRv0Q@L_8ae9O?DU_*CsCWfnnI@x3idv>^^3nb_)+NL%KAO5;6?R z@I^MMw1%w`8=tV}9xKQ8odPC_^R>~Gydw5{*<5?4g)%m@lP=4H9NxRCd0GoBJOHEe zvj?o~n=6Jd`AhjZ=x_j>R%X-sY`Or>IFfA;tSbY!++uq3y4cbuaT?zZs9pOJj0>8x z6AKEV2uR?F!u&OJMA5!JjxHG(KyDCW#o6zpKYxH19Y(jKYs|P0Te_+xg7@%&!tu_Y zEawIT?Ur+=j3NqXm1Y1MBPfkHidXiBp=em;}cor zTLg7VH0%yt`RkV>W*>70Fb|}}nH5*}DcoGLus%&)BwH`pgwWwV+4v&7ql)^U2lQ*_ z8$HFD$o;59r#NT-=s-lowX`!dEva`#RtZc8gsibdLv!8UD>J<6tT#pwCmxw0q9N9< zM>C?;qE*XO@@fB@>u=)A$kLm1?591P_$o%@`}RR5N1t}*6vW_h*!x^eCd$i)vyeze z1Ufbp+DIZW$uX-RLMryz+yYcgV>(z}Xn#tzGlerK7h3GGU?cikwXnY1(iUlEJyA=Y z!xNQWp+J>09t$BYWISBVJsPNmZ$<4YEZm_o=rzq4E1j}D>rA9imET9_EXWB|DB8|w zx}=q~7uvOAcW&a?$Dr=$6^(wYV?@h?Ra3}(@j&(`jm(poOKg@S_fPH2Y87IK~`yyKARFHEAQ!YH_ z={P44Q+QoM_M{jd(9T;}kAK~ZdTzjzQ=_J^HD1*BnCI?VLT-URc>_D&(;yvMeLG=>hPdVRvQ|~mb?g@3)pckPZ+ch zC={PGn;WhS@i`7C|6=!jFo_peJ%yQ!tPkC4?*?cy3!w(hT;k)hZ38(tQ%%?hTCM;U zT#9+S5H9k|xj2_NmrF&cxkV=IYcy_cwofwMD;0GzJ^eMo0zI>Gd_kglJIlFhuVrPC zo`-fF4Airaa%_3l68#xK4Z@s zloUO~`!Mp2T?XvQl*ZUi7w?b;KM0eaM6;=Qc`TyuT^Y|#s ztNqVpoop~+od7}v#DIbUu@2xeAZpwPtv0TWOKZR`p^J@L+d#EOyTzq7)-D5TjoWLi zwnnt=1h=?UqgETOtpl{Lv2_XB>bP-!-|IZj1lqU1|NML;$#dWLS+8@Qb9nSwVln^9 z>m%x|ooENJ0y7N$2il21_T(RzwdZV15{JH*rvjt|80^S^fR4rnvi+Jirj)D2Oz@a0 zg3V~$vOcU`fD=C|Lq+ZlBRE`+z0O8#TsxgJ^&}tc!M@nQ9Q5Wjs5HG9nP9*|PNh%r`0MNw zjdnfp1-8{BALj$zH5>R6I)8V1T?pS94-MQ^#9@F#wf+s(o^JdkOrPjM|+ee7a^+G?l1C?XL zdESJlyY!U8=*fd&v04E%7+E(vgKzj=o|pb3GPe+NuWJ0sMjQ{To@vdx@0P4{T&D+p zWLPO>^;KgjuYJdTljD?^M` zULb@l1XBB|HGOQ$b9RL@LMEWpIX+kdpVmf+$%Hc7yFm2p@VwoM+W#7caG4#!2GuSr zSvnII=^nNW$wJC`_rzqorP!jX{BXcCoR0K1+IlYiIFtTfzE6>@;y$;JrH=K@gArQF zf5nvVoW1jx_BPbys^IOOkP{}}Xpm-N%Q}E4x7*e2shsslGyj=n(%Yz7qAqmiQo(8L z>On)1*;C*1eDplaVUG`>h~q-LIMQS#$%<|u>+1wQ&%r7K-R;h}Lw~jFs1s>T@1OWI zc_SdmH4CH8$2`a89ULXxO!foZaZpbQ2IphG(jmT^eW6tymy_ zB5r@|3UzkDcHZi~A+G)?G}bM2T-$wu-~%#eo$Ve4X8@75x)Df|RQ8L8;C5k3w9#mD z=#tVNf_xb(DM?lJZkV46D0AQE<2ypD>_-M7XPJnE^9&BeNSG~5;ocyYZPdZ%Vu8U5|L$1@vnj)>_wBI=DdR;Ye`qwiH-99J|=i+Sbm^a(>RDl%aYKreKRR z1)WYC6l;Iazx)~z*K_Us(YQUeYs7Uvu-e^Ji`6@KtlirjL5b_bLLK@)nZ-Odt%J9# zZoxY5$g5mBi5TuUJ6ux=cvm7WD%Iex_hFp_%EH1$tUlyt#Lr+Qp93!^WY+Q4SAn)W z3w^VfA0);9mONHjc7)5Wwx9I$2Jz-%;;%GSyM9>JV;U(N1h0My*|ja=auIg9PNhM@B$KChZ5FEkF0R~#}K zmd!4WgWf(`N4#=Rz3kG~1jo;^TLkEZCl3b?S1+|FjV3vQ&MG4s+1PG>e;- zq{p9n5be&b-f4v!IB)_nPv*!!2eECRL3Xp0GGu`v2@_vykn9Lwi$TOA%}YQ}$^)9b z+G~d);jZ182rtfPp8Iau`~+iwmIvO5^Fpeh=B_wvmk*QtaHH#0qzq;N9q(cG=LrJ} zo`~>cAtAsS?uRdB$bn=X7v!t?1hz@k%k6{^D8TFbATMT<`jma%)RCu!_+;hBPxIJn z$$Gs_xz#hfiusR-un!~LB`pMGTx?HFPc`z^1(;E3@zfFN^*3-pTpeb80Wf2QrYk?h z_Z%EgB=vE;;d&Jt3hF&kv398zuMF|rb2ZljoBq@GZkhDKk=3Nq!I0@Q{J9Sb^DEhO zFRkp}PdR}|;|(1C_hsL3+;DPQwR}xemdkUtT!^L}jBO)+4-0Fs4>n-~0)X+juzBDa zj{nFA*@G7zpWXHNha&7R;VVudv1AxZh*4Yd5pBlA4>3J9_hvLyfgtd*9 ztXO9c$w}Yk?YrAaYBm0wo7#+jf3aAs)DykuWN-eqp8i0c-m%8w6xN<= z<8RlLEVcB{{Q3X)pl~&x4BnERTDridw44os~N__b5(DY9u#5(*R z6vfOQur~uo-bQ)lE!4Z%-px@|Z06`+1*@x1grqcKq*GPtOCb6r86&)Xr$;mI&=swu z`XO}&;LzR1;~2-;w^MPK{9qmT;uSs$BIqx>)(*M9-D)~y=UM#ih_yJGnVszN)A`P}89-D!AEUB+Qt#&9kSaTbJC2JD}+5}kg_$b(&pN#QUMZh+_p z_U$;ge~85?SU{@|H_+X|BeZh{NVqRZCDcUp2ds22!K!M{Ss$MJpp7$PDHZjgwfc@XzSMGHpW zlBM~{$3|rNZvjxz#2dDPM230#KkjP!Zse%*c*FbL^50~?Covo~{NqvBI)rADO#gML z0DqP9F8oMzB$D~RkUp&(wSN|Gsr|P&XCjdYe--*M)}Qrjx4QM8b%6?P&)O$F=|0Y* z+K-S6!VwUPlX!ERsrhzqU<)R4)%}9j#LIh75--^nL274F`nGz<#NbeprR)nF%{J2yE}Pnk$us2AjDjI^u9M5~#B4aXR`q ztk@X#KxDbNKYQ|d42WzP+6Q#p{}$xp{5;6zc1UT^e#XKCTqMl_dZwLRvl13$5=j~z=}3}4)Z^Lx*J9=E^e>>gHY+>LQV+EZl8b&WPr&;?tw75Sti?fiTP?2uFQ zFbuG;>}N^Z4Gn?Bw<_+T)zm}#rHjT9f64dFN@(L+QP##rGB9#VtjzhCd)nS)ra$D@ ze1^*kR|=Hdq!Iqatn3gbiTWLW<`-0*ZPPXx!kY>dn*{0T1o`FJxI^mi;HzD29en2Q zFUqhinF|z4v&vOg*=Dt8D#d}Gdo0isw?Q+CItk}0y`5$+k&9o#4d1TWAs0ZxdZRwc zaM!e`H4R)_2PFak#h~$^VWf!~vV0+pdo6r&KW{k}Z2*P-j2$F*AS=kH4K_SOk?*b! zD^bkP4-q&J^(wlY%gLr#>>@h1kQb$R*}S65V6ehh-2glSo+A^uoM#%wj0b7n3F@-; ziJzEHK@rD?jYHJj`ZHUQ8N2|QEs}rTRzn#^OuGzUo&2BIMa<7tn7zlx3*Y`8n%{~dO!2+${_7ZKgxgfAxksLR~^eGWV_!+oT})f%#X(|D_kx_sr}K70bbZOpdMgQY!SZ5oZ@Nsi5Ku4_V* z?z<&yFQ2}`M;S)EnVz+47s=C>DZ|NH8t3n%lXZULN+d@ozE~P5HljKnyh8Y{gRbNH zWewYbpvdzueFt^{-sND+?1Z1{6Wf;up+9K}ICC}S(diTk!CA{t-Wfdmcf-th4swhShFax2FU~(%7{`>h3+zJ~KiqoFyb-Td73Flt7p!A*q zsND8+&{g{Z#%!~V0iL7ehd{WK54AH|TWku`lQ&!KMuO?l(S;??F+_!D|4P6sP*3NF z+`=X+m&pG`_I?pBC4>KiW`yD`yD`~(UJ@ZyICX$z%INC>YL(-8cBXvqm zE&c^X;4kTU_a&uL2^7pG$G0yciO+4wh5)0Q0vpy@5u3l_4lVzMf6|VTYSUk`SF%NY zA$#n%So9b9HB7`=0}~`mXvCeDVaPg$;!y-*GOBfJS0gcueFIB2Z%3ZwaAg?AD6mcP zpcT-JV_5wB0)6HoZ;k+BEhI z+k%10*9|E{IFgr82zS?pGa28{rh4Br4U?8Ss+{?(V2f~PmZsRr7%wb%iH9=hdBOh) zN-?9D%_N2LzrdRf&|Q@)q7&K%GWMaPDZHO&&Ix zZK#}G8cilcu3iaf6O>N2;K247P-xx;X2_!pG%4QOUd!26J+Zluiu10CjX1O-lcCJ~ z5Pv}mefZnR_bo64=GtMQId86L0mTTt`Qk+^$>JXe)sxfgN>xwJwvr3DfE7027ci_? z4ruazJ3Al{Yt9vUgU#&5Qrz7^i%o|2ud=@;Z2mRC3_w`B35#;zxq$Ua&IL+p;wR4 z?5>$@xhRkRknLV1oQ}6CnLzG-zUS^QhyJ=&0zWY~yi5LOsl~KI=)Kd8NIGPlu$88q z4dq*HR{wIZ20K<|@mBt3y_IR*swG5kq0{>tsLv&u!mw>;tM^ID?{DS?R8%@SNbvuv z9Cy!*9UV+W;8HH-Qm)3u{Sd6)WnphJ{CYw=+(%s#-!iGesv11Sl_>a~Sbi@-c&oG6 zgM))U%8F+Hk#Nr8zl{({2(HGb581UF5F|kr;~c^KhTqF4F_i`979=u9DTs6- zcXYFU?ti5S-DxzMeAV3=?&AYn7K1%zY0+md!(eo1B-C`&fL8AYbYTo8vx^_^YVT;V z#}eaE0d8?2KYEv+ygt&_gY83!Qkz*G41Azwh9cCU%KqY!{H^GTocN8zGWSn->RLWP z%~d^^U7fsKYA_2mumO#Puq*kO1q>rt9UILJ5xHX>oHuOv`OdA&TLT26`^xLB_&k-$ zF9y!3XT=j|)@YGKum~LbRj`YZ0sG}>JM~G}ye<62&(i&#TYDy``K`tqW>l2n&|6`X z$<+0BB{GQUcbNMD8qF_aK!t_`-N5C|sB2dH?jbRvanl*KviStH+qs0YDP`=BHn!WtyT=u@`J1yi zfH&7(MD2*)req}sU79Hx5CkgMay0kxM*~{K9kJ3CT-0fkNz}USHAgLqz`A3UEryXU zO6G4+GS6WZ3Pq?WM@(31lD!*d>ddtCzL{h4wAT)!((^&-Jy)rZv~a&EA$HFM1DIzh zW!DU5Zu1!n^f2y6fPu?W4gR*$}X9iKHvfY~M;!^oQFo zu?5VlKLjVh{EoRqf;6HyNOe5#swLSNIfw&p+hMLl7oUTzJez=ghqXxEMUQ5lm6hfA z<_4RU=_T=?JEYArv{Ow;QMZTLCTVcT-(?H8Bys*Ye66G5u>AdSa1`GRiUB-WrX-fQ z5Atm4rL(C1V{Ctla!@mA;dlQ-)~_vLU4vroYCYNOSc2gsKxGn~kv4{(V+mjy{_0Xj zEd8Urn1XnOcp?ue6XI~-HD8z4T*jYj44`4|_j}y$2TA*Bjz3(4j;(eCaKz1tU+)AS zdm;hUNLR8^*ULhP<}`nLWdi~1{z_Ny9~iC{c%e=eBrUY~-B&+i^DW9`c^0kiS!LG^ z=cZ&aRx|kH_%&5}ql1g9@BOM>;hEt^6kpcVfgv!lV%}LHRjKXft^_#XmI5uo?^M~t zDS?WW+rkZ5R*#}>{tdHhHRIo`W@o0hka)!MR8z4dnLCT8O; z!quB?j)zv<45zdZTS3E5$jTLGK{TKe1(m=jLnA8^?MB3urkieOxNwsK1!d$(=H=8BMQ$J)(JX{$~N7@I?zW@J2{TV?O_;VlXyGWKQ= zMNsEgx%*>zp!_W0z(=`^Y(h!IHStEU-r7R&9kvlzx_Z-b7sz&&u zpObPW7z{`(ZIw!Sm z0NKHDE*^j7%4AG?X(%xGb#1X>S?eI_ri^}(9i^%LR2G9#+dpzMbq0r&7JX8}BYb5% z%s{bwCfJ48WU)3Ic1|x$auJCZj^Z)dvYq=8Vg#W$o=$_tB1WAuAsv3t0K z{Q^{RyDZacF0*x{wyz7F{Rga)9kw*rjNrK{-Gag1E-pbCD|`h$Oh%X5$VZ8x`B3!) zgRw;OP!rw;B0Z3#tQ%b_dXXj$pYgDe3=>>85dYb2Y+j4>3>nhkj)uXXjq%L`_kH%1h9*{8Wo)aNy0=s(%kcZ3vSY5Z~g`a!$g;^4d zXgJxC;$4g0z6XnZAvQ9C`$*XJZa+ScZI#7ji4LjPGyM|@#$WgN&dsn z_+%Qf+IN>qz@5CNgnZc+NZcE;6{GkmZyWo3x7oo!#jt`}I64m5YI;;a`lp2Z>70FH z(54c@AwusETV0Mo74yhH3!KHrgl5@Bvct&^x!AadP8+*cMTAC=wZiBq4B!Yngu-6fW<6tY>+XlaA(P{ASjKA2B+i`qlt(g zuHZ})dDkV$s!Q@M*fnlqW6q9OXf|x6om~A8j$=a3-Vm+v>jIP;1J4o?3-%@PX_Tl^-lG#0*PvFKwitFINEHvlL>nN9A{y3N zIzmdQ_<@|P!J*|19zbkSgvOPuCO!){ zJuD?w6P2r!csx!6&b7@$;@beuIe*&9d9VOZUe`^i^pRcL&M=IeHy_JLBYB@h%cNSWS;k%sA?23rCU%y>J#6td#xUF{*iAe}N zc+v#dF}7_0$#Zf+iH|x1oATq+&8Cu64Y%O4&a6tq&WgZgz#=oWtS(x2YdU@p%-J3_!WF2|m8l1%WR3Dlu8xegw( zG&1b2pNir}1}i4QV~utl z^~2dpP=e2N0WMlm##;0CBJ=t3TC-N+OtP-{5+?8jQwA&k4#-~QNs*4x5O&DuIc-9E|gz*^g;#DhSKEYm#F6vTq#eOWW09V;XW^V~w<5JV z9bPV=SQzQd5;D7(2*wcG2u>`X-~Qs}@_nW~<<#TSZysEZJUQuDn+VmyHH{rP+~kM) ztX~0Qq4mA)Qn~998`If`p_tX$j7Yt}BL~(MY)>N9L|HE3b?OHGzBuDrZT!n>AS*;i%d!Dni&T%g0N?VS0f&X7DV>&U1 z`##f$r>Jl19U0Ua+TWbUhzZqX+%HK;&Sq^50L^&8wccPg6x7!cx(Lp%<>#u%q)R9Q zmg(3Zk%Vo};5*@?EYHCVd(+PBM2609l@j&XpJwdZ?xdwHT89ky7qmP9_{fCprOA$u z!R1N-GP1ZO)kj-=q-A@ot8bT)oy$N-rg4@oL51P;u$1OeMWt5_qsbsaxZPc2FV z?;ZLmZ?j23sTKzd+(%@H6V?Qc+pTywFfAW*Cl?|e?DlcK0(bL8G;6O;`zDx5D}diJ z5@GNU{7YTqV+}ZR#{YP7R>Cj(LY}0wmLW2mQ0ino9#p$5>Z5Thl56>_{vZVAEfHeL ztXq~%`hbgU!3EUr4#Oa+cK11ue)WZ<{P-h$&e^*(0^vn|@|B==7Xj3ubXT71=Wid_ z-)*1R8jsKcbPrRqRM21&N_u4!_C7_~Au|24R-T<$Jjx#^w;l{)Anh-qgmp=AG8Tx7 zu!JTllrZCNqpacbChW&Vw6M3U-5-6`ukBa0$^_BngJeF7F`od*L_7+Y!%;zXMX_2R z@uAi}7H|FymUR!WJ;-Z&;Bb=%4*#NGMLt7BO#Gq<&&PS>@F3JKTec=F!znf+=0(U!JkdYWt2qS%_M%aQSDEAf`2UYka<>( zy(C9@YcY{hmUsa?&!NnR+)tiPgsU?rIP+oZ3EObSr|0S$r?FUg<&^-?9Wf zN2XI-JMb$NR{GkD+py*G5Y<5TzEb$&yKjZjT45VS$5){uzKo(uku4ZS^1hETyP%zz zdGM4oxto`XlSTwHxjEwxY4)LqN_yb#F-VxZSRWSbHbZ|}+g zV;Dk{w=Ka?T7Sb@@p$NuE2fq{cFRIeb&z;Lp-_KDm z&e_X~x?i_DR%MKd@LiPPTHt9+5m8NM2L{6_fW5>u(O+N(ZV*= zkPB?=wa$!sg9O|hXz%rUoqJX8Vvo01gF)4k0#~>Usq9HxsMR(4GR}$&!t(dL{U8qy z=waI@p9JyoI7`#Mi%7fjY8pJ-h_%X)A_7#7qb{l>QFXaCQNLovYY`($6^Aoo9t< z_!px>#3e+D1+!h^ub!;!t%~HrGC<}Xe#(c&Ovf)O z)I2hH{g@36WVy6QU3GAXnyQuxhpI73lIL*VIvC~XP_>HAFuVj)iNM_fccj=S=3a@4 zHuMS&4I=ra-*N6rRS&~~)U+|iRwguiZwZf*8?ctCa%1YNt|g^N*!|7+MJ!TEA%XT3 zj>+>7{~&ui5ciPO$!8OWK7+_Vq&|fM@c+0;rIuLA7iB4zb||jKSgvOGx~4h&ugkmk zOvzqI-uYVxpo~?V*%OLaCGFF7;BdLuF4E4>>|p79AnfJqFXw~No;Zj*ZL{v1O-dRHS*;x*JUU0lE zu7htkp9f#YvFmm0p#2-K7;+o-RE0Gdo`|+ju;1|Homo#VF~K;;5J|hvv82;*usXeP z1|iK+(hx1{t+bY&y)!nxzk@%$>bg+mSq>uRM+1_BV9ir&Nlh1yl4j8|5!N(C6-AHM zZ)}B=&L;Y>>bXdJIseSfzJn|(zbe1NL*a2Fc3-5k3z>W05;3*s%x_2%9-IJmBb9DU z(R&w9v-tdQgRjJ3YElx@dJv4usXr&{eZI#M(3b7oLx`!8Vi$oXMzDFniB$h| z3-5z2K;|C3gn14p{uPTXIMFXbplUhOc@zvX-_HgA?GzUhXuacWe1oUf*tV1>mp(&} z3)qFWT0}8*phXfvv~U8kAPVqqH|5!Kdo(Cf#3T}JD$*0&N05^qyvO-*o0ijZTmh>G zin7Qw_t>ZlCC+Q3P}9!mArJ@t!fpa>_zc(8Hu*X;K!#~yK~SuunNC|CUOJSfo>^506+Z<;oN9-zZYMS? zO=z$`rP9GfIDDY^KFW)5fCP(H4RwD$z}x&hL%4oJ7|ztdO1We}Skn*BRKY&R;Jd)4K6%6!%tq<(-Xr6LEQ{DPU2c z0-HV6{sUNc05Z)k?$cv~5P++EgW}>YCl*yb=OZ|PiAX*<* zeubw%R-B0bi`bQAyC7#r`k2tKLD?_lc2h|16wN5RBcc&MqXSOn zyZnmhO#|8%*4tU#F3Wf`-qtPrl*%x{uO?b(8D8HG*R&*$0oh*m=w*kH*zOH{T!tVQ zSom4~0z0mS7>%<}_hfo(AKvYSu&~c@!xoI>7LKy(5cDlh!@VmmUPsB_(>5)|UD*lb zqcm}8ODWK~y?`ug?+d1k$x+tGnOjcIp(Wc9(U0x%oc%hdu}$pvLyPOvQ}{N9T*Oh~ zs$pQ4NGHK7rfeSq+0*kPe_iBVXvi*7$Jedr?_t!rGvFR@jmLSN&b&f)iUacbc_W0u-+89qTfA-I=P1_HckFGI`8 z>FZ?8zfKyMIzCPqN(QD#wj%Iq@vb9u11h>6pXY-gq2YGEl3u@p+07NJe9{>miEUP4VW<nACC#=56H8!+ouj_?44U@^eSJtaL4q=_N#LuVDF{*n=xu zqH=t^K}BaG<@y)n>{o=7vIhvqkvR^8ediH=2|G*!vy@e>C#dC08d}ry#;NlBiW|4j zG8qW(iz`!DtCATo*SFN*dY?@f&XvH)OpsCc*?&O?2G_NhI055xh(G{%Wi;w@EPD{> z!Ns201erQ0jo<6AZ?us`6&6Drg-k~Li`MW>Glm3()$S}Kr;?Bb--5!ohQI$84p%NY z$KJcSud|8~``-ckaEKH7$nd!zaWC6=+-lnovFMUw5cRpaUwyLLa``;Lx(f35m~1D9 zQt?cry;(Z3D2(uXTqHh809o+rDx*xaIRpGq+d#7MfQv~Tpns*Xfmj@+y z91GY$>G~tP5r_t^K_}Lb-yK7?R}kKe^KvOhFrXj2j77)`4LMM=ARy_pF~AQz3G3lI z5ftBNqzMZ@%v)pLM=Fm~4QaEEoUt^#@N|R-e=t~PdO*D-fV<(IP=^{@qA>pm=;M{j zZF+eT$m~HQ%9}0-GYIE(_QNFxj*86J0<_@7hw=5};%J1TnJPOJ|4n$C$#!hXDz+`O zQk+K0#9i?ibH5Kb*I7=iQ5O=ua$ z#&#qLVV&*q9^AcGH_Lm)aOH9&I`|k1_$9}&zjuN#b z+y-7|Q=ccvX#|`o-||=kW&;k4jig7CgV+(BTmvSq)7snR*t58dKt1OA8h#+VwuRBh zoTmujo`3u}VDJ3N*6!jCB+ET=b^>xs;_}g`fZukUpMDUG=^P;Yqh$#Jyu)drQ*DnP zjcuzy@~_elxhX)(f+?Vrwq~*!F}de%LBKmj@GH8GK&OpDd96?F6Z*M3XQzwQNp8A> ziAw-<25jXhF!l>1;QAIkq4lQx8h&HHOo8jwH->@z#I*`&S%28(cd#Yj(N3!UG=b8- zs!$h6Vkg%r*QaEU8al+j8qf;wL&6DoByZy~_M0Zu$^k)}bSB+M z{65O){S5y55Cn9rt%h{8x830fE|@u0YA4$tvbnBM=Nmu9``LH8s2fhPCRTOxH9E8e zz9dLx!htw*;4KsCZE@Ow@;Z4ywT@`tgCl|-0Q|~mOP~51k@}la67CF@S>O>paQ2EK+CAg{gMCPvxs=t_M7glEhBu#K6}f>dzwt%4N(88yhk`o}nq~jX?l`$7t!~*& zs~oLGbjoTRO6)5>pz3`NeN|9)nrhWcGuF*LJ0J2Gg3}dA&0qMGGO+W&Pk)^Xvuw}7 zim;~)##NSW6-gEpQ=6!RtGfyFu^5{~J0@ZpZjM7(ia}{n%b@beXm(+3QJQM{9xuQ5 zYm0FUDwsY>K~1L>qQGehbx4b|$jjILxL*`&VEPpmOB%=t7P%L0*$QoIA?=`i4%Ud$ z{UcVn&g$I#Qhd7D8^<1E4HUoYvm`=ot?DgN5fP$kTM&tN+DLbss66w@RnW@uJ}Wa- zFJnYD(xVC+GeMMur4xJ^O>ao*JNEVzuyBg4@jeA0D%?&;urFXuI_!&_6WQO!a&C`6 zygH!<#o|rvWP}980QIP5XEeJia725!BWmW;q?pI*4&*b(k@HQ+a@pVTOW2}1{<14X zYdT1QOf>-$_9@@a6*LC}dD~@^qj_QMG)F@qLp^7C!Ev{miZch%- znFNiZRn(^EFv!;;@!N8Cd(J)44r1dht|$!~v?*z|omSb-7xL;%Dx;qS9@0lZeR*>9 zZ-P)R7zxRs@#u@&dMu^4ZDPGREo~%VJNVjz3?(ia0=q7XY{zyxaqR|gFSw1HEli{H z1%g(*Avd(mZl^RANv-s>n$3#YgOqClAw;C=X&K)Qj*KCL}>*ArcL+by6=Ix94-6SxCGVx%Yh6JqQY8{8U7KL7i z;NP6HIX?;{ztwR?1m8EwUfIs+eO_)F=Yy9f7H!ZB_J;|PrUj5hvCcn%&~rs}^~qN9 z`=8!yMKg&*6@u>x<24LKr&_E<;~9xu;#rSHHn}8x2T)AsKV6zXD<|(8gyHQy+@O7@D_P?Fu24mk^g*sX6J#d;u=mAV`jDzTlM?=y99!;~oeVOI5IcsF*u-|kfluh* zCWz4*^6Y{6Gm5!9$qRdo#t%)XjrcgQbKpPN-qAdBSVe0R1LenTP0e^<4*#tEZo(*3)(1Ah_X#H!Q-ZFt+7a8Ft4FA3 z=}s<3oKE6RzeI}Ei^h%E-(t2;j;dkND(cA77J>-gnv78;CD%I!;o}b^@3W2p!SdKg zo1XXIx_LySln>;?f<>#nZNr6e%IsMk>*JI~IU%qM_pDB3&+3Q}{r|dV)h@^*+-3H| z5pHN20Vj_9Ed+Mhm%$2Bn{FSp(mBZ#RRVIXc>^$S4&pf$ga`Dt*lHz4BVF6u2URB8 zk++$7d*^aHFlGO2G$^^e+&FNAXGQ_V$@_5~pox1|+o5{7Xx2`{ZOL_K#R#MtxND2G0IbSH! z(bJ(nO4ctG&hR%%SSGt##UiqePpa9!7F;4`Pbh$?ZfvtXfD}&Yv$qr05eF@UA@myY z`VRY@_NHUZ4?&hwF)pJ+*4)N-VBVpChD$|Dl9J`)pQ9^2Z_y-3B(7dsH-pG6HHdF1 zFfnKFP1_aEs8Bu^?=vuX5vD~$zSJ3-fw9>01w`pxmOmClwK4a5@xb0bg`3nIsN6+in(QeKpQFyNKaax48C6&tOhOq3I zDcJLB&TN ztBpej@wgQ269=a0+Y0Nb51|@!( zIl*c|d-Xhej1>#IO(r@`Q2M7cpC(yhUlbpA8_`Rnt?N0_#`Wv1=C<(F9u_#yZBm-r z3yY!#N#>_=6RY}(;E*+wuKZIB35o1NSk6QcY}j>8xio66_5SwmZ$ z9mkx|j9nV7v@T+q6W?;Z?=SfnHa$1cos<5*Of(A>QIHDXf-qp=VQ!hI$ zPWe<@_omvylx^uIpyPpC6Skt+npQW5^-%=B*w;Ytmn8Xg-wmo`@-#_=L_dxEc6PWs z|DC(@=R#=VP%dW}Ou0}*IsrVfB2WMy>&2V?$6T*qu8YU-P|C`hbPGUn>6L^ukxP;X?-=TsH{2Ud-bPFY7JebM~qFI&nLcBvIm{d*2 z#CAkFPa)v1nEyirCwUw*JJJ$is?TV3bPiSxwTo~~q^P>YJJ~0aC%_xB*L$p_ojVZI zY_+Zc??Y%ine<5F@kxmX9IFvqKY)aaC-V}OzjMMs#>*>wTpG+#q0Av2HYS%5d7#RU zf|SgBh_K8c#z>onu2N}$b#}eX&CGPyFV4H`l>3R5#lq!iinb)T8-;_eGS__>-?=7&QJQFbmB)&4TQpG(o#Y zxo(DcVi(r%S68m)RZH>wc2gU*X?0i?bM(6p1kAyCu)dWnXViVop0b@zKgv4mY-4%wzs_Y&AjZB zh@iL~mtu;>Be6decV1uq0$6#*<4m90a5+u@XNAO$AhFmmm^1nIHr(nmX!eI=#8a{_ zjZtlGNoXYFIaXe4E6SckPpd&RAcEkvhX`Yko7M<^Etq;g+th9OMearK6v`+`2XRf1 zbxiOub1PHO!Nb-Q^oWF{=8@RHl|kjI5uHkB`C=tDHuZDPLK_XS_H|m2xL-G?E&=|E z4YyFFCd?Y-&yap4T9t<;@z-s9a8u4M4UE@s@M~G+Us~NFUc;pAWTCnPL|E*|4^#w+ zk=A91$N&%^r1#d_rl ziamd-WV8ZHrtx%DR@up$Ph%?cHEi_*B6j>fMf|bLM6T4%U4M3bze+$Qs(=8x6hF5%KwLndjs^v%eLjPL zS6FM(6=0uTA@EHI{=V4Br$HA_xdB<;3Sopzt3xOW$)TsNa0U1jZF%lr(b{ogeJ5VssvlJ3^xMVMLV2qyTW*nHXo?(@%Ds-c1oN8412EKX zv(I>&(0KvU5)s6JC(2Up19Ul=w2^t+l)icH3?A_+t3|?3;rbMpSI~;^UDd_KvqxkR-prki5q3r0}T)7QjAzpJ3XQ{S)=sN#nPvCC4iR;woN;G4GIH`X9!H1#M}C{eRf#* zk{^76_ekZRyphQPa|qxf{E48{Ujx_g)`4grgE%bq;_98G-Ej^l5VAU)uu_j6?7BF? zsmmp}WQ1&!%?JmWG;`>G+h&OYDNGtvLrbL(9zLEUW6#(aK&VQIo*0Oq+xLoke*NCT znYoDHQEB->yBbJu)S*|~E2%VHX^x;=$!8=e_Bg#qG+YjS@_QbQeP;-}urSW6g~3=8 zN*=$jvoKXXjK+BHJi1ha7fsx9U%M@AR~Dr}EF50(xD%QVXMgwket{t2L%&lx@3u6_IfC1$eZXbk<>M+2)><`lIEuvDSEYsOp8Y zAHZuwYlo@s?m5>QRMSs(V9Jq%XYC=96pz6NUC|$)8pj)zm>tqqDCsXt5fe{8LRAxw zJmXaB;Hc;A*sXT-X7~Xc2*HAYlk;-!*t%@s&WXX#_hauvV4+2Jf3#xdIQ#7ybABBX z*^)u6a!H)WV{>7t!hpqoPJC#WPgfi(Faz{q1yS&&1Q=88fIzh;*D*0J_B%C^1x=tO z;Xv_eHFijlgR*IsGZHfab{4bYA3s@72j~;I6Z9SiY2s@NdcXRU{cR zlC`)Z>!n+Iv347*q-YB9c-gx1lww@GvX&`9Rm^&+z|fTlDgA^3wlqLBu<;P$zWtnCj=@$KK#D38$BYwXY^uA;_rV^Cv(Q7T})%;kx3t71 z9z4~-zS_OrCA)%HEu5e`hXxEWRfce0leH+o&#bno5)C&9cJ^HF5lTOGRQYWw^Kg#O z%eyMy=xbZN82I0nxgE7ph8#b#|d z)4aXU!@rm#blRa%eb8QphE0V4(2UXPTp0AaxK`Ml%DZ>M!mfiUdk>PeJZ@`AcT^IL z`$DeI)+hXKiyv1mg>ZKd=hkPHX_a{&+EhL!Wg8KdRwrG7Xd`5ZBMjhwp#_Rb%!m+PtD5{A-zqRCRxvO z73q0F!v+(Yh_jPnJOe~Yv8cqt`H82t`1$_Y z6)DIs*zI8G(tmPpYbDx6ag0}FJ--;yb{tK4$Xp)j&k-Pf8Lp+Chji+u?7O^ijsv{U z9tI$#glqPFuxfbVrLm;QIIuX`JSGkUfeCOLe)c_H_%%nVjtE)ybI+{sSQLR45fM1J zzSmv}vyR({!z_DN$y3*Ul1rX91726&b@$*=-Nj_y=GOYK1 zDaMJSog;eMJ@CeJ^SLE%oymQcuv#t6`l-TPmbizUc%s?W%B(K3;{+;n5S#Jq;vR7x z=npvwNz+3v9X;oYkV_W}NBKCjEH}gypO($IASTeQ&_ZdN!YE>tt;?=SdOlGdxy_ah z2AxW^@bN>jn>wt8G{Si;z|YMbx0@IwN&u!A70&M?sQqM6U%d=_RwZL>eb z1s4MAok3+ZML*RtH%;CWP){WGUmAm;h7=IMlIQ3uuk8({`+<X zQwCkH4O@9iCLUQU*2+{qQ$LzN&(vQClV|#bSg7r}?EXypuFaVqVJ z>#)jN;&uinKZ%no!US!HYml{haEc;Pc3(Me_=}!T?v2Nkh&zK$pBg1RB<=oGj|g-xIBfx|DB{AWi5SNah0M=cIomO| z+Ft!4h=c`8m-yPvUZ$#Ymwb!;wAU_V#RtX<mwDPqm4) z&^>Bj<5y3{jtNI99@nAo*QY9Ud zhm>yPO9)3xul)cc-a&Z&1~%|x`$Wz@?-EgOkG32y78Mvc3FZ)A)FuK)Xa*YonO6(_ zD}=!{2x?zf-;%j4raeyK5Y&lCeZF=`lZO}vnzp-r$H_%&m1>0Jrw;Riz-BZ_GH`@$ zL6A|2HM_rhrk-?qI?o>gM;Oa(6!#Jh(k0SGRBs1wwiQI8WccToT?6!G+HUcW?m5-PiA+N!@~|S*#zOuKu^ySg!{uTG<((f&9}Q zq`ugiMYr@Jv+~@(l6#5U3MCwicxxGb8NH|Qcoh0%^*;hnh%|Ny-3q)~t>1Ux)sQ~T zprKB`zh>|pjUkrdOW@h&wycU2P^7VOtDMEJ)ugE!dsyc^rmY*5=e)y?7jARs{j~MD z&>tHdRny$3@fgK9%e&IIg)u2UZr22aIAfRm12@j8@3QC(&FiwR^dusaR0e}f*u}vZ z*Ac}nRx*5i|5wZFkwqkb1vf(MWIq`cdw%6EjJ?0?uvK?5kL4Zp$d0wXW-D%@tDtUB z%~JZIN%o^ItuiZW#zefIZ#mhnYY~Cv?uNh!#6h_6kITP|f0FDUuge(66W7?h0lv`d9h*{EN#viK*ggLkZj8p#>f83n={3$iUx&QmtCRVk=tfb&r$t*y_ijkSygIkOmQJ<6E?6vJmP_2XqTU z*StrrGsB4PE`(OIaR*1W;0GS?>09WEr_2@_G(Q$%P8NNgu(AQ6icbn}&2o(AN8if@H z{T~!PP86iGXS%5ytz-C=b`!bQ|^eb*s_S7Q(f;&zT09JZ;E8mj>|B%!Gnk%4$$ov>H2%YvBqVEY7yKLQsy zf&1cuQdGNlrZsgS=}0(R?4FkO*POxi$oHUT2jcBSUtHoMzJN>DlP~9}`5bccIrnu3 zLToKe6Z!u_$rV;U04y63ZD+rn^F?g`%14n;8(anY+ z+WWN%h6!?xdcHqBMHHW@N>eA{>IEbV9p%{jf0VbbJm&IOJlQAk^D^{s*4ixkOtSHp zR&v#aj07M`C~_k=bqJfn+;A+d&B;f*hH&UeKnDhYIevi)h^`g-#Grx0HF4~@(YNLT zWaegN`322x?GpCePHd@4W_L*SeO!=}wbKE2u_5Fx5&>8V@IWvtC`Q?=LbD%8-Dku# zO6CZD<*`0u&^y9)hM}!nwlHSJTSaCf>iNNN?#Ik->EUTE5%NPn zL4Z{J%cGt&K=`Q0m+-M#(p+oHM(}l*{XzR@CmaZ_VIgyTVQz4ZK8-I;J++VgW=hs7 zvR0o#?6`?&JO~QZP#0g<%#(5v%OI|c8*>!Dy{^edh=tnh=itW8hZ+Q9qkr(d^6^LCl`r}rQp`*RhtfmoAEF#3tnG_bBV z7(|Fh5dRjUfV~X5@e2E##{lnm4Db|&u|Qc24F3J}(H<`wu~4ZWpE0_scIyVCjIteu zj@pKzj9^q*6-X|nKQfWb?^tf`qE6Tda&6;D4lsF7a7!4y-@0-GS?J{oNf~tu_+O!v|Oz*|;`qV_o(adf=0|A{e&*FhBDgHj;qv zSUvmJFamxxP89T}eRRE+MEpS*V*Ti&!#hI(s3vxSjnEMur~vl%bvrRnxb!d)#QvBB zOh3NQr{X_rse8VA?@a%>5L)H=R)nelSWo?rC+qq5S3k~aZZ75S z>i)A?oKVV>UFRu7@?gi!%t)gz?D|5x%}d%zWH}u3I6Zmu0IrSk2g`Z!y9Ri!V%Ed~ zzstiv$N^F`3(CU>>0P@`8jOf6aSI;aPKib8pcVg-M>=RU!6A8VL&3m!!s_8-Vyhsy z6DxNz*(JNq@be3-{4vd?RI8+CI7hk7AIjJ{pmX8m2POJ)Y?VCr=QaFcx{_Lv3yVov z;{N67Jb3c{3UfK>sv)lE;vm?F4_KB?>F^}d1 zyL)_(X3v{zHw16|L%x7V<_}=w80#18uKdu=eJ7^xZ2AP33>8AUFQ+JFs@UMLdz=$D zucuOcw>z5M_+~VV3l~;7%~mb7gEAC!3N7O82=(4c zn~}3)G!*R@fuqZW(HyaSvMHfxPJ=F-kbeC2_TySTcbAX7;Q?HzFDHO~&Pr~-IqLm0lsy!U7-Y9p~;IaoOA-!$bDzw>i# zz*28nf3N+6&hReD__w+8EDl~T&5u=HInZWPI~yIp2-Nw|8;E1S4B2<35{L)go$-w+ z;h2TFH*BGE{VXgGp&no+P=d)-BRTN9MB9C5&4LSQl{-`*OYKA-^HLLg$TazMn zB8B4@2L+a5L|kR!+O4MfU>&?Jj#7DM1XTwemc$^1s5&KN7frPJdo2)^U;UHOb!Sb_hfztTb?CS1%VxlO| ztxTu{)V=`SOb57%2E2eBc2JFdTM0|n?konl;V9d0c=_I`P$xxMYbGK&N4-(PUTbrR zr39y#w zt^`Gh9d_#5s=vf=jleQV+Bk{|_kf+|A|CXeR=hv)mA(n-x5{DY2&Li*{Ly0FQQvr> z>+pW)X?`6Ws0xinG(jWAc^=#Dr^W**mPXsisZ;dYG9(Cxp*7)rGvXFFy$}T!hi3g) zf|jpxohY+TeWLu=B97Zn$>l>neFtdW)yUf)c7-bjY`39GyDW@XzS%;Jd<0x?Rvy2t zeL|e}?LgSEw_O?)-qastEPH_TFx`vp-+2iu;mySbdDyD^&3V^zx&abP2wEgez(F);bLF_}y9C4g_DM`?ht(_(!Zii*C9AD^O}*Jg z4Q|m-)byqbdjdI*+es%B4!x2?51~gVbLgw>;esLOeF$0A??2h@&dO&7P>9>&N{W_Djb- zA~SX24-I$w;ib#I_pSJ3DnOZMtMHZ z^R7s01p{J7%d^E_Btzf1swvLz6F{p%)Lc7385^lxiJaGoS9;Na;&XV z(>;kRPZ{9a9i_^o7+8pjYbc}+Ft*6a1i@s^w|(gvgTyl*Z&TCboBI+6+^ zR-9W=QdiNiBX8&D?FltZ9D?EW6b=%;uo=xuUbqW7wRp1j^%Z3iEXojh(l&J^P!CdD zf@<>^xruxfv2c!)Uz8a}Hy<@ysc`k@-2@ENlOC@6;F~nS^}+7YQ#!+^sVnE!Wi<|D zba?v6M%_Y~tvN`aSd(EGKL1>e;QKaMNej#|?A(XFHj>eh6QMOVK)2_i_`BtLbqmj8 zt8#z>jX1f)<$My})Ed2uYiktc8^XyPXax!vOvc0xBwYs^$jF}+~aBzx$ zm*Ds9`OJkJ75Qf}x2GvnJx%#1*jT}|4J&@D?ax^?r@zbLsjxkRyMg;A-rvp~HO{ev z@Qno{2!69oR)$Jqwvc^69H)}!5f~p#x;Q0Ai&e(v#QIvBI|$(Zu4P>WaA^l8HS*~X zGVb+GawTZ&Ob~B_P7U$yr0y7r7x3)wM~nhL75lrDomI5N(p+G`cT7fvR12!ugVpb{ zbH!OMom=3iL96}cYy9O;f^u3owDOOM_I+3SdwtST@+=||*nKLg>&%e-`olhr>Y{mn zz|%z8ue(&FJeeA@UcTodBM@ZB4F@0e=E}yPHoLE>uPlQBKPO^e4B@$%IsRbN03WAmH{w%# zOT%vD)x5JXMG&vhPDs5+@BO|wp)?+bc2p{#3#K=&TD%tJDkBuEL}IxH46OWpEm%b;w&gL0gnSpkvxAz zUQ>p~^ul6$%Z{Z1A!nx^h{%$449# ziwp+_$Id|J?9|P68UY2mG_&##VY+{g~hS z*%1uA5TdxXNC?}qoL+6sYZ1UDxY_e_cC2R3li1k1}JT^*zn zBl#)xf1a&jksJBW8Fei`PLo5eIbLlQB#mWLhWJZ6X7k7HwxvVs+i_c^?X3`n{jFR4 zt+(-uJ`=GE!#Xg!R)dgDAfB@adiIfzDzoc7w){?T==6Uk5e^oVkVCwThTmkR3Yf&E zXKuw;(6Nh9n-zS&&U~h-gYR(xU3_nPx!mq{Zu&!8r>N~CC6EGsbE<(Q>(W22w`uVf ze%88XH1Z`E<l(BsZZY<)pObJgxQ*)VV0{ zQ)G+I0L&i?iAw(l54n`?mt$QCHT7v6f9!nu!zMcm|8#8D{wKqhIOL!d0ezKxxRvmG zVj!mdBz>uP3$0M0loq*^Ci&bnKcQjJzp*!v)6b!}3+yny7#9p@H06}h83<&+0$0JN z25^us_;I@(MPVw?#%d>xwtzB78xN9fO0_50O-`)KYuExr71zdYqEGq4U5JzN|C;Vj zZd<&DpR@SN=P2Yy?Ev;pE&be6*M4g9aQS(D_A@y10)G9mytW?doLvkMg_=eLpEIxN z#$?x9)r;ihq-U>1G>`E!U9@4rF(Xv6OA_(!E=qh46HG6vx2uyj8S-dhSpYQw=x&1JIQE zMoFAPxrWOlZB|z$?=~Vmb8KqW{aDPY02VrCP5eaxDoU;aplFV_GqjDC{igc0z zA}osk9pjq6TAZ$mLj9dwMvTyN#8W6IoDb~FXZv><-vlyseA<@d(AQuv9&xH!VezaA z?L|Jm{(tHR2jtJ^lFJ;fVeWq+rC5@*yITAcqw$jqO)ZfQs*k!LV(rK(^Lo!wF2k}*s=b!%F61>2*S{2O-S9v)*aHdF3Mi4)a?M5k9AMwA zwi|C6?tu(h1Mu11UhN}3O|AX2$*ym=)k#?<#6>iUO1_*CPJv;D)tcoK=jK{uI?hB_ zZbYF+0+l8^tJP%IkwS^Fp6Gi(V`=vQygYBTcOlxsuSW|Dbyd=(FV{~r4^8nKSU+E#%7XM-c{iJx00%fe(nlk|$c(8F6>m&Rs#g>h9vEe9Z-;8X~>Zf}T;pD4LGshW$ zAw!VBCZw-a=xW>MX++qy7|?}G(LiBl)TRDjkvMgk7S_#1v9OVa*l@yY8cKFYv4*hy zKf3NZPO5tU<2YepaJtX#f(bTap%~cM*kGa<*r=%3hy^B?h=q;aUD&PI*ywHJs`p-X zjr%*l_nF1(@|k`8=i}wDyEAj<#Pj=|?`aGmecBj6>ZcQ^eRRu@xie?9y7=F9VWs_3 zPpw8Pf34R{7(Y@UZ(W^yudgF$=73&AotSmg+oh?R{hzLu)mftV$5#$3cTDxoLycWo zy})=qdtgp|L(hfvCUwl2JE(rk?;fC|=>OI_`ACO~6}(!VH@I8p44+jG>BLY6;wT@M zXtjdUUGon7Xr$(c7#rLbaA?j z{(+W0)T#1J&9B$neU}#gXq+Ki)U1~sto;W44_Di{F39KW+i@%Dej;_5gQw@J=R8g?!V!AX zqq@}xE~om}L)uNX%@Ir1CrZZ*)rI6pZRVL?&jvcXn&4Ya)=X19=^=U!S8MsCN-DG{9ztWZSe`TWgcbuV3(aEh2?R^_AKkXFl0d-jS z^z!H#oUGZz+9qDEo*Z5eL~N%&az5SS_Lwym)UVRHhr|?8>c6iRsAOG z947g4L7hiFzFT8@th-?Sy=xtu`sqA!#m2dmte`sOyK3;9#z*$B`mbE0<7`AzASdbgJhS@h&3fYR%(!_{|{7`t0A%8&1uwZdi`!U=DucL5FM!RbSLMCVDkay)^kp z7kJ(DS$##{kbJRmH4MD1qp`#t z^-uq}PjBCbogA(+xcWN~Kfl=c%pBS2>fcx2G4!H~( zsc*`(S6RERiT|u2h!ty)t4G;-jjm>XIOdW5Uj2$yOX(tY3BCRGJb95>z0(_4o$`=A zC+#BY`V_QpNyY%U| zE&I71(Q$*ms^6UH^;Q#%*Q?WWP`AbhriVsdCe-s?lByb8@9z%RQ0St1hkI7fZacCX z`^Twkzd?Ey-&AX7nixB+x=AN(e@u?)t}UfTxV`2MHuV~#&FYPI?TR(|raFCX zh=>kcIuET!UH$LK7pZdOEA2v3d zdcWUswentLVpQWfHwdKaS?|#`ZD4Q*JbvCWOJ?rgK|@Rn98kr*>JyqC%XG{V-f*&x zZsO;oeqVF+#Kygp`sroZ`#ZU2#|7xoGwaiag|*5^y@pO>&v}s`Oh`~&ukR!`h-9X& zPx{v9d5uBWs$52&&)P?ZP4=c&CpNyaIaMPO+Qs*8tij%RN$Rx@Z?5LM^RVTr!L>a1 z?EZyb3SGn;-FPWxR=Zv^MK=r4IK@%=UCYachU-9DUw@yd7eQxQ^+@s(GqqF8W$oIF z99@4^KrdWQH}ShyS~hS$vLO);(s|w;tGihW_Tp;&zWWo^E50(RjAn_V@f;E7{dcO056K zRm_A}=3c>6o4=@Ue$HQ=RBw@aurudJEIxLQwqvf%5P&`jp zFw=EJ(9yf&!d$Z_=Bv->zMHI-*6QQJ&L32>t6cYzs6N+gG*EM)N7lPAox5}!Ficy_ z!xJBFd?TQb=EU~=zCH`n1S_39tnl!0jf>F69ka$)^KDSyN-=Ak-A=4VcG^qoz?|vJ zIrZhL&Oc}9T)w^)_0f%U`MGNXnKccy?boL^^`eH2edPpw(CgE?TK`_wAJ9I&`nuy9 z?%28Kv|nm=m`?vC(%)+0*KhS#KnBj)qQUM5>MV1*PKN8rVfB%*)Z{Sjtn1fcmRb>QlhlbQIz<_!K_Zr*x{Ec(F#l3ozQSY{fti&|mX{b>bt*b~* z>#ci`_Wbo*T^|!0Tlb^iX+oE#jx;vzm+I@)dn7QwZ`yn5^>#8z(=s}L(UkZvuF)~E z>R*2$WbT}>?(MqAgc!wbEPWycn9T)nj)sP}37Q<`)3FO9zZ zpVqb0_P%ZnfYrjiexLi@UGIDSUCM#q)tBq_ncH}sF#V|Sfwk-7^OnvWHxYAB)l*++ zo(I`?uB~a=Lya(Qq-ogu)jM!1U?qrGj zDt)tY-R4w#)N>`y)AO9J@uhmE%+dNM3wKP1U8J#o>9EN&^iqx2z2`N3pk1dWtr{Ay zKic{u^{3s}O&^CL8WQR>ny#1K|GQqRdN8q7r(O#SDYVqv^zZ7YTwj3A{o>1$jT3^$ zb%d->2C+nW z+RE!Wp9g94tMbO-OlNMcpB$;~=$@ zKFI6n%yz%}{*(1(+DuK59@)4A>45wi?~87e>nGV$yM!aPqM^=j@6?V)_dL)S1o}&e zdsRaU-R*AK`VOFr_o%P)Yajlsnl}4dt-?HGeAP?Oc4NU(ji#cF#wNT}ji!s}B;|sa z*R8rA)UDe0gvJ%hN-xwWth&waglYjD0kmA)d~fSXE?S-Uoo*HM#assNCP3FHkS@Hm zv1z+K`3qfw)nDQ1rccKr^|_D!M?FrvsCvCp_*RXh_VUX2&eq_)E}ry5PpSXuEd7%D zTOQhZ)fYUMX&`xkp1{p>s*QEn9-)Kw%-Z+si*>D1Qjf4`e^yP__~`U%ulDL|y&T8u zG-l~aqYsTKzS^bv`dN)zE%*4o>iPN0jjuYj%{^ehqaDhKj@1lxaZ!J&4;OOO@BgOt z`(Hy`FDZ&YORxN*GwOK*kJZy$>)S^DF^bc-^B|6}MXQz9gIJ5`fc=VoNVQV``V+3{ zGMbC3sgg4qPj`ae{@S8`6r6ZN^jrf?@A|i%>*6{zSBDJM+do8WPyAs~Q>q>!*v3U@ zwdneKH6PWt!CtFxRDO%z%`LTsHwFmwgce%=zIShGsrqzGgsTNElj@!MrVcFi-2|M& z>Z4ZmbG7_R^$R|&u>~w!Kiv*`>RF%NKV5&9b%&0vVEOs(Z=A>1n?ck=pUNuKX7IND z=F#<<4f^`t{Q6+&QoE{p_t4<`B05HD?WNQH_kQ`Mk!>`h^YWZ(pZY*vFB7HrTOWbOS=uD+*|j^@J3eNz{@UKdbOG^8do`$C zJL3CwY*|gOL00d}|Mcu!cio`s(OvuTm32#q##QZ8XXya;{CSu9I!CGxU>7#tY`uId zcB`*u=hGp+VFVEri&pS@9%I4arUYg5tXEv@^Ce{~tAL^BOO~=n~ z>*10?)u%%`nezbcBXkHmrLX<~;icB)s3*Nn(MFIpZVi#?qrZOsrDlK5Jv;5$*v0DR z*}bbR8|eJSDUjZ6_P8=IcEofw@W89?sLw8l@NQgCOLARIELYf*QSfF}mNIeB;mSpqW zYC-Lr=2WfO@WxXAdQ0o`?z^jnM~@udw@O;tt683IWv2n+dZGWy``=3cVZD@9553Zj zmHyWj<$R$3?$<+XIO>m;{+;gCH%nFv>mW6Eng42RyWZdV_4(1BMfV)2w={h%x4L6o z^{6(q@ztuMwYT}L+GuEXNxh%FtGZ!`4kN<`=m0XT|CFb6eWX3?UG+Am6?)qnt6SXP zt|vEG*GBr8lCaK8xAf>H`kY-~6t<+*-x`2$$L~wGXxTdLQ?zht5;2#1LY=BxV5y&hb2 zOf_xDpz7duor~PB9qAT&&cmzu>){NqG4z=0qEE{@H=b`+58q51r|B^9sSV`p*Lc43 zYyL~UW%a9{Z@s*~Ru7!JoX1Xc4=h@~OD6)lf4i&qM*GN74gOk1>*wi>o2X|}9}>>d zu274T=&k$fcXPT;)mC+t_7HjxADC0$Pb%x!oV0tGGo-OS)hEt@)%g|%w z@IN*v{n_I0yqZ}b@#k(*>-@1vy3Or}9^VdY?C;K2AF01R)pMx->G_@BkjKVUn`wHShFmlwNPD@y z)glAN%pDnhYUuQOVDyt}zHGX7f#=khXbaUNYH#Y5T&r(&svQ~Cm)*MS)2>TVjg5ZX z_^@9xY0836p1ijHL4BCNTS!p9A6s>7e+%gkyXE&!`Wo{Lk-qFto0 zd_DR8!p{FhCkq$re_W`ui;FtH%IcS>U!;Dq>6fZstbU2eEcWLVcS0<)&Y$e!2P;reCFgh5D7IU#)(n`cDQ`HSHH&e>(sAN*O!jwIVrnd{aW?wOus?>I`!*Kzft{q^&3pTN&N=(8%?jT_HR_b z$@H7mZ&IIO`Yq}+)NeNZR`r|JZ!!Hg^;^_$HT`z=Th(tf{SNip)NeQaPW9W>?=bx? z^*hw>H2rS%JJs(p{T}tZ)bBR^UiG`x?=f9dE2?|c?=}5?^?TLtGyMVe`_%6@{XzBn z)gLhZA@v8;A2j`8^#|1-GW`+thtwZ7{ZaLY)gLkaG4)5(A2t1P^+(koGyMtm$J8G; z{Ymx5)t@kZruq}=Pn!Oe`jhH2O@CUwzU$*traz)AYC1-&B9g^mo+XQh(d@ zch%okf5-Iq)ZbBm*Yx+*-&KFl^x5j~slRXf2kP&u&o=!-_1WqlnEsLa2kIZ1{;~Rp z>K~c@iTX$CADjNE`p4>@nEsjiC+eS?K1cmi_0LTIT>UfkIi`Q1K1coY&V8Z!a%|D+ zbM>lo*YWhv>R+h;$@IUd|4IGNrvFv_&+30M{cq}jQU9yye^>vj`rl0dhx*^t|8Dx1 z>VH@Nhv{Fb|3m#t)4x{#QvEB_zfu26{cF?zss6S4H>Q89{*C%SP5(~)pX%S5{=NFQ z>fd$l^Y@TKYW@1}dUmhA@BBaXLjPO;<9q#sf0_Ot^?#}V+w>pQ|E>NX(|=U|kNOX$ z|D^td`j4i!tN*C}lj%RJ|D@h-`Y-D3>OY(QtNPFCznK1;`Y-Cgn*Lw)U)6sz{r}W| zQ~z)0uB(bgtN*J0U+3COb04G@i_UY*)V8eQ3+QU>IwCgR>appmdaRz9 zt~;?;iF#^!uAZuArWfj&dTx5Do~sw8*Xw*0>ZR$e>ZN*%>22yQ>aC{tQEydmGhLKe zwW;?peKGYu>U~XLT)nUQVx}*lzL@&rrq>I9Ev~+V>GdK;OQ5 zmo~j#lw)c2ex@&@-cP;1>C3A3S6{~T<H)t6OY&h!=3ms4Nf^mMNSANrU?8rM?Yk`pW7nsShxHp!xvyl}%qoeP#85rmw0#P<<8CS5sd_eO1#} zS6@|qHPdS-T1|a*(>0x@T3vk&)7MmALw%6xYpD-XU(@u#>T9a6W%}CcYpD-5eI50| z>T8?6uKL>Q>zKZt`a0_Cnm$B*UG?=$UtfJa^&zHjpgu%>ebYBoUtfI#(>GGzKz&2g zH&)+JeIwI1QQt^?W79WP-&lPU(}${WqQ0r=o2hTAKGgKh)rYEYX8IQDo2hSZ`j+aO zt8ZcYR_a@*Z)y70>RYOBW%@SiTd8kt`Y`pa)weNyTlHe`Y`ovP2XO9TlMWs z-$8vl_3cgHQGI*$9ZcUzeFya&P2X94NA;aduUC-SNquM2N2u?tKHT(O)Q78&Fnw3` z5$d~`zMJ|k>bsi0yZWx`yP3X+`flpGo4%*|?&^D(K2m)T^*v4BOMOrEk*4phK2m)z z(?_ZArM|c6`>5}&KFaic)kmrCWBPvT`>5}0`u^(ss_$p|X!ZTn_c#3j_5IaHn|`4B zX!Qe3KS=!m^#e^mSp7itgG@g}{UG&&O+QrqVD&>xKTQ1)^+Qb`qkgFRVWuChewg|g z(~nReqkg#QN2(vLeuU{`)sIj=()6R$k5nIP`qAoR)sHg$81ZhnrF#R<33F@bse!BXp>Zh50hWcshr<;DJ`swOtm_AYc z4D~ZjpQL`K`b5*uQlF?k$@H_;C#j!h`Z?-nsh@57x$0-DpJV!Y>gTARYx?=>=c=D) z`egO<)Xz74iu(ELlTE)seX{x#(=Sw?qJDwt7pY&Mexd0Xt6!*ok?EJHU!;Dq>6fZs ztbU2eEcWLVcS0<)&Y$e!2P;reCFgh5D7I zU#)(n`cDQ`HSHH&e>(sANzt;5Y)vr~*&h#79uT#I?^c&T$ zSHHpZo78VmztQv=>Nl$2WctnOH>uAs{TB5Z>NlHytNP9Ax0rsL`Yr0Wntr?bt?IX# zeuw&P>bIMIr~2*ccbI;c`W@UW!duln8U_n3a4`aSCRnts3f zz3TUw{($;@>i3)ep!)sl519Ut`UC0@n*Ol*gX#~N{)qZR>JOX#sQSa|kC^_L`XlO( zn*O-@qw0^D{)GBt>W`cLr26CPPnbSa{R#CaO@B)LN%fhgKdnAf{VCI*QGZJPY15xo ze_H(+)1Om+M*UgSpI3iY{W;TLP=8MSdDCB1e_s6s(_d15LH$M3Usiun{Uy_1QGZGO zWz%0(e_8z%(_d46Mg3LNUsr!s{Wa6yP=8JRb<=05zpnm<>2IpPp+3v>x725;ziIm0 z>TjyQW%@hnZ>hg+`n&3HtG{FVd+P6~ziayY>hG$*XZmdQ_tf7v{R8#))n}Xjq55p~ z4^00^{R8z6P5)T^L-mhL|3v*G^^Z;eRQ+T1PfY(z{S)<1O`oIwsrqN8f3E(S`W(~0 zP@kjzdFQ@Rt^U11{dfamGzc;AAzBaEHuHC$FzvzW) zSO3}cU)6tB|Hbs*)PGU`)%5?W|Em6*>HnwxoBDq{cd38xF4bSR8>)KGbIjDXETz_N zsagG(8rARX(fRjj1DQ_~ID4q~G`;?AWKZ?^OxO1%K>Zz1f33r>pR=I(ISc9M zEU4bgbgfkj>aXuT>hTMk$1keKFRZ?Z>Ee1VGSUV6YxqZ_0lhmveBqk?9o@&RX*9so zw{Y}B+|G~Ii&n1)=Bj(92kM@>Z+fWis|Th>>VbM_dcF2?s2-V~s7LCt>8X0Go|vv% zs)PDFp#Bc1zXR&8dDr^ArTM+B`n{!ki|K9ZE$XeN_fcZz1e+Sgx0rhu4{T)z$2h`sI^>;x19Z-LLkxsAk3g&fQNw4z?>MNQ)Kz&8^l}uk* zeI@k)rVmsfpuV!{^;#q=s}D4NRrP`DtC+r;`YP(Hn!dXFs_LtmUf-8^HTBg^ukWR> zy80TXuc^L<`XJNSQXizgrs;##*HmB2^tIL3QXg#kI_iVf*EW4!^|jU4F}+^@U>)^! zP1o#AP=5#1-vRa4QknYs8RYOBW%@SiTd8kt zx@Kd8`a7Wh4yeBa>hFO1JD~m!sJ{d1?|}L{p#Bc1zXR&;fciV2{tl?W1M2U9`a7Wh z4yeBa>hFO1JD~m!sJ{d1?|}L{p#Bc1zXR&;fciV2{tl?W1M2U9`a7Wh4yeBa>hFO1 zJD~m!sJ{d1?|}L{p#Bc1zXR&;fconz?b@H5VD={`X@7Ep`iZ8WtbU^UNv4li?^^vG zP=76Ar=QcT{tl?W1M2U9`a7Wh4yeBa>hFO1JD~m!sJ{d1?|}L{p#Bc1zXR&;fciV2 z{tl?W1M2U9`a7Wh4yeBa>hFO1JD~m!sJ{d1?|}L{p#Bc1zXR&;fciV2{tl?W1M2U9 z`a7Wh4yeBa>hFO1JD~m!sJ{d1?|}L{p#Bc1zXR&;fciV2{tl?W1M2U9`a7Wh4yeBa z>hFO1JD~m!sJ{d1?|}L{p#Bc1zXR&;fciV2{tl?W1M2U9`a7Wh4yeEGA*JI{v-&%r z{tl?W1M2U9`a7Wh4yeBa>hFO1JD~m!sJ{d1?|}L{p#Bc1zXR&;fciV2{tl?W1M2U9 z`a7Wh4yeBa>hFO1JD~m!sJ{d1?|}L{p#Bc1zXR&;fciV2{tl?W1M2U9`a7Wh4yeBa z>hFO1JD~m!slNm2uNC;TgZQ^O@%=$3zW-MLkLf?E|401?(|=O`LH$S5>($JERR78J zpVhloe+Sgx0rhu4{T)z$r%UyBx>SEx>hCnGzdNgPn$_R!TK!#6e;3r>1@+fG^z=H; zZ(c_&wg~F)g8I9l{w}D$3+nHJ`n%2QFR&Na*OUF5*}uK&t-=8 zM#A-IK(qS0p#CnXzYFT`g8I9l{w}D$?k}ysGwuAW^di(ZLQK^&(+l-XJvY5n&(#al zThzN&e;3r>1@(79{asLh7u4Sc^>;!2T~L1))ZYd5cR~GKP=6QH-v#w|LH%7&e;3qW zcj?pn*sT68sJ{#9?}GZfp#CnXzYFTG8-?rdY*v34)ZYd5cR~GKP=6QH-v#w|LH%7& ze;3r>1@(79{asLh7u4Sc^>;!2T~L1))ZYd5cR~GKP=6QH-v#w|LH%7&e;3r>1@(79 z{asLh7u4Sc^>;!2T~L1))ZYd5cR~GKP=6QHU$-aI=W!Ra|KCmf|6SB~HGOyWUDbCp zeGm2B)OR<1Pxal^_b`2=`X1_gn!cC%p6Vk_-&=j8`d+4wQr}B`Z`1ct-&=i@>HDgW zQs2k){nYnS-`Dj0)%R83&-Bsi`>F45`T^?utB*GQK=sk;2bg}4`T^<(ntrhQf$9gD zeu(-(>Ia*CsQSU`hnRkt`XTCvnyzIALH%7&e;3r>1@(79{asLh7u4Sc^>;!2T~L1) z)ZYd5cR~GKP=6QH-v#w|LH%7&f891q?_;z2yP*CqsJ{#9?}GZfp#CnXzYFT`g8I9l z{w}D$3+nHJ`n#b1E~vi?>hFU3yP*CqsJ{#9?}GZfp#CnXzYFT`g8I9l{w}D$3+nHJ z`n#b1E~vi?>hFU3yP*CqsJ{#9?}GZfp#CnXzYFT`g8I9l{w}D$3+nHJ`n#b1E~vi? z>hFU3yP*CqsJ{#9?}GZfp#CnXzYFT`g8I9l{w}D$3+nHJ`n#b1E~vkj5Y~Rad9J?; z>hFU3yP*CqsJ{#9?}GZfp#CnXzYFT`g8I9l{w}D$3+nHJ`n#b1E~vi?>hFU3yP*Cq zsJ{#9?}GZfp#CnXzYFT`g8I9l{w}D$3+nHJ`n#b1E~vi?>hFU3yP*CqsJ{#9?}GZf zp#CnXzYFT`g8I9l{w}D$3+nHJ`n#b1T7p&kpYJ+fFU()B@Z*yDYi(-%gMW4Y2ZG4| z=pS^g{w}D$3+nHJ`n#b1E~vi?>hFU3yP*CqsK48#`nz4Ke|Q?}7U3#)Eo%^IU)3j77a!{dKD$^##oPsym&5`g@@M9;m+u>aY6%==V0y z_1F61>WiAcN0afJ)nD76xW1n3-^~6RF4AbgJhS~Z8sOLC0nMWUffj$)4{4t3uUp)z z2j-8_jaxwdJy3rS)ZYX3_dxwUP=629-vjmcK>c+iH$C6xx&9ugzX$5?f%fA;wO)tjx&9ugzX$5?f%a;Xe-G5(1NHYn{XI~B57gfS_4h#iJy3t$N=EPF4(5H_ zN$=wh>N}dgv-*zeJDEOQeJAyuO&_7Yv-)t;cTpd%KEm`})w@=I57b{bSJTgFR(}uF z-vjmcK>c+qSN;5E_1Epb)tl8{x5QR&R(}uF-vjm69h>!Yn$=%7Kvr*7e-G5(1NHYn z{XI~B-Ktc-w^{u?P=DR=Qjc#|e-G5(1NHYn{dMPf{rtnt_H(4RpTpIUFnz505$Z>p zew6x=>SIkmT79hgQKsw8sG$BHsJ{p5uRCVx=O1f+{_*Rr$E_dxwUP=629-vjm6Eo1ceOfY}XY5IF6sGn;3>FTGdpJw_Q>ZhrnZu*(( zr>mb~`b70J)Xy}1lKPqI6HPx$eWLm#)6Z6)q<)s^=cu2hezxi7s-LZXj_K#ApQC=R z>F2ATtA3v8x`!#KzwS_=$4@qozd(KCYAX!^zK7ph-m`X%ZY zsb6gRrRo=}Ut;=H^-I(*HT^R6OVy{EK23e9`emkHu6~*NG}Et8pQe7f=~t>>u6~8- zSE*m2ex>PGt6!;pmFd&fuTpPb;l~5@_dxwUP=629-vjmcK>a;Xe-G5(1NHYn{XI~B z57gfS_4h#iJy3rS)ZYX3_dxwUP=629-vjmcK>a;Xe-G5(1NHYn{XI~B57gfS_4h#i zJy3rS)ZYX3_dxwUP=629-vjmcK>a;Xe-G5(1NHYn{XI~B57gfS_4h#iJy3rS)ZYX3 z*G&brzk1W`$LjmQy{Z0|>F=n&rT(_*@2bD8{*LMIslTKCuIcZqzpMV9>9f_}Q-9y| z57ggRpKbbw>a*29F#RL-57a+2{bThH)ju-*6ZMbOKQ{eS^^es*G5s_3Pt-p(y}tKZ z*DL&Zp#C1HzX$5?f%aUwc>2>?cyl&sff6Fy?WQ`?~(d@p#C1HzX$5CJ8bC>`oa7`Kj{zZdal0* z>hFR2d!YUvsJ{p5?}7SzU8=v=rTY6)fA5~oPj#Vsg&*Bu(Q8(JziajPLH&JDf8Ebj zuWz&Z`=I_lsJ{>D?}PgLp#Hkop8lTZ6@GkBf8Cl>k8f6gAJpG(R)38Ki0hk|_OIE$ zy>c}gFwbm%<)9u9XdVp+^?3a;LFac+KRnW-1NG4KSUpsaOi$D!_1N@OJyuUl&(yn~ z>+gg5`=I_lsJ{>D?}PgLp#DCnzi#`d=heqNuf_Ddx>kQ5)ZYj7_d)%AP=6oP-v{;g zLH&JDe;?G}2le+s{e4h>AJpFm_4h&jeNcZN)ZYj7_d)%AP=6oP-v{;gLH&JDe;?G} z2le+s{e4h>AJpFm_4h&jeNcZN)ZYj7_d)%AP=6oP-v{;gLH&JDe;?G}2le+s{e4h> zAJpFm_4h&jeNcZN)ZYj7_d)%AP=6oP-v{;gLH&JDe;?G}2le+s{e4h>AJpFm_4h&j zeNcZN)ZYj7_d)%AP=6oP-v{;gLH&JDe;?G}2le+s{e4h>AJpFm_4h&jeNcZN)ZYj7 z_d)%AP=6oP-v{;gLH&JDe;?G}2le+s{e4h>AJpFm_4h&jeNcZN)ZYj7_d)%AP=6oP z-v{;gLH&JDe;?G}2le+s{e4h>AJpFm_4h&jeNcZN)ZYj7_d)%AP=6oP-v{;gLH&JD ze;?G}2le+s{e4h>AJpFm_4h&jeNcZN)ZYj7_d)%AP=6oP-v{;gLH&JDe;?G}2le+s z{e4h>AJpFm_4h&jeNcZN)ZYj7_d)%AP=6oP-v{;gLH&JDe;?G}2le+s{e4h>AJpFm z_4h&jeNcZN)ZYj7_d)%AP=6oP-v{;gLH&JDe;?G}2le+s{e4h>AJpFm_4h&jeNcZN z)ZYj7_d)%AP=6oP-v{;gLH&JDe;?G}2le+s{e4h>AJpFm_4h&jeNcZN)ZYj7_d)%A zP=6oP-v{;gLH&JDe;?G}2le+s{e4h>AJpFm_4h&jeNca&)ZYj7_d)%AP=6oP-v{;g zLH&JDe;?G}2le+s{e4h>zf1M^yHx)`>hCwJe=w`^o7F$)TKxl1{{YlK0QC<*{R2?{ z0MtJK^$$S(15p0})IR|A4?z6`P=77fFL<73vcJGyT;II3f6e~wm8a1Fzq3;-hxK?s z^JqY%$LohTtA7CMAAtG?p#A}K}mm2cZ4| zsDA+JAAtG?p#A}K}mm2cZ4|sDA+JAAtG? zp#A}K}mm2cZ4|sDA+JAAtG?p#A}K}mm2cZ4|sDA+JAAtG?p#A}K}mm2cZ4|sDA+JAAtG?p#A}K}mm2cZ4|sDA+JAAtG?p#A}K}mm z2cZ4|sDA+JAAtG?p#A}K}mm2cZ4|sDA+J zAAtG?p#A}K}mm2cZ4|sDA+JAAtG?p#A}< ze*o$qfcgiZ{sE|e0O}ur`Ujx?0jPff>K}mm2cZ4|sDA+JAAtG?p#A}K}mm2cZ4|sDA+JAAtG?p#A}K}mm2cZ4|sDA+JAAtG?p#A}K}mm2cZ4|sDA+JAAtG?p#A}K~B$2cZ4| zsDA+JAAtG?p#A}K{t|gJ$&)XH`M7`iEVse+cRy zg8GM`{voJ;2K}sohoJr;sDB9RuUqkUss3TJ`fD^mT;II3f6e~w zm9No&d1m`7NA-9>^JqY<$Lp6i&-D*M{X> zuvz`1uGK#R^^ZXPBT)Yc)IS3Ck3jt+Q2z+jKLYiSK>Z_7{|MAS0`-qT{UcC+E!Hov zpJ%eaMgzq4%}e{&?B8Am8V#6dw!d;*j|Vi51|)jCet7c=KM|;Z1nM7w`bVJt5vYFz z>K}pnN1*-@sDA|NAA$Nup#Bl4e+23uf%-?F{t>8u1nM7w`bVJt5vYFz>K}pnN1*-@ zsDA|NAA$Nup#Bl4e+23uf%-?F{t>8u1nM7w`bVJt5vYFz>K}pnN1*-@sDA|NAA$Nu zp#Bl4e+23uf%-?F{t>8u1nM7w`bVJt5vYFz>K}pnN1*-@sDA|NAA$Nup#Bl4e+23u zf%-?F{t>8u1nM7w`bVJt5vYFz>K}pnN1*-@sDA|NAA$Nup#Bl4e+23uf%-?F{t>8u z1nM7w`bVJt5vYFz>K}pnN1*-@sDA|NAA$Nup#Bl4e+23uf%-?F{t>8u1nM7w`bVJt z5vYFz>K}pnN1*-@sDA|NAA$Nup#Bl4e+23uf%-?F{t>8u1nM7w`bVJt5vYFz>K}pn zN1*-@sDA|NAA$Nup#Bl4e+23uf%-?F{t>8u1nM7w`bVJt5vYFz>K}pnN1*-@sDA|N zAA$Nup#Bl4e+23uf%-?F{t>8u1nM7w`bVJt5vYFz>K}pnN1*-@sDA|NAA$Nup#Bl4 ze+23uf%-?F{t>8u1nM7w`bVJt5vYFz>K}pnN1*-@sDA|NAA$Nup#Bl4e+23uf%-?F z{t>8u1nM7w`bVJt5vYFz>K}pnN1*-@sDA|NAA$Nup#Bl4e+23uf%-?F{t>8u1nM7w z`bVJt5vYFz>K}pnN1*-@sDA|NAA$Nup#Bl4e+23uf%-?F{t>8u1nM7w`bVJt5vYFz z>K}pnN1*-@sDA|NAA$Nur2Y}8e+23uf%-?F{t>8u1nM7w`bVJt5vYFz>K}pnM_sCa z)TR2zQvaw~{o`3x)U5t-*XkdG`p2ODF{pnG>K}vp$DsZ(sDBLVAA|bGp#Cwae+=p$ zgZjsy{xPV34C=4N`UUp$O!jXq?H@NU?O(HhdlhOlV4m6j%1J#Q&^#KD>hb#F&FlKd zp#Cwae+=p$gZjsy{xPV34C)_)`p2ODF{pnG>K}vp$DsZ(sDBLVAA|bGp#Cwae+=p$ zgZjsy{xPV34C)_)`p2ODF{pnG>K}vp$DsZ(sDBLVAA|bGp#Cwae+=p$gZjsy{xPV3 z4C)_)`p2ODF{pnG>K}vp$DsZ(sDBLVAA|bGp#Cwae+=p$gZjsy{xPV34C)_)`p2OD zF{pnG>K}vp$DsZ(sDBLVAA|bGp#Cwae+=p$gZjsy{xPV34C)_)`p2ODF{pnG>K}vp z$DsZ(sDBLVAA|bGp#Cwae+=p$gZjsy{xPV34C)_)`p2ODF{pnG>K}vp$DsZ(sDBLV zAA|bGp#Cwae+=p$gZjsy{xPV34C)_)`p2ODF{pnG>K}vp$DsZ(sDBLVAA|bGp#Cwa ze+=p$gZjsy{xPV34C)_)`p2ODF{pnG>K}vp$DsZ(sDBLVAA|bGp#Cwae+=p$gZjsy z{xPV34C)_)`p2ODF{pnG>K}vp$DsZ(sDBLVAA|bGp#Cwae+=p$gZjsy{xPV34C)_) z`p2ODF{pnG>K}vp$DsZ(sDBLVAA|bGp#Cwae+=p$gZjsy{xPV34C)_)`p2ODF{pnG z>K}vp$DsZ(sDBLVAA|bGp#Cwae+=p$gZjsy{xPV34C)_)`p2ODF{pnG>K}vp$DsZ( zsDBLVAA|bGp#Cwae+=p$gZjsy{xPV34C)_)`p2ODF{pnG>K}vp$DsZ(sDBLVAA|bG zp#Cwae+=p$gZjsy{xPV34C)_)`p2ODF{pn`>K}vp$DsZ(sDBLVAA|bGp#Cwae+=p$ zgZjsy{xPV3+@<=*U8;W~^^cp?Kbcj<&FY_Yt^Nt9e*)^Cfcht({t2jm0_vZD`X`|N z38;Sp>Ysr6C!qcbsDA?LpMd%&p#HiQZsOZ(UC-(E!;4VY)Pzj9iS z2Q-fcWO}@QY1;WN1Nz~)9-XRZrWfj&dTx5Do~sw8x2PBDrRlBerFx6$ZR#!Rt)}-; zZ&hzIy{~%Lck@j^{S#3C1k^tP^-nQ2zwfKLPbmK>ZU?{{+-O z0rgKn{S#3C1k^tP^-nQ2zwfKLPbmK>ZU?{{+-O0rgKn{S#3C z1k^tP^-nQ2zwfKLPbmK>ZU?{{+-O0rgKn{S#3C1k^tP^-nQ2zwfKLPbmK>ZU?{{+-O0rgKn{S#3C1k^tP^-nQ2zwfKLPbmK>ZU?{{+-O0rgKn{S#3C1k^tP^-nQ2zwf zKLPbmK>ZU?{{+-O0rgKn{S#3C1k^tP^-nQ2zwfKLPbmK>ZU? z{{+-O0rgKn{S#3C1k^tP^-nQ2zwfKLPbmK>ZU?{{+-O0rgKn z{S#3C1k^tP^-nQ2zwfKLPbmK>ZU?{{+-O0rgKn{S#3C1k^tP z^-nQ2zwfKLPbmK>ZU?{{+-O0rgKn{S#3C1k^tP^-nQ2zwfKLPbmK>ZU?{{+-O0rgKn{S#3C1k^tP^-n zQ2zwfKLPbmK>ZU?{{+-O0rgKn{S#3C1k^tP^-nQ2zwfKLPbm zK>ZU?{{+-O0rgKn{S#9E1k^tP^-nQ2zwfKLPbmK>d?0)j#P{ z{Zpxb(yadJtSV_%|FmoMPeJ`tQ2!LvKLzzqLH$!u{}j|e1@%us{Zml?6x2Tj^-n?l zQ&9gD)ISCFPeJ`tQ2(@9{RQ^o`sStmYxZxiVvPpOGuvM|tH%SHM+0&_UdrCA{wb(` z3hJMN`lq1&DX4!6>Ysx8r=b2RsDBFTpMv_Qp#CYSe+ufKg8HYR{wb(`3hJMN`lq1& zDX4!6>Ysx8r=b2RsDBFTpMv_Qp#CYSe+ufKg8HYR{wb(`3hJMN`lq1&DX4!6>Ysx8 zr=b2RsDBFTpMv_Qp#CYSe+ufKg8HYR{wb(`3hJMN`lq1&DX4!6>Ysx8r=b2RsDBFT zpMv_Qp#CYSe+ufKg8HYR{wb(`3hJMN`lq1&DX4!6>Ysx8r=b2RsDBFTpMv_Qp#CYS ze+ufKg8HYR{wb(`3hJMN`lq1&DX4!6>Ysx8r=b2RsDBFTpMv_Qp#CYSe+ufKg8HYR z{wb(`3hJMN`lq1&DX4!6>Ysx8r=b2RsDBFTpMv_Qp#CYSe+ufKg8HYR{wb(`3hJMN z`lq1&DX4!6>Ysx8r=b2RsDBFTpMv_Qp#CYSe+ufKg8HYR{wb(`3hJMN`lq1&DX4!6 z>Ysx8r=b2RsDBFTpMv_Qp#CYSe+ufKg8HYR{wb(`3hJMN`lq1&DX4!6>Ysx8r=b2R zsDBFTpMv_Qp#CYSe+ufKg8HYR{wb(`3hJMN`lq1&DX4!6>Ysx8r=b2RsDBFTpMv_Q zp#CYSe+ufKg8HYR{wb(`3hJMN`lq1&DX4!6>Ysx8r=b2RsDBFTpMv_Qp#CYSe+ufK zg8HYR{wb(`3hJMN`lq1&DX4!6>Ysx8r=b2RsDBFTpMv_Qp#CYSe+ufKg8HYR{wb(` z3hJMN`lq1&DX4!6>Ysx8r=b2RsecOUpMv_Qp#CYSe+ufKg8HYR{wb(`3hJMN`lq1& zX_xAscB%fE)IV)j|7=#3HmiTuwfbkE{u!u$2I`-I`e&g28K{2->Ysu7XQ2KWsDB3P zpMm;kp#B-Ce+KHGf%<2l{u!u$2I`+RtG`AA#P!Wf``7H>UL_h0m}j=Xa$b)IG>--p zdb~yhn&Ysu7XQ2KWsDB3PpMm;k zp#B-Ce+KHGf%<2l{u!u$2I`-I`e&g28K{2->Ysu7XQ2KWsDB3PpMm;kp#B-Ce+KHG zf%<2l{u!u$2I`-I`e&g28K{2->Ysu7XQ2KWsDB3PpMm;kp#B-Ce+KHGf%<2l{u!u$ z2I`-I`e&g28K{2->Ysu7XQ2KWsDB3PpMm;kp#B-Ce+KHGf%<2l{u!u$2I`-I`e&g2 z8K{2->Ysu7XQ2KWsDB3PpMm;kp#B-Ce+KHGf%<2l{u!u$2I`-I`e&g28K{2->Ysu7 zXQ2KWsDB3PpMm;kp#B-Ce+KHGf%<2l{u!u$2I`-I`e&g28K{2->Ysu7XQ2KWsDB3P zpMm;kp#B-Ce+KHGf%<2l{u!u$2I`-I`e&g28K{2->Ysu7XQ2KWsDB3PpMm;kp#B-C ze+KHGf%<2l{u!u$2I`-I`e&g28K{2->Ysu7XQ2KWsDB3PpMm;kp#B-Ce+KHGf%<2l z{u!u$2I`-I`e&g28K{2->Ysu7XQ2KWsDB3PpMm;kp#B-Ce+KHGf%<2l{u!u$2I`-I z`e&g28K{2->Ysu7XQ2KWsDB3PpMm;kp#B-Ce+KHGf%<2l{u!u$2I`-I`e&g28K{2- z>Ysu7XQ2KWsDB3PpMm;kp#B-Ce+KHGf%<2l{u!u$2I`-I`e&g28K{2->Ysu7XQ2KW zsDB3PpMm;kp#B-Ce+KHGf%<2l{u!u$2I`-Y`e&g28K{2->Ysu7XQ2KWsDB3PpMm;k zp#B-Ce+KHGb*cVYm+GHO{j+BE&u3Lxv-;;Ys!9=b-*MsDBRXpM(16p#C|if8MPA8VwNFH!tm9vwwS)YBXS; z+5XB!Js!|J8c^!-8VzV(;U@?6&q4ijQ2!j%KL_>CLH%=3{~Xjm2ldZE{c}+N9MnGt z_0K{5b5Q>r)ISIH&q4ijQ2!j%KL_>CLH%=3{~Xjm2ldZE{c}+N9MnGt_0K{5b5Q>r z)ISIH&q4ijQ2!j%KL_>CLH%=3{~Xjm2ldZE{c}+N9MnGt_0K{5b5Q>r)ISIH&q4ij zQ2!j%KL_>CLH%=3{~Xjm2ldZE{c}+N9MnGt_0K{5b5Q>r)ISIH&q4ijQ2!j%KL_>C zLH%=3{~Xjm2ldZE{c}+N9MnGt_0K{5b5Q>r)ISIH&q4ijQ2!j%KL_>CLH%=3{~Xjm z2ldZE{c}+N9MnGt_0K{5b5Q>r)ISIH&q4ijQ2!j%KL_>CLH%=3{~Xjm2ldZE{c}+N z9MnGt_0K{5b5Q>r)ISIH&q4ijQ2!j%KL_>CLH%=3{~Xjm2ldZE{c}+N9MnGt_0K{5 zb5Q>r)ISIH&q4ijQ2!j%KL_>CLH%=3{~Xjm2ldZE{c}+N9MnGt_0K{5b5Q>r)ISIH z&q4ijQ2!j%KL_>CLH%=3{~Xjm2ldZE{c}+N9MnGt_0K{5b5Q>r)ISIH&q4ijQ2!j% zKL_>CLH%=3{~Xjm2ldZE{c}+N9MnGt_0K{5b5Q>r)ISIH&q4ijQ2!j%KL_>CLH%=3 z{~Xjm2ldZE{c}+N9MnGt_0K{5b5Q>r)ISIH&q4ijQ2!j%KL_>CLH%=3{~Xjm2ldZE z{c}+N9MnGt_0K{5b5Q>r)ISIH&q4ijQ2!j%KL_>CLH%=5{~Xjm2ldZE{c}+N9MnGt z_0K{5b5Q>r)ISIH&q4k3F4aHpQvD05f8MPA#jGlCR{x@F^)EpE3sC<8)V~1rFF^eZ zQ2zqdzX0_wK>Z6){{qy%0QE0G{R>e40@S|%^)EpE3sC<8)V~1rFF^gZSiiu2p2_}= zrTvTMrTuI6Z?7_q2Fx?tU%9Nu1DZzzTJ(7R@aA>>3sC<8)V~1rFF^eZQ2zqdzX0_w zK>Z6){{qy%0QE0G{R>e40@S|%^)EpE3sC<8)V~1rFF^eZQ2zqdzX0_wK>Z6){{qy% z0QE0G{R>e40@S|%^)EpE3sC<8)V~1rFF^eZQ2zqdzX0_wK>Z6){{qy%0QE0G{R>e4 z0@S|%^)EpE3sC<8)V~1rFF^eZQ2zqdzX0_wK>Z6){{qy%0QE0G{R>e40@S|%^)EpE z3sC<8)V~1rFF^eZQ2zqdzX0_wK>Z6){{qy%0QE0G{R>e40@S|%^)EpE3sC<8)V~1r zFF^eZQ2zqdzX0_wK>Z6){{qy%0QE0G{R>e40@S|%^)EpE3sC<8)V~1rFF^eZQ2zqd zzX0_wK>Z6){{qy%0QE0G{R>e40@S|%^)EpE3sC<8)V~1rFF^eZQ2zqdzX0_wK>Z6) z{{qy%0QE0G{R>e40@S|%^)EpE3sC<8)V~1rFF^eZQ2zqdzX0_wK>Z6){{qy%0QE0G z{R>e40@S|%^)EpE3sC<8)V~1rFF^eZQ2zqdzX0_wK>Z6){{qy%0QE0G{R>e40@S|% z^)EpE3sC<8)V~1rFF^eZQ2zqdzX0_wK>Z6){{qy%0QE0G{R>e40@S|%^)EpE3sC<8 z)V~1rFF^eZQ2zqdzX0_wK>Z6){{qy%0QE0G{R>e40@S|%^)EpE3sC<8)V~1rFF^eZ zQ2zqdzX0_wK>Z6){{qy%0QE0G{R>e40@S|%^)EpE3sC<8)V~1rFF^eZQ2&C|zX0_w zK>Z6){{qy%0QE0G{R>e40@S|%^)EpE3sC=}OZ6|hRR2=yUo@+KIjbs~)xYdo{Yy~) z64bv0^)EsFOHlt3)V~DvFG2lFQ2!FtzXbI!LH$cm{}R-{1obaL{Yy~)64bv0^)EsF zOHhB^inmMkFPqh0qXFXj=B52>_HVCpjRwp!+h4h*9uH_94QSQl^-G)Y=39dLm!SS7 zsDBCSUxNCVp#CMOe+lYeg8G-B{w1h?3F=>h`j?>oC8&Q1>R*ETm!SS7sDBCSUxNCV zp#CMOe+lYeg8G-B{w1h?3F=>h`j?>oC8&Q1>R*ETm!SS7sDBCSUxNCVp#CMOe+lYe zg8G-B{w1h?3F=>h`j?>oC8&Q1>R*ETm!SS7sDBCSUxNCVp#CMOe+lYeg8G-B{w1h? z3F=>h`j?>oC8&Q1>R*ETm!SS7sDBCSUxNCVp#CMOe+lYeg8G-B{w1h?3F=>h`j?>o zC8&Q1>R*ETm!SS7sDBCSUxNCVp#CMOe+lYeg8G-B{w1h?3F=>h`j?>oC8&Q1>R*ET zm!SS7sDBCSUxNCVp#CMOe+lYeg8G-B{w1h?3F=>h`j?>oC8&Q1>R*ETm!SS7sDBCS zUxNCVp#CMOe+lYeg8G-B{w1h?3F=>h`j?>oC8&Q1>R*ETm!SS7sDBCSUxNCVp#CMO ze+lYeg8G-B{w1h?3F=>h`j?>oC8&Q1>R*ETm!SS7sDBCSUxNCVp#CMOe+lYeg8G-B z{w1h?3F=>h`j?>oC8&Q1>R*ETm!SS7sDBCSUxNCVp#CMOe+lYeg8G-B{w1h?3F=>h z`j?>oC8&Q1>R*ETm!SS7sDBCSUxNCVp#CMOe+lYeg8G-B{w1h?3F=>h`j?>oC8&Q1 z>R*ETm!SS7sDBCSUxNCVp#CMOe+lYeg8G-B{w1h?3F=>h`j?>oC8&Q1>R*ETm!SS7 zsDBCSUy}Nlp#CMOe+lYeg8G-B{w1h?3F=>h`j?>oC8&Q1>R)!L{$-cy-y-!do7KN% zR#i5ue@oZu-va920_xua>fZwD-va920_xua>fZwD-va920_xua>fZwD-va920_xua z>fZwD-va920_xua>fZwD-va920_xua>fh3={u&Js*EcWiU$cLERcJI|p4tA&t@U_7 z^JqYu9cF>TRa?Rc}-8WBOw1eboD!zPNf{^~FqI zLVYpy#Z6yQeR1_AOkYZU3H2pSUs`=h^`%Vjr@oZ>(x&%UUs}DN>C341Q}1v3vg-ZS zmoa@g^<~tTHGO&YW!0B6eFgR9)R#AXMfK&?S1^4g^%c}tG<|^jis~zwzOwpC>H|z4 zs6Ie_Wz$ztUs-*i>8q*_RA0sP)znu}U)A*0)mK$t&Ga?YS5sfz^g-&YtFK}Dn(Aw) z4>El%^+D=unm$;4P4%@*Ut4`G^}(jEqdr)DZPV9PUt4`0)7Mj9M}1w>hp4ZszMkpp ztFNa%#Pki+hp4Y_`iAQ3t8ZZXM(P`=Z)p0)>Km$WWcnuR8>w$>`ljj|t8ZfZQ1wmJ zH#L1T^-a}>n!dUEQ1#7B-$H#e_03J+QhjsvEll4^eGBz1P2XC5OZBZx-$s2a^{q`G zroOfMHl}Z@zK!}Y)3;L}roOG|+pBM@zMbhisBfpfz3DruZ?C?C={u?KpuVH&JFD-g zzLV+0)pt_g+4K?WJF5>jeHZoN>LX0wRegl|E~f9MzKi;U*j0ZTddyd#jH!eP8ua>id|!pZY%P z`nLb*5KlS}hKR|td_0gsus6JZ#0MidrKS2FJ(+^fZQ2ij&4^clz{b17% zRXd%DD@-N z$C`e$`dIa&Og~2bDD|UFAE$n_`Z1;-tA337IMa_)AE$n->Bp-dtA3p6C#WB%e!S@? zsvoa@g6SuzpP+uC=_jk7sD6^^Jv;qO?`s; zsivQOcpQ(Pj`WdEAR6j%gOw%W+pQ%34^t03_s!uZgZ1qX%XPJJE z`dR8{n|`kP+3M$*exCX{>gSq%zWTZ9=b1iP{XF&aO`oEEzWQX-FHoPXKE?D4)u*Um zVERSs7pPxo`o-!Os$XRKCF&QcUu^oN>KChDV)|6|OVlql{WA4S)u)<1O?|5RWu{-Q zewq3-)2~pUrhd8USE^sGeue2*sb8UfrRi6zU#WhT>C@G(Qoq{tYt*k+pKkiK>eJP) zG5tFAYt*kb{d)Cl)vq)C2KDRIuQ&Zh_3PDdF#RU=8`N(!eTMpt>NlBwv-(ZyGfcll zeTMqYrr)Z5v-&Nj-==O&s2Xx z{YlfGQh!o?rs+?s&s2ZP^k>wcQh(a?XVsrpf5!CZ)Spp**7WDqpH+X(^cU2hQ-9v{ z7uBCvf5G&Z)L&44(e#(qUsQj|^jFkhQh(X>SJhuuf5r6I)L&75)%4fZUsZq2^f%OB zQ-9s`S?aH=zhU~D>TjseGW{*}S?X_^{Tj9;j`~~bZ=3$E`rGR7nEsynJL>P6 z{=WLV>hGC8Tm3!t_f7vm{eAV>rhlkDTm1vmKT`id{X^3~R{v1_Bhx=o|498~(?3=J zSp5^zKU4oi{ZrHDsDG;dndzUaf2Kai^e@!ssDIwMFVv&@lltfCRp-7)kLu6rU#S1d z^uMV8N&U~J|5g3Z>VGl)Z|Z+h|EuYLSO2T}-%S69`rp+5Zu*z%e^>v9>0hb;L;XwB zzgGWJ{VUVIQU6N)Yt#R!{ff6Fz52K6-*xWu_o)7*UVYcI zd-Z+i|DhN9-})cl>mU5f^#7>;Oa0%b|DgVF_5Yauqxyf;e=z+g^&ixKG`(H@NA;gf z|5^Pf^>)*LQEylO+4Nu4e^&p+^xxEfQUBHS|EmA0{+sFlr~aGze>?Yu>do`Ns{hxy z_Ub7_)#K+mW@=lOo@%$$tp2TCtA8t~e=DeeE2w`fsDCS{e=DeeE2w`fsDCS{e=Dee zE2w`fsDCS{e=DeeE2w`fsDCS{e=DeeE2w`fsDCS{e=DeeE2w`fsDEp-`s?#7u5Vu2 ze_^qIdsS*Qpr!MMtlUXQ(xZn71ftlU%~X1)K^en(ewf8E2^(#`pW7nsShxH zp!xvyl}%qoeP#85rmw0#P<<8CS5sd_eO1#}S6@|qHPhEnUrl{=(+8=quD*upYpSoI zKFIX7)CZ}rY5HLGHPzQLeQou%)CZfsj{0ErwM}1FeQou1OkYoZ9rblhAELgl`g*3X zufCr85YsnMAELg#=^LuAufBol8>w%gzM<(Gt8b{jk?EVLZ=}Al>6@x=tiFlqL)AA? z-_-QY)HhWhYWn8tL)AAkeGB!?)HgSMOZCmww=jJx^)1x5G<|FJE!DR&eH-bsl1 zr~2;ddzd~_eGm0LP2Wp>PxXieqiXZmRM{nYn2{Q&j-)km9tp!#U_157_i{Q&g?O+Q%uK=p%6KScc?^@B}6 zRQ+J}LrgzR{Sfs-O&_CvsQO{1AFh6w`WVxXP#>dyxami#AFh6c>0{N8P(RZ2qtuU7 zA8Y#2>SNW9GW{6!qtuT!eVqEy>c^OVtokwP<4iwJeVqESrXR0SvffQT+_{GfkhQex~|F)6Y_$s6NT`v(+c5pJnSw8+ZTh+DXRDuM`g!W-sGn>4`ReDYpJ)1H_4CxvH+_ow`RbERzd(Jm`V`YIRG*@L zf$0~iU!Z=W=@+YCsD6>@m#AN)ezED7s$Z;riRn|-FHyhL^vl#QRiA45H1(CYU#Wh%`W2>MrGAC_m8M^?VrcYPDO8sinuTj5ReY)w_s!vzH z#`NpduTj6&^y}5HRlm;k8`Q5;zuxp4)vs5-!StKdZ&1I{^cm_ms^4V#&FVL)&oKQK z^%?3nn|`bM&FZ(9ew+F&>bIJHyZWu_x0!y2`fcjBn|`PI?do@!ewX?k>UWxcxB8vx zcbR^V`d#XGn|`nQ-Rk$4exLe1>i3#{zxuuE_nH2H`hDv6oBp8s{pt^x{*d|u>JOU! zu=<1Q51Iam`a|juoBpW!!|IQi{+RkB>W`ZKxcZ~&kD302`eW*koBpKwTj#RWBPmQ@2J0P z`upnds=sIYZ1wll-#7gO_4n0hoBpBtZ1oRJ|497<^$$(|Sp7rwk4*nW{Uh~{P5)H= zWA#r=|4jW8^-oQoqyDM-XQqFy{+aq5)4x!kqyBm4zEG|Ht)Tv`p#H6({;ibp#E*3{%xTC zZJ_>bp#E*3{%xTCZJ_>bp#E*3{%xTCZJ_>bp#E*3{%xTCZJ_>bp#E*3{%xTCZJ_>b zp#E*3{%xTCZJ_>b&Fa5M5A9~#nwR!pSnRLiH;o3gcHS>5_o>GNnnwfr>hao(_v!p- z{qV)~=sxOwOFRgeOdMX>dTnEocc2A%bLEt`m*ZFnZAPha_Y;QzM}f_>MNMOlKKkj zE1Et)eMR+^OkY`jCG`QO4^$tZzOw17sIRO((DYT+2db}P`fBQ{sIO}J>gubiuV(rh z>Z_@*Zu%hg)z#N9eNFW>)CZZqmii#|HBBF^zNY$GrmwBOmil1R*HIs=zP9P>s;{lS zj_K>EucN-M=|j}lRbS8a_0`u?A7c6j>O<7mH+@6(_0=~peIxY^)HgJJWAzQyH!^(_ z^^MdwHhoj|jny|XeW>~->YJLrnfj*cLrvdYeW?0orf;FXnfm6YZ>hey`WB{drM`vw zmZop5zNPwBrf;LZmHO7E4^!V-eH+uaRo_N^nCaW84^!XP^zGHRRo~9^9n`l|-`?~c z)wfsQ!StQfcTnHa^qtjrRNu+;;p#i7?`--A^_|s+o4$+saP<+U@2WmReHYVrQ{P2> zSJQV_-&K7#)Avx{O?`LM_f+3qeGk(|s_&t`r|EmC@2Ni0^u5(bs_$j`DD}P6_cnbW z^}W?cnZB?3DD{0z-%ouX^?gm>UwvQo{Y)RNzMuO3rXQfbzxrs?4^$tmet_u*sUM(z zpy>yzAE4&Hvq<*mJhpHc}eu(LZsUM<#sOe+W4^=q4>$ct z^~2SVFnz505$Z>pew6x=>SIkmT79hgQKlcGew6yrrjJuUTKyQ)k5xZLeVpmXsgF}X z*7W1mk5xa;^b^#NQ$ODH6V;DbKf&~q)K5@9(e#tmPgFn2^zrH^sh@26De5Pyk2igS z`grwIOg~lq6!i(FpQb)R{Z!LWS3gz#G}F&eKTZ8~)6Y~tUHuHxC#s*Jex~V@)X!9( zX!=>|6V)e~ezy7~^|MSrNBu1IvrRu&{cQDfOg~Tk9QAWeKVSV^_47=htbU&Q`KC`% zKVN;a=@+O^R-a<}h3Zq(FEITg^$XN5H2q@r3)L?&{Sx(y)Gs#uQuT|~FEM?p`X%a@ zntqx3rRq~npQb)l{W8-pSHDbsn(0@lPgB3#^efdbSHHsatJJShztZ%p)vr{)%Jk{# zSE*lZ`ZelTt4}xmTJ`Db*O-2t`Zem;ntr|dwd&WIeuMgT>erioqx$vgH<*5t`VHzg znm$AQM)jLazghhz^%en9*X zegHoxei%Q99}+);AHoldAH@&jN5qfeNARQK$MK{1G4T`lG5omrN&Gl|Li`kd0zWB! z8b67j5RBJNRAkd-z>EL;OCTf!`B&8FT`KrFYuS*ukn}o zEAcn@EBv*1CjJ_KBmNeDgJ+8Wh-cz&KlD6a>R;HA`WJSj{)HW>e_==JU)YiQ7j~rn zg&nDXVMpp;*pd1dcBKA=9jSj|N9teLk@^>Qr2d5+sefTt>R;HA`WJSj{)HW>e_==J zU)YiQ7j~rng&nDXVMpp;*pd1dcBKA=9jSlePp1BbKbiW6lKL0^&6-JHCJkj;`Z)Cu z{dDRd>PY=V9jSk)BlQn;r2e6f)IZdb`iDAF|4>KjAL>Z`LmjDqs3Y|cb)^2Gj?_QY zk@|-^QvXm#>L2Pz{X-q8f2bq%4|Syep^nr))RFp!I#T~oN9rHyNc}?{sekClseise zrr*$yf3<&JV*f1r6K?|we>h*me(!z2$8Q6|xSrYF|KZi#Je;fjc$jzu9)^dDN8;gl zgm@Glfk%o*Gczcro!3crm=V zcuBlCUP8PSUIH&E9*392ONp1pOW|?iW$-w>w0K#(G+su$99{-5D_$Nii#T(;I#GBzw@TTHPcvHNYcyqiN zo+RD^Pr{pvx5S&{EyP>lE%27&t?`z4EAcjXE4;OMTf8;iM!X%~25&3g9&d}c6Yqex z!`q8@#M|Q?#5>^~@Q&i0@s4;W@h*5Lyt8;$yffZKJQ?qTcNI^;yW+{>-SA{QMZ7zn zf_D?|fp^2Zi}%F4<2}TC;XUx4;=S>ncrWojcrU!Scwf9X-bcJ2-Ush1-XHIa_Y)t0 z_rv>(55)W91H=d61Mq?3gYkj*An_siAbha+P<${xM0^-N1Rp9s93P4g6CZ&O!-tEH z#E0V}#7E&H@R8!9@sao_@iF))e6;vjd^A2rd>lRoA1gi{AB&F@pMa0U$BR$I$Kw;k zC*c$DiQ<#-iTEV(RD2RXS$qmU8BZ0Til^dJ#HZm?@Tua{@u~PU@fr9ue7g8dd^$cu zd=@?fpD8{YpNY>BpM%fBXN%9pXXA6k=izhkx#IKjx%fQs1^7ICzW73XKE6PF5xxLl zD83k9h%XXff-k}si!a3&<4eSs;Y;wP;@{y*@nz!6@n!gT;w$j)@a5tw@#Xjm@m2T= ze5Lqmd?mh0d=0(|UoHMUz8YU6z7}7De=q(6{yn}{d>y_P|3Q2`{sX>Fd;`7?UoXB9 zUypAP--K_#H;Qk@H{zSbx8R%b&Ei|}&G;7aZTJ>^tN3<&E51#92fhv8F1{1rj_(lP zh3~+3itomE;=9E6;JfhM;(PJk_#W|n_#S+(_5%FXA5&Wq5ar`KLO#B3X3_mV@5Vz)y;w#!up> z#LwWT@YCXF@zeMj@pJeY{H*wS{49P>JPkjGpBGQZ&*N$07w|MZUHl@Rj$aVJgkQif zieJVr;+Mp);Fs{r;#cv@_!aSM_!a!B_;vg$eog!aeht4aeiOfr-w?lr-@tE*-^Op^ zx5V$@xA5EIck$c!9q|nO4t`hs9)1_k5WkOS;P=EI;P>$R;t%or_yh4r_yhc*_+$Jb z{z&`@{s@08{uFKjAL>Z`LmjDqs3Y|cb)^2Gj?_QY zk@|-^QvXm#>L2Pz{X-q8f2bq%4|Syep^nr))Rp>&I#T~oN9rHyNc}?{seh;=^$&HV z{-KW4Kh%->hdNUKP)F(?>PY=VKbiW6elqpzVb#KD?TnM{so*9xfh zUJ@@QUK%fj$BCE08N94`dAuxMPP_tM4lgfW5igHd5RbMy)$r=#33zq9hImc92A&{Z z3s1mnir2<#;K&53El{AEZ!7vj5iT)hBv{RiYMVs@n+)9@n(3EcndrUZ!X>vZ;rPR zZ-uwOTZ*^FTjH(6+u*J6*5YmP)_5E7c6b}St$2I9E#6MN1KtjAFWwPvk9QF7gm=I@ zig(64;+@31;GOW!;$891co*?xybIn{JO%HHCyRH(lkpVs?sy8`O}q!*4eu`A6Yq}q z5buTez}PY|DkPrxUNPsS(Wlf+Z; zN%&;(DfnbOReUO*icb-rhEKt#iciO<;?u-u;M4Hw;xqB-_zdw`_zZle_-uS8K1+NK zJ`0~MJ{O;j&k>)8&%x)4&&TKD^TZe6^YHoN3-S5*0`W!o0(_zPVtgUKNPG#t2wyC| z6km)l5nqNc!Iz4EhcCsKi7&^O;opg`z`w(ni?76&<155h;VbZ!;;ZqM_$u)=_$qw0 z`1kl~e2w^8d=37+_z(E^_*(IG_*(o2@%8u*_&V_o_&R*O_(ps^zCnBwz5(ATz8T+$ zZxY{vZ^Ac=Z^bv`Tg12FTkx&o+wraVHt`+!HhjDIPJBDQLwpy$1K%mW8{diV65oUG z!gq`B#dqU-#P{KQ@V(;u@xAyy@dNlie82cXd_R6b{1AQsKPY|}KZqX^KY|~^4~rkg z593F~kKsq~qvFT$qxdoL6ZkRwxcEu@IDSI>6n+9fDSjG1iJuZbgP+1ri=V|$<7dRr z;b-u(;^*JRLuer-@&{)9`fhi+DPILHrVa0lz4I8NY~M62F39!Y_+o z#V_Mm#INC3@T=n2@vHbX@f-Lx{JQu}{5pO^{1$!#zbSqjzlq-xzk}bxZ;Ri>Z{v5w zGw?h3UGaPPT|7hlKAwT!6Mul;!|#hf#P8z|#2?`g@Q31$@rU>$@hA8r{IU2`{4xGS z{2BfPe=7bQe~Ld7e}O;4pNqf5pW`pYU*RwCm*TJSm-s93H~1_3wRk4}8h<1H7Jq|h zivNgb;%`6nJYMSWcclJ)N9yl)r2c+K>hE`?{(eX5?{}pBen;x>cclJ)N9yl)r2c+K z>hE`?{(eX5?{}pBepl-6cclJ)N9yl)r2c+K>hE`?{(eX5?{}pBen;x>cclJ)N9yl) zr2hU-rvCmL2Dv{lgrof0!fn4|AmcVUE;4%#r$sIa2>HN9rHu zNd3bcsehOw^$&BT{$Y;PKg^N(hdEOJFh}Yi_HpW;FOcav?BieUpO@G_%R+e@;Qw%b zhr_-10Uy5&h~RowgYXZp=H`)H9gatcN8u58qfL9c+gjdAl#Vh0ScqQ>FcqP2D zcvZYIUPZhbUInizULCKBR}-&+SHr7|C*alb8sata8hCEgQ6W#&uDBc1Mex`8}Ett67Pfe z!h4JN#e3s@#QWiW@V?^x@xFLJ@d0>0yubKBygxobd=NeWA1FQ;ABYbUAA%3U2a6BI z2jfG;hv7r;q2j~wq4+TI5%@5CxcEqXI6gvr6g~nUDLxt>iH{N=gO9>Ti;u-e<733f z;bZWz;^XnL_&D(i_&9vL_(Xg>K0$mEJ^`O7J{g~gPZCeXC*hODr{I(ERPm{JDn3Pg z8a@S|Dn1>bicb@tfltGyi_gTT<1@r(;WO}=;Fi}8i{BJm~oB7Cv(1Yaut9ljJ_ zCcYeBhJPo%0{;$QF1`|9j;|13g|EO@im%33;;Y2h;H&V};@{(|@ipRW@iqAO;y>Wu z<7>s&;cM|9#Mk3L;OoRU;Op@9;v4bx_y+M!_y&BV_-1?~zDaxwz6swfz7^k$ZxP>y zZ^5^UZ^yUd+r)R^+wkq;JMr!K4)I<14t%HhZhR-cOMDN$3*Rli7vGKV5#NXJ!S{;q z$M@p<#1G*6@crTk@%{J#@k96l{Gj+@{2+cv{0M#sKP-L}Ka3v{KZYN{kBT41kK)I~ zPvFP!L2Dv{lgrof0!fn4|AmcVUE;4%#r$sIa2>HN9rHuNd3cH zsehOw^$&BT{$Y;PKg^N(hdEOJFh}Yi=1Bd+9I1bpBlQn+r2b)!)IaQ#sejlfQ~z*M z|FGYzne=5+Os1ueQ~&T!r~cuN)IZ#j`iDDG|8Pg@AMQx~!yT!AxFhuscclK|j?_Qg zk@|-_QvYyA>L2b%{lgupf4C#{4|k;g;f~Zl+>!c+J5v8}N9rH$Nd3bdseia5^$&NX z{^5?)KirY}hdWaLa7XGN?nwQ^KTiGg1u~6?fBdWc^Ah`KnV+`-VIR)>a0Hi!ef%~c zlIvL|B0jvDn@4eV1Rg0KjYr~9;xTv>9xWb=N8>T#MerCrR=g-4ix&|uh8Mw$iWkR= z;>E;E;KlIb;wACocnR@RcnQ3ucpP35FC|_YFNMd6m%-!k(&A?n$1C6!#Vg?z@p$pdcsyQ7yb4|kuPj~_uZ&j_uZCB_tBP00 ztK!wfYv9%J>f#A_b-adnO}qx4AYKbkz-x-v#%toW#OvU-@Y>>a@!EJD@p^b2ysmhC zye?i(JQ1&l*B5Vq*T)mZ8{&z01Mx<91H7SlW4s~WNW2N&2yZOj6mN_-5pRY!!JCRF z;Z5;o;?419c#?PvJPB_u-V$$)w-9fIx4>J9x5iuIt;E~lt?<_3ZSmH48}W8{8@#P} zd%P{)PP_x&4sS2s5pR!o5buO{z&na}#yjGj#Jk{~@Xq30@y>V`@npOU-c>vW?}{gj zcf*tM6!GqO3f@h;2i^_uF5VOGj`tAnh4;XFiucBQ;=RQC;JxtP;(hVncpve8cptp4 zcz?Vv-cNi0-Vg6DJ`nGZ4-g-O55NbC55@=LgT#m6gYd!PL-E1*5b9k7vS^o`Qi)l z`S=3yMfd`Iq4;8aA-+g_3BCwlEWQ+9j4u&ihA+XFihqYM#g~aM$Cu&XiLb!F!0@iq7=e6{%Z_-cHO_*#4o{=N7Q`1kl)@pbrG{0H&%_z(Cx z@eTMoe7*Qad_BHFd=tI_-zdHr--vG#--2(#H;Zq@H{)Bxx8Ymxt>WA9t@t+a9r!kU zyZBCgJHA7F7rq1EDZU%uiSH8MgYUw3i|@sE<9o#S;d}7C;`{Nv_&)Ii_&$8U_(6O> zen9*XegHoxei%Q99}+);AHoldAH@&jN5qfeNARQK$MK{1G4T`lG5omrN&Gl|Li`kd z0zWB!8b67j5RBJNRAkd-z>EL;OCTf!`B&8FT`KrFYuS* zukn}oEAcn@EBv*1CjJ_KBmNeDgJ+8Wh-cz&KlD6a>L2b%{lgupf4C#{4|k;g;f~Zl z+>!c+J5v8}N9rH$Nd3bdseia5^$&NX{^5?)KirY}hdWaLa98Rd?nwQ^9jSk~BlQn= zr2gTK)IZ#j`iDDG|8Pg@AMQx~!yT!AxFhus|77YP{>juog493!H)|$+nY5B=>EqNt z;?t>rgd_EjaHRebj?_QGk@`nCQvV1?>L1}q{UaQye}p6Tk8q^^5suV9!jbw%I8y%z zN9rHpNc|%msegnc^^b6*{t=GUKf;mvM>tad2uJE4;Yj@>9I1bVBlVAPr2Y|()IY+J z`bRiY{|HCwAMtVOpD&QuhE?Vp#}Kg+^+8xa2CdH_dy?*l%58xY0ytR9gcUd_#; zxjGV$5|6>7@M!T^JQ|M?FM`M5vEoJXSiFdMF}w&~RJ=G|6fY)T0xyOa7cYqy$4iKp z!b{*K#pCdjcq#GHcqu$iybKC|(J#h{uap#^doy;#KfUcxCabcxAkbcs0BVURAt0UKOtVd5k3Vfb+Ik@#?Yg!m|Y z1U^!HG(Hj^B|Zipg^v~=i;u>~h>yd^;A6$d<74r0;uG+3_;~S&_;`GR_#}J+K2dx! zJ`tZJo{CSxCyP(PC*!H&Q}I-Miug2q3O-eQIzAPjCO!k7hEErtiBHF8h|j`j;4{T% z<1_JD;&bp>_-ygH_-uTR_&j_LK39A`J{O-Sz5t(x&lg{a&&L;tFTxk#3&j`X3-Lwb zOYlYbV)3Q;Vtk4CGJFZXRQx-9DZWg6Ilc`4PJ9La9ll(ACB7VAA-)PKaL;8kBOhakKxC~PvXb%6XK`v6ZlE-)A&jJl=vC^6nYkDtZQiKpS`@blv7_<1}{`~sear;A_2)A0-9m+%YtMe)n{Mf{TZ z75ox@S^O$~8NVWa4Znh46~B&O#jlCqz^~!g#c$%*@f+f|@EiC|@!R-K{Fe9~{1$#& z{4RbQzayT3-@)&S-^1_X8RGZx4E&z>1NDj@h9TX@F)0F@#pwc{F(R*{2BgS{3ZSze z8}YaJ8$46|M?4dM`=RIYQvV1?>L1}q{UaQye}p6Tk8q^^5suV9!jbw%I8y%zN9rHp zNc|%msegnc^^b6*{t=GUKf;mvN4Qe|2uJE4;Yj@>9I1bVBlVAPr2Y|()IY+J`bRiY z{|HCwAK^&-BOIxJ#3xh#h)<^ek)-|+zgaWs%cPP_OCP8Hk)KZeBOR%Kq$Bl@bfo@~ zj?_QWk@`nEQvXOt>L2My{UaTzf21Szk94H|k&e_q(vkW{I#T~gN9rHxNc|%nsehy+ z^^bI<{*jKGuZWk&D~QMA74VAUmGFvqym)0i9iy`#jE30@oM5V@M?H<@dUg&UPHVlUIR}MuZ1VzHN|V=HSt>F zb?{nvZSlHzZM=?nJ-iNHSG+!67q2Ith}XmGi#NdQ@?}m35?}>NEdx-bKd*D6Ad*eOv zUgCZ5UU+ZuzIboEk9a@458hY2Ki(JbCq4l0hxZpBi1)__h!4UC-~+`6;{)+Q;zRI3 z_+as&_+Wg9_%M73K2&@-J`^7&J^~+x4;LSa564G{kHSabBgIGKBk@t^S zPsOK*Ps69+Q^lv_Q}JoyGw^Bnbn%(^bbN;REPMt&Q+zf)6Q3nM2cLz{7N3jH#^;F7 z!{^|0#pmO5@p0O7YeBN_>_08hjPLTKs!_HNHlCExrc- zUi=6Adwi|g)9d?&sg-yyyW-+}KG-;M9YcZu)8cj3Fm_u{+pJ>vWD zJ@{Vn{rFydpZEcMAHHAwAif_zAbtoxfFBe;j32}gi66la;fKYK;)n4g;>YkK_)+oW z_)+|r_zCkRFNt5lFX5NPui}^SE8^GiEBICM z>-bgtn)nU;8h%~;CVm~iA$|+Lf!`Frjo-v?iQmC*;kU)_;L2-=HIu$f`pC5Oaq1uS>C`{Uk@`nDQvWDN>L2Au{i7VIf0QHjk8-5`QI6C< z%8~j9N9rHtNd2Q6sehCs^^bC-{!xz9KgyB%M>$geC`alaqa3M!lq2bhU-~vqCdQvo5yl>G#(>f1dqXE#f##xcoFepcoDp)cyYWa zUQE0MUJNfTUJ@^kmk=+7m%vMk$KfUMQsSlYQh1zr89WXzEnXHcjh7KGhnK<2ikHXB z;^o9E;N|f0;uZ1ocm?rzyaHZPyb@j!j~B0u$K#d6tKgOJ%Hmb=%6Jv=YIqgAs(5w0 zDqc;z23`%XE}no_$7_h!#B1OQ;x$RM z>*Dpq6Y+X@eeni(eLPXTA)bgg5O0Jxz#ED;#v9^|#GBxa@W$dz@y2))@n(1vys3B+ z-V|>p-W+d+CyBSflkn!^E%D}f3-MNX3%sRxYrG}iO1ur;3U4jm7H^HW5pRdL!P|^a@b=;z@%DHJ@lJRLyrXz$yd&O8ybIn5?=0RG?~Hd5PsY38UBy%Iu6VL| zH#`|n5$}$t;N8S~;N9@<;yv;1cn|Sjcn`d%cyGKX-b=g>-V5(7-WTtU_Yv=h_rd#$ z_s9F<{lo|0{qX+c1M&X&0P#Wi0DPeMV0<7xNPGxB2p=py6d#Na5g&#R!H0?u$A{v> z#7E%6@ZsVk@!|Lg@lp5)e5Ckjd?Y?fd<;GcA1yu>AB~R@ABT^@$BK`~$KvC}C*b4o z@!}Kl@%RMsN%#bOqWENdB0fnx6`zDp7N3Go##6EhHe3|%id>Q_o_zL_xe7X2a zd^x^Cd=hKD!v`xifA@L*lA^foTQT#A|MEn?j1V1W%96yR56F-3;!;g!f#E;`A#82TT z@RQ=F@ss!|@iX`-{IvL4{4{<>{2YD;KP!G7KZ~CePs7jQ=f%_U^LU#01w0K;7r%(7 z;}^s);TQ0W;+OG@_$Bcx_$BH;&1Ucc&7M|cqab#L(k)-{!xz9KgyB%M>$geC`alaqa3M!lq2L2Au{i7VIf0QHjk8-5`QI6C<%8~jN9rH#Nd2Q7seiO1^^bO>{?U%qKiZM{M>|sgXh-TF?MVHj9jSk`BlVAV zr2f&4)IZvh`bRrb|7b_*AMHr}qaCS#v?KM8cBKB%j?_Qek@`nFQvYa2>L2Y${i7YJ zf3zd@k9MT~(T>zV+L8K4J5vAXk5m7Afh-fzAOC9qyu|)l7RlRys1Mf_IL3P)@bTM# zSgvOkiuv$rZeE0|WAIqfL9c+ zgjdAl#Vh0ScqQ>FcqP2DcvZYIUPZhbUInizULCKBR}-&+SHr7|C*alb8sata8hCEgQ6W#&u zDBc1Mex`8}Ett67Pfe!h4JN#e3s@#QWiW@V?^x@xFLJ@d0>0yubKBygxobd=NeW zA1FQ;ABYbUAA%3U2a6BI2jfG;hv7r;q2j~wq4+TI5%@5CxcEqXI6gvr6g~nUDLxt> ziH{N=gO9>Ti;u-e<733f;bZWz;^XnL_&D(i_&9vL_(Xg>K0$mEJ^`O7J{g~gPZCeX zC*hODr{I(ERPm{JDn3Pg8a@S|Dn1>bicb@tfltGyi_gTT<1@r(;WO}=;Fi}8i{BJm~oB7Cv< zQhYJKM0^>(1Yaut9ljJ_CcYeBhJPo%0{;$QF1`|9j;|13g|EO@im%33;;Y2h;H&V} z;@{(|@ipRW@iqAO;y>Wu<7>s&;cM|9#Mk3L;OoRU;Op@9;v4bx_y+M!_y&BV_-1?~ zzDaxwz6swfz7^k$ZxP>yZ^5^UZ^yUd+r)R^+wkq;JMr!K4)I<14t%HhZhR-cOMDN$ z3*Rli7vGKV5#NXJ!S{;q$M@p<#1G*6@crTk@%{J#@k96l{Gj+@{2+cv{0M#sKP-L} zKa3v{KZYN{kBT41kK)I~PvFP!L2Y${i7YJf3zd@k9MT~(T>zV z+L8K4J5v8>N9rH#Nd2Q-seiO1^^bO>{?U%qKiZM{M>|sgXh-TF?MVHj9jSk`BlVAV zr2f&4)Ia)@sekk*Q~wxJ|LEVWne=7SM5d*WQ~#Jxr~WaH)IY|N`o}m@{}@N=ALB^< zV;re}j3f1raisn+j?_QKk^09tQvVo7>L2rQ>YwMQru-&k^(&nDYv zmNeUfEYQ5aJ{w~B?=>uA|7soW->j?shrP9D7S9igPq$i@Yh>N+X8p2$`6xd_ z>e*@jlx?oEJlJlVLMOPh!J63&8)Q3E(=4}b+~NBv`JyEhu)=mVFr}tl+_=O-UR<&} z?>?Adn-hH2)OM%)t!CI1E0J2*H!ayV##+u=nZ09X)&FZyt{j#-r-l3)G?onn1(+wV)j+g)miobpP=v@mS!QjEMfDN zp#4GLSjg8oEiLA%1$>dq0(rcyp+P*W_uqaE`h9&%;92=aJ&P>0zvXIZc}G=W+4k#S zgK`8~!cV^j`RZHH=N8CDDJYP?5f;=nlyAtL%No&`0p34e9+byt4J>b<{W0s$X1S7^?6s^6%Nfwe?pi;eWmr&-pRP`~zyf9g zKQcUg6)yzw$bsJTT@IQUXmR$PP4Ln0zOk`BD($X~r_XWQi9UO3Z>QKMd%4lh*uPJ) zWct#$DHa=Gf3ZsRxyxi;mL5jWtxXzj9lVdUvokeqn5Bf#d7EvtA@&!72WuT>YiyCV z^l^_DAwK)>d_y&#Od8nY_6@&@L3zn`XZRq|VV zXlv8$lr6SKK5qEptxeo!1+B5q%Gi^QwAt(cx?$P3_V~mU>SU)i*l4}p{%l**sg;Kt z<7`uyWm-yr{ipr8ru}IDEzEvrysSyJvjMR-mGif4WD{fUYucp~VYb66TSFh?ZOU8w zy(JOH*>N&d`;P!xsTglJ5~=(>-m@*XHE((1zj~E0cB5UenNuj$#1zUCP{>F1oPQf@ zq25zBwI*-PpD@LWu1c}E;3+$7K?)CXzoz|9`%@U7{HdmSKZ{DW#9Q;XcEj=nq}pG- ze|i1-6kBUYQ)rbUH5opOtsaf_pG-V;!))hU`q2NdIyFN!`uypPu%a97&(_;&`>dq> z^p^WhNaqv(vN6@JOrbJz2hb`7xif7PVjI(~Y5c}C8mk1Dw~ zg&wv&osM#2BMn-}>ig(Dt=?LXK>KS=X1WVuw!*H5**dEnkZez^rqBLwTm6>mnv`DX z7ixEamAJX{T{k_upp!THKmXRg2(%!6GX%qEao^llo2!ReUmI?IYiTJq+QwSX6W+vQ zLBGpkb(k!3mzc}2Dcr5y3r1vILFV3wf)@Ox<*}~|6rw+c z74R{ofAgFhMHb{vC3y&Lq`LeCna~P%Tl~Vlo@k$S zvqJOin>cRqtyO!@qvktgf3)bz_9x5Vtx&r|7MfbXa+&{yg;}!#JO_U;-TM`qbt}`@ z1q%ez3vzoK?ytB*j8!ej)XyD?Sgy)e)cgg~m=pitJx}q&l>Co#Y3RsqR?1?#QPUH1 z7GV6BwxH(>jRJ?PtmT<&<;HZg^46}hRj^Xrv!b;rXz}d|TBYEER{4ch;lEbR{^Dx( zNAJn1zpxtCp`ayLg@RVo8hX!I%c{(!v0}V0u4BP-t?moDQ$B9T++NTUyITXWLc=ea zL$hnEad&G{#pnOUa)(jphvVjTOtxHA;=Z(?FSBd}=?{rC*Pm^K<$XqJM!ld{)R>dX_$bczcDGK}sIui48baG8Q57ec3O=t)52{(v za(1`oUQHx=wb|RsR;GK^E8xqt{LkrRWezd8+H|wr{z4&{Ja~5P_o`ymEvi~US|hvk zEv;cUiW^jkuO4JnQO9?s?q_x8ntj7_=B5f8SGMli#s77l{k22z%j1h`{QK9re;=GZ z*-sDJ9u%2_8Jneei1p+)EvUOzw3MG_iKBhW`)shcu36ATQgj>1Kj=g6A7wqC@|=UN zJ+)y^ZNv%dF?;bCN;Yta4aiEgUWu&f#g`-uWsvZp*hK5@>kz!ydjA}3eSLl#F(lZ! zC8wnp2`;qC2G$xI5}Q`qhRmiy`}ZAFh{x!iG^T$rb8z3pLe^tL-!V^j77UB`Gq^^M znUb8>eD9XIe+{Z*d2`bIpZP5Hm$%+FB9o!9VWZE6{PJU<<;bF7t3F+>44$^TRj3_7 z;id<9|93TLA~(oOzxj$9?POIfAS*pHjWs9Ecfr0PvJT+psa7a~0sf~Paq0Gl1j}FB zCfYz>aGwMV^}1NMbo=84tCJo$#adg+73)63+FNp6>yl;x@w8m3eeL7pb<)j$AvJwW zK(ddqTB&A8E$f=_J9b-Byv1TlRcx&wn#ap>F@5xGEunHHgOHHek5XNxs%$s4KMf;2mSKh2xtNi}k1JdnVzU24U zE_femz;s~Wrdn&C74osZwM{c0SA1bD(@*^JV|M)>3#!3lI+B*{ONSUnFKUrVPqCiY zt@aN3({LM+?(^=o_D9PZ==H`#8&oLKTE+dXA0}E*{y@6>NP5xO;A;tQy~*SEjB$Dt zx9v|wwoHoWp21c+-h%S_ti|H7sY!`8Fx-L)FfWWrOvqz{f~{rZsSGO}XFyK>UrPT+xir;po%P6 zEg3l}zA^9qaRMc)$8wT=L5QDyZ<8g#41yALjln-#i=VUWpa&l<>hoH9pg+M<;*yu_fo?7XALAkB1FW!3iY>@97 zr5$jM`nCo;c~UBG_!w#{%LW#*GJMyNoPB7ZULn2^OKE3)Gfw!d(KBw`Kf}s~1m&=L z@gd2D;;d${^$4*Rg=mIC6elQm9K)Rria+jW>&csT?{SA;3$eb7PcY&3xo&O8Y`8|X ztf6X$QOCh_j+6v?0KJ+$b3GeeDCwWuTOv>VjRoZkqy~mGAF|44<*BL?xfqtstTkJH zp1UsFo-}I}Z%OGtZ(`L5iwg=!3N92|$Z91~8I3yd0iKg`4m%jxWtT6(%FsQ$ zjZPwcdcZ$>-77KJh9uYgx1i6dOgc(%!j4tJR>^Nc#i{aOUPjVcD9JE?Z2Ywy)SC_7 zU_A;29EuyfO>V$dEC~ zVcFl)su0t5LL7BdE|%R4hqbW>LmF6*KGcoZjtMl>uR(#itQ`NDn5#p>ua`snMq?6|Mnl_+Mc0Z#%vz{^u6b!V*RYH<%&|4ac4Oxcur;p{!lenvp zCHX_*#-xm8Uhvw)d-NVmq#s;qLEkW4#aS=|BnJFbWz|T)Y_?ceH z)}#zM*$D=f_Rc$AzX`FLbR6cr>>52`6&UACUa{WXwSoC&adx$ZSeX#>j&#{$JN65D zZhmi64yJZCgsk!#i(t@~xvfu#-uxU}?K3;N1uZDZ3yzRB>$W60BYb3r?* ztc2BW=R1+WP`YL*nG|VkhP6z-Mk{T|6BO8oLJiyDr&pA)ZV6-3_&`JstL?4ATp3Rt z49SWg@Na>nGX0r9$?9R?Pm- zc&dut<+rgrd<-t0^y!d2eN{=fg{rl3lE z8`ap0I}hWlQkb`x{=BDoKmV2SJzZ=)`#k4toV~V%SnnmVG}7Bj96h`bch4R@tx~Dy zmhHS1^WD@K>vf34kk}zDyjHMU*_~<-E8u4g=#thT)_Mi6VsT-%%s3Ik*Tq_Y7I!LX zJV(?D-rwB`I%!{Qn)_&b@0h<*{Q^!UR%x7J!%r6Ia{PLD;q@d;H6hG8b<6^@G z-pR#*D@Su*$S*%xP=FV=45rEgvi?kQK6}dPCog+*ALnOISI@3-29N5qqn-VD%Dx`T z#^k4s{eHT%(t7;zFqGTY+;3m?=ExH0vOoj^hRB8#pS z;dO=Lya%BgfBn@8&9UvwA?sNTjq z9)IJ-UImw0-qLKmvVy&H@c(?vA82Izc+ox^&&R4Xu#mD}vPa439lSoX4H)~3JlSRZ zOVDSz*|Sj#AwDnm@(yl)^_Iy1N;})O+UHLhbL>#s5WU1?QE3G!Od#j=xLE&ihHdG( zX;wBD0aEV3e|cc}c0`q@zJCp>#t*D%)#ah`{_JD-!VduUBGe$ za#-(XApxg1J=$z+14sJp*8@8&@LR7gEr|aw$o~ffW>S5z-jOu!@VE3WevuM=%hIT> z1oqa<-JiX$*r?oGS%iO>Ma6#eXTBr|FMzKFzk-+S)Woo`f+35vd@6O~Hm6zQxrw$8z zZo^VH>>##Ukhsw%<{HZM-kJlSmmmGXE+=wCTV>Dl`MfjzB=#DIyguL20_YN?5|BIKC<}&6Z`b_{M>z5z7f~F-@r1-J^xA%Usz*UxSw&hq) z7Wo%1r~D(|LDc+ia1_Yl-IBJNn>{#Eti&&7UwT6$f9~vI;pM{ZEO)L4?`M$_9}flU z+4tNo(wmF!u*Xzu!8vI|nW&pFhy!a!RZA-iMFIU*Kf;D~&V2{_{68NsIUM2tQjvuMRpNR6pp8zpyzhY`K10 zIXS4D74Ivj7?ndM|E6;0<-Ym8YQFt+)x0>JeIEA_(H7;v%cQ=AFFd{40)IIY^nR3k zWsaw(#AN5FMd)!YjCN%2{+Sl|3ksZI^R1gV#pUq2MPS0aSv24hg(ikQO12+Fwh}_I ze`kMv_TdEjw_-DWGR$)`e-a-DK7BvRDL;Rh;J4+^N%?obFMn~$Pw)D${K+5mjX!-{ z0Xg4IlQ+DDi`;@Y5hZh50(HQ@?7_vo0g{CiRrSjNut6hR4Z{94% z$LD(|wjO1<{;`7O&dN>6dr|UAe=B*t^OkQUGvlwZ{APc~#owm5&ln$n_}hZPZe+kN!+x%4i2csbu1)lZ3!113L4TUYo-$%p$zRB6c(BLdVKCiUtxvu82 zGDKzXmQ32Yf<^FSgxB~{B)ga0%YVmk4A4gZJbQ}2Yc0KA?lpP&zZIM&A7x)0|4nlT zWv`eQ%q#o{4IY%eOxB>#wDTXWz;D|*H^n~nzStE%QEXnk{Jq#iKW=Dm3aV(I`<`Z8 zvt9OY&-kt-i3cs`YIfSME_8btZhDZ%a4bb4b6SQ zn!npmOr;|P6Aec+@Y2GfC)`4lrF>m!&N%3H)pXM&uMY| zjcNLtefzG1b4aDud6)Q{pemA*70)i&95QUn!H;of?}Iv6Y~8fnbjP580zaiw*64dT73P3vI{u+sI#N!FzU}iK4&`n*X`wnq$F3>14@v$;T34Rn}SVBs=x1 zrR-rVL@z18Ziq*)97DW!3Sr(`pjp`qZ5NvD_AmmQ{0DqY=z(vU^I2UFZrl-KA&i`R4u<`d)N#Aq% zHa4<+QCsY@ZM^HqeslJ1_UdV0GlhH}m`nwZqS@L7hBJThd!D?Ng3rC{IKjD@fJ;OF z@_zF0ZXQhKerx%kdK>dX)NduPet+-nF?0QBdA;h5vv2BJhby)=A-i^qY_QnH7L#hx zL;589+F59V-Hqq{oEPCHWLI`@_Le=9&hc)`?k%?SSu;Q1VMN9U08y&`&QK@M3T1=Jq;BcXp{8o3dBQHInvYhRUC1dA_Bt zn2dkqRSA2J-~CK=l1;LoS~mRM4xX*#`^seFp5OjNsP;73M z_;($==KRM3G@Ny^a$WXL6?5^W`Iw-VS-|^Ud*UZ{?eDfK^;jqZcd%5xOq`Q6lr7*R z>)oi>C5w4KLnT?IT$VYS{RTTQ3TJ^4KYeLAw$HT7oOR3kycYubnc)85?aL!9>Q78& zf$==rKlXK$ll_^uOts1VzIxc?6b|f=g9YfX-s$5HtV6s5zDTcO!<@a3qwwtG#&>*Q zIq&x*`FL;RZSI&SjnL!oN17yR=J@+bD(ug^?BON<2Q?FC{<=Pk%EfHqtye$&yfnR&dk4LDeS}e$>)mPO-8^59fF##foJYKO9(f4KKF?`?;s{cxMo{*t?jKt*{_M+d zr{&KnF^$6DO0qBp*JqS>72DL`%*y|zO$euMZ*2LqR`#+R`r9()r%eBp-HJ&T^}bB0 zTBiTXHX|}8c{fwDk1>5O;1S!aE7|Kzc1y9x;756LGNResvkA)HV*I8&zg=he%b%<> z8|*(>XAan3{@3eFUYb9gd63;^*1P`6^g}6a_H)v-Yn%hVe*5l4Tz*KvHA< zsrLDBGM|vzjNd|EPGdaeDG=}zCqI5JbqA-kKz=0MR%P0T3|q6o79Frj8|=VhYr7=a z4kg>+Bs-E|N8{|6-;Rga37?(x*(sl$_Su;bJL|J^K0BZN6Ef)`cEOj+7-^U2l^j7? za67F z1j}`TF8?n~N;|?CeEAtDyg=ngT737??^)oFQyvWc_NNeA+|Dk)^;vUzRhGB4{j33r zPHAsi4a(x)mhbOJ!C)SV$&DYPws4jxUSrdkH@qR{o#Z(bdPhNeS}KtV^G7g0!0~hD zFFCT0f%!=+D9GgO31oOnCJ-j&ESfME^J^(@$Hxy5eK4H9@aF8l+B~nn@S-O_9WQ&2 z^Ly=i|HaW1lRcUS|MR8IOMXhRK(Fh0Q)EtRh+#Cw3VFkbgy{dTVN}?D|My{(U6%i} zc~<T!%z559Hu=MI><4?=_vcvp^1Izh4sVOE2mSw`mbeFPUMIVrqPzv8 zARCt71z2v5T3#gM9r!y@F!~ppjC|P%%)0<_qO0a6**S02wDjII%;sachqC)=z-w5t zv1;}|g9*L*So5?T=J&<3e4O$IQuqIty*H1qvby&FPsZnjFq}XjVGe^3=76996%xka zL~tU`(Y9CAwgzplV4K?@DA+OB-WqRPZ&2FO+x9lrR%3_T1Q4+H_6C%GL+kh6lcYnm z(>adE0oM2Z+0S!MP8h7Wz2EO2zn`y{hLe-$+0WiV$S%yFMcL*b#Wl_dF znqA~B0@sgB#DUrkhez5U$NTIqIJ9F?4@7YCenW6&=XGG6rz&dtu?^0{xIFGcgMp}e z)`{X=jySUt7?#YVmf>QAjtnHqjgMP+uC+S*cJMUz&8;BI1yb=cik1*5Vlgt4k)l(& z#?`i}@zb^V92@gIii} zKl6zF!$T&J^+2!f!lRoLVl~~2w^u--IAav_DBcW6F#VW?mo{1PeK7Pg_dMD?ulS$7 zzIB3qBxIit`x+QTn#^m4h)PZa2NMXKD6*l5OwRJK-cZznxXLo-AT@4%+#+)eP#_;w zaL!#%|1dMdMmZ;$k?!Lk&9)IJ2ng>5}< z=iiMS1;*}X6=a2MX{}A!2@E?bL0|5&YnP&wBSzYj6AOCox^eHZuXLloZ$|dS(GEGGVuX~TEtwreKCYw2eV%e z)zyEr+#lQy2K%+JWO|dxP!xe3xA*@GQ60L;@DaBA&CT^3n7aR71M zL~C*?J5ZaazgrH>MpkePaA{JZGyXTwDq=2i9%zA$LD08L(700)v}Ki*#&0RJu`6uE ze(SBUBVkGU3rPCWu7>-p6`o^@UDliXxbRp|Pv~ZWqC)hYKT`}3J)z-PxCaj11>BO5IKeB7fsGcxs z2-r@H?qweN0Rp@mv@6fIaoUxk1v6o3uKV|p>^K*?oTZ(D@GkH`@`zvLfV8pk+4RIW zw>Pk&6)8KR%Kw<<{EtO`w2Yb(EsyMz>Ipu`Q28Jc1S(vYbvWFLlFNUbHRiAx`4;qP zI(`>eRx*!uifzb88GGzwk75YHx*N-F@FtAF4R&QUP8PM^^G0Rbh>#WR(%u78XeiXv zN`kzhY#%Llz=B9u@&;8keDjAkExE!hCy zr%5?+;}PCMCp`WT?BVOiJy5_vPY+G{JI%Su!=${maS(Qsn~ekMhcU3vyFg*MjX+Qc zzKa+v6G$*=CGWKSJ}Y?&G5LPZckJISZ#S0bU#sr3p&M{vC$bd_sJAoD-{L#DqI`e) zJZ5wR+ww#P8wS5a`+;IAEUPJW$nry*s}??oIiEP-IXfB=1BJ+G2va#-pxui(2d9Dj zbvOe#v=LzN1l)dv6Vfw%LJHB5AzQw^-{EXO`jv zmSPq*Xk1_hn+~zwUe?;&MeOQrudo3dFm2zopOs2<*FI!FEVkQ^+u9BRFP$C3MG2&- zkycp?;-z$79*unjrtMo-;XDqWYp;!kfpy^Ci+Rp7G13*8b}x&)glBzX>So!}ii`;Q-&4p}g~xdr2Fl$L{NE{lsWr)_`6)GZyF@5xnou1j;58HUa^CnGH&=gsn}Q zFj7^STEfY-`787K*5)Y$q_rsw^_%t?xiERwWx4m+kPSGgzb6E6KFrk*0R>USe%vmI z21?e5kFcEQyoe__41wQ{isfBp6Fanby=|Gpjz0R7Wi9>c$3gr;_N`*)43^V8PRym2 zlZV~g@BHU{WPDQEVbzJ2EQHx)v)k7VJl`^>IYHi0 zVHd9;##@uaa523OFBoE30peGGGO~r*DYk2+MIw~FwySD;ITT+!HxUG#(VMjT)4tLB z5bJe@GQQdLWT0KsX$2GIUMo1svM_sJ&rs}Dc;2Yz?DCEFU_|B+%JvYab-WoID6CLh zdjI`Yy5~cI^J6)z>i5Y7_t;DSUYmjvia}mJseJ>8+s5~@QYQ-*`@uw?J&}RXAQ}x2 z-2vT4A(g&jPc4&8OHW`GA;t&YPO->_ppS*VHyG*LDQ@Uf#XC=4t6_hw)*gij*=;#3 z%*j7h?XW?c5X=`We#xREA-f}hNA$Is?0gbq|W`%KW>9Q%Eoi59W=9#58`8N zMOYRo9^%SnN#*nZXcu!F_ln>X(AAO12V2n@wsWE}Hnl}4+9EcHVvw;g6bl$M+9B-R z3R}3m%?7o_sLZh}rn^{dng`h%6#diP?OCEDANQ)5R8~7vRuYR6O2~B{?4;Oy6sO|z zR@4H<{4bW*h&Nwn6C*?dSuCHq_T%Vu0*#fslzEus*8D!%kIWZ1X@SWcPF~}RF?f&zVcJY% zfdD{dCZc9tv-!8+1=6(0yXzZ@wF@lwZuGx7grSU7&Q&5qg+Ocvo(&)`>(HoS*-X+R zCP^+2E>|!=1v$6FiWVlI-ankVbA;Vb|=pg~e;#oSell z*E0c|nu2h~?c>rUe@a%OQNfh3KtThxueS*;_LWW>u)}gU)k0AD;$iJUcRgf}&{iF% zAA(!BF!74rN>AY-+42Hn)j25QU^eUarL5($kpx?HR?Idp`uCv2k1f1oz*3^CEc-=> z#li_sOA&rfOgZgK?8A8&uRoX#m+ay4RM~_+;ddbXsVss{#9M~)(#CT#lVEfNH~u`d zW_G2*Ohe!jwFb>gq zX!Z%_!{-E)pqR6hc7x4*$h$ThVm|bx8=M$MBL>ALIjR7-E+vLOSn*;Dr(nggCyU`^ z?nAlwAI^OLrdP_3%aHxuLzdGM+5*4tT$q1>7hS;mAjo**n?o7xpi{&cqP@I=t8kul z{4CJlG(kq%$F!aa*GPW}-y6wi2*~E9`9Algj1#4o-nSUydAVSdX)r zol z8$mq=W^j5t3C*8{-KM=dYS-LoLt08~&NL#u#j_Z8xKYSx-{!*xVWaV=feP*Np9y}y z(cz(&lNb(v)M5$YDcYikl5GXC>P8W@#0XTf?aNGJACT}7XEi;p^!@3G5~=615OH=6 zIwNg-2U)hc551VL^ffCc;`ek_qy~76dTsZ6J?3*e+WZYO{g+Ao*p( zkaW1h7cHljp3HBsAyIpBqkXH|e%V~zY>$=L59?GbvC8e22CYYuCQrkHoe4VL|mfeXO`+fl#KJ&``zDm)zv>RUm>03dQ1&khS=rqISdnRyrfV&b-^VxTo4oCA@?kAv7JE^*q0wktPB?Xb~HxvV?~%P zmo0GsTFxdPG>0H@#tQI8GQ&?ofmCpQ0rxFNh5msjujEO8qDY$O+}L5?js{c-hjt(s z`Y;MzO=6e7B!#hd`);y&{~NGlywJ2u?7<%ZtM3ldc@$9Ess%I*xWR_~JKyIgAF_sr zy5vW8eCSRa`1pXktt(=0M(kedVUz(E(!quVbmW+w(0AB<`ZV+Alx8AgWpzZ6aDG4O zZ#WWfm`zAnn7Y*jNj$(wm2s0}haTY)cn}Xf$5IpSn~!?ge1~)7+A+rg7$UisBF$_} zbBPhT24o(>fnLj8R2B~bM&c%ow(E23nLw1k034(Az$f!KAf1MBPlR<0Pl?UKhsZx{ zv7+5<3D^Fhb_1;DGW(1JIxc;PndXG7A%=(!Y0h=Wl!vhs>7gLav*sW?m1qZWi$fe&a&!TE0&v!v7`$zFSJMXeA z7ZbRRPni@UNxgU%g=~C8qm~1b^ks7O#k)z?TyNp+#02Zv_c&R8JxEf+Lv~%U-F)0` z{6gS>(h(*&OuWD;!6BCCr;*S&{KQMiyJan;_>6SL??Y9YzDX^ObMc7Wl087F67FLY#&$3XqGL7TiGBf%a%Hdlo0hEHR=1< z=OSdJ7~tvOK#ZVDMBNU5@eDik0OK2S(=Oau6!%= zO0r?OWO_q9A`a&=IubFyBuNg8pc0(_GbE0a9OfB}hKO6P(b57u+yvu0$6yE>LU@*8>bN}|i_{;#t zLm2b5EgN<`mIK8m6U~WWQ81s4BPX9cH~(V;a=JDv7!ZE^j9zrjP0pxy!E`v)&#{xiyb^xVAGQ0z{Tv(e|k4uA;3{$ zyBi((7OAjB6K7`c+1#_)Gb>F%P?Zm%8Je-0Wjtsa#^&G1OC=g6%*e;OoraytmE?M# zC*!ZoJH}q>n$*@xnNmgnv04=GsTR9CSfhT!H7TrhIK1@LkI~%nU&%m=p{jj`fovk`e{enCu@& z$kYg!y98eczZwPy0ruIcSo1F3`TcUsFVObDvl=bdH|uFwuyba_MG6?#>HC3;wdW!O z?FVeKXWG>W0lGli+!G)UNXg(7X7uDxds(j4B5YLqnWO^HKbpsJM)$GQ`Fl1KbZ@J% zw;}0>^cMu(!!0788GMXtoIZa}Fm4~nFe@noKn5tUr^xPk#mTY*4=?BRBcB(H93{Qn zmL-=pzDfUO{jLUW-V|ZiIAR&0qg{DN9`nBKvp=Neb4KEI=8R=%1^u@VjqI3~ zjmt0yodg`d2jya<1q`XnDfAVbT24Y6P!Tu3#79o|o36ou(XT!$I+aV!y;&hI3 zi(07s6?o^A4LXl99|aIDKi>H|@^d(gNB%quSi>|<~NlvOt zs`_zN-;E&~pKY(Re6ZNLk9Z$)m6kN@2v7@0kxc`Og;*EP>|ZvpAk7_EVYd#jpHt`J z2xMiBKvsmS7e9f!lV+Mv8c=yKAPmW98~KDr*Ba62U2#53GnxuFoE8f z3>%hln8kP}_05FrykLQG{mQ8-uWx0MTrXA$y6RWI5zkLr$$hoVHDz8~Ejv)u(Wg*U zeEU#Ztrx(m?C^gvq{&QA&jAcC!2fjw7F0bAX_42EN1ir+kn?}oW=}9SMNT`r<-Gdf z@7Jbe2dX&@M!o=FogtR2bmH*0%oU8_-FxFT831u$*^_8oUR>aZs zN*p~;V?C|DW~UMJ+}O?w#>Vm+VTDO;9rxF0D+$5H49wp$@E_VKvk3l|pp}l0JJP^W?fGJU3_71doE@$HK7%({NPeU6`v!Y{ce9F^vgR5Y0kp2C^)g<-uuNvGO zpoNfa>V+ndsl%jDb%vRFBLD}QiGcx5T`1k8c5@or*|*&gIgE_U`VXByz`oo~2`Ld$lg3dD3moj`QX-b!4Y~KrI#A$R z>dgm#87=!YAYYa;BGVoMlgzXW;s1RSWN6N#^1ZTag+K~%n~$j*Z{J#qrw+~X7<{@+ zD%2O+u)_uaC=TG4s_eJyIhU7O?NV(&WYh8h%}3<{OX2O{?iMxSw~yQ1`Cjy#A`GRgGFn*Px%Q_vpkzYVfOv^(A?ZhnHu|vQ zwXkC&oc{-VJ;zbwp2t-MoEE?9f`=d>QWA6A#=P!VFb=10)9kkkfB*+4J_=)Gu97Jh zo`t1hgJ3a!4PgG+jl`i@5Ziev3;P9waFs>PRv?_SFwv53QNPdqlLBCV8*+X+$VN%& zGcUtU-em*63f_s(r-64m2cW0932`emCORqmKl!MDfw_+F`d~Qnd$Vm2+iIE~J9m8r zqW)Ls16_o#b0H}WS4hV7z9L^hJ*Zu@pR-8htz+Nb!CTKdg|`l5a-G({W%8yyu*K}J zW{G(Am9T>F>6ofg;gY<3Wj4ZAp5`R#mQNPkmP^8$TA2HVNahT}o#oI|=cMBsr2HT_ z3Iu)3M1FC{JRNGmfy4?itc|V@%shxgW$s+$Rl3qcg5mfmEi`?H^;9@qNYUkyiuKJ_jrZX!wstAb% zGA0B+iB6pvm@F`B{A;#T#`GUdO-86U9y&B=#}ogs)Q>HNDo+CZ)$tZhkkz!6QX`Ab z_TOjvkBZ9~Rf8K<<7sMIQlrXasqqL*PkNYH#lWbXWMmhUS-c3nbz!FOx|iGmGj8q* z{>0f~IZktnlIOW>I<@!S^h^8q?KXBdMwhze`(A{Q8napzhK>w!a2MGe<>25az?6Y6 zE-Zm`aM<#k2h1uBdtv)lIcbcnxZR1J#d*rZ^n)mjP*S5`jpP(o`$*?MWpF|inoVBR z=U5N&b8w14ZzHjz-T#a$=y^rh$m^-B73uXHzQ(i5@x}aESaSp#)D$v#mB0oBWW~Ok@RX`Rkj)t?(CQw_gVgk6Kk$c^MIIAhoKAj82ar6J( zv0NC8h1FTxmku~-w|bXj8K-lsFz&>E58TFS#Q@ffgcstR#k{aV{oftSMZs7wNVPWo zZ`Cr!atNEbDtpJ~JC|ru1pQH~e^@$J_&+?B^z(w;in*AvD1gOCPO}2W5|QsZxi2{X zB*(solC^Aq8D1Ig<49LAI~?AW5f8N<&Ukh&2Qo}e*tq8w+K^(*;fy@{>U6BnTO?_4 zpax9Hl;@K=A#4p0elull1Pc%onPoqTVMi#c`Rb)#f=B(A{R!iO5>_{V`0bz+gJ z6Tlh-z-dwvKyUA=oA#c%)aBe)JIe(JKX4a2 ztYzRn)IS;Zn1T;BfuXk~Lx-tWyaEg^$L^~jbil&AL+EfSpnqPr&1C)J!ie$&(2;2a zy)AemuZA4V4-Y3yLJdQ8mm$?+f>@cV6mvw|zVBk)Ep}rc$UkU6=E1iEzS5AykciXf>6fta8 zEyLr~w`IEu!G8nA{(~Q--tmzA?}+@je-<^zYz?Qs&>OHunX?(;HT{xPE0O_;zr0pyjm*huC|ZM*Vx{Glb_rZb8K)n)io|=6(l*~|b5Tj0I6=3q2G*{OU6g3ceo?}a$fZK1@#jz9$0aM^;TScJk_y$-?U zX>r2Y{08>y`MwT~_&0j@!SA`On zF_mq_%;Z8?N{g@?9Ms>%EM%^R{z!D9TG|R*y~56;*nv{)b`Ye2wg*{U8`Xh?1WW^L zNww{2=~qviK2MIW8tO*cW45>0*N9#THHL4Zk=Jb81t4lA0S8d0E3cfXGd;3EAaW@V zy4S9l*s55gg%CcjYUPZ{k3b*T^)b7zN=GHlAe^2^4+M>2eLml*0B=wOH>XVvrq9*t zX^C9U)(f0d!4iQ|D}4{|Jn!cl?g7nt%jFsiT$M7p#(ZanI#{jee2gMJ7wJ_5Gjy8} z^J3!rQ$%`KTISsUi6~Dcx&KkDpm8yJPShkb_TVMNc-{SJS%2Ag!7Fx~_cO5Fzs`WN zH?xC*lpbLO4hh3=xrPIx?Kr?5a>+V@UXs3J&$9*V>>39C7m*MQijF7a#TqglZo@ta zsh-Fn6|52eF1K?T=HC*m@gk95fMj|v_F#j)x0fM~(GcZ9kF-*G&_favzV_h<))gjq z<@AAtZPb4!tT9TzLaTo5&QjE;U!^|1_uYGPc~3XqTOT3t^Y`@NJsG^G2k-5T@A(Js z`AEJcd~Yqhw-(-83;!?I!g-mL>h}`e{t4vsn2;_~ryu}8zU0iQb_4_{>1b|@l7a<* zstp~kE3;_b&Pc@}Yg-BcRd3Ce4To;G%$a%=>mrog?*z1>K(H>dzN73=EjVV_YO8HjSzUyG3N5F?@}ISe zXG0~;WzSi3SFvh+scC5F;8eD1s~=ElBRZ_2BUaZ6Lb!8#MfI~47HziL+eMknt`3V@xY7n!(bN1k^EyH$9ah_6g*(d# z_d7ySPH63@w2JCd8&Fvdl60t|yrkk;%d3b@*ib@$8`{(ta@U!MS`Kfp+UFW}0XQ`x zIvTL(b%16zd#B~McG%2NNy|=~ak$;4KOCvBOY15kM=EztI8q7oVUYTfamX4D+u#yX z8TswV@VSadpsVou&IrQDsIyFxsU6KF^oe(PHd{$l*_-+f%PkE(%j@0-M@lRwawuZ8 zC5IyombKHy)iD}|X`?FYn46M<@)qV7UKDb#D|@)3Hq=@ysn6YBX?b;)y|bYs)LePU zDh?G}LmgM;J`$n?yRxLQx}&1b2^X@LO{}bIv&=|Eb<|4gk-FmmA!E?2i^$3rNJj|Rw7de;7&b%Y?T!fbDbi7Fg(yy=) z5$<~U&`ulrkpko$((#!M9W0tCYW#4)k)8A$!CK@TI+TCJYKL0MVRw67jPvdyC6UnK z4a1fdEIYJe7%~VKR5G)*NNi$6!h|%YlZjp|8UjS5k&~LRY<=~qBE1^ zn%}|1C%0w83tV6q|{-7RR3R8`OYAv;cm_a$dhd|X>oZNsvERcy!LvwzaY z+)~A>dF<^vuF&H#T_JAOVGC-A6NrEMWRI{kD0)2yL^PO}h#@f@s63Je6T@kCGicICSpwVQCx>>%u(h_G;(p|FYTN@W=)z-v&O5h#pRpjIN*-nyytH-?P zh=o}+rE=xb36c>bzqIiWQiCh z=|%o`!wd%bnzs@@lt17cjuA{(hp1DBFL40C@kDQE?O9A+Jo|a^onv*O&A^&Ba>Vr} zq`+o`e7HMi=w~ti6eWJS=ZG(;yCtRt{nUUd+upDdIiUrGNXn@}RI|pb3p7C`>yw&L zPF47(vPas^D&(cNZE1?&i-{Mu#>r_h01EbwC3uunfhm$MtV#+>6QRUVpDNsgq3Ev( zNiq4V&|gSj@OTY8r_~~+HeRoWax70O$yTr18WUTz^8ACx5r+P4{$JX^ z&+7rVrvCn_2LW?3#}OtQqppMld0+y*!rRhlB+9DdK#9(8ZLO&)BhQn83{XsE5G-*C zlHr;A*lZ_|v?+q=4ga5`+V|4LYv@-7WM|H_wKtiM*U7%UoS-~tEEO#_saN$(BfJCm zSW$^hEOQO*b3K?%^|U%E0P^M=5c;@VB08VdE3{QsnU-VrcKpRIW#G@SwIr}wen~C zQ^Nk3s8d_vhK=!?uk5ZY`+m)t!xn$I>T_SnA|W!IJ811?{jkJk$fv>O`FXoFoyQ)^ zWH9~R9!o%mhK&tHK$R$y;HL~#o7TR{ASB&NGBB^ADX*!2uj|L#q+4W#Df{A2JdZ>g z7rey(aX!cRKOtWEt6m<$*56?KTH;Dt+e{IfYjqVlNv>0Ocv{e*2F$p0KKG|-U25;^ zl7H*c({^Z7mg`PD=nk1nS_!pZ>L19S*1@Ej3|~SX$IjWZGTQUNs~F|q0!K$ z+i&Qus)&Dke*Re>e&8RoXpiG!>HFSbTz98Nb%K<|uy4R|WmwVE3=13KMB+X(yJoe9{sjE&uIxPr^1elLH;ey2h9^2k>*%xN}L71h{!_O7k$d7sqoReLdEFK|h( z{=^MP`xPzGKk{*({UJeR;s6Leh_*}Tz4o-!M#(%_{|56DI0%u=K(_9EY| z`lC06qcdqgN550O=6_8})BnBi$~Qe$4-L9MYE-U zB34?Wm!E0plW`xC=xEtdS6$AAt-H8~N{JF|=p?M?6ly7_aeN4819VdR9^2g)@UPI04Z0=Bc>+?0A$TuPy3kBg^ylf~A~gH~ua z*)J!A$w6n_zpGyJhEb-T6k$sCZ^-_hG*9Sljs!!45{%n~a9<*Z|HZz_5z0tLav4jf z(??iJ!2shsqjk4UY;3Uc>uamg{jw6|7-BdW{$M;1oirfdZSaK`V?@r7F`x;A5K{bi z7*IklynXir;%J*beLAM``HFama$HXMlm^6lJKMAGfAGa;Im^6fznq(=MzW=9{Jc+6 zb>IE}#nXihN!0)wS~7527AFgGVJt!J8g~ zQOtFtSl~vn(2e3eH;PKeu^f3HY_-Krwy4g|sW`8+0xCv{Yqqm)A6N)D~*Npep6}_(4 zziTQ*0@LD)cOGoZ-tpNljQ{Mo4_(=_S7%TjxHq|?|I5pFrjDA^iL=$JFE zmi3cX%lyu|v)2sKNg|va>dqI+diEf?oowe#y&~G(xXoV+bl@o)@bh)Yi_pv>iaW$U zVZ9`8h{|boH{6@L0kc2g=i|9twonR*i6;uK(dx?+hKK zhdBu@@!Vbbz*tcE6Uit1+MASmLRRt#nI}Er4R3_|(ruRg8tC<4gauvXIP7GHf-Z7+ zi~r4U^lEdy>`q?tBX7QYaF=@GhnDGU!q>0BJfdB`f6fq(d*`J3=^osz1|+#aJ>!Tu zP|s7`-snw$=$Mq2Tu7DB`Oe0QVII%m3V!nE)3V)yyDfnwXw(jwM~ly?Q)ygUhNF*F^qDAaqx+HbuUYV z)x-f&+6v{VU@SbKPHqb&ZbpoV^Xi>D8t}?+l;6PNM_v8xX~GMN?b1c&@O1!8-;5pH03n8@oacQZ%EF3;bHCb9nx`}@|N8SBrVHwxzPj=U*9f1uiiPGq0u zzYMO=L}sms40&x@e_`vg^DS%f-08__`(GXhh9qKL&;I1cwkE4+$zqS0ofA5bJ!a|} ze$1I^-g{sFe_194b08zSfa0E{D-O@x|7P3L>`rN<7Aw)X%4OZ>L!OA6Ty9w}Jpas* zugO*7l7z=QtbD#0ydd3S$eNw#lz8)O05c(owoavzLtkl4Nwik8s}<+0+++{mfSS%&N2@won_SYU+)*GIeZmKIE?D4<;m$cnPw+E; zaL^6Tq=T@#1nfiwt4FoncgYlyOw%XO=BNtXqkgsUWPLhAf0$CQk7#`q7=YiW>C<$5 znxRiK^<$QPovlxE^h1lx=IYZteL7R0=Ih4-{d$%@ovk0``gNf`u~xfy6A7Qr)sOS^ z>tcOclBnlrg?_Kp?@RS#nSNcaPb>6kr9Q3Fk1GATTA$9>rwjDyLjAZ%zh10QYxJX9 zzpmA%OSDcK))w$Rw(KH`qc7ln4Xd$&D+wK!StZ9Y5KW#-Tv?78nU4{fgNro-LvRLB zTnUJRjssRX$xzHHV2txD6%r7#E0EB1b!ocDSLsu7x||o!OOW*kJnyd5bVcR+y988J z)76!luBfJqlz{GFy1G)+74;8WX1by}Z^O-2SG}eys_E*|bVXCs)uri*rlyOx2Z^-Nb+YPzESiN;J< zRMXX!ny#p(t4q@rO-)yqri&K?=?Bx*rRj>MP1oktOjp0zs$#xYFkefVtR-w3=h(`H zYyvX+bFt_%3G%11)lI-+k0CDR@FV7{K=b9i%cmS*!dyMtJjbK7h1{W=#+Wy9zw^p)@HuNZ#-5~P^H7v0FBxWR1%uM;A5cR++Qp{+GjATDvcAaE z-xTw?--x~S8wrIx1+85Qv-J;~sL~*MIctEK=$2B{Z?+H5k*stmON_rXM zSQ~$^Jf%BowdZKi~=`QmFWg8r9wLrLDOh5R?OKdIPn8XQu_Fcl zOajPEASND8ZBL@6gFyhDw6?HZL&l4`P!$q~iMo!KZ)~_BTq?+n%Ux6h{;31U#_~U@ z&eo>g9acYq)RJDgeg7tC_(tEC*MoOe&H;*cQKklMSz_A~5AJ6gs-s*Hs(1F>{pzjR|=@`fvm4&((qlp0eD}`8Y$=*V%gBN5-Q9 znWpLNP-!jiPf63;eKr`)<=NntPRTT%((*zZQe%UvS^J3ZNgK8s1&Sf6$lV)lV9mcY zf)5L`i8)UfEL>U}N6~Cty^W8yKG;V8049B{Rh`~o$bR_z5SI|j&-R`KIryKE%RcY@9XUcoAEAmTGFfp-bQOx({|Rp)HWflWtmT^ z)66B9IyAS&i7BbImdX3Q*n|malB!#N3e`o&$sJ}X#&U){#KnBx>V4ar3QNX8g-iwf z6@n%$LmSwHF;3-DcrhgfQ`BDy$YHa_hUo0lZL8wmat@;4R#~8^AR=`ysxF|j0O>hL zzJ@(=#}NwfCauL^U*s>pPY@##YTD~!wjB5BL#TwD2mxTS6%s!;(vn*;o}a8FZ|3KP z{dA=QQZjPHtTpGJIqJy6S1moVi}J=U9?;FVJqf~2@^hr$VlI)U1WT`43?$%$*~UXM z_|7Z1n>_P>>CaKFkBz5e$COAsrnI31_Lf)ZCldM0iBZRs&207JF5`vujrqbL;BjJ1 zGKWz3i5 z#UmbAM}$Rw0a41(qWuX}*w52Ql-h~O%H{sg2=kWfr%9TD6jlbp%yLua4V5teGa-2* z&XhET!~I2R{>Hmpr*OK=rNa93s2<5mL*0hvGz14jt_E9-ez3Q>xS+>v9ee#ibTf;| zP2e%*jBz<>o(0PvpT0Wi?NDDNe5)a!+$xZaFf3 z$em~Ns)6vJkUp;R=I~;N%ZA%O*Wdd56CdSbcNSH!OS_1eX8OkA9;S!#Y_X;^fdO{v zHo3ID))_5rO(k5;PCJo*@KcV(r_DHh8BD5ts7R}<5 zc@wu)xbG!JO&!ou66850vY>?D2JI zOPUU)k_K+EVGt!hW=PyQL>tqVq@5+<&yqh$!QPUel9w3wl;cF&z(I{$K67JK|t5=T>0On zFx;Z#mwqmAoJnT^l<3EVM7+FPkwnkl5029J=tOFc0!Tvfn4+;ExEq|&;&lGNJr@_9 zD0@xDhlY4XynC1SfL|F)_o{6dKd=seP*Mn}1PAUO&)E|6iZ!&3IdKa$3d59Tz@+sa zJ^Zv~>}ZG{{pmH6k<5|M^wkUJZlF+uC|Qm*@IUogq;O1GHMfv#k832zaUR&Hr??X|lG_qbd3`z>yR2Ix1Lo79ce zT6+Qdn0yZ&D{I9+E<>p2q8Bs(G6Kc4FMGwV zdugNfX<=@J92mr?+~2x1h$PErRhL3z={A@B(SvM#0W0M!;&X+?OFP)_a{HoUH&IbH z$4W74BdMY_mQ}_B)w!5{~9tlfjB=2^2X*((?*H106VwCjaMPoNGWbQ_i(o(-` z>tQX3fJ4ih-Qx1y;gVwXLjfn(YMS@odV#wL?zC?$SP|&%_2aj#l>fz@L1uKbbBNvK zXyouv`-E_sWaZ1kmy$9-Iz9VwSP?=pz5*u@&se+_CrzG!zmMi&q(ZWee3as}IW6)x zz<$zk`j-@sFBZZT#=#?S{Joi*H*_;n2~<%6P3?RCLZSakqa)qxW( zuhWg+c{sX^ZPSrJp#do@hC!7d?NkGm7AeV#cbZof3KT+NF%&14#>s^}l>mgObrC21 zdA+$QzFEdCTK%v_7_|}8A{C<4MauzIKDeBd=brV7$ve}5T;+E&B=_LP_FipD8^VU0Z5+pnt7`-*D0ZoJmq%bK)T_|YadXivM8 zyj^@yycA1J*Dr7I6e+Z_@mZ{BHzh0)|GT7Xv){a%2>VeWU8uitY>Ac|yACtztN;rP z8^A&Ytn*T9*RTqTVr7fY0=?cX_01eRU0a&Yb%qF?DYyWPy~%VZRn!d-W(7= zHS{2u($F0R^7gA>Gm_%`v7%j~r|hGLr&Mtiz62qgN%A>2dVSgsioVP%5) z$vW`xIa2c_1*ONw-KAK$WCj!M)aws*Qg`^sIM1$f$=pfd_m1mB+yRKX%n6Ql^Ty)ut} zG@c-*CsrdE0sdimnbLOY!LnOs1L&aJ9KdqD90==)=bzx6Q6URo|F7E~IBROw7rh5A zeqd_$6#cU%*B+>caCE2Z$$qDjZrhPnvjVmfzY~5J(y3^I_k;@hRJ7R+Sege!mrmjG ziD;E*>%lfskxgRzpO=VLS5;7OLE0k*pdPDNCWMqo46t1V0-*1p@HoOT9Ade}bNGad zJd1y33Mz>?j~FMKPx6WRN0{tn0YWjk#lBaJB~jRe^57MBKfIy3j14|T?Q~ob^}4bw z@Vlv0*i>61otwjS?{|;nDskjaVwrJ4tILf}T3=IPR$3pykymSK%=h8H@n8>CGn7@$ zf-HIpq8;WCo}FMI$RY66)KTZzFl|CsRU|_oA?9B?XH%$gf6g4tKSYQml}GA+@*6#F z6nm9q!p0y|rEPev7J5 zyE}XKvi^SZxtqp6Fn8($E7m-4+x$S!CeL2O;sV}bw{g}k$<35*CDl8ffSaTTIs$HL zs3JKoa3sftB%{tH%dwbD3t2IeEcII4%iL&}^Yg&wv3wcR-?(B42LdLfbmZ1Z+8`t8 z94d!=PNQ(VmpO4Ng^LMuoXX8p66p$8kAv@g{U0{mTtURve})`8Q+;F8?1nvDUTU)= zA=DTpjwwGy;9ctaK9vQPqG9%Fhd(QL8k!XWoj$gcniZx?*$f)f9@{rB*j8d6oDRO1 zb%Ctw_8B{!aZ%<(Q7aoYHz=yqI-1D;llWahr&ie%K1&AlS-tQ6=Js2vXJ8*4{-6ty zhBkH@I6Hn~%p=ds0T0gYlCCkHp)U3b!q1+kKD!QLLBFsw$D5Ni^$E|`3@E}{2ODgU zx0dvg<6TOz(gqjkRX}Y?mRX&OPh(jbkwNJlfuQ=`v6Y(6c zMS661@>vw{U_Bkm3HsKLI+V*^A(%fW4s?@Buf>La7 zJ`L-*;=Vy2qdru=LYwOckdMT_ZPh#WBe!U(H}&U=lQ~dq1RHTy>_wgM`oiHK9Qpe7 z$BO3j`inFk>{1Ko#W+_w@nnlrns{{g7kIM=d;E)*aWMYaj;FtQKldey7V3>30p`eN z&~WDk1ad^r8SzdIYwO+p8i}Td+iue!AEhYfQ?H z%{>P&u)6t#pn`82+|v$hNBj-EGLcqt`$FkNtecfG->RAM`=g`8BRKT)c1bGTXjB0PXrOsWk06h zrw1=%@V?JiK@F0oY>&o-!DTRP^9pDE898u|qdKRJc#^w@=f=HhNz}qk`aS*xZw^|n z)Io!jlKSv#QP=|cbbI4--6Pae*8^)wzqqMTn4qYewtuS2{T`z0b94Nr6{rRJ<+`gI z)M0LL?djj(8UNvp`wNda>XjzpiOSTa-Jh$XHx)s5RwcXhb3qwF!2Dkdu+L!~+|RM3 zH?jgQ?69v`h7V=1w#Sn#E7s1^bn$euqvJ5ifd_xgyD&p`iH&xS^NMC2)C8c}PP;Jf zBZRf$%FV#(8)u{1aKO2@n<(!k;vd+?^B}R)k0klr!I`x>N!gMnx4S`4J=m$AE2r3jJ|=rfYy(88kj1yc#|fcG`$uAVp@zYN>x+m}9HD(UE>DhDKKJZfF7MoftyTaPc{677VR{>)ORMJM4 zT0yNcN`XWmkULM`XGBiq(y6^%J-Su*M;mB9_M=7y1MvK?#ve-R>+fajhVd6N@4g<4 zMrL@X%oDP7AWH)HJF3j;w!;%yZ$(FIT|e;c!|&y9RQwmS}@gR@*%Ov`HS_^LH2Td za%F=kW+&Ai?}Z>xR~nv>QyglwNl*5ou96q~LYf9#^HSo2CrTz~`?$msE8q|13zWt$x#gcpGD z1>b99!ZG3}*GEW}J85w{OO2BEZ+cYs zg#Eo>3tNM}`;$C4c8e}(vf4iI!(4zCI~&-1|FnEULbu8**Rdt}q$iK9(`_ zJNdRb_%V)cj;DtRaUu&7yh8ES6l>gGTcbCUYyMi#_FSs(b!POBiFgMnw-#r+2m_MU z_hf(o51GQ*(B9Ti@3O(}=8*Z%LeTzHl%rhla=Js8-(LTBnD)+7Mr#}F( z`$lTY?EUb&Z-!2No87(2598a&|p(oX6v)Xv@P^Dl{)}p?NATx#ha4-uN}2 z^9C+iQ-nVr7^=6#-pS_bGnj={JoRSO{9cyfXIO~78sCG0B-LXRwG?+Ckq_1~^7kiK zqRJX>rGFdjBXwxdT~%6$od-*Wb*`_`*+kdbH3_Z54!gG1t|yicB#tg1b1GXp4@Pvg z-B8UduzSdc0KY|^B-lEOQpB6x;{wSXG9fak=}>a--8utpx9!Q zQ|u4Y)Ay%OSUrPYh6PgL#hENCd5)7=z%<(@@U+E#!bIfof>ZAa1=jB4$X_z{4aWO0VOOK|m!khtt`%4eU&pm> z{6$D@4$B1%N9}~!R+ihc5?dMWw*X-ygQGaqb5*S^=Y$!|+PU?N+ixgXfTA(50=uY> z*4$OIoR;v&6+HR^Ojb1=xdJ7*3XNwG+Vz46n4-&>IoXJnT7r=j;hYudn_j`n3+Y~Z zTWjsI`cz}rF(;>AhFWwdti$-B_U`*OVzk{lyg68hefDZKeXcygxSp^Mt)6ulRLS_Y zL}ft~RN>ZPvX^VpWb*V?6f?{))LZ8*X7>%ojxsHhJqL!uxTUkra!c{V4gd-)T<=CBd zC<3dK#r${90{AwHm5&v_Dd7KeETXTphOFSfmC_bQjLbL#15^Tui+OBB5O z`%_mllee<3H+YjBZMz#IsE=RFfZnsCEI_yX+Ke;hv!H6K+`#IJu<5&miUwVhfk@Z) zV(@g3lXKEBy`w*jtsI%aIy+XglbKu_vQ*R*;{drRRUxM&43Zx(wz{8bYfTrn1kG*j zoHWt3zSNnIVyyd6=Icam4pDkwdgTZGSTKw80Eftz7p$I^H`3!(S*ywQBh9IaUYMxb z(8e^>U8zJ25mb|ngObkKUP>?7#=n={!u8b z@mswJt?4~=*j@lJE{_llpqKfWz6c$Ih=9EM`XiKIRlBnhdh!SW|0o0D{2XTBWA{vW zbkBpV6anaLa%l+-Dm_rx$!TlHoLqLQHeV?!KT=}!pR47d?(Xk4Zr?yQr+k7>${jDDTon`dExWmAdL_aP}J<~0cDgT&Xup=VzvfXncp??0 zp_CHzOC7SrUEZIbm#F7E*ym`UWd%W=Gx(4O#9QPdUV+jEG`F@K3WFX)M8Uxo{Fw)z zpkRS|>tGQX53$?ei_0cTIoP|E>zl;pGTtc|AtIFYCY#g%Z#}^uCC9Ej^lQD0gA$r3 z*rC>D+;2$x^xD;LFjMtOXCy%FQwpYda{%2Qg60<@s*%o`CA;IZ-jmi#>B%(pO8ELE zd(ze3@}PQ)TPehVvW&n4DEmiHT+aeh{fxS!dZ!4Y5|HgO2ti*~g69X?K9E%_L|hpz zbxE;j$^;-O6bx{~N5?c`O$e(IfwN#r62!kr1@rZ*K5;q)3oMb)CiRVU5P{jD))tHs zYjnMhRSt531nW$@;JEl99S2fd?fgYwy%J6h2+N%!oTOgYJB8Tl)JqG;w=rp%=@Zne z?HevdjYsP1*RVjnFlEXE2CbE&z3!9@F|Fw!J(H?EhpHhGS8Uf!n#^I0+KXoTe-|l| z@AyMdk0<%X>ACM1dR^u5|twJQAzxJMf|D#z!;yeonzpRsLK2+M+Y z!!(a~w(z^Ff)kaBZ6mnF1-Re!=4POKIXFyT!^;V=8Rp{e_ z@hG&B^t!gLaeyN)JJj|KAQXUz*(*pmdTds zsHKsKXlJWH5x+*JQk~Pb0*OnYd^;Dbbw`TmX~zx#qxDMA+{1t&mbooc2y%^g+l2GbE~|!z!Gjv-VF0v1ew*>gEhK=qBLX<-_>aH6OS}CVj4s2o18~F%gn8l`FH0F75 zEy?sX6V!G5xYbL5ZLQ5sabU(boC!g0+Q&!r#(-CYXQ@Yvd3jMV+RlSIO=yI}j)#Rx znBQ!%Y-}jtBl8PC78S}6>fsK0gd)jo^iqH&{Us-)NOBamn^PKZ;x-Ml&5dzAb0PAS zFiXZm;zR?&D+1B&q{Px@0Fj+(y$*Xj?sgC6MN{Gg;<>5Zq*aE0;S`N1R?plYVT9^CpPCeVCpRVXPNHGm#7ICyjaWlE@S{=Z+KU8 z^wOm?r78}Y6!kaepK`FT*u)w*PALfj(q*#WSFxm&uxEhqx|~uYUw2HVhQHPOeLs#H z6*4-$MJLzAdVWgn3^XT4b&Ce#)9Gu;f*9n=9A3HloM}CK>Q~#FIY%Brd^(>C z{EbGYdLlwWnWX2wrKreY#IJJOe%f51HTO1vr*E0JE%hhp9{<{VgKvE>m(wSt7V3Xg zx$3vTvtKx>Z26m#)Ehj}5_97uZu~M6du6?|2oHX0(}wj<)85Q}9=y}Rl~LDAW$m!E z?sP@op~!OV_MheS+dU4lAI+9>|CX9FsPYM_F!Wdon;QD=*<;xPK#zHoGEvAs>Nvwc z(|jypoZ$L~C~V?>b(`Ob*St{ZxUFEFAOH*wDxZ|OJDO6AG)vUD0W)q_ASFf3St2X? zrYs>Byru>juNU6p)6`hU8qG0pCe&B;t*4!}Ngv`8(M$aPl)XVWm!pERYX0Vd2u5g< z0#nW%{T%)KY{D-%4*)_R)f1>t9}}?Wb8}+K z@6BXhXCV4V8|!MyLO5+cM&O@-rjV4=&-@TDp%Uw!0~>B2JK==CO26KnLHRXL24PGH zV)Vn+WGC%%u4#kCwWo4!H+R*m2s=hKHb5lZ5FmLG|6a(y7x3@-{JWZetN54Jsq>Dh zK3@ST+@zRl!4>&JNs65i!p2lfF7B2qFYkexMBn=OZ~?4&t~^rzfQ}?5O>`lhd!_(G z?w|aazT$3ZDE^)w@A=UKAeKv<225Vu@1OJbK5^!A*G?aL!DBmlW`BK<$x4ePwLQqN zxi~f*DG=YuVFZw-=wX=yfaYls_b!}iBQ;o<@3@)ikrDAp$sV7wh zMFAHOL?rYwiJE*6@UD(?SUv)>bteGfCc8_xLR$-%+#SGrx7FG$!aso%1a%2V6@Ifc z2>9!hfoSDW^oJ9?gS=L>3LS-C6uxtGah zZt49}SZIPJ7|^*XEUZ5qZS`}Q_1XMCOSgWKz>Yu?h3yjxtTa*6&QU~ytNWm$&4nct z0ErSQh@$(+rj4~##NY7Vcxn<(ldSr1-u0ll9|HG7Qao%!CqlawAf+Y=F<)s{z&{fX z=&!dG>c3lY!n}PX-64WfI(Uq%I=ARJ-hvH(lHxH`btHyD9tCEW`Wi|^oTlL}JF<`* zDlC{IK%Jmb@|D>Qokuf5Q7s!f`zxv|z4CdE?@a&ml}9VwAy2#wA>aUFl<(Wrvl^cq z0r@l0KQYj^d^Gu}?6f3-6i!?B(>pg44iozkZ~GKZ%?`2`MeuCKT>h&kA8gooLshxr zv(z~`iTY$iE_NZJ5TYU!elEgu^PAH6v`(WiNxW=j0;O_B1LG0h)3n(SL21DaLmCm2 zZRk00^J?IiFq7rq>cFj9-+H@jb4o+ClyduFPdPAN>6@+7igcXKWrjV+y!C#6_E z;^#z7u6oS8{5!}0b13OAe9xO97xa{kB==UD8JU;y+_#?aPYY5@5wB>KciY*bFnhk* zZS{WR)%U0W5qJroFvX^R&@G@T8FcsAD-o7`25k}(=sP_#X_x}qvMr4r+-(ciLmWnE zNrXv|7l>cE3mJu-_$*l${o&07E|->o^R|#>xAOqfPH+qd2Qq5?0OkdQ`cLIiT%f_U zWXW5`$|#MxS3W2|HB)=F0{J=C{lvxOGr4kpmhf|*SR{O&$WNT2N&K^CDiMvoeac1JmWhDe!LWg$`E}KtXb}Gfrh$)3r0T_BR;b`k8kz2 z6eNlh?tF0PlGP^(XV`%l4o5)QlG3QCQ#K`?l@;*h8vH0PRmH0&g|(`qitR@6KcbOf zqLNFOLr(UjiDj=ZmcMs$+3UozSA13E1*D6-rnsL|-Op0@bDH}J#K1N97+f>c{d5K# zQ%;{ZJD&KS@yJ)-J{4S{tJ_lGgocKZ%n_h*3WOq{t0xg3txKm~#ZJ4VTMm|!a)ZnP zouExXx1eP<6h??Fjj!UqhvpC-9>debE&gTuPGuKrhL8rGn2_a?s?Z~-!MS?o1Xo2m ziHil8NEXEVoP>emaD%WDeY1>rX*gB-REFy)9suEu-_icqi6A=Pgt*!)CBO#(Liwng zx{7v;rQLCng!F~hlFxwd;JW1Gs$RBh7Q6lV^i?#jW#DGqS5Y^T9MmAt0;k1dPC2FA zd{yPB;09f|G(V{$PVK+naP??MsdSustvWkjb)9{LN^aU($uY=U41B(K9$<}6wbUl& z9Cmrmc%M5qtgV=kk*o`Kz0!#Q91|jR25A!)2*nNl@@sEiuG)04kJd)etfJ*$O{iht zl=yKtZM@_~QuILn}mL zGn9Of0cA!Qswjp^HHq+_5Bk?y#E%8&?!mU*XYj0~_4hY;4G+-9=eoqTFHjoDL-tvL zHg{SY$}#+p+yKs7l-)@L?C&4-+59E!9k~1ad0`P@0*@f>OX33bwS~Ci9Fi69$Dt`gv$0$bRM=`m=StIYoZL#Evy<%6`grwm-iJ=_TPL$)mg19XHX z*YtjwJX{!#yQrzOQP~{&sb<8=k_d+7t|jetJS*xJK^4!{`r&XNl@;=RJ+wR0ri|Qy!Mt3&)x^tBkKHX9x zq~up&KV35X(x z@O}NXu`fVoe7nE$xW6;RKzDdk*Y;RRC%5DtM6zNN3OfBKrEaUXdc^m`pTUJOIzq z`3!@#?b9*AEpL1IV7cz5eR9XV(c3EBpP!QLkFpkE5qBl5yM)CQ6LsxvFE3Xo!{{87 zZu2hAb{8OsZW`s4-SWHI@6cNwxQIH?%;=Z>17u{)_bi%tk-xMEko&IApLTB<(IVpfRsP^0SAJcd63MHeLieVGQtJgC zl8&c&TgTHRWr7S&B@(tCUnCTuj-fX$gkzZ@ky8qUllK{Gmpj?z74t63)^R%BP9W_T zS4q11-_~+FnDuX&4tMb@S>M(TaC-S09p%^wO~u>I0gB4`qp>;3E-!NWX$>1^IQce{|K>#7VtEX7b~3 z0V|H8=ni@zrDzLaJ@SY> zM76EL$yyesXZ6fPRQP4La^~G4;dDF1s;@O$$R*7+w3mc}fni;D7|dcSH@Z}^PvXpf zxGqNtkwdhxI_!k$i$LIQ&>txpve+HJ*;X}Z&X$zexgqx;Fpu4W#2Rc_Z4J-qIwS^- zE!}8K*zFi%aY0K#IK=%rDZuY_h-sMR@GOz^igBO8vs~QbeB$Vlbnrpvt}OCyngjf> z3%A0Hy?FHCo*(_=KdrgSv*r^QePFHfzo)NQ?8Dpzu_og=We$^o zg{v+O_;AQ_MuU~s+8O0GvDn7TStTO-KkZ$Abd=?l{_^viU@3#E_<>Z0qB1VFj8rsG ztP`;ig6I@%JJ@sDBm|ih3S$Ch;_kEwL5V+(jaoIjo;B2MH+FwCw0qXjv*$ScFd3}% zBvrZz^_&gK{(z`w2t^u{Ne&?7OwCcZQGXQ> zNpnL5R&e1EoKAl!J%^hSO^aDXZHDtmV=Yjyq%3X)0R=;`0A18fAt2hc^u45UUKy5! zg*@uR0}Kvay@7`agAODDph#FLONHNHpsTb*2}DDdLd>V&IC1qm`_-%f*s6*!TevX> zwAj#x2@VtR#G~7BgF=L?a$QJ*g`SZu1OxJu)F?MZ1XH^u#&e{V9lvOAgZDtwU?D2{)BT3FZ*emQDTW=lXTZLMy`)ie z+H4YVG^`Bdnefo6_En9=@RlhnLa4}14lwe##Q`St*OUu=TiRj3l$vN>0a@+EzDY(& zSw*F_M6nv}9{Lmqu@Y`g!XLe=I`=lMXG@oX_NV+s|3~?Yeg!sR#)GX9pK%vvJ3!rq z+|X|P1y3Lw!0e%q9#DTlcL5i3s_WIptRiL)CqPKGsqS{Ukxi9l9)jC!V?wTLp|`jp zE&va=o|U-rf^o1fKmqXQY8uW?0*7lm*djQKSfgr#a*BgAgsWYA)=zWhSMjSs-au)WKie5uu54Bu_H^1sY(fl~r{BG( z0NZ@}OTDGO(K6crXwqLhgcftR1#o)nlJj`?frC5O7tb^OAri!{9JnugWDn7p?S2Ra zr5teah5D#MKa|H$>Z8as2c~v8v(bo@4IKt^C=7Us_O2r1>K!6DwFMQ9EnV@14ku_h3aPBUeJDpNLX@8j~>);-mQRqM_hktk#fZZN$2%8F)XcSD)VZHR5@0s;?&1U{dK{l2_Gq!*`v%U?)Fp)_-T8)s7B z5`4h_*#Sa9_TcM%lr4zv=5x1ZI6g{akcb+AAtIF&xv(eOwW`tl9GR|>m@cbWo8kZie7aW*e0tXd{*pe8LGupzyZn+OrF*60A!{`jI83L z&%y;mpn`1DcY&~gv=>U>K(Rhx0yxzLgT&G1?ioc#Ls1wNV1Zr$L=Qz|t5VkqhMNzN zqdkSBE$)gPWMQ+fsyN@rNWP1~gNk`@1)&QyXf6deXRwz_q!SfX{KBizwKp-wJOmgW zO|t41q=nn#A)w=%7M-+bA}YbX`;ADU>O`|KkQ`e(uzNW#N>(qv#SIPR<>Bvn!%VaI4YnvVUb?Y&I**ce$H^hxMmynf4#hveRR;=JQ9a`C_(-@=VxM=t)c^ zrKu=R1gdW+ifCi?h02=5&u z3Y7Atbg|Qd4P9JTq2bLGcV6*`ml6l#_oO|C)u0u%RBjhYUgk95H&~pSO?cbRLE&g< z%Nhvb9m?ijrhZQz|NZ><HYk&foq%V_sY0}3`&Jgpdcsdhu1|^2X(^P70oaZ4uERRaF z{GI&0w8#(TALK{!WB8RWc}Dig)AE!&A&)Q|wa#C^2JD4AfjhDRx zAmWf_kK9;%)ex7ynSM@4$%3m%%_<(o!71&yt09bOB3Yq7E}NKFOO>cmm0;GS>C^Yw zBYA|ZF}a`TS}`m9!v_6U4B*XZFon%iaMF2aWY}nm=}HoB7)~R>&5?ChI+TtxsqtGF zG?R(A5gph>_ildn&5(Q}AcV%&;SuS+DD^Q##d7gEf|}rjxfz$(?nk~Qe#Zo6(!IW= zX}usiUx{D1&iMdsWQ8CJ#Ih= zne=|m#-^Il{u9u-2y=&N;hEaYLyt!2r>UG)H$$Ca0)oOj%8IT+0vM*nYdJR-QZPUj zjuFQ|A}-LzV+2F>NFY7I3CrnXpUDSvQI1(5hjmm8(_YF0LztzQ(DrsXnCGh%TiM{4eqdIeA~LkGxTP)VV7M zpYqzZ!*FU#P#q6?m*&NzBeyt=LvlHf z;t5Q)Ws(>8Uqi=-Ui!H_{?`2XH`Xlp45z)%Km5v1cRe@WS#KoOdGxd1{V-HiLWIb2 z7^U{>2SUg9+FUT>JkRSaFDQQ>rY^CNCun%6Vd!cuY&1j zaY2G6mlsfb)p<>OC%2Mq0d>2dD0H0!@!RW=mM2T$_l#dmDf386G(k|}ObX6mViQt9 z@fEoUbPwR!bD4(+<^m7xPCa~tHm|my;<6G12K2HXQ3xrYa1LfRNG&`FR-^fud~mA9gsNyB(tyz$)HE|Ww}hlk#a5WUn+`eHo7{^iRF;4`Cf5Yz zYJ@^p5pqxGL<1%>5Db*AxpWS7L@ z1Q>MCC(DdFXd@1#Diow$x+-V(LOAZ&0--O4*Tw9Cc?9sv7r-7fU?>4BB2<`f2LWTk zUAmbLs`K0>F#^nN1#~|SFaa5is&U7-X*dfwzRV>bKDFNrwM+LJ5B|dNFP{LPSw0Wl zb_55Rn>(i}kotx>J{kjpZ`dSrSto%a(XEV;8|m?e$7cR$$3KGd%)Yod@lJyp??#d2 zTe69jX+buQ2=-RF+k-Sz-A~FWcnZvuF(-CGuoPf!G9EXQS%8sQ$Oka1W?dF<$&>sP ze|5n!)*~grYBI1d$14Dyf&EWb-Y{K(S%cQ(ud3VG+&zXWiTI5&Zlu< zm;DC>pR-B6>9sMp<8XjHEbK_%Ib?%pn&`x@%%igNWEsDgWS#9ke4gOv2U!*i4@z`M zFkioU*oLAk%a=gD%tq-beN3mF1Gz>#PjWU=khl}N@Tq*XxAj6h40XcKL(uH8+ts8mJ^X?bW zp}Wt^f)%~jArIail$~EjmUcsj?9P)mc`8o=?YS70>kD&d!aUj6BlZmI!_5<=baCa> zk@>Bi1&(R{HG-C@QqmS?=StAh2BD@MX1T7wGOsjYH0#!MKKAstNQ!rL2D+80hW};H z)x!FC$gBVIO#R_~1J`{2mNj!OTKxS7vreSe+3)ZG13=z3mfGjZ-FIQOb?lY4j>&`e z-{2a^O4+i=l2=fA%92MA_MxH_g1Ty;3N?L*{x)WKfne~uR0WKyL zU4=b#a$iF%@R)@_3x!(R0hYZfk2VS*iIUp|q5NYl*qFyRFuaruc9Fi%uvae4fpOxQA4*;l|9O;!`<9G_R3wLFiJd9rM zUgX*(Fh&>oP8kKESzG*oGq#IwpH%lrc`H>58n?9-x&?`OI@^uF8jZkWMqtI_ zgTyif=K18S*EM5Quhk&wQ(UYL{s;gvnBg$csm}qK*mhjj9tZZb6}XJgC>vxKZIaEQ zme%G{sfk%9`i$J#jNDp`+@dnWlOeUhCtqq~Hp*a$98|eYp_XZ1Mh2nO@?Qc6#uNZtI4KdpGS#tH-3Z|8FhDn4>hd9ms_1d2 zh3b}8iNtyuu|{jf8cnu_A}Ep#s|-(X40)Pm6S2)({qgA%_4)&z5as4fy4+@sJ97H= z7?-wUCIQH;V9b+%Sn-y7LtY4tdl0vRyE(}+n}7DA&A)|xI-(2P(L|fiw>#k?k5q14}qG8^G$Y(=P z*B83hKPQUDJ2Zgu)LyBKxC;%51mM!*Fi^|uJ6lq7 z#);B~$LiBAFTu7uUD^ed+D))a!e&=OZtG-YviD~o)?rCo)hrT;OLfe3Z>52tAHoBj z_X%&v?+UIk3c2~Lpi@ez`Dvh@Gq|$-;wKB+4ye>FG*bI`Z2PA_`LMM{VKC%rl=uWl zYYf8TAqW$?6EGhHGnE$hZyu2wLr^jnk2CmevFzwEaRCstCM-IjVlhmh5hN5#P0$*s zE!0^cz1oOJty5MTXHv&TA+_;Z=9r<{)hT~=F{PFfJ#m?ql zC$&A`Tp<7*mMwc4A-y^&uj533aI@HKrigW-9?LYyEueBMkT~Ra7R5Gm(zfcbNHdeb zB^hEH#Uky*uPZ;WL@V>eGnZ(8E~@s`aZH?u1&%!VmsxYvJHpqMFlapD;u`C)!(0W- zjFZ9V0A+9KLWvNGv}32Uy^*E~2raeG`Er?0Dx+?oZWY3#VOeW=9RGx@G)6HC?2$?G zXo%Ans?0u}VVa|f(+55nr8~ZOMwC9u^ClOx7feR*ge}f%Rbta9u`z6M9$X*QD8L13 z83jPgq$)EEm~5dXOkPMk1J4FkqOa(M^_+Tt2$ARcif>I4eCVcMsUOAc!iR~#3Q zpXD-MObC+0meHs&q37G%R(%L0Bvpk55*mZZ%Fg7zz@(rXSZ#a>Gp8fEupK=l^jg=) zt~Mr9%Z!qZYbRw~TK2L!HLTDcIvsgT$o2zW0)V3qG1dGwU}>>vGAg$hN-T(AK2Mgz z9ycJ*O=`NOs?-Zu1l#f0g!xWAe&qFqr8?a8?Y&arAVz4eOM0&GcxBTfxy$EG`VgB% ze6k6fROMDOv5I`QeKMtq+fT`l+I}iB{4;J>`LfO`32l!0wcl`+wgR07q3U(W$S1`K zIQNYss1OSAY;LQUilEelEr~^vlv+3_8)Ba3ZsbkX`elbV5H}Kos~d&L&b-9NrEB9s zgfM^p#$nmT@gPDz+0g1shMNlOplD&)Q2?PegDs;%^L~t;jY()rKRJ4KUWwcYp&fw4 z)`9<1%S_E}eOTLW0*a>l!@xD9swLJYTcc7DMVxMR24q9T*XURQVB570&Xb`Ng9|q~bAboWKsf~MNN6<52 zCi!u48~-l)n6V)22Rx%{rc|m??*~|&a9}jc&?#mar(K>svz+i9VX?#FEs-X_{O19z zFjhjnHX;rNJJbhlt4j9CrndGrYz1uXYGIv$J7RsY(jtfo-VReGHch%MEH9jWWk<8{ zgW9+kh1vS#_RxXKWHas>jZBwnN4EMLsp!USzSD$x_RcP{JBmF{2(=4*`@4NjvcvJ$ z&6L}Vq@uwiRamj`W}f5F?_e#7FsOE?jP|HpPzpx-4Ija1&zk^BJ2^nx{L-TwpoH3= zk0IhXDL|X!X$sI16C9BnzfIAQiao`cIkuK2y^z6A07rrZ)a+U1;52v$Kf1p=g!M>P zT`?F#kg2yJISx@xolwjloVV4W2s;#r7lLHqguOAwljKa5bES{@ zU~)t@u7%f_9Tw%43r$FNBek<*=GnV%S*vQ+-w( ze&#ItEYC!x;ebr`IluHeG7d(uERT6)L$lT1E!+1Mdyjf0&fKS3tRb4b@I906+|Qe^ zd?k1O1Edd8X^{P=O@ZgCIw7kIGCJz2(`a~hr7gjjY=^I|<3b_ebbF%RO;{#an90sn zDP5S75*$-T_CtV+1z)=-fwdJ9ZX#`P%GmBM#ddeCR0O0ZVBts*z%|9Pq0!q)tIL9% zjL~7nZ?Zh+l+mr1H7P;q&f`ihHB$)>vidMdh!9gVSctk=dsnziYC_gftD-Y-O);yv z+uG;%9`!?+z^Y~x-4r=n%T9YDGAXOWf`B>OFMAxp9uN_RQHRW)p`%?AD{Q8?PBiZuAp`u hj%g4apy8DkRHk6AeV6UYK_!awrB$-;yzP=H{|`!A^DzJb literal 0 HcmV?d00001 diff --git a/data/title/openrct2/pfckrutonium1.sv6 b/data/title/openrct2/pfckrutonium1.sv6 index 25ba708455870727b2f264641d5d2a9a7279fdb3..907da0bde0fb41ef484ca6ab86b07fc8ae0bd1b6 100644 GIT binary patch delta 35109 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 z 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

{Q&WK~P@V^Fi{bExHWr2NG1Hk@y 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∾C)-cTTauCNx<_4XWtB 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 diff --git a/data/title/openrct2/pfckrutonium2.sv6 b/data/title/openrct2/pfckrutonium2.sv6 deleted file mode 100644 index 59de4c0c38e34b6fb4669c23d13748768e452400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1654179 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 z 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�Idgk7<7#? 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

mG!2qftz&hI*JD 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

@-s_pR%ug~D&ueWeWz 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

D%_tXm`L~GSTewlZlJlIhD~2&2;brjz)-R^- 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 z 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 diff --git a/data/title/openrct2/phann.sv6 b/data/title/openrct2/phann.sv6 new file mode 100644 index 0000000000000000000000000000000000000000..ca3846acb516df415b8a97812e5dcf528ec67fa2 GIT binary patch literal 687858 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 =Lx=u=I|-i)w|0yI@SiPAkh< z-M7SZ+j12d)*jdGe9lwm_V`fiG+siOE^X!8mA`0I3gHEoNG>fmSxB5Brae5v7>?#E z0HUr()1Gv4E~vQO~Nu3f!$Mx%sfqdyK8{3YY`I= z>Wa3PJmy7twnvuaC7>F>Dy`={+yn>udv1cw{qy^YMC>Nuv%==M4hghLkmRRFHa zf3Ovu|Cq!5#O`DM6YfK$b83Pyo`2rC4vsO~NCBI`h6id8BRqwA8!_sm+X(`w{;Zh4 zmwDkmY_&uE=ph2T4O&Q;7hF*}aWhr6#}E=^3rFlpfbL^k_#U)j&T>@Jc=q*M>oEIU zNohNS-fZ#hyd__`$WxFO?GKx=I$hA7ydF4ZzMHfvvCsa1RBw-B{TKHj0)JE;z<Mv=?9lKrPubF{zNpQ!Vk+Yo(Q|st8&D zp7}gdn*$=x!e$SBIIj^bscmnzz#Gr7Ls|N<;<~VUL%&)s*d9VUsVbt0AG%U&4bGlP zAaJuMl7U?>beBV{7j#8T;$cx;&q6@hfEb|nENH5AaA$~OOq4u)*wZ}^eP&H&$Hz>p zGeux0#E;Dst#-2?vb!~j$9b21+2ea2B&eTAY-&a(HPeq+N}mw>D7{-H1jI1gPv8rA z(7a8B@1Nu_muogcGTKEMjPv#poq#}x6y649^l=pga=g zx8ab~a}=FQo8k)4{!OX@x{I5O1(h8$)mWKFdVzQwh#xJseXEWD@wvug?>b$`UYK?N zoxsuo3O2Ol)Y&1IPO`C-YlWgKF&}0S_ptjhm$HL1(}Mtko<~9F)s0NI_D%3U^ds!& z(R4Env}_dVO~|O4#<}Pb2bWh9ds=<9Et0P2&S_vbh3TEwbHaV*s9yoUktSR39j!joN6^5 z1e#z13I_OG+uWrmkV+3q{i!;HP-QytmD6EojR zrRw+a^ka*C*E7kdI4`jz0|8iqJ66DL=pjBEGajOZ|DT8$`ba|r zFEP!rukFMta`O&LKP+}l=P!_FGVDPcV?{HY7+?U07rDC@hnx+4%=i>27$ZA-KHr1( ze=BHbJ#xU?*C*GnBEVl>#<6+tb>A*Ve8~a8_Z$-+@jCQT`$K=33W;#qQeb@3rI*4k zAUxuDe-{ygszG+1!uzAw=n$}{$o_=X!DH2)<;hvZgSBFgPFBSk2lfu#W3adEq|D_t zQ$72erBzr(2vmx4Xun~t zC|(nMaEF4@Pp*htkWa_@Hg;(P&;ho#_zt^`Id=fBVC%`e_Ei8skif}gQuu-tByiNc z+h9X@uP94k&mRbdIzL$SC#Zp`$)a4T{wX>Z%_~MeE?Ma=uB*t>)l#+boTxp#edz_B z>RslSdo*!rDEdHBSOVvFO5YPWZ^CBKGh!XiY!?^-u)HDjSId%TT3{_QqXSytuuBcu zuiC}Sq1P;I8Dl6KUQ?@ZcqU<7h zz1~$t&}3+YZ-Z+M0@6*4d^AXu!7Bml2Mu>)%SD>a*5H20F^ZKCMx1IMYurRl-$=&I zapR_Mc@R`ZSg*SNm>@jE=6SPQ~J(|QQA#e&a$e+&8H$|GwzhZelZzI7fg)!DF z7aLo^+&@CW-r6Dvy=e&vNBeiT0#(-+Rf6&$1B0cWgFAYbQ(|$iVwfM%@->W+(6eX$ zxlp*Ia!!|$!A+ZG0DH{;oq?44S`)Vmo8y?h*SGH&PicY>7^O$ zl@0doa!1aJ%s)lrxYu8oGeW)E10AEG){NR35Ta7U?&TejWVB)Rlc(o^v`pKc`3iBE z$SglP;Mgn~s2B^$D7s(TUZJ0gSlp=wb)|uDQh-C=AHa5gO`T+hiA#1NCcm=m)PXZ8 z=%P+oW}EhO%f1tn4Mkf*F`}i=LN0{a$GR0tUG})+25`>`D8UvZXjgT6=l3!?j`ENl z5K^l)Bh9Yyo#XT>M}m4unnC_bdyHI0|J-=2GIv?g!5hBtVtkkLgp{_EXBO?G9K2wM z8r_^$;4J|dY}4K7WGM;#9%c@v{ip{l5^V2C=dFuv=6Npqa#5;K_EY(5Jk z8YaBypYZ)^EGqC$xDc=59dx$ZMpLM20s{&1^x6ap+1nq`NkBs)g%ZOMi%Z4DX#ZLr zVW#)I{N(={L#ATMyo!T(lzauD!6lgPND&ve4!d2n94?(_?k5<*yEsm%A2kVebiUyL zy9WZoW!LO0c&Ga7JDr+MMtuVeI=-Svk&vt-vmko;ES^AdI+7~d!J%6)`c&6%{WugP zinO`v@+2;-h3M;3TE5lpgCCyI<4sP`R5Cpd=g7QQVnBIpCSq3%R)`nU%TZG-2$P%C z1%-U%0$cLwP*&>%1L@w!Bs`VC#%_rxgm;pWgzOAi`FEF#Ov5c<4%x({rC3TEZ(;EX z;rAOmhD3``4;a_eo+N7y^ZF&1E_+?+MNk7b33`43u(~ghtp={_i;r}?#)~TtfKDED zEOE1mnIq;{_#hI1##tr>QD&GPp$jRE6#C$34@3Xhk;suojG-&*oE_#!^CCNfY6_O@ zq75RyjgGMak`ZdFD9(;0qB}792J?0-$W0eZ2zeokeb|nKv+x&k1LqX`@+{Wynk!-G zL90iR8bp9z6$|S4l1NJlpkH2AaSaLi^A8M`3qHQ&1RU6W_2dC z{VlJF5>b*4acFlQji^=PZ~%tF(MtCCFw%4Tnnr_?xu|lpIuoMM493W$K^bW;sD+Y*gt6U=lfL^anlBd?fkQfmJ+w>fz@dQ+ zFmVY$q*`g0oCvL!x*zdWXb1a9C-yN<4BxVAs}pK&5F?BJd#q#*U1Ap{>Iyd=>KtqP zAy|lp4l;u%03nu@y#HpB0VxHJG!h2zfvyGjNseX>Ra;1@CJCE#AMqBXwE!%|w>YWp zqSul{AQ+61j2W9XaGw=m=}5;Qu@2xC0-E<6{_mL-SHMYXIU_g(;018I@jXCiVYq;p zGhv-QQMsMU(A5t$F`=IwgG*y7e_|F*JGSSr4F}nDS)LfzkUiwI3!?J&waLg1eV_CB z@WbGoE*v>J7O*OdxIGqy)&}HtTnDL;uJV-Ts;>aTtWNB}jX=BcbT(=xFRT4ia?^PO zC@Gfh1@Uq?B26Tyri(BuzWM2}u1^bfy;Q85R%8!g`~%a>B`XsK+LcDuZT@FTruRb{ z&Z|cV(=j0g(_E)L#sR45b4yW?7=rnUnp5YV3W_6ad(!pdGWe$dIb&b5m83<nBtzP32No?=0KN`m?K|uxE*gdOLF8D&BcTlluWq+&k8CP$xAMvB*Dk=p^jU}M z7ggtAqeMfDXh?fQofC*fIOxZUC1P8~B|^ zxk27e%&?a^boW_1m4^9!Aq}{3k>peMrL_IBmC{zWnY5j?XVdna{c0ND`8?atUa((J zX1%FNMn6zAmi_>vJhCufNJLx4HIZBP(8d-Q)NgSi#+H3H4XfmzFY?b*{PWBFQ|6zu z{PP_De1(5rVB)sy>na!pr!&s**yB^sRLJTrP6pwTPaD+{hiEP3ILX(tHu{0TY-f_) ztvrD7R@!a>;^reJA)yALtCmC1s_rxTI`ea8z;OZ7(OACnx(2a=yx# zkl2FFE_5z_6L{IxXya_lVSo&Y>7iQSvhG6vsUjBjH#u8@*|VV0OC>$@du;sXYmkjj z&5rUY9yf40>m9+25`gqhh{e27<`hbqUsFB~T&oaz&|GO;1oNkaty*3|-752OewmF% zO|88NK-ZM#$_5QY;JxfGx1-c6?#x=rgYNYW zQrB%_@5`-531^B!dI%n<#us;*CC0@OpJR_{?n7^8vVbpA1JUdFvN+xk`|yr_ah{@zPpWaxeOkcZgLgC|JXnCgB3lmt z9PkP{LS~2NJsWu?cN;X4HfyH7rNfm>UD+oo-HLPtypC#8$WDkLstezFgk<) zmb95BQOT5NNl8Kptdna#bXayF4_HP}RF9Xx1yr6UGR4bnAy@6@^2|_VxwlK3ZE~`; zfYWX3>PXW9H+xCUe?CdgXr|oT9u<2RW1k;U$g=p#c)&xCsMJ%88c1$<$EiI^``3#eh#G3FO$J-9r$OX+P z@^Y`D?BGfhqa5J*=0|n4az^ZwX_8lBLvupi4O&Sk`fIc;!$-Sldy%ZBpP1x-qu8o? zhs>2jwUY&v-PFsXi<7a=>e5UO&61$q`3Np*e!1sI=qw{wVjS| z)H3@?X`-MA8K?--T@#q!ou)p&-9tKz4qgs{1k}K@{OY2*TN0}ZU z(LpPc%W=7E*rn!iC;3-pAQ+B4d)4{}c66N{iU?h0`zs1&pl)URwX!`uQ_N}-nsslfkhcWSrptIi zI^R>yB^`DaOoNUR2>~XW3^{{|`xmvG*6EIHK)w>%?}EK=d&5a|Kg3Nt4s(O#^`v{k z>cRCBH=sb!oD()AihCF7;BCNM{nZajtwPEFFn-$S6kr#iaO|y+q9+&_xVNG~tr1@V zPi;>zq{3viEEAtQ;-PP=``958;WpYRIY!6whXnmS`SNOWox6S!2zuz|YLkGsJnez+ zYbl1K>F0A62-8LEXg=@q;dCTnwq4^<09esDH^2F4ayo;cPG&j^z_P(D8)+LwyBJwb zlc`BJhm#O(q7r%DI|stRLHD>8TOht&quX*)k=&dX2 zKTHP&Q%`S_p3E*=H?N#9!IpeDE_sZ|Xn_+n*!;*fk=p5qydWS&?wqJg#y z`GI907`oiDXputWDNTp@oi0^~ zjKHqIW56;v{+#OxDE?vN*OiGT0pURG&YWG&^up2$KO-*PuNqDvmkoDCl@f?~iPdt% zjFvp5#X{5_a=&V&^4Zp5RCB})Y}If-iW*!CW2yPQ-z{Y{98Qdsy;zH zYUI!w^CZ-{ETFia1}4G=ld)vU7Bi}DX>!4?{4Tz-mEt0{!BKlA)LTI@og^DCEBr-2 zIMc#07zB42(P#;Yvt?gKe^kmZtOu*|^AZw8%ZX4Ud!#|J*>@HQ4)P$;SvhD=l%z~n zolB;&HmQ?us^>#j8CU%$Jt?u=qp8`N=%!_DNdcTQ+sBbcvBul z=US*weUrHNb4h~UALW7GY|R!P(NVNLfix9RO2t?Ml`ZlT93bRa0CKCPRfS+lbkVWE z-pT_7kMA&C;f2UX7d2Dr0^u!M-7RjzYQLe}y`! z5>l>ayqeKBZC3fh5QGYj(02?uEdol-1{8#(lJQH;;nAD#O z8@ay`Gl_5LkXrd!$L;rnWi0!+devb)33(=M*4Qx#Dti^O^wPwE(BMxy1>IO(4$$#J zUig`CyUpLm(J!b4(<}!h=29#^@bw^LG3WWrIS+g=A4% zY9@7^P&FtD*(Chbuz2K&+w9`;$t#s65K1Nuk)m2o&;pwwk?&7joYvBnVrSIDJv`k{ zfxVwVz3dHt!8#7>>hQFF^%D@-^#~A~USw>8$2Fz_h%=mb>T;L6iX`Z~T(mbZ zDKGN1U%e@kOZ@yY-w*uXp1RpJZ`b?bwlg=K$_lTRqVoBf2H!>kMAYvjHIXlKx-YTf zTihK(OjV-)_!(f2;~QYlO{|BNxl+Tn*ePeC z9RbsDF~#gJu(7Xu904mX*0UZ(lp&w;7C(1qwKyAbknTzQr0X6nLkD+%6nY_K5Xb0a zUCLV@hbrg*YufU=mOSUFJkz5yfDNqx$5i2OkS5lB_eU80fAO*nj}mK$?ISbrvV{_y zRj2qLTLLMYMb#p!+lrGc=}4gfcLo-yUBd4~0tY!TOIQvZJw`Rk4r>$Hn@p|JFC4tH zz2#LrGm%Ke9@(8BQS>GSvLPFS|4jHm^B|tLpD=*)2EV_1TOGWVt4q3@9~|1d;5bG_ zihNdGd`i{;RI&SRJMZH>0;pE8bdI>D#YJoBcNEhZYzo5hM z;ALfLQ?Sbdv)K?xHkKn2LIsA#YWAAGUZRW$+xa@2UXlEo`2I)(T17b{@61xq=s2&- zB6Hy7d?`OkPz^VHm7Vkgpy5T~@Lh5U1|}T>9&$k)5iuFU;GBh%SNj0SzVvpmCJH#4 zZV^ME4xigi=msJ@D_Q1fP&^*mE2t z$SUQ%_Xp>3Rx`k3vrH?$WT;8R8+-g3>rWNWmp!mhT<tUR<4QZf{K+u&Y^ASy*@WUb-Dr`ZYLqd_)5QV5?wzdfFW3!#M28cg!Awns{-{%1T)AG)3i>W(T6!4ZY9AWmigTHe%LXepQG!U)w7Ifea@0TvzJ^yp$BB{+ zmIzP(NHCZ!@vuBU6K3w0@)8Fl0HA&=1H&={EU5=gGP~iX$D0m^*g)bg8fFrL2^CXP z@eb75U*~~90FwDgQo$YrAdol%B$E4pbuQR=pj3%aQK^q#g%BRMGt&Y_{)JSR{a0%R zh2WAOe8D1Z>3Ap5-2=tL=b$<`ZWtxgF8Ldh-?eAf1jsz-VOkm&9igODA+R(>^F=!x z+4X$5K#r!+7C;WXsMtTk?AWvXE`-1)Fk|ej>s?;v#ui;(LUVvr^Zd+rafH-a;-;!) zT|kM!_BB1KBlF-T?;mvKK3?HQw(gKfHK0RR&c0t&krnuHJ?2$q?9xobM zO|AqGNwrw(!6+n?vk@~(YhWmku%n9(Ln*`(j%v%LaGmEAH5>vslc$Z#p>(+4CG{QS z9Apa@ai*d2xY@N?K_CS3DK_Ltpnc)^+0I;wC^69?SGn)wOd>r;C!{_6 zkEBu&%-5wDtBB&^2(%`{5u+ z9&bpV5~iLi|hnF^$2UJ>g9gvEKJ^= zpz-QFk$=(8Xe`y3GCEOaZT2|bPN*#*nB{0Dewe!t<|NA^>2RIMhU=D+EWqx_Ht;=c zQ&k&EbcVR;NH|55@qv0OEm6d{Q{bENF*Voa75Y_~WJlW&zYZhiJ_)uPg%thj;9Hu8 zN>@ZoIIZ4^)h4=}<)Jn7yxi=}6eOgG^|*TTOH3`C>>d>1#?^cH*PR^1o$DAWi$Q)H zS=}VOE@om*mAZomumgt)TwbS1gxkiK8Cd7vVZ?}e!G)3%=J`ff%nEU#ffC{Y;K)!d&ciGaV8UCJ6^KcYn+s}5S z1B|fMzrenOiyX@su7UmylVOdnHKNr#dN@-Y^Ee3L^$yD+x<97~b%V{Eyy|V9VEKI1 zE=6qIq6j-76q11dd+O7UhO#uCIZ*y>O&?ErVC=zg?dS-8)@ zC+Us@1vS0-9Mf??lm+9QURUbaB>*gM?`QG)${7C{wzOBdav=A4*zjd0d@^KodNNrG2#WUO3TItqKv%Gd;0GbPAVimAp1^{Br z>L-yjwo=$YhAOUr7DRWt>kM6A+aLWv@`Bi}`d++Q74z00$#J?Zuc9l|Sg6Us=3?mr zLDUkoaX>38sD=jIf9+RWy4!(}%|dBf2TCy2^1kMdYAtSNiqb69BBP_aWNmh?10jbL zgy|3f+V8nt-oe-(XJBga<2Jj)Fda~lr0#vH>Tcr=8^VnU5nWB(C1_b=2~1gJ%j6qL zE*D+{9~#O2^^en7NwLyo_fyt3I9=qn!qk@KH@5Jjl()}paV+|tBOI*RzU^TaonK?4ZA2iX76WPNYKPDnb4Lw zWZB2YCG_GSAXHtHhTOJf*a&LaQBRpaShWqP<4`~df&Sd_imCyCP!DI8V2OAGbf(Me zSnF=DhQd)GU1b=u*#}Y|_${9cH7?2sJm4E-*WXZ*9O&$zdVLWr%@ERh7oyUQNwoXP zF4V>qTvLCz_uT>z@T%*w1ypm+0AoS%A@8ykAE}aa*^l3QTp@ChZ}S9-ne)vO?>~HY zg8Xmk9hD9xtUARubj3!c5R%yrTyC*i4$F*+*$#>vWSMo96fu5a^0t5;cQjRN*dXLV zZIh5hJNPbsRc5f>GF11_I~(b=v_dN*0{R^WT4rN+GK`V96#ar|_~Q zDL{mf%%%N^0!z_qg~M9KCZ$}6`2I^(n6T0e7k7dw;Gx|0^I10Ja8vS;9U!zyKoM@1 zJoUVEQu&;m8PO0Q!W~B{nHoW|2mo{Lv1LPhO-7KjLn~_~Ha-bd+#y{UwsT*4uW#z+CKfHg2tkl(LB=$2 z!MOwlP%d@dCq5bt8{=r(#S|__$ibWqNCF5_DKuS?6|ODl2~TZhEp>-7L*~9gFYZvk zPR#Drz=OdQZ7c{rwEwElm#I;5*m2a^EYx5oV)s=colX4&S;0jW)PsUG^i;lc&oh?c zl7N?3pd;P|V(9+;LkmBRB%})91qvXh!Dz|Wod&e=ew0SsSf!gRO=~`h7-`OYIb`gE zf-g`|WUG2Ekd&}vb+G^*h#)w$`UdXy{pKA~P*l?o2M(bqUZS~0Pmd`}V}{k5y+La) zvS=7xzwP3(l3c{O;tGd<;B`Vy3>@&upn8n}IO}7^0u9zHJf&kBv{CMXL{;rV51Rk- zSqgPs=vh)0T-QUFXi1Yew&^I{d$p6GFj#mm%QSR3fK2ExCUnxTpu$)TqyYy59 z5O=5ZxmU`bV*}cd>%R$xY&1A;nItMxgV7iqIE6F;w`pZ#U_ew`Y;hWg)At>M0sSZ$ z01jl}dT`K!HnaxF*{lBJl;$F>0FIIqWZ4x z$od}u1u?MCH3GP{*prP-zKmN1G|(7>m#*@WAjaHO3>c)heOAvAeD>`1Cu%Ai7@Y)S zdTfNduj*HGr@Vj7$O>VszvKNU0qD~nZO#BgyV#xbVhkY^ybW7pC%B&u=-lV|SwJ?l z2blA`4^Yhh6rh-NK;a7}HXKL*NCJr=aTC>~IMT3M5c=)=h|cAe%WT$z#TjC*N&Qc4 z;(7iLOSI*=1S8vJAA>xZh*r9mWB3EtR=mPT4QVxR5o@h-#vOR&9;V;L+8$&Y%CtvK zfXih}>qs3K2LqzkO(JZf6zC>GvTEg}g~qM?slW^;I7g7`0DaA=WZiZN@%aH_DtsQD zV`sIa<^*p@HVMtr-+0lJC5|g%&_RHR?U1}nJ2<~a(>;zbgl(n~%k2(Kst?Uk1V{?5 zz=@v6lTo)OD=x%v>Z4F*h_3tW;eX0J=EGavzjit?mzeecmffvv{wKP_lKyu(@0~cq zArR7R9gtV;g)4Sah=OT{QyZmbA@+L9S<>JbuwMd@d|15a0O_rk*E!lE<;@&kMz=WNTXNEG zsOb*aGpk@F3G~cZ=l@cUE5T0=TOG@%b%<=g3~~)r%ku=8W!1=#)!v8g1Xs^82T}5Q zOmQrT7XhTPy{|H5L%SE)9^nZ*U|A=8T>GVI$3n>emb#2A4m}iisKAl9g9ACg7EEx^ z6E?x)$mYb5bDpnyz1*Sj4s6AWDf}nE_XGY4row-f*Ca3um)4*m>wZzm$CSeTsncc; zI?y>s+YW#R-;l81ri}a%vSy17d$f~YR;qmBlonJ-|{4xup1H=eM9Amh%!tdCcBMXu2Um%w_Hazy!XJWZZQ&kkUOGOjXV=ga~Dw^1(w`m8!uV$v#6U*i!Gy9DL4~Dj zD_#CN;QJ17P%~yFuv$E#t30{k)#uP6)OPPd;fUto2L-_8e9JnM_Gn1?hK+9}c_jiY zp+%C7)tq&{Ee>I5s^Z$J>vl8y0|AFH1$>xDItRfrIL+f-&I9#NPHK5K1S)9+LUu%q zJmNS#xs$CLhd`n+3Uf$9XhGvGtR1X^$@|36bdI!HQagd8OmfmE5l}yYM@Lrga30G$ zm_fF<8#f&)wox;SY%iNbyWv}7Y3K>}(%V%`85rY25GCp&U5vYm1c6L7WIn#^cf zG{P?nUWQyvTT~0)$JV)H)C*Dfb_v6vDcK%NQD_@O2d8CRcNakiFQT01arO)r`vA?_ zs%mwg?KCw4hQBY7{}kW=a4xsX4M$i?!i{3X?8_5kE9acDOEF?Sznz_-9*MTSrMe;p{d4 zDn7#wP3MXENL>qgq-(mJ4KU;(cA(EW9x?$4k%$rW5MMl5zXLrG73NA^LK=g0&<5PO z>b*xn&d`-e8SwaFtCMqN%pt^(2!JtDaswqRj!6+@)4s9vmsw-_8CH%!Z{R%|5ZT)j zCuJgs14$kVT4?XJxs-;tq^)s?BO(wK((YPsVxz~v6R5iI1guI@8Ai5Pcglr;NSioj zV$EAGia&8pmbUD>q-Cp_yXj}gHr`DMDd4A>s`!R;<@|b^1FPcR>FT^yar^G7jh~EJ zQaKyH8>8qgdoT6Q6r#Y$Z*5YXA_&s467Tx7<%{bM0LXfgIw8ad64Fsa&Wqcy`K+-N z5;;9AHhM}3x9&Iq025*bbnm5qLs8#YQh|AS@oG=X9EVzy|ecBPw8E#j`;C6tRO@i7HUek63OjyRExswBCecvKjOV z`3EJNF%=}~T-Js@;FQifCP&?gc9#D#KC8Om#PB#?0;G}QarVRVF&p4Y1+J0NAGqjA zk_I2L$-$&9-agcJM_E@WOj!1lFa}w2=&;WzT-AY6~KGLl^U4?ZO zk4d&Bwp`D#L-WKY=oFJXj+sEL>}<)~o+vd}JVcGKU66P+cVQ3jMaZx1ttn;b0je`gXCE)yhtQlujU?qL++ z9Z!=fIQ}#8&H@nS2vAN{!C=%O6m7MPZhya(>%mg)Q()<)U%clRbWDe2X)v$@txPZ2KcxR6y~e30L=+)XlAe0Z5>;JP$L$VdfK;pUU55#! z6Ob(DLM^$p18YP z;}pjKew1A=tP^trM!F%Il#X_eqc7B>}a!(p!brw8Vp3GLa@r+-o97OCJ#Z1 z)=?>9Nwtr61zu>UIktzE;Aib1O(|Sbn1l##mPxrhu9ol_`}gV>{u`caWuBhp8`zG> zj0l$WH{X-^%VZz`WSj; zFWi1@N*(1z)x9b<$YFfjqi9VutIw=TQ^GrWYG-r0t9HCF=r z!lG9sBshSpp9+IQ9~bX3uiqCILcN}_nGV#8Kci=9dakPL(c3lt`#aOmw{{dUGOp{lBSPG>z=%h`jWUnJgjqGN}h!xd2 z8@a(j%)^oPOr9oo#kTDe3O`E0cDi7nNm1}UCt7jcq{=&l$qnCLZ?T!O>IE+OjUgnsau})}g&(aW*xmt!cdL}atg&UDC6#uBYLrF9 zh>KlJBcrj7vUX&(Tyv@L*?ONci3D^ z<}UV6^Tk1^JHavT!RHcex5p{!Y&83*cLU5=^#fRt!@h4Li6bJ7tk%n_spB-@baRl@ zjt~9@ZFMC)1`t97Yf|s_UP*8|C*2Ua_FKw|sYe4DO<0N|{cFpnsKiwfzf=G=!C(C8^Z!rv*H~Y9pOerw zchF;4B1ftkAX5@Aa)`YONZdo?-b9YN3v0C1qM_E*B=RTer2@>?GJhQ7SIpXYVGLio z7*+6v8QTNzv|<8&NQ(7{1cn!#-n+}D8_HjGc*h@{?q&k}9Cac$*_$^5<%>Icduki- z0Lgd|eR*=I#bq`vPG0naltR7S}!vplN-zr(69DVDoEt zLd#o&mCDFwSWBy4!0}=__?CX{k<-BJzdLjICM7x%OJ)%N)^Z^ z;u~~UeE%+d4S2#N(O_q9pODnEtZbhHN3stnqD+lW!DyERSOgK#m<|D?1pR)S$1xRgO0mz?N!}A7x>C zFu!To9UJ5*9YGwt#fdklmPaM}eYDOMM|Y|z0^d9E1`wW|FNp|NCdK4RU?!%kI$%Jk zO-aD&j7zXXxVo!-`O1OY64*v%rz3DYuNQW!8X9oB2WiFS7VeTc!d9wyxZD<4LwVsZ z1)$%4Ujb{H%chYoIh_qk5ghaX&)d<(n!8pvYe$+u(>nD?j?sB)<>Ioj)L^*tHlw>M zRCAM;F1rJfgsszr=Q!FuY-*nL1%Lxt^~(<74uNpJDnhU%m$wnEMp{G`|=M}Y6ORg+{otuZ?f#$xIBsKhp#26Kq3ov92gOj)`DxV z$h0ET ztbwB)VV^zz2jmNvTeS?Lc@s?OgCO`cyj7+Q$HgD+vS)59WZG3ImuO{U{3{CovJU=W zckjFn`b9H&f!|DN1rhCfK;7j$NGMQ!wiq^k%(PUtZ<;+9C~D8GykG~tjf_W@3d1?z zbqd#7)B$nOPTexU#9!6AuyK6i5spX7DN?k&`(rD_5gtO_HiZE8h~G^`%l|)rhduS5 zXPruh-bzSz&t#~5$>t#nnf8RjD(>Rx4{h?N42^BVqu%B#{fB<)xOzX5Pw=1m$zL%W z3cIgbp&N(Ycr@xIlI_AC;2YN~MT`{U{*P@~k@Gf*2jT*kaTw;2LsUt`S%-vxvNH-9 zR%DMy9Sbc*-T{Y%URx{aB>3nljuS~{81!n_ujaYa)aD`6Ug6#>XQ%))EyQG?Dd`d%u6vD&sK^dXP@&%OsOuPT z7^4rD)uo!N-pKj1&;{t^t*RqnW zuh2eKsRa`i7l)SNlQd9(#57SUPq01rbp{CMDK}2l>?E`qG#~ci<%3-6Db4U~n}eS>fZb>BIp+7E zqoq3U&2^iZ)N+{qps*y=B+Pd?NVsF@dcUs!=1g^ZH_iWgoCT*(+Nra^1PZ{<&y zCQG5JunwIjPo!fnMYZwf-%&5CGchX_B9{%)sf!F?gO_gFv9mV{9!U{)fey2g9pxA{ zwGHRhMurp>gKTofWV$s1)Wq;T<*aiKDB?=R7`&A{e+w%huSs?Z>`t|IgxypQo%Djs z1gyKasX>|-B;a?W3xUos$!V8t0ACv<37_?*te3xHRdo?rw(7GEv&-|M7Q^(WhHmm6 zLhIWUycXEUfc9MJ0^5c|8XW=|nh-22JKD<1j%(`lvard|$vUh!66yg1e25q2Q4 zo&DH8OJ`gFoykJ2ltl6+(0i?RZQ}yiJt^qcPZ`{(i(GXz++<-HW3IE&DGafP-f7MO zJuB|i+Tp?mXhQ4fl?%aySLDJW`+k9ieP|Hxkl_H_S(fBbb2=ktR}!%UmNj&}m3Ms5 z#2qYcF58hACArU3NG~CfPZsz&fi;D|(GeR-Z`q+6*fBrI{2%U9=dt9AHf~X`<&k6Dv{vo`Btb_9aBld-S;bZ%quQfk4HN@lZ z5_m>AL0l(Vd|-^1QaQwZR%uP2I)3z(3JJ0E;a2Gs9d@I@M%HVr*&bzQr-mB`eZ(ou` zeGJcms~~G|y?KlspiX&^C@}x6)`0Dm7z=c8-2XU2#e_NzAz#$(Zx?6zcPec88x^{o zSK)qK*#cs7M9IdJC9Jxe3z(t4V?aq8T-8vaVu=EN0U8%L#8vqMDA?oko1*gt>JL4~ z=6OMbqMQ8c2djf^fR~H1@cWrpJTO;9gOK=BoTKjv7CuRfY>$qgR`C4CkEQWcJ(77quZpk+mcE+=m*P{@C) z$a$tUK)+-O+;rnv(5HYFvJR&wt}9@HM_&n6GzpJHs9!Ack)@hFMrtL?xeNfkTeIUh z1uUgi>QVq%{D36cQiFC_tZ6sr_B2nKaxP#YHyM__mmn0Xpm{42H=!~YE)B|)Fr2Z} zgc=wiqmjr(KIQI!t?;OZ4S03DWI&QE)GnUgdJHZShR5 zElI__fPrhjo?t>ff~N%)tm;RvtJO^wuOsr#PbfG*vyKscM~F_}rx?*Qptlm`Yt`Ir zKmy}xspz^?R9F}|2%$sC9w)=Se>VWlaZ!n06<(ZqD#e+n8Kv4r4%^gRqg3?5^Awy> zUw998KMY{UbbG3sjS)L$+c9KM_D)xR60oxhxkqh9m<{e@YS-*ZvM(~8q74M(&jsAi zK|IpUf^nkQUTQ`55Rxmo<`K$uy8n zBOnPi%`6pPlJPFT#?*2q5F*2+7EE{kHff`#wAoK|@YM-$?B#d=VtKp1k+hRFfO7ff zb>{2Inq1wlsLeG`V#|o|{AcZr@Y;D#xPEULfEuIgz7~S!e!5LX04%s0H;VMO9=C9L zK4g>tc<>Tu&CB++Yo+Gg1;K=;;C%bq9NVuxFk014+~=YM(4|h)pr#2&c0pQ!Yw#{!WL&U;-XM670~;T_ zYYN`P#FIR>yih2k>;w~dPk-G9;N7XnM3rR$38h01s_IfXuQ(_GVa0ckst+-l{xyBX z^)-Nw)D(&hmmEil4+=ninIxS<+7q|A5{?&Ba~P$-mOfTX64?g>S3C7jG(9@v9D|KV zoV+F!*t|$VqFawR7H}|4TZ$vA%Eoa*5l1w355mjA9qnn?db8vkAJ4WdzCXPL+b=0) zSgi=|RTYKY?Yr`#SMpB(0p5h~DE1ED*I+Xt_6IB}N^_UcPD6Y^a77r?%f0YoQ#WZ) zD=3bH@tn|asZijV%+)I4$qOzD2zkmlrlPjNGDYtW-eVqsyyTi5;lZ}2LJV?o7QZXW+ixznD5=8O%XiV9ngGMs46q6r>0|61hANQ;{g34% znV}-pq`=*h4DV(@ zjIc#Q>IE1IU{VC3d~w__^5Qi-_Os0s-mYltNmm5+P*a&X3x5R^KTQd)%Pp~y20+RJ z9h916O;(lMJjj_7plBJLn@`zq>d-U%6&TTj~#?2>T^h34E__mA1lr%EGq~2l&Nr|LKhZe&YMG-v%NTX;LQ#GP z{5~4Ymb~&uq!Jr)36qqD^<08hIP)Y25pm3WIarZNUUf~BVy}=tRn<RiGpo?K_jLxGD{sS}=`aT`^9pEj8U4tNF}fnsPlZiTbv zmfuy|Gvt#VtiLYzLu4?XWGgdU@%>W!%3cK)GF|6t**a2v(G4;duJ^ucofGIYaRF(+ zYFJsnbufIjn*;_a9g6dPy4LD+LqqI>^`#9{O=k@BV7VXt-6me5+}h$qXUxNUaGDrQ zJp{xoWgbM;p~zIS4ww=PQaVXDbdvm_h&%r84g~kHd=s+1cfg&48Hb1*UvlSP5`7l{ zaO;ZEUehVnoiXGYfh@wktED*9pj>p4g+y;p(c4%G7YD;pL#bYn6HO6kH$ zyAQ^%-Tg2Bl=-}u7k)B$Sn-xb)YE`4WQ4s8u#8YJb+ZL1w`-vvb7c5QfmB{bQjTwb z6r!Wsp}z~HG<>ZF0?yawoA%;`(gt9s=maqV4G=FG!<)lk?P#;Pu8judprgq`)>GC0 z-`^HMX3G>_)fC>%ZP&2s`UbNaVQ`N2P8LvkcRxf47RuR|S`NID7!Me*ti9zDi@ylO z-v_l4$#L-!2>UG>zlQC6ShWz0wO(q zM!}!@1hU6p6BF~&+sc*v0k=zF+9ESN^w0>os{?p4GsaUy9oIC%aeToq+*?fm5v~jakugLm;Ee_!MCCLgH7NS3PCUbK(R~4 zs=pMFCcj)-DX&eV@-ebEBvitoNr2Bx2*Ww)h~I#UDH3&%M{|k?bJ#lLV~cJJOP5M~ z@#}D`<76lm{YnJZ9v%<#ZHBAl#u5A5RzNlnY^2Pp!r#|KfVby4D#b5hHV|Cov_M@I z(aGBd*k%%QZ^KoUbWb?|QmntK09>q8%4<=iAUaju zmnOq0TOS<@9Ly~F?Dq628!y(&rnbtGKFWRR;|7+z%F(pYKEnznL)3|BKw^59V|y)9 zp!>tDEl{$%m<6GeRQ>8)vj*LT#WOR>`=I#)`c5SLJ}W+r)}D>z{3!dE4EAoRRmQ2^ z*y3Cfk>hw1w-)p86P!`H!d^L^?#hWqYaVmbp0s?i>z#9*MA1bp=T~H& zccIH74xvqDW!>j<+|6EW{S+LQDc{GBo0N^McDdjZt(#ggFAo{s6Qgmddp{hH*egBt zJ98Fl9HVj5QR6sriq#L|wAgC}J-8m?CyD$O@1o_JHk|t|;+!u`2AhG;3{PO}OQa+O z-*}%~bD~7mK7yLXstf#n)IYht{@l`<4?ozD6!Fydh)-Wsr$4@bI9A zh6_M*h@3QuXeVU;{_PTr_)e*h%oK6(xE)7>f9$y~L7>LJwV~HAFc&EN-kSFE(!3(i zZIWnO$f61NM8i_cc&@add;t8<#nAU{Ze=uh8daEUL1H zO1JD=n8c!VDWZcrFx}m{#`ck>9`jcg_4fl5_?SaWT}RHi4bdHcyTnD^Ss`*@0jLyz zij?zU-k~rPGKErcXQ05Dus6|#i&7V7asKhA0q>Ld0WZaqmPag8>B4(>GfsYdztobH z^{4c3>qmf`u@h4AKALGDtns^e!c~*8DrJ zPn{m=b7m{}O+G4mX)8Jc`=jszNM&xR)vS4yYcZI@Wv;>xgu9}ilkUJ1bg4mA`hpy3lrjryvwH!QMSRi@Nu-w zs{r{=A;l}K2RB_3(KXRKz0t7DV!#Yd*MhrsA91UQ60}9-ZtJ!$0IFRXN@Y15E^n$H zgoiEkk6iV2j{OYr@$fx-v4B~nCOQ(^?Ap`83h`ptAU`5tE&Ar<6_qc#RFJ1$AVUZTat|Qu1PUdBsQZ7+8s5Ylk-}9fD>Y;PkLI zAvrJV#TQHbaaahcE&{%W#1pwcd|MlVihc@w!xbXJql@)9M|LJ5J3yVH+foEvB*dUX zJ8_mF9iGNIGSldV(_FTPJyEpB6I3kWbp?5@1Lz;xkyqPML%odh4I4@ppj)DlE(ryP zeculo=gVCQGVIS7{@4ic0QgRNIrPI#dfp|Ta%dv0)Rjj_EDckf7T|6QK9m;hLacjh zC1@AX133D9=Y+{%bq|y|!5NZ|4FC^pmIDNd~7UkcGO$IygDCGRe%W;GJRwf|0A} zGzPsDFpojjwE)2-G9Kr^JZ@bpV({d)1DbX<8zXJO9YaI+_SX1wDrAIulBIJtnO?T> z8Rm*7^^h0BKa4Q^Whw%6uHflFuS5mE3wq1oDxlX=R}t*t(V};yV2cq8@N`trZ%210 za*z(uOoAvzOE7pI<`mxgxp^jw+hdyhg3CW#-i`(Rs(|ho=f%kjwR7USml;TW=A`aSmo}Y{C(`wM6&p53R6N|vu*@) zl#O)p&asGKy6WR&W%p0TElWHOE>40isNl7H&MM$LlJ zL$EV39U5=kf+C&NCMlfA#2%%_9@-GM{)*>HHxVhWmuh4;wuG(jXVn{C$8~2|Q)k^{ zsV%LzSE>4DdsiV3wKE(-#?U_f$F;9z{#C)iNOJ>yigV@?K&<-$fIKNc25N=0LRX+R zo5%<7ipSjl<*MaL2vootvU1%8ohp~Dz)?uZ?CE@4uyjr!%9*9K=Sk*EMXVE09CYW= zX+SQu6cneS-2i7B+`PLsn`^klkG;HpXDu;l7k*NGKFCW<1II&saYPPJ)>Z(QX_i1F zQS{M>Hv-m{VVY#63zpnVQWU(pnB93QUl=WyIu!?4cr%T_H3q2!h<(F0FVO$1{7=;U2^#rBbI0YMKQ&D zDat6>nDDI^|AY<~a!~FB!G4=LZ*kijD6xvir?`j?Mkcbd8MQ&|p>A46^VWoTiy&SL z;FfMN`DGw?fy@<$O!VDE4(#(;7K2b4z9-M=zDadiSX|8g!((YOO&tEs;xsXnW(5N= z^9xMF_f4|=D3hfsSNka5LgSw5uEx;zX<$YNzfZ#1GoK1)WStDoI!#xE;SpD*k}Q>@ z&H;%B;^xEm?h9@RzJH~*?zyk5yGOPQD_+YtrPFsWH!YIpPd(X6gcro;7_)P~8gsCP z4;$Fk+wM>(-gj#NbZDF;wQGFZFOnkPR|G?xt2E9*0atA)PSDISFWeXv;5S*KCsVOL zn2)7VFDf7=QM22b%a&RHAjBbBv#|zfrskocoyoMRxsaxDFo1TCpgk^iK9&jMT4c`B zr^}pw@}a&ok~x3x<1*)`ebmQf&TY(b&PEOuje$!l-}6~2=fj|QG!Q6aa38rZ<1Cn+ zJ&{cs5OX3rS@u`mzed~)%ZG@72&W@bnS;Lx7>9_5qOO%{u=Q-_DRC1fljSjyV+NN(>x|jtk0UtN={g^`nb?-6=^+u()Ml&5g^6@KD z*%E*v+<_Bu`eiwY95Xaa2b~Au z@_}4?6lZ%}x~dHM-8B(EfHH`1|24fUasZ!%K&rC1@z2HF^Z*;p% z^eTQ4&drO!8Nn{QNxU^A32Ln=L7#;6r@o4MuXOpT6rl^%5asofYFB-CIk@kRHG6_h z>RO?8zd6aO5N_5{73v=KArW-K?svo)2hn<^uo4~vK|@mnAe%%^l2`hCqS8Q8aY!&u ztbv?3BZbQH??-zB=v=<)R)J2$8_YRQ)8jA6)8Cf4$AwvW7RjJA%Vfw^Ap3Jw$VvD3 zuEA)gTIY*SxhD$5B;8f2PR@i62;m{M2Z~eeoj#ocp#OW`Ms6eegix#T zo>t>IFr}~c@^ZGn@`(bffjUPZ#|f8F&Fh~H()J>Ns}U@o$dk0cCZr={teicb>X7#x z+LpQn_xo0EMEPsL;7zR;aad?32PbpK_#qZ=#P`fu?+pkkQ9J>!DoUG zBB_K)h^Ck)JKkR<7~8QFfxHQz z6bUG2F9GzHqBi|%M8C>;`k5i|mQTHKT5$i1$pcxmg=#835@grfbq8OK{@;glUNPzx#@_*F<_>NY zGnI6pIKp!G&op{&KY))4SXJJ{10&&Z#H7uiw0dk$Ya2SM8vwqAQ&z)~I*pPV0^W5P zs!kIojp^&Cc1p>zbGPK#?TZz2t*!MT!s^7}tbe2epp|JU;Rw~&RsFh zN1}RSxqL7A!2!*kcF#oc++72mA478g1DEJFR|V7)*k98BWW@e=nQJl0{ZClqk+HmG zinIW~@Nc>tv&-tMjj_{7W9PSv_>j~}`)_l#ps_Ed=Cm;3qnOBu_Lf9Z!EbY zcu!M7)Nm*1=4u76S$?z6iVOZ7e56|r{qu4GdFNBlT70_!b6x$uuex{U z{NUlrSv^(!eAw$#m!5^S!*82xx7+p`d3Y87ci zq6=sBGPx=owL@4yBUpt;FtM^>!34l+(L_dy@zbrR~8@Tt59Mwhu*)r+!rG?d$#8-r)yH%xC$F3E*HGj}k_^}tmf zrx44(9m3|Nr+;1+4wn&S;SRq>Y87qWLTiDNu_6iz(g^E<`U^uw7*SQG7vu86=vbQG3XH~rH+SuSDk(<66%Gr>9 z^H!B2BfR3sg6Zw1PK=}@CNK`bbK=F|q~+$lwIJeBGPVvM~^Ue&-5mCp+(R0I5(0YyVlE1Edq z!eC$Im;{yPn(pn_08cQ#&lL$9;%#)k5#p~l@Y~QYVRmMy;i=ZE6uLVm` zo`8>IZc!~PdFKKhzSsGVLg2?Dt2?qs9*ss8IF(FD2iRZ100Kk^6?zD~;CTz-0^$np%Z)koRA8XwaWs&N9-=PuXKFa--=x}sdmNNS zERH~%g}>eevbPRIAKQsMo3#}ZMB#@uGDCYome&rxBi0Q~oc^<*dZ3Qe()=Vb1GNy@ zWG<}ZJl=|wA03yGEB*vcsvknNx*4@no(%d5M--fLoGv; zf6O8!C$<}YeVKMZ7kc0`CoYMIgUpOMV^}UuqEeSui!0@&ICuE&BAPZh8uo}xI`tPV zW7ti)w*1#64^0Sa=Y1`~QsIy>Rl`vIRdSb8*?SfOSxT6%UvMX5Refra(W3^KM%l{U zs#wg_`?}u1N4zVQ0h12pd;renwMJo()cHnX zmq3HBIf%?HW=aV_A@d&%5`YarT7vm#c|K}paRIyk=boeG1$93=K1Qfy;Qy03^8l86 z%Q-KHTlkRUa=;@9@98F}64u?(1-wp)&J#M@ z`zlNQic8O;ha8?epAU+EwWMu%)y5JC7OyLP9SmADLP z%R{`q=ajyu(Spf2+P z>?Y8?ABMPZKhboD_d!k=SNJ%@p@|=aI95DRRh19kGacDO^mV7!R*lB&xg#l_GPKqv~qT74I->JKtYH(G&O#vm3IX>8d>v2@V6o9jf%iB4+dI_f1N zDZY{`QD|9+o-XVS3C=%1hevL0io54~Vh5j1egb%Js6~{Rw*%>u8>xTTv@Hot4E2TM-ePo&vbUbgZ+KgV zK9Vy2b&Ni=pjGR-W(-NmDrBIUjd1Aa-9`7$SLnc^#);kPUWP=($QZ|=457}~0!JT3 z)0^|`D2-0KpbS7zM4NmX=FMfeC}Dkytz`6gtX6y_?RuH*1}B9Dl!4(cX!m-N?e2uL zdmpNkJ;j_e)=TE$TF!|5uzbJblQ*ucI}k=EW~4FA<8Kq?Qd!nCUH}b>SBib zDR;ILT+~q~N4f4X0&eu;BLRT{RLd1t0FeP*DH~ZSx#b@H>Pq3;#ej+@Tka(vm;a=< zo-}F;hl$}~B|rx9U8nEPP9xH0VxrPx{X7v9l^tfTi?XK(6N`0ou&JW>LI-y{j3B}T zUL)wB{@D6+bP1G{z&52b@_6@1$gi64w%6$q@~E>ac$U}Lt+UFR=8buGViSoV(`My5 zb|s6!@OM9-j1~YUti~%h!5>y1)B%yFM5II*Iu}yk&2%M2VTK#e1m1cX=w|6pwezh1 zidH3&TXf)-r=HNtvU8r7BHs*+WA@aI(_8|*-B4sQgOKTGep?^X1pzy z$gbfo74yi-+%gIkpY`A(e}w!z4+w=ib)kr83Pv&aQIt6sHZYs%) z*d7MV*5T!kwlo71#Rk{*8Of40g9R7H>g~AF7P+SpfdY+?JfXsu2SjAALigNWARG3S zk6@a@;!Np0w;U;tXaKue>#_4H$*_ubpMJZ<4!l+2ZRVE1PFA0!FZ^5rq39N zkaIP(F#FNfBWEt~Cp={`+Z~OJw3cUtba>vl{y3m~ewd?uG%3%?I$&-e{Tv zpBCSwLQBmyt50YfiJgN{>WcF{*-g6_)GYPqGAwna{b}qdoS`NlMKAkvnGTDBAB|t5 zG$ZA{z&onCyDwDXdFv6dP$iz%W{!up=j8+tsfStFbgB6qY#G{b2R_f7AK{lN zEPo)!vLj$m=6(l0Kp>SJw>XMpYgjNaS#aVPD5HzOr5=NeRYI;rm5|=vqG&K{`hD2J zQVa$)D+Lfy_0K2e@+yyZ-%K z%eD_p!ddWf-K=D~+3Y_|HWQ>N-=`usKvuHVq5pDS-R1&Md-WmfC}~Y)=U;;{234>o z)!h9?!;V*bo70|zcRqa}NYtxmJ09y0lsl;~01R3YEN}#XkDE4W z2l(vWb=}|2SfD0Un<(nHU_{6#Q@IY_aY8T?bZ9mN{4Fku+GH_4_y&PUDh@sf#l{&QHtkcbL@|`Iddai)qy7pxr$xMCV#1 zRj7Q(5`qx}Wc!det@L=eqy42IAy5{u{ESoS5fvZ8%-gdDV?wn^s|cw^E2NBKutOnp z6Hrr-j!`FB3n9W!l*2kChqX%QjnMt!8gudkb}zF=r=wkhd`2VN6!=vbU!{4^!o|wh zX*wy-d5%~IQr_EfPi)xC1z+`+Ats_bb78Q+=FTp=_H_1oK@3m{d#s)7e5sAPE20wZXux*(fE{dI@)ChY(jZZxre%bmi2Pj2N&{zBwu^DOA$ z>iY&C5}$R!O}~X8awTtZNc1N!=J?RYVh8S}1{O&%9IC?I@wK$oKPuaMdF`tVOtv4g z1o};&<8xS2B`z4Bw1V-E!G}mJrZ)xNqz<;$i>MMY(`c39iQA&;?a*gP1-JTu$=$UV zIxcaA@Q%%D8DK;eMXYxtL)(xTaH6G?Iil85(IK*z>I(`DkN*Owk-AOWq|{O!xkvI! zKdl;mQ-ykJeVtBcWyQ;Uv}5`%D=HD61*p#OcCXOA5YX z-Kox+@>!bT1rZ`<#eE$kx~x0=e9L7MQf&fvW~lyCq9<0Fw=dXuOy!{iG%4)Cl5XHj z-17O|`g^EM@)pSmJ#@bI4=qZ9k>s?=!FpA*|5hks*pi(s<|_{%!Ei(>ds-CfdW0j# z+z-K#ZiAl5h9io3{y0Js#fm2FcyqSrg~*XVzHa5>-S9#0CBaByh=Yv{OB@ANCjaC& z>~z5><|2P7)>Md*WKTfyTy%KY6M(}D?#0YLZHlACvhk*8GadJHbx`ERy-fO=VTg7- zJP5@;2SbWr$kzs1N;)76BZfmsL4&s4aKj0VIgGHQ2@o^3nP^M5ojdt#LZy6=xh#ux zCQ_e8omv8th%`|HR;0$({Q~MgBuhwg8YKBc?i(b4>DH>7T5vat%n2wm$8lY@)3~KI zJ;Z4h;D?I$R6ZJ&@*$SEqgEM0pu{4Xc840Gr|E_;;@2%)`eV(ykF%$D78>jTEAD%9 zbRvaQXxbW!jRX4?t{Nv`@e>1$NZr_PKKUZh;6=?RUH5;El6%|Tl9pa&-*>Z=N)fG) z$U?_pc994M)(@gUhfqnyCfi*#Mli>%0=rK+%9zOiPao?E08n2=YfNBxYODq_CybYX z0<3q=(%=lP>a8peupXfxq;&eON(v@w5#Y&sC(^4m~ljvE$(23ngG6SyG}bN5(Ba95@{k zWVaJ+YY$7g@EvM%#(!jPzzl_;C=l>_^>c6#xVR6JxXEhDnihVy6lcSAa4!D?mG8*zgZe&bbLi73&<^imc-YsH1Ha4vnH4 z9AVoc@`?N1Gb~YD(6M4)!V8)Q`_#x41yOwSC_^-&e!AsNcZWS|3GF)S%m3$A@4NQa zbnQPI*)WU=C{+Vt<_V`6@z-@8=V{b}1rsuXgeT=`<~(^&6k`k~}~PyC({QPvoxI3FOJy;*xj_ z*~WTsv-MLHIla$y7!(l>1?vshy+PQzAFi+~EZC_A^|JHJ3lS{&*%*3+Vj7t&xItJu zV!i(d`;dfHFZeM$6+5Caja>{p+pOdXkQ8i97&0w&1x4Ugm}`t(E3-;?51HNLhEy4$ z8Z)yLF_VunhabSwF}^G67@V2vmO03j6gP(oLMACEH*_M-Az;4ax-W7Jok@edpWz-Q zr!bU1PrEy)!t@7;+ENN$ve&uKDbh3uLx&@}{2|lyz1ue%cWy)BQVqiyDLu;&L{-sK zwn;l?Ok=No0BjhT&&8UJA0olg*XAW61=etH0rN&ixHaw6mJOats*iXbR-rjwXS`B; zPM^_05z=yA7OF(+`Tgc<1KB~%zK_uUk0Oj|xG9@eN?DZ)31l8~g>1R-iuGESFnbuP z8;P+=iagyZrn2D!HN$WdR!GCAA#J1N>!?2!Byl{i8_7eZh?APP1v$%N!N`K17;*_T zM!e&L1$L3U$gn5~V^~$h{-_$D4F+?7l+1}jL`thRQkJ*7v+hncVg8@oFFT`P{|)>K zOTDL@^}BfU`W&?~eD<%9PY>ALKg%~KsmEZgJV^|65)9Tu&ZqgjWC2NqV_pc2I#D>p z$9>vSpTNz-*`1Snsj;5$27`yA6=whotq1gN0>{3(Ge6i-5(W10qg|kUz^!b zStz}*_~_GM?f8I6y%iIwrB~dcwW2r$(Y@d)ya6idn67`hB0MhV$hHca0IKj7FS}CK zS<$Jo%DRM5k6<0RsX;bM4n1AWZzlmeR)G*r>y^NzZ%Mh+X|fRF zGKnkE!C^;|Md`#bJl%uGxXhOnYNdwqLt{zk-KoeHN8HJtqWa$2PmqPLElqPCX8VfxPZir>K@$YcGoP)OL#b8c?orTZX`x{R>^K}}gE;_%EZFV4 zOR3W0>^eCWxf7EbJ*@0D1~;_~1iZG(w`a!gM?l1G(b{~3L+5~!lviT>srL&kM|3!h zk;recfIH$t>6M}nUJ#GhTw!e<;ITF&Os8iFN|2|aL^+je;OxjO@GzHWn-ZlG8_N(g zq0p<4CaBtA3;ZS+WDS@b3<=yo$RKvY8CGI$BcYIpPhJVNBOm60?}43@IzE6zT&LA+ zvI0f6v}ELb07NZf~* zurxVVH7;GlTwz;1?@9=ktHUWuQ+?qO5~ve!z-^;>Mt} zDgblYIp4rZWhsYC?nm<_ws~?-O5ii^`>Q=6jQ^oGLwujeM*!03^Jex7uK|?oMNpEm zpYD1yte}1&0+Um}0efZ_PbL8a`8P149Y%kp2C_E<`HbTQyVa+{KZgx7oa%N)wjUJ#pL$&qEh(=Y3OrNYDO+B znOHU^^dwO*_69ciEA#Lf+$tW0h73xAMMyNusFbK|Zxr0)MX+Y2*eYSXB_Rjv#61&4 zw=FexDv3>R0VXu8KnlK>d90XxD$o5Ys zg9pc8-BAq=hWEmDmjqRjzHgR%r}UttlPAL>!yL#Vn6IdC2fF(%>ib0E}6 zm5RYdq+U)$_Lw$BQo#RxpqMf{*3To?zvYVsNmGRGK$8+Xyo!XizrmpgH;{gU8tZEs zWxabfgmngW;T`5k93}Ho;>hKG*3@8kX&v=Ut_KwL~t zN9A(=PV>A|1y57#1ud^CI+}DpDs#P|j!UisK=w-kke}D;CL|*=6l;20u9V*=7FPT2 zjl>!s7G35yZm&iMHoXO|;gZ?1;}Rk7{N^qtg-Q2~8GD<{kaTw}`>%nU4wn8@7n}btaXB84OTi~y*wZVW_3rmp3XFZ26R46?Iq9BD)YNn7 zl>4!6aeFm-gHSJ}o0L&HKXI4R3J;&%`NY+vhwc4=bTY(TolpzUnr_f6*=`W~f_u>i zJnM1`sVzcs`+%H20K|=Nz~k4~*bSZUe?Tmk@`8Na8TfbP3|I%Nw^%4p&5gPn-k9E8 z#ait^Sbpb9%a%8Wk5Bq>mGna73IJj8-p_$QBKH>T04~)H4c)rL_)WKhe@hD3-Uru-A0Uf7WCMT2QA%z0?}7+OAf1#JBhIeNRhkh?hksMqJPE3&NsXW{P=&YpQmB;==$|8VPmb6y`BdUx zlxi!&WX-ZAq07aZsG(BlPm|EAL2En{yxv6x`6JMnA35y;$i-Ke0CsxyVM@t2wyCTT_I5bI93dU zNj2gQihNWb%%#ULVhb?m&V!PP>$l^=BeG{YGkSv8!AStzG#92FF(I0~vPuL;UL&)f zm^00*gsB6|RX9%7EnCAy&=;dqX#*~OE7M;B{xOVxz3+y<9~R7xp_1N(PKjygin&LE z)(*+JhI^BAJE2vVK+TSO1PE-e#*h7PvpZ8u+nK zH?;AqKzcsrgm2_qSfo2WuSZ}R$t^U>@U4xYzm_AA@&( zHH+auNJc&k_@GPoTy7V$dn-agx;=8PM)8C9Tz)N2i5t7s4lCk(bG~nHko1=rgAury zcf+}B+Lir5(dFyc_$@Ig$gtz!X+u}EA5N_miA4L?D2UzgX2$yW-8Ti05xfy2fhu@| zySZ?NIqxSn7+8`K1S)f|tYUe7PGiRlgxV^d?% z?q6Vf1fD|Oz|HkoTLK~?Q_zuA)B*Gb{Pq|IpwIoQ`@L0cD);Jzf;+?HHXM#;tPyas z+zU7pEXC929>y|Kydbd&*o0{gAHwnqH;MX&=hj)p0yaA;)_|>pJxZJo;Z%pmDPV$k zvV1_T0&AHS%>RHf`&)Vkn1-XSdbe)K(kROszTWR9D9)q~;;kt>=qVmp#kw-ySO$72 z5GL#ejCsAuOaXaHL0!TqW;KduP9X}Ai!5E`C>UazIhfRuy+80oFnXe?73G8ZP)!;$ zr|+zA782vg3rg0DlL!EfIpP=r4P!bt8o_+o;|7Q1XjgWjscdt2&yNy|*qIj4E-3L< zqQp>y9XEt|x92}XI# zqux0y3T!}|Bui=BljvRT+xG>(f@QPLAo!Vv7e;m5Pf5cAf$fqQfj_E#mqG>GHdtlf zprCd)5F4Ka^6RZ>GJd6y{(bFjUJRsU_Z6E!A`%QW9;TSONAdu`E(?J}L*T=&m5P(R z4z=AZ#v|PL4)BX|<*~9a6Nh7zRcd5qo{zil1&~-PJ>ZW<0W-W}sw00^a+gr3MiC4^ zV&vXP{o4^64w(Rim(YVUiOMj0BKyUmWf^Q48cw6QL*aLDih0I zM*izV@5G9OlY}Km*l2kdUQ#qnZsIJ#i|4N^y~T+DJo!zTEW8yTfTjeyexdSHmRp%a z6VMC`HSP98g7Zr|;Hc~PtVE#(pZz>QmfQWY8#36{x;(tE3ex*Q=VDIW2l2oe^$iE! z81<0u)M>oOXb*uk;-6j!9Z7ogOQ0YyJfp!h9%n>!ffpB)FMQY&4ys`}krWGkk@rp& zdOJ%l*%xa;BzHf)<)-tCUJ)$M&o37|uJC6r>c@i0xgJhHkUO;hd){FG0&S0YaKSAu z80qb^U6*DlSl)5ChRH;)%9lO#rbqTxi6d?kHW%H>lL(CTShrg|pD0~LiWF5+4h0R5 zqFbV#7#ROC7=?+gmQ?u_^npKry}qH)2&rL;M8_)v!!1xxvqs)2C>VruInP>ct}`2_ zHWKdi`m2iTs-jh$EYHyAw#?dE0(}yk$7leJ(Onzl zVZP{|B|2?4#9ol;C2N6PR4^b|V?veFAxS?%fZe>CxWc39#4vE3| zKN=Xj%y&Y-_(z`vV=YmUKsT!0+tj~^WmpF0Ft@4fqyS@-;vI6TMWVa0Kq*KXdEzDc zrei8y+VU$I!Wh91Fz9i5M?E6E+sv<*ZxsZ}*eQ2bj)s}PFpUo&4HKf261t#-_{=Bg zo2((;@a8%%=5eKevcD%#HcF^YUHrpN+o-pRoFp0N7i zqp)3ORR3acO;rlVIb@bG^yoY(Hs$0r81hP{0biVL0i5S&sufQN!j8js!A%q){-Vh$ zU{zJiaY{Ns9g;S%rtOOm-f@u+#>I&A&1UhZ-fc=@TX?f7KyLdUL2On4asO8h&bdFM zN{qKvbzhHu3)oZrF(*)mJpNMIJr9PvHuRTw0-{T(3xwlb@XPT9uKHxDkawfAhPdTb z_tp}o`8^W4!cmmd04}@|Sw?c~MNY-N(J)Xw1d;Q0o%K0CJ`a5U)|@+3 z_JMn^#Dyc=?-)EH%j?c4_lNM>(>zQ*_+H;-SKzduCBvRzC5V&; z;-sAj<8n6~2N}nRI`5{#X>Sj;fu-Q}=rSgM!IIWh5FwaseANoZGcf@10W#*G%S#I& zT2=}Rp9nOP2Ipl2jZbhBurW7Qy2XTn4;Xe6fWXUCP6lA4R}>;~u=BTq1)m5a@DP1- z=@q!AM`p_kVz@cfhVXjBYvdD*H&%XT68`El1B=PNOWt*(R3H(PppD`Bt`KK!jCm0S z1YRMunV|w2Pi9%A2}%Ampqq@@A@?_3N=$^BBhQ);hUiK;bbuXTU22si>FOxcAL*vP zJ>_sE$K!qO1sL=c{@9cgnSUBU&TM*^*m5(%!ibU<5sKIslrW(P`j&vcVZEWM&vc%K zsQh0;_q&o=C)}x!P>W-pxDt;B6h%=HdWgf<$_?!1)Jx3JJS!LiOo)w- zFS}n=-4gixqg*nG_P^p`L1}JLh>#Lfd?8}8KkL3!AWg(G*udycS*+4`C#i4UV9yEX z8Hc;k^WGp0vD{n~9sQ3WU|tbFODCqIjU91O5(>mC%xz%?<7N$(cN*nwzlQKNWZCI6 zn{=vE?o!qb&Lwdi07p2O4@(6dQ7gUELk*-;ifM}}m-{{frWd-gr&4(~%Qf9-7$`f` zBB@bWi;^0BfWwMj*4Ku6q_|-v>bLh$;6DkfrKzmhOKQq{F#}aq3!Zh9T|fgMLo|(% zjE2w!K&&il9Eh-1F`sBJQD8zPt$HAY42Hb*b~iB9J;p<&)m-Kg%5?MC z&-<3hlX5!{UK?3&u^~b!QRsPb1Zo$O28@BJPogO`cXWoJafWwu?tf|kd8gZQ%3q=f zCvCp?S}(7X@cbR0r@%MCGeO@sDSLRe`ByAt=Lg`J5!_uKfwUO71Z5SgF4fE48pL|H z)Hy=LP$xXTl~)W->dFIDAcpeLw=tBYmvh-2-boQSgBrLm6s2;VrOX?)Z*S>`X;5wJ z!G*jLzK%EI<|`5p1Zk2sUAkvvkF3vEKO;I9(PK$9BRmszHA({s#I3HS6mc{kMcyP@-GG1 z4jcfgj=aXIqxD$G9@<2CgDfKaEg=(t4fwMLcIK$A;Bs0R;nC1ei5UTa4K!WY(-tn;1BN7dykq8z2-6`eQ0@TWI)ukh~!w}b3Y z?L)9EhS|R0rqr9&^5C!#Q?+1&IO1IzTWx02#L}p-IrrD|NGyhR>@8_nC~J8dAZ{Zd zTovPcwO-cQ1@uL2Vz10jx8znm?wm@3UYwRz^62pmnqv!A z`YHfwl-x*D$qVs5RWW5+$)^_>uR7_Bz|bpxY4T*qoi%lw8QxBZ&=Ztm4d+QxU>^Yg zEN}~!Fa8NN2IeI0aFo%n>QEkbQi3KTVJGW(%?V^shfB~fp2D}0t?0C|I-iRZ0sDH! zWe&gMvnwJ5eGrW&#<7lV0BUev(3d|3R#t-d6n+X+NTDAf`L+sPFkZ^*y%ajbo;s`< ze)v)KNo%+>%kO~BAmlLKR?>?4O~5p9HN|!oR$^wEdlGKo?Aq=mQYR^|;ui0Hw=U0{ zXzE-wqHOsJd>72d6xB;k{EWt>RBZLVtoI^B z1-C^?2$T4?9V(j|?h*i+bjNyVx)QOIts+MQaNDoL!JlDGnGXU-^ zT=9F}xVYB*LcA5_1@Mg3d0L_!B@BI~8=D4&vcY_bm28#{MNahDf+nW4yXD4FHr3r0O5n3@;qySp!h| zm||%6$A;iocK>sfk@ejjT(RJ3e{m*TiwqJUKUN<=Yp@oF`EDhbejob-pQ2E|8HM^K zZh8^~d#hP$0!G(!_yUe?@ZB)J%T4c=vT)ToY7Fz-{l8p3`MLF%sQSJ-6RfSaxq9 z5q=_C1+U8PShnI)5U`To3$^i0={ zgdT4?d5@|MLR^cWsmb$JnI&S#0MP|dvQj}_?*Uj%*f~2yCq0aVhu-I=7!^9xjC;A~ zioFsCnuScy$z?V_1@7nOZ-bI9!#|g}^HLc7GFS@0$Gyd3(*SPX<(hteAKWr&MP6dRyC>rgp;hnS}{0Y&ZsHX5*DTIZp zB`}nY5mf~Hm`uZkkJl5G&9XaNoyGl4P)&A(|IGDL@LM&UPn@ir1ui?8?*fiW;iNco za?Ook%z`4zkw4X_Cl?x^pnA{9wIF#$8zKdB{M4x5emWgAeSnhZXJzas%K1=TbvQ2# zQygg+vUik&t}bWbS|X*%JP2?1LWxu~{u+Vj#o1m_>I*zeU+lg&R~#3y5!+jU>?tBA zh@B1VbM9ENA|4j8wSan5lH(dbX#Y4R4WK~%Lrnk>lp&>Hb{G8K%|Zy=gnEl1_<- zD$%&?Q9{#nzuDCOky{4pcermPDWJq6x0$9pl$cI( zqAZgKFE;>}o+Ajy0hPOL=L7FqqE69MNN7owR;%#XQV2UOQ)?AR+|sS!J%rWQ@sGKU zQAW=qX7;p;6}u-T&wEzVEx?kn429HIz6ORiFfU{nSACjC4!!8Dsy>H0F(>OxL% zMBVGT4Ct;*QZi#1E;MCoGBxwC^5M@EC#gi3BFOx3L5~^ZKva?;5nItBkRLK-QP%UGWz5 zX0Nlt8GbC0lS%#R=iQePeg&!^keW4&WXPt45Gt0!naO~WS33L=yI%`}VfzoCV2cNf zpvxkQLsT$`phuMOB>2l|Wdh*ku|SXoFB5hMqQwC-0Eb7mI|buhY>2@CLo;&KDF(oJ zyamW3DZ{#?j{0d444WXxQjbBG%*;AyMAamXbhYmm)+ze7&~M_U!O!$ro_H$7k|$}S z6Nmr~-b0-{fU*6I&2L%8M(3+35bv!)Xfs3%sjnrugtzBSxym|l2yf-v)77PtoP*fs za2cdr+w@#+O>r#iZPGoJ4#~|ADKM`L5=B&pnsC?+q{NFLqmkCxToaJ zEYXoWTE)5u^kJmrfll_+nCvm3DV?3D+QJaQPZsv29MgZ{PF-#dm_^;=?T}k=^B!}R zEMu7PRj~4ABa6NICz^`IBUH^(X2zfkAkJo7ms0(|5NCk8QkjHRtNAz(`bZ1(mEL$t zckQiZbNw4VUp|AiQge?7Y_wyHiGkhJ-JIj#C9fz6m(y({lyxJRijSwIs&ucSA@w-9 z2!XNGxE%swIK{T3%7Z!!+Hf#%?%tP&se&cu?sziZ8B*O)!@c)-f$J^}wC~YH$a7z6 zk7d)s;qGElE80>N(;vD2Wv=9o_myx$s!0c}tNhwMCrPaXnz65TPv70s3FzR;DIh@B zEnwkyOir@If=+0CcXqvNr5(UKry_Gi&SBUv%U8!-x=fm{v;dh5D@7z}S|3xblNc*8 zL5caH8yGqSlD)>^+=>``n-|G+Q+(^u!7>UIk?Bz z-fGh}NE~;U7>lzgB$~585H-{?Q6j&b1Ycwi>>0O<`I}XpNq#dbNL1qSImRUaq{I%^ zM8jQ=>shLnY;NZHZja~|m?GQS|}{1 z;jWZDUX9Bx8ANH)Qpp<3_BdHW>tZhq`@+2YU4xP;y99{ID@byLzJa~yiFLy{;a9xp z17)W*z%Q0bQI&hU5r7>>-g=d;Ex)h~*Bp)!OsH0X9_9eBmpsK&4C9kjqOZ1Wr43VV z@#v(`P84#uQBfp45~v98)V+oCq=KM_NDtQf44pJx9Ch|4D4R6OV?MgKN#6 z0`0f%b%ak50IvOqT_3 zeu+W1g3p7}U$tDc2$Ld04-=Oo+Es|T!uJMAffSZ*bUw$#fGL!l`G?D{i$u;g0w&C5 z=q8Kz<4A0M)02uQ|HOZ>!4{fsXFAjUhft~VfJiZ?NHNenp08bP06bpRjV~|=hc6`Q zsC{aafyS#8U{;Kcc_B+Y<3S0)_8JvDMmZnM;G2uy-eN=HcyHBRn(snuSkJ14J{i>n zgW{@{Jt6g!mB7f4Bw)hH$$)2S6^(;Q#&_cyGc`&~vL3;Lwz?guMH)jQ z%U$P_Gn+fTMYzb_Hs1oefEKx(o@|yWUa`U&8tk-a3*x3&t{5&ycCYn$-DtlZw-qKacilSb%j6FT%4pZ6b0Yu!{w&H(3(IL=08}Hry4U30W*Ct&s zwK8}g3f(8U1Kd&&1&fO|`?Vqf<;%b`Vd^TbGZc7+7g;$XYk}YuG*fcKWftL&fYTP? zE%oKjPqH&?;ULGM$gH_Ay6gjwomZsI}S7 zQU@yfCjL|?`22chrR;vGMZXav!uXS#ZVVIVk%3}p4? zBMd|o7wX2u!#Vt~>hl?yLs4U?@uIt|^vCSF*jF!w{Di6W@`&<&Uh>DK^{RA$Cfrkn zSQ?OMk9Q`j#CmhVoemL|xkq+hC9Es>`!m$Wc50&2O@1#nl}NhfvAxDs<<7D_M$lB} z-5sIFt9V?*M@nvLfo3Ob`5e^aJ!+{#Oz9}5_@w)F5in9reB#f!FGqA~(1%JZte#l?OE_=?hil)F!CDd>On8eRyXioQov(5bx? z+E5zJiAWSVN+B&u5#4UGSey2MPerG19hi2NWnr3 z-Xf58>?8abIw1_%YYV*Nj{;Dm<)`|=g|0i*j4CiFII(QOE~ zRQ5>4&Mr4jy01rDr7vHBnnghx;uC6CFci$Zx5BeIk_HXdZrdf%5wY;%~FxPQOLcXup0~CRH*h_e?v+n<3pLEG8 z01}3VudZQwM`^L#~H^qIT3(4`sT+gH*<{Q8yjIL@y0i%H|mC z4OLGJQZ1_qQ6VeoT2G>xnw~z$KENrW?1RGCiHq77m||aGvtWvzkVz449#DkeDP=7l zR@umlV^JAM1G#P?nA4;92N04UU%xFdom4O)WA=hD1yI&sATqLoyhIZxiSK@Zaj-)O zR3dHC2JN0KSywI0EydWlpNx=}MckH%z#@XkTdbaNxu=PvHr>0m1$}E5^L*?3L9EBw zfkOz+F%^$jCMhoKMp_0ByR4dK3-vU11%)Lw`objK1!mYB%92}Jok-TfTf}h+mmS4%2qzG?0gB=y5GC1 zf>`6#-Dtog%2c2OWIz)!D=jcF>(eSB?8|D~VLr-(0R4gbWkH5j#;7F@8JxWyjqMrG z#i~QpDN{C?aepy}{47DG%D_f}y{n#^1FI@vfSDo?)uA?C?G?@g`xSBs_!mw0<3np-qfLwl)rww96#ob< zcg5sWINM}caMRc8(jobtl71C&J40^G@CD$Fagb<%D91?X#bqat_SzJi;c32+0o5+U zIK`KVQB!QgJKYZ4qYM@4W8DO1%{`RfH=%d7fRL=xxI@@0L-QyL^yR=6OYCKPDX^+f z;=s`5@TZNfz#{%YvEL}m9iyLX&fcP#JvTTv*UP!oEYLeU1_n;f<{d3f$z$m#Qn&KY z2mq%nVxbm+N+pJc$63pg)Kv>7wBmVBp$Ed3--1IyJ-+C_lfnIZ3m6zAkh4`&*V$BU z5;|9qi5zdc!)13QMD6dWJ6nO2qnm`Gh)MljMpYOGt3rnKxqrH8h_MpwJs#|G%OvwE ztvwTs--FDg6`;A)**+;%X{6^;_)qwYV!lWxBfp90##g)QNd~f{e>Q-y@?L(XKUrBE zUXKI|zu`V0Oe!Qw;SJZL-ua33Y){pl-%HPdE~>7CEg4!2*b{b%e#%<#-6bZPiA2yq zVE3sYm9UQC%od9A&L^hsI=&utsl=z@T9@&yzt1f4L=~_3aC>+aC1?oAT#uqCI)R%W zN^aL%SH;rJRluuA$}~-(lVg7%H(diKkW+I_s|B?<4bPGzOkt2BZrLfm*rG0hb+Mc` zCT3w8^oQi3o4SI$<_=LZ<5GwyIH}QFjRA|4hpRDi){7m{2&62#Z``>;BvCIbgdNgX zY&Yv%TNDh9z8~z`&}g`BnU`Tq#1#YeY4Px>x)gRw zps7jtQ*H&eL@YqU5Zq$JBbwoN0H?8l6wO%Wy_3qtO>bI~+f&XA4GzF#wezy{R_CQM zi7O04^&}qn2q^~258~9?cH`sCqL1%!+Tkngw1qkt5a2hJo5O~s5s5okA%K<28u`Fo zf^>KueBN=IGWY6ySHRl-UNY}784R8vA(DQ$<+vXy5=R3DqVOT;cSOh79Fj7WMn2F( zs>wOk`*Ke95^4xRnF-{G+%`$98f5L$35>0{&LZ#CeZ^XsRb(3864}z*A~GN`ClldoM%6dcTf|tHlMbNCM>1(H=t{sr&oA(#=TjU zjMdclTrW~KMLNd|-M8H}bZjggzx!JoB|)lDtef52Sg!gi?E7|Z$Qolv1x(2N%jL+j zFO>z8x^JqaKG|I4$sX$V#XSTqbJ40z%$AaE_>lP#kzykRS& zrP=_l<`IP=w8Q?YYpnPq^LD%~8_dmokxJwhHd@J-B{P zp#heA>jlc7SYyl=dI!@Pph72B8MA-{^9Q}^sS8ov@GkdJ-TjH1B z`9QRR8mO}RfPBH&&nt`UEC;DsxR^}a6K+`OZcT{^&@fQUXQKjU>ubDvMHrc;uu5~n zbg^u)I2aGxVG{)$nV-ly*I3Y~fs&|60&NbH3eYY$N_1tHD`JDT$3)i%jOQVX>p4J& zbT&h<0SW_2o)+Idz5*786HMm%N^Z4rD09U{>eAScmz)f<^IMRU_Cd8-RY)V4enr6z zbUae4;Q}$aCVTC=^c@6=cQ*M_pr+bXuC)4$>;wG40S?d!{F*jr zV>M!c3xKB8Z!_WZVc^6`u>xfJS_$fssmJ6fad1tX2nYdI9hNniJYPdLFx& zfS`lzyA9w@mkG6R@2v67hd zh_o^QEQ1YTHz(Zl20KElh$mTFYTlMnVewgc^u9<$EYLSO(+~_03f`$hfFLXIGxOrt zRaPszJ;cT6ga#ch_j62CBqKbJ7|LzBor37biD`)~20hv`FsE+3zEcg-r$Zr zxumz(H2^o6za zLq0_+z@bb;XIKSK*1d6mVLsX5fNd%dfW?!bKk;Ndh*eCZ!3UnAFtNekX!^wYbZ!LD z!VCZ-8M`HMD#9YklaI~0I%U%3{#v?$W5q6PurFa4iITT^zk8ps=}1Dxz$^i;|;FT?x9lD>td|7E#{h>s0)7&Rx6UX&c;y` zYtm0!93-A(DI&Cvq->*i=Mtjl7l$ObS-p49Xsl^Wj-k*Ma9r!wib+w z#oPrB&a-pdjMkK6JCp0bS5IBhIunvqgdx8018_Ll_>oOG#|UEZtN34rN>t@3ud}Va zCF)-7)jY1r8fO}^SvW(mB5-8=u&bPqgIiOt?{b?3J}1&!RM4Qm>L{V@>m=9Bxq}a} zu3>8GvUm`_IKmImEz(${f8@8SeveY?zwjaubR>YZU?{(*!%Sg_V$CMmqFkunqu3)+hT_v5EIJW#;|cD75A| z8x=nSla#%yVO&Y1KeeT?!GBTpwJd06!g-*=u~8%`(8ZL28gGn)hPC0j1D9LiOSZK5 zb=MY|rzQ`lJLakj)Ix+U8SlA#=neMh+y_A1(LK*S#xUN5`;dbtz7j!Ouj5Gy+_Jyy zg_@ff^J2`p{vo{)vAy3UQx~;+bQx8RYyNL+rSbyk<>zJoMHWI zP1Z$PWCo1uNmqFhIZDtUDbAXA5n!-|ymCMl4I;RgRp}Nejz39W=|Ztc#OqNT)9WHA zVvs{b{y+s^X2B11EhWl-IT>kDQplh>0dPK-&&{p!p{L9CbH3gqcvu6{P@JP!31G?o zIL1JD)S7rpNP|Qa*Ug7H3L_BfnNdcZ!Lc2BfV>XHQhAUeP^_AA#Lh~%7~#y9JJCuO z$c((!B_PU2K7YGga_G!QCwEaP&*t$sVM}>-QhUUpRm%HpRW9G16FX4=vQw(%clLd~I*T4}u*{&$ z)W3;u&=t%xpN*ks>yV8Cbw#V(?;CgUDOX5P-sap_j27IxG+(xrTLD96jl-9*VSSCF z_zem!m@Kvlx#N8(4dDVv{fxGAp|3M6)C{B;Qx%l5zRyTm?)tYWow8NSpC6@C5d&ju zhOnaRet=cO3PZDd z>HCo1#IDGa7bao87^QJbj3vsvdx3;2iX(to;V;EK+{RK_(e7LcPlS>LMe=_dCcYrq z)Z0c#qN9Xrflx+D<}#EhB-f^%lSoagw+Qr3?qw_a9>X>AzPGE7Jnz+Ue2F6I^fE1F zD-ayG)SPNz?v$iZ_?sdv6(~xsKj!6mR7}wAEK#k=Y07T~og8@;PmY}#{bw1VK?fMH zAX&a=C=+xeKE*k`=H0;>j!27zI0K2Ldm-*-5d97N_f}Ok6Jtygu*eu`5duJzUIQ!C zQr7LqL3jXmrik4PCuyD_oQ-g0#9H0_U1r&51W&0?TW*7KR79vZR+a~lsr6n>s&lqD zkUGWCWy~FIL?6|Ke)~e6w3`}l`qZtB?7Q;JX7cn$&R_*0J)3`qv5ZrPrVu_V1uyW zBIXym$-29Y+lq`2Ck7=SZ?3s4mU}iN;yqUXGf$3bIa*^@sR%ppj0>b#;i@WJ5%MTV zNrv)vanZH-6!=Mqvn1U{>Y~K#oroi4P{RU-XVMlq0 z6512Mq;V9p$k1-Aw9)c(M*J6cJ z4oB@2a6grl(OH8JR8HroYN1CbQ{x%}v;kvuXTH1lqE}$XsVVs~=wiacpmM?lKNk39 zpvMHk6tn0KYg?ZsZSeEioOlk4kryJ2!;tEgd~|F#A-VcewTr#A55@vuBE*$XYNPI( z*1qWSyumsa#xM~oV^C!kA%!it5sDXnkLQ4itTw(?41ux5c9T-y9uK`|y_NZv{Gj8Q zzsn(*dQzV~CiS7s7!We{sZ0Xzz#479V+eWQJL{m%@pgW#--0;79kVGAIo$))T=H8V zN44mH0RhjqMx6_7i{F_a{)^!RgZcXj`M*__5iv;TNX`PRX zF=JGij&~=uit6nq>J4A=2Hs>cmB-IOvZdynBWClL){^coJqu!oLS~c5)g|ZBs({2nx~Mhf3ShT zO{DL$o|Rrpuu_^!kwEh!?u%uX+*rQi{z8CLSzvEH8#|&pHvtU;!4-*BK*->D-C$@{ zK7{*7Cf;jYtutx8O~k_)YBdm+z?C zMv9m^fmSW3Pm9B)sg!OkVc0>!@_KIu*<7-eg>r$mQxz_Wq6qTpHFsvNhNfBOdtX_J zkjB8{LQPbL@yX@^LCF_{-aN}605ort>0>|nO~7Qcm|tsv@B<13M6SwKH~<4gVQ-^~ zCCGSFYNm0Pm0PLEY>)mBUo6EjFU1mC<*#%v<4|!`T7-_ zqIMeqi|wkQv7un}#IeOGH>%8@nd!0|*PINy7>sZ$A!&s-|XM(FvW$numVXx76Z zm4vcjR$6^glYT`@Ig6n*wTQM>_*QU2>oT~Ck(I14)??etX1zevbv1OOc~&&ds5RSfL&UxxYVdh`jNl$J4HIjCr%lF}=2=0$Ip9&I9EA>Z!@%_D z5)-VGZl0N`n0R$N#Fe03sYA^|>;~L-Bz7AOz(6dOp%Nwh5pIOvro6!~Yo?>nwS200 z2pz1hO_!7J;z8?_j+0XWU7WVLtFC1Ns89mx+$lV>fBPyI9SiV^XH)?W$nJ<@hkJB-izqNO*dM{UY-cL2{Bnyut~|1o}zFB zP?CbpQ#ToO>KHRZutz3Zh#*U#BecLT2VmLXW(U=_~6uTM4}e%nyh`iUNQ>B z2gHI7RFE3k6zD*-an5Jg3a1nEq!Y80dKiRcw|^XKG_3w{iV!%|L)E{(tS^&_p*8JB ztGFdlgI>z%Egx^2YFaeKYd_hsS5HBxSmT0=3ruBYNv`~vIf~`V-eW9E4k_C&9oEhW z%3aci0fX`sVn!mCS&1dExxlDPrGaN=c@s$aiuW-WLk}7Qz*`uklkiz$CSH`V%vg)^ z`RA`OpsjF@o{b&cZR4noUe306dt+>HEwLb^Cc z&kRChU_$ulje_RGWA(-pg8t5y;|IqMBp1LN(*mi1#m zjSD#Uq-Y2s5`Hwe0Z_R4KU04}g+SMg2f|7GvZ z!{a=wyZ>i4&1kVaQWSgSEn{b~oDF4xj1ogen=xhra*jtpYMIojO38Cz23ime{l7p zfoSHLbD#U1@A;nPz8~x`21cLDZf}T)?(u`bz2GNz4LcWrF0nC)YLyfRZd~F13fl;2 zpD{G49;%V)p9#FvDRju^miBi~)08XCP@_ODPeec_W#qnvb{!vcpf83+#`x$sG*S@kK6_^th0? zzXK29ttL7N;DV{IbimoT4weC9XSM5Z|+c{reWgGMzmtSbRkueNZ{VI^E@W$V8E2A0PqhJFD6zydUaIKtM; z+Z}Z9Z(ZslOmOPrk3vK1xdB*nq(UgLeFpQGO+h8ZMSUGH0}n0J(isS8CYomhVA<1y zEmMm2ke?Q82F`nJAMZV#V6c-+DZ+dK zTBbF-Cp&1!d$!aQ*D&%Yvbz7cH}sSU6s=w)nQ*3vYRq^{{^JlG(d6tC?C$nZ>*vNz<|yK_v9 z-LC8z5|1RhYCaC~IV!4wRg_+G=Z?ApQ9+C2JFZwia}j>jDdj^xc)erJ+2xS>IWGAD zSjU&uF$m4rK#mEUm3v$uAc8{#gC&v?f(wm~#q|a^jDzW=9DwnF<<#+XLIiiyb-&w71DbMnn2R#V5~LJncrF6-Y%SM2ew*lk2{XS(wb*Lg%Qbfg1l!UX&6MjbrBk$|vPpdRz!n53hOaUn^pC!BL267F?lZmw&GX{nz9g3N?~ zU*1!c4~bn8+%VSX?L=gEXf86OOAcW^%njuF;ZK6dRU{vI)o>`1q{rq2FV6lzmj$L% zIMUV_Sbc;yh-yNMA`Gw*&JX4FQnx4KFK#P&m%s?`>QF$V-5@&FYpET3seJ$|)EQ=M z{fxVOpgyFjw;0Rl>J4-`2*}Y5+E9LR#gKBI!U!YvTpbGcM==M1ZZIW^-We$zynm2R zIBoUpY}$jc!ytE)#xg3wLMu$7r&GBI)ARtzNDD|(MV6#Yg^U6O+^ZDJvjr8Sah1Ro zbJS8w?`2_K90LufU1iys*77{9jy#PD2_seNOw$_Us+488BA;??f=Z4XL*p?OJop`l zC76T2WZZRQa`G9953U%AixZ^Zg(<)@*yy2cnT?noKVaawu zOLjOtvs{@~zT!YnF>8`ag)fv?lRi(qzuNKKaoWOxE=AfK$c`wBIEYm+KcMv~ zQSz@R^4Q`|%@2W~wI#2EFujxEt~Ne}&$WA`qx9-&G!pO)R0sE`lBCAUnPU!pNc4q1 z{E($yqmIfb(EkV@AWC8SyIlU#*+N(!6A4*M8E`OyCWeJ@1RG9gAxn@I zV`uD7eH>U2KcX56g*aV*RV5S>o}@uUkigrMJFojLT#P~}weMXjVIUG_oed z6&rHnv9tIXgByA3G<;@U{Ft5%?Leg_Or=iYms=QB$#j!gg*wY=)gI(NQ;l#Ao%zDf z-gZ+jl=Bs|Xd9h z1)~KWfD+BEsl&2nHUJq$o{e(Ae6p7HBo{mn3>dj6@85Dvp3^L=tZgQqxz{5Cdaq<`@%j@G9FDJ4@S5GRHK*VP)m6;rUZ-8 z9g!=%DS=F-JZ76=8|{i#JoWo*9 zbR2sCQ+y$Z(b`0?v7IYpx`zV=amu|y5eE?nNzhKDw32C(n%Ti4loyG`GCJ3=0kRyP z09nom9c3c%=qAU1>+rlXH^S$g6`rtd8Y6{k8V+j<6j3#B0M&x6eFl@kV(imndqw?OLT?qr@-b9 z07og>tH9PTHR7pX)BOpNc@Rv;YdCNjd|(DlAX^D-8Ma%h=10=xY5E~I>*UIP*#4+A zENZ~)QTQTQKQNjlSagpa=Jvr^x&P=m1x37n3`KRNr`^F9MQfb`tlJkJIZQrrKOvWL zURN*7VMlXh6P#o$zRNlL2Ify_*ZLt922c=~6G1N0lM%Yht=nd8)$MbGoIJu$tbUHH zk3RE^#AO=Mf3%lzJgSo0@LmUBs;P((yqIdkl1IA)WaWs}?j`E!CDV>asJhElbQ<5I z$Sfg8LcMt^FgZI<$&K9lww(*22n#B>EG=VufwWPt~i^e2?0qi zM;mM*gMQuqQi;ZN38y>cEurCfh>A19xmo-e4ai=jxlWS*550S(Humyb12)KwUv|j zeUH31$>7x?n2Nhjgih_GYaRGFoh43Zo-#}W01%#%&0loT4OtMIeIBBV*N2bb*f0)Y zW24cuC7$IBsUu|Hbk*J!w%DlNLy1TsM6uf4ECALu*J;!@o&E8O4wo~az16DRw&*`Oh0=}@t3A9f_b`r(&w%IjAaA9Uu!?w0QNakXEjprz_ z)`6jAZvwrrLJsKA5RlenGh&83mYYa%c7|SK^H8ElI}2u|7QNBo1^IF&3NUGIR*QBM zP5aUTB@OZ)EoX$1P*qs(%peJ2^p%r+l#L1J?yt`A_jYatYTSmj!JoXF;Q|L9hWBORm;&NZ;HmJZ^5 zib%(|h6OtIP6`u*cNg{#4NWp|kr{HWjLu$$IxJtgoqe487mgSVZcJvi#Wb31?E;*& zen_ze%H>NE6gYtt6x(tj1oZJGT@A&#p96q`uHQ{S9I;P0fO}ycla^`#Tpya**d89_ zR9VocNiH42cLO)WRFQ^VQN>Z7VFkb5{%-tTSTQ>6JhFw(j;}3jR1YCBt`d5k8|j#n zgO72dhn=OQEHt5Uz+E_uyzlG=0ccL`>9uvN^{{qsblOF{4Hk-EFFFE;!QhSxM|B)a za#@J?RXsUNB9FajM+pfj9F}@&m|qg!xLGhv2+-gmN?wV<9I0_{d+Y5ds48ig3p1TX zr!>wLDlkHH>yM7q>W()O4?yrr7wdbdhm#o~5kl6IEjYiAFfifh{QdW$^-QSzipBe< zV)J`3d$rmqn$=H@I356O|v2z@$ZXt4(yAhbTWuPI5+u_?vdMs z8{}+bEE{kdEP>_F%-MmxAuy6h#nbCf#=C}CQCNo`h$%cRa6VqUuVVzajhCw=?zF-_ z`8A+XM{s~CP&cL|3qo|-+9!JUbaHstHEUdP!Z&erRg@c*$Yt$pfmfrll4J(Qm*L~c z@^&UCR1kP~;UvJe-ZzdTf3; z!}v`opJEh{jZ8BCr>vbXRPGS7cel(PEP4A!CY=MS12 z0b79DPWKX`gzuc%*y5VL(MJ-&lEHXn9D#8bN zas#4d3$ugnU7?U(M=srqtTD=SC~D=nRS`D_m9Nb8qcO_?8%tGvUT@t|F3~6CoLn(? zAL3GlJQ+{=bJ@$h(fwt`$vAyJZn?!@mlqGF9eriNYu=`&&I-&B@~ioR=+M7TXEtU> z?#DT~0MYylP)AeD$oohDj^b18qx3D>v5gzD+TDt_XC|{EJ!`Z3&@k<;Wa7~MAXN6P zcg>N@L~-7^Bi5utZmvG13%=x{L&l7IJq6pG&vI}BcXD2~qq)>*c$ITrce|RL7XZe2 zb#JZ<7WnJJJ|@XynPw6YE~o9pF@UHc3wL8k5DdK4g+>oDgvQ=1ZI6|7Bv-^;Td+lk z$C??|67``|;5=7=qzgGf_t;^%^-Ks5*G)E~ID5UmvX-blzZYU2uux)fX2$DXQA>A% zFhv~O7d%=N}G8s1a{%k*>hFC85!-nckv}4UHEvzq>lK%y?Hk*bCA{#Y$YDa zB`o;{CEq1KOuMs}$Vr0i?5pC4?#*)Y!)g2wpItWwG4AH$;WQiUOkW^$+gHQJ>;%1S zWb^|wq`Mj2ds8{Jaffp?T@9vF9h#taKISOvKCD=ogU#FiJ558Jzj4~_=CLj%;O>A%5F z(k(heenD>>LxuN`u18WY9j5&rREro3!1P-UEfA73p>r%yA$3Lh#(K zVG9rUVH}VuH{lobt2}imxMezl*NlTiBfN8&oLfQ57h0hXbY9eU!ELBB&{^v`Vkt6I zSEpno$JUH!Oki1?NsdzoFl`wmOLZPYmdaE=Z={Sc+8*16%1_4M?p&neI=sV(1Iuo7 z?IH>%Wm0*O22WIrWUp<_<-wNe!RFb)FgcBjPZ1R+U0KDIC7oR~3H=)}N7aupxX$zh zm%E3dli4F~;|WS+S`ZnwH(J_HpqntUjxdoUj~ixUGat!~=eLiHldRC#A^A|I1Vcjw z7I{q?CCo@sNuPR&g>sVF)^+m}=P6)qP`-$&{Y%BlacUNypKZZgv{SH6U-V%w2VL8S zPI%NMThaZ^ku&E{osQwOCm$NDoQ=}Sg{bqypya*WB-}OI;kJsvQQd))Oi?cz%OX7$ zbG=GF%P~s_uWm;8mY@qKyzEC z@Xd?RN2wsm9RVoh=eyA{(kW00L{nnxZWs+O^C+~6OC7}0VPhmZIjT#Uy(&Bt9^Q=` zr7(6_W@k7~P~)cn2THyziU+DE%;_%5TAp5{q=!?9SxiTu7Jz@$l`8?0UTFgG<>gqq z0}D_X1;up=4+*hNQ~wz>$3yO);tUqrug<2GEGq4|nKcQ=sD@SHCA@BWq{WS)A`KdG zPY!S#%@7^2Rhl|V0RT`FceI_cBhKW4RV|CW9~D1Xr^ulZC{440oLvkXfcSbPPD*!( zV2)Tl1^A;E#d74vc?AQaN>3+ghi)2Te?sbwRye<}SMDtZ0m^#e!w|UAZDEz_Mcuw< z_QZ39loc83x1m=un&CbC;pt{XkLc5IA+PAQ8< zQ8eBDK&H1P3+MQu7)eWE{1Xi)K^hOvn){@V~hk? zSEUdE{7(Z1t`^D=0C*u@#!!8@L!)CWS>c&okTvFfpvO7vVlqtPgMR9#78Sra@av$ukPlgx*59cuW zQQCs&+$lgbi4RbDotK_frP%!tsK#`9S=+9(OwX&MA#ds{0EL zVyT+5?wECR*v(j;vYO-+Q7kJ!ysfhZG_@5SX;KCj!(Kl=T7=*=2|uHG9*H?d z&}fl??DlF*MMj5Obid=7dOSb!a#EqM{ZEp7+S*CP|z$Ej(mKH$u{&-x34|m z3b32Hb`9@8os@l59GmL{w6+qtrN!8^BiSuSEkw;Fqid*^MJ-lN zBri`C`Z(c+eW=mpLEFJQ(FdUelZoid&c)qw@$eyR2eo1ABi>;yLIpaRs~3H3Wc`C9 zhgDgKg!=>a7W7^pf}Q3=Hs#cDGv3uP1Gv}R$uVtf+(REsZ=P`TJ@xn zokj8P?cBI0e{s_-{DGS73fj2b4lU8;Md8D^IMIa`CjlfW-@vQdO4*siNy^46J?RLz z8%yz&V%$33MoDVdm<@G^GF8u{h*&PifgwnSjt97vogyvE9%*6SJK80QOy3o0hpZ-= zkUz{ONH{TwB^SU%ok?pUCwn&Ns?}81$~V_*a0+V(N?e+3j-|4>{%(y)-1%&RMk8f1 zSC~;cq1p;Tms`24anM%G3DhiEv^wmezUa^fL$T)DN1H>yp^K>KhoD8x3v;LSRBYqQ z1i}(DNH68$!_j0l3&8%_)J9!l!rY?UgVGHIxP0u0rTEX97z){f51f07)pwIvcZO#P zSroqmmm46@DoyrKnzdY`GixRAJ7rNJ;bZQ7ED<>`=mP+1>{sDV z%V1Dj1j^w~1q$~pJ7nYnO;zHc^&@T68hTxL3+ym;E6g2r6mEfG{QU$0N*6(V(8jtcz_&q_@LH`gpN!jAGXW5hU96&OYl z0*glqL4&T#ko&uaC!-FQ=(1Ireso5P$om{2TH9vQEca~dp+FAm_q1mkc-{A?)t`*l zQN996N|hPBC&z0U1Hcj?qlE27mr&zJ3h;>NkS>CWjLhI*Lpwr!e0W`K;ppw1O1pUn z89{$1b8)CPmmD8H4DFt|sKw$q)Jhy!uGSjK%cq9haH^R;V!qIXctOkOCO~8kj~c_H zx{uhpC|nc+5%4(|P*yVZKxc?aP!fr*7T3eA&*4}KDys$~{-tU~r0giJGcm;E(9{WNl6MP#5)ynRb~a*AMZQOzaR%WC0^< z?rg!4_$}-dw_=Yhsjdr|@|4x6%C}mXRp1y%?Y=$O+6XTP!m+vtaok=+ZGk=o4QP!q z0Pqo_SP>ps$Jz*ixzJ>IrZbdN!QD>7{KPgCg55Pyka1hr>8!vN)bT)^Yy%;!ZZ;%x zI-0gsQ!0F+NGj)hv`%lDtkX#A9Q%y8Rx0-%l}wEHVR{(xY*2ttcYE8Qb4U#8%x$tG zxFo@pODpmc%Lt|$q2lhxP)!>9tL`Kfz>Nj5tyE_eKdp)}CtjA+%4_$+Ddl4nYV-s6 zMVzsadM#coc0)I+^!d2!GmMdU;Bl)O!fD(|Nf>J?$5`^RH6!TE@z6VEvuu7#RJeiA zGYzvD0@Y?1+nSjrpOLbhOT{aP4Sl9z@eB51VWJ9!Qwuv3nSh`95w55ZI{W!P4f?Da z794WhWxM_$pOe-?qm(OLh*DlVHn?s6PNy`qRcefC5eiS*m!ZMtP@i6Ks=>Zw1}mzW z;+FNtcn!B}5hU6#j?E0I+(G!zh%$$SXeGPI0f)!m*|)$t1hyAQ#b^U3Fz?^gSu{!eC|tQI$j=F~!4rFWHqla|X& z$s1rb*?`(w!+h8;Apx%ty{C!}C&C9@O46;>1^S=bU}fqq@`T-uv#tQtGeSIyhf2DF ziFf-P1iw)4OC2r&3AvoEqf(CHodZ-R?4iyFXc0{j#mGP!I+K)5ou+1|xO1~)@R|fj zjul+sxm<#zr8ED~4SIs5_b?2u-br(yFHF52(U_}XPR5E63p(-jw% zsFh@$dx5->?`0zQx+vvQrwE_<`05X5s#dqLsoOf6+hGF zYuFf!Y87F8%)&b8hXdj6cyEV0<`=8lF1y6b(_BJ9Qb`RK%GR#vv5o4Ds+gjrR7T0e zk0|egfD!}v&xUzh0c5U+NCZmE*TM#QyhpT9*0GV&d?I_}i!me%>Rv*Hd$P6%9=^VF zI)l-y%0vD#UFp2g(>on|CXiv%CdDuDT!yCz984hZ)%n0OR_gs|wfnGcdG{G(-nE%E zl_s9v4}gn3;Dy%(ewkEVv5{42Uf<=}Fzi(gFh}fucAU}!dDc1*Um-xo3zmau1itmN zq1hHpengu_$b-%(cs&rMN$5yh2R4u5z0H$^knJ?|bmdkkT7d%;*wzyLK>}h3NT3>o zOROtO^CWvTu$F-_01e>Cu{f#0c?^0gy{J_X(uE#pO!+ok&mC@4dBpVQMl`Cz&15J0 zJv9qOni>h^QIx`f!WWs!$Q@4+2u9MOya#AkM%Vguqhc=r0x#eKGY3fU1V2d=k!OUX zy_`@bDEL8znf7rSl9Vo^^m;v;RF23297b2j70Y+Do#E=TVoP%Z^qfa~ZW^gle_Q3h z_?}r%fBSHYKz~wbhQZxF?C6;ru@nB`4!rq?GO*%0;NJ;n5}j}PU!~mA z7UimAFb892>9l<{a;E|Ro=}*+?w&YdBA_Oo7pnsxysx-|3LkJb4fW zT|p?@*NvxBa`$A-wdqi$61-Ap8^l%VpFerej(hwLXICSo% z=Q4y-ljx)Ho{k+IA={9Pj+5j^iI-=ih$yKsDxpfHFic$f4(T2XptfuAkdP?@8}au zx^Nhw%iR#t5Juo)A^`x7r`a&(I=e7&kx>64Pv@B&stC!oWatwd9bSU{J-|N6_l6=k zE<-LQ1zsE2dgq<)AOJa-j_at5|qgMvJygchjB%0oZ0?B?GGKGWuc|P zKo+VgK(Sz+1Hg^67|D^35kA(WL0{QtRy!c)hV~uy3}Bwon-YhbB}7b(cukXXQ(N8_ zEH?$`Ar`qdb!1u@BrC0;9UjvV$>aTN@f)MrZLTKWjRs;w1&+wr2IoYC1_%GWxd%{x zovUl4rsnDSX4362K({O}bdVtUtYum2=K`y~vwOUhs|%}3^OL;MQR9}HLEyd>{y$9* zO@T1hcT3J`#ntP|ZCAWWgcWg+=alUMUiV*ivWQf(!am9x&Q6U-?gJVQZ`3U4# z{cH#F*@Uw%TB${m$bQsH!lWV)E|?g0WX|gI$r1Qm2T1`wBh*q4&;@L~CNhyzOu!bJ zV&IC}L#T}PD?e~SVeM$In;1;knvv;VT}>fCP_d}bdv@hs8H`_)Wo?J8LNB_<%2_|d ziB`E{Z_l!*!G~OWy->QIs$xk1xJ>D;h|3m~6}VxqZoH?PtX{y`G}vv7FuJG#7!oy5 zks^fhR8&>U6RJj2cx`8TdPEzVvlqER8H!@j60|}kkK|c>BN*ERmb%g%|8&ghltP2A z%sY2$_mb&8G%O^-2v#_wvlt*LzfPMWJRe38{x)Q=;Y(^X$ac!rOY3ms!L6N&$uL;LF0X7F zbE)F;n?72*hN>x*HqS=6MPk&4Ja-aJ5f6pa>&G7AD@l+`HD;e4J`rC@iD7S*t#qsb zFp3dE_If;}d#GrGE0o_!Uv8^)0io=_Lt|(|8!ynr0FY1n4`rat0^U-+!s zuiIbl(c?NjLZ;pdB+f?6U~$XpP2`K@5-R9cfu+!;$^pMh+*mqfglROvi<}jcy*TV> z%%A|A9)obJp3uz8X0qhbbgGKHTcDi>Qz@K+?ZMN3&qqDHiC(0FKWqbOog>U zSM0AFT%@Gr3nUdjC07WueFOz_B;?~I7*wqS90XrzV~N6#!?OIO zD&){zR3Walu9KpQ7Cyi?H)ww1yn)E`P7S9rSXvJmF4zd>5_yIycs7+@JdPM$rk$KU z4LY5sFQD_-v6q8j6zEYv&u`*;xTgjM6C(I2cioi?jD6ZWS~}^e2vZlHM$={Ypbp8e z($*U^HNR-B!f|u1vnu7))9ss5{-*2$#?wvFjz*!3kLMqJAnISIWU_q^ny09aT8%Qv@_dQqYUvP#OL%=Oq#yKcX9HI-BgcFct>bzmi zAfa(~>Il`f=r-sI_W_? z1fo=Hm;0BKfgV>Wk<6t8Lisdr*ddXI_;*4@Gj6ntdS%9#!)QWSmngX5DXJd&b8KR; zH1ATE`0s7mEdWz)bu3u9v8w>6{0j|~V5;NpQ80o0tPx_!fVD(CS9408yUBO#f^N+z z1?}!I@GSV@IAl&it*r~CC1|BF%{@}xLAJGgaO3tc>}7Qo5HFpHIOt{_Hdps6Vd64@ zh%W>t`Iqd0GiHzet~ltT{i#zEV*dah#l0y2dMYYL2ns;GK`4JxWSX%9c;2Yzc~~n| zHzhUt&4lYVvf=~@ZX|p#r>2lwa!N64O}A9w#?4P>nQ~#(0LS5m8u>-`lW`6!SKi!4 ztp=plh(>)Rsk+OgoXIt;&gFPUT(Jvw&0?tU1Pmc61?JCDHW%jKn3=^U2V?kO>`(?1 z7jCN(hvojbbGlOO+6hTs!76{+{^ZK0iE>mB55J z${MLD*(q5`itdoMG%NN6plV349wt9~6f~+C&$%k~|HMb$f?F-;TnZ=^l3c#m3&R}^ zO^#B9AP-l6-qr3$Q8<>VuBtnGi^)4)hA6=h)r~CHIScSA$UZ5;TD+MghI#1<9w$7q z^4`yR>7jqavjoU;gV^`z9fh3Vo0Vni zm{V%T#Uo!Ar98$Sy0FrG0mUNX$~sQYf+obnvVH1)BNcMRC`yT^yW*ibE@U0Kk%e;G zTE%AJ8LOrouT8dMdNbH>(H3MymI{XU!O3*$uo`V83Aai#`Ol#$$t=^=Jpi zj!rrF*F&{*gV`pnRh1agz)RPoh#bMFhY$^XqL{AO`sC8IYz%IE>!i=zECp7ubwiPuVOid z7)_%IC!#B(vAU!hEwaiTSf#sBv~)Vh{Q_+v{ldJiZXqM0FOOla84;ASMlRQLYi#z> zk9F+eh|-ue>-|MNfc4Z)FvvJ@Zf_NbVu?eS{=_GO7KNbNgh+@0jTGGQ%wKJU;D$yFLxgD+NcS$4_?rd~OTUaJ4|lQ~RD3w8DXStcJ*O#JiI z*ps<|QleASl0LP2^i=tt>^0@>)ejUpZB+Q$Xv;K?hdGt}j;chU^ULlo6QUvzH_}Cs zCQgk63a2OF9YN0agK&z zU;a7<$NgQ6P^EIm0X@vZ8Hq)3MwNJH++BPb0JB^Zz^GMHb3+yqbAmh0F#636Cw|0@xwjL0u?4xqP1Zy;u<-=x~PQo2!~!7q^S9T$?6(bEdS^bV%73zTmgP^j4w8|&HKfjRcj`%sM+&Xy`O9bI%Yl!+Y7Wwqz5e2fzW zgcXt=7TM6DO<_%Pqr9x1MX@!E*J)2wMWHd|rZS-R>9IqZ$k2dHpG|9Ri4bz2I>8bN z=8l1G>RTlm|5Pl=6@;5&5O@BA<=4Ae2G#z6?Uj!HQu0}+lZNNI>LbXfHXAm#vc# z!?HVSG1YssOEYQfOBRhW&rRLQzOZsOxeVqOKTjnp5l3I58ci)>cu`*UBtw4QDTeI& zyPRr~CA&j85p{N<^K^PjJrKFA-WVpD&j;1QVw07-qE<+JiH~z!d!B|CYE^^H?Lv77 zg9!{*b#9!}5l!l!7-D2ti86K!E~}(6wKz*UwqdT<;@#V6hGkAQ#)>WasB-}6{7`J| z9v61H*^CGyO|ET&e7o>g>E<-prsY`zNmqSl;+`-v3g z;sZSyR~gN@9Bq^kJR&kn4u<*TpLL*(ruq`txkr12+Tx$Uy@zxd-n|EPgKYT%C=_@f5?sDVFf;QwzL z_(VLY3g4bh1hsa;UTOjV$Jx{0+n#&)Z~wwYLcEC4{agKIivM*HH>2eE@3mZ1R%egf zB>#OA|C~-(@`fNinX+`>eSIVnr?qhXg32mKC#-d1caCp;+a4@7+j%K&LcB1;cNjiz z=Ht3d`NZFTW?w3K;!%z@)L3NWM&3ZalMLkU_AOH>dkGgsOj+oLj_-f!H5>WeD!qWs zLe;jQ7c%_7>Ov>&x}yktW`W;4*H$0r$orv#lSuJao;Z;W@iT$7+KY`|-T8c{9{Dey z=EG-O8(BP)BzDbY!6GeIwT7oY_`O@~6;_kp#V72_R*StbKQ(P_0Y9;x+r8|EEPV}^ zH(fTx`c~Sn?ccaR;&(J~{@rdbSW|ery*anVzHe{Q>uvwW?Cj#A#RhEMlwHfaChbcL?H4`jQmfM=d~`i8-#fwo?l$h6D8};k z&`E3F8dxD79uM2S7FlbYI=#93<8#)5+==5F+V zzdd2!F4%t-CT`qrU$Bke`gnpB#!2o5`m8f+1>H||kl{x?rux_bkNt>682S5CK1L(= z?*sc_+FsRf4;?a#Iq|3tQU*AkEPi$II7;?Hx3j#eB4VsO5r4;Cq-aFa&G9pO;%41N z-CBEv*DWJg0|@*Ee)u(kbbG{pX>UW!tp)pJ!BS}UceVyOlZZ)eOaw(loJ4lO!k@Q&$3`L#A5PhDqWAFYt~Zo<+KNAAjY)gG zCC>EfeD=5h@>A!TZM~8fHyai4Vp1P`3u5+G#3af4rM((CUska96l@i8{>D;Uc2gh< zxWUodii;9?%2qqYA~T9DByZ=vkKv)MoD!xVbPq^DWd&?FaDPL!!NPf-;veckhDAO!Yy{6ZMB-f zM(nKp=8nLH?Tp^mjQc)my%q6?botpxy&r`pw=^HyIi5!3-iflvm(kM0X(h6KMQ9`)*5q@3UX&vJeL|kvhnqv{cGIbG-0%+Z%uavACR$o;Eif06JV{ zc#QiMKZSk|p0r+}4nrQ*_8&*`{8;?adHct#eIZ~Nio#(Qr>jRr?ZtwvC|Jia>zq6= zIe3qST2D0FtrQR+`oae+JZv?One72*Eb+?xlwF#%NqOozi)-b-<-uBd#{P>9dlM^P zi3TPLuMO>F-HB9X*{XMHlPs~Qg2R{IZ2UUl*J%^Dm;b*!;i0)e0LHGI$FEB0r(c@g#9pWf0x*qB38wgfvS4+ zte?_6TTDcDD*;x6r$N=WqCJado(F)Mu)S}=uHyS1R59dV+I7fxdBKJqT20#dTkNG} zwAxxETyX$)%1-aI&txqpxZ>OW0G59$uKzxiw}e>JN$V|?y`O-!8e8;2E)Q7C0PCDn z0jsZQmj%+YA}o^y*YJ~l?BW9+vAXR<0m!wXklkAlD9Oo(g;xYyBZY|4i}znQA%9sQ6rQvu7|ScIdP&YJp2S$J#Xar9K>qbJC++d9-51!c zY~A0aZ7#{1c0yuQp0d#Su=R__G2Du8JuPL~QB<%!*BimgZ~=h_5OfM#J!rcj(l5bQ zKUlE61x%XI+Hdt+h(#S*-e&C8svLcJz_xC;8d>=vtaU^Ap_ssZ6@&f9r2Si&zz|fW zQ^{xVJ=FwUR6TyZ{cSm_MxEhKPnGz~i^N~f3hZJpb21DYIK^=P8p9p3Cyp2F|2~!3 zmdSv(Tkt>urXSJ;8Ssx?X1FN)=Qv#j4v;$vmveG|NOHft!UklzAFr71ZA+$WVZyH2 zb0qgxuB-BLH-zD&HPGfN`xMF^$83LLKSkNq_*)X|s10v#wM|<9&zo8TZY4B3qgZme zj=mE%c^BR`RC*v1zZZpCvaw9NUZ1qjR-^{Ru-=k2R6y+5Nn5j(j=QJbms)%oJUAo1 zsi*_O)!x+_!^Ul2rMPe}ko!2q;R!;w{ooJ6LZGP7uc*MiCs0x6W`-YT#HD}+? z*;GFXOU!WH_N(^eUfXuSngeTqVSmof+d}I0YKwl{up`|TeT5n? zVVe|-snubW)9H{MqsJ7osY%kSqnP4kMYJd4D@yy@6AzfF`hgjPnRV>C-c7&A6#=2u zHfUeQP97QO6Um*VEgyNs89u>!5rVFg8k_9&Fd@9!ic`o5v#3M%pWAPHZ98CvuEDBH z?7VLwrG-*RxrvVLDN^#7rek(r!rmA^yi7Vzpg|~p+q9W7rE==ztnIZ$t#Gy9%vE9g z22w;>xd--5_VeDrURtnLq(X=*>|7^=8dE7-k+uy-m#K=UoPG>r2-(BEr@;1AgrAg`l8)#nt@=$g`f7n3erOldAACxiW8%84d1E5-6=2r_bBSdp_6Il;?41$!M%f}r2A z)0gy_I91Z=;J~sC&rXbMx1;vSej7^K>yB0|k>NdEr^lgNWQ{KVuf%*^QMz2~#at5x z5~{)NvO4<_^J=OG1-k>cLd>{bydh+ZU~_uyBfHKIOjm6s64d2ntgP+ofeW_w$^0Am&R0`)a}d?5V_T zl9*|$USwThjcs<1;#R_t-6ug`ilA2}>?Zbj-+=vlpS}K2nQ@>{+zr#zwy*i0Q4!Q` z;uY>57uSVhs8y8WVjdUmC-y5S=1EtGyPq0Zcsum`j4c@GZon}w&`4QBpM|ofELGVb zQHC|I1slhyt<_qRH((0C361&$EsVL&6P;EncqfbKJYh>R~TYR5Kc@0&DS zAz@E_v_Bk$C8oWjoZ;pCiIY=hItApLkduJ?-Y3ba zNV2Xhsd63!M?02>VmZTFG>4xU=uhI zL=E-cyBsLd>UxY`9HQ}msnypPrP4FKsGGc~@2H5XI_)zN_1guz=_y1#qatd*S1Zri z=w$6i)`N)mpE6acwK`9kcsVZvD%aYIB4Rc!$MmR7^(9Xc#5WPdFYscX>BZDnr9a5g@uV; z^2awRrD?aJd#R%?m}Oi_({D{Xt+5wCuWdbOM^ZzjXCmugpst2wIji|d(&{U{gfk*Y zTh4KPRuev!x93 zh({3>vj)Du~08=Ox zBaj7bQK}K6-Bs3W8(;r*uf4gTHLb$}{?74um0|h4i?i0#x=gV=rQIp^B~GzhP{C_Z zX>HD4Hei3>XTQy#8mQK=A3D8xDo1`g#a>rby#NoBV$Tgz45+h1JpQ*RcF+pw^>p;u zh<4ktM)f|ni7ed@NYn)OYo_$UH0+;@lTlRktq(N(2=~EO z3J1>;wX0t|PL<~Fa<${qjgQ%|E7ClAJ$=Da>to?bt&gi!?LdUHyy)ivBL|oD!YG9Q z!d?rAtwZ$pdk}k*wP3)pWEOcF`z-E@wf$B_*s}FSypo4`_;L-go6*BtDxD=NGq6x6 z>OH53TIq--)e#%#S1UzDc1)F->!>OsEr@WMOrpuo50faDY90I0*=8cb-3a@KE)>~dcmsGpCE598`Qh7$zkx%Rt3~ zF2Jvpp+8ZuYoptdZ`~G_uQro?YvFc_CJ!J?b=vBb?o@;Uzv@dx3t_^Rqr8@r^rA#E zpG?gkGKJHk$nzo{jS%7DqxLo1G)~nQSyi+6(ikOVXexo{+&~^G&v-@{;?1kYP{3uV zMNx7q9{p;38aS+0pX4h zJ^glLpS`MFyaacY0z4UamIofHl7}p^40i~X&n~KFd6}2EHB9bT!~2cm<*@!H1g?X2 z+*7a&gd2(f%hqnOz4rD2l3;?Uax%3tSn+9nDiKWb01oI;yc{Y$8L20bdRZNC)uR2X z5;3U*suH+d@L1k{=IVe)N_9XY{FCc|Hy3S7po@)Fz2SjF#p*LFnna z?`=i#n^v#ii#=_c!6Hhu>246`eK_&`1;tFUrhBbv3nkZosorV!tfKD|S$MI`o18zX zPvoEKk!L#e*h6-~q;0SChoMcf*NRddZTb$JiQfvv-@YFkE(6Y$xEU>B?7zEc|H|@j zSFV$^OTtWYFsV$`IvUWZiGkdYQHFDf^Dl*+HwL6bGywZ-O#=(6+0SL%N0~%1n|QHB zj|@1B{P`@Sj**1&6A|1{ps+VVwDHdZmNxWWvV5z-{QB zNfa*P`Wy8|f9u9jdT0nAFCf#`ALTViZ_3)6H@d9sMur78@Vpz~aZQB!>*-+E!-hyh zl8;zdVTyg+#DgCEp4HrJ)vpD;Z)ve;sVACVuovIMnlI&`#*ekuY3oc_kuLB~x}X-m zJ}3~^FzQA1K{YOd`s)fu?ducv!d&kmA>7I0-~c_qe*~B>B_uvR;g*X?^nrVQ8+e!5 z1=R9pxFAUi4{tnfk)7x`*1jbew3m!SEaSJ|3^VV>>tnhPTthgl{-3A?Xb5LdsU4mm zzrO$*thQHK!yzsrW#<0oWAT5YCH+sf+UQ6EZ#tpcwLI#XjrJg0u9+6^Qa_?h+`<=|aIGHdgiw%wOP9T>#jbr4 z2W2Ej&Utwt9=g@J*2zixOl~ok2nf*Oot54Y40JV5jV!X7k@tF9_eMNw24I>jsFjrzz5kMk-R*YAz5QbMV6*^>e9h5&y6x0!s%#vB-{zi+ zPkop@ULyE^I%yA8JnIUyuVxrPgHQ0wKt zObv`0cH1{xcyI^YqX8#-OTnI9;B>kwO=KrOw-2+cukP2ZQyFky&}ZE=y2q_>ka>n7 zp$v~je1?dY!|h#3`%ndLnbN^@9VPkjDU`&sCwfKp4Dly~=b&5(bxXp()Q^r_6`j?Gn$^R9; zE59uH{}uLdC-R+*?cV3Z*qD57c4sy5qtcZ3$$vkFQfbOZutm?Gnbn~uKWHBdpt;d< zHU-yLUZOZg5{tK;+S+_;rM1Z<;hA2eC0o5xTtDlyEF0MBh2Dj>UgLpc6+%Cb(3oXf z@dr=4MN=BDr3M>=S@@~KD%VL?#j4iL6D&??s?0wZPy6zcr}3RflCU^#=TvRwWE}FZ zn!c0$eGVzcm(OTDELVH%^gTG*^%Z*aOh2RL5|t}KaT&zv_Utenh&cY3uznS5>KGtf zv}D3QUy$)h^r{CzjY}-_@!NOx*~LUoT_6}=^xshL+du7}6ZQ{*^{wg+>^+*CtkhW= z|1fRE7wa!wM9AOUCjv|w;I_~iBynG|G5aYm+T@*cR<~BI%4l)sW31WJh}I$tf=TkP z`N(s^I9|f8TLdB&c*?EV$a{NjxL^lc#!DQ+vK*LK`P^0s2^$xz6-4P}attVVe=50_ z0keyy*sX}2ai2wZ@4MxpLw|kuSIE3MP#jX1D8jJj7W>5ULTEB?)04L80N~Nh)F7C$ z&PCBrGEpfqOBB6EQS_1{gNVN>pTS)lta`w{G~V&3J;6&u6+zSJzG(F+Yk$OQ3)Tap z%@aedlN;eKCJMeE67x{%z7JT#G(t7+$}qWtuUPty{FK7)v;D?h+2}UzZA%;1&c7pNre+0vRT;x2@9384`L^mE!uTCn;TGZ|6loDIZHIn;p%Q?ZkA-MMP9zF zNBh*}D0Z>a8%9UiC?+6db=jlei(kCjRnGPX$_&r24O#24dPq3 zT}Ik-bx{b^59l-wqIhQKP}h~JqCTqHtM#cvMK*FY43JuGc(R5iLqt( zyzzuRCV`a#6cKsy6dd9l>yu?Jf4wQXXz$ng+$ac&F=txQI_aEAU4Q-`dm1A@AOW^6Bg`R&=^1$b!v(?KLt@5I` zfr_HfErF-kwD7fvCVuM#rg2`9_}WVVP9$bH3q|AV0{rf zJ4!-=dE8@bmcvF4sh@LPLh}`Jn|0->rf{#+Ivzd{0vG`A%YL+uknThLh~zbARu2{Fa?k zai(=yXxdY>S1#Cne*CpZ1|7Fs6`2qtW(QDmN3R_$*o#|UtCc}p`?JdUNN*LIR$7t` zn6QDIMUL1_MXJYkK9hyy>*tax-9h3J@>yTB_2CB|J@n0YTwyg06xexK5spD|YL87> z^bWftXK$ZyA?mFfe11G^?dLPOX zgEEys1+unVRzuJWO7te}%6r-`N+n@sgz1MC6sU%F9^(mis|!<_f__ud{{7%2(A(SS zLi8`nA^Jy0?4R(^gZ8*0Gc-W4v z-N8*3nw|n0BaHp&yiL-!a|JBAcmcaw+WL=i!URD0LV;xA`XIeM(`Q-bEPWU~p1m5u z78BMtvAe*M@3$w4)q11vuw9shs>4c{_)ZSU*iT$vn)ik{);^bQKWTLd#D@mG=4smyVe96DjU zo#n$nUkV(4D3LGNA;6`Qv^mp1C28x+SygsmcO_?w0}&@Jb{>!1%sQZ9c~0mnX$zl> zpGVSmDa#>g+lrrSj}W-NXgv#$Sm&`xgtq9VF;#*>mo^npL zM)Q?gejN7p>0X;E*j!8K`k=2=e8M~9=!(-&YF}5`@d?{W^qw5BzqWrn*r0<78?7?~ zx2K4t!F&whuEZnX{o40Gb+Lu{@*^CA$@7{teqzL|sd$IIAONsJ&O6^H@0|a|B`Qc0GE(eStyU(wT$~ok{S-k&4;HkL2xHleS{gu6Se+ciqHF zRfLKUx9qa$E~fHB=@jaT9AGNXuGYG>=Dmxh6A4YM`Yz5~73|ZcRil-h10}y~vS5U-7oyOH5>_Z5aV-Mo4QqO_i2w|@H1y_;t?#kigO6N z*hqH_qf~bLlfXXavG{pm+tz0bE`B63gq>g5!*I;U3JWSUq7)z~-)D8&?9hH!**e`` zrIQG|2k^*G*?&-KT$_S5ZOz!>{sn&mBiRs?HX3gXo!H28AV6zZ*wpdD*9HNi_`$cu zzjE6pfCtwrZE0@a;I^#SM62b&>;Z;Yqgp`O1xAR2&=*)gINs zo97JJs)D_u4@V5rrDfMQq)8D@Ye{Mhvo&dlCQ`Uu4m&(qoIGG#RARj%V_%rS!V~02 zKYHZ5@A>|xYK#^PuI0*%1fLbQf&6G%Gkx~So8#Yn$5s%Oef~2@u3NWG-Ffh3-J1#r z=rJ}};)wkQ5UQan)ReRy<&Kl5tf&>t9DKIV7%bRl%nqZVn^2^6{>KRWz< z)(+byKMz>z#ce3y*tmUdP|4j3!nT<%Z%Qa!O}&ef@mK8ROH{Z2mi8Tg=~IDO>nD%n z9>_RAO!eqcu-l>o;Q6PE_RS*o#LY!}PR2N+BqYA&VcGhSufVF(Nj-xkbFGcdiX+*4^BvmJsj~lJ8k+VY-dD5D+ zZdw44A9n}wZYYqdy!IM&{386S1~L~ay3GfCaP`&z8;M%%0NYQ@C^p#HCvE*c&5e*e z^?zP*F?rXc4{<{T{;kuN3PGz=c0MMbx911;P8W1nXy;|_HM0BP;cd>tU24o$P(x(d zHFogP`48AQJDsGDLM}_47PEgbIIb<9EP$;STVr0wI}Z{k!>#!=tmBKvRAwKr_I}%- z)c9@Mc}$VL|L}qkT0wXRLk=mIQuIT=GIse9>XuK~RR?KjdgI683-bBa)P6RQUp_jq zsP9&@_MbS9-<+a-+m^9iY?gL@cXPE+?u+l8zr+j07Jhx^i1^htVGKKAKXv>HL}bx#BemmVEMEaBFgXv^c!t%!hja~E zkT|jXsOk^z0@Ut-5w5l8X6%)i{N$o=jmR^sYD7E81^j`qfzB2p%(AK z_5Qj5xpJgB*PD<>xB8&nbdY^bOmMVu;ixfK@T=ll5{j$R7c|cA6vIiQNw$ zd#J=5s~au+Sc*8+WIriw?)q_irz?1L(}e-83M{kQJ{?BI-*Rx(C%9UTXGH9Sn6A!c z&)Z-2+e#18m(wl6gWKJC!8i=#Vq3L<(D_Nb^bx)jZQZ?z$Kkar2QcAkcP{$^@3oD# zV&SMW9J?-TA3ef%-S7^p-w0-XmWi!`{av{Fq^9&Ibv&JO08#*pZ^|Q-O|*j9yT>^u z$q7MXPNzjugUS^ipXkSFldTUY9(gDbTCYKt5Mi3tH*d6a9c`W+w{HwMGImE;OV-+} z@Y#(nMqjUmR~L5Lix%>j+jWGhDtilj`2|_~Bql?=EFl*lMMaMciGG1FY*IM^htm(R zdJ7A-3f1g>0Br5HHM@k{*OVjHrIeQj*#D%xSRuOxJ-Q>4z}9>5<_H$>F+i)Z=wmkB zS|yFZ)=K&i3RuYrt3D2F{e@ZaGTT)Fi8Y77En<6I zu02yitQTZS5p+p8R2F{Xfa^Qem`KdVKW#gmkN-;?XmO>9ZzwuPSokWto+=S`w}=Lc zkk3gF=igA)6ZYzYM(Q+dzRu3n!LbmgpE}-WpQbaxHwp)B(U&H^k+a7K>^A06Z-yMC z?IlUOywafBqXyLq*P!}al>=iRq?{bOg&tYKYPJVkL}4? zQ>zb0R*!>S%J5I|JJX*R)de+pLGDF@y>} zL94r;HGREcL%^1ZNK2n>5E-n&u+>3`l=fBY%;AQAPb|JDMNjb3v^~DNlxyrCx+Q)6 zm&ZQEZFBru=$Kf@7JldLDgta^Yq)95**3?HFcgmLhKv*e10Un~ohKr~?v?fe!Pr?@ z+q)5A0{X%9yVW`9LId^Xwl_8oN1C+m$wHe|Z{kr(1TArMOL{vdW}9g%U)*Mx^FN=k z@HiXw64&vrZOa3ij}rz+k`;Z;`XHaopP-Qq4WxaVLW%=nze^bT`fdcuF--Cg1euEo zQU|P)MWcw)(dQ%{?K7;niy!B*crrzXUGjo${KEcjw_Ep_3d5fZKT751-`sjTF=db0 zomu<*HPwElNmlx#hJJa?r2C4%pNsw^XSGAjkEzFFEth(}@$Chh1H5+IOTFXrN=kdZ z;~PhD+~aJq6`qfRVcW=g^e4nPl=U}jj~6GzRdc~rzGQ*Y;FxTX8vC9Dc26?ySYX3-Szz>`{x~; zEZCX&X=|2d7_h`{|92^Wq}5h$0udPxfeFDjoBGv+K_Kqt9C9feh>0%UmcIjeSOFb5!XT>kIbailo_k=|Cv2b8D^r)}# z4duUDu#fu)^Kw69_V+2fi}-pJTl*yz7`6wQyk%KF>%v&UDC)h`bG6|Opu5?l6>y!3>d`{Hwwkgcb1gwI~ zIb4|Wn`DXOFpD$uDCg{h#E<`Cmp+h9Zfq#=D2&4KVOx<>WGUF?_vCHUJyy>k%O)NO z1kE5MrQq$bF}qgYm}zB~-Vng|!~OW+6SBlzK5kg zQ9`4ug+}M2fNFdBG46GEyK~K5veZ?DDE=C>YTV<34p=o< zTcfCrTOC|#Tw3GSMs0P1TcEa$T5YJ>P7s=NlzP#1VFyj8JN+ zuH?(TyybaBrG#Cwq1Qf-*<(7ugo~I+A->q0bV>+h`=E+EmnrY#pw}8cSFz(rPCF%m zReT(`rbdQr+DY&S? z{jpn#D3Q}zqXydiINqzkdwXq8f2SDW>l79;!pCg|oaBitSu8ueCc!r)w&l=^;4b@_ zD&FSposGTM#mi1DslQY$2ENIU#sm)aqiz@O!$GS=((4K~$uSo;+GXo`DI2|#aFnp4 zgLZOe!#%hW1`@PjTNf$4SZM`;s}{an0B^`Swc50;WVV9Ri?E%-zw5%ilH8d$$;INMaMEPfTBCcg?&PGh}7Xwt@o4$_h+{ zj}b_3J&D=KZFlh;is(kv~xV(kMsKPt1a!J zi3@(CqandsZ{WmLs%!lF6{_xQEXq`{K7Booh0sYXr zsRokw(Cl&bIo@#rl%a(-fcWw6nDu|1Yf=l^+rSv+C zE^-jtUkg(wx^*PNzi!5ORiKlO07O}-{H<0hdoA|*H@|l8N*gT@l&j_&{7ZS5R6txz zD=6qmoC~K$d;5D@iGq|@Pj`Fk5dBnqZGnyN$P~VLS{559BWZY~$ zPoL9kBf#H8?hF^j>Bz0H*O|(b`)0G{uOk&%#lviNb>-fKKARbWGz{?0d7PG1(B2?z ztFv3hMK!UA(}@L@FchMqj-_td^l0qICvbQ^WS*I69?MVpV+NKo6tSwvC50R`Ob7`=Yw4Xr(H+&?+kFwYW^j?8ExHS}O{x)V+VLJ&3H0 zKjkbZP}?-rxM%(|WCIa&ZDlmxv=WwC;TfJyWg8Y)a9S~b9MMfFf3}lGjQEwpc~BO) z=~3Hk{(e%jKoC$(vXuo*&$#Bb-1K)RO!Z|e-}fk+1Z@wUa|Tqob52pP6T0RL%W1G` z#Tm0j;4!Qq$x}uaH}wR#fQM6lN{g)mD$(^>qncnT+T=*e_Qe`nh8aWeE1B#r%S=To zZM|cn>l^GZK1jqwU}Uj(vqOUR0Pud~lh)mUCo8o(l>!_cvzs~Epcn@VhjKgI@BC!1 z&FvMJgD6Diia46mMu}&5x-|Wn`N4yO&@)i{)fDStFk|IXHnKlcNrm zJtvN|Rmyux5_X`!&8=ED)Z?T4qkN+F?QY$xweBJ<>3dGzJH}?VC0Kg3-4|#7kHxtk zV+WAiI~w{sq$+Ovd1K5URk1+7-R(2bH(UN1o)#7*`NNeuDPP7Z#_~lb+nHk}b9Pbe z2+sN8_Cb|z-G|G%Gf5x+)@6MVST60`sI*V_)x2r#;Z_>EB9!E6z*5z!Iy721TXiU4 zw=xMIHHTNV@MCaw&u2<%|J2fv6ddN3{xU^|EZgKU1Gt)r|~S&ira$Q};aaVdMjFZ4&7EIw3I3s(%< z1U%7DNzH!CeNsT6o5@A@#R50*U40i{wkE4Y3*zGEb#XC-@Z*bG^AR4Tv2W#ticxV)h%#`XDN#kd%83 zdpE7BZ68y7&RbIU zoMSeI;pTNbmkIT%!wERs81a=Kshn6zLS}miIA@j)D?2Rp4Umxa0bX403$v;9ukq{) z-`KZk$01H()L8zHah@Z!`~_IM+w#AQfFxL$X~;BD>DYMq)1DlEM5+GEeG)*A{wk}Uw#b}sc?O)bW+<@$`qA2nAEAyz4Y5GhJ*T$af$5&t$8}uBUa&!Inx0?$|%piPTA8n z4wgO)ES=azgW%!pFRv+>hQ#tU4ejH5Q$*5YyQw0LvRkyXvq9YcT5r@^uVh;b)uwR? zfq1BXsNWjh#%fFKc~*O8%x?F?mYWi)8vu_|)S21IpA`2quupC~A-5gAho4<3-u*}M?ykenmstc1VNsA8Fnaydkp19q<+!cvW(6`&$EtaDAH!Mtx z^{u$W#wa*Xh}qG8VDjrlI6mprMZ<^Q*1VCz=DrUUcg+@4+AbdO0g8xA-&)gc!>N;@WQA7u#)(L}A}+9joiy z18#D^5GS~nGb}##$8W!yfylSH5PUp|rzKNywBZtOo36Ktq zAES-WQ~#|(bChOuX#re;WfG9&AS+B_+Pjb^OnNdc99qJWmIkUyKeErsK+=!^+`vJ0*&z{@MFYjiwU|lp%kyXJ zpa#=@5eh4#>}p5&oXax8gARsG6T3l5%sD9L=Rxm~z$8%k7>Rb930Sifn4> zGdBd^p@Jb5(jtdEe0^Q$N#bv{*^%#ANE&dGpk50$*o7r_cEo-W0<*D-VnWiOTFbsj zDKRb~396H5_7WvQcl-Iz68oh(4d7`9ElIs(XUXYv?J3VlfL0;=C=E2X+g}s*MExAf z#W~r`XB?lKQY~!2_S7e+)MtuPpM?GG|H^#q%rtltLGqxBAr}RyX=%!{lvhFwvv9SW zYix1K{svmY&@-A0Ua=UKcDy6nDnzt3+Fg+nYTfkO*&JLB?<1Vlvpo|Is&IyBjmLTw zN{(c}q&s!_5xG51qMZ1{zSJ7NG%$bErFKo0_C^ zTp$1%z~(VNS}PI%yEAqyL8`c;$=>FG@nd&!j_iue`QqUjI@zbw9G@JGY}F|vSnlf+ zYxNwm$mzdhn-D>sZI|rGqkb!Gw|nTRe5zx$#113e=&ht5N4qI>?Itgunqr4Ya}%Y2 zP5mu9U0wj~v+;PUa^)lWbL7O!s3QRoqFw*Vrm zeXxbF+v5GT{`0l|Qt2=EcI!V(>$luNTi%sy;g6;#2rN&K@6_Al)TEz|*``;h9L%WT z^Px1UvvN9{Hrjp(FHxupSE<5C&MM1472~z0jH`j+u!V!FZ(XWST?7`&b6IW*A;=(j z_+Jv4sA$P_<8ZYTdzKPK$Jy9Q;@pIKzg|z&t#O=PS){{ehC#nMTCU|%)(ijs_Ir1; z(L5Y1D3dO$v~@0$tmn7teB?V-R(*-{tE2nK9Zqz)&UcjN!P}L^m*6PuU;tHZrdYesJUx9%ScLb(Jfo zXup5M&IuD<7PKY0@6~bV9veq@Gdpy9%D(h9R>Kki_PZ7PsKYur&)q7gyp||Kd$1Z( zWj??O2V#;KgSofyGtI;m z9e4^HJk0I>O^T}YCG!oIYWJfl)>XmoEBWhfBkl-Gd`Z@;l)&wIz2Kr3Cg1a112gf; zZ*2~eY?a$hI{i6oVE0|Ua~Gw&7D(DTC3a|=+xRt(x(z{cTu3)J#`}|V!rN>fD^@yC zkjVy;{M!-MGa%x&*-O{g6_KW{Qk`#o1t6lu0^4(e5Q_sGNr4lIh`L(aWIt}ODLzAe ztuV$hZnJHr)SP_ zYdk}1ELdZ?OKSLL_AQ-m<&_V3cH=5O+*+kO>?SPT?QBCE8~g}1je3u2CZ9IZ$e>qk z0`oAsZFLKix*DoM8n4-xVU``WT_SN?m|^MK>Xi)8sa=!R4F=}2z38_YFAQrf>#uvHK4s4Tg%6d70Yg)YmU}xTaSp^og8KoM~8}QStqCk zFrjm7`)ssX8;nf_jZb#^qY-P?gCtHAB9>lsH!jTuAWpW+gAmogZhnIhD8?>|K|jn( z9Y9{|vLMD>xajP+)p{Zp)-X8Us7N$C>s7IktrB%uivMVsMVYuG8A-f3VXsLd0`c9J2=0 zbIzdI=ByKAZ6H2{gE)J(yJijE+E?FHR)LJz@U@=Z*TZ4(L)Z_8toj5@ z`j7Q?wo7p#qN2l@D=w+v`Cs#u_HU`6id$n}A)`#UMW7yMx;$6NgluT&Fyo-45DsD6 zh!X`)&cz$I_yXZQWJNDI+om2-31-le7wRaZ^h%-^lpy-sVyy%k-Fp8AZ-v<0A4U*b z#czz?jEb(pv9rR-+dMnEO<3iMAV{jvz7>*~PG|3Ce)s%3hWgo$s@t9OVl4kq%~NJR z0+>ALT=xZO+d`y%gu5ihSS)HwTXt~WAe|h=YUjG)YdFal-$J2jHbp#KcRb^|r@^g_ zcCNc7L-+A=nH1lN5Gq;l-)1gus@ zRTb3^|0rm$s=E8W+g^Fv=2wUG4$A6Wn!inx z(hFQ|J81_a_dm(;8hhz1Vhi0809?bWOuS z)g29IpS4+<%a)%cyuf%nr|j{=(e{tVa_&@ew$nhHohKk#$l*~4<+3u9b=iUs?-Y@?&N z>iv~%Ij#FfIB3$ma-QIXN8x@aX*ox3YzC&ifVVt+Fj1o;^>HmZH&<+M2L-5q5QPM- zBq;`%`+8t>8+=`NwFtBZTQ|W5=xDY4uDE?SowUFt5LgvHyTh#!)6S5S;7_o3;60*L z#NN>YFD2FU$+~NFoIhuEPOtGiRDsiLtd?0%i8oI?z>*$+27Y3x1U<5 zgre?3jY2!D9Nh;tJz_0Nx=`hivp$S9jrUVaNV2MS!ex=2S{dizgI3chn12HB(iM_v z)=fZAR)wOF&K0<^@xz-r*5k$|BKupO)t60}p$*NVFZFU*a4;Zw0Bv-SW{&ax{Qlwo zp57|_^+wR%RZHfv4r{vQ7Ly?ku-yCrzsrDv(m3^v4c!$=t{%u>Fc>FLHpd#6-Kj}y zm@CKlT>-GXtplElXwGLJ&++D~SNLc3$3Zr1q6^vg(_UYTHH-$8Rt`kyEvCl^*$g0ja2Xdvve8^*OzOg zXP7>Yo1tg(mf%(Gf=#Nb{2eKe@3DVUqIX@z>Jx6|x;f?2YWro%?(i!Nu6tCqQ_HWA z(=Lb-C;cL%=?zCP7Qyn{K9qa)PnkaKKiF|yX~BO z@mSy0y5Hl26xs&0E^&(#nB;r1aG$ihpetET1!KC>tm8WAYVEf_`!qafnjP4Yz#9dT z#IBQCY>=Uc*3|W9-S+nhv-jJzI|_CLNLuw$Eg1>GuDL>M>pc4es>-*I>$dyy@%BYe zgQVh_GVAs#x;ardq5pW;{2k(buk*RGO&RD^ojjB4B9#Nw9M`*KLrlpa-&NB$9+ z4-|6A=U;fGFEi}*M|!n$vK7_`NI`|z8vL)5kFk|I$X4o<(wzMrO+xY!7t3Ftw- zcC<4D%l9_z!(1G@j@k=^kit#at{=jrGs3*UCw8PVt(iMQm-nzri=+iy9&c$#+IeY6 z+d{aGYb$Ke7{Mxc#@>C%MZP~>>PflX4FkQfau?*^abg+Tw_yqOUQ{q8t(=6kvfTDK z-a<}V$tjpUrsAStB$>w%c9}yyPRh$9 z4~`K*?i)>rze{1od#a8%)Z@F&qCw`%=4TL)AC)#8=MTN3W4yiIxWC$2ZtzN)v652wQy+@WQX2)RG_vTB|vH zZnIHu&B3UHU3}F_cCxVb$tF1)gtLB+Gn6Z>NPRd6;i+A)m?Abi*4?NqIbwUe1Nd>w zo}kk2uCl5k2+c}m>)Z$Qsm_f(<&;~?rXZygid?~~`CApab6sc7Vm{m&6^kHPb_IDs zbtB@UWXB=AGQ@xfyERiPin=DNC|`4Yh2;aFX=1O9H*hTCSjOALpvyT`cQs>dpVvE} z0n=0E6ForUfX&?v&V;4rGjom0_kdPRp5kR%{ZeR)qHjMdEwFoYC~wFY*UH3@8NF{~9_;1vMC4dd%2Yv&7CS4d(|bxA+Yt9?BQv^$5?f!Cdy zfy^0<734&xe@F3`I?BTtS?rMvjPyg$KjdVmxYJzNk4(jJ_6u1x5QE}US8lb9?PNMt zzvhjPa~&z!_GobyK&)AP8`xy^Nr#aSQrZ^-65_%(SL7br=SO(67qrioxTa)X2TT^q+<2YYNW?Qf3Td`m8@ibWUM^<+)t9d6mqi2?WWA!*1L3*mi> z+gaP|%{+|W$$nd#8P69bZ_=*kIE_Qk0OVH}UxAoo;|Rb?8#&0~S1f?ABiLxUFNHfT zdK{ZRzrmialS1g`66?nFzu;%?^EMFN2Fo<6VjlC>qwp8YsY6@tt9pkr+eY3OiZKc! zRcDhl&pMB^oq~OYHxJtU!CpI-I~2T*AVVaxQs8e2R=YA%C)Kgw1{_*ojqP+QKKTEkQnoPFdeS1mur81(_%>EZ>y!m` zQv;sgVi6(7bc=lzck=BYU+DU#0QPoy&(NlAD>zY!GnaEnzx}oJ+ZDHH7{pm*Q;Z+4 zv6>y)r<&uxEw(?bj;V2KKcAZ0In~V`=B5WaY+9l>AYnFtuX_Xw8*KkuVT~?uy;C=O zcJ(@T?lxbTF^wOscZi~g^Y{cynvl{&eexbQGpSIcoLwDpqwyCm%7&4XiD+uKhtp+U z5fUbt*jM~W(^xx{#pXdqvU{qik+QFs6eOp~o=%`W^jY>#6=iN=`wGQi)M=sY;1S)8 zm`ffcV^_W3zWq+D9A79=7M;9&IP{XdOhL-#@`V#NE0Gl8o&eI~@-hs@C?S{0&K0eI zjT9UEY>)2lWu!VTfdSnyTUXi5x87>UR`cyYHROp|V5+f_qs2wPp+ zB|Nv-W%X7=Z!nkw5TzpSTC++vju`Ls2f=h5&U*QrO3Pt#P{P6&odh`4a1W56%(YN; zv@_W`LBaX74ycT_m{V6`-`rgXM_BVL?fl!tidq#Ap_>zwWD;@Q=lUnDU95$vS9 z7u4bS(o|i$!w}^Hi)Sw*bnlIA1sthtnQq5CM=hTt|1+|&o-Z(Wm6SNBLC_SVjxwy0l^pwoHE}PQ7r2; zzfuT$=_-X3%TPt$Ed-pz4q5n_|vGdsOjVY^h)*NmGEroo=GgAjxdzrgEu%(KQrA7qVg8+yz5qO%zGIb-2BLM3b z@O38?uB2!|FqeXss)p(LS*DNz&cG#qn|@bSLW<>0;9H)%C97 zvu=ly0)-|7k@zZY`(+$EcYx;)Ph86oCbD<lN z=!h~*8dy$lCX9a!#+y#@q7v{5%&fE`M-UE}q0mQNx#?Vdhs@zA&-UE(R{7Gi5 z7?qQUNwKhB+-3?4j<MACaA^$7?!^yoh~nb`xNNXu z{>rmQZW1i)8c5YLKjU&+5Q9RA{GSRjAwqfpfDt%HAIKL!iA=$AbTa*0sPPi^hYA&T ze_moQG{S-U*HAan)bEqzm!xzJg(NEMTVcgvylwUdZeD!~>t?Qu$k&{7J)>>D!8Of` zu$uW%dstkB;EvyKm7Pik8XwU|fgkwD#B~(m;=KD?08WX+U`T+b~4*t zWA|dwwdhs2?bMkxNAw;1@wOiODuXU$&`F(YHD$x2=8C%PcE=&kIQq}hwm5B5rSr7v zIk^8|7wfLxp)ni&hn0XLBiK0VAz!G4Q~G(??f2%)6h4>IDg2JI z6%J@r{ja$Sxt{7FFFUr76d<2l3TZs4oWXLBWvkEgYFiAA}@F zS(C}vQ>-_}M%PwLn_h?uo}l4#?T{6+gLmLX%QW9>XTR$vW7-Yb2o!w3pAsjj&J`If zb(Ao#k1}e6GCCZZ!iAlJtjDFUj;AOdY(f_|rMpWcMX7z#%L-=q+hp!I8(s!dIOu zFJ7rKF`HZNw;j3te%iX8Y;CenA*X#m#w5M~dnyS1I5jv@;%pQq=_|2A++K&F$|0uy zQ|X$SkmHFee_XDN8bQEDZ)UT1OR(OZ;xLZ@8n%sbCEX3`gTBvm{T+nd3u3Hk(C&x= zyB6VBc75sYT9WgVZ1*t$b-szPW+Ln!u@l+eQ|x?_uK6(kHpgmuY*x&UWebOTcF)9T zmhg4maLisFp4$lw4s5XNuBPMkSQ}9X(iOrggup1q>ww+N>62#>6KmNfTuGM!09p+?;appAY2Y%qP|}ACHrWJ zn#fAMx)lMJ8pNehVAqRnBBEE_0o{tkisg)eX=BM>PeLb1K&FmX7Ux&81Al^H%XvvI z2=a-Z?6pnOi%xa0g83T(tIbYq+d>NGbvd!o6brV3kP6vTyZU~QFuY65wgDaSh5q2K z|IqTzv0bt7m{VtuS!?+#oc-dbovS)nJ}yUR_rW0ZId%J2RvG&b5|YxeQr=3$`21CL z7}d6h79xzifje7RYQio~vx8XN7K%m-(}2g0Y*2z#W~bL>Erk^&RR|Ad$79$=ua-!l+N>(s**YPzq5)>$aTv(n+i%B?#FVa zS{B!q`v4B*f)4u!@hEJ+C;?U!*05t|dAJNh{U=t>QTkQN&XZ=4l@1r4KIDn zGIHW-+1`qaT8{K&ZzY|g6(P=J*1|Zrd%s^80FC7M;*&_kw&12(=(Rs9(`i3SfbkA@ zIHwC|e9)pb?liQ4J^2%P$Og&NH%o4`!8akKZi?8Ja-RAqC=k=O#x6C39>yNoq=p-G~sStH% z@Gm*_P;`4V^NP197n)$-X{c|dl(0Hx8?wV+0m&*6%;|+ZPbWK)z10a@(A%Wi$fgMG z*q)8q;zjy4gqqdGnzxFTTUCu(0@srVRom@~sFSU|1i4e8rmSzqH8bjz#OOi_L;o+u zC9+Bm7E39)y*A{=JB^9*PK_?vkJ}k(`-J3R_eitN;ToV8&7#v;-rnA>)QHyLX#=1S z)Ur%#4<;EBm~XfHpJZgvN|eV;Fapk80Z&y61GO8HdImAvT{LyVk;jz}3< zkiw1WdbnlGze%QSemofpN6Pt0$I8)I&p=t450NnW?y`LS1I2D99e{yBs?-6Ti0_P>v! ztKZt+WO#(!RqJ=mqg{fJL=MBM~~e^%Hcm{vH6;4r3j zgpl9sB3c`)ppkY9difa|uSQ=etGlXw$K{%*h`P&srj?YmU;vB-_+WGAveIU{ryA|{ zMwdDrs+jwRvv&?)8fH2hbJ<;$gEn?y@NUrJ{Fpt7!>$meysze#IqA2JPC}HcFgrui zgoj)SaFqp5vcm0hj1PM3RaQCK9u2B7b)9eyyVP*-R3TP_V1EJF`QbbfXXJe&xwOMZ)4-AUy;wr34Pcb-cWr zu;mzrTw31pxj4LOx=|T~;1+*LALoj2MO6EaHn}K0fVZ2P#Qj{{k%*8fankcxcX1Q1 zHOAJ1v}NiJXIK9x%vSbaqtPZ9`ExBcMT!Kg1ZO|s>B935J^Pnze6l^}h#yUQIs zUo|4H-_f#RO^}(*0*|}j9^bL`;rujA9s?dlAcXB#0(yC_^Wz*(?N#DG=F~%f*mq)T zYl-CF=6PaY}-TQtQV?#&Shb@6V~6FAgAG{-w=*5&(8HNFjP zlT{gM(hdz*(reJ>ud}dOXCcsNd3A$)6c6Nb1CwWLw+6enPDlRNI`S1jqCGijV=&Ws zplykB4h>RGg7(XHhT%O_uDwri~=S!EH1; zIb9gOg~=t}fWm1BOHhagQ+ImJAr?%qgYcZyJzD*iLcb~u7XsYzJs#=Scv<}xK47b_ zbl6>H&xG4^oY^b=%~qDQ>AF3RO&_#{ZE|~(i7)WAIk>&;IftB=T4a5<2fcZYPjBM) z7>1`3u^-CriR-}0&Yz^khdVfUs5;$`(wvfQc4Er@=n|}jK9evM%0{-ahSrcLFg~W9 z!}&G~xF}77T2$@8*LC3PU5Ly!_Xon3yRQ|nz!MhhD*ycIoL(D|vO^#kAe{Q_fX*gYQge#;Q=8Nu#AXBTq5qfaR79lBg2@i$P^u?K@n8p0bNbAZwP#(DUwAN#g(E zqfBrCmV0U>DrTJ2R<8Y`uOMv~Y9Lxb9d=))EIf)&*+Q#cj=kS#?{rzBJTqN{o8zDq z$FM1s*m@D6<#bwya;;acw&t4UF3%!fxtSwMv$*(7rFJHc6x#KxRd4d!SjzbUghLeB zlzFxC#l!%Pgz$>mwda%VxBk#@ zmHy81QvCZCeB0sd`_EH$y7nCy#m1|tGTT$hiy+piYq3yf>;GUMRf~i_Q7&$_nks!k z8c#z$o58iBwX!C^ldEC`5=~NFKIN+}UssT?k^uG{^Tm4WlY3BO+LW!||@izr=QHYxmFf7IpPFQ+ENbUS&os0l2!r z!aKJ1P(6TDcvJ2i28oE$XSTNz(KgSX^w={PszG`5XEcC^kWs)~*&f&<0P9=q_llH# z3R>s>Gi`T8Ew@j=g|ACgglTHBa0^3QmZc>e#-Uxt?$nT+)peB>)}oD8Lzmz90am5e z{{R=k*xP*P&fgUGt3@;GOjjwjZm)$aRdNWZ1%(Zm%dqin?*NyTaOweDfr$K ztyK9L;W0hS{*Zg0J?PnKP4sv{lb>eZCV(Y7$MrWM8gc5AuL`E+0Rm3EP`_F-?<^ScRWl&uJ!oaYa<#N?0@D%eblXezYN68+X6=J3tNgs{E!Uer5Yyjw&kyGlLUO_Qgv5_$k{fT^)g@jfq8(Y46ap zl!J8-2zUD@){VqI*t2FIa$ct$k2yEBRxsoMx9Q8YbO%6A$Kus~_;)p*zNEBcti8b+ zU$=vNkHx8V9?J-1aUu+J3rJLq`Ae2CxP2w$#BtxUKrY`>klt6iFIvNt;1WwL(h&Kov0 zTPks%-hWj?n#sU4Z}0}6-v3%2o4OrX^b%?Y1X>*SQG5w1cVV`)xSO?)YvW}_7=Dkk z7=SCI33kKL2~4088>v$Ce7@1#4Psgs-YVzW0*D_&c?T>_*F z_{v?IHC`>39&2&Hfh!n@ep9nOL_Ly*JbAOQz2H-6f8wD&mG%Ly2?zUi%1%z53chh3 zJgIGsvKuHbM<$6KK9g3@_hIB1x0t1)wtKjlyx`6XXW~pRaTzvBQ`d_*k}Sb&ZYV3j z1heTDhn$`^e&9?07Kb;r#ou?Ao1N61Dg7Hf#FE?iWDj zFjOsTFRt}6C*fwmW+1JKSD1jOWc+!`KO1apgs1IYP5cXHzL*qKuQWV)=L(;b$Y&kOnv_6=^U!lek-$JUO59Xp@F?pW-8rQg1SDtK&Sv&Xz zf9Uiks0`J;^Y1qgyAn5CX$@s$f!6xZd)Wet*<@u^a%*=suqI6mEcUf1xa-c(AUG(icB?JYUN90;iIW?GOjH zm$NeonOwl6@_Lt%DQNTA6aqXsff-WRN7ewhr`qAk=fS=l^J(|LmlNE6~JAAy(#^ z1@_K13s~+}ADacs4jhq_@b8U2asE%mU^|I1lt z)Z@7tw^$2Vf`xLD-H?d!L@qdk1vY1U+;-Dw99u$_@ICl{si`NxjqQ(zd9um&Y6KLJ zMIMBQ25bJ>ndX@)@!Uh?;vL`5tz*T=2&TvEwqyJ(navwg8DzEvS#Y_Xnfqpwx5@&i zGK+4X`v4}##O;(ucLZN@CFcip0@aZ=1?+rqNHUV6w_kUb(D?&8U#E*2Xw!oFuX0v+ zNjl_B#5osc@Rxu3P(fW?vsGjt-k+e~M@)7@O)Kp@Cjh#{LnG!7HT_JGWN{E+qYUXP z&YgoKXUPuL1MvcY8nUqs=is8z8Y07QT{xOcQKt&`Gz;NV6dn|%V7Qrq6c_Xb`teBc zKaDnKRV{VM&7N%zff0kYg>+%E{oa`$p|{hvMeK-L@r_}k?oNK1Bz>(QCk~bkSz9HA zZL*Qcd~Ry;lt_i`OOuQ1zrn<^jim}h1KB)@D6|hz=sL*>Zu8Tm-{`=-?soApbjFCg z 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�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�(D0Q4h^p2kFxWk;rU94>6~t&8|s?W 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 z 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≠gb()6L-0;` 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 literal 0 HcmV?d00001 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 a40b6425a4f47f08aa64fc886e8483cd00dedc2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1033881 zcmeFa4SZa8dFOl1%t$k`EqnYXkL=hvb{uEykT4_=#(~0_k!6ofUIc+e$))X>Qh!7W zR54ttWUK9&kz^^3V~Y@ioDDEeAyt54r7yQix4U~rvK)mQ5|zE%Rr&%7ZCSxCt-^&? zT&SP>eg5Z+BrCb=n-BEuUig%flR5wQ=lMOq=jDGCb*$h&Jx@5+z(6s4y7+&h$!jc2 ze#-x`-yN+Rc<9;BKVip`ef9qG*zVQ{mzc*SpbX{S{<@d^G zKc9TH--q9K-2DDa`CZ>x{`;k#ZThb~-m&L>^#Aty-@EOS?=#=t`-1uW!obTLFZKSv z_TSC<9eVaRb${m8eC+N2+Sl`1=dbG@Tygx#Vb-5I_H!S4t?mE0-w*Wb_~#z`omg_u zUw-lTRNf!k^W+}Yr{c56e&?TiewP|w=U=`%(C<6{>i3?!)cddXckRD-#qleK*pKV> zMZU7Uz5d=Yb}Xs;HT{-N$Cm$osb}5qNAG*~w^V;*_b>c!mwJEs?*^X^z2h3i&tJJ` z=oR?*YVU)G%{t#hpZoAHX#3CY`N|bK{)axh^Dmaazx>&}zhcGq }{P&-{cJ1=t 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

=QwKAlIBhU<40j>M4kZm3 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 diff --git a/data/title/openrct2/triggerdeath.sv6 b/data/title/openrct2/triggerdeath.sv6 deleted file mode 100644 index ff00a979bb3522ccd211888e659fae7c82bbf83d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3213150 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

8lcP2#F~L+r)q->j3Fu% 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%0AK`N@=_@<)fnd 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

*3 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

_JD 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

$tZ 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%0AfWd$Ub-^0RhDC1w^o6-aL#e4E2btwn?ppu08 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 z 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

=Y5NDeqn?wT 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

    `H`*IcU$MmT@My6BpgKClp99}$ZI%p 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%0ALzsk!nDAt|i954O%KGpB>^4PM%h(l-19o$XZxi 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�_d6Z^$tI4bzX}f1}7;Q1<*XjZjUP6oZ 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 z

    ISb=kyg7b;+Ccy&C(PZ*>xl2W>s4}*}RL5 zZBK#kc<7K9@sz*+9M>%__9B!uf7T?9XyuwTMyUM|n3z02uBnN^#)HvYv{kuiM(`0Z%Ei~5cIiZuwS6IkJrV$6};(L-XZ#p~M?;OzkdEaLrn zygnfP>=v{dqblp}B0+O%a|%Z3u1&apt4|$!1i{skL4?F5cTznzBoAm+>;gg)Pwl%Q zyJI!Es%s&-cG0aPf}n4(P}7Kwbl2IRnagv!;?kt^$U{D^4bqvm3JK&5Vq0d9JPDCp z$}1F7*{@s)Atec$Xv{jC(ZTAgy%)5pDObX|1VA~{my3UQtjd2}SX7}#n&Y=Kh|VX; z<$d3d5=-O{yw`Q;>03UOcZ1BwYl*yX7x=4eWF^s}xS4-*xXT6dcBZA$bAhBs@KEZ& zQtNdlofdr*gHWzE^&YE>crAPEE?Pf}C|xLe)JES@E|;>mjQzE_F4raR3!w3MS+ji-o|yIhO+&kA z!@le4j-py>ii+L%BNkOa8_=7H{d*R@svy9rQE0u{A{GPx-rrF$VPqC|WtHhYjVK`rqK`eI9QL z13G-7*q;x=PYA5AqZ1jMPelLawJ+U;=iu7?r{zKsKZ9xbFZ^$LTiWQeF)%i^TL2|(w}Q2i7HskU zCV2a1W5?PVQMQecSkXnO4S*Bx|4*P9QX+-+A0eFQP!~0XKA_=8eOl1%b%c@#_G24p zp?RHZ0F{0d{3H7%(mJ9RGCd-)IPVBjz8pb>+%t_`VM(!81utCbXAXf zXJg|)*pq$sa?G~W>2lJ1+dq-U4CclZ$oGpN#@J9&{yE^h(cjR-fB1BEYdlI5^!0=` zA&(j>jj?&sY>6|jLY6qiv7{-TwtuucVjp%-w}aB~YOyPI`_DnO_Kw@Pvk*Hp2y#Cz z3(ZQ5cCf1(TBJYDvN#`-bYA*#8(%ZvLo?=LVej)Z*!WQG1F>bTJRX=pQh1}AtfnR@ zwTU%*4xW9V56k&e19o5sf7leT&<=~dfVwg>S+?<|JAzts#mKnh_B3K@x47=?H_3)3 zWIK>ty;z=&P<6m&DU6WZcze7JFOTfL)2G3+P^uLA&{!b=PI80%!L%WpnwBFB?I3A; z8Rr^fBz-$Sfd!Po4M1M8s0Rg{5&7tLR3$AF;H0C|{C%(uu1+me2l} z*{j>}G(0b8Kz^FDO_gXRzv;8!?tJKPc(+-(R!YA8ZAPBkzmId|7M>jH;V#`24P4Li;+Z)5b3Hsie$B0g>JAOgFTws8Q)^46XC=zM47Xjw{C<_#c2P|t^XC!iHgrID5`no(! z;AHjqqiA%@HA@O)gf5%jFC+Sh=f)s06wR=AV#4$`ifB@;5r}qWN)@uzRX}VLA~x$b zo{h+fOM-4ob(cd%O;}_pPl^rtCKHW6wSNcg&)JCbf_|eE$xnAD(X=CMvX-bd31P#% z`+`2)X1#d%=^?z^UjxL?AKEZh*d89 zYX!t4G5IJLaaS)ZSvsEw&mT@eZ4!uPrIoS!D%X{VyH66_?TU_t!&W6dtdo4G0#(?0 z>GggwVgAQ$?;^Rz!SB!GYAr^>C$xmuP;4KK@NPp?EM=LnR9%Yjc*-c4;l>s^1lw%G)*&g#4H7{dbd^R2&_Z8;_(V=!;P8oPN$$LeO%oXKym= zY+EPqSFqbk<{j#^l5jk$mG!V+8lNt%haz5t!({2X+67~|KiRbbmGNoVVMByXGbgp^ zSi(YlHCjY6^l6+^=T^|-rPifB$249Rg>qyUk_VzP!>CL;@3gnHS%|iZi*YD+JE&~C zoc57V(+oTy$8EmzdEW;E<=_CO+FVp8;31MkAq#}J-Qe9c z8xTh%>hx$L8ABBuP}9EPTE}vn+p8A9xF+*QaM?tRlU=pOgh&o3fRq7lC^o=cjcGdg zXAXk>b|YD6I&@wMw(s!Dx1(A2@hv{^ z(?Z-&6q%i|wxq_wFa$OIy z8o?)$TVu-CpR_Of`}nV?V9aBd!}sS@LvFQQdlC}CgEw(kfM{h=>=U zvGi8Tn`(ShslCkLB(HYFE?~TYf;O(~YMvBsE|yGQHQ1VEDdq-bhq~1h4~tmUt5xyE ztcu^rLOP$a1G^M+{zztlAd|_li2go!nbz&<62Y z!AyPaPAhG6*pi?)__=9s+tK3&} zpyN^vmO}fEY7l5lC!sBje`rtGFP1s8oXs5P7JBoChmq1@gYoQbxZX2Qp*kX*)gW$f6 znMqE2z~Sfeb9~goR_u&%)~C4|n$c7ui${k`DSBcK+ZAp}F^sp{%?wc})y700-Jea#~z1FUTWU-RGmWJF+Y*cY@m5j0)=~dWRN1XUi zhA>n~W-~2`4{y)2Zk{K@a+BMzo^+;y-ZAbB!I6p%+Bk%p#c_#y^HrqMpbOyx{mMTH zkJW<_N2@#@=qW;>)@J9n;^@n<$s#aJBKR+m-?jV>4mhU})hBdNcEa;$X=7aCJKW<+ z?=FXhUrx3$0~qBTq(`H_J!047(p!L54k2@1NSy(<+{f zBLDzi_Sr8_A`Gm~`t0MF-NI;D-r?|>G3kWcXqdL<^p>>ECGGIR1Q|0}$=?j|jW1eAj2D&#`0dng?M{}Z<4CKByJMp) z=>TjegzS$7VYA72d$^<3LG3}8ti;7TZ0h61|AR$+)j*w3VSuwx)h1q1)3zIMQ#puq ztSVz)@`+>3FCHEGN$04@)gmgvgFb%KNr4g zhQE86IALQl4%P~jJ1NLoN6cO$tb~mI@hq!ijDB!H>u(tBzk=-I;E&6WIr7Rai1#RZ?TmhV8*1A<`ux=*)Ze)u6UXpNFy#A}-EjfiZDf zvLyY-;B(8{R1kG1`NbhYfjRq+7Mi_5e}GzbM}wpida7;HU~E&|4PA`Zj+J9AS;t=$ z!E)`ky@epN+Kr>Jo&FBgH`1X4SXx+7>QQ~)QtkM-5M)sKI$X(J<_JJ%^mkJjb$kPz(K7*AwV#Fc|gAIbYEC2oy01g zxHhb|yLC_?IpDM=ZjYoG&~JcLDrs%z$A1e?knj!j5bqPjHgxk1A8KSw;_845J$mn9 zD1rx`q{VOTIDa(qoE%+)OKYgikB_-SY7JH(rr}C!TSWP%yLv>=<3y21X%J1u-kpl} zGYKloX1Q4rQr<4Jo(~6u0Eq~ev9N<*a9G9;?6%cuoE`~6l4MYa71K~rN-xO@=B{qg0 z+`Z{8j(U)v64#n5?K+42O|?rpRqcMSlPA8|?kwfe8TIn$bf=3R#=OL0do9vv>^JnZ z!kcei-Kl+sV!c-KebzAvyEW(o$;*Z{^WXQqJ)q&HsMa(uJF2ZZrrDp|*bg|q}jpv3Y0b=aqz2Wu}7UHHW-2VSxs};J^1+?WusN6HI6MD8}QpgW2YEhrE7t zMzuYzm{A3QSEgTIx->-hgUdE*(ePD8IlLC`e0(;=B%u$IE8SLl6dJ>5K}!y$<2T7B zP`GxJ&`X)#w{1B)9^?jO;yg6)SPzm2R|j5onETyicu!nSPT{ZQ`xcN{coR?$c^9w) z19oMJw&0?;x}&#ycav7(rkL7oLzR5? z3zgMT?R59HR4Coq7sIP%uqTa}E zV*w$;f5=%Z$EVHVy}{GaYqG0DX)GrkPLaFk*uEJa8U>G++E_+0a{S#yD{}7r-E?Oj zfWTZ7^UOcqTTF4m3cGkE09LSWmUH zj#jG~F+r3{1`r4Nqj5tv{xJtMSg6t7cG=Nad})-lXj^h%6YtzrJtRm4O+Ng1^`$|f zN>ljE3!0EyC?R=0owZXV&hpv;BK~6wLvZftXdtY)`0PxRjIYW&L%$z1%^Wg$I%TIK zEqobP#}*1}AVXfN9J`xuXGqo6gAniEe3EMl7b@rQ^7aijS>%H=?QT*;aSv9H05_Hse0fV`?a1RReLz3E zE`)tSV4_f|O_FJ!?B&?Q@<(AMQlmSA>6x_fwQ&_5N(=ExR1?ai=D;8es!aC6+xL+R z=|LCKZDLC}10204=WeEEoKXq(FkSEE+P#>1ENMI02BT3{hqL=O&wu-+t!U{t)?08n zk$~Rjevl4ibBpA}VfSpY?kt|Y)W&9DnUq;L-O5AGPV&GNB-6gh6#j`N>KU&gPFuA20BscI9*?u)@NGuN#z^ylTRXnoQ3Q`v-gD1cR}c zyg^4ypVsGA^3FeY;KHp$lm_Hb=7;T4UG;^dz}Zn?P0 zM}ksQy4`;^v!M0<6po^_?wd0n54rp2S{gLY0tsIB80FpF%B2fZvvE7^0|c$W=C5!D(3jKc0tS_NJBWB6nNb_~fe@*uR?!Tuh+|NUNBz()MQwE-=?0om?ku$GG_LA~Hhu(g zeLv;X)joV;t&Me86SBdq)eNef7d@%8o=?!e2?hq0*cNRaN|83OZ`emfUrSb~)-Ccq z2UiUJSgz(+u;S<1@Vz4T4wA-1QJRml6p4a+ll;&aR6;LQIgWef&mtM6$36WA)oH#3T>ga0ih7 z1&`E~W9W;?_&0 zV5uqAxC@p#U^grk7AocEgN{I99}3z*DNw01ko1hEDBt-3-#Y3ZcH$lcOVy4Dml_25 z+P{}QXMx+a7(K{i&7$ezW`Ihy@4qltnd(Vm-|wgd1-2@+flFgn)r7m8l^uvSDKtcC zo_d>32|nUJ{x-?)C~A+W)mh#WZ0=pxVw2kJkOn&pSU5HXO0@sp+2ReW$bqox8uXm*Ial68AcLvZaT*Q@-VNSt82(Kx_ zC5#20oF_6wWz@L5bSB&cG0lcLM(O2L8f)DZykcsncR)pmWC*0z&so_ zQi-@^1i?6(+w%2@g|W$YQRc;Qe+w-s*Zq(Yxs31NK#{uZvEewvnE|jPugB(C?ohUq z&C1#;ur=Dpz&af^iTO=CN{KFo{q^Mk6YL%JN+~IuJdWEfioG{2r;%aB&Grc}tAg(` z1z+9B7-!7al<=)T?@D_q$`4~qU3>A?^(V#VnwtgZP#VWn7h{voW^V4YJA8H-`8^+0 zy4A*P=*xs1oPTMPPaYPD{iX%pgWwV>Bnj=eeE?9qwjaG~BZx8J%d$!gjC7^&{9SQ} zO{7YY6nG-3FuD}9%K%9K#QU45vqkSqmk!6G^;27L9~OIM>+}~PN|wTuBzAZ~hb=y! zJ+8K#?y}J>{VS}6a`#H2-rYX(=8S$IRfX3InQNDGL}WSrLAE3uMzA@V8vHm(t5VMY z%07O+8=*+MZ6stRaT*&{F(oD0fe=Mg$W9ruQ+uHvi`KD(((-vLVqfhTg3wa8)@LEn z*yA5xG9tkGy;dio3AEG>%UXMnLJFm&_GDoHEFWOVM7`Sgn5hRU2SAxz8i7bjp@8uDnA%7}ivVpp@nT@6kkxH`f8RzKuj zxkO_`su_XJr?5;CxB12m%VGjV-y!0V?}rMoKRE2IIeR6_lb0#*Oq9;lH`yWGmZ(7> zcaoZ3$**`QYj;ayf~seIeCp_cI?Q_=qHe;>y6B$argvgzx8YExK>9zJC!vb6XRtIf zTY|6yzA|{5FXgs)gQ5lD0k<#W=lNO^512`Ug9hyJ*6t}%I8V0uZ7}Tv z!-qdb0=G_z(b2Gp5#sr6y53xu=(q<`mHb--{u% zi3km2tMEmpd9FHx)iTgRu0DvY#OM7 ze)(eCe~8rNdLb1hJ8fmZR%@KeV@?G89Yd0f|E{r%I{W00tkSL2KuCM+u_T)E0twTnC zat<8E);_JPn;^hG=$Ohuw-ibpY}9drjkxl=7#|LC``#QG`(-fG<_PEV_R*h`ms1a4 z6L+c=dSIK!E)g#&f7x-7J2w%?;10ztuE2xG`bWsC#;KqFE$6@8P!~%YR)c1NL*K21 z<2mkkEAdVd@4kjgfb=Xp#>y2PIZ|JUlQEx4pLj!{yY zBGaLb!}p7ZL!>)ZB@#F1@Y}!O)`#=kldU#{SL(BG(Ce2nk%4@m&UqV?$>Dyq=?WSr zk#HUlRA;L%hM?jO%AtyqoDSKBHm!gnaHKWkkkrGOSM5s-g@R-Nzr0pw%~x^Od^s2e zr#{txq`MVzCFh^v|l45#M6d zlBmq*Z8(X^RCuG_n#`afF6QulkaRM*YmQP6+5|8yr$>7Y*wO09rnk_dZrA~N>lIIp zxWUoJhWZ?WEaSWAF5{mj^}+w|(~)7)3w8bCWC7!&cCHrKIFiyl*fzwpY(%!^`hJt7 zepp(z1*Rr?m)dQ)6of$r2hwfG0C2P7sS5mJnnrGY%0800D$l{0g4_6es63IE}}i( zBZX25uoR2GG-NBXc5Pq<*=HXto>4e(Y=fowOwG9w?)c{rhwQUlDLKGx>R%FXC8d|0 zLo!WpBPTYkLh8;F9@g@s{1QO2*#coV=msgimI<{qIi_nI^sS25Vsj zpB|VGlc2PYz;}`@yhxB_IW@AlS%t02m5PwTu>_ZkQmFQ{1g@>weh{-BM>1uE+p1d8 z$4OZV_qI$lJ!qF!YD;9OscVL620ah4}MbW@Y9`aOr&cz$LA<)ARYlU-WbVb5z962GTRF6uGGxO=0V4;muw zb-9@~d8py6c?V|?^+=>aDpB;6a^!!pNFhtU?jtl3%=|f?yc5WXU!x`Sk>~Ar0+Xx2_)f3#yhi-`C5KGz3NuJ>lZ8`4C zb+nTm{h6Zn7}8Le9IYKzpTkul9iSJX0ffCLhm=#ibhNTu->KXsf?lic?azblpQni7 zh03Rewzt}T>y1Bo-9j3+-OFZ?PM_$^iFs{jPp8M2K?;$_p%MT0EiJfalE*J_G=FMh zR+374D*K>@qIrV?Gd|rBh?EKyg9-=es#6APZ6}|r9CDBI1Yb{vR*QjA5 z=?&e&^3mg#x-4?O9g;&mRCr9BUS}38qA+a0o+H(_H@xVE z+Rv&vUSmk*_6p#|7)sc$xDr-7Nc!eXPH-nLeI35Zu~AOSF|jOdV0}!c-l079W3)@pC7GHzSYN=~*M6 zn}}K|du1jeU5(Lqv#u|SORlizV-}>RLeEMcyH^ABjd57bYZ*H-Wr0>nW%ip$h>I`dOJCm;3|3|*%_rGoz z)m6VaubQ`iygMOM(k~RHT8p7QI_-I^sjsD;xi*C*RVDP$A*-h%`(qzI#4A}-sLu2e zij#m^?`=6sH%o=4Fp*zsL9(uM;46|d}S z5Q{8U>)5M6#yU~0wK>aeBcY2(A9mx}jI^gl?Mu1g9tG=qJ7vAywi44WZ|0}JXh##U z^5w@IE9uDskyY6{8Jiimw^~vb9^}z@EZfTdP_Ow%dsNym&Q6K6P~oS0l@*-~xpsj@ zQG!i8&6z$}I=W+6(Qajf%85h^omk(}W^c4weFVvP=EjcC8m;;1q#E(eZ4nkp5pf!G z2VocQb7a<$CJl|MQ^O9nO^A9T)K}{yC*^a#MGc6+dI)bp3Z~=1X6R*Vo9LTQ{=nMk zdIGVGq1~+!gsJ>*MWoIP%=XUtdxj?d{=0Kf6-X^i3G;RXq}cFUaHe_PVY?bh+!=i$ z%$}oKqZkQIOX5uKZfnP-+HlPNieUKp?9)&I!D(rsKU-q+;iF4xJusspf5v?L4@36NA@n*Z+zd_BcLWH>uvX zV1PGq+ZgCOSkxE-5^Guggk2HBzCT1ChV9Oyau6d!2XZ4Be(fQA(<&>~&WgG$21hTZ z7NGY0{2dyX779T-foRRf)wTp@XlOL>J$~EU`JRHlk*yn_LQPh2GkZpqYabnUc^egA zNVLp-r515s)u%yQx5`VF@20waGO86L!%_^91@9MXmPIk33IHPCfF-$FLX)9n%ScZ3 z{6j>NCCbBg1bO}Y$mO(cTF+F}v%a66Ged_-sRI22GM_o_X0=vlJ!?0wwG4IX#~NLH zm3k|OOCXyp#?Q4YaxZ{Xcwg58xqf8OoL4X;a8W&QgivSCG8Nx-nTC87<&XSb&MTc z%9B*MWH8_CTyEXWMkoV>L>FMy>_(2yBj_nnznZ^0_j>51l&_b01rnL%a63 zl6fox;?4BWS9{`G0$O#%x|r`HNyJOPV0XuO^4(R~b)@U#RbIqX9ckHH^D?&B4fsge z4imp8z|Vi!$;xFyJXMHQzO=Pm>g@2?3H&(tE6N6ID(tJu1_MLA3TAGJoul=D=KI4U z9h_ljtw0u}%>RUTfURF{i!em3HLTC_${(|Xx1=}qSrWvwK1 z7B};K@7eLB089Ews9W>toA)#oMd#qe-w(5FZ3ukTJ)gF#su#W{8 zyGKz@A_9%Yk;n=!9f2GWur(e?)L3i3htezH0}&SSTR*i6g1W-FkJsyC zG~$>}7V}0^1d}vqHP3Ws%`krzwx$kLQrji=2x7z}D!-y6dV|lA(X0^I=mOXU3Sh^p zk|%(j09M97c8=TKeJUp#;-6Ph3m?T-hHPUeA1<`)qnHhQL7mtYbD=BZcs%G7sQrxE zzx>Jy+AX+Nv5U`F_-R0=R%R`yoF`%jWPo8#Mv}BbZ}-_@t=8xC;$iEhDlg#hT@AUD zx}Xbj(QuDairixW=zXL@AB$dbwEcP{;w?D}=l#v#!0v$#JA+*N1V_Xi@AiaT&Xep- zEGAqFwD`UT$nhj^8uq8uk3z$m;Lg8W5G)fy-b)ZNo^ zVi2ATJw6OZ+ljfE)`f^D+ZQN0s3{y=ZDVL$d3N$ulpwqT8|Sdt0Pm|*e)vF;i(>w2 z`>qon^GQb)L znFq9Xrg1ql>vStVAz2epeIkfQR^-RD`?-c<0%itAy&LXrGtLSVxAjn;aW0Dm3TvAUMTTu+;{S6}M8noJTD1*a3D& z+U=8Hgk3rorM*Mu$KhC*1XB}kaawbO@gMG@*lb2c^VbF@_F4dhu-=Y)kr?#LWXpr7 zN+tLMV|O>La7ES6kl9)I1-x9I7()W8 zq3IBK7b7PU**rwn2mubN%tK`ew~3mG+r~4)TV$pROIw53xM#k9T~D!Svy%AxElOt59vQd6V z0LDK=znBQbHGhbNf}J}qF7Z(lvi!Cz4|X^Yauu_aR-RR1#S}%_PRs(m9_mfsM|?Ip z0rsV-veu07_j<5XFiT}LuY>Pk^rWTu94lUHez9>!`-I7D{I;t)>~AT)Ib?++T==Z9 zCuPJB? z=q>Xgx?UkZlYi*G*R@5y)V@1Ii_zqB7@n?>wGo-0R+`N63TPKkP^9wEC zxArBJf95a2bmF6FGLo8>C5bET;{hC_=|8)->yPDos|JOkmSnVDUppK&@KXb*L%rQQ zK!^xyxSUEgwAN{hz3BD0itWA;Qj|hIxoQ|^FmO_g5pEhoc^cHfnLqtaQX7ekMxdZ%Aq;uc{_Pj>6{>pS)zCz!Ji7ko>%BU@u(F6sIJ z%f85WYBPjs?Pw@OB&EWP-%yR-EuKrD4qWDDXHj48@79ljL5^=$+oC*y-H*q-K)l@6 z=1ByfJL)vm8|sljW+M=c12$Zyhj>3126sB>5M!2Dm%py(XFnt)nHRIF8jeXs}~VvSH$xgzx3K$Uni|WvVq3oez(i92k+BM zkD&x`DMQButA!DHaF9dVG!Dm?8WOA)w9eh0NtAtDF}okAVBc#Olb9VV~5_hy@-tq z0j%0U#D+WU6Mo212yIrJ{Y@#mhLJa)bnj5y&=)yd1PwyY3Yq=He%s*OknRk*D|r_q zHHUCms>L)({*LXy6YWnVTxy3!d-#nScoVg9)B0HNpQih?%;`*|M2|{T&cFblT}k`) zSPMNU8b=}YTFwe$AlVLkRCDBUk|J$Q+rYz*q5Np#@* z?hpu>_Jv}7N9=^%ox^E8g#?K#BQZp^L6INt#W8pye+F1}&&bc%Dx1t*><1evcPKRW zc*$F76zTx#%N#%BUHd%Gpdxp=cJAxHMbXYLwH+(TGN3QN++)X$!q6CKrOoT>_YnKL zNx5}I7Gc%#Is^ir`y451bFhU!$lOA`8 zUC?HaC%X~A?9slK6)_GFgvOAw`>EHMUmDclzZH-^dqr7;c7y-~+Y>4KEQ$6~fl!r& zT9vmpS-UM{pMz7WeVj^3PJ=Nr-7n28ox$rm&SgjYS850vwR(;>H-->aK!HNH_6<~L z9Y}gVU_Ic1nmulgyj*kSBg@I6C`TSu_WUM}`}F zph+-ZPKqJF1^AHA$hB6sHmK;YsW?|~l(1d7$bJ`UmS)UBhxSj~H-c_qSUa&~L@Dz( zv+#kHb^iwE5Q#4Yn-6+g#Lc4t8B;r%jy!nW+1mR!`@SG<-?IM}+9ZOHa3g4zW<7N6jWX$;8F=fu32!sr|t`r1X;|A)-dUaD85a?1B|-Lt43#c07M?hk1n&9Gi+iRXHSS`Fy8J<^7Rvl z%~Lfo8I}38t6cTPr5Yto1Tvw`R^xC%(u-%9xn8GKdDI<8&f|x*L`<72#-ON$TbKaW zjmMx}ofJZ&9dMTOfaxkyuU>F4#DPF|4!GoNrOBx{9Z|C!xA*s*tL^K$9YhWzTx~ zP%DG0`Hg7|GbkTAJll{Z%VN8SLO-Fbpq>u|4e{A}U$_fGOV@_gzA$g?6X$8hZRSj+ zB+TGz7Nrdl2-QL_ad20!oey{9T}(Xt6HMz@WcC_@<3rqZ0FPfi zIN&*8l0+o(QJ=*f)w@{9kdT1eo{tvl?9e%`^}c!rXimb5)P%Jo*G zlOr;c*jKYw;a_%03r4-~F0S_pySd){eF`*EpJzpm?H$n$0*wOyD=~;8F74g!Z6Fwn z3SwmFE=+I!Uq{>JTt$hEt{)hOhr;9Rv3@``=fRMSr0qQDJY@nxT^6TCsoIa)C-yMH z`E%Bu_h>fX$5&+Idy=)OOhK!d>!6x;dpCba>Tw#cZ@i{D98ar7ae}L}h%@&pn@9ud zIW?-2j@M5vQLlR(;p%obQ{F*jD#ka)A}g<0g!W#+a?NuC;uX}ftm6lcuJskYtKowgzGdi+Y^CwL+=r^7?6O&*i!bDQkMYppu;l1eE0i4hOi~ zp=%YgO>gliO|td&!b*W5&E&}^vv7-0;W^4N{hEg==o=)y*#T_JKr`M;67}~Y3b(6g zE5@k9?3#FeM+l4wd(&gJY_Q#FV~c1V=)l()Mhve!4}&i^OMGWH%00IgSc)DWksE;> z$&$ZXB5$w#El3Ff?M|7+L-xzo5cH8Pa*ZO8Oc7ODx#}NN_CU%4NgnS*I0I+p==!{d zmLE+8M1F5iVDJ`d35R+R6>c;#&I%vcy_v18CaQB{J}5MG)a^0T`c*H|nTL43s z_DJ5rmo_p1dCTq-v}#z6vw!yiemjQ5Z@sI{!O=DLju0RP0`tw@2CXT)1K3v=0p8UR zbOgQ#M6A^W1CTrzv>ZHihq;CPUmhVtDzv%%!zklXs(zNH32s_EV?kd9;Pj^$)K0C8 ztTJ2QjV|p?WZ>v^Je?nXm_Sj$6YDM##-!CV+UBe4U`H(qf;mlaYu796_)R{XK3#jz0bPyG1_`T?4FCMK40Thvxm`82cBB_Y--}rneKsP3LtX%L2BRq1 zeqt93wwg8wzN!5#b@V&@`L)Y zbCPi!piQ?NLKs6~HyZyvUg=r{wi*%L(23$|bmn4@BBF|BbhYj7%r$MNFqgSQ{ft7j zD*IsBk|ok!360RLY42lqI$nBaTMA|Rd!GuP&l=L0*8=I%f2GFQ1^uJ)d6HozB8_i~V`39CJiT&t-iS z_0IRyC42IvAdd}w1o%o%iMZ*mrdARD{2&s*@+!G5Qd6}-~U6L2nErSWpJX`+FK z5_V(@^YG+Xa>yY&n#JSn`q*MckKteEVh7`O1gXiMBgsSs^9v!Nb#&qX-*q&`XoACp z|Nv@f*#k?QVRpG#GpY*+{x$0=iFH9#|!X@0`EPCg$M z^2tY6lhHFHljPw~CP#JiF=;DL4yK!xk#!;7eP}an@4wx*+DhW{UBN@Vnt`qt+tK7S zeAv{GT=OwY-HjSVMZkKMD>pVG?@q+}m3ZjBcGLBV2`!N1oRqC0V72okcVbnl zgdQb%T*%z2n0&}BMg~$n_!`Qx^-3xpZW&lnfF@JT^Ny-E;G)#^K7{k?GJH=H?YzT4 zH0z&I`RiSE%-FRnEV~3uj9lkLaPd|YXSEcEYX_b;bEuu4 z)+96I*T06;QmhT@?gGL)O!;usHl)~YOb~nR!N?Qr7y32VM912!O4hB~&VCx5`~as< zpAC<9U;5TqEBx`-4x&v&PkTRsoHNSsIGt|4czeI5KUB}{?8{{B$JELfXqt$u(9IHM z_|`gCE7yT4o~Qy*J8MAWK^?WzEyyl0(FRgdX1J-|Ka%!PQ(CGDg*isRR~6vy?K z`~yj_UJQ44K4{AUwnWK-QHY*tj`4q#;RpiHXE+zzDnALBK+Ly=gBN46N&zqR6lQrh z#p<*S|GG~6wDH#5N!XG@{A@{!k0GkxD_p1yPSI9 z+!A}{I)5IqE0fr3C{AQsRBM|##wbr5IS>)mqaM%TO0t?G3?rh~Ag?8PV9yo1$=-RI zpRg47k5g8v>qfKBw{vQURNoxYkr1z~^l$76{ZkXpPbTPNoA{pWndLRn1%o^7;6~fx z+)swSl2GwIr1UF*UHff-A4vmlA=8rDLwlM;1kTHxO9n6SaF?AK7f|`{SZDq=c)eAD zFG@5R4oJkb$2P3z<^5g?1p{_eJMNF##z0jVl0zE7KQ=AkpC zHhGA&*xQ7oatd=kokzR2FVnsas?plfQI|MQgkRNU&4>bxnM+@wekjzNCZ)O44Lr|O zI0=kgX=ST9-eZ+9GHg5MX_{UJYc^pilp?EQc8eed zIzZ>dza?Y0O)cPisM(veyKJI;*AIjxnQS|NB6%v)QTb`jNR~&tzc1s3>&KX~c%rU) z<#cUT)lL$4XG6WBoPjfT)|00ch*P>zB=C~l)(xO<;^vSJyDhsDA{N?8F;YZi3y3U0 z_j-wLBovV3x`enL*ZzTh7`5+YTVtfdW9;wkdE_mQOdF~xl2vK8OB#rj(>h#5|2m2h z#|a%Mg6s!De*br!L|WrAnvNBG*&YIkMy8X%^f_@rpMH?G?5H%nodM6;h29nBQtLT@ zSNVtCyKPAGO2{w>(G@n(#-5GZEuAsvQug&+3SLI!`vPRjK#NUq6{XTU$1rb>Dd1x` zn)MBC?P>=|?~c3zEIUE>8s+*2A?zicsz8d<73P2~4Py888dnDW=9dw{pCaJ*ugY^F!n_BzxZR^D0|)&0;Py@mh;VmWV(GA9kwi zL4L;9R;nfl0+w73JbInVs-&+*Ysd}&D!tZkTUJ_TE}n9;wSu#)kgL(4W-)8r%Ca`G zO^hnnCAyCs`c8#x*Y`-^eNR9>xZg#n(!R`(*}`5FNnv|kpN$cvD80oB1~H0qw!rd< zROJ2g!RrOV`4DBQ6$qxt$HxeyVCm&1YwxqGd$PU|W4JlHEZBx4zC#(zX7W13l?dEtp?x5!uX0m|XHr`OV=RbN_IMtw`h5ytRSvvDo)RFy3iCB8v;{-T>JjY{hCj|D>?+i*=ZG3t~@5c4fHf zBElR-$k8Dl`#e5*W@plw;df$on``Dyz>nd2m~qb<2W5fi9r@ zX2t>-M$&y^B(28je%?k>H(6txA*q>LV@>M>?TQiB)Jb8FwTd_g@%AA;HaU{f4zwnj~nGx{KJbP|Zln~)G}ZV1}Ek|rM9JK)faFYiZ4i@B@n<;YoOLC&Fz zLBcff1m4hiUAYRSx)9p;a)hO)YwXM@ZImOTmX6t^n$q}d54oLE_jtFyVUEn;y}Epd zz+(xZQkWw_9xAhMtI=N4 zZlWAbft@y?7u&nU1?L4~><{EOqg%KJz=-bjE6$JmT>FFutp&c`AExetbL?W=gS?fm z*iI6@n0+zOjyFDr_h03Yy8g)+`{4?JAfvBZM|L#BPRVx!RIpc&Gs{zk&5l7MH8yd9ylZjuB@A{-bp;p3YiMzss8uon(ZZr&Ds8s2QQ> z?2-mVb%>2L@D>v;;BhQvG~lsvKj!4LOo|c2ZkN~?NN^Pzzp2e;;BEN3(%mr7UwJBl zXkEDTE)}0)m#nbQmJ{fRc8dU@;(h>*Z<0n+cBnEc$Gcr*2aZ@-ybC`rGV%8l_B+8j ze32X1L<;$NO;xkIZh{<)&}Ja~A|(h{DTNA>Lba1vM^G;fY|f#_#u6brX2h~l(eyMt zeUffp4EZ8K%b5oD4eWIM68HH>QfvK6b?1AX4h$5z#_u;+(T7KkLEXwYn$hm*Jk zYRp6}z5PuS65A&nYJBsxtuNhmHW$jsVgtFFEL;-$*oU|x{taa)LAm1pkFPTijIzAi z{>)^XkOU^IlOQkw#RNqLL=E6F;1+OcK+%BPfLa4o4caBB=)|Q4wRMobHCn3!XpLxV zuv=WJ6SNwww$W;hc5xEkw$W-0YU^l~^Zl;-nE>`}zkij?%yXWzUgtXJWZq`58bJ6a z&d7YnHiG)FmfgW)$C9V3dOzLs*^QX_RQc>mTi#9;reb4N%__Wr_TUD!f1zpRQ(gSkH1pyn;C5XAO z$qE|cF2X?PTd=y7s+U2UYF?%{PJg=Ek7q>;edyp(p2TimuF2>I<5qIn2>l3t_;BwW z$|xUQB3#XdNp&Dap2CLa?aq>{yoxt}9dAAzcf&JGN|P69%@=uN%(ZVKdpIF(kR!gV zHrlTa|Lhv$^5C7#Xt}>@&mc!`*GKN+_lb7Fy7+SPu3>Y4XD8XhoWGHS$){K@&k(_` zYiD>5OLEp}j#eo23d@ zUk>9@g3L$rQVI?Sb^6Heu4gdFp28zh$h0Yg#4{^{^c02(&WjQK7){V9iF5?E+1qVf z1!+uIgZj0u0J$Q^H?HU4kmIohb9X+Rs1~#J&&PWB8s;|9A^$+y`X*Q?e~34G!_xiv z?ka&D=0B9!4#(z3%x9J#uU5os%7>x#^$f6Go-Ik+q7FMG1x{07!xDCq=FXb&MnX7H zF%Ux^SRwk9wxx~(;5NI>;JJU$EpirCDXvkY6)~`yMG~MKuRk`()4 z$g$D{>--_4$QdfnSj{R6vjfv|z-b$|Iqhh($D`?o`=}>) z-FWoeMu4AuxD$|I>u~*WTnQ4>mP+}(wv%|BzhXZTqC{oGcw7)g=jUd#(v_t z-=bf7{QOnQbN=oM_tgQ^m)ZKg9(N6Ye4q@e)Glb}M>tD*%Oj!@ivBYZjq)hp`I^EV z=BKUyEATH8?Du9@nAK;gwFuCbCkUCX$PN}fxxp?2432_!ze2ksV}C`$fyLHsRWl7( zCJ;n=WW;BOBDD=f^d~wnaR|n3t&0>XfAM^;sXsym zme$(4W)WyqzS7oaSiL%oQpze+EWHDNIlPIIaZH9< zvA^C%r=nb2G5>7W7`VV&qCx2RPGd5M$>7V;==_l1&IIGq#_nMq7HXys#{u8q;ffzq z(dUWi^E{`|f8f1*QJ;IkBY8dJq|zs#(oK?76*)yqmfGY^6!H+>fWzv(O+^ik*+;e0 zNs&0V`LRT9eFmc_a@c@noYZ3cm}hlr{uS=nhh^m+a<`K!qqu9KR5jC}b}nO68un$FPx3kWc!j4wqFfbPRLAUv~iYQ>6i~KJ}+`y z%a3v0CG9(%P1f}Q;$M#JzguU=CwQWeo#mPRrL7Xv6G77BPhg19V5+j8N%t~*(cY6| zGi)sC=baoYL(yK`YG3YhT!l`R;P1Xd-N!5rKB0I?^d{{wf*lS$u6Gel~1+} z-Qqu7>|0#D#mZVBSH9sS+8jPzXPOxB_DX8-5@C>7n ztD+!J-oV7l(A!sR#A6Yuux^v*xxBqo%U+%C@L#=+)nn|0b#~x#TNarE!~dUlG{QMA zmz_470F*<~n@?>@3Pt%{8kbpNkEE!WDk)$?NKj>k>j#hVAoX=NJ1?_@RDTHT61x3)3NE5NN4Vm4C%w%WTP@R`}P$caI zKiAq>cqUxvWX69;F$gVwhPl(I(Yr`1*H>w@b5uU7ukuGJ(oPm4oG_$GQ{Y2u+8q!_ z$y(U%ft34d4B$%bf7R8pvE%B5lwxUVEX}hsLIg$O0G&+72_Fe`Z-G0TNTVGWiB_)X zkX+(%afG6Igmxs!*v_@0Dtq*>BtO!lk|3?qc!PK1p3cwM!|HWkMDa$VmKkCL@Z6&S z-NGO+r;43bjBf&?yOMWVCg(J@feQFsZ%xz;Cp2y#b|SMk+AY6-$T!v4`TG(BG^-Y< z+-;NkC*`3SIB+eGU!uu_A%@nyB#3)vd2mGoFgS5c9N%eA?J0Yn^B9^rmm~sxFH`hS zFK!eA;If!#fi*lj%1i~g#wD=(v$~qjg9Z`Lus{T|`buBZy)Jvb zEw@$U%-qgu77=%gSn_{ze4lrNVVJF6XET=L7=v8207BD%!38q7dBiQcWmeLIiA~Iq z&f2G~ASji#ZKvUzI&$K1y8w8c(Y{PDw^0Kth3(6hY6Jx+rxw!%zUC$?B!z9Vyg0Fq zgg*xv`x=d$dXB*UW5>EPmN}B{XWa{!+8qgoWeX(trf~y zPauw!+AYj*lc;?RGbL-k23x495JWz~HZ8Vy=b{gRa+pi+i0v8i*qaV?Gl zO*nf}j)*)Gcq)d9ACIZAo}}N7N*Qbb6eQs4p-+1G6zXP_sO}vr2E1bjx`SSLyle5% zA$!=fuN9Ka3A~v15H?O+b@MOnlS7Qo(rXzo05uz)B(%nI1}6D17RL{B$-R2KF1J5* zGZLE5QiTRbeN-!Ee{9QRYh}4n&$5k+Zm$sRQa}>4$fNkS*uqL*GZl^>Ka`Gm<2-NK zE&VRo^I!*A%GuOP&s#6Ynq~=0DChGhr+9I@Nb9xd@+B*2Md%N7$Lu@KAB{xuc_v4R zgdXX30dGyDKH47c;O7G@Pn# z!`0-IyWmD=YC#r00B2#&M`qS)!&;C*sf}+SVs5o}mByqYv1G+?Kl47uNCZ3UGyt)RkTdpg}o**>0V|scp235ImaO?t<@lU14Ga z>3ofUSG7~!$_1S!adEnLfKzXFZq(jv$HrV4aIpL}Dbdiaxnugk6M^8QNT>AM$z7y{ zaQ?IdDk1^F*n*5ycI}(0geG`8#AO$y;iVQM!tndgXO7?j{=hnB59!c7_DM5Jma(wY zpj#Uh&S*xg^YrH$G{{i|!p-eU9OwTP?YRyT{ZTdx-ZN6!vz#u(Bnr(cG|0or7u)i= zg6))KkIN!rEs0_+2GV&;89=PJXIJO*k(Ch#Z~jILM!vKhe_dF`cY67CV@{a{*_Vqh z4JUpG7aqgVEFpBP9g)Vvk0Xe*f{HndlZ}+7fp!);i#uL_ROwySc5Cy$i&k7Han*u> z!xFdr291ZIQYTAfiq>Z~;D1Xwc-)A-UO+4NMkIC!MjjWThNjA5@u8aqKQtIOoN{Qn z*nsYK(^MPVOGGQcFEuyCciW*qKxAWxYG1Jveam=4co!%X8lB2;(I-Y-_4hJnHMRh7UynB5f{Ms^NT5@PFakqF&k*NVfSA3bABf` zJZ|a*RSsZ21>*cg?Tki(R=xcu!^;cM8ED2w0Rdk=+MXHUZSDuHKW)E|i9tJQND&6+ zq7>t__BkQ6GT(XV^L#o6H_4aMqv3(bz?{bHvvGBukEED#wmO2sd>Iq_VKqJkA5@W` zaNmqv6QpvSI?>gE$EctV6*W76aH4pk zrbd|A>!@TG@AN&zawiVK$e)hIC;J57up3?*NgNbNZ*1vPyJ>|w z!9SGh989hzB<4cT2Nh*?7U2lQJtqyxbp+Vrlti-EB5?%txGjtUk%vPa>Jjg0x`b_P zpJI&Lq@dm61Bhwn&{|Pg>`hh?M~TWHA)74*52jK>uG+kM5x>2lmMp1f4xiz|NFbmPMfuMe??kn)8>a> zGR+PqreT!l$tX(({h34q1o%h_$37rAjnLr&h*3U!z~O{Va$oRSl*WqAGUUGigPs4n zfsc8Ri>JUQC04{-_}T#=WR-#e3G16ZIxAiubKL zXm6;;svPrpvP{I3yTa#^OwA6Hlm?xcvPz}o+Ap=+V6g(7$g>|glg4-^$Z4&Td^9J4C98N- zgXmV#GSvg|*PE51oD2h9{m%=rA$@sB-#&n|VrGt0C*O<_)Lxm(#+EJ3X zWo;w+rHl4Bt~KNan^IhAhsH5{Fe*RKB%b;SLHkjU9=JqTn%+-ntI7c?>e?6*h`WX{ zZ($FdBEludctmdD*TamW+HJ;tox*_uJBfTsqO$O5Zjfw4UFOZjJKL3w*I47om0qe@ zgO+}H6;GbWXMM`Dss!)nDjxb?q|OHh&zkpK6%Y-5zE2kMzXDZ!$C0khx4uWEN+Z9S z0S0j{i||o#tn5MYbs$|vWA;s#k~>i)2tIQ&bW7Rq+J)0Vq9g6Db{@X6+9aVgK>jTger2qG)pRM{st-*#K>#Kv;=H!aGz z%zU{0>+xnAl_E(9kt*+cf%hA;5w0D2sHO$D-9kas4{*NB5j56&n#J;0YVGn2zvdC` znsG__=N`!$jbwQRuYkRrnO+~X)XZi#h12W=)aPoJO1XYghWwUaft&moJ+Q(~K6EyQ z_{Z*gT=~V)p>`HmAQI$)-=|>NU;L-@v-3dvjTONoDW-cytRjghR~&Od><0NnqbKTKh!_oT&6DKOLxe!Ik!?rf|L@ zz{CS{8|(rfrD0uwe;bq=_)GOZsh3 zW}4aci4IL90;TFbh7S^DEoL>ZRMJY;4<=>SO%QlrCsQC`oQ}$C`9-?&|q{=*OGZ+R|lYpFt~%pi!li^Nh!mJ3Os&4l#nj{e|wj*4et_}egqtiCH@`ES3G1H~PALs)d6io}qvb*cT4Aee5ZG{|?uuL;21C#e8- z+h0k%h*1^ZwD5`A->_ym`bVO=gC{tH3}W$+WrppU?%XPZS7Spvl`GJZ;W12dv?S$H zQkTbLPH5Z<-8S9THu>4D+EI>g_vKKiAb5GozRbOLl;y;PynB-@Q{CF_I-3xdo&3X! zgCPLTX&DMXX-g+5Rw{Qhfu$*sicy>pu3hDgF3-PIfv64zb3RsJf>QXJT+5j^6|uZt z4&Nk4?cFJ}Ru7!p)>Pq+xv&gZmGZyuxN>_IKe6g{JTZCcLT#MB8!633zm%9pGClUq zZl4E6J>>52?b-+Tr8>j)e-ZedZ9QoAy}a&+v~{||N^TQacN)n%kcMDi=h^F!o9N;X zqpQvmfDcre|TQzDnV`D3@cNR_<%4e?tcLD4yxgq1FGzwicCv zu}MFjWwee)M%9NSzg~cW=g1$k1Zzb^dikg5^mVp`QE|0m@-zMn&*Qf)V3OKC9AnTv zOz^G6kREzjTlfQI;ZzA!CI<*Dwz70@AJaJXp!?)G1dA$z-h$aw>Il3YGh{KKL%X=zi`rTc8+F*x#dm(_!O= zE^X+IkfsF)v2!}{R4Kr^?6%up`vK$)_*1t~2il9=?qm*inR7Wvh#x&1sga3?`E?!_ zaZD@8j)r-_kREa~E96aN@iAcrUl={Lf{;@1M}2LtghSgB@K&bto1sbz5WnqvD{woj zi5L>c*@<3$($}%i7g1M0yP+OuPOVbE*FD$RITb{E$Sz@*28;zlcuY*f@npnT zt?(rnbIjsrzalrJEkrdzkE#abn-Hq`J!+{hX<+wDSj_-W=yC7+9Cqn)CQJ<}?p@X- zLeM;IYf|QoeCG4~Uw5Yrhh@8&;H!iVgeXy>WhhZZAax<%Ujzgmut#v*A^Uo|!d7-T zFq;%Jn8e3_Vs#<=iFXx10}8+S0iP>+oI0b#gR*s>9PLQVRaeqt*OqvmO?8r^RDrhLvqdx{j_J(AQoZ;u`d_?Tm6w#>EsYdts@(B!+$J)dPIMbFr9 z)wNlT9!!v9z9&Ej_hqUyYY6;*g88zjRAR_ zW^%(O>RDL54vl*w*yuq@j$t=DWO=nw?a!MTw!0h}HzF0^v60IRpqAFvhGX}3zy8|R z7F*kLl1AX9C$W72-sgA`$S_`y9a)}|RH;K=sJmF1^_@7`sPr6Q|5;wC9l@~3qq6YaO!*pts zn9oGc95BKhiiX(6!5(AoBxyj^%60F;48r)dFM|}$m85n>ZG4Av=sxC5`(Jp(0zYO2 zV~t&;H+ViZKcR*Gjc!P=Gab)<&)PP^!87dhSY{tT&xhu@_R?~VJ%E<){ZlueBV=P8LHsdNStLFkPX7yJ3_VTUBu`)pFmhNsvmT;0@VMfI-EP)5aj zm~6U6H%|7|+kKb!o?_G>^oPvBbOys*rmDl|2|H)L1#_@NaCY^_@$DR@Hs|3B7> z|L-8xKa&;L56$S0+~CtxXoth=L*fT^qxtvYmB!eK&J)D({`dgL55yK#iWZT3_~3Lf z{pB`mZ7KStJ8C~llfqHCfNHsb^I->)5kN=I@Ml{v`!#%3V%w76^BH(d=7n#I%JMlU zp@k`A^7uiZ2lhs>KzlNu@&Zev8g1q#nY=eDteo`5K@@?)9u>VxKc<6^zph7lmR?X7 zO8h+Hcq3zf&$LGHek_Y1RgLS7`aSq+Vl~Ms%3vK0gix9x?F7(OodnR!`OrfgHL@C` zU&XXhUChxm;!Tku5E+Z-c%&kT+^e5?pU1o7uL-4LF>5z5@N#!GUNVWiz8!v^M*wh*><94P z+Pg<&AT?BkB-WH3j#b7&`NJLSZfRm~S@^0av>a#qNL#gz(|aX&m*P2)lk(gKzg%ox zg9G?gxBAN(o<&SID7|-5Lc7Y9lunzB&p)bfJ#Lw3$OL@dP=*u^tPD4 z6WT0vQzxj9sCVo6-B~j8f=s(z?H~q{4Q}QV&0*xd=7hwSt93aM6^1fzljEbu9Ny*Q zPsKxGjYw$bAX)yfETQ#fs>+3o5lc$CLZo#vR{ywLHmc>={Au3cfE&b`Qqv(1IYzD0 z>#IF>!pEus{~3T5;NQZqfM&1Odm03Gi?v45J@mn*@Tfpa!n20sHHBx5AULj*OGG*# zq3B@7=Ekv!zHnx9wVF2hSgdzgdLsO7#vUxMCAnI6h^n?B3mS8TgHjBmIK@xCMoL5K zADn3gU3}&4cFb*ulgPh7-y_;SgpVK`DrSsqw@Q-Mn0~_GQp@YL27;t zJp$_ivlKN%!rpnNayz-fdEBZx8z#S!SPWQ#w6ti)qigI(7IAc_!>xGs5v%APySzjF zn2|QV+D53$f#a4g%?#KM=+d6)jE^-sw(5W7XEP*p zaIYQ6WFB&`2vZ-LtSUr9d{N#JnOCCQepL(5QYr;OOsY5oc4$ypm;%sAWR&l8i05Eu zx^(m|>-|C&#$euX(waO?phc6!!#JM70$L4?l)jlmwgP zvPl>p!Y1da6;9^QS#RUBOA%1p*0q!l1E! zQm2dC=gP~F&=k?gbhnoPP4Fur8_`PG7C!KeW@{5ZkOUDI9yQ743r?8aAKcNj1vLV{ zeU&G^!j*Td(eK{Uqh@sx46qy>Ox&FYyCxaI&XR-t$dFyXc%KD2-xBXvhhG|2Q&o1x zXsSel>KVHIjw|`HlA*gVVX~s2PlE&(!>&0-YY_E|z8U!)pPAg^5t3t<#47(ws)=VTKojT|W|XNOKj ze3MmKOebG-;9rXtYkK-AJkbi2B-IJQo6{5E(a*7~bRT#t^)0xZ>x}^r-{m<|z${ZL``ClQ&p#g9tIzP7 zM_OEmy+%t3Kjb7zCR(*oCwBvdtk5-wQ&rP9SUJU{l8{(!WL*2MR ze0`^@93+PMdk@|o+HkV-N5h9s0{7d)sUDwMVt>qhH^{rMSH*+h^F-I!#p~<}t}$9s zKR|*wC>O})ret8Y@a_-g1s#wfZ^p5twbZ#UWi>qRFYGRdwzyPa=)lex$Rf?T)haf6 z3sckT&K2rz$^zEoSU$%+nry%AAT88e=S6*!eNogm3cF zn|MK4?0)wk)K6*9xoB5J8WePS0OM<;ZA7R;4Y<|>pY?5PA`N(&kDJbd*#g@k{ju=q z=VRr5!t<{lyvae}7oLJcM0-xC0m-GPq z5h(5OVf?O-NwiO;(M5)*_8VZDC_7a1!;zJc0L*PE?tHA822DxwTdnc5>}1t&KL=uC zf78(RknubrNu-5U(}&a4sdK)tL%k8)bpZw<7WBP#!Xur{_P^^m7;6lzS9;WDLYbk$ zgIB}mQ_`rWUVuKvdf1zx7)=*^RZ6SC8{Iar{0DqwJKDHaU_CGmSw1E0n$4Ge^&q6t zgnlIu;|CV$uz1D}6Q97xC%&*H=btuOkuq0{&OuyZo;1PBRnPKbOl5}a(kYGNjta}J zoO_~oK*!|%VjH)}yY-&O!paVDz|gQs%C<#AaWHVeh<#y@|zC3`!e}3%29|T zEvd!!?#}QRq*r1$g~V=}E9mYjmxU+sn;b)ti=Lza*wx8->7nhXH=<6y+U@PZEo9$g ztbm?@n-|4*yZqaZg7jW%e`wxTE5Cu&&0#8Pl+N{>524GQtt1DI(06*`J3ec?pV?yU#`V=W zlUKvD=k*|!zDaqABz^mtBXRxkm$nNQyL2)M!ts01%t(fJ_Er1|{XhWpLPYBFzY1Uq^bAAlfD8&Vp&u_7 zb4A*Dd}GPAvKznsCX%YnbgN4}rrip9d6Uy%=aM`|e3(wPN1!CWVRBRZRmN#)XO3yw z(ko8$ktBiH!HstA26a_R30-lI((J701|;`J64Dy^kR{V@u_Li=^zYmb`um^yR z9-JFyPuhNEwp9Sw50J_JJU!7tTjTzs1w>c6^yiPW=svvR0F4WJ_#$118;zB#i#pDx zwevGwukC=CZAB_U_5F2XQ0&{uPApUUH(Lq5d9$D@P(d=FaWW(eXywI-Yjb|(vnU7$ zsHNLhUPorwlR_dJJ1TmUCQFmEMQbA1_#Z+Rh5Dp>UdKHE3WgnNF3NFAb%=AU=DK>4 zZS4}ud5>l*+Th_GV29}VnfgoPFrqqb7mPS{Sv-H6$0}V_Zuu+Kf(&ED3v)}R=UOqz z^H)fp-T8XIGQ)2M?2^tZ+{VLu^TJ_t#Yb7&kQr5J3>R;*PqWQASPY28vXiaPtv*@m z6Kk(vi%u;vGGS$IXksi35zZy^Kz~8JfA<_Lq^1Bkq2S?l+bgjP0q7la(~E; zPJEBND&@Hr<;NRI3PUm=A@9X0koT#Jh&~_VZ*OyqzZl|h$#Fk*gx7pL^C(^def4TLmND_nH2H%anWkslS3i|qymKP=jfZqKjfhs?8s-CZQiLrP$O_ zxlU`@pvPrud0m6{kAuP($x7=~lpCr&`RZzxKKb|^|KeBa#BLx%tl0{Xk+lP}aPL;o zIhkHdx+_C*ZiFqtI~n!A_Qx!SQvu4;`*ywELpQC4`43FxYOU`{uHbW2CKZs6j3v)Y zuU-Pp;S<}m%r06$FoYWV8?YpI_c!j@jh5W*rwBBfuPv`7q#nh?>(XsSW4zU8cgMKR zrRl%_y1R>elZW$zij@q5+>s0yU6%CKs!XpZDons=k`$O@taj`5m_D>_@bsu+B|da%s1yrT5z*EBy|6&6L2nv*%i4{^`mW0Gz^#?vZ6HNDebeP`fc83s6?m@?|5R) zpKN80ZME6)3k8OrlVRo5#iKW^^9uE~Vg+$YV1#^I*-(NW|bApRdLt-gjl<#1 z4s+-69AHTBDQ^%{R+wT_LKBzY1yL2ne^xS_^6?7`@EN--g9M++M3Ml8^Ju#6aW$Mx zt)|9vdx7f_mQt%i+|8^O(z=)UxO%t1Q|{(1?98~1M_JHHu;v5zR-Zpy=}ON@=p(ZRJYgd`ci2u=KVLcesF(bG>YgBo8=OCPveMpL`$=`8$~;1&!~K>oxU5*(*O zx7J}Oahrj$wIQy8gv6yOk$MkhB}RMIx?@8u{~^g(l{k&1)G$Ge?*q#pl9~E9cR{{J zW3)PgW07!+Cb=!a=Xp+PIbtf3#6~g|97!Rn$6W!1%U&GQtuDeYV{WPu#=`3N&TCid z_DHj4jaU8D-h!T#X8BOc^Gl+w$V%PNO?<~|5xY*gExQT4W@wwQ%l;{H zKfVQbe>|Qh!oMBz-rX|n!}->HA%|O%NEcTHAoRKIX7qr@&FP{R4%YHO`#aa|_T@Rk zh-OKz)d0j|Ja`~D7}TEfd1ZF8!w(-Kbv1}wxNU4`JNeDkTI7D5CE6+iIz_(3zO}-h zUXG~;s?hnD9EtcGHwB^bBWNjUjzL>_nxFe>hI}h*`!`w?A0Be&JL`$<_%jgci~#8} zo2VY?Bo+*cZzS0104-m{op5Bih#i+ieX}o#a3n9>#{LDKwP7aTbjMt>*VWGcx|(_P zj7tbNp&?HxTZ^d=TNt7U#?_o+V`>vfx<1S|xb?ZC|3T!tNLRMcB^cp8KOkiX%$OkF z2ylun)^K>_ad)wXzG!yP0u=+~g@@JHw-xLrG?6(S)c~ZC>A@QuW>+FKu9iB?{$0Cu z1v2u_$CKslNbOAnlp~hf@k6Q5BbZ}1xncFnnY_@c{4_9g8h~4`Q`8|B`Z7v10UEbY z(_@9||K)%}AA^6hd`g<_9k^WlW8`wD5~2ETR;=devWVmZ+fmyDsyga*2dM5(f)|!^ z5}@k%vQ@kV{;Jk`>Nqr@ym029vbr;LiM`wGh*;G~=G!^8Y?f>};k(nZWgP>dQUjBC z@q=pYn<}vUX)(+(vjncm&DXL;h^vbMz!@4C&!JfY!kkx{O8_a*u$nacTQaiYwxzYr zrA7biY6)zNWs7mC%hcG=EpoRwS5sL3!z>a(zEqwlzX<^pbhaZwhoX+%F7vvBmtLOW zY3dn4_Kb@}yvt@!L}LztYjCK;=2rt2#-n`I7q|x3I3ILhZf})qrO*2~Yjd&`o;QO) zo}3#mT7pbnBO~N^dtHey@b%aDg7jsoEI=C><(cUW?HYaqR>tA!tnF^pauAvrmF~{s zI+&04k45NlVHGQy{$FZfNWKUfaaX9q*5gHxV)IG9_7pe? zV{7Cx4`pn5rg+6-Y8g?3(-4u+ZNuFKT97X(S%cDj+)FVe1Zu@HlIH|6 zSk@T-p1rXiv?ogBIylq2f{*1=K$eOw4bUixLSQB}cyCYlmhD!sR?m5^-JAnx(yjFV zX*(T9rij*jUuJV_N4Hy%QKEAbAEFAMt8cSZ3~H?CQA<4UO)-w#NbnrPt(^uj_2@Cg z@t^Nz?VK#x>+1y9!y=Rb%9`CIRX;c~{PNJ9FApur0vD(qq(TNyCw`3WH5AI9>?OA8 zw$OY*gX0L^JA76~d92pfz_Nuqp9__ z<1$O_)mD;t)fX?s?At20Cfd<)`M9Hy8m|T}^$v@`V|Km3hM3Me9m*F{dG<8PX{#TB zhiH(@cnfrhZ$QYcHatQwx?3VUlvN_tsy<77q{|=Ll6uj*z7eHl^P!u+ zN|{e}nnd8}U#){I0CK=F)?j@LUCpHs{0$;jLt~g28nt@$2D`T7ZF1dZHUmACe1KivuH~u3T185fy zvr-$_T+7Cb=`8MXZPPcxEIb(U$J{W|p&B1BH5r=g-SoIbai2RiSEvDhZh(BX2Ka)O ziF3zJiy#l~p=6xo_$g7<>6JFp`4k6QRJh}b_$W)(oIj+Z8K8Z`~<1O^>~z5P~iJAs7;7@m7l=7hC_o<-rH%pJZFM1E;W-AK5u4$mdt^5bqLeF}V>d-3EoB4^-vgV=ECpSm1*Cb-i|$&(2|CM)j8JCd8zr z5M_X0IN~w09zaL($h?NzY1Pg>ZHA!JZQlp#bHy16-pABuyY2Ce!2Ss;&#naTNQJ#Q zJz*ONYz&UoDbf+miKd9XOZNPdWm+}o`B4mksW3xOT<7z0XNvj9a`QknR^`oj&?YUD ztn$)!&Hy1@T@R1M@wRlxJ3{hh>CuTIKke0{d@v=vQK>by^NwU@_0G!BCWj&OfaPJy zh1Ad6lZ9*WyR%})`c&K%v<+_Qvm-nC2sHq;k&a#Xi0Uv*`14j=MqV`^wS`LT;ILhq zbPX+^%{T`)baTiq&RB|J&s$W*3pMo`S|eL{67{p1;G6qtH6dv`0IY@|U!`pfR2Adq z)aU%8qi0~RG=)*ec4je!m! zPbbSO@eRh(Y{9ntq}|-uM|!ip$hrg zV~Qr7Siq+i5s>mpUjsIy8@j07+rd4_4&GFr_QJ@{d#Ly}BbvWt97zv_eVn`|f~`F9RH|YL%7X>ZbgUfI5!R8o=V9#FqorUrnPU z$5En?C8n(`Z590nPL8tDuV&4KJ>gyYu2+MspanneF^!DH0JAT!R}TBpWX^#_~9D0CdfS#j-_=3o9jB%D(WZS zu+B&0lz+b)1S;(%^A6gu=<)@x-3vr<>neMH39k`bKZ;P~Q9oVGC?oP}=zUCGyBIdw zT>P>Fr;2^Ml!%g-m1V2~XN8s{IS3HKYRMVLxb#d5Jb9yDr(dai6}|pEm>;B&2P6E3lYc0ZlC}~rZl+1?Nu|A zcw)6pt>ZP-(=nkm#up%(=uhl9@r~wD1`cf#6M0&chW76{Y+%UPGL znVd+C4bNpBXItqI5aoQ*VY=xxAEgS~_omtHZSJ7g`8Xwfew)QwdAcIIvXLJVv@`2q z*TWr&#IdXqqC=*t*df$GJ(1>JYGcXh{`xNdpq$zP1(KljQQO>1`v_Q@TUu;1C!27jSdB@(>r^k(3uNaGEr8X*S+~+xSrHVTOq+w;@lL9N_-1MMIx)!|T2NI*tds=b#C z?PoimrowqH*SzH(0rs9@!Qv32Fd^C)35&b0P z13h6yI_}(N`9)pWaFFb{RQ`V)7PYrbR^Oo*dFQE2_D(#j7&bd6cjfseE1V9J30};d z=NnyAF0@AnaiAqOQ}HE4Tf4|_uOz|zy%);czLfy868CTqMVmXrg>&N!*H9WM&Qu-s zWQB!Wg~M8YZ4+t4r&+r)3ncn#!sZXrrY1W_N`t6RnRoaxSB|(B3JunuCG`%vldNmm zke?R8@_jOI#UO&{lXf;uH1ckqQ8S(`Xf7b*EsJQD0vKfo(t8+YY>eYkcFI+ZVmK{V z!96(CK{F-Yf-9@`=G?AO+0-kN!h-Fz;I{OIkbsv~x;h2TEwtY>@U6x6Y>)is54$Ux z+7Z;A1*50f-w)Emp2OYla0ja2XTOL=b8>351F8pkUF?OBlmMUr_Yc=nzkEBcfe3hc z&PxEHIi{W0TD3sKokK&_9Ac$VI^O~O`;W8NU17U$&?;7iL+gYk2Q%W1&ZBe zb2g)L6$@%~1N-};OcS21@HVl&{VN=2+5-S~#Zryv{!bh2PYq6+ekAvh&Tyfpg3p6l$Qv*tl_W!yO>2NxNFh^|Y!MHH5^9oc4D%XW?^0&GgpZh=e>h zO1;bJsO1)9g#lkxhLwLT)Au*qN9}awZ%HcrF9R1of+F*;vKH!H%lGb24Hy@S`^>-4 z&eLIbMmBQUF)DQ#rlFd~@q|b0nN@J4h8S56Mn|GIx!*XNh`@=^u!Pgyi~RUVNJJP~bYhU*i06ru=Xqe< z7@GmE#6~=yb5L6EjJ%H6on^Bj^qNyUc*up`4k#xsjqXPJVqM9QzyV9VVh$ddI3L2D z18C=z*+&DJ$!X28O}Ac(+}XsOqp_kEaL55GF88+le#vewwr{Yo%<`%z0fVj&vR)=x zGRV)KjH0nCDNW{8WIG}qXxn8rC61i$wOeCE;#!9hjFZKtnGPjJbzz!Q*+Rn`8%4;D zkhotNv|}9goaI?8u`6t93yFH}!P~P!t?UfVR}I+N-OGb-KWZ_RZMD6Y%(&DKo>W$i zfu}R}9JTO+*aLz~dxG<8amrd^Bif016s25lb8)tq_HA_orQw-$ccf+UoM-3UQYM^! zgW3J|wpWz)t-bjq!T!ezLwbc)McVD3hndrgmGbOOgZ6hHKzWxHLuceJ+!nYhSFN*) zSMp8@=K!;OYW3x&JIQQMJ;mWC>;%53fmq~aKf@vbP6nljV{&^SYw z6N3ayv@GBjB`&jT(6NReA9} zyLp9OwOqW)DuB$Xd(~{LTv>*88~U<@Olmmg^U=6^s2n-c-n{@?zd)4r+EWvYBZ32L zeoUB)7y=aLv<4vlxaHe71r6r~?vfvpo#OsoPZwPaVW~6mK5aINd-Nf4%~?qC$8!JN zn&+1fx&OZ*$4{sj{*~dkeBQb$N)_~Md`YUJo)=@)BLFTcNNbY8LDbCxIREI&#K^5g zkedZceJI}#02t%r9Wj>iDvN-C?bFe<tds;S=u3q98$6QVV!LcLTBqUQGJXO@8kLzk)6l@!-Kp^IEZ6xEIA+(dq8zRorVvThas`! zDMj|p!dwqZJf=FnxLS(=EWd|3wy;GF6c7`Ke2!ilGJmUmrGd{6MY{Q(pGwOv%MjI- zi6v%>AoX{VBrc@at8mZ&3567c+DuQqb*Mv>Jgm? zWzd7s$6$X2SYKr?a8V4G-;Mwhq-x)>Z&y$wKS7pSYdhO8zh!NxosDQ(9_sz4iF`DR|p^!5`foz>5VCKdBD*G|6cRAE;C!?z&Z- zAV36+GQvYX==pH_bTGkl-PDLeVR>X?X}8-3!cN?4{W7K6$BF=L5=I_CBB%2lPLrto zvs?NiK&hY@dq>wo4YsMCWOGnt8PH z27FaTS}E2)S`*IL+Lf-lEaE>WtjfR`5qXTKuYoP%b|fjSw*qiwm$EKlSZi_$U2Df7 zpNoy%ub2W6eh5DD3B387mdr=$FhWEDWLwA2R+F4*^8suba&{wrg{|mG3p6Q-IQ$dW zv06yCWV!h2-e#M5G^-lpZrj#lTR89{28yHGhM;5TwCaE|dr!=Y-%iRyqY_pk7IHJB zCh8t4NM-4Fe*rWaj$Km;hU}tte!oK=7q~eiF_7Ithdo^@p2Vk4IPr~M9tnw@&;t4l z!qbXdlBBLYs|tM@S3&ztonHID(Mtr6oLPk7?<|$ z$<;XNSBg-UFj%ba-CU#5hEk)%8Et+|&rWf}d{^`&^^%5@KiBd>WAItLTd?p}ur@j8 z*Wgg%oRhT?Jfq@&QN7LWw>e!ld2_SmLbCpf&qlb(Vlmf;HQ6DZL#XU~`3}hV5L$?%n~ z=>1V{>li7k)%ayn1PB~-Z66Plr#Y*sTIW>h0=#hj(d6$UD?v~m+ht|f%~22|w4*+S zTHa7jVQhi=NNg5-(_%W01-qy~I0;Oy^F)SCg{S~q;c~zkUX8N2%6^@J%i&-%inG1A z8DVUMhnrb?vVb#v5+5n#%m(8iXIn(^Dx+wD_r)V%);WTSCge0>>)~d{IT8ssy<`7B z-0T(7r91hQ3068l$ExhkNsU% zmqZuXK++_2;->wf3Cs5^fzHBj}b(O-!6uk0oe!GU1f0H3-l-Pr5>V{GZXCl{F zzW&cK`-uQ!RRz35cZP=($h_^ec|C_bhjeV^<5oJzm|AEMr+q-D(``p!T<_XjcnyD? z60XResI}|2qc%@cULD9EewFVR@1cO&>qBOm^VE`k9N1XElHmzfqbXzf)#}!159d@!)yQwZ zv>n_5pnL{+2gOuS(CpH9S_Tlal3?z%L77ciP!mIzMS5V5_8_3AIznjzBRdF1wm!#7lO#wVYRrf1zlDYMan;>1HLY#rc76}c!-!VIHgW%o zM{8+(Bh*VZ|<0BiKnjNhm1K0+0eAEuy+(j0%`kMk!HaX zHcVl4|A75DfCKPz&v$5Iu$cU{RTX6k&h4o}-tKKs$9|51pXwPAIXMyOoP4+E%S&lSkFsF10uJcaKiS>UIcZ^-uHrhtOx% z=FN3EYnC&|_zxeGF3AjqY zW+y{VOsqrlWf{@k!4xI!bUu8N&2i9#X09WOrtYX*Q{yhJ6n5@rO+?FOhr7ypUJaKn z$-*AMnOhS=`UH3P9%;wFe8ki)N^O3ygL7`P8#%Je4Z@iKa-GK_S6khqB zy+0re{;U-@)RVbVgQjmEepF9jk$?$ZoB!==rXZq#mC#XQ#VnK-^n0aC6L$xHTdgZm&F%R3g%nwAeUUupdkSp zEDZ=&Y*SNs7W&(ZGH^s*kJ%1&sp@_6)fEEr{qxDMTgZ(Yff27#kVL54?~r`g>vz z&@J@ zx41K(c9YgszNYm^k0Kj-kNtpCF~9^~?6JJY2*F94oLq3a6eDXy-Nl!!!Y-G!GV1TM zPvfHfM%A;J7q>hj7P&4P~~?6 zDbEnSY$Tvhu~l^QYh5Q|bj*HMIC#|jGiU(%17Poese@XfmNVqXi;Q!VZTB;`&Yc7z8m zw)2G<*n%>Cv#VrE?3Mw4l8t^JTL`IKPkh3p z&&p7FT_9A8q!f?veP`i|f83}X=Q-O3v_cxgQ_be5r@^)-WSZ$l^;^Y`mS#IR>UADQ z2JKi!2PU@X3Dzv<2|R3_ag0%%hn)qn>BCxUSYXf187VUNUyCN@siX5tzUOfM?M|mr z5$jGf3Xs=IG(#qzQMfR+YoBj|z|b2*v@v9yLlY+Y0BAH*rf_y@5&?xI$Qd6qCv^(y zx41gw(RNM?Ki|mniL$dHGPK@>7&e+$y+|C-Bg(8sF)Zbyzjkq}51rb*u~Geq`gGmi z0Cqr_V*<;8pbO_HvcvA&vlM3y&%21HK9>+((%#W5R?`t~f(1pZkBad;hEc%?4ev7C z>M1F3br@i{$;p=LR@xuuKI6taSQq4P@UhUw?Bb|zm)83IXwXj5K`Q(x5BU7trm!s; z8biE|uFE}asm!oU7%c;+cr_NaSj5$WV>S-(Yy2)%#z?@P6JRrE;f8cpZGQt;?r&58 zb2*WPM(1#;p&i04b8VPx?(iDp)Nmk8hF!`_$}lflZ%O1C^9@q<`OSaRWv@*m$7Er^ z8_Vs)xjgE0YZwB6Ra_LRjW81#y`KixA8o%%VF~vq_(@}lqSIpbBRTDZ?(S^>poI!v8X--b~&;65IYP^IE=u) zj=*qVVal*rT{U+I1(uDu=O3(y`jgNLBibP*wz(z$WNN6Xr7=_^1z1N z8mf7A$vSbJmyx!iU#oGkntNH)lN>-WkcDY>eJy6|@lihX;ETH^;9I*ak~`K++`$p! z+$UlmrrvyTZ7na~gF2TH-X{ARiKwunk;;8h{&j?uwWtDD^o&Q&Z$eMrw@;Za%h)7R zW#se*W}2cIDEC$0D!ghxK0Yk})g!}We;<9S^X!s}4C&Dcc6<)Aa!0NBwbZT321sHf zn;Un$%qXWxkS4(N}}C@42rWI?It4F zSUCo~)$4rLHp^$v`uN;JDmrp_8g>r=kJ^)p03mw`8s;PX%S*jNrH4QJz>fCWUs<6D zPW+-cPhN3Wfdg_1ra{56z7U1V0}|Vz`E*ggk7vEwj;2bH+xN)nZU|OF!}n9C~>9mJPqS8>grf$ot5C2L1-cAPVT2wk<2^Wtl_WM zxLmy0iU^t|O?K4w-X6!q_H0vk7GCPLcRab({yGHTyxZ0|os(()(RK~i+I!mftA@l> zxY((%7ct4mH)%h|2$^JQv@yREL4*Wk~gq>bhNSbFb*A)K%H9Q6DG zV1S3z*j#k2tv_L5jlL(|QK1q`yEep8Z1#w$=>N$yT+>Zn(cd6#D;K)+IkS8DRJg=S z<{;Fy8(}*e1t!DWX75{Ak#dq9jrr5|%b;hIb%3BMH?R0zA95_*9@=U}k7(&KO~0kp zZot}3?zX>G6ShJrUiWWs&4bnUj${)?G?l!Z_d+%+Vn8WuuPblGOKESS6-)=nrA~W0Gu^4W8?Kpo$Fc!(9QYuUQ!B? zfxcxWcQ%vBiF@b_(#t5m#h5VRSQ*7e3)Wz<=dxO8&uy4hq;t1-$Gl|gw*N0lMz6)y zy|4G$tWLXuO|D42cuRE)Z<{DcLcU&;ulXUwmhQASNzAhy2&kvG!rt!$dm#`OBcP`{ z?T(=RzRjMj249QNG-=lrIsCfV&tnizP)x%?HTqhK6A6yG;@01{Y0yE2eAR2Xbqg&E z4Y9>}>G>n}=_W7sh8(7IijyZMq0LLZ1re^O4JGQlEU@ z?RfigcbW%$XXkTP?@%>mp>B7l4}(Ho(yZ--xZrN*sFACj_k_!#2}aY%5}$*A49|s1MO;u&OcoJv^^b&95?A5%Kr;QxguHyk3*jR)O zjS+3*ZP-Df+>rDfcpbX5bYf4(08j7XM~D2k=3NLRwjU%)_z@Y>T54UFhifI?wN|>z zHSVrNE}9!ZXAmhB*pJZ?e)n&wX@A69e~1BsVlKy$O1>Y|J#->|lm_gd2wa0+Ch0m< z({R5U5yFT9qzFEWhjTQIrvpo;SQIOQSRl0BRsUIjkE{PJGKN`O4?OamOfElS&_1`w z0o-B2kQsR{rc!L(Qv&wfH25`~;6bm}%Zefy#Qh}1Y<~Bv_kM2>Y{#m0o>7M;^_ zI~m*{9?zaMF&;mo(Z{cSt-f;ae85{wBUS?>*KM+962}NKi1B8ISM*2>i}*=lD^J>Z z{H&VbQ0=lYve|RU80&2o369KX3R;5QhsGxQded(-@9NVvN-evEC&7wn(wiwYmQ+Rv z(DY&}FD>hk#ci}wFKcu0+KS1hJo9-|XM;{$ZZG-6eB)cL8NLv88K6*oe&=)7+Vvii zh^z6Y$+T*{m)|+MPo8DW4i#buMRb!HPAK_|0rz8l#e<^HK|j=iGIVYXR`iDi&43XR zp8R(}ia+Yco*jUuMP+}tLE5JQp3+ulT;@Cxpqex$7l}r;SJR~+65(Z=02NU%fa=|Z zq8WIt3$%s7u}$q`#&)54i3H09Iy^s5^l9|t(&skpQb+&GH+KHFm z0ju{S!RLpgr|?$07M;J^nd|L!rLO^2=-~yAMUl>zRnZ5#+y0)zH5FT*mME9nF&Un% z%nrt_@spQ`SG(3_9@9i&gRO*aYM92e={nU6o}RC~#opFBf81rQRcu~orHLgNg^S`g zX&oLRPY}N*NuYw9Kp|dIq>ATwVD+WYW*6bHZV9TW_X}J!k!mL8v{=LygyrH2lV209 zTKO3w?9x8#jI|-bqwHr%A)WjA6;yxZplRRSxUTPyuU0e1^rN|&WG}{3!tR3szejiq z_|qL$DIzFV1UnL^+w#^IrYO@|w$R>PB${m_DCn$b3hsx+R9*bInOUCq!EW05+zjVM zG3trR%3#&xe`0ndElGiKR zAfOq5ABZFSL5b$L5M3owuFh~2z1pJ|l`|Nph``Mb00CqB@G(I=XrIwoMMQEzQckxj zUe4D-+un@#uxORNlSDM%bGoI~6(hPu{;(g;nG+114}e86n{9?mF^;h(Fuz9$*UjMrc3}k{OXj-X%37dulWs=tf&n;!9O7Cmfz^oBu|b6S=pWeOD3 z70m5OdOfHg!kcO>xxsdvl{>q%u+K+K&1|hfW_pK^~Vv`^!4 za5mwR=c$Z6cIz(z-jsv>L@2AU-Sg}NMBO%mcE%Ak%WVZ!dw&1TBn^?#q~UNuoe1v) zs8gMz4!^~!QnqkQARIkE8?4mmeWB>(9@ODm4U8Xu=mmPIC4iIt%H`wH)!2_lsw!Vm_oXtXm72bt1X$rU^ zhVpHaON*}_iDBTt=7s2p0zDwmFC~Fryvhw{T%deG!x{e(^K%o))NGuccptOX3RhLb zyKQkU#g|U8#teG@RIA>x{iuno_6lWI4@*lXX+2&P$*m+4oT&Owb;efgEbtYF#xz57 z8A&F?lG>;pXv3pqM7(Z*c&$ysE3hzz#}50Xlz)*wJ|JhqA+2BAMVz`YX#dXHSJ&fB zR@uwJh_{i|3sM`A>olGqsCK}vZlsg3r=WTIkkWK2=*8gbSD zndVR*BjsqOo%Lc1TtWV%k(DulsHz;d%cE>xYB$eDHx}%>{YPZd!6n?u7~Ewz1NuuK znR-O@bW(gT_q<~EJ@05)uN>_nEs)lpTK;T#UyhzGZHSKJV@XMUnP6b^qR?cr zD&4USfR8`Pg97H*mMF;Q*aAF$z_}H-$^*BuBk*4xT&ospLd7leke|)!rkywAhq`!P zufg=^4)I;=^{4PeF zZzLzUBFAdJb*mYc{jp?dwcY(9@I+Wr8WIFfhe zyu$Q!ZrZZTL=(3ml1>$d{1C0a0p00gb%l)g@L^xdwhcrO8v0ldd?*GndL`-E2zn`q zxVlH&MPs^WO$ZF~E1~Ixs2v2?(L_yy$|9Z0a6!Z&-UOKXh-F}@syvmYJ1yFevcD5U zbc>r@+zR>jJ29Qf?f9I1(hZKQ1f#$071rckXb_U460a&>?h&in zpf?_89!78~+1*PcpHkZ?+8i(zXw3i=qz7W0L@FW@=q)P|0n|_%9Aq=RMENz`;^qOn z(KqO0^#~LqKkLIB<^WrY*Sep*Nr*8O*6hkKPjvvDI6U$sSG10Fw}jmCj0mY}jZognsPNlwFPcBALAi_cd4h6kMmjjV0n8?HIC?$xBc*aX?AC+Hc1f zVF0AFK_cJjE)7vWdlAz5g_8SHXzH2rVSgjcT}jy}n^ae-&%R8%uG2Zzw_8mHqd3{g z%uOezY~>bhruEOWje|{&i!RSw=~jwd8oI-?uY?Gh>*W!DC8{FeGyx`X6Ft$LOZ*@`@z-wc#@K@5HM4>*E|pXYjL0!V7V zP9rc9okl!oepsE%#6W=3pB+%@0PmOZIo+3|Y2VNL-2Ei_!0P21+$mO26OiJ-6XZub|EH+r&=N#97}xu6!)i{Hq}{6im^JH zBHF-{L`7Su`|j3=SDJ?p@yq)k;%no_7H{>nccn*?kB=jE>pU$kS`NNsaWDc>Uc2OP zfqFb>Q5rdMjhjEa5<;lCHfJaLT3z<>S4k)qFO(g}>n^U^*CJ^&g-9$HX8DQraBSBh z1Bx4z17^5t8u}J$_PW>l;v=vdKy{X#OZ70|ki&KWQ!&Q3MeRNlezl3t4?@qsvRa`M zmokYuaRXz&u*)i#=`I?wavg$w$kiNAQqA#TzBjB?cyf$oIip3#ELM3Sj+$^VbBNxx zjq7nzY@+5je%Ik{^~Hm`$F2z=q?i)43!1Esu2uP{HT>brIT9iA|8Dy`xU&rrz2h3? zm7)BU?zL0s3eDMh!c|8p$7LXRWXgi!&6UV$qD*%=!kdoo0IZ@ELY?hch%9v$3sX6mAFw) zY=-Xv(xO(00VacsatU70hOCuD$v|vYguK5o5hBK(60`4nvxxjHDGHXib5Q$V%5xz% zsToC9uLp@nW%fkBcjkS%Re{jgp)_OiTzLmkH2EN=#u0)+v{noesch~ai0Ur>Y-GJc z8h7&_)+>B6vR=Ul>=R=B4L|bP zMRa*yK#sGy&?Fn=-&x3m56c8Wx6r-@0`1i9`)@jfyJQ}SaGL|67Yk)kkSztPg!R3> zFGw1jkvT;7|fRCa6z8Gw4>8aTM*5qz1kYGI*a{;&oQk*KHMHM$M=xPEK@^ zh;hr$XMG(R1o2M(Dfv~ zdmPmOpYmB5mWZQ?eGpAU9Z*A!)L*rX;3OZGQgVm#{@F=_o~w9}sz6L?+i{saoQz&l;~wlRi&@1eLB#pdxF1xGM@2-`A07A1s5N5x zHCa&9P5_@rkWz;@HRKeCG$ky|;;C_0d)wYGCf!C#&HO3RY%2Sv70vuvd&aryY=u@5 z%+X!4jYz2q$Y0z*K3TbMRi#SLrMzi$2WQ-ki8$rC+VyJ1i32Kik_N|+5Z>A84t20S zVs3Fi&kw3;_5wV#s|i)N+gO7B4qgf#x^7-DiMKDc_ce763_*=vmx#{ddG8%F?BbYK zo_=WCNMee~(SD`w$IIw`#QS6rlY{7=Y64MdEpwc%trQKADuO&|57p|s&!X#LmJQ4G zTtm*wSA;;BVDFGS`nP0m&=tzo*%fDb7*n2l3|`cx%f^PtenID{E_=U;VDXW-TbI`a z5LiexqRp0E4_#Jt7B*ECB9m_Jr}{6*)P&PS=ML?EpL3Pi|)YN2fEY`8OJ8gn{v6oXX+l$*gpJaeUOmE)eu?PLwF z&{Er*^GR0UA;KNTb`@~Gg948eToU_*IBan<-yNdIR(;2O7;RhRGu!fZa=wG{t@Abf z{EqbOO{Zs362S-nGdoC(+rQ2>HE0zlA!UHnO>VK{BXp*bQ{paUsviQpKCur9WNyTF z^O84S+)888aqI1&^H8tK7GyQo7L(C9fLS%{M}WM}Cr3Q{IWb!;=j8yVpc-bmOn5`-t7Sn3kyW2%N*tm{htIvj{T_r%b;O=2i%6?dU3r5mK z=JHDi#&=Rn3G?o`8%R};PoiY)v+91{!bbu7LK?aY<$6Bb%SZi!q^lngv$){9X3BT9 zGF6C+$6|0^6_lJV`teV#R2{bmhSbGA)8c+FQybGclny! zZsO>;4l)x2)yCVp&uXJ>IGHs&NgaMfwbtQEZ_+Y?SYq;7)rDg13AB9Jdo-Rp$6lPb zB1i?Gk?XW|0};VnGWM^uH4)<87Q4aOG_TRN^L(+CGk9|cgSzKCu{;5norv%i>WuUU zbD}D%c$SG8Bs(0b;1I50ZE(IVj!$cVSy~*k&5#W(Bw(*TaEoTZSYC)E%|8qg$LCmc z*7i8Y@&`WNOpG1$zZ?34lc4N^1=OUt{bpc64F zqjBb7T=z9+Dmt8A`Ca2L;jEG2f;U%3o08{A8F8t0t>(tGhq2%@y{-iL~n# zF&jhWP4umn?5Y`*>bh0(l5CS&XQ$X{?9+5^=Wj9lBDUkMZKimZC90-PAF^pr23<8R zxThY7<`)^qx%V#lo7#5Nt!#<&Hg)ng^r)@me?yK-;I~gIwti z6W?iCQ$ZyKT!8m^5pBjrECo9az&{PN57?NtJ^b;o1n4C7CYm-eYS%Z3f!ecwv&b)r z!Q08^f1B%>xt7k2pL)&*#;#EFk6X1*8} z@i4B^w<&BTq2Qif5lcR_&Jt%uiT&QLEBe}R@8B8y6jHCe9LKlEzRD>+?_4SQQsKV% z7`vvzzP!qwZ4MJhS^7FcIkD@ii)twbSZeolBM}KGr3p+oL$i#hC%o<3btU^-*a%oG zRyWOYFyY*@xXx6Z*ZM9|oXT&%{ud3dMyk>jC zJ@$UiTGHUA70_FRw2aq$k-UDpMbBh)q86u>ys1$Min>~V-FD&y=^eLpcYq)@GudG5K zgtXt{{dDBw!T~yvP4~lRK;8RIFs%=XOEpd3D5Wna@>>ak+|Csp_|GBgF)MK zJr>Am!N6@;@w}k@EEn@E@@Z1QM8w;O%^$m!r(fYuwYz9QUfltM;{?;c0K#uo_o)2Z zfP)1VibE0z7qp>qUUk>C-_WQvrbQf`X2F?El20hkOady9_VxZL_tS70e^3jHM%poJ^;os{C|}gV%*2gvB5&G zWn!asAc)VoP677HJGNjWg$vbl=@mG+unCn$c48 zrGSWRH8E#YVih)Z6>G$TC@niU9gw=wDpis30J=EMAKTYBr9v_xm-Qmr9QPBV8hKJU zC^m>u{DY+q@3nZfT{N5{qHjv`%4(Y|nX&s^QO2dmStgYR!SM8@goaXmJT@jrdUI>P zj>Mfrjw(J=V}X<(5SWVvXV9F2vxBZKCIKv4!xx6_J?am?@4=fgIO+@LI&s`xyz_>f zJ)Wa41IO~^*Ld1ufNFB726TRZKb7eU!E~Tb#?E(M$v`9?%qdZbtD)?N@mqyRX>oskDa9(XwWo>}pz3s6L{2 z<=Emwe5|eP;6=~O@hfla=f#lESXWAyhT|H8Ym_HjpmJP!&Snj1ffy=<>ue;fu?yQR z*`0`e!xPVGx?rDp2~w)29ZY5l8@J`JJS zY@wr+{@{I%fZ0$ygmx>nco9Fa$$DT8GK57EY;BEsUWGoadXv4w8Il?8>WZ5<4~99(j@<6Kxr7u2pz zjLx|!mT9q?nNm-$6=Qdwmvi!J38&aqeo($Bg=@KJ46L;=bGB! zdgYqt;|-khO!Hh**6N=O6#8?1G{`9n9W^M=JHWNEmzuC^9M~YZ5Nylxs{wTQS}-{u zpI;tS4}0SXsyYxcwFK<&oSmvZWc(N9rwj>Nfxx7Ro!xWNnPAGTVAh=fgY^`b-{}}# zwC=d5+IR#%L}KtF*E;VFTx*w}URc09y;)5;c<_2*25#ECDVzf6G%YoLnXi0xTKAU1l2-TtKB(RmGb6|coRI1MDwOsrJxv$0w zZ%{-~e<=1u&R}b24>$p}<2e3fH9hKwn<*Hz&7MnB=M1Ni&bUq5{YEs4xFTmUI}~ux zksI^1An4cZ#7@tic97jNcw2DJE{b`RHVjbGpM7FT*NAPZlg+nmvI}A(vgy<+%#rh* z3lW(&KS{2PWCoDR*}R>Dy3q>UfN?$bc zprc>)Dw@d0l<6j8^v|@C=gA%VaHn{ge>b5t-$H4?R2FdAKWWPIefJyGr5a9Go#^qF zcnzv>At#!+`gm(}SmhXy93tJKHG6Q5F5w$%m(k;I{w07#s&F4+a~jlIUcf_BZ2V{u zZcfa;E2qdBIg1_)WZQ#k#1ZF9TbnX|j%Z8)B9YhX*aLKLr*%`M?G zYKCnYW+JAE|mP^H1~f2Y5-7!-{x!gT5Gf2RX{*{ z@jT2_s3+wz4gNK$SdyO&`A1Dh%?2Qx5~BI#)V#3fQ?qtbkIl|tUjZU6P-sIn>W;26 zkla(q->9c(cVmoG2ACH2ldZ%N;2nfDm&6rm92fKh$?L33r&L@TSDt+s0e{1)BPiJ? zIG*J+O@$DR^eBVh5!Kt9vn$c%H6f7S!^>%&jKmX8I%v{NRg>fRWm>zC&1-g!yW4aZ zv2&I!3zJJLK?zBb;`sAk-;-9ffR+{489e!nVfha+qEJZzmU}YAR%lwQon~F-Wc@}y2|Yg)^$gEz=PTP z_KtM2;GZR^_wD;M-u19UnSjoWJZp|rURIyPJ`IxzQGPV?`2&}1@EzN zg^eZk)-@Tlb(^D>&K*cQ*Hc0lpiQO9u1ZKN@)(ZG>@!xZ%)TSM|HgYx!!C)myv`_OH9K>e z!%l7E-;s=tcH9KOAg3STi2~K|B|R4GF`^a;X@oC-$t9%XLf#~@KSkdCk&*LhLDyaOTob(7NIr_M(LnS> zDbPTQPZQGl7T?jSYTKvqjfW7+1F|Ia$AV9Mjmm6Eh48Qy7t)7WEOA1CNUa8D6i&-< zpq7XzAN<22-p?hYyezoJk4~2GnAJ8bhs&u;PI2`V$)Xb-ZGNTNih^4V~; zXc3?GHmMdJ(m4Cv+91H@HL4Bk;2J@!k?Y6JZu^X;SpW81`U ziJ@bJa%{3#?8e|IyFmtepG{Ks>9U48#1SNG2;0ToT$upTkFXns9xl%h_p5{JfmH~n zwuKz)sC_M5^dr%&$fqO_(~fRJn)Agiqw6DF%I@3Ulrt@lsCK}oG}zW?zf2K-SwbV zzgv3ny3b~{dkYkgmYm#;!O%xy_AlnEPSBvW|du@KT?UJ=|3&I}Zy+sptYuE<>qwwgRaXDPQT2mWBC=bNOMI;q!*4p5i+r`87 zf!Ib!^6s{X$k>?$1KV$vVkigLDL_I3)B;LI0)+S*@(?P(8H9gm-m|X(>rR|rAbVyunVyGcz%(rbX#}im zd-LU=-(#yf<8x1<7Y@3~c*4au;ShM76a&w`hf2eO@e`iEB5C`pw zvQw;um!qO=lN{2ic%g+zNb7vcY*xpxk}eu#F@eK6>|Z$;u__i^;7QrjrX|0pA!o}e9+;82X;zC}S9j{|%op0w|A{13_3X_}A?s!&O4ykAhIp{)M?*v6Re%Y?-1n~dN zPG`j`6*Q?7nS*Q(@@HVsM=>@$!MFcTC=!e^86WY@t@aVGh&P;0lHulKy^OuZ7Ap`c zW1ndi&A5pvb|exz4V`j(4&1y}lZM!8F%?Eaggjal^Jvc^ygR(JaEsU;kh9kHT@+!R zGEUuD8oOGiso5W&eTs67)`+!+DNoCD@|JCCZ;qWjz4lfU8YNfpm43S;Xg74*(_{#Q z`fF+1Mcr~9dF^^5p!o^-mM#Ke@bswQoAK>jO)k?D`hID4R9K%B6<=TRz%_Ef% z4f)yfVk=%qEtZkcT4??u{N+`fd@zx3;temey*>hcN~8jE^=8@@tI@CLJiDNol_)@H zWn&l0@Nnpad|hQ8uhx88HoLO?v`H)~BHH6>-=U{O7VqQs+a$N>Ru zF<9)g4xg0{umQo!k{0qDJ3UC)(L_2zYCGc=XdkvCTq!&36=p+8ej5o06B_61S=LHq zw_$gq-QJ*rGeJXB?2k=!dlR`6uHAdAHta8=4tN4Bk|9L)c?T_>FPCD)(}RJI_B||P zE8K2e9$Xkw))B0>U%T4K_jzA8Wq{N=Wd9*A>LdHD56UNtzmnie)hDsoY(3lBR>2dw zHDiz1Y5OW9EFaqqxX#%>2C~R+TBlS37R2vOO=1d!L8M3=4CMxcupmByApQ#gQqBn|; z&i*D_{50JoC|atZYn!mRDSS0rrhJy`DePX^owxOQ!pYx3m-8X`rE4oZOLXs8F)%VY zxW`)zw9Z{FbPKi?)#>i=1y6UvoYpqVGSi8ou-ddaOF zHa3MN{l+o~|7fZ@jJb|*N1Oh1-S_`2HqxNcHn+@bBS#3G3OkVvPSmiNB&r4p+ku;&Q0}@CubR@~5Tj33u zI1*cbjNFfAZ{OOW&wd;8YHlNQlGB@bbb+d%Sn4i@P?)OyMc$_5?f!OrSA>~fY84`W?LYPJ6@ z?Skq`>m?qJ+MpYPYjt9acxD*T5M0F?)afB8%OGQv&0dFTF&(D8G??uz1xr!@knaTT^jY!xL?l*MCfUS+>vxWSHNs*-gG+MeTw@S) z&}I#ala=ez04`^G#S)qYk5*~2gQwMDKJ>MuJ29EwDV$b-dyKt4+|<8u8^!jyoNZuq zC8BndIAJc>AN07TvAk7PkIp9Yyr2ohE4s6CPE=LddIY1sXE^FoC(3!qsfq1ll;RjeG^*kPsf?b3c* z;m%%{=h>gM?s*bpO%DuXmy*{B=9e@|R9m@YM|V;xRue_V%2_GYn}TY38)xATH2hRv z{v!K5mYI^MphZQZU;_0PN=U!h1DS58DeU{`*A`e^&T<5aXA;*4lVb5#9^L*;yQtQR zi>yeyS>%rXuIY-bpy-{Qm&0jHgr{0cd7rFe+#4_cn3NATg#!*tY}pWj>1LM@wn?`% zXTfIM94K;%g}QTITJv|22M#p2rX`*rW(%Ec7K!KX-jeH32vlvY+-FfW!Qr)loh9;G zV1_dVw-Wq5x$#>m8?_}{`8f#Zn|v7UR0Aj@i)=C;Q%S>1 z6LON*YIn7@k|=QNh-dP2N%AG%AZ0xsJ9$@8kmZSTTD@}VQ42#HZ5|=J&#DLeLOZ&e zE!#*YXZc5E7@zjyfwJVUcIx23Qf17QLqz5|AS~R`gFY*f?fpXHsep;+0Pr}#Svbc_ z`&vH@15<%*Ea&%G5#K*W2-VjvNmUgl2U^_Zz(iorJUa)E#rOsoOA51&l zRDJ#)OY3ygM(jMIRVBwtX!TrL^Mha5w7?eNCAPzg8h|f_(iA^ziY-g1hPxyd%Iu70?1U}mkB}#>Kr9Cm z;&>au;jKt5;dd_U2yF0H-c~t)AV>!lY%vO^br2Cj6zSib?+pMc4R3!UAz( z8VR`AI~@F2evit*J#tswQORxL$JpP+c73Ov490RoBOJz{tZ;OZ(OwjWh{D1;cVdzP+! zmRX2vpE-Lsg~^m_rQcYVA%vW1PDf$KXi((@En&p4mt^=IQ>h{|y7_(nJ;1_#CSO0% zzbODup6Eo|s3X9mPm=FCskM`Y!&MV5N48iEHS&79AY?c8iv1M)DnfwoffOg_hHWnv z`nc<;*zdl~1SON0r=>5#0^3oAXC2sT<$Dhm*h1&}l@290k$~r44n9J0z;!=U*~M|h zhEE*8i%p;d;*VBY)PX@OFvbK)RZsYtScgv+QJq7@jwN7wq(hHw%kj7u^VsJACdl3e zNN?)o&jAs>LL=CGQTgb@f`oHkjfEAtAP5Rl-{`kfTptDW!yUejy+{l|t06i(J4>b_ z_O(`x*^Pq{nVOSidUDnkMlu@+Pf&=g4&uq5%Gn3GwPCv8p0-RRLB3a@$JI$s8cK}o zX~QUsP@w1RC4{pHB59K5=XVKl&Dw@sHudH#&eqqF+ZM@sN(HL3=n5Nk7MxL))>GV^ z;jJ8;CGm*yx~@h7Pt&Xg^VTJk+z4-b!)kaD|B~Gj*Gf!YcM5bjrIMgk4m+GBJ-kei zi%UaRrBv%@IfPgX?f6X0?WGn_wVEu}x-i$ed&puKNN!_52tvciSRzSJNtczA%dDfI zfKnA2bsFg!OYr%jD7AxN7~Wi2;#wbpRLSOEe#g5w&(^hcUTK`Zyp{F1FE~^Av*bV4+*#ETc29mp#I;<}11EK8YMZK+=5J>j>L3X4cV1V+`Cg&!feOs~Sqk!FkusY?j zsy@lvggjVpJAZ7kIbN&b&qMwAEGY{9GTu3eR(l*xNSi4yY71F$#C6ZjZMNTu`}+(} zkSvf}uX@2T=;eeL**WWd=S8fd1&7EeH96r*d92DdoT%$27;h(cw+THw6|*$hA>f1e zbyFGw@KB=VRtt2niKNOwVTXp4{a#ZV30zv)*6S#DhFmN>M$o~R)Z5q6oz4!VM4wnz zTX8sAAZ{IfiUaO{7ZBsPQ_No*tQ9MU3)K2@{Q4>M6IK&I0S>7Slnj5iB@au6LOq#M zF?de^eY&fVJo9Bp$x+A5xPXD zPCrj5N=uE>;T)EIE$_Ty*e2n12kf1!(9d(P6RGZ|NbrBVvuRZ=zDDM9{3?4c7t$)p zZyiY5*w>fHFgC!C(Zd>u>J;w+ACRV^sT=ttqUmXSdw}Z#WH|qWiW9LuV$B1KKhEP! z2oo7$t%lKM@N#?-^^QmF zw3-j+bdW;_MOpGWIj~r{zbk#$MGYh=lxz-PYQLhiPJlQIX>7p2vU{vHW2I?(Gi8B6 z${#aTCHirUH&G7hHI-|S*jiW@7D)84H*eFKc7WJoc+rR~t;3=8!}M0@WZKB(kTFr7 z_Cs9JyhIdSSt4&W%gP2J0$||k?PpngBZ}W~YnX5gZ!^%K;{Ci3f$lX0y5I;YI*~Bf z5A-C;X$-TwT^cj*IKtd#uqZnMeaRt`BZbd5b;)O|k%>SDo5vz1_|VVSAH$CUo=+QN zOHr3}*3vVSQjzAl^R*AyH~r|TdYN7s!Zx0^l?CxIH-4E-d?u@ffn4t^%+I;~4a$L! z&jBaf;S|P(Lq= zerliE-0lH^D5rT8{n2v;;`wX)JYJV2f0{LQ%)C&|W*PxmOMbds@VE9>m{Co;cOVc$A65 zUb}q7$UM_)_VxAluk);_IgB5iMx2M0*pBc)!=K%)&5Q%QyvuVK^r=>j-O;0h?cm05 zO4wuj8k|&-J5Zqe0JTs?Z7ROGgjdM~eM~?00;gib42L6hr(U4$70|+T4caHI)NjTT z{2^C{(G&y-Y+>?&HI=?z+P_Hien9?~v!A<}u-9pEP`d%fUG}^@kZ!a`YSTP+Nsz7R zf3}zFfw@3xu?6p{ICC}iKC7EbYOPE|g4 zLEvxN6{jK}X!8yWCV5HR%I@jbK!L9KT3Ni!o&tF`sg-G}#DOEZS{0ezcG9)C?e$>D z{+zSD_oGdxQ?SZ7{zMJk%HLGp265|;ICIqr;>mGjydEU{1Zn(nXp=zpxzeTx3*dr* zzU6N;`JS?iet4dpBZLhNOj%(83kJ}nOx7wpDJxhp_g!wj+Hp+*LF;A$`&BNbT7pbU z8^}xEaNVWnN;CqBH9Tx(&L-xRiqu(uXUfr;zw%m5)677PN%17hRF|1PI@?ncl!xBT z%|7iEaQ>*6N+=_%(q!@xG)I_mUN;wj1bT{aL0?n^o>v=-Rkx1Rh! z17L+idxVz?WTe&jhod+H^3e^SMUiZG^lR6%dH!pS+!aUI=GQ)28ztZbU#Otpk&d zpwNQ|+I<^@9f&eI^J!6@Y7PIthE_T^g}Cqqyx-VQpX(wUe|ZjvQt!w2l=iRMfi|F zoKLRQU?NKtvH+|Xy5(CQ?n4xpSz{u_A0UW39T!d*f1f$iV0gSEV&$iG`L>#%0~ zfs0v}*z(J9Z10gp3rgf{=pZ%tN5NMG)sdD-c}Tf(Thx?%f|bp)sR5hoGb~gbS}=(?2uvZZRhR@Y zQqR{*!JiA%D8@qcZ_+;G*V>}ou-jP_qW=| zSxmVk{2Mgt2Wa9PTZ}Eq9shjP(S!y=3H%JP&;ts3vd^O-q)TC$buYJE&6AT!rs!iTg6&JH^QY%5&FaJg<4*)y-luVqU!Dkp z^fypnTjC9ioG$@Q%3;yJMSaS7jD_NXCT3k<+}lYX;>l3C>z5x2kWsKt5R0oOnUKLj z2az=$zB2+^+Z8gFz}~HT*%)W^M*_mDyFO znXeTw--CCF2DDW06s7P%Jiz_hM3IPjxfZ*EcvkU3IE!}jAHFI@{NGLj@R>ZIbP!8g z$V|YyF^Q|TVdsmFZU1I9E|r^V!y0lW6gX5}RY*dw;)q>fk1p7~sdVdH@%^8j%>zC+ z+9AhODZ41RP{Jes6&IyOs^UT@&k@SK9SS0nYLsCtB1KoQYGAc=Nw6DADX1I+*_8Qu zd+y#yhOu5v0T}$igIb}F3AcxoZN1CuzX|vmXyAjLPSjx(%eJ5vY zLjKjg;ZcXZ(~8>SR-TtQEIpG3c1z^#uy`%Nbq;72cl~aw1?5D(NtimDZbFtyEFzyh ztT`L|#s_)D>x)SgW?1of=F`a# zN7j;PG>x2L*J1XBpq*CoDw*z{TYQ%|+qhsi4IkBTH)BMF9-xqPa)^}Hg(QC8Ow8kl zyqdDZa#ZL1t0^P@TrF)W=WiKq;3))FBKnncJLJzhX{xPdm&|Es*0GoePT4b$LRW3_ zGWP3ZT%txmCNz#74Z2ld&A9?{GhkgZ{LDcN#O?F_h00;yUWjX8V&ioPzrrvTPgRRv zmDrjbRCB4FnMJVGc2CC2(-boje0`%`wJ(`!;5DkZc7`;#s>kcCoxas^fZyOJRQTwp z8XUljl(z>H>2Q=lanDF5^(J3%X;NJS=t0f`=hZ9u0D?Q<`(t}=IBE}47efg^HuuHi za<-t}>wG-YL>uN|<7q2XJQ}o($mbR^y~7=rbM}Dy@YnjAe*c5JK4s&u9L#|z#5$I1 z9rEYMaCwod5Q=60i#$fBgZ-bMjT5BO;6e^xQZ?KG15iQ`Er&HC76$m9uw3eQlJwM0 z#SGkOqqIl}5DPu&Jl+Jkj5<=wYrIZlx)-1r?(f!igR#kh+fKkF9tHA4$56^ddo^ua z7O?V6w;d$bc%HB0P%CviSho`mwS)CRM;h zY4f&T|5uPjSCp?n_uFZa>7czA_{nT;S<#c`X|(t6(S9vFP;>eNQ z@q#aHBl+3B|Ew8_5;=A#sWd4FAF6FNt+9GU`VnS*BKO;Q)7~wkHUt%f8AeWR>HQnC zXRR6;=Um)u_0FXZflVN$RgIV<{1F!BFYKyO!@CbP?N~#AW`h4sb&Wm^5IAl0;7k>M z0~fSg^RSH>9%_jctK6myU>gDA^(@+vfq!WqmZ#BQr8G#fnxcNzXzmXYrUD>9Iu#AO zxCAZBCpUMuhZtUb-HlsKvXc7e{Qz~gj#%{zw6hn^_srtIlw1F9oJzI*8>$qk&X%)+ zag#pfVx+7N~*5_ z2sU7Te}(O(B32WreB;GCiEuZqVPqMho-Ltj$F>mS*&YH)SP7l)IYfBM=<1|@Y4X2T zLu+B2IL@sBT^!A_NJ43!d@E)Lk%a0X4NHRkZJNz0YzbC|W%0bN&RL8OA3o$$Qa}w) zJb)D2$?oA#?Y&NTp#Ru1bPRl$wceoDgj5f6YSWuQIaHNFlX}6M0890a26S-V9aVDp8VocYki%zI74`grSM-11feZ9v@z2X zYy_VdQV#}Mo(%joaISwx0xCK z;>!iNgVNqJ+ESDfzbv1QOfbKrk%_uv#Hmgf*g+GD`!^5uuJTl-RlQ)+(@CK-~+Asx6L#!j`lKeu6Cl+@^SK&ywL#R8+Q=_L8k% z+ve5Sy?=@QX9z>x<`%Y`;fZFI)zMq4In=|uDFKV^I$I@DxHYh^jNZpvJ_@O15lZk$ zn?{xnpU`M`_P42DA=9NkkKjgd)~GY*CQZQ3PLpJg1@)CiS`|^@9wK&Vk9|d5X)qN~ z544$)us$xIvz)VGIGix=IYxC_YYfKrV?Pt+ZsIaSNTQ~*E4MyTEgp~CuW-k z6KyXKtVa7s$8u)=~a9oSWik3?% z;T&bFdhJqj0q$cCf;nE)6+~ko;s)oQ8>v}6xseYp)+E|^p7{V~_U?D`fZUo(zaSDJ z^V=Y93u3v8_XOnqmyL;_Er&`ZclSdbJ3rh`n$5^Ls}*uKRb5oqyGiO{;UOXd)56U> zC4Z5&hk3!UH$M9*i0JVYX!;NwivZDGfB@uC8}r->Xo!l{B!>Z-b$Dg+$;iA8C+l4< zn)v#RVv->oi(k#S6(#{ZBX8>;IIibcw z5Y95^eK{-d7GLCnB}i%Y=y}XlYN4X;wby3U5ddjLnVh96KSkVe*t~J-*>DUhiW{0CU7eU$FscJAszB_`%n*x!M6V2rL|@~>TFdfV zH7Nf*L<^qwhGr)0snreea%`~JUhP0MQ*ACnIVWQ`_44+^R@#jbe9Q}*H9ZHIqHmmt zv<#vx79VL|p%TIA5Wc=$nMMiHs{%ou@ll@Y#}N=^CwZGO1t3-Iq>n$e2dTUee86ou zKL3~oyPOrraL6G(znN@;_L)aIdYmzxj3T*9w6!X9u61I$(u%Zi>quAY)K-F-xj4LF z)|1NB+Q?3b_F4<*S+PcEN;8KbaWdB6)}X3#R5FH@=M&fQjH~R_-DVH^0Xx6ssLdP^M5bcZm9&R^kGu<5*?HVjiwO5RV>h z2UBmt3+tBZN24e)h-4oz(z7ovUy020H9G>eHqrx_i(5mt16d3yremPy0tGqHq5}#9Q zhYgb|!W!7r0omB1UxsY!0F}S6h*4HTM%7O`g}fGJ+5v0eZen?zWN6c8Wwf|tNMwX( z^j0(Z_$?3|XHcj^@WCV3LPK#luX>5DZGYdqF2EQvAiG|2%R5^2vW$v#*%VDZhcYhk zp|_4_EXGrqaJZKVhiZH2JQS7*hr4>&Z?xAwE2o4h51?YeL$Z64dOGz9@BQd0a;u^J z>?$s;I?g$ySeC^aj>^$a4NvP`@hO>aYpKsUTwTG3(C|}pxj&?CpL4VoM6Iv$u+W=) zkQ>6!^A+SL-z;T&G=MlhumS1XZG?E9Xa5+Fj~leN(_thq zwy`B^clP(OoUiC9Oa5@4*mOTNGj|b+9RF39f^^vKZehtz*AIj_Y<$L6Rw%ePBeR<; z?5ii{8rd;?%zsDrkX_dg7IgmT)R=V=)SG;9Dv-+Orzog{a+VMpgFE{~gMoHjWS_<( zgxsdSqWthyX8G1c9XCjt7Mus01@8nST#Z90$#-GHXpvT}{iesuC*YJ=3KF!pSPG(g z){jWjVx$vOS^OxpRb@AP_$G2c4C-tP@Y$$Fbe{K*&;$_QEB z8mH+^T-(AGH{rLJAaE$6j|fX!*-LK&#LvYeLV9MOr;4aO>ZIVA6<3}#{?B>y7O024P$V$@mu>hcJ z?Yd#$(FE}CX^GfbCuqxzP9hYc4HKnSeZ3%oPzDHqcj}l=!lX?sem3(r@yFDnkX3O) zleZWe_-GQ|HP{-l`5pFjzYSVZ52kiROYKNjf!Tb*!@Vb^4Xx#|o+TXocV5xM6HHQG z(TZay45tYD|H%Ww$Xpg%)DDZ;)#*0g0S%hZy9V=%gM0+mRswA_$a0a8(GH9oZ^Ip= zNO9?Bf?tA7b%#>7dV}gkG>^`PzC5Tfr%u(2bYK!tAgrSC5#9V~n?}_p?^YNHM*nY% zAl0nlCkJn|3$zKcc;i{Ck>tntZTMsv;aD81R{)JFUB4-9Uk<2oM|JaeVSPU7MHI=L zU8)+zeK_e9l(K5YehgURg_rU{C^sp?x-@T>k%4Z7d0^Z@>6LF^p^wCBU!m{ocoV*k zP+B_!F4adSL8XrX$kZTxNvrU>pO)9<7kAhJi7bzMEGC=aU9H1n1komJ!Mc7Fvo5!| z%Kh>zN-@=HLL?bE9_;WTYr#etpNQ<4Oi&!Nu`L%1aTk_zH~-|r>yxy|2h}&wqK8?Y zfqmM?tNt59FDALPpNdb{H2%{g1sa@-zqQF0i<-l=w1bkd8X9%p_tirX&q4){hY1<_dFHuiVx#g!HG~T{}awPJ%rFY&dZU&Sgj06kq>Wo=3Z%?Bt%m=LN~yl4uF0Et>+ zN`Pb3g!`;~%vFokScYy8^O$WNo8PnJ$@1+}pPQk7dD)?qS~qCOiiu!^`3{!PMq(E| z7wMJWo3qPF{C#jwIO4bIiQa2(aDdsh8r=bkj-br07ZhE-S#5(fUcnis`6cR@ddI%P zLtadYXQ>^hM35H>U(g(OG+l6Ycl9TId-5#I!N8*&C z=5GnfROeP(4W^n|?;DM6gZwr$&f9oUVa@Ap;VK?%Yzr@YyUho7JO0DlSo;sF%;7uV z?dJWuq!zIBpkAyyyC(dtcBDGpTuW`?$>D@<=hOepZ+TEXg%oNCXqRVuJ9xc{W_9E! zLH5pInu~b38geQD(=Vh7S4Jcn@n#k1KE{YwJcGfFHhk*yi){x*53t1ire<5i1;o=^dHJfLe$DI<8dm&+ z`0A1gxUV$9v{h>*Qs4jLLjjn1%7oXNzux{tlMZF8k*dgU9^Shqx;19oy|gVR?GQia zRvgfppx%}1T`}}@L7kUV248acVhb_g{>0K`#^8xGriZ=IlolgBp0qZ3g+AKo%eaLfa-AA0ly!$gy`L3|{*u`D6m;@EAYxun|6J zmTL>6+yZnWes8;NQ^H$&bk-;;p@AYJU*1F3bv7dq;|kgZ%1XJrKmT z>mGK0*UekH+xgK9=j2Dg&xBhtxB{+ucWT^Md44R*IfIC;4XfjjPk2lw6|ffy7PWwu ziYyU7RwyEqmo3W$U5zM34zG0PQM+Ahi_hhQ58l7U#h1hsL#@w1X1Za-YH##>Rtv16 zBR_zNtV>gq81uR0V;^3gLms~b)blsTS}I*w=X9yvSYZ=akxv)5;2CGRg-#(kPQ|`U zP!L|tu5L1NXHpg`3|>s;pVmZhG}shN=e6bF0F5D*NKz=_Br8UrPx65QGuu+Wc0Qo6 zb`PqkotU?|91_Pw1gp66zdhMYbjd=@b>^X$zSjHXFLeP88!uth1F11=+el+N9 z$lK2_t0#f+QptBg!*^YDkUXU8Se;n8bKsGz?NW8w$NGj5M5N}N9YApfM7XG#T||a2 z;XXro`{MegQ|;A1R(zG8Ip1pXefO)2XZ{%WANyDNe#WDhPd&GtDSuuSfGudT1Z&CJZ79l=i zN=})9V=H#KrY2G}^32KnGtKF?Tlx9;i#N%$!8QD>*E`9HN}18G$N)l*(R_P`yERrC=wsoH(j$H(fD(?*-%8%6`GdvCv* zn$-iEu*|Avb-mcZ-=f>Nk4)<$ibrIq1I70N9bWYd8D^9e_`>_(oV>~|6Oc~csD`inR{ z5A53^8b)qmmh<8LdQD%~k^YtKz%EWE(6LFV&ISUB+{fj6WHM4P|wgHzA!WreC8u)M(OLm!^S)b1_hj!>yU=`n4TL!Fr}vc_cJtUY&gdGc$jd zzb@%pz28E#PKV{fcFKDDu?lcd6qSU*CFseyIANkr4|+aREY3gB8V$9Tccxu?@>}kR zY(#jD0(%OR)6&Jdp`hR#$zD*@>Aw)FTE2ebOMnHdbRhNEE`gYy0!2~hK%I{-;f!%7 z#vR1;kC)6&&e@Kzd{RX_C5dUC4ApHD*94%l)Zf)n^#SGrAvL7+Efyf0tINFwgvo6P(UBYPYSn71)3=No_Xu42M z1+@!uQeQ{QX0;%cTkJDHt00 zp_}scZ9w}IYynw96RLF*s#VAmtT-&)8p#u!Zk^r6|8)zx!NS!*tU;8k1DTEgziddG ztbCzt6>l=wf(1hHISaI+-IxagqUHB4jLy-@|Nk~ehA=z9xA<91gae)0wAsqm@fs?8 zG`nMco-TD#UMeSO1nEChW*b)Fp4AE&7U;PUhY&-6uK`Bi{RJWM>a_Y~ zi)uc|N;e1D?Yc)bFvbI7ywGJiJa@g03Al8MncF|OsJ7fiwPD(u*SRv71_M4OsBtp~ zNtW3wVO=LUij4`a^dljubk6>iMp7aYZpGtFYve)i%!%$0F?J3;E-5Te`IPX0HPw(D z)6tM-uRwZ$LMcha2Y9P<(bu>dB^>RHxMRL3Fge!x@L5(e~75Nw5xDp=kX7qogYOsn(S_qzp4Qxv&096 zro_JMr4vutKSyLWS=9<5=%bKTmgt|gWf?2a*pi*P4^N#;bKOhf7TWta({IIVq8pqR zjpLA)R+%qowMsT+ShZ-OlMvQmKa4`5;|I-t-@bsK;LUbwuDjdr3549VTY*7DR&#h^ zd~GnjC(LL8wznEdP3Eh+bk6DB5I;S#4a3d{8$t;nK+C@T+$~=&g>^=qn$d*?8h^&@ zcv4q`cLirn;`G`#{OGFcsYxNGf8c99V!mfLMM5w8JhPB}dPEuA#7ZK*Lfca^0-Acj z1Q9p$1}36j!T3Ne$_opxfj3uqw^Le?{+L0lM0HNKKqGdyzA%1s85Z`7pk0--XH=~? zzNe zX=FXenpJl7NeCl^*S>Yw$pYR)m1Ue6aYwSK(K_m@iV!e@IG?^wO^eo3L6tq#Qko#P z)!Egk$`t!EzujU-d1t@f?Fk-n@y@}NEh70$u-zqN$Mkh*vBU>4Yay=@Vl75EMH>kq zV{~|ech;u9J9G%Sm)pldoN{Sc-YCxL#kBni%B>=e5BU#x^%J`x2XO}#g){FLP2tQ+ z0qvkBJey`qba~N5QIy3F&3Ck;H)HuB;y|3f%&P4VpuZXRGls&q(Jt%3Y`Z`cWVW>2 z%4z$?!3n`t68bY%>n-f=K|0_8J6;|~wf9mNzd-dP zcbXT7V=2ceup5C4e(bGRM(MknYp;v<}1;_i%qwwgZzH@Q_An9Rt_P3@aM6l zF(heM;>-^9cAqY)Z4GQ{aHDK-84~Lwa5)v6yY-IesULm}T{5JXL_+R;*A*!cI`ZPL zS|9P2v!VkP>38$Cp* z#=!B}r(4;HDv-`;woNYida1Dfo>%Lr?;GWBDB1Z*>WKZfgY7+gN-LAEu+{wu&zzpY z(zb}@^6n}Z@ zuwURkQ7i@D2r{1=e8%-2gaLw`J4V{(99)j0&)(4SBuqiFDjMqZvao;{bs(X?PMs{3 zcExHd$}d3%Ui5wO$jNVqG3r)ua@GA*C_cGrP)=)(vslm+N=dN~9>R zXIVndc}a{GARLg}iBv+vvsRZANxlr433w(}nXrnmTkmrW82T1|(-C~Z4b)4Md}Gj7 zOm_LJ8m3UEc37wnTZ49c4j}4O=>z&N!g1G9=MB~_1D=SP(Ik72576k%UIbRhqjqYp ze-HkrFoppjM5lI~^@dwull<;-+QFeW8WDqQ0s4ADwZ>WtEYNLGOm`yo$X5C-AlT@ZTnqJz zIGoMhcUVahffQ%LAwJ=rrMOXLRQX}Mt*M{hC9b<>>ha4(!7zFKS?JkzApZaCwMj2w z7II8?xHkF7zU*Qt;8Ao)ge4I$XZ`wR-y`9nNhU|`^Z&7R=7CYx*ZQByI@w?nmP`O) z5>Nwf10qfUalkF&(jYDY6(>|nz}5!bf=eCHUV~aYU|RvT9nfCmQjJS%wAN0r)@WNB zwbo#lI|*H)wi;S($Bpy*Jl}T$-rw!NtxVqcyk~jNbGB&M3-xh)Hd_=&d^TJNP$eRF=bvAR%GJQ|t<@p2T-go&gEcVrOd7>soS6WR>4K1dZTw zuRvTEq*T~*5(yy-#rc4p&AvnjqFH=dM*v_^oKM+zDd@0pXXoAs*$3rd?;ajyRV%_b z^=52sn^rBKOGTrpmp?nQ;_ehOiV#0?UdE;!k?BJ?H}a#gP+UbnOl>o1j_x-!VQ2U* zIi@3JXW!Qx7Ok=W;4e&ZBe?S1`SRQ>06biZL4Sr?eF*f&R#+H;XkFU}SlE>$TJz9i z7_T@Mrfw*aBaGs*Vs0Tt1%CPqxtjb1eM$OK`sm5U!kP!bY5B@+PR=kHH5I2qd%&5f zj!RP~idf|09cf04%3NAriR5)hnl_dfd7MK%+9NN!Wq<;s&$*+e%DQA@C-DT|9kz=j zao+Mg(TTauP%$#DdtnF9QM1^i5IwN$mgX;ejfqE*UZK?!)R@?tE$3HqXNNp99BX&ogH<;d(^W%I`)qjO-@)*v&T7^omQz8Ysd20(_*RomW<1fQ~g zk3H(vd1G#KFjL``W8{>IGj_`04$b6RZKQP;rI-RGs;80M_YF5~vx*JGrv6aQGd=C4 z_BJN6wn>CPcxd4m+id(dWwxKLAUzTt#PdYP@ixC zFXsV+uj4<)YSwgEVGqS<&?<@<fW+mg>d5VPO2P8+Rcu1%Gk>gA z=%uuD@l0j*coYAQ8C033rclZAQT0&+|{>0xmC=2Z~-AqYLaf<@67qzV}%wjAUGx? z2rU$h(qd+(-l9TCn7GVLnV0r8l znH;1MASur16OxWU;gmiTec03F8fNBea~lD3Ap%2cM`KUt@)PXUM%P4zjKY*Fw<6pB zRtxM{`%@aCXZ+UIOdBfr6U~4-k?}RpLHS_>#|p5#~?w)dlUN+ucun|}))Jmwey z2eUK_74-bP!&!`=%AZAVv#(cTA}{M>j==MI(m8izF+i(1(%VlaO>dCD%&*Ca_MS9d zJESJCxmrc(6P59*C>>V5`#+c|DTm;~*%S(MDQ_IOpyk3Vc;uHgusE8nsHzCCTzH}i z0$An$zal8CY5=(|)qpwu(k%Raf%+Cf(&L)>6BW6A0y`^ti(>1Dar7Oyb-v_7umO=$ zO7nG3_VHvNvv$KG8Jh@D*bLN5G)YFKH6&41ui^272nb?Knv(5p@qM=Hg=|ffV(|rP zTyzT)?FP@21#aoDC#`cOfm|4z4o0Q3$q~0|VyNaD@I=qFgCaG>p^=5$j;&R;+HaTS z*`qTE2czw@99S3v^S!j^#f^4lu1Cl1`?LIvqyA&WzKnBG?JjLOI41mohZ@~Rg~ZWE zytjAB43AGAM<*Zr>xe)o^8(2ugsF|Bxs|-o`8;NAri)zeOuFEHf-KUxPR>n8R){j_ z+*1N~(xEeN?*moO5jmUO51iZ)A@)Tv>3gZq@_2vJIs)I})z;x>JEI6ncJ72 zSPoh`P0bsBP>uH52}F>jYu>mZm-m;$+&~&t+081$*VvJ;MzeE6a&EfYlLxQHkhfem z@vl81{aB7D;DsKeU{u^@^{X+T7538zNlK8;rQ_%lqd#K@vba#P_(#ZA!WH>M!`_GK zL>skD_KbQwbp+M;qbQNMA_T2VJdOH)r`YIpJ%c@ocCWr@*`wucziuCq)12;_IXLiv zu>;F=dz1e*ocv!vX;n>h(E!)oD&EeJ(WUL>*T9#e({d20%dYX;;d#UfrUx$r|0qFm zII_}KZKailJ`O(TC7l@?+lgQ%dF`5EHFMAlP4ebl=JGTJ$uwx_X(c+)=F|Cw0G*|f zMyo=lp^`0>cvNtg4-Yi&}C= z8P26VIVB(3%85n&3rFbk=nc-NJfJ1qAHjHNY55nWGiAeYyGq_lkYW)UQ)=h+@{P+u z5MhUT4gu%l9iqYo&n4os2)NtpkFr9o?|Z(NR^EGjv1UyWmbZbl!QsvWpXN?? zcu@PWVLV!yEozQ;+C^aP@kr?L5Gb~}58L>coe;2C#+p^7UTA$-6zqt%A4-Gv)%|RD zZGauIKpH7$`g$vym{(v@6tagax5w8?G9Zu5h@*C4-3b%FCF(Z>*`vYFL!?^8+ zTt}FZ5{-s!Mn)xe*dTpKKXjvEPIn4O49o1|3`nwE#Sq;Xnv}wRM%i1!38P8-{+;V| zp(!X~{^)>}r5TQmrfqIm+3mampLp4)eah;NCgG;X-q%L(D{K~r@2(8xE_K(TWxu6+ zoWE6o1F<-5K@TTsHqkh0yGqb|ZIG3M?`Aj;)4ZCMYJBKaQ`k#M=o6W}-ZcdQDCKwV zx629f>l*pIC)4|YX9IKdErWY->n^x&ug~qRrL`v)+tH;ccSc>GNI45g*mOWlx)Jq$ znef4vDRH6wCu#=*9xnt@6RPee136FB$;IThVS?4OHcoJ8EB|B`e}6q4hJ3_pg}$}9 zel&wY4t-DHAC6L|0D7g<9jP8GPFTZ0$oVD3?5UpA`XIB5+U%gU_$C-h7!>;Lbzkva zA7yQ=wg}=7vB0nJXW!#b#+`qAbAQ?9%pkOi*7Y zM`JhHjeg#ZK+Xk*Fj0iZuj*==4v z=eW3NGK%%J!Ai9FK+NBS2b@SOu&wFt*+e7Ihezxv*{vFrgAG`RWkMc?o%cyLvU!{li6Ely2gh4*yuZuF?^u{#})tMkdUamG=CYC8l9Y`nL@ zV!}=f%_6=;0=Cv+>=JCPXy<^HcJD8bkb%gnGkD&_*Ds*qWe9c%R4N9E!VYU))(Qc;=jnqUKUA7LbfiMS#^0QC@8wCu@JzzL))~oC_f>qF@%6=82K@3(e)i|ts>o8{MnVbk&jPL@uafHiri$7 zcfm85f@%(s#*W4hm&ydc^f|IXW$begp+s;j@>qk1_@zOS@&eio;Z4y;`1xv0yDUid z#q8Rw{X1Jj&5zH09Ox+&Z3n%!wi+VD!zK43KsUD583Fs9)@T6pF zg7?qVjEm13aanr}a#HU4_iytKQ~8yzq9ot9k|ExF6`In|>-7vnpLZ(~?zN})+3CFe zD{?-~U;&+aNylaeEpI!&RBaO$e!FV_F&@6b;3VXF=ICkGHWb_vcOaE0N?2Q?u8{cMQ4gt(fgjey0 z^6kT3qQB$SeyHgUyoW4_c*rcp@pcjz$L9CY@;xXmP$K#uFyt}wf4h}b)~kci(C|{7 zX;)1TZ+@N?`H^SfAT^x+wYZUQ0 zWpEMb8!pRW;d?cb{oX|rNM+HCTNJ8h zG%nN6`lS8Xx!q-*W8w31Sw$g1>+O~h_ey59*w1}X$(;BUI#T(ASk&3dPdOH!(;K`n zg%QI!{E8Qzl31V)I+NsN9f%pH5xt8yz7ZMDw__k(L+FOPF+NBZ z4j6oJi{*Ju;ma9`SLm7|uBB#}f33=Mx*so53?wW761oNb%jIdmlP89~mM48Amxl9A zl!8~F_T*Wk_%q=F`viJSY52qLUUZw&keC}D48x7}guFFc>RXt}_dZf+CbiXFi#|Ny z5MZl2yuz_)61!rl=edS|oP_ltm~hJe(PwQn0B!Qj_w7Q?j&tRgY+|YXXo+?>Q_>TW z?HZ`2g?X=_b{22#kYK7m&N2*O<9c1Wg|Z=U?!2jm&JG4BQ}%>mcwTj7dBzA(du_v4 z0-g-p=xeEJ6cC%kNq-Wph+4#NXQ!;JWBDSQUuW2@)De`5wyQpWCjV@tKCcdj5|@nj zLCx_BV~})ZijkjIc4Yc&%Ypr>Hp+<#Si=mV25H0tKvBQiYX`exJyD7FWB`rN3rf}O zQBQZ<-x7$4)}A2b0AhN_xftl2*@`^hLr^=TIs)(%!v#TNC4etZE~>Iwu%2g|w7+bo z$`z72d?70IV-Vzpz1a2#F~05m%32Z^e1~+1sN?(9J!@?38GIwy(u06|F5jAA6%0Y$ zhO;gghx5ENXQ}h8=)?o8#Px*Ysm?H=RD0M;n5Qkv@XeZ1P{@^*O@N@PFzob5o!;SM z9<3T+T%R5wel!fQoy?|!i)Yz`K05(720fsG-TXFww8Bb;kq~v)Z_f&DCC_6ju~o;# z0mkh>Cxp~T2TXFj|y?*`H3VC7s9yP6NwKCt**iyH;CmrU@2HPA}T6N=NWC zM-0-cIM1bA+9^r|uCzsLfg-e}*|x+E(cCf)jzF=*#^xzeU?PR6qm3dgoj!_Mp(yc;+BCQJcS<>E4)T1(&kyo*#-9ln?+WAL6;PKW4*-TDN36KM>k%48iS`9wYo$hg2d)d{;pbD4xac1&85v}F83!3&+cC^}; zeaa*F*jH!xti|XVHwu>q?5OU3E9np}9!Ij+oMQ7YeQrYO&bVM4hzXemt@`I;?S|TVwxm)}5(;JQ#XwiwSVnB=f z7yxwb4z=t_6#vWu(wT26Iz1?zxk^ItV9S;0jNmVOd4yU@?19cangQrMmyGhUr!CmY z{~5{kMfdIr`QR=jkQsU{<6#wer6wV;n zny^J}e4Y=P^2kBG@!%b;PGFgIMkv$?ExHp2tR-^=^onRZ8<%#5xAeE!#5kOvyN5!~ zT^()=`r^ViybC4xp)T}j9eVWGOR1dCITky3l&3!>V?R?b*}14l4(2quqYOQQbP+0C zr}3`6_F%=p#R@yA&W~~o79C;rBSk%%Tc0rHoB`5&*M^`^R*1gsn4`voJ_VB z)SGc7<3JZ+%XcfIM%~@ze@R@cX2|Fq6(+;JGpFt`An7{BpK7hmq?8fPk z8n`yDRyV+@P!O#B-h+b!r7z%En)5do5g>onn?_&O)AGFHK&8qxt;*~e?oP|yPOzne zY|kWY*D0Ym#iiP$z|>*N_w4*s9Pt<)0!Ivd z=jc@Ccj9M#KN&oKKxwO zN&ca#u?LSs{3Q!Bir@we+?11dZD6gfR%=K;z-DSlH|q1$B{quR>D{EHdqb}^59vaK zWB-B}+IY23ooyRSZ0AZ0j^WAG(j_3|=}2sdVDA;K9;CP~Lv#6M7z}!Xv$T_FUf8jf z9Mj<(@Rht7Kqq%zykvENzg_0`YMm{lgOOgzb1)|HQ`vLauJU*W>Rvs}o$RBJ_I-QR zsnD10_2wWM4{jNf0i7$727Lt$8gDPaIw$26;w%#RBx{wTas+aZhLn*Gof1mZp$R7w zc&j5pos*-+IhL=LUz3RF;>b9V^O{qk^<7xmz7D^Ayt&mf>PbNRYeodLO9EQGlHf+) z{O>5fOF%i5YDJ^(l1fbgYpIGu^J)j#h?1^G@exSvKbHGQ%Sl8@Cc66NtI;j_>Yeqj zB^qa~f}b!B58O;jarst!D-Hm0Tun#xBMT77k%*;@BUS{ze<7;RG$;Rtymd2-L8?h4 zI$0@+ZdHA+6Wl{`*&Q)_-G@-gSl(y+(ffJZmRyx$z6*5$@^)!gOA>FzBsbl7G=a0T z>NLy_=yRS246jLnnO%L@>jT=Z3UN#bsGK^$^{sZ!TZ*lR5&Zq8EC2@JEt}eoM*c{r z)GO_g*Z{`==aBu337@2j#GyFv#M+ja9C_miLmhjhaLjjD&$F{Vi#@-8b-dGI3?^KOTgXhcM@^45{ZxIU`uC9+Cv@2plk!RzU~M$&qef3X}} z^cb-Bv-ZZqetSo$+0!IvsV2$G%gyL1*Sfp$!b)vP#F3zgkd+<0Z%exP-gCV5qDw1% zao1B$mfA`>Mq7F769F3T*HV;_d=H&$eL29yL>z<|@J7h{e%m-GgDV-N#pfN@XRqPR zGQdFrb(C--;!54Bxc{m+?u3FWUXksHYlWRZdy%3^9F4}4|i=^1v3j` zsso*-*g+k4XTOZNT%aJgr51lq>!{tFux-xOiI26GKNh#EW$8rygZaoVpQH(gYTb^E73QhC<19L=ui|Bk@zX`r z`T{m>*gf-gR1x9e;D}U~bI&{;8-K6MW@G@3xKn>`uA`*9rqMxr$n=1`ig33@!OTkTE=V(&nQR=b;>lij-~->#zF z%zMr(Mam*e4I@2h13dioN^chPoUKl@v|yir?%wEQa+*UXt_8cF;DqkQC0+ipNVk2q zOx!?|^sk*4Omx|Avx##TP7OWoQp*weI(FEv$|;`f?b1a2&&Xl??bJ|d60EM645(8cPdoDm@J;|H4sw+s8!x>qa!W}2HjWz(zfup_O`vv zYhQL{{!8JSgH|>Z78!D`BJD885edTQ&xqT(9uY_$KO#{yXi;@>9vt);IJy(m)&_ z@u;cQCfB#(0`nCqbe)9a8^Pks1dGpnlv7UzuSJmF`%ZeowRnbLwx{X92I^&CK9ba2 zBS`~;RgT#FeJ82UMJ;@;tJ~4~c{);#Pb|qrjjVm4#s0k!v<^|#M!YwT=`qo%)OzAsBV!(I3);f~iu0v}b`n;zKBrO__tLpE8J zw?5@OAY;_>XV&bqFHEzkR(@U<*G@K#-?n$uSxqgT#6aRj7c%u94Ddm zVF;k`Z5iWCpPlK`7mhv=0 z!YR8%=0}V)<2(}LV`)Tmr~NKJOieH!`(zdXu%_aFpE%*$FwYYE)*vBi5u`9fi*3$0 zMQzn7e2%eXCuEdXA^bFV9MO^GzKnWEiqjC~Xxcn?i$I8tyn9T)O58__9?pm8t3)o8 zxV=q;bddzmUQXK&Lv?8h-z1y>a*48T50et*S_oZ$*aCJ*Mm><;+THuPo9&sQCmE4l zQ=KKcP{2du%g8#iHDr9djJ7MJBU5}&rq~$UV8K|{t1PIV-TM7UEumtzSAUsC8aMhG z)__f6V*}%xs@tB0v$Ef)9g-v|$PTB42l8$j5WXkZRZftenzD*b0=0YG7)jbWdN&Zj z1e-0%MALS*TUy39g}&)r*o|tTPh+hFreZ@gfR>kb0HiwHUfD|Fs>uF3$Sah}*!aVU z=bOD2AxxGywP_$@Yl3t-H6sy;2Yd`>E}`@geaXqk>I(^|6|HCvH&+wP(GU!-Lp*m- zcsbLFCy98T*w0SvSD<+ZMvd3n`7C`7e6Ce=B8pMyPq*7zbp$%-?mi7umgWD zl~PUnkM3ga7#j^=QNAIW*=@Yr`7Wnqi+hnB+-yUQHWy<=r@k(son?6-G3k_Mwf|)= zN9~!6z3UCW4KwD6XV1v97t=vgC5@U5GfA{-OKP1lo}H4zdou1X0$xtH2&>~!7`EX_ zr=p=?cQCX&(KzU`ahFpbKiAvl%n4@E3-eYCm)EQV+d?BObyNwgYH6JDu&;uWMEt(x;%1zFV6 zI2aC5ZF+DEZG!igLOxXTfXD_!Oo^rdm!3+q(V>h?AZ?|}1pZ6+WWM9v(~3O&UA?2> z*P>0p8;``9InrJnBdpZM}E_a+I`ev1VvwH zwtpvio1@~G-)HFevl$gx=jWh+=)XWT<^chvjm=FXIrXE;8d)Mot_pw(6Q&A!Qn{S5 z4>KuK3(Yv8&rbVNi*>C;2T2-t1Z*+U-?dIqDdI0ayg#WvC}#JHp_#|CD-)VO&`-=? zDv-sdqX9}08qw11-%~!hp&&0`veQQ&M7L@sc5S^?3kDRxK~SAgyJ1gv$U0zXUQ~X^ z5nK3~CJGTJA_Q0>x8~?W;%k~PoXe><^;&hzqti8xbg}mLR3fdz_%tU*ZA-n4sVQk? z8&8R?`l{cKs?vnDD?^pIi;#JH_$;c&b@*C)?MB^O@k7IZrvy3V)mnQgkl{+V%UQ#t zIslbLO6 zKm+1QTy4`GgtpdOFFn;(okULyC7z&tPyK6~Y+rk)8gFjKUoqGZ_8+qRN}XSy0gT;( zIjyu^a{&TRTQdrDi9B-^fw|Pmhj~sgK&7gqn$oGwu!SnFlGeF8m+d4+$E}S*g>W}9 zOiaS_*6{I0)V26jqZRg3vTV6%D{dAjhgeZ*g4PuHs(=>vKCZ+iY`1z`sRBa}w*P5+ zz4rRRC|_@n)r*XR5UuIspH0S*A?EQmGiehY-3R9Wj2}82C_E{q)#x9D5S1W)OkX@3 zi~xqB&3KkjaKzfy+Lzdvg}qIww!6eV@TC}O0~5JYu*x-iZH6D=D25$oWz&I9tis7f z{h^%K37|@zJVyF)+);+&Oki-wsWlX!6y$G-)8ORxSJsBDd}reZpj0?Vfg%H~ugr(E zDzX>D^oJ2(!Ys^Z${2qlA1j&ii#X0)N{HxEB`rEOsL4QtD~#^Y+&lJv2SC80l^ znw1>yYwFJ)>sU|O;M0H&fZ+-|8S)hV0C+VDGF0pI!!Vj?%hWWwGtk*CZ5d7ZRsQFY zj)>0=Zeo%rgCA3;NxKW=8{OjbBYpf%!LS8bE8d1()Bu7|I*)__10fj2Ji-IVg49Cr zjXGDqYIMTsPFU$h_OaHVd{ylWwi-&~5qlH{NTT5%Yptzj8#NHwf#xJYYg@84Nh%fB ziO*Ap+vK{mvd`69-sN<%mDrasUV4l9Rc`9pNkGGPJ2_STGw%pPS|wp-*FeiF^Y}K; z=9;y5qAE5KfX1y!T`=PZbLA&WT;4|~3zTMb zWE^w@-(_Mvq9nB>%G=v)-4VDFd%4z5poHf`FIJ!zK0X{NsxKVsX>xpKp5w-s*)gK& zh|Lo#>}K_*_lOlqY_msNmFK$5bbov2z1H4hJgbm`z5TOHh>ULo!{)vLMN6~1QvP0_bB z140#pICU1d?><}BWak9!HMx^X_RV08)bkbG86$cLc<8-0rc1^0*-4TJfz^j)JSnFn z4C$d+5AyL?bQFQsZ-`?N8t2~w@iW;X8k@~SP8*QZ$f*iwBUWHx2VMowQNL$NRInhd z$xS#$bFe3wi{WkuA5*MuSJ92OdcBn{r$@G=f%YG!uSe1eP3{-iyNX|h_9}C;eEv66 zs7$f_IMK$7-)T=Ch+kwD?Yt&IU3g4EJw@R&cYb{a|Md@i?13l8)1vZ9hVw$5tgUtI zkE=oJ8$jRLN!!bQGhdho=mPZpBxpa+fb~$Vm#Dp?TbVG=qfN1H z!LWvnb_plL;?+ml5?<=37{DBH0r?0n!gg5x^I+&1E4a%xUT&+-m}slR>WofM zty1H4wN*OuuQy=yQ*HB%f95Z&ft~jp?;YSczoP5k?IH!8%Idn`y8q78s1D->ecdw zisd!om^Mf2ZBj-e8s=;KYgp)A3F_!>yPD16TeX@-z<2}xCj+kYSaK2x_O;n~`n38I zogKk8M~FtkDMT*anudf>V6|&4Z;yUnuig; z4*+{aU%H7uT}El)mUYDVfa+Bfmg6%DYAH;?Vj;M=EOBZE8seXw&7j%Ul3d7M?f_HM zZEK$~as)JL^EC=Xdo6HC6>+Hvj(>YD3ovIsJ-C6N%`!|!1!^ZcoeNcxjd-i*k z+T5SE8EM;<;t|XG5`xtHx4JyiI_>vQDuQDY>c01#A=2u1 z?0Dc`YV)B$@wY_tpU$t}?1mUY1*FsmMeUd=8Joqe?5zZ4UNs@FjNwfq0YL}GJ5Upi zttF%S2e11t{>GIQffnYR%TlI<1HdG|BfY|2^zv%rC3eHI&u?|Q$?Q-xBCnqj4tH)! zs_g9;+mQt0+#GxMC$*iH+uaLS8xcEY4{qM@#uGmE zx_RqS3x|zWWWud z)k$MWod7O+yCs%!jD$zVLD#Uz#PurqgBo|i1jqG2lkcPpK(l0S{*Gllyt9@PyqaVn z1V>z(? z_#ZUo2BPUXb`lLHE()bdztvI+%;}D3&;5v-bsKqB(EgKS;*VuY9D;i^zN6h1_&QU9 zJn7vpVZ0QA;v-?4O6hvLYdLPWv>^=PA&ToF97w08%D!%ueSCs>_?UC~SmA5}q0MP+ zRB-wc?5TL0c29knH_!A(iQE{LYguwmmW6-zp3iRe0l>AvsGR!GZrq5SBc96vV>Y+q zx+);aGz5F+gsn+?gtWnnOACpXI{bH@)W_dK1nfW6TYJUuf(WiPSXU^{!set?9rCCF z%XWY={>I)^DUj%`r3y_^=)`V1vk=+;Y6G~OmuPTxANF*m;4RV?=Y##)Zsy!#XN z>_XHCkZa1x7kzP$UBh;{Gj77xYkAyw z2VF3ed=MXwQg!1%q0dbNrR<=DRkVW=>v@2ST**7o*1E;~+L2ZcjVrE8vFQ%f?U+Ws z#V9*7g8Vq}i{YJ)g6vl95k`{){oi(S(Dr2PeD)MZys}SPg~ujja+D%E2W+Hn!-D5Q z>D&C@+aDuZgK{mH?RabJP+X5lcoFFvtaDE?`1bDo?a0f3HGUgSr<51hkK^<_F1jOa zYqZSodTCq?8+ecRUaT_>4rs4*@Nu8r)MC4rgN}&pe@5I(M+!hiVm}_nWA_fkd7}=i zOUP`)aU5`!y#+@`alA{QsHRgbYaucs_|^I_K5J~m%ELspPx*&uJHI6$R!Gcm+X~oT zMw>AAG&*_VZzq}SLfp#6xW!asv+Aw>bxBW5;XlPl2Q`0v2{mz2d+ZgT<>W_1bmn?2 z;u{C7?jtF2bjR$QkjJzvb%0;6Pc?_PI~^vsO?4oNBH{@rdx$Gx zUaER1MU*{lYoga)lk>-9*Tih6LLaN@95kwOB@fl&MH#`1b2^xaS4RZPtM}RY!UxE% zylw01us0l_4iz6@wb)wtQ#W`$1>5ad)h$hr2gvW*!r#SDd}I#p0U0+EkTv}JI% z?-3D37W*ka>dbN=?MZ2m6-5*rq1bFfuXxAtAyq#r*J7h=W*LIa+Yt6H58letBd-VB zoSoh!jz}%=aX6wmi0O88^|Z{Tq#9j(w$Cm3@%Lh&1 zpqNO_I_7gXU)Q$amRfI~PK<}Gvcjr9;^IukKfFqIo5eN(EoRuJdfWLbF{4ULX&%+l z_jg6szd8e6%WDi@F7&8PK4o;;hE?~!b!3vU*F*{Iq>J%fBrkWB_m{B{cu>4Da)3A9fc)_irOizSn3w zGtG=BT|ge@&I#^smcS14H10W^>~mSjD`aW+WO=P)Xa$cWkc*r^LYpX3l?H76YN$vo?sBQmA7R(_ z-xHjQ_Rz@}PPgNkg)By=Iufo1G?2R#?6$4?aHb~+P4sm0N9Of#UTH@=n6wTjT*R9T zUzOltX}H~H{&%`am&{IzP;@1ef0EBx$0q^A%hBHx`W_ zcdp@Sz!h;pZ7;i37w#ccX^}k%*XkMe=d^2#(2;2(A^Xp)Ov%;GOdPBK zS|fG5F&6EM<3Mi*E?zk7)$;3b>7(fSQD$oggDa;Fq*eR*6L0@r<+ss@Nj8qZNdRy#qt|8y&K zWLCHl(U_Qtad}^Lpj258(&3Y4v)U7=jrK(N>qn$QOam1Vgvc))0)4_#-h~ z&YS^?9fR)to70wOV|J=5L>FbnNRz0{&_|UZh|pta)gUuUhVz?Si67rnP-{a?l6}f@ zj|W`!U|shF`YuB68*m$_eaW&$OC@bz^5w_3*_sXL$CMc1+K*(5`3+?_jWPRP-(Kqo z;h-usinr zcG+PA47GM!b`Toq3wF$Up@O_dD%~jG%Ek1*CTzY+ivGK7&-FBS0IF!4?dRJQ&^bW{8qj6hg?dD1j_~ZEHc}>-)%40rDRNP>N~fD0HOa zSesht^>28?>m@qNHoDt5;pxVOKr+}gu1wZKMV|!<(u(862{kzOl}^XEVTQyBIlU-A zO$bD!Y&@w}?W5E?I>@M0T3!^hM-{an|Y(l}x z0Y4f^zCU2!R9uP0$h+IL!42zOLPk9&|KWBkWx{ri zl2@%e*{Q9{@&+(r?DBLa<95}s@_64Y@u3>~&|Ji`kT^C`?RQ1N%uv77a57q`(U z=#0##(!SGyj>~*5qnhk6UCzPgHhuSW=bAH)3{tI7Iddjc66gltH@JZ}q{faYsr+3V zv14Z`eYlrT^q$Yw);8LGUfIt{Y%l-?|B=?~tRZaup_vED@N-qeLC~e2-_w zH;Akzrf?=mT8@NF;At+_`9eNeIQ%R%(AB$Xk+L{*$p+N_YV~K+7@_+?5nW)<6RHdHBTMm#<25bf z)Thx?9}m^_ghwD9F?hNqE(!6kHJ|l$)UiOFJb$+`wx)lC`o#MCu-R@egDPFlp4l(} z;YKx7;Zc680irwAmG^ zS?*$=70Jy8B({<;;NO*q*_GdH_qE$-K$^gR*#3KNKpQ^s2^iOpFs-lj+3&#qEq1@A z%F}4dD5ohlSzC$JO?C;VkWeDOOl!htSp@SX=KTN3hgz5uPB5XexP>P32lCU7-+(l5 zMPgUai7&(OfxMVzg?-zl1Ft=hYL#t$!WY|zy8f6(Dv#X==84`|Y>U=g;d1yz7PtJ1 zn(=Yu<~i$%Z>3+iGQ&Gu)`_2)U@y_c^Us()hCIHl*PTcU(y3j&GORa;6r?=Ed$H(&Z;IC5pRpFKVyGMbOIpmmu6*?;1_lEQ`QOe zrm1RnQjHk~&NX048Q*YI8|i`Av@!Kjq*vX}?-2hGcQ!Q>8brYc=fI%Q5?c+I@EU3^!lIQ|EUN@wnr+lJzF2 zs<*&Ce}k`(Ys2t%6=(tf+yOeGpQpzOMVZD|I}Q%wvA%m5CE~Mdft0+k4&sd6i%wgy z04gLCm7~&n+|L8)8VH4%8dvh>@^1vnK1g{Y1JmuwTKo8536FNIaSdNB&d4lT1dG!_ zM;ZK~_L|;-KFv}0y~nw(Mo1LZpoc-KV7(?|GiRqOEwe;-J&%&V7#^o#tlf@xPSHb} z0NUQY4hw&(jh=`5z3I@hns!Hh?XmU}J9i~uhDOYbfEi!Fye^gwJ)mImRfY8e>hCl? zH^bDFDvXa#gCoj;X|FhNW9~)*a;CcxVDF?Ke?TrY3aFRWU0RM*KeG?P%w!&V61W%%gKVx4~_qbRo zT6-M=bQ|P>O({$)lC*+EQ*SJ)LlwVbGJMA$A) zP~JM1ZO^Ch#mgPv)6M@na?6ub_p=)p)-g}K#HYlx<8a4&UP@S*<4+p} zfL1Ms>w`YsWdjFFqgogS;&8)M?~#W$BhNBD(lePbU;8`uj#nU61D3n7l*Wmllp)KY z)Ddzwmgd$Go$|F4V-c-`Su41O1Us;7p+f(8^)^=J8d`cgc)T)_f>MUP?cv2Pwt)nC z(0HAs{DAbH!p|CmX^lmAixJ>xW5`ZW)$tBFE=VF*H@9KgqiSG=uD3JmgZ5A1#%ZCK zxM{{;3uZl|^Hhk1r*y~%*TtxGyv|*NNyW!w7YEFXdB_WvMZIM<@2+vWTln2N&_E*Ip=Vg%E{UB>|XJWHEa=^v1!s;DJ5-epxZ z0nwjueGMG54`M4|cRS>mhWpSp7&@8mJg-WJPoBuLg`rwxwfI1CrTYTU_9~R=Le3ww z>^zG5)1<6N9naAdms!jW5MX6w1bcCiPr7y}@BH}AO*G7z>q7{7crjo5V`>zV4y`BuuCj3*>Jghy9^qij zzcn$ngRj2X<~4b}b2nmXuA~|xJMWg~4r`OjEzWDNwTqX1zNGr1*+GOie?P2P9*MeZ zpz~6&Z)#)kP}^mGig3QQm0e$|9d=ECKhC!vcs!pve>$PpN4fR6;4F2uRN}Q0Smt~?9fGtmUDHamJdTTo5-FC ziO8>psTdIQ6MJqW*pRTM=CX-`NSD|-EhO%F3*mLCnhg=cPtZ8&YS>!75P~)1=309vjPWfl7x}@d&SW4;6`+8m6GR z%IGnBTdteXU#-wz^{U@~9kM5%4#H9FpC?<&KP#e6UBKU~u#1L8nmw*w2OQ5IQ7xZ5FH9>|Z z^JAt%UXhm&#f8kjOasf+<=pm_l{!vE9^+B&+v{zMb5SLBUd`uS)Sbp4fXFH}^<7dK6$?MGby53-h)!PIXe1rwl0Y zxQ}H3r=mQ21Hu9_!zh?b((?5zd51>V=WW$@SK35h$QI2|E4q%J{mN{zj-Jiu8NOgQ z^eNH3h(J3pF$52grl$#6xwRU9u$xyiV}(Wy%o~(S%p<1rvDt z2Z2$;_FtJWe`IC7K$N;?s!2Xa`5HrRUyIt8=k?Hi&o0ZoTKnQoGOPwf^&z~@wcY%j z8iOhCAiHm=Lf8t3D((x~yFdgi?uXK}2#R;Hr)s`F9({Y8+vdh(0_U9S2gp_-2WsaR5pV2gDC9x=9b2Kn6XwKAx6}G1czeUvT zzfRh$T41h7h$lV+@9s+sxB`7X-lwQif zKLRq{pR^}=zr!75y2ti52DQv`qN{i9q*wBGc9)1awy-@T10Taoq#T_5=JQFjq>d){po)Cai*p)q+3&1<0w{htD~VK z8?y&;;A)O7NZ``v#_1+w6oGHou%n%`DCYL9aY!J`gPn*vLg01gNt7$AK8up*Ad$ef%S*Y$t({r#&0aTfPO)y3k4=zUe6_%bV!6t<`?=yjrKXOL1WFzAheU6$bMn|8516 zs+IJrVC2eTxVfKzP{+}^ab9jakheK0Nf%P17^jGuklLNH9p)N6kA$Rij@}9wu8uhv zaZbcX>Q`)C!}d@ky|GO^S+@-Et6g$@Uc`G7-(DNEzh-QX4t{>hW8%6}BdrWmwc47o zDIdMDNhAgwFq^7OcsHb4CAPf4s~}#4!twi5SY5#gs23h1BvI#ziEQJ?8wjhjQEIxC zW0W0f+cYJ&jl{cX`6nGISd+&<4aLMGVFQ^&{|Q#uCyS@Nqquk-;z~QlrK*NMVgS=d#8n_+ z4f`T}mI&Kla9FJQ#*tc-rQ!(D*9FpMh)KlS`Q0ZrXC76k@5eMGBJD9Q#YS z82K+y#jPU^*b!m6LrCl9pk8)j$AB%|X>NLdfos3s>`U=lft`X}V^H0ZO^DZfSe38N zXL-2U4v(pLPj%6raoZ3>%9!7b^5CqJ2;IT-@NU^snjffgr6r}yUlmUMgx?>}FUx=u z%&}+)Z5t28$URUs>KuKyZ(suy)myu0lKHWY8M1_*znn*wN=q_0{-_E&LHY6qpZz-J z-Rc7!!Ns~n`4symb(O_@qrzHpuM1s9xKbLXj*tTNVMW^Q33j@W@M$!ySl;Yt&U@HS z<{y+Z*C70IwT&F71Q9?H^6oYh5w*Clzz*{1k2C!(VFhUjjJYGBOCVwt5RsCi?|7g6 zJi>n+wjVR9&VR0z2A~zCKC=K{pS9UyQidcwrSpjSvHda8=~$S*UkwXScZKQ-gvBWz zXKeut>-B`GlVGP}h^t*arf#?@L^>HBql+QA&HN4KhtF^%)nU~dXPl7cPZxnjANG-p7DtxI_>fWBAWQIXPb^= z{Y}zd)|x;x3;X*}naCDICEn^tw%(;Yz+Tf7R|YgSrhqBuB}GC|hpn^=Ye;~eYt=== ze}?4idC=e{B9qG8Y`}4x6}HHI$K}LWXN-+>R^^OwJAZeQ1;}V7pv_Y)_7dL_QykKM zMP|~)635R%!}I8w-~+SCV1+gMtRRD?ozAvV>0UBx8X{+(zt>}>stdd$`f#d3SSThW79$`%0hh?qu^L-Kf zUKrQa&2wx*sZI&lwj9Iv5|IeUm55=5O==M-(G3y2R#&1IG!KjNw!L3NoZuBt%jr|7 z(q9?ow~=i42O7iDgvb{Ij;ktlx-`L+VC33AoT4l0=|)ZF-%61?<`Dd+Gl0jnxigPE zZ8$RoWSN@g3m+m)Dy8Q_33brgS|MkA_BD+R^LhTyVflqK9r20(Lm_;?CFsl zfAf$|V4y&4$p^UUU{^S2{uUM3xgH1nx&7g**dHDOTupUhZt8)y$EB=t_*pr-YtPq? z*5BZUwXVLkv>J6S})&hi%v+I{Z0x)3ynQr;&}kP9%dW7YA)# zYJi%8mXt>FUN-+PEUy)SUPQWqv`@NBh?VU#!{~^ImwuYAw3(r9-o@9>U;hc<@ylIo z5w{J=HO*a^PPmC-L8*fphGJ+EUEh(SVTKei=qi{21HbihfN(ubu#1CVhY1Bp-wzDEI z*z5SaZsZmPq}MdCFCoX?U9-#i-7-kmze`H6)p<0QM!EuHiN-BeuC2iE(0u$k}PT$o-ml-|jAy3%YzV@1M0Nx7kPbl92d5QqvgyNa7Ki z_)J#MMMMi_Re<3pR+}vHm?yHfCQJCm{M{+J48po-KN1i06Zkob)$^ECi-CpSNepz3U*M$AW+w{_U5%_0V_NvOi|JXpIO4OoZZ+Gt}P zCSVCH*Ji9LS?6ydg8d4&?2=)*s4?{c1YPZG8cw21Kt^`FJr87jnpC*XjqUM|J){ji z3er|-Q9I zKOrlbclr!gQYuDp59c);EtdQ!Zs}&Cwn;9*FQAaDaXW>NL*$e z;jTb&ow!rjhtdo{7w}S!L1}e>Q8~#o2=L`?iTY0a*+_denEG^{5}(mRgTla2r>T@t;A-dKZSiYmc(wEr!Opeyz6wSPm7dUF*!GrVZ32x-Z+@1e(7E{CWbtu7Z0k zRkuJ1+1HQn;;b(1Syq7O@fNZkTtT;q%5BB864zUa;7dky(KE7#FU^20Tb`RF7b|-y ze{-zbMM~^hCW^f3+NM~?e}pWbvyIb;CM4|cqToh$EouuHomm}ZXppshg{u|I!W19n zQ@d=SPf2;XKI8}18MnKpbNwUcoGR^F3EEY|ahybz^3T04ZYLuGa};XhY{k)>)k_+a zfH529eW%#$Ay@Km;&0?Thl+{r&q3GPA`MBS*|WKu;51>drw_x>a?D&&Bs84dopnr;2P3B@ZWQ>d5 z2ToFHllU*ti@UnjP!p!DZ;Sq;!gz-d6H(aC<(}d`=;Z(b1fg44j+4Pyk=!Fla`Q0m zRRH*DN)KxT%vr&4l2wiGR;B>{b%1A6JwE{@?lt)Xn(j=d#?RU*<6#L1eP`kfbS&FeVdEvmF7l{%_f6kWv{BoA+u*(q8 z=?G}5^1#1fG>+0g5yg5~dgF?+e57$MCf6vzv}(eyx<*Ks%0=oEi)fI}Yh%NR^QYth zfmv~0;g`H9JLe#KNzQ`SD=9o1a?2Q2=$g>GM3>(O#8&TxB5TIQLNGQd&Om<$hclaH z4SXXWkJ}d5;bqyzSPkBAGKmVt<_xIJyGn4KwPGC?@%em5x{WYiapQJ8L+LZz^qTU5 zxr0iRG^_Xxz5h`b3co&g_{42W;z240`e_b-UWFZb3ZIqo zp?UYf&OxN)1}`q9;kR~6v)vW7tCE}?!|`VH&cl3pugxPQ!r~uzuY9{Lqg#bE6NN4G ztO`4c9L=mmaR+7-io0@#1)}hR$9{^{+(?z==xnZ1_6t6#FWQU(ghT27y-@ZD9*z*y zz@H_$&LS?+i8k1Y;QZK)?SoKt8-i*!FMQ{Xon%Cm$-cjmS};Yj?L>wX(TOkh@vke1 zUWM8!I~SoGo2DzO*v6!E6yfLu{##SE%Qe}G2H;dD1MyLagJ^JQSAK01ciALp8w_U~ z{}7+J-G|0iTFDl=fP3TVa0s7eSGh{rSRxQo`B=mcWsqJzJoGB4@x%NU3@hsv2FPIlhK+Vx;}?SzbCg9c6*Dxxsn&k zuVsrT+lGH6yWyJtwYn=6L=%v6{jm-Tx`;BZG#^D!1QgGj-C<%>Pc_<{v6<9H}Yk^PRO_ zAQ9nj#-cvnu;!BP6w&g54*EqDr&o!ukxDg6I_9r;;z7WStPF^&$AiiN{l!%_j*uwx zu)>jzK~NCES@9Hjw!nT5O%d(iiYr1$e3FNhJjnsS$zyFNfd7?Rj}$3vUuiWg&T-8c zG+8I86yS1IpdH^+hKzowj{Bl4%XwDPaF3pPxf4W0_$`{u0a15Z^75sle{Prh(f*AS zyo~7~vr@0$p-R^sw7-J*CT#nf)+${b_1g!t@XOr?n23rD_Vzl873cLyLM5xGI}%Pf z#R&=wqL*E>BPMgA9fb1mIESQp%oFV36iT*`1gP?8?Ky?eJo2$l*uUbn=GUM-Kl;8} zM1V#3MBA7kvQXIKWBw`)WkSzvyN7N*wJDSarXig*q`5Dn0ichO{%ZA~9@Xiy*Ik2k zTikxcSE$MIPM`5>C$hgx=w>RZ5)~f?GNDOnC3X{;j#yr<%L#ckL((NyRIr0;J8J{PV;Kfv}c{cEp@ev4q25|8DzhFlolKtkh&6JC)LX#wXg zJUc{IlC1Cp&Vbtc8CxeM3c*vcOHpY78sxIdEhzRxA6l2Ryrhn6++;V`pm~ds_dIpR z`m}#x)xo-{lTU#N)Jqd6bCtxx1y$IPOL>^|9KP(kN;`E-eZ8*~hSJfPWsv?9bc(X+b zXkLG)UDJsPb-CyrjWY_5GyWb9W}0Ryoql}Tc^C`9q68Z2d$3p!_mN32Q!tlAYWbV$ z5uT2U)2u@dX~GFyqUi+%DXP2mT&?RoL*0GZJ~{s`Y6-mO$ak_uK^M2ue8wG?7oub37=ogPveAKn$^m6s|yLnxGJv^xWQhAeN&$F<+3oNh8 zP4tS3T5XTEQ78y|E4UEgXnwvdHxbv)Z$Kw-RG@}p+g{2#C(KHlBfHohY4?^oJ?1t zUX_&c)hS&T=h;8Y2-)vW(N$AwOASG@P)~ahrjNqEIQft?2p@U58l6 zH^zr)B#T8O7H$L!m)H-6<;(01q7j9>$%xsjKm8Ym`Bv2K&e$i~d$NIvlUP&4r4?!* z=W?Q!k2f*)iO=ZM_WS1$%wNgFI3|(nQ(PpjJ;)ni{o(3;o)Q6n24Gg&RC|CKkoW~Usb~8 z5{caYW7d;-O8^{K;aJT*3FY603P0Esf&l^Tg{NuO=$2Jf) zZ^w_EfUmCSb?QRFOk*tcwB#91sG6ChHD9n2GOsMn0+e7~Efcgo;=a^!e^8$NktK_@ zb_%0YE9A6r;6=2w*QWX1FYwft@?Lv7fFVM|w+Y;j(Jnw{bD2QU`t`h^T~)^xz%+tv z7HEQIQ@>a*N}5YWKarnmY^8rwlxzu0ebrp|CiWETRZ%>LgHI*$R7Z6-;qXu+)-=KT zm*nbAt($oab&m6fZAtP_aM`UmCv;{Tod!p1@PL;3Tt?NZg5%AMh!VR*L-Y&T9XVZ{ z(9aC=GclMuTn2&gKHn4D-?$$bO>Xe6G9rH^WXUWVpD3B<@+UvpQ#(~by23iCO+H3K zBrNl$EoinEmYwS3t63esMwQEXIx|<^ZM6d_BYZ!o)V!T|hhX!!SV>QdENO*31n3Q0 zumx$gA?}0l-|HfDaP$k+HKnzx+mc`Obu--y_5EH@a}D{jqYr>$v7m%fRkO#=h=XY) z5ik&r8Bg?2d%K3eb_>67VzgV4t&RYL1#M~!vA&K9ZeGs0)HehJt~42SjQ4h}WcwUjgn+I@^M@RY70AiZq&>#7eh1uu(Evb$cZ&vBefqoX(S!I`1``fd8|9CoO z_X+ahasO?fH0wwmsl^D1Y6~EXRtkEk*fQHU4WVu+7Pw}fi$-%qsirc(SvgN82 zqWHY@X)N(-PuvZ8Q`c#Uq-{)solf|I%G`F-;!(VBPp!Qa2k%6@G}A(A3>dGZ-j=fMwLd8 z$H0Tl4Z51|`5qP@WEl{5Y+7-@VtR^g0mJ?-s-@LS!H8HI=T*g%%Qq$LuzrHvAp_ef zy|E3cR=^VFJ;jHzm;Tto-8{M1)SGnU;WECY{l2lK4T_KYOr!lZI6?aZgh^^~&4Yyo@Igm7KIgL%glaS6ERC5@$B{kU0T6YHazfmm z1oFffiFkl4hh;PFw99b zq;OD$9lScx`F+iS!z9!^Um!H~Y#16j&g6w`CKtE-kq)bxFZ;{BFz6aCo%f=Afq4Atjg zY=XxjCCX184>*BXe?gd)qSmU7wOcqPLncP?Qen)d#%vqUI>aa756e;#)7X#mA>QRE zerTM%eM{{OHBZnFP{YnU@`=?ec3VL0fGcbg?J)Fy3ojq-_LEG=$_U@J*ESdz3X#&O zX`;QBtnYx(+Dsv66&6zlG(>$??1#%k{+tyzL1w75T*NVJo8Aj!gM?gtmfl9{3%fkpDwzfz*%YMLkSR(=GbXzP3qlh)5 zy0L}|W8%T!Bj5e?OgsNf9RiGyn7?V|n}9ifXweGBj=cPe)vtbQaCY>F?%pO2@S-Dt z6{P@TQY?mgT^mV_eTk-w3HJBh_C$OLV~Wyv%V$=J=9-36p?!kJfybeTluA*$0UE;0 zmfpu>`*#eir<`ynRU3@r7eoBsDtO0W20`@afbUr%y5{BDn|P6b1nFr@$7?y7GBBub zl6a=Pet2|co0j5Wa84u&L~v|!F$jmP!161JWHe45t5F2{ zo*T&l`?=j=Nq(1$Ki*m7l%3h{sxlhOiTG?Ph+Tbrq3*QSvUo@taIKS?yc0xn>QD}e z3}kEUk7@b}D8u+#0msvjmlj5jRx0jL&7bhY*@V*Zs(6@|0fJD4HRUJ{P?GWEVljjy zVj<^@*?b`y;lO&w600ks9`lJ=@qp_-ay;=^<(p&@3o5*p$D#qM-tQ>I$RdPC$z9Lc z;yB`wT#DnpU$+|l@N41=(7fC}0yN`ih=~w@HF>KQ0r*4pX+@l>c=PZ@BoUyNtSx{H z?dEnSA}y(xXBmuR{@713%s>2ai_HRF$K61V_=?%#X5hJy0mB77QT#C1C+Gp}vAw<4 zQjMfO(?hSjt?z&zcM@V;TpfM6s631=f}y6mJlv^1nhw4f5zW095q+PMz$80rxI^oF zyn7Q--S06L2w;Cw9-6;GbAyl;OY0Pqz=aK|a;Ui68 zHc}NnF=kZw*rUmVRk#i0u$@VSL25dgYY|&mIb++qwXVIZ0!QhbVrAw zvD2m0?)mf^p|Ewt;Wd4mcuuYn9PwD2l<8s8iY0@<^LBy&@Yroc+NmxZmQS2)SI_LB zU**hx`t6-ARTs$QX>p7}0ct+L#zfjoa0of{lv;a&a9;*<6wt3_^SLUVA^SB*)~QJ~u6Xkk zw142?`{ausBIUyCWSrxXu58O8iSc5(degmPF1|x8*fwdDTU(Hp6gX(wZw6?-Ax*z6 z$q@IaM_Cd_Ow8_cYVr*3xcpXj^QPRD(U1^tyE+J#x%hN%fO^+Y3oQhEAE_}~eWcZ@ zIridsJ;|egeCTO(PYaGVQ?~SDlSWv}>+- z_G;o`(9TcW=9og$-*Cj=Mm#i-q+uaS(A=r-V;G+_0e3If`mhoB;S^zdxDM5cBd($V zTZva9yX2>;73ZY)?Vp?-29vQq3TG_D_f@on^&5O$)HSL7&-8MAlZ^}q=Xdps zOn?9!q#p;>&Dr1q8?s-8L4ogD>{-0SICWS~4(fgviE`d8vw~;ui)1U=Ix@D`^LcnFJv#scq2>a6`rd=CuweGMRcDv}p znqoK=w|z^dJ;=v(kfd4(kA?xi~e4bOxoFYtx<5bg_=) zahtI{i09o9x9fG~0^@Y$D(yw>9CF<8X3w)UXS+02`aMOlFrW)-T7%Yz1f+`Di}QTX zE($AA+7ws~hkQ4RGbFYP71*LY9fuJXmjg`0l3ukhfq-YBP8X}I;{7->iSXWn)m=K+ zu;b;sF0i#xtM)OTMI)QC$C^5yBhx#mkrWg9)X6qO)!aWiJ6bWocV-UsPpIoW*endk z?3qO~0EvH#cbGs#FSg?Vy1y5l;|e+9j(T4rMvhAbPvjQdmQ~d9&-^w{*hU>XTWmsl zl~WStjhk>xL70n@=lMrbdkbT_GlN5-*SaQkDo^(=oo@Sd|K{(Y9w2WB79mrQOgd$y z1*#_2;stFN5W(UTh|3cggu~1(HPtgvI@h-3H+@4(Zpc?n^To z!uf=j&^ypn0?A0`&Zc`qdNY8-q|-D%#;CzeTRO|D!EkzSm8IA=GKH(JLNop>fm&_) zPkJe(S|{3=PTz;_%(6EJQ0xmd*D~L}OE}53Y6sDIy*5iuIAlN1&}})wu1i5Qh;RxZ zJMO59bRFKVu|PIuhi02VG&+XjI?m7QvpH_7V=)RuawYmY8ub@Es{#M{YStm{_2={}rI&^N@& zci#O2+TeV+?UAQh<|PakO!fDrT3aFmjfJlK6}CdS7|VhrJ*Oa~M^LItoE6!_nES#`spnZV@TkP%rL0y59GL*feS+kE`KQa7TvB~6Qybc~E(JRlIllRPqE zr^WekynfZP-kyN5)Kdm!Dl*zj2xZ+Jk8?tf#04BUCsGifl|D~U9UbH6>wKPt87NI# zvEwi1^jmK=Qk#o|MRG&WScf1_0|iog8XC3@oXERk~ck)77Aj%$nqajC5| z5v7^H%gQI)n$_C0!ASlzepbR7(YrI{t)bxCly+6yr5$auz$cW^Jm@U&z>Rg^K_}K* zRqZ#w57Q8!6+GVJLmSP?GG5!bj*J?YDw70wkPo$iDP*IEF`rsudm?-`gvB%U zx^R|gv*_>cq48i9o<;Y;oy%TSXJ?^U*;agH8D^VqQ&#>D)cQ#Ktq+TgThJ}G?y?(0 zB%tJ6bcamC6kR>Ev(M<32u~ZwwS-Is}(0*1%)({MlTEv|8zNBT-3ImdwRKDM@QdiwOVOT z8@qsLhBJ-t`k z#h-&z5%|Dw6(HgRytlGVV!rTDCmirlzt;YYG8gFyf^|5*%L^McgqoYtf_p8RwF>YZ zDfcM*eVf{m@7o;{G3qtz)Fd4WiX)+JE7t*Qe|<--ZRxSOo@dId@ixqfTvgD0Dn>wT z*e#8=GHuJJHQEreX|F%1+IO{G^nv}7CSp!JXvf(5_PdCKi7pwfiy?uLv~KYVS}6GO zJMrDwu4)QBTCTdB!0V!Y2Y$)*Zdj2BFGzx=FIe;i4Rx$AZLgl-bM6~rur_Pi?KB|& z!^^7VyDu~d+815m|H4dIjr9kvS(Oj9!mXrwatit-ltgRgf#x>j!YBFcnYeYh*0;j( zyjB}aZgEHPp0T}u_?FBwsE`H|fTJ-RQ6N5HN#~h|~;k6TdZrTO69($&Sk2;E4 z$t*j)Po8_>u;;O9MV^C*mI!Rn;=|*)`z@i;_Zra zwpXy)yBfcmX!0R!%g1(}b4Lr|6Qd}h7`joeelx?zM@>PuKcBWPOpcF9!8>Sk#tx=d zz6Zs3zHL|TQQ^W}Wb4NGUmo^7_I1nxPn7531HG=8TwyOd#{E<)?kwVCYKtr$vk|v# zdYWEPWn~{~AL~;y*$MH?!AThl4b=N_B|pA@2#h`2o^Rt#DJ#1|hgBLJ#CE57&<&kk z#@)|ne+d)^mp}K|SLAnYWp!3A5mkJOpcM+|#Ucf2js4_Pyu?M!ih+eK* z8ww&L2MH9?@g6u_k>5Q->im*bmC?4?|!(>k+JyucBeD8Dpl&y%hdMCVvE zdDR83VWTX=@h{y(Ed>xn5#8}_mpViH?E(b!w-mdOmv^`2#0xn{u(6FtqQcm^6gX(_ zlL>L1M(ZV+N3+-4VZ`>?$F25ot{zZ+Bs!M_QVlcpQ*P;?^VyZCxK;Bt#Uwdn zsV!X)H)Zty#}F1>3ETv`3YC+?X8NiOqPQ3rHWExxD*y9ORp08fVh`*a&R?H<3qSA+ ztu}eHGLfa!ucKiUBj_$YX^@;LMOjn}Pn)vMd3ztVSfhtOA#OLx>y*z5db2by{^IFx z;&bpgaB+BLWGO(+YP3LmD=Up&2s9_3C0Vf`+~6Jfz3+wWbJan6awc1s1N#R_w7j8+ z@^%&-*us;q=STFkMV!0&stfKSfexA>4=TDx#c`B4ZtPnDo84`G7@+L_0mV_XmFhL| z*t%N};?08zKa`*8%xdL}wJ_Zb0@!PhQXb3MYaZLY2$ms((!0dNEfL*9tzF2cK5eCK zvXh1P+r2fsnnUU2f_oc^Ba+)ZJAnm)l_J7t$rTUq%^R$FDPU`UMES=tbzL|bS_^Lk zC8t28)JKMN^~#Z`Ds}j%r(U$y&Ra=bWup4K)RRtjDeP%7n`n+Vyaa_&Z>}wK<-TzJ z9=u@%4?D$9R(WIUK)Rd9p1ea#*J=^OQvgt~Sxe7N@+Oxi!8)rzwje}^)Otev=g{`U z5sRR6UShfrWm-9eGvVV(5YrI!W*b5K^D&p>--0{I;E>}dxyqkAcXgF8CpULu`x97#1mdbE9&F%ewlXR_dev7n9V zNo;L5zw2UHYZ;Wgv8=k+Lj4)HVs)~+hZYRnaIO8RPkMKu&x+dRTj*mMr*v0>V{~o2 zN*P~4UgyMNFiQBhyi4SEgWJxNgk54Y6p?KdZ{;}#&T~#|zXJEBv_f!Sp~oZY><7*V zKdE+uBMzX)7VYIZQAsYPxjKp@)7(h#YA3B$kc#>+OSFVz2`}o4SQc+SlOyuj6|DeB z@8(BRlpbKUoj1Q zd`p<`3$xs*hTl|VE3`4Ps|5!`y(p}q0IkmQF%z3rw~vBVGu*U;LlNkaA-ocwo&pZ1 zQLd@DuNK{^+#Bp^s`d>a4RGZBx4vx6Kf>1>$7A!oa>zR&fU6z?0P}Ds5W)SvLELSa zIB}X-kTJnE0m@-TcGGI&AF0_Z13c}i2Uk)*$BTN&%6l=CPTAl{`*s^vCs1@_+^(GF zFwq2?!DrjVez!KIzn+RuMt~bfRa|S=#SONa0YH8hiAcqkdJ8$+Xdf#V5s^PVO`dD> zTAh^sErn`1ydHo%yxQ+5UfBEwEqwoUWL*S9cuF*WO8&~K8O@Bjd~n>L0{hYyP|Oa* z^l$Z_G=OOp^M;S1hPU=Rq|KBGCu2~iI=GCY%bAJC$JN>SfnqV){CHc9r6xAw^!~ux zUiEY0?{0^#FR;g&>d~b#m(99U7}Yi?Xwj_MLcqni1X1T!i_X!`-mokTj%H`Bg~CVKP7j*?V%vmh5!xYNcI*U|f^ zk2gd$zWv9sEf#E&LpslHuBYhXYvi%1LN)L*MrL?ZpR5SW9U~)X>p51QBX4*Q@3>DJ zFouxN+NLhrA+jEK-7l8tc!WDnf7I!-P>;gh(aJl11OSg}n0Aj-pha@xP}iAAuCIH4 zt|l*j@rs7oP%iuI&^qImHHD!p%e}CbmJK`$P;(RM!tZHqKx(vy(*@$S)V*$P8}0N} zXmingd=N(^hd0zsm#uNS7^fY=QPLHavk%$;8B(N=aK?8CB|4TQg$JW}Hb_nSahtcD zx8tVX-o)A#c|~dG$o+Id7uv<$E`#ykb=NU>#L3yKqG;1TDcQ;%vcNJg8wrqOVsxXN z(dmr9s}>*bq-&v=vy9j=2G^4C;I#6!Jo#E~D>=K?jTro0t5@BoXxH7! z)vO@zZpev;Obu^zBU)vLa6FrLrZclhhlfL{eto$$FZ0`#dJzARP-Tew8Jv#m?0qO} zgTrIVzmtW%hWbpmjRC&>F>DOAfnXrr4rqFGHeRA4i;1;Z6yd;csuncL*0pC@$eut_ zK*~&nyfuO@%EsId$iwP8W-FfIs7pazd*~AH{vGms8xxy#H#!l(V#_Qylz}DHee`Si zq4zZjD5;0+F+e7P?9a3~`iW!P@rgL+4EWD$keWi1q4+w9qPHVy+Y*f-dTf6HQ?N|2 z9wn*grv(SFk%z($Pq_N!QFiG!_(GuLAzn+=E~}#dNA;Q!O0t5wta5*YKQ@4QvzV3q z>TChUsvPA{i)K-ekDQAM+pad8@kHCU+o}ttL;5YlS(;D9=aatEf|?R=r079B=k+Z1 zWpKea`C80R?@``}=`F5JEaT%}Pj9vkcG4##h828e&UqROYJmSkJFG!sSR`Q0l2+nJ zoK}PyLf%b;PD=SLO1$>@w5?Aob> z>Jbfg#k&ftEOd-Sb6&MsKK+o6xK|{7FK)Z>5OGi*`CQcIkVY!ZJi+m{3Kq$GwOem} z#bTkUA6v;T{az!ah)kM&#fg?J4;g2$_JJS7H( zp4==yP)~1){D9_!YbduIgU7-R>?O9)e&K80y7BSngi=_Qh^Ga^q3J!c7EdYY_BcKQVRnO2{HtPC`9<{_pp7M3{qj$gFaoGn2izhU6l@^raw-)_Cq?>vLUKj< zB-QV{otOvCJ7W7l_ao_r4GskF^~3U(yB5X zrjyZwXp`{Q)jpNGPPdP8uDyLS736xxtuxv~8RFCVFwL_a%WreDphM|al1F~_dlZpR zgcleagms7@r$2#FSdg3y$4NP%fJ7^^S}yjI{+wf}ErqK%gujo?S?`8co&`?UCE*_vVn#wK%o%+AUKmm_)Yz4KB| znla-o9i*IHH2>4;Ibc+^w3_*_C7+~cCji%ZlbT19U@A`Ou5XzLi zJe1O7-{7vr8hlKNYFjmq`#WEf8k_3{JVGeD1qLB3KqETiI7dyZ$RwZrOf9E{{piPG zc=+L^n1?K{UJF8q!5fj+@jfO-trU2zqZW-#SSz7NXD!CE0vin5gjy+0*=E5Q#LWbY zb=q4oTkQp(0lrt!?_ar|xMq{KfMtooUJEn0H-2S&t<}T zp5R>oy?PsgAx~A6EIL_qMjv7IAk{jWaxN|lLIYD|UB)4DS^kZ_0|mj)Ve>SUcynz* zJ8h%wU6oT)%Y{78QjE}zVY?+WFXMoE?VSQx!BKy!;G!5eu1_MUG2x&_BfQn$PPJBI zZb}1g^(`fu>{f_#qY;hhl~%#UaeZa<&s5mGIiwoynP9yb)^GNQr}g0AKjAqxsc6xO zr1~Miv##LmZGu(z&v@a}-t>^KjYmOL3)k3!8djA33dj&AR`VLBQlsrbR6$xXk&}9W z_K%dh4!R3zkqKLsj*~)?(&D1+iqB0g0u&;kdi9E(VqftCc}0@`m+D^kqqg1*b|-X3 zt7ULLoUiP_e4X`O66Znz9?~s;Ba0nV&?6X)-TY#je!39NMz;=wIf-qz5WEkkYoV~k zKuP9H$nVS{h@lczclCs6Vh4`!%df7X@=WBu-9AZv%JrzKonr@_a8$DCYd`O}Fj#j^3qF*^ z+T8dEGNI{MC9h)?5I^ID@{xq{HC(t>T&sU<0x((Sq-Hjc(k$l zl$L!q{oi@{sD%_7)^x^+e10Ug%(-$4M#7Eg5&t|oEBxTjg1qYNvQ?})Z|j3XrvW&(&~}4{!ozC=`PY;)^4};WW9F7V+zXSSao3{vZ>00I=%y> zCbdxZjPH0C-q9Ae2ZpY~XSss=V$}pm5cVaEF2TQ&ez)6*1^7u;zoptC_R7gVKd`rh zqA03}#%s?W;Q4OcPUJ?nEVdZY6semb%}1BC%WHoM#d#AGyj>pty+p8Sr~G5EA%SHj zw%&b{=dVY_PPDQt5DAzqe-p^!n@chMu3kS15F*p+e8#@Ze1IC8=h|07jng8O9H={t zAmDi>m9|ihKl-|GF_Epqj;y!sV8NES^?~-o24geFs(P%pzt5q>rLz$H%e=a;yA}iu z9wCov;GtM9l5fq?j*05bb*bH;vkaWWN+mn`!Zlgk&F#Im0d)aq;ajIa)nMo5>=ln{ zUd_&Yv?U78D0{xys3q5+E_7(%b<<0b(cvwaVi$cKOn@?u^L0E$#LJXi19+pfMTj=B z3-A1(t0y}a=h6#YV=BgVJ#y-%wyDj)+Bc0ymT@iDl{hXD_#@OlP?r;}!&`HE0w0uX z2jxzuYj>R8Ihe$nkk0xP{ol%%JXoYwmW57ljvXN2r)Za#yECfI9>rA#)lFP)u%~)sHmNy5VRRh7|c_5!@2VDQt4kwRr?U?H$cwv+WbI=m6M7S^7+OntVB^x1n zBDK;+(-G%xRbDG4Dr%*XuF7uAfF85}o z1@{k`3=(6!UX32sW5^-9hGxlV!GC&Wb=S>C7rsD~zFddXpuiRz+a+8*JcrGzr2h=qspdI=G&Z{W3wJ&5w-$lMOKvLqjv#-lxi^p;VM zdLd_*Pzdd?N4VJ}!MQ$;DKQL9!|h?EZqTwRw(R7Gs!7{^X>mJ+bqEoDSA8TKRHqc# z2%c$mA~FywOmnZW^;C?tFDyP@qbU;xv|z1B9Oq`Xwl~{{l9``#L^(I!b+o3rX*FJo zNb%uC_;`92*V}RI-ZN`#v8x7ia!*g&L`LVFcox{H(YX2%pbc_%TDHp;_Gfcjm;;&v z{aq~IlvJBk$xT+;Vt%(Itj+8c)N9Z7cAMI2^O%S9wAcL>&>H?b>MIaCfTFo#jjg_TD7{sRHSaBZSx22728Jvua67+o(E4nA+CeFs z*T#9bo}GlvYverKEkZc2#Y@(PJ$Hv#E^S*roVUnW$|xpDPh>DaWLt60pR>bAn;Yy` z8U7&9kMxu&T*|^Iw}uJ{$SFN(^xOS3Ku$@j|0vk@Oq`M^(eexrcNKYnIE?8Tob35Ri@Ip56FOsv9#i6W zmpr(;r^{V#Tb2uYchR=Dg94m&{i08Imy^gjF9`)GOM&d@L-aaaBMt$earrilmPR{l zR8!5T$m<~oWBge=V%kJ{b`_6#op$k|LUT|JTz4kwdRj)gwErY*%nvt6*6+Ee@gL`_ z$)*1Q_B#geq}qfMTHH!xDn`~A?@k<)o1Lv5+#fJ%JLHy+);iQ^yGC zc1_48lP>Du2nKA*<2DUB)vJ_R7MJkODG0B(#Y*Y9FRT(~CX8|qlNdgrZ52q0 z*b%DPOsFd(*tx*hVw>0l6}Ia->_q62PE?Jkmm7|HTYMcfXnPGB=1@%@u+^rnZeb4lY7ZG!GOq2b*K~en4NatG3&ppC?Ts`5C z@wjb5#p6&P{;Y@ShL>80k+Gf`Bf~{s5a$I}a0np53ZQ#8-xabipN5!e@#YlAcV$@q zEWo^kse`x`O9bWO*{@OcxFNtsnDwrdrTwRb`k*4bn4vFrfKC$LCjqL3WtRWTv7V~^ZBdIi|${cHbd6a zV8IOWzpz2gbHHcYMVHxC%i|9Cd>2ByWD}mdh&jLWRwK$2X=S*UzO_97MB6e6<1xPr zRIl4sx7L#R)M<2UT;pn2XG%#%P#PI$`5rxxhP__lnvzGHx%^9Ym_tZrbKQ&&+T@H? zc5KhOp65s6^z&*&#amRw#$Tjp)Mj_=;ypH+AIzEx9NIdr(Ym0_5nx zP^bNCFc;@dDGTc+x>rF8Di4dbsbtmSEm!mMFgh=mpetw6SD6qI^?p5Keg|P;Hgd^* zZU2+r*bpo9)R))UR4EV2$EeQu(cVJxLbh=^?FM|a_>HZaWk1nalIEASv+4$ZXYfIbxGYe|ff)oBHzw8slbazgy+111n+)JjwSEE$>EKu18 zqFyM=0>CFb(L-%E{0(oA)|NeSe#gARBB&;QfTDZ056;6Q&7gudaE*ip7ZE`dX$Ewx z$M+5*%-mvT45!d%SZ0TBv`WL!DrY6mZ0 zDG6IS{6}2fy{8IDtEE2NlGHSmPQd##4u$c&ieMKu*Ym2u04jc!*&^qmD^w(U*FGOs zk?2~q5`{XSLZvoI@V){b!4H_GfQ^19R4Hmt3ocH543+w^O^n)!@cWAMr^p*SIMdn9oFZ#F8hQhl86|aD0tNx;#fe zrij@dVWjX-L8XXq{KyD@gI0yw?7X~bY0YvRMuWrHO|Fb=;m0<+D)OX&T~%!X@*TIU z=4*ur$B$z?HPxyB_lSOoj^wIjcQXg&Ztj*wp|JIg5|F6IS@V?Kr z7-R8F9)vcA2~?+96{KE&Q_fE9&e)1>*%>))EMTRSpmuDq$?DYw^jvHo-hWvm#t^i> zr|nuijrM9%XZ$0A;JcVmU6zBqeviVQ>(qER7ef#YXnCPi14wmKjuioWd^_#*yep;O zBi}9tALF(n*N=J_AaI|$a;81SI<#*s^P?ryOxZ9|f?5B(@SObfXbxpQx<}9XdkYC5 z@3eBQh&Z)*NNno&6O?0)XEmF{aB^W0JN%v3e8h|fp0Mm%J_p80PM3pNgisF z9!dcC=?GJkeC+4pvp(^u`D7ISgJ)W^5Z&aV^mdhSOlQXde?H#x8T>Rx41MGs_td}+ z{t{=ml($dA?Ns{;UL)uW*W)x+N3{rZhpT!qBuRj?K6kCzgC0>XqvPInw_5voZGc{rlVC^ja$Y15lCjwsA>>-wJCmkU5b{&@dVqo4gtzx9JqO?&6Zl(K(Z-kK|au< zc_m|$8bVT$xrI_}P`$f2*%cyts`=;;%hXEkgP|CoKgF9%2LE;wk3QiN3COx>9krNO zNKyY|OHrTC4(-85+>y4E(!5UQDS5HG$lA1t`c+byIs6)@Me7T!dp;aNk-C_v)D`aG z0xJKtoI;md6fv{H;0qsWwc}EVsNi6wMfIxQu=CJw$IK)xd1pV*tQAJ=J(K?!g%4xO zguU!QQrEZC#e(4mOo|YVDY+P(BSyyxA$kl@WwyN@)Pjf$fxdhJ4XD8_{B=bK9)$Yo zyxH0~JfaC1jkKQ&+JJ?i3s+|BXNU9DU%|pK$UNAF<)6J+-fuMLp0G~ANZ z8O;rAdB^^faY?vq-49d(?$S(U5M$6Qw1~4V9gqM{O!vg?t8&Ti*mlwmX_S=6u*PQE zQ`*LYpeW;1^bN0!=os38_Jo=gf2eP*bVVE_b_ObPk*`nVkJDCg^PV*OsW2 znCg1TG}AT9XGN#V_snN!p^M4`UDk+cRM2jaL0+}1SYd6yca2}_kbenFdn9OYjMW<8Qdyqsv;mg?A+YDFl!S2qb|?x-6rbpS_KTFj)hKlM@Eq;Zk>Kr+~o&) zH`ISNBEA3N*lmiBluO<6xOVI`5SP|jevuuYCnVSMsV6au>EHp5{h%^X%q`{6=&o0Q z-k`y*P`G|RG9;;D0LS_E*AL3aUh*(BT@YUD$KCeDjkbObWB`W$HH3KT@UpQHtq5xZ zdZ;Ge`VREhndocsWSFSCI`F?dS&8cOs(@av6+lf6Blz&|*}e>9p@Yj~cGhbE1kXsL z(h%Yb+YHto^^l>vTchkZDFGx7(Hs_#v0m)(^0#p!SSdc<-E^&Thjz(*wLCd!Ag^pj@MXw6$5pGg%3kYKiT-C@pJrwM2ZEN{QtM zh6*ww>(55Z#{1y$Gws~-u!{DelSBcJr=C&mhfa*GP7m+Fp$-ReKb8G}g&d=55TKyTqMOLV&s}XD1)6F!)Pv_sy`Q+R9l9 z$}-B@E!3N2wNPUfpMUh5H?w7JF+UD}Li5;6haxRgRd$582sA1J z^+EU4KhkCBGY>pSds9S9z3K6edzk{9MM$Tz*J*CtGL9f>`FW@ zVBmJDf1h>k`ZJzI4MJvtnS%CW2M^;c>drU^w%p=k>R-HgP2`@2gI?$w^4gV*(q4vj zTdgOjo@;yWPgtcZ?rf$us21;1@O!Z>?`yYk-w;uP#QgEJ-HYGwfaF#b|I292Eo$)= zOIA%ES{5X^KQlkv#)YLb43r8*-e_-E2QmCd2ycY8ei0h*QnbES`{UiedzC)#3vj|C z`R)?(GiB%tD(zQ}7~AfH;&~P{ki}EoM-KO@-HyLuwJlF}%#Ii{~Ex~!z-OL`VWHy7cohayJOBwggh|VCs6o&_E zVfN^AlDH_N4DHw&Nqai=v2LephLXCjYawFXpFErzR#yhbetcGTFvgWU)PXqCP`Cf^9s}}Y%e1+z9HfZ_4Q_V z6;3`lK5?@?#*QP=RcBCy3K16_k>o(P)XS~q=p%@gS7UzTDL{wq?A3V7z)~GRn#K=0 zozkI7WC}yo$Z|PdSFQN@FA4_KfW|elPKemdyK{0G`W14g`(IZ3Cp-B-OBYgz1{MSc4ISgn`DPKO<1WV9k?(6z=!s6 z0xgT!CqwJ3-Fo9fgN3DSgL)aq+W1ar?J}E3@K*u)E-mV)%;Oj?f*d%877#>2Z6H#k z@Xr;UJ$;_0t)~?hQXJ_}6QjpEsw;s%(c+ljP&M2H2XJ2xEiT&H6m+e_H!G(7#r#Xv z`!kKNs@<<+O6)2TR#a`~dpq#uF5dsZEz^wo2sF42e)rrQ!t&0=Y|myalHsocE`gz# zH6fslWnN0>mMxs85wNk&e;?j%$27t+dDk$GX!1H_l=`0ZpL^{-Z@=AmkcdcpNBH1K(pU3QfdDs`8+U{ z)Y;49M#+z7oFAXWDp^!V+caH}_r!4*tI3A!I~{ghLM-c3+N>m%DWtebI{{}TDjEhv zR5UgDBanrZrpHyo>SSo*0?I)_F9>#1=$H|;;+^Q!2LARm#P=HAu3;b;&grDA+aHAU zSDKq7vpY0wEv%)4Drur6<*#g@A4(KX>#(L8{y{zGttnYrsGEp>GQ&nxD;ka;p1P=u zg1B+w5AC3d`eC>2`h3*~YjV99SRMbE-49RzA8EicmA5LD;jjHa}OI2wJ*VHw=0A@&A5#&B4#DTY zLv-B{+w5m)JG(AvM|Kr9D0L3I=y$Q8*`>AP+SeWJY#E;iYzAxsvB`yX_?8qI z#|)%!BjI_TeTw10Ac`^Fi|Y_Y7Pylt>Cd?XdM4iqN zvkxIh8wJJEjLu`5#}}RNhEYm=&<#J1worV>WhlfytkkR;hZNFX@Qa!Rc#g`lbrq%Q z@c<9np|ven*tz@EWwR{@C9mrD%frNDf*)EJ<8CCs+=VX-p(G?lzehYPAPJ7g#1AXr zK5D1CE&f>4qDY6GY?q1wQTVDfn?c_$SGlryVs*0?>+I^;Vwe9Y*{qmg?_~Fr%h4Ra zFwJ`>pCB@PnW7tu`fPd%pAiSN&Ol1vx5pSs^95B<1}vxKQ*0SYQ7$on%Fvi#hl7Bk z*wCT@behT@og474gH|!9F8i&sS7*Dh{SmfdXppC?m*F%V#_V5^DFgudV?ZC3JNM`u z7Y4X`1;1zVi`Bg8lkH<#RWF8`_E}k@&1gU+bWF9>T6F?>g#B`;-<}KdnysjEceiRq z;H}9idkGCJfd=LN*1odM$c5ac%zXJh{e0%(-S+9b$rAiqV0F)Brvt{1saQw@s>S)r zGz9ykUAFu-dt-B4bxn4@=lbTOT|#do-m(&Sq<~%4r@xqbUxx*DY*8;krG_BCNo@X( zm30WhRgs2`w28_wXX&XEi1|@ot53NmyHDP=@hrLBmxD!Y!&ELH-V>cO;^MKy!pge3 zzN{shq!dh3>2F^_BaWa>Inx#uN;J1R29ag(R^*jv<{ea`xz}rvch2Kee1mK!3jafk zfhI6)^CH}-QZK2Lbb%VKBTnsq7zmKpGuy3_?MgSa0iJp@i zq9_7kL>uj1W9wf|d;L_zLeXjG!KIF>X+#>tFDuKFCA9dOn{@ES@?|=>c_(h!8m1Wk zkXS0b*SB?}CEU4+^Q(#a0YA+~`>f<}Qpw-(*hhBTzuWl0jx6rM^%7WYN;7U@k^smID*`iU+jf-?pqJ~5 zTBLvQ@$inL?VDVUDTY4OTwC$kyZ8$`p*~p4GnVmTEV@DiUd|5G+NKszd@_;bp9NrQV!B6BLpdullx{RX?cPV;iPAKa$#cSv^r-rNU&r_5Q5CmN#Vx~J*5tRHIxkG2bAF$z zbDn`PynR^D=}L`jGnf&#A9?}j|EDA>+I=rhZ9z-#)XK5LLR)Yyu<%6RQv`Gyw9%@> zKHG?`j;u!2{Rl3JTUyjT5_6+NwE3Df+?cx$f17 zP}P$1XH?~g8q%0ryyKC0SiI42Y7nvL#@K4&ikCY@R@p>~({3JJ$CHe#^Lkx< zZ6%RqMJe1$ig#9^2?y+kjdsN_JJ8^i` zks;bKkC3nRAd9>IA{AQTZRa6NSV-w&a(!$M+x>zX{W_Hp9o7o)7AswCl~fHKPk4qZ z=jLzk8YIapv)`to{KC0p;CIL5zFR!BavD@2`<&DZo^_?mI4{qO`A_BP8mUW_VvL^eQEuUm$KsbSosfYP+l*xIQXJR0?<4 z9M|l0Gz6E57|mGSaH~%&s~T4gi?X`af>Jcw-U~KU=((@=#~VN|I3cH8$4j}ewo>q^ zmho~n5d&5xH4hd#+G8&&k7{e7CsfO=$7;DXM8#e9n-vH6REwRY4N4IUi%)H(0Oqqd zDO~&z*b^M4peNd0NU5=*1GS8*CnJ3@lX^)LN5bYab-jo&Otr~%0OgcC;Z&aC^v-5` zWj~e5Yjxc|r(1F(iWOL8!TB)MPuMb~^f_WgG}jK~QbZq(3sXcNV~g4-rz?lLkkH)& z?X{ht4dZ21!8TIOX0~Y9lI^#%i&owPVJQ-hk)zKc3bxmuV=*=vhC?SdRD?V4b>9<$#@65_XHk*fBTVn1pz)YP1% z106b+9NCw*>+@u^3jiJSn3Qg|sY&G4LZ&c5w@!FE)ZpNAq_b)Li9p}e7%#&NXfN*% z8N~QEuk1>+Yqz@jx@|l(X-N2Lu4(rFAu5Sj!^GIZnM<9YA3mT{YBEKEJLet;$1@3 z){q+Oc+Ke)k{}d<+HTF))Dwj!x@H#TRURv7i6oSL%pdmio)5*K)SDsABL4gw^32U;6t{2NE~mBRP24=pJaY~=g#d}~pg{i` z8bl@L9|DVmrv03Ud|)N~C6&@oSkiBSTkCo1c?ZzpOp-!J=uv%%gkY*towLSIT~=aN832cs1Kx`LC?ctj z|69xcRu(IgMIMI?rXjLF^SQxZ3nxy%-0-zaO7N+kVs5R>t8 zfhGAcJOF1AKCN7DIu|&ksvwZ9*yR%N=u$Yi4}0*4PY^?}to<{wFX*WE)-^Oa6;0#c zEVi>Kj4a2p2hlHYK&Glt3ZdHFDbjRu8kj+~vgYwEF)In%m|7es>JQcJv!Y%hk#fdk zPysJoG(JPH@Uc^XEr~wBS(%{7Vk~$zf3;De0`)Ax0exgY4lAm5`CO9sEt0$_HjLMh z4ck#P@-5d0Lp`w7>#y!~P3WhReT+upU+@BJBb|KST7ak(xkI5rN4!}IVnVHa(;x%a zMM!BQb)rfrk94p8k9&@&xK}nhU449Kt^!Annh(=_o;ww`*})M~ry`0eD2|GU(=$!> zsWyD3qQ$A4IRc9W3r!R%C7+SQH1?mvvQfv?*`*EWxF6M;VUwC~lJhT0;`Q=wzIwcn zNFz%BhgN%I8(*R5dMq-#F}+zQ^YD7<7BL^6*atbg)Wi5sz}BYRHW;ZZS&;gz#x)D& zr+eZ_knYn&?D2Vi`t{iTg1B8BLzCP|fNqQa>`QhrEyeP9G+ptXVojK zZa!<&XddJ{ex-e^RtUh{^+P6sp0;7y>s!%%@*T~`Ml+}Yx00IhG2dvWjs~g^vw}`8 z&uzTV*jyzJWjVvThwn1;7id&*E&T!VOQjf|1%`H9+hrB;2pYL-PO=eQ4ce;>1fsGG zCbmRTlu>FrP+^X=O*w`;Ihri&SWGPE_IAC+?KF?<)COUOAlLUFV|whDjMS_7 zW^$j-7_RlvxuCX^5*BD7g%ANjgZX2DtYU+II%L0Xvlm-q#GGT}D9%eL#7#U7)}|c# z24r+P+H+@)W<9`}94-MfHH`hI#874xYjHM~F6v;@25TGcKt@l{CiDgMs=eP%%p^yM zBO=#ftjHPVXC2h!I88V!BB#WHvx&|fpO+oZpS^L$Bkcq~6)n{1ix#ZI`%SZB!DL!+ zMrOnbPl-%7`Ov7*w$K?F;S+el76YEfkx%`k3S1Y;+Tww5rrR-3VfD$L*#p(rru(ku7rU$#|UY zkF8ObK-`HiHu!*hirZ*Sc&o3)MkcMooreB2u(sB3XK_BS)#{r0w^4L4G>trmgIYND zYM|Ulb_rEXn7hF0X5MAeYZsJvQcHzs;qkuKp)`0EX7`-i^K5JNe|; zcxYRZrz@(8fa1m^dIb+OA+aE(g0~t`E&+j`+@Oi4btnqjHi5T*^NNbPNoc2K(Aj0e z_0Zx{5Zf_NW0z^7a8O;e@8P@bK98h`D070^>T^kXZ$W4?kg7Bdvs_$fHz)*VaaJQT zlusHh{Fcw-w}zAQ@7p;c+qeczW`_1tSmH_5WSPH`nn4Q}lSYa0ECc!h?bTCPo>uVB zwQ-QdYLl|l`h#1-BDwCErnB8L2r?&o!>1*FqfqV8P5m|^Zxv+vu8~4}F5MJ$Wt`r6#w-Z!9Ls(<17Y{drm==NvnJ$uWwOm}KEhZk- zbnR9Qx*7|`#SPCRsW2=XJ++^-v)vYUOJgw88T^Ff+#cQ1c32Jn2INm^o6K`F5#hmY z^b{pjjbCR)&A6wN2nWQ7wAZTILXq}e+rq)>oPA$~hjXoiGuly5m%|VQ9V8M~V;#?~ zno`~^Zyamih^xVs1Y>FwGf9mgOZ>kZOX3}X_)>K<_zUj2TLsdGI@1}1LM;;;{A=D0&C`2*R;$iP7A^tK zV$8p~3+jRtJmrpN2MV3e>!WfgMa${7IifP=dM^*rxM+o3yr9HonuxqQ0MiC>D)!!u z&$f4Caz*G+brxxq^kfkP$;eQWWD-O1s+R!*Pej=y3PRI~tbiL-@47wu_;O7pmAEYk z0rARkIzBx4Y#&b_vfxlN+)-r|Lu>3J(&-GC*a`XA2S{H|w8P;vb9RwTt%>@|y_UuI z4daH z*%a4^0vm%o;+DD@RXJUESC4k8^7a7k^^L+&T2v)Us#D(Eq}ot%M{Y2}L;SkOj!Yw@ zTiM$qz*$(>4G}oJuzP_n-(k$P+Re8P@8q*kUQ!7*_i8Z~op0+^!XHcS(rg=BiNCBV zR=`JNPG*4~q=0=v({4#$YtlAHx;pK8U^uLeu5-OmaM{|QH)@-ml0?fAF_}{i8qn&IIIacuXYC(G zYjCoK#rf@a1=|*xKdOuJGT(L^V;wH2rZCwkqYBxxS)QlTj?I9et894+yf>0ia|K2P z)8%BA%JM1~CYvB_fZ9%ER_s9NPx%FxI$#h?NNOWmY&5Wd-T+Y5Drpl52;P(R43#7s z(6(VDhKVWXdx1Z0!D>sel8-3bHv*PEubi)mw|$SiZni*p>9!6GvgFo@=$t;y>nGS9 zLMk&^b*l`ioFG@aUx~S+GTAi&|g{^!!Y*&4q?QnT<*8VtEIm#AlI8*@_ z=yXMYKn(-au$<+xv{j@Mh49uiMB-OU0YJSdm3CYQSqE9(xFouT$(^Vk@BsMpP^B>^ zbmw%qqS#s7Ww_2GkfbkTMYIcqbeo~VM~3IyGP}Wte=Z|$`EUNIV|VR!OZEN(+M#fM*w0&OO#&C979$#`E=N+L@_$9sSRp> z1i)VY`pgC!E#!o|et;jJNyrYN4+w>^xQ%Hfl2I*7U|i@DakmCty3YRGY)eojBs0|( zIeBekq=5Fo$o<1hk7h!chTQ;r$mM-swlO#-sSrO#9fDKkuKye$+z0Bw0e>$X7U-nb z#e29|Hpd-NEaKDX^i!-i0I&Wj>z2aYZ>PuYUq0Sry|%=&=@150O$I6wi)nI|i*Ew% z+|3HyeqK$LNikxG$X&6oZK!AWj@=Z76bnh8PRoIAw)GG>s8mZl#JUf(uI((UrV8`> z(03N96!_80_!A9b*QXI_S(4H7*AUHN5YQJ2Q|=+i+d@QxnPO$+#6m|R<1sV9QJt-- zA>ccv6gK{Q9;EyykNmDZ)&?c7g5+oI#w~zEJeAi6_PSlOni8geDVkF{4P@D4T1E0% z-aSse9UT_Vtg+)|aq3I?QrxzB#Zyuiq^ja6eHi_N>SNZxkcwjXBicxqzU}LEJ8VWa z6H}=$qe;u;m;~d#&D*GA&_8U&RQ=_be#m1V8N``OQb)kJ$xasK=m1l<++~21l*8c8 zp`%PAo!4{?^oXpq0g2V@%iD5=jcLg0Bzbkb(F`Xui%iA(;G((#0dMXq^f8~!6io!F zP2;P8;>WOAm<(CHx{Fui2|1KDgpVj@_d9A1G5Bi+f0s5VHfw>P_NDfM_c@>UOk!zRRW7sSCRKjai6UR5r|Q^WhP$qFNJ$Mplt{?vXv;|rNXMC z^)}c>VQlR{x^P?Xe_dh(MD9kd_HeeOhg&@Mh3E0kERfPHPYU3qBSb9MVB7(v`!nh^ zk+)EsLkB}OU5McNUe7hzIg>DiN5i&0XD{A|FaKK*zmyur*yvLTQruh5;$mmBd8OQGQR~#3D_pW?w8IiTN}Z9`j6AJoT$4|`c?k+R!ApZlhf3b z+y8Thea=sPQzz^hs+-nB-f|LVcb3dfu)7*}j1rCN?SQ>-cK1W?mPcX#&w+;KtgYzI z*lFA45SY8Y8t?Xo&#v?F5l})qu4UZf?BV(s0|Ww?;?y^^VNg(-QL4w7-g6oIZ^(iW z17G;y>-p`U&9O#Gdl)PJ!fzVHu%l-Je`h09?FaVk_BW`D`iw*7q6i*2rhCBmEYm7?}-z^J(DU8)0l-tX*8(@ z^)B;lN)hcvYsxEu4$(0DS^Jb%EAS3ZHv@zGySk&@_ci%mVuq)j3}jT;s%G)`SkwHv zA$1M@$j4hJUa&+nkMlp@Uh@gKRuqO&{$SUw<*fxyMx7}$p9AdiHpVNJT~A2+Ru2VA zCnmf}r<}E0dKAYpmb%<^an{Pig*C+vB(3hT!!%ErK~g(n7}nB)ki2%vl|0K@p2J3J zO7k@Gt?O3)g%1XAK-c*lzC-6`6sRUR% ze83$|BB0%1Mf{T!y?rAi5fB)%0YlPU4l<&&hi2T&2j4GUixMp`s-tp*&oVOEFqU=* zZ)+=dwK!)#bJNJT+V5g3q2u{{-rE#5kgDEKAnU|A!-kvHYSQFKiX$iEoB7VEcJ?6p z=cryQDtPCUhW(GLt6Us0{{_fmAL?=pB%sUpUv}Mec;}?&oclD=4s75!w~eS{{xj<) z+UaBN03}sGE@+@)TpKZeLOtLoS*Si8e1Abu>~smFIkz7q=#7uja(Oy+R;M zJ+nWvWjP6!O6{ddk_yBL`O}hk=&SkA&)CAKH;yYPm){dsG~^Q%{AHZekzxA=msVZR?mwuQ5|84ELes8# zskCMkP)Xlzi%f5ohW+2eY5c^F$59J2uXEB87tj}34M+LVFy7{Z1ro#$P4M(72vRO1 z)?ez>Nw}Mi6A9}H-A56JR1Q6WOBwRBp%fdFk31Ev8Lv zw@OAV-a^Yax%LgMi7dUgcWn?$Q`L!5v~L0c`x_YATomTBtxhIqF|aH0_Ma%*<-S&g z@{1m>$l4Pf_PVzuvX^ugiR92B(g(7TsWE=ic$`u~0Su@vxg7n9y;Q>+JP&Gk0W9n8 zrFO|q>I6hE`K2gwxpi1BA)7u*jCa&^RsF$=p7-Uly4hHwT?Hdhqeeayw>w7RUfYsh z{t3=$qaW49Yacxmp))&xfRwjUCTMQs8%vPqJQSdc2pP?_G*-?g`sPXeWTSMRF15zTJkPs&EWw zc%wBTw`RoX%2EEtlzqff>?ZVSrq*iRKvtIo93|2<2|i5FsG1+|HqKkR0a=f1@!6wn zYsh2lt2kN z3AP%Sws8;Ewv*T;wOWH(JHA%V?{nSH1o8KN-#_|KCC@z1xzBx;>s;p?`VuPNYjU^h z_->7eB)oG9WI@gDJ)Ac$mr-+$e;BD*Wx_s<6Se?pN0rDf4UMz&8EHcd7B<|O9C>u7k3)-OTqBv8VPJg_BCxJj- z3OaFy!>u)y&FeUwkjq%Goo}Pk+ipcY*r`aIGycSW%TP_1Z@8_)a&QM`t1~@es+a^w z(*UJdu%cZ$MAyNMU5!@0oN#&-VhxSg5&sfJdKfh%N^Bu>!=W9?YhR3D8yhHnV{bok zt76Z~YMYOcqn~)l5t4FLsSWkqfKf8kh)K*ve7@3+HQciU>HF$$(77l~eCf^mFMwRb z3gD{oV#wuO?QYj2Ob(W?A8lt;Z5K*C z${1131w8gWO;P?g@V(r-%jq?)W*VTZ$RkZrQi=ltFFlxqOS6fmEWe1CJcU2(=QGPu z3*Pw53^)A{1VM(ioml67^!9~p+l7$yw^>!(it7-I+lh0!RS}V-YTNkZJ4hVL_vEcDyXM&W7r$y@ePl(TT5)q61(hR5-Pt70#9@n_qe>pJ#F7n#iEUj6Ck}ewsEk} zpLqQ#96B2jotYw{4cHP|e(bEpYy`g0Rj)M^H)mINnPpio zOjX04sE!I_7~J_Jay-CC!()|=>`U4IB=~d2kdR$}nbVl9?-K=%Rz>z><(p9#_vLg& zxb{6neI48K10*I}9O=#rcVnL`7&w6MQ3!u$`ohh2Z9;ugue3-UrSD^4PmnaG)y~Ho zGmT_aHXju8+u+08kL&5LX|y%1Fr-{UHAg`Wp%h^qUpDxE^%oat&fH?OV6v(@-Cbl5 zs}uZs35L)sj161;K*AoOWSs&D2u1qs?1n1KY~U9$j`GjzSKybfL~S-_?KatwsQq@a z05OkD6RE}pdMgV0sTT25njG<8I*2(y1GjVh+mk3a}>W zm?DlAi9F7ox(SnX84Bm^Z#~Wqh*!fAi7Dj4TL^U-`EYBoZ7oR zaM;#hv>hq@4DtVl-ib0?D|aP28&&w1c9>gvnrit+?jKPG72%JvVQcXjXrX&#AMZakD9!Z;-hU1Dm1D@QH6IMQ4y1Va7K(xaIvXwo z)B3i}nCbG>lH!e4nB-pbHPf%R?AmJKeB-eR-L;c#Xr$!D_d5=S=e(Udl@(kboH?P9 zUvA?w#v>F`rF0+Z81>>**lUhaz>%g}JSG^++T`ILfc_|XY!U$dD{nD~V;R*AsxT;; zqJu5I#}0c1L%7g>7uQM?cf?1y#vxZ-ALpnp38;@__`dTzq@~8zV;DN@&ank(3TB{B z!@Kb78Ye_3&pX!uJYMPa{v33&?7FNKHetCZq*1Q9Dt@sZF2OnQ)C*#^RrB5B;C?hD z?$b}@>&bLd)>PrH$ETrb7b&nQtk(GkR3fc#w8ztlECfmwX@JATCgO^+YR)OHLw<@s zXoTnK3w1#P{@4x!MFP&D?r$xZS_3!e5I*-5FEtctBhNrS zSLxw&!RVLNMDW(1kRMWG`%Rz94X2dBDXUCkqPjZ)(pB4g(!SsGs*l@BcxC}w;)y$a zitUEkEarvuq``>Blin2&h$|FBUbnClmc=g=_qzFa0G|s4p*K~w*w31+A!gt0l(?2l zT#r=ScKRJ)H@J!TtC8h{)PZF%<`R0OJ-UVhG2}&-C`Iz-=rv<8Uc#}wuPKv95xAaE z+s;emw`4&TiR|jAhj^zh>I4y@2XrE+X*E9Td%gBidOgndOOB6#2$X@}D0gv3solQZ zRxbePFB}Jh;4wQL+2z{+BH2E&$4cr*L!w#Az#&_iu?1~*e45KL6mPYTa)aZwaDhFP zcyv!UA@_lVd+DBN8n}4Y_-3@2*kd8VUP0$AR+O-*OF`7pAc@NDJZx@2aia+ex`QJ8 z%8E>twS>`duh@_RK-+B}G2}TL_b%QdMwKKXG3Vot-fCoFsj28<6Mw!eM<=H!oPXl& zxpm7)1*}}|n0{*P$8o5NO65g?F11nwN#Th0R6!AHm43T{IQ4lYf;b@ z?qW7L?ofpdd?@xZnhJ|?Eo|!d0Ch^39znAfLb(v|V&T&~9;<&PF?QnGnU)-{k${05 ziWsKmw!pPrHDQ-a_`|p>O!3n__IRfq0pnou3csejzp9q@oLmoFr&tG3$-1VwmqZrNm&RK2~0*Y64eS4`TANFKok zZEr+-#!wgG`XKyTq;w7XtsMLlEC)l|c+@iod0}Z3h$>Sr(F~4-ND@RvImkvP_)8ph zAS|O3`6F^U$-23zGXYy#kjwQhFmZXYfL@CXAIObCT59a#5KkI3FWdzRUSrq0pe*{!`NcVHP6Ovq)X)Oe@qdBXq zX{JGOT2$k}4BH$nF>J@w&w?4Yg^jbC}@~QOK0WHxDI9IaFhcRB5>dyBSmVmyc7hI+GMr_&nxLFh+QL zL?`k(7SmZ`3vgfx_!Jj560YSCi1+!&P4HA~skTIPnaRw4(6 zz$dW1>UgbO$G9MLX6?Kh)x(eFlKsX8(|Ra@K#pQdQ@cIcs@#}&`X?yC_Mm-{B@-g; z<7%R0F&dDtJ5_Y-31B%_&JTg4lKKm5^7XcVRksg(XC@DY=@s*;a&qdTpk%s(O>=?4 zQ5pwhPQcrElNln2N6NyfDJR5&T>>G~EID{X(*7Zrl=v_Rz{^bWPa6M$5D)sbIP|=K`gWU41 zK*o;cYMqb%Rftn@r`_(i4}?s^shEwu-n&>?h14cHLA3iTgk2lyu2gT|DW4AsLp{l zT*Vt7?p1el{abrqq+>;q;aVg{BBLgvSHbG2isITXY^ws32#7@9Sd|27`oeg@L$k4J zKY7d4vhkmxJ?m>o60U)bb~cl5^ghKn5jeA7+*aS3%vmg{raOCVX2`N z%b3O!fSv6|c!7nF$^bQlfx@vLj!eH&V=J!VazXb$*e17sHML?wmQ%V>oQg7gp_Sif z!V|TE+hVp&0na{riBTI~X}X=9uxOwoz1*-$OOY?sZzj*V_tWEf*Ykd!x8m zOd{;B?6$KZbD}*$=jt376Rz~t#r7e=UD3oj`B%WlVVn+07eZlw26pF~)#P2DBl|fR zr5{UslKDM}o9udM6znY4TDwni=^|0A1&ncV;b?mczcteSOMLY{n`9-QqcAJtPt5M= z2D^OD3ZlRbKjLSWxT)pr)50*9H?}B27vLaV4n|kp4oeYCmIiGIwP!M0jPuW`iHY0- z7a!XtKCw?j_5{vyB7_}o)@6WJ>0rNe=FQ3=9&pdoeuP$VORA0v=*xw`l5`mAlRB5{`~S&pjkmJ~BHCk4f1AHEVc+H2s!wXCuCm*LS$W}?!M z*aBp;Lb56A=RmiUrShyhtTNX?GE<=}^#&QC5#0X=+5ejd@Z9LZ4DU8q0rUZ&5Uyx| z;PCV@tjdp=1NUl>LQ0Q?w<9qOMxBGdhvDQi`0q;GQelqAUo;B*oo!orRl-W`#G1U# z8@-mLUtb3L3<400QQV7xRP`Q=6&S`#VFVge#K?PW>}S?rg<3p9%rc`kLo7`o79$m5 zm7VfbLdIeHWUB1j^oa6&{%ja|j%RX&-HW?tss+i+Uob>Z3*&QDDCHzRZu+$=?T1Tn z2Y_0;xYdhY9(I<*M;@k+I+Rbj$_C@$sjf|s`2K>for{)q+Al;Wfk~LM(b$PdPc^P) zSWm1sy0d9IV!z0hS|FTiw`6f+C-gy|Gf5Mb-TPR+Storvnjcf_cyW-@_=V)D9h}gA z?X5j_?gQCPc6GaDLt!h3Q(qC$&IM`w~2&?h~~Wx_}>k+ z`nlb<+%8){U94anIC!&jcqbvMKEBWkkv5WfgZf2$h-tLDfR#NAtwbo^g2b5$kDljy zs}aq%R-$SfvXXxb?16l-PD>pVt`K*JbsE-BFRblqXRw4_g28?m%aO#r2{b>BkG!YW zmSyc(6`~@%!gH1mMI+8;yY-uF15)o3&BDr0(Wn`^isvGzuxgpRosh1VPPNq|{sNJg z2!8g`O;(G%bSxEL+JY+F@`+S0`uG90gv|gipD7IWVUE_>kdlbY(H^&pO0<4+i`obd zCxh3>=JTaYnDYXX05$mxvWuxGHjuaAO$L)Gu;hh9vin>Dr=@^n>~tLXcss@MQY+GS zYOkHv;hFY9jMLT*&IaUF!qD!@IG~a0%626wNrc`EJQc1^eWlsBZHnLNq``wV<+cA*5E0^AXuCy!8Yf#ivmlqS4*j zeC(I+FD`&YMmwfv4?WureD;ckMuHXcag-DuSJqJ!AVFHUPctg7bXRAl5gQRnbLHRa z$l4q4DSiDtcaPqpulC#d2bxgvOgrzhvenX*T$gXY6<$_{fiJOptL?O=blg^F=+^_W zXh1u7{vgu2Pr+FC*f+Aa#YIC44PdN!(GZ?p1& z;Xv^=#}#U>MM(lxGhOcG!sumHYL^Iy9BEQZ(XAk3e;WI>`SuiC{q`58)T(kDCS&zV zZ_d8(rvK&UpJSyNp@<>d*^EM{bNcU0G?N>nbGk{u*nu3k+`QP5O)mEe#wf_D7FUuZ z^Xjp(1cmafqicGEF z16_=$$3qW?%a=vDmLsjv-6D1ONJ!7xTUA6$Q)}&bgd{hAOj2eU#uk~zzKktoG}*2s zgv~eN>|bufB&0yb{)~_^N-Y#fKcexkhv3gNM!I+$8hC*n&BbvJ-d&tkooJw=+!W?( zF2hx!w4oGhGp;~6KuaPk{V_M~Tb=d-GbnAeZ!77lA{}Hiz)Qkm72}90>}ECLPg&Sy z4OMj+TO;E_(wQb~eZ2M%yFP0#dsXiLvDaf>J6sj?d9?(xj0e&5BTYBAlwjrs@OH{C zFZl?TP9#VCw8_SH6A}h{9GT=vYTTP&%eO|1tQr^rUli&m<_1R^)eR+<(C|>%6F2|; zUAx9BFq9H)p*?41T}OcUS~fy%J!0cCD9rFypcNM=pO$jTR$Ylpwq`}J5yN^DJB?JU z*eXdlfjCzB+?{d4wC)#UKt%~{><;lqWvTOX^ zr+m+T*Nz?PkTDf+vA8Te-l4U1z)cDUud+XD1>E0X3^K$LhosT{IHZ@%KbIQ@$!3Bhs?HHKG5sO5roQNu%uKk0Wl|5z)Ha45%KuCVbNZ5Z}J;@Fpy ztLChmq%W)O0xIRcL_`?#g$aK=$c(#o3-1Qi8(I09;3v_5dsdFn{1|4doN6-w6P04z z=7DBmzQQ7C42eDAed4RJ!IK+Y-&@#`-S2lMNv+?pr0s$0p6{XXXtqz;sx=~aEF}O5 z&cryp>{z4?9GAv9gt_EpS#)DaD{zQldRr8;pDEmF^cc2wK#O9<{d+?ly!%)OwsQXj z)ZXu7aZ3{!pF_>!R)P;FU?dg8IJx_GaSQIjt(?^TyP|>6rx(RacGO{$KE!%+bm0rh zs=L;3_Irmcj;5mCjwSj-warOcKq*4IeU`J<9Le3^(D$Q5#&dw^krdEJIMnlpoe!x0 z20X}35w!jKt%Sg5dWF3yrrU#J8Q!yAR(2h~)XmhzZ1t!m?>@o9?kItDi+aU{30;To zd$Zx;O|;l6tr(Qy0DhGU#Sqs|8l3+`!XSH8!m2=SXlIDtZyW_=zB}SQ_kXAOsSHo2_99#X#bo5d#^NlKyBl_F@xR)`^b6jj*cVy*1XNR9+O6!KwT9 z)v806#x#l=o4kZ^X`WWK+SmXk&CdyTuF-Zsr(3~LMD`K}+$xvJ`Dmu&W;=>h zjFSqmg@L`Kah>SM7>QhAmfsY{`Km&sa!&rbjQx^Znc8h9q!k3s1#Zbk;wajOqH7)Yq#1oHcFt@K>#V5G+SoQeQ~=@4#HxQ& zDsNwe$qM+=^U!lT{d@|R6O4&Q*H!kcPj#lcco^0vs)pOY67HUhvJ7=pwk~XSB(Xji zg~zt@O^T!NDo_e)b%LNvSyDgJmgGPGyJG?B!#vjE^l-rZe4GeKfA1x$-p@@2bN-!0 zs+0wD8cxC>?leF3GKq?A(i#!^8Q+9xXshA|RP zS)&C=vam)XBYhaP??nX3`Vncd-K2hlQsoj?;mq2rXV|Nh1%0U2w=vJjkQ$P=tXa8% z0v1Y;87MCU{%GaPa8DJQ8ad|a^K!N%2c-6d2JPiT#qGFy4GD10KBXS+&Fk}kYl%(r zdTaLQc00ghy&JLj3#FnOv3HZ5=SLkB0bQmIWFPPjb=)@f2w7RO&pwyCFW{gfX+CdT zC&p&D{V;)<9^{_Q!S2s9pt;qEUa`ggY>Ph7Loi3pb zvO33FMYUnj8dFA`iZ)H3i#Dw#FgnIzu2N1hykZuLFO8C%5?T|k?!zG+iejBqMf^^O zBVhnr6ExEljx9w|aU#p?SifZh946iF6R~F4n>vwhWl@;U!-UaJ&2ucU5zOk&+Q&&- z*a$|lo(T3yFGC$JwSsUF%2GV-4GZol1_gqST*bEwY5(51PT?J0DO28#|0;C;%R=YZ z1#M2hbU9bW)a{okjnh3jWbgN3EmcRf z^WyLwaZ(W9z4Ozd0ic7AEA zp9-T5CI}b%HcwUl%x>}n4e4$kr6~MNriY!%-CU%*8Oidqq0Wq#oUDz7H3xvz7dAM? zi!svCgFPq#tqG|Ry`ozkZs0;t7)aYz+HoLiRu+@nS_||s1zSb#9JCu#yu*-c-uqf^ zUvrv@kt$}g<`05Fj^#_A64{Qt?LsI4$pLJCD8ijk9p&uGteHAfsl;NkoG{{o^w(bohpSDt^YCE)S^G0XL zFA2crd)jT=%p3Aa{N{B8Eo(4QTDrN4w}@lRHEAjmZzSRSMJ!Bg)JAB;wEKM{BQ=yB z5^as3c<1*L(Z6h=mt@CXpM;2mZ}Ai&DEkh)b}F-EgN{gbgtjOV@qH%D~R%3IwIhtQIn8#`(IBW(zJm~wI0LXpdbH|~}Re2m3Lr0!T0V=ivh)NAdQDyGUkR&5Iz#SyfzaV2pU zZV0K8P`}(6tGw%5Y{S$Iz^BJp^b3os!sY+R+J2puQeKw?0Q(1;d6oU#2eRs}9TWK? ztc6~&(zk>!#~(gLdL@7OEs1Y}eBsj!OXr&(=;9a4?Z!5%Y`5hp${r~Ay1h*J;e4JV z2e>iW?nVq)*hXQ$e3VG0@{ku@?K*^76oaG<ULkT@zp2&ELByVNmF*mOaQQiBc#h2s}NVPA|;u&GwK^Nc3&)^A<+{l-e zpXK}8f* zyIx7~fhoHrML9~Eb}rJ&1?|eL?T_72-0)hpN&szyXmX4PR1+V#iB%~Aho)K-TOB%g zop%%LKfUX+m-m6SbsK&^Y5KKg=Z~I@xq(wi<*{Gb+ zZ@~2=DJGaOtZK~H6XKI{9Tp%R9_rO^&(PJR%7j7N;mL~Qjdy8HQ>CS?nex9PEpO|` zC$_PK$OVh`YX-G*R1JHf7QA2~mBR^g8LJeDIJDq>;o0h~;Bjs{%1C27N(K|gpKH_J zaK6}WWjL=pqEwjIEZExB(P$+yXP|YlJiL;uvljmCU%L32F?M4^RTuAlX?xOZYPuH7 zKN^te`6_i5xK2Za_wL zgj~~z+#^&=y4})7k7cvkE?sIx^LW2KJn3#C-5pITaC3pLMo1Z)jSa~W7d$U2q}&t* zjJ%djQhDz8D+p%5SneTEUBEzrGxBbr6hKYPw!wBYvE*?3esjvDKBGh*7cQRq2IFaYa6z9Iw2<`4{gD<{2!p{-94&H|3{JH*!jmgPlV!ukb?YTqBcH(62 zJ$I~zWP;Ka?PqC%g^U#kwZHR_Voe7q4j!Z~syS9X3@PMxTk!=ph=$0S~im11VAe5GWN?)0KUVf zv8~KzAOd^^SLF65{K3BKr#9(lBFQ-3_qng8vM`*kuMMql(pI;!HkP^}@IiJ)(yE(K z!YzB<&`{ohyli+U@n9vnYnHrB*kT|m7e2pJHFLfp#Kr!_=t#ni4|0hXA1-xLfOUIPKx?R59f_>7lF-sZmF;jbj4y&;rc)`!TTZRaNB_s3N z)c&F=caVUB`ZwP>iD&$ZFoWY}%H5Det%LQ$&IeW7NW$%)RBCz)QAQveaT>oK zgW8sgN30PtAr-mL;NE>{$7u+w<5r!g>V19CGp9r4f{sPlyem~hjprDx=<3a!)#O@0 zs6sX~VxKf4tQ6q}(zZw)xrgl^>ke<(&@d1wUb=)*osFhs%axwQzq4sM_NLjv&4?;P z_3+m=O_Ry-rcbxFSYg0TJy>9g5<7btzJLtvdP}FU6H8?$hGqMZ4AYW2?O(0R_%$aY z0T1a{p4ZL~x3+K=%>s=L?zE~cf<18C6FX%mNEj=)O>|fwgwl3}ALJXSgI*I1I$pIv9TLqVp#;pPEI@JfJ8_q;NQ6EykWDGOI2%ZN^IlR|Kcs|-6(ge=O z`Of=%P+KP}gDqaoZD05Ur>Sfqj!{lopEjGew1n<`#Z#aTwVs>DV9pbY3W) zg)l5;XVM<+ulF)k=Xx~D8u}@3VW}cMn(}r19$WJo&gUrnWt@H*?3y3(KPnIHX%sOu z+W@~l0T7SFKN~VL+>HmSA*2}L_PktfWla_iU{%t5Kc0x;iLgWS7%UWQzrCpq?G&R& z^4fK1lywPZIGdlU=p^EE;`(OHuJ**`*1yC!wWG4#oi+=z-rC-g?8%VwYx;p^CBEeb z*;OK{lC53q66TFR7yw4Dfz)tCgDtH?Zh(=kb{jXS7g;rT*iUM~GRy2qu+|IV-T!tU zT>l@0Qoam!tJtCX0;=Cqr_NP563ROXVW)=d6CZMlPF7qN?CsvM_06bTfJ4%n>$ftN z8z_=FqQXuUsQ+^xwJPeBE8`Y>*-G-gem4tb^J^RqaQ=T$Am#Du^;2Vi2^^UTnJ&_4 zEL0i&PL*knZcM_e`xxm9sy{B&{xwX$A=?plGyXI^qiZg&hfBosZ@tC*ZYz#BMZ+FM z6UzG;JvzkR=&I)B83aTPvC|&wvp9UTDFln32%TLhbe43!fl?#>t=21}tyfw`G%t&4RY~yC%H5m8PN_JOAvmFshSK-!TKfLv{IKK`ec%cG3kZj2kb?>*0?_>v za^ZRZf{M0NN&})&QWcm5ru>eE)#1*`hI=Un&v9(DGrPpTKe4F}=^&`a3_o0E3)40w zW#1(cw<d@|O>Ot-*LGh9073^i#pt_@ZY=LH8AJp%dWB95^;>%Bcf zf6-*kaGVn6Cjfg)1x8E_ZV19$LaB^v&K_D7#extEFd`Pp142^B1!NYsCoxA4;mEmN zg0h)j;DV(AQys@C1i}t|bfgDcMg-xo$FZfh87Xzpw5kcg`^cz7m&n?Y81BAUxyNy31Ue7v&uN*j$!>r{Q8YOI=&u|q_^?VUEq z^#K(@G!^C#fkyc-eLx`xJX%N$Y>nrkzoi9qWk>{znIdp{1%KFNSGFp`x&@^=i`eNW zS++Z_Uj81xxu+l4IcFt3O}I;lFb$+)n#G<3?%1Cz_aIPijb;-QVX)mtnv`3==AD!k zJ~i%lKfYf~kSSVD+1<4xqo$Pd)*UMTB!x}0VLDlG{R1h2Rh(D=1K@G+`O(OaaAdKNhKru&Mjh-TM#0Bt<>vFQY_RY=?bBh_ z0c;@L{Pe4Hc0dj--%bVPIBJPObg0Qw9v2*O!<0$k>Gv%r+Oom3cx`Wf4@|-xO>AcN z+Y5cNOHcAzmy=0-C{!HhU)kh{RS()~8av`Fs?q8OM^y8=`}n`HR~Eh+5B! z^!d6G7tV(Lwm;Lj@?&JTdk(fPK6xo+7_WQ#0%D&Z*-9msO|3*7PB`z-K*mK&V8(RM z+_WRavdCNR?)sJ=dsb78_dI-bXhy+n5B*Sb!t*bbmHyf!^XB#8I_>|2|7GpCT-er@k zf`pm5DxVgsq=N4`v>H2It6a%Dr`JHvq`~eHv3>l+J)iLXUocG8c{8Pw5?AdqtsIUNv?k-Br zp++0FT$N@3isx`5qM`kVqnTOTS7+bD#w>0VR2uhm<4W8bz@FWl^;Ng6^igp5QZ^f8rgRrIqo+#W^ETX{TLZ#8E4nP8s6dC+r7GsG4}bmXKan# zmDiI|ZWNZ=>#G^7tN`^Bv@;5;Pf^daoVnMh;4EaDU&TnG|85G&YY05#` zxA~n|$V<$|Hfi#fxZ;&P4f*`F$rZ~IShj-%4H9|gwze`Q(}J{R!gIwK5BnZ5dpz_I+=*5q4sb+onl2@1{TXud;Uu2bBT3$xqctXpx|^fnAzb3QYJ}uD*_9^qahK zG(Xj7k@91H2S1MEs*iU^5_wbOe3dF1`!QF^4HKDKqwRMPJ{}+g&6BAiEhu2l_pScN z4qampuTZ=BOd!CQZ8}zFt!HJ#^F-roDSqrKk{xHLLyW)eIQtGp%I2t%{?b ze%pX`wlQ^N7}v#<4w)Y@r7i~5ff8ZDHp>x*><0~1ghcKFT}^$j3-V}=vc#VGtb1Wv zn7}_`vzWU<9MSx2B(42sk_5J;q(K|brssI0THbIrDOcDkwJ=1mO!7T&P&HjL668(m z3$$m7-Tz-IZiJtKoJ7ti=`&jaOiMB-0DJAyyx!r!o^7B_^3p@7P#&o&<9=e-&*7*j zvnrCQF!qJeXxO~dHw83poNk|8coF}($ThI7m3{$TgzT;i3l->0X&bPdPvU}q@3R-P z_7^t{?JS}x+)!5ej>0<($p&>iya+OxVIBxc2oHEZN1V z3wQ~4O}43yRPEy4QSM^&>OGtNh-WhxK&P0K;9NnyY>!L@+aTxK?Y;IkSMF=bCKiE6 zWGa7tZ5AUl*v=H0jIluJATqeX@Xt@X*q5RH6vV?eH%6k9C3m7VEZv?I-dQ-=hAHRs zd!Cx!&;AVrsf=Na&*jdaV_S~GMhpTN3)25J1P@XSHHOHcWu|uB6xnrzc$IOWsZW5Q z_SlZB{mun=yAfE1+On)_kKhXxue~imM3OcHKzRD4In`R3nurZPUTBXzPLyOE8d8Cm zizlscdjpUdm!`zdEVZIMB({CP_t;nhyhCxw6|yO-#CO>hfUAIQy_^t6@$X_OkY-v= z?96z12lTfgV7I+?%ONCLIX32jxMy*F(fCuMDwf`o5L*R()=6>!`8PilzWRF&A@o|jld$-A+fxnpN!Ge*RW&`1$Q*r&<>8$T_>68YUwvw> z`nyG+e-9X7%r0c%m_u|u}Ll;pap)nOn1?E8%9}b zr*MF+J*g;9KtAF5<2I(-+hDr~HD_&%{iuP9k+3@&ussoeY%xx|jX@3BMfNHhwQ{+= zh~+`hq-KiwT;V{ptgzH3l>`kW+*_8bYQQ-!R+#^($_974YO$mJAmDlqB{DtVLEt>l znaJe4Di`dQS&LQdXfhH%F4JEW-8w4E*&_dFI+KQ|Q0%;x3_-=tI)y5o`NoPX@}mY_ zMKglJ0FjDYkjJwMb(0?KBn!72eJ%I{KB5uKp_;KT9P9y(pj_$FCH1aMs-|onaX8NoT>nqdpr?e zhxX8%)3Gf%03)AHj4*E;FIddW752lav>9sB?dIkE9bKwB?ZJzDq0u@?DB~sbRW@H} z*R90!Ub77kIsNKSN4rQIcLSvSx1cjiA$wO3vQqN9#xXJ7+uLu=xZOF9avO@MR zJWST^qT!}7=taxQQlvml!0M=C)?8Q0BO)3?%zU~ zKlG{Wv|IfgxvJv+ab%xI<)dSjU{|&9{K{-Y))AnEx~KBp2mg!Ni!IVr)YkFD%zgm` zQ-z^}P7w3Cbo>IP2$WrvTfF%R+q#wzVj{nTum7(ZlNP`D?#vZ z|Kcb;n%kbbTeAX3^Os}m$ctgVb?vrBD&P?-*=@~XJPZu!fL#GwFhrGlh>ZyKaWG

    j(YzY%_p6Gk@__ocKM$stR)_7T?S=I>mY4=j3A?(`o$Q9QT$CsY!uO*ulQzP@E?n z?0atKKBzC8GZaYSk&E+ZbG%q!O7~yn?BpCyJOkJ=BOmD#Sj8x+YRWWsg^u>f*HHyG z1D_HV%O;L-J4LS+*YP9NygD>C3I1^_o=KFn%TB^q zFYZDC;=J||R;lm$Vj$$dD`t<$W6!W-VsV(3iz4z!Co*MY=Q{p5u7kQl7>PWrlAgFJ zgSH0OG0bv3i*Znah=qP`8=HVBv@WEej~I`s`C3C180fuK+4EWM$@z`;cGlL{Q*_Zp z__Pc2yt4lR8Wbz41e0ojV_F*l-;UZ4WIoGNcu`;l2X(G;*5#`u6mDfaODKF+ftx0C z%(*p81+L(-eJnFrB3?tzY`fHNI|Ag;#CIX)&Mm@%xID;PMA6I3`|Zj;jK+RcHPy+= zJU_ZAT(sx5Jt~zu&~2iqNW^!)7mS*Jd;_!1#ki?OS&9|u6(riNJgr0;$uKKokS%HM z;~Kn;=17h1gRS&?1oP`K?MuFvI7r^-#!Iig9Gj%J_HxVQ>ie*|ap$r%kOejF(l}23 zJQ=dLb8w3ZQ9FR$r^c)&h@AjVMU%pn%0(Jpe(;4GWykzEDcV=Fz-YCN8)sR8@OrE1ifM-b`NzUHn7 znVie3?O3JN+^x^-x!6Ef{VESv(N5Div5@@?Cu6EYt#dh4feFAbrxZO_`>{U_Gx)&j7}+g$a73)rLGSjXZHM!RZkXW33r^>(MQ6$GqEq{e4;q zR9j)M3ywLl5hL5wOr$Xguh(dIDW2(IP1gdD&7WwJ*lgXgv^unzo+7;>)z|5-qU!aW4GqB8m5ZyEe+T*L3$ruFi^){A7ZRiw*Ge4sMV8_&;WA}S_ zRoDh~5JwSr;7~pQ0t#N}BkPSs@leG`fyXk}%J%aSw96`g(O`c@KFyYF!{Hy2SN!>lev`Pf~DqnLm8(Xpqq8IO?}{NfE5~181%eX48V#M zZ7Hh7_Rgn3PK8*VBIiZmJls;9`BeNO0=sdpDQPr8u#4+XQ(Pw^mYup2+k@r7bM2_L zd!wp}(-Wi)0cLS?!E%n&eMX+t?TcaUOYB8FpJ1Ia*6QgGSye}fSgsH4iJ(PPc`vYE z$55*n;>ja>`)TX)D1tj7dnX{IoG#b6FLDICkKz?e?Z|v)l|_jxv;pZljKVehgY6BZ z5zgNaT9Cy6QIV0DJ{bG8#@kA<9%nlP#3|Jfh7Py67@&GxGwDv5ZSO>%T?zcJF>9Aw zcN|FGc6v3^5t(93OImD-K~6erJEQ0?G0q6vZ^P#6(jH8q^a{~TspE_Kv`8mNYFk1K zYY!0Ly^a9)^pj(88PS1{?ZzNh*?unmNdtH0X;+|AjKTC|o{nv1$sF&+A@(Oh{A8RL zk!AgoYdP7D$2jx;V>RwZmIw1(*FEz8(Liyrmu5w3_O|5AvcQ0Wc1GwhRmdw5P$`6+ zlA2CZ`x(e5A^Gs_rF=a zmFZz-A4F72EC_2nm4G6DF7raApGY#y(fX+HB0WLUVKld~W zk#+C_Ut$RVZAT)p3z5QOSV*^dBgwtX^7I3^b|FpT{%Oi)qfs(TZS1}~S`}1Hb(m^1 z^EZ#IJ(i!lfouEP)$^8bQ2XHw=vmVy9J+PdK`=5+bVPLQ3mNMMlH7ST(j)BfHFoa` zKD2Tsf}CVCxPoU5C>cK}TRz-2wW5pz)t44`7eTXS#j7X;E0<4$u5litlYCwv)Hhyb zgPVAp4Z4k>`de48u@WLQR9B&-1Q!zF=_#K*6R}U5Ii-+2NQ!kE4>*PMYxHugDoSea zg%l0sd?;OrqV%Ie4Dou3Cc#+u&*Fp)j3-L2+8D<`zAVZUB)WI_;pxH*{k+4s^)aYi zWji;LT$Kd^^fMzk?GIqks12fGHMYWjD%7wbW7l#a^Nkc5*7lAy`7!LmIZjdG{EuV} z;>70zOLXf`e7>3nPHhFEaQU#?EH>ty zR&JaV(jWHDl5#{_RB9Ai`+!QN*I6;fo#vCSZkr@=g+mmI%a|wej)R6=T#yV2b-M@6 zQ8VGkdK(1xkmAZ|yv}ZktQldxjvYORUwAKTmw6^EN!Age-nmz1-w;}hCSkyEj`j9= zTPuSlDWU?v*P4hd6!u>1!AIA{mIo{5&wSH$5>8h<32rz(terO~kcN@bzUfaAR6dRK z-K;z=iD>~b@x*kb-OixM6*jmg0?PWFOWjxK=0#Md`I#=>C|lGT1{(qZdNe<_CO=~TO{8bzh8B@jyG&1QE65|(T>b9>Lf?_dn-7= z6iG>%b(AzKL9sXLj8)Rhcp2d0jMbcnAQiYcYLh3gR=c)~#14D;1(TSyGw&MfsPlWH zNuIKsmfI`KP+j7vi}@Ij`^0Nj+MK4=tS#uYG~svye~FG5K zr9A$ztq9WZm7t6Ojjzs{m8-0Tca-%g$k-+M;oHtIQXqTgf+`FMRyH)7D6lyvnuJgrXM_KXpVad(S>F^8`n)GnD zjYektv*6b1gw?DRB)iPMsHTQq$(IL_b0wZ(P#WR1>ALO5k<=S2D4J6C{X+?f=a9r? z?G$(!B+sDK^)gYV)HQlBnJkaeU8_$ubt#Zqypu?w3f(-!?JW(dpH} z2@u2b{U7D?CKoncY5v$=yHmQ(b-d+R!hzvI)r-jL@uoCXQfoj6+t82$fT}p|lruTs zwvXYpT|+d+gyYf7PT=$7DtOiR+Jxm6N^y_SI7Y4Q!Rt>JN#O+G$yqjyND^Ucbf)rH za9I*rD#hHR&Fj55@)xn7)+UZ7m3AufihYR$Zc`GgLf754#!F$_goGS{_1o*PDlO5% zEz%OQLh#n1nSLAH3|hakm-zU3PbRZ4;Dc2yU6chS>S&MPwt_Che<-GPkX#xwCh>A$sj_YdA+b)s0s3Q^YVQFXt$ME+Y&pU7fIXcU@CjB&os)}S&Pw; zt8W+#yP%dU6^Zj{)Fy{mPKaWQxkXmhE8N}+X!n1q)5a^IO%q~lq^N2B z<-YYk=eI&z5}9^xfhZK}evc5_aEa@0Ai04~!R>ax`7|Tco<2@mbJ=hvUIHT;p>?BcD z<1&}K)%#!rsGH5N`Pj5+#d~Z9p%7bd$W9XYES~aj+SPnmg`p|{l{V5Q1B~Dz?S%x4 zt6?T0tXHxm_CcprkBveV3hZ}bgxi8f-HoV(l#reL+RdsRObnQG0a1As@`bi@a1i@q zsi6H8L^c%XqFEGqeFLH{=?p5R4A;{r?1CesdIov1CjA#+k{uckvB}N!^{?^ql`709 zfYH`dMB3+c+cIu}lVDlS#X4+?}=M_+tL7__F zO}s%WIZj=sF4qmiX;Z38_fZCMjq1r{w`3fzCmXX7K7sWC&Dbow%=vgb9#c79W+{%4 zPUL|Plh?G6c%W80QkG~V5^CZH-y(o}J7|B?NIM+Y<>*-&!{l?JqhO>%JCSjj5Tr(g z49I4mQ$bb6`)3?Xsm-gktr>(hQr-(>yGoq+P-jPScduRdoLz9w3cGxsTb;;6@x#ik z)mf+wuhNfYbqgpsN94-gD-({ij>kJHA33f`)`}5;paQH@nl)aL1cI921O>S{fd&-uL?Z1A z4ojt}Ar`<&E3}KN`v`{~Z>X{*Z4LHfwS+-9#K-QoV;ZeL+g9)H-y>cVTgHoq94mDm zzbuBlq=kjl$~zUCCsNX@b<{#>RrG6u$}tPWfV2~LEoNkn`42%qiL=MLx#Io~KZ^V% z(IdAW)%ufay`a8j^h0@R+wWzqey{=yiDlnJX>afJ)=Er5p>*ab-u;3M&O~$ZCL~$O zl0>^;ciO3HZ9~Z;2qtQSGd8SInMsorY&e_W(#~v&Buc=2k}u8kFkHb#nWK`JLZf#H zjVQ_T=%2SlaR!LmLWAuI&B3|QnfDI+CHtf{fL6YgZMYD1YsK&sL`7-nvLe6w`{1yq z?4PRr2_$&RH9pOZaEGQuh=v2wt;)tkql93p02%$Nywr=ODvRM|V>aj>wLII`-A8atlIM*!brdCXo41AnJc^d5V`iqlM@ z*D9Q)F~Qjjr9W1#&p=Z8Nk@`}H7a>jJyppbv)> z-0IrYFJK^x4TbrxF7y`EV<9 zgN;DRuF=XHex=y%@5iqUwkLJQBe46Nc!JBet%)?QAS|fhKfnX5hNK>Yaea?~y~+lA z+-!!bWI8=+Ht7cJZb6Xn{#q&QsEaCwatUI2L9!H`*;oe=Ta8wM~KL zAsb5ursdaztD;Evh-%HSa-H|Q)*!wLHJE%NFETXOZB^nB6?)9jI=EaxpX;mgS){dT z^ZF)BzGfFZcAH(a)Eo0nD+KTLw&u*?GQ=Pl;^N%7T0Fl-`{lei_hDJXu_RrZQn;e4 z*+yg=F+3A8X!_3qJuV_B`dAV4XuAV(a0Bnd^lQL(s$_FWlV>Myv($EQ)4eU#W?MgL+r^W955#XqxgP=b(^k@{OzwX z10Tb4%GNrl=3nIZ_}io|&8>tyBjWgu{uIa=oVT$L+b!u9>bhqGrUIHeIdxV>kWvKf zs+M9F5Z-1tpNCw!#4aYLnFrItlM~gF(K&yr8@pIAkPdiv=LSad)p2jAd8w}T6I4kA**s%!QR=Qk`-blbY)=*!q&B2^w&O<9OULRA$(mq~<-%@gHwRbLv?3g))<#A&kvI`M$!A4Eu(YNIx-J3>^`M?4b2EO3K1aE9MjXIjX|_4&8` zv6i3wtR>}q?ry^K^2$a1WV6iJiWT#s|06u*t=8{rmwXY=Yl5IDAI~NMJc#@;P+DyN@%% zhK|sY5*oTz%I*@6XTHLdQ8+gY z=ZIt$p*e^-X$SRK5Iu`Mbq9AhPOMKZs_`ouFdr2m#le~uUTA~4 zqf=kD=f(H$q6jiOX7|aZ9Wj~0ygTqvj%0M}o8FMIW&8>c8>N_KUX2}+SGp}eE4*sK zE4*!r_|MIq%RuL`YscHJS@i0{y3E)s9Vp86m>diAaGeTp%@Mem#kL%gX`OF}eUQo1 zxN$N=Yx%pdf;n<4qF-1&QCK~PA{P>c#W*%RK9jRLQjXT+VS*8Oqf3-BsP^+=Kf)MN z4UbY{x`VTNP0jW)VJ!r6TSKs{?Fq3|rxEKU>k0ZjEgM@c*I`;wkHHUGL7cFEYfeg5 zMfi6mQN%U&>D=y0U%WvpAlv2l*S}%%`s0^a=>nmr)GVet-Fn~kWF;Z+xnj@$0&{N1 za!s;Ln!xr0z#OdOOT1o@g=mQ)u$a(^N~QV24<(|LhLcMS7LfW^`+Ej54K|)|*A7a_ z864P%jtpbab#e>uT$)#>w*fnl60s&S0@q}+i6bsxxz2X!dSwVfvJwQH`g=bIUr>$p z>X4wSQ(`aNs?l4cF>4Ee1my%ESW>s790(v^2SVA%NI$jp08M zAst2+!S;DHHdB=@8-|) zpDDHW;0UUEExdE4Is8tKs7g<&H!hZe+@P32M z3pFK>)a^*BG0IO_`(5$vZ(sHGG~*UJuV6)oY`7TH!R( z?;^EDUg5JL_>_&+?<1nYu0QJ%s;=ZvYG7aQt4+#_*>i}ek+ZMkx6b#BlLkAHc3VBq zmNSeH;y(m}DB~2DK5YP3sp792>!ndD=qK@(|3RH9u@cAFJUtW8q0pKx?4n8yTA;D|@LMIo+saVR`;Y!+5vF{earg8VZCZ0iQsUZPzyFV)Vq11vBO z`pW6VbTY^;ZC1l?S=+(7wayv)>35#gtt^*_6u%zm9=lO!*>vW>44NrsTg zab)@jI!_LF6IIfLrdIT-Du%4zLZwK^+fXU`K`GV5U9as-Vz@aDdzMyBM61S$XqB?a zGq>MgW#1w;M^ruxRoK4oZXDdW;s8iu%z}bk*D5;!RHE5)&%yY`YsgNhr_bQkFiLBg zFvRc8M#S> z3+}cGJ}1Uq{;x|*{2Y7~US0z0Hz>mMetg&QEN#M44Xa5`q0^>+@d92NK)BugK~-rlGX`n3uT)5L*-~~!g4A#{dpKQ z*1`C(Q?uM9%{}NyyS}~&J_Wf&+gk72MyxQ1D-edhFj*aab^Hbs)!QwW<(c-p$9-Ye za)v9+*a8gA3skc%#BBf0A|W)p7)YIf3p66b1!9Lv(7vCtK$_Qn-rmSHHMa5M!)!8~ zg<7sq*ZF6Mawy8>#c%}gm@Qx`GTzexf1utw1S<;e1nwz7JZ zj-aYY7VPgtJkbHjq)Ru%f-yd5D<=O>Rp4(;Fsn~gd@Ykgv=j5ONw9|=M-R<{^3F?< zKx5|>@PukCto4&##p6&DhqEbq;8duY+{|bHkba$te&$&|l+~b=hEV_`__pC&?%6B+iND4L?U1ns>k z+Qjb7Z{|xx0HPm4Hl)mc)Y|1$(l3iyns2PuoQF|1R0Ln9S1O^c(mk5dYcn&+G&!a` zIQi^>&de6(sHgkiZ-~{Aaehdgvk6-=n#aGMvRRxSACD;+i}o}o?b-=apOut`H-~IZ z7M`$(2Y=nOJ8Q+YUVlkZ?y|N1q>R6s1EO4k&exm10QCKF%GVwn13FaQq|BY zk5uC$xXiiP4-?Kq{mZC=V$b%*T+VI-y+7-i&d0wxycH&oEJyaV^T&a7<2^)HMASHvfMxBwsr>D+`J5>~tj;S9Ai zTNp=>C)w5Ix#2G7k}wXEFhw5n#HY4Z=N( z?_JR+R_|83Gf>MwtX{(QYreWq!?S&McPI4{7XV+kcK}bG;vmGiNc{v+wO9#$vM$!*7z8ykzz;2;sE?N1is{M^ zi|6JntOJ#59Gpv((44*xyb(_qRQE$*ox{rieZlcnxzC zQRXR8X)Z{+67;A;(3*vOyg`OA2|qGkzRDH#9&@e=Y{Ml}>cIGFl+;lU!m7SO5Was)Sk5o6(BFy&2HHMVq(?Oukpfo}Iha5{B)orZI7g&{bsqx6G zUIp~W+@ufskygllH_JZKI!cGglIwTcx>`G^)qdbW#(#j-X2bouRsu05@UvBMk(@=A zQfxn)OZ82x{xzC5{2GtVd-Rxs-j0{wed0UV5w1=FV_B)48T03x-iZ1=?NxGJZ`V2n--sCnb%wkn2g~l4JGi}F)Sv<)>|HK~W zY!&qaDKHJJ3FRJ+>49;e-V2Cwg>H~Rau zy9D*2aBRngn;PdsdiexE zMAew$;%Eipy{cx9&mq_Yp><#-J`LJf0t!NlCw!}1@db}UH)XHVy$TxwY?sb=1B>hE z(!FOC;R6rh%Wppz)b~lvF8P)yViU;r3Ml>&PY=R4R$@ep>`$IKu$6JI4a>O~O{RcC z8?n)d#z)oK4-*$uxG50bsa(&G$wVX(h*vdMxG4z5fU7l#?KaADUX$*Ok-h8^WEo6S z==cPK6ky6H8bxp)0)zM|_R=CFJZcS$S!5t-h`;AL5@-CvNNf#cXjN;fZKU1iuh`5n#8L}w8m5#F$lJ^wOn7ML;`giL z&spN06?WJ>m;j^ec!lBp=&w!51$vQi1K#()#DpJ$w*C!W3)cHFF@AIw_xsiYev}f{ z0o0|=z|-upp?DODBqTe3sC>x_OyXM0BuN6-Jmbh4SJozHGTs)a30(&q%4SCqIf;L3 zgB+r{D$W#Njy_@i3fG2`L$=tEP{xYd>gSUvJ+wL$0~=93Ux+{nP^w- zm5?UrJ#LoUE#q#B^Ejftx!WbwkGn!ly$=oA4;!M97+?#!ymbK(pB}J3A zJ-#HUElI#mV-yn9r^NRtY_2CZ?L%DOB9)#jihqwToy&-#l|8#G^3wMB%a-`*Wp)lA z1AVG$7CCa5otrNoeAmZ$w*)A&+-TqKQ_K^~VLvrcDaSBnJ8c1CzyV(c0D6BFUZ!zkmdm`9X-uE{43_GCweI1Ci(KC2|O zT`errDN|^Q58+HjGEdj?MilE?K>ZQUPx!6v?EQ)RR721Rkdg7WtQ{KjLx+Sq;A+N> z@<%bvs?yxF>7Wj%tfnab!*(?_Vm~%wAQobyQ^;r{h6&P|zx%bwjyI!XUq28gFc`fD zCbiv5`G8=RRb99*3u?Ygp#uNEsP4ZB7cf_+yv{`>C-f$3@xKwQb`d{{ zG8F@%EoGU{IMof@QhJ{q6U%b4$Mz6%&+c7kWe$mXcPIo|G#OjnmB0pEh!^~@8b~UQ zLUv-Co^0YC4VJNfTaW^R!ew=EEIGTk%RY0MLY!ZVMA7Hb{~up(9v^jm?f=hYorHu; zkYy4Oh9H_C;DDeLKp1cfxDB`kTo_PmKx>1o8m!BJS_AFX0hh+5I?&pN>a{_;MC~%6 zi?P-=wzZ8~b%<5bE(Yx~;&Q&v*ZVVx^xoh7Js$V3UYUG8=W~|Vd7X_0!@;0*x!y;i zL&WYSDf?B*3Ls11nFv}J!!o{Zr*_#=m|Y3vLNCNyXad+4XZ>Q>ikR&izL%X~BrB(h zz6IlKJLz5&N?@2kMQ%Q7Bt$`8||!BK*N$oK*8VabczKR z$j}t+OQ|=q(v?>_r<2zmXFs5YV1$m+yD2RlmH9&c> zG?qX2x*;t;;mxfCQ4%@3(}#|h*~S)2wK^l~A7Wx8wt93_C6?nPw+_6Go+gHpkvK|j ze*RcS!!%9Etd$qMjpy8k$m@8C@mZSzE|SnHW&uKixgX!+$jr+qmTH$!3A9zeqw`ou zg`m2Vj?Qzz{&e+R+>Z*CS#yE)^Bf+h>11*lUn~gG&}V^8iga$W;bLuZ!%ACD4nT$?PS%i=0|OsoV#x+41$wD}9cWIweA=Zz3TrC2n#uCnWWGQTDX8#m)f6 zc(`X0bjm3 z&DnD{cb47MX5#~7MeHCwJZI!WqZG@VaqQ$Y+5te7Gh`**c3*6-{XKw*P#YZ;*gw!- zZ*QU6yv_&U_H)ArHDl?J^jKbfqPnrj7LLcU({-i8q8kbavEeUfOZ^Y?pZLeq`(j0B zRNZ>Ax88=%A=}h%ul4b;VS72FF4AH?5liTNR?$ba{WtFNWBVtnZlB;Uf5_)eP)St$ z4fD_w^?gUffjFKP)=(~D_BSE!zeDPCghnyE?bs)JSPqENA6gUobTu|7vz7IFallUWq=tNPTH_IUwYt(bUeXpG*m zND1EB@c{?b?%~s*LHu@_w*!;&pYHzIG~T2_OE7``XL_(-Z6XxmY}Oz{#^p3`r`J`|q2;(0qU z+hmglY@%18R$c7dyzbXjNrV#%h-1HyqaO*pXbumob=c$Tl0Mv0nQaKNIH(|wz+TC0 zRYPVd*@K-B+wq$VT)g=`B=!GroOXzSbX9c7cd82XCT#um8n~)&wAm?n$9dQ;k{?_r zeB@4Vu_0Qde+q-H#am1x1YBF@_DOUb@FVU@>S0>W`w!$wyL| ze?9|5d$ygu{S-nHt{x=+SrgMrmrz*I#M~jmwxE^P(XYYRS>VH4sb7yx14I%Ws6!-U zW{c){g$JVr+TLnY@5ieLN0KU=`7tV`Vezi@kW4>3h}Cz?J(lq=LT=O-?^%$OaUJ^p zV9-YN`#`DWN$-UaDa=QVE4od=`ZjVb4thMXD<65?zk**F3rSqMZ=u?%l!?<`ubC+VUTeUhl=Bu|? zL(+lu%C3U;8mZD1$dy|=QJ>M-QcSY+o(;CzW!YXPHsrG(ZH0!T2q#-pA0n!la#iS( zsDu^Lu*Ti?B*jg#0jw14CQGAE6&P*)7c&-KzW8-ESRA|53d;bPMBc_qo9Gz-Gwl2g zIOMCzW#^L*ewLP2vOACQA8EI*p#tDvELM3kb7!Z0T7l+9b({SZl-9PFsUPy(v|P|z zN#4Jh4d))`FG)=%9#w?0UeTUA1{q}pCl2hu$7^aM!t+j53`%$OZVv!NUPev#flsK} z^IP}hn9c~={JsRT%E~Wwsl59`g=PWWuh_dy!C2PDYthHkq*D3b$QDul^?W*Q_P4$! z{t6j5CCV3a9IK-9u7&Ibr0aEngq&jv!gOa}dWP6y>)m2N$J87Rw>HA@{uiWClSldv zS3#{6TzM7|=)`9NP3nO@Q=nJ_LFl@^n#na)AW&jc^w#- zF15WPDdIU-9l2OorW_ix5X~K#-WvpO$fd%WJUM-Uw-Nrs5Uh3MWhHb8|;3E`DUiK7A&_wquuGU0usw_VBuTK z_?P&m^ZF}y=0yIy_5XW@d*y%r4Min4>Y#i}tJJB2&S=<)NUMg6#(gR%hi=izl~ z_EHacos3BOaljW*9ZA%7DKTt43mGGmA0|Hx;3}%=SS*y%{aGrpBV;SY_P5zs-e|uy zGdiZ*XQ0EMK|iM9`C^qG`riT}sg*1mjgKd-44(|3e0{K*H~A$=(eb*UTZlz1knjj~ z1Q37y8vYGDA3W%#KWG$`7|BH{QBlRUG)jVp3l?X3fv1-4Vv!fo^K6pGB9h0LmA~li z^*G+PFm$;}z^su1!YOt(}wCT<$8mU?(p61-E1@owlg=#{{P3v6|X*2Sm zhvYj;Xwsov(n0<$=iGvG4l8S6XOm+5QZ!)Bpfw>4gm+jbrXc+rYVdctiqgEalh{;A zY=m4-C6(*66)_Lqga0`af9SVEy#dz1y;jm@HKMf$)%c$YQ5!ui+HOyTZ7|ArRFW42 z^`U6*_nLJb;RJ_cIvZuYke|9lgY!tPk2lJOR6lfyCeBB<;wo%R(uq&l@i(lStS0b1 zjS4IsN<^k;<7S*>^S^!99Ao2wv6Pm4?tszlylG`^hQuZ4O13eNVn0v7@m!@J&rAag zRJdI8!anD7#^D}|kW{VaGfRNDBQsWeDtcj+WnK@1Ga=J$Y4mIAEX?|?z8Z+L`fj_Xfe&&u1&21| zF^$+Us-7S5FK1nwTXpxDpw)uio1jjVHx-IF*RngU&2!uCo=Y_sunEC$BjS`{E9{U6 z6l;<%{bgR|NL~miJPKy46v0(dOfMk|Dz}N`oOLe2Wak~DKV@$NAMuYQyj}aUB%U{e zIVy4|vh8l1+jbZ8w%rvxu$Xl8(_MFW@COd?yX97)dF6eoAH12e?I{IYP@YWsB;G8Q zC4E+N$InO=vhhS&O<2%n63;o77!#3eCBm$Hn+P+X-dq+MM{O_gPnd<+j5G1UMZL82 z9bD_B(3n@^@qM=0o7!&RzvoE`+C;ZjIaYj*j|8bpqq3*spg^DIA0;NL$hMWQvcJy5 zN(S5n*i6u48Fk(wuH+g_t_+`ZIx6MWn+kP>`%>6w>H{@Cd;S-t$KJTe z2W5J9ez@mBifya#2^#IeCluLXgZuc&XQ*)I&>d1pE=RW{y7}}=W0rM&P+Z(@1uxnh z2A4G2!{2zwN?L5xdB>Q)orFkbsgVrBk>4XR8d53tvJW4P&`V+LZsIYXq$U!<)E~D; z4i%%67O8|%j^1Kt_w#1)2pzc$(aKZK_ykk`EGc!p9SwF3pe7>zTU*#_?Tckz+QX8J z2WQ!G=uc7`O3Bg6x3geZHTF#0lF-tJ4{WvWWA&3<`dydl5q9$$5J$mcFfB_TDuBCZ z;x9a5fbw~d8Ci?AK}1!idH5}8K%Xv!9?#o7V{3+vx-dqY&JYIAA`_*JIlw@zjsg+% z9^ofWB4u)ff3Hia`_^Ma`L@cjwaExsXTbj1ZfD^R$fy58rL@s-_}HpfLQ3J2-?#sY zSv}2AVZ=pao1~S@Q*dfdcnX_w#J|P|08p4sl6(NQ!3P zb{o-Zp#<*(Qw0HWcElHkixSWAdIvpT1s#1(WPfeuqYv=^E7qlzk3?PEo;6tVe<7-@ zPacwQTPob9z;-gv7P12=`!LzY-%6Uz$2#ZW6aO0(ooGja-a3%hw4}oxO#@mP=GQCm|~(=Nu*i~wU%)V|FUuBg2X53?_u9}#_3 z5FbaP6WIc?x&uiFA<(An?7cR2r&m0>m>>E)PmB)JX3?}$3<+OAp~P$6Ks1`~1R1H@ z0Ky_+f1@j?kN3_hJ#wbkg!gU7`!;9oYY;W~l&{#cL?kcDHq={TE2`9|^r$p#OTBX( z0PR8Y)d~?Nld`*gbkuEpoqEDnYx!IQc|MtSj+gZJ6KIcUumkxD(%Zi+wD2mDqld2g z7Ec7ZJ;=~zE#y0oowu_oz%T;WRkYH`U4+wAB-=p(q0H;HoRP}>G#IFj#aRNrngp|j zdp6mKrLYb*k;Q4>{yM8NLx2tp>q5H$OH#M4l4LH6+Kjd|lKQ(`YiF18c_)fi>yF^e zb0|!&e)eOn_r8~|xHS06IU?65R*o)d)qVqsEW}DO5SGa6SOD2yR}A> zK{w@{s@C2xa(P#Bxg0Uw&U>aj9pT=kZP=GUJYVWnfIb>tIN>~wN+75cVOmE}$E(@F zQgeD4Sb~Om2GKkX44t52<3B=(CNxV-9_sS)Q$O>rku{*e0X($QpZak)uH8CtW364| zerDxrX`ZTvhi8Sx&Mx53US}(PHu@9$BJoKyp5IzE+3CvE7onDltl{ATNPaYFIQPLo z>Qv^c0=MIRX%DmN%?T~v;dV%5azmoYve?UYDIyZuPPrX>`7VtCmGMSq?C40_@*YRdJ>fPvNG)<4X{p?>Qc_5moi4&j zY0bMn#9d5ZKrqY~+%L6&2DY2<95qRR(R+m7k1dzA+vGNaB*nWhl)*d_Q4~5n!_QcX z-T4xSPGQf`F^U^-tt^L8N4Ijp3Z*wK&?`-`p779etEo*PP6#*>Q*AKXj`l;rwAdDu zhw!W$iYGvBO@d`vibE&Ty_{lINLDs=I91mHTg>uem1O2`?} zn0h-zM+N>$|MC)~GJH`$`@MPpMOuJ1(*8Ke-{vZxz|Y(KSOi%noJzfhbsbHoW|jh? ztm|$bFdHADIYqOup4vvjvqXS)?ffSA=h)TOT*I?pfacD3xlXTL=y34LeA|`c(?JtS zt7-z8-6B3sYOq5b;qpDJ!22B3ah0$y`srv;box1BBs5-|r-Gdn3vCN>bXs<3j5>8S z(`&?Cux_J^P`03_8+UwWk41O3;TG!D55QCrx?=%XzURVME*wJK?}~AWqF#S(0`67f zb}-!y!;O*8EZSUVRxrtx>2}_FArTPz~wzu70O**~# z=P(?+z|ek@D=_-{C( zt-F8;Wp+)=DEUwGrYd7oDkL+IsZ-s>AdyEAK(o?sMqoe$9Vd&TR_kRJlUe4b~N zBPs#L^jiQwH15y%p%eI8%%=fZ-&fdvEZFNKEFbFdA-=gie^a!B%>a+zv0;mquW1a0 ziBb)=Bkz*ZJ~VD*AAkl3^Dcg5HET{#8VC3IF>ea;cDrz+byD@TKqD@7v7J1$ZssZr z14{N~_`njMWo&(LP)_dvy!PZp+JC^l- z!ofD1Cb{`Dz@KtHNt>UK+Xpk=X@fEnq8Y=Z>bc@rv)!h)Mo98E<%s6<@ug$u;?4nx zqtF6!igEVGAt>~ucNiwZli-f3T|13Iq3u8C zb8)X(9tn|wh3@L-FQ~R1CcJT<48wXX5cMfh-H!uDf-P9**;(>+brAp2%T?Krg&9xO zmKkhYF|P~A+$(22=TW;~Yv%5x8Zr-Ot!(vjP$CPmv|J+YS|NtKwcD>S>XN*tPC8G$ z%7U&$KAcBfXjl7@obDzcr7FT)9_VyG0rCt2dbX`Qi;)*tI@8u{*QISv%9@iz-BR$y zi)P2QdjP>X?-1Ah`s?k?48o7vSxkS?ZXA*G{#8u-{yyj9W0if~*P77ad}Y2Ng7x#k zXaJHfpdILcX;*IX0gb>B^#`b@7`?`2vymiVKgn*yGQ$LkM^LTEP?~D>I;TC(O(h4> zWEec3-JNTWgSx+AQv+d7PG?p(yH?_e#j)^%c2LaYFBF2ASn}a@iKjF6blQn&xRc-^ ziRlGxP@%B7q@QhcnCNAsfNY$le~?eiz?+m`=emBC;cZ6SG3j>lQRuLQZBdA$g%8c1 zY7@fZheHER0Bid9{1Mt{e#5&GI4%ZjAhMl(8&ddM7#(ob#nLAVkIT@cW(3>f-1vb^ zi0={^v_H6W(FxL!5A4h!oC2!EYMTA67A7f1M!T&Xgqj0;k&d~Im~q?WrVpClt6z9@f@6=SuBQK$1CTUxA~`2f%UX4ZNz3>?IV!X@|j zk}$hdM;e0o3%dTwEEMY#j2c|B9gZtW@b*5SYjv25s*jbPx2CMH9mhInA&&Jpa))N_ z`|(fxX!>6rEYU~o9@2F#{&+hc9tj5Adb1pLWd*F8S zU6%00Khu}8qTWGmRb9-J{v=}yo9(_dez?@GN#ZjDlp(vk?y#_k1y`aTGn_};==cB^ zf28JFUVjqL`9-`JnzmD8_<%b|1~=Z=rpqjClViArmobE0uwgWW0KFpEcD>z9mY$}D z`mUWzmpIoa_=;9S%IK@uFaeTj1;yn3Y?epq9t^-HYcc?b?+OKK%`YS!@hye1%T^-_iH zxjv@8V>U5p@luhE8XWPC6&5iQP#(G1n+f-y_xcJ!y4i-J4jt$kh_z0wWzwh_kzG)C6pK;A@EBpA%8VDNIDVIOi)^-vc zT<1?cd(|Dba9*E(UA-3{Hk!1fJ592~a@M_|P<&bi{O#qByr*Gh&h>;nAQOtT9-nTNS zrpd=rJZw-Nf8qh`;HPBzT;ZXNlS0LYBV|^1iVMYX6`n$bj8@u9uKahs z&yL%-4sAZhF(H4j!=EwvXD`z^#BN(>*%kaWj{m!SL`B9+Jvm*7G^4~nwt8B3wvQLR zGlS!=w0qM$*htd0m3fvLaw*LR6-!B5U{uT!`y<=tfSU`nx?`0xX_l~6UnyHqi{QUq z#odC$EZoOb?V@4(d{oH7reYDIs;;iLHApQ52zsCQXEZx&{VLx)XTOh8DRdJ7$hvwP zj_&zc)M(umPc67Sg~k4IHHo zSZoxrzj_@%_MrVBNfK~@k7{X82m5T?QQSLh(?+{-G>w%L z8f*(PA|0aHo)Ce}J-E7-U%A5%KWqLYY-Jrkb>weRm51=H**1Z43)4OyDQqgYmKPMvmR@J ziu)K@#QFKVZDd@d@#Um_vsL27`BXKbz5ld10IBu(&t1xGFa>;1Aecq*CW^t;wj!SM z7>UF6AkO_D2NqlmbH%(pY?Juy1@uY5H|3Bvcz*BX9=43LS7??HKsowVr8dO+2CsLl zOeOc9>8rW!?bWIqJWzm^Vq`~AQ`J$h>!mD8an$5Z<~PRX^`()Uv=2>M-!GL)?Op5axm*uMY#^<9Z z&@J9hj)+XEYfBiMz9zM_5gqxRTPMCj>%`HN#s=0*sf>KP{aOsx4S4Afh)11dIT@6p zh$a?}=ILPhH7j735l=6$7R^UMt0f=+dNrNT;S9cbd8f49#!zyWd`vvr_!4@%&)PedanF-{|!h62` zLYdpW5TC1M9C(~2hrt5If|3qr~sCdIeklLW#cr`hUuEknj^B&b^K!#$MePO zfGMH9wun`I*2D^wpG?NTsRYvKJm@%B?S308ilEeL0VyQOr}&hmmpE44zkRoA#;%@@ zIH-vg)wMPyP@1>+_usa%bW>`WE5MvS;T{<9sH?zAfxbseQO#Rhcp1xqxc+lD-hj=*QVPjxV@DzF64g zT0G8Yamd#&BCEb0Z5J4=D(g{UR@JTo?G#Ve65cpT@kO3}DTrN~AV06Lmt**qQFe4V zZM6(%!t<)3PLu*7n`|e=(m$I6euZ^R#_bM1I@u52bn#V?L*2V#R z5Gv%ImisPJ+lT5DpbN#=8ivL@mvx&TU-ENw7_L|AOD5O1H__1jBdeN)0PomE%Gcl4 zYM0XWL6x&v)129Q1Y4%i_)C8DLMz^@rJ5gvHqgqgg+JbcFcGH*csMGdA<^KZt@dc>IgFai4wT!!vJC!CcqD~U{ zI6UioIU+4o7LrQxoFn+B*&OHa_^D?R|7<7#-g}Zx?#18~>FhxI*UiB>6i0 zBN82le<-yQr~tCWeNb?;8!fg2eW0)_bok^8WVX0rFKCanYd6}-s{k8}h0H*iv{C#l zDN0ynnm1yZi1oMu2=(>MiqY^QC&L;02&FY!9+YlSPC2#57Hw*?f;m)-Su^PtKcg3e z+dDUa2h|4-AUrEyI8*HWKGHkTj(69Z?BG86m+44hn-VvKT5R)MY<9p-VP=A^1)73^ z%o3cJ9^qm}qg7)iHA@}3g?}TfdYW%HQG57ZIpin=Cd=jmx#I!WgupjLr!ZE9XSsF! zk#Y7Tml|DtWvLI3ze)P70i##6qHMAHtzbxY!631rY_;`tWe8NIsGx>pN7{j22twEM z6i>JVH2<4XLSPI%m)G&remhd_&4eFHBc(08rrR_ zVHOqFgbJQ*qhDTM9|D@h)Zd_W^A6 z7S}7-?75Wl28mHb?D6&&?fi53!vbKPhhf+{zr&Vitu$$;@rv_Vd5x+-84->S=|`t8 zCKxepN-WxhGPr9EXv+y`%WO!I%Tx9f)juj*C~`GUK4*_E?bDg9^deNs%s zGKFXp^LUU5zRl`Kp=&xV6(@2l%NJ3yV!I}6k2cY`KvlZa%F%%?-n*_#%u#|5^e@_LKDJ|Y zw%f_o;SbL12p3x+gbZ*Rz<+Qj!@89Om&Q=m&0`h28J%BR zB`D{wQX?t=Y?lEK1DCXQjD(_rSDDO$ewdCWnnJpMraTVEP@il5zfL>I=csn9UAK@V zHlkZ%63J1rD=ElVCJ_;?eVew!qII;}}_W#(CpWH4y|D0D*k|bi7V>z~nVY3EA5oEoI5`7GK%;psLD0UEVh~SxmdE{CXS&NCB{Ka$ zD_*K8F=D(U)ss0HO;K{-uhz~?HRXO6Q}92_yQ4Mh!Lgr3BR)h`{=rNCfps#?1R-vp zgzPpc1+kMR{J&d6)D~t3-7I6qu6Is5`o?BEQpyKPNv7498$fy2W%(puZ=s$D#|%@(GzqHc9irx* zoHEQ|LOL8`x(+r1P8#PCa+T`>MW~9_gq6I6&-qA9PLx={(s>-$4`iO$QhCiNnbxm{ z;m!=~=zP|E9q;X=vnyLvYR&KtegKj@xxniF2&4agO1c}aA`tq22Z97$}zzjX-EwOEBtk#*YxjP zhlwYNzJGAxrC^ZL`9*e$$uO>mi7(kIhG@tlk5rxMlo zW%KP)1f)_?XA-JN0xa#)gpc#Cp_ZT%RBx>f@L| zS}b#nXpjNDhPzragp}twlOvJ`yR|%&xEwy$`CyL~-(X3a$L`%M=!^4l{^dB|XTgzF62|jVfHiX zs$ieEV6W@S%j}paLJ$ga(>Hs`$Kp>AXvSl`Rm6eM9I)+`uVtcymPX#>7O3Zdr zgRoTFB@p+>On|=S{(S?T(54}+xkCtrq9D%p_45P8+fghLJrvLYMp4i;%G_?H zah*=OofXd5KeGC3$YwE>EEM@NDHuQT7v*3G>MX(^g0e7!0VtPRXGR9BreASCl4?Uz z;Ogj_Ts8UdPN>3#1pXL8+BA%a!T=&NkAQe)%~ZO)^|G3Ppmm=c8hFY%tv~T;wnhMgAp!5(Ek;!P~$9#i9o> zKyG0F`#3q5hg6{=BqEiqu?U%&lhg{3wMvcJiE^Q@y}yq?HTqx<=%+!%|E~38N9%dQ zhb?O*g9w^SC160u0v(F91fNSSlj>*(QQMS0qP>_2Z4>&Y+hQQ!zCIM}5Oxf;I$Xg< zmwZjuZERn+GHQjdJ3+Ca_1-qN1&tu|eZ|W^gdAV8tNeCJ0e%d1x&Ut@fX^+1}C zm-X9CO65;L%HUZEWxYK2)glfb(B-%e(~_C9(b_55Hn(%0V?B_ZGdz(j&Chpv*DLYd zXNd`^g)q$abgfiu+1uel&-%J3!g)O~H&V_L&u85tj zGGWFh?P$Z9*70|Wti!cCs5n@H$O_i&0$FM?X1l4$=E!Z!E)dsxkt?oX zt`rS$sEZr%Y$xPAgcVJ)AvDRwxh=i8*HA1)H82pd)j3M0)$||zmSA^6)OK{BL={d@ z!D|1Xp3=VK28FnSTwy`KnDt15UF>39(nlVy_Q9Kxji1KUQM&tmtD319Dy^}eY1q`b zPaD;y2sCJrhzER5u?^XrPjKtAu8dvQP87>96yyXnNnL6}m%3|Jne7K-9tIUc3yu0r zNKo!B2%=yG$Oh6=3sk&y{&(Wx0;qDaH?tbVW{}MoE(*bfNIGrW?)*>tT2yx{9wSvz z-<0Zs{GZBO*hLdn5*{0Eil_K7umE7}RVFBNxT|xiGc19X_aP++y_heNN8WoFd{=ul z%O`aiK8cq1lCO=+ugZRC63cDF-Z}s#XIbc9z^?+jXXdMam*tUBAv85^hgEV2OSj|@ zOu$uizWC`zfT5BOqQU==lPH1hth3+x>@$vLru2ucsZXPd!Xe44C!X29gd}3te^RoA zJcZ7@npR|Uvd0i1wyz5jGpc+CpxLKapJI&=9{YO50T zK0?3#8zGF}MD1}C>{?)mFWPBWZM43%F!(^Hb^Pb2L*rkZ;`i$WogM@LX!(1YqT6V@ zs~st-9QLrNqA1SWD{kPa=Hb30G>BB}wfTE?@V6@G@Bl@&+0{;IG_v9pPL$rt4b(eg z5}`2WxLKiO+V;fhq~$b@#0)qKZ0XKy6K0a_9Zr0Ek-{UR%9?-Akun9P*)GJn26bh^ zxM#3=s-us0{bR69!ymsS49ue5Ol*rQtJ@ox99k2%qJetGyb1peC%G23z%tcq^clBN z1WLEzf>gTum6{-T@=({RrlJgQq+5t}zxLIz1ZlB7JpgBRr<)gc@}ja183N4iuBH(43?;(c>K<@WoHNF|cyF~-aCu0ueVJ2Z)8 zI-m%0pl7z#RB8hCi*ifxLB|ka{SE7UUbnjTbG~DL%ULML_qhNJvw$z7vT_${)es5- zzn^*jom~mp+kcBpqho)4hnhq0y3v;ipB>*a3 z;E!r;=TMNJ$~Fn={5a|SHVHKp_h%^Oh#e^>zYvVPd#GhydtJp5mE@Y0-ZHyvqi4w_ zyu(L%6W#uv*V8gV(pZ7o{|0GX>M6<}0oMz=>@6)8t= zm*eE6A6R0W3vm0nJY&SBGK;r?2q}3q)0H(P%?m8Fa1wV&(7BXnS)W8dkWWgR>c;|e zM+V}^=Ib}vp%Ky%o^k=12o&RP3ZXl#Xj6xShL^e?+OVaoTkOpa{$v%9{AC1II96!un)T~{ly*B(sH*f33FL!kC2p(*#b zL?*qDq`f1|K1jMvE{P9^e0%DB&XQ)?4VREbe_{)VQvdDfE5ldN7M8LM>RYbdNr zIJd1{(8B%@R9$$q?_f4|%_>NG>Z?poG-#O`)HRwv#KwB~vEJ6QVp{kyrZ%|=#N8$* zrj!i7wADqm3cD8vjEY~KA>|)qE7BUGh%%fx5Yx zP)_2j$=)hENvk)4Rwrl068C|GH~KIKrB|2#+`at-gLxUNM667r^|Vpys>5rPiJk#D z)0}N1uu3R>M$&v;A_GoGW?>s0^aYTLz1AcST!tBjl1n2t?mb|aVHcYJNg5|}`JeOnC!=B^q_%=);{+o%UUsW0 zqn4Nu-Iz-QA8CUC5PZTo>PEF0+cil8l2HBL=uy2|VRqon%j=c1U7_DYxm@RzZY6j_ z@PL3R>9`%;PPdFK@J(`mSs)7*B2uY^K@T?pFX!(~?@c2m)T%J1Eh+%rQkB>G@*;9g z#!ZC%*+E?^PDXKycmyOl8TklkvVjfxbo6CVi#MV+DH{*5>z+n7pcsXpp#-3e^^hr;?PqU&9$2(z>o%h*!Njo}XPbAnm zO6AOsO0|TM5k_?>wIrgw8jiUQ5Tc<$S>4#Z#08erh4#SllGh~=!!ar*rFlVoef4Hv z4fy#SRgr>$K0N5zh(>+65?7sAfLa&${>L6eB=}2y>^~P7;u|Isbsq9o8KQ5<>)5TL zch4nL3EAR&W7P_e{^skF?YtQFy8W>})=znzRVB6ZR}BrEm?+3Ec4i5MBAl|_`|T#C z%?qf=;?f_Z7$KK_0WMvwRaNMdFgQ%2eEO(tJC8ZeZhYN77qk1NQNvzp3a-uVdYrn) z4%;C|MTOu?Sj9>SD7yU~tJq`(9z^iEK4wRe+8PAJS#TSVpW@Fh+esGY~aC<>)XzMT59$dPIKB-`zflh4K43!*;;dHt7u8HT76o zjO+jt1CuDT^>1slLmk7GO1k-whwUl^vYN+>XyJ~Q2_No7nHu<=8cwB4}Bd_?p{hJbsB z^`rrjqsgi61(b8wT0$AeTpwX-JPOm>qCC$&o1-PqMYj31t)PC2s7u7v#;J3GC>rVB?Fwz2uBl#qY3 zZNhm|VY+c4!2*!Y-00SMJjU1ZwKh*OT!ioCYnIz4mN%CQ3OOmbO_X9ts}R=z@GJcQOsOk=WdTN$0uKKI{v)9(c8ATZN5p6eQ%0fM;QqaFaAUXDwOn=L zDESj;5eDTk7^}_rTyNRMN!P&|Tk7$Nw|i@L%T#rL1+1W4BP1QcoeY9=soQ>m*sAfHXj0AcH z8_~`3+5#489Pt)U|44qwY!@%Vg7JE$=DRe)sle5 zpw48+^#ypEpXvCU$tzo(`7nDt?r$Dy%ib{cq!EzSvh=Z|=S=WUA2)dLU^Pajg%k<@);=%(sSMBL z7g{1cU#9l0SqizoW`V4K3A?dxt%3CoPH4lrc zbm?yxloO}uV!dHVL-N#-5e6k1gZ4K_hGDrqjm142wLjAA=dzX%>wW)g372P$Q@zhD~?G@su(2Y@0!baK+pnd$fm+?s`{#kE^e6dU~#=82%zwq!HVQ}?J4 z;;4eLxO?oECTt8mvlpcz*zL3$V1QEMZhi+KaGtNZQ?th%cy`ApeH5{CX75n-_aQvQ zltFYXY|{Y&BOZ^~lC**z=?bl^e^+D3IC!P=y$tU~XoYlKSW$6rj7_Yk{dP%{vbzXw z4O!@r$A>7HE~K;Q1p-|8-HF1NEg{Ze_`<>6l3B!H*sSev1R zcf579u&Myk8_RX@(zRb_;vMpeLtAps-b>!ZJlijM>}IEB^k=GsS>4*3@LH7;X6q0! zFHo%pt#Z3jvoe)ky!H%5!~usDdU%wN`AYw=aoFX0tmV0lI0#K9mjttJ$LUG14`abQ zrHmy8^Fq_Kj6mjX_4yU2%;7$>cN0}hig8~1fEGHj?jbO!o$G>A^BU{{4Q}uB@mIdH zg}-tD!5>H2_aWhN+?TsD^qkgF0ty#H`4&#*zuEdJ86~_~`3xpmYYT{!yOamJz`#)$ zo;e>GEHtpA1JSwN>*Hgfg(bca?+Mi#WV8!Ib%!!oBhEX`Kr$Rev_B>zO*Yem3KmHA zfO9{FYWfE!0q;O=6Z;Rs3Mzr>{M}eO38P*7@~`n$lfOUc;6e+q;z$)!UKd_iKq8mp zW0A-?reLV}=2AIeLj_C$x_ca>v3cO|awp=^$>bPW4_2hc3w4aRLEA9>KsRd?1A--? z))s9^hY{;5q&dE4oviJ{4i~ zjL>;D%0nrRJ^?N19BF?i<(WXP2(fZ?+L3f|m+#K71IsSfC}1I+$pmPoHu3Mf^}Bi)fv~!_85>I zWhQj!tIhUF)ZRoDD6dICg!49D#oIt~22SSdUA8)F-Ko(o_H8Hjh3OCQVxQLw_<#VH zMObB(;vMChK6DMpQDDznHKM$yy5(-|&LV%&;D|4Q6Qa@>o z)mi`9Q950{Um-hpBLXZ~3Fc|UmcM5w_<=!x7Ct|+%@$|zMQq&AYo_$u{2Jz_}U<;sew7zAv4(d<#yBN=u8SKhJy&nniu5Tejy4De991 z!b6WUA+pED?Q8=g*O77++nG+eO5%e%H}fAci)&Cc~4cTf;@7UEglYv;Cshi$g! zx#5|5?3+&Z1tf05clgk zPu8xok$7~t6lUDH58+o2>f`p&f3m;d)SS_83$kiGSx!&Ii4@Q_x_eLsl+fkZ3N_y` zvX6j7R$;$Lvu{zoD5oXZSm;ti=dnTns!%p4*y*~t3tfJETQA#e?K&TZTFrbkjEbPV zfTv@A0R*E+`AP-F?n%mJ&5^89Z5El48e$NXxFASG^~UaXKv;a6FAS`YM5(f)8|^0I1vY^7c#8FXoP)YWDq}D0nHq6rGJs#M9Xdnc+!p zG_-<06Nm_-&(TB$tvc*NZJ?;wW-ICd z{3EPe({@%svMNh}wEt;W$F;Tc%Mq=X`iVC+5F^E@!MN30pjs!3-Xb1QD8lxpYr*P~ z`j;|gufgdk8CFC5H4>ddhv%q$_Y_r*DZ2(MzkYjPrRq^lX;;6q)jbqJN(_pHd@0kqS2RWDUi|z47kXKdnNSntalL~afj>*B5a{{Os=5<$q^}~1ldK&*b&ie+5gq79}{HLUI zzFws9nh)1~cw38G_03giL~{zCn{lfQWN`-PHWqb$Jjns+xEc*Y?J@LzD*RPVJ@qJ8 zAI1^a?QI*xbiwu?hgU9ZxQGMQ7^aifwsT0j--!3H*Xqj z_$_vhuM@vLU6}kN9->V5LxXlthL~{(u)c=Xk7I z<}Upz3y`Y$H9tNZAze^u3lNemnnFLl`hv^B&p7XZ1#Y_NX?mLNt~H+HPERAeor4AN z;TPF>$>-EQdw_$~JZw0FlmhlqTF-AsCP~RcR2I(1QU2QzDs?Fvi6u|R(%O@*$3TU; zbkU!ZR<&8SrA6i&KLdZAUIFr8I2L(13C|Pc~w&oy}&tvPfYwnQDGz%*UnIn~w@d54EIp$|1tpKAcfC>K&rCJtd8Ni!yd{)?QEZs^j5_ z?<9xtC|P&J5ieq+J;sA#Y;p%e@ka)^3rI95(p&KA<$PVn*8&@42^H?F+F8Jw?LPkF zxlQn#+(<=k65>K{(;@!=wD_>TYgIJ>N561>R*)cCZz#ZR%%RZAhJw1#Jf2hEcc@ zvZLEFy;+~GI#lV@O#_bT%VqYxWyHdQ$q2P5ziCvcPyN}S^s2zGO`}f_590s-U9;CA zsW+%|yV8mxq7)J(U%nng0@auJKzw-)clCWa>aCexPmVbEq}TU=*k z84dyiCe|?4*S-x@9!f~BQlPe6E3tD94FacQo~Nq4=C|TF#s%-;hsj0#{j0=oXfE*_ z{_{evO!Uz%(O`GDv|)fqJX3)Mz=4f73F!4DE#Ou4Z?SD<*1)=gdF0s>KW*nL%eGM& zB*w7HvYiaRlGG6NQk4dK;7rwdbif^Sbj{jnG;Vn|n&e6n(Q1r4abGwa47ei>T3B{y63$C)eYS5n7p!IR2@5hkSkAZjy%BAfQ_{B^=sog^A?5uU;EH;b5nnYLe^0`mTp8?A-U-hi^?FA$l)>m7J#N6}>zKj} z{=xe`yUj=Z3R?MBBMJS z?ZT|x6mRwgbO#ASC>>Ai=GAh8VK%TOl4AKwf-GQT^Iz?5ot!*J)Mw? zUOL5lmmZ>)Kel+`pnv-Hn`n!yvr190e%uZebk0h?(baHlkbNv0Th9arrz{V((k@;Y*cQa;`1yCVlRT8N)5$42r7Fh)ZtFCw zd^L35Q51*j(Uk~phHb>;F5Ufosdf})ueV!gxq=n_nuWD^n|YPS={mg4I&O1#1lUGU z@{{(#J|FhwB;wUIXsq98e_m_3hA`~p5q9RMRF67BR;Y#>w3(gcolZ2{hgN@~4hx)5 zUBvx5kghwGN)k>V;0|TVC3W3s!UXQ2-R1|ft`2#eh7CO3A zn|TNMRNf62D6uVa%qy1;*yf+wr4OvNnM*7=S>MqSJYRC%A-_pm;Tq^#NY>^sETKD1 zaGGsdL%;_l9Iv*b+74!>Xb?G1p{yFWRY~(5>ZA2&08@=Utj0SNzT$blUgJg#jfw&z zKV*ojC!dag6Myb*qq0qrYIhYcOT`BVM2;Dego4esai1LqeJNxdq_l#JTG5%MRzTng z(8)wT@He3N8Cf1_v{pT~gJlwNApoxt3rRIon3)Lv0{BLidWw+lLQp$E4>zd3u|I^I zns7osw#mn{I3RMSgJ}ED)R30b<;x!$2f@J-3dgR#whth7V;_&#-?yI#if64DDsKG1 zZdpg-2>?DtZIKV+CC-xAu9w)9LRHde=dA7SU>dN!C#{gg2i% zMnGslQW^Uo-vuySgT2N+=SQj3rv2J9(8)L5^~iG&j&|&Y_&{|T6uCw!rBj=K$d9o9 zAFGNM1a$)AcAvHzvMsEIys`!8DZGcyc@vOhkTJxQuQ_hDNklG{n!x1_XF;=hS+D8w z5VG*^;j0?5_J=I=D!Z8hIBDN7W!O{?F3{Zu+;W^W-0c86_FaVZ3R+ez%FsEgW}Uc* zD*6XtF2K$OpK=!)>@YAT^eUJTdiA@AsmI?V_UF?R7na{bbA!#?X#3WpwN;IL(G%<# z{?TfwQCPlvP(74oe4e^=pRE%P7-K(q-MV9gE<sL_QoJUVMSmwMVnfgi3ybA4{4eHM#Wn*^Sow?Z~S@J<@*Th~V~Ep8bf zijNF*<0)>yI?tMnA@&L`jAn1b44qAh;#7TTf;Z$hkAFim*IpiazBl7ngUbkqSo9pQ z|6+%N6pT?3u{_m|<00of9%nTx7EIeSal$PWGvS!`X|nRIe4!2DK_t~j67#-&KWKMl z?O8vD_Y`{>yvmuCJnuYul||R_J&S~wyqdm^%?*~>L`G1O@LAJH$Lz7*W=Y|GbA6{?y(Ty!+~}knAOqg^NE4EYzml z8Qd_-?_|-?mO9Y0e)nV*(Eh({Gq|%YVg+^fcE1)o zo`>Lbk{y#oqu+K&(~WU6o7|4sl|@pP_2{vsQZq^6`QiShuVQutz;9)#n}|?67qpqA z<94WlsiB^@0Us~B|;FH0?<%jVjO#O3@DUygbAR3n$*0WtE%n;STgymru4r z1|0$A;{nIgGZOhTY|$FP#)mokNsE2(4C2!|tUUKRTgCm&tH}RoxA_7y48wCKZngFi z`!cNYu_hxEkUQiJl@o>q5o159`_Y!Q>l=^uNf`%_5Re09MjQxF5A>IQw@4NM6ADPunetS*RI-vEfq%lLoC)%yW_<65fx^m(B^7AJDYg;?w zdc7@ZBkDMR=(m#&LJd`|A$7V{#KpV<8`NYezWpuUroUOp;nWP~*K5<%z7^)r&F7tZ zf_1h$YXdklq;fyRaMJOMt`%4OB7Ix^l+qS^JxPfE-)^VE%UIwjH8dfuNp>Gvg;ZRw z7x!|#Ja|yqF}l){6+i1_h0 zbr{vwxTfxh?FH-+m4YkwJby(S2saW$quO1PJnOGH-E99JsrRNqrcXoiT%lR~9Hq1; zLPM=L)F8`jRZWbX2fS5ZY4-r*GgPG2%dD&BWo~2A(=@z2QjisCeIH=`93*wUBn5u( z7H+YT!A5tYR}O0}cU`*?A9PHuy2MqP6?CX^S3Da< zUGX}*)^G0>;I-*EdX4TGots{YF!pKMNBs`1F?&#z#27ewWS9ji@-uS>s0JR+B{d!r z!zG}d&~IOGs=?rBZf9Tpdg0?w%RtI8Z#C4j?F^pD!eB$hVW=}X;!P1z%q z!K)y#07pSdhIe;*bAs?4pH3Z8Glp4?+ED4R9WH*7Knt+?Z zCjL^2^d)%k)Z1m3gk((>=Iz_)vhn{}8hg^#dw_G+kq~yLIBRlXvxJ803=c7qhQ0(N zHN1BiSd?pmJ-6}o0+yo#A;wA@H7&A18%k`Ok0B9?hMg@;MUS_NU3O`MjrCF$r1Bl4 zvJ89L%nK>lFPB{Ym9pO}T*)yX$ty)J;yW+SYTgiWPI$3@mq+>m_ z@l}FH%pc^@QMaYmpfP9?ro(RG{EUFYyyn`b^Ue&mwRh&zyPuP`Y?IaHSClc-<|viJ zGd7~Pr$dJ!ii6}UkMc0Jn%CAo^?*8&b%&Mo*Ug)xgaYgb@pA-q5a z=)<2RsQJ16%D1mVdfLaDXl})`oJ(2kLtni`TEKLLHmQF&zHjR9TXS&p@GzHG0dL7uqjP!--5;KbVFq# zh~DQ=$W!T%zKT#tE>5Zr6M%2#mjl)H;ta@I_)Aah@=9^++Mok&Eg_yx;?emK|Dg-< zm&>kPh;P#2m4|RdBWO}5%3sB|IB3z&Dn8EPy*#}G&)3K741!m{$Dd@F6cw-D+mEzH z@73hvm^}d(x(@GGEV2tyUA>dsa&m*EzwuPHkkM21BT`0vks#wY!@jN#}f48z#s~u?)y7K0= zg>V{&rcAK}=}Gbm*WB@K;MhfuR64fAzJh$nD&Fe^=g7eB*&^FIU$n^(NqL4{vCa}J z2#&OPltCMxI^=?8lE{oEtsT*aImH$5$Ktf7XfePwEeRg;274smvK~fBMt0ydS)0H% zvUHDCPG%cXL^1z)tl%D5TAO6Bv%fW{rDPSI^fV}!#Vg$vrYKzqKU(e-syT~l-W{&)Y$tgrn)Gub8~2@_ z(OztAm%Dzn`3*wUbs0)1YE$@fiSyV0w#S*u^HKUF)9@!;hX0v;XPLdV6jz71)`Ou> zEYwrTHmXP|h-%}BG9s4ho=Z6dd4{x-=pV-&R40eDsm(WN(@-RqZf&3uO{MN@kkJCk zh(-e|T9<(3?Q3g}pjUwI6IqnBUVwQDM#6Pl`(uk!r=@d4BGWDkW?k&pL`|~McGnF9 z1a%%jiG3tamE5kI<1L`(e*H-i^+eacS3`@@EOMX&@%bM}n_QisZ5vKP~Nwnt--lDoaA@X+N^=?o0n1tghXO0)k&*OPQBD> zhw!vwEtMxBt}cEUyOTQGx^eI}z!k)N#G5PK(yECQCE@+-*g-oXja(WxWTCs@Il|fz zQ^e>9Bc{1~l1=eM3g*%kqOK(U*AlE2+(P*p>tBX`ohppECu7NBTjx*#Y2e48O77=y zAw<10l_YZ!z;}5pgy&kvU7~)R9my+_Pg)9f_=Qc(!H4WlLMX@14;no;)HL`!1B-sU zl5tK5HuVL}g= z1;QvN4cJrC-C1OIO}L{r6zD|H9U&_^N1I|j>ayC#44r<2mCO?Xg2|;^gi}862Q!Yy z=sv{{KCu=ElEE3b7Fi3F&!!$Y5{du zWO;uV+9*~xU_lxR%ZF`}om7U)a2r2SLl!0?@-x&wV=zfE(Vs)&vXvXoK_ zyy+nLY=V3VpqhEc5RrJWJ-G3D+8pmkNVC|EaZ%J=k6jXzzl-v3O>(~;r+oUyf@Qc+0qOp?A7Y9Gss6S;3w^! zD%8NgLG&Lzj4Gd(?S;z@+Z%B)*<8%f%4DlAg|^{!GYxsLSV#Kvk;Y$Kuiixzf)BGp zp&g|((=ocZytet9@=LbzplLC2FidTP1#UU6$W>|XU0X>%rE~ZVwx!;W<)`SU4>i?h zozs5Y)|K1Oms5l;n#zAmxZd>BWp6dM59i@&7wH|a!&`>aNRa+4i?sG9+hTSnDTrH= zkbqA+0M~=Dvj3Jfcj(K8ZgU0R$J|QHMLv+6>)wwqbNiGiGGStFD?p~();7{SQ-KVD zleP9YMpwntIs^MFp?-SMKF(TWy{aVlsHLmfA}9}8)R0jnSzd3WS~(7u>{KlJ+!jrv z825m6^&)w1*kJ(}ob3*4VMid@>aBR5k3vb0-z_E6Sw_6vBDGx;6V%3H`(bH;e!DaS zV(k-m_GQ9WCGB4te(14^G4HV_u-n>~S?7@u%^-uD@v$eNhu@Ic#%KA!V@3UsAx2iE zyX?&N0rt53Lo##owsWw>>ZIhA#e(-62xjfT!8H`4LRO-T?m{bW2WD<^rhqHIbI?WlubTS!@4y~u8dd-D@lA0+KXAUQvzEBJDfwvEoV(nn~sE`!IR z3sk3UFIGl(FLAEij+g;dp0a(9dxfm#2t;iA7`wdfN%rPDDvK^i)6g;lQ#`yGLO#&GCMk@5M z*OEn)c(nbAte59L zQ&M?2Y~K$TjOo{?+o*q$q!LeA@kKN`-(wTX z86i3Y2R{?z9w6Q~yKo;`CwA5xtHxzo=?8X~x1eLqW@ABU-vme-TH3l{VUyj8BC&oe zA9FqCbBa7OhfY*<^-m?2zHysxX2(6IfwGkGXOT1++r^0L9CULF)&d%O0^aa4%HEBk zxO%z>@$__ABT)6)oCTx+#UxGrd5I$Ri}UzksFR z#gVgOMpoqWf3IrRinB*13kw^O(WQuu0qM_mqiHMw{I$l1H1lz^7ywV1ZWIM@gtM#{ zpa6Usce!V^e2wO=X`AC>xkmtGv}Dr}M{Xwv4?HKB?Z?H?(d9<36Rv`G3x9f*JPZPX zSqrW0w#sHZhb&f$wRN0Et;&f;D{jIl(4zx-?MQhS3zB{ymD0w8Y)zJRy#D2IfDwMA zm-m-n4~%8kyLw5CD|7w!DEZmb1|nSK>?${JnznqDpfIYV?p@qNXWrEZ>Du(oem>Y= z!Y|sqZRzR|q!;cCWvH@GI*$&Ada^z{GG;ltjWp-8pH(NaHai=3O+_^`wmh4J{yNk5 z6Ik2|`<~BE@G_@wX8bAu{-%&*_QAfd_t{ff72t(`55n}5;lln9b`$NTo{I6nUzm?% zf*jVza7rTHOG&v^#HpGaCmLE7^I%D~zbEN?`0jkCM}w_gYNd=m9oS&|=W*|2C`px_ zND?xZvQ;O~e!P#$z#6MmXIcYnaH^cR;nzOiz*L^+d57bU?dwAQwd?UDwI@2B=Z}mA zJg)aF{bxLkXgCTxm^U!w2n$l6X*Q`}-15+g9KGh|E=-FVCNKD&VjlM}C5&*AEtAhM11SQDP2y6Q zb~t?wN}d(l-r~U*ASxE}^@o>5wl#OE$1xHLBBuFOgbqsF{*DAs*=4^$O2c$39$;OI z3x3rrl-_FBbIpAzy*4y=>`LaQ=8l3bB>0}1Y;P7?&aupE|F2@Qsut~B$ct%X07*Du zYXKh5!)g^qk+w{e%m^ZC7KtFI7 z1iL0^+>w+$6uhzqM@1~4&A{y=+>Iv^ zja*wV#IdW5!=SiI0EELK_@~im)&hRrWP#hQJZ}4wF8IRMia#ix)y9K8oUrxUC{hx_ zBvwdMEIP;DQa!oWhIpC*@}iF-d_i!J(H*hm>S@AC<$$ z@o(4KOdo5VY)a&AG;SSfX7jR`OM*0y`s|UeouJX~DazoFbho=$5!NlVTHE5cM>JRt zCE5aKz3r$Z;wU9iFIV`OfbM&Wkc-(W1edfSi>P zC)yCGnxT-?(gvFlhF@gE9J+8xzYVohz_67ddy2nZ{N=ZNkv_ss&JI2ez;S%m&dR#7 z)snAO#SsMUdO3*Vt`xyOY5i2IZqOvlcYrf%?SOn;d_p+XFknSs)kikIei!3Xq&$dA zdphbGI$c4$|N1gI+!!;^Ce(NBMge=lt}Qe8&4)V8I5Dpoj4Su56s*pQQ)2eO)EapV z-oGLy?7@JA37glr3f_&t7N6`P03)^0*Jk6yZjOqW29zVdCa(Z)r9GZ!N-kodRA`H2Xh!Z%V@}VsqZQhZ zme^a5YIv)h>F)!0Tl7L7!3tA{Pw%tJ34x}dw>@{hz}FRvY~c)o$2!ft?{0_q%-z?~(fAwrhwcv~-#ld{dN<+Tw$%^I$^d+%mEi1MK5+?Gqg_yG}`+D}19#hYX zRQI!9JdN|jYh6o{Ole+yp(QC)=txqKt(*q*rg@&AG*cldw8pvOLgiar@*N%MOp(nP z7Dh+qYP)#6`@7ZDO9DI^e7iG5(S)qcBLDTF-tTxEH?ubpevZ{MppR(A8wnj2C59K_ ze8*PT5>FpysA#4~bkiLm`b3L0C|n>O+Dp9rg%Eww+&j>2IDy?cB`KH-Y}rkt*H3Nt z!#5}uPH0CdV)+g`+{lJc<+VW5WrlbY)6)q^UM(uEvb);)RqnNqBlbhoC??X|N7s_F z0QPWZY*gn!rhNmfVh9QsKWx`JJu2(~id#{%+szMfU0b?TPAU^+<4Y86y2l$vPjixCXfw21iHAw8h5{C@aWM-4}dc83;f~5Hs^Ac)60E! zZD_PjOY&0~c55xNcUI$Cqpf5#{UECCw`hyFMQf#T3%E(rc7$1B&$r1#DW+Vky7eA% zB|Z47FSIdkNfbx2lAPe>79K3i!{*D@>=^Y?vmT~u?Qabc#wO+{U4O~XI0Ww&#vJzH zeK$Bqj}Hm*quof7TT!s|e2ll)%BRDufgqvgE4-rcspD+|b&cI(YQ( zQj{++mu}1#9ae88pQ%6ytQkcEP{7~vI%-jfpMW*`?GpW@I+~S_6h8$0;&T@veJR&N z6IU<$_#VcUX`zW4tn8KMC+Hl_L%>cCE{V8tn`OLvX31-DZKcC}+wZafD7&N&w1OtJ z0-emi8Q414zT6Vjj4<~WW&#pcZ<`UOa?XUX{;?H@($Gm2`mF!|gz$};5T@uxr^QOR zw0r(@NO;q*m0WB?t2Kl+w=g9foXwS#F+YkB|Oc-MxFgTnLel$Efeb1yV@-CuC67659_GaL_}&Slq2(1fA^+YP-l;ymUlE1S#K=H+l%tQ&@Fv zn|$`&lwI5#A$VP?;PFbz{+N`v(BhEe`2A-D?VM~^mV_mQGHwQ_ZsqC9LO?E?TyOOm zVkIUzoaA9?G4t6L+B+n|E4%FoT%&O6Em%q;GuEMQEG5NP)gZy`-5rUgwwBy>N&}1M zil|et9bn2=h@D%F^5GSr6eyAzFt4rLy23d;hs3HzY;hSlb$XU3zF&qi)(+Ic-3gZ2 zV%N301#<0JO?AdKb(U!s#wKmX`WBD_BbE%UQ?K&qCD#uiZGSUQN^Dz7?oUD!?2IxQ z5g<-0^RGk>mo?SeX=#Xatpk@UA+z|eGx!@-TH^EC(^A@q6>4xklG?&^WscR~iZa20+`Q&uED=y5G1 z?XyIn{n@1>&wGZ$Z()ct$~yHuyr*qUA&X9yT5v8jA>YzKlhO6yv`oT&pbn{9{X#z| zM;q>kmHdE5^5i$l-{a`quk1=cCJ;Enel!D|xivq!ezR|1w!snwm$nbiEK;DB(wRb*7rAMVA$sKW~_H#^sAAXX|=w zpH-tlr|213nX<*}?0fk&s#!IbpN=sL?Mh6=K9n?;O*Y#k1QoShn()E+d=gFI%!d7i zHbpNnBA9lB2yDA0_zSja589N?Ysg`v;^SswGy83eRO~{r+EgJwI!RbX-JTaG0Mw=U zgg^u_t(se7$(2q*J@!n3n)T=Q){>R5hwt#Zzp`;&nb%>wzwsJ5UXYRpQGPw<%UoM4 z8ukn^Wf6Rww9LZ060Ac5OkDN%W!`|IZ`+<&Q`-<~VF)1rUx(|x*)58mlH@nPq1B)x zBxRR^F`i-5fy7tqRqYwAUuKsrWo!U5{e*s;lXsxya3{c;3_@cwu6?u5u51VAk#2{y z1UVF=s_JUZSsRNBws8Zz6#{&Cvm-KhMdznz+@l}oL7jf3m1}R)7xh7psiTQlOX<$@ ziN?Gf&B~?h6%oC=I5);f9?7@sC{8LG+@#Z2dz5cF^ zsUa~xo;AID!S%}77m_PYs_{i$W6`!?2@J6@gv&6{ag^QYoY^(hAIM|^*k8if1S6Rp z5^O5>>aJ7m2NcbgL-uie;L+{!QdNjWUA-8XSexPh4}}Rd(L9Vch)k1!(tTcKy7VF+ z&FIKOTqXm~R?>l3e`Vzn9M=^JhwBl|4QVyAjf&$s-zVm9?d$JZAxbq}4`EzMt&h>R zSs^H#*HP%Z+WEj0yIJ5OJmJSVCi>wHehI5Vy5NC|s53;6<-l{KQZqK+{Rh(lzjM@{ zrjg?+Xg|1(Kmr%0#g^T2URs=gC7Xi(ii9$loVNalk;)Bz!+4I+Dy0Ts>i&)qU)d+$ zbq=27M2)itNww5}U2e~|^8-;UEb^CAo$vRC+WqWkC!o*GbZ2ZHd{3Ig8TeQ-(TRv| zS6|rI4}5ep?S6!$QtQ9f(ASA6+F?1{vz?3x8aP7uL3o5BO?Tnk1twDb?k}*n&a6#M zIpLjczpHN!M_LJ!?z-Qh{ASQtvko7I8-Y(0n1^ZSV8z@&v8BUQOaP9>w|W0yQ@H2V z_WwxJX5tDnuOpQjTC^|I^kEPwBs`jE<(HUQS#)g5_V^bq_q;r zbJe`y_O;HLMxen~dp-Ok!k2b~s?TGLcj|!tGFWTgXR*B`AMQBPxo_D>4d~)s3};`m z*G8PtiTr-HAfWps^O~D&iNIMDHvF6(iCGaJ1wYzYsf+7ZSn?J-B4Fz>)=p8ibK80! zC~2BNW*~P^!nCElbegV~Vf@Xw@1@cgR)lt7o?wItc0(txKWv{Mid|yX>6w@#N&%t& zNt6a0Hc*y+fs1>D^WKg9YqdO_Cdbni^8~D>@caM98(W}28KLzM6FZT9J-+->G@rf; zoWrg5Wh0Ew6Y}6!(S3%xq(N4Az`T*IL}|ioM393j;;9LKbN-UEu`FFja;t4F3pb*C z*ST^}jpRHyaZYF^whmapJE_f1Y^p#<2_+oTpp2(3BU<}7^L8VBfk}PRraingFWD$) zdDlL(!LD3p4==|D(FgJo7S}8X{zpEGII_B!cU%KZd&pI2wN2uJR?QcoKyDn3-}u#e zG%Ip0{Z53|=Cg|x`|1CH0gAuc?PI&KocdPaVVkX`IG&=n3mG)wQxMvhX-iSU^g)k= zdDvTQlJ@Vh5=@;lKgWG$ngUSJPKE-E1hK zL2TJ#%wi7Y&-Gw|FVN4Bdc7vKI2M3gCjDWsPK7-;?6{v@kecIuet{srh^P!YVr9j{ zLtD93bNC1=!<6l6s9DSpI=xSx`gsCeK4*!yISlRx7h09-PV!2A)?xKU_T*}@KcbfN z^v|S7?Q`!j3=H{G7B@fSkErO+k=uBjI1eN+y_VGc$Gx^nz4?h&6mb{&e}XY?r#cq> zUS51M?CrFc|J|n^;n!k-sRQVTLRVVBlN~wDCccIA&!;jm&CYD$z0&|RAmki+{CZ11 zw3nSvlZV?+$#d(zy-oAFJOb&mr>s)>+OsMwj27a-*-WBqWC<8rTNX)U{SBNZrG)Dew_*B(=V>k|%qWS8VE#`&W83*uH#V+FL ztfe0#nA!P!nOMTgpPwNFsYEwz5X^G_w*Jg*5$A$!Q-|X)1$ajdsgh%jCF9WH z#$tZ{G<%X2H1LSZTEUDpF7gm~-PAMZqf70A;S93)x0Q4u;A`a*KI*bJ+FVATf@1uT zYq_k;Lw`ojm2zaT#B3f5H}Qt1)x*N=9BNM`Qt+5~6>z{KwYaEt8z5`ZiW=@=6pFz z*oxQQp+S1-**9Z>q8Nkx7f-S46dYS-P>AAx<{=tiIDjJeOXgdI4+-1d8ahFDgLjGsuM`bis! z<6Zv^2TDZYsEOAbbDLeY${LsQc%^gkS-*0v^Q{WD=aXxc&|~MQ9*T2m)a&tf#1*zB zTPzV{iVOGKf_YSD?2tB{45%F>*dipGh>FZY?@I*WuM{FFW6Y4oKCLhJH9Fi+zx+o1 z=8h)&MF*I+nH?;0KTYV|t8QpaF8D1pWOj(L9`^%ON>C(hst|4Me~PIZ7B;-W1)y8AoapE>np2+s?cqTCl`X$ARh?2NHGTz2hTz z^-k<(c1oFo9n{j*f>|K68+EC^1apjJG1^b;(Kg#9Yj0DELTE30L-oil6btcYl$k4w z^;*@M0e_{urq}GxwPgC=x5gYDfub+=0mMmU-4?1}MmwYfaXR9$#7me^(gthyX#O<2 z8p+F=P~JE&C1TZmO2~Z_xM0aHJ07NqEgsAG)RTQ`zdwVL4iUasSHh}!^27TGV5Oa1 zLsr(t&)prl{78h?*AGd^4az8(!-1RUgO929uH&pkt^q*o`GAV*u^ddG)E>VXs^Yu zn5S3P8Rn0=!|h4;aUTrZNmZ{eS1dn#`@Yvzs^)O3%2jh-L+W$pN@-B~vh{0jR~_eH zSE4yfjxyc|#a`@+jv|pLC!t)emvt4g^MAZ`lR9u?^k8hDrLBuk7NLo{0AE zZ_324>gCZL6@?z9^EH}7i8`qLA+|HoIoo5SGFH3U>NaTUkGel#nd`+!@xP$#D&k>g z+p@yuWngpm*5rVnbFIFgZkH0#cHbxPZt1mna2Wrhds4&FG5f8m`vjBw=}*XlVbMfL z6;-d1C2tfK*|kKJ!KyI$cnbnq#e~3*-F^*e{d8pEUx&`;(0Sjzwl@5{wVgV@)-J5| z$hw9~O|&n{5I!W381$zbyX~{@Gf)#ichU4s^dg+hx2}fp=OvX>wYrqpHMYOAJ!?HA zbx*MgX=+FXeb?I0o88Y2cflqm1dHNZanwqufdX;-(r^S*vhgCQ8s&GDtlGeq*<2H} z8moIfA|8e>jm1UX`-(kko#QD$JhEG z%5ek1Rv+2uh_&VLe%JDP7s4|soohuVh+Ie{Eb!K!{K}<_R$8mjTD8s4m8r2BE6UiZ z?YxB3@u7qslxMFtEbwiWX=(#HTJsybY?-~e9A`}ytg)oy3h-@uc8E@yNCxjfO%oNwPk*5;&EX%sWJpch+_r_g>~dQsOYG$&>?$J-Z3ECBUEVeyY14n4 zKk~acd%`?WhAyWjM%yoN>s02%`LDFX2XTHq=TmB{lqW z$Ub2rRg+kEgU8eP)Ubn(3f0ryT-A?l@(0jTv?x0={iny}k^_Hu;pL357K zj<_HX0mjv-n)h?rU^gt1^ymAOIPlMD!f=64nM^MaI^o)lz$pxbDurBt61@Osz1_iF z!I#5epe)qH$U7!zk^MCB4s+*9Rc-g_m{tSITs1KP--b)lAV7tP%cOnBPpC(sW)4~l zs&s-sEB`0>JBl(wB#p$Ds=(&(Z)rqCQ}h1^{sw8-I}*7O#E$~Uai)&4z(u`Q855}c zLgrP|h&nX^f2wSBi#lI#?5=IX<+fYu>{or1^xn7Y8Z&g!haK}Ba95*o)AT{N37M3E zC}HKClP-$!6Mkc}$f;+dsZDkSEw4TVq6tW@_l0tgfJzuCp@R|c3XjbSyO?X<<5+tj zW8aNWK%`b7rr~3i1|Y=A_NoT)dxwMBFz^!)`*cK8PDmx-jG`V@oNi8K`Li*6V;Q!v z6HP_?wKDG~*?8{SpB@NP8OVfN8TjMwI9Ugd*g~<+%|BYdW<7sXo*5|{%s3+_-|(WRMPZOf_oBY4cw=jOi)<_TqyA3nKPG3K2zJQN_aZ(6(qj!1TF?@8(vP>6YKAM`|Uj)J>YR ziylms;Wv4RAKIUB*_yNc(*7}GQ{EwWAhT41-x`AV_m=s`W*8C%?wwqrJkmm{0}+Cq|1Yr3sm#9#il zHoyI}VT10s7aK4$Zg6^Aa4)FGr}Mbui7%Qz-#cq}NOUc{++W3;Tj6P%(F)9LvB)YM zRI~cl$P?J=s{KE=^Kz3%xB=(whsFbUf4&={sE`i(H7C+`wdd)}I=* z(e!}e51*oz^{V}scKxmCs6oNTDZY)dtNqHX2tZRik&LcIwngo(|aaTbm zH^T5iVTGV8P&ZdxS&iiCBiPa$%u%{_?o8Fu%@5zZEaJPB<51`9qs?rmE*01)(m*l= zVl3+t3;BB!z<@E1@ulU!wdNPurNT-9+tdw>ZXI^4NBE9GtNiw>))t$z5Rr!SGq?XA z9)~Onb^0+s`f5#Sv{*T#zr2e|Upfz%WJp)>Fqgs$*1MQ@lSa6T3?x<3W8Ij<86??WeGNPBazf$E-xgc(vR8c1A zvh@bHS1Lq%hL0r+V{MTtF0i{j7g;80KabnzYY5ALrS_$ZARJDzYgX7E$D=RU?YH5e zyj_U=OmX64colam>U~P(fJBLdY`iowsJ2$nlC6t*wR(WyqbS^hngsC`qwxZc`Z~{UX3&XvTn|)$6sG7xjjEA^ z#NP9GPkQM4)rkV70Rp*}*W2DALh%CLE+H-KH4YU+Ii6lt1BqfijW6 zFhNUw7*$$Q!kS>*K&I#ji$#4yjC|}%+2HdX zbYcG|R#Ag@Dzottg;mDElQZ8JS#u{hlJO}kq8R+|5JZstOw^5h`Q&;#w-a!JOA4hr zFf5iqJR{PljYmAn4vb*8K>uxye5RW2!YMM);z2U6Jn6Gyp4wDIeNE_P+OZPoo#^w? zaq$IyQM}lfW~17)_~sDsDIF}-Kjog*Yw?CH9R=kB{=ODv)1H#mo-bc9WbgIn>C>#% zZV_(h@uqO$^HmAfRU>iCSlhU1BxJ?5kk&D;nZQGs!b+&Pd{EQfX}hn(zU)97LiNK~ zH{N?+bm$W&E%lAPg8yEIO4R;0U1gpF|10u}?64dN-qhx)?Jw#&vxClu&smQGT|{Y? z{Q-^H4tXN!PZS@H=twC!K3eeOTCQnVNAlgrySj26!pay`?P|*XsAeS+&!{mp-;0a@ z{bMDpv09q=>{46R5U~+HwjinLB4^eYBy}-a?-LSLoohnoue1<|qZ1h`%S#J|(!jzw zt`m{Pi8$?xp!;Zk@}_dV_Tx;Wy@h|RwOi;Ii=tOY@-NY&x-^mIeY-Mb=>sX!;r9JY z*1U8F+DM(C0zXAQ$-j>EOAFuXBup0#XlKX2EKt@1A@8@}aajp@e++ufU#n5+Da;>L z5ky_-X~nkE(=wK2{x7AcO8ZHN1&i#jt7F?sPcv;yq@2Q&pTg5jE1~R!Be9*@i9}^K z(AUh%xK%91zZh-Djc`ph?)cwFe0Ab~U-4eL(!(r;arcbu>oZJh#$7Y}4chtI21jtl%W{>=N--XK%3|`0=Ka z-;6=}D8F!s<|wRShzR+d?#k}Q2BWD6R>^={h*{UcTcy`%ybjUO`J}aczi_~BQ6Bi& z=r|>@O0q10KU=Ci-H8KPlng87!W$u6?4Yk5-(CcY32IT!XSOJ0f6Gcg1Y%wz`ed4M z8{5lG`@0v_=YUKgEuRs25*sK36LGyJ-|BFybE53#BWb8t!Z1fhP$>1E;Ufie+8KUmM6D156gH5%T;ul3E^+>$m58%UP%mtkc0#hc!U&oVJ722YDs7iD}PXdoyUud=ZrQeZtJrmVT`Mibl7dey28Q3FTFEgK!wAvz}+DLRIh-e}xKh zo+9#T&Q8^txDT+-g^gLEmR%&Kws5G4`aEoEq?%z|Et=bt_;Hk@(&snWcLnuU;neNz zc0Z2cUGT}VWRcK?N?D7GL~`zCKP;!p!jitfi~RY5q(Xdf3nXU^u5J|29%)tEv<&SU z<82aMxI<9FuS24{oMNgPXHbJFa;~F%-cIMq8xv$(r{O4fp;6EAV(WeEAc-{LtVIru z!-_+z5p^k?Lj`jI_SDQyyG>}OPLL2ZGa2{451G%t*w@M^ShW=i#UOuB+pLxLlj>zT zXOj}6?0QFh+M`mQ125m-%CkM+vpoJA zov=W4wh6NAWjfmOG~zr~oPT{IZ)X(f84lUIK{d72%L;=Vt!&M6GC-9&qq9QoIs#SR zX4fcWhk&AJ)%$5UT5qPVqJ$pw5AD51CYQ~Q33p(AyI_7n+UatbD11Bp&uAM|?(;HBHHYKN8+cKI-78$9eXh1w7uS5V`; zi)jO4*3ZQ^6PC$EnBlzGs9F7;+>OtFQG~$@Ir}0-r-^%i>Iw!C)zbra`x>SUf1X|)zL{pSnxkuaLWG9byh~3Ec|BNq=J94eujTqfmTe+t~ z^DN?B0F|zW;fGRPFWkn02^^MdHd+mKnX1Yo3%D5i@RnP@z&1lDjxGQE19lpugjTYRxUQR^qW3Bv=;md1{TD?mY@artX3_1cQ@B z6|IEh8M>ntiQLAQ+=$D%iKnLKxxvezg6GTUjK=5u88T%T_FSK8zgq>gDlEZ3Sc~|y zFdD^*FkBAF6Nu|G=B9J_^`mi5djXJ!xA`2#$3g@3Z^Cyal{h)Vi^@!pkc$z~t5#(X zDs$SPe)@mnpdaT$J_05E)ZyL6F-NjE zCi0&Wwb`@O68dCHH{+{XB77Ce6@*_eMlIKaN|yi@bh=U}njiEsr+s_r8E92R6Wt6e z#CIg2U9 zBd~=cEskbFM8i1K`B9r}bg)Ih@pf8senoemV51Y)O}yf@*v7qC`-$sRn~W0CIpA}! zk#L`09`Pkk*NXCJVpkrCLJ^XSuWr=3+@`8M{ib zoN@d^cuot_lCmpBER4_%n|MI!Hv2Y*FU7DjO{^_Phvqk}q--1s2?y2WpnlL9^FY#V zat;8%DWc0bw|S^Ey0 zL&WYtJbfv9oBD$fmBa&oaIT$=Ze{IyoFswldvK^3hWJDDcjkK^55lpy0f}Lf+jhkB zAvXCEf#C=pp|!rO18FQtziW@5xfPtdtTV%=z-M{|Pa z-$!VSJXlJ!h9B(O*dxG5I{n`|9&G|nKFniLOZ=u?$m?e1F}a|MQWe&%LXCDEH?`V& z*IVGOWwzR`c#<+89}9dr;bUVrC{w4F_$wr_yKAg1%Bjj4h@&5hcbFce^!QnX^V4~X zyRBkC9gug@0jd1+ldwJD($5TD8khG`mh~4MDOw<(v56GTce9h(vZ^db14U6PGhCvM{ve)>DZ36kni3d;Ng9i}HveIM1qZCuLper?9F3#qY3 zH?z9~0nsBwq4IyiaH1AHuM7 zK|x+<{~d2umx$XEf)&ifxHV@ImtW(U!Ke8D=31b{BA)6ff@F}_*-4hn7r-V&`(X?t zI~CrgE8W&D)r29wZJ}EmLWYw;Cu#|jJM2|?O-TL*B^gi&r;|d1m<&b<;mM;Ja z;@XZ=)W@}j?W|t-7Zf6GKlKf?P(+11&%yL5kb>;m;yzkbDEnA>tiY zOMK`Osc^X~gM>i%hsrONQjB%#f3Hy3Rb6&r2VR4)8An<}{9gV}jb@a=kYmC7+vIvX zqt(XyQo~9*oaTSSR+QuWe~L3Y5>ZL>=Wy`O6ICB-k9!y8zkTz8T?)~br~LP5ushti zz`*b6`rS^vykh(KfrH?Q2dsiZ6aQt7i;*eGr5O8lfZ`6MusekRU#u#L8~aBJu}-jF z6^z{&%0!l5B9l6s2ad?v+)R+l5%F>^dm`*0PEFu!Q2lA)rj6ZgwlHnwEnS7X8#l&? zMbv}ZE$4L0XBDe!`!jYHVaoCR*P{IQP)A}HvJOZb+DHowST(;WvR4h!xD%8r(2rZa ziM1oO$Ylsldp`YF5>(|TU;b`*8=FQ}5Fbe~pdQf1oj{y03jT!Bt+D)FleG(gMP8-E z^yBj$0;R+DA1D;@;0#dUpS?Q(t35Ek0`b43n%Nkrhw19StFlNEDAq;-fIdxejS^eM zX4l3XjSz{cbwp5N0ao;q`QKLMLu=2dXP=+$;8r4E`Aa@WWYm3P`u`qwmUgxe#fR1W z%oc|Bw63fz4`|T6Tbu#nU@a)k3~mf=7Ju!)mSkeZ%_DaDTRDs6_-(%<+#E;}h*VPH zG(Ryc(hmGE^`QH&dA9D~*5ycn27^{iS~Z5Qf4*!dGzE!Fu%<*ScE&hdjBc6`5$n*zSKDdoBkc2ai;rJHm2RS| z&u3N5>^=6aNjbt=?KF;qYC)Sy!T%LJ8eUb8MS%Gg0cMcjt6Qwj#E23fTW6#FDQhoj z+0zJ3TgWQrK`b}-MgT-o!;ao8ZWPekN2d~tz+y8Llt18`3af0n=c;ac(Y@MNL;aBf z4>3`6C04;iQJ>Y_+Zf;TS9@$ojRQI^R_U{+=LAJb31<;mBB6%v%`Lc`L`l0FoX9r&RK!Ll`F3kSh}zKm1mTh|Zuf3-ziZblLzw~#Nx3N? zT>?DS;o#HzQtk3nzvsEw5s2M@M4vIL zWBxTXmwRoUt6|fBgg0-28XawsVZLmVbxCjpI~36ISW2qzv5$MZcygopK?AB+sC7yG zTVD9v39=)^9_C?^JRm(u-JNLK?`?TZmxK9+De#P;!MC4$$yF03`mBU=u;vSp23Fc5 zf_l3%5U{TW)r0gH@a@&Y?=1B#<%9 zNaUVj2aBBp`ONMcvDRwl0yaBkI-jXC%r6}iE@p$}l~$V*FVmI8|rb||T#}M%{b`e1gqdO*p&zyiGe1pakXMj5cni0)pb?R4V zc&8TGY*RKSW{WjbYt~7=MrIw>vzx4yu}6Y33N)U6Qr_i;X1-J%lrisoupiLtpcgfkZUg{^+gQI{nQp9wn9akqz4yXNiphTG+8Z z8f0bh5&Lz90gC*Mx{n#N%@Jl8RM>qbbjE{(r0qX_$R_)!p@2E{+ZQOBaZH+)rB5A$ zcPO>pD{Oz};ycijCNB@LFyrsd{e5plXbtz)1~^4IH)7*LK>Awx9~#6Th{fx%qI?$6 zBuo^=OS+Ls7^+qFhvn2?(3Mhr&GGn}Wqo`<0&0e41Qm^;HciN%VDGfUA?#N!$ERT$OV+&-QDx>Y1B5#UBLL@TP~-52;XBJZEs?Ew57<6uCdRzf0<0Ue1#6^YIFOy2Y?np^URVtk z?XwJ-wx+(O$>17l2YDg%E8(Wg>>1sa@m24TCD)_fT2AIFwdBcOen9W0pVaU*GQtn( z(V(HXjLK=%{VKz78z*;o*_6ZC!#F=jo>qj9;NSBZzr{LrobPddLx+CDe*Bz$`3>h} z?d)u0V6j~qnTZ=AEe+y0`SW3oIF9n!jAlDzA-_S)cq#<(ta(ZIBa|DmkI?%OZ(x3p z`Ru)fT^`xtH`G!@8HdNN`dW@N$6lrXVF3?toPI#Nd;CfH$5-ZWm*lWks8lZ{dywbv zC~CWb?Lt7&r1E^u9p1?ghN(=d=<5)m^uzkp{WSSPXx#t+i+K zi?81`OFz(xm>^btenypcqCb+sjaRZ38z20xHUHw$yQpac_OCJjOuMKK)Ws4o=NI`a zmaruF-Wn~ES=#ysV)K62OTPohK%*GzD#$1 z40W_EW+hKiLd+`OLOYi z{D91>3`(Vf67gtj6D*!&k7fL1-vMhSL-z4zN>V7-sfeXc$MhUs|9gsiN$+~RtNp|P zEEv~pQfhKTo%mAOxgATbaT6K>W#PF#ZRg>b&f@p#TfHS9`z&&&tM;qPc~Fcj_O<0; z&tXXGca+>W2RZTOF6iuOKlIzka@r8ch7JbqsX%s)l#GiWLu${Nm#}*?aD>J7-88?Z z#CnnuWIbSy6}nX?E68R*`!2@1l^u=%^%X&K*3q=YYmHWjlo)5LXsbdSUPdTVRIP(m3JMJc8fv`v2 zfL54^ay&1{b}IW&oj5b-)7L82chHuJY}GaMwu;u(_|bz44l9zi%6Fv#veoC@E{y0l zN|z`!Uv|2mtH5fTin;`0woc_Q${evf*2dIttdHX&OK{kgbQXm?YHMl`gO!bCoFP1s zH`urHTMH)kpX5yTnC@*B`;pDq!DK^L=gSAiY`tZ|Y%Wl7;UUi)8n#<3;v(^(V2)P* zjTf_>zSjaO%#R=NHIvx+YY|8Pj7YYXE$C2}W|>+qFg`nMTND_h`M|iGzzFT>g~tE3 zX{~?<8OwAq&`O3@-D{y%|UL&r3ExcSZHdE#`Q+Z#_=yIQK-pZf7_LC_F%e#9EFE%wtrEW84<5Cv)_BveQoc;qZT$oc#oQK8zFd5J`Yc$2QBv` z`x-gUD3rUD9H^S7-}abrS8O8r4=(r{U-L2&DHDWSksVEd2zB!i!>hWPmG^{C@cPGM zA6v6_Shhuu@F5F%j&QWkN}KKe7zm#p=U%}%UESv6Y*+V;pVK)gXP8qbK$%#G%Pd%s z<4$~8Rc`p}Qk?m}Jm7)mph zZ;@t)ZGVsSv*TTs)D#Xi<93uI?ZErB)sl1)7sUL*C|IdKm9USsEZ5zQai`6vY0Lmt z2cOfa3iLi;GmRRY=_N-9j<>{sbF=7zsmT0K?erWeJ323BKNeotVPz3fZ8sRKjN3y; zE(R~oOpADws7G^!yTQQ0Akl!tq0Qi<5s0-+BRJZlR99J2JP<7 zqAfkPA#VK~>fpwPU!6J>jiiK|3bO*%@%B(&P49&hir-u$b8BK2bq1)iKWES zAhU>KIztpeQ4z6yKNi=b;^uj<52*CnMD#PMCi^VaD5^6V%Lk-A>cLx;7H-7^lATr& zS0f1o!UB@=Yk5D5+(e3_T6~RRi$s~M$n;bH*GBuzd8*}d=%B50L9H}9!GAgc{nIX7 z^Mx*pMiKr58N1q^@G;t`zMSGB6(MQbToqYP`GAT4iIBs`l1i^eTUZt9w^1rX{v_MQ zue&|Nk1MyU(-Z)RL;sA?L(u4$I~`=NCcUt+*?v(jZLN?EyF!pf_!Up_SM9F9c@%$# zzLdxLNGSCjAI3#qrrfYIKbwXj!n$izkTpS21L0;fX0fS*?vBnle>(|1AREzv>ajm+ zv)?w^gR;m_WSDvmB;M;N+x2}e6>GKKZy`V~ZKNP+7lxYvI*;KPGALHWDOTlrJYA9a zb4#({I%G{b$7()d);QKx^x7=oozpSD*h~s{Q!4Fy0yKfavWLFCzfnhagWV+<(u4VC zM2M)NERS)xXqGaYo=aOrTf3{MY_VNpY*oU2sr1Zk9W5-FO%cue&FVy~czvUl(z$;T zjRwABgWX*&?Ox-+%5$K0h15b~ysNsYXbU71ncwS310{Kgszk4qk(u!#lIAzKJt`p^>ZamVqp3RvYx9{Cd<>l--MS-|e? zkL-W|rG~F%^Q-d@T*!&M@HL)ClfUFX`CM=smTn`0a=AP842NFQO-jssZcUz2>sh6|F|mi7+Q?#l2bacx6z| zHC^a)OB+<$By6fsyPEODe8*~EQ!C% z@b3Xj0!n_(} zU4~-Gx5A{Ai>cDj`@Y?g>OXwg*Keo*< zl-tQ{fev#+ppe$g&IpxN^Ye_wcDS>fRo+ z;_j@EcfONVXa`wKgx}?ASMFx+SPS}i%4>$1&f=$`$Pw$Svn;Zj6-QQpP^iBT?e0eV zENd@&Ds{1SF0Kn}zPC+S`(!>bthk4y%6JwOYR(HJg)l--^QRNJ9`ALt9P3&%TAD+B z!0nXVlCpi5@qNo3Bsji7J1l?%l~x8M*r7XvGJwX)P^?OIXIu!xnsckTwBiI|58q>D3)RuIqgW6*^Xr;};ZSXj3yy0P9wTdvm`1)b|jv9(Xt#JGw*_~;7F>8+{JAAEM zBLbf3=GINB9}d%l%=AIj`k03ZS!*uaFEVK%UwI^5z-W=CG*r{%upTar&bFN(!}-T+ zGkjUdZPnU`BVtxmVn=|WgdMG1l);$R48LrolRtB8>{MISv6HSxIWjgUE*3oBH%-Z8 z6Tg#@?MIl?h<92@`%ry1HEBNsF`>e~6Sv}4dkuK-I^Y?(#64j6BZ8MkVs6jc#TX5{ z*eCFUGPDZ7^@RD%s^Rs(JR62xPVH0TQJa=)!i*$v%}@3s=EhWxIP zMAjw@;4`~O=a^qFFRA5wRpSq8x|AL-VLPDYbc+1nxSbz%7=KsJ7E{^Fly+1sxGsWP zFo>;DIB)Cb#mCPobdadBTDmb|QE%sFGCzSmK`U-A2|$wocCQ0F6~L~3WDV*U$4fKJ0XbZFo z?HB?O0wxP+$XYgIyLH)P9u3^VkXINT`5$^z@{JvnaL3hQPN$OwWbDL2JBb@J8xXn+ z2T$^2mv`Iky3#;6C?f|NqKMTfkVdGSKsy7Qz#>eJHreDB#1*nX)|pxxk4)Ryo)ZSf&BG}IhT_4zFLP`k#kus;$FqOThFejz zb75cdy$n(9M24U%e%B36!1^w+*)i7U4j&mKnvAvU0JNz=0PNLmKE%wJ%McOZ6D_4& zlksTu&Dv>n(DIm-PUZDhy7u-%#)9kGMcUFf$7BX&(dhAZ=`UHk^ z!wz^%l>A~@Y!RA;3m}8GxQDid9Goz%AkXm`3AHsSxUqi4AAgm!oxx|q165=ntuSg} ziPxjR>?VYUS=(n9r_#Po5XSpmh-C~L#j*f1pzTkIkxN-J5l+P0*1HxWdE1g464MT- zy=v79JV`efcRCZIL8;?%b{TnoQ|a@R2{z9;&KGI=EMtdJi#(^>xA@z98^bsHz(!f# z`guwpL&TctX=HE~vM#mi9yEQ5y&AJu2u`6^ZY{Qh;Rjk5&ZL#MXcqqD87o<16IHVF z9rHpQ(>vd){Jh1Al0#jUK#`=Blt4sRHEI#kMA93wu*;DAeTd;K-wWFnS`TPGpXQOECuw$BRZ%Dfsk2|}7B3w^6 zFe2Et9YwIBOQ?&~`sfBb%B9vBvI+Ilan&&nv=hhr>aDTnW5@%_CdpVnI z$#%w2mwVbfQn=*lBX&?_w;i8lW)v@9CnagY1D=?5YmU=)5@(LU;j_i;kf8W&ErY3z zR<<5sPBuvQ6ntG#)E8lDbWu~(?r9lDiBYFqClwmdX;;Qx*Um~LRsx%sBMOYzHTiqD zEx3hWS~?`Qp-@ygf~LHxe)XL7r63>46hCGtlHLOFK6mLG?L)oWA3A&*7Cyzo7}fPX z;s7fB!wu?LDLIO`?Jh*Il(5f_ciG}Y9-WWi*m#pH0mKgh?cWG!)V9Rp)e;4doqYS2U5dj@R+pqY%`-c7~?9!doT0Mw*4F$ELa`%S zS%ma#him5*p?M$oHerBW*%POPt}(Q3D|Phug-c)bXS?wi;ZN zj{k6qR12Lv^n#lY$G1x1^ZKMhc<_%tWWs`?yM*#ne2ZHGMUZ_%5U0H zAtF)$Wp72<`35<1i6ygy%XhTKq3cVyLmu{N)2Q5LgWZN$1`+3J?aS;__=5d-E3f%@ zfHiE$1DlQ)SNoz}vCKYOPFhB8wghsn8A~}^%04}dvrEXMj>bHSsSu3qrqz+%E2&o0 z@_+1>m_6i_eU9xSP(x{P6wkI>eIyM~OWUpktephvxK;ay5>2EW>&4VXHaV%ePC0E} zV8^HSW! zr+*>5%V50r5ij`wUbTt08yb9`(l3kSd{9sNR%u;T4p;3N|8*J`<&k#gfwv|!sbN$dLF3_KEHWu%o+0r>&fZ`sOZ zIM$d|TbtJ@kx9zTX6ppu6o}dYQrX&Km9ZvnvBJ_$gW@L~qoW~cEK($*x%}sg88_3( zZVSBB!}x*UH&OGlp?cul(U?w#Y^&frr!{1-H{=nAW7G7}zwD2IxtBoabLsIo+a&{H zul*jHe|%=^C2q?Z*rO6H3WzSW-7_>cXX`Td%#iU5%$sr#SMgF~%0qtk~sK=T8`S@@!$IDeoX8(bWcgpTQ9 zjKHRO7u5(a_3jcjm?lSF4+*kD2p?Cu5GlcinaTINjuEqPhqKyO&+wJH_w~K z_Z8VZmkX5=ZC(F^e~DFT#K4YY=|x?-g@%C&GVo9|i3tyAoElH&y!9yj!e3E`i1XH5 ztXY+J)uo~AyIQv)-1F9u9VTDxx-n;emV+@k2lD%1LuEfmA*Te+nn_L`w261o+!IN} zx4s@^m#?O&hwcAScIJUmmgm}^$vRn?uuj4@35W?I9Z)oY%YY~Wqy|I{xDBpx54P1% zx4|yPr8;O^qqZ8b)oAq?^;n~}b%M4=+oMsd#-()vtw!5wP|~oliGHF3ur5YcDoE`k+$wtV#>KV!=mldg3zm6QZf7XZ8SR zp*w6;K30@_Q3L*8)qoH3!swvsn6G4}|K9n!+Gc}hX0AT@ZD+nJq8e=D$5-fsKBc(0 z+SouQ-8s30^XMKQmN$5-1S!YLPluGBb za-p+k>X-Qi)Qn1%fUT zV&=T7*IoCVjMqBF@<{E%P_LWuT8z(+L=in?v#yhxorej)uwEaaeSn1vwMOm%JEMTR zz*D1Sw+3PUBh$r@tCKvrn!#6YV{!$m;N7GxYG`U>(nE<&j@v;ge)iwPf>o&!Z{?K^ zPBlQcW&*r+ z+NRJ&=X7YkM$AuqdM}DqM3EI}|#aHb4CSQbjvRvV$78klcIr(gP+yhe_nO@e` zN@DQwW?L5S4Z=SAmH8UCMJ;;YjW66j(&o_CRO!_4P9q;OS&=~Y)?BHIg`kL}5d^Zm zruo>ZrLd{L5?^dF`4B|$B9BH4`m|G1_+7bnP||Vgr&g3eJN{3q1*>+4J*OR*l4?~F z3C+z8*y5Dv!xUkv!M1xb_eIVtnvC~M)Vx_cDQh zhJpgT4s;kf>$0XESgydAR?Kt+ku^gJaQj!(+UJCqIPY(udsG8|06cY*4@I4X_di0@ zzn`)ROHPZB8~jTMo`XQzhX%1HRrB%wG-_c#G_@1M@jEg3d)O~JWX4>!y6TPy1R~>6 zOYAC?6NKdmlxk2UfZId%e51$~*=Y`-sA`<|DcLsfNLh#m*t}g84 zjC)8Y!%P-#oO=t|=otO7_=q-U3p4uV2rccFsXxny zp|AUKBd$#eHVXs8ZTBcMJ zS`&JQ(`hU3ZhBrKGHYnE93xMVLnYN$wW zovmyLX|4=mN2JCIGx^80-VotTE4J5qa*eH6Z{InA$gF5CxrJ8|$c)U51*nm4G81C` zC}s1z?X)CTzr;>#L&8SU4OYu^{EWyspo_1hwMy`3tzvM=oV1drIV**XIUB?C0-!7B zdPqJ(Hx`g9$XDH1ttr`02<0Mk+Ape|%ZILzUoF6PHe@)FEPhJ8cgm#w0AxCb*vYTv z@vggY4je`aWg-vXx;ZZOe)=PjZW*4;1Z|3AFa;<4*`V~nguR%OaOLnsuwyCc2)M`u zA6`v{H(DMcTaFbXf-e0L*TTzsJDL6zX|#5A8cs(5mq528@GJ{a?_*#xxO=P}G-&i* z!*4Y`WZSvZ;5s$H`M@lNtPrcGlX*+Hm zhG0KXv`g?RZ*fSV+@!Tj6uX^o7p}MKP5{PZL0ThBRH6}1yHvUhO5mC^tq zVrI4pRBW+{o0LaEpTlTN-JFZOR)By$8$%){?Lw3DoHB=CeJ~oSN87Oi`uxN5xLX8| zWJ8yakeU$li#qHD-0c>p!yECo{U}XO@$Zf6msAw^7`&t=;Bjs^bpjSCo>jTcf{&72 zRomAXz-@Ly?6k2i$8>?+lAme%I!aLK(@>$nre(pTgI!;6ha71lF3Hmzs` zNQNm$saazY}50Rilb+cHnkfNgI#*r}WD# z1nN0Hp8yZ5)r1chsqIAu4tA3=Xm@=?8R#Ttt2}Il8{v5ds7D;?;ReK!Px-5n)m_e0 z4^!y=tip?8JRd^$Us~fi1tbHAo2V|rR8d{!5YX&qJKqOGAH&opUazG}TlOe=;s*p( z#O{pcspMnn`vFWjfbgAP9_qBpam^@SELXPup}h^M#$8@Ug5Cx1djsyl0&~bS)Ozzs znO5?0{V##9p(p5lY$8G-i2(rGvCX7umm>>~$ZBE*3{oA*G0VYPmF#~tmi{eUE27{S{$r@)Sl?DSlRluvZv;ls@~LOERQbBm`{_pmy_UMdCN zX!$h|wbKrSXb#9I#60Bj)^JjuZ4Rz|i6(4P&qmqeehSTltwIy3&~R>eXUcXX&`R3W ztv02rSwl{bSC6n7ltgTMfbaBNW zL7C6(hYrd38#f!~NJ*YBvb?$5k8#Oq6s1nX=J1rb*(5R8?+GwRX{WN|uVckuES>^^ zNkS!x-`pw$mrOXW4qdo?sha@sj6=nx%S>-qGI0{784Q57g7Y$XGaups)EQ%nIVB@u4d_H+wJ?{Rjr3;zp;-Rf+X%l%m51X4qTo%QI5Q-R_OAL zYEDs}_R(LT!1Ur(Ex0tzatn%%$KtImK!v^+MHS30J5z1Csu#OCj$61`tP~|iNW-TGXxr&)a=P5gvdc8^`|nH9nmLu2-J@+4 z><)Wp@@89=H~SqNQ3d_(6uXaTk~%FTh(A7R*L#?-+g+Bl@qN8k(WOv&T35W!N?`r$ zFv_&9SAFHj0c2S&qYwdOl;e~;PqcU-3iSr?LUjnp`I=}u`aPy!39AO2xqTERin&e8 z+P1k4fj`-}VPm`MjOJD}`p6+;8$~6hL++v9${5=Z60)_sg^+B!A;@=*P{U4punik` zRZ^28l?Ho|yKl3znn19auQW5gsqa}8J;|vb10#*FiXJh12tLsdifvL)Z;#g*Q2MoI zHcgmH=@MM?53VOCWgjNFw@lXUEn>OmMoq^j>GoTgg@7o^qlr-lO$7}#jYGqDOC3=6 zGPY+o8uFXiIve%s{q}QEE;Sxv>-xU1<*-4_+bS?iBAk-XJPzC8{r zp!(#0-(x@Y6X<1O)R{s|wn4mbqEmg08^9H%>ZgY{0~Qq9v&i)*n}{%__=Gc~_E4q9 z=DR8dnSvv{CV-?J&Zg2X%Y_%J5KW2*B};8`z_AqIq6kvVODX~8V!m7Lkvg2BeAP#O zB;S++yx2yB!ZCAkEUlhYUCbu-@~Z(1MjLA8bNe}J zM!O#;t4{fY1nsgeQ?H5`m#XLe;ZcNknF7gmHo^7vDaQo%hC90E}Z$%y4=(bcRBzv?CD?7GVjk$lQ3<{%Tf;j&j zZPR=%XYcwZTv5y-_@%W|U_qr-RI6TIF`Wju`6!8*O~UCzIIGHMowdA)<;SwC%kcB@ z+%zKca~z@_Dq(`RHdrr&`BFl+z$W>ISnE|rsB7rzH2RTX#Pe;hDEPr-s8;NFi}eey zgde+=u?6>FZG}f$`=iAgq$B8JA)VE$^S^^^t#z-vsZ=| z`Fcr#J-f+9xZcN;qxN5r1J}r9CgG}SK7P$4%&nWa`RFDG%28x{Hcqb>(ge3~vN|Z- ze}5Ge$_K4wrrLnC-N!_>J?x4{lCEC~gV5V(pKr53)(Wb#XHKMWd(dElZ{||AmZ3}{ zh*wZ3HyxA7G-rP#JAh@(N79Di_c=RB5%Jtj5idpANJVA_4dt(J>6z+h-LD7;K6AFZlVXN;&wP>OUi7I zO!*o%mhfRLGUp~QFm|RR2@25NIutqtkaIicq-P)J124ole(3|>;6R@Y*ypKU)}9as zD@K~F&!b?GPpfEz;G0G8A$qge3NY0pci8(XD}(8H5chV(h{wIS=8JT$c;WZFf4ODt z@_M=WqK4UO=O}%ap|1K;ug~g+pkoH_`&ip^7C`@hQCno+7U>xk(nno=(JWP5>Y1CF{$0JbvO6cUWRQlpVVGT`8|m zgjU;8$8XurXT4ij(<-;VJ71Jr=iPedllW^j?`5dXya4Z;@YD4a`VGG3(!*bQ=^iPZ zbAnVJ=3TlhF)x>@<7l3cfBDj>T(=7Uu5>MfR6K6jGgf2vS6}#q|9s)LLa|$6uN86O zzLY2CXraOTuH;~^ao@*NCdx-6=Cwl?t~qkSdMofm0#+6)`mKnnE)OKojd$6Wh|M72 z=E~P|mE&W!G-bc*wB` zwAVsyaM18gH+@-A8@gx2+Z(sujoD{h)N`3v7-Bhoyi`)luc)K}iK ztxhXq%;m$fd;^g5XqbC%`q{H!@f{ciUOfq2{sgERgC!3%KT5OPaoUkSTO7se2e5Wo z>Lp=ud%fg(wgpFnEAOh!cZq(8E%sLQ^C{lfzePXdc|g5>j+3KvO;pthlWhZ7_AKgY zoHpN|gN@-XE=XCu*HC???J+FXb@g957m-P?C)KwlxZ+h@tcE|2fIskdYLAZj=-Dp(-`bXj971d%7-^HEY-W5W$?m3`wth+!HQInryI}H!63_CkDr6(HJpS?E!H+J`*m{wyGl50D>GJ$Pe;I*w{0Ek?lEPI8QAG&vzdo$p>JH`9HZ z)*th@POg1;`|&QMHfACH`?X_#B;aZ1uLYoP2NZe}n(To`eGt<1zBQrF!KeHzF_)nK z1aBuhkg$r)_(wP!KHI;}+Il$zxz{$By{Jus&fzE+^EG_!#a}dsnsvyHauLqa!h|pfx^(l+vv{@dtobzlNM530ny2Z|D zb|eZl*ep)RHzoNk|DSz+usGMhA5&Dj6^;Io3v6f4yWF^#E#h+^<6n|?nvaBHiLD&4 zJL4opifv31XCcde-egDDGkGzi*2nUml73Y{jOgv5K)sz`YsOPXuVZ4l{Num!@*&lB zE7s)?aQ7m->c{tK@-y`4eGolaQB#rX34&ld%YGh!hf3jxV)pylYYGnXtO`Vu^a6jc zL8;sL6&u*l zVQdoa7YJ>6>C!q(9)ojfi1{P%7j3)Z(N-!|_))TXLdxratNQUsox%?0j zh6^;TJG&PqBCp{be6+a}{;$^jkZilUJ<$BY%$HX3&Udo_0S9SsS*U*Cb+NZ&fa*-V z-2bHufCG3Q6{G(r)qivv0VuN3PWP8(*zg@b`bCC{3>^ZHJ7#--nFUIRPLSdU-NNFE zoO64`^kj+eYaKje(bs>He#HYIr=vU;7?~lAUh#~_0xL2saLq0XU`p$-{O{U%CI-ly zZWP$hF85yvSj_-Z1{+E1L%UydecFas$^CWkwrQ~79vFsq6X3Q1J1hpDz=m!1&!`Yd zL>xR)W*=ptQ5np0<$>TyW2Co~Hu33?23g>1JifiCljeiTLc;~4G8gci=t))g&;>Xy zc*CX)aY4;4s7Xc+ll-U?4*(mW`}{w#!5VY`KO5)RV07jblyuv}p6}-=BiLZGaHY5H ztYJ+sFvtZ1{CRtbuP?GuLwevpaDkWP_&OUf+C4_eL@9zX87{bkcMxGq5wv8u;19cS z!O6Rht2sWS2?_=^LFRyC9etc4_^GD|{=|(R%ia9|g+M{1U7W(_F11UNc230Z0=+6C z+S9z`5meUX+rI`_;$~;T1%nQtrq#&#;~qKegziqfqBfPeF}LP_#{;5T$nn6~4E1m1 zQ}4=xE5D!#_O{tWJTRyU(t|gE70$L+Ie|Pb{(oeFV+1x9p|@lT#$^uSU^@>)n&<2h z?*CafX%>l<=DYCxA(lV|54w}AML7Y1GwDYg>oLJ-R6$nw>sCjgEU9KQX`aE5W_ z@3D|tRkhN7M7!n%ec|>;dmf-~<`=(_kvNWC^Y=@6)Kavu_%&l|2;cG7sG2uq1%Ai~mtfE1`A%8HDl)hIT;`@T@1NwZXXv79 zNRWQ@MUQu=9g}pv@}^azr9(~jZhBIN|4~ESHEoLvpvXUo?Jto4I?%3;tm{*=sJm+%v&I#Z|E)7{g@W0<_v$E>dmKzn2cw)@gGL!s?f>8^Ql=9+axNZn*R z>KvuH<;=%qfKfoZT|PxXj_4fz+B+`$iaR!HSSIqTDNdJ%GZcNPQ*T}mIX_D~Y?eBV zsk5m1Us?vI%^ecy0bj3ohNMT%N}e=%P@oG|Z}|@<{jjvB&CmbJurBN#WL2Irugp;7 z2~ors=QB^|XfJsv&dAJ7@3du8hi^Kcv?53I5GF3V%2CE$^mC>>%vr$*@_Xw5>B9=z%vjDtXfYugZ?t} zGI8Mo3gN%Tg(FQT8clWjyDCF%R)&h)H+bCZ;j=b9Fs#4_$t*@s%wilNkKn?-PIrIn zD|EN_{o1vL?w*pN=YP3t-pqUZ1sy5T_PWiO1$A#Iqi|sI&^=pe=AzvRf*8RftNP#F z^F{8Sv$z1zq<@d!!^oP>w%dS0>Zuuu-0Uve`EJ*7y2rTbXPKRtQQw?#=%NGOJtNU^ z5hqAJi)iC6`b4ZYiI;a{uCGLZ`Uk-f${C>OBwqV|o1NNb(Kh?L8sxH(S&b9!X&K_4?`~by2!G=3EnNC! z3(SIXcSYnIDafVIshW^Di|U5m-4&t00p!af)YSNPQQ*5c4kXeYBA*Qu_?3wKH1{Ai zx5`%U4n^+g?iz>h`wyJ!Htw77$@)?)!e>u%Gfp!u`f8><4<1bSUG2!??)%%^_dZ=J z@4w9of?=RKEmRj=+!OI^d!Ao=@-Tk&4NI?UUt1p z3dBGWB4ynN{c%@{`}OxNTJ7oXdk^k=HJ?|f z&Ne+NhiL{|>xA{#NR&TU`O+edqzM{eD>9y8?${nFDdtzezrEq#S;frdtc-! ziqF4R*1haoG56;%`A5Hm&B|TVjm`AjwLPKF4(@A_PUzvY?Hut$?DrcfyE$bg684X5 zoG8_#;;_Z_cCbrKy0dY`8d^5PQ|_Gzdly2S6X&il>AGCovqvp+A+A%GKknNDc2^KO z6hen=`v=<)+iXU>h3}a@=&Yp&c;p19bVpl3C+slMN^j^Lx_t-9ea-D3oOaa8>ydLl zldq!yisYicPPpuQAcEks#s1Y1dMZnYxqAMWNNyv&2kpl}zfR!K_&0&~CiuO`mCu9> zBlup8Bl?C0!;$;AnWMygogC(ND#TwUX!&i5@e~@U-b6^s1hIPP=2!Qv>pY@qXdEMs zResgp#5{y8R9`(o<eL#j0auMN?aUTVa-dWA2(8MS(Gqpl%r|lU zYCGCHVx@6X$P-gkD%NccY}wGP@hCUK69=hEkvfRHYprY@*Gz4=>ke5Jv2j&UCEq?6 z;G5a#U~b0^{Nsc@T2DV*lzR zEpm)yBPYD=e0Cka@9Xe!9;UR_ASzcD*zQX)NZFMXRDYhC+r=joq`0P+MWK8&-5qV} z0VxAfDYX+Cq22_a{W)r{Qui9PAU(-(*ODA-aC2KjfZ1;aIWSE~YVjv2*1g$^8@tW# zN>EzaCjasH0php5$wziJ)DX4W`wXK6zms>7Xq955sY{04X_75vDc%Q{W z+qtidz^RpcH!e10mZ-6&IC)Xmj1FhL1aF+KD*orGSFrQ$2-I%iEL4ZWV-`NpcjMqh zNETa{FC)PVS+BMK>3z7_zSqY7(;V(B+U*iHHwaEGwn$qE6``H&Ed1t#IoPWz`$MmatB>|sA*o=MgPw-S zse;KaP(PNg@v1rs>1J$|szFIm(qB4&pPgm5q+lk^i)ge?jsHa> zIZnEkBr`5&Q^NAv?NpUiQ&4|5FzXmwq!vj09B+8lsf+zqPp=ehvTDkzVq&^$M|s;S z#tCp=ucoYD>+|!npx!M*o4BT=nn7o)p(!bRH6z_>MPc~t#T56<_AomTabow(YQ>GT zW?8=L&5CSC((<;L{{d_htBUG;ODyMGbp&p?_C562S(e|%mF_JS{4S54N>!_`Ge%|m zdpsx0(kY8Jq^Kuv;1!Q(hvJvw(YXguFMW;7Ie-WgXuPOEFN0K4xT+5>Nbxe)@1Wwu7m1!vM;o*pIW>60a^tE=y38>sz)@346Q_L2 zry}8?m2|VRcp{zHQd;!OZ z{%uc$F{xLcM(4VJiJdqd=A5Lp=jWyqngx|@r|h&t3b9*YVrMnmV^TU45Hl%{gP}Fy zttwiTq>iOAsX=e;wP`-vK&G&raM{b}rw zqYNR_jL|zO^!^TMJM-8+ethb*)2*8~#yD>j+7C7+mPTn%qoHt*3fG_yH-PWf9;c66HVr>4PsNXNY)hCT3?9M z>}~J!ELCIfDPd0e&4-H)u(?f;%g zBdNiQxjcYJoV4&$v^RPKi}s=JZ&|OK!gI5D!~b2r@_580%C-E%?q>-Z)4@<9Zh!67 z>9zQN_%J`P>`FYIJ?$vXR$1G_smp9(Gmi5#7%JahOd_)dnw=Sie7}h^iK@t06*@dP zWNZ^cfxEf{eV$Z)qI`>mHfxAMgfE^2Rt`)2h#Tp`0AZMO^pEU@oibs=& z(Pt>b<@`XIjV3g7Et>5;IvQ2+oQw~bF??^ zCqRpHLY~>4+*sX>WYWM9>E(Zg6N4JsO{F<%jV6c4kXP5(ILOu&!j6BTccaqg`R$!7 ztu(8_e9ygcxNk#s)ulYf_nhH z<*NYyMy)FwX9cZsacna#O1T&-jSa8Wyx!4tEiiV+0+AN&vXG-NKQr2M## zh=gXK?e=VdnJ$F1>ZUsz-3V{R2FYaA-=H{Tf;wH~;ABy2=z}9Z&?-e{5NHS3`(mx% zIM#B;%)ftcQ}&%j?7S26s+u(xqjkP|Mn6l2Xr@8{!jezT(^$rh_;( z08y;LhOv6{7kuHtgVUa5*$$Uw%SN#)v>4If!g174`uG1h>nS(bUS&V+Ry*cN6eaN9 zyv>)((|~r0!%$sgXSX-j!%0uIKnyxe!ent_uuoy{*$HdZu%BE~3-2KW+4d?vlB3*d z_&uqNhg6R=?pAI4wy%v4S_s0`ZtiHE`LFL}&L;xgyrIW#&*;ufc=Z`L5|4IDcsTlVWIySf06h#r`?x5`vz0t=y}7ek@L zZHne&;5~X_#Q{-fzSfpqy29oJ@#TuJF01;q)xP9=n6T|NcAjfauE7mS(@s|aA6Y(w zp)fo-v!b|_R@h>*)v%AHkb-` zMnBz1JRKy9u69JVC&r2T%OFo5(l_1qW-OE(q^Ti#d?M)B`o6VqKNq{-PQ7Lcb&H|p zXtxlGgi(vyO7xo^c;Mp8HvnhM@0O-gL2M3FamO$TW1h%z%n1bd=&JYmnYPOvFI80t zp5iNuq) z>9d@cqUlgd+l%I9~f)a>!vG((#Gh0n&w6#+WYiN!kk1y*_kTEeBR~;ieY`wnEVQhZ4RUpM6zR zvkF*KOW9V16%ugOXaW>WwAl^b#zgcB^W+F-<&z`QW^smTpnuFnixuG&P)pPJh#8l$7N*%xYeQCCwB zQ!r%q7`1#PNXM*bt>r;X&9lBvQdVaNV)+KD?Y>S1M6~ws@Es_FokZ`%Inqs<2Zw~U z1>AfH|3=6P02+gzIuh#l#37h@fHD6jA2oJLX7&?o6e+8VmA!2BuLK|7e1)C*AWeph z$5NJr&xJPmE(qh6ohQIX7j^sIppizu(hOhxfD)i3ZzwrG(uU}7+2~}qbZRLVz9R+y zmD@9_pM{0&F6nOQ!-b4*2w7QQ#3}D)B!}oMYO^Wwxwl=jM@sJH8wz@%^&0dJ75wRox8HHe(&t!jpYw*mlFrxcq77_Z+H^`_!7iJ#jZ2s2+FGd0iz z4cPNY+7F?+0Pb68bwnV(#(ORL>iX9ndEzqjLxW5pI-}g)?oVB+iJ-xiT-=X9y$NBX z0pts$hkaJ3+v>`YJ+al66k_QwlK2#)ApG@`o)U1Dd@z6!cc9tuktserFfr1vKx=sT zKEBW)RaWS;4~Prfka@S5C+A!yf%zV9YT-8l8_{eZg&7Y-CIC6XyMW`|5HN*YpTp~? z)WR=2rrMPu|5_T;o^;c8oUph}3R_gJXj0+&1x z)@bs(thdSeJl@)QtET#Jz3jLKOylwF(*p{9KpNlakLc`!GDMn*CJ)rm_FnHtk8UNh z%FF>tin$Sl<{OlrHK9$W zuxD9IWnl53ozo4^vh;w4Xul?Z9>76Lm<_&zY z;8TB=lc+cJrVY^6ca`K+wtGTL`guw zJBCFFg}b*r9`Kx4x-nMPLkV4zB2Ue+U<5Pg2Tk+|3r!N)FpN)%kkmY}I zjRg*2QI(ArKTz9CTTAPJMQ_;9WyPy;gFahXBd@Qv8N;Xba;2ieqPgYXOwV{1&;1D8 z=dU-U+wKIFsW+x|t&?AdqqgMCbVd#n1pmeT9X$}?ljSKN z9B@OcIH{B`=JpKuW}i;=T`g;M;6)`lNjL|CYNLJ_G1k9bedBQ6L-g%NgMOFUthZ&MFAdZ<2wAoH<{`mBgJJ6W4_C^Gnc zgb^!ayX^uw#kJf!V+coJv5Ab^>x@r1Vugs53k-;$#K9p^TLX5;T4%6(p(e|4V}N*+ zEW#G4_K@;6zvkSKC+WF;VR?PaAnsTQG*H{>aaQx|_E*)y{Qy%wKk8ty1!rGT?C?eNft``QE-`itXt@gOXsY0k;L(Kq2Eqf zW3SYNfuo*vv#eKoymgupDB&EJ+x+&J>=)xEGkb;WQAfqGdQB@YwebSnfp$XEK_v1$1UohZEwFEs>1+nru3tnEzF7xrx6KpZWx~<#R#mNBVV!YnBmzhSA zvQM&Wsll z@7P8{*OZjI1~Qxk3FAQ*QY@_X~Ske*;8dReYA!qdxEd*eR zN`XCJyTty|Swl5#ekSH>gjB5V!xpLc_`oC}VX^(P4YOYYPfm#;0_R&;BVmF)z81)d z7tNx%RIf$*YEzr6s5-pea$IKa8dVy^m$$)1$E0jQV15mMm!8hiZGruE5Uo=yQ~B*&g9|8C|903c+vQ-X}=y z)L(wf;*4H2|I#Rms)TgGFHux&%{0ChpqMXip|D^#Ti%3Ifk(`X2X~>rY3EUIzlI+$ zbN?^`B3U_&G&EY%yrD`nMSd94XfnH}M4m(`cs=7gOoE^1O%@@>BTWQJBSo(*j^7Cvd) z1tXeTja^lcI#=2%z&jYLRu?TmQ_aL`NASU2m}>;wp*>!$=1zEg@rz2OR+-#3yrMeZLGVDw0X^j1;9eP#RGidLTQTuIX zTWqZz5tjHZ_dyc-=2kS46~%4UCfg%Yy*+3b0Y1V=&Y2px*7BPy_pKH3CXb0Qs;H^4 z1wB$=7Y^7Xjr7L~zbv;%8-A@9k|i2Yi@zoyo1Bu2DN&ZNKSK`414a*9yKT&8!vf^- zGlL94JIJ;E1Ft(x%gJY4>inp^*9te??kt~$j+SzOOkG&M%p5j{p~aZGFgK(nr6p-t zDY&`Wu4=*V9eBA#?MAZmZ`y+c8kp`3pIf*)&Q4x$+cj+#1nsYFwqy`M(@eH(si7pi zak!Nwx#n-Q;5BAK{4V7<4rWyewO&@4Li)O_C>+|p%{f#*<*(6yxB7xyH@7M=#+yS6t#0Qg2lq32xt6y&~t-+5hoQpfLQ6saDw)TXkrXH0C z7@~CSe0cF2HWp(u*TuYd$Ltc6G*6jG7OWWdoTS1nhiWIb*yPR3#MDsg{3N7$zz4^U z^kE6}u!O>Fy=1^RMS68n`=|xSvjpDD_VHEUB>$+!j3*?Iz0{$@bWb zMioA*u?yJ%yAZg~$L$nB4rdPiy&M5Ilki5~!$31a{fJ%tq{nP->Uxu1b($Tr60Xj! z!L3;D@T7|*s&}M#Nh!?sWN%vo%vcqNC$>St7##7az3fSBy*Li(SzyzYt69{Q5^!P_ z5o5wv83UD^3L~|ccHn`(1v-Paxg9HE3vX&kLCoix?a8KUX#-^S6q}!Iv$R+UJxCDu z38rbMeTO0MsdZ~X5WDcXLOuvLD5{HlAzXa|VQpy=*}nBXFoa+6o9VVc%oadO50}qX zdpZ0TN{a9~3+~MLU8evjJ9Va>i(;JfuoYauJ5-)Cv1KiSbQyWra{CQ3nn2~t`+CVX ztPLocLL5{H@7(V2gcTxMA;&MZeY%q#p73)`zbeB$M>TpYRZ>=&l&@9gjY+g%6;N6> z?wcJ=MldbhEwI7z8Wi^6YhC1^gq)zS%?jHoK`ZseJEUe1%m+B((~XdcJI-Y=!}}b6 zr*aaNqSGuYW6)>{lFRFP_mmAbu2-O2PokYx^fXQ>VB^n7R-o*|PTAA0skCZ!{rUU) zRAF%`PJ$|Bri^2z%+r=vk%Sgw-9E=tRP}JL3yxV3+U7ElYkFLC>}MQ7lB@Y}fPjV| zUd1sHas=TR=dRFJhXL?u78?j#p{$S%Ua4B<`9l>kQClmc=xq{?loVGNKKlk6dpgm~ zIiRljsOl`+>M5rc@)2h6>Duq{LtkePf-(?|*;yoZxoE(dzj8BNcC5YwKsHP`igG#_ zF{{x0^rl2>t+-`xRiWLjQN;(~AV8_fHbpuem(#+1#K>^V)Z8i;iq+DkQQSxvr}4|VCr zkW!HbCy|7(vx9a(tyAPHC0L1WJH8|3>$F_e>dp@~lhgGa^L@xq#rbF^IXPy5PP_50 zF}{S=2Y6U)r|s1PneLKfW_u6D#m7sklxpLY!RoaMpEf$7jaJMxzXq#&X||0nEdIS< z?7w-6M^W){+URsSlYyq=sIPNHLnnwRMFY_Nl~f$9@asl=krJz~gPBWh2IFKw8|zW) zH_OgZKom#H$dA!AB~R1lb+z;*H6;8GJm+km{n*Dt0=Ni;WVC};91dk9%BgH_nhEI5 zAm|J><@rJo4o7RNfBN1|41)!FD0}+Q<^^nS$_{gIc8A>=b;gc~JI@m7R-XImlDgH)|e;n3L`AL?+b8X*(uZNiAKXXTP^Pey^Q^D>e!)btu>=8`C%5VX1q zZQ~U-hU~kl*awOF(R6F!+*;~%4AKSzF-lepG=~1ZsFx%{z~o86KvdGm6_{fO@ON?r z+HBqyo4=_w7{HBEvEEsZNLURD6D&{25ZmPytC&KWv0-l;MvKjCwu@`+_-a)~tRf~J z-C<93O7j%NP=D|9xpX|H>|M77Yk~E`6;APFOk1c+3tI;gq^0aTX_GH-3_)58D{@*2Xa1oUI73bo()NJMi(nmh=hXYy zw6JNJL5Z}FjX=62VxJ%b3g`qHW>b#V)ynVj02nk;@XljR?q-EK*d%s*s)yoiz{{b1RgS;@%d?_G&Nj8T-6I3^KSd~%AyKE+wEpOuu z?dt*!LUdi-A~7!D)BdV9E=J0O0-cV8XU@S!^Gc5*aNmbEP)iL#x7)3FBL()c3`vBO zT6L-Yh`FJ@dOHHPA(%r^_owZ&G)afI@KP3H*jpjVnT{l(fR9p7obRXZ^QkO$wyh!j zC9$gFnOQYusZqhk;!)QsNv$d1IBTFk~jvFc3Pa2Wh3t8W3N>zI;Y!>)EAFTX@tr#MCL<)L zd3mstG~$+7L%9ETq5dkW8f7h#l;;w=zkT*lqXX{U}k%7yGm0gBtRje;Wy>}DzlaD!?)S>KddWeo&U0G+sy zbGeLcn1szS8x+VRJdNTFY20N1JIPLLQot5Djk_A@Nk;4$X8(%M1bKSz z+Py3IQ0L}duI0KgN3}8`1OQ>P9^XS~AUd0MT%o-W|1XQstH)`Q zb#?|O3AmPN{NwBgF1%-+9~Ozp;pk4MN}jiq{Pso`ArOl_4#rW@Vvj+YDIjph1so;! zn2R25-xd-w2B#JK;8qzllwZGyJl z{??8Ca*0v69f=n9%TS=P#`Y@bx6ks>edtKg5E-URxdrE!TH~nz_$3$uCqznPW%>J) zos+XIaLe)I$?!4H^b-luv~;ztszH7Z1wM?C^B4>S@a-m^<|E&nXx2x6ZXc%$?C-3cD%65u5A;a{pCp?o zOcxCnPGpiqjZ|t*SZQ%sjN6`}Y+^+cQ{otjt%6&}ASney&=|vlVHR?~b$B&c9tNvQayTARE?$|YFV_vCYQ>uPp8 zu0dA$TV$|H?09Wk`aUd}V^NVNZh@zsJ$>a1w-H}ZBHh9t8jD#z<{+z?AGoYH0WWKs z$BB{~+)xWk)AkKkM?E7xL1M;|U_)fI!&lqWOW>r#w{FJSuCl9g?z&%qDik>EtTr@r z5k(+)m+*-`{@5gy1KF+m_$sbk<2d&vn{+xB?P)ae7mGHli9MdQUnbn*sklsU<)>-J zHG({C#$`JY$*7h$0=#X3K53Hr0Br+fsL9Ht63@_Ou!8|kLDANf*i9~-n5(+Ysp6D~ z{E^%2dsK>L@zuB^)+5*Lr1lu!c>s2|V~9QGHG;(8Ljaz_8s&Y? zG072c{E*kKax>ZU(zgaS0QL!}L1(yyfax}bfx@0zA*RR4O@lrk!%hyP0VDokCjN!% z?SGOrHw~DAKkkw+Bx5m}vv`Yc;FN-am{;7hNa^^kF#VoLkoa~g&ePV2YJ1onFj(9Z zE5iYUl2HCnWI4D^kQ*+UyRf0>_{hcUZi`ewjjm$>P-EM~3SMd>LH9s!5b32^b=j zJK?FJ9p`Ms5U=JTHCmVSK@@rje<22_57v=Gjj5j}Q#$9Mz6mOw!`>{Zv9^pwrhOA$ z*=3~m5A6cKJ(|Tc(J6-@UG?B8m_l5-YEt_HK2DwNNLSmbvgR=NQ)^|r*DL%vt)GWq5uwt<{(1vK7=+Ek~0XP~_H zY{Q{_6!HArUi6VhMe4HWz4qS-7OAcUYvB3pxd8iBc2ovQ?uP*;Jh|<&Avv6Aca{HHGpF;rL`J)y^A=hmgm~qWVyYVpnMR* zG$-)--^Z2vTs2{3wzCS#>>xrO8qDrcnQ1nj;RuugwZq79y4k3hTb?FHe2H?MZ@@&Y z(B*39>jO79!=zMmR`81}PY%*jz=^JfphAmVwL|@Jc`Zff&%scgO&Z;0C0eHwLL6g< zB3-A*(f2UTpIc#yYpwMB+?f`RBkadF#!!;aD^k1`X^X*JrAeqXQB)dkTgr;aZ+V?{ zwLZHL;Ifzw0*PB;1C&AqA#g`fK?iu_oV)M%th`pAaRN%Hjq)JD#A2dp5N8Rjv`@;8 z!)pl}!zEToUOeZ23I(d@eY!6NcUpFjh&AT|=z*|7u!SzwuYEM$VO5AoAk(+Q;ztTkE`uE=1N z_Ho8xn=Y5!qKNEKlD@9*Z2`5HAbWFDy|D7Uq@->BR>kXKf}h!xy5`s`c*#B}AG88Q zZ9`+Kw^m7%#@f=FL-JEnm9mWvaYE{D>Nz6x3 zj&Bg)+P!V&d)fK|`^_3yh(y?Z@ZVv>)kUX5uHVZ;7y-$YV+~qq3ve)gbt|i2Wf)UPX9IUht!CNFBf zQ)(6pNyvj+R=f?=EC}NSt0aus%kl#(n6G)ui&HVq=)~81l+5{*r1qQe`nyU-$L|0$ z@#hO}zSyo>iyOQKAe!XFxrob=H{xhA97W@2yWvEk9KW!z8ZP2YAA>WGNrgFSt!<0a z39V%vES`YT{FJnz=IZ;HAGg)UZc$U2Ow@iLQe?E)(^1^0I&#k#H0p!K$V?uaSY+E2 z+RM#4wI074yGlsbWq%3!i1OdN_jKF8-GILb_^GQe&vsR8`*EA)DA#=3k+?yst^8$_ z&uGBZR}qFeaGOXrHN$Nl$v}N7L)-mc4cloesb2`C+}f~C=W}W}(m9qUd;c-*UEJxl zVl%KGY^2EbFT0|^-ddyLhPgz^Z`cv=*rCvimXeH(yh#fv;HUW*eu!fG;b*{R(r3_5+o*8Pj6n=$hXiZgheW~_jqP|jrS?H{7>PX1MRdNf2w1_% zE3uvPT~sp*hW~O@GYXUIblESxW;92_eLkY-0dsab7cxH+*R1m58dvo2P#FK+71KgL z!hd{2DtIb--BMj1F$;L!b9Q+E?Vj#L}h}i zu)LJmc}`7vx%w;${E}bnd|l)PeED-REVS6V)>n`26TvK_6D75b;~UZB6z)2v|P=3Ach5Bpr<83bfT!EeqLG4GHg%SVm5? zqsq}MPhx8qSq8(dgWP{dmid;BofJA)~htx!WzngQ~o43sV&U`T(JVxuFtot z6y|`X+^-_!+cD#`xGomjp|A%+9NN%lhp|Xl71|et2%7ik=RVI0CheD%K~))z#w(;& z4Vx}q4ndPv)JDDxl(rd+b`)||i$2duUst^@v4$;E8^RXUie^nDqk)=mFPE6}%z0#t z1IU%Dtxce@-bZFWSCzmVkGF0qg=ylXoChtSKzw#J`BYyEd*#Pt6gM`&Tl+!bsWxYj zHXa-~IQE0+kf3>i>#Fvm!*X(op`A9FQtM1~NCE@T9z3$%0SWKg8GhcR$Qf-~13SEA z%beix0bwan@}E6W;JOr7JW89~_k=F*qoFt*?!soZek7dD%Z>=l&u95?G7te{sbu<# z+RuK@20zC}#eyV#O*W~aBZMRc#X{z9v|p&5JlBpHXyg!QQE@(SMu&R#@V1Nswi~dV zlj$5xQ4!Gq8+{L0KgAY$oUL-4rj2+j#D|a13SM!h(`!hK*jUBlF*Ypq0N3cN7YY$STNrLTn=3jsV zjbr*W6&7l*x=8w5=%khhoM{)O?4Ru@evNEsh}sjLKedZf5GFc&3~!!FwO3g1=RgM6 zbrx*GtIKQP1T>nXs78lX^C{*13<7uuUwHv!l1Ftm9+ej2&4khB#(Z4+UNF@P&aotA z=Xx$_CnF``sqik&JDZgGIShqYMR}2!>i2d}Ip1*`HF#0DDuBS97wlG#HO{2pgB<9x zn>$qN-nb$-+oj9CSz|L%<4L>kxqOwjW7Iu_yH{1)H?a0VctaE@W;t@g`A$og7sg7c9(Og{isOmi^BtC~dpcG}` z`}?!paFpH0*$b|?A*a})%$s`U7cbmSfCIwasRB_vmos75HEJO~U5vwL(hc67M4m_= z?nz~v)6A2lnf<6`ucpeXwpiun{ergN|NN}F(N+-~%WfQJ*UkVwP4wHeUbKyeSTK9%&L-t*%2aVHgr?|}Ew15zKe`1Z&b8bEx+b%_}*aixOB@VSgK$2VDm#Rq!10`vlo-xw4q zQ8;lM)nqLV4#}TpvtpT+4@P;obPt(~nLye;R1Jj=d`tE~f~JpkD)K2t3cUWYahUNS z2_Fsd{zqNP07>$CK2qVi9#c239Z+F8q=GwJFipvK3SdhA4Gd?E*9BWAM7j# zNOEwb@6|{CV3SV{`CKPiz-fgGt&kGwtKfCow}e?gqHZZWD~nLUFC6kEJHm^u!p)p- zJamwbyeCEH_z1Mo6xz$xbHH36M$piN>3R&uEO4P!_)DSH4qRkc29`r~wb_aqAw=QJ z@?`BIT3)tmSjR6Q&3(M#d>5)2tkfY8N(VjxdBhd$i#iWKM#L|F~=Oof55>vn}~UAf`$R2z5$xpw1? zIrw_bSeAUO@}Yu})?9J`K+0-L^X0p|DHth^LvgS(Gzj{knb7KWI+{H$Y* zb*FG8gXGdH$AOE)hU((n0Fx>Rs5l+(hNP*AGpOz&;}HhWMGCJ`$*Pw)Js#_ee5&F} zR)y?>Lm&qer{}J*qNU(!(@X3Tr&P{SryXvJbhx?7#%VGV*PuT;!W9X-2LK zK|o77pwf2;6TT0_{IgMULUB_P_-bkp?Go`h7zl(xHa9hxF+`jyq5e2XlrNs)Wie34 zhwNA7Naj-8t3P9NFGZvpW4l;flFH{6cv@z?10Ch-PObsClgT9_hCEjdlV`v%M88JS zu;6|=(8li_LL2i8OtbB#d|07c#oFM4jV-tf<@Wft7Pn!PvlE}!C-IgKkDy$=)_7J` zZ)ncMmp|yWt6jrpNkri6h$eW8!lye#tRo$J;_hXk0 zX+rD=5^Dpb2~ z4J8YCLUgVgu3PyIyj4V!b&BHh>FvUy%aAC9?Kc!V1u~UkylDO<^R1{7Nz1c}&Sp5O6Z-9e zimu@c7Nj%+C2*P#ef}7viVOnTqpHyX{*dR!IUSAK>P=J7!9v%#EeYH97)l7XjLIGa zf`DU0oxr3)Z+k6TXqK&YX;*-oEO6QVYg|$-k+kF6K*@f$4wdr>tUTWXHU12r6_(Q) zy#XPkBJ-Q7=>W~DL_OwZ>{&vNOb%JjGLXOuyyVm5*WB1bR!RB#QsA_~IYJ#=H=_a* zR-(Fv$4~^QtCi4nmdi}%^e9!*B!8Yv3CJw!%3))w+Fi%DJl@2sngz->wSiz3rtk_C zvL8uk+sBMTmI0HzKg1Kouq+#O=EUnG;4bO{eIEYrRf^qA4gNl9R8>FBFjLA(A?JLg zaY$7?l-RVfA^N;2hkxEmdi|Xoj&~`f#ZGTu1-UY6YN1`m?oem&@o;On=$qXn#WesK zV+lK}Y)T)OtD%bHpTxxzZ5Fv&1_hiBCIhY0h=DK4VHWY`E#{9gI@TuuG5g1jl0YkV zg_*0tS*vid;jQHf>eSj`t@SAMKPNE*0qz=<0LFSBGGvLd=18MAz*vu1GAJ=*%2_@) z2WwrZkReJ!&3{ET+u>9SW7+L?LfRg~gT9Bu25jG`u*Iz5ad?eD<_Z-c7#{Rw+%aeD zfZ^R}s@qf>9=7aU9D;{jW%w#Ict2{uz#R(gbs~g?QTxQRZ(o>0<(HbujgU$!1RTn1 zf*4xTUQ*{<{zoeMM-W1m`t5@H+=E>{Xt|0mzQZ@p=Gp}%>&q`xKB&H%lu8D`A< z*IH#tD}e-p?M~1eRc2NRp~j8ePyT>>XG`n}_chtgJ$7X|ML_SNJ@-MH8ekW~hixGm z({IO|fy<0kdjKClvBnY^OyVxL1Ue^>cdeCT{;_1IYYh>L*zgFM#3ENWf)!Sv&7)s* zpqbmrfF#Edd4PgQ&?Ruhodm+81V*?Rdnq|>r()`ReY<*y4z@XmDxpjf_`DkXsnawk zS}qpHtP zFU#1mKIjyIQ|E8B1GXr~NCmhSr+uHNJmBN|scF7;U906LeYI#TTb!}=xT_GY&_*_* z-hwJqy;#~NV&^da4~g+%LEp8zYwhhNoNQOA&&~|&mXl5MTUEEsyLYgXL{(0CwhU!IO;12lr<}8t>;B=u>Z%_na4+2Uu}P8l8^~WV1g`@fG~u`1h)Y} z!y*nU8gUD*0jo~1N&u}vA2q1711=5L>VUS5+S&oN#yu{rDQcZimsnekRNLUvPC}Px zYYj?uw90wE*YBPnPv7Uiekz%n``l-_&ULooxg_j&cDY|8PKYKpjSoKDxm)4rHjHc- zeTR{>je4I4arx+-BKSOQiNv9yj~D4M3kp=gXI+X+11Nn5Klf%$$Ih%5?g+W4*!Ne4N808Pe zw)Z40(1pHix19jQUlUoz!*$mVE`93&^=vSI$jYQN7}pbMO|`8a!RqZjb`(or`ZIU- z!L$wd`O~F1_I9-RKGkjrSN*LXKxLEwt2I1!V1 z+01x-Ib#0jfNB%Y3$=$xW8?KWN7U*6b3@mvw+Kv4N2Kfa^>Zo9#tx=sF=b^R*@dpP zXn%3X&(NE)x0y9x<=$TH-Tae9QfStAo0LFm_cY>M$C0ipO+&LrW#eS1z2UUj&QjO^ zjLA*wvS)nOg1^pIZ4!v)C|AAeH!?YLvyuE{WV8Vvw1pS(axQ?aCq3JEXcyRzjjyN` z16}rMQ&39vuA6**3N9p}N^?*vCH$ODC3aSpB;-n_fqD5OYz9juk-6I{ zxqON(4S0c@w!HB}ZNA)&zpwD=tB#=Yi?Gd{K>-{nov@-21VwXr{!Y30vZ8WtpzBYnus^>Hf|2B5EsO5X`g%b38<^5mk|r;W z9}}}%r5_8?epQZ-?d3NzW74Y`w*}jpXV&nzxaEyLp-=kcSuQR>Tq;2P1;|cH;>%i3 zeI$wCMVp80dfW~qd2KsU3i9SCg!GTl0SqXWS7Aa|5neGM>0^1cWg{OqhQF%AfP7uZ ziaV=v%jjFR!#eVi0@hXW4>nfz^V0_+TFGOV@3| zhknW*S#2Yndlm2L#)hyxi|`+fpakN;ZXyh=iEEwY-7&D<#jXTAP!}&3e~gP=%x_mj z!h~Eel#(T&-szU4EIzjeA1#sGiAXdc23s0c{g?Q)Z;|eB(L3d?FL4-9uaElH`AmOU zS1n#4>(jV)8V})LG=mk9>+K>&O_uS?*c$X(P@Wv_g*hRyJr~V5oF7I0cr<2nXqsGo zxZReb079^`(LU?kn=z^K3zf`-5(vNV>!IzRsdLeKuTd&v$XX+mrS?buPMit}O^_aS-qTn>;o(1O2+UcagFkMhXDz7Eo?MehC<& ze`ak$mi*%*3*&=G-#WVGf_mvMN1yiFkqGtGvl_?osLdP&a=@?W*hM@sEH#`P9L@cE;Hxn%z1> zvx?VyhCMtuc0qEn@7P6STw@o?x$NSYQi}>+lNOg0HHBRh21N%&^!ynjGp=p6tqFUl zNy&LjZ8^xJG+>(soWpLUz@OY>OR(z4l~tU@d`z8SsT)mEUVa2J#1};pNU8`C-)285 zqq2}D)+w6v3=`}TWW}ohF?aNY8yqvgw|~W!=3Bz`uN*|{qDv`WwBZ=wKMla<46xG9 zXRES26API%(SDg7kC2w~h6q>#=p{lLX`i;C4-OqZ5wrhsLl~-stLLc-r^F`EJ_~QN zQ3=>XF+0`#^?N?MQbhD{(TAa?P+FGgb^|W1q5DvWvy+%K^=|IF2$F9 z+t-|+aQ~6D)Y#b>`$ro#4{K*YFLJ2L?N~Ze zj{JzF^fZ7GUjs%e$@nH3#rhQ<`JN0k0mn$wgs?(VZQfjwtw?}Whql`-nlufElDl|) zSYbS-w4~BbNQZ%mu1zsNis+~r?NcAFY6|V*pSe=!jKPHUDg-o^PrgKvGh#Op;VwlP z>iEkhic@^V7qrdo!OE-9cjfRk6e1BD!W&jD`Vc=BT^#nmZ-v150=8I-vnxnHrH$wFuE6tN>V*?nv3l zZ8mN*^DQcyFxP2!79b z&BXD4pCPggzF(UKZ$t&s@cI}er68wm3`(iye@&$Y{8$ zo+=r?t0my+&m7woOSc|9w=?x>T?-L9^PTEHbhP>ohS9?gsg#DtVYqN7OR6-ms-|m?;icXji`*_)arRWoIBY$kt2Z7Du2z@gW9ku$z3V5tw$xLHgu7 ziCJi&MD{K}@WsV7mfr>vEUrx9X4M|t%&)%`RXaS$#W6cEQ#CyT&bfCDE{jYkRQGG08y>Nr)HH>nVY_vQHjV_&L7lbuy%teDZJ%`W*)M181{osx!P_Ky!5j^+ zvEPP6L4(-QWNGe2Sxe%kCW0GIRi$Wmu)YO))7cP6}O zLABLQRVPc0Ktd#d!M(38%klJdYy>0-Nj>Gd=?Z;R6G^&tv_!1quM!-fP{X0yTcQ&F zK^Z2`RsG2ixdos3ZJ}4enigEW#P=U&MZs1_M0YuQ=|H^zp_#F zd<-_q-i0aty+(L|(I!sf?OPn9L*vhFB8{80|VUQKLDa0E9NTuanwwU&w7a>)|t| zd%0hC*Cth~^N^QHiCzkGrbn<9Vnmbqg4eC23U%A0w-~L$8EGmFiwzPTzR+r>x{Mv4 zk>_qCp_Q89-B~{kLkFbIT9nGIrl8|lI~CjdF4i$Yi(W3MF4r|$kga?r%mBahuspk& z7-m*j`rYGUu*B2*U$i+;*-lG}^f(~FG><>BE!B=Inv?+XZ0PJI5>FdDbV(>8p4PQV z1rB~IB@Qdt^iAJvE*&-6vSv(sIPD|FDPGfU1kCAG_Nk(f-0B-VPM?pfo%Wdy&4u84 zJxD`3i>g~ytjqTAk-G@-V~4cqhj(S;;uZ;JN9Q=h$z}ELhav!)U*fQy*k@ZZ%|c@} z+ich8T5iNzBK}9h*6{l`!{q5?0{e+&=@!3l2lUsi?b>j z)7#SFc1ZL4ISH1l7)JpzNobGI9ZdAPa6_)7at={>aQiwirk7ok|ErpFrg-_QIEXn7 z^itwT`K6vw_%jKfvK$h%-j>(eiS^YST7Yc1(zS}Asoa&ZVKtd1sm^42l$loK9vHb4 z(fECS-1l5#6q6>mS!t8`YaVcRun-9mbm=@8P%|xaj!r^9Ktdb4aBl^!kfQ{aE9N0B z0-h!jMVbkPFsK?T-PO^Mda5|BODVPT#` zlXdAH3;6a{FIL;q3&RoD%zdlnz2VEGc_?jLp{pfL;rp-DY|gjOAvC=Ln6KGI=aa3$ z4>AM3lyYo?@>j7t26b9DuOQQG7qPX;Loe4SKqQW6^_r#Jku20{N}oiQvcir{j`l{X3kl5Z>)6EP6MxJAwJLzQN$6Sc;yEt2pI5mJQDNk@zO0_M?ih9^7ESrq zU^@^^hvA^R#eznSrr3kIwWRIF3H#0=?y-D`qGJf>%cz8ralM2yU34`l9XhR^pIjZI z|70Sdxn%D+g^NKkeAVg78|(};X^f{yE<~%f{~pPvrp*djc_K)J$&R5@k`hOIuH8Rf!xKPa!VC_6?wi6Se+U@{e z?-Tn@qy3#uZl>CG*uM>QIJxx@#KC;R5*!~_C!S$`)0J6d}rFjIu0{&1;Zx%BR z`=d!suKkXOm&a~LleWV$47a0mt*a+F)6mNXM#i3rI2U!SoH+UQM|{DX zC{?c&^q>}ZRDhuZ@aV$8Ey9GK2$R`n5sje1^H^3Aap{%f8e*Equ7D6>Z2&V$JFWVj zJyZq{*ab$RLGcOsCryr5Z|DfV?bVruYpytwAIGCI>x+$5^r011Dj9~d{Fntc@)cl> z#saoz2M}MyL1$!u=$GuR0O@Yek5g%W>Oo{RSD;BZwUChs5?|xaLhVwL2NUb_wr;1D z2!^+rrk!Uh@f@m#pA>KIcHSJhWHA`#LtbAc%m7+&TdS?xj7;vt5j~b-1kWvMb>-9x zcvWM0v6pAq{IApi3BMxHw~s3tW>+^2ZZ<@uQ2OJ($XacdMDRm?$T3i`t;i@G zB4N4i783P+^YqI+CSy{m{WzB{Tn$5D-|l9vkJa>SufIWq2z0674U(qU-aW2xh2!alg znRfny`T}WCA9!Fnr9N%FkJ^t?qSG$*jP9<6GEG+^tWI$~huDH$us!uFF{uZj`7AvU z%*a9GS0wie9XI%K!UD9vP$qu@GkeTOggZXO`9*|O62>$wG-|L`7Vw%C5_4?CA|+Fm zVO!#)(~N)7MeAV8Qep%7zg2>hX-q;_{Ug1>N|@@qme~@n`9OTuBbqwQtsf&Blim69 zb#^Jq_(TVUE0l}Fv)UP?4bmRwnR;#X7UkL{mEGn~Ii@Gj%~ig2HY!e1oLe=Yds=DCyuv<>vNKV$Os>r~gy=g!^{I>5I-))z_#7;d*isa|U7nM9zIT%6<1NB47k2;wrDPdXhEyq;{K>;m0o~?No{8 z54^VnfX`1@SqCpMokG9*;efzxBtsQU_|dt-Hw% zY`}lxI!}&TXjiBP5uJp>rEnfTyi){nuDHA@$rHMM1~rp^AHQ{5h}|F7fzS}tDEmdM z&e5*WKF))Whmt*O1ivVx#H$tICE86>UJLEfkR2KFdR~u6{2#o}K0{tB9tlU}zyOstr45D7%yle%(q^P4^%;ExfH#2_( z?-I%yHg;G$p6jQ&J{(M_pSlOBU5GP30;F&S<9XmGAC;V!E%A!O;}Lv$Ddp+H9*3Qh zZ8d<+3LF*);c+6wT00^_6bfLB=i;&OHR18RnmjO+79{WMv99o##Sq=Nkw zjExI)pj8KvnAWki)&raFq(V#=6?QEnv!`eFC-D7sgAPk7=0^*MrJDf~UIFPD3P?QM zDmndj6k&rZNX}pnx1*x2C4`zshL#Z3keZ_^A>AHRQ!damn609zVYN6}ulv=z+Iw^a zCs-8cWAg_r)ey2<=#m(V%w&{W;_|7z6twfTn!6pr-A{l^gri@Z zbbf#-{)W1J7v+JDrEwU9P#1coaYOGrI#v-ZLVxNl}&bjUp!#*cxLG z>kTmN5tn=81$blQOwFSV0$L}tb|w;Lf<7ed(9vU)d{Kg8Ah^YbcIr}qNVCukS=U{d z{<*lu$zr)9wmI#PC@!U-b2=J`hJnOwscDVoReuQtXS@-)^krP}6F zqHKmJEJPjtEEw@sGyKsxij6rQTfuP{{+|ftw~D2FSK(}C9A2=K-WG08!yt~^tj#l{ z!*;EwO%q{fG`~yf$P-YS4*%XxTew+11{tZD_fBQV3^5QD%WleHh{5g1WkFE>TM#78 zGR7^y2)TkZkK;}7HX@~#c59~WmQ>@~8hbPDx*c7|Fh$%$`7=g%qxRQY?R-m+sP&*y z8%ca{c6<9sUWt}PLoIMdZ2UT94hyy5)qFVnF?OW0zN-=CdEE{8<6XF>bL??`vqB=3 zTR%DZrUvU<#D7GWYVlfwwOe#3pHeP5#Ff{*g^)Iv(V*hqlF2-=L_OS^K!Y~BUVRe1 zk9c`uycBkj9k|KzSNYTz(9f(;g+>+U@tVGmWS7`*y&?Wy(km=goW}26G9r*+echMyHxT4)WBKa8=SE z?>s$lB!8>7^{U#=e?l=iUSVg_x|UnZa5%PBApo(8K7QxPT{|OE zfG{YtaSXk={^|Pb3N08x*!#*S$p)XJ%!_s=CZ7G~*8V+_k z!RZk}%n>#r8sU|V3Kf-qfK5b2Oux&zWS%1ex#!^EAkla##`13`MvKY~6*UI}F(5lqv$bZF;gi7jt( zAeHiWg&juT!f9DtsxM5YyZm^jP5F~N`21Y9TM19;X9wErJ-4;PF)v!`GGrDDCh*o1IR$td`Nk zk%8a5$x&Z^KnZTd)?T8F|3aQ~amF^IB1-vx7Wbo<1@>sruJ<)}x^K+wayn;Ld=DCy6Y?cFgO7?H&briTX4 z`OX0R1@W^PymYDEj5PW%-cXB=&l&(fJ_#NgN>>_oR;=LUC%3q{!9HF@#KfWe95;NH z!;jt#pl-~d5S=KnPkNBiFk9Y%CmC*?t$6SKdhBJFxT$GxA|Af#aW)9D?H?x7LN7p88NWZeTdFprgEo}XHNN-9mLiOQb>b(e+!$SBN z@T0fWYPB6+?{%9G156EOaDAQK2u$2P-A6oozG9QBvHrno*Vwtszzij`fenARqfoC4 z6*N@Z$Rj*n>`?G%5afU*anLnvwU49a2dM|+mmYy%PvSRB-DIp|^xE`ETu$!|<98zA z5PigvF8Q4>9;avvd4F#NVR`KRm?qfd>E0fT9sR^|K)D=+bTlX)sHGCO9NRApCsTpJ6a{?*WaiwRe6Mo6a z(?c}ddc0(L#8nU$C5S0ii= z9rep^Wy#1aPe%?dwe|AWDUN0EGsts&1dU900qb6Sq%CajpKbS5V)-wq&Wscrx|2AX z`6vhDk@dYW4b%%$yjd<#>*fI(cp2k#4%@h4Afz%|&}OX7rB|poov=BZb)l`L@a8SO)$vwiG2>~Lu<9}vR*>^ zkQhWXEzMPw9MsKZN!{sfvl4RDnSZob%jkzc1BZDqi9@5*1+VP05C9;(rY|LzU~)<3=P#aCcHc>{rbLc4?k zw9oloXm0tOVzf=0{72f2-9)ZYwyZHOas2=Z-Y-SkKNrmy2cp2p5q6<~BiT3IOg>d< zasJ)3UT=|Q8{y1?^*%n--DcZGuF+_%ZPwqz#9XA_9>F0Wcy$ygqw;4k4$<|IRRk@~ z?O>-y@7LgNgaP~>6=GF~@yl{$5#DhiDYX1?)~6F>Pm>TV!t2P)=F->^tPO`Ko@4<{ z5gJIg4i+J+t&!dJ+1Y?YY#II%!nKI0%1bLeIbDUgk8x{s3$pBa zTi=K^m4tI7WR23T^K0zk<|q<;6e-o=9WD#1*j5c#J{;V-8Z4c$8&#%f_iC=mk>eta z+f{`zi8`;RAs=%ifqDr6Wl6X0?a;-Zor+nv&qN+tPAEh*I`B zW9)Z`C)EtKQ^5T!W}@#v6aQrYQO4ED_vC8@OoRt-Sz+HgjiL*-_XXcB+dEr`XecN$ zteFOC8xK%wTi})2f}OH3IhX&+OO>-@X*#2F7;EbYA8wus4T@+@JHm+&V$KrU{SzOq zs$<;pA{0*A?L!}5^-+u9 zW0QSnoxK1H?@>a3v+EkrZ~p=sJ%>yro;R?znkM68eVVE|BcHcg20$*bx4Mktr21pd zj@xZAIM>q1RBKsyX{UpPA0Q`D4sais1B$X#oc@^ABg-5O29o-Hj;${F-j((=>ObCUT~9v$SIg&Y<*={e3N zv78y7)U&>B0R`>jbqu(s9_LYHuc7reRMz%{M59@bfwn;~y@@w71C*Vy(;Z&C6?Q0B zN6HCCEI>Zmq^Rd10U9q~M4OI+6e(wNyoH~Tnj-W%&W1KQib zj%p047^hvJX8u^4AKW;(1{)0dY`_w{1+PYu)Gn?Ym)Z6?i0i7o>zSR+X$~`j+VRc9 zQh3ba=+!r{#D$GbF5<-o9J@%qUnegaAs9<>A# zx;;_UZ5KmpkHTM$XY2;RRHsfHFYPU-Y=R#PyIwV`pyq^k9~-kfbbq3mTw+rnVF16b zq?guD+OB*6-U3#w!&I%{X3dR5b7O$o_^Rz+BW z(@6$NPGZ`NH}^)~P!?-Cn+KZ5oAY)!tU_=W0x3lB@*Ng=<(CiG7VlW;sz?}!#h{k> z?ES~+X0SRaR;(GW$*i<@)b$13Vp#8taH+cas-T{9jA4m9JBQiO{6BZ$f1PLF5@UyS zjU)IMVhV!;Yxv%@uva-WR3|0o79mbn*=sA$8IPl&ES?#vEG^LCbA3x=@bNR)-+UlC z`<5y+KMxLWa6XOKs?Eg3{HP#}Js#cii!|9;9{%gUuM^w?2#n+4V&b)2e}$&yMq57X z=)LmmLHSv?|Y(vyO;>P(0bc&Wa{?1#0!o5#F^;Vu(-{t z%>dmITzK0$oI!|QS$JS~q2L@J6fItU_&Q;$Vl`ub>H57`p`C&`4BAEfVwCIYxFh|Y zbndIMNUYwrvd3U0dBUS>&*Fpm_&T*%Jv4I$rU_V5jW2mB9p9L9;ag4&9u~b~SOaYJfx< zgjvce-`w**<@J^D{QKl{;lXsyxujIUh9iM2Ejys%Rnul@OUqE>7d*@lR}r!U6p-QZ zZ)vxbPxEUxg1Uc%bGSQW&t~Xg+~3FR=~*mjJ#sLrjmMmFEVWu?F-xi)i+_sm)-Y%Z z-RHJjD)H0{R2IjcdvQ8HILG#5KAhtlMdr zSPB5RH^W#rRP}`*JIFTAe&{>LMV8};)ko6CHznWz>_271p6^vD9rzg0O-MUrDM!#D zY`H{4n|I26iL}KE@H>mTSj;fSHlZvV`J6AAdfdf(Is(S(IyJaqKshd8gng^X?$d&0 z;L=tQ!b!qMg*2ySc!>EnG|j8yATULUv6k(}X{)j1;FNdr#3>R#>T6~|WC^dmtrC2g zud)y*6OlogtiIZ1z&_lM7$nt=4%fh7K|gA>Rfyo&cH7Q=q4Ffq^HX~o&Y6*FH_ouu zUN~EBCY@tT42@zi67U1NmQYm&b$cCsIu_+T-tCZ+sO+#RIcSz%b@znPDNZ2nv$%8# zcx1Nr$uS-?!>zo!%f7|j3$-UtEx z0|9NI@3Tr$TbnNLvzg%>T1xhVle}9Nw|t%0%GAhgGd=rO%+#enoTbVL zWrA`y@^6;Ra9*^YbVC$CC{hN-JF5+xQ^Kl@_EvkAJqm+ zlwy;w$woM4snG^LGrR1}nEAWyj0m4Tg^Z!YDmz=5Fm4tl8IGarC;6DPBoFBmbxq4Q zZdcP(-cG{iHo{IRF)gTUVJ41!-krANn4=YfE4qoaW8Rf;?6DjWoLXzcV)P$O z$&ec}olbMTR;E~J0XUc!a~#fhd;3EPD|$ywi{HL$1*#FjnLMGbI;CoLd|r2Yqx`fT zC`gm9pGWuzBYd-+mzlBmldkGK4MGbEq;sVW=5L`IhxBk(Xo|E0NhgB#p7tSsh;^z! zIKc*j{Wj0ZAza62QGm3%PRc^9$z8d&_0?9+`i~&n+Dp8K{=78!s|dy0quS!N^iVuV zhr)|K8gKA|`94&|6^MRe*B4ophz}N%uLoJ4PNU2c>CGha37P?q!WR#-huTt}-khNk zm>P0?_Wq(cxSj~+QPHdBV;jBA#)leb@Qd@cdxn<{H;tJgu@kkuH&=a6$5a9(7xTs&}yYp)N86L-tgS712T0%;VhTspW6!QIVp`AYuC(WHm0eCInNb+ zz8vj8v(am+1te<^M7nAl=a^=zY>(%zVe_mHk>y#zmYbZ3sk^~WQR*rea%mlhyg)ET z5q?-_Lx?VcAZ#bqGbWD6Ep|5vQU6=bYZ6ozLB;EQPQlpTU1f)*O%4CLYf_jXNFVVr z(d+NlA9v9`jEr9LvacAv2OtD<6m~U7ZzN*1#YtOdghYe9 zi_5{;pl#DMkNyPmIhMaTAEiE!dDsyodyzE8HxX4Td7mWW=P`TGW%diDVrc;57)i%Q zfkg4(;S`Max-^ZTI3jhkhqMv83i0ZUj&NZ`rl&?4bqeW3M|+tC(jBOGsU1AP6A%XI z-4F+@IYq(iW3a_vgzOwzu4v#uQ1|lVb3Iq$jgZt`sC>DjMM9Wjf1JA<{r1mtl>I)0 zK36SQQmLOgTeNTmN)-h-_NXA>;E-FWH~m7aiEURD7Le5re`gzTD`9)6&z|AQYp?ko zWy{vs1Iw_pqS?6ZdN&Xem-%V+NU=RVzz-V*xQ(R5ueOlz3N+r1TH%zMc&l_2CHP4v zE4LrtXZvppZAJu|Cb^p@M~N>05=R-V3N+c&xD|O#$!aJXiT5H%*^u^#ebETN5p2f} ze~s84M%phoBDPk3{!3<9%U>T#bc-RhZtPINDFL+pJNk7E zx^M>GaCt7lFQF~Ozi#`I(6(wzyt&`Q*YSnwrZ_qbpvN{8<{9?mCK#94 ztuzVxyTTJuBMNP()LK-kH~|$W*vL9yKz$`Yw7(0pU>K*Z3js{iuhJ4wc=COdv}Pq~ zZWF`-(Y8o9)Xk5W?2`%Rbq{!b$hr++A1OtB08d`Xr(QDTk`MtZ!bb`&b4I|BD3oF}b@pL{G;YlXPqIP23Q z2=ilppzFQ*vQO3!I7t=5jXYqgKW2Up`GHjo?#) z-jQECTVu72Ar`5;e{94qX@T^%{5E?LA>GG!K7ldCec}%b$frNC(RHdz9vFqK-PVB) zLDss%5|Bii&`|+yAZdj_N&fU<8UnINiIHc}#Bugy3_;D~w}z=HjBP^ zf26^fDK(Nvb(>2*CR(t$38uv#CDWldVW^uTnQPwzVy_MRbywZAG z+9l#SQ>)_xFtsVXf-$~e2s!b2=-dm8if1v{+9bl7iGKfN>j9N{g=X<~LH3ZIqMPH`7aQslmf_X*6MTBB7Sg$iS@9{KLWw-DLQ@R8@miMZl(oER{sm|k zBuWFNRW~}DbM12w_+K(~{fxApG>Bu2U6#TMsR||V@D)7W=E2JX?&b@*$&ontG(3up z-4@+qWG}zrv8M?+^mN}Agei~va^x+peKh1P&v`6g^LxzYXtX7tt)LiYH#>&f5t|^^ z+cscF1?>YyqEtdT6RS--&2dGi4K_`Kw(Uu)OYm7GnB`Y=Oz+fzSU+`w7Wpr)e|xg~ zt1#9Xs_Gn>+@~jUx$LvxL>cE1)uIL}()P1<8>S|eW1)rd=(QfsqL?yNwei&?zg3*D zu;2Dk0^i~CnEBmFJXkZnYh*8wTAnPABD%`G`Lr;NNVnj?II-9`=9a-y(mtJ7DTw4)Si)c*P~(isRZ*B_6ii;-R;o0-rmC|`0!mB zH18SKPav{1lVjLmDu?Aa)bZ-1W``oRa9f-wZ7Wm9a9(b^>hSU+qQrKKJ$3Ukbc>7) z@z8lY#UtV`)?DgdIde%*jGN>dY&Y}yK60iQcYcE21Y z;Pqg;(_OCF#-(wS$X%$lJ#mlvDb)a4(qqNG6Q}_AYCD)5s3Fq`rg+}p5d718_D3Y- zzSeHM;4b?tXiGABSebeO`-hQ1b+sMtG~}lf^7us#dn>XXqYEYI1UNzRFcU<2Hg~aDBkJ(Mcw*)^Enxx-FH%_>uJ0iVl ztHcNK&Ha_6)NFR5dgM|3!KN5Lv}B2#&+$S5ZH;7>$eA+-&FEXmUd4_AJnbz(auWjS67*(lA z5Oz8gV5LF#I?G>)hyU{EY9I2q)3PKyAt;C;0+GL!cV4WGYOjdzz`{$Y!6dGy1PFbP$ zVcx+M3F{5c^(3{T83aBi)0Gj=UBsd?(n?|PJuy36;XWc^Y}auM`%H_AX%*=^0gx@0Kni)yeTkc#ojIvB`MEZ zpvr-!yl%CZ5XeeMQfwGh0TR-3RiACwm}{X@yC^^HH7QsG(e8q_z13;hUkGH+ag>+s zrBrY4vqx}J;uPGbG3nNw=+U;!uiE*c6g>7c1aB%M_A=+UWZ)S!&lEhvAju!^J@;cAY7 z(%iDY(<96W*2bh;xt_Qm@;g}Ix!PhG`=E&*^AAlQl`LDtcz2_8>v-|qpG&!hFQtP)^=ePo*|P3~yO_54OvO&t9_viDwv zRrBY|SdjZXQ2!)pl}6xTQra-e7%e8^1ju?f@>io%uArnmMObeWcA_N{r*x>LGOgM` z380|5%)hNJ^z7|VSKIgzj@Hex=4p(TIF1Rz8A2`tmhg9}>{r(l*hH`COaUVrP-feQ zl}vYCmt%Le1`AI#gd}8A8d$QR%_B>GZ7ngo&vQcVOc&2G(ZT6$_Tq7Pj2WD%Mj*XxD~D{!3}% zzt{=`%{KI=LXu2Apr~KO+aitEo-ZZooI&PrVXlQ;Z6X?rs8Riq=IJ)xyE7i*DL7g2 zYXq-BrP@(lnI4~uUW8s}J!))2L&o^5!mTl?T1PL2eHH~Wn!g1tC<3T+SVw7Gh;(%U zZv_cO)UsaE&2q9ZeDhZtQ%dWG8Q(_Sib7e-iLayZTzYkEN&Y%~kLHyZWR(KH{iJer*l_7NbfeHL8Wjw2RN3Rd` zXo@hzJq;zatij;-dS34ayx!+E;<7*NBZ8_S+6$f##^g}un7rTntNEOJ?K@nS~qAKJ;Emu#)vNk zIe*77GMc3qfa}}LuP z2?dBSH?sk3iC!D#>ths*B0-l^;|gDxW`>(==q0$Jp93%|%tkOD#usc?qsm)Wd}OIR zEkS=`R)LC4tdLDZ=+!t4V*7#F0oyK{7lykQR(XR@t6?AXxia#{Koi7q7O5jdRb%CVO-iE!E}B9}?7r}7^P0%@ef z20ycwss0SmVs7f>@iiZ9FVyl?mOI#fX*-(o zTnfkny7J=d`6?!t5nVNh?`L3CWX@PSoy5JaHyyPzHaE}2&>0={*+LQ%8-gz=a|_L_ z2!B9MK!_bxDd2k%x^@9-ast5*q5Tn$aDA7ZnLuPD1+C;h@4BeukMkio`YTzh}*~5;H zcY~P1fpe4$z?a(W&P-dMqXNHRj>V#>AA_V7u!I+<4H|Q+UU7a)t{nEY^jEhuj4qy8FEC z-q)#Y+NLd@MAyG!29lG*w2asDlh<_V)v6ho7;>`bH1~r3w*QU!gP_@zo8J((U5lHCd6ruc9SopENUl7f5}~gvjq`XC zD&gXC-ovxJ>LX*ez8+zfOrJ=TSVQps<&*8)0(UP;qtUGz;`OKTJQalp4cgU3f*ub$ z!>UysztwRvmm`pLM(N@R8bV6!{I(Ro@TZ%R?n9j!vdc?ycV*r9ZrI9tdnW4sPe7He zd8|@Y6I}TqG}WS*=Xmr+v~~eDB>etPLr{CZmhrJkKWg`>5id>~m9h6gr#$%YX@0`J z#9#|f`3>>!cnQv@>p6R>;P6MiP1nSg}?3_(32DJ$w};n^L+m`j<`d6L1T z&n;}7LP$^B~3HD=1xIE_F14vGLB{3Hr*-rr_MkZ4dSG zV;9VO*I8(rcWJos?iu!-%UmRfv;1QYiXNI`Kh7Fhj;)Pa0a_P%(9NbUvt$wKODsQB zMDO45^Jn9Gv9H>M(Z-0Kq&Od+oI$C|JV`Y;|BkTPCC8s|2& zZrj{!BaVh}MvGxu7W*hODn~A8TISln%r0|9JgkY9T3Z#d_qy%&>20n@<#AZK4%aK! zO;6#!Au9Li_Q>wc>Sbgs6kmegIp&*C(y-6TsIbi%vXnsg*EsVme&BJAziaXCVKp9) zcL2;&WhvqGgoTLGM_bvLLXJQ+?mdLn!sW-O;aP-WA95 zG!6jK_k9*2<#FUKP7W>r!6)&ip7zeH4jgGIh!Ix3&C2VL(e0PiNO6k&uEcMf6fy9q|+i>$Vg zeGkt+Rre&e#B5BtE1xiCL#NIPFP{_hPt(9PZkDnd;n01@a2H?r{`RQQFr5q<8t~)V zr-2z(qCQ|OPVEwa^X$4V!kP=f*K0v9Udv12Af3Lhh*av>GEoI@T9^MWHM%AgW%x=y zVEZ@a*zmyGJ28}4H>`)phk&9LvC1Ax>SC>){6hk-sJ5>>s%=C)=J*?hk`(xMkZp_j z)~I~c4q(gTO4@Xv=Vk659cJ@$O}B2<-Rx?@b@sPgZ2fg`{2UG-|E2kw#CBY@c1mpp zYdRDXi+CWUQZvXuB&d|xwrQZQe<|*sYe3kYxUkLMtj!v+b+iDa~quL;PpRmfIj;g}Lq3B-`f4?KQ}z1BvidEU)d=>lzw8Y6)n^J4b2>rHa??3_PwYqne~EwH0thJ6<=h88K! z4{qtjV8*+^>ni>uXDH7<3{80ejoHxH4@T<)qgnf0E5uAh)@$X-1kCn~jHoPu*ZZ*M zlrQQ*``oP7=&U3XN|K`I7)Kr1{me(Z#!(R)2=Ni8D~E(}92p8mt5k1X@6{WR&F!%x zi_|*jPU^mZ-he-0pVB}g85b)D3fZ@d$PEcRSF7K+2HM%hopZaBsDZ|@VHxXPPc6@K zgB7det~1lsgqOQ1rh5jvd_3MFUQWiXqd~P6;}6{0o*-F}xP!}kX{fDZG{o1`8dr-7 zZAnzDM@2~FsqA;RL15?c&P&_*sGY8-))#?2t3zw1!qV+RLM!?GFJZ1lfNq^#@rU@6 zA=1i4z$W`oJ)Lpg2`8l|(S7)k#U!AOI>q>L+$QYsc-aZAuNFVt!*_eTp~5;|xtxb4 z@zzC_BdhKAV$jy}!%wxNT9mdv2)Bmj@Q?bKS{L|v7?q1K+0^KqwZ zT*w-O?}m_#N~?x6Nm$Vr?AbDVwH3iH1ok(hQD>l07UJBTYa;5cO1M`f+@5e*AD$HA4}5s!i^(_bs9_Wv{&;FBJ~83tfz|VKt0y_kamU z_NJ)r)0(VpBpe#X*ZZ|-lUv~R@>ar;(NMGnem~v8#|y+144_SatFU{kkl=ws zEnb!cO?_eu>-8d5*1&Nc4E9UuDmrpQiz0v%{1D+;7R_tB)gtNLa_fkCCyJ*mSNOIaa5${kp8nglL{j=%LWZ2`thmE&|vB(5Wg+-dbd z&}hoe&Agca%>p&JU7|2vm?gpm;(kC+oVqQ-#}M!|&(&JC2VET|C-rx7$k&s0cLHpz zuW3Oq<_6m{pq?sx`5}<9={ifqK*x0%Y1MSTZj>^ecCCmhZo-#+kR>>uNZamTY|5cp z0X)F>?A;L{uD{M(b-NS^WCJet*GyzO!;NomPVKgg21yl%m-4#Mk?QU-)>aFNP63!Jx+(%$rO;6%vO#k-zZ) z0#c!Sf=#v`!xxbnVM1Ca#}E(@5XHAvP}flVHJ|`x=%2kVZQo^fL?SI9pZ(ZoH);9E zDRtUYw*=3G#wgg;^3;>yu~eE7idTCLBEK?AzeHs@;<Fs zw%d@$TW_m!cE%*Kw*R&WCHZQBiwyA5t7?TQ8|RX%p`z5_{b%?(5Ye?1XQt8@NM937 z--K{1*LlRS8Vb}Q8cPa7vcW&b)<&kYMPQdFP_~0{iWA7bkc@>v|3Z#LIIge_jv$|p zlr8{1@n@t~mEG4+!}C*I`gViQu5PBw^1KYmsHJfj`MzeiljPAT+w(Ox$|U@3-0BaU zy)8k7H8(m0pgRT`&^a(E)lE8qy9G=>6!Y&=Nx)GQSjN8F+nZ4n?S0Iboqf~CM=~wC zrDvU5l?icRf`tlkp+==*CnoJRAL$`@F`Lko6B*u#tOTduk_h(=&O9!* z1-|f!Xcb#rs||jX?5vMMf4W%z}=PF;`$^nayk!MBMu6%l{=9CG?n=6a+)ZCEJVLG#VC~DI! zOL`WuS5qLLDO4PwelhUP*tScL9PY9bTzK=nx+EQ46$X9t1}< zSzd}qD6aLvR#(^ZVb}Ap5nja^&29Xy4*_zwu+lcpqsoIE1r$2PXQ$GobAgLlS3~F| zs4|hN02RBD`M(L{4PPUGpk>`nGe%#I=>LpIO^(5f zFitF!0A}%%hoKj)ySS9qSsZ!pbiuh&0v*!Xc8~h`^Dr#EbX#)5#Fe#B0>upBA*SIe zgz+y@(~lbARou!j@jPdO1(jx8lF{~AcpjR(p0rFDtm8^j4mPvd*oxyJp=OFj@+PxZ zW^Hwr>4z636bP;`DsXFAtvjnr8G(2bw){KxIR{aWD+#+7f0ijofv(tytB}w}y~e zg(do&^X+Uzjo;<O52jGh|(7UqVw#~P=`)n z@1rp+S6da~kc^ZCLt&{Q%hj&2pBBEzG#ZoElN7A~s?a_+KzRHh*SV+wvh_c zt{&~O?#p5pWOUsM=<$G);e)BcH?ewkI-ENUq-rQL>shO`ihrc~f&8@F+wM{lZ7m=w_o~#ZRUki!ClXU5Z_y!HH z5Ro^9p*mHDgAD;u{L5};We;~O`Qa<*MMp6JcjXigYmS+Y>#VtZGd1zG<@Sbv7z zuti{B!m$BRVjb=BK~U}NFxuNW^&meo54SSAn@ZJ`F?Oeif&a{Rb11ig$Lb)~6rvBG zX-^LoalXr288TK~L60pXt<2j-f#U4J1;Lo=@=!6{LI% zW42k;SUVweSQ>Mi1LBGH)pc57)Mod(tn>!fMfwb-%5QTCdn04J^24a;mrPy}OmL4c zwV{`Jc1yhi^QwB^t;TsBaUE~b( zOpOPgY^+9d-ffIUBI_PAKi$rX%op%qU8nhlQnCzh`V`(;5E*@}#5`=TrTNTqd$2Js z_cK053#;qTbMaXKX(a|w{!PlWPgjI?V`@|~M^)4i zMEI89^Vy%&MET+d7(c%6sg%bNit;Rv~ znvoce(GEEpN5raElJPb)Ey;V%_a)p}nlW}Y1i@1KvO1!cl)+8m{e)?6+XMg3bRhS_Ei}rG>`+ZJ=b_yq%vo(x2trEF(wl{Y9YSs z0m5)qmTYo9X~|K##|_0;J?^H|T*6(!l68*Q3V?pCzo$BWu<+`Vz1ZSCT4v zV3{k@d?l)%w(q>bX(1mm!)5cqjYk8MKd_Z+Yz!-SwXWtvQoIwf%d-{#bv)y6UgcCi z?Y=gCi-SQ|&{W_!Sx0vGc*7$xMVG{v*;ue|%NDB;G24<-Ysuxl>5Yu`_#;*lbBXF= zFOyfv=yMe8i;NA}P$lyJrX;Qdj^6r1z4eDkF0{)Jtvy5=A^OR55??p>$QD<|zV>Ar z1EI}$4?u7+lA2~G=63j;AL_svZivEqbc#cJ@Evs-yFm~X>O>sbJa+^X(&Jz|zeP6l z9URhQi0wbxLcdPBqGw3j;6V(RMK)ri)`>IRzdG62{U!tFh7+BUbCp4GKWqaT2z!rV+@ zyLw-zBE#3@T9h2vzrRwkFLdWZBaL6 zZ$!rl1fV|K2S9OmWIj$IcX#ACdmxNl_qjWAY88JH+k1AzXV2ll))8Xo+e{8!0xED_ z<#j>2ZxCc?#gd&>arKU!V2K&b7sV*Pv#>-U6Ss92Uw*6Y>6Ut3+f4DEeIu`chRBk= z$?XNMYj!Dsl8kjS(NGcc1T?EZlk-~>ba#Z<5wsO5v)Ru zfJbivxa|@FV5>4#^=;>_|4Ji992`VLVeZ*^MD*QbG{jXT$U($QUyfg0s0!HtdeKc> z3pUDX9N7v5#5}RLiH3u$K3)fF!`#jJQ_0lnpg^Va{7DX9M2ND)I^!{V63-DGzw;3Gx3(&UsBEI-+~ zo5i?nw={zVK3B+Hxwai95C?8=a5c$<9z5{P0azZr1X znv+DE0gb8*Lw4^;X5Fxy$SWO7#vKyaSYL;tMYWBF6q$E^o9i9c`p8)}Cnhv)V`kHt z{7$3A-h8;omjBeDg&}?X>_C>!FGY+OXlBOGRk1b60MCI(A1-hna%AFeDbRrym~I;@ za2t!iW)o#QEQYvFn<4%JFjCOp=Ljn1=NflZ@Y%?E^&kf{=uPOg<=@nA{|rBJ5BhLv z!kNl{(v*JBk&Sff7`hIr{KPG^8X#oHk%`N{5+Mi#@yDfV3cW9B^OGWP(UZuYEV7tL zm%}j8IJ?7jwhBc-iGpP@k`k)%5mtn`ZI~`XtqSq%ek*dLisRiKtU$B9uT5VUdqG^) zo^ynEeu5h*28M8T;6AXK82M$=5wD^A6rtuK{%BGPZ8?{x;ka6x;?gMe=LgDJ@hhOA zXs^xDmjZ~$>bEH>6}YIR>|~`j%W3h$kS%Q=U|2N(Fn7sf1{v!%o_|kkJ6|X_`(fVjr<0c!=n5_l_uH~Ac5V6QQc2s z|5Me&o(v<s|cfK7a6T9DsQRB%5@~x;s1jiwz_JDIN-y=zg;znv3`_-r(jNZAP zDa7+_qu+MZqGWztVvg&wK$op*r3-E-2$qusfHQ}2QXa{Ls?6b6jbOWTl|zT+I(M~G z={s8;{|4Ch*^xfLTh{F_@V}!>!|UML+=_sK&WNBjqlDxudD-d6@a+MhVG9z;|B$%& zCIKYDDiI;*di!gmXE-jah3=_ZV4*Ys$FrRxWgENPo%7cX*a*CFtzTC;?lice$oIB3 zU3x|5tDw^lQy`Lo-Oe`=uTu$94BLZenTEt#NaKB|X#sd3FkllXJul6$w@5ICv3O8S zf^=4O=Ukp~HQM8(WXS>x)bPia9b?5DzJNihvy&)1D^~vzTWdn#hx1+j+LnDP&%%S0 zo|n`_`@Ch2PvLJ$?ratgqt{lrCT7>{v0=a9W4`hh&<-cHF#l}foAYhS8oOv2b#pNE zQ?%zT)TZan$Wg^-QH*72yzD%TX(HkarxO2-X1r^}HnWJoj@i*L~d^-uXae8^t-gR` z+ksXj*+ec94mrALR2}b9Xn$sboZ2f#lPg-;6*jV%_5;$DEC_#;J(Dy(7ABYg5MJBI z?|TOg+FH?_3wW4u8M^{E9ieX;fSU-Zlgdj)D(mqgl4Lg@Aj!`afv4yF9kOLq*4ne= zTgUSJE*E)jPcCBlc&;?9Y`(p>*Vsxv!f-Z1m#ndIOSHX*5gFm5^&xlLATSJocG(K< z$FG94DQ0gf_~;0n*gBjT`-^#_CxL3G@`l^6Uj?8A8OVSD9||v4j_Iz6+E=~iJJ$uF zjoQl`K5C|s-llA~5WROg%B*mv@naIL~%Z?!LkQYN&CJEuXxN=A}NnN#jIX zpHPI=PK1`k8d($N!)!fGd!X4yH`)b&DhsmwI1;jCk8;|8&yL@hXPQaWK2saC(N*oB1q;stsc1$hw*8aYy}gxK?q!maDIzxsl`Udh^?ErKqa)`mYr{gAG_~WHuqk1 zu?F7Mb(ycFy^r>pe;sZtOli8Fnk2s)Re;kKo)Dd0IQ#cbLf!ohC{5#tyC(o{;*YfO z*k@stmn$5G$a*!B!F`F=xa{#_X0BX@J1%P#%+$cqr2}azUo!h`Ww!n~Hj88T&|uj+ z2rmzmMa^*+m2UO_Au5J z&5h0$21$jbJjbIv<1xXZB!2{!J8WrY3$pfL7}*^HaF92fh@t@$oa4`$&m#=_cFT|hyYpP~^T>7u_$6xIbKL=QZ9A38o)7p64ku`p*1Lc#5IH%Ru z#btX z6GvEW`y{Z^E@*2cWnV`X=%MCz{8|y@9sd=$iYkfEo($MFWP_Vx2V~Z&vXF0@vjBa6 zO|pU7W~)f{k*i%Lq?K66*UD8wrUh+ZfI_>SKlMp(C@-WM2;)b7I~CHLgny+oq9lKi zed};Bz=LsieV0+c*0ADbQM+^4VILwDaci+bf4x@9j9PC>_rD70UgRB6%tC&iMdEZ2 z?eMu&WbOuAUT-&o9P3jSWL8hfLlIs@p1R#e#q96RAvfhUIaCh~@J&1-PC6k!y&P0f zh_2WBWIvia*S^r|&$9HjuS0R(#q%5o?@><XR~PO$^v;;_MTTcd_FJj zNUL{WdIGyisoqrzA00lWf=yTKjAsV;g9|aEVY0(>HgZ+*k%)U$=kRh z^a)I;7X<>>bhRqwL_n;<=K9u+T>zZGQZmmH z)V3fS4ZZE?iN2XtM!3 z9do(ZE=ZCH?B~g+uBsTD3O!^6KdR3iFDiDe@pd?UKwihkQk@?m%nuL%@)1#ixHFX* zf2Bs4KHxU;`5pCajRT*jZ(pZ9Mky;5DSU~PNf%Ya!bfwsZXkEO%&mPQJK2Y?DDHlS zb{Z6AS_gqgRMQ5C>O&5T$9>APMlp2$ShG|}EbZ7ZNi1=|3d1O9Qy=o8&5EKfg1WcQ zt{EvZ{T6_Ge!yN}<%|c$U!z8y+PlUy51(A^un~D|2O#sGwzDP{Mn0&Jx6pvNM%c38 zSPKunx$IpHFRfuq?<&;CrEmvVn~pbH{vZs_wH>mt-=asCld`=+pAt0r;Ipq?!Kd81 z(#~H6;L4*fYNRl)jVbplq6-V@+*8Ot>p;?K_c(311JvDAMa>Q+V;mkLe=KrCIwYnsgXJ`Y2k_D85atDQ^A4!)ho$ z+iNJ7=7bQ#)pqBw0m2u zHzm#M_mruDJzwH$|B2^oUPmaq!{P`SI~k3z991IsQzND%hNK#i`qlOnqN;^R8fOPY zZ3AkfvWvSq|Hp@)aBG~_t15%9@$bsGV=6yYP!H*gCGwF+fnC+hKhP`oT9=D?>zk_tg86lz3HcAI$XLv=&m?tC+ z!Clao_U!BCC>ulZbXqlwZ2at+m9ME|#;I3}X0a{UwD0w4nbmyay6BP0%{Hppha6Wq z!YH^wc=_}$rK-nvgaONCyc!+X_IFicyM3_bpK689{TVw|n`XyjZ-^%|T!uwDqph4q zIVe*yRl>dPB!76)R%Gcx8;d?2xK~)0Ckq98213fQs`7$+&dp3<=tqVB{k$9VX*iFX ze^0W`vhRRnp@ek_q>RY`ohmxhtHpBT(Z;3Q39-|7P5WI3VM|R?x1+j0_98ob_!2I% z4~QFyZ0lr5&mUBS)XF|p`@ai5_T(r;$$zf>f72P(4SoL$O`3V3NMKH|(|*K1NZLck*)-+rF9RkZp6tqzg#7`+HTv$aS=Nh|4j#MVE2PvZ*Ot&JkShv+-`I@M;Z)HCx^&Dk#4gDe;5_`d-7g&;!!TYdmMu zLFqtxWz8jAc>|7e++^qSl68CBHb`FzLAme_@6>xM82FLDO~Rf&_s zV(c53^*oXxmCTKR@-%H>6PwWLTwZBod^YhVJ1=RoKzDWmS;G8lsZ`X{ahbv}_jC7! z$g1oN7qT^s9Y7g&CVYdgPnC9s*>?Iu%X^n_G}UX2QQ7Z$t99Wz2ZT3SyPul8qBXQ) ztre#1L}aCC&6Gi|&UaQ6W|f!D5fCF4c9Asgq``F-h-xv%1%$vpZG0)%EElRJOX6rW zoZ=%NE(VsABF-4bQPo^yFNer8N6wqxZ$ogSdG>h5zA_f`V4wq3kq*gysHHcckXg;PYxCmx~yCm7c~5I zqMNs#iH$u?(d&G@M^tHo!q5)8rWhwq7^1XYOVQ~?s+0h|b7didzjJ^e`}381$s+l} zhox~wnyS{(({X&9=iQZ@4@B-MHsxc3|9;}s^5)t#w5$14^J3g0D+Vy!lFK+ZJ&rl? z=bIs;GlZO?a1%S^kzSwGk7Np3mh;_!+R;+3M0l~?P3#ZnbO{Z-VWUhXf*vK2*pF>J zvF&DLT`f})?khTEZ0?#c4?#9CgvAI3*9Cz`#8NFb*q5tRbgx1t4_nQV{E^|pD7~5d z!;3H*mD9s1gs{f3SmSM9sN)%SYt-KN>}Eg6`HaoNYdEus*r@4$ywCDGHmJ*2@y4^8 z2ZpTEhqLtJ%oviCZtWr-9?kw7ZK2duVjrBWj`7giFov;1aVDBmm#u=$jyuMg;?H>X zr&t_J_hgz1!b0_C-pDgE{-T?%P!bP@*@v^{_`5^Lxdzn+8*r%+6Xm5h6Yl~ev6qiDbr9p*;@w6VYC&iObMBO!IG0=*5v|@216rhVTY%5Lh2m26wD7`!4<+pv+;x)iNrdpL0mI~r?cwbtE= z@jA))xRGclH}Wta8L7G2pmxyXox(>rv2Zl7*7Bp0Wh~i`_y{qx9zh?zg*%_7CJXOc z($XsKVdAEIx4PvTt^!tf+~XJTGdu)RLs=B`q z?1?Lmh2rD|qqpk13)5XOB?ZO&g$rmw$?6!_oTxQLHD)j|$na2E}eVld(VK*C-loRlN>>Rk!Vo)pDpLs|add2^lpbPgf;0{fy> z!E!>gAHB@8V}`wRa?Z^(bNxpAuou4K^3HSBFCKBL+<7Iu&%r&2<8nas zM0kjg_@${v-x*zkTY6}*><|>fc)Syd4FWZwQTppq5GIon2nZCo8Ah#>$7&U3=K(Gi zpVgy@9bc<`4e_hVvVSJMcK@{FeO+c>=~na5QdGUL0}Kx~45vVO=UI7z$2-pI;+Rr> z|6U!IR2`@h5AYEdrt3$l4s&gNpMBH$?2@ch%@1u;)@J)sp=bnOaEsfj!$Q=B=u$V* zXK`6K;B!IHfMx4iz4pq_p^MLC#FH{aG*+gVqQfvKgt)#7+{kxn#rc@?Qrv;lidHawp!L-vK8b?Qs>s#%5}n6o7{8`w1%; zut``Rl;U;CjB`HZmmiW1E-?%QG%UCsVL4+>(g)N*5_SmXy(4K+ z#Nl18T_!4Q*&|q%&pB(Aw$g9>N8OWeik{LvAEeaNpi!0yY4Y1qg#KKAYQJR1-Y7R- z*=q3?wTm}daV_JuV>vX6L_T1@lBR+YJYcB9ui6}401 z7($(`h&DF4EtDxcc_+=Tb^LIV{kI#l9Am+sS$?bSL&;Ajs=J(M2w^T@MEc({eu4bN zH%~@%Ukz!o`x=L#cyG$KdENLzhzhLqCB7T7i?VwSpXET*x%@i>9>diwkd-!GZa-!h z98D<)sRPE_f^)r>yoS_rP)`n=+$+pA7;BeNx3Js1@B=wAKV#tbmg>x3W~o#B)IP}d zzIex%eWb-}{Ul%5>MX5X-bspmj1o47&uJj<=XK@|*&;Sl;7ixYx0TSyK)?$^e{4i} zF5ors3uNL<#tdYFh#QbP$U=q%@Q8Py{aq>$Lj3f>l9e`FaW~a3<~NyBm{Y}PC;?4Z zfVy>(lh8-Lc6J&vQw$ll(}Cg@bJSN&B*raWQ521IbO#k?aG)7p987pi8E0DL5ck<3|P{YiZSknx12q!53q$pI->r1 z+5bZo*MpuBO5G9*e>0G@;E&p@7O3n)J>3~^JeZoq@5A$2`PaFki3_u-&9&gPeCuOH zr!R_sInL5c%^K!eh;39(jruL2O4$`{?qK2?KXu!Z=pQ)~z?GR&_M zlyKkf+%mN*LL!?pPoBq5BbTWSc1;eBU+?zd>yP9KWcFx9&Yy5uv+ReQ6CLqB2?BIyRA07aIlQqXik92X}HW z*&O;(0JSV*JImJf-YeEQl+=NQX;wwE2a!(bNNUpC4mLW7Xfr1hUKheY#CZn~9Z{tK z=TeF6OP8ujF*k{Bxky<3sq;>!z*Be9_$%KO!NTZh3Wb9}Mo5zBq~98>rCJ{Ot+aUH3tNcRJ9iP-qK+iM3Gjq>1qrXJDY#{3AS7 zLR1`^@FxfPCe)#K;0|9VxUQ6-5-7bIe+cSY{|Me#MvV<~`ztw#o1Iz>?jnTacD37W z9*`S-T1?J)n3X2+nuNpx9sYZPVwfu(I{GNh88op4E7CozU`q6&pv1y!_*3$zBrrGN%FD)DV!^>-$gten z_aws&C05~DVjplBo;$!G<14hbL1FUWE4{mwZmHvP2?`SOs~K3+BQM!BLC_m;@t5$e zzSoLKC(#Yb(5fmM_=R!s(Yr>tNj^qRia%Xtp@cq}mUrQ!cJNPdHD#?N$8|QbSq{ou z&GZ4^iT`jFlP)OW(*B6>=`@CbG}WSRDJJqV)`^Op9JF6%lqd%9P`A=(991PKTEo8{ zD}ee3D^JPPg1&bY_!fSYwHoccyOT(*UKl>uRC^bhHG?h4@Me?W;b^?2Ltbt?x!L?5 zxX=e+=#ZkNvBkX*L#|gbU+tbLTe{H#tB8B$3wX{O>@WbsDN?cVIEtGQ!74OuTUW|6 z#=k_ZQ&b%A6e@u}2Jjd9ltQ2IYk&lNmKr!li@=ZaO4L^a93xEgKhUZZH`DSl+Foe} zGc$_bqwa<2Vp;OL`RNfl_Z*<|(nf~N?2H=J>K5yZ`f^dORW}L8@$S`l?m~?5fL$4D zQdT2dU|=41et}XGpl%rt8pM&`zQ$*lMMqOTR^HUXA zY1XB+y@Y;%=`ObstDVHcF6+lst0;%p*!j#K@~?i`!AG8GgKyijBMTGVcn>M>3j8@w zb;6#Fcs41*3Bs30KYJ$$&I?HPtLLZ!TZrD|TMbodz9n`rgR!S1Ey*M0pWABfGd1iz zzzPu`(Jf4$(4Edf5&MAvsufs$K~op9v81k5wVNi$E`B|0#aX0sJWqU7G$a=_9k1R7 z!50qT)YD{LgLcK^w&vE=I+5i^39zKRjDzXhVCI7URJ*mM(AYd4iT_(5+{EL9Io&;v zm*uD?a4=pnTaRsPPwmMLudmYUfH{k-vx{7fmWIczjqYRTm)r<(e3!>Y4cfe3{L|(X zi*slX_BRP-rr1_>gH>+eYnJ)c*x?%V>%IDqo??i#{X4UHKn-jK7hF071i;moXQ z08tGj#|%SES1bEQbBOW#ejsLV)<0tkWu- zlB1opyP<)^geUqI+EQe;9|=CW%p1@2{4Zh6vx7F;Nvnt<>P7$5u}?0WVS79pg=Ue+ zq5_BG4h9qjLrrOz2b}li!~2;I#%et{Zl&qC!{dtveZ9;l0?40_+vO28_D{75^{#cM z$clN*R$P_K1PiKC8D6P}=#hR2pH72W4KXl}LWOjVS{&}~L&V21Mfy3$O%JuRaM3&!Grbix1i(CDcr&JrUXqM0y zz+5Wgd;_`(boDGBGF)QONXS#foYHRleMX6y$e3BUS+puOEElVf^6!G&*@|!ly)Vw^ z)ft8w9OgN8#IO-M!9=#~WZX5m2TYwzvG532&@Y?f7))50NhH0(;8}29rR|b%Rv;;_ zkD75ut%w<`+g*)={K#!a_{L9Z6R!Muf$;&4;JKer8IDVlDPAjJ=e1_i_C794TXbZK zZWpfN-zivP8V)$^*5Q(lV~c;l2oT%hG#{`F_ukGHghtdm4MVJJ!6~udoF#g*vA~%U z*kXQe0|MhtOh27qL-uZ?otaUp;M!6Lan@(9{~=}<7>wOPk| z_b|a~v%XN{SYEPI7^JFJ?}N_sE}=9fd2;6Q*h~His#i$5yR&HDq#|-On1gy`?h6$G^~6hd6SV1ad+otO3X|LCg9@UDG z8}rZ|Kt((2A2jc|NeU#PRN5JRX|Gw0IP(834Q3iefk8g4j>4W=9G^snSF{-pMRBe} z!U)?_8&PTykyCREk;1IGA+aO%Nql2XdQ+1Es5C#tgs&(vTq zxMc5k8`YaDOgWk}LR9pJl($@K(Tx(?O86!ih~-3|L&#iOap&v+ZC8@T3e%lY-szgu zE(ED1SQ?2x+7_wjuTkE-9x|aq4(!lOAT6dQ)tq8xbSFF}AAcOGv<3y=>O-@tHKkV2 zhFl7LIlgn5>qcV2Duo4>^dka}yUBSRh~gNQD-!AQ71O<(_>Z8jSk9pkB> zwz$EzI{9hUN4fnGztm4$JRfK9_z1>QeIiVlUR_N629}{i4Y$7}k~9sQXn~zDWHIXK z{FO;sVpGPSfMY0c&a|U#)9n%@S?j_gBt(iwXFpVeX)4<%UZ2_-LjBAynDq)@;RQE6 z84UEn&cHL!oRIY(>Ks)~W}_CrZ^R#0!Z}5n_Lt=rsiU2)Gd|uFd>Qp9SWl~SYsFaC zg7Ajtu&h2{$97=^h)#nMbhPib4PPL=wdlnXw_sH+e!2{|RfAZ;hlW{(22I8JKj40~ z1E#;j`Ke_E^omVSED zrHY2_UD&Eie2$OW?Kxv*Mj}ptppMLpvZ^vO1~<1W^V!~K3q}_8k`Zr!Zpbyi9Zw{L zl4*rAD8+YI+4tI=!Olk8NE^n5bJhx^`xuCDPR3q$xereFQHnVcr)t_SRnDJO8Hajc z649e@S!3k^r9~jvK{h9B_jTG-{zTLl)4QrP*kFfXo)EB9M`%O$6Z-&v9}G1e3b{?{lkX@nz$% z(XvED3n7YvwrtRjN+C+1Rt}q9QE*p6U4B#Iz8WxT$AzRd#ddfn0fnwW>~Bu9?vv9n z!B5G9C9SC0s+R_>n*H(jLMYs20~Th)u_lIj3x~4jcR;ydf0E3{KBG)pL#^pP4DaY1 zX?~VRn!f=>g=&mwPw_%BK+(hdLx?+npQfdt5?oNGJ}{3rzg)ceyLsqWUIUxQrsq~( zc8kTUBx6JzV~nttn`@k%>t>k%IPrY?LeHlcrF^)i?K#q%IDPRjY3}+-Pf))`xm!$g ziU5L~`+P#;os{W3RXGS%xf#J6hkD0-R!m70zqGbn4V#xG{VkaHoAT_@*n|j@siO2| zqsg!$0L~CKMEIzmXR8LH@U4eMyj8sTNyS3g1VMB};~^%OABQlkT$@Ifmb2R2tVqwd zyw>fgolUg<*jDNAJgW*CTb9YOUt!m5v>&auOB%u`(W4GTt&&yojNmdW%%U_Y7H=?r z)B%K+>f9O)dBd{f<76Rx+SP^)U{-72=1#R*bZp-2}4 z9cpo+r@GlA+y~{+ETcz1w!E)#LoG1c*3;K{jFplYb81dnl%M7mi|8Cl@RNSruCfRLqlMEtN%8+3nrDM@>D?F@eB*DqGB4)9o~y9)aVW5e%g9 zIej)cW#wJl`}jt4v<3@62tH80XC=M-0repenD9DdX>cC}YJaT54y$(tHV-}e9nzc` zMvVe-H3B};*q*UhRCsCb#!ZR@X>HX0>w35N$Yv_Sk zN*ZSS`K%y=04HRS3B{LS#y-(a(_+eSVVZI}LB#~O|MIn|OQl+x6QXSar-MIU#QRRz zna*tM6%tU`$C+NO4)01ROtCKEnwdRN2z9f5MC&q>y4sUV+(PkQrjRuAb#P6ZUimnj!E1 z*(&?TLgt5mw)gtFcEXFUTa?<(U2L+_i0CHhzCL(zwLl#L(sC_O-c4CR({a6&ItuE5 z(#(qcSQwn*3NQ1as(aD3?Y7mBtRNe8ghY{Fx8)BYo%zcFnkd@u5O~5@G=THI&HfQ4 zJ$N8v4Q?Lm4SS(Y6+B1}IWs1*bZZW?44_fCg#0*~cXzfc1;W??zKcY$Jn!&UK*!wh z7jN)k9(pNv`Lneux*FEN1^P$qvVlBsq7~w-kCe046aeB1G6(Ruw%IWS@C)MCDZ_9` z14tF*pkC4ZH)`N;@_Ay<5OLV@Q6b;J{~jW~2=UCLLV{9ex86L++mwYv0HDot8dLQ9 z7Te2BSb3g2Pa|p*OWTKG_2L1)?Y~x{IL|fOQyEr>DsA}*F*X|PCZZD|)#el7rN~;6 z7ED>eE(RVk!548pXeW!wvr%h_Xp2$o?T3HdYoW1uw~6`pD2lJHvsE*3T=QP`2=FkzX!y98H(&W9DagxQ%az0J5TV|8#hR`Uo1^iQ?tfL+fGO7PPP- zlM}>Y*vUXMOLac9!*<&kTyIk*wsvI`O7ys`dg7K}e{=qOMW+_>JcZh`m6d`G?LveL zHRGoB8!yXyOSS&R-+0x&?7)k^gKn(^_=ZQydn^!CcC{ z!W^K0SFbt*UuBw9r+(hwQlDGVPrO^sk^^#=Ddl#r!`{_ajAlX7foY{#pV(EpgsJ)T z_XPx2^M%yeqErtckdFvG!|Uyedx|wg>D;+)chyZaupkkob1?)q9i=QZkF;V5MGDQ@CRtIrVO za8Aq#K|ZBoZA`1Ee|`$}9#x|7Zn8EGW+pU8hbw_BdO4Mg{e{iPAF-JEnCE7zlvQ6ijI9Cr5| zMu!H>V)KXO=qmBv&rlbBNbGzkFTb!6uc~5anNyyuNAn6*Z}!SkKJ#8QQRP{I|!nA(eB}*uLIFOoWfBVz=6PX zi1FL)NCbBG5mH#6)!o~Lr><(VsnEMyK+?C|*C02$2o?Ii1;ULy`6N3uU1Kwoc3(Hs zeIevjgQDDuq8yl+X^&IZ)fN-Ar>ruN|lp9b;2^a&SnSot{U5_QUp~dbh^WXcl z6>6)G!jlqyJeA5xuEWWzK2=jc;%VbV%@SLIV{LU(T8z)WD{1$t6FTJM+kFhvvs*00 z4>L`8>_32dQ$BQTq$Z$2TsO&&IZ+))Wv->Lu(gI@`ws4gyklo4O)eh1_7tW<8neNt zJS;&T){lqc5;lSv#xF%OhaN@ zvv`=pFdx3}Hgz^lAnYH=JyLkT$Om>p)NSYs2fC$6!wdQ>KO$`k4Roqhz)+hmQ0%K( zfiC=9=G6)ct)(7x6|_t6SK<;jVO%Hi!hgpi+PnbQL$p1C>#!NlWi+mh&>}#5qX4Cp zl@H;zkWA;vbT)8^AFH_8}q_to!ot73faSx*X!gAtmT7hyjUh03qKu~Qt4`O0bU%RGzvq3IqME~ z;E*&a*%KWi3&9t;ZK4T;IuUo>XJgaM0D3JKB|H@pwfk6frZgXK0j*oLxmC#qNb=|$ z+YOb>PrZhgFT|*LCDiLAjVY(? zNFlE;$SAsOa#qmmPR7^Kl|1CtK(T;)Asg)P2qh`i1aqAPE`gim6$%a{LOa)#M)Knb zYHncL6V;H00FPB>Lgxr(O65~6;`{d}>7Vy^tj0Wu`B~7cTIwf2z+Q*Ap27-MhOB54 z_dzCWo3iQ*&jZNR_49%#Pmfft#>&MPb@88JguIl`Nhm0Ty)o4lCZ^N5(q&5!P=ptH zZ)lHzKF8dU&xc;N_CqLnoKz<2nc&uT>~Flw`4fE6d3YKhdD>T%uH8a}KMDa!pXyxR zUll`_T4JHWdiEZYmK57%$MXcBCvJqz@V0FK$%$r`e3MePHqF|elSkSMv0DP1(yXmw z{WQh;r}<6YyZ0dkhYzdaF+-9 zK1fl!z5(w#)y6rj?dk$I@?1Bem}m3XU*JzG+#fFWqDJ{u&q4K|yKkUBlruhH?-V#0 z4O#+?6UT`UtI!m6?}V~g9L-K$D9~rx4gCgr@hsQ86Xj>)_|iQElQ1syNA+H-H17EB zkf_L#2JC=++IeZH+v=%#tU~A=cHYH0rFVIrdLL+1;cLju&h>mZ|E7|+@Viy2Z1%RN z)6h8fGyHQ0CP@H!#I^1?R~})}NQRSGwhtCiw=GUiw!%VN+GM{TfD)>Zp&cPf#V7!WhV>|l%3f=Esf=y&6zMPo63UU^f)+IQ z@?bSlQrvc^`UG$IZdM1hv_kLTEQ%mIQ{+d`@FW}85~tUcUcSIit@GwfQKLx6dR%&& zhJh)wt4dJ8*gGT(gA}a(@bFU%*)n}_^(y=71TwH+*-E%>7yhZk?E(%>OY;= z=>D$W0ZrP5!3yG#s3l=#wIkiURt3L3N6cI?KcMALP|kU+$uKhKc=RQ!wTN?LD~mQ` zNae^h?IRZaX1CEk(Eq79BUB+zNK===s;G2PfoQeN_5C}~a4twys_ zez()O(p!vphsJ$gW1+phxE~)}lRhU)oivp`(cbS%d$p#oL$LV~j?*2f*bMyiE}NXT z^1j~AjzLfir1f1q^+v9^JLTDWGdX{8Jm-YmiK6jy1ePA@AZx9(Tk%U_4qMf<^%1?O zflKL6M0M`s=htNDN`+nfn>`*4iC^4g0`Oj7?}Duc+1o5FcB+) zja4{lXKDRmRVFdC+-^0;kepT{4w8w4eM{|H2d@M8=#jeQN?Yu=Tl0v>EX8`3++$=Z z7M`fk&K*L1#^P$#PEUa(qb(6{r%4ZLVBao`?h;^Puw80Y52za8LU1^<4QCwvpnWbu zWfX6Lr_*+$vCsWM}vy)QLvI3=HjlcCJo2!bzh{u3we-{{@2j7SaE7*L<1e5l_O%+Q>mB zAR<2})CR)CRFVs4a|vf?)1q?wzU$Wchet%FfdXIJKU?jS;bn-vkvn{sF?G2L0)|^f zZ^0YML7gLws=^OKU8v=x*oM+D)}P3eR22hpSL-vb4pW-|3((X0J9z zP_TbOkF6sudPpHeUSKrcbclP5&N*tQ{ug}NN>tJl+jDfv+0-nk5Qrs|Nr|S1R>icB z>pMM7Zw`-umpTM~7OHma0L9(W97IrY_c23z9rjnMu|4g8%^zElNlLIDc zn{8aev*g#p20ZK*Bjr%jS$ykRRyAaW{VHS@LHULgNjo})o|Rd~UW?k@?$St2GNo$f zQHfmEGEqB|SO!fY35N~_N+{bM=qK47Wd6r3I@|=(+GJA_QnDs=tc|bq zcx%Qd3gAg7fE|44*E04soN35TU*j_w&XIYPT+$(J4sw!`rhgW*To+i^r5V*5k zpUEF_v0x*J&m=8r%JduW!q_Ilx?G^|0Yizk2|DtR&_B#AAAm%IT&^7H{8FpxkuV~2 ztF0G%OA`<)_G&fZY)fR=(Eg@D!+}+}JNit%gYsyV#2GR)%pdQHy{!eT-`53Naslo- zTA1XRSU$h^Xq5WGz4h~2S!X-a+L5btce2$qZD%^(Dg&rUncF{qq=S;$kXgjILNIKf zwOK)v9TTr<;+2N@@gGQU#4$eK)Ik=ovtHHjf7qWkI@g4_VscIteEAV?<1f@mRPtKz zaW>V78K2EpJ|ftQw4g_j7Q9giNj0*u!3uPYkLf7qo7RWSNX#v5^SJTyOkgK` zT%Ozd+liVy=cdOT$aVE?GF#VbDV#lL8_}Xz8hN+n#lm(h2K5pe_PGY`5YZ?c^~bj2 zCVau68QURvgx~8E`Jc(bNEwy7t4RlF^5XZD<~G@3qMrt-$uGjLnvss~TR~|jb?5#v z4o64|4K_IkiSB>7Xac|IhESHsq#kk^KS!QEx6j-h=Ea__wA(p-HYvMq?+tFNDytJ zC%g^6dI`Thk)`+(G8SNn?UN#X^>;j8%FNS~_v9_>Vk{0tbXhCq#zY#kUl`{fx|Z&u1m|e% z0FwMLIqUNSf!9u3=thm^JfPcir zo=Sc;j)yB!f?r_290E1f*iD>1BELTmN`!WYn5=1@GBbIb+RQ*Y!19_vP^-nB#}N?E zfz|97$Zp@Vgp1-vR-6n=32EeRKNI@b<%Ui@gfKG7X z=(XGF`57%HI**wGp6+TQUfDzKc6q9g|03UylhfwKLSO)BE8urSO`{DFV|0&68tFi(@q$~mxR>^fq;)3SyW&C9 zB99q(zgcZ`xrLC+fnLT+mz&Rdrk5Xj?e^KWihs@?KTJvtS~Xk=RsFm{yQc?QGHzOr zv5{~0o{t11YJt_qa5?rZEoAGLc#ae_{MUdn$b`#CA|T>>0H>&(`J?SIcDu*}rGbdm z11SPU2!Q>F<|=4%b3BGfp(VqVcAXssa^h0RTze|2od{EXc)7r?EsFHx)P3ufAL|e$ zi9X({2!-Bh#o;D9XhX9>8kDGq>a}j zpU?&X`ZI5@y}! ze+&MwXi>DHP8~F%;EfEK^yo9YHDepFusRiTPT~*0&xiD{cpbK$%Is%f1_6ap zJi%*Sha!BOE1;|PW$Lgw9L&uSS$3jwMLXzS?Mw8KlRg>mdYcnMSpUP8TG z%0Xv|ThuS#R7&%b?VFu2Kvd==Ce#C>a}bg;tly3vAl?Z^7xFfO(dS7_<1>~|&I1n^ zuv0VOqZ0d3n$Ch!`$h_dDMKZiA>j7xgrVV9K!6MBjao}P{xPDL(9(^(@Vjam0ra~e zxXo6WW*?wf{(#%cFuf{e)_#ng)@0|&iEB?vSxr2`{wKJ!Fjn$y`?!M_xrK~516qpM zi&=rCc;LP;&o!prYDr1aI>CXwMx`AW^=9F0p^moVH4b4I8djuRemts4T^=k++AWIT zqp>&GMXPj>#qSJqj9vY3yLKg1T1Iys9?*K3A$paOT)8_K`KsL2C&y4(&#T3ud(FzI z0;mZ;UVy#<70T?nE^<_jdNpWf(jD;oKW4rBg5bAdB|h3G6>>+BglxuRWrwG|s^?$@ zsChui4cMeodFp9+Ep`ywy#X2o+WW=c*q8uc;S=iD%F!+c3Pc^54S{6-_68d_U~Ouy z;TuLB zixF6Ulz^uke{3e5NkI|$p%3|9brxej_c6<(;|K)SOxQZhwnZ#BM>9Cr4nab(q7V%( z=tM06NQXpnTk(=c*qo$V*6mI5C=ZaPq3$(b>(pUWXssMSvGU%DS0p ziXFP-u(}`RLsZt@;hwv`6@eATn(ScOTCAMBlWgYG;gQ^Nst&1sO^kJlbF^lVckTwCyhZmWum9MgIY9J9W ztLMZ2TUx({QO4|o(7XrshNRxwTn>fvD!|v#HJAgJK2jL`OFs}R^6US^b1eHe>J01WcsuhJ;0Jii$UK889)wJ&f z3g-hc9VW!2ZKI1Gv&GvqZGeTH92Lqw1UE%+qnLJ>6p>aUxAjarIkX+`$pN}YOGLn) zj$mSa)E;y;K4hcLB2;{cqEYD6QVvIfT&?ExP@MipzyN|#XOX(I#DD}549PEo*@qP* z8|0)v00vayeOjIKxzTl7A4Fv;Px9wrSh?Noco0pJ)T1VoGbF7s#FEAf)s?(z)Uk+70Q>Y=q!@M_zwtc~ZLobkCp)+DfmE!w{AHZe+&tw%yt10jM5$SZB zo$IYR6OG0-?G)emAZ~DQc#&zbtwMlxmKP%I?pu3QkXvqty;bwM-fe{z=I%L>%qJIZ#p;@yFK^rQK? zq=z)G1P81~aS&j_Ax%GNFflKRA@&7h@6>mJ$KCn9ShB-{VVZ@x@lcb(7oV@)>>oN6 z!vfrL_TkBgbH?#2I48C#)X5P2YPU&ClkUO?Rst^{#}LbD(>hv)xP2iYkpTWaA9JOT z+R0)`t|GGw9RnVf*kn;a4j(-cA+?2k14q)6RIZ7TC?-b}%)R~3 z@(tTs2zvqnx7?>twv4|<=LDaHV2%H_B=!S1Q` zG|sSIoDx5w84nWYiFaiOUgGcH2_QKU$Q`xwU5Fb-+&v)fRObf?&*-Ktx5JAUGVg{W zl@Zcxg5dUhR*L1Zeizv|y!|n^onpL3u?@_`@HpH^bURg2IT%k~;*wmKlw8S8P{>HZ zD|Wvs{*S}dAf9kSHu^Cei&^2O<*WaTuYRS>EoH@w6afPAyq-R@V=d}U$8H@hv>f1+iM%_jg^Im8Rt^AsKyB%cB9g?#Z-w9hda)r7=~Ib>SYP4q8PPm zKytB9q?DiIJe#d(M+?n}%YaMqCi0Uqn;e2#CPvLWXD<`xZWQj7Pi6$7_c=Zm^;aI2%w8zj3O|z`WyVyPL^b z3qW>xyFzvjCUgJ+|5}H8@O6u9$fgAp5Rc5bKAC#71eby#jSwP)_-K7l(8rP+kyIJ_ z^`%?Xbh`E73=W}UCP7VKz*~o+?Aq>6zwyjq{Bdi&b+xUj;UV*t&WIKH4bNPW*KRke z(7K9{^*O+G2chsopA7`ywH@L3E4xljLx7;e z;~ipLIU>0nWL%hm_{6$~%VuuX%~QNX4Q-4AC;|<$)I3EX{fi*4gujp!qZEHtnNlJf zq{2p^AL5@Jg1@pBsTRinnf(gV>yJPc4=$dAlgh+gxGz#5)Vh)e%Cpt3q_5T)V!kiH zMAtWY<;807p)!ro?#COWd7%~yN42j6A?!V4bhfLINQE0nvTkEBw3Z4k6VOMzGz|t_A!7wTk|Q z47mn+d;!k%Xv|PV(jteg-SV<5#K^Pv>0(bSL&+P|ss=Qg%IyOOB-02)#z&Kow^8_5 z`?eHK1mEA`6QSN#_`#-U_*@oS0xr|4W`IdTY-Dj4iL=J8UW!u>!8z#^kAnWZR%eBi zS-YHz`Tn~00bAk7Bf9017KX>(z`Ij|MTeYDjSY{c!-3AJ4!fXH`gC5Lc1q-O4{v%I zjirHpvh*y5=&Fn{>LUI2LR7u!{Al4z%4C-i)&WGgSfmu-NfM+IFIjID4e#HF{F_Uo zTSx|oE~#@r?0=KRcW*y^m8}n2i4Qv4^{OqbwjaC2K$Z5d4njJ{_=&Zn4u7E!JIx<1 z@P*wDmzDOtjrPQ9z*hbO%&;GtjX11<=5VIpMzNCJX%J_F9kh<9`2%Ea`EIC@{g18> z%O=v*fCl}Ve>YRybtu^9(%I21;he#Zg`XS+{4B!>lyK-;_31U#BEQQ&8R9(^$m00v z&umVeYsOmY6a8@#)5VFsVdGYtsxK$VIFxMf05V?qY1R(NqG|s`az|rqftV9dfa(!C zt7a^y$efE>wQhA2Dj>9Y9q(3&f7&O(Lp^bkP4{694+yWaY-6=^PODT6d0Nh?mJE$p z@s*r&VuNQhuhV8#B3J+1g_(@AU&0fu`A_^9`%m~7Q8`JI1htC!p&-54j5_3r5phjM zbMzO_L$CgjAlc_xC-KMeOU-?NI^;wf$0$I}r?w=Zefz6LZKsh^G~~ebFtv>*-^P1| z#MllI^yqu^*|XWI4(gZ(*!-Lyhch7FHKGu#x>1+W-rZQIH=|1t>iAAvi^;mmD2McD z%}pFG?Tx**+>n1dbvnep!tl&0pe=_qF5^=#%XRnd(u+Lv_S09`@*MmBe=UnBt3z3f z>~44ax}r!UXFxr&>yGxdd5hlRoAz0dEo+sRO}-MFH)L6+RN6K_R}kj?UWKgtH} z7a1IG-4L3zFu?xzAuO#X)`2I2g&2z-b!&lcUe+~+yp1Dzl6uK3JBXbv3Uf(^7_$LOE38*jU?!G458N)Dn^FFJ$!sGUspRvn2`jhk5&U)U|8{=J>Q(Z0Tl zq_S{IBFC z)}-mY0AzuuNzk)&+N{b}5j|ff<`CaLl1qv>UCM3=420hF)jR|V>L|7bJDsnEXF8_e zg|IZQ)b@-EfhE|j?MSmhGTd^y%ZL*GHfs!S(kYaaQNWj4ffM9?3E&zfj zr+xH~P|h$qLC(P&P1J};5oH&GK@cdAvSr(_2Z&jXB`jd2oeuy_zZHGz5nyH(lxTAS z1583xwL*rM*%?i^;L0#wV?EC4CjO}UKIEK`)hl?X-C27(1N67?8(PAY^G9Gd&U>;| z2JuV>;h4yQ!uAF-`iZ4*O9v3y0?6p391ZETsYM+U!#t#|A{uhckS^?iBO)(#t2wV# z8tdgACGBoqWvRli1H{wC0*$mf>*W8NRx@6k|{d~dQDh=A`e@JL)lpC zRH~-iD&i3QnSqc^MxoL+X)xecx*o=#I$d3&%`v1zA+8mUMt57v`z5F2wG&r(=LWhT z6L?KUxbvGe4xEn(4a;a>qHjaM=2JeGXR5?~hCPf~1BBf|tK@h$pDqLdhu3Cb1bpnw zCoE2eSXqGKNte!ahG(H>zAj0Bl84n|z+tZ6Ru!l=ga8&*>ww9GG!A+tdjXK(#O!e6@q8lV7(VZ`bOw&kt5)98kxAJlZyQkE z^&R=hTBb-P?Z}syU1Y4Dny|fMy|R$bk16)8UHNvs8Yi^=bQIA8xk}1->^`3rN^W zjI`~?GyM#(fK~{bZw9E`*n-!`3@?)zenyt1h6=U*s~eyYG7b7feZP*){jh`10kOG% zc5JS|=Ko3OQWJnh*@u@Pp*%|29*qHIa46c&MOTFodOSc_gRuS- zaU#=aFLm%*<;X&&&bq`FABsr5NR9n+;inp-D?Yn0)2{>tdfe`c%H$&WKJm6w>QQi& z{ex<^=^DVB{S7%ZU?r2(8zJ~L)qafo1~MT&e^_D;Ti)1z%TH#l3~Jm6a*=5FbEK2f zA)rS$pgo^qZim5&zOF6Jy>eLEw&82FudKy~4AzY?+-Kz%8Ov`|ZcIf7;DaxYLJ~{O83#Yo(@y*UwsO zgN-NCA8m6&n)Io0hS5PikKvj)arJa5lU(Vw2_1 zSGXnd$+!*J%gF7;5aq&y#o|hA(`PgFH^`Rwhqk|V`#Ex;{{1Y^3w5Jux2|wm+^?*l zC~upWqWn!qS0j!@dSWI|@#fwM@99G{Ll!h6np)QPX0W($g81=DE0#aW?Rn)kZBlF! zL;mJx%#Dag2tCxwc2W%BC$vfNT-U8M)dx1Ryc?{FeamjFW|e&r@zok0w-Aa%7r!cq zdd004Y{erYA{9y&hOKR78}!>}c9pxPezTX%-9gk3$A*U6AptC!p(WO}p#j@$GooQM zi0`d5E{YPsCs}}l3_ff9X0c72;Pu+*(k)@Jw||5&6wWcw>y1U%*TvQe^TSt_eU+Gv8o3}I$V> zkoBj@PW~*(?8KKyW5#0m7ufS18hZA)k+YrUsdogcQpyI%e{j!!?zMNTn;5^t^xi}5 z)b+dUau@2)#_Jr>XP^2=Ifx$GHyx&@fjKP8TZZ>#5fs-t9ad`UPwt}q!plMyMlCKt z)C=mY@Db^b7jo?F5zOw*Y}<$z^p-uX=42ZlBWoqwt@2$Lo?zXMacM}9(iSm{r4JqU z_Z~GNeO+4gEI;lhXFN~CdVWgLd3I06J{82ylD$cdT#&+$t)7c*2&%v%Mz}+kZR1_f z0X&{)*LK@%%!yZ+%Gd&4aHK>FF`|I5WKYY;*YNj4?*v0WcjT|i!J^UID*by=lN4c& z_V^KaTUBVU1J@jeQ(oQQMX-$X=dZM|c-zf9&!K?FeCJ}`Vy%Jv&v%vHR{3J0wBtk+ zoevuCQ2-OR9}?st3;2UHr1}!rMbR~KEc^3IWm$I{;3zQU_9k`1am_eEy^%=KWEZyt zQ5$8`MQ)vRKVJJIyN8le#-7lb(F5(ts8{ZHEQxDWXBL{?T7Hh$uH<$%H#+QqVvOK! zY9R}U=ZzveaL-$Mq*7qma8>S%2Ub^XUs0ircb{BlF(<4>D}YOyt_;#0)i}9%|D0peHpIhh4}4D>{L<@(Bg0v^4p{y$j!Qr zQyEg;`YUb{MYIsab9XC{JJlq4byqsxd8o~$jHqEI0}s? zuy387ndUHGl9ZGH7r~d0=+m8O+(~U*VYM|e;pcAJHIPtT`lPbjw0fJ9#>xa6+1g2% zx5aJicms`bH4;%oBOoG2*M^{2H)^z)`fR-=UGBeth6etV!$&UBpQ5!sblhtF>mTV# z`a1T-g+aSYO}2h3smeH#1X{3ItyxT94e~WUc6Rrb{v-iK3uex<(l~E%c*Y9)ZAu#3 z2-#0zY}HDIV}F#wTR?R;21e7^*vXE|U6BsZ)|Ti^*?tiz+K~aZ*&YqTkfLo-GNohD zIQLDc*#>O`IR?F}vXWFn^4ka>z$OKJP97zV0UI>{;rKE(Fgjy@b*);h_RvN+xMY1W z*0$CBZG5u`|2)dTn7WrK~WmM)rgtk(h?n~JL_3|}xL%OPX z#4a1pi#PXaCB%4|j?f#e$>N=@ewkIp2pxQ{2#FW3mOxbhu-)ohdW3&2fG9__!YPi& z^S`N;$Pe3^AJX8)zZiuj)mR=i=Y8pGbi$aX9ktQ02coBF?4d*gIeZYuGv3WSsMCL1 zhJSsVm8W^5k1)^u={2OC1%>Jm@+>sOPfW6J;eh&4^a(stoQG$Rx$TGx!ap0ODa(g9 zdO;FOS@8t)%C*t}v&TzB)2$?gq_M4PEgHQO_;8CYrgL2cB-vRM4;7k-_n~A&qY=v< zy+)%0WmyFnNq|<7ae?IxNMNN9e4YpsuQ)Hrro)0GkTg)TPMnpzHbh*5R)07^0$1 zUzM@V_pS{Sw|eEa<4QW@wYL&tG|;ER0Bv|&cNpNwYz+-a{e+naElAEK9e~{0EF=$# z*t}C5(2<1w<#y(})jRRpA>8y&tq`HL^W7@QntviieGv<~i(<>?9v_*L+oSfKOXQCJ zD7n@0F;_V92tZkY`Q5D&+c6$A;^XG}Mo4lsVT^QgARsRy&Li7rNBA^P0t)z<1x0P+ zm__}w4^bty!@;(#JV7xt%C-p!wed_J3$4HjgN7Ge|Q)|r`c6S?i(ueiA zWdG}3h`f!=47~zLR%=#$K6ZRAQ#JOXg4%i~9?&*ZTCNfa+8#a)x4|lcq4mqaQ#7_a zPP=z4`t$_`{H4943B*gi6h8nm8m~QvJ8kVo>s-a(r~LRj2wFEhS1Y_#A=gs-4St%p zYy%ebAm6Yq!#zTOodD%qQM-veB&oSZ^vai%T6tX(bRc5H$hR0T%);9b5yr3@$ZjtwE~}t;#@c4O(?XTjNq4a0{-{YK>TRf?Hf0 zZEb_qc9OO>)?NvUI&Pfb^Y#8r0`2$S$M27O|F9(ae9q@Auk$*a%i#uj@7p!7)r3(O zZD?<{J(@b*mXX5%lu&~e&Di6G{IPd@9jMh6(Mqd`+3TLiO5lnGKeeF)7ilPjg{ z76doR7_~NYB-)cDNdA!s_R1J%X9nf87Z4Je%7!EfTlD~9(;x@sfKG8FR0DS1F|uz{ z5Ywk1KzG3Oa=S{xTj^sHfOn7bJx^@jJ<1pDu$9)mgoiC}K&$>@2cu9?PiAvsY9u|P zyARlzPyCu3=gr1zBh5%(ZP*_3JUWMZutSmFGDMNy^~t_28n==#05Kd9qO*HJKm3N$ zbyjd;jq57ScU_VeIE-1*xe@;i4G=2}joGP*f1S35ddvajC=i z(slH{&b2(bFo&XA`I93z#q7-_dk4?8@2jR(N194n9`760wpZ-hVtWlJB@7w^8wgBk z+RdXRnO&Fbui;Lf2cFt4KrCl|1} z&j5D$5w3Nm9ZW!M<4XqJMoq6n`L?K5YL2pts0(Ow)Rghvt{V{WLLAI*vtoB;@NVs! zzo$NjWQr8!CIsfSPjv8s_O(*leNuRZ@9@~Cp$f0GLat7*g1_076m(Vb-WdYtgA8^_ zS-8k8nM_nad$7$4)>+}dh=Gii;Ht(?f*AM(FSbuJ0TqP9S6z()EkXs_{dQu)$4`U+ z=-1Q}kiMYuCYzn7}p>wUu zLq^rKMhv9aq-3w|4tKkNQONQNs53mBMMV_TconRTS1-5C;Ur(}RUR?UUktD2Y1_yr zZMz#y2Ny*}qkSiAMXaF&7Uj~13XX2Z;z-ZH@H1v32B!D;!KZk=QxzgZwx$XEp-k4b zVWR;X2pl7U;+rVMI1QlG@tbf&9eW}av%Yy6PgELB=)GP41HnDBe^f_=dhvg-GU!3I zU5dFZAWz8&)ncEu!Ck$~IhA2(*h-hS0TSK?TzMq4D#1++REaZ03 z*HJ3#CwP3dU+3{pwR59?@Q}v4$`f3U2cgg(m61 z;;*z_3>t|FZEZ^rHEJL8kP2f|(|B}5_6~pHp}745cLJ|)7W#1l;yMn3Ew_h2y~b@8BJjMRt zR@lguw%%GI64&V1RG42e!)htWY}WF}z+2i^p<+eNg^iR4%4}mZF0VYi_#%FR3j8|O&KN00`9>Z7URo#FU&u&$N8n0^P6DiO7rESfqDyF^Mr`i!=J5zYM zYu(e2maWX4qMb=t#vssps`AI8N=X!9d@iH*d7ur>*&B*1gkk7G|r%6q}8E)HG2( zzZ-@sRuW0S&=5z!N%pr;n#SknQ?Oip=PRUnS;I-69i?dKAaE!6z?M9FlY}h%un6 z03E^qXtY)HAb84##)B_#R&qLjdngZTNGNV>TE=mw7-a>DUC|CikqT*lB3C<+p+E$1QnvKUi>PY=&2-P+#^sLcm@6V zDSNDl{|*ez6}?zsvp_AEOEZeoNM;cawFKjMxBZyqC8*Z*zW(e-73hbnn!vcXC;UK8~-o2Y302x)C2^Ygg_vOz(X% zX9f`z8$yW1YAXn46ZsfDRBzA<1QRFGc`w7{B{qDV;>0#ES+|3-4wG5lPAoe-M|T&M8!VK>bS`Nn7f}^rAGP`hwdaJzuvtiUMA~On*%eiD`z&`xWjjCrx?4I>@rpO; z6Sd-?YMpipK68=^eJAtV+XMF9Ze+Hbtp#K}(rqP5jid#0h@&-rJ1#BaL!8#(7*jF` z#o#SrqCQN|xvNGDqCHH_;|9JYz8qM|TWUS>v=Bni#geYyMQAxrXgk+ctuXJb`a&dD zS)Nf^nb+Ud^PeD=u$40w>>n5OzwQi-fy&BvKr;&w*y$2j>EM7JCE%ZDd#8e107!du z!qA1HJk|Y)aQE7`^XbjTA_g;NO3W%pPNfsFK<;!i>Kq5bgX> zB0C%iG6U24J!<+3{)7tKvYo4GZ$VpHJ5`hSC&U7OW8cQoggr7o#hItjv7N^jMxbKj zP%>ppmYW2;PCgzK!cAlNlKB`AzuQZf_;ndYwJec5Kf5h=s418}AhnKb&oW!^5Lpb3 zW>yng%W0Sj$j{itGHk*S3+$%wZasD^n!dDGSRl?*td;u-+S%=ZIY$HDf`jh(z9eX8>TLMX!AwdmkrNulHh0e?k)Ia@;8 zwH;G*eVfd*&;e8%#Z`b(H@Vvsq}@~8SPLq}b%9&KQfwL`u75=NPdog(taQn$L#QEL zO}NTsK$@|ZA22G0VfU9Py%KMAu^dHl`M2J{FVw89S0xNj}iXHuT|!+InIw0y&{qj$8gn{M)--!TwGBwx4s1pyaQ3)1sdMZ4q;YW#LgZ{ zh??n7^f^}No!##{!`rgsUZ~-&c_j@erL8{JB%_h;;%i{nSx;P<569c z#vHqD8ULJ+_H&(~y`LXA893zC*+=0lOKsn7S1*0pZt%J|^~CP5BY#A#2=Z==`jU1+ z7sDRnzEot~(?_*}_C!+06}CI{m)D;-Zjve$=Ot}=f>+W%q+1hpx|QE`0}qd}iX(i( z{Avo=Veh9g*YTu}uTbONwOOi~nN5<$gAhkido;vIVg>%;)wpZT2uAEw*D6&JqWuSD zBFUdSo%SDBxT&OYgDTM~<;`qf>MX5nr=`8Fb&TibcFWB6#PJO;JyqX9#wMkB>_6b3 zM%ZpWiFC39k&jH;Rh;c`WgM(6nn>GTVYCO6qmQ`DMiK1LBg#1EbZd3Y(Q*iI$G5B& zE2Al2k2&^wq<-2)Hc(>6s7?O5WtHA`245FWDRVfdOA8Lz{YMu|>dHQa4 zA#ij8zmMBMw8wkh7QZQa$?}D5CMr9O>$T^Qm-5?|;LHx^9EihL7r)BZ%$&gTbPg@4 zKg8v;O4;}SOkgM@v^n|j5rUUnjlpeDPY@0Fd|8x#|cE5)z4KWin7D`RJyqYaQ44HlV)E9izg0qg|T-S!yjQ~=4GjBI|Z3OZaU5yyUR@7nw>ToU&>n|($ z(wIankp2)T+0xADTanGdB;tI`PwlT66)b*FmT-+7O^BC2EmIp#Ma*Xb`f%zzs|eZX z05_9Kk0>LI%eNY>{d<^_$_V8~_iK7-PnR40PA%x+tW6*m8O2yz+D)olWuLOK~%P}a%F})NATAt(qeQ} z-1?;_BE3V(k^-GL%~S{J#8VqtVhcu@VwDx_lVBsNsJ1dbOx^_0N*@8Uk#&oRmA(So zpskUs0bBVc^WM1|&0bq<%Z{TjDtF2b`~LUs#CJ8D%yLh3{7S%wmEa}wdmusfCF+#- zbi)yjAXB-P6|in+E2l`3ynL0-jw@rB6>Xw-*(R(HT7ixSe~IE8CVnYt`QFNH*L;Hb zz%7S!iUf~WNGK_GrCmy4DvRGpNN%JnLa?|ED_ey_C(pS)tvuomd;qor%jne$fG&I5 z$;%1GIF#HLIiYB#xRw0#hzwjff8X1)4W11isHtn<-Ima<*zS~vg8VCFRcm)%27Kbi zC5sU9)MolVj{H+%x_HCGz2M^u9X9zTV=#E7EnR{%ShlIvl`^8umaz6Z_34NShvAxJM$SsR7xxUy;lCgZno3lW7g&9;xmo|%O!PbBvsRM&y zT>i{3S>+{=H_hthZ?3A%3TQdT^(6Jnw7ss`z<=0tL;8hqakxkD!GlAaTXXB>g)Y!d z$-CfP_p|9-5#keiJxo40sZb--_p*>Tbi(f|0sTg+g`H55v6#sJA_rpSfTBY-- z>PefUZks$kY38e(5Epm*n&dFf{?2qsC@Y8|FBHHD5wMQkd6nBOi++CB_CMmY4wM9C zQwv=Kg&%u+r;)CZ@&r1U&!6}uHZ=)bx*E*7xCcP~1*{QkE42!dj-^}|wBixwPD?uY z%sFkKZVT*Xi54sF#G-oa>Vq1}sV`j|;OSAG$3X@^eDw=4k=Cso?G`Sy+G7Cp1&eF{*UbA5e z|0)k-NU0%hr0v+0W*NsJ-KO`j)otF2wXJfi4_VG!F|jpNEw6TY&Jun1P?|U4auy$J zoDQt+;~Bs!Zl`RW(&a2h*;A32v`LtVU<`O?r-8PuPp5@h{LvB^h%TzWaA|si&&Rcw_@XKzzS=4vY;uv>J*;2&E|Sp%|JTa#P^ZT%i)pa86e=CYrrBT7qOKEkkgaw z^lmg`HL*Cz10ZzkDL^eh|)J`asMc=|Nw*FQn4?fi=YFgH~&HiI}`8#1poLT%vsM zj(#w0VYVe-Q2sQGxlP%PKcXXcIxw>@K;|!2p&sID+vJARz#acf(Z|2*h1H2@udg?7 z*P8R}ys0&k4;LC8-p-MbY`pXlcIsq}%&3T%%B*#64_Ee?54G3Ey#w)if08g(gA z8!_e(h}&DEaR2AoNtIybbtpRVWP5<$Hs1-y55dR9okf2W!F$fl(;c_ZI^>0#`(zUR zN(?NKvVB+5*O&sgl&X7pvknqHmrJn8so|-fHf_K>J8Mw+jq)sho2OGA%)V}PtnP}i zJMkpaZZyr~Jl>c_-Y+Q9u86?mhwPcu(ragEqY6J=2tdheu~TF_J10J81aK7#GWJxn zs^6N3xsBR$K@g?(L*5Q_0}Hm3wdArk9gLT=3}xO(3=2irb-WhO8^q2B>qHhX*s9Pw zWpl<3C7b+7y)6XWg6mko9;oyS(mmzh^bX8FJ3`dD=wpy-qCM+c_3m&N8)&e_G@bR# z7L~$8Pfl$=q`?L|aT6~}o#7S|{t%_07Uo5C+;b#!b7>pTeWp!HLNoo+md0gN5zWF* zCOj|;89(yBX8Q#)`bQdPGBU*P zzTGPZAQA%Z8#tGJ9%^RU<&6mEku26{b4pqVt|2kXc+%lh&ZKWUY|dfxJM5+-B2U_L znhigo zF62vW>K~*c3%G5CI_4t0;Ko}Vg#bV2aR~Vl=z$EBZ<)3`R;BE8pvns#d(ft}s*gFK zQqm8)yFTl4_)SwytDOGnc7v6Z;Z9DXQo9QU1!&W7GYj`-E6qcU(*g3MDovi?>L+Ub z%$2bzYTaLRT+hc^;hF zfd}|Khlyoq@8Slc*&QLsrJrv_@k%SvWBjH#aAhM9w>U$L{S9f<{49sb=1US>u3Bzb z>y?;XnXMd<>q2~RyzTA8v#~lqWTi?Z-xG`*aMJmM$jobY&U0|M3IFT7&jaoFPlsl2 z&(cg`7t1+g>Ft*pI%6qCp*8O;Jd+y`rXOKL9}l17D7a?(%IOJ8cs#1~%AiVa-I(;9 z%L1rN5pe_lp)#T3{Z_kz&WyA|AB({P_INk~ujbnG)x0sW7CqMZLO?wU%+bo!xF)Yo z&%N1{VbI2E(^LKvZd5Su0r@BBqGlXx*NXJ=#iZ+mbL9XOQu!8zT8puFw-?W|Rq1Q& zVER32nX?jYOZe&V@rHI=-UiK8A*Fax2u=;K*D}5^6x#o@LqB^(ovlCPqqY#{no0{! zv}}WwueO4e8ig5Mz!{7Q^YmO2pA5tB^@9NlhM6CCC;Ejho-*w~y26QBq0e z5@Jf4;2EKL-D`1yrK#tw93vG-e5efa8{+z}fdtiV9Y(NsXxf~KySiP$q075ZXW(4h ziKd`(Y@2YEf$v#i(vH5+_W5;&bmu(nJaLST7vO8O`SMr=`0IoZ{nlhBIYRen4KN(- z633rtA>m4wIl6rgyb(h$&QDk4rwJ^3tyfnCR`pxnm_KltFBz!afWsM$f{^QS(q54CeO%RABZo=mHi&-p4ZdxYCAv&1LHj&j{o@;a%Z($lnB(4YG9 zP>&w%EpQ~o^luT=dX6@-Hy+20+erj^=*nZLv#v3i=uJ3KxSW;FzrJyW?Xl!s73r$V zbs!Bf?W{Rvi*!CrOf@GKx1YB%x&(u#NO!dLxZZ}QUVeXRZhEnmrQrAb60Mlzq$qNs zAvTQbtamtZcbnJv79|n16k2zpx0+~7UF|j{dqrxOy46>Y9u}`-?M~F!(GEuU>wFRkNdl2nQyfTKoW|=om(?SGYWk178z|5uY)0PwVS-Ov5TyvRBSWBk5ICBIC7ewqr4B*WAt)4% zt^mfNme>Atp)% zk##|m9 z;%A258|V zZ-|Er^Cd@A_K40Y&!APa=?TR{Ft|mf?KL12gA$iwe)C*;A&9i-#ACZHo&!QKLHX&f zpDeTHM;JXg5xb)|HfYy4FBRj-bff5QOC>zyU8RP+lN=oQUOy~z`7j(9&Rc^n4^!Sc zia#ZcttE5Ay}~NOIk5PV&-U^evSWqGw;4 zTHIS0iQRPVKF{?WqCl{jtISC2p+h4_X*r+;sf-QHAm33f7 zR2%cOHO&H-`~3E=COf{dPV#BD`!Fls=w(GUEUb8RJn{{#y|@aYwfH&_lcvr-bUl?L5)LFChoDr+P2zl9!}+^>9`@%( zRG+{VNAbFUaqW7ilI<e zw1>4}Z6FFYK^4nSL!%WlwdjZXOJ#@i6#3zZqI7s@#au@WjdE+$eX4DiXHuBN9BrZV zsP@x6`Yaf6^x1zWw&yOfLXU7q>Vu3N-Q?pBf33VW%o0fYJif4RwRUD_W_yfXy4*G& z2bW1^dm1Q1_vBoBtFUtips0}BXr{MEB=O)=Tw@cBZ_{^9G(^ydvB5f~jHybb*IRa| zk+!$*@@^}=gjPnS9cyH5-Xsm1_XS&sT-*5`1ULG? z(lCx8(C%B{Z#IKFp#i@iK)V>2C-HC{<`ZBXk3wn(W(G;M4pp=8HqimEWQE34;PO=f z>ka+)>b{(YAYV~gN+H@1z)`)yi&<@EfKak!mwiTg!kJra(Mo%J3A2MG4Y;mBn+ISz zL0(Js<6^s`JLOf)PaNJw_kV5i0|)??R2TWoY1vqQMTyXOK1iTmPK)#(Fg^yrz_ZP4 zQ%Id&*NiqlfZMt{XiupHrI)9F!afb*-Cv|;ih$4RC$#PzF^v(Rjh%%)yCb#jXG z+N@0e>R~lc9wbKg!(9B2Sb85NmUeDuq?zr_ZGln8fj8ppQB?Roe2pYceOn4oMzG_HsnGQI^&wk;jA5p#y4h zQm)W0M?THA53=r<#fA|Fy2qe1p@_udI^%9Yw>e_tsn9;H_#FV!A`5E;#=W3yU&HL4p`1bJcjJjcJ_m@2rTbiDz%P3Pin(=y zjn9%Wb?L5kNsHyLAOkL7Z`FY~p2RV0ltevC8VdO? zRXdH0w!ko^G=nasc9aYGt6I9ESkW!JbXDfcirQ?(O8fg6HV|r{kL7814{fT9NPKlE z{sZ4Lf^dV+9&Ocp9fz&&&(di#*=j?WvI7*}W|L*4ILl*)cEti>)84^FUsPw;5#o5Q z6594Pq0evi3~C%%6MnnUeigE>)7Y~guxbyJ-ky{o-O{uN6sXai*o~jbyARiaB?T}Kv9FV_vJloW2vp3|N z(3UT8%feJ98gEyq4;8QdoaHTpX?rFH3-y@tH6oqb+q`zvr|g`a8Qa}S*Ic<=qATP} zkHeNhO`OfP(he;Cd?FwP_+~&lru0qN9#)@D2=C(dtvbh*95GF zBjJKl)9Vr6;Bd`IV?y(Iu}YtF;_kLAPUa@N5%d{EgomMbeB|m@hY++tF2u9o!ngcK z-RKzprbjYW@RkK4nFg$?!|q^C|1v=9a(KKyl4&8u5^vt|dv{s?*k;3~S|sy!Gk^{QWNh4U(*Z-;iP?1WE_KB@B$u_qtP z9vha}jo9N6G*;-wwSxks+gJgofQ0d5jGW2DIUUG1|D29v9`6)8gnFApQnT8Js%`Zu zwrL%fH&QTUFx*D`;tp;(*FK+?)W)G)8pOLm|7{$I!599wB>l&H_$> z_A@uzg&KTAI|oZ=mA5=;@6gr5<0xx!1%in_vVYWjxIS=!vX+LAGuD&=WgJeXt)5?0 z$sQffTjaw0qy+hWEL%fZstwpEuQ=e&(H)@TfVXbNVJ5YXU7%A2qYzptMJk49E~9Z@ zrwm;DSA!6|X}6q}+UEE^x79eWK1xLs(%ZdcY!$NRv0ZI8rXMPx-8;nlt~RVjZ6uBz zJTCe_A~J5KXKEXf&d<=LnPI!MuA>o+CE9f$g!}n@aR&hIz;7_}V-Kg%H*0Fe-Xb`n zB#7Lv#8E7hx(8Ua>K{zh_2917xbvUm@N>u8!5SukOP*e%)mN9*jo7`k;@tgm{B zUbMn4ZBHWVM>K9<#@7i&u^1-6ScZuE=H>dJ;zx9I!@IYp0xXn2gJzYNRy12-6H+Sm z9TU(I`x5(^&$<@j>mFDC;M;Zf8mrvB^mHk&d4|uwsXX$TmORbVRgI z2=AXS!nGrgs7m|k2_35^@ zf$6+|UVqYF&xumLdXTt%7itj>#l%W8@a6Uo%!TO4ktdz(EreGKDSm^LM}DJ4-@eKQ zTD8W4%+`8Bgpo0nAgm2pZ3j1*}g9Rhr8Nou{~$r~@s{FAQ}y)@Ii-4^geBH-UBh3q|1vm^yjBH#cUh<2uKrgv(1B z6t+h$7TV!h#7etO!>ObUTLCz78AmJLkSe(Co-YU!yTA+#{=Y81&Zy*D`!z3eB1>s` z(RG%$qSKLv@X;sXDkkydg|N8!c26_Uqul*BSjl&iXr%6WsF|Y@1)7Vvrl;+DV#CJT zleKQ@8RfBw8c3CJh&UaT#Juj)<85UHK6s$h&Dgb}JtrWXMpo!VsQn0TD(HB!VNpXi zXWwTE6=oK>Ri*5A)p;!GKpb8J?hkBrj$O_9Sq-P2#%>{X!W|1|I62KTJlM@=a1J!W z42`O%jvWk(6HJ??&We&Y3l!a@9R1dA`<_M|)ZLJOla0oQVREH%o{Pi{uJ%Rks)!wy zK>7tbaPlMqiNq)zsuUkeVA`KryxuNK+xlP|UQ>Jh!>oj@inwOn27X%=dNSB(g<&7( zlGML3pJab&Fk2f;nQ3e$YnKd#fR{~ z4gN_eL>`L*Amp`Xo85B6{AM1Us*eE%o2QUt1)9a@{#K`w{gzMmExPHumfI-uunhst zwJ+`G91}^~`1Ky9`yXObm`eOEsCOg^uTcJ<;K^a0u)>G37WrM_jL`ndsmE0-y0 z$gX3!$$rFYfirmUq6URRuILUIGfo{KDv?7KQy!n3#DExed{pjJN4v(^rSv&xol}(^ z5@j$t9_B_Y{+bE47G9f(AOp-;{>Qj<^rU+X(5cDSN3pkKZtCf%n-Z$`*hzFHj^>cIc5|Zgotl z{iMB@cbG}J$VJ$C;5pWPHJam4GzX?yxiy;_iZc3h3w%hH! zJOytMu&1Nmj<}CHvNr~p_WIPS!|IEe8PcHqUIeZbq>fJuDrnrU9l?A}PQbbomT8P7 zUD;v>3BqYWW*MJw%hOXydpV7LOaITl4)CP#($&a+mYY=6F3Oz_0Espyq8Z^@KyvxNN)+4=wbr*Gp$Q(t6`EKOHXo2~Q z{3W(mJ3sZ?6l-}pY|Ai%{|!YpjQVYZZUcCt?s-Z1QSzb3-IBn>gjZz zHTQ)`pAzcm$-iZ7Hr!DMTVlEYQY8%c{WC%5Joc@)N?4gpP5Hvt7GtFbUa6Rdp*&5~ z4zbPyWLMrA#`}g#sPuLZ<&^)?+zm{`#IUcWKAxD^wBhQ&HqY%S^Je)zmiK*yS1TIC z@jNS#*psli9r8PJJAVhzJm{A!-hkzz6UOMMlzE{l!>;FJ9JzjsH_Znp;$zX1!w5Lj zG~MW$7p#g59J2}v2Ichv6cbr~#}zQ>H*3uLo*Cn7k+B-Za^f(*g(Z-Mu{W(djUzJ=%IYTJ@ zb|Nr=_Fr!V9Tm9{z1gVAr(i8ye2Yy@w#Klx7A*(SJwY-kl;U=A!FyJ8O-hn4~?}d&}B;k%OIlduo>SF`j1DVGd)Bt zCTtJ9G>DoyW@C66Xsv&!S(-~iv)r2VgQl>}q^cj)J#8)S=MbhwE~YncJLf4>w{W`# z3n@9{t>!Z3l2?Ov(I2mpvm+}ih*&%TlrMYEQoJ`GIH^92KPnR&6|cn^bl`wGr0K^t zAr#uq=pb*763w(gcq#@lQ4Lm>+tUqtZML$-A6nD}f3#{rt6Cgi6X6rG)IwZPft~N? zxJb`TaMqxG<#1#*UraTNY3v%3j5=T`Le0X~$10Sm9~ePlz=~ze%ZA~mW?BQ4RaGp$ z8fGYlPQdc(vJTr(hG$lu3Gi{Z-;ac26-3g4N(U#kpz>OnXxd;b=K!WF{Zo+O^)`nk z7m(WmNCWnE8gera#uI53*!^D*-^h>8ylq6es3?XF;kJQOix4;Ha#7iyCS9hUSGZQ=#BcVdP-vv<; ztxr$e0XU`Q0Ic75YBjXjtIT#|CsYi9t(E=VhyC3G{jtAuMgo-kc>|$aEb^`fi`_8j zSk`!ckG+*gx%BKA`wIj{Of}UIaw=2zi#$=GU6Vtf3?cs!Wv_=~&zdaO8P8Fy6v+em zl=P7-Y2zvPNmv@m*E=rdnmYEg6|@ft0?;U&43ZiL<7$T;%PfO3$Q)>bFN>#z1hVQabTE2a`iuXW+x73m8tIH2^4Yc^uLeyL`T zdgqVo$+ala*%XfIThupxDaPlDzQj$1a1onlqGa1 z*m-ZkAf@aB1oiWs=z4*z$WilR4g>}*SQ*}5 zC-P3k)bhzH{q{#30AKPkQAHJK%;Y$R)!2*(cY|RM+p}8BRBMN}_1P@8*85oqVTWwS zkhSNaiHEt)r66Vez70LiR=wQkHVZGQRn~?!sm9vPZ=0X4);)d3c zqpk!7-kP>MWpSA;g`L0e89v)|Mw@pQ<=ef;!=LiRg zVXm^fx)GJLxvSKShZAxaVRqS94IS@B;23o23fm)E$;8Ji$JSQAMSdn*^LZ{>8)#Pf z5_Jvs((pY>riKyOaz4!rUX;^Uz5MXYVj@ZLUc*1p22p^^8?9E^zW9 zC5a56RE;1O!d-0=1hrAl`)nY=KDhijcBtt1JcRYgaIhOP!Cm!=hMG#SHoAok7P|)P zJKSNftPP3|xLBvWrXj6SuqN~|{0TR9SPs4<0*>2ZBMH#5#WJjZvf3G}{qnF#H|vTH zIx?WzPQ)!@S6Bx&m@;N8RfCph5k?C%5%yyrKRMFHxn@2C1$6XFsDOm3B5BKGwk2-p zq3Rah7@%Mf+hWizF>XJ@PmK>qv*!5PmRB~}m*A0jR=N0PuIYMQCIBPZVuK7fwMWsu z&jI)uJEn((m z4Q^pZFOrS|93A#Fn%&+1X0xlN^pL9b~v69q0LfAVLIK ztW0OLO>OqcA)TQ7#F^cHWhY+A%MF+v#v`^8;*@PD$gSW>iT-3{q5#ItXh%lzHanOv zRU2utSC_HY2aVZhKYq>&a1(gV6aj9Zw7rwA$0sev2vM7md=d&a1~H8!ptxHDtSwHo zT1k}YpPP}?6PQGq+o&sy)b0euVYo0!8-tret{b1U$Szux(ROh+JL04_SA@N~4)YKYlK3ij-JD09u)Zz1 znui7zz0VK*&Sw|GVXs}+vjXXOZLg{ojtSBFal96;P`J0jZptc!ifXT6ROffw(Q#yh zlnOv=+ifdLkdlFFGQ-wSjqG^lB_rK?xu61!>Z5;6CKF2MlhI zF4$D3)1(|N7I`hK<9TExd6_{PDG(Sq+qrQ29|Sf-b>>6cXjG+FnLhwldcA3BjU82M zpL;Me3NHClPVVKjo$C{k)QA^HSZSw7@;{8Rf0vJx<8dOf9^Uj@I`k`f?jJT0fcEwl z#FDs##Yysip%ZAX_7)GfZL)LjI0Kjx+~0EDB7sh8c$(u$F$DE*U^}1cvlbp<4wjR$ zk;V0H+{V`OLanq+O+wH~R&bBrc`uHJ# z{(Dab?WSecy^wH%yY3;Tac&um>>&YxBg(2NaOKHb4K;xtyXWmbZJNKQlw-r%| zf|x+aOvUMFxUrEy!}A42+~={P!oAf!I%RiUb!M9t@h?^#YDEjt$7lGZlLv7)YOSDm zIYqZp9*;sP_c9mJVSk5Fzo;He|1+r+n5NZC z5H?y^Mb&=wE~}Z&K~bKT;aAxO?TFD;Bs#)&JDQ78&x|UP93b{xhqU18v1@ z;1)){jdt80H@~7Wi6ln<#cj)IJZ!W5M8|tQ%x^bUKGtw)kR)s3wfC(1qfG|+di42j?pVB2gWBvYoawhoPOa6JSX>Fh`Z z`gV@z?$$u_1|=%Bo0fq*Y)Xdyi(XVt3yd5j@#ZORv2%0mrd&c9B|wJWT#n>CW9cAY z?$tDkUW_t(2iPA6zCmQ#BxHlnc-RFG!Y+drN#1g7Q#_XKVOAf?LUs>i7uoW@Y_h%D z3Y*!aBuif64vCFjkMLgP5Bv~k`1fXKRKIWH9P)3wVV%888gbNWkb(f+IO(zU;Wc6C zXmc_+Oi(!dHrYyhu`Zc9e+;P|_(Ouoo*6jzh}ty(yUM;VaY9r6?eC5E5ktBj&9d&( zZLts>M8yKP?rBpBd!FD3LGoiyT2I&oIfw#nDw%5Q+Bh!?r_n zJfnK8!||qgM5HwPDT3|yv5N*x?tF@rt8EfrG}w<7N2tTY1l&sbExU~4EXFQKU-@bU zfx)!#Q}FP;Bq7xKh-L(Il|we#Hv`n|A`lm)^~DP~8s)QVm)qONF$Dr`F%{S}JOVbJ z;4#6z)ix-Hd@E=e%+g;ogPsNQMzTPcj2A0w18&l~wx6rtXa#102%R>b!SSXpC7%&U zT0LwsE+;?B4F;WC7lB>H*MOkF1Lwbxc+uKlyH_Z4q>(o zDzn)x;)~bJR^HFD3s>6bOQ0SL8=!L^b!lcZ;S8qhfEcj0w1>}nEgp*$FNrLQ`1F&b z{Q23oW#`r3@epWb7~wH!6>~i}vP!1cH`79!^A>>C;moMWOYMP1HB_jY9ic{(J!4x&)pWA2k=%!@73@1Jm|ah?t%H~Uvl^zt zu6nWg9%q56JQwRK$jY3LFHiIOWWoZ!o7FCf15J(qfpoitWYTYr+rXKsp(Ge_>n{W z#c{(vJ$v|fmoAU<=<=B0O3X!$yGVL9o{*Q4*Vz>;z{%xH;+Fmj5L+aN{*6!lFBrCn zuLWc5mVvaGuIJSvnNpTH(Taw( z+evjfJgTTJ=4{*40`qwjHf>w*Om+OdHE3Fk50M{+>a$Kz3ttZLXw^PN2mG7~riWAy|)SW({p$!&8QRX*^SB<1367!i?^0YPOj&K>jYA#q4ss z)&WZ`pt!@C;SQL$?Wjve-*GNyjc8QN3ETAyh-s8JuZ9fm*6cFWv7Qyq93b>qIA$-T z04e!q$ps`Y918~);I9pEbtlfr$CK;2MowBy3*}ZVBb><5s?DM`aF#ZKriHhs@Krzxc5eYU_QS{I%Z@#-8Y~H`6UJ%**Teu1{fq zLF)I~R5Y=cN`t5#63ep_d<=^>YV`ReE>GJxBz;}!|}^HZTsW(l{GOI98%~OYYxBQ^}8Rgr%+Xi_6ulK4C_jQ)v zwxw;Qy3-E8v4w(;v@3uax!n!;$T6{Ymd|*v$M~T4NgEeipZ5RFB4Jwm z-7fH54sH=rv?g*}6|`9a9obwZ*oVUor8LE)9SyiHw0kepq|bYw$edy^X0T*$7nMmPQ(jp-`XX!|mtZx7uP^ z0)A~+)L>}H&R_;B!oVvbVL_4NWJuYLhAp+Tt`C$Ut`3_DN zt@8;_4tpUw6~}o!WiLnU@wk1r-UYJv(S*(f6z#B=z78j?9fNnIVR6CT*2h;-Cp?H! zC_v&l*clT_+##~w%{(3WY(@;xE%srnnikN9YMU5G;mE7JIcE}K!rHFZbWY`A*wU0K zcBgaGXIq{_-T;8oOEvWX>Ud+6lBM6fd@p-`Idd>PU?htC92WHo8~x|R1) zcl>-uLx3RuUlzjKgzkrAnPls!!Sm!7$}ge2u35Sck}K>g%=uY1^>R`qXpj;+nSxA@ zOy@5M?6PisG)yNL1DjB=GOMCm@8g}j9) zG*h?pD<=5ZOVQiIxN~U>t2u*CnJxomPg1XcArdOEnakQNy$qDczyHQ1a{f4kP{#fk z(9WEX$irX=e$WO%5P~153q%-97$7Km1he`$qZwk%^^(ssHZzDf@?!|lB;;=|U3c>+ zwYWWGd!@a|yS%kq_L2BtZbPqSb?&)lvlbAd$jbgs zJkRslXXzxNwNJtO{yICBUHL9}e?ugir{BEI&H+5P(5I1%Fr_#$>vAU6O0|eTYSW0s zkpvVRDME(DM;SipeLT%kC`lViGRwn-#@SkuP$d}BLU!-jN;tqw(Z*-w^R=W*CMT**xAReSJGm#Dn6KM(USYY^4d zRw7dA_Eupu+|cu3yWb-LoF7u8m___f<>!l)bg zZ7{B0e}aQP#vDsMCQ1gw%?~cYM3Gw^PuS87eH;AqBH&`~Yj(~(7ui8ncV}Bs7%*LK z*GY+T`oUI*F5`8+wr^{@ZL8YLQjOkh;N8}`%q~5Hph{7qgrrbO$2p#`4$@jK@F4xF zDT(3}U3y}rZJdtPa?JJQ@PM;0&`vysF3?&g&SX)z&yESHAuni3?K*~k{7doSLfkux_D)`PW?RfQ5_+2=`PI-9mtD|C5bw3O=caM^J;UW%Bc5;ZJo@~buaL6Iy%s6v-^-4)k3ulIRf`HpH8waCApFBw!+m- z$ebzy8dffXiQ><*G9o&n<8wk7=igB;mNmFdon8h0eW3M+sMu%ncnlFPZ)#`xam44A zRXA+@o|X4vn>+7E!kRwIFa@7vwl!jyVH9ivt)4V6hD}YKju+SkFRifAjo`1k2IRHF z4(FhS&^5imA10&F1GlW*c~{0;TJe3Gvl2T6Snp;d8UWt`n_U4}@+DdJ~&*?{4?-LUwlN}@eAFz%W^+HQUbsN5Fi za$v&&H`p*Za^%D}9$d z8VM-9@fluhviB3DB2hBdkNJ_286wuZuz5!zn0f>=J{VwsH09~10Oq$616&hPGib_1 zfT}54ik2JW;qs{*;P6$hpU$SCMpvyLE1UcaA7beCpSQN^E2~IjqkjxrO~f8+B_>U< zfAQ{K({*i@o^u3>ynUBHglJ;UZ{6Li?$|jZGV?X?tk&9caFmY>7pGMODa0vVpWV|` zhaC=hg%scuq~oEOJpkb>AFCb6^>ywnw^6kNK99ThwE%zOt^>CuVpaltnz;%K9z$d* zfHpr?O!%OLvWKVvsY{?U-P`5YGLNB#y;CpNj7LMc`m7Pl$po|C*#*n+dROpdXQ9vk z_7SI7H(Gukvut2s17t5z?8-Nak3+lJ-kl{j@AyZZQ&7H4Sr!`jXR7sQ|^FGv35wEpJ@;_5GHN* zdNc{wBzC03RpkP8q%Q5NjZy@334UpboO(OW5FwZi-MgV6ih=zr&B${%kW-LcMEGZX zN-iAfX5iUr7!&bZn^a%nuMT(cPu8q(hsdUEQR={lGn$ZDOjYX0VIt1;5NCiYB*9`% zvg3@-+)g43UMM2G29nUhhZLbch!e^-I4TjIXg|s!##l}X!h)0gU3%wy)nu%QyREob zS12fx0|KPDxL2<_{V^nO>8^nDKzTgGBrP7{buNRA)9H-D7UDItgYw(WzPj!ZOkArS z+s4jd{00TPcKe8s_pffaZLju(bZ$pFRXPCmU>aPtVp*q1g8!&J9RcB1#_uIgwFEW|FSU!fiu0 zvn;whQR33M1MK=@@}Qi#z~bB*N)bzkn)cnyXCdG>1c&4{-tEmsZq#XClURStCTWykUE;D-Vj!RL}u#WXcNDqL*|^20$f5tljV|z#&Z^Bg(Bs zoB%CFJno)08&tK2@|#KhR5z`_8Q@zugBea_`2ooA(k?56fg;(%9>>h6Pud?7P;PV< zPUpA(kClC=(t11G!r=riD-PZAiS0wnI=m?qRFi5@_&>saWr*J_7F?JZ7Ca!^LmmqL zzswZl(?8)u9y(-u=T`Wli}?wa3{WQ(?bc+AcIRPvv|Ve`;X~~ne$qx@byp&-Ed8`a zr_;{I>Wb}xsQ}M+Tyy#f@>3yEakINqp3P;#cFQnJfU4N;ifp~9&i4Lz7n-54JjqoN z30~KzU&iZ8XMK<#fh)wBF)A?xOW>jf6_Be&v*&*WlKpO5wU?_(mx8^Q?(q?VO zm23X`VTAF0x&iQ2Jyx`ihqQ5z`rH)AcU|ZM8)%I~Ui}IYD_eI7dOn`_AJ`q=isp(r z_SAnzy{eWD7xRux@U(1aCg^>Zv3oQ0c0IvU9!M9lg5Gk;Ntcl1qM+!!b)U-p6!At6 zihOg9YA@zD6!iX3t+6*=S&N$A*W~B(xhMs6%0^@`G>=AcG6$N_ZTWt?T`@>2h+DK6 z#)Y^4eKrjafv)Q>`B6l2)T36+MvoDz6P-TAHn}6%rb2SJGJ8A0T3M$*gS!BwhXI0T z*41laHA30jUamzKsnsAmX(>ND(Ff3$X?=|Ycu1ltkZ2BWwdVt53A16XPS-TipuBfK zvVrp^WnuI~ISWYgKln=+#K53i(>Qay9WLoC1+O*#SH_Y%>%GU(;-gpM1xZ+bp~m|o zDgMj_7o3dhtF>wr{sLX9vUl3ySDdhjbsA46Fth(8icUGZ6X!H(^J=yW1Ox>r!C8<= z5+Ake?hTf|+KPYzE=7TzQ;IU(3OhsgYi$n4$7*XZ>`PyQe#hZ(_Y)%FVlJVj?FSl9 zI|QGcj%3+64#U^l^hSP~CxxBEg+wHXtfI&ahctKk zinqO8#H%Wak=Yx|EL82mC6(#mfa^wgEyaJa<{Yq^V8ASqE&pzF+nHR=@(^1UBm7KG z@ez09v!BKi$}};laIl%U{IosEl*6v`GxYF8(pH*M&t!SHp6p~dHdqD&6p-_zIOqGU zOwfsy#FqOgjvGT8cWVL#`3ZV40&g%|#vHOwE~nD_og{zT?Hxi}P9%Ywj&)Q%DN|ZSRaoG;cwMw}QyGuz}&%g)8lB1|O}gfx69+Ot1~(&E^4A9R{JB zx9QDsV3O$VkblX5a1LLXs6S5}XR^U^qOFx9=N*{p8X?1!D2Rjg?Z z;pf4ds4qYPz%uGhd1n#aF^Ojw#_-dy{R8~a;Lf#yW}wu6Rb zbsDszYw00t)dh^*gxa04Hn2y+zK%9kkaIj18!pStccSuV7)J&;0NE+axJ!^gc23nQ zG=kXKK*AIXY-H58ruu_5336myGNs+7wqE3WevjhZfNudZ+Ep|42)k>k!Rhqfrqo znocX~TuMMU0pY~?@Bb{iTpgwy4C4V?_{+cJPbzE8NckU4Shx8TddjG6ZSvXm;8D%m z7b2geH`%gDSHxg#GfKaD8r94bM+H`(_0#C}o}d-f+Y^`^J12MUoI2O1W~_KlZ?y`q zn!G!Fqt9|;*7A1IW8TK89U5Z!wL^V#b17rIm+d#=wH%^Ry0{l$H@-8F6cl^n~;JORh8&6FZ7HU$o(XOhu z{S!8|E{S=58P(=9GGM+HmtC5y_A_#ZZ$#X6NTa_G+zO-7aAB%AHrLV-s^Wdb1)!Ma z5Pb5x@pkIMK7*Ib^H=4-d>I1yuwD8UQ-t#jJY zo)X#TS19&A)02Epr`bN}obC2O#I{iKtZPGS4yJ_+wN4LtOKx5FkN8jfzpV-G(FJzB#X6_rHt)HF*=9M^5o&6LJ*NU}Qwx5CFLdDhPkcyenJ>Y=0Z{c`0;4F8#72B6z>AkytCz zVnHFkK=sG9sEF2g-H|*$TtlEhTh0* zhS8wLrirRR1d6x6!ta{HswFrKOmf&JSvN$J?Tnx6tT=K$NmgnI*_ zG(JVY2rm-M0jsX!t$&2PL{+!7cFP>&Zj-k|Hg1|)CxjTpmv)JcwFxk=LOue6?>ef8 zE4)Yy5+>u!QE0FRH_zXAy2(bzsooTIAgpgAj3e+v(>$(7x;2aPS%)p8YMcN%|D5%b zVQBmzW1L(|eXhJ0Q^a~<(GUUI#sR;;d3{8paR_j1Kl`)|TfE*$%b)(gi<}gh4c3{M$i!KwFev@5C~Dk>0Ch z>rbFS@1}dyJ#iz&C}fuswH*OOplGV-U8aBmEJPj+d05NCj zMjmGSpw6FU)oauZwHQpWR#`@Sy&aQr&43|fc(R&GlNg3JFvIvaYXvhqDKCJy*3;x} z0pFEdi#l*og|M1f&Hw7JOWwJUK+jIfs8%qaB1U>Ub5oL}EUtopNW(uhY(CvSDI`&7 ze@LQ0e)|p4x|oQt&LtI)9mv$HPRv!693-+Jhoi>HJav z(u_%b(w1updVhkF9ply()Y^n-MNWTR?X$y2x*{w+@u^4R!!#~CWgXSb(u>*{p-vGv z;2e7|7YB2TD+HZ~6iVX=_6ZWICOoy^|DK|!wY?J7ZWN$oyLQWvxbJ2s#ZufLZi;wu zO{-cPE(a_UA`Fql#E0pR0%bZXtm|kcSYT^yuosnuZO-y4sTeB^mad=mwg@& zxuJS2U7|P~ir0G$<)6+uH{+PC5Y*%?OCyJ(t0ozT2Cg7>)wq<5TCptEFADxwvkpqSJMutJ3$F=)q1K}OlE6tWo2N4q=B z1cP|9|BtXYkB_>(_Wx%l+k_-AVVxkzBp@cP1Aw;-qitxnL^fJ=k5HmI}{ z+=8__pshh`J78O*)i!Ex#jQ@TEpcn(R^!rk5_;R%&EPt=%K1KD@6QDBKJNYf{#7zF zpYu7(>zwmC=S;;pDJ`9b4u#>0rh9Pd0E0Qi$wK>*PdTxs64(x+CDnPtCbW(#Ws0DmpG9cnp zVc9i1xk)8UYc_wS-FlGws+I83tkeJE0X`}2Lv3syUhxa=-+cyy=d8y z!92d4L2C#(x8rIP!l;EiYJG1${u{f9!Iblv3)sVYLMwONzahr)SRir}VaaXA{jH8I zp5yYAUkwtd-~5cfK0b?1a1U>Q-#9(Z`&$D}lS_ULwDxmJ#T&)aP5S+^RwAls9w9A> z3m{#w%V5r?=J1s)e6j}Je3n0+5eC)gRF{4e1evcU zI*UtUvobe3pwF^`+y!koy-*TPk@&KI;SD{ZRUHlPo~sYpOw=;?>$H!1{VH-y2L1vd zC+*`twXb&wCG|FfeH@4GfLIu6#p?Wa%mAw!ZJ7Y1E(U76H4w634W%NAQ|$BgSz(`w zV`JKRDBU@xi*q{ViM3!~>e`)lF-JMAI07Onl1bgd_r9oO3i7(0yq4;abumD~n^^6` zA@&P9X7JO1XE~_pviu1=DU^{u8rG*J_Au9nhx%{O%3=`Kc-yA@q=v02pvq8mt;JU? zhHLj59)D%ninUrJkkeGzX2NBN+Qz~(U;Z{#J?bIJA+=MsPlk@ctDYe)!^Xl0fMA5uD|9>#3(ATbwTBVVOle*!qM-=|Cr zVjs?&WDM7P!QNU3uI9lORIN0OrwK)?>v&>Ej(ym98@hWFhh#;m7JD$l(-myD!^&t8 zet_fn)Sl1U2C(0XK@2@PvXProNrvl37EM^nigJ&#pP>Nrc?vfawzH`nKl63I9mhMRPHfpg#baQAu_hfKJ6ky2-%jVD43~~SOovjeydm%;R`=RAurycRwBgdtg8?oq8VN+#fwFb zEG4^T5`j>iY$H*?`=UKla=e`~OvLRO}2TuTOD(%u1OlG{T%g3bz z#`b+V;5>ETCN$tis@wqDBx)Ke4T-ytbGt+7Cu>iM*sc6@;wx&mQfyE}FRLP^(?jQ$i)3Sy)0fGx)fha$n;pJchwXYNMMMuUCnTTCr zMVx$L_;Qaet+S~rfcW_#PbAcn_$HL6V_LL7Nh5t|slc@c$8T9pU5(`adQoMf2$>Cz z^oUlXsBQex+v!WIRaQa0Eoi?>+fm!?W34AFBYV6vO*M^B6;VuELLE(Gu(cM}ESB4q zY6Y{aXwFo5TO2!Yl^PZ{=X>~HN1Ez57E=fw#bZ^XFGR3V3sLO_zWO060Yd?+*VzZ# zyKQ6ECZ(E?+2us_jGOW+M{54fd;p1VElPN=9iJob{&JPJT6DOD#0Y=PXM;rkB77zC znL({g_K3sU0bg$?wf9vTBSLum9-IZR!@DTJ?eLx#g}@$^L4Cm87kWZuC~{ zXLLgNkSF%_pgEsHVma=8t434SkdHmSPd^@9GK!Db52YxvhLi<*aplk2A8^?_?53C< z6SC$o0xfsFc#PU2{(knuK;-;EJ#X0c;R|{C;2zzg{<0d)Qw1P41~_!kxb^XG(O{0* zZKZbnO8ePD0_OF$Vx(*>(%D3nBDf%>EkoVj=7*qu2bm5`^_>(;`2Xz7QD&_9eaOw($sIKDG3#NXK5Xj*;h zv0NCncCRr>YnzzHnJ$-0H1h-ANq5l1an!~6E%qCYGXj6AMnLltyRzBNT}irCEM5m! zc1OfD8Zd)48jk^^#r{4rk2chRvB4gEe7Bkk~c-!lSApHs|j=8y&MJcYkGS|Hne(00|@)4wvu*2 z7=Kdgi?L;b+J?_4eD>0Amdj>~J;8N90c}P6lK8z_cI~{*fgb;Es6c3pZ;wrzWJ{e~ z&Zd4Z%Xv?ECtke>p8nE(&4x#QAdx{=f2+i5wB1htE3tzKeI&h?#C2#bALbLf!Vyzu z73108ejU9kXh9d4#?M*VY&I>YEzJl02x07K=4mVCS#ReHy7@$}i18qKG~*V4Utg=) zIDa!?;c=X6nsOgs<5e=Q#K(krKPmna!-*yA?ZyVpZ5~0^vD6w+=BQ139S%#>qp-v* zQj3%I=bdcJSoLw#{ey!@4SCAdmhJ-nqEQ`hTj4Xr^-*UZO)`FgUF*k&{R`C8JOh%3 z<~-IbG=PCzahi)p+gKRn)=xW%hBveL7`KhUJz8h>u-4;W`n#F)~ zmqgh(s_=@zKfoAnu*SUX%O?Q37b#A31@UX!X z&~X~eo9qPiT?Ob@$Uub=o25z9m1chAlt#xABWcXyzpaedX7|vy$GRjrfTFv3m?kt; z%QHhgwCOwAt&BMFMLyY!Am#L|c!0z75qau$?jb#OmdSXf0LY zd5d!zwnBl6fC9tzlaTl`8J|ngwf8aYE@~@0Lo~>uOx*yQU`H!~>PCX|7V2iW`x=`c zvG+r~2l~$9*8lQ4w~%MGkBXNS$`9xE7zwT$6)MPBdRk$`f-0x}MvdolEif41m)>tp zci3zE1IyI>Cp0K*GHo%ck#@ORAW&HNKl4Lw%iq145bHBYB)Lpn?T;R8q_^ zf!deur2;qp3PuinexS*yDW z6lBZmkt5>?6?9P_YttbSHkJ{aEGgFOdlYv5<4QW6REYA&*o*D!>nyX<`nT8f4<_4b zBe6-Ld<-?e=@~tbRc40mk&%8xnM2AB+IieMdUsBFss>!oYbJT0px=FHz&clZCW7~F zyD_od%02eU94Z!A*RJ+HGT58#UyIw%_v>3zMllfK&Gibd56hX=v ztaq$CA$fq$CiN3UzT~x@WpSVCqRD%-5*sOpPP4w)P?Lv&ke2zgudi?z$dlGmZaz|d zwW8rAYSYXqw^43>W6(#DL)5b%Rts+^uB5Rla^q!i93D|?ZLvA)=OQ zFcFII6ScnQxFBzgzj5blT@E|(J*l&@x|685aw?b2q|mi@ydyJ!6vo@}Y4na# zfRwEZK}`2ii0$w5=&x4VtQx@j=&d1MW)t1L5SevF6mN;>w(uOc@$CuU5VCugF!t?k zdn;>qr$AKCk@O|iA}g=rqwRoNS6rpm6cwB**2eQWHbM8PzS@mLTxr{Qtf2y-`I8ZoP7%$ z7RG|ZSxxBsf+OdjCu>zssB7x;vuajE(m1+N9d=2Sy8c$rwGqDDx#=Y0oR{tQ64vBa z{;Dh#+#LdzFfQYf@^izReXV?Ckz?f(8BYLW>4p1Yi=^z8K07xV;n^lPhafwYQ1Nmd zp)#t=IJZ9qGg*6|rbiPx`U@3Lz!7SCOhEZcd6i;{3`_ftvtqm(bxxG8nk+Y9b7I62 zKUz55<@_7Bqk7G)Bb_yO1mz0S%_aC6_dA|tm zxM)k_=~%bl(I43hQeBgzrHKO=x(R~7WV(%X7}P0|sq|BVI?X ztcIH8C~6LV?I^B6Hoi@WY(&MNkb-K8B@M1P$Njt~JVCW@SnMRp;XDjRaDMBO0b zZTAFmIl@+4s7$IfY433hG5x3>mf*?#s>nr}sAI0-vC2sa<-nG5ACHwKc;jN5(%IE% z@A7iPHgz6<6(F5ct3QMk-)VD={t`mqR>ZS9NIZ#VO@a9NA3s2We5k7RwSVTWl19^C2=V*4j-jj7Z0I zlH-+Qd=c9}LH1Lh!sg_&lm~r-Uyr-_ZZ^ISS-p^xoU-y*$l0w&KiDezd?~rCKpI7= z`BTm=$?>`O5t>vPCxNmpPLa68*OAww*`L>=H7i2V`nS=KirVcq<|-Q&N*F%N+Fu)|Glcksni?<^Qfb> zg>X9Cy2!s_9O>RgUY~f9V!Nq}I%5eyE6@_AOv8G%Zu`*dNm>!}9CmGx!ishhi_&&5 zZT>9O9eH)ixa#vys?|J^;MebwA;0k~TB^&$gmc{#n?YU{WWtlIhXe0-G$lsoC#_a% zhkU`3IFy>OJ*@T;IjB`IR7^Ej>qxH`+G zc?mUAeQ7-5jplU*j70^(Xc7dpfwUK(iv6*NWz&}0wM<77*}e!)2e{{~w2g;{U@)Av zNUlCaTo2HpR?=5)MJmYug5lPzy-9pU0BL)$HcxX9V2?JwtWbtXgxB?zU%c(K(1pvKa=t@ymM zW*+dH^GoPDlmmCP@U7I3JE+K0##f;)+OQu)?nT2{+(HQ609CVfX}eGT;ywtoc#dT$jDhOZ!==2$E`rV?Rt*& zvLKg#Q$P^d;InBj%7sB`7kSm+PZ`%$3-3~$o#vS)^B(@JS_t|N5-%bdex^?QaRjL+ z4Z^!OftasRVeT#W_V!uYWhFY>OEs=$)T^jK3*V)#JGFHc4EY%^cG+-}{>$hVK6FNc zF;3jvR?H3q`vqb-B?wTk##Qvnbt`VWAVxON72M>bkCAtBNxM8}f8?PLrLu8?w!1mH zb9p6|C+zpvn=L@A9Adylw94Ih@}xhu6f6UX+hQ|TVP zaj!R9)TGp?z7Ru z527ds3XY!M#&e7kg5_u3V7t$DnBw-V>giz&`Z#(o@h}rFYC+-g51^Mo50q(SZP6O0 zPWSUFazE|xogeAur{}>#W97gbsU5HS>_V=Gp4)&>{KNaXZ8#zlq?GR!bzAR7>hdvO zRC1}svwb5>xFsT=EUgaPc{-bXZk~HW(^=MCZI!Yb=A)9>YgdMr$3z=yNvIBZTHJb2 zsTlED1h@k*(9t=o$!7Y~AcyKo*${cU%d@%ltR4+zz_-C@7it-2EK0B~wdZ0`&)H*y zjB1;?bcxJvuk}Kr4>$4w6XTz-17|49StIoQ2{q}G4mZe==sw2VPJ4R6pdjob`ZEiD zhgBU&E%0JimXGXpaey5o6=Ju>j(*;eR|a#4{h}r?Uo?h0)iS(ERLc&{O&;94IN@{S z7u#^8bJkhsO7s+*K9BetQ;w|{;)J%2+LzEF(-Wxs3t5D^pS{!q>)Q#9b-{uYq=|9T zY?~Jm(kijZI}}2-BJWA$aS0FiEwKwJ%+ZT%wIdP;tHP~MAOW8kfjoFdLk9^gQ?sn+ zPl`HNhX92GUK?TV;9GLGHY9rM^*&ULL1yyY>^}6J!|5mT5iV6^K``2xq&9k&{ZP1U zsjd)j@cfc!a+}DL5MFaI^iVBtVS~4=q-N9_$O!w_p_v7J{%ppw)3nmBo#bC^ji-%L z#h)?LGO&7}j(+-dN0VF8*UkH^p~;hJvI~3DP1%m5i6OTuZV&rnOQ|^V5=RTl|IZU6 zh5QbLXg};1N%aDspp6w%CPYLqctBkk(yldVPP|@4Ek|8QHtYu}doO8Yx+LJ2sZr&~uO34lCq`^IgzYU?_KZiW63z(a zGOxGo9*BD@sm`I`%jFB|%rz7lT}JZ~F7J2LZAkr+0G%g$)!qfemz5%$2_nf|?rXNr zRfw)w?Y@86QqsT0c&H(Vnz20~eZl)AV8iU&oMR|0fcNG-1BAVlBR)qTSG#}whKed0* z9=AQzX!a+MPJGs@plvz>(Q-Cht%^2u1+_Wy-%Jb~0dSe>nmKVsM)u;d?fv0Ieugh! zp;>EZcoR>MGfx&f0g|hV+GX z8|1?IwcHGRY3`Ox?`|JI7~TrIM_a84ncVx?i7Z4}YEN+yhzHSLOZAHnVW##M$V7`3 zQ@%(a*8Yxl$5=W&lVQ%ax{m#lz!y?sBLbeS7DQ2D#nF(4C<^-|kt2SBL^>SiCxzLK zL~NN;8p>7$sEl`Bk`IB3Z4JpDw%ug(eNyx}if9OIj5jxNFbzOioI9=up6_AVEe2 zNsyC0={9kEe#s-RVTZPlPcF&1)g-Y8<8GpHebgpIRBB-+AOconw1>pI%MQiu^o4D9 z&^5YR>5#tL80-S9&U8+jDQr1y{65>u2T_kP{PUPK)<#@eYRCpUQ%0>Mu2Bh(05v0& z@h3_xL=`oHXS5r)I0%8qyfm+^2?Yb{@rtaX1?Nbd>n{BIW+a`J1H{sHT>9 zkMlRp_#3S&|C-eZKrZIzS7QRVAfp!i^Lp3Ys)~DaOd420mEv{`*Lr$_wBUmZRyuWLK2h_Eo5C zQ9a>ntn2D{E~qwdZs&T;!iWoC=#keq^$4emV$_F23j8$RuX1%xIyjmuVFAkS)doM! zkxu!SPpThGp3#b0fzErYYN88(5eY` z1rQ0a8vUB;>9LS1bw^T2MqF8SnJb7StXK@XiFhiIg_EhU|ihf+KUOzu;)krQ1#Jo?EOE}Dg z;5GpYCfXz)XAXr}lM19`DB5AAlil$wDicl4Nrfuo%%fT4nMdz?&RSTu@#Q5}x+LzP zcBlQSpv_KD-hQ*d=@sOV+hJ=B;i)V$IlSbpM@Spdwu|MdIJ;iWEE(kryxU3)aTG~* zA!-KdF0u={&~}HqYvXpszGVh~WPqPI$;M~4Lwicwen~_Z;K|wd8b_vVd+mg|i*`X% z@SM~a0Y|gx-(x0mnsSH}@Y!vpD&nF}HUGbo*?4Vsc8{J_{sgEl#D3xA{ z`mi!$Ks+cl{>Vjc3OsB6=X~u}=q3d&v&YU?f1(%;UIlZCW6;ZTVWHU>hR)6g(#14IM+A(x7Psa}u0R|@m83+Znk#AtWD zQ;HReUTPf&`2`WpvT;c{jiR2OM}@s{yH3z&9wdw;=EDV!+AOcQ%#LIkReOe2BY5UE zH?vgxpjz$iit4T@bx_nwW_R`DrzvbWICWtj8wMa z14da z{;>!pw!%rjnhdw;4W;e0GnjG+5OCx9f`wP;A4gnA0ORc$dgr*3A0dEZs{Xb{;Lq)) zanZ?hCH)pB*-`;c-xgIH_?W=6uQZ5_S^m1Ugf38)t!_{?FZUA_%Bi|#C@Gxnp8G6- z-tU_1;_Ol>!eaCy!oOG5z%_n3Cu0-))b{v5f{bo>b`7#{M!$PT&+TjjtnQGpLmUgo!=XDwc9!Jm9TTo}<`en%Z)0T+lnF;}Kk)7;JhlbGJIue$O0fgfO}Ubf&~iEG zxeQ-43Mr6)Mr>}g5Bo2+msFY#rO4)(QwzZ{B?k=7z=YqhXVVHb&L2eh!~JW?@q~7V zahjb`*+R`0q;MCOaImUK-k8IZB(G9=La3353>t{c-6txqwbfN8dHH2|PQOVFq31bR z*-4~s(thA1Sf&IuW@j0G#tVZh}??vexNAgUK^J5YJJAX;j=|#Nz z8e85EW1iKmKHeF7J|X?JQ(+)8rt&z`qii<>sl-;$8`O&6;84Vllx+-_$})xkQ(O!` zu9Q5SE)d&Wn$U!-T!kBV5VdQD5D`fT0}rhUXc_zwj$#u2_XInRB^QL01~K16gt5qe z2nn#$53;+1&vLQ2)K)4RP=T6a?u!C;#Fuesv77u1wPc{9(vy^|ssdNO^>gyb>-jgq z1yqc81I+TEZ50arZA6$3fV(H9^lv*0&Am{R|9A*wQ*5tR=6L<8nBtQ z9aiDm9ty)AU@4|7S57B}X)EF&3yG*|NBPcLl?V}V5wPH6yP7~-?-JwZ#c0Q|$4FQ8SkTqsVzUdQ9-At5d?ieIQUF^80XE@1- zgE<|4`2){W^JW;ok^*_NBuWv~ESf-bZEL56w;dC*6hGlix8jP?*x?(sh-ws%>eka?CAOs#qDDI(XfOX96-vE}RR(v_G)X+0&R*SO@J-vc%sfsvqPcqY=RZesSG zN)9MqYAw@*wB^XnanwFU_Svpp3Lcqo8VICCy=}9!+WC28@v$4Xnb=M4+1_fE3BOxc zxV~L3i3cmOucRqW7g;}^J_4vFL!Z}e4{c{^(1OU~Lz@<~DOnC2s*6((LXY??4VN_( zfqYsk8d;+%U%GRU1Uh~v7p+ABJ^<3p#nM#h3D2sF1RJX!+xF@`=i6$U#H=K)0!i<& znPDAndMv}YjHU;7ZBVV8ABlR3U-a9s_WN|YamO=xK@qhCm#L;xk;T5o+Ow$9IdQw& z?eKDGLBJ-r)7w_TA6b19jRQNQ7;1Yo0$)Rd6!J zej3;9NDtpL%az*2eHaSSV0Uf5J*5gDq$<7xU*j;3^EC+~(-8s0zndnKtF87VCOZsqb~!(|X~ZHu4~KmWN+= z#x#WoQt1ylwL6YO8G>4bpZ#7?#N;Ql3gy=ko+C6b!tw3u~v^ZgKIyCeI9u1b>8IuKpj68RB;Mq_DSOjjNr*$~A0O8!u^Z1LEV}?c$C0 z@Lh!?1hlWMvwK!y9ZaJ<0bDy3k*$=8Y3KYnu^tx+fp_7!oy<;jY*9S&L^r30)h|Y5 z8M&YFc1jxka#FjK$G+ZYxB6l>Dz`bfmJh^-IGEVvO3JRTMJ4CWn0=6RUTA>?r=WJr zcAe`Zs9`zplb=FJV*#ia)Lz2qGKh}mdKACx@-%HxbqlW@>lUia9$Qk6@XlectC8f3RWgA$l)s1D;4UMS(VD zv7`}gN}FGW!1b`v zQl^GpRQ!({6)FE}SGREeEXzLP5l#Aw9q&eHue9=do7!n#K#}CDhrrfo4&yi9M=J6( z5mj_1?~~D6m8)#wkN$y{EWqHG`xH-@BB@**qGHL&Ze53>6nI&C+lC=@V_6SCtP zJ)LQRo0M1dO+6cGU2xjtu7&jj+tY1_q?-FSwPFuv#$A?x>O+|6Q@rqZ=z62IY0#$YyhteOA1vFj48yaIxEr7l$Q19aQ7=`4h z1|p{#?leCTsR`}L(j%Kd#wv-5iH0A)3}!a#F}hmisP>Z4qOb#bo6J#TE`LHoFK1OW zTts+Vhd9?D2PBt_(tXT@_#JI(baf-QL_Qt6k<0`qt?F?bN(iBGxDuH?!jB@T4fEZ3 zPC`uY7W-;6jY4`!e#ug6nTHn-L)L(Gsuoul{k8&%0?C7s^EdfPZ&M@%zmCE#+?j$& zc5}1VOD*74BDU$gBo&dr*q6d9Y2W)33Vo&4nZc8fvdhy}C&y0KGyw|ND{<~0>|JjS zPKsw)d`-Juk*}QuXbzb`ftoo-co(rMT5Z2KjofUp*DFPKSK<{kIlQyCpGQBwKE$>p zH)(RSr(_qPF*nBSa*dh@EjB{%#|D`Npo-w}u|rhf0{A6Nw>4$KxB}qpv{v_>V!N7L z1xbc@1+OoZpq%d@QY2-CTQ=sqrKL9h0TEBd>O}QkVMv#Euiu zuK!Kp)OxyzEOAGD{@DOb8?7bPf(R$bS?xf_zLIp= zS|2T(cSUP{Eo&zM5)MbPaNh~nKOICP$6FQn5COS_1i)Rw{53cqhlKXrhC-KD^ zkm=#I!$E#cALb_XoK>MKI}ldbRE8fG z235-Tx?C2cP88@TcMW%1ZGg7T6`0bo_A9N(!jnKha|1YGHBzU@@^b3he#hwwKK5fBVrw$NbG275nxK=Sd>Dnu?N`k_Uj(hTw!ag z7TSyk-r@d&VQ6@6az7D&PlnzH&MLXZ{5_I`v$wV*%mC}nX37gt+wnjb3R?1 z&($`)4P!VS0k`0*cJrBP*}o7Oh}yL}qf#jfKad>PWJhNklvWH}k8Q zDcf!&ZPBh;Kd-JcfYttrT6Hh{zhMG7Zi6ez#qP}dB$5pA^wj`hNg3f#JhM!W>|GKJRGQ1BIpJ~e~-zrw6Gl9L*{vEQB*yI*Xe;I_3byufmVgNFG$e10#_ z{bM!rk2=Ilx4HFL`dt8gr`rh7&gvkP?U;QQLQcnHYkoJwOE?unoNZMNS!`~o-Xe2odiv#4ljwMbeu}DZAFk^f+#-~~e@F@UOsFiWd1rm}o!B8tAXkFcI$3(o_^_X+KNqI6VA4RRyj`?gU|5`gY5{{!(y{;(7c66Eol$v~b@>#sc z*0W(wsWLfHXmU2O37F;2#L&9JUzrm$^oz&+Ai4!H*{F@26JfZ!t@xjW3J7 zWA9eMk2pIH6Eq|IFeCJg*4IJ?X^!k*Sn%b~IJ1SUxk1;Cs9xXlznjWIh&kAGVPQW56j^|Ijm08Id(xa zVGn!!rj=9^M7dz*96hT^H;{95W2}`nx5;j1k{P8~lOYwOAf&~bkF0Rw+7BQ$It=>Z zl@k-Sm^5vi*i38xk8R)$V@2P@X@S%>H?*2Rk&&anly@bQX5_L07)lMJWLh= zApI!|6leo7qB;?6I6=wH|HkRZ1dkq6Mi_`HCXVa3 z{it&SPMOD1Ex%|D;nYrv;?$HHX85ArB*^OD5~b?JRS($Z-GW;_RyllVGrM(21h zX@XZ^z}a~KwX)W()anz9lEmS*SYgV;*(}wF!nuAz^>dKxy?7|~qEQp^$g+`So2&k+ zk6@ElcoBUN{7E)GSl8@VkdB3>0nyMngLrvmZs zP>y@L?N3>ILOZwrg~LiXlVsrqSs`nq7mD)G8b!T2Vsci8rE+kTbV79wW2OT3GaQ1D zdhudFUcnu+UXi~VH%~v5yU*oTdoI1V`c8!!1&;@iiX%a#6krx2gEn^seU z@-GGkj5#cQ;1h2_jLq`n7Rz*t%Q6x(~NIF121NUb-uLffe;7`z3$4|>CKf|J%ADR00KV6 zJA5GM0OWdK8(jH@eIOS!9<+)UNy>4Ncv7Tg2IXkqe1UR)CFQCUGM69@QJPjje93Gc{B&Be88%= z_HqfXj&p(y$;<&WjP~LGr^-e3!0gAR14Y49KXTRdlXZ@~a9e-7`C+JeD=a2j@IKzx zX;|o|Jj-YsCEO0dMC)w}+!A*De-Z1yuU6>c&}h~^5}n{O+ED0FL~wx*fC5><--p%R zjHWu29qzJs-H!XSh}kWUgw1Q4*2FIjR`TP#UeuQ%3grfos77XP)9<*7w38DebfQPA z)c|M_OH`!mrw<}V+_kSPzRV9EkLzBE*r#>zs-!8t5pG3egePEWjBoF*NkpO`hnn2v z1_O)Li}GkX_d?Fns>#+C;8{7ANCTr*PH4GgQN|}7g7Cc+cRhzvJBW1Ki&>lNV%#Uz z8*fbQ9hJeoPZE5MrmUpjPRp^N7Ds)*VoPU;U=gr!Ri*JaA9oAJ+0cisj)2RC3j0*S z3_Z2T+ZO-vrMFYTVV>+Z3shU}D2iL#MJI{sOdMVn2KVV2nv#>k7yN?nx7UOz4n#+lN6?#y}Wm>EuZ7#kABc)XSY~=3m+FE z+QS^Y$%6f=6ZG@Z=keij)a5JLRyVpn4j-9(CO=iCWm5ZVTq0GBYfW{<3GhdK$m2gm zK71Syh3QCsES;9hriM6FJzNQmnZ4u)M$EWRDRM+uTQs2n#1yXl8GB+{0Y3wW>)nC= zvVD^^qyat^2l5XZs7rAms_XI(4&)hb<(N(zZ}J8nLc1krA*_o~r|Vi!6F6JyeaBG7 zc^wpd(~iNFI2xu@^G zM!m`7YAhtKh<0pKR?ZD=vx?TPwVGZ_5e#T8JjL-6(ClG>E znhfvInW_iTYP`xiACE&}a&tfZZOqDHz(SW)SZJx1Po3UCAtIpClM?=>pvY|?XGNcn z(3Twb0dH$~4du1_;yiPlw1Oa(6%Q6|o1%%C5<4=*XFvjh7V=@v&d8;SNo#c&^!-lc zH9b7bf&+~~-=n~TEl^1uujZnNQTeJ63}kgdzu2%p#;BOwM?u|j_1koA<@lK2-W)_O z8}>~kF2a>g6-RoKJtF++cx<<5_k)ZG(R_{wso+CEF0H{+z$^vba9VqKTNluUc;YTN z--_~V=p>93@q;TPJlYDmTDIon$5dboCxHdSQ$z;-N!E^VzUFd!I*tN}Yvd2Xda&9V zguP;B(bI&UIAR2t*}b`{CNh*Qc2tO3_^WI)EJ5|5AbDQt_z^BgWjK&Q2CS=q zn5X($p)Km@Q{9MEe=WPpl-s)^o1jd6wx3@$&)YXes3tI7jkw6{&-V3)?q)bh=)_;{?$NeL_S1AYs6(dBjrRT_TI6`2-Z>gj3x!5He^ zXcjDiD23CiWY`vAY80j8R+6!)T547gKk`;Sl(gawAKrbe_-vIejBfCWWb*vnWwZj; z@}JH_Cfl{nQWF{xJDVErcheMWHAxj}1p~fgPvBdKlIkx#g~LdWGy+`~q zTU&(3()OQ+Wt1A~L_};ciI5eEI-rplw;|%Nep}P<>RR+8nQ!g?NsK5 zYs}wax2NrEab9ddX~j9xw43?Ff3~1%d}|TBwU6v@*DzS*C9S=HJ;ayIJNQlVhE>Ek zHn@WdwZ~3S=u?^rF`e!nLxA&F4(`0kF8l$@mbAN;*mhvK-IUK!Uw6ct#(OTDj%7ep zr**~P^kh=G&xxPW8Gyl~JKA4Co_aZ&MQWiZRQ23e|1)Yn>;WTLhjc(u|Mv%vZ zw37�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%0ALJ)4s?L~q1vaXw<8*L#ifLi6V z$--g(hx87Tm=`U&){mz=)5E ze>A8K^;)d-_qX0X3)_WY1%D5ZQ$*c%Ei`l)-nxO#;T%tx(lpT|5gW+3!af8H3a#;% zLvzTZZYVA0OtnK5rx*S1Wut9V(Snu4h?CzuS5@T$ywcy0^^%mppof?RotHrf0ml7? z+w3LQ+eGcHZd=CoUFarCo^$cQ(G(P6?w{c=CeyufTYQQ;v6(!|`&12dje8&(%#Ve{ zDynjjJdd~inPu48voAx z*B{{%T;FP2SCE<))$wo}+}5oE6}=db;?1K^voU(_cD|v$-H=X(*V?Bne`9l`Z--6n zibZ_{a?*NVfE_pT9gT>09D)4dE=_}y&{o42XCSCR<7@=bt{h3)6Dr0q395{3sKd#i z@>6{DgLvT)YYr$%ouw!hCcJ0kph7U%a2(@pT7+SY{oA>k;b+hg!*bJfM+I^8=%t{X?qk4T=mX`x)8Kzra`4CUZW%CjnQ}dRhqa z-3q=KqQb}4;i7IOhQMGLEz8CNM`(V3oLv^npkqrq4KXZx%X)Q!H_9L?5$ZI;J#+ht zJ-f~Aug1wJ)+};}V`;vBtLPx(6D|QNxLu4vYqYM*0JMy=jr}wt(H@dSiXi(&3Rx*h zWN6#!Sv8as%|l&|y>R;8LKevj#UM+ZiNM_0SsR6HS`zyj5_<+L)|RN-Tr}XwF&1Rq z7<7qvh!BAmHkI| zo2qpn-HoPH+vA;%+DW@p3&$^MCJwRyzP}eVU{94~&OuGGrkDW#`C*qWmg5r_41plR z)!!7eXWX3>Wk&(cgjjt`&MRWi7%gHOEzyq1s_cUngv)+QC^0`qNMGyHZp8s((}~Rs zT0Y0PxD(bZ^m;N*TH|Yprqd%hYps&+0ew?SO>dr!`X}U-2x&dya@GC+bg}9!VinpO z>XeGO(jSSnB}YO3`$E+INX%=A-0bSvD>}Iz=iq+G`VyPqS+{cR8+ObZyjamP!bN2h z(%Zvg)M_mQX$5%>!>}5HfACOu#=~dtaLwq(0z~2xpFq~;6Be_sRo^EVh&tp9t02a2 zmQ45P7w*`|Vu%puWkyl82|>Kms&;!Dv`*$22I54;p4jM&5n!AzyhEkqpL6y%=vM<& zcA2t3~2}HQiaWTmN;wGfG0- zA)LN;86&R5>y6;c-fOeZI;=m;;FGsw@mcF^wYOLBK}ze0#ta@Is&fkok)I4X%Zsc= z&(6m&E|x>XkL{UEs1vXp?E8U2MzjbwS#0z3B)d&+uF+y!n}pY1#lJsDTaxf!bYufb z1x8eoALImx7A3JZuz@oW+8X$1VoH&>HjtQw%G`}SZXdB=KP9OBEDL-=`C+AfWM@0E z;14yU61qX)Eh6?%N_S2W1y#%7}dJ_^wj<0pf7~!-ABWGtBu{Z%Ey35-Ku7^nN}0O`!os~ zgiftembbp1h~XQwQXj8ab&YI}PVEE<7b))ElF-~P{JfSW`L!($HiWn}Ud^JwpxMkxx(a*NYADumm zcmFl?Gg+h7`pi_~yn=sF!^c`gNz~3$ucB;A^xAKeMxpN$P{ipb=a!Cacbam9P058o zi-xvXWjM5hHCE7T8QSyNq!)R2|Gn!i*ymHv=+&>IF=ZCW7+JY+XBGIptqgbckHy23 z<_HI5h)Crv7C$_fOVAm>bvT)=01C=RvW;$IuM=d z&F(dWMC_Va2>Uj3>cO?s!a7lmx876LyxUdxcf9r0Exd?x*86BR*vU$pa3QZcMQKRJl3bcrrF3>SEj#8Eiq8468|C_Q_IBY-eq~#$HI6Ztqu0k4(z) z6cZb4FVZDsqM_i4b9^nlbhSO%44X`4#A8Cw3g+Pu{KE*kRFYHac_+&g zu@C-jiYEKJ=tv1k$zfs;|3vAeg=$6dpxYJy(=U8aUg3bn2_wTwlPMtPRNKYcqx?(R zP73fR1_JRmndB&l{}1~?1-`>yYsU?Nt8aA0);jqXEmNL=nv)7mW*1b!5&zfd&<0co z`nx`2{X_(#8Vf96CR0%#<5NxoQAAmY^Hm+slBO@wJv>~k#(Vx6;U$9hc(yi^#>FTL zlE(o5*1rKcv zIRz2xHIF#_I%GxVMlNE3vy70QPqyE5XV|6>d;gjkM8v4}uN;im^BRhaBq=*g_C&G1 z#ipb5N+0Wx!5tm}mWKfc*fc<+I?)?;gZQWJY6p==&WPF*#I0`F1&q0TZsp8`_juy_ z8@klbbN?&HL_SVuBY9L#yC5g=S>n9#zLEYwFcE;jpHrAWWD}A*l3h(8djypaf~eCs z?;+nNhjfI;lFbpj#_{heH2LNiG=yT{Q>HeIxB$OgbJG!dL;2r`t?^T0i1h%BSBES6 zsbedS^Fq}y?f5cMGw2q>>y&Q)T2zopc4JOUmfGyvm_6i5)p_9Ad|PQ&;ad8ZF7-ib z5Z4^LXHfi>%P=jLWk3mOD=k!I0>-ntqU@OQgqB6oUfr3T|4?YsgB?|RW+e@L?H zT{lgO?SKH>d597l?9ZSRA9R8vsRfdW@xh}s_tjt2N7);snu@-+f2eaC6xZY&ylOF` zbcAZ@6D<%n1NUlO26<44Qzxrg#K-u6*V~b_FGu3onbS2XIN zvZS7#S_(MU!_CHno0YklB+g90p6N*sMiT_?e<7#}7#wR=DenlNQs{Tgw;e->vCt>t z`|Wj{0U{jCg?Hdu9~)g&a+0m<^yf$bnxOQ(=(9Hd3_G!OafY2(lPF3si#j3(OR+pw zwfr`J>K0t{0o0^9M^FWmf00Ah>bR*2YM~u&$bq_tsI*VY%2V3K8vUZRb{Usj z^i&zvC97Suk6VUM3q<9cV1b*E(@XrZsFh1nPuLm)KCPXz6z`qy`WwFMk5O!Izzq-| zLLQQ#By)LVlEMxnb9uHL7dQ*v{6qT#vU=Wb?WDk;&Zkh)c$w$90viJOt=6>fadgVU z*T`!%*u{!*%=>`~O)Q{7r&+)?AvlR0?GZb*#pR?Js2-9}rb!r7wyMNDhk~mv;ou>%9rB)7jchshw&ma6HTOC&Mt)BSLD0h&+1!W8e6Xg`--ldK8pzWO} z$$8TzMF3N}kjq}7XRxy%z03Fp+}~qgY!|&i4is1DraI>|XpUj6ZSke-O`_eE6#Wq@ z*0(@Ir=I-!&w*?RckdsI@KL5L|BJ^})4U7`;y088=suk|d*e8&Kw`9VsL{2r<34Os z7UvznQu||XFBJ%G$+qKY>Ir3hLQTN(M5S8;>roh9j_P)j^a#0@QGHblJ9(9NK>n6J zlYC%`(;!8gFIxKhSnq#IY9W5gyQ|<50$R;J`ycXw@7mt1$t|#h)2{WA55`cR1f&OC z|E?xBH$ZuYnvr3*#ShZaZ4y;>2F+>DDTxoe)6QW^&H3=ShB{v(2|F4cijSrQQ|;0I z0S{X|IA%XqXGr@bJhd5gLMev?J7hC;I=HHyh|O4y+cGn*yLqdXcC;j{(uqZZZH`)- z68e23_J-%K`=mf*+OCMWGf3Y0o;^mwxC;319!lD>5d=F{+EU!FL@C;aKJSeRb)>u6 z0Z0~8NC;2b%vW)Id{@2FCJ94L*|cGo&tADK7H|#zJsWf&S4j_B^LGBh_a=rN=HugvdD{Kqn)AoB$i`+IH?mb z#KIk6Eim{p;`y1xgBC}w_u+X=SA4YiVN$)*ng8yhA6H>56j;2#HcI@Tr2#6vHno+W zMdbJhf4ftAK++2Q-vQ}xYd~CsV*{>mQh_&J;XKb%c0YRa8vZhoUXx6b0)!<80+W*S@ zeC!#%%z$fBQ>e7WJib~$%|(mlscS0fYL?`AkEdE86={yd0rsQ_40Q?$Ig_o=oSBFc zY%}qd9z@-Nbal?h(u>5mDwiAjCv2+<6z@0HIu>)QKh)*qk;Y< z1!6#>vX~Xa98rDv3A{_4(G7^pQo}s^t;%CR<2I& zq0P3@Rt8gCi#27A}uEn{FVtO;&hr7`k38d60u~v=Pk2|U0B%zhA zJ1uyYo?$TXZ#>5$)o1-aFh;p$fBue#lU6LjoNf0>FbRIvj?Lrl%4}j3`GxH_s7+fV zku#tjJLcsJ=Yc|5lYm?>9a>Dn`tyMlMrIkihSnYJQ&I>@js6i z5adTLQ<-{#D;u|Pqbo+jh|q)0$Q9kji!f}x2CFP|@NcxqeFK=*ZdHhIvnkr#G|{4K zkS0~gBQ~~)AMeu`bh)k&yE=qbOa1sf?Nw6(e6P!WTv(6cB9G2tAoPC9b1b&%$T;lh zI|)*6zsis4{P38q+bM;oVi47?&3d$JvrY&!BO8kL!6}@A!W}54!w6cGaDK?q zL8(O2yG<>SH2UFSsfSNtJDrt{N*sGYPKtG}@e>sJHd~KEh1r{pye3Fq*K2+M#N}ij zAUS(Dx`T7qrYt=yi^C|9<7QUTun+qRxQwE}q<<*^gnLu^ukH*ED9 zWvCl!+Xk2kDrt}3(C@TtT>&3iH`;S;wd(&>?7Ay{K09-bZC`u^e@|^W@;%veHx}-EDSk zywfKiCAy;)9hX^OoR*HFs`^7g>xU4uD-ZZp0AG{07r_!&k=Fge!ofyWA_G?DC)8`N z-t}aVX&aYPV)P33dUl=xj>U-kxUg+YA)!KytBJmvwQ$X2_o!QVrVrN5aUm@5kdSe% zg|Pn%o}mQBBgCQ<55%vv+2TN&0re1JA?0@9Pm}@Y$OO#lEf=(8XAF#Y%YU;h2*~#GNWDx7RXuQV3@-1F{rWtf1TQQnnW_ynyuZw^=#-a%IDGaeMNmeq=XaA6u zxy}(&4~dYZMT^5-)rE>kF-Cx!WA6>x-r_T0j)JG#Yz&Pf{5aL@NzTra@R_UZkTlU> z*kjm!haab(M0>9oJClDp#y+jHR<|`mR<Ki2k}h=xsrB%f;2MvuRIKZ z^MFXY0b^-{kW^F1;ma{btc?GYnd-XTefipDQBVdnVqTqfAh$kpv(o?D%y_hUYwV5{ zO1FDoZ|t`9n8Wx+I0z{)X`?-jmD$NV*~cZ0T$3Chep=a+cz0b>J^Ht z!S``n86-gZRc_n?JaSSPc)%Ak@PuErYbmR&?AZiXHUuM@$F!o)>=2HdgmR3XJ!8+c zAi-Rxjc<48ZiFg2%kTb;O@$#uimU!5r2pzXHT#u#in%d+E5yU?6~gZYw>MI&u@QT- zyHDd#k>xe9z*MJGe{?$4PAild8X=;5<|34bOe}EATI}q5n&9ZL&5e72aSXTQX?h+EkK-9Fk%24oZZlewxs8u!^&ciZiWP zVR`SU10sV&P~YNpv!q!mRO`9cAc4h>qh5EF2%7b&O%K>ZIW6rHczrc(&p2+nk@)7f z{UW4nXizXMC90sx#&0}okFhS3FMS00z>(ew(IMP)vw)*I$1)CC$sV}rB@Q@RZI_2_ zk02_53I+Ej45J#v^+=n*H`ubvRfGy3t1LFwaAm**?P@*sGM;eTm>Z03}m9 z0XW~1#5)0`de+7pxsw^9xFW4Au1Pe9DBetwwg8;;Q_F%^m)ip za9wjUg}C13&m1UU*=^5bZpZeB4_A=ZB~;jJqLBOTIx2spl>iGYcqiop8;J~_Z)!|y zPvwtnHJ<5EgthN*)b3C`tKu9p`>U+v_H(AX%C&mL0#qcv&uwPNo-8CwD_<=4Pvwf{ zd^JA?i)>oRZ`*kVugA{^EwSi`w#6{w-J4|y$nMV&6w0kL#hiz}IfZEP3%68m zz-?z_b+1H_aVb%9qffTfCMshmPjzA5)+2#w))cn+@TX!nW4ynn*JtrxU8{2#ULRlB z>yZui8F4C$XJrCMYh-b8u$h#u z%ASqdPeU1G@COB{3nTWE7N-UrSfc=+8MJq}x#1whm&jW2xfur`a4d~VPs&{Xadw25b{E526So*|e&P0sBuz#fzpI+q(G zLjD$rr&qlB0-UcC-#+>TYgd9U!C5>_h5WZcgyRAgR}G*rl_Ti&F}UD78MA^`spiME zvF6ic23y+Ge(exgml_haRF_O4$Pcz@OfR(shlt?97*d3PdZC-F*SR8LXIN4KiB-D1 z=M?2Vc-BAj(_lbnQBv~#2PDKxLY?WTFT}rJhZ6msr@A4hiM_zeFk$VkHlg~;t6g?D zxld{o1Xlc)3tNA&?X}6x2uz zodx|_yDM$;(6+Q>6(Ypf<^hTZXmuUS+LQ=XYhYVy-O!9+i1%RC?!Uv0JWftvud(c zlBd<=tg62onYi9#t=D7=h$^`IYP9yzzBG01`!NzC-AmVUpz^KV9r95&7DU7+z3TP> zpjJ2gY(&{i&|Vw`)z)OKB1kNIZ-!03#fSPn?c|h8l1!ucWYg61tcp}7#5O^m4LQwz z!ai?C!h6#LxKNv$p~`w^jbJ#`V8H{~PQH(qQmrx(W8g#mJ zJ3?4)_xX$#Tvwy)G0gw`{R(^YWULL;`e#slG*KT8bJ^fs!%G#Pd?zKg`>sl1KL z<5QmOv?D+rC8ML13r8~>l!ru7ptTlV&&=4QKxemuMP6fns?s7Stdv9~VcEj% zlG{+n8eBm={*~ni&Oa4)5w4PN5@#8vlH2?7B4PUXX;n|sp_fN>NXcRuvU!gxYpScr z?#dV7>h@snZC))_fT|Z_X~m291!vtOFmtb<(Zds zrdoiBBBL1o|C&In(*zpuq5$kVx9JKL4OVc)%5>bSnO|r?65xwk9{)35Y>g>#nF$p4NU*A5$nyEsb%ToYcQys+gzxa-Kn$T9U+Bv>Gis zg(i=`rIze~gUDcKN2o(qyn|%N5zrjep>4Y*kfix*FW>R{&;2|OTv+f2`mR&J6VBSj zg)PuMSa+U9J|ChR2jE3c5ZE!*)+7a-(c6pJ?Ie3~EX5XuGklXn`E0v5vZy#dCL)q- zX`79|fq!)Exm1w}6cZ*g2?S;Ri2bqOZx{5NKC%+OgzZf5NY~rv@fIk-fQcB@gS+m- z*o4hm;8Tmq{4kB7`P+amviX62V)4s(B9ibAx_F+@EDMYQ$obPR*#Fq-mNT!VBsF&m zEbm6{zwI)hv#gvLRWe)6=dHpIZ+Cie8vh;;WtsD_JQ|~9!!)Byz?6; z6~T6lt?h;@fuqEw#EvB!O4;Qulz#$De;Zaaj{N3H;q;#y6}ua7A&CykvFt$`zOVsC zX`$;qFZ?GS_E97?SDdIF$ZZC)@?+D5I&{F*p@ivOA)Vb`VFvX|n}ll|)&Q(AC2RlU zU5g8_qNC&aa02dz?;WZ{FIvGEd=o9OH58&4QVhWnl}d?dwl0s#fG8HDWqqC(9#1!H zY&U>U$fb>}D43Y(^4G9%uAbOiMM3CS9jdj-sgdck zY7OECD7fkw^D50FEC5*6rvt!Rd0P}&`Qo66c6y;|Z}!>#Ek@Nngewl)tMIOW!rwc4 zS9v;2x9ZDLF+DE`HLhf?*!6%$QABs5XsR1wh+}!3lGH4s)joL!y`NCsh3WAS#H%^1 zMz4sxwrzt)xvsF4t5$5M2{gfUcSqG|pIdVQo#^IsrqKGm+Ha>o3bCR(QlFnc%(q`@ z2@W@+HeIX@bxW4eoud-=TUD1~B{ly?D=a94Hs*Rfb1|~~9af>?1Hg+yt9eeeMdk|3 zL`P5v-86d*FMLIhmI!k-fk$}8-tR<7-*jtdg458Lymcf044I^}FqbdS#NfS)s6AvO z1Ys663?BT)vB;o|_rF<=>d=9gTY0~93ZXj@Lm2FckmdMzltQSn7wWSua zGe|3c=HZ801c%a`h9gpq&SRh2r_D>njlO#ONel$1om^R!#cFlTgl3>Jz^PiHlO!UI zv2#bP!%G1Fgsj>kcA;CiEMbY7c{c87|D1i@3s@HcbZIL!j>unV{ZvQz23QwbQxxOn zuBRRRKrOHIJBXL80tg|dnX{QY8zK>Wd@EGN!*Zf??&wNApGoIYPUCf+ALJW z1D9F?RZnfR%B|PDau*N=wfi?Tbob{m{e0kEwYvg(F-yn^ln(4UnPC>s{kXh1W(NVW zs%ou8M0PNp$7~8Y`Gei{;*Cv3j{sPqENrrIu+WnBy!^BePw_JU*<-}7fea7wy7C(S zzj?4eoYzirzf(VC=2uYj3~-Bt3Q$egd%RWt)HvMQU3@g8l9qQAAOC!k#{+B*c^@!l zQ^Q+63;z6@he#T9(rgT>F!;GmsF@1x44O)OP0H@#Q*tSAkDzb;$6qW+*P7CPWG?IXg!#}kVSJR0= z0)DHzg?kT458GD>OB7Dtwkb!`7@|g>xtqNt*+&ql33(eA_D8^RDOGyNS_8>S9Y6o)SLBoRY^C{}^{C^nj2L5<7ijys~ zs@#fmHXoN8!+Hb;3MMV#ot)FvUen`XJooc=I`{)JAI&}4gc}0(`;2|qNu4G%IcRTS zJMn&Nc!ED%0CyJ>mI&!A|aaCBu`Tt#|mk8&BV*NQ+PdY*Ces&LA$ki|&WHeYwn-wDYZG584}NN$+5YKnfwL;Bb^kgWH) zRf=bj@t`%O5ck@w_?ZH5@nwS29Ps32yvMzW=mM|h{-%(NRUvz*$Af<|gp{o$Iq&7{ z=dOgBPU9hgVv%Up#AF7ehJ_>zqkeyf6P=5?bgsx>L;gNp#2* zBHp%KNBg~;wpPf^XzcGO3TJZ|$Xj;rUF^EezU!xq^Fxak&XaY8cMCW&o7_imHKfR6 zZG%W-ldYnY&r44^8M7PZfNO1!n2%?i5O)5T#{4#iCeMSp$6&DAP)+RCwXP`o4($q+O@w(A1+40l@`&$XE0$&fgN6d?u2JGak4 z$tn5J6cH?Md*#K!TWm)Ky+aCKyFEntv@{G%*q8FD?|zk?QF}PxgloFf`{?!)a*QPn@cTBM8G;xYQw=w9fYCBe? zo1Clp%4sK<03qoN{O_JQYm+1T3k`yQ3rNncj=-uytfs>G@(5^6-3Rt@jeR?uvL!Kl zKaI+K(?xD#qpXT94ekgO*Rv}}0KOn(4;kxhBc`{)WhjcXmt=PZoM*Va#{W$z|iJj8j6W5sY{<}QUze6~qvju!-xKTIr zFSZE95xK5>>-v@iPH4GL_J!ll_BIA_x&h(KLkJ5KwDV!$_`2}fby&w#PRZNsoEmK^ zIOFo$3E!@c`;mk#WesgJshdG1 z2`eUe)(q#sC*WP+e9}Yq{Y)#ras_beU)2%8b!V-lmhd%6-S%agwYyLKgW@_jM!74J z*XOXUokXI!nEZw0K0MZCS@NZj-IyUV)ly0azqt7_KP6LOo_P>&wlu2{e}YSW3e6Q7Rgx{;VyPfFwZqe=nMBxS!$Jry@ z_9drXb^m|uB5q@hx1ufwK#VC-h^qo0Z1E8g5OfW(gKXK5s09QDnBbMQZf0VBsRPnJG zeRIUk5aG?oLbM?n(idCKCol8p_W}G=6}n{6JlXP~dhb1W9kS-lv@xzD+k6<=x*XP# z6D-|WfzA{yv(JWbYqRWh*ECHV3Rdi3y>gPJ`GnX>Hetjn!`RQs*kvz?MEZ*Xm&s&J zV=2g#7X-7cGqrNDforu=-`29J!pB5MXuwLY2c#I_7vaMwxgKe>8*gZ|w=#17EW>U@ zcK@@W6%2Znb6|ZS(4SE$vbf4A*O9%hh03FicPmi@AyD8a?R(y}w;-70A&6*yJm&*8 zoRkCeNJ9;fh6pQaGwYP#AkzC{)^4>ee?Y5FX6FUQA$y3 z-xo*5nsTBXOo^vkG0DX-fNC;zBiq(`F0?pQ?G-g z-&p1L4#f7_HikZa0f5AD5&=lX^p?~=TrizBqr1g)lD)A3XY>&&cm*Z@QB1}#(sC-vialzbxa zd8LT*pY~uBcly4)6zZbf|1Ye?rJvB!c#`R4*lKK0w)IH*Zme^^i|vwHTy8hEair>f z`F`f9T8084(yH{<*)QAqK-1rR04#|~Du7QWsniPs4{0WMs&shBH|#1TiOZkP*C4A} ziY=YuM^N8MQ`vTDUhC*Mk3$N#uE&0riShRzOA&Jr7dqw^T}{l({OHmH9-(~Xo?KeT zF(H}-Y?zdHR}NLWwWFU&M2E5QzfK4vrfwuKgTFs7(!)ElA*0rA>w$T;YYF_bSP-zN z{V7-19$VeYqF7~6BL%9*27a!L^d%i1frqpjU?Y;Rq4@8@K^!(J6!yO-C}=H)Snj<( zp{;sf*M4xfxWbLUShd5{p0{Gs%@WHB3fWhSP{|=cre_SH6{mfHOcS8X@ToKDy+9hO z&QRB#r{R~{fO3W@wx&ZnsPUx^DdO!W02KjK?t+S})CuQaKqbwY;{ma?lD4pwwU99+ z?bAlzoS=3uRNHSEL|Tg4yzN3BwnhHlM~V3{gLt;0AK3&~*~Nhn5gQ@{{TBgG4bWq35jm&ws#BLD6`~eDue>Ta82-1cDz$vR14R~6gJWOW zcJ_hP;3wbgTudW#gn#+D_?QlTtckjF4A)!x8oP1@ou#rS@S6@h3FmYI&S{t^nP(o+y zoghUoN!36?)E69gx(}&*PTYAfYPOVRR!`ZhE$wK0xg)`5;>=%%~gxj|a z@YlqXudw-rZco*mTK+}g#qi^=G&);K*3Kp8ATWj;hq~RW){OHbzZ4(J!9>SNY1-JP zD?Zr}5o{MP*sUU9dOU}I9PbKU_Hff!a{Zm{E&=E)oaFky>fBP2?D{rdnNK@~L~dYY z>v{{UvSe_cOzUuDIXkH7Z=h8soonsX5WpQ)RAF;VDV}#gf-SP+a(25bQ67NngM)Di zK%CmGg(sRM|I)S#dOi4j^yLzi@obx2xaWP2qQ9pwz#;j*xN6&?KLvk!!!j|t#&fwt zZRco%RVj}7hY-taivCju;f()F_cjL5iOLmDSAJlZRoEXj##&m3UU7H`XKVv2`0PiZ z7*FGP2I%Eh_VR8Hi5&;>q+<&~YRWm#@|;he1Qe-&cT6mqvm+_GCVE80;(7LNzg?lo zj~Ixzz7%i-NAf7_*i7Aw|EZ_b2^pZ$-cK@i5o~10%&PGy{kV@&IzC{f+11EjI{#?31k)S;8bZhyx~JXQXAwJ`%R128!N`xHhFcgTTqaO z&g1ij6(+1Y2&qFj~_GZ9sC0wT1 zuZ|)6UHa*NIBe}X3Z6O#&rVQs#AiD+N8Ou4mgN~+K#DYfyP;HoCtV18lj}WK=bM?K z;KBow!CoiCE>ZD<4bXpQ(0+t{?@`|R-2ikakY9zccAolc=+{*|#T7Z*?BabdzloH> z!cTB@to{aubOEd}9Rilra`RH{Wd_y>?E5(@qC5TcU!t2Wg#sP{uT8~|CU-#QPD0jjczP+2LUC)-Yi^s4xYVv$QmKHh}45jl@SNXfaOahdqd?vWe zdGx#zg@0wx#&Iv1wO^09g@V7E;n;N~J<_J7b_qkQMaT@){z3|n6LzcfM*!Y%$kjG~ zG+VyTEu2!e?5IGB;820G6c#o`a8Z-k&nL#DDd$UBROVmRgR$UKK8yIU6kd<^*6oA# zSXBBolE4-7hT9li(QPh$+ym|o+DAEi4p&NAGOb0cigqDvcUWB7)a++ASISf~EFKl)uE) zdW7|I#5RS#=Ag9{h~B5{z>npu-FcN9h+~!>e5_Emj*pN(3R6K)=@i*(Qb)~C{pR>mNlp*ZvFp3Kda_7eNL@l~x z5Mx|_^(H&3)tZ;{rz`5nnLl=?NzaxUYV*MD2=elNK2>}3jjdoDImdCz>2y;B=3rWOC zeO_kzsoMq!#7z} zO9+@xZ}$jQvqi9d8sv$I-+;K_9#mM2L9GP$7%Eo_WWJaRv=`-r+W{b8+O5;u$PzBjZ83T=2u<~=XycBzp6;+RhJwz(KX+OS zfo45F_bz@~O7Xt)(EawhM!)#RDDekubm?I;g=awD?{8A9K`{zA^fKGina@DF9qYjv zJ&*M~O5onh4jl!_4lJZH7N`!>%x>6h4etc->|A04WfRDr@w}_VY>(GAQD$&Qa0HsM6#TnN-&>H3Y-yO zgBmR_`km6Z@TS!^E@`@QM5MY1+j=jf#YtDTOBX(Bt=+W-xB-uLDc@|->A99w6pO#& zSvAwkNp%>7{eB*9BCyYZVnwuFsN+NhxGXkYP@`a>rxrmqeE1&%;-fF#1y8%BI;rl!3 zLieKG7e_}orr(^2DeAF!(E%NY(3)GAATjjCXsSaV$<{MlKpl=ZvWkqP|5?*Ek_14Jn z6pgyiQfGNDxte)HeC!YYv#oxR(l#<{8-1PGA6j z7}L?a$}VW7qpo!A#%4lWkmyjI$w5P@1t|pe^qAm0@q=B|02X?po$wIFu^d4YEgWwo z%+yLYyv6DAM<{1J9Zxq#(e|D8E8L1^`xe@PBt|lsxws>oxV#Ey53=rZrji)f)H#!u z#c@O}R}-bNmT`}>9c{p@A>V4*SD)!sHA!41L-tmX7YP`Bb_Fq%5u60gN+F|14J3z= zi-$ctFQM=)*q-e{p?eauasf7HZ|i7RvknmSJN)8hz4l{Y#HN6>mvscJ;xUY77XW%Z zka|xSzfms#ThfhQ;!URD!j>YVxN|3f*`Mm-?5(+n(VZLYkyu=g7ZOF;5WiJT7^LIX zj$A&sBhkd91CRpZ45RN#KIc7j9*`fT|Z>iCEdd$8n z*|_Q;%a3dFM(1g*2H6xVt!v@S1Msf$@#+C&Q`r${u_|{63ui-0XTg(vjW*n#?YE{> z1Woup@cfMfVQiJMYd9ggeEFHU#alSj>5v_9(yKcZ(|if#-4WND&A$#Qr!$`Ck}Zi442V6 zviHDgp+6TPC01B zfDc9B2Wzzm>uTI(UV`dJHmP>dj&H{q&q91f=*N?!FZ=;)mnmezae6eTb(S;Qj`6l3 zb^L#~A-PW9m3GP+`+Pa2Kvfg&{u|tr(`5|))Fe{cKU#g3XZno3#$O5bi&KjE`1<`lvems4kj(79Fi&tQPVG;Gsv#nn89B_&ji$FUXq2ow3&?nZAL zVo*J})0Utz_mQ_9>aOD`tf*Zv)k=6#*MM9Jdf7|SpXoPOiaq+H$*xp zK{?zSq{W(Ddyz`1l8!-99lyn#3F0}=(GIG4$PlFUT+L)c#8Ri@9lx{Wh=m+ye+)ztVNHW|Wupg7Z_;$3C>D?C*XyKA#<#`9Hs?@l) zH$D1S>&#m^-`0<-Btd#BhKx@3)QT-+ZskZ;B!=C#vozNpr#{u<2D_h3Ce4K-Z1vk3 zjMPAY220hQyQdl)gvai2XEfU5S14d;ZQkF)1n5T>4|(A%5t!zC+%J?WZzG2ZOc zypXFw0{oA3?ckpQM5ezH8^&D{!(v&lw>ObPfuoBwY3{X{KRV)ek<6>^c2z|?#bfDz zHuyYO{k$Ev#xB)}JEpjYHN%(LMNC+Zn*UI79^}1y(93~VdRz{2pz%D7_SsA%l^*or zNdu@C7%54R`p4&y>m+&DCwzFx$yV)}$Yq_iZWpkVRx^SmC0vsXxGXsZP~Gp)tVo*| z)P6ylbaH^(S$2MMHC_+WDuq`L9h0;4;{GbDQ1EC}IpL+sFWWcrHMGlBYaRu%9^yIc z@7bgk5;8{LEw=vamONpqoxv6q0rw4vch10COmOVvqAu*PT8!|^H7W3T5qY6sWQlzo zw0?qOSgsJ=m&ELbznmFd@ zmWxF>P{PcKNZT)pnUyyh&SxwxaCNUVj$(o8X0Db@< z{57i{NH{dT2$BrG^ky8=snmg+4Dig6T3*4{nmxTSe^`p+4$_ZiKbLq^F(;0FvIC?( z$MHh%*^`e0Ok9uAJZ7)^Mm$p!Lg@Ce{#A!C;qESjt`TTL6CQB&)oBB1bfSx{gmdKk zBiWPq%iB7!7#LEE3tc<`#i}RZ*kuu!hj_KmbD{WO>>u-^Vu9-~;W6CI8?I?I>Yt)f zw3oWHt>U3}etklZ62V9MVV^7R4=3pUjsQRw*&B?yqraq#vjbYGm55J4qO>(4cmO)- zJ&v4O%u67(ML)AmwUi!L(#kj<+)FO%r_MzMe6V;U2`qY)U*`hfY0GTpVk^)45L*>0 zVi9-<#erDmNnSdAKA!*L;rt#y?J2N^|k&#lXU_~n6PCM5GDaM z!G!?<6F?nsA>h&xQ6pL$P)l$PSZi=&&{l&*9nrQ?y9`)s=%T?cM!QY0)u^qFwzfgr z+ez&0jdn4(j#W9|*Yo~NfZpEU?_VV|pE;kiJm)#vD#g2L8C=1qm1vB$`$n+zTiO92 zzH5R+WPTUqkk5cpEt|+0Omu1%a`}yONMrekz|KGmg3z4QXf2Si>N-N%c$Jgv+bNsg zW>+K>4`JI>0}J~-4FO8u1cNP4TKxrhirbS1Y{zG_S#g? zzSOQsL0*v?OLe=pQXHkv1fr-`*k)*Tg8AoS5_xtJv&=s7^+Gk@;iiJa;gDJmaO2~{ z-9g2b--hk{egwfTiTIFYMhX2dsE=olzr;qE$R&oy~-l`}vI0+ul@ zNgyG;%G=H%WR+yx#1BQ+u6G5b>Gi77caD!7y`h-?0T!hbN7HY(WnH0 zcZ;?1c}WoWxAR~578x)wvvz^auO=yZfnBYgJiZhvETR0F5NAcbSnkc})fd~T017}o z#~72hE`deco?@*eiC2rppq-uK6*TN1A}y)M)K&GXqwtr#x39GUdIJO%w_hQk2T+P) zD(tqnfr=yX8u3X$$=MbU)Y ze0r@c4)@VSxwr$cbDZkv`3x{4>jQn^%5#c*-u@Ppsk+|2;UZhw9xW~i+bA_dPglyi z#3850v3xv0GbtTc1|^pQJ8D>4nP>5MmOj_jU%qP768wT++vrxL5X^EN%GLP1$i}j> zffgdy_;j~Q={6}5YKyej3XUs_<;~@}{;}Zs_|^6Hvh(CNcC208M$Cq8Dzx&EUB@dC znwp%*XLu5p?+AAmQM2sohlLQ+sAss5M@C3UZHLdP)mOAksSepx%M^j046GnFXNh^8 zzWp{;Q{Sia9?luc`K!rp#RLt(F*r$}Ntl(di)UAtxE#0fEcFBPcQvFgIr+8zZ(kL$ z6aDCo0O+@MljRqf+9G7WPGY3;Q^@!cKca|B_K-!R?7Uuh9{Y{BqH-|$&0f776xEm# zeR6yvkj_M{m?|KqxL}|Gm99lY*u|bcxHrg3T6{_AqT3pMD$BcetJC6aJ~=-~DgeO4 zh}d7q-kM%(-6z)-hHktDx5rtc-ex@fcAhtZjnbTO03L9RgnoJy?PzPIGa-oq|1N8x zEav`e^!`}zfjSdzakPnMoMo%%nuX{4=$P8@vNm$EWocF9O`cd-VZ0t{XB(hK%^QF5 zBBDk%LUy$uoTUbij+xNO33s#g0!eKY?yJ~y^X2q-sCYWohTA(`F}@~hk17$yXGIhA z=q?EB;9sQE+`T`rl!FlJUHF>o^^7zMg3N5eKLV9#XemUqKYx0AGHVqH3@<=KS*dMxDNVP#jFjNWix>XJ$TA0-B49_gb%};mOUpr9L^TdIMs%f6Q-(P6F>0m`$;fxMv|3dZaK%4n zuQX5!SiVMz)M+0_2^E1z2O=u3N?Ku=b#)`1jy`_j`_$cS!f=K{4nXr6dn&2`7_y?5 zgs+xCjZNXphf|nd2Oo}+{=uGuS%>C_N*kFJyL(rF1Av|iv3=8vf-dRXM0$_+swSIZ zOzbYp@2gJR;M9D47OaUY9kxn+c2N$Q3CnwP?%prI2?22&D@rn4YIma=gvKM$egb?; z9ItMLQTu_Dlp|7v8Qcn!o^Glg+7S2!op8ZlE9Mq%C(}FJ`6ATEt>CN`um3d0DG%AF zUg1#zmXjvQ1=h(gsgY(L;chnjJ~MWzuGO3%uM}MGd{VuxU@Hpq7m+4@IyD>zC*G}s zXyEh``Qj?uA@VJxP-j76-7kC=zWWRo##{axuiz7@w?D}r(ZUhXNSIb6*!U&A^;M#Z zzOLcSYt3I}uUBK^yE#XYD*`1Xv~arFw2G8th<17gL6xy{lTdkU5J0{NmP{>iai;u{o&T=I9ixutu>^>`AX@#3lELPc}2(EZE^?SF* zl82gXrTu=pC2hM?x&DYf#NSCgM?W*$p1J>sFp~%}U=kc*F({p&E8b}xiZddVk0Y3T zC}_Np1{{*j3caw<)=kg-_K)n4rNpp;CnI_s=O!JIR+?}d;B!9R=f_8H!-(3b#MsH3 zRIIwl?klkumZLi)Q1kH4ny6I*CD2=G$MsS&b-g1IO;=a=V(NC}q3ILL^lNlBXy*)A zm>M{Q#iRYQ^19ufVvdP7S+C&{&;!z%qsXu%1>7met0~q8Tl&~9m$ZK-MpCFh+OYKn z?C%--Z_(@DgRaqAilXd}Tt5LPG_flgB1lk_LU&)V=PR)LACbsL5r=!QQ1H2Eg@3Pw zU--_mU(hEPoW%QpkI+k3E6qy#7K!AxZj9pHq}F}D1z3GvmBVP((dvD+y@V8gF<}F4 z=SmfH9CT~#8X~P^O7>P;ODm0oArt6WmD{f%?3eS#$7j-+6ms!bkR;u}cOsFgXl-Bb zc6t#b`&4QflFG*UN&Aze^r&g8Q;_m3y=s>MGDJk22(S(Tfzgc1;JSJ(JSEf=;Heb- zT(`swbgRl1B<(1~VN>WZnsFzoq@2}Ph;wso5z#>KwS~CJelR8_x?KqrxS_BKr@rhv zeAWi8E2At6h)D=_rZB@tjtKbwuqZg-18` z8OF%ZawdERsB9rkBw9v5+3AITby!}a-YeZKvx@b2Z1|ZdamAJbC)6rYY>|{T^0O)b z>+Ban@>G8E27Y6!TxubOuYa)xL0@qs$CaCTb^YSel{Jpg4K=)GT6mOftF;FuxE-@O zjj5v}jlzSY8@gQ5sAdV+(lwzGvXoG8mVL%0L>`v7o$RZKRJ(SnCWc2M0q^!=?Ae9O zRWpGOueyBE!TVA6nGT#?IL(jywvFz>goBxA#{TXFgK^B|OITIip1*5?j+il+vhgV^ zuAv`fE*0ZE``LgGr6OtEZov)w7&rc)6HOCcGbKNIO0f&@^wLCj5uZf4!L5DDA1gZNNF9p{k3Y89pqbc5djkq zH1%q^x83rzwS0Z8)H?52UKY@Oa=j3R@}N@NrY84QtDikgy&F)mq63BdOvexDK^K zJ~7e?c?y6!1#6^ChzDV|`WU|1h1_o@Lp*Q-*?wSlL{$?Oe7!9{=!;t_LQSup^}2WU ztKJ%`f>dU}U5ts0LP|+cM!Rjx!+G_g{ci{zMA>}drerI04*p|#9`b1Ut`Vq} zOAB6kdq?AxvN)yEYrMG!CDuXbl`c==R}1;YX{siBt7TQY`rfM@C7$2rqhPSSO zR1tRfE}3s?Nh969sQt+CH1lnGJcX>;KA47XK)N#q#b}Vaz=Ud?d6N3B$)@jlpp^`w z$kBhm_tSgkG_a_VZ@`7yI^|W9kvL)@D?S`aU4zfg;IZGgp9D0@{ilq|pBE9m$aKQ7 zkajh?#Sf)nkZN)+rL4tqA7uPDH52t+DsiU^xD!=d+3g)aUyavMK+1s&u=xB*IOsB4 zCk;yT0zN`G+XDOw*J1p&c(~u@LA%poJex_!1G7cp%n%`8atZK#-YD&T?R=va>t3XO z0UQwxC!Qy=g=BYXH}ObfM`8Vq?b|+^gNvZBWyLKvc?eoGq&bGd4NzC@SVDkqSX^(f zY7h|f6sp>6{x{VK8f@f;&1}#LiBE;wtS3B&wQRxM#DK z3J|qK`V1j11$X7z0RI~~-0iaq6ve445^v4##??RKiQ;VLpQS1VR?OHt+?65H`s8RwZ}Nl1kRrwIOm z>pq1x%NaI1Y6ES^%t9;ZGXM+Kv7_wHKpZsMALKJ=&CrRX1V3W9n>X6B-stVrBUu%O|8Avp=hvR+u+^ z4m5`iN0CgWm*s>2u(7>i-&0%|BJ9`OxfNd5pQvK>&vSb)Zx92IsTFuHm5m!UF?uo} zfDC@rEu6-M?bAvccu?vT^#HZ6c^-Qeg}`I%+z$I)dm2reuR_)+bxbA@Embr4YaK9vFm1+6;^kY4bL8iLjO`;VPc_xn+b~bCntFFJJze z#?l|y?h4*~H9Xu>9ub9^x))7qa4uVfRX9mwsb_vXBUp*?Yq#|CB^*`S{_IPsKYI1Httm?{-+@{dVPu@pT}o)yVc`mK5?-XQ#29YI~%mL(=*i ze*SANi5@x9Fkf}$;*2&Cmr5wt zlOFFL`UIa&9)lIgXk2x3i*Z>6E(_~+H4>sdiUTN+&5hJ&2|9c(BdukpnpL_?yEO@LNPy?K4Bg zdCdsDM6jyd?$q@iv7xnt$l(VLIK*X+MJP``&owRG#}kKBD95~!^F&SD)bsk58&sl5 zxRR;@;aLOJ!d9j_m>vy*s@@2ysCtx3fVo^CD&D_u{bEs~r_!zZK$36S!qctA8171h z`5v8+b?vI%3Cbw#a4vwV`yw2hwOtqu4*#F#lD(ADm{`W;F?ZP%=wOE+V20$uj`e0Q z!g#mk%wE8fsP77ihPDQpLTjjpJms1_oYOyUu}D8b^kd6hB4hc32aJt4$S-$AFYSN) z{CazB1s;|C0M8ivoxspJHJX;`fC2-DjwVAE=~!l9h?5X;R~p40!-GE>wO=~UfXf&O zK6l1IDAz!w>ncTdu9nRA;{&%_UaK7~H7ci|;}csT1*}4e?&ZK7Q%MNwurve;_TQsq0VJU6jH^i|P`bsY@v~BC4WRiD}9Z1_9IltbN>K$1(q> z*m&l__16}z(w2F&VPr5Ffzi8gelQ^aR9&X?GEb$6e}yAQK)tqJP_E~k-qPB!m8(ca zX~KbhdGph~neG%nV1l}!g-OqF2m<#8fUxqq=3cC>Vjv{^fb0Z+0PEFQ zL?;sbt^nEOmYo}LYb?PIgG!N2B_K4|l(Ki4p&5Z6*%(?e1!)#(DEGS$^yS=(tblet3({s^7Y~p0!9#7Y&;2 zHo7uakr?FHSeGqL=5!2)?vYQRtgksmaxy{({*R5=VW^^7YK(d6;9mj*ZAJGyum#BG zF3;G%B7r%1AY7L3(uNrsVSc3ngCzIg=H7jmi0L5YNU-UHB6s^ba~ zQMBgMLIzZpi*`b^SN2*7deeg5Obnx54Giw5Fr+f2;F@6yODKI2`+L|n5dsVGaBueo z>{F}USeqK??|`;Vi>9QFOQ1@&Rv{+64>CC+&H+7m4b|!4WlyyeU6H2W&PH|c*joSr zzx{svi)6tyHe;0CLLVo&UZsT;`~7L$`zHuQYsZ|=enPX^*Xq0k48d=3mN{9d22qGT z{CU@`UxecRkscYY)e?yuz~A3FEo#6l=%Ap?z&mX_oib(Ysgd;u&;G zeK&7I{R%QISll82!Lw{0QkS;w8kSeZ>m#Jb;^$g?_$R3WB^Znbg2 zc9q)y!JpLd%s{A`< z=WubCH`s47kS85j*CtVMp)ME1#9E%h>#P)8kaU%-Fk$;s*w(N4v+Hd>tu7tNCrA*Z z{|>=6x%RudLl$lYbtZ*qzrZaLcP19KF_fePdSW7{Gj5l7lEtKVYne5Wo>?zb3p5^V<*t&idF)e+8+|VJ&L+^lHaTK}r_%wv~Cw z-V!%N=rrppgy(}fsJC{fRjdDZV**n=e*1f#)y)Ka&3227FOjH9P%F}-G%xxyf|D#W zY3GG0^xV)&6fDaJUE=dn+alVA+gf`0^`*>j zC@a2+3IdKIphD9qRPj6gj1bF(&xk{?aPumG7KVLxMw_i}u#1~*v!nzBKtd@oy&g=W z#Rd6jZ{#c_^mltYYhTW`VkvEO)3m9e!jnXOke86wueI$PFmHOJM2iWC?^)dlTUc)q zC!lvoZ*(bMEN>S7|4Fyqr7d_RG*7w7!IQOuWYb#sE~5Q^L3wH2jWXga5_?CBGYU}c zniOxY!bbPwe4cKJ%bh2^td1WvA4S7!&GYEHo;vJvfdk=f4lRA+2y&L)1gX6XDlxnu zmyU^l+~ZBB+VNTZTRD}#2v&JGB*HL4JQE=%eE~$Q{xjV!d_H5-<+kS9?>0%d#?spu z=0|H69w+FSGr-)Eg0J|kMSZMTh~cw7fIUI0-c2IAxByd2JlKSd;@Am~hwi*#Xsn5q zKFqp>_S@l=_L!DK@BMADS~#jX0dbgGhl?!F5BvmsTO4 z?>5=%%@WZO>FR?EfsRBn6L9QNaO7n$!o7TXaTgy*xgwacA`pS_`NK&&6WJuus;&0R ztm5Y%2-M>Zz|Pwa02Q0}Hh!*vbkH|t${dNYy6E`N({PT7$ygh9{;oGTGe9_sJI zf`wWwkj2y;M!Gi=i;BasUy8G(nZCu6!0vsEq&& z@a?{xR=x$&M3qK6C(`b+H7in!0%(m_@11v=xxkL?>cgzPROBo6PAd=pScdzT5CH+Z zznkV+4^twc^Z4tD!c44Rh)SCpUdh@@ZIqar)B((QqkXmnP|z$?*&VT1gBxSWwdA|B zR+Efb*O7l@jTHjEJJOs~0D2!>#K{BB^V^^E@Wi9)QLJ~ZVFWf6@Ma6`lnm-yWHo6_ zvjlErbTVQ;&9vbN?zelD+3G%q_@rD%ehg|nvV$vlG~`D_!adNBZ*YlitxaliLmy-5 zqyPZB(l4^AO?TT-%kai(;yDs+I-Kt+Mzad+R-diyCl8|&i&2Js9^q1X|a2_8Tnwa?nQcWebL!~QWT7^8GUwmHeqs-P)rw5{m0 zojBFo_~yeRK$a3}4Wn!=$uK|Xm_99hAJ=M^rp;z%ncv1;2l*d`yq7ZmE$hdu>LtE$ zim|pgHI(6>__D)SGIMs!ur2aYE%O&&|Cr;83bIR!r!JLB7m@yyp@1s=dF_QqSvil# z2Padg2G3In_5LB$`hFyBHrcHqJzAhKmvc~*)HDb^xJo&A&M~ba8_e2hg8HeTwPVl@ zF+`Q{XH||rvpi*ECAR9!+>)#>yTzkN>k>Lzp70W}J2iW752gZ-JczqF%6XHsFc0LV z#VghdbbxQA z&oVNbzKC7?j&IQI9BlxGJ!VOp*I>5_-Efpi9lbwmwmg+)xk^hz5s)TSs?uy;+K%h2 zJjxTnx7G8t$BE#}d9bdJyKr-nL@*8Xq8qTyytYl$oX6l-X=uI2?LD}0OV|=?Qlz^9GR;EBpiyzY z;21eqvhN=uDVESA2r}>5nvk8CvCny1TduXoqN+Z+4rj3TB=jOEwAUGwyJ(Xf?<2>k zbmx|F2n%Xod1P&Fq|oP9AGo>gdL^EY%-PQp4e9zuZ9s4pMv}{-n=Q4xO^Y)kfbY}7*x6dh#Nu`0dQSkq%y#IR?<|}0eT?s2r zD~xQ(Ue-?wDH8%7_MeWD2C~XKiMDIV5+0y5=9rr6$+;a#dQ80|YQ#*;7E`0KfE-h^ z!0w=eD0J4LLi8Nmg@)p^o@YExkdEp!pZmVxf5G#GPHN!b%yvP?4dYf zhr4Z{h4LXm-YU;@jI)h`&eX013upj%uM*M!g>7tCo#)0R&TMpBYnbndND=Nw4Od#p zJXB#Q-o`KdN0&{?bXYzB_FU99A#PL+9`5(5EKwa~`J~oe6$Ind!FJepE67&PXN+Pw zf_D{q#=X&K&Un&&Uh!ulVLx74bOa00uCwqX2|eS7T*Ujr|Ojg|@R4_OH0 zt42gjoM>QTnH9~k=71VHPWM?pPz;)#m~oc437ki?&c1vfFQddh_A#a<^g3JO*{;Is zNWYMHiB|*A62oqv6@`#QXjqA31i4#X6GfGYSzmG(bL@=!?0?9(e`qY=62nLA!fjmP zlA;h#FDQ-rFo1eU)@@fg(kAE{6N8T08ti04`Sr9qmH}mWS~kyyf6?)*Q0_b5_6xqjs_u zAv~3h()r>GWTd1;8pT*HqX(&dRY;8udp>&*QTYi+H*4y2Ujvd_dY1aokyE?G)N=r( zwS2z>c0EDpa43Z3MIAXGGsLfa+NS!^lgH?3cm~ym`u?3~dA<>})*<)w>9zJmeVBiL zf~^3peF}*U!K-;JDTtN|s{F3I?ct+zDvwklmplGo&d9*~Z~C<;^8&{k6Ny?-OGiiu z*FHxmirafB8{coA$Hnn0j+H{8%wzd9FDOTFMmqxf{2$2~g}|_BPMTH6Y{ETOpC+5) zpGT6Nszu%E^l2MFD`3a51;FW3u12q9Xm&0cI!sxJ|1@GzBdeE?O)|}ctG@NAJo=g6 z1?~Mt6Q=+`4i4$;z^Q7e+P<9J6tZ+IFUcGA28he*9=2LJq{*GBA?Mk5|O?h`Yr zwUv*@=BnQCtT&QWLYHSBn6=&93#^BYEl} zq$vbICHq<}`umrZxdN2Z5KPKlvnW=krSjjP<|rGn zuRz3T+741A@!OZ-oOkmyoGyE_8zum}e*xZlACRL6%PoaU)AS-erhN81$?IIcfBgX+ zLUiw2NtZ75O-Z6ew8Y3`$34_PRF%}b9pRvESbR3c z2r-bV&p^yXZ0;Pt4R#>hV*A?cCP*ISbCpyWeY%2m6$<%tu(A*Nvn81}1f&XOAL4Og z&D*GpLWSyvtu=;5l_VshITW$_m3|+~-#OrWg(H)d7`cs~C{zM{`kii=H7-*=GIG#gDz;An_z zn;U$ZR(VQ+t&7*LjL7wrx6)A+^LolP3HYmC+X5>uR+b@F)z^Ei6h7I(;%g!{VK$B3 zi}>jKP=(9+MN*~XB&wTwz0r|2XL#@1{Q=qCqw0bAyBHc!U?2oP6MJI|-(BewD%!<~ zQrps9K_&NC5XZ@`Qqw#F0nrK9?>g08=gbquTUc34Y`^sY^jiVvGP0$I3TJC?ng>5^ zz~j)T)Y&e_1&l-?8;UJ0Zgo&}M$!B36*fqhO;|9*?O(+Nz+n1~C{_?qCu$NZW|( zxwus@S$g^a0^`X=B~ZO{^_S40=`IvIo6aBzxGmDPNWS!37^KcZpS z_+e5oO&ec?*@QE^{rkjYhIo78G3kgH>Db(%>o`C`SHVkwY|d7Qnl~s{3>L(d`hg;~ zoPrtVaFE_Rq*Q4uE^Lg-lSFTqO8T|f;LfOhU(q|PR>mqYVIIOz_{Kl+8{fD3E<27U zU+PduYM1@2PBeKnpwQ6duku|=C5u&xDQYK9@xpxeNR~kSYaWco&9?~wQ|))2tQ_Dm z!qC5UJmvZctZ<3Wn9U2>HX$B=+Lpi}qI&83w{9W9I|LWD+qs*pZ7p7e;muBJuP1|Y zrlDEc46kNGFHh%E?vD>$b%e8Ngh{-~m8{%>P1o9bA3wK*hkOWPm@zo*Q`2vU_<+D; zHMVB6X?UtiX^rM5MvF zqFY8Cu>vMndgH88drJLvXR$wIJmL39uO(3pu6%pQC-^)fr9*V8>U^)^DeR*98D_JT zWq6G$9Wd-4-;z00Ojp^)P1d&xM_1HHMe+$&T$){;!eFwJOi(t+*;~H0zp0nb7fDJCrDD7zS0)_b)^16-n9%3@tsLM^oR<7rT zL-=A_7x9JBuROUis_1q;RXtx zbf<08;En_sgDJ}sy1SJd7i#NVh6P_hiZk5?Bj{Rb=(!k_Ufou#|HltTT*E6Rh3v4_ z1?pBqW4+Bs!`jnoxj5ZAgs5A22{S=5OYvZ^WmPc6H8kFD_uKW$?Y}}?dDrZ=3;5Eq zA)*zs%jX&xwKrEBT?(>s7s?m&IOReP><6{^GDrGC1`={!Q0X_KYGZtSPd~1BXJ@NT zcmt`qGK`uJwrFB)4s!ZE9}XF!MD2Jn>VrOXt+2;$chY`%3>b2!at~(mqx?a7_>k=5 zZJA~E#>LY)1kb5aU^t{`D0QuKGD;&|J?6QTQqGBbO)7Lk*qPl4P6Z$ z=!nW$qp}V+*l~jvY@ul#>ObW0JS{%t2x!_6Hs_@sS0Av&|Id?6g+cLO8=>?N(q?ra z(&M9ggH25P=%oujHwR1nUD*B_wkHrDzk!+;I)SVn^-K{>yx!gkHrO4R3$Uy_Ke5Ta zjU}cW+tXs$BIj)Q?QS&N8&243|DCNMsd_bPCpBZqdB|uH`|?K?k-&h|d5x|mcJl%? zy3(9MaW9yel(xT2WkNzpmANhLm>vV=ieKsQ-R(5~bVAGy0=*JkK!JLMEYjS;tg{s2@ z$jG#|FK%`&x`XdVe)jnkY()XOQ$B=zPRtNE5>Rg=IsPJ8hkph&eVOmJOnncK9u=G> z_`P0-D!PS_NyP+rXL0ncSzDe3dW1lI)-cJT#a>Nrkl%-Xy46i?l-Q@QZ4xC0D!MP{ zyx+3J2zJx4Q#ZWPC!+Ks#}a-xlNYcEqLk-u<+o1&JVbHXB=$e*c<7#yc=a<9Y;`7uqj`@UU&PT=veW=&%@~TPy&4l>60}Gvmb>tE)N>fs@gR{g zb~-i9kWGz)pYLa{#z-=zs*CTnA3tN4Us^?%Tzy6eAZcaAdC&koWJm%4`|S1wE~l8T z4wb{n>b-l>UHr}?@XUXalNoR6PM+OKh3u3$7Uk})iI*SY-B#!gq-}HxUjyqAKvQZh ziSN;aaMY=40nJ1Q?@^m}n_G^xM zMX{py?Aa*b5EoyCP`37}eSVnlj}Z7tDfm(EXKhNB=g}FJWe7zHYRIFJ9XPUr2m7wE zb!U!cDVq5~lx`xbmfXwL$d^K)<|7%>Ac^L)^1X~>`3XhlFCtY*IRASF0bp7NZ8@qJ z?#D&>akQEV4=w1G-(9G!TgAE;%>ZJLTU|X@ce}lPhCww}7U6Xf2l)eCJ5^$P;_aZ+ zQfo&N_YOzMUzW(PSY#oIfL2));=|ubj}A^yCw_Q^dQfAJit)}-sw2?z<~J~;D0h4y#M7Kx4Lnaj&OK;-p?aU6zy!Y zeRmWqrs7;Yq4bMCl*W|UUk7pHCz)n^P6PN15o+m1 zl;CTath>L?OYydN*XhW_gcjAhPZiqun-Fx(Ct0%pZ)wDHF)0-$WAz6RbQG{dVJ2Mp zzd8Xz7`mUO=Ddsgv=;9^#RVMQ#REi}clj-*YTUhfJX1+MY}iu=t8prJ2k4Zoz`uN{ zli%Y^D5Du>XF~sRA{yg)9lydj;fK7^%lPIiL1I3r3x-ruXl5zS)`z~#X^Ob6-Y0{0 zGKkP7XL9m!0|H;Sby=I+r{x>mVW{SjkRxCrSN0yKz@~YNOVuV1Gzz2I{lYR|hXOqe ze>_p!E;3*l7&G+(Frw1mlL$UVF~%ti=fSlx+`l{oKkfF!=e60BDKsTb_#xI==g`Z_ z!vtgMX%FY_+egd6;}91+D8zWDC%QT_{KETC-8f#L%BH1obGzG78WHlFVLoJ3)GK6F zCrgR2DjThCWlu;~^5;{0cFXQyozBv0`IEMSINqX?BIP|1iG95mOc(Jx>Dqb;YP}b< znDI@w04p5uDiectV@7)tLhI{jBY08Mav24q2%j$3yMk6Yz~?ZeGxeSQX4(0+Gz+Wq z9IYwyNigJRW*x{cNXGgCJ|NJ*OF44qEZb1k5U5tnK7NXQhw#(`vilbl&d+f~(F6hi zXx#rsAF#z)ns=*yo87S<+sRvISI^{SKkc~s%ke%0ZM7D8<8*uY!8JVD*V}=Al3Ty4 zYDKh3^h616om^{h%mXbriEQ?P2IYW{dDX4&kfudL1ax`ovB>Zw+o+91F}D?p z*B~}=Kk;h@ZHKq0EGN( zUPion4K(w~kPjJRkJ^ur1BB1o6`SnqYk{&b_Y}n3mJI7#&97X_L)T_#Do9&tv;8rJ z(v;Ze66g<<78YC}5@4UW`xBbkUS_9g9rPItjBoga5v6e@JNsJB z4|i$o!%k5Xrf|?neBAlqhIPYE_m=imVHaA8SVAHw+N_p`eyz*qWFT6bap+;&brza8 zBDHdBN%NOo5kg#lgFM*8kF$1EmKU*?-w^eNeOrUikyA3>%N44Cr*#%`gd$IzeioT*YHNYC4*RZLBYCX8{e)7%(oM+{{m!C&H0? zs0xJ4ygL?crA`eKl)r*Nbp>s+jR_->Ce*E~4h5kzQ&DgquYPr~xzldVTVvdQj;gaT zSFMQ;}pnYGZnVit z6IUaZA0e`%fsRYsk)D=n?bXDJG;6+06Mg%)B_sSF{SKhh>i#I4wW=Nkb;>@_)3Dci zF@9eKA9^x>yt3V5>#?O}Be~g;BxjZ(0r-fUxtV*(LS8_A+&Zzm>OL#-TRjGnv`I;J z38701aQBtk*z+Q9??jM+;-M^%&vdm{0wSo1PDVQ8$UPiK!a{-~kBBYvIFkG}*!TnI z8$68gsuSlAGAk&u>|Oiz;nVSp%A%TLX>$K{QJ@@4lhb-1M^jfgy~AZIkBpl8!S zpZu277LX_B+YHgUt!Q@}B+x!Wf1V9yT9RPxw?NaPkE%i1E(U7aL&SF7h)%B2>qN+hgz&M>Dm}<9UE!p$eUft#}8uK^K4WEOW{&Hn-xOz2T-f` z=*J{ddAq@YDV02rF!w9;38W}VYnEwBU6Y#RyGTcbIu-nZsUFiAe zbqJuAzXc`j??jCq)I5V_43d*$gqVth4~k-E0^3{OsAOl1^VqGApr+FsZ0l`lO61~Ts2k_Q(%g+ zjMZVOZ|t(4BO@*2e9x}uz=_vwNgn3`sguI%?ZOp=08H|^ zYBb6c0>4}77G3~Y00?!m5+Km z^)^fUx8WcciaddW9Hdq4O{A6vzdlTJFQ+nnAjX8(*z1RlL1eEk7j;?#x6NLMg9r*V zR7PB>fJX>wD0x9&TN(ozXQ7nM%zy+>1EqB2&;e;PYk;E}ZTG`VO}2$z7t&n*K3@$U zo5bE0ZMRW8_8Rp7d<-+4gNocEhwAG`a`UjdSphYQ zo~%atn~6)9X#ylgJVyEMd0x@ql5{L+p6+gXOsb%}KMl5Pj9SWLxxF@VcSd8~)!#A8 zZ@{&oX+fgP1}lFm-0Q=x*lw@NEZs%422au;_@Mgr7Wk^{DXr*!;oyok6l>iO95}I% zb(r9 zW~=Szbry7Z{5w2Mz-J%TIdeQqLP>Vg%%C0R;W~u!xVF^aH#R7~+!Io^qUF3gnNBFY2bfYtyLR$8b*-TWT={Y5 zzY8F#Zqkalv=Bn6yn2gwcV!)SS7JU_*QF-n+i$bV>|vLrl(wYO5w%L>bqugc z4*Vi${@505CKku@>oP7454M7Ctt_YG=G9v=rzQhd0;v2va?k0>UQMBVn8#DmJF^c@ z@+m+6OI5+~Mtuo)Qjl(ws|obk%(Px%Q3@|Kh{aXf&*Ysa3UF$_*C`ptZF7K;q6uBo z$YeoOOBYX5%L9LUhZVHYvg~up4uIN;Dwf#WDZSX)eX8ZqgHvUzyX+;cI&A05o@+*K zpV;08d(n~F7prXs-|1#{?-^?K2Sh3qXHk}I@F`UQsC|a))db?2J715szMPW`Sb*uG=oW&-obE>6@#v=(4p(`&Z`vRReEez3lzE-lD!cc zWK~mK&ZjNlqaLR$IBe(Sl91yNS`Xv|tOa&MJL6?M;y2Nu5?)|&KsK4{)oaiM%0~fv z1I0=SL>~LEY*Q2(q6Ow@anyzzkVWkX57(4YuU^k?0MT!QD9XAOmOtAS%4kMoPsa_m zyo-nF090pbEf zT~gD;^EoH;g=pyi4@sJvYnJk1v=?C5*@s%TSg~4THM*q5vngBCY``bB5jhV`yG@nd zk+Q49maJ03_O_iG&WeU=xD!3u9Ets2t7@^i zD)K9iFK~`GOO;>~1%Aj%R|6?`$!nt>Mr5PIDzM*9bVZ_S)~fO&?90Q*tYSy_u}H=6B7Q%{K!EDUFbgWBngO+;-J-I{Mun$GXQC~) zxthpluw?cO@lzJ_YLDgxUrrE3i+Ys2O|mCiGI*K$bs~fXv=(+TJWaj=Y4{&O{1VVG zqdZWksxh*;N`_LRV2&=WBzn&YrtHrtyFX#Wy?}M_AtJgeVvjc~k|Tgu_>o`cNBoV_ zk>Jg3cq06M%DEn?(sfownOzO{ygPTYeC{VCv?uYGt8Iz$HbgYi3xOoUfqp1S*cq=C z!f_$%FICEa6L-|99u0N^4f7qD`vISRf&IZdK8>qJtWJwgq?I_ZmLs{eLWn#+)8AoI zqG@e>L4$>ba=)PU?Eu}lHO6dd6!vQ@6z5xNk#Su~?x31VZ>&8{tFS+v+iHV5wYzsQ zA9)*X_kvt>scjc*8y6>7I7AILtQ0m>+EXL|pSSWfBKxLQsFkaz zU9JTdJmGOBVbu?&M0kGc2YBmD=im+-xjaIt|Hn~#)7|kN%V)Sse{|MsMj7!_i8I# zkCyv45i!rS(?~%?Nk$wr+B!g&@yN=?^DeV|5Wr1S>`~%fYLKSlkGHB7$^MC+;m}== zh`&xb$1?AD@1vUfLv~VdrYjxUEIb;>FgyH!6}EJstc!^j|G;C-bSfpHy8#g`vr%D0dBGuE zoEk<>Je)CI&G~l1i9|X!8+>Vd;Vd72MR5NwBT5Fkm>h(e~LV0ediGlgASB?x#+X5~3!9 zvsrbhhgSOHqbzwi&QJtE)FzcMPcwu3Y9XlO9i)Lt=bm%$u7kPTh+bn0{g9C54eFGe3b1UT@QRfKzsF$Jn#jI8(o}G;4 zT_%@x9g}@!JYE4Wd@OxHeEm3bNK|Wr4Yb5@WKiEx`<|N@na^hv4(G|GP=>P6XYQY>dBiPJ6Z*7I7jjU{TZ1SPTt`gsong{YB&oK!uc`$V z3I75G|Eyc9eZSA~PT#OU`CM+o@0(IbZmn{sC8?$)7lXrReWbxVFoxDAfyCdDzrTXJ zBstqRU@@ap&}Z@5nXFA`Ud$ISBmba?(sRkRm$lq4bd;L%NQ z*)?jYr*3zfeAe}tn!4IA>~kqxu`Du;!o$+Bm_Z%?Z@2~aWJCXFSwPSMbfxrmD!(3d zvfjtfajT2*@nf31JKaT+7Wyjojl~O;BaS?K*h_O)d%ivF>#=S$4PD$T&(2SO4ngKe z0@ZzpcbpFi6LGIk+6Ve2Ec_sTQ6|iSiJsQ~a^3~S z3xUd~Id<;&G7V_q(>2il=Ty76rjP6^!^mU5$Il_K+;zm$1h9Hmk*yUr0t()A2yxA zpEc~TV#$!kHyLx;2u{V%jSl7k6dj!Ci5>CTo*0LVrKiaL|>*{ zT!R*8rm=>IRb-EibbY@^UUPIqKVWnTd;q)}V1cNY>&@lpITwhS)sp|pZ;-s^>zL$4 zK!h7)a>EFRV;YDH3QG`cnR;@`lNZk(xumfgKiIHjfMJ2MZd564U)+@v$U3wgH_+gh zH-Et{+hp&q;)5D_AxS&UF_nBpg{|hYov7U+L_4|*32q1VG}u*)WhUXiw?%1(M_eH~ zZscw${AAGBD(_C~ByXks7x=RWl-D#M$-6g+@p~h@6o%P{$h8Wx2x|?C z;=j%Jy~EG)*8X$s+rAkTD1K5M^5@9!sBl>gPasl`Rwl#*0%_w35@56LtS!o7pj-Lq zF3kp)3#-r3+|lP;W;{3( zPxoQ2@j`lOONVV+#?c!sX(U8dF$En!k8GlkPk6w_9lQfAh;^tM=@N8`!EO5Aw!tFg zuK!rRrblp=&U@#s-1q|aT)Vx>>^c6Zi44E|XxazTaws?8s^QRaNkc)qC1aoP64p0& zTBjB{vx>;uS8R3r?G(x^m|f8Kh9$a8TlE^TPzv*GXAp-n8SzA$yQD?9G?04W5P-13 z=B*kj8O-4(q5}vASL=;5l6rSqAGG{qK0c(4&wIMNys@5PFF6-2ON+r(-CzUCZJ zwmwl)31B$l~ z^s4qSx~c6Te|r-yEHg}t1$*YQoz#~Jc6X<(MY{<3?n2%FJw2!_eT|f9np(ZFP+Bdj zoH~uePlYhNR>CNW^1otDc50T#K2lzQYl=>n7_n`raKSE#(DHU}{hbSU*Hty-6YprG zoKtTz5LGgb*DhR-e0{BN?giM6*<11^W5K7|Hdaw6$bHiovK@ypc-x-&IOTfG@8i42 zTTLe!nu6T-qV@|nb}|VJFWFEraLL~h{i}g z&?XKuQjxSk!fw>klMirET}-kaqtTOFBodcZQ1!-v`0hd$Km4aT1cmBnrvz>NyHfZZGMWE zcd2Hu&rM_KC0cf?T^@C_a6WgVwNaKZ0?$yBi|oa&V2FL!NTLEv)U3v*=A^YH+t3TS z=Z}Z0c#v5r)FQGHrzNL0$}wVA5u}HE_JFsy{d9w!u!^y)(0=vYmLr?%DG*FiEBk8d z9GPB?0lTIgLGFoi(vRy}Tl-qxKbU(iu>35H>jD`UQMVkg?G*AFCeWb_zUGEa;QeQF zNgH@A(%=MsTs{Edc>VL5!DNq>rEIYRd%>LAC`W3rdkL ztrR?C&~A=&WvKt5K4xNfqLA#p_ncxMjPm#*n+s=b5S2JQ2_zWwo7PZBHNu=O039Ki+%FD z$PXs=nExTW*>4}YW6e5d*V~7DZjyW^WOyCC1`SKJ*t8Vm3o2SpvTGn#CK4sMBxa8& zjJfmCA(q5A0+W%ZJd)p9YwlH6I3gW~vV&UU00`EF0?~7Eiy;sZ<}VQ-o7-qtS{t$Y z-AOH!!tJp7?LCHZhFHw57J)F0eE1wNL@9}KAe_qV!0P^+b*lvW1_a}W+kC^DDXZ#CY9C)gS~pui%J%6PwB|l;{f(C|>UI%- zQ7sPc(wsBmQ!7ZQO7L~-Gd3!VS1z&!)Z+-+wrVggX%1c}?YxjgIpT)$)t6OAO<|Au z)yEy@0bG;dI(vS}#sJ8ntc&M4W!T}w^?h#jf{pWnm5+_eAK1*r4fb%x&h@$j-vGd> zyItXm%26@T>^AQY`#RI|Lo=@&-FCr@KTJH zVPC+{)5ZBh`9-P;Y!gfQUrZ*=1YUR?r8A@g==wr@9F`P-P??s(q;F_f-n#L1J26Vb zzZ?E*SH{W(F@SR#++0&ZgN@UXZ7hx9HQL$_dvbDS>CyUl(Td!mhdKXzd zY(qROK6yBf`CN;K;iD~7jaTju?XAlVU8`zzwrY-418^G)y~0tCZPNm|n;GawE8nrr z#66X)iR0`QbkO-R`|KuLw+eG6`T8mJ|CwNC2YE&h^J4!8XTU#xTCR2?7$TfN|4van z!~J}0_d7-xU=re&y46c(Wa^lnEw^g!v$qK%iX-`gI1)^0RPWBZR(wbPE|=dgk=%eg z{B4vzH6k)WEmDnQM-`MBaH9%+XOupZcW1w7TM2J z#JXZPuX;A~>Iz~|Tl+9x_Mc~w<9O~y4_YO0%<|!IKhJG?m%?h~Ue*1Lrtunv*iOPn z*Q&0+BV`w3^9^C-bcLc=Uy>nV5lYTSzlUeqP1*Tv&i65@9wyC8^Q|K>Ox@mUKF z$=F>2D85cqA`5g%0%DA78F0_pa&9DbvLct$)sl-!x z!8Pz!-y$N9AVAj+@>xES_z*;1WTpKwvE%k5vYWGb-xtZM7X;Iox80=}+w0QnDe(%>kYa+|p z?%Nmd?oT90+82UI~;hIAE%^h7uAQL7)EepDbLao0!GkUa<{9|;alfh=-u z#}7F5Ab3ZJ-+TfBI`%27=?Lp3nIU_4JAinm$(&l6OX!yAagfmK51nnt!8`|;s{s^J zxt=QFq-cL#(}XFW1WU5hTNhH|OzIiiw#GIt7gbiHBCZe$QoX3JODRMdG^ZArR~vxv zBz(=MaMS7oIX}ul)qU;;rj@%Rn0V=4@J{XuW?Fj`x!-Q}u6Z;+tJ}R5tu{-%B-Ic) z9!~MB32F5rnrGYjc9Hu*_+~8XSDdgSd-4SK5azME!M@MIK258o>Gw!`pinNm1YfKH zWb6q{*lBsfgzw<9Pb3JJwgRI&5ZClZK03rKpIReF{I$qM?(St5I(NN*c5RozU(<=G zRwn&G=(lkm7wCZ1={RqmZsqj|?sYZW@%R|Jjid0!E#Y3|Guc`t zpZWaFobI%`vG2rvpb-ycY}_W|Sv!t792@rf*EZpobkQ)PuKzsglF$AEV>T78Ynd3J zeMxxz5y#vVeU;M3EkAbaCNCU&ifbCx#dURq6HaeH5k_}4x2sV5SpwqstWV=}(GmZA zo!z+xeIW_U&(b0azvgMv3SN!c)hf9?n@(~x&wjxIJkJ#q&&VjE{27x*NJK~T*!h)^ zJI=$@KF2(jS|A{uq(h@NK+uFn7W7QO9iu=o{_^Y=&0R}>HXs$?KNRmsqt!70!lT_> z@e*}GwEah;6{e-Dvy?ZIEr_YK6_LJ(27Q1sZqiQ9x5e>KmqUtxfE;SJ@aak{you27 zgqVO~AQV|ucJuK?c|da?KOspEK!kVlz30(VdcQ~R2b`&CoTW7(qfGV_WUFDE3!IqN zwGphfMudvD$i+!EBiC@NRVHpLjTK_@W`;bYfwDu4cX;Lx^eH%34_(xCmpQCD5{cAii?z z@8Yd9S=7?blX2X}-4Z42!j0KEc-{%NG8#w^G!v|-)~4Md(L2~c>{E*kyPp*6OIv%* zpXqPlg)jhDQ_c=EKu zJ^KdR*#7JISE(kRe4Yr{g?4whCIP(!|7_3xc!Y2SZ%&5K28qtx*v%|>GdChheRhfy z(jZFt^LBs2J|H)`*URrmE5CQ$$-wdw>sm!Mgh00)XNSN(BY~;uF<;yn>vHW8b!8RW zttlJB`r|}9x^QBPBla^35du+U#v5@fv57 zD;x%INB-qDnL3$+lApyOyF$3q5hnIrlx9cJKEpz&-RmPr;kyTzSSBRufB~ibIWBgq zg9mSC?Sd@K#_2p)1G$~2TNOUGo`)kAgGPTKLDm+&%o`%vu)sS!KE|om${bi)Z>4A# zJL(#wTu0jVgHE;HkZQfm>y)HE?NkeHzW`FU!q)fM&Q5}^xU)Lecjq{L&5g+VLU6We zD;qJsqkY*q_C&z0b4k8y*@DuyqC|_fERSxMR^1eJd42>>T80m$F}Wokv1?;BaAn1i zGZGP&Uudh_><;$z7`3LWg{Bt*(8B+0O^H54H7@jYdRQc#cYKkVmT!@+0IF z#7hL~@y}1G5ONt+BUq6N-4yz~UEi!3Z6At7`#zt4VD?sUvQf;3+W6jZhBnT|^um0s zx6%8CRHB7CrrQO`7Qp2)N9p4?O@>9oBgHJgi!Nh!{n(lo`zLa3Qu7=1G>O0uEqdZe zkW({>Iu4yX!r1coNaUfkZ5PSjB3nS(h68UMv9n-|GIp9e_R3r@iQ8v>q0dI01`u%Z zE@3rf(fMs?vfKOi6u=28cgXe#J>kfc`L914rqQh(KcE8bH-!b7N$oW{ae>rG5pN7a zso(|L#7-2~=~2OfWWSoWG)UN(I9Oe{oT0|-+8u33o8dOy>zM5&BD~n0zAZt1BG8G7 z>@u}x`l1sZVe#WTc#fW>B8TQxR!^#MK>R9Qkx<}|Trw_sw*V6SQ?c~ry5bhvwIlB@P7 z0C1-u8Ib1yQDo5|fT>YUv~2}{Y_pP<5Da}Ie}D5O=I6poJ6|#i_4hzz8(B$fonI_uhGFJBVM|6 zW=l!;^N+uRkGZ|XE}LmZB}fF4o-X3sonvkz?iG@R_7U?l41d^AUZCN%A2WMVJ;rsaR}-tj z8PCO5%)chKn~&K(*bLW-VQ$3(*J^#pwXCW^y&lgAWD`{4#0Wq-K+R`JQDdL2X=ueO ze@>mmb=*$%rud3pf)D~T2EFS59j)@fkw2jvkHB$`S9_r6S|-k>7!-TeYu3*bXe_a5 zn6q*Z$>oT8d&9Byi?thcTXqIzHjef{D& z#@Sa}aA=dY5M#Y15BeF7CfU+V0EJ!5;sgMC*E^EYzJ4< zURBm{j(FB!Jl$>oXoAig6G5)m%iEmMg_@QqMU(fPhFm5^RkV$Uown?r^Ek zVoDvlshlIG3Qs6X#!>S#By=6+;;XE2#Q6^7(2sUQg&OcT;}6+_*0Iq26|-pea~!Zs1j zC9K?mmv*}R)Zw;rAO)AECDZ;$do4{01W%x(vj%#zjF zb;CMHAqaDW%|%+D;XCe1vSqs83W0#pKse)b4aT>iaPl%h>7w8;GYocZFCBpa9L*_~ z7j5;~&a9PWwdZOHg+syW2(TJN9knpDWjYeJg6E#pgaUL}!XFCYj!SV}f41OLZQVZm z4P~Hwyi5l7b`vq>kGu|Ya9_spXmBX7xT|)m!*NqPfP5-{NwaBSbiI z6iZ+hg<%x!Myb>DA-f`hCk`cnj_=qn*|VQfSHG%26ZrAz5Mq)iR`5cTvPxfDi7*HR zdz*b5u6S{l`1LVreu5M#FX<9BUO~W%=6jjryxlHfy(1`E^ce;>+Lh>GkElRjfiH7Q z3$N5^x4%6tgZmSsa|e=DTydenadLWt&RL~7ZZoypDH1(!7!Y#IC1d&8w1Qb3hI`)K z0q*nB+sM?(9kHol^rk*!;gY?(-rV9f z?6EhTwvy%jE`)y>mj$TmwE%Otn*o8ZFvO(_WrRVXHLIK%IGb2`Mw@?okzI zT57>ArSvpDjsIM(p2jh9J}C<(T3pfa8gG3&zhzN0Wec)lR4R(TWXQs{q;No*==(ul zXb(FzO1Ch?=gW=rPmqL)?N=RIqr0V52^p(^{B&dI;hFR8$h!d5bOhRmnV_|0>@d1u zHUs=pa?NPDla9{haiAEBDhAe2a*@KE{tL4DS!8MJc%~d-Kf9)ah?b?m13&a&{F=}i zlWY|u!CszPkLNqWN^eN#HmQo>gk)74ks&t4EG1-(R;y{un%b4hwpivY?l( z+%`4ADpJVe!8VgJj6yp%gdsjV`dTreuLt89`+s!3d0>?F)%HI#*(QX939?KA!XzLj zS|vopfM5q)2)G5;09F&+0xk`1#40kN)_~h!wMMNv;1;dbU>BoSJ3+0{s*Se34Qh1~ zxnD`}_Ud%H+P!eb(z-=bRTk3;Kb*5Zwz^#2tT%7z!Ffm=HBD ziq91jI;jT(Qd|Lj(gu+jn??ry`z}JVw_>O_=-o;(f8C%~?rO$?BnRy5*`zIPrmp^P z!b_;dd7Gy+33~Ms;z-dXG(x^CmRUi$J=lvMaqH+JfV3Ro#5Ygn&E%V1vryi-)<+!UYA>CW0$7k`}L$1bw{iLeKt4|!=DH6XE17oUoY7`96*w?3qm`vGe7 z83WVxma}Yu%&yLEX|&bLK&C+Pqx`2*v9qOOK%6}|0WyFbTbgR%`46*6u{e36E_0TI z48!|vrbI2xusg=aQdIS7jGW3!x}g&FH&OYi**;7L`g-mMXr`(R`JCIYCpSS&}NxSv`T>-k-Ee<0ur3E*B z+GeqQwyXK);`doKsudU~X(hxto@yP~!YqgdyY1m5RMb2Ty&TYK?J;DMPwIE|5N*g| zA4&Y{91$F7MwMuQk9`(uqfz+UDS~SG0oR}oUSj!Ceu4nF1l`(E++eS_W2wXKDdkHM zKnsMXrvBOD?6sm|ihx&!Y%yCRd2M7?Ns17~o%zBR@Z#Tu3Oq(hn)GrIf98y`>@=rc z{Qwu!z$2Ye-a`a*9gVLpC zFSR=}1+8UM(fT08owwXRKMAiv#>vWMoe@yMpTl=&u|^LOAiLd$$CYo}-vuKTT2}(p zugLE8+uwiz?{a0!OglUg25gGeqj~!^AR^K#7I7uDe}qk^?0>Wsc=IZ7x9#;a1yG(y zZcg?W;_qeInF-s}YtQs_gzdV9Qj3j4=W@F2o*Mi{0dUe!sO?_9QknyEGDIF+fiP_X z*ApWc6>9!o--Osyy-`Qpzu0Wfn^6d*U7ne`{Nh_v`)zb$riVCPr zA*&(qACjRGD(%L`AY@E)pAxfRZvuhQ6J~q&wNT4u9rf!A)zM{ zHS#?gnf;vhX2773`Rf=9g&ln0=6K%kVjB2u1p=QsnA>cY1wjR z%3H(2j{@lrXkqtJJnYP*i|pUWpYy~3+w$($@j7R6OHiF8w)#6)#XB zLqYhDMxd;XW02B9x}K-2$G5y4>L!s z(SG5KT;!sJbNK>_x>*_^EI!e12^wtPjm}oJ*RrW=$_0cR z($0&xbm~8vghXlFWoREFoR|Uu>FPvA+gn^_@D`t<)(3zfVtB6GvU+Sh<*RE&J4VZV zYMQWt;jFb1kEMfOx}kwBIW2r=4OvTLA|M-I+0vl>m9$`GBORo_=+#nnpkJN?vWgW1 z=0cxx@Ij2JS%BI#$mVk1;TA_DqR6ndk4iWyZ=H0?Jf4+160$UGMIr8847s3Id#?Q| z+mHKgH_4DZ+4R^-KgubD{|m2|cDdV5ySf?L`Cx{1{^ahJp|i*|M(*xcTZvoWiyg6X z-%g0yT|OWa-n>BTGqQ>5TR_W@${4Rp#CN|BS$5a8TWej39Tm5yg0|W-p#V7HW9Z4q z6#Lp%mN)WEKp2T*LBc&1|9Z?f+?zr2!4%|M4t~V$Eha?i8m(831g#_5_g3LO4V2eCeoAMMeSp?I?Wi3@VH&@vH9Y zPVlFEnjzY(K3AcQ_{grd*RWNbp~XRdYnll+52fvRt%AM}AAEET-VArMNRAuT!Plo~yZOj4 z`d@qJk;6UQ9?x4_sVi;)@&VL+ABzXN`G>{0o?He^ILYgp*FOl@4;R`;;W9dr9i))} zME^%iGg(_>`(R!v{(6Kp=Uh=6NC{T6w-Z1}x-JP;9SI4k#_{gGCDJ+NRs78o%3Qe} zT=Ix!3*wV0;&95yiM@z&UJ3iQ78w=FDQ|FBLFfl{Su>^;An(1Nym1Bce4bax<=Zkp z%~i2(KP`3a>fE@kh||y|Wv`7;UJF`JJPo!7(j4HFgiBPmfK z3al-5MK}db8;`I@n}}dO`@XwI;N&3K|*r)S34nCu+AFL#oVj#W~RN6@{?z2(2BVeJ@46?Qd)$ z#f&J64C2o)zm23LV-n8%nwagUi}o2s*C_2uybySpd4f5ifw=l(7l^6ZZUTsikqeO8dN2}u=q`}SLD7nL0WU$Fimz8wi# z% zqIwY*orNH(y$ zB*Oe&D}Mmuiwz4}ZHk0I!!GwxZACp8z$3p_R&=6gqm}+OLoFh2Mm)RHc3K*I;C>v{ z;Wn;Ab=g#xI6L~DW205TEehPV1wIz0I!Jtg=7ys`L1l#t=h8xgHm`a`R*SwogYy?{YqJn1ChW*LaAOG1t-rno%xOgF1|OJVCfcdKJ%K@ zK}2yV8p2hO(%#al!XQ~b$0={MqSC-SkDR~%Kl6?hvUDvvxslKJUbnNTxYSDi`(n$B zdCun~`#i;Avm@x_A^Q~ zo=NrEXcw5Ofaex-|7x|mVm_sD8z*t$l0aS6yf zD)kr?SzRo5Dy36;q@h%Dzr_E{ikCr~@1K#&6O5d_3_1cB5EF-Fs z1N7JP`omE;Sza|c10x&ud&-R#MgQ9*Bwn?V?7|b#eEaf@Ao1*UmeRNbe7^*$NpV`n+@QlJ#}QGj zrNiIWV#O0*=JDJur~S2uO)Hu+36K(NDCz|v^7;kLi-63>mmgHIKRDI7~}i) zC2WTdY|IXiX8`{W?8~W(3-7K6!UAwKry2TiTa7Gi+yGU~oHW7fnie}MYW+<}V=^Yz zOyid|1_Fy(W8sgsWws$R@iTAP0{U=;Adzy~pjy0|YSx>GQ^ySGKG_)zpO*}Ucl@^< zxCCbxCf*cGr_G}tN_|B;ulDSZjs zugfj+(~`o29O*IJvL0BDB67z``49-vk&B4&3HyXqlQFxmLN5DusZM{AKIm?q^@9Yh zT7KnMDf@vd=g%ioN`(+vDWhc=SD{@@_E+J&k(1TI-=s@EiZTAu(vYz#2`NI3SeIP9 zz|m$E*{;BmhJt0O9_NEby0ZQ(QsgZ0`Myho2doh>{c6HyekQn$tZyWF2+SqA<&@!r zM&pWl2^Za+Ej;q1HlBKAj2d8kBMg~8f>b7zGe?Hnj_T2#j8SER8tD&9=R~?GjWiDLvPFH!0^UqzH~Qn()N4tvHe&>LD4Q%`UdW+C zVLwD4VAKV-`{yTkMZAGZcRA9y)7m@u%ZI*}Di!2m5|!cAu$( ztx^1Zv8;Zm5s;A<@Z%%=GPBh#7tk5dNh!Ya5j=1;X7I7{qjC1@)`;uKiV^uEB?L#; zTaol@RtooQQ+Rg+yq>#Ng=4whKxraVOSF+61)BkGg04(+`SjT8P^-P&hBwVZKw4fn z9t}sCmUPS%A={J9-w1}~V#yq-6i55~|De)z&z71gD3jPB9dXM|$T1yqx)y`sjT^MP zaHn#lOt}US(uOiMlArI6{EKX|r%9E=$pt|U`~%FKP0XU)TMPR@=l6PrtbGu$T?c^2 zK44m{a;D3bC^VA(q;i;p6VcYbX8!pwT_<_*WFLQ&{V{DWwU*)p6SP3o)z2opf5ZoT z&uyU@3GwVU)vsA-(eMa`K6vZc2;_S}kX*aD&dOMW6jM>wMp1TDoDY^agozxD%Vra- zmljR6&b@PO8b>EPhmFcKlP)+n6c)0795wn(4dH&F2>&xV>?*ThcEm%dS=&3rnO$iM z!#cL)6=sK5+6EMek82fj+6#!P$93yy%KKit7Zb@xRd9yJ4Io@a1W0NJO7MkhK`+xBX<#fZ+Xh&?o9|H?3q*wD@U z`Z@b&E8(y4^B`dU8!rJtdO@}~xWuYvF&g=>)o02QAt7!9G=6Z4Y|N3Z)Df61BkMvK z@UFVB2!@eDHnQB_cd0i)jpzXn&BoL#_jdc~L)8uF(YO|SxQRp?_^QqBo`t#PQH$&j zXk$Q(_N@Vr8fVpRYvB=8RJb398ErJsoG1nccb}!~cy)>?8E@@v zD6q&lN0H@gqewj&lI-dAmQ{-)5!uET8m*#0{}3FK(H=@Suc-gP&biVCmr(-b&-9_h zS^>RG%A=zGGAl~rL*6u4?)Df65-&jo*MKIJbPHf~BOzggJ>1vEjsnLg9=Fv>31n6B zNXvNhmwcME3ejM2O|>%mI<8WwBfPED=J56W+(Q&NeE94z$UQy@7JjD0$6qr*U=2Yn zdcQoC#3wzB3B*)f48gM-`L`pK3dAd{3SF|C2A};5;{%ap29<1SCqFn9eio|=+{A-& z>jQ@_Ioi^bWOO1r;*m#>yrkBi-@r$yE}_X zg=11I^Yu5v&`^$P(UXR$PCu^SZ)$I zu%1m>l*j?Ts9lz@<3kQU7!O#2n*E-){0Ylerurg?>}QDVU7qJD8r~@v{eBJxnDh)2 z^&&6eOkM`fWxr>l*=%gGvjoZikgqZuZa@V>TZM6AUf~kzUP_hZwgn$+n)rOCiBIxb z7C=Err;j@2v9QZ!sNI)?1NNzQK@rgNu}n9a{)%0eZ#OOhrpYa%$#;WW*yE~R1eHY{ zJSoXTFGKMTC#4{nIR=mV=cYdV`-!f3t8uOIq6LJxctA##v{U-+)Giyh$qHsMKg+*v z^Y%p#v%FT`07`4q4$DVUO?s8luw~X(SxFnTxLj5o5Ef@(A4O!eYTzEM2CfCkOvssk z2=yolV+e-gZJ4W2gRjyp&B*jLltQS1q&FMGu19)P zLgA|Lw#-sVw+3Rl7Sv^pb5?qojp)$Q=vRE~FI~e1GP|b7zUjv7nM>k9z2G>{u3b(J zL2x`>Iq4(Vuh(tjBh$MbV6$RjvWG0l!+XC&U4-{;Yibarlg!kB#DfOQqIDas@mNip zf@K&b6rPL8ZaC`WW6Vq4gXO%Sgm=DHZ7H9)3&VeqzqJfg$BYtQXgph>K^M5xSAd`2 z+GWDUgM_>Y{~}3Z=3w!=rN`&S?Iw~5{wd{=Yf^537GFj$uDu3P@f|!4il3cJ6=vhQ^u-_bn({HV2-g}Rk@!N%3n#5pPUX7^iUh#Vkd@=sl$ z%=IO7Oey>06+Gak*J&G!;Vn<*V~$SM!6B0&Hg%}^6c3_LF&HvmHgQ+ve^OSe9_3$& ze0N2Oeoa$o1Ru9=v{mx?KQPzt(J4(W{mt_KqPQYt$wg~$L-2=kHdq}S3uK0|yP zwFkK0D>DZr2SUCm-PDK~CIwHixq9KM5oXXMn7e54~B^ zI2H+uSK_V39*3`dz`kY9IR#xCfn<50Wv0N>z@LVrn8P7SitpE6qiud2X~AKC;_C=p z3QJqC2{#&Yk8jlsvvbw8&pNMwb4qzC>Lo8LL@B#8` zyMfqTOMfz=p*^dE*VH6vdmcpz^{ulLfFnnAV}Y?dxhCb@%+O=ca#TQxw>M>d7XPf0 z=O5thvq2jv*7&RkAOhAD;m&c&b3!6Ok3316We((F67nrBj#=dhaYgwDRkgShUB9&S zRGX+n9Mu-p-fozpj6Hf6*BFesha#F{g?no&N#LL`FSH=;xRBirBJdw(S=?LmMq*wT zcJwXo_dZ_w1R(wZ{CW89a{%eNnRssFoj|kl@Xi* zcAJatf*fCCLgcETy_=$wk49)NHCDGnBB3)oD{Q%n>sj>;B-DSi0j_pnR2(z$_(kHf zNAc9kO*DDl@S-){S8YpRInY8otWsB0O0`!0k8-S!Qyc%j#cp+T=LN3M_@-@a#3A|T z;Kq(hSsL+1L|{=D>g==kwxA*gI>lPtz@f( zy|q>+FcBmg7TyhY$>F30j47NdVyy^PE1V?Im}X=X4GrKlAIcOQBt2cY__PL3Ur*`A zSUxz&0B?|$IWZ=WN-k3}(1O3>!Wcywt_7f{3V`uTR0UW%!@-`c^b*Gr+F^C?hMv3U zmBXzecb=+Mf&4XuEx9P^Z7KG(5>xiL^}4hT6N)I>z=;T*B?28p#-zU%G0Qa5k*fsE@ad6>BY$PT~H;Ig0!F2Jl&^eM16 z+A*7Ck4rvX(Hw%8MUC&R#g15{ zxYizOwVzkml}!mG@knjy?gO%9^k3OGi?Q}~3dc3H&v}>K(O6X|Olk$>W$W??UpiJwRuN7TRAurD^8Nj#N!QkL%3c`a{^Q4bS%| z`=f1RV2Pz>K_2?pT;btq%$bNoXF;f9SPY;x<3BADLs-WpV#tI$*=~>ueJrcOo%&NE z>=mNvM=mvo6p zi^BYn#)tXk9Ez%))=R0c^=P&D<1 zso#PV;wuC-f*!^x>$X~E46o7_dzA$t`XJ|yU|%KqcN$m}l_*1(iCdH3o(ZT`3zLMX zxDW$dDsd5}ME3n5COt}Y&Mh?Th2^pbu)bn9np(GzyC8VjU#@LSWI!k7m|A@Q|e3?i}%m zJvVn*F`Fe84H5j$1F6j|ykaquf3sECg-*vXNT)TXw|fG^dcC@$*VbKWE0*!>Flnv; z2R(`E_IRW=z-XWcg`6GrCW{~~qBN+|EU6Ml`=m-#4>p503#fg+((Q0MhjRhsH&n1= z2x4LRpVhBMXl9td$!>t*&~5wIckmLANtxb_+aH@;?SL+w$Y*8yrk$0tTLoSpMJP+E zf6u2`kF<3Cr-u%HOH7MFJ|nF;gip=2aT@sb2x+*BWuapK`_D1`L2_rK2nm6mRb-j{k`q0}#QrqerfXiaAmCB)NZm)Jcn**^%U zl6W+xjk#kj*8yXyz(cqB>M3N480s5t?~*yS+2eZyg{?J=jvmOkVz_<pGk%43 zVORw`3%*efw&$T76i6TGFxp-$ykFQkehOz~!=J9C7M|@;v3gX*JDv*718|{DUbs-( z2&RTSuL6~-j&40M(F1&DrFw0Q<`eTk#2h`SnvedJ+bm2+r)l%Lrp^x62|I=6C%rH= zn~Jy}Nb0TgaS{6k+3>rJm-7qW^{>Z?mCuIkrIdXbXsp0pB(b*Lo|orQH;N!d#frjM zO?ogNt@@Te)6pb_5^|0$z0y8e##;@W2^D7_I|g5JraW*ircw&WO2@s&*?H}l3RB~)SZ_PN z*X@yRU{pwan3?@Hqs#f1!{NiotMu@`gE}b0FM<$m?rr9yYQ>ijouOV2n2y}b%L#I0 z&eIKAc0Kth{^glC=Hac-gNcQSZNSN0o3i`mUkV8m)DKB-q4gwOf0F0xaJ0@Gf|ai| zRt&zlg>>#H{+QS2Sy7x%*O^vEm^yOvpV)WDq7LInv9x|a)P6AeS3IQJY`{0 zv;}xmm7ykO$Em26jU0<%F%rJnw}Sy*;y5AdbcnAc$}9#&UKgGD8wRkYJQ;G?EG#T(YiP*3vncn<_p+7}l6QayEO$Jr zMQE&?u2Q05q+d3xJ<&|;BD)!B4|SzLC$gjVkFroaAKF4W8FNw1i|`V%sx%qomQkAj zB{He}#r(>*RWyCf_8AFMtu`r)qi zR1l5_{M!l(T+2Ga17~uc82k_8no?;eJLCHBYMss`(^PvfN9W)j$ow4zaGRS1YD7BT zlnXhjDuo|g0VR_CE!BpLO*T2KYOy=tT<3$1sAPwg9=KJt(tr zzwU@db3OT(&rQ%DBbD(XuN&G>yd1kU7U9{Sk~OJWb}*8`1Axse0U7=b(X2={#92K= zw(>+XX<~+1@0c!=K@N@ou_|7}Z{VnBs1NobK{Q`CJ-wdJ;R@SLVT<%xW?fSTRbFg! zu&cBA6C{6!ICi2x-j5iXmTiUU1l4$+(!*@@hVjgw*saAF-YUXyMstjP z%33uf<)H~*a@+1SXh{U1T6cvVmFxf~rJ&|CvekumVQZ##DQBr>uxI*_MI-11COiY@ zL56s!c;r7K`B9G`)2B*+u{ z1U3CJMpx5tCZ>=QPvxQHgJur%ZIc!~yLr6^%bVc2tbtPlB;ax%qAWiW=%qj@LW#t7 zam#T(l@7Hy4|G&NJ(x!v0=8PxiKy522FjqD)OP@EaN!FXOj5{yu8Ef!?`w7&t5D$@ z1+@k=Y!N|?!K4Ln$FXM;j{uhZB+$QrccJOoX!r=5 zmm-3N?6h|N?70%baGKVUh86&xpD=T=!`HZotY>=63YGQbOfRt9r_9ea2|{y&Y$xq= zTN#v59p7TlHrXfLAu@z#)D_-H`O;}m1XcG;A=fL$VxlRl9+RTOxws$Y82ubs00LQe z%`tbLKK5UE2LQI<&x`m#eA3r?c*>AH+o|?=o^2Z(D%{KP;1^*T(^6n&V!h79^`*$H zqiW07eN;h~$YzNKF6zZ-SH;8*OGBzT2j9P+_?(~fH%0Cc)EX`BT-jAO1e(>c!yDEW zpxLkqb~71df5NHJ{zTTlA+U?>?>=jOs(AY=>mUPApR-DXD*^q~@^^tmOS;rp81SQG>R(Tk8gJ8(m)fI~9WZU7dM3}A6k-eL_E&yv zOMN!%5X7nJ)-a1CEc+^Kw+LN3vsH!LH9(2KrnikFIfcqKKXd)7K~#MT-MOR;S!H~X zVn_NsswX~>YIdBMPL_NLDl4U1tb@Z-u)w74&ty4`3?XJD1h5#6>}DTGc#D!G|JtCF z4Ry#>$VMHmRs5$5Yw(S^vcKQfmDm%>iru1_jZ#+e+{d{ITAX!czl zdWbc}#KJrfRmxSaxFDq;Bc6ni=a9XC5mELIQs4X9d_8W+z6O_+K$6t}FjQldlJ5SEwIEubt5*V!qup4tukcwHmjrhl)|)rjR%Aqg~Oa`jDD zwca~XL79X|Q_jb$C0sAXxlXn+n~$xg@Cd$*K%p>F8YLvb+H0d;I=wn-2~T3^}`837GE4?}hMByaqZ0uauq-f=_qggLduhlF2 z*4XPY=Xfc7W{NzAfF&D-HR?@@=6kq*8r1 z4X#Q)@?cA|Y79RDxyQrHf@#)TkS1baXi0O^4o@a4ZN-vVC5~qI8#x<)lA13UiTq1B z;>a~e5a=8H_KyJd4H@G7NMk<4F+O>u9^Y`2O{yU}bwr3t1H`ZHeAKq41$t>tJW!fscirtUIIN)O$5>hD-zv`AWLhlZu+~+=S_O~&4wL$8i=EozRA;NhqY+;h3E?h2(P#FyGpM`l zg?fT94%?6JTdo>``zGz>pk0bB2~N0IP2`EVNA#)Ms-ms&&Y6|{1iKg3HV~6;ecW=E zk!|l1qiPyP6KRc&ed*4#N+H`3ji7o`qMs80syuklmhxek|32i!h+-7sx0nF+Z|z(f zZErUBn2uEzZ~)mTuC=U12CC7UZ16$94e%2)kilaJTF}Ld z$`$oGPuo<17vVTq>VKLX(#&57V}B`PQ_Sg!7n}rMqD?nEmMYI0OyilD2ugN1nr2|vL4tS+5SeG z0;iXSt+kYlrhfO@#9{Dh+7V7qr$rL{EP8MOGq9R4#|DcPfn=!&L<7%7MMQ*LpVT zq%)knW)yw`@P!N1G>=EA<|)m5;>vxl#OH#wX4$(?T_f;$!?6YWC3Up%&L&#S&JR#_id#ic>dGV z>@*)jCoTib`*gaF-h?t^;i|RkF>lJMCQ6WXEE5>#mIu|Stm;^3?cs9Fqh8xNf6&9j zu~JF9R#;`yZ7=F5QlW;PW9V{;JmEf+Hsn9Qp@$KKh`>({kMJcIq`<7bMV%8iFRbQo zaq>Vld!T0!XlI4LMtzGzNp|XrwW|}}xiz%vtfZ=`S4adqc>eDkC5(@CEb-}K?zyJy zIfZm9s3Ce$O_i!*u!@NYYAnw~0Au5ZzEG^zzT(Xal5Qyf=xwCtx0Ac$^)XDo^s zp-*FfX(tJDsOoj@##o&yOlm00qAQQ#RoVUy#gP7!SkuSgZkZ@H^L(4)I(%ql&B%_f zLnsPr$b02lYm1%YvzJ>4ERfFNgq^`ZxziQo7f?-bwa4zI!bw43u3sJ@Xl!v)1yRH@ zawA)t=`Y4D9z(u`*c&Bj3HiuN6kqd{>tylfvxUmzl|YOg-mF7NZ0QnpS?!sTgErg^ zT#T#CYz??`Viv!U^wxB}V>hrB2Qw?OE?owG+fKRL2qcrJLZG4YEr~$(ib8xLSP*`@ zxOI>pE}>C%M1!rP!Q)F(%agUtw&Rue*l~UK{Y`BNTeL}N7<5X|!wOwuYfElk4;l}; zNS1uLfK_CXXPpUfk9>P}&~kh2)y7b=6)0Ex3qeeAOpjwD7qTNbl_2lgj)eY)0wHa~ zH;`K7icb(v2`f5}{0NxmX1v(GIv=5K#0V>>E`0~={d|f6{|tBtr@$shP6I zzH-BSc!!`p+Yv&(6$kiCYxacnd|nBFqFjjbJ?&VB(~sw)_BxOSS$7}iRMbspE!FEH z73{O^U6%W3DEJa0%XTPob$4kKzw#wkFu#?Ytf+}k^%@9i9nbgypO??qoZ!LtuMs;o^Iw-XE!5in|lS;uX#zw6p(-8Hj2U)D$NcF~?GpVwZ`)pDb21^8Ji)yXj zjXwT4!E^Iko;5$>`k|+FMOwtyxfShufma=^SQ@cE07QJwAG)Mdg|*7@+c5({5f2KA zATj;`siiPMrax7SqXIUzfgftdO@l>X>JO#uWCg7!c*E+UieW0@0vn2WA?t|H-StED z(3?pXja9DsZ!J4{FQJ$^hv*_X~sQgD8V1$ni#GHdlAkhtO`) zr3~LVK1OCQQfA8}Q7OEY4U=x{O$bDdvfxCUcKMH3nZeodv`12Mm-GL<(55wqZy_jT z_PT;NIr!;%Lnn|J)yj)O>q}WLL)(ye`5;NyMMI8uKGM>DNO?0CsVq` zB18KYh%Lk4aih2Bb%<~cpD;!((mo zfIyvXt+RYYQ;V%Sc>O^EH@)LT!JUYY5@wURQEO`x?cU5GZ`W*FVkYW?2rvBV}QwVa<^zT zUBai;=2;?der+GIrWuYR&M`&_rjuE}wRodlzYuX{m7%C_x)%Fs(j~x&0kZo@lKAm2 znkt@mp6U#(&PTG!Z7AOLP#P?#(hL}2o05rOLLUhX@I!Z&Wu8uiG9y_?;qxw0M;)C} zpS}QJxxN(CZna=8KaU%miLl&os z+tOmW4@d!n6%nC@9`y&NLW4l8cSFEJ18C4&(!C=qteMwmfm#kZ#31hf)RZ0IIurNt zx1$*XM`%#4d=%e<^9UrAabz=`*ZYR5^}-U2>je-8N>?u-f+!v03Q)K)vS6kw(5k`K zDLK3;q<5stfrz~|5l<2U4_@o=*T3iwLxlgM=O~% z&S1M11pU^5s4hjU;d?4Yq$}i7M4dojTr@GvR1G2@3p@7M2L5CT?$hE?d2-8Yz^<>i z^~E^+r|4bH7;@&9?_ITKNV^{JlW%9^%UyQJ0RVjKxFpiiEzz6yxboBNGQa&H0OUyV zdJsk^BGhVGUp614hya6l=#2M>uZxgW(a#3%81J*+WG+85Y7;@ZM%pZ&62vK>J_+D> z(2g93Gvf{HW{3TFCG3c1JD9-dLwTsgJmBZ{T3b~^sZZh^vPFMFP`y}v$B>jh^s3j- zQnu0UDmlVli-vX#RjwP+k8%9NI9AoGkoO!OeF6XE44ne#Q{igiGw@d_3+8jDZPCXl z&i&JDDM=nZ8l8^{lMD}9ju4Nhu#oxQg!gisQx8w|XI~0^99FRXl`^VB_D}!D{B!wQ zxcM%ilGD9?k{tu!c(mN%m=EC8sUuWx9f26(p*#E3!RAa5T<#sJP+}f!BWG*(17utzg>*C1S zC{?%8%X;3jp@s5&7>*m46hpJ_Zh{|xPQ3}_*5zgjj= zQcW?+sEJRsshsw1!l6JdN_*G-TR@K)JUGz{P z>07>dI~|N)f-o+yrPJ_x0k*TEUqU!W&<$*{*)dH<`eSBO1V9lAljxSeXOz&+qg@Hrpruz#?GGG4!YaSgsog+3`~$boJ9sz!)csnE|=@~~MrY$RQWXct3I zLg`2zLQY=AeXqW~-CK&!ZHYq|b<)0RW+XY580hB}lL7GzPl3YlV+3m9p&#EV%$Su}hX-7F+01XO>(nNvJh6 zCq{DGZ~J;9l4PJ!lG;=4pe;Q=vFv6mYK*E}`F9n~!x}_$O)K7-GrsM0ZT1&;kx+?^ z5sX!U0TMWDDIx8o<=_M%T;hwh|j%K`W`B$MjIiwE30RAi5UDXNQs;Aa@sRp|hLZ@u- zynZ@~=ewlJxpn%7e6C+37Ev8OX-{~mz?`T(R|XilZV?YSi%<;&39&Vgu6&=Df_~zt ziU<41nrRmfTWdM$tY(H(_^i2hN1RT!76nUldZjrtx^Xpm%A0~H@@SOj*c#g})uFYV zkJ4R?46Wqaz`<=EsmirgL5FDkTxT1K`S$+?8$CkP@2Xtrc16L)c+NWh1RX=}wGr$n zeHW3yj%H~#+Hi;lxl6GspWT`OUF)%38`pVl!+dY>z1yy6v|EfUJ4a7_ zBJ67rV=DZB^ z_h8{7Y2`)SZT=SyUH4dPU0$Sdi&C4E#P`j1Qx`YFg1${3aaI*d{Qos}5l*C9=9TbM zul?BqYt6rc-}>|%W$iixwkp;}nTf8xt85x4PGaE*tQubW4PSRehZYP>kH?lTwm(Pf zbb($0YyuTY3H4glj6niljjbYB^T?uneoAGAL;B zeBtE@9(tsG6C-SnO4}<@d)_&d(ek#*IP=p?+cw*xWSE=r+F)7K`Pn< zY-@!Bj>sRpKsBKPHPNv{?1%5i5<>@tyohFKRpKn0p26>5bFPKLwifiBqS`wUnIR!o zl8=#@xQ%u>E@r)<=c9w#f=#G{dLjNBzoC}l6>Lf30i`^`@1GzD9gXOkocd_rT2nX9 z)FC53%D5H~`)EWq!&e(>pk`9UZxO@CuE1sGNQG96BO7|CJp`S#D~l7!P9;K!0JID3 zdB2AiSJm;>#?mcco8>@BuyBpK?FWU$n{OrD;2~ml!G=&>Q*VXs|4~Gq1<4dOLw5R4 zS|iH80JUB~fMA?jMZbl|lOpzof;g6K)Ul*M-U+%&TS?js`dl-?HoF!Oq&l9iH2Y$HU{rg|bG@IzVa)() zEMkv3>pGm`Dg`d$(KN^KrHSlDu2|wWlVJdCCb)~{m#B5yfTXMJ&gxJTz5O7jn?ooh zVI&XuYh9VG?68Z~Sd9B)s0c*Xke1k9syV?PJV}FZ5KAkG;4SC?9STbA3wcGD+XylC zA++cZ_FAXdb%V;K`S($N-og>=*^eS6>k$|2=J0FE7+FFRlBe)04{}CsLW0KriB~_! zejBK_9;g#_ZqpqOFdK_=wDA=Yc2SgtNvD~C>%$H-1DBa^54KxD0}_8;>Ekc}OKs<* zEVawoESM5z^MD`}H}jA9s6$9YAmWOu@E$biW*f z+0Bb#u~wz`HPEeQUXcU z0lTOfbcgf0#a*8#31G6j5v6=!Q}{q zJw~d<9!@#FT{dw)<;;>^X0FuqXyO*Gbva>jOY9Ts?~xN5Y{;RPb>BdXi2oskj-}Aaslez zeauBgoSWk4KrNqfOEOD7+mUaR?gbb(- z?j~mYG{;-qY-8d{X$rxpp0;enMq!3_asvK%$Yt``DZGJ-5T0PR1yU}RTmbgQ?eSI3c*bh%78abihfm^I*t}%K&Z> zzMWTs?>biTuM^|R2Ig(C&jyf{TRgR7%@G9p4UCydmxlGDPLH|rmJ8AeI1h!kWiW|e zU)fId6UMg9TOJTmzZyPX0|59Gyc1zi+ord!y%MNWo35BnIMbO~?glGZ-Yu_AS#}7_ zm{Kfo13$cNkkWaC`T|r(-hn$!A;x?n;7=w5?&P7Tr?5S1*7E5U(2X1F2J0X+xHN&w zRs0&4?l83gQlUa2m%2s}^0#=N8ghgxn$!Bu`b1b+PbK!8Z< zAN!Iw9rcXBkgo#ZjON!2*Bg7+8T>=uayf>D{~MX)Pv6=~$OH4fDQZu6S+vKKAtCES z2UzNsRK;;*U&3a0QBneY5Bi8l5)L_Rdhg-bSBO`G+g5D7}d1+rCX3reS)_ zMNym46a-UA0>%G4Gu2Dsu)GTG_=7kzu44i_WTH(_JKzwdPC@E>xME_nj>7RS7c(Sj z{<_Q_0SM8J+_S3`Ym%i$>Nc`LfSr<>hWa0iHX_mva*sHUtHReoszNE|2LSp>BXuxd z`WpVTBsnHNdbO;on6x2CAc+W<>r^G?gW*bW_#MHX2wA4YvVm5~0^X0-9M+T~wd{=b zB|#sfC{3OWiD}XF1}ko|lEvXD;J~kkz{f3Q8I2I_yrk)GfJYM$$i>L!fHerGhkS03 zv^QW^r`YC#b6(+SXG2qU>+AS{tZ)lWB^?O2YuxY-7tgxMDvzZbi8i|JzY&YR@M8uL zmS^@$(0!aVmQ^nb`;6@51rp^-8Lzb4`(-pomg9CdIhwEL44rSe4JA1fflO*gqn+KX zAMz+O&{$9Dn8j9nU%p!^N}8%Ui}Uy6wK=*=r=JnZ36<70kV4LD@@Ty4mK*OJ zu`HZEzQ}uF3&c`reQtMhfDb!5!6%yAif5Ex_-)iaaXnOMPkcTd4CXZz;3w>yac;zizzpft$dy`*NLvWC7euXj9|$G8p!_Nq9#{c9R;ksvJxU#SX9 ztC)w+9BbK&q}=>WjFEop;{`V*r-pF^6JwoORH|IW!AX2XM_e|dhO1T%U2ES8mYfI{cr2 zAoAI#5~?8E_f|oOx^ppGC#vPWq2eldPEoQCV%CX3G%e~DLd+J1cYA=;$X|w)EOoK< zcml@&isNks`IjJHZQz+fm?=_ieK`7&Qk70Z@3{U9%n368i_i9B72g)UD;MAW&E28; z9in*cS7kq~j`Q9sYTvA(sZ|KvX&)y!#;qj){pglld(cXXSa0Pa5>4<6oSi@G0LOhNp_-ECnVUqs;wn zx7P|+Qll=hTZ8sr8$wW{La#-fg(S+AUK}LTNm$?k%UxSnAK4oXXCgn2iWk{+-IB>C zzz)CQ4+{)$P|}(M%)8TW>#)aD_DI|{5#GlqXshQ;NH0N=aNobRVXFf#aKb;t*3o+kAhWoX~m3xqA zAJ0Z7^{vLj$s4YU`e+5+(f!GWgu1~C`W%`202F=#gG*{6L_8tn1)7$w!{JdO2WsTHSo12bRB2P8Lx&m`o*9$H0>1w}+5dbDRq{ zX^x%eqp2UD-L+9$$4htw=DC7f@~sK}@^U;&7HKGtxbsTeF;j)5`5DoS;`$VWJkH5{FKXL`D(pp91|5@+@%YNwiO?Uk z4DA>M%C+S*&gq(S%!)_aNl~)SkRODy=;~9RUUk?%^Ct0N{AV8{lTTDfbR(1TB!eVO zS<<7fCi}LQ`5s&i+ld19M*V=L5c0^ukiHk*{Z#znSo>XzJr~CxG=$VwIXF$fmQA!a z6AM$cs)(TwfG_D#6emn-g*-FtTnEf7SzHtB4|5N`P#u14>%4!c3M4WpM?2IG^V^RD zi>9d^E2By1dVLH4q&8WBD&*{t z@-!{q(Ye@-YD<+gF{8eg9x&O8+xJ~vYx!U=T5@>@8X|@HOf}A9$l}t&F}Fro1vx+| zJChyKs8)B$vzJie{IO2O=2`JZ@>{W9+pDal*0K^9+Y@Hf((1JJx!HmREIYszdDd1% z1nJwx1txERc99*3nV>{!Lsf_E871~t3WcplV}t5zO#8^95zAlZPV4?mFyF2v_VFw} z^!^Uy6VU=86%62J@JhqU_a-G^<+h?`vacsWLcP>}v>g$3;XI;n9`&j0(LOLPgHaD& z616f{^w4U#t>O}&ng=>oRpl$Msj@X1xgTb;#fKkngObymJRhv5gy)p*LU<1nTAt+o zBnm}!d@Fu5=`uSOle=P2Sl^L0(oM2yuXP~SOhi_d4Bwk3>|9hTj^FvSLyT*q1Q8e4 zEkd&5Aump)&Odi3s^?g3FB$Lq|BLDUM;$!*X8_NVSBaob*qi1J6a&ixN#&zdg$bl~ zL91R0|D7HpV373UYiC+GTA{cm8m3->X})jxPlKJhhdUdA2laha}a_7rIq`soBLg>X6UHJhCk*u31wG03$r=iHbClt6q6(KlH?@1>AaJ zb{PB-`IM(4DC=L`*@39sQL(R~{$1|BZ`RV+)5R0RZl=(r5Kk zXb@{f^yNo8`nz891qm8$cgFKWY9mwvOcgX%|5bS)FyUJBZO(I zDG@%PWEs~DfglZpz=Yaxdm92l3y+dBsySPtieLF#O zqtKQ&*#}ilJ-%oR^@fSjLz=Ob4|OA?os=a+Y5zWWua77d7BVV`sRCsiE4a5ReitwD z0>l6@z7HkiS!#z-9^+{0rZIFBW?R$UKCewlkvs*+DZQ}Qm5Fg2@NncY(Jca7Yr|A2 zJ~6c9G+!H5o`(~+c#jiaK1gm=tf2ftMi{nhcQ(w)KxKj445VzLEvcQi*a~@0g6#)g zr~+bOqq(A$wwkuue|X;rAHQ$V$zZ2U1YS!Osznm)qjmhXeHw($yts{~_6^)6c*die zPO7j8+(xjfT13!Zp?1}igy|RUZxuGR)(b}`lhf1_jn-Ca5?{dx$5HNRCDUw4*hWIz za#Yg;bu|n_$x7OvC+hG7hVHHX4QY0qf(94Qm110EWp%u%CdtFLUIHnx zb4g3FjH{Ybof!2P6;Cy;OmG7>Nw%V-dTDGoxOP9Jkw`dXM+Jqu9ji)#981`3TNA$q zbZa)3HeJLu2JHSiK&3)kS<`_h`4Ta0GRj6dk+{9uMjQ28+eXm&j?Tc_B#0RXj%FWn zs7v=1#*{M%k1LnjY0esIrxO4$CuncV=g4}Z5sXl;P?)cQIkH(fZ;_SR+_sVyE_80jU~kN~PnM94WR+p?U)rhkRGe8w zQZ}Yn&CRgA({6J@LMlIra^j2)<;}nxZYtt%w5ZBv!K>^N<1N#xQwBWAaRIW^K@Pq& zTh#>;*6Ov@GK{BqqG`agRuth~{+)uO87AFy1ZGv5R}iuGC0eCevOrnBcK0GDf2b}* zzZZ{Kn3P#H$J+sb(W@)$r^VegQRa7qGQvWf(OMz`sI5fB17*(*4Rr%nn$|GR3`bZo z;!bpyQYVbvy3)Hn$*~0_OQ3fG%Ck9Fsy(ro2WL$6azmxGd7RXj5s8IJb$|w;I9+y8 zgWXr=lxbh30{Uii!SQW^39HJeud4uNJWNl_A0V##KgI0?y z?m$R?K^c0`Umcdj>f*e`64m2j%L!tai$hkHQgcNu-v)wGtd91iL$?*XPr&z}UGW^` z)KY^|UGg5WdmV~+xF-7tl@1<^n5ZY#M~K{w!O-0545RA@1atBn_HE;YST+rtWCRIn zOPr@V$kxE#I*~N>540h+Q!>Wl-tzVcL3qP*0HXy~e*pRDra?^cSWIyMP|Pbw&tNn_ zDYK)%^LWL5y+~oye=YLdjOeDTc2G-6#lu?uDl&3&0rgej6-{8MMfM&`2fC#~X)1@~ zfuRyw?|Cdh3k&GuOnGUHY&TaU?M>a*@=LjK|d#< zI5ch$(6!<2W*!iPq|d z60{_5CbjcPWIJ@lI`zhzs^FuZ7frd`gb5 zBF17|NN0EnIiIZSpl#@l#zhMoK+C>L+i_{+^8xwK9Jt%EEh0zM*Qa|9b=zLu&My5Y zFSIh4G5vKYW})_V-<>3q3q|@dy0Sm5zZ)QAwX1n>PLMM=%=Bp#Kb}8xF6Al6;6&?n zk~$Y)Q2p&9K2Jd(pW$+hAVfc+7%#hzl@p!D`{2Lo^lghu^!;7Pm_n5hjkt+{k*Xso zyYkBUgsjY`hNV*P-YkS%4n!1F9QML0CTz)rxNc+rjw3Q~msjvd2-R?|c+Rgg57j)b!>Z!o^`+ zQIb>uL-R<=m9~oBEx!7gN)pIZAa5t3Igi4NzQGj%KIZ4@nu#282AV`OH*5PV>Jnd1 z^Gy_s83(}Pc*{=q^F|x_c=Rh~w}7S>Gzh~;H6TQh`KO|+KeAOl%A1jN#Jb8ty-s)x z-XhsaDTKhWfFwxQ>hzB74(2!yi5%xPWN7s#xxt90ZXRv8kD>KS5toCk?=Gk<@3{z=oZIz;2JAy6g{9}=NQEO_=XN}Dn`ot#jD2Ytb8j~) zkGxcM#sW5%p?Y2#=^Ea}y;iP_`f(?leE`;0b@FOI?jU!CwrBgZUDjLe-N_sJz0qVh z0%y5Z%-y-Zi*E~%9vJ}lOZZTQb-o2mIW^QG-y*xJ#xAZ;Ae8SA$`*FS*5jDk>`b~g zUs4V8oI;vK)_Dm9!}h#xH$6%|ksB1P!~7_j@JG)x%zGuc*-=(o6GXlfYh`@qHVnVy z=w4?dT`hW|#;6`{-O45XNqYdl8Q~}R&dyy#3q{~QO85`dg1Odp05(aa9m=jzf)HNw zKyt@@=qaibGuAF|C4ZwLeI`Q%Xyy4Rttd!QnUt0EMKX&qhI3sbU=zE{k4*A*kd$!- zSGzAql`L;Sjf-q&D{(8g9qrrYmW4o&@3Q_@DbQz@$2cz=@~7E@_1%_i=Sj%i1+Pwk z#;6$aa=rbv#saORg5QAiGdzp7>_5O+_ZlRA3w1iXsY!`CX;mb9Bei>g9~SVW2WO&H zvkP?-=-G&%;D18bAPY#^u3lo|cbb&mDGRF#1$38tKRfeE``0o{=q~pOn6mD2ySOIU z6$Z3}ur&BK$kJ01qY7Ugj$K^$32IUlaZx%1mBc1)4yup)G+*a6pWq*?1_5QQ#fy81 z(SOCYZwBq28oME+#3-h)mX0?E?P_I3c*`$|9^d&=cBdFPo3MNMwRPb>HFWUWQG^zT zB$1+uBjoEy)i=dBv%4tXsv_|ARy8Bp#8)Ll)E3Y86>Xl!fWiXtw466z#_igXKfw7y-lsn{CbK}@JF@d@;U}t zv{yUVM(nWGFu4E7bS~)z=L_ti279WGT(gMZD5H@n$3 zMIc@HY<07dqTC}_op0B%PdrYy#=b~OjZD%_ z(l2d3(0amg{Gwc+x9lqeo?d@Th5;HBV1X^CW26OXOvml`n=nki=%8&y@L*h9tR$JG zmQH_ailqLs{%gTvEVB}wx*rqfI~khR4(LLZWK=T$vbS3C(rKDw*Mo0<6IIi?l?5Eh(Z;uASq`ln z&JBa-E=Mk#05z*^DI|vvxrF9czZrV+`XyQkGzP?h3?`9R?9i8A3-HM+%+|oCYQ_2M zj_28$gOvW^$gc~8mO1`3Vy((Zi)jHYHTUm4(785)_}!lb<90PaQ23suSq zwBsiJV~e}(_Oz{XYjjH?pA$|N4i)aexoIMc?xhhj3M-1CMwU6U65gtoaIz9y7?mut zp=oe{GcK0n-Ekpa6f+~aQVm$-q<3WF)A%?^`M;c(d6u|yu01gfoMcE^;IIvg+p*q8 z=uH+ne3sAln8I!=?&P)nI4uZ%hfVL~5&kVnmFUDFLy|l{WkLBHREI~-mA=rXPG5~h zfrfWUWS2HHE|=x>q!m)4c&Nl0B8tvF^_$AfZJJE>hYMBp!Dw@IE*zD z?m&mJQKHCezTK<_#}JMEEJmGF=X1_^^0Ztvu334bDunB(6Z0O`xOTEy`yK?KYL$rN zIdqM@8QVe#Z*|duz*S>c?ICnQjL?=>*BYDAe6RoXmp8E2A3`~U9!<2>jx&op z9&?U8(eH;Jd!rSc`<@DefJ48#UlLTCXwN#b>bz5Qrj&AK1Bpqp$#vJn<ox->k2%f^|1$Z?Hw*+D1I(S9k4ioIG%XhTm3@gPKJEd`TuG2M@`mFOrpPvN- z6tz=PnX~1I!fD?6Z#4-TvLpBJggBcOD*H`pQ0-*=&BBx*;G&^6G$W6fTVs<3?0R)* z>+E#F_JsNlsH&B~R^gM+KywgMi~X$8ejBybaq>@|v%H%8&rah7zzGt#Y$ zST)mj`H<4BXvj%v{0^m$6MRi-@(g4op`&&8rp=z9Pt;=*C+Uv1Bn;DR!P->TqM~k4 zrp~4y9(RW#T373;q>a8VJKqC?#{wa?qMomaM|Am?imVFIpWg^z^sj*U!N%^y1D}SU z$<_uD8FvwJAnGvwxtN7X_JejJr;1+p;=N%$lqydHNtXC9DQ#awatqT|?BKH>grjoK z|ELMFS+cu>Bh$?wY-aj=h^@xgg6b66@d*s6qXL0UI?owWD68CvsiRUoS)eg7ACw-L?Flq1q{8e7A9 z->>q5CRe|?CrQ#L#hQrLmDQtj^}M>DyGo#}&IyK+Son~5>)vKHa%^DB_t~p0cWy{2*wi}v zmOFp5!>XNRXlQX(H^t8LLmtRgN40r`hK6hxwpc_4K%F<*6D2zzl?V=pZcMB#2cP%^TEi5mIx1o5U)C1V!4%ckqHQMMT$Gq4}Mk@_qJ4fVc%lE~p&32xM!HpsGNGFpn@-Wc` z9{&x2q7tZG-RUX8B+B-}^HC#td za82bA^* zYK59jlbdQBP-cxd8R$e#udB%6Vm)vH1U=`o2H}j7RZxP$umWL* z8yzQIWX;IQmX%wf#HCtJkuW@lRx{PcA+cMmH|7cKIlF?*&N-ygl!V4%_43?t$qS5C zN`%g%u&oU|z@G~HPJ53N*Y!?ZPOJ6{i+>F_t-2}O)_Q_gGS8Y>PYwpt00Rd+TG5tq zu@%5w()fvCOowL$Fb?zk#!&o(j-oyGsB|S6dQMkoLX9owlZKs&s4l1O48w{aItK`x zXo@rj736mCedF*l4oJepA*lhb4OJ4BujiwegRle0GF0IklJm}Z73HzV@_1Mlr?+n9 zy9-@Rn`BcuEtwN1r^{4XdEOs>LYbLD>Ibvl#65c*30s|9Q0AVr<@MYAVIHj1>WI zmsvfUelCvWYVA{2g4&HU(plt%u|O*w98H@2oPf4OT;2cYV93JW(OYp^_VVjjYR$HBh(60t|dXiUk#b6L{8-A zkP}(*n2^}Yf6$>`fd^$}+Wx9WNU?2@H_;efkH;Ny8)M1AuC!cWV!vz3=88}iWl}pr zet8E9csPA>_?$K?_jJHo9 zV*BEfmX$RGtu=z|X@^adj_@0XkyfZ%M}%i5`_ZCr0fAzxVZtizLGQ+*>=DG2=TWXS zv1N3+XO5lIZpRSF_--i?9~~%?wLSL0n;zp)w8(34nKaRMX0g#%-Eaf(^sdj0)q#p{ zIcId;5S9HL$4FcMR%EI3Qwtaea@|oaqMu!RT@^q9m`GAP0lKGC`=4@y>iE%;fT_NS z?r0a2M|zo^iP&NXfh;sd=!bkg;7bID2v*MDu)UpTVbb+9 zDM_hGT~hWcv;p$-W585(NKfzAVim9*QJ!kyeRflky}J&N28=$O%IR2GUJTm=kwzsM? zuC>Th2;sS!9R6E1fA%cHi{#u@uAZ?<_lx^ihGbWG38+=_r6iamjZQ}u$jUJ;Z7`_% zwcsI*K9Ov+cZcmjc?-dWGA7}|xR}FSe2Hs@@@G=JtzerFBnMwm|8euyr+Q$A?cG{u zMHP~b7PED9jw;i=HuZgZ5jr#@PB!6ihfQ_rExx;vWRRfkXE1aT>3+kA0qp}a` z=EAG>ED;*A%Q_wJBey(ERP+GPShBJoR|mBTRA5xp#!PAk1A>5bzJqUS?07hEUosPXuek2q(N3qFc3|KfwZs3Ap6D-WYJVik%cdJTN?x&DTvC%Z@Zfx3(w5Zk zT|gTc(?@ldaIW`u$1dLu@_h2|_&`mH`LhKX%Suf_#>qMCDG2cKvK8H$2z zHBL#LGVR<9VRi`h4!poQa7~bvHY8y+av1bD>~Dq3`Md%oS7y(Q&;$pn=J{CN=f~DL zh3o>oQ@5vhRd{B5IgQGpZ+|3qb&jeVAEH$lbVTxIiC`niP$$~9;3>3CyNzaQLT{fy z(2T6Md2(bP<3QtKovm5w%XSYP!)8$@$sYo5?W6Uw$C(te_t||#*4B|#yhm+&5qHkW zV8_nl*M2^`Bec(X@3r#YoR<>j>^^<-r~s{6K`d8oUheRa-16x)TS z-8pqC8QoGbm}YH$!dT3sb&&E=7~?5;M;1ZJb8i>f zI2K}x7eC(KeN(%6o<<_RWIM_IM20E?O?YmvMUzb!yn}!}?>6w_nyr|!7}wS@NYZtk zUIJ0OY0poF?b&t|%I#ZA0&zfqXP0)fG%B3rmA!5EHkzf+v!Bb2d|*Z@hHYAk2jAv^qVPdR>j{62s>=q7;oCd4OS7l)8sejilrxi*Xv~!k^nyq$a zYVdEm;@yp+$%^gt7BEpcd;PrR{+Vd#00ZJrLx5N**Q%1yaAM3e6+LsFfG)@0!rzXtFt z{#CoJTutM@60i~Bq!DVc4lU+nFezUv4+EUeIGtH7oxyCWk?@u062QKk9_VZGtSVre z!)g^!i_kl8Ji5g(hA;k4+BFHCV83rw`&74xvjV2cXmbr?kxD~ala>=A4Vn5pVp@&Y zgN0#uM4)=p0~V~`o-J%x`1DZ^O}>iWG>rDnFVQc0Jj{t>9(`AO_&9m_ISpa1V~N(Zdq7qs)c0?W!Bv2)M-9HQYpiC)J%_9Si}~? z=h_)j;@KKr4Ah4^MJZ?fXFlgTb;35|U0~Gm+M0VbYfZ=WQaah>kNR;i%#qd0MNF31 zI+Lio*GsRxD*v{P_4aPsz8GrWNI?DGDiPPC>HSG|dYW(SR%fTH&)Wy+Vqpd^IubkhiLBn?O=v{aM7;_@ zYUjWy7$0-j2TtY@F4#v9g@tGBbywhlgcd$jY#C)AgLj}IDQX{a7!a``VVlw?$6Yv= zUNh&pg){$-xGtKDrrqo=w*SYmL|K8gs(i+g3F4mGhApoh^*U-U>cs{R?E6Skd;*$} zcM2ct(0EKviCef?Ha5Q660orlXdG28mB;p{Y<3FIbR#KB)-%nwFS<4=zkO$ja&^1w zu0Fdz>E&x~FE(4HG$iG`Hc3BAF_DcU9AgKGhUUD4t=Xkqg@m?kz&1I6so_gnJd0bc z9CmG>UygePMi{odv370J9;C0ra=LjLQyURboEM2Td7k?ctnep6yC$t&+*;2!15}g< zxzI*65KrZT+xM_y!N>xFo7)m&4Ve+b%yR1|G%caiQ-S{xkGpnYNgiBa=~J6lzeuxZ z2roXh)Rtw#8*O8~{d9mF443d;6Vx5^v7Nic-dYC@3Sb(+#i~2zLRlhCJzt|nDcp|c zG&l6qNGndDT%*{H!W;KQ?OreV(Mhaqb}F63ZmCFe5A8B>m+u{i=zdDg77IIal zvagyC!WyCDCWPS~k0aXJyPft?lokWa>#}KL7z1{Rr~wh&H}KQu1Z-#8PDr=o=yzz9 zm@E<>)-;UxPC#^}0Jk9Zxnz`IkN-Q$)~c7Zogla*XfHWvfb<%d@@m5*eYFRYK0CAW zc*nR!s&rM@--}_83_ME=Exqe}ZHD4-$fg_&DW?t|WhpU>x0dJ`R&(|0en5I&Z(7K^ zz|QVcmlXzh5d@(iB`?kECaQMyTG+AwRzs2}PT-p?mvXQGV3gUt{RI)J#nP^=a`AX7 zC<>}PxTb%#3mJsvtTaqUje=hhM>uS)w6`eD*#|M#)p#w{>`qW+6MqE#&$Z>Urj)!@ z6MCsF8}<<9=jT&c4+c*-c}Ms`$n;TsO!q zyfcBNe^9f&XPNy^4gR3ZQ35BSJ;NheMu3;0vAVDd&?F#y(nL4A;7*sbC4P6Dg4rSb znkkBPq2SId0G!@f2Nx)iL5+yEBlydSJoL_lb3*7K^Q$51ALs{4Mo-rJaD1QG^XXdV zZ)t^%!lomGgy*zfvU@b9fuQvT)_- zxwFmc{?89&dmp%8zLTPuAC&a4k2jQ)R=xZq4=VlQzF%p5%*DDyltU|#7=q=5VV&=6 z;wLz`^s_!B>c%tg)D@5eB8p;!-gF0CeqtADor{Qm(?=VlosAJCJ*X5M_Qb?A-DjK` z2X=~AG;ta?8Cv?HQv-` z!RjyNsC7t(nb@@I;A6LZbRiuNc_S#~<)grQ4g^Uy`&Zt|t~LHub`ps8@+(l8lhtL$ zC*|){by{65-s)7JQyUGym1+I)N3?_mF;sNs2RuMGIw;SapquXfP@O$Ml^kj8=s{sd zkOV$xw3BKp!dDT0guw(!W9~~x7+4)obuJwDU}nB7k4$n(oTva7b(v~^ew-S{u#d9}@W zjfardjZo;o*%aIAth4!r7EbJN-e!utjXd$OSuWqg^2MC?v>)`TER7=`!_O_eqkl6y zfgCCt^}{O=sz!jzlOy)k+7>tj*WKyDSTAbuk?zk7Q++)bBoaoB^0Z}@{Z_#J4uP`6 z7_=nOpDtlVUIQ4^>43o&g2M{pdp zvyc$qNQlp#_IgA9P@2jEh$lBi%~Z)4wfU?y{h92G@5$Mt%KRBrx0j+Ix=b2Q zchD<6J;hrNq9WRD_`NhwT54Zvi79H2&t4sx1iHtvs%QbJg{Lk|X?SB{ulhfLKF8oM z%KPjI(IJeq61ERddLD=1)YRq(4`{bq`%Bo4j5i^vLsJwuC{XOgsQ+Tux>-i(hCs2pE>l}e!cpC-g!21*(f_ceJ)#}#hl$z#gAXNk<77(J?uQ))R(?&S>p2{crZC|A)n2Jec(%5x>18cpM`Wy1!ad>AFfsW zP{2fe95@2=+3#IBxB`iHWs z214n9Fed1un1&aZ2^Q3lXHh<3ZVe@*lRC)2tCo7GEo1_x-sj>~i|pGJTPK4g5X~yO z?U7ona*mG__-*a{`T#nQ;=;xtukU$_uGU--BzbL|2^$6Z?j#7&MYatYn~;Gf-&d>h zv{Eu#%$p1hl9GiUBgeRBwBlG~SIh8t%&8^WuC!juK`00AyD!k4f?ILb#Uv2OrJqo{ z24{T^asm86kVr0*?C~xVFqe?=GF)}>|1VdiAd>F0h3-}-#YL*nxtajtP56jlNMyY7 zh^1PvQk+EgKSMMim|2nwJGr4f3++Z8ryoc8w%r!A&1t(YXFb5?JFdbA6Q;u<%EXQb zib!iBBCX@RHl3$<%3jy*&_D3TpkPNNo;iyA5f&=>WbWY?ANM`?^@U0ob3Qu&Q+*8A z&s=K%B=n8nzSa-=`d=kNDXh~CP3hVz{fut6^%KhO>!JL#Qf;%sJaWo|XLn)#&t2%3 z>%U*B4XbXYnzt`VM`SBqR$n!g)twyYzUN03-;N~2(d9s|&}QVc2|10MM?r)JJZz=7 zLB!N(Nn{-luWOlQ$S%*G>>tMBj!;G9bbic{i0})DFHPE?v0+XjvD(S=>YIqv(IyEI ztBXiumG4g=+M!=TpW76}EX%D_Av5sq-?UB$iTR#}EobUReyS%Da+Bp*l9sFSStwa& zA7-KC#TG!tZj{|A>$sV$@>+ zvr4T4t&7`b3B+~80qS;#ZS&jq9IE^D8tI0nDsfw-Xxye5(R&x3JdTGrkB_Ueu;S-e zZF&rie@wTk88aiio*0j)m4I{wEN;cMVWvLvBSydI8Iaf7NJ}M7Q!#mMh)%}onjYtM zv7Me*(Z$oh2w0$6gk{bK&gIwx+Ttd^%8a$$Qs0i9?2^xF1~)$F3YHF7fjVjntuX+l zuOu!n&QC>PM{TvQSJGE=cg$Ud!Z7QQv5S5k10hg(wujAu@hZV8Cnx^ZH?x|Ra_OuC zR=QaI03{>BihS1`;f3jhpe4xavyxQ}P1slP#iyfD+tTDVWp-W)e^JhgDv(4F>|08Z5+lj z*yI$pjuC!#O8v=g2s6)@aO6B?=Hp^ihELo20&?dua z8004|LMYshUmVn&+bov|GBC{9qw*G8T;F7+Q4w&f$Oo%v;mW(mP^5_nr1CZS zs=!a1Uv?#^i`h<$H0FiujjS|Yy}3|oo5E4LQruaZO#f{Td5gb};@(4=+dChR#ZkAd z?9_9&d%o9f_k4;%St6vM8xM>2*m1iWv`*#s=s9i(Oo1f@TP(0Tic0)zJ`Y|%{$6JH z4OnAKXCrJX%J4&0f`{-yJbpC^T0J^KJwd9_#DW!!2iu+CjX>1Z+F}?t5N3ou5v_Xo zW4{RSv4?s5yZFhckw@q7_`h@MN;5qIxx_b+6x@^gj#DpshafNKrxei-*{6FL_8H{S zYsa;s8vi^H-Kx}|MQZP-6_cj^9{{RO~CeU+JX!FCcyhk#`;xa-RLwH64%5@E+MZSl-GZGTLDK3{P2YtL23hbp2*9YuurK%KoHTB}-uB6oRjqmgOa;k^Zbc{~5S;YS^ za?o1T;VWp<*o9=`4H$L8o5!ldk+bkCQXL8p@!)%%DV^Id*xZ8uULZ>v%L|&`iLLy* zozj4uOl8!5BxQ1E#1j0fL(@Ea6>{R1STBowImSM&?dI{1mRhmZ#ctc*>9!QFITSWf&6sFyF6;e@lpVI0cX+3&XmAxRZSr+TX-=3V3Kf z&EprQZEZS+O)d+;;T{puE9hNh#3T zNDHc(y0iwWH`7%kote&$C{xRV_y7TIOpCE2I#DbHT{9z}JM7#P>Jr2c zVO9h3LubC5vB}yv*n`C#uXSpE{1D+F+Ni0=a1Yg?WP5^+>}K5#BaW}Kjd=dtm0kns zy@B&KZ?&57 zE*!{Yn;W&yMtltij`H~UX6j_JtX#7isuRP5k8xxoF*+oBs+J}*N6(^YPD?qv$}-rS zT4Ai5oB4{|%tU*rosW{6xd#T9nx2GErCjM#J5Rx!Zsn;bjd42AlTV&;2`>K9E?#y6 z(rDqiH5ZXb$d@s#=I6bY(8W>Fb3Y-+_+`EQiZke5j`6gYW26Cns>Qb0Se6@ErBC+J zPj#P9`+|0C(`7_rhTJ|wBs|-?BQ`B10sv3E_jL>A{q$>qhM!ObVHH9SO%xCSrS^9R z`G)wrm{x!U=s4U)J?~~k9Di!;KRDZSh`i77^-DFn(St8Kuv0ypj+3MxZlS)kWR#EB zsZip+Jq-jYCn&UW!HGN;3m9h&31r1IT1@VEVbpZDu&^<@*J_s4*$BtF9>ycxVL7dq z3pME}jYdHtHF#*ePMO$(CCXtZ+aeCURoePK>y{G=^UZ%oYF{G-`XFsTQy1hE_Tt81 zygeV(G%U({ojedi>(+DXY({;MPh+ zAG};@1RR z$P=0*R>|M1L;Af%AlXfOkv(LwG?e}hVKhhVL0ZG(R_wa`rX#MBOt*0Ix@@Cg#7=Ey zNF*P+3@jZc>>#gay6vHEGFcq(wU}8iUUX+#=jEtIVr;Jn=y$^SRf=W8V^6Tj)FXoe zNQL50?dTYg_twk^?8R~|^m&I|meVolZMH9hh(wINXaB+HHI?2lF;WFH=cLGH#7*9K z02V#3r2hycHWu^&4>z5cvYH+5_JBUi)^ymB?ULKM2|Nj~3q`2XX}DtGkzE$Eui}kj z&UZ)Uy2-@`d-{gj_bAj8=^l!*&D73j!_$41x0y&!=dE(ECcM#Z68Q$ybS2vG)n;Y< z$9mLAyX8X{;*8!!B_=vNbe?^C3l<>-E(oTF2LKr{MtX>61dNX4-Yhk;nf^m}SH83%1bCcWVi)LY*sf{WnQLz^-=JOV zN0p>ibH$BJW@2#vx^B1;oYOw6@UuA254uS0)buwaYEQYHGA>VLXZ0XGe?tmt3dv*U z*;|}OrCD6VS9Fa8)qg~Ks!q`b^OOr5YvrUFwj8hCXvd9uX-Vei=uJNX?XVXS%}#r! zId0%Y%4Hr*tQ7z&ZLz1BlE6#b7+_-chnzId(Dky1i5U#77QMN|iH6b79wehkKi*}f z`z6!D(0jyfEX3MQbd1pwUE#A6n?S4Tn>U`Elunn>{A;s*%>PoDzA|<^+ zZ8R{luEkZEHj2^Z<+zCv{7Wu=DLs%K83|O=MaaWX@3YI?U3GHN)b84wu{6X4`!)gf z4B{lQ$HU_xdP4c|ye?cImPT8m{h))ksD84o_mJ1e_P4YhGJs?H2Ou!!7GQaHX0?lq zTH^#@ICd7uU}tQKBqhC!kr8S?_4b0Ks zIJ<JM1rX=Ms!l1d;nN?_UJun9XV%z1ZTSa@Si1 z)LhRO>r#3cYd}25S!u3S^dx-%aQk+%y~=T!pV!+bo+oG(q+$42(d)Z4Vy9zbI~PZFL>XLhopVRQswvz^l%s^`%ip~n4?5~oHS z1naWvTe9s&*^UTr6VK~*%oclEtG`Mc@NwUDxUms^8ct_3RuIr=$<1{Xy+A(^(wL^B zsfk@yy08XDqzGT^w;%a1)rtN#E7%zHg-{Pt_O-ZGx0tY9+g&#`5~#*FAhcA1d6ZZB zZ@kP+9uzpsbma2lbd&BBML{~9>NY05cA&b=&g|n`&>Ct-{qjJ^zf0r#=c$5k(8%uI z5PCBQD+{<5(%>GqBO~;UdA5$E$3NOKb2uu><`CFpa`QK0Xw;04wU`Hd!RdGH;Hg&) z;Ctp@iu(a1Ua91DzYcjPF1LyFIRw3^!1Yap{(9@H=26 zwe*pXv6IlBibE>1W9I(LkFaGzjV#OpHEPA#bq+VW^CEo+;OCOXSi2j{EHoERB%wvi z6fWkfvxg9m%W1M{1Y(;6U!R7h=In;KqfH>jS5O#TiuH3?gq1&?7-@-R`ka;=FTB{q z4|}NAr51d{2ULsZSZ)YCdWTZBe|E>yY)dS=|9q5jjREuA> z;6f)JD-uF%)2948GrXC3c+VAK+Y_{DmGnodS_TC(L-ulp&org{xEj1!-kgGhGI z0{{Hh4K-ZY-)=Q&JOdZZ_%Y?A7qK*35ktJmftF7B-6NvfZ3;Z+LW7lc+N8mO?3v+1 zVZ*F61{*eyFU{4axC_PIIxLvq%EJV@$uh4T1IZ^zK=fSU4=qz$iPd}sNN_YetzeQ$=7P0wbqqOv`>OkW zvY7E;YB$}$n9!XL5*Ow+*77#5U&1@yDRvj{`;&PL?|rm?sk@*s+a-ZB>Ai|ZUxArd z!u|!QPm$?2`Ucof`O@rq}dR*p-ybes@ZMM%S_pF4Sud}-xJ9z&8>4~Y33z=?y*KD;C z^r&X5^ZNBMBD=0n+i`I_I|ZjbCT?X3wEun*r}2F@7`5+-(t$HR!4%7OrR@lc0x*jL_H7&kxOhV9g}r6ib%Xk3|^&`1tagCRiiqTbHIlQyuG zq&~~d+-D^Zv-#haYcr>>v8UU58X?lhbn;qP%C~m65XbiW)YhT7)kZ-VUVkS}wu{eEN9YF#Wd*5Dz1pev@*vY%iQK*xT+Hjb(XG{07FlT9 zct}W|MWuGPi#iI{Z}j{4j1T#apc zsG5a3J9e7C)vDJE-g#>~L3C`9NudohP?uv8Vcb7O>&gg!dmCTgO3Y3G*ZyrYX4Ts{ z=~j(aUjnv3S_vnxs3@Kaeo}#e4kskyC@Nb#zMrY=hFYBMt!hxf4psOWry4Efd@XjR zZ8&YLosUzw01G=*v`y|$QSr@HjR5SZ{ z#g0%umAvE*ARd|xNy>jRX(zm)NxM{YrjndgA4j7*n z#+M ztnjf6W=;s_^`6))E2D9P%pl!c>jqn=%p-)4xc&FbeEeB1)4zzxzY*u7u8nbF3-3Zm zZ;n9Ljb)t4EtQ$ZrnWXVn3v;0v^uAc3W&n#`h%Cu3-u!c)11Al{mY zNBN;2hVZTa zPHz}5q_*I;9DWD7vl}k%%uygbK8+?3ulgK+8sJIttTAmvX~IYmy{Om00d!T1Yjzc# z&_Sz#eIf(TqjOlLQA{S6fg}}i*g!c#n+CfIlq9Zh1jiKGS*yT#r^yFV1H%pE+SY_G z*vhxOZ|?={T+%c;%^K{vRni{TOC7B#fav+(U#w+mh z$y57)EY6-f_O}9`Mf(;nYE2pq@``$Ax}u(cezZ?*WLXVinb~IA5Pc!>e2dVL&HTOs z8;si+7SFXxLm;Osi9m&R%7{a{K49)hYoH0Yc!8GP{u9UC=_!cw#M^mixjb`sl3`u9 zDA}hy<*PHiq#kmJWAMWwX=ca|3vdN9ukCq2Xm`V1QnK+S=}^rL6P z_Vqpu(@E=!$C7KKaJLmv*dp1UYPr>vWoupW)8$P}ICa44ip0vpBaKPnsg|`T9LRZ9 zl^N%DoT|w0M4cshmn%Jo(-mcojUg7I6_!-AccW$wTkNk$iP{WOI#HokRmwc-PvCCk zG%raL>oH^0mtX9oR`Hf?t+$r6eFLOP(7MpN<%2b>3EWZVrcK|H#X39{JN+NEN7P{P zTS)eKwDj;3tZ_vEkUWh#mUb>ieJCYYTjX@sxGaYrA4t zm4r56Kpw&A>f_qP9-n^!O?xz=+ypP7JLc!gEr;nu`7TmghU;2mHL4T;GApTnY95-G zzDX?yQne{7Ow|rqs5kCv#5YCRKL&cC&m@DS=;Um{c@;a%vr4|X!fx%PKPW#Y zzZ4|SBPvbQ{o8f#1hAF2EW_j`X)6Po&>C!(NxSI{XvMudT4EN8p@A%9K(!Fl`~kxH zA`sj~wj#@r&OkI&9Q|R@)#0S@ptr}p(l+8}F5oX+QVAf;iQ~(Q@j6ctj zGeJH@cGnQ<{!G@!kPZuAdHg^3;Vqnzec-L6;%^t%M{Qw7WL4DF&DpmI26WMC#HUl7 zl+7)dUf&Y#_k~=jqLTnWY{5pSL3_}kfAA9)&Fw;25K32)_mVT3QSO3NzX8R6IBgv= zwMQ@@Z>U9{cssADGDz@VZ2UTe*|Fa?!DPTp-;^%nfqN9owcv51Kc6`QcF zk!5x3`JfVBe?D}J2anH?U7Tn6B6B zX>=gp286dUYmE7?yys?c4`G^g)jv)nm`{iNcJBo?t}e{(laWAv+f z&WBAX3gZXQLdBgyX<7LuhjkR@@^`DtX)I2!F-{zxphF~`>fp(vX-;Is8cFD~6v?Bm z+s9+*&^}&N4i{WI)3qC$SJ=uHU@u`jyD>O#P`Lxg|zkCiUjP=nJNRj*;t!3{-w{?xJ zFqr1gYN=Kr#tF7BVjqS>d;;DDy3dZz5UN0*c0Am$)0J%=IUI9-*u23o8Ur`KC^x*> z&R+*B>YU8fiS`xr1yH|_&XINqKl^aUHg6!zQxi9-J7}A?*gi3SOoXk#JD!R=ULi#R zxqF&&Sk$hP^L70ex^*x!&AMKjk^(~acC-(HgvqLOBIsT>OGvpce>cv?g0D$9Crekz zyl4?EwV#imjj-V{FcjLNL6z^IF5UvXG^xTpfXB2t=#*X6&~Oyc&W8L-omAs& zqEGn(=(1g+I_5nbaWzjEa7iZ&PIen-cNcHYWB7Oj2W@|87>!mCd{h{mS)K7BZXjE$ z669H6=lG+T)0kRye=WDx18ZN3N0PQT?V`wYUF0;bH}Ka{l26$%)HWq`FHCt{v6wAq zQ(`t>b=~66CW)2DBC7?hTFd#Fly{+}ARvMwP~&s62C4*X zPTToj7J3gpnGK3r!$L@=%p6iHc>V9PfXJox~Va02$Sdo&=x_767&RTv

    o@??(g84PDF)c31j+y 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%0D3?BzFpRbp{<2Y;GrK%IK)722p8Ruc;y>K#uVR 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 aN^ol!(1qccP`>N9U~O}SM@Bw3>Hh*m?Wr;V From 9f61ade4d169bc3f363165f7fe97ed1345bb2091 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 30 Nov 2015 04:00:18 +0000 Subject: [PATCH 1167/1173] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 3 ++- data/language/english_us.txt | 5 +++-- data/language/german.txt | 7 ++++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 27cc379f91..f2410ff207 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3893,7 +3893,7 @@ STR_5557 :Verbinding behouden na desynchronisatie (multiplayer) STR_5558 :Om deze instelling van kracht te laten worden is een herstart vereist. STR_5559 :Elke 10 min. inspect. STR_5560 :{SMALLFONT}{BLACK}Stelt het inspectieinterval van alle attracties in op 'Elke 10 minuten'. -STR_5561 :Kon taalbestand niet laden +STR_5561 :Kon taal niet laden STR_5562 :WAARSCHUWING: STR_5563 :Deze functie is momenteel niet helemaal stabiel, wees voorzichtig. STR_5564 :Ongeldig element invoegen @@ -3912,6 +3912,7 @@ STR_5576 :Poort: STR_5577 :Zuid-Koreaanse won (W) STR_5578 :Russische roebel (R) STR_5579 :Vergrotingsfactor: +STR_5580 :Tsjechische kroon (Kc) ############# # Scenarios # diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 4fda09c04a..5e25bea092 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -2294,7 +2294,7 @@ STR_2286 :Designing STR_2287 :Completing design STR_2288 :Unknown STR_2289 :{STRINGID} {STRINGID} -STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} +STR_2290 : STR_2291 :Select scenario for new game STR_2292 :{WINDOW_COLOUR_2}Rides been on: STR_2293 :{BLACK} Nothing @@ -3901,7 +3901,7 @@ STR_5557 :Stay connected after desynchronization (Multiplayer) STR_5558 :A restart is required for this setting to take effect STR_5559 :10 min. inspections STR_5560 :{SMALLFONT}{BLACK}Sets the inspection time to 'Every 10 minutes' on all rides -STR_5561 :Failed to load language file +STR_5561 :Failed to load language STR_5562 :WARNING! STR_5563 :This feature is currently unstable, take extra caution. STR_5564 :Insert Corrupt Element @@ -3920,6 +3920,7 @@ STR_5576 :Port: STR_5577 :South Korean Won (W) STR_5578 :Russian Ruble (R) STR_5579 :Window scale factor: +STR_5580 :Czech koruna (Kc) ######### # Rides # diff --git a/data/language/german.txt b/data/language/german.txt index afa61bc290..0a20a28754 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -2291,7 +2291,7 @@ STR_2286 :Design STR_2287 :Abschluss des Designs STR_2288 :Unbekannt STR_2289 :{STRINGID} {STRINGID} -STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} +STR_2290 : STR_2291 :Szenario für neues Spiel auswählen STR_2292 :{WINDOW_COLOUR_2}Fahrten auf: STR_2293 :{BLACK} Nichts @@ -3894,7 +3894,7 @@ STR_5557 :Nach Desync. verbunden bleiben (Mehrspieler) STR_5558 :Damit diese Einstellung wirksam wird, ist ein Neustart erforderlich STR_5559 :10 Min. Inspektionen STR_5560 :{SMALLFONT}{BLACK}Setzt die Inspektionszeit aller Bahnen{NEWLINE}auf 'Alle 10 Minuten' -STR_5561 :Sprachdatei konnte nicht geladen werden +STR_5561 :Sprache konnte nicht geladen werden STR_5562 :WARNUNG! STR_5563 :Diese Funktion ist derzeit instabil und mit erhöhter Vorsicht zu verwenden. STR_5564 :Fehlerhaftes Element einf. @@ -3912,7 +3912,8 @@ STR_5575 :Max. Spieler: STR_5576 :Port: STR_5577 :Südkoreanischer Won (W) STR_5578 :Russischer Rubel (R) -STR_5579 :Fensterskalierungsfaktor: +STR_5579 :Skalierungsfaktor: +STR_5580 :Tschechische Krone (Kc) ####################### # Bahnen/Attraktionen # From df37433d52dfbb8bd0ef0f35c5e15a418cfad208 Mon Sep 17 00:00:00 2001 From: e-foley Date: Sun, 29 Nov 2015 21:35:51 -0800 Subject: [PATCH 1168/1173] mention additional changes to original game --- distribution/changelog.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 3e0d7cd52c..e43f4166f2 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -40,6 +40,7 @@ - Feature: Option to ignore invalid checksums on loaded parks. - Feature: Option to scale game display for better compatibility with high DPI screens. - Alteration: Autosave is now measured in real-time rather than in-game date. +- Alteration: On-ride photos are now factored into the calculations of a ride's income and profit per hour. - Technical: DirectDraw, DirectInput, DirectPlay and DirectSound dependencies are no longer used. - Removed: Six Flags branding and limitations. - Removed: Infogrames disclaimer. @@ -55,6 +56,10 @@ - Fix: TD4 River Rapids will now have the correct seat colour (original bug). - Fix: Message sound will no longer play in the editor modes (original bug). - Fix: Scenarios created with the Scenario Editor will now have the correct initial temperature for their climate (original bug). +- Fix: Financial information can no longer be accessed from the rides/attractions menu in parks that don't use money (original bug). +- Fix: Launched freefalls in downward launch mode no longer use launch speed setting to determine ratings (original bug). +- Fix: The path tool and tracked-ride construction tool no longer interfere with one another in certain situations (original bug). +- Fix: Building a flat ride partially out of park boundaries will no longer trigger a spurious "too high for supports" message (original bug). 0.0.2-beta (2015-06-21) ------------------------------------------------------------------------ From 88b245e099ea75ce21ba495ed119385adaef13d4 Mon Sep 17 00:00:00 2001 From: e-foley Date: Mon, 30 Nov 2015 00:38:40 -0800 Subject: [PATCH 1169/1173] add note on staff uniform colors --- distribution/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index e43f4166f2..d8cf21e142 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -60,6 +60,7 @@ - Fix: Launched freefalls in downward launch mode no longer use launch speed setting to determine ratings (original bug). - Fix: The path tool and tracked-ride construction tool no longer interfere with one another in certain situations (original bug). - Fix: Building a flat ride partially out of park boundaries will no longer trigger a spurious "too high for supports" message (original bug). +- Fix: Parks created in the Scenario Editor now select the standard staff uniform colors by default (original bug). 0.0.2-beta (2015-06-21) ------------------------------------------------------------------------ From 115a924e5ab2b0c63ac8627707b61957fb5d24e2 Mon Sep 17 00:00:00 2001 From: e-foley Date: Mon, 30 Nov 2015 07:42:29 -0800 Subject: [PATCH 1170/1173] misc proposed log changes --- distribution/changelog.txt | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index d8cf21e142..1c935a1d3f 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -21,7 +21,6 @@ - Feature: Console commands for fixing 'Name already in use' and banner count errors. - Feature: Scenario and object descriptions are now translatable. - Feature: UI stays responsive in pause mode. -- Feature: Hacked rides no longer have their reliability set to 0. - Feature: Marketing campaign can now be run for up to 12 weeks. - Feature: Day/night cycle. - Feature: Added ability to save (over last file) as opposed to save as. @@ -40,7 +39,7 @@ - Feature: Option to ignore invalid checksums on loaded parks. - Feature: Option to scale game display for better compatibility with high DPI screens. - Alteration: Autosave is now measured in real-time rather than in-game date. -- Alteration: On-ride photos are now factored into the calculations of a ride's income and profit per hour. +- Alteration: Hacked rides no longer have their reliability set to 0. - Technical: DirectDraw, DirectInput, DirectPlay and DirectSound dependencies are no longer used. - Removed: Six Flags branding and limitations. - Removed: Infogrames disclaimer. @@ -48,19 +47,19 @@ - Fix: Grouping vehicles by track type no longer interferes with research. - Fix: Fix corrupt map elements when loading a game. - Fix: Fix corrupt peep counter when loading a game. +- Fix: Parks created in the Scenario Editor now select the standard staff uniform colours by default. - Fix: Launched TD4 rides will now always use the RCT1 launch mode (that doesn't pass the station) (original bug). - Fix: Guests will no longer ignore no entry signs if the tile contains more than one fence (original bug). - Fix: Right-clicking a piece of launched lift will no longer crash the game (original bug). -- Fix: Underflow in Heartline Twister ratings (original bug). -- Fix: Map window now display the usable map size, not the technical one (original bug). +- Fix: Fix bugs in calculation of Heartline Twister and Launched Freefall ratings (original bugs). +- Fix: Map window now displays the usable map size, not the technical one (original bug). - Fix: TD4 River Rapids will now have the correct seat colour (original bug). - Fix: Message sound will no longer play in the editor modes (original bug). - Fix: Scenarios created with the Scenario Editor will now have the correct initial temperature for their climate (original bug). - Fix: Financial information can no longer be accessed from the rides/attractions menu in parks that don't use money (original bug). -- Fix: Launched freefalls in downward launch mode no longer use launch speed setting to determine ratings (original bug). - Fix: The path tool and tracked-ride construction tool no longer interfere with one another in certain situations (original bug). -- Fix: Building a flat ride partially out of park boundaries will no longer trigger a spurious "too high for supports" message (original bug). -- Fix: Parks created in the Scenario Editor now select the standard staff uniform colors by default (original bug). +- Fix: Building a flat ride partially out of park boundaries will no longer trigger a misleading "too high for supports" message (original bug). +- Fix: On-ride photos are now factored into the calculations of a ride's income and profit per hour (original bug). 0.0.2-beta (2015-06-21) ------------------------------------------------------------------------ From d91a9c965cd162f4ed53bab105a839f7bad885db Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Mon, 30 Nov 2015 18:00:33 +0000 Subject: [PATCH 1171/1173] Fix #2405. Foundations under shops now correctly drawn. Issue was caused by a mistake in implementation --- src/interface/viewport.c | 2 +- src/interface/viewport.h | 2 +- src/ride/track_paint.c | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) 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/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; From 6da5018455298688553def886a45566d822791b3 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 30 Nov 2015 18:34:31 +0000 Subject: [PATCH 1172/1173] update distribution files for 0.0.3 release --- distribution/changelog.txt | 2 +- distribution/known_issues.txt | 9 ++------- distribution/readme.txt | 4 ++-- distribution/windows/win32.txt | 2 +- 4 files changed, 6 insertions(+), 11 deletions(-) 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 From 42f5004406bdf96d56c0c4c9776d41ff9f874c47 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 30 Nov 2015 18:50:39 +0000 Subject: [PATCH 1173/1173] Merge Localisation/master into OpenRCT2/pre-release-0.0.3. --- data/language/chinese_traditional.txt | 5 +++-- data/language/dutch.txt | 26 +++++++++++++------------- 2 files changed, 16 insertions(+), 15 deletions(-) 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]

    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

I@$ZLzu-% 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�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¥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

k4SZDic!7a;9)*6|Q)@A~pbbasY~8 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℞@074$SdR~Z+TjRlbyB8TN*EXFKds519SO5quAB+B0M_}QK8uK^VF{r~@ zibZYL5nZ!3izBJe!#wnSl2%-X>-o)(URYr#oW*tqc$&|4qBlj*|2%GYi)=$&_h-=! zj3dd{I$r8q9B5C=II_Uv*(ML>LGCu8RwqBk^6G_J7JA*U-@qCgnd1?^L%V#IT^O#7 zspyV`ZDuojV)F;1$E(@6ZPuXy@wL&&2n>&I8<5Fy(N2gx29eb=8j9EQ~yW7V8k`o3**zi#YTn*;fgr9DUGj(uD z?lxe|D{XGX_Q>|8BYfAr#jTevgVJ1jE52f;cQ}TL&blxU^3MP{V3AE3T;J=*TBj!tB@ZTMY@W$m#7~ycSmWhApGySLZNDW0+U7O8wMVjT zva^4roQz5I>rZsI+4AA?1Z}4cSeP7@pY>(ErRiDwWALOpM1;ySXFnr4R*pY)_J&CHqOI$-1zpvG^j^ zo|70inQ^uGuVI7SIgfR9+JQc%`n)iAsUEkJFE|&Od7R=$+U%;7J>3Fx z6le7<0LrvLBqWR}RMgru=@4LJBPAQz!G}3U#d=9rFSCZQeNc}c&B+Hj;0+YJw0+l( zmz5qgksdr$XUR&H`!nmTg!TGi`x%94s)N*^SX$xk$++}@QNP*tg$B|V0^GOBZy!b= zO3V)>L#?vrA)RV>IEd`n@vUPv+oAUL`yEXLUM9dR0liPFkGu`)1LiNb_ZD|@ave|zP>eKGcv1w z*pFUX1`~oME0?KnU8frVeDDw*uxggBgt7_PKs6ccV(pNsob>;L838lP5@&?F|XwAdDj_jy8eT{02v5&h+m7FKK zHl`trh~pc%`ISD{Mmakk{26{Rh_$xsgUC?kdflont+b+hCH4dBY`gN!s?|<1nA~5n zsaEGfR!MW7LUV}8c^`5akNPL1a6>jKPwyjj+aarpc)GJ*(!vJOolwdOGmO>xP@P){ ztDKLhCntqJRK-@S3YIaRh_0c{1v%CGJ|qG>1ku6Yp0VMpd?~!i@u=K+rC7A;IK0Uu zfIE4U64iv~MfV&994Kkgo)*S~(|$F?!^)U-6kY;>!P!wRXt(@*r=;_U<6$ zWXVi^ORM`^e$*U}0f|vU13;;wQo_ z$-JUCxm{tFg#zs;pBmnV} zxVQ_km^EY#+K7+ ztgr@mUEqh;$TQU9yGKx?^r1_Eem9GcK!Ui0(wFfFMJwDTqSao7@DZAQFHcv<2Yr=q ztl_mE$sc;hSF#EtCA|*Y{}l^W|nz)!%eFSBRB&1UQ_EV=9<8}2)d7AXpB?fz-U_@w+)8E zvd~JdkcI5-e&mV=9bmCdPs&QO{FFn<0GFW?hbd<2`268k@2@XiOC^EvF}vmH-EP`s z;mo&O6u8aGNg(J#2@kIqxL~8I;SLTYI-`EN>wAjhmGeO?I1v5BQ zecnV1wdy};-IlO^EG{VY3SMfO@SrBI=Pf_aF9BB~xu_R62phQc(VTh-C)ptW>Ui8t z96PvJQB;knqQyhwvH6L|%4>uc1iZrePI9HPKtc=7NaTs3O1=e`BF4yk9)>2MB`dwb>yL008v}oZ;Ll&ED&u&TfHc{ zfu4-7nO`UlVX;p9RxaReoa*HlS0bg6Na4(=kkP9hGTMQ*7i|OeVl_O%raTX?q&x7m zQKvW3Kf*YA{UEA^xK1qvx+)b;wlYor?HuP!Xik1a)`Dl;U5|89o^*z2G3_Y--tB)+ zUKa!bR)%pzSo|Vzs|ZAI1T@tD9^csztgm$4?}K#-`P*`$pAb#DVLPaydFpD`qq1;BXzZ=`CvU%Q_=vFDtv`=vxGiY>H+TrwA zdKN7m`kZNRc`F22q!y$HcC9MH`>jmGQL- zB`;IEYU8ulZ32ICN6l~cushO>3k0%6EYA3!y%AQN$HcG{sqMcTLX5=72~3;emJXXpz%lC=evI zcnB>7ByQg?MYYQpP931<{kx_ z0})7|all1lRsLFtvvc84oGZ?rvSo-`Ruu@MR>Lq+9vc;rm5PpK~*<& z>uOc{j+J}vNm;;UY$HDA7$BwJ=~R>RkhC#+F@ZGIg7NU~?cz){*x5A>w31yN0xQZz zqKu*MHNKR87bB!-8;pQ+OF=L}Z6@_wioS#J^A?39AgnR~iecz8>68_#39$&Q=xlWQ z_7=RtcyL&u=`m@r2dAeUoF3c{P50_Qr(Yp@Ra-!D3R~@SExe!uoqC0rTVyu+wEzb) z+lsi8nN5tMv`4)bBU&v@y51*{;K4>~@3imN+LL1G_?XLmd?<;D zho}zM6S+s@p_-yDi*c26LArdgr^PVbcIBe2|~YWI&?<+>z;F3 zi)+LpoBoS$LS^yU!o9Zn6g2#<2SH!hP2x7WyR`9?m37&#ThfjEQ~dCg9dOr%DxL}0 zTZ|8x4o}v#8Fqn}6VftXO9tbvcC|9f6s(t5I`m?sQHoVwZ42t{`55nJvU{gT$}NG8 zIk$9%&&npbyk=q@Fu?OPrCC>maq*6dc0F*s6~1uaGc+sCoJbrrKZsO6x^jy>;p@nY zW9)AGtpms5A=?!(nqPRPAvAOm7K3d!_3_J3v+6XUOE5`KtCWoA4V&XrHOu*mwN?=) z#)jhrW4!c95gX-dvaQ-BR)S1Dw)PrH7<_13SQ{Cgns324b^w>0r(NhMvnjx;F0*tf!Gei#v2?odZBi^V_J z(%3ESCXZT{-%7MV@Z9xf;P-OV4`4fcyWol^V{K$U<7ebhHJwD_Hm$Mp5HQ6`GB%a! z(#!fiN8RF4;V475^sLt=U;MOVPBhfuFF^^g`t$#XX5m zy1OP%}Rv6sUMf=;Z zyzG9_b&bm#ZFRju%T1Xo`#5c{MeN%?a<}PZ8t!n|JK3IPxW)k5nT^U35Zpt9Kmk$S z;g~qa-;;{Fz;fK*bIn=^`UfiT6Jw4gGrMjlEI^AqdeK43y8StdDPEAacg!UH8n!l( z+TBvJz54DmNNvxV7+r!Vm+tB8d!x@eE(s?mXdgP2sUYZowbh zUzQ6T3CrV}tO~g+lHE47OBfUd0~0tX#43Ku(drc{nTPPaWwE5eSKK zQhFbWnF1=jO|9c(&!UXIG$w^O;*vB3p{vn`A834YPc8cJsHYFSGK$o2%tFnz5sw^1 z&3~)rT+xXc<+f2e;m;toYH!q)&VCWan9{UnTQm{cM3Em7kg?jaj8llH6-Q)c9E_lOB1{;P13kWS9E)4B z2o;ZUpgID1kUF-=)}Ww`c8kmB>8}(glH2S}e}XZ9i8cUc_$1_RW)mAd$PoCwx5q|f z@qwJfQ4jw#XTx<&U}wr@toV?|A*lorC2(QLjo@jE_mkHx2#3yhnHbA-Sx8Qq^GS={ zjE5o<8`z66yK=urJ3V$O6Z_EV%8UHiM@a`SXmwq}QFfw$p|$%nf?x^nrzUcV1<|2Z z9_Op`+^p=&$~U@c-$u01qa}WiC+yZH&s+DU7RO0Pk48uvd}3#5DOX#@Zzp!6`Q@4k za{C+F?C(wXgBILs>B?ogX8JhVRq$hsfP2IjP5E=lBKXdvK|U0&2)mGrS|^Px$BiDY z#!y!hd-#Mp51@kntjkaq+as~2q@ry4$N;EK)yYfm8>&!ca8o=~_oDJSs= zk8l&Jk*CArsREOB;E?K2p5Iv6R&o9hQ?5(br{uAncb|@ipX2Sa9Hw2Ct8kj%g94E6 z$_*PtU#4{Pp_&P@rAgc9IU_H{Eg+5_LXk%{L+~lVv2L>kz_W=Ve-w7s2}6WpVdN$| z^csp%XlYj1u!>aoR4ZbJPZ-N>*(!4EfW0A6v?n#_ZTAi8$iU{FW*pMbK+Lhsj3*0H zwMpnyHFnwKvl3S^S+3r`oExP7d7;g!xBfV4J{b+<&D~O4?{f<1Rgx;UY2|-=WpJUD z2%jYHg(!KCn{@=|R6Qv@Ozak7twr)T+A=K;4ph1BPcg~#6^?YXq$fqLt5opRq2P=w zJl>N~sEhL#tgBR^-Njbt?Z!p~H(d>tf`v>Dkc0mqKrYy7qneq~wlNsod~A0^Z7)(S z*#T|4Om+6{vqSc`wipVCret|11>J)x;;WI4R#S8uE>FTyCOVxZ7)wU+_kT-qtskv?QfsLBsQcEQ+5DE{^E$rnd zjrD5o1y(%YB2Wqoy_)GMO_WtPp!-D=@%V4rW%#;Fcu`>GPJeE+W12-0sc}i88zBzZ zNV1pQU_U>%c2^n#pG^qi0dQRi>AWbcB}$1&`4zDpe03!c1st(7+BaY2(wjWq?*`?& z?jVVwIqkB3ub@1NPV0=g-oc46fS~1IPLIVL*&6>I+DI@ES{G6t$M?E%*-3os$vN`T z`A~4MDj#xkmA3`rgT8H?T6#efL~}@HIGx~wEM1YcqBv>Yw^>e{ir9pNO>PBm-u3ou zl}#_&*`)+ia{jB>EexKkoPT*f+Oz$;Hv>@8BuGpB?ov7+Bt(k#`Gs8+;!5r)a2xUN z=edGB-Iv}M@uxX9NI{5&Z~j(Iy{SnthQzuln*AnObx^#Emus>2kbO@W#s(X$Xxq1_Fro3(&5vZLNdiI$SSlC-Le7~^&uj^P8aMp6FIrS19 z`X9-o6h&IE+K6oaI}=24uQ1e>*PTWO*I>sQ{u;Sa`VRabAnMU2LvP-yw-8=%0GO8C z_lc~1PcR=^SVSiDi5;p6;L}AmzhODyQL6z5gARw-fKaLh^0|c$AP|Qmk{j^$lf)k) z$+waDRx&6Sw*9MvJc%o&u@Du%KhYh*y3hN`h1hHl$d`t zPNl#u?f?jJfakL@uGeVG4nN#&U=5=s2aybt8I9qQjKPog?!>TR{9b`YjXd<3>Azx#D zl6o6FBZa&QTvBAYS?P8P>c1PzU{;axz!Pi>-nZVKZpxrxZahIr(a>ItO89! zId5Q3voaEjU>0TRRVEdq_{uw4?I&>#Q zfO$O990SqA~l9M4?yBBrc!ItuX~}+n*yVi$1iM+T7uIa9B2N z4v|HA>)?p}V>e)M_9P~XXm%3^dLefqluOwV%tv}*=@IIV7vuJH*539M=X0*^$SaPJ z&Jmji`98+Q(y2^u5 zsq}vt{PCKuf64ozhT>M{KhX&!NgJ)R_b zjt^v85GSZvlXabHT1;p5QCZe^N1fhI~E?ItA$_jq4KDm((Z(@hyL^Jt8l&C-{T=km--e2x-gWqqh!$cU4rW>(p}z4@i-?ASZ!o zPs*HJHxj!8}5&n2(N4FQ$zst}5zFYm}G%JoNE+Lk) zaj=gjDT&geO>)?U`M||Jk9P8RE23b7k0(hvS`}GGqYGZR!hrP-+HbPpBlb;1wIOW% zBr(1&zE&;$t$brMQ>`j$i}|rhY%X8ZuGj6eDq!GZ*<3+KoSs~(wUgwN8?MxSNqV*P zD0f=uIfh#CL-VLJsaoCj6Le|)$2#Tbn6K~eCK(M%KK=etBOA-pWgUE zPA6n|&+9tU9sKIaNuK3?8y)9oA7kAyp46o}u9o07o=ORP)wF&)Y`aC13A$2N6!EAH zKc&PVxmAkHTFUbXVSlsI96ls~Q~Q=GDa*{Yr+VxvUj)nDLFP9tjyPEC-3NYkj2$)u zS9OE=AF}F@g?%=?$utB)`|ejC85e-i*|U=09i+?tmGY+;|?nV{iR#UNYs5A;SZtO&0@ z9v@TEjB%8ah2(UGYhq`xEm3N(urO3khWA+cnQAzT>-CBPv?LHF+QqAmy`8mmFpKkF6esT)dG(4qUzZ*)5 z=Xpptp83C?1|$=~LV>}XfPP^_k?jm$zjxW$s0Kfy5JB59C~9vZs;(TE8+R_%+eX@3 z25aTLtQ|z_`E7eNhO{C`%j?Y90lvWwH12G#HRp1j!(YV{--K*8!1nN_!>BVO=!#2$ zSGXYVITc@+0R>jlLfQ|<;VgR&P$MssTK=Ne$DMYq zSp1^X4=0m3AKRx@)C;>(ZX}E>!47E}I?qgWijh72TW&+0T9EU(Lx?lD4DXP!1ln6@ z54Z3wdtsp3RDN5@yxDeg!%p1h7`q)Ovj`_Mkjz&G55@#qsBCHkNE_i}J2s-p*ctR$ zw%bzed*k7}n(_u%qLiR`6Dsdjya@@%(F0BtfnIKco#6GVy6>sxcb5|pRd%8pTBOW{(oT; zqH!5bex=!#aKw#7sZTH#FTOO8ss*^r4@4>VK+{77!PL$luwCS6`vO0NMy( zULZo}Mr2XFgT*l%gCiWCMu$#qqmoq8cmI$%wTY4AZ?P5GT0o(TGB&KXFB4?81!?g; z>_PEFdZ-M1U?n5b(P7Wk(wNYCWu=6?QKn=rA-fCh(>WVUUUC@?ps6`_?z{tvbU5u$ zr6wbZxY6gXwj|Iw-XAhO6drsb;M5>s1a0m>FG^AEYo~HN0b0Yke*0B`PMGbFY z{V1Dj#vbU~Y=Lxe%SJw^`Wml-Y*dP}8}M!kQn|$0i5BpTL@e)ekt}O_ z80??QtBvhlAnENXyO6)DR;L<`anQoNSLvb61kH07vjaIBJ%9pQG*{ir!{)Jd&xKGP1-6N1kEP# zPGPhFbN(`>#k_JSu8hQ)QbxMzQdN@MR7fVG=8sSzP3%?;Sw#|}b+(iotGkf3=TF=Q zN!lY^V{EiGFlRpgei|<~q7FS8J4vMQ$sgHcP4r*wCrGM>lgD_JjFL6fu8e3r%ud_p zb2w)pi9cDXwHtHMySVsdyM@49C6tpoU@^Ui5aE7kRZ%eFnvPh2x{i0-Huk3<&s%)7 zeIV~j$^)xB>~1lY`=S}>Ls5lYT>-nA(on117HZj@`VMy}0=*Lh1a~EpTi*tNX;Y9~ z2GB0k)i1#mL^}|Q;@HEiR`a0~W$QPuS%L2HO)zD8Hq-{G-?`(5FsMieh%4VA_HY}O zE(JBFXhb^^$=h0)`LPj`YwYpngk>AI@EndrVv7fGLL>QXx=gvjIQxQgY7)+a2I6Q$ zd+HI&C9P-+yRrlf&IkMjU)W0oap12m@suDT0l;_{692KpAS%aq`SgeNWi)5?EHceVR@M(V)M>IZmL#zehv1euSh^ra(i{e+hQs8;Y<5}j}2khpLxQ!Vto?m&u{7r-VBQLPw=(088tn%!tgwqXKM1}pTEpiFRRfTQE3HOK zkzpOY=U7}R_}^yP0qvX=rZUsdj2Bt0ja=cjid@b3TWwDRxyrZr>O(NhpSi;L!JaAv zQf8M3*Hu>X9wPYwv44`SkAff^#t(+qA^N5QF2P#u04By=I{*zt9S%>~jTQD>FON9K zye4;3DC28h7j(=H1a`vRGi{a{=KH4KMv4?MrxysP+6tA+vUSESq5mH{yTWz`;7TcK zA7D@B5Jg;3`zqe!upT8Xqj3v*pW|#(+cw+0Q%89o_Qg?-p^n?X-YV2|XoBV@3PM|x zQqlsfIw(`4w;J(!hSDSk0MA%#u|bBfV_0-ne}lwf9AQ z`J@@JZZKjaHi6ZxvuUfalR;U^aEazif8yy+0i|iS`JQC#BxfqO;8-aFHE{g6>-EA# zu8*?M42Z+Iky>l*xRyp^Q4Zl`1&%66yGGl0wLRpT1~P_#pIRW}wuhXuA7!&NX3u+? zatiJr_p!(h7D%_P&nBnali*G&!<4-$2;GEz_^hnM3Z6~2IM1<6e&Y*>LxG4P5PM@# z+wCOrhl$LcsPJr_kkIS{Bm58ti3`r^(1!rt$AA&jO_a-yFtWauC^W|LeN!Et`~0G>8nt7M|UZcp0@0+L?# zTCiCe44UNSCSMHt(IhQ*LnSUzWqcNpIY52AxA~zzk5MW&QE15@swT38cZ0#z;rkU? z)=>i#DEL0jvph;hPHPce4n({y`?uQ(Gl=aZC*KxA`5}%{o2^$nFES?|dsoElF;6v4 zWvoUgsZSgNL%9}iYur+}D zXtzh_K%FhLr|3qj**{z){(??x_RX?`Y5)3{`8WVH?Pm|EC8BzNSV*;Koc(Db!Ac`k zK$Z5vhq8qWinp1Sbjcks3lKu?jIk3= zD$;MZQ?v}B1ThxoP}mMtBedo&=F?rOYOQ^o0oNUS0yE9bf`eBT_3g2QPl_K z;*bJw?2z|(V+WCOU99S~HDzPb*xePrS~NE3d>b#GZ(b{3&vlLAC`<=Zriph7lL#ej zoO|jrg51B1GTn@06%6RAF`f1rr@KU6gXSzCH}566>LZ5wHuESY`=7JA+8MALiCpQn zh`Pf}Cp(UQ9d^*mBVLXM%4i>x3|JkJMl8snl>qiJ8C98f+AKh8duYHW_c0pnbG1r3 z3n|e{gnu#{6sP(BlN!N=#)erck9JJCoUF#zy4J$yFVy0evk}51z5(X&fgu}?>83Jx znCezucVVt1_{%N(#eD;ic()kKVaxqw6ql>)-?#gX5SlH!LKf~=UDkr+uLl9&t?NAdLQQt zydlw(kVOZZNEm5vUAdl_za>K_XGX9S*ZiGcq;ovCtG;F5)F9;h)Ps$z6-O&4*w?)b z;1Mfo0;%}7=5A11DwB1+9;tC7k)RBiIKitK<2Bmty^?2#u{h0QY4<%r}_}SMt z^0h881m(I~ChXdG$F|`M`1UYKauwn!Adct3oQb@=hdH8|wXG@V-Cv^}Bj=8Pi;4{l zSO__QX%}BNujQJY?aA3KIYuJ4q#>DiwPP%$J0n8L7nMVB8FcO)4H-@&LVKSp(`!qf zx$1DR!t*?Q{P*a(26?`K-*QOjm%B4s={u~`Muns!qit?Wzm1QzAptbQRasKBS`eCP zdU%_%E!mebS7xcZ3mE}U7aen6*7z0duE9vQby+G&;36Mx#ARb2Em`(EyCncT`}vLb z?UY?!Yg@#Dj8K}#9nlX)MDu!I#=<`3!_rdx!_*J(52vu%`waE_m+N~J(pp0q{|fw7 zgJ9G`d_NFPkGtgHcO;q&-xFEBtXQXVFVH@tyNB#z0d!#RWEr1D*{#l)2HGGekqj4e zu!_JZluD@eC7vR<#3xDFu|$#Hn)>b3G%67Tz0n3Nr9S08O^xG#13$3CR;=O!zZJD& zTK9_IS2xGG^CFX z1%A&B_7LfI;yv<_Zf>`&_D~Alawu)({fxt2lpXqHD>>&xD+Lz9 zX9dyF%Z8R!@c#xXc5$LLY@1z2X$h*%eJ87At;^8;IjDPA6L`3xr!PUez?Rj zz;?zPZIQ?L!%qIaY|^s_dBh6dblys6Yz()l*RZ3FAuX_<1bSGis#nkYl#FCbtsSmB zxGm0KenK>Wv5~a~c=1tqYTfvSK~mwdRjL)}!kjgLFNr!{s2cP<^RX}5%Akh!9|VLx z4A^H+ExK_n94k8faU>k>;Jdi}zS*h9+2G$pC|_Z2koYllfB14<_06gqz`*mn8`jvo ziPqC#dukZU{FdDY#(aK?H>DwqGN42f!(lj=5|E)$w!IBl922@J#ypBDhkpgJf*GrI z_JboCnV*$?FKg$sz1kv;>`l>7N*L)J$O4UP(T-$QEkEXoX4(=Qf#i!Mv(CmUdpFes zisjGp+dpFx#dc)vopdvK@|o>w^QS#e%JLN50VLWY?m&lK$D$~-V;zNajhK3SVpbr= zj7K_~2f>AgH>x389&`4s&ZEq=$OQ5w`g-SizH}S=7dG=Qa)7A((_VymH{T+-^IfxL zxeU94YI;$DSGM(m_b67#r8-{{wrRNEVHWMTS=%R8hzBx-;&QJ)E#|#BFeZG?t3YAo zOIGTKh*)%j>$ELG1B%&)6144E0+V--dy95es>zVQF?4;a-29zQbWk<`>P3e3RZ5h# zJ~B-Udn+ql^gZU&oF?HGF<*Fw+=|2X)_T#`T^I_t;}Q2mu$sTk4kuh(#8-zR!kVbF zcL_R*zk`gnw)3l4%t+{MAozLvw!^yCFh&6ARuH~vWQz9_JiUoQkr+qX2C_6rhXA0L zXm>uK2l||c`q)Sg0%}t-)ZcyWoB<~YIZADnZ39;Kh4@R&3y$1~e-Zu}b0vm0sTD(~ z3)%&qt$km9<+=85jEsCuS0q1E>tPui8q@yeASF<(nu5}t2->D*piz%2X!H1;;gULFK92cpF^%;I2BWLrJLRCi2HcW)Wr+_(9jUCfGu_ zwHI&X-N%Co!;-FQ-j#YOAEQH$6R4YTHa%JDu{)5ABN$!bE%Zc_j>Hti5~(*WY(L7) z;-}Y0?vmQa{p_#^bACX>=NyI6?f|?kdD~IZo|@83m%Wy>#WNyce8}UcO?F=ok2;Je zc@=>`aqP=7e7|y8BR_Y_tB^#g*+CV+VOniOt&M-cGJIIF$~e#U8d?aKFKE_DzT#WI zYljua)riKOmi@~R#xQRP<6t{vv$4%P3QZBedV{qt*f)fc?JY{#5%j8wduKdkU8|24 zxcV;>7^V3FyOix@!uZDHF3K2YUd30A8brsq!6j<>VF_z$s2d1AQy_$R#S!9B*HUa;suZK}Hor+PAypDQavEcd1?xGp|jqr|0NK2HEZcF1q@g07Ahdcf^!58kJ%m#cJwad-g zm@VAaP{9y!kfOMV(%AEzPkY_g*(?L%&KU1o$A&LP1}iOPTbpOlhLy{O;H=2`VsH>k z2xuk$5g+AjskW8vBCT2w(duM3j1qC2mZnH(TkQ~|#lyH)g0f6y%^PFaEEL?Du=^8s z5UP)qi+v7u@mMYOA~;W#Z}^=vfE3877TYeDTq0TA==Fp6)=E3G1OMg9m!nk4#X^8P zj5pIrivQoG99Ycjn(8?b7l10QOIY~|J{NS#Rdy#hvRwq5ScQQ8FcDRGMpp4O%gj+c z+yt^a8g#!Gxu2Z1_oXdST6qqP$$H6}cDt|xrIi?fuOQgKIfwQAT2D-v7s0 zd(zGH{V(blah$unQ4K@ztWa}83brY8ner@lwVH%$zGl?#M068cu&e6Q7|(bs7#c_o zWGA&r#*VUsTtIH(UG6TK_{29ZlR;@;=}2Q==@wFwr~Fx4lF}WAGlg}I#f*w5Gssb3 zIzOg9fECB7eJl21nq1N(Z^b|+x<*Nj@{_Zhx8X}|B+j(vbyMD@qt>OZ%LQNw#%lq= zYFK5zO=}VADkMB7rdB&ugOVO&j7jS<`rwIMyj9ReXOsmfVrkOwK~ z&?fd9TvGB~1b$4!E(o>dS-b~;-+pEXjIvh>Z0HgJh?2JmszR$<*16R!JlxI5h^KBW zAPK~osMHwSN$`5UqhYGgI-6Kdv#;V0lOIn;d5=|jOINXvu42;s9N;BCrltiIyio^u zUxk!ZNF9ee*lNLi3W9P22elFp3P_0v@z~6dP}JQS^26dTUpo^28&%3LtV96Y{|di* zo6wRCQQNrP(CY_6y+A=2N@0fx?{D(-w~&&J>tahq3|>|Bp5R^6Ue#W; zjfmp5EZ3bvx*_v41dYcC(~O=XDz-l`K|@BPV8;z3`a>f5<+Ev-MQf#1~>oWgx<#GV(TQU96Zx z`P1!NlOC#nxEtzY{Q=s)K`c{kUVYAIJ2A*s+z8Ya835tt}Y}m~IlQCbX+?ANf{W9*Z^9hC~i1 zx7%FanXz{}(!EP8Q24s`)ZX_DX5l6u6locKcnG3{Mjy_UNJc}^_=OasysHCCcJX8( zb&X5X#YGO|@yI&HIzI{WQ~iJygrxIm1v|uCZ`tc~P^}bq@zxG>E}=PU6%7?Q$^Y%u z;J2C_KaoVbq4x{cMgfX31g=|h{)@CJ)4XCCYL$tq#|NxkCPj(Z_?%jTovB0|dP+FN z1h^0I^H`t2!BADHt$o|VKf0Ge5TDz=7hqW$E91hIf`H zE~FmMY}Ix?W_4aC3Rzx0E`#kBOD8G~AR$R&vc4sbhos^>y0N-!V+DnzvakNu?KjT0 zz8brjF|ytC`c%$_ZB)=DTX!y}ge?@S=~gT5<(Z$uFwTvw&xg(hz68&>3=$9l0drdi zzz}Qlp14I@o-`9!?ThfhL5B*Tc>qeF0p**-oLz$!G!hP=eTC{tn3?kC$?slbMMroI zz)+5Cq?qL55_E!pR(NVd$J5szN6ic(`tyJ$-X~I+{#CGeFn^h5M3$d<1KkST<8xw% z-p0uL*St2MUhx>47E-*Jo|PMksxBEVWmuD;9&`Ct7}={L&}3QB3OYLZY-0YBiWX#g zR03iy4Us|T8 zx&oopg@OO(g>0||_m&`CU5Ae;;^Uwg?46&Y>BVnjCp_g@o?n0ut^>ONXRkk9ivz3h z0MgBjSM6V+{n;kZMrveXU1Yu!0TQBi5jL|JmBBf9$;7<9M;MM_5@$pN4|`f3^C3xE z;$7(`ZWiV2ruaf0YcIP0I0k`c%r14U(Wg zTj5x=^Tc5-->(|c(MNSXz`~B)Oavv}UoVzO9|^+^jU7Ye*|n+L3Q}#9BR*?>XySGG zVx%@d4({Kb2DWfdT58{9w}gH;vJ3P?c+x`WZ#998(8x%?6%9%V_L0qe9bNKo zCVUpI$DICTSFb<>z%WYfi*w^PAcOI5-)pm1$F%LKkgG+#R**%RMrFFT5qSK;6mr<% zv!8Z}X@4-eXbJWBFc0fv#fT?~?1tAzUe1qa{oeEYhFr~t2S_ghd>7E;3wR~(1Wp5V zMnVf;_v=A>u^Zo#RhoN0AMimU-(@(NOrr~nJ3DJX&tj3w@dMqhVw|&C%~?|s;tuB= zEpjl`Xv5;nqpo4BcnWQXm5!Xh*iLgEhNOH=$Q=)Qh1==K>v=7aTO(xM>m38=an~f6 zAfeaLNkM9$(TeBP1nV{9vBthI5sn^D5K}s`lZYZlq?;jQGrQY#^H0r?x!lu{i6z1? z=EL5NejBsR8zIv(t3PHHc0s2LdD=7=ao0W3@MNAGmttH)RZ(f>dQ>wn{=2w*k8;3ubXx4J&eFt1qv!qyJ8m|wMVA6huYD1%MYBGbQ+C#0KDEH&7Lzn7%V zU$2VJQUSL!YTCKD;Xk5Kz;`S<5BG3yu!$)%Ut?7Zr5yA?-Q++pcPc{x1^^kmFQ1`| z8xZi`recfg7r~Iz2J5{Uvm5Q`*#mODZ8h`(yX_W4bCyDN4H3vXhwz`5Vnd7NE~4xm z!3cwfgodNWu|8|D6U9MDtFp|i(6(;*&&dQ>X6FeAt+uo!lTTKbqDTuW2@64-UVx5* zw~?efGtqwKRx{l0R7p!apGgGq5st(3Cldb5ek3NFP7)CDbSP{|v&%yy`iJHK$o>M{ zNiOe--qTPbccG&xY~dKMqDIqr-rlhY#nbuSF@n@^Dgb^DO4OIIhe@rF)c`2reiiSJ zMA5ig74HdBqchk5H+15~snKsdHF~Ba?d5eRJ0&95|96z$k(-9DNRgVIPS9*}7$TFo z07?6F=s|QxdD8LG-bQ=5yGjjTsy5P_Bzk)h{-=9y1mgqqCtyz$zQNzBiVLTX)e!)@4m|loACy;IbGUsm4KQBQ+rkR&aAUFUe)tS ztN7`KZ61JfT%@CN=RI#N#toc4!?ri@spLBE;UK-?Ri0x)miIbY$?kA42=%(gSh{V% zA@n0-EWL3hA=ADQp6Dd1dDc?1$qvUkBF&@?Pa57$9lYQAf-2G|l>^1Cwfy7KL7M*f zq*1!7L~yeAm$76(o9zM)tzJ#S$dez#f6-);tngL&@RQ(*35gT9vJKGS3C!j7tYtJ@ zH4eBcrb}EN(}Td&$ghs3B*Z`lCA;130)o8*;D0Q`jEPk9zH*TzJNzo@MFfXNg`v9G z>g#aZlu(6k@#*jXg)OjzZ&y=vzKjiFjk2e@i=Thc7I?{^S0pOrvGgM3ZT`Zvo1-A_gC5f&Tx(oo&{MMs0trSC$ zr+7}P5rpWpdpD2_mXO&9fbbsv=b{B( z$Gbmu=v}{pBl$fF@pjfe*1Nullq1gkj|aLkNH>|E6sBlw8ru3a^Siw31$dJ)wddBu z+oua}w_BP(hMYGE;CS;hFBM-T|8X2AHuP0z=+kg0O2#Kwl8`6y=Dn9_!`g)n0M&xr zZ{W^;Wg!e-&IaO)E)mJ7(!XjUZfi9bqtzjem@Zj z31JJBfG)Kmctwm1J(jYI^pZ=2pw;i8$B_f<`YTY*jQTD_IKei0GP1%9Li&%uJ=GVQ z>wL?s;pz-;&CvK}8#14`mv}tX7k*o;iT(!O01o$4k}a_&bY)xQno>Kx8|c*u>U;mj zuBkOgt_j)~c= zeMl)lr=}1X96C)1JOz)ULUJMh-T`l$iCSOA4zspafqe#nJ-K(vOhsoYYBA1v<|dVK z$B`5+(~Z>W)aPFke{2udMo5QkpiXgc8z&{-dKBXSLMs$!TZiq2lQTbZPbOib+mh|O zP}_oWFT8dEeav$!2nyKRA^q&ry3|4ZGBt{*0((Qv;}tQx!%G8QNASN5AG#Y-j#^N) zxgAbr1&j~}J#wYwWOBX+zkNStJCigZOIq4N>CmOWT6t$I?^IXw6K1s9*H}K`g{2pC zZNXC{H!P%D!u3ThRoKQ4LyykB7YSSp31^{N9M6aI5@4eX&pWhVt%3l+iVmDCA_!4t zWglD5Lc+B2n!;WFM8RV^sr7`a??wqBBq99N(UBbbf|CsrsD^7e=nZ~>j!Grk2%V7ia@UQpYC3!*qF>ko&BMS(v(&(yqV$u#)v z8!h&5)`glkGHQPe-DXZ?+1LivxfNuZHVOqWPz zeVEgd^z6>Ye|zM68?-&Zs6liRzD_Wzf$iSd=KwT zi0rH~p*Y{;! zQYW+rkc)7T(TkzA25z8W1Oo-|TA8>gQ(|6_;3rgS_k#-&b^G`*msmZ1PpM|LRvLT} zuao2z{Y!Jj=e?VXe6)=GXSDQ(WEiT9|JbEf22=Qb>@uKG0SuA5o2y+Z)O1W#A(!7V z4T`QSPx|%HROC;o{E^HB__U?GmV^#}JrC9zr=)AOa>tM0)h{AwRS%SQ)jF}%f8x5- z3f*|K-4e@5N;H|&X>5`?Gk?BME_PcqOa>^=M(`xx{2a1LC2V|~P2tOP(%vqCMfF}c z|MRNlUTv^r=;iAx9z-yXNOzl8=r(z4`2}w>#b#?eQCAtubx5?lQTRfXjrHZ>5vAmBiXeF{L+)BPE zXmh(sMx9AV|3Aq??q{PjGHJ0)X88y;WzMQmn+c95%+4^S6LxvC{iwy-o1Mn&n1dO> zvgb!$tLu3S`OSyik+Czgwh5^tnzvCLIXtBkg;u)WCU-!|EO2R;kj6uVM$e*6 zfyULdQ$@sE;CXEZKD5cN{?<$%icsXTuVBCIi@C3PvMwcFm-1)#(|+bXzCA}=ZqR^y zzMw(=gA*DVo!d-Yc#;Z)d?774EhgzI(mb)3E_9MP+jmG8N_Ch@#|SPptDj_Vf>X=F z$V;C_m{37Ls%w4l0=SM-s(8t>GHQH3trKmVvV9-UXg~;d^8mcX;v?EcV zR({~4{LxYrh?RuIpRX%R*O8nnn{}o{jH01!Auu#StLokI!+3=CR&OjhxMB%SbB) z=6gqerwe_V&c~5s_Sj_^0u%>3(g{YKz7~|WM4VxH(+MG9SIwz+^86_axc=6W9}w_z zIH(Uvji-}hA*)7ohF)Aa6wx-%nwOt_%&k$WMNkigy;KW9)sE$B&$gm*_DkF#VlUa; ztG7RN)Z`bUP_)(%fHmB6bh{%EA$?^ND{+zIyKUTnR43~t=|~9PMC89R;1h<3ib=3k z1>1|*7p%spVKPDz{}aXNdUJMD{U z`#T2$2qtcKMAC zvY7eROAnASY`4M(xUZ`jf+RQzk6W1&|H_U(hu_7|X~77;&x6So_30`95(bWy*Cw6` z3A;6;HTL&;PWyEpVLzwsia=eNV|dW>+)lR+{>0r9rqN5KOs2Yf zXR~h$+hkb8`jIWv+LF0iwM7p*j&kXE)Q_r zpk12fC$98ST6D(p^-dIRm_SqQBog@$SDJjmq&jN<%t5-K?7fE~{+>v3^Hqoxd_e(2%=vtdh*KtNz84?#`Uw7dyW4qcsyc=o`biQD{s-JN-Yz7L) z#LzX{sZP03flZt%Yn-gYWOO4BP)zUc$gZ$G-k$8Ts&xv%XS)Nkx>Gd<$2GzSQ&g$` zwlJ;8Xdip`;tiBkRWuojw1fF_aG{YKHir2q8Z7fsujs_)^=w*7wI``p#LI|4zTo6F zd&vaASb3wZ^VzSOZBwItQqRn;Ho$C0PU#`A%??!e5yCV#yVa4!P!W~Rdrq@II6C!* zaXjW>RuHG+{s}*1Z}%~{V0NveG2!DMx;D%uU1a4QfWHY72$D7(LuDr4wLtDg#n3o+ zcjtN=;m&;iSn0$!tl(^z$)9=hV)awA-Jgx)g|A`84u$*QHd1B?#yy_WAuKwP5g*Ka z(xi;0G-7tD2Za0K7r)JHYN2|BaW-Rei495`-wX`eEqP@l%^`Lwq-;vk{?r=ewftUw z{)0BV+%@cn`9M_)Z04Zdp0$$*W-EM5v;NMN(sDbr_Ap27fm0W|CnX^>gQZN$a`UJS zCsKxAs-viTf{5*6mmi4x6;(3@7+i$8p|x2o1TEF*rA8b_^9IVyW@@LvR(`?FgS_Sc zK*KwfhCikf^SL4WLl1Ob9`_jui_QiQ`wy#c z?IpuIMTdG0)p_Effd>CNs}A#6o!%Iy8+fi;ZZ}lWEBqrXu8)QC5lcBP?QW$OLx4k+ zfLB`4_nD1n{K|Ri55e(Tt)#i6R41#iw=*>gDysfv{XpSYd#l{@q{;zu-bjYWWxSR| ze4V&2tGC7<@EQWG==XsZicw^Y&sbsBCS=+{7>Y{U9K<;j2(=mM2ez!TuPwG>M;JVo zB}mXJ8xX^h7~T=8-v5|kF=IDxE-uiu1UZBUY%FfD8!7z8ejFC5xO`}EailF#2{zb) zJ8DCaXv@VS6;~s@lkG6p`h-!IwVtxXLnH?OGW_J_P!)n2ytd>!*f|r>m$Ji{A6vW` zPZUm0sxJg(ctW)6D%B*y^{>qeC+|1ZdgorKJAZw{A-=;&&w&_D-oA$STc}Kc zdSr)46lallq^xLzm9Ij}Xp}(IR|Q*B2bK}Eu14ZIzbtG6Dqz>}RHb5??jo#R$*K&h z*DgTf2p^laGU`9|3Tu7fA;jc$Y5RSu2LU<*IDc5*Pm4vpCgCh~i(b2~Xe4PZ~Q z^wM=~58r#6#GMsZY+IB?nMf-~@F#WscIb8$Y$d*o0$ZP3cYQ!qpk{Dmi^Rj)Pj3In zd^tS7hwkEE3X)!=H&N z5!|-&O~TuHAAijmbT{M>Bvt1~B`*8-JjJm5ki@}xionz47dauhkxB)*tYSTC8+(Ym(PpKAWU#FGkfM z#8;aK)#kq#uc)y0XMsin-7DqLKu3PuYExS{1f``NGwdfZD-H9OMpV`EM+f@Qc=7m8 z^cHF14P5-E&^?26X^Bj3x5}2QM5@_1M5+n3XL|pQoNJYhR!~2aOB=I?=WoU*$dXtI z-hwZ6rJOXZc4+G1V5^=@(SnM-ZzU6PowwL&NU%y0jDU&Y`pD0-_E85v(^W7QJCSG= zLz4eDuNgvBNY>&wyEk=d1LDc#&LiDIDJ`f_mydjk9lQ~Avo6D%_;r%1wzw1JdS4Ol zG=2c;N#;cS%-G*M?UXdSQs5%oOGJ_weQ+fO=!ljRTmmW2r`)=Le30f;>=ld1r`!kN zF^_L|;q5ukV>Q*&aTr>cgEBH&Lq|NKJh=gL4B-gMtz8RqP`F+^Qoixf>^7cEoSENu zveZtRZJ#!Hl#1u!=zJ5&t(N4jLIJpT+G0gn+)7QFDAi#jlI$G@))@~YNTWwdM7YeF z2*{`LhDRZSX1Fp?fEGxfM6jsu7RRCrk(91W03-0p%rWBQH9w#P?M0OC2SLmT8;RIo zGU3<^OYz%37WsrIZ4sLE#`bLhNQ#q2(v@}EIYhz&I z4Cp*dHDfbBRUNdp^}$!-7J=t{vxV^I=;^q*AgR}Y7Qm%#u?KqH!le;qc4GigMg-lj z!h3X5(59&$U<^e)_DKX+YQJvtxxVf_m{7q1x=~mOm~}R#T5SgQS{e=;-Q2n8hu^-A ze-3or#uf_;EkWYd+NtzL$QCkWNFM(J4zD6<=G${(k$P`#zQwg-s9 z`%RqR=77CNgb}(hf^J7Hi`Z&HL-uPdx{Zx0DhwV3*@~DizLag)~eFhS{da zYD>n<2+*5QYC!g(Qmh_Q^JT6}JD6~P{3O!A<7VV=ztX0a@Ot7bz;nTJ+nKe$#r(@N z_~CfIdlU`d#wQm0Xi)lsbp2T$M&RC#jhDKv5rzKHG+Ah#&sK9FgqJ$GPGj3R*8|P( z2FaL{-gl7uJ(Bg!K092VH6^z&0%?=VR=k`>0?(2p@~r=}ouvCmF>s&QZdp=oBr{ZS zh6q3p)JJ>pt~+#due1ffuaO^-uB;Lc_is_;-&-LJ?V%|$6pU`-r7%r-`~!XJqJ1D4 ztU$!xA}xgQ36S@nGCc2RQFTl1!Up4BHb>04jo((Kkb{L4c5vm%PDBy`0`v+yiF`Ni z%L{^Po6CNMd@%Mqd6b>zBvEK(uG)@^%s#~5o|@)dXT>?=|3pLJ}* zoDszV+P3i*>b3`X@5)P#RrSsD9<7*6S5~)KON186q0Q;{)|03bAE|U!o5%<`Hjh&L z5X92g3ufYVt3S;60o{fVS^;Z85OEIU9<-81`+Ikkit<=8$^7Gc?4TeD3BrRe;1=6r z%2{Ur9L1l7z8s)Mm3xEK3C2Sds#Ma#-Vq+y^!v-ZBQ5L<6_3xq`txAW;N#zvo$k_FpoJaT*7-FQr zKCT5cMK}+VsgZTW6*8K@wrcInI7N)5iUw0mO~h$ZtBCv_3F(pG(u=%+aZf&AAcFmK z+@X+BR25uFNYwuYgf9WF!3Hu3?Kh=xK=>* zq00rlRT?*%T^eUKaqWNC39?HL993(O>IkE!Tk*BF z4uej0E$emp+k?95bPukz)NT>2Y}vl6PBmE`X_tH-a%}HFurB@h-oJJxc-BTSM2gw3 zFxn|l2?|7D!+U(ZLpwh0Fw8#`+_ENa#k*rnINPXilAZ>6(Iv#XVG+LI?2H zYMagI#;tsV4DYvUWDO_K#1Lwn_u^^+?%tq~W3aqoc54c;RLZap`7GDS550h zIP0p7duFoCB;6*Z%cSch6iB);EnC7;rYTFxI;AWr>#(O4VTvF@sHPy80>TtgQc#(q z*dQoj5du8Qq>2Re!GM4Pw@K;}P%&j4KsfLB`rR{W@X_~uKcDB1=OfL`+~+>)b*^*H zgBrXm*Mu7B1KI2}m55}sD#xx8mi2xS9BpDq7FW-ialY)c7_MGGUY_?RzW8QGlS$i$ z!llZ^48L0%GvBhH?<3B(&=Pow!j|*S@dP?Fniu;QzIO@ls&;hSbpNMqE7~b?qJ}5j z6+)hx+c)2F6dB#?E^D)Lwv~U{s4iEF`Y$r7_gn#R2EIaF>LLbMW_OO_3k#4-8hP!+ zedBy5svpVLLOXUSYc&~lYHA17m?$OpLUCGLV}cG(6LUh1GyblS`FoS{$%2M)1A&7EyqzN7(vNU6&E))6I`YIyEkErPzIUgFOK9U@ zQ070Kuz0oo;0{7538W58-^{mHkr90m2UcWa6Ef=(kGaX`|0m+F`l4IqmeHp=l}C|I zPR+0Hc}-b-6P-TdIYA$$$$-TvE)dCwh=e08;SLg!o>rdg17~rch(qU+__ypgadrAC zs|ky^m{t`H;X>ye`^2c?$0L&kxR|weM7To*&>s;AdPsqtkV|IJepl;;9Da?u#O47jh~e8bAxYL&P8vF<%s$=XI$uK##Bu8yNCwaD+Mt^&RM|KEfA-NS zvH4tA@tmGxZ!lj$Fn_$=O19v;rgSxTX+gQ$@VFGS>f{OMWBf?!BS5NtbcaK=C{IU< zX7Rf~0zrE;X9r7GF?*F{H9LkKgS;k^hR;HW$U_Qe_AV7asGbnkVJnF35yW+~XJe}W zKNY|{4sca9Qbt%(CpM+qq<%*?_^Hp0aw@cc+T8vwqE(OD2LUbM=!a;<0{nq)@e)fR z+SHPY<-5RBoTvU)(LZ@x1+=w}8`Dbk@zC(2RlsDMF*ST3MDId)&sd@WQzD(`n20HYEwGUuizG&0R-v>yiSpG zLa^B${=ST_CN)E{AA_;KgWdm-uXgvN9zw%brL>^of`s6jlWDu>5*}QW(8iK;2yo+) zUE&(48YA5AGcsIF!t@*XT#L~zxsp^-yTA@3tx;!*MV8}bA^rtY+o#^pPY_WA#?i7$rQVKB2Lfv7Wpr&Loyu2vW)$q#fj__ zDcga}#kEV>lDwmj?Xr|z4ZtPf_&d0uXsn2DiHbkbj>z(tu@Jfx>5!^fe!f;-?Ld^+ zkxQgqd_0>QUybB== zDXY9p8aGd_YXLmAJBo=V(hE{1G7*O$s=DINDt)7~*3Qi{nIPVa+fnPRvb2zSzv+uX zeFUMumEeRDPgUx`4hw!Z88-3`dwhd*Mu>pO z>veA$-Pxu*w|Wvg`NXNxutXYTa>SQ?pU+oy0?$U=r3JK=L8Q6_HbqN}(14bvlxCdQ`Wle8%} zqIP|l#M3F+MUU9SRfy@Wq^*eN%-?4hp<;Y1%w~B{0cDg|1`LH|GWNm=r^B|m|P|Gfu)iL$IgDunj zX(UV(&t%hn6|$xQHmHCBV!2<<*W+FDwT7p9&jKS>KEV6rcnXwQ64>Yato;Q<`xE=X zPD^#?EQPyc*4%!NCT1fKB_g5>OtMJQ?a>JEJ}}&wr&_$)X45mWCfDn52R}kjT}?zs zbr)f$y;c$MR=f&AznxeZe4(d~^}=)4o$xY7ar-G%U_xhlxRLAApT@TeoEFj6ri1R> zAZ+>>u<3K4?%>U+)#c&n3r5c&^wP!Vg4 z^ZfDyup%^TL=R8e`B0BIyi%;m1jWqqBa@YqL4E>8{c!Ln9!6RpV#3ME_tnp zl~(SU|MD6jS%_%gSKj^&R4az&gFs9cyIp-jHDwR!BeQgb{|7xjh=7#;z7vtUji^^h zzaG}Yoi?XgLmrqylDhf@$Y}2(j^FSzK~N;AXtejP`v}z@ULF{Y?hA z9|1EtrVthZmul3fB3Kj@RHfow>Y78zP|t#}bezX6ItT+4`M*Ljv5>cG?4yj=RLHg_ z@Uq^y+D#5#m!gnTrWGowODlI@EQ-~tCO%U=jdoH>P3e6`YNPR(@pe~V(p7*RqrQBt zqcfC{rPt+fZd{5P0#_80QifK!ob&>pcyE=Rj(Qf{(t;JuS`UoktZf>a1NpXbprvSR z$0^l#4{`krQT@hKEF^={(=gjVBI+!HaP9g14(atg;3D zQ6AhpIDiJ8Jjg|mOfTXp4GW^spp4I^zQ|$qs$U2`p>f_4t2qdl93uM;il+@SfNfpg zs$$?csbahL>FMh%Soqk>q8J|zB$YgQNsXpX@H1w&Zx|`Dsv{@K; z{Ww_R=6oTN2#B4t?+7?q32xbM!GT~~ki?iOVa$@#<5X{s1KkG98Bj~?_zsFIrNkD3 znbZM<3oWnJ_Q}QYbSJq{CDjgq7eSk%BkmFYJVBiWWZ;4>r=V12{WiU8Z&1urVJl^e zWvjW;ypY&cLN=`r#~p&PzyYOX2v$Y}|3B6FdQrYMXpmNlJe{0N{2bAf#WERhxW6Mj zDC6U}m~LZA^C}fS-eJ&X+wG98gaPayuEc?Eeg#w_bZh_mtfB^G)nzI`HJ}uyAEZbOXDh?c3my{ zKSNtz-bojG1W{s-`5{qp!eqdyznX34{^8wN3< zK&rBvHP1gl$xS5y&Z4JwjtwyusiT7t2M;q8b2mm+fzvOXD%1sMQ2nDUjPp;d;aH)J zQacE4RbOOWk&(@!2^0=2Yij5q^9#L$fK2SUOKk?E-z3O4{`e`wbv>_=D+ ztQV@Gn*q`@g?>tu-=#g5El8AR1*dBg>3&y9#^1}^vw4yS&8r<+0Mkp^XNd0~AZv5{ znW*?PA^?akxvqu}t65^fysNnLW_yS})5{OJhs;IwWEr`Gu=I9YQDd1V+#N;H%d{JA z@#jb~0$tfQt{i80iW=oy@^Ht(gYwdc|4u3O6CKZ{)V`oc%Lhp0n~_mzih(?<=yLu4 z;}H~Zpi^1XBMk|@U_y&yM|=_50-DrnA9sS;>D6&qDe+kzH*Lu1ON^1Tz~ST03O_lxx@;Xpt5&?Y6UDVKnV45EkTmr8bg~00hrizW&>bMhby}aFoU_2NOSD6nAj#^w`&{U`s|_iDp1WScQ+7s; zwYkiIWil(lg$13va3kov%w~+n8=^$7XEJW%SX?K_>}=ZxgFSgW<=S)&x3 z@2;OtX=?R>N0r#=t*EyMX&nDxVK)6de+0i=c3j;|C~Wej?RqL zv}c6HmP-S8&czS~c>lzmbp*pHYlsE5D#p51zc1Tkr?fi8Iq5W`lGWB4p?lmt8XhWN14gNh-Nsf%5P=nSE11nYad zFAH(X9`+hZRijlG4I~eq)Z~3>%*qM7oCcWmqJnNkiWtX!T;GZ7wb|y!tyH4!wcF&z zDl#IKn}pkC>`-g7)y_%2Nnik40ka8J*X`!Q?NK(P6)oni^Ws;Di@D4si^aw{r1PN6TMDPju0iQVg);?6?{Y&(Yf-qJZ1!hKBz=f;@s;@BoL>&6?;l zM-~rei5|AB*I2~XHhN9l%5t_`0c4WPK1#M^(eGK!4ZC=CS0I4a1H)EPtgzgq!DeL3 zA{syLprU|hFxe==9c#;oWg?WwvVf8N)GU-Kn(c71{K2s8feQE8flcJ8Hi4V7x#W%-+JNq?ZX z59JwMnliSr-KHKKUH@OXEdNnzes$oSxdAwg;}>SVB>%Eer|ZoG`K@Yj09*TMo0z>M zCvi7PrjBFD<1eru7{8(-)u$r0!akeWNj_{Uy6$~nKTN|SkD#_Pg1h0kswB={}Khi3TGu88feJ5;5E_N5RtvXumPkgc|A zhq;yww+t0dP;B5^wfkV2>a;=F0mt_OANsf27lz0a54CT%bg_yEpI5;x)7-#>^iFl1 z|M$E0B(!nNfSP>3O0>$Cft}tE>)Sxu{8TfqlOij;(v;5A_~12HJU&cGUJ6t=xzq0N zv9FNSA8HXLVhR)!L^8z7)bMnF1Jl`G2PpqSbd6b*vyRnuY6nh2=GE3*AQJAzU)quo zg#A2?-nY@=WnnkfqhurMjEMfCg|;&?_ssPuEhoc3lHm_BL2#qWOMe^2!AtRt$moN-sa^8z&rLwJ@>KAFlex~Xo4guLEhGt(V-HbT^52(l%IiC5UA!%F^;DN04BP4 zq&3kE_pfOt&zQ?y7eQN7Y=$qPlQ5PH z>rhlGZ0q~c_d)w55)VS2`%iEO+^?O%FUh(XU(N3oEZ%WBgw=*<@%0WU2hZS#{FUEy zM-TI~vH+@&4{-19+Vy2_qV{6qh%c6Es7@g_^%ko2lWe$)A|7|*pt_|;-~{(3B(s`` zgJ6myyUXwS?U96|KCSI3G7#3l^-#)9MZ0&zUUNaVnPM3inC@853dhpzJ8pWK%&(<} zTAYRgxKE88kf(*z_lcdTS2)|&4BJp2tN86`x5+Yk4oS@}Gic8$8%%b}MV`2o1f8-B zpO9cw+)-8-J;Ev2_$?|vK%;nrnE4d;w2>+VciQj!kw`VqKru3jSC-~;?(*4;43DR) znjyPWCtj);eBa0RU`yN8jBSxT9*%>FSh#tZ5f>DC+(=0MS3YvkIt0ZAdIE2}=p5jF zqYkhHb(ro@DjqEHAk8nf(QO#QoxEk=UWxNVmpFnmNsH)at!=x}&f5^PiP2HlH)7MY zgbg>M69yo63vhezV0tY6pwh~63vO(-isdhc>+N)QD~FhtD50!ih@yt^w*>W-?lZer zKc&Nw&*rt-<2j7>O8Y}7M*bkCQY&vh%nuFf0X>X1ujsetZZO&epLpE+R zKZ2f7ovSo><4UttEB~E?k8Ki4jl#i3@ycB=*b|HXBcAM_T=zO_uwTce)5QbLetd+3 z)4g!eu4vE@@`(cYCw|zzh@$}=!h>bJSP%v7Bjdyng!dtqZ;3QSP*~b8YhWpXJXxE> zBJ$91hp(SsM`h02c9r=n>KVa}ttQlvabAs()HVX)8AhI-Y+m*tePrW+uP8P|*jCDU zG6eWC^GTjf_dt7vj*Cx3Si?`%Cg6ZoWBS;a9qyHXW; z4}Y~sbCRv?b#?_Vajg%}|Fo5w30AS7Y@;>RK^U2!S83QPsUxkU_3o9-A*|v+B<2${E zRHKr_#QYnO+~4eeN6g8$p?K#~49r^25bXP-mrI<_fFeGCqrja`AYp1lRJeL6&LUTy z(^ycAQn`N3dRLvVCqt;PciQdg6f$AXw+IV{Fu`7%(gS?)uGR0+x%F(wYWG=|3YYu= zjdU3VK-YlX3CXLukB>nRd!^WDHIMR=IjDXOQ=ZFMY-2so^pZutd-Y?xF$=+p6DbIl z|7!8t_SR4IpHcGiw)0^^pEafr_I=oGI)AkcFX>$>`OB%!PFyw0lR%6WP-9HQbBbdS zo!+aR@Ig%Dp(}LLhxIr?@XwQ6^GiEXPDkvsQUg5dJOzuv98tcAh+l_o@Bm+jOXGTf z`%$0fc=z%dF&r5_6F)lQXu?Wxv5>lWLp7!9T?CJ#8qlc#RVZkCC_7TvYkPa8?W<8> z9%FGi&J#ipsBo4hc#X{)@BzzAS@iO@bBP#dR`K;DNqY%=8C{}xKA$%cE_;tFOeZkTI%KnZMV&#RoC4qls(q2n=6mZ>%~&fn z$FS`HmT#F&1+>5b`Ic*+*`Atl>G7d+o+}~=`YNUD`FMnNSpKhz z9U*BI53do*H4iYq11JHSKUBE6(K> zSyTc(qzg(?)?;v1uC?IEex;E8KKJFk?U_fQ??Eg<$3}Rpxz>qmLBs&<&9Fl{Dalm% z7dH1)#VqJ@5*L`JS?9eZ%57G|Ig^28hfB>JGo%Q!_ls5oPEhUBxwTF3Lg;6ucnhNb zO|b9w6_U$&URj1So=)KpPaVrsayiu&4%z$+b?#tB-BlJabtDkuyXd218#@4Ch>xTE zM_9*r<^N}SX@4An42Fs{^MMt$xfd90m4bAJtZzVp_xC&p zXnN-WUoP+a*Sytgo5l_@^J9vz;5vHH>}iaJJ^Z+3EHrZPQQqn+ppnHB>{f@7y$zS` zQ^?57UjUWXD@f6U=+rd)BW??d*Lpsf?;h&ompO**rnqhNkdghFzjUHGL857})mc%q zPGpL=H>32j)JxsIE^LI>s!(LO{OvsiJWcUBVB}9e`^)+U=aB2c3ily@YZ>K!%myiY z8qqDv*=so`oum0-QJN6DNVOB}^Xt`lPJoTLbyy8Ak-YeU!Ad&YQnS;gl_md_?fv6S=z{mN)PB z5u>C>mS4g?OPHwY(LAIG9`Pc$m2T`k`;8Y_IB+{0B4Y%mP# zD(;1IM}=HzW%!<2Qb51}X_NmU-_BMU76W7Ro7USQEjnfPmZv)lB$1Pak27qDU5U-| zfju^TK)l*t_K*`Fh493zZHNz|V`4!r(x)bb2U(y&LRoySreT1J-|lBYB`}=a&xzO; z?q`21U4@K7yZ9YE6Lb(rFARW}BA!-U&=dltW=k4EZO~sP3CRdPXyuL2JiM9t$8B{D z&bh>IU!>FbXKYQA-zO>$ERL@Jk^5kN0I-ei?IqK>!U|#D$ z6YnEB(OfA|`WM>FRz;_6NQ@#N31;>|zAZ)2c!Rx;OF_+)C$C0xygWIv3z;o6#tBy} z($UVC{U_K;S27-o;I13-bcdKYW*Q`JCpGfkz-1RIOTLW|p^d1X6IzF0=M~-a&E8nN z<1e@?c1Y>eLA1HW5?Q55$GbZ_fn74XLQB@HBH>cy(l>0fJL-!Q(mJLesopBH-!w=< zi=a5_1oS)VkhirXo)3BZLAy3*N2|E%#2Ax|3(5sG^S$%xF#c(j`i?Bc79&lmZp2^~ zGBcvB2V3o}PQ>(WnxI6SM_a76pH^0OfO296QzA5rXNn`TYsm62TlfMhPnk^uM{awBJPRleGPnIh92BS_m)OSeL3r4l_txBAW@I^iypl z0W^W6@I^4a^IEjBngV*EHWa**L|Awue&_X7k=`eI-3G@QSd#WJ;e__m2FEQN4$ZWQ zo6gY$@j9@XveoiivcRfokxuC z3qd5<f}2{lOK`@s?gv{-#N$;U4c?OPc_ETU7~sxjx~|{1VUX}++oCz##d-XmAddO^uAJ8i{k>X2@tw$3gCR+zwk#LU*&%d~w7^iw zF13eOiGIlui7WNokEc23=7?1E(}8E=xS(v0?b8fZ*c;f3k#MU4H%xl(8)(ncGF*;a z;9Gk!{tnh+<`lgG8%aQM)e~%E4w9x+tdwFMHr;K6_{L5)=Ij&q$m(ZfT&%8Yu>dJh z_}@Z2TnsP5OHTW;n$9Ibd!YqL%Ed4}q}zDzs`cO4L5=nbt5a*q5g)PZ@Ee|C4Ywnt zFDQk6(WCJr9k&XUpNW&s4akyyY9%o%k2cFQ_cQPZo()>K8UxHL#wDI}TixOtsk>;N!BmjaPWCrg$WvKg~DxqiNsrb!Ei5xvksg#q8&4 z-%bj%M{UurGYheeRu#7yVRhZJz7hTg+>Xy9X>w@m2kDX>ydxr20^O^$k7#EUz}HWL z>v*i$?xw;J;KbgKTjp;3MgTETuU)>1*Vyga7@_jQQHi+u@3enxI82M}RJAH8Da|YU z&2F`_N*P6kHY@Cd=I{o&6$1||<%_iVR#HFVNLjkECQTQ%%&v*SclU*AtbyJq%9zBB zwo^=fU=I(7^W3N0g=MsOfmq^oWU~p+%#_q{+T|_Yn~z`Nu)Kfp=9`MGtW~2?8Rd-d z3?#(BgX@sd`J z>68A*D|sUB^#eh1!`=K0xAZ_#ArkMFKq<;?!$=Go7_O4^PU9Iw zZ(Iwu_<^lV+Rt(vs&VDOsd&{~OfPj}l7a~Uc0b-F=MmD7l1d_QGbow78(nV^iI0ls z_&zcgaysqT%HnW}#I0TQ`I)*=eN8>>De#zj{_LB~VE6Kx+4HT!*9BwVI1b~S9rqE6 zU(-IHA2sz!ND*erzoR8jYwY{oI_$NY2JdhVW1SD^{r9A@Q#b$YE>&k~>(`U?dRMBq zW^Fai*H~9n8pIqT(|E8`6HZ!_Qs~lj27QqiB+R2p?LZLh$wY=nV$u#1vi+LfntNN9 zA$93QU@riJZb%6Fxi!{IKlDS(ssvA}3TGO6v-2UeRny=?>4E+v4X({NkyUn6+?zE} z20X8*NfqI>j=9TbhzHiGc^KeMu@BX$x39UTSk`VD=39wx&>rPYMB2Jj{ebEs;c$0*=}!P;D$mDXr0oy) zQBW=k6K_iL#S3o`-9fi_`ng;#FFgGZwg#X2(lY+_S>Cju`3+X@I5zZxGUK&&Qh#X`$X$# zbFP$bWiG z#j&$CNKxWNZ&iUHhjgj$N+Rxd@?6oAWNG^*?H9C@oGWU;XJ^OYTcj-^`vG^aMV{pj zNk>--O0Ey%@`|TMpb7M0Zo@EdimHHDR0{yq8dX_Plqcv`0h{2Ts`K(q{WOTA>xfOF9h%`0?;@+ zn(a}&lu+$k&5xhvGsHr;$K3~F3sCFh?V^}h6#5J+Jb2=#8QV8)KWcMEcVG)&j`UWc zeFbUlV6Djj<$5=njQB10%LTg2b!-X~xUa8tRwK>%9x7}Gvh2PZ)iO$(S+f~VECI#3u_8(ExE0z0s?t2e+AA342 zbM2{7Vd!;Ja8-#qymts!bu2O(>~~^g!%MXt*UkUf?y1-hF@P^g2mt`)mm3D3g zj+;2wjAm(dR3^>4aF9;JfK#qNQkfr9OaiX;B$nX2l?0GFjL8BP;TeRT(u=2fxXJ6q z^Ly?Y_GIQmRYngl{7@Uo4sG%nQ>&n$Y9ATr1iV49HuTCRgs+U^UhaN)9Knj{As2=_ zo7dYun5B&B!jZcU*8gyF4txi-(=~xgmbvmY#pPQk7L#Pkb2l`jqd90$Q<3lJ}U7KRqbW1FXPUS6WwGhIv0;tvOwMkFU&dxEH<)*ju%xbN8rE zCCd+^Vs8Jr3sE`;ww>cY?!5XKwhs!nWY8w7!DmZR6c{fqU#|CclCA@uJS0-`Y74hm zIr-y>F`p|vHO8t`_Oew;J0zthe$YTMMtp5K3bs$|S6Qu`|5L^#O1D!fM+<>JCiHza zm3XyqQ!F$vZEytuxzyDi7X?< zv++$Bk(I4iDL#J3H=jn`D8-*ry>T{|<@s-tP6B5%jK+JR|J!koby+NTxmuS$;?e4n>nhG)yX$uGwr(+q!Pv4lQuV2CGrtKjSB@AwgZ?!4pVk zUaWz-e-}f7>*>NM#I&1$XW_@V@V77eU27$YK0H9l4i#CK18$vGWg{~v>V#7K10-Ft zIYo{d&6#N%`sf-tlX}6s-M3SNV=RB{Rl+zSqjfpsGMH7nEgZz}32b-0ul+a=`k-r? z`!|Pe?s^_)`@>W_Rkij^yPccDig!gjr$~J$63{9CyGN^wD}Ctam{c3EbQ`wzp1HeZ zS|#VMNu8%cbT|>}2oqZI-eI^)lSn1|bs4sBf#Kr!v`&hc@&S)_B*StM#HKz4V$;k7 zL9-Je{`FU%jXI)x)NQiY9rJn=j-PZ*8w3M4Em26g33Eha4}nJ87t-N(V)`rF-*#0mCq#}90B)PinBqE@hR%Y^PY7b?Dp3Eh(&>!~AYhh9`e zpq9|DXx>V3TJ0G0|;8uA%Z!ZjcVDs@<&_SR;qY+ z)yUg9vAFk)YVBIxTE2aX1>#7>Hq;fsj2^2Dw@}Vn(+u=~qN#Mha96r?#emYKo4hvH z#@0B72gTJy{-zQ+4F|&MM-2mP!5w|XKxy@Wu74kl>uyDP?kp$|{wit_MqpelOFmcO zAk=Cuw-NjsSPN~XIHxSCH+L6y%8!kbu7^%LsP^SGVQp;K(+S8*YT&=U<|ZWy#+SB7 z`d}nD+j}CeGnkUlC9r^fysTRN;#@CJx8CZ8v*H80l`<+!-f}3IRt}*8i| zBqSnraYFX&kbEa!ifj5ga2gi$O`KE6E(+N>T-}8(nW_t{YPVWQVrgUjs&_SWHd78h zmwxaU?HF`zUPmJN$au&eruy?wrc>C>R+BQ#fE15rPS(0FN796WcQ}wpAkU$bwRr~W ze0Emws$~`4Rm?+!dmYJ{58h{nANc@!^{>qt{82Ko`hg-jK@eB>kn;4yOD5I~>!{YrKZ!Nig< z57QP(%NgwRe!jo2gK#vj4m>l4fF5#n7G&-)^vO=7^+NB1ZWt7TPiSPgzF(;c{oLnW zrrTUN-biXvRu@vyeW@K=gBZzkFJ$(GcJcd~(msOepM8FcdVIhirVS@-6j5P^Ks9z;V~h_}h5pYy+^; zPTn!6u#rah2<{`)ZwIXbZRuth-F8o_8oUv`PbOg9v{y&9WTk`;iYQ_41{>E`HdA}Q zs9o7lqdH5-*gGM_;6J!De~le}VXa7iA}9v@ud{P*Le`lC5Cz}vP6zhsbl``99bn3L z1IO@h-{cLe*sG%R)DP?+R&)tfptrN|$JrsvXYHq+<97rZ8jT_$jH`i|UuaCTZ@?zC z@*(Az)2#Tg-Fu=GOziyZfPJse>B3Rs0&N_n0v(Tc%OJ1wa_Y8TZ%-DuKvP{$h!+v_ zxqj8dMs)IIg3Lmk5iCkn~T2gPi<{f-B3vmaa? z4BdrL;sT*|D%8kXYQwj9K;oija-G&WkmZN|q$@CgZNR?Z;J4c1G`LMn{3l@LN?r#! zCg#8Zk$?L}G_k-4T5%ig^*Z#c)aIw?4A{|GLX?%wuyLoEjEMyC;zizhdJaP`Uv zPg(lh01eX#_H9fd-DdZ;wo@*VI<7&PIJfa@tYJ4hwUN9DT0ZzHa)aXsH@;c=mzLp-V74hPXUrmulJoXpcRps@qkbIOBOa|bbbJ&O0C z9sNY1tD#%j345Ud_5a`pcKBtXCh8n!p=A+^iFJ5(pPV6D_MjYph5f-T%Z4rmSoq+U zWW*+~G!dw$tlZp6@Th?6MI}G3^$?!(*z66`1ZondM^J{}!hT8GNOQ|Nbm6H_>q4Ec z$EL&HOoyV8VX47>ALg6mRF-ce{zkY?9mw}sm>up$O*2jOaMtUG7Vxqttn=qwFLVM8 z5ZGuCZ$iIr4B3lfKazMRb=@ME{df zw5c-X@mxf-K1OX+rp%ad?30w@f42v!p=ExDnsNniZY0jPo?0Lq zBs^5n(xb2<=1brBdkR%f2 z*Ia5lAJ6Wt0X)cWx?RP=>VGQ^ZW~rV3Y#v?^Ytf6&5lQ!KWpP72N3yZ(audN+n|+0 z>cT9;jN+~g)}#h<7A=iK>d?}>+uRNcKmRWX@g#(}+O1Hn3Tu9E94Vpb_bq(#CbE<{$`X!%I7N;y;<4}byX$TGmFWcQ{1ZKbVPybw(Js#6-2fkO6n1CP{)kgOt}#`_F&!PmOBVyaW?w@@i`yfE%MY z&wk6`onY!AeJp)WT^!-)NQRv@a`aaMPFAp~ZLr zy{gkP8jW=-v}~;DMZ~YdGi5=S9PJF{sVJIWsz=j7r`qAoSe|PJ1d}|Bw_h(>#hRlu z`E`kX&=x}HPibL~IZygxtYBSN*zET~UCVVn_j}Gc?T;G8K`LFhTcvk`1vCsVVj}(N zNCy3T+x{otlIR2^J1N3q7m8w=lkhrnNGYmRGd(btPF)p?97skN;8jgU0md^&n)mk% zaF=kJB!#>@Q4u|FAlayNT)o+LaHH+kq|G@GXY6_eb(*ryDe6LhwXffk)A6K$EnWqF zIz{8eIFgt~6Cpk1tvf5lDPS-KK8=@f{EslXP|^j-@hNNYW$DX}u!Wkx<;u0D|Nmq~Wsd~J{t%G`)+FxarV z2rt~mrR{ARJn4=)o5wt5h!>vaP{R^38TaUW*>sdH<{|d3zk0|=d7D5}12?_Qn!@~Z zp5BpT682r6%VxqJJ-m?4985U^XlnsBu=VG()+jJw*9tvC)7J7E@DVCV96j@3tp$6v zi5me*`IhkRwHC~|i7ExhhjMmczwJ|uH~WpQ-*iJ5NeZ>q&MZzOopveT34^Excq)$K z1v}L7uEfkK-2`c-vW3{wz}9XtX6n)33j525g>$iCJKasi;lmD!TIf|wxQ(R0#Li!{ z4hXk<*QTs?bXARKKdm(F$szz?67w7AB!%)6?jNxFp}~@M9#j)c_#v-qX-$(&rob&5 zQkhm?Z;gdA?T~f>T%{$yd-545Gq#5NMMABZU=mqi^n#%ds!pX$nKgibw7Es6MxyeH z|IlH8@#ItOnk&x825m`emUOha1w5y^7bt5ZaW_Wk?hZUo+T4P!qAYYUR-i3Pe=(RP zJ=jY~>T-tCx5Zg|NS)?RT*uYyq^5t7v+J_Ws7o8<&?tGB7hSaMHjE@0YS*}Af7&YA zC6SQsT(bfVX*Vn&+yu~>hxjW5_h^BC*6niOVwtcwX63Y3$$X2(EZ0{jK{?w_oX11*g* ze+@L$pSc^@hsw+}I2g1y`p`EqqJMFv2OFP?_S?oQ0#Al)Xv61A8&^gvN(IbaP~P1q}CZ81F7+|m?CNd zKg?!8FNDgJr4Ynd*Z6kE>=q^s^g244@os=?wKydQuGQGyjkcu;Z%65L3whq<=+SzF z)nNyA0*?v1m}Flr#Io+O^A|Q_Oo0HxKi1Y-T?Mt&_NqgZLaga4IB;Ebadr7k&2~g< zBWcNK%WgG-5SJ^Y4M}(8oS!;Ze*H4Uv5+6{rNW#_rJ@RIR_xEYy0zR-=S3$+EfHX& z{7O>c7*4%GQe5y#-e%^B(r@5o2y@p8`59l#{aiNu74;d)z=l6NNj|Qdz>;x$F*l(DBuQ=_b(zbCQLL{uxQ!8V+~?t$-s-cRuE~Yz z+55c+E!h9M@SP(Fskz9=F0Gnq3!AN)jC>>=@^tC|ZAz`t-SNYU8g)6Q2U_1Er2qdo z?qvm4A_HJ^!faP)z5vA#m=?D*tjN6!s9i3<4JOTmwV$r0Uv9fm38V8$69w2dBy?qW_>%@;L8eGtai^5B{xPe``HiRfc!)~vzaO;atr#uN$sJOP>v@I;ILDfUMPJ92nWk0gcYJR8@^fWK1Zpg1|Xa2^Mu)gA+MFIgi! z0w@-i@_gng`$@6|r}r+f0$#kIhni~#p*_4MF2jX-z;qse{Z$T|fLCl3WLQR&i{R$x zTaYOCp^fh|KPy*!v`*Q&^5Tv=US7p7r-k~Kl~kdW_$W;bQi)kl5>mlCQ-!(r z5c8hPolPAt35d*jpkh3kbC*|TyCo7?hWf}MgSj5X`4c-cITykFv5u(MC9+_%*ZF$<_xrCf+vFuC4)cm{5Oy2rj9IWTg0Yy+hYy3fL13f;2fGyhB~=A zp&V#s928b-AJb8uV-n$8n9Uh7YZT+1BqGpef$kQqbsKP)jRJgE@nrKOH_>&CEoUJ? zwHvUkbhfk)Kk1&f|71)Fo88D>1>zWkMScQCg`J8#HzCT8-!|Q<11u>*^049H~G~}HS;#uuE8iyu_TltbP zmm>}*Zf#d{$}Jc-e^Nf5ImWD`qT4-WZ8?Q5ERXhs7rGW`O74v&n~nI*ZaMS!51)yy?AB3_?@bXC-kL;Nv8&lk=cE z3vn3xc^zY>2(!53I_lHN>$|ulyTO@~J?&j@0~8v)L~8C*@1{(m9r$54n}a9)l!w6v+a8>A#8p~zm`f=bm(G27*85= z(O^G$3XI_ncgDM;;7!QI`9K}h#hvi~mFzC}`iaer=pc*h7@lp@u=Bnk*^KT~FVrwx z%=r{htN$T$5b4O7jN2KJa@(wSYPi<1XWSqhzlsq!MBpt`2kBJ8Ei%398&^02g-A#3 ztR61_Ro^AeYg$i?6C@OXuUnbuB-gK~PNBCKX9}sx$;jYPof5ksrwyW!waOiP;vTj4 z2?d-Iv1`I&(s#5-BaT~))$C4axXAVn+vg%l4Fw_wKQxlVB!dZ1C-`j&F?Uli(mpF` zvj@Mx=la2GR-j5qK>UftbQp!!94?2-4zFu%9ZPDOU>A|=;?KQgS8497Ebeqpc5o{m zf%hkvMyDLhK+(Q{gSiW;1Rt+WEZ^gsU$cr~Uid{hLL^Es-qMuLK1F5h@I$KFkS)zc z*ZX#gP?$_46QO&XNv>0^I@FpFM7h99>xii<@>TRN2B_5KKJ$?{Pj^jA`!62S!X1QO z0)a>P_KbtTi6@j~8E9L2t*@<2|G8?uZL6et1}@5!;+JZbVZ76I?PmgX z5F=J{58dz!2vxA7h@!DUZzO-Kc!!Vin-41$pUg%!*|_z#e$1&8*hc5*4=V6Ad zVgM<8HdkYdGE{M8n&6*;1Rfx^ozJhz*;g`tc9g9IP>3Uk=Toi8ub;oI#NIgozkU3q ze+Ewq09WwkA!{2U>CiB4m@z>zTS4O9$r*vX@8x+b<#{To^E_p_jE((qZ#4vX+2%f* z7MBRMS=3Q4PIN z%h;Y$bpQIYd$kp!*3PW4vH&QUV6EkdP1duzKdqW*vYTS4fLc)~1?;ZTv)x|(#9(sH zg4xiZo!%>~x6M`F&W0wr8ecYKRh!qa;)(lxOB-3`H;govt2uGWt~!9!7}>AGzkHSd zDyUZSO2N*t_CtKwTPUx9w2G%Wi~I@OimbyMJ{(6VQLDri;Lhb}gl@8W0~!C)DpWFH zV6l&BA%L{LMf-huVRzVc(zOu%OnI6HH+nnY$8T`Enx%m=C)m^KKjnBy;K^&f!`)3< z*8J6C{xXyP>!+4AS6W9Ob)E~)6TJxJ3TetjqI>Z_>R$f8ODt=L$;2<>-ugXw>uK7YGf3ew9Z# zTyG{zPj%XQguJr!nQxp%>4UJl z+A>IhF@kmr_NYJLx!iJoMP6X>q!i&oJ2GZ%F*|5!<9brLNKe$tg#2Af82&QULqk2h4YTjU)AW-MxNg?avN zo}ce}l)WG-htgiZR#zP-M^*n7?gT8Zw+^?uc_t#?Mwa6C$dv}7FFib;48MzL!hUE0 zePUDz=sQW`ppx_gad7lnp`&nWN=e5t$7OTm_NenB)k=p$6$&Q{@YUOn$^*tnauP~` zTRKD(Q##TEXKoBLAyI1IZ;*ffobuZdEaDqZKajMT#_!QH3fd3BuyVq%K7&uqB}O#_ z@l28j!e~aw^(mn9Xh~y#pH0c*Y9Rf@rwXy((VCqoIJgNt!0f6iAou(o)ObSF;6#Z&piS*(Wc%2(7~ksocRT_ga# zHcYA}j>I`BacexfV@r|lC?=k!Pfu1PtHqDn9ptYi05DTULagh6wGy^(?$Bmx0+1{T z%v`7ygF!hQbZ?KZ*VyQ6B{3^?takeroFu3IVh^Z-R!`aIRcA<{`ymFCSjNaF!_Jb2OmUF@xMka;rdB#iUV1 zD2cFlt*?`(-3x}u;c?rB5URY*Ct^A*()evK2T0DKO>gH`LE{obEpc!uw>~%D+n=(& z80p(uvq;P)Ymw|czQ08?rJvsweH=0LLw?%HBbLcIJ-I@mdQZa0Dz#&sDeaE0J&4N? zIZMRwGG7Nti0;~SwTU+dTux#aPxIp)n73ra?MvH=4K5a%_i!3f35JT;msg>2ok9`r zb;H{GF0rzuPFheT?{rA;9mr{q5i32L@8?2l*N#VSI+sNEj3pQ~o_Wp?v0<5Wx@SsU z69`qOqtDuWd4-O(JPz8DK&0zEsd;e1e|5s7_~nuvT*r+0pAZy`GU}+MB6r=LTYZ-5 z6#7oqgoI{UTMILIs-cd6U^&tY=KTqCB0XkjUh3<{h}3$)xy`7qLv40ryAQu{ntdZ< ze@^$;S$ovp&)emBa^;=Col6=>x)h1XfaQt5mqZT>14ud`J0oVnsIU_f12m8or-fpm zoe$ruO>lXCp;_;<#QCJX?!YR3C=SPk4%2 zps?u_x4RE9@t`p6>m~IDr!qiC(3c`(Su-qeF?z1@pBl(&Y{LBq{K)%WF@Y}l#J=Fc zbS2bHbF)~+?LsQYYf@h;X?N3i&GJ#c*w1}^xSvn2^{ntYW)>>obrSASA>G2;qm!`3 zBFP^4Ac4Q`TGwxp+lN-tXkQq;jd#3qoHqX88zUG~xih@0#K@Lft#ek_3xfA9GczCC zH7YFqkulpDg+MIVnuDi93E5mJ(mUuQcZ}h4fDnhVV_rdxv9^LzG1i8XMMj%2#ZJ|_ zSa@gsfXdAMCRi^HyUlJ;zhP{%L7_{URi}~oA4svjCQ&}X_`RrEOxj|5Ge+#hb?fP#x`7@$Yym=o(XQn;(pBu@X;$B+dl@{bg}ZN*nF!Q4!J=MR4nI zP~S(60eyKGB?lYnp^zxR6u0pt=Z)BRVNdo8<~obSIpj4)W0Qog$8+IcQ?gbNCV?x_Fyiaz{@V-uT`bzP;QHGi^%gDv7X)rDlDZr~w9-0RJG-G^3E zG{zLv>EmgF>h*0&MG=S8&ulruyA90_340#MB@xgUNg(&tjVUc?Rv9+AgK3CLZs^)8 zS|N5UFkw_fK@KHm1QdjN4bM#LSarMPjEFAzG3D%B%GqFHPPxy1=@}}ieFOoGLA#KT zN|W&w_5GR>B&_QfU1b~D^eFk@z=oZ{1|WF36zN4<*=Q#@GmGo{xGj5BO) z5$YQ7R;^*3ZWE?2Cx%QgtEnI@!-N1B3GeI@$zVdxKJQDSrlA{b{MvSYdcY08O=tLR z#tVM?M+onQcEK1co_lDKg+9x7N=UmaftZDL5*oX6wlE_UbzD1T$w#mO%IzyT+d)(# ziTW24mN7-g$$%qnYIh|$S*d(nm<(Uh(d<$-<@R(y3|J%ay(L4v1@UpK(Y2F1g`|qv z<+Vy*60;!fRjcNzcuvUi??GuvMh{CtD2Zb@FqRpQH7UGNGy(W~^7^6wY^eHd^ZS znyc86Nv^@WT}Uy(mI|+;soQS#cQcNI(jmaVY0W5BFv)_Ou3Q_FeUd=C!$cb5y{Z$w zMmg~kB@5fNEnv|b6_crAdch1nfmJe2Nx?CT)*OIm9O_THs;!50O+6UJAy(P{W@uL%QXm{pBSL+@%#DDv}+nsqd0>K@5wcR71Mx3MnN0Wp&qi1AT)#_M~>w$~_2L{Pc zUCqBjJqw`HyuH$nf_sqBmwR~2V^1Z1y~F0F?4DNJS54(Aermi(P$tcAzWf*h|8%)2 zZYAQ&&6bYX)+&P<)8RURa^>4RNhHI%l=x{sRawo#2Fm^e0#p+B3KtVgWw_1=;3hqss)(B}vK_sgSY77~G+Q zSuue8G~Qo>PK&Ry$sr5fYLh_eWNl7L@hDG7W;zi*Ous@70%dh zv$qlprCvkEJ1quI8jXTilpY))Keb z30vE(6=-*QOWaxYHomOG7U{%D+|nnj;iQ?Q2GdKixSRo8As`^^4Zzop!^9 zxJ~4@Q|=8|iC{_K>)x8(h(37c@xQh9YdiS93SWHbY7iQp?f`yMm8(<2S<2lS+8r?$ z>*Y;aJ3wkGZF;NySh0Q^p(Gk}3AvRk)K9XV3K(I>CkQw`!9{Q6t5P_)qs3f#rxmT3 z+Ey5IN<=MEoOLhelanJM_5t+goU{EJRax*V>+TpkB!Tt>A{Cl>JKh#H+L29U8msXsee`R? zxzuUc^RS!xIZxlACGf6R$>AqU`bO+*l8e2_5}8(mgOyDviZcfrvAGa2Q5c6N#uSEJ ziM#mYd}kUY=Q(n@{mHi8Sx%EQijO4)QZwuEXW0(A1WI?vb;`3~BIE5h4ih=4m9H*& z9c?WOHK>(!iJekopK0QK2n$#Mi*;K;7WVxdigOg-pzv{vho(*rdQ2H8`B}ncDQVM*v2K%)*EadHQoKF z%c`iZKu$j)enio~RD;+1 z%3E{{LFAaXYc8@va@k-rvnc%s1t)9Y;b0cQhG+~w(k7Bn4!#Qam`-0?!9^VI`deiY z^WW-I_bTjSkZ2WCYV~UGZ>As&*%fue*z%2(wN&(f8%9sMTB!3sz~h&~ZlnL1b1V2~ z6Cm%cv)bl37(9ebD_n>Zw=%LAFcwM zS#KQZeIkntYf^&D?tKg{&OB?W0FE(#r7ayISGymM01i{|Dm@@kU~98|EXF`7A|o9Y z_{1;9Mdhub)`N{k>?WLgQeb5&(#0d<-xewDQ+D=<;xf)m(#P$>3%_M+`YUZ~yXH z$5!6NO^P3v@(J5o-10{ra1rlwR@x59*^-pYcmH6IrCb0RUrmL%*~tElG0-qyZTum|F=(8I;`IeKdq1mM-E;ym-8 zrw&%&rLR4I5O3kM3fnP56M<^~eucqtxFl_o$F$rq>J_e8u)5R0G8*;PU~afD2L z3Zs4=h4NBXX7GwWhklOdc!b-G%0#QnQ4VxDN|~coFoaf4?o~0|+~re_0*bafZ}mR& zH`-TQilxF4d{j9@e`2KUiI7x?-YnSx)Mq>pEsdLaA9y~fZSl{mREPrjJ);aJs^H7t z6E^B5l05V)f58O@=rl6;qzx6TC>2g|jYE|R^JMBRoA5D1-Z31ur?MExD$iAQrV3&A zF1b{CUO%wlW(WwuNSFG>$7tmKmH-_Kd6_FIrA8O~RLOj=D;8Fh-Tf*7jt;FizpJb! z&=W(SSS#oDE?};~w(zi%Sp%E0&{!+kd~bBKS`XxP(DULP9?kZEbdCe$2t?8RTbLh0 zAzl)389|m==ZIZOKvib}vqMzljA~PR#?pxBEbXs;JHM8}s&|qd zg=@$EG=CCC(W4N8z(gWr*3=m*)0LeZ7zH6CFZF;%*jD`HwqViM93 zl%OrxP63MdO=E6}YHHe^bIL5)(~S-R zi&fjVyX}YSu(Nx0Bx-vmmE;`c2whJyB1SHfAw{T;%Kz*~keWtEXD5cIZDRX~{dNdd zOwtuf(w!4AJ>Cq$QZW@FAyBR4>dfn{9Ec3insw-Nogcay3Gq?j)+>FUhzeB_aG`2t zWVDJvbR!<~yBLZ9*^l&GCFtwOy4~mo<`-r#ax` zyfx;#$vsX~uIEsRYYOUOWv~lIVToe07j%6uG=?p!Zo&7f87WM{Nn})G&e<^^NMau? z>9eLv`#Bo(427(g^c^pTdzn{8u2F>_bu;Z_7tlq}6`ML_yU{k*i;%V;6J&Uvk5>WW zm2L$t@RKV7k|`3BD~%H zNFUU>out+nlQmDJ43ZNLOEi{;wUpi#CWXWL+Vpq{UZI+{uJSI02#>WvuHbRSJqpOtjk z@$mj#s`n((dLID}fsX15)jock2vdg*AXDu8(kzS}{+BNnH_+Y=hd@2RCOx6nn~cZi zYqOdp3e11W{+gsLbB5v&Hnx zRZ(`ho4og`;=}T8ed|>SKo9#3`f-`P?@LHnnXDKPxPX68R(su5P1aQ$e~-W64vD z+vQcN8W2;umm=;RlFWcTLHe=|Kma}b6a__Y0!CIrXy+Lam?KTN*jkdMHHR_e~`+T2wCV*{!|J_^3JMVj*^PKZN-?Kfc zl*C#6c2Cd|#pilAW(M$PcqzxT-b{SLAFWQL*gzxeXNp81i%bRXt=w|La+e(J`MS;M=g|&>?I_+V=X>xbd9*$DA%W%kzqgv=MFV-SwK!2hNKV2OA`k01Rk zz=OzAwPo?b0sFio2{qEF&bQyfFGX^!U;_fFs!?-mCDlL2zzG63G`viI@~49FP5=PT_U$)b%IhPt(*6^Te=C>ypEE=)W-poa@xY3LRyjLV#v4hp zwQT!~OKDuglK;KlrsC>8gJDxFuR>kL@Z}oe_Z1I69u#Zhrz(87;{BzP;~hA1DmfOn zm+ng|%Mz~8W$Dhu8cta zy@=-fifF!!xYsMB>ExHDW>nBN3pK$aApA=B!~_L4E}#*SbYP9mOyDUZYVs*+Cer_W zDACB(`xOJuh`v4uqS{e~Gj>xPjAh|WM~IEQeGu7Q^5*m9NAYL%POmFCf?9i1`(6rG z@gm$aO1I z{`dzvf+bP=ZditZzp2aE2OZV`YAnDGJi_r{1e}}*me$&oI#eJY!44>2h@58c#G#&T zSybteI(uGX+FKgh7-xezsp+MQ2x~;TVr}7`2d8Cw-Gr%oTpC=P4vUCfSHv;g1za53 ze&}XCivk)kDe(9Q;^DLcHRn)TxKG{+tloB8*=vX6P#*PSz#X6n&27ne?U*AevqmT< zY+Zw9U~-BhUKJmUp9+SazE@+%fEh0Nc=FxSqVMzd`}Fc9o{7AtQN{e_HY(y6g=V7s zPwc*4`@gJh(K?CkYyhNy&D$p7l1L$X4EbY6C9J#M>aXKe##QmPu&2(-@xZ zx4nn2?6_E-#&=wF7+q$!%APGM_>f{ZSL0frrY4l4`dj2bPz)Csqu1AaVa=TlrfwZX zS(t!?$JZ+TKgpqzE;}Mf`sp2-r$O-Z@xGBzL}?$wL_g8k)L#3pm-R_23Uq~@$GO_Z zL+dOf(UeOx{vE-r+GHZF5cQ0Yo&@I>WIfKbfoxu5Txofj`-~YYd7Eb!1RuZs?iU~< zmsLTCJp+0pU3*-2Zdm5NW*o%_f3tRABRHL6cSMVt& z>l1D>`FT4x8|tvYa`h5h_S9gds1|L{J`vyH_YyZeX_R2s0e7hM_ed_wd2WoalgACt z&E3=(ia3DUrX;iTa~uo%E!h}H^C>ZT6L$6or{Ea;HBdkk(y3jolzW>MPJq2XX=onY zAjs?2x-$_(@qMJD9CJ387kmv~+P}lc%k3-gMn7P-Hv@BTr)+GqxN1G6?Ou%gC!f^= zadi{4ji}njJ6@KzTB3MG{idxkcsEQA-B^%F&mvZsmS!X*Lh5t-OU9OF?GrV0L8o`3 zEm7etp`xi;3_k+*;>|f$(xNE8n7DbJPxN9CFTwC*>x;HV$hMwGXuSSQ|(bh#2zN{4RqG05r{+)LIN_*r@t_oaar<`MTpZz)6VpEo5uUlXy zH+yR0CKgdMWc#^9R!xT2i}eX{?wgcWhq|HFP#F}UN*d!2ZeGvDwbF=97%;m`Tx1iZ zdde!3X}us)xsM>O0&2}89Qh-a4z12=u<^HC5BF>KSd1uF-Wk1F$2*RIDkoQ(YDGxP zhwPtql^B}MAhg3Mduh~e*X@y?U1v632onR&JVz^P!Dj@#cvmW;goBS9-yphKy`?e6(7ums$YFQ9C z=_L7y1#zFxt-{Syu56VN49H-r+hxuV6kql#X|&V89;aBe#zt2r`OJVS!!K4PU$NDf z^2dxKu);x1vP}gH7WDE>lK?R(H$&ui>hznaOM&)cIJz($YE3z|Cq?Ym#$WA^qLm%6l^=P)Ga8Ns!^MX7D6c40w5AT7a_sTvpmTqV)wX{jXTEn`Ar|9SRX+bo zCSyiF;m4xkx@UNM-e#LcG78J{!0eC2Pv3V73EW^lMQn5AYNHt|SNk=V)r&YP)j@rs zQs#skrRy7Ie_XIpD~@+@1E4jiO#g%P(cBVTgm7^iLK;Y&Gd7|@U43?YQj;0ojEv)=ayfGqP?a(N zp_?he_qN~*JZo|Tf!LI5fMIubcA!=x4FBdX5%Tcc$IQJLo@DSZdM;86?OR|F?Lf>% zcktGM5C(KD?=%H18RUN|X%(7(f2b)z(WXWU&IN%)QH@(203jueB@c@vRMhUudVN+< zv_qsaAI0v7vWU#8 z$Cf=z*TD0w-MI{e9h0!PL3=SfW~Zad&I6Za@}73gZ4JoMIoaZ7JAcR?#*};)KQzu3 zMWhu4xeZl;A%20hq~_vIV_2M<$aQnlojZ7C*SSBVQa^yf);W{m3BKVdHV~2H@YnWeVM4L9RZ!%!*4rg z-DY;2R5nGvl5k0=b5f!n2G7LTd4cyfBF#J6`Je7m1@M{<-^`; zHd2Wr^y9L2k=VpR0+NW=T$_snMlqxx%?hPRz{3*Zt`>eq5dvu)oX2uk3n+iiMNE6{ zimQZCidbMc4j|vPU@v-Iv+k6f0!o;=LBzmPiew zYEb$?RK}8y_WEGXanO5*zRR?&k;F#wR@Es#O(>S04dZV+vWIUK|%XYQU$HX!8TXbtW zdRNi{^gy1ac=(hJuyw$M27YN%G{PS~p$5%W9U0!O*~MhvMjG=G*@i4GC`S*z2sWGo(euK$X-3_L>|8FHTs3d*g;swT$#w6 zagY(34$w%%7~zd}_zz2r-2UQhT1d{x)eTW)cr=oK%-7y#ucoy2a!CL_Xrh&7d*nEk zJjo;x;jRS(Vau<2sv#Hwx>To)RZqNWfj(P+e6K*5uGRA9Fhxmu!t44CV{o0tHow)@ zW!)uy5>n%T5z*E`4Wdve|M##K@_eR!JWeKA_=-$?hnqYS?nia~$fN^FbB~e)VW`K6 zaL8v0J*}2{h}2;Z3vyAvYS8uXLKqdox)(@6#Qjs^V558eu#MN#?QF%Hi^?9mf@Ri{ z3Hd87y}PS_2MT)w15yr26soem(f&-<{-NE8o$ziGHr(7JS9Irq(3<`y1W^mSwNi72Poc)hO$vyF8vH9rG}gO{uMrZujqK1Y%cnCopnw|gq$8VS z-Q=Ri(9?ndErvAkhML@p(VkZiXex(!JD3#Eg~Pe{8##G)+dy#ehbB_$Y15jTy%$x#B!cPb2< zV6U`u5#3(6Icj`Q?8w!*o8R5%kyNCjts|_q-}c`M)0Y8R{?xH~qlrJaP=ZP9nqz|T ziLMVS%;RCe=UL})?&oyLbbkc3fd597hPyUfWLl#Gk!IUB!O7wAFuA90gL5gi zpTyx-NOV#O(`-+>LDdC>zJgs{c1;~_{%x(J3azAi@3mMIt2mNNrN4x}Sg$gaV^emK zbgfWgI_Q4uRE^N5#;aj(FfrYL50y1w>MY!~2k?SA)rOyK6pMsxy({u=u?5Y$NBd!r zS545#DPs%gLDG=NepTpe0T$qYkkj?}q5J0flk<5Au~`^RhgK8`uO zL%FO#BqyOGnQY~=$+4y_$$pXzOB*=% zl+Ab&b@FN#>ugI*R;Lc5L)%yl42c@I!A~6s$N{K%>iE5zMN(~?+&MX9+Td(3L7o0= zIOmYh7oP3S5DO8j`c=>ga?day(C&vc+@(xhMkl1#)vftNJvBF|(#IV9gMJ)N4-aPi zaT~a8E=AO3ZLTg;zG{omlX8a4$OKP&S()92WNL)88p8)--rVAAvVtZlQViYE zWYq~48H@Ur4%swZ2hw`B8xo~GimoI*KLy#?!HulR#%zQb)ziUR+1c^U^tm?G#5uc3 ziD*34?l_SHoU0~j9j7XrP%z1dr#H6TmkwlUYmcEc>9l=sqQ0e+6XvVXL|CKBVeQ46o7up{kOk4{DzabDN(SRBB2TzvO0 z*u#Vu!MI9I^@dNi$+&7Vc1$NBfH~#+Lw2~3_M-_$oJkC=(vxN@Bxk3YY2Wf$#T;*H znpWmwPV9w1XA38cp8#5?R}}>}{q)6!@LtQN;U`3<##Hruh3mOFM)$^zws|(jZ_8EX z8=ITNb6|T80I6w;E?8pB;AkX}Bb zic%P0v{8!jGw05V7$B;NyIT^RFEd|A$Ii4Laq%*I=D14kEJ5^G{(0EmDvg94nOgP9 zklj4QmHHU>b_k{=Y*mf!;@psLLaG(5%OcC0 zWHH*wVv#oEJndv58#0s~Fn~)BKm2LV*xDGcNa4S&#|aaDq8hlWy_{e$ahv-)nF+MM z)zjQD6E1%6wl1!0UZzkjXG?WSUP zWs#;E{aN?nLHF%s;6CHAd(3w#u>HG{hznf1buoD2u6akfo6)C>p;Cet7r6pmM+d^| zHJHZ6UBj<_f5URV`dS}!Y^lm!bm(0@6~s~jBIP`oew)d$xDX%TzyC*=g@t5S#m>o@yREL)rlqZ@g{U(&Ao)frOGD0TcB`832Dz5a($qh|G3A#2sywQ~p1>GQw4dkI z;;oomn&cA&`j3j@N`NmTY?dQFrsr4xE?1q!3($sKRFH*w-U*|bSj5eta*liBV9bqN zfwSvLFAU!s64i)nf4=*kK>~YhJ5qe!3lPh#)rqk!YlC>8Tbh0LiEWI(v786@fO-Kj z!{y&bZWfN$QeWZy2>}uv@dou2Ob4>9bOb8?IYha1gSt$d_xZP?%+f_1G$QnRMQKLg zw!Xz>;qTWq)h>xvkt35{dHsGGHmA?C2eg5&_+G5;rFiEPWMz^$b9>vK^K>IN574*A zJl!zn*YP3S9H;$lKZ`ckw%o-RSEXEsEnd}C{al5(PdW?OG%Pd+{eFhFe8zv;AnYEp z7i4bMv^L2icHwtF;4TJi6Y=9p7>H;7L&4e0sF$016j8yM>kq|et0wVyq&?D2J!(Vs z9-@HCEoX9ttib2pDUTV8LYm;BJl~v=Hb+%wHzr{f5SZt&#kB?Noa$X@bLZK1buGaW z%p~!34N^PZ*(0uruqrTJm?XPR5AXA#9bnBA@ zruoiD>Ywq|qj;5lQ9McM7nAHC8RcDFJcX>^#K@kLuy?YyI)+`kkyp=>>62zjNz}tV z1%(b1WZ?NoBkF!u{R8_nS76|1nE5a=nxDU(*hOHCMaJ*8@I4wa80lm!+C|}ji!vr< z=qO6#xt0##Y!T6VCn1pTJi943sPHm-a0p=F@zo>Je8C6VL{DcsvT~vK<6dRnj{K-3 zjoPE4A`+Hsppl9~iZ^7J>Sb4oZr1{Z{gRydl=aNGsjhW-V9n)V61-BwF9s{s+VO*q zyl8IXww;OWCf<={ikpkMx7Wq+#fYpf=#t^2DN`uVTx0XU@M`H}PMjn`Q4lmmf#jG67oT?yzZ$e+PFAZoJc4BCk zx@lJtj#_d4!iChQqJzJ2jnBHRbjlxo^3_A%D)FHS5L^)BNC=1hk}S3VTgSasa)u+g zL~yk7?#~VOBFUF!zO?@QAH%tj*YQ)Ir36hsM3sv< zn41hb1wpk^bcsy{;kF?iaSTCTBI zGk3L!&c2#IV=0B}5rxrAL}EOX;!!JU>(j*K<|Z<}&I^BgfOnSp62RxTi!+F`WV%M-1tJ%Hu?!CfvS zC%_1iE)-fS(PCm^(dx7nW*d_>vc(ZgpO$i!eDtEY?9f6tPpTZ9-_e`x=4V6Jb1EkW zrLMw^7BuPFjJ?}o-%b+@DzKaabc@8j4s?At&T6#05p7}-&~#ABzSAy$5HoTqW@ND) zOGUJ>;eAZyDhp0T27yzqhcHFRnMav8{SjC+fu`1LS=wCKSqhWrlzGJtJy2$Da$OZ`rJ z8I4|AHU=146r=gYEBd>Eb8kn%GCW)Y+D7b9uyvvfwf<$F)!895wn;ql<#qN{I7C%sTga++tt8E_ z8j~NNUHi7jPuw|R-z1j++TmDn<@IC}UZ!p5U*ftZ)!Tkhg8~ z!&T$V7uU?QSDW*Bv&FJsvj^Z%3*hs-^w?|iPMh}tLE`{H8B}PWti7)MScJ4nI+XH2 z(D=1VRFd~)+<6ZX8tghw{>342AbT4OlZKQaMV&|_2<*@*y5GK?kY>=-4#2-Ki3lxny?0h{VV z5oW-H>f8``ZWkWR4T104$QK4&!SQII9DZtV+|D3ya z7hM&ni^zCCj54KACd@W>t$_yxiK2F&u%dMp&gk$#pUK)3w5Y}fzDxQveBJ2abt=V- zg?S95vyV`zm$(TE+?Ha&tFnCKdtAS7p@7rdK@E<6em|xq6pGzKsw0$3ReqoG5%7cB zAvw|l3oYiF2!GD#3_n5$u1l^?pjyLxN3QXp0LHd-p1s~*<{_e!NdhuM3rUXbRb7Lw z<8K|~QQ!kWX?rMPNP~}p?tf^~B2maI_E2L>kQW$JSyP7#8RCUr2m-iSi#(WcmD}L> z7-I)NqH1QoY#0J0OiI)ESK+H6_VjO4*=Wdocpjk@jzzf29=_$A};|Z~xj+ z{My+SXqA|t!}^KIS3CH4ifp#V-IeazE59H=a;xV5KXNO8{{=m&92M%m04AVl-Sgs? z;~U0gI*HfWK;sGGcS_uB3fumj1of>wxE|^-TI|NGUEo=!C5@s0B24DYkz%Bcn`l4n zjqrLd6024I>PGJ6;iNY^(e)}VkaT72!q7_GXq*WQP?mUPB-s#3vixt`GcC;o{f(>8 zY=P+Inms$iNr6i?08gmdv&T6pNY($=O}HelUlq4&JYDg4kl{gzHa)|mqkUagyRjzJ ziU5?tON$42`gyaXH#n&*mjd=;Z@mD%R{~hVDP1NM)YjaF0J3~=);^4?T5J&pCN|80 zcwyFFQVoZi&>q+RG;94(Wj8F)N0u(?_x<8lpRK0QaPAup z1JQm?U;`8kF=^Z zrsug<&>>;PMsG<6_vj+-m+sNUeZ8>AQ!{eyllrZ)Ymo~qs?~^#78SQ^u>db{R7}Rp zamPgSt_gk(Qt6J;Xfd3~0rv34cFqtHF{9Ew6?(HrG{!hy>QV5Vk2_LiDXLOW=v7_! z^3FzIU6j8o2**i@A@oJ~jdYtvXXD;FQtK@-G-J$f!u0YT=eHSX!%iDJ6X>}=vjB4K zgrSlE98gK+^Z>@6#-nir87K1f0XyGu70dh0E`(Xq{D6l-b^(QmZXcjF5ok_IMsGTW zidFo{!fwbLQC_X+c!OQmVprGD=FeVBAJE}Ri;+Nbgjb^~SfX{vF&-7Oq(jG_M6XBP zkCLfSt;L|z_q{o61o8las9Yh4l3RaN$o`BmF*nfhUfVa&nL+ud+Vm8!<=M>LH?W!_#t7C3Rv8cKP=yIpK^8+?fiDoXxK8inf@51#t9DF73T9M$Mt1I7KN-nCC_qpH z+*3R{=Wf2jJ^yOlZerMy$kD%3>KWl&^CSeNDKpVp_43Om27wlc?BGwdPCWx0y&I!> zk@XO0+mc-}>$EUdY4=>`L3kS|5LI9pV>X62Z9&Is+DoExfa3N60x( z3C5O&$aUK6GLmFhSSSd9dduwKp}JKRHpHzXX2~ex32sB?h4`={;z>RP&ZC0;>MdzI zk5!at*=sSoH@f?lbug$_B8L=4_5oH-?y|2wjD_&8ftfhcez0`cn z^yN?ULe{~U6eN)J4K&-zxGin5Yod0!TuCET=#z@UB5>&m7Xyq!11Iq}(CN8M+<~8| zpW$%yDxvu2eYw?%C<@sy@kDa5(KlZ5Oliq6&aF-y37VKLsslu#KAvx;PTgohmRl8$ zr6a0KgG3&g1jXp@$2<@3v6f>lB2%_chRgJa_B3CxkSq1w-2m=98BkweFPs7i3@aLh zRH(M;j?ph@3vTXbMVar^+tGn3X+EuRh$Hy3)IhQHj|Sb9>9JQ>+tHzkI%lwgMb)au z|6K44q@e!L@s!+gsmaqI2OkW93PQe)h1o#_P;5tP0C4~z@Zk|3Rkpt8U*3KjO<{9v zNS>m4`8hVty>GI$KKbL&F0GCN6zeLy~4{*0w>FlRA&*_ zZQbw%Ns2+=d4qd5exZYvhFRN|PN5R#BQR#PIeUu`Fu07K3j4H^ z54y;i+YG|^tIcV(#pGAo;@1gMoQ-HjPvl)Kb{KPL986^v zNX!aic0eRt2R?1*=x6mU66)IjZ8w7HTnw!h4XthIqlA32qMwB>D?9PFP$R&bgIJ0-Pb2gHz>D2m29A*ZLu#k8Cq71ru5IZ zW!*G1lxtJEHcs3^-h@F9O&Vb4x>i4={65C1*7f#Cnso8lB*hZ_`F`YJhw&roh95T07X~osYH|uGn~mij5;wq5GU?y@5a7^paO@Tq+f> z9ujY}H#WcpZ~Me_)uz!kf;e_^(zo*YNhx&^!vEBs>NQeDuXJi!?Y;PpEK5a5a@|E?U;^Qg zaBg7rI~5q`^R&?4*)mT;yKP`%&4`W$Yhd+R=n~}Y^D_jWE=uPH5ku^8$G?keo)WZ2#dW1 zqPQR7G)g!`28yNOMFwmU_ula$^R(71R^jk{8INoR=BcK*i=$uFZz4_A`63mkeeFj2WOQ6TseTt|Xne*i72wRbw@PX^c7yCFxa#c`?#scSb*joCc1 zEx}sYWwl|01?j^{xA4hqgpg8jU3+|deWbqBo22whJ93`=m@%|gFb%W%vE7Vb<_mxv z9|E=3m`juenaa)kjiQxD{Xm-Wr`n(Gz+NYsuVrnClTNY5Vs>kJ7L-vdDIm>c`l-*B zrFg$7_P1uW?2NE$BHSvu+pnVo>*MyltUc}8peCO~(kSa}W~ed>+Q7A}aR)aTL^#e= z$h};7526vHarv$ZAOG?$SOOIaVS4f&Mgu-Dq=5^hE<5>(2Xxn+7QK#oeiP~JUi#xD z5;xf~^Kby%Gn|kgg>A9h^3uuX60nc`*P#n4#4HSvhmdrT-M(4j(J(RAmZSyN`>g5> zO*GZL`+Slpg=lyQ5l@-&R|E9J9bx}~5gNWDHzZtH!)+vp+(MB3K~UMcd=Udh zgvF@ABo#986Qzz?o%w`@*UbZFoIeo8ycN(AC>vWiL?2*ojN$dUq8<>})QQ}EnU9PW zrg=_r_bRu+>8Ez?G?lHxbh1(@^RXH zV!2bGZnNwXB2K%6a3r!Df^Zb`aqd14sX+=Rbs3u1k<%rtwq|=uW<$}xqrrAt9}|&5^>U!qR>wam)F|en zW{bZ>{8op-7zZWiqjsej8&*Q_r`rC%%Vw}2!JhD19ju5wEm&3R5eC`)E-ktpkdVyz zn>crUYE8Vx`5L#~p`aaCQ~LmA+e28$Za2wL$Oyn5@wJB)z4dL`s_ZUU-yENOLJhyW+{o_T8og z_|4)mdzh=mSCiIiNE;J?Y6Mo8U2y>YfyoxsSSmpzcLw%z6UqPqR>G){u@nG#MYs|W zjlC^sa+y6)sePG~$HYAY&7Eb?t{V0U>qgcfp+QYq z4ini^P4TNCJBz)D1Fd!fnLSAce3D+p(*dTzSe-@O&Q-e-)XM^PA0-F1b`ypsmEj{N zV^u}I6|OGy>IWaRWke*{nydS%yuaO5%sH}X1h_6lI~a<7 zTS+4Wk)pmH+KQ0ep$~ECrgAs0um%=dA@eHRkh4p^3~>W|^d5F;+F~nJW{}pXT6;KW zs@EcmJc5w|xa?rQSbk6mm%k}LSgnfo8yE=B+n$ZY>0Ui;fQjV_6qaDXU5IdyH?|BV zJIjs_`Ph1v4cmELY-1%;k+c(q_HfkVk3M!?%VTk1xa@)*4iJ;z0r8#568l;c0vwOT zj`bYczZxs?nE@iR97XvJB)NK!as-2&mzvEW4S^|7%Sd69HGby}D+i~foI`7u#8#~y zs_exsT*VZ1Z~o37YI2oPb@6ahCMPXHZ_RbuYLO_vr)ESIl+ncOrtd_wUH<-FIC{5W zd)k~_?C_*UI$tGBbChToKSfxpvE&!$9Nl;j#E2fGeNmQggZ*elAr(Hq6!QxrUrabV zDv1PU0x~bL8JS?#YSI`U3S9eaDj)*Mz3rnNIAH4-pODbrtFmS*p}INcB)3{g#0oSa z$VnCQzNG``*&yb9MU7|O(XvmV8s5${+0LP~liRH*P{J$3qn7bDgid*f8sdX|!KK=& zQVDnYI3eZHSoWqwu8Wl(?WA}FiZ{pE80k_$24-|07g;71S#ISPmZ^Wa4mxp@#`Z3e zBsA6MTG08TO1#TOfdhG z--KcRd&$wRbV1c&2k;EY4R=T1%ShA9>{alP7o|Rn026$`FSB-)Z2#5v2mE5jSvO^< zLpC9d;0Ae+QmsL$UGx#~1M6#nCx=i@@N-06qK3Q1eF)My z?eZ#j0Le2UVJiqM-8Xb$x}xYoAM@IH49XK*!3A7PY4%lIB#nQPnU7-T!}e4nL(q-- z>|y1v>+usPw9MQ-Ldyv-lysci9_dJe)r4aoDqZfx7x zIejX|oJW*n=|ymr_8kQGWev!RX$AOh^GdUJM8--oc6h%n*qX}}pjH=Bc7^7WQB%!B z5y)wb?e!8#*V&f5S>qPI;$h*3(rnKirtpdcD9#SQEPMx@#xgo z9$%*!Ey^zV8!R|rG7^biNJ7m#)#M_85j)ArM}>Ry99@p+62 zr8)MRh8#Jo{B5X~Y}9$P1PI!Hn^iV>9rX|C8^wel46ZuKo3#)s%UR`vxK>najI-_n z?6GXIpNfL>G)7`OZ?G&kPk;{}o5id>C@Wmfb0TRAb=$-gN^xORz!t_~E0SA11kHQL ztt!Uyb7wO4qMp8`MuS=0=HTYwjiiv>zQJqwxDWY?pLQz*rJYB?SGmtmC7;IGOso)!4I+&(Hy1eBd~+G##^F2US|ZXhJDQ)OQXX<+1238C%q z7ox8*k%jN@x8fo~+`(&l?`fJEN*Ka~irsD_J zsz`N$Eo_&wR;kaL;aQ^>yAbul8q_a?XvEiGD+VD9JXYeTK7IITE0d!Ru2;2Hi&33A_()z64vZ2A;qWEQj}=$)v`0 z_h(_91a;ttLlz#QK;R#srg`c{lBp=iRFLKHH^27y&uN&gcAMj@fN4hEBw$C{T`tl% z*w=(nC}81W#G9B`qMp$i%8yWWAk6d_@O!6SAd>(pCe}~@Is!IHv-8+}*O}z)H}I4x zKpC%MOm!AyO`>T8QbR4)ZXE}~kkSsH(vYF7iR*AD5Syy;N>f&tT}e4}y{4z1$uTd} zX|jHyr_z2GwU+$cD-AxLK1k$a3wqRXeh8#xCLha>3E#%)PqyEsn92|XM12isj~@N6 zy;@@j0AzTk8^{6FJDI|Aku&C}nnvv?6A}IMFrRSd?^|fJ*qo`B@GjATsJMo594kRQ zoJIe>tW?q8+Idl@A44(C7FM8D1e9RtLm!i-C^p$@h4&^y9s209*Y8CinMtC+%IeQ? zi#eyYavg{a6834MA1y4m_gVz8ia=f;l13|5PXA?T0y7btHK5nE-gsG7wbc)%dQ5}Q z&o~dXaU|kWx3H#3DCdEW@J73~{FYNI>8?naM{n=Fmbt+b{3)8zT%qJ|RoJzkQb54B zp8!UAZ88Xpds3Wr#Sj%;8J^pO_4_;qVtYFmYaAHZ=w+`XD>?W z9?OOtT6N`;9P#J82h*$sRX>|=J*}!}$fK<{2W>W`{XKSUOh>$h;E5wn^XWN@F&c%@ zz$sVTA86J!IQUbVG=`v#-a&ToH6JLX+?!hf+o52)%|c3*GD7l!OR1gUANi+2?J|s| z77pY$+kEL3O&tCP7-hvk5gt-iIB(fm)2NJ9T=`?oZ+guEu9Kw%%9s|~FOmhj3RTdAbAA}dNEu5vJ{lIBA2JIIq8>#A_%b^2tAw!PPUGq3`A*2Vwrm@>i$mDI zE67pZ#Z0tQS|ikRTc1r&@-u;9_My6_F4GCQW}k3sg%MN-yl_5O<=0VXHd7e#k1U*E z-LK7xDT%ZOvyYcRX(St3wOB`2M|{JMC#Nj?UNvN6hxm~Xh@y|I%Z9rfC6#DRX;&W` zY-m(Fm?P%H_Nr}nOw|UAZXv4CO21;8G^0WFSxeB2pf&ZUF<1he*Gnuqs z*K=Mwy|MSHXe;f{T+wUz_!l;pxY%s;NB|Mw8$t866QKq|16)t zIeQ&RnW4q&6TBi0w2sNWv8;+^kHP;e8{9lUSI`)DG|SP5W_hn&BoIPEz)z`-X1fEx z90=toir%Nu_>D)WRT-7cuP@x5v1e*s_AWR&DD6+g?1Q2C=i45 zs1aXt&YXfd4+JSbZwv5`zTM}PoNY(<)^;*7&G%Aj({hyQ5+FQwRe-!yAN?m79`!Vy z<5`hOpvvc*Vf{I}f*bjTCo77W!e1CdK_^Ekx+4ENx}OyG(}2sTU4d-CKHBgw&a1?F zeRw?)ycRmp$|?ZPLA%BUYGPVH(-j%VCZCLhn_q{e%aH(rR4TOoBeJga(bT}RT+7tF zkJJ@(j16?!QJw>>viI}!Nd^+8DbJt09Mam$sEv)dvG2M*hfK6ojwDbFc|YulG{=Vu z&X#nrD1LjSX@DDbOWvZyJ&=Jmc{P2c5R^LuoJ{QB z*k%`QL_7Qv5o_hH%?ID*MHzS;rF>&RNW+u0jF&#`k$cjM-~1ml$&|9*vlYpqg@ zhr!X@$$lfnJ&+cd;sDhq-qMy$Tn0zbElad|O0~dF3o)X~PI3Zc9_gv+HoB`s0!w1J zrw?4{wVCsX((PxxVrU!P#xTgy8>w+j|3`_q?I1?^MsjTmoCK=OKw=d6KG^q-uir$e(Yqta=_GrzIVAlmuWWWZzEn;~-yMWqlM&S!sLRsyl%>sXZihGij3ieRLT2F>D$O>h7nl*$O(jjryS6s1z?R zb%Px>&z=-1fPUS`9Y~>>7jhp5lDQP^LN7&I@$bnN7Y+GC-&+x?RF;^M24pn(jePglv-m8lJ?Yn_UzZ{&~$An$`uD*0y56k2Kw?0 zZCRjW>n7hS9;7|$;UAvwv-iPZD!lZl|6+Q~_isiCKeB=>Xrzetl8@=Lvs+Ptcx(k% z58sg3!@>l(6MTp-g%0IfI1c@ty{^#skG$vtOmY|%$aR^=Lwt7F)p_iecw1d5{$E2V z4s{izN}>D`tL1X^tzR_9^_rBkOa`V`{`_*n84b(1fXw6-xI*<%Rw)i(##x%nJ%?ne z=(%WTh|AC-5&2#Z$!F2@O&Ai(L7)Lkc>=dN|aL4f`8bAw&ka~%f zV=~>M+yu{;&%#nX*{X$XFE^=(aJk(VQ=YQU;ozED-l|Xtm|-1UB;5JTyN57uwU7yZ zH|AFoE3cpsJJjZe!EL^)(ebcTFLDvV%yIUpv%-Cx?Ye>0Y_KC9&_MZ8J9jp2f$+Gl zpQAh0Ir1gan2CeD>UTw~g!5x?>{p7CcH}Ne!j=H~Mq0e4D>uWV0Q#VKwzNlsJIW|P z-vn9q1Vt9uk%eX_*D$stqe6xP5G2^I&4TknnEDa+uNq|0k;3Ee>`sY4+KXA872aUd zY(5~UA{*Hbpu;zX+qquM8<>k2CX$2{LZU2@vINB3!#nNGuLLc?e$dnzddgD(lCU|jSg}r$FaLF+`;8~T!goVq; zK?6)X`=E+iv1)_->;JJ438Yyzn!6)wv|}-h}W#j-<7Q! zK=WuXbbAGox)N0lpp=5L}Jqis!x?K?Pa*q1ots8qQ}RVOobRsSge(&zNUi7r!^D&HxA>T&`&J?pv%CXz||O#I=e|WO}Y;ilqeA3>Y&MX z5e6kS-MBDeGt)eBW#1O(VF`$)`;>4k2$7Ip)f6Qhf*{&gx#*^@PJ5@xzEu}T79(`x z=kax?@;c3>Sy*hAN%c;&&$9MUZC6-`E1+#xmx8K(hjGutoTy`EkTAmu!-fv2Na63i zvN>*ZmA#w~irlUEB4lI!OOYx)dR*(ujqYw7jWoW=DJ8yWP|JkaI_s%nFYveX3U^{n z&ydXk-j1>j-F$^ZAYHp7kVp(>urVwKVfU$7IoBF@?D<6QQjjZA+zdWf4l6+S?m~H2 z<|(yUwuu4;FQHW~DYfh8Mk@H%(P4gPHrwS{goBi#xS`o`=GqV~BO~qNqH=-Ku%PTm zF+K~Osk;Y?X)d7SB29PkQWBRTCw|#MTP)X}$aV}i1r@2K!)NX|d)$c$7-SDNqpKeB zP~N#_()KxwXgfol&J*kHe;{Ok1dXFM=To#TZ6)9N1TCpR|7ScL>r92x%_oav>EbIJ zHxdGD#4kmyIFgGbZ&ll6qm^#lo>+)X;^5jscM_Q*Wi4>8fir z95%u%VCr?DD&BS%3J&b)t9f+L-=6kJxZ4yg4iCWjJ-?*VOGb| z1a&^sf%$wz2VcPR`IS$rDOdA2))DJ0cnx0hNyvtJ4BCPr`vINfjnMz71gg;!B}r0b z%eg-flX~goSD((>ud-s9ehkFU#8v519t%aCdZ?>rd`w%UQ&4E9*pX~UQQaZdk-B*7p zcS|aWQ?;ULjNRD|1aZvLg8y13C=A--SrLXFfHJ5V+pMWJBOAHcD*0Km0$#n)W?Ok5 z+F0ou@Y4WCZ^~fAE^Q{zJRqpT-2~K1*0*D60|n{RcFjCEgtgc{_4I}4q35r%gVxxw z>v_Kn3X?Vl-U+r4C^S>qHNvWrRK^e22x>d_1k$^cxnRK1K5*C>U6{ z?Sb9A##C1!_~y55@%2#~72(D6o3WwA7^(Pm7Q1qGw>Kx#@4|O<^3PRSkp${n=omYp3oH_s`hfwK?tkMfr z<7_et(VDTAn>7f^vC$DbuL21L@;e1CBs$ks$j!wbWrcz~qubN-Knm~VTnoitk%UJ? z%XIFQ#mzuYdxKr^CCKU1YLa@dHf)yJyv72IL_cxaYGv+dlYwOSI5viT_%Rg)s5q^0 zDGoZI2)iR|r!D19B<#8rc2a-c6mwOFm z`k#IN21dG)Fs3mOP~qw)Ct2S!EQ01*o8McgFkg9?Uj)G3!c!|5eKb43CfOH|4w zFM??dB-(gFncFpbBEJw!c40eD04q(4uinRpjqXMkS~4{vSQ&Gr==%dKCfj_~qKif2 z^XuNhhO7i49Ey_|=Xl08ByiQRON~1^-tzN^C?&qv4I}cJRSp=)-W5i~o;&5p2E-ih z;)|x)Y4hyFdTau^F^QMH7p*v*@MHw?8*P`VajtNRn-hwNv|T3W}@wGfOspHqqLIF&WW}qe6@CNl&-7$)%RJru@4DR zIOP&=_1b*~mmcV~d(or_dEH~V#ph`Vi0*n}KMi!=K1ty$v0w%8oZ7fHaj?D1in$kS zQOIr|!xKxF3doSUL`s4F&{on?Rur`o_{3@}3q-a)r15AdmP<}8-mq%9WzmX9tT@S2 zMLUnTvQjlN4Iv4>BbX&#{@k`?wCeBIX?^xDSajmu3RPlN)L3B_&9KyAGL@we@AhXE zU+=H6DjVVG8-U{1=V#kz$0_URM4EW{i*I@Nhh z{|=~kR3~r>`MIN(+QRzf+~ES*hO?TS3?|4~Qv1@~=|q4et^q=8?e@(S76^F*q;QpQ z3^RnqXkC<+A+&MTI|PZ zTY@a)$?FrmN>RXFiLlq7afF8EU8-`~Q~Jpf9Y^&Ig!IG=B`wydms{$ zt@f4ec9D$c+rA90W7NM*Jn^}KC(NNhL2!n9`(RRnH(ObgjiK++U5(I;ir4HL4YrNO zv3Xzie2SY9Q_ClJst`caZ@qC#hf|qA6vsOp!2h-abq)4dWe+5cjRgK9&Xz{3#YZ-w zMFV%L8X>6hytg2_M@ikP#AEO-{xJ-al?)g-byN&1RF0kCk3&E~Z3`LEXYb9O^t#<7 zbuE@_zJXt>;(V55>Y}*{{mTmAq$Z>5I2Ue%O7ssK+9vR;W@D3l%Pmd!*$da#NmzcX74qbd%6X;2p{*?BAVodP*V-4h0m1#sHf zi(cVSM#urnUX@+7`=VB$*iIkyL5}K}EUyE@^fvFVE5^yahJJm<*=^4@H9OA!W$Rsp z`;8(2G4|yMVO(!qzSosxAKEo!*Ju#j<$UxkinUNLI~U7K-4L)dg5?bj8(v30FN=mr z`Vq;@tF`|@$E+a3;q3)k-zs8m^?cw;g4`c+^)A8wRwEL! zRGcT3h)rqqd#<3*Bx`L-s6OD6;cDB}8d&DHRYdyCSkS5}WI4SrO-8U~VU4K!?}&%4 z<3YviFhIa}&Wx4x{GLq^dagb5^Ph2P zzl6@v`b_l#RB7(mzqvlSo)VR&q|)h_N&Z?&e4d{Q7p>7i8ljTp6}zBc_F z0<2gC7?fo{%q&a{E%6nvvr436=@oF+_U%+)LR0y98GS)zyMSn#G2Zro5Vtd!R ziil~ZV7i=_h4yxVEDe*ma?;b{LWDoNnb|5X9a4Cdw|D$LYn+YAD5$_l`=?=+ zFC&3Zb<0UO!vP9aNPWC`QJJhMW81*>A*(2q!L}+ug>XH5SdIAMrv@W*qkfydomeGlR#{z(fW0wtK3|HNTqKQA-YXR6mw6bt0 zjg7fC!w0$JF17RA(9_c9kPf@qH}tmalsQGWqt*r+?Z%*0fDlj|08(X--m6GUcY@g< z6qEev80!B!m8#ar&ai3 zt{a&j!Nw|#%Q6kH)~<5ryO3`#Tw5}G{ezc~n^QM(BUOg|T*`Z06tq$Yi*+bwypbvn zCS=>OjV?02IOfU?(D{oCC#Ci(GPsZ;I)F`3J?XrY!kTO*5u?0>jLFvo%HW zQXkieTLD?tgE&;7jIX!IHz}I$j4R z>0`VXHGh5ZK9yT7ywO}1`O|*ei}_&T(CzXU>$A4fIhq^TGO?SVS!V?qN6UInrm%UZ9et`DTL~Moen`IM{IFG3 zmRjUZ3qG^K4bw(b@-hZHLd1XXQTQxGIl5kBN0`;046Pc=rh3J_8H zdDM&zdyrG~XGD;;&}V&FcYUVkr%UlDAWawUShW~qn3dMClJk1e0Ol|Z!OEIm^)~;7 zzp7ML)oxcriBM)dG-N4dJwL`Y zY0Vq2%+Iz}_Xc>o8a(4hx2{zA!C#fUI7$Twow&DESk5yL*-#eEd*yAe;uQ#Op~ug1 zUtNYcBZ8JEmF&*YULCbyMDC;#Mk%25=OJ`l5m6Sc;0?UI4gg0HrFQZ)@~PL7PT?^% zUR4iakCV}3{PlIf;h#%JbI7Pr*wYwvW5eGRAz%9-HHKJ7EE3Et5MhklIe)rj zbe=HZx_qutE1I)^{i1vI_e z)^&jxwzNP~DWIrh*MldOYpDLgs2%R1w_4q(_h`fJ$z!)L(6U2Xa%ZY*ISNg^bUYeS zxD{E!bu8z12f3SM{@lEb`fGt5r*WjGd!@0mFXzd}YM68g)W*z=Xg*b%w6;_-AzE|C zASNj|+lor_4U5#vQqZ5_)$kbErQLNk7Fjqur$V#ENRVo-1Xcpze$Ok5lVDxl0AieM zPf9)uhD&?sl9E|oN}trO8sZi(g3}y;$gOV6)<`sg&9HqK#ZnCPl(kI%MQ^UepnR6J z`o+uUuu7}*KpV5eMT zQ#wU^0uS=~W7Z(kgF24(`hbhDKep9%kF^lWR=5JF)<(h@4A8LloTF~LIl5dItEN&s z&3fc_x~`WZs>`K49skkzgmM|G)`=IICf%W{jqjrd&E^+CPPz~;* z5JE4gOFGM0pH*!#&;J)x8Gi*K-*TAm`x!eyk0LkBp-mgn>$49tXrMTrq?T|4rR;Bw z8hD?m!(B~_fcszI z{PvW7`94*he>FEWA)6A6w;5jSD6(chO$Ntt){^(2k11p7)+qr%q2htO&#FXacWj27 zWh9lnx}Zi`fVTuGpQ0kqZuq-H)CisT2e@JeGLV=Bj4*zJ6L zz-nB#+!9;nx4%fZ3^$}*rPpNhiGp*&E?rI$}ZRu27+w!d`e!ka(ELY`4M0i&i_qsQCn+#-nk{*4^;5^7dj z7CGXt+OTWIn|OqO^O|mc6!-iFH4<}(mZNpRKpK*)B*Jg8T#kW6A~Orpo|(N7H90+Q zw*%~=g1S3x%oanj(S5%c~u%4mH6!5vij*VC%oRaC_qDY+rgR2r2 z>3>9-%45;ELgDJcl$l_;kuSpa1O}hq#KZ|7#LK0< z5P-L$(n@RSXwOVhy}`S>@|*)dRoTb0u%S3#Ef-ybiOmi5sXZ|i zV>@?87F}u4vX^~5Rnd`(QE~IE&ei;YY_+v;x8PLJ1TAQc_jF4*<%~x`?^s!kj=6~G zgP4+C@Pci4OyheG zwC^~P3nPYe1t1p=6M)o>DU~@{t-h`@rQc?6UBkx)LW(#XfSyW|w^r z={nMNl!(g4bSY*L# zA-N0P7PWQ~S1shNA}PfgAx&mvjA3QBV9RguZa?&A;VrBxgROY7J&g&i=Dyw+$)low z8x5rSH~D^vR*^GxaVxy-nwNAz13tVu?9eP!uqS3;s);t+Aznz)6>@GpLE``v#G34C zU$Z@yo{COnC`R-`im|X?nN~X{73}15MoAQPpASWA&=1_@Vss_d?Qjn=f2tu4aBd^A z*n{r8S-G@aQOqH=b_=$P!0WIUd$5T^D9Xna^*~XtlKEKG#r#C5nXCo5F;^IKDi&-& z`tB-*_KjiJ9DO$tXQG;+Fty9Q*!;NMzQT$US0aSU#Dipvl*GeXF#!doDPP~n`%j@L z<`{2Z+L?_c!|M1Gsmr05u3nT6mR1Y*IJ<)h*XyXI$)Y8iEild=j=A|K<%tmbMrN)i zM0BzjU?P-4XP|{8s4w>p(U(m0_zAy@7kfY4X{RwZmA8Gs-1O+S$eyCA5akZO)J&-# zGSt^moM-cW_rr1S64l(?P|v;W^m&x}At(l#(KQC>)%>j!6kaUIN$T3+{zM0+BmV(R zyP|lQVY_^rPm`?}!wp-tD%c_Y0al+VQ&ww-v@n7n%Na}~q`LV;32V?Ur$T+*6lIRE zkJ=kolDc~|hB9Ota?7v;pJxYA;(4iHZXH(jCquT^5UYnjM%X7X*RPf1I6!_6*4Iry z0U}1qU*2qM7~=TIbtjQzb;}3~k8W$pTmQ=xarmq+lx9xzbC zrWAxY1~EmISzr$=ycTyYJEY*9Isl?DS>_m$>PJ#)8mJ@A_<{y)X6rf?5xoc~Y zS1O|+PP^T;Turxk*RHjr8Sp3-`g1=~OogpOU>8bYRm7mJ?Kt>yd!}6%Pu;F(?Ouvz zqyEbZ$AA;4$DJSQ767PSZ)Tz1ft_TC)xpI23K+`mdrVv`&**D%E#<82~SY)T_fxB8e^CS-mDH+DU~nRzNBzRX?aI_WwuNna4+2U;BTuPXd8SM3@AG31~?aa9ET8E<RXwkt|4cgklS{u~116GYo73daR>IADsYujk6H`rb~gto>m8miS%E9dwA ze4m+s-roCrz4~7z^E~G{>*svVIs4%VF=|wGDk_7WMwpLKWh zPVly3(Z;T{{m|8JcN?+;pZY(BfhK8x-nu5cY9c*TzulU*Yvpa~F3m#--^t*vM%gRv z2@~`D{UO(PQLAv3y}R_F=n@?;F?4i?-QiTU&Vn`^>R;SuB={p}=)7F$e2nM$JIeA) zXZ#B1NNa&zG|ZB{cDX#D9UHVulBy>X@U6$GHjZvlCagqtoj{jb*>y71ndAeuk!!sL z$>FwOjuQ8fa*vy1eiCl)#%M03ovGrFjDJRhR^r#D?Y~`?nH+F2Q%P;3`aA!vyA+?u zhJh9fc&E!9MN)SJkWQ7Y$(KM&_;a^=Vbf_)gi$1*CheL(vA<=zos>W&bZ5$w%Y$yG zGbRMBXPq*w0}`Ig11mVqWff@AEeZ)<^(!4Gu5LPHva=yY|`765xq@)e1ndLq3bZol%x?G>z#r>p-j`rDZ&&+!E{yTL~7YEaUrbS;}yd zuWbo#Oj7Vqu<>LW1W@&k=0$CcU&y=wx})8>+LEe*9rAF6TvhlN^D4Tku$10@+6w42 zL1hahg*_kXYqfil_UmMj4?tLuFFJ}I*CfEj%WYP~-V5_n-*hY4e_9{q$|b)L+Utw_ zCs?r;6s9(aFLE8egQ>f>T}rWN{_lQt@M}vc^iQ15mn^BW=a5ho@!#u=jASC0cKL>o z%Hek4AmR{`t2oKtXN~qq2CuqtRl3azlEXIeGtQRSa*%U7g%MlWqZKw0nGuh`sU+g$ zK(C#Z=BfR5Wy+>!dP%bwHX;f|LyD1nBe$ILJ|bjLTcDl7xVbvZ&a~UvG}D1e9Ybo4 z#_(lxdz_-Uo%CnC&L$cP$O1|kW;KnBzUYZypxy3Iw_3?kS1J|~<6Q^f&vw)ttz=*j zb0XQ*_iP;kQ7N6xw4u17m6b5{B4+Oxd%WGMJMlW_iCflMmE)HEhjEvMlDaEo9?RH$ zKBC9iTgj?cxVRWm?RYHZ2m10YKK8#6;5(>?;@5l$?ESF4>g2^wzm8OPwb@@XmTkel zs>ua2Is7H&veJ>-%U6_VV8*37XT6)Xu~{;szwpe5Hnvl|5XDmb)C2W=h#(**3)WtA zbKj^<8Q?C$R6@Fzz6NUxC%PT;abDs+32N5^mxC3aS!d@|0KcfJo=kI5E#|0V7({fw z*WY`)<3q-lfI>Pw z8c^27TBGyNRt#xYlp1E82ndcC(@GICgyk~Ix;$*dNz>(-4-eXHOa!%IwDov5Z}F=F zyi2kgJzh+o9f{*nTDn1K&E?jZ>qj<{PcqbpJ~pbvGa z!|}7pLEE#hwNWqP#5NVZaM#&d$F#MA&n9x-hxC)tlZBE*CReUpOo@tuU_Rb{s{gn` zyGY|dv>+$?Y@{z`g&QAQ)v61w2;h`ubEUH|LNpB+stOD2c|t`aH5bHHXxX%iI~9LC!k zZF!@D(6N$CCAu*liN#gil=Si0_D@<3sZ`umDworb$y1tv=|%$u1(GCvu#DwTX5&v< zM0I=-@lwl?bUB!gph+jKJovUve5HF!4iy1ctw0OqQ($)=s)JkIC^4lid>~{)sLSn^ zo==aur4DCb!fqrh*hDJ-5W3<@Io&!OVat1XeCJf&9tumJn~irRTu~l4^84&`$6P7p z$J9P+u(BAVF2dl7m+iiVDf;rAZNNzHJR-KPOHR4zPF<4W#l7I9X-ja++L}x4N zAvlvT-0E%IZj?k0`*+rYx_+?ZG&+P%|D^9V>^bnz%$ zX-@-Q266mFbV~ncJbF%pFomq!?kfNmy|EX8oYmXz;?D>mB#-9Y(h1sjuKSwq!p=K*qJSMA zsDTACf@C;vOZ#IJN5r&rd1*u%6Q}o@QW$EiQNm{Rd+gY87}I8k%sTng^rYX#ot#Z3 zv{ZAd{|q9ZP4!WET%utwU}Iq4UE4Fs^2+k~Q9v7F@iS?A5df(V8M!YSb z=UAeNnx#bD#|?Hhg1ShCH8I1NJ4DD@HIcPa(Awcz$~V%U-eq+W))G3`vnY)Ao*3XQ z%UEci_JbtUr_q<4m{~iy-VPGNux7lck%3XxcE#=J)R387A|G6!(sLVDcox5?;N6_o zWnQ)j=BNKK}+$MmDM_X2$M=L44cfj|KPR&g)2=7`*_aUwn{NbP*$@4FtA^HXdT}hB~gBNTWr6KBhNm2a@N{Y$p#%zLEZBlTXy zx(sl2i)!jyz*YH!%^rh8eZEQr?(sKz+}{2#+y$$4zbw&W03A5q*-BYW`7R5(mr+Oo zey)0({f9y0FcyJ!iq&3MM&9w@#dZAtJ}-M8YN__}k-Tg*LN2jyJ4(yb5q+sVrG@ur z7%kKHnVSsdtqLaTzS7{eck`RhZ#Us45 zHSEwXt9Jge-^%ug#(SxUdG+uS+F*nzfS|Ft2-2p0#@!PUv@)-){Au+wmP^-1@WDHW z_C6j%0DKJVa@EY?7RB-jFJbo_KFsW$^GMXp-!@PnWt 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
>3I5hd5cNFP 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%0AEM+6=qe!;TL-7@z63A}^&E$a#Wc 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 DExA~*N#Q_s~L(5 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 z`p2UB$D;bjqWZ_8`p2UB$D;bjqWZ_8`p2UB$D;bjqWZ_8`p2UB$D;bjqWZ_8`p4DP zpV0tvef6#V%k00p2pJ7nZ?-?2l;Z)_qX8+er;b-w|5#N2SXBR5RR361|5#N2SXBR5 zRR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361 z|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2 zSXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5 zRR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361 z|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2 zSXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5 zRR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361 z|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2 zSXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5 zRR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361 z|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2 zSXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBR5 zRR361|5#N2SXBR5RsUF2|5#N2SXBR5RR361|5#N2SXBR5RR361|5#N2SXBSG!RjA3 zSp5^Ke_UPtlVwF*UHy}WtA8S@eJv3h|z%cX8XfwIUZ0w8j$gNMgywn z`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3L zC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c% zqWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI z`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3L zC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c% zqWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI z`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3L zC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c% zqWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI z`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3L zC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c% zqWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI z`X{3LC!+c%qWUMI`X{3LC!+c%qWUMI`X{3LC#w1YpwvlIrT8HeCHvQTQ&Ig>QTQ&Ig>QTQ&Ig>QTQ&Ig>QT|RR2^||5Q}}R8;>|RR2^||5Q}} zR8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>| zRR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^| z|5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}} zR8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>| zRR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^| z|5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}} zR8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>| zRR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^| z|5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}} zR8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>| zRR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^| z|5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR2^}|5Q}} zR8;>|RR2^||5Q}}R8;>|RR2^||5Q}}R8;>|RR6TW>Yp}P{WGe6T3!9KWkp(D{j-Lv zea((r!{mbmXx=0ueSZ}sJoR{MP)uRC|c|C7leP91fRR2s= z|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ> zOjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3& zRR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s= z|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ> zOjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3& zRR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s= z|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ> zOjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3& zRR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s= z|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ> zOjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3& zRR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s= z|4dZ>OjQ3&RR2s=|4dZ>OjZ9(RR2s=|4dZ>OjQ3&RR2s=|4dZ>OjQ3&RR2s=|4dZ> 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